]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/1693'
authorTom Hughes <tom@compton.nu>
Sat, 3 Feb 2018 16:12:51 +0000 (16:12 +0000)
committerTom Hughes <tom@compton.nu>
Sat, 3 Feb 2018 16:12:51 +0000 (16:12 +0000)
313 files changed:
.rubocop.yml
.rubocop_todo.yml
CONFIGURE.md
CONTRIBUTING.md
Gemfile
Gemfile.lock
INSTALL.md
README.md
VAGRANT.md
Vendorfile
app/assets/images/banners/banner-sotmus2017.png [deleted file]
app/assets/images/banners/foss4g-it2018-banner.png [new file with mode: 0755]
app/assets/images/banners/fossgis2018.png [new file with mode: 0644]
app/assets/images/banners/osmf-membership-drive-2017.png [deleted file]
app/assets/images/banners/sotmasia-2017-banner.png [deleted file]
app/assets/images/sprite.png
app/assets/images/sprite.svg
app/assets/javascripts/index.js
app/assets/javascripts/index/directions.js
app/assets/javascripts/index/directions/graphhopper.js
app/assets/javascripts/index/directions/mapquest.js
app/assets/javascripts/index/directions/mapzen.js [deleted file]
app/assets/javascripts/index/directions/osrm.js
app/assets/javascripts/index/export.js
app/assets/javascripts/index/query.js
app/assets/javascripts/leaflet.map.js
app/assets/javascripts/osm.js.erb
app/assets/stylesheets/common.scss
app/controllers/amf_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/changeset_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/geocoder_controller.rb
app/controllers/node_controller.rb
app/controllers/notes_controller.rb
app/controllers/oauth_controller.rb
app/controllers/relation_controller.rb
app/controllers/site_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/controllers/user_roles_controller.rb
app/helpers/application_helper.rb
app/helpers/browse_helper.rb
app/models/changeset.rb
app/models/client_application.rb
app/models/relation.rb
app/models/user.rb
app/models/way.rb
app/views/browse/changeset.html.erb
app/views/browse/new_note.html.erb
app/views/changeset/list.atom.builder
app/views/layouts/map.html.erb
app/views/oauth_clients/index.html.erb
app/views/site/about.html.erb
app/views/site/export.html.erb
app/views/user/api_read.builder
app/views/user/terms.html.erb
config/application.rb
config/banners.yml
config/environments/development.rb
config/environments/production.rb
config/example.application.yml
config/image_optim.yml
config/initializers/compressed_requests.rb [new file with mode: 0644]
config/initializers/cors.rb
config/initializers/oauth.rb
config/initializers/omniauth.rb
config/initializers/secure_headers.rb
config/initializers/session_store.rb
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/ba.yml [new file with mode: 0644]
config/locales/be-Tarask.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/fy.yml [new file with mode: 0644]
config/locales/ga.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/kab.yml
config/locales/km.yml
config/locales/kn.yml [new file with mode: 0644]
config/locales/ko.yml
config/locales/ku-Latn.yml [new file with mode: 0644]
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mr.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nds.yml
config/locales/ne.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/scn.yml
config/locales/sco.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-Latn.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/ta.yml
config/locales/te.yml
config/locales/th.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
db/migrate/021_move_to_innodb.rb
lib/bounding_box.rb
lib/diff_reader.rb
lib/potlatch2.rb
lib/session_persistence.rb
lib/tasks/testing.rake
public/api/crossdomain.xml
public/oauth/crossdomain.xml
script/deliver-message
test/controllers/amf_controller_test.rb
test/controllers/changeset_controller_test.rb
test/controllers/node_controller_test.rb
test/controllers/relation_controller_test.rb
test/controllers/user_roles_controller_test.rb
test/controllers/way_controller_test.rb
test/helpers/browse_helper_test.rb
test/integration/compressed_requests_test.rb [new file with mode: 0644]
test/integration/user_blocks_test.rb
test/integration/user_terms_seen_test.rb
test/lib/i18n_test.rb
test/test_helper.rb
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/arrow-icon.png
vendor/assets/iD/iD/img/background-pattern-1.png [deleted file]
vendor/assets/iD/iD/img/background-pattern-opacity.png [deleted file]
vendor/assets/iD/iD/img/cursor-draw-connect-line.png
vendor/assets/iD/iD/img/cursor-draw-connect-line2x.png
vendor/assets/iD/iD/img/cursor-draw-connect-vertex.png
vendor/assets/iD/iD/img/cursor-draw-connect-vertex2x.png
vendor/assets/iD/iD/img/cursor-draw.png
vendor/assets/iD/iD/img/cursor-grab2x.png
vendor/assets/iD/iD/img/cursor-grabbing.png
vendor/assets/iD/iD/img/cursor-grabbing2x.png
vendor/assets/iD/iD/img/cursor-pointing.png
vendor/assets/iD/iD/img/cursor-pointing2x.png
vendor/assets/iD/iD/img/cursor-select-acting.png
vendor/assets/iD/iD/img/cursor-select-acting2x.png
vendor/assets/iD/iD/img/cursor-select-add.png
vendor/assets/iD/iD/img/cursor-select-area.png
vendor/assets/iD/iD/img/cursor-select-area2x.png
vendor/assets/iD/iD/img/cursor-select-line.png
vendor/assets/iD/iD/img/cursor-select-line2x.png
vendor/assets/iD/iD/img/cursor-select-mapillary.png
vendor/assets/iD/iD/img/cursor-select-mapillary2x.png
vendor/assets/iD/iD/img/cursor-select-point.png
vendor/assets/iD/iD/img/cursor-select-point2x.png
vendor/assets/iD/iD/img/cursor-select-remove.png
vendor/assets/iD/iD/img/cursor-select-split.png
vendor/assets/iD/iD/img/cursor-select-split2x.png
vendor/assets/iD/iD/img/cursor-select-vertex.png
vendor/assets/iD/iD/img/iD-sprite.svg
vendor/assets/iD/iD/img/logo.png
vendor/assets/iD/iD/img/mini-loader.gif
vendor/assets/iD/iD/img/pattern/cemetery.png
vendor/assets/iD/iD/img/pattern/construction.png
vendor/assets/iD/iD/img/pattern/dots.png
vendor/assets/iD/iD/img/pattern/farmland.png
vendor/assets/iD/iD/img/pattern/orchard.png
vendor/assets/iD/iD/img/pattern/vineyard.png
vendor/assets/iD/iD/img/pattern/wetland.png
vendor/assets/iD/iD/img/traffic-signs/traffic-signs.png
vendor/assets/iD/iD/locales/af.json
vendor/assets/iD/iD/locales/ar-AA.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/be.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/bg-BG.json
vendor/assets/iD/iD/locales/bn.json
vendor/assets/iD/iD/locales/bs.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/cy.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/dv.json
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/eo.json
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gl.json
vendor/assets/iD/iD/locales/gu.json
vendor/assets/iD/iD/locales/he.json
vendor/assets/iD/iD/locales/hi.json
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/hy.json
vendor/assets/iD/iD/locales/id.json
vendor/assets/iD/iD/locales/is.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/mg.json
vendor/assets/iD/iD/locales/mk.json
vendor/assets/iD/iD/locales/ms.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ro.json
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/si.json
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/sq.json
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/ta.json
vendor/assets/iD/iD/locales/te.json
vendor/assets/iD/iD/locales/th.json
vendor/assets/iD/iD/locales/tl.json
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/iD/iD/locales/zh.json
vendor/assets/iD/iD/mapillary-js/mapillary.js
vendor/assets/iD/iD/mapillary-js/mapillary.js.map
vendor/assets/iD/iD/mapillary-js/mapillary.min.css
vendor/assets/iD/iD/mapillary-js/mapillary.min.js
vendor/assets/iD/iD/mapillary-js/stepper-left.svg
vendor/assets/iD/iD/mapillary-js/stepper-play.svg
vendor/assets/iD/iD/mapillary-js/stepper-right.svg
vendor/assets/iD/iD/mapillary-js/stepper-stop.svg
vendor/assets/leaflet/images/marker-icon-2x.png
vendor/assets/leaflet/leaflet.contextmenu.js
vendor/assets/leaflet/leaflet.css
vendor/assets/leaflet/leaflet.js
vendor/assets/openlayers/OpenStreetMap.js
vendor/assets/potlatch2/potlatch2.swf
vendor/assets/potlatch2/potlatch2/assets.zip
vendor/assets/potlatch2/potlatch2/locales/af.swf
vendor/assets/potlatch2/potlatch2/locales/eu.swf
vendor/assets/potlatch2/potlatch2/locales/is.swf
vendor/assets/potlatch2/potlatch2/locales/kab.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/kn.swf
vendor/assets/potlatch2/potlatch2/locales/lb.swf
vendor/assets/potlatch2/potlatch2/locales/mg.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/mk.swf
vendor/assets/potlatch2/potlatch2/locales/ms.swf
vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf
vendor/assets/potlatch2/potlatch2/locales/skr-arab.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf
vendor/assets/potlatch2/potlatch2/locales/tl.swf
vendor/assets/potlatch2/potlatch2/locales/tr.swf
vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf

index 55be8141cf31c53115cecdcbe08ffd8d266b9089..5e7be9797e8ebdef5de86cb4a3ff65acdf264cee 100644 (file)
@@ -41,12 +41,18 @@ Naming/FileName:
 Rails/ApplicationRecord:
   Enabled: false
 
+Rails/CreateTableWithTimestamps:
+  Enabled: false
+
 Rails/HasManyOrHasOneDependent:
   Enabled: false
 
 Rails/HttpPositionalArguments:
   Enabled: false
 
+Rails/InverseOf:
+  Enabled: false
+
 Rails/SkipsModelValidations:
   Exclude:
     - 'db/migrate/*.rb'
index b4104079cb75734dd1f5802d9a4401482fe7e598..3ebd4d35f686bb0f4252f2689524b342ea3406ba 100644 (file)
@@ -55,11 +55,6 @@ Lint/InterpolationCheck:
   Exclude:
     - 'test/controllers/node_controller_test.rb'
 
-# Offense count: 2
-Lint/RescueWithoutErrorClass:
-  Exclude:
-    - 'app/helpers/browse_helper.rb'
-
 # Offense count: 2
 Lint/ShadowingOuterLocalVariable:
   Exclude:
@@ -227,3 +222,8 @@ Style/NumericLiterals:
 # SupportedStyles: compact, exploded
 Style/RaiseArgs:
   Enabled: false
+
+# Offense count: 2
+Style/RescueStandardError:
+  Exclude:
+    - 'app/helpers/browse_helper.rb'
index 9b7bb90e89e9cfef6af644966d447ed0f49e9c2b..3cbe31cb9f4ac650214f81a260714dbe3d049f8f 100644 (file)
@@ -6,7 +6,7 @@ After [installing](INSTALL.md) this software, you may need to carry out some of
 
 Your installation comes with no geographic data loaded. You can either create new data using one of the editors (Potlatch 2, iD, JOSM etc) or by loading an OSM extract.
 
-After installing but before creating any users or data, import an extract with [Osmosis](http://wiki.openstreetmap.org/wiki/Osmosis) and the [``--write-apidb``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--write-apidb_.28--wd.29) task.
+After installing but before creating any users or data, import an extract with [Osmosis](https://wiki.openstreetmap.org/wiki/Osmosis) and the [``--write-apidb``](https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--write-apidb_.28--wd.29) task.
 
 ```
 osmosis --read-pbf greater-london-latest.osm.pbf \
@@ -14,7 +14,7 @@ osmosis --read-pbf greater-london-latest.osm.pbf \
   user="openstreetmap" password="" validateSchemaVersion="no"
 ```
 
-Loading an apidb database with Osmosis is about **twenty** times slower than loading the equivalent data with osm2pgsql into a rendering database. [``--log-progress``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--log-progress_.28--lp.29) may be desirable for status updates.
+Loading an apidb database with Osmosis is about **twenty** times slower than loading the equivalent data with osm2pgsql into a rendering database. [``--log-progress``](https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--log-progress_.28--lp.29) may be desirable for status updates.
 
 To be able to edit the data you have loaded, you will need to use this [yet-to-be-written script](https://github.com/openstreetmap/openstreetmap-website/issues/282).
 
@@ -94,7 +94,7 @@ Rails has its own log.  To inspect the log, do this:
 tail -f log/development.log
 ```
 
-If you have more problems, please ask on the [rails-dev@openstreetmap.org mailing list](http://lists.openstreetmap.org/listinfo/rails-dev) or on the [#osm-dev IRC Channel](http://wiki.openstreetmap.org/wiki/IRC)
+If you have more problems, please ask on the [rails-dev@openstreetmap.org mailing list](https://lists.openstreetmap.org/listinfo/rails-dev) or on the [#osm-dev IRC Channel](https://wiki.openstreetmap.org/wiki/IRC)
 
 ## Maintaining your installation
 
@@ -110,7 +110,7 @@ bundle exec rake db:migrate
 
 ## Testing on the osm dev server
 
-For example, after developing a patch for the rails_port, you might want to demonstrate it to others or ask for comments and testing. To do this one can [set up an instance of the rails_port on the dev server in ones user directory](http://wiki.openstreetmap.org/wiki/Using_the_dev_server#Rails_Applications).
+For example, after developing a patch for the rails_port, you might want to demonstrate it to others or ask for comments and testing. To do this one can [set up an instance of the rails_port on the dev server in ones user directory](https://wiki.openstreetmap.org/wiki/Using_the_dev_server#Rails_Applications).
 
 # Contributing
 
@@ -124,6 +124,6 @@ If you want to deploy The Rails Port for production use, you'll need to make a f
 * Passenger will, by design, use the Production environment and therefore the production database - make sure it contains the appropriate data and user accounts.
 * Your production database will also need the extensions and functions installed - see [INSTALL.md](INSTALL.md)
 * The included version of the map call is quite slow and eats a lot of memory. You should consider using [CGIMap](https://github.com/zerebubuth/openstreetmap-cgimap) instead.
-* The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](http://git.openstreetmap.org/gpx-import.git/).
+* The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](https://git.openstreetmap.org/gpx-import.git/).
 * Make sure you precompile the production assets: `RAILS_ENV=production rake assets:precompile`
 * Make sure the web server user as well as the rails user can read, write and create directories in `tmp/`.
index 961377ec83f389625f664b3bf9cc8a01f1dbd14b..acb7807461ea56621f0bf950e324ac110965e5d3 100644 (file)
@@ -1,4 +1,4 @@
-* http://www.ruby-lang.org/ - The homepage of Ruby which has more links and some great tutorials.
+* https://www.ruby-lang.org/ - The homepage of Ruby which has more links and some great tutorials.
 * http://rubyonrails.org/ - The homepage of Rails, also has links and tutorials
 
 ## Coding style
@@ -94,6 +94,6 @@ If you have forked on GitHub then the best way to submit your patches is to
 push your changes back to GitHub and then send a "pull request" on GitHub.
 
 Otherwise you should either push your changes to a publicly visible git repository
-and send the details to the [rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev)
+and send the details to the [rails-dev](https://lists.openstreetmap.org/listinfo/rails-dev)
 list or generate patches with `git format-patch` and send them to the
-[rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev) list.
+[rails-dev](https://lists.openstreetmap.org/listinfo/rails-dev) list.
diff --git a/Gemfile b/Gemfile
index 79d95f9d5af3e7bc91376002e0e3574997c28aa8..e05edebc402e72f2872f2d4aea26d7bda3a824df 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -13,7 +13,7 @@ gem "psych", :platforms => :ruby_20
 gem "json"
 
 # Use postgres as the database
-gem "pg"
+gem "pg", "~> 0.18"
 
 # Use SCSS for stylesheets
 gem "sass-rails", "~> 5.0"
@@ -48,7 +48,7 @@ gem "http_accept_language", "~> 2.0.0"
 gem "i18n-js", ">= 3.0.0"
 gem "oauth-plugin", ">= 0.5.1"
 gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
-gem "paperclip", "~> 4.0"
+gem "paperclip", "~> 5.2"
 gem "rack-cors"
 gem "rails-i18n", "~> 4.0.0"
 gem "record_tag_helper"
index 1cff441517ad978f29781b934b7d06f0ecf88c48..7dd619b614206efc9c460f5715dfff646adf6531 100644 (file)
@@ -48,19 +48,19 @@ GEM
       rake (>= 10.4, < 13.0)
     arel (8.0.0)
     ast (2.3.0)
-    autoprefixer-rails (7.1.6)
+    autoprefixer-rails (7.2.5)
       execjs
     bigdecimal (1.1.0)
     builder (3.2.3)
     canonical-rails (0.2.1)
       rails (>= 4.1, < 5.2)
-    capybara (2.16.1)
+    capybara (2.17.0)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (>= 1.3.3)
       rack (>= 1.0.0)
       rack-test (>= 0.5.4)
-      xpath (~> 2.0)
+      xpath (>= 2.0, < 4.0)
     climate_control (0.2.0)
     cliver (0.3.2)
     cocaine (0.5.8)
@@ -72,8 +72,8 @@ GEM
       coffee-script-source
       execjs
     coffee-script-source (1.12.2)
-    composite_primary_keys (10.0.1)
-      activerecord (~> 5.1.0)
+    composite_primary_keys (10.0.2)
+      activerecord (~> 5.1.0, >= 5.1.4)
     concurrent-ruby (1.0.5)
     coveralls (0.8.21)
       json (>= 1.8, < 3)
@@ -89,7 +89,7 @@ GEM
     dynamic_form (1.1.4)
     erubi (1.7.0)
     execjs (2.7.0)
-    exifr (1.3.2)
+    exifr (1.3.3)
     factory_bot (4.8.2)
       activesupport (>= 3.0.0)
     factory_bot_rails (4.8.2)
@@ -103,14 +103,14 @@ GEM
     globalid (0.4.1)
       activesupport (>= 4.2.0)
     hashdiff (0.3.7)
-    hashie (3.5.6)
+    hashie (3.5.7)
     htmlentities (4.3.4)
     http_accept_language (2.0.5)
-    i18n (0.9.1)
+    i18n (0.9.3)
       concurrent-ruby (~> 1.0)
-    i18n-js (3.0.2)
+    i18n-js (3.0.3)
       i18n (~> 0.6, >= 0.6.6)
-    image_optim (0.26.0)
+    image_optim (0.26.1)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 3.0)
       image_size (~> 1.5)
@@ -137,7 +137,7 @@ GEM
       actionpack
       jsonify (< 0.4.0)
     jwt (1.5.6)
-    kgio (2.11.0)
+    kgio (2.11.1)
     libv8 (3.16.14.19)
     libxml-ruby (3.0.0)
     listen (3.1.5)
@@ -158,14 +158,14 @@ GEM
     mime-types (3.1)
       mime-types-data (~> 3.2015)
     mime-types-data (3.2016.0521)
-    mimemagic (0.3.0)
+    mimemagic (0.3.2)
     mini_mime (1.0.0)
     mini_portile2 (2.3.0)
-    minitest (5.10.3)
-    multi_json (1.12.2)
+    minitest (5.11.1)
+    multi_json (1.13.1)
     multi_xml (0.6.0)
     multipart-post (2.0.0)
-    nio4r (2.1.0)
+    nio4r (2.2.0)
     nokogiri (1.8.1)
       mini_portile2 (~> 2.3.0)
     nokogumbo (1.4.13)
@@ -182,7 +182,7 @@ GEM
       multi_json (~> 1.3)
       multi_xml (~> 0.5)
       rack (>= 1.2, < 3)
-    omniauth (1.7.1)
+    omniauth (1.8.1)
       hashie (>= 3.4.6, < 3.6.0)
       rack (>= 1.6.2, < 3)
     omniauth-facebook (4.0.0)
@@ -201,8 +201,8 @@ GEM
     omniauth-oauth (1.1.0)
       oauth
       omniauth (~> 1.0)
-    omniauth-oauth2 (1.4.0)
-      oauth2 (~> 1.0)
+    omniauth-oauth2 (1.5.0)
+      oauth2 (~> 1.1)
       omniauth (~> 1.2)
     omniauth-openid (1.0.1)
       omniauth (~> 1.0)
@@ -211,25 +211,25 @@ GEM
       multi_json (~> 1.12)
       omniauth-oauth2 (~> 1.4)
     openstreetmap-deadlock_retry (1.3.0)
-    paperclip (4.3.7)
-      activemodel (>= 3.2.0)
-      activesupport (>= 3.2.0)
+    paperclip (5.2.0)
+      activemodel (>= 4.2.0)
+      activesupport (>= 4.2.0)
       cocaine (~> 0.5.5)
       mime-types
-      mimemagic (= 0.3.0)
-    parallel (1.12.0)
+      mimemagic (~> 0.3.0)
+    parallel (1.12.1)
     parser (2.4.0.2)
       ast (~> 2.3)
     pg (0.21.0)
-    poltergeist (1.16.0)
+    poltergeist (1.17.0)
       capybara (~> 2.1)
       cliver (~> 0.3.1)
       websocket-driver (>= 0.2.0)
     powerpack (0.1.1)
     progress (3.4.0)
-    psych (2.2.4)
+    psych (3.0.2)
     public_suffix (3.0.1)
-    puma (3.11.0)
+    puma (3.11.2)
     r2 (0.2.7)
     rack (2.0.3)
     rack-cors (1.0.2)
@@ -269,8 +269,7 @@ GEM
       method_source
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
-    rainbow (2.2.2)
-      rake
+    rainbow (3.0.0)
     rake (12.3.0)
     rb-fsevent (0.10.2)
     rb-inotify (0.9.10)
@@ -279,14 +278,15 @@ GEM
       actionview (~> 5.x)
     redcarpet (3.4.0)
     ref (2.0.0)
-    request_store (1.3.2)
-    rinku (2.0.3)
+    request_store (1.4.0)
+      rack (>= 1.4)
+    rinku (2.0.4)
     rotp (3.3.0)
-    rubocop (0.51.0)
+    rubocop (0.52.1)
       parallel (~> 1.10)
-      parser (>= 2.3.3.1, < 3.0)
+      parser (>= 2.4.0.2, < 3.0)
       powerpack (~> 0.1)
-      rainbow (>= 2.2.2, < 3.0)
+      rainbow (>= 2.2.2, < 4.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (~> 1.0, >= 1.0.1)
     ruby-openid (2.7.0)
@@ -297,7 +297,7 @@ GEM
       crass (~> 1.0.2)
       nokogiri (>= 1.4.4)
       nokogumbo (~> 1.4.1)
-    sass (3.5.3)
+    sass (3.5.5)
       sass-listen (~> 4.0.0)
     sass-listen (4.0.0)
       rb-fsevent (~> 0.9, >= 0.9.4)
@@ -308,7 +308,7 @@ GEM
       sprockets (>= 2.8, < 4.0)
       sprockets-rails (>= 2.0, < 4.0)
       tilt (>= 1.1, < 3)
-    secure_headers (5.0.3)
+    secure_headers (5.0.4)
       useragent (>= 0.15.0)
     simplecov (0.14.1)
       docile (~> 1.1.0)
@@ -330,25 +330,25 @@ GEM
     thor (0.19.4)
     thread_safe (0.3.6)
     tilt (2.0.8)
-    tins (1.16.0)
+    tins (1.16.3)
     tzinfo (1.2.4)
       thread_safe (~> 0.1)
-    uglifier (3.2.0)
+    uglifier (4.1.4)
       execjs (>= 0.3.0, < 3)
     unicode-display_width (1.3.0)
-    useragent (0.16.8)
+    useragent (0.16.9)
     validates_email_format_of (1.6.3)
       i18n
     vendorer (0.1.16)
-    webmock (3.1.1)
+    webmock (3.3.0)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
       hashdiff
     websocket-driver (0.6.5)
       websocket-extensions (>= 0.1.0)
     websocket-extensions (0.1.3)
-    xpath (2.1.0)
-      nokogiri (~> 1.3)
+    xpath (3.0.0)
+      nokogiri (~> 1.8)
 
 PLATFORMS
   ruby
@@ -391,8 +391,8 @@ DEPENDENCIES
   omniauth-openid
   omniauth-windowslive
   openstreetmap-deadlock_retry (>= 1.3.0)
-  paperclip (~> 4.0)
-  pg
+  paperclip (~> 5.2)
+  pg (~> 0.18)
   poltergeist
   psych
   puma (~> 3.7)
index d036673b1ee1923bdffcdb8dfc36ab7cbd5cde15..7571cff50fd7c7eb6d3b79e4f59f713aefb794ed 100644 (file)
@@ -69,7 +69,7 @@ For MacOSX, you will need XCode installed from the Mac App Store; OS X 10.7 (Lio
 
 Installing PostgreSQL:
 
-* Install Postgres.app from http://postgresapp.com/
+* Install Postgres.app from https://postgresapp.com/
 * Add PostgreSQL to your path, by editing your profile:
 
 `nano ~/.profile`
@@ -80,9 +80,11 @@ and adding:
 
 Installing other dependencies:
 
-* Install Homebrew from http://mxcl.github.io/homebrew/
+* Install Homebrew from https://brew.sh/
 * Install the latest version of Ruby: `brew install ruby`
 * Install ImageMagick: `brew install imagemagick`
+* Install libxml2: `brew install libxml2 --with-xml2-config`
+* If you want to run the tests, you need `phantomjs` as well: `brew install phantomjs`
 * Install Bundler: `gem install bundler`
 
 Note that OS X does not have a /home directory by default, so if you are using the GPX functions, you will need to change the directories specified in config/application.yml.
index 6b929fef9f48e7e9be810c2576d7eb6ef47eaa38..9162a38de691c33a979bfa68938c9bebb339fe50 100644 (file)
--- a/README.md
+++ b/README.md
@@ -4,14 +4,14 @@
 [![Coverage Status](https://coveralls.io/repos/openstreetmap/openstreetmap-website/badge.svg?branch=master)](https://coveralls.io/r/openstreetmap/openstreetmap-website?branch=master)
 
 This is The Rails Port, the [Ruby on Rails](http://rubyonrails.org/)
-application that powers the [OpenStreetMap](http://www.openstreetmap.org) website and API.
+application that powers the [OpenStreetMap](https://www.openstreetmap.org) website and API.
 The software is also known as "openstreetmap-website".
 
 This repository consists of:
 
 * The web site, including user accounts, diary entries, user-to-user messaging
-* The XML-based editing [API](http://wiki.openstreetmap.org/wiki/API_v0.6)
-* The integrated versions of the [Potlatch](http://wiki.openstreetmap.org/wiki/Potlatch_1), [Potlatch 2](http://wiki.openstreetmap.org/wiki/Potlatch_2) and [iD](http://wiki.openstreetmap.org/wiki/ID) editors
+* The XML-based editing [API](https://wiki.openstreetmap.org/wiki/API_v0.6)
+* The integrated versions of the [Potlatch](https://wiki.openstreetmap.org/wiki/Potlatch_1), [Potlatch 2](https://wiki.openstreetmap.org/wiki/Potlatch_2) and [iD](https://wiki.openstreetmap.org/wiki/ID) editors
 * The Browse pages - a web front-end to the OpenStreetMap data
 * The GPX uploads, browsing and API.
 
@@ -21,7 +21,7 @@ uses publicly-available services to help with development and testing.
 
 # License
 
-This software is licensed under the [GNU General Public License 2.0](http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt),
+This software is licensed under the [GNU General Public License 2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt),
 a copy of which can be found in the [LICENSE](LICENSE) file.
 
 # Installation
@@ -36,7 +36,7 @@ We're always keen to have more developers! Pull requests are very welcome.
 * Bugs are recorded in the [issue tracker](https://github.com/openstreetmap/openstreetmap-website/issues).
 * Some bug reports are also found on the [OpenStreetMap trac](https://trac.openstreetmap.org/) system, in the "[website](https://trac.openstreetmap.org/query?status=new&status=assigned&status=reopened&component=website&order=priority)" and "[api](https://trac.openstreetmap.org/query?status=new&status=assigned&status=reopened&component=api&order=priority)" components
 * Translation is managed by [Translatewiki](https://translatewiki.net/wiki/Translating:OpenStreetMap)
-* There is a [rails-dev@openstreetmap.org](http://lists.openstreetmap.org/listinfo/rails-dev) mailing list for development discussion.
+* There is a [rails-dev@openstreetmap.org](https://lists.openstreetmap.org/listinfo/rails-dev) mailing list for development discussion.
 * IRC - there is the #osm-dev channel on irc.oftc.net.
 
 More details on contributing to the code are in the [CONTRIBUTING.md](CONTRIBUTING.md) file.
index 3825ad988242567e0e4af260b1e850c8faf04f05..9dea618616ff66c2687b727eadb092f8de263c42 100644 (file)
@@ -8,7 +8,7 @@ sudo apt-get install vagrant
 
 Other Linux distributions should have similar installation instructions using `dnf`, `pacman`, or similar.
 
-Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads.html) for more information.
+Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](https://www.vagrantup.com/downloads.html) for more information.
 
 Note than until there are suitable _xenial64_ [vagrant boxes](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=&q=xenial64) for other providers,
 the only virtualization provider supported is virtualbox. You might need to install it and specify `--provider virtualbox` when setting up your environment.
index d66dd80d8077afcbaf3f04aa394a6f767cbdf6ac..e57ab21fee5b8a9e26bc595962a3d2ad8543196a 100644 (file)
@@ -11,16 +11,16 @@ folder 'vendor/assets' do
   end
 
   folder 'leaflet' do
-    file 'leaflet.js', 'https://unpkg.com/leaflet@1.2.0/dist/leaflet-src.js'
-    file 'leaflet.css', 'https://unpkg.com/leaflet@1.2.0/dist/leaflet.css'
+    file 'leaflet.js', 'https://unpkg.com/leaflet@1.3.1/dist/leaflet-src.js'
+    file 'leaflet.css', 'https://unpkg.com/leaflet@1.3.1/dist/leaflet.css'
 
     [ 'layers.png', 'layers-2x.png',
       'marker-icon.png', 'marker-icon-2x.png',
       'marker-shadow.png' ].each do |image|
-      file "images/#{image}", "https://unpkg.com/leaflet@1.2.0/dist/images/#{image}"
+      file "images/#{image}", "https://unpkg.com/leaflet@1.3.1/dist/images/#{image}"
     end
 
-    from 'git://github.com/aratcliffe/Leaflet.contextmenu.git', :tag => 'v1.2.1' do
+    from 'git://github.com/aratcliffe/Leaflet.contextmenu.git', :tag => 'v1.5.0' do
       file 'leaflet.contextmenu.js', 'dist/leaflet.contextmenu.js'
       file 'leaflet.contextmenu.css', 'dist/leaflet.contextmenu.css'
     end
diff --git a/app/assets/images/banners/banner-sotmus2017.png b/app/assets/images/banners/banner-sotmus2017.png
deleted file mode 100644 (file)
index 25382bf..0000000
Binary files a/app/assets/images/banners/banner-sotmus2017.png and /dev/null differ
diff --git a/app/assets/images/banners/foss4g-it2018-banner.png b/app/assets/images/banners/foss4g-it2018-banner.png
new file mode 100755 (executable)
index 0000000..7ed898f
Binary files /dev/null and b/app/assets/images/banners/foss4g-it2018-banner.png differ
diff --git a/app/assets/images/banners/fossgis2018.png b/app/assets/images/banners/fossgis2018.png
new file mode 100644 (file)
index 0000000..bff1929
Binary files /dev/null and b/app/assets/images/banners/fossgis2018.png differ
diff --git a/app/assets/images/banners/osmf-membership-drive-2017.png b/app/assets/images/banners/osmf-membership-drive-2017.png
deleted file mode 100644 (file)
index 0b62b21..0000000
Binary files a/app/assets/images/banners/osmf-membership-drive-2017.png and /dev/null differ
diff --git a/app/assets/images/banners/sotmasia-2017-banner.png b/app/assets/images/banners/sotmasia-2017-banner.png
deleted file mode 100644 (file)
index f18f5bf..0000000
Binary files a/app/assets/images/banners/sotmasia-2017-banner.png and /dev/null differ
index c511bd90fbc7db6e940d6abce045033eca31df44..e2561701352bdbcccd98c69d4f6d7e721ebe4d9c 100644 (file)
Binary files a/app/assets/images/sprite.png and b/app/assets/images/sprite.png differ
index df8e3e3d58c9cf6342bfb0f1f9e2071f57bc513e..b9270279ffe55376dc8d25b08789477054afdd2b 100644 (file)
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="300"
-   height="200"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   inkscape:export-filename="/home/tom/rails/app/assets/images/sprite.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   sodipodi:docname="sprite.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="16"
-     inkscape:cx="258.2457"
-     inkscape:cy="193.60262"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1366"
-     inkscape:window-height="702"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:object-paths="true"
-     inkscape:object-nodes="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2985"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="20,185"
-       id="guide6892" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="40,185"
-       id="guide6894" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="60,180"
-       id="guide6896" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="80,185"
-       id="guide6898" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="100,185"
-       id="guide6900" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="120,175"
-       id="guide6902" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="140,185"
-       id="guide6904" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="160,190"
-       id="guide6906" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="180,180"
-       id="guide6908" />
-    <sodipodi:guide
-       orientation="0,1"
-       position="50,180"
-       id="guide6910" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="200,180"
-       id="guide10867" />
-    <sodipodi:guide
-       orientation="0,1"
-       position="180,160"
-       id="guide10873" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="220,190"
-       id="guide10875" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="240,160"
-       id="guide10881" />
-    <sodipodi:guide
-       orientation="0,1"
-       position="230,140"
-       id="guide10887" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="260,195"
-       id="guide11761" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="280,153.875"
-       id="guide3019" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="background"
-     style="display:none">
-    <rect
-       style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="rect6890"
-       width="300"
-       height="200"
-       x="0"
-       y="0" />
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="300" height="200" viewBox="0, 0, 300, 200">
+  <g id="background">
+    <path d="M0,0 L300,0 L300,200 L0,200 z" fill="#B3B3B3" id="rect6890" display="none"/>
   </g>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-852.36218)">
-    <path
-       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 24,860.36218 c 0,-1.82764 1,-4 3.75,-4 1.827643,0 2.75,2 2.75,2 0,0 0.922357,-2 2.75,-2 2.75,0 3.75,2.17236 3.75,4 0,5 -6.5,8 -6.5,8 0,0 -6.5,-3 -6.5,-8 z"
-       id="path3843"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="sscsscs" />
-    <path
-       sodipodi:nodetypes="cccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path3361-4"
-       d="m 224,880.36218 2,0 3,3 4.7735,-6 2.2265,0 0,2 -5,6 -1,1 -2,0 -1,-1 -3,-3 z"
-       style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       sodipodi:nodetypes="cccccccccccccccccc"
-       d="m 129,855.3622 -1.00001,1 0,2 1.00001,1 2.00002,0 1,-1 0,-2 -1.00002,-1 z m 2e-5,6 -1.00001,1 0,6 1.00001,1 1.99998,0 1.00004,-1 -3e-5,-6 -1,-1 z"
-       id="path6912"
-       style="font-size:16.71258354000000068px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Helvetica Neue"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       inkscape:connector-curvature="0"
-       id="path6914"
-       d="m 57,861.36216 -1,-1 -4,0 0,-4 -1,-0.99999 -1,0 -1,1 0,4 -4,0 -1,0.99999 0,1 1,1 4,0 0,3.99999 1,1.00002 1,0 1,-1.00001 0,-3.99999 4,-10e-6 1,-0.99998 0,-1.00002 z"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 65,860.36216 11,-2e-5 1,1.00002 0,1.00002 -1,0.99997 -11,3e-5 -1,-1.00003 0,-1 z"
-       id="path6916"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:connector-curvature="0"
-       id="path6918"
-       d="m 84,862.36218 0,-2.00001 10,-3.99999 2,1e-5 0,1.99998 -4,10 -2,10e-6 0,-6 z"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       id="path6920"
-       d="m 155,854.3622 -1,1 0,2 -2,0 c -6,0 -6,7 -6,7 0,0 2,-4 6,-4 0.66667,0 1.33333,0 2,0 l 0,2 1,1 4,-4.5 -4,-4.5 z m -13,4 -1,1 0,9 1,1 10,0 1,-1 0,-2 0,-3 0,-1 -1,0 c -0.3202,-10e-5 -0.6603,0.073 -1,0.1875 l 0,2.8125 0,2 -5.5625,0 a 2.0002,2.0002 0 0 1 -0.90625,0 l -1.53125,0 0,-1.625 a 2.0002,2.0002 0 0 1 0,-0.625 l 0,-2.75 0,-2 1.53125,0 c 0.3433,-0.6691 0.79175,-1.3477 1.34375,-2 l -0.875,0 -3,0 z"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 109.50003,855.3622 -6.50002,3 1e-5,1 6.49998,3 1.00002,0 6.49999,-3 1e-5,-1 -6.50001,-3 -0.99998,0 z m -5.40621,6.5 -1.09377,0.5 -3e-5,1 6.49999,3 1,0 6.50001,-3 0,-1 -1.0937,-0.5 -5.40631,2.5 -0.99998,0 -5.40621,-2.5 z m 0,4 -1.09379,0.5 -2e-5,1 6.50001,3 1.00001,0 6.5,-3 -10e-6,-1 -1.0937,-0.5 -5.40631,2.5 -0.99999,0 -5.4062,-2.5 z"
-       id="path6922"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       inkscape:connector-curvature="0"
-       id="path6924"
-       d="m 170,853.3622 -1,1 0,1 -1,0 -1,1 0,2 7,0 0,-2 -1,-1 -1,0 0,-1 -1,-1 -1,0 z m -5,3 -1,1 0,11 1,1 11,0 1,-1 0,-11 -1,-1 -1,0 0,1 0,2 0,8 -9,0 0,-8 0,-2 0,-1 -1,0 z m 3,4 0,1 5,0 0,-1 -5,0 z m 0,2 0,1 5,0 0,-1 -5,0 z m 0,2 0,1 3,0 0,-1 -3,0 z"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/Dropbox/new-osm/community-landing-fg-dropdown.png"
-       inkscape:connector-curvature="0"
-       id="path10739"
-       d="m 11.5,855.36218 c 3.0376,0 5.5,2.46243 5.5,5.5 0,3.03757 -2.4624,5.5 -5.5,5.5 -1.0061,0 -1.9387,-0.27827 -2.75,-0.75 l -3.75,3.75 -1,0 -1,-1 0,-1 3.75,-3.75 C 6.2783,862.80084 6,861.86831 6,860.86218 c 0,-3.03757 2.4624,-5.5 5.5,-5.5 z m 0.5,2 -1,0 -2,1 -1,2 0,1 1,2 2,1 1,0 2,-1 1,-2 0,-1 -1,-2 -2,-1 z"
-       style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       id="path10879"
-       d="m 206,857.36218 -1,1 0,1 3,3 -3,3 0,1 1,1 1,0 3,-3 3,3 1,0 1,-1 0,-1 -3,-3 3,-3 0,-1 -1,-1 -1,0 -3,3 -3,-3 -1,0 z"
-       style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       inkscape:connector-curvature="0" />
-    <path
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 224,860.36218 2,0 3,3 4.7735,-6 2.2265,0 0,2 -5,6 -1,1 -2,0 -1,-1 -3,-3 z"
-       id="path10883"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 244,864.36218 0,-7 1,-1 10,0 1,1 0,7 -1,1 -3,0 -2,3 -2,-3 -3,0 z"
-       id="path11741"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:connector-curvature="0"
-       id="path6918-2"
-       d="m 84,882.36218 0,-2.00001 10,-3.99999 2,1e-5 0,1.99998 -4,10 -2,10e-6 0,-6 z"
-       style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 185 6 L 183 8 L 183 12 L 185 14 L 187 14 L 185 12 L 185 8 L 190 8 L 190 11 L 192 11 L 192 8 L 190 6 L 187 6 L 185 6 z M 192 6 L 194 8 L 194 12 L 189 12 L 189 9 L 187 9 L 187 12 L 189 14 L 194 14 L 196 12 L 196 8 L 194 6 L 192 6 z "
-       transform="translate(0,852.36218)"
-       id="path4118" />
-    <path
-       inkscape:connector-curvature="0"
-       style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 205.9375,877.51843 -1,1 0,1 3,3 -3,3 0,1 1,1 1,0 3,-3 3,3 1,0 1,-1 0,-1 -3,-3 3,-3 0,-1 -1,-1 -1,0 -3,3 -3,-3 -1,0 z"
-       id="path3059"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <text
-       xml:space="preserve"
-       style="font-size:20px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:'DejaVu Sans', Sans, sans-serif"
-       x="264.8125"
-       y="869.62622"
-       id="text3021"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan3023"
-         x="264.8125"
-         y="869.62622">?</tspan></text>
-    <path
-       sodipodi:nodetypes="cccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path3386"
-       d="m 244,884.36218 0,-7 1,-1 10,0 1,1 0,7 -1,1 -3,0 -2,3 -2,-3 -3,0 z"
-       style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate" />
+  <g id="Layer_1">
+    <g id="query">
+      <text transform="matrix(1, 0, 0, 1, 276.165, 12.5)" id="tspan3023">
+        <tspan x="-3.665" y="6.012" font-family="Helvetica-Bold" font-size="12" fill="#FFFFFF">?</tspan>
+      </text>
+      <path d="M263,1 C263,1 272,8 272,8 C270.944,8.587 269.888,9.173 268.832,9.76 L271.863,16.375 C272.209,17.128 271.878,18.018 271.125,18.364 C270.372,18.709 269.482,18.378 269.136,17.625 L266.201,11.221 C265.134,11.814 264.067,12.407 263,13 L263,1 z" fill="#FFFFFF"/>
+    </g>
+    <g id="add-note-grey">
+      <path d="M242,31 L242,24 L243,23 L253,23 L254,24 L254,31 L253,32 L250,32 L248,35 L246,32 L243,32 z" fill="#CCCCCC" id="path3386"/>
+      <path d="M257,33 L257,35 L259,35 L259,37 L257,37 L257,39 L255,39 L255,37 L253,37 L253,35 L255,35 L255,33 L257,33 z" fill="#CCCCCC"/>
+    </g>
+    <g id="add-note">
+      <path d="M257,12 L257,14 L259,14 L259,16 L257,16 L257,18 L255,18 L255,16 L253,16 L253,14 L255,14 L255,12 L257,12 z" fill="#FFFFFF"/>
+      <path d="M242,11 L242,4 L243,3 L253,3 L254,4 L254,11 L253,12 L250,12 L248,15 L246,12 L243,12 z" fill="#FFFFFF" id="path11741"/>
+    </g>
+    <g id="check-green">
+      <path d="M224,28 L226,28 L229,31 L233.773,25 L236,25 L236,27 L231,33 L230,34 L228,34 L227,33 L224,30 z" fill="#70CD8F" id="path3361-4"/>
+    </g>
+    <g id="check">
+      <path d="M224,8 L226,8 L229,11 L233.773,5 L236,5 L236,7 L231,13 L230,14 L228,14 L227,13 L224,10 z" fill="#222222" id="path10883"/>
+    </g>
+    <g id="close-grey">
+      <path d="M205.938,25.156 L204.938,26.156 L204.938,27.156 L207.938,30.156 L204.938,33.156 L204.938,34.156 L205.938,35.156 L206.938,35.156 L209.938,32.156 L212.938,35.156 L213.938,35.156 L214.938,34.156 L214.938,33.156 L211.938,30.156 L214.938,27.156 L214.938,26.156 L213.938,25.156 L212.938,25.156 L209.938,28.156 L206.938,25.156 L205.938,25.156 z" fill="#999999" id="path3059"/>
+    </g>
+    <g id="close">
+      <path d="M206,5 L205,6 L205,7 L208,10 L205,13 L205,14 L206,15 L207,15 L210,12 L213,15 L214,15 L215,14 L215,13 L212,10 L215,7 L215,6 L214,5 L213,5 L210,8 L207,5 L206,5 z" fill="#CCCCCC" id="path10879"/>
+    </g>
+    <g id="link">
+      <path d="M185,6 L183,8 L183,12 L185,14 L187,14 L185,12 L185,8 L190,8 L190,11 L192,11 L192,8 L190,6 L187,6 L185,6 z M192,6 L194,8 L194,12 L189,12 L189,9 L187,9 L187,12 L189,14 L194,14 L196,12 L196,8 L194,6 L192,6 z" fill="#0000FF" id="path4118"/>
+    </g>
+    <g id="clipboard">
+      <path d="M170,1 L169,2 L169,3 L168,3 L167,4 L167,6 L174,6 L174,4 L173,3 L172,3 L172,2 L171,1 L170,1 z M165,4 L164,5 L164,16 L165,17 L176,17 L177,16 L177,5 L176,4 L175,4 L175,5 L175,7 L175,15 L166,15 L166,7 L166,5 L166,4 L165,4 z M168,8 L168,9 L173,9 L173,8 L168,8 z M168,10 L168,11 L173,11 L173,10 L168,10 z M168,12 L168,13 L171,13 L171,12 L168,12 z" fill="#FFFFFF" id="path6924"/>
+    </g>
+    <g id="export">
+      <path d="M155,2 L154,3 L154,5 L152,5 C146,5 146,12 146,12 C146,12 148,8 152,8 C152.667,8 153.333,8 154,8 L154,10 L155,11 L159,6.5 L155,2 z M142,6 L141,7 L141,16 L142,17 L152,17 L153,16 L153,14 L153,11 L153,10 L152,10 C151.68,10 151.34,10.073 151,10.188 L151,13 L151,15 L145.438,15 C145.139,15.069 144.829,15.069 144.531,15 L143,15 L143,13.375 C142.967,13.168 142.967,12.957 143,12.75 L143,10 L143,8 L144.531,8 C144.875,7.331 145.323,6.652 145.875,6 L145,6 L142,6 z" fill="#FFFFFF" id="path6920"/>
+    </g>
+    <g id="info">
+      <path d="M129,3 L128,4 L128,6 L129,7 L131,7 L132,6 L132,4 L131,3 z M129,9 L128,10 L128,16 L129,17 L131,17 L132,16 L132,10 L131,9 z" fill="#FFFFFF" id="path6912"/>
+    </g>
+    <g id="layers">
+      <path d="M109.5,3 L103,6 L103,7 L109.5,10 L110.5,10 L117,7 L117,6 L110.5,3 L109.5,3 z M104.094,9.5 L103,10 L103,11 L109.5,14 L110.5,14 L117,11 L117,10 L115.906,9.5 L110.5,12 L109.5,12 L104.094,9.5 z M104.094,13.5 L103,14 L103,15 L109.5,18 L110.5,18 L117,15 L117,14 L115.906,13.5 L110.5,16 L109.5,16 L104.094,13.5 z" fill="#FFFFFF" id="path6922"/>
+    </g>
+    <g id="locate-green">
+      <path d="M84,30 L84,28 L94,24 L96,24 L96,26 L92,36 L90,36 L90,30 z" fill="#70CD8F" id="path6918-2"/>
+    </g>
+    <g id="locate">
+      <path d="M84,10 L84,8 L94,4 L96,4 L96,6 L92,16 L90,16 L90,10 z" fill="#FFFFFF" id="path6918"/>
+    </g>
+    <g id="minus">
+      <path d="M65,8 L76,8 L77,9 L77,10 L76,11 L65,11 L64,10 L64,9 z" fill="#FFFFFF" id="path6916"/>
+    </g>
+    <g id="plus">
+      <path d="M57,9 L56,8 L52,8 L52,4 L51,3 L50,3 L49,4 L49,8 L45,8 L44,9 L44,10 L45,11 L49,11 L49,15 L50,16 L51,16 L52,15 L52,11 L56,11 L57,10 L57,9 z" fill="#FFFFFF" id="path6914"/>
+    </g>
+    <g id="heart">
+      <path d="M24,8 C24,6.172 25,4 27.75,4 C29.578,4 30.5,6 30.5,6 C30.5,6 31.422,4 33.25,4 C36,4 37,6.172 37,8 C37,13 30.5,16 30.5,16 C30.5,16 24,13 24,8 z" fill="#000000" id="path3843"/>
+    </g>
+    <g id="search">
+      <path d="M11.5,3 C14.538,3 17,5.462 17,8.5 C17,11.538 14.538,14 11.5,14 C10.494,14 9.561,13.722 8.75,13.25 L5,17 L4,17 L3,16 L3,15 L6.75,11.25 C6.278,10.439 6,9.506 6,8.5 C6,5.462 8.462,3 11.5,3 z M12,5 L11,5 L9,6 L8,8 L8,9 L9,11 L11,12 L12,12 L14,11 L15,9 L15,8 L14,6 L12,5 z" fill="#999999" id="path10739"/>
+    </g>
   </g>
 </svg>
index 00e6a9d32a0d815b05676e0428540fc6a82ac16a..4ea643b261e68b676ae640c9e01cc9e24ba48449 100644 (file)
@@ -241,9 +241,7 @@ $(document).ready(function () {
 
   function remoteEditHandler(bbox, object) {
     var loaded = false,
-        url = document.location.protocol === "https:" ?
-        "https://127.0.0.1:8112/load_and_zoom?" :
-        "http://127.0.0.1:8111/load_and_zoom?",
+        url = "http://127.0.0.1:8111/load_and_zoom?",
         query = {
           left: bbox.getWest() - 0.0001,
           top: bbox.getNorth() + 0.0001,
index 03e023bc1749722c95d656bd8faad4a66264cc5f..ee195af416f92a929f1a12fee60324a73ff3d6a6 100644 (file)
@@ -78,7 +78,7 @@ OSM.Directions = function (map) {
 
       endpoint.awaitingGeocode = true;
 
-      $.getJSON(document.location.protocol + OSM.NOMINATIM_URL + 'search?q=' + encodeURIComponent(endpoint.value) + '&format=json', function (json) {
+      $.getJSON(OSM.NOMINATIM_URL + 'search?q=' + encodeURIComponent(endpoint.value) + '&format=json', function (json) {
         endpoint.awaitingGeocode = false;
         endpoint.hasGeocode = true;
         if (json.length === 0) {
index 2058a4daf4437bf13955f2d4abefcb4406bdb436..f05f1ab3dfb761336a471ce49f542edd4965af60 100644 (file)
@@ -21,7 +21,7 @@ function GraphHopperEngine(id, vehicleType) {
       // GraphHopper Directions API documentation
       // https://graphhopper.com/api/1/docs/routing/
       return $.ajax({
-        url: document.location.protocol + OSM.GRAPHHOPPER_URL,
+        url: OSM.GRAPHHOPPER_URL,
         data: {
           vehicle: vehicleType,
           locale: I18n.currentLocale(),
index fcc47f103544ed3e99943eb5df17c573b655a826..739ce65395c71afa6c79eca946dbf3e83d83b3de 100644 (file)
@@ -1,6 +1,6 @@
 // For docs, see:
-// http://developer.mapquest.com/web/products/open/directions-service
-// http://open.mapquestapi.com/directions/
+// https://developer.mapquest.com/web/products/open/directions-service
+// https://open.mapquestapi.com/directions/
 // https://github.com/apmon/openstreetmap-website/blob/21edc353a4558006f0ce23f5ec3930be6a7d4c8b/app/controllers/routing_controller.rb#L153
 
 function MapQuestEngine(id, routeType) {
@@ -28,7 +28,7 @@ function MapQuestEngine(id, routeType) {
 
   return {
     id: id,
-    creditline: '<a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="' + document.location.protocol + '//developer.mapquest.com/content/osm/mq_logo.png">',
+    creditline: '<a href="https://www.mapquest.com/" target="_blank">MapQuest</a> <img src="' + document.location.protocol + '//developer.mapquest.com/content/osm/mq_logo.png">',
     draggable: false,
 
     getRoute: function (points, callback) {
@@ -36,7 +36,7 @@ function MapQuestEngine(id, routeType) {
       var to = points[points.length - 1];
 
       return $.ajax({
-        url: document.location.protocol + OSM.MAPQUEST_DIRECTIONS_URL,
+        url: OSM.MAPQUEST_DIRECTIONS_URL,
         data: {
           key: OSM.MAPQUEST_KEY,
           from: from.lat + "," + from.lng,
diff --git a/app/assets/javascripts/index/directions/mapzen.js b/app/assets/javascripts/index/directions/mapzen.js
deleted file mode 100644 (file)
index 981fc38..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-function MapzenEngine(id, costing) {
-  var MZ_INSTR_MAP = [
-    0,  // kNone = 0;
-    8, // kStart = 1;
-    8, // kStartRight = 2;
-    8, // kStartLeft = 3;
-    14,  // kDestination = 4;
-    14,  // kDestinationRight = 5;
-    14,  // kDestinationLeft = 6;
-    0,  // kBecomes = 7;
-    0,  // kContinue = 8;
-    1,  // kSlightRight = 9;
-    2,  // kRight = 10;
-    3,  // kSharpRight = 11;
-    4,  // kUturnRight = 12;
-    4,  // kUturnLeft = 13;
-    7,  // kSharpLeft = 14;
-    6,  // kLeft = 15;
-    5,  // kSlightLeft = 16;
-    0,  // kRampStraight = 17;
-    24, // kRampRight = 18;
-    25, // kRampLeft = 19;
-    24, // kExitRight = 20;
-    25, // kExitLeft = 21;
-    0,  // kStayStraight = 22;
-    1,  // kStayRight = 23;
-    5,  // kStayLeft = 24;
-    20, // kMerge = 25;
-    10, // kRoundaboutEnter = 26;
-    11, // kRoundaboutExit = 27;
-    17, // kFerryEnter = 28;
-    0   // kFerryExit = 29;
-  ];
-
-  return {
-    id: id,
-    creditline: "<a href='https://mapzen.com/products/turn-by-turn/' target='_blank'>Mapzen</a>",
-    draggable: false,
-
-    getRoute: function (points, callback) {
-      return $.ajax({
-        url: document.location.protocol + OSM.MAPZEN_VALHALLA_URL,
-        data: {
-          api_key: OSM.MAPZEN_VALHALLA_KEY,
-          json: JSON.stringify({
-            locations: points.map(function (p) { return { lat: p.lat, lon: p.lng }; }),
-            costing: costing,
-            directions_options: {
-              units: "km",
-              language: I18n.currentLocale()
-            }
-          })
-        },
-        dataType: "json",
-        success: function (data) {
-          var trip = data.trip;
-
-          if (trip.status === 0) {
-            var line = [];
-            var steps = [];
-            var distance = 0;
-            var time = 0;
-
-            trip.legs.forEach(function (leg) {
-              var legLine = L.PolylineUtil.decode(leg.shape, {
-                precision: 6
-              });
-
-              line = line.concat(legLine);
-
-              leg.maneuvers.forEach(function (manoeuvre) {
-                var point = legLine[manoeuvre.begin_shape_index];
-
-                steps.push([
-                  { lat: point[0], lng: point[1] },
-                  MZ_INSTR_MAP[manoeuvre.type],
-                  manoeuvre.instruction,
-                  manoeuvre.length * 1000,
-                  []
-                ]);
-              });
-
-              distance = distance + leg.summary.length;
-              time = time + leg.summary.time;
-            });
-
-            callback(false, {
-              line: line,
-              steps: steps,
-              distance: distance * 1000,
-              time: time
-            });
-          } else {
-            callback(true);
-          }
-        },
-        error: function () {
-          callback(true);
-        }
-      });
-    }
-  };
-}
-
-if (OSM.MAPZEN_VALHALLA_KEY) {
-  OSM.Directions.addEngine(new MapzenEngine("mapzen_car", "auto"), true);
-  OSM.Directions.addEngine(new MapzenEngine("mapzen_bicycle", "bicycle"), true);
-  OSM.Directions.addEngine(new MapzenEngine("mapzen_foot", "pedestrian"), true);
-}
index 69191e65a6b448516044cf5a9c8280a5a2212788..e7c91e9dc74c1269401824246acea3be22edf587 100644 (file)
@@ -127,7 +127,7 @@ function OSRMEngine() {
         return p.lng + ',' + p.lat;
       }).join(';');
 
-      var req_url = document.location.protocol + OSM.OSRM_URL + encoded_coords;
+      var req_url = OSM.OSRM_URL + encoded_coords;
 
       var onResponse = function (data) {
         if (data.code !== 'Ok')
index 1efac1b31baf6ea1f007a4d6b32da847677a918a..48e950b2137870f88e4aac912781cf3b94d17a70 100644 (file)
@@ -43,7 +43,7 @@ OSM.Export = function(map) {
     $("#maxlat").val(bounds.getNorth().toFixed(precision));
 
     $("#export_overpass").attr("href",
-        "http://overpass-api.de/api/map?bbox=" +
+        "https://overpass-api.de/api/map?bbox=" +
         $("#minlon").val() + "," + $("#minlat").val() + "," +
         $("#maxlon").val() + "," + $("#maxlat").val());
   }
index 7ac613d71ec1737e2d80088ad5f3c0e29d177868..c01caba700cc3f41bbe2ee1387d099c3d9524dc1 100644 (file)
@@ -1,8 +1,7 @@
 //= require jquery.simulate
 
 OSM.Query = function(map) {
-  var protocol = document.location.protocol === "https:" ? "https:" : "http:",
-    url = protocol + OSM.OVERPASS_URL,
+  var url = OSM.OVERPASS_URL,
     queryButton = $(".control-query .control-button"),
     uninterestingTags = ['source', 'source_ref', 'source:ref', 'history', 'attribution', 'created_by', 'tiger:county', 'tiger:tlid', 'tiger:upload_uuid', 'KSJ2:curve_id', 'KSJ2:lat', 'KSJ2:lon', 'KSJ2:coordinate', 'KSJ2:filename', 'note:ja'],
     marker;
index e8df0bd618ebfd1c64dead46e932843a19ca9769..d952a7376f4ea1c140131d512204fa550b2e3ad5 100644 (file)
@@ -14,7 +14,7 @@ L.OSM.Map = L.Map.extend({
     L.Map.prototype.initialize.call(this, id, options);
 
     var copyright = I18n.t('javascripts.map.copyright', {copyright_url: '/copyright'});
-    var donate = I18n.t('javascripts.map.donate_link_text', {donate_url: 'http://donate.openstreetmap.org'});
+    var donate = I18n.t('javascripts.map.donate_link_text', {donate_url: 'https://donate.openstreetmap.org'});
 
     this.baseLayers = [];
 
@@ -27,7 +27,7 @@ L.OSM.Map = L.Map.extend({
 
     if (OSM.THUNDERFOREST_KEY) {
       this.baseLayers.push(new L.OSM.CycleMap({
-        attribution: copyright + ". Tiles courtesy of <a href='http://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
+        attribution: copyright + ". Tiles courtesy of <a href='https://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
         apikey: OSM.THUNDERFOREST_KEY,
         code: "C",
         keyid: "cyclemap",
@@ -35,7 +35,7 @@ L.OSM.Map = L.Map.extend({
       }));
 
       this.baseLayers.push(new L.OSM.TransportMap({
-        attribution: copyright + ". Tiles courtesy of <a href='http://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
+        attribution: copyright + ". Tiles courtesy of <a href='https://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
         apikey: OSM.THUNDERFOREST_KEY,
         code: "T",
         keyid: "transportmap",
@@ -44,7 +44,7 @@ L.OSM.Map = L.Map.extend({
     }
 
     this.baseLayers.push(new L.OSM.HOT({
-      attribution: copyright + ". Tiles courtesy of <a href='http://hot.openstreetmap.org/' target='_blank'>Humanitarian OpenStreetMap Team</a>",
+      attribution: copyright + ". Tiles courtesy of <a href='https://www.hotosm.org/' target='_blank'>Humanitarian OpenStreetMap Team</a>",
       code: "H",
       keyid: "hot",
       name: I18n.t("javascripts.map.base.hot")
index ee1c6a115e427a299e9735c4846c98ea187ccf42..971f80be3354136f7fb90cb260253e5780c968f6 100644 (file)
@@ -14,16 +14,12 @@ OSM = {
   NOMINATIM_URL:           <%= NOMINATIM_URL.to_json %>,
   GRAPHHOPPER_URL:         <%= GRAPHHOPPER_URL.to_json %>,
   MAPQUEST_DIRECTIONS_URL: <%= MAPQUEST_DIRECTIONS_URL.to_json %>,
-  MAPZEN_VALHALLA_URL:     <%= MAPZEN_VALHALLA_URL.to_json %>,
   OSRM_URL:                <%= OSRM_URL.to_json %>,
   DEFAULT_LOCALE:          <%= I18n.default_locale.to_json %>,
 
 <% if defined?(MAPQUEST_KEY) %>
   MAPQUEST_KEY:            <%= MAPQUEST_KEY.to_json %>,
 <% end %>
-<% if defined?(MAPZEN_VALHALLA_KEY) %>
-  MAPZEN_VALHALLA_KEY:     <%= MAPZEN_VALHALLA_KEY.to_json %>,
-<% end %>
 <% if defined?(THUNDERFOREST_KEY) %>
   THUNDERFOREST_KEY:       <%= THUNDERFOREST_KEY.to_json %>,
 <% end %>
index 2f1215b5d4a833106ad4006ca0c55f40b60a03de..6df4c14acaa914b028f05104958d12a290e6611e 100644 (file)
@@ -163,24 +163,24 @@ small, aside {
   overflow: hidden;
 }
 
-.icon.search      { background-position: 0 0; }
-.icon.donate      { background-position: -20px 0; }
-.icon.zoomin      { background-position: -40px 0; }
-.icon.zoomout     { background-position: -60px 0; }
-.icon.geolocate   { background-position: -80px 0; }
-.active .icon.geolocate   { background-position: -80px -20px; }
-.icon.layers      { background-position: -100px 0; }
-.icon.key         { background-position: -120px 0; }
-.icon.share       { background-position: -140px 0; }
-.icon.clipboard   { background-position: -160px 0; }
-.icon.link        { background-position: -180px 0; }
-.icon.close       { background-position: -200px 0; }
+.icon.search      { /* no-r2 */ background-position: 0 0; }
+.icon.donate      { /* no-r2 */ background-position: -20px 0; }
+.icon.zoomin      { /* no-r2 */ background-position: -40px 0; }
+.icon.zoomout     { /* no-r2 */ background-position: -60px 0; }
+.icon.geolocate   { /* no-r2 */ background-position: -80px 0; }
+.active .icon.geolocate   { /* no-r2 */ background-position: -80px -20px; }
+.icon.layers      { /* no-r2 */ background-position: -100px 0; }
+.icon.key         { /* no-r2 */ background-position: -120px 0; }
+.icon.share       { /* no-r2 */ background-position: -140px 0; }
+.icon.clipboard   { /* no-r2 */ background-position: -160px 0; }
+.icon.link        { /* no-r2 */ background-position: -180px 0; }
+.icon.close       { /* no-r2 */ background-position: -200px 0; }
 .close-wrap:hover .icon.close,
-.icon.close:hover { background-position: -200px -20px; }
-.icon.check       { background-position: -220px 0; }
-.icon.note        { background-position: -240px 0; }
-.icon.note.grey   { background-position: -240px -20px; }
-.icon.query       { background-position: -260px 0; }
+.icon.close:hover { /* no-r2 */ background-position: -200px -20px; }
+.icon.check       { /* no-r2 */ background-position: -220px 0; }
+.icon.note        { /* no-r2 */ background-position: -240px 0; }
+.icon.note.grey   { /* no-r2 */ background-position: -240px -20px; }
+.icon.query       { /* no-r2 */ background-position: -260px 0; }
 
 /* Rules for links */
 
@@ -1214,9 +1214,8 @@ tr.turn:hover {
   }
 
   .warning {
-    margin: $lineheight/2 0;
-    padding: $lineheight/2;
-    font-size: 90%;
+    margin: 0 0 $lineheight/2 0;
+    padding: 0 $lineheight/2;
   }
 
   .note-comments li, .changeset-comments li {
index 5181280d9410eff5c9b2eb6fe06a7fefd5b2f98f..9f909ea1089940364388a4a95fb858321d5a4fc4 100644 (file)
@@ -375,7 +375,7 @@ class AmfController < ApplicationController
       else
         begin
           # revert
-          timestamp = Time.strptime(timestamp.to_s, "%d %b %Y, %H:%M:%S")
+          timestamp = Time.zone.strptime(timestamp.to_s, "%d %b %Y, %H:%M:%S")
           old_way = OldWay.where("way_id = ? AND timestamp <= ?", id, timestamp).unredacted.order("timestamp DESC").first
           unless old_way.nil?
             if old_way.visible
@@ -508,14 +508,10 @@ class AmfController < ApplicationController
     rels = []
     if searchterm.to_i > 0
       rel = Relation.where(:id => searchterm.to_i).first
-      if rel && rel.visible
-        rels.push([rel.id, rel.tags, rel.members, rel.version])
-      end
+      rels.push([rel.id, rel.tags, rel.members, rel.version]) if rel && rel.visible
     else
       RelationTag.where("v like ?", "%#{searchterm}%").limit(11).each do |t|
-        if t.relation.visible
-          rels.push([t.relation.id, t.relation.tags, t.relation.members, t.relation.version])
-        end
+        rels.push([t.relation.id, t.relation.tags, t.relation.members, t.relation.version]) if t.relation.visible
       end
     end
     rels
@@ -558,9 +554,7 @@ class AmfController < ApplicationController
             mid = renumberednodes[mid] if m[0] == "Node"
             mid = renumberedways[mid] if m[0] == "Way"
           end
-          if mid
-            typedmembers << [m[0], mid, m[2].delete("\000-\037\ufffe\uffff", "^\011\012\015")]
-          end
+          typedmembers << [m[0], mid, m[2].delete("\000-\037\ufffe\uffff", "^\011\012\015")] if mid
         end
 
         # assign new contents
@@ -748,9 +742,7 @@ class AmfController < ApplicationController
             return [-4, "node", id]
           end
 
-          unless visible || node.ways.empty?
-            return -1, "Point #{id} has since become part of a way, so you cannot save it as a POI.", id, id, version
-          end
+          return -1, "Point #{id} has since become part of a way, so you cannot save it as a POI.", id, id, version unless visible || node.ways.empty?
         end
         # We always need a new node, based on the data that has been sent to us
         new_node = Node.new
@@ -793,9 +785,7 @@ class AmfController < ApplicationController
       n = Node.where(:id => id).first
       if n
         v = n.version
-        unless timestamp == ""
-          n = OldNode.where("node_id = ? AND timestamp <= ?", id, timestamp).unredacted.order("timestamp DESC").first
-        end
+        n = OldNode.where("node_id = ? AND timestamp <= ?", id, timestamp).unredacted.order("timestamp DESC").first unless timestamp == ""
       end
 
       if n
index c6cc3ba5f46cbaf71412b7e414e3f48a0363e2b8..f9b48cb1c5281800d49d5facae8ea0100d94525d 100644 (file)
@@ -157,9 +157,7 @@ class ApiController < ApplicationController
     # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
     nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
 
-    unless nodes_to_fetch.empty?
-      nodes += Node.includes(:node_tags).find(nodes_to_fetch)
-    end
+    nodes += Node.includes(:node_tags).find(nodes_to_fetch) unless nodes_to_fetch.empty?
 
     visible_nodes = {}
     changeset_cache = {}
index db5d086ecbf088c06c7e4f850299329ee8be1068..a24df48e08b0dcc8da6b2d54fb7c078ff3da4172 100644 (file)
@@ -29,9 +29,7 @@ class ApplicationController < ActionController::Base
         end
       end
     elsif session[:token]
-      if self.current_user = User.authenticate(:token => session[:token])
-        session[:user] = current_user.id
-      end
+      session[:user] = current_user.id if self.current_user = User.authenticate(:token => session[:token])
     end
   rescue StandardError => ex
     logger.info("Exception authorizing user: #{ex}")
@@ -381,9 +379,7 @@ class ApplicationController < ActionController::Base
   ##
   # ensure that there is a "this_user" instance variable
   def lookup_this_user
-    unless @this_user = User.active.find_by(:display_name => params[:display_name])
-      render_unknown_user params[:display_name]
-    end
+    render_unknown_user params[:display_name] unless @this_user = User.active.find_by(:display_name => params[:display_name])
   end
 
   ##
@@ -413,8 +409,8 @@ class ApplicationController < ActionController::Base
 
   def map_layout
     append_content_security_policy_directives(
-      :child_src => %w[127.0.0.1:8111 127.0.0.1:8112],
-      :connect_src => %w[nominatim.openstreetmap.org overpass-api.de router.project-osrm.org valhalla.mapzen.com],
+      :child_src => %w[127.0.0.1:8111],
+      :connect_src => %w[nominatim.openstreetmap.org overpass-api.de router.project-osrm.org],
       :form_action => %w[render.openstreetmap.org],
       :script_src => %w[graphhopper.com open.mapquestapi.com],
       :img_src => %w[developer.mapquest.com]
@@ -469,9 +465,7 @@ class ApplicationController < ActionController::Base
       authdata = request.env["HTTP_AUTHORIZATION"].to_s.split
     end
     # only basic authentication supported
-    if authdata && authdata[0] == "Basic"
-      user, pass = Base64.decode64(authdata[1]).split(":", 2)
-    end
+    user, pass = Base64.decode64(authdata[1]).split(":", 2) if authdata && authdata[0] == "Basic"
     [user, pass]
   end
 
index 898afae4a30de945a7d5e338c0b4c93b8c8643b1..f294d23d59026c31b931c04c9f9b97d8bdfb849f 100644 (file)
@@ -7,12 +7,12 @@ class ChangesetController < ApplicationController
   skip_before_action :verify_authenticity_token, :except => [:list]
   before_action :authorize_web, :only => [:list, :feed, :comments_feed]
   before_action :set_locale, :only => [:list, :feed, :comments_feed]
-  before_action :authorize, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
   before_action :require_moderator, :only => [:hide_comment, :unhide_comment]
-  before_action :require_allow_write_api, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe]
-  before_action :check_api_writable, :only => [:create, :update, :delete, :upload, :include, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
+  before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe]
+  before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
   before_action(:only => [:list, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
   around_action :api_call_handle_error, :except => [:list, :feed, :comments_feed]
   around_action :api_call_timeout, :except => [:list, :feed, :comments_feed, :upload]
@@ -216,6 +216,12 @@ class ChangesetController < ApplicationController
     changesets = conditions_closed(changesets, params["closed"])
     changesets = conditions_ids(changesets, params["changesets"])
 
+    # sort and limit the changesets
+    changesets = changesets.order("created_at DESC").limit(100)
+
+    # preload users, tags and comments
+    changesets = changesets.preload(:user, :changeset_tags, :comments)
+
     # create the results document
     results = OSM::API.new.get_xml_doc
 
@@ -290,9 +296,7 @@ class ChangesetController < ApplicationController
         changesets = changesets.where(:user_id => current_user.nearby)
       end
 
-      if @params[:max_id]
-        changesets = changesets.where("changesets.id <= ?", @params[:max_id])
-      end
+      changesets = changesets.where("changesets.id <= ?", @params[:max_id]) if @params[:max_id]
 
       @edits = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
 
@@ -328,9 +332,7 @@ class ChangesetController < ApplicationController
 
     # Notify current subscribers of the new comment
     changeset.subscribers.visible.each do |user|
-      if current_user != user
-        Notifier.changeset_comment_notification(comment, user).deliver_now
-      end
+      Notifier.changeset_comment_notification(comment, user).deliver_now if current_user != user
     end
 
     # Add the commenter to the subscribers if necessary
index 9e0fd4991bd4f62b6ec60e295efc44cf69aa6b49..6eb662bd843ec44370700a264b8c8c54eb229ec7 100644 (file)
@@ -65,9 +65,7 @@ class DiaryEntryController < ApplicationController
 
       # Notify current subscribers of the new comment
       @entry.subscribers.visible.each do |user|
-        if current_user != user
-          Notifier.diary_comment_notification(@diary_comment, user).deliver_now
-        end
+        Notifier.diary_comment_notification(@diary_comment, user).deliver_now if current_user != user
       end
 
       # Add the commenter to the subscribers if necessary
index 5d7ba918938541468504bd08342f1a5d6f21b36b..e9fa7f26af847ca7e61b27710ff4e787f83ea359 100644 (file)
@@ -87,7 +87,7 @@ class GeocoderController < ApplicationController
     @results = []
 
     # ask geocoder.ca (note - they have a per-day limit)
-    response = fetch_xml("http://geocoder.ca/?geoit=XML&postal=#{escape_query(query)}")
+    response = fetch_xml("https://geocoder.ca/?geoit=XML&postal=#{escape_query(query)}")
 
     # parse the response
     if response.get_elements("geodata/error").empty?
@@ -112,15 +112,13 @@ class GeocoderController < ApplicationController
     maxlat = params[:maxlat]
 
     # get view box
-    if minlon && minlat && maxlon && maxlat
-      viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}"
-    end
+    viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}" if minlon && minlat && maxlon && maxlat
 
     # get objects to excude
     exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude]
 
     # ask nominatim
-    response = fetch_xml("http:#{NOMINATIM_URL}search?format=xml&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
+    response = fetch_xml("#{NOMINATIM_URL}search?format=xml&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
 
     # extract the results from the response
     results =  response.elements["searchresults"]
@@ -153,9 +151,7 @@ class GeocoderController < ApplicationController
         rank = (place.attributes["place_rank"].to_i + 1) / 2
         prefix_name = t "geocoder.search_osm_nominatim.admin_levels.level#{rank}", :default => prefix_name
         place.elements["extratags"].elements.each("tag") do |extratag|
-          if extratag.attributes["key"] == "place"
-            prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name
-          end
+          prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name if extratag.attributes["key"] == "place"
         end
       end
       prefix = t "geocoder.search_osm_nominatim.prefix_format", :name => prefix_name
@@ -217,7 +213,7 @@ class GeocoderController < ApplicationController
     @results = []
 
     # ask nominatim
-    response = fetch_xml("http:#{NOMINATIM_URL}reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
+    response = fetch_xml("#{NOMINATIM_URL}reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
 
     # parse the response
     response.elements.each("reversegeocode/result") do |result|
index 29651bceb5dc5d13e97260904ccdef3f9f8b31be..20baf6bb4d0285575e8faa14d92ce08fc23e4bd8 100644 (file)
@@ -40,9 +40,7 @@ class NodeController < ApplicationController
     node = Node.find(params[:id])
     new_node = Node.from_xml(request.raw_post)
 
-    unless new_node && new_node.id == node.id
-      raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})"
-    end
+    raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})" unless new_node && new_node.id == node.id
 
     node.update_from(new_node, current_user)
     render :plain => node.version.to_s
@@ -55,24 +53,18 @@ class NodeController < ApplicationController
     node = Node.find(params[:id])
     new_node = Node.from_xml(request.raw_post)
 
-    unless new_node && new_node.id == node.id
-      raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})"
-    end
+    raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})" unless new_node && new_node.id == node.id
     node.delete_with_history!(new_node, current_user)
     render :plain => node.version.to_s
   end
 
   # Dump the details on many nodes whose ids are given in the "nodes" parameter.
   def nodes
-    unless params["nodes"]
-      raise OSM::APIBadUserInput, "The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]"
-    end
+    raise OSM::APIBadUserInput, "The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]" unless params["nodes"]
 
     ids = params["nodes"].split(",").collect(&:to_i)
 
-    if ids.empty?
-      raise OSM::APIBadUserInput, "No nodes were given to search for"
-    end
+    raise OSM::APIBadUserInput, "No nodes were given to search for" if ids.empty?
     doc = OSM::API.new.get_xml_doc
 
     Node.find(ids).each do |node|
index 92f63e304f76c539b009cdbbfff4d593e8236447..a51d70f9030300056b73f5e532ed73523524211f 100644 (file)
@@ -350,9 +350,7 @@ class NotesController < ApplicationController
     comment = note.comments.create!(attributes)
 
     note.comments.map(&:author).uniq.each do |user|
-      if notify && user && user != current_user && user.visible?
-        Notifier.note_comment_notification(comment, user).deliver_now
-      end
+      Notifier.note_comment_notification(comment, user).deliver_now if notify && user && user != current_user && user.visible?
     end
   end
 end
index 734783a35eef61f4df429abfee6b1aa2fd9facf8..84bbcf1850e5c95cf6d6d925c0c009b3f7e83315 100644 (file)
@@ -63,9 +63,7 @@ class OauthController < ApplicationController
                                     "&oauth_token=#{@token.token}"
                                 end
 
-          unless @token.oauth10?
-            @redirect_url.query += "&oauth_verifier=#{@token.verifier}"
-          end
+          @redirect_url.query += "&oauth_verifier=#{@token.verifier}" unless @token.oauth10?
 
           redirect_to @redirect_url.to_s
         end
index 25532a95c72c0dc965f0ddeb1757099a7755773f..059fb8d7e5bc32a7dca26128a705b800c4b0c16d 100644 (file)
@@ -35,9 +35,7 @@ class RelationController < ApplicationController
     relation = Relation.find(params[:id])
     new_relation = Relation.from_xml(request.raw_post)
 
-    unless new_relation && new_relation.id == relation.id
-      raise OSM::APIBadUserInput, "The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})"
-    end
+    raise OSM::APIBadUserInput, "The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})" unless new_relation && new_relation.id == relation.id
 
     relation.update_from new_relation, current_user
     render :plain => relation.version.to_s
@@ -123,15 +121,11 @@ class RelationController < ApplicationController
   end
 
   def relations
-    unless params["relations"]
-      raise OSM::APIBadUserInput, "The parameter relations is required, and must be of the form relations=id[,id[,id...]]"
-    end
+    raise OSM::APIBadUserInput, "The parameter relations is required, and must be of the form relations=id[,id[,id...]]" unless params["relations"]
 
     ids = params["relations"].split(",").collect(&:to_i)
 
-    if ids.empty?
-      raise OSM::APIBadUserInput, "No relations were given to search for"
-    end
+    raise OSM::APIBadUserInput, "No relations were given to search for" if ids.empty?
 
     doc = OSM::API.new.get_xml_doc
 
index 74dbc41f553c2a652661b762f68190dc1a92bc7c..fa8ec5a1ee0478036750be78dec10150fd391d0e 100644 (file)
@@ -11,9 +11,7 @@ class SiteController < ApplicationController
   before_action :update_totp, :only => [:index]
 
   def index
-    unless STATUS == :database_readonly || STATUS == :database_offline
-      session[:location] ||= OSM.ip_location(request.env["REMOTE_ADDR"])
-    end
+    session[:location] ||= OSM.ip_location(request.env["REMOTE_ADDR"]) unless STATUS == :database_readonly || STATUS == :database_offline
   end
 
   def permalink
@@ -147,9 +145,7 @@ class SiteController < ApplicationController
   def redirect_map_params
     anchor = []
 
-    if params[:lat] && params[:lon]
-      anchor << "map=#{params.delete(:zoom) || 5}/#{params.delete(:lat)}/#{params.delete(:lon)}"
-    end
+    anchor << "map=#{params.delete(:zoom) || 5}/#{params.delete(:lat)}/#{params.delete(:lon)}" if params[:lat] && params[:lon]
 
     if params[:layers]
       anchor << "layers=#{params.delete(:layers)}"
@@ -157,8 +153,6 @@ class SiteController < ApplicationController
       anchor << "layers=N"
     end
 
-    if anchor.present?
-      redirect_to params.to_unsafe_h.merge(:anchor => anchor.join("&"))
-    end
+    redirect_to params.to_unsafe_h.merge(:anchor => anchor.join("&")) if anchor.present?
   end
 end
index 105405ccfdad7e0fd11b525443a4786ed496f307..a720c5fff438dc1ed4e8d9152e85dacf44ed4cc1 100644 (file)
@@ -119,9 +119,7 @@ class TraceController < ApplicationController
         if @trace.id
           flash[:notice] = t "trace.create.trace_uploaded"
 
-          if current_user.traces.where(:inserted => false).count > 4
-            flash[:warning] = t "trace.trace_header.traces_waiting", :count => current_user.traces.where(:inserted => false).count
-          end
+          flash[:warning] = t "trace.trace_header.traces_waiting", :count => current_user.traces.where(:inserted => false).count if current_user.traces.where(:inserted => false).count > 4
 
           redirect_to :action => :list, :display_name => current_user.display_name
         end
@@ -176,9 +174,7 @@ class TraceController < ApplicationController
         @trace.description = params[:trace][:description]
         @trace.tagstring = params[:trace][:tagstring]
         @trace.visibility = params[:trace][:visibility]
-        if @trace.save
-          redirect_to :action => "view", :display_name => current_user.display_name
-        end
+        redirect_to :action => "view", :display_name => current_user.display_name if @trace.save
       end
     end
   rescue ActiveRecord::RecordNotFound
@@ -205,9 +201,7 @@ class TraceController < ApplicationController
   def georss
     @traces = Trace.visible_to_all.visible
 
-    if params[:display_name]
-      @traces = @traces.joins(:user).where(:users => { :display_name => params[:display_name] })
-    end
+    @traces = @traces.joins(:user).where(:users => { :display_name => params[:display_name] }) if params[:display_name]
 
     @traces = @traces.tagged(params[:tag]) if params[:tag]
     @traces = @traces.order("timestamp DESC")
index 5c41a79dc84da7f336d7ed0152094571c0e0fe8a..0c3ad0b05e31444fee19e1aa82318525da740b34 100644 (file)
@@ -45,9 +45,7 @@ class UserController < ApplicationController
       if current_user
         current_user.terms_seen = true
 
-        if current_user.save
-          flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe
-        end
+        flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe if current_user.save
 
         if params[:referer]
           redirect_to params[:referer]
@@ -533,9 +531,7 @@ class UserController < ApplicationController
       session[:new_user].auth_provider = provider
       session[:new_user].auth_uid = uid
 
-      if email_verified && email == session[:new_user].email
-        session[:new_user].status = "active"
-      end
+      session[:new_user].status = "active" if email_verified && email == session[:new_user].email
 
       redirect_to :action => "terms"
     else
index 536790dc5b36f9e924b971d3cd9c66ed46248558..5ef68216bf81e8cc26a53845bf138110edbc1a10 100644 (file)
@@ -15,7 +15,12 @@ class UserRolesController < ApplicationController
   end
 
   def revoke
-    UserRole.where(:user_id => @this_user.id, :role => @role).delete_all
+    # checks that administrator role is not revoked from current user
+    if current_user == @this_user && @role == "administrator"
+      flash[:error] = t("user_role.filter.not_revoke_admin_current_user")
+    else
+      UserRole.where(:user_id => @this_user.id, :role => @role).delete_all
+    end
     redirect_to :controller => "user", :action => "view", :display_name => @this_user.display_name
   end
 
index a330eb5f97d47a19d98d874d3681384219e82d54..adcf5c6c011ec6fdcc31821b2c0af3b74065c083 100644 (file)
@@ -40,9 +40,7 @@ module ApplicationHelper
   end
 
   def if_user(user, tag = :div, &block)
-    if user
-      content_tag(tag, capture(&block), :class => "hidden show_if_user_#{user.id}")
-    end
+    content_tag(tag, capture(&block), :class => "hidden show_if_user_#{user.id}") if user
   end
 
   def unless_user(user, tag = :div, &block)
@@ -110,9 +108,7 @@ module ApplicationHelper
     if current_user
       data[:user] = current_user.id.to_json
 
-      unless current_user.home_lon.nil? || current_user.home_lat.nil?
-        data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon }
-      end
+      data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } unless current_user.home_lon.nil? || current_user.home_lat.nil?
     end
 
     data[:location] = session[:location] if session[:location]
index c4ce41b064df9550fb0113ec9b628a4120f74189..b90e27f8545b6995fdb0631e7329946b40f6bd27 100644 (file)
@@ -8,18 +8,14 @@ module BrowseHelper
            object.id
          end
     name = t "printable_name.with_id", :id => id.to_s
-    if version
-      name = t "printable_name.with_version", :id => name, :version => object.version.to_s
-    end
+    name = t "printable_name.with_version", :id => name, :version => object.version.to_s if version
 
     # don't look at object tags if redacted, so as to avoid giving
     # away redacted version tag information.
     unless object.redacted?
       locale = I18n.locale.to_s
 
-      while locale =~ /-[^-]+/ && !object.tags.include?("name:#{I18n.locale}")
-        locale = locale.sub(/-[^-]+/, "")
-      end
+      locale = locale.sub(/-[^-]+/, "") while locale =~ /-[^-]+/ && !object.tags.include?("name:#{I18n.locale}")
 
       if object.tags.include? "name:#{locale}"
         name = t "printable_name.with_name_html", :name => content_tag(:bdi, object.tags["name:#{locale}"].to_s), :id => content_tag(:bdi, name)
@@ -115,9 +111,9 @@ module BrowseHelper
     lookup_us = lookup.tr(" ", "_")
 
     if page = WIKI_PAGES.dig(locale, type, lookup_us)
-      url = "http://wiki.openstreetmap.org/wiki/#{page}?uselang=#{locale}"
+      url = "https://wiki.openstreetmap.org/wiki/#{page}?uselang=#{locale}"
     elsif page = WIKI_PAGES.dig("en", type, lookup_us)
-      url = "http://wiki.openstreetmap.org/wiki/#{page}?uselang=#{locale}"
+      url = "https://wiki.openstreetmap.org/wiki/#{page}?uselang=#{locale}"
     end
 
     url
@@ -158,7 +154,7 @@ module BrowseHelper
     end
 
     {
-      :url => "http://#{lang}.wikipedia.org/wiki/#{value}?uselang=#{I18n.locale}#{encoded_section}",
+      :url => "https://#{lang}.wikipedia.org/wiki/#{value}?uselang=#{I18n.locale}#{encoded_section}",
       :title => value + section
     }
   end
index 37d26e0a7bf82e1bb911382c82d9be174fa29e47..2ec26ecee2d7612ba0ee5a277c592ffc99a940ee 100644 (file)
@@ -238,7 +238,7 @@ class Changeset < ActiveRecord::Base
 
     bbox.to_unscaled.add_bounds_to(el1, "_") if bbox.complete?
 
-    el1["comments_count"] = comments.count.to_s
+    el1["comments_count"] = comments.length.to_s
 
     if include_discussion
       el2 = XML::Node.new("discussion")
index 67b86417a3a6a069a23d45e5e059c7b4aa415b87..c95ffc322ce722bba0ce9f44293c4b0b1cc1c5fd 100644 (file)
@@ -68,7 +68,7 @@ class ClientApplication < ActiveRecord::Base
   end
 
   def oauth_server
-    @oauth_server ||= OAuth::Server.new("http://" + SERVER_URL)
+    @oauth_server ||= OAuth::Server.new("https://" + SERVER_URL)
   end
 
   def credentials
index 157794cd69cee7424771a248b0331b569f6d32d8..2495830eefaa36972f8921bf1fd8e88cac427879 100644 (file)
@@ -182,9 +182,7 @@ class Relation < ActiveRecord::Base
   end
 
   def delete_with_history!(new_relation, user)
-    unless visible
-      raise OSM::APIAlreadyDeletedError.new("relation", new_relation.id)
-    end
+    raise OSM::APIAlreadyDeletedError.new("relation", new_relation.id) unless visible
 
     # need to start the transaction here, so that the database can
     # provide repeatable reads for the used-by checks. this means it
@@ -208,9 +206,7 @@ class Relation < ActiveRecord::Base
     Relation.transaction do
       lock!
       check_consistency(self, new_relation, user)
-      unless new_relation.preconditions_ok?(members)
-        raise OSM::APIPreconditionFailedError, "Cannot update relation #{id}: data or member data is invalid."
-      end
+      raise OSM::APIPreconditionFailedError, "Cannot update relation #{id}: data or member data is invalid." unless new_relation.preconditions_ok?(members)
       self.changeset_id = new_relation.changeset_id
       self.changeset = new_relation.changeset
       self.tags = new_relation.tags
@@ -222,9 +218,7 @@ class Relation < ActiveRecord::Base
 
   def create_with_history(user)
     check_create_consistency(self, user)
-    unless preconditions_ok?
-      raise OSM::APIPreconditionFailedError, "Cannot create relation: data or member data is invalid."
-    end
+    raise OSM::APIPreconditionFailedError, "Cannot create relation: data or member data is invalid." unless preconditions_ok?
     self.version = 0
     self.visible = true
     save_with_history!
@@ -259,9 +253,7 @@ class Relation < ActiveRecord::Base
       element = model.lock("for share").find_by(:id => m[1])
 
       # and check that it is OK to use.
-      unless element && element.visible? && element.preconditions_ok?
-        raise OSM::APIPreconditionFailedError, "Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}"
-      end
+      raise OSM::APIPreconditionFailedError, "Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}" unless element && element.visible? && element.preconditions_ok?
       hash[m[1]] = true
     end
 
index 7a8414ec073c177940ad9601511467d7d89c96e2..9eeb98290360d58cda7c759ec7b8dc37e6fb754e 100644 (file)
@@ -277,9 +277,7 @@ class User < ActiveRecord::Base
   ##
   # perform a spam check on a user
   def spam_check
-    if status == "active" && spam_score > SPAM_THRESHOLD
-      update(:status => "suspended")
-    end
+    update(:status => "suspended") if status == "active" && spam_score > SPAM_THRESHOLD
   end
 
   ##
index 1954f744ca9332d1c45c7bd133e27f9b7b24bed2..e5b73ceaaab009db0ef5855ec38c4f108d6dbce4 100644 (file)
@@ -120,14 +120,10 @@ class Way < ActiveRecord::Base
     way_nodes.each do |nd|
       if visible_nodes
         # if there is a list of visible nodes then use that to weed out deleted nodes
-        if visible_nodes[nd.node_id]
-          ordered_nodes[nd.sequence_id] = nd.node_id.to_s
-        end
+        ordered_nodes[nd.sequence_id] = nd.node_id.to_s if visible_nodes[nd.node_id]
       else
         # otherwise, manually go to the db to check things
-        if nd.node && nd.node.visible?
-          ordered_nodes[nd.sequence_id] = nd.node_id.to_s
-        end
+        ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node && nd.node.visible?
       end
     end
 
@@ -184,9 +180,7 @@ class Way < ActiveRecord::Base
     Way.transaction do
       lock!
       check_consistency(self, new_way, user)
-      unless new_way.preconditions_ok?(nds)
-        raise OSM::APIPreconditionFailedError, "Cannot update way #{id}: data is invalid."
-      end
+      raise OSM::APIPreconditionFailedError, "Cannot update way #{id}: data is invalid." unless new_way.preconditions_ok?(nds)
 
       self.changeset_id = new_way.changeset_id
       self.changeset = new_way.changeset
@@ -199,9 +193,7 @@ class Way < ActiveRecord::Base
 
   def create_with_history(user)
     check_create_consistency(self, user)
-    unless preconditions_ok?
-      raise OSM::APIPreconditionFailedError, "Cannot create way: data is invalid."
-    end
+    raise OSM::APIPreconditionFailedError, "Cannot create way: data is invalid." unless preconditions_ok?
     self.version = 0
     self.visible = true
     save_with_history!
@@ -209,9 +201,7 @@ class Way < ActiveRecord::Base
 
   def preconditions_ok?(old_nodes = [])
     return false if nds.empty?
-    if nds.length > MAX_NUMBER_OF_WAY_NODES
-      raise OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES)
-    end
+    raise OSM::APITooManyWayNodesError.new(id, nds.length, MAX_NUMBER_OF_WAY_NODES) if nds.length > MAX_NUMBER_OF_WAY_NODES
 
     # check only the new nodes, for efficiency - old nodes having been checked last time and can't
     # be deleted when they're in-use.
index 86d190680c4a5bb29ba27667c658e273ab2fd724..6a3e856802c2b4c3d4c7bde5090d96e0a17a585b 100644 (file)
         <input type="submit" name="comment" value="<%= t('javascripts.changesets.show.comment') %>" data-changeset-id="<%= @changeset.id %>" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled="1"/>
       </div>
     </form>
+  <% else %>
+    <div class="notice hide_unless_logged_in">
+    <%= t('browse.changeset.still_open') %>
+    </div>
   <% end %>
 
   <% unless @ways.empty? %>
index 49922494e25906b6526e8299a44f3f8dbac37afd..f6518daf204b2d5acc8b97c0bfe1332aa02ca930 100644 (file)
@@ -10,7 +10,7 @@
   <form action="#">
     <input type="hidden" name="lon">
     <input type="hidden" name="lat">
-    <textarea class="comment" name="text" cols="40" rows="10"></textarea>
+    <textarea class="comment" name="text" cols="40" rows="10" placeholder="<%= t('javascripts.notes.new.advice') %>"></textarea>
     <div class="buttons clearfix">
       <input type="submit" name="add" value="<%= t('javascripts.notes.new.add') %>" disabled="1">
     </div>
index a3b7a224091f66ab9b18f971e6795be211e0a5c9..86dd966ccc8aba18fcb3b35ed3a7d5ae14e432db 100644 (file)
@@ -9,7 +9,7 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
   feed.logo image_url("mag_map-rss2.0.png")
 
   feed.rights :type => "xhtml" do |xhtml|
-    xhtml.a :href => "http://creativecommons.org/licenses/by-sa/2.0/" do |a|
+    xhtml.a :href => "https://creativecommons.org/licenses/by-sa/2.0/" do |a|
       a.img :src => image_url("cc_button.png"), :alt => "CC by-sa 2.0"
     end
   end
index 9bed9d274ee8ab560c53d040353871bef793f1a9..534ff13c019117aedb8a9e1c76e769247d25ba75 100644 (file)
@@ -44,9 +44,9 @@
         <div class="close-wrap"><span class="icon close"></span></div>
         <p><%= t 'layouts.intro_text' %></p>
         <p><%= t 'layouts.partners_html',
-               :ucl => link_to(t('layouts.partners_ucl'), "http://www.ucl.ac.uk"),
-               :ic => link_to(t('layouts.partners_ic'), "http://www.imperial.ac.uk/"),
-               :bytemark => link_to(t('layouts.partners_bytemark'), "http://www.bytemark.co.uk"),
+               :ucl => link_to(t('layouts.partners_ucl'), "https://www.ucl.ac.uk"),
+               :ic => link_to(t('layouts.partners_ic'), "https://www.imperial.ac.uk/"),
+               :bytemark => link_to(t('layouts.partners_bytemark'), "https://www.bytemark.co.uk"),
                :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %>
         </p>
         <a class="button learn-more" href="<%= about_path %>"><%= t('layouts.learn_more') %></a>
index 80dbc6079afd400d6999e077b7ad4b66a373dd76..f88d9316cd7e77cf88de2a34121f28a8d3184dd9 100644 (file)
@@ -24,7 +24,7 @@
 <% end %>
 <h3><%= t'oauth_clients.index.my_apps' %></h3>
 <% if @client_applications.empty? %>
-<p><%= raw(t('oauth_clients.index.no_apps', :oauth => "<a href=\"http://oauth.net\">OAuth</a>")) %></p>
+<p><%= raw(t('oauth_clients.index.no_apps', :oauth => "<a href=\"https://oauth.net\">OAuth</a>")) %></p>
 <% else %>
 <p><%= t'oauth_clients.index.registered_apps' %></p>
 <% @client_applications.each do |client|%>
@@ -33,4 +33,4 @@
   <% end %>
 <% end %>
 <% end %>
-<h3><%= link_to t('oauth_clients.index.register_new'), :action => :new %></h3>
\ No newline at end of file
+<h3><%= link_to t('oauth_clients.index.register_new'), :action => :new %></h3>
index ebc1877f3b5427b3b14f7dc29ea5df9ffa3da1be..0c8075c6ef2261ad564ea40ff2454c77086e0d97 100644 (file)
@@ -33,9 +33,9 @@
   <div class='section' id='partners'>
     <h2><div class='icon partners'></div><%= t "about_page.partners_title" %></h2>
     <p><%= t 'layouts.partners_html',
-             :ucl => link_to(t('layouts.partners_ucl'), "http://www.ucl.ac.uk"),
-             :ic => link_to(t('layouts.partners_ic'), "http://www.imperial.ac.uk/"),
-             :bytemark => link_to(t('layouts.partners_bytemark'), "http://www.bytemark.co.uk"),
+             :ucl => link_to(t('layouts.partners_ucl'), "https://www.ucl.ac.uk"),
+             :ic => link_to(t('layouts.partners_ic'), "https://www.imperial.ac.uk/"),
+             :bytemark => link_to(t('layouts.partners_bytemark'), "https://www.bytemark.co.uk"),
              :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %>
     </p>
   </div>
index 128db59928e8c1ae67af6dbf387fa840d4b0f5ad..bf5376fb55bd1be2e10c321ba756492c6b63f6ea 100644 (file)
   </div>
 
   <dl class="inner12">  
-    <dt><a id="export_overpass" href="http://overpass-api.de/api/map?bbox="><%= t'export.start.too_large.overpass.title' %></a></dt>
+    <dt><a id="export_overpass" href="https://overpass-api.de/api/map?bbox="><%= t'export.start.too_large.overpass.title' %></a></dt>
     <dd><%= t'export.start.too_large.overpass.description' %></dd>
     
-    <dt><a href="http://planet.openstreetmap.org/"><%= t'export.start.too_large.planet.title' %></a></dt>
+    <dt><a href="https://planet.openstreetmap.org/"><%= t'export.start.too_large.planet.title' %></a></dt>
     <dd><%= t'export.start.too_large.planet.description' %></dd>
 
-    <dt><a href="http://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt>
+    <dt><a href="https://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt>
     <dd><%= t'export.start.too_large.geofabrik.description' %></dd>
 
-    <dt><a href="https://mapzen.com/data/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt>
-    <dd><%= t'export.start.too_large.metro.description' %></dd>
-
-    <dt><a href="http://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt>
+    <dt><a href="https://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt>
     <dd><%= t'export.start.too_large.other.description' %></dd>
   </dl>
 <% end %>
index 0e8bfa5eff34f1e5358fb75ceab8c6e36cf16558..fe5af4bcf6cfa547c108fec36eb9270a4cdfe0a4 100644 (file)
@@ -10,9 +10,7 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
     else
       xml.tag! "contributor-terms", :agreed => @this_user.terms_agreed.present?
     end
-    if @this_user.image.file? || @this_user.image_use_gravatar
-      xml.tag! "img", :href => user_image_url(@this_user, :size => 256)
-    end
+    xml.tag! "img", :href => user_image_url(@this_user, :size => 256) if @this_user.image.file? || @this_user.image_use_gravatar
     xml.tag! "roles" do
       @this_user.roles.each do |role|
         xml.tag! role.role
index 3d8cb22f72c19555b27bac45ed4ff1e07f4a825e..13fad884044d38cec4cab729452f221e6f28d459 100644 (file)
@@ -46,8 +46,8 @@
     <div class="deemphasize">
       <p id="contributorGuidance">
         <%= raw t 'user.terms.guidance',
-                  :summary => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary',
-                  :translations => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms/Informal_Translations' %>
+                  :summary => 'https://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary',
+                  :translations => 'https://www.osmfoundation.org/wiki/License/Contributor_Terms/Informal_Translations' %>
       </p>
     </div>
   </div>
index 02dd1d2b296867520fcdc7c0f521d2c1e025ab1a..9ba122dafb8b1518af4930f92ceec945befff7ec 100644 (file)
@@ -34,9 +34,7 @@ module OpenStreetMap
     config.paths["app/models"].skip_eager_load! if STATUS == :database_offline
 
     # Use memcached for caching if required
-    if defined?(MEMCACHE_SERVERS)
-      config.cache_store = :mem_cache_store, MEMCACHE_SERVERS, { :namespace => "rails:cache" }
-    end
+    config.cache_store = :mem_cache_store, MEMCACHE_SERVERS, { :namespace => "rails:cache" } if defined?(MEMCACHE_SERVERS)
 
     # Use logstash for logging if required
     if defined?(LOGSTASH_PATH)
index ce53c3f02df3dc4cd17ae729b55e05fa64c67a8a..8cc7be5f09b961a0db58f1d91dc636171b242d66 100644 (file)
@@ -1,18 +1,12 @@
-sotmasia2017:
-  id: sotmasia2017
-  alt: State of the Map Asia 2017
-  link: http://stateofthemap.asia/
-  img: banners/sotmasia-2017-banner.png
-  enddate: 2017-sep-25
-sotmus2017:
-  id: sotmus2017
-  alt: State of the Map US 2017
-  link: https://2017.stateofthemap.us/
-  img: banners/banner-sotmus2017.png
-  enddate: 2017-oct-20
-osmfmembership2017:
-  id: osmfmembership2017
-  alt: Join the OpenStreetMap Foundation
-  link: https://blog.openstreetmap.org/2017/09/25/join-the-openstreetmap-foundation-now-and-help-shape-the-future-of-the-project/
-  img: banners/osmf-membership-drive-2017.png
-  enddate: 2017-nov-11
+fossgis2018:
+  id: fossgis2018
+  alt: FOSSGIS Conference 2018
+  link: https://fossgis-konferenz.de/2018/
+  img: banners/fossgis2018.png
+  enddate: 2018-mar-24
+osmit2018:
+  id: osmit2018
+  alt: FOSS4G-IT 2018
+  link: http://foss4g-it2018.gfoss.it/
+  img: banners/foss4g-it2018-banner.png
+  enddate: 2018-feb-22
index 8e7213a9d35dd080ffe4d2798db9d0c7a879afce..97226480c6dfdf1bb688ea94ce59ac1a7b6f127c 100644 (file)
@@ -35,9 +35,7 @@ Rails.application.configure do
   config.active_support.deprecation = :log
 
   # Raise an error on page load if there are pending migrations.
-  unless STATUS == :database_offline
-    config.active_record.migration_error = :page_load
-  end
+  config.active_record.migration_error = :page_load unless STATUS == :database_offline
 
   # Debug mode disables concatenation and preprocessing of assets.
   # This option may cause significant delays in view rendering with a large
index c4c98ad48fc3de6a72bbbf830fac696e998cc5a8..56bd2288109d56ce6bf6fcebf2cfa7f1152b266c 100644 (file)
@@ -93,9 +93,7 @@ Rails.application.configure do
   end
 
   # Do not dump schema after migrations.
-  unless STATUS == :database_offline
-    config.active_record.dump_schema_after_migration = false
-  end
+  config.active_record.dump_schema_after_migration = false unless STATUS == :database_offline
 
   # Enable autoloading of dependencies.
   config.enable_dependency_loading = true
index 5c60ccd16b4f9e6042896f5e222822c7df3a2349..1e78084cc0300c9a5976227158cc09c4a2717a5d 100644 (file)
@@ -74,7 +74,7 @@ defaults: &defaults
   # Enable legacy OAuth 1.0 support
   oauth_10_support: true
   # URL of Nominatim instance to use for geocoding
-  nominatim_url: "//nominatim.openstreetmap.org/"
+  nominatim_url: "https://nominatim.openstreetmap.org/"
   # Default editor
   default_editor: "id"
   # OAuth consumer key for Potlatch 2
@@ -97,12 +97,11 @@ defaults: &defaults
     # Blacklist here
     - ".*\\.here\\.com[/:].*"
   # URL of Overpass instance to use for feature queries
-  overpass_url: "//overpass-api.de/api/interpreter"
+  overpass_url: "https://overpass-api.de/api/interpreter"
   # Routing endpoints
-  graphhopper_url: "//graphhopper.com/api/1/route"
-  mapquest_directions_url: "//open.mapquestapi.com/directions/v2/route"
-  mapzen_valhalla_url: "//valhalla.mapzen.com/route"
-  osrm_url: "//router.project-osrm.org/route/v1/driving/"
+  graphhopper_url: "https://graphhopper.com/api/1/route"
+  mapquest_directions_url: "https://open.mapquestapi.com/directions/v2/route"
+  osrm_url: "https://router.project-osrm.org/route/v1/driving/"
   # External authentication credentials
   #google_auth_id: ""
   #google_auth_secret: ""
@@ -117,8 +116,6 @@ defaults: &defaults
   #wikipedia_auth_secret: ""
   # MapQuest authentication details
   #mapquest_key: ""
-  # Mapzen authentication details
-  #mapzen_valhalla_key: ""
   # Thunderforest authentication details
   #thunderforest_key: ""
   # Key for generating TOTP tokens
index 29ee6d8388227d8c63b56193974cc9ecd3f15ec2..9100cd7f51eb65b498577985e191db09612e936b 100644 (file)
@@ -1,12 +1,4 @@
 skip_missing_workers: true
 pngout: false
-pngcrush: false
-advpng: false
-optipng: false
-pngquant: false
-jhead: false
-jpegoptim: false
-gifsicle: false
-jpegtran: false
 svgo:
   disable_plugins: ["cleanupIDs", "removeUnknownsAndDefaults"]
diff --git a/config/initializers/compressed_requests.rb b/config/initializers/compressed_requests.rb
new file mode 100644 (file)
index 0000000..c6a84a1
--- /dev/null
@@ -0,0 +1,42 @@
+module OpenStreetMap
+  class CompressedRequests
+    def initialize(app)
+      @app = app
+    end
+
+    def method_handled?(env)
+      %w[POST PUT].include? env["REQUEST_METHOD"]
+    end
+
+    def encoding_handled?(env)
+      %w[gzip deflate].include? env["HTTP_CONTENT_ENCODING"]
+    end
+
+    def call(env)
+      if method_handled?(env) && encoding_handled?(env)
+        extracted = decode(env["rack.input"], env["HTTP_CONTENT_ENCODING"])
+
+        env.delete("HTTP_CONTENT_ENCODING")
+        env["CONTENT_LENGTH"] = extracted.bytesize
+        env["rack.input"] = StringIO.new(extracted)
+      end
+
+      if env["HTTP_CONTENT_ENCODING"]
+        [415, {}, []]
+      else
+        @app.call(env)
+      end
+    end
+
+    def decode(input, content_encoding)
+      input.rewind
+
+      case content_encoding
+      when "gzip" then Zlib::GzipReader.new(input).read
+      when "deflate" then Zlib::Inflate.inflate(input.read)
+      end
+    end
+  end
+end
+
+Rails.configuration.middleware.use OpenStreetMap::CompressedRequests
index 320c1db2c4eba6dfb9a04ba1d3859992d66865e0..2bd558d2f3f24ec4f4f9884cb9b1cf4c815505dc 100644 (file)
@@ -7,9 +7,7 @@ module OpenStreetMap
   class Cors < Rack::Cors
     def call(env)
       status, headers, body = super env
-      if headers["Access-Control-Allow-Origin"]
-        headers["Cache-Control"] = "no-cache"
-      end
+      headers["Cache-Control"] = "no-cache" if headers["Access-Control-Allow-Origin"]
       [status, headers, body]
     end
   end
@@ -25,5 +23,8 @@ Rails.configuration.middleware.use OpenStreetMap::Cors do
     origins "*"
     resource "/oauth/*", :headers => :any, :methods => [:get, :post]
     resource "/api/*", :headers => :any, :methods => [:get, :post, :put, :delete]
+    resource "/diary/rss", :headers => :any, :methods => [:get]
+    resource "/diary/*/rss", :headers => :any, :methods => [:get]
+    resource "/user/*/diary/rss", :headers => :any, :methods => [:get]
   end
 end
index 3b4f06a2e66277c2856ca87650fea36b0b264d59..421ca2bf9395f503e1f72582aaf201633a877375 100644 (file)
@@ -47,6 +47,25 @@ module OpenStreetMap
       end
     end
   end
+
+  module OAuthFilter
+    def oauth1_verify(request, options = {}, &block)
+      signature = OAuth::Signature.build(request, options, &block)
+      return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
+      value = signature.verify
+      if request.ssl? && !value
+        http_request = request.dup
+        http_request.define_singleton_method(:scheme) { "http" }
+        http_request.define_singleton_method(:port) { 80 }
+        signature = OAuth::Signature.build(http_request, options, &block)
+        value = signature.verify
+      end
+      value
+    rescue OAuth::Signature::UnknownSignatureMethod
+      false
+    end
+  end
 end
 
 OAuth::Controllers::ProviderController.prepend(OpenStreetMap::ProviderController)
+OAuth::Rack::OAuthFilter.prepend(OpenStreetMap::OAuthFilter)
index 180469bfce74309b2f94b2aebeb8a0e41fac947e..7e499c0e6960cc7aa2545d0ada0eb73bfe9274d7 100644 (file)
@@ -26,9 +26,7 @@ windowslive_options = { :name => "windowslive", :scope => "wl.signin,wl.emails"
 github_options = { :name => "github", :scope => "user:email" }
 wikipedia_options = { :name => "wikipedia", :client_options => { :site => "https://meta.wikimedia.org" } }
 
-if defined?(GOOGLE_OPENID_REALM)
-  google_options[:openid_realm] = GOOGLE_OPENID_REALM
-end
+google_options[:openid_realm] = GOOGLE_OPENID_REALM if defined?(GOOGLE_OPENID_REALM)
 
 Rails.application.config.middleware.use OmniAuth::Builder do
   provider :openid, openid_options
index f30a4b86c3a6631e8e667f0ad1074df981662faf..b0b45aa13125f355fd56ca74b31217f0d970af8f 100644 (file)
@@ -27,7 +27,7 @@ cookie_policy = {
 }
 
 SecureHeaders::Configuration.default do |config|
-  config.hsts = "max-age=0"
+  config.hsts = SecureHeaders::OPT_OUT
   config.csp = SecureHeaders::OPT_OUT
   config.csp_report_only = csp_policy
   config.cookies = cookie_policy
index 8a0fd8f03a98eb67b8e91f91bb72a6a1898dc796..a9c735d6255d40e20cdc2e6eaa5fc206850e6fa0 100644 (file)
@@ -2,8 +2,6 @@
 
 if defined?(MEMCACHE_SERVERS)
   Rails.application.config.session_store :mem_cache_store, :memcache_server => MEMCACHE_SERVERS, :namespace => "rails:session", :key => "_osm_session"
-elsif Rails.application.config.cache_store != :null_store
-  Rails.application.config.session_store :cache_store, :key => "_osm_session"
 else
-  Rails.application.config.session_store :cookie_store, :key => "_osm_session"
+  Rails.application.config.session_store :cache_store, :key => "_osm_session", :cache => ActiveSupport::Cache::MemoryStore.new
 end
index c0989fcfcbae5115e624f4939deb5e98baaac61a..2da4b90fc90124c6bc562773689daf0a680991f9 100644 (file)
@@ -400,33 +400,26 @@ af:
           crematorium: Krematorium
           dentist: Tandarts
           doctors: Dokters
-          dormitory: Studentehuis
           drinking_water: Drinkwater
           driving_school: Bestuurskool
           embassy: Ambassade
-          emergency_phone: Noodtelefoon
           fast_food: Wegneemetes
           ferry_terminal: Pontterminaal
-          fire_hydrant: Brandkraan
           fire_station: Brandweerstasie
           food_court: Kosarea
           fountain: Fontein
           fuel: Brandstof
           gambling: Dobbelary
           grave_yard: Begraafplaas
-          gym: Fiksheidsentrum / Gim
-          health_centre: Gesondheidsentrum
           hospital: Hospitaal
           hunting_stand: Jagtoring
           ice_cream: Roomys
           kindergarten: Kleuterskool
           library: Biblioteek
-          market: Mark
           marketplace: Markplein
           monastery: Monnikeklooster
           motorcycle_parking: Motorfietsparkering
           nightclub: Nagklub
-          nursery: Kleuterskool
           nursing_home: Verpleging- en versorgingshuis
           office: Kantoor
           parking: Parkering
@@ -440,7 +433,6 @@ af:
           prison: Tronk
           pub: Kroeg
           public_building: Openbare Gebou
-          reception_area: Ontvangsarea
           recycling: Herwinningspunt
           restaurant: Restaurant
           retirement_home: Ouetehuis
@@ -530,7 +522,6 @@ af:
           trunk: Hoofroete
           trunk_link: Hoofroete
           unclassified: Ongeklassifiseerde pad
-          unsurfaced: Grondpad
           "yes": Straat
         historic:
           archaeological_site: Argeologiese werf
@@ -590,7 +581,6 @@ af:
         leisure:
           beach_resort: Strandoord
           bird_hide: Voëlkykhuisie
-          club: Klub
           dog_park: Hondepark
           fishing: Visvanggebied
           fitness_centre: Fiksheidsentrum
@@ -678,8 +668,6 @@ af:
           "yes": Kantoor
         place:
           allotments: Toekennings
-          block: Blokkeer
-          airport: Lughawe
           city: Stad
           country: Land
           county: Distrik
@@ -691,7 +679,6 @@ af:
           islet: Eilandjie
           isolated_dwelling: Geïsoleerde woning
           locality: Ligging
-          moor: Vleiland
           municipality: Munisipaliteit
           neighbourhood: Woonbuurt
           postcode: Poskode
@@ -708,10 +695,8 @@ af:
           abandoned: Verlate Spoorweg
           construction: Spoor in aanbou
           disused: Spoorweg in onbruik
-          disused_station: Spoorwegstasie in onbruik
           funicular: Kabelspoorweg
           halt: Treinhalte
-          historic_station: Historiese spoorwegstasie
           junction: Spoorwegkruising
           level_crossing: Spooroorgang
           light_rail: Ligte spoor
@@ -772,7 +757,6 @@ af:
           hairdresser: Haarkapper
           hardware: Hardewarewinkel
           hifi: Hoëtrou
-          insurance: Versekering
           jewelry: Juwelierswinkel
           kiosk: Kiosk
           laundry: Wassery
@@ -788,10 +772,8 @@ af:
           pet: Troeteldierwinkel
           pharmacy: Apteek
           photo: Fotowinkel
-          salon: Skoonheidssalon
           second_hand: Tweedehandswinkel
           shoes: Skoenwinkel
-          shopping_centre: Winkelsentrum
           sports: Sportwinkel
           stationery: Skryfbehoeftewinkel
           supermarket: Supermark
@@ -1599,8 +1581,6 @@ af:
         mapquest_bicycle: Fiets (MapQuest)
         mapquest_car: Kar (MapQuest)
         osrm_car: Kar (OSRM)
-        mapzen_bicycle: Fiets (Mapzen)
-        mapzen_car: Motor (Mapzen)
       time: Tyd
     query:
       node: Knooppunt
index 6d8730d99b3b1bceb38a0c87f7e890c22b437b78..23ab08ead86867ab5c1ac870c0afea45adc3a5b1 100644 (file)
@@ -271,29 +271,22 @@ aln:
           crematorium: Krematorium
           dentist: Mjeku i dhomve
           doctors: Mjekët
-          dormitory: Konvikt
           drinking_water: Pirja e ujit
           driving_school: Auto shkollë
           embassy: Ambasada
-          emergency_phone: Urgjencës Phone
           fast_food: Ushqim I shpejtë
           ferry_terminal: Terminali i Trageteve
-          fire_hydrant: Zjarri hydrant
           fire_station: Zjarrëfiksat
           fountain: Burim
           fuel: Lëndë djegëse
           grave_yard: Varrezë
-          gym: Qendra Kalitje fizike / palestër
-          health_centre: Qendër e Shëndetësore
           hospital: Spital
           hunting_stand: Gjuetia Stand
           ice_cream: Akullore
           kindergarten: Kopshti i fëmijëve
           library: Bibliotekë
-          market: Treg
           marketplace: Treg
           nightclub: Night Club
-          nursery: Fidanishte
           nursing_home: shtëpi pleqsh
           office: Zyrë
           parking: Parking
@@ -306,7 +299,6 @@ aln:
           prison: Burg
           pub: Pijetore
           public_building: Publike Ndërtimi
-          reception_area: Zona e pritjes
           recycling: Pika riciklimit
           restaurant: Restorant
           retirement_home: Daljes në pension Home
@@ -363,7 +355,6 @@ aln:
           trunk: rrugën kryesore
           trunk_link: rrugën kryesore
           unclassified: Paklasifikuara Road
-          unsurfaced: Rrugë pa sipërfaqe
         historic:
           archaeological_site: Arkeologjik Faqes
           battlefield: Fushë beteje
@@ -463,7 +454,6 @@ aln:
           wetland: Lagunat
           wood: Dru
         place:
-          airport: Aeroport
           city: Qyteti
           country: Veni
           county: Qark
@@ -474,7 +464,6 @@ aln:
           island: Ishull
           islet: Ishull
           locality: Lokalitet
-          moor: Knete
           municipality: Komuna
           postcode: Post kodi
           region: Regjioni
@@ -489,10 +478,8 @@ aln:
           abandoned: Braktisur hekurudhave
           construction: Hekurudhave në ndërtim
           disused: Hekurudhave papërdorur
-          disused_station: Stacioni hekurudhor Historike
           funicular: Me litar hekurudhave
           halt: Trajnimi Stop
-          historic_station: Stacioni hekurudhor Historike
           junction: Hekurudhave kryqëzim
           level_crossing: Kalim në nivel
           light_rail: hekurudhor Lehta
@@ -550,7 +537,6 @@ aln:
           hairdresser: Floktar
           hardware: dyqan mjet
           hifi: dyqan hi-fi
-          insurance: Sigurim
           jewelry: Bizhuteri Shop
           kiosk: kiosk
           laundry: Lavanderi
@@ -565,9 +551,7 @@ aln:
           outdoor: dyqan në natyrë
           pet: Shitore e kafshëve
           photo: dyqan fotografik
-          salon: Sallon
           shoes: dyqan këpucësh
-          shopping_centre: Qendra tregtare
           sports: Sport Dyqani
           stationery: dyqan shkrimi
           supermarket: Supermarket
index a0dfc880c2d56b118037b237187dec3aa3a31d3d..3e66d93f0315c5f56257b9f9b1d6e0228daed980 100644 (file)
@@ -455,33 +455,26 @@ ar:
           crematorium: محرقة جثث
           dentist: طبيب أسنان
           doctors: أطباء
-          dormitory: عنبر نوم
           drinking_water: مياه عذبة
           driving_school: مدرسة تعليم قيادة
           embassy: سفارة
-          emergency_phone: هاتف طوارئ
           fast_food: وجبات سريعة
           ferry_terminal: مرسى عبّارة
-          fire_hydrant: مواد مكافحة حرائق
           fire_station: فوج إطفاء
           food_court: مطعم وجبات سريعة
           fountain: نافورة
           fuel: وقود
           gambling: مقامرة
           grave_yard: مقبرة
-          gym: مركز للرشاقة/الرياضة
-          health_centre: مركز صحي
           hospital: مستشفى
           hunting_stand: مربط للصيد
           ice_cream: مثلجات
           kindergarten: حضانة أطفال
           library: مكتبة
-          market: سوق
           marketplace: سوق
           monastery: دير
           motorcycle_parking: مرآب دراجات نارية
           nightclub: نادي ليلي
-          nursery: رعاية تمريضية
           nursing_home: دار رعاية مسنين/معاقين
           office: مكتب
           parking: موقف سيارات
@@ -495,7 +488,6 @@ ar:
           prison: سجن
           pub: حانة
           public_building: مبنى عام
-          reception_area: منطقة استقبال
           recycling: نقطة إعادة تصنيع
           restaurant: مطعم
           retirement_home: بيت مسنين
@@ -591,7 +583,6 @@ ar:
           trunk: طريق رئيسي
           trunk_link: طريق رئيسي
           unclassified: طريق غير مصنّف
-          unsurfaced: طريق غير معبد
           "yes": طريق
         historic:
           archaeological_site: موقع أثري
@@ -619,6 +610,7 @@ ar:
           wayside_cross: صليب تذكاري
           wayside_shrine: مزار جانب طريق
           wreck: حطام
+          "yes": موقع تاريخي
         junction:
           "yes": تقاطع
         landuse:
@@ -656,7 +648,6 @@ ar:
         leisure:
           beach_resort: شاطئ منتجع
           bird_hide: مخبئ طيور
-          club: نادي
           common: أرض مشاع
           dog_park: حديقة كلاب
           fishing: منطقة صيد سمك
@@ -749,8 +740,6 @@ ar:
           "yes": مكتب
         place:
           allotments: المخصصات
-          block: حظر
-          airport: مطار
           city: مدينة
           country: دولة
           county: مقاطعة
@@ -762,7 +751,6 @@ ar:
           islet: جزيرة صغيرة
           isolated_dwelling: سكن منعزل
           locality: محلة
-          moor: أرض جرداء
           municipality: البلدية
           neighbourhood: حي
           postcode: الرمز البريدي
@@ -779,10 +767,8 @@ ar:
           abandoned: سكة حديد مهجورة
           construction: سكة حديدية تحت الإنشاء
           disused: سكة حديد مهجورة
-          disused_station: محطة سكة حديدية مهجورة
           funicular: سكة حديدية معلقة
           halt: موقف قطار
-          historic_station: محطة سكة حديد تاريخية
           junction: تقاطع سكك حديدية
           level_crossing: تقاطع سكك حديدية
           light_rail: قطار خفيف
@@ -846,7 +832,6 @@ ar:
           hairdresser: مزين/مصفف شعر
           hardware: متجر عتاد
           hifi: متجر هاي فاي
-          insurance: بوليصات تأمين
           jewelry: متجر مجوهرات
           kiosk: كشك
           laundry: مصبغة
@@ -862,10 +847,8 @@ ar:
           pet: متجر حيوانات أليفة
           pharmacy: صيدلية
           photo: متجر صور
-          salon: صالون
           second_hand: متجر أغراض مستعملة
           shoes: متجر أحذية
-          shopping_centre: مركز التسوق
           sports: متجر رياضة
           stationery: محل قرطاسية
           supermarket: سوبرماركت
@@ -1057,6 +1040,7 @@ ar:
     beginners_guide:
       url: http://wiki.openstreetmap.org/wiki/Ar:Beginners%27_guide
       title: دليل المبتدئين
+      description: دليل من المجتمع للمبتدئين.
     help:
       url: https://help.openstreetmap.org/
       title: help.openstreetmap.org
@@ -1623,6 +1607,9 @@ ar:
         github:
           title: تسجيل الدخول بجيثب
           alt: تسجيل الدخول باستخدام حساب جيثب
+        wikipedia:
+          title: تسجيل الدخول عبر ويكيبيديا
+          alt: سجل الدخول باستخدام حساب ويكيبيديا
         yahoo:
           title: تسجيل الدخول بياهو
           alt: تسجيل الدخول ب Yahoo OpenID
@@ -2130,9 +2117,6 @@ ar:
         mapquest_car: سيارة (MapQuest)
         mapquest_foot: قدم (MapQuest)
         osrm_car: سيارة (OSRM)
-        mapzen_bicycle: دراجة (Mapzen)
-        mapzen_car: سيارة (Mapzen)
-        mapzen_foot: قدم (Mapzen)
       directions: الاتجاهات
       distance: المسافات
       errors:
index a32b4ecb8b4290d0e4d628456ccb545a5654af37..3079aa99ecee43a02c2a238d2c558dac37b32444 100644 (file)
@@ -242,29 +242,22 @@ arz:
           crematorium: محرقه جثث
           dentist: طبيب أسنان
           doctors: أطباء
-          dormitory: عنبر نوم
           drinking_water: مياه عذبة
           driving_school: مدرسه تعليم قيادة
           embassy: سفارة
-          emergency_phone: هاتف طوارئ
           fast_food: وجبات سريعة
           ferry_terminal: مرسى عبّارة
-          fire_hydrant: مواد مكافحه حرائق
           fire_station: فوج إطفاء
           fountain: نافورة
           fuel: وقود
           grave_yard: مقبرة
-          gym: مركز للرشاقة/الرياضة
-          health_centre: مركز صحي
           hospital: مستشفى
           hunting_stand: مربط للصيد
           ice_cream: مثلجات
           kindergarten: حضانه أطفال
           library: مكتبة
-          market: سوق
           marketplace: سوق
           nightclub: نادى ليلي
-          nursery: رعايه تمريضية
           nursing_home: دار رعايه مسنين/معاقين
           office: مكتب
           parking: موقف سيارات
@@ -277,7 +270,6 @@ arz:
           prison: سجن
           pub: حانة
           public_building: مبنى عام
-          reception_area: منطقه استقبال
           recycling: نقطه إعاده تصنيع
           restaurant: مطعم
           sauna: حمّام بخارى حار
@@ -329,7 +321,6 @@ arz:
           trunk: طريق رئيسي
           trunk_link: طريق رئيسي
           unclassified: طريق غير مصنّف
-          unsurfaced: طريق غير معبد
         historic:
           archaeological_site: موقع أثري
           battlefield: ساحه معركة
@@ -422,7 +413,6 @@ arz:
           wetland: أرض رطبة
           wood: حرج
         place:
-          airport: مطار
           city: مدينة
           country: دولة
           county: مقاطعة
@@ -433,7 +423,6 @@ arz:
           island: جزيرة
           islet: جزيره صغيرة
           locality: محلة
-          moor: أرض جرداء
           municipality: بلدية
           postcode: الرمز البريدي
           region: منطقة
@@ -447,9 +436,7 @@ arz:
           abandoned: سكه حديد مهجورة
           construction: سكه حديديه تحت الإنشاء
           disused: سكه حديد مهجورة
-          disused_station: محطه سكه حديد مهجورة
           halt: موقف قطار
-          historic_station: محطه سكه حديد تاريخية
           junction: تقاطع سكك حديدية
           level_crossing: تقاطع سكك حديدية
           monorail: قطار ذات سكه حديد واحدة
@@ -495,7 +482,6 @@ arz:
           grocery: بقالة
           hairdresser: مزين/مصفف شعر
           hardware: متجر عتاد
-          insurance: بوليسات تأمين
           jewelry: متجر مجوهرات
           kiosk: كشك
           laundry: مصبغة
@@ -510,9 +496,7 @@ arz:
           outdoor: متجر للنشاطات الخارجية
           pet: متجر حيوانات أليفة
           photo: متجر صور
-          salon: صالون
           shoes: متجر أحذية
-          shopping_centre: مركز التسوق
           sports: متجر رياضة
           stationery: محل قرطاسية
           supermarket: سوبرماركت
index 24e334d0835b610e6e0f944a72ba8ab7bbe3eab0..6b32747cdef7189f1529d1445eec813ac6990679 100644 (file)
@@ -2,6 +2,7 @@
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Enolp
+# Author: Fitoschido
 # Author: Macofe
 # Author: Xuacu
 ---
@@ -129,6 +130,8 @@ ast:
         title_comment: Conxuntu de cambeos %{id} - %{comment}
       join_discussion: Anicia sesión pa xunite al alderique
       discussion: Alderique
+      still_open: El conxuntu de cambios inda ta abiertu; l'alderique abriráse en
+        zarrando'l conxuntu de cambios.
     node:
       title: 'Nuedu: %{name}'
       history_title: 'Historial del nuedu: %{name}'
@@ -337,7 +340,7 @@ ast:
       map_image: Imaxe del mapa (amuesa la capa estándar)
       embeddable_html: HTML pa embrivir
       licence: Llicencia
-      export_details: Los datos d'OpenStreetMap tan llicenciaos baxo la <a href="http://opendatacommons.org/licenses/odbl/1.0/">llicencia
+      export_details: Los datos d'OpenStreetMap tan llicenciaos baxo la <a href="https://opendatacommons.org/licenses/odbl/1.0/">llicencia
         Open Data Commons Open Database</a> (ODbL).
       too_large:
         advice: 'Si falla la esportación anterior, considera utilizar una de les fontes
@@ -378,14 +381,14 @@ ast:
   geocoder:
     search:
       title:
-        latlon: Resultaos <a href="http://openstreetmap.org/">internos</a>
+        latlon: Resultaos <a href="https://openstreetmap.org/">internos</a>
         uk_postcode: Resultaos de <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultaos de <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultaos de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultaos de <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultaos de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultaos de <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultaos de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultaos de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resultaos de <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -395,12 +398,19 @@ ast:
           chair_lift: Telesilla
           drag_lift: Telesquí
           gondola: Telecabina
+          platter: Telesquí
+          pylon: Poste
           station: Estación de cable
+          t-bar: Remonte de barra en T
         aeroway:
           aerodrome: Aeródromu
+          airstrip: Campu d'aviación
           apron: Aparcaderu d'aviones
           gate: Puerta
+          hangar: Hangar
           helipad: Helipuertu
+          holding_position: Posición d'espera
+          parking_position: Posición d'aparcamientu
           runway: Pista
           taxiway: Cai de rodaxe
           terminal: Terminal
@@ -435,37 +445,32 @@ ast:
           crematorium: Crematoriu
           dentist: Dentista
           doctors: Médicos
-          dormitory: Residencia
           drinking_water: Agua potable
           driving_school: Autoescuela
           embassy: Embaxada
-          emergency_phone: Teléfonu d'emerxencia
           fast_food: Comida rápida
           ferry_terminal: Terminal de ferry
-          fire_hydrant: Boca d'incendios
           fire_station: Bomberos
           food_court: Zona de restoranes
           fountain: Fonte
           fuel: Combustible
           gambling: Xuegos d'azar
           grave_yard: Cementeriu
-          gym: Ximnasiu
-          health_centre: Centru de salú
+          grit_bin: Caxa d'arenón con sal
           hospital: Hospital
           hunting_stand: Puestu de caza
           ice_cream: Xelaos
           kindergarten: Xardín d'infancia
           library: Biblioteca
-          market: Mercáu
           marketplace: Mercáu
           monastery: Monasteriu
           motorcycle_parking: Aparcamientu pa motocicletes
           nightclub: Sala de fiestes
-          nursery: Guardería
           nursing_home: Residencia asistida
           office: Oficina
           parking: Aparcamientu
           parking_entrance: Entrada d'aparcamientu
+          parking_space: Plaza d'aparcamientu
           pharmacy: Farmacia
           place_of_worship: Llugar de cultu
           police: Policía
@@ -475,7 +480,6 @@ ast:
           prison: Cárcel
           pub: Pub
           public_building: Edificiu públicu
-          reception_area: Área de recepción
           recycling: Puntu llimpiu
           restaurant: Restorán
           retirement_home: Residencia de xubilaos
@@ -500,6 +504,7 @@ ast:
           village_hall: Sala polivalente
           waste_basket: Papelera
           waste_disposal: Contenedor pa basories
+          water_point: Toma d'agua
           youth_centre: Centru de mocedá
         boundary:
           administrative: Llende alministrativa
@@ -508,6 +513,7 @@ ast:
           protected_area: Área protexida
         bridge:
           aqueduct: Acueductu
+          boardwalk: Camín de tables
           suspension: Ponte colgante
           swing: Ponte xiratoria
           viaduct: Viaductu
@@ -527,25 +533,31 @@ ast:
           "yes": Tienda d'artesanía
         emergency:
           ambulance_station: Base d'ambulancies
+          assembly_point: Puntu de xuntanza
           defibrillator: Desfibrilador
           landing_site: Llugar de aterrizaxe d'emerxencia
           phone: Teléfonu d'emerxencia
+          water_tank: Depósitu d'agua pa emerxencies
+          "yes": Emerxencia
         highway:
           abandoned: Estrada abandonada
           bridleway: Caleya
           bus_guideway: Carril bus con guía
           bus_stop: Parada d'autobús
           construction: Estrada en construcción
+          corridor: Pasiellu
           cycleway: Pista pa bicicletes
           elevator: Ascensor
           emergency_access_point: Accesu d'emerxencia
           footway: Senderu
           ford: Vau
+          give_way: Señal de dexar pasu
           living_street: Rúa residencial
           milestone: Moyón
           motorway: Autoestrada
           motorway_junction: Encruz d'autoestrada
           motorway_link: Enllaz d'autovía
+          passing_place: Apartaderu p'adelantamientu
           path: Camín
           pedestrian: Camín peonil
           platform: Andén
@@ -562,6 +574,7 @@ ast:
           services: Área de serviciu
           speed_camera: Radar
           steps: Escaleres
+          stop: Señal de stop
           street_lamp: Farola
           tertiary: Estrada terciaria
           tertiary_link: Estrada terciaria
@@ -570,8 +583,8 @@ ast:
           trail: Senderu
           trunk: Estrada nacional
           trunk_link: Estrada nacional
+          turning_loop: Carril pa dar vuelta
           unclassified: Estrada ensin clasificar
-          unsurfaced: Estrada ensin asfaltar
           "yes": Estrada
         historic:
           archaeological_site: Xacimientu arqueolóxicu
@@ -590,6 +603,7 @@ ast:
           manor: Casona
           memorial: Memorial
           mine: Mina
+          mine_shaft: Pozu mineru
           monument: Monumentu
           roman_road: Via romana
           ruins: Ruines
@@ -599,6 +613,7 @@ ast:
           wayside_cross: Cruceru
           wayside_shrine: Santuariu de camín
           wreck: Naufraxu
+          "yes": Sitiu históricu
         junction:
           "yes": Interseición
         landuse:
@@ -636,9 +651,9 @@ ast:
         leisure:
           beach_resort: Complexu playeru
           bird_hide: Observatoriu d'aves
-          club: Club
           common: Terrén común
           dog_park: Parque pa perros
+          firepit: Pozu pa fogueres
           fishing: Área de pesca
           fitness_centre: Ximnasiu (fitness)
           fitness_station: Ximnasiu
@@ -663,15 +678,46 @@ ast:
           water_park: Parque acuáticu
           "yes": Folganza
         man_made:
+          adit: Socavón
+          beacon: Baliza
+          beehive: Colmena
+          breakwater: Rompeoles
+          bridge: Ponte
+          bunker_silo: Búnquer
+          chimney: Chimenea
+          crane: Grúa
+          dolphin: Poste d'amarre
+          dyke: Dique
+          embankment: Terremplén
+          flagpole: Asta
+          gasometer: Gasómetru
+          groyne: Espigón
+          kiln: Kiln
           lighthouse: Faru
+          mast: Mástil
+          mine: Mina
+          mineshaft: Pozu mineru
+          monitoring_station: Estación de control
+          petroleum_well: Pozu petrolíferu
+          pier: Muelle
           pipeline: Tubería
+          silo: Silu
+          storage_tank: Depósitu
+          surveillance: Vixilancia
           tower: Torre
+          wastewater_plant: Planta depuradora
+          watermill: Molín d'agua
+          water_tower: Depósitu d'agua eleváu
+          water_well: Pozu
+          water_works: Captación d'agua potable
+          windmill: Molín de vientu
           works: Fábrica
           "yes": Artificial
         military:
           airfield: Aeródromu militar
           barracks: Cuartel
           bunker: Bunker
+          "yes": Militar
         mountain_pass:
           "yes": Puertu de montaña
         natural:
@@ -717,11 +763,14 @@ ast:
           accountant: Contable
           administrative: Alministración
           architect: Arquitectu
+          association: Asociación
           company: Empresa
+          educational_institution: Institución educativa
           employment_agency: Oficina d'emplegu
           estate_agent: Axencia inmobiliaria
           government: Oficina gubernamental
           insurance: Axencia de seguros
+          it: Oficina de Teunoloxíes de la información
           lawyer: Abogáu
           ngo: Oficina d'ONG
           telecommunication: Oficina de telecomunicaciones
@@ -729,9 +778,8 @@ ast:
           "yes": Oficina
         place:
           allotments: Güertos recreativos
-          block: Bloque
-          airport: Aeropuertu
           city: Ciudá
+          city_block: Mazana de cases
           country: País
           county: Condáu
           farm: Casería
@@ -742,12 +790,12 @@ ast:
           islet: Castru de mar
           isolated_dwelling: Vivienda aisllada
           locality: Llocalidá
-          moor: Granda
           municipality: Conceyu
           neighbourhood: Barriu
           postcode: Códigu postal
           region: Rexón
           sea: Mar
+          square: Plaza
           state: Estáu o provincia
           subdivision: Subdivisión
           suburb: Suburbiu
@@ -759,10 +807,8 @@ ast:
           abandoned: Ferrocarril abandonáu
           construction: Ferrocarril en construcción
           disused: Ferrocarril ensin usu
-          disused_station: Estación de ferrocarril ensin usu
           funicular: Tren funicular
           halt: Parada de tren
-          historic_station: Estación de ferrocarril históricu
           junction: Encruz ferroviariu
           level_crossing: Pasu a nivel
           light_rail: Ferrocarril llixeru
@@ -788,6 +834,7 @@ ast:
           beauty: Cuidaos corporales
           beverages: Venta de bébores
           bicycle: Tienda de bicicletes
+          bookmaker: Casa d'apuestes
           books: Llibrería
           boutique: Boutique
           butcher: Carnicería
@@ -826,12 +873,16 @@ ast:
           hairdresser: Peluquería
           hardware: Ferretería
           hifi: Hi-Fi
-          insurance: Seguros
+          houseware: Tienda de cacía
+          interior_decoration: Decoración d'interiores
           jewelry: Xoyería
           kiosk: Quioscu
+          kitchen: Venta de cocines
           laundry: Llavandería
+          lottery: Llotería
           mall: Centru comercial
           market: Mercáu
+          massage: Masaxe
           mobile_phone: Tienda de telefonía móvil
           motorcycle: Venta de motos
           music: Tienda de música
@@ -839,21 +890,27 @@ ast:
           optician: Óptica
           organic: Comida ecolóxica
           outdoor: Deportes d'aire llibre
+          paint: Tienda de pinturea
+          pawnbroker: Casa d'empeños
           pet: Tienda d'animales
           pharmacy: Farmacia
           photo: Fotografía
-          salon: Cuidaos corporales
+          seafood: Mariscos
           second_hand: Tienda d'oxetos usaos
           shoes: Zapatería
-          shopping_centre: Centru comercial
           sports: Tienda de deportes
           stationery: Papelería
           supermarket: Supermercáu
           tailor: Sastrería
+          ticket: Venta d'entraes
+          tobacco: Estancu
           toys: Xuguetería
           travel_agency: Axencia de viaxes
+          tyres: Neumáticos
+          vacant: Tienda zarrada
+          variety_store: Tienda de too a 100
           video: Videu club
-          wine: Venta de llicores
+          wine: Vinatería
           "yes": Tienda
         tourism:
           alpine_hut: Refuxu de monte
@@ -877,6 +934,7 @@ ast:
           viewpoint: Mirador
           zoo: Zoo
         tunnel:
+          building_passage: Pasu per edificiu
           culvert: Cañu
           "yes": Túnel
         waterway:
@@ -908,7 +966,7 @@ ast:
         level10: Frontera de barriu
     description:
       title:
-        osm_nominatim: Llugar según <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Llugar según <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Llugar según <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -984,21 +1042,21 @@ ast:
       title_html: Drechos d'autor y llicencia
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> son <i>datos abiertos</i>, baxo llicencia <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) de la <a
-        href="http://osmfoundation.org/">Fundación OpenStreetMap</a> (OSMF).
+        href="https://osmfoundation.org/">Fundación OpenStreetMap</a> (OSMF).
       intro_2_html: Puedes copiar, distribuir, tresmitir y adautar los nuesos datos
         de mou llibre, mentanto deas reconocimientu a OpenStreetMap y a los sos collaboradores.
         Si camudes o crees conteníu sobre los nuesos datos, namái podrás distribuir
-        el resultáu baxo la mesma llicencia. El <a href="http://opendatacommons.org/licenses/odbl/1.0/">códigu
+        el resultáu baxo la mesma llicencia. El <a href="https://opendatacommons.org/licenses/odbl/1.0/">códigu
         llegal</a> completu t'esplica los tos drechos y obligaciones.
       intro_3_html: La cartografía de los mosaicos del mapa y la nuesa documentación,
-        tan llicenciaos baxo la llicencia <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
-        Commons Reconocimientu-CompartirIgual 2.0</a> (CC-BY-SA).
+        tán llicenciaos baxo la llicencia <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Reconocimientu-CompartirIgual 2.0</a> (CC BY-SA).
       credit_title_html: Cómo dar reconocimientu a OpenStreetMap
       credit_1_html: Riquimos qu'uses el créditu &ldquo;&copy; Collaboradores d'OpenStreetMap&rdquo;.
       credit_2_html: |-
-        Tamién tienes de dexar claro que los datos tan disponibles baxo la llicencia Open Database License (ODbL), y si utilices los nuesos mosaicos de mapa, que la cartografía tien llicencia CC BY-SA. Pues facelo enllazando a <a href="http://www.openstreetmap.org/copyright">esta páxina de drechos d'autor</a>.
+        Tamién tienes de dexar claro que los datos tan disponibles baxo la llicencia Open Database License (ODbL), y si utilices los nuesos mosaicos de mapa, que la cartografía tien llicencia CC BY-SA. Puedes facelo enllazando a <a href="https://www.openstreetmap.org/copyright">esta páxina de drechos d'autor</a>.
         Alternativamente, y como requisitu si distribues OSM en forma de datos, pues nomar y enllazar direutamente a les llicencies. En medios onde los enllaces nun seyan posibles (por exemplu, obres imprentaes), suxerímoste dirixir a los llectores a openstreetmap.org (espandiendo 'OpenStreetMap' a esta dirección completa, seique), a opendatacommons.org y, si ye'l casu, a creativecommons.org.
       credit_3_html: |-
         Nun mapa electrónicu navegable, los créditos tendríen d'apaecer na esquina del mapa.
@@ -1008,9 +1066,8 @@ ast:
         title: Exemplu de reconocimientu
       more_title_html: Pa saber más
       more_1_html: |-
-        Llei más tocante a cómo utilizar los nuesos datos, y cómo acreditanos, na <a
-        href="http://osmfoundation.org/Licence">páxina de la Llicencia OSMF</a> y nes <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Entrugues y rempuestes llegales</a> (n'inglés) de la comunidá.
+        Llei más tocante a cómo utilizar los nuesos datos, y cómo danos créditu, na <a
+        href="https://osmfoundation.org/Licence">páxina de Llicencia de la OSMF</a>.
       more_2_html: |-
         Anque OpenStreetMap son datos abiertos, nun podemos ufrir una API de mapes de baldre pa desendolcadores d'aplicaciones pa terceros.
         Llei la nuesa <a href="https://operations.osmfoundation.org/policies/api/">Política d'usu de la API</a> (n'inglés),
@@ -1022,10 +1079,10 @@ ast:
         d''otres fontes, ente elles:'
       contributors_at_html: |-
         <strong>Austria</strong>: Contien datos de
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (baxo
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> y
-        Land Tirol (baxo <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT con enmiendes</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (baxo
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> y
+        Land Tirol (baxo <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT con enmiendes</a>).
       contributors_ca_html: |-
         <strong>Canadá</strong>: Contien datos de GeoBase&reg;, GeoGratis (&copy; Department of Natural
         Resources Canada), CanVec (&copy; Department of Natural
@@ -1033,12 +1090,12 @@ ast:
         Statistics Canada).
       contributors_fi_html: |-
         <strong>Finlandia</strong>: Contien datos de la base de datos topográfica de la National Land Survey de Finlandia
-        y otros conxuntos de datos, baxo la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">Llicencia NLSFI</a>.
+        y otros conxuntos de datos, baxo la <a href="http://www.maanmittauslaitos.fi/en/opendata-licence-version1">Llicencia NLSFI</a>.
       contributors_fr_html: '<strong>Francia</strong>: Contien datos sacaos de Direction
         Générale des Impôts.'
       contributors_nl_html: |-
-        <strong>Holanda</strong>: Contien datos &copy; AND, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        <strong>Paises Baxos</strong>: Contien datos &copy; AND, 2007
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: '<strong>Nueva Zelanda</strong>: Contien datos sacaos
         de Land Information New Zealand. Crown Copyright reserved.'
       contributors_si_html: |-
@@ -1055,7 +1112,7 @@ ast:
       contributors_footer_1_html: |-
         Pa más detalles d'estes, y otres fontes que s'usaron p'ayudar a
         ameyorar OpenStreetMap, por favor, llei la <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">Páxina
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Páxina
         de los collaboradores</a> na Wiki d'OpenStreetMap.
       contributors_footer_2_html: La inclusión de datos n'OpenStreetMap nun significa
         que'l fornidor de los datos orixinales sofite OpenStreetMap, ufra garantía
@@ -1067,14 +1124,14 @@ ast:
         d'autor.
       infringement_2_html: Si crees que s'amestó de mou inapropiáu material con drechos
         d'autor a la base de datos d'OpenStreetMap o a esti sitiu, consulta'l nuesu
-        <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedimientu
+        <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procedimientu
         de retirada de datos</a> o pidilo direutamente nel nuesu <a href="http://dmca.openstreetmap.org/">formulariu
         en llinia</a>.
       trademarks_title_html: <span id="trademarks"></span>Marques rexistraes
-      trademarks_1_html: OpenStreetMap ,el logotipu de la lente y Estáu del Mapa son
-        marques rexistraes de la Fundación OpenStreetMap. Si tienes entrugues tocante
-        al usu de les marques, mándales al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupu
-        de trabayu sobro llicencies</a>.
+      trademarks_1_html: OpenStreetMap, el logotipu de la lente y «State of the Map»
+        son marques rexistraes de la Fundación OpenStreetMap. Si tienes entrugues
+        tocante al usu de les marques, consulta la nuesa <a href="http://wiki.osmfoundation.org/wiki/Trademark_Policy">política
+        de marques rexistraes</a>.
   welcome_page:
     title: ¡Afáyate!
     introduction_html: |-
@@ -1108,8 +1165,8 @@ ast:
       paragraph_1_html: OpenStreetMap tien poques regles formales, pero esperamos
         que tolos participantes collaboren y se comuniquen cola comunidá. Si tas considerando
         cualquier actividá distinta de la edición manual, llei y sigui les instrucciones
-        sobro <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>importaciones</a>
-        y <a href='http://wiki.openstreetmap.org/wiki/Import/Automated_Edits_code_of_conduct'>ediciones
+        sobro <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>importaciones</a>
+        y <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>ediciones
         automatizaes</a>.
     questions:
       title: ¿Tien alguna entruga?
@@ -1144,7 +1201,7 @@ ast:
       title: Otres preocupaciones
       explanation_html: |-
         Si tienes dalguna preocupación tocante a cómo tan usándose los nuesos datos o tocante al conteníu, consulta la
-        <a href='/copyright'>páxina de drechos d'autor</a> pa más información llegal, o comunícate col <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grupu de trabayu de la OSMF</a> afayadizu.
+        <a href='/copyright'>páxina de drechos d'autor</a> pa más información llegal, o comunícate col <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>grupu de trabayu de la OSMF</a> afayadizu.
   help_page:
     title: Algamar ayuda
     introduction: OpenStreetMap tien dellos recursos p'aprender sobro'l proyeutu,
@@ -1155,7 +1212,7 @@ ast:
       title: Bienveníos a OSM
       description: Principie con esta guía rápida que cubre lo básico d'OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Ast:Beginners%27_guide
       title: Guía del principiante
       description: Guía pa principiantes, mantenida pola comunidá.
     help:
@@ -1180,7 +1237,7 @@ ast:
       description: Ayuda pa les empreses y organizaciones que cambien a mapes y otros
         servicios, basaos n'OpenStreetMap.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/wiki/Ast:Main_Page
       title: wiki.openstreetmap.org
       description: Mirar na wiki la documentación d'OSM más a fondu.
   about_page:
@@ -1197,11 +1254,12 @@ ast:
       qu'OSM ye precisu y ta anováu.
     community_driven_title: Dirixíu pola comunidá
     community_driven_html: |-
-      La comunidá d'OpenStreetMap ye diversa, apasionada, y medra caldía.
+      La comunidá d'OpenStreetMap ye variada, apasionada, y medra caldía.
       Ente los collaboradores hai cartógrafos entusiastes, profesionales de GIS,
       inxenieros que xestionen los sirvidores d'OSM, voluntarios que
       faen mapes de les zones afeutaes por desastres, y muncho más.
-      Pa saber más tocante a la comunidá, ver los <a href='%{diary_path}'>diarios d'usuarios</a>, los <a href='http://blogs.openstreetmap.org/'>blogs de la comunidá</a>, y la páxina web de la <a href='http://www.osmfoundation.org/'>Fundación OSM</a>.
+      Pa saber más tocante a la comunidá, ver el
+      <a href='https://blog.openstreetmap.org'>Blog d'OpenStreetMap</a>, los <a href='%{diary_path}'>diarios d'usuarios</a>, los <a href='https://blogs.openstreetmap.org/'>blogs de la comunidá</a>, y la páxina web de la <a href='https://www.osmfoundation.org/'>Fundación OSM</a>.
     open_data_title: Datos abiertos
     open_data_html: |-
       OpenStreetMap son <i>datos abiertos</i>: tienes la llibertá d'usalos pa cualquier
@@ -1211,13 +1269,15 @@ ast:
       pa más detalles.
     legal_title: Llegal
     legal_html: "Esti sitiu y munchos otros servicios rellacionaos xestiónalos formalmente
-      la  \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF)
-      \nnel nome de la comunidá. L'usu de tolos servicios remanaos pola OSMF tán suxetos
-      a les nueses <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">polítiques
-      d'usu aceptable</a> y la nuesa <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">política
-      de privacidá</a>\n<br> \n<a href='http://osmfoundation.org/Contact'>Comunícate
-      cola OSMF</a> \nsi tienes entrugues o problemes relativos a les llicencies,
-      drechos d'autor u otru tema llegal."
+      la  \n<a href='https://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF)
+      \nnel nome de la comunidá. L'usu de tolos servicios alministraos pola OSMF tán
+      suxetos a les nueses <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">polítiques
+      d'usu aceptable</a> y la nuesa <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">política
+      de privacidá</a>\n<br>\n<a href='https://osmfoundation.org/Contact'>Comunícate
+      cola OSMF</a> \nsi tienes entrugues relativos a les llicencies, drechos d'autor
+      u otru tema llegal.\n<br>\nOpenStreetMap, el logo de la lente y «Estáu del mapa»
+      son <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">marques
+      rexistraes de la OSMF</a>."
     partners_title: Asociaos
   notifier:
     diary_comment_notification:
@@ -1419,13 +1479,13 @@ ast:
       user_page_link: páxina d'usuariu
       anon_edits_link_text: Descubri por qué ye'l casu.
       flash_player_required: Necesites un reproductor Flash pa usar Potlatch, l'editor
-        Flash d'OpenStreetMap. Puedes <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">descargar
-        el reproductor Flash d'Adobe.com</a>. Tamién hai disponibles <a href="http://wiki.openstreetmap.org/wiki/Editing">otres
+        Flash d'OpenStreetMap. Puedes <a href="https://get.adobe.com/flashplayer/">descargar
+        el reproductor Flash d'Adobe.com</a>. Tamién hai disponibles <a href="https://wiki.openstreetmap.org/wiki/Editing">otres
         opciones</a> pa editar OpenStreetMap.
       potlatch_unsaved_changes: Tienes cambios ensin guardar. (Pa guardalos en Potlatch,
         tienes de deseleicionar la vía o puntu actual si tas editando en vivo, o calcar
         nel botón guardar si apaez esi botón).
-      potlatch2_not_configured: Potlatch 2 nun ta configuráu; visita http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+      potlatch2_not_configured: Potlatch 2 nun ta configuráu; visita https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
         pa más información
       potlatch2_unsaved_changes: Tienes cambios ensin guardar. (Pa guardar en Potlatch
         2, tienes de calcar en guardar).
@@ -1441,7 +1501,7 @@ ast:
       get_directions_title: Alcuentra indicaciones ente dos puntos
       from: Dende
       to: A
-      where_am_i: ¿Ú toi?
+      where_am_i: ¿Ú esto?
       where_am_i_title: Describi el to allugamientu actual usando el motor de gueta
       submit_text: Dir
     key:
@@ -1518,7 +1578,7 @@ ast:
       edit: Editar
       preview: Vista previa
     markdown_help:
-      title_html: Analizáu con <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Analizáu con <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Cabeceres
       heading: Cabecera
       subheading: Cabecera secundaria
@@ -1627,7 +1687,7 @@ ast:
       description: Ver les xubes más nueves de traces GPS
       tagged_with: ' etiquetaes con %{tags}'
       empty_html: Entá nun hai nada equí. <a href='%{upload_link}'>Carga una nueva
-        traza</a> o deprendi más tocante a cómo trazar col GPS na <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>página
+        traza</a> o depriende más tocante a cómo trazar col GPS na <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>páxina
         de la wiki</a>.
     delete:
       scheduled_for_deletion: Traza marcada pa desaniciar
@@ -1837,11 +1897,11 @@ ast:
           <p>De mou distintu a otros mapes, OpenStreetMap ta creáu completamente por persones
           como tu, y cualquiera tien llibertá pa igualu, anovalu, descargalu y usalu.</p>
           <p>Date d'alta pa empezar a collaborar. Unviaremoste un corréu pa confirmar la cuenta.</p>
-      license_agreement: Cuando confirmes la to cuenta tendrás d'aceutar los <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">términos
+      license_agreement: Cuando confirmes la to cuenta tendrás d'aceutar los <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">términos
         de collaboración</a>.
       email address: 'Direición de corréu electrónicu:'
       confirm email address: 'Confirmar direición de corréu:'
-      not displayed publicly: La to direición nun s'amuesa en público, ver la <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: La to direición nun s'amuesa en público, ver la <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="política de protección de datos de la OSMF, qu'incluye una seición
         sobro direiciones de corréu">política de protección de datos</a> pa más información
       display name: 'Nome a amosar:'
@@ -1961,23 +2021,23 @@ ast:
       email never displayed publicly: (nunca s'amuesa en público)
       external auth: 'Autenticación esterna:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: ¿qué ye esto?
       public editing:
         heading: 'Ediciones públiques:'
         enabled: Activaes. Nun yes anónimu y puedes editar los datos.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: ¿qué ye esto?
         disabled: Desactivaes y nun puedes editar los datos; toles ediciones anteriores
           son anónimes.
         disabled link text: ¿por qué nun puedo editar?
       public editing note:
         heading: Edición pública
-        text: Anguaño, les tos ediciones son anónimes y la xente nun te pue unviar
+        text: Anguaño, les tos ediciones son anónimes y la xente nun puede unviate
           mensaxes o ver la to llocalización. P'amosar lo qu'editasti y permitir que
-          la xente se ponga en contautu contigo pela páxina web, calca nel botón qu'apaez
-          abaxo. <b>Dende'l cambiu al API 0.6, sólo los usuarios públicos pueden editar
-          los datos del mapa</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">por
+          la xente se ponga en contautu contigo pela páxina web, pulsia nel botón
+          qu'apaez abaxo. <b>Dende'l cambiu al API 0.6, sólo los usuarios públicos
+          pueden editar los datos del mapa</b> (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">por
           estes razones</a>).<ul><li>Les direiciones de corréu electrónicu nun se
           fairán públiques.</li><li>Nun ye posible volver atrás d'esta aición, y agora
           tolos usuarios nuevos son públicos de mou predetermináu.</li></ul>
@@ -2109,6 +2169,8 @@ ast:
       not_a_role: La cadena «%{role}» nun ye un rol válidu.
       already_has_role: L'usuariu yá tien el rol %{role}.
       doesnt_have_role: L'usuariu nun tien el rol %{role}.
+      not_revoke_admin_current_user: Nun pudo quitase'l rol d'alministrador al usuariu
+        actual.
     grant:
       title: Confirmar dar rol
       heading: Confirmar dar rol
@@ -2329,8 +2391,10 @@ ast:
       new:
         intro: ¿Alcontrasti un error o falta daqué? Informa a otros mapeadores pa
           que podamos igualo. Mueve'l marcador a la posición correuta y escribi una
-          nota pa esplicar el problema. (Por favor, nun escribas información personal
-          o información de mapes con drechos d'autor o de llistes de teléfonos).
+          nota pa esplicar el problema.
+        advice: La nota ye pública y puede usase p'anovar el mapa, de mou que nun
+          escribas información personal, o información de mapes con drechos d'autor
+          o llistes de teléfonos).
         add: Amestar nota
       show:
         anonymous_warning: Esta nota incluye comentarios d'usuarios anónimos que tendríen
@@ -2351,9 +2415,6 @@ ast:
         mapquest_car: Coche (MapQuest)
         mapquest_foot: A pie (MapQuest)
         osrm_car: En coche (OSRM)
-        mapzen_bicycle: En bicicleta (Mapzen)
-        mapzen_car: En coche (Mapzen)
-        mapzen_foot: A pie (Mapzen)
       descend: Descender
       directions: Indicaciones
       distance: Distancia
index e819673e502f2151087bb29696173984f59e8737..947e481a103ffff854f69db419876ed69b63bfad 100644 (file)
@@ -309,30 +309,23 @@ az:
           crematorium: Krematoriya
           dentist: Diş həkimi
           doctors: Həkimlər
-          dormitory: Yataqxana
           drinking_water: İçməli su
           driving_school: Sürücülük məktəbi
           embassy: Səfirlik
-          emergency_phone: Fövqəladə hallar üçün telefon
           fast_food: Fəst Fud
           ferry_terminal: Parom Terminalı
-          fire_hydrant: Yanğın Hidrantı
           fire_station: Yanğın söndürmə Stansiyası
           food_court: Açıq havada Yeməkxana
           fountain: Fontan
           fuel: Yanacaq doldurma
           grave_yard: Qəbirsanlıq
-          gym: Fitnes mərkəzi
-          health_centre: Sağlamlıq mərkəzi
           hospital: Qospital
           hunting_stand: Ov stendi
           ice_cream: Dondurma
           kindergarten: Uşaq bağçası
           library: Kitabxana
-          market: Market
           marketplace: Bazar meydanı
           nightclub: Gecə klubu
-          nursery: Pansionat
           nursing_home: Qocalar evi
           office: Ofis
           parking: Dayanacaq
@@ -345,7 +338,6 @@ az:
           prison: Həbsxana
           pub: Pivəxana
           public_building: İctimai Binalar
-          reception_area: Qəbul sahəsi
           recycling: Utilizasiya yeri
           restaurant: Restoran
           retirement_home: Qocalar Evi
@@ -418,7 +410,6 @@ az:
           trunk: Baş yol
           trunk_link: Baş yol
           unclassified: Təsnifatsız yol
-          unsurfaced: Örtüksüz yol
         historic:
           archaeological_site: Arxeoloji qazıntılar
           battlefield: Döyüş meydanı
@@ -546,7 +537,6 @@ az:
           travel_agent: Səyahət Agentliyi
           "yes": Ofislər
         place:
-          airport: Aeroport
           city: Şəhər
           country: Ölkə
           county: Ölkə
@@ -558,7 +548,6 @@ az:
           islet: Adacıq
           isolated_dwelling: Ayrıca ev-ferma
           locality: Təkr edilmiş ərazi
-          moor: Torfluq
           municipality: Bələdiyyə
           postcode: Poçt indeksi
           region: Bölgə
@@ -573,10 +562,8 @@ az:
           abandoned: Sökülmüş dəmiryol xətti
           construction: Dəmiryol xətti təmirdədir
           disused: İstifadə olunmayan (atılmış) dəmiryol xətti
-          disused_station: İstifadə olunmayan (atılmış) dəmiryol stansiyası
           funicular: Funikulyor
           halt: Qatar dayanacağı
-          historic_station: Tarixi dəmiryol stansiyası
           junction: Dəmiryol oxu
           level_crossing: Dəmiryol keçidi
           light_rail: Yüngül resli dəmiryol xətti
@@ -636,7 +623,6 @@ az:
           hairdresser: Saç ustası
           hardware: Məişət Alətləri Dükanı
           hifi: Audio və Video avadanlıqları dükanı
-          insurance: Sığorta şirkəti
           jewelry: Zərgərlik dükanı
           kiosk: Kiosk
           laundry: Camaşırxana
@@ -651,9 +637,7 @@ az:
           outdoor: Küçə satışı
           pet: Zoomaqazin
           photo: Fotomaqazin
-          salon: Salon
           shoes: Ayaqqabı dükanı
-          shopping_centre: Ticarət Mərkəzi
           sports: İdman malları dükanı
           stationery: Dəftərxana Ləvazimatı
           supermarket: Supermarket
diff --git a/config/locales/ba.yml b/config/locales/ba.yml
new file mode 100644 (file)
index 0000000..f1bcdaf
--- /dev/null
@@ -0,0 +1,679 @@
+# Messages for Bashkir (башҡортса)
+# Exported from translatewiki.net
+# Export driver: phpyaml
+# Author: AiseluRB
+# Author: Lizalizaufa
+# Author: Roustammr
+# Author: Sagan
+# Author: Visem
+# Author: Азат Хәлилов
+# Author: Айсар
+# Author: З. ӘЙЛЕ
+# Author: Ләйсән
+# Author: Рустам Нурыев
+# Author: Янмурза Баки
+---
+ba:
+  time:
+    formats:
+      friendly: '%e %B %Y cәғәт %H:%M'
+  activerecord:
+    models:
+      acl: Инеүҙе сикләү исемлеге
+      changeset: Төҙәтеүҙәр пакеты
+      changeset_tag: Төҙәтеүҙәр пакетының тегы
+      country: Ил
+      diary_comment: Көндәлеккә комментарий
+      diary_entry: Көндәлектәге яҙыу
+      friend: Рәхим итегеҙ!
+      language: Тел
+      message: Хәбәр
+      node: Төйөн
+      node_tag: Төйөн тегы
+      notifier: Белдереүсе
+      old_node: Иҫке нөктә
+      old_node_tag: Нөктәнең иҫке тегы
+      old_relation: Иҫке сағыштырма
+      old_relation_member: Мөнәсәбәттәрҙең элекке ҡатнашыусыһы
+      old_relation_tag: Иҫкергән Эске Тег
+      old_way: Иҫке юл
+      old_way_node: Юлдың иҫке нөктәһе
+      old_way_tag: Һыҙаттың элекке тегы
+      relation: Мөнәсәбәт
+      relation_member: Мөнәсәбәттәрҙә ҡатнашыусы
+      relation_tag: Мөнәсәбәт тегы
+      session: Сессия
+      trace: Маршрут
+      tracepoint: Маршрут нөктәһе
+      tracetag: Маршрут тегы
+      user: Ҡулланыусы
+      user_preference: Ҡулланыусы көйләүҙәре
+      user_token: Ҡулланыусы маркеры
+      way: Юл
+      way_node: Һыҙат нөктәһе
+      way_tag: Һыҙат тегы
+    attributes:
+      diary_comment:
+        body: Текст
+      diary_entry:
+        user: Ҡулланыусы
+        title: Тема
+        latitude: Киңлек
+        longitude: Оҙонлоҡ
+        language: Тел
+      friend:
+        user: Ҡулланыусы
+        friend: Дуҫ
+      trace:
+        user: Ҡатнашыусы
+        visible: Күренеш
+        name: Атама
+        size: Күләм
+        latitude: Киңлек
+        longitude: Оҙонлоҡ
+        public: Дөйөм
+        description: Тасуирлау
+      message:
+        sender: Ебәреүсе
+        title: Тема
+        body: Текст
+        recipient: Алыусы
+      user:
+        email: Электрон почта адресы
+        active: Әүҙем
+        display_name: Сағылдырылған исем
+        description: Тасуирлау
+        languages: Телдәр
+        pass_crypt: Серһүҙ
+  editor:
+    default: Һайланмаған (ҡуйылған %{name})
+    potlatch:
+      name: Potlatch 1
+      description: Potlatch 1 (браузерҙағы мөхәррир)
+    id:
+      name: iD
+      description: iD (браузерҙағы мөхәррир)
+    potlatch2:
+      name: Potlatch 2
+      description: Potlatch 2 (браузерҙағы мөхәррир)
+    remote:
+      name: Ситтән тороп идара итеү
+      description: Ситтән тороп идара итеү (JOSM йәки Merkaartor)
+  browse:
+    created: Булдырылған
+    closed: Ябыҡ
+    created_html: Булдырылған <abbr title='%{title}'>%{time} кирегә</abbr>
+    closed_html: Ябылған <abbr title='%{title}'>%{time} кирегә</abbr>
+    created_by_html: Төҙәтелгән <abbr title='%{title}'>%{time} кирегә</abbr> ҡулланыусы
+      тарафынан %{user}
+    deleted_by_html: Ябылған <abbr title='%{title}'>%{time} кирегә</abbr>ҡулланыусы
+      тарафынан%{user}
+    edited_by_html: Төҙәтелгән <abbr title='%{title}'>%{time} кирегә</abbr> ҡулланыусы
+      тарафынан %{user}
+    closed_by_html: Ябылған <abbr title='%{title}'>%{time} кирегә</abbr>ҡулланыусы
+      тарафынан%{user}
+    version: Версия
+    in_changeset: Төҙәтеүҙәр пакеты
+    anonymous: Аноним
+    no_comment: (комментарий юҡ)
+    part_of: Ҡатнаша
+    download_xml: ' XML-ды күсереү'
+    view_history: Тарихты ҡарау
+    view_details: Ентекләберәк
+    location: 'Географик урын:'
+    changeset:
+      title: 'Төҙәтеүҙәр пакеты: %{id}'
+      belongs_to: Автор
+      node: Нөктәләр (%{count})
+      node_paginated: Нөктәләр (%{x}-%{y} из %{count})
+      way: Һыҙыҡтар (%{count})
+      way_paginated: Юлдар (%{x}-%{y} %{графа}һынан)
+      relation: Мөнәсәбәттәр (%{count})
+      relation_paginated: Бәйләнештәр (%{x}-%{y} %{графа}нан)
+      comment: Комментарийҙар (%{count})
+      hidden_commented_by: ' %{user} <abbr title=''%{exact_time}''>%{when}тан йәшерен
+        комментарий, кирегә</abbr>'
+      commented_by: Ҡулланыусы комментарийы %{user} <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      changesetxml: Төҙәтеүҙәр пакетының XML-ы
+      osmchangexml: osmChange XML
+      feed:
+        title: 'Төҙәтеүҙәр пакеты: %{id}'
+        title_comment: Төҙәтеүҙәр пакеты %{id} — %{comment}
+      join_discussion: Фекер алышыуға ҡушылыу өсөн системаға инегеҙ
+      discussion: Фекер алышыу
+    node:
+      title: 'Нөктә: %{name}'
+      history_title: 'Нөктә тарихы: %{name}'
+    way:
+      title: 'Һыҙат: %{name}'
+      history_title: 'Һыҙат тарихы: %{name}'
+      nodes: Нөктәләр
+      also_part_of:
+        one: һыҙатта бар %{related_ways}
+        other: һыҙаттарҙа бар %{related_ways}
+    relation:
+      title: 'Мөнәсәбәт: %{name}'
+      history_title: 'Мөнәсәбәт тарихы: %{name}'
+      members: Ҡатнашыусылар
+    relation_member:
+      entry_role: '%{type} %{name} ролендә %{role}'
+      type:
+        node: Нөктә
+        way: Һыҙат
+        relation: Мөнәсәбәт
+    containing_relation:
+      entry: Мөнәсәбәт %{relation_name}
+      entry_role: Мөнәсәбәт %{relation_name} (ролендә %{relation_role})
+    not_found:
+      sorry: 'Үкенескә ҡаршы, %{type} #%{id} табылманы.'
+      type:
+        node: Нөктә
+        way: Һыҙат
+        relation: Мөнәсәбәт
+        changeset: Төҙәтеүҙәр пакеты
+        note: Иҫкәрмә
+    timeout:
+      sorry: Ғәфү итегеҙ, %{id}-тағы %{type} өсөн мәғлүмәттәр күсереү өсөн бик оҙон.
+      type:
+        node: Нөктә
+        way: Һыҙат
+        relation: Мөнәсәбәт
+        changeset: Төҙәтеүҙәр пакеты
+        note: Иҫкәрмә
+    redacted:
+      redaction: ' %{id} редакцияһы'
+      message_html: Был объекттың версияһы %{version} %{type}-нан алынған һәм күрһәтелә
+        алмай. Өҫтәмә мәғлүмәт өсөн  %{redaction_link} ҡарағыҙ.
+      type:
+        node: Нөктә
+        way: Һыҙат
+        relation: Мөнәсәбәт
+    start_rjs:
+      feature_warning: Объекттарҙың %{num_features}-ын күсереп алыу мотлаҡ, был брауҙерығыҙҙы
+        яйлатыуы мөмкин. Ошо мәғлүмәттәрҙе ысынлап та ҡарарға теләйһегеҙме?
+      load_data: Мәғлүмәттәрҙе күсерергә
+    tag_details:
+      tags: Тегтар
+      wiki_link:
+        key: ' %{key} тегы битен һүрәтләүсе вики бите'
+        tag: ' %{key}=%{value} тегы битен һүрәтләүсе вики бите'
+      wikidata_link: Викимәғлүмәттәрҙәге %{page} элементы
+      wikipedia_link: ' Википедиялағы %{page} мәҡәләһе'
+      telephone_link: Шылтыратырға %{phone_number}
+    note:
+      title: ' %{id} искәрмәһе'
+      new_note: Яңы мәҡәлә
+      description: Тасуирлама
+      open_title: 'Эшкәртелмәгән мәҡәлә #%{note_name}'
+      closed_title: 'Эшкәртелгән мәҡәләа #%{note_name}'
+      hidden_title: 'Йәшерелгән яҙма #%{note_name}'
+      open_by: Ҡулланыусы тарафынан булдырылған %{user} <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      open_by_anonymous: Аноним тарафынан булдырылған <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      commented_by: Ҡулланыусы комментарийы %{user} <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      commented_by_anonymous: Аноним комментарийы  <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      closed_by: Ҡулланыусы тарафынан эшкәртелгән %{user} <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      closed_by_anonymous: Аноним тарафынан рөхсәт ителгән <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      reopened_by: Ҡулланыусы тарафынан ҡабаттан асылған %{user} <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      reopened_by_anonymous: Аноним тарафынан ҡабаттан асылған <abbr title='%{exact_time}'>%{when}
+        кирегә</abbr>
+      hidden_by: Йәшерелгән %{user} <abbr title='%{exact_time}'>%{when} кирегә</abbr>
+    query:
+      title: Объекттар тураһында мәғлүмәт
+      introduction: Яҡындағы объекттарҙы табыу өсөн картаға баҫығыҙ
+      nearby: Яҡындағы объекттар
+      enclosing: Урыны
+  changeset:
+    changeset_paging_nav:
+      showing_page: ' %{page} бите'
+      next: Киләһе »
+      previous: Алдағы
+    changeset:
+      anonymous: Аноним
+      no_edits: (төҙәтеүҙәр юҡ)
+      view_changeset_details: Төҙәтеүҙәр пакетының тәфсирен ҡарап сығырға
+    changesets:
+      id: ID
+      saved_at: Тамамланған
+      user: Ҡулланыусы
+      comment: Комментарий
+      area: Өлкә
+    list:
+      title: Төҙәтеүҙәр пакеты
+      title_user: ' %{user} ҡулланыусыһының төҙәтеүҙәр пакеты'
+      title_friend: Дуҫтарығыҙҙың төҙәтеүҙәре пакеты
+      title_nearby: Эргәләге ҡатнашыусыларҙың төҙәтеүҙәре пакеты
+      empty: Төҙәтеүҙәр пакеты табылманы
+      empty_area: Был өлкәлә төҙәтеүҙәр пакеты юҡ
+      empty_user: Был ҡулланыусының төҙәтеүҙәре пакеы юҡ
+      no_more: Башҡаса бер ниндәй ҙә төҙәтеүҙәр пакеты табылманы
+      no_more_area: Был өлкәлә башҡа төҙәтеүҙәр пакеты юҡ
+      no_more_user: Был ҡулланыусының башҡа төҙәтеүҙәре пакеы юҡ
+      load_more: Тағы ла күсерергә
+    timeout:
+      sorry: Үкенескә күрә, һеҙ һораған төҙәтеүҙәр пакеты исемлеге күсереү өсөн бик
+        оҙон
+    rss:
+      title_all: OpenStreetMap төҙәтеүҙәр пакеты буйынса фекерләшеү
+      title_particular: ' OpenStreetMap #%{changeset_id} төҙәтеүҙәр пакеты буйынса
+        фекерләшеү'
+      commented_at_html: Яңыртылған%{}элек
+      commented_at_by_html: Яңыртылған%{}элек %{ҡулланыусы}тарафынан
+      full: Бөтөн фекерләшеү
+  diary_entry:
+    new:
+      title: Яңы көндәлеккә инеү
+      publish_button: Баҫтырырға
+    list:
+      title: Көндәлектәр
+      title_friends: Дуҫтарың көндәлектәре
+      title_nearby: Йәнәш ҡатнашыусылар көндәлеге
+      user_title: '%{ҡулланыусы} көндәлеге'
+      in_language_title: Көндәлектәге яҙмалар %{телдә}
+      new_title: Көндәлегеңә яңы яҙма яҙ
+      no_entries: Көндәлектә яңы яҙма юҡ
+      recent_entries: Һуңғы яҙмалар
+      older_entries: Иҫкерәк яҙмалар
+      newer_entries: Яңыраҡ яҙмалар
+    edit:
+      title: Яҙманы мөхәррирләү
+      body: Нигеҙ текст
+      language: 'Тел:'
+      latitude: Географик киңлек
+      longitude: Географик оҙонлоҡ
+      use_map_link: картаны ҡуллан
+      save_button: Һаҡларға
+      marker_text: Көндәлек яҙыу урыны
+    view:
+      title: '%{ҡулланыусы}ның көндәлеге|%{титул}'
+      user_title: '%{ҡулланыусы}ның көндәлеге'
+      leave_a_comment: Фекер ҡалдыр
+      login_to_leave_a_comment: Фекер яҙыу өсөн %{login_link}
+    no_such_entry:
+      title: Бындай көндәлек яҙыуы юҡ
+      heading: '%{id} шәхси яҙыуына инеп булмай'
+      body: Ҡыҙғанысҡа ҡаршы, %{id}шәхси яҙыуы йәки фекере табылманы. Дөрөҫ яҙылышын
+        тикшер. Яңылыш ссылкаға күскәнһең, ахыры.
+    diary_entry:
+      posted_by: Ебәрҙем%{link_user}%{created}, тел:%{language_link}
+      comment_link: Фекереңде яҙ
+      reply_link: Инеүеңде раҫла
+      comment_count:
+        other: нуль=фекерҙәр юҡ
+      edit_link: Был яҙманы үҙгәрт
+      hide_link: Был яҙманы йәшер
+    diary_comment:
+      comment_from: '%{link_user}тарафынан%{comment_created_at}көндө ҡаралған'
+      hide_link: Был фекерҙе йәшереү
+    feed:
+      user:
+        title: '%{user}өсөн OpenStreetMap көндәлеге яҙмаһы'
+        description: '%{user}өсөн OpenStreetMap көндәлек яҙмаһының һуңғыһы'
+      language:
+        title: '%{language_name} OpenStreetMap көндәлек яҙмаһы'
+        description: OpenStreetMap ҡулланыусыларының %{language_name}тағы һуңғы яҙмалары
+      all:
+        title: OpenStreetMap көндәлек яҙмаһы
+        description: OpenStreetMap ҡулланысыларының һуңғы көндәлек яҙмалары
+    comments:
+      has_commented_on: '%{display_name} әле генә  көндәлектең ошо яҙмаһына фекер
+        яҙҙы'
+      post: Йәшереү
+      when: ҡасан
+      ago: '%{ago}элек'
+      newer_comments: Яңыраҡ фекерҙәр
+      older_comments: Иҫкерәк фекерҙәр
+  export:
+    title: Сығарырға
+    start:
+      area_to_export: Сығарыу яланы
+      manually_select: Башҡа өлкәне ҡулдан һайларға
+      format_to_export: Сығарыу форматы
+      osm_xml_data: Биремдең OpenStreetMap XML форматы
+      map_image: Карта һүрәте (стандарт ҡатламды күрһәтә)
+      embeddable_html: Ҡуйылған HTML
+      licence: Лицензия
+      too_large:
+        planet:
+          title: OSM планетаһы
+      max: макс.
+      image_size: Һүрәт ҙурлығы
+      add_marker: Картаға билдә ҡуйыу
+      latitude: 'Киңлек:'
+      longitude: 'Оҙонлоҡ:'
+      paste_html: Сайтҡа индереп ҡуйыу өсөн HTML-код
+  geocoder:
+    search:
+      title:
+        latlon: |2-
+
+          <a href="http://openstreetmap.org/">эсендәге һөҙөмтәләр</a>
+        uk_postcode: <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>һөҙөмтәләре
+        ca_postcode: <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>алынған
+          һөҙөмтәләр
+        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>нан сыҡҡан һөҙөмтәләр
+        geonames: <a href="http://www.geonames.org/">GeoNames</a>нан сыҡҡан һөҙөмтәләр
+        osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>нан һөҙөмтәләр
+        geonames_reverse: <a href="http://www.geonames.org/">GeoNames</a>нан сыҡҡан
+          һөҙөмтәләр
+    search_osm_nominatim:
+      prefix:
+        aerialway:
+          cable_car: Канат юлы
+          chair_lift: Креслолы канат күтәргесе
+          drag_lift: Якорлы (бугеллы) күтәргес
+          gondola: Канат юлы
+          station: Канат күтәргесе станцияһы
+        aeroway:
+          aerodrome: Аэродром
+          apron: Перрон
+          gate: Ҡапҡа (аэропорт)
+          helipad: Вертолет майҙансығы
+          runway: Осоу-ултырыу юлы
+          taxiway: Рулләү юлы
+          terminal: Терминал
+        amenity:
+          animal_shelter: Хайуандар приюты
+          arts_centre: Сәнғәт йорто
+          atm: Банкомат
+          bank: Банк
+          bar: Бар
+          bbq: Барбекю
+          bench: Эскәмйә
+          bicycle_parking: Велопарковка
+          bicycle_rental: Велосипед прокаты
+          biergarten: Асыҡ һауалағы һырахана
+          boat_rental: Прокатҡа кәмәләр
+          brothel: Фәхешхана
+          bureau_de_change: Валюта алмаштырыу
+          bus_station: Автобус станцияһы
+          cafe: Кафе
+          car_rental: Автомобиль арендалау
+          car_sharing: Автомобилдәрҙе аралаш ҡулланыу
+          car_wash: Авто-йыуыу
+          casino: Казино
+          charging_station: Автомобилдәрҙе зарядлау станцияһы
+          childcare: Бала ҡарау хеҙмәте
+          cinema: Кинотеатр
+          clinic: Поликлиника
+          clock: Сәғәт
+          college: Колледж
+          community_centre: Йәмәғәти үҙәк
+          courthouse: Суд бинаһы
+          crematorium: Крематорий
+          dentist: Стоматология
+          doctors: Табибтар
+          drinking_water: Эсәр һыу
+          driving_school: Автошкола
+          embassy: Илселек
+          fast_food: Фаст-фуд
+          ferry_terminal: Паром станцияһы
+          fire_station: Янғын һүндереү һағы
+          food_court: Ресторан ихатаһы
+          fountain: Фонтан
+          fuel: Заправка
+          gambling: Уйын йорто
+          grave_yard: Зыярат
+          hospital: Госпиталь
+          hunting_stand: Һунарсы вышкаһы
+          ice_cream: Туңдырма
+          kindergarten: Балалар баҡсаһы
+          marketplace: Баҙар
+          motorcycle_parking: Мотоцикл парковкаһы
+          nightclub: Төнгө клуб
+          nursing_home: Ҡарттар йорто
+          parking: Туҡталҡа
+          parking_entrance: Туҡталҡаға инеү
+          pharmacy: Дарыухана
+          place_of_worship: Ғибәҙәт ҡылыу урыны
+          police: Полиция
+          post_box: Почта йәшниге
+          post_office: Почта бүлексәһе
+          preschool: Мәктәпкәсә уҡытыу учреждениеһы
+          prison: Төрмә
+          pub: Һырахана
+          public_building: Йәмғиәти бина
+          recycling: Киренән эшкәртеү урыны
+          restaurant: Ресторан
+          retirement_home: Ҡарттар йорто
+          sauna: Сауна
+          school: Мәктәп
+          shelter: Йәшенеү урыны
+          shower: Душ
+          social_centre: Йәмғиәти үҙәк
+          social_club: Берләшмә
+          social_facility: Йәмәғәт ойошмаһы
+          studio: Студия
+          swimming_pool: Бассейн
+          taxi: Такси
+          telephone: Телефон
+          theatre: Театр
+          toilets: Бәҙрәф
+          townhall: Ҡала администрацияһы
+          university: Университет
+          vending_machine: Сауҙа автоматы
+          veterinary: Ветеринар клиника
+          village_hall: Утар
+          waste_basket: Сүп һауыты
+          waste_disposal: ҡалдыҡтарҙы юҡ итеү
+          youth_centre: Йәштәр үҙәге
+        boundary:
+          administrative: административ сик
+          census: иҫәп алыу участогының сиге
+          national_park: Милли парк
+          protected_area: Һаҡлы район
+        bridge:
+          aqueduct: Һыу каналы
+          suspension: Аҫылма күпер
+          swing: Айырсалы күпер
+          viaduct: Юл һуҙымы
+          "yes": Күпер
+        building:
+          "yes": Бина
+        craft:
+          brewery: Һыра заводы
+          carpenter: Балта оҫтаһы
+          electrician: Электрик
+          gardener: Баҡсасы
+          painter: Рәссам
+          plumber: Сантехник
+          shoemaker: Итексе
+          tailor: Тегенсе
+          "yes": Ҡул эштәре магазины
+        emergency:
+          ambulance_station: Тиҙ ярҙам станцияһы
+          defibrillator: Дефибриллятор
+          landing_site: Авария мәлендә ултырыу урыны
+          phone: Тиҙ бәйләнеш телефоны
+        highway:
+          abandoned: Ташландыҡ юл
+          bridleway: Атта йөрөү юлы
+          bus_guideway: Автобус рельс-юлы
+          bus_stop: Автобус туҡталышы
+          construction: Ремонт барған юл
+          cycleway: Велосипед юлы
+          elevator: Лифт
+          emergency_access_point: Ашығыс ярҙам пункты
+          footway: Тротуар
+          ford: Йөҙөп сығыу урыны
+          living_street: Кеше йәшәгән урам
+          milestone: Километр бағанаһы
+          motorway: Автомагистраль
+          motorway_junction: Автомагистраль киҫелеше
+          motorway_link: Автомагистраль айырсаһы
+          path: Һуҡмаҡ
+          pedestrian: Йәйәүле юлы
+          platform: Платформа
+          primary: Төп юл
+          primary_link: Төп юл
+          proposed: Тәҡдим ителгән юл
+          raceway: Уҙышыу юлы
+          residential: Урам юлы
+          rest_area: Ял итеү зонаһы
+          road: Юл
+          secondary: Ярҙамсы юл
+          secondary_link: Ҡушылған юл
+          service: Килеп туҡтау юлы
+          services: Юл яны хеҙмәттәре
+          speed_camera: Радар
+          steps: Баҫҡыстар
+          street_lamp: Урам фонары
+          tertiary: Ауыл араһы юлы
+          tertiary_link: Сиҙәм юлы
+          track: Ауыл юлы
+          traffic_signals: Светофор
+          trail: Һуҡмаҡ
+          trunk: Төп юл
+          trunk_link: Магистраль
+          unclassified: Урындағы юл
+        historic:
+          archaeological_site: Археологик ҡаҙыныуҙар
+          battlefield: Һуғыш яланы
+          boundary_stone: Сик буйы ташы
+          building: Тарихи бина
+          bunker: Бункер
+          castle: Ҡәлғә
+          church: Сиркәү
+          city_gate: Ҡала ҡапҡаһы
+          citywalls: Тарихи нығытма
+          fort: Ҡойма
+          heritage: Мәҙәни мираҫ
+          house: Йорт
+          icon: Тәре
+          manor: Поместье
+          memorial: Һәйкәл
+          mine: Карьер
+          monument: Монумент
+          roman_road: Рим юлы
+          ruins: Емереклектәр
+          stone: Таш
+          tomb: Ҡәбер
+          tower: Башня
+          wayside_cross: Юл яны тәреһе
+          wayside_shrine: Юл яны ғибәҙәтханаһы
+          wreck: Батҡан кәмә остоғо
+        junction:
+          "yes": Юл киҫелеше
+        landuse:
+          allotments: Баҡсалар
+          basin: Бассейн
+          brownfield: Төҙөлөш өсөн таҙартыу
+          cemetery: Ҡәберлек
+          commercial: Һатыу итеү яланы
+          conservation: Заповедник
+          construction: Төҙөлөш
+          farm: Ферма
+          farmland: Ауыл хужалығы ерҙәре
+          farmyard: Ауыл хужалығы ихаталары
+          forest: Урман хужалығы
+          garages: Гараждар
+          grass: Үлән
+          greenfield: Үҙләштерелмәгән урын
+          industrial: Промзона
+          landfill: Сүплек
+          meadow: Туғай
+          military: Хәрби биләмә
+          orchard: Емеш баҡсаһы
+          quarry: Карьер
+          railway: Тимер юл
+          recreation_ground: Ял итеү урыны
+          reservoir: Һыу һаҡлағыс
+          reservoir_watershed: Һыу һаҡлағыстың һыу айырсаһы
+          residential: Йәшәү районы
+          retail: Һатыу итеү биләмәһе
+          road: Юл селтәре зонаһы
+          village_green: Йәшел ауыл
+          vineyard: Йөҙөм баҡсаһы
+          "yes": Ерҙе ҡулланыу
+        leisure:
+          beach_resort: Үҫентеле пляж
+          bird_hide: Йәшерен ултырғыс (ҡоштарҙы күҙәтеү өсөн)
+          common: Альменда
+          dog_park: Эт өсөн майҙансыҡ
+          fishing: Балыҡ тотоу
+          fitness_centre: Фитнес-үҙәк
+          fitness_station: Фитнес-станция
+          garden: Баҡса
+          golf_course: Гольф яланы
+          horse_riding: Ат базаһы
+          ice_rink: Һырғалаҡ
+          marina: Яхталар пристане
+          miniature_golf: Минигольф
+          nature_reserve: Заповедник
+          park: Парк
+          pitch: Спорт майҙансығы
+          playground: Балаларҙың уйын майҙансығы
+          resort: Ҡотҡарыу ҡоралы
+          sauna: Сауна
+          slipway: Эллинг
+          sports_centre: Спорт үҙәге
+          stadium: Стадион
+          swimming_pool: Бассейн
+          track: Спорт юлы
+          water_park: Аквапарк
+          "yes": Буш ваҡыт
+        man_made:
+          lighthouse: Маяҡ
+          pipeline: Торба юлы
+          works: Фабрика
+          "yes": Кеше ҡулы менән яһалған
+        military:
+          airfield: Хәрби аэродром
+          barracks: Казармалар
+        mountain_pass:
+          "yes": Үткәүел
+        natural:
+          bay: Ҡултыҡ
+          beach: Пляж
+          cape: Морон
+          cave_entrance: Мәмерйәгә инеү
+          cliff: Ҡая упҡыны
+          crater: Кратер
+          dune: Дюна
+          fell: Ҡаҡ тау түбәһе
+          fjord: Ҡултыҡ
+          forest: Урман
+          geyser: Гейзер
+          glacier: Боҙлоҡ
+          grassland: Туғай
+          heath: Вереск үҫкән ялан
+          hill: Тау түбәһе
+          island: Утрау
+          land: Ер
+          marsh: Үләнле һаҙлыҡ
+          moor: Тау һаҙлығы
+          mud: Батҡаҡ
+          peak: Тау түбәһе
+          point: Морон
+          reef: Риф
+          ridge: Һырт
+          rock: Ҡая
+          saddle: Артылыш
+          sand: Ҡом
+          scree: Таш ҡойолоуы
+          scrub: Ҡыуаҡлыҡ
+          spring: Шишмә
+          strait: Боғаҙ
+          tree: Ағас
+          valley: Үҙән
+          volcano: Вулкан
+          water: Һыу
+          wetland: Һаҙлыҡлы урын
+          wood: Урман
+        office:
+          accountant: Бухгалтер
+  javascripts:
+    share:
+      only_standard_layer: Бары стандарт ҡатлам ғына һүрәт кеүек экспортлана ала
+    embed:
+      report_problem: Проблема хаҡында хәбәр итергә
+...
index 2b22016686dd55e2f4b349fd0d622245c430ba7a..2cc578fbef98944b27402fc1972a33b791c671fc 100644 (file)
@@ -260,7 +260,7 @@ be-Tarask:
       map_image: Выява мапы (паказвае стандартны слой)
       embeddable_html: HTML-код для ўстаўкі
       licence: Ліцэнзія
-      export_details: Зьвесткі OpenStreetMap даступныя на ўмовах ліцэнзіі <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: Зьвесткі OpenStreetMap даступныя на ўмовах ліцэнзіі <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL).
       too_large:
         body: 'Гэты абшар занадта вялікі для экспарту ў фармаце XML OpenStreetMap.
@@ -283,10 +283,10 @@ be-Tarask:
   geocoder:
     search:
       title:
-        latlon: Вынікі з <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Вынікі з <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Вынікі з <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Вынікі з <a href="http://geocoder.ca/">Geocoder.CA</a>
+        ca_postcode: Вынікі з <a href="https://geocoder.ca/">Geocoder.CA</a>
         osm_nominatim: Вынікі з <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Вынікі з <a href="http://www.geonames.org/">GeoNames</a>
@@ -321,29 +321,22 @@ be-Tarask:
           crematorium: Крэматорый
           dentist: Стаматалёгія
           doctors: Дактары
-          dormitory: Інтэрнат
           drinking_water: Пітная вада
           driving_school: Аўташкола
           embassy: Амбасада
-          emergency_phone: Тэлефон для экстранных выклікаў
           fast_food: Забягайлаўка
           ferry_terminal: Паромная станцыя
-          fire_hydrant: Пажарны гідрант
           fire_station: Пажарны пастарунак
           fountain: Фантан
           fuel: Запраўка
           grave_yard: Могілкі
-          gym: Фітнэс цэнтар /Трэнажорны зал
-          health_centre: Цэнтар здароўя
           hospital: Шпіталь
           hunting_stand: Паляўнічая вежа
           ice_cream: Марозіва
           kindergarten: Дзіцячы садок
           library: Бібліятэка
-          market: Рынак
           marketplace: Рынкавая плошча
           nightclub: Начны клюб
-          nursery: Дзіцячы пакой
           nursing_home: Дом састарэлых
           office: Офіс
           parking: Стаянка
@@ -356,7 +349,6 @@ be-Tarask:
           prison: Турма
           pub: Шынок
           public_building: Грамадзкі будынак
-          reception_area: Прыёмная
           recycling: Месца перапрацоўкі адыходаў
           restaurant: Рэстаран
           retirement_home: Дом састарэлых
@@ -413,7 +405,6 @@ be-Tarask:
           trunk: Шаша
           trunk_link: Шаша
           unclassified: Дарога раённага значэньня
-          unsurfaced: Дарога без пакрыцьця
         historic:
           archaeological_site: Археалягічныя раскопкі
           battlefield: Поле гістарычнай бойкі
@@ -529,7 +520,6 @@ be-Tarask:
           government: Дзяржаўная ўстанова
           insurance: Страхавое бюро
         place:
-          airport: Аэрапорт
           city: Горад
           country: Краіна
           county: Раён
@@ -541,7 +531,6 @@ be-Tarask:
           islet: Выспачка
           isolated_dwelling: Ізаляванае жытло
           locality: Населены пункт
-          moor: Тарфянік
           municipality: Муніцыпалітэт
           postcode: Паштовы індэкс
           region: Рэгіён
@@ -556,10 +545,8 @@ be-Tarask:
           abandoned: Пакінутая чыгуначная лінія
           construction: Будаўніцтва чыгункі
           disused: Пакінутая чыгунка
-          disused_station: Пакінутая чыгуначная станцыя
           funicular: Фунікулёр
           halt: Чыгуначны прыпынак
-          historic_station: Гістарычная чыгуначная станцыя
           junction: Чыгуначны вузел
           level_crossing: Чыгуначны пераезд
           light_rail: Лінія для лёгкага чыгуначнага транспарту
@@ -619,7 +606,6 @@ be-Tarask:
           hairdresser: Цырульня
           hardware: Гаспадарчыя тавары
           hifi: Крама аўдыё/відэё тэхнікі
-          insurance: Страхаваньне
           jewelry: Ювэлірная крама
           kiosk: Шапік
           laundry: Пральня
@@ -634,9 +620,7 @@ be-Tarask:
           outdoor: Выязны гандаль
           pet: Зоалягічная крама
           photo: Фотакрама
-          salon: Салён
           shoes: Крама абутку
-          shopping_centre: Гандлёвы цэнтар
           sports: Спартовая крама
           stationery: Канцтавары
           supermarket: Супэрмаркет
index a60883a64ebaf7de8d48c2d2e333628bd325bfa4..56a2cdb5f387d73c5aae32547863e241365c93fa 100644 (file)
@@ -443,33 +443,26 @@ be:
           crematorium: Крэматорый
           dentist: Стаматолагія
           doctors: Лекары
-          dormitory: Інтэрнат
           drinking_water: Пітная вада
           driving_school: Аўташкола
           embassy: Амбасада
-          emergency_phone: Тэлефон экстранай сувязі
           fast_food: Фаст-Фуд
           ferry_terminal: Паромны тэрмінал
-          fire_hydrant: Пажарны гідрант
           fire_station: Пажарная станцыя
           food_court: Фуд-Корт
           fountain: Фантан
           fuel: АЗС
           gambling: Азартныя гульні
           grave_yard: Могілкі
-          gym: Фітнес-цэнтр ці Трэнажорная зала
-          health_centre: Медыцынскі цэнтр
           hospital: Бальніца
           hunting_stand: Паляўнічая вежа
           ice_cream: Марозіва
           kindergarten: Дзіцячы сад
           library: Бібліятэка
-          market: Рынак
           marketplace: Рыначная плошча
           monastery: Кляштар
           motorcycle_parking: Паркоўка для матацыклаў
           nightclub: Начны клуб
-          nursery: Яслі
           nursing_home: Прыватная лякарня
           office: Офіс
           parking: Паркоўка
@@ -483,7 +476,6 @@ be:
           prison: Турма
           pub: Паб
           public_building: Грамадскі будынак
-          reception_area: Зона прыёму
           recycling: Пункт перапрацоўкі
           restaurant: Рэстаран
           retirement_home: Дом састарэлых
@@ -579,7 +571,6 @@ be:
           trunk: Шаша
           trunk_link: Магістраль
           unclassified: Некласіфікаваная дарога
-          unsurfaced: Дарога без пакрыцця
           "yes": Дарога
         historic:
           archaeological_site: Археалагічныя раскопы
@@ -644,7 +635,6 @@ be:
         leisure:
           beach_resort: Пляжны курорт
           bird_hide: Засада
-          club: Клуб
           common: Агульная зямля
           dog_park: Пляцоўка для сабак
           fishing: Раён рыбалоўства
@@ -737,8 +727,6 @@ be:
           "yes": Офіс
         place:
           allotments: Сады-агароды
-          block: Блок
-          airport: Аэрапорт
           city: Горад
           country: Краіна
           county: Акруга
@@ -750,7 +738,6 @@ be:
           islet: Астравок
           isolated_dwelling: Ізаляванае жыллё
           locality: Мясцовасць
-          moor: Швартоўка
           municipality: Муніцыпалітэт
           neighbourhood: Наваколле
           postcode: Паштовы індэкс
@@ -767,10 +754,8 @@ be:
           abandoned: Закінутая чыгунка
           construction: Будаўніцтва чыгункі
           disused: Закінутая чыгунка
-          disused_station: Закінуты чыгуначны вакзал
           funicular: Фунікулер
           halt: Чыгуначны прыпынак
-          historic_station: Гістарычны чыгуначны вакзал
           junction: Чыгуначны вузел
           level_crossing: Чыгуначны пераезд
           light_rail: Хуткасны трамвай
@@ -834,7 +819,6 @@ be:
           hairdresser: Цырульнік
           hardware: Гаспадарчая крама
           hifi: Аўдыётэхніка
-          insurance: Страхаванне
           jewelry: Ювелірная крама
           kiosk: Кіёск
           laundry: Пральня
@@ -850,10 +834,8 @@ be:
           pet: Заалагічная крама
           pharmacy: Аптэка
           photo: Фота майстэрня
-          salon: Салон
           second_hand: Крама патрыманых рэчаў
           shoes: Абутковая крама
-          shopping_centre: Гандлёвы цэнтр
           sports: Спартыўная крама
           stationery: Крама канцылярскіх тавараў
           supermarket: Супермаркет
@@ -2363,9 +2345,6 @@ be:
         mapquest_car: Аўтамабіль (MapQuest)
         mapquest_foot: Пешшу (MapQuest)
         osrm_car: Аўтамабіль (OSRM)
-        mapzen_bicycle: Веласіпед (Mapzen)
-        mapzen_car: Аўтамабіль (Mapzen)
-        mapzen_foot: Пешшу (Mapzen)
       descend: Уніз
       directions: Маршрут
       distance: Адлегласць
index 56547d3636acd9051eead8d8084b92d1fb060b80..005236535e813543cb1a589bda9a0a64c6b996f5 100644 (file)
@@ -341,25 +341,20 @@ bg:
           crematorium: Крематориум
           dentist: Зъболекар
           doctors: Лекари
-          dormitory: Пансион
           drinking_water: Питейна вода
           driving_school: Автошкола
           embassy: Посолство
-          emergency_phone: Телефон за спешни повиквания
           fast_food: Заведения за бързо хранене
           ferry_terminal: Фериботен терминал
-          fire_hydrant: Пожарен кран
           fire_station: Пожарна станция
           fountain: Фонтан
           fuel: Гориво
           gambling: Хазартни игри
           grave_yard: Гробище
-          gym: Фитнес зала
           hospital: Болница
           ice_cream: Сладолед
           kindergarten: Детска градина
           library: Библиотека
-          market: Пазар
           marketplace: Пазар
           monastery: Манастир
           nightclub: Нощен клуб
@@ -374,7 +369,6 @@ bg:
           prison: Затвор
           pub: Кръчма
           public_building: Обществена сграда
-          reception_area: Рецепция
           restaurant: Ресторант
           retirement_home: Старчески дом
           sauna: Сауна
@@ -455,7 +449,6 @@ bg:
           traffic_signals: Светофар
           trunk: Междуградски път
           trunk_link: Междуградски път
-          unsurfaced: Път без настилка
           "yes": Път
         historic:
           archaeological_site: Разкопки
@@ -510,7 +503,6 @@ bg:
           vineyard: Лозя
         leisure:
           beach_resort: Морски курорт
-          club: Клуб
           dog_park: Парк за кучета
           fishing: Място за риболов
           fitness_centre: Фитнес център
@@ -582,7 +574,6 @@ bg:
           "yes": Офис
         place:
           allotments: Градини
-          airport: Летище
           city: Град
           country: Страна
           county: Област
@@ -592,7 +583,6 @@ bg:
           houses: Къщи
           island: Остров
           islet: Островче
-          moor: Тресавище
           municipality: Община
           neighbourhood: Квартал
           postcode: Пощенски код
@@ -607,9 +597,7 @@ bg:
           abandoned: Изоставена железопътна линия
           construction: Железопътна линия в строеж
           disused: Изоставена ж.п. линия
-          disused_station: изоставена гара
           halt: Железопътна спирка
-          historic_station: Гара с историческо значение
           junction: Железопътен възел
           level_crossing: Прелез
           light_rail: Лека железница
@@ -650,7 +638,6 @@ bg:
           greengrocer: Плод и зеленчук
           grocery: Магазин за хранителни стоки
           hairdresser: Фризьорски салон
-          insurance: Застраховане
           jewelry: Бижутериен магазин
           laundry: Пералня
           mall: Търговски център
@@ -662,7 +649,6 @@ bg:
           pharmacy: Аптека
           photo: Фотомагазин
           shoes: Магазин за обувки
-          shopping_centre: Търговски център
           sports: Спортен магазин
           stationery: Канцеларски материали
           supermarket: Супермаркет
@@ -856,10 +842,10 @@ bg:
       unread_button: Отбелязване като непрочетено
       read_button: Отбелязване като прочетено
       reply_button: Отговор
-      delete_button: Ð\98зÑ\82Ñ\80ий
+      delete_button: Ð\98зÑ\82Ñ\80иване
     new:
-      title: Ð\98зпÑ\80аÑ\82еÑ\82е съобщение
-      send_message_to: Ð\98зпÑ\80аÑ\82еÑ\82е ново съобщение на %{name}
+      title: Ð\98зпÑ\80аÑ\89ане Ð½Ð° съобщение
+      send_message_to: Ð\98зпÑ\80аÑ\89ане ново съобщение на %{name}
       subject: Тема
       body: Текст
       send_button: Изпращане
@@ -904,7 +890,7 @@ bg:
       get_directions_title: Намерете маршрут между две точки
       from: От
       to: До
-      where_am_i: Къде съм аз?
+      where_am_i: Къде е това?
       submit_text: Напред
     key:
       table:
@@ -934,19 +920,19 @@ bg:
           - терминал
           admin: Административна граница
           forest: Гора
-          wood: Ð\9bеÑ\81
+          wood: Ð\94Ñ\8aÑ\80веÑ\82а
           golf: Игрище за голф
           park: Парк
           resident: Жилищна зона
           common:
             1: ливада
-          retail: Ð\97она Ð·Ð° Ñ\82Ñ\8aÑ\80говиÑ\8f Ð½Ð° Ð´Ñ\80ебно
+          retail: Ð¢Ñ\8aÑ\80говÑ\81ка Ð·Ð¾Ð½Ð°
           industrial: Промишлена зона
           commercial: Търговска зона
           heathland: Пустош
           lake:
           - Езеро
-          farm: Ð\97емеделÑ\81ко Ñ\81Ñ\82опанÑ\81Ñ\82во
+          farm: Ð¤ÐµÑ\80ма
           brownfield: Място за строеж
           cemetery: Гробище
           allotments: Градини
@@ -1294,9 +1280,6 @@ bg:
         mapquest_car: Кола (MapQuest)
         mapquest_foot: Пеша (MapQuest)
         osrm_car: Кола (OSRM)
-        mapzen_bicycle: Велосипед (Mapzen)
-        mapzen_car: Кола (Mapzen)
-        mapzen_foot: Пеша (Mapzen)
       directions: Насоки
       distance: Разстояние
       instructions:
index 8d9eb017b2f5a074f19ddebc72b90af157ce061e..a02d8fc40f4f5bce49d6fa08c9778ca0c8a64fc9 100644 (file)
@@ -8,6 +8,7 @@
 # Author: Elias Ahmmad
 # Author: Kayser Ahmad
 # Author: Nasir8891
+# Author: R4bb1
 # Author: Rasal Lia
 # Author: Sayma Jahan
 # Author: Tauhid16
@@ -386,8 +387,8 @@ bn:
         osm_nominatim: <a href="http://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ
           নমিনাতিম</a> থেকে ফলাফল
         geonames: <a href="http://www.geonames.org/">জিওনেমস</a> থেকে ফলাফল
-        osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ
-          নমিনাতিম</a> থেকে ফলাফল
+        osm_nominatim_reverse: <a href="https://nominatim.openstreetmap.org/">ওপেনস্ট্রীটম্যাপ
+          Nominatim</a> থেকে ফলাফল
         geonames_reverse: <a href="http://www.geonames.org/">জিওনেমস</a> থেকে ফলাফল
     search_osm_nominatim:
       prefix:
@@ -433,33 +434,26 @@ bn:
           crematorium: শ্মশান
           dentist: দন্তচিকিৎসক
           doctors: ডাক্তার
-          dormitory: ছাত্রাবাস
           drinking_water: পানীয় জল
           driving_school: ড্রাইভিং স্কুল
           embassy: দূতাবাস
-          emergency_phone: জরুরি ফোন
           fast_food: ফাস্ট ফুড
           ferry_terminal: ফেরিঘাট
-          fire_hydrant: ফায়ার হাইড্র্যান্ট
           fire_station: অগ্নি নির্বাপন কেন্দ্র
           food_court: খাবার দোকান
           fountain: ঝরনা
           fuel: জ্বালানি
           gambling: জুয়াখেলার আড্ডা
           grave_yard: কবরস্থান
-          gym: ব্যায়াম কেন্দ্র / জিমখানা
-          health_centre: স্বাস্থকেন্দ্র
           hospital: হাসপাতাল
           hunting_stand: শিকারশালা
           ice_cream: আইসক্রিম
           kindergarten: শিশুবিদ্যালয়
           library: পাঠাগার
-          market: বাজার
           marketplace: নগরচত্বর
           monastery: আশ্রম
           motorcycle_parking: মোটরসাইকেল  পার্কিং
           nightclub: নৈশক্লাব
-          nursery: শিশুশালা
           nursing_home: নার্সিংহোম
           office: দপ্তর
           parking: পার্কিং
@@ -473,7 +467,6 @@ bn:
           prison: কারাগার
           pub: মদ্যশালা
           public_building: সরকারি ভবন
-          reception_area: অভ্যর্থন এলাকা
           restaurant: রেঁস্তোরা
           retirement_home: অবসর গৃহ
           sauna: বাষ্পস্নান
@@ -520,6 +513,7 @@ bn:
           plumber: নল মিস্তিরি
           shoemaker: মুচি
           tailor: দর্জি
+          "yes": কারুকাজ দোকান
         emergency:
           ambulance_station: রুগ্নবাহিকা স্টেশন
           landing_site: জরুরি অবতরণ ক্ষেত্র
@@ -553,11 +547,11 @@ bn:
           street_lamp: রাস্তার বাতি
           tertiary: প্রশাখা সড়ক
           tertiary_link: প্রশাখা সড়ক
+          track: নির্ধারিত পথ
           traffic_signals: ট্রাফিক সংকেত
           trunk: মূল সড়ক
           trunk_link: মূল সড়ক
           unclassified: অশ্রেণীকৃত সড়ক
-          unsurfaced: কাঁচা সড়ক
           "yes": সড়ক
         historic:
           archaeological_site: প্রত্নতাত্ত্বিক স্থান
@@ -612,7 +606,6 @@ bn:
           "yes": ব্যবহার্য ভূমি
         leisure:
           beach_resort: সৈকতীয় রিসোর্ট
-          club: ক্লাব
           common: সাধারণ ভূমি
           dog_park: কুকুর উদ্যান
           fishing: মৎস শিকারের এলাকা
@@ -690,8 +683,6 @@ bn:
           travel_agent: ভ্রমণ দালাল
           "yes": দপ্তর
         place:
-          block: ব্লক
-          airport: বিমানবন্দর
           city: নগর
           country: দেশ
           county: প্রদেশ
@@ -703,7 +694,6 @@ bn:
           islet: ক্ষুদ্র দ্বীপ
           isolated_dwelling: বিচ্ছিন্ন বাসস্থান
           locality: বসতি
-          moor: প্রাস্তর
           municipality: পৌরসভা
           neighbourhood: শহরতলি
           postcode: ডাক সংখ্যা
@@ -720,8 +710,6 @@ bn:
           abandoned: পরিত্যক্ত রেলপথ
           construction: নির্মীয়মাণ রেলপথ
           disused: অব্যবহৃত রেলপথ
-          disused_station: অব্যবহৃত রেল স্টেশন
-          historic_station: ঐতিহাসিক রেল স্টেশন
           junction: রেল জংশন
           monorail: মনোরেল
           narrow_gauge: সংকীর্ণ গেজ রেল
@@ -742,6 +730,7 @@ bn:
           bicycle: বাইসাইকেল দোকান
           books: বইয়ের দোকান
           butcher: মাংসবিক্রেতা
+          car_parts: গাড়ির যন্ত্রাংশ
           carpet: কার্পেটের দোকান
           chemist: রাসায়নবিদ
           clothes: কাপড়ের দোকান
@@ -772,7 +761,6 @@ bn:
           hairdresser: নাপিত
           hardware: যন্ত্রাংশের দোকান
           hifi: হাই-ফাই
-          insurance: বিমা
           jewelry: গহনার দোকান
           laundry: ধোপার দোকান
           mall: মল
@@ -785,10 +773,8 @@ bn:
           organic: জৈব খাদ্যের দোকান
           pharmacy: ঔষধালয়
           photo: ছবির দোকান
-          salon: সালোন
           second_hand: পুরনো-সামগ্রীর দোকান
           shoes: জুতোর দোকান
-          shopping_centre: বিপনি কেন্দ্র
           sports: ক্রীড়াসামগ্রীর দোকান
           stationery: স্টেশনারি দোকান
           supermarket: অধিবিপণী
@@ -942,7 +928,7 @@ bn:
       url: /স্বাগতম
       title: ওএসএম-এ স্বাগতম
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Bn:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: আরম্ভকারী সহায়িকা
     help:
       url: https://help.openstreetmap.org/
@@ -954,7 +940,7 @@ bn:
     irc:
       title: আইআরসি
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
   about_page:
     next: পরবর্তী
@@ -1290,6 +1276,8 @@ bn:
     account:
       current email address: 'বর্তমান ই-মেইল ঠিকানা:'
       new email address: 'নতুন ই-মেইল ঠিকানা:'
+      openid:
+        link: https://wiki.openstreetmap.org/wiki/OpenID
       public editing:
         enabled link text: এটি কী?
       contributor terms:
index d1218b530b39c24ec797b908a187bf25c16bed5f..cf8b37b497dec00f70d4f1128e1d23340b8b8ea9 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Breton (brezhoneg)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: Dishual
 # Author: Fohanno
 # Author: Fulup
 # Author: Gwenn-Ael
@@ -393,7 +394,7 @@ br:
         osm_nominatim: Disoc'hoù diwar <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Disoc'hoù diwar <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Disoc'hoù diwar <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Disoc'hoù diwar <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Disoc'hoù diwar <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -443,33 +444,26 @@ br:
           crematorium: Krematoriom
           dentist: Dentour
           doctors: Mezeien
-          dormitory: Kouskva
           drinking_water: Dour mat da evañ
           driving_school: Skol bleinañ
           embassy: Kannati
-          emergency_phone: Pellgomzer evit an trummadoù
           fast_food: Fast Food
           ferry_terminal: Porzh karrlistri
-          fire_hydrant: Dour evit an tan
           fire_station: Kazarn pomperien
           food_court: ↓Predva
           fountain: Feunteun
           fuel: Trelosk
           gambling: C'hoari
           grave_yard: Bered
-          gym: Fitness/embregerezh-korf
-          health_centre: Kreizenn yec'hed
           hospital: Ospital
           hunting_stand: Stand tennañ
           ice_cream: Dienn skorn
           kindergarten: Liorzh ar vugale
           library: Levraoueg
-          market: Marc'had
           marketplace: Marc'hallac'h
           monastery: Manati
           motorcycle_parking: Parklec'h evit marc'hoù-tan
           nightclub: Klub-noz
-          nursery: Spluseg
           nursing_home: Ti yec'hed
           office: Burev
           parking: Parklec'h
@@ -483,7 +477,6 @@ br:
           prison: Toull-bac'h
           pub: Tavarn
           public_building: Savadur foran
-          reception_area: Takad degemer
           recycling: Lec'h adaozañ
           restaurant: Preti
           retirement_home: Ti-retredidi
@@ -579,7 +572,6 @@ br:
           trunk: Hent-tizh
           trunk_link: Hent-tizh
           unclassified: Hent dirumm
-          unsurfaced: Hent dizolo
           "yes": Hent
         historic:
           archaeological_site: Lec'hienn henoniel
@@ -607,6 +599,7 @@ br:
           wayside_cross: Kroaz
           wayside_shrine: Ti-pediñ
           wreck: Peñse
+          "yes": Lec'h Istorel
         junction:
           "yes": Kej
         landuse:
@@ -644,7 +637,6 @@ br:
         leisure:
           beach_resort: Kêr-gouronkañ
           bird_hide: Bod evned
-          club: Klub
           common: Tachennoù foran
           dog_park: Park chas
           fishing: Takad pesketa
@@ -671,8 +663,13 @@ br:
           water_park: Kreizenn dour
           "yes": Diduamantoù
         man_made:
+          bridge: Pont
+          bunker_silo: Bunker
           lighthouse: Tour-tan
+          mine: Mengleuz
           pipeline: Eoulsan
+          silo: Silo
+          surveillance: Evezh
           tower: Tour
           works: Labouradeg
           "yes": Krouet gant Mab-den
@@ -737,8 +734,6 @@ br:
           "yes": Burev
         place:
           allotments: Liorzhoù tiegezhel
-          block: Blog
-          airport: Aerborzh
           city: Meurgêr
           country: Bro
           county: Kontelezh
@@ -750,12 +745,12 @@ br:
           islet: Enezennig
           isolated_dwelling: Ti distro
           locality: Kêr
-          moor: Lanneg
           municipality: Kumun
           neighbourhood: Ardremez
           postcode: Kod post
           region: Rannvro
           sea: Mor
+          square: Plasenn
           state: Stad
           subdivision: Isrann
           suburb: Karter
@@ -767,10 +762,8 @@ br:
           abandoned: Hent-houarn dilezet
           construction: Hent-houarn war sevel
           disused: Hent-houarn dilezet
-          disused_station: Porzh-houarn dilezet
           funicular: Hent-houarn fundren
           halt: Arsav tren
-          historic_station: Arsav tren istorel
           junction: Kej hent-houarn
           level_crossing: Treuzenn hent-houarn
           light_rail: Hent-houarn bihan
@@ -834,10 +827,10 @@ br:
           hairdresser: Perukenner
           hardware: Stal urzhiataerezh
           hifi: Stal Hi-Fi
-          insurance: Asurañs
           jewelry: Bravigerezh
           kiosk: Kiosk
           laundry: Kanndi
+          lottery: Lotiri
           mall: Palier kenwerzh
           market: Marc'had
           mobile_phone: Stal pellgomzerioù hezoug
@@ -850,10 +843,8 @@ br:
           pet: Stal loened
           pharmacy: Apotikerezh
           photo: Stal luc'hskeudenniñ
-          salon: Saloñs
           second_hand: Stal traoù eildorn
           shoes: Stal voteier
-          shopping_centre: Kreizenn-genwerzh
           sports: Stal sport
           stationery: Paperaerezh
           supermarket: Gourmarc'had
@@ -1887,6 +1878,7 @@ br:
       terms declined: Un druez eo deomp gwelet hoc'h eus nac'het degemer Termenoù
         ar berzhidi nevez. Evit muioc'h a ditouroù, sellit ouzh <a href="%{url}">ar
         bajenn wiki-mañ</a>.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: Diferadennoù ar c'henlabourer
       heading: Diferadennoù ar c'henlabourer
@@ -2385,9 +2377,6 @@ br:
         mapquest_car: Karr (MapQuest)
         mapquest_foot: Troad (MapQuest)
         osrm_car: Karr(OSRM)
-        mapzen_bicycle: Marc'h-houarn (Mapzen)
-        mapzen_car: Karr (Mapzen)
-        mapzen_foot: War droad (Mapzen)
       descend: Diskenn
       directions: Tuioù
       distance: Hed
index 2f2d03731771e0420364dd8604cdf712d0d5ce8e..3ab825186c1f59e54df2deb688da02ed65538f1f 100644 (file)
@@ -377,33 +377,26 @@ bs:
           crematorium: Krematorij
           dentist: Zubar
           doctors: Doktor
-          dormitory: Studentski dom
           drinking_water: Voda za piće
           driving_school: Autoškola
           embassy: Ambasada
-          emergency_phone: S.O.S. Telefon
           fast_food: Fast food
           ferry_terminal: Trajektni terminal
-          fire_hydrant: Hidrant
           fire_station: Vatrogasna stanica
           food_court: Dvorište restorana
           fountain: Fontana
           fuel: Benzinska pumpa
           gambling: Kockanje
           grave_yard: Groblje
-          gym: Fitness centar
-          health_centre: Zdravstveni centar
           hospital: Bolnica
           hunting_stand: Lovačka čeka
           ice_cream: Sladoled
           kindergarten: Dječiji vrtić
           library: Biblioteka
-          market: Tržnica
           marketplace: Tržnica
           monastery: Manastir
           motorcycle_parking: Parking za motore
           nightclub: Noćni klub
-          nursery: Čuvanje djece
           nursing_home: Starački dom
           office: Kancelarija
           parking: Parking
@@ -417,7 +410,6 @@ bs:
           prison: Zatvor
           pub: Pub
           public_building: Ustanova
-          reception_area: Recepcija
           recycling: Reciklažna stanica
           restaurant: Restoran
           retirement_home: Dom penzionera
@@ -513,7 +505,6 @@ bs:
           trunk: Brza cesta
           trunk_link: Prilaz brzoj cesti
           unclassified: Neklasificirana cesta
-          unsurfaced: Neasfaltirana cesta
           "yes": Put
         historic:
           archaeological_site: Arheološko nalazište
@@ -574,7 +565,6 @@ bs:
         leisure:
           beach_resort: Odmaralište - plaža
           bird_hide: Posmatračnica ptica
-          club: Klub
           common: Općinsko zemljište
           dog_park: Park za pse
           fishing: Ribolovno područje
@@ -653,7 +643,6 @@ bs:
           travel_agent: Putnička agencija
           "yes": Kancelarija
         place:
-          airport: Aerodrom
           city: Grad
           country: Država
           county: Kanton
@@ -665,7 +654,6 @@ bs:
           islet: Ostrvce
           isolated_dwelling: Izolirano stanovanje
           locality: Lokalitet
-          moor: Močvarno tlo
           municipality: Općina
           postcode: Poštanski broj
           region: Regija
@@ -680,10 +668,8 @@ bs:
           abandoned: Napuštena pruga
           construction: Pruga u izgradnji
           disused: Napuštena pruga
-          disused_station: Željeznička stanica (nije u upotrebi)
           funicular: Uspinjača
           halt: Željeznička stanica
-          historic_station: Historijska željeznička stanica
           junction: Željeznički čvor
           level_crossing: Pružni prelaz
           light_rail: Lahka željeznica
@@ -744,7 +730,6 @@ bs:
           hairdresser: Frizer
           hardware: Željezarija
           hifi: Hi-Fi
-          insurance: Osiguranje
           jewelry: Trgovina nakitom
           kiosk: Kiosk
           laundry: Praonica rublja
@@ -760,9 +745,7 @@ bs:
           pet: Trgovina za kućne ljubimce
           pharmacy: Apoteka
           photo: Fotograf
-          salon: Salon
           shoes: Trgovina obućom
-          shopping_centre: Trgovački centar
           sports: Trgovina sportskom opremom
           stationery: Papirnica
           supermarket: Supermarket
index 106f2c0603c55e3d1b599d185b2b6a707483abe2..d6e5cfc59851ae4bc2e3bafb05f755c5334d2b5e 100644 (file)
@@ -247,7 +247,7 @@ ca:
     changeset_paging_nav:
       showing_page: Pàgina %{page}
       next: Endavant »
-      previous: « Enrere
+      previous: ← Anterior
     changeset:
       anonymous: Anònim
       no_edits: (sense edicions)
@@ -468,33 +468,26 @@ ca:
           crematorium: Crematori
           dentist: Dentista
           doctors: Metges
-          dormitory: Residència Universitària
           drinking_water: Aigua potable
           driving_school: Autoescola
           embassy: Ambaixada
-          emergency_phone: Telèfon d'emergència
           fast_food: Menjar ràpid
           ferry_terminal: Terminal de Ferry
-          fire_hydrant: Boca d'incendi
           fire_station: Parc de bombers
           food_court: Àrea de restauració
           fountain: Font
           fuel: Benzinera
           gambling: Jocs d'atzar
           grave_yard: Cementiri
-          gym: Gimnàs
-          health_centre: Centre de Salut
           hospital: Hospital
           hunting_stand: Club de caça
           ice_cream: Gelat
           kindergarten: Jardí d'infància
           library: Biblioteca
-          market: Mercat
           marketplace: Mercat
           monastery: Monestir
           motorcycle_parking: Aparcament per a motos
           nightclub: Club nocturn
-          nursery: Infantil
           nursing_home: Llar d'Avis
           office: Oficina
           parking: Pàrquing
@@ -508,7 +501,6 @@ ca:
           prison: Presó
           pub: Pub
           public_building: Edifici públic
-          reception_area: Àrea de recepció
           recycling: Punt de reciclatge
           restaurant: Restaurant
           retirement_home: Casa de Retirament
@@ -563,6 +555,7 @@ ca:
           defibrillator: Desfibril·lador
           landing_site: Lloc d'aterratges d'emergència
           phone: Telèfon per a emergències
+          "yes": Emergència
         highway:
           abandoned: Carretera abandonada
           bridleway: Ferradura
@@ -604,7 +597,6 @@ ca:
           trunk: Autovia de
           trunk_link: Autovia de
           unclassified: Sense classificar Road
-          unsurfaced: Pista sense asfaltar
           "yes": Carretera
         historic:
           archaeological_site: Lloc arqueològic
@@ -632,6 +624,7 @@ ca:
           wayside_cross: Camí de la creu
           wayside_shrine: Santuari de carreteres
           wreck: Wreck
+          "yes": Lloc històric
         junction:
           "yes": Intersecció
         landuse:
@@ -669,7 +662,6 @@ ca:
         leisure:
           beach_resort: Beach Resort
           bird_hide: Aguait
-          club: Club
           common: Terra comú
           dog_park: Parc caní
           fishing: Àrea de pesca
@@ -696,8 +688,11 @@ ca:
           water_park: Parc aquàtic
           "yes": Esbarjo
         man_made:
+          breakwater: Escullera
+          bridge: Pont
           lighthouse: Far
           pipeline: Canonada
+          silo: Sitja
           tower: Torre
           works: Fàbrica
           "yes": Fet per l'home
@@ -750,7 +745,9 @@ ca:
           accountant: Comptable
           administrative: Administració
           architect: Arquitecte
+          association: Associació
           company: Empresa
+          educational_institution: Institució educativa
           employment_agency: Agència d'ocupació
           estate_agent: Immobiliària
           government: Oficina governamental
@@ -762,9 +759,8 @@ ca:
           "yes": Oficina
         place:
           allotments: Horts
-          block: Bloc
-          airport: Aeroport
           city: Ciutat
+          city_block: Illa de cases
           country: País
           county: Comtat
           farm: Granja
@@ -775,7 +771,6 @@ ca:
           islet: Illot
           isolated_dwelling: Habitatge aïllat
           locality: Localitat
-          moor: Amarrador
           municipality: Municipi
           neighbourhood: Barri
           postcode: Codi postal
@@ -792,10 +787,8 @@ ca:
           abandoned: Ferrocarril fora de Servei
           construction: Ferrocarril en Construcció
           disused: Ferrocarril en desús
-          disused_station: Estació de tren tancada
           funicular: Funicular Railway
           halt: Parada de tren
-          historic_station: Estació de tren antiga
           junction: Cruïlla de tren
           level_crossing: Pas a nivell
           light_rail: Tren lleuger
@@ -859,7 +852,6 @@ ca:
           hairdresser: Perruqueria o barberia
           hardware: Botiga de maquinari
           hifi: Hi-Fi
-          insurance: Homes For Sale
           jewelry: Joieria
           kiosk: Quiosc botiga
           laundry: Bugaderia
@@ -875,10 +867,8 @@ ca:
           pet: Botiga d'animals
           pharmacy: Farmàcia
           photo: Botiga de foto
-          salon: Sala d'estar
           second_hand: Botiga de segona mà
           shoes: Sabateria
-          shopping_centre: Centre comercial
           sports: Botiga d'esports
           stationery: Botiga de papereria
           supermarket: Supermercat
@@ -958,7 +948,7 @@ ca:
     logo:
       alt_text: logotip de l'OpenStreetMap
     home: Vés a la ubicació d'inici
-    logout: Tancar sessió
+    logout: Finalitza la sessió
     log_in: Inicia sessió
     log_in_tooltip: Inicia una sessió amb un compte existent
     sign_up: Registre
@@ -1118,10 +1108,10 @@ ca:
         per eliminar dades protegides pels drets d'autor</a> o empleneu aquest <a
         href="http://dmca.openstreetmap.org/">formulari en línia.</a>.
       trademarks_title_html: <span id="trademarks"></span>Marques registrades
-      trademarks_1_html: OpenStreetMap i el logotip de la lupa són marques registrades
-        de la Fundació OpenStreetMap. Si teniu preguntes sobre l'ús de les marques,
-        si us plau envieu les vostres al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grup
-        de Treball de Llicències</a>.
+      trademarks_1_html: OpenStreetMap, el logotip de la lupa i «State of the Map»
+        són marques registrades de la Fundació OpenStreetMap. Si teniu preguntes sobre
+        l’ús de les marques, consulteu la <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">política
+        de marques registrades</a>.
   welcome_page:
     title: Benvingut!
     introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapa lliure i
@@ -1277,6 +1267,7 @@ ca:
       footer_html: També podeu llegir el missatge a %{readurl} i podeu respondre'l
         a %{replyurl}
     friend_notification:
+      hi: Hola %{to_user},
       subject: '[OpenStreetMap] %{user} us ha afegit a la llista d''amics'
       had_added_you: '%{user} us ha afegit com a amic a l''OpenStreetMap.'
       see_their_profile: Podeu veure el seu perfil a %{userurl}.
@@ -1494,7 +1485,7 @@ ca:
       get_directions_title: Trobeu indicacions entre dos punts
       from: De
       to: A
-      where_am_i: On sóc?
+      where_am_i: On és això?
       where_am_i_title: Descriu la localització actual fent servir el motor de cerca
       submit_text: Vés-hi
     key:
@@ -2382,9 +2373,10 @@ ca:
       new:
         intro: Heu trobat un error o bé hi falta res? Informeu-ne a d'altres col·laboradors
           per tal que puguin solucionar-ho. Moveu el marcador a la posició correcta
-          i escriviu-hi una anotació per tal de descriure el problema. (No introduïu
-          cap mena d'informació personal o informació d'altres mapes o llistats de
-          directoris que es trobin sota copyright.)
+          i escriviu-hi una anotació per tal de descriure el problema.
+        advice: La vostra nota és pública i pot utilitzar-se per actualitzar el mapa,
+          per tant, no hi introduïu cap informació personal, o informació de mapes
+          amb copyright o bé llistats de directori.
         add: Afegeix una nota
       show:
         anonymous_warning: Aquesta nota inclou comentaris d'usuaris anònims que haurien
@@ -2404,9 +2396,6 @@ ca:
         mapquest_car: Cotxe (MapQuest)
         mapquest_foot: A peu (MapQuest)
         osrm_car: Cotxe (OSRM)
-        mapzen_bicycle: Bicicleta (Mapzen)
-        mapzen_car: Cotxe (Mapzen)
-        mapzen_foot: A peu (Mapzen)
       directions: Indicacions
       distance: Distància
       errors:
index f5da185a8398d882e49de9fe8284edcd9eac54f3..423324a8dcded2599506c3e8c40af2aca5226de2 100644 (file)
@@ -7,6 +7,7 @@
 # Author: DemonioCZ
 # Author: Dvorapa
 # Author: H4nek
+# Author: Ilimanaq29
 # Author: JAn Dudík
 # Author: Jezevec
 # Author: Jkjk
@@ -159,6 +160,8 @@ cs:
         title_comment: Sada změn %{id} - %{comment}
       join_discussion: Chcete-li diskutovat, přihlaste se
       discussion: Diskuse
+      still_open: Sada změn je stále otevřená – diskuse se zpřístupní, jakmile bude
+        sada změn uzavřena.
     node:
       title: 'Uzel: %{name}'
       history_title: 'Historie uzlu: %{name}'
@@ -370,7 +373,7 @@ cs:
       map_image: Obrázek mapy (zobrazuje standardní vrstvu)
       embeddable_html: Vkládatelné HTML
       licence: Licence
-      export_details: Data OpenStreetMap jsou k dispozici pod licencí <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: Data OpenStreetMap jsou k dispozici pod licencí <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL).
       too_large:
         advice: 'Pokud se tento export nezdaří, zvažte použití jednoho z následujících
@@ -409,14 +412,14 @@ cs:
   geocoder:
     search:
       title:
-        latlon: Výsledky z <a href="http://openstreetmap.org/">interní databáze</a>
+        latlon: Výsledky z <a href="https://openstreetmap.org/">interní databáze</a>
         uk_postcode: Výsledky z <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Výsledky z <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Výsledky z <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Výsledky z <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Výsledky z <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Výsledky z <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Výsledky z <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Výsledky z <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Výsledky z <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -426,11 +429,13 @@ cs:
           chair_lift: Sedačková lanovka
           drag_lift: Vlek
           gondola: Kabinková lanovka
+          pylon: Pylon
           station: Stanice lanovky
         aeroway:
           aerodrome: Letiště
           apron: Odbavovací plocha
           gate: Letištní brána
+          hangar: Hangár
           helipad: Heliport
           runway: Dráha
           taxiway: Pojezdová dráha
@@ -466,37 +471,31 @@ cs:
           crematorium: Krematorium
           dentist: Zubař
           doctors: Lékař
-          dormitory: Kolej
           drinking_water: Pitná voda
           driving_school: Autoškola
           embassy: Velvyslanectví
-          emergency_phone: Nouzový telefon
           fast_food: Rychlé občerstvení
           ferry_terminal: Přístaviště přívozu
-          fire_hydrant: Požární hydrant
           fire_station: Hasičská stanice
           food_court: Občerstvení
           fountain: Fontána
           fuel: Čerpací stanice
           gambling: Hazardní hry
           grave_yard: Hřbitov
-          gym: Fitness centrum / tělocvična
-          health_centre: Zdravotní středisko
           hospital: Nemocnice
           hunting_stand: Posed
           ice_cream: Zmrzlinárna
           kindergarten: Mateřská škola
           library: Knihovna
-          market: Tržiště
           marketplace: Tržnice
           monastery: Klášter
           motorcycle_parking: Parkoviště pro motocykly
           nightclub: Noční klub
-          nursery: Jesle
           nursing_home: Pečovatelský dům
           office: Úřad
           parking: Parkoviště
           parking_entrance: Vjezd na parkoviště
+          parking_space: Parkoviště
           pharmacy: Lékárna
           place_of_worship: Náboženský objekt
           police: Policie
@@ -506,7 +505,6 @@ cs:
           prison: Věznice
           pub: Hospoda
           public_building: Veřejná budova
-          reception_area: Recepce
           recycling: Tříděný odpad
           restaurant: Restaurace
           retirement_home: Domov důchodců
@@ -561,12 +559,14 @@ cs:
           defibrillator: Defibrilátor
           landing_site: Přistávací plocha záchranky
           phone: Nouzový telefon
+          "yes": Nouze
         highway:
           abandoned: Zrušená silnice
           bridleway: Koňská stezka
           bus_guideway: Autobusová dráha
           bus_stop: Autobusová zastávka
           construction: Silnice ve výstavbě
+          corridor: Koridor
           cycleway: Cyklostezka
           elevator: Výtah
           emergency_access_point: Nouzový lokalizační bod
@@ -577,6 +577,7 @@ cs:
           motorway: Dálnice
           motorway_junction: Dálniční křižovatka
           motorway_link: Dálnice
+          passing_place: Přechod
           path: Stezka
           pedestrian: Pěší zóna
           platform: Nástupiště
@@ -593,6 +594,7 @@ cs:
           services: Dálniční odpočívadlo
           speed_camera: Radar
           steps: Schody
+          stop: Značka Stop
           street_lamp: Pouliční lampa
           tertiary: Silnice třetí třídy
           tertiary_link: Silnice třetí třídy
@@ -602,7 +604,6 @@ cs:
           trunk: Významná silnice
           trunk_link: Významná silnice
           unclassified: Silnice
-          unsurfaced: Nezpevněná cesta
           "yes": Cesta
         historic:
           archaeological_site: Archeologické naleziště
@@ -630,6 +631,7 @@ cs:
           wayside_cross: Boží muka
           wayside_shrine: Boží muka
           wreck: Vrak
+          "yes": Historická stránka
         junction:
           "yes": Křižovatka
         landuse:
@@ -667,7 +669,6 @@ cs:
         leisure:
           beach_resort: Pobřežní letovisko
           bird_hide: Ptačí pozorovatelna
-          club: Klub
           common: Obecní půda
           dog_park: Park pro psy
           fishing: Rybářská oblast
@@ -694,9 +695,23 @@ cs:
           water_park: Aquapark
           "yes": Volný čas
         man_made:
+          beehive: Včelí úl
+          bridge: Most
+          bunker_silo: Bunkr
+          chimney: Komín
+          dyke: Hráz
+          embankment: Nábřeží
+          groyne: Vlnolam
+          kiln: Pec
           lighthouse: Maják
+          mine: Mina
+          petroleum_well: Ropný důl
           pipeline: Potrubí
           tower: Věž
+          wastewater_plant: Rostlina na plýtvání vodou
+          watermill: Vodní mlýn
+          water_well: Studna
+          windmill: Větrný mlýn
           works: Továrna
           "yes": Lidský výtvor
         military:
@@ -753,6 +768,7 @@ cs:
           estate_agent: Realitní kancelář
           government: Vládní úřad
           insurance: Pojišťovna
+          it: Počítačová kancelář
           lawyer: Právnická kancelář
           ngo: Úřad nevládní organizace
           telecommunication: Telekomunikační úřad
@@ -760,8 +776,6 @@ cs:
           "yes": Kancelář
         place:
           allotments: Zahrádkářská kolonie
-          block: Blok
-          airport: Letiště
           city: Velkoměsto
           country: Stát
           county: Hrabství
@@ -773,12 +787,13 @@ cs:
           islet: Ostrůvek
           isolated_dwelling: Samota
           locality: Oblast
-          moor: Bažina
           municipality: Obecní úřad
           neighbourhood: Čtvrť
           postcode: PSČ
+          quarter: Čtvrt
           region: Region
           sea: Moře
+          square: Náměstí
           state: Stát
           subdivision: Parcely
           suburb: Městská část
@@ -790,10 +805,8 @@ cs:
           abandoned: Zrušená železniční trať
           construction: Železnice ve výstavbě
           disused: Nepoužívaná železniční trať
-          disused_station: Zrušená železniční stanice
           funicular: Lanová dráha
           halt: Železniční zastávka
-          historic_station: Nádraží historické železnice
           junction: Kolejové rozvětvení
           level_crossing: Železniční přejezd
           light_rail: Rychlodráha
@@ -819,6 +832,7 @@ cs:
           beauty: Salón krásy
           beverages: Prodej nápojů
           bicycle: Cykloobchod
+          bookmaker: Bookmaker
           books: Knihkupectví
           boutique: Butik
           butcher: Řeznictví
@@ -857,12 +871,13 @@ cs:
           hairdresser: Kadeřnictví
           hardware: Železářství
           hifi: Prodej Hi-Fi elektroniky
-          insurance: Pojišťovna
           jewelry: Klenotnictví
           kiosk: Kiosek
           laundry: Prádelna
+          lottery: Loterie
           mall: Nákupní centrum
           market: Trh
+          massage: Masáž
           mobile_phone: Prodej mobilních telefonů
           motorcycle: Prodej motocyklů
           music: Prodej hudby
@@ -870,19 +885,20 @@ cs:
           optician: Oční optika
           organic: Prodej biopotravin
           outdoor: Outdoorový obchod
+          pawnbroker: Zastavárník
           pet: Prodejna pro chovatele
           pharmacy: Lékárna
           photo: Prodejna foto
-          salon: Salón
+          seafood: Mořské plody
           second_hand: Bazar
           shoes: Obuvnictví
-          shopping_centre: Nákupní centrum
           sports: Prodejna pro sportovce
           stationery: Papírnictví
           supermarket: Supermarket
           tailor: Krejčí
           toys: Hračkářství
           travel_agency: Cestovní kancelář
+          vacant: Volný obchod
           video: Videopůjčovna, prodej DVD
           wine: Vinárna
           "yes": Obchod
@@ -939,7 +955,7 @@ cs:
         level10: Hranice městské části
     description:
       title:
-        osm_nominatim: Poloha podle <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Poloha podle <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Poloha podle <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1013,21 +1029,21 @@ cs:
     legal_babble:
       title_html: Autorská práva a licence
       intro_1_html: OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> jsou <i>svobodná
-        data</i>, která za podmínek <a href="http://opendatacommons.org/licenses/odbl/">Open
-        Data Commons Open Database License</a> (ODbL) nabízí nadace <a href="http://osmfoundation.org/">OpenStreetMap
+        data</i>, která za podmínek <a href="https://opendatacommons.org/licenses/odbl/">Open
+        Data Commons Open Database License</a> (ODbL) nabízí nadace <a href="https://osmfoundation.org/">OpenStreetMap
         Foundation</a> (OSMF).
       intro_2_html: Smíte kopírovat, distribuovat, sdělovat veřejnosti a upravovat
         naše data, pokud jako zdroj uvedete OpenStreetMap a jeho přispěvatele. Pokud
         naše data budete upravovat nebo je použijete ve svém díle, musíte výsledek
         šířit pod stejnou licencí. Vaše práva a povinnosti jsou vysvětleny v plném
-        <a href="http://opendatacommons.org/licenses/odbl/1.0/">licenčním ujednání</a>.
+        <a href="https://opendatacommons.org/licenses/odbl/1.0/">licenčním ujednání</a>.
       intro_3_html: Kartografická díla v našich mapových dlaždicích a naše dokumentace
-        jsou k dispozici pod licencí <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.cs">Creative
+        jsou k dispozici pod licencí <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.cs">Creative
         Commons Uveďte autora-Zachovejte licenci 2.0</a> (CC-BY-SA).
       credit_title_html: Jak uvádět OpenStreetMap
       credit_1_html: Vyžadujeme uvádění autorství „© Přispěvatelé OpenStreetMap“.
       credit_2_html: |-
-        Také musíte jasně uvést, že data jsou dostupná za podmínek Open Database License, a pokud používáte naše mapové dlaždice, že jejich kartografický obsah je licencován pod CC-BY-SA. To můžete splnit odkázáním na <a href="http://www.openstreetmap.org/copyright">tuto stránku</a>.
+        Také musíte jasně uvést, že data jsou dostupná za podmínek Open Database License, a pokud používáte naše mapové dlaždice, že jejich kartografický obsah je licencován pod CC-BY-SA. To můžete splnit odkázáním na <a href="https://www.openstreetmap.org/copyright">tuto stránku</a>.
 
         Nebo můžete (a pokud šíříte OSM jako data, tak musíte) uvést název licence a odkaz na ni přímo. Pokud používáte médium, které odkazy neumožňuje (např. v tištěném díle), navrhujeme, abyste své čtenáře nasměrovali na openstreetmap.org (zřejmě rozšířením „OpenStreetMap“ do této plné adresy), na opendatacommons.org a, pokud se vás to týká, na creativecommons.org.
       credit_3_html: |-
@@ -1038,7 +1054,7 @@ cs:
         title: Příklad uvedení autorství
       more_title_html: Další informace
       more_1_html: O používání našich dat a způsobu uvádění autorství se můžete dočíst
-        více na <a href="http://osmfoundation.org/Licence">licenční stránce OSMF</a>.
+        více na <a href="https://osmfoundation.org/Licence">licenční stránce OSMF</a>.
       more_2_html: |-
         Přestože OpenStreetMap tvoří svobodná data, nemůžeme zdarma poskytovat třetím stranám mapové API.
         Vizte naše <a href="https://operations.osmfoundation.org/policies/api/">Pravidla použití API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">Pravidla použití dlaždic</a> a <a href="https://operations.osmfoundation.org/policies/nominatim/">Pravidla použití Nominatimu</a>.
@@ -1046,10 +1062,10 @@ cs:
       contributors_intro_html: 'Našimi přispěvateli jsou tisíce jednotlivců. Také
         zahrnujeme svobodně licencovaná data z národních zeměměřických úřadů a dalších
         zdrojů, mimo jiné:'
-      contributors_at_html: '<strong>Rakousko</strong>: Obsahuje data od <a href="http://data.wien.gv.at/">města
-        Vídně</a> pod <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
-        BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">země
-        Vorarlbersko</a> a země Tyrolsko (pod <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
+      contributors_at_html: '<strong>Rakousko</strong>: Obsahuje data od <a href="https://data.wien.gv.at/">města
+        Vídně</a> pod <a href="https://creativecommons.org/licenses/by/3.0/at/deed.cs">CC
+        BY</a>), <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">země
+        Vorarlbersko</a> a země Tyrolsko (pod <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
         BY AT s dodatky</a>).'
       contributors_ca_html: '<strong>Kanada</strong>: Obsahuje data z GeoBase&reg;,
         GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy;
@@ -1057,12 +1073,12 @@ cs:
         Canada).'
       contributors_fi_html: '<strong>Finsko</strong>: Obsahuje data z topografické
         databáze a dalších zdrojů finského národního zeměměřického úřadu (Maanmittauslaitos)
-        dostupná pod <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licencí
+        dostupná pod <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licencí
         NLSFI</a>.'
       contributors_fr_html: '<strong>Francie</strong>: Obsahuje data pocházející z
         Direction Générale des Impôts.'
       contributors_nl_html: '<strong>Nizozemsko</strong>: Obsahuje &copy; AND data,
-        2007 (<a href="http://www.and.com">www.and.com</a>)'
+        2007 (<a href="https://www.and.com">www.and.com</a>)'
       contributors_nz_html: '<strong>Nový Zéland</strong>: Obsahuje data pocházející
         z Land Information New Zealand. Crown Copyright reserved.'
       contributors_si_html: '<strong>Slovinsko</strong>: Obsahuje data <a href="http://www.gu.gov.si/">Zeměměřického
@@ -1075,7 +1091,7 @@ cs:
         Survey &copy; Crown copyright a právo k databázi 2010–12.'
       contributors_footer_1_html: |-
         Další podrobnosti o těchto a dalších zdrojích, které se používaly pro vylepšení OpenStreetMap, najdete na <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">stránce Contributors</a> na wiki OpenStreetMap.
+        href="https://wiki.openstreetmap.org/wiki/Contributors">stránce Contributors</a> na wiki OpenStreetMap.
       contributors_footer_2_html: Zahrnutí dat do OpenStreetMap neznamená, že původní
         poskytovatel dat podporuje OpenStreetMap, nabízí jakoukoli záruku nebo přijímá
         jakoukoli zodpovědnost.
@@ -1085,13 +1101,13 @@ cs:
         bez výslovného svolení držitelů práv.
       infringement_2_html: Pokud si myslíte, že byl do databáze OpenStreetMap nebo
         na tento server neoprávněně vložen autorskoprávně chráněný obsah, postupujte
-        podle našeho <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">postupu
+        podle našeho <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">postupu
         pro odstranění</a> nebo přímo podejte výzvu pomocí <a href="http://dmca.openstreetmap.org/">on-line
         formuláře</a>.
       trademarks_title_html: <span id="trademarks"></span>Ochranné známky
       trademarks_1_html: OpenStreetMap, logo s lupou a State of the Map jsou zapsané
         ochranné známky OpenStreetMap Foundation. Pokud máte dotazy ohledně vašeho
-        používání těchto známek, zašlete své dotazy <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">pracovní
+        používání těchto známek, zašlete své dotazy <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">pracovní
         skupině pro licencování</a>.
   welcome_page:
     title: Vítejte!
@@ -1123,8 +1139,8 @@ cs:
       paragraph_1_html: OpenStreetMap má jen málo formálních pravidel, ale od všech
         účastníků očekáváme, že budou spolupracovat a komunikovat s komunitou. Pokud
         zvažujete jakoukoli jinou činnost než ruční editování, přečtěte si prosím
-        a dodržujte pokyny na stránkách <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importy</a>
-        a <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatizované
+        a dodržujte pokyny na stránkách <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importy</a>
+        a <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatizované
         editace</a>.
     questions:
       title: Nějaké dotazy?
@@ -1158,7 +1174,7 @@ cs:
       explanation_html: |-
         Pokud máte pochyby o používání našich dat nebo jejich obsahu, na naší
         <a href='/copyright'>stránce o autorských právech</a> naleznete více právních informací, případně kontaktujte
-        příslušnou <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>pracovní skupinu OSMF</a>.
+        příslušnou <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>pracovní skupinu OSMF</a>.
   help_page:
     title: Nápověda
     introduction: OpenStreetMap nabízí několik zdrojů pro informace o projektu, otázky
@@ -1168,7 +1184,7 @@ cs:
       title: Vítejte v OSM
       description: Začněte tímto rychlým průvodcem zahrnujícím základy OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Cs:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Cs:Pr%C5%AFvodce_za%C4%8D%C3%A1te%C4%8Dn%C3%ADka
       title: Průvodce začátečníka
       description: Komunitou spravovaná příručka pro začátečníky.
     help:
@@ -1192,7 +1208,7 @@ cs:
       description: Pomoc společnostem a organizacím s přechodem na mapy a další služby
         založené na OpenStreetMap.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/Cs:Main_Page?uselang=cs
+      url: https://wiki.openstreetmap.org/wiki/Cs:Main_Page?uselang=cs
       title: wiki.openstreetmap.org
       description: Podrobnou dokumentaci OSM najdete na wiki.
   about_page:
@@ -1210,7 +1226,7 @@ cs:
     community_driven_title: Řízeno komunitou
     community_driven_html: |-
       Komunita OpenStreetMap je různorodá, vášnivá a každý den se rozrůstá. Mezi našimi přispěvateli najdete amatérské kreslíře map, profesionály z oblasti GIS, techniky spravující servery OSM, humanitární pracovníky mapující oblasti zasažené neštěstím a mnohé další.
-      Pokud se chcete o komunitě dozvědět více, prohlédněte si <a href='%{diary_path}'>uživatelské deníčky</a>, <a href='http://blogs.openstreetmap.org/'>komunitní blogy</a> a webovou stránku <a href='http://www.osmfoundation.org/'>nadace OSM Foundation</a>.
+      Pokud se chcete o komunitě dozvědět více, prohlédněte si <a href='https://blog.openstreetmap.org'>blog OpenStreetMap</a>, <a href='%{diary_path}'>uživatelské deníčky</a>, <a href='https://blogs.openstreetmap.org/'>komunitní blogy</a> a webovou stránku <a href='https://www.osmfoundation.org/'>nadace OSM Foundation</a>.
     open_data_title: Otevřená data
     open_data_html: 'OpenStreetMap tvoří <i>otevřená data</i>: smíte je užívat pro
       libovolný účel, pokud uvádíte autorství OpenStreetMap a jeho přispěvatelů. Pokud
@@ -1219,9 +1235,9 @@ cs:
       práva a licence</a>.'
     legal_title: Právní informace
     legal_html: |-
-      Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně provozuje <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). Použití všech služeb provozovaných OSMF podléhá našim <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Pravidlům přijatelného užití</a> a našim <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Pravidlům ochrany osobních údajů</a>.
+      Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně provozuje <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). Použití všech služeb provozovaných OSMF podléhá našim <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Pravidlům přijatelného užití</a> a našim <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Pravidlům ochrany osobních údajů</a>.
       <br>
-      Pokud máte problémy či dotazy týkající se licencování, autorských práv či jiných právních záležitostí, <a href='http://osmfoundation.org/Contact'>kontaktujte prosím OSMF</a>.
+      Pokud máte problémy či dotazy týkající se licencování, autorských práv či jiných právních záležitostí, <a href='https://osmfoundation.org/Contact'>kontaktujte prosím OSMF</a>.
     partners_title: Partneři
   notifier:
     diary_comment_notification:
@@ -1436,14 +1452,14 @@ cs:
       user_page_link: uživatelské stránce
       anon_edits_link_text: Proč to tak je?
       flash_player_required: Pokud chcete používat Potlatch, flashový editor OpenStreetMap,
-        potřebujete přehrávač Flashe. Můžete si <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">stáhnout
-        Flash Player z Adobe.com</a>. Pro editaci OpenStreetMap existuje <a href="http://wiki.openstreetmap.org/wiki/Editing">mnoho
+        potřebujete přehrávač Flashe. Můžete si <a href="https://get.adobe.com/cz/flashplayer">stáhnout
+        Flash Player z Adobe.com</a>. Pro editaci OpenStreetMap existuje <a href="https://wiki.openstreetmap.org/wiki/Cs:Editory?uselang=cs">mnoho
         dalších možností</a>.
       potlatch_unsaved_changes: Máte neuložené změny. (V Potlatchi odznačte aktuální
         cestu nebo bod, pokud editujete v živém režimu, nebo klikněte na tlačítko
         uložit, pokud tam je.)
       potlatch2_not_configured: Potlatch 2 není nakonfigurován – podrobnější informace
-        najdete na http://wiki.openstreetmap.org/wiki/The_Rails_Port
+        najdete na https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
       potlatch2_unsaved_changes: Máte neuložené změny. (V Potlatch 2 se ukládá kliknutím
         na tlačítko.)
       id_not_configured: iD nebyl nakonfigurován
@@ -1458,7 +1474,7 @@ cs:
       get_directions_title: Najít trasu mezi dvěma body
       from: Odkud
       to: Kam
-      where_am_i: Kde se nacházím?
+      where_am_i: Kde je toto?
       where_am_i_title: Popsat právě zobrazované místo pomocí vyhledávače
       submit_text: Hledat
     key:
@@ -1535,7 +1551,7 @@ cs:
       edit: Upravit
       preview: Náhled
     markdown_help:
-      title_html: Zpracovává se <a href="http://daringfireball.net/projects/markdown/">Markdownem</a>
+      title_html: Zpracovává se <a href="https://daringfireball.net/projects/markdown/">Markdownem</a>
       headings: Nadpisy
       heading: Nadpis
       subheading: Podnadpis
@@ -1651,7 +1667,7 @@ cs:
       description: Procházení nedávno nahraných GPS stop
       tagged_with: se štítky %{tags}
       empty_html: Nic tu ještě není. <a href='%{upload_link}'>Nahrajte novou stopu</a>
-        nebo si něco o GPS stopách přečtěte na <a href='http://wiki.openstreetmap.org/wiki/CS:Beginners_Guide_1.2'>wiki</a>.
+        nebo si něco o GPS stopách přečtěte na <a href='https://wiki.openstreetmap.org/wiki/Cs:Beginners_Guide_1.2?uselang=cs'>wiki</a>.
     delete:
       scheduled_for_deletion: Stopa označena ke smazání
     make_public:
@@ -1857,12 +1873,12 @@ cs:
         html: |-
           <p>Na rozdíl od ostatních map je OpenStreetMap vytvořena lidmi jako vy a kdokoli ji může volně opravovat, aktualizovat, stáhnout a používat.</p>
           <p>Zaregistrujte se, abyste mohli začít přispívat. K potvrzení vašeho účtu vám pošleme e-mail.</p>
-      license_agreement: Při potvrzení účtu budete muset souhlasit s <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">podmínkami
+      license_agreement: Při potvrzení účtu budete muset souhlasit s <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">podmínkami
         pro přispěvatele</a>.
       email address: 'E-mailová adresa:'
       confirm email address: 'Potvrdit e-mailovou adresu:'
       not displayed publicly: Vaše adresa se nezobrazuje veřejně, více informací získáte
-        v našich <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="Pravidla
+        v našich <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="Pravidla
         ochrany osobních údajů OSMF, včetně části o e-mailových adresách">pravidlech
         ochrany osobních údajů</a>
       display name: 'Zobrazované jméno:'
@@ -1984,12 +2000,12 @@ cs:
       email never displayed publicly: (nikde se veřejně nezobrazuje)
       external auth: 'Externí autentizace:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/CS:OpenID
+        link: https://wiki.openstreetmap.org/wiki/Cs:OpenID
         link text: co to znamená?
       public editing:
         heading: 'Veřejné editace:'
         enabled: Aktivní. Není anonym, smí editovat data.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: co to znamená?
         disabled: Deaktivováno, nemůže editovat data, všechny předchozí editace jsou
           anonymní.
@@ -2000,8 +2016,8 @@ cs:
           ani vidět vaši polohu. Pokud chcete ukázat, co jste editovali, a dovolit
           lidem vás kontaktovat prostřednictvím webu, klikněte na níže zobrazené tlačítko.
           <b>Od přechodu na API 0.6 mohou mapová data editovat jen veřejní uživatelé</b>.
-          (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Přečtěte si
-          důvody.</a>)<ul><li>Vaše e-mailová adresa se přepnutím na veřejné editace
+          (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">Přečtěte
+          si důvody.</a>)<ul><li>Vaše e-mailová adresa se přepnutím na veřejné editace
           neprozradí.</li><li>Tuto operaci nelze vrátit a všichni noví uživatelé jsou
           implicitně veřejní.</li></ul>
       contributor terms:
@@ -2125,6 +2141,8 @@ cs:
       not_a_role: Řetězec „%{role}“ neoznačuje platnou roli.
       already_has_role: Uživatel již roli %{role} má.
       doesnt_have_role: Uživatel nemá roli %{role}.
+      not_revoke_admin_current_user: Administrátorskou roli nelze odebrat aktuálně
+        přihlášenému uživateli.
     grant:
       title: Potvrdit přidělení role
       heading: Potvrdit přidělení role
@@ -2343,8 +2361,9 @@ cs:
       new:
         intro: Zahlédli jste chybu nebo prázdné místo? Dejte vědět ostatním uživatelům,
           aby to mohli napravit. Posuňte značku na správné místo a napište poznámku
-          vysvětlující problém. (Prosíme, nevkládejte žádné osobní údaje ani informace
-          z autorskoprávně chráněných map či adresářů.)
+          vysvětlující problém.
+        advice: Vaše poznámka je veřejná a může sloužit k úpravám mapy, proto nevkládejte
+          žádné osobní údaje ani informace z autorskoprávně chráněných map či adresářů.
         add: Přidat poznámku
       show:
         anonymous_warning: Tato poznámka zahrnuje komentáře anonymních uživatelů,
@@ -2366,9 +2385,6 @@ cs:
         mapquest_car: Autem (MapQuest)
         mapquest_foot: Pěšky (MapQuest)
         osrm_car: Autem (OSRM)
-        mapzen_bicycle: Na kole (Mapzen)
-        mapzen_car: Autem (Mapzen)
-        mapzen_foot: Pěšky (Mapzen)
       descend: Sestupte
       directions: Pokyny
       distance: Vzdálenost
index 34a89c9d1de18ae8fefff0c1efce554219a52182..75d720bda2ea92394c37f9c96684a90359ae827f 100644 (file)
@@ -169,11 +169,15 @@ cy:
         note: nodyn
     redacted:
       redaction: Golygiad %{id}
+      message_html: Ni ellir dangos %{version} o math %{type} gan iddo gael ei olygu.
+        Gweler %{redaction_link} am y manylion.
       type:
         node: nod
         way: llwybr
         relation: perthynas
     start_rjs:
+      feature_warning: Wrthi'n llwytho nodweddio %{num_features}, a all arafu eich
+        porwr. Wyt ti'n sicr dy fod am weld y data?
       load_data: Llwytho Data
       loading: Yn llwytho...
     tag_details:
@@ -188,12 +192,22 @@ cy:
       title: 'Nodyn: %{id}'
       new_note: Nodyn Newydd
       description: Disgrifiad
+      open_title: '#%{note_name} heb ei ddatrus'
+      closed_title: '#%{note_name} wedi''i ddatrus'
       hidden_title: Nodyn cudd %{note_name}
       open_by: Crëwyd gan %{user} <abbr title='%{exact_time}'>%{when} yn ôl</abbr>
       open_by_anonymous: Crëwyd yn ddienw <abbr title='%{exact_time}'>%{when} yn ôl</abbr>
       commented_by: Sylw gan %{user} <abbr title='%{exact_time}'>%{when} yn ôl</abbr>
       commented_by_anonymous: Sylw yn ddienw <abbr title='%{exact_time}'>%{when} yn
         ôl</abbr>
+      closed_by: Wedi'i ddatrus gan %{user} <abbr title='%{exact_time}'>%{when} yn
+        ôl</abbr>
+      closed_by_anonymous: Wedi ei ddatrus gan olygydd heb fewngofnodi <abbr title='%{exact_time}'>%{when}
+        ago</abbr>
+      reopened_by: Gwnaed yn weithredol gan %{user} <abbr title='%{exact_time}'>%{when}
+        yn ôl</abbr>
+      reopened_by_anonymous: Gwnaed yn weithredol gan olygydd heb fewngofnodi <abbr
+        title='%{exact_time}'>%{when} yn ôl</abbr>
       hidden_by: Cuddwyd gan %{user} <abbr title='%{exact_time}'>%{when} yn ôl</abbr>
     query:
       title: Nodweddion Ymholiad
@@ -208,6 +222,7 @@ cy:
     changeset:
       anonymous: Dienw
       no_edits: (dim newid)
+      view_changeset_details: Dangos y newidiadau
     changesets:
       id: ID
       saved_at: Cadwyd
@@ -224,7 +239,11 @@ cy:
       empty_user: Dim setiau-newid gan y defnyddiwr hwn.
       no_more: Dim rhagor o setiau-newid.
       no_more_area: Dim rhagor o setiau-newid yn yr ardal yma.
+      no_more_user: Dim newidiadau gan y Defnyddiwr hwn.
       load_more: Llwytho mwy
+    timeout:
+      sorry: Ymddiheurwn, cymerodd y newidiadau a wnaethoch gais i'w gweld ry hir
+        i'w cyrchu.
     rss:
       title_all: Trafodaeth OpenStreetMa o'r setiau-newid
       title_particular: 'Trafodaeth OpenStreetMap set-newid #%{changeset_id}'
@@ -398,33 +417,26 @@ cy:
           crematorium: Amlosgfa
           dentist: Deintydd
           doctors: Meddygfa
-          dormitory: Noswylfa
           drinking_water: Dŵr Yfed
           driving_school: Ysgol Yrru
           embassy: Llysgenhadaeth
-          emergency_phone: Ffôn Argyfwng
           fast_food: Bwyd Parod
           ferry_terminal: Terfynell Fferi
-          fire_hydrant: Hydrant tân
           fire_station: Gorsaf Dân
           food_court: Cwrt Fwydydd
           fountain: Ffynnon
           fuel: Tanwydd
           gambling: Gamblo
           grave_yard: Mynwent
-          gym: Canolfan Ffitrwydd / Campfa
-          health_centre: Canolfan Iechyd
           hospital: Ysbyty
           hunting_stand: Llwyfan Hela
           ice_cream: Hufen Iâ
           kindergarten: Meithrinfa
           library: Llyfrgell
-          market: Marchnad
           marketplace: Marchnad
           monastery: Mynachdy
           motorcycle_parking: Man Parcio Beiciau Modur
           nightclub: Clwb Nôs
-          nursery: Meithrinfa
           nursing_home: Cartref Nyrsio
           office: Swyddfa
           parking: Parcio
@@ -438,7 +450,6 @@ cy:
           prison: Carchar
           pub: Tafarn
           public_building: Adeilad Cyhoeddus
-          reception_area: Derbyniad
           recycling: Pwynt Ailgylchu
           restaurant: Bwyty
           retirement_home: Cartref Ymddeol
@@ -534,7 +545,6 @@ cy:
           trunk: Cefnffordd
           trunk_link: Cefnffordd
           unclassified: Ffordd Diddosbarth
-          unsurfaced: Ffordd Heb Wyneb
           "yes": Ffordd
         historic:
           archaeological_site: Safle Archaeolegol
@@ -599,7 +609,6 @@ cy:
         leisure:
           beach_resort: Ardal Wyliau
           bird_hide: Cuddle Adar
-          club: Clwb
           common: Tir Comin
           dog_park: Parc Cwn
           fishing: Man Pysgota
@@ -692,8 +701,6 @@ cy:
           "yes": Swyddfa
         place:
           allotments: Rhandiroedd
-          block: Bloc
-          airport: Maes Awyr
           city: Dinas
           country: Gwlad
           county: Sir
@@ -705,7 +712,6 @@ cy:
           islet: Ynysig
           isolated_dwelling: Annedd Unig
           locality: Ardal
-          moor: Gwaun
           municipality: Bwrdeistref
           neighbourhood: Cymdogaeth
           postcode: Cod Post
@@ -722,10 +728,8 @@ cy:
           abandoned: Hen Reilffordd
           construction: Rheilffordd yn cael ei Osod
           disused: Rheilffordd Segur
-          disused_station: Gorsaf Drenau Segur
           funicular: Rheilffordd fynydd
           halt: Stop Trenau
-          historic_station: Hen Orsaf Trenau
           junction: Cyffordd Rheilffyrdd
           level_crossing: Croesfan Wastad
           light_rail: Rheilffordd Ysgafn
@@ -789,7 +793,6 @@ cy:
           hairdresser: Siop Drin Gwallt
           hardware: Siop Nwyddau Metel
           hifi: Sain
-          insurance: Yswiriant
           jewelry: Siop Gemwaith
           kiosk: Siop Fechan
           laundry: Golchdy
@@ -805,10 +808,8 @@ cy:
           pet: Siop Anifeiliaid Anwes
           pharmacy: Fferyllfa
           photo: Siop Luniau
-          salon: Salon Trin Gwallt
           second_hand: Siol Ail-law
           shoes: Siop Esgidiau
-          shopping_centre: Canolfan Siopa
           sports: Siop Chwaraeon
           stationery: Siop Offer Swyddfa
           supermarket: Archfarchnad
index 71fd911910c9e917e301f77613599b59abb21361..bb8b49a50bb6562963a689da197b3ac52eb83667 100644 (file)
@@ -13,6 +13,7 @@
 # Author: Hylle
 # Author: Jens Jensen
 # Author: Jhertel
+# Author: Joedalton
 # Author: JrOsm
 # Author: Kaare
 # Author: Luckas
@@ -150,6 +151,8 @@ da:
         title_comment: Ændringssæt %{id} - %{comment}
       join_discussion: Log på for at deltage i diskussionen
       discussion: Diskussion
+      still_open: Ændringssæt er stadig åben - diskussion vil åbne når ændringssættet
+        lukkes.
     node:
       title: 'Punkt: %{name}'
       history_title: 'Punkthistorik: %{name}'
@@ -361,7 +364,7 @@ da:
       map_image: Kort billede (viser standard lag)
       embeddable_html: HTML der kan indlejres
       licence: Licens
-      export_details: OpenStreetMaps data er licenseret under <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: OpenStreetMaps data er licenseret under <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL).
       too_large:
         advice: 'Hvis ovenstående eksport mislykkes, kan du overveje at bruge en af
@@ -402,14 +405,14 @@ da:
   geocoder:
     search:
       title:
-        latlon: Resultater fra <a href="http://openstreetmap.org/">interne</a>
+        latlon: Resultater fra <a href="https://openstreetmap.org/">interne</a>
         uk_postcode: Resultater fra <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultater fra <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultater fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultater fra <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultater fra <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultater fra <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultater fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultater fra <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resultater fra <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -419,7 +422,10 @@ da:
           chair_lift: Stolelift
           drag_lift: Træklift
           gondola: Gondolbane
+          platter: Tallerkenlift
+          pylon: Pylon
           station: Svævebanestation
+          t-bar: Ankerlift
         aeroway:
           aerodrome: Flyveplads
           apron: Forstykke
@@ -459,33 +465,26 @@ da:
           crematorium: Krematorium
           dentist: Tandlæge
           doctors: Læger
-          dormitory: Kollegium
           drinking_water: Drikkevand
           driving_school: Køreskole
           embassy: Ambassade
-          emergency_phone: Nødtelefon
           fast_food: Fastfood
           ferry_terminal: Færgeterminal
-          fire_hydrant: Brandhane
           fire_station: Brandstation
           food_court: Food Court
           fountain: Springvand
           fuel: Benzinstation
           gambling: Spil
           grave_yard: Kirkegård
-          gym: Træningscenter
-          health_centre: Sundhedscenter
           hospital: Sygehus
           hunting_stand: Jagtplatform
           ice_cream: Is
           kindergarten: Børnehave
           library: Bibliotek
-          market: Marked
           marketplace: Markedsplads
           monastery: Kloster
           motorcycle_parking: Motorcykelparkering
           nightclub: Natklub
-          nursery: Førskole
           nursing_home: Plejehjem
           office: Kontor
           parking: Parkering
@@ -499,7 +498,6 @@ da:
           prison: Fængsel
           pub: Pub
           public_building: Offentlig bygning
-          reception_area: Modtagelsesområde
           recycling: Genbrugsstation
           restaurant: Restaurant
           retirement_home: Plejehjem
@@ -595,7 +593,6 @@ da:
           trunk: Motortrafikvej
           trunk_link: Motortrafikvej
           unclassified: Anden vej
-          unsurfaced: Uasfalteret vej
           "yes": Vej
         historic:
           archaeological_site: Arkæologisk sted
@@ -660,7 +657,6 @@ da:
         leisure:
           beach_resort: Badestrand
           bird_hide: Fugleskjul
-          club: Klub
           common: Fælles arealer
           dog_park: Hundepark
           fishing: Fiskeområde
@@ -688,14 +684,29 @@ da:
           "yes": Fritid
         man_made:
           lighthouse: Fyr
+          mine: Mine
+          mineshaft: Mineskakt
+          monitoring_station: Overvågningsstation
+          petroleum_well: Oliebrønd
+          pier: Mole
           pipeline: Rørledning
+          silo: Silo
+          storage_tank: Lagertank
+          surveillance: Overvågning
           tower: Tårn
+          wastewater_plant: Affaldsfabrik
+          watermill: Vandmølle
+          water_tower: Vandtårn
+          water_well: Brønd
+          water_works: Vandanlæg
+          windmill: Vindmølle
           works: Fabrik
           "yes": Menneskeskabt
         military:
           airfield: Militær flyveplads
           barracks: Kaserne
           bunker: Bunker
+          "yes": Militær
         mountain_pass:
           "yes": Bjergpas
         natural:
@@ -741,11 +752,14 @@ da:
           accountant: Revisor
           administrative: Administration
           architect: Arkitekt
+          association: Forening
           company: Firma
+          educational_institution: Uddannelsesanstalt
           employment_agency: Arbejdsløshedskontor
           estate_agent: Ejendomsmægler
           government: Statligt kontor
           insurance: Forsikringskontor
+          it: IT-kontor
           lawyer: Advokat
           ngo: ikkestatsligt kontor (NGO)
           telecommunication: Telekommunikationskontor
@@ -753,9 +767,8 @@ da:
           "yes": Kontor
         place:
           allotments: Kolonihaver
-          block: Blok
-          airport: Lufthavn
           city: Storby
+          city_block: Bykvarter
           country: Land
           county: Amt
           farm: Gård
@@ -766,12 +779,13 @@ da:
           islet: Holm
           isolated_dwelling: Enlig bolig
           locality: Sted
-          moor: Hede
           municipality: Kommune
           neighbourhood: Kvarter
           postcode: Postnummer
+          quarter: Kvarter
           region: Region
           sea: Hav
+          square: Plads
           state: Stat
           subdivision: Bydel
           suburb: Forstad
@@ -783,10 +797,8 @@ da:
           abandoned: Nedlagt jernbane
           construction: Jernbane under konstruktion
           disused: Nedlagt jernbane
-          disused_station: Nedlagt jernbanestation
           funicular: Kabelbane
           halt: Togstoppested
-          historic_station: Historisk jernbanestation
           junction: Jernbaneovergang
           level_crossing: Jernbaneoverskæring
           light_rail: Bybane
@@ -812,6 +824,7 @@ da:
           beauty: Skønhedssalon
           beverages: Drikkevareforretning
           bicycle: Cykelhandel
+          bookmaker: Boghandler
           books: Boghandel
           boutique: Boutique
           butcher: Slagter
@@ -850,7 +863,6 @@ da:
           hairdresser: Frisør
           hardware: Byggemarked
           hifi: Hi-Fi
-          insurance: Forsikring
           jewelry: Guldsmed
           kiosk: Kiosk
           laundry: Vaskeri
@@ -866,10 +878,8 @@ da:
           pet: Dyrehandel
           pharmacy: Apotek
           photo: Fotobutik
-          salon: Salon
           second_hand: Genbrugsbutik
           shoes: Skobutik
-          shopping_centre: Indkøbscenter
           sports: Sportsforretning
           stationery: Papirvarehandel
           supermarket: Supermarked
@@ -932,7 +942,7 @@ da:
         level10: Sognegrænse
     description:
       title:
-        osm_nominatim: Position fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Position fra <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Position fra <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1007,23 +1017,23 @@ da:
       title_html: Ophavsret og licens
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> er <i>åbne data</i>, licenseret under <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) af <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: "Du kan frit kopiere, distribuere, overføre og tilpasse vores
         data, \nså længe du angiver OpenStreetMap og dets\nbidragsydere som kilde.
         Hvis du ændrer eller bygger på vores\ndata, må du kun distribuere resultatet
-        under den samme licens. Den\nfulde <a\nhref=\"http://opendatacommons.org/licenses/odbl/1.0/\">juridiske
+        under den samme licens. Den\nfulde <a\nhref=\"https://opendatacommons.org/licenses/odbl/1.0/\">juridiske
         tekst</a>\nforklarer dine rettigheder og pligter."
       intro_3_html: Kartografien i vores kort-fliser, samt vores dokumentation er
-        licenseret under <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.da">Creative
+        licenseret under <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.da">Creative
         Commons Navngivelse-DelPåSammeVilkår 2.0</a> (CC BY-SA).
       credit_title_html: Kildeangivelse og OpenStreetMap
       credit_1_html: Vi kræver at din kildeangivelse mindst består af &ldquo;&copy;
         OpenStreetMap-bidragsydere&rdquo;..
       credit_2_html: "Du skal også gøre det klart, at dataene er tilgængelige under
         Open \nDatabase License, og hvis du bruger vores kort-fliser, at kartografien
-        er\n licenseret som CC BY-SA. Du kan gøre dette ved at linke til\n<a href=\"http://www.openstreetmap.org/copyright\">denne
+        er\n licenseret som CC BY-SA. Du kan gøre dette ved at linke til\n<a href=\"https://www.openstreetmap.org/copyright\">denne
         side om ophavsret</a>. \nAlternativt, og som et krav, hvis du distribuerer
         OSM som\n data, kan du navngive og oprette et hyperlink direkte til licenserne.
         I medier\n hvor hyperlinks ikke er mulige (f.eks. trykte værker), foreslår
@@ -1039,9 +1049,7 @@ da:
       more_title_html: Læs mere
       more_1_html: |-
         Læs mere om brug af vores data, og hvordan du krediterer os, på <a
-        href="http://osmfoundation.org/Licence">OSMF Licens-siden</a> og i fællesskabets <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Juridiske
-        FAQ</a>.
+        href="https://osmfoundation.org/Licence">OSMF Licens-siden</a>.
       more_2_html: |-
         Selvom OpenStreetMap er åbne data, kan vi ikke levere et
         gratis kort-API til tredjeparter.
@@ -1056,10 +1064,10 @@ da:
         og andre kilder, blandt dem:
       contributors_at_html: |-
         <strong>Østrig</strong>: Indeholder data fra
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (under
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Delstaten Vorarlberg</a> og
-        Delstaten Tyrol (under <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT med tilføjelser</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (under
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Delstaten Vorarlberg</a> og
+        Delstaten Tyrol (under <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT med tilføjelser</a>).
       contributors_ca_html: |-
         <strong>Canada</strong>: Indeholder data fra
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1067,14 +1075,13 @@ da:
         Resources Canada) og StatCan (Geography Division,
         Statistics Canada).
       contributors_fi_html: '<strong>Finland</strong>: Indeholder data fra National
-        Land Survey af Finlands topografiske database og andre datasæt under <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI
-        licensen</a>.'
+        Land Survey af Finlands topografiske database og andre datasæt under <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1">NLSFI-licensen</a>.'
       contributors_fr_html: |-
         <strong>Frankrig</strong>: Indeholder data fra
         Direction Générale des Impôts.
       contributors_nl_html: |-
         <strong>Holland</strong>: Indeholder &copy; AND data, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: "<strong>New Zealand</strong>: Indeholder data fra \nLand
         Information New Zealand. Crown Copyright reserveret."
       contributors_si_html: |-
@@ -1092,7 +1099,7 @@ da:
         2010-12.
       contributors_footer_1_html: |-
         For yderligere oplysninger om disse og andre kilder, der er blevet brugt for at hjælpe med at forbedre OpenStreetMap, se venligst <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">siden med bidragsydere</a> på OpenStreetMap Wiki.
+        href="https://wiki.openstreetmap.org/wiki/Contributors">siden med bidragsydere</a> på OpenStreetMap Wiki.
       contributors_footer_2_html: |-
         Optagelse af data i OpenStreetMap indebærer ikke at den oprindelige
         dataudbyder siger god for OpenStreetMap, giver nogen garanti eller
@@ -1105,12 +1112,12 @@ da:
       infringement_2_html: |-
         Hvis du mener, at ophavsretligt beskyttet materiale uberettiget er
          føjet til OpenStreetMap databasen eller dette websted, bedes du følge
-         vores <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedure til fjernelse a materiale</a> eller udfyld formular direkte på vores
+         vores <a hrefs="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedure til fjernelse a materiale</a> eller udfyld formular direkte på vores
         <a href="http://dmca.openstreetmap.org/">on-line side</a>.
       trademarks_title_html: <span id="trademarks"></span>Varemærker
       trademarks_1_html: OpenStreetMap, forstørrelsesglas-logoet og "State of the
         Map" er registrerede varemærker til OpenStreetMap Foundation. Hvis du har
-        spørgsmål om din brug af mærkerne, bedes du sende dine spørgsmål til <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licens-arbejdsgruppen</a>.
+        spørgsmål om din brug af mærkerne, så se <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Varemærkepolitikken</a>.
   welcome_page:
     title: Velkommen!
     introduction_html: Velkommen til OpenStreetMap, det frie brugerredigerede verdenskort.
@@ -1145,8 +1152,8 @@ da:
       paragraph_1_html: "OpenStreetMap har få formelle regler, men vi forventer, at
         alle deltagere vil samarbejde\nmed, og kommunikere med fællesskabet. Hvis
         du overvejer\nandre aktiviteter end manuel redigering af en side, skal du
-        læse og følge retningslinjerne på \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a>
-        og \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserede
+        læse og følge retningslinjerne på \n<a href=\"https://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a>
+        og \n<a href=\"https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserede
         Redigeringer</a>."
     questions:
       title: Spørgsmål?
@@ -1181,7 +1188,7 @@ da:
       explanation_html: |-
         Hvis du har bekymringer om, hvordan vores data bruges, eller om indholdet, kan du se vores
         <a href='/copyright'>side om ophavsret</a> for flere juridiske oplysninger, eller kontakte den relevante
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF arbejdsgruppe</a>.
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF arbejdsgruppe</a>.
   help_page:
     title: Få hjælp
     introduction: OpenStreetMap har flere ressourcer til at lære om projektet, stille
@@ -1192,7 +1199,7 @@ da:
       title: Velkommen til OSM
       description: Start med denne hurtige guide der dækker det grundlæggende i OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Da:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Da:Beginners%27_guide
       title: Hjælp for nybegyndere
       description: Hjælp for nybegyndere, som vedligeholdes af fællesskabet.
     help:
@@ -1216,7 +1223,7 @@ da:
       description: Hjælp til virksomheder og organisationer, der skifter til OpenStreetMap
         baserede kort og andre tjenester.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Gennemse wikien for dybdegående OSM dokumentation.
   about_page:
@@ -1232,14 +1239,12 @@ da:
       luftfotografier, GPS-enheder og lavteknologiske feltkort til at kontrollere
       at OSM er præcis og ajourført.
     community_driven_title: Drevet af fællesskabet
-    community_driven_html: |-
-      OpenStreetMap-fællesskabet er alsidigt, passioneret, og vokser hver dag.
-      Vores bidragsydere omfatter entusiastiske kortlæggere, GIS-fagfolk, ingeniører der
-      kører OSM-servere, humanitære arbejdere der kortlægger katastroferamte områder,
-      og mange flere.
-      For at læs mere om fællesskabet, se <a href='%{diary_path}'>brugerdagbøger</a>,
-      <a href='http://blogs.openstreetmap.org/'>fællesskabsblogs</a>, og
-       <a href='http://www.osmfoundation.org/'>OSM Foundations</a> hjemmeside.
+    community_driven_html: "OpenStreetMap-fællesskabet er alsidigt, passioneret, og
+      vokser hver dag.\nVores bidragsydere omfatter entusiastiske kortlæggere, GIS-fagfolk,
+      ingeniører der\nkører OSM-servere, humanitære arbejdere der kortlægger katastroferamte
+      områder,\nog mange flere.\nFor at læs mere om fællesskabet, se\n<a href='https://blog.openstreetmap.org'>OpenStreetMap-bloggen</a>,
+      \n<a href='%{diary_path}'>brugerdagbøger</a>,\n<a href='https://blogs.openstreetmap.org/'>fællesskabsblogs</a>,
+      og\n <a href='https://www.osmfoundation.org/'>OSM Foundations</a> hjemmeside."
     open_data_title: Åbne Data
     open_data_html: |-
       OpenStreetMap er <i>åbne data</i>: du må bruge dem til ethvert formål,
@@ -1486,7 +1491,7 @@ da:
       get_directions_title: Find vejen mellem to punkter
       from: Fra
       to: Til
-      where_am_i: Hvor er jeg?
+      where_am_i: Hvor er dette?
       where_am_i_title: Beskriv den nuværende position ved hjælp af søgemaskinen
       submit_text: Søg
     key:
@@ -2147,6 +2152,8 @@ da:
       not_a_role: Strengen "%{role}" er ikke en gyldig rolle.
       already_has_role: Brugeren har allerede rollen %{role}.
       doesnt_have_role: Brugeren har ikke rollen %{role}.
+      not_revoke_admin_current_user: Kan ikke trække administratorrollen tilbage fra
+        nuværende bruger.
     grant:
       title: Bekræft rolletildeling
       heading: Bekræft rolletildeling
@@ -2369,8 +2376,10 @@ da:
       new:
         intro: Opdaget en fejl eller noget der mangler? Lad andre kortlæggere vide
           det, så vi kan ordne det. Flyt markøren til den korrekte position, og skriv
-          en bemærkning for at forklare problemet. (Vær venlig ikke at indtaste personlige
-          oplysninger eller oplysninger fra ophavsretligt beskyttede kort eller kataloger.)
+          en bemærkning for at forklare problemet.
+        advice: Dine oplysninger er offentlige og vil måske blive brugt til at opdatere
+          kortet, så indtast ikke personlige oplysninger eller oplysninger fra kort
+          beskyttet af ophavsret eller mappeoversigter.
         add: Tilføj bemærkning
       show:
         anonymous_warning: Denne bemærkning indeholder kommentarer fra anonyme brugere
@@ -2391,9 +2400,6 @@ da:
         mapquest_car: Bil (MapQuest)
         mapquest_foot: Til fods (MapQuest)
         osrm_car: Bil (OSRM)
-        mapzen_bicycle: Cykel (Mapzen)
-        mapzen_car: Bil (Mapzen)
-        mapzen_foot: Fod (Mapzen)
       descend: Fald
       directions: Rutevejledning
       distance: Afstand
index e9e68c6f9178498b3cc420997ebf84e77dc901bb..32f2845248bcff45dc41b9efa89758490266988d 100644 (file)
@@ -9,6 +9,7 @@
 # Author: Candid Dauth
 # Author: CarstenG
 # Author: ChrisiPK
+# Author: ChristianSW
 # Author: CygnusOlor
 # Author: Daswaldhorn
 # Author: Diebuche
@@ -20,6 +21,7 @@
 # Author: Grille chompa
 # Author: Holger
 # Author: HolgerJeromin
+# Author: Hufkratzer
 # Author: Inkowik
 # Author: Jacobbraeutigam
 # Author: John07
@@ -179,6 +181,8 @@ de:
         title_comment: Änderungssatz %{id} - %{comment}
       join_discussion: Anmelden, um mitzudiskutieren
       discussion: Diskussion
+      still_open: Der Änderungssatz ist noch offen. Die Diskussion wird eröffnet,
+        sobald der Änderungssatz geschlossen ist.
     node:
       title: 'Knoten: %{name}'
       history_title: 'Chronik des Knotens: %{name}'
@@ -267,7 +271,7 @@ de:
     changeset_paging_nav:
       showing_page: Seite %{page}
       next: Nächste »
-      previous: « Vorige
+      previous: ‹ Vorherige
     changeset:
       anonymous: Anonym
       no_edits: (keine Bearbeitungen)
@@ -389,7 +393,7 @@ de:
       embeddable_html: HTML zum Einbinden
       licence: Lizenz
       export_details: Die von OpenStreetMap zur Verfügung gestellten Daten sind unter
-        der <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons
+        der <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons
         Open Database Lizenz</a> (ODbL) lizenziert.
       too_large:
         advice: 'Falls der obenstehende Export fehlschlägt, erwäge bitte, eine der
@@ -429,14 +433,14 @@ de:
   geocoder:
     search:
       title:
-        latlon: Suchergebnisse von <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Suchergebnisse von <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Suchergebnisse von <a href="http://www.npemap.org.uk/">NPEMap
           / FreeThe Postcode</a>
-        ca_postcode: Suchergebnisse von <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Ergebnisse von <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Suchergebnisse von <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Ergebnisse von <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Suchergebnisse von <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Ergebnisse von <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Ergebnisse von <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Ergebnisse von <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -446,12 +450,19 @@ de:
           chair_lift: Sessellift
           drag_lift: Schlepplift
           gondola: Gondelbahn
+          platter: Skilift
+          pylon: Mast
           station: Gondelstation
+          t-bar: Schlepplift
         aeroway:
           aerodrome: Flugplatz
+          airstrip: Startbahn
           apron: Flugvorfeld
           gate: Flugsteig
+          hangar: Flugzeughalle
           helipad: Hubschrauberlandeplatz
+          holding_position: Haltestelle
+          parking_position: Parkplatz
           runway: Start- und Landebahn
           taxiway: Rollbahn
           terminal: Terminal
@@ -486,37 +497,32 @@ de:
           crematorium: Krematorium
           dentist: Zahnarzt
           doctors: Arzt
-          dormitory: Studentenwohnheim
           drinking_water: Trinkwasser
           driving_school: Fahrschule
           embassy: Botschaft
-          emergency_phone: Notrufsäule
           fast_food: Schnellimbiss
           ferry_terminal: Fähren-Anlaufstelle
-          fire_hydrant: Hydrant
           fire_station: Feuerwehr
           food_court: Food-Court
           fountain: Springbrunnen
           fuel: Tankstelle
           gambling: Glücksspiel
           grave_yard: Friedhof
-          gym: Fitnessstudio
-          health_centre: Gesundheitszentrum
+          grit_bin: Streugutbehälter
           hospital: Krankenhaus
           hunting_stand: Hochstand
           ice_cream: Eisdiele
           kindergarten: Kindergarten
           library: Bücherei
-          market: Markt
           marketplace: Marktplatz
           monastery: Kloster
           motorcycle_parking: Motorradparkplatz
           nightclub: Nachtklub
-          nursery: Kindertagesstätte
           nursing_home: Altersheim
           office: Büro
           parking: Parkplatz
           parking_entrance: Parkeinfahrt
+          parking_space: Stellplatz
           pharmacy: Apotheke
           place_of_worship: Andachtsstätte
           police: Polizei
@@ -526,7 +532,6 @@ de:
           prison: Gefängnis
           pub: Kneipe
           public_building: Öffentliches Gebäude
-          reception_area: Empfangsbereich
           recycling: Recycling-Center
           restaurant: Restaurant
           retirement_home: Altersheim
@@ -551,6 +556,7 @@ de:
           village_hall: Gemeindezentrum
           waste_basket: Mülleimer
           waste_disposal: Abfallentsorgung
+          water_point: Wasseranschluss
           youth_centre: Jugendzentrum
         boundary:
           administrative: Verwaltungsgrenze
@@ -559,6 +565,7 @@ de:
           protected_area: Schutzgebiet
         bridge:
           aqueduct: Aquädukt
+          boardwalk: Strandpromenade
           suspension: Hängebrücke
           swing: Drehbrücke
           viaduct: Viadukt
@@ -578,25 +585,31 @@ de:
           "yes": Handwerksgeschäft
         emergency:
           ambulance_station: Rettungswache
+          assembly_point: Sammelplatz
           defibrillator: Defibrillator
           landing_site: Notlandeplatz
           phone: Notrufsäule
+          water_tank: Notwasserbehälter
+          "yes": Notfall
         highway:
           abandoned: Aufgegebene Straße
           bridleway: Reitweg
           bus_guideway: Busspur
           bus_stop: Bushaltestelle
           construction: Straße im Bau
+          corridor: Flur
           cycleway: Radweg
           elevator: Lift
           emergency_access_point: Notrufpunkt
           footway: Fußweg
           ford: Furt
+          give_way: Vorfahrt-beachten-Schild
           living_street: Spiel-/Wohnstraße
           milestone: Kilometerstein
           motorway: Autobahn
           motorway_junction: Autobahnausfahrt/-kreuz
           motorway_link: Autobahnauffahrt
+          passing_place: Ausweichstelle
           path: Pfad (Wanderweg)
           pedestrian: Fußgängerzone
           platform: Bahnsteig
@@ -613,6 +626,7 @@ de:
           services: Autobahnraststätte
           speed_camera: Blitzer
           steps: Treppe
+          stop: Stoppschild
           street_lamp: Straßenlaterne
           tertiary: Hauptstraße
           tertiary_link: Hauptstraße-Auffahrt
@@ -621,12 +635,12 @@ de:
           trail: Pfad
           trunk: Schnellstraße
           trunk_link: Schnellstraßenauffahrt
+          turning_loop: Wendeschleife
           unclassified: Straße
-          unsurfaced: Nichtasphaltierte Straße
           "yes": Straße
         historic:
           archaeological_site: Ausgrabungsstätte
-          battlefield: Kampfgebiet
+          battlefield: Schlachtfeld
           boundary_stone: Grenzstein
           building: Historisches Gebäude
           bunker: Bunker
@@ -641,6 +655,7 @@ de:
           manor: Gutshaus
           memorial: Denkmal
           mine: Mine
+          mine_shaft: Grubenschacht
           monument: Monument
           roman_road: Römerstraße
           ruins: Ruine
@@ -650,6 +665,7 @@ de:
           wayside_cross: Wegkreuz
           wayside_shrine: Bildstock
           wreck: Schiffswrack
+          "yes": Historischer Ort
         junction:
           "yes": Kreuzung
         landuse:
@@ -687,9 +703,9 @@ de:
         leisure:
           beach_resort: Strandbad
           bird_hide: Vogelbeobachtungshütte
-          club: Verein
           common: öffentliche Grünfläche (brit.)
           dog_park: Hundepark
+          firepit: Feuerstelle
           fishing: Fischereigrund
           fitness_centre: Fitnessstudio
           fitness_station: Freiluft-Fitnesseinrichtung
@@ -701,7 +717,7 @@ de:
           miniature_golf: Minigolf
           nature_reserve: Naturschutzgebiet
           park: Park
-          pitch: Sportplatz
+          pitch: Spielfeld
           playground: Spielplatz
           recreation_ground: Erholungsgebiet
           resort: Ferienort
@@ -714,15 +730,46 @@ de:
           water_park: Wasserpark
           "yes": Freizeit
         man_made:
+          adit: Stollen
+          beacon: Leuchtturm
+          beehive: Bienenstock
+          breakwater: Hafendamm
+          bridge: Brücke
+          bunker_silo: Bunker
+          chimney: Schornstein
+          crane: Kran
+          dolphin: Dalben
+          dyke: Deich
+          embankment: Böschung
+          flagpole: Fahnenmast
+          gasometer: Gasometer
+          groyne: Buhne
+          kiln: Brennofen
           lighthouse: Leuchtturm
+          mast: Mast
+          mine: Bergwerk
+          mineshaft: Grubenschacht
+          monitoring_station: Beobachtungsstation
+          petroleum_well: Erdölquelle
+          pier: Pfeiler
           pipeline: Rohrleitung
+          silo: Speicher
+          storage_tank: Lagertank
+          surveillance: Überwachung
           tower: Turm
+          wastewater_plant: Kläranlage
+          watermill: Wassermühle
+          water_tower: Wasserturm
+          water_well: Brunnen
+          water_works: Wasserwerk
+          windmill: Windmühle
           works: Fabrik
           "yes": menschgemacht
         military:
           airfield: Militärflugplatz
           barracks: Kaserne
           bunker: Bunker
+          "yes": Militär
         mountain_pass:
           "yes": Gebirgspass
         natural:
@@ -768,11 +815,14 @@ de:
           accountant: Buchhaltungsbüro
           administrative: Verwaltung
           architect: Architekt
+          association: Gesellschaft
           company: Unternehmen
+          educational_institution: Bildungseinrichtung
           employment_agency: Arbeitsamt
           estate_agent: Immobilienhändler
           government: Amt
           insurance: Versicherungsbüro
+          it: IT-Büro
           lawyer: Rechtsanwalt
           ngo: NGO
           telecommunication: Telekommunikationsbüro
@@ -780,9 +830,8 @@ de:
           "yes": Büro
         place:
           allotments: Schrebergärten
-          block: Block
-          airport: Flughafen
           city: Stadt
+          city_block: Häuserblock
           country: Staat
           county: Bezirk
           farm: Bauernhof
@@ -793,12 +842,13 @@ de:
           islet: Eiland
           isolated_dwelling: Einzelgehöft
           locality: Flur
-          moor: Moor
           municipality: Gemeinde
           neighbourhood: Wohngegend
           postcode: Postleitzahl
+          quarter: Stadtviertel
           region: Region
           sea: Meer
+          square: Platz
           state: Bundesland/-staat
           subdivision: Vorort
           suburb: Stadtteil
@@ -810,10 +860,8 @@ de:
           abandoned: Aufgegebene Bahnstrecke
           construction: Bahnstrecke im Bau
           disused: Aufgelassene Bahnstrecke
-          disused_station: Aufgelassener Bahnhof
           funicular: Standseilbahn
           halt: Haltestelle
-          historic_station: Historischer Bahnhof
           junction: Bahnknoten
           level_crossing: Eisenbahnkreuzung
           light_rail: Stadtbahn
@@ -836,9 +884,10 @@ de:
           antiques: Antiquitätengeschäft
           art: Kunstladen
           bakery: Bäckerei
-          beauty: Parfümerie
+          beauty: Schönheitssalon
           beverages: Getränkemarkt
           bicycle: Fahrradgeschäft
+          bookmaker: Buchmacher
           books: Buchgeschäft
           boutique: Boutique
           butcher: Metzgerei
@@ -877,12 +926,16 @@ de:
           hairdresser: Frisör
           hardware: Eisenwarenhändler
           hifi: Elektroshop
-          insurance: Versicherungsbüro
+          houseware: Hauswarenladen
+          interior_decoration: Innenausstattung
           jewelry: Juwelier
           kiosk: Kiosk
+          kitchen: Küchengeschäft
           laundry: Wäscherei
+          lottery: Lottoannahmestelle
           mall: Einkaufszentrum
           market: Markt
+          massage: Masseur
           mobile_phone: Handygeschäft
           motorcycle: Motorradgeschäft
           music: Musikladen
@@ -890,19 +943,25 @@ de:
           optician: Optiker
           organic: Bio-Laden
           outdoor: Outdoor-Ausrüster
+          paint: Lackiererei
+          pawnbroker: Pfandleiher
           pet: Tierhandlung
           pharmacy: Apotheke
           photo: Fotoladen
-          salon: Salon
+          seafood: Meeresfrüchte
           second_hand: Second-Hand-Geschäft
           shoes: Schuhgeschäft
-          shopping_centre: Einkaufszentrum
           sports: Sportgeschäft
           stationery: Schreibwarenladen
           supermarket: Supermarkt
           tailor: Schneiderei
+          ticket: Ticketladen
+          tobacco: Tabakladen
           toys: Spielwarengeschäft
           travel_agency: Reisebüro
+          tyres: Reifenhändler
+          vacant: Leerstehendes Geschäft
+          variety_store: Billigladen
           video: Videothek
           wine: Vinothek
           "yes": Geschäft
@@ -928,6 +987,7 @@ de:
           viewpoint: Aussichtspunkt
           zoo: Zoo
         tunnel:
+          building_passage: Gebäudedurchgang
           culvert: Durchlass
           "yes": Tunnel
         waterway:
@@ -959,7 +1019,7 @@ de:
         level10: Nachbarschaftsgrenze
     description:
       title:
-        osm_nominatim: Lage von <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Lage von <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Lage von <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1040,8 +1100,8 @@ de:
       title_html: Urheberrecht und Lizenz
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> sind <i>„Open Data“</i>, die gemäß der
-        <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database Lizenz</a>
-        (ODbL) durch die <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) verfügbar sind.
+        <a href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database Lizenz</a>
+        (ODbL) durch die <a href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) verfügbar sind.
       intro_2_html: |-
         Es steht dir frei unsere Daten zu kopieren, weiterzugeben,
         zu übermitteln sowie anzupassen, sofern du OpenStreetMap
@@ -1050,10 +1110,10 @@ de:
         als Grundlage für weitere Bearbeitungen verwendest, kannst
         du das Ergebnis auch nur gemäß der selben Lizenz weitergeben.
         Der vollständige Lizenztext ist unter
-        <a href="http://opendatacommons.org/licenses/odbl/1.0/">Lizenz</a>
+        <a href="https://opendatacommons.org/licenses/odbl/1.0/">Lizenz</a>
         einsehbar und erläutert deine Rechte und Pflichten.
       intro_3_html: Die Kartografie in unseren Kartenkacheln und unsere Dokumentation
-        sind unter der ''Creative-Commons''-Lizenz <a href="http://creativecommons.org/licenses/by-sa/2.0/">„Namensnennung
+        sind unter der ''Creative-Commons''-Lizenz <a href="https://creativecommons.org/licenses/by-sa/2.0/">„Namensnennung
         – Weitergabe unter gleichen Bedingungen“ 2.0</a> (CC BY-SA) verfügbar.
       credit_title_html: Wie auf die Urheberschaft von OpenStreetMap hinzuweisen ist
       credit_1_html: Wir verlangen die Verwendung des Hinweises „&copy; OpenStreetMap-Mitwirkende“.
@@ -1061,7 +1121,7 @@ de:
         Du musst auch klarstellen, dass die Daten unter der Open-Database-Lizenz
         verfügbar sind, und, sofern du unsere Kartenkacheln verwendest, dass die
         Kartografie gemäß CC BY-SA lizenziert ist. Du kannst dies tun, indem du auf
-        <a href="http://www.openstreetmap.org/copyright">www.openstreetmap.org/copyright</a> verlinkst.
+        <a href="https://www.openstreetmap.org/copyright">www.openstreetmap.org/copyright</a> verlinkst.
         Ersatzweise, und als Erfordernis, falls du OSM in Datenform weitergibst,
         kannst du die Lizenz(en) direkt verlinken und benennen. In Medien, in denen
         keine Links möglich sind (z.B. gedruckten Werken), empfehlen wir dir,
@@ -1077,7 +1137,7 @@ de:
       more_title_html: Weitere Informationen
       more_1_html: |-
         Mehr Informationen dazu, wie unsere Daten verwendet werden können und wie man auf unsere Urheberschaft hinweist,
-        kann man auf unserer <a href="http://osmfoundation.org/Licence">OSMF-Lizenzseite</a> nachlesen.
+        kann man auf unserer <a href="https://osmfoundation.org/Licence">OSMF-Lizenzseite</a> nachlesen.
       more_2_html: |-
         Obwohl OpenStreetMap „Open Data“ ist, können wir keine
         unentgeltliche Karten-API für Drittparteien bereitstellen.
@@ -1088,10 +1148,10 @@ de:
       contributors_intro_html: 'Unsere Mitwirkenden sind tausende einzelne Menschen.
         Wir beziehen auch offen lizenzierte Daten von nationalen Kartenagenturen und
         anderen Quellen ein, darunter:'
-      contributors_at_html: '<strong>Österreich</strong>: Enthält Daten der <a href="http://data.wien.gv.at/">Stadt
-        Wien</a> (lizenziert gemäß <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
-        BY AT</a>), des <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Landes
-        Vorarlberg</a> und des Landes Tirol (<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">lizenziert
+      contributors_at_html: '<strong>Österreich</strong>: Enthält Daten der <a href="https://data.wien.gv.at/">Stadt
+        Wien</a> (lizenziert gemäß <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC
+        BY AT</a>), des <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Landes
+        Vorarlberg</a> und des Landes Tirol (<a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">lizenziert
         gemäß CC BY AT samt Erweiterungen zur Lizenz</a>).'
       contributors_ca_html: '<strong>Kanada</strong>: Enthält Daten von GeoBase&reg;,
         GeoGratis (&copy; <i>Department of Natural Resources Canada</i>), CanVec (&copy;
@@ -1101,11 +1161,11 @@ de:
         <strong>Finnland</strong>: Enthält Daten von der
         topografischen Datenbank der National Land Survey of Finland
         und andere Datensätze, unter der
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI-Lizenz</a>.
+        <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI-Lizenz</a>.
       contributors_fr_html: '<strong>Frankreich</strong>: Enthält Daten der <i>Direction
         Générale des Impôts</i>.'
       contributors_nl_html: '<strong>Niederlande</strong>: Enthält, &copy; AND-Daten,
-        2007 (<a href="http://www.and.com">www.and.com</a>)'
+        2007 (<a href="https://www.and.com">www.and.com</a>)'
       contributors_nz_html: '<strong>Neuseeland</strong>: Enthält Daten aus <i>Land
         Information New Zealand</i>. Urheberrecht vorbehalten.'
       contributors_si_html: |-
@@ -1119,7 +1179,7 @@ de:
       contributors_gb_html: '<strong>Vereinigtes Königreich</strong>: Enthält Daten
         des <i>Ordnance Survey</i> &copy; Urheber- und Datenbankrecht 2010-12.'
       contributors_footer_1_html: Weitere Informationen sowie andere Datenquellen,
-        die zur Verbesserung von OpenStreetMap genutzt wurden, sind auf <a  href="http://wiki.openstreetmap.org/wiki/Contributors">der
+        die zur Verbesserung von OpenStreetMap genutzt wurden, sind auf <a  href="https://wiki.openstreetmap.org/wiki/Contributors">der
         Seite über die Mitwirkenden</a> im Wiki von OpenStreetMap zu finden.
       contributors_footer_2_html: Die Einbeziehung von Daten bei OpenStreetMap bedeutet
         nicht, dass der ursprüngliche Datenlieferant OpenStreetMap unterstützt, Gewährleistung
@@ -1132,13 +1192,13 @@ de:
       infringement_2_html: |-
         Sofern du denkst, dass urheberrechtlich geschütztes Material unerlaubterweise zur
         OpenStreetMap-Datenbank oder auf dieser Website hinzugefügt wurde, informiere dich
-        bitte über unser <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">Verfahren
+        bitte über unser <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">Verfahren
         zum Entfernen von Inhalten</a> oder melde dies direkt mit unserem
         <a href="http://dmca.openstreetmap.org/">Onlineformular</a>.
       trademarks_title_html: <span id="trademarks"></span>Markenzeichen
       trademarks_1_html: OpenStreetMap, das Lupenlogo und „State of the Map“ sind
         eingetragene Warenzeichen der OpenStreetMap Foundation. Falls du Fragen über
-        deine Verwendung der Marken hast, sende deine Fragen bitte an die <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lizenz-Arbeitsgruppe</a>.
+        deine Verwendung der Marken hast, lies bitte unsere <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Markenrichtlinie</a>.
   welcome_page:
     title: Willkommen!
     introduction_html: |-
@@ -1172,8 +1232,8 @@ de:
       paragraph_1_html: "OpenStreetMap hat nur wenige formale Regeln, aber wir erwarten,
         dass alle Teilnehmer\nmit der Gemeinschaft zusammenarbeiten und kommunizieren.
         Falls du andere Aktivitäten erwägst\nals per Hand zu bearbeiten, lies und
-        folge bitte den Richtlinien zu\n<a href=\"http://wiki.openstreetmap.org/wiki/DE:Import/Guidelines\">Importen</a>
-        und \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">automatischen
+        folge bitte den Richtlinien zu\n<a href=\"https://wiki.openstreetmap.org/wiki/DE:Import/Guidelines\">Importen</a>
+        und \n<a href=\"https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">automatischen
         Bearbeitungen</a>."
     questions:
       title: Fragen?
@@ -1210,7 +1270,7 @@ de:
       explanation_html: |-
         Falls du Bedenken über die Verwendung unserer Daten oder über die Inhalte hast, lies bitte unsere
         <a href="/copyright">Copyright-Seite</a> für mehr rechtliche Informationen oder kontaktiere die entsprechende
-        <a href="http://wiki.osmfoundation.org/wiki/Working_Groups">OSMF-Arbeitsgruppe</a>.
+        <a href="https://wiki.osmfoundation.org/wiki/Working_Groups">OSMF-Arbeitsgruppe</a>.
   help_page:
     title: Hilfe erhalten
     introduction: |-
@@ -1222,7 +1282,7 @@ de:
       description: Beginne mit dieser Schnellanleitung, die die OpenStreetMap-Grundlagen
         abdeckt.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/DE:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/DE:Beginners%27_guide
       title: Anleitung für Anfänger
       description: Eine durch die Gemeinschaft gewartete Anleitung für Anfänger.
     help:
@@ -1246,7 +1306,7 @@ de:
       description: Hilfe für auf Karten und anderen Diensten gegründeten Unternehmen
         und Organisationen, die zu OpenStreetMap wechseln.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Durchsuche das Wiki für eine ausführliche OSM-Dokumentation.
   about_page:
@@ -1270,8 +1330,8 @@ de:
       Um mehr über die Gemeinschaft zu erfahren, lies unseren
       <a href='https://blog.openstreetmap.org'>OpenStreetMap-Blog</a>,
       die <a href='%{diary_path}'>Benutzertagebücher</a>,
-      <a href='http://blogs.openstreetmap.org/'>Community-Blogs</a> und die Website der
-      <a href='http://www.osmfoundation.org/'>OSM-Foundation</a>.
+      <a href='https://blogs.openstreetmap.org/'>Community-Blogs</a> und die Website der
+      <a href='https://www.osmfoundation.org/'>OSM-Foundation</a>.
     open_data_title: Open Data
     open_data_html: |-
       OpenStreetMap ist „<i>Open Data</i>“: Du kannst es für jeden Zweck verwenden,
@@ -1281,15 +1341,17 @@ de:
       <a href='%{copyright_path}'>Urheberrechts- und Lizenzseite</a> für Einzelheiten.
     legal_title: Rechtliche Hinweise
     legal_html: |-
-      Diese Website und viele damit in Zusammenhang stehende Dienste werden
-      von der <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
+      Diese Website und viele damit in Zusammenhang stehenden Dienste werden
+      von der <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
       für die OSM-Gemeinschaft betrieben. Die Verwendung aller OSMF-betriebenen Dienste
       ist Thema unserer
-      „<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Acceptable Use Policies</a>“
-      und unserer <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Datenschutzrichtlinie</a>.
+      „<a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Acceptable Use Policies</a>“
+      und unserer <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Datenschutzrichtlinie</a>.
+      <br>
+      Bitte <a href='https://osmfoundation.org/Contact'>kontaktiere die OSMF</a>,
+      falls du Lizenz-, Urheberrechts- oder andere rechtliche Fragen hast.
       <br>
-      Bitte <a href='http://osmfoundation.org/Contact'>kontaktiere die OSMF</a>,
-      falls du Lizenz-, Urheberrechts- oder andere rechtliche Fragen und Probleme hast.
+      OpenStreetMap, das Lupenlogo und „State of the Map“ sind <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">eingetragene Warenzeichen der OSMF</a>.
     partners_title: Partner
   notifier:
     diary_comment_notification:
@@ -1509,15 +1571,15 @@ de:
       user_page_link: Einstellungsseite
       anon_edits_link_text: Hier findest du mehr Infos dazu.
       flash_player_required: Du benötigst den Flash Player um Potlatch, den OpenStreetMap-Flash-Editor,
-        zu benutzen. <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Lade
-        den Flash Player von Adobe.com herunter</a>. <a href="http://wiki.openstreetmap.org/wiki/DE:Editing">Einige
+        zu benutzen. <a href="https://get.adobe.com/flashplayer/">Lade den Flash Player
+        von Adobe.com herunter</a>. <a href="https://wiki.openstreetmap.org/wiki/DE:Editing">Einige
         andere Möglichkeiten</a>, um OpenStreetMap zu editieren, sind hier beschrieben.
       potlatch_unsaved_changes: Du hast deine Arbeit noch nicht gespeichert. (Um sie
         in Potlach zu speichern, klicke auf eine leere Fläche bzw. deselektiere die
         Linie oder den Knoten, wenn du im Live-Modus editierst oder klicke auf Speichern,
         wenn ein Speicherbutton vorhanden ist.)
       potlatch2_not_configured: Potlatch 2 wurde nicht konfiguriert - Bitte besuche
-        http://wiki.openstreetmap.org/wiki/The_Rails_Port
+        https://wiki.openstreetmap.org/wiki/The_Rails_Port
       potlatch2_unsaved_changes: Es gibt ungesicherte Änderungen. (Du solltest in
         Potlatch 2 „speichern“ klicken.)
       id_not_configured: iD wurde nicht konfiguriert
@@ -1609,7 +1671,7 @@ de:
       edit: Bearbeiten
       preview: Vorschau
     markdown_help:
-      title_html: Interpretiert mit <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Interpretiert mit <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Überschriften
       heading: Überschrift
       subheading: Zwischenüberschrift
@@ -1721,7 +1783,7 @@ de:
       description: Letzte GPS-Track-Uploads durchsuchen
       tagged_with: ' gekennzeichnet mit %{tags}'
       empty_html: Noch keine GPS-Tracks vorhanden. <a href='%{upload_link}'>Lade einen
-        neuen Track hoch</a> oder informiere dich auf folgender <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>Wikiseite</a>
+        neuen Track hoch</a> oder informiere dich auf folgender <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>Wikiseite</a>
         über das Aufzeichnen von GPS-Tracks.
     delete:
       scheduled_for_deletion: Für die Löschung vorgesehener Track
@@ -1937,12 +1999,12 @@ de:
           Jeder kann sie verbessern, aktualisieren und erweitern, sowie für jeden Zweck verwenden.</p>
           <p>Melde dich an und mache mit. Zur Bestätigung wird eine E-Mail an die angegebene Adresse geschickt werden, bitte gehe wie darin beschrieben vor.</p>
       license_agreement: Wenn du dein Benutzerkonto bestätigst, musst du auch den
-        <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">Bedingungen
+        <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">Bedingungen
         für Mitwirkende</a> zustimmen.
       email address: 'E-Mail-Adresse:'
       confirm email address: 'Bitte wiederhole die E-Mail-Adresse:'
       not displayed publicly: Deine Anrede wird nicht öffentlich angezeigt, siehe
-        unsere <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF-Datenschutzrichtlinie
+        unsere <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF-Datenschutzrichtlinie
         inklusive des Abschnitts zu E-Mail-Adressen">Datenschutzrichtlinie</a> für
         weitere Informationen.
       display name: 'Benutzername:'
@@ -2066,12 +2128,12 @@ de:
       email never displayed publicly: (nicht öffentlich sichtbar)
       external auth: 'Externe Authentifikation:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: Was ist das?
       public editing:
         heading: 'Karte bearbeiten (public editing):'
         enabled: Aktiviert. Normales Bearbeiten der Kartendaten ist möglich.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Was bedeutet das?
         disabled: Deaktiviert. Das Bearbeiten von Kartendaten NICHT möglich, alle
           bisherigen Bearbeitungen sind anonym.
@@ -2082,7 +2144,7 @@ de:
           senden noch deinen Wohnort sehen. Um sichtbar zu machen, welche Arbeit von
           dir stammt, und um kontaktierbar zu werden, klicke auf den Button unten.
           <b>Seit Version 0.6 der API aktiv ist, können unangemeldete Benutzer die
-          Karte nicht mehr bearbeiten</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Warum?</a>).<ul><li>Deine
+          Karte nicht mehr bearbeiten</b> (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">Warum?</a>).<ul><li>Deine
           E-Mail-Adresse wird bei Verlassen des anonymen Status nicht veröffentlicht.</li><li>Die
           Aktion kann nicht rückgängig gemacht werden. Für neu registrierte Benutzer
           besteht die Möglichkeit des anonymen Benutzerkontos nicht mehr.</li></ul>
@@ -2210,6 +2272,8 @@ de:
       not_a_role: Der String „%{role}“ bezeichnet keine gültige Rolle.
       already_has_role: Der Nutzer gehört bereits der Rolle %{role} an.
       doesnt_have_role: Der Nutzer gehört nicht der Rolle %{role} an.
+      not_revoke_admin_current_user: Die Administratorrolle kann nicht dem aktuellen
+        Benutzer entzogen werden.
     grant:
       title: Bestätige Rollenzuordnung
       heading: Bestätige Rollenzuordnung
@@ -2441,9 +2505,10 @@ de:
       new:
         intro: Fehlt etwas oder hast du einen Fehler gefunden? Bitte verschiebe den
           Marker auf die exakte Position und gib genaue Hinweise/Informationen an
-          bzw. beschreibe den Fehler in der Karte möglichst präzise. (Bitte gib keine
-          persönlichen Informationen oder Informationen von urheberrechtlich geschützten
-          Karten oder Verzeichnislisten an.)
+          bzw. beschreibe den Fehler in der Karte möglichst präzise.
+        advice: Deine Meldung ist öffentlich und kann zur Aktualisierung der Karte
+          verwendet werden. Gib deshalb keine persönlichen oder urheberrechtlich geschützten
+          Informationen von anderen Karten oder Verzeichnislisten an.
         add: Hinweis/Fehler melden
       show:
         anonymous_warning: Dieser Hinweis enthält Kommentare von anonymen Benutzern,
@@ -2465,9 +2530,6 @@ de:
         mapquest_car: Auto (MapQuest)
         mapquest_foot: Fuß (MapQuest)
         osrm_car: Auto (OSRM)
-        mapzen_bicycle: Fahrrad (Mapzen)
-        mapzen_car: Auto (Mapzen)
-        mapzen_foot: Fuß (Mapzen)
       descend: Absteigend
       directions: 'Routenanweisungen:'
       distance: Distanz
index edfa18f4f9eb7bf396acab678f80716455a77c70..fb59afa8b79b251fdd67144918e14711f9e5b497 100644 (file)
@@ -99,8 +99,8 @@ diq:
   browse:
     created: Vıraziye
     closed: Racneya
-    created_html: <abbr title='%{title}'>%{time} veror</abbr> vıraziye
-    closed_html: <abbr title='%{title}'>%{time} veror</abbr> racneye
+    created_html: Verê <abbr title='%{title}'>%{time} de</abbr> vıraziyo
+    closed_html: Verê <abbr title='%{title}'>%{time} de</abbr> kılid biyo
     version: Versiyon
     in_changeset: Qeydê Vurnayışan
     anonymous: anonim
@@ -324,33 +324,26 @@ diq:
           crematorium: Krematoryum
           dentist: Dındandar
           doctors: Dıxtori
-          dormitory: Ware
           drinking_water: Awa Şımıtışi
           driving_school: Kursa Ramenan
           embassy: Sefirey
-          emergency_phone: Vistren Telefon
           fast_food: Fast Food
           ferry_terminal: Terminala Feriboter
-          fire_hydrant: Mıslıxa Şewati
           fire_station: Itfaiye
           food_court: Kerwanseray
           fountain: Fıskiye
           fuel: Petrol
           gambling: Kumarxane
           grave_yard: Mezla ser
-          gym: Merkeza Fitnessi / Salona Spori
-          health_centre: Merkeza Weşiney
           hospital: Nêweşxane
           hunting_stand: Standê Seydwanan
           ice_cream: Dondırme
           kindergarten: Kreş
           library: Kıtıbxane
-          market: Market
           marketplace: Heruna bazari
           monastery: Manastır
           motorcycle_parking: Motorpiskilet park kerdış
           nightclub: Kluba Şewer
-          nursery: Kreş
           nursing_home: Rehatxane
           office: Ofis
           parking: Otopark
@@ -364,7 +357,6 @@ diq:
           prison: Hepısxane
           pub: Biraxane
           public_building: Binaya Şaran
-          reception_area: Heruna Resepsiyoni
           recycling: Heruna peyd amayışi
           restaurant: Restaurant
           retirement_home: Weynexane
@@ -460,7 +452,6 @@ diq:
           trunk: Letebıyayi ser ray
           trunk_link: Lwtebıyayi ser ray
           unclassified: Nêrêzbıyayi ray
-          unsurfaced: Raya xam
           "yes": Ray
         historic:
           archaeological_site: Arkeolojik Ca
@@ -523,7 +514,6 @@ diq:
         leisure:
           beach_resort: Dewa plajın
           bird_hide: Cay mıriçık weynayışi
-          club: Klüb
           common: Umumi erd
           dog_park: Parka kutıkan
           fishing: Heruna masan
@@ -616,8 +606,6 @@ diq:
           "yes": Ofis
         place:
           allotments: Bostan
-          block: Blok
-          airport: Meydanê hewayi
           city: Suk
           country: Dewlete
           county: Welat
@@ -628,7 +616,6 @@ diq:
           island: Ada
           islet: Adeqeq
           locality: Wereyin
-          moor: Lıncane
           municipality: Belediya
           neighbourhood: Mehla
           postcode: Kodê posteyi
@@ -675,7 +662,7 @@ diq:
           gallery: Galeri
           garden_centre: Merkeza Hêgay
           gift: Çiyo Hediye
-          salon: Kuafor
+          "yes": Dukan
         tourism:
           gallery: Galeriye
           hostel: Hostel
@@ -688,6 +675,7 @@ diq:
           canal: Kenal
           dam: Berac
           lock: İskele
+          river: Ro
     description:
       types:
         cities: Suki
@@ -941,7 +929,7 @@ diq:
       remove as friend: Embazan ra vec
       add as friend: Embazi cı ke
       mapper since: 'Demê herdnigarwaniye:'
-      ago: (%{time_in_words_ago} veror)
+      ago: (%{time_in_words_ago} ver)
       ct undecided: Darıdeyo
       ct declined: Red kerd
       ct accepted: Verdê %{ago} qebul ke
@@ -1111,6 +1099,8 @@ diq:
     notes:
       show:
         comment: Mışewre
+    directions:
+      time: Zeman
   redaction:
     edit:
       description: Şınasnayış
index 1a605354d025a24aacfc005edb6ea024acde1296..a3eb231afbc9e201e1d0b16fc9c061f9c8fede7d 100644 (file)
@@ -413,30 +413,23 @@ dsb:
           crematorium: Krematorium
           dentist: Zubny gójc
           doctors: Gójce
-          dormitory: Internat
           drinking_water: Pitna wóda
           driving_school: Jězdna šula
           embassy: Wjelikopósłaństwo
-          emergency_phone: Telefon za nuzowe zawołanje
           fast_food: Pójědankarnja
           ferry_terminal: Pśewózny pśistaw
-          fire_hydrant: Hydrant
           fire_station: Wognjarnja
           food_court: Food Court
           fountain: Studnja
           fuel: Tankownja
           grave_yard: Kjarchob
-          gym: Fitnesowy centrum
-          health_centre: Strowotniski centrum
           hospital: Chórownja
           hunting_stand: Góntwarske sedło
           ice_cream: Lod
           kindergarten: Źiśownja
           library: Knigłownja
-          market: Wiki
           marketplace: Wikowanišćo
           nightclub: Nocny klub
-          nursery: Źiśownja
           nursing_home: Wótwardowarnja
           office: Běrow
           parking: Parkowanišćo
@@ -449,7 +442,6 @@ dsb:
           prison: Popajźeństwo
           pub: Kjarcma
           public_building: Zjawne twarjenje
-          reception_area: Wobcerk pśidostaśa
           recycling: Zběranišćo starowinow
           restaurant: Gósćeńc
           retirement_home: Starcownja
@@ -527,7 +519,6 @@ dsb:
           trunk: Dalokowobchadowa droga
           trunk_link: Dalokowobchadowa droga
           unclassified: Njezarědowana droga
-          unsurfaced: Njewobtwarźona droga
         historic:
           archaeological_site: Archeologiske wukopowanišćo
           battlefield: Bitwišćo
@@ -659,7 +650,6 @@ dsb:
           travel_agent: Drogowański běrow
           "yes": Běrow
         place:
-          airport: Lětanišćo
           city: Wjelike město
           country: Kraj
           county: Wokrejs
@@ -671,7 +661,6 @@ dsb:
           islet: Mała kupa
           isolated_dwelling: Jadnotliwe bydło
           locality: Sedlišćo
-          moor: Bagno
           municipality: Gmejna
           neighbourhood: Bydleński wobcerk
           postcode: Postowa licba
@@ -687,10 +676,8 @@ dsb:
           abandoned: Spušćona zeleznicowa cera
           construction: Zeleznicowa cera se twari
           disused: Njewužywana zeleznicowa cera
-          disused_station: Njewužywane dwórnišćo
           funicular: Powrjozowa zeleznica
           halt: Zeleznicowe zastanišćo
-          historic_station: Historiske dwórnišćo
           junction: Zeleznicowe kśicnišćo
           level_crossing: Zeleznicowy pśechod
           light_rail: Měsćańska zeleznica
@@ -754,7 +741,6 @@ dsb:
           hairdresser: Frizerski salon
           hardware: Twarski mark
           hifi: Technika hi-fi
-          insurance: Zawěsćarnja
           jewelry: Pyšnotkowy wobchod
           kiosk: Kiosk
           laundry: Pałkarnja
@@ -770,10 +756,8 @@ dsb:
           pet: Coologiska pśedawarnja
           pharmacy: Aptejka
           photo: Fotograf
-          salon: Salon
           second_hand: Nakupowarnja
           shoes: Wobchod za crjeje
-          shopping_centre: Kupowański centrum
           sports: Sportowy wobchod
           stationery: Pśedawarnja za pisańskich wórow
           supermarket: Supermark
index f208ac40a4a10e78cb1c729e555feec1320e9ec2..2a0e30a44ae779e5c1c02dbb063349bbce812209 100644 (file)
@@ -377,7 +377,7 @@ el:
       embeddable_html: Ενσωματούμενη HTML
       licence: Άδεια
       export_details: Τα δεδομένα του OpenStreetMap είναι αδειοδοτημένα υπό την <a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
+        href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
         Database License</a> (ODbL).
       too_large:
         advice: 'Αν η εξαγωγή αποτυγχάνει, παρακαλώ δοκιμάστε μία από τις πηγές που
@@ -418,15 +418,15 @@ el:
   geocoder:
     search:
       title:
-        latlon: Αποτελέσματα από την <a href="http://openstreetmap.org/">εσωτερική</a>
+        latlon: Αποτελέσματα από την <a href="https://openstreetmap.org/">εσωτερική</a>
           βάση δεδομένων
         uk_postcode: Αποτελέσματα από <a href="http://www.npemap.org.uk/">NPEMap /
           FreeThe Postcode</a>
-        ca_postcode: Αποτελέσματα από <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Αποτελέσματα από το <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Αποτελέσματα από <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Αποτελέσματα από το <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Αποτελέσματα από το <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Αποτελέσματα από το <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Αποτελέσματα από το <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Αποτελέσματα από το <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -477,33 +477,26 @@ el:
           crematorium: Κρεματόριο
           dentist: Οδοντίατρος
           doctors: Ιατροί
-          dormitory: Κοιτώνας
           drinking_water: Πόσιμο νερό
           driving_school: Σχολή οδηγών
           embassy: Πρεσβεία
-          emergency_phone: Τηλέφωνο έκτακτης ανάγκης
           fast_food: Ταχυφαγείο
           ferry_terminal: Σταθμός πορθμείων
-          fire_hydrant: Κρουνός πυροσβεστικής
           fire_station: Πυροσβεστικός σταθμός
           food_court: Προαύλιο φαγητού
           fountain: Συντριβάνι
           fuel: Καύσιμα
           gambling: Τυχερά παιχνίδια
           grave_yard: Νεκροταφείο
-          gym: Γυμναστήριο
-          health_centre: Κέντρο υγείας
           hospital: Νοσοκομείο
           hunting_stand: Κυνηγητικό κιόσκι
           ice_cream: Παγωτό
           kindergarten: Νηπιαγωγείο
           library: Βιβλιοθήκη
-          market: Αγορά
           marketplace: Αγορά
           monastery: Μοναστήρι
           motorcycle_parking: Χώρος στάθμευσης μοτοσικλετών
           nightclub: Νυχτερινό κέντρο
-          nursery: Παιδικός σταθμός
           nursing_home: Οίκος ευγηρίας
           office: Γραφείο
           parking: Χώρος στάθμευσης
@@ -517,7 +510,6 @@ el:
           prison: Φυλακή
           pub: Παμπ
           public_building: Δημόσιο κτίριο
-          reception_area: Χώρος υποδοχής
           recycling: Σημείο ανακύκλωσης
           restaurant: Εστιατόριο
           retirement_home: Γηροκομείο
@@ -613,7 +605,6 @@ el:
           trunk: Εθνική οδός
           trunk_link: Εθνική οδός
           unclassified: Αταξινόμητη οδός
-          unsurfaced: Δρόμος χωρίς επίστρωση
           "yes": Δρόμος
         historic:
           archaeological_site: Αρχαιολογικός χώρος
@@ -678,7 +669,6 @@ el:
         leisure:
           beach_resort: Παραθαλάσσιο θέρετρο
           bird_hide: Καταφύγιο πουλιών
-          club: Κλαμπ
           common: Κοινόχρηστη γη
           dog_park: Πάρκο σκύλων
           fishing: Αλιευτική περιοχή
@@ -771,8 +761,6 @@ el:
           "yes": Γραφείο
         place:
           allotments: Λαχανόκηποι
-          block: Φραγή
-          airport: Αεροδρόμιο
           city: Πόλη
           country: Χώρα
           county: Κομητεία
@@ -784,7 +772,6 @@ el:
           islet: Νησίδα
           isolated_dwelling: Απομονωμένη κατοικία
           locality: Τοποθεσία
-          moor: Δέστρα
           municipality: Δήμος
           neighbourhood: Γειτονιά
           postcode: Ταχυδρομικός κώδικας
@@ -801,10 +788,8 @@ el:
           abandoned: Εγκαταλελειμμένος σιδηρόδρομος
           construction: Σιδηρόδρομος υπό κατασκευή
           disused: Σιδηρόδρομος εκτός χρήσης
-          disused_station: Σιδηροδρομικός σταθμός εκτός χρήσης
           funicular: Τελεφερίκ σε ράγες
           halt: Σταθμός τραίνου
-          historic_station: Ιστορικός σιδηροδρομικός σταθμός
           junction: Σιδηροδρομικός κόμβος
           level_crossing: Ισόπεδη διάβαση
           light_rail: Ελαφρύ τρένο
@@ -868,12 +853,13 @@ el:
           hairdresser: Κομμωτήριο
           hardware: Κατάστημα με χρώματα-σιδηρικά
           hifi: Hi-Fi
-          insurance: Ασφαλιστική
           jewelry: Κοσμηματοπωλείο
           kiosk: Περίπτερο
           laundry: Πλυντήριο
+          lottery: Λοταρία
           mall: Εμπορικό κέντρο
           market: Αγορά
+          massage: Μασάζ
           mobile_phone: Κατάστημα κινητής τηλεφωνίας
           motorcycle: Κατάστημα μοτοσικλετών
           music: Κατάστημα μουσικής
@@ -884,10 +870,9 @@ el:
           pet: Κατάστημα κατοικίδιων
           pharmacy: Φαρμακείο
           photo: Φωτογραφείο
-          salon: Σαλόνι
+          seafood: Θαλασσινό φαγητό
           second_hand: Κατάστημα μεταχειρισμένων
           shoes: Κατάστημα υποδημάτων
-          shopping_centre: Εμπορικό κέντρο
           sports: Κατάστημα αθλητικών
           stationery: Κατάστημα χαρτικών/ειδών γραφείου
           supermarket: Σουπερμάρκετ
@@ -950,7 +935,7 @@ el:
         level10: Σύνορο προαστίου
     description:
       title:
-        osm_nominatim: Τοποθεσία από το <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Τοποθεσία από το <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Τοποθεσία από το <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1028,23 +1013,23 @@ el:
     legal_babble:
       title_html: Πνευματικά δικαιώματα και άδεια χρήσης
       intro_1_html: |-
-        Το OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> είναι βάση <i>ανοικτών δεδομένων</i> αδειοδοτημένα υπό την <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) από το <a
-        href="http://osmfoundation.org/">Ίδρυμα OpenStreetMap</a> (OSMF).
+        Το OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> είναι βάση <i>ανοικτών δεδομένων</i> αδειοδοτημένα υπό την <a href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) από το <a
+        href="https://osmfoundation.org/">Ίδρυμα OpenStreetMap</a> (OSMF).
       intro_2_html: Είστε ελεύθεροι να αντιγράψετε, να διανείμετε, μεταδώσετε και
         προσαρμόσετε τα δεδομένα μας εφόσον κάνετε αναφορά στο OpenStreetMap και στους
         συνεισφέροντές του. Εάν τροποποιήσετε ή αξιοποιήσετε τα δεδομένα μας, μπορείτε
-        να διανείμετε το αποτέλεσμα μόνο σύμφωνα με την ίδια άδεια. Ο πλήρης <a href="http://opendatacommons.org/licenses/odbl/1.0/">νομικός
+        να διανείμετε το αποτέλεσμα μόνο σύμφωνα με την ίδια άδεια. Ο πλήρης <a href="https://opendatacommons.org/licenses/odbl/1.0/">νομικός
         κώδικας</a> εξηγεί τα δικαιώματα και τις υποχρεώσεις.
       intro_3_html: |-
-        Η χαρτογράφηση στα πλακίδια χάρτη, και η τεκμηρίωση μας, είναι αδειοδοτημένες υπο την άδεια <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
-        Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).
+        Η χαρτογράφηση στα πλακίδια χάρτη, και η τεκμηρίωση μας, είναι αδειοδοτημένες υπο την άδεια <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Attribution-ShareAlike 2.0</a> (CC BY-SA).
       credit_title_html: Πως να κάνετε αναφορά στο OpenStreetMap
       credit_1_html: |-
         Απαιτείται να χρησιμοποιείτε την αναφορά στο &ldquo;&copy; Συνεισφέροντες του
         OpenStreetMap&rdquo;.
       credit_2_html: |-
         Επίσης πρέπει να κάνετε σαφές ότι τα δεδομένα διατίθενται υπό την άδεια Open
-        Database License, και αν χρησιμοποιείτε τα πλακίδια χάρτη, ότι η χαρτογραφία είναι υπό την άδεια CC-BY-SA. Μπορείτε να το κάνετε αυτό με σύνδεσμο σε <a href="http://www.openstreetmap.org/copyright">αυτήν τη σελίδα δικαιωμάτων</a>.
+        Database License, και αν χρησιμοποιείτε τα πλακίδια χάρτη, ότι η χαρτογραφία είναι υπό την άδεια CC-BY-SA. Μπορείτε να το κάνετε αυτό με σύνδεσμο σε <a href="https://www.openstreetmap.org/copyright">αυτήν τη σελίδα δικαιωμάτων</a>.
         Εναλλακτικά, και σαν προαπαιτούμενο εάν διαμοιράζετε δεδομένα OSM, μπορείτε να δώσετε απευθείας σύνδεσμο προς τις άδειες. Σε μέσα στα οποία οι σύνδεσμοι δεν είναι εφικτοί (π.χ. εκτυπώσεις), προτείνουμε να κατευθύνετε τους αναγνώστες σας στο openstreetmap.org (ίσως επεκτείνοντας το «OpenStreetMap» σε αυτήν τη πλήρη διεύθυνση), προς opendatacommons.org, και αναλόγως στο creativecommons.org.
       credit_3_html: |-
         Για έναν ηλεκτρονικά εμφανιζόμενο χάρτη, η αναφορά θα πρέπει να εμφανίζεται στη γωνία του χάρτη.
@@ -1055,7 +1040,7 @@ el:
       more_title_html: Μαθαίνοντας περισσότερα
       more_1_html: |-
         Διαβάστε περισσότερα σχετικά με τη χρήση των δεδομένων μας, και πώς να μας μνημονεύσετε στην
-        <a href="http://osmfoundation.org/Licence">σελίδα Άδειας OSMF</a>.
+        <a href="https://osmfoundation.org/Licence">σελίδα Άδειας OSMF</a>.
       more_2_html: |-
         Παρόλο που το OpenStreetMap αποτελείται από ανοικτά δεδομένα, δεν μπορούμε να προσφέρουμε ένα
         δωρεάν API χαρτών για τρίτους προγραμματιστές.
@@ -1068,9 +1053,9 @@ el:
         και άλλες πηγές, μεταξύ αυτών:'
       contributors_at_html: |-
         <strong>Αυστρία</strong>: Περιέχει δεδομένα από τα
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (υπό  <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> και
-        Land Tirol (υπό <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT με τροποποιήσεις</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (υπό  <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> και
+        Land Tirol (υπό <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT με τροποποιήσεις</a>).
       contributors_ca_html: |-
         <strong>Καναδάς</strong>: Περιέχει δεδομένα από τα
         GeoBase®, GeoGratis (© Τμήμα Φυσικών
@@ -1079,12 +1064,12 @@ el:
         Στατιστική Υπηρεσία Καναδά).
       contributors_fi_html: "<strong>Φινλανδία</strong>: Περιέχει δεδομένα από το
         National Land Survey of Finland's Topographic Database\nκαι άλλα datasets,
-        υπό την \n<a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">NLSFI
+        υπό την \n<a href=\"https://www.maanmittauslaitos.fi/en/opendata-licence-version1\">NLSFI
         Άδεια</a>."
       contributors_fr_html: '<strong>Γαλλία</strong>: Περιέχει δεδομένα που προέρχονται
         από το Direction Générale des Impôts.'
       contributors_nl_html: '<strong>Ολλανδία</strong>: Περιέχει δεδομένα που προέρχονται
-        από το AND &copy; 2007 (<a href="http://www.and.com">www.and.com</a>)'
+        από το AND &copy; 2007 (<a href="https://www.and.com">www.and.com</a>)'
       contributors_nz_html: '<strong>Νέα Ζηλανδία</strong>: Περιέχει δεδομένα που
         πηγάζουν από την Υπηρεσία Πληροφοριών Γης Νέας Ζηλανδίας. Τα Πνευματικά Δικαιώματα
         Crown είναι κατωχυρωμένα.'
@@ -1102,7 +1087,7 @@ el:
         2010-12.
       contributors_footer_1_html: |-
         Για περισσότερες λεπτομέρειες σχετικά με αυτές, και άλλες πηγές που χρησιμοποιήθηκαν
-        για να βελτιώσουν το OpenStreetMap, παρακαλούμε δείτε τη σελίδα <a href="http://wiki.openstreetmap.org/wiki/Contributors">Συνεισφέροντες</a> στο OpenStreetMap Wiki.
+        για να βελτιώσουν το OpenStreetMap, παρακαλούμε δείτε τη σελίδα <a href="https://wiki.openstreetmap.org/wiki/Contributors">Συνεισφέροντες</a> στο OpenStreetMap Wiki.
       contributors_footer_2_html: Η συμπερίληψη δεδομένων στο OpenStreetMap δεν συνεπάγεται
         ότι ο αρχικός πάροχος δεδομένων εγκρίνει το OpenStreetMap, παρέχει οποιαδήποτε
         εγγύηση ή αποδέχεται καμία ευθύνη.
@@ -1112,14 +1097,14 @@ el:
         χωρίς την προηγούμενη άδεια από τους ιδιοκτήτες των δικαιωμάτων.
       infringement_2_html: Εάν πιστεύετε ότι προστέθηκε παράνομα υλικό που προστατεύεται
         από πνευματικά δικαιώματα στη βάση δεδομένων του OpenStreetMap ή σε αυτόν
-        τον ιστότοπο, παρακαλούμε απευθυνθείτε στη <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">
+        τον ιστότοπο, παρακαλούμε απευθυνθείτε στη <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">
         διαδικασία απομάκρυνσης </a> ή καταθέστε άμεσα μια αίτηση στην <a href="http://dmca.openstreetmap.org/">on-line
         σελίδα αιτήσεων</a>.
       trademarks_title_html: <span id="trademarks"></span>Εμπορικά σήματα
       trademarks_1_html: Το OpenStreetMap, το λογότυπο με το μεγεθυντικό φακό και
         το «State of the Map» είναι σήματα κατατεθέντα του Ιδρύματος OpenStreetMap.
         Αν έχετε ερωτήσεις σχετικά με τη χρήση των σημάτων, στείλτε τις ερωτήσεις
-        σας στην <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Ομάδα
+        σας στην <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Ομάδα
         Εργασίας Αδειών Χρήσης</a>.
   welcome_page:
     title: Καλώς ήρθατε!
@@ -1154,8 +1139,8 @@ el:
       paragraph_1_html: Το OpenStreetMap έχει λίγους επίσημους κανόνες, αλλά αναμένουμε
         από όλους τους συμμετέχοντες να συνεργαστούν και να επικοινωνούν με την κοινότητα.
         Αν σκέφτεστε άλλες δραστηριότητες εκτός από την επεξεργασία με το χέρι, παρακαλούμε
-        διαβάστε και ακολουθήστε τις οδηγίες στις <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Εισαγωγές</a>
-        και στις <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Αυτόματες
+        διαβάστε και ακολουθήστε τις οδηγίες στις <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Εισαγωγές</a>
+        και στις <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Αυτόματες
         Επεξεργασίες</a>.
     questions:
       title: Ερωτήσεις;
@@ -1192,7 +1177,7 @@ el:
       explanation_html: Αν ανησυχείτε για το πώς χρησιμοποιούνται τα δεδομένα μας
         ή σχετικά με τα περιεχόμενα, παρακαλούμε συμβουλευτείτε τη <a href='/copyright'>σελίδα
         πνευματικών δικαιωμάτων</a> μας για περισσότερες νομικές πληροφορίες ή επικοινωνήστε
-        με την κατάλληλη <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>ομάδα
+        με την κατάλληλη <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>ομάδα
         εργασίας του OSMF</a>.
   help_page:
     title: Βοήθεια
@@ -1205,7 +1190,7 @@ el:
       description: Ξεκινήστε με αυτές τις σύντομες οδηγίες που καλύπτουν τα βασικά
         του OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/El:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/El:Beginners%27_guide
       title: Οδηγός Αρχαρίων
       description: Οδηγός αρχαρίων διατηρούμενος από την κοινότητα.
     help:
@@ -1230,7 +1215,7 @@ el:
       description: Βοήθεια για εταιρείες και οργανισμούς για μετάβαση σε χάρτες που
         βασίζονται στο OpenStreetMap και άλλες υπηρεσίες.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Περιηγηθείτε το wiki για επιμελής τεκμηρίωση του OSM.
   about_page:
@@ -1252,8 +1237,8 @@ el:
       που τρέχουν τους εξυπηρετητές OSM, ανθρωπιστές που χαρτογραφούν κατεστραμμένες-πληγείσες περιοχές,
       και πολλούς περισσότερους.
       Για να μάθετε περισσότερα για την κοινότητα, ανατρέξτε στα <a href="%{diary_path}">ημερολόγια χρηστών</a>, τα
-      <a href="http://blogs.openstreetmap.org/">ιστολόγια της κοινότητας</a>και
-      την ιστοσελίδα του <a href="http://www.osmfoundation.org/">Ιδρύματος OSM</a>.
+      <a href="https://blogs.openstreetmap.org/">ιστολόγια της κοινότητας</a>και
+      την ιστοσελίδα του <a href="https://www.osmfoundation.org/">Ιδρύματος OSM</a>.
     open_data_title: Ανοικτά Δεδομένα
     open_data_html: 'Το OpenStreetMap είναι βάση <i>ανοικτών δεδομένων</i>: είστε
       ελεύθεροι να την χρησιμοποιήστε για οποιονδήποτε σκοπό, εφόσον μνημονεύετε το
@@ -1263,9 +1248,9 @@ el:
       Δικαιώματα και Άδεια Χρήσης</a> για λεπτομέρειες.'
     legal_title: Νομικό
     legal_html: |-
-      Αυτός ο ιστότοπος και πολλές άλλες σχετικές υπηρεσίες λειτουργούν επίσημα από το <a href='http://osmfoundation.org/'>Ίδρυμα OpenStreetMap</a> (OSMF) εκ μέρους της κοινότητας. Η χρήση όλων των υπηρεσιών του OSMF  υπόκειται στην <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Πολιτική Αποδεκτής Χρήσης</a> μας και στην <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Πολιτική Απορρήτου</a> μας.
+      Αυτός ο ιστότοπος και πολλές άλλες σχετικές υπηρεσίες λειτουργούν επίσημα από το <a href='https://osmfoundation.org/'>Ίδρυμα OpenStreetMap</a> (OSMF) εκ μέρους της κοινότητας. Η χρήση όλων των υπηρεσιών του OSMF  υπόκειται στην <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Πολιτική Αποδεκτής Χρήσης</a> μας και στην <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Πολιτική Απορρήτου</a> μας.
       <br>
-      Παρακαλούμε <a href='http://osmfoundation.org/Contact'>επικοινωνήστε με το OSMF</a> αν έχετε ερωτήματα για άδειες χρήσης, πνευματικά δικαιώματα ή άλλα νομικά θέματα.
+      Παρακαλούμε <a href='https://osmfoundation.org/Contact'>επικοινωνήστε με το OSMF</a> αν έχετε ερωτήματα για άδειες χρήσης, πνευματικά δικαιώματα ή άλλα νομικά θέματα.
     partners_title: Συνεργάτες
   notifier:
     diary_comment_notification:
@@ -1487,14 +1472,14 @@ el:
       user_page_link: σελίδα σας χρήστη
       anon_edits_link_text: Μάθετε γιατί συμβαίνει αυτό.
       flash_player_required: Χρειάζεστε Flash player για να χρησιμοποιήσετε το Potlatch,
-        το Flash πρόγραμμα επεξεργασίας του OpenStreetMap. Μπορείτε να <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">κάνετε
-        λήψη του Flash Player από την τοποθεσία Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Πολλές
+        το Flash πρόγραμμα επεξεργασίας του OpenStreetMap. Μπορείτε να <a href=https://get.adobe.com/flashplayer/">κάνετε
+        λήψη του Flash Player από την τοποθεσία Adobe.com</a>. <a href="https://wiki.openstreetmap.org/wiki/Editing">Πολλές
         άλλες επιλογές</a> είναι επίσης διαθέσιμες για επεξεργασία στο OpenStreetMap.
       potlatch_unsaved_changes: Έχετε μη αποθηκευμένες αλλαγές. (Για να αποθηκεύσετε
         στο Potlatch, πρέπει να αποεπιλέξτε οποιαδήποτε διαδρομή ή κόμβο, αν επεξεργάζεστε
         σε ζωντανή λειτουργία, ή απλά πατήστε «Αποθήκευση» εάν έχετε κουμπί αποθήκευσης.)
       potlatch2_not_configured: Το Potlatch 2 δεν έχει ρυθμιστεί - παρακαλούμε δείτε
-        http://wiki.openstreetmap.org/wiki/The_Rails_Port
+        https://wiki.openstreetmap.org/wiki/The_Rails_Port
       potlatch2_unsaved_changes: Έχετε μη αποθηκευμένες αλλαγές. (Για να αποθηκεύσετε
         στο Potlatch 2, πρέπει να κάνετε κλικ στο «Αποθήκευση».)
       id_not_configured: Ο iD δεν έχει ρυθμιστεί
@@ -1586,7 +1571,7 @@ el:
       edit: Επεξεργασία
       preview: Προεπισκόπηση
     markdown_help:
-      title_html: Αναλύεται με το <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Αναλύεται με το <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Επικεφαλίδες
       heading: Επικεφαλίδα
       subheading: Υποκεφαλίδα
@@ -1698,7 +1683,7 @@ el:
       description: Προβολή πρόσφατων μεταφορτώσεων ιχνών GPS
       tagged_with: χαρακτηρίστηκαν με %{tags}
       empty_html: Τίποτα ακόμα εδώ. <a href='%{upload_link}'>Ανεβάστε ένα νέο ίχνος</a>
-        ή μάθετε περισσότερα για την καταγραφή ιχνών με GPS στη <a href='http://wiki.openstreetmap.org/wiki/El:Beginners_Guide_1.2'>σελίδα
+        ή μάθετε περισσότερα για την καταγραφή ιχνών με GPS στη <a href='https://wiki.openstreetmap.org/wiki/El:Beginners_Guide_1.2'>σελίδα
         wiki</a>.
     delete:
       scheduled_for_deletion: Το ίχνος προγραμματίστηκε για διαγραφή
@@ -1916,12 +1901,12 @@ el:
           και είναι ανοικτός στον καθένα να τον διορθώσει, αναβαθμίσει, κατεβάσει και χρησιμοποιήσει.</p>
           <p>Εγγραφείτε για να αρχίσετε να συνεισφέρετε. Θα σας στείλουμε ένα email για να επιβεβαιώσουμε τον λογαριασμό σας.</p>
       license_agreement: Όταν επιβεβαιώσετε το λογαριασμό σας, θα πρέπει να συμφωνήσετε
-        με τους <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">όρους
+        με τους <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">όρους
         συνεισφοράς</a>.
       email address: 'Διεύθυνση Ηλ. Ταχυδρομείου:'
       confirm email address: 'Επιβεβαίωση Διεύθυνσης Ηλ. Ταχυδρομείου:'
       not displayed publicly: Η διεύθυνση σου δεν εμφανίζεται δημόσια (βλέπετε την
-        <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy
+        <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy
         policy including section on email addresses">πολιτική απορρήτου</a> για περισσότερες
         πληροφορίες)
       display name: 'Εμφανιζόμενο όνομα:'
@@ -2045,13 +2030,13 @@ el:
       email never displayed publicly: (όχι δημόσια εμφάνιση)
       external auth: 'Εξωτερικός Έλεγχος Ταυτότητας:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: τι είναι αυτό;
       public editing:
         heading: 'Δημόσια επεξεργασία:'
         enabled: Ενεργοποιήθηκε. Δεν είστε πια ανώνυμοι και μπορείτε να επεξεργαστείτε
           δεδομένα.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: τι είναι αυτό;
         disabled: Απενεργοποιήθηκε και δεν μπορείτε να επεξεργαστείτε δεδομένα, όλες
           οι προηγούμενες επεξεργασίες είναι ανώνυμες.
@@ -2063,7 +2048,7 @@ el:
           επεξεργαστεί και να επιτρέψετε στους άλλους έρθουν σε επαφή μαζί σας μέσω
           του ιστοχώρου, πατήστε το κουμπί από κάτω. <b>Μετά την αλλαγή σε API 0.6,
           μόνο οι επώνυμοι χρήστες μπορούν να επεξεργαστούν δεδομένα του χάρτη.</b>.
-          (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">μάθετε γιατί</a>).
+          (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">μάθετε γιατί</a>).
           <ul><li>Η διεύθυνσή σας ηλεκτρονικού ταχυδρομείου δεν θα αποκαλυφθεί δημόσια.
           </li><li> Αυτή η ενέργεια δεν μπορεί να αναιρεθεί και όλοι οι νέοι χρήστες
           είναι επώνυμοι εξ' αρχής.</li></ul>
@@ -2203,7 +2188,7 @@ el:
         χρήστη `%{name}'?
       confirm: Επιβεβαίωση
       fail: Δεν μπόρεσε να εξουσιοδοτήσει τον χρήστη % {όνομα}. Παρακαλώ ελέγξετε
-        ότι ο χρήστης και ο ρόλος είναι και οι δύο έγκυροι.
+        ότι ο χρήστης και ο ρόλος είναι και οι δύο έγκυροι
     revoke:
       title: Επιβεβαίωση ανάκλησης ρόλου
       heading: Επιβεβαίωση ανάκλησης ρόλου
@@ -2448,9 +2433,6 @@ el:
         mapquest_car: Αυτοκίνητο (MapQuest)
         mapquest_foot: Με τα πόδια (MapQuest)
         osrm_car: Αυτοκίνητο (OSRM)
-        mapzen_bicycle: Ποδήλατο (Mapzen)
-        mapzen_car: Αυτοκίνητο (Mapzen)
-        mapzen_foot: Με τα πόδια (Mapzen)
       descend: Κατάβαση
       directions: Οδηγίες
       distance: Απόσταση
index 07f8eaeec4fe7131d90060989806c14fcd1b1b0d..a2429a22274c20d52d64ee5764d4eeb22d77e185 100644 (file)
@@ -456,33 +456,26 @@ en-GB:
           crematorium: Crematorium
           dentist: Dentist
           doctors: Doctors
-          dormitory: Dormitory
           drinking_water: Drinking Water
           driving_school: Driving School
           embassy: Embassy
-          emergency_phone: Emergency Phone
           fast_food: Fast Food
           ferry_terminal: Ferry Terminal
-          fire_hydrant: Fire Hydrant
           fire_station: Fire Station
           food_court: Food Court
           fountain: Fountain
           fuel: Fuel
           gambling: Gambling
           grave_yard: Graveyard
-          gym: Fitness Centre/Gym
-          health_centre: Health Centre
           hospital: Hospital
           hunting_stand: Hunting Stand
           ice_cream: Ice Cream
           kindergarten: Nursery School
           library: Library
-          market: Market
           marketplace: Marketplace
           monastery: Monastery
           motorcycle_parking: Motorcycle Parking
           nightclub: Night Club
-          nursery: Nursery School
           nursing_home: Nursing Home
           office: Office
           parking: Parking
@@ -496,7 +489,6 @@ en-GB:
           prison: Prison
           pub: Pub
           public_building: Public Building
-          reception_area: Reception Area
           recycling: Recycling Point
           restaurant: Restaurant
           retirement_home: Retirement Home
@@ -592,7 +584,6 @@ en-GB:
           trunk: Trunk Road
           trunk_link: Trunk Road
           unclassified: Unclassified Road
-          unsurfaced: Unsurfaced Road
           "yes": Road
         historic:
           archaeological_site: Archaeological Site
@@ -657,7 +648,6 @@ en-GB:
         leisure:
           beach_resort: Beach Resort
           bird_hide: Bird Hide
-          club: Club
           common: Common Land
           dog_park: Dog Park
           fishing: Fishing Area
@@ -750,8 +740,6 @@ en-GB:
           "yes": Office
         place:
           allotments: Allotments
-          block: Block
-          airport: Airport
           city: City
           country: Country
           county: County
@@ -763,7 +751,6 @@ en-GB:
           islet: Islet
           isolated_dwelling: Isolated Dwelling
           locality: Locality
-          moor: Moor
           municipality: Municipality
           neighbourhood: Neighbourhood
           postcode: Postcode
@@ -780,10 +767,8 @@ en-GB:
           abandoned: Abandoned Railway
           construction: Railway under construction
           disused: Disused Railway
-          disused_station: Disused Railway Station
           funicular: Funicular Railway
           halt: Train Stop
-          historic_station: Historic Railway Station
           junction: Railway Junction
           level_crossing: Level Crossing
           light_rail: Light Rail
@@ -847,7 +832,6 @@ en-GB:
           hairdresser: Hairdresser
           hardware: Hardware Store
           hifi: Hi-Fi
-          insurance: Insurance
           jewelry: Jewellers
           kiosk: Kiosk Shop
           laundry: Laundry
@@ -863,10 +847,8 @@ en-GB:
           pet: Pet Shop
           pharmacy: Pharmacy
           photo: Photo Shop
-          salon: Salon
           second_hand: Second-hand Shop
           shoes: Shoe Shop
-          shopping_centre: Shopping Centre
           sports: Sports Shop
           stationery: Stationers
           supermarket: Supermarket
@@ -2389,9 +2371,6 @@ en-GB:
         mapquest_car: Car (MapQuest)
         mapquest_foot: Foot (MapQuest)
         osrm_car: Car (OSRM)
-        mapzen_bicycle: Bicycle (Mapzen)
-        mapzen_car: Car (Mapzen)
-        mapzen_foot: Foot (Mapzen)
       descend: Descend
       directions: Directions
       distance: Distance
index 70b67a24e844d0f541996d24518e80a594d11a5e..036f8de35d6aab5c1aa5d292496a8558aeba4028 100644 (file)
@@ -131,6 +131,7 @@ en:
         title_comment: "Changeset %{id} - %{comment}"
       join_discussion: "Log in to join the discussion"
       discussion: Discussion
+      still_open: "Changeset still open - discussion will open once the changeset is closed."
     node:
       title: "Node: %{name}"
       history_title: "Node History: %{name}"
@@ -332,7 +333,7 @@ en:
       map_image: "Map Image (shows standard layer)"
       embeddable_html: "Embeddable HTML"
       licence: "Licence"
-      export_details: 'OpenStreetMap data is licensed under the <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL).'
+      export_details: 'OpenStreetMap data is licensed under the <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL).'
       too_large:
         advice: "If the above export fails, please consider using one of the sources listed below:"
         body: "This area is too large to be exported as OpenStreetMap XML Data. Please zoom in or select a smaller area, or use one of the sources listed below for bulk data downloads."
@@ -366,12 +367,12 @@ en:
   geocoder:
     search:
       title:
-        latlon: 'Results from <a href="http://openstreetmap.org/">Internal</a>'
+        latlon: 'Results from <a href="https://openstreetmap.org/">Internal</a>'
         uk_postcode: 'Results from <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
-        ca_postcode: 'Results from <a href="http://geocoder.ca/">Geocoder.CA</a>'
-        osm_nominatim: 'Results from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
+        ca_postcode: 'Results from <a href="https://geocoder.ca/">Geocoder.CA</a>'
+        osm_nominatim: 'Results from <a href="https://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
         geonames: 'Results from <a href="http://www.geonames.org/">GeoNames</a>'
-        osm_nominatim_reverse: 'Results from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
+        osm_nominatim_reverse: 'Results from <a href="https://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
         geonames_reverse: 'Results from <a href="http://www.geonames.org/">GeoNames</a>'
     search_osm_nominatim:
       prefix_format: "%{name}"
@@ -381,12 +382,19 @@ en:
           chair_lift: "Chair Lift"
           drag_lift: "Drag Lift"
           gondola: "Gondola Lift"
+          platter: "Platter Lift"
+          pylon: "Pylon"
           station: "Aerialway Station"
+          t-bar: "T-Bar Lift"
         aeroway:
           aerodrome: "Aerodrome"
+          airstrip: "Airstrip"
           apron: "Apron"
           gate: "Gate"
+          hangar: "Hangar"
           helipad: "Helipad"
+          holding_position: "Holding Position"
+          parking_position: "Parking Position"
           runway: "Runway"
           taxiway: "Taxiway"
           terminal: "Terminal"
@@ -421,37 +429,32 @@ en:
           crematorium: "Crematorium"
           dentist: "Dentist"
           doctors: "Doctors"
-          dormitory: "Dormitory"
           drinking_water: "Drinking Water"
           driving_school: "Driving School"
           embassy: "Embassy"
-          emergency_phone: "Emergency Phone"
           fast_food: "Fast Food"
           ferry_terminal: "Ferry Terminal"
-          fire_hydrant: "Fire Hydrant"
           fire_station: "Fire Station"
           food_court: "Food Court"
           fountain: "Fountain"
           fuel: "Fuel"
           gambling: "Gambling"
           grave_yard: "Grave Yard"
-          gym: "Fitness Centre / Gym"
-          health_centre: "Health Centre"
+          grit_bin: "Grit Bin"
           hospital: "Hospital"
           hunting_stand: "Hunting Stand"
           ice_cream: "Ice Cream"
           kindergarten: "Kindergarten"
           library: "Library"
-          market: "Market"
           marketplace: "Marketplace"
           monastery: "Monastery"
           motorcycle_parking: "Motorcycle Parking"
           nightclub: "Night Club"
-          nursery: "Nursery"
           nursing_home: "Nursing Home"
           office: "Office"
           parking: "Parking"
           parking_entrance: "Parking Entrance"
+          parking_space: "Parking Space"
           pharmacy: "Pharmacy"
           place_of_worship: "Place of Worship"
           police: "Police"
@@ -461,7 +464,6 @@ en:
           prison: "Prison"
           pub: "Pub"
           public_building: "Public Building"
-          reception_area: "Reception Area"
           recycling: "Recycling Point"
           restaurant: "Restaurant"
           retirement_home: "Retirement Home"
@@ -486,6 +488,7 @@ en:
           village_hall: "Village Hall"
           waste_basket: "Waste Basket"
           waste_disposal: "Waste Disposal"
+          water_point: "Water Point"
           youth_centre: "Youth Centre"
         boundary:
           administrative: "Administrative Boundary"
@@ -494,6 +497,7 @@ en:
           protected_area : "Protected Area"
         bridge:
           aqueduct: "Aqueduct"
+          boardwalk: "Boardwalk"
           suspension: "Suspension Bridge"
           swing: "Swing Bridge"
           viaduct: "Viaduct"
@@ -513,25 +517,31 @@ en:
           "yes": "Craft Shop"
         emergency:
           ambulance_station: "Ambulance Station"
+          assembly_point: "Assembly Point"
           defibrillator: "Defibrillator"
           landing_site: "Emergency Landing Site"
           phone: "Emergency Phone"
+          water_tank: "Emergency Water Tank"
+          "yes": "Emergency"
         highway:
           abandoned: "Abandoned Highway"
           bridleway: "Bridleway"
           bus_guideway: "Guided Bus Lane"
           bus_stop: "Bus Stop"
           construction: "Highway under Construction"
+          corridor: "Corridor"
           cycleway: "Cycle Path"
           elevator: "Elevator"
           emergency_access_point: "Emergency Access Point"
           footway: "Footpath"
           ford: "Ford"
+          give_way: "Give Way Sign"
           living_street: "Living Street"
           milestone: "Milestone"
           motorway: "Motorway"
           motorway_junction: "Motorway Junction"
           motorway_link: "Motorway Road"
+          passing_place: "Passing Place"
           path: "Path"
           pedestrian: "Pedestrian Way"
           platform: "Platform"
@@ -548,6 +558,7 @@ en:
           services: "Motorway Services"
           speed_camera: "Speed Camera"
           steps: "Steps"
+          stop: "Stop Sign"
           street_lamp: "Street Lamp"
           tertiary: "Tertiary Road"
           tertiary_link: "Tertiary Road"
@@ -556,8 +567,8 @@ en:
           trail: "Trail"
           trunk: "Trunk Road"
           trunk_link: "Trunk Road"
+          turning_loop: "Turning Loop"
           unclassified: "Unclassified Road"
-          unsurfaced: "Unsurfaced Road"
           "yes" : "Road"
         historic:
           archaeological_site: "Archaeological Site"
@@ -576,6 +587,7 @@ en:
           manor: "Manor"
           memorial: "Memorial"
           mine: "Mine"
+          mine_shaft: "Mine Shaft"
           monument: "Monument"
           roman_road: "Roman Road"
           ruins: "Ruins"
@@ -585,6 +597,7 @@ en:
           wayside_cross: "Wayside Cross"
           wayside_shrine: "Wayside Shrine"
           wreck: "Wreck"
+          "yes": "Historic Site"
         junction:
           "yes": "Junction"
         landuse:
@@ -622,9 +635,9 @@ en:
         leisure:
           beach_resort: "Beach Resort"
           bird_hide: "Bird Hide"
-          club: "Club"
           common: "Common Land"
           dog_park: "Dog Park"
+          firepit: "Fire Pit"
           fishing: "Fishing Area"
           fitness_centre: "Fitness Centre"
           fitness_station: "Fitness Station"
@@ -649,15 +662,46 @@ en:
           water_park: "Water Park"
           "yes": "Leisure"
         man_made:
+          adit: "Adit"
+          beacon: "Beacon"
+          beehive: "Bee Hive"
+          breakwater: "Breakwater"
+          bridge: "Bridge"
+          bunker_silo: "Bunker"
+          chimney: "Chimney"
+          crane: "Crane"
+          dolphin: "Mooring Post"
+          dyke: "Dyke"
+          embankment: "Embankment"
+          flagpole: "Flagpole"
+          gasometer: "Gasometer"
+          groyne: "Groyne"
+          kiln: "Kiln"
           lighthouse: "Lighthouse"
+          mast: "Mast"
+          mine: "Mine"
+          mineshaft: "Mine Shaft"
+          monitoring_station: "Monitoring Station"
+          petroleum_well: "Petroleum Well"
+          pier: "Pier"
           pipeline: "Pipeline"
+          silo: "Silo"
+          storage_tank: "Storage Tank"
+          surveillance: "Surveillance"
           tower: "Tower"
+          wastewater_plant: "Wastewater Plant"
+          watermill: "Water Mill"
+          water_tower: "Water Tower"
+          water_well: "Well"
+          water_works: "Water Works"
+          windmill: "Wind Mill"
           works: "Factory"
           "yes": "Man-made"
         military:
           airfield: "Military Airfield"
           barracks: "Barracks"
           bunker: "Bunker"
+          "yes": "Military"
         mountain_pass:
           "yes" : "Mountain Pass"
         natural:
@@ -703,11 +747,14 @@ en:
           accountant: "Accountant"
           administrative: "Administration"
           architect: "Architect"
+          association: "Association"
           company: "Company"
+          educational_institution: "Educational Institution"
           employment_agency: "Employment Agency"
           estate_agent: "Estate Agent"
           government: "Governmental Office"
           insurance: "Insurance Office"
+          it: "IT Office"
           lawyer: "Lawyer"
           ngo: "NGO Office"
           telecommunication: "Telecommunication Office"
@@ -715,9 +762,8 @@ en:
           "yes": "Office"
         place:
           allotments: "Allotments"
-          block: "Block"
-          airport: "Airport"
           city: "City"
+          city_block: "City Block"
           country: "Country"
           county: "County"
           farm: "Farm"
@@ -728,12 +774,13 @@ en:
           islet: "Islet"
           isolated_dwelling: "Isolated Dwelling"
           locality: "Locality"
-          moor: "Moor"
           municipality: "Municipality"
           neighbourhood: "Neighbourhood"
           postcode: "Postcode"
+          quarter: "Quarter"
           region: "Region"
           sea: "Sea"
+          square: "Square"
           state: "State"
           subdivision: "Subdivision"
           suburb: "Suburb"
@@ -745,10 +792,8 @@ en:
           abandoned: "Abandoned Railway"
           construction: "Railway under Construction"
           disused: "Disused Railway"
-          disused_station: "Disused Railway Station"
           funicular: "Funicular Railway"
           halt: "Train Stop"
-          historic_station: "Historic Railway Station"
           junction: "Railway Junction"
           level_crossing: "Level Crossing"
           light_rail: "Light Rail"
@@ -774,6 +819,7 @@ en:
           beauty: "Beauty Shop"
           beverages: "Beverages Shop"
           bicycle: "Bicycle Shop"
+          bookmaker: "Bookmaker"
           books: "Book Shop"
           boutique: "Boutique"
           butcher: "Butcher"
@@ -812,12 +858,16 @@ en:
           hairdresser: "Hairdresser"
           hardware: "Hardware Store"
           hifi: "Hi-Fi"
-          insurance: "Insurance"
+          houseware: "Houseware Shop"
+          interior_decoration: "Interior Decoration"
           jewelry: "Jewelry Shop"
           kiosk: "Kiosk Shop"
+          kitchen: "Kitchen Shop"
           laundry: "Laundry"
+          lottery: "Lottery"
           mall: "Mall"
           market: "Market"
+          massage: "Massage"
           mobile_phone: "Mobile Phone Shop"
           motorcycle: "Motorcycle Shop"
           music: "Music Shop"
@@ -825,21 +875,27 @@ en:
           optician: "Optician"
           organic: "Organic Food Shop"
           outdoor: "Outdoor Shop"
+          paint: "Paint Shop"
+          pawnbroker: "Pawnbroker"
           pet: "Pet Shop"
           pharmacy: "Pharmacy"
           photo: "Photo Shop"
-          salon: "Salon"
+          seafood: "Sea Food"
           second_hand: "Second-hand Shop"
           shoes: "Shoe Shop"
-          shopping_centre: "Shopping Centre"
           sports: "Sports Shop"
           stationery: "Stationery Shop"
           supermarket: "Supermarket"
           tailor: "Tailor"
+          ticket: "Ticket Shop"
+          tobacco: "Tobacco Shop"
           toys: "Toy Shop"
           travel_agency: "Travel Agency"
+          tyres: "Tyre Shop"
+          vacant: "Vacant Shop"
+          variety_store: "Variety Store"
           video: "Video Shop"
-          wine: "Off License"
+          wine: "Wine Store"
           "yes": "Shop"
         tourism:
           alpine_hut: "Alpine Hut"
@@ -863,6 +919,7 @@ en:
           viewpoint: "Viewpoint"
           zoo: "Zoo"
         tunnel:
+          building_passage: "Building Passage"
           culvert: "Culvert"
           "yes": "Tunnel"
         waterway:
@@ -894,7 +951,7 @@ en:
         level10: "Suburb Boundary"
     description:
       title:
-        osm_nominatim: 'Location from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
+        osm_nominatim: 'Location from <a href="https://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
         geonames: 'Location from <a href="http://www.geonames.org/">GeoNames</a>'
       types:
         cities: Cities
@@ -967,19 +1024,19 @@ en:
       title_html: Copyright and License
       intro_1_html: |
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> is <i>open data</i>, licensed under the <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) by the  <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: |
         You are free to copy, distribute, transmit and adapt our data,
         as long as you credit OpenStreetMap and its
         contributors. If you alter or build upon our data, you
         may distribute the result only under the same licence. The
-        full <a href="http://opendatacommons.org/licenses/odbl/1.0/">legal
+        full <a href="https://opendatacommons.org/licenses/odbl/1.0/">legal
         code</a> explains your rights and responsibilities.
       intro_3_html: |
         The cartography in our map tiles, and our documentation, are
-        licensed under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        licensed under the <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons Attribution-ShareAlike 2.0</a> license (CC BY-SA).
       credit_title_html: How to credit OpenStreetMap
       credit_1_html: |
@@ -989,7 +1046,7 @@ en:
         You must also make it clear that the data is available under the Open
         Database License, and if using our map tiles, that the cartography is
         licensed as CC BY-SA. You may do this by linking to
-        <a href="http://www.openstreetmap.org/copyright">this copyright page</a>.
+        <a href="https://www.openstreetmap.org/copyright">this copyright page</a>.
         Alternatively, and as a requirement if you are distributing OSM in a
         data form, you can name and link directly to the license(s). In media
         where links are not possible (e.g. printed works), we suggest you
@@ -1005,7 +1062,7 @@ en:
       more_title_html: Finding out more
       more_1_html: |
         Read more about using our data, and how to credit us, at the <a
-        href="http://osmfoundation.org/Licence">OSMF Licence page</a>.
+        href="https://osmfoundation.org/Licence">OSMF Licence page</a>.
       more_2_html: |
         Although OpenStreetMap is open data, we cannot provide a
         free-of-charge map API for third-parties.
@@ -1019,10 +1076,10 @@ en:
         and other sources, among them:
       contributors_at_html: |
         <strong>Austria</strong>: Contains data from
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (under
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> and
-        Land Tirol (under <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT with amendments</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (under
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> and
+        Land Tirol (under <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT with amendments</a>).
       contributors_ca_html: |
         <strong>Canada</strong>: Contains data from
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1033,13 +1090,13 @@ en:
         <strong>Finland</strong>: Contains data from the
         National Land Survey of Finland's Topographic Database
         and other datasets, under the
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI License</a>.
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI License</a>.
       contributors_fr_html: |
         <strong>France</strong>: Contains data sourced from
         Direction Générale des Impôts.
       contributors_nl_html: |
         <strong>Netherlands</strong>: Contains &copy; AND data, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |
         <strong>New Zealand</strong>: Contains data sourced from
         Land Information New Zealand. Crown Copyright reserved.
@@ -1059,7 +1116,7 @@ en:
       contributors_footer_1_html: |
         For further details of these, and other sources that have been used
         to help improve OpenStreetMap, please see the <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">Contributors
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Contributors
         page</a> on the OpenStreetMap Wiki.
       contributors_footer_2_html: |
         Inclusion of data in OpenStreetMap does not imply that the original
@@ -1073,12 +1130,12 @@ en:
       infringement_2_html: |
         If you believe that copyrighted material has been inappropriately
         added to the OpenStreetMap database or this site, please refer
-        to our <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">takedown
+        to our <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">takedown
         procedure</a> or file directly at our
         <a href="http://dmca.openstreetmap.org/">on-line filing page</a>.
       trademarks_title_html: <span id="trademarks"></span>Trademarks
       trademarks_1_html: |
-        OpenStreetMap, the magnifying glass logo and State of the Map are registered trademarks of the OpenStreetMap Foundation. If you have questions about your use of the marks, please send your questions to the <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence Working Group</a>.
+        OpenStreetMap, the magnifying glass logo and State of the Map are registered trademarks of the OpenStreetMap Foundation. If you have questions about your use of the marks, please see our <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Trademark Policy</a>.
   welcome_page:
     title: Welcome!
     introduction_html: |
@@ -1114,8 +1171,8 @@ en:
         OpenStreetMap has few formal rules but we expect all participants to collaborate
         with, and communicate with, the community. If you are considering
         any activities other than editing by hand, please read and follow the guidelines on 
-        <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and 
-        <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automated Edits</a>.
+        <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and 
+        <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automated Edits</a>.
     questions:
       title: Any questions?
       paragraph_1_html: |
@@ -1151,7 +1208,7 @@ en:
       explanation_html: |
         If you have concerns about how our data is being used or about the contents please consult our
         <a href='/copyright'>copyright page</a> for more legal information, or contact the appropriate 
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.  
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.  
   help_page:
     title: Getting Help
     introduction: |
@@ -1162,7 +1219,7 @@ en:
       title: Welcome to OSM
       description: Start with this quick guide covering the OpenStreetMap basics.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: Beginners' Guide
       description: Community maintained guide for beginners.
     help:
@@ -1170,15 +1227,15 @@ en:
       title: help.openstreetmap.org
       description: Ask a question or look up answers on OSM's question-and-answer site.
     mailing_lists:
-      url: http://lists.openstreetmap.org/
+      url: https://lists.openstreetmap.org/
       title: Mailing Lists
       description: Ask a question or discuss interesting matters on a wide range of topical or regional mailing lists.
     forums:
-      url: http://forum.openstreetmap.org/
+      url: https://forum.openstreetmap.org/
       title: Forums
       description: Questions and discussions for those that prefer a bulletin board style interface.
     irc:
-      url: http://irc.openstreetmap.org/
+      url: https://irc.openstreetmap.org/
       title: IRC
       description: Interactive chat in many different languages and on many topics.
     switch2osm:
@@ -1186,7 +1243,7 @@ en:
       title: switch2osm
       description: Help for companies and organisations switching to OpenStreetMap based maps and other services.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Browse the wiki for in-depth OSM documentation.
   about_page:
@@ -1210,8 +1267,8 @@ en:
       To learn more about the community, see the
       <a href='https://blog.openstreetmap.org'>OpenStreetMap Blog</a>,
       <a href='%{diary_path}'>user diaries</a>,
-      <a href='http://blogs.openstreetmap.org/'>community blogs</a>, and
-      the <a href='http://www.osmfoundation.org/'>OSM Foundation</a> website.
+      <a href='https://blogs.openstreetmap.org/'>community blogs</a>, and
+      the <a href='https://www.osmfoundation.org/'>OSM Foundation</a> website.
     open_data_title: Open Data
     open_data_html: |
       OpenStreetMap is <i>open data</i>: you are free to use it for any purpose
@@ -1222,13 +1279,15 @@ en:
     legal_title: Legal
     legal_html: |
       This site and many other related services are formally operated by the  
-      <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) 
+      <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) 
       on behalf of the community. Use of all OSMF operated services is subject 
-      to our <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
-      Acceptable Use Policies</a> and our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a>
+      to our <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+      Acceptable Use Policies</a> and our <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a>
       <br> 
-      Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a> 
-      if you have licensing, copyright or other legal questions and issues.
+      Please <a href='https://osmfoundation.org/Contact'>contact the OSMF</a> 
+      if you have licensing, copyright or other legal questions.
+      <br>
+      OpenStreetMap, the magnifying glass logo and State of the Map are <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">registered trademarks of the OSMF</a>.
     partners_title: Partners
   notifier:
     diary_comment_notification:
@@ -1258,7 +1317,7 @@ en:
         failed_to_import: "failed to import. Here is the error:"
         more_info_1: "More information about GPX import failures and how to avoid"
         more_info_2: "them can be found at:"
-        import_failures_url: "http://wiki.openstreetmap.org/wiki/GPX_Import_Failures"
+        import_failures_url: "https://wiki.openstreetmap.org/wiki/GPX_Import_Failures"
       success:
         subject: "[OpenStreetMap] GPX Import success"
         loaded_successfully: loaded successfully with %{trace_points} out of a possible %{possible_points} points.
@@ -1396,19 +1455,19 @@ en:
       createnote: Add a note
       license:
         copyright: "Copyright OpenStreetMap and contributors, under an open license"
-        license_url: "http://openstreetmap.org/copyright"
-        project_url: "http://openstreetmap.org"
+        license_url: "https://openstreetmap.org/copyright"
+        project_url: "https://openstreetmap.org"
       remote_failed: "Editing failed - make sure JOSM or Merkaartor is loaded and the remote control option is enabled"
     edit:
       not_public: "You have not set your edits to be public."
       not_public_description: "You can no longer edit the map unless you do so. You can set your edits as public from your %{user_page}."
       user_page_link: user page
       anon_edits: "(%{link})"
-      anon_edits_link: "http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits"
+      anon_edits_link: "https://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits"
       anon_edits_link_text: "Find out why this is the case."
-      flash_player_required: 'You need a Flash player to use Potlatch, the OpenStreetMap Flash editor. You can <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">download Flash Player from Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Several other options</a> are also available for editing OpenStreetMap.'
+      flash_player_required: 'You need a Flash player to use Potlatch, the OpenStreetMap Flash editor. You can <a href="https://get.adobe.com/flashplayer/">download Flash Player from Adobe.com</a>. <a href="https://wiki.openstreetmap.org/wiki/Editing">Several other options</a> are also available for editing OpenStreetMap.'
       potlatch_unsaved_changes: "You have unsaved changes. (To save in Potlatch, you should deselect the current way or point, if editing in live mode, or click save if you have a save button.)"
-      potlatch2_not_configured: "Potlatch 2 has not been configured - please see http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 for more information"
+      potlatch2_not_configured: "Potlatch 2 has not been configured - please see https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 for more information"
       potlatch2_unsaved_changes: "You have unsaved changes. (To save in Potlatch 2, you should click save.)"
       id_not_configured: "iD has not been configured"
       no_iframe_support: "Your browser doesn't support HTML iframes, which are necessary for this feature."
@@ -1499,7 +1558,7 @@ en:
       edit: Edit
       preview: Preview
     markdown_help:
-      title_html: Parsed with <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Parsed with <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Headings
       heading: Heading
       subheading: Subheading
@@ -1538,7 +1597,7 @@ en:
       save_button: "Save Changes"
       visibility: "Visibility:"
       visibility_help: "what does this mean?"
-      visibility_help_url: "http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
+      visibility_help_url: "https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
     trace_form:
       upload_gpx: "Upload GPX File:"
       description: "Description:"
@@ -1546,10 +1605,10 @@ en:
       tags_help: "comma delimited"
       visibility: "Visibility:"
       visibility_help: "what does this mean?"
-      visibility_help_url: "http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
+      visibility_help_url: "https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"
       upload_button: "Upload"
       help: "Help"
-      help_url: "http://wiki.openstreetmap.org/wiki/Upload"
+      help_url: "https://wiki.openstreetmap.org/wiki/Upload"
     trace_header:
       upload_trace: "Upload a trace"
       see_all_traces: "See all traces"
@@ -1604,7 +1663,7 @@ en:
       public_traces_from: "Public GPS traces from %{user}"
       description: "Browse recent GPS track uploads"
       tagged_with: " tagged with %{tags}"
-      empty_html: "Nothing here yet. <a href='%{upload_link}'>Upload a new trace</a> or learn more about GPS tracing on the <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki page</a>."
+      empty_html: "Nothing here yet. <a href='%{upload_link}'>Upload a new trace</a> or learn more about GPS tracing on the <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki page</a>."
     delete:
       scheduled_for_deletion: "Trace scheduled for deletion"
     make_public:
@@ -1793,10 +1852,10 @@ en:
           <p>Unlike other maps, OpenStreetMap is completely created by people like you,
           and it's free for anyone to fix, update, download and use.</p>
           <p>Sign up to get started contributing. We'll send an email to confirm your account.</p>
-      license_agreement: 'When you confirm your account you will need to agree to the <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">contributor terms</a>.'
+      license_agreement: 'When you confirm your account you will need to agree to the <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">contributor terms</a>.'
       email address: "Email Address:"
       confirm email address: "Confirm Email Address:"
-      not displayed publicly: 'Your address is not displayed publicly, see our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy policy including section on email addresses">privacy policy</a> for more information'
+      not displayed publicly: 'Your address is not displayed publicly, see our <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy policy including section on email addresses">privacy policy</a> for more information'
       display name: "Display Name:"
       display name description: "Your publicly displayed username. You can change this later in the preferences."
       external auth: "Third Party Authentication:"
@@ -1807,17 +1866,17 @@ en:
       continue: Sign Up
       terms accepted: "Thanks for accepting the new contributor terms!"
       terms declined: "We are sorry that you have decided to not accept the new Contributor Terms. For more information, please see <a href=\"%{url}\">this wiki page</a>."
-      terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: "Contributor terms"
       heading: "Contributor terms"
       read and accept: "Please read the agreement and press the agree button to confirm that you accept the terms of this agreement for your existing and future contributions."
       consider_pd: "In addition to the above agreement, I consider my contributions to be in the Public Domain"
       consider_pd_why: "what's this?"
-      consider_pd_why_url: http://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
+      consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
       guidance: 'Information to help understand these terms: a <a href="%{summary}">human readable summary</a> and some <a href="%{translations}">informal translations</a>'
       agree: Agree
-      declined: "http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined"
+      declined: "https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined"
       decline: "Decline"
       you need to accept or decline: "Please read and then either accept or decline the new Contributor Terms to continue."
       legale_select: "Country of residence:"
@@ -1907,25 +1966,25 @@ en:
       email never displayed publicly: "(never displayed publicly)"
       external auth: "External Authentication:"
       openid:
-        link: "http://wiki.openstreetmap.org/wiki/OpenID"
+        link: "https://wiki.openstreetmap.org/wiki/OpenID"
         link text: "what is this?"
       public editing:
         heading: "Public editing:"
         enabled: "Enabled. Not anonymous and can edit data."
-        enabled link: "http://wiki.openstreetmap.org/wiki/Anonymous_edits"
+        enabled link: "https://wiki.openstreetmap.org/wiki/Anonymous_edits"
         enabled link text: "what is this?"
         disabled: "Disabled and cannot edit data, all previous edits are anonymous."
         disabled link text: "why can't I edit?"
       public editing note:
         heading: "Public editing"
-        text: "Currently your edits are anonymous and people cannot send you messages or see your location. To show what you edited and allow people to contact you through the website, click the button below. <b>Since the 0.6 API changeover, only public users can edit map data</b>. (<a href=\"http://wiki.openstreetmap.org/wiki/Anonymous_edits\">find out why</a>).<ul><li>Your email address will not be revealed by becoming public.</li><li>This action cannot be reversed and all new users are now public by default.</li></ul>"
+        text: "Currently your edits are anonymous and people cannot send you messages or see your location. To show what you edited and allow people to contact you through the website, click the button below. <b>Since the 0.6 API changeover, only public users can edit map data</b>. (<a href=\"https://wiki.openstreetmap.org/wiki/Anonymous_edits\">find out why</a>).<ul><li>Your email address will not be revealed by becoming public.</li><li>This action cannot be reversed and all new users are now public by default.</li></ul>"
       contributor terms:
         heading: "Contributor Terms:"
         agreed: "You have agreed to the new Contributor Terms."
         not yet agreed: "You have not yet agreed to the new Contributor Terms."
         review link text: "Please follow this link at your convenience to review and accept the new Contributor Terms."
         agreed_with_pd: "You have also declared that you consider your edits to be in the Public Domain."
-        link: "http://www.osmfoundation.org/wiki/License/Contributor_Terms"
+        link: "https://www.osmfoundation.org/wiki/License/Contributor_Terms"
         link text: "what is this?"
       profile description: "Profile Description:"
       preferred languages: "Preferred Languages:"
@@ -1933,7 +1992,7 @@ en:
       image: "Image:"
       gravatar:
         gravatar: "Use Gravatar"
-        link: "http://wiki.openstreetmap.org/wiki/Gravatar"
+        link: "https://wiki.openstreetmap.org/wiki/Gravatar"
         link text: "what is this?"
         disabled: "Gravatar has been disabled."
         enabled: "Display of your Gravatar has been enabled."
@@ -2036,6 +2095,7 @@ en:
       not_a_role: "The string `%{role}' is not a valid role."
       already_has_role: "The user already has role %{role}."
       doesnt_have_role: "The user does not have role %{role}."
+      not_revoke_admin_current_user: "Cannot revoke administrator role from current user."
     grant:
       title: Confirm role granting
       heading: Confirm role granting
@@ -2240,7 +2300,8 @@ en:
         unhide_comment: "unhide"
     notes:
       new:
-        intro: "Spotted a mistake or something missing? Let other mappers know so we can fix it. Move the marker to the correct position and type a note to explain the problem. (Please don't enter personal information or information from copyrighted maps or directory listings.)"
+        intro: "Spotted a mistake or something missing? Let other mappers know so we can fix it. Move the marker to the correct position and type a note to explain the problem."
+        advice: "Your note is public and may be used to update the map, so don't enter personal information, or information from copyrighted maps or directory listings."
         add: Add Note
       show:
         anonymous_warning: This note includes comments from anonymous users which should be independently verified.
@@ -2260,9 +2321,6 @@ en:
         mapquest_car: "Car (MapQuest)"
         mapquest_foot: "Foot (MapQuest)"
         osrm_car: "Car (OSRM)"
-        mapzen_bicycle: "Bicycle (Mapzen)"
-        mapzen_car: "Car (Mapzen)"
-        mapzen_foot: "Foot (Mapzen)"
       descend: "Descend"
       directions: "Directions"
       distance: "Distance"
index 202b064a711aaceb8d57dfa675b81002e1bcb117..20d5336aa034cbf1f2f2a610001eba3352db980c 100644 (file)
@@ -143,6 +143,8 @@ eo:
         title_comment: Ŝanĝaro %{id} - %{comment}
       join_discussion: Ensalutu por diskuti
       discussion: Diskuto
+      still_open: Ŝanĝaro plue malfermita - diskuto estos malfermita ekde ĝi estos
+        malfermita.
     node:
       title: 'Nodo: %{name}'
       history_title: 'Historio de nodo: %{name}'
@@ -351,7 +353,7 @@ eo:
       embeddable_html: Enkorpigebla HTML
       licence: Permesilo
       export_details: OpenStreetMap-datumoj estas disponeblaj laŭ la permesilo <a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
+        href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
         Database License</a> (ODbL).
       too_large:
         advice: 'Se la elportado malsukcesis, bonvolu uzi unu el jenaj fontoj:'
@@ -389,14 +391,14 @@ eo:
   geocoder:
     search:
       title:
-        latlon: Rezultoj el <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Rezultoj el <a href="https://openstreetmap.org/">nia retejo</a>
         uk_postcode: Rezultoj el <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Rezultoj el <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Rezultoj el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Rezultoj el <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Rezultoj el <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Rezultoj el <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Rezultoj el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Rezultoj el <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Rezultoj el <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -406,12 +408,19 @@ eo:
           chair_lift: Telfero seĝa
           drag_lift: Skitelfero
           gondola: Telfero plur-vagoneta
+          platter: Skitelfero unupersona
+          pylon: Fosto
           station: Kablovoja stacio
+          t-bar: Skitelfero dupersona
         aeroway:
           aerodrome: Aerodromo
+          airstrip: Provizora aerodromo
           apron: Aviadil-parkumejo
           gate: Pordego
+          hangar: Hangaro
           helipad: Surteriĝejo helikoptera
+          holding_position: Haltejo antaŭ aŭtokur-strato
+          parking_position: Aviadil-parkumejo (pozicio)
           runway: Avia dromo
           taxiway: Aŭtokur-strato
           terminal: Flugstacio
@@ -446,37 +455,32 @@ eo:
           crematorium: Kadavro-bruligejo
           dentist: Dentistejo
           doctors: Kabineto de kuracisto
-          dormitory: Studenthejmo
           drinking_water: Trinkakvejo
           driving_school: Stirlernejo
           embassy: Ambasadejo
-          emergency_phone: Alarma telefono
           fast_food: Rapidmanĝejo
           ferry_terminal: Pramstacio
-          fire_hydrant: Hidranto
           fire_station: Fajrobribadejo
           food_court: Manĝobazaro
           fountain: Fontano
           fuel: Benzinejo
           gambling: Hazardludejo
           grave_yard: Tombejo ĉirkaŭpreĝeja
-          gym: Ripoz-gimnastika centro
-          health_centre: Medicina centro
+          grit_bin: Ujo kun sablo kaj salo
           hospital: Malsanulejo
           hunting_stand: Altembusko ĉasada
           ice_cream: Glaciaĵejo
           kindergarten: Infanĝardeno
           library: Biblioteko
-          market: Bazaro
           marketplace: Bazaro
           monastery: Monaĥejo
           motorcycle_parking: Parkumejo motorcikla
           nightclub: Noktoklubejo
-          nursery: Infanejo
           nursing_home: Domo de permanenta zorgado
           office: Oficejo
           parking: Parkumejo
           parking_entrance: Enveturejo al parkumejo
+          parking_space: Parkumeja pozicio
           pharmacy: Apoteko
           place_of_worship: Preĝejo
           police: Policejo
@@ -486,7 +490,6 @@ eo:
           prison: Malliberejo
           pub: Taverno
           public_building: Konstruaĵo publika
-          reception_area: Atendejo
           recycling: Recikligejo
           restaurant: Restoracio
           retirement_home: Maljunulejo
@@ -511,6 +514,7 @@ eo:
           village_hall: Komunuma centro (vilaĝo)
           waste_basket: Rubujo
           waste_disposal: Rubujego
+          water_point: Trinkejo
           youth_centre: Junulara centro
         boundary:
           administrative: Administra limo
@@ -519,6 +523,7 @@ eo:
           protected_area: Naturprotektejo
         bridge:
           aqueduct: Akvedukto
+          boardwalk: Ligna trotuaro
           suspension: Pendoponto
           swing: Ponto turnebla
           viaduct: Viadukto
@@ -538,25 +543,31 @@ eo:
           "yes": Metiejo
         emergency:
           ambulance_station: Ambulanca stacio
+          assembly_point: Vivsava renkontiĝejo
           defibrillator: Defibrililo
           landing_site: Surteriĝejo en urĝo
           phone: Alarma telefono
+          water_tank: Kontraŭbrulega akvujo
+          "yes": Je danĝero
         highway:
           abandoned: Forlasita vojo
           bridleway: Ĉevalvojo
           bus_guideway: Aŭtobus-trako
           bus_stop: Haltejo aŭtobusa
           construction: Vojo konstruata
+          corridor: Koridoro
           cycleway: Bicikovojo
           elevator: Lifto
           emergency_access_point: Vivsava rekonebla signo
           footway: Piedvojeto
           ford: Travadejo
+          give_way: Trafiksigno ‘cedi traveturon’
           living_street: Ĉedoma strato
           milestone: Mejloŝtono
           motorway: Aŭtovojo
           motorway_junction: Elveturejo el aŭtovojo
           motorway_link: Ligilo al aŭtovojo
+          passing_place: Preterpasejo
           path: Vojeto
           pedestrian: Piedirada strato
           platform: Haltejo
@@ -573,6 +584,7 @@ eo:
           services: Servejo de vojaĝantoj
           speed_camera: Rapid-kontrolilo
           steps: Ŝtuparo
+          stop: Trafiksigno STOP
           street_lamp: Stratlampo
           tertiary: Vojo tria-ranga
           tertiary_link: Ligilo al vojo tria-ranga
@@ -581,8 +593,8 @@ eo:
           trail: Kurso
           trunk: Vojo ekspresa
           trunk_link: Ligilo al vojo ekspresa
+          turning_loop: Ejo por ĝirado U-forma
           unclassified: Vojo kvara-ranga
-          unsurfaced: Ligilo al vojo kvara-ranga
           "yes": Vojo
         historic:
           archaeological_site: Arĥeologia ejo
@@ -601,6 +613,7 @@ eo:
           manor: Palaceto historia
           memorial: Memorigaĵo
           mine: Minejo
+          mine_shaft: Ŝakto
           monument: Monumento
           roman_road: Romia ŝoseo
           ruins: Ruinoj historiaj
@@ -610,6 +623,7 @@ eo:
           wayside_cross: Krucifikso apudvoja
           wayside_shrine: Adorejo apudvoja
           wreck: Ruinoj de ŝipo
+          "yes": Historia ejo
         junction:
           "yes": Vojkruciĝo
         landuse:
@@ -647,9 +661,9 @@ eo:
         leisure:
           beach_resort: Apudmara ripoz-centro
           bird_hide: Bird-observejo
-          club: Klubejo
           common: Publika ripoza tereno
           dog_park: Hund-parko
+          firepit: Lignofajrejo
           fishing: Fiŝkaptadejo
           fitness_centre: Ripoz-gimnastika centro
           fitness_station: Ekzerco-parko
@@ -674,15 +688,46 @@ eo:
           water_park: Akvoparko
           "yes": Ripozejo
         man_made:
+          adit: Minejo horizontala
+          beacon: Buo fiksa
+          beehive: Abulejo
+          breakwater: Ond-rompilo
+          bridge: Ponto
+          bunker_silo: Bunkro armea
+          chimney: Fumtubo
+          crane: Gruo
+          dolphin: Dukdalbo
+          dyke: Digo
+          embankment: Surŝutaĵo
+          flagpole: Flago
+          gasometer: Gasujo
+          groyne: Ond-rompileto
+          kiln: Forno industria
           lighthouse: Lumturo
+          mast: Masto
+          mine: Minejo
+          mineshaft: Ŝakto
+          monitoring_station: Observada stacio
+          petroleum_well: Naftoŝakto
+          pier: Marponto
           pipeline: Tubolinio
+          silo: Tur-stokejo
+          storage_tank: Rezervujo
+          surveillance: Supergardo
           tower: Turo
+          wastewater_plant: Akvopurigejo
+          watermill: Muelejo akva
+          water_tower: Akvoturo
+          water_well: Puto
+          water_works: Akvotrinkebligejo
+          windmill: Muelejo venta
           works: Fabriko
           "yes": Artefarita objekto
         military:
           airfield: Aerbazo armea
           barracks: Soldatejo
           bunker: Bunkro armea
+          "yes": Armeo
         mountain_pass:
           "yes": Montpasejo
         natural:
@@ -728,11 +773,14 @@ eo:
           accountant: Oficejo de kontisto
           administrative: Administra oficejo
           architect: Oficejo de arĥitekturisto
+          association: Oficejo de asocio
           company: Oficejo de firmao
+          educational_institution: Oficejo de edukada institucio
           employment_agency: Dungoficejo
           estate_agent: Oficejo de nemoveblaĵisto
           government: Registara oficejo
           insurance: Asekurkompaniejo
+          it: Oficejo de informteĥnika firmao
           lawyer: Oficejo de leĝisto
           ngo: Oficejo de ne-registara organizaĵo
           telecommunication: Telekomunikada oficejo
@@ -740,9 +788,8 @@ eo:
           "yes": Oficejo
         place:
           allotments: Familiaj ĝardenoj
-          block: Bloko
-          airport: Flughaveno
           city: Urbego
+          city_block: Dombloko
           country: Lando
           county: Distrikto
           farm: Farmobieno
@@ -753,12 +800,13 @@ eo:
           islet: Insuleto
           isolated_dwelling: Solstaranta domo
           locality: Ejo
-          moor: Arbustetaro
           municipality: Municipo
           neighbourhood: Najbaraĵo
           postcode: Poŝtkodo
+          quarter: Kvartalo
           region: Regiono
           sea: Maro
+          square: Placo
           state: Provinco
           subdivision: Kvartalo
           suburb: Suburbo
@@ -770,10 +818,8 @@ eo:
           abandoned: Eksa fervojlinio
           construction: Fervojlinio konstruata
           disused: Forlasita fervojlinio
-          disused_station: Forlasita stacio fervoja
           funicular: Funikularo
           halt: Haltejo fervoja
-          historic_station: Fervoja stacidomo historia
           junction: Fervojnodo
           level_crossing: Traknivela pasejo (vojo)
           light_rail: Fervojo malpeza
@@ -799,6 +845,7 @@ eo:
           beauty: Beligejo
           beverages: Trinkaĵ-vendejo
           bicycle: Bicikl-vendejo
+          bookmaker: Vetperisto
           books: Libro-vendejo
           boutique: Mod-butiko
           butcher: Viand-vendejo
@@ -837,12 +884,16 @@ eo:
           hairdresser: Frizejo
           hardware: Laboril-vendejo
           hifi: Altfidel-son-vendejo
-          insurance: Asekurkompaniejo
+          houseware: Mastrum-aparata vendejo
+          interior_decoration: Ensembl-vendejo
           jewelry: Juvel-vendejo
           kiosk: Gazetbudo
+          kitchen: Kuirej-mebla vendejo
           laundry: Vestaĵ-lavejo (akvo)
+          lottery: Loteri-vendejo
           mall: Vendejaro
           market: Bazaro
+          massage: Kabineto de masaĝo
           mobile_phone: Poŝtelefon-vendejo
           motorcycle: Motorcikl-vendejo
           music: Muzik-vendejo
@@ -850,21 +901,27 @@ eo:
           optician: Optikbutiko
           organic: Ekologi-manĝaĵa vendejo
           outdoor: Vojaĝil-vendejo
+          paint: Farb-vendejo
+          pawnbroker: Lombardejo
           pet: Dombest-vendejo
           pharmacy: Apoteko
           photo: Fotovendejo
-          salon: Beligejo
+          seafood: Marfrukt-vendejo
           second_hand: Brokantejo
           shoes: Ŝuo-vendejo
-          shopping_centre: Vendejaro
           sports: Sportovendejo
           stationery: Papervaro-vendejo
           supermarket: Superbazaro
           tailor: Tajlorejo
+          ticket: Bilet-vendejo
+          tobacco: Tabak-vendejo
           toys: Ludil-vendejo
           travel_agency: Vojaĝ-oficejo
+          tyres: Pneŭ-vendejo
+          vacant: Forlasita vendejo
+          variety_store: Diversaĵ-vendejo
           video: Filmovendejo
-          wine: Alkohol-vendejo
+          wine: Vin-vendejo
           "yes": Vendejo
         tourism:
           alpine_hut: Montara kabano
@@ -888,6 +945,7 @@ eo:
           viewpoint: Belvidejo
           zoo: Bestoĝardeno
         tunnel:
+          building_passage: Trakonstruaĵa tunelo
           culvert: Subvoja konduktilo
           "yes": Tunelo
         waterway:
@@ -919,7 +977,7 @@ eo:
         level10: Limo de subkvartalo (niv.10)
     description:
       title:
-        osm_nominatim: Loko el <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Loko el <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Loko el <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -954,7 +1012,7 @@ eo:
     intro_text: OpenStreetMap estas mapo de la mondo, kreata de homoj kiel vi, kaj
       libere uzebla laŭ malferma permesilo.
     intro_2_create_account: Krei konton
-    partners_html: Retgastigo estas liverata de %{ucl}, %{ic}, %{bytemark} kaj aliaj
+    partners_html: Retgastigo estas liverata de %{ucl}, %{bytemark}, %{ic} kaj aliaj
       %{partners}.
     partners_ucl: University College London
     partners_ic: Imperial College London
@@ -993,14 +1051,14 @@ eo:
     legal_babble:
       title_html: Kopirajto kaj permesilo
       intro_1_html: |-
-        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> estas projekto de <i>malfermaj datumoj</i> eldonita sub la permesilo <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> estas projekto de <i>malfermaj datumoj</i> eldonita laŭ la permesilo <a
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) de la  <a
-        href="http://osmfoundation.org/">OpenStreetMap Fondaĵo</a> (OSMF).
+        href="http://osmfoundation.org/">Fondaĵo OpenStreetMap</a> (OSMF).
       intro_2_html: Vi rajtas kopii, disdoni, transdoni kaj modifi niajn datumojn,
         nur se vi atribuos aŭtorecon al OpenStreetMap kaj ĝiaj kontribuintoj. Se vi
         modifos aŭ uzos niajn datumojn, vi povos distribui la verkon laŭ la sama permesilo.
-        La plena <a href="http://opendatacommons.org/licenses/odbl/1.0/">interkonsento
+        La plena <a href="https://opendatacommons.org/licenses/odbl/1.0/">interkonsento
         de uzado</a> klarigas viajn rajtojn kaj devojn.
       intro_3_html: La kartografio de niaj map-kaheloj kaj nia dokumentaro estas disponeblaj
         laŭ la permesilo <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.eo">Krea
@@ -1009,8 +1067,8 @@ eo:
       credit_1_html: 'Ni postulas, ke vi markos: &ldquo;&copy; Kontribuintoj de OpenStreetMap&rdquo;.'
       credit_2_html: Vi ankaŭ devas klarigi, ke datumoj estas disponeblaj laŭ la permesilo
         Open Database License, kaj kartografio de map-kaheloj laŭ la permesilo CC
-        BY-SA. Vi povas indiki tion per fari ligilon al <a href="http://www.openstreetmap.org/copyright">ĉi
-        tiu paĝo pri permesilo</a>. Alimaniere, se vi distribuas OSM en datuma formo,
+        BY-SA. Vi povas indiki tion per fari ligilon al <a href="https://www.openstreetmap.org/copyright">tiu
+        ĉi paĝo pri permesilo</a>. Alimaniere, se vi distribuas OSM en datuma formo,
         vi povas mencii nomo(j)n kaj ligilo(j)n al la permesilo(j). Se ne estas eble
         meti ligilojn (ekz. en paperaj mapoj), ni sugestas direkti viajn legantojn
         al openstreetmap.org (eble meti plenan retadreson), al opendatacommons.org
@@ -1023,9 +1081,8 @@ eo:
         title: Ekzemplo de aŭtorec-atribuado
       more_title_html: Sciiĝi pli
       more_1_html: |-
-        Legu pli pri uzado de niaj datumoj kaj kiel atribui aŭtorecon je la <a
-        href="http://osmfoundation.org/Licence">retpaĝo de OSMF permesilo</a> kaj je la <a
-        href="https://wiki.openstreetmap.org/wiki/Eo:Legal_FAQ">paĝo de oftaj demandoj pri leĝo</a>.
+        Sciigu pli pri uzado de niaj datumoj kaj kiel atribui aŭtorecon ĉe la <a
+        href="https://osmfoundation.org/Licence">retpaĝo pri permesilo OSMF</a>.
       more_2_html: Kvankam la datumoj de OpenStreetMap estas liberaj, ni ne povas
         liveri senpagan API-on por eksteraj programistoj. Legu nian <a href="https://operations.osmfoundation.org/policies/api/">politikon
         pri uzado de API</a>, <a href="https://operations.osmfoundation.org/policies/tiles/">politikon
@@ -1036,9 +1093,9 @@ eo:
         inkludas datumoj laŭ malferma permesilo el landaj kartografiaj organizaĵoj
         kaj el aliaj fontoj, inter ili:'
       contributors_at_html: |-
-        <strong>Aŭstrujo</strong>: enhavas datumojn el <a href="http://data.wien.gv.at/">Stadt Wien</a> (laŭ <a href="http://creativecommons.org/licenses/by/3.0/at/deed.eo">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> kaj
-        Land Tirol (sub <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT kun postaj ŝanĝoj</a>).
+        <strong>Aŭstrujo</strong>: enhavas datumojn el <a href="https://data.wien.gv.at/">Stadt Wien</a> (laŭ <a href="https://creativecommons.org/licenses/by/3.0/at/deed.eo">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> kaj
+        Land Tirol (laŭ <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT kun postaj ŝanĝoj</a>).
       contributors_ca_html: |-
         <strong>Kanado</strong>: enhavas datumojn el
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1047,12 +1104,12 @@ eo:
         Statistics Canada).
       contributors_fi_html: |-
         <strong>Suomujo</strong>: enhavas datumojn el
-        National Land Survey of Finland's Topographic Database kaj aliaj fontoj, laŭ la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI permesilo</a>.
+        National Land Survey of Finland's Topographic Database kaj aliaj fontoj, laŭ la <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">permesilo NLSFI</a>.
       contributors_fr_html: '<strong>Francujo</strong>: enhavas datumojn ricevitajn
         el ''Direction Générale des Impôts''.'
       contributors_nl_html: |-
         <strong>Nederlando</strong>: enhavas datumojn el &copy; AND, 2007
-        (<a href="http://www.and.com">www.and.com</a>).
+        (<a href="https://www.and.com">www.and.com</a>).
       contributors_nz_html: '<strong>Nov-Zelando</strong>: enhavas datumojn ricevitajn
         el ''Land Information New Zealand''. Crown Copyright reserved.'
       contributors_si_html: |-
@@ -1067,8 +1124,8 @@ eo:
         Survey' &copy; Crown copyright and database right
         2010-12.
       contributors_footer_1_html: |-
-        Por pli da detaloj pri ĉi tiuj kaj aliaj fontoj uzitaj por plibonigi OpenStreetMap, bonvolu viziti la <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">paĝon pri kontribuintoj</a> en la OpenStreetMap-vikio.
+        Por pli da detaloj pri tiuj ĉi kaj aliaj fontoj uzitaj por plibonigi OpenStreetMap, bonvolu viziti la <a
+        href="https://wiki.openstreetmap.org/wiki/Contributors">paĝon pri kontribuintoj</a> en la OpenStreetMap-vikio.
       contributors_footer_2_html: Inkludo de datumoj en OpenStreetMap ne indikas,
         ke la provizanto de datumoj apogas OpenStreetMap, garantias por iu aŭ respondumas
         por iu.
@@ -1077,16 +1134,15 @@ eo:
         el iuj ajn fontoj protektataj de kopirajto (ekz. Google Maps aŭ paperaj mapoj)
         sen klara permeso de posedanto de kopirajtoj.
       infringement_2_html: Se ve pensas, ke datumoj protektataj per kopirajto estas
-        misaldonitaj al OpenStreetMap-datumbazo aŭ al ĉi tiu retejo, bonvolu legi
-        pri <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">proceduro
+        misaldonitaj al OpenStreetMap-datumbazo aŭ al tiu ĉi retejo, bonvolu legi
+        pri <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">proceduro
         de forigado de datumoj</a> aŭ plenigi la <a href="http://dmca.openstreetmap.org/">enretan
         formularon</a>.
       trademarks_title_html: <span id="trademarks"></span>Registritaj markoj
-      trademarks_1_html: OpenStreetMap, la piktogramo de grandiga lenso kaj 'State
-        of the Map' estas registritaj markoj de OpenStreetMap Fondaĵo. Se vi havas
-        iujn demandojn pri uzado de niaj markoj, bonvolu sendi viajn demandojn al
-        la <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupo
-        de laboro pri permesilo</a>.
+      trademarks_1_html: OpenStreetMap, la piktogramo de grandiga lenso kaj “State
+        of the Map” estas registritaj markoj de la Fondaĵo OpenStreetMap. Se vi havas
+        iujn demandojn pri uzado de niaj markoj, bonvolu sciigi kun nia <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">politiko
+        pri varmarkoj</a>.
   welcome_page:
     title: Bonvenon!
     introduction_html: Bonvenon al OpenStreetMap, la libera kaj redaktebla mapo de
@@ -1118,8 +1174,8 @@ eo:
       paragraph_1_html: "OpenStreetMap havas malmultajn formalajn regulojn, tamen
         ni esperas, ke ĉiuj kunlaboros kaj interparolos en la komunumo. Se vi planas
         iujn agadojn aliajn ol permanajn redaktojn, bonvolu legi la sekvajn rekomendojn
-        pri <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>enportadoj</a>
-        kaj \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>aŭtomataj
+        pri <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>enportoj</a>
+        kaj \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>aŭtomataj
         redaktoj</a>."
     questions:
       title: Iaj demandoj?
@@ -1152,7 +1208,7 @@ eo:
       title: Aliaj aferoj
       explanation_html: Se vi havas demandojn pri kial niaj datumoj aŭ enhavo estas
         uzataj, bonvolu ekkoni <a href='/copyright'>paĝon pri kopirajto</a> por pliaj
-        leĝaj informoj, aŭ kontaktu la <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-laborgrupon</a>.
+        leĝaj informoj, aŭ kontaktu la <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-laborgrupon</a>.
   help_page:
     title: Akiri helpon
     introduction: OpenStreetMap havas kelkajn ejojn por lerni pri la projekto, por
@@ -1162,7 +1218,7 @@ eo:
       title: Bonvenon al OSM
       description: Komencu ekde ĉi tiu manlibreto ampleksanta fundamentojn de OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: Manlibro por komencantoj
       description: Manlibro por komencantoj kreata de la komunumo (en la angla).
     help:
@@ -1202,8 +1258,8 @@ eo:
       kaj ĝisdatigaj.
     community_driven_title: Kondukata de komunumo
     community_driven_html: |-
-      La komunumo de OpenStreetMap estas diversa, pasia kaj kreskas tagon post tago. Inter niaj kontribuantoj estas ŝatantoj de mapoj, profesiuloj de GIS, inĝenieroj prizorgantaj OSM-servilojn, helpistoj kiuj mapas areojn tuŝitajn de katastrofoj kaj multaj aliaj. Por lerni pli pri la komunumo, vidu <a href='%{diary_path}'>taglibrojn de uzantoj</a>,
-      <a href='http://blogs.openstreetmap.org/'>komunumajn taglibrojn</a> kaj la retpaĝon de <a href='http://www.osmfoundation.org/'>OSM Fondaĵo</a>.
+      La komunumo de OpenStreetMap estas diversa, pasia kaj kreskas tagon post tago. Inter niaj kontribuantoj estas ŝatantoj de mapoj, profesiuloj de GIS, inĝenieroj prizorgantaj OSM-servilojn, helpistoj kiuj mapigas areojn tuŝitajn de katastrofoj kaj multaj aliaj. Por sciigi pli pri la komunumo, vidu <a href='https://blog.openstreetmap.org'>taglibron OpenStreetMap</a>, <a href='%{diary_path}'>taglibrojn de uzantoj</a>,
+      <a href='https://blogs.openstreetmap.org/'>komunumajn taglibrojn</a> kaj la retpaĝon de la <a href='https://www.osmfoundation.org/'>Fondaĵo OSM</a>.
     open_data_title: Malfermaj datumoj
     open_data_html: 'OpenStreetMap estas <i>malfermaj datumoj</i>: vi povas uzi ĝin
       kiamaniere vi volas sub la kondiĉo de vi atribuos aŭtorecon al OpenStreetMap
@@ -1211,12 +1267,10 @@ eo:
       la verkon nur laŭ la sama permesilo. Vidu la <a href=''%{copyright_path}''>paĝon
       pri kopirajto kaj permesilo</a> por pli da detaloj.'
     legal_title: Leĝaj demandoj
-    legal_html: Ĉi tiu retejo kaj aliaj servoj estas formale administrataj de la <a
-      href='http://osmfoundation.org/'>OpenStreetMap Fondaĵo</a> (OSMF) komisie de
-      la komunumo. Uzado de ĉiuj OSMF-servoj estas regulata per <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Politiko
-      de uzado</a> kaj nia <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politiko
-      de privateco</a>. Bonvolu <a href='http://osmfoundation.org/Contact'>kontakti
-      kun OSMF</a>, se vi havas iun demandon pri permesilo, kopirajto aŭ leĝo.
+    legal_html: |-
+      Tiu ĉi retejo kaj aliaj servoj estas formale administrataj de la <a href='https://osmfoundation.org/'>Fondaĵo OpenStreetMap</a> (OSMF) komisie de la komunumo. Uzado de ĉiuj OSMF-servoj estas regulata per nia <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">politiko de uzado</a> kaj nia <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">politiko de privateco</a>. Bonvolu <a href='https://osmfoundation.org/Contact'>kontakti kun OSMF</a>, se vi havas iun demandon pri permesilo, kopirajto aŭ leĝo.
+      <br>
+      OpenStreetMap, la piktogramo de lupeo kaj “State of the Map” estas <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">registritaj varmarkoj de OSMF</a>.
     partners_title: Kunlaborantoj
   notifier:
     diary_comment_notification:
@@ -1417,14 +1471,14 @@ eo:
         kiel publikan ĉe via %{user_page}.
       user_page_link: uzantpaĝo
       anon_edits_link_text: Tie ĉi vi sciiĝis kiel.
-      flash_player_required: Por uzi laOpenStreetMap-redaktilon 'Potlatch', vi bezonas
-        la kromprogramon Flash. Vi povas <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">elŝuti
-        Flash Player el Adobe.com retpaĝo</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Kelkaj
+      flash_player_required: Por uzi la OpenStreetMap-redaktilon 'Potlatch', vi bezonas
+        la kromprogramon Flash. Vi povas <a href="https://get.adobe.com/flashplayer/">elŝuti
+        Flash Player el retpaĝo de Adobe.com</a>. <a href="https://wiki.openstreetmap.org/wiki/Editing">Kelkaj
         aliaj redaktiloj</a> estas disponeblaj por redakti OpenStreetMap.
       potlatch_unsaved_changes: Vi havas nekonservitajn ŝanĝojn. (Por konservi ŝanĝojn
         en Potlatch, malelektu nune elektitan linion aŭ punkton se vi redaktas en
         'rekta reĝimo', aŭ alklaku butonon 'konservi', se ĝi videblas.)
-      potlatch2_not_configured: Potlatch 2 ne estas agordita - vidu http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+      potlatch2_not_configured: Potlatch 2 ne estas agordita - legu https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
         por pli da informoj
       potlatch2_unsaved_changes: Vi havas nekonservitajn ŝanĝojn. (Por konservi ilin
         en Potlatch 2, alklaku 'konservi'.)
@@ -1440,7 +1494,7 @@ eo:
       get_directions_title: Difinas la kurson inter du punktoj
       from: El
       to: Al
-      where_am_i: Kie mi estas?
+      where_am_i: Kie estas tio ĉi?
       where_am_i_title: Trovas la nunan pozicion per la foliumilo
       submit_text: Ek
     key:
@@ -1517,7 +1571,7 @@ eo:
       edit: Redakti
       preview: Antaŭvidi
     markdown_help:
-      title_html: Sintakse analizita per <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Sintakse analizita per <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Titoloj
       heading: Titolo
       subheading: Subtitolo
@@ -1624,8 +1678,8 @@ eo:
       public_traces_from: Publikaj GPS-spuroj de %{user}
       description: Montri lastajn GPS-spurojn
       tagged_with: etikedita kun %{tags}
-      empty_html: Ankoraŭ neniu estas tie ĉi.. <a href='%{upload_link}'>Alŝutu novan
-        spuron</a> aŭ lernu pli pri GPS-spurado ĉe la <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>viki-paĝo</a>.
+      empty_html: Ankoraŭ nenio estas tie ĉi. <a href='%{upload_link}'>Alŝutu novan
+        spuron</a> aŭ sciigu pli pri GPS-spurado ĉe la <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>viki-paĝo</a>.
     delete:
       scheduled_for_deletion: Spuro forviŝota
     make_public:
@@ -1832,11 +1886,11 @@ eo:
         html: <p>Kontraste kun aliaj mapoj, OpenStreetMap estas tute kreata de homoj
           kiel vi, kaj iu ajn povas korekti, ĝisdatigi, elŝuti kaj uzi ĝin.</p> <p>Registriĝu
           por komenci kontribuadon. Ni sendos al vi retleteron por konfirmi vian konton.</p>
-      license_agreement: Kiam vi konfirmos vian konton, vi devos akcepti la <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">interkonsenton
+      license_agreement: Kiam vi konfirmos vian konton, vi devos akcepti la <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">interkonsenton
         pri kontribuado</a>.
       email address: 'Retpoŝtadreso:'
       confirm email address: 'Konfirmi retpoŝtadreson:'
-      not displayed publicly: Via adreso ne estos montrata publike, vidu nian <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: Via adreso ne estos montrata publike, vidu nian <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="OSMF-a politiko pri privateco enhavanta sekcio pri retpoŝta adreso">politikon
         pri privateco</a> por pli da informoj.
       display name: 'Montrata nomo:'
@@ -1957,12 +2011,12 @@ eo:
       email never displayed publicly: (neniam publike montrita)
       external auth: 'Ekstera aŭtentigo:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: kio estas tio?
       public editing:
         heading: 'Publika redaktado:'
         enabled: Ebligita. Ne anonima kaj rajtas redakti.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Kio estas tio ?
         disabled: Malebligita kaj ne rajtas redakti, ĉiuj antaŭaj redaktoj naŭ estas
           publikaj.
@@ -1972,9 +2026,9 @@ eo:
         text: Nuntempe viaj redaktoj estas anonimaj kaj aliuloj ne povas sendi mesaĝojn
           al vi kaj vidi vian lokon. Por montri kion vi redaktis kaj ebligi al aliuloj
           kontakti vin per la retejo, alklaku la butonon sube. <b>Ekde la versio 0.6
-          de API, nur publikaj uzantoj povas redakti map-datumojn.</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">sciiĝi
-          kial</a>).<ul><li>Via retpoŝta adreso ne estos publikigita.</li><li>Ĉi tio
-          ago ne povos esti malfarita kaj ĉiuj novaj uzantoj estas publikaj implicite.</li></ul>
+          de API, nur publikaj uzantoj povas redakti map-datumojn.</b> (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">sciiĝi
+          kial</a>).<ul><li>Via retpoŝta adreso ne estos publikigita.</li><li>Tiu
+          ĉi ago ne povos esti malfarita kaj ĉiuj novaj uzantoj estas publikaj implicite.</li></ul>
       contributor terms:
         heading: 'Interkonsento pri kontribuado:'
         agreed: Vi konsentis la novan interkonsenton pri kontribuado.
@@ -2093,6 +2147,8 @@ eo:
       not_a_role: La ĉeno `%{role}' ne estas valida rolo.
       already_has_role: La uzanto jam rolas %{role}.
       doesnt_have_role: La uzanto ne rolas %{role}.
+      not_revoke_admin_current_user: Ne povas nuligi rolon de administranto de nuna
+        uzanto.
     grant:
       title: Konfirmi donadon de rolo
       heading: Konfirmi donadon de rolo
@@ -2299,7 +2355,7 @@ eo:
       createnote_disabled_tooltip: Pligrandigu por aldoni rimarkon al la mapo
       map_notes_zoom_in_tooltip: Pligrandigu por vidi map-rimarkoj
       map_data_zoom_in_tooltip: Pligrandigu por vidi map-datumoj
-      queryfeature_tooltip: Montri informoj pri objekto
+      queryfeature_tooltip: Montri informojn pri objekto
       queryfeature_disabled_tooltip: Pligrandigu por montri informojn pri objektoj
     changesets:
       show:
@@ -2310,10 +2366,12 @@ eo:
         unhide_comment: malkaŝi
     notes:
       new:
-        intro: Vi rimarkis eraron aŭ io mankas? Sciigu aliajn mapigistojn, por ili
-          povos ripari tion. Movu la markon al la respektivan pozicion kaj enmetu
-          la rimarkon priskribantan la problemon. (Bonvolu ne enmeti personajn informojn
-          aŭ informojn el kopirajtaj mapoj aŭ fontoj.)
+        intro: Ĉu vi rimarkis eraron aŭ io mankas? Sciigu aliajn mapigistojn, por
+          ili povos ripari tion. Movu la markon al la respektivan pozicion kaj enmetu
+          la rimarkon priskribantan la problemon.
+        advice: Via rimarko estas publika kaj povas esti uzita por ĝisdatigi la mapon,
+          do ne enmetu privatajn informojn kaj informojn el kopirajtaj mapoj aŭ aliaj
+          datumbazoj.
         add: Aldoni rimarkon
       show:
         anonymous_warning: Ĉi tiu rimarko enhavas komentojn de anonimuloj, kiuj devas
@@ -2335,9 +2393,6 @@ eo:
         mapquest_car: Aŭte (MapQuest)
         mapquest_foot: Piede (MapQuest)
         osrm_car: Aŭte (OSRM)
-        mapzen_bicycle: Bicikle (Mapzen)
-        mapzen_car: Aŭte (Mapzen)
-        mapzen_foot: Piede (Mapzen)
       descend: Malsupreniro
       directions: Kurso
       distance: Distanco
index 869e8595a3f8bc37882f9bd9be211d5dc1a5e491..a217fa6d6837f27eff6f9a9e955d68d562823a26 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Spanish (español)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: 2axterix2
 # Author: Aguslr
 # Author: Alberto Chung
 # Author: Armando-Martin
 # Author: Johnarupire
 # Author: Jynus
 # Author: KATRINE1992
+# Author: La Mantis
 # Author: Larjona
 # Author: Locos epraix
 # Author: Luzcaru
 # Author: Macofe
+# Author: MarcoAurelio
 # Author: McDutchie
 # Author: Mor
 # Author: Nemo bis
@@ -45,7 +48,7 @@
 es:
   time:
     formats:
-      friendly: '%e %B %Y a las %H:%M'
+      friendly: '%e de %B de %Y a las %H:%M'
   activerecord:
     models:
       acl: Lista de control de acceso
@@ -110,7 +113,7 @@ es:
       user:
         email: Correo electrónico
         active: Activo
-        display_name: Nombre a mostrar
+        display_name: Nombre para mostrar
         description: Descripción
         languages: Idiomas
         pass_crypt: Contraseña
@@ -168,6 +171,8 @@ es:
         title_comment: Conjunto de cambios %{id} - %{comment}
       join_discussion: Inicie sesión para unirse a la discusión
       discussion: Discusión
+      still_open: El conjunto de cambios sigue abierto; la discusión se abrirá cuando
+        se cierre el conjunto de cambios.
     node:
       title: 'Nodo: %{name}'
       history_title: 'Historial de nodo: %{name}'
@@ -420,14 +425,14 @@ es:
   geocoder:
     search:
       title:
-        latlon: Resultados <a href="http://openstreetmap.org/">internos</a>
+        latlon: Resultados <a href="https://openstreetmap.org/">internos</a>
         uk_postcode: Resultados de <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultados de <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultados de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultados de <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultados de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultados de <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultados de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultados de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resultados de <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -437,11 +442,14 @@ es:
           chair_lift: Telesilla
           drag_lift: Telearrastre
           gondola: Telecabina
+          platter: Telesquí
           station: Estación de remonte
         aeroway:
           aerodrome: Aeródromo
+          airstrip: Aeródromo
           apron: Pista
           gate: Puerta
+          hangar: Hangar
           helipad: Helipuerto
           runway: Pista
           taxiway: Calle de rodaje
@@ -477,37 +485,31 @@ es:
           crematorium: Crematorio
           dentist: Dentista
           doctors: Consultorio médico
-          dormitory: Residencia de estudiantes
           drinking_water: Agua potable
           driving_school: Autoescuela
           embassy: Embajada
-          emergency_phone: Teléfono de emergencia
           fast_food: Comida rápida
           ferry_terminal: Terminal de ferrys
-          fire_hydrant: Hidrante
           fire_station: Parque de bomberos
           food_court: Zona de restaurantes
           fountain: Fuente
           fuel: Gasolinera
           gambling: Juegos de azar
           grave_yard: Cementerio
-          gym: Gimnasio
-          health_centre: Centro de salud
           hospital: Hospital
           hunting_stand: Apostadero de caza
           ice_cream: Heladería
           kindergarten: Escuela infantil/guardería
           library: Biblioteca
-          market: Mercado
           marketplace: Mercado
           monastery: Monasterio
           motorcycle_parking: Estacionamiento para motocicletas
           nightclub: Club nocturno
-          nursery: Enfermería
           nursing_home: Residencia para la tercera edad
           office: Oficina
           parking: Aparcamiento
           parking_entrance: Entrada de estacionamiento
+          parking_space: Estacionamiento
           pharmacy: Farmacia
           place_of_worship: Templo
           police: Policía
@@ -517,7 +519,6 @@ es:
           prison: Prisión
           pub: Pub
           public_building: Edificio público
-          reception_area: Área de recepción
           recycling: Punto de reciclaje
           restaurant: Restaurante
           retirement_home: Residencia de jubilados
@@ -569,20 +570,25 @@ es:
           "yes": Tienda de artesanía
         emergency:
           ambulance_station: Base de ambulancias
+          assembly_point: Punto de reunión
           defibrillator: Desfibrilador
           landing_site: Lugar de aterrizaje de emergencia
           phone: Teléfono de emergencia
+          water_tank: Tanque de agua de emergencia
+          "yes": Emergencia
         highway:
           abandoned: Calle o carretera abandonada
           bridleway: Camino prioritario para peatones y caballos
           bus_guideway: Canal guiado de autobuses
           bus_stop: Parada de autobuses
           construction: Calle o carretera en construcción
+          corridor: Corredor
           cycleway: Bicisenda
           elevator: Ascensor
           emergency_access_point: Acceso de emergencia
           footway: Sendero
           ford: Vado
+          give_way: Señal de ceda el paso
           living_street: Calle residencial
           milestone: Hito
           motorway: Autovía
@@ -604,6 +610,7 @@ es:
           services: Vía de servicio
           speed_camera: Radar
           steps: Escaleras
+          stop: Señal de alto
           street_lamp: Farola
           tertiary: Carretera terciaria
           tertiary_link: Carretera terciaria
@@ -613,7 +620,6 @@ es:
           trunk: Vía rápida
           trunk_link: Enlace de vía rápida
           unclassified: Carretera sin clasificar
-          unsurfaced: Vía no pavimentada
           "yes": Camino
         historic:
           archaeological_site: Yacimiento arqueológico
@@ -632,6 +638,7 @@ es:
           manor: Casa señorial
           memorial: Memorial
           mine: Mina
+          mine_shaft: Pozo minero
           monument: Monumento
           roman_road: Calzada romana
           ruins: Ruinas
@@ -641,6 +648,7 @@ es:
           wayside_cross: Crucero
           wayside_shrine: Sepulcro
           wreck: Pecio
+          "yes": Sitio histórico
         junction:
           "yes": Intersección
         landuse:
@@ -678,7 +686,6 @@ es:
         leisure:
           beach_resort: Complejo en la playa
           bird_hide: Observatorio de aves
-          club: Club
           common: Terreno común
           dog_park: Parque canino
           fishing: Área de pesca
@@ -705,15 +712,33 @@ es:
           water_park: Parque acuático
           "yes": Ocio
         man_made:
+          breakwater: Rompeolas
+          bridge: Puente
+          bunker_silo: Búnker
+          dyke: Dique
+          embankment: Terraplén
+          gasometer: Depósito de gas
+          groyne: Espigón
           lighthouse: Faro
+          mine: Mina
+          mineshaft: Pozo minero
+          petroleum_well: Pozo petrolífero
+          pier: Muelle
           pipeline: Tubería
+          silo: Silo
+          surveillance: Vigilancia
           tower: Torre
+          wastewater_plant: Planta de tratamiento de aguas
+          watermill: Molino hidráulico
+          water_well: Pozo
+          windmill: Molino de viento
           works: Fábrica
           "yes": Artificial
         military:
           airfield: Aeródromo militar
           barracks: Barracas
           bunker: Búnker
+          "yes": Ejército
         mountain_pass:
           "yes": Paso de montaña
         natural:
@@ -759,7 +784,9 @@ es:
           accountant: Contable
           administrative: Administración
           architect: Arquitecto
+          association: Asociación
           company: Empresa
+          educational_institution: Institución educativa
           employment_agency: Agencia de empleo
           estate_agent: Inmobiliaria
           government: Oficina gubernamental
@@ -771,9 +798,8 @@ es:
           "yes": Oficina
         place:
           allotments: Parcelas
-          block: Bloque
-          airport: Aeropuerto
           city: Ciudad
+          city_block: Manzana
           country: País
           county: Condado
           farm: Granja
@@ -784,12 +810,12 @@ es:
           islet: Islote
           isolated_dwelling: Vivienda aislada
           locality: Paraje
-          moor: Páramo
           municipality: Municipio
           neighbourhood: Barrio
           postcode: Código postal
           region: Región
           sea: Mar
+          square: Plaza
           state: Estado o provincia
           subdivision: Subdivisión
           suburb: Suburbio
@@ -801,10 +827,8 @@ es:
           abandoned: Ferrocarril abandonado
           construction: Vía ferroviaria en construcción
           disused: Ferrocarril en desuso
-          disused_station: Estación de tren en desuso
           funicular: Vía de funicular
           halt: Apeadero
-          historic_station: Estación de tren histórica
           junction: Encrucijada de vías ferroviarias
           level_crossing: Paso a nivel
           light_rail: Metro ligero
@@ -830,6 +854,7 @@ es:
           beauty: Salón de belleza
           beverages: Tienda de bebidas
           bicycle: Tienda de bicicletas
+          bookmaker: Casa de apuestas
           books: Librería
           boutique: Boutique
           butcher: Carnicería
@@ -868,12 +893,14 @@ es:
           hairdresser: Peluquería
           hardware: Ferretería
           hifi: Hi-Fi
-          insurance: Aseguradora
+          interior_decoration: Decoración de interiores
           jewelry: Joyería
           kiosk: Quiosco
           laundry: Lavandería
+          lottery: Lotería
           mall: Centro comercial
           market: Mercado
+          massage: Masaje
           mobile_phone: Tienda de telefonía
           motorcycle: Tienda de motocicletas
           music: Tienda de música
@@ -881,21 +908,22 @@ es:
           optician: Óptica
           organic: Tienda de alimentos orgánicos
           outdoor: Tienda de deportes de aventura
+          pawnbroker: Casa de empeños
           pet: Tienda de mascotas
           pharmacy: Farmacia
           photo: Tienda de fotografía
-          salon: Salón de belleza
+          seafood: Mariscos
           second_hand: Tienda de segunda mano
           shoes: Zapatería
-          shopping_centre: Centro comercial
           sports: Tienda de deportes
           stationery: Papelería
           supermarket: Supermercado
           tailor: Sastre
+          tobacco: Tabaquería
           toys: Juguetería
           travel_agency: Agencia de viajes
           video: Videoclub
-          wine: Vinoteca
+          wine: Vinatería
           "yes": Tienda
         tourism:
           alpine_hut: Refugio de montaña
@@ -1026,24 +1054,23 @@ es:
       title_html: Derechos de autor y licencia
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> es <i>Open Data</i> (un servicio de datos de acceso libre), con licencia <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) de la  <a
-        href="http://osmfoundation.org/">Fundación OpenStreetMap</a> (OSMF).
+        href="https://osmfoundation.org/">Fundación OpenStreetMap</a> (OSMF).
       intro_2_html: Puedes copiar, distribuir, transmitir y adaptar nuestros mapas
         e información libremente siempre y cuando des reconocimiento a OpenStreetMap
         y sus colaboradores. Si alteras o generas contenido sobre nuestros mapas e
         información, solo podrás distribuir estos cambios bajo la misma licencia.
-        El <a href="http://opendatacommons.org/licenses/odbl/1.0/">código legal completo</a>
+        El <a href="https://opendatacommons.org/licenses/odbl/1.0/">código legal completo</a>
         explica tus derechos y obligaciones.
       intro_3_html: La cartografía en nuestros mosaicos de mapas y en nuestra documentación,
-        están licenciados bajo la licencia <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
-        Commons Reconocimiento-CompartirIgual 2.0</a> (CC-BY-SA).
+        están licenciados bajo la licencia <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Reconocimiento-CompartirIgual 2.0</a> (CC BY-SA).
       credit_title_html: Cómo dar reconocimiento a OpenStreetMap
       credit_1_html: Requerimos que utilices los créditos "© Colaboradores de OpenStreetMap".
       credit_2_html: |-
-        Usted debe también dejar claro que los datos están disponibles bajo la licencia Open Database License (ODbL), y si utiliza nuestros mapas, que la cartografía posee licencia CC-BY-SA. Puede hacer esto mediante el enlace a <a href="http://www.openstreetmap.org/copyright">esta página de derechos de autor</a>.
-        Como alternativa y como un requisito si están distribuyendo OSM en un  formulario de datos, puede nombrar y enlazar directamente a las licencias. En medios de comunicación donde los enlaces no sean posibles (por ejemplo, obras impresas), le sugerimos que
-        dirija a sus lectores a openstreetmap.org (quizás expandiendo 'OpenStreetMap' hasta esta dirección completa), a opendatacommons.org, y si procede, a creativecommons.org.
+        Usted debe también dejar claro que los datos están disponibles bajo la licencia Open Database License (ODbL), y si utiliza nuestros mapas, que la cartografía posee licencia CC BY-SA. Puede hacer esto mediante el enlace a <a href="https://www.openstreetmap.org/copyright">esta página de derechos de autor</a>.
+        Como alternativa y como un requisito si están distribuyendo OSM en un formulario de datos, puede nombrar y enlazar directamente a las licencias. En medios de comunicación donde los enlaces no sean posibles (por ejemplo, obras impresas), le sugerimos que dirija a sus lectores a openstreetmap.org (quizás expandiendo 'OpenStreetMap' hasta esta dirección completa), a opendatacommons.org, y si procede, a creativecommons.org.
       credit_3_html: |-
         En un mapa electrónico navegable, los créditos deben aparecer en la esquina del mapa.
         Por ejemplo:
@@ -1052,8 +1079,8 @@ es:
         title: Ejemplo de atribución
       more_title_html: Para saber más...
       more_1_html: |-
-        Encontrarás más información acerca de cómo utilizar nuestros datos, y cómo citarnos como fuente, en la <a
-        href="http://osmfoundation.org/Licence">página de licencia de OSMF</a> y en las <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">preguntas legales más frecuentes</a> de la comunidad.
+        Encontrarás más información acerca de cómo utilizar nuestros datos y cómo citarnos como fuente en la <a
+        href="https://osmfoundation.org/Licence">página de licencia de la OSMF</a>.
       more_2_html: |-
         A pesar de que OpenStreetMap es contenido abierto, no podemos suminstrar una API de mapas gratuita para terceros.
 
@@ -1065,8 +1092,8 @@ es:
         y otras fuentes, entre ellas:'
       contributors_at_html: |-
         <strong>Austria</strong>: Contiene datos de
-           <a href="http://data.wien.gv.at/">Stadt Wien</a> (bajo
-           <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> y Land Tirol (bajo licencia <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT con modificaciones</a>).
+           <a href="https://data.wien.gv.at/">Stadt Wien</a> (bajo
+           <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> y Land Tirol (bajo licencia <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT con modificaciones</a>).
       contributors_ca_html: '<strong>Canadá</strong>: contiene datos de GeoBase&reg;,
         GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy;
         Department of Natural Resources Canada) y StatCan (Geography Division, Statistics
@@ -1094,7 +1121,7 @@ es:
         <strong>Reino Unido</strong>: Contiene datos de Ordnance Survey &copy; Crown copyright and database right
          2010-12.
       contributors_footer_1_html: Para obtener más detalles sobre estas y otras fuentes
-        que se han utilizado para ayudar a mejorar OpenStreetMap, véase la <a href="http://wiki.openstreetmap.org/wiki/Contributors">página
+        que se han utilizado para ayudar a mejorar OpenStreetMap, véase la <a href="https://wiki.openstreetmap.org/wiki/Contributors">página
         de colaboradores</a> en el Wiki de OpenStreetMap.
       contributors_footer_2_html: La inclusión de información en OpenStreetMap no
         implica que el proveedor de la información original apoya a OpenStreetMap,
@@ -1110,10 +1137,10 @@ es:
         de descolgado</a> o preséntelo directamente en nuestra <a href="http://dmca.openstreetmap.org/">página
         de presentación en línea</a>.
       trademarks_title_html: <span id="trademarks"></span>Marcas registradas
-      trademarks_1_html: OpenStreetMap, el logotipo de la lupa y el estado del mapa
+      trademarks_1_html: OpenStreetMap, el logotipo de la lupa y «State of the Map»
         son marcas registradas de la Fundación OpenStreetMap. Si tienes preguntas
-        sobre su uso, envíalas al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">grupo
-        de trabajo sobre licencias</a>.
+        sobre su uso, consulta nuestra <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">normativa
+        de marcas registradas</a>.
   welcome_page:
     title: ¡Bienvenido!
     introduction_html: Bienvenido a OpenStreetMap, el mapa libre y editable del mundo.
@@ -1184,7 +1211,7 @@ es:
       title: Otras preocupaciones
       explanation_html: |-
         Si tienes preocupaciones sobre cómo se están utilizando nuestros datos o sobre el contenido, consulta nuestra
-        <a href='/copyright'>página de derechos de autor</a> para obtener más información legal, o contacta con el <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grupo de trabajo OSMF</a> apropiado.
+        <a href='/copyright'>página de derechos de autor</a> para obtener más información legal, o contacta con el <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>grupo de trabajo OSMF</a> apropiado.
   help_page:
     title: Cómo obtener ayuda
     introduction: OpenStreetMap tiene varios recursos para aprender sobre el proyecto,
@@ -1195,7 +1222,7 @@ es:
       title: Le damos la bienvenida a OSM
       description: Comenzar con esta guía rápida que cubre lo básico de OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/ES:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/ES:Beginners%27_guide
       title: Guía del principiante
       description: Guía para principiantes, mantenida por la comunidad.
     help:
@@ -1219,9 +1246,9 @@ es:
       description: Ayuda para las empresas y organizaciones que migran a mapas y a
         otros servicios, basados en OpenStreetMap.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/ES:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/ES:Main_Page
       title: wiki.openstreetmap.org
-      description: Consulta la wiki para la documentación de OSM en profundidad.
+      description: Explora el wiki para obtener documentación detallada de OSM.
   about_page:
     next: Siguiente
     copyright_html: <span>&copy;</span>Colaboradores de<br>OpenStreetMap
@@ -1251,13 +1278,15 @@ es:
       página sobre Derechos de autor y Licencia</a> para obtener más detalles.'
     legal_title: Legal
     legal_html: "Este sitio y muchos otros servicios relacionados son gestionados
-      por la  \n<a href='http://osmfoundation.org/'>Fundación OpenStreetMap</a> (OSMF)
-      \nen nombre de la comunidad. El uso de todos los servicios gestionados por la
-      OSMF está sujeto \na nuestra <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nnormativa
-      de uso aceptable</a> y nuestra <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">normativa
-      de privacidad</a>\n<br> \n<a href='http://osmfoundation.org/Contact'>Contacta
-      con la OSMF</a> \nsi tienes preguntas o problemas sobre licencias, derechos
-      de autor u otro tema legal."
+      formalmente por la  \n<a href='https://osmfoundation.org/'>Fundación OpenStreetMap</a>
+      (OSMF) \nen nombre de la comunidad. El uso de todos los servicios gestionados
+      por la OSMF está sujeto \na nuestra <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nnormativa
+      de uso aceptable</a> y nuestra <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">normativa
+      de privacidad</a>\n<br> \n<a href='http://osmfoundation.org/Contact'>Ponte en
+      contacto con la OSMF</a> \nsi tienes preguntas sobre licencias, derechos de
+      autor u otra cuestión legal.\n<br>\nOpenStreetMap, el logotipo de la lupa y
+      «State of the Map» son <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">marcas
+      registradas de la OSMF</a>."
     partners_title: Socios
   notifier:
     diary_comment_notification:
@@ -1569,7 +1598,7 @@ es:
       edit: Editar
       preview: Vista previa
     markdown_help:
-      title_html: Analizado con <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Procesado con <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Títulos
       heading: Título
       subheading: Subcabecera
@@ -1894,7 +1923,7 @@ es:
           por gente como tú, y cualquiera puede corregirlo, actualizarlo, descargarlo
           y usarlo.</p> <p>Regístrate para comenzar a contribuir. Te enviaremos un
           mensaje de correo electrónico para confirmar tu cuenta.</p>
-      license_agreement: Cuando confirmes tu cuenta tendrás que aceptar los <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">términos
+      license_agreement: Cuando confirmes tu cuenta tendrás que aceptar los <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">términos
         del contribuyente</a>.
       email address: 'Dirección de correo electrónico:'
       confirm email address: 'Confirmar la dirección de correo electrónico:'
@@ -2020,7 +2049,7 @@ es:
       email never displayed publicly: (nunca es mostrado públicamente)
       external auth: 'Autenticación externa:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: ¿qué es esto?
       public editing:
         heading: 'Ediciones públicas:'
@@ -2165,6 +2194,8 @@ es:
       not_a_role: La cadena `%{role}' no es una función válida.
       already_has_role: El usuario ya tiene la función %{role}.
       doesnt_have_role: El usuario no tiene la función %{role}.
+      not_revoke_admin_current_user: No se pudo revocar el cargo de administrador
+        del usuario actual.
     grant:
       title: Confirmar adjudicación de función
       heading: Confirmar adjudicación de función
@@ -2271,7 +2302,7 @@ es:
     blocks_on:
       title: Bloqueos sobre %{name}
       heading: Lista de bloqueos sobre %{name}
-      empty: '%{name} no ha sido bloqueado todavía.'
+      empty: '%{name} no se ha bloqueado todavía.'
     blocks_by:
       title: Bloqueos por %{name}
       heading: Listado de bloqueos por %{name}
@@ -2394,8 +2425,10 @@ es:
       new:
         intro: ¿Has detectado un error o falta algo? Hazlo saber a otros cartógrafos
           para que podamos arreglarlo. Mueve el marcador hasta la posición correcta
-          y escribe una nota para explicar el problema. (Por favor no escribas información
-          personal o información de mapas con derechos de autor o listados de directorios.)
+          y escribe una nota para explicar el problema.
+        advice: La nota será pública y podría utilizarse para actualizar el mapa,
+          así que no des información personal ni datos provenientes de mapas o catálogos
+          protegidos por derechos de autor.
         add: Añadir nota
       show:
         anonymous_warning: Esta nota contiene comentarios de usuarios anónimos que
@@ -2417,9 +2450,6 @@ es:
         mapquest_car: En coche (MapQuest)
         mapquest_foot: A pie (MapQuest)
         osrm_car: En coche (OSRM)
-        mapzen_bicycle: En bicicleta (Mapzen)
-        mapzen_car: En coche (Mapzen)
-        mapzen_foot: A pie (Mapzen)
       descend: Descender
       directions: Indicaciones
       distance: Distancia
index dc50ac38b8ca9b48ca72e8663696cacf4f2869a8..ff015774793656f5db6f5e314f36bc100ef8a358 100644 (file)
@@ -428,25 +428,20 @@ et:
           crematorium: Krematoorium
           dentist: Hambaarst
           doctors: Arstid
-          dormitory: Ühiselamu
           drinking_water: Joogivesi
           driving_school: Autokool
           embassy: Saatkond
-          emergency_phone: Hädaabi telefon
           fast_food: Kiirtoit
           ferry_terminal: Praamiterminal
-          fire_hydrant: Tuletõrjehüdrant
           fire_station: Tuletõrjedepoo
           fountain: Purskkaev
           fuel: Kütus
           grave_yard: Surnuaed
-          health_centre: Tervisekeskus
           hospital: Haigla
           hunting_stand: Jahikantsel
           ice_cream: Jäätis
           kindergarten: Lasteaed
           library: Raamatukogu
-          market: Turg
           marketplace: Turg
           monastery: Klooster
           nightclub: Ööklubi
@@ -462,7 +457,6 @@ et:
           prison: Vangla
           pub: Pubi
           public_building: Ühiskondlik hoone
-          reception_area: Vastuvõtt
           recycling: Jäätmekäitluspunkt
           restaurant: Restoran
           retirement_home: Vanadekodu
@@ -530,7 +524,6 @@ et:
           street_lamp: Tänavavalgusti
           tertiary: Kohalik maantee
           traffic_signals: Valgusfoor
-          unsurfaced: Katteta tee
           "yes": Tee
         historic:
           battlefield: Lahinguväli
@@ -574,7 +567,6 @@ et:
           vineyard: Viinamarjaistandus
           "yes": Maakasutus
         leisure:
-          club: Klubi
           dog_park: Koerapark
           fishing: Kalapüügipiirkond
           garden: Aed
@@ -607,7 +599,7 @@ et:
           beach: Rand
           cape: Neem
           cave_entrance: Koopa sissepääs
-          cliff: Kalju
+          cliff: Klint
           crater: Kraater
           dune: Düün
           fjord: Fjord
@@ -646,7 +638,6 @@ et:
           travel_agent: Reisibüroo
         place:
           allotments: Suvilad
-          airport: Lennujaam
           city: Linn
           country: Riik
           county: Maakond
@@ -655,7 +646,6 @@ et:
           houses: Majad
           island: Saar
           islet: Saareke
-          moor: Raba
           municipality: Vald
           postcode: Sihtnumber
           sea: meri
@@ -667,10 +657,8 @@ et:
           abandoned: Ülesvõetud raudtee
           construction: Ehitusjärgus raudtee
           disused: Mahajäetud raudtee
-          disused_station: Mahajäetud raudteejaam
           funicular: Köisraudtee
           halt: Rongipeatus
-          historic_station: Ajalooline raudteejaam
           junction: Raudtee ülekäigukoht
           level_crossing: Raudtee ülesõidukoht
           light_rail: Kergraudtee
@@ -725,7 +713,6 @@ et:
           grocery: Toidupood
           hairdresser: Juuksur
           hardware: Rauakauplus
-          insurance: Kindlustus
           jewelry: Juveelipood
           kiosk: Kiosk
           laundry: Pesumaja
@@ -740,9 +727,7 @@ et:
           pet: Lemmikloomapood
           pharmacy: Apteek
           photo: Fotopood
-          salon: Ilusalong
           shoes: Kingapood
-          shopping_centre: Kaubanduskeskus
           sports: Spordipood
           stationery: Kirjatarvete kauplus
           supermarket: Supermarket
@@ -795,12 +780,12 @@ et:
           "yes": Veetee
       admin_levels:
         level2: Riigipiir
-        level4: Osariigi piir
-        level5: Regiooni piir
-        level6: Maakonna piir
-        level8: Linnapiir
-        level9: Küla piir
-        level10: Linnajao piir
+        level4: 4. järgu piir
+        level5: 5. järgu piir
+        level6: 6. järgu piir
+        level8: 8. järgu piir
+        level9: 9. järgu piir
+        level10: 10. järgu piir
     description:
       title:
         osm_nominatim: Asukoht <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
@@ -839,7 +824,7 @@ et:
       ja seda võib vabalt kasutada avatud litsentsi tingimustel.
     intro_2_create_account: loo oma konto
     partners_html: Majutust toetavad %{ucl}, %{ic} ja %{bytemark} ning teised %{partners}.
-    partners_ucl: UCL VR Centre
+    partners_ucl: UCL
     partners_ic: Imperial College London
     partners_bytemark: Bytemark Hosting
     partners_partners: partnerid
@@ -864,8 +849,8 @@ et:
   license_page:
     foreign:
       title: Info selle tõlke kohta
-      text: Juhul kui tekib vastuolu käesoleva tõlgitud lehe ja %{english_original_link}
-        vahel, on ingliskeelne leht ülimuslik.
+      text: Kui selle tõlgitud lehekülje ja %{english_original_link} vahel on vastuolu,
+        siis on ingliskeelne tekst ülimuslik.
       english_link: ingliskeelse originaali
     native:
       title: Sellest lehest
@@ -877,56 +862,51 @@ et:
     legal_babble:
       title_html: Autoriõigused ja litsents
       intro_1_html: |-
-        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> on <i>avatud andmed</i>, mis on litsentseeritud <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
-        Commons Open Database License</a> (ODbL) tingimustel <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) poolt.
+        OpenStreetMapi<sup><a href="#trademarks">&reg;</a></sup> andmed on <i>avaandmed</i>, mille
+        <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) on avaldanud litsentsi <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) all.
       intro_2_html: |-
-        Sa võid vabalt kopeerida, levitada, edastada ja kohandada meie andmeid
-        seni kuni sa tunnustad OpenStreetMapi ja selle
-        kaastööliseid. Kui sa muudad või tugined meie andmetele siis
-        siis võid sa tulemust levitada ainult sama litsentsi tingimustel.
-        Täielik <a href="http://opendatacommons.org/licenses/odbl/1.0/">litsentsi juriidiline
-        tekst</a> selgitab sinu õiguseid ja kohustusi.
+        Tohid andmeid vabalt kopeerida, levitada, edastada ja kohandada,
+        kui viitad OpenStreetMapile ja selle kaastöölistele.
+        Kui muudad andmeid või teed neist tuletise, siis tohid
+        tulemust levitada ainult sama litsentsi tingimustel.
+        Sinu õigusi ja kohustusi selgitab litsentsi <a href="http://opendatacommons.org/licenses/odbl/1.0/">täistekst</a>.
       intro_3_html: |-
-        Meie kaardipaanide kartograafia ja meie dokumentatsioon on
-        litsentseeritud <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
-        Commons Attribution-ShareAlike 2.0</a> litsentsiga (CC BY-SA).
-      credit_title_html: Kuidas tunnustada OpenStreetMapi
+        Kaardipaanide kujutised ja dokumentatsioon kuuluvad Creative Commonsi
+        litsentsi "<a href="http://creativecommons.org/licenses/by-sa/2.0/deed.et">Autorile viitamine + jagamine samadel tingimustel 2.0</a>" (CC BY-SA) alla.
+      credit_title_html: OpenStreetMapile viitamine
       credit_1_html: |-
-        Me nõuame, et sa mainiksid teksti &ldquo;&copy; OpenStreetMapi
+        Nõuame, et kasutad omistamiseks teksti &ldquo;&copy; OpenStreetMapi
         kaastöölised&rdquo;.
       credit_2_html: |-
-        Sa pead samuti selgeks tegema, et need andmed on saadaval Open
-        Database License litsentsi tingimustel, ja kui kasutatakse meie kaardi paane, siis see kartograafia
-        on litsenseeritud CC BY-SA tingimustel. Sa võid seda teha, lisades lingi
-        <a href="http://www.openstreetmap.org/copyright">sellele autoriõiguse lehele</a>.
+        Samuti pead selgelt välja tooma, et andmed kuuluvad litsentsi Open
+        Database License alla ja kui kasutatakse kaardipaane, siis et kujutised
+        kuuluvad litsentsi CC BY-SA alla. Üks võimalus selleks on linkida
+        <a href="http://www.openstreetmap.org/copyright">siia autoriõiguse leheküljele</a>.
         Teine võimalus ja samas ka nõue, kui levitad OSM-i
-        andmete kujul on, et nimetad ja annad otse lingi litsentsi(de)le. Meedias,
-        kus lingid ei ole võimalikud (nt trükitud tööd) me soovitame, et
-        suunaksid oma lugejad lehele openstreetmap.org (näiteks laiendades
-        'OpenStreetMap' täielikuks aadressiks), opendatacommons.org ja
-        kui vaja siis ka lehele creativecommons.org.
+        andmete kujul, on nimetada litsentsid ja linkida otse neile. Esitusvormis,
+        kus lingid pole võimalikud (nt trükises), soovitame suunata lugejad
+        aadressidele openstreetmap.org (võimalik, et laiendades teksti
+        "OpenStreetMap" täisaadressiks), opendatacommons.org ja
+        kui vaja, siis ka aadressile creativecommons.org.
       credit_3_html: |-
-        Sirvitaval elektroonilisel kaardil peaks tunnustus näha olema kaardi nurgas.
+        Sirvitaval elektroonilisel kaardil peaks viide olema näha kaardi nurgas.
         Näiteks:
       attribution_example:
         alt: Näide, kuidas tunnustada OpenStreetMapi veebilehel
-        title: Tunnustamise näide
+        title: Omistamise näide
       more_title_html: Lisateave
-      more_1_html: |-
-        Rohkem infot, kuidas kasutada meie andmeid ja kuidas meid tunnustada leiab <a
-        href="http://osmfoundation.org/Licence">OSMF litsentsi leheküljelt</a> ja kogukonna <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">vastustes juriidilistele küsimustele</a>.
+      more_1_html: Loe <a href="http://osmfoundation.org/Licence">OSMF-i litsentsileheküljelt</a>
+        veel andmete kasutamise kohta ja sellest, kuidas meile viidata.
       more_2_html: |-
-        Kuigi OpenStreetMap on vabad andmed, ei saa me pakkuda
-        tasuta kaardi API-t kolmandate osapoolte arendajatele.
+        Kuigi OpenStreetMapi andmed on avaandmed, ei saa me pakkuda
+        kaardi juures tasuta API-t kolmandatele osapooltele.
         Vaata meie <a href="https://operations.osmfoundation.org/policies/api/">API kasutusreegleid</a>,
-        <a href="https://operations.osmfoundation.org/policies/tiles/">Kaardi paanide kasutusreegleid</a>
+        <a href="https://operations.osmfoundation.org/policies/tiles/">kaardipaanide kasutusreegleid</a>
         ja <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatimi kasutusreegleid</a>.
-      contributors_title_html: Peamised kaastöölised
+      contributors_title_html: Meie kaastöölised
       contributors_intro_html: |-
-        Meie kaastöölisteks on tuhanded üksikisikud. Oleme samuti kaasanud vabalt litsentseeritud andmeid rahvuslikest kartograafia asutustest
+        Meie kaastöölised on tuhanded üksikisikud. Samuti oleme kaasanud
+        vabalt litsentseeritud andmeid riiklikest kaardistusteenistustest
         ja muudest allikatest, sealhulgas:
       contributors_at_html: "<strong>Austria</strong>: Sisaldab andmeid\n<a href=\"http://data.wien.gv.at/\">Viini
         linnast</a> \n(<a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC
@@ -934,60 +914,58 @@ et:
         liidumaast</a> ja\nTirooli liidumaast (<a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">CC
         BY AT tingimustel koos õiendustega</a>)."
       contributors_ca_html: |-
-        <strong>Kanada</strong>: Sisaldab
-        GeoBase&reg;, GeoGratis (&copy; Department of Natural
-        Resources Canada), CanVec (&copy; Department of Natural
-        Resources Canada) ja StatCan (Geography Division,
-        Statistics Canada) kaardiandmeid.
-      contributors_fi_html: "<strong>Soome</strong>: Sisaldab kaardiandmeid, mis on
-        pärit Maanmittauslaitos\nja teistest andmekogumitest \n<a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">Maanmittauslaitos
-        litsentsi tingimustel</a>."
-      contributors_fr_html: |-
-        <strong>Prantsusmaa</strong>: Sisaldab kaardiandmeid, mis on pärit
-        Direction Générale des Impôts.
+        <strong>Kanada</strong>: Sisaldab andmekogude
+        GeoBase&reg;, GeoGratis (&copy; Kanada loodusvarade
+        ministeerium), CanVec (&copy; Kanada loodusvarade
+        ministeerium) ja StatCan (Kanada statistikaameti
+        geograafia osakond) andmeid.
+      contributors_fi_html: |-
+        <strong>Soome</strong>: Sisaldab andmeid, mis on pärit
+        Soome riikliku maa-ameti topograafia andmekogust
+        ja teistest andmestikest. Andmed on kasutatavad <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI litsentsi</a> tingimustel.
+      contributors_fr_html: '<strong>Prantsusmaa</strong>: Sisaldab kaardiandmeid,
+        mis on pärit maksuametist (Direction Générale des Impôts).'
       contributors_nl_html: |-
-        <strong>Holland</strong>: Sisaldab &copy; AND data, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        <strong>Holland</strong>: Sisaldab ettevõtte &copy; AND andmeid
+        (2007, <a href="http://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Uus-Meremaa</strong>: Sisaldab kaardiandmeid
-        Land Information New Zealand. Crown Copyright reserved.
+        asutusest Land Information New Zealand. Krooni autoriõigus kaitstud.
       contributors_si_html: |-
         <strong>Sloveenia</strong>: Sisaldab
-        <a href="http://www.gu.gov.si/en/">Maamõõtmis- ja Kartograafiaameti</a> ning
-        <a href="http://www.mkgp.gov.si/en/">Põllu-, Metsa- ja Toidumajandusministeeriumi</a> kaardiandmeid
+        <a href="http://www.gu.gov.si/en/">mõõdistus- ja kaardistusteenistuse</a> ning
+        <a href="http://www.mkgp.gov.si/en/">põllu-, metsa- ja toidumajandusministeeriumi</a> andmeid
         (Sloveenia avalik informatsioon).
       contributors_za_html: |-
         <strong>LAV</strong>: Sisaldab andmeid allikast
         <a href="http://www.ngi.gov.za/">Chief Directorate:
-        National Geo-Spatial Information</a>, Ã\95igused kuuluvad riigile.
+        National Geo-Spatial Information</a>, Ãµigused kuuluvad riigile.
       contributors_gb_html: |-
         <strong>Suurbritannia</strong>: Sisaldab Ordnance
-        Survey andmeid &copy; Crown copyright and database right
-        2010-12.
+        Survey andmeid &copy; krooni autoriõigus ja andmebaasi
+        õigused kaitstud seisuga detsember 2010.
       contributors_footer_1_html: |-
         Täpsemat teavet nendest ja teistest allikatest, mida on kasutatud
-        OpenStreetMapi täiustamiseks võib näha <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">Kaastööliste lehel</a> OpenStreetMapi vikis.
+        OpenStreetMapi täiendamiseks, leiad
+        <a href="http://wiki.openstreetmap.org/wiki/Contributors">kaastööliste leheküljelt</a> OpenStreetMapi vikis.
       contributors_footer_2_html: |-
-        Andmete kaasamisest OpenStreetMapi ei järeldu, et
-        algne andmete pakkuja toetab OpenStreetMapi, pakub mingit garantiid või
+        Andmete kasutamine OpenStreetMapi koosseisus ei tähenda, et
+        algsete andmete pakkuja toetab OpenStreetMapi, pakub mingit tagatist või
         võtab endale mingeid kohustusi.
       infringement_title_html: Autoriõiguste rikkumine
       infringement_1_html: |-
-        OSM kaastöölised peavad meeles pidama, et nad ei tohi kunagi lisada andmeid
-        autoriõigustega kaitstud allikatest (nt Google Maps või trükitud kaardid) kui
-        neil puudub selgesõnaline luba autoriõiguste omanikelt.
+        OSM-i kaastöölistele on öeldud, et nad ei lisaks kunagi andmeid,
+        mis pärinevad autoriõigusega kaitstud allikatest (nt Google Maps või trükikaardid),
+        kui neil puudub autoriõiguse valdaja selgesõnaline luba.
       infringement_2_html: |-
-        Kui sa arvad, et OpenStreetMap andmebaasi või sellele saidile on lisatud sobimatult
-        autoriõigustega kaitstud materjali, siis palun pöördu
-        meie <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">eemaldamise
-        protseduuri</a> poole või otse meie
-        <a href="http://dmca.openstreetmap.org/">onlain lehele</a>.
+        Kui usud, et OpenStreetMapi andmebaasi või sellele saidile on lisatud sobimatult
+        autoriõigusega kaitstud materjali, siis palun juhindu
+        <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">eemaldamise protseduurist</a>
+        või täida <a href="http://dmca.openstreetmap.org/">vastaval leheküljel</a> vorm, et kaebus esitada.
       trademarks_title_html: <span id="trademarks"></span>Kaubamärgid
       trademarks_1_html: OpenStreetMap, suurendusklaasi logo ja State of the Map on
-        OpenStreetMap Sihtasutuse registreeritud kaubamärgid. Kui teil on nende märkide
-        kasutamise kohta küsimusi, siis saatke küsimused <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Litsentsi
-        töörühmale</a>.
+        OpenStreetMap Foundationi registreeritud kaubamärgid. Kui sul on nende märkide
+        kasutamise kohta küsimusi, siis saada küsimused <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">litsentsitöörühmale</a>.
   welcome_page:
     title: Tere tulemast!
     introduction_html: Tere tulemast OpenStreetMappi, vabasse ja muudetavasse maailmakaarti.
@@ -1102,12 +1080,15 @@ et:
       oleks täpne ja ajakohane.
     community_driven_title: Kogukonna põhine
     community_driven_html: |-
-      OpenStreetMapi kogukond on mitmepalgeline, kirglik ja suureneb iga päevaga.
-      Meie kaastöölisteks on innukad kaardistajad, GIS spetsialistid, insenerid, kes hoiavad töös OSM servereid, humanitaarid, kes kaardistavad katastroofipiirkondi,
+      OpenStreetMapi kogukond on laiahaardeline ja entusiastlik ning suureneb iga päevaga.
+      Meie kaastöölisteks on innukad kaardistajad, GIS-spetsialistid, tehnikud, kes
+      hoiavad töös OSM-i servereid, humanitaarabitöötajad, kes kaardistavad õnnetuspiirkondi,
       ja paljud teised.
-      Kogukonnaga tutvumiseks vaata <a href='%{diary_path}'>kasutajate päevikuid</a>,
-      <a href='http://blogs.openstreetmap.org/'>kogukonna blogisid</a> ja
-      <a href='http://www.osmfoundation.org/'>OSM Sihtasutuse</a> veebilehte.
+      Et kogukonnaga tutvuda, vaata
+      <a href='https://blog.openstreetmap.org'>OpenStreetMapi blogi</a>,
+      <a href='%{diary_path}'>kasutajate päevikuid</a>,
+      <a href='http://blogs.openstreetmap.org/'>kogukonnablogisid</a> ja
+      <a href='http://www.osmfoundation.org/'>OSM Foundationi</a> veebisaiti.
     open_data_title: Avatud andmed
     open_data_html: |-
       OpenStreetMap on <i>avatud andmed</i>: sa võid neid vabalt kasutada igal eesmärgil
@@ -1115,11 +1096,13 @@ et:
       või lood midagi nende andmete põhjal, siis võid sa oma tulemust levitada ainult
       sama litsentsi alusel. Täpsemat infot vaata lehelt <a href='%{copyright_path}'>Autoriõigused ja litsents</a>.
     legal_title: Juriidiline teave
-    legal_html: "Seda saiti ja paljusid teisi seotud teenuseid opereerib formaalselt
-      \n<a href='http://osmfoundation.org/'>OpenStreetMap Sihtasutus</a> (OSMF) \nkogukonna
-      nimel.\n<br> \nPalun <a href='http://osmfoundation.org/Contact'>võta ühendust
-      OSMF-ga</a> \nkui sul tekib küsimusi litsentseerimise, autoriõiguste või juriidika
-      osas."
+    legal_html: "Seda saiti ja paljusid teisi seotud teenuseid haldab ametlikult \n<a
+      href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) \nkogukonna
+      nimel. Kõigis OSMF-i hallatavates teenustes kehtivad meie\n<a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">kasutustingimused</a>
+      ja <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">andmekaitsereeglid</a>.\n<br>
+      \nPalun <a href='http://osmfoundation.org/Contact'>võta ühendust OSMF-iga</a>,\nkui
+      sul tekib küsimusi litsentseerimise, autoriõiguste või muude õiguslike probleemide
+      kohta."
     partners_title: Partnerid
   notifier:
     diary_comment_notification:
@@ -1269,7 +1252,7 @@ et:
     no_such_message:
       title: Sellist sõnumit ei ole olemas
       heading: Sellist sõnumit ei ole olemas
-      body: Vabandust kuid sellise id'ga sõnumit ei ole olemas.
+      body: Vabandust, kuid sellise ID-ga sõnum puudub.
     outbox:
       title: Saadetud sõnumid
       my_inbox: '%{inbox_link}'
@@ -1347,7 +1330,7 @@ et:
       get_directions_title: Juhised liikumiseks kahe punkti vahel
       from: Alguspunkt
       to: Sihtpunkt
-      where_am_i: Kus ma asun?
+      where_am_i: Kus see asub?
       where_am_i_title: Määra praegune asukoht otsimootori abil
       submit_text: Otsi
     key:
@@ -1739,12 +1722,12 @@ et:
     no_such_user:
       title: Sellist kasutajat ei ole
       heading: Kasutajat %{user}  pole olemas
-      body: Vabandust kuid kasutajat nimega %{user} pole olemas. Kontrolli sisestatud
-        lingi õigekirja. Võimalik, et link millele sa vajutasid on vigane.
+      body: Vabandust, kuid kasutaja nimega %{user} puudub. Palun kontrolli kirjapilti.
+        Võimalik, et link, millele klõpsasid, on vigane.
     view:
       my diary: Minu päevik
       new diary entry: uus päevikusissekanne
-      my edits: Minu muutmised
+      my edits: Minu muudatused
       my traces: Minu rajaloend
       my notes: Minu märkused
       my messages: Minu sõnumid
@@ -2039,7 +2022,7 @@ et:
       revoke: Tühista!
       confirm: Oled Sa kindel?
       display_name: Blokeeritud kasutaja
-      creator_name: Looja
+      creator_name: Blokeerija
       reason: Blokeerimise põhjus
       status: Olek
       revoker_name: Tühistanud
@@ -2048,8 +2031,9 @@ et:
       next: Järgmine »
       previous: « Eelmine
     helper:
-      time_future: Lõppeb %{time}.
+      time_future: Lõpuni %{time}.
       until_login: Aktiivne kuni kasutaja logib sisse.
+      time_future_and_until_login: Lõpuni %{time} ja kuni kasutaja on sisse loginud.
       time_past: Lõppes %{time} tagasi.
     blocks_on:
       title: Kasutaja %{name} blokeeringud
@@ -2146,11 +2130,12 @@ et:
         standard: Tavakaart
         cycle_map: Rattakaart
         transport_map: Transpordikaart
-        hot: Humanitaar
+        hot: Humanitaarabi
       layers:
         header: Kaardi kihid
         notes: Kaardi märkused
         data: Kaardi andmed
+        gps: Avalikud GPS-rajad
         overlays: Luba kattekihte, et kaarti analüüsida
         title: Kihid
       copyright: © <a href='%{copyright_url}'>OpenStreetMapi kaastöölised</a>
@@ -2163,6 +2148,7 @@ et:
       map_notes_zoom_in_tooltip: Suumi sisse, et näha kaardil märkuseid
       map_data_zoom_in_tooltip: Suumi sisse, et näha kaardi andmeid
       queryfeature_tooltip: Mis siin on?
+      queryfeature_disabled_tooltip: Suurenda, et objektide kohta päring teha
     changesets:
       show:
         comment: Kommenteeri
@@ -2172,11 +2158,12 @@ et:
         unhide_comment: nähtavale
     notes:
       new:
-        intro: Märkasid viga või või midagi, mis vajab täiendamist? Anna sellest teada
-          teistele kaardistajatele, et me võiksime seda parandada. Lohista marker
-          õigele kohale ja kirjuta märkus, et probleemi selgitada. (Palun ära kirjuta
-          siia isiklikku informatsiooni või infot autoriõigustega kaitstud kaartidelt
-          või kataloogide nimekirjast.)
+        intro: Kas märkasid viga või midagi, mis vajab täiendamist? Anna sellest teistele
+          kaardistajatele teada, et nad saaksid seda parandada. Lohista marker õigele
+          kohale ja kirjuta märkus, et probleemi selgitada.
+        advice: Märkus on avalik ja seda võidakse kasutada kaardi uuendamiseks. Seega
+          palun ära kirjuta siia isiklikku teavet ega teavet autoriõigustega kaitstud
+          kaartidelt ega kataloogiloenditest.
         add: Lisa märkus
       show:
         anonymous_warning: Käesolev märkus sisaldab kommentaare anonüümsetelt kasutajatelt,
@@ -2196,8 +2183,6 @@ et:
         mapquest_car: Autoga (MapQuest)
         mapquest_foot: Jalgsi (MapQuest)
         osrm_car: Autoga (OSRM)
-        mapzen_car: Autoga (Mapzen)
-        mapzen_foot: Jalgsi (Mapzen)
       directions: Juhised
       distance: Vahemaa
       errors:
index bdc49a377e636d71ca208418c40da85e5e7357bc..339d1fd3d65f177a51ad0cd25a0e7bbf55d66354 100644 (file)
@@ -141,6 +141,8 @@ eu:
         title_comment: '%{id} - %{comment} aldaketak'
       join_discussion: Hasi saioa eztabaidan parte hartzeko
       discussion: Eztabaida
+      still_open: Aldaketak oraindik zabalik - eztabaida aldaketak itxi ondoren irekiko
+        da.
     node:
       title: 'Nodoa: %{name}'
       history_title: 'Nodoaren historia: %{name}'
@@ -451,33 +453,26 @@ eu:
           crematorium: Erraustegia
           dentist: Dentista
           doctors: Medikuak
-          dormitory: Ikasle egoitza
           drinking_water: Edateko ura
           driving_school: Autoeskola
           embassy: Enbaxada
-          emergency_phone: Larrialdi Telefonoa
           fast_food: Janari Azkarra
           ferry_terminal: Ferry Terminala
-          fire_hydrant: Suteetako ur-hartunea
           fire_station: Suhiltzaile Egoitza
           food_court: Jatetxe-eremua
           fountain: Iturria
           fuel: Gasolindegia
           gambling: Jokoak
           grave_yard: Hilerria
-          gym: Fitness Zentroa / Gimnasioa
-          health_centre: Osasun Zentroa
           hospital: Ospitalea
           hunting_stand: Ehiza postua
           ice_cream: Izozkiak
           kindergarten: Haurtzaindegia
           library: Liburutegia
-          market: Merkatu
           marketplace: Merkatua
           monastery: Monastegia
           motorcycle_parking: Motorrentzako aparkalekua
           nightclub: Gau-kluba
-          nursery: Haurtzaindegia
           nursing_home: Zaharren egoitza
           office: Bulegoa
           parking: Aparkalekua
@@ -491,7 +486,6 @@ eu:
           prison: Espetxea
           pub: Pub-a
           public_building: Eraikin publiko
-          reception_area: Harrera lekua
           recycling: Birziklatze gune
           restaurant: Jatetxea
           retirement_home: Nagusien etxea
@@ -587,7 +581,6 @@ eu:
           trunk: Errepide nagusia
           trunk_link: Errepide nagusia
           unclassified: Sailkatu gabeko errepidea
-          unsurfaced: Asfaltatu gabeko errepidea
           "yes": Errepidea
         historic:
           archaeological_site: Aztarnategi arkeologikoa
@@ -652,7 +645,6 @@ eu:
         leisure:
           beach_resort: Hondartza Konplexua
           bird_hide: Hegazti Aterpea
-          club: Kluba
           common: Lur Komunak
           dog_park: Txakurrentzako Parkea
           fishing: Arrantza Lekua
@@ -745,8 +737,6 @@ eu:
           "yes": Bulegoa
         place:
           allotments: Alokatutako baratzeak
-          block: Blokea
-          airport: Aireportua
           city: Hiria
           country: Herrialdea
           county: Konderria
@@ -758,7 +748,6 @@ eu:
           islet: Uhartea
           isolated_dwelling: Etxebizitza isolatua
           locality: Lokalitatea
-          moor: Mortua
           municipality: Udalerria
           neighbourhood: Auzoa
           postcode: Posta-kodea
@@ -775,10 +764,8 @@ eu:
           abandoned: Abandonatutako Trenbidea
           construction: Eraikitze-lanetan dagoen trenbidea
           disused: Erabili gabeko trenbidea
-          disused_station: Erabili gabeko tren geltokia
           funicular: Funikularra
           halt: Tren Geralekua
-          historic_station: Tren Geltoki Historikoa
           junction: Trenbide lotunea
           level_crossing: Trenbide-pasagunea
           light_rail: Tren arina
@@ -842,7 +829,6 @@ eu:
           hairdresser: Ileapaindegia
           hardware: Hardware-denda
           hifi: Hi-Fi
-          insurance: Aseguruak
           jewelry: Bitxi-denda
           kiosk: Kioskoa
           laundry: Garbitegia
@@ -858,10 +844,8 @@ eu:
           pet: Animalia-denda
           pharmacy: Farmazia
           photo: Argazki-denda
-          salon: Apaindegia
           second_hand: Bigarren eskuko denda
           shoes: Zapatadenda
-          shopping_centre: Merkataritza-gunea
           sports: Kirol denda
           stationery: Paper-denda
           supermarket: Supermerkatua
@@ -1211,13 +1195,14 @@ eu:
       aireko irudiak erabiltzen dituzte, GPS gailuak eta teknologia baxuko eremuko
       mapak OSMrako egiaztapen zehatza eta eguneratua egiteko.
     community_driven_title: Komunitatearen Ahotsa
-    community_driven_html: "OpenStreetMap komunitatea anitza, sutsua eta egunero hazten
-      den mugimendua da.\nGure laguntzaileen artean, mapa zaleak, GIS profesionalek,
-      \nOSM zerbitzariak exekutatzen dituzten ingeniariak, hondamendia kaltetutako
-      eremuak mapatzen dituztenek,\neta askoz gehiagok osatzen dute.\nKomunitateari
-      buruz gehiago jakiteko, ikusi <a href='%{diary_path}'> erabiltzaileen egunkariak
-      </a>,\n<a href='http://blogs.openstreetmap.org/'> komunitatearen blogak </a>,
-      eta\n<a href='http://www.osmfoundation.org/'> OSM Fundazio </a> webgunea."
+    community_driven_html: "OpenStreetMap komunitatea anitza eta sutsua da, egunero
+      haziz doa.\nGure laguntzaileen artean daude, mapazaleak, GIS arloko profesionalak,
+      \nOSM zerbitzariak exekutatzen dituzten ingeniariak, hondamendiek kaltetutako
+      eremuak mapatzen dituzten boluntarioak,\neta askoz gehiagok.\nKomunitateari
+      buruz gehiago jakiteko, ikus <a href='https://blog.openstreetmap.org'>OpenStreetMap
+      bloga</a>,\n<a href='%{diary_path}'>erabiltzaileen egunerokoak</a>,\n<a href='http://blogs.openstreetmap.org/'>komunitate
+      blogak</a> eta <a href='http://www.osmfoundation.org/'>OSM Fundazioaren</a>
+      webgunea."
     open_data_title: Datu Irekiak
     open_data_html: |-
       OpenStreetMap <i> datu irekiak </i> ditu: edozein gauzarako erabil dezakezu betiere OpenStreetMap-ek eta bere kolaboratzaileek aipatzen badituzu. Moduren batean datuen gainean edukia eraikiz, emaitza bakarrik banatu ahal izango duzu lizentzia beraren azpian. Ikusi <a href='%{copyright_path}'> Copyright eta
@@ -2128,6 +2113,8 @@ eu:
       not_a_role: '''%{role}'' katea ez da baliozko rola.'
       already_has_role: Erabiltzaileak %{role} rola dauka jadanik.
       doesnt_have_role: Erabiltzaileak ez dauka %{role} rolik.
+      not_revoke_admin_current_user: Ezin da administratzaile rola uneko erabiltzaileari
+        errebokatu.
     grant:
       title: Berretsi eginkizuna ematea
       heading: Berretsi eginkizuna ematea
@@ -2347,10 +2334,12 @@ eu:
         unhide_comment: erakutsi
     notes:
       new:
-        intro: Akats bat edo zerbait falta zaizu? Utzi beste mapa editatzaileek jakin
-          dezaten, beraz konpon dezakegun. Mugitu markatzailea posizio egokira eta
-          idatzi ohar bat arazoa azaltzeko. (Mesedez, ez sartu informazio pertsonala
-          edo informazioa copyrighteko mapa edo direktorioa zerrendetatik.)
+        intro: Akats bat edo zerbait falta zaizula ikusi duzu? Utzi beste mapa editatzaileek
+          jakin dezaten, beraz konpon dezakegun. Mugitu markatzailea posizio egokira
+          eta idatzi ohar bat arazoa azaltzeko.
+        advice: "Zure oharra publikoa da eta mapa eguneratzeko erabili daiteke. Horregatik,
+          ez sartu informazio pertsonala edo \ncopyright-dun mapei edo direktorio
+          zerrendei buruzko informaziorik."
         add: Gehitu oharra
       show:
         anonymous_warning: Ohar honek independenteak izan behar diren erabiltzaile
@@ -2372,9 +2361,6 @@ eu:
         mapquest_car: Autoz (MapQuest)
         mapquest_foot: Oinez (MapQuest)
         osrm_car: Autoz (OSRM)
-        mapzen_bicycle: Bizikletaz (Mapzen)
-        mapzen_car: Autoz (Mapzen)
-        mapzen_foot: Oinez (Mapzen)
       descend: Jaitsi
       directions: Norabideak
       distance: Distantzia
index 45891c42488d743b800f90b1d4c49531de0cf227..5d1dc3ec31ea18fd24780c3cd809931332956616 100644 (file)
@@ -460,33 +460,26 @@ fa:
           crematorium: کوره
           dentist: دندانپزشکی
           doctors: پزشکان
-          dormitory: خوابگاه
           drinking_water: آب آشامیدنی
           driving_school: آموزشگاه رانندگی
           embassy: سفارت
-          emergency_phone: تلفن اضطراری
           fast_food: غذای آماده
           ferry_terminal: پایانه کشتی
-          fire_hydrant: شیر آتش‌نشانی
           fire_station: آتش‌نشانی
           food_court: پذيرايي
           fountain: چشمه
           fuel: پمپ بنزین
           gambling: قمار
           grave_yard: محوطهٔ گورستان
-          gym: مرکز تناسب اندام / ورزشگاه
-          health_centre: مركز بهداشت
           hospital: بیمارستان
           hunting_stand: شکارگاه
           ice_cream: بستنی فروشی
           kindergarten: کودکستان
           library: کتابخانه
-          market: بازار
           marketplace: بازار
           monastery: صومعه
           motorcycle_parking: پارکینگ موتور سیکلت
           nightclub: باشگاه شبانه
-          nursery: شیر خوارگاه
           nursing_home: خانه سالمندان
           office: دفتر
           parking: پارکینگ
@@ -500,7 +493,6 @@ fa:
           prison: زندان
           pub: میخانه
           public_building: ساختمان عمومی
-          reception_area: محوطه پذیرش
           recycling: نقطه بازیافت
           restaurant: رستوران
           retirement_home: خانه ی بازنشستگی
@@ -596,7 +588,6 @@ fa:
           trunk: بزرگراه
           trunk_link: بزرگراه
           unclassified: جادهٔ طبقه‌بندی‌نشده
-          unsurfaced: جاده ظاهر نشده
           "yes": جاده
         historic:
           archaeological_site: پایگاه باستان‌شناسی
@@ -661,7 +652,6 @@ fa:
         leisure:
           beach_resort: تفریحگاه ساحلی
           bird_hide: محل مشاهده ی پرندگان
-          club: کلوپ
           common: سرزمین مشترک
           dog_park: پارک سگ
           fishing: منطقهٔ ماهی‌گیری
@@ -754,8 +744,6 @@ fa:
           "yes": دفتر
         place:
           allotments: سهم
-          block: بستن
-          airport: فرودگاه
           city: شهر بزرگ
           country: کشور
           county: شهرستان
@@ -767,7 +755,6 @@ fa:
           islet: جزیره کوچک
           isolated_dwelling: خانه پیش ساخته
           locality: محل
-          moor: دشت
           municipality: شهرداری
           neighbourhood: محله
           postcode: کدپستی
@@ -784,10 +771,8 @@ fa:
           abandoned: راه‌آهن رهاشده
           construction: راه‌آهن در دست ساخت
           disused: راه‌آهن منسوخ
-          disused_station: ایستگاه منسوخ راه‌آهن
           funicular: راه‌آهن کابلی
           halt: ایستگاه قطار
-          historic_station: ایستگاه تاریخی راه‌آهن
           junction: اتصال راه‌آهن
           level_crossing: محل تقاطع دو خط راه‌آهن
           light_rail: ریل سبک
@@ -851,7 +836,6 @@ fa:
           hairdresser: سلمانی
           hardware: فروشگاه سخت افزار
           hifi: Hi-Fi
-          insurance: بیمه
           jewelry: فروشگاه طلا و جواهر
           kiosk: فروشگاه کیوسک
           laundry: خشکشویی
@@ -867,10 +851,8 @@ fa:
           pet: فروشگاه حیوانات خانگی
           pharmacy: داروخانه
           photo: فروشگاه عکس
-          salon: سالن زیبایی
           second_hand: سمساری
           shoes: فروشگاه کفش
-          shopping_centre: مرکز خرید
           sports: فروشگاه ورزشی
           stationery: فروشگاه لوازم التحریر
           supermarket: سوپرمارکت
@@ -2345,9 +2327,6 @@ fa:
         mapquest_car: اتومبیل (MapQuest)
         mapquest_foot: پیاده (MapQuest)
         osrm_car: اتومبیل (OSRM)
-        mapzen_bicycle: دوچرخه (Mapzen)
-        mapzen_car: ماشین (Mapzen)
-        mapzen_foot: پیاده (Mapzen)
       directions: جهت
       distance: مسافت
       errors:
index 9fd18408b682d08bae6ac447f667b704d4f7dc7e..ccfc3c16ee07122c0e5c51cd6a1d8bd0e64309c5 100644 (file)
@@ -161,6 +161,8 @@ fi:
         title_comment: Muutoskokoelma %{id} - %{comment}
       join_discussion: Kirjaudu sisään, jos haluat osallistua keskusteluun
       discussion: Keskustelu
+      still_open: Muutoskokoelma on edelleen avoimena - keskustelu avataan heti kun
+        muutoskokoelma on suljettu.
     node:
       title: 'Piste: %{name}'
       history_title: Pisteen %{name} historia
@@ -373,7 +375,7 @@ fi:
       map_image: Karttakuva (näyttää standarditason)
       embeddable_html: HTML-koodi
       licence: Lisenssi
-      export_details: OpenStreetMap-karttatietoja saa käyttää <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: OpenStreetMap-karttatietoja saa käyttää <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL) (engl.) ehdoilla.
       too_large:
         advice: 'Jos vientitoiminto ei toimi, kokeile myös seuraavia palveluja:'
@@ -412,14 +414,14 @@ fi:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">Sisäiset</a> tulokset
+        latlon: <a href="https://openstreetmap.org/">Sisäiset</a> tulokset
         uk_postcode: Tulokset palvelusta <a href="http://www.npemap.org.uk/">NPEMap
           / FreeThe Postcode</a>
-        ca_postcode: Tulokset palvelusta <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Tulokset <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Tulokset palvelusta <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Tulokset <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatimista</a>
         geonames: Tulokset palvelusta <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Hakutulokset <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Hakutulokset <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatimista</a>
         geonames_reverse: Hakutulokset <a href="http://www.geonames.org/">GeoNamesista</a>
     search_osm_nominatim:
@@ -432,6 +434,7 @@ fi:
           station: Ilmarata-asema
         aeroway:
           aerodrome: Lentokenttä
+          airstrip: Kiitorata
           apron: Asemataso
           gate: Portti
           helipad: Helikopterikenttä
@@ -469,33 +472,26 @@ fi:
           crematorium: Krematorio
           dentist: Hammaslääkäri
           doctors: Lääkäreitä
-          dormitory: Asuntola
           drinking_water: Juomavesi
           driving_school: Autokoulu
           embassy: Lähetystö
-          emergency_phone: Hätäpuhelin
           fast_food: Pikaruokaravintola
           ferry_terminal: Lauttaterminaali
-          fire_hydrant: Paloposti
           fire_station: Paloasema
           food_court: Elintarviketori
           fountain: Lähde
           fuel: Polttoaine
           gambling: Uhkapelaus
           grave_yard: Hautausmaa
-          gym: Liikuntakeskus / kuntosali
-          health_centre: Terveyskeskus
           hospital: Sairaala
           hunting_stand: Metsästyslava
           ice_cream: Jäätelö
           kindergarten: Päiväkoti
           library: Kirjasto
-          market: Tori
           marketplace: Tori
           monastery: Luostari
           motorcycle_parking: Moottoripyöräpysäköinti
           nightclub: Yökerho
-          nursery: Päiväkoti
           nursing_home: Hoitokoti
           office: Toimisto
           parking: Parkkipaikka
@@ -509,7 +505,6 @@ fi:
           prison: Vankila
           pub: Pubi
           public_building: Julkinen rakennus
-          reception_area: Vastaanottoalue
           recycling: Kierrätyspaikka
           restaurant: Ravintola
           retirement_home: Vanhainkoti
@@ -605,7 +600,6 @@ fi:
           trunk: Valtatie
           trunk_link: Valtatie
           unclassified: Luokittelematon tie
-          unsurfaced: Päällystämätön tie
           "yes": Tie
         historic:
           archaeological_site: Arkeologinen kohde
@@ -670,7 +664,6 @@ fi:
         leisure:
           beach_resort: Rantakohde
           bird_hide: Linnunpesä
-          club: Klubi
           common: Yhteinen maa
           dog_park: Koirapuisto
           fishing: Kalastusalue
@@ -697,9 +690,17 @@ fi:
           water_park: Vesipuisto
           "yes": Vapaa-aika
         man_made:
+          bridge: Silta
+          bunker_silo: Bunkkeri
+          dyke: Pato
+          flagpole: Lipputanko
+          gasometer: Kaasusäiliö
           lighthouse: Majakka
+          mast: Masto
           pipeline: Putkisto
+          silo: Siilo
           tower: Torni
+          water_tower: Vesitorni
           works: Tehdas
           "yes": ihmisen tekemä
         military:
@@ -763,8 +764,6 @@ fi:
           "yes": Toimisto
         place:
           allotments: Siirtolapuutarha
-          block: Este
-          airport: Lentokenttä
           city: Kaupunki
           country: Maa
           county: Piirikunta
@@ -776,7 +775,6 @@ fi:
           islet: Saareke
           isolated_dwelling: Erakkomaja
           locality: Paikkakunta
-          moor: Nummi
           municipality: Kunta
           neighbourhood: Naapurusto
           postcode: Postinumero
@@ -793,10 +791,8 @@ fi:
           abandoned: Hylätty rautatie
           construction: Rakenteilla oleva rautatie
           disused: Käyttämätön rautatie
-          disused_station: Käytöstä poistunut rautatieasema
           funicular: Funikulaari
           halt: Seisake
-          historic_station: Historiallinen juna-asema
           junction: Rautatien risteys
           level_crossing: Tasoristeys
           light_rail: Pikaraitiotie
@@ -860,7 +856,6 @@ fi:
           hairdresser: Kampaamo
           hardware: Rautakauppa
           hifi: Elektroniikkakauppa
-          insurance: Vakuutus
           jewelry: Korukauppa
           kiosk: Kioski
           laundry: Pesula
@@ -876,18 +871,17 @@ fi:
           pet: Eläinkauppa
           pharmacy: Apteekki
           photo: Valokuvausliike
-          salon: Salonki
           second_hand: Osto- ja myyntiliike
           shoes: Kenkäkauppa
-          shopping_centre: Ostoskeskus
           sports: Urheilukauppa
           stationery: Paperikauppa
           supermarket: Supermarketti
           tailor: Räätäli
           toys: Lelukauppa
           travel_agency: Matkatoimisto
+          tyres: Rengaskauppa
           video: Videokauppa
-          wine: Alkoholikauppa
+          wine: Viinikauppa
           "yes": Kauppa
         tourism:
           alpine_hut: Alppimaja
@@ -942,7 +936,7 @@ fi:
         level10: Asuinalueen raja
     description:
       title:
-        osm_nominatim: Sijainti <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Sijainti <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatimista</a>
         geonames: Sijainti palvelusta <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1016,16 +1010,16 @@ fi:
     legal_babble:
       title_html: Tekijänoikeus ja lisenssi
       intro_1_html: |-
-        OpenStreetMap on <i>avointa dataa</i>, jonka <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) on lisensoinut <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database -lisenssillä</a> (ODbL).
+        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> on <i>avointa dataa</i>, jonka <a
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) on lisensoinut <a
+        href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database -lisenssillä</a> (ODbL).
       intro_2_html: "OpenStreetMapin karttoja ja tietoja voi kopioida, levittää, välittää
         ja mukauttaa, \nkunhan OpenStreetMap ja sen tekijät mainitaan. Jos karttoja
         tai tietoja muutetaan tai kehitetään, niitä saa levittää vain samalla lisenssillä.\n<a
-        href=\"http://opendatacommons.org/licenses/odbl/1.0/\">Lakitekstissä</a> mainitaan
-        levittäjän oikeudet ja velvollisuudet."
+        href=\"https://opendatacommons.org/licenses/odbl/1.0/\">Lakitekstissä</a>
+        mainitaan levittäjän oikeudet ja velvollisuudet."
       intro_3_html: |-
-        Kartta-aineisto ja dokumentaatio on lisensoitu <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.fi">Creative
+        Kartta-aineisto ja dokumentaatio on lisensoitu <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.fi">Creative
         Commons Nimeä-Jaa samoin 2.0</a> -lisenssillä (CC-BY-SA).
       credit_title_html: OpenStreetMapin mainitseminen
       credit_1_html: OpenStreetMapin sisältöä levitettäessä on mainittava teksti &quot;&copy;
@@ -1033,7 +1027,7 @@ fi:
         OpenStreetMap contributors&quot;.
       credit_2_html: "Levittäjän tulee tehdä selväksi, että aineisto on saatavilla
         Open Database Lisenssillä\nja kartta-aineiston olevan lisensoitu CC-BY-SA-lisenssillä.
-        Tämä voidaan tehdä sijoittamalla sivulle linkki\n<a href=\"http://www.openstreetmap.org/copyright\">tälle
+        Tämä voidaan tehdä sijoittamalla sivulle linkki\n<a href=\"https://www.openstreetmap.org/copyright\">tälle
         tekijänoikeussivulle</a>. \nJos linkkien käyttö ei ole mahdollista (esimerkiksi
         paperille tulostettu aineisto),\nsuosittelemme ohjaamaan lukijat osoitteisiin
         www.openstreetmap.org, opendatacommons.org ja tarvittaessa myös creativecommons.org."
@@ -1044,7 +1038,7 @@ fi:
       more_title_html: Lisätietoja
       more_1_html: |-
         Lue lisää aineiston käyttämisestä ja tekijöiden mainitsemisesta <a
-        href="http://osmfoundation.org/Licence">OSM-säätiön lisensointiohjeesta</a>.
+        href="https://osmfoundation.org/Licence">OSM-säätiön lisensointiohjeesta</a>.
       more_2_html: "Vaikka OpenStreetMap on avointa dataa, emme voi tarjota maksutonta
         karttarajapintaa (API) kolmannen osapuolen kehittäjille.\n\nTutustu <a href=\"https://operations.osmfoundation.org/policies/api/\">karttarajapinnan
         käyttöehtoihin</a>,\n<a href=\"https://operations.osmfoundation.org/policies/tiles/\">kartta-aineiston
@@ -1057,9 +1051,9 @@ fi:
         ja muista lähteistä, muun muassa:
       contributors_at_html: |-
         <strong>Itävalta</strong>: Sisältää karttatietoja
-        <a href="http://data.wien.gv.at/">Stadt Wienistä</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY -lisenssillä</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlbergista</a> ja
-        Land Tirolista (<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT -lisenssillä tietyin muutoksin</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wienistä</a> (<a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY -lisenssillä</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlbergista</a> ja
+        Land Tirolista (<a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT -lisenssillä tietyin muutoksin</a>).
       contributors_ca_html: |-
         <strong>Kanada</strong>: Sisältää karttatietoja
            GeoBasesta ®, GeoGratisista (© Department of Natural
@@ -1067,14 +1061,14 @@ fi:
            Resources Canada), ja StatCanista (Geography Division,
            Statistics Canada).
       contributors_fi_html: '<strong>Suomi</strong>: Sisältää karttatietoja Maanmittauslaitoksen
-        maastotietokannasta ja muista lähteistä <a href="http://www.maanmittauslaitos.fi/avoindata_lisenssi_versio1_20120501">Maanmittauslaitoksen
+        maastotietokannasta ja muista lähteistä <a href="https://www.maanmittauslaitos.fi/avoindata_lisenssi_versio1_20120501">Maanmittauslaitoksen
         lisenssin</a> mukaisesti.'
       contributors_fr_html: |-
         <strong>Ranska</strong>: Sisältää karttatietoja
            Direction Générale des Impôtsista.
       contributors_nl_html: |-
         <strong>Alankomaat</strong>: Sisältää &copy; AND-karttatietoja vuodelta 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: '<strong>Uusi-Seelanti</strong>: Sisältää karttatietoja
         Land Information New Zealandista. Crown Copyright.'
       contributors_si_html: "<strong>Slovenia</strong>: Sisältää \n<a href=\"http://www.gu.gov.si/en/\">Maanmittaus-
@@ -1090,7 +1084,7 @@ fi:
         keräämiä karttatietoja © Crown Copyright ja tietokantojen käyttöoikeuden joulukuulta 2010.
       contributors_footer_1_html: |-
         Täydellinen lista OpenStreetMapin tukijoista löytyy OpenStreetMapin wikistä <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">Avustajat-sivulta</a>.
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Avustajat-sivulta</a>.
       contributors_footer_2_html: |-
         Tietojen sisältyminen OpenStreetMapiin ei tarkoita, että tietojen antaja
         ottaa kantaa OpenStreetMapiin tai vastuuta tietojen oikeellisuudesta.
@@ -1100,11 +1094,11 @@ fi:
         (esimerkiksi Google Mapsista tai paperikartoista) ilman tekijänoikeuden haltijan nimenomaista lupaa on kielletty.
       infringement_2_html: Jos kuka tahansa OpenStreetMapin käyttäjä epäilee, että
         karttatietoja on otettu luvattomasta lähteestä OSM:n karttatietoihin tai sivustolle,
-        siitä tulee tehdä <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">poistopyyntö</a>
-        tai <a href="http://dmca.openstreetmap.org/">ilmoittaa suoraan</a>.
+        siitä tulee tehdä <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">poistopyyntö</a>
+        tai <a href="https://dmca.openstreetmap.org/">ilmoittaa suoraan</a>.
       trademarks_title_html: <span id="trademarks"></span>Tavaramerkit
       trademarks_1_html: OpenStreetMap, suurennuslasilogo ja maailmankartta ovat OpenStreetMap-säätiön
-        rekisteröityjä tavaramerkkejä. <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lisensointiryhmämme
+        rekisteröityjä tavaramerkkejä. <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lisensointiryhmämme
         (englanniksi)</a> vastaa mielellään kysymyksiin tavaramerkkien käytöstä.
   welcome_page:
     title: Tervetuloa!
@@ -1138,8 +1132,8 @@ fi:
       title: Pelisäännöt
       paragraph_1_html: "OpenStreetMapilla on joitakin muodollisia säännöksiä, mutta
         oletamme kaikkien käyttäjien tekevän yhteistyötä muiden kanssa. Jos harkitset
-        muita toimintoja kuin perusmuokkausta, lue ohje  <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>tietojen
-        tuonnista</a> ja \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automaattisista
+        muita toimintoja kuin perusmuokkausta, lue ohje  <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>tietojen
+        tuonnista</a> ja \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>automaattisista
         muokkauksista</a>."
     questions:
       title: Kysyttävää?
@@ -1173,7 +1167,7 @@ fi:
       title: Muut huolenaiheet
       explanation_html: Jos sinulla on huolia siitä miten meidän tietoamme käytetään
         tai huolia sisällöstä, katso neuvoa <a href='/copyright'>copyright-sivultamme</a>
-        saadaksesi lisätietoa, tai ota yhteyttä sopivaan<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-työryhmään</a>.
+        saadaksesi lisätietoa, tai ota yhteyttä sopivaan<a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-työryhmään</a>.
   help_page:
     title: Ohjekeskus
     introduction: Ohjeita ja vinkkejä OpenStreetMapin käyttöön on saatavilla useista
@@ -1183,7 +1177,7 @@ fi:
       title: Tervetuloa OpenStreetMapiin
       description: Opi OpenStreetMapin perusteet tällä helpolla aloitusoppaalla.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Fi:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Fi:Beginners%27_guide
       title: Aloitusopas
       description: Yhteisön ylläpitämä opas aloittelijoille.
     help:
@@ -1207,7 +1201,7 @@ fi:
       description: Auta yrityksiä ja organisaatioita vaihtamaan OpenStreetMapiin pohjautuviin
         karttoihin ja muihin palveluihin.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/Fi:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/Fi:Main_Page
       title: wiki.openstreetmap.org
       description: Tutustu syvällisemmin OpenStreetMapiin wikikirjastossa. Osittain
         englanninkielinen.
@@ -1226,19 +1220,19 @@ fi:
     community_driven_title: Yhteisön voima
     community_driven_html: |-
       OpenStreetMap-yhteisö on monipuolinen, intohimoinen ja kasvaa joka päivä. Yhteisöön kuuluu harrastajakartoittajia, GIS-ammattilaisia, järjestelmää ylläpitäviä insinöörejä, humanitaarisia auttajia, jotka kartoittavat katastrofin kärsineitä alueita sekä monia muita. Lisätietoja yhteisöstä saa lukemalla <a href='https://blog.openstreetmap.org'>OpenStreetMap-blogia</a>, <a href='%{diary_path}'>käyttäjien päiväkirjoja</a>,
-      <a href='http://blogs.openstreetmap.org/'>yhteisöblogeja</a> ja
-      <a href='http://www.osmfoundation.org/'>OSM-säätiön</a> verkkosivua.
+      <a href='https://blogs.openstreetmap.org/'>yhteisöblogeja</a> ja
+      <a href='https://www.osmfoundation.org/'>OSM-säätiön</a> verkkosivua.
     open_data_title: Avoin data
     open_data_html: 'OpenStreetMap on <i>avointa dataa</i>: palvelua saa käyttää vapaasti
       mihin tahansa, kunhan OpenStreetMap tekijöineen mainitaan. Jos palvelua kehitetään
       tai muuunnellaan, sitä saa levittää eteenpäin vain samalla lisenssillä. Lisätietoja
       on <a href=''%{copyright_path}''>Tekijänoikeus ja lisenssi</a> -sivulla.'
     legal_title: Lakitekninen jako
-    legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='http://osmfoundation.org/'>OpenStreetMap-säätiön</a>
+    legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='https://osmfoundation.org/'>OpenStreetMap-säätiön</a>
       (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön
-      sovelletaan <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nhyväksytyn
-      käytön käytäntöjä</a> ja <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a>
-      (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='http://osmfoundation.org/Contact'>Ota
+      sovelletaan <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nhyväksytyn
+      käytön käytäntöjä</a> ja <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a>
+      (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='https://osmfoundation.org/Contact'>Ota
       yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä kysymyksissä."
     partners_title: Kumppanit
   notifier:
@@ -1346,6 +1340,8 @@ fi:
           muutoskokoelmaa'
         your_changeset: '%{commenter} on jättänyt kommentin yhteen muutoskokoelmistasi
           joka on luotu %{time}'
+        commented_changeset: '%{commenter} on jättänyt kommentin kartan muutoskokoelmaan
+          jota katselet jonka on luonut %{changeset_author} %{time}'
         partial_changeset_with_comment: kommentin kanssa '%{changeset_comment}'
         partial_changeset_without_comment: ei kommenttia
       details: 'Lisätietoja muutoskokoelmasta: %{url}'
@@ -1444,12 +1440,12 @@ fi:
       anon_edits_link_text: Perustelut (englanniksi) julkisuusvaatimukselle.
       flash_player_required: Potlatch-karttamuokkausohjelman käyttö edellyttää Flash
         Player -lisäosan asentamista. Lataa Flash Player sitä ylläpitävän <a href="http://get.adobe.com/flashplayer/">Adoben
-        verkkosivuilta</a>. Karttaa voi muokata myös <a href="http://wiki.openstreetmap.org/wiki/Fi:Editing">muilla
+        verkkosivuilta</a>. Karttaa voi muokata myös <a href="https://wiki.openstreetmap.org/wiki/Fi:Editing">muilla
         ohjelmistoilla</a>.
       potlatch_unsaved_changes: Tallentamattomia muutoksia. Tallenna muutokset Potlatchissa
         poistamalla valinta nykyiseltä karttakohteelta tai napsauta Tallenna-painiketta,
         jos sellainen on käytössä.
-      potlatch2_not_configured: Potlatch 2 ei ole määritetty - Katso lisätietoja http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2 ei ole määritetty - Katso lisätietoja https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
       potlatch2_unsaved_changes: Karttaan on tehty tallentamattomia muutoksia. Tallenna
         muokkaukset Potlatch 2:ssa napsauttamalla Tallenna-painiketta.
       id_not_configured: iD-ohjelmaa ei ole asetettu
@@ -1541,7 +1537,7 @@ fi:
       edit: Muokkaa
       preview: Esikatselu
     markdown_help:
-      title_html: Jäsennä <a href="http://daringfireball.net/projects/markdown/">Wikitekstinä</a>
+      title_html: Jäsennä <a href="https://daringfireball.net/projects/markdown/">Wikitekstinä</a>
       headings: Otsikot
       heading: Otsikko
       subheading: Alaotsikko
@@ -1656,7 +1652,7 @@ fi:
       description: Selaa juuri lähetettyjä GPS-jälkiä
       tagged_with: ', joilla on tagi %{tags}'
       empty_html: Sivu on tyhjä. <a href='%{upload_link}'>Lähetä uusi GPS-jälki</a>
-        tai lue lisätietoja GPS-jälkien keräämisestä <a href='http://wiki.openstreetmap.org/wiki/Fi:Beginners_Guide_1.2'>wikisivulta</a>.
+        tai lue lisätietoja GPS-jälkien keräämisestä <a href='https://wiki.openstreetmap.org/wiki/Fi:Beginners_Guide_1.2'>wikisivulta</a>.
     delete:
       scheduled_for_deletion: Jälki on poistojonossa.
     make_public:
@@ -1711,6 +1707,8 @@ fi:
       invalid: Lupamerkki ei kelpaa.
     revoke:
       flash: Olet poistanut sovelluksen %{application} käyttöoikeudet
+    permissions:
+      missing: Et ole sallinut sovelluksen käyttöoikeutta tähän palveluun
   oauth_clients:
     new:
       title: Rekisteröi uusi sovellus
@@ -1857,10 +1855,10 @@ fi:
         html: |-
           <p>Toisin kuin muut karttapalvelut, OpenStreetMap on täysin yhteisön eli vapaaehtoisten ihmisten luoma. Palvelun käyttö ja muokkaaminen on täysin ilmaista ja vapaata.</p>
           <p>Aloita kartan kehittäminen rekisteröitymällä. Tämän jälkeen vahvista käyttäjätunnus napsauttamalla linkkiä sähköpostitse lähetettävässä aktivointiviestissä.</p>
-      license_agreement: Kun vahvistat tilisi, sinun on sitouduttava <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">osallistumisehtoihin</a>.
+      license_agreement: Kun vahvistat tilisi, sinun on sitouduttava <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">osallistumisehtoihin</a>.
       email address: 'Sähköpostiosoite:'
       confirm email address: 'Sähköpostiosoite uudelleen:'
-      not displayed publicly: Osoitettasi ei esitetä julkisesti. Lisätietoja <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
+      not displayed publicly: Osoitettasi ei esitetä julkisesti. Lisätietoja <a href="https://wiki.openstreetmap.org/wiki/Privacy_Policy"
         title="tietosuojakäytäntö wikisivulla, ml. osio sähköpostiosoitteiden käsittelystä">tietosuojakäytännöstä</a>
         on saatavilla englanniksi.
       display name: 'Käyttäjätunnus:'
@@ -1979,12 +1977,12 @@ fi:
       email never displayed publicly: (ei näy muille)
       external auth: 'Kolmannen osapuolen tunnukset kirjautuessa:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/Fi:OpenID
+        link: https://wiki.openstreetmap.org/wiki/Fi:OpenID
         link text: Mitä tämä tarkoittaa?
       public editing:
         heading: 'Muokkaukset julkisia:'
         enabled: Kyllä. Karttatietojen muokkaus sallittu.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Mitä tämä tarkoittaa?
         disabled: Ei. Karttatietojen muokkaus estetty. Aiemmat karttamuutokset anonyymejä.
         disabled link text: Miksen voi enää muokata karttaa?
@@ -1994,10 +1992,10 @@ fi:
           sinulle viestejä tai nähdä sijaintiasi. Nähdääksesi mitä olet muokannut
           ja salliaksesi ihmisten lähettää sinulle viestejä nettisivun kautta, napsauta
           alla olevaa painiketta. <b>0.6 API versioon siirtymisen jälkeen vain yleiset
-          käyttäjät voivat muokata kartan dataa.</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Katso
+          käyttäjät voivat muokata kartan dataa.</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">Katso
           täältä miksi</a>).<ul><li>Sähköpostiosoitettasi ei saateta julkiseen tietoon.</li><li>Tätä
           toimintoa ei voi perua ja kaikki uudet käyttäjät ovat automaattisesti julkisia.<a
-          href="http://wiki.openstreetmap.org/wiki/Anonymous_edits"></a></li></ul>
+          href="https://wiki.openstreetmap.org/wiki/Anonymous_edits"></a></li></ul>
       contributor terms:
         heading: 'Osallistumisehdot:'
         agreed: Olet hyväksynyt osallistumisehdot.
@@ -2117,6 +2115,8 @@ fi:
       not_a_role: Merkkijono '%{role}' ei ole kelvollinen rooli.
       already_has_role: Käyttäjällä on jo rooli %{role}.
       doesnt_have_role: Käyttäjällä ei ole roolia %{role}.
+      not_revoke_admin_current_user: Ei voida perua järjestelmänvalvojan roolia nykyiseltä
+        käyttäjältä.
     grant:
       title: Vahvista roolin myöntäminen
       heading: Vahvista roolin myöntäminen
@@ -2336,8 +2336,10 @@ fi:
       new:
         intro: Huomasitko virheen tai puuttuvan kohteen? Ilmoita siitä muille kartoittajille,
           jolloin virhe voidaan korjata. Siirrä merkkipiste oikeaan kohtaan ja kirjoita
-          selite ongelmasta. (Älä kirjoita henkilötietojasi tai tietoa tekijänoikeudella
-          suojatuista kartoista tai muista lähteistä.)
+          selite ongelmasta.
+        advice: Merkintäsi on julkinen ja sitä voidaan käyttää kartan päivittämiseen,
+          joten älä kirjoita henkilökohtaisia tietoja tai tietoja tekijänoikeuksin
+          suojatuista karttoista tai hakemistotiedoista.
         add: Lähetä ilmoitus
       show:
         anonymous_warning: Tässä karttailmoituksessa on kommentteja tunnistautumattomilta
@@ -2349,6 +2351,7 @@ fi:
         comment: Kommentoi
     edit_help: Siirrä ja lähennä kartta muokattavaan paikkaan ja napsauta sitten tästä.
     directions:
+      ascend: Nousu
       engines:
         graphhopper_bicycle: Pyörällä (GraphHopper)
         graphhopper_car: Auto (GraphHopper)
@@ -2357,9 +2360,7 @@ fi:
         mapquest_car: Ajaen (MapQuest)
         mapquest_foot: Kävellen (MapQuest)
         osrm_car: Ajaen (OSRM)
-        mapzen_bicycle: Pyörällä (Mapzen)
-        mapzen_car: Ajaen (Mapzen)
-        mapzen_foot: Kävellen (Mapzen)
+      descend: Lasku
       directions: Reittiohjeet
       distance: Etäisyys
       errors:
index f310a7aaa1f6e5358f0a71c4bac412c3674e67c4..323753f37374d4bdff7662e3096be32b5f69ae12 100644 (file)
@@ -42,6 +42,7 @@
 # Author: Olasd
 # Author: Orikrin1998
 # Author: Otourly
+# Author: Oupsa
 # Author: Peter17
 # Author: Phoenamandre
 # Author: Pipo
@@ -188,6 +189,8 @@ fr:
         title_comment: Groupe de modifications %{id} — %{comment}
       join_discussion: Se connecter pour rejoindre la discussion
       discussion: Discussion
+      still_open: Ensemble de modifications toujours ouvert — la discussion s’ouvrira
+        une fois que l’ensemble de modifications sera fermé.
     node:
       title: 'Nœud : %{name}'
       history_title: 'Historique du nœud : %{name}'
@@ -400,7 +403,7 @@ fr:
       map_image: Image de la carte (affiche le calque standard)
       embeddable_html: HTML incorporable.
       licence: Licence
-      export_details: Les données d’OpenStreetMap sont publiées sous la <a href="http://opendatacommons.org/licenses/odbl/1.0/">licence
+      export_details: Les données d’OpenStreetMap sont publiées sous la <a href="https://opendatacommons.org/licenses/odbl/1.0/">licence
         Open Data Commons Open Database</a> (ODbL).
       too_large:
         advice: 'Si l’export ci-dessus échoue, veuillez envisager l’utilisation d’une
@@ -441,14 +444,14 @@ fr:
   geocoder:
     search:
       title:
-        latlon: Résultats <a href="http://openstreetmap.org/">internes</a>
+        latlon: Résultats <a href="https://openstreetmap.org/">internes</a>
         uk_postcode: Résultats depuis <a href="http://www.npemap.org.uk/">NPEMap /
           FreeThe Postcode</a>
-        ca_postcode: Résultats depuis <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Résultats de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Résultats depuis <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Résultats de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Résultats depuis <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Résultats de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Résultats de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Résultats de <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -458,12 +461,19 @@ fr:
           chair_lift: Télésiège
           drag_lift: Téléski
           gondola: Télécabine
+          platter: Monte-plat
+          pylon: Pylône
           station: Gare de télécabine
+          t-bar: Monte-barre en T
         aeroway:
           aerodrome: Aérodrome
+          airstrip: Piste d’atterrissage
           apron: Aire de stationnement
           gate: Porte
+          hangar: Hangar
           helipad: Héliport
+          holding_position: Position d’attente
+          parking_position: Place de parking
           runway: Piste
           taxiway: Piste de circulation d’un aéroport
           terminal: Terminal
@@ -498,37 +508,32 @@ fr:
           crematorium: Crématorium
           dentist: Dentiste
           doctors: Docteurs
-          dormitory: Dortoir
           drinking_water: Eau potable
           driving_school: École de conduite
           embassy: Ambassade
-          emergency_phone: Borne d’appel d’urgence
           fast_food: Restauration rapide
           ferry_terminal: Terminal de ferry
-          fire_hydrant: Bouche d’incendie
           fire_station: Caserne des pompiers
           food_court: Aire de restauration
           fountain: Fontaine
           fuel: Carburant
           gambling: Jeu d’argent
           grave_yard: Cimetière
-          gym: Fitness / gymnastique
-          health_centre: Centre de santé / dispensaire
+          grit_bin: Bac à sel
           hospital: Hôpital
           hunting_stand: Stand de tir
           ice_cream: Glacier
           kindergarten: Jardin d’enfant
           library: Bibliothèque
-          market: Marché
           marketplace: Place de marché
           monastery: Monastère
           motorcycle_parking: Parking à motos
           nightclub: Boîte de nuit
-          nursery: Nurserie
           nursing_home: Maison de retraite médicalisée
           office: Bureau
           parking: Parking
           parking_entrance: Entrée d’un parking
+          parking_space: Place de parking
           pharmacy: Pharmacie
           place_of_worship: Lieu de culte
           police: Police
@@ -538,7 +543,6 @@ fr:
           prison: Prison
           pub: Pub
           public_building: Bâtiment public
-          reception_area: Zone de livraison
           recycling: Point de recyclage
           restaurant: Restaurant
           retirement_home: Maison de retraite
@@ -563,6 +567,7 @@ fr:
           village_hall: Salle municipale
           waste_basket: Poubelle
           waste_disposal: Élimination des déchets
+          water_point: Point d’eau
           youth_centre: Centre pour la jeunesse
         boundary:
           administrative: Limite administrative
@@ -571,6 +576,7 @@ fr:
           protected_area: Zone protégée
         bridge:
           aqueduct: Aqueduc
+          boardwalk: Promenade
           suspension: Pont suspendu
           swing: Pont tournant
           viaduct: Viaduc
@@ -590,25 +596,31 @@ fr:
           "yes": Boutique d’artisanat
         emergency:
           ambulance_station: Dépôt d’ambulances
+          assembly_point: Point de rassemblement
           defibrillator: Défibrillateur
           landing_site: Terrain d’atterrissage d’urgence
           phone: Borne d’appel d’urgence
+          water_tank: Citerne d’eau d’urgence
+          "yes": Urgence
         highway:
           abandoned: Autoroute abandonnée
           bridleway: Chemin pour cavaliers
           bus_guideway: Voie de bus guidé / trolley
           bus_stop: Arrêt de bus
           construction: Route en construction
+          corridor: Couloir
           cycleway: Piste cyclable
           elevator: Ascenseur
           emergency_access_point: Point d’accès d’urgence
           footway: Chemin piéton
           ford: Gué
+          give_way: Panneau cédez le passage
           living_street: Rue en zone de rencontre
           milestone: Borne kilométrique
           motorway: Autoroute
           motorway_junction: Sortie / Échangeur
           motorway_link: Bretelle d’autoroute
+          passing_place: Endroit de passage
           path: Chemin
           pedestrian: Rue piétonne
           platform: Plateforme
@@ -625,6 +637,7 @@ fr:
           services: Services autoroutiers
           speed_camera: Radar de vitesse
           steps: Escalier
+          stop: Signe d'arrêt
           street_lamp: Lampadaire
           tertiary: Route tertiaire
           tertiary_link: Route tertiaire
@@ -633,8 +646,8 @@ fr:
           trail: Sentier
           trunk: Voie express
           trunk_link: Voie express
+          turning_loop: Virage en boucle
           unclassified: Route mineure
-          unsurfaced: Route non revêtue
           "yes": Route
         historic:
           archaeological_site: Site archéologique
@@ -653,6 +666,7 @@ fr:
           manor: Manoir
           memorial: Mémorial
           mine: Mine
+          mine_shaft: Puits de mine
           monument: Monument
           roman_road: Voie romaine
           ruins: Ruines
@@ -662,6 +676,7 @@ fr:
           wayside_cross: Calvaire
           wayside_shrine: Oratoire
           wreck: Épave
+          "yes": Site historique
         junction:
           "yes": Intersection / carrefour
         landuse:
@@ -699,9 +714,9 @@ fr:
         leisure:
           beach_resort: Station balnéaire
           bird_hide: Observatoire ornithologique
-          club: Club
           common: Terrains communaux
           dog_park: Parc à chiens
+          firepit: Foyer
           fishing: Zone de pêche
           fitness_centre: Centre de fitness
           fitness_station: Atelier de parcours de santé
@@ -726,15 +741,46 @@ fr:
           water_park: Parc aquatique
           "yes": Loisirs
         man_made:
+          adit: Galerie d’accès
+          beacon: Phare
+          beehive: Ruche
+          breakwater: Brise-lames
+          bridge: Pont
+          bunker_silo: Bunker
+          chimney: Cheminée
+          crane: Grue
+          dolphin: Poste d’amarrage
+          dyke: Digue
+          embankment: Talus
+          flagpole: Mât
+          gasometer: Gazomètre
+          groyne: Épi de plage
+          kiln: Four à poterie
           lighthouse: Phare
+          mast: Pylône
+          mine: Mine
+          mineshaft: Puits de mine
+          monitoring_station: Station de surveillance
+          petroleum_well: Puits de pétrole
+          pier: Jetée
           pipeline: Pipeline
+          silo: Silo
+          storage_tank: Citerne de stockage
+          surveillance: Surveillance
           tower: Tour
+          wastewater_plant: Station de traitement des eaux usées
+          watermill: Moulin à eau
+          water_tower: Château d’eau
+          water_well: Puits
+          water_works: Système hydraulique
+          windmill: Moulin à vent
           works: Usine
           "yes": Créé par l’homme
         military:
           airfield: Terrain d’aviation militaire
           barracks: Caserne
           bunker: Bunker
+          "yes": Militaire
         mountain_pass:
           "yes": Col de montagne
         natural:
@@ -780,11 +826,14 @@ fr:
           accountant: Comptable
           administrative: Administration
           architect: Architecte
+          association: Association
           company: Entreprise
+          educational_institution: Institution éducative
           employment_agency: Agence pour l’emploi
           estate_agent: Agent immobilier
           government: Administration publique
           insurance: Agence d’assurance
+          it: Bureau informatique
           lawyer: Avocat
           ngo: Agence d’une ONG
           telecommunication: Agence de télécommunication
@@ -792,9 +841,8 @@ fr:
           "yes": Bureau
         place:
           allotments: Jardins familiaux
-          block: Bloc
-          airport: Aéroport
           city: Ville
+          city_block: Bloc urbain
           country: Pays
           county: Comté
           farm: Ferme
@@ -803,14 +851,15 @@ fr:
           houses: Maisons
           island: Île
           islet: Îlot
-          isolated_dwelling: Habitation isolée
+          isolated_dwelling: Lieu-dit habité
           locality: Lieu-dit
-          moor: Maure
           municipality: Municipalité
           neighbourhood: Quartier
           postcode: Code postal
+          quarter: Trimestre
           region: Région
           sea: Mer
+          square: Square
           state: État / province
           subdivision: Subdivision
           suburb: Quartier
@@ -822,10 +871,8 @@ fr:
           abandoned: Voie ferrée abandonnée
           construction: Voie ferrée en construction
           disused: Voie ferrée désaffectée
-          disused_station: Gare ferroviaire désaffectée
           funicular: Funiculaire
           halt: Arrêt de train
-          historic_station: Gare ferroviaire historique
           junction: Jonction ferroviaire
           level_crossing: Passage à niveau
           light_rail: Voie ferrée légère
@@ -851,6 +898,7 @@ fr:
           beauty: Magasin de produits de beauté
           beverages: Magasin de boissons
           bicycle: Magasin de vélos
+          bookmaker: Bureau de paris
           books: Librairie
           boutique: Boutique de mode
           butcher: Boucherie
@@ -889,12 +937,16 @@ fr:
           hairdresser: Coiffeur
           hardware: Quincaillerie
           hifi: Magasin Hi-Fi
-          insurance: Assurance
+          houseware: Magasin d’articles ménagers
+          interior_decoration: Décoration intérieure
           jewelry: Bijouterie
           kiosk: Kiosque
+          kitchen: Magasin de cuisine
           laundry: Blanchisserie
+          lottery: Loto
           mall: Centre commercial
           market: Marché
+          massage: Massage
           mobile_phone: Boutique de téléphones mobiles
           motorcycle: Magasin de motos
           music: Boutique de musique / disquaire
@@ -902,21 +954,27 @@ fr:
           optician: Opticien
           organic: Magasin d’alimentation bio
           outdoor: Magasin d’articles pour activité en plein air
+          paint: Galerie de peinture
+          pawnbroker: Prêteur sur gages
           pet: Animalerie
           pharmacy: Pharmacie
           photo: Boutique de photographie
-          salon: Salon de beauté
+          seafood: Fruits de mer
           second_hand: Boutique de produits d’occasion
           shoes: Magasin de chaussures
-          shopping_centre: Centre commercial
           sports: Magasin de d’articles de sport
           stationery: Papeterie
           supermarket: Supermarché
           tailor: Tailleur
+          ticket: Billetterie
+          tobacco: Bureau de tabac
           toys: Magasin de jouets
           travel_agency: Agence de voyage
+          tyres: Magasin de pneus
+          vacant: Commerce vaquant
+          variety_store: Magasin de variétés
           video: Magasin de vidéos
-          wine: Vendeur d’alcool à emporter / caviste
+          wine: Caviste
           "yes": Boutique
         tourism:
           alpine_hut: Refuge
@@ -940,6 +998,7 @@ fr:
           viewpoint: Point de vue
           zoo: Zoo
         tunnel:
+          building_passage: Passage de bâtiment
           culvert: Buse
           "yes": Tunnel
         waterway:
@@ -971,7 +1030,7 @@ fr:
         level10: Limite de quartier
     description:
       title:
-        osm_nominatim: Localisation depuis <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Localisation depuis <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Localisation depuis <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1046,22 +1105,23 @@ fr:
     legal_babble:
       title_html: Droits d’auteur et licence
       intro_1_html: |-
-        OpenStreetMap est un ensemble de <i>données ouvertes</i>, disponibles sous licence libre <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL).
+        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> est un ensemble de <i>données ouvertes</i>, disponibles sous licence libre <a
+        href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) auprès de la <a
+        href="https://osmfoundation.org/">Fondation OpenStreetMap</a> (OSMF).
       intro_2_html: Vous êtes libre de copier, distribuer, transmettre et adapter
         nos données, à condition que vous créditiez, OpenStreetMap et ses contributeurs.
         Si vous modifiez ou utilisez nos données dans d’autres œuvres dérivées, vous
-        ne pouvez distribuer celles-ci que sous la même licence. Le <a href="http://opendatacommons.org/licenses/odbl/1.0/">texte
+        ne pouvez distribuer celles-ci que sous la même licence. Le <a href="https://opendatacommons.org/licenses/odbl/1.0/">texte
         légal</a> complet détaille vos droits et responsabilités.
       intro_3_html: Nos carreaux de rendu cartographiques, ainsi que notre documentation,
-        sont disponibles sous la licence <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        sont disponibles sous la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons paternité – partage à l’identique 2.0</a> (CC-BY-SA).
       credit_title_html: Comment créditer OpenStreetMap
       credit_1_html: Nous demandons que votre crédit comporte la mention « © les contributeurs
         d’OpenStreetMap ».
       credit_2_html: |-
         Vous devez également préciser clairement que les données sont disponibles sous la licence ODbL et, si vous utilisez les tuiles de notre carte, que la carte est sous la licence CC-BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers
-        <a href="http://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
+        <a href="https://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
         Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en l’adresse openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
       credit_3_html: |-
         Pour une carte électronique navigable, le crédit devrait apparaître dans le coin de la carte.
@@ -1072,8 +1132,8 @@ fr:
       more_title_html: Pour trouver plus d’informations
       more_1_html: |-
         Pour obtenir plus d’informations sur la façon de réutiliser nos données et de nous créditer, veuillez lire la <a
-        href="http://osmfoundation.org/Licence"> Licence OSMF</a> et le <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ Légal</a>.
+        href="https://osmfoundation.org/Licence"> Licence OSMF</a> et le <a
+        href="https://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ Légal</a>.
       more_2_html: "Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes,
         nous ne pouvons pas fournir une API gratuite et en libre accès pour les tierces
         personnes.\nVeuillez vous référer à notre <a href=\"https://operations.osmfoundation.org/policies/api/\">politique
@@ -1085,10 +1145,10 @@ fr:
         Nous incluons également des données publiées sous licence ouverte par des
         agences nationales de cartographie et par d’autres sources, notamment :'
       contributors_at_html: '<strong>Autriche</strong> : contient des données sur
-        la <a href="http://data.wien.gv.at/">ville de Vienne</a> (sous licence <a
-        href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), la
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région
-        du Vorarlberg</a> et la région du Tyrol (sous licence <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
+        la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous licence <a
+        href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        la <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région
+        du Vorarlberg</a> et la région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
         BY AT avec amendements</a>).'
       contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
         <em>GeoGratis</em> (© Département des Ressources naturelles du Canada), <em>CanVec</em>
@@ -1096,13 +1156,13 @@ fr:
         Géographie, Statistiques du Canada).'
       contributors_fi_html: '<strong>Finlande</strong> : contient des données de la
         Base de données topographique de l’Inspection nationale du territoire de Finlande
-        et d’autres ensembles de données, sous <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licence
+        et d’autres ensembles de données, sous <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licence
         NLSFI</a>.'
       contributors_fr_html: '<strong>France</strong> : contient des données de la
         <em>Direction générale des finances publiques</em> (anciennement la <em>Direction
         générale des impôts</em>).'
       contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
-        title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="http://www.and.com">www.and.com</a>).'
+        title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com">www.and.com</a>).'
       contributors_nz_html: '<strong>Nouvelle-Zélande</strong> : contient des données
         provenant du <em>Land Information New Zealand</em>. Copyright de la Couronne
         réservé.'
@@ -1118,7 +1178,7 @@ fr:
         données de la Couronne.'
       contributors_footer_1_html: Pour plus de détails sur celles-ci et sur les autres
         sources utilisées pour aider à améliorer OpenStreetMap, consultez la page
-        des <a href="http://wiki.openstreetmap.org/wiki/Contributors">contributeurs</a>
+        des <a href="https://wiki.openstreetmap.org/wiki/Contributors">contributeurs</a>
         sur le wiki d’OpenStreetMap.
       contributors_footer_2_html: L’inclusion de données dans OpenStreetMap n’implique
         pas que les fournisseurs d’origine du contenu approuvent OpenStreetMap, ni
@@ -1130,15 +1190,14 @@ fr:
         imprimées) sans autorisation explicite de la part des détenteurs de ces droits.
       infringement_2_html: Si vous pensez que des données ont été ajoutées à la base
         de données OpenStreetMap ou à ce site en violation des droits d’auteur, veuillez
-        vous référer à notre <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procédure
+        vous référer à notre <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procédure
         de retrait de données</a> ou notifiez-nous directement à travers notre <a
-        href="http://dmca.openstreetmap.org/">formulaire en ligne</a>.
+        href="https://dmca.openstreetmap.org/">formulaire en ligne</a>.
       trademarks_title_html: <span id="marques"></span>Marques
       trademarks_1_html: OpenStreetMap, le logo loupe et State of the Map sont des
         marques déposées de l'OpenStreetMap Foundation. Si vous avez des questions
-        à propos de l’utilisation de ces marques, merci de prendre contact avec le
-        <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence
-        Working Group</a>.
+        à propos de l’utilisation de ces marques, merci de consulter notre <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">règlement
+        concernant les marques déposées</a>.
   welcome_page:
     title: Bienvenue !
     introduction_html: Bienvenue à OpenStreetMap, la carte du monde libre et éditable.
@@ -1174,8 +1233,8 @@ fr:
       paragraph_1_html: OpenStreetMap a quelques règles formelles, mais nous attendons
         de tous les participants une collaboration et une communication avec la communauté.
         Si vous envisagez d’autres activités que la modification à la main, veuillez
-        lire et suivre les directives sur <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>les
-        importations</a> et <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les
+        lire et suivre les directives sur <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>les
+        importations</a> et <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les
         modifications automatiques</a>.
     questions:
       title: Des questions ?
@@ -1209,8 +1268,9 @@ fr:
       title: Autres préoccupations
       explanation_html: Si vous êtes préoccupé par la manière dont nos données sont
         utilisées ou sur leur contenu, veuillez consulter notre <a href='/copyright'>page
-        des droits d’auteur</a> pour des informations légales ou contacter le <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>groupe
-        de travail OSMF</a> approprié.
+        des droits d’auteur</a> pour davantage d’informations légales ou contacter
+        le <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>groupe de
+        travail OSMF</a> approprié.
   help_page:
     title: Obtenir de l’aide
     introduction: OpenStreetMap propose plusieurs ressources pour apprendre à travailler
@@ -1221,7 +1281,7 @@ fr:
       title: Bienvenue à OSM
       description: Commencer avec ce guide rapide couvrant les bases d’OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/FR:Guide_du_d%C3%A9butant
+      url: https://wiki.openstreetmap.org/wiki/FR:Guide_du_d%C3%A9butant
       title: Guide du débutant
       description: Guide pour les débutants maintenu par la communauté.
     help:
@@ -1263,9 +1323,15 @@ fr:
       GPS et les cartes classiques du terrain pour vérifier qu’OSM est exact et à
       jour.
     community_driven_title: Conduit par la communauté
-    community_driven_html: |-
-      La communauté d’OpenStreetMap est diverse, passionnée et grossit chaque jour. Nos contributeurs incluent des cartographes enthousiastes, des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe et bien d’autres.
-      Pour en savoir plus sur la communauté, consultez les <a href='%{diary_path}'>annuaires d’utilisateurs</a>, <a href='http://blogs.openstreetmap.org/'>les blogues communautaires</a> et le site web de la <a href='http://www.osmfoundation.org/'>Fondation OSM</a>.
+    community_driven_html: "La communauté d’OpenStreetMap est diverse, passionnée
+      et grossit chaque jour. Nos contributeurs incluent des cartographes enthousiastes,
+      des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs
+      d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe
+      et beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \n<a
+      href='https://blog.openstreetmap.org'>le blogue OpenStreetMap</a>,\n<a href='%{diary_path}'>les
+      annuaires d’utilisateurs</a>, \n<a href='https://blogs.openstreetmap.org/'>les
+      blogues communautaires</a> et \nle site web de la <a href='https://www.osmfoundation.org/'>Fondation
+      OSM</a>."
     open_data_title: Données libres
     open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
       de l’utiliser pour n’importe quel but tant que vous créditez OpenStreetMap et
@@ -1275,13 +1341,15 @@ fr:
       pour plus de détails.'
     legal_title: Juridique
     legal_html: "Ce site et de nombreux autres services connexes sont formellement
-      exploités par la \n<a href=\"http://osmfoundation.org/\">Fondation OpenStreetMap</a>
+      exploités par la \n<a href=\"https://osmfoundation.org/\">Fondation OpenStreetMap</a>
       (OSMF) \nau nom de la communauté. L’utilisation de tous les services offerts
-      par l’OSMF est sujette\nà notre <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolitique
+      par l’OSMF est sujette\nà notre <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolitique
       des usages acceptés</a> et à notre <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Politique
-      de confidentialité</a>.\n<br> \nVeuillez <a href=\"http://osmfoundation.org/Contact\">contacter
+      de confidentialité</a>.\n<br> \nVeuillez <a href=\"https://osmfoundation.org/Contact\">contacter
       l’OSMF</a> \nsi vous avez des questions ou problèmes concernant les licences,
-      les droits d’auteur ou d’autres aspects juridiques."
+      les droits d’auteur ou d’autres aspects juridiques.\n<br>\nOpenStreetMap, le
+      logo avec la loupe et ''State of the Map'' sont <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">des
+      marques déposées de OSMF</a>."
     partners_title: Partenaires
   notifier:
     diary_comment_notification:
@@ -1498,15 +1566,15 @@ fr:
       user_page_link: page utilisateur
       anon_edits_link_text: Trouvez pourquoi ici.
       flash_player_required: Vous avez besoin d’un lecteur Flash pour utiliser Potlatch,
-        l’éditeur Flash d’OpenStreetMap. Vous pouvez <a href='http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>télécharger
-        Flash Player depuis le site d’Adobe</a>. <a href='http://wiki.openstreetmap.org/wiki/Editing'>D’autres
+        l’éditeur Flash d’OpenStreetMap. Vous pouvez <a href='https://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>télécharger
+        Flash Player depuis le site d’Adobe</a>. <a href='https://wiki.openstreetmap.org/wiki/Editing'>D’autres
         options</a> sont également disponibles pour modifier OpenStreetMap.
       potlatch_unsaved_changes: Vous avez des modifications non enregistrées. (Pour
         enregistrer dans Potlatch, désélectionnez la ligne ou le nœud actuel lors
         d’une modification en direct, ou cliquez sur le bouton Enregistrer s’il est
         affiché.)
       potlatch2_not_configured: Potlatch 2 n’a pas été configuré – Veuillez consulter
-        http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 pour plus d’informations.
+        https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 pour plus d’informations.
       potlatch2_unsaved_changes: Vous avez des modifications non enregistrées. (Pour
         enregistrer vos modifications dans Potlach 2, cliquez sur le bouton Enregistrer)
       id_not_configured: iD n’a pas été configuré
@@ -1598,7 +1666,7 @@ fr:
       edit: Modifier
       preview: Aperçu
     markdown_help:
-      title_html: Analysé avec <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Analysé avec <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Titres
       heading: Titre
       subheading: Sous-titre
@@ -1622,8 +1690,8 @@ fr:
     create:
       upload_trace: Envoyer la trace GPS
       trace_uploaded: Votre fichier GPX a été envoyé et est en attente de son intégration
-        dans la base de données. Ceci prend en général moins d’une demie heure et
-        un courriel vous sera envoyé lorsque cela sera terminé.
+        dans la base de données. Ceci prend en général moins d’une demi-heure et un
+        courriel vous sera envoyé lorsque ce sera terminé.
     edit:
       title: Modifier la trace %{name}
       heading: Modifier la trace %{name}
@@ -1710,7 +1778,8 @@ fr:
       tagged_with: balisée avec %{tags}
       empty_html: Il n’y a encore rien ici. <a href='%{upload_link}'>Téléverser une
         nouvelle trace</a> ou pour en savoir plus sur le traçage GPS, consultez la
-        <a href='http://wiki.openstreetmap.org/wiki/FR:Beginners_Guide_1.2'>page wiki</a>.
+        <a href='https://wiki.openstreetmap.org/wiki/FR:Beginners_Guide_1.2'>page
+        wiki</a>.
     delete:
       scheduled_for_deletion: Piste prévue pour la suppression
     make_public:
@@ -1927,12 +1996,12 @@ fr:
         html: |-
           <p>À la différence des autres cartes, OpenStreetMap est entièrement créé par des gens comme vous, et chacun est libre de le modifier, le mettre à jour, le télécharger et l’utiliser.</p>
           <p>Inscrivez-vous pour commencer à participer. Nous vous enverrons un courriel pour confirmer votre compte.</p>
-      license_agreement: En confirmant votre compte, vous devrez accepter les <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">termes
+      license_agreement: En confirmant votre compte, vous devrez accepter les <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">termes
         du contributeur</a>.
       email address: 'Adresse de courriel :'
       confirm email address: 'Confirmez l’adresse de courriel :'
       not displayed publicly: Votre adresse n'est pas affichée publiquement, voir
-        notre <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
+        notre <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
         privacy policy including section on email addresses">charte sur la confidentialité</a>
         pour plus d'information
       display name: 'Nom affiché :'
@@ -1950,6 +2019,7 @@ fr:
       terms declined: Nous sommes désolés que vous ayez décidé de ne pas accepter
         les nouvelles conditions de contributions. Pour plus d’informations, veuillez
         consulter <a href="%{url}">cette page wiki</a>.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: Termes du contributeur
       heading: Termes du contributeur
@@ -2055,12 +2125,12 @@ fr:
       email never displayed publicly: (jamais affiché publiquement)
       external auth: 'Authentification externe :'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: qu’est-ce que ceci ?
       public editing:
         heading: 'Modification publique :'
         enabled: Activée. Non anonyme et peut modifier les données.
-        enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: qu’est-ce que ceci ?
         disabled: Désactivée et ne peut pas modifier les données ; toutes les précédentes
           modifications sont anonymes.
@@ -2073,7 +2143,7 @@ fr:
           contributions et permettre aux autres personnes de vous contacter via ce
           site, cliquez sur le bouton ci-dessous. <b>Depuis le basculement de l’API
           en version 0.6, seuls les utilisateurs en mode de « modifications publiques
-          » peuvent modifier les données des cartes</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">en
+          » peuvent modifier les données des cartes</b> (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">en
           savoir plus</a>).<ul><li>Votre adresse de courriel ne sera pas rendue publique.</li><li>Cette
           opération ne peut pas être annulée et tous les nouveaux utilisateurs sont
           maintenant en mode de « modifications publiques » par défaut.</li></ul>
@@ -2085,6 +2155,7 @@ fr:
           et accepter les nouveaux termes du contributeur.
         agreed_with_pd: Vous avez également déclaré que vous considériez vos modifications
           comme relevant du domaine public.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: qu’est-ce que ceci ?
       profile description: 'Description du profil :'
       preferred languages: 'Langues préférées :'
@@ -2204,6 +2275,8 @@ fr:
       not_a_role: La chaîne « %{role} » n’est pas un rôle valide.
       already_has_role: L’utilisateur possède déjà le rôle « %{role} ».
       doesnt_have_role: L’utilisateur n’a pas le rôle « %{role} ».
+      not_revoke_admin_current_user: Impossible d'enlever les droits d'administrateur
+        à l'utilisateur actuel.
     grant:
       title: Confirmer l’octroi du rôle
       heading: Confirmer l’octroi du rôle
@@ -2429,9 +2502,10 @@ fr:
       new:
         intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
           cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la
-          position exacte et écrivez une note pour expliquer le problème (Veuillez
-          ne pas entrer ici d’informations personnelles ou provenant de cartes avec
-          droit d’auteur ou des listes d’annuaires).
+          position exacte et écrivez une note pour expliquer le problème.
+        advice: Votre note est publique et peut être utilisée pour mettre à jour la
+          carte, aussi n'entrez pas d'informations personnelles ou en provenance de
+          cartes protégées ni de contenus de répertoires.
         add: Ajouter une note
       show:
         anonymous_warning: Cette note comprend des commentaires d’utilisateurs anonymes,
@@ -2453,9 +2527,6 @@ fr:
         mapquest_car: En voiture (<i>MapQuest</i>)
         mapquest_foot: À pied (<i>MapQuest</i>)
         osrm_car: En voiture (<i>OSRM</i>)
-        mapzen_bicycle: À vélo (<i>Mapzen</i>)
-        mapzen_car: En voiture (<i>Mapzen</i>)
-        mapzen_foot: À pied (<i>Mapzen</i>)
       descend: Décroissant
       directions: Itinéraire
       distance: Distance
index 66dff0829c22471cd3eba9e8355d8769bbb12045..5bd3060b123d3816bdf83a82e5369118eb3eec2d 100644 (file)
@@ -388,22 +388,17 @@ fur:
           crematorium: Crematori
           dentist: Dentist
           doctors: Dotôrs
-          dormitory: Dormitori
           drinking_water: Aghe potabil
           driving_school: Scuele guide
           embassy: Ambassade
-          emergency_phone: Telefon di emergjence
           ferry_terminal: Terminâl traghets
-          fire_hydrant: Idrant
           fire_station: Stazion dai pompîrs
           fountain: Fontane
           fuel: Stazion di riforniment
-          health_centre: Centri pe salût
           hospital: Ospedâl
           ice_cream: Gjelato
           kindergarten: Scuelute
           library: Biblioteche
-          market: Marcjât
           nightclub: Club noturni
           office: Ufizi
           parking: Parcament
@@ -470,7 +465,6 @@ fur:
           tertiary: Strade terziarie
           tertiary_link: Strade terziarie
           track: Piste
-          unsurfaced: Strade no asfaltade
         historic:
           archaeological_site: Sît archeologic
           battlefield: Cjamp di bataie
@@ -551,7 +545,6 @@ fur:
           travel_agent: Agjenzie di viaçs
           "yes": Ufizi
         place:
-          airport: Aeropuart
           city: Citât
           country: Paîs
           county: Contee
@@ -575,7 +568,6 @@ fur:
           abandoned: Ferade bandonade
           construction: Ferade in costruzion
           disused: Ferade bandonade
-          disused_station: Stazion de ferade bandonade
           halt: Fermade de ferade
           level_crossing: Passaç a nivel
           light_rail: Ferade lizere
@@ -598,7 +590,6 @@ fur:
           electronics: Buteghe di eletroniche
           gallery: Galarie di art
           hairdresser: Piruchîr o barbîr
-          insurance: Assicurazion
           jewelry: Buteghe dal oresin
           laundry: Lavandarie
           market: Marcjât
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
new file mode 100644 (file)
index 0000000..21a5a5f
--- /dev/null
@@ -0,0 +1,641 @@
+# Messages for Western Frisian (Frysk)
+# Exported from translatewiki.net
+# Export driver: phpyaml
+# Author: Robin van der Vliet
+---
+fy:
+  time:
+    formats:
+      friendly: '%e %B %Y om %H:%M'
+  activerecord:
+    models:
+      acl: Rjochtenoersjoch
+      country: Lân
+      friend: Freon
+      language: Taal
+      message: Berjocht
+      relation: Relaasje
+      session: Sessy
+      user: Meidogger
+      way: Wei
+    attributes:
+      diary_comment:
+        body: Tekst
+      diary_entry:
+        user: Meidogger
+        title: Ûnderwerp
+        latitude: Breedtegraad
+        longitude: Lingtegraad
+        language: Taal
+      friend:
+        user: Meidogger
+        friend: Freon
+      trace:
+        user: Meidogger
+        visible: Sichtber
+        name: Namme
+        size: Grutte
+        latitude: Breedtegraad
+        longitude: Lingtegraad
+        public: Iepenbier
+        description: Beskriuwing
+      message:
+        sender: Ofstjoerder
+        title: Ûnderwerp
+        body: Tekst
+        recipient: Untfanger
+      user:
+        email: E-mail
+        active: Aktyf
+        description: Beskriuwing
+        languages: Talen
+        pass_crypt: Wachtwurd
+  editor:
+    default: Standert (op dit momint %{name})
+    potlatch:
+      name: Potlatch 1
+    id:
+      name: iD
+    potlatch2:
+      name: Potlatch 2
+    remote:
+      name: Remote Control
+      description: Remote Control (JOSM of Merkaartor)
+  browse:
+    version: Ferzje
+    anonymous: anonym
+    part_of: Ûnderdiel fan
+    location: 'Lokaasje:'
+    changeset:
+      belongs_to: Auteur
+      relation: Relaasjes (%{count})
+      relation_paginated: Relaasjes (%{x}-%{y} fan %{count})
+    way:
+      title: 'Wei: %{name}'
+    relation:
+      title: 'Relaasje: %{name}'
+      members: Lidden
+    relation_member:
+      entry_role: '%{type} %{name} as %{role}'
+      type:
+        way: Wei
+        relation: Relaasje
+    containing_relation:
+      entry: Relaasje %{relation_name}
+      entry_role: Relaasje %{relation_name} (as %{relation_role})
+    not_found:
+      type:
+        way: wei
+        relation: relaasje
+    timeout:
+      type:
+        way: wei
+        relation: relaasje
+    redacted:
+      type:
+        way: wei
+        relation: relaasje
+    note:
+      description: Beskriuwing
+  changeset:
+    changeset_paging_nav:
+      showing_page: Side %{page}
+      next: Folgjende »
+      previous: « Foarige
+    changeset:
+      anonymous: Anonym
+    changesets:
+      id: ID
+      user: Meidogger
+      area: Gebiet
+    list:
+      load_more: Mear laden
+  diary_entry:
+    edit:
+      subject: 'Ûnderwerp:'
+      body: 'Tekst:'
+      language: 'Taal:'
+      location: 'Lokaasje:'
+      latitude: 'Breedtegraad:'
+      longitude: 'Lingtegraad:'
+      save_button: Bewarje
+    view:
+      save_button: Bewarje
+    location:
+      location: 'Lokaasje:'
+      edit: Bewurkje
+    comments:
+      ago: '%{ago} lyn'
+  export:
+    start:
+      licence: Lisinsje
+      options: Opsjes
+      format: 'Formaat:'
+      scale: Skaal
+      max: maks
+      latitude: 'Breedte:'
+      longitude: 'Lingte:'
+      output: Útfier
+  geocoder:
+    search_osm_nominatim:
+      prefix:
+        aerialway:
+          station: Kabelbaanstasjon
+        aeroway:
+          aerodrome: Loftfeartterrein
+          apron: Platform
+          gate: Gate
+          helipad: Helikopterplatform
+          runway: Start- en lâningsbaan
+          taxiway: Taksybaan
+          terminal: Terminal
+        amenity:
+          arts_centre: Keunstkollektyf
+          atm: Jildautomaat
+          bank: Bank
+          bar: Bar
+          bbq: BBQ
+          bench: Bankje
+          bicycle_parking: Fytsenstalling
+          bicycle_rental: Fytsferhier
+          biergarten: Biertún
+          brothel: Bordeel
+          bureau_de_change: Wikselkantoar
+          bus_station: Busstasjon
+          cafe: Kafee
+          car_rental: Autoferhier
+          car_sharing: Autodielen
+          car_wash: Autowaskplak
+          casino: Kasino
+          cinema: Bioskoop
+          clinic: Klinyk
+          college: Hegeskoalle
+          community_centre: Mienskipssintrum
+          courthouse: Rjochtbank
+          crematorium: Krematoariurn
+          dentist: Toskedokter
+          doctors: Dokter
+          drinking_water: Drinkwetter
+          driving_school: Rydskoalle
+          embassy: Ambassade
+          fast_food: Fast food
+          fire_station: Brânwar
+          food_court: Foodcourt
+          fountain: Fontein
+          fuel: Brânstof
+          grave_yard: Begraafplak
+          hospital: Sikehûs
+          hunting_stand: Jachttoer
+          ice_cream: Iis
+          kindergarten: Beukerskoalle
+          library: Bibleteek
+          marketplace: Merkplein
+          nightclub: Nachtklub
+          nursing_home: Ferpleechhûs
+          office: Kantoar
+          parking: Parkeare
+          pharmacy: Apoteek
+          police: Plysje
+          post_box: Brievebus
+          post_office: Postkantoar
+          preschool: Pjutteboartersplak of beukerskoalle
+          prison: Finzenis
+          pub: Kafee
+          restaurant: Restaurant
+          retirement_home: Bejaardetehûs
+          sauna: Sauna
+          school: Skoalle
+          shelter: Beskutting
+          shop: Winkel
+          shower: Dûs
+          swimming_pool: Swimbad
+          taxi: Taksy
+          theatre: Teater
+          toilets: Húskes
+          townhall: Gemeentehûs
+          university: Universiteit
+          vending_machine: Automaat
+          veterinary: Bistedokter
+          village_hall: Gemeentehûs
+          waste_basket: Papierkoer
+          youth_centre: Jeugdsintrum
+        bridge:
+          aqueduct: Akwadukt
+          viaduct: Fiadukt
+          "yes": Brêge
+        building:
+          "yes": Gebou
+        highway:
+          bridleway: Ruterpaad
+          bus_stop: Bushalte
+          living_street: Wenhiem
+          milestone: Mylpeal
+          path: Paad
+          platform: Perron
+          residential: Strjitte
+          road: Wei
+          street_lamp: Strjitlampe
+        historic:
+          battlefield: Slachfjild
+          building: Gebou
+          castle: Kastiel
+          church: Tsjerke
+          citywalls: Stedsmuorren
+          fort: Fort
+          house: Hûs
+          icon: Piktogram
+          memorial: Betinkingsmonumint
+          mine: Myn
+          monument: Monumint
+          ruins: Ruïne
+          tomb: Grêf
+          tower: Toer
+          wreck: Wrak
+        landuse:
+          allotments: Folkstunen
+          basin: Wetterbekken
+          cemetery: Begraafplak
+          conservation: Natuerbehâld
+          farm: Buorkerij
+          farmyard: Boerehiem
+          forest: Bosk
+          grass: Gers
+          landfill: Stoart
+          meadow: Weide
+          mine: Myn
+          quarry: Stiengat
+          reservoir: Reservoir
+          retail: Winkels
+          vineyard: Wyngerd
+        leisure:
+          beach_resort: Badplak
+          common: Mient
+          fishing: Fiskgrûn
+          garden: Tún
+          golf_course: Golfbaan
+          ice_rink: Iisbaan
+          marina: Jachthaven
+          miniature_golf: Minygolf
+          nature_reserve: Natuerreservaat
+          park: Park
+          pitch: Sportfjild
+          playground: Boartersplak
+          sauna: Sauna
+          stadium: Stadion
+          swimming_pool: Swimbad
+        military:
+          barracks: Kazerne
+          bunker: Bunker
+        natural:
+          bay: Baai
+          beach: Strân
+          cape: Kaap
+          cliff: Klif
+          crater: Krater
+          dune: Dún
+          fjord: Fjord
+          forest: Bosk
+          geyser: Geiser
+          glacier: Gletsjer
+          hill: Heuvel
+          island: Eilân
+          land: Lân
+          marsh: Moeras
+          moor: Fean
+          mud: Modder
+          point: Punt
+          reef: Rif
+          ridge: Berchkaam
+          rock: Rotsen
+          scree: Pún
+          scrub: Strewellen
+          spring: Boarne
+          stone: Stien
+          tree: Beam
+          valley: Fallei
+          volcano: Fulkaan
+          water: Wetter
+          wetland: Moeras
+          wood: Bos
+        office:
+          accountant: Boekhâlder
+          architect: Arsjitekt
+          company: Bedriuw
+          estate_agent: Makelder
+          lawyer: Advokaat
+          ngo: NGO-kantoar
+          travel_agent: Reisburo
+          "yes": Kantoar
+        place:
+          city: Stêd
+          country: Lân
+          county: Distrikt
+          farm: Buorkerij
+          hamlet: Gehucht
+          house: Hûs
+          houses: Huzen
+          island: Eilân
+          locality: Plak
+          municipality: Gemeente
+          neighbourhood: Wyk
+          postcode: Postkoade
+          region: Regio
+          sea: See
+          state: Steat
+          subdivision: Dielgebiet
+          suburb: Bûtenwyk
+          town: Stêd
+          village: Doarp
+        shop:
+          bakery: Bakkerij
+          boutique: Boetyk
+          butcher: Slachterij
+          chemist: Apoteek
+          dry_cleaning: Stomerij
+          fish: Fiskwinkel
+          florist: Blommist
+          furniture: Meubelsaak
+          greengrocer: Grienteboer
+          hairdresser: Kapper
+          hifi: Hi-fi
+          jewelry: Juwelier
+          laundry: Waskerij
+          market: Merk
+          optician: Optisien
+          pet: Bistewinkel
+          pharmacy: Apoteek
+          photo: Fotowinkel
+          second_hand: Kringloopwinkel
+          supermarket: Supermerk
+          tailor: Kleanmakker
+          travel_agency: Reisburo
+          video: Fideoteek
+          wine: Sliterij
+          "yes": Winkel
+        tourism:
+          alpine_hut: Berchhutte
+          attraction: Attraksje
+          bed_and_breakfast: Pensjon
+          cabin: Hutte
+          camp_site: Kampearterrein
+          chalet: Fekânsjehûske
+          hostel: Jeugdherberch
+          hotel: Hotel
+          information: Gegevens
+          motel: Motel
+          museum: Museum
+          picnic_site: Picknickplak
+          theme_park: Ferdivedaasjepark
+          zoo: Dieretún
+        tunnel:
+          culvert: Dûker
+          "yes": Tunnel
+        waterway:
+          canal: Kanaal
+          dam: Daam
+          ditch: Sleat
+          lock_gate: Slúsdoar
+          mooring: Oanlisplak
+          rapids: Streamfersnelling
+          river: Rivier
+          stream: Stream
+          wadi: Beek
+          waterfall: Wetterfal
+          weir: Keardaam
+      admin_levels:
+        level2: Lânsgrins
+        level4: Steatsgrins
+    description:
+      title:
+        osm_nominatim: Lokaasje fan <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames: Lokaasje fan <a href="http://www.geonames.org/">GeoNames</a>
+      types:
+        cities: Stêden
+        towns: Stêden
+        places: Plakken
+  layouts:
+    logo:
+      alt_text: Logo OpenStreetMap
+    logout: Ofmelde
+    log_in: Oanmelde
+    edit: Bewurkje
+    history: Skiednis
+    data: Gegevens
+    intro_header: Wolkom by OpenStreetMap!
+    partners_ic: Imperial College London
+    partners_bytemark: Bytemark Hosting
+    partners_partners: partners
+    help: Help
+    about: Oer
+    community: Mienskip
+    foundation: Stifting
+    foundation_title: De OpenStreetMap Foundation
+    more: Mear
+  license_page:
+    native:
+      native_link: Frysktalige ferzje
+  welcome_page:
+    title: Wolkom!
+  help_page:
+    welcome:
+      url: /welcome
+      title: Wolkom by OSM
+    help:
+      url: https://help.openstreetmap.org/
+      title: help.openstreetmap.org
+    irc:
+      title: IRC
+    wiki:
+      url: http://wiki.openstreetmap.org/
+      title: wiki.openstreetmap.org
+  about_page:
+    next: Folgjende
+    partners_title: Partners
+  notifier:
+    diary_comment_notification:
+      hi: Hallo %{to_user},
+    message_notification:
+      hi: Hallo %{to_user},
+    gpx_notification:
+      greeting: Hallo,
+    email_confirm_plain:
+      greeting: Hallo,
+    email_confirm_html:
+      greeting: Hallo,
+    lost_password_plain:
+      greeting: Hallo,
+    lost_password_html:
+      greeting: Hallo,
+    note_comment_notification:
+      greeting: Hallo,
+  message:
+    inbox:
+      from: Fan
+      subject: Ûnderwerp
+      date: Datum
+    message_summary:
+      delete_button: Fuortsmite
+    new:
+      subject: Ûnderwerp
+      body: Tekst
+    outbox:
+      to: Oan
+      subject: Ûnderwerp
+      date: Datum
+    read:
+      from: Fan
+      subject: Ûnderwerp
+      date: Datum
+      back: Foarige
+      to: Oan
+    sent_message_summary:
+      delete_button: Fuortsmite
+  site:
+    sidebar:
+      close: Slute
+    search:
+      search: Sykje
+      where_am_i: Wêr bin ik?
+    key:
+      table:
+        entry:
+          forest: Bosk
+          wood: Bosk
+          golf: Golfbaan
+          park: Park
+          common:
+          - Algemien
+          - weide
+          lake:
+          - mar
+          - reservoir
+          farm: Buorkerij
+          cemetery: Begraafplak
+          reserve: Natuerreservaat
+          school:
+          - Skoalle
+          - universiteit
+    richtext_area:
+      edit: Bewurkje
+      preview: Proefbyld
+    markdown_help:
+      text: Tekst
+      image: Ôfbylding
+      url: URL
+  trace:
+    edit:
+      filename: 'Triemnamme:'
+      map: kaart
+      edit: bewurkje
+      owner: 'Eigner:'
+      description: 'Beskriuwing:'
+      visibility: 'Sichtberheid:'
+    trace_form:
+      description: 'Beskriuwing:'
+      visibility: 'Sichtberheid:'
+      help: Help
+    view:
+      filename: 'Triemnamme:'
+      map: kaart
+      edit: bewurkje
+      owner: 'Eigner:'
+      description: 'Beskriuwing:'
+      none: Gjin
+      visibility: 'Sichtberheid:'
+    trace_paging_nav:
+      showing_page: Side %{page}
+    trace:
+      count_points: '%{count} punten'
+      ago: '%{time_in_words_ago} lyn'
+      more: mear
+      edit: bewurkje
+      public: IEPENBIER
+      private: PRIVEE
+      by: troch
+      in: yn
+      map: kaart
+  oauth_clients:
+    edit:
+      submit: Bewurkje
+    form:
+      name: Namme
+  user:
+    login:
+      password: 'Wachtwurd:'
+      openid: '%{logo} OpenID:'
+    lost_password:
+      email address: 'E-mailadres:'
+    reset_password:
+      password: 'Wachtwurd:'
+    new:
+      email address: 'E-mailadres:'
+      confirm email address: 'Befêstigjen e-mailadres:'
+      password: 'Wachtwurd:'
+    terms:
+      legale_names:
+        france: Frankryk
+        italy: Itaalje
+    view:
+      my diary: Myn deiboek
+      my messages: Myn berjochtsje
+      my profile: Myn profyl
+      diary: Deiboek
+      ago: (%{time_in_words_ago} lyn)
+      email address: 'E-mailadres:'
+      status: 'Status:'
+      description: Beskriuwing
+      settings_link_text: ynstellingen
+    popup:
+      friend: Freon
+    account:
+      openid:
+        link: http://wiki.openstreetmap.org/wiki/OpenID
+      public editing:
+        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+      image: 'Ôfbylding:'
+      latitude: 'Breedtegraad:'
+      longitude: 'Lingtegraad:'
+    list:
+      title: Meidoggers
+      heading: Meidoggers
+  user_block:
+    partial:
+      edit: Bewurkje
+      status: Status
+      showing_page: Side %{page}
+      next: Folgjende »
+      previous: « Foarige
+    show:
+      status: Status
+      edit: Bewurkje
+  note:
+    mine:
+      id: Id
+      creator: Auteur
+      description: Beskriuwing
+      ago_html: '%{when} lyn'
+  javascripts:
+    close: Slute
+    share:
+      cancel: Annulearje
+      image: Ôfbylding
+      embed: HTML
+      scale: 'Skaal:'
+    map:
+      base:
+        standard: Standert
+        hot: Humanitarian
+    directions:
+      time: Tiid
+    query:
+      relation: Relaasje
+  redaction:
+    edit:
+      description: Beskriuwing
+    new:
+      description: Beskriuwing
+    show:
+      description: 'Beskriuwing:'
+      user: 'Auteur:'
+...
index a575b32242eab09cd0895ddac11536a5cdf647d4..89d899cf8bc3129596ec15457d9eeaa156610660 100644 (file)
@@ -438,33 +438,26 @@ ga:
           crematorium: Créamatóiriam
           dentist: Fiaclóir
           doctors: Dochtúirí
-          dormitory: Áras cónaithe
           drinking_water: Uisce Inólta
           driving_school: Scoil Tiomána
           embassy: Ambasáid
-          emergency_phone: Fón Éigeandála
           fast_food: Mearbhia
           ferry_terminal: Críochfort Farantóireachta
-          fire_hydrant: Béal Tuile
           fire_station: Stáisiún Dóiteáin
           food_court: Cúirt Bhia
           fountain: Scairdeán/fuarán
           fuel: Breosla
           gambling: Cearrbhachas
           grave_yard: Reilg
-          gym: Spórtlann / Giom
-          health_centre: Ionad Sláinte
           hospital: Ospidéal
           hunting_stand: Árdán seilge
           ice_cream: Uachtar reoite
           kindergarten: Naíonra
           library: Leabharlann
-          market: Margadh
           marketplace: Áit mhargaidh
           monastery: Mainistir
           motorcycle_parking: Páirceáil do Ghluaisrothair
           nightclub: Club Oíche
-          nursery: Naíonra
           nursing_home: Teach Altranais
           office: Oifig
           parking: Páirceáil
@@ -478,7 +471,6 @@ ga:
           prison: Príosún
           pub: Teach tábhairne
           public_building: Foirgneamh Poiblí
-          reception_area: Limistéar Fáilte
           recycling: Ionad Athchúrsála
           restaurant: Bialann
           retirement_home: Áras Seanóirí
@@ -574,7 +566,6 @@ ga:
           trunk: Mórbhóthar
           trunk_link: Mórbhóthar
           unclassified: Bóthar Neamhaicmithe
-          unsurfaced: Bóthar Gan Dromhchla
           "yes": Bóthar
         historic:
           archaeological_site: Láithreán Seandálaíochta
@@ -639,7 +630,6 @@ ga:
         leisure:
           beach_resort: Ionad Saoire Cois Trá
           bird_hide: Folachán Éanbhreathnóireachta
-          club: Club
           common: Coimín
           dog_park: Páirc do Mhadraí
           fishing: Áit Iascaireachta
@@ -732,8 +722,6 @@ ga:
           "yes": Oifig
         place:
           allotments: Cuibhrinn
-          block: Bloc
-          airport: Aerfort
           city: Cathair
           country: Tír
           county: Contae
@@ -745,7 +733,6 @@ ga:
           islet: Oileáinín
           isolated_dwelling: Áit Chónaithe Iargúlta
           locality: Dúiche
-          moor: Móinteán
           municipality: Cathair bhardais/baile bardais
           neighbourhood: Comharsanacht
           postcode: Cód poist
@@ -762,10 +749,8 @@ ga:
           abandoned: Iarnród Tréigthe
           construction: Iarnród á Thógáil
           disused: Iarnróid atá As Úsáid
-          disused_station: Stáisiún Iarnróid As Úsáid
           funicular: Iarnród Cáblach
           halt: Stad Traenach
-          historic_station: Stáisiún Iarnróid Stairiúil
           junction: Acomhal Iarnróid
           level_crossing: Crosaire Comhréidh
           light_rail: Iarnród Éadrom
@@ -829,7 +814,6 @@ ga:
           hairdresser: Gruaigeadóir
           hardware: Siopa Crua-earraí
           hifi: Hi-Fi
-          insurance: Árachas
           jewelry: Siopa Seodóireachta
           kiosk: Both
           laundry: Neachtlann
@@ -845,10 +829,8 @@ ga:
           pet: Siopa Peataí
           pharmacy: Cógaslann
           photo: Siopa Grianghrafadóireachta
-          salon: Ionad áilleachta/sciamhlann
           second_hand: Siopa Earraí Athláimhe
           shoes: Siopa Bróg
-          shopping_centre: Ionad Siopadóireachta
           sports: Siopa Spóirt
           stationery: Siopa Stáiseanóireachta
           supermarket: Ollmhargadh
@@ -2016,9 +1998,6 @@ ga:
         mapquest_car: Carr (MapQuest)
         mapquest_foot: Ag Siúl (MapQuest)
         osrm_car: Carr (OSRM)
-        mapzen_bicycle: Rothar (Mapzen)
-        mapzen_car: Carr (Mapzen)
-        mapzen_foot: Ag siúl (Mapzen)
       directions: Treoracha
       distance: Fad
       errors:
index 09c5570f7008898ecd7db752d3d36abad7ba5de3..3b9018f32c624f2bf3a6540831792118b387d057 100644 (file)
@@ -459,33 +459,26 @@ gd:
           crematorium: Luaithreachan
           dentist: Fiaclaire
           doctors: Lighichean
-          dormitory: Suain-lann
           drinking_water: Uisge-òil
           driving_school: Sgoil draibhidh
           embassy: Ambasaid
-          emergency_phone: Fòn-èiginn
           fast_food: Biadh luath
           ferry_terminal: Port-aiseig
-          fire_hydrant: Tobar-sràide
           fire_station: Stèisean-smàlaidh
           food_court: Talla bìdh
           fountain: Fuaran
           fuel: Connadh
           gambling: Cearrachas
           grave_yard: Cladh
-          gym: Taigh-sunntais
-          health_centre: Ionad-slàinte
           hospital: Ospadal
           hunting_stand: Stannd seilge
           ice_cream: Reòiteagan
           kindergarten: Sgoil-àraich
           library: Leabhar-lann
-          market: Margadh
           marketplace: Ionad-margaidh
           monastery: Manachainn
           motorcycle_parking: Ionad-pàircidh motar-baidhseagal
           nightclub: Club-oidhche
-          nursery: Sgoil-àraich
           nursing_home: Taigh-altraim
           office: Oifis
           parking: Ionad-pàircidh
@@ -499,7 +492,6 @@ gd:
           prison: Prìosan
           pub: Taigh-seinnse
           public_building: Togalach poblach
-          reception_area: Ionad-fàilte
           recycling: Ionad ath-chuairteachaidh
           restaurant: Taigh-bìdh
           retirement_home: Taigh-cluaineis
@@ -595,7 +587,6 @@ gd:
           trunk: Prìomh-rathad
           trunk_link: Prìomh-rathad
           unclassified: Rathad neo-sheòrsaichte
-          unsurfaced: Rathad gun uachdar
           "yes": Rathad
         historic:
           archaeological_site: Làrach àrc-eòlach
@@ -660,7 +651,6 @@ gd:
         leisure:
           beach_resort: Tràigh-turasachd
           bird_hide: Crò-eun
-          club: Club
           common: Fearann coitcheann
           dog_park: Pàirc-chon
           fishing: Raon iasgaich
@@ -753,8 +743,6 @@ gd:
           "yes": Oifis
         place:
           allotments: Cuibhreann talmhainn
-          block: Bloca
-          airport: Port-adhair
           city: Baile
           country: Dùthaich
           county: Siorrachd/Còigeamh
@@ -766,7 +754,6 @@ gd:
           islet: Eilean beag
           isolated_dwelling: Àite-còmhnaidh iomallach
           locality: Àite
-          moor: Mòine
           municipality: Baile
           neighbourhood: Coimhearsnachd
           postcode: Còd-puist
@@ -783,10 +770,8 @@ gd:
           abandoned: Rèile thrèigte
           construction: Rèile 'ga togail
           disused: Rèile gun chleachdadh
-          disused_station: Stèisean-rèile gun chleachdadh
           funicular: Rèile-bhruthaich
           halt: Stad trèana
-          historic_station: Stèisean-rèile eachdraidheil
           junction: Snaidhm-rèile
           level_crossing: Crois-rèile fhosgailte
           light_rail: Rèile aotrom
@@ -850,7 +835,6 @@ gd:
           hairdresser: Gruagaire
           hardware: Bùth leasachadh dachaigh
           hifi: HiFi
-          insurance: Àrachas
           jewelry: Bùth usgaran
           kiosk: Cìtheasg
           laundry: Taigh-nigheachain
@@ -866,10 +850,8 @@ gd:
           pet: Bùth pheatachan
           pharmacy: Bùth-chungaidhean
           photo: Bùth dhealbhan
-          salon: Salon maise
           second_hand: Bùth rudan ath-làimhe
           shoes: Bùth bhrògan
-          shopping_centre: Ionad-seopadaireachd
           sports: Bùth spòrs
           stationery: Bùth pàipearachd
           supermarket: Oll-mhargadh
index 9003bb3cece3d37ddd50ac3ae0155ba5ce9651df..91bb202a6c6ec7e619166e440ad2295123749ee3 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Galician (galego)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: Athena in Wonderland
 # Author: Banjo
 # Author: Elisardojm
 # Author: Gallaecio
@@ -133,6 +134,8 @@ gl:
         title_comment: Conxunto de cambios %{id} - %{comment}
       join_discussion: Inicie sesión para unirse á discusión
       discussion: Conversa
+      still_open: O conxunto de cambios permanece aberto - A conversa comeza cando
+        o conxunto de cambios está pechado.
     node:
       title: 'Nodo: %{name}'
       history_title: 'Historial do nodo: %{name}'
@@ -440,33 +443,26 @@ gl:
           crematorium: Crematorio
           dentist: Dentista
           doctors: Médicos
-          dormitory: Residencia universitaria
           drinking_water: Auga potable
           driving_school: Escola de condución
           embassy: Embaixada
-          emergency_phone: Teléfono de emerxencia
           fast_food: Comida rápida
           ferry_terminal: Terminal de transbordadores
-          fire_hydrant: Boca de incendios
           fire_station: Parque de bombeiros
           food_court: Área de restauración
           fountain: Fonte
           fuel: Combustible
           gambling: Xogos de azar
           grave_yard: Cemiterio
-          gym: Ximnasio
-          health_centre: Centro de saúde
           hospital: Hospital
           hunting_stand: Lugar de caza
           ice_cream: Xeadaría
           kindergarten: Xardín de infancia
           library: Biblioteca
-          market: Mercado
           marketplace: Praza de mercado
           monastery: Mosteiro
           motorcycle_parking: Estacionamento para motocicletas
           nightclub: Club nocturno
-          nursery: Parvulario
           nursing_home: Residencia para a terceira idade
           office: Oficina
           parking: Aparcadoiro
@@ -480,7 +476,6 @@ gl:
           prison: Prisión
           pub: Pub
           public_building: Edificio público
-          reception_area: Zona de recepción
           recycling: Punto de reciclaxe
           restaurant: Restaurante
           retirement_home: Residencia de xubilados
@@ -576,7 +571,6 @@ gl:
           trunk: Estrada nacional
           trunk_link: Estrada nacional
           unclassified: Estrada sen clasificar
-          unsurfaced: Estrada non pavimentada
           "yes": Estrada
         historic:
           archaeological_site: Xacemento arqueolóxico
@@ -641,7 +635,6 @@ gl:
         leisure:
           beach_resort: Balneario
           bird_hide: Observatorio de aves
-          club: Club
           common: Terreo común
           dog_park: Parque canino
           fishing: Área de pesca
@@ -734,8 +727,6 @@ gl:
           "yes": Oficina
         place:
           allotments: Hortas
-          block: Bloque
-          airport: Aeroporto
           city: Cidade
           country: País
           county: Condado
@@ -747,7 +738,6 @@ gl:
           islet: Illote
           isolated_dwelling: Vivenda illada
           locality: Localidade
-          moor: Páramo
           municipality: Municipio
           neighbourhood: Veciñanza
           postcode: Código postal
@@ -764,10 +754,8 @@ gl:
           abandoned: Vía de tren abandonada
           construction: Vía ferroviaria en construción
           disused: Vía ferroviaria en desuso
-          disused_station: Estación de trens en desuso
           funicular: Vía de funicular
           halt: Parada de trens
-          historic_station: Estación de trens histórica
           junction: Unión de vías ferroviarias
           level_crossing: Paso a nivel
           light_rail: Metro lixeiro
@@ -831,7 +819,6 @@ gl:
           hairdresser: Perrucaría
           hardware: Ferraxaría
           hifi: Hi-Fi
-          insurance: Aseguradora
           jewelry: Xoiaría
           kiosk: Quiosco
           laundry: Lavandaría
@@ -847,10 +834,8 @@ gl:
           pet: Tenda de mascotas
           pharmacy: Farmacia
           photo: Tenda de fotografía
-          salon: Salón de beleza
           second_hand: Tenda de segunda man
           shoes: Zapataría
-          shopping_centre: Centro comercial
           sports: Tenda de deportes
           stationery: Papelaría
           supermarket: Supermercado
@@ -948,7 +933,7 @@ gl:
     intro_text: O OpenStreetMap é un mapa do mundo, creado por xente coma vostede
       e de libre uso baixo unha licenza aberta.
     intro_2_create_account: Cree unha conta de usuario
-    partners_html: O aloxamento é posible grazas ao %{ucl}, %{ic} e %{bytemark}, e
+    partners_html: O aloxamento é posible grazas ao %{ucl}, %{bytemark}, %{ic}, e
       outros %{partners}.
     partners_ucl: UCL
     partners_ic: Imperial College London
@@ -1025,9 +1010,7 @@ gl:
       more_title_html: Máis información
       more_1_html: |-
         Descubra máis sobre como empregar os nosos datos e como acreditarnos na <a
-        href="http://osmfoundation.org/Licence">páxina de licenza de OSMF</a> e na comunidade de <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">preguntas máis frecuentes
-        sobre asuntos legais</a>.
+        href="http://osmfoundation.org/Licence">páxina de licenza de OSMF</a>.
       more_2_html: |-
         Malia que o OpenStreetMap é de datos abertos, non podemos proporcionar un
         mapa API gratuíto aos desenvolvedores.
@@ -1228,10 +1211,12 @@ gl:
     community_driven_html: |-
       A comunidade do OpenStreetMap é diversa, apaixonada e cada día máis persoas se unen a ela.
       Entre os nosos colaboradores hai cartógrafos entusiastas, profesionais dos sistemas de información xeográfica, enxeñeiros
-      que se ocupan de manter os servidores do OSM, colaboradores de proxectos humanitarios que achegan datos sobre zonas afectadas por desastres
+      que se ocupan de manter os servidores do OSM, colaboradores de proxectos humanitarios que achegan datos sobre zonas afectadas por desastres,
       e moitas outras persoas.
-      Para obter máis información sobre a comunidade, consulte os <a href='%{diary_path}'>diarios de usuarios</a>,
-      os <a href='http://blogs.openstreetmap.org/'>blogues da comunidade</a> e
+      Para obter máis información sobre a comunidade, consulte o
+      <a href='https://blog.openstreetmap.org'>blogue do OpenStreetMap</a>,
+      <a href='%{diary_path}'>diarios de usuarios</a>,
+      <a href='http://blogs.openstreetmap.org/'>blogues da comunidade</a>, e
       o <a href='http://www.osmfoundation.org/'>sitio web da Fundación OSM</a>.
     open_data_title: Datos libres
     open_data_html: |-
@@ -1476,7 +1461,7 @@ gl:
       get_directions_title: Atopar indicacións entre dous puntos
       from: De
       to: A
-      where_am_i: Onde estou?
+      where_am_i: Onde está isto?
       where_am_i_title: Describa a localización actual usando o motor de procuras
       submit_text: Ir
     key:
@@ -2143,6 +2128,8 @@ gl:
       not_a_role: A cadea "%{role}" non é un rol correcto.
       already_has_role: O usuario xa ten o rol %{role}.
       doesnt_have_role: O usuario non ten o rol %{role}.
+      not_revoke_admin_current_user: Non se puido revogar os dereitos de administrador
+        do usuario actual.
     grant:
       title: Confirmar a concesión do rol
       heading: Confirmar a concesión do rol
@@ -2367,8 +2354,10 @@ gl:
       new:
         intro: Atopou un erro ou descubriu que falta algún dato? Informe aos outros
           cartógrafos para que poidamos solucionalo. Mova o marcador á posición correcta
-          e escriba unha nota explicando o problema. Non inclúa información persoal
-          ou información de mapas ou guías con dereitos de autoría.
+          e escriba unha nota explicando o problema.
+        advice: A túa nota será pública e poderá utilizarse para actualizar o mapa,
+          por conseguinte, non insiras información persoal, nin datos de mapas protexidos
+          por dereitos de autoría ou listas de directorios.
         add: Engadir a nota
       show:
         anonymous_warning: Esta nota inclúe comentarios de usuarios anónimos que deben
@@ -2390,9 +2379,6 @@ gl:
         mapquest_car: Coche (MapQuest)
         mapquest_foot: A pé (MapQuest)
         osrm_car: Coche (OSRM)
-        mapzen_bicycle: En bicicleta (Mapzen)
-        mapzen_car: En coche (Mapzen)
-        mapzen_foot: A pé (Mapzen)
       descend: Descendente
       directions: Indicacións
       distance: Distancia
index 31ed5c2b9c8b71c0e7c9879f137f55865a789871..eea2837517ad5e6b4b40c255b4c09a1c29fa2145 100644 (file)
@@ -449,33 +449,26 @@ he:
           crematorium: משרפה
           dentist: רופא שיניים
           doctors: רופאים
-          dormitory: מעונות
           drinking_water: מי שתייה
           driving_school: בית ספר לנהיגה
           embassy: שגרירות
-          emergency_phone: טלפון חירום
           fast_food: מזון מהיר
           ferry_terminal: מסוף מעבורת
-          fire_hydrant: ברז כיבוי אש
           fire_station: תחנת כיבוי אש
           food_court: אזור מזון מהיר
           fountain: מזרקה
           fuel: דלק
           gambling: הימורים
           grave_yard: בית קברות
-          gym: מכון כושר/חדר כושר
-          health_centre: מרכז בריאות
           hospital: בית חולים
           hunting_stand: תצפית ציידים
           ice_cream: גלידה
           kindergarten: גן ילדים
           library: ספרייה
-          market: שוק
           marketplace: שוק
           monastery: מנזר
           motorcycle_parking: חניית אופנועים
           nightclub: מועדון לילה
-          nursery: פעוטון
           nursing_home: בית אבות
           office: משרד
           parking: חניה
@@ -489,7 +482,6 @@ he:
           prison: כלא
           pub: פאב
           public_building: מבנה ציבור
-          reception_area: אזור קליטה
           recycling: נקודת מיחזור
           restaurant: מסעדה
           retirement_home: בית אבות
@@ -585,7 +577,6 @@ he:
           trunk: דרך ראשית
           trunk_link: דרך ראשית
           unclassified: דרך לא מסווגת
-          unsurfaced: דרך בלתי־סלולה
           "yes": דרך
         historic:
           archaeological_site: אתר ארכאולוגי
@@ -650,7 +641,6 @@ he:
         leisure:
           beach_resort: אתר נופש לחוף ים
           bird_hide: מצפור
-          club: מועדון
           common: שטח משותף
           dog_park: פארק כלבים
           fishing: אזור דיג
@@ -743,8 +733,6 @@ he:
           "yes": משרד
         place:
           allotments: שטחים חקלאיים
-          block: רובע
-          airport: נמל תעופה
           city: עיר
           country: ארץ
           county: מחוז
@@ -756,7 +744,6 @@ he:
           islet: איוֹן
           isolated_dwelling: מגורים מבודדים
           locality: יישוב
-          moor: אדמת כבול
           municipality: עירייה
           neighbourhood: שכונה
           postcode: מיקוד
@@ -773,10 +760,8 @@ he:
           abandoned: מסילת ברזל נטושה
           construction: מסילת ברזל בבנייה
           disused: מסילת ברזל שאינה בשימוש
-          disused_station: תחנת רכבת שאינה בשימוש
           funicular: פוניקולר
           halt: תחנת רכבת
-          historic_station: תחנת רכבת היסטורית
           junction: מפגש מסילות ברזל
           level_crossing: מפגש מסילת ברזל וכביש
           light_rail: רכבת קלה
@@ -840,7 +825,6 @@ he:
           hairdresser: מעצב שער
           hardware: חנות חומרי בניין
           hifi: ציוד מוזיקה
-          insurance: ביטוח
           jewelry: חנות תכשיטים
           kiosk: קיוסק
           laundry: מכבסה
@@ -856,10 +840,8 @@ he:
           pet: חנות חיות מחמד
           pharmacy: בית מרקחת
           photo: חנות צילום
-          salon: סלון
           second_hand: חנות יד שנייה
           shoes: חנות נעליים
-          shopping_centre: מרכז קניות
           sports: חנות ספורט
           stationery: חנות כלי כתיבה
           supermarket: סופרמרקט
@@ -2324,9 +2306,6 @@ he:
         mapquest_car: במכונית (MapQuest)
         mapquest_foot: ברגל (MapQuest)
         osrm_car: במכונית (ORSM)
-        mapzen_bicycle: באופניים (Mapzen)
-        mapzen_car: במכונית (Mapzen)
-        mapzen_foot: ברגל (Mapzen)
       descend: מטה
       directions: כיוונים
       distance: מרחק
index 636a7cad2d9a88595dd20f91118bca3920b61084..d48a0ff547411358e3776e2743bf7b2c1d4a79fb 100644 (file)
@@ -444,33 +444,26 @@ hr:
           crematorium: Krematorij
           dentist: Zubar
           doctors: Doktor
-          dormitory: Studentski dom
           drinking_water: Pitka voda
           driving_school: Autoškola
           embassy: Veleposlanstvo
-          emergency_phone: Telefon (S.O.S)
           fast_food: Fast food
           ferry_terminal: Trajektni terminal
-          fire_hydrant: Hidrant
           fire_station: Vatrogasna postaja
           food_court: Blagovaonski kutak
           fountain: Fontana
           fuel: Benzinska
           gambling: Kockarnica
           grave_yard: Groblje
-          gym: Fitness centar
-          health_centre: Zdravstveni centar
           hospital: Bolnica
           hunting_stand: Čeka
           ice_cream: Slastičarna
           kindergarten: Dječji vrtić
           library: Knjižnica
-          market: Tržnica
           marketplace: Tržnica
           monastery: Samostan
           motorcycle_parking: Parking za motocikle
           nightclub: Noćni klub
-          nursery: Čuvanje djece
           nursing_home: Starački dom
           office: Kancelarija
           parking: Parking
@@ -484,7 +477,6 @@ hr:
           prison: Zatvor
           pub: Pub
           public_building: Ustanova
-          reception_area: Recepcija
           recycling: Reciklažna točka
           restaurant: Restoran
           retirement_home: Dom za starije osobe
@@ -580,7 +572,6 @@ hr:
           trunk: Cesta rezervirana za motorna vozila
           trunk_link: Cesta rezrevirana za mot. voz. - prilazna cesta
           unclassified: Nerazvrstana cesta
-          unsurfaced: Neasfaltirana cesta
           "yes": Cesta
         historic:
           archaeological_site: Arheološko nalazište
@@ -640,7 +631,6 @@ hr:
           vineyard: Vinograd
         leisure:
           beach_resort: Plaža
-          club: Klub
           common: Općinsko zemljište
           dog_park: Park za pse
           fishing: Ribičko područje
@@ -721,7 +711,6 @@ hr:
           ngo: Ured nedržavne organizacije
           "yes": Ured
         place:
-          airport: Zračna luka
           city: Grad
           country: Država
           county: Županija/grofovija
@@ -732,7 +721,6 @@ hr:
           island: Otok
           islet: Otočić
           locality: Lokalitet
-          moor: Močvara
           municipality: Općina
           postcode: Poštanski broj
           region: Područje
@@ -748,10 +736,8 @@ hr:
           abandoned: Napuštena pruga
           construction: Pruga u izgradnji
           disused: Napuštena pruga
-          disused_station: Željeznička stanica (nije u upotrebi)
           funicular: Uspinjača
           halt: Željeznička stanica
-          historic_station: Povijesna željeznička stanica
           junction: Željeznički čvor
           level_crossing: Pružni prijelaz
           light_rail: Laka željeznica
@@ -815,7 +801,6 @@ hr:
           hairdresser: Frizer
           hardware: Željezar
           hifi: Hi-Fi
-          insurance: Osiguranje
           jewelry: Zlatarna
           kiosk: Kiosk
           laundry: Praonica rublja
@@ -831,9 +816,7 @@ hr:
           pet: Trgovina za kućne ljubimce
           pharmacy: Ljekarna
           photo: Fotograf
-          salon: Salon
           shoes: Trgovina obućom
-          shopping_centre: Trgovački centar
           sports: Trgovina sportskom opremom
           stationery: Papirnica
           supermarket: Supermarket
@@ -2050,9 +2033,6 @@ hr:
         mapquest_car: Automobil (MapQuest)
         mapquest_foot: Pješke (MapQuest)
         osrm_car: Automobil (OSRM)
-        mapzen_bicycle: Bicikl (Mapzen)
-        mapzen_car: Automobil (Mapzen)
-        mapzen_foot: Pješke (Mapzen)
       descend: Silazno
       directions: Upute
       distance: Udaljenost
index 756e2e76caa079d12b444ea791c80c2f0cafcffa..7f09bcb83b567fc341d263dbd8786dd574ae45b0 100644 (file)
@@ -439,33 +439,26 @@ hsb:
           crematorium: Krematorij
           dentist: Zubny lěkar
           doctors: Lěkarjo
-          dormitory: Internat
           drinking_water: Pitna woda
           driving_school: Jězbna šula
           embassy: Wulkopósłanstwo
-          emergency_phone: Nuzowy telefon
           fast_food: Přikuski
           ferry_terminal: Přewozny přistaw
-          fire_hydrant: Wohnjowy hydrant
           fire_station: Wohnjostraža
           food_court: Food Court
           fountain: Studnja
           fuel: Tankownja
           gambling: Hra wo zbožo
           grave_yard: Kěrchow
-          gym: Fitnesowy center/Fitnesowe studijo
-          health_centre: Strowotny centrum
           hospital: Chorownja
           hunting_stand: Łakańca
           ice_cream: Jědźny lód
           kindergarten: Pěstowarnja
           library: Knihownja
-          market: Wiki
           marketplace: Torhošćo
           monastery: klóšter
           motorcycle_parking: parkowanišćo za motorske
           nightclub: Nócny klub
-          nursery: Pěstowarnja
           nursing_home: Hladarnja
           office: Běrow
           parking: Parkowanišćo
@@ -479,7 +472,6 @@ hsb:
           prison: Jastwo
           pub: Korčma
           public_building: Zjawne twarjenje
-          reception_area: Přijimanski wobłuk
           recycling: Přijimarnja starowiznow
           restaurant: Hosćenc
           retirement_home: Starownja
@@ -575,7 +567,6 @@ hsb:
           trunk: Dalokodróha
           trunk_link: Dalokodróha
           unclassified: Njezarjadowana dróha
-          unsurfaced: Njewobtwjerdźena dróha
           "yes": dróha
         historic:
           archaeological_site: Archeologiske wurywanišćo
@@ -640,7 +631,6 @@ hsb:
         leisure:
           beach_resort: Mórske kupjele
           bird_hide: Ptači schow
-          club: towarstwo
           common: Gmejnski kraj
           dog_park: psyči park
           fishing: Rybnišćo
@@ -733,8 +723,6 @@ hsb:
           "yes": Běrow
         place:
           allotments: małozahrodki
-          block: blok
-          airport: Lětanišćo
           city: Wulkoměsto
           country: Kraj
           county: Wokrjes
@@ -746,7 +734,6 @@ hsb:
           islet: Kupka
           isolated_dwelling: Jednotliwe bydło
           locality: Sydlišćo
-          moor: Bahno
           municipality: Gmejna
           neighbourhood: Bydlenski wobwod
           postcode: Postowe wodźenske čisło
@@ -763,10 +750,8 @@ hsb:
           abandoned: Rozpušćena železnica
           construction: Železnica so twari
           disused: Zastajena železnica
-          disused_station: Zawrjene dwórnišćo
           funicular: Powjaznica
           halt: Železniske zastanišćo
-          historic_station: Historiske dwórnišćo
           junction: Železniske křižnišćo
           level_crossing: Železniski přechod
           light_rail: Měšćanska železnica
@@ -830,7 +815,6 @@ hsb:
           hairdresser: Frizerski salon
           hardware: Twarske wiki
           hifi: Hi-fi
-          insurance: Zawěsćernja
           jewelry: Debjenkowy wobchod
           kiosk: Kiosk
           laundry: Myjernja
@@ -846,10 +830,8 @@ hsb:
           pet: Coowobchod
           pharmacy: Lěkarnja
           photo: Fotograf
-          salon: Salon
           second_hand: Nakupowanišćo
           shoes: Wobchod črijow
-          shopping_centre: Nakupowanišćo
           sports: Sportowy wobchod
           stationery: Papjernistwo
           supermarket: Superwiki
@@ -2321,9 +2303,6 @@ hsb:
         mapquest_car: Awto (MapQuest)
         mapquest_foot: Pěši (MapQuest)
         osrm_car: Awto (OSRM)
-        mapzen_bicycle: Koleso (Mapzen)
-        mapzen_car: Awto (Mapzen)
-        mapzen_foot: Pěši (Mapzen)
       directions: Směry
       distance: Zdalenosć
       errors:
index fda5a82782fe20cac418c7d24d3f25087c3c0459..28d0c971a629273c4fc03d4e655bf6da96177a02 100644 (file)
@@ -3,6 +3,7 @@
 # Export driver: phpyaml
 # Author: Athoss
 # Author: BanKris
+# Author: Bencemac
 # Author: BáthoryPéter
 # Author: City-busz
 # Author: Csega
@@ -150,6 +151,8 @@ hu:
         title_comment: 'Módosításcsomag: %{id} - %{comment}'
       join_discussion: Jelentkezz be, hogy bekapcsolódhass a megbeszélésbe
       discussion: Megbeszélés
+      still_open: A módosításcsomag még nyitva van – a megbeszélés akkor nyílik meg,
+        ha a módosításcsomag lezárul.
     node:
       title: 'Pont: %{name}'
       history_title: 'Pont történet: %{name}'
@@ -199,8 +202,8 @@ hu:
         way: vonal
         relation: kapcsolat
     start_rjs:
-      feature_warning: '%{num_features} adat ábrázolása jelentősen lassíthatja a böngészőt.
-        Biztos hogy meg akarod jeleníteni ezen adatokat?'
+      feature_warning: '%{num_features} objektum ábrázolása jelentősen lassíthatja
+        a böngészőt. Biztos hogy meg akarod jeleníteni ezeket az adatokat?'
       load_data: Adatok betöltése
       loading: Betöltés…
     tag_details:
@@ -312,12 +315,12 @@ hu:
     diary_entry:
       posted_by: '%{link_user} küldte ekkor: %{created} %{language_link} nyelven'
       comment_link: Hozzászólás ehhez a bejegyzéshez
-      reply_link: Válasz ezen bejegyzésre
+      reply_link: Válasz a bejegyzésre
       comment_count:
         one: Egy hozzászólás
         zero: Nincs hozzászólás
         other: '%{count} hozzászólás'
-      edit_link: Ezen bejegyzés szerkesztése
+      edit_link: Bejegyzés szerkesztése
       hide_link: Bejegyzés elrejtése
       confirm: Megerősítés
     diary_comment:
@@ -357,7 +360,7 @@ hu:
       map_image: Térkép (Alapértelmezett réteg)
       embeddable_html: Beágyazható HTML
       licence: Licenc
-      export_details: Az OpenStreetMap adatokra az <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: Az OpenStreetMap adatokra az <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database licenc </a> vonatkozik. (ODbL)
       too_large:
         advice: Ha a fenti exportálás sikertelen lenne, próbáld meg az alábbi listából
@@ -397,14 +400,14 @@ hu:
   geocoder:
     search:
       title:
-        latlon: Eredmények az <a href="http://openstreetmap.org/">Internal</a>ról
+        latlon: Eredmények az <a href="https://openstreetmap.org/">Internal</a>ról
         uk_postcode: Eredmények a <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>-ról
-        ca_postcode: Eredmények a <a href="http://geocoder.ca/">Geocoder.CA</a>-ről
-        osm_nominatim: Eredmények az <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Eredmények a <a href="https://geocoder.ca/">Geocoder.CA</a>-ről
+        osm_nominatim: Eredmények az <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>tól
         geonames: Eredmények a <a href="http://www.geonames.org/">GeoNames</a>ről
-        osm_nominatim_reverse: Eredmények az <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Eredmények az <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatimról</a>
         geonames_reverse: Eredmények a <a href="http://www.geonames.org/">GeoNames-ről</a>
     search_osm_nominatim:
@@ -454,33 +457,26 @@ hu:
           crematorium: Krematórium
           dentist: Fogorvos
           doctors: Orvosi rendelő
-          dormitory: Kollégium
           drinking_water: Ivóvíz
           driving_school: Autósiskola
           embassy: Nagykövetség
-          emergency_phone: Segélyhívó
           fast_food: Gyorsétterem
           ferry_terminal: Kompkikötő
-          fire_hydrant: Tűzcsap
           fire_station: Tűzoltóság
           food_court: Ételudvar
           fountain: Szökőkút
           fuel: Benzinkút
           gambling: Szerencsejáték
           grave_yard: Kis temető
-          gym: Fitnesz- / Tornaterem
-          health_centre: Egészségügyi központ
           hospital: Kórház
           hunting_stand: Magasles
           ice_cream: Jégkrém
           kindergarten: Óvoda
           library: Könyvtár
-          market: Piac
           marketplace: Vásártér
           monastery: Kolostor
           motorcycle_parking: Motoros parkoló
           nightclub: Éjszakai bár
-          nursery: Óvoda
           nursing_home: Idősek otthona
           office: Iroda
           parking: Parkoló
@@ -494,7 +490,6 @@ hu:
           prison: Börtön
           pub: Kocsma
           public_building: Középület
-          reception_area: Recepció
           recycling: Szelektív hulladékgyűjtő
           restaurant: Étterem
           retirement_home: Nyugdíjasotthon
@@ -590,7 +585,6 @@ hu:
           trunk: Autóút
           trunk_link: Autóút
           unclassified: Egyéb út
-          unsurfaced: Burkolatlan út
           "yes": Út
         historic:
           archaeological_site: Régészeti lelőhely
@@ -655,7 +649,6 @@ hu:
         leisure:
           beach_resort: Tengerparti üdülőhely
           bird_hide: Madárles
-          club: Klub
           common: Közös terület
           dog_park: Kutyapark
           fishing: Horgászterület
@@ -748,8 +741,6 @@ hu:
           "yes": Iroda
         place:
           allotments: Veteményeskertek
-          block: Blokk
-          airport: Repülőtér
           city: Nagyváros
           country: Ország
           county: Megye
@@ -761,7 +752,6 @@ hu:
           islet: Kis sziget
           isolated_dwelling: Elszigetelt épület
           locality: Hely
-          moor: Mocsár
           municipality: Település
           neighbourhood: Szomszédság
           postcode: Irányítószám
@@ -778,10 +768,8 @@ hu:
           abandoned: Felhagyott vasút
           construction: Építés alatt álló vasút
           disused: Használaton kívüli vasút
-          disused_station: Használaton kívüli vasútállomás
           funicular: Siklóvasút
           halt: Vasúti megállóhely
-          historic_station: Történelmi vasútállomás
           junction: Vasúti csomópont
           level_crossing: Vasúti átjáró
           light_rail: HÉV
@@ -845,7 +833,6 @@ hu:
           hairdresser: Fodrászat
           hardware: Szerelési bolt
           hifi: Hi-Fi bolt
-          insurance: Biztosító
           jewelry: Ékszerbolt
           kiosk: Trafik
           laundry: Mosoda
@@ -861,10 +848,8 @@ hu:
           pet: Állatkereskedés
           pharmacy: Gyógyszertár
           photo: Fotóbolt
-          salon: Szalon
           second_hand: Használtcikk kereskedés
           shoes: Cipőbolt
-          shopping_centre: Bevásárlóközpont
           sports: Sportbolt
           stationery: Írószerbolt
           supermarket: Szupermarket
@@ -927,7 +912,7 @@ hu:
         level10: Városrészhatár
     description:
       title:
-        osm_nominatim: Helyek az <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Helyek az <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>tól
         geonames: Helyek a <a href="http://www.geonames.org/">GeoNames</a>ről
       types:
@@ -1003,24 +988,24 @@ hu:
       title_html: Szerzői jog és licenc
       intro_1_html: |-
         Az OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> egy <i>szabad adathalmaz</i>, amelyet az <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> licenc (ODbL) alatt tett közzé az <a
-        href="http://osmfoundation.org/">OpenStreetMap Alapítvány</a> (OSMF).
+        href="https://osmfoundation.org/">OpenStreetMap Alapítvány</a> (OSMF).
       intro_2_html: |2-
           Szabadon másolhatod, terjesztheted, továbbíthatod és átdolgozhatod adatainkat mindaddig, amíg feltünteted az OpenStreetMapot és közreműködőit. Ha módosítod vagy felhasználod az adatainkat, akkor az eredményt is csak azonos licenccel terjesztheted. A teljes <a
-          href="http://opendatacommons.org/licenses/odbl/1.0/">jogi
+          href="https://opendatacommons.org/licenses/odbl/1.0/">jogi
           szabályzat</a> ismerteti a jogaidat és kötelezettségeidet.
       intro_3_html: |2-
            Az OpenStreetMap <i>térképeire</i> a <a
-           href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+           href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
            Commons Nevezd meg! - Így add tovább! 2.0</a> licenc (CC BY-SA) vonatkozik.
       credit_title_html: Hogyan kell feltüntetned az OpenStreetMapot?
       credit_1_html: Kérjük, hogy forrásként a &ldquo;&copy; OpenStreetMap közreműködők&rdquo;
         szöveget tüntesd fel.
       credit_2_html: Azt is egyértelművé kell tenned, hogy az adatok az Open Database
         Licenc alatt elérhetőek, illetve ha a mi térkép csempéinket használod akkor
-        azt, hogy a grafikai megjelenítés a CC-BY-SA licenc feltételeivel használható.
-        Ezt megteheted egy erre a <a href="http://www.openstreetmap.org/copyright">copyright
+        azt, hogy a grafikai megjelenítés a CC BY-SA licenc feltételeivel használható.
+        Ezt megteheted egy erre a <a href="https://www.openstreetmap.org/copyright">copyright
         oldalra</a> való hivatkozással. Alternatívaként, ha az OSM-et adatokként terjeszted,
         akkor fel kell tüntetned a nevet és linket közvetlenül a licencre. Ha a formátum
         a linkelést nem teszi lehetővé (pl. nyomtatásban), javasoljuk, hogy a felhasználókat
@@ -1037,7 +1022,7 @@ hu:
       more_title_html: Tudj meg többet!
       more_1_html: |-
         További információ adataink használatáról az <a
-        href="http://osmfoundation.org/License">OSMF Licenc lapon</a>.
+        href="https://osmfoundation.org/License">OSMF Licenc lapon</a>.
       more_2_html: |-
         Habár az OpenStreetMap egy nyílt adatforrás, nem tudunk ingyenes térkép API elérést biztosítani a harmadik feleknek.
 
@@ -1048,24 +1033,24 @@ hu:
         többek között:'
       contributors_at_html: |-
         <strong>Ausztria</strong>: adatokat tartalmaz a következő forrásból:
-           <a href="http://data.wien.gv.at/">Bécs városa</a>
-           <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a> licenc alatt.
+           <a href="https://data.wien.gv.at/">Bécs városa</a>
+           <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a> licenc alatt.
       contributors_ca_html: |-
         <strong>Kanada</strong>: adatokat tartalmaz a következő forrásokból:
            GeoBase&reg;, GeoGratis (&copy; Department of Natural
            Resources Canada), CanVec (&copy; Department of Natural
            Resources Canada), and StatCan (Geography Division,
            Statistics Canada).
-      contributors_fi_html: "<strong>Finnország</strong>: Adatokat tartalmaz akövetkező
+      contributors_fi_html: "<strong>Finnország</strong>: Adatokat tartalmaz a következő
         forrásokból: \nNational Land Survey of Finland's Topographic Database\nés
-        más adatforrások a  href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">NLSFI
-        License</a> alatt."
+        más adatforrások <a href=\"https://www.maanmittauslaitos.fi/en/opendata-licence-version1\"></a>NLSFI
+        licenc alatt."
       contributors_fr_html: |-
         <strong>France</strong>: adatokat tartalmaz a következő forrásból:
            Direction Générale des Impôts.
       contributors_nl_html: |-
         <strong>Hollandia</strong>: adatokat tartalmaz innen: Automotive Navigation Data, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Új-Zéland</strong>: adatokat tartalmaz a következő forrásból:
            Land Information New Zealand. Szerzői jog fenntartva.
@@ -1081,7 +1066,7 @@ hu:
         adatokat &copy; Királyi szerzői és adatbázisjog \n2010 - 12."
       contributors_footer_1_html: |-
         További részletekért, és az OpenStreetMap javításához használt más forrásokról,
-        kérjük, olvassa el <a href="http://wiki.openstreetmap.org/wiki/contributors">a hozzájárulók oldalát
+        kérjük, olvassa el <a href="https://wiki.openstreetmap.org/wiki/contributors">a hozzájárulók oldalát
         az OpenStreetMap wikin.</a>
       contributors_footer_2_html: |2-
           Az adatok befoglalása az OpenStreetMapba nem jelenti azt, hogy az eredeti
@@ -1093,13 +1078,13 @@ hu:
           szerzői jogvédett forrásból se (pl. Google Térkép vagy nyomtatott térképek) a
           szerzői jog tulajdonosának kifejezett engedélye nélkül.
       infringement_2_html: |-
-        Ha úgy gondolod, hogy jogvédett anyag került jogszerűtlenül az OpenStreetMap adatbázisba vagy erre a weblapra, kérjük olvasd el az <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">eltávolítási
+        Ha úgy gondolod, hogy jogvédett anyag került jogszerűtlenül az OpenStreetMap adatbázisba vagy erre a weblapra, kérjük olvasd el az <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">eltávolítási
         folyamat leírását</a> vagy jelentsd be közvetlenül az
         <a href="http://dmca.openstreetmap.org/">online bejelentő oldalon</a>.
       trademarks_title_html: <span id="trademarks"></span>Védjegyek
       trademarks_1_html: OpenStreetMap, a nagyító ikon és a State of the Map az OpenStreetMap
         Foundation bejegyzett védjegyei. Ha kérdése van ezek felhasználásával kapcsolatban,
-        kérem küldje el a kérdéseit a <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence
+        kérem küldje el a kérdéseit a <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licence
         Working Group</a> részére.
   welcome_page:
     title: Üdvözlet!
@@ -1132,8 +1117,8 @@ hu:
       paragraph_1_html: "Az openStreetMap-nek van néhány formális szabálya is de alapvetően
         minden résztvevőtől azt várjuk el hogy együttműködjön és kommunikáljon a közösség
         többi tagjával. Ha bármilyen kézi szerkesztésen túlmutató tevékenységet tervezel
-        akkor kérjük, hogy olvasd el az erről szóló útmutatókat az \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importálásról</a>
-        és az \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatikus
+        akkor kérjük, hogy olvasd el az erről szóló útmutatókat az \n<a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Importálásról</a>
+        és az \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatikus
         szerkesztésekről</a> szóló lapokon."
     questions:
       title: Kérdésed van?
@@ -1166,7 +1151,7 @@ hu:
       title: Egyéb aggályok
       explanation_html: Ha kérdése merül fel az adataink felhasználásáról, vagy a
         tartalomról, akkor keresse fel a <a href='/copyright'>szerzői jogi oldalunkat</a>
-        a további jogi információkért, vagy lépjen kapcsolatba a megfelelő <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF
+        a további jogi információkért, vagy lépjen kapcsolatba a megfelelő <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF
         munkacsoportot</a>.
   help_page:
     title: Segítségkérés
@@ -1178,7 +1163,7 @@ hu:
       title: Üdvözlünk az OSM-en
       description: Eza gyors útmutató megismertet az OpenStreetMap alapjaival.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Hu:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Hu:Beginners%27_guide
       title: Kezdők kézikönyve
       description: A közösség által karbantartott útmutató kezdőknek.
     help:
@@ -1222,8 +1207,8 @@ hu:
       technikusok, katasztrófa-sújtotta területeket térképező önkéntesek működnek
       közre a térkép szerkesztésében. Ha többet szeretnél megtudni a közösségről,
       lásd az <a href='https://blog.openstreetmap.org'>OpenStreetMap Blogot</a>, a
-      <a href='%{diary_path}'>felhasználói naplókat</a>, a <a href='http://blogs.openstreetmap.org/'>közösségi
-      blogokat</a>, és az <a href='http://www.osmfoundation.org/'>OSM Foundation</a>
+      <a href='%{diary_path}'>felhasználói naplókat</a>, a <a href='https://blogs.openstreetmap.org/'>közösségi
+      blogokat</a>, és az <a href='https://www.osmfoundation.org/'>OSM Foundation</a>
       weboldalát.
     open_data_title: Szabad adatok
     open_data_html: 'Az OpenStreetMap <i>szabad adatokból</i> áll: szabadon használhatod
@@ -1233,9 +1218,9 @@ hu:
       a részletekért.'
     legal_title: Jogi segítség
     legal_html: |-
-      Az oldalt és sok kapcsolódó szolgáltatást formálisan az <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) üzemelteti, a közösség nevében. Az összes OSMF által üzemeltetett szolgáltatásra vonatkoznak az <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Elfogadható felhasználási irányelvek</a>, és az <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Adatvédelmi nyilatkozat</a>.
+      Az oldalt és sok kapcsolódó szolgáltatást formálisan az <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) üzemelteti, a közösség nevében. Az összes OSMF által üzemeltetett szolgáltatásra vonatkoznak az <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Elfogadható felhasználási irányelvek</a>, és az <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Adatvédelmi nyilatkozat</a>.
       <br>
-      <a href='http://osmfoundation.org/Contact'>Lépjen kapcsolatba az OSMF-fel</a>, ha licencelési, szerzői jogi vagy más jogi kérdése vagy problémája van.
+      <a href='https://osmfoundation.org/Contact'>Lépjen kapcsolatba az OSMF-fel</a>, ha licencelési, szerzői jogi vagy más jogi kérdése vagy problémája van.
     partners_title: Partnerek
   notifier:
     diary_comment_notification:
@@ -1446,14 +1431,14 @@ hu:
       user_page_link: felhasználói oldal
       anon_edits_link_text: Nézz utána, miért van ez.
       flash_player_required: A Potlatch, az OpenStreetMap Flash szerkesztő használatához
-        Flash Player szükséges. <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Letöltheted
-        a Flash Playert az Adobe.com-ról</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Számos
+        Flash Player szükséges. <a href="https://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Letöltheted
+        a Flash Playert az Adobe.com-ról</a>. <a href="https://wiki.openstreetmap.org/wiki/Editing">Számos
         más lehetőség</a> is elérhető az OpenStreetMap szerkesztéséhez.
       potlatch_unsaved_changes: Nem mentett módosítások vannak. (Potlatchban való
         mentéshez szüntesd meg a jelenlegi vonal vagy pont kijelölését, ha élő módban
         szerkesztesz, vagy kattints a mentésre, ha van mentés gomb.)
       potlatch2_not_configured: 'A Potlatch 2 nincs beállítva – további információért
-        lásd: http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2'
+        lásd: https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2'
       potlatch2_unsaved_changes: Mentetlen módosításaid vannak. (A mentéshez a Potlatch
         2-ben kattintanod kell a mentésre.)
       id_not_configured: Az iD nincs beállítva
@@ -1545,7 +1530,7 @@ hu:
       edit: Szerkeszt
       preview: Előnézet
     markdown_help:
-      title_html: 'Megjelenítés: <a href="http://daringfireball.net/projects/markdown/">Markdown</a>'
+      title_html: 'Megjelenítés: <a href="https://daringfireball.net/projects/markdown/">Markdown</a>'
       headings: Címsorok
       heading: Címsor
       subheading: Alcím
@@ -1621,8 +1606,8 @@ hu:
       description: 'Leírás:'
       tags: 'Címkék:'
       none: nincsenek
-      edit_track: Ezen nyomvonal szerkesztése
-      delete_track: Ezen nyomvonal törlése
+      edit_track: Nyomvonal szerkesztése
+      delete_track: Nyomvonal törlése
       trace_not_found: Nem található nyomvonal!
       visibility: 'Láthatóság:'
     trace_paging_nav:
@@ -1652,7 +1637,7 @@ hu:
       description: Legfrissebb GPS nyomvonalak tallózása
       tagged_with: ' %{tags} címkével'
       empty_html: Még nincs mit megjeleníteni. <a href='%{upload_link}'>Tölts fel
-        új nyomvonalat</a>, vagy olvass bővebben a GPS nyomvonalrögzítésről a <a href='http://wiki.openstreetmap.org/wiki/HU:Beginners_Guide_1.2'>wiki
+        új nyomvonalat</a>, vagy olvass bővebben a GPS nyomvonalrögzítésről a <a href='https://wiki.openstreetmap.org/wiki/HU:Beginners_Guide_1.2'>wiki
         lapon</a>.
     delete:
       scheduled_for_deletion: A nyomvonal törlésre kijelölve
@@ -1863,11 +1848,11 @@ hu:
           <p>Ellentétben más térképekkel, az OpenStreetMapet teljes mértékben hozzád hasonló emberek készítik és bárki szabadon javíthatja, frissítheti, letöltheti vagy felhasználhatja.</p>
           <p>Regisztrálj és máris kezdheted a térképszerkesztést. Egy jóváhagyó e-mailt fogunk küldeni a címedre.</p>
       license_agreement: Amikor megerősíted a felhasználói fiókodat, el kell fogadnod
-        a <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">hozzájárulási
+        a <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">hozzájárulási
         feltételeket</a>.
       email address: 'E-mail cím:'
       confirm email address: 'E-mail cím megerősítése:'
-      not displayed publicly: Nem jelenik meg nyilvánosan (lásd <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: Nem jelenik meg nyilvánosan (lásd <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="a wiki adatvédelmi irányelvei tartalmazzák az e-mail címekről szóló
         részt">adatvédelmi irányelvek</a>)
       display name: 'Megjelenítendő név:'
@@ -1964,13 +1949,13 @@ hu:
       block_history: Aktív blokkolások
       moderator_history: Kiosztott blokkolások
       comments: Megjegyzések
-      create_block: ezen felhasználó blokkolása
-      activate_user: ezen felhasználó aktiválása
-      deactivate_user: ezen felhasználó deaktiválása
-      confirm_user: ezen felhasználó megerősítése
-      hide_user: ezen felhasználó elrejtése
-      unhide_user: ezen felhasználó elrejtésének megszüntetése
-      delete_user: ezen felhasználó törlése
+      create_block: felhasználó blokkolása
+      activate_user: felhasználó aktiválása
+      deactivate_user: felhasználó deaktiválása
+      confirm_user: felhasználó megerősítése
+      hide_user: felhasználó elrejtése
+      unhide_user: felhasználó elrejtésének megszüntetése
+      delete_user: felhasználó törlése
       confirm: Megerősítés
       friends_changesets: Ismerőseid módosításcsomagjai
       friends_diaries: barátok naplóbejegyzései
@@ -1988,12 +1973,12 @@ hu:
       email never displayed publicly: (soha nem jelenik meg nyilvánosan)
       external auth: 'Külső Hitelesítés:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: mi ez?
       public editing:
         heading: 'Nyilvános szerkesztés:'
         enabled: Engedélyezve. Nem vagy névtelen, így szerkesztheted az adatokat.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: mi ez?
         disabled: Tiltva, így nem szerkesztheted az adatokat, az összes eddigi szerkesztés
           névtelen.
@@ -2005,7 +1990,7 @@ hu:
           szerkesztettél, és megengedd az embereknek, hogy a webhelyen keresztül kapcsolatba
           lépjenek veled, kattints az alábbi gombra. <b>A 0.6 API-ra történt átállás
           óta csak nyilvános felhasználók szerkeszthetik a térképadatokat</b>. (<a
-          href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">nézz utána, miért</a>).<ul><li>Az
+          href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">nézz utána, miért</a>).<ul><li>Az
           e-mail címed nem kerül felfedésre azzal, hogy nyilvános leszel.</li><li>Ez
           a művelet nem vonható vissza, és alapértelmezésben az összes új felhasználó
           már nyilvános.</li></ul>
@@ -2133,6 +2118,8 @@ hu:
       not_a_role: A '%{role}' kifejezés nem érvényes szerep.
       already_has_role: A felhasználó szerepe már %{role}.
       doesnt_have_role: A felhasználó szerepe nem %{role}.
+      not_revoke_admin_current_user: Nem lehet visszavonni az aktuális felhasználó
+        adminisztrátorjogát.
     grant:
       title: Szerep kiosztásának megerősítése
       heading: Szerep kiosztásának megerősítése
@@ -2180,7 +2167,7 @@ hu:
         zsargont, ezért próbálj laikus nyelvezetet használni.
       period: Mennyi ideig lesz a felhasználó blokkolva az API-tól, mostantól számítva.
       submit: Blokkolás frissítése
-      show: Ezen blokkolás megjelenítése
+      show: blokkolás megjelenítése
       back: Összes blokkolás megjelenítése
       needs_view: Be kell jelentkeznie a felhasználónak, mielőtt a blokkolás feloldódik?
     filter:
@@ -2324,8 +2311,8 @@ hu:
       base:
         standard: Alapértelmezett
         cycle_map: Kerékpártérkép
-        transport_map: Tömegközlekedési térkép
-        hot: Humanitáriánus
+        transport_map: Tömegközlekedés
+        hot: Humanitárius
       layers:
         header: Térképnézetek
         notes: Térképjegyzetek
@@ -2354,9 +2341,11 @@ hu:
     notes:
       new:
         intro: Hibát találtál vagy valami hiányzik? Tudasd a többi térképezővel, hogy
-          javítani tudjuk. Mozgasd a jelölőt a megfelelő helyre és minél pontosabban
-          írd le a problémát. (Kérjük itt ne adj meg személyes adatokat vagy jogvédett
-          térképről vagy katalógusokból származó információkat.)
+          javítani tudjuk. Mozgasd a jelölőt a megfelelő helyre, és minél pontosabban
+          írd le a problémát.
+        advice: A jegyzeted nyilvános és használható a térkép frissítéséhez, ezért
+          ne adj meg személyes adatokat vagy jogvédett térképről vagy katalógusokból
+          származó információkat.
         add: Jegyzet hozzáadása
       show:
         anonymous_warning: Ez a jegyzet anonim felhasználók megjegyzéseit is tartalmazza
@@ -2378,9 +2367,6 @@ hu:
         mapquest_car: Autó (MapQuest)
         mapquest_foot: Gyalog (MapQuest)
         osrm_car: Autó (OSRM)
-        mapzen_bicycle: Kerékpár (Mapzen)
-        mapzen_car: Autó (Mapzen)
-        mapzen_foot: Gyalog (Mapzen)
       descend: Ereszkedés
       directions: Irányok
       distance: Távolság
index 4f810c5d288b5545fbc137e0bb69e523c3ebd393..8c27c2c036366d627ff6a5ef8bf724c1cfee2bc6 100644 (file)
@@ -441,33 +441,26 @@ ia:
           crematorium: Crematorio
           dentist: Dentista
           doctors: Medicos
-          dormitory: Dormitorio
           drinking_water: Aqua potabile
           driving_school: Autoschola
           embassy: Ambassada
-          emergency_phone: Telephono de emergentia
           fast_food: Fast food
           ferry_terminal: Terminal de ferry
-          fire_hydrant: Hydrante de incendio
           fire_station: Caserna de pumperos
           food_court: Zona de restaurantes
           fountain: Fontana
           fuel: Carburante
           gambling: Joco de hasardo
           grave_yard: Cemeterio
-          gym: Centro de fitness / Gymnasio
-          health_centre: Centro de sanitate
           hospital: Hospital
           hunting_stand: Posto de chassa
           ice_cream: Gelato
           kindergarten: Schola pro juvene infantes
           library: Bibliotheca
-          market: Mercato
           marketplace: Mercato
           monastery: Monasterio
           motorcycle_parking: Parking a motocyclo
           nightclub: Club nocturne
-          nursery: Sala recreative pro parve infantes
           nursing_home: Casa de convalescentia
           office: Officio
           parking: Parking
@@ -481,7 +474,6 @@ ia:
           prison: Prision
           pub: Taverna
           public_building: Edificio public
-          reception_area: Area de reception
           recycling: Puncto de recyclage
           restaurant: Restaurante
           retirement_home: Residentia pro vetere personas
@@ -577,7 +569,6 @@ ia:
           trunk: Via national
           trunk_link: Via national
           unclassified: Via non classificate
-          unsurfaced: Cammino de terra
           "yes": Cammino
         historic:
           archaeological_site: Sito archeologic
@@ -642,7 +633,6 @@ ia:
         leisure:
           beach_resort: Loco de vacantias al plagia
           bird_hide: Observatorio de aves
-          club: Club
           common: Terreno commun
           dog_park: Parco pro canes
           fishing: Area de pisca
@@ -735,8 +725,6 @@ ia:
           "yes": Officio
         place:
           allotments: Jardines familial
-          block: Bloco
-          airport: Aeroporto
           city: Citate
           country: Pais
           county: Contato
@@ -748,7 +736,6 @@ ia:
           islet: Insuletta
           isolated_dwelling: Habitation isolate
           locality: Localitate
-          moor: Landa
           municipality: Municipalitate
           neighbourhood: Quartiero
           postcode: Codice postal
@@ -765,10 +752,8 @@ ia:
           abandoned: Ferrovia abandonate
           construction: Ferrovia in construction
           disused: Ferrovia in disuso
-          disused_station: Station ferroviari in disuso
           funicular: Ferrovia funicular
           halt: Halto de traino
-          historic_station: Station ferroviari historic
           junction: Junction ferroviari
           level_crossing: Passage a nivello
           light_rail: Metro legier
@@ -832,7 +817,6 @@ ia:
           hairdresser: Perruccheria
           hardware: Quincalieria
           hifi: Hi-fi
-          insurance: Assecurantia
           jewelry: Joieleria
           kiosk: Kiosque
           laundry: Lavanderia
@@ -848,10 +832,8 @@ ia:
           pet: Boteca de animales
           pharmacy: Pharmacia
           photo: Magazin de photographia
-          salon: Salon
           second_hand: Magazin de secunde mano
           shoes: Scarperia
-          shopping_centre: Centro commercial
           sports: Magazin de sport
           stationery: Papireria
           supermarket: Supermercato
@@ -949,7 +931,7 @@ ia:
     intro_text: OpenStreetMap es un carta del mundo, create per gente como tu e libere
       de usar sub un licentia aperte.
     intro_2_create_account: Crea un conto de usator
-    partners_html: Le allogiamento web es supportate per %{ucl}, %{ic} e %{bytemark},
+    partners_html: Le allogiamento web es supportate per %{ucl}, %{bytemark}, %{ic}
       e altere %{partners}.
     partners_ucl: UCL
     partners_ic: Imperial College London
@@ -1019,7 +1001,7 @@ ia:
       more_title_html: Pro saper plus
       more_1_html: |-
         Lege plus sur le uso de nostre datos, e como recognoscer nos, in le <a
-        href="http://osmfoundation.org/Licence">pagina de licentia OSMF</a> e in le <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ juridic</a> communitari.
+        href="http://osmfoundation.org/Licence">pagina de licentia OSMF</a>.
       more_2_html: |-
         Ben que OpenStreetMap es datos aperte, nos non pote fornir un API cartographic gratuite pro tertios. Vide nostre <a href="https://operations.osmfoundation.org/policies/api/">politica pro le uso del API</a>,
         <a href="https://operations.osmfoundation.org/policies/tiles">politica pro le uso de tegulas</a>
@@ -1458,7 +1440,7 @@ ia:
       get_directions_title: Indicar le cammino inter duo punctos
       from: De
       to: A
-      where_am_i: Ubi es io?
+      where_am_i: Ubi es isto?
       where_am_i_title: Describer le position actual per medio del motor de recerca
       submit_text: Va
     key:
@@ -2129,6 +2111,8 @@ ia:
       not_a_role: Le catena `%{role}' non es un rolo valide.
       already_has_role: Le usator ha ja le rolo %{role}.
       doesnt_have_role: Le usator non ha le rolo %{role}.
+      not_revoke_admin_current_user: Impossibile revocar le rolo de administrator
+        del usator actual.
     grant:
       title: Confirmar le concession del rolo
       heading: Confirmar le concession del rolo
@@ -2373,9 +2357,6 @@ ia:
         mapquest_car: Auto (MapQuest)
         mapquest_foot: Pedestre (MapQuest)
         osrm_car: Auto (OSRM)
-        mapzen_bicycle: Bicycletta (Mapzen)
-        mapzen_car: Auto (Mapzen)
-        mapzen_foot: Pedestre (Mapzen)
       descend: Descender
       directions: Itinerario
       distance: Distantia
index 915eeed6821015097ff0c631cd8489b9be184e12..429eff633114e72240ce64ad7f6e60445ddae5a0 100644 (file)
@@ -461,33 +461,26 @@ id:
           crematorium: Tempat Kremasi (Pembakaran Mayat)
           dentist: Dokter Gigi
           doctors: Dokter
-          dormitory: Asrama
           drinking_water: Air Minum
           driving_school: Sekolah Mengemudi
           embassy: Kedutaan Besar
-          emergency_phone: Telepon Darurat
           fast_food: Makanan Cepat Saji
           ferry_terminal: Terminal Kapal Feri
-          fire_hydrant: Hidran/Keran Kebakaran
           fire_station: Stasiun Pemadam Kebakaran
           food_court: Tempat Makan
           fountain: Air Mancur
           fuel: Stasiun Pengisian Bahan Bakar
           gambling: Perjudian
           grave_yard: Kuburan
-          gym: Pusat Kebugaran / Gym
-          health_centre: Pusat Kesehatan
           hospital: Rumah Sakit
           hunting_stand: Pos Berburu
           ice_cream: Es Krim
           kindergarten: Taman Kanak-kanak
           library: Perpustakaan
-          market: Pasar
           marketplace: Pasar
           monastery: Biara
           motorcycle_parking: Parkir Motor
           nightclub: Klub Malam
-          nursery: Pendidikan Anak Usia Dini (PAUD)
           nursing_home: Panti Jompo
           office: Kantor
           parking: Parkir
@@ -501,7 +494,6 @@ id:
           prison: Penjara
           pub: Pub
           public_building: Bangunan Publik
-          reception_area: Area Bagian Penerima Tamu
           recycling: Titik Daur Ulang
           restaurant: Restoran
           retirement_home: Rumah Jompo
@@ -597,7 +589,6 @@ id:
           trunk: Jalan Nasional
           trunk_link: Jalan Nasional
           unclassified: Jalan Tidak Terklasifikasi
-          unsurfaced: Jalan Tanpa Permukaan
           "yes": Jalan
         historic:
           archaeological_site: Situs arkeologi
@@ -662,7 +653,6 @@ id:
         leisure:
           beach_resort: Resort Pantai
           bird_hide: Tempat Observasi Burung
-          club: Klub
           common: Lahan Publik
           dog_park: Taman Anjing
           fishing: Tempat Pemancingan
@@ -755,8 +745,6 @@ id:
           "yes": Kantor
         place:
           allotments: Tanah Garapan
-          block: Blok
-          airport: Bandara
           city: Kota
           country: Negara
           county: Provinsi
@@ -768,7 +756,6 @@ id:
           islet: Pulau Kecil
           isolated_dwelling: Daerah Terisolasi
           locality: Lokal
-          moor: Tegalan
           municipality: Kotamadya/Kabupaten
           neighbourhood: Lingkungan
           postcode: Kode Pos
@@ -785,10 +772,8 @@ id:
           abandoned: Rel Kereta Api Terbengkalai
           construction: Rel kereta yang diperbaiki
           disused: Rel Kereta Api Tak Terpakai
-          disused_station: Bekas Stasiun Kereta
           funicular: Trem yang digerakan dengan kabel
           halt: Pemberhentian kereta
-          historic_station: Stasiun Kereta Bersejarah
           junction: Persimpangan Rel
           level_crossing: Perlintasan Bertingkat
           light_rail: Kereta api cepat
@@ -852,7 +837,6 @@ id:
           hairdresser: Penata Rambut
           hardware: Toko Perangkat Keras
           hifi: Hi-Fi
-          insurance: Asuransi
           jewelry: Toko Perhiasan
           kiosk: Kios/Warung
           laundry: Penatu
@@ -868,10 +852,8 @@ id:
           pet: Toko Hewan
           pharmacy: Apotek
           photo: Studio Foto
-          salon: Salon
           second_hand: Toko loak
           shoes: Toko Sepatu
-          shopping_centre: Pusat Perbelanjaan
           sports: Toko Olahraga
           stationery: Toko Alat Tulis
           supermarket: Supermarket
@@ -2402,9 +2384,6 @@ id:
         mapquest_car: Mobil (MapQuest)
         mapquest_foot: Jalan Kaki (MapQuest)
         osrm_car: Mobil (OSRM)
-        mapzen_bicycle: Sepeda (Mapzen)
-        mapzen_car: Mobil (Mapzen)
-        mapzen_foot: Kaki (Mapzen)
       descend: Turun
       directions: Petunjuk Arah
       distance: Jarak
index 439093d6bb41440d6bcc78c86a4ac2fd8fe7f0ff..820088c1195e3f5ec127d0aa1dc9e03e32782fcf 100644 (file)
@@ -99,8 +99,8 @@ is:
       name: Potlatch 2
       description: Potlatch 2 (ritill í vafra)
     remote:
-      name: Fjarstýring
-      description: Fjarstýring (JOSM eða Merkaartor)
+      name: RC-fjarstýring
+      description: RC-fjarstýring (JOSM eða Merkaartor)
   browse:
     created: Búið til
     closed: Lokað
@@ -140,6 +140,8 @@ is:
         title_comment: Breytingasett %{id} - %{comment}
       join_discussion: Skráðu þig inn til að taka þátt í umræðunni
       discussion: Umræða
+      still_open: Breytingasett er enn opið - Umræða mun opnast þegar breytingasettinu
+        hefur verið lokað.
     node:
       title: 'Hnútur: %{name}'
       history_title: 'Saga hnúts: %{name}'
@@ -147,6 +149,9 @@ is:
       title: 'Leið: %{name}'
       history_title: 'Saga leiðar: %{name}'
       nodes: Hnútar
+      also_part_of:
+        one: hluti leiðar %{related_ways}
+        other: hlutar leiða %{related_ways}
     relation:
       title: 'Vensl: %{name}'
       history_title: 'Ferill vensla: %{name}'
@@ -171,7 +176,7 @@ is:
         note: minnispunktur
     timeout:
       sorry: Ekki var hægt að ná í gögn fyrir %{type} með kennitöluna %{id}, það tók
-        of langann tíma að ná í gögnin.
+        of langan tíma að ná í gögnin.
       type:
         node: hnútinn
         way: leiðina
@@ -179,7 +184,10 @@ is:
         changeset: breytingasettið
         note: minnispunktur
     redacted:
-      redaction: Endurskoðun %{id}
+      redaction: Leiðrétting %{id}
+      message_html: Ekki er hægt að birta útgáfu %{version} af þessu %{type} því hún
+        hefur verið endurskoðuð. Endilega skoðaðu %{redaction_link} til að sjá nánari
+        upplýsingar.
       type:
         node: hnút
         way: leið
@@ -245,8 +253,19 @@ is:
       title_friend: Breytingar eftir vini þína
       title_nearby: Breytingar eftir nálæga notendur
       empty: Engin breytingasett fundust.
+      empty_area: Engin breytingasett á þessu svæði.
+      empty_user: Engin breytingasett eftir þennan notanda.
+      no_more: Engin fleiri breytingasett fundust.
+      no_more_area: Engin fleiri breytingasett á þessu svæði.
+      no_more_user: Engin fleiri breytingasett eftir þennan notanda.
       load_more: Hlaða inn fleiri
+    timeout:
+      sorry: Því miður, það tók of langan tíma að ná í listann yfir breytingasett
+        sem þú baðst um.
     rss:
+      title_all: Umræða um OpenStreetMap breytingasett
+      title_particular: 'Umræða um OpenStreetMap breytingasettið #%{changeset_id}'
+      comment: 'Ný athugasemd við breytingasettið #%{changeset_id} eftir %{author}'
       commented_at_html: Uppfært fyrir %{when}
       commented_at_by_html: Uppfært fyrir %{when} af %{user}
       full: Öll umræðan
@@ -336,25 +355,36 @@ is:
       map_image: Kortamynd (sýnir staðallagið)
       embeddable_html: HTML til að bæta á vefsíðu
       licence: Leyfi
-      export_details: OpenStreetMap gögnin eru með <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: OpenStreetMap gögnin eru með <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL) notkunarleyfi.
       too_large:
+        advice: 'Ef útflutningurinn hér að ofan mistekst, íhugaðu að nota einn af
+          gagnagjöfunum sem taldir eru upp hér að neðan:'
         body: Svæðið sem þú ert að reyna að flytja út á OpenStreetMap á XML-sniði
           er of stórt. Auktu aðdráttinn eða veldu smærra svæði, nú eða notaðu eina
           af eftirfarandi leiðum til að flytja inn mikið magn gagna.
         planet:
           title: OSM-plánetan
+          description: Reglulega uppfærð afrit af öllum OpenStreetMap gagnagrunninum
+        overpass:
+          title: Overpass API-forritsviðmót
+          description: Sæktu þennan gagnaramma frá spegli af OpenStreetMap gagnagrunninum
         geofabrik:
           title: Niðurhöl frá Geofabrik
+          description: Reglulega uppfært yfirlit heimsálfa, landa og valinna borga
+        metro:
+          title: Yfirlit veðurspár
+          description: Yfirlit veðurspár fyrir helstu heimsborgir og nágrenni þeirra
         other:
           title: Aðrar heimildir
+          description: Aðrir gagnagjafar sem taldir eru upp á kviku/wiki OpenStreetMap
       options: Valmöguleikar
       format: Snið
       scale: Kvarði
       max: hámark
       image_size: Stærð myndar
       zoom: Aðdráttur
-      add_marker: Bæta punkti á kortið
+      add_marker: Bæta kortamerki á kortið
       latitude: 'Lengd:'
       longitude: 'Breidd:'
       output: Úttak
@@ -363,14 +393,14 @@ is:
   geocoder:
     search:
       title:
-        latlon: Niðurstöður frá <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Niðurstöður frá <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Niðurstöður frá <a href="http://www.npemap.org.uk/">NPEMap /
           FreeThe Postcode</a>
-        ca_postcode: Niðurstöður frá <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Niðurstöður frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Niðurstöður frá <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Niðurstöður frá <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Niðurstöður frá <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Niðurstöður frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Niðurstöður frá <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Niðurstöður frá <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -381,10 +411,16 @@ is:
           chair_lift: Stólalyfta
           drag_lift: Toglyfta
           gondola: Eggjalyfta
+          platter: Diskalyfta
+          pylon: Lyftumastur
+          station: Lyftustöð
+          t-bar: T-lyfta
         aeroway:
           aerodrome: Flugsvæði
+          airstrip: Flugbraut
           apron: Flughlað
           gate: Hlið
+          hangar: Flugskýli
           helipad: Þyrlupallur
           runway: Flugbraut
           taxiway: Akbraut flugvéla
@@ -406,6 +442,7 @@ is:
           bus_station: Strætóstöð
           cafe: Kaffihús
           car_rental: Bílaleiga
+          car_sharing: Deiling bíla
           car_wash: Bílaþvottastöð
           casino: Spilavíti
           charging_station: Hleðslustöð
@@ -419,36 +456,32 @@ is:
           crematorium: Bálstofa
           dentist: Tannlæknir
           doctors: Læknar
-          dormitory: Heimavist
           drinking_water: Drykkjarvatn
           driving_school: Ökuskóli
           embassy: Sendiráð
-          emergency_phone: Neyðarsími
           fast_food: Skyndibitastaður
           ferry_terminal: Ferjustöð
-          fire_hydrant: Brunahani
           fire_station: Slökkvistöð
+          food_court: Veitingasvæði
           fountain: Gosbrunnur
           fuel: Eldsneyti
           gambling: Fjárhættuspil
           grave_yard: Kirkjugarður
-          gym: Líkamsræktarstöð
-          health_centre: Heilsumiðstöð
+          grit_bin: Sandkista
           hospital: Sjúkrahús
           hunting_stand: Skotvöllur
           ice_cream: Ísbúð
           kindergarten: Leikskóli
           library: Bókasafn
-          market: Markaður
           marketplace: Markaður
           monastery: Klaustur
           motorcycle_parking: Mótorhjólastæði
           nightclub: Næturklúbbur
-          nursery: Skiptiborð
           nursing_home: Hjúkrunarheimili
           office: Skrifstofa
           parking: Bílastæði
           parking_entrance: Aðgangur að bílastæði
+          parking_space: Bílastæði
           pharmacy: Lyfjabúð
           place_of_worship: Tilbeiðslustaður
           police: Lögreglustöð
@@ -458,7 +491,6 @@ is:
           prison: Fangelsi
           pub: Krá
           public_building: Opinber bygging
-          reception_area: Móttökusvæði
           recycling: Endurvinnsla
           restaurant: Veitingastaður
           retirement_home: Elliheimili
@@ -466,8 +498,10 @@ is:
           school: Skóli
           shelter: Skýli
           shop: Verslun
-          shower: Steypibað
+          shower: Sturta
           social_centre: Félagsmiðstöð
+          social_club: Samfélagsklúbbur
+          social_facility: Félagsþjónusta
           studio: Stúdíó
           swimming_pool: Sundlaug
           taxi: Leigubílastöð
@@ -481,6 +515,7 @@ is:
           village_hall: Hreppsskrifstofa
           waste_basket: Ruslafata
           waste_disposal: Ruslsöfnun
+          water_point: Vatnspóstur
           youth_centre: Ungmennamiðstöð
         boundary:
           administrative: Stjórnsýslumörk
@@ -489,6 +524,7 @@ is:
           protected_area: Verndarsvæði
         bridge:
           aqueduct: Vatnsveitubrú
+          boardwalk: Plankabrú
           suspension: Hengibrú
           swing: Snúningsbrú
           viaduct: Dalbrú
@@ -511,20 +547,28 @@ is:
           defibrillator: Hjartastuðtæki
           landing_site: Neyðarlending
           phone: Neyðarsími
+          water_tank: Vatnstankur fyrir neyðartilfelli
+          "yes": Neyðartilfelli
         highway:
           abandoned: Ónotuð hraðbraut
           bridleway: Reiðstígur
+          bus_guideway: Strætisvagnaakrein með stýringu
           bus_stop: Strætisvagnabiðstöð
           construction: Hraðbraut í byggingu
+          corridor: Gangur
           cycleway: Hjólastígur
           elevator: Lyfta
+          emergency_access_point: Neyðaraðgangur
           footway: Göngustígur
           ford: Vað
           living_street: Vistgata
+          milestone: Vegalengdarsteinn
           motorway: Hraðbraut
+          motorway_junction: Þjóðvegatenging
+          motorway_link: Hraðbraut
           path: Slóð
           pedestrian: Gönguleið
-          platform: Kerfishögun
+          platform: Pallur
           primary: Stofnvegur
           primary_link: Stofnvegur
           proposed: Tillaga um veglagningu
@@ -535,20 +579,24 @@ is:
           secondary: Tengivegur
           secondary_link: Tengivegur
           service: Þjónustuvegur
+          services: Hraðbrautaþjónusta
           speed_camera: Hraðamyndavél
           steps: Tröppur
+          stop: Stöðvunarskilti
           street_lamp: Ljósastaur
-          track: Spor
+          tertiary: Annar vegur
+          tertiary_link: Annar vegur
+          track: Slóði
           traffic_signals: Umferðarljós
-          trail: Slóði
-          trunk: Stofnbraut
-          trunk_link: Stofnbraut
+          trail: Stígur
+          trunk: Stofnbraut (Hringvegurinn)
+          trunk_link: Stofnbraut (Hringvegurinn)
           unclassified: Óflokkaður vegur
-          unsurfaced: Vegur án slitlags
           "yes": Vegur
         historic:
           archaeological_site: Fornminjar
           battlefield: Orustuvöllur
+          boundary_stone: Landamerkjasteinn
           building: Söguleg bygging
           bunker: Sprengjubyrgi
           castle: Kastali
@@ -562,13 +610,17 @@ is:
           manor: Herragarður
           memorial: Minnismerki
           mine: Náma
+          mine_shaft: Námugöng
           monument: Minnisvarði
           roman_road: Rómverskur vegur
           ruins: Rústir
           stone: Steinn
           tomb: Gröf
           tower: Turn
+          wayside_cross: Vegakross
+          wayside_shrine: Vegaskrín
           wreck: Flak
+          "yes": Sögustaður
         junction:
           "yes": Tenging
         landuse:
@@ -581,6 +633,7 @@ is:
           construction: Bygging
           farm: Býli
           farmland: Ræktarland
+          farmyard: Hlað
           forest: Skógur
           garages: Verkstæði
           grass: Gras
@@ -593,15 +646,18 @@ is:
           orchard: Trjágarður
           quarry: Grjótnáma
           railway: Lestarteinar
+          recreation_ground: Leikvöllur
           reservoir: Uppistöðulón
+          reservoir_watershed: Vatnasvið uppistöðulóns
           residential: Íbúðasvæði
           retail: Smásala
+          road: Vegsvæði
+          village_green: Grænt svæði
           vineyard: Vínekra
           "yes": Landnotkun
         leisure:
           beach_resort: Strandbær
           bird_hide: Fuglaskoðunarhús
-          club: Klúbbur
           common: Almenningur
           dog_park: Hundagarður
           fishing: Fiskveiði
@@ -618,6 +674,7 @@ is:
           pitch: Íþróttavöllur
           playground: Leikvöllur
           recreation_ground: Leikvöllur
+          resort: Ferðamannastaður
           sauna: Gufubað
           slipway: Slippur
           sports_centre: Íþróttamiðstöð
@@ -627,15 +684,46 @@ is:
           water_park: Vatnsleikjagarður
           "yes": Afþreying
         man_made:
+          adit: Námuinngangur
+          beacon: Sjómerki
+          beehive: Býflugnabú
+          breakwater: Brimvarnargarður
+          bridge: Brú
+          bunker_silo: Sprengjubyrgi
+          chimney: Skorsteinn
+          crane: Krani
+          dolphin: Bryggjustólpi
+          dyke: Flóðgarður
+          embankment: Stallur
+          flagpole: Fánastöng
+          gasometer: Gasmælir
+          groyne: Öldubrjótur
+          kiln: Brennsluofn
           lighthouse: Viti
+          mast: Mastur
+          mine: Náma
+          mineshaft: Námugöng
+          monitoring_station: Vöktunarstöð
+          petroleum_well: Olíulind
+          pier: Bryggja
           pipeline: Leiðsla
+          silo: Síló
+          storage_tank: Geymslutankur
+          surveillance: Eftirlit
           tower: Turn
+          wastewater_plant: Vatnshreinsistöð
+          watermill: Vatnsmylla
+          water_tower: Vatnsturn
+          water_well: Brunnur
+          water_works: Vatnsvinnsla
+          windmill: Vindmylla
           works: Verksmiðja
           "yes": Manngert
         military:
           airfield: Herflugvöllur
           barracks: Herbúðir
           bunker: Sprengjubyrgi
+          "yes": Hernaðar
         mountain_pass:
           "yes": Fjallaskarð
         natural:
@@ -681,17 +769,21 @@ is:
           accountant: Bókari
           administrative: Stjórnsýsla
           architect: Arkítektar
+          association: Samtök
           company: Fyrirtæki
+          educational_institution: Menntastofnun
           employment_agency: Vinnumiðlun
           estate_agent: Fasteignasali
           government: Stjórnarskrifstofa
+          insurance: Tryggingaskrifstofa
+          it: Upplýsingatækniskrifstofa
           lawyer: Lögmaður
+          ngo: Skrifstofa frjálsra félagasamtaka
+          telecommunication: Fjarskiptaskrifstofa
           travel_agent: Ferðaskrifstofa
           "yes": Skrifstofa
         place:
           allotments: Úthlutuð svæði
-          block: Reitur
-          airport: Flugvöllur
           city: Borg
           country: Land
           county: Sýsla
@@ -703,55 +795,75 @@ is:
           islet: Smáeyja
           isolated_dwelling: Einangraður bústaður
           locality: Sveitarfélag
-          moor: Mýri
           municipality: Sveitarfélag
           neighbourhood: Nágrenni
           postcode: Póstnúmer
+          quarter: Hverfi
           region: Hérað
           sea: Hafið
+          square: Torg
           state: Ríki
           subdivision: Undirskipting
           suburb: Úthverfi
           town: Bær
+          unincorporated_area: Landsvæði utan sveitarfélaga
           village: Þorp
           "yes": Staður
         railway:
           abandoned: Aflögð járnbraut
           construction: Járnbraut í byggingu
           disused: Aflögð járnbraut
-          disused_station: Aflögð járnbrautarstöð
           funicular: Kláfbraut
           halt: Lestarstopp
-          historic_station: Söguleg lestarstöð
+          junction: Járnbrautatenging
           level_crossing: Þverun brautarteina
-          light_rail: Smálest
+          light_rail: Léttlest
+          miniature: Smálest
           monorail: Einteinungur
+          narrow_gauge: Lestarteinar með minna bili
+          platform: Brautarpallur
+          preserved: Varðveitt lestarspor
+          proposed: Tillaga um lestarteinalagningu
+          spur: Lestarteinastubbur
           station: Lestarstöð
+          stop: Stöðvunarsvæði lestar
           subway: Neðanjarðarlest
           subway_entrance: Inngangur í neðanjarðarlest
+          switch: Lestarteinaskipting
           tram: Sporvagn
           tram_stop: Sporvagnastöð
         shop:
+          alcohol: Án vínveitingaleyfis
           antiques: Antíkverslun
           art: Listmunaverslun
           bakery: Bakarí
           beauty: Snyrtivöruverslun
           beverages: Drykkjarfangaverslun
           bicycle: Hjólaverslun
+          bookmaker: Veðmangari
           books: Bókabúð
+          boutique: Sérverslun
           butcher: Slátrari
           car: Bílavöruverslun
           car_parts: Bílapartar
           car_repair: Bílaviðgerðir
           carpet: Teppabúð
+          charity: Góðgerðaverslun
+          chemist: Lyfsali
           clothes: Fataverslun
           computer: Tölvuverslun
+          confectionery: Sælgætisverslun
+          convenience: Kjörbúð
           copyshop: Ljósritunarverslun
           cosmetics: Snyrtivöruverslun
+          deli: Sælkeraverslun
           department_store: Kjörbúð
+          discount: Afsláttarvöruverslun
+          doityourself: Föndurvörur
           dry_cleaning: Þurrhreinsun
           electronics: Raftækjaverslun
           estate_agent: Fasteignasali
+          farm: Beint frá býli
           fashion: Tískuverslun
           fish: Fiskbúð
           florist: Blómabúð
@@ -763,15 +875,20 @@ is:
           general: Almenn verslun
           gift: Gjafabúð
           greengrocer: Grænmetissali
+          grocery: Matvöruverslun
           hairdresser: Hársnyrting
           hardware: Verkfærabúð
           hifi: Hljómtækjaverslun
-          insurance: Tryggingar
+          houseware: Húsbúnaðarverslun
+          interior_decoration: Innanhúshönnun
           jewelry: Skartgripaverslun
           kiosk: Söluturn
+          kitchen: Eldhúsvörur
           laundry: Þvottahús
+          lottery: Lottó
           mall: Verslunarkjarni
           market: Markaður
+          massage: Nudd
           mobile_phone: Farsímaverslun
           motorcycle: Mótorhjólaverslun
           music: Tónlistarverslun
@@ -779,20 +896,26 @@ is:
           optician: Sjóntækjafræðingur
           organic: Verslun með lífrænt fæði
           outdoor: Útivistarverslun
+          paint: Málningarvöruverslun
+          pawnbroker: Veðlánari
           pet: Gæludýraverslun
           pharmacy: Lyfjabúð
           photo: Ljósmyndavöruverslun
-          salon: Snyrtistofa
+          seafood: Fiskmeti
           second_hand: Verslun með notað
           shoes: Skóbúð
-          shopping_centre: Verslunarmiðstöð
           sports: Íþróttavöruverslun
           stationery: Ritfangaverslun
           supermarket: Kjörbúð
           tailor: Klæðskeri
+          ticket: Miðasala
+          tobacco: Tóbaksverslun
           toys: Leikfangaverslun
           travel_agency: Ferðaskrifstofa
+          tyres: Dekkjaverslun
+          variety_store: Smávörumarkaður
           video: Videoleiga
+          wine: Vínbúð
           "yes": Verslun
         tourism:
           alpine_hut: Fjallaskáli
@@ -816,11 +939,14 @@ is:
           viewpoint: Útsýnisstaður
           zoo: Dýragarður
         tunnel:
+          culvert: Ræsi
           "yes": Göng
         waterway:
+          artificial: Manngerð vatnaleið
           boatyard: Bátalægi
           canal: Skipaskurður
           dam: Vatnsaflsvirkjunin
+          derelict_canal: Aflagður skipaskurður
           ditch: Skurður
           dock: Hafnarbakki
           drain: Dren
@@ -830,7 +956,9 @@ is:
           rapids: Flúðir
           river: Á
           stream: Lækur
+          wadi: Wadi
           waterfall: Foss
+          weir: Stíflugarður
           "yes": Siglingaleið
       admin_levels:
         level2: Landamæri
@@ -842,7 +970,7 @@ is:
         level10: Úthverfamörk
     description:
       title:
-        osm_nominatim: Staðsetning frá <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Staðsetning frá <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Staðsetning frá <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -880,17 +1008,18 @@ is:
     intro_text: OpenStreetMap er heimskort búið til af fólki eins og þér. Það er gefið
       út með opnu hugbúnaðarleyfi og það kostar ekkert að nota það.
     intro_2_create_account: Búa til notandaaðgang
+    partners_html: Vefhýsing er studd af %{ucl}, %{bytemark}, %{ic}, og öðrum %{partners}.
     partners_ucl: UCL
     partners_ic: Imperial College London
     partners_bytemark: Bytemark Hosting
-    partners_partners: samstarfsaðilar
+    partners_partners: samstarfsaðilum
     osm_offline: OpenStreetMap gagnagrunnurinn er niðri vegna viðhalds.
     osm_read_only: Ekki er hægt að skrifa í OpenStreetMap gagnagrunninn í augnablikinu
       vegna viðhalds.
     donate: Hjálpaðu OpenStreetMap verkefninu með %{link} í vélbúnaðarsjóðinn.
     help: Hjálp
     about: Um hugbúnaðinn
-    copyright: Höfundaréttur
+    copyright: Höfundarréttur
     community: Samfélag
     community_blogs: Blogg félaga
     community_blogs_title: Blogg frá meðlimum OpenStreetMap samfélagsins
@@ -916,37 +1045,170 @@ is:
       native_link: íslensku útgáfuna
       mapping_link: farið að kortleggja
     legal_babble:
-      title_html: Höfundaréttur og leyfi
+      title_html: Höfundarréttur og notkunarleyfi
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> er <i>opinn og frjáls kortagrunnur</i>, gefinn út með <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) notkunarleyfi frá  <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) sjálfseignarstofnuninni.
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) sjálfseignarstofnuninni.
       intro_2_html: |-
-        Þér er frjálst að afrita, dreifa, senda og aðlaga kortagrunninnn
+        Þér er frjálst að afrita, dreifa, senda og aðlaga kortagrunninn
          og gögn hans, gegn því að þú vísar í og viðurkennir rétt OpenStreetMap
         og sjálfboðaliða þess. Ef þú breytir eða byggir á kortagrunninum
         eða gögnum hans, þá verður þú að gefa niðurstöðuna út með
         sama leyfi.
-        <a href="http://opendatacommons.org/licenses/odbl/1.0/">Leyfistextinn</a>
+        <a href="https://opendatacommons.org/licenses/odbl/1.0/">Leyfistextinn</a>
         útskýrir réttindi þín og skyldur.
+      intro_3_html: |-
+        Landupplýsingarnar í kortaflísunum okkar, og í hjálparskjölunum, eru
+        gefnar út með <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Attribution-ShareAlike 2.0</a> notkunarleyfi (CC BY-SA).
+      credit_title_html: Hvernig á að vísa til OpenStreetMap
+      credit_1_html: |-
+        Við gerum kröfu um að þú notir tilvísunina &ldquo;&copy; Þátttakendur í
+        OpenStreetMap verkefninu&rdquo;.
+      credit_2_html: "Þú þarft líka að taka skýrt fram að gögnin séu tiltæk með Open\nDatabase
+        notkunarleyfi, og ef verið sé að nota kortaflísar frá okkur, að kortagögnin
+        \nséu með CC BY-SA notkunarleyfi. Þú getur gert það með því að tengja\ná <a
+        href=\"https://www.openstreetmap.org/copyright\">þessa höfundarréttarsíðu</a>.\nAnnars,
+        og þess er krafist ef þú ert að dreifa OSM á einhverju\ngagnaformi, geturðu
+        talið upp og tengt beint á leyfishafana. Í miðlum\nþar sem tenglar eru varla
+        mögulegir (t.d. prentuðum verkum), stingum við upp á að\nþú beinir lesendum
+        á openstreetmap.org (mögulega að tengja\n'OpenStreetMap' við fullt vistfang
+        þessarar síðu), á opendatacommons.org, og\nef slíkt á við, á creativecommons.org."
+      credit_3_html: |-
+        Á flettanlegum rafrænum landakortum ætti tilvísunin að birtast í horni kortsins.
+        Til dæmis:
+      attribution_example:
+        alt: Dæmi um hvernig eigi að vísa til OpenStreetMap á vefsíðu
+        title: Dæmi um tilvísun
       more_title_html: Finna út meira
+      more_1_html: |-
+        Lestu meira um notkun á gögnunum okkar og hvernig eigi að vísa til okkar á síðunni <a
+        href="https://osmfoundation.org/Licence">OSMF notkunarleyfi</a>.
+      more_2_html: |-
+        Þó OpenStreetMap snúist um opin gögn, getum við ekki
+        séð utanaðkomandi aðilum fyrir ókeypis API-kortaþjónustu.
+        Skoðaðu síðurnar um <a href="https://operations.osmfoundation.org/policies/api/">notkun á API-forritsviðmóti</a>,
+        <a href="https://operations.osmfoundation.org/policies/tiles/">notkun á kortaflísum</a>
+        and <a href="https://operations.osmfoundation.org/policies/nominatim/">notkun á OSM-Nominatim</a>.
       contributors_title_html: Þeir sem hafa komið með framlög
+      contributors_intro_html: |-
+        Framlög hafa komið frá mörgum þúsundum einstaklinga. Við erum líka
+        með gögn með opnum notkunarleyfum frá þjóðlegum landupplýsingastofnunum
+        auk annarra opinberra aðila, meðal annars:
+      contributors_at_html: |-
+        <strong>Austurríki</strong>: Inniheldur gögn frá
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (með
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> og
+        Land Tirol (under <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT með viðaukum</a>).
+      contributors_ca_html: |-
+        <strong>Kanada</strong>: Inniheldur gögn frá
+        GeoBase&reg;, GeoGratis (&copy; Department of Natural
+        Resources Canada), CanVec (&copy; Department of Natural
+        Resources Canada), og StatCan (Geography Division,
+        Statistics Canada).
+      contributors_fi_html: |-
+        <strong>Finnland</strong>: Inniheldur gögn frá
+        landupplýsingagagnagrunni Landmælinga Finnlands
+        auk annarra gagnasafna, með
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI notkunarleyfi</a>.
+      contributors_fr_html: |-
+        <strong>Frakkland</strong>: Inniheldur afleidd gögn frá
+        Direction Générale des Impôts (Skattstjóraembættið).
+      contributors_nl_html: |-
+        <strong>Holland</strong>: Inniheldur AND-gögn &copy;, 2007
+        (<a href="https://www.and.com">www.and.com</a>)
+      contributors_nz_html: |-
+        <strong>Nýja-Sjáland</strong>: Inniheldur gögn með uppruna frá
+        Land Information New Zealand. Með Crown Copyright höfundarrétti.
+      contributors_si_html: |-
+        <strong>Slóvenía</strong>: Inniheldur gögn frá
+        <a href="http://www.gu.gov.si/en/">landmælinga og kortagerðaryfirvöldum</a> og
+        <a href="http://www.mkgp.gov.si/en/">ráðuneyti landbúnaðar, skógnýtingar og matvæla</a>
+        (opinberar upplýsingar í Slóveníu).
+      contributors_za_html: |-
+        <strong>Suður-Afríka</strong>: Inniheldur gögn frá
+        <a href="http://www.ngi.gov.za/">Chief Directorate:
+        National Geo-Spatial Information</a>, höfundarréttur suðurafríska ríkisins (state copyright) áskilinn.
+      contributors_gb_html: |-
+        <strong>Bretland</strong>: Inniheldur landmælinga-
+        og kortagerðargögn með &copy; Crown Copyright höfundarrétti auk réttinda varðandi gagnasafn
+        2010-12.
+      contributors_footer_1_html: |-
+        Til að skoða nánari upplýsingar um þetta, auk annarra gagna sem notuð hafa verið
+        til að bæta OpenStreetMap, skoðaðu þá síðuna <a
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Þátttakendur</a> á wiki/kvikusvæði OpenStreetMap.
+      contributors_footer_2_html: |-
+        Samþætting gagna inn í OpenStreetMap hefur ekki sjálfkrafa í för með sér að
+        upprunaleg gagnaþjónusta taki þátt í OpenStreetMap, taki neina ábyrgð á gögnum, eða
+        samþykki skaðabótaskyldu vegna þeirra.
       infringement_title_html: Brot á höfundarrétti
+      infringement_1_html: |-
+        Þátttakendur í OSM eru minntir á að þeir megi aldrei bæta inn gögnum frá neinum
+        höfundarréttarvörðum upptökum (t.d. Google Maps eða prentuðum kortum) án
+        sérstakrar heimildar frá handhöfum höfundarréttarins.
+      infringement_2_html: |-
+        Ef þú heldur að höfundarréttarvarið efni hafi ranglega verið bætt í
+        OpenStreetMap gagnagrunninn eða á þetta vefsvæði, skaltu skoða
+        <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">fjarlægingarferlið</a> okkar eða skrá fyrirspurn beint á
+         veflægu <a href="http://dmca.openstreetmap.org/">kröfugerðarsíðuna</a> okkar.
       trademarks_title_html: <span id="trademarks"></span>Vörumerki
+      trademarks_1_html: OpenStreetMap, merkið með stækkunarglerinu staða kortsins
+        eru skrásett vörumerki OpenStreetMap Foundation sjálfseignarstofnuninnar.
+        Ef þú ert með spurningar varðandi notkun þína á þessum vörumerkjum, sendu
+        þá fyrirspurnir á <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">vinnuhóp
+        notkunarleyfa</a>.
   welcome_page:
     title: Velkomin!
+    introduction_html: |-
+      Velkomin í OpenStreetMap, frjálsa heimskortinu sem þú getur breytt og lagað. Núna þegar þú ert
+      búin(n) að skrá þig, geturðu farið að setja atriði inn á kortið. Hér er fljótlegur leiðarvísir
+      með því helsta sem þú þarft að vita.
     whats_on_the_map:
       title: Hvað er á kortinu
+      on_html: |-
+        OpenStreetMap er staður til að gera kort með <em>varanlegum eða tímabundnum</em> fyrirbærum -
+        nú þegar eru þarna milljónir bygginga, vega og annarra smáatriða sem lýsa stöðum. Þú getur kortlagt
+        hvaðeina sem þér finnst áhugavert og sem tilheyrir raunheimum.
+      off_html: |-
+        Það sem OSM inniheldur <em>ekki</em> eru gögn sem byggjast á skoðunum eintaklinga, sagnfræðilegar tilgátur eða
+        möguleikar, að ógleymdum gögnum frá höfundarréttarvörðum upptökum. Ef þú ert ekki með sérstakt leyfi til slíks,
+        ekki afrita eftir landakortum á pappír eða á netinu.
     basic_terms:
+      title: Grunnhugtök við kortagerð
+      paragraph_1_html: OpenStreetMap inniheldur svolítið af eigin slangurorðum. Hér
+        eru nokkur algeng orð sem gott er að hafa á bak við eyrað.
+      editor_html: <strong>Ritill</strong> er forrit eða vefsvæði sem hægt er að nota
+        við breytingar á landakortinu.
+      node_html: <strong>Hnútur</strong> er punktur á kortinu, eins og til dæmis veitingastaður
+        eða tré.
+      way_html: <strong>Leið</strong> er lína eða svæði, eins og til dæmis vegur,
+        vatnsfall, tjörn eða bygging.
       tag_html: |-
         <strong>Merki</strong> er dálítill gagnabútur varðandi leið eða annað atriði, til dæmis
         nafn á veitingastað eða hraðatakmörk á vegi.
     rules:
       title: Reglur!
+      paragraph_1_html: "OpenStreetMap er með fáar formlegar reglur en við væntum
+        þess og gerum kröfu um\nað allir þáttakendur starfi með og eigi samskipti
+        við OSM-samfélagið. Ef þú ert að íhuga aðgerðir\naðrar en handvirkar breytingar,
+        ættirðu að lesa og fylgja leiðbeiningunum á síðunum \n<a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Innflutningur</a>
+        og \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Sjálfvirkar
+        breytingar</a>."
     questions:
       title: Einhverjar spurningar?
+      paragraph_1_html: |-
+        OpenStreetMap er með ýmsar leiðir til að læra meira um verkefnið, spyrja og svara
+        spurningum, og ræða í hópum um málefni tengd kortagerð.
+        <a href='%{help_url}'>Fáðu aðstoð hér</a>.
     start_mapping: Hefja kortlagningu
+    add_a_note:
+      title: Enginn tími fyrir breytingar? Bættu við athugasemd!
+      paragraph_1_html: Það er auðvelt að bæta við minnispunkti ef þú vilt laga eitthvað
+        smávægilegt en hefur ekki tíma til að skrá þig og læra hvernig maður breytir
+        kortinu.
   fixthemap:
     title: Tilkynna vandamál / Laga kortið
     how_to_help:
@@ -957,33 +1219,83 @@ is:
       title: Önnur íhugunarefni
   help_page:
     title: Til að fá hjálp
+    introduction: |-
+      OpenStreetMap er með ýmsar leiðir til að læra meira um verkefnið, spyrja og svara
+      spurningum, og ræða í hópum um málefni tengd kortagerð.
     welcome:
       url: /velkomin
       title: Velkomin í OSM
+      description: Byrjaðu með þessum fljótlega leiðarvísi með helstu grunnatriðum
+        varðandi OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: Byrjenda-leiðbeiningar
+      description: Leiðarvísir fyrir byrjendur sem haldið er við af samfélaginu.
     help:
       url: https://help.openstreetmap.org/
       title: help.openstreetmap.org
+      description: Spyrðu spurninga eða flettu upp svörum á spyrja/svara hluta OSM-vefsvæðisins.
     mailing_lists:
       title: Póstlistar
+      description: Spyrðu spurninga eða spjallaðu um áhugaverð málefni á einhverjum
+        af fjölmörgum póstlistum tengdum tungumálum eða viðfangsefnum.
     forums:
       title: Spjallsvæði
+      description: Spurningar og umræður fyrir þá sem kunna betur við klassísk viðmót
+        hefðbundinna spjallborða.
     irc:
       title: IRC
+      description: Gagnvirkt spjall á mörgum tungumálum og um margvísleg málefni.
     switch2osm:
       title: switch2osm
+      description: Hjálp fyrir fyrirtæki, stofnanir og félagasamtök sem ætla sér að
+        skipta yfir í kort byggð á OpenStreetMap og tengdum þjónustum.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
+      description: Vafraðu um wiki/kvikuna til að sjá greinargóðar leiðbeiningar varðandi
+        OSM.
   about_page:
     next: Næsta
-    copyright_html: <span>&copy;</span>OpenStreetMap<br>þátttakendur
+    copyright_html: <span>&copy;</span>Þátttakendur í<br>OpenStreetMap<br>verkefninu
+    used_by: '%{name} drífur áfram kortagögn á þúsundum vefsíðna, símaforritum og
+      tækjum'
+    lede_text: OpenStreetMap er byggt upp af heilu samfélagi kortagerðarfólks sem
+      leggur inn og viðheldur gögnum um vegi, stíga, kaffihús, járnbrautir og margt,
+      margt fleira, út um víða veröld.
     local_knowledge_title: Staðbundin þekking
+    local_knowledge_html: |-
+      OpenStreetMap leggur áherslu á staðbundna þekkingu. Þátttakendurnir nota
+      loftmyndir, GPS-tæki o.þ.h. til jafns við frumstæðar kortaskissur til að sannreyna að OSM
+      sé nákvæmt og vel uppfært.
     community_driven_title: Samfélagsdrifið
+    community_driven_html: |-
+      Samfélagið í kringum OpenStreetMap er fjölbreytilegt, áhugasamt og vex frá degi til dags.
+      Innan þess starfa áhugafólk um kortagerð, atvinnumenn í GIS-fræðum, verkfræðingar
+      sem meðal annars sjá um vefþjóna OSM, hjálparstarfsfólk sem kortleggur hamfarasvæði,
+      og margir aðrir.
+      Til að fræðast betur um þetta samfélag, geturðu skoðað
+      <a href='https://blog.openstreetmap.org'>OpenStreetMap bloggið</a>,
+      <a href='%{diary_path}'>dagbækur notenda</a>,
+      <a href='https://blogs.openstreetmap.org/'>bloggsvæði þátttakenda</a> og
+      vefsvæði <a href='https://www.osmfoundation.org/'>OSM Foundation</a>.
     open_data_title: Opin gögn
-    legal_title: Lagalegt
+    open_data_html: |-
+      OpenStreetMap eru <i>opin gögn</i>: þér er heimilt að nota þetta í hvaða tilgangi sem er
+      svo framarlega að þú getir um OpenStreetMap og þátttakendurna í verkefninu. Ef þú breytir gögnunum
+      eða byggir á göngunum á einhvern máta, máttu einungis dreifa útkomunni
+      með sömu notkunarskilmálum. Skoðaðu síðuna um <a href='%{copyright_path}'>höfundarrétt og
+      notkunarleyfi</a> til að sjá ítarlegri upplýsingar varðandi þetta.
+    legal_title: Lagalegur fyrirvari
+    legal_html: "Þetta vefsvæði ásamt mörgum tengdum þjónustum er formlega rekið af\n<a
+      href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) \nfyrir
+      hönd samfélagsins. Notkun allrar þjónustu á vegum OSMF fellur undir \n<a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">stefnu
+      okkar varðandi ásættanlega notkun</a> auk <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">persónuverndarstefnu
+      okkar</a>\n.<br> \nEndilega <a href='https://osmfoundation.org/Contact'>hafðu
+      samband við OSMF</a> \nef þú ert með spurningar eða beiðnir varðandi notkunarleyfi,
+      höfundarrétt eða önnur lögfræðileg málefni.\n<br>\nOpenStreetMap, táknmerkið
+      með stækkunarglerinu og ástand kortsins eru <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">skrásett
+      vörumerki OSMF</a>."
     partners_title: Samstarfsaðilar
   notifier:
     diary_comment_notification:
@@ -997,12 +1309,14 @@ is:
       subject_header: '[OpenStreetMap] %{subject}'
       hi: Hæ %{to_user},
       header: '%{from_user} hefur send þér skilaboð á OpenStreetMap með titlinum „%{subject}“:'
+      footer_html: Þú getur einnig lesið skilaboðin á %{readurl} og svarað á %{replyurl}
     friend_notification:
       hi: Hæ %{to_user},
       subject: '[OpenStreetMap] %{user} bætti þér við sem vin'
       had_added_you: Notandinn %{user} hefur bætt þér við sem vini á OpenStreetMap.
       see_their_profile: Þú getur séð notandasíðu notandans á %{userurl} og jafnvel
         bætt honum við sem vini líka.
+      befriend_them: Þú getur líka bætt þeim við sem vinum á %{befriendurl}.
     gpx_notification:
       greeting: Hæ,
       your_gpx_file: GPX skráin þín
@@ -1014,7 +1328,7 @@ is:
         failed_to_import: 'Lenti í villu þegar átti að flytja hana inn, hérna er villan::'
         more_info_1: Frekari upplýsinagr um GPX innflutningarvillur og hvernig
         more_info_2: 'má forðast þær er að finna hér::'
-        import_failures_url: http://wiki.openstreetmap.org/index.php?title=FAQ&uselang=is
+        import_failures_url: https://wiki.openstreetmap.org/wiki/GPX_Import_Failures
       success:
         subject: '[OpenStreetMap] GPX skrá innflutt'
         loaded_successfully: var innflutt með %{trace_points} punkta af %{possible_points}
@@ -1022,6 +1336,12 @@ is:
     signup_confirm:
       subject: '[OpenStreetMap] Velkomin í OpenStreetMap'
       greeting: Hæ þú!
+      created: Einhver (vonandi þú) var að búa til notandaaðgang á %{site_url}.
+      confirm: 'Áður en nokkuð annað gerist, þurfum við að fá staðfestingu á að þessi
+        beiðni komi raunverulega frá þér, þannig að ef svo er skaltu smella á tengilinn
+        hér fyrir neðan til að staðfesta notandaaðganginn þinn:'
+      welcome: Eftir að þú hefur staðfest notandaaðganginn þinn, munum við senda þér
+        viðbótarupplýsingar til að koma þér í gang.
     email_confirm:
       subject: '[OpenStreetMap] Staðfestu netfangið þitt'
     email_confirm_plain:
@@ -1053,19 +1373,52 @@ is:
     note_comment_notification:
       anonymous: Nafnlaus notandi
       greeting: Hæ,
+      commented:
+        subject_own: '[OpenStreetMap] %{commenter} hefur gert athugasemd við einn
+          af minnispunktunum þínum'
+        subject_other: '[OpenStreetMap@] %{commenter} hefur gert athugasemd við minnispunkt
+          sem þú hefur áhuga á'
+        your_note: '%{commenter} hefur sett athugasemd við einn af minnispunktunum
+          þínum nálægt %{place}.'
+      closed:
+        subject_own: '[OpenStreetMap] %{commenter} hefur leyst einn af minnispunktunum
+          þínum'
+        subject_other: '[OpenStreetMap@] %{commenter} hefur leyst minnispunkt sem
+          þú hefur áhuga á'
+        your_note: '%{commenter} hefur leyst einn af minnispunktunum þínum nálægt
+          %{place}.'
+      reopened:
+        subject_own: '[OpenStreetMap] %{commenter} hefur endurvirkjað einn af minnispunktunum
+          þínum'
+        subject_other: '[OpenStreetMap@] %{commenter} hefur endurvirkjað minnispunkt
+          sem þú hefur áhuga á'
+        your_note: '%{commenter} hefur endurvirkjað einn af minnispunktunum þínum
+          nálægt %{place}.'
+      details: Nánari upplýsingar um minnispunktinn er að finna á %{url}.
     changeset_comment_notification:
       hi: Hæ %{to_user},
       greeting: Hæ,
       commented:
+        subject_own: '[OpenStreetMap] %{commenter} hefur gert athugasemd við eitt
+          af breytingasettunum þínum'
+        partial_changeset_with_comment: með umsögninni '%{changeset_comment}'
         partial_changeset_without_comment: án athugasemdar
+      details: Nánari upplýsingar um breytingasettið er að finna á %{url}.
   message:
     inbox:
       title: Innhólf
       my_inbox: Innhólfið mitt
       outbox: úthólf
+      messages: Þú átt %{new_messages} og %{old_messages}
+      new_messages:
+        one: '%{count} ný skilaboð'
+        other: '%{count} ný skilaboð'
+      old_messages:
+        one: '%{count} eldri skilaboð'
+        other: '%{count} eldri skilaboð'
       from: Frá
       subject: Titill
-      date: Döðlur
+      date: Dagsetning
       no_messages_yet: Þú hefur ekki fengið nein skilboð. Hví ekki að hafa samband
         við einhverja %{people_mapping_nearby_link}?
       people_mapping_nearby: nálæga notendur
@@ -1136,13 +1489,18 @@ is:
       user_page_link: notandasíðunni þinni
       anon_edits: (%{link})
       anon_edits_link_text: Finndu út afhverju.
-      flash_player_required: Þú þarft Flash spilara til að nota Potlatch ritilinn.
-        Þú getur <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">sótt
-        niður Flash spilara frá Adobe.com</a> eða notað <a href="http://wiki.openstreetmap.org/index.php?uselang=is&title=Editing">aðra
+      flash_player_required: Þú þarft Flash spilara til að nota Potlatch ritilinn,
+        sem er Flash-ritill fyrir OSM. Þú getur <a href="https://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">sótt
+        Flash spilara frá Adobe.com</a> eða notað <a href="https://wiki.openstreetmap.org/wiki/Editing">aðra
         OpenStreetMap ritla</a> sem ekki krefjast Flash.
       potlatch_unsaved_changes: Þú ert með óvistaðar breytingar. Til að vista í Potlatch
         þarf að af-velja núverandi val ef þú ert í „Live“-ham, eða ýta á „Save“ hnappinn
         til að vista ef sá hnappur er sjáanlegur.
+      potlatch2_not_configured: Potlatch 2 hefur ekki verið stillt - skoðaðu https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+        til að sjá nánari upplýsingar
+      potlatch2_unsaved_changes: Þú ert með óvistaðar breytingar. (Til að vista í
+        Potlatch 2 ættirðu að ýta á vistunarhnappinn.)
+      id_not_configured: Það er ekki búið að setja upp auðkenni
       no_iframe_support: Því miður styður vafrinn þinn ekki HTML-iframes, sem er nauðsynlegt
         ef nota á þennan eiginleika.
     sidebar:
@@ -1154,7 +1512,7 @@ is:
       get_directions_title: Finna leiðir milli tveggja punkta
       from: Frá
       to: Til
-      where_am_i: Hvar er Ã©g?
+      where_am_i: Hvar er Ã¾etta?
       where_am_i_title: Notar leitarvélina til að lýsa núverandi staðsetningu á kortinu
       submit_text: Byrja
     key:
@@ -1169,11 +1527,14 @@ is:
           track: Slóði
           bridleway: Reiðstígur
           cycleway: Hjólaleið
+          cycleway_national: Hjólaleið á landsneti
+          cycleway_regional: Svæðisbundin hjólaleið
+          cycleway_local: Staðbundin hjólaleið
           footway: Gönguleið
           rail: Lestarteinar
           subway: Neðanjarðarlest
           tram:
-          - Smálest
+          - Léttlest
           - sporvagn
           cable:
           - Kláflyfta
@@ -1228,7 +1589,7 @@ is:
       edit: Breyta
       preview: Forskoðun
     markdown_help:
-      title_html: Þáttað með <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Þáttað með <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Fyrirsagnir
       heading: Fyrirsögn
       subheading: Undirfyrirsögn
@@ -1270,7 +1631,7 @@ is:
       save_button: Vista breytingar
       visibility: 'Sýnileiki:'
       visibility_help: hvað þýðir þetta?
-      visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
+      visibility_help_url: https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
     trace_form:
       upload_gpx: 'Hlaða inn GPX skrá:'
       description: 'Lýsing:'
@@ -1278,10 +1639,10 @@ is:
       tags_help: aðskilið með kommum
       visibility: 'Sýnileiki:'
       visibility_help: hvað þýðir þetta
-      visibility_help_url: http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
+      visibility_help_url: https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
       upload_button: Senda
       help: Hjálp
-      help_url: http://wiki.openstreetmap.org/index.php?title=Upload&uselang=is
+      help_url: https://wiki.openstreetmap.org/index.php?title=Upload&uselang=is
     trace_header:
       upload_trace: Senda inn feril
       see_all_traces: Sjá alla ferla
@@ -1338,6 +1699,8 @@ is:
       public_traces_from: Ferlar eftir %{user}
       description: Skoða nýlega innsenda GPS-ferla
       tagged_with: ' með merkið %{tags}'
+      empty_html: Ekkert hér ennþá. <a href='%{upload_link}'>Sendu inn nýjan feril</a>
+        eða lærðu meira um GPS-ferlun á <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki-síðunni</a>.
     delete:
       scheduled_for_deletion: Þessum feril verður eitt
     make_public:
@@ -1350,16 +1713,28 @@ is:
     georss:
       title: OpenStreetMap GPS-ferlar
     description:
+      description_with_count:
+        one: GPX-skrá með %{count} punkti frá %{user}
+        other: GPX-skrá með %{count} punktum frá %{user}
       description_without_count: GPX-skrá frá %{user}
   application:
     require_cookies:
-      cookies_needed: Þú virðist ekki vera með stuðning fyrir smákökur í vafranum
-        þínum. Þú verður að virkja þann stuðning áður en þú getur haldið áfrám.
+      cookies_needed: Þú virðist ekki vera með stuðning við vefkökur í vafranum þínum.
+        Þú verður að virkja þann stuðning áður en þú getur haldið áfram.
+    require_moderator:
+      not_a_moderator: Þú þarft að vera ritstjóri til að framkvæma þessa aðgerð.
     setup_user_auth:
-      blocked: Aðgangur þinn að forritunarviðmótinu hefur verið bannaður. Skráðu þig
-        inn í vefviðmótið fyrir frekari upplýsingar.
+      blocked_zero_hour: Þú átt áríðandi skilaboð á OpenStreetMap vefsvæðinu. Þú verður
+        að lesa þessi skilaboð áður en þú getur aftur vistað neinar breytingar.
+      blocked: Aðgangur þinn að API-forritunarviðmótinu hefur verið bannaður. Skráðu
+        þig inn í vefviðmótið fyrir frekari upplýsingar.
+      need_to_see_terms: Aðgangur þinn að API-forritunarviðmótinu hefur verið frystur
+        tímabundið. Skráðu þig inn í vefviðmótið til að skoða skilmála vegna framlags
+        (Contributor Terms). Þú þarft ekki endilega að samþykkja þá, en þú verður
+        að skoða þá.
   oauth:
     oauthorize:
+      title: Auðkenndu aðgang að notandaaðganginum þínum
       request_access: Forritið %{app_name} hefur óskað eftir að fá aðgang að OpenStreetMap
         í gegnum notandaaðganginn þinn, %{user}. Merktu við hvað eiginleika þú vilt
         gefa forritinu leyfi fyrir. Hægt er að haka við hvaða eiginleika sem er.
@@ -1375,9 +1750,17 @@ is:
       grant_access: Veita aðgang
     oauthorize_success:
       title: Auðkenningarbeiðni samþykkt
+      allowed: Þú hefur veitt forritinu %{app_name} aðgang að notandaaðganginum þínum.
       verification: Sannvottunarkóðinn er %{code}.
     oauthorize_failure:
       title: Auðkenningarbeiðni brást
+      denied: Þú hefur neitað forritinu %{app_name} um aðgang að notandaaðganginum
+        þínum.
+      invalid: Auðkenningarteiknið er ekki gilt.
+    revoke:
+      flash: Þú afturkallaðir aðgangsteiknið fyrir %{application}
+    permissions:
+      missing: Þú hefur ekki gefið forritinu heimild fyrir aðgang að þessum eiginleikum
   oauth_clients:
     new:
       title: Skrá nýtt forrit
@@ -1387,7 +1770,12 @@ is:
       submit: Breyta
     show:
       title: OAuth stillingar fyrir %{app_name}
+      key: 'Lykill notanda:'
+      secret: 'Leyniorð notanda:'
+      url: 'Slóð á beiðniteikn:'
+      access_url: 'Slóð á aðgangsteikn:'
       authorize_url: 'Leyfa slóð (URL):'
+      support_notice: Við styðjum HMAC-SHA1 (mælt með) og RSA-SHA1 undirritanir.
       edit: Breyta þessari skráningu
       delete: Eyða biðlara
       confirm: Ertu viss?
@@ -1402,26 +1790,38 @@ is:
       allow_write_notes: Breyta minnispunktum.
     index:
       title: OAuth stillingar
+      my_tokens: Auðkenndu forritin mín
+      list_tokens: 'Eftirfarandi aðgangsteikn hafa verðið gefin út í þínu nafni til
+        handa forritum:'
       application: Heiti forrits
       issued_at: Gefið út þann
       revoke: Eyða banninu
-      my_apps: Mín forrit
+      my_apps: Forritin mín
       registered_apps: 'Þú hefur skráð eftirfarandi forrit:'
       register_new: Skrá nýtt forrit
     form:
       name: Nafn
       required: þetta þarf
       url: Slóð á forritið
+      callback_url: Svarslóð
+      support_url: Slóð á aðstoð
       requests: 'Óska eftir eftirfarandi leyfum frá notandanum:'
       allow_read_prefs: lesa notandastillingar.
       allow_write_prefs: Breyta notandastillingum.
       allow_write_diary: Búa til bloggfærslur, setja inn athugasemdir og bæta við
         vinum.
       allow_write_api: breyta kortagögnunum.
+      allow_read_gpx: lesa einka-GPS-ferlana þeirra.
       allow_write_gpx: Senda inn GPS ferla.
       allow_write_notes: breyta minnispunktum.
+    not_found:
+      sorry: Því miður, þessi %{type} fannst ekki.
     create:
       flash: Nýtt OAuth forrit hefur verið skráð
+    update:
+      flash: Uppfærði upplýsingar biðlaraforritsins
+    destroy:
+      flash: Eyðilagði skráningu biðlaraforritsins
   user:
     login:
       title: Innskrá
@@ -1433,11 +1833,20 @@ is:
       lost password link: Gleymdirðu lykilorðinu þínu?
       login_button: Innskrá
       register now: Skrá þig núna
+      with username: 'Ertu þegar með OpenStreetMap-aðgang? Skráðu þig inn með notandanafni
+        og lykilorði:'
+      with external: 'Þú getur líka notað utanaðkomandi þjónustur til innskráningar:'
       new to osm: Nýr í OpenStreetMap?
+      to make changes: Til að gera breytingar í OpenStreetMap verðurðu að vera með
+        notandaaðgang.
+      create account minute: Stofnaðu aðgang. Það tekur eina mínútu.
       no account: Ertu ekki með aðgang?
       account not active: Þessi reikningur er ekki virkur.<br />Vinsamlegast smelltu
         á tengilinn í staðfestingarpóstinum sem þú fékkst til að virkja reikninginn,
         eða <a href="%{reconfirm}">óskaðu eftir nýjum staðfestingarpósti</a>.
+      account is suspended: Því miður, notandaaðgangurinn þinn hefur verið frystur
+        vegna grunsamlegrar virkni.<br />Hafðu samband við <a href="%{webmaster}">vefstjóra</a>
+        ef þú vilt ræða þetta mál.
       auth failure: Þetta notandanafn eða lykilorð er rangt.
       openid_logo_alt: Skrá inn með OpenID-aðgangi
       auth_providers:
@@ -1475,7 +1884,7 @@ is:
     lost_password:
       title: Glatað lykilorð
       heading: Gleymt lykilorð?
-      email address: 'Netfang:'
+      email address: 'Tölvupóstfang:'
       new password button: Senda nýtt lykilorð á netfangið þitt
       help_text: Sláðu inn netfangið sem þú skráðir þig með, við munum senda tengil
         á það sem þú getur notað til að breyta lykilorðinu þínu.
@@ -1497,12 +1906,16 @@ is:
         að fá reikning búinn til.
       about:
         header: Frjálst og breytanlegt
-      license_agreement: Með því að staðfesta notandaaðgang, samþykkirðu <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">skilmálana
+        html: |-
+          <p>Ólíkt öðrum landakortum, er OpenStreetMap gert frá grunni af fólki eins og þér,
+          öllum er heimilt að laga það, uppfæra, sækja og nota.</p>
+          <p>Skráðu þig sem notanda til að geta tekið þátt. Við munum senda þér tölvupóst til staðfestingar á skráningunni.</p>
+      license_agreement: Með því að staðfesta notandaaðganginn, samþykkirðu <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">skilmálana
         vegna framlaga</a>.
-      email address: 'Netfang:'
+      email address: 'Tölvupóstfang:'
       confirm email address: 'Staðfestu netfang:'
       not displayed publicly: Netfangið þitt er ekki birt opinberlega, sjá kaflann
-        <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title=Meðferð
+        <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title=Meðferð
         OSMF á persónuupplýsingum, þar með töldum netföngum">um meðferð persónuupplýsinga</a>
       display name: 'Sýnilegt nafn:'
       display name description: Nafn þitt sem aðrir notendur sjá, þú getur breytt
@@ -1510,19 +1923,23 @@ is:
       external auth: 'Auðkenning með þriðja aðila:'
       password: 'Lykilorð:'
       confirm password: 'Staðfestu lykilorðið:'
+      use external auth: Þú getur líka notað utanaðkomandi þjónustur til innskráningar
       continue: Nýskrá
       terms accepted: Bestu þakkir fyrir að samþykkja nýju skilmálana vegna framlags
         þíns!
-      terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
+      terms declined: Okkur þykir miður að þú hafir ákveðið að samþykkja ekki nýja
+        skilmála vegna framlags (contributor terms). Til að sjá ítarlegri upplýsingar,
+        geturðu skoðað <a href="%{url}">þessa síðu</a>.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: Skilmálar vegna framlags
       heading: Skilmálar vegna framlags
       consider_pd: Til viðbótar við ofangreint samkomulag, lít ég svo á að framlög
         mín verði í almenningseigu (Public Domain)
       consider_pd_why: hvað þýðir þetta?
-      consider_pd_why_url: http://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
+      consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
       agree: Samþykkja
-      declined: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
+      declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
       decline: Hafna
       you need to accept or decline: Endilega lestu og samþykktu eða hafnaðu nýju
         skilmálunum vegna framlags þíns, áður en þú heldur áfram.
@@ -1616,12 +2033,12 @@ is:
       email never displayed publicly: (aldrei sýnt opinberlega)
       external auth: 'Ytri auðkenning:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: hvað er openID?
       public editing:
         heading: 'Ónafngreindur notandi?:'
         enabled: Nei, nafngreindur og getur breytt gögnum.
-        enabled link: http://wiki.openstreetmap.org/index.php?uselang=is&title=Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Hvað er þetta?
         disabled: Óvirkur og getur ekki breytt gögnum, allar fyrri breytingar eru
           ónafngreindar.
@@ -1629,9 +2046,14 @@ is:
       public editing note:
         heading: Nafngreindar breytingar
         text: Breytingarnar þínar eru núna ónafngreindar þannig að aðrir notendur
-          geta ekki sent þér skilaboð eða séð staðsetningu þína. Þú verður að vera
-          nafngreind(ur) til að geta notað vefinn, sjá <a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">þessa
-          síðu</a> fyrir frekari upplýsingar.
+          geta ekki sent þér skilaboð eða séð staðsetningu þína. Til þess að breytingar
+          þínar sjáist og að fólk geti haft samband við þig í gegnum vefsvæðið, smelltu
+          þá á hnappinn hér fyrir neðan. <b>Eftir að breytingar urðu vegna 0.6 API
+          forritunarviðmótsins, geta einungis opinberir notendur breytt kortagögnum</b>.
+          (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">sjáðu hvers
+          vegna</a>).<ul><li>Þótt þú gerist opinber notandi, verður netfangið þitt
+          ekki birt opinberlega.</li><li>Þessa aðgerð er ekki hægt að afturkalla og
+          allir nýir notendur eru sjálfgefið opinberir.</li></ul>
       contributor terms:
         heading: 'Skilmálar vegna framlags:'
         agreed: Þú hefur samþykkt nýju skilmálana vegna framlags þíns.
@@ -1641,7 +2063,7 @@ is:
           skilmálana vegna framlags þíns.
         agreed_with_pd: Þú hefur einnig lýst því yfir að breytingar þínar verði í
           almenningseigu (Public Domain).
-        link: http://www.osmfoundation.org/wiki/License/Contributor_Terms
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: Hvað er þetta?
       profile description: 'Lýsing á þér:'
       preferred languages: 'Viðmótstungumál:'
@@ -1649,7 +2071,7 @@ is:
       image: 'Mynd:'
       gravatar:
         gravatar: Nota Gravatar-auðkennismynd
-        link: http://wiki.openstreetmap.org/wiki/Gravatar
+        link: https://wiki.openstreetmap.org/wiki/Gravatar
         link text: Hvað er þetta?
         disabled: Gravatar-auðkennismynd hefur verið gerð óvirk.
         enabled: Birting Gravatar-auðkennismyndar hefur verið gerð virk.
@@ -1673,10 +2095,14 @@ is:
     confirm:
       heading: Athuga með tölvupóstinn þinn!
       introduction_1: Við höfum sent þér staðfestingartölvupóst.
-      press confirm button: Hér getur þú staðfest að þú viljir búa til notanda..
+      press confirm button: Hér getur þú staðfest að þú viljir virkja notandaaðganginn
+        þinn.
       button: Staðfesta
       success: Notandinn þinn hefur verið staðfestur.
       already active: Þessi notandaaðgangur hefur þegar verið staðfestur.
+      unknown token: Þessi staðfestingarkóði er útrunninn eða er ekki til staðar.
+      reconfirm_html: Ef þú vilt að við sendum þér staðfestingarpóstinn aftur, <a
+        href="%{reconfirm}">smelltu hér</a>.
     confirm_resend:
       failure: Notandinn %{name} fannst ekki.
     confirm_email:
@@ -1685,6 +2111,7 @@ is:
       button: Staðfesta
       success: Breyting á netfanginu þínu hefur verið staðfest.
       failure: Netfang hefur þegar verið staðfest með þessum lykli.
+      unknown_token: Þessi staðfestingarkóði er útrunninn eða er ekki til staðar.
     set_home:
       flash success: Staðsetning þín hefur verið stillt
     go_public:
@@ -1705,6 +2132,11 @@ is:
     list:
       title: Notendur
       heading: Notendur
+      showing:
+        one: Síða %{page} (%{first_item} af %{items})
+        other: Síða %{page} (%{first_item}-%{last_item} af %{items})
+      summary: '%{name} var útbúinn frá %{ip_address} þann %{date}'
+      summary_no_ip: '%{name} útbúinn þann %{date}'
       confirm: Staðfesta valda notendur
       hide: Fela valda notendur
       empty: Engir samsvarandi notendur fundust
@@ -1712,8 +2144,14 @@ is:
       title: Aðgangur frystur
       heading: Aðgangur frystur
       webmaster: vefstjóri
+      body: "<p>\nÞví miður, notandaaðgangurinn þinn hefur verið frystur vegna grunsamlegrar
+        \nvirkni.\n</p>\n<p>\nHafðu samband við <a href=\"%{webmaster}\">vefstjóra</a>
+        ef þú \nvilt ræða þetta mál.\n</p>"
     auth_failure:
+      connection_failed: Tenging við auðkenningarþjónustu mistókst
+      invalid_credentials: Ógild auðkenni sannvottunar
       no_authorization_code: Enginn auðkenningarkóði
+      unknown_signature_algorithm: Óþekkt reiknirit undirritunar
       invalid_scope: Ógilt notkunarsvið
   user_role:
     filter:
@@ -1750,6 +2188,9 @@ is:
       reason: 'Gefðu ástæðu fyrir því að þú viljir banna %{name}:'
       period: Hversu lengi á að banna notandann frá því að nota forritunarviðmótið?
       submit: Banna notandann
+      tried_contacting: Ég hef haft samband við notandann og beðið hann að hætta.
+      tried_waiting: Ég hef gefið notandanum sanngjarnan frest til að svara þessum
+        skilaboðum.
       needs_view: Notandinn þarf að innskrá sig áður en bannið fellur úr gildi.
       back: Listi yfir öll bönn
     edit:
@@ -1764,6 +2205,10 @@ is:
     filter:
       block_period: Banntíminn verður að vera í forstillingunum.
     create:
+      try_contacting: Endilega reyndu að hafa samband við notendur áður en þú bannar
+        þá og gefðu þeim sanngjarnan frest til að svara.
+      try_waiting: Endilega reyndu að gefa notendum sanngjarnan frest til að svara
+        áður en þú bannar þá.
       flash: Bjó til bann gegn %{name}.
     update:
       only_creator_can_edit: Aðeins stjórnandinn sem bjó til bannið getur breytt því.
@@ -1799,7 +2244,9 @@ is:
       previous: « Fyrri
     helper:
       time_future: Endar eftir %{time}
-      until_login: Virkt þangað til notandinn innskráir sig.
+      until_login: Virkt þangað til notandinn skráir sig inn.
+      time_future_and_until_login: Endar eftir %{time} og eftir að notandinn skráir
+        sig inn.
       time_past: Endaði fyrir %{time} síðan
     blocks_on:
       title: Bönn gegn %{name}
@@ -1837,6 +2284,10 @@ is:
       reopened_at_by_html: Endurvirkjað fyrir %{when} síðan af %{user}
     rss:
       title: Minnispunktar OpenStreetMap
+      description_area: Listi yfir minnispunkta sem hafa verið tilkynntir, gerðar
+        athugasemdir við eða hefur verið lokað á svæðinu þínu [(%{min_lat}|%{min_lon})
+        -- (%{max_lat}|%{max_lon})]
+      description_item: RSS-streymi fyrir minnispunkt %{id}
       opened: nýr minnispunktur (nálægt %{place})
       commented: ný athugasemd (nálægt %{place})
       closed: lokaður minnispunktur (nálægt %{place})
@@ -1845,7 +2296,11 @@ is:
       comment: Athugasemd
       full: Allur minnispunkturinn
     mine:
+      title: Minnispunktar sem hafa verið sendir inn eða gerðar athugasemdir við af
+        %{user}
       heading: Minnispunktar frá %{user}
+      subheading: Minnispunktar sem hafa verið sendir inn eða gerðar athugasemdir
+        við af %{user}
       id: Auðkenni (ID)
       creator: Búið til af
       description: Lýsing
@@ -1861,15 +2316,19 @@ is:
       link: Tengill eða HTML
       long_link: Tengill
       short_link: Stuttur tengill
+      geo_uri: Slóð hnattstaðsetningar
       embed: HTML
       custom_dimensions: Setja sérsniðnar stærðir
       format: 'Snið:'
       scale: 'Kvarði:'
+      image_size: Mynd mun sýna staðallagið á \
       download: Sækja
       short_url: Stutt URL-slóð
-      center_marker: Miðja kort á merki
+      include_marker: Hafa með kortamerkið
+      center_marker: Miðja kort á kortamerki
       paste_html: Notaðu þennan HTML kóða til að bæta kortinu á vefsíðu
       view_larger_map: Skoða stærra kort
+      only_standard_layer: Eingöngu er hægt að flytja staðallagið út sem mynd
     embed:
       report_problem: Tilkynna vandamál
     key:
@@ -1893,8 +2352,9 @@ is:
         notes: Minnispunktar á korti
         data: Gögn korts
         gps: Opinberir GPS-ferlar
+        overlays: Virkja yfirlög til að auðvelda lausn vandamála á kortinu
         title: Lög
-      copyright: © <a href='%{copyright_url}'>OpenStreetMap þátttakendur</a>
+      copyright: © <a href='%{copyright_url}'>Þáttakendur í OpenStreetMap verkefninu</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Styrkja verkefnið</a>
     site:
       edit_tooltip: Breyta kortinu
@@ -1914,13 +2374,23 @@ is:
         unhide_comment: hætta að fela
     notes:
       new:
+        intro: Fannstu mistök eða eitthvað sem vantar? Láttu aðra kortagerðarmenn
+          vita svo hægt sé að laga það. Færðu kortamerkið á réttan stað og skrifaðu
+          minnispunkt til að útskýra vandamálið.
+        advice: Minnispunkturinn þinn er opinber og gæti verið notaður til að uppfæra
+          kortið; því ættirðu ekki að setja inn neinar persónulegar upplýsingar, eða
+          upplýsingar úr höfundarvörðu efni.
         add: Bæta við minnispunkti
       show:
         hide: Fela
         resolve: Leysa
         reactivate: Virkja aftur
+        comment_and_resolve: Athugasemd & leysa
         comment: Athugasemd
+    edit_help: Færðu kortið og stilltu aðdrátt inn á staðinn sem þú vilt breyta, smelltu
+      síðan hér.
     directions:
+      ascend: Fara upp
       engines:
         graphhopper_bicycle: Reiðhjól (GraphHopper)
         graphhopper_car: Bíll (GraphHopper)
@@ -1929,9 +2399,7 @@ is:
         mapquest_car: Bíll (MapQuest)
         mapquest_foot: Fótgangandi (MapQuest)
         osrm_car: Bíll (OSRM)
-        mapzen_bicycle: Reiðhjól (Mapzen)
-        mapzen_car: Bíll (Mapzen)
-        mapzen_foot: Fótgangandi (Mapzen)
+      descend: Fara niður
       directions: Leiðir
       distance: Vegalengd
       errors:
@@ -1939,16 +2407,43 @@ is:
         no_place: Því miður, gat ekki fundið þennan stað.
       instructions:
         continue_without_exit: Haltu áfram á %{name}
+        slight_right_without_exit: Beygðu lítillega til hægri yfir á %{name}
+        offramp_right_without_exit: Farðu á rampinn til hægri yfir á %{name}
+        onramp_right_without_exit: Beygðu til hægri á rampinum inn á %{name}
         endofroad_right_without_exit: Við enda vegarins skaltu beygja til hægri inn
           á %{name}
+        merge_right_without_exit: Hliðraðu þér inn á akreinina til hægri inn á %{name}
+        fork_right_without_exit: Við kvíslunina skaltu beygja til hægri inn á %{name}
         turn_right_without_exit: Beygðu til hægri inn á %{name}
         sharp_right_without_exit: Kröpp hægribeygja inn á %{name}
+        uturn_without_exit: U-beygja meðfram %{name}
         sharp_left_without_exit: Kröpp vinstribeygja inn á %{name}
+        turn_left_without_exit: Beygðu til vinstri yfir á %{name}
+        offramp_left_without_exit: Farðu á rampinn til vinstri yfir á %{name}
+        onramp_left_without_exit: Beygðu til vinstri á rampinum inn á %{name}
         endofroad_left_without_exit: Við enda vegarins skaltu beygja til vinstri inn
           á %{name}
+        merge_left_without_exit: Hliðraðu þér inn á akreinina til vinstri inn á %{name}
+        fork_left_without_exit: Við kvíslunina skaltu beygja til vinstri inn á %{name}
+        slight_left_without_exit: Beygðu lítillega til vinstri yfir á %{name}
+        via_point_without_exit: (um punkt)
         follow_without_exit: Fylgja %{name}
+        roundabout_without_exit: Í hringtorginu, beygðu á %{name}
+        leave_roundabout_without_exit: Farðu út úr hringtorginu - %{name}
+        stay_roundabout_without_exit: Vertu áfram á hringtorginu - %{name}
         start_without_exit: Byrjaðu við endann á %{name}
         destination_without_exit: Farðu á leiðarenda
+        against_oneway_without_exit: Farðu á móti einstefnu á %{name}
+        end_oneway_without_exit: Einstefna endar á %{name}
+        roundabout_with_exit: Í hringtorginu, beygðu útaf við %{exit} afrein yfir
+          á %{name}
+        turn_left_with_exit: Í hringtorginu, beygðu til vinstri yfir á %{name}
+        slight_left_with_exit: Í hringtorginu, beygðu lítillega til vinstri yfir á
+          %{name}
+        turn_right_with_exit: Í hringtorginu, beygðu til hægri yfir á %{name}
+        slight_right_with_exit: Í hringtorginu, beygðu lítillega til hægri yfir á
+          %{name}
+        continue_with_exit: Í hringtorginu, hltu beint áframi yfir á %{name}
         unnamed: ónefnd gata
         courtesy: Leiðarlýsing í boði %{link}
       time: Tími
@@ -1969,12 +2464,33 @@ is:
   redaction:
     edit:
       description: Lýsing
+      heading: Breyta leiðréttingu
+      submit: Vista leiðréttingu
+      title: Breyta leiðréttingu
+    index:
+      empty: Engar leiðréttingar sem hægt er að birta.
+      heading: Listi yfir leiðréttingar
+      title: Listi yfir leiðréttingar
     new:
       description: Lýsing
+      heading: Settu inn upplýsingar um nýju leiðréttinguna
+      submit: Búa til leiðréttingu
+      title: Bý til nýja leiðréttingu
     show:
       description: 'Lýsing:'
+      heading: Birti leiðréttinguna "%{title}"
+      title: Birti leiðréttingu
       user: 'Gert af:'
+      edit: Breyta þessari leiðréttingu
+      destroy: Fjarlægja þessa leiðréttingu
       confirm: Ertu viss?
+    create:
+      flash: Leiðrétting útbúin.
     update:
       flash: Breytingar vistaðar.
+    destroy:
+      not_empty: Leiðréttingin er ekki auð. Taktu aftur allar útgáfur sem tilheyra
+        þessari leiðréttingu áður en henni er eytt.
+      flash: Leiðréttingu eytt.
+      error: Það kom upp villa við að eyða þessari leiðréttingu.
 ...
index 12ba09c64f4f1252a64dda1632a261513fddac19..97a481fa73e20d5079bebe3f2b373dfd9fbba72b 100644 (file)
@@ -380,7 +380,7 @@ it:
       map_image: Immagine Mappa (mostra livello standard)
       embeddable_html: HTML incapsulabile
       licence: Licenza
-      export_details: I dati OpenStreetMap sono rilasciati con <a href="http://opendatacommons.org/licenses/odbl/1.0/">licenza
+      export_details: I dati OpenStreetMap sono rilasciati con <a href="https://opendatacommons.org/licenses/odbl/1.0/">licenza
         Open Data Commons Open Database</a> (ODbL).
       too_large:
         advice: 'Se le esportazioni riportate sopra non riescono, prova con una delle
@@ -420,14 +420,14 @@ it:
   geocoder:
     search:
       title:
-        latlon: Risultati da <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Risultati da <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Risultati da <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Risultati da <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Risultati restituiti da <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Risultati da <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Risultati restituiti da <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Risultati da <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Risultati restituiti da <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Risultati restituiti da <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Risultati da <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -477,33 +477,26 @@ it:
           crematorium: Crematorio
           dentist: Dentista
           doctors: Medici
-          dormitory: Dormitorio
           drinking_water: Acqua potabile
           driving_school: Scuola guida
           embassy: Ambasciata
-          emergency_phone: Colonnina SOS
           fast_food: Fast Food
           ferry_terminal: Terminal traghetti
-          fire_hydrant: Pompa antincendio
           fire_station: Vigili del fuoco
           food_court: Area ristorazione
           fountain: Fontana
           fuel: Stazione di rifornimento
           gambling: Gioco d'azzardo
           grave_yard: Cimitero
-          gym: Centro fitness / Palestra
-          health_centre: Casa di cura
           hospital: Ospedale
           hunting_stand: Postazione di caccia
           ice_cream: Gelateria
           kindergarten: Asilo infantile
           library: Biblioteca
-          market: Mercato
           marketplace: Mercato
           monastery: Monastero
           motorcycle_parking: Parcheggio per Moto
           nightclub: Night Club
-          nursery: Asilo nido
           nursing_home: Residenza sanitaria assistenziale
           office: Ufficio
           parking: Parcheggio
@@ -517,7 +510,6 @@ it:
           prison: Prigione
           pub: Pub
           public_building: Edificio pubblico
-          reception_area: Area accoglienza
           recycling: Punto riciclaggio rifiuti
           restaurant: Ristorante
           retirement_home: Casa di Riposo
@@ -572,6 +564,8 @@ it:
           defibrillator: Defibrillatore
           landing_site: Luogo per l'atterraggio di emergenza
           phone: Telefono di emergenza
+          water_tank: Serbatoio d'acqua di emergenza
+          "yes": Emergenza
         highway:
           abandoned: Autostrada abbandonata
           bridleway: Percorso per equitazione
@@ -588,6 +582,7 @@ it:
           motorway: Autostrada
           motorway_junction: Uscita autostradale
           motorway_link: Autostrada
+          passing_place: Piazzola di sosta
           path: Sentiero
           pedestrian: Percorso pedonale
           platform: Piattaforma
@@ -604,6 +599,7 @@ it:
           services: Stazione di servizio
           speed_camera: Autovelox fisso
           steps: Scala
+          stop: Segnale di arresto
           street_lamp: Lampione
           tertiary: Strada terziaria
           tertiary_link: Strada terziaria
@@ -613,7 +609,6 @@ it:
           trunk: Superstrada
           trunk_link: Superstrada
           unclassified: Strada non classificata
-          unsurfaced: Strada non pavimentata
           "yes": Strada
         historic:
           archaeological_site: Sito archeologico
@@ -632,6 +627,7 @@ it:
           manor: Maniero
           memorial: Memoriale
           mine: Mina
+          mine_shaft: Pozzo minerario
           monument: Monumento
           roman_road: Strada romana
           ruins: Rovine
@@ -641,6 +637,7 @@ it:
           wayside_cross: Croce
           wayside_shrine: Edicola votiva
           wreck: Relitto
+          "yes": Sito storico
         junction:
           "yes": Incrocio
         landuse:
@@ -678,7 +675,6 @@ it:
         leisure:
           beach_resort: Stabilimento balneare
           bird_hide: Osservatorio Camuffato
-          club: Club
           common: Area comune (UK)
           dog_park: Parco per cani
           fishing: Riserva di pesca
@@ -705,9 +701,16 @@ it:
           water_park: Parco acquatico
           "yes": Tempo libero
         man_made:
+          bridge: Ponte
+          gasometer: Gasometro
           lighthouse: Faro
+          mineshaft: Pozzo minerario
+          monitoring_station: Stazione di monitoraggio
+          petroleum_well: Pozzo petrolifero
           pipeline: Tubazione
+          surveillance: Sorveglianza
           tower: Torre
+          windmill: Mulino a vento
           works: Fabbrica
           "yes": Artificiale
         military:
@@ -771,8 +774,6 @@ it:
           "yes": Ufficio
         place:
           allotments: Orti casalinghi
-          block: Blocco
-          airport: Aeroporto
           city: Città
           country: Nazione
           county: Contea (in Italia NON usare)
@@ -784,12 +785,12 @@ it:
           islet: Isoletta
           isolated_dwelling: Case sparse
           locality: Località (luogo con nome, non popolato)
-          moor: Molo
           municipality: Comune
           neighbourhood: Quartiere
           postcode: CAP
           region: Provincia
           sea: Mare
+          square: Piazza
           state: Regione
           subdivision: Suddivisione
           suburb: Quartiere
@@ -801,10 +802,8 @@ it:
           abandoned: Ferrovia abbandonata
           construction: Ferrovia in costruzione
           disused: Ferrovia in disuso
-          disused_station: Stazione ferroviaria in disuso
           funicular: Funicolare
           halt: Fermata del treno
-          historic_station: Stazione ferroviaria storica
           junction: Nodo ferroviario
           level_crossing: Passaggio a livello
           light_rail: Metropolitana leggera
@@ -868,12 +867,12 @@ it:
           hairdresser: Parrucchiere
           hardware: Ferramenta
           hifi: Hi-Fi
-          insurance: Assicurazioni
           jewelry: Gioielleria
           kiosk: Edicola
           laundry: Lavanderia
           mall: Centro commerciale
           market: Mercato
+          massage: Massaggio
           mobile_phone: Centro telefonia mobile
           motorcycle: Concessionario di motociclette
           music: Articoli musicali
@@ -884,10 +883,9 @@ it:
           pet: Negozio animali
           pharmacy: Farmacia
           photo: Articoli fotografici
-          salon: Salone
+          seafood: Frutti di mare
           second_hand: Negozio oggetti usati
           shoes: Negozio di calzature
-          shopping_centre: Centro commerciale
           sports: Articoli sportivi
           stationery: Cartoleria
           supermarket: Supermercato
@@ -895,7 +893,7 @@ it:
           toys: Negozio di giocattoli
           travel_agency: Agenzia di viaggi
           video: Videoteca
-          wine: Alcolici
+          wine: Negozio di vini
           "yes": Negozio
         tourism:
           alpine_hut: Rifugio alpino
@@ -950,7 +948,7 @@ it:
         level10: Confine amministrativo 10º livello - Subcittadino, quartiere
     description:
       title:
-        osm_nominatim: Località da <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Località da <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Località da <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1026,20 +1024,20 @@ it:
       title_html: Copyright e licenza
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> è <i>open data</i>, e i suoi dati sono distribuiti con licenza <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) dalla <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) dalla <a href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: "Sei libero di copiare, distribuire, trasmettere e adattare i
         nostri dati, finché lo attribuisci a OpenStreetMap e ai suoi contributori.
         Se alteri o ti basi sui nostri dati,\npuoi distribuire il risultato solo sotto
-        la stessa licenza. Il \n<a href=\"http://opendatacommons.org/licenses/odbl/1.0/\">codice\nlegale
+        la stessa licenza. Il \n<a href=\"https://opendatacommons.org/licenses/odbl/1.0/\">codice\nlegale
         completo</a> illustra i tuoi diritti e le tue responsabilità."
       intro_3_html: "La cartografia contenuta nelle nostre tavole, e la nostra documentazione,
-        sono rilasciate sotto licenza <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative
-        \nCommons Attribuzione - Condividi allo stesso modo 2.0</a> (CC-BY-SA)."
+        sono rilasciate sotto licenza <a href=\"https://creativecommons.org/licenses/by-sa/2.0/\">Creative
+        \nCommons Attribuzione - Condividi allo stesso modo 2.0</a> (CC BY-SA)."
       credit_title_html: Come si attribuisce a OpenStreetMap
       credit_1_html: Si richiede che l'attribuzione sia &ldquo;&copy; OpenStreetMap
         contributors &rdquo;.
       credit_2_html: |-
-        Inoltre devi specificare chiaramente che i dati sono disponibili sotto la Open Database Licese e, se usi le nostre tavole, che la cartografia è pubblicata con licenza CC-BY-SA. Puoi fare ciò mettendo un collegamento URL a <a href="http://www.openstreetmap.org/copyright">questa pagina di copyright</a>.
+        Inoltre devi specificare chiaramente che i dati sono disponibili sotto la Open Database Licese e, se usi le nostre tavole, che la cartografia è pubblicata con licenza CC BY-SA. Puoi fare ciò mettendo un collegamento URL a <a href="https://www.openstreetmap.org/copyright">questa pagina di copyright</a>.
         In alternativa, e necessariamente se stai distribuendo OSM sotto forma di dati, puoi citare e creare un collegamento diretto alle licenze. In mezzi di comunicazione dove i collegamenti URL non sono possibili (per esempio un'opera stampata), ti suggeriamo di indirizzare i lettori verso openstreetmap.org (magari esplicitando 'OpenStreetMap' come nome completo), verso opendatacommons.org e, se necessario, verso creativecommons.org.
       credit_3_html: |-
         In una mappa elettronica navigabile, i crediti devono essere mostrati nell'angolo della mappa.
@@ -1049,7 +1047,7 @@ it:
         title: Esempio di attribuzione
       more_title_html: Per saperne di più
       more_1_html: Per saperne di più su come utilizzare i nostri dati e come citarne
-        correttamente la fonte, consulta la pagina sulla <a href="http://osmfoundation.org/Licence">Licenza
+        correttamente la fonte, consulta la pagina sulla <a href="https://osmfoundation.org/Licence">Licenza
         OSMF</a>.
       more_2_html: |-
         Anche se i dati OpenStreetMap sono aperti, non possiamo fornire accesso alle API della mappa gratuitamente per terze parti.
@@ -1062,10 +1060,10 @@ it:
         cartografiche nazionali o di altra fonte, tra cui:'
       contributors_at_html: |-
         <strong>Austria</strong>: contiene i dati della
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (sotto
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> e
-        Land Tirol (sotto <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT con emendamenti</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (sotto
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> e
+        Land Tirol (sotto <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT con emendamenti</a>).
       contributors_ca_html: |-
         <strong>Canada</strong>: contiene i dati della
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1073,16 +1071,16 @@ it:
         Resources Canada), e della StatCan (Geography Division,
         Statistics Canada).
       contributors_fi_html: |-
-        <strong>Finlandia</strong>: Contiene dati dal
+        <strong>Finlandia</strong>: contiene dati dal
         National Land Survey of Finland's Topographic Database
         e di altri set di dati, in base alla
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licensa NLSFI</a>.
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">licensa NLSFI</a>.
       contributors_fr_html: |-
         <strong>Francia</strong>: contiene dati provenienti dalla
         Direction Générale des Impôts.
       contributors_nl_html: |-
         <strong>Olanda</strong>: contiene dati &copy; AND, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Nuova Zelanda</strong>: contiene i dati provenienti dalla
         Land Information New Zealand. Crown Copyright reserved.
@@ -1102,7 +1100,7 @@ it:
       contributors_footer_1_html: |-
         Per ulteriori dettagli di queste e altre fonti che sono state utilizzate
         per aiutare a migliorare OpenStreetMap, consulta la <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">pagina dei
+        href="https://wiki.openstreetmap.org/wiki/Contributors">pagina dei
         collaboratori</a> sul wiki di OpenStreetMap.
       contributors_footer_2_html: |-
         L'inserimento dei dati in OpenStreetMap non implica che il fornitore
@@ -1114,13 +1112,13 @@ it:
         senza esplicita autorizzazione dei titolare del copyright.
       infringement_2_html: |-
         Se ritieni che materiale protetto da copyright sia stato impropriamente aggiunto al database di OpenStreetMap o a questo sito, consulta la nostra
-         <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedura di rimozione per violazione del copyright</a> o segnalacelo direttamente alla nostra
+         <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procedura di rimozione per violazione del copyright</a> o segnalacelo direttamente alla nostra
         <a href="http://dmca.openstreetmap.org/">pagina di segnalazione on-line</a>.
       trademarks_title_html: <span id="trademarks"></span>Marchi registrati
       trademarks_1_html: '"OpenStreetMap", il logo con la lente d''ingrandimento e
         "State of the Map" sono marchi registrati della <i>Fondazione OpenStreetMap</i>.
-        Se avete domande sull''uso dei marchi, inviatele al <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">gruppo
-        di lavoro per le licenze</a>.'
+        Se avete domande sull''uso dei marchi, vedi la nostra <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">politica
+        sui marchi</a>.'
   welcome_page:
     title: Benvenuto!
     introduction_html: Benvenuti in OpenStreetMap, la mappa del mondo libera e modificabile.
@@ -1152,8 +1150,8 @@ it:
       paragraph_1_html: "OpenStreetMap ha poche regole formali, ma ci aspettiamo che
         tutti i partecipanti collaborino e comunichino con la comunità. Se stai considerando
         qualsiasi altra attività oltre all'editing manuale, dovresti prima leggere
-        le linee guida sulle <a href=\"http://wiki.openstreetmap.org/wiki/IT:Import/Guidelines\">importazioni</a>
-        e \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">modifiche
+        le linee guida sulle <a href=\"https://wiki.openstreetmap.org/wiki/IT:Import/Guidelines\">importazioni</a>
+        e \n<a href=\"https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">modifiche
         automatiche</a> e seguire le loro indicazioni."
     questions:
       title: Domande?
@@ -1188,7 +1186,7 @@ it:
       title: Ulteriori dubbi
       explanation_html: Se hai dubbi su come i nostri dati vengono utilizzati consulta
         la nostra <a href='/copyright'>pagina sulle licenze</a> per ulteriori informazioni
-        legali, oppure contatta <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>il
+        legali, oppure contatta <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>il
         gruppo di lavoro OSMF</a>.
   help_page:
     title: Come ottenere aiuto
@@ -1200,7 +1198,7 @@ it:
       title: Benvenuti in OSM
       description: Inizia con questa guida rapida che copre le basi di OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/IT:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/IT:Beginners%27_guide
       title: Guida per Principianti
       description: Guida per i principianti gestita dalla community.
     help:
@@ -1224,7 +1222,7 @@ it:
       description: Aiuto per imprese e organizzazioni che intendono migrare a mappe
         e altri servizi basati su OpenStreetMap.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Sfoglia il wiki per la documentazione approfondita di OSM.
   about_page:
@@ -1245,8 +1243,8 @@ it:
       GIS, ingegneri che gestiscono i server di OSM, mapping umanitario di aree soggette
       a disastri e molto altro. Per ulteriori informazioni sulla comunità, consulta
       il <a href='https://blog.openstreetmap.org'>blog OpenStreetMap</a>, i <a href='%{diary_path}'>diari
-      degli utenti</a>, il <a href='http://blogs.openstreetmap.org/'>blog della comunità</a>,
-      e il sito <a href='http://www.osmfoundation.org/'>OSM Foundation</a>.
+      degli utenti</a>, il <a href='https://blogs.openstreetmap.org/'>blog della comunità</a>,
+      e il sito <a href='https://www.osmfoundation.org/'>OSM Foundation</a>.
     open_data_title: Open Data
     open_data_html: 'OpenStreetMap è <i>open data</i>: sei libero di usarla per qualsiasi
       scopo a patto di attribuirla a OpenStreetMap e ai suoi contributori. Se alteri
@@ -1255,13 +1253,15 @@ it:
       Copyright e Licenza</a> per i dettagli.'
     legal_title: Note legali
     legal_html: "Questo sito e molti altri servizi correlati sono formalmente gestiti
-      dalla \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF)
-      \nper conto della comunità. L'uso di tutti i servizi gestiti dalla OSMF è soggetto
-      \nalle nostre <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nregole
-      di utilizzo accettabile</a> ed alla nostra <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">informativa
-      sulla privacy</a>\n<br> \nSi prega di <a href=\"http://osmfoundation.org/Contact\">contattare
+      dalla \n<a href=\"https://osmfoundation.org/\">OpenStreetMap Foundation</a>
+      (OSMF) \nper conto della comunità. L'uso di tutti i servizi gestiti dalla OSMF
+      è soggetto \nalle nostre <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nregole
+      di utilizzo accettabile</a> ed alla nostra <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">informativa
+      sulla privacy</a>\n<br> \nSi prega di <a href=\"https://osmfoundation.org/Contact\">contattare
       la OSMF</a> \nin caso di dubbi e problemi di licenza, copyright o altre questioni
-      legali."
+      legali.\n<br>\n\"OpenStreetMap\", il logo con la lente d'ingrandimento e \"State
+      of the Map\" sono <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">sono
+      marchi registrati della OSMF</a>."
     partners_title: Partner
   notifier:
     diary_comment_notification:
@@ -1476,13 +1476,14 @@ it:
       user_page_link: pagina utente
       anon_edits_link_text: Leggi il perché.
       flash_player_required: È necessario un visualizzatore Flash per utilizzare Potlatch,
-        il programma Flash per le modifiche di OpenStreetMap. Si può <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">scaricare
-        il Flash Player da Adobe.com</a>. Sono disponibili anche <a href="http://wiki.openstreetmap.org/wiki/Editing">altre
+        il programma Flash per le modifiche di OpenStreetMap. Si può <a href="https://get.adobe.com/flashplayer/">scaricare
+        il Flash Player da Adobe.com</a>. Sono disponibili anche <a href="https://wiki.openstreetmap.org/wiki/Editing">altre
         possibilità</a> per apportare modifiche a OpenStreetMap.
       potlatch_unsaved_changes: Ci sono modifiche non salvate. (Per salvare in Potlatch,
         si dovrebbe deselezionare il percorso o nodo corrente, se si sta editando
         nella modalità 'list', o cliccare sul bottone salva se presente.)
-      potlatch2_not_configured: Potlatch 2 non è stato configurato - vedi http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2 non è stato configurato - vedi https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+        per ulteriori informazioni
       potlatch2_unsaved_changes: Ci sono delle modifiche non salvate. (Per salvare
         in Potlatch 2 è necessario premere il tasto di salvataggio.)
       id_not_configured: iD non è stato configurato
@@ -1574,7 +1575,7 @@ it:
       edit: Modifica
       preview: Anteprima
     markdown_help:
-      title_html: Analizzato con <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Analizzato con <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Intestazioni
       heading: Intestazione
       subheading: Sottotitolo
@@ -1687,7 +1688,7 @@ it:
       description: Naviga fra i tracciati GPS caricati recentemente
       tagged_with: ' etichettati con %{tags}'
       empty_html: Ancora niente qui. <a href='%{upload_link}'>Carica una nuova traccia</a>
-        o leggi ulteriori informazioni sul tracciamento GPS nella <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pagina
+        o leggi ulteriori informazioni sul tracciamento GPS nella <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pagina
         wiki</a>.
     delete:
       scheduled_for_deletion: Tracciato in attesa di essere eliminato
@@ -1901,12 +1902,12 @@ it:
           <p>A differenza di altre mappe, OpenStreetMap è completamente creato da persone come te
            ed è libero per chiunque per correggerlo, aggiornarlo, scaricarlo ed usarlo.</p>
           <p>Registrati per iniziare a contribuire. Ti invieremo un'email per confermare il tuo account.</p>
-      license_agreement: Quando confermi il tuo profilo devi accettare le <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">regole
+      license_agreement: Quando confermi il tuo profilo devi accettare le <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">regole
         per contribuire</a>.
       email address: 'Indirizzo email:'
       confirm email address: 'Conferma indirizzo email:'
       not displayed publicly: Il tuo indirizzo non visualizzato pubblicamente, vedi
-        l'<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
+        l'<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
         privacy policy including section on email addresses">informativa sulla privacy</a>
         per ulteriori informazioni
       display name: 'Nome visualizzato:'
@@ -1924,6 +1925,7 @@ it:
       terms declined: Siamo spiacenti che tu abbia deciso di non accettare i nuovi
         termini di contribuzione. Per ulteriori informazioni consultare <a href="%{url}">questa
         pagina del wiki</a>.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: Regole per contribuire
       heading: Regole per contribuire
@@ -2029,7 +2031,7 @@ it:
       email never displayed publicly: (mai visualizzato pubblicamente)
       external auth: 'Autenticazione Esterna:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/IT:OpenID
+        link: https://wiki.openstreetmap.org/wiki/IT:OpenID
         link text: che cos'è questo?
       public editing:
         heading: 'Modifiche pubbliche:'
@@ -2045,7 +2047,7 @@ it:
           messaggi o vedere la tua posizione. Per rendere visibili le tue modifiche
           e per permettere agli altri utenti di contattarti tramite il sito, clicca
           sul pulsante sotto. <b>Dalla versione 0.6 delle API, soltanto gli utenti
-          pubblici possono modificare i dati della mappa</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">scopri
+          pubblici possono modificare i dati della mappa</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">scopri
           perché</a>).<ul><li>Il tuo indirizzo email non sarà reso pubblico.</li><li>Questa
           decisione non può essere revocata e tutti i nuovi utenti sono ora pubblici
           in modo predefinito.</li></ul>
@@ -2057,6 +2059,7 @@ it:
           accettare le nuove regole per contribuire.
         agreed_with_pd: Hai anche dichiarato di considerare le tue modifiche di Pubblico
           Dominio.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: che cos'è questo?
       profile description: 'Descrizione del profilo:'
       preferred languages: 'Lingua preferita:'
@@ -2109,7 +2112,7 @@ it:
       press confirm button: Premere sul pulsante di conferma sottostante per confermare
         il nuovo indirizzo email.
       button: Conferma
-      success: Confermato il cambio di indirizzo e-mail!
+      success: Confermata la modifica di indirizzo email!
       failure: Un indirizzo email con questo codice è già stato confermato.
       unknown_token: Questo codice di conferma è scaduto oppure non esiste.
     set_home:
@@ -2393,9 +2396,7 @@ it:
       new:
         intro: Ti sei accorto di un errore o di qualcosa che manca? Fallo sapere agli
           altri mappatori così possono correggerlo. Sposta il puntatore nella posizione
-          esatta e inserisci una nota per spiegare il problema. (Per favore non inserire
-          qui le tue informazioni personali, informazioni da mappe protette da copyright
-          o da elenchi)
+          esatta e inserisci una nota per spiegare il problema.
         add: Aggiungi la nota
       show:
         anonymous_warning: Questa nota include commenti da parte di utenti anonimi
@@ -2417,9 +2418,6 @@ it:
         mapquest_car: Auto (MapQuest)
         mapquest_foot: A piedi (MapQuest)
         osrm_car: Auto (OSRM)
-        mapzen_bicycle: Bicicletta (Mapzen)
-        mapzen_car: Auto (Mapzen)
-        mapzen_foot: Piedi (Mapzen)
       descend: Discesa
       directions: Indicazioni
       distance: Distanza
index 52341707f67dff2076b0ec30e10dd695b857763c..bf94aeb094d6600c86a0176b9fb2c79b13e42ac6 100644 (file)
@@ -159,6 +159,7 @@ ja:
         title_comment: 変更セット %{id} - %{comment}
       join_discussion: 議論に参加するにはログインしてください
       discussion: 議論
+      still_open: 変更セットが開いたままです - 議論を行うには変更セットが閉じられている必要があります。
     node:
       title: 'ノード: %{name}'
       history_title: 'ノードの履歴: %{name}'
@@ -359,7 +360,7 @@ ja:
       map_image: 地図画像 (標準レイヤーを表示)
       embeddable_html: 埋め込み HTML
       licence: ライセンス
-      export_details: OpenStreetMap のデータは <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: OpenStreetMap のデータは <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL) の下にライセンスされています。
       too_large:
         advice: '上のエクスポートが失敗した場合は、以下に列挙した情報源のいずれかの使用を検討してください:'
@@ -394,13 +395,13 @@ ja:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">Internal</a>からの結果
+        latlon: <a href="https://openstreetmap.org/">Internal</a>からの結果
         uk_postcode: <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>からの結果
-        ca_postcode: <a href="http://geocoder.ca/">Geocoder.CA</a>からの結果
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: <a href="https://geocoder.ca/">Geocoder.CA</a>からの結果
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> からの結果
         geonames: <a href="http://www.geonames.org/">GeoNames</a> からの結果
-        osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> からの結果
         geonames_reverse: <a href="http://www.geonames.org/">GeoNames</a> からの結果
     search_osm_nominatim:
@@ -450,33 +451,26 @@ ja:
           crematorium: 火葬場
           dentist: 歯科医
           doctors: 医師
-          dormitory: 寮
           drinking_water: 飲み水
           driving_school: 自動車学校
           embassy: 大使館
-          emergency_phone: 緊急電話
           fast_food: ファストフード
           ferry_terminal: フェリー乗り場
-          fire_hydrant: 消火栓
           fire_station: 消防署
           food_court: フードコート
           fountain: 噴水
           fuel: 燃料
           gambling: ギャンブル
           grave_yard: 墓地
-          gym: フィットネス センター/ジム
-          health_centre: 保健所
           hospital: 病院
           hunting_stand: ハンティング スタンド
           ice_cream: アイスクリーム販売店
           kindergarten: 幼稚園
           library: 図書館
-          market: 市場
           marketplace: 市場
           monastery: 修道院
           motorcycle_parking: バイクの駐輪場
           nightclub: ナイト クラブ
-          nursery: 保育所
           nursing_home: 老人ホーム
           office: オフィス
           parking: 駐車場
@@ -490,7 +484,6 @@ ja:
           prison: 刑務所
           pub: パブ
           public_building: 公共建築物
-          reception_area: レセプションエリア
           recycling: リサイクル場
           restaurant: レストラン
           retirement_home: 老人ホーム
@@ -586,7 +579,6 @@ ja:
           trunk: 国道
           trunk_link: 国道
           unclassified: 未分類の道路
-          unsurfaced: 未舗装道路
           "yes": 道路
         historic:
           archaeological_site: 考古学サイト
@@ -651,7 +643,6 @@ ja:
         leisure:
           beach_resort: ビーチ リゾート
           bird_hide: 観察小屋
-          club: クラブ
           common: 共有地
           dog_park: ドッグ・パーク
           fishing: 釣り場
@@ -682,6 +673,8 @@ ja:
         man_made:
           lighthouse: 灯台
           pipeline: パイプライン
+          silo: サイロ
+          storage_tank: 貯蔵タンク
           tower: 塔
           works: 工房
           "yes": 人工
@@ -735,6 +728,7 @@ ja:
           administrative: 管理
           architect: 建築士
           company: 会社
+          educational_institution: 教育施設
           employment_agency: 職業紹介
           estate_agent: 不動産代理店
           government: 官公庁
@@ -746,8 +740,6 @@ ja:
           "yes": オフィス
         place:
           allotments: 家庭菜園
-          block: ブロック
-          airport: 空港
           city: 市
           country: 国
           county: 郡
@@ -759,7 +751,6 @@ ja:
           islet: 小島
           isolated_dwelling: 免震住宅
           locality: 地域
-          moor: 沼地
           municipality: 市町村
           neighbourhood: 小字
           postcode: Postcode
@@ -776,10 +767,8 @@ ja:
           abandoned: 廃止鉄道
           construction: 建設中の鉄道
           disused: 廃線跡
-          disused_station: 廃駅
           funicular: ケーブル鉄道
           halt: 列車停止
-          historic_station: 廃駅
           junction: 鉄道連絡駅
           level_crossing: 踏切
           light_rail: ライトレール
@@ -843,7 +832,6 @@ ja:
           hairdresser: 美容室
           hardware: ホームセンター
           hifi: 高級オーディオ
-          insurance: 保険
           jewelry: 宝石店
           kiosk: キオスク
           laundry: クリーニング店
@@ -856,21 +844,24 @@ ja:
           optician: メガネ店
           organic: 有機食材店
           outdoor: アウトドア ショップ
+          paint: 画材店
           pet: ペット ショップ
           pharmacy: 薬局
           photo: 写真屋
-          salon: サロン
+          seafood: 海鮮品屋
           second_hand: 中古品店
           shoes: 靴屋
-          shopping_centre: ショッピング センター
           sports: スポーツ用品専門店
           stationery: 文房具店
           supermarket: スーパーマーケット
           tailor: 洋服店
+          ticket: チケット店
+          tobacco: タバコ屋
           toys: 玩具店
           travel_agency: 旅行代理店
+          variety_store: 雑貨店
           video: ビデオ ショップ
-          wine: 
+          wine: ワイン
           "yes": 店舗
         tourism:
           alpine_hut: 高山小屋
@@ -925,7 +916,7 @@ ja:
         level10: 街区境
     description:
       title:
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> からの位置
         geonames: <a href="http://www.geonames.org/">GeoNames</a> からの位置
       types:
@@ -994,17 +985,17 @@ ja:
       title_html: 著作権とライセンス
       intro_1_html: |-
         OpenStreetMap<a href="#trademarks">&reg;</a> は著作権者である<a
-        href="http://osmfoundation.org/">OpenStreetMap財団</a> (OSMF)が<a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) の下にライセンスする<i>オープンデータ</i>です。
+        href="https://osmfoundation.org/">OpenStreetMap財団</a> (OSMF)が<a
+        href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) の下にライセンスする<i>オープンデータ</i>です。
       intro_2_html: OpenStreetMapとその協力者をクレジットすれば、データを自由にコピー、配布、送信、利用することができます。変更したり翻案したりしたデータは同じライセンスに従う場合のみ、提供することができます。あなたの権利と責任は、<a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">ライセンス契約</a>の全文で説明しています。
+        href="https://opendatacommons.org/licenses/odbl/1.0/">ライセンス契約</a>の全文で説明しています。
       intro_3_html: |-
-        地図タイルの作成法やドキュメントは、<a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        地図タイルの作成法やドキュメントは、<a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons Attribution-ShareAlike 2.0</a> ライセンス (CC BY-SA) に基づいてライセンスされます。
       credit_title_html: OpenStreetMap のクレジット表記の仕方
       credit_1_html: '&ldquo;&copy; OpenStreetMap contributors&rdquo;のクレジットを必ず使用してください。'
       credit_2_html: あなたはデータが Open Database License に基づいて提供されていること、そして地図タイルを使用する場合は、地図製作が
-        CC BY-SA としてライセンスされていることを明確にしなければなりません。<a href="http://www.openstreetmap.org/copyright">著作権表示ページ</a>にリンクすることでこれを表現することができます。また、データの形式でOpenStreetMapを配布する場合の要件として、名前を表示の上、ライセンスに直接リンクすることができます。リンクを張れないメディア(印刷など)の場合は、openstreetmap.org(OpenStreetMapをアドレスとして展開した形)、opendatacommons.org、さらに関連がある場合はcreativecommons.orgへ読者を誘導することをお勧めします。
+        CC BY-SA としてライセンスされていることを明確にしなければなりません。<a href="https://www.openstreetmap.org/copyright">著作権表示ページ</a>にリンクすることでこれを表現することができます。また、データの形式でOpenStreetMapを配布する場合の要件として、名前を表示の上、ライセンスに直接リンクすることができます。リンクを張れないメディア(印刷など)の場合は、openstreetmap.org(OpenStreetMapをアドレスとして展開した形)、opendatacommons.org、さらに関連がある場合はcreativecommons.orgへ読者を誘導することをお勧めします。
       credit_3_html: |-
         閲覧可能な電子地図の場合は、地図の隅にクレジットを表示してください。
         例:
@@ -1014,26 +1005,26 @@ ja:
       more_title_html: 詳細を見る
       more_1_html: |-
         データの利用やクレジット方法についての詳細は<a
-        href="http://osmfoundation.org/Licence">OSMF ライセンスページ</a>をお読みください。
+        href="https://osmfoundation.org/Licence">OSMF ライセンスページ</a>をお読みください。
       more_2_html: OpenStreetMap はオープンデータですが、サードパーティーの開発者のための無料の地図 API は提供できません。<a
         href="https://operations.osmfoundation.org/policies/api/">API 利用規約</a>、<a
         href="https://operations.osmfoundation.org/policies/tiles/">タイル利用規約</a>ならびに<a
         href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim利用ポリシー</a>をお読みください。
       contributors_title_html: 協力者
       contributors_intro_html: 数千人もの個人が協力者となっています。それに加え、各国の地図作成機関や、以下のように、その他の情報源も含め、公開されたライセンスによるデータを含みます。
-      contributors_at_html: '<strong>オーストリア</strong>: <a href="http://data.wien.gv.at/">Stadt
-        Wien</a> (ライセンス <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
-        BY</a>)、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
-        Vorarlberg</a>、Land Tirol (ライセンス <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
+      contributors_at_html: '<strong>オーストリア</strong>: <a href="https://data.wien.gv.at/">Stadt
+        Wien</a> (ライセンス <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC
+        BY</a>)、<a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+        Vorarlberg</a>、Land Tirol (ライセンス <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
         BY AT with amendments</a>) によるデータを含みます。'
       contributors_ca_html: '<strong>カナダ</strong>: GeoBase&reg;、GeoGratis (&copy;
         Department of Natural Resources Canada)、CanVec (&copy; Department of Natural
         Resources Canada)、StatCan (Geography Division, Statistics Canada) によるデータを含みます。'
-      contributors_fi_html: '<strong>フィンランド</strong>: <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI
+      contributors_fi_html: '<strong>フィンランド</strong>: <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI
         License</a>に基づき、National Land Survey of Finland''s Topographic Database及びその他のデータセットのデータを含んでいます。'
       contributors_fr_html: '<strong>フランス</strong>: Direction Générale des Impôts
         によるデータを含みます。'
-      contributors_nl_html: '<strong>オランダ</strong>: &copy; AND データ、2007 (<a href="http://www.and.com">www.and.com</a>)
+      contributors_nl_html: '<strong>オランダ</strong>: &copy; AND データ、2007 (<a href="https://www.and.com">www.and.com</a>)
         を含みます。'
       contributors_nz_html: '<strong>ニュージーランド</strong>: Land Information New Zealand
         によるデータを含みます。著作権はクラウン・コピーライトになります。'
@@ -1045,17 +1036,17 @@ ja:
         right 2010-12 を含みます。'
       contributors_footer_1_html: |-
         これらの詳細について、またOpenStreetMapの向上に使用されたその他のソースについては、OpenStreetMap Wikiの<a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">協力者ページ</a>をご覧ください。
+        href="https://wiki.openstreetmap.org/wiki/Contributors">協力者ページ</a>をご覧ください。
       contributors_footer_2_html: OpenStreetMapのデータに含めることは、元データの提供者がOpenStreetMapを支持したり、何かしらの保証を行ったり、何かしらの責任を負ったりすることを意味するものではありません。
       infringement_title_html: 著作権侵害
       infringement_1_html: 'OpenStreetMapの協力者は、著作権者から明確な許諾を得ずに、著作権のある情報源 (例: Google
         マップや印刷された地図) から決してデータを持ち込まないよう注意するものとします。'
       infringement_2_html: もし著作権のある素材がOpenStreetMapのデータベースや本サイトに不正に追加されたとお考えの場合は、<a
-        href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">却下手順</a>をお読みになるか、<a
-        href="http://dmca.openstreetmap.org/"オンライン却下のページ</a>から直接申し立てを行ってください。
+        href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">却下手順</a>をお読みになるか、<a
+        href="http://dmca.openstreetmap.org">オンライン却下のページ</a>から直接申し立てを行ってください。
       trademarks_title_html: <span id="trademarks"></span>商標
-      trademarks_1_html: OpenStreetMapã\81ªã\82\89ã\81³ã\81«æ\8b¡å¤§é\8f¡ã\81®ã\83­ã\82´ã\81\8aã\82\88ã\81³State of the Mapã\81¯OpenStreetMap財å\9b£ã\81®ç\99»é\8c²å\95\86æ¨\99ã\81§ã\81\99ã\80\82å\95\86æ¨\99ã\81®å\88©ç\94¨ã\81«é\96¢ã\81\99ã\82\8bã\81\8aå\95\8fã\81\84å\90\88ã\82\8fã\81\9bã\81¯<a
-        href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">ライセンス担当部</a>までお寄せください。
+      trademarks_1_html: OpenStreetMapã\81ªã\82\89ã\81³ã\81«æ\8b¡å¤§é\8f¡ã\81®ã\83­ã\82´ã\81\8aã\82\88ã\81³State of the Mapã\81¯OpenStreetMap財å\9b£ã\81®ç\99»é\8c²å\95\86æ¨\99ã\81§ã\81\99ã\80\82å\95\86æ¨\99ã\81®å\88©ç\94¨ã\81«é\96¢ã\81\97ã\81¦ã\81¯ã\80\81<a
+        href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">商標利用ポリシー</a>を参照ください。
   welcome_page:
     title: ようこそ!
     introduction_html: フリーで編集可能な世界地図、OpenStreetMapへようこそ。サインアップしたので、マッピングの準備はすべて整いました。知っておかなければならない重要事項を簡単に説明します。
@@ -1073,8 +1064,8 @@ ja:
     rules:
       title: ルール
       paragraph_1_html: |-
-        OpenStreetMapには正規の規約がいくつかありますが、すべての利用者とコミュニティの協力と意思疎通をお願いしています。手動で編集する以外をご検討の場合は、<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>インポート</a>ならびに
-        <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自動的な編集</a>ガイドラインをよく読んで従ってください。
+        OpenStreetMapには正規の規約がいくつかありますが、すべての利用者とコミュニティの協力と意思疎通をお願いしています。手動で編集する以外をご検討の場合は、<a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>インポート</a>ならびに
+        <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自動的な編集</a>ガイドラインをよく読んで従ってください。
     questions:
       title: 何か質問はありますか?
       paragraph_1_html: |-
@@ -1102,7 +1093,7 @@ ja:
     other_concerns:
       title: 他の問題
       explanation_html: 私たちのデータの使い方やコンテンツに問題がある場合、<a href='/copyright'>著作権のページ</a>を参照して法的情報をご確認いただくか、適切な
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF ワーキング グループ</a>
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF ワーキング グループ</a>
         までご連絡ください。
   help_page:
     title: ヘルプの取得
@@ -1112,7 +1103,7 @@ ja:
       title: OSM へようこそ
       description: OpenStreetMap の基礎を網羅しているこのクイック ガイドから始めましょう。
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: 初心者向けの手引き
       description: コミュニティは、初心者向けガイドが整備しています。
     help:
@@ -1132,7 +1123,7 @@ ja:
       title: switch2osm
       description: ヘルプ、OpenStreetMapをベースにした地図その他のサービスへ切り替えた法人や団体向け。
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: 詳細なOSMの説明が書かれたウィキを参照します。
   about_page:
@@ -1145,15 +1136,16 @@ ja:
     community_driven_title: コミュニティ主導
     community_driven_html: OpenStreetMapのコミュニティは多様で、情熱的で、毎日成長しています。協力者には地図作りマニア、GISの専門家、OpenStreetMapサーバーを稼働させている技術者、被災地の地図作りをする人道主義者などを含みます。コミュニティについて詳しくは、<a
       href='https://blog.openstreetmap.org'>OpenStreetMap のブログ</a>、<a href='%{diary_path}'>利用者の日記</a>、<a
-      href='http://blogs.openstreetmap.org/'>コミュニティのブログ</a>と<a href='http://www.osmfoundation.org/'>OSM財団</a>のウェブサイトをご覧ください。
+      href='https://blogs.openstreetmap.org/'>コミュニティのブログ</a>と<a href='https://www.osmfoundation.org/'>OSM財団</a>のウェブサイトをご覧ください。
     open_data_title: オープン データ
     open_data_html: OpenStreetMapは<i>オープンデータ</i>です。あなたはOpenStreetMapと協力者の著作権を表示すれば、いかなる目的でも無料で利用することができます。もし何らかの方法でデータを変更したり二次データを作成したりした場合も、同じライセンス条件下でのみ結果を配布できます。詳しくは、<a
       href='%{copyright_path}'>著作権とライセンス</a>をご覧ください。
     legal_title: 法律関係
-    legal_html: "このサイトおよび関連のサービスは<a href='http://osmfoundation.org/'>OpenStreetMap財団</a>
-      (OSMF)のコミュニティから継承したものです。OpenStreetMap財団の運営するサービスの利用者には<a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">利用規定</a>ならびに当財団の<a
-      href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">プライバシーに関する規定</a>の対象となります。\n<br>
-      \nライセンス、著作権その他法的な質問や問題がある場合は、<a href='http://osmfoundation.org/Contact'>OpenStreetMap財団までご連絡ください</a>。"
+    legal_html: "このサイトおよびその他の関連サービスは、コミュニティを代表して<a href='https://osmfoundation.org/'>OpenStreetMap財団</a>
+      (OSMF) が運営しています。OpenStreetMap財団の運営するサービス利用者は、私たちの定める<a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">利用規定</a>ならびに当財団の<a
+      href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">プライバシーに関する規定</a>の対象となります。\n<br>
+      \nライセンス、著作権その他法的な質問や問題がある場合は、<a href='https://osmfoundation.org/Contact'>OpenStreetMap財団までご連絡ください</a>。\n<br>\nOpenStreetMapならびに拡大鏡のロゴおよびState
+      of the Mapは<a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">OpenStreetMap財団の登録商標</a>です。"
     partners_title: パートナー
   notifier:
     diary_comment_notification:
@@ -1323,10 +1315,10 @@ ja:
       user_page_link: ユーザーページ
       anon_edits_link_text: なぜこれれが事例なのかを見る。
       flash_player_required: Flash 版 OpenStreetMap エディターである Potlatch を使用するには、Flash
-        Player が必要です。Flash Player は<a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Adobe.com</a>
-        でダウンロードできます。OpenStreetMap を編集する<a href="http://wiki.openstreetmap.org/wiki/JA:Editing?uselang=ja">他の方法</a>もあります。
+        Player が必要です。Flash Player は<a href="https://get.adobe.com/flashplayer">Adobe.com</a>
+        でダウンロードできます。OpenStreetMap を編集する<a href="https://wiki.openstreetmap.org/wiki/JA:Editing?uselang=ja">他の方法</a>もあります。
       potlatch_unsaved_changes: 保存していない変更があります。(Potlatch では、一覧モードで編集している場合、ウェイや点の選択を解除する必要があります。または、保存ボタンをクリックして保存してください。)
-      potlatch2_not_configured: 'Potlatch 2 が設定されていません - 詳細情報はこちらをご覧ください: http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2'
+      potlatch2_not_configured: 'Potlatch 2 が設定されていません - 詳細情報はこちらをご覧ください: https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2'
       potlatch2_unsaved_changes: 保存していない変更があります。(Potlatch 2 では、保存をクリックして保存する必要があります。)
       id_not_configured: iDが設定されていません。
       no_iframe_support: あなたのブラウザーは、この機能に必須の HTML iframe に未対応です。
@@ -1339,7 +1331,7 @@ ja:
       get_directions_title: 2点を結ぶルートを検索
       from: 出発点
       to: 目的地
-      where_am_i: これはどこにありますか?
+      where_am_i: 現在表示中の位置情報
       where_am_i_title: 検索エンジンを使用して現在の場所を記述
       submit_text: 検索
     key:
@@ -1416,7 +1408,7 @@ ja:
       edit: 編集
       preview: プレビュー
     markdown_help:
-      title_html: <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
         で構文解析されます
       headings: 見出し
       heading: 見出し
@@ -1523,7 +1515,7 @@ ja:
       description: 最近のGPSトラックのアップロードを参照
       tagged_with: (タグ %{tags} が付いているもの)
       empty_html: ここにはまだ何もありません。<a href='%{upload_link}'>新しくトレースをアップロード</a>するか、<a
-        href='http://wiki.openstreetmap.org/wiki/JA:Beginners_Guide_1.2?uselang=ja'>ウィキページ</a>でGPSトレースの詳細情報をお読みください。
+        href='https://wiki.openstreetmap.org/wiki/JA:Beginners_Guide_1.2?uselang=ja'>ウィキページ</a>でGPSトレースの詳細情報をお読みください。
     delete:
       scheduled_for_deletion: トレースの削除準備を行いました
     make_public:
@@ -1713,10 +1705,10 @@ ja:
         html: |-
           <p>他の地図とは異なり、OpenStreetMapは完全にあなたのような人々によって作成され、だれでも自由に修正、更新、ダウンロード、利用することができます。</p>
           <p>協力を始めるにはサインアップしてください。あなたのアカウントの確認メールが送信されます。</p>
-      license_agreement: アカウントを確認するには<a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">協力者規約</a>を承諾する必要があります。
+      license_agreement: アカウントを確認するには<a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">協力者規約</a>を承諾する必要があります。
       email address: 'メール アドレス:'
       confirm email address: 'メール アドレスの確認:'
-      not displayed publicly: あなたのアドレスは非公開です。詳細は弊財団の<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: あなたのアドレスは非公開です。詳細は弊財団の<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="メール アドレスの節を含む、OSMFのプライバシーポリシー">プライバシーポリシー</a>をご参照ください
       display name: '表示名:'
       display name description: あなたの公開利用者名です。あとで個人設定で変更できます。
@@ -1728,7 +1720,7 @@ ja:
       continue: ユーザー登録
       terms accepted: 新しい協力者規約を承諾していただき、ありがとうございます!
       terms declined: 新しい協力者規約を承諾いただけず残念です。詳しい情報は、<a href="%{url}">このウィキページ</a>をご覧ください。
-      terms declined url: http://wiki.openstreetmap.org/wiki/JA:Contributor_Terms_Declined
+      terms declined url: https://wiki.openstreetmap.org/wiki/JA:Contributor_Terms_Declined
     terms:
       title: 協力者規約
       heading: 協力者規約
@@ -1828,7 +1820,7 @@ ja:
       email never displayed publicly: (非公開)
       external auth: '外部認証:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/JA:OpenID?uselang=ja
+        link: https://wiki.openstreetmap.org/wiki/JA:OpenID?uselang=ja
         link text: これは何ですか?
       public editing:
         heading: '公開編集:'
@@ -1840,7 +1832,7 @@ ja:
       public editing note:
         heading: 公開編集
         text: 現在、あなたの編集作業はIP利用者扱いであるため、他の人々からメッセージを受信したり、あなたの場所を見つけてもらったりすることはできません。あなたの編集結果を表示できるようにして、他の人々がウェブサイト経由であなたに連絡できるようにするには、下のボタンをクリックしてください。<b>0.6
-          API 更新より地図データの編集は公開利用者以外、できなくなりました</b>。 (<a href="http://wiki.openstreetmap.org/wiki/JA:Anonymous_edits?uselang=ja">その理由はこちらで</a>)。<ul><li>公開扱いに変更しても、あなたのメール
+          API 更新より地図データの編集は公開利用者以外、できなくなりました</b>。 (<a href="https://wiki.openstreetmap.org/wiki/JA:Anonymous_edits?uselang=ja">その理由はこちらで</a>)。<ul><li>公開扱いに変更しても、あなたのメール
           アドレスが暴露されることはありません。</li><li>この変更は取り消せません。なお新しい利用者は、既定で公開扱いとなります。</li></ul>
       contributor terms:
         heading: '協力者規約:'
@@ -1848,6 +1840,7 @@ ja:
         not yet agreed: あなたはまだ新しい投稿規約を承諾していません。
         review link text: ご都合の良い時にこのリンクをクリックして新しい協力者規約を確認の上、承諾してしてください。
         agreed_with_pd: また、あなたは、自分の編集結果がパブリックドメインにあるべきだと考えているということも宣言しています。
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: これは何ですか?
       profile description: 'プロフィールの説明:'
       preferred languages: '優先言語:'
@@ -1951,6 +1944,7 @@ ja:
       not_a_role: 文字列「%{role}」は、有効な権限ではありません。
       already_has_role: 利用者は既に %{role} 権限を付与されています。
       doesnt_have_role: ユーザーに %{role} 権限が付与されていません。
+      not_revoke_admin_current_user: 現在のユーザに管理者権限がありません。
     grant:
       title: 権限付与の確認
       heading: 権限付与の確認
@@ -2154,7 +2148,8 @@ ja:
         unhide_comment: 非表示を解除
     notes:
       new:
-        intro: スポットの間違いや情報の抜けがありましたか?他のマッパーが修正できるよう、お知らせください。マーカーを正しい位置に移動し、問題を説明するメモを入力します。(個人情報や著作権のある地図・一覧からの情報は入力しないでください。)
+        intro: 間違いや情報の抜けがありましたか? 他のマッパーが修正できるよう、お知らせください。マーカーを正しい位置に移動し、問題を説明するメモを入力します。
+        advice: 投稿した地図メモは公開され、地図の更新に利用されます。そのため、著作権保護された地図や一覧情報からの転用情報や、個人情報の入力は行わないでください。
         add: メモを追加
       show:
         anonymous_warning: このメモはIP利用者によるコメントも含んでいるため、個別に確認してください。
@@ -2168,14 +2163,12 @@ ja:
       ascend: 上り坂
       engines:
         graphhopper_bicycle: 自転車
+        graphhopper_car: 自動車(GraphHopper)
         graphhopper_foot: 歩行
         mapquest_bicycle: 自転車
         mapquest_car: 自動車
         mapquest_foot: 歩行
         osrm_car: 自動車
-        mapzen_bicycle: 自転車
-        mapzen_car: 自動車
-        mapzen_foot: 歩行
       descend: 下り坂
       directions: 方向
       distance: 距離
index c9d5e07d59f14f8edee580ce8d786805c90e6107..c1f7c916c4306f7100772662a6bad34a113b2296 100644 (file)
@@ -336,30 +336,23 @@ ka:
           crematorium: კრემატორიუმი
           dentist: დანტისტი
           doctors: ექიმი
-          dormitory: საერთო საცხოვრებელი
           drinking_water: სასმელი წყალი
           driving_school: ავტოსკოლა
           embassy: საელჩო
-          emergency_phone: საგანგებო სიტუაციების სამსახურის ტელეფონი
           fast_food: სწრაფი კვება
           ferry_terminal: ბორანის სადგური
-          fire_hydrant: სახანძრო ჰიდრანტი
           fire_station: სახანძრო განყოფილება
           fountain: შადრევანი
           fuel: საწვავი
           grave_yard: საფლავი
-          gym: ფიტნეს ცენტრი / სავარჯიშო დარბაზი
-          health_centre: ჯანმრთელობის ცენტრი
           hospital: საავადმყოფო
           hunting_stand: სანადირო კოშკურა
           ice_cream: ნაყინი
           kindergarten: საბავშვო ბაღი
           library: ბიბლიოთეკა
-          market: მაღაზია
           marketplace: ბაზარი
           monastery: მონასტერი
           nightclub: ღამის კლუბი
-          nursery: პანსიონატი
           nursing_home: მოხუცებულთა თავშესაფარი
           office: ოფისი
           parking: ავტოსადგომი
@@ -373,7 +366,6 @@ ka:
           prison: ციხე
           pub: პაბი
           public_building: საჯარო შენობა
-          reception_area: მიმღები
           recycling: ნაგავსაყრელი
           restaurant: რესტორანი
           retirement_home: მოხუცებულთა თავშესაფარი
@@ -458,7 +450,6 @@ ka:
           traffic_signals: შუქნიშანი
           trail: ბილიკი
           unclassified: ადგილობრივი გზა
-          unsurfaced: უზედაპირო გზა
           "yes": გზა
         historic:
           archaeological_site: არქეოლოგიური გათხრები
@@ -514,7 +505,6 @@ ka:
           vineyard: ვენახი
           "yes": მიწათსარგებლობა
         leisure:
-          club: კლუბი
           dog_park: ძაღლების პარკი
           fishing: სათევზაო ტერიტორია
           fitness_centre: ფიტნეს-ცენტრი
@@ -601,8 +591,6 @@ ka:
           travel_agent: ტურისტული სააგენტო
           "yes": ოფისი
         place:
-          block: კვარტალი
-          airport: აეროპორტი
           city: ქალაქი
           country: ქვეყანა
           county: ოლქი
@@ -612,7 +600,6 @@ ka:
           houses: სახლები
           island: კუნძული
           islet: პატარა კუნძული
-          moor: ტორფნარი
           municipality: მუნიციპალიტეტი
           neighbourhood: სამეზობლო
           postcode: საფოსტო ინდექსი
@@ -628,10 +615,8 @@ ka:
           abandoned: მიტოვებული რკინიგზა
           construction: რკინიგზის რემონტი
           disused: მიტოვებული რკინიგზა
-          disused_station: მიტოვებული რკინიგზის სადგური
           funicular: ფუნიკულიორი
           halt: მატარებლის გაჩერება
-          historic_station: ისტორიული რკინიგზის სადგური
           level_crossing: სარკინიგზო გადასასვლელი
           light_rail: მსუბუქი რკინიგზა
           monorail: მონორელსი
@@ -678,7 +663,6 @@ ka:
           gift: საჩუქრების მაღაზია
           greengrocer: ხილ-ბოსტნეულის მაღაზია
           hairdresser: საპარიკმახერო
-          insurance: სადაზღვევო
           jewelry: საიუველირო მაღაზია
           kiosk: ჯიხური
           laundry: სამრეცხაო
@@ -693,10 +677,8 @@ ka:
           pet: ზოომაღაზია
           pharmacy: აფთიაქი
           photo: ფოტომაღაზია
-          salon: სალონი
           second_hand: მეორადების მაღაზია
           shoes: ფეხსაცმლის მაღაზია
-          shopping_centre: სავაჭრო ცენტრი
           sports: სპორტული მაღაზია
           stationery: საკანცელარიო მაღაზია
           supermarket: სუპერმარკეტი
index e7580d36fda0590afc523c039a43c238ea916401..d69178447a6e2d49acccd0952275bed4fa6e8d9b 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Belkacem77
 # Author: Mastanabal
 # Author: Mhenni
+# Author: MustaphaLateb
 # Author: Sayem AtVkm
 # Author: SlimaneAmiri
 ---
@@ -440,33 +441,26 @@ kab:
           crematorium: Tanerɣut
           dentist: Amejjay n tuɣmas
           doctors: Imejjayen
-          dormitory: Anaḍḍas
           drinking_water: Aman n tissit
           driving_school: Aɣerbaz n uselmed n tenheṛt
           embassy: Tamahelt
-          emergency_phone: Tiliɣri n utrab
           fast_food: Učči arurad
           ferry_terminal: Anemdu n ufirri
-          fire_hydrant: Amsexsay n tmes
           fire_station: Taqcelt  n isexsayen
           food_court: Tamnaḍt n wučči
           fountain: Tala
           fuel: Aserɣu
           gambling: Uraren yidrimen
           grave_yard: Tajebbant
-          gym: Fitness / tajimnastikt
-          health_centre: Almus n tdawsa
           hospital: Sbiṭar
           hunting_stand: Tanefsart n uselfeɣ
           ice_cream: Tamagrist
           kindergarten: Tibḥirt n warrac
           library: Tanedlist
-          market: Alzuz
           marketplace: Ssuq
           monastery: Amunastiṛ
           motorcycle_parking: Aneɣsar n imuṭuten
           nightclub: Tazeqqa n yiḍ
-          nursery: Tanectalt
           nursing_home: Axxam n tastaɣt s udawi
           office: Tanarit
           parking: Aneɣsar
@@ -480,7 +474,6 @@ kab:
           prison: Lḥebs
           pub: Ttberna
           public_building: Azadaɣ azayez
-          reception_area: Tamnaḍt n usiweḍ
           recycling: Point de wallus n usseqdec
           restaurant: Asečču
           retirement_home: Axxam n testaɣt
@@ -503,17 +496,23 @@ kab:
           vending_machine: Asedgar awurman
           veterinary: Tafettakt tabiḍart
           village_hall: Tazeqqa taɣiwant
+          waste_basket: Iḍumman
           waste_disposal: Affas n yiḍuman
           youth_centre: Axxam n yilemẓiyen
         boundary:
+          administrative: Talast tanedbalant
           census: Talast taddadant
+          national_park: Taẓribt taɣelnawt
+          protected_area: Tamnaḍt yettwaḥerzen
         bridge:
+          suspension: Tiqenṭert iɛelqen
           swing: Tillegwit yeddawaren
           viaduct: Tiqenṭaṛt
           "yes": Tiqenṭert
         building:
           "yes": Akerrus
         craft:
+          brewery: Tberna
           carpenter: Amekras
           electrician: Amesliktri
           gardener: Abeḥḥar
@@ -523,14 +522,25 @@ kab:
           shoemaker: Axerraz
           tailor: Axeggaḍ
           "yes": Taḥanutt n Tinḍi
+        emergency:
+          landing_site: Annar n trusi n utrab
+          phone: Tiliɣri n utrab
         highway:
+          abandoned: Abrid agejdan yettwattun
           bridleway: Aɣaras n yimnayen
+          bus_stop: Anbeddi n usakal
+          elevator: Asalay
+          emergency_access_point: Tabburt n unekcum n utrab
           footway: Aɣaras n uḍar
+          ford: Asaka
+          milestone: Taṛekkazt takilumitrant
+          motorway: Abrid agejdan
           path: Aɣaras
           pedestrian: Aɣlad n uḍar
           platform: Tiɣerɣert
           primary: Abrid agejdan
           primary_link: Abrid agejdan
+          proposed: Asenfaṛ n ubrid
           raceway: Amnenniḍ
           rest_area: Amḍiq n ustaεfu
           road: Abrid
@@ -540,6 +550,8 @@ kab:
           speed_camera: Aṛadaṛ n tazzla
           steps: Sellum
           street_lamp: Tasafut n ubrid
+          tertiary: Abrid asnawan
+          tertiary_link: Abrid asnawan
           track: Abrid
           "yes": Abrid
         historic:
@@ -554,10 +566,14 @@ kab:
           house: Axxam
           icon: Tignit
           stone: Ablaḍ
+          tomb: Tanḍelt
         landuse:
+          basin: Amdun
           farm: Tibḥirt
           farmland: Akal n tkerrazt
           forest: Tiẓgi
+          landfill: Agudu
+          railway: Avrid tmacit
         leisure:
           stadium: Annar
         natural:
@@ -588,8 +604,6 @@ kab:
           "yes": Tanarit
         place:
           allotments: Talmat n twacult
-          block: Iḥder
-          airport: Anafag
           city: Tiɣremt
           country: Tamurt
           county: Tamurt
@@ -677,8 +691,11 @@ kab:
     intro_text: OpenStreetMap d takarḍa n umadal, rnna-tt yemdanen am kečč d tilellit
       i useqdec ddaw n turagt tilellit.
     intro_2_create_account: Rnu amiḍan n useqdac
-    partners_html: Tanezduɣt tmudd-itt %{ucl}, %{ic}, %{bytemark} d %{partners} nniḍen.
+    partners_html: Tanezduɣt muddentt-id %{ucl},%{bytemark}, %{ic}, d %{partners}
+      nniḍen.
     partners_ucl: UCL
+    partners_ic: Aɣerbaz impiryal n Lundun
+    partners_bytemark: Tanezduɣt n Bytemark
     partners_partners: imendiden
     osm_offline: Taffa n isefka n OpenStreetMap ur teqqin ara yakan tura imi aseǧǧem
       ilaqen yettwaselkam akken ad teddu akken iwata.
@@ -701,6 +718,8 @@ kab:
   license_page:
     foreign:
       title: Ɣef tsuqilt-agi
+      text: Ma llant tilla gar usebter-agi yettwasiqlen d %{english_original_link},Lqem
+        n tegllizit ara nawi
       english_link: Aneṣli s teglizit
     native:
       title: Ɣef usebter-agi
@@ -936,6 +955,9 @@ kab:
     key:
       table:
         entry:
+          forest: Tiẓgi
+          lake:
+          - Amdun
           school:
           - Aɣerbaz
           - Tasdawit
@@ -1456,9 +1478,6 @@ kab:
         mapquest_car: S tkerrust (<i>MapQuest</i>)
         mapquest_foot: Ɣef uḍaṛ (<i>MapQuest</i>)
         osrm_car: S tkeṛṛust (<i>OSRM</i>)
-        mapzen_bicycle: S uvilu (<i>Mapzen</i>)
-        mapzen_car: S tkeṛṛust (<i>Mapzen</i>)
-        mapzen_foot: Ɣef uḍaṛ (<i>Mapzen</i>)
       instructions:
         continue_without_exit: Kemmel ɣef %{name}
       time: Akud
index b3ec396752dcbddfa0c49338a92dd04a9b0b3092..dc886ee44515c2470a09a3c283bc6f770676011d 100644 (file)
@@ -244,7 +244,6 @@ km:
     search:
       title:
         latlon: លទ្ធផលពី <a href="http://openstreetmap.org/">Internal</a>
-        us_postcode: លទ្ធផលពី <a href="http://geocoder.us/">Geocoder.us</a>
         uk_postcode: លទ្ធផលពី <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
         ca_postcode: លទ្ធផលពី <a href="http://geocoder.ca/">Geocoder.CA</a>
@@ -252,9 +251,7 @@ km:
     search_osm_nominatim:
       prefix:
         amenity:
-          airport: អាកាសយានដ្ឋាន
           arts_centre: មជ្ឍមណ្ឌលសិល្បៈ
-          artwork: វណ្ណកម្ម
           atm: ATM
           bank: ធនាគារ
           bar: បារ
@@ -273,36 +270,27 @@ km:
           charging_station: ស្ថានីយ៍សាកភ្លើង
           cinema: រោងកុន
           clinic: គ្លីនីក
-          club: ក្លិបកំសាន្ត
           college: មហាវិទ្យាល័យ
           community_centre: មណ្ឌលសហគមន៍
           courthouse: តុលាការ
           crematorium: កន្លែងបញ្ចុះសព
           dentist: ទន្ដបណ្ឌិត
           doctors: វេជ្ជបណ្ឌិត
-          dormitory: អន្តេវាសិកដ្ឋាន
           drinking_water: ទឹកផឹក
           driving_school: សាលាបង្រៀនបើកបរ
           embassy: ស្ថានទូត
-          emergency_phone: ទូរស័ព្ទសង្រ្គោះបន្ទាន់
           fire_station: ស្ថានីយ៍អគ្គីភ័យ
           food_court: អាហារដ្ឋាន
           fountain: ទឺកផុស
           fuel: ឥន្ធនៈ
           grave_yard: វាលផ្នូរខ្មោច
-          gym: មណ្ឌលឬកន្លែងហាត់ប្រាណ
-          hall: សាល
-          health_centre: មណ្ឌលសុខភាព
           hospital: មន្ទីរពេទ្យ
-          hotel: សណ្ឋាគារ
           ice_cream: ការ៉េម
           kindergarten: សាលាមតេ្តយ្យ
           library: បណ្ណាល័យ
-          market: ផ្សារ
           marketplace: ទីផ្សារ
           nightclub: ក្លឹបរាត្រី
           office: ការិយាល័យ
-          park: ឧទ្យាន​
           parking: ចំណតរថយន្ត
           pharmacy: ឱសថស្ថាន
           place_of_worship: ទីសក្ការបូជា
@@ -312,17 +300,14 @@ km:
           prison: ពន្ធនាគារ
           pub: បារ
           public_building: អាគារសាធារណៈ
-          public_market: ផ្សារសាធារណៈ
           restaurant: ភោជនីយដ្ឋាន
           retirement_home: ផ្ទះចាស់ជរា
           sauna: សោណា
           school: សាលារៀន
           shelter: កន្លែងភៀសខ្លួន
           shop: ហាង
-          shopping: ទិញទំនិញ
           shower: កន្លែងងូតទឹក
           social_centre: មណ្ឌលសង្គមកិច្ច
-          supermarket: ផ្សារទំនើប
           swimming_pool: អាងហែលទឹក
           taxi: តាក់ស៊ី
           telephone: ទូរស័ព្ទសាធារណៈ
@@ -333,8 +318,6 @@ km:
           veterinary: ពេទ្យសត្វ
           village_hall: សាលាភូមិ
           waste_basket: ធុងសម្រាម
-          wifi: កន្លែងបង្ហោះ WiFi
-          WLAN: កន្លែងបង្ហោះ WiFi
           youth_centre: មណ្ឌលយុវជន
         boundary:
           administrative: ព្រំដែនរដ្ឋបាល
@@ -362,7 +345,6 @@ km:
           church: វិហារគ្រិស្តសាសនា
           fort: បន្ទាយ
           house: ផ្ទះ
-          museum: សារមន្ទីរ
           tomb: ផ្នូរ
           tower: ប៉ម
         landuse:
@@ -373,9 +355,6 @@ km:
           grass: វាលស្មៅ
           industrial: តំបន់ឧស្សាហកម្ម
           military: តំបន់យោធា
-          nature_reserve: តំបន់ការពារធម្មជាតិ
-          park: ឧទ្យាន​
-          piste: ផ្លូវរអិលស្គី
           quarry: កន្លែងយកថ្ម
           railway: ផ្លូវដែក
           recreation_ground: ទីលានកំសាន្ត
@@ -383,8 +362,6 @@ km:
           residential: តំបន់លំនៅដ្ឋាន
           road: តំបន់ផ្លូវ
           vineyard: ចំការទំពាំងបាយជូរ
-          wetland: តំបន់ទឹកលិច
-          wood: ព្រៃ
         leisure:
           beach_resort: ឆ្នេរកំសាន្ត
           common: ដីរួម
@@ -408,7 +385,6 @@ km:
           bay: ឆកសមុទ្រ
           beach: ឆ្នេរខ្សាច់
           cave_entrance: ច្រកចូលរូងភ្នំ
-          channel: ប្រឡាយ
           cliff: ជ្រោះ
           crater: មាត់ភ្នំភ្លើង
           dune: ភ្នំខ្សាច់
@@ -418,14 +394,12 @@ km:
           mud: ភក់
           peak: កំពូល
           point: ចំនុច
-          river: ទន្លេ
           strait: ដៃសមុទ្រ
           tree: ដើមឈើ
           valley: ជ្រលងភ្នំ
           volcano: ភ្នំភ្លើង
           water: ទឹក
           wetland: តំបន់ទឹកលិច
-          wetlands: តំបន់ទឹកលិច
           wood: ព្រៃ
         office:
           accountant: គណនីករ
@@ -441,7 +415,6 @@ km:
           travel_agent: ភ្នាក់ងារទេសចរណ៍
           "yes": ការិយាល័យ
         place:
-          airport: អាកាសយានដ្ឋាន
           city: ទីក្រុង
           county: ប្រទេស
           house: ផ្ទះ
@@ -456,7 +429,6 @@ km:
           abandoned: ផ្លូវដែកបោះបង់ចោល
           construction: ផ្លូវដែកកំពុងស្ថាបនា
           disused: ផ្លូវដែកឈប់ប្រើ
-          disused_station: ស្ថានីយ៍ផ្លូវដែកឈប់ប្រើ
           station: ស្ថានីយ៍ផ្លូវដែក
           subway: ស្ថានីយ៍រថភ្លើងក្រោមដី
           subway_entrance: ច្រកចូលស្ថានីយ៍រថភ្លើងក្រោមដី
@@ -476,15 +448,6 @@ km:
     description:
       types:
         cities: ក្រុង​
-    direction:
-      south_west: ទិសខាងត្បូង​ឆៀង​ខាងលិច​
-      south: ទិសខាងត្បូង​
-      south_east: ទិសខាងត្បូង​ឆៀងខាង​កើត​
-      east: ទិសខាងកើត​
-      north_east: ទិសខាងជើង​ឆៀង​ខាងកើត​
-      north: ទិសខាងជើង​
-      north_west: ទិសខាងជើង​ឆៀង​ខាងលិច​
-      west: ទិសខាងលិច​
   layouts:
     logout: ចាកចេញ​
     log_in: ឡុកអ៊ីន​
@@ -556,7 +519,6 @@ km:
         entry:
           forest: ព្រៃឈើ​
           park: ឧទ្យាន​
-          tourist: តំបន់ទេសចរណ៍​
           industrial: តំបន់ឧស្សាហកម្ម​
           farm: កសិដ្ឋាន​
           centre: មជ្ឈមណ្ឌល​កីឡា​
diff --git a/config/locales/kn.yml b/config/locales/kn.yml
new file mode 100644 (file)
index 0000000..90074c6
--- /dev/null
@@ -0,0 +1,668 @@
+# Messages for Kannada (ಕನ್ನಡ)
+# Exported from translatewiki.net
+# Export driver: phpyaml
+# Author: Ananth subray
+# Author: Nayvik
+# Author: Omshivaprakash
+# Author: Shankar
+# Author: Srividyacb
+# Author: VASANTH S.N.
+# Author: Xor
+# Author: Yogesh
+---
+kn:
+  time:
+    formats:
+      friendly: '%H:%M ರಲ್ಲಿ %e %B %Y'
+  activerecord:
+    models:
+      acl: ಪ್ರವೇಶ ನಿಯಂತ್ರಣ ಸೂಚಿ
+      changeset: ಬದಲಾವಣೆಗಳು
+      changeset_tag: ಬದಲಾವಣಾ ಭಾಗ
+      country: ದೇಶ
+      diary_comment: ಡೈರಿ ಅನಿಸಿಕೆ
+      diary_entry: ಡೈರಿಯನ್ನು ಬರೆ
+      friend: ಗೆಳೆಯ
+      language: ಭಾಷೆ
+      message: ಸಂದೇಶ
+      node: ನೋಡ್
+      notifier: ‍ಸೂಚಕ
+      old_node: ‍ಹಳೆಯ ನೋಡ್
+      old_node_tag: ಹಳೆಯ ನೊಡ್ ನ ಭಾಗ
+      old_relation: ಹಿಂದಿನ ಸಂಬಂಧ
+      old_relation_member: ಹಿಂದಿನ ಸಂಬಂಧದ ವ್ಯಕ್ತಿ
+      old_relation_tag: ಹಿಂದಿನ ಸಂಬಂಧದ ಭಾಗ
+      old_way: ಹಳೆಯ ದಾರಿ
+      old_way_node: ಹಿಂದಿನ ದಾರಿಯ ಬಿಂದು
+      old_way_tag: ಹಳೆಯ ದಾರಿಯ ಟ್ಯಾಗ್
+      relation: ಸಂಬಂಧ
+      relation_member: ಸಂಬಂಧದ ಸದಸ್ಯ
+      session: ಅಧಿವೇಶನ
+      trace: ರೇಖಿಸು
+      tracepoint: ರೇಖಾ ಬಿಂದು
+      user: ಬಳಕೆದಾರ
+      user_preference: ಬಳಕೆದಾರನ ಆದ್ಯತೆ
+      user_token: ಬಳಕೆದಾರನ ಗುರುತು
+      way: ರಸ್ತೆ
+    attributes:
+      diary_comment:
+        body: ಶರೀರ
+      diary_entry:
+        user: ಸದಸ್ಯ
+        title: ವಿಷಯ
+        latitude: ಅಕ್ಷಾಂಶ
+        longitude: ರೇಖಾಂಶ
+        language: ಭಾಷೆ
+      friend:
+        user: ಬಳಕೆದಾರ
+        friend: ಗೆಳೆಯ
+      trace:
+        user: ಸದಸ್ಯ
+        visible: ಗೋಚರ
+        name: ಹೆಸರು
+        size: ಗಾತ್ರ
+        latitude: ಅಕ್ಷಾಂಶ
+        longitude: ರೇಖಾಂಶ
+        public: ಸಾರ್ವಜನಿಕ
+        description: ವಿವರ
+      message:
+        sender: ಕಳಿಸಿದವರು
+        title: ವಿಷಯ
+        body: ದೇಹ
+        recipient: ಪಡೆಯುವವರು
+      user:
+        email: ಇ-ಅಂಚೆ
+        active: ಸಕ್ರಿಯ
+        display_name: ಹೆಸರನ್ನು ಪ್ರದರ್ಶಿಸು
+        description: ವಿವರ
+        languages: ಭಾಷೆಗಳು
+        pass_crypt: ಪ್ರವೇಶಪದ
+  editor:
+    default: ಪೂರ್ವನಿಯೋಜಿತ (ಪ್ರಚಲಿತ %{name})
+    potlatch:
+      name: ಪೊಟ್ಲಾಚ್ ೧
+    id:
+      name: ಐಡಿ
+      description: ಐಡಿ(ನಕ್ಷೆ ಸಂಪಾದಿಸುವ ತಂತ್ರಾಂಶ)
+    potlatch2:
+      name: ಪೊಟ್ಲಾಚ್ ೨
+      description: ಪೊಟ್ಲಾಚ್ ೨ (ತಡಕುದಾಣದೊಳಗಿನ ಸಂಪಾದಕ)
+    remote:
+      name: ದೂರ ನಿಯಂತ್ರಣ
+      description: ದೂರ ನಿಯಂತ್ರಣ (JOSM or Merkaartor)
+  browse:
+    created: ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟ
+    closed: ಮುಚ್ಚಲಾಗಿದೆ
+    closed_html: <abbr %{time} ಹಿಂದೆ %{title} ಅನ್ನು </abbr> ಮುಗಿಸಿದ್ದಾರೆ
+    closed_by_html: '%{user}ರವರು <abbr %{time} ಹಿಂದೆ %{title} ಅನ್ನು </abbr> ಮುಗಿಸಿದ್ದಾರೆ'
+    version: ಆವೃತ್ತಿ
+    in_changeset: ಬದಲಾವಣೆಗಳು
+    anonymous: ಅನಾಮಧೇಯ
+    no_comment: (ಟಿಪ್ಪಣಿಯಿಲ್ಲ)
+    part_of: ಭಾಗ
+    download_xml: ಡೌನಲೊಡ್ XML
+    view_history: ಇತಿಹಾಸವನ್ನು ನೋಡಿ
+    view_details: ವಿವರಣೆ ನೋಡಿ
+    location: 'ಸ್ಥಳ:'
+    changeset:
+      title: 'ಬದಲಾವಣೆಗಳು: %{id}'
+      belongs_to: ಕರ್ತೃ
+      node: ನೋಡ್ಸ್  (%{count})
+      node_paginated: ನೋಡ್ಸ್  (%{x}-%{y} ರ %{count})
+      way: ರೀತಿಯಲ್ಲಿ (%{count})
+      way_paginated: ದಾರಿಗಳು (%{x}-%{y} ರ %{count})
+      relation: ಸಂಬಂಧಗಳು (%{count})
+      relation_paginated: ಸಂಬಂಧಗಳು(%{x}-%{y} of %{count})
+      comment: ಕಾಮೆಂಟ್ಗಳನ್ನು (%{count})
+      hidden_commented_by: ಗೌಪ್ಯ ಟಿಪ್ಪಣಿ %{user} ಅವರಿಂದ <abbr %{exact_time} %{when}
+        ಹಿಂದೆ</abbr>
+      commented_by: '%{user} ಅವರಿಂದ ಟಿಪ್ಪಣಿ <abbr %{exact_time} %{when} ಹಿಂದೆ </abbr>'
+      feed:
+        title: ಬದಲಾವಣೆಗಳು %{id}
+        title_comment: ಬದಲಾವಣೆಗಳು %{id} - %{comment}
+      join_discussion: ‍ಚರ್ಚೆಗೆ ಸೇರಲು ಲಾಗ್ ಇನ್ ಆಗಿರಿ
+      discussion: ಚರ್ಚೆ
+    node:
+      title: 'ನೋಡ್: %{name}'
+      history_title: 'ನೊಡ್ ನ ಇತಿಹಾಸ: %{name}'
+    way:
+      title: 'ದಾರಿ: %{name}'
+    relation:
+      title: 'ಸಂಬಂಧ: %{name}'
+      members: ಸದಸ್ಯರು
+    relation_member:
+      entry_role: '%{type} %{name} ಹಾಗೆ %{role}'
+      type:
+        way: ರಸ್ತೆ
+        relation: ಸಂಬಂಧ
+    containing_relation:
+      entry: ಸಂಬಂಧ %{relation_name}
+    not_found:
+      sorry: 'ಕ್ಷಮಿಸಿ, %{type} #%{id} ಸಿಗುತ್ತಿಲ್ಲ.'
+      type:
+        node: ‍ನೋಡ್
+        way: ದಾರಿ
+        relation: ಸಂಬಂಧ
+        changeset: ಬದಲಾವಣೆಗಳು
+        note: ಟಿಪ್ಪಣಿ
+    timeout:
+      sorry: ಕ್ಷಮಿಸಿ, %{type}ನ %{id} ಹೊಂದಿರುವ  ಮಾಹಿತಿ ಹುಡುಕಲು ಸಾಕಷ್ಟು ಸಮಯ ಬೇಕಾಯಿತು.
+      type:
+        node: ‍ನೋಡ್
+        way: ದಾರಿ
+        relation: ಸಂಬಂಧ
+        changeset: ಬದಲಾವಣೆಗಳು
+        note: ಟಿಪ್ಪಣಿ
+    redacted:
+      type:
+        node: ‍ನೋಡ್
+        way: ದಾರಿ
+        relation: ಸಂಬಂಧ
+    start_rjs:
+      load_data: ಮಾಹಿತಿಯನ್ನು ತುಂಬಿರಿ
+      loading: ತುಂಬಿಸಲಾಗುತ್ತಿದೆ....
+    tag_details:
+      tags: ಅಂಕಿತಗಳು
+      telephone_link: '%{phone_number} ಕರೆಮಾಡಿ'
+    note:
+      title: 'ಟಿಪ್ಪಣಿ: %{id}'
+      new_note: ಹೊಸ ಟಿಪ್ಪಣಿ
+      description: ವಿವರ
+      open_title: 'ಬಗೆಹರಿಯದ ಟಿಪ್ಪಣಿ #%{note_name}'
+      closed_title: 'ಬಗೆಹರಿದ ಟಿಪ್ಪಣಿ #%{note_name}'
+      hidden_title: 'ಅಡಗಿಸಿದ ಟಿಪ್ಪಣಿ #%{note_name}'
+    query:
+      introduction: ಹತ್ತಿರದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹುಡುಕಲು ನಕ್ಷೆಯ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ.
+      nearby: ಹತ್ತಿರದ ವೈಶಿಷ್ಟ್ಯಗಳು
+      enclosing: ಆವರಿಸಿರುವ ವೈಶಿಷ್ಟ್ಯಗಳು
+  changeset:
+    changeset_paging_nav:
+      showing_page: ಪುಟ %{page}
+      next: ‍ಮುಂದಿನ »
+      previous: ‍‍ « ಹಿಂದಿನ
+    changeset:
+      anonymous: ಅನಾಮಧೇಯ
+      no_edits: ತಿದ್ದುಪಡಿ ಇಲ್ಲ
+      view_changeset_details: ಬದಲಾವಣೆಯ ವಿವರಗಳನ್ನು ತೋರಿಸಿ
+    changesets:
+      id: ಗುರುತಿನ ಸಂಖ್ಯೆ
+      saved_at: ಇಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ
+      user: ಬಳಕೆದಾರ
+      comment: ಟಿಪ್ಪಣಿ
+      area: ಪ್ರದೇಶ
+    list:
+      title: ಬದಲಾವಣೆಗಳು
+      title_user: '  %{user}ಅವರಿಂದಾದ ಬದಲಾವಣೆಗಳು'
+      title_friend: ನಿಮ್ಮ ಗೆಳೆಯರಿಂದಾದ ಬದಲಾವಣೆಗಳು
+      title_nearby: ಹತ್ತಿರದ ಬಳಕೆದಾರರಿಂದಾದ ಬದಲಾವಣೆಗಳು
+      empty: ಯಾವುದೇ ಬದಲಾವಣೆಗಳು ಸಿಗುತ್ತಿಲ್ಲ.
+      empty_area: ಈ ಪ್ರದೇಶದಲ್ಲಿ ಯಾವುದೆ ಬದಲಾವಣೆಗಳಿಲ್ಲ.
+      empty_user: ಈ ಬಳಕೆದಾರರಿಂದ ಯಾವುದೆ ಬದಲಾವಣೆಗಳಿಲ್ಲ.
+      no_more: ಇನ್ನಾವ ಬದಲಾವಣೆಗಳು ಸಿಗುತ್ತಿಲ್ಲ.
+      no_more_area: ಈ ಪ್ರದೇಶದಲ್ಲಿ ಇನ್ನಾವುದೆ ಬದಲಾವಣೆಗಳಿಲ್ಲ.
+      no_more_user: ಈ ಬಳಕೆದಾರರಿಂದ ಇನ್ನಾವುದೇ ಬದಲಾವಣೆಗಳಿಲ್ಲ.
+      load_more: ಇನ್ನೂ ತೋರಿಸಿ
+    timeout:
+      sorry: ಕ್ಷಮಿಸಿ, ನೀವು ಕೇಳಿದ ಬದಲಾವಣಾ ಪಟ್ಟಿ  ಪಡೆಯಲು ದೀರ್ಘ ಸಮಯ ಬೇಕಾಯಿತು.
+    rss:
+      title_all: ಓಪನ್ ಸ್ಟ್ತ್ರೀಟ್ ಮ್ಯಾಪ್ ಬದಲಾವಣೆಗಳ ಚರ್ಚೆ
+      title_particular: ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ಬದಲಾವಣಾ ಸಂಖ್ಯೆ %{changeset_id} ಯ ಚರ್ಚೆ
+      comment: '%{author} ಅವರಿಂದ ಬದಲಾವಣಾ ಸಂಖ್ಯೆ %{changeset_id} ರ ಹೊಸ ಅನಿಸಿಕೆ'
+      commented_at_html: '%{when} ಹಿಂದೆ ನವೀಕರಿಸಲಾಗಿದೆ'
+      commented_at_by_html: '%{user}ಅವರಿಂದ %{when} ಹಿಂದೆ ನವೀಕರಿಸಲಾಗಿದೆ'
+      full: ಪೂರ್ಣ ಚರ್ಚೆ
+  diary_entry:
+    new:
+      title: ದಿನಚರಿಯಲ್ಲಿ ಹೊಸದಾದ ದಾಖಲೆ
+      publish_button: ಪ್ರಕಟಿಸು
+    list:
+      title: ಬಳಕೆದಾರರ ದಿನಚರಿ
+      title_friends: ಗೆಳೆಯರ ದಿನಚರಿ
+      title_nearby: ಹತ್ತಿರದ ಬಳಕೆದಾರರ ದಿನಚರಿ
+      user_title: '%{user}ರ ದಿನಚರಿ'
+      in_language_title: ದಿನಚರಿ ದಾಖಲಾತಿ %{language}ನಲ್ಲಿ
+      new: ಹೊಸದಾದ ದಿನಚರಿ ದಾಖಲು
+      new_title: ನಿಮ್ಮ ಬಳಕೆದಾರ ದಿನಚರಿಯಲ್ಲಿ ಹೊಸ ದಾಖಲೆ ನಿರ್ಮಿಸಿ
+      no_entries: ದಿನಚರಿ ದಾಖಲಾತಿ ಇಲ್ಲ
+      recent_entries: ಇತ್ತೀಚಿನ ದಿನಚರಿ ದಾಖಲಾತಿಗಳು
+      older_entries: ಹಳೆಯ ದಾಖಲಾತಿಗಳು
+      newer_entries: ಹೊಸದಾದ ದಾಖಲಾತಿಗಳು
+    edit:
+      title: ದಿನಚರಿ ದಾಖಲಾತಿಯನ್ನು ತಿದ್ದಿರಿ
+      subject: 'ವಿಷಯ:'
+      body: 'ದೇಹ:'
+      language: 'ಭಾಷೆ:'
+      location: 'ಸ್ಥಳ:'
+      latitude: 'ಅಕ್ಷಾಂಶ:'
+      longitude: 'ರೇಖಾಂಶ:'
+      use_map_link: ನಕ್ಷೆ ಬಳಸು
+      save_button: ಉಳಿಸಿ
+      marker_text: ದಿನಚರಿ ದಾಖಲೆಯ ಸ್ಥಳ
+    view:
+      title: '%{user}ಅವರ ದಿನಚರಿ | %{title}'
+      user_title: '%{user}ಅವರ ದಿನಚರಿ'
+      leave_a_comment: ಟಿಪ್ಪಣಿ ನೀಡಿರಿ
+      login_to_leave_a_comment: '%{login_link} ಅಭಿಪ್ರಾಯ ತಿಳಿಸಲು'
+      login: ಪ್ರವೇಶಿಸು
+      save_button: ಉಳಿಸಿ
+    no_such_entry:
+      title: ಅಂತಹ ಯಾವುದೇ ದಿನಚರಿ ದಾಖಲಾತಿ ಇಲ್ಲ
+      heading: 'ಈ ಸಂಖ್ಯೆಯ ದಾಖಲಾತಿ ಇಲ್ಲ: %{id}'
+    diary_entry:
+      posted_by: '%{link_user} ಅವರಿಂದ %{created} ರಂದು %{language_link} ನಲ್ಲಿ ಪೋಸ್ಟ್
+        ಮಾಡಲಾಗಿದೆ'
+      comment_link: ಈ ದಾಖಲಾತಿಗೆ ನಿಮ್ಮ ಅಭಿಪ್ರಾಯ ತಿಳಿಸಿ
+      reply_link: ಈ ದಾಖಲೆಗೆ ಪ್ರತ್ಯತ್ತರಿಸಿ
+      edit_link: ಈ ದಾಖಲೆಯನ್ನು ತಿದ್ದಿರಿ
+      hide_link: ಈ ದಾಖಲೆಯನ್ನು ಬಚ್ಚಿಡಿ
+      confirm: ಧೃಡಪಡಿಸಿ
+    diary_comment:
+      comment_from: '%{link_user}ಅವರಿಂದ %{comment_created_at}ರಂದು ಅಭಿಪ್ರಾಯ'
+      hide_link: ಈ ಅಭಿಪ್ರಾಯವನ್ನು ಬಚ್ಚಿಡಿ
+      confirm: ಧೃಡಪಡಿಸಿ
+    location:
+      location: 'ಸ್ಥಳ:'
+      view: ವೀಕ್ಷಿಸಿ
+      edit: ಸಂಪಾದಿಸಿ
+    feed:
+      user:
+        title: ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ನಲ್ಲಿ %{user} ಅವರ ದಿನಚರಿ ದಾಖಲಾತಿಗಳು
+        description: ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ನಲ್ಲಿ %{user} ಅವರ ಇತ್ತೀಚಿನ ದಿನಚರಿ ದಾಖಲಾತಿಗಳು
+      language:
+        title: '%{language_name}ನಲ್ಲಿ ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ನ ದಿನಚರಿ ದಾಖಲಾತಿಗಳು'
+    comments:
+      post: ಪೋಸ್ಟ್ ಮಾಡಿ
+      when: ಯಾವಾಗ
+      comment: ಟಿಪ್ಪಣಿ
+      newer_comments: ಹೊಸ ಟಿಪ್ಪಣಿಗಳು
+      older_comments: ಹಳೆ ಟಿಪ್ಪಣಿಗಳು
+  export:
+    title: ರಫ್ತು ಮಾಡು
+    start:
+      licence: ಪರವಾನಗಿ
+      options: ಆಯ್ಕೆಗಳು
+      scale: ಮಾಪಕ
+      latitude: 'ಅಕ್ಷಾಂಶ:'
+      longitude: 'ರೇಖಾಂಶ:'
+      output: ಔಟ್‌ಪುಟ್
+      export_button: ರಫ್ತು ಮಾಡು
+  geocoder:
+    search_osm_nominatim:
+      prefix:
+        amenity:
+          atm: ಎಟಿಎಂ
+          bank: ಬ್ಯಾಂಕ್
+          bar: ಬಾರ್
+          bench: ‍ಬೆಂಚ್
+          bicycle_parking: ‍‍ಸೈಕಲ್ ನಿಲುಗಡೆ
+          bus_station: ಬಸ್ ನಿಲ್ದಾಣ
+          cafe: ಕೆಫೆ
+          car_rental: ಬಾಡಿಗೆ ಕಾರು
+          cinema: ಚಿತ್ರಮಂದಿರ
+          clinic: ಚಿಕತ್ಸಾಲಯ
+          clock: ಗಡಿಯಾರ
+          college: ಕಾಲೇಜು
+          community_centre: ಸಮುದಾಯದ ಕೇಂದ್ರ
+          courthouse: ನ್ಯಾಯಲಯ
+          crematorium: ‍‍ಚಿತಾಗಾರ
+          dentist: ದಂತವೈದ್ಯ
+          doctors: ವೈದ್ಯರು
+          drinking_water: ಕುಡಿಯುವ ನೀರು
+          driving_school: ‍‍ವಾಹನ ಚಾಲನೆಯ ತರಬೇತಿ ಶಾಲೆ
+          embassy: ‍‍ರಾಯಭಾರ ಕಚೇರಿಯ
+          fast_food: ‍‍ಫಾಸ್ಟ್ ಫುಡ್
+          ferry_terminal: ‍‍ಹಾಯಿದೋಣಿ ನಿಲ್ದಾಣ
+          fire_station: ‍‍ಅಗ್ನಿಶಾಮಕ ಠಾಣೆ
+          fountain: ‍ಕಾರಂಜಿ
+          fuel: ‍ಇಂಧನ
+          grave_yard: ಸ್ಮಾಶಾನ
+          hospital: ಆಸ್ಪತ್ರೆ
+          ice_cream: ‍ಐಸ್ ಕ್ರೀಂ
+          kindergarten: ‍‍‍ಶಿಶುವಿಹಾರ
+          library: ಗ್ರಂಥಾಲಯ
+          marketplace: ‍‍ಮಾರುಕಟ್ಟೆ
+          monastery: ‍‍ಮಠ
+          office: ಕಛೇರಿ
+          pharmacy: ‍‍ಔ‍ಷಧಾಲಯ
+          place_of_worship: ‍‍ಆರಾಧನಾ ಮಂದಿರ
+          police: ಆರಕ್ಷಕ
+          post_box: ಟಪಾಲು
+          post_office: ಅಂಚೆ ಕಛೇರಿ
+          prison: ಕಾರಾಗೃಹ
+          public_building: ಸಾರ್ವಜನಿಕ ಕಟ್ಟಡ
+          restaurant: ‍‍ರೆಸ್ಟೋರೆಂಟ್
+          retirement_home: ‍‍ನಿವೃತ್ತಿ ನಿವಾಸ
+          school: ಶಾಲೆ
+          shop: ಅಂಗಡಿ
+          social_centre: ಸಾಮಾಜಿಕ ತಾಣ
+          swimming_pool: ಈಜು ಕೊಳ
+          theatre: ಕಲಾಭವನ
+          toilets: ಶೌಚಾಲಯ
+          townhall: ‍‍‍‍ಪುರಭವನ
+          university: ವಿಶ್ವವಿದ್ಯಾಲಯ
+          veterinary: ‍‍ಪಶುವೈದ್ಯಕೀಯ ಶಸ್ತ್ರಚಿಕಿತ್ಸೆ
+          waste_basket: ‍ಕಸದ ಬುಟ್ಟಿ
+          waste_disposal: ‍ಕಸದ ವಿತರಣೆ
+          youth_centre: ಯುವ ಕೇಂದ್ರ
+        boundary:
+          administrative: ‍‍ಆಡಳಿತಾತ್ಮಕ ಪರಿಧಿ
+          census: ‍‍ಜನಗಣತಿ ಪರಿಧಿ
+          national_park: ರಾಷ್ಟ್ರೀಯ ಉದ್ಯಾನವನ
+          protected_area: ಕಾಪಾಡಲ್ಪಟ್ಟ ಪ್ರದೇಶ
+        bridge:
+          "yes": ಸೇತುವೆ
+        building:
+          "yes": ಕಟ್ಟಡ
+        craft:
+          photographer: ಛಾಯಾಗ್ರಾಹಕ
+          tailor: ‍‍‍ದರ್ಜಿ
+          "yes": ‍‍‍‍ಕರಕುಶಲ ಅಂಗಡಿಯು
+        emergency:
+          ambulance_station: ಆಂಬುಲೆನ್ಸ್ ‍‍‍ಘಟಕ
+          landing_site: ತುರ್ತು ಭೂಸ್ಪರ್ಶ ತಾಣ
+          phone: ‍ತುರ್ತು ದೂರವಾಣಿ
+        highway:
+          abandoned: ‍ಪರಿತ್ಯಕ್ತ ಹೆದ್ದಾರಿ
+          bus_stop: ಬಸ್ ತಂಗುದಾಣ
+          path: ಕಾಲುದಾರಿ
+          road: ರಸ್ತೆ
+          steps: ಮೆಟ್ಟಿಲು
+          street_lamp: ದಾರಿದೀಪ
+          "yes": ರಸ್ತೆ
+        historic:
+          archaeological_site: ಐತಿಹಾಸಿಕ ಸ್ಥಳ
+          building: ಐತಿಹಾಸಿಕ ಕಟ್ಟಡ
+          fort: ಕೋಟೆ
+          house: ಮನೆ
+        landuse:
+          forest: ಅರಣ್ಯ
+          grass: ‍ಹುಲ್ಲು
+        leisure:
+          dog_park: ಶ್ವಾನ ಉದ್ಯಾನ
+          garden: ತೋಟ
+          horse_riding: ಕುದುರೆ ಸವಾರಿ
+          park: ಉದ್ಯಾನ
+          playground: ಆಟದಮೈದಾನ
+          sports_centre: ಕ್ರೀಡಾ ಕೇಂದ್ರ
+          stadium: ಕ್ರೀಡಾಂಗಣ
+          swimming_pool: ಈಜು ಕೊಳ
+          water_park: ಜಲ ಉದ್ಯಾನ
+        man_made:
+          works: ಕಾರ್ಖಾನೆ
+          "yes": ಮಾನವ-ನಿರ್ಮಿತ
+        natural:
+          beach: ಕಡಲತೀರ
+          hill: ಗುಡ್ಡ
+          island: ದ್ವೀಪ
+          mud: ಮಣ್ಣು
+          peak: ತುದಿ
+          sand: ಮರಳು
+          stone: ಕಲ್ಲು
+          tree: ವೃಕ್ಷ
+          valley: ಕಾಲುವೆ
+          volcano: ಜ್ವಾಲಮುಖಿ
+          water: ನೀರು
+        office:
+          accountant: ಲೇಕ್ಕಾಧಿಕಾರಿ
+          administrative: ಆಡಳಿತ
+          architect: ವಾಸ್ತುಶಿಲ್ಪಿ
+          company: ಕಂಪನಿ
+          government: ಸರ್ಕಾರಿ ಕಛೇರಿ
+          lawyer: ವಕೀಲ
+          ngo: ಸರ್ಕಾರೇತರ ಕಛೇರಿ
+          "yes": ಕಛೇರಿ
+        place:
+          city: ನಗರ
+          country: ದೇಶ
+          house: ಮನೆ
+          houses: ಮನೆಗಳು
+          island: ದ್ವೀಪ
+          municipality: ಪುರಸಭೆ
+          sea: ಸಮುದ್ರ
+          state: ರಾಜ್ಯ
+          subdivision: ಉಪವಿಭಾಗ
+          town: ಪಟ್ಟಣ
+          village: ಹಳ್ಳಿ
+          "yes": ಊರು
+        railway:
+          halt: ರೈಲು ನಿಲ್ದಾಣ
+          junction: ರೈಲು ಜಂಕ್ಷನ್
+          monorail: ಮೊನೊರೈಲು
+          station: ರೈಲು ನಿಲ್ದಾಣ
+          stop: ರೈಲು ನಿಲ್ದಾಣ
+        shop:
+          art: ಕಲೆ ಮಳಿಗೆ
+          bakery: ಬೇಕರಿ
+          beauty: ಸೌಂದರ್ಯ ಅಂಗಡಿ
+          bicycle: ಬೈಸಕಲ್ಲಿನ ಅಂಗಡಿ
+          books: ಪುಸ್ತಕದ ಅಂಗಡಿ
+          car: ಕಾರಿನ ಅಂಗಡಿ
+          car_parts: ಕಾರಿನ ಬಿಡಿ ಭಾಗಗಳು
+          clothes: ಬಟ್ಟೆಯ ಅಂಗಡಿ
+          computer: ಗಣಕಯಂತ್ರದ ಅಂಗಡಿ
+          fish: ಮೀನಿನ ಅಂಗಡಿ
+          florist: ಹೂವಿನಂಗಡಿ
+          furniture: ‍‍‍‍‍ಪೀಠೋಪಕರಣ
+          general: ಕಿರಾಣಿ ಅಂಗಡಿ
+          gift: ಉಡುಗೊರೆ ಅಂಗಡಿ
+          jewelry: ಆಭರಣಗಳ ಆಂಗಡಿ
+          "yes": ಅಂಗಡಿ
+        tourism:
+          hostel: ‍ವಸತಿ ನಿಲಯ
+          hotel: ‍ಹೋಟೆಲ್
+          information: ‍‍ಮಾಹಿತಿ
+          museum: ‍‍ವಸ್ತು ಸಂಗ್ರಹಾಲಯ
+          zoo: ಮೃಗಾಲಯ
+        waterway:
+          canal: ‍‍ಕಾಲುವೆ
+          dam: ಅಣೆಕಟ್ಟು
+          ditch: ‍‍ಕಂದಕ
+          drain: ಮೋರಿ
+          river: ನದಿ
+          stream: ಹಳ್ಳ
+          waterfall: ಜಲಪಾತ
+      admin_levels:
+        level2: ದೇಶದ ಗಡಿ
+        level4: ರಾಜ್ಯದ ಗಡಿ
+        level8: ನಗರದ ಗಡಿ
+        level9: ಹಳ್ಳಿಯ ಗಡಿ
+    description:
+      types:
+        cities: ನಗರಗಳು
+        towns: ಪಟ್ಟಣಗಳು
+        places: ಸ್ಥಳಗಳು
+    results:
+      no_results: ಯಾವುದೇ ಫಲಿತಾಂಶಗಳಿಲ್ಲ
+  layouts:
+    logout: ನಿರ್ಗಮಿಸು
+    log_in: ಲಾಗ್ ಇನ್
+    log_in_tooltip: ಇರುವ ಖಾತೆಯಿಂದ ಲಾಗಿನ್ ಆಗಿ
+    start_mapping: ನಕ್ಷೆಯನ್ನು ಸಂಪಾದಿಸಿ
+    sign_up_tooltip: ಸಂಪಾದಿಸಲು ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ
+    edit: ಸಂಪಾದಿಸಿ
+    history: ಇತಿಹಾಸ
+    export: ರಫ್ತು ಮಾಡು
+    data: ದತ್ತಾಂಶ
+    export_data: ದತ್ತಾಂಶ ರಫ್ತುಮಾಡು
+    intro_header: ಒಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ಗೆ  ಸುಸ್ವಾಗತ!
+    intro_2_create_account: ಹೊಸ ಬಳಕೆದಾರ ಖಾತೆಯನ್ನು ರಚಿಸಿ
+    help: ಸಹಾಯ
+    about: ನಮ್ಮ ಬಗ್ಗೆ
+    copyright: ಕಾಯ್ದಿರಿಸಿದ ಹಕ್ಕುಗಳು
+    community: ಸಮುದಾಯ
+    community_blogs: ಸಮುದಾಯದ ಬ್ಲಾಗ್ ಗಳು
+    foundation: ‍ಫೌಂಡೇಶನ್
+    foundation_title: ‍‍ಓಪನ್‌ಸ್ಟ್ರೀಟ್‌ಮ್ಯಾಪ್ ‍ಫೌಂಡೇಶನ್
+    make_a_donation:
+      text: ದೇಣಿಗೆ ನೀಡಿ
+    learn_more: ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ
+    more: ಇನ್ನಷ್ಟು
+  license_page:
+    foreign:
+      title: ಈ ಅನುವಾದದ ಬಗ್ಗೆ
+      english_link: ಆಂಗ್ಲದ ಮೂಲ
+    native:
+      title: ಈ ಪುಟದ ಬಗ್ಗೆ
+      mapping_link: ನಕ್ಷೆಯನ್ನು ಸಂಪಾದಿಸಿಲು ಪ್ರಾರಂಭಿಸಿ
+    legal_babble:
+      title_html: ಕೃತಿಸ್ವಾಮ್ಯ ಮತ್ತು ಪರವಾನಗಿ
+  welcome_page:
+    title: ಸುಸ್ವಾಗತ!
+    whats_on_the_map:
+      title: ನಕ್ಷೆಯ ಮೇಲೆನಿದೆ
+    questions:
+      title: ಏನಾದರು ಪ್ರಶ್ನೆಗಳಿವೆಯೇ?
+    start_mapping: ನಕ್ಷೆಯನ್ನು ಸಂಪಾದಿಸಿಲು ಪ್ರಾರಂಭಿಸಿ
+    add_a_note:
+      title: ನಕ್ಷೆಯನ್ನು ಸಂಪಾದಿಸಿಲು ಸಮಯವಿಲ್ಲವೇ? ಟಿಪ್ಪಣಿಯನ್ನು ಸೇರಿಸಿರಿ!
+  fixthemap:
+    title: ಸಮಸ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಿ / ನಕ್ಷೆಯನ್ನು ಸರಿಪಡಿಸಿ
+    how_to_help:
+      title: ಸಹಾಯ ಮಾಡುವುದು ಹೇಗೆ
+      join_the_community:
+        title: ಸಮುದಾಯವನ್ನು ಸೇರಿ
+    other_concerns:
+      title: ಇತರೆ ಕಳಕಳಿಗಳು
+  help_page:
+    title: ಸಹಾಯವನ್ನು ಪಡೆವುದು
+    welcome:
+      url: /welcome
+      title: ಒಎಸ್ಎಂಗೆ ಸುಸ್ವಾಗತ
+    help:
+      url: https://help.openstreetmap.org/
+      title: help.openstreetmap.org
+    irc:
+      title: ಐ ಆರ್ ಸಿ
+    wiki:
+      url: http://wiki.openstreetmap.org/
+      title: wiki.openstreetmap.org
+  about_page:
+    next: ಮುಂದಿನ
+    open_data_title: ಮುಕ್ತ ದತ್ತಾಂಶ
+  notifier:
+    diary_comment_notification:
+      hi: ನಮಸ್ತೆ %{to_user}
+    message_notification:
+      hi: ನಮಸ್ತೆ %{to_user}
+    signup_confirm:
+      greeting: ನಮಸ್ಕಾರ!
+    email_confirm_plain:
+      greeting: ನಮಸ್ತೆ,
+    email_confirm_html:
+      greeting: ನಮಸ್ತೆ,
+    lost_password_plain:
+      greeting: ನಮಸ್ತೆ,
+    lost_password_html:
+      greeting: ನಮಸ್ತೆ,
+    note_comment_notification:
+      anonymous: ಒಬ್ಬ ಅನಾಮಧೇಯ ಸದಸ್ಯ
+      greeting: ನಮಸ್ತೆ,
+    changeset_comment_notification:
+      greeting: ನಮಸ್ತೆ,
+  message:
+    inbox:
+      from: ಇಂದ
+      subject: ವಿಷಯ
+      date: ದಿನಾಂಕ
+    message_summary:
+      reply_button: ಉತ್ತರಿಸಿ
+      delete_button: ಅಳಿಸು
+    new:
+      title: ಸಂದೇಶ ಕಳುಹಿಸಿ
+      send_message_to: ಹೊಸ ಸಂದೇಶವನ್ನು %{name} ಗೆ ಕಳುಹಿಸಿ
+      subject: ವಿಷಯ
+      body: ಶರೀರ
+      send_button: ಕಳುಹಿಸಿ
+    outbox:
+      to: ಗೆ
+      subject: ವಿಷಯ
+      date: ದಿನಾಂಕ
+      people_mapping_nearby: ನಿಮ್ಮ ಹತ್ತಿರವಿರುವ ಬಳಕೆದಾರರು
+    read:
+      title: ಸಂದೇಶವನ್ನು ಓದಿ
+      from: ಇಂದ
+      subject: ವಿಷಯ
+      date: ದಿನಾಂಕ
+      reply_button: ಉತ್ತರಿಸಿ
+      back: ಹಿಂದಕ್ಕೆ
+      to: ಗೆ
+    sent_message_summary:
+      delete_button: ಅಳಿಸು
+    mark:
+      as_read: ಸಂದೇಶ ಓದಾಲಾಗಿದೆ ಎಂದು ಗುರುತು ಮಾಡಿ
+      as_unread: ಸಂದೇಶ ಓದಾಲಾಗಿಲ್ಲ ಎಂದು ಗುರುತು ಮಾಡಿ
+    delete:
+      deleted: ಸಂದೇಶವನ್ನು ಅಳಿಸಿ ಹಾಕಲಾಗಿದೆ
+  site:
+    sidebar:
+      close: ಮುಚ್ಚಿ
+    search:
+      search: ಹುಡುಕು
+      get_directions: ದಾರಿಯನ್ನು ಹುಡುಕಿ
+      from: ಇಂದ
+      to: ಗೆ
+      where_am_i: ನಾನು ಎಲ್ಲಿದ್ದೇನೆ?
+      submit_text: ಹೋಗು
+    key:
+      table:
+        entry:
+          forest: ಅರಣ್ಯ
+          park: ಉದ್ಯಾನ
+          resident: ವಾಸ ಮಾಡುವ ಸ್ಥಳ
+          lake:
+          - ಕೆರೆ
+          - ಅಣೆಕಟ್ಟು
+          farm: ಒಕ್ಕಲು ಜಮೀನು
+          cemetery: ಸ್ಮಾಶಾಣ
+          school:
+          - ಪಾಠಶಾಲೆ
+          - ವಿಶ್ವವಿದ್ಯಾಲಯ
+          station: ರೈಲು ನಿಲ್ದಾಣ
+    richtext_area:
+      edit: ಸಂಪಾದಿಸಿ
+      preview: ಮುನ್ನೋಟ
+    markdown_help:
+      headings: ತಲೆಬರಹಗಳು
+      heading: ತಲೆಬರಹ
+      subheading: ಉಪ ಶಿರೋನಾಮೆ
+      image: ಚಿತ್ರ
+  trace:
+    edit:
+      filename: 'ಕಡತದ ಹೆಸರು:'
+      download: ಡೌನ್‍ಲೋಡ್
+      uploaded_at: 'ಅಪ್ಲೋಡ್ ಆಗಿದೆ:'
+      map: ನಕ್ಷೆ
+      edit: ಸಂಪಾದಿಸಿ
+      description: 'ವಿವರ:'
+    trace_form:
+      upload_button: ಅಪ್ಲೋಡ್
+      help: ಸಹಾಯ
+  user:
+    login:
+      title: ಲಾಗ್ ಇನ್
+      password: 'ಪ್ರವೇಶಪದ:'
+    logout:
+      title: ಲಾಗ್ ಔಟ್
+      logout_button: ಲಾಗ್ ಔಟ್
+    reset_password:
+      password: 'ಪ್ರವೇಶಪದ:'
+      flash changed: ನಿಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.
+    new:
+      password: 'ಪ್ರವೇಶಪದ:'
+    terms:
+      legale_names:
+        france: ಫ಼್ರಾನ್ಸ್
+        italy: ಇಟಲಿ
+  user_block:
+    show:
+      created: ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ
+  note:
+    rss:
+      description_area: '[(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] ನಿಮ್ಮ
+        ಸ್ಥಳದಲ್ಲಿ ಮುಗಿಸಿದ ಅಥವಾ ವರದಿಮಾಡಿದ, ಟಿಪ್ಪಣಿಗಳ ಪಟ್ಟಿ'
+      closed: '%{place} ಹತ್ತಿರ ಮುಗಿಸಿದ ಪಟ್ಟಿ'
+  javascripts:
+    directions:
+      instructions:
+        unnamed: ಹೆಸರಿಯಿಲ್ಲದ ರಸ್ತೆ
+...
index 8db8281ed24cda16fd46a7c7a8d706dc6af99d01..f7e9e6b5a17c6ec8c5a2ea5bbc08c4e74c003a8d 100644 (file)
@@ -358,7 +358,7 @@ ko:
       map_image: 지도 그림 (표준 레이어 보이기)
       embeddable_html: 내장된 HTML
       licence: 라이선스
-      export_details: OpenStreetMap 데이터는 <a href="http://opendatacommons.org/licenses/odbl/1.0/">오픈
+      export_details: OpenStreetMap 데이터는 <a href="https://opendatacommons.org/licenses/odbl/1.0/">오픈
         데이터 커먼즈 오픈 데이터베이스 라이선스</a>(ODbL)에 따라 사용할 수 있습니다.
       too_large:
         advice: '위의 내보내기가 실패하면, 아래에 나열된 원본 중 하나를 사용하는 것을 고려해주세요:'
@@ -394,14 +394,14 @@ ko:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">내부</a> 결과
+        latlon: <a href="https://openstreetmap.org/">내부</a> 결과
         uk_postcode: <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>에서의
           결과
-        ca_postcode: <a href="http://geocoder.ca/">Geocoder.CA</a>에서의 결과
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: <a href="https://geocoder.ca/">Geocoder.CA</a>에서의 결과
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>에서의 결과
         geonames: <a href="http://www.geonames.org/">GeoNames</a>에서의 결과
-        osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>에서의 결과
         geonames_reverse: <a href="http://www.geonames.org/">GeoNames</a>에서의 결과
     search_osm_nominatim:
@@ -451,33 +451,26 @@ ko:
           crematorium: 화장장
           dentist: 치과
           doctors: 의원
-          dormitory: 기숙사
           drinking_water: 음수대
           driving_school: 운전 학원
           embassy: 대사관
-          emergency_phone: 긴급 전화
           fast_food: 패스트 푸드
           ferry_terminal: 페리 부두
-          fire_hydrant: 소화전
           fire_station: 소방서
           food_court: 푸드코트
           fountain: 분수대
           fuel: 주유소
           gambling: 도박장
           grave_yard: 묘지
-          gym: 피트니스 센터 / 체육관
-          health_centre: 보건소
           hospital: 병원
           hunting_stand: 사냥장
           ice_cream: 아이스크림
           kindergarten: 유치원
           library: 도서관
-          market: 시장
           marketplace: 시장
           monastery: 수도원
           motorcycle_parking: 오토바이 주차장
           nightclub: 나이트 클럽
-          nursery: 보육원
           nursing_home: 복지관
           office: 사옥
           parking: 주차장
@@ -491,7 +484,6 @@ ko:
           prison: 교도소
           pub: 술집
           public_building: 공공 건물
-          reception_area: 접수 구역
           recycling: 재활용장
           restaurant: 음식점
           retirement_home: 노인정
@@ -587,7 +579,6 @@ ko:
           trunk: 대로 또는 간선 도로
           trunk_link: 간선 도로
           unclassified: 분류되지 않은 도로
-          unsurfaced: 비포장 도로
           "yes": 도로
         historic:
           archaeological_site: 유적지
@@ -652,7 +643,6 @@ ko:
         leisure:
           beach_resort: 해수욕장
           bird_hide: 조류 관찰소
-          club: 클럽
           common: 공유지
           dog_park: 반려견 공원
           fishing: 낚시터
@@ -745,8 +735,6 @@ ko:
           "yes": 사옥
         place:
           allotments: 텃밭
-          block: 벽돌
-          airport: 공항
           city: 시
           country: 국가
           county: 군
@@ -758,7 +746,6 @@ ko:
           islet: 작은 섬
           isolated_dwelling: 독립 주택
           locality: 지역
-          moor: 습지
           municipality: 시정촌
           neighbourhood: 마을
           postcode: 우편 번호
@@ -775,10 +762,8 @@ ko:
           abandoned: 폐선된 철도
           construction: 건설 중인 철도
           disused: 폐선된 철도
-          disused_station: 폐역된 철도역
           funicular: 케이블 카
           halt: 기차 정지
-          historic_station: 역사적인 철도역
           junction: 철도 분기점
           level_crossing: 건널목
           light_rail: 경전철
@@ -842,7 +827,6 @@ ko:
           hairdresser: 미용실
           hardware: 철물점
           hifi: 고급 오디오
-          insurance: 보험
           jewelry: 보석 상점
           kiosk: 키오스크 숍
           laundry: 세탁소
@@ -858,10 +842,8 @@ ko:
           pet: 애완 동물 가게
           pharmacy: 약국
           photo: 사진관
-          salon: 가게
           second_hand: 중고품 가게
           shoes: 신발 가게
-          shopping_centre: 쇼핑 센터
           sports: 스포츠용품점
           stationery: 문구점
           supermarket: 수퍼마켓
@@ -924,7 +906,7 @@ ko:
         level10: 교외 경계
     description:
       title:
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>에서의 위치
         geonames: <a href="http://www.geonames.org/">GeoNames</a>에서의 위치
       types:
@@ -958,7 +940,7 @@ ko:
     intro_header: OpenStreetMap에 오신 것을 환영합니다!
     intro_text: OpenStreetMap은 여러분과 같은 사람들이 만들어, 개방형 라이선스에 따라 자유롭게 사용할 수 있는 세계 지도입니다.
     intro_2_create_account: 사용자 계정을 만드세요
-    partners_html: 호스팅은 %{ucl} 및 %{ic}, %{bytemark}, 다른 %{partners}에서 지원합니다.
+    partners_html: 호스팅은 %{ucl}, %{ic}, %{bytemark}, 다른 %{partners}에서 지원합니다.
     partners_ucl: UCL
     partners_ic: 임페리얼 칼리지 런던 대학
     partners_bytemark: 바이트마크 호스팅
@@ -994,25 +976,25 @@ ko:
       title_html: 저작권 및 라이선스
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup>은 <i>오픈 데이터</i>로 <a
-        href="http://osmfoundation.org/">OpenStreetMap 재단</a> (OSMF)의 <a
-        href="http://opendatacommons.org/licenses/odbl/">오픈 데이터
+        href="https://osmfoundation.org/">OpenStreetMap 재단</a> (OSMF)의 <a
+        href="https://opendatacommons.org/licenses/odbl/">오픈 데이터
         커먼즈 오픈 데이터베이스 라이선스</a>(ODbL)에 따라 사용할 수 있습니다.
       intro_2_html: |-
         OpenStreetMap 기여자를 명시하는 한, OpenStreetMap 데이터를 자유롭게 복사, 배포, 전송 및 적용할 수 있습니다.
         데이터를 바꾸거나 데이터에 기초로 할 때는 오로지
         같은 라이선스에 따라서만 결과를 배포할 수 있습니다.
-        <a href="http://opendatacommons.org/licenses/odbl/1.0/">전문</a>은
+        <a href="https://opendatacommons.org/licenses/odbl/1.0/">전문</a>은
         당신의 권리와 책임을 설명합니다.
       intro_3_html: |-
         지도 타일의 지도 제작과 설명문서는
-        <a href="http://creativecommons.org/licenses/by-sa/2.0/">크리에이티브
+        <a href="https://creativecommons.org/licenses/by-sa/2.0/">크리에이티브
         커먼즈 저작자표시-동일조건변경허락 2.0</a> 라이선스(CC BY-SA)에 따라 사용할 수 있습니다.
       credit_title_html: OpenStreetMap 제작진 넣는 방법
       credit_1_html: '&ldquo;&copy; OpenStreetMap 기여자&rdquo;를 저작자로 사용해야 합니다.'
       credit_2_html: |-
         또한 명확하게 데이터는 오픈 데이터베이스 라이선스에 따라 사용할 수 있으며,
         지도 제작은 지도 타일을 사용할 때에 CC-BY-SA로 허가합니다.
-        <a href="http://www.openstreetmap.org/copyright">이 저작권 문서</a>로
+        <a href="https://www.openstreetmap.org/copyright">이 저작권 문서</a>로
         링크하여 이렇게 할 수 있습니다.
         또한 데이터 형식으로 OSM을 배포할 때는 라이선스 이름과
         라이선스에 직접 링크를 할 수 있습니다. 링크할 수 없는
@@ -1028,8 +1010,8 @@ ko:
       more_title_html: 자세히 찾기
       more_1_html: |-
         데이터를 사용하는 방법과 제작진을 표시하는 방법에 대해서는 <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">법적
-        FAQ</a>를 자세히 읽으세요.
+        href="https://osmfoundation.org/Licence">OSMF 라이선스 문서
+        </a>를 자세히 읽으세요.
       more_2_html: |-
         OpenStreetMap은 오픈 데이터이지만 타사 개발자를 위한
         지도 API는 무료로 제공할 수 없습니다.
@@ -1041,10 +1023,10 @@ ko:
         우리의 기여자는 수천 명입니다. 또한 국립지도 제작 기관과
         같은 다른 소스의 공개 라이선스의 데이터를 포함하고 있습니다:
       contributors_at_html: |-
-        <strong>오스트리아</strong>: <a href="http://data.wien.gv.at/">Stadt Wien</a>
-        (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>에 따름),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a>와
-        Land Tirol (<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">개정된 CC-BY AT</a>에 따름)에서의
+        <strong>오스트리아</strong>: <a href="https://data.wien.gv.at/">Stadt Wien</a>
+        (<a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>에 따름),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a>와
+        Land Tirol (<a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">개정된 CC-BY AT</a>에 따름)에서의
         데이터를 포함합니다.
       contributors_ca_html: |-
         <strong>캐나다</strong>: GeoBase&reg;, GeoGratis
@@ -1053,15 +1035,15 @@ ko:
         천연자원부)과 StatCan (캐나다 연방통계청,
         지리부)에서의 데이터를 포함합니다.
       contributors_fi_html: |-
-        <strong>핀란드</strong>: <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI 라이선스</a>에
-        따른, National Land Survey of Finland's Topographic Database와
+        <strong>핀란드</strong>: <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI 라이선스</a>에 따른,
+        National Land Survey of Finland's Topographic Database와
         다른 데이터집합에서의 데이터를 포함합니다.
       contributors_fr_html: |-
         <strong>프랑스</strong>: Direction Générale des Impôts에서의
         데이터를 포함합니다.
       contributors_nl_html: |-
         <strong>네덜란드</strong>: &copy; AND 데이터, 2007년
-        (<a href="http://www.and.com">www.and.com</a>)을 포함합니다.
+        (<a href="https://www.and.com">www.and.com</a>)을 포함합니다.
       contributors_nz_html: |-
         <strong>뉴질랜드</strong>: Land Information New Zealand에서의
         데이터를 포함합니다. Crown이 저작권을 소유합니다.
@@ -1080,7 +1062,7 @@ ko:
       contributors_footer_1_html: |-
         자세한 내용과 OpenStreetMap을 개선하는 데 도움이 되는 데 사용한
         기타 자료에 대해서는 OpenStreetMap 위키에 있는 <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">기여자 문서</a>
+        href="https://wiki.openstreetmap.org/wiki/Contributors">기여자 문서</a>
         를 참조하세요.
       contributors_footer_2_html: |-
         OpenStreetMap에 포함된 데이터는 원래 데이터 제공자가
@@ -1093,12 +1075,12 @@ ko:
         데이터를 반입하지 않도록 주의하여야 합니다.
       infringement_2_html: |-
         저작권을 가진 자료가 부적절하게 OpenStreetMap 데이터베이스나 이 사이트에
-        추가되었다고 생각하면 <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">게시
+        추가되었다고 생각하면 <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">게시
         중단 절차</a>를 참고하거나 <a href="http://dmca.openstreetmap.org/">온라인
         신고 페이지</a>에서 직접 제출하세요.
       trademarks_title_html: <span id="trademarks"></span>등록 상표
       trademarks_1_html: OpenStreetMap, 돋보기 로고, 스테이트 오브 맵은 OpenStreetMap 재단의 등록상표입니다.
-        상표의 사용에 대해 의문이 있는 경우, 관련된 질문을 <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">라이선싱
+        상표의 사용에 대해 의문이 있는 경우, 관련된 질문을 <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">라이선싱
         작업 그룹</a>으로 보내 주세요.
   welcome_page:
     title: 환영합니다!
@@ -1127,8 +1109,8 @@ ko:
     rules:
       title: 여기서 규칙!
       paragraph_1_html: "OpenStreetMap은 몇 가지 형식적인 규칙이 있지만 우리는 모든 참가자가 협력하고, 공동체와 소통하기를
-        바랍니다.\n여러분이 직접 편집하지 않는 다른 활동을 고려한다면, \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>가져오기</a>와
-        \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>자동화된
+        바랍니다.\n여러분이 직접 편집하지 않는 다른 활동을 고려한다면, \n<a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>가져오기</a>와
+        \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>자동화된
         편집</a>에서의\n다음 가이드라인을 읽고 따라주시기 바랍니다."
     questions:
       title: 질문 있나요?
@@ -1165,7 +1147,7 @@ ko:
       explanation_html: |-
         우리의 데이터가 사용되는 방법이나 내용에 대한 문제가 있다면 더 많은 법률
         정보에 대한 우리의 <a href='/copyright'>저작권 문서</a>를 참조하거나 해당
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF 작업 그룹</a>에 문의하시기 바랍니다.
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF 작업 그룹</a>에 문의하시기 바랍니다.
   help_page:
     title: 도움말 얻기
     introduction: |-
@@ -1176,7 +1158,7 @@ ko:
       title: OSM에 오신 것을 환영합니다
       description: OpenStreetMap 기초를 다루는 이 퀵 가이드로 시작합니다.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Ko:%EC%B4%88%EB%B3%B4%EC%9E%90_%EC%95%88%EB%82%B4%EC%84%9C
+      url: https://wiki.openstreetmap.org/wiki/Ko:%EC%B4%88%EB%B3%B4%EC%9E%90_%EC%95%88%EB%82%B4%EC%84%9C
       title: 초보자 가이드
       description: 커뮤니티에서 유지하는 초보자 가이드
     help:
@@ -1196,7 +1178,7 @@ ko:
       title: switch2osm
       description: 회사나 단체가 OpenStreetMap와 다른 서비스를 기반으로 전환하는 것에 도움을 주십시오.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: 깊이 있는 OSM 설명문서에 대해서는 위키를 찾아보세요.
   about_page:
@@ -1211,17 +1193,17 @@ ko:
     community_driven_title: 공동체 주도
     community_driven_html: |-
       OpenStreetMap의 공동체는 다양하고, 열정적이며, 날마다 자라납니다. 열성적인 지도 제작자, GIS 전문가, OSM 서버를 작동시키는 기술자, 재해 지역의 지도를 제작하는 인도주의자 등이 우리의 기여자입니다.
-      공동체에 대해 알고 싶다면 <a href='%{diary_path}'>사용자 일기</a>와 <a href='http://blogs.openstreetmap.org/'>공동체 블로그</a>, <a href='http://www.osmfoundation.org/'>OSM 재단</a> 웹사이트를 방문해보세요.
+      공동체에 대해 알고 싶다면 <a href='%{diary_path}'>사용자 일기</a>, <a href='https://blog.openstreetmap.org'>OpenStreetMap 블로그</a>, <a href='https://blogs.openstreetmap.org/'>공동체 블로그</a>, <a href='https://www.osmfoundation.org/'>OSM 재단</a> 웹사이트를 방문해보세요.
     open_data_title: 개방형 자료
     open_data_html: 'OpenStreetMap은 개방형 자료입니다: OpenStreetMap 및 기여자를 저작자로 명시하는 한 어떠한
       목적으로도 자유롭게 이용할 수 있습니다. 만일 어떤 방법으로 자료를 변경하거나 2차 제작을 한다면, 동일한 라이선스에 한하여 그 결과물을
       배포할 수 있습니다. 자세한 내용은 <a href=''%{copyright_path}''>저작권 및 라이선스 문서</a>에서 확인하세요.'
     legal_title: 법률
     legal_html: |-
-      이 사이트 및 많은 다른 관련된 부문은 공동체를 대표하여 <a href='http://osmfoundation.org/'>OpenStreetMap 재단</a>에서 정식적으로 운영합니다. OpenStreetMap 재단이 운영하는 부문의 이용은 <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
-      허용할 수 있는 이용 정책</a> 및 <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">개인정보 정책</a> 조건 하에서 이루어집니다.
+      이 사이트 및 많은 다른 관련된 부문은 공동체를 대표하여 <a href='https://osmfoundation.org/'>OpenStreetMap 재단</a>에서 정식적으로 운영합니다. OpenStreetMap 재단이 운영하는 부문의 이용은 <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+      허용할 수 있는 이용 정책</a> 및 <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">개인정보 정책</a> 조건 하에서 이루어집니다.
       <br>
-      만일 이용허락 또는 저작권 및 다른 법률적인 질문이나 사안이 있다면, <a href='http://osmfoundation.org/Contact'>OpenStreetMap 재단에 연락</a>하십시오.
+      만일 이용허락 또는 저작권 및 다른 법률적인 질문이나 사안이 있다면, <a href='https://osmfoundation.org/Contact'>OpenStreetMap 재단에 연락</a>하십시오.
     partners_title: 파트너
   notifier:
     diary_comment_notification:
@@ -1410,7 +1392,7 @@ ko:
         가지 다른 설정</a> 또한 OpenStreetMap 편집을 위해 사용할 수 있습니다.
       potlatch_unsaved_changes: 바뀐 내용을 저장하지 않았습니다. (Potlatch에 저장하려면 라이브 모드에서 편집하는
         경우 현재 길이나 점의 선택을 해제하시고, 저장 버튼이 있다면 저장을 클릭해야 합니다.)
-      potlatch2_not_configured: Potlatch 2가 설정되지 않았습니다 - 자세한 정보는 http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2가 설정되지 않았습니다 - 자세한 정보는 https://wiki.openstreetmap.org/wiki/The_Rails_Port
       potlatch2_unsaved_changes: 바뀐 내용을 저장하지 않았습니다. (Potlatch 2에서 저장하려면 저장을 클릭해야 합니다.)
       id_not_configured: iD가 설정되지 않았습니다
       no_iframe_support: 브라우저가 이 기능에 필요한 HTML iframe을 지원하지 않습니다.
@@ -1423,7 +1405,7 @@ ko:
       get_directions_title: 두 점 사이의 길 찾기
       from: 출발지
       to: 도착지
-      where_am_i: 이것이 어디있나요?
+      where_am_i: ì\9d´ê²\83ì\9d´ ì\96´ë\94\94ì\97\90 ì\9e\88ë\82\98ì\9a\94?
       where_am_i_title: 검색 엔진을 사용하여 현재 위치를 나타냅니다
       submit_text: 검색
     key:
@@ -1500,7 +1482,7 @@ ko:
       edit: 편집
       preview: 미리 보기
     markdown_help:
-      title_html: <a href="http://daringfireball.net/projects/markdown/">마크다운</a>으로
+      title_html: <a href="https://daringfireball.net/projects/markdown/">마크다운</a>으로
         구문 분석됩니다
       headings: 문단 제목
       heading: 문단 제목
@@ -1605,7 +1587,7 @@ ko:
       description: 최근의 GPS 궤적 올리기 둘러보기
       tagged_with: '%{tags}(으)로 태그함'
       empty_html: 여기에는 아직 아무것도 없습니다. <a href='%{upload_link}'>새 궤적 올리기</a>를 사용하거나
-        <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>위키 문서</a>에서
+        <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>위키 문서</a>에서
         GPS 궤적에 대해 더 알아보세요.
     delete:
       scheduled_for_deletion: 삭제 계획중인 궤적
@@ -1802,11 +1784,11 @@ ko:
           <p>다른 지도와는 달리, OpenStreetMap은 완전히 여러분과 같은 사람들이 만들어,
           누구나 자유롭게 고치고, 갱신하며, 내려받아 사용할 수 있습니다.</p>
           <p>기여를 시작하려면 가입하세요. 계정 확인용 이메일을 보내드립니다.</p>
-      license_agreement: 계정을 확인하면 당신은 <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">기여자
+      license_agreement: 계정을 확인하면 당신은 <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">기여자
         약관</a>에 동의해야합니다.
       email address: '이메일 주소:'
       confirm email address: '이메일 주소 확인:'
-      not displayed publicly: 당신의 주소는 공개되지 않습니다. 자세한 내용은 <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: 당신의 주소는 공개되지 않습니다. 자세한 내용은 <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="OSMF privacy policy including section on email addresses">개인정보 정책</a>을
         참조하시기 바랍니다.
       display name: '표시 이름:'
@@ -1820,6 +1802,7 @@ ko:
       terms accepted: 새 기여자 약관에 동의해 주셔서 감사합니다!
       terms declined: 새 기여자 약관에 동의하지 않은 것으로 결정했기에 죄송합니다. 자세한 정보에 대해서는 <a href="%{url}">이
         위키 문서</a>를 참조하세요.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: 기여자 약관
       heading: 기여자 약관
@@ -1918,7 +1901,7 @@ ko:
       email never displayed publicly: (절대 공개하지 않습니다)
       external auth: '바깥 인증:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: 이게 뭐죠?
       public editing:
         heading: '공개 편집:'
@@ -1931,7 +1914,7 @@ ko:
         heading: 공개 편집
         text: 현재 편집은 익명으로 나타나며, 다른 사람에게서 메시지를 받을 수 없고 자신의 위치가 공개되지 않습니다. 자신이 편집한 것을
           드러내고 다른 사람이 웹 사이트를 통해 연락할 수 있게 하려면 아래 버튼을 클릭하세요. <b>0.6 API 개편 이후 공개 사용자만
-          지도 데이터를 편집할 수 있습니다</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">이유
+          지도 데이터를 편집할 수 있습니다</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">이유
           알아보기</a>).<ul><li>공개 사용자가 되더라도 이메일 주소는 공개되지 않습니다.</li><li>이 동작은 취소할 수 없으며,
           모든 새로운 사용자는 현재 기본적으로 공개 계정입니다.</li></ul>
       contributor terms:
@@ -1940,6 +1923,7 @@ ko:
         not yet agreed: 아직 새 기여자 약관에 동의하지 않았습니다.
         review link text: 검토할 사용자의 편의에 이 링크를 따르고 새 기여자 약관에 동의하세요.
         agreed_with_pd: 또한 자신의 편집이 퍼블릭 도메인에 있어야 한다고 생각하는 것도 선언하고 있습니다.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: 이게 뭐죠?
       profile description: '프로필 설명:'
       preferred languages: 주로 사용하는 언어
@@ -2045,6 +2029,7 @@ ko:
       not_a_role: '''%{role}'' 문자열은 올바른 역할이 아닙니다.'
       already_has_role: 사용자는 이미 %{role} 역할이 있습니다.
       doesnt_have_role: 사용자는 %{role} 역할이 없습니다.
+      not_revoke_admin_current_user: 현재 사용자로부터 관리자 역할을 철회할 수 없습니다.
     grant:
       title: 역할 부여 확인
       heading: 역할 부여 확인
@@ -2254,7 +2239,7 @@ ko:
     notes:
       new:
         intro: 실수했거나 없는 무언가를 발견했나요? 다른 매퍼에게 알려주어 고칠 수 있게 해주세요. 마커를 올바른 위치로 이동하고, 참고를
-          남겨 문제를 설명해주세요. (개인 정보나 저작권이 있는 지도나 디렉터리 목록에서의 정보를 입력하지 마세요.)
+          남겨 문제를 설명해주세요.
         add: 참고 추가
       show:
         anonymous_warning: 익명 사용자의 참고도 있으므로 별도로 확인해야 합니다.
@@ -2274,9 +2259,6 @@ ko:
         mapquest_car: 자동차 (MapQuest)
         mapquest_foot: 도보 (MapQuest)
         osrm_car: 자동차 (OSRM)
-        mapzen_bicycle: 자전거 (Mapzen)
-        mapzen_car: 자동차 (Mapzen)
-        mapzen_foot: 도보 (Mapzen)
       descend: 내려가기
       directions: 길
       distance: 거리
diff --git a/config/locales/ku-Latn.yml b/config/locales/ku-Latn.yml
new file mode 100644 (file)
index 0000000..70a656e
--- /dev/null
@@ -0,0 +1,1096 @@
+# Messages for Kurdish (Latin script) (Kurdî (latînî)‎)
+# Exported from translatewiki.net
+# Export driver: phpyaml
+# Author: Bikarhêner
+# Author: George Animal
+# Author: Ghybu
+# Author: Gomada
+---
+ku-Latn:
+  html:
+    dir: ltr
+  time:
+    formats:
+      friendly: '%e %B %Y saet %H:%M'
+      blog: '%e %B %Y'
+  activerecord:
+    models:
+      acl: Lîsteya Kontrolê Têketinan
+      changeset: Qeyda Guhertinan
+      changeset_tag: Nîşana Qeyda Guhertinan
+      country: Welat
+      diary_comment: Şîroveya rojane
+      diary_entry: Nivîsa Rojane
+      friend: Heval
+      language: Ziman
+      message: Peyam
+      node: Nuqte
+      node_tag: Nîşana Nuqteyê
+      notifier: Agahker
+      old_node: Nuqteya Kevin
+      old_node_tag: Nîşana Nuqteya Kevin
+      old_relation: Eleqeya Kevin
+      old_relation_member: Endama Eleqeya Kevin
+      old_relation_tag: Nîşana Eleqeya Kevin
+      old_way: Rêya kevn
+      old_way_node: Girêdana Rêya Kevn
+      old_way_tag: Nîşana Rêya Kevn
+      relation: Pêwendî
+      relation_member: Endamê Eleqedar
+      relation_tag: Nîşana Eleqeyê
+      session: Danişîn
+      trace: Rêç
+      tracepoint: Nuqteya Taqîbkirinê
+      tracetag: Nîşana Şopandinê
+      user: Bikarhêner
+      user_preference: Tercîhên Bikarhêner
+      user_token: Sembola Bikarhênerê
+      way: Rê
+      way_node: Girêdana Rê
+      way_tag: Nîşana rê
+    attributes:
+      diary_comment:
+        body: Nivîs
+      diary_entry:
+        user: Bikarhêner
+        title: Mijar
+        latitude: Hêlîpan
+        longitude: Hêlîlar
+        language: Ziman
+      friend:
+        user: Bikarhêner
+        friend: Heval
+      trace:
+        user: Bikarhêner
+        visible: Xuya
+        name: Nav
+        size: Mezinbûn
+        latitude: Hêlîpan
+        longitude: Hêlîlar
+        public: Giştî
+        description: Danasîn
+      message:
+        sender: Şander
+        title: Mijar
+        body: Nivîs
+        recipient: Wergir
+      user:
+        email: E-name
+        active: Çalak
+        display_name: Nav nîşan bide
+        description: Danasîn
+        languages: Ziman
+        pass_crypt: Şîfre
+  editor:
+    default: Standard (vêga %{name})
+    potlatch:
+      name: Potlatch 1
+      description: Potlatch 1 (sererastkirina ji ser geroka webê)
+    id:
+      name: iD
+      description: iD (sererastkirina ji ser geroka webê)
+    potlatch2:
+      name: Potlatch 2
+      description: Potlatch 2 (sererastkirina ji ser geroka webê)
+    remote:
+      name: Ji Dûr Ve Îdarekirin
+      description: Ji Dûr Ve Kontrol (JOSM yan jî Merkaartor)
+  browse:
+    created: Hate çêkirin
+    closed: Hate girtin
+    created_html: Berî</abbr> <abbr title='%{title}'>%{time} hatiye çêkirin
+    closed_html: Berî</abbr> <abbr title='%{title}'>%{time} hatiye girtin
+    created_by_html: Ji aliyê %{user} ve berî</abbr> <abbr title='%{title}'>%{time}
+      hatiye çêkirin
+    deleted_by_html: Ji aliyê %{user} ve berî</abbr> <abbr title='%{title}'>%{time}
+      hatiye jêbirin
+    edited_by_html: Ji aliyê %{user} ve berî</abbr> <abbr title='%{title}'>%{time}
+      hatiye sererastkirin
+    closed_by_html: Ji aliyê %{user} ve berî</abbr> <abbr title='%{title}'>%{time}
+      hatiye girtin
+    version: Guherto
+    in_changeset: Qeyda Guhertinan
+    anonymous: anonîm
+    no_comment: (bêşirove)
+    part_of: Perçeyek ji
+    download_xml: XML'ê daxîne
+    view_history: Dîrokê Bibîne
+    view_details: Detayan Bibîne
+    location: 'Cih:'
+    changeset:
+      title: Desteya guhertinanː %{id}
+      belongs_to: Xwedî
+      node: Nuqte (%{count})
+      node_paginated: Nuqte (%{x}-%{y} ji %{count} heban)
+      way: Rê (%{count})
+      way_paginated: Rê (%{x}-%{y} ji %{count})
+      relation: Eleqe (%{count})
+      relation_paginated: Eleqe (%{x}-%{y} bi tevahî %{count})
+      comment: Şîrove (%{count})
+      hidden_commented_by: Şîroveya veşartî yê ji alî %{user} ve, berî</abbr> <abbr
+        title='%{exact_time}'>%{when}
+      commented_by: Şîrove ji aliyê %{user} ve, berî</abbr> <abbr title='%{exact_time}'>%{when}
+      changesetxml: Desteya guhertinan a XML
+      osmchangexml: osmChange XML
+      feed:
+        title: Desteya guhertinan %{id}
+        title_comment: Desteya guhertinan %{id} - %{comment}
+      join_discussion: Ji bo ku beșdarî guftûgoyan bibî têkeve
+      discussion: Gotûbêj
+      still_open: Qeyda guhertinan hê jî vekirî ye - wê gotûbêj piştî ku qeyda guhertinan
+        hate girtin vebibe.
+    node:
+      title: 'Girêk: %{name}'
+      history_title: Dîroka Nuqteyêː %{name}
+    way:
+      title: Rêː %{name}
+      history_title: Dîroka Riyêː %{name}
+      nodes: Nuqte
+      also_part_of:
+        one: parçeya riyê %{related_ways}
+        other: parçeya riyê %{related_ways}
+    relation:
+      title: Eleqeː %{name}
+      history_title: Dîroka Eleqeyêː %{name}
+      members: Endam
+    relation_member:
+      entry_role: '%{type} %{name} bi rola %{role}'
+      type:
+        node: Nuqte
+        way: Rê
+        relation: Eleqe
+    containing_relation:
+      entry: Eleqe %{relation_name}
+      entry_role: Eleqe %{relation_name} (wekî %{relation_role})
+    not_found:
+      sorry: Bibore %{type} a bi nimreya %{id} nehate dîtin.
+      type:
+        node: nuqte
+        way: rê
+        relation: eleqe
+        changeset: qeyda guhertinan
+        note: not
+    timeout:
+      sorry: Li me bibore, anîna daneyên %{type} ji bo anîna %{id}yek demekî zahf
+        dirêj girt.
+      type:
+        node: nuqte
+        way: rê
+        relation: pêwendî
+        changeset: qeyda guhertinan
+        note: not
+    redacted:
+      redaction: Redaksiyon %{id}
+      message_html: Versiyona %{version} ya vê %{type} ji bo ku hatiye redaktekirin
+        em nikarin nîşanî we bidin. Ji bo detayan xêra xwe binêre %{redaction_link}.
+      type:
+        node: nuqte
+        way: rê
+        relation: eleqe
+    start_rjs:
+      feature_warning: '%{num_features} taybetmendî bar dibin, dibe ku ev taybetmendî
+        bikin ku geroka te nikaribe bişixule yan jî hêditir bibe. Tu pê bawerî ku
+        tu dixwazî vê daneyê bibînî?'
+      load_data: Daneyan Bar Bike
+      loading: Tê barkirin...
+    tag_details:
+      tags: Etîket
+      wiki_link:
+        key: Ji bo nîşana %{key} rûpela terîfkirinê ya wîkî'yê
+        tag: Ji bo nîşana %{key}=%{value} rûpela terîfkirinê ya wîkî'yê
+      wikidata_link: Maddeya %{page} a li ser Wîkîdaneyê
+      wikipedia_link: Gotara %{page} ya li ser Wîkîpediyayê
+      telephone_link: Li %{phone_number} bigere
+    note:
+      title: 'Not: %{id}'
+      new_note: Notê Nû
+      description: Danasîn
+      open_title: 'Nota ku nehatiye çarekirin #%{note_name}'
+      closed_title: 'Nota ku hatiye çarekirin #%{note_name}'
+      hidden_title: 'Notê veşartî #%{note_name}'
+      open_by: Ji alî %{user} ve berî</abbr>  <abbr title='%{exact_time}'>%{when}
+        hatiye çêkirin
+      open_by_anonymous: Berî</abbr> <abbr title='%{exact_time}'>%{when} wek anonîm
+        hate çêkirin.
+      commented_by: Şiroveya ji %{user} yê berî</abbr> <abbr title='%{exact_time}'>%{when}
+      commented_by_anonymous: Şîrove ji alî bikarhênerek anonîm ve berî</abbr> <abbr
+        title='%{exact_time}'>%{when}
+      closed_by: Ji aliyê %{user} ve berî</abbr> <abbr title='%{exact_time}'>%{when}
+        hate çareserkirin
+      closed_by_anonymous: Ji aliyê bikarhênerek anonîm ve berî</abbr> <abbr title='%{exact_time}'>%{when}
+        hate çareserkirin
+      reopened_by: Ji aliyê %{user} ve berî</abbr> <abbr title='%{exact_time}'>%{when}
+        ji nû ve hate aktîvkirin
+      reopened_by_anonymous: Ji aliyê bikarhênerek anonîm ve berî</abbr> <abbr title='%{exact_time}'>%{when}
+        ji nû ve hate aktîvkirin
+      hidden_by: Ji aliyê %{user} ve berî</abbr> <abbr title='%{exact_time}'>%{when}
+        hate veşartin
+    query:
+      title: Taybetmendiyan Nîşan Bide
+      introduction: Ji bo ku hûn taybetmendiyên din yên nêzîkî bibînin, bitikînin
+        ser xerîteyê.
+      nearby: Xisûsiyetên nêz
+      enclosing: Taybetmendiyên muhtewa
+  changeset:
+    changeset_paging_nav:
+      showing_page: Rûpel %{page}
+      next: Pêşve »
+      previous: « Yê berê
+    changeset:
+      anonymous: Anonîm
+      no_edits: (nehatiye guhertin)
+      view_changeset_details: Dêtayên qeyda guhertinan bibîne
+    changesets:
+      id: ID
+      saved_at: Dema qeydê
+      user: Bikarhêner
+      comment: Şîrove
+      area: Herêm
+    list:
+      title: Desteya guhertinan
+      title_user: Desteyên guhertinan yên ji alî %{user} ve
+      title_friend: Desteyên guhertinan yên ji alî hevalên te ve
+      title_nearby: Desteyên guhertinan yên ji alî bikarhênerên nêz ve
+      empty: Desteyên guhertinan nehate dîtin.
+      empty_area: Li vê derê desteyên guhertinan tine ne.
+      empty_user: Desteyên guhertinan yên vê bikarhênerê tine.
+      no_more: Desteyên guhertinan zêdetir nehate dîtin.
+      no_more_area: Li vê derê desteyên guhertinan zêdetir tine.
+      no_more_user: Desteyên guhertinan yên vê bikarhênerê zêdetir tine.
+      load_more: Zêdetir bar bike
+    timeout:
+      sorry: Bibore, bidestxistina lîsteya desteyên guhertinan ê ku te xwest demeke
+        dirêj girt.
+    rss:
+      title_all: Gotûbêja qeyda guhertinên OpenStreetMapê
+      title_particular: Gotûbêja qeyda guhertinan a %{changeset_id} yê OpenStreetMapê
+      comment: Şîroveya nû yê li ser qeyda guhertinan a %{changeset_id} yê ji alî
+        %{author} ve
+      commented_at_html: Berî %{when} hate rojanekirin
+      commented_at_by_html: Berî %{when} ji aliyê %{user} ve hate rojanekirin
+      full: Temamiya Gotûbêjê
+  diary_entry:
+    new:
+      title: Nivîsa Nû yê Rojane
+      publish_button: Biweșîne
+    list:
+      title: Rojnivîskên bikarhêneran
+      title_friends: Rojnivîskên hevalan
+      title_nearby: Rojnivîskên Bikarhênerên nêzîk
+      user_title: Rojnivîska %{user}'s
+      in_language_title: Nivîsên Rojane yên bi %{language}
+      new: Nivîsa Nû yê Rojane
+      new_title: Di rojnivîska xwe de nivîsekî nû binivîse
+      no_entries: Nivîsên rojane tine
+      recent_entries: Nivîsên rojane yên dawîn
+      older_entries: Nivîsên Kevintir
+      newer_entries: Nivîsên Nûtir
+    edit:
+      title: Nivîsa rojane sererast bike
+      subject: 'Mijar:'
+      body: Nivîsː
+      language: 'Ziman:'
+      location: 'Cih:'
+      latitude: 'Hêlîpan:'
+      longitude: 'Hêlîlar:'
+      use_map_link: nexşeyê bikarbîne
+      save_button: Tomar bike
+      marker_text: Cihê nivîsên rojane
+    view:
+      title: Rojnivîska %{user} | %{title}
+      user_title: Nivîsên rojane yên %{user}
+      leave_a_comment: Şiroveyeke binivîse
+      login_to_leave_a_comment: Ji bo ku tu şîroveyek binivîsî %{login_link}
+      login: Têkeve
+      save_button: Tomar bike
+    no_such_entry:
+      title: Nivîsekî wisa tine
+      heading: Nivîsekî bi vê nimreyê tineː %{id}
+      body: Li me bibore, li vir bi nimreya %{id} nivîsek yan jî şîroveyek tine. Xêra
+        xwe herfan rast binivîse, an jî belkî lînkê ku te tikandiye nerast be.
+    diary_entry:
+      posted_by: Ji alî %{link_user} ve di %{created} de bi %{language_link} hatiye
+        nivîsîn
+      comment_link: Vê nivîsê şîrove bike
+      reply_link: Cewab bide vê nivîsê
+      comment_count:
+        zero: Bêşîrove
+        one: '%{count} şîrove'
+        other: '%{count} şîrove'
+      edit_link: Vê nivîse biguherîne
+      hide_link: Vê nivîsê biveşêre
+      confirm: Pesend bike
+    diary_comment:
+      comment_from: Şîroveya %{link_user} a %{comment_created_at}
+      hide_link: Vê şiroveyê vebişêre
+      confirm: Pesend bike
+    location:
+      location: 'Cih:'
+      view: Bibîne
+      edit: Biguherîne
+    feed:
+      user:
+        title: Nivîsên rojane yên %{user} a OpenStreetMapê
+        description: Nivîsên rojane ên %{user} yên nû a OpenStreetMapê
+      language:
+        title: Nivîsên rojane yê OpenStreetMapê ên bi %{language_name}
+        description: Nivîsên rojane yên bikarhênerên OpenStreetMapê ên bi %{language_name}
+      all:
+        title: Nivîsên rojane yên OpenStreetMapê
+        description: Nivîsên rojane yên bikarhênerên OpenStreetMapê
+    comments:
+      has_commented_on: '%{display_name} van nivîsên rojane yên li xwarê şirove kir'
+      post: Nivîs
+      when: Kengî
+      comment: Şîrove
+      ago: berî %{ago}
+      newer_comments: Şîroveyên nûtir
+      older_comments: Şîroveyên kevintir
+  export:
+    title: Eksport bike
+    start:
+      area_to_export: Cihê ku wê were eksportkirin
+      manually_select: Bi destê xwe cihekî din bibijêre
+      format_to_export: Awayê eksportkirinê
+      osm_xml_data: Daneyên OpenStreetMapê a bi şiklê XML'yê
+      map_image: Risma Xerîteyê (tebeqeya standart nîşan dide)
+      embeddable_html: HTML'a ku dikare were pêvekirin
+      licence: Lîsans
+      export_details: Daneyên OpenStreetMapê di bin lîsansa <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
+        Data Commons Open Database License</a> (ODbL) hatiye lîsanskirin.
+      too_large:
+        advice: Eger hûn ji yê jor nikaribin eksport bikin, xêra xwe yek ji van çavkaniyên
+          li xwarê a lîstekirî biemilînin.
+        body: Ev der ji bo ku wekî Daneya XML a OpenStreetMapê were eksportkirin zahf
+          mezin e. Xêra xwe hinek jî nêzîk bike an jî qadekî biçûktir bibijêre an
+          jî ji bo daxistina daneyên mezin yek ji van çavkaniyên lîstekirî yên li
+          jêr biemilîne.
+        planet:
+          title: Seyareya OSMê
+          description: Kopiyên daneyên OpenStreetMapê yê ku bi awayekî binîzam têne
+            nûkirin
+        overpass:
+          title: Overpass API
+          description: Vê qutiya sînorkar ji eyneyekî daneya OpenStreetMapê daxîne
+        geofabrik:
+          title: Daxistinên Geofabrikê
+          description: Kurteyên parzemîn, welat û bajarên bijartî yê ku bi awayekî
+            sîstematîk têne nûkirin
+        metro:
+          title: Xulasayê Bajara Mezin
+          description: Xulasayên ji bo bajarên mezin yên dinyayê û derdorê wan bajaran
+        other:
+          title: Çavkaniyên Din
+          description: Çavkaniyên îlawe yên ku li ser wîkiya OpenStreetMapê hatine
+            lîstekirin
+      options: Vebijêrk
+      format: Format
+      scale: Pîvan (miqyas)
+      max: maksîmum
+      image_size: Mezinahiya Rismê
+      zoom: Nêzîk bike
+      add_marker: Nîşankereke îlawe bike xerîteyê
+      latitude: Hêlîpanː
+      longitude: Hêlîlarː
+      output: Encam
+      paste_html: Vê koda HTML'yê dikarî bi ser malperra xwe ve kopî bikî
+      export_button: Eksport bike
+  geocoder:
+    search:
+      title:
+        latlon: Encamên ji <a href="https://openstreetmap.org/"></a>
+        uk_postcode: Netîceyên ji <a href="http://www.npemap.org.uk/"></a>
+        ca_postcode: Netîceyên ji <a href="https://geocoder.ca/"></a>
+        osm_nominatim: Netîceyên ji <a href="https://nominatim.openstreetmap.org/"></a>
+        geonames: Netîceyên ji <a href="http://www.geonames.org/"></a>
+        osm_nominatim_reverse: Netîceyên ji <a href="https://nominatim.openstreetmap.org/"></a>
+        geonames_reverse: Netîceyên ji <a href="http://www.geonames.org/"></a>
+    search_osm_nominatim:
+      prefix:
+        aerialway:
+          cable_car: Teleferîk
+          chair_lift: Teleferîk
+          drag_lift: Teleferîka Şemitînê
+          gondola: Teleferîkên Gondolê
+          platter: Teleferîk
+          pylon: Dîrek / Birc
+          station: Stasyona Teleferîkê
+          t-bar: Teleferîka T-Bar'ê
+        aeroway:
+          aerodrome: Balafirrgeh
+          airstrip: Pîsta ji bo danînê
+          apron: Apron
+          gate: Dergeh
+          hangar: Garaja Teyareyan
+          helipad: Pîsta Helîkopterê
+          holding_position: Cihê sekinandinê ji bo balafiran
+          parking_position: Pozîsyona Parkê
+          runway: Pîsta teyareyê
+          taxiway: Rêya taksiyê
+          terminal: Termînal
+        amenity:
+          animal_shelter: Sitargeha Heywanan
+          arts_centre: Navenda Huneran
+          atm: ATM
+          bank: Bank
+          bar: Bar
+          bbq: Menqel
+          bench: Textebend
+          bicycle_parking: Parka bisiklêtê
+          bicycle_rental: Kirêkirina Bisiklêtê
+          biergarten: Baxçeya Araqê
+          boat_rental: Kirêkirina Şikevê
+          brothel: Kerxane
+          bureau_de_change: Ofîsa Diwîzê
+          bus_station: Stasyona otobêsê
+          cafe: Kafê
+          car_rental: Kirêkirina Erebeyan
+          car_sharing: Parvekirina erebeyê
+          car_wash: Şûştina Erebeyê
+          casino: Kazîno
+          charging_station: Stasyona Şarjê
+          childcare: Çavdêriya Zarokan
+          cinema: Sînema
+          clinic: Klînîk
+          clock: Saet
+          college: Lîse
+          community_centre: Merkeza Civakî
+          courthouse: Edliye
+          crematorium: Krematoryûm (sotingeh)
+          dentist: Doktorê Diranan
+          doctors: Bijîşk
+          drinking_water: Ava Vexwarinê
+          driving_school: Mekteba Ajokeriyê
+          embassy: Konsolxane
+          fast_food: Fast Food
+          ferry_terminal: Termînala Ferîbotê
+          fire_station: Îtfaiye
+          food_court: Cihê xwarinê
+          fountain: Avweşînk
+          fuel: Petrol
+          gambling: Qumarxane
+          grave_yard: Qebristan
+          grit_bin: Qutiya qûm an jî xwêyê
+          hospital: Nexweşxane
+          hunting_stand: Standa nêçîrê
+          ice_cream: Bestenî
+          kindergarten: Zarokxane
+          library: Pirtûkxane
+          marketplace: Cihê Bazarê
+          monastery: Manastir
+          motorcycle_parking: Cihê Parkê yê Motorsiklêtan
+          nightclub: Klûba şevê
+          nursing_home: Aramxane
+          office: Ofîs
+          parking: Otopark
+          parking_entrance: Deriyê Ketinê yê Parkê
+          parking_space: Cihê parkê
+          pharmacy: Îlacxane
+          place_of_worship: Îbadetxane / Perestîşgeh
+          police: Polîs
+          post_box: Qutiya Posteyê
+          post_office: Postexane
+          preschool: Pêşdibistan
+          prison: Girtîgeh
+          pub: Bar
+          public_building: Avahiya Dewletê
+          recycling: Nuqteya Cardin Bikaranînê
+          restaurant: Restorant
+          retirement_home: Xaniya Lênêrînê
+          sauna: Sauna
+          school: Dibistan
+          shelter: Sitare / Cihê Ewle
+          shop: Firoşgeh
+          shower: Dûş
+          social_centre: Merkeza civakî
+          social_club: Klûba sosyal
+          social_facility: Tesîsa civakî
+          studio: Stûdyo
+          swimming_pool: Hewza soberîkirinê
+          taxi: Taksî
+          telephone: Telefon
+          theatre: Şano
+          toilets: Çolik
+          townhall: Bînahiya Şaredariyê
+          university: Zanîngeh
+          vending_machine: Makîneya Firotinê
+          veterinary: Muayenexaneya Veterînerê
+          village_hall: Odeya Gund
+          waste_basket: Sêlika sergoyê
+          waste_disposal: Sêlika avêtiyan
+          water_point: Nuqteya Avê
+          youth_centre: Merkeza gencan
+        boundary:
+          administrative: Sînorê îdarî
+          census: Sînorê Jimartina Nifûsê
+          national_park: Parka Neteweyî
+          protected_area: Erdên Muhafezekirî
+        bridge:
+          aqueduct: Coyê Avê
+          boardwalk: Rêya ji textê
+          suspension: Pira hilawîstî
+          swing: Pira hilawistî
+          viaduct: Viyadûk
+          "yes": Pir
+        building:
+          "yes": Bînahî
+        craft:
+          brewery: Febrîqayê Bîrayê
+          carpenter: Xerat
+          electrician: Ceyranvan
+          gardener: Baxçevan
+          painter: Boyaxker
+          photographer: Fotografkêş
+          plumber: Tesîsatkar
+          shoemaker: Soldir - Solfiroş
+          tailor: Cildirû
+          "yes": Dikana Hunerên Destan
+        emergency:
+          ambulance_station: Stasyona Ambûlansê
+          assembly_point: Cihê Civînê
+          defibrillator: Defîbrîllator
+          landing_site: Cihê Daketinê yê ji bo Rewşa Acîl
+          phone: Telefonê ji bo Rewşa Acîl
+          water_tank: Depoya avê yê ji bo rewşên acîl
+          "yes": Rewşa Acîl
+        highway:
+          abandoned: Riyên Metrûk
+          bridleway: Rêyên hespan
+          bus_guideway: Xeta Rêyên Otobêsan yên Rêberîkirî
+          bus_stop: Rawestgeha Otobêsê
+          construction: Rêya ku tê çêkirin
+          corridor: Korîdor
+          cycleway: Rêya Bisiklêtê
+          elevator: Asansor
+          emergency_access_point: Nuqteya Gihandinê yê ji bo Rewşên Acîl
+          footway: Peyarê (rêya peyadeyan)
+          ford: Bihura Avê
+          give_way: Sînyala "Rê Bide"yê
+          living_street: Kuçeya Heyatê
+          milestone: Nuqteya Werçerxê
+          motorway: Otorê
+          motorway_junction: Terqarêya Otorêyê
+          motorway_link: Rêya Otorêyê
+          passing_place: Cihê derbasbûnê
+          path: Şiverê
+          pedestrian: Rêya peyayan
+          platform: Peron
+          primary: Rêya Sereke
+          primary_link: Rêya Sereke
+          proposed: Rêya Pêşniyarkirî
+          raceway: Pîsta Pêşbaziyê
+          residential: Rêya Cihê Lêmanê
+          rest_area: Cihê Bêhnvedanê
+          road: Rê
+          secondary: Rêya di Dereceya Duyem de
+          secondary_link: Girêdana bi Rêya Dereceya Duyem re
+          service: Rêya Servîsê
+          services: Tesîsên Bêhnvedanê
+          speed_camera: Kameraya Sur'etê
+          steps: Derence
+          stop: Sînyala Seknê
+          street_lamp: Lembeya Kuçeyê
+          tertiary: Rêya di Dereceya Sêyem de
+          tertiary_link: Rêya di Dereceya Sêyem de
+          track: Rêyên ji xweliyê
+          traffic_signals: Sînyalên trafîkê
+          trail: Şop
+          trunk: Rêya serekî
+          trunk_link: Girêdana bi rêya serekî re
+          turning_loop: Çerxa Zivirrînê
+          unclassified: Rêya Nesinifandî
+          "yes": Rê
+        historic:
+          archaeological_site: Cîhê arkeolojîk
+          battlefield: Meydana Herbê
+          boundary_stone: Kevira Hidûdê
+          building: Avahiya dîrokî
+          bunker: Sitare
+          castle: Keleh
+          church: Dêr
+          city_gate: Dergehê bajarê
+          citywalls: Kelheya Bajarê
+          fort: Kelhe
+          heritage: Cihê Bermayiyên Tarîxî
+          house: Xanî
+          icon: Îkon
+          manor: Koşk
+          memorial: Abîde
+          mine: Kana Madenê
+          mine_shaft: Bîra madenê
+          monument: Yadpeyker
+          roman_road: Rêya Romayê
+          ruins: Xerabe
+          stone: Kevir
+          tomb: Qebr
+          tower: Birc
+          wayside_cross: Wayside Cross (Xaçên li kinara rêyê)
+          wayside_shrine: Wayside Shrine (Tirbeyên li kinara rêyê)
+          wreck: Keştiya Binavbûyî
+          "yes": Cihê Dîrokî
+        junction:
+          "yes": Terqarê
+        landuse:
+          allotments: Bax û bostan
+          basin: Hewz
+          brownfield: Erdên Terkkirî
+          cemetery: Goristan
+          commercial: Cihê Xizmetên Ticarî
+          conservation: Erdên Muhafezekirî
+          construction: Înşaet
+          farm: Zevî
+          farmland: Zevî
+          farmyard: Hewşa Çiftligê
+          forest: Daristan
+          garages: Garaj
+          grass: Giya
+          greenfield: Erdê Şûv
+          industrial: Cihê endustriyê
+          landfill: Cihê Veşartina Çopan
+          meadow: Mêrg
+          military: Qada Eskerî
+          mine: Kana Madenê
+          orchard: Baxçeya Fêkiyan
+          quarry: Kana Madenê
+          railway: Rêhesin
+          recreation_ground: Meydana Bêhnvedanê
+          reservoir: Enbara Avê
+          reservoir_watershed: Hewzeya Çemê
+          residential: Cihê îkametê
+          retail: Esnaf (Perakendefiroş)
+          road: Cihê Rêyê
+          village_green: Meydana Şînahiyan
+          vineyard: Rez
+          "yes": Emilandina erdê
+        leisure:
+          beach_resort: Havîngeha li ber Plajê
+          bird_hide: Cihê Çavdêrîkirina Çivîkan
+          common: Erdê umûmî
+          dog_park: Parka Kûçikan
+          firepit: Cihê ji bo şewatê
+          fishing: Cihê masîgirtinê
+          fitness_centre: Navenda Fîtnissê
+          fitness_station: Navenda Sporê
+          garden: Baxçe
+          golf_course: Cihê Golfê
+          horse_riding: Ajotina Hespê
+          ice_rink: Şemitandina li ser cemedê
+          marina: Marîna
+          miniature_golf: Golfa Mînyatûr
+          nature_reserve: Herêma Muhefezekirina Tebîetê
+          park: Park
+          pitch: Sehaya Sporê
+          playground: Lîstikgeha zarokan
+          recreation_ground: Meydana Bêhnvedanê
+          resort: Havîngeh
+          sauna: Saûna
+          slipway: Rêya Şemitandina Qayîkan
+          sports_centre: Navenda Sporê
+          stadium: Stadyûm
+          swimming_pool: Hewza soberîkirinê
+          track: Rêya bazdanê
+          water_park: Parka avê
+          "yes": Wextên vala
+        man_made:
+          adit: Galerî
+          beacon: Fanûsa deryayê
+          beehive: Kewara mozan
+          breakwater: Pêlşkên
+          bridge: Pir
+          bunker_silo: Sitare
+          chimney: Dûkêş
+          crane: Wînç
+          dolphin: Cihê lenger avêtinê
+          dyke: Bendav
+          embankment: Benda erdê
+          flagpole: Stûna alayê
+          lighthouse: Birca Deryayî
+          pipeline: Xeta boriyê
+          tower: Birc
+          works: Fabrîqe
+          "yes": Çêkirina însanan
+        military:
+          airfield: Balafirgeha Eskerî
+          barracks: Eskergeh
+          bunker: Sitare
+        mountain_pass:
+          "yes": Derbasgeha Çiyayan
+        natural:
+          bay: Kendav
+          beach: Plaj
+          cape: Nîvgirav
+          cave_entrance: Deriyê şikeftê
+          cliff: Kendal
+          crater: Zung
+          dune: Girikê ji qûmê
+          fell: Serê çiyayan
+          fjord: Fjord (delavê teng û dirêj)
+          forest: Daristan
+          geyser: Gayzer (kaniyên germavê)
+          glacier: Qeşa
+          grassland: Mêrg
+          heath: Devî
+          hill: Gir
+          island: Girav
+          land: Erd
+          marsh: Çirav
+          moor: Erda Bejî
+          mud: Herrî
+          peak: Lûtke / gir
+          point: Nuqte
+          reef: Resîf
+          ridge: Pişta çiyayê - berpal
+          rock: Zinar
+          saddle: Zîn
+          sand: Xîz
+          scree: Berikên hezazê
+          scrub: Devîstan
+          spring: Kanî
+          stone: Kevir
+          strait: Tengav
+          tree: Dar
+          valley: Newal
+          volcano: Çiyayê agirîn
+          water: Av
+          wetland: Erdê avî
+          wood: Daristan
+        office:
+          accountant: Mihasebekar
+          administrative: Rêveberî
+          architect: Mîmar
+          company: Şirket
+          employment_agency: Saziya Karê
+          estate_agent: Emlaqfiroş
+          government: Daîreya Dewletê
+          insurance: Ofîsa Sîgortayê
+          lawyer: Eboqat
+          ngo: Ofîsa Komeleyên Civata Sivîl
+        place:
+          city: Bajar
+          country: Welat
+          county: Welat
+          house: Xanî
+          houses: Xanî
+          island: Girav
+          region: Herêm
+          sea: Behr
+          state: Eyalet
+          subdivision: Binbeş
+          suburb: Tax / Banliyo
+          town: Bajarok
+          village: Gund
+        shop:
+          bakery: Firrin
+          books: Dikana Firotana Kitêban
+          fashion: Dikana Cil û Bergên Mode
+          fish: Dikana Firotana Masiyan
+          food: Dikana Xwarinê
+          furniture: Mobîlya
+          gallery: Galerî
+          garden_centre: Navenda Tişt û miştên Baxçeyan
+          general: Dikan / Mexeze
+          gift: Dikana Tişt û miştên diyariyê
+          greengrocer: Dikana Şînahiyan
+          grocery: Beqal
+          hairdresser: Kuafor
+          hardware: Xurdefiroş
+          hifi: Dikana Cîhazên Hi-Fi
+          jewelry: Gewherfiroş
+          kiosk: Kîosk (Dikanên biçûk)
+          laundry: Cihê Cilşûştinê
+          mall: Mexezeyên Mezin
+          massage: Masaj
+          music: Dikanên muzîkê
+          newsagent: Bayiya Rojnameyan
+          optician: Berçavkvan
+          pharmacy: Dermanxane
+        tourism:
+          hotel: Hotel
+          information: Agahî
+          zoo: Baxçeyê heywanan
+    results:
+      no_results: Ti encam nehatin dîtin
+      more_results: Encamên zêdetir
+  layouts:
+    logo:
+      alt_text: Logoya OpenStreetMapê
+    home: Here Cihê Mala Xwe
+    logout: Derkeve
+    log_in: Têkeve
+    log_in_tooltip: Bi hesabê xwe yê heyî têkeve
+    sign_up: Xwe Qeyd Bike
+    start_mapping: Dest bi çêkirina nexşeyan bike
+    sign_up_tooltip: Ji bo ku tu guherandinan bikî hesabek çêbike
+    edit: Biguherîne
+    history: Dîrok
+    export: Eksport bike
+    data: Dane
+    gps_traces: Şopên GPS'ê
+    gps_traces_tooltip: Şopên GPS'ê îdare bike
+    user_diaries: Rojnivîskên bikarhênerê
+    user_diaries_tooltip: Rojnivîskên bikarhênerê bibîne
+    edit_with: Bi %{editor} sererast bike
+    tag_line: Xerîteya Dinyayê a Wîkiya Azad
+    intro_header: Tu bi xêr hatî OpenStreetMapêǃ
+    intro_text: OpenStreetMap xerîteyekî dinyayê ye ku ji aliyê kesên wek te ve tê
+      çêkirin û emilandina we belaş e û di bin lîsansa azad de ye.
+    intro_2_create_account: Ji xwe re hesabekî çêbike
+    partners_html: Pêşkêşkirina bernameyê ji alî %{ucl}, %{bytemark}, %{ic} û %{partners}
+      ve tê piştgirîkirin.
+    partners_ucl: University College London
+    partners_ic: Imperial College London
+    partners_bytemark: Bytemark Hosting
+    partners_partners: şirîkên me
+    help: Alîkarî
+    about: Derbar
+    copyright: Mafê Telîfê
+    community: Civak
+    community_blogs: Blogên Civakê
+    community_blogs_title: Blogên endamên civaka OpenStreetMapê
+    foundation: Weqif
+    foundation_title: Weqfa OpenStreetMapê
+    make_a_donation:
+      title: Bi bexşa pereyê hûn dikarin piştgiriyê bidin OpenStreetMapê
+      text: Bexş bike
+    learn_more: Zêdetir Hîn Bibe
+    more: Zêdetir
+  license_page:
+    foreign:
+      title: Derbarê vê wergerê de
+    native:
+      title: Der barê vê rûpelê
+      mapping_link: dest bi çêkirina nexşeyan bike
+    legal_babble:
+      title_html: Mafê Telîfê û Lîsans
+      contributors_title_html: Beşdarên me
+  welcome_page:
+    title: Tu bi xêr hatî!
+    rules:
+      title: Qaîdeyên vêǃ
+    questions:
+      title: Pirsekî te heye?
+  help_page:
+    welcome:
+      title: Bi xêr hatî OSM'ê
+    forums:
+      title: Forum
+  about_page:
+    next: Pêşve
+    legal_title: Zagonî
+  notifier:
+    diary_comment_notification:
+      hi: Silav %{to_user},
+    message_notification:
+      hi: Merheba %{to_user},
+    friend_notification:
+      hi: Merheba %{to_user},
+    gpx_notification:
+      greeting: Silav,
+    email_confirm_plain:
+      greeting: Silav,
+    email_confirm_html:
+      greeting: Silav,
+    lost_password_plain:
+      greeting: Silav,
+    lost_password_html:
+      greeting: Silav,
+    note_comment_notification:
+      greeting: Merheba,
+    changeset_comment_notification:
+      hi: Merheba %{to_user},
+      greeting: Merheba,
+  message:
+    inbox:
+      from: Ji
+      date: Dîrok
+    message_summary:
+      unread_button: Wek nexwendî nîşan bide
+      read_button: Wek xwendî nîşan bide
+      reply_button: Cewab bide
+      delete_button: Jê bibe
+    new:
+      title: Peyamê bişîne
+      send_message_to: Ji %{name} re peyamekî nû bişîne
+      subject: Mijar
+      body: Nivîs
+      send_button: Bişîne
+    no_such_message:
+      title: Mesajek wek vê tine ye
+      heading: Mesajek wek vê tine ye
+    outbox:
+      to: Ji bo
+      subject: Mijar
+      date: Dîrok
+    read:
+      title: Peyamê bixwîne
+      from: Ji
+      subject: Mijar
+      date: Dem
+      reply_button: Bersiv bide
+      unread_button: Wek nexwendî nîşan bide
+      delete_button: Jê bibe
+      back: Paşve vegere
+      to: Ji bo
+    sent_message_summary:
+      delete_button: Jê bibe
+    mark:
+      as_read: Peyam wek xwendî hate nîşankirin
+      as_unread: Peyam wek nexwendî hate nîşankirin
+    delete:
+      deleted: Payam hate jêbirin
+  site:
+    index:
+      createnote: Notek binivîse
+    edit:
+      user_page_link: rûpela bikarhêner
+    sidebar:
+      close: Bigire
+    search:
+      search: Lêbigere
+      where_am_i: Ev li ku ye?
+      submit_text: Here
+    key:
+      table:
+        entry:
+          cemetery: Gorristan
+          school:
+          - Dibistan
+    richtext_area:
+      edit: Biguherîne
+      preview: Pêşdîtin
+    markdown_help:
+      link: Girêdan
+      text: Nivîs
+      image: Wêne
+      url: URL
+  trace:
+    edit:
+      edit: biguherîne
+      owner: 'Xweyî:'
+      description: 'Danasîn:'
+      tags: Etîketː
+    trace_form:
+      description: 'Danasîn:'
+      visibility_help: Ev tê çi wateyê?
+      upload_button: Bar bike
+      help: Alîkarî
+    view:
+      edit: biguherîne
+      owner: 'Xweyî:'
+      description: 'Danasîn:'
+    trace:
+      edit: biguherîne
+      edit_map: Nexşeyê biguherîne
+      in: di
+  oauth_clients:
+    edit:
+      submit: Biguherîne
+    form:
+      name: Nav
+  user:
+    login:
+      password: 'Şîfre:'
+      remember: Min bi bîr bîne
+      lost password link: Te şîfreya xwe winda kir?
+      login_button: Têkeve
+      register now: Vê gavê xwe qeyd bike
+      with username: Gelo jixwe hesabekî te heye? Eger hebe, xêra xwe navê xwe yê
+        bikarhêneriyê û şîfreya xwe binivîse û têkeveː
+      with external: Wek alternatîv, ji bo têketinê yek ji van sepanan bi kar bîneː
+      new to osm: Tu di OpenStreetMapê de nû yî?
+      auth_providers:
+        openid:
+          title: Bi OpenID'yê têkeve
+        google:
+          title: Bi Google têkeve
+        facebook:
+          title: Bi Facebookê têkeve
+          alt: Bi hesabekî Facebookê têkeve
+        windowslive:
+          title: Bi Windows Live'ê têkeve
+          alt: Bi hesabê xwe yê Windows Liveê têkeve
+        github:
+          title: Bi GitHub'ê têkeve
+        wikipedia:
+          title: Bi Wîkîpediyayê têkeve
+          alt: Bi hesabekî Wîkîpediyayê têkeve
+        yahoo:
+          title: Bi Yahooyê têkeve
+        wordpress:
+          title: Bi Wordpressê têkeve
+        aol:
+          title: Bi AOL'ê têkeve
+    logout:
+      title: Derkeve
+      heading: Ji OpenStreetMapê derkeve
+      logout_button: Derkeve
+    reset_password:
+      password: 'Şîfre:'
+      flash changed: Şîfreya te hate guhertin.
+    new:
+      title: Xwe Qeyd Bike
+      password: Şîfre
+    terms:
+      consider_pd_why: Ev çi ye?
+      legale_names:
+        france: Frensa
+        italy: Îtalya
+    view:
+      my diary: Rojnivîska min
+      my edits: Guhertinên min
+      my traces: Şopên min
+      my notes: Notên min
+      my messages: Peyamên min
+      my profile: Profîla min
+      my settings: Eyarên min
+      my comments: Şîroveyên min
+      status: 'Rewş:'
+      description: Danasîn
+      your friends: Hevalên te
+      comments: Şîrove
+      unhide_user: Vi bikarhênerî nîşan bide
+      delete_user: Vî/ê bikarhênerî/ê jê bibe
+    popup:
+      your location: Cihê te
+      friend: Heval
+    account:
+      openid:
+        link text: Ev çi ye?
+      public editing:
+        enabled link text: Ev çiye?
+        disabled link text: Ez çima nikarim biguherînim?
+      contributor terms:
+        link text: Ev çi ye?
+      image: 'Wêne:'
+    confirm_resend:
+      failure: Bikarhêner %{name} nehate dîtin.
+    list:
+      title: Bikarhêner
+      heading: Bikarhêner
+  user_block:
+    partial:
+      edit: Biguherîne
+      showing_page: Rûpel %{page}
+    show:
+      status: Rewş
+      show: nîşan bide
+      edit: Biguherîne
+      reason: 'Sedema astengkirinê:'
+  note:
+    entry:
+      comment: Şîrove
+  javascripts:
+    share:
+      link: Girêdan an jî HTML
+    changesets:
+      show:
+        comment: Şîrove
+    notes:
+      show:
+        comment: Şîrove
+  redaction:
+    edit:
+      description: Danasîn
+    show:
+      description: 'Danasîn:'
+...
index f26ff0c19bf6ec0c3b682e6fd803805e02aac38d..4e1aeaf0fd50c3eda72d006541a754485eff0ed8 100644 (file)
@@ -265,19 +265,21 @@ lb:
   geocoder:
     search:
       title:
-        latlon: Resultater vun <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Resultater vun <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Resultater vun <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultater vu <a href="http://geocoder.ca/">Geocoder.ca</a>
+        ca_postcode: Resultater vu <a href="https://geocoder.ca/">Geocoder.ca</a>
         geonames: Resultater vu <a href="http://www.geonames.org/">GeoNames</a>
         geonames_reverse: Resultater vun <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
       prefix:
         aerialway:
           cable_car: Kabelwon
+          pylon: Mast
         aeroway:
           aerodrome: Fluchhafen
           gate: Paart
+          hangar: Hangar
           helipad: Helikopterlandeplaz
           runway: Start- a Landepist
           terminal: Terminal
@@ -305,27 +307,22 @@ lb:
           crematorium: Crematoire
           dentist: Zänndokter
           doctors: Dokteren
-          dormitory: Studentewunnengen
           drinking_water: Drénkwaasser
           driving_school: Fahrschoul
           embassy: Ambassade
-          emergency_phone: Noutruff-Telefon
-          fire_hydrant: Hydrant
           fire_station: Pompjeeën
           fountain: Sprangbur
           fuel: Benzin
           grave_yard: Kiirfecht
-          gym: Fitnessstudio
           hospital: Klinik
           ice_cream: Glace
           kindergarten: Spillschoul
           library: Bibliothéik
-          market: Maart
           marketplace: Maartplaz
           monastery: Klouschter
-          nursery: Crèche
           office: Büro
           parking: Parking
+          parking_space: Parkplaz(en)
           pharmacy: Apdikt
           police: Police
           post_box: Bréifboîte
@@ -334,7 +331,6 @@ lb:
           prison: Prisong
           pub: Bistro
           public_building: Ëffentlecht Gebai
-          reception_area: Rezeptiounsberäich
           recycling: Recycling-Center
           restaurant: Restaurant
           retirement_home: Altersheim
@@ -376,6 +372,7 @@ lb:
         emergency:
           defibrillator: Defibrillator
           phone: Noutruff-Telefon
+          "yes": Urgence
         highway:
           bridleway: Wee fir Päerd
           bus_guideway: Busspur
@@ -397,6 +394,7 @@ lb:
           secondary_link: Niewestrooss
           speed_camera: Radar fir d'Vitesse ze moossen
           steps: Trap
+          stop: Stoppschëld
           street_lamp: Stroosseluucht
           tertiary: Kleng Strooss
           "yes": Strooss
@@ -419,6 +417,7 @@ lb:
           tomb: Graf
           tower: Tuerm
           wreck: Wrack
+          "yes": Historesch Plaz
         junction:
           "yes": Kräizung
         landuse:
@@ -438,7 +437,6 @@ lb:
           residential: Wunngéigend
           vineyard: Wéngert
         leisure:
-          club: Club
           garden: Gaart
           golf_course: Golfterrain
           ice_rink: Äispist
@@ -452,14 +450,25 @@ lb:
           swimming_pool: Schwämm
           "yes": Fräizäit
         man_made:
+          bridge: Bréck
+          bunker_silo: Bunker
+          chimney: Kamäin
+          crane: Kran
+          gasometer: Gasometer
           lighthouse: Liichttuerm
+          mast: Mast
+          mine: Minn
           pipeline: Pipeline
+          surveillance: Iwwerwaachung
           tower: Tuerm
+          water_well: Buer
+          windmill: Wandmillen
           works: Fabrik
         military:
           airfield: Militärfluchhafen
           barracks: Kasär
           bunker: Bunker
+          "yes": Militär
         mountain_pass:
           "yes": Pass an de Bierger
         natural:
@@ -497,8 +506,6 @@ lb:
           travel_agent: Reesbüro
           "yes": Büro
         place:
-          block: Block
-          airport: Fluchhafen
           city: Stad
           country: Land
           county: Bezierk
@@ -508,12 +515,13 @@ lb:
           island: Insel
           islet: Insel
           locality: Plaz
-          moor: Mouer
           municipality: Gemeng
           neighbourhood: Noperschaft
           postcode: Postcode
+          quarter: Quartier
           region: Regioun
           sea: Mier
+          square: Plaz
           subdivision: Ënnerdeelung
           town: Stad
           village: Duerf
@@ -522,7 +530,6 @@ lb:
           abandoned: Fréier Eisebunn
           construction: Eisebunn (am Bau)
           disused: Fréier Eisebunn
-          historic_station: Historesch Eisebunnsstatioun
           junction: Eisebunnskräizung
           miniature: Miniatur-Eisebunn
           platform: Zuchquai
@@ -552,15 +559,17 @@ lb:
           furniture: Miwwelgeschäft
           gallery: Galerie
           hairdresser: Coiffeur
-          insurance: Versécherungsbüro
           jewelry: Bijouterie
           laundry: Botzerei
+          lottery: Lotterie
           market: Maart
+          massage: Massage
           music: Museksgeschäft
           optician: Optiker
           pet: Déierebuttek
           pharmacy: Apdikt
           photo: Fotosgeschäft
+          seafood: Mieresfriichten
           second_hand: Secondhand-Geschäft
           shoes: Schonggeschäft
           sports: Sportsgeschäft
@@ -652,7 +661,7 @@ lb:
     questions:
       title: Nach Froen?
     add_a_note:
-      title: Keng Zäit fir z'änneren? Setzt eng Notiz derbäi!
+      title: Keng Zäit fir z'änneren? Setzt eng Notiz dobäi!
   fixthemap:
     title: E Problem mellen / D'Kaart verbesseren
     how_to_help:
@@ -667,7 +676,7 @@ lb:
       url: /welcome
       title: Wëllkomm bäi OSM
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: Guide fir nei Benotzer
     help:
       url: https://help.openstreetmap.org/
@@ -681,7 +690,7 @@ lb:
     irc:
       title: IRC
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
   about_page:
     next: Weider
@@ -698,9 +707,9 @@ lb:
         äntwerten
     friend_notification:
       hi: Salut %{to_user},
-      had_added_you: '%{user} hat Iech als Frënd op OpenStrett Maap derbäigesat.'
+      had_added_you: '%{user} hat Iech als Frënd op OpenStreet Map dobäigesat.'
       see_their_profile: Dir kënnt säin/hire Profil op %{userurl} kucken.
-      befriend_them: Dir kënnt hien/si och als Frënd op %{befriendurl} derbäisetzen.
+      befriend_them: Dir kënnt hien/si och als Frënd op %{befriendurl} dobäisetzen.
     gpx_notification:
       greeting: Salut,
       your_gpx_file: Et gesäit aus wéi Äre GPX-Fichier
@@ -784,7 +793,7 @@ lb:
     index:
       js_1: Dir hutt entweder e Browser dee JavaScript net ënnerstëtzt oder Dir hutt
         JavaScript desaktivéiert.
-      createnote: Eng Notiz derbäisetzen
+      createnote: Eng Notiz dobäisetzen
     edit:
       not_public: Dir hutt net agestallt datt Är Ännerungen ëffentlech sinn.
       user_page_link: Benotzersäit
@@ -998,7 +1007,7 @@ lb:
       email address: 'E-Mail-Adress:'
       confirm email address: 'E-Mail-Adress confirméieren:'
       not displayed publicly: Är Adress gëtt net ëffentlech gewisen, kuckt eis <a
-        href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy
+        href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF privacy
         policy including section on email addresses">Dateschutzrichtlinn</a> fir méi
         Informatiounen
       display name: Numm weisen
@@ -1030,7 +1039,7 @@ lb:
       edits: Ännerungen
       notes: Notizen op der Kaart
       remove as friend: Frënd ewechhuelen
-      add as friend: Frënd derbäisetzen
+      add as friend: Frënd dobäisetzen
       ago: (viru(n) %{time_in_words_ago})
       ct accepted: Viru(n) %{ago} akzeptéert
       latest edit: 'Lescht Ännerung %{ago}:'
@@ -1039,7 +1048,7 @@ lb:
       description: Beschreiwung
       settings_link_text: Astellungen
       your friends: Är Frënn
-      no friends: Dir hutt nach keng Frënn derbäi gesat.
+      no friends: Dir hutt nach keng Frënn dobäi gesat.
       km away: '%{count} km ewech'
       m away: '%{count} m ewech'
       nearby users: Aner Benotzer nobäi
@@ -1071,7 +1080,7 @@ lb:
       new email address: 'Nei E-Mail-Adress:'
       email never displayed publicly: (ni ëffentlech gewisen)
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: wat ass dat?
       public editing:
         enabled link text: wat ass dëst?
@@ -1085,7 +1094,7 @@ lb:
         link text: wat ass dat?
         disabled: Gravatar gouf desaktivéiert.
         enabled: D'Weise vun Ärem Gravatar gouf aktivéiert.
-      new image: E Bild derbäisetzen
+      new image: E Bild dobäisetzen
       keep image: Dat aktuellt Bild behalen
       delete image: Dat aktuellt Bild ewechhuelen
       replace image: Dat aktuellt Bild ersetzen
@@ -1110,10 +1119,10 @@ lb:
     go_public:
       flash success: All Är Ännerunge sinn elo ëffentlech, an Dir däerft elo änneren.
     make_friend:
-      heading: '%{user} als Frënd derbäisetzen?'
-      button: Als Frënd derbäisetzen
+      heading: '%{user} als Frënd dobäisetzen?'
+      button: Als Frënd dobäisetzen
       success: '%{name} ass elo Äre Frënd!'
-      failed: Pardon, %{name} konnt net als Frënd derbäigesat ginn.
+      failed: Pardon, %{name} konnt net als Frënd dobäigesat ginn.
       already_a_friend: Dir sidd schonn de Frënd vum %{name}.
     remove_friend:
       success: '%{name} gouf als Äre Frënd ewechgeholl.'
@@ -1141,6 +1150,8 @@ lb:
       not_a_role: D'Zeechen '%{role}' ass keng valabel Roll.
       already_has_role: De Benotzer huet d'Roll %{role} schonn.
       doesnt_have_role: De Benotzer huet d'Roll %{role} net.
+      not_revoke_admin_current_user: Et ass net méiglech dem Aktuelle Benotzer d'Administrateursrechter
+        ewechzehuelen.
     grant:
       title: Confirméiert d'Zoudeele vun der Roll
       heading: Confirméiert d'Zoudeele vun der Roll
@@ -1249,7 +1260,7 @@ lb:
         unhide_comment: nees weisen
     notes:
       new:
-        add: Notiz derbäisetzen
+        add: Notiz dobäisetzen
       show:
         hide: Verstoppen
         resolve: Léisen
@@ -1257,8 +1268,6 @@ lb:
         comment: Bemierkung
     directions:
       ascend: Vu kleng op grouss
-      engines:
-        mapzen_bicycle: Vëlo (Mapzen)
       descend: Vu grouss op kleng
       directions: Richtungen
       distance: Distanz
index 54e773e15eddff7e80b5034ef4c3ec8bc3bc0178..2be15a6c9880a4f53bc30fa80d60298110c8f490 100644 (file)
@@ -450,33 +450,26 @@ lt:
           crematorium: Krematoriumas
           dentist: Dantistas
           doctors: Gydytojai
-          dormitory: Bendrabutis
           drinking_water: Geriamas vanduo
           driving_school: Vairavimo mokykla
           embassy: Ambasada
-          emergency_phone: Pagalbos telefonas
           fast_food: Greitas maistas
           ferry_terminal: Keltų terminalas
-          fire_hydrant: Hidrantas
           fire_station: Gaisrinė
           food_court: Savitarnos kavinė
           fountain: Fontanas
           fuel: Degalinė
           gambling: Lošimas
           grave_yard: Kapinės
-          gym: Sveikatingumo centras / sporto salė
-          health_centre: Sveikatingumo centras
           hospital: Ligoninė
           hunting_stand: Medžiotojų bokštelis
           ice_cream: Ledai
           kindergarten: Vaikų darželis
           library: Biblioteka
-          market: Turgus
           marketplace: Turgavietė
           monastery: Vienuolynas
           motorcycle_parking: Motociklų stovėjimo aikštelė
           nightclub: Naktinis klubas
-          nursery: Seselės kabinetas
           nursing_home: Slaugos namai
           office: Biuras
           parking: Stovėjimo aikštelė
@@ -490,7 +483,6 @@ lt:
           prison: Kalėjimas
           pub: Aludė
           public_building: Visuomeninis pastatas
-          reception_area: Priėmimo zona
           recycling: Perdirbimo punktas
           restaurant: Restoranas
           retirement_home: Senelių namai
@@ -586,7 +578,6 @@ lt:
           trunk: Magistralinis kelias
           trunk_link: Magistralinis kelias
           unclassified: Neklasifikuotas kelias
-          unsurfaced: Kelias be dangos
           "yes": Kelias
         historic:
           archaeological_site: Archeologinė vieta
@@ -651,7 +642,6 @@ lt:
         leisure:
           beach_resort: Pajūrio kurortas
           bird_hide: paukščių stebėjimo vieta
-          club: Klubas
           common: Bendra žemė
           dog_park: Šunų parkas
           fishing: Žvejybos zona
@@ -744,8 +734,6 @@ lt:
           "yes": Biuras
         place:
           allotments: Kolektyviniai sodai
-          block: Blokas
-          airport: Oro uostas
           city: Miestas
           country: Šalis
           county: Apskritis
@@ -757,7 +745,6 @@ lt:
           islet: Salelė
           isolated_dwelling: Vienkiemis
           locality: Vietovė
-          moor: Dažnai užliejama vieta
           municipality: Savivaldybė
           neighbourhood: Rajonas
           postcode: Pašto kodas
@@ -774,10 +761,8 @@ lt:
           abandoned: Apleistas geležinkelis
           construction: Statomas geležinkelis
           disused: Nebenaudojamas geležinkelis
-          disused_station: Nebenaudojama geležinkelio stotis
           funicular: Funikulierius
           halt: Traukinio Stotelė
-          historic_station: Istorinė geležinkelio stotis
           junction: Geležinkelio mazgas
           level_crossing: Pervaža
           light_rail: Lengvasis geležinkelis
@@ -841,7 +826,6 @@ lt:
           hairdresser: Kirpykla
           hardware: Aparatūros parduotuvė
           hifi: Hi-Fi
-          insurance: Draudimas
           jewelry: Juvelyrikos parduotuvė
           kiosk: Kioskas
           laundry: Skalbykla
@@ -857,10 +841,8 @@ lt:
           pet: Naminių gyvūnėlių parduotuvė
           pharmacy: Vaistinė
           photo: Foto prekių parduotuvė
-          salon: Salonas
           second_hand: Dėvėtų parduotuvė
           shoes: Batų parduotuvė
-          shopping_centre: Prekybos centras
           sports: Sporto prekių parduotuvė
           stationery: Raštinės reikmenys
           supermarket: Prekybos centras
@@ -2360,9 +2342,6 @@ lt:
         mapquest_car: Mašina (MapQuest)
         mapquest_foot: Pėsčiomis (MapQuest)
         osrm_car: Mašina (OSRM)
-        mapzen_bicycle: Dviratis (Mapzen)
-        mapzen_car: Automobilis (Mapzen)
-        mapzen_foot: Pėda (Mapzen)
       directions: Nurodymai
       distance: Atstumas
       errors:
index b460ef4f9c36aa54ba9e45ce67ae6ed829474dfd..48d7e21fa823b6c6529153016f21485a6d776b33 100644 (file)
@@ -412,6 +412,7 @@ lv:
           aerodrome: Lidlauks
           apron: Perons
           gate: Vārti
+          hangar: Angārs
           helipad: Helikopteru nolaišanās laukums
           runway: Skrejceļš
           taxiway: Manevrēšanas ceļš
@@ -447,33 +448,26 @@ lv:
           crematorium: Krematorija
           dentist: Zobārsts
           doctors: Ārsti
-          dormitory: Kopmītnes
           drinking_water: Dzeramais ūdens
           driving_school: Braukšanas skola
           embassy: Vēstniecība
-          emergency_phone: Avārijas telefons
           fast_food: Bistro
           ferry_terminal: Prāmju termināls
-          fire_hydrant: Hidrants
           fire_station: Ugunsdzēsēju depo
           food_court: Ēstuves
           fountain: Strūklaka
           fuel: Degviela
           gambling: Azartspēles
           grave_yard: Kapsēta
-          gym: Fitnesa centrs / Sporta zāle
-          health_centre: Veselības centrs
           hospital: Slimnīca
           hunting_stand: Medību tornis
           ice_cream: Saldējums
           kindergarten: Bērnudārzs
           library: Bibliotēka
-          market: Tirgus
           marketplace: Tirgus
           monastery: Klosteris
           motorcycle_parking: Motociklu stāvvieta
           nightclub: Naktsklubs
-          nursery: Pirmsskolas mācību iestāde
           nursing_home: Pansionāts
           office: Birojs
           parking: Autostāvvieta
@@ -487,7 +481,6 @@ lv:
           prison: Cietums
           pub: Krogs
           public_building: Sabiedriskā ēka
-          reception_area: Uzņemšanas zona
           recycling: Pārstrādes punkts
           restaurant: Restorāns
           retirement_home: Pansionāts
@@ -583,7 +576,6 @@ lv:
           trunk: Maģistrālais ceļš
           trunk_link: Maģistrālais ceļš
           unclassified: Neklasificēts ceļš
-          unsurfaced: Ceļš bez seguma
           "yes": Ceļš
         historic:
           archaeological_site: Arheoloģisku izrakumu vieta
@@ -648,7 +640,6 @@ lv:
         leisure:
           beach_resort: Pludmales kūrorts
           bird_hide: Putnu Slēptuve
-          club: Klubs
           common: Koplietošanas zeme
           dog_park: Suņu laukums
           fishing: Zvejas apgabals
@@ -675,6 +666,8 @@ lv:
           water_park: Ūdens atrakciju parks
           "yes": Atpūtas vieta
         man_made:
+          beehive: Bišu strops
+          chimney: Skurstenis
           lighthouse: Bāka
           pipeline: Cauruļvads
           tower: Tornis
@@ -741,8 +734,6 @@ lv:
           "yes": Birojs
         place:
           allotments: Mazdārziņi
-          block: Bloks
-          airport: Lidosta
           city: Pilsēta
           country: Valsts
           county: Apgabals
@@ -754,7 +745,6 @@ lv:
           islet: Saliņa
           isolated_dwelling: Izolēta Mājvieta
           locality: Vieta
-          moor: Tīrelis
           municipality: Pašvaldība
           neighbourhood: Pilsētas rajons
           postcode: Pasta indekss
@@ -771,10 +761,8 @@ lv:
           abandoned: Pamests dzelzceļš
           construction: Dzelzceļš būvniecības stadijā
           disused: Nelietots dzelzceļš
-          disused_station: Nelietota dzelzceļa stacija
           funicular: Trošu dzelzceļš
           halt: Vilciena pietura
-          historic_station: Vēsturiska dzelzceļa stacija
           junction: Dzelzceļa mezgls
           level_crossing: Vienlīmeņa kurstojums
           light_rail: Tramvaja sliedes
@@ -838,7 +826,6 @@ lv:
           hairdresser: Frizētava
           hardware: Saimniecības veikals
           hifi: Hi-Fi
-          insurance: Apdrošināšana
           jewelry: Juvelierizstrādājumu veikals
           kiosk: Kiosks
           laundry: Veļas mazgātava
@@ -854,10 +841,8 @@ lv:
           pet: Zooveikals
           pharmacy: Aptieka
           photo: Fotoveikals
-          salon: Salons
           second_hand: Lietoto preču veikals
           shoes: Apavu veikals
-          shopping_centre: Iepirkšanās centrs
           sports: Sporta veikals
           stationery: Kancelejas preču veikals
           supermarket: Lielveikals
@@ -865,7 +850,7 @@ lv:
           toys: Rotaļlietu veikals
           travel_agency: Tūrisma aģentūra
           video: Video veikals
-          wine: Alkohola Veikals
+          wine: Vīna veikals
           "yes": Veikals
         tourism:
           alpine_hut: Kalnu būda
@@ -2355,9 +2340,6 @@ lv:
         mapquest_car: Ar mašīnu (MapQuest)
         mapquest_foot: Ar kājām (MapQuest)
         osrm_car: Ar mašīnu (OSRM)
-        mapzen_bicycle: Ar velosipēdu (Mapzen)
-        mapzen_car: Ar mašīnu (Mapzen)
-        mapzen_foot: Ar kājām (Mapzen)
       directions: Norādes
       distance: Attālums
       errors:
@@ -2402,6 +2384,11 @@ lv:
       nothing_found: Nav atrastas iespējas
       error: 'Kļūda sazinoties ar %{server}: %{error}'
       timeout: Saskares laiks pārsniedza %{server}
+    context:
+      directions_from: Norādes no šejienes
+      directions_to: Norādes uz šejieni
+      add_note: Pievienot piezīmi šeit
+      show_address: Rādīt adresi
   redaction:
     edit:
       description: Apraksts
index c376d0cb6df007a6150babe1624c79059668ef50..9d8e0ec8c90cab90a65d3945447a0b8b4f3c258f 100644 (file)
@@ -135,6 +135,8 @@ mk:
         title_comment: Измени %{id} - %{comment}
       join_discussion: Најавете се за да се приклучите во разговорот
       discussion: Разговор
+      still_open: Измените сè уште се отворени — разговорот ќе се отвори штом ќе се
+        затворат измените.
     node:
       title: 'Јазол: %{name}'
       history_title: 'Историја на јазолот: %{name}'
@@ -342,7 +344,7 @@ mk:
       map_image: Слика на картата (прикажува стандарден слој)
       embeddable_html: HTML-код за вметнување
       licence: Лиценца
-      export_details: Податоците на OpenStreetMap се нудат под <a href="http://opendatacommons.org/licenses/odbl/1.0/">Лиценцата
+      export_details: Податоците на OpenStreetMap се нудат под <a href="https://opendatacommons.org/licenses/odbl/1.0/">Лиценцата
         за отворени бази на Складиштето на отворени податоци</a> (ODbL, Open Data
         Commons Open Database License).
       too_large:
@@ -382,14 +384,14 @@ mk:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">Внатрешни</a> исходни ставки
+        latlon: <a href="https://openstreetmap.org/">Внатрешни</a> исходни ставки
         uk_postcode: Исход од <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Исход од <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Исход од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Исход од <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Исход од <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Исход од <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Исход од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Исход од <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Исход од <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -399,12 +401,19 @@ mk:
           chair_lift: Клупна жичница
           drag_lift: Влечна жичница
           gondola: Кабинска жичница
+          platter: Скилифт
+          pylon: Жичен јарбол
           station: Гондолска станица
+          t-bar: Влечен лифт
         aeroway:
           aerodrome: Аеродром
+          airstrip: Леталиште
           apron: Рампа
           gate: Порта
+          hangar: Хангар
           helipad: Хелиодром
+          holding_position: Задржна положба
+          parking_position: Оставна положба
           runway: Писта
           taxiway: Рулажна патека
           terminal: Терминал
@@ -439,37 +448,32 @@ mk:
           crematorium: Крематориум
           dentist: Забар
           doctors: Доктори
-          dormitory: Студентски дом
           drinking_water: Пивка вода
           driving_school: Автошкола
           embassy: Амбасада
-          emergency_phone: Итен телефон
           fast_food: Брза храна
           ferry_terminal: Траектска станица
-          fire_hydrant: Противпожарен хидрант
           fire_station: Пожарна
           food_court: Штандови за брза храна
           fountain: Фонтана
           fuel: Гориво
           gambling: Коцкање
           grave_yard: Гробишта
-          gym: Фитнес/вежбалница
-          health_centre: Здравствен центар
+          grit_bin: Пескарница
           hospital: Болница
           hunting_stand: Ловечка кула
           ice_cream: Сладолед
           kindergarten: Градинка
           library: Библиотека
-          market: Пазар
           marketplace: Пазариште
           monastery: Манастир
           motorcycle_parking: Паркиралиште за мотоцикли
           nightclub: Ноќен клуб
-          nursery: Јасли
           nursing_home: Старечки дом
           office: Канцеларија
           parking: Паркиралиште
           parking_entrance: Влез во паркиралиште
+          parking_space: Паркинг-место
           pharmacy: Аптека
           place_of_worship: Верски објект
           police: Полиција
@@ -479,7 +483,6 @@ mk:
           prison: Затвор
           pub: Пивница
           public_building: Јавен објект
-          reception_area: Рецепција
           recycling: Рециклирање
           restaurant: Ресторан
           retirement_home: Старечки дом
@@ -504,6 +507,7 @@ mk:
           village_hall: Месна заедница
           waste_basket: Корпа за отпадоци
           waste_disposal: Депонија
+          water_point: Водоводен приклучок
           youth_centre: Младински центар
         boundary:
           administrative: Административна граница
@@ -512,6 +516,7 @@ mk:
           protected_area: Заштитено подрачје
         bridge:
           aqueduct: Аквадукт
+          boardwalk: Шеталиште
           suspension: Висечки мост
           swing: Вртечки мост
           viaduct: Вијадукт
@@ -531,25 +536,31 @@ mk:
           "yes": Занаетчиски дуќан
         emergency:
           ambulance_station: Итна помош
+          assembly_point: Собиралиште
           defibrillator: Дефибрилатор
           landing_site: Место за итно слетување
           phone: Итен телефон
+          water_tank: Итен водосклад
+          "yes": Итна помош
         highway:
           abandoned: Напуштен автопат
           bridleway: Коњски пат
           bus_guideway: Автобуски шини
           bus_stop: Автобуска постојка
           construction: Автопат во изградба
+          corridor: Премин
           cycleway: Велосипедска патека
           elevator: Лифт
           emergency_access_point: Прва помош
           footway: Тротоар
           ford: Брод
+          give_way: Знак за предност
           living_street: Маалска улица
           milestone: Милјоказ
           motorway: Автопат
           motorway_junction: Клучка
           motorway_link: Приклучен пат
+          passing_place: Минувалиште
           path: Патека
           pedestrian: Пешачка патека
           platform: Платформа
@@ -566,6 +577,7 @@ mk:
           services: Крајпатен сервис
           speed_camera: Брзиноловец
           steps: Скалила
+          stop: Знак за запирање
           street_lamp: Улична светилка
           tertiary: Третостепен пат
           tertiary_link: Третостепен пат
@@ -574,8 +586,8 @@ mk:
           trail: Патека
           trunk: Магистрала
           trunk_link: Магистрала
+          turning_loop: Повратен јазол
           unclassified: Некласификуван пат
-          unsurfaced: Неасфалтиран пат
           "yes": Пат
         historic:
           archaeological_site: Археолошки локалитет
@@ -594,6 +606,7 @@ mk:
           manor: Велепоседнички дом
           memorial: Споменик
           mine: Рудник
+          mine_shaft: Рудничко окно
           monument: Споменик
           roman_road: Римски пат
           ruins: Рушевини
@@ -603,6 +616,7 @@ mk:
           wayside_cross: Крајпатен крст
           wayside_shrine: Крајпатен параклис
           wreck: Бродолом
+          "yes": Историско место
         junction:
           "yes": Раскрсница
         landuse:
@@ -640,9 +654,9 @@ mk:
         leisure:
           beach_resort: Крајбрежно одморалиште
           bird_hide: Набљудувалиште за птици
-          club: Клуб
           common: Општествена земја
           dog_park: Парк за кучиња
+          firepit: Огниште
           fishing: Рибарење
           fitness_centre: Центар за фитнес
           fitness_station: Технички преглед
@@ -667,15 +681,46 @@ mk:
           water_park: Аквапарк
           "yes": Разонода
         man_made:
+          adit: Помошно окно
+          beacon: Светилник
+          beehive: Пчеларник
+          breakwater: Бранобран
+          bridge: Мост
+          bunker_silo: Бункер
+          chimney: Оџак
+          crane: Кран
+          dolphin: Пристан. дирек
+          dyke: Ров
+          embankment: Кеј
+          flagpole: Јарбол
+          gasometer: Гасомер
+          groyne: Брежна препрека
+          kiln: Печка
           lighthouse: Светилник
+          mast: Јарбол
+          mine: Рудник
+          mineshaft: Рудничко окно
+          monitoring_station: Надгледна станица
+          petroleum_well: Нафтен извор
+          pier: Пристан. мост
           pipeline: Цевковод
+          silo: Силос
+          storage_tank: Резервоар
+          surveillance: Надзор
           tower: Кула
+          wastewater_plant: Пречистителна станица
+          watermill: Воденица
+          water_tower: Водокула
+          water_well: Бунар
+          water_works: Водоводна станица
+          windmill: Ветерница
           works: Фабрика
           "yes": Вештачки
         military:
           airfield: Воено слетувалиште
           barracks: Касарна
           bunker: Бункер
+          "yes": Војска
         mountain_pass:
           "yes": Планински превој
         natural:
@@ -721,11 +766,14 @@ mk:
           accountant: Сметководител
           administrative: Управа
           architect: Архитект
+          association: Здружение
           company: Фирма
+          educational_institution: Образовна установа
           employment_agency: Агенција за вработување
           estate_agent: Агенција за недвижности
           government: Владина служба
           insurance: Служба за осигурување
+          it: Информатичка служба
           lawyer: Адвокат
           ngo: НВО-канцеларија
           telecommunication: Телекомуникациска канцеларија
@@ -733,9 +781,8 @@ mk:
           "yes": Канцеларија
         place:
           allotments: Парцели
-          block: Блок
-          airport: Аеродром
           city: Град
+          city_block: Градски блок
           country: Земја
           county: Округ
           farm: Фарма
@@ -746,12 +793,13 @@ mk:
           islet: Островче
           isolated_dwelling: Зафрлено живееалиште
           locality: Месност
-          moor: Пустара
           municipality: Општина
           neighbourhood: Соседство
           postcode: Поштенски број
+          quarter: Четврт
           region: Област
           sea: Море
+          square: Плоштад
           state: Покраина
           subdivision: Админ. подрачје
           suburb: Населба
@@ -763,10 +811,8 @@ mk:
           abandoned: Напуштена железничка линија
           construction: Железничка линија во изградба
           disused: Напуштена железничка линија
-          disused_station: Напуштена железничка станица
           funicular: Искачница
           halt: Железничка постојка
-          historic_station: Историска железничка станица
           junction: Железнички јазол
           level_crossing: Надвозник
           light_rail: Лека железница
@@ -792,6 +838,7 @@ mk:
           beauty: Козметика
           beverages: Пијалоци
           bicycle: Продавница за велосипеди
+          bookmaker: Бележник
           books: Книжарница
           boutique: Бутик
           butcher: Месарница
@@ -830,12 +877,16 @@ mk:
           hairdresser: Фризер
           hardware: Алат и опрема
           hifi: Аудиосистеми
-          insurance: Осигурително
+          houseware: Продавница за покуќнина
+          interior_decoration: Внатрешно уредување
           jewelry: Јувелир
           kiosk: Трафика
+          kitchen: Кујнска продавница
           laundry: Пералница
+          lottery: Лотарија
           mall: Трговски центар
           market: Пазар
+          massage: Масажа
           mobile_phone: Мобиларница
           motorcycle: Моторцикли
           music: Музички дуќан
@@ -843,21 +894,27 @@ mk:
           optician: Оптичар
           organic: Здрава храна
           outdoor: Продавница на отворено
+          paint: Бои и лакови
+          pawnbroker: Заложница
           pet: Домашни миленици
           pharmacy: Аптека
           photo: Фотографски дуќан
-          salon: Салон
+          seafood: Морска храна
           second_hand: Половна роба
           shoes: Обувки
-          shopping_centre: Трговски центар
           sports: Спортски дуќан
           stationery: Прибор и репроматеријали
           supermarket: Супермаркет
           tailor: Кројач
+          ticket: Билетарница
+          tobacco: Тутунарница
           toys: Продавница за играчки
           travel_agency: Туристичка агенција
+          tyres: Автогуми
+          vacant: Празна продавница
+          variety_store: Сештарница
           video: Видеотека
-          wine: Ð\90лкоÑ\85олни Ð¿Ð¸Ñ\98алоÑ\86и
+          wine: Ð\92инÑ\81ка Ð¿Ñ\80одавниÑ\86а
           "yes": Дуќан
         tourism:
           alpine_hut: Планинска куќарка
@@ -881,6 +938,7 @@ mk:
           viewpoint: Видиковец
           zoo: Зоолошка
         tunnel:
+          building_passage: Премин на зграда
           culvert: Пропусен канал
           "yes": Тунел
         waterway:
@@ -912,7 +970,7 @@ mk:
         level10: Населбена граница
     description:
       title:
-        osm_nominatim: Местоположба од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Местоположба од <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Местоположба од <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -988,17 +1046,17 @@ mk:
     legal_babble:
       title_html: Авторски права и лиценца
       intro_1_html: "OpenStreetMap<sup><a href=\"#trademarks\">&reg;</a></sup> има
-        <i>отворени податоци</i> под лиценцата <a\nhref=\"http://opendatacommons.org/licenses/odbl/\">Open
-        Data\nCommons Open Database License</a> (ODbL) од <a\n \t+\t\nhref=\"http://osmfoundation.org/\">фондацијата
+        <i>отворени податоци</i> под лиценцата <a\nhref=\"https://opendatacommons.org/licenses/odbl/\">Open
+        Data\nCommons Open Database License</a> (ODbL) од <a\n \t+\t\nhref=\"https://osmfoundation.org/\">фондацијата
         OpenStreetMap</a> (OSMF)."
       intro_2_html: "Нашите податоци слободно можете да ги умножувате, распространувате,
         предавате и менувате, \nдоколку ја наведете OpenStreetMap и нејзините\nучесници.
         Доколку ги измените или дополните податоците,\nдобиеното можете да го распространувате
         само под истата лиценца. Вашите права и одговорност ќе ги најдете\nво целосниот
-        <a\nhref=\"http://opendatacommons.org/licenses/odbl/1.0/\">правен текст</a>."
+        <a\nhref=\"https://opendatacommons.org/licenses/odbl/1.0/\">правен текст</a>."
       intro_3_html: |-
         Картографијата во нашите полиња на картите и нашата документација
-        се нудат под лиценцата <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.mk">Криејтив комонс Наведи извор-Сподели под исти услови 2.0</a> (CC-BY-SA).
+        се нудат под лиценцата <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.mk">Криејтив комонс Наведи извор-Сподели под исти услови 2.0</a> (CC-BY-SA).
       credit_title_html: Како да ја наведете OpenStreetMap
       credit_1_html: |-
         Задолжително наведувајте нè со &ldquo;&copy; Учесници на
@@ -1006,7 +1064,7 @@ mk:
       credit_2_html: "Исто така мора јасно да истакнете дека податоците се нудат под
         \nЛиценцата за отворени бази, и, доколку ги користите нашите полиња на картите,
         дека\nкартографијата е под лиценцата CC-BY-SA. Ова може да го сторите со ставање
-        на врска\nдо <a href=\"http://www.openstreetmap.org/copyright\">оваа страница
+        на врска\nдо <a href=\"https://www.openstreetmap.org/copyright\">оваа страница
         за авторство</a>. \nДруга можност (задолжителна ако го распространувате OSM
         во \nподаточен облик) е непосредно да го наведете името на лиценцата и да
         ставите врска. \nВо медиумите каде врските не се можни are not possible (на
@@ -1022,7 +1080,7 @@ mk:
       more_title_html: Повеќе информации
       more_1_html: |-
         Повеќе за употребата на нашите податоци и како да нè наведете ќе најдете на <a
-        href="http://osmfoundation.org/Licence">лиценцната страница</a>.
+        href="https://osmfoundation.org/Licence">лиценцната страница</a>.
       more_2_html: |-
         Иако OpenStreetMap работи со отворени податоци, ние не можеме да понудиме
         бесплатни извршници (API) за карти на трети лица.
@@ -1036,23 +1094,23 @@ mk:
         и други извори, меѓу кои се:
       contributors_at_html: |-
         <strong>Австрија</strong>: Содржи податоци од
-        <a href="http://data.wien.gv.at/">Град Виена</a> (под
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.mk">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Покраина Предарлска</a> и
-        Покраина Тирол (под <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT со исправки</a>).
+        <a href="https://data.wien.gv.at/">Град Виена</a> (под
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.mk">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Покраина Предарлска</a> и
+        Покраина Тирол (под <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY AT со исправки</a>).
       contributors_ca_html: |-
         <strong>Canada</strong>: Содржи податоци од
         GeoBase&reg;, GeoGratis (&copy; Министерство за природни ресурси на Канада), CanVec (&copy; Министерство за природни ресурси на Канада), and StatCan (Географско одделение,
         Статистичка служба на Канада).
       contributors_fi_html: |-
         <strong>Финска</strong>: Содржи податоци од топографската база и други ресурси на Државната геодетска служба на Финска, под лиценцата
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI</a>.
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI</a>.
       contributors_fr_html: |-
         <strong>Франција</strong>: Содржи податоци од
         Генералната даночна управа.
       contributors_nl_html: |-
         <strong>Холандија</strong>: Содржи &copy; податоци од AND, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Нов Зеланд</strong>: Содржи податоци од
         Катастарската служба на Нов Зеланд. Крунски авторски права.
@@ -1072,7 +1130,7 @@ mk:
       contributors_footer_1_html: |-
         Повеќе информации за овие и други извори искористени
         за подобрување на OpenStreetMap ќе најдете на страницата <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">Учесници</a> на викито на OpenStreetMap.
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Учесници</a> на викито на OpenStreetMap.
       contributors_footer_2_html: |-
         Употребата на податоците на OpenStreetMap не подразбира дека добавувачот
         на изворните податоци го застапува или рекламира OpenStreetMap, дава било каква гаранција, или
@@ -1081,16 +1139,16 @@ mk:
       infringement_1_html: |-
         Би сакале да ги потсетиме учесниците на OSM дека никогаш не смеат да ставаат
         податоци од извори заштитени со авторски права (на пр. Google Карти или печатени карти) без
-        Ð¸Ð·Ñ\80ична дозвола од имателите на тие права.
+        Ð¸Ð·Ñ\80ечна дозвола од имателите на тие права.
       infringement_2_html: "Доколку сметате дека базата на OpenStreetMap или ова мрежно
         место\nсодржи бесправно или неисправно поставени податоци, погледајте ја\n<a
-        href=\"http://www.osmfoundation.org/wiki/License/Takedown_procedure\">процедурата
+        href=\"https://www.osmfoundation.org/wiki/License/Takedown_procedure\">процедурата
         \nза отстранување</a> или поднесете жалба на \n<a href=\"http://dmca.openstreetmap.org/\">оваа
         наменска страница</a>."
       trademarks_title_html: <span id="trademarks"></span>Заштитни знаци
       trademarks_1_html: OpenStreetMap, логото со лупа и  „State of the Map“ („Состојба
         на картата“) се заштитни знаци на задолжбината OpenStreetMap. Ако имате прашања
-        Ð²Ð¾ Ð²Ñ\80Ñ\81ка Ñ\81о Ñ\83поÑ\82Ñ\80ебаÑ\82а Ð½Ð° Ð·Ð½Ð°Ñ\86иÑ\82е, Ð¿Ð¸Ñ\88еÑ\82е Ñ\9d Ð½Ð° <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Работната
+        Ð²Ð¾ Ð²Ñ\80Ñ\81ка Ñ\81о Ñ\83поÑ\82Ñ\80ебаÑ\82а Ð½Ð° Ð·Ð½Ð°Ñ\86иÑ\82е, Ð¿Ð¾Ð³Ð». <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Работната
         група за лиценци</a>.
   welcome_page:
     title: Добре дојдовте!
@@ -1122,8 +1180,8 @@ mk:
       paragraph_1_html: "OpenStreetMap има само малку формални правила, но очекуваме
         сите учесници да соработуваат и општат со заедницата. Доколку имате на ум
         други активности освен рачно уредување, прочитајте и проследете го упатството
-        \n<a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Увоз</a>
-        и \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Автоматизирани
+        \n<a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Увоз</a>
+        и \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Автоматизирани
         уредувања</a>."
     questions:
       title: Имате прашања?
@@ -1156,7 +1214,7 @@ mk:
       title: Други проблеми
       explanation_html: "Ако сте загрижени за тоа како се користат нашите податоци
         или во врска со содржините, повеќе правни информации ќе добиете на\n<a href='/copyright'>страницата
-        за авторски права</a> или обратете се кај соодветната \n<a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>работна
+        за авторски права</a> или обратете се кај соодветната \n<a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>работна
         група на OSMF</a>."
   help_page:
     title: Помош
@@ -1168,7 +1226,7 @@ mk:
       title: Добре дојдовте на OSM
       description: Започнете со овој брз водич низ основите на OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
       title: Почетен курс
       description: Напатствија за почетници, напишани од заедницата.
     help:
@@ -1191,7 +1249,7 @@ mk:
       description: Помош за претпријатија и организации кои преоѓаат на  карти на
         OpenStreetMap и други услуги.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/Mk:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/Mk:Main_Page
       title: wiki.openstreetmap.org
       description: Прелистајте ја подробната документација за OSM на викито.
   about_page:
@@ -1214,8 +1272,8 @@ mk:
       во ГИС, технолози што работат со опслужувачите на OSM, \nхуманитарни работници
       што картираат подрачја погодени \nод катастрофи и разни други.\nПовеќе за заедницата
       ќе дознаете на <a href='https://blog.openstreetmap.org'>блогот на OpenStreetMap</a>,\n<a
-      href='%{diary_path}'>корисничките дневници</a>,\n<a href='http://blogs.openstreetmap.org/'>блоговите
-      на заедницата</a> и страниците на\n<a href='http://www.osmfoundation.org/'>Фондацијата
+      href='%{diary_path}'>корисничките дневници</a>,\n<a href='https://blogs.openstreetmap.org/'>блоговите
+      на заедницата</a> и страниците на\n<a href='https://www.osmfoundation.org/'>Фондацијата
       OSM</a> website."
     open_data_title: Отворени податоци
     open_data_html: |-
@@ -1224,13 +1282,15 @@ mk:
       под истата лиценца. Повеќе ќе најдете на страницата <a href='%{copyright_path}'>Авторски права и лиценцирање</a>.
     legal_title: Правни работи
     legal_html: "Ова мрежно место и многу други поврзани услуги со кои раководи  \n<a
-      href='http://osmfoundation.org/'>Задолжбината OpenStreetMap</a> (OSMF) \nво
+      href='https://osmfoundation.org/'>Задолжбината OpenStreetMap</a> (OSMF) \nво
       име на заедницата. Употребата на сите услуги што ги нуди OSMF подлежи на нашите
-      <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nПравила
-      за прифатлива употреба</a> и <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Правилата
-      за заштита на личните податоци</a>\n<br> \nВе молиме <a href='http://osmfoundation.org/Contact'>контактирајте
+      <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nПравила
+      за прифатлива употреба</a> и <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">Правилата
+      за заштита на личните податоци</a>\n<br> \nВе молиме <a href='https://osmfoundation.org/Contact'>контактирајте
       ја OSMF</a> \nако имате прашања во врска со лиценцирањето, авторките права и
-      други правни прашања и проблеми."
+      други правни прашања и проблеми.\n<br>\nOpenStreetMap, логото со лупа и „Состојба
+      на картата“ се <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">заштитни
+      знаци на OSMF</a>."
     partners_title: Партнери
   notifier:
     diary_comment_notification:
@@ -1439,14 +1499,14 @@ mk:
       user_page_link: корисничка страница
       anon_edits_link_text: Дознајте зошто ова е така.
       flash_player_required: Ќе ви треба Flash-програм за да го користите Potlatch
-        - Flash-уредник за OpenStreetMap. Можете да <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">го
-        преземете Flash Player од Adobe.com</a>. Имате и <a href="http://wiki.openstreetmap.org/wiki/Editing">неколку
+        — Flash-уредник за OpenStreetMap. Можете да <a href="https://get.adobe.com/flashplayer/">го
+        преземете Flash Player од Adobe.com</a>. Имате и <a href="https://wiki.openstreetmap.org/wiki/Editing">неколку
         други можности</a> за уредување на OpenStreetMap.
       potlatch_unsaved_changes: Имате незачувани промени. (За да зачувате во Potlatch,
         треба го одселектирате тековниот пат или точка, ако уредувате во живо, или
         стиснете на „зачувај“ ако го имате тоа копче.)
-      potlatch2_not_configured: Potlatch 2 не е поставен - погледајте ја страницата
-        http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2 не е поставен  погледајте ја страницата
+        https://wiki.openstreetmap.org/wiki/The_Rails_Port
       potlatch2_unsaved_changes: Имате незачувани промени. (Зачувувањето во Potlatch
         2 се врши со стискање на „зачувај“.)
       id_not_configured: Не му се зададени поставки на уредувачкиот програм „iD“
@@ -1538,7 +1598,7 @@ mk:
       edit: Уреди
       preview: Преглед
     markdown_help:
-      title_html: Ð\9fаÑ\80Ñ\81иÑ\80ано Ñ\81о <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Ð Ð°Ñ\81Ñ\87ленеÑ\82о Ñ\81о <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Наслови
       heading: Наслов
       subheading: Поднаслов
@@ -1652,7 +1712,7 @@ mk:
       description: Прелистување на скороподигнати ГПС-траги
       tagged_with: '  означено со %{tags}'
       empty_html: Тука сè уште нема ништо. <a href='%{upload_link}'>Подигнете нова
-        трага</a> или дознајте повеќе за ГПС-трагите на <a href='http://wiki.openstreetmap.org/wiki/Mk:Beginners_Guide_1.2'>нивната
+        трага</a> или дознајте повеќе за ГПС-трагите на <a href='https://wiki.openstreetmap.org/wiki/Mk:Beginners_Guide_1.2'>нивната
         викстраница</a>.
     delete:
       scheduled_for_deletion: Трагата е закажана за бришење
@@ -1794,7 +1854,7 @@ mk:
       account not active: Жалиме, но сметката сè уште не е активна.<br />Стиснете
         на врската наведена во пораката со која ви ја потврдуваме сметката за да ја
         активирате, или пак <a href="%{reconfirm}">побарајте нова потврдна порака</a>.
-      account is suspended: Ð\9dажалоÑ\81Ñ\82, вашата сметка е закочена поради сомнителна активност.<br
+      account is suspended: Ð\97а Ð¶Ð°Ð», вашата сметка е закочена поради сомнителна активност.<br
         />Обратете се кај <a href="%{webmaster}">раководителот</a> ако сакате да продискутирате
         за проблемот.
       auth failure: Жалиме, не можевме да ве најавиме со тие податоци.
@@ -1862,12 +1922,12 @@ mk:
           <p>За разлика од некои други карти, OpenStreetMap во целост ја изработуваат луѓе како вас. Секој слободно може да врши поправки, да ја подновува, да ја презема и користи.</p>
           <p>Регистрирајте се за да почнете со ваше учество. Ќе ви испратиме потврда за сметката по е-пошта.</p>
       license_agreement: Кога ќе ја потврдите вашата сметка, ќе треба да се согласите
-        со <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">условите
+        со <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">условите
         за учесници</a>.
       email address: 'Е-пошта:'
       confirm email address: 'Потврдете ја е-поштата:'
       not displayed publicly: Вашата адреса нема да се прикажува јавно. Повеќе информации
-        за ова ќе најдете во <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+        за ова ќе најдете во <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="OSMF privacy policy including section on email addresses">Правилата
         за заштита на личните податоци</a>.
       display name: 'Име за приказ:'
@@ -1991,12 +2051,12 @@ mk:
       email never displayed publicly: (никогаш не се прикажува јавно)
       external auth: 'Надворешна заверка:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/MK:OpenID?uselang=mk
+        link: https://wiki.openstreetmap.org/wiki/MK:OpenID?uselang=mk
         link text: што е ова?
       public editing:
         heading: 'Јавно уредување:'
         enabled: Овозможено. Сега не е анонимно и може да се уредуваат податоци.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: што е ова?
         disabled: Оневозможено и не може да се уредуваат податоци, сите претходни
           уредувања се анонимни.
@@ -2007,7 +2067,7 @@ mk:
           порака или да ви ја видат местоположбата. За да покажете што уредувате и
           да овозможите корисниците да ве контактираат преку оваа страница, стиснете
           на копчето подолу. <b>По преодот на 0.6 API, само јавни корисници можат
-          да уредуваат податоци на карти</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">дознајте
+          да уредуваат податоци на карти</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">дознајте
           зошто</a>).<ul> <li>Ако станете јавен корисник, вашата е-пошта сепак нема
           да се открие.</li> <li>Оваа постапка не може да се врати, и сите нови корисници
           сега се автоматски јавни.</li> </ul>
@@ -2136,6 +2196,8 @@ mk:
       not_a_role: Низата `%{role}' не претставува важечка улога.
       already_has_role: Корисникот веќе ја има улогата %{role}.
       doesnt_have_role: Корисникот ја нема улогата %{role}.
+      not_revoke_admin_current_user: Не можам да му ја одземам администраторската
+        улога на тековниот корисник.
     grant:
       title: Потврди доделување на улога
       heading: Потврди доделување на улога
@@ -2357,9 +2419,10 @@ mk:
       new:
         intro: Забележавте некоја грешка или нешто недостасува? Дајте им на знаење
           на другите картографи за да ја средиме работата. Поместете го бележникот
-          на исправното место и внесете порака, објаснувајќи го проблемот. (Тука не
-          внесувајте лични информации или информации од авторски-заштитени карти и
-          именици.)
+          на исправното место и внесете порака, објаснувајќи го проблемот.
+        advice: Вашата белешка е јавна и може да се употреби за поднова на картата.
+          Затоа, не внесувајте лични податоци, или пак податоци од карти или именици
+          заштитени со авторски права.
         add: Додај белешка
       show:
         anonymous_warning: Оваа белешка има коментари од анонимни корисници што треба
@@ -2381,9 +2444,6 @@ mk:
         mapquest_car: Автомобил (MapQuest)
         mapquest_foot: Пешки (MapQuest)
         osrm_car: Автомобил (OSRM)
-        mapzen_bicycle: Велосипед (Mapzen)
-        mapzen_car: Автомобил (Mapzen)
-        mapzen_foot: Пешки (Mapzen)
       descend: Надолно
       directions: Насоки
       distance: Растојание
index 67009b6feae9a6884cb19bda147dbc246cc78243..6f0fdd4b00ee08c6c1351ab148e27854d6c12a41 100644 (file)
@@ -359,13 +359,13 @@ mr:
   geocoder:
     search:
       title:
-        latlon: निकाल <a href="http://openstreetmap.org/">अंतर्गत</a>
+        latlon: निकाल <a href="https://openstreetmap.org/"">अंतर्गत</a>
         uk_postcode: निकाल<a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
         ca_postcode: निकाल <a href="http://geocoder.ca/">जिओकोडर.सीए</a>
-        osm_nominatim: निकाल <a href="http://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
+        osm_nominatim: निकाल <a href="https://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
           नॉमिनॅटिम</a>
         geonames: निकाल <a href="http://www.geonames.org/">जिओनेम्स</a>
-        osm_nominatim_reverse: निकाल <a href="http://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
+        osm_nominatim_reverse: निकाल <a href="https://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
           नॉमिनॅटिम</a>
         geonames_reverse: निकाल <a href="http://www.geonames.org/">जिओनेम्स</a>
     search_osm_nominatim:
@@ -409,30 +409,23 @@ mr:
           crematorium: दहनभूमी
           dentist: दंतवैद्य
           doctors: डॉक्टर
-          dormitory: शयनागार
           drinking_water: पिण्याचे पाणी
           driving_school: चालन-शाळा
           embassy: दूतावास
-          emergency_phone: संकटकालीन दूरध्वनी
           fast_food: जलदान्न
           ferry_terminal: होडी अग्र
-          fire_hydrant: अग्नि जलोत्सर्गी
           fire_station: अग्निशमन केंद्र
           food_court: भोजन आवार
           fountain: कारंजे
           fuel: इंधन
           grave_yard: दफनभूमी
-          gym: व्यायामशाळा
-          health_centre: आरोग्य केंद्र
           hospital: रुग्णालय
           hunting_stand: मचाण
           ice_cream: आईसक्रिम
           kindergarten: बालवाडी
           library: ग्रंथालय
-          market: बाजार
           marketplace: बाजार
           nightclub: रात्री क्लब
-          nursery: बालवाडी
           nursing_home: शुश्रुषागृह
           office: कार्यालय
           parking: वाहनतळ
@@ -445,7 +438,6 @@ mr:
           prison: कारागृह
           pub: मद्यपानगृह
           public_building: सार्वजनिक इमारत
-          reception_area: स्वागत क्षेत्र
           recycling: पुनश्चक्रण केंद्र
           restaurant: उपाहारगृह
           retirement_home: आरामगृह
@@ -521,7 +513,6 @@ mr:
           trunk: महामार्ग
           trunk_link: महामार्ग
           unclassified: अवर्गीकृत रस्ता
-          unsurfaced: कच्चा रस्ता
         historic:
           archaeological_site: पुरातत्त्व स्थळ
           battlefield: युद्धक्षेत्र
@@ -647,7 +638,6 @@ mr:
           travel_agent: प्रवास अभिकरण
           "yes": कार्यालय
         place:
-          airport: विमानतळ
           city: शहर
           country: देश
           county: तालुका
@@ -659,7 +649,6 @@ mr:
           islet: द्वीपक
           isolated_dwelling: विलग रहिवास
           locality: मोहल्ला
-          moor: जीर्ण जमिन
           municipality: नगरपालिका
           neighbourhood: परिसर
           postcode: पोस्टसंकेत
@@ -675,10 +664,8 @@ mr:
           abandoned: त्यक्त लोहमार्ग
           construction: निर्माणाधीन लोहमार्ग
           disused: अनुपयोगीत रेल्वे
-          disused_station: अनुपयोगीत रेल्वे स्थानक
           funicular: रज्जुलोहमार्ग
           halt: रेल्वे स्थानक
-          historic_station: ऐतिहासिक रेल्वे स्थानक
           junction: लोहमार्ग संधिस्थान
           level_crossing: समतल मार्गपारण
           light_rail: हलकी रेल्वे
@@ -740,7 +727,6 @@ mr:
           grocery: किराणा दुकान
           hairdresser: केशकर्तनालय
           hardware: हार्डवेअर भांडार
-          insurance: विमा
           jewelry: आभूषण दुकान
           kiosk: टपरी
           laundry: धुलाई केंद्र
@@ -756,10 +742,8 @@ mr:
           pet: पाळीवप्राणी दुकान
           pharmacy: औषधालय
           photo: फोटो दुकान
-          salon: केशकर्तनालय
           second_hand: वापरलेल्या वस्तूंचे दुकान
           shoes: जोडे दुकान
-          shopping_centre: खरेदी केंद्र
           sports: क्रिडा दुकान
           stationery: लेखनसामग्री दुकान
           supermarket: सुपरमार्केट
@@ -818,7 +802,7 @@ mr:
         level10: उपनगर सिमा
     description:
       title:
-        osm_nominatim: स्थान <a href="http://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
+        osm_nominatim: स्थान <a href="https://nominatim.openstreetmap.org/">ओपनस्ट्रीटमॅप
           नॉमिनॅटिम मार्फत</a>
         geonames: स्थान <a href="http://www.geonames.org/">जिओनेम्स मार्फत</a>
       types:
@@ -1339,7 +1323,7 @@ mr:
       title: खाते संपादा
       my settings: माझ्या मांडण्या
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: हे काय आहे?
       public editing:
         enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
index 4ba64c820db58804ba6b4c8f7cc0f11443943100..a81254008e47d037af8c490b72dba9a59905ef0e 100644 (file)
@@ -7,6 +7,7 @@
 # Author: Macofe
 # Author: Nemo bis
 # Author: Pizza1016
+# Author: Zulfadli51
 ---
 ms:
   time:
@@ -162,6 +163,7 @@ ms:
         way: jalan
         relation: hubungan
         changeset: set ubah
+        note: nota
     timeout:
       sorry: Maaf, data untuk %{type} dengan id %{id} mengambil masa yang terlalu
         lama untuk diambil.
@@ -170,6 +172,7 @@ ms:
         way: jalan
         relation: hubungan
         changeset: set ubah
+        note: nota
     redacted:
       redaction: Redaksi %{id}
       message_html: Versi %{version} %{type} ini tidak boleh ditunjukkan kerana ia
@@ -213,6 +216,10 @@ ms:
       reopened_by_anonymous: Diaktifkan semula oleh pengguna awanama <abbr title='%{exact_time}'>%{when}
         lalu</abbr>
       hidden_by: Disembunyikan oleh %{user} <abbr title='%{exact_time}'>%{when} lalu</abbr>
+    query:
+      title: Ciri-ciri pertanyaan
+      introduction: Klik pada peta untuk mencari ciri-ciri terdekat.
+      nearby: Ciri-ciri terdekat
   changeset:
     changeset_paging_nav:
       showing_page: Page %{page}
@@ -248,6 +255,7 @@ ms:
   diary_entry:
     new:
       title: Catatan Diari Baru
+      publish_button: Terbitkan
     list:
       title: Diari pengguna
       title_friends: Diari kawan
@@ -387,6 +395,7 @@ ms:
           cable_car: Kereta kabel
           chair_lift: Lif Kerusi
           drag_lift: Lif Seret
+          gondola: Lif Gondola
           station: Stesen Kereta Gantung
         aeroway:
           aerodrome: Padang Terbang
@@ -397,6 +406,7 @@ ms:
           taxiway: Jalan Rayap
           terminal: Terminal
         amenity:
+          animal_shelter: Tempat Perlindungan Haiwan
           arts_centre: Pusat Seni
           atm: ATM
           bank: Bank
@@ -426,33 +436,26 @@ ms:
           crematorium: Bakar Mayat
           dentist: Doktor Gigi
           doctors: Doktor
-          dormitory: Asrama
           drinking_water: Air Minuman
           driving_school: Sekolah Memandu
           embassy: Kedutaan
-          emergency_phone: Telefon Kecemasan
           fast_food: Makanan Segera
           ferry_terminal: Terminal Feri
-          fire_hydrant: Pili Bomba
           fire_station: Balai Bomba
           food_court: Medan Selera
           fountain: Air Pancutan
           fuel: Minyak
           gambling: Pusat Perjudian
           grave_yard: Perkuburan
-          gym: Pusat Senaman / Gim
-          health_centre: Pusat Kesihatan
           hospital: Hospital
           hunting_stand: Pondok Memburu
           ice_cream: Aiskrim
           kindergarten: Tadika
           library: Perpustakaan
-          market: Pasar
           marketplace: Tempat Pasar
           monastery: Rumah Ibadah
           motorcycle_parking: Tempatletak motorsikal
           nightclub: Kelab Malam
-          nursery: Tabika
           nursing_home: Rumah Penjagaan
           office: Pejabat
           parking: Letak Kereta
@@ -466,7 +469,6 @@ ms:
           prison: Penjara
           pub: Pab
           public_building: Bangunan Awam
-          reception_area: Sambut Tetamu
           recycling: Kitar Semula
           restaurant: Kedai Makan
           retirement_home: Rumah Persaraan
@@ -560,7 +562,6 @@ ms:
           trunk: Jalan Utama
           trunk_link: Jalan Utama
           unclassified: Jalan Tidak Terkelas
-          unsurfaced: Jalan Tanpa Turapan
           "yes": Jalan Raya
         historic:
           archaeological_site: Tapak Kaji Purba
@@ -580,6 +581,7 @@ ms:
           memorial: Peringatan
           mine: Lombong
           monument: Tugu
+          roman_road: Jalan Rom
           ruins: Puing
           stone: Batu
           tomb: Makam
@@ -623,7 +625,6 @@ ms:
         leisure:
           beach_resort: Peranginan Pantai
           bird_hide: Kurungan Burung
-          club: Kelab
           common: Tanah Awam
           dog_park: Taman Anjing
           fishing: Tempat Memancing
@@ -714,8 +715,6 @@ ms:
           travel_agent: Agensi Pelancongan
           "yes": Pejabat
         place:
-          block: Blok
-          airport: Lapangan Terbang
           city: Bandar
           country: Negara
           county: Kaunti
@@ -727,7 +726,6 @@ ms:
           islet: Anak Pulau
           isolated_dwelling: Kediaman Terpencil
           locality: Lokaliti
-          moor: Mur
           municipality: Perbandaran
           neighbourhood: Kejiranan
           postcode: Poskod
@@ -744,10 +742,8 @@ ms:
           abandoned: Landasan Keretapi Terbiar
           construction: Landasan Keretapi dalam Pembinaan
           disused: Landasan Keretapi yang Tidak Digunakan Lagi
-          disused_station: Stesen Keretapi yang Tidak Digunakan Lagi
           funicular: Landasan Keretapi Funikular
           halt: Perhentian Keretapi
-          historic_station: Stesen Keretapi Bersejarah
           junction: Simpang Landasan Keretapi
           level_crossing: Lintasan Keretapi Rata
           light_rail: Rel Ringan
@@ -811,7 +807,6 @@ ms:
           hairdresser: Kedai Dandan Rambut
           hardware: Kedai Barang Besi
           hifi: Hi-Fi
-          insurance: Insurans
           jewelry: Kedai Barang Kemas
           kiosk: Gerai
           laundry: Dobi
@@ -827,10 +822,8 @@ ms:
           pet: Kedai Haiwan
           pharmacy: Farmasi
           photo: Kedai Foto
-          salon: Salon
           second_hand: Kedai Barangan Terpakai
           shoes: Kedai Kasut
-          shopping_centre: Pusat Beli-Belah
           sports: Kedai Sukan
           stationery: Kedai Alat Tulis
           supermarket: Pasar Raya
index bfcdda7ac92c7b3e26258c6c69e941385567d85c..f5978b69eae1ae662ffe8776b8b5d5ed2635305a 100644 (file)
@@ -145,6 +145,8 @@ nb:
         title_comment: 'Endringsforløp: %{id} - %{comment}'
       join_discussion: Logg inn for å delta i diskusjonen
       discussion: Diskusjon
+      still_open: Endringssettet er fortsatt åpent – diskusjonen åpner når endringssettet
+        er lukket.
     node:
       title: 'Node: %{name}'
       history_title: 'Node-historikk: %{name}'
@@ -228,7 +230,7 @@ nb:
         siden</abbr>
       hidden_by: Skjult av %{user} for <abbr title='%{exact_time}'>%{when} siden</abbr>
     query:
-      title: Forespørselsesfunksjoner
+      title: Se over elementer
       introduction: Klikk på kartet for å finne nærliggende funksjoner.
       nearby: Nærliggende funksjoner
       enclosing: Regionsfunksjoner
@@ -451,33 +453,26 @@ nb:
           crematorium: Krematorium
           dentist: Tannlege
           doctors: Leger
-          dormitory: Sovesal
           drinking_water: Drikkevann
           driving_school: Kjøreskole
           embassy: Ambassade
-          emergency_phone: Nødtelefon
           fast_food: Hurtigmat
           ferry_terminal: Ferjeterminal
-          fire_hydrant: Brannhydrant
           fire_station: Brannstasjon
           food_court: Serveringssteder
           fountain: Fontene
           fuel: Drivstoff
           gambling: Gambling
           grave_yard: Gravlund
-          gym: Treningssenter
-          health_centre: Helsesenter
           hospital: Sykehus
           hunting_stand: Jaktbod
           ice_cream: Iskrem
           kindergarten: Barnehage
           library: Bibliotek
-          market: Marked
           marketplace: Markedsplass
           monastery: Kloster
           motorcycle_parking: Motorsykkelparkering
           nightclub: Nattklubb
-          nursery: Førskole
           nursing_home: Pleiehjem
           office: Kontor
           parking: Parkeringsplass
@@ -491,7 +486,6 @@ nb:
           prison: Fengsel
           pub: Pub
           public_building: Offentlig bygning
-          reception_area: Resepsjonsområde
           recycling: Resirkuleringspunkt
           restaurant: Restaurant
           retirement_home: Gamlehjem
@@ -587,7 +581,6 @@ nb:
           trunk: Hovedvei
           trunk_link: Hovedvei
           unclassified: Uklassifisert vei
-          unsurfaced: Uklassifisert vei
           "yes": Vei
         historic:
           archaeological_site: Arkeologisk plass
@@ -652,7 +645,6 @@ nb:
         leisure:
           beach_resort: Strandsted
           bird_hide: Fugletårn
-          club: Klubb
           common: Allmenning
           dog_park: Hundepark
           fishing: Fiskeområde
@@ -745,8 +737,6 @@ nb:
           "yes": Kontor
         place:
           allotments: Jordlapper
-          block: Blokk
-          airport: Flyplass
           city: By
           country: Land
           county: Fylke
@@ -758,7 +748,6 @@ nb:
           islet: Holme
           isolated_dwelling: Enslig bosted
           locality: Plass
-          moor: Fjellhei
           municipality: Kommune
           neighbourhood: Naboskap
           postcode: Postnummer
@@ -775,10 +764,8 @@ nb:
           abandoned: Forlatt jernbane
           construction: Jernbane under konstruksjon
           disused: Nedlagt jernbane
-          disused_station: Nedlagt jernbanestasjon
           funicular: Kabelbane
           halt: Togstopp
-          historic_station: Historisk jernbanestasjon
           junction: Jernbanekryss
           level_crossing: Planovergang
           light_rail: Bybane
@@ -842,7 +829,6 @@ nb:
           hairdresser: Frisør
           hardware: Jernvarehandel
           hifi: Hi-Fi
-          insurance: Forsikring
           jewelry: Gullsmed
           kiosk: Kiosk
           laundry: Vaskeri
@@ -858,10 +844,8 @@ nb:
           pet: Dyrebutikk
           pharmacy: Apotek
           photo: Fotobutikk
-          salon: Salong
           second_hand: Bruktbutikk
           shoes: Skobutikk
-          shopping_centre: Kjøpesenter
           sports: Sportsbutikk
           stationery: Papirbutikk
           supermarket: Supermarked
@@ -962,7 +946,7 @@ nb:
     intro_text: OpenStreetMap er et kart over verden, skapt av mennesker som deg,
       og gratis å bruke under en åpen lisens.
     intro_2_create_account: Opprett en brukerkonto
-    partners_html: Hosting er støttet av %{ucl}, %{ic}, %{bytemark} og andre %{partners}.
+    partners_html: Hosting støttes av %{ucl}, %{bytemark}, %{ic}, og andre %{partners}.
     partners_ucl: UCL
     partners_ic: Imperial College London
     partners_bytemark: Bytemark Hosting
@@ -1032,9 +1016,7 @@ nb:
         title: Eksempel på kildehenvisning
       more_title_html: Finner ut mer
       more_1_html: Les mer om hvordan du kan bruke dataene våre og hvordan du oppgir
-        oss som kilde på <a href="http://osmfoundation.org/Licence">siden om OSMF-lisensen</a>
-        og i den <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">juridiske
-        FAQ-en</a>.
+        oss som kilde på <a href="http://osmfoundation.org/Licence">siden om OSMF-lisensen</a>.
       more_2_html: |-
         Selv om OpenStreetMap er åpent data, kan vi ikke bidra med gratis kart-API for tredjepartsutviklere.
         Se vår <a href="https://operations.osmfoundation.org/policies/api/">API Usage Policy</a>,
@@ -1215,9 +1197,11 @@ nb:
       for at OSM er nøyaktig og oppdatert.
     community_driven_title: Fellesskapsdrevet
     community_driven_html: |-
-      Gemenskapen i OpenStreetMap er mangfoldig, brennende, og den vokser for hver dag som går.
-      I våre rekker kan en finne entusiast-kartografer, GIS-proffer, ingeniører som kjører OSM-tjenere, humanister som kartlegger katestroferammede områder, og flere til.
-      For å lære mer om samholdet, sjekk ut <a href='%{diary_path}'>brukererkjennelser</a>, og <a href='http://www.osmfoundation.org/'>OSM-stiftelsens</a> nettside.
+      OpenStreetMap's samfunn er mangfoldig, lidenskapelig, og den vokser for hver dag som går.
+      Blant våre bidragsytere finner man entusiast-kartleggere, GIS-proffer, ingeniører som kjører OSM-tjenere, humanister som kartlegger katastroferammede områder, og mange flere.
+      For å lære mer om samfunnet, sjekk ut <a href='https://blog.openstreetmap.org'>OpenStreetMap Bloggen</a>,
+      <a href='%{diary_path}'>brukerdagbøker</a>,
+      <a href='http://blogs.openstreetmap.org/'>samfunnsblogger</a>, og <a href='http://www.osmfoundation.org/'>OSM Foundation</a> nettstedet.
     open_data_title: Åpne Data
     open_data_html: 'OpenStreetMap er <i>åpne data</i>: Du kan fritt bruke det for
       alle formål, så lenge du krediterer OpenStreetMap og dets bidragsytere. Hvis
@@ -1454,7 +1438,7 @@ nb:
       get_directions_title: Finn veien mellom to punkter
       from: Fra
       to: Til
-      where_am_i: Hvor er jeg?
+      where_am_i: Hvor er dette?
       where_am_i_title: Bruke søkemotoren til å beskrive gjeldende lokasjon.
       submit_text: Gå
     key:
@@ -2107,6 +2091,8 @@ nb:
       not_a_role: Strengen "%{role}" er ikke en gyldig rolle.
       already_has_role: Brukeren har allerede rollen %{role}.
       doesnt_have_role: Brukeren har ikke rollen %{role}.
+      not_revoke_admin_current_user: Kan ikke fjerne administratorrollen fra gjeldende
+        bruker.
     grant:
       title: Bekreft rolletildeling
       heading: Bekreft rolletildeling
@@ -2315,8 +2301,8 @@ nb:
       createnote_disabled_tooltip: Forstørr utvalg for å legge til en merknad på kartet
       map_notes_zoom_in_tooltip: Forstørr utvalg for å se kartmerknader
       map_data_zoom_in_tooltip: Forstørr utvalg for å se kartdata
-      queryfeature_tooltip: Forespørselsesfunksjoner
-      queryfeature_disabled_tooltip: Forstørr utvalg for å kjøre spørringsfunksjoner
+      queryfeature_tooltip: Se over elementer
+      queryfeature_disabled_tooltip: Forstørr utvalg for å se over elementer
     changesets:
       show:
         comment: Kommentar
@@ -2328,8 +2314,10 @@ nb:
       new:
         intro: Funnet en feil eller noe som mangler? La andre kartleggere få vite
           det så vi kan fikse det. Flytt markøren til riktig posisjon og skriv en
-          merknad som forklarer problemet. (Ikke oppgi personlig informasjon eller
-          informasjon fra opphavsrettsbeskyttede kart eller katalogoppføringer.)
+          merknad som beskriver problemet.
+        advice: Merknaden din blir publisert offentlig og blir brukt av kartleggere
+          for å oppdatere kartet, så ikke inkluder personlig info eller informasjon
+          fra opphavsrett-beskyttede kart eller kataloger.
         add: Legg til merknad
       show:
         anonymous_warning: Denne merknaden inneholder kommentarer fra anonyme brukere
@@ -2351,9 +2339,6 @@ nb:
         mapquest_car: Bil (MapQuest)
         mapquest_foot: Til fots (MapQuest)
         osrm_car: Bil (OSRM)
-        mapzen_bicycle: Sykkel (Mapzen)
-        mapzen_car: Bil (Mapzen)
-        mapzen_foot: Fot (Mapzen)
       descend: Avtagende
       directions: Veianvisninger
       distance: Avstand
@@ -2409,7 +2394,7 @@ nb:
       directions_to: Veibeskrivelser hit
       add_note: Legg til merknad her
       show_address: Vis adresse
-      query_features: Spørringsfunksjoner
+      query_features: Se over elementer
       centre_map: Sentrer kartet her
   redaction:
     edit:
index 3ace43a64c2011ce94229c33f7a04906c1128f5f..feb0bc0e4a63f126c05adc795bfa1454e94796cc 100644 (file)
@@ -129,10 +129,8 @@ nds:
     search_osm_nominatim:
       prefix:
         amenity:
-          airport: Flegerhaven
           arts_centre: Kunstcenter
           atm: Geldautomaat
-          auditorium: Auditorium
           bank: Bank
           bar: Bar
           bench: Bank
@@ -145,39 +143,29 @@ nds:
           casino: Kasino
           cinema: Kino
           clinic: Krankenhuus
-          club: Club
           college: Hoogschool
           courthouse: Gericht
           crematorium: Krematorium
           dentist: Tähndokter
           doctors: Dokter
-          dormitory: Studentenhuus
           drinking_water: Drinkwater
           driving_school: Fohrschool
           embassy: Baadschop
-          emergency_phone: Noodtelefoon
           fast_food: Fast Food
           ferry_terminal: Fährterminal
-          fire_hydrant: Hydrant
           fire_station: Füürwehr
           fountain: Fontään
           fuel: Tanksteed
           grave_yard: Karkhoff
-          gym: Fitnesscenter
-          hall: Hall
           hospital: Krankenhuus
-          hotel: Hotel
           hunting_stand: Hoogstand
           ice_cream: Iesladen
           kindergarten: Kinnergoorn
           library: Bökeree
-          market: Markt
           marketplace: Marktplatz
           nightclub: Nachtclub
-          nursery: Kita
           nursing_home: Pleeghuus
           office: Kontoor
-          park: Park
           parking: Parkplatz
           pharmacy: Avtheek
           police: Polizei
@@ -192,26 +180,21 @@ nds:
           school: School
           shelter: Schuulruum
           shop: Laden
-          shopping: Ladens
           social_club: Sozialvereen
           studio: Eenkamer-Appartement
-          supermarket: Supermarkt
           taxi: Taxi
           theatre: Theater
           toilets: Toiletten
           university: Universität
           village_hall: Gemeendehuus
-          wifi: Wifi-Togang
           youth_centre: Jöögdcenter
         highway:
           bridleway: Riedpadd
           bus_stop: Busstopp
-          byway: Siedenweg
           cycleway: Radweg
           footway: Footpadd
           ford: Foord
           living_street: Wahnstraat
-          minor: Blangenstraat
           motorway: Autobahn
           motorway_junction: Autobahnkrüüz
           motorway_link: Autobahnopfohrt
@@ -222,7 +205,6 @@ nds:
           residential: Wahnstraat
           road: Straat
           steps: Trepp
-          stile: Stegel
           track: Feldweg
           trail: Padd
         historic:
@@ -233,7 +215,6 @@ nds:
           memorial: Gedenksteed
           mine: Mien
           monument: Monument
-          museum: Museum
           ruins: Ruinen
           tower: Toorn
           wreck: Wrack
@@ -250,13 +231,10 @@ nds:
           meadow: Wisch
           military: Militärrebeed
           mine: Mien
-          park: Park
-          piste: Piste
           quarry: Steenkuhl
           reservoir: Reservoir
           residential: Wahnrebeed
           vineyard: Wiengoorn
-          wood: Holt
         leisure:
           common: Buurmeen
           garden: Goorn
@@ -275,7 +253,6 @@ nds:
           beach: Strand
           cape: Kap
           cave_entrance: Höhleningang
-          channel: Kanaal
           crater: Krater
           fell: Fjell
           fjord: Fjord
@@ -291,10 +268,8 @@ nds:
           peak: Bargtopp
           reef: Riff
           ridge: Bargkamm
-          river: Stroom
           rock: Steen
           scrub: Krattbusch
-          shoal: Sandbank
           spring: Born
           strait: Straat
           tree: Boom
@@ -303,7 +278,6 @@ nds:
           water: Water
           wood: Woold
         place:
-          airport: Flegerhaven
           city: Stadt
           country: Land
           county: Distrikt
@@ -313,7 +287,6 @@ nds:
           houses: Hüüs
           island: Eiland
           islet: lütt Eiland
-          moor: Moor
           municipality: Gemeen
           sea: See
           state: Staat
@@ -345,7 +318,6 @@ nds:
           gift: Geschenkladen
           greengrocer: Gröönhöker
           hairdresser: Putzbüdel
-          insurance: Versekerung
           jewelry: Juwelier
           kiosk: Kiosk
           laundry: Wäscheree
@@ -355,7 +327,6 @@ nds:
           newsagent: Kiosk
           optician: Optiker
           photo: Fotoladen
-          salon: Salon
           shoes: Schohladen
           supermarket: Supermarkt
           toys: Speeltüügladen
@@ -368,7 +339,6 @@ nds:
           hotel: Hotel
           motel: Motel
           museum: Museum
-          valley: Daal
           zoo: Zoo
         waterway:
           canal: Kanaal
@@ -378,9 +348,7 @@ nds:
           dock: Dock
           lock: Slüüs
           lock_gate: Slüsendoor
-          mineral_spring: Mineralborn
           river: Stroom
-          riverbank: Stroomöver
           stream: Beek
           wadi: Wadi
           waterfall: Waterfall
@@ -397,19 +365,6 @@ nds:
     results:
       no_results: nix funnen
       more_results: Mehr
-    distance:
-      one: üm un bi 1 km
-      zero: ünner 1 km
-      other: üm un bi %{count} km
-    direction:
-      south_west: süüdwesten
-      south: süden
-      south_east: süüdoosten
-      east: oosten
-      north_east: noordoosten
-      north: noorden
-      north_west: noordwesten
-      west: westen
   layouts:
     logo:
       alt_text: OpenStreetMap-Logo
@@ -499,9 +454,7 @@ nds:
           primary: wichtige Landstraat
           secondary: lüttjere Landstraat
           unclassified: Straat
-          unsurfaced: Mullstraat
           track: Feldweg
-          byway: Siedenweg
           bridleway: Riedpadd
           cycleway: Fohrradpadd
           footway: Footpadd
@@ -525,7 +478,6 @@ nds:
           golf: Golfplatz
           park: Park
           resident: Wahnrebeed
-          tourist: Touristenattrakschoon
           common:
           - Wisch
           - Wisch
@@ -656,8 +608,6 @@ nds:
     account:
       title: Brukerkonto ännern
       email never displayed publicly: (nich apen wiesen)
-      openid:
-        openid: OpenID
       public editing:
         enabled link text: Wat is dat?
         disabled link text: Worüm kann ik nix ännern?
index 210c65be5906ced1b3bc754fdc5da437193a1c10..4559e85f596f4e8cf1b287164229e4d421d98037 100644 (file)
@@ -453,33 +453,26 @@ ne:
           crematorium: श्मशान
           dentist: दाँतको डाक्टर
           doctors: डाक्टर
-          dormitory: छात्रावास
           drinking_water: पिउने पानी
           driving_school: ड्राइभिङ स्कूल
           embassy: दूतावास
-          emergency_phone: आकस्मिक फोन
           fast_food: चमेना गृह
           ferry_terminal: फेरी टर्मिनल
-          fire_hydrant: अग्नि नियन्त्रक
           fire_station: अग्नि नियन्त्रण स्टेसन्
           food_court: खाजा घर
           fountain: पानीको फोहोरा
           fuel: इन्धन
           gambling: जुवाघर
           grave_yard: श्मशान घाट
-          gym: जिमखाना
-          health_centre: स्वास्थ्य केन्द्र
           hospital: अस्पताल
           hunting_stand: शिकार क्षेत्र
           ice_cream: बरफ
           kindergarten: बाल आश्रम
           library: पुस्तकालय
-          market: बजार
           marketplace: बजार क्षेत्र
           monastery: चैत्य
           motorcycle_parking: मोटर साइकल पार्किङ
           nightclub: रात्री क्लब
-          nursery: नर्सरी
           nursing_home: नर्सिङ होम
           office: कार्यलय
           parking: पार्किङ
@@ -493,7 +486,6 @@ ne:
           prison: कारागार
           pub: पब
           public_building: सार्वजनिक भवन
-          reception_area: रिसेप्सन क्षे्त्र
           recycling: पुनः प्रयोग विन्दु
           restaurant: रेस्टुरेन्ट
           retirement_home: बृद्ध आश्रम
@@ -577,7 +569,6 @@ ne:
           street_lamp: सडक बत्ती
           track: ट्रयाक
           trail: गोरेटो बाटो
-          unsurfaced: नछापिएको मार्ग
           "yes": सडक
         historic:
           bunker: बङ्कर
@@ -610,7 +601,6 @@ ne:
           retail: खुद्रा
           road: सडक क्षेत्र
         leisure:
-          club: कल्ब
           garden: बगैँचा
           park: उद्यान
           resort: रिसोर्ट
@@ -657,8 +647,6 @@ ne:
           travel_agent: ट्राभल एजेन्सी
           "yes": कार्यलय
         place:
-          block: खण्ड
-          airport: हवाइ अड्डा
           city: शहर
           country: देश
           county: ईलाका
@@ -679,7 +667,6 @@ ne:
           "yes": स्थानहरू
         railway:
           abandoned: परित्यक्त रेलमार्ग
-          historic_station: ऐतिहासिक रेलमार्ग स्टेसन
           junction: रेलमार्ग जङ्सन
         shop:
           bakery: बेकरी
@@ -718,7 +705,6 @@ ne:
           hairdresser: नाइ पसल
           hardware: हार्डवेयर पसल
           hifi: हाइ-फाइ
-          insurance: बीमा
           jewelry: गहना पसल
           mall: सपिङ मल
           market: बजार
@@ -729,9 +715,7 @@ ne:
           optician: अप्टिसियन
           pet: पाल्तु पसल
           pharmacy: औषधी पसल
-          salon: सलोन
           shoes: जुत्ता पसल
-          shopping_centre: किनमेल केन्द्र
           sports: खेलकुद सामग्री पसल
           tailor: सुचीकार
           toys: खेलौना पसल
index 9884a9f10abcb5c3b2371bb552c28ab3e11b7663..a7b2af2ca2f897783ded3445e019a8eddc289027 100644 (file)
@@ -54,19 +54,19 @@ nl:
       language: Taal
       message: Bericht
       node: Node
-      node_tag: Nodelabel
+      node_tag: Nodetag
       notifier: Melder
       old_node: Oude node
-      old_node_tag: Oud nodelabel
+      old_node_tag: Oude nodetag
       old_relation: Oude relatie
       old_relation_member: Oud relatielid
-      old_relation_tag: Oud relatielabel
+      old_relation_tag: Oude relatietag
       old_way: Oude weg
       old_way_node: Oude node op een weg
-      old_way_tag: Oud weglabel
+      old_way_tag: Oude weg-tag
       relation: Relatie
       relation_member: Relatielid
-      relation_tag: Relatielabel
+      relation_tag: Relatietag
       session: Sessie
       trace: Track
       tracepoint: Trackpunt
@@ -76,7 +76,7 @@ nl:
       user_token: Gebruikersnummer
       way: Weg
       way_node: Wegnode
-      way_tag: Weglabel
+      way_tag: Weg-tag
     attributes:
       diary_comment:
         body: Tekst
@@ -164,6 +164,8 @@ nl:
         title_comment: Set wijzigingen %{id} - %{comment}
       join_discussion: Meld u aan om mee te praten
       discussion: Overleg
+      still_open: Wijzigingenset is nog open – overleg gaat open van zodra de wijzigingenset
+        afgesloten wordt.
     node:
       title: 'Node: %{name}'
       history_title: 'Nodegeschiedenis: %{name}'
@@ -220,10 +222,10 @@ nl:
       load_data: Gegevens laden
       loading: Bezig met laden…
     tag_details:
-      tags: Labels
+      tags: Tags
       wiki_link:
-        key: De wikipagina die het label %{key} beschrijft
-        tag: De wikipagina die het label %{key}=%{value} beschrijft
+        key: De wikipagina die de tag %{key} beschrijft
+        tag: De wikipagina die de tag %{key}=%{value} beschrijft
       wikidata_link: Het item %{page} op Wikidata
       wikipedia_link: De pagina %{page} op Wikipedia
       telephone_link: '%{phone_number} bellen'
@@ -380,7 +382,7 @@ nl:
       embeddable_html: HTML-code
       licence: Licentie
       export_details: OpenStreetMapgegevens zijn gelicenseerd onder de licentie <a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
+        href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
         Database</a> (ODbL).
       too_large:
         advice: 'Als het exporteren mislukt, overweeg dan een van de onderstaande
@@ -420,14 +422,14 @@ nl:
   geocoder:
     search:
       title:
-        latlon: Resultaten van <a href="http://openstreetmap.org/">intern</a>
+        latlon: Resultaten van <a href="https://openstreetmap.org/">intern</a>
         uk_postcode: Resultaten van <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultaten van <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultaten van <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultaten van <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultaten van <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultaten van <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultaten van <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultaten van <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resulaten van <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -477,36 +479,29 @@ nl:
           crematorium: Crematorium
           dentist: Tandarts
           doctors: Dokter
-          dormitory: Studentenhuis
           drinking_water: Drinkwater
           driving_school: Rijschool
           embassy: Ambassade
-          emergency_phone: Noodtelefoon
           fast_food: Fast food
           ferry_terminal: Veerterminal
-          fire_hydrant: Brandkraan
           fire_station: Brandweer
           food_court: Foodcourt
           fountain: Fontein
           fuel: Brandstof
           gambling: Gokken
           grave_yard: Begraafplaats
-          gym: Fitnesscentrum
-          health_centre: Gezondheidscentrum
           hospital: Ziekenhuis
           hunting_stand: Jachttoren
           ice_cream: IJs
           kindergarten: Kleuterschool
           library: Bibliotheek
-          market: Markt
           marketplace: Marktplein
           monastery: Klooster
           motorcycle_parking: Motorfietsparkeerplaats
           nightclub: Nachtclub
-          nursery: Peuterspeelzaal
           nursing_home: Verpleeghuis
           office: Kantoor
-          parking: Parkeren
+          parking: Parking
           parking_entrance: Ingang parkeerplaats
           pharmacy: Apotheek
           place_of_worship: Religieuze samenkomstplaats
@@ -517,7 +512,6 @@ nl:
           prison: Gevangenis
           pub: Café
           public_building: Openbaar gebouw
-          reception_area: Receptie
           recycling: Recyclingpunt
           restaurant: Restaurant
           retirement_home: Bejaardenhuis
@@ -613,7 +607,6 @@ nl:
           trunk: Autosnelweg
           trunk_link: Autoweg
           unclassified: Ongeclassificeerde weg
-          unsurfaced: Onverharde weg
           "yes": Weg
         historic:
           archaeological_site: Archeologische vindplaats
@@ -678,7 +671,6 @@ nl:
         leisure:
           beach_resort: Badplaats
           bird_hide: Nestplaats
-          club: Club
           common: Meent
           dog_park: Hondenpark
           fishing: Visgrond
@@ -771,8 +763,6 @@ nl:
           "yes": Kantoor
         place:
           allotments: Volkstuinen
-          block: Blokkades
-          airport: Luchthaven
           city: Plaats
           country: Land
           county: District
@@ -784,7 +774,6 @@ nl:
           islet: Eilandje
           isolated_dwelling: Geïsoleerde woning
           locality: Plaats
-          moor: Veen
           municipality: Gemeente
           neighbourhood: Wijk
           postcode: Postcode
@@ -801,10 +790,8 @@ nl:
           abandoned: Vervallen spoorweg
           construction: Spoor in aanbouw
           disused: Ongebruikte spoorweg
-          disused_station: Ongebruikt spoorwegstation
           funicular: Kabelspoorweg
           halt: Treinhalte
-          historic_station: Historisch spoorwegstation
           junction: Spoorwegkruising
           level_crossing: Spoorwegovergang
           light_rail: Lightrail
@@ -868,7 +855,6 @@ nl:
           hairdresser: Kapper
           hardware: Gereedschappenwinkel
           hifi: Hi-fi
-          insurance: Verzekering
           jewelry: Juwelier
           kiosk: Kioskwinkel
           laundry: Wasserij
@@ -884,10 +870,8 @@ nl:
           pet: Dierenwinkel
           pharmacy: Apotheek
           photo: Fotowinkel
-          salon: Schoonheidssalon
           second_hand: Kringloopwinkel
           shoes: Schoenenzaak
-          shopping_centre: Winkelcentrum
           sports: Sportwinkel
           stationery: Kantoorartikelenwinkel
           supermarket: Supermarkt
@@ -950,7 +934,7 @@ nl:
         level10: Wijkgrens
     description:
       title:
-        osm_nominatim: Locatie van <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Locatie van <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Locatie van <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1028,17 +1012,17 @@ nl:
         OpenStreetMap<sup><a href="#trademarks">®</a></sup> is <i>open data</i>, vrijgegeven onder de <a
         href="http://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) door de <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: |-
         Het staat u vrij onze gegevens te kopiëren, te distribueren,
         weer te geven en aan te passen, zo lang u OpenStreetMap en haar
         auteurs vermeldt. Als u onze kaarten of gegevens wijzigt of erop verder bouwt,
         mag u het resultaat enkel onder dezelfde licentie distribueren. In de
-        volledige <a href="http://opendatacommons.org/licenses/odbl/1.0/">juridische
+        volledige <a href="https://opendatacommons.org/licenses/odbl/1.0/">juridische
         tekst</a> worden uw rechten en verantwoordelijkheden uitgelegd.
       intro_3_html: |-
         De cartografie in onze kaarttegels en onze documentatie zijn
-        vrijgegeven onder de licentie <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        vrijgegeven onder de licentie <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons Naamsvermelding-Gelijk delen 2.0</a> (CC BY-SA).
       credit_title_html: Hoe OpenStreetMap te vermelden
       credit_1_html: |-
@@ -1047,7 +1031,7 @@ nl:
       credit_2_html: "U moet ook duidelijk maken dat de gegevens beschikbaar zijn
         onder de Open\nDatabase License, en als u onze kaarttegels gebruikt, dat de
         cartografie\nde licentie CC BY-SA heeft. U kunt dit doen door te verwijzen
-        naar\n<a href=\"http://www.openstreetmap.org/copyright\">de auteursrechtenpagina</a>.
+        naar\n<a href=\"https://www.openstreetmap.org/copyright\">de auteursrechtenpagina</a>.
         \nU kunt ook direct verwijzen naar de licentie(s). Dat laatste is verplicht
         als u OSM in gegevensvorm distribueert. In media waar\nhyperlinks niet mogelijk
         zijn, bijvoorbeeld in gedrukte werken, raden we u aan\nuw lezer te verwijzen
@@ -1063,7 +1047,7 @@ nl:
         title: Voorbeeld naamsvermelding
       more_title_html: Meer informatie
       more_1_html: Lees meer over het gebruik van onze gegevens, en hoe u OpenStreetMap
-        moet vermelden, op de <a href="http://osmfoundation.org/Licence">licentiepagina
+        moet vermelden, op de <a href="https://osmfoundation.org/Licence">licentiepagina
         van de OSMF</a>
       more_2_html: |-
         Hoewel OpenStreetMap open data is, kunnen we geen gratis
@@ -1078,9 +1062,9 @@ nl:
         en andere bronnen, waaronder:
       contributors_at_html: |-
         <strong>Oostenrijk</strong>: bevat gegevens van de
-        <a href="http://data.wien.gv.at/">Stad Wenen</a> (onder
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> en
-        Land Tirol (onder <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY-AT met aanvullingen</a>).
+        <a href="https://data.wien.gv.at/">Stad Wenen</a> (onder
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> en
+        Land Tirol (onder <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY-AT met aanvullingen</a>).
       contributors_ca_html: |-
         <strong>Canada</strong>: Bevat gegevens van
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1089,13 +1073,13 @@ nl:
         Statistics Canada).
       contributors_fi_html: '<strong>Finland</strong>: bevat gegevens van de topografische
         database van het nationaal kadaster van Finland en andere gegevensverzamelingen,
-        onder de licentie <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI</a>.'
+        onder de licentie <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI</a>.'
       contributors_fr_html: |-
         <strong>Frankrijk</strong>: Bevat gegevens van
         Direction Générale des Impôts.
       contributors_nl_html: |-
         <strong>Nederland</strong>: Bevat &copy; Gegevens van AND, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Nieuw-Zeeland</strong>: Bevat gegevens van
         Land Information New Zealand. Crown Copyright voorbehouden.
@@ -1115,7 +1099,7 @@ nl:
       contributors_footer_1_html: |-
         Voor meer gegevens over deze en andere bronnen die gebruikt zijn
         voor het verbeteren van OpenStreetMap, kunt u de <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">pagina met Bijdragers</a>
+        href="https://wiki.openstreetmap.org/wiki/Contributors">pagina met Bijdragers</a>
         op de OpenStreetMap Wiki raadplegen.
       contributors_footer_2_html: |-
         Opname van gegevens in OpenStreetMap betekent niet dat de originele
@@ -1129,12 +1113,12 @@ nl:
       infringement_2_html: |-
         Als u van mening bent dat auteursrechtelijk beschermd en niet vrij gelicenseerd materiaal
         ongeoorloofd aan de database van OpenStreetMap of aan deze website is toegevoegd, raadpleeg dan
-        onze <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">verwijderprocedure</a>
-        of meld het direct en formeel via onze <a href="http://dmca.openstreetmap.org/">online claimpagina</a>.
+        onze <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">verwijderprocedure</a>
+        of meld het direct en formeel via onze <a href="https://dmca.openstreetmap.org/">online claimpagina</a>.
       trademarks_title_html: <span id="trademarks"></span>Handelsmerken
       trademarks_1_html: OpenStreetMap, het vergrootglaslogo en State of the Map zijn
         geregistreerde handelsmerken van de OpenStreetMap Foundation. Als u vragen
-        hebt over uw gebruik van deze merken, stuur dan uw vragen dan naar de <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licentiewerkgroep</a>.
+        hebt over uw gebruik van deze merken, stuur dan uw vragen dan naar de <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Licentiewerkgroep</a>.
   welcome_page:
     title: Welkom!
     introduction_html: Welkom bij OpenStreetMap, de open en te bewerken kaart van
@@ -1159,16 +1143,15 @@ nl:
         restaurant of een boom.
       way_html: Een <strong>weg</strong> (way) is een lijn of gebied, zoals een weg,
         een rivier, een meer of een gebouw.
-      tag_html: Een <strong>label</strong> (tag) is een eigenschap over een node of
-        een weg, zoals de naam van een restaurant of de maximum snelheid voor een
-        weg.
+      tag_html: Een <strong>tag</strong> is een eigenschap over een node of een weg,
+        zoals de naam van een restaurant of de maximumsnelheid op een weg.
     rules:
       title: Regels!
       paragraph_1_html: "OpenStreetMap heeft weinig formele regels, maar we verwachten
         dat alle deelnemers samenwerken en communiceren met de gemeenschap. Als u
-        van plan bent andere activiteiten te ontwikkelen dan met de hand bewerkingen
-        maken, lees en volg dan de richtlijnen op <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a>
-        en \n<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Geautomatiseerde
+        van plan bent andere activiteiten uit te voeren dan met de hand bewerkingen
+        maken, lees en volg dan de richtlijnen voor <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a>
+        en \n<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Geautomatiseerde
         bewerkingen</a>."
     questions:
       title: Nog vragen?
@@ -1204,7 +1187,7 @@ nl:
       explanation_html: |-
         Als je vragen hebt over hoe onze gegevens worden gebruikt of over de inhoud, raadpleeg dan onze
         <a href='/copyright'>auteursrechtenpagina</a> voor meer juridische informatie, of neem contact op met de betreffende
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-werkgroep</a>.
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-werkgroep</a>.
   help_page:
     title: Hulp krijgen
     introduction: Er zijn verschillende bronnen om meer te leren over OpenStreetMap,
@@ -1216,7 +1199,7 @@ nl:
       description: Begin met dit snelle stappenplan dat de basis van OpenSteetMap
         uitlegt.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/NL:Beginnershandleiding
+      url: https://wiki.openstreetmap.org/wiki/NL:Beginnershandleiding
       title: Handleiding voor beginners
       description: Handleiding voor beginners, onderhouden door de gemeenschap.
     help:
@@ -1240,7 +1223,7 @@ nl:
       description: Hulp voor bedrijven en organisaties om over te schakelen op OpenStreetMap-gebaseerde
         kaarten en andere diensten.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: In de wiki kijken voor diepgaande documentatie over OSM
   about_page:
@@ -1257,7 +1240,12 @@ nl:
     community_driven_title: Communitygedreven
     community_driven_html: |-
       De gemeenschap van OpenStreetMap is divers, gepassioneerd en wordt elke dag groter. Onder onze bijdragers zitten mensen die kaarten maken als hobby, GIS-professionals, IT-specialisten die de servers van OSM draaiende houden, filantropen die rampgebieden in kaart brengen en nog veel meer.
-      Bekijk de <a href='%{diary_path}'>gebruikersdagboeken</a> of de <a href='http://blogs.openstreetmap.org/'>gemeenschapsblogs</a> voor meer informatie over de gemeenschap of de website van de <a href='http://www.osmfoundation.org/'>OSM Foundation</a>.
+      Bekijk de
+      <a href='https://blog.openstreetmap.org/'>OpenStreetMap-blog</a>,
+      <a href='%{diary_path}'>gebruikersdagboeken</a>,
+      <a href='https://blogs.openstreetmap.org/'>gemeenschapsblogs</a>,
+      en de website van de <a href='https://www.osmfoundation.org/'>OSM Foundation</a>
+      voor meer informatie over de gemeenschap.
     open_data_title: Open data
     open_data_html: 'OpenStreetMap is <i>open data</i>: u mag de gegevens gebruiken
       voor ieder doel, als u de naam van OpenStreetMap en haar bijdragers maar vermeldt.
@@ -1266,11 +1254,11 @@ nl:
       over Auteursrechten en Licentie</a> voor details.'
     legal_title: Juridisch
     legal_html: "Deze site en tal van andere diensten worden formeel beheerd door
-      \n<a href=\"http://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF)
+      \n<a href=\"https://osmfoundation.org/\">OpenStreetMap Foundation</a> (OSMF)
       \nnamens de gemeenschap. Het gebruik van alle door OSMF aangeboden diensten
-      is onderworpen\naan ons <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nBeleid
-      voor aanvaardbaar gebruik</a> en ons <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacybeleid</a>.\n<br>
-      \n<a href=\"http://osmfoundation.org/Contact\">Neem contact op met de OSMF</a>
+      is onderworpen\naan ons <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nBeleid
+      voor aanvaardbaar gebruik</a> en ons <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacybeleid</a>.\n<br>
+      \n<a href=\"https://osmfoundation.org/Contact\">Neem contact op met de OSMF</a>
       \nals u vragen of problemen hebt in verband met licenties, auteursrechten of
       andere juridische zaken."
     partners_title: Partners
@@ -1486,13 +1474,13 @@ nl:
       user_page_link: gebruikerspagina
       anon_edits_link_text: Lees waarom dit het geval is.
       flash_player_required: U hebt Flash-player nodig om Potlatch, de OpenStreetMap
-        Flash-editor te gebruiken. U kunt <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Flash-player
+        Flash-editor te gebruiken. U kunt <a href="https://get.adobe.com/flashplayer/">Flash-player
         van Adobe.com downloaden</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Er
         zijn ook andere opties</a> om OpenStreetMap te bewerken.
       potlatch_unsaved_changes: U hebt wijzigingen gemaakt die nog niet zijn opgeslagen.
         Om op te slaan in Potlach, deselecteert u de huidige weg of het huidige punt
         als u in livemodus bewerkt, of klikt u op de knop Opslaan.
-      potlatch2_not_configured: Potlatch 2 is niet ingesteld - zie http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2 is niet ingesteld – zie https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
         voor meer informatie
       potlatch2_unsaved_changes: U hebt wijzigingen die nog niet zijn opgeslagen.
         Om op te slaan in Potlatch 2 moet u op "Opslaan" klikken.
@@ -1585,7 +1573,7 @@ nl:
       edit: Bewerken
       preview: Voorvertoning
     markdown_help:
-      title_html: Verwerkt met <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Verwerkt met <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Kopjes
       heading: Kopje
       subheading: Onderkop
@@ -1696,7 +1684,7 @@ nl:
       description: Recente GPS-trackuploads bekijken
       tagged_with: ' gelabeld met %{tags}'
       empty_html: Hier is nog niets te zien. <a href='%{upload_link}'>Upload een nieuwe
-        trace</a> of kom meer te weten over GPS tracen op de <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikipagina</a>.
+        trace</a> of kom meer te weten over GPS tracen op de <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikipagina</a>.
     delete:
       scheduled_for_deletion: Trace staat op de lijst voor verwijdering
     make_public:
@@ -1907,13 +1895,13 @@ nl:
         html: |-
           <p>In tegenstelling tot andere kaarten, is OpenStreetMap volledig gemaakt door mensen net als u en iedereen kan correcties maken, en de kaart bijwerken of downloaden en gebruiken.</p>
           <p>Registreer u om te beginnen met bijdragen. We sturen een e-mail om uw registratie te bevestigen.</p>
-      license_agreement: Als u een gebruiker aan wilt maken, moet u akkoord gaan met
-        de <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">voorwaarden
+      license_agreement: Als u een gebruiker wil aanmaken, moet u akkoord gaan met
+        de <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">voorwaarden
         voor bijdragen</a>.
       email address: 'E-mailadres:'
       confirm email address: 'E-mailadres bevestigen:'
-      not displayed publicly: Uw adres wordt niet openbaar gemaakt, zie ons <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
-        title="OSMF privacybeleid met een paragraaf over e-mailadressen">Privacybeleid</a>
+      not displayed publicly: Uw adres wordt niet openbaar gemaakt, zie ons <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
+        title="OSMF privacybeleid met een paragraaf over e-mailadressen">privacybeleid</a>
         voor meer informatie.
       display name: 'Weergavenaam:'
       display name description: Uw openbare gebruikersnaam. U kunt deze later in uw
@@ -1972,7 +1960,7 @@ nl:
       diary: Dagboek
       edits: Bewerkingen
       traces: Traces
-      notes: Opmerkingen bij kaarten
+      notes: Opmerkingen bij kaart
       remove as friend: Vriend verwijderen
       add as friend: Vriend toevoegen
       mapper since: 'Mapper sinds:'
@@ -2034,12 +2022,12 @@ nl:
       email never displayed publicly: (nooit openbaar gemaakt)
       external auth: 'Externe verificatie:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: wat is dit?
       public editing:
         heading: 'Bewerkingen openbaar:'
         enabled: Ingeschakeld. U bent niet anoniem en u kunt bewerken.
-        enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: wat is dit?
         disabled: Uitgeschakeld. U kunt niet bewerken en al uw eerdere bewerkingen
           zijn anoniem.
@@ -2050,8 +2038,8 @@ nl:
           u geen berichten sturen of uw locatie zien. Om uw bewerkingen weer te kunnen
           geven en andere gebruikers in staat te stellen in contact met u te komen,
           kunt u op de onderstaande knop klikken. <b>Sinds de overgang naar versie
-          0.6 van de API kunnen alleen publieke gebruikers de kaartgegevens bewerken</b>
-          (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">meer informatie</a>).<ul><li>Uw
+          0.6 van de API kunnen alleen publieke gebruikers de kaartgegevens bewerken</b>.
+          (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">Meer informatie</a>).<ul><li>Uw
           e-mailadres wordt niet publiek gemaakt door uw bewerkingen publiek te maken.</li><li>Deze
           handeling kan niet ongedaan gemaakt worden en alle nieuwe gebrukers zijn
           nu standaard publiek.</li></ul>
@@ -2172,6 +2160,8 @@ nl:
       not_a_role: '"%{role}" is geen geldige rol.'
       already_has_role: De gebruiker heeft de rol %{role} al.
       doesnt_have_role: De gebruiker heeft de rol %{role} niet.
+      not_revoke_admin_current_user: Kan administratorrol van de huidige gebruiker
+        niet laten vallen.
     grant:
       title: Toekennen rechten bevestigen
       heading: Toekennen rechten bevestigen
@@ -2335,8 +2325,8 @@ nl:
       cancel: Annuleren
       image: Afbeelding
       link: Koppeling of HTML
-      long_link: Koppeling
-      short_link: Korte koppeling
+      long_link: Link
+      short_link: Korte link
       geo_uri: Geo-URI
       embed: HTML
       custom_dimensions: Aangepaste afmetingen instellen
@@ -2366,14 +2356,14 @@ nl:
       base:
         standard: Standaard
         cycle_map: Fietskaart
-        transport_map: Transport Map
+        transport_map: Transportkaart
         hot: Humanitarian
       layers:
         header: Kaartlagen
-        notes: Opmerkingen bij kaarten
+        notes: Opmerkingen bij kaart
         data: Kaartgegevens
         gps: Openbare GPS-traces
-        overlays: Overlays inschakelen om fouten in de kaart te kunnen identificeren
+        overlays: Overlays inschakelen om fouten in de kaart te helpen identificeren
         title: Lagen
       copyright: © <a href='%{copyright_url}'>bijdragers OpenStreetMap</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Doneer nu</a>
@@ -2397,9 +2387,10 @@ nl:
       new:
         intro: Een fout gezien of ontbreekt er iets? Laat het andere kaartmakers weten
           zodat wij het kunnen oplossen. Verplaats de markering naar de correcte positie
-          en beschrijf het probleem. Vul hier alstublieft geen persoonlijke informatie
-          of informatie van auteursrechtelijk beschermde kaarten of mappenlijsten
-          in.
+          en beschrijf het probleem.
+        advice: Deze melding is publiek en kan gebruikt worden om de kaart bij te
+          werken. Vul hier dus geen persoonlijke informatie in, en ook geen informatie
+          uit kaarten of telefoonboeken waar auteursrechtelijke bescherming op rust.
         add: Opmerking toevoegen
       show:
         anonymous_warning: In deze opmerking staan reacties van anonieme gebruikers
@@ -2412,16 +2403,16 @@ nl:
     edit_help: Verplaats de kaar en zoom in op een plaats die u wilt bewerken. Klik
       er daarna op.
     directions:
+      ascend: Bergop
       engines:
-        graphhopper_bicycle: Fietsen (GraphHopper)
-        graphhopper_foot: Lopen (GraphHopper)
-        mapquest_bicycle: Fietsen (MapQuest)
+        graphhopper_bicycle: Fiets (GraphHopper)
+        graphhopper_car: Auto (GraphHopper)
+        graphhopper_foot: Te voet (GraphHopper)
+        mapquest_bicycle: Fiets (MapQuest)
         mapquest_car: Auto (MapQuest)
-        mapquest_foot: Lopen (MapQuest)
+        mapquest_foot: Te voet (MapQuest)
         osrm_car: Auto (OSRM)
-        mapzen_bicycle: Fietsen (Mapzen)
-        mapzen_car: Auto (Mapzen)
-        mapzen_foot: Lopen (Mapzen)
+      descend: Bergaf
       directions: Routebeschrijving
       distance: Afstand
       errors:
index 4a7cc09d8932a9df6978c3fa9fb80838e3492d1f..ff7b1100a44fbc05f8fdb74be66a0de13c2acc0e 100644 (file)
@@ -109,9 +109,11 @@ nn:
     created: Oppretta
     closed: Attlaten
     created_html: Oppretta for <abbr title='%{title}'>%{time} sidan</abbr>
+    closed_html: Stengt <abbr title='%{title}'>%{time} sidan</abbr>
     created_by_html: Oppretta for <abbr title='%{title}'>%{time} sidan</abbr> av %{user}
     deleted_by_html: Sletta for <abbr title='%{title}'>%{time} sidan</abbr> av %{user}
     edited_by_html: Redigert for <abbr title='%{title}'>%{time} sidan</abbr> av %{user}
+    closed_by_html: Stengt for <abbr title='%{title}'>%{time} sidan</abbr> by %{user}
     version: 'Versjon:'
     anonymous: anonym
     no_comment: (ingen kommentar)
@@ -119,9 +121,12 @@ nn:
     download_xml: Last ned XML
     view_history: Vis historikk
     view_details: Vis detaljar
+    location: 'Plassering:'
     changeset:
       title: Endringssett %{id}
       belongs_to: Skapar
+      node: Punkt (%{count})
+      node_paginated: Punkt (%{x}-%{y} av %{count})
       way: Strekningar (%{count})
       way_paginated: Strekningar (%{x}-%{y} av %{count})
       comment: Kommentarar (%{count})
@@ -130,14 +135,25 @@ nn:
       feed:
         title: Endringssett %{id}
         title_comment: 'Endringssett: %{id} - %{comment}'
+      join_discussion: Logg inn for å vere med i diskusjonen
       discussion: Ordskifte
+    node:
+      title: 'Punkt: %{name}'
+      history_title: 'Punkthistorikk: %{name}'
+    way:
+      title: 'Strekning: %{name}'
+      history_title: 'Strekningshistorikk: %{name}'
+      nodes: Punkt
+      also_part_of:
+        one: delstrekning %{related_ways}
+        other: delstrekningar %{related_ways}
     relation:
       members: Medlemmar
     relation_member:
       entry: '%{type} %{name}'
       entry_role: '%{type} %{name} som %{role}'
       type:
-        node: Node
+        node: Punkt
         way: Veg
         relation: Relasjon
     containing_relation:
@@ -154,7 +170,7 @@ nn:
     timeout:
       sorry: Beklagar, data for %{type} med id %{id} tok for lang tid å hente.
       type:
-        node: node
+        node: punkt
         way: veg
         relation: relasjon
         changeset: endringssett
@@ -164,7 +180,7 @@ nn:
       message_html: Versjon %{version} av denne %{type} kan ikkje visast fordi den
         er blitt maskert. Sjå %{redaction_link} for detaljar.
       type:
-        node: noden
+        node: punkt
         way: vegen
         relation: relasjonen
     start_rjs:
@@ -175,6 +191,7 @@ nn:
       wiki_link:
         key: Wiki-beskrivelsessiden for %{key}-elementet
         tag: Wiki-beskrivelsessiden for %{key}=%{value}-elementet
+      wikidata_link: Elementet %{page} på Wikidata
       wikipedia_link: Artikkelen %{page} på Wikipedia
       telephone_link: Ring %{phone_number}
     note:
@@ -183,6 +200,17 @@ nn:
       description: Skildring
       open_title: 'Uavklart merknad #%{note_name}'
       closed_title: 'Avklart merknad: #%{note_name}'
+      hidden_title: 'Gøymd merknad #%{note_name}'
+      open_by: Oppretta av %{user} <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      open_by_anonymous: Oppretta av anonym <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      commented_by: Kommentar frå %{user} <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      commented_by_anonymous: Kommentar frå anonym <abbr title='%{exact_time}'>%{when}
+        sidan</abbr>
+      closed_by: Løyst av %{user} <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      closed_by_anonymous: Løyst av anonym <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      reopened_by: Reaktivert av %{user} <abbr title='%{exact_time}'>%{when} sidan</abbr>
+      reopened_by_anonymous: Reaktivert av anonym for <abbr title='%{exact_time}'>%{when}
+        sidan</abbr>
     query:
       title: Førespurnadsfunksjonar
       nearby: Nærliggjande funksjonar
@@ -206,6 +234,12 @@ nn:
       title_user: Endringssett av %{user}
       title_friend: Endringssett av venene dine
       title_nearby: Endringssett av naboar
+      empty: Fann ingen endringssett.
+      empty_area: Ingen endringssett i dette området.
+      empty_user: Ingen endringssett av denne brukaren.
+      no_more: Fann ingen fleire endringssett.
+      no_more_area: Ingen fleire endringssett i dette området.
+      no_more_user: Ingen fleire endringssett av denne brukaren.
       load_more: Last inn meir
     timeout:
       sorry: Lista over endringssett tok for lang tid å hente.
@@ -330,6 +364,9 @@ nn:
         osm_nominatim: Resultat frå <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultat frå <a href="http://www.geonames.org/">GeoNames</a>
+        osm_nominatim_reverse: Resultat frå <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames_reverse: Resultat frå <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
       prefix_format: '%{name}'
       prefix:
@@ -348,6 +385,7 @@ nn:
           taxiway: Taksebane
           terminal: Terminal
         amenity:
+          animal_shelter: Dyrehospits
           arts_centre: Kunstsenter
           atm: Minibank
           bank: Bank
@@ -356,7 +394,7 @@ nn:
           bench: Benk
           bicycle_parking: Sykkelparkering
           bicycle_rental: Sykkelutleige
-          biergarten: Ølhage
+          biergarten: Uteservering
           boat_rental: Båtutleige
           brothel: Bordell
           bureau_de_change: Vekslingskontor
@@ -367,6 +405,7 @@ nn:
           car_wash: Bilvask
           casino: Kasino
           charging_station: Ladestation
+          childcare: Barnepass
           cinema: Kino
           clinic: Klinikk
           clock: Klokke
@@ -376,33 +415,26 @@ nn:
           crematorium: Krematorium
           dentist: Tannlege
           doctors: Legar
-          dormitory: Sovesal
           drinking_water: Drikkevatn
           driving_school: Køyreskule
           embassy: Ambassade
-          emergency_phone: Nødtelefon
           fast_food: Hurtigmat
           ferry_terminal: Ferjeterminal
-          fire_hydrant: Brannhydrant
           fire_station: Brannstasjon
           food_court: Serveringsstadar
           fountain: Fontene
           fuel: Drivstoff
           gambling: Gambling
           grave_yard: Gravlund
-          gym: Treningssenter
-          health_centre: Helsesenter
           hospital: Sjukehus
           hunting_stand: Jaktbod
           ice_cream: Iskrem
           kindergarten: Barnehage
           library: Bibliotek
-          market: Marknad
           marketplace: Marknadsplass
           monastery: Kloster
           motorcycle_parking: Motorsykkelparkering
           nightclub: Nattklubb
-          nursery: Førskule
           nursing_home: Pleieheim
           office: Kontor
           parking: Parkeringsplass
@@ -416,7 +448,6 @@ nn:
           prison: Fengsel
           pub: Pub
           public_building: Offentleg bygning
-          reception_area: Oppsamlingsområde
           recycling: Resirkuleringspunkt
           restaurant: Restaurant
           retirement_home: Gamleheim
@@ -427,6 +458,7 @@ nn:
           shower: Dusj
           social_centre: Samfunnshus
           social_club: Sosial klubb
+          social_facility: Sosialteneste
           studio: Studio
           swimming_pool: Symjebaseng
           taxi: Drosje
@@ -439,6 +471,7 @@ nn:
           veterinary: Veterinærklinikk
           village_hall: Forsamlingshus
           waste_basket: Søppelkasse
+          waste_disposal: Avfallshandtering
           youth_centre: Ungdomssenter
         boundary:
           administrative: Administrativ grense
@@ -510,7 +543,6 @@ nn:
           trunk: Hovedveg
           trunk_link: Hovedveg
           unclassified: Uklassifisert veg
-          unsurfaced: Veg utan dekke
           "yes": Veg
         historic:
           archaeological_site: Arkeologisk plass
@@ -571,10 +603,10 @@ nn:
           road: Vegområde
           village_green: landsbypark
           vineyard: Vingård
+          "yes": Arealbruk
         leisure:
-          beach_resort: Strandsted
+          beach_resort: Badestrand
           bird_hide: Fugletårn
-          club: Klubb
           common: Allmenning
           dog_park: Hundepark
           fishing: Fiskeområde
@@ -625,6 +657,7 @@ nn:
           forest: Skog
           geyser: Geysir
           glacier: Isbre
+          grassland: Grasslette
           heath: Vidde
           hill: Ås
           island: Øy
@@ -637,6 +670,7 @@ nn:
           reef: Rev
           ridge: Rygg
           rock: Stein
+          saddle: Sal
           sand: Sand
           scree: Ur
           scrub: Kratt
@@ -664,8 +698,7 @@ nn:
           travel_agent: Reisebyrå
           "yes": Kontor
         place:
-          block: Blokk
-          airport: Flyplass
+          allotments: Kolonihagar
           city: By
           country: Land
           county: Fylke
@@ -677,7 +710,6 @@ nn:
           islet: Holme
           isolated_dwelling: Ensleg bostad
           locality: Plass
-          moor: Myr
           municipality: Kommune
           neighbourhood: Nabolag
           postcode: Postnummer
@@ -694,10 +726,8 @@ nn:
           abandoned: Forlatt jernbane
           construction: Jernbane under konstruksjon
           disused: Nedlagt jernbane
-          disused_station: Nedlagt jernbanestasjon
           funicular: Kabelbane
           halt: Togstopp
-          historic_station: Historisk jernbanestasjon
           junction: Jernbanekryss
           level_crossing: Planovergang
           light_rail: Bybane
@@ -709,7 +739,8 @@ nn:
           proposed: Føreslått jernbane
           spur: Jernbaneforgrening
           station: Jernbanestasjon
-          subway: T-banestasjon
+          stop: Jernbanestopp
+          subway: T-bane
           subway_entrance: T-baneinngang
           switch: Sporveksel
           tram: Sporveg
@@ -723,6 +754,7 @@ nn:
           beverages: Drikkevarebutikk
           bicycle: Sykkelbutikk
           books: Bokhandel
+          boutique: Luksusforretning
           butcher: Slaktar
           car: Bilbutikk
           car_parts: Bildeler
@@ -736,6 +768,7 @@ nn:
           convenience: Nærbutikk
           copyshop: Kopieringsbutikk
           cosmetics: Kosmetikkforretning
+          deli: Delikatessebutikk
           department_store: Varehus
           discount: Tilbudsbutikk
           doityourself: Gjer-det-sjølv
@@ -752,13 +785,12 @@ nn:
           gallery: Galleri
           garden_centre: Hagesenter
           general: Landhandel
-          gift: Gavebutikk
-          greengrocer: Grønnsakshandel
-          grocery: Dagligvarebutikk
+          gift: Gåvebutikk
+          greengrocer: Grønsakshandel
+          grocery: Daglegvarebutikk
           hairdresser: Frisør
           hardware: Jernvarehandel
           hifi: Hi-fi
-          insurance: Forsikring
           jewelry: Gullsmed
           kiosk: Kiosk
           laundry: Vaskeri
@@ -768,20 +800,19 @@ nn:
           motorcycle: Motorsykkelbutikk
           music: Musikkbutikk
           newsagent: Nyhetsbyrå
-          optician: Optiker
+          optician: Optikar
           organic: Organisk matbutikk
           outdoor: Utandørs butikk
           pet: Dyrebutikk
+          pharmacy: Apotek
           photo: Fotobutikk
-          salon: Salong
           second_hand: Bruktbutikk
           shoes: Skobutikk
-          shopping_centre: Kjøpesenter
           sports: Sportsbutikk
           stationery: Papirbutikk
           supermarket: Supermarked
           tailor: Skreddar
-          toys: Lekebutikk
+          toys: Leikebutikk
           travel_agency: Reisebyrå
           video: Videobutikk
           wine: Utanfor lisens
@@ -808,6 +839,7 @@ nn:
           viewpoint: Utsiktspunkt
           zoo: Dyrepark
         tunnel:
+          culvert: Stikkrenne
           "yes": Tunnel
         waterway:
           artificial: Kunstig vassdrag
@@ -828,6 +860,13 @@ nn:
           waterfall: Foss
           weir: Overløpskant
           "yes": Vassveg
+      admin_levels:
+        level2: Riksgrense
+        level4: Statsgrense
+        level5: Regiongrense
+        level8: Bygrense
+        level9: Landsbygrense
+        level10: Forstadsgrense
     description:
       title:
         osm_nominatim: Posisjon frå <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
@@ -865,6 +904,8 @@ nn:
     edit_with: Rediger med %{editor}
     tag_line: Fritt Wiki-verdenskart
     intro_header: Velkomen til OpenStreetMap!
+    intro_text: OpenStreetMap er eit verdskart, laga av folks som deg, det er ope
+      og gratis å bruke, med ein open lisens.
     intro_2_create_account: Opprett ein brukarkonto
     partners_html: Drifta er støtta av %{ucl}, %{ic}, %{bytemark} og andre %{partners}.
     partners_ucl: UCL VR-senteret
@@ -995,17 +1036,25 @@ nn:
         skjema</a>."
   welcome_page:
     title: Velkomen!
+    whats_on_the_map:
+      title: Kva som finst på kartet
+    basic_terms:
+      title: Grunnleggande termar
     rules:
       title: Reglar!
     questions:
       title: Spørsmål?
     start_mapping: Start kartlegging
+    add_a_note:
+      title: Ikkje tid til å kartleggje sjølv? Legg inn ein merknad.
   fixthemap:
     title: Rapporter eit problem/Korriger kartet
     how_to_help:
       title: Korleis hjelpe til
       join_the_community:
         title: Ver med i fellesskapen
+    other_concerns:
+      title: Andre problemstillingar
   help_page:
     title: Få hjelp
     welcome:
@@ -1013,8 +1062,13 @@ nn:
       title: Velkomen til OSM
     beginners_guide:
       url: http://wiki.openstreetmap.org/wiki/Nn:Beginners%27_guide
+      title: Hjelp for nybegynnarar
+      description: Dugnadsbasert guide for nybegynnarar.
     help:
+      url: https://help.openstreetmap.org/
       title: help.openstreetmap.org
+      description: Still spørsmål eller finn eit svar på spørsmål- og svar-sidene
+        til OSM.
     mailing_lists:
       title: E-postlister
     forums:
@@ -1214,6 +1268,7 @@ nn:
       potlatch2_not_configured: Potlatch 2 har ikkje vorte konfigurert - sjå http://wiki.openstreetmap.org/wiki/The_rails_port
       potlatch2_unsaved_changes: Du har endringar som ikkje er lagra. (For å lagre
         i Potlatch 2, må du klikke lagre.)
+      id_not_configured: iD er ikkje konfigurert
       no_iframe_support: Nettlesaren din støttar ikkje HTML iframes som er naudsynt
         for denne eigenskapen.
     sidebar:
@@ -1221,6 +1276,8 @@ nn:
       close: Lukk
     search:
       search: Søk
+      get_directions: Få køyrerettleiing
+      get_directions_title: Finn vegen mellom to punkt
       from: Frå
       to: Til
       where_am_i: Kor er eg?
@@ -1421,6 +1478,8 @@ nn:
       heading: GPX-lagring er utilgjengelig
       message: Systemet for opplasting og lagring av GPX-filer er ikkje tilgjengeleg
         for augneblunken.
+    georss:
+      title: OpenStreetMap GPS-spor
     description:
       description_without_count: GPX-fil frå %{user}
   application:
@@ -1437,6 +1496,7 @@ nn:
         men du må lese dei.
   oauth:
     oauthorize:
+      title: Autoriser tilgang til kontoen din
       request_access: Applikasjonen %{app_name} ber om tilgjenge til kontoen din,
         %{user}. Sjekk om du vil at applikasjonen skal ha følgjande løyve. Du kan
         velje så mange eller så få som du vil.
@@ -1449,6 +1509,14 @@ nn:
       allow_write_gpx: laste opp GPS-spor.
       allow_write_notes: endre notisar.
       grant_access: Gje tilgang
+    oauthorize_success:
+      title: Autorisasjonsførespurnad tillaten
+      allowed: Du har gitt programmet %{app_name} tilgang til kontoen din.
+      verification: Stadfestingskoden er %{code}.
+    oauthorize_failure:
+      title: Mislykka førespurnad om autorisering
+      denied: Du har nekta programmet %{app_name} tilgang til kontoen din.
+      invalid: Autoriseringsnykelen (token) er ikkje gyldig.
     revoke:
       flash: Du sletta nøkkelen for %{application}
   oauth_clients:
@@ -1525,6 +1593,7 @@ nn:
       register now: Registrer deg no
       with username: 'Har du allereie ein OpenStreetMap-konto? Logg inn med brukernavnet
         og passordet ditt:'
+      with external: 'Alternativt kan du bruke ein tredjepart til å logge inn:'
       new to osm: Ny på OpenStreetMap?
       to make changes: For å gjere endringar på OpenStreetMap-data, må du ha ein konto.
       create account minute: Opprett ein konto. Det tek berre eitt minutt.
@@ -1932,6 +2001,8 @@ nn:
     helper:
       time_future: Sluttar om %{time}.
       until_login: Aktiv inntil brukaren loggar inn.
+      time_future_and_until_login: Sluttar om %{time} og etter at brukaren har logga
+        inn.
       time_past: Slutta %{time} sidan.
     blocks_on:
       title: Blokkeringar av %{name}
@@ -1965,10 +2036,16 @@ nn:
       commented_at_by_html: Oppdatert for %{when} sidan av %{user}
       closed_at_html: Løyst for %{when} sidan
       closed_at_by_html: Løyst for %{when} sidan av %{user}
+      reopened_at_html: Reaktivert for %{when} sidan
+      reopened_at_by_html: Reaktivert %{when} sidan av %{user}
+    rss:
+      title: OpenStreetMap-merknadar
     entry:
       comment: Kommentar
       full: Fullstendig merknad
     mine:
+      heading: '%{user} sine merknadar'
+      subheading: Merknadar sendt inn eller kommentert av %{user}
       id: ID
       creator: Skapar
       description: Skildring
@@ -1986,19 +2063,30 @@ nn:
       short_link: Kortlenkje
       geo_uri: Geo-URI
       embed: HTML
+      custom_dimensions: Still inn eigendefinerte dimensjonar
       format: 'Format:'
       scale: 'Skala:'
+      image_size: Bildet vil vise standard lag ved
       download: Last ned
       short_url: Kort-URL
       include_marker: Inkluder markør
+      center_marker: Sentrer kartet på markøren
+      paste_html: Lim inn HTML for å publisere på ei nettside
       view_larger_map: Vis større kart
+      only_standard_layer: Berre standardlaget kan eksporterast som bilde
+    embed:
+      report_problem: Rapporter eit problem
     key:
       title: Kartsymbol
       tooltip: Kartsymbol
+      tooltip_disabled: Kartnøkkel ikkje tilgjengeleg for dette laget
     map:
       zoom:
         in: Vis større
         out: Vis mindre
+      locate:
+        title: Vis plassering
+        popup: Du er innanfor {distance} {unit} frå dette punktet
       base:
         standard: Standard
         cycle_map: Sykkelkart
@@ -2008,24 +2096,37 @@ nn:
         header: Kartlag
         notes: Kartmerknadar
         data: Kartdata
+        gps: Offentlege GPS-sporingar
+        overlays: Aktiver lag for å feilsøke i kartet
         title: Lag
+      copyright: © <a href='%{copyright_url}'>OpenStreetMap bidragsytarar</a>
+      donate_link_text: <a class='donate-attr' href='%{donate_url}'>Doner</a>
     site:
       edit_tooltip: Rediger kartet
       edit_disabled_tooltip: Zoom inn for å redigere kartet
+      createnote_tooltip: Legg til ein merknad på kartet
+      createnote_disabled_tooltip: Zoom inn for å leggje til ein merknad på kartet
+      map_notes_zoom_in_tooltip: Zoom inn for å sjå kartmerknadar
+      map_data_zoom_in_tooltip: Zoom inn for å sjå kartdata
+      queryfeature_tooltip: Førespurnadsfunksjonar
     changesets:
       show:
         comment: Kommentar
         subscribe: Abonnér
         unsubscribe: Avslutt abonnement
         hide_comment: gøym
+        unhide_comment: vis
     notes:
       new:
         add: Legg til merknad
       show:
         hide: Gøym
         resolve: Løys
+        reactivate: Reaktiver
+        comment_and_resolve: Kommenter og løys
         comment: Kommenter
     directions:
+      ascend: Stigande
       engines:
         graphhopper_bicycle: Sykkel (GraphHopper)
         graphhopper_car: Bil (GraphHopper)
@@ -2034,25 +2135,65 @@ nn:
         mapquest_car: Bil (MapQuest)
         mapquest_foot: Til fots (MapQuest)
         osrm_car: Bil (OSRM)
-        mapzen_bicycle: Sykkel (Mapzen)
-        mapzen_car: Bil (Mapzen)
-        mapzen_foot: Til fots (Mapzen)
       descend: Fallande
+      directions: Vegskildringar
       distance: Avstand
+      errors:
+        no_route: Klarte ikkje å finne vegen mellom desse to plassane.
+        no_place: Beklagar - klarte ikkje å finne den plassen.
       instructions:
+        continue_without_exit: Fortset på %{name}
+        slight_right_without_exit: Svak høgresving inn på %{name}
+        offramp_right_without_exit: Ta avkøyrselen til høgre ut på %{name}
+        onramp_right_without_exit: Ta til høgre ut på %{name}
+        endofroad_right_without_exit: Ved slutten av vegen, sving til høgre inn på
+          %{name}
+        merge_right_without_exit: Sving rett inn på %{name}
+        fork_right_without_exit: Ved vegskiljet, ta til høgre inn på %{name}
+        turn_right_without_exit: Ta til høgre inn på %{name}
+        sharp_right_without_exit: Skarp høgresving inn på %{name}
+        uturn_without_exit: U-sving langs %{name}
         sharp_left_without_exit: Skarp venstresving inn på %{name}
         turn_left_without_exit: Ta til venstre inn på %{name}
         offramp_left_without_exit: Ta rampen til venstre til %{name}
+        onramp_left_without_exit: Sving til venstre på rampen inn til %{name}
+        endofroad_left_without_exit: Ved slutten av vegen, sving til venstre inn på
+          %{name}
+        merge_left_without_exit: Flett til venstre inn på %{name}
+        fork_left_without_exit: Ved vegskiljet, ta til venstre inn på %{name}
+        slight_left_without_exit: Svak venstersving inn på %{name}
         via_point_without_exit: (via punkt)
         follow_without_exit: Følg %{name}
         roundabout_without_exit: Ved rundkøyringa, ta til %{name}
+        leave_roundabout_without_exit: Forlat rundkøyringa - %{name}
+        stay_roundabout_without_exit: Ver i rundkøyringa - %{name}
+        start_without_exit: Begynn ved slutten av %{name}
+        destination_without_exit: Nå målet
+        against_oneway_without_exit: Køyr mot einvegskøyring på %{name}
+        end_oneway_without_exit: Slutt på einvegskøyring på %{name}
+        roundabout_with_exit: Ved rundkøyringa, ta avkøyrselen %{exit} mot %{name}
+        turn_left_with_exit: Ved rundkøyringa, ta til venstre inn på %{name}
+        slight_left_with_exit: Ved rundkøyringa, ta til venstre inn på %{name}
+        turn_right_with_exit: Ved rundkøyringa, ta til høgre inn på %{name}
+        slight_right_with_exit: Ved rundkøyringa, ta til høgre inn på %{name}
+        continue_with_exit: Ved rundkøyringa, fortset rett fram på %{name}
         unnamed: namnlaus veg
+        courtesy: Vegskildringar med velvillig løyve frå %{link}
       time: Tid
     query:
       node: Node
       way: Veg
+      relation: Relasjon
+      nothing_found: Ingen treff
+      error: 'Problem med å kontakte %{server}: %{error}'
+      timeout: Tidsavbrot ved kontakt med %{server}
     context:
+      directions_from: Vegskildring herifrå
+      directions_to: Vegskildring hit
+      add_note: Legg til ein merknad her
       show_address: Vis adresse
+      query_features: Søkjefunksjonar
+      centre_map: Sentrer kartet her
   redaction:
     edit:
       description: Skildring
index 692d072be46688679bf7e609c8d2d4336f970c5b..6f246ddd05dcb4d9e8be20f9c8a5f6e49d2ccdef 100644 (file)
@@ -438,33 +438,26 @@ oc:
           crematorium: Crematòri
           dentist: Dentista
           doctors: Mètges
-          dormitory: Dormitòri
           drinking_water: Aiga potabla
           driving_school: Escòla de conduita
           embassy: Ambaissada
-          emergency_phone: Telefòn d'urgéncia
           fast_food: Restauracion rapida
           ferry_terminal: Terminal de ferry
-          fire_hydrant: Boca d'incendi
           fire_station: Casèrna dels pompièrs
           food_court: Airal de restauracion
           fountain: Font
           fuel: Carburant
           gambling: Jòcs d'azard
           grave_yard: Cementèri
-          gym: Fitness /gimnastica
-          health_centre: Centre de santat
           hospital: Espital
           hunting_stand: Taulièr de tir
           ice_cream: Crema glaçada
           kindergarten: Jardin infantil
           library: Bibliotèca
-          market: Mercat
           marketplace: Plaça del mercat
           monastery: Mostièr
           motorcycle_parking: Parcatge de bicicleta
           nightclub: Discotèca
-          nursery: Grépia
           nursing_home: Ostal de santat
           office: Burèu
           parking: Parcatge
@@ -478,7 +471,6 @@ oc:
           prison: Preson
           pub: Bar
           public_building: Bastiment public
-          reception_area: Zòna de recepcion
           recycling: Punt de reciclatge
           restaurant: Restaurant
           retirement_home: Ostal de retirada
@@ -574,7 +566,6 @@ oc:
           trunk: Via exprèssa
           trunk_link: Via exprèssa
           unclassified: Rota menora
-          unsurfaced: Rota sens revestiment
           "yes": Rota
         historic:
           archaeological_site: Site arqueologic
@@ -639,7 +630,6 @@ oc:
         leisure:
           beach_resort: Estacion belneara
           bird_hide: Obsevatòri ornitologic
-          club: Club
           common: Terrens comunals
           dog_park: Parc canin
           fishing: Zòna de pesca
@@ -732,8 +722,6 @@ oc:
           "yes": Burèu
         place:
           allotments: Òrts familials
-          block: Blòt
-          airport: Aeropòrt
           city: Vila
           country: País
           county: Comtat
@@ -745,7 +733,6 @@ oc:
           islet: Illòt
           isolated_dwelling: Abitacion isolada
           locality: Localitat
-          moor: Maura
           municipality: Municipalitat
           neighbourhood: Quartièr
           postcode: Còdi postal
@@ -762,10 +749,8 @@ oc:
           abandoned: Via ferrada abandonada
           construction: Via ferrada en construccion
           disused: Via ferrada desafectada
-          disused_station: Gara desafectada
           funicular: Via de funicular
           halt: Arrèst de tren
-          historic_station: Arrèst de tren istoric
           junction: Jonccion ferroviària
           level_crossing: Passatge de nivèl
           light_rail: Pichona via ferrada
@@ -829,7 +814,6 @@ oc:
           hairdresser: Cofaire
           hardware: Quicalhariá
           hifi: Magazin Hi-Fi
-          insurance: Assegurança
           jewelry: Joielariá
           kiosk: Quiòsque
           laundry: Bugadariá
@@ -845,10 +829,8 @@ oc:
           pet: Animalariá
           pharmacy: Farmàcia
           photo: Magazin de fotografia
-          salon: Salon
           second_hand: Botiga d’ocasions
           shoes: Magazin de cauçaduras
-          shopping_centre: Centre comercial
           sports: Magazin d'espòrt
           stationery: Papetariá
           supermarket: Supermercat
@@ -2088,9 +2070,6 @@ oc:
         mapquest_car: En veitura (MapQuest)
         mapquest_foot: A pè (MapQuest)
         osrm_car: En veitura (OSRM)
-        mapzen_bicycle: A bicicleta (Mapzen)
-        mapzen_car: En veitura (Mapzen)
-        mapzen_foot: A pè (Mapzen)
       descend: Descreissent
       directions: Itineraris
       distance: Distància
index 523c45e899398fb242674015a65efc369e7d4db8..ba517d1514efa374914b702416072c6c5ed2a7c9 100644 (file)
@@ -261,33 +261,26 @@ pa:
           crematorium: ਸ਼ਮਸ਼ਾਨ ਘਾਟ
           dentist: ਦੰਦਾਂ ਦਾ ਡਾਕਟਰ
           doctors: ਡਾਕਟਰ
-          dormitory: ਸਰਾਂ
           drinking_water: ਪੀਣ ਦਾ ਪਾਣੀ
           driving_school: ਡਰਾਈਵਿੰਗ ਸਕੂਲ
           embassy: ਸਫ਼ਾਰਤਖ਼ਾਨਾ
-          emergency_phone: ਐਮਰਜੈਂਸੀ ਫ਼ੋਨ
           fast_food: ਫ਼ਾਸਟ ਫ਼ੂਡ
           ferry_terminal: ਫ਼ੈਰੀ ਟਰਮੀਨਲ
-          fire_hydrant: ਅੱਗ-ਬੁਝਾਊ ਨਲਕਾ
           fire_station: ਅੱਗ-ਬੁਝਾਊ ਸਟੇਸ਼ਨ
           food_court: ਖਾਣਾ ਦਰਬਾਰ
           fountain: ਫ਼ੁਹਾਰਾ
           fuel: ਤੇਲ
           gambling: ਜੂਆ
           grave_yard: ਕਬਰਿਸਤਾਨ
-          gym: ਜਿਮ/ਦਰੁਸਤੀ ਕੇਂਦਰ
-          health_centre: ਸਿਹਤ ਕੇਂਦਰ
           hospital: ਹਸਪਤਾਲ
           hunting_stand: ਸ਼ਿਕਾਰ ਸਟੈਂਡ
           ice_cream: ਆਈਸ ਕਰੀਮ
           kindergarten: ਬਾਲਵਾੜੀ
           library: ਪੁਸਤਕਾਲਾ
-          market: ਮੰਡੀ
           marketplace: ਮੰਡੀ ਦੀ ਥਾਂ
           monastery: ਮੱਠ
           motorcycle_parking: ਮੋਟਰਸਾਈਕਲ ਪਾਰਕਿੰਗ
           nightclub: ਰਾਤ ਦਾ ਕਲੱਬ
-          nursery: ਨਰਸਰੀ
           nursing_home: ਨਰਸਿੰਗ ਹੋਮ
           office: ਦਫ਼ਤਰ
           parking: ਪਾਰਕਿੰਗ
@@ -301,7 +294,6 @@ pa:
           prison: ਜੇਲ੍ਹ
           pub: ਪਬ
           public_building: ਜਨਤਕ ਇਮਾਰਤ
-          reception_area: ਸਵਾਗਤ ਖੇਤਰ
           recycling: ਰੀਸਾਈਕਲ ਬਿੰਦੂ
           restaurant: ਰੈਸਟੋਰੈਂਟ
           retirement_home: ਸੇਵਾ-ਮੁਕਤੀ ਘਰ
@@ -444,7 +436,6 @@ pa:
           village_green: ਪੇਂਡੂ ਹਰਿਆਵਲ
           vineyard: ਅੰਗੂਰਾਂ ਦਾ ਬਾਗ਼
         leisure:
-          club: ਕਲੱਬ
           common: ਸ਼ਾਮਲਾਟ
           dog_park: ਕੁੱਤਾ ਪਾਰਕ
           fishing: ਮੱਛੀ-ਖੋਜ ਇਲਾਕਾ
@@ -525,8 +516,6 @@ pa:
           travel_agent: ਟਰੈਵਲ ਏਜੰਸੀ
           "yes": ਦਫ਼ਤਰ
         place:
-          block: ਬਲਾਕ
-          airport: ਹਵਾਈ ਅੱਡਾ
           city: ਸ਼ਹਿਰ
           country: ਮੁਲਕ
           county: ਰਾਜ
@@ -538,7 +527,6 @@ pa:
           islet: ਛੋਟਾ ਟਾਪੂ
           isolated_dwelling: ਇਕੱਲਾ ਘਰ
           locality: ਮੁਹੱਲਾ
-          moor: ਮੂਰ
           municipality: ਨਗਰਪਾਲਿਕਾ
           neighbourhood: ਗੁਆਂਢ
           postcode: ਡਾਕ-ਕੋਡ
@@ -555,9 +543,7 @@ pa:
           abandoned: ਛੱਡਿਆ ਹੋਇਆ ਰੇਲਵੇ
           construction: ਉਸਾਰੀ ਹੇਠ ਰੇਲਵੇ
           disused: ਵਰਤੋਂ ਤੋਂ ਬਾਹਰ ਰੇਲਵੇ
-          disused_station: ਵਰਤੋਂ ਤੋਂ ਮੁਕਤ ਰੇਲਵੇ ਸਟੇਸ਼ਨ
           halt: ਟਰੇਨ ਸਟਾਪ
-          historic_station: ਇਤਿਹਾਸਕ ਰੇਲਵੇ ਸਟੇਸ਼ਨ
           junction: ਰੇਲਵੇ ਜੰਕਸ਼ਨ
           level_crossing: ਲੈਵਲ ਕਰਾਸਿੰਗ
           light_rail: ਹਲਕੀ ਰੇਲ
@@ -614,7 +600,6 @@ pa:
           hairdresser: ਵਾਲ ਤਿਆਰ ਕਰਨ ਵਾਲਾ
           hardware: ਹਾਰਡਵੇਅਰ ਸਟੋਰ
           hifi: ਹਾਈ-ਫ਼ਾਈ
-          insurance: ਬੀਮਾ
           jewelry: ਗਹਿਣਿਆਂ ਦੀ ਦੁਕਾਨ
           kiosk: ਖੋਖਾ
           laundry: ਧੋਬੀਘਾਟ
@@ -630,9 +615,7 @@ pa:
           pet: ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੀ ਦੁਕਾਨ
           pharmacy: ਦਵਾਖ਼ਾਨਾ
           photo: ਤਸਵੀਰਾਂ ਦੀ ਦੁਕਾਨ
-          salon: ਦੀਵਾਨਖ਼ਾਨਾ
           shoes: ਜੁੱਤੀਆਂ ਦੀ ਦੁਕਾਨ
-          shopping_centre: ਖ਼ਰੀਦਦਾਰੀ ਕੇਂਦਰ
           sports: ਖੇਡਾਂ ਦੀ ਦੁਕਾਨ
           stationery: ਸਟੇਸ਼ਨਰੀ ਦੀ ਦੁਕਾਨ
           supermarket: ਸੁਪਰਮਾਰਕਿਟ
index 895517a7fa27a80c9c2f2d59745dcd84ff9fe22b..8b7dac63b797ea7bf40e59255976f13beea28ed2 100644 (file)
@@ -124,19 +124,19 @@ pl:
     with_version: '%{id}, wersja %{version}'
     with_name_html: '%{name}(%{id})'
   editor:
-    default: Domyślnie (obecnie %{name})
+    default: edytorze domyślnym (obecnie %{name})
     potlatch:
       name: Potlatch 1
       description: Potlatch 1 (w przeglądarce)
     id:
       name: iD
-      description: iD (w przeglądarce)
+      description: iD (w tej przeglądarce)
     potlatch2:
       name: Potlatch 2
-      description: Potlatch 2 (w przeglądarce)
+      description: Potlatch 2 (w tej przeglądarce)
     remote:
       name: Zewnętrzny edytor
-      description: Zewnętrzny edytor (JOSM lub Merkaartor)
+      description: zewnętrznym edytorze (JOSM lub Merkaartor)
   browse:
     created: Utworzone
     closed: Zamknięte
@@ -175,6 +175,8 @@ pl:
         title_comment: Zestaw zmian %{id} - %{comment}
       join_discussion: Zaloguj się, aby dołączyć do dyskusji
       discussion: Dyskusja
+      still_open: Zestaw zmian jest wciąż otwarty - dyskusja będzie możliwa, gdy zostanie
+        on zamknięty.
     node:
       title: 'Węzeł: %{name}'
       history_title: 'Historia węzła: %{name}'
@@ -218,9 +220,9 @@ pl:
         note: Uwaga
     redacted:
       redaction: Poprawka %{id}
-      message_html: Ten %{type} w wersji %{version} nie może zostać wyświetlony, ponieważ
-        został poprawiony. Proszę zapoznać się z %{redaction_link}, aby uzyskać więcej
-        informacji.
+      message_html: '%{type} w wersji %{version} nie może zostać wyświetlony z powodu
+        ocenzurowania. Proszę zapoznać się z %{redaction_link}, aby uzyskać więcej
+        informacji.'
       type:
         node: węzeł
         way: linia
@@ -241,12 +243,12 @@ pl:
     note:
       title: 'Uwaga: %{id}'
       new_note: Nowa uwaga
-      description: Opis
+      description: 'Opis:'
       open_title: 'Nierozwiązana uwaga #%{note_name}'
       closed_title: 'Rozwiązana uwaga #%{note_name}'
       hidden_title: 'Ukryta uwaga #%{note_name}'
       open_by: 'Utworzona przez: %{user} <abbr title=''%{exact_time}''>%{when} temu</abbr>'
-      open_by_anonymous: Utworzona anonimowo <abbr title='%{exact_time}'>%{when} temu</abbr>
+      open_by_anonymous: Utworzona anonimowo <abbr title='%{exact_time}'>%{when} temu.</abbr>
       commented_by: Komentarz od %{user} <abbr title='%{exact_time}'>%{when} temu</abbr>
       commented_by_anonymous: Skomentowana anonimowo <abbr title='%{exact_time}'>%{when}
         temu</abbr>
@@ -261,7 +263,7 @@ pl:
       hidden_by: Ukryte przez %{user} <abbr title='%{exact_time}'>%{when} temu</abbr>
     query:
       title: Dane obiektu
-      introduction: Kliknij na mapie, by wyszukać obiekty w pobliżu.
+      introduction: Kliknij na mapie, by wyszukać pobliskie obiekty.
       nearby: Obiekty w pobliżu
       enclosing: Większe, otaczające obiekty
   changeset:
@@ -387,7 +389,7 @@ pl:
       map_image: Obraz mapy (standardowa warstwa)
       embeddable_html: Kod HTML do osadzenia
       licence: Licencja
-      export_details: Dane OpenStreetMap udostępnione są na licencji <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: Dane OpenStreetMap udostępnione są na licencji <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a> (ODbL).
       too_large:
         advice: 'Jeśli eksportowanie się nie uda, proszę rozważyć użycie jednego z
@@ -427,14 +429,14 @@ pl:
   geocoder:
     search:
       title:
-        latlon: Wyniki z <a href="http://openstreetmap.org/">Internal</a>
+        latlon: Wyniki z <a href="https://openstreetmap.org/">Internal</a>
         uk_postcode: Wyniki z <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Wyniki z <a href="http://geocoder.ca/">Geocoder.CA</a>
+        ca_postcode: Wyniki z <a href="https://geocoder.ca/">Geocoder.CA</a>
         osm_nominatim: Wyniki z <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Wyniki z <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Wyniki z <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Wyniki z <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Wyniki z <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -446,6 +448,7 @@ pl:
           drag_lift: Wyciąg orczykowy
           gondola: Kolej gondolowa
           station: Stacja wyciągu krzesełkowego
+          t-bar: Wyciąg orczykowy
         aeroway:
           aerodrome: Lotnisko
           apron: Płyta postojowa
@@ -485,37 +488,31 @@ pl:
           crematorium: Krematorium
           dentist: Gabinet dentystyczny
           doctors: Lekarze
-          dormitory: Akademik/internat
           drinking_water: Źródło wody pitnej
           driving_school: Szkoła nauki jazdy
           embassy: Ambasada
-          emergency_phone: Telefon alarmowy
           fast_food: Bar (fast food)
           ferry_terminal: Terminal promowy
-          fire_hydrant: Hydrant
           fire_station: Remiza strażacka
           food_court: Współdzielone miejsce do spożywania posiłków
           fountain: Fontanna
           fuel: Stacja paliw
           gambling: Hazard
           grave_yard: Cmentarz przykościelny
-          gym: Centrum Fitness / Sala Gimnastyczna
-          health_centre: Ośrodek zdrowia
           hospital: Szpital
           hunting_stand: Ambona myśliwska
           ice_cream: Lodziarnia
           kindergarten: Przedszkole/żłobek
           library: Biblioteka
-          market: Targowisko
           marketplace: Plac targowy
           monastery: Klasztor
           motorcycle_parking: Parking dla motocykli
           nightclub: Klub nocny
-          nursery: Żłobek
           nursing_home: Dom opieki
           office: Biuro
           parking: Parking
           parking_entrance: Wjazd na parking
+          parking_space: Miejsce parkingowe
           pharmacy: Apteka
           place_of_worship: Miejsce kultu
           police: Policja lub straż miejska/gminna
@@ -525,12 +522,11 @@ pl:
           prison: Więzienie/areszt
           pub: Pub
           public_building: Budynek publiczny
-          reception_area: Recepcja
           recycling: Miejsce recyklingu
           restaurant: Restauracja
           retirement_home: Dom seniora
           sauna: Sauna
-          school: Szkoła podstawowa, gimnazjum lub liceum
+          school: Szkoła podstawowa/średnia
           shelter: Schronienie
           shop: Sklep
           shower: Prysznic
@@ -586,11 +582,13 @@ pl:
           bus_guideway: Droga dla autobusów
           bus_stop: Przystanek autobusowy
           construction: Droga w trakcie budowy
+          corridor: Korytarz
           cycleway: Droga rowerowa
           elevator: Winda
           emergency_access_point: Miejsce zbiórki ewakuacyjnej
           footway: Droga dla pieszych
           ford: Bród
+          give_way: Znak drogowy "Ustąp pierwszeństwa przejazdu"
           living_street: Strefa zamieszkania (znak D-40)
           milestone: Słupek pikietażowy
           motorway: Autostrada
@@ -612,6 +610,7 @@ pl:
           services: Miejsce Obsługi Podróżnych
           speed_camera: Fotoradar
           steps: Schody
+          stop: Znak drogowy "Stop"
           street_lamp: Lampa uliczna
           tertiary: Droga trzeciorzędna
           tertiary_link: Droga trzeciorzędna - łącznik
@@ -621,10 +620,9 @@ pl:
           trunk: Droga główna/ekspresowa
           trunk_link: Droga główna/ekspresowa – dojazd
           unclassified: Droga czwartorzędna
-          unsurfaced: Droga polna lub leśna
           "yes": Droga
         historic:
-          archaeological_site: Wykopaliska archeologiczne
+          archaeological_site: Stanowisko archeologiczne
           battlefield: Miejsce historycznej bitwy
           boundary_stone: Graniczny głaz
           building: Budynek historyczny
@@ -634,7 +632,7 @@ pl:
           city_gate: Brama miasta
           citywalls: Mury miejskie
           fort: Fort
-          heritage: Miejsce dziedzictwa
+          heritage: Miejsce dziedzictwa kulturalnego
           house: Dom
           icon: Ikona
           manor: Dwór
@@ -657,7 +655,7 @@ pl:
           brownfield: Grunty poprzemysłowe
           cemetery: Cmentarz
           commercial: Obszar handlowo-usługowy
-          conservation: Konserwacja
+          conservation: Ochrona środowiska
           construction: Teren budowy
           farm: Farma
           farmland: Grunty rolne
@@ -682,11 +680,10 @@ pl:
           road: Obszar drogowy
           village_green: Nawsie
           vineyard: Winnica
-          "yes": Przeznaczenie terenu
+          "yes": Zagospodarowanie terenu
         leisure:
           beach_resort: Strzeżona plaża
           bird_hide: Ukryj ptaki
-          club: Klub
           common: Błonie
           dog_park: Park dla psów
           fishing: Łowisko
@@ -713,9 +710,23 @@ pl:
           water_park: Park wodny
           "yes": Rekreacja
         man_made:
+          adit: Szyb
+          beehive: Ul
+          breakwater: Falochron
+          bridge: Most
+          chimney: Komin
+          crane: Żuraw (dźwig)
+          dyke: Grobla
           lighthouse: Latarnia morska
+          mine: Kopalnia
+          pier: Molo/pomost
           pipeline: Rurociąg
           tower: Wieża
+          wastewater_plant: Oczyszczalnia ścieków
+          watermill: Młyn wodny
+          water_tower: Wieża ciśnień
+          water_well: Studnia
+          water_works: Wodociągi
           works: Fabryka
           "yes": Sztuczny
         military:
@@ -779,8 +790,6 @@ pl:
           "yes": Biuro
         place:
           allotments: Ogródki działkowe
-          block: Blok
-          airport: Lotnisko
           city: Miasto
           country: Kraj
           county: Powiat
@@ -792,12 +801,12 @@ pl:
           islet: Wysepka
           isolated_dwelling: Pojedynczy dom-gospodarstwo
           locality: Miejsce nazwane
-          moor: Wrzosowisko
           municipality: Gmina
           neighbourhood: Sąsiedztwo
           postcode: Kod pocztowy
           region: Rejon
           sea: Morze
+          square: Plac
           state: Województwo/stan/prowincja
           subdivision: Dzielnica
           suburb: Osiedle
@@ -809,10 +818,8 @@ pl:
           abandoned: Dawna linia kolejowa
           construction: Budowana linia kolejowa
           disused: Nieczynna linia kolejowa
-          disused_station: Nieczynna stacja kolejowa
           funicular: Kolejka linowa
           halt: Przystanek kolejowy
-          historic_station: Historyczna stacja kolejowa
           junction: Węzeł kolejowy
           level_crossing: Przejazd kolejowy
           light_rail: Lekka kolej
@@ -876,7 +883,6 @@ pl:
           hairdresser: Fryzjernia
           hardware: Sklep ze sprzętem
           hifi: Hi-Fi
-          insurance: Agent ubezpieczeniowy
           jewelry: Sklep z biżuterią
           kiosk: Kiosk
           laundry: Pralnia
@@ -889,21 +895,22 @@ pl:
           optician: Optyk
           organic: Sklep z produktami organicznymi
           outdoor: Sklep turystyczny
+          pawnbroker: Lombard
           pet: Sklep ze zwierzętami
           pharmacy: Apteka
           photo: Sklep fotograficzny
-          salon: Salon
+          seafood: Owoce morza
           second_hand: Lumpeks
           shoes: Sklep obuwniczy
-          shopping_centre: Centrum handlowe
           sports: Sklep sportowy
           stationery: Sklep papierniczy
           supermarket: Supermarket
           tailor: Krawiec
           toys: Sklep z zabawkami
           travel_agency: Biuro podróży
+          vacant: Sklep zamknięty
           video: Sklep filmowy
-          wine: Winiarnia
+          wine: Sklep z winami
           "yes": Sklep
         tourism:
           alpine_hut: Chata alpejska
@@ -958,7 +965,7 @@ pl:
         level10: Granica przedmieścia
     description:
       title:
-        osm_nominatim: Położenie według <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Położenie według <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Położenie według <a href="http://www.geonames.org/">Geonames</a>
       types:
@@ -1035,8 +1042,8 @@ pl:
     legal_babble:
       title_html: Prawa autorskie i&nbsp;licencja
       intro_1_html: |-
-        OpenStreetMap<sup><a href="#trademarks">®</a></sup> to projekt <i>open data</i>, rozpowszechniany na licencji <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) przez <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        OpenStreetMap<sup><a href="#trademarks">®</a></sup> to projekt <i>open data</i>, rozpowszechniany na licencji <a href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) przez <a
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: Możesz swobodnie kopiować, rozpowszechniać, przekazywać innym
         i dostosowywać nasze dane, pod warunkiem podania OpenStreetMap i jego autorów
         jako źródło. Jeśli zmienisz, przekształcisz lub wykorzystasz nasze dane, wynik
@@ -1143,26 +1150,27 @@ pl:
       title: Podstawowe Zasady Mapowania
       paragraph_1_html: OpenStreetMap ma własny slang. Oto kilka słów które ci się
         przydadzą.
-      editor_html: <strong>Edytor</strong> to program lub strona która pozwala na
+      editor_html: <strong>Edytor</strong> to program lub strona, która pozwala na
         edycję mapy.
       node_html: <strong>Węzeł</strong> to punkt na mapie, np. latarnia lub drzewo.
       way_html: <strong>Linia</strong> to droga lub obszar, np. ulica, rzeka, jezioro
         lub budynek.
-      tag_html: <strong>Tag</strong> to część danych opisująca linię lub węzeł, np.
-        Nazwa ulicy lub jej  ograniczenie prędkości.
+      tag_html: <strong>Znacznik</strong> to część danych opisująca linię lub węzeł,
+        np. nazwa restauracji lub ograniczenie prędkości dla drogi.
     rules:
       title: Zasady!
-      paragraph_1_html: W OpenStreetMap jest kilka formalnych zasad, ale spodziewamy
-        się, że wszyscy uczestnicy będą współpracować i komunikować się ze społecznością.
+      paragraph_1_html: W OpenStreetMap jest kilka formalnych zasad, ale oczekujemy,
+        że wszyscy uczestnicy będą współpracować i komunikować się ze społecznością.
         Jeśli planujesz jakieś działania inne niż same edycje manualne, proszę przeczytaj
-        i dostosuj się do zaleceń dotyczących <a href="http://wiki.openstreetmap.org/wiki/Import/Guidelines">wytycznych</a>
-        i <a href="http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">automatycznych
+        i dostosuj się do zaleceń dotyczących <a href="http://wiki.openstreetmap.org/wiki/Import/Guidelines">importów</a>
+        oraz <a href="http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">zautomatyzowanych
         edycji</a>.
     questions:
-      title: Jakieś pytania?
+      title: Czy masz jakieś pytania?
       paragraph_1_html: OpenStreetMap ma wiele zasobów pomocnych w poznawaniu projektu,
-        pozwalających na otrzymywanie odpowiedzi na pytania oraz dyskutowanie i dokumentowanie
-        tematów związanych z mapowaniem. <a href='%{help_url}'>Pomoc uzyskasz tutaj</a>.
+        pozwalających na zadawanie pytań i otrzymywanie na nie odpowiedzi, oraz na
+        dyskutowanie i dokumentowanie tematów związanych z mapowaniem. <a href='%{help_url}'>Tutaj
+        uzyskasz pomoc</a>.
     start_mapping: Rozpocznij mapowanie
     add_a_note:
       title: Nie masz czasu na edycję? Dodaj uwagę!
@@ -1184,9 +1192,9 @@ pl:
           własnoręcznie.
       add_a_note:
         instructions_html: Wystarczy, że klikniesz na <a class='icon note'></a> lub
-          taką samą ikonkę na mapie. Pojawi się wtedy znacznik, który możesz przesunąć
-          przez przeciągnięcie. Dodaj wiadomość, kliknij Zapisz, a inni maperzy zajmą
-          się problemem.
+          taką samą ikonkę na mapie. Pojawi się wtedy pinezka, którą możesz przesunąć
+          przeciągając. Wpisz wiadomość, kliknij Zapisz, a inni mapujący zajmą się
+          opisanym problemem.
     other_concerns:
       title: Inne kwestie
       explanation_html: "Jeśli masz obawy o jak nasze dane są używane lub zawartość
@@ -1205,7 +1213,7 @@ pl:
     beginners_guide:
       url: http://wiki.openstreetmap.org/wiki/Pl:Beginners%27_guide
       title: Podręcznik dla początkujących
-      description: Społeczność wspiera podręcznik dla początkujących.
+      description: Podręcznik dla początkujących tworzony przez społeczność.
     help:
       url: https://help.openstreetmap.org/
       title: Strona Pomocy OpenStreetMap
@@ -1226,7 +1234,7 @@ pl:
       description: Pomoc firmom i organizacjom w przejściu do mapy OpenStreetMap i
         inne usługi.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/Pl:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/Pl:Main_Page
       title: Wiki OpenStreetMap
       description: Zapoznaj się z wiki, aby uzyskać szczegółową dokumentację OSM.
   about_page:
@@ -1240,10 +1248,14 @@ pl:
     local_knowledge_html: OpenStreetMap wyróżnia wiedzę lokalną. Członkowie używają
       zdjęć satelitarnych, lotniczych, nawigacji GPS, i zwykłych map aby zweryfikować
       czy dane w OSM są dokładne i aktualne.
-    community_driven_title: Kontrolowany przez społeczność
+    community_driven_title: Zarządzany przez społeczność
     community_driven_html: |-
-      Społeczność OpenStreetMap - urozmaicona, z pasją i rosnąca każdego dnia. Wśród naszych użytkowników są entuzjaści map, specjaliści GIS, inżynierowie wspomagający pracę serwerów OSM, specjaliści, którzy z humanistycznych powodów, pomagają w stworzeniu mapy obszarów dotkniętych skutkami klęski żywiołowej, i wielu innych.
-       Aby dowiedzieć się więcej na temat wspólnoty, odwiedź <a href='%{diary_path}'>blogi użytkowników</a>, <a href='http://blogs.openstreetmap.org/'>blogi społeczności</a>, <a href='http://www.osmfoundation.org/'>stronę fundacji OSM</a> oraz <a href='http://openstreetmap.org.pl'>stronę OSM Polska</a>.
+      Społeczność OpenStreetMap jest różnorodna, zaangażowana i każdego dnia coraz większa. Wśród edytujących mapę są amatorscy kartografowie, specjaliści GIS, inżynierowie odpowiadający za pracę serwerów OSM, osoby tworzące mapy obszarów dotkniętych klęskami żywiołowej dla potrzeb służb ratunkowych oraz wielu innych ludzi.
+       Aby dowiedzieć się więcej na temat wspólnoty, odwiedź
+      <a href='https://blog.openstreetmap.org'>Blog OpenStreetMap</a>,
+      <a href='%{diary_path}'>blogi użytkowników</a>,
+      <a href='https://blogs.openstreetmap.org/'>blogi społeczności</a> oraz
+      <a href='https://openstreetmap.org.pl'>stronę OSM Polska</a>.
     open_data_title: Otwarte dane
     open_data_html: 'OpenStreetMap to <i>otwarte dane</i>: możesz używać ich jak tylko
       chcesz pod warunkiem, że dodasz, że pochodzą one z  OpenStreetMap i jego członków.
@@ -1252,8 +1264,8 @@ pl:
       autorskie i licencja</a> by zobaczyć szczegóły.'
     legal_title: Pytania prawne
     legal_html: |-
-      Ta strona internetowa i inne usługi z tym związane prowadzone są formalnie przez <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) w imieniu społeczeństwa. Korzystanie z wszystkich usług OSMF jest regulowane przez <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
-      Politykę użytkowania</a> i naszą <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politykę prywatności</a>.<br>Proszę, <a href="http://osmfoundation.org/Contact">skontaktuj się z OSMF</a>, jeśli masz problem z licencjami, prawami autorskimi lub innymi prawnymi problemami.
+      Ta strona internetowa i inne usługi z tym związane prowadzone są oficjalnie przez <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) w imieniu społeczności. Korzystanie z wszystkich usług OSMF jest regulowane przez <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+      Politykę użytkowania</a> i naszą <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politykę prywatności</a>.<br>Proszę, <a href="http://osmfoundation.org/Contact">skontaktuj się z OSMF</a>, jeśli masz pytania odnośnie licencji, praw autorskich lub innych prawnych zagadnień i problemów.
     partners_title: Partnerzy
   notifier:
     diary_comment_notification:
@@ -1491,13 +1503,13 @@ pl:
       get_directions_title: Wyznacza trasę pomiędzy dwoma punktami
       from: Początek trasy
       to: Koniec trasy
-      where_am_i: Gdzie jestem?
+      where_am_i: Gdzie teraz jestem?
       where_am_i_title: Określ obecną lokalizację przy użyciu wyszukiwarki
       submit_text: →
     key:
       table:
         entry:
-          motorway: autostrada
+          motorway: Autostrada
           main_road: Główna droga
           trunk: Droga główna
           primary: Droga pierwszorzędna
@@ -1552,14 +1564,14 @@ pl:
           - Szkoła
           - uniwersytet
           building: Ważny budynek
-          station: stacja kolejowa
+          station: Stacja kolejowa
           summit:
           - Góra
           - szczyt
           tunnel: Kreskowany obrys – tunel
           bridge: Czarny obrys – most
-          private: Wstęp prywatny
-          destination: Dostęp do punktu docelowego
+          private: Dostęp za zezwoleniem
+          destination: Dostęp tylko do punktu docelowego
           construction: Drogi w budowie
           bicycle_shop: Sklep rowerowy
           bicycle_parking: postój dla rowerów
@@ -1891,7 +1903,7 @@ pl:
         html: <p>W przeciwieństwie do innych map, OpenStreetMap jest całkowicie tworzone
           przez ludzi takich jak ty. Wszyscy mogą tu wprowadzać poprawki i aktualizacje
           oraz pobierać i używać map za darmo.</p>
-      license_agreement: Zakładając konto użytkownika wyrażasz zgodę na <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">Warunki
+      license_agreement: Zakładając konto użytkownika wyrażasz zgodę na <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">Warunki
         uczestnictwa</a>.
       email address: 'Adres e-mail:'
       confirm email address: 'Potwierdzenie adresu e-mail:'
@@ -2021,12 +2033,12 @@ pl:
       email never displayed publicly: (nie jest wyświetlany publicznie)
       external auth: 'Zewnętrzne uwierzytelnienie:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/PL:OpenID
+        link: https://wiki.openstreetmap.org/wiki/PL:OpenID
         link text: co to jest?
       public editing:
         heading: 'Edycje publiczne:'
         enabled: Włączone. Nie anonimowy i uprawniony do edycji danych.
-        enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
         enabled link text: co to jest?
         disabled: Wyłączone i nieuprawniony do edycji danych, wszystkie wcześniejsze
           edycje są anonimowe.
@@ -2052,7 +2064,7 @@ pl:
         link text: co to jest?
       profile description: 'Opis profilu:'
       preferred languages: 'Preferowane języki:'
-      preferred editor: 'Preferowany edytor:'
+      preferred editor: 'Preferowane edytowanie w:'
       image: 'Obraz:'
       gravatar:
         gravatar: Użycie Gravatara
@@ -2352,7 +2364,7 @@ pl:
         in: Przybliż
         out: Oddal
       locate:
-        title: Wyświetl aktualne położenie
+        title: Wyświetl dla mojego aktualnego położenia
         popup: Jesteś w promieniu {distance} {unit} od tego punktu
       base:
         standard: Podstawowa
@@ -2375,7 +2387,7 @@ pl:
       createnote_disabled_tooltip: Przybliż mapę, by dodać uwagę
       map_notes_zoom_in_tooltip: Powiększ, aby zobaczyć uwagi
       map_data_zoom_in_tooltip: Przybliż mapę, aby zobaczyć jej dane
-      queryfeature_tooltip: Wyświetl dane obiektu
+      queryfeature_tooltip: Pobierz i wyświetl obiekty
       queryfeature_disabled_tooltip: Przybliż mapę, aby obejrzeć dane obiektu
     changesets:
       show:
@@ -2386,14 +2398,16 @@ pl:
         unhide_comment: pokaż
     notes:
       new:
-        intro: Zauważyłeś błąd lub brak czegoś? Daj znać innym maperom, aby mogli
-          to poprawić. Przesuń znacznik na właściwą pozycję i wprowadź notatkę opisującą
-          problem. (Prosimy nie podawać tutaj informacji personalnych i informacji
-          z map chronionych prawami autorskimi).
+        intro: Zauważyłeś błąd lub brak czegoś? Daj znać innym mapującym, aby mogli
+          to poprawić. Przesuń znacznik do właściwej pozycji i wpisz notatkę opisującą
+          problem.
+        advice: Twoja uwaga jest publiczna i może zostać użyta do zaktualizowania
+          mapy, nie podawaj tu więc informacji osobistych oraz informacji z map i
+          źródeł chronionych prawami autorskimi.
         add: Dodaj uwagę
       show:
-        anonymous_warning: Uwaga zawiera komentarze anonimowych użytkowników, które
-          powinny być niezależnie zweryfikowane.
+        anonymous_warning: Uwaga zawiera informacje od anonimowych użytkowników, które
+          powinny być dodatkowo zweryfikowane przed wprowadzeniem zmian na mapie.
         hide: Ukryj
         resolve: Rozwiąż
         reactivate: Ponownie aktywuj
@@ -2411,9 +2425,6 @@ pl:
         mapquest_car: Samochód (MapQuest)
         mapquest_foot: Pieszo (MapQuest)
         osrm_car: Samochód (OSRM)
-        mapzen_bicycle: Rower (Mapzen)
-        mapzen_car: Samochód (Mapzen)
-        mapzen_foot: Pieszo (Mapzen)
       descend: W dół
       directions: Opis trasy
       distance: Odległość
index f413704a07184a6803bf024ca5dff2221919034b..79a6032b76a5d5ad823359ea6901aa18dfca8d41 100644 (file)
@@ -2,6 +2,7 @@
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Amgauna
+# Author: Athena in Wonderland
 # Author: BraulioBezerra
 # Author: Brunomelnic
 # Author: Cainamarques
@@ -167,6 +168,8 @@ pt-BR:
         title_comment: Conjunto de alterações %{id} - %{comment}
       join_discussion: Entrar para participar da discussão
       discussion: Discussão
+      still_open: O conjunto de alterações continua em aberto - A discussão será iniciada
+        assim que for fechado o conjunto de alterações.
     node:
       title: 'Ponto: %{name}'
       history_title: 'Histórico do ponto: %{name}'
@@ -476,33 +479,26 @@ pt-BR:
           crematorium: Crematório
           dentist: Dentista
           doctors: Consultório médico
-          dormitory: Dormitório
           drinking_water: Fonte de Água Potável
           driving_school: Escola de Condutores
           embassy: Embaixada
-          emergency_phone: Telefone de Emergência
           fast_food: Fast-Food
           ferry_terminal: Terminal de Balsas
-          fire_hydrant: Hidrante
           fire_station: Posto de Bombeiros
           food_court: Praça de Alimentação
           fountain: Chafariz
           fuel: Posto de Combustível
           gambling: Casa de Jogos
           grave_yard: Cemitério Paroquial
-          gym: Academia de Ginástica
-          health_centre: Centro de Saúde
           hospital: Hospital
           hunting_stand: Estande de Caça
           ice_cream: Sorveteria
           kindergarten: Escola Infantil
           library: Biblioteca
-          market: Mercado
           marketplace: Mercado/Feira
           monastery: Monastério
           motorcycle_parking: Estacionamento de Motocicletas
           nightclub: Danceteria
-          nursery: Creche/Berçário
           nursing_home: Clínica Geriátrica
           office: Escritório
           parking: Estacionamento
@@ -516,7 +512,6 @@ pt-BR:
           prison: Prisão
           pub: Pub
           public_building: Edifício Público
-          reception_area: Área de Recepção
           recycling: Posto de Reciclagem
           restaurant: Restaurante
           retirement_home: Lar de Idosos
@@ -612,7 +607,6 @@ pt-BR:
           trunk: Via Expressa
           trunk_link: Ligação de Via Expressa
           unclassified: Via Não Classificada
-          unsurfaced: Estrada Não Pavimentada
           "yes": Estrada
         historic:
           archaeological_site: Sítio Arqueológico
@@ -677,7 +671,6 @@ pt-BR:
         leisure:
           beach_resort: Estação Praiana
           bird_hide: Observatório de Pássaros
-          club: Clube
           common: Baldio Comunitário
           dog_park: Cachorródromo
           fishing: Área de Pesca
@@ -770,8 +763,6 @@ pt-BR:
           "yes": Escritório
         place:
           allotments: Horta Urbana
-          block: Quarteirão
-          airport: Aeroporto
           city: Cidade
           country: País
           county: Condado
@@ -783,7 +774,6 @@ pt-BR:
           islet: Ilhota
           isolated_dwelling: Moradia Isolada
           locality: Localidade
-          moor: Ancoradouro
           municipality: Município
           neighbourhood: Vizinhança
           postcode: Código Postal
@@ -800,10 +790,8 @@ pt-BR:
           abandoned: Ferrovia Abandonada
           construction: Ferrovia em Construção
           disused: Ferrovia Inativa
-          disused_station: Estação Ferroviária Inativa
           funicular: Funicular
           halt: Parada de Trem
-          historic_station: Estação Ferroviária Histórica
           junction: Entroncamento Ferroviário
           level_crossing: Passagem em Nível
           light_rail: Ferrovia Metropolitana
@@ -867,7 +855,6 @@ pt-BR:
           hairdresser: Cabeleireiro/Barbeiro
           hardware: Loja de Material de Construção
           hifi: Loja de Aparelhos Hi-Fi
-          insurance: Seguradora
           jewelry: Joalheria
           kiosk: Quiosque Comercial
           laundry: Lavanderia
@@ -883,10 +870,8 @@ pt-BR:
           pet: Pet Shop
           pharmacy: Drogaria
           photo: Loja Fotográfica
-          salon: Salão de Beleza
           second_hand: Brechó
           shoes: Loja de Calçados
-          shopping_centre: Centro Comercial
           sports: Loja de Artigos Esportivos
           stationery: Papelaria
           supermarket: Supermercado
@@ -1241,12 +1226,11 @@ pt-BR:
     community_driven_title: Impulsionado pela Comunidade
     community_driven_html: |-
       A comunidade do OpenStreetMap é diversa, apaixonada, e aumenta diariamente.
-      Entre os nossos contribuidores encontram-se mapeadores entusiastas,
-      profissionais das áreas de sistemas geográficos, engenheiros que utilizam
-      os servidores do OpenStreetMap, voluntários a mapear áreas afetadas
-      por grandes desastres, e muitos mais.
-      Para saber mais sobre a nossa comunidade, veja os <a href='%{diary_path}'>diários dos editores</a>,
-      <a href='http://blogs.openstreetmap.org/'>blogues da comunidade</a>, e o site da <a href='http://www.osmfoundation.org/'>OSM Foundation</a>.
+      Entre os nossos contribuidores encontram-se mapeadores entusiastas, profissionais das áreas de sistemas geográficos, engenheiros que utilizam os servidores do OpenStreetMap, voluntários a mapear áreas afetadas por grandes desastres, e muitos mais.
+      Para saber mais sobre a nossa comunidade, veja:
+      <a href='https://blog.openstreetmap.org'>Blog do OpenStreetMap</a>,
+      <a href='%{diary_path}'>diários dos editores</a>,
+      <a href='http://blogs.openstreetmap.org/'>blogs da comunidade</a>, e o site da <a href='http://www.osmfoundation.org/'>Fundação OSM</a>.
     open_data_title: Dados Abertos
     open_data_html: |-
       O OpenStreetMap é constituído por <i>dados abertos</i>: qualquer
@@ -2173,6 +2157,8 @@ pt-BR:
       not_a_role: O texto "%{role}" não é um papel válido.
       already_has_role: O usuário já tem o papel %{role}.
       doesnt_have_role: O usuário não tem o papel %{role}.
+      not_revoke_admin_current_user: Não foi possível retirar os direitos de administrador
+        do atual usuário.
     grant:
       title: Confirmar adição de papel
       heading: Confirmar adição de papel
@@ -2392,8 +2378,10 @@ pt-BR:
       new:
         intro: Encontrou um erro ou algo faltando? Informe outros mapeadores para
           que isso possa ser corrigido. Mova o marcador para a posição correta e digite
-          uma nota para explicar o problema. (Por favor, não insira informações ou
-          dados pessoais de mapas protegidos por direitos autorais ou listas do diretório.)
+          uma nota para explicar o problema.
+        advice: A sua nota será pública e pode ser usada para atualizar o mapa, portanto,
+          não insira informações pessoais ou dados de mapas protegidos por direitos
+          autorais ou listas de diretórios.
         add: Incluir nota
       show:
         anonymous_warning: Esta nota contém comentários de usuários anônimos que devem
@@ -2415,9 +2403,6 @@ pt-BR:
         mapquest_car: Carro (MapQuest)
         mapquest_foot: Pedestre (MapQuest)
         osrm_car: Carro (OSRM)
-        mapzen_bicycle: Bicicleta (MapQuest)
-        mapzen_car: Carro (MapQuest)
-        mapzen_foot: Pé (MapQuest)
       descend: Descender
       directions: Itinerário
       distance: Distância
index e81c4ae1d0b6286aa52ce54a360341ddfb02343d..c2fc38b2b8da7e56a0b090203d199f078ff773d8 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Portuguese (português)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: Athena in Wonderland
 # Author: Crazymadlover
 # Author: FranciscoDS
 # Author: Giro720
 # Author: JasonZe
 # Author: Jgpacker
 # Author: Jgrocha
+# Author: Jkb8
 # Author: Luckas
 # Author: Macofe
 # Author: Malafaya
 # Author: McDutchie
+# Author: MokaAkashiyaPT
 # Author: Nemo bis
 # Author: Rsbarbosa
 # Author: Ruben
@@ -150,6 +153,8 @@ pt-PT:
         title_comment: Conjunto de alterações %{id} - %{comment}
       join_discussion: Inicie sessão para se juntar à discussão
       discussion: Discussão
+      still_open: O conjunto de alterações continua em aberto - A discussão será iniciada
+        assim que for fechado o conjunto de alterações.
     node:
       title: 'Nó: %{name}'
       history_title: 'Histórico do Nó: %{name}'
@@ -361,8 +366,8 @@ pt-PT:
       map_image: Imagem (.jpg .pdf .svg .png .ps) apenas mapa padrão
       embeddable_html: HTML (mostra mapa interativo noutros sites) todos os mapas
       licence: Licença
-      export_details: Os dados do OpenStreetMap encontram-se sob a <a href="http://opendatacommons.org/licenses/odbl/1.0/">licença
-        Open Data Commons Open Database License</a> (ODbL).
+      export_details: Os dados do OpenStreetMap encontram-se sob a <a href="https://opendatacommons.org/licenses/odbl/1.0/">licença
+        Open Data Commons Open Database</a> (ODbL).
       too_large:
         advice: 'Se a exportação acima falhar, por favor, considere o uso de uma das
           fontes listadas abaixo:'
@@ -403,14 +408,14 @@ pt-PT:
   geocoder:
     search:
       title:
-        latlon: Resultados <a href="http://openstreetmap.org/">Internos</a>
+        latlon: Resultados <a href="https://openstreetmap.org/">internos</a>
         uk_postcode: Resultados de <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: Resultados de <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultados de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultados de <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultados de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultados de <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultados de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultados de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resultados de <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -420,12 +425,19 @@ pt-PT:
           chair_lift: Teleférico
           drag_lift: Elevador de esqui
           gondola: Gôndola
+          platter: Telesqui
+          pylon: Pilone
           station: Estação de elevador de esqui
+          t-bar: Telesqui de barra de metal em T
         aeroway:
           aerodrome: Aeródromo
+          airstrip: Pista de aterragem
           apron: Plataforma de estacionamento
           gate: Portão
+          hangar: Hangar
           helipad: Heliponto
+          holding_position: Posição de estabelecimento
+          parking_position: Posição de estacionamento
           runway: Pista de Aterragem e Descolagem
           taxiway: Pista de taxiamento
           terminal: Terminal
@@ -460,37 +472,32 @@ pt-PT:
           crematorium: Crematório
           dentist: Dentista
           doctors: Médicos
-          dormitory: Dormitório
           drinking_water: Água Potável
           driving_school: Escola de Condução
           embassy: Embaixada
-          emergency_phone: Telefone de Emergência
           fast_food: Fast-food
           ferry_terminal: Terminal de ferry
-          fire_hydrant: Boca de Incêndio
           fire_station: Quartel de Bombeiros
           food_court: Praça de Alimentação
           fountain: Fonte
           fuel: Combustível
           gambling: Jogos de Fortuna e Azar
           grave_yard: Cemitério
-          gym: Centro de Fitness / Ginásio
-          health_centre: Centro de Saúde
+          grit_bin: Caixa de sal-gema
           hospital: Hospital
           hunting_stand: Cabana de Caça
           ice_cream: Geladaria
           kindergarten: Jardim de infância
           library: Biblioteca
-          market: Mercado
           marketplace: Feira
           monastery: Mosteiro
           motorcycle_parking: Parque de Estacionamento de Motas
           nightclub: Clube Nocturno
-          nursery: Creche
           nursing_home: Lar de Idosos
           office: Escritório
           parking: Estacionamento
           parking_entrance: Entrada de Parque de Estacionamento
+          parking_space: Espaço para estacionamento
           pharmacy: Farmácia
           place_of_worship: Lugar de Oração
           police: Polícia
@@ -500,7 +507,6 @@ pt-PT:
           prison: Prisão
           pub: Pub
           public_building: Edifício Público
-          reception_area: Área de Receção
           recycling: Ecoponto
           restaurant: Restaurante
           retirement_home: Casa de Retiro
@@ -525,6 +531,7 @@ pt-PT:
           village_hall: Junta de Freguesia
           waste_basket: Caixote do Lixo
           waste_disposal: Contentor de Lixo
+          water_point: Ponto de água
           youth_centre: Casa da Juventude
         boundary:
           administrative: Divisão Administrativa
@@ -533,6 +540,7 @@ pt-PT:
           protected_area: Área Protegida
         bridge:
           aqueduct: Aqueduto
+          boardwalk: Passadiço
           suspension: Ponte Suspensa
           swing: Ponte Giratória
           viaduct: Viaduto
@@ -552,25 +560,31 @@ pt-PT:
           "yes": Loja de Artesanato
         emergency:
           ambulance_station: Central de Ambulâncias
+          assembly_point: Centro de agrupamento
           defibrillator: Desfibrilador
           landing_site: Lugar para Aterragem de Emergência
           phone: Telefone de Emergência
+          water_tank: Reservatório de água de emergência
+          "yes": Emergência
         highway:
           abandoned: Estrada Abandonada
           bridleway: Pista de Cavalos
           bus_guideway: Faixa para Autocarros Guiados
           bus_stop: Paragem de Autocarro
           construction: Estrada em Construção
+          corridor: Corredor
           cycleway: Ciclovia
           elevator: Elevador
           emergency_access_point: Ponto de Ccesso de Emergência
           footway: Caminho Pedonal
           ford: Vau
+          give_way: Sinal de preferência de passagem
           living_street: Zona de Coexistência
           milestone: Marco Quilométrico
           motorway: Autoestrada
           motorway_junction: Interseção e Saída de Autoestradas
           motorway_link: Nó de ligação a uma Autoestrada
+          passing_place: Lugar de passagem
           path: Trilho
           pedestrian: Passeio
           platform: Plataforma
@@ -587,6 +601,7 @@ pt-PT:
           services: Serviços de Autoestrada
           speed_camera: Radar de Velocidade
           steps: Escadas
+          stop: Sinal de Stop
           street_lamp: Poste de Iluminação
           tertiary: Estrada Terciária
           tertiary_link: Nó de ligação a uma Estrada Terciária
@@ -595,8 +610,8 @@ pt-PT:
           trail: Trilho
           trunk: Via Rápida
           trunk_link: Nó de ligação a uma Via Rápida
+          turning_loop: Circuito reverso
           unclassified: Estrada sem classificação oficial
-          unsurfaced: Estrada não pavimentada
           "yes": Estrada
         historic:
           archaeological_site: Sítio Arqueológico
@@ -615,6 +630,7 @@ pt-PT:
           manor: Solar
           memorial: Memorial
           mine: Mina histórica
+          mine_shaft: Mina subterrânea
           monument: Monumento
           roman_road: Estrada Romana
           ruins: Ruínas
@@ -624,6 +640,7 @@ pt-PT:
           wayside_cross: Cruzeiro
           wayside_shrine: Alminhas / Nicho / Capelinha
           wreck: Destroços
+          "yes": Sítio histórico
         junction:
           "yes": Cruzamento
         landuse:
@@ -661,9 +678,9 @@ pt-PT:
         leisure:
           beach_resort: Resort de Praia
           bird_hide: Observatório de Áves
-          club: Clube
           common: Baldio
           dog_park: Parque para Cães
+          firepit: Fogueira
           fishing: Zona de Pesca
           fitness_centre: Ginásio (fitness)
           fitness_station: Ginásio
@@ -688,15 +705,46 @@ pt-PT:
           water_park: Parque Aquático
           "yes": Lazer
         man_made:
+          adit: Galeria de acesso
+          beacon: Baluarte
+          beehive: Colmeia
+          breakwater: Quebra-mar
+          bridge: Ponte
+          bunker_silo: Búnquer
+          chimney: Chaminé
+          crane: Guindaste
+          dolphin: Posto de amarração
+          dyke: Represa
+          embankment: Aterro
+          flagpole: Mastro
+          gasometer: Gasómetro
+          groyne: Estacada
+          kiln: Estufa
           lighthouse: Farol
+          mast: Mastro
+          mine: Mina
+          mineshaft: Poços de mina
+          monitoring_station: Estação de monitorização
+          petroleum_well: Poço de petróleo
+          pier: Ponte-cais
           pipeline: Pipeline
+          silo: Silo
+          storage_tank: Reservatório
+          surveillance: Vigilância
           tower: Torre
+          wastewater_plant: Planta de tratamento de água
+          watermill: Moinho de água
+          water_tower: Torre de água
+          water_well: Poço
+          water_works: Estação de tratamento de água
+          windmill: Moinho de vento
           works: Fábrica
           "yes": Construção
         military:
           airfield: Aeródromo Militar
           barracks: Quartel
           bunker: Bunker
+          "yes": Militar
         mountain_pass:
           "yes": Passe de Montanha
         natural:
@@ -742,11 +790,14 @@ pt-PT:
           accountant: Contabilista
           administrative: Administração
           architect: Arquiteto
+          association: Associação
           company: Empresa
+          educational_institution: Instituição educativa
           employment_agency: Agência de Emprego
           estate_agent: Imobiliária
           government: Edifício Governamental
           insurance: Agência de Seguros
+          it: Escritórios de informática
           lawyer: Advogado
           ngo: Escritório de ONG
           telecommunication: Escritório de Telecomunicações
@@ -754,9 +805,8 @@ pt-PT:
           "yes": Escritório
         place:
           allotments: Horta Urbana / Comunitária
-          block: Bloco
-          airport: Aeroporto
           city: Capital de distrito
+          city_block: Quarteirão
           country: País
           county: Condado
           farm: Quinta
@@ -767,12 +817,13 @@ pt-PT:
           islet: Ilheu
           isolated_dwelling: Casa Isolada
           locality: Localidade desabitada
-          moor: Carriço
           municipality: Município
           neighbourhood: Lugar
           postcode: Código Postal
+          quarter: Quarto
           region: Região
           sea: Mar
+          square: Bairro
           state: Estado
           subdivision: Subdivisão
           suburb: Subúrbio
@@ -784,10 +835,8 @@ pt-PT:
           abandoned: Ferrovia Abandonada
           construction: Ferrovia sob Construção
           disused: Ferrovia Não Usada
-          disused_station: Estação Ferroviária Não Usada
           funicular: Funicular
           halt: Apeadeiro
-          historic_station: Estação Ferroviária Histórica
           junction: Entroncamento Ferroviário
           level_crossing: Passagem de Nível
           light_rail: Veículo leve sobre trilhos
@@ -813,6 +862,7 @@ pt-PT:
           beauty: Loja de Produtos de Beleza
           beverages: Loja de Bebidas
           bicycle: Loja de Bicicletas
+          bookmaker: Casa de apostas
           books: Livraria
           boutique: Boutique
           butcher: Talho
@@ -851,12 +901,16 @@ pt-PT:
           hairdresser: Cabeleireiro(a)
           hardware: Loja de Ferragens
           hifi: Hi-Fi
-          insurance: Seguros
+          houseware: Lojas de artigos para casa
+          interior_decoration: Decoração de interiores
           jewelry: Joalharia
           kiosk: Quiosque
+          kitchen: Loja de construção de cozinha
           laundry: Lavandaria
+          lottery: Lotaria
           mall: Centro Comercial
           market: Mercado
+          massage: Massagem
           mobile_phone: Loja de Telemóveis
           motorcycle: Loja de Motas
           music: Loja de instrumentos musicais
@@ -864,21 +918,27 @@ pt-PT:
           optician: Oftalmologista
           organic: Loja de alimentos orgânicos
           outdoor: Loja de artigos para atividades ao ar livre
+          paint: Lojas de pintura
+          pawnbroker: Penhores
           pet: Loja de animais
           pharmacy: Farmácia
           photo: Loja de Fotografia
-          salon: Salão de beleza
+          seafood: Frutos do mar
           second_hand: Loja de segunda mão
           shoes: Sapataria
-          shopping_centre: Centro Comercial
           sports: Loja de Artigos Desportivos
           stationery: Papelaria
           supermarket: Supermercado
           tailor: Alfaiate
+          ticket: Loja de bilhetes
+          tobacco: Loja de tabaco
           toys: Loja de Brinquedos
           travel_agency: Agência de Viagens
+          tyres: Loja de pneus
+          vacant: Lojas vagas
+          variety_store: Lojas de variedades
           video: Videoclube
-          wine: Venda de Bebidas (Off License)
+          wine: Venda de bebidas
           "yes": Loja
         tourism:
           alpine_hut: Albergue de Montanha
@@ -902,6 +962,7 @@ pt-PT:
           viewpoint: Miradouro
           zoo: Jardim zoológico
         tunnel:
+          building_passage: Passagem do edifício
           culvert: Conduta
           "yes": Túnel
         waterway:
@@ -933,7 +994,7 @@ pt-PT:
         level10: Lugar
     description:
       title:
-        osm_nominatim: Resultado de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Resultado de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultado de <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -968,7 +1029,7 @@ pt-PT:
     intro_text: O OpenStreetMap é um mapa do mundo, criado por pessoas como você e
       de uso livre sob uma licença aberta.
     intro_2_create_account: Crie uma conta de utilizador
-    partners_html: O alojamento é suportado por %{ucl}, %{ic}, %{bytemark} e outros
+    partners_html: O alojamento é suportado por %{ucl}, %{bytemark}, %{ic}, e outros
       %{partners}.
     partners_ucl: UCL
     partners_ic: Imperial College London
@@ -1008,24 +1069,24 @@ pt-PT:
       title_html: Licença e Direitos de autor
       intro_1_html: |-
         O OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> é disponibilizado em <i>dados abertos</i>, sob a licença <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) pela  <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://osmfoundation.org/">Fundação OpenStreetMap</a> (OSMF).
       intro_2_html: Tem o direito de copiar, distribuir, transmitir e adaptar os nossos
         dados, desde que atribua a autoria do OpenStreetMap e os seus contribuidores.
         Se alterar ou adicionar conteúdo dos nossos dados, pode distribuir o resultado
-        apenas com a mesma licença. O <a href="http://opendatacommons.org/licenses/odbl/1.0/">texto
+        apenas com a mesma licença. O <a href="https://opendatacommons.org/licenses/odbl/1.0/">texto
         legal completo</a> explica os seus direitos e responsabilidades.
       intro_3_html: A cartografia nas nossas telas de mapas (imagens dos mapas) e
-        a nossa documentação são disponibilizadas sob a licença <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.pt">Creative
-        Commons Atribuição - CompartilhaIgual 2.0 Genérica (CC BY-SA 2.0)</a>.
+        a nossa documentação são disponibilizadas sob a licença <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.pt">Creative
+        Commons Atribuição - Partilha nos Mesmos Termos 2.0 (CC BY-SA)</a>.
       credit_title_html: Como creditar o OpenStreetMap
       credit_1_html: É necessário indicar &ldquo;&copy; contribuidores do OpenStreetMap&rdquo;
         ou caso seja mais adequado em inglês &ldquo;&copy; OpenStreetMap contributors&rdquo;.
       credit_2_html: Também tem de indicar claramente que os dados estão disponíveis
         sob a Open Database License (ODbL), e caso utilize as telas de mapas (imagens
         dos mapas), que a cartografia é disponibilizada sob a licença CC-BY-SA. Pode
-        fazer isto colocando uma hiperligação para <a href="http://www.openstreetmap.org/copyright">esta
+        fazer isto colocando uma hiperligação para <a href="https://www.openstreetmap.org/copyright">esta
         página sobre licença e direitos de autor</a>. Como alternativa, e obrigatório
         caso distribua o OpenStreetMap em formato de dados, pode indicar as licenças
         e colocar hiperligações a apontar para as páginas das licenças. Em suportes
@@ -1042,8 +1103,7 @@ pt-PT:
       more_title_html: Saber mais
       more_1_html: |-
         Leia mais informações sobre a utilização dos nossos dados e como atribuir a autoria na <a
-        href="http://osmfoundation.org/License">página da licença da OSMF</a> e a página da comunidade <a
-        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Perguntas frequentes - Legais</a> (em inglês).
+        href="https://osmfoundation.org/Licence">página da licença da OSMF</a> (em inglês).
       more_2_html: Apesar do OpenStreetMap ser uma plataforma de dados abertos, não
         podemos fornecer a terceiros uma API de mapas, livre de encargos. Veja a <a
         href="https://operations.osmfoundation.org/policies/api/">Política de Utilização
@@ -1054,10 +1114,10 @@ pt-PT:
       contributors_intro_html: 'Os contribuidores do OpenStreetMap são milhares. Também
         são utilizados dados de agências cartográficas nacionais e outras fontes,
         entre elas:'
-      contributors_at_html: '<strong>Áustria</strong>: Contém dados de <a href="http://data.wien.gv.at/">Stadt
-        Wien</a> (sob a licença <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
-        BY</a>), <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
-        Vorarlberg</a> e Land Tirol (sob a licença <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
+      contributors_at_html: '<strong>Áustria</strong>: Contém dados de <a href="https://data.wien.gv.at/">Stadt
+        Wien</a> (sob a licença <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC
+        BY</a>), <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+        Vorarlberg</a> e Land Tirol (sob a licença <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
         AT com emendas</a>).'
       contributors_ca_html: '<strong>Canadá</strong>: Contém dados de GeoBase&reg;,
         GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy;
@@ -1065,11 +1125,11 @@ pt-PT:
         Canada).'
       contributors_fi_html: "<strong>Finlândia</strong>: Contem dados do \nNational
         Land Survey da Finland´s Topographic Database \nassim como de outras bases
-        de dados, sob a licença <a href=\"http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501\">NLSFI</a>."
+        de dados, sob a licença <a href=\"https://www.maanmittauslaitos.fi/en/opendata-licence-version1\">NLSFI</a>."
       contributors_fr_html: '<strong>França</strong>: Contém dados provenientes da
         Direction Générale des Impôts.'
       contributors_nl_html: '<strong>Países Baixos</strong>: Contém dados &copy; AND,
-        2007 (<a href="http://www.and.com">www.and.com</a>)'
+        2007 (<a href="https://www.and.com">www.and.com</a>)'
       contributors_nz_html: '<strong>Nova Zelândia</strong>: Contém dados provenientes
         de Land Information New Zealand. Crown Copyright reserved.'
       contributors_si_html: |-
@@ -1083,7 +1143,7 @@ pt-PT:
       contributors_gb_html: '<strong>Reino Unido</strong>: Contém dados do Ordnance
         Survey &copy; Crown copyright and database right 2010-2012.'
       contributors_footer_1_html: Para mais informações sobre estas e outras fontes
-        utilizadas para melhorar o OpenStreetMap, consulte a <a href="http://wiki.openstreetmap.org/wiki/Contributors">página
+        utilizadas para melhorar o OpenStreetMap, consulte a <a href="https://wiki.openstreetmap.org/wiki/Contributors">página
         de contribuidores</a> (em inglês) na wiki do OpenStreetMap.
       contributors_footer_2_html: '  A inclusão de dados no OpenStreetMap não implica
         que o fornecedor de dados originais apoie o OpenStreetMap, forneça qualquer
@@ -1095,14 +1155,14 @@ pt-PT:
         dos direitos de autor.
       infringement_2_html: Se acredita que foi adicionado material protegido por direitos
         de autor indevidamente à base de dados do OpenStreetMap, por favor consulte
-        o <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">procedimento
+        o <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procedimento
         para retirar dados protegidos</a> (em inglês) ou preencha os dados diretamente
         no <a href="http://dmca.openstreetmap.org/">formulário</a> (em inglês).
       trademarks_title_html: <span id="trademarks"></span>Marcas registadas
       trademarks_1_html: OpenStreetMap, o respetivo logótipo e State of the Map são
-        marcas registadas da OpenStreetMap Foundation. Se tiver alguma questão sobre
-        a utilização das marcas, por favor envie as suas questões para o <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Grupo
-        de Trabalho de Licenças</a>.
+        marcas registadas da Fundação OpenStreetMap. Se tiver alguma questão sobre
+        a utilização das marcas, por favor consulte as nossas <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Normas
+        sobre Marcas Comerciais</a>.
   welcome_page:
     title: Bem-vindo !
     introduction_html: Bem-vindo ao OpenStreetMap, o mapa livre e editável do mundo.
@@ -1134,8 +1194,8 @@ pt-PT:
       paragraph_1_html: "O OpenStreetMap tem poucas regras formais mas espera-se que
         todos os participantes colaborem e comuniquem com a comunidade. Se pretender
         realizar ações em massa como importação de dados através de programas por
-        favor siga as instruções presentes em \n<a href='http://wiki.openstreetmap.org/wiki/Pt:Import/Guidelines'>Importações</a>
-        and \n<a href='http://wiki.openstreetmap.org/wiki/Pt:Automated_Edits_code_of_conduct'>Edições
+        favor siga as instruções presentes em \n<a href='https://wiki.openstreetmap.org/wiki/Pt:Import/Guidelines'>Importações</a>
+        and \n<a href='https://wiki.openstreetmap.org/wiki/Pt:Automated_Edits_code_of_conduct'>Edições
         Automatizadas</a>."
     questions:
       title: Tens perguntas ?
@@ -1166,9 +1226,9 @@ pt-PT:
           Isto irá adicionar um marcador ao mapa, o qual pode mover arrastando. Adicione a sua mensagem, clique em salvar, e outros utilizadores como você irão investigar.
     other_concerns:
       title: Outras preocupações
-      explanation_html: Se você tem preocupações sobre o modo como os nossos dados
-        estão a ser usados ou sobre os conteúdos, por favor consulte a nossa <a href='/copyright'>página
-        de direitos de autor</a> para mais informações legais, ou contacte o <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grupo
+      explanation_html: Se tem preocupações sobre o modo como os nossos dados estão
+        a ser usados ou sobre os conteúdos, por favor consulte a nossa <a href='/copyright'>página
+        de direitos de autor</a> para mais informações legais, ou contacte o <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>grupo
         de trabalho OSMF</a> apropriado.
   help_page:
     title: Obter Ajuda
@@ -1180,7 +1240,7 @@ pt-PT:
       title: Bem vindo ao OpenStreetMap
       description: Comece por este guia rápido sobre os princípios básicos do OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Pt:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Pt:Beginners%27_guide
       title: Guia de Iniciantes
       description: Guia para iniciantes criado pela comunidade.
     help:
@@ -1204,7 +1264,7 @@ pt-PT:
       description: Informações para empresas e organizações que queiram mudar para
         os mapas do OpenStreetMap e outros serviços.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/Pt:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/Pt:Main_Page
       title: wiki.openstreetmap.org
       description: Navegue na wiki de documentação sobre o OpenStreetMap.
   about_page:
@@ -1222,12 +1282,11 @@ pt-PT:
     community_driven_title: Dirigido pela Comunidade
     community_driven_html: |-
       A comunidade do OpenStreetMap é diversa, apaixonada, e aumenta diariamente.
-      Entre os nossos colaboradores encontra-se mapeadores entusiastas,
-      profissionais das áreas de sistemas geográficos, engenheiros que utilizam
-      os servidores do OpenStreetMap, voluntários a mapear áreas afetadas
-      por grandes desastres, e muitos mais.
-      Para saber mais sobre a nossa comunidade, veja os <a href='%{diary_path}'>diários dos editores</a>,
-      <a href='http://blogs.openstreetmap.org/'>blogues da comunidade</a>, e o sítio da <a href='http://www.osmfoundation.org/'>OSM Foundation</a>.
+      Entre os nossos colaboradores encontra-se mapeadores entusiastas, profissionais das áreas de sistemas geográficos, engenheiros que utilizam os servidores do OSM, voluntários a mapear áreas afetadas por grandes desastres, e muitos mais.
+      Para saber mais sobre a nossa comunidade, veja:
+      <a href='https://blog.openstreetmap.org'>Blogue do OpenStreetMap</a>,
+      <a href='%{diary_path}'>diários dos utilizadores</a>,
+      <a href='https://blogs.openstreetmap.org/'>blogues da comunidade</a>, e o sítio da <a href='https://www.osmfoundation.org/'>Fundação OSM</a>.
     open_data_title: Dados Abertos
     open_data_html: |-
       O OpenStreetMap é constituído por <i>dados abertos</i>: qualquer
@@ -1236,14 +1295,16 @@ pt-PT:
       Se você alterar os dados ou criar algo com os dados, pode distribuir
       o produto resultante apenas sob a mesma licença. Consulte <a href='%{copyright_path}'>a página sobre direitos de autor e licenciamento</a> para mais informações.
     legal_title: Termos legais
-    legal_html: "Este site e outros serviços relacionados são formalmente geridos
-      pela  \n<a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
+    legal_html: "Este sítio e outros serviços relacionados são formalmente geridos
+      pela  \n<a href='https://osmfoundation.org/'>Fundação OpenStreetMap</a> (OSMF)
       \nem nome da comunidade. A utilização de todos os serviços operados pela OSMF
-      está sujeita às nossas normas de <a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">Utilização
-      Aceitável</a> e de <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacidade</a>\n<br>
-      \nPor favor <a href='http://osmfoundation.org/Contact'>contacte a OSMF</a> \nse
-      tiver questões relacionadas com licenças, direitos de autor, questões legais
-      ou problemas."
+      está sujeita\nàs nossas normas de <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">Utilização
+      Aceitável</a> e de <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">Privacidade</a>\n<br>
+      \nPor favor <a href='https://osmfoundation.org/Contact'>contacte a OSMF</a>
+      \nse tiver questões relacionadas com licenças, direitos de autor, questões legais
+      ou problemas.\n<br>\nO OpenStreetMap, o logótipo da lupa e o State of the Map
+      são <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">marcas
+      comerciais registadas da OSMF</a>."
     partners_title: Parceiros
   notifier:
     diary_comment_notification:
@@ -1457,14 +1518,14 @@ pt-PT:
       user_page_link: página de utilizador
       anon_edits_link_text: Descubra a que se deve isto.
       flash_player_required: Necessita do Flash instalado e ativado para usar o Potlatch,
-        o editor em Flash do OpenStreetMap. Pode <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">descarregar
-        o Flash do site Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Também
+        o editor em Flash do OpenStreetMap. Pode <a href="https://get.adobe.com/flashplayer/">descarregar
+        o Flash do sítio Adobe.com</a>. <a href="https://wiki.openstreetmap.org/wiki/Editing">Também
         estão disponíveis outras opções</a> para editar o OpenStreetMap.
       potlatch_unsaved_changes: Tem alterações por gravar (Para gravar no Potlatch,
         deve desselecionar o ponto ou linha atual, se estiver a editar no modo direto,
         ou clicar no botão gravar se este estiver disponível.)
       potlatch2_not_configured: O Potlatch 2 não foi configurado - por favor veja
-        http://wiki.openstreetmap.org/wiki/The_Rails_Port
+        https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 para mais informações
       potlatch2_unsaved_changes: Tem alterações que não foram gravadas. (Para gravar
         no Potlatch 2, deve clicar no botão Gravar.)
       id_not_configured: O editor iD não foi configurado
@@ -1479,7 +1540,7 @@ pt-PT:
       get_directions_title: Obtenha as direções de uma rota entre 2 pontos
       from: De
       to: Para
-      where_am_i: Onde estou?
+      where_am_i: Onde se encontra?
       where_am_i_title: Pesquisa a localização atual do mapa
       submit_text: Ir
     key:
@@ -1556,7 +1617,7 @@ pt-PT:
       edit: Editar
       preview: Mostrar previsão
     markdown_help:
-      title_html: Tabela de códigos (<a href="http://daringfireball.net/projects/markdown/">Markdown</a>)
+      title_html: Tabela de códigos (<a href="https://daringfireball.net/projects/markdown/">Markdown</a>)
       headings: Cabeçalhos
       heading: Cabeçalho
       subheading: Sub-secção
@@ -1669,7 +1730,7 @@ pt-PT:
       description: Ver trilhos GPS enviados recentemente
       tagged_with: ' etiquetado com %{tags}'
       empty_html: Ainda não enviou nenhum trilho GPS. <a href='%{upload_link}'>Envie
-        um novo trilho GPS</a> ou saiba mais sobre trilhos GPS na <a href='http://wiki.openstreetmap.org/wiki/Pt:Beginners_Guide_1.2'>página
+        um novo trilho GPS</a> ou saiba mais sobre trilhos GPS na <a href='https://wiki.openstreetmap.org/wiki/Pt:Beginners_Guide_1.2'>página
         wiki</a>.
     delete:
       scheduled_for_deletion: Trilho programado para eliminação
@@ -1879,12 +1940,12 @@ pt-PT:
           <p>Ao contrário de outros mapas, o OpenStreetMap é completamente criado por pessoas como você, e é disponibilizado gratuitamente para que qualquer pessoa possa corrigir, atualizar, descarregar e utilizar.</p>
           <p>Crie uma conta de utilizador para começar a colaborar. Enviaremos um email para confirmar a sua conta.</p>
       license_agreement: Quando confirmar a sua conta, será necessário aceitar os
-        <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">Termos
-        de Colaboração</a>.
+        <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">termos
+        de colaboração</a>.
       email address: 'E-mail:'
       confirm email address: 'Confirmar E-mail:'
       not displayed publicly: O seu endereço de IP não será visível publicamente.
-        Consulte a <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy" title="política
+        Consulte a <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="política
         de privacidade OSMF, incluindo secção sobre endereços de correio eletrónico">política
         de privacidade</a> para mais informação.
       display name: 'Nome de utilizador:'
@@ -2007,12 +2068,12 @@ pt-PT:
       email never displayed publicly: (nunca é mostrado publicamente)
       external auth: 'Início de sessão externo:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: o que é isto?
       public editing:
         heading: 'Edição pública:'
         enabled: Ativado. Não anónimo e pode editar.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: o que é isto?
         disabled: Desativado e não pode editar. Todas as edições anteriores são anónimas.
         disabled link text: porque não posso editar?
@@ -2021,11 +2082,12 @@ pt-PT:
         text: Neste momento as suas edições são anónimas e as outras pessoas não lhe
           podem enviar mensagens nem ver onde se encontra. Para mostrar as suas edições
           e permitir que o contactem através do OpenStreetMap, clique na ligação seguinte.
-          <b>Desde a migração 0.6 da API, apenas utilizadores com edições públicas
-          podem editar dados do mapa</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">mais
+          <b>Desde a migração 0.6 da API, apenas os utilizadores com edições públicas
+          podem editar dados do mapa</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">mais
           informações</a>).<ul><li>Ao tornar as suas edições públicas o seu endereço
-          de email não será revelado.</li><li>Esta ação não pode ser revertida e todos
-          os novos utilizadores têm as edições disponibilizadas publicamente.</li></ul>
+          de correio eletrónico não será revelado.</li><li>Esta ação não pode ser
+          revertida e todos os novos utilizadores têm as edições disponibilizadas
+          publicamente.</li></ul>
       contributor terms:
         heading: 'Termos de Colaborador:'
         agreed: Aceitou os novos Termos de Colaborador.
@@ -2152,6 +2214,8 @@ pt-PT:
       not_a_role: A expressão `%{role}' não é um cargo válido.
       already_has_role: O utilizador já tem o cargo %{role}.
       doesnt_have_role: O utilizador não tem o cargo %{role}.
+      not_revoke_admin_current_user: Não foi possível retirar os direitos de administrador
+        do atual utilizador.
     grant:
       title: Confirmar a concessão do cargo
       heading: Confirmar concessão do cargo
@@ -2377,11 +2441,12 @@ pt-PT:
         unhide_comment: desocultar
     notes:
       new:
-        intro: Encontrou um erro ou existe algo em falta? Avise os outros mapeadores
+        intro: Encontrou um erro ou existe algo em falta? Avise aos outros mapeadores
           para que eles possam consertar a anomalia. Basta posicionar o marcador na
-          a posição desejada e escrever uma nota que explique o problema. (Por favor,
-          não insira informações pessoais nem informação de mapas ou listas com direitos
-          de autor.)
+          posição desejada e escrever uma nota que explique o problema.
+        advice: A sua nota será pública e pode ser utilizada para atualizar o mapa,
+          portanto, não insira informações pessoais ou dados de mapas protegidos por
+          direitos de autor ou listas de diretórios.
         add: Reportar Erro
       show:
         anonymous_warning: Este erro reportado inclui comentários de utilizadores
@@ -2403,9 +2468,6 @@ pt-PT:
         mapquest_car: Carro (MapQuest)
         mapquest_foot: A pé (MapQuest)
         osrm_car: Carro (OSRM)
-        mapzen_bicycle: Bicicleta (Mapzen)
-        mapzen_car: Carro (Mapzen)
-        mapzen_foot: A pé (Mapzen)
       descend: Descida
       directions: Direções
       distance: Distância
index b0ccdde0f690db44310c375407ba288b806c0951..1d26d55a27f07ef611f20798eeaf9373650e1b34 100644 (file)
@@ -417,31 +417,24 @@ ro:
           crematorium: Crematoriu
           dentist: Dentist
           doctors: Medici
-          dormitory: Cămin
           drinking_water: Cișmea
           driving_school: Școală de șoferi
           embassy: Ambasadă
-          emergency_phone: Telefon de urgență
           fast_food: Fast-food
           ferry_terminal: Terminal pentru feriboturi
-          fire_hydrant: Hidrant
           fire_station: Stație de pompieri
           fountain: Fântână
           fuel: Benzinărie
           grave_yard: Cimitir
-          gym: Sală de fitness / gimnastică
-          health_centre: Centru de sănătate
           hospital: Spital
           hunting_stand: Stand de vânătoare
           ice_cream: Înghețată
           kindergarten: Grădiniță
           library: Bibliotecă
-          market: Piață
           marketplace: Piață de mărfuri
           monastery: Mănăstire
           motorcycle_parking: Parcare pentru motociclete
           nightclub: Club de noapte
-          nursery: Creșă
           nursing_home: Azil de bătrâni
           office: Birou
           parking: Parcare
@@ -455,7 +448,6 @@ ro:
           prison: Închisoare
           pub: Pub
           public_building: Clădire publică
-          reception_area: Zonă de recepție
           recycling: Punct de reciclare
           restaurant: Restaurant
           retirement_home: Casă de bătrâni
@@ -540,7 +532,6 @@ ro:
           traffic_signals: Semafor
           trail: Potecă
           unclassified: Drum neclasificat
-          unsurfaced: Drum neasfaltat
           "yes": Drum
         historic:
           archaeological_site: Sit arheologic
@@ -592,7 +583,6 @@ ro:
           vineyard: Podgorie
         leisure:
           beach_resort: Stațiune balneară
-          club: Club
           fishing: Zonă de pescuit
           garden: Grădină
           golf_course: Teren de golf
@@ -658,7 +648,6 @@ ro:
           travel_agent: Agenție de turism
           "yes": Birou
         place:
-          airport: Aeroport
           city: Oraș
           country: Țară
           county: Județ
@@ -669,7 +658,6 @@ ro:
           island: Insulă
           islet: Insuliță
           locality: Localitate
-          moor: Baltă
           municipality: Comună
           neighbourhood: Cartier
           postcode: Cod poștal
@@ -686,10 +674,8 @@ ro:
           abandoned: Cale ferată abandonată
           construction: Cale ferată în construcție
           disused: Cale ferată dezafectată
-          disused_station: Gară dezafectată
           funicular: Funicular
           halt: Gară
-          historic_station: Gară istorică
           junction: Nod feroviar
           level_crossing: Trecere la nivel
           light_rail: Metrou
@@ -728,7 +714,6 @@ ro:
           grocery: Magazin alimentar
           hairdresser: Coafor
           hifi: Hi-Fi
-          insurance: Asigurare
           jewelry: Bijuterie
           kiosk: Chioșc
           laundry: Spălătorie
@@ -740,8 +725,6 @@ ro:
           organic: Magazin de alimente organice
           pet: Magazin de animale
           pharmacy: Farmacie
-          salon: Salon de frumusețe
-          shopping_centre: Centru comercial
           stationery: Magazin de papetărie
           supermarket: Supermarket
           toys: Magazin de jucării
index 02f117ccda0d78fba68001748b9b6c2a26ca3d34..504bc0db00ca7bfe6539c1c57075f9bed92e95da 100644 (file)
@@ -17,6 +17,7 @@
 # Author: DCamer
 # Author: Dmitry-s93
 # Author: Dr&mx
+# Author: Edible Melon
 # Author: Eduard Popov
 # Author: Edward17
 # Author: Eleferen
@@ -45,6 +46,7 @@
 # Author: Okras
 # Author: Perevod16
 # Author: Putnik
+# Author: Redredsonia
 # Author: Riliam
 # Author: Ruila
 # Author: Sanail
@@ -192,6 +194,8 @@ ru:
         title_comment: Пакет правок %{id} — %{comment}
       join_discussion: Войдите в систему, чтобы присоединиться к обсуждению
       discussion: Обсуждение
+      still_open: Пакет правок ещё открыт - обсуждение будет доступно, как только
+        пакет правок будет закрыт.
     node:
       title: 'Точка: %{name}'
       history_title: 'История точки: %{name}'
@@ -404,7 +408,7 @@ ru:
       map_image: Изображение карты (показывает стандартный слой)
       embeddable_html: Встраиваемый HTML
       licence: Лицензия
-      export_details: Данные OpenStreetMap распространяются по <a href="http://opendatacommons.org/licenses/odbl/1.0/">лицензии
+      export_details: Данные OpenStreetMap распространяются по <a href="https://opendatacommons.org/licenses/odbl/1.0/">лицензии
         Open Data Commons Open Database License</a> (ODbL).
       too_large:
         advice: 'Если этот экспорт пройдёт неудачно, пожалуйста, попробуйте один из
@@ -444,14 +448,14 @@ ru:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">Внутренние результаты</a>
+        latlon: <a href="https://openstreetmap.org/">Внутренние результаты</a>
         uk_postcode: Результаты от <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
         ca_postcode: Результаты от <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Результаты от <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Результаты от <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Результаты от <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Результаты от <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Результаты от <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Результаты от <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -461,12 +465,19 @@ ru:
           chair_lift: Кресельный канатный подъёмник
           drag_lift: Якорный (бугельный) подъёмник
           gondola: Канатная дорога
+          platter: Бугельный подъёмник
+          pylon: Опора линии электропередач
           station: Станция канатного подъёмника
+          t-bar: Т-образные подъёмники-буксиры
         aeroway:
           aerodrome: Аэродром
+          airstrip: Взлётно-посадочная полоса
           apron: Перрон
           gate: Выход на посадку
+          hangar: Ангар
           helipad: Вертолётная площадка
+          holding_position: Место ожидания
+          parking_position: Позиция парковки
           runway: Взлётно-посадочная полоса
           taxiway: Рулёжная дорожка
           terminal: Терминал
@@ -501,37 +512,32 @@ ru:
           crematorium: Крематорий
           dentist: Стоматология
           doctors: Врач
-          dormitory: Общежитие
           drinking_water: Питьевая вода
           driving_school: Автошкола
           embassy: Посольство
-          emergency_phone: Телефон экстренных служб
           fast_food: Фаст-фуд
           ferry_terminal: Паромная станция
-          fire_hydrant: Пожарный гидрант
           fire_station: Пожарная станция
           food_court: Ресторанный дворик
           fountain: Фонтан
           fuel: Заправка
           gambling: Игорный дом
           grave_yard: Место захоронения
-          gym: Фитнес-центр / Тренажёрный зал
-          health_centre: Оздоровительный центр
+          grit_bin: Контейнер с дорожной посыпкой
           hospital: Госпиталь
           hunting_stand: Охотничья вышка
           ice_cream: Мороженое
           kindergarten: Детский сад
           library: Библиотека
-          market: Рынок
           marketplace: Рынок
           monastery: Монастырь
           motorcycle_parking: Парковка для мотоциклов
           nightclub: Ночной клуб
-          nursery: Пансионат
           nursing_home: Дом престарелых
           office: Офис
           parking: Стоянка
           parking_entrance: Въезд на стоянку
+          parking_space: Парковка
           pharmacy: Аптека
           place_of_worship: Место поклонения
           police: Полиция
@@ -541,7 +547,6 @@ ru:
           prison: Тюрьма
           pub: Паб
           public_building: Общественное здание
-          reception_area: Приёмная
           recycling: Место утилизации
           restaurant: Ресторан
           retirement_home: Дом престарелых
@@ -566,6 +571,7 @@ ru:
           village_hall: Усадьба
           waste_basket: Урна
           waste_disposal: Мусорный бак
+          water_point: Набор воды
           youth_centre: Молодёжный центр
         boundary:
           administrative: Административная граница
@@ -574,6 +580,7 @@ ru:
           protected_area: Охраняемая территория
         bridge:
           aqueduct: Акведук
+          boardwalk: Тротуар
           suspension: Подвесной мост
           swing: Поворотный мост
           viaduct: Виадук
@@ -593,25 +600,31 @@ ru:
           "yes": Мастерская
         emergency:
           ambulance_station: Станция скорой медицинской помощи
+          assembly_point: Место сбора
           defibrillator: Дефибриллятор
           landing_site: Место аварийной посадки
           phone: Телефон экстренной связи
+          water_tank: Резервуары воды для пожаротушения
+          "yes": Для экстренных служб
         highway:
           abandoned: Заброшенная дорога
           bridleway: Дорожка для верховой езды
           bus_guideway: Автобусная полоса-рельс
           bus_stop: Автобусная остановка
           construction: Ремонт/строительство дороги
+          corridor: Проход через здание
           cycleway: Велодорожка
           elevator: Лифт
           emergency_access_point: Пункт первой помощи
           footway: Тротуар
           ford: Брод
+          give_way: Знак "Уступи дорогу"
           living_street: Жилая улица
           milestone: Километровый столб
           motorway: Автомагистраль
           motorway_junction: Перекрёсток
           motorway_link: Развязка на автомагистрали
+          passing_place: Разъездной путь
           path: Тропа
           pedestrian: Пешеходная улица
           platform: Платформа
@@ -628,6 +641,7 @@ ru:
           services: Придорожный сервис
           speed_camera: Камера контроля скорости
           steps: Лестница
+          stop: Знак остановки
           street_lamp: Уличный фонарь
           tertiary: Дорога третьего класса
           tertiary_link: Дорога третьего класса
@@ -636,8 +650,8 @@ ru:
           trail: Тропа
           trunk: Трасса
           trunk_link: Развязка
+          turning_loop: Дорога для разворота
           unclassified: Дорога местного значения
-          unsurfaced: Грунтовая дорога
           "yes": Дорога
         historic:
           archaeological_site: Раскопки
@@ -656,6 +670,7 @@ ru:
           manor: Поместье
           memorial: Памятник
           mine: Рудник
+          mine_shaft: Шахтный ствол
           monument: Монумент
           roman_road: Римская дорога
           ruins: Развалины
@@ -665,6 +680,7 @@ ru:
           wayside_cross: Придорожный крест
           wayside_shrine: Придорожная святыня
           wreck: Остов судна
+          "yes": Памятное место
         junction:
           "yes": Перекрёсток
         landuse:
@@ -702,9 +718,9 @@ ru:
         leisure:
           beach_resort: Пляж с насаждениями
           bird_hide: Засидка (пункт скрытого наблюдения за птицами)
-          club: Клуб
           common: Альменда
           dog_park: Площадка для собак
+          firepit: Место для костра
           fishing: Рыбалка
           fitness_centre: Фитнес-центр
           fitness_station: Фитнес-станция
@@ -729,15 +745,46 @@ ru:
           water_park: Аквапарк
           "yes": Досуг
         man_made:
+          adit: Галерея
+          beacon: Маяк
+          beehive: Улей
+          breakwater: Волнорез
+          bridge: Мост
+          bunker_silo: Бункер
+          chimney: Дымоход
+          crane: Кран
+          dolphin: Причальная тумба
+          dyke: Канава
+          embankment: Дамба
+          flagpole: Флагшток
+          gasometer: Газгольдер
+          groyne: Волнорез
+          kiln: Печь
           lighthouse: Маяк
+          mast: Мачта
+          mine: Рудник
+          mineshaft: Шахтный ствол
+          monitoring_station: Станция мониторинга
+          petroleum_well: Скважина
+          pier: Пирс
           pipeline: Трубопровод
+          silo: Силос
+          storage_tank: Крытый резервуар
+          surveillance: Наблюдение
           tower: Башня
+          wastewater_plant: Станция очистки сточных вод
+          watermill: Водяная мельница
+          water_tower: Водонапорная башня
+          water_well: Колодец
+          water_works: Водозабор
+          windmill: Ветроэнергетическая установка
           works: Фабрика
           "yes": Искусственный
         military:
           airfield: Военный аэродром
           barracks: Казармы
           bunker: Бункер
+          "yes": Военный
         mountain_pass:
           "yes": Перевал
         natural:
@@ -783,11 +830,14 @@ ru:
           accountant: Бухгалтер
           administrative: Администрация
           architect: Архитектор
+          association: Ассоциация
           company: Компания
+          educational_institution: Учебное заведение
           employment_agency: Агентство занятости
           estate_agent: Агенство недвижимости
           government: Государственное учреждение
           insurance: Страховое бюро
+          it: IT-офис
           lawyer: Юрист
           ngo: Офис некоммерческой организации
           telecommunication: Офис телекоммуникационной компании
@@ -795,9 +845,8 @@ ru:
           "yes": Офисы
         place:
           allotments: Садоводство
-          block: Квартал
-          airport: Аэропорт
           city: Город
+          city_block: Городской квартал
           country: Страна
           county: Уезд
           farm: Ферма
@@ -808,12 +857,13 @@ ru:
           islet: Маленький остров
           isolated_dwelling: Отдельный дом-ферма
           locality: Заброшенная деревня, урочище, необитаемая местность
-          moor: Вересковая пустошь
           municipality: Муниципалитет
           neighbourhood: Соседство
           postcode: Почтовый индекс
+          quarter: Район города
           region: Регион
           sea: Море
+          square: Площадь
           state: Область/Штат
           subdivision: Подразделение
           suburb: Пригород
@@ -825,10 +875,8 @@ ru:
           abandoned: Разобранные железнодорожные пути
           construction: Ремонт железнодорожных путей
           disused: Заброшенная железнодорожная ветка
-          disused_station: Заброшеная железнодорожная станция
           funicular: Фуникулёр
           halt: Железнодорожная станция
-          historic_station: Историческая железнодорожная станция
           junction: Железнодорожная стрелка
           level_crossing: Железнодорожный переезд
           light_rail: Легкорельсовый транспорт
@@ -854,6 +902,7 @@ ru:
           beauty: Салон красоты
           beverages: Магазин напитков
           bicycle: Веломагазин
+          bookmaker: Букмекер
           books: Книжный магазин
           boutique: Бутик
           butcher: Мясная лавка
@@ -892,12 +941,16 @@ ru:
           hairdresser: Парикмахерская
           hardware: Хозяйственный магазин
           hifi: Магазин аудио/видео аппаратуры
-          insurance: Страховая компания
+          houseware: Магазин посуды
+          interior_decoration: Оформление интерьера
           jewelry: Ювелирный магазин
           kiosk: Киоск
+          kitchen: Магазин кухонь
           laundry: Прачечная
+          lottery: Лотерея
           mall: Молл
           market: Рынок
+          massage: Массаж
           mobile_phone: Магазин мобильных телефонов
           motorcycle: Магазин по продаже мотоциклов
           music: Музыкальный магазин
@@ -905,19 +958,25 @@ ru:
           optician: Оптика
           organic: Магазин органических продуктов
           outdoor: Магазин для активного отдыха
+          paint: Лавка художника
+          pawnbroker: Ломбард
           pet: Зоомагазин
           pharmacy: Аптека
           photo: Фотомагазин
-          salon: Салон
+          seafood: Морепродукты
           second_hand: Комиссионный магазин
           shoes: Обувной магазин
-          shopping_centre: Торговый центр
           sports: Спортивный магазин
           stationery: Канцелярские товары
           supermarket: Супермаркет
           tailor: Портной
+          ticket: Касса
+          tobacco: Табачный магазин
           toys: Магазин игрушек
           travel_agency: Туристической агентство
+          tyres: Магазин шин
+          vacant: Пустующий магазин
+          variety_store: Магазин одной цены
           video: Магазин видеозаписей
           wine: Винный магазин
           "yes": Магазин
@@ -943,6 +1002,7 @@ ru:
           viewpoint: Смотровая площадка
           zoo: Зоопарк
         tunnel:
+          building_passage: Проезд через здание
           culvert: Водопропускная труба, кульверт
           "yes": Тоннель
         waterway:
@@ -974,7 +1034,7 @@ ru:
         level10: Граница пригорода
     description:
       title:
-        osm_nominatim: Местоположение от <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Местоположение от <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Местоположение от <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1138,9 +1198,9 @@ ru:
       trademarks_title_html: <span id="trademarks"></span>Товарные знаки
       trademarks_1_html: OpenStreetMap, логотип с увеличительным стеклом и State of
         the Map являются зарегистрированными товарными знаками Фонда OpenStreetMap.
-        Ð\95Ñ\81ли Ñ\83 Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð²Ð¾Ð¿Ñ\80оÑ\81Ñ\8b Ð¾Ð± Ð¸Ñ\81полÑ\8cзовании Ñ\8dÑ\82иÑ\85 Ð·Ð½Ð°ÐºÐ¾Ð², Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а, Ð·Ð°Ð´Ð°Ð¹Ñ\82е
-        их <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">рабочей
-        Ð³Ñ\80Ñ\83ппе Ð¿Ð¾ Ð»Ð¸Ñ\86ензиÑ\80ованиÑ\8e</a>.
+        Ð\95Ñ\81ли Ñ\83 Ð²Ð°Ñ\81 ÐµÑ\81Ñ\82Ñ\8c Ð²Ð¾Ð¿Ñ\80оÑ\81Ñ\8b Ð¾Ð± Ð¸Ñ\81полÑ\8cзовании Ñ\8dÑ\82иÑ\85 Ð·Ð½Ð°ÐºÐ¾Ð², Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а, Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ\8cÑ\82еÑ\81Ñ\8c
+        с <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">Политикой
+        Ð² Ð¾Ð±Ð»Ð°Ñ\81Ñ\82и Ñ\82оваÑ\80нÑ\8bÑ\85 Ð·Ð½Ð°ÐºÐ¾Ð²</a>.
   welcome_page:
     title: Добро пожаловать!
     introduction_html: Добро пожаловать на OpenStreetMap, открытую и свободную карту
@@ -1172,8 +1232,8 @@ ru:
       paragraph_1_html: В OpenStreetMap есть лишь несколько формальных правил, но
         мы бы хотели, чтоб все участники сотрудничали и взаимодействовали с сообществом.
         Если речь идёт о любых действиях, кроме редактирования вручную, пожалуйста,
-        прочитайте рекомендацияи по <a href="http://wiki.openstreetmap.org/wiki/Import/Guidelines">импорту</a>
-        и <a href="http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">автоматизированным
+        прочитайте рекомендацияи по <a href="https://wiki.openstreetmap.org/wiki/Import/Guidelines">импорту</a>
+        и <a href="https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">автоматизированным
         правкам</a> и следуйте им в дальнейшем.
     questions:
       title: Остались вопросы?
@@ -1240,7 +1300,7 @@ ru:
       description: Помощь компаниям и организациям в переходе на карты и другие ресурсы
         OpenStreetMap.
     wiki:
-      url: http://wiki.openstreetmap.org/wiki/RU:Main_Page
+      url: https://wiki.openstreetmap.org/wiki/RU:Заглавная_страница
       title: wiki.openstreetmap.org
       description: Посмотреть вики с подробной документацией по OSM
   about_page:
@@ -1497,8 +1557,8 @@ ru:
       user_page_link: страница пользователя
       anon_edits_link_text: Выяснить, в чём дело.
       flash_player_required: Для использования редактора Potlatch необходим Flash-плеер.
-        Вы можете <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">загрузить
-        Flash-плеер с Adobe.com</a>. Существуют и <a href="http://wiki.openstreetmap.org/index.php?title=RU:Editing&uselang=ru">другие
+        Вы можете <a href="https://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">загрузить
+        Flash-плеер с Adobe.com</a>. Существуют и <a href="https://wiki.openstreetmap.org/index.php?title=RU:Editing&uselang=ru">другие
         способы</a> редактирования OpenStreetMap.
       potlatch_unsaved_changes: Имеются несохранённые изменения. (Для сохранения в
         Potlatch снимите выделение с пути или точки, если редактируете в «живом» режиме,
@@ -1711,7 +1771,7 @@ ru:
       description: Обзор последних загруженных маршрутов GPS
       tagged_with: 'с тегами: %{tags}'
       empty_html: Пока здесь ничего нет. <a href='%{upload_link}'>Загрузите новый
-        трек</a> или почитайте про GPS-треки на <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>вики-странице</a>.
+        трек</a> или почитайте про GPS-треки на <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>вики-странице</a>.
     delete:
       scheduled_for_deletion: Запланировано к удалению
     make_public:
@@ -2051,7 +2111,7 @@ ru:
       email never displayed publicly: (не будет показан)
       external auth: 'Внешняя аутентификация:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/RU:OpenID
+        link: https://wiki.openstreetmap.org/wiki/RU:OpenID
         link text: что это?
       public editing:
         heading: 'Публичная правка:'
@@ -2196,6 +2256,8 @@ ru:
       not_a_role: Строка «%{role}» не является допустимой ролью.
       already_has_role: Пользователь уже имеет роль %{role}.
       doesnt_have_role: У пользователя нет роли %{role}.
+      not_revoke_admin_current_user: Невозможно отозвать роль отозвать администратора
+        у текущего пользователя.
     grant:
       title: Подтвердить присвоение роли
       heading: Подтверждение присвоения роли
@@ -2426,9 +2488,10 @@ ru:
       new:
         intro: Заметили ошибку или отсутствие чего-либо? Дайте знать об этом другим
           картографам, чтобы они могли это исправить. Поместите маркер на карту в
-          нужном месте и напишите замечание, объясняющее проблему. (Пожалуйста, не
-          вводите здесь личные данные, информацию из карт, защищённых авторскими правами,
-          или списки каталогов.)
+          нужном месте и напишите замечание, объясняющее проблему.
+        advice: Ваша заметка является общедоступной и может использоваться для обновления
+          карты, поэтому не вводите личную информацию, информацию из карт, защищённых
+          авторскими правами, или списки каталогов.
         add: Добавить заметку
       show:
         anonymous_warning: Эта заметка содержит комментарии анонимных участников.
@@ -2450,9 +2513,6 @@ ru:
         mapquest_car: На машине (MapQuest)
         mapquest_foot: Пешком (MapQuest)
         osrm_car: На машине (OSRM)
-        mapzen_bicycle: Велосипед (Mapzen)
-        mapzen_car: Автомобиль (Mapzen)
-        mapzen_foot: Пешком (Mapzen)
       descend: По убыванию
       directions: Маршрут
       distance: Расстояние
index 60573e3fc23ac2089718da1e8415312225b2a1ea..61dee2f1c7927dcae0e5d4dd8566abfb1024929f 100644 (file)
@@ -438,33 +438,26 @@ scn:
           crematorium: Crimatoriu
           dentist: Dintista
           doctors: Dutturi
-          dormitory: Durmitoriu
           drinking_water: Acqua pi vìviri
           driving_school: Scola guida
           embassy: Ammasciata
-          emergency_phone: Telèfunu d'emirgenza
           fast_food: Fast Food
           ferry_terminal: Attraccu dû traghettu
-          fire_hydrant: Idranti
           fire_station: Pumperi
           food_court: Zona di risturazzioni
           fountain: Funtana
           fuel: Pompa dâ binzina
           gambling: Scummissi
           grave_yard: Cimiteru
-          gym: Palestra
-          health_centre: Casa di cura
           hospital: Spitali
           hunting_stand: Barracca dî cacciatura
           ice_cream: Gilatarìa
           kindergarten: Asilu
           library: Libbrarìa
-          market: Mircatu
           marketplace: Mircatu
           monastery: Munasteru
           motorcycle_parking: Pusteggiu dî muturi
           nightclub: Night Club
-          nursery: Asilu
           nursing_home: Casa di riposu
           office: Uffizziu
           parking: Pusteggiu
@@ -478,7 +471,6 @@ scn:
           prison: Càrciri
           pub: Pub
           public_building: Edificiu pùbblicu
-          reception_area: Accittazzioni
           recycling: Ìsula eculòggica
           restaurant: Risturanti
           retirement_home: Casa di riposu
@@ -574,7 +566,6 @@ scn:
           trunk: Supirstrata
           trunk_link: Supirstrata
           unclassified: Strata senza classificazzioni
-          unsurfaced: Strata stirrata
           "yes": Strata
         historic:
           archaeological_site: Zona archiulòggica
@@ -639,7 +630,6 @@ scn:
         leisure:
           beach_resort: Lidu
           bird_hide: Ossirvatoriu pi l'auceddi
-          club: Cìrculu
           common: Cumuni
           dog_park: Parcu dî cani
           fishing: Riserva di pisca
@@ -732,8 +722,6 @@ scn:
           "yes": Uffizziu
         place:
           allotments: Tirritoriu agrìculu o ricriativu
-          block: Isulatu
-          airport: Ariuportu
           city: Cità
           country: Paisi
           county: Cuntea
@@ -745,7 +733,6 @@ scn:
           islet: Isuletta
           isolated_dwelling: Casi isulati
           locality: Cuntrata
-          moor: Molu
           municipality: Cumuni
           neighbourhood: Quarteri
           postcode: CAP
@@ -762,10 +749,8 @@ scn:
           abandoned: Ferruvìa abbannunata
           construction: Ferruvìa n custruzzioni
           disused: Ferruvìa n disusu
-          disused_station: Stazzioni dû trenu abbannunata
           funicular: Funiculari
           halt: Firmata dû trenu
-          historic_station: Stazzioni dû trenu stòrica
           junction: Biviu ferruviariu
           level_crossing: Passaggiu a liveddu
           light_rail: Mitrupulitana leggia
@@ -829,7 +814,6 @@ scn:
           hairdresser: Piluccheri
           hardware: Firramenta
           hifi: Hi-Fi
-          insurance: Assicurazzioni
           jewelry: Giujillirìa
           kiosk: Cioscu
           laundry: Lavannarìa
@@ -845,10 +829,8 @@ scn:
           pet: Nigozziu di l'armali
           pharmacy: Farmacìa
           photo: Artìculi di futugrafìa
-          salon: Saluni di biddizza
           second_hand: Artìculi di secunna manu
           shoes: Scarparu
-          shopping_centre: Centru cummirciali
           sports: Artìculi spurtivi
           stationery: Cartaru
           supermarket: Supirmircatu
index 3fe4afd0e91eb2a306e10110400e7a555aff513c..809ae90031f2118bc00ea214954d926067fac207 100644 (file)
@@ -414,30 +414,23 @@ sco:
           crematorium: Crematorium
           dentist: Dentist
           doctors: Doctors
-          dormitory: Dormitory
           drinking_water: Drinkin Watter
           driving_school: Drivin Schuil
           embassy: Embassy
-          emergency_phone: Emergency Phone
           fast_food: Fast Fuid
           ferry_terminal: Ferry Terminal
-          fire_hydrant: Fire Hydrant
           fire_station: Fire Station
           food_court: Fuid Coort
           fountain: Foontain
           fuel: Fuel
           grave_yard: Grave Yard
-          gym: Fitness Centre / Gym
-          health_centre: Heal Centre
           hospital: Hospital
           hunting_stand: Huntin Staund
           ice_cream: Ice Cream
           kindergarten: Kindergarten
           library: Library
-          market: Mercat
           marketplace: Mercatplace
           nightclub: Nicht Club
-          nursery: Nursery
           nursing_home: Nursin Home
           office: Office
           parking: Pairkin
@@ -450,7 +443,6 @@ sco:
           prison: Prison
           pub: Pub
           public_building: Public Biggin
-          reception_area: Reception Aurie
           recycling: Recyclin Pynt
           restaurant: Restaurant
           retirement_home: Retirement Home
@@ -531,7 +523,6 @@ sco:
           trunk: Trunk Road
           trunk_link: Trunk Road
           unclassified: Unclassified Road
-          unsurfaced: Unsurfaced Road
         historic:
           archaeological_site: Airchaeological Steid
           battlefield: Battlefield
@@ -676,7 +667,6 @@ sco:
           travel_agent: Travel Agency
           "yes": Office
         place:
-          airport: Airport
           city: Ceety
           country: Kintra
           county: Coonty
@@ -688,7 +678,6 @@ sco:
           islet: Islet
           isolated_dwelling: Isolatit Dwellin
           locality: Locality
-          moor: Muir
           municipality: Municipality
           neighbourhood: Neighbourhuid
           postcode: Postcode
@@ -704,10 +693,8 @@ sco:
           abandoned: Abandoned Railway
           construction: Railway unner Construction
           disused: Disuised Railway
-          disused_station: Disuised Railway Station
           funicular: Funicular Railway
           halt: Train Stap
-          historic_station: Historic Railway Station
           junction: Railway Junction
           level_crossing: Level Crossin
           light_rail: Licht Rail
@@ -771,7 +758,6 @@ sco:
           hairdresser: Hairdresser
           hardware: Hairdware Store
           hifi: Hi-Fi
-          insurance: Insurance
           jewelry: Jewelry Shop
           kiosk: Kiosk Shop
           laundry: Laundry
@@ -787,10 +773,8 @@ sco:
           pet: Pet Shop
           pharmacy: Pharmacy
           photo: Photo Shop
-          salon: Salon
           second_hand: Seicont-haund Shop
           shoes: Shoe Shop
-          shopping_centre: Shoppin Centre
           sports: Sports Shop
           stationery: Stationery Shop
           supermarket: Supermercat
index 6c519622b9332e7e3aca87a0d3c2c665fed7c7f3..c1846ab00b3068952ea19b44ac06272b82f58a82 100644 (file)
@@ -425,31 +425,24 @@ sk:
           crematorium: Krematórium
           dentist: Zubár
           doctors: Lekár
-          dormitory: Študentský domov
           drinking_water: Pitná voda
           driving_school: Autoškola
           embassy: Veľvyslanectvo
-          emergency_phone: Núdzový telefón
           fast_food: Rýchle občerstvenie
           ferry_terminal: Terminál trajektu
-          fire_hydrant: Požiarny hydrant
           fire_station: Požiarna stanica
           food_court: Food court
           fountain: Fontána
           fuel: Benzínová pumpa
           grave_yard: Cintorín
-          gym: Fitnes centrum / telocvičňa
-          health_centre: Zdravotné stredisko
           hospital: Nemocnica
           hunting_stand: Poľovnícky posed
           ice_cream: Zmrzlina
           kindergarten: Materská škola
           library: Knižnica
-          market: Obchod
           marketplace: Tržnica
           monastery: Kláštor
           nightclub: Nočný klub
-          nursery: Jasle
           nursing_home: Sanatórium
           office: Úrad
           parking: Parkovisko
@@ -462,7 +455,6 @@ sk:
           prison: Väzenie
           pub: Krčma
           public_building: Verejná budova
-          reception_area: Recepcia
           recycling: Recyklačné miesto
           restaurant: Reštaurácia
           retirement_home: Domov dôchodcov
@@ -553,7 +545,6 @@ sk:
           trunk: Cesta pre motorové vozidlá
           trunk_link: Privádzač k ceste pre motorové vozidlá
           unclassified: Neklasifikovaná cesta
-          unsurfaced: Nespevnená cesta
           "yes": Cesta
         historic:
           archaeological_site: Archeologické nálezisko
@@ -614,7 +605,6 @@ sk:
         leisure:
           beach_resort: Plážové letovisko
           bird_hide: Vtáčia pozorovateľňa
-          club: Klub
           common: Verejné priestranstvo
           dog_park: Psí park
           fishing: Rybolov (športový)
@@ -703,7 +693,6 @@ sk:
           travel_agent: Cestovná kancelária
           "yes": Úrad
         place:
-          airport: Letisko
           city: Mesto nad 100 tis.
           country: Štát
           county: Okres
@@ -715,7 +704,6 @@ sk:
           islet: Ostrovček
           isolated_dwelling: Samota
           locality: Oblasť
-          moor: Močiar
           municipality: Obecný úrad
           neighbourhood: Štvrť
           postcode: PSČ
@@ -731,10 +719,8 @@ sk:
           abandoned: Zrušená železničná trať
           construction: Železnica vo výstavbe
           disused: Nepoužívaná železnica
-          disused_station: Nepoužívaná železničná stanica
           funicular: Lanová dráha
           halt: Zastávka vlaku
-          historic_station: Zastávka historickej železnice
           junction: Železničný uzol
           level_crossing: Železničný prejazd
           light_rail: Ľahká železnica
@@ -798,7 +784,6 @@ sk:
           hairdresser: Kaderníctvo,holičstvo
           hardware: Železiarstvo
           hifi: Hi-Fi
-          insurance: Poisťovňa
           jewelry: Zlatníctvo
           kiosk: Novinový stánok
           laundry: Práčovňa
@@ -814,10 +799,8 @@ sk:
           pet: Chovprodukt
           pharmacy: Lekáreň
           photo: Fotokino
-          salon: Salón
           second_hand: Bazár
           shoes: Obuv
-          shopping_centre: Nákupné stredisko
           sports: Športový obchod
           stationery: Papierníctvo
           supermarket: Supermarket
index 54764414d893f97b307773deb3cca669b9365a6f..f67b3b2be6f2cc192a57f8e1a9ad37d1b4bccb41 100644 (file)
@@ -445,33 +445,26 @@ sl:
           crematorium: Krematorij
           dentist: Zobozdravnik
           doctors: Zdravniki
-          dormitory: Študentski dom
           drinking_water: Pitna voda
           driving_school: Avtošola
           embassy: Veleposlaništvo
-          emergency_phone: Klic v sili
           fast_food: Hitra hrana
           ferry_terminal: Trajekt
-          fire_hydrant: Hidrant
           fire_station: Gasilska postaja
           food_court: Prehrambeni prostor
           fountain: Vodomet
           fuel: Bencinska črpalka
           gambling: Igre na srečo
           grave_yard: Pokopališče
-          gym: Fitnes / Telovadnica
-          health_centre: Dom zdravja
           hospital: Bolnišnica
           hunting_stand: Lovska opazovalnica
           ice_cream: Sladoled
           kindergarten: Vrtec
           library: Knjižnica
-          market: Trg
           marketplace: Tržnica
           monastery: Samostan
           motorcycle_parking: Parkirišče motornih koles
           nightclub: Nočni klub
-          nursery: Vrtec
           nursing_home: Dom za starejše
           office: Pisarne
           parking: Parkirišče
@@ -485,7 +478,6 @@ sl:
           prison: Zapor
           pub: Pivnica
           public_building: Javne zgradba
-          reception_area: Recepcija
           recycling: Reciklirna točka
           restaurant: Restavracija
           retirement_home: Dom za ostarele
@@ -581,7 +573,6 @@ sl:
           trunk: Hitra cesta
           trunk_link: Priključek na hitro cesto
           unclassified: Neopredeljena cesta
-          unsurfaced: Makadamska pot
           "yes": Cesta
         historic:
           archaeological_site: Arheološko najdbišče
@@ -646,7 +637,6 @@ sl:
         leisure:
           beach_resort: kopališče
           bird_hide: Ptičja opazovalnica
-          club: Klub
           common: Javno zemljišče
           dog_park: Pasji park
           fishing: Ribolovno področje
@@ -738,8 +728,6 @@ sl:
           "yes": Pisarne
         place:
           allotments: Vrtički
-          block: Blok
-          airport: Letališče
           city: Mesto
           country: Država
           county: Okrožje
@@ -751,7 +739,6 @@ sl:
           islet: Otoček
           isolated_dwelling: Osamljena hiša
           locality: Krajevno ime
-          moor: Barje
           municipality: Občina
           neighbourhood: Mestna četrt
           postcode: Poštna številka
@@ -768,10 +755,8 @@ sl:
           abandoned: Opuščena železnica
           construction: Železnica v izgradnji
           disused: Opuščena železnica
-          disused_station: Opuščena železniška postaja
           funicular: Žična vzpenjača
           halt: Železniško postajališče
-          historic_station: Zgodovinska železniška postaja
           junction: Križišče železnic
           level_crossing: Prehod
           light_rail: Mestna železnica
@@ -835,7 +820,6 @@ sl:
           hairdresser: Frizerski salon
           hardware: Železnina
           hifi: Trgovina z avdio opremo
-          insurance: Zavarovalnica
           jewelry: Draguljarna
           kiosk: Kiosk prodajalna
           laundry: Pralnica
@@ -851,10 +835,8 @@ sl:
           pet: Trgovina za male živali
           pharmacy: Lekarna
           photo: Fotograf
-          salon: Lepotilni salon
           second_hand: Trgovina z rabljeno opremo
           shoes: Trgovina s čevlji
-          shopping_centre: Nakupovalni center
           sports: Športna trgovina
           stationery: Papirnica
           supermarket: Supermarket
@@ -2204,9 +2186,6 @@ sl:
         mapquest_car: Avto (MapQuest)
         mapquest_foot: Hoja (MapQuest)
         osrm_car: Avto (OSRM)
-        mapzen_bicycle: Kolo (Mapzen)
-        mapzen_car: Avto (Mapzen)
-        mapzen_foot: Hoja (Mapzen)
       directions: Navodila
       distance: Razdalja
       errors:
index 53d3639c0c056a303416c668e0e1907efb107c75..9610c66501f9b521423412a7d727b6c0b298d113 100644 (file)
@@ -456,33 +456,26 @@ sq:
           crematorium: Krematorium
           dentist: Dentist
           doctors: Mjekët
-          dormitory: Konvikt
           drinking_water: Ujë i pijshëm
           driving_school: Autoshkollë
           embassy: Ambasadë
-          emergency_phone: Kabinë telefoni për emergjencë
           fast_food: Ushqim i shpejtë
           ferry_terminal: Terminal i trageteve
-          fire_hydrant: Hidrant zjarrfikës
           fire_station: Zjarrëfiksat
           food_court: Kënd ushqimi
           fountain: Shatërvan
           fuel: Stacion karburanti
           gambling: Kumar
           grave_yard: Varrezë
-          gym: Qendër fitnesi / Palestër
-          health_centre: Qendër shëndetsore
           hospital: Spital
           hunting_stand: Vend gjuetie
           ice_cream: Akullore
           kindergarten: Kopësht fëmijësh
           library: Bibliotekë
-          market: Market
           marketplace: Treg
           monastery: Manastir
           motorcycle_parking: Vendparkim motoçikletash
           nightclub: Klub nate
-          nursery: Çerdhe
           nursing_home: Çerdhe
           office: Zyrë
           parking: Vendparkim
@@ -496,7 +489,6 @@ sq:
           prison: Burg
           pub: Pub
           public_building: Ndërtesë publike
-          reception_area: Zonë e pritjes
           recycling: Pikë riciklimi
           restaurant: Restorant
           retirement_home: Shtëpi pleqësh
@@ -592,7 +584,6 @@ sq:
           trunk: Rrugë magjistrale
           trunk_link: Rrugë magjistrale
           unclassified: Rrugë e paklasifikuar
-          unsurfaced: Rrugë me kalldrëm
           "yes": Rrugë
         historic:
           archaeological_site: Vend arkeologjik
@@ -657,7 +648,6 @@ sq:
         leisure:
           beach_resort: Plazh
           bird_hide: Kamuflim zogjësh
-          club: Klub
           common: Tokë e përbashkët
           dog_park: Park qenësh
           fishing: Zonë peshkimi
@@ -750,8 +740,6 @@ sq:
           "yes": Zyrë
         place:
           allotments: Kopsht i vogël
-          block: Bllok
-          airport: Aeroport
           city: Qytet
           country: Vend
           county: Vend
@@ -763,7 +751,6 @@ sq:
           islet: Ishull
           isolated_dwelling: Vendbanim i izoluar
           locality: Lokalitet
-          moor: Moçal
           municipality: Komunë
           neighbourhood: Lagje
           postcode: Kodi postar
@@ -780,10 +767,8 @@ sq:
           abandoned: Hekurudhë e braktisur
           construction: Hekurudhë në ndërtim e sipër
           disused: Hekurudhë e braktisur
-          disused_station: Stacion hekurudhor jashtë përdorimi
           funicular: Linjë teleferiku
           halt: Stacion hekerudhor
-          historic_station: Stacion hekurudhor historik
           junction: Nyje hekurudhore
           level_crossing: Kryqzim hekurudhor
           light_rail: Hekurudhë e lehtë
@@ -834,7 +819,6 @@ sq:
           hairdresser: Floktar
           hardware: Hekrari
           hifi: Hi-Fi
-          insurance: Zyre sigurimi
           jewelry: Dyqan bizhuterie
           kiosk: Kiosk
           laundry: Lavanderi
@@ -846,7 +830,6 @@ sq:
           optician: Optikë
           pharmacy: Barnatore
           photo: Fotograf
-          salon: Sallon
           supermarket: Supermarket
           tailor: Rrobaqepës
           toys: Dyqan lodrash
index 192b53287a8e776478196ad81dedb611c1dd4b58..f5ca8e9d4df8631d1cf18cb8151402b4a3d08929 100644 (file)
@@ -312,30 +312,23 @@ sr-Latn:
           crematorium: Krematorijum
           dentist: Zubar
           doctors: Doktor
-          dormitory: Studentski dom
           drinking_water: Pijaća voda
           driving_school: Auto-škola
           embassy: Ambasada
-          emergency_phone: Telefon za hitne slučajeve
           fast_food: Brza hrana
           ferry_terminal: Skela
-          fire_hydrant: Hidrant
           fire_station: Vatrogasna stanica
           food_court: Štandovi za brzu hranu
           fountain: Fontana
           fuel: Benzinska pumpa
           grave_yard: Groblje
-          gym: Fitnes centar
-          health_centre: Dom zdravlja
           hospital: Bolnica
           hunting_stand: Lovački dom
           ice_cream: Prodavnica sladoleda
           kindergarten: Obdanište
           library: Biblioteka
-          market: Pijaca
           marketplace: Pijaca
           nightclub: Noćni klub
-          nursery: Jaslice
           nursing_home: Starački dom
           office: Poslovnica
           parking: Parking
@@ -348,7 +341,6 @@ sr-Latn:
           prison: Zatvor
           pub: Pab
           public_building: Ustanova
-          reception_area: Prijemno područje
           recycling: Mesto za reciklažu
           restaurant: Restoran
           retirement_home: Starački dom
@@ -421,7 +413,6 @@ sr-Latn:
           trunk: Magistralni put
           trunk_link: Magistralni put
           unclassified: Nekategorisani put
-          unsurfaced: Neasfaltirani put
         historic:
           archaeological_site: Arheološko nalazište
           battlefield: Bojište
@@ -549,7 +540,6 @@ sr-Latn:
           travel_agent: Turistička agencija
           "yes": Kancelarija
         place:
-          airport: Aerodrom
           city: Grad
           country: Zemlja
           county: Okrug
@@ -561,7 +551,6 @@ sr-Latn:
           islet: Hrid
           isolated_dwelling: Udaljeno prebivalište
           locality: Lokalitet
-          moor: Močvara
           municipality: Opština
           postcode: Poštanski broj
           region: Područje
@@ -576,10 +565,8 @@ sr-Latn:
           abandoned: Napuštena železnica
           construction: Železnička pruga u izgradnji
           disused: Napuštena železnica
-          disused_station: Napuštena železnička stanica
           funicular: Žičana železnica
           halt: Železničko stajalište
-          historic_station: Istorijska železnička stanica
           junction: Železnički čvor
           level_crossing: Pružni prelaz
           light_rail: Laka železnica
@@ -639,7 +626,6 @@ sr-Latn:
           hairdresser: Frizerski salon
           hardware: Gvožđara
           hifi: Muzička oprema
-          insurance: Osiguranje
           jewelry: Zlatara
           kiosk: Kiosk
           laundry: Perionica rublja
@@ -654,9 +640,7 @@ sr-Latn:
           outdoor: Štand
           pet: Prodavnica kućnih ljubimaca
           photo: Fotografska radnja
-          salon: Salon
           shoes: Prodavnica obuće
-          shopping_centre: Tržni centar
           sports: Sportska oprema
           stationery: Papirnica
           supermarket: Supermarket
index ba3d58d7f1959a07d5ff8a61ce7ea776bc87773a..17df340cdc0ecc2ebb1364b3bdb43bfde4f94988 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Serbian (Cyrillic script) (српски (ћирилица)‎)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: Acamicamacaraca
 # Author: Aktron
 # Author: Macofe
 # Author: Magnumns
@@ -53,7 +54,7 @@ sr:
       tracepoint: Тачка руте
       tracetag: Ознака руте
       user: Корисник
-      user_preference: Поставке корисника
+      user_preference: Подешавања корисника
       user_token: Токен корисника
       way: Линија
       way_node: Тачка линије
@@ -116,7 +117,7 @@ sr:
     deleted_by_html: Избрисао %{user} пре <abbr title='%{title}'>%{time}</abbr>
     edited_by_html: Изменио %{user} пре <abbr title='%{title}'>%{time}</abbr>
     closed_by_html: Затворио %{user} пре <abbr title='%{title}'>%{time}</abbr>
-    version: Ð\92еÑ\80зиÑ\98а
+    version: Ð\98здаÑ\9aе
     in_changeset: Скуп измена
     anonymous: анониман
     no_comment: (нема коментара)
@@ -389,11 +390,11 @@ sr:
         latlon: <a href="http://openstreetmap.org/">Унутрашњи резултати</a>
         uk_postcode: Резултати са сајта <a href="http://www.npemap.org.uk/">NPEMap/FreeThe
           Postcode</a>
-        ca_postcode: Резултати са сајта <a href="http://geocoder.ca/">Geocoder.ca</a>
-        osm_nominatim: Резултати са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Резултати са сајта <a href="https://geocoder.ca/">Geocoder.ca</a>
+        osm_nominatim: Резултати са сајта <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Резултати са сајта <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Резултати са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Резултати са сајта <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Резултати са сајта <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -444,33 +445,26 @@ sr:
           crematorium: Крематоријум
           dentist: Стоматолог
           doctors: Лекари
-          dormitory: Студентски дом
           drinking_water: Пијаћа вода
           driving_school: Ауто-школа
           embassy: Амбасада
-          emergency_phone: Телефон за хитне случајеве
           fast_food: Брза храна
           ferry_terminal: Трајектни терминал
-          fire_hydrant: Противпожарни хидрант
           fire_station: Ватрогасна станица
           food_court: Пултови са храном
           fountain: Фонтана
           fuel: Гориво
           gambling: Коцкарница
           grave_yard: Гробље
-          gym: Фитнес центар/теретана
-          health_centre: Здравствени центар
           hospital: Болница
           hunting_stand: Ловачка кула
           ice_cream: Продавница сладоледа
           kindergarten: Обданиште
           library: Библиотека
-          market: Пијаца
           marketplace: Зелена пијаца
           monastery: Манастир
           motorcycle_parking: Паркинг за мотоцикле
           nightclub: Ноћни клуб
-          nursery: Јаслице
           nursing_home: Старачки дом
           office: Канцеларија
           parking: Паркинг
@@ -484,7 +478,6 @@ sr:
           prison: Затвор
           pub: Паб
           public_building: Јавна зграда
-          reception_area: Рецепција
           recycling: Место за рециклажу
           restaurant: Ресторан
           retirement_home: Дом пензионера
@@ -580,7 +573,6 @@ sr:
           trunk: Магистрала
           trunk_link: Магистрала
           unclassified: Некласификовани пут
-          unsurfaced: Неасфалтирани пут
           "yes": Пут
         historic:
           archaeological_site: Археолошко налазиште
@@ -645,7 +637,6 @@ sr:
         leisure:
           beach_resort: Приобално одмаралиште
           bird_hide: Осматрачница за птице
-          club: Клуб
           common: Општинско земљиште
           dog_park: Парк за псе
           fishing: Место за риболов
@@ -738,8 +729,6 @@ sr:
           "yes": Канцеларија
         place:
           allotments: Парцеле
-          block: Блок
-          airport: Аеродром
           city: Град
           country: Земља
           county: Округ
@@ -751,7 +740,6 @@ sr:
           islet: Острвце
           isolated_dwelling: Удаљено пребивалиште
           locality: Локалитет
-          moor: Вресиште
           municipality: Општина
           neighbourhood: Кварт
           postcode: Поштански број
@@ -768,10 +756,8 @@ sr:
           abandoned: Напуштена железница
           construction: Железничка пруга у изградњи
           disused: Напуштена железница
-          disused_station: Напуштена железничка станица
           funicular: Жичана железница
           halt: Железничко стајалиште
-          historic_station: Историјска железничка станица
           junction: Железнички чвор
           level_crossing: Пружни прелаз
           light_rail: Лака железница
@@ -835,7 +821,6 @@ sr:
           hairdresser: Фризерски салон
           hardware: Продавница алата
           hifi: Продавница аудио-опреме
-          insurance: Осигуравајућа компанија
           jewelry: Јувелирница
           kiosk: Трафика
           laundry: Перионица веша
@@ -851,10 +836,8 @@ sr:
           pet: Продавница за кућне љубимце
           pharmacy: Апотека
           photo: Фотографска радња
-          salon: Салон
           second_hand: Продавница половне робе
           shoes: Продавница обуће
-          shopping_centre: Тржни центар
           sports: Продавница спортске опреме
           stationery: Продавница канцеларијског прибора
           supermarket: Супермаркет
@@ -917,7 +900,7 @@ sr:
         level10: Граница насеља
     description:
       title:
-        osm_nominatim: Локација са сајта <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Локација са сајта <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Локација са сајта <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -995,19 +978,19 @@ sr:
       title_html: Ауторска права и лиценца
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> садржи <i>слободне податке</i> који су доступни под лиценцом <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) организације <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: |2-
           Можете да умножавате, делите, преносите и прилагођавате
           наше податке, све док именујете Опенстритмап и њене
           уреднике. Ако желите да мењате и дограђујете наше податке,
           можете их делити само под истом лиценцом.
-          Цео <a href="http://opendatacommons.org/licenses/odbl/1.0/">
+          Цео <a href="https://opendatacommons.org/licenses/odbl/1.0/">
           текст уговора</a> објашњава вам ваша права и одговорности.
       intro_3_html: |-
         Картографија у нашим пољима мапа и документацији
-        нуди се под лиценцом <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.mk">Кријејтив комонс Ауторство-Делити под истим условима 2.0</a> (CC-BY-SA).
+        нуди се под лиценцом <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.mk">Кријејтив комонс Ауторство-Делити под истим условима 2.0</a> (CC BY-SA).
       credit_title_html: Како да именујете OpenStreetMap
       credit_1_html: |-
         Захтевамо да као носиоце ауторских права наведете &ldquo;&copy; ОпенСтитМап
@@ -1015,7 +998,7 @@ sr:
       credit_2_html: |-
         Такође неопходно је недвосмислено навести да су подаци доступни под лиценцом отворене базе података "Open
         Database License", и ако користите наше плочице за карту, да је картографија лиценцирана под CC BY-SA. Ово можете учинити упућивањем на
-        <a href="http://www.openstreetmap.org/copyright">ову страницу за ауторска права</a>.
+        <a href="https://www.openstreetmap.org/copyright">ову страницу за ауторска права</a>.
         Друга могућност је да ако ширите ОСМ у облику податка, лиценце можете навести и повезати директно. У медијима у којима повезивање није могуће (нпр. штампани материјали), предлажемо да упутите читаоце на openstreetmap.org (можда проширујући
         'OpenStreetMap' на пуну адресу), на opendatacommons.org, и ако је потребно, на creativecommons.org.
       credit_3_html: |-
@@ -1104,7 +1087,7 @@ sr:
         групи за лиценце</a>.
   welcome_page:
     title: Добро дошли!
-    introduction_html: Добродошли на ОпенСтритМап, бесплатну изменљиву карту света.
+    introduction_html: Добро дошли на OpenStreetMap, бесплатну изменљиву карту света.
       Сада кад сте се пријавили, спремни сте да почнете са картографијом. Ево га брзи
       водич са најбитнијим стварима које је потребно знати.
     whats_on_the_map:
@@ -1172,7 +1155,7 @@ sr:
       теме.
     welcome:
       url: /welcome
-      title: Добродошли на ОСМ
+      title: Добро дошли на ОСМ
       description: Почни са овим брзим водичем који покрива основе ОпенСтритМапа
     beginners_guide:
       url: http://wiki.openstreetmap.org/wiki/Sr:Beginners%27_guide
@@ -1464,7 +1447,7 @@ sr:
       get_directions_title: Пронађите навигацију између две тачке
       from: Од
       to: До
-      where_am_i: Ð\93де Ñ\81ам?
+      where_am_i: Ð\93де Ñ\98е Ð¾Ð²Ð¾?
       where_am_i_title: Установите тренутну локацију помоћу претраживача
       submit_text: Иди
     key:
@@ -1704,7 +1687,7 @@ sr:
     oauthorize_failure:
       title: Неуспешан захтев за ауторизацију
       denied: Онемогућили сте да апликација %{app_name} приступи Вашем налогу.
-      invalid: Ð¢Ð¾ÐºÐµÐ½ Ð·Ð° Ð°Ñ\83Ñ\82оÑ\80изаÑ\86иÑ\98Ñ\83 Ð½Ð¸Ñ\98е Ð²Ð°Ð»Ð¸Ð´ан.
+      invalid: Ð¢Ð¾ÐºÐµÐ½ Ð·Ð° Ð°Ñ\83Ñ\82оÑ\80изаÑ\86иÑ\98Ñ\83 Ð½Ð¸Ñ\98е Ð¸Ñ\81пÑ\80аван.
     revoke:
       flash: Опозвали сте новчић за %{application}
     permissions:
@@ -1981,12 +1964,12 @@ sr:
       email never displayed publicly: (никада се не приказује јавно)
       external auth: 'Спољна аутентификација:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: шта је ово?
       public editing:
         heading: 'Јавно уређивање:'
         enabled: Омогућено. Није анонимно и могу се уређивати подаци.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: шта је ово?
         disabled: Онемогућено и не могу се уређивати подаци. Све претходне измене
           су анонимне.
@@ -1996,7 +1979,7 @@ sr:
         text: Тренутно су ваше измене анонимне и људи вам не могу слати поруке или
           видети вашу локацију. Да бисте показали ваше измене и дозволили људима да
           вас контактирају, кликните на дугме испод. <b>Од промена АПИ-ја 0.6, само
-          јавни корисници могу уређивати мапе</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">сазнајте
+          јавни корисници могу уређивати мапе</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">сазнајте
           зашто</a>).<ul><li>Ваша е-адреса неће бити откривена на овај начин.</li><li>Ова
           радња не може бити опозвана и сви нови корисници су од сада постављени као
           јавни.</li></ul>
@@ -2106,7 +2089,7 @@ sr:
       invalid_credentials: Невалидни аутентификациони акредитиви
       no_authorization_code: Нема кода ауторизације
       unknown_signature_algorithm: Непознат потписни алгоритам
-      invalid_scope: Ð\9dевалидан опсед
+      invalid_scope: Ð\9dеиÑ\81пÑ\80аван опсед
     auth_association:
       heading: Ваш ID још увек није повезан са налогом OpenStreetMap.
       option_1: |-
@@ -2339,8 +2322,7 @@ sr:
       new:
         intro: Наишли сте на грешку или нешто недостаје? Обавестите друге картографе
           како бисмо решили проблем. Преместите маркер на исправно место и напишите
-          објашњење. Молимо вас да не уносите личне податке, информације из мапа заштићених
-          ауторским правима или спискове каталога.
+          објашњење.
         add: Додај белешку
       show:
         anonymous_warning: Ова белешка садржи коментаре анонимних корисника које би
@@ -2361,9 +2343,6 @@ sr:
         mapquest_car: Аутомобилом (MapQuest)
         mapquest_foot: Пешке (MapQuest)
         osrm_car: Аутомобилом (OSRM)
-        mapzen_bicycle: Бициклом (Mapzen)
-        mapzen_car: Аутомобилом (Mapzen)
-        mapzen_foot: Пешке (Mapzen)
       descend: Опадајуће
       directions: Путања
       distance: Удаљеност
index 53b632b40a59d868666dbd39b61286abbeef7006..5481d03b20e5c53d9f5682985dfd78494108ee3b 100644 (file)
@@ -169,6 +169,8 @@ sv:
         title_comment: Ändringsset %{id} - %{comment}
       join_discussion: Logga in för att delta i diskussionen
       discussion: Diskussion
+      still_open: Ändringsset är fortfarande öppet - diskussionen kommer att öppnas
+        när ändringsset har stängts.
     node:
       title: 'Nod: %{name}'
       history_title: 'Nodhistorik: %{name}'
@@ -379,7 +381,7 @@ sv:
       embeddable_html: Inbäddad HTML
       licence: Licens
       export_details: Data från OpenStreetMap har gjorts tillgänglig under licensen  <a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
+        href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open
         Database License</a> (ODbL).
       too_large:
         advice: 'Om ovanstående export misslyckas, vänligen överväg att använda en
@@ -418,14 +420,14 @@ sv:
   geocoder:
     search:
       title:
-        latlon: Resultat från <a href="http://openstreetmap.org/">OpenStreetMap</a>
+        latlon: Resultat från <a href="https://openstreetmap.org/">OpenStreetMap</a>
         uk_postcode: Resultat från <a href="http://www.npemap.org.uk/">NPEMap / Free
           The Postcode</a>
-        ca_postcode: Resultat från <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: Resultat från <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: Resultat från <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Resultat från <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Resultat från <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: Resultat från <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: Resultat från <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: Resultat från <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -435,12 +437,17 @@ sv:
           chair_lift: Stollift
           drag_lift: Släplift
           gondola: Gondolbana
+          platter: Knapplift
           station: Linbanestation
+          t-bar: Ankarlift
         aeroway:
           aerodrome: Flygfält
+          airstrip: Landningsbana
           apron: Platta
           gate: Gate
+          hangar: Hangar
           helipad: Helikopterplatta
+          parking_position: Parkeringsplats
           runway: Landningsbana
           taxiway: Taxibana
           terminal: Terminal
@@ -475,39 +482,33 @@ sv:
           crematorium: Krematorium
           dentist: Tandläkare
           doctors: Läkare
-          dormitory: Studenthem
           drinking_water: Dricksvatten
           driving_school: Körskola
           embassy: Ambassad
-          emergency_phone: Nödtelefon
           fast_food: Snabbmat
           ferry_terminal: Färjeterminal
-          fire_hydrant: Brandpost
           fire_station: Brandstation
           food_court: Food Court
           fountain: Fontän
           fuel: Bränsle
           gambling: Spel
           grave_yard: Begravningsplats
-          gym: Fitnesscenter / Gym
-          health_centre: Vårdcentral
           hospital: Sjukhus
           hunting_stand: Jakttorn
           ice_cream: Glass
           kindergarten: Dagis
           library: Bibliotek
-          market: Torghandel
           marketplace: |2-
 
             Marknad
           monastery: Kloster
           motorcycle_parking: Motorcykelparkering
           nightclub: Nattklubb
-          nursery: Förskola
           nursing_home: Vårdhem
           office: Kontor
           parking: Parkeringsplats
           parking_entrance: Parkeringsinfart
+          parking_space: Parkeringsplats
           pharmacy: Apotek
           place_of_worship: Plats för tillbedjan
           police: Polis
@@ -517,7 +518,6 @@ sv:
           prison: Fängelse
           pub: Pub
           public_building: Offentlig byggnad
-          reception_area: Reception
           recycling: Återvinningsstation
           restaurant: Restaurang
           retirement_home: Äldreboende
@@ -550,6 +550,7 @@ sv:
           protected_area: Skyddat område
         bridge:
           aqueduct: Akvedukt
+          boardwalk: Strandpromenad
           suspension: Hängbro
           swing: Svängbro
           viaduct: Viadukt
@@ -569,6 +570,7 @@ sv:
           "yes": Hantverksbutik
         emergency:
           ambulance_station: Ambulansstation
+          assembly_point: Mötesplats
           defibrillator: Defibrillator
           landing_site: Nödlandningsplats
           phone: Nödtelefon
@@ -578,11 +580,13 @@ sv:
           bus_guideway: Spårbussväg
           bus_stop: Busshållplats
           construction: Väg under byggnad
+          corridor: Korridor
           cycleway: Cykelspår
           elevator: Hiss
           emergency_access_point: Utryckningsplats
           footway: Gångväg
           ford: Vadställe
+          give_way: Väjningspliktsskylt
           living_street: Gångfartsområde
           milestone: Milstolpe
           motorway: Motorväg
@@ -604,6 +608,7 @@ sv:
           services: Rastplats-väg
           speed_camera: Trafiksäkerhetskamera
           steps: Trappa
+          stop: Stoppskylt
           street_lamp: Gatlykta
           tertiary: Landsväg
           tertiary_link: Landsväg
@@ -612,8 +617,8 @@ sv:
           trail: Vandringsled
           trunk: Stamväg
           trunk_link: På-/avfart till stamväg/motortrafikled
+          turning_loop: Vändslinga
           unclassified: Oklassificerad väg
-          unsurfaced: Oasfalterad väg
           "yes": Väg
         historic:
           archaeological_site: Arkeologisk plats
@@ -632,6 +637,7 @@ sv:
           manor: Herrgård
           memorial: Minnesmärke
           mine: Gruva
+          mine_shaft: Gruvschakt
           monument: Monument
           roman_road: Romersk väg
           ruins: Ruin
@@ -641,6 +647,7 @@ sv:
           wayside_cross: Landmärke
           wayside_shrine: Vägkants-helgedom
           wreck: Vrak
+          "yes": Historisk plats
         junction:
           "yes": Korsning
         landuse:
@@ -678,9 +685,9 @@ sv:
         leisure:
           beach_resort: Badort
           bird_hide: Fågeltorn
-          club: Klubb
           common: Allmänning
           dog_park: Hundpark
+          firepit: Gropeld
           fishing: Fiskevatten
           fitness_centre: Gym
           fitness_station: Gym
@@ -705,15 +712,44 @@ sv:
           water_park: Vattenpark
           "yes": Fritid
         man_made:
+          adit: Gruvöppning
+          beacon: Fyr
+          beehive: Bikupa
+          breakwater: Vågbrytare
+          bridge: Bro
+          bunker_silo: Bunker
+          chimney: Skorsten
+          crane: Kran
+          dolphin: Dykdalb
+          dyke: Dike
+          embankment: Fördämning
+          flagpole: Flaggstång
+          gasometer: Gasometer
+          groyne: Vågbrytare
+          kiln: Kalkugn
           lighthouse: Fyr
+          mast: Mast
+          mine: Gruva
+          mineshaft: Gruvschakt
+          petroleum_well: Oljebrunn
+          pier: Pir
           pipeline: Pipeline
+          silo: Silo
+          storage_tank: Lagringstank
+          surveillance: Övervakning
           tower: Torn
+          watermill: Vattenkvarn
+          water_tower: Vattentorn
+          water_well: Brunn
+          water_works: Vattenreningsverk
+          windmill: Väderkvarn
           works: Fabrik
           "yes": handgjord
         military:
           airfield: Militärt flygfält
           barracks: Kaserner
           bunker: Bunker
+          "yes": Militär
         mountain_pass:
           "yes": Bergspass
         natural:
@@ -760,10 +796,12 @@ sv:
           administrative: Administration
           architect: Arkitekt
           company: Företag
+          educational_institution: Utbildningsanstalt
           employment_agency: Bemanningsföretag
           estate_agent: Fastighetsmäklare
           government: Statligt kontor
           insurance: Försäkringskassa
+          it: IT-kontor
           lawyer: Advokat
           ngo: Icke-statligt kontor
           telecommunication: Telefonbolagskontor
@@ -771,9 +809,8 @@ sv:
           "yes": Kontor
         place:
           allotments: Kolonilotter
-          block: Blockera
-          airport: Flygplats
           city: Stad
+          city_block: Kvarter
           country: Land
           county: Län
           farm: Bondgård
@@ -784,7 +821,6 @@ sv:
           islet: Holme
           isolated_dwelling: Enslig bostad
           locality: Läge
-          moor: Hed
           municipality: Kommun
           neighbourhood: Grannskap
           postcode: Postnummer
@@ -801,10 +837,8 @@ sv:
           abandoned: Övergiven järnväg
           construction: Järnväg under anläggande
           disused: Nedlagd järnväg
-          disused_station: Nedlagd järnvägsstation
           funicular: Bergbana
           halt: Tågstopp
-          historic_station: Historisk Järnvägsstation
           junction: Järnvägsknutpunkt
           level_crossing: Järnvägskorsning
           light_rail: Snabbspårväg
@@ -868,12 +902,16 @@ sv:
           hairdresser: Frisör
           hardware: Järnhandel
           hifi: Hi-Fi
-          insurance: Försäkring
+          houseware: Husvaruhandel
+          interior_decoration: Heminredning
           jewelry: Guldsmed
           kiosk: Kiosk
+          kitchen: Kökshandlare
           laundry: Tvättservice
+          lottery: Lotteri
           mall: Köpcentrum
           market: Marknad
+          massage: Massage
           mobile_phone: Mobiltelefonbutik
           motorcycle: Motorcykelhandlare
           music: Musikaffär
@@ -881,21 +919,26 @@ sv:
           optician: Optiker
           organic: Ekologiska livsmedelsaffär
           outdoor: Friluftsbutik
+          paint: Färgbutik
+          pawnbroker: Pantlånare
           pet: Djuraffär
           pharmacy: Apotek
           photo: Fotoaffär
-          salon: Damfrisering
+          seafood: Skaldjur
           second_hand: Second hand-butik
           shoes: Skoaffär
-          shopping_centre: Köpcentrum
           sports: Sportaffär
           stationery: Pappershandel
           supermarket: Snabbköp
           tailor: Skräddare
+          ticket: Biljettbutik
+          tobacco: Tobaksaffär
           toys: Leksaksaffär
           travel_agency: Resebyrå
+          tyres: Däckaffär
+          variety_store: Varuhus
           video: Videobutik
-          wine: Spritbutik
+          wine: Vinhandel
           "yes": Affär
         tourism:
           alpine_hut: Fjällstuga
@@ -919,6 +962,7 @@ sv:
           viewpoint: Utsiktspunkt
           zoo: Djurpark
         tunnel:
+          building_passage: Byggpassage
           culvert: Kulvert
           "yes": Tunnel
         waterway:
@@ -950,7 +994,7 @@ sv:
         level10: Förortsgräns
     description:
       title:
-        osm_nominatim: Plats från <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: Plats från <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: Plats från <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -1027,18 +1071,18 @@ sv:
       title_html: Upphovsrätt och licens
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> är <i>öppen data</i>, gjord tillgänglig under licensen <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) av <a
-        href="http://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
+        href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) av <a
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF).
       intro_2_html: |-
         Du är fri att kopiera, distribuera, överföra och anpassa vår data,
         så länge du anger OpenStreetMap och dess bidragsgivare som källa.
         Om du ändrar eller bygger vidare på vår data kan du
         endast distribuera resultatet under samma licens. Den
-        fullständiga <a href="http://opendatacommons.org/licenses/odbl/1.0/">juridiska
+        fullständiga <a href="https://opendatacommons.org/licenses/odbl/1.0/">juridiska
         texten</a> förklarar dina rättigheter och skyldigheter.
       intro_3_html: |-
         Kartografin i våra kartrutor, och vår dokumentation, är
-        tillgängliga under licensen <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        tillgängliga under licensen <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons Attribution-ShareAlike 2.0</a> (CC BY-SA).
       credit_title_html: Hur du anger OpenStreetMap som källa
       credit_1_html: |-
@@ -1048,7 +1092,7 @@ sv:
         Du måste också göra klart att datan är tillgänglig under licensen
         Open Database License, och om du använder våra kartrutor, att kartografin är
         tillgänglig under licensen CC BY-SA. Du kan göra detta genom att länka till
-        <a href="http://www.openstreetmap.org/copyright">denna sida om upphovsrätt</a>.
+        <a href="https://www.openstreetmap.org/copyright">denna sida om upphovsrätt</a>.
         Alternativt, och som krav om du distribuerar OSM i dataform, kan du namnge
         och länka direkt till licenserna. I media där länkar ej är möjliga
         (t.ex. tryckt material), förslår vi att du hänvisar dina läsare till openstreetmap.org
@@ -1062,7 +1106,7 @@ sv:
       more_title_html: Mer information
       more_1_html: |-
         Läs mer om användning av vår data och hur du anger oss som källa på <a
-        href="http://osmfoundation.org/Licence">OSMF:s licenssida</a>.
+        href="https://osmfoundation.org/Licence">OSMF:s licenssida</a>.
       more_2_html: |-
         Även om OpenStreetMap är öppen data, kan vi inte tillhandahålla något gratis kart-API för tredjeparter.
         Se vår <a href="https://operations.osmfoundation.org/policies/api/">användningspolicy för API</a>,
@@ -1075,9 +1119,9 @@ sv:
         bland annat från:
       contributors_at_html: |-
         <strong>Österrike</strong>: Innehåller data från
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (under licensen
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> och
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (under licensen
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> och
         Land Tirol (under licensen <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT med tillägg</a>).
       contributors_ca_html: |-
         <strong>Kanada</strong>: Innehåller data från
@@ -1086,13 +1130,13 @@ sv:
            Resources Canada), och StatCan (Geography Division,
            Statistics Canada).
       contributors_fi_html: '<strong>Finland</strong>: Innehåller data från Lantmäteriverket
-        i Finlands topografiska databas och andra dataset, under licensen <a href="http://www.maanmittauslaitos.fi/sv/Licens_till_avgiftsfria_datamaterial_version1_20120501">NLSFI</a>.'
+        i Finlands topografiska databas och andra dataset, under licensen <a href="https://www.maanmittauslaitos.fi/sv/Licens_till_avgiftsfria_datamaterial_version1_20120501">NLSFI</a>.'
       contributors_fr_html: |-
         <strong>Frankrike</strong>: Innehåller data
            från Direction Générale des Impôts.
       contributors_nl_html: |-
         <strong>Nederländerna</strong>: Innehåller © AND data, 2007
-        (<a href="http://www.and.com">www.and.com</a>)
+        (<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: |-
         <strong>Nya Zeeland</strong>: Innehåller data från
         Land Information New Zealand. Crown Copyright reserved.
@@ -1112,7 +1156,7 @@ sv:
       contributors_footer_1_html: |-
         För ytterligare detaljer om dessa och andra källor som använts
         för att förbättra OpenStreetMap, se <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">sidan om bidragsgivare</a>
+        href="https://wiki.openstreetmap.org/wiki/Contributors">sidan om bidragsgivare</a>
         på OpenStreetMaps wiki.
       contributors_footer_2_html: "  Införandet av uppgifter i OpenStreetMap innebär
         inte att den ursprungliga \n  datagivaren stödjer OpenStreetMap, ger någon
@@ -1125,13 +1169,12 @@ sv:
       infringement_2_html: |-
         Om du tror att upphovsrättsskyddat material felaktigt har
         lagts in i OpenStreetMaps databas eller till den här webbplatsen, se
-        vårt <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">borttagningsförfarande</a>
+        vårt <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">borttagningsförfarande</a>
         eller fyll i vårt <a href="http://dmca.openstreetmap.org/">online-formulär</a> direkt.
       trademarks_title_html: <span id="trademarks"></span>Varumärken
       trademarks_1_html: OpenStreetMap, förstoringsglas-logotypen och State of the
         Map är registrerade varumärken hos OpenStreetMap Foundation. Om du har frågor
-        gällande din användning av varumärkena, vänligen skicka frågorna till <a href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">arbetsgruppen
-        för licenser</a>.
+        gällande din användning av varumärkena, vänligen se vår <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">varumärkespolicy</a>.
   welcome_page:
     title: Välkommen!
     introduction_html: Välkommen till OpenStreetMap, den fria och redigerbara kartan
@@ -1164,8 +1207,8 @@ sv:
       paragraph_1_html: "OpenStreetMap har få formella regler, men vi förväntar oss
         att alla deltagare samarbetar och kommunicerar med gemenskapen. Om du funderar
         på\nnågon annan aktivitet än manuell redigering av sidan, läs och följ anvisningarna
-        på \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a>
-        och \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserade
+        på \n<a href=\"https://wiki.openstreetmap.org/wiki/Import/Guidelines\">Import</a>
+        och \n<a href=\"https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Automatiserade
         redigeringar</a>."
     questions:
       title: Några frågor?
@@ -1199,7 +1242,7 @@ sv:
       explanation_html: |-
         Om du har frågor om hur vår data används eller om innehållet, se
         <a href='/copyright'>sidan om upphovsrätt</a> för mer juridisk information eller kontakta lämplig
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-arbetsgrupp</a>.
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF-arbetsgrupp</a>.
   help_page:
     title: Få hjälp
     introduction: OpenStreetMap har flera resurser som hjälper dig att lära dig om
@@ -1210,7 +1253,7 @@ sv:
       title: Välkommen till OSM
       description: Börja med den här snabbguiden som täcker grunderna i OpenStreetMap.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Sv:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Sv:Beginners%27_guide
       title: Guide för nybörjare
       description: Guide för nybörjare som underhålls av gemenskapen.
     help:
@@ -1234,7 +1277,7 @@ sv:
       description: Hjälp för företag och organisationer att byta till OpenStreetMap-baserade
         kartor och andra tjänster.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: Sök i wikin för ingående OSM-dokumentation.
   about_page:
@@ -1250,10 +1293,13 @@ sv:
       flygbilder, GPS-enheter och lågteknologiska fältkartor för att kontrollera att
       OSM är korrekt och uppdaterad.
     community_driven_title: Gemenskapsdriven
-    community_driven_html: |-
-      OpenStreetMaps gemenskap är blandad, passionerad och växer varje dag.
-      Bland våra bidragsgivare finns kartentusiaster, GIS-proffs, ingenjörer som håller igång OSM:s servrar, frivilliga som kartlägger katastrofområden, och många andra.
-      För mer information om gemenskapen, se <a href='https://blog.openstreetmap.org'>OpenStreetMap-bloggen</a>, <a href='%{diary_path}'>användardagböcker</a>, <a href='http://blogs.openstreetmap.org/'>gemenskapens bloggar</a>, och <a href='http://www.osmfoundation.org/'>OSM-stiftelsens</a> webbplats.
+    community_driven_html: "OpenStreetMaps gemenskap är blandad, passionerad och växer
+      varje dag.\nBland våra bidragsgivare finns kartentusiaster, GIS-proffs, ingenjörer
+      som håller igång OSM:s servrar, frivilliga som kartlägger katastrofområden,
+      och många andra.\nFör mer information om gemenskapen, se \n<a href='https://blog.openstreetmap.org'>OpenStreetMap-bloggen</a>,
+      \n<a href='%{diary_path}'>användardagböcker</a>, \n<a href='https://blogs.openstreetmap.org/'>gemenskapens
+      bloggar</a>, och \n<a href='https://www.osmfoundation.org/'>OSM-stiftelsens</a>
+      webbplats."
     open_data_title: Öppna data
     open_data_html: 'OpenStreetMap är <i>öppna data</i>: du kan fritt använda den
       för valfritt syfte så länge du anger OpenStreetMap och dess bidragsgivare som
@@ -1479,13 +1525,13 @@ sv:
       user_page_link: användarsida
       anon_edits_link_text: Ta reda på varför det är så.
       flash_player_required: Du måste ha Flash Player för att kunna använda Potlatch,
-        OpenStreetMaps flasheditor. Du kan <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">ladda
-        hem Flash Player från Adobe.com</a>. Det finns också <a href="http://wiki.openstreetmap.org/wiki/Editing">flera
-        andra editorer</a> tillgängliga för OpenStreetMap.
+        OpenStreetMaps flasheditor. Du kan <a href="https://get.adobe.com/flashplayer">ladda
+        hem Flash Player från Adobe.com</a>. Det finns också <a href="https://wiki.openstreetmap.org/wiki/Editing">flera
+        andra redigerare</a> tillgängliga för OpenStreetMap.
       potlatch_unsaved_changes: Du har osparade ändringar. (För att spara i Potlatch,
         bör du avmarkera den nuvarande vägen eller markeringen om du redigerar i realtidsläge,
         eller klicka på Spara om du har en Spara-knapp.)
-      potlatch2_not_configured: Potlatch 2 har inte konfigurerats - se http://wiki.openstreetmap.org/wiki/The_Rails_Port
+      potlatch2_not_configured: Potlatch 2 har inte konfigurerats - se https://wiki.openstreetmap.org/wiki/The_Rails_Port
       potlatch2_unsaved_changes: Du har osparade ändringar. (För att spara i Potlatch
         2, bör du klicka på spara.)
       id_not_configured: iD har inte konfigurerats
@@ -1577,7 +1623,7 @@ sv:
       edit: Redigera
       preview: Förhandsgranska
     markdown_help:
-      title_html: Tolkat med <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Tolkat med <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: Rubriker
       heading: Rubrik
       subheading: Underrubrik
@@ -1687,7 +1733,7 @@ sv:
       description: Bläddra bland nyligen uppladdade GPS-spår
       tagged_with: ' taggad med %{tags}'
       empty_html: Ingenting här ännu. <a href='%{upload_link}'>Ladda upp ett nytt
-        GPS-spår</a> eller lär dig om GPS-spår på <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikin</a>.
+        GPS-spår</a> eller lär dig om GPS-spår på <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikin</a>.
     delete:
       scheduled_for_deletion: GPS-spår schemalagt för radering
     make_public:
@@ -1895,10 +1941,10 @@ sv:
         html: |-
           <p>Till skillnad från andra kartor är OpenStreetMap helt skapad av människor som du. Kartan är öppen för alla att bidra till, uppdatera, ladda ner och använda.</p>
           <p>Registrera dig för att börja kartera. Vi skickar ett mail för att bekräfta ditt konto.</p>
-      license_agreement: När du bekräftar ditt konto måste du samtycka till <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsgivarvillkoren</a>.
+      license_agreement: När du bekräftar ditt konto måste du samtycka till <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsgivarvillkoren</a>.
       email address: 'E-postadress:'
       confirm email address: 'Bekräfta e-postadress:'
-      not displayed publicly: Din adress visas inte offentligt, se vår <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
+      not displayed publicly: Din adress visas inte offentligt, se vår <a href="https://wiki.openstreetmap.org/wiki/Privacy_Policy"
         title="OSMF-integritetspolicy som inkluderar avsnitt om e-postadresser">integritetspolicy</a>
         för mer information
       display name: 'Visat namn:'
@@ -2020,12 +2066,12 @@ sv:
       email never displayed publicly: (visas aldrig offentligt)
       external auth: 'Extern autentisering:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: vad är detta?
       public editing:
         heading: 'Offentlig redigering:'
         enabled: Aktiverat, du är inte anonym och kan redigera data.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: vad är detta?
         disabled: Avstängt och kan inte redigera data, alla redigeringar som gjorts
           är anonyma.
@@ -2164,6 +2210,8 @@ sv:
       not_a_role: Strängen `%{role}' är inte en korrekt roll.
       already_has_role: Användaren har redan rollen %{role}.
       doesnt_have_role: Användaren har inte rollen %{role}.
+      not_revoke_admin_current_user: Kan inte återkalla administratörsroll från nuvarande
+        användare.
     grant:
       title: Bekräfta rolltilldelning
       heading: Bekräfta rolltilldelning
@@ -2386,8 +2434,10 @@ sv:
       new:
         intro: Upptäckt ett misstag eller något som saknas? Låt andra karterare veta
           så att vi kan fixa det. Flytta markören till rätt position och skriv in
-          en kommentar som förklarar problemet. (Vänligen ange inte personuppgifter
-          eller information från upphovsrättsligt skyddade kartor eller kataloger.)
+          en kommentar som förklarar problemet.
+        advice: Din anteckning är offentlig och kan användas för att uppdatera kartan,
+          så skriv inte personuppgifter eller information från upphovsrättsligt skyddade
+          kartor eller kataloger.
         add: Lägg till anteckning
       show:
         anonymous_warning: Denna anteckning innehåller kommentarer från anonyma användare
@@ -2409,9 +2459,6 @@ sv:
         mapquest_car: Bil (MapQuest)
         mapquest_foot: Gående (MapQuest)
         osrm_car: Bil (OSRM)
-        mapzen_bicycle: Cykel (Mapzen)
-        mapzen_car: Bil (Mapzen)
-        mapzen_foot: Fot (Mapzen)
       descend: Fallande
       directions: Vägbeskrivning
       distance: Avstånd
index 35ef5ad8ad9a8c88bf59060162f0c861808f5d93..e6e34af7c79590004d3f6d36c45a50505a5e5670 100644 (file)
@@ -5,10 +5,12 @@
 # Author: ElangoRamanujam
 # Author: Karthi.dr
 # Author: Krishnaprasaths
+# Author: Rakeshonwiki
 # Author: Sank
 # Author: Shanmugamp7
 # Author: Surya Prakash.S.A.
 # Author: TRYPPN
+# Author: தமிழ்க்குரிசில்
 ---
 ta:
   time:
@@ -54,7 +56,7 @@ ta:
         body: உள்ளடக்கம்
       diary_entry:
         user: பயனர்
-        title: à®¤à®²à¯\88பà¯\8dபà¯\81
+        title: à®ªà¯\8aà®°à¯\81ளà¯\8d
         latitude: குறுக்குக் கோடு
         longitude: குத்துயரக் கோடு
         language: மொழி
@@ -72,7 +74,7 @@ ta:
         description: விளக்கம்
       message:
         sender: அனுப்புனர்
-        title: à®¤à®²à¯\88பà¯\8dபà¯\81
+        title: à®ªà¯\8aà®°à¯\81ளà¯\8d
         body: உள்ளடக்கம்
         recipient: பெறுனர்
       user:
@@ -94,13 +96,24 @@ ta:
       name: தொலைவுக் கட்டுப்பாடு
       description: தொலைவு கட்டுப்பாடு (JOSM அல்லது Merkaartor)
   browse:
+    created: உருவாக்கப்பட்டது
+    closed: மூடப்பட்டது
+    version: பதிப்பு
+    in_changeset: மாற்றங்கள்
+    anonymous: அடையாளமற்றவர்
+    view_details: விவரங்களைக் காட்டு
+    location: 'இடம்:'
     changeset:
-      title: மாற்றங்கள்
+      title: 'மாற்றங்கள்: %{id}'
+      belongs_to: ஆசிரியர்
       changesetxml: மாற்றத்தொடுப்பு XML
       osmchangexml: osmChange XML
       feed:
         title: 'மாற்றங்கள்: %{id}'
         title_comment: மாற்றங்கள் %{id}-%{comment}
+      discussion: உரையாடல்
+    relation:
+      members: உறுப்பினர்கள்
     relation_member:
       entry_role: '%{type} %{name} %{role} ஆக'
       type:
@@ -111,12 +124,13 @@ ta:
       entry: தொடர்பு %{relation_name}
       entry_role: தொடர்பு %{relation_name} (%{relation_role} ஆக)
     not_found:
-      sorry: à®®à®©à¯\8dனிà®\95à¯\8dà®\95வà¯\81à®®à¯\8d, %{id} à®\8eனà¯\8dà®± à®\85à®\9fà¯\88யாளமà¯\8d à®\95à¯\8aணà¯\8dà®\9f %{type} à®\8eனà¯\8dபதà¯\81 à®\95ிà®\9fà¯\88à®\95à¯\8dà®\95விலà¯\8dலà¯\88.
+      sorry: மன்னிக்கவும், %{id} என்ற அடையாளம் கொண்ட %{type} கிடைக்கவில்லை.
       type:
         node: முனையம்
         way: வழி
         relation: தொடர்பு
         changeset: மாற்றங்கள்
+        note: குறிப்பு
     timeout:
       sorry: மன்னிக்கவும், %{id} என்ற அடையாளம் கொண்ட %{type} -ற்கான தரவு மீக்கொணரப்பட
         அதிக நேரம் எடுத்துக் கொள்கிறது.
@@ -125,15 +139,20 @@ ta:
         way: வழி
         relation: தொடர்பு
         changeset: மாற்றங்கள்
+        note: குறிப்பு
     redacted:
       type:
+        node: முனையம்
         way: வழி
+        relation: தொடர்பு
     start_rjs:
       loading: ஏற்றப்படுகிறது ...
     tag_details:
       tags: 'குறிப்புக்கள்:'
       wiki_link:
         key: விக்கி  விளக்கப்பக்கம் %{key} குறிச்சொல்லுக்காக
+    note:
+      new_note: புதுக் குறிப்பு
   changeset:
     changeset_paging_nav:
       next: அடுத்து »
@@ -149,9 +168,13 @@ ta:
       area: பகுதி
     list:
       title: மாற்றங்கள்
+      load_more: மேலும் படிக்க
+    rss:
+      full: முழு உரையாடல்
   diary_entry:
     new:
       title: புதிய டைரி உள்ளீடு
+      publish_button: வெளியிடு
     list:
       title: பயனரின் நாட்குறிப்பேடுகள்
       title_friends: நண்பர்களின் நாட்குறிப்பேடுகள்
@@ -161,7 +184,7 @@ ta:
       new: புதிய நாட்குறிப்பேடு உள்ளீடு
       new_title: ஒரு புதிய பதிவை உங்கள் பயனர் நாட்குறிப்பேட்டில் உருவாக்கு
       no_entries: டைரி உள்ளீடுகள் இல்லை
-      recent_entries: 'சமீபத்திய டைரி உள்ளீடுகள்:'
+      recent_entries: சமீப டைரி உள்ளீடுகள்
       older_entries: பழைய உள்ளீடுகள்
       newer_entries: புதிய உள்ளீடுகள்
     edit:
@@ -199,8 +222,12 @@ ta:
       view: காண்
       edit: தொகு
     comments:
+      post: பதியவும்
+      when: எப்பொழுது
       comment: கருத்துரை
+      newer_comments: புதிய கருத்துக்கள்
   export:
+    title: ஏற்றுமதி செய்
     start:
       licence: உரிமம்
       options: விருப்பத் தேர்வுகள்
@@ -215,9 +242,7 @@ ta:
     search_osm_nominatim:
       prefix:
         amenity:
-          airport: விமான நிலையம்
           arts_centre: கலை மையம்
-          auditorium: கலையரங்கம்
           bank: வங்கி
           bar: பார்
           bicycle_parking: சைக்கிள் நிறுத்துமிடம்
@@ -227,49 +252,38 @@ ta:
           car_rental: கார் வாடகைக்கு
           car_wash: கார் சுத்தம் செய்யும் இடம்
           cinema: சினிமா (திரையரங்கம்)
-          club: சங்கம்
           college: கல்லுரி
           community_centre: சமுதாய மையம்
           courthouse: நீதிமன்றம்
           crematorium: சுடுகாடு
           dentist: பல் மருத்துவர்கள்
           doctors: மருத்துவர்கள்
-          dormitory: பலர் தூங்கும் இடம்
           drinking_water: குடிநீர்
           driving_school: ஓட்டுநர் பயிற்சிப்பள்ளி
           embassy: தூதரகம்
-          emergency_phone: அவசர தொலைபேசி
           fast_food: துரித உணவு
           fire_station: தீயணைப்பு நிலையம்
           food_court: உணவுச்சாலை
           fountain: நீரூற்று
           fuel: எரிபொருள்
           grave_yard: இடுகாடு
-          gym: உடற்பயிற்சி மையம் / ஜிம்
-          hall: கூடம்
-          health_centre: சுகாதார மையம்
           hospital: மருத்துவமனை
-          hotel: உண்டுறை விடுதி
           ice_cream: ஐஸ் கிரீம்
           kindergarten: சிறு குழந்தைகளுக்கு உரிய (விளையாட்டு முறை) கல்வி கூடம்
           library: நூலகம்
-          market: சந்தை
           marketplace: சந்தை கூடுமிடம்
           nightclub: இரவு கிளப்
-          nursery: குழந்தைகள் பள்ளி
           nursing_home: மருத்துவ இல்லம்
           office: அலுவலகம்
-          park: பூங்கா
           parking: வண்டிகள் நிறுத்துமிடம்
           pharmacy: மருந்தகம்
+          place_of_worship: வழிபாட்டுத் தலம்
           police: காவல்
           post_box: அஞ்சல் பெட்டி
           post_office: தபால் நிலையம்
           preschool: முன் பள்ளி
           prison: சிறைச்சாலை
           public_building: பொது கட்டிடம்
-          public_market: பொது சந்தை
-          reception_area: வரவேற்பு பகுதி
           recycling: மறுசுழற்சி புள்ளி
           restaurant: உணவு விடுதி
           retirement_home: ஓய்வு இல்லம்
@@ -290,11 +304,14 @@ ta:
           youth_centre: இளைஞர் மையம்
         boundary:
           administrative: நிர்வாக எல்லை
+          national_park: தேசியப் பூங்கா
+          protected_area: பாதுகாக்கப்பட்ட இடம்
         bridge:
           "yes": பாலம்
         building:
           "yes": கட்டிடம்
         highway:
+          abandoned: கைவிடப்பட்ட நெடுஞ்சாலை
           bus_guideway: வழிநடத்தப்பட்ட பேருந்து தடம்
           bus_stop: பேருந்து நிறுத்தம்
           construction: நெடுஞ்சாலை  கட்டுமானப் பணிகள் நடந்து கொண்டுள்ளது.
@@ -303,7 +320,6 @@ ta:
           footway: நடைபாதை
           living_street: வாழும் வீதி
           milestone: மைல் கல்
-          minor: சிறு சாலை
           path: பாதை
           pedestrian: பாதசாரிகள் வழி
           platform: நடைமேடை
@@ -315,11 +331,12 @@ ta:
           secondary_link: இரண்டாம் நிலை சாலை
           steps: படிகள்
           unclassified: வகைப்படுத்தாத சாலை
+          "yes": சாலை
         historic:
           archaeological_site: தொல்பொருள் தளம்
           battlefield: போர்க்களம்
           boundary_stone: எல்லைக் கல்
-          building: கட்டிடம்
+          building: à®ªà¯\81ராதானà®\95à¯\8d à®\95à®\9fà¯\8dà®\9fிà®\9fà®®à¯\8d
           castle: கோட்டை
           church: தேவாலயம்
           house: வீடு
@@ -327,9 +344,11 @@ ta:
           memorial: நினைவிடம்
           mine: சுரங்கம்
           monument: நினைவுச்சின்னம்
-          museum: அருங்காட்சியகம
+          stone: கல
           tower: கோபுரம்
           wreck: சேதமானது
+        junction:
+          "yes": சந்திப்பு
         landuse:
           commercial: வணிக பகுதி
           construction: கட்டுமானம்
@@ -340,12 +359,10 @@ ta:
           industrial: தொழிலக பகுதி
           military: ராணுவ பகுதி
           mine: சுரங்கம்
-          park: பூங்கா
           railway: தொடர்வண்டி பாதை
           reservoir: நீர்த்தேக்கம்
           residential: குடியிருப்பு பகுதி
           retail: சில்லறை
-          wood: மரம்
         leisure:
           beach_resort: கடற்கரை தங்குமிடம்
           common: பொதுவான நிலம்
@@ -360,15 +377,17 @@ ta:
           swimming_pool: நீச்சல் குளம்
           track: ஓடு தளம்
           water_park: நீர் பூங்கா
+        man_made:
+          tower: கோபுரம்
         natural:
           bay: வளைகுடா
           beach: கடற்கரை
           cave_entrance: குகை நுழைவாயில்
+          grassland: புல்வெளி
           heath: சுகாதாரம்
           hill: குன்று
           island: தீவு
           land: நிலம்
-          river: நதி
           rock: கல்
           spring: வசந்த காலம்
           tree: மரம்
@@ -378,11 +397,14 @@ ta:
           wood: மரம்
         office:
           accountant: கணக்காளர்
+          administrative: நிர்வாகம்
           company: நிறுவனம்
+          government: அரசு அலுவலகம்
+          insurance: காப்பீட்டு அலுவலகம்
           lawyer: வழக்குரைஞர்
+          ngo: அரசு சாரா தன்னார்வ அலுவலகம்
           "yes": அலுவலகம்
         place:
-          airport: விமான நிலையம்
           city: நகரம்
           country: நாடு
           county: நாடு
@@ -403,7 +425,6 @@ ta:
           abandoned: கைவிடப்பட்ட தொடர்வண்டி பாதை
           construction: தொடர்வண்டி பாதை  கட்டுமானப் பணிகள் நடந்து கொண்டுள்ளது.
           halt: ரயில் நிறுத்துமிடம்
-          historic_station: வரலாற்று சிறப்புமிக்க ரயில் நிலையம்
           junction: ரயில்வே சந்திப்பு
           platform: ரயில்வே நடைமேடை
           station: ரயில் நிலையம்
@@ -426,7 +447,6 @@ ta:
           fish: மீன் கடை
           food: உணவுக் கடை
           gallery: காட்சியகம்
-          insurance: காப்புறுதி
           jewelry: நகைக் கடை
           laundry: சலவை
           market: சந்தை
@@ -434,17 +454,15 @@ ta:
           motorcycle: மோட்டார் சைக்கிள் கடை
           pet: வளர்ப்பு விலங்குகள் கடை
           photo: புகைப்பட கடை
-          salon: முடி திருத்தகம்
           shoes: காலணிகள் கடை
-          shopping_centre: ஷாப்பிங் மையம்
           stationery: எழுதுபொருள் கடை
+          supermarket: பேரங்காடி
         tourism:
           guest_house: விருந்தினர் இல்லம்
           hostel: விடுதி
           hotel: விடுதி
           information: தகவல்
           museum: அருங்காட்சியகம்
-          valley: பள்ளத்தாக்கு
           viewpoint: காட்சிமுனை
           zoo: விலங்கு காட்சி சாலை
         waterway:
@@ -453,7 +471,6 @@ ta:
           dam: அணை
           lock: பூட்டு
           river: ஆறு
-          riverbank: நதிக்கரை
           waterfall: நீர்வீழ்ச்சி
     description:
       types:
@@ -463,15 +480,6 @@ ta:
     results:
       no_results: முடிவுகள் எதுவும் காணப்படவில்லை
       more_results: மேலும் முடிவுகள்
-    direction:
-      south_west: தென் மேற்கு
-      south: தெற்கு
-      south_east: தென் கிழக்கு
-      east: கிழக்கு
-      north_east: வட கிழக்கு
-      north: வடக்கு
-      north_west: வட மேற்கு
-      west: மேற்கு
   layouts:
     home: முகப்பு
     logout: விடுபதிகை
@@ -480,15 +488,23 @@ ta:
     edit: தொகு
     history: வரலாறு
     help: உதவி
-    copyright: பதிப்புரிமை & உரிமம்
+    copyright: பதிப்புரிமை
+    community: சமுதாயம்
     community_blogs: சமுதாய வலைப்பதிவுகள்
     foundation: அறக்கட்டளை
     foundation_title: OpenStreetMap அறக்கட்டளை
     make_a_donation:
       text: ஒரு நன்கொடையை அளிக்கவும்
+    learn_more: மேலும் அறிய
+    more: மேலும்
   license_page:
     foreign:
       title: இந்த மொழிபெயர்ப்பு பற்றி
+  welcome_page:
+    rules:
+      title: விதிமுறைகள்!
+  about_page:
+    next: அடுத்தது
   notifier:
     gpx_notification:
       greeting: வணக்கம்,
@@ -500,6 +516,8 @@ ta:
       greeting: வணக்கம்,
     lost_password_html:
       greeting: வணக்கம்,
+    changeset_comment_notification:
+      greeting: வணக்கம்,
   message:
     inbox:
       title: உள்பெட்டி
@@ -554,7 +572,6 @@ ta:
           primary: முதன்மையான சாலை
           secondary: இரண்டாம் நிலை சாலை
           unclassified: வகைப்படுத்தாத சாலை
-          unsurfaced: பாவப்படாத சாலை
           rail: இரயில்வே
           forest: காடு
           wood: விறகு
@@ -579,6 +596,7 @@ ta:
           - உயரமான இடம்
           private: தனியார் அனுமதி
           construction: சாலைகளில்  கட்டுமானப் பணிகள் நடந்து வருகின்றன.
+          toilets: கழிவறைகள்
   trace:
     edit:
       filename: 'கோப்புப்பெயர்:'
@@ -639,6 +657,9 @@ ta:
       submit: பதிவுசெய்
     edit:
       submit: தொகு
+    show:
+      edit: தொகுப்பு விவரங்கள்
+      confirm: உறுதியாகவா?
     index:
       revoke: திரும்பபெறு
     form:
@@ -654,11 +675,6 @@ ta:
       lost password link: உங்கள் கடவுச்சொல் மறந்துவிட்டதா?
       login_button: புகுபதிகை
       register now: இப்போது பதிவுசெய்யுங்கள்
-      openid_providers:
-        google:
-          title: கூகிள் மூலம் புகுபதிகை செய்
-        yahoo:
-          title: யாகூ கணக்கு மூலம் புகுபதிகை செய்
     logout:
       title: விடுபதிகை
       logout_button: விடுபதிகை
index abbe0f978aee2ab5d99945e050f85149350bf9a6..17c8feeb02a79eee50122e34a7a66a1fa57491a8 100644 (file)
@@ -273,21 +273,16 @@ te:
           crematorium: శ్మశానవాటిక
           dentist: దంతవైద్యుడు
           doctors: వైద్యులు
-          dormitory: వసతిగృహం
           drinking_water: త్రాగు నీరు
           driving_school: డ్రైవింగ్ పాఠశాల
           embassy: దౌత్య కార్యాలయం
-          emergency_phone: అత్యవసర ఫోను
           fast_food: అల్పాహారం
           fuel: ఇంధనం
           grave_yard: స్మశానం
-          health_centre: ఆరోగ్య కేంద్రం
           hospital: ఆసుపత్రి
           ice_cream: ఐస్ క్రీం
           library: గ్రంథాలయం
-          market: సంత
           marketplace: సంత
-          nursery: పిల్లల బడి
           office: కార్యాలయం
           parking: పార్కింగు
           pharmacy: మందుల దుకాణం
@@ -410,7 +405,6 @@ te:
           lawyer: న్యాయవాది
           "yes": కార్యాలయం
         place:
-          airport: విమానాశ్రయం
           city: నగరం
           country: దేశం
           hamlet: కుగ్రామం
@@ -426,7 +420,6 @@ te:
           village: గ్రామం
         shop:
           butcher: కసాయి
-          insurance: బీమా
           jewelry: నగల దుకాణం
           laundry: చాకలి
           market: అంగడి
index 1a47c367e733589a8c3365796cfd9bc64287b8e8..de5ebfb5372fbd1206ac7dcc23656119f0a51329 100644 (file)
@@ -5,6 +5,7 @@
 # Author: Pon44695
 # Author: Ruila
 # Author: TMo3289
+# Author: Xwindows
 ---
 th:
   time:
@@ -210,7 +211,7 @@ th:
         ก่อน</abbr>
       hidden_by: ซ่อนโดย %{user} เมื่อ <abbr title='%{exact_time}'>%{when} ก่อน</abbr>
     query:
-      title: à¸\84ุà¸\93สมà¸\9aัà¸\95ิà¸\81ารสอà¸\9aà¸\96าม
+      title: à¸ªà¹\88วà¸\99à¸\9bระà¸\81อà¸\9aà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88
       introduction: คลิกที่แผนที่เพื่อค้นหาคุณสมบัติต่าง ๆ ที่อยู่ใกล้เคียง
       nearby: คุณสมบัติที่อยู่ใกล้เคียง
       enclosing: คุณสมบัติที่ปิดล้อม
@@ -337,7 +338,7 @@ th:
       embeddable_html: HTML ฝังตัวได้
       licence: สัญญาอนุญาต
       export_details: บรรดาข้อมูลที่ปรากฏในเว็บไซต์ OpenStreetMap อนุญาตให้ใช้ภายใต้<a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">สัญญาอนุญาต Open Data
+        href="https://opendatacommons.org/licenses/odbl/1.0/">สัญญาอนุญาต Open Data
         Commons Open Database</a> (ODbL).
       too_large:
         advice: 'ถ้าการส่งออกข้างต้นล้มเหลว โปรดพิจารณาใช้แหล่งข้อมูลตามที่ระบุด้านล่างนี้:'
@@ -368,14 +369,14 @@ th:
   geocoder:
     search:
       title:
-        latlon: ผลการค้นหาจาก <a href="http://openstreetmap.org/">เว็บไซต์นี้</a>
+        latlon: ผลการค้นหาจาก <a href="https://openstreetmap.org/">เว็บไซต์นี้</a>
         uk_postcode: ผลการค้นหาจาก <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
           Postcode</a>
-        ca_postcode: ผลการค้นหาจาก <a href="http://geocoder.ca/">Geocoder.CA</a>
-        osm_nominatim: ผลการค้นหาจาก <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: ผลการค้นหาจาก <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: ผลการค้นหาจาก <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: ผลการค้นหาจาก <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim_reverse: ผลการค้นหาจาก <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: ผลการค้นหาจาก <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames_reverse: ผลการค้นหาจาก <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
@@ -385,11 +386,15 @@ th:
           chair_lift: รถกระเช้าเปลือย
           drag_lift: ลิฟต์ลากสกี
           gondola: รถกระเช้า
+          platter: กระเช้าลาก
+          pylon: เสากระเช้า
           station: สถานีรถกระเช้า
         aeroway:
-          aerodrome: สนามบิน (ทุกประเภท)
+          aerodrome: ลานบิน
+          airstrip: ลานบินขนาดเล็ก
           apron: ลานจอดเครื่องบิน
           gate: ประตูขึ้นเครื่อง
+          hangar: โรงเก็บเครื่องบิน
           helipad: ลานจอดเฮลิคอปเตอร์
           runway: ทางวิ่งเครื่องบิน
           taxiway: ทางขับเครื่องบิน
@@ -397,14 +402,14 @@ th:
         amenity:
           animal_shelter: สถานสงเคราะห์สัตว์
           arts_centre: ศูนย์ศิลปะ
-          atm: à¸\9aริà¸\81ารà¹\80à¸\87ิà¸\99สà¸\94à¸\94à¹\88วà¸\99
+          atm: à¹\80à¸\84รืà¹\88อà¸\87à¸\96อà¸\99à¹\80à¸\87ิà¸\99อัà¸\95à¹\82à¸\99มัà¸\95ิ
           bank: ธนาคาร
           bar: ร้านสุรา
-          bbq: à¸£à¹\89าà¸\99อาหารย่าง
+          bbq: à¹\80à¸\95าà¸\9bิà¹\89à¸\87ย่าง
           bench: ม้านั่ง
           bicycle_parking: ที่จอดจักรยาน
           bicycle_rental: บริการเช่าจักรยาน
-          biergarten: à¸ªà¸§นเบียร์
+          biergarten: à¸¥à¸²นเบียร์
           boat_rental: บริการเช่าเรือ
           brothel: สถานบริการทางเพศ
           bureau_de_change: ร้านรับแลกเงินตรา
@@ -412,8 +417,8 @@ th:
           cafe: ร้านกาแฟ
           car_rental: บริการเช่ารถยนต์
           car_sharing: บริการร่วมเดินทาง
-          car_wash: à¸\9aริà¸\81ารรัà¸\9aลà¹\89าà¸\87รà¸\96
-          casino: à¸\9aà¹\88อà¸\99à¹\84à¸\9eà¹\88
+          car_wash: บริการล้างรถ
+          casino: à¸\9aà¹\88อà¸\99à¸\81ารà¸\9eà¸\99ัà¸\99
           charging_station: สถานีประจุไฟฟ้า
           childcare: สถานรับเลี้ยงเด็ก
           cinema: โรงภาพยนตร์
@@ -425,37 +430,31 @@ th:
           crematorium: ฌาปนสถาน
           dentist: ทันตแพทย์
           doctors: แพทย์
-          dormitory: หอพักนักศึกษา
           drinking_water: น้ำดื่ม
-          driving_school: à¸ªà¸\96านสอนขับรถ
+          driving_school: à¹\82รà¸\87à¹\80รียนสอนขับรถ
           embassy: สถานทูต
-          emergency_phone: โทรศัพท์ฉุกเฉิน
           fast_food: อาหารจานด่วน
           ferry_terminal: สถานีเรือข้ามฟาก
-          fire_hydrant: จุดรับน้ำดับเพลิง
-          fire_station: สถานดับเพลิง
+          fire_station: สถานีดับเพลิง
           food_court: ศูนย์อาหาร
           fountain: น้ำพุ
           fuel: สถานีบริการเชื้อเพลิง
           gambling: การพนัน
           grave_yard: สุสาน
-          gym: สถานออกกำลังกาย
-          health_centre: ศูนย์สุขภาพ
           hospital: โรงพยาบาล
           hunting_stand: บังไพรล่าสัตว์
           ice_cream: ร้านไอศกรีม
           kindergarten: โรงเรียนอนุบาล
           library: ห้องสมุด
-          market: ตลาด
-          marketplace: ตลาดนัด
-          monastery: วัดหรือโบสถ์
+          marketplace: ตลาด
+          monastery: สำนักสงฆ์
           motorcycle_parking: ที่จอดรถจักรยานยนต์
-          nightclub: สถานบริการ
-          nursery: สถานรับเลี้ยงเด็ก
+          nightclub: สถานบันเทิง
           nursing_home: สถานสงเคราะห์หรือบ้านพักคนชรา
           office: สำนักงาน
           parking: ที่จอดรถ
           parking_entrance: ทางเข้าที่จอดรถ
+          parking_space: ซองจอดรถ
           pharmacy: ร้านขายยา
           place_of_worship: สถานที่ประกอบพิธีทางศาสนา
           police: สถานีตำรวจ
@@ -463,15 +462,14 @@ th:
           post_office: ที่ทำการไปรษณีย์
           preschool: โรงเรียนชั้นประถมวัย
           prison: ทัณฑสถาน
-          pub: à¸£à¹\89าà¸\99อาหาร
+          pub: à¸£à¹\89าà¸\99à¹\80หลà¹\89า
           public_building: อาคารสาธารณะ
-          reception_area: พื้นที่ต้อนรับ
           recycling: จุดรีไซเคิล
           restaurant: ร้านอาหาร
           retirement_home: บ้านพักวัยเกษียณ
           sauna: สถานที่อบตัว
           school: โรงเรียน
-          shelter: à¸ªà¸\96าà¸\99à¸\97ีà¹\88à¸\9eัà¸\81à¸\9eิà¸\87
+          shelter: à¸¨à¸²à¸¥à¸²à¸\97ีà¹\88à¸\9eัà¸\81
           shop: ร้านค้า
           shower: สถานที่อาบน้ำ
           social_centre: ศูนย์พบปะสมาคม
@@ -490,6 +488,7 @@ th:
           village_hall: ศาลากลางหมู่บ้าน
           waste_basket: ถังขยะ
           waste_disposal: ที่ทิ้งขยะ
+          water_point: จุดเติมน้ำดื่ม
           youth_centre: ศูนย์เยาวชน
         boundary:
           administrative: ขอบเขตการปกครอง
@@ -498,6 +497,7 @@ th:
           protected_area: พื้นที่ปกป้อง
         bridge:
           aqueduct: สะพานส่งน้ำ
+          boardwalk: ทางเดินไม้กระดาน
           suspension: สะพานแขวน
           swing: สะพานหันข้าง
           viaduct: สะพานบก
@@ -510,27 +510,31 @@ th:
           electrician: ช่างไฟฟ้า
           gardener: คนสวน
           painter: ช่างทาสี
-          photographer: à¸\99ัà¸\81à¸\96à¹\88ายภาพ
-          plumber: à¸\8aà¹\88าà¸\87à¸\97à¹\88อà¸\9bระà¸\9bา
+          photographer: à¸\8aà¹\88าà¸\87ภาพ
+          plumber: ช่างประปา
           shoemaker: ช่างทำรองเท้า
           tailor: ช่างตัดเสื้อผ้า
           "yes": ร้านงานฝีมือ
         emergency:
           ambulance_station: สถานีรถพยาบาล
+          assembly_point: จุดรวมพล
           defibrillator: เครื่องช่วยกระตุ้นหัวใจ
           landing_site: พื้นที่ลงจอดฉุกเฉิน
           phone: โทรศัพท์ฉุกเฉิน
+          "yes": อุปกรณ์ฉุกเฉิน
         highway:
           abandoned: ทางหลวงที่เลิกใช้แล้ว
           bridleway: ทางเกวียน
           bus_guideway: ทางรถสาธารณะชนิดบังคับล้อได้
           bus_stop: ที่หยุดรถสาธารณะ
           construction: ทางหลวงกำลังสร้าง
+          corridor: ระเบียงทางเดิน
           cycleway: ทางจักรยาน
           elevator: ลิฟต์
           emergency_access_point: จุดเข้าถึงฉุกเฉิน
           footway: ทางเดินเท้า
           ford: ถนนตัดทางน้ำ
+          give_way: ป้ายให้ทาง
           living_street: ถนนใช้ร่วมรถและคน
           milestone: หลักไมล์
           motorway: ทางหลวงพิเศษ
@@ -551,17 +555,17 @@ th:
           service: ถนนสำหรับซ่อมบำรุง
           services: บริการทางหลวงพิเศษ
           speed_camera: กล้องจับความเร็ว
-          steps: ขั้น
-          street_lamp: ไฟส่องทาง
+          steps: ขั้นบันใด
+          stop: ป้ายหยุด
+          street_lamp: ไฟถนน
           tertiary: ถนนสายย่อย
           tertiary_link: ถนนสายย่อย
           track: ราง
           traffic_signals: สัญญาณจราจร
-          trail: ทางเดิน
+          trail: ทางเดินป่า
           trunk: ถนนสายประธาน
           trunk_link: ถนนสายประธาน
           unclassified: ถนนที่มิได้จำแนก
-          unsurfaced: ถนนที่ยังไม่ปูลาด
           "yes": ถนน
         historic:
           archaeological_site: สถานที่ทางโบราณคดี
@@ -580,6 +584,7 @@ th:
           manor: บ้านสวน
           memorial: อนุสรณ์
           mine: เหมือง
+          mine_shaft: ปล่องเหมืองเก่า
           monument: อนุสาวรีย์
           roman_road: ถนนโรมัน
           ruins: ซากโบราณสถาน
@@ -589,6 +594,7 @@ th:
           wayside_cross: กางเขนข้างทาง
           wayside_shrine: ศาลเจ้าข้างทาง
           wreck: ซากปรักหักพัง
+          "yes": สถานที่ประวัติศาสตร์
         junction:
           "yes": ทางแยก
         landuse:
@@ -597,8 +603,8 @@ th:
           brownfield: พื้นที่อุตสาหกรรมเดิม
           cemetery: สุสาน
           commercial: พื้นที่พาณิชยกรรม
-          conservation: à¸\81ารอนุรักษ์
-          construction: à¸\81ารก่อสร้าง
+          conservation: à¸\9eืà¹\89à¸\99à¸\97ีà¹\88อนุรักษ์
+          construction: à¸\9eืà¹\89à¸\99à¸\97ีà¹\88ก่อสร้าง
           farm: ไร่นา
           farmland: ไร่นา
           farmyard: ลานไร่นา
@@ -612,9 +618,9 @@ th:
           military: เขตทหาร
           mine: เหมือง
           orchard: สวนผลไม้
-          quarry: à¸\9aà¹\88อà¸\82ุà¸\94หิà¸\99
+          quarry: à¹\80หมือà¸\87à¹\80à¸\9bิà¸\94
           railway: ทางรถไฟ
-          recreation_ground: à¸ªà¸\99ามสำหรัà¸\9aà¹\80ลà¹\88à¸\99
+          recreation_ground: à¸\9eืà¹\89à¸\99à¸\97ีà¹\88สัà¸\99à¸\97à¸\99าà¸\81าร
           reservoir: อ่างเก็บน้ำ
           reservoir_watershed: สันปันน้ำ
           residential: เขตที่พักอาศัย
@@ -626,9 +632,9 @@ th:
         leisure:
           beach_resort: สถานตากอากาศชายหาด
           bird_hide: บังไพรดูนก
-          club: สโมสร
           common: พื้นที่สาธารณประโยชน์
           dog_park: สวนสุนัข
+          firepit: จุดก่อกองไฟ
           fishing: พื้นที่ตกปลา
           fitness_centre: ศูนย์ออกกำลังกาย
           fitness_station: ศูนย์ออกกำลังกาย
@@ -639,7 +645,7 @@ th:
           marina: ที่จอดเรือ
           miniature_golf: สนามกอล์ฟเล็ก
           nature_reserve: พื้นที่สงวนธรรมชาติ
-          park: สวน
+          park: สวนสาธารณะ
           pitch: ลานกีฬา
           playground: สนามเด็กเล่น
           recreation_ground: สนามสำหรับเล่น
@@ -653,9 +659,31 @@ th:
           water_park: สวนน้ำ
           "yes": สถานที่เพื่อนันทนาการ
         man_made:
+          beacon: เสาไฟสัญญาณ
+          beehive: คอนเลี้ยงผึ้ง
+          bridge: สะพาน
+          chimney: ปล่องไฟ
+          crane: ปั้นจั่น
+          dolphin: หลักผูกเรือ
+          flagpole: เสาธง
+          gasometer: ถุงเก็บแก๊ส
+          kiln: เตาเผา
           lighthouse: ประภาคาร/กระโจมไฟ
+          mast: เสา
+          mine: เหมือง
+          mineshaft: ปล่องเหมือง
+          monitoring_station: สถานีตรวจอากาศ
+          petroleum_well: บ่อน้ำมัน
           pipeline: ท่อส่งน้ำมัน
+          storage_tank: ถังกักเก็บ
+          surveillance: กล้องวงจรปิด
           tower: หอคอย
+          wastewater_plant: โรงบำบัดน้ำเสีย
+          watermill: กังหันน้ำ
+          water_tower: หอเก็บน้ำ
+          water_well: บ่อน้ำ
+          water_works: โรงประปา
+          windmill: กังหันลม
           works: โรงงาน
           "yes": ที่มนุษย์สร้างขึ้น
         military:
@@ -694,7 +722,7 @@ th:
           sand: ทราย
           scree: ลาดหินร่วง
           scrub: ป่าไม้พุ่ม
-          spring: น้ำพุ
+          spring: น้ำพุธรรมชาติ
           stone: หลักหิน
           strait: ช่องแคบ
           tree: ต้นไม้
@@ -707,7 +735,9 @@ th:
           accountant: นักบัญชี
           administrative: การปกครอง
           architect: สถาปนิก
+          association: สมาคม
           company: บริษัท
+          educational_institution: สถาบันการศึกษา
           employment_agency: บริษัทจัดหางาน
           estate_agent: บริษัทอสังหาริมทรัพย์
           government: สำนักงานของรัฐบาล
@@ -719,8 +749,6 @@ th:
           "yes": สำนักงาน
         place:
           allotments: ที่ดินแบ่งใช้
-          block: ช่วงตึก
-          airport: สนามบิน
           city: เมือง
           country: ประเทศ
           county: จังหวัด
@@ -732,12 +760,12 @@ th:
           islet: เกาะขนาดเล็ก
           isolated_dwelling: ที่อยู่อาศัยโดด
           locality: ชุมชน
-          moor: ทุ่งหญ้าที่สูง
           municipality: เทศบาล
           neighbourhood: ชุมชน
           postcode: รหัสไปรษณีย์
           region: ภูมิภาค
           sea: ทะเล
+          square: จตุรัส
           state: รัฐ
           subdivision: เขตการปกครองย่อย
           suburb: ชานเมือง
@@ -749,10 +777,8 @@ th:
           abandoned: ทางรถไฟที่เลิกใช้แล้ว
           construction: ทางรถไฟกำลังสร้าง
           disused: ทางรถไฟเลิกใช้แล้ว
-          disused_station: สถานีรถไฟยุบแล้ว
           funicular: รถไฟขึ้นลงเนิน
           halt: ที่หยุดรถไฟ
-          historic_station: สถานีรถไฟในอดีต
           junction: ชุมทางรถไฟ
           level_crossing: ทางผ่านเสมอระดับ
           light_rail: รถไฟเบา
@@ -797,8 +823,8 @@ th:
           department_store: ห้างสรรพสินค้า
           discount: ร้านสินค้าลดราคา
           doityourself: ทำด้วยตัวท่านเอง
-          dry_cleaning: à¸\9aริà¸\81ารซักแห้ง
-          electronics: à¸£à¹\89าà¸\99อิà¹\80ลà¹\87à¸\81à¸\97รอà¸\99ิà¸\81สà¹\8c
+          dry_cleaning: à¸£à¹\89าà¸\99ซักแห้ง
+          electronics: à¸£à¹\89าà¸\99à¹\80à¸\84รืà¹\88อà¸\87à¹\84à¸\9fà¸\9fà¹\89า
           estate_agent: บริษัทอสังหาริมทรัพย์
           farm: ร้านในไร่นา
           fashion: ร้านแฟชั่น
@@ -807,7 +833,7 @@ th:
           food: ร้านขายอาหาร
           funeral_directors: บริการจัดการศพ
           furniture: เครื่องเรือน
-          gallery: à¸ªà¸\96าà¸\99à¸\97ีà¹\88à¹\81สà¸\94à¸\87งานศิลปะ
+          gallery: à¸£à¹\89าà¸\99à¸\82ายงานศิลปะ
           garden_centre: ศูนย์การจัดสวน
           general: ร้านค้าทั่วไป
           gift: ร้านของขวัญ
@@ -816,12 +842,15 @@ th:
           hairdresser: ร้านทำผม
           hardware: ร้านวัสดุก่อสร้าง
           hifi: เครื่องเสียง
-          insurance: ประกันภัย
+          houseware: ร้านขายเครื่องใช้ในบ้าน
           jewelry: ร้านเครื่องประดับ
           kiosk: ร้านแผงลอย
+          kitchen: ร้านเครื่องครัว
           laundry: ร้านซักรีด
+          lottery: ร้านขายสลาก
           mall: ห้างสรรพสินค้าขนาดใหญ่
           market: ตลาด
+          massage: ร้านนวด
           mobile_phone: ร้านโทรศัพท์มือถือ
           motorcycle: ร้านรถจักรยานยนต์
           music: ร้านดนตรี
@@ -829,19 +858,25 @@ th:
           optician: จักษุแพทย์
           organic: ร้านขายอาหารอินทรีย์
           outdoor: ร้านขายอุปกรณ์ผจญภัย
+          paint: ร้านขายสี
+          pawnbroker: โรงรับจำนำ
           pet: ร้านขายสัตว์เลี้ยงและอุปกรณ์
           pharmacy: ร้านขายยา
           photo: ร้านถ่ายภาพ
-          salon: ร้านทำผมสตรี
+          seafood: ร้านขายอาหารทะเล
           second_hand: ร้านขายของมือสอง
           shoes: ร้านขายรองเท้า
-          shopping_centre: ห้างสรรพสินค้า
           sports: ร้านขายอุปกรณ์กีฬา
           stationery: ร้านขายเครื่องเขียน
           supermarket: ห้างสรรพสินค้า
           tailor: ช่างตัดเสื้อผ้า
+          ticket: ร้านขายตั๋ว
+          tobacco: ร้านขายยาสูบ
           toys: ร้านขายของเล่น
           travel_agency: ตัวแทนการเดินทาง
+          tyres: ร้านขายยางรถ
+          vacant: ร้านทิ้งร้าง
+          variety_store: ร้านขายของจุกจิก
           video: ร้านขายภาพยนตร์
           wine: ร้านขายสุรา
           "yes": ร้านค้า
@@ -855,7 +890,7 @@ th:
           camp_site: ลานตั้งค่าย
           caravan_site: ลานจอดรถบ้าน
           chalet: กระท่อมพักผ่อน/ชาเลต์
-          gallery: à¸ªà¸\96าà¸\99à¸\97ีà¹\88à¹\81สà¸\94à¸\87à¸\87าà¸\99ศิลà¸\9bะ
+          gallery: à¸«à¸­à¸¨à¸´à¸¥à¸\9bà¹\8c
           guest_house: เรือนพัก
           hostel: โรงแรมนอนรวม
           hotel: โรงแรม
@@ -867,6 +902,7 @@ th:
           viewpoint: จุดชมวิว
           zoo: สวนสัตว์
         tunnel:
+          building_passage: ทางลอดตึก
           culvert: ท่อระบายน้ำ
           "yes": อุโมงค์
         waterway:
@@ -898,7 +934,7 @@ th:
         level10: แนวเขตชานเมือง
     description:
       title:
-        osm_nominatim: ตำบลที่ตั้งจาก <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: ตำบลที่ตั้งจาก <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
         geonames: ตำบลที่ตั้งจาก <a href="http://www.geonames.org/">GeoNames</a>
       types:
@@ -970,16 +1006,16 @@ th:
       title_html: ลิขสิทธิ์และสัญญาอนุญาต
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> เป็น<i>ข้อมูลเปิดให้ใช้งาน</i> และอนุญาตให้ใช้งานภายใต้สัญญาอนุญาต <a
-        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
         Commons Open Database License</a> (ODbL) โดย<a
-        href="http://osmfoundation.org/">มูลนิธิ OpenStreetMap</a> (OSMF).
+        href="https://osmfoundation.org/">มูลนิธิ OpenStreetMap</a> (OSMF).
       intro_2_html: "ท่านสามารถทำสำเนา แจกจ่าย แพร่ภาพ และปรับใช้ข้อมูลของเรา\nตราบเท่าที่ได้ระบุชื่อ
         OpenStreetMap ตลอดจนผู้ร่วมจัดทำไว้ในคำขอบคุณหรือที่มา\nถ้าท่านปรับแก้ไขหรือสร้างสรรค์งานใหม่โดยใช้ข้อมูลของเราเป็นพื้น
         ท่านสามารถ\nแจกจ่ายผลลัพธ์ที่ได้ภายใต้สัญญาอนุญาตเดียวกันเท่านั้น โปรดดู <a
-        href=\"http://opendatacommons.org/licenses/odbl/1.0/\">ข้อกำหนดทางกฎหมาย</a>
+        href=\"https://opendatacommons.org/licenses/odbl/1.0/\">ข้อกำหนดทางกฎหมาย</a>
         \nซึ่งจะอธิบายสิทธิและหน้าที่ที่ท่านพึงมี"
       intro_3_html: |-
-        ภาพร่าง ลายเส้นแผนที่ตามที่ปรากฏ และเอกสารกำกับ อนุญาตให้ใช้งานตามสัญญาอนุญาต <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        ภาพร่าง ลายเส้นแผนที่ตามที่ปรากฏ และเอกสารกำกับ อนุญาตให้ใช้งานตามสัญญาอนุญาต <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
         Commons Attribution-ShareAlike 2.0</a> (CC BY-SA)
       credit_title_html: วิธีการแสดงที่มาหรือคำขอบคุณ OpenStreetMap
       credit_1_html: |-
@@ -989,7 +1025,7 @@ th:
         ท่านจะต้องระบุให้ชัดเจนเจาะจงว่าข้อมูลอนุญาตให้ใช้ตามสัญญาอนุญาต Open
         Database License และถ้ามีการนำรูปแผนที่ไปใช้ รูปนั้นอนุญาตให้ใช้ตามสัญญาอนุญาต
          CC BY-SA ในการนี้อาจจะลิงก์ไปยังหน้า
-        <a href="http://www.openstreetmap.org/copyright">ข้อมูลลิขสิทธิ์</a>
+        <a href="https://www.openstreetmap.org/copyright">ข้อมูลลิขสิทธิ์</a>
         นอกจากนี้ (จำเป็นหากท่านจ่ายแจกข้อมูล OSM) ท่านสามารถลิงก์ไปยังสัญญาอนุญาตโดยตรง
         ในสื่ออย่างอื่น อาทิ สิ่งพิมพ์ ซึ่งไม่สามารถลิงก์ข้อมูลได้แนะนำให้ระบุเพียง openstreetmap.org
         และ/หรือ opendatacommons.org และ/หรือ creativecommons.org
@@ -997,10 +1033,10 @@ th:
       contributors_title_html: ผู้ร่วมสร้างสรรค์ของเรา
       contributors_at_html: |-
         <strong>ออสเตรีย</strong>: มีข้อมูลจาก
-        <a href="http://data.wien.gv.at/">Stadt Wien</a> (under
-        <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
-        <a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> และ
-        Land Tirol (under <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT with amendments</a>).
+        <a href="https://data.wien.gv.at/">Stadt Wien</a> (under
+        <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> และ
+        Land Tirol (under <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT with amendments</a>).
       contributors_ca_html: |-
         <strong>แคนาดา</strong>: มีข้อมูลจาก
         GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -1011,7 +1047,7 @@ th:
         <strong>ฟินแลนด์</strong>: มีข้อมูลจาก
         ฐานข้อมูลการสำรวจภูมิศาสตร์แห่งชาติฟินแลนด์และฐานข้อมูลอื่น
         อนุญาตให้ใช้ตาม
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">สัญญาอนุญาต NLSFI</a>.
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">สัญญาอนุญาต NLSFI</a>.
       contributors_fr_html: |-
         <strong>ฝรั่งเศส</strong>: มีข้อมูลจากอธิบดีกรมภาษี (
         Direction Générale des Impôts)
@@ -1020,23 +1056,50 @@ th:
         Survey data &copy; ลิขสิทธิ์ราชการและสิทธิ์แห่งฐานข้อมูล
         2010-12
       infringement_title_html: การละเมิดลิขสิทธิ์
+      infringement_2_html: |-
+        หากท่านเชื่อว่าข้อมูลละเมิดลิขสิทธิ์ปรากฏในเว็บไซต์นี้หรือในฐานข้อมูล OpenStreetMap โปรดดู <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">ขั้นตอนการลบข้อมูลละเมิดลิขสิทธิ์</a> หรือแจ้งได้ที่
+        <a href="http://dmca.openstreetmap.org/">หน้ารับแจ้งการละเมิดข้อมูลลิขสิทธิ์</a>
+      trademarks_title_html: <span id="trademarks"></span>เครืองหมายการค้า
   welcome_page:
     title: ยินดีต้อนรับ!
+    introduction_html: 'ยินดิต้อนรับสู่ OpenStreetMap, แผนที่โลกแบบเสรีที่ทุกคนสามารถแก้ไขได้
+      ซึ่งตอนนี้คุณได้ลงทะเบียนมาแล้ว ก่อนจะไปลุยกัน ด้านล่างมีสิ่งสำคัญที่คุณควรจะรู้ไว้ตลอดการทำแผนที่ของคุณ:'
+    whats_on_the_map:
+      title: บนแผนที่ควรมีอะไร
+      on_html: OpenStreetMap เป็นที่ที่คุณบันทึกสิ่งที่<em>มีอยู่จริงบนพื้นโลก</em>
+        และ<em>มีอยู่ในปัจจุบัน</em> - เช่นตึก หรือถนนที่คุณแห็นอยู่ดาษดื่นทั่วไป
+        รวมทั้งรายละเอียดเกี่ยวกับร้านรวงต่างๆ หรือข้อมูลอื่นๆ ที่เห็นได้ของสถานที่เหล่านั้น,
+        โดยคุณจะทำแผนที่โครงสร้างอะไรที่คุณเห็นอยู่บนพื้นดินก็ได้ แล้วแต่ความสนใจของคุณเอง
+      off_html: แต่ที่นี่จะ<em>ไม่รับ</em>ข้อมูลที่มาจากข้อคิดเห็น เช่นคะแนนเรตติ้ง
+        สถานที่ที่เคยมีอยู่แต่ในอดีต (ปัจจุบันไม่มีแล้ว) รวมทั้งสถานที่ที่คาดว่าจะมีในอนาคต,
+        และจะไม่รับข้อมูลจากแหล่งที่มีลิขสิทธิ์อื่นๆ, ฉะนั้นอย่าได้คัดลอกข้อมูลจากแผนที่ออนไลน์หรือแผนที่กระดาษมาใส่
+        (เว้นแต่คุณได้รับอนุญาตจากเจ้าของลิขสิทธิ์แล้ว)
     basic_terms:
-      title: เงื่อนไขพื้นฐานสำหรับการทำแผนที่
+      title: คำศัพท์พื้นฐานในการทำแผนที่
+      paragraph_1_html: 'เมื่อคุณเข้ามาทำแผนที่ใน OpenStreetMap, คุณจะพบกับศัพท์เฉพาะหลายคำ
+        ซึ่งความหมายจะอธิบายไว้เบื้องต้นที่ด้านล่างนี้:'
+      editor_html: <strong>ตัวแก้ไข</strong> หมายถึงโปรแกรม หรือเว็บไซต์ ที่คุณใช้แก้ไขข้อมูลแผนที่
+      node_html: <strong>หมุด</strong> จะเป็นจุดหนึ่งจุดบนแผนที่, เช่น ร้านอาหารที่ตั้งเดี่ยวๆ
+        หรือต้นไม้
+      way_html: <strong>เส้นทาง</strong> เป็นส่วนที่ลักษณะเป็นเส้นบนแผนที่ เช่นถนน
+        ลำธาร, หรือไม่ก็เป็นรูปปิด เช่นทะเลสาบ หรือตึก
+      tag_html: <strong>ป้ายกำกับ</strong> เป็นข้อมูลรายละเอียดของหมุด หรือเส้นทาง,
+        เช่น ชื่อ (ของร้าน) หรือ ขีดจำกัดความเร็ว (ของถนน)
+    rules:
+      title: อย่าลืมกติกา!
     questions:
       title: มีคำถามอีกหรือไม่?
-      paragraph_1_html: "OpenStreetMap มีสื่อสำหรับค้นคว้า สอบถาม ตอบคำถาม \nสนทนา
-        à¸\95ลอà¸\94à¸\88à¸\99à¸\88ัà¸\94à¸\97ำวิà¸\98ีà¸\81ารสรà¹\89าà¸\87à¹\81à¸\9cà¸\99à¸\97ีà¹\88\n<a href='%{help_url}'>à¸\82อรัà¸\9aà¸\84วามà¸\8aà¹\88วยà¹\80หลือที่นี่</a>"
+      paragraph_1_html: "OpenStreetMap มีสื่อสำหรับค้นคว้า สอบถาม ตอบคำถาม \nสนทนาหัวข้อต่างๆ
+        à¸\95ลอà¸\94à¸\88à¸\99อภิà¸\9bรายà¹\81ละà¸\88ัà¸\94à¸\97ำวิà¸\98ีà¸\81ารสรà¹\89าà¸\87à¹\81à¸\9cà¸\99à¸\97ีà¹\88\nà¸\8bึà¹\88à¸\87à¸\84ุà¸\93à¸\88ะ<a href='%{help_url}'>หาà¸\84วามà¸\8aà¹\88วยà¹\80หลือà¹\84à¸\94à¹\89ที่นี่</a>"
     start_mapping: เริ่มการทำแผนที่
     add_a_note:
-      title: à¹\84มà¹\88มีà¹\80วลาà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\8aà¹\88à¹\84หม? à¹\80à¸\9eิà¹\88มà¸\9aัà¸\99à¸\97ึà¸\81à¹\80à¸\94ีà¹\8bยวà¸\99ี้!
-      paragraph_1_html: à¸«à¸²à¸\81à¸\97à¹\88าà¸\99à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิà¹\88à¸\87à¸\95à¹\88าà¸\87 à¹\86 à¹\84มà¹\88มาà¸\81à¸\99ัà¸\81 à¹\81ละà¹\84มà¹\88มีà¹\80วลาà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89ระà¸\9aà¸\9aà¹\81ละà¹\80รียà¸\99รูà¹\89วิà¸\98ีà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81à¸\99ัà¸\81
-        à¸­à¸²à¸\88à¸\88ะà¹\80à¸\9eิà¹\88มà¸\9aัà¸\99à¸\97ึà¸\81à¹\81à¸\97à¸\99à¹\84à¸\94à¹\89
+      title: à¹\84มà¹\88มีà¹\80วลาà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\8aà¹\88à¹\84หม? à¹\83สà¹\88หมายà¹\80หà¸\95ุà¹\84วà¹\89à¹\81à¸\97à¸\99à¹\84à¸\94้!
+      paragraph_1_html: à¸«à¸²à¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\88ะà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81à¸\84à¹\88à¹\80ลà¹\87à¸\81à¸\99à¹\89อย à¹\81ละà¹\84มà¹\88มีà¹\80วลาà¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89ระà¸\9aà¸\9aà¹\81ละà¹\80รียà¸\99รูà¹\89วิà¸\98ีà¹\81à¸\81à¹\89à¹\84à¸\82à¸\94à¹\89วยà¸\95ัวà¹\80อà¸\87
+        à¸\84ุà¸\93สามารà¸\96à¸\88ะà¹\80à¸\82ียà¸\99หมายà¹\80หà¸\95ุà¹\81à¸\9bะà¹\80อาà¹\84วà¹\89à¸\9aà¸\99à¸\88ุà¸\94à¸\97ีà¹\88à¸\84ุà¸\93อยาà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82à¹\81à¸\97à¸\99
       paragraph_2_html: |-
-        à¹\81à¸\84à¹\88à¹\84à¸\9bà¸\97ีà¹\88<a href='%{map_url}'>à¹\81à¸\9cà¸\99à¸\97ีà¹\88</a> à¹\81ลà¹\89วà¸\84ลิà¸\81à¹\84อà¸\84อà¸\99 à¸\9aัà¸\99à¸\97ึà¸\81:
+        à¹\81à¸\84à¹\88à¹\84à¸\9bà¸\97ีà¹\88<a href='%{map_url}'>à¹\81à¸\9cà¸\99à¸\97ีà¹\88</a> à¹\81ลà¹\89วà¸\84ลิà¸\81à¹\84อà¸\84อà¸\99 à¸«à¸¡à¸²à¸¢à¹\80หà¸\95ุ:
         <span class='icon note'></span>. จากนั้นจะมีเครื่องหมายมาที่แผนที่ให้ท่านลากไปยัง
-        à¸\95ำà¹\81หà¸\99à¹\88à¸\87à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร à¹\83สà¹\88à¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร à¸\84ลิà¸\81à¸\9aัà¸\99à¸\97ึà¸\81 à¸\88าà¸\81à¸\99ัà¹\89à¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97à¹\88าà¸\99อืà¹\88à¸\99à¸\88ะà¹\80à¸\82à¹\89ามาà¸\95รวà¸\88สอà¸\9a
+        à¸\95ำà¹\81หà¸\99à¹\88à¸\87à¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร à¹\83สà¹\88à¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\95à¹\89อà¸\87à¸\81าร à¸\84ลิà¸\81à¸\9aัà¸\99à¸\97ึà¸\81 à¹\81ลà¹\89วà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97à¹\88าà¸\99อืà¹\88à¸\99à¸\88ะà¹\80à¸\82à¹\89ามาà¸\95รวà¸\88สอà¸\9aà¹\83หà¹\89
   fixthemap:
     title: รายงานปัญหา/แก้ไขข้อผิดพลาดในแผนที่
     how_to_help:
@@ -1046,15 +1109,42 @@ th:
         explanation_html: หากท่านประสบปัญหาเกี่ยวกับข้อมูลแผนที่ของเรา หรือพบข้อผิดพลาด
           เช่น ถนนหายไป หรือมีข้อผิดพลาดด้านที่อยู่ วิธีที่ดีที่สุดคือสมัครเป็นสมาชิก
           OpenStreetMap เพื่อดำเนินการแก้ไขด้วยตัวท่านเอง
+    other_concerns:
+      title: ข้อกังวลอื่น ๆ
+      explanation_html: หากท่านมีข้อกังวลเกี่ยวกับการใช้ข้อมูลของเราหรือเกี่ยวกับเนื้อหา
+        โปรดดู<a href='/copyright'>หน้าลิขสิทธิ์</a> เพื่อดูรายละเอียดทางกฎหมาย หรือติดต่อคณะทำงาน
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF </a>
   help_page:
+    title: ขอรับความช่วยเหลือ
+    welcome:
+      title: ยินดีต้อนรับสู่ OSM
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Th:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Th:Beginners%27_guide
+      title: คำแนะนำสำหรับผู้เริ่มต้น
     mailing_lists:
       title: รายการอีเมลรับข่าวสาร
     forums:
       title: กระดานสนทนา
+    irc:
+      title: ไออาร์ซี
   about_page:
     next: ถัดไป
+    used_by: '%{name} - ข้อมูลแผนที่ซึ่งขับเคลื่อนเว็บไซต์ แอปพลิเคชั่นมือถือ และอุปกรณ์นำทางมากมายรอบตัวคุณ'
+    lede_text: OpenStreetMap เป็นโครงการซึ่งสร้างสรรค์ขึ้นจากชุมชนของผู้ใช้และผู้สนใจ
+      ที่ได้ทำการสำรวจ ปรับปรุง แบ่งปันข้อมูลแผนที่ถนน ทางหลวง ทางเดินป่า, รวมถึงสถานที่ที่น่าสนใจอย่าง
+      ร้านกาแฟ สถานีรถไฟ และอื่นๆ อีกมากมาย จากทั่วทุกมุมโลก
+    local_knowledge_title: ความรู้จากท้องถิ่น
+    local_knowledge_html: OpenStreetMap มุ่งเน้นส่งเสริมการใช้และเผยแพร่ความรู้จากคนท้องถิ่น
+      โดยนักทำแผนที่ในท้องถิ่นสามารถใช้ทั้งภาพถ่ายดาวเทียม อุปกรณ์ระบุตำแหน่งจีพีเอส
+      หรือแม้แต่ผังกระดาษ เพื่อเดินสำรวจ เพิ่มเติม และปรับปรุงข้อมูลแผนที่ OpenStreetMap
+      ให้ละเอียด ถูกต้อง ทันสมัยอยู่เสมอได้ด้วยตนเอง ทุกที่ ทุกเวลา
+    community_driven_title: ผลักดันโดยชุมชน
+    community_driven_html: ชุมชนผู้ใช้ OpenStreetMap เติบโตขึ้นมาจากกลุ่มคนที่หลากหลาย
+      ร่วมสร้างสรรค์จากทั้งนักทำแผนที่สมัครเล่น, ผู้เชี่ยวชาญระบบภูมิสารสนเทศ, วิศวกรดูแลเซิร์ฟเวอร์,
+      อาสาสมัครบรรเทาสาธารณภัย และสาขาอาชีพอื่นๆ อีกมากมาย, เรียนรู้เพิ่มเติมเกี่ยวกับชุมชนของเราได้จาก<a
+      href='https://blog.openstreetmap.org'>บล็อกทางการของ OpenStreetMap</a>, รวม<a
+      href='%{diary_path}'>บันทึก</a>และ<a href='https://blogs.openstreetmap.org/'>บล็อกของผู้ใช้</a>ทั่วสารทิศ,
+      และที่เว็บไซต์ของ<a href='https://www.osmfoundation.org/'>มูลนิธิ OpenStreetMap</a>
     open_data_title: ข้อมูลเปิดเผย
     open_data_html: |-
       OpenStreetMap อนุญาตให้ใช้ตามหลักเกณฑ์<i>ข้อมูลเปิดเผย</i> โดยจะนำไปใช้ในวัตถุประสงค์อื่นใดก็ได้
@@ -1063,10 +1153,10 @@ th:
        <a href='%{copyright_path}'>หน้าลิขสิทธิ์และสัญญาอนุญาต</a> ถ้าต้องการรายละเอียดเพิ่ม
     legal_title: ข้อกำหนดทางกฎหมาย
     legal_html: "เว็บไซต์และบริการที่เกี่ยวข้องนี้ดำเนินการและบำรุงรักษาอย่างเป็นทางการโดย\n<a
-      href='http://osmfoundation.org/'>มูลนิธิ OpenStreetMap</a> (OSMF) \nในนามสมาชิกทุกคน
-      การใช้บริการที่ดำเนินการโดย OSMF จะต้องอยู่ใต้เงื่อนไข<a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nการใช้งานที่ยอมรับได้</a>
-      และ<a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">นโยบายความเป็นส่วนบุคคล</a>\n<br>
-      \nโปรด<a href='http://osmfoundation.org/Contact'>ติดต่อ OSMF</a> \nถ้าท่านมีข้อสงสัยเกี่ยวกับสัญญาอนุญาต
+      href='https://osmfoundation.org/'>มูลนิธิ OpenStreetMap</a> (OSMF) \nในนามสมาชิกทุกคน
+      การใช้บริการที่ดำเนินการโดย OSMF จะต้องอยู่ใต้เงื่อนไข<a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nการใช้งานที่ยอมรับได้</a>
+      และ<a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">นโยบายความเป็นส่วนบุคคล</a>\n<br>
+      \nโปรด<a href='https://osmfoundation.org/Contact'>ติดต่อ OSMF</a> \nถ้าท่านมีข้อสงสัยเกี่ยวกับสัญญาอนุญาต
       ข้อมูลลิขสิทธิ์ คำถามกฎหมายและประเด็นที่เกี่ยวข้อง"
     partners_title: องค์กรพันธมิตร
   notifier:
@@ -1251,7 +1341,7 @@ th:
       js_1: ท่านกำลังใช้เบราว์เซอร์ที่ไม่รองรับจาวาสคริปต์ หรือท่านปิดใช้งานจาวาสคริปต์
       permalink: ลิงก์ถาวร
       shortlink: ลิงก์ย่อ
-      createnote: à¹\80à¸\9eิà¹\88มà¸\9aัà¸\99à¸\97ึà¸\81
+      createnote: à¹\80à¸\9eิà¹\88มหมายà¹\80หà¸\95ุ
     edit:
       not_public: ท่านยังไม่ได้ตั้งค่าการแก้ไขให้มองเห็นได้ทั่วไป
       not_public_description: ท่านไม่สามารถแก้ไขแผนที่นี้ได้เว้นแต่จะดำเนินการสิ่งอื่นบางอย่าง
@@ -1267,7 +1357,7 @@ th:
       get_directions_title: ค้นหาเส้นทางระหว่างจุดสองจุด
       from: จาก
       to: ถึง
-      where_am_i: à¸\82à¹\89าà¸\9eà¹\80à¸\88à¹\89าอยูà¹\88ที่ไหน?
+      where_am_i: à¸\95รà¸\87à¸\99ีà¹\89à¸\84ือที่ไหน?
       where_am_i_title: อธิบายตำแหน่งปัจจุบันโดยใช้เครื่องมือค้นหา
       submit_text: ไป
     key:
@@ -1344,7 +1434,7 @@ th:
       edit: แก้ไข
       preview: แสดงตัวอย่าง
     markdown_help:
-      title_html: à¸\95ัà¸\94อà¹\88าà¸\99à¹\82à¸\94ย <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: à¹\80à¸\82ียà¸\99à¸\94à¹\89วยรูà¸\9bà¹\81à¸\9aà¸\9a <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
       headings: หัวเรื่องหลัก
       heading: หัวเรื่องหลัก
       subheading: หัวเรื่องย่อย
@@ -1365,7 +1455,17 @@ th:
       identifiable: ระบุได้ (แสดงเป็นชื่อให้ติดตามได้ แต่ละจุดมีเวลากำกับ)
     create:
       upload_trace: อัปโหลดรอยทาง GPS
+      trace_uploaded: แฟ้มข้อมูล GPX ของท่านอัปโหลดเข้าระบบแล้ว กำลังรอบรรจุเข้าฐานข้อมูล
+        ซึ่งจะใช้เวลาประมาณครึ่งชั่วโมง เมื่อกระบวนการเรียบร้อยแล้วจะมีอีเมลแจ้งท่านให้ทราบ
     edit:
+      filename: 'ชื่อแฟ้ม:'
+      download: ดาวน์โหลด
+      uploaded_at: 'อัปโหลดเมื่อ:'
+      points: 'จุด:'
+      start_coord: 'เริ่มจากตำแหน่ง:'
+      map: แผนที่
+      edit: แก้ไข
+      tags: 'ป้ายกำกับ:'
       tags_help: คั่นด้วยจุลภาค
       save_button: บันทึกการเปลี่ยนแปลง
       visibility: 'สถานะการแสดง:'
@@ -1383,11 +1483,155 @@ th:
       upload_trace: อัปโหลดรอยทาง
       see_all_traces: แสดงรอยทางทั้งหมด
       see_your_traces: แสดงรอยทางของท่าน
+    trace_optionals:
+      tags: ป้ายกำกับ
+    view:
+      title: แสดงรอยทางชื่อ %{name}
+      heading: แสดงรอยทางชื่อ %{name}
+      pending: ค้างอยู่
+      filename: 'ชื่อแฟ้ม:'
+      download: ดาวน์โหลด
+      uploaded: 'อัปโหลดเมื่อ:'
+      points: 'จุด:'
+      start_coordinates: 'เริ่มจากตำแหน่ง:'
+      map: แผนที่
+      edit: แก้ไข
+      owner: 'เจ้าของ:'
+      description: 'คำอธิบาย:'
+      tags: 'ป้ายกำกับ:'
+      none: ไม่มี
+      edit_track: แก้ไขรอยทางนี้
+      delete_track: ลบรอยทางนี้
+      trace_not_found: ไม่พบรอยทางนี้!
+      visibility: 'สถานะการแสดง:'
+    trace_paging_nav:
+      showing_page: หน้า %{page}
+      older: รอยทางที่เก่ากว่า
+      newer: รอยทางที่ใหม่กว่า
+    trace:
+      pending: ค้างอยู่
+      count_points: '%{count} จุด'
+      ago: '%{time_in_words_ago} มาแล้ว'
+      more: เพิ่มเติม
+      trace_details: ดูรายละเอียดรอยทาง
+      view_map: แสดงแผนที่
+      edit: แก้ไข
+      edit_map: แก้ไขแผนที่
+      public: สาธารณะ
+      identifiable: ระบุได้
+      private: ส่วนตัว
+      trackable: ติดตามได้
+      by: โดย
+      in: ใน
+      map: แผนที่
     list:
       public_traces: รอยทาง GPS สาธารณะ
       your_traces: รอยทาง GPS ของท่าน
+      public_traces_from: รอยทางจีพีเอสสาธารณะโดยผู้ใช้ %{user}
+      description: ค้นหาการอัปโหลดรอยทางจีพีเอสล่าสุด
+      tagged_with: ระบุด้วยป้าย %{tags}
+    offline_warning:
+      message: ระบบอัปโหลดแฟ้มข้อมูล GPX ไม่พร้อมใช้งานในขณะนี้
+    offline:
+      message: หน่วยจัดเก็บแฟ้มข้อมูล GPX และระบบอัปโหลดไม่พร้อมใช้งานในขณะนี้
+    description:
+      description_with_count: แฟ้มข้อมูล GPX จำนวน %{count} จุด จากผู้ใช้ %{user}
+      description_without_count: แฟ้มข้อมูล GPX จากผู้ใช้ %{user}
+  oauth:
+    oauthorize:
+      title: อนุญาตการเข้าถึงบัญชีของคุณ
+      allow_to: 'อนุญาตให้โปรแกรมสามารถ:'
+      allow_read_prefs: อ่านการตั้งค่าผู้ใช้ของคุณ
+      allow_write_prefs: แก้ไขการตั้งค่าผู้ใช้ของคุณ
+      allow_write_api: แก้ไขแผนที่
+      allow_write_notes: แก้ไขหมายเหตุ
+      grant_access: อนุญาตการเข้าถึง
+    oauthorize_success:
+      title: การขอรับอนุญาตได้รับอนุมัติแล้ว
+      allowed: ท่านได้อนุญาตให้แอปพลิเคชัน %{app_name} เข้าถึงบัญชีของท่านแล้ว
+      verification: รหัสยืนยันคือ %{code}
+    oauthorize_failure:
+      title: การขอรับอนุญาตล้มเหลว
+      denied: ท่านได้อนุญาตให้แอปพลิเคชัน %{app_name} เข้าถึงบัญชีของท่านแล้ว
+      invalid: ข้อมูลการอนุญาตไม่ถูกต้อง
+    revoke:
+      flash: ท่านได้ยกเลิกข้อมูลสำหรับแอปพลิเคชัน %{application}
+    permissions:
+      missing: ท่านไม่ได้อนุญาตให้แอปพลิเคชันเข้าใช้งานส่วนนี้
+  oauth_clients:
+    new:
+      title: ลงทะเบียนแอปพลิเคชันใหม่
+      submit: ลงทะเบียน
+    edit:
+      title: แก้ไขการสมัครของท่าน
+      submit: แก้ไข
+    show:
+      title: รายละเอียด OAuth ของ %{app_name}
+      key: 'คีย์ผู้บริโภค:'
+      secret: 'ความลับผู้บริโภค:'
+      url: 'ขอตัวระบุยูอาร์แอล:'
+      access_url: 'เข้าถึงตัวระบุยูอาร์แอล:'
+      authorize_url: 'อนุญาตยูอาร์แอล:'
+      support_notice: เรารองรับลายเซ็นชนิด HMAC-SHA1 (แนะนำให้ใช้) และ RSA-SHA1
+      edit: แก้ไขรายละเอียด
+      delete: ลบไคลเอนต์
+      confirm: ท่านแน่ใจหรือไม่?
+      requests: 'ขอรับการอนุญาตต่อไปนี้จากผู้ใช้:'
+      allow_read_prefs: อ่านการตั้งค่าผู้ใช้
+      allow_write_prefs: แก้ไขการตั้งค่าผู้ใช้
+      allow_write_diary: สร้างรายการบันทึก ข้อคิดเห็น และพบเพื่อนใหม่
+      allow_write_api: แก้ไขแผนที่
+      allow_read_gpx: อ่านรอยทาง GPS ส่วนบุคคล
+      allow_write_gpx: อัปโหลดรอยทาง GPS
+      allow_write_notes: แก้ไขหมายเหตุ
+    index:
+      title: รายละเอียด OAuth ของฉัน
+      my_tokens: การสมัครของฉันที่ได้รับอนุญาตแล้ว
+      list_tokens: 'รายละเอียดต่อไปนี้ออกให้แก่แอปพลิเคชันในนามของท่าน:'
+      application: ชื่อแอปพลิเคชัน
+      issued_at: ออกให้ที่
+      revoke: เพิกถอน
+      my_apps: แอปพลิเคชันผู้ใช้ของฉัน
+      no_apps: ท่านมีแอปพลิเคชันที่ต้องการลงทะเบียนกับเรา โดยใช้มาตรฐาน %{oauth} หรือไม่?
+        ท่านจะต้องลงทะเบียนเว็บแอปพลิเคชันก่อนที่แอปพลิเคชันดังกล่าวจะสามารถขอรับการอนุญาต
+        requests มายังบริการของเราได้
+      registered_apps: 'ท่านมีแอปพลิเคชันฝั่งผู้ใช้ที่ลงทะเบียนไว้แล้วดังนี้:'
+      register_new: ลงทะเบียนแอปพลิเคชันของท่าน
+    form:
+      name: ชื่อ
+      required: จำเป็น
+      url: ที่อยู่เว็บแอปพลิเคชันหลัก
+      callback_url: ที่อยู่เว็บเรียกกลับ
+      support_url: ที่อยู่เว็บสำหรับสนับสนุน
+      requests: 'ขอรับการอนุญาตต่อไปนี้จากผู้ใช้:'
+      allow_read_prefs: อ่านการตั้งค่าผู้ใช้
+      allow_write_prefs: แก้ไขการตั้งค่าผู้ใช้
+      allow_write_diary: สร้างรายการบันทึก ข้อคิดเห็น และพบเพื่อนใหม่
+      allow_write_api: แก้ไขแผนที่
+      allow_read_gpx: อ่านรอยทาง GPS ส่วนบุคคล
+      allow_write_gpx: อัปโหลดรอยทาง GPS
+      allow_write_notes: แก้ไขหมายเหตุ
+    not_found:
+      sorry: ขออภัย ชนิด %{type} หาไม่พบ
+    create:
+      flash: ลงทะเบียนข้อมูลเรียบร้อยแล้ว
+    update:
+      flash: ปรับปรุงข้อมูลฝั่งผู้ใช้เรียบร้อยแล้ว
+    destroy:
+      flash: ถอนการลงทะเบียนแอปพลิเคชันฝั่งผู้ใช้แล้ว
   user:
     login:
+      title: ลงชื่อเข้าใช้
+      heading: ลงชื่อเข้าใช้
+      email or username: 'อีเมลหรือชื่อผู้ใช้:'
+      password: 'รหัสผ่าน:'
+      remember: จดจำฉันไว้ในระบบ
+      lost password link: ลืมรหัสผ่านหรือ?
+      login_button: ลงชื่อเข้าใช้
+      register now: ลงทะเบียนเดี๋ยวนี้
+      with username: มีบัญชี OpenStreetMap แล้วหรือยัง? ถ้ามีโปรดเข้าระบบด้วยชื่อผู้ใช้และรหัสผ่านที่ท่านมี
+      with external: นอกจากนี้ ท่านสามารถใช้บัญชีผู้ใช้จากเว็บอื่นในการเข้าใช้งานได้
+      new to osm: เพิ่งเริ่มใช้ OpenStreetMap หรือ?
       openid_logo_alt: เข้าใช้งานด้วย OpenID
       auth_providers:
         openid:
@@ -1402,14 +1646,38 @@ th:
         windowslive:
           title: เข้าใช้งานด้วย Windows Live
           alt: เข้าใช้งานด้วยบัญชี Windows Live
+        github:
+          title: เข้าใช้งานด้วย GitHub
+          alt: เข้าใช้งานด้วยบัญชี GitHub
+        wikipedia:
+          title: เข้าใช้งานด้วยวิกิพีเดีย
+        yahoo:
+          title: เข้าใช้งานด้วย Yahoo
+          alt: เข้าใช้งานด้วย Yahoo OpenID
+        wordpress:
+          title: เข้าใช้งานด้วย Wordpress
+        aol:
+          title: เข้าใช้งานด้วย AOL
+          alt: เข้าใช้งานด้วย AOL OpenID
     logout:
       title: ออกจากระบบ
+      heading: ออกจากระบบ OpenStreetMap
       logout_button: ออกจากระบบ
     lost_password:
       title: ตั้งรหัสผ่านใหม่
       heading: ลืมรหัสผ่านหรือ?
+      email address: 'ที่อยู่อีเมล:'
       new password button: ตั้งรหัสผ่านใหม่
+    reset_password:
+      title: ตั้งรหัสผ่านใหม่
+      heading: 'ตั้วรหัสผ่านใหม่สำหรับ: %{user}'
+      password: 'รหัสผ่าน:'
+      confirm password: 'ยืนยันรหัสผ่าน:'
+      flash changed: เปลี่ยนรหัสผ่านของคุณแล้วเรียบร้อย
     new:
+      title: สมัครสมาชิก
+      about:
+        header: เสรีและแก้ไขได้
       email address: 'ที่อยู่อีเมล:'
       confirm email address: 'ยืนยันที่อยู่อีเมล:'
       not displayed publicly: ที่อยู่ของท่านจะไม่แสดงให้บุคคลภายนอกเห็น โปรดดู <a
@@ -1443,12 +1711,65 @@ th:
     no_such_user:
       title: ไม่มีผู้ใช้ที่ระบุ
       heading: ไม่พบผู้ใช้ชื่อ %{user}
+      deleted: ลบแล้ว
     view:
+      my diary: บันทึกของฉัน
+      new diary entry: สร้างบันทึกใหม่
+      my edits: การแก้ไขของฉัน
+      my traces: รอยทางของฉัน
+      my notes: หมายเหตุของฉัน
+      my messages: ข้อความของฉัน
+      my profile: ประวัติของฉัน
+      my settings: การตั้งค่าของฉัน
+      my comments: ความคิดเห็นของฉัน
+      oauth settings: ตั้งค่าการอนุญาต OAuth
+      blocks on me: ผู้ใช้ที่กีดกันข้าพเจ้า
+      blocks by me: ผู้ใช้ที่ข้าพเจ้ากีดกัน
+      send message: ส่งข้อความ
+      diary: บันทึก
+      edits: การแก้ไข
+      traces: รอยทาง
+      notes: หมายเหตุแผนที่
+      remove as friend: ลบจากรายการเพื่อน
+      add as friend: เพิ่มเข้ารายการเพื่อน
+      mapper since: 'ทำแผนที่นี้ตั้งแต่:'
+      ago: (%{time_in_words_ago} มาแล้ว)
+      ct status: 'เงื่อนไขผู้ร่วมสร้างสรรค์:'
+      ct undecided: ยังไม่ตัดสินใจ
+      ct declined: ไม่ยอมรับ
+      ct accepted: ยอมรับแล้วเมื่อ %{ago} ก่อน
+      latest edit: 'แก้ไขล่าสุดเมื่อ %{ago}:'
+      email address: 'ที่อยู่อีเมล:'
+      created from: 'สร้างจาก:'
+      status: 'สถานะ:'
+      spam score: 'คะแนนสแปม:'
+      description: คำอธิบาย
+      user location: ตำแหน่งผู้ใช้
+      if set location: เพื่อค้นหาผู้ใช้ที่อยู่ข้างเคียง ให้ตั้งค่าตำแหน่งบ้านในหน้า%{settings_link}
+      settings_link_text: การตั้งค่า
+      your friends: เพื่อนของท่าน
+      no friends: ท่านยังไม่ได้เพิ่มเพื่อนใด ๆ
+      km away: ห่างออกไป %{count}km
+      m away: ห่างออกไป %{count}m
+      nearby users: ผู้ใช้ท่านอื่นที่ใกล้เคียง
+      no nearby users: ไม่ได้มีผู้ใดแสดงตัวว่าทำแผนที่อยู่ใกล้เคียง
+      comments: ความเห็นที่เขียน
       create_block: กีดกันผู้ใช้นี้
       activate_user: เปิดใช้งานผู้ใช้นี้
       deactivate_user: ปิดใช้งานผู้ใช้นี้
+    popup:
+      your location: ตำแหน่งของคุณ
     account:
       title: แก้ไขบัญชี
+      my settings: การตั้งค่าของฉัน
+      current email address: 'ที่อยู่อีเมลปัจจุบัน:'
+      new email address: 'ที่อยู่อีเมลใหม่:'
+      email never displayed publicly: (จะไม่แสดงต่อสาธารณะ)
+      external auth: 'เชื่อมโยงตัวตนจากบริการอื่น:'
+      openid:
+        link text: นี้คืออะไร?
+      public editing:
+        heading: 'แก้ไขโดยเปิดเผย:'
       contributor terms:
         link text: นี้คืออะไร?
       profile description: 'คำอธิบายหน้าประวัติส่วนตัว:'
@@ -1522,6 +1843,9 @@ th:
         one: หน้าที่ %{page} (%{first_item} จาก %{items})
         other: หน้าที่ %{page} (%{first_item}-%{last_item} จาก %{items})
       summary: '%{name} สร้างจากไอพี %{ip_address} เมื่อ %{date}'
+      confirm: ยืนยันผู้ใช้ที่เลือก
+      hide: ซ่อนผู้ใช้ที่เลือก
+      empty: ไม่พบผู้ใช้ตรงตามที่กำหนด
     suspended:
       title: บัญชีถูกระงับ
       heading: บัญชีถูกระงับ
@@ -1538,7 +1862,7 @@ th:
       connection_failed: การเชื่อมต่อกับผู้ให้บริการบัญชีภายนอกล้มเหลว
       invalid_credentials: ชื่อผู้ใช้และ/หรือรหัสผ่านไม่ถูกต้อง
       no_authorization_code: ไม่มีรหัสยืนยัน
-      unknown_signature_algorithm: à¸\82ัà¹\89à¸\99à¸\95อà¸\99วิà¸\98ีลายมือà¸\8aืà¹\88อà¹\84มà¹\88à¸\97ราà¸\9a
+      unknown_signature_algorithm: à¸¥à¸²à¸¢à¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\88ิà¸\95อลà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80à¸\9bà¹\87à¸\99ระà¸\9aà¸\9aà¸\97ีà¹\88à¹\84มà¹\88รูà¹\89à¸\88ัà¸\81
       invalid_scope: ขอบข่ายผิดพลาด
     auth_association:
       heading: บัญชีภายนอกของท่านยังมิได้ต่อเชื่อมกับบัญชี OpenStreetMap
@@ -1551,6 +1875,7 @@ th:
       not_a_role: ข้อความ `%{role}' ไม่ใช่สถานะผู้ใช้งานที่ถูกต้อง
       already_has_role: ผู้ใช้มีสถานะเป็น %{role} อยู่แล้ว
       doesnt_have_role: ผู้ใช้ไม่ได้มีสถานะ %{role}
+      not_revoke_admin_current_user: ไม่สามารถเพิกถอนสิทธิ์ดูแลระบบจากผู้ใช้คนปัจจุบัน
     grant:
       title: ยืนยันการแต่งตั้งสถานะ
       heading: ยืนยันการแต่งตั้งสถานะ
@@ -1564,12 +1889,84 @@ th:
       are_you_sure: ท่านแน่ใจว่าต้องการถอดถอนสถานะ `%{role}' จากผู้ใช้ `%{name}' หรือไม่?
       confirm: ยืนยัน
       fail: ไม่สามารถถอดถอนสถานะ `%{role}' แก่ผู้ใช้ `%{name}' โปรดตรวจสอบว่าทั้งผู้ใช้และสถานะเป็นที่ถูกต้องดีแล้ว
+  user_block:
+    model:
+      non_moderator_update: ต้องเป็นผู้ดูแลระบบจึงจะสามารถสร้างหรือปรับปรุงการกีดกันได้
+      non_moderator_revoke: ต้องเป็นผู้ดูแลระบบจึงจะสามารถเพิกถอนการกีดกันได้
+    not_found:
+      sorry: ขออภัย การกีดกันผู้ใช้รหัส %{id} ไม่พบ
+      back: กลับไปที่ดัชนี
+    new:
+      title: สร้างการกีดกันบน %{name}
+      heading: สร้างการกีดกันบน %{name}
+      reason: เหตุผลที่ผู้ใช้ %{name} ถูกกีดกัน โปรดอย่าใช้อารมณ์รุนแรงในระหว่างระบุ
+        และขอให้ระบุรายละเอียดเกี่ยวกับสถานการณ์ที่พบให้ละเอียดชัดเจน จำไว้ว่าข้อความที่ท่านพิมพ์จะปรากฏต่อสาธารณะ
+        ผู้ใช้ทุกท่านไม่จำต้องเข้าใจถึงศัพท์เฉพาะ จึงขอแนะนำให้ใช้ศัพท์อย่างง่าย
+      period: ต้องการกีดกันผู้ใช้คนนี้จาก API นับแต่บัดนี้ นานเท่าใด
+      submit: สร้างการกีดกัน
+      tried_contacting: ข้าพเจ้าติดต่อผู้ใช้คนนี้และขอร้องให้เขาหยุดการกระทำ
+      tried_waiting: ข้าพเจ้าได้ให้เวลานานสมควรแก่ผู้ใช้คนนี้ในการตอบคำถามกลับ
+      needs_view: ผู้ใช้ต้องเข้าระบบก่อนการกีดกันนี้จะถูกเพิกถอน
+      back: แสดงการกีดกันทั้งหมด
+    edit:
+      title: แก้ไขการกีดกันบน %{name}
+      heading: แก้ไขการกีดกันบน %{name}
+      reason: เหตุผลที่ผู้ใช้ %{name} ถูกกีดกัน โปรดอย่าใช้อารมณ์รุนแรงในระหว่างระบุ
+        และขอให้ระบุรายละเอียดเกี่ยวกับสถานการณ์ที่พบให้ละเอียดชัดเจน จำไว้ว่าข้อความที่ท่านพิมพ์จะปรากฏต่อสาธารณะ
+        ผู้ใช้ทุกท่านไม่จำต้องเข้าใจถึงศัพท์เฉพาะ จึงขอแนะนำให้ใช้ศัพท์อย่างง่าย
+      period: ต้องการกีดกันผู้ใช้คนนี้จาก API นับแต่บัดนี้ นานเท่าใด
+      submit: ปรับปรุงการกีดกัน
+      show: ดูการกีดกันนี้
+      back: แสดงการกีดกันทั้งหมด
+      needs_view: ต้องการให้ผู้ใช้คนนี้เข้าระบบก่อนเพิกถอนการกีดกันหรือไม่?
+    filter:
+      block_expired: การกีดกันนี้สิ้นผลแล้วแก้ไขไม่ได้
+      block_period: ระยะเวลาที่กีดกันต้องเป็นไปตามรายการเลือกในกล่องตัวเลือกเท่านั้น
+    create:
+      try_contacting: กรุณาติดต่อผู้ใช้ก่อนที่จะกีดกันเขาออกจากระบบ และเผื่อเวลาระยะหนึ่งให้ตอบกลับ
+    update:
+      success: ปรับปรุงการกีดกันแล้ว
+    index:
+      title: การกีดกันผู้ใช้
+      heading: รายการการกีดกันผู้ใช้
+      empty: ยังไม่มีการกีดกันใด ๆ
+    partial:
+      next: ถัดไป »
+      previous: « ก่อนหน้า
+    helper:
+      time_future: จะสิ้นสุดใน %{time}
+    blocks_on:
+      title: การกีดกันบน %{name}
+      heading: รายการการกีดกันบน %{name}
+      empty: '%{name} ยังไม่ได้ถูกกีดกัน'
+  note:
+    rss:
+      title: หมายเหตุแผนที่ บน OpenStreetMap
+    entry:
+      comment: ความคิดเห็น
+      full: เนื้อความเต็มในหมายเตุ
   javascripts:
+    close: ปิด
     share:
+      title: แบ่งปัน
+      cancel: ยกเลิก
       format: 'รูปแบบ:'
       scale: 'ขนาด:'
+      short_url: URL สั้น
+      include_marker: แสดงไอคอนหมุด
+    embed:
+      report_problem: แจ้งปัญหา
+    key:
+      title: ความหมายสัญลักษณ์
+      tooltip: ความหมายสัญลักษณ์
     map:
+      zoom:
+        in: ซูมเข้า
+        out: ซูมออก
+      locate:
+        title: แสดงตำแหน่งของฉัน
       base:
+        standard: ปกติ
         cycle_map: แผนที่จักรยาน
         transport_map: แผนที่การขนส่ง
         hot: เพื่อมนุษยธรรม
@@ -1581,12 +1978,26 @@ th:
     site:
       edit_tooltip: แก้ไขแผนที่
       edit_disabled_tooltip: ขยายเพื่อแก้ไขแผนที่
-      createnote_tooltip: เพิ่มบันทึกลงในแผนที่
+      createnote_tooltip: ใส่หมายเหตุลงในแผนที่
+      queryfeature_tooltip: แสดงส่วนประกอบ
+      queryfeature_disabled_tooltip: ต้องซูมเข้ามากกว่านี้ จึงจะตรวจสอบส่วนประกอบได้
     changesets:
       show:
+        comment: ความคิดเห็น
         subscribe: บอกรับข้อมูล
         unsubscribe: เลิกรับข้อมูล
+        hide_comment: ซ่อน
+        unhide_comment: แสดง
+    notes:
+      new:
+        add: เพิ่มหมายเหตุ
+      show:
+        hide: ซ่อน
     directions:
+      ascend: ลาดขึ้น
+      descend: ลาดลง
+      directions: เส้นทาง
+      distance: ระยะทาง
       instructions:
         continue_without_exit: เคลื่อนต่อไปทางถนน %{name}
         offramp_right_without_exit: ใช้ทางลาดด้านขวาไปที่ถนน %{name}
@@ -1603,6 +2014,7 @@ th:
         merge_left_without_exit: เลี้ยวซ้ายเข้าสู่ถนน %{name} ซึ่งเป็นทางเอก
         fork_left_without_exit: ที่ทางแยกเลี้ยวซ้ายไปที่ถนน %{name}
         slight_left_without_exit: ขยับซ้ายเล็กน้อยไปที่ %{name}
+        destination_without_exit: ตรงไปยังจุดหมาย
         roundabout_with_exit: ณ วงเวียน ใช้ทางออก %{exit} ไปที่ถนน %{name}
         turn_left_with_exit: ณ วงเวียน เลี้ยวซ้ายไปที่ถนน %{name}
         slight_left_with_exit: ณ วงเวียน ขยับซ้ายไปที่ถนน %{name}
@@ -1622,9 +2034,9 @@ th:
     context:
       directions_from: เส้นทางจากที่นี่
       directions_to: เส้นทางมาที่นี่
-      add_note: à¹\80à¸\9eิà¹\88มà¸\9aัà¸\99à¸\97ึà¸\81à¸\97ีà¹\88à¸\99ีà¹\88
+      add_note: à¹\80à¸\9eิà¹\88มหมายà¹\80หà¸\95ุà¸\95รà¸\87à¸\99ีà¹\89
       show_address: แสดงที่อยู่
-      query_features: à¸ªà¸­à¸\9aà¸\96ามส่วนประกอบ
+      query_features: à¹\81สà¸\94à¸\87ส่วนประกอบ
       centre_map: วางแผนที่ตรงกลางที่นี่
   redaction:
     edit:
index 55644dc7c40d4815193720ad5c33a49a3c943b85..2da4f6726d1e22a490ec1db883190704f2299719 100644 (file)
@@ -183,10 +183,20 @@ tl:
       wikipedia_link: Ang %{page} ng artikulo sa Wikipedia
       telephone_link: Tawagan ang %{phone_number}
     note:
+      title: 'Tala: %{id}'
+      new_note: Bagong Tala
       description: Paglalarawan
+      hidden_title: 'Nakatagong tala #%{note_name}'
+      open_by: Nilikha ni %{user} <abbr title='%{exact_time}'>%{when} ang nakaraan</abbr>
+      open_by_anonymous: Nilikha ng isang di-nagpakilalang tagagamit <abbr title='%{exact_time}'>%{when}
+        ang nakaraan</abbr>
       commented_by: Puna mula kay %{user} <abbr title='%{exact_time}'>%{when} ang
         nakaraan</abbr>
+      commented_by_anonymous: Puna ng isang di-nagpakilalang tagagamit <abbr title='%{exact_time}'>%{when}
+        ang nakaraan</abbr>
       hidden_by: Itinago ni %{user} <abbr title='%{exact_time}'>%{when} ang nakaraan</abbr>
+    query:
+      nearby: Mga kalapit na tampok
   changeset:
     changeset_paging_nav:
       showing_page: Ika-%{page} na pahina
@@ -315,10 +325,16 @@ tl:
       too_large:
         body: Masyadong malaki ang lugar na ito upang mailuwas bilang Dato ng XML
           ng OpenStreetMap. Mangyaring lumapit o pumili ng isang mas maliit na pook.
+        planet:
+          title: Planet OSM
         overpass:
           title: Overpass API
+        metro:
+          title: Metro Extracts
         other:
           title: Iba pang mga Pinagmulan
+          description: Karagdagang mga mapagkukunan na nakalista sa OpenStreetMap
+            Wiki
       options: Mga mapagpipilian
       format: Anyo
       scale: Sukat
@@ -385,33 +401,26 @@ tl:
           crematorium: Krematoryum
           dentist: Dentista
           doctors: Mga manggagamot
-          dormitory: Dormitoryo
           drinking_water: Naiinom na Tubig
           driving_school: Paaralan ng Pagmamaneho
           embassy: Embahada
-          emergency_phone: Teleponong Pangsakuna
           fast_food: Kainang Pangmabilisan
           ferry_terminal: Himpilan ng Barkong Pangtawid
-          fire_hydrant: Panubig ng Bumbero
           fire_station: Himpilan ng Bumbero
           food_court: Korte ng Pagkain
           fountain: Bukal
           fuel: Panggatong
           gambling: Pagsusugal
           grave_yard: Sementeryo
-          gym: Lunduyang Pangkalusugan / Himnasyo
-          health_centre: Lunduyan ng Kalusugan
           hospital: Ospital
           hunting_stand: Pook-tayuan na Pangpangangaso
           ice_cream: Sorbetes
           kindergarten: Kindergarten
           library: Aklatan
-          market: Pamilihan
           marketplace: Palengke
           monastery: Monasteryo
           motorcycle_parking: Paradahan ng Motorsiklo
           nightclub: Alibangbang
-          nursery: Alagaan ng mga Bata
           nursing_home: Alagaan ng mga Matatanda
           office: Tanggapan
           parking: Paradahan
@@ -425,7 +434,6 @@ tl:
           prison: Bilangguan
           pub: Pangmadlang Bahay
           public_building: Pangmadlang Gusali
-          reception_area: Tanggapang Pook
           recycling: Pook ng Muling Paggamit
           restaurant: Kainan
           retirement_home: Tahanan ng Pagreretiro
@@ -468,6 +476,8 @@ tl:
           gardener: Hardinero
           painter: Pintor
           photographer: Litratista
+          plumber: Tubero
+          shoemaker: Sapatero
           tailor: Mananahi
         emergency:
           ambulance_station: Istasyon ng Ambulansya
@@ -479,6 +489,7 @@ tl:
           bus_stop: Hintuan ng Bus
           construction: Ginagawang Punong Lansangan
           cycleway: Daanan ng Bisikleta
+          elevator: Asensor
           emergency_access_point: Tuldok na Puntahan na Pangsakuna
           footway: Makitid na Lakaran ng Tao
           ford: Bagtasan ng Tao
@@ -494,7 +505,7 @@ tl:
           primary_link: Pangunahing Kalsada
           proposed: Iminungkahing Daan
           raceway: Kanal na Daluyan ng Tubig
-          residential: Pamahayan
+          residential: Daang pamahayan
           rest_area: Pook Pahingahan
           road: Lansangan
           secondary: Pampangalawang Lansangan
@@ -511,7 +522,6 @@ tl:
           trunk: Pangunahing Ruta
           trunk_link: Pangunahing Ruta
           unclassified: Kalsadang Walang Kaurian
-          unsurfaced: Kalsadang Hindi Patag
           "yes": Daan
         historic:
           archaeological_site: Pook na Pang-arkeolohiya
@@ -653,7 +663,6 @@ tl:
           travel_agent: Ahensiya ng Paglalakbay
           "yes": Tanggapan
         place:
-          airport: Paliparan
           city: Lungsod
           country: Bansa
           county: Kondehan
@@ -665,7 +674,6 @@ tl:
           islet: Munting Pulo
           isolated_dwelling: Ilang na Tirahan
           locality: Lokalidad
-          moor: Lupang Pugalan ng Tubig
           municipality: Munisipalidad
           neighbourhood: Kabahayan
           postcode: Kodigo ng Koreo
@@ -682,10 +690,8 @@ tl:
           abandoned: Pinabayaang daambakal
           construction: Kinukumpuning Daambakal
           disused: Hindi Ginagamit na Daambakal
-          disused_station: Hindi Ginagamit na Himpilan ng Daambakal
           funicular: Daambakal sa Matarik na Lupa
           halt: Hintuan ng Tren
-          historic_station: Makasaysayang Himpilan ng Daambakal
           junction: Panulukan ng Daambakal
           level_crossing: Patag na Tawiran
           light_rail: Banayad na Riles
@@ -696,7 +702,7 @@ tl:
           preserved: Pinangangalagaang Daambakal
           spur: Tahid ng Daambakal
           station: Himpilan ng Daambakal
-          subway: Himpilan ng Pang-ilalim na Daambakal
+          subway: Pang-ilalim na Daambakal
           subway_entrance: Pasukan sa Pang-ilalim na Daambakal
           switch: Mga Tuldok na Pangdaambakal
           tram: Riles ng Trambya
@@ -745,7 +751,6 @@ tl:
           hairdresser: Tagapag-ayos ng Buhok
           hardware: Tindahan ng Hardwer
           hifi: Hi-Fi
-          insurance: Seguro
           jewelry: Tindahan ng Alahas
           kiosk: Tindahan ng Kubol
           laundry: Labahan
@@ -761,9 +766,7 @@ tl:
           pet: Tindahan ng Alagang Hayop
           pharmacy: Botika
           photo: Tindahan ng Litrato
-          salon: Salon
           shoes: Tindahan ng Sapatos
-          shopping_centre: Lunduyang Pamilihan
           sports: Tindahang Pampalakasan
           stationery: Tindahan ng Papel
           supermarket: Malaking Pamilihan
@@ -853,7 +856,7 @@ tl:
     intro_text: Ang OpenStreetMap ay isang mapa ng mundo na nilikha ng mga taong katulad
       mo at malayang gamitin sa ilalim ng isang bukas na lisensya.
     intro_2_create_account: Lumikha ng isang akawnt ng tagagamit
-    partners_html: Ang pagpapasinaya ay sinusuportahan ng %{ucl}, %{ic} at %{bytemark},
+    partners_html: Ang pagpapasinaya ay sinusuportahan ng %{ucl}, %{bytemark}, %{ic},
       at iba pang %{partners}.
     partners_ucl: UCL
     partners_ic: Dalubhasaang Pang-imperyo Londres
@@ -896,9 +899,9 @@ tl:
     legal_babble:
       title_html: Karapatan sa Paglalathala at Lisensiya
       intro_1_html: |-
-        Ang OpenStreetMap ay <i>open data</i>, nakalisensiya sa ilalim ng lisensiyang <a
+        Ang OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> ay <i>bukas na datos</i>, nakalisensiya sa ilalim ng lisensiyang <a
         href="http://opendatacommons.org/licenses/odbl/">Open Data
-        Commons Open Database License</a> (ODbL).
+        Commons Open Database License</a> (ODbL) ng <a href="http://osmfoundation.org/">OpenStreetMap Foundation</a> o OSMF.
       intro_2_html: "Malaya mong makokopya, maipapamahagi, maipahahatid at mahahalaw
         ang aming mga dato,\nbasta't babanggitin mo ang OpenStreetMap at ang mga tagapag-ambag\nnito.
         Kapag binago mo o nagbuo sa pamamagitan ng aming mga dato, maaari\nmong ipamahagi
@@ -923,9 +926,10 @@ tl:
       attribution_example:
         title: Halimbawa ng Atribusyon
       more_title_html: Ang pagtuklas ng mas marami pang iba
-      more_1_html: "Magbasa ng mas marami pa hinggil sa paggamit ng dato namin doon
-        sa <a\nhref=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Mga Palaging
-        Itinatanong \nna Makabatas</a>."
+      more_1_html: |-
+        Magbasa ng mas marami pa hinggil sa paggamit ng dato namin at kung paano kaming banggitin sa <a
+        href="http://osmfoundation.org/Licence">pahina ng Lisensya ng OSMF</a> at sa <a
+        href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Mga Palaging Itinatanong na Makabatas</a>.
       more_2_html: |-
         Ipinapaalala sa mga tagapag-ambag ng OpenStreetMap (OSM) na huwag kailanman magdaragdag ng dato magmula sa anumang
         mga pinagmulan na mayroong karapatan sa paglalathala (halimbawa na ang Google Maps o nakalimbag na mga mapa) na wala
@@ -944,8 +948,8 @@ tl:
         sa \n<a href=\"http://data.wien.gv.at/\">Stadt Wien</a> (na nasa ilalim ng
         \n<a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC BY</a>),\n<a
         href=\"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm\">Land
-        Vorarlberg</a> at ng\nLand Tirol (na nasa ilalim ng <a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">CC-BY
-        AT na mayroong mga susog</a>)."
+        Vorarlberg</a> at ng\nLand Tirol (na nasa ilalim ng <a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">CC
+        BY AT na mayroong mga susog</a>)."
       contributors_ca_html: "<strong>Canada</strong>: Naglalaman ng dato mula sa\nGeoBase&reg;,
         GeoGratis (&copy; Kagawaran ng Likas na Yaman ng \nCanada), CanVec (&copy;
         Kagawaran ng Likas na Yaman ng Canada), at StatCan \n(Dibisyon ng Heograpiya,
@@ -995,9 +999,14 @@ tl:
       title: Papaano tumulong
   help_page:
     welcome:
+      url: /welcome
       title: Maligayang pagdating sa OSM
+    beginners_guide:
+      url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide
     irc:
       title: IRC
+    switch2osm:
+      title: switch2osm
   about_page:
     next: Kasunod
     copyright_html: <span>&copy;</span>Mga tagapag-ambag<br>ng OpenStreetMap
@@ -1088,11 +1097,22 @@ tl:
     note_comment_notification:
       anonymous: Isang di-nagpakilalang tagagamit
       greeting: Kumusta,
+      commented:
+        subject_own: '[OpenStreetMap] Pinuna ni %{commenter} ang isa sa iyong mga
+          tala'
+        your_note: Nag-iwan si %{commenter} ng komento sa isa sa iyong mga tala malapit
+          sa %{place}.
+      details: Higit pang mga detalye tungkol sa tala ay matatagpuan sa %{url}.
     changeset_comment_notification:
       hi: Kumusta %{to_user},
       greeting: Kumusta,
       commented:
+        subject_own: '[OpenStreetMap] Pinuna ni %{commenter} ang isa sa iyong mga
+          pangkat ng pagbabago'
+        partial_changeset_with_comment: na may puna na '%{changeset_comment}'
         partial_changeset_without_comment: walang puna
+      details: Higit pang mga detalye tungkol sa pangkat ng pagbabago ay matatagpuan
+        sa %{url}.
   message:
     inbox:
       title: Kahon ng pumapasok
@@ -1209,7 +1229,7 @@ tl:
       search: Maghanap
       from: Mula sa
       to: Papunta sa
-      where_am_i: Nasaan ba ako?
+      where_am_i: Nasaan ba ito?
       where_am_i_title: Ilarawan ang pangkasalukuyang kinalalagyan na ginagamit ang
         makinang panghanap
       submit_text: Gawin
@@ -1563,9 +1583,10 @@ tl:
         tuntunin ng tagapag-ambag</a>.
       email address: 'Tirahan ng E-liham:'
       confirm email address: 'Patotohanan ang Tirahan ng E-liham:'
-      not displayed publicly: Hindi ipinapakita sa madla (tingnan ang <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
-        title="wiki privacy policy including section on email addresses">patakaran
-        sa pagsasarilinan</a>)
+      not displayed publicly: Ang iyong tirahan ng e-liham ay hindi ipinapakita sa
+        madla, tingnan ang ating <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
+        title="OSMF privacy policy including section on email addresses">patakaran
+        sa pagsasarilinan</a> para sa karagdagang impormasyon
       display name: 'Pangalang Ipinapakita:'
       display name description: Ang iyong pangalan ng tagagamit na ipinapakita sa
         madla. Maaari mo itong baguhin mamaya sa loob ng mga kanaisan.
@@ -1610,6 +1631,7 @@ tl:
       new diary entry: Bagong pagpapasok sa talaarawan
       my edits: mga pamamatnugot ko
       my traces: Mga Bakas Ko
+      my notes: Aking Talaan
       my settings: mga pagtatakda ko
       my comments: mga puna ko
       oauth settings: mga pagtatakda ng oauth
@@ -1785,9 +1807,8 @@ tl:
       title: Mga tagagamit
       heading: Mga tagagamit
       showing:
-        one: Ipinapakita ang pahinang %{page} (%{first_item} ng  %{items})
-        other: Ipinapakita ang pahinang %{page}  (%{first_item}-%{last_item} ng  mga
-          %{items})
+        one: Pahina %{page} (%{first_item} ng  %{items})
+        other: Pahina %{page}  (%{first_item}-%{last_item} ng  mga %{items})
       summary: Nilikha ang %{name} mula sa %{ip_address} noong %{date}
       summary_no_ip: Nilikha ang %{name} noong %{date}
       confirm: Tiyakin ang Napiling mga Tagagamit
@@ -1931,6 +1952,7 @@ tl:
       heading: '%{block_on} hinadlangan ni %{block_by}'
       time_future: Magwawakas sa %{time}
       time_past: Nagwakas noong %{time} na ang nakalilipas
+      created: Nilikha
       ago: '%{time} ang nakaraan'
       status: Kalagayan
       show: Ipakita
@@ -1943,9 +1965,15 @@ tl:
       needs_view: Ang tagagamit ay kailangang lumagda muna bago mahawi ang hadlang
         na ito.
   note:
+    description:
+      opened_at_html: Nilikha %{when} ang nakaraan
+      opened_at_by_html: Nilikha %{when} ang nakaraan ni %{user}
+      closed_at_html: Nalutas %{when} ang nakaraan
+      closed_at_by_html: Nalutas %{when} ang nakaraan ni %{user}
     rss:
       commented: bagong puna (malapit sa %{place})
     mine:
+      heading: mga tala ni %{user}
       id: Id
       description: Paglalarawan
       created_at: Nilikha Noong
@@ -1961,6 +1989,8 @@ tl:
     map:
       zoom:
         in: Lumapit
+      locate:
+        title: Ipakita ang Aking Lokasyon
       base:
         standard: Pamantayan
         cycle_map: Mapa ng Pagbibisikleta
@@ -1971,14 +2001,43 @@ tl:
     site:
       edit_tooltip: Baguhin ang mapa
       edit_disabled_tooltip: Lumapit upang baguhin ang mapa
+      createnote_tooltip: Maglagay ng tala sa mapa
+      createnote_disabled_tooltip: Lumapit upang ilagay ang tala sa mapa
       map_data_zoom_in_tooltip: Lumapit upang makita ang datos ng mapa
+    changesets:
+      show:
+        hide_comment: itago
+        unhide_comment: pawalang-bisa ang pag-tago
     notes:
+      new:
+        add: Magdagdag ng Tala
       show:
         hide: Itago
         resolve: Lutasin
         comment_and_resolve: Pumuna at Lutasin
+    directions:
+      engines:
+        graphhopper_bicycle: Bisikleta (GraphHopper)
+        graphhopper_car: Kotse (GraphHopper)
+        mapquest_bicycle: Bisikleta (MapQuest)
+        mapquest_car: Kotse (MapQuest)
+        osrm_car: Kotse (OSRM)
+      directions: Mga Direksyon
+      distance: Layo
+      instructions:
+        follow_without_exit: Sundan %{name}
+        start_without_exit: Magsimula sa dulo ng %{name}
+        destination_without_exit: Abutin ang patutunguhan
+      time: Oras
     query:
+      node: Buko
+      way: Daan
       relation: Kaugnayan
+    context:
+      directions_from: Mga direksyon mula rito
+      directions_to: Mga direksyon papunta rito
+      add_note: Magdagdag ng tala dito
+      centre_map: Igitna ang mapa dito
   redaction:
     edit:
       description: Paglalarawan
index fdc614cab12eede9ad7419e2877d661855fca427..052f61446f56ac3a9b11efc7e62d2f49758603f8 100644 (file)
@@ -9,6 +9,7 @@
 # Author: Erdemaslancan
 # Author: George Animal
 # Author: Gizemb
+# Author: Hedda
 # Author: Imabadplayer
 # Author: Incelemeelemani
 # Author: Joseph
@@ -69,12 +70,13 @@ tr:
       tracetag: İzleme Etiketi
       user: Kullanıcı
       user_preference: Kullanıcı Tercihleri
+      user_token: Kullanıcı Simgesi
       way: Yol
       way_node: Yol Noktası
       way_tag: Yol Etiketi
     attributes:
       diary_comment:
-        body: Mesaj
+        body: Gövde
       diary_entry:
         user: Kullanıcı
         title: Konu
@@ -96,7 +98,7 @@ tr:
       message:
         sender: Gönderen
         title: Konu
-        body: Mesaj
+        body: Gövde
         recipient: Alıcı
       user:
         email: E-posta
@@ -151,8 +153,8 @@ tr:
       relation: İlişkiler (%{count})
       relation_paginated: İlişkiler (%{x}-%{y} - toplam %{count})
       comment: Yorumlar (%{count})
-      hidden_commented_by: Gizli yorum %{user} <abbr title="%{exact_time}">%{when}
-        önce</abbr>
+      hidden_commented_by: '%{user} tarafından gizli yorum <abbr title="%{exact_time}">%{when}
+        önce</abbr>'
       commented_by: '%{user} kullanıcıdan yorum <abbr title="%{exact_time}">%{when}
         önce</abbr>'
       changesetxml: Değişiklik takımı XML
@@ -162,6 +164,8 @@ tr:
         title_comment: Değişiklik takımı %{id} - %{comment}
       join_discussion: Tartışmaya katılmak için lütfen giriş yap
       discussion: Tartışma
+      still_open: Değişiklik serisi hâlâ açık - tartışma, değişiklik serisi kapatıldığında
+        açılacaktır.
     node:
       title: 'Nokta: %{name}'
       history_title: 'Nokta Geçmişi: %{name}'
@@ -203,6 +207,8 @@ tr:
         note: Not
     redacted:
       redaction: Redaksiyon %{id}
+      message_html: Bu %{type} için %{version} versiyonununda düzenlemeler hemen görülemez.
+        Daha fazla bilgi için %{redaction_link} sayfasına bakınız.
       type:
         node: nokta
         way: yol
@@ -236,6 +242,16 @@ tr:
         önceki</abbr> yorumu'
       commented_by_anonymous: Anonim kullanıcının <abbr title='%{exact_time}'>%{when}
         önceki</abbr> yorumu
+      closed_by: '%{user} tarafından <abbr title=''%{exact_time}''>%{when} önce</abbr>
+        çözüldü'
+      closed_by_anonymous: Anonim kullanıcı tarafından <abbr title='%{exact_time}'>%{when}
+        önce</abbr> çözüldü
+      reopened_by: '%{user} tarafından <abbr title=''%{exact_time}''>%{when} önce</abbr>
+        yeniden etkin hâle getirildi.'
+      reopened_by_anonymous: Anonim kullanıcı tarafından <abbr title='%{exact_time}'>%{when}
+        önce</abbr> yeniden etkin hâle getirildi.
+      hidden_by: '%{user} tarafından <abbr title=''%{exact_time}''>%{when} önce</abbr>
+        gizlendi'
     query:
       title: Özellikleri Göster
       introduction: Yakın diğer özellikleri bulmak için harita üzerine tıklayın.
@@ -320,7 +336,7 @@ tr:
     diary_entry:
       posted_by: '%{link_user} tarafından %{created} tarihinde %{language_link} dilinde
         gönderildi'
-      comment_link: Bu girdisi yorumla
+      comment_link: Bu girdiyi yorumla
       reply_link: Bu girdiyi yanıtla
       comment_count:
         one: 1 yorum
@@ -366,7 +382,7 @@ tr:
       map_image: Harita (varsayılan katmanı gösterir)
       embeddable_html: Gömülebilir HTML
       licence: Lisans
-      export_details: OpenStreetMap verileri, <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
+      export_details: OpenStreetMap verileri, <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
         Data Commons Open Database License</a>  (ODbL) altında lisanslanmıştır.
       too_large:
         advice: 'Yukarıdaki dışa aktarım başarısız olursa, lütfen aşağıdaki kaynaklardan
@@ -379,8 +395,12 @@ tr:
           description: Tam OpenStreetMap veritabanının düzenli güncellenen kopyası
         overpass:
           title: Overpass API
+          description: Bu karakter kutusunu OpenStreetMap veritabanının alternatif
+            bir bağlantısını kullanarak indirin
         geofabrik:
           title: Geofabrik İndirmeleri
+          description: Kıtalar, ülkeler ve seçilen şehirlerin düzenli olarak güncellenen
+            özetleri
         metro:
           title: Büyükşehir Çıktıları
           description: Büyükşehir ile banliyölerin çıktıkları
@@ -402,14 +422,14 @@ tr:
   geocoder:
     search:
       title:
-        latlon: <a href="http://openstreetmap.org/">OSM</a>'in sonuçları
+        latlon: <a href="https://openstreetmap.org/">OSM</a>'in sonuçları
         uk_postcode: <a href="http://www.npemap.org.uk/">FreeThe Postcode</a> sonuçları
           (İngiltere)
-        ca_postcode: <a href="http://geocoder.ca/">Geocoder.CA</a>'dan sonuçları
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OSM Nominatim</a>
+        ca_postcode: <a href="https://geocoder.ca/">Geocoder.CA</a>'dan sonuçları
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OSM Nominatim</a>
           sonuçları
         geonames: <a href="http://www.geonames.org/">GeoNames</a>'in sonuçları
-        osm_nominatim_reverse: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>'in sonuçları
         geonames_reverse: <a href="http://www.geonames.org/">GeoNames</a>'in sonuçları
     search_osm_nominatim:
@@ -459,33 +479,26 @@ tr:
           crematorium: Krematoryum
           dentist: Diş hekimi
           doctors: Doktorlar
-          dormitory: Yurt
           drinking_water: İçme Suyu
           driving_school: Sürücü Kursu
           embassy: Elçilik
-          emergency_phone: Acil Telefon
           fast_food: Büfe / Fast Food
           ferry_terminal: Feribot Terminali
-          fire_hydrant: Yangın musluğu
           fire_station: Itfaiye
           food_court: Yiyecek Reyonu
           fountain: Fıskiye
           fuel: Petrol ofisi
           gambling: Kumarhane
           grave_yard: Mezarlık
-          gym: Fitness Merkezi / Spor Salonu
-          health_centre: Sağlık Merkezi
           hospital: Hastane
           hunting_stand: Avcılık Standı
           ice_cream: Dondurma
           kindergarten: Kreş
           library: Kütüphane
-          market: Pazar
           marketplace: Pazar yeri
           monastery: Manastır
           motorcycle_parking: Motosiklet Park Yeri
           nightclub: Gece Kulübü
-          nursery: Kreş
           nursing_home: Huzurevi
           office: Ofis
           parking: Otopark
@@ -499,7 +512,6 @@ tr:
           prison: Cezaevi
           pub: Birahane
           public_building: Kamu Binası
-          reception_area: Resepsiyon Alanı
           recycling: Geri dönüşüm noktası
           restaurant: Restoran
           retirement_home: Bakımevi
@@ -595,7 +607,6 @@ tr:
           trunk: Bölünmüş anayol
           trunk_link: Bölünmüş anayol bağlantısı
           unclassified: Sınıflandırılmamış yolu
-          unsurfaced: Ham yolu
           "yes": Yol
         historic:
           archaeological_site: Arkeolojik Alan
@@ -620,6 +631,8 @@ tr:
           stone: Taş
           tomb: Mezar
           tower: Kule
+          wayside_cross: Wayside Cross
+          wayside_shrine: Wayside Shrine
           wreck: Batık Gemi
         junction:
           "yes": Yol Ayrımı
@@ -658,7 +671,6 @@ tr:
         leisure:
           beach_resort: Plajlı tatilköyü
           bird_hide: Kuş Gözleme Yeri
-          club: Klüb
           common: Genel Arazi
           dog_park: Köpek Parkı
           fishing: Balıkçılık alanı
@@ -675,6 +687,7 @@ tr:
           pitch: Spor sahası
           playground: Çocuk parkı
           recreation_ground: Eğlence parkı
+          resort: Tatil yeri
           sauna: Sauna
           slipway: Kızak yolu
           sports_centre: Spor Merkezi
@@ -750,8 +763,6 @@ tr:
           "yes": Ofis
         place:
           allotments: Bostan
-          block: Blok
-          airport: Havaalanı
           city: Büyükşehir / İl Merkezi
           country: Ülke
           county: İlçe
@@ -763,7 +774,6 @@ tr:
           islet: Adacık
           isolated_dwelling: İzole Konut
           locality: Yer/mevkii
-          moor: Bataklık
           municipality: Belediye
           neighbourhood: Mahalle
           postcode: Posta kodu
@@ -778,20 +788,20 @@ tr:
           "yes": Yer
         railway:
           abandoned: Terkedilmiş Demiryolu
-          construction: Yapım aşamasında Demiryolu
+          construction: Yapım aşamasındaki demiryolları
           disused: Kullanılmayan Demiryolu
-          disused_station: Kullanılmayan Tren İstasyonu
           funicular: Füniküler hattı
           halt: Tren Durağı
-          historic_station: Tarihi tren istasyonu
           junction: Demiryolu Kavşağı
           level_crossing: Demiryolu Geçidi
           light_rail: Hafif raylı demiryolu
           miniature: Minyatür Demiryolu
+          monorail: Tek raylı demiryolu
           narrow_gauge: Dar Hat Demiryolu
           platform: Peron
           preserved: Korunmuş Demiryolu
           proposed: Planlanmış Demiryolu
+          spur: Demiryolu Kör Hattı
           station: Tren istasyonu
           stop: Tren Durağı
           subway: Metro
@@ -814,6 +824,7 @@ tr:
           car_parts: Araba Parçaları
           car_repair: Oto tamir
           carpet: Halı Dükkânı
+          charity: Hayır Kurumu Mağazası
           chemist: Eczacı
           clothes: Giysi Dükkânı
           computer: Bilgisayar Mağazası
@@ -833,6 +844,7 @@ tr:
           fish: Balık Dükkânı
           florist: Çiçekçi
           food: Yiyecek Dükkânı
+          funeral_directors: Cenaze Levazımcısı
           furniture: Mobilya
           gallery: Galeri
           garden_centre: Bahçe Merkezi
@@ -843,7 +855,6 @@ tr:
           hairdresser: Kuaför
           hardware: Hırdavatçı
           hifi: Hi-Fi
-          insurance: Sigorta
           jewelry: Kuyumcu
           kiosk: Tekel Bayii
           laundry: Çamaşırhane
@@ -859,10 +870,8 @@ tr:
           pet: Hayvan Mağazası
           pharmacy: Eczane
           photo: Fotoğrafçı
-          salon: Kuaför
           second_hand: İkinci El Dükkânı
           shoes: Ayakkabı Dükkânı
-          shopping_centre: Alışveriş Merkezi
           sports: Spor Malzemeleri Mağazası
           stationery: Kırtasiye
           supermarket: Süpermarket
@@ -925,7 +934,7 @@ tr:
         level10: Mahalle Sınırı
     description:
       title:
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OSM Nominatim</a>
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OSM Nominatim</a>
           tarafından konum
         geonames: <a href="http://www.geonames.org/">GeoNames</a> tarafından konum
       types:
@@ -960,9 +969,9 @@ tr:
     intro_text: OpenStreetMap senin gibi insanlar tarafından oluşturulan, kullanımı
       serbest ve açık lisans altında olan bir dünya haritasıdır.
     intro_2_create_account: hesap oluşturunuz
-    partners_html: Barındırma hizmeti, %{ucl}, %{ic}, %{bytemark} ve diğer %{partners}
-      tarafından desteklenmektedir.
-    partners_ucl: UCL VR Centre
+    partners_html: Barındırma hizmeti, %{ucl}, %{ic}, %{bytemark}, %{ic} ve diğer
+      %{partners} tarafından desteklenmektedir.
+    partners_ucl: UCL
     partners_ic: Imperial College London
     partners_bytemark: Bytemark Hosting
     partners_partners: ortaklar
@@ -987,25 +996,126 @@ tr:
   license_page:
     foreign:
       title: Bu çeviri hakkında
+      text: Tercüme edilmiş bu sayfa ile %{english_original_link} arasında meydana
+        gelebilecek herhangi bir uyuşmazlıkta sayfanın özgün dili olan İngilizce bölümü
+        önceliklidir.
       english_link: İngilizce orijinal
     native:
       title: Sayfa hakkında
+      text: Telif hakkı sayfasının İngilizce sürümünü görüntülüyorsunuz. Bu sayfanın
+        %{native_link} ile geri gidebilir ya da telif hakkı ve %{mapping_link} hakkında
+        bilgi edinmek için sayfada kalabilirsiniz.
       native_link: Türkçe sürümü
       mapping_link: harita çizmeye başla
     legal_babble:
       title_html: Telif Hakkı ve Lisans
+      intro_1_html: |-
+        OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup>,  <a
+        href="https://osmfoundation.org/">OpenStreetMap Foundation</a> (OSMF) tarafından oluşturulan <a
+        href="https://opendatacommons.org/licenses/odbl/">Open Data
+        Commons Open Database License</a> (ODbL) ile lisanslandırılmıştır.
+      intro_2_html: |-
+        OpenStreetMap'e ve katkıda bulunanlarına değindiğiniz
+        sürece verilerimizi kopyalamak, dağıtmak, iletmek
+        ve uyarlamakta serbestsiniz.
+        Verilerimizi değiştirir veya geliştirirseniz,
+        sonucu sadece aynı lisans altında dağıtabilirsiniz.
+        Tüm <a href="https://opendatacommons.org/licenses/odbl/1.0/">yasal kod</a>, haklarınızı ve sorumluluklarınızı açıklamaktadır.
+      intro_3_html: |-
+        Haritalarımızdaki haritacılık ve belgelerimiz, <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Attribution-ShareAlike 2.0</a> lisansı (CC BY-SA) ile yetkilendirilmiştir.
       credit_title_html: OpenStreetMap nasıl atıf edinir
       credit_1_html: |-
         Atıf şu şekilde yazmak gerekir: &ldquo;&copy; OpenStreetMap
         katılımcıları&rdquo;.
+      credit_2_html: |-
+        Ayrıca, verilerin Open Database License ve
+        haritalarımızdaki karoları kullanıyorsanız haritacılığımız
+        CC BY-SA ile lisanslandırıldığını açıkça belirtmelisiniz.
+        Bunu, <a href="https://www.openstreetmap.org/copyright">bu telif hakkı sayfasına</a> bağlantı vererek gerçekleştirebilirsiniz.
+        Alternatif ve bir gereksinim olarak, OSM'yi  bir veri formunda dağıtıyorsanız direkt olarak lisansları adlandırabilir
+        veya doğrudan lisanslara bağlayabilirsiniz. Bağlantıların
+        mümkün olmadığı ortamlarda (örneğin basılı işler)
+        okuyucularınızı openstreetmap.org'a, opendatacommons.org'a
+        ve varsa creativecommons.org'a yönlendirmenizi
+        öneriyoruz.
       credit_3_html: |-
         Bir gezinebilir elektronik haritanın sağ alt köşesinde kredisi görünmesi lazım.
         Örnegin:
       attribution_example:
         alt: Web sayfasıında OpenStreetMap atıf etmek için bir örnek
         title: Atıf örneği
+      more_title_html: Daha fazlasını öğrenin
+      more_1_html: |-
+        Verilerimizi kullanma ve bizi nasıl referans verebileceğiniz hakkında daha fazla bilgi için <a
+        href="https://osmfoundation.org/Licence">OSMF Lisans sayfasına</a> bakınız.
+      more_2_html: |-
+        OpenStreetMap açık veri olsa da, üçüncü taraflar
+        için ücretsiz bir harita API'ı sağlayamıyoruz. <a href="https://operations.osmfoundation.org/policies/api/">API Kullanım Politikası</a>,
+        <a href="https://operations.osmfoundation.org/policies/tiles/">Karo Kullanım Politikası</a>
+        ve <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Kullanım Politikası</a> sayfalarımıza bakınız.
       contributors_title_html: Katkıcılarımız
+      contributors_intro_html: |-
+        Binlerce kişi projemize katkıda bulunmaktadır. Ulusal
+        haritalama ajanslarından ve diğer kaynaklardan
+        açık-lisanslı veriler de içeriyoruz:
+      contributors_at_html: |-
+        <strong>Avusturya</strong>: <a href="https://data.wien.gv.at/">Stadt Wien</a> (<a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a> lisansı altında),
+        <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land Vorarlberg</a> ve
+        Land Tirol'dan (<a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">değişiklikleriyle CC BY AT lisansı altında</a>) veriler içermektedir.
+      contributors_ca_html: "<strong>Kanada</strong>: GeoBase&reg;, GeoGratis \n(&copy;
+        Department of Natural\nResources Canada), CanVec (&copy; Department of Natural\nResources
+        Canada) ve StatCan'den (Geography Division,\nStatistics Canada) veriler içermektedir."
+      contributors_fi_html: |-
+        <strong>Finlandiya</strong>: National Land
+        Survey of Finland's Topographic Database
+        ve diğer veri setlerinden, <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI License</a> altında, veriler içermektedir..
+      contributors_fr_html: |-
+        <strong>Fransa</strong>: Direction Générale des Impôts'dan
+        veri içermektedir.
+      contributors_nl_html: |-
+        <strong>Hollanda</strong>: Contains &copy; AND veri, 2007
+        (<a href="https://www.and.com">www.and.com</a>)
+      contributors_nz_html: '<strong>Yeni Zelanda</strong>: Land Information New Zealand''dan
+        edinilen verileri içerir.  Crown Copyright saklıdır.'
+      contributors_si_html: |-
+        <strong>Slovenya</strong>: <a href="http://www.gu.gov.si/en/">Surveying and Mapping Authority</a> ve
+        <a href="http://www.mkgp.gov.si/en/">Ministry of Agriculture, Forestry and Food</a>
+        (Slovenya'nın halka açık bilgileri) sayfalarından
+        edinilen verileri içermektedir.
+      contributors_za_html: |-
+        <strong>Güney Afrika</strong>: <a href="http://www.ngi.gov.za/">Chief Directorate:
+        National Geo-Spatial Information</a> kaynaklı verileri içermektedir, Devlet telif hakkı saklıdır.
+      contributors_gb_html: |-
+        <strong>Birleşik Krallık</strong>: Contains Ordnance
+        Survey data &copy; Crown copyright and database right
+        2010-12.
+      contributors_footer_1_html: |-
+        OpenStreetMap'in geliştirilmesine yardımcı olmak için
+        bu ve diğer kaynaklar hakkında daha ayrıntılı bilgi almak için,
+        OpenStreetMap Wiki üzerinden <a
+        href="https://wiki.openstreetmap.org/wiki/Contributors">Katkıda bulunan kullanıcılar sayfasına</a> lütfen bakınız.
+      contributors_footer_2_html: |-
+        Verilerin OpenStreetMap'e dahil edilmesi, orijinal
+        veri sağlayıcının OpenStreetMap'i onayladığını,
+        herhangi bir garanti verdiğini ya da
+        herhangi bir yükümlülüğü kabul ettiğini ima etmez.
       infringement_title_html: Telif hakkı ihlali
+      infringement_1_html: |-
+        OSM'ye katkıda bulunanların telif hakkı sahiplerinin
+        açık izni olmadan telif hakkıyla korunan kaynaklardan
+        (ör. Google Haritalar veya basılı haritalar) hiçbir zaman
+        veri eklememeleri hatırlatılır.
+      infringement_2_html: |-
+        Telif hakkıyla korunan materyalin
+        OpenStreetMap veritabanına veya bu siteye
+        yanlışlıkla eklendiğine inanıyorsanız <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">kaldırma prosedürü</a> sayfasına başvurun veya
+        doğrudan <a href="https://dmca.openstreetmap.org/">çevrimiçi dosyalama sayfamızda</a> kayda geçirin.
+      trademarks_title_html: <span id="trademarks"></span>Ticari Markalar
+      trademarks_1_html: OpenStreetMap, büyüteç logosu ve State of the Map; OpenStreetMap
+        Foundation'ın tescilli ticari markalarıdır. Markaların kullanımı ile ilgili
+        sorularınız varsa lütfen sorularınızı <a href="https://wiki.osmfoundation.org/wiki/Licensing_Working_Group">Lisans
+        Çalışma Grubu</a>'na gönderiniz
   welcome_page:
     title: Hoş geldiniz!
     introduction_html: Dünyanın düzenlenebilir ve ücretsiz haritası OpenStreetMap'e
@@ -1033,6 +1143,13 @@ tr:
         Bu bir restoranın ismi ya da yolun hız sınırı olabilir.
     rules:
       title: Kuralları!
+      paragraph_1_html: |-
+        OpenStreetMap'in resmi kuralları yoktur ancak tüm katılımcıların
+        toplulukla işbirliği yapmasını ve iletişim kurmasını bekleriz.
+        Elle düzenleme dışında herhangi bir faaliyet düşünüyorsanız,
+        lütfen yönergeleri okuyun ve uygulayın:
+        <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>İçe aktarma</a> ve
+        <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Otomatik Düzenlemeler</a>
     questions:
       title: Sorularınız var mı?
       paragraph_1_html: OpenStreetMap, proje hakkında bilgiler içeren, soru sormak
@@ -1042,60 +1159,118 @@ tr:
     start_mapping: Harita çizmeye başla
     add_a_note:
       title: Düzenlemek için vaktin yok mu? O zaman bir not ekle!
+      paragraph_1_html: |-
+        Küçük bir değişikliğin sabit kalmasını istiyor fakat üye olacak ve
+        nasıl düzenleneceğini öğrenecek zamanınız yoksa
+        not eklemeniz yeterlidir.
+      paragraph_2_html: |-
+        Sadece <a href='%{map_url}'>haritaya</a> gidin ve not simgesine tıklayın:
+        <span class='icon note'></span>. Bu, haritaya sürükleyerek taşıyabileceğiniz bir işaret imleci ekleyecektir.
+        Mesajınızı ekleyin, ardından kaydet'i tıklayın ve diğer
+        haritacılar yaptıklarınızı inceleyecektir.
   fixthemap:
     title: Sorun bildir / Haritayı onar
     how_to_help:
       title: Nasıl yardım edebilirim?
       join_the_community:
         title: Topluluğa katılın
+        explanation_html: |-
+          Harita verilerinde bir sorun fark ettiyseniz, örneğin bir yol veya adresinizin eksik olması gibi,
+          devam etmenin en iyi yolu OpenStreetMap topluluğuna katılmak ve verileri kendiniz eklemeniz veya düzeltmenizdir.
       add_a_note:
         instructions_html: |-
           Sadece <a class='icon note'></a> ikonuna tıklayın veya harita görünümü üzerinde aynı ikona tıklayın.
           Bu haritaya daha sonra sürükleyerek taşıyabileceğiniz bir işaretleyici ekleyecek. Mesajınızı ekleyin ve kaydedin, diğer haritacılar bunu araştıracaklar.
     other_concerns:
       title: Diğer sorunlar
+      explanation_html: Verilerimizin nasıl kullanıldığı veya içeriği hakkında endişeleriniz
+        varsa lütfen daha fazla yasal bilgi için <a href='/copyright'>telif hakkı
+        sayfamıza</a> başvurun veya ilgili <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF
+        çalışma grubuyla</a> iletişime geçin.
   help_page:
     title: Yardım Almak
+    introduction: |-
+      OpenStreetMap, proje hakkında bilgilenmek, soru sormak ve
+      soruları cevaplamak
+      ve haritalama konularını ortaklaşa tartışmak ve belgelemek için çeşitli kaynaklara sahiptir.
     welcome:
       url: /hoşgeldiniz
       title: OSM'ye hoşgeldin!
       description: OpenStreetMap temellerini öğrenmek için kısa bir kılavuz ile başla.
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Tr:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Tr:Beginners%27_guide
       title: Yeni Başlayanlar Kılavuzu
+      description: Topluluk, yeni başlayanlar için rehberlik yapmaktadır.
     help:
       url: https://help.openstreetmap.org/
       title: help.openstreetmap.org
       description: Bir soru sor veya OSM'ın soru-ve-cevap sitesinde yanıtları ara.
     mailing_lists:
       title: E-Posta Listeleri
+      description: Oldukça geniş yerel veya bölgesel e-posta listelerinde soru sorabilir
+        veya ilginç konuları tartışabilirsiniz.
     forums:
       title: Forumlar
+      description: Duyuru panosu tarzındaki arayüzleri tercih edenler için sorular
+        ve tartışmalar.
     irc:
       title: IRC
+      description: Birçok dilde ve birçok konuda interaktif sohbet.
     switch2osm:
       title: switch2osm
+      description: OpenStreetMap tabanlı haritalara ve diğer hizmetlere geçiş yapan
+        şirketler ve kuruluşlar için yardım.
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
+      description: Ayrıntılı OSM belgeleri için wiki'ye göz atın.
   about_page:
     next: İleri
     copyright_html: <span>&copy;</span>OpenStreetMap<br>katkıda bulunanları
+    used_by: '%{name}, binlerce web sitesinde, mobil uygulamalarda ve donanım cihazlarında
+      verileri eşleştirir.'
+    lede_text: OpenStreetMap; tüm dünyada yollar, yollar, kafeler, tren istasyonları
+      ve daha pek çok şey hakkında veri sağlayan ve koruyan bir haritalar topluluğu
+      tarafından oluşturulmuştur.
     local_knowledge_title: Yerel Bilgi
+    local_knowledge_html: |-
+      OpenStreetMap, piyasa bilgisi üzerinde durmaktadır. Katkıda bulunanlar,
+      OSM'nin doğru ve güncel olduğunu doğrulamak için havadan görüntüler, GPS cihazları ve düşük teknoloji alan haritaları kullanmaktadır.
     community_driven_title: Katılım Kaynaklı
+    community_driven_html: |-
+      OpenStreetMap'ın topluluğu çeşitli ve tutkuludur ayrıca her geçen gün büyümektedir.
+      Katkıda bulunanların arasında hevesli haritacılar, CBS uzmanları, OSM sunucularını çalıştıran mühendisler, felaketten etkilenen alanlar için haritalama yapan yardımsever kişiler
+      ve çok daha fazlası yer alıyor.
+      Çok daha fazlası için
+      <a href='https://blog.openstreetmap.org'>OpenStreetMap Blog</a>,
+      <a href='%{diary_path}'>kullanıcı günlükleri</a>,
+      <a href='https://blogs.openstreetmap.org/'>topluluk blogları</a>, ve
+      <a href='https://www.osmfoundation.org/'>OSM Foundation</a> websitesine bakınız.
     open_data_title: Açık Veri
+    open_data_html: |-
+      OpenStreetMap, <i>açık veri</i>dir: OpenStreetMap ve katkıda bulunan
+      kişilere referans verdiğiniz sürece OpenStreetMap herhangi bir amaç için kullanabilirsiniz.
+      Verileri belirli şekillerde değiştirir veya üzerine inşa ederseniz  sonucu sadece aynı lisansla dağıtabilirsiniz. Detaylı bilgi için <a href='%{copyright_path}'>Telif hakkı ve
+      Lisans sayfasına</a> göz atınız.
     legal_title: Yasal
+    legal_html: |-
+      Bu site ve diğer pek çok ilgili hizmet resmi olarak <a href='https://osmfoundation.org/'>OpenStreetMap Vakfı</a> (OSMF) tarafından topluluk adına işletilmektedir. OSMF tarafından işletilen tüm servislerin kullanımı <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Kabul Edilebilir Kullanım Politikaları</a> ve <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Gizlilik Politikamızın</a> konusudur.
+      Lisanslama, telif hakkı veya diğer yasal sorularınız ve sorunlarınız varsa lütfen <a href='https://osmfoundation.org/Contact'>OSMF ile iletişime geçin</a>.
     partners_title: Ortaklar
   notifier:
     diary_comment_notification:
-      subject: '[OpenStreetMap] günlük kayıdın %{user} tarafından yorumlandı'
+      subject: '[OpenStreetMap] %{user}, günlük bir girdi hakkında yorum yaptı.'
       hi: Merhaba %{to_user},
-      header: '%{from_user} senin %{subject} konulu OpenStreetMap günlüğü girdisi
-        yorumladı:'
+      header: '%{from_user}, %{subject} konulu OpenStreetMap günlük girdisi hakkında
+        yorum yaptı.'
+      footer: Yorumu ayrıca %{readurl} sayfasında okuyabilir ve %{commenturl} bağlantısıyla
+        yorum yapabilir veya %{replyurl} ile cevap verebilirsiniz.
     message_notification:
       hi: Merhaba %{to_user},
       header: 'OpenStreetMap kullanıcı %{from_user} sana %{subject} konulu bir mesaj
         gönderdi:'
+      footer_html: Mesajı ayrıca %{readurl} bağlantısıyla okuyabilir ve %{replyurl}
+        ile cevap yazabilirsiniz.
     friend_notification:
       hi: Merhaba %{to_user},
       subject: '[OpenStreetMap] kullanıcı %{user} seni arkadaş olarak ekledi'
@@ -1104,17 +1279,27 @@ tr:
       befriend_them: '%{befriendurl} üzerinden arkadaş olarak da ekleyebilirsiniz.'
     gpx_notification:
       greeting: Merhaba,
+      your_gpx_file: GPX dosyanıza benziyor
       with_description: açıklamayla beraber
+      and_the_tags: 've etiketleri:'
       and_no_tags: ve etiket yok.
       failure:
         subject: '[OpenStreetMap] GPX dosyası maalesef alınamadı'
         failed_to_import: 'GPX dosyası alınamadı. Hata bu:'
+        more_info_1: GPX alma hataları ve bu hatalardan kaçınma hakkında daha fazla
+          bilgiyi
+        more_info_2: 'şu adresten edinebilirsiniz:'
       success:
         subject: '[OpenStreetMap] GPX dosyası başarıyla alındı'
+        loaded_successfully: Olası bir %{possible_points} noktalarından %{trace_points}
+          ile başarıyla yüklendi.
     signup_confirm:
       subject: '[OpenStreetMap]''e hoşgeldin'
       greeting: Merhaba!
       created: Birisi (umarım sen) %{site_url} sitesinde yeni bir hesap açtı.
+      confirm: 'Başka bir şey yapmadan önce bu isteğin sizden geldiğini doğrulamamız
+        gerekiyor, bu nedenle lütfen hesabınızı onaylamak için aşağıdaki bağlantıyı
+        tıklayın:'
       welcome: Hesabınızı doğruladıktan sonra size, başlamanız için gereken bazı ek
         bilgiler vereceğiz.
     email_confirm:
@@ -1171,21 +1356,44 @@ tr:
           etkinleştirdi'
         your_note: '%{commenter}, %{place} yakınlarındaki harita notlarınızdan birini
           yeniden etkinleştirdi.'
+        commented_note: '%{commenter}, yorumladığınız bir harita notunu yeniden etkinleştirdi.
+          Not, %{place} yakınlarında yer almakta.'
       details: Not hakkındaki ayrıntılı bilgiler %{url} bağlantısında görülebilir.
     changeset_comment_notification:
       hi: Merhaba %{to_user},
       greeting: Merhaba,
       commented:
+        subject_own: '[OpenStreetMap] %{commenter}, sizin değişiklik serilerinizden
+          birine yorum yaptı.'
+        subject_other: '[OpenStreetMap] %{commenter}, ilgilendiğiniz bir değişiklik
+          hakkında yorum yaptı.'
+        your_changeset: '%{commenter}, %{time} tarihinde oluşturduğunuz değişikliklerinizden
+          birine yorum yaptı.'
+        commented_changeset: '%{commenter}, takip etmiş olduğunuz %{changeset_author}
+          tarafından %{time} tarihinde oluşturulan harita değişiklik serisine yorum
+          yaptı.'
+        partial_changeset_with_comment: '''%{changeset_comment}'' yorumuyla'
         partial_changeset_without_comment: yorumsuz
+      details: Değişiklik serisiyle ilgili daha fazla bilgi %{url} sayfasından edinebilirsiniz.
+      unsubscribe: Bu değişiklik serisinin güncellemelerini aboneliğinizden çıkarmak
+        için %{url} sayfasını ziyaret edin ve "Aboneliği iptal et"i tıklayın.
   message:
     inbox:
       title: Gelen Kutusu
       my_inbox: Gelen kutusu
       outbox: Gönderilmiş kutusu
       messages: '%{new_messages} yeni ve %{old_messages} eski mesaj var'
+      new_messages:
+        one: '%{count} yeni mesaj'
+        other: '%{count} yeni mesaj'
+      old_messages:
+        one: '%{count} eski mesaj'
+        other: '%{count} eski mesaj'
       from: Gönderen
       subject: Konu
       date: Tarih
+      no_messages_yet: 'Henüz mesajınız yok. Yakındaki insanlarla iletişime geçmeye
+        ne dersiniz? Deneyin: %{people_mapping_nearby_link}'
       people_mapping_nearby: yakın çevredeki haritacılar
     message_summary:
       unread_button: Okunmadı olarak işaretle
@@ -1211,10 +1419,19 @@ tr:
       my_inbox: Benim %{inbox_link}
       inbox: gelen kutusu
       outbox: gönderilmiş kutusu
+      messages:
+        one: '%{count} mesaj gönderdiniz'
+        other: ' %{count} mesaj gönderdiniz'
       to: Alıcı
       subject: Konu
       date: Tarih
+      no_sent_messages: 'Henüz kimseye mesaj göndermediniz. Yakındaki insanlarla iletişime
+        geçmeye ne dersiniz? Deneyin: %{people_mapping_nearby_link}'
       people_mapping_nearby: yakın çevredeki haritacılar
+    reply:
+      wrong_user: '`%{user}'' olarak oturum açtınız fakat yanıtlamasını istediğiniz
+        mesaj kullanıcıya gönderilmedi. Yanıtlamak için lütfen doğru kullanıcı olarak
+        giriş yapınız.'
     read:
       title: Mesaj oku
       from: Gönderen
@@ -1225,6 +1442,9 @@ tr:
       delete_button: Sil
       back: Geri
       to: Alıcı
+      wrong_user: '`%{user}'' olarak oturum açtınız fakat okuman istenilen mesaj,
+        o kullanıcı tarafından gönderilmedi. Lütfen okumak için doğru kullanıcı olarak
+        giriş yapın.'
     sent_message_summary:
       delete_button: Sil
     mark:
@@ -1245,8 +1465,22 @@ tr:
       remote_failed: Düzenleme başarısız - JOSM veya Merkaartor'un yüklendiğinden
         ve uzaktan kontrol seçeneğinin etkinleştirildiğinden emin olun.
     edit:
+      not_public: Düzenlemelerinizi herkese açık olacak şekilde ayarlamadınız.
+      not_public_description: Siz bunu yapmadıkça haritayı artık düzenleyemezsiniz.
+        Düzenlemelerinizi, %{user_page} sayfasından herkese açık olarak ayarlayabilirsiniz
       user_page_link: kullanıcı sayfası
       anon_edits: (%{link})
+      anon_edits_link_text: Durumun neden böyle olduğunu öğrenin.
+      flash_player_required: OpenStreetMap Flash düzenleyicisi Potlatch'ı kullanmak
+        için bir Flash oynatıcıya ihtiyacınız var. <a href="https://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Adobe.com'dan
+        Flash Player yükleyebilirsiniz</a>. OpenStreetMap'i düzenlemek için başka
+        <a href="https://wiki.openstreetmap.org/wiki/Editing">birçok seçenek</a> de
+        mevcuttur.
+      potlatch_unsaved_changes: Kaydedilmemiş değişiklikleriniz mevcut. (Potlatch'te
+        kaydetmek için canlı modda düzenleme yapıyorsanız geçerli yolu veya noktayı
+        seçmeniz veya bir kaydetme düğmeniz varsa kaydet'i tıklamanız gerekir.)
+      potlatch2_not_configured: 'Potlatch 2 yapılandırılmadı - daha fazla bilgi için
+        lütfen bakınız: https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2'
       potlatch2_unsaved_changes: Kaydedilmemiş değişiklikleriniz var. (Potlatch 2'de
         kaydetmek için kaydet'e tıklamalısınız.)
       id_not_configured: iD yapılandırılmamış
@@ -1258,13 +1492,17 @@ tr:
     search:
       search: Ara
       get_directions: Yol tarifi al
-      where_am_i: Ben neredeyim?
+      get_directions_title: İki nokta arasında yol tarifi bul
+      from: Şuradan
+      to: Şuraya
+      where_am_i: Bu nerede?
       where_am_i_title: Arama motoru kullanarak geçerli konumunu tanımlar
       submit_text: Git
     key:
       table:
         entry:
           motorway: Otoyol
+          main_road: Ana yol
           trunk: Bölünmüş anayol
           primary: Devlet Yolu
           secondary: İl yolu
@@ -1272,6 +1510,9 @@ tr:
           track: Toprak yolu
           bridleway: Binici yolu
           cycleway: Bisiklet yolu
+          cycleway_national: Ulusal Bisiklet Yolu
+          cycleway_regional: Bölgesel Bisiklet Yolu
+          cycleway_local: Yerel Bisiklet Yolu
           footway: Yaya yolu
           rail: Demiryolu
           subway: Metro
@@ -1323,7 +1564,7 @@ tr:
           bridge: Siyah kenar = köprü
           private: Özel giriş
           destination: Hedef noktası
-          construction: yapım aşamasında yolu
+          construction: yapım aşamasındaki yollar
           bicycle_shop: Bisikletçi
           bicycle_parking: Bisiklet parkı
           toilets: Tuvaletler
@@ -1331,8 +1572,11 @@ tr:
       edit: Düzenle
       preview: Ön izle
     markdown_help:
+      title_html: <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
+        ile çözümlendi
       headings: Başlıklar
       heading: Başlık
+      subheading: Alt başlık
       unordered: Sırasız liste
       ordered: Sıralı liste
       first: İlk öğe
@@ -1340,6 +1584,7 @@ tr:
       link: Bağlantı
       text: Metin
       image: Görsel
+      alt: Alt metin
       url: URL
   trace:
     visibility:
@@ -1384,6 +1629,11 @@ tr:
       upload_trace: GPS izi gönder
       see_all_traces: Tüm izleri görüntüle
       see_your_traces: Bütün kendi izlerini görüntüle
+      traces_waiting:
+        one: Yüklemeyi bekleyen %{count} iz var. Diğer kullanıcıların kuyruklarını
+          engellememek için lütfen bunları yüklemeden önce öncekilerin bitmesini bekleyin.
+        other: Yüklemeyi bekleyen %{count} iz var. Diğer kullanıcıların kuyruklarını
+          engellememek için lütfen bunları yüklemeden önce öncekilerin bitmesini bekleyin.
     trace_optionals:
       tags: Etiketler
     view:
@@ -1431,46 +1681,134 @@ tr:
       public_traces_from: '%{user} tarafından gelen herkese açık GPS izleri'
       description: Son GPS izi güncellemelerine göz at
       tagged_with: ' %{tags} ile etiketlendi'
+      empty_html: Burada henüz bir şey yok. <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>Wiki
+        sayfasında</a> <a href='%{upload_link}'>yeni bir iz yükle</a> veya GPS iz
+        hakkında daha fazla bilgi edinin
+    delete:
+      scheduled_for_deletion: İz, silme işlemi için ayarlandı
     make_public:
       made_public: Iz herkese açık
     offline_warning:
       message: GPX dosya gönderme sistemi şu anda kullanılamıyor
     offline:
       heading: GPX Yükleme Servisi Çevrimdışı
+      message: GPX dosya depolama ve yükleme sistemi şu anda kullanılamıyor.
     georss:
       title: OpenStreetMap GPS İzleri
+    description:
+      description_with_count:
+        one: '%{user} tarafından %{count} noktalı GPX dosyası'
+        other: '%{user} tarafından %{count} noktalı GPX dosyası'
+      description_without_count: '%{user} tarafından GPX dosyası'
   application:
+    require_cookies:
+      cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden
+        önce lütfen tarayıcınızda çerezleri etkinleştirin.
     require_moderator:
       not_a_moderator: Bu eylemi gerçekleştirebilmek için moderatör olmalısınız.
+    setup_user_auth:
+      blocked_zero_hour: OpenStreetMap web sitesinde önemli bir mesajınız var. Düzenlemelerinizi
+        kaydetmeden önce mesajı okumanız gerekiyor.
+      blocked: API'a erişiminiz engellendi. Daha fazla bilgi edinmek için lütfen web
+        arayüzüne giriş yapın.
+      need_to_see_terms: API'a erişiminiz geçici olarak askıya alındı. Katılımcı Şartları'nı
+        görüntülemek için lütfen web arayüzüne giriş yapın. Kabul etmeniz gerekmiyor
+        ancak bunları görmeniz gerekiyor.
   oauth:
+    oauthorize:
+      title: Hesabınıza erişimi yetkilendirin
+      request_access: '%{app_name} uygulaması hesabınıza, %{user}, erişim izni istiyor.
+        Lütfen uygulamanın aşağıdaki özelliklere sahip olmasını isteyip istemediğinizi
+        kontrol edin. İstediğiniz kadar veya az sayıda seçebilirsiniz.'
+      allow_to: 'İstemci uygulamanın aşağıdakilere izin vermesini sağlayın:'
+      allow_read_prefs: kullanıcı tercihlerinizi okuma.
+      allow_write_prefs: kullanıcı tercihlerinizi değiştirme.
+      allow_write_diary: günlük girdiler, yorumlar ve arkadaşlıklar oluşturma.
+      allow_write_api: haritayı değiştirme.
+      allow_read_gpx: özel GPS izlerini okuma.
+      allow_write_gpx: GPS izlerini yükleme.
+      allow_write_notes: notları değiştirme.
+      grant_access: Erişim izni ver
     oauthorize_success:
+      title: Erişim isteğine izin verildi
+      allowed: '%{app_name} uygulamasının hesabınıza erişimine izin verdiniz.'
       verification: Doğrulama kodu %{code}.
     oauthorize_failure:
       title: Yetkilendirme isteği başarısız oldu
       denied: '%{app_name} uygulamasının hesabınıza erişmesini engellediniz.'
+      invalid: Yetkilendirme özelliği geçerli değil.
+    revoke:
+      flash: Özelliği %{application} için iptal ettiniz
+    permissions:
+      missing: Uygulamanın bu özelliğe erişimine izin vermediniz
   oauth_clients:
     new:
+      title: Yeni bir uygulama kaydedin
       submit: Kayıt ol
     edit:
+      title: Uygulamanızı düzenleyin
       submit: Düzenle
     show:
+      title: '%{app_name} için OAuth ayrıntıları'
+      key: 'Tüketici anahtarı:'
+      secret: 'Tüketici mahremiyeti:'
+      url: 'İstek Bağlantısı:'
+      access_url: 'Erişim Noktası Bağlantısı:'
+      authorize_url: 'Yetkilendirme Bağlantısı:'
+      support_notice: HMAC-SHA1 (önerilen) ve RSA-SHA1 imzalarını destekliyoruz.
       edit: Ayrıntıları Düzenle
       delete: İstemci Sil
       confirm: Emin misiniz?
+      requests: 'Kullanıcıdan istenen izinler şöyledir:'
+      allow_read_prefs: kullanıcı tercihleri okuma.
+      allow_write_prefs: kullanıcı tercihleri değiştirme.
+      allow_write_diary: günlük girdiler, yorumlar ve arkadaşlıklar oluşturma.
+      allow_write_api: haritayı değiştirme.
+      allow_read_gpx: özel GPS izlerini okuma.
+      allow_write_gpx: GPS izlerini yükleme.
+      allow_write_notes: notları değiştirme.
     index:
       title: OAuth Ayrıntılarım
+      my_tokens: Yetkilendirdiğim Uygulamalarım
+      list_tokens: 'Adınızdaki uygulamalara aşağıdaki özellikler verildi:'
+      application: Uygulama Adı
+      issued_at: Yayınlanan
       revoke: İptal!
       my_apps: Benim istemci uygulamalarım
+      no_apps: '%{oauth} standardını kullanarak bizimle birlikte kullanmak için kayıt
+        yaptırmak istediğiniz bir uygulama var mı? Bu hizmete OAuth''dan istekte bulunmadan
+        önce web uygulamanızı kaydettirmeniz gerekir.'
+      registered_apps: 'Aşağıdaki istemci uygulamalarını kaydettiniz:'
+      register_new: Uygulamanızı kaydedin
     form:
       name: Isim
       required: Gerekli
+      url: Ana Uygulama Bağlantısı
+      callback_url: Geri Arama Bağlantısı
+      support_url: Destek Bağlantısı
+      requests: 'Kullanıcıdan istenen izinler şöyledir:'
+      allow_read_prefs: kullanıcı tercihlerini okuma.
+      allow_write_prefs: kullanıcı tercihlerini değiştirme.
+      allow_write_diary: günlük girdiler, yorumlar ve arkadaşlıklar oluşturma.
       allow_write_api: haritayı düzenle.
+      allow_read_gpx: özel GPS izlerini okuma.
+      allow_write_gpx: GPS izlerini yükleme.
+      allow_write_notes: notları değiştirme.
+    not_found:
+      sorry: Üzgünüz, bu %{type} bulunamadı.
+    create:
+      flash: Bilgileri başarıyla kaydettirdiniz
+    update:
+      flash: Müşteri bilgilerini başarıyla güncelleştirildi
+    destroy:
+      flash: İstemci uygulaması kaydını yok etti
   user:
     login:
       title: Giriş
       heading: Giriş
       email or username: 'E-posta Adresi veya Kullanıcı Adı:'
       password: 'Parola:'
+      openid: '%{logo} OpenID:'
       remember: 'Beni hatırla:'
       lost password link: Parolanızı mı kaybettiniz?
       login_button: Gir
@@ -1487,15 +1825,38 @@ tr:
       account not active: Üzgünüz, hesabınız henüz aktif değil.<br />Lütfen aldığın
         onaylama e-postasında ki bağlantı tıkla veya <a href="%{reconfirm}">yeni bir
         onaylama e-posta</a> iste.
+      account is suspended: Üzgünüz, hesabınız şüpheli etkinlikler nedeniyle askıya
+        alındı.<br />Bu konu için lütfen <a href="%{webmaster}">webmaster'a</a> başvurun.
       auth failure: Üzgünüz, bu giriş ile oturum açılamadı.
       openid_logo_alt: OpenID ile giriş
       auth_providers:
+        openid:
+          title: OpenID ile giriş
+          alt: OpenID Bağlantısı ile giriş
         google:
           title: Google ile oturum aç
+          alt: Google OpenID ile giriş
+        facebook:
+          title: Facebook ile giriş
+          alt: Facebook Hesabı ile giriş
+        windowslive:
+          title: Windows Live ile giriş
+          alt: Windows Live Hesabı ile giriş
+        github:
+          title: GitHub ile giriş
+          alt: GitHub Hesabı ile giriş
+        wikipedia:
+          title: Vikipedi ile giriş
+          alt: Vikipedi Hesabı ile giriş
         yahoo:
           title: Yahoo ile oturum aç
+          alt: Yahoo OpenID ile giriş
         wordpress:
           title: Wordpress ile oturum aç
+          alt: Wordpress OpenID ile giriş
+        aol:
+          title: AOL ile giriş
+          alt: AOL OpenID ile giriş
     logout:
       title: Çıkış
       heading: OpenStreetMap'den çıkış
@@ -1505,6 +1866,10 @@ tr:
       heading: Parolanızı mı Unuttunuz?
       email address: 'E-posta Adresi:'
       new password button: Parolayı sıfırla
+      help_text: Kaydolmak için kullandığınız e-posta adresini girin, şifrenizi sıfırlamak
+        için kullanabileceğiniz bir bağlantı yollayacağız.
+      notice email on way: Maalesef onu kaybettiniz :-( Ancak yeni bir e-posta yolda.
+        Dolayısıyla yakında sıfırlayabilirsiniz.
       notice email cannot find: 'Üzgünüz: bu e-posta adresi bulunamadı.'
     reset_password:
       title: Parolayı sıfırla
@@ -1513,27 +1878,39 @@ tr:
       confirm password: 'Sifre Onayla:'
       reset: Parolayı Sıfırla
       flash changed: Parolanız değiştirildi.
+      flash token bad: Bu simgeyi bulamadıysanız belki de bağlantıyı kontrol etmelisiniz?
     new:
       title: Hesap oluştur
+      no_auto_account_create: Maalesef sizin için otomatik olarak bir hesap oluşturamıyoruz.
+      contact_webmaster: Oluşturmak istediğiniz hesap için lütfen <a href="%{webmaster}">webmaster</a>
+        ile iletişime geçin - isteğinizi en kısa sürede çözmeye çalışacağız.
       about:
         header: Ücretsiz ve düzenlenebilir
         html: |-
           <p>Diğer haritaların aksine, OpenStreetMap tamamıyla sizin gibi insanlar tarafından oluşturulur ve düzeltme, güncelleme, indirme ve kullanma herkes için ücretsizdir.</p>
           <p>Katkıda bulunmaya başlamak için kayıt olun. Hesabınızın onaylanması için size bir e-posta göndereceğiz.</p>
+      license_agreement: Hesabınızı onayladığınızda <a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">katkıda
+        bulunan kullanıcı şartlarını</a> kabul etmeniz gerekecek.
       email address: 'E-posta Adresi:'
       confirm email address: E-posta Adresini Onayla
-      not displayed publicly: Herkes tarafından görüntülenemez (bkz. <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
-        title="e-posta adresleri bölümünü de içinde bulunduran viki gizlilik politikası">gizlilik
-        politikası</a>)
+      not displayed publicly: Adresiniz herkese açık olarak gösterilmiyor, daha fazla
+        bilgi için <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
+        privacy policy including section on email addresses">gizlilik politikamıza</a>
+        bakınız.
       display name: 'Görünen Ad:'
       display name description: Herkes tarafından görünen ad. Bu adı istediği zaman
         'tercihlerim' bölümünde değiştirebilirsin.
+      external auth: 'Üçüncü Taraf Kimlik Doğrulaması:'
       password: 'Parola:'
       confirm password: 'Parolayı Onaylayın:'
       use external auth: 'Alternatif olarak, bir üçüncü parti uygulaması kullanarak
         oturum açın:'
+      auth no password: Üçüncü taraf kimlik doğrulamasında bir parola gerekli değildir,
+        ancak bazı ek araçlar veya sunucu için yine de bir parola gerekebilir.
       continue: Kaydol
       terms accepted: Yeni katılımcı şartları kabul ettiğin için teşekkür ederiz!
+      terms declined: Yeni Katılımcı Koşulları kabul etmediğiniz için üzgünüz. Daha
+        fazla bilgi için lütfen <a href="%{url}">buradaki wiki sayfasına</a> bakınız.
     terms:
       title: Katılımcı Şartları
       heading: Katılımcı Şartları
@@ -1593,6 +1970,8 @@ tr:
       spam score: 'Spam puanı:'
       description: Açıklama
       user location: Kullanıcının konumu
+      if set location: Yakındaki kullanıcıları görmek için %{settings_link} sayfasında
+        ev konumunuzu belirleyin.
       settings_link_text: ayarları
       your friends: Arkadaş listesi
       no friends: Henüz herhangi bir arkadaş eklemediniz.
@@ -1613,12 +1992,12 @@ tr:
       moderator_history: Verilen Engellemeler
       comments: Yorumlar
       create_block: Bu Kullanıcıyı engelle
-      activate_user: Bu kullanıcıyı etkinleştir
-      deactivate_user: bu kullanıcıyı pasifleştir
-      confirm_user: bu kullanıcıyı onayla
-      hide_user: bu kullanıcı gizle
-      unhide_user: kullanıcının gizlenmesini kaldır
-      delete_user: bu kullanıcıyı sil
+      activate_user: Bu Kullanıcıyı Etkinleştir
+      deactivate_user: Bu Kullanıcıyı Devre Dışı Bırak
+      confirm_user: Bu Kullanıcıyı Onaylayın
+      hide_user: Bu Kullanıcıyı Gizle
+      unhide_user: Bu Kullanıcıyı Göster
+      delete_user: Bu Kullanıcıyı Sil
       confirm: Onayla
       friends_changesets: arkadaşların değişiklik kayıtları
       friends_diaries: arkadaşların günlük girdileri
@@ -1634,23 +2013,34 @@ tr:
       current email address: 'Geçerli E-posta Adresi:'
       new email address: 'Yeni E-posta Adresi:'
       email never displayed publicly: (hiçbir zaman görüntülenmez)
+      external auth: 'Harici Kimlik Doğrulama:'
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: Bu nedir?
       public editing:
         heading: 'Herkese açık düzenleme modu:'
         enabled: Etkin. Anonim değil ve verileri düzenleyebilir.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Bu nedir?
         disabled: Devre dışı ve verileri düzenleyemez; önceki düzenlemeleri hepsi
           anonimdir.
         disabled link text: neden düzenleyemiyorum?
       public editing note:
         heading: Herkese açık düzenleme modu
+        text: Şu anda yaptığınız düzenlemeler anonimdir bundan ötürü kullanıcılar
+          size mesaj gönderemez veya konumunuzu göremez. Düzenlemelerinizi görünür
+          kılmak ve site üzerinden sizinle iletişime geçilmesine izin vermek için
+          aşağıdaki butona tıklayın. <b>0.6 API'a geçişten beri yalnızca herkese açık
+          kullanıcılar harita verilerini düzenleyebilmektedir</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">sebebini
+          öğren</a>). <ul><li>E-posta adresiniz herkese açık hale getirilmez.</li><li>Bu
+          işlem tersine çevrilemez ve tüm yeni kullanıcılar artık varsayılan olarak
+          herkese açık olarak gösterilmektedir.</li></ul>
       contributor terms:
         heading: 'Katılımcı Şartları:'
         agreed: Yeni katılımcı şartları kabul ettin.
         not yet agreed: Yeni katılımcı şartları kabul etmedin.
+        review link text: Yeni Katkıda Bulunma Şartlarını incelemek ve kabul etmek
+          için lütfen bu bağlantıyı kolaylık sağlamak için izleyin.
         agreed_with_pd: Ayrıca düzenlediklerin Kamu Malı olsun diye kabul ettin.
         link text: Bu nedir?
       profile description: 'Tanıtım:'
@@ -1660,6 +2050,8 @@ tr:
       gravatar:
         gravatar: Gravatar kullanın
         link text: bu nedir?
+        disabled: Gravatar devre dışı bırakıldı.
+        enabled: Gravatarınızın görüntüsü etkinleştirildi.
       new image: Resim ekle
       keep image: Geçerli resim dursun
       delete image: Geçerli resim kaldır
@@ -1682,43 +2074,144 @@ tr:
       introduction_1: Size bir doğrulama e-postası gönderdik.
       introduction_2: E-postadaki bağlantıya tıklayarak hesabınızı doğrulayın ve daha
         sonra haritalama yapmanız mümkün olacak.
+      press confirm button: Hesabınızı etkinleştirmek için aşağıdaki onaylama butonuna
+        basın.
       button: Onayla
       success: Hesabın onaylandı, teşekkür ve iyi çalışmalar!<br /><br /><a href="http://wiki.openstreetmap.org/wiki/Tr:Main_Page">Hoşgeldin
         sayfasında</a> Türkiye'deki harita durumu konusunda bilgi alabilirsin.
+      already active: Bu hesap zaten doğrulandı.
+      unknown token: Onay kodu geçerliliğini yitirmiş veya mevcut değil.
       reconfirm_html: Doğrulama e-postasının tekrar gönderimi için bize ihtiyacınız
         varsa, <a href="%{reconfirm}">buraya tıklayın</a>.
     confirm_resend:
-      success: Yeni bir onay mesajı %{email} adresine gönderdik. Mesajı onaylar onaylamaz
-        haritacılığı başlayabilirsiniz.<br><br>Eğer onaylama mesajını almadısanız
-        e-postanızın Antispam/Junk/İstenmeyen klasörüne lütfen kontrol ediniz.
+      success: '%{email} hesabınıza yeni bir bilgilendirme notu gönderdik ve hesabınızı
+        onaylar onaylamaz harita yapımına başlayabileceksiniz.<br /><br />Onay isteği
+        gönderen bir anti-spam sistemi kullanırsanız onay isteklerine cevap veremediğimizden
+        lütfen kabul edilen adresler listesinde %{sender} olduğundan emin olunuz.'
       failure: '%{name} kullanıcısı bulunamadı.'
     confirm_email:
+      heading: E-posta adresinde değişikliği onayla
+      press confirm button: Yeni e-posta adresinizi onaylamak için aşağıdaki onay
+        butonuna basınız.
       button: Onayla
-      success: E-posta adresinizi doğrulandı, kaydolduğu için teşekkür ederiz! İyi
-        çalışmaları dileriz!
+      success: E-posta adresinizdeki değişikliğiniz onaylandı!
+      failure: Bu özellikle ile bir e-posta adresi zaten doğrulandı.
+      unknown_token: Onay kodu geçerliliğini yitirmiş veya mevcut değil.
     set_home:
       flash success: Ev konumu başarıyla kaydedildi
+    go_public:
+      flash success: Tüm düzenlemeleriniz şimdi herkese açık ve siz de düzenleme yetkisine
+        sahipsiniz.
     make_friend:
+      heading: '%{user} adlı kullanıcı arkadaş olarak eklensin mi?'
+      button: Arkadaş olarak ekle
       success: '%{name} arkadaş listesinde eklendi.'
+      failed: Üzgünüz, %{name} adlı kullanıcı arkadaş olarak eklenemedi.
+      already_a_friend: '%{name} ile zaten arkadaşsın.'
     remove_friend:
+      heading: '%{user} adlı kullanıcı arkadaşlıktan çıkarılsın mı?'
+      button: Arkadaşlıktan Çıkar
       success: '%{name} arkadaş listesinden çıkarıldı.'
+      not_a_friend: '%{name}, arkadaşın değil.'
+    filter:
+      not_an_administrator: Bu eylemi gerçekleştirebilmek için bir yönetici olmanız
+        gerekiyor.
     list:
       title: Kullanıcılar
       heading: Kullanıcılar
       showing:
         one: Sayfa %{page} (%{first_item} - toplam %{items})
         other: Sayfa %{page} (%{first_item}-%{last_item} - toplam %{items})
+      summary: '%{name}, %{date} tarihinde %{ip_address} tarafından oluşturuldu.'
       summary_no_ip: '%{name} %{date} tarihinde oluşturuldu.'
+      confirm: Seçili Kullanıcıları Doğrulayın
+      hide: Seçilen Kullanıcıları Gizle
+      empty: Eşleşen kullanıcı bulunamadı
     suspended:
       title: Hesap Askıda
       heading: Hesap Askıda
       webmaster: site yönetici
+      body: "<p>\n  Maalesef, hesabınız şüpheli etkinlikler nedeniyle otomatik olarak
+        \n  askıya alındı.\n</p>\n<p>\n  Bu karar kısa bir süre içinde bir yönetici
+        tarafından \n  incelenecek veya\n  bunu tartışmak isterseniz %{webmaster}
+        ile iletişime\n  geçebilirsiniz.\n</p>"
+    auth_failure:
+      connection_failed: Kimlik doğrulama sağlayıcısına bağlantı başarısız oldu
+      invalid_credentials: Geçersiz kimlik doğrulama bilgileri
+      no_authorization_code: Yetki kodu yok
+      unknown_signature_algorithm: Bilinmeyen imza algoritması
+      invalid_scope: Geçersiz kapsam
+    auth_association:
+      heading: Kimliğiniz henüz bir OpenStreetMap hesabıyla ilişkili değil.
+      option_1: OpenStreetMap'te yeniyseniz, lütfen aşağıdaki formu kullanarak yeni
+        bir hesap açın.
+      option_2: Hâlihazırda bir hesabınız varsa kullanıcı adınız ve şifrenizi kullanarak
+        hesabınıza giriş yapabilir ve ardından hesaplarınızı kullanıcı ayarlarınızda
+        kimliğinizle ilişkilendirebilirsiniz.
   user_role:
+    filter:
+      not_an_administrator: Yalnızca yöneticiler, kullanıcı rolü yönetimini gerçekleştirebilir
+        ve siz bir yönetici değilsiniz.
+      not_a_role: Dizgi %{role}, geçerli bir görev değil.
+      already_has_role: Kullanıcı zaten %{role} görevine sahip.
+      doesnt_have_role: Kullanıcının görevi %{role} değil.
+      not_revoke_admin_current_user: Geçerli kullanıcıdan yönetici görevini iptal
+        edemezsiniz.
     grant:
+      title: Verilen görevi onayla
+      heading: Verilen görevi onayla
+      are_you_sure: '%{role} görevini %{name} kullanıcısına vermek istediğinize emin
+        misiniz?'
       confirm: Onayla
+      fail: '%{name} kullanıcısına %{role} görevi verilemedi. Lütfen hem kullanıcının
+        hem görevin geçerli olduğunu kontrol edin.'
     revoke:
+      title: Görev iptalini onayla
+      heading: Görev iptalini onayla
+      are_you_sure: '%{name} kullanıcısından %{role} görevini almak istediğinizden
+        emin misiniz?'
       confirm: Onayla
+      fail: '%{name} kullanıcısından %{role} görevi alma işlemi başarısız oldu. Lütfen,
+        hem kullanıcının hem görevin geçerli olduğunu kontrol edin.'
   user_block:
+    model:
+      non_moderator_update: Engelleme yapmak ya da engellemeyi güncellemek için bir
+        moderatöre ihtiyaç duyulmaktadır.
+      non_moderator_revoke: Engellemeyi geri almak için bir moderatöre ihtiyaç duyulmaktadır.
+    not_found:
+      sorry: Üzgünüz, %{id} numaralı kullanıcı engeli bulunamadı.
+      back: Dizine dön
+    new:
+      title: '%{name} adlı kullanıcıyı engelle'
+      heading: '%{name} adlı kullanıcıyı engelle'
+      reason: '%{name} adlı kullanıcının engellenme sebebi. Durum hakkında olabildiğince
+        fazla ayrıntı vererek mesajın herkes tarafından görülebileceğini hatırlayarak
+        mümkün olduğunca makûl ve sakin olun. Tüm kullanıcıların topluluk jargonunu
+        anlamadıklarını lütfen unutmayın; bu nedenle acemilerin anlayabileceği terimleri
+        kullanmaya çalışın.'
+      period: Şu andan itibaren ne zamana kadar kullanıcıdan API engellenecek?
+      submit: Engelle
+      tried_contacting: Kullanıcıyla iletişime geçtim ve durmasını istedim.
+      tried_waiting: Kullanıcının bu iletişimlere cevap vermesi için makul bir süre
+        verdim.
+      needs_view: Engel kaldırılmadan önce kullanıcının giriş yapması gerekiyor.
+      back: Tüm engellemeleri göster
+    edit:
+      title: '%{name} adlı kullanıcının engelini değiştir'
+      heading: '%{name} adlı kullanıcının engelini değiştir'
+      reason: '%{name} adlı kullanıcının engellenme sebebi. Durum hakkında olabildiğince
+        fazla ayrıntı vererek mesajın herkes tarafından görülebileceğini hatırlayarak
+        mümkün olduğunca makûl ve sakin olun. Tüm kullanıcıların topluluk jargonunu
+        anlamadıklarını lütfen unutmayın; bu nedenle acemilerin anlayabileceği terimleri
+        kullanmaya çalışın.'
+      period: Şu andan itibaren ne zamana kadar kullanıcıdan API engellenecek?
+      submit: Engeli güncelle
+      show: Bu engellemeyi gör
+      back: Tüm engellemeleri göster
+      needs_view: Engel kaldırılmadan önce kullanıcının giriş yapması gerekiyor mu?
+    filter:
+      block_expired: Engelin süresi dolmuş ve değiştirilemiyor.
+      block_period: Engel süresi, açılır listeden seçilebilen değerlerden biri olmalıdır.
     create:
       try_contacting: Lütfen kullanıcıyı engellemeden önce onunla iletişime geçmeyi
         deneyin ve cevap verebilmesi için makul bir zaman verin.
@@ -1760,6 +2253,7 @@ tr:
     helper:
       time_future: '%{time} içinde bitecek.'
       until_login: Kullanıcı giriş yapana kadar aktif.
+      time_future_and_until_login: '%{time} içinde ve kullanıcı oturum açtığında bitecek.'
       time_past: '%{time} önce bitti.'
     blocks_on:
       title: '%{name} kişisinin engelleri'
@@ -1774,6 +2268,8 @@ tr:
       heading: '%{block_on} kişisi %{block_by} tarafından engellendi'
       time_future: '%{time} içinde bitecek'
       time_past: '%{time} önce bitti'
+      created: Oluşturuldu
+      ago: '%{time} önce'
       status: Durum
       show: Göster
       edit: Düzenle
@@ -1785,10 +2281,38 @@ tr:
       needs_view: Engel kaldırılmadan önce kullanıcının giriş yapması gerekiyor.
   note:
     description:
+      opened_at_html: '%{when} önce oluşturuldu'
       opened_at_by_html: '%{when} önce %{user} tarafından oluşturuldu'
+      commented_at_html: '%{when} önce güncellendi'
+      commented_at_by_html: '%{user} tarafından %{when} tarihinde güncellendi'
+      closed_at_html: '%{when} önce çözüldü'
+      closed_at_by_html: '%{user} tarafından %{when} tarihinde çözüldü'
+      reopened_at_html: '%{when} önce yeniden etkinleştirildi'
+      reopened_at_by_html: '%{user} tarafından %{when} tarihinde yeniden etkinleştirildi'
+    rss:
+      title: OpenStreetMap Notları
+      description_area: '[(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})] bölgenizde
+        raporlanan, yorumlanan veya kapatılan notların bir listesi'
+      description_item: Not %{id} için bir rss beslemesi
+      opened: yeni not (%{place} yakınında)
+      commented: yeni yorum (%{place} yakınında)
+      closed: kapalı not (%{place} yakınında)
+      reopened: yeniden etkinleştirilmiş not (%{place} yakınında)
+    entry:
+      comment: Yorum
+      full: Notun tamamı
     mine:
+      title: '%{user} tarafından gönderilen veya yorumlanan notlar'
+      heading: '%{user} kullanıcıya ait notlar'
+      subheading: '%{user} tarafından gönderilen veya yorumlanan notlar'
+      id: Kimlik
       creator: Oluşturan
+      description: Açıklama
+      created_at: Oluşturulma tarihi
+      last_changed: Son değişiklik
+      ago_html: '%{when} önce'
   javascripts:
+    close: Kapat
     share:
       title: Paylaş
       cancel: İptal
@@ -1796,31 +2320,42 @@ tr:
       link: Bağlantı veya HTML
       long_link: Bağlantı
       short_link: Kısa Bağlantı
+      geo_uri: Coğrafi URI
       embed: HTML
       custom_dimensions: Özel boyutlar belirt
+      format: 'Biçim:'
       scale: 'Ölçek:'
       image_size: Görsel standart katmanı şu boyutta gösterecek (piksel)
       download: İndir
+      short_url: Kısa bağlantı
       include_marker: İşaret ekle
+      center_marker: İşaretleyicide merkez harita
+      paste_html: Web sitesine yerleştirmek için HTML'yi yapıştırın
+      view_larger_map: Daha Büyük Haritayı Göster
+      only_standard_layer: Yalnızca standart katman bir resim olarak dışa aktarılabilir
+    embed:
+      report_problem: Bir sorunu şikayet et
     key:
       title: Lejant
       tooltip: Lejant
-      tooltip_disabled: Lejant sadece standart katmanı için kullanılmakta
+      tooltip_disabled: Harita Anahtarı bu katman için kullanılamıyor
     map:
       zoom:
         in: Yakınlaştır
         out: Uzaklaştır
       locate:
         title: Konumumu göster
+        popup: Bu noktadan {distance} {unit} içeridesin
       base:
         standard: Standart
-        cycle_map: Bisikletler için Harita
+        cycle_map: Bisiklet Haritası
         transport_map: Ulaşım Haritası
         hot: İnsancıl
       layers:
         header: Harita Katmanları
         notes: Harita Notları
         data: Harita Verileri
+        gps: Herkese açık GPS izleri
         overlays: Sorun giderebilmek için kaplamaları etkinleştir
         title: Katmanlar
       copyright: © <a href='%{copyright_url}'>OpenStreetMap katkıda bulunanları</a>
@@ -1834,21 +2369,86 @@ tr:
       map_data_zoom_in_tooltip: Harita verileri görmek için yakınlaştır
       queryfeature_tooltip: Özellikleri göster
       queryfeature_disabled_tooltip: Özellikler görmek için yakınlaştır
+    changesets:
+      show:
+        comment: Yorum
+        subscribe: Abone ol
+        unsubscribe: Abonelikten çık
+        hide_comment: gizle
+        unhide_comment: göster
     notes:
       new:
-        intro: Bir hata ya da eksik bir şey mi var? Bu sorunun düzeltilebilmesi için
-          diğer haritacılara bildirin. İmleci doğru konuma taşıyın ve sorunu açıklayan
-          bir not yazın. (Lütfen kişisel bilgilerinizi ya da telif hakkı saklı olan
-          haritalardaki bilgileri ya da rehber listeleri girmeyiniz.)
+        intro: Bir hata mı buldunuz ya da eksik bir şey mi var? Bu sorunun düzeltilebilmesi
+          için diğer haritacılara bildirin. İmleci doğru konuma taşıyın ve sorunu
+          açıklayan bir not yazın.
+        advice: Notunuz herkese açıktır ve haritayı güncellemek için kullanılabilir,
+          bu nedenle kişisel bilgilerinizi veya telif hakkıyla korunan haritalar veya
+          dizin listelerinden bilgi girmeyin.
         add: Not Ekle
       show:
         anonymous_warning: Bu not anonim kullanıcılardan yorumlar içerdiğinden bağımsız
           olarak doğrulanması gerekir.
         hide: Gizle
         resolve: Çözümle
+        reactivate: Yeniden etkinleştir
+        comment_and_resolve: Yorum ve Çözüm
         comment: Yorum
     edit_help: Haritayı sürükleyip ve düzenleme yapmak istediğiniz konuma yakınlaştırdıktan
       sonra buraya tıklayın.
+    directions:
+      ascend: Yükselt
+      engines:
+        graphhopper_bicycle: Bisikletle (GraphHopper)
+        graphhopper_car: Arabayla (GraphHopper)
+        graphhopper_foot: Yürüyerek (GraphHopper)
+        mapquest_bicycle: Bisikletle (MapQuest)
+        mapquest_car: Arabayla (MapQuest)
+        mapquest_foot: Yürüyerek (MapQuest)
+        osrm_car: Araba (OSRM)
+      descend: İniş
+      directions: İstikametler
+      distance: Uzaklık
+      errors:
+        no_route: Bu iki yer arasında bir rota bulunamadı.
+        no_place: Maalesef - yeri bulamadık.
+      instructions:
+        continue_without_exit: '%{name} üzerinde devam edin.'
+        slight_right_without_exit: '%{name} üstünden hafif sağa'
+        offramp_right_without_exit: Sağdaki rampayı kullanarak %{name} girin
+        onramp_right_without_exit: Rampadan sağa dönerek %{name} girin
+        endofroad_right_without_exit: Yolun sonunda sağa %{name} yönünde dönün
+        merge_right_without_exit: '%{name} üzerine sağdan birleşin'
+        fork_right_without_exit: Çataldan sağa doğru %{name} üzerine
+        turn_right_without_exit: '%{name} üzerinde sağa dönün'
+        sharp_right_without_exit: '%{name} üstünden sağa keskin dönüş'
+        uturn_without_exit: '%{name} boyunca U dönüşü'
+        sharp_left_without_exit: '%{name} üstünden sola keskin dönüş'
+        turn_left_without_exit: '%{name} üstünden sola dönün'
+        offramp_left_without_exit: Soldaki rampayı kullanarak %{name} girin
+        onramp_left_without_exit: Rampadan sola dönerek %{name} girin
+        endofroad_left_without_exit: Yolun sonunda sola %{name} yönünde dönün
+        merge_left_without_exit: '%{name} üzerine soldan birleşin'
+        fork_left_without_exit: Çataldan sola doğru %{name} üzerine
+        slight_left_without_exit: '%{name} üzerinden hafif sola'
+        via_point_without_exit: (geçiş noktası)
+        follow_without_exit: '%{name} takip et'
+        roundabout_without_exit: Dönel kavşakta %{name} gidiniz
+        leave_roundabout_without_exit: Kavşaktan ayrıl - %{name}
+        stay_roundabout_without_exit: Kavşakta kal - %{name}
+        start_without_exit: '%{name} bitişinden başlayın'
+        destination_without_exit: Hedefe ulaş
+        roundabout_with_exit: Dönel kavşakta %{exit}. çıkışı kullanarak %{name} üzerine
+        slight_left_with_exit: Dönel kavşakta %{name} üzerine hafif sola
+        slight_right_with_exit: Dönel kavşakta %{name} üzerine hafif sağa
+        unnamed: adsız yol
+      time: Zaman
+    query:
+      node: Düğüm
+      way: Yol
+      relation: İlişki
+      nothing_found: Özellik bulunamadı
+      error: '%{server}: %{error} ile bağlantı kurulurken hata oluştu'
+      timeout: '%{server} ile bağlantı kurulurken hata oluştu'
     context:
       directions_from: Buradan yönlendir
       directions_to: Buraya yönlendir
index d7b8dd4cbe85c5ed39fb7b2eb439b6a5121ec53d..f17f2d5adeecff8ef71c99348a07336d9b43a2fa 100644 (file)
@@ -17,6 +17,7 @@
 # Author: Green Zero
 # Author: KEL
 # Author: Macofe
+# Author: Movses
 # Author: Mykola Swarnyk
 # Author: Nemo bis
 # Author: Olvin
@@ -158,6 +159,8 @@ uk:
         title_comment: Набір змін %{id} — %{comment}
       join_discussion: Увійдіть в систему, щоб приєднатися до обговорення
       discussion: Обговорення
+      still_open: Набір змін досі відкритий - обговорення буде відкрито, як тільки
+        набір змін закриють.
     node:
       title: 'Точка: %{name}'
       history_title: 'Історія точки: %{name}'
@@ -265,7 +268,7 @@ uk:
       area: Ділянка
     list:
       title: Набір змін
-      title_user: Набір змін користувача %{user}
+      title_user: Набори змін від %{user}
       title_friend: Набори змін ваших друзів
       title_nearby: Набори змін користувачів поряд з вами
       empty: Жодного набору змін не знайдено.
@@ -468,33 +471,26 @@ uk:
           crematorium: Крематорій
           dentist: Стоматологія
           doctors: Лікарі
-          dormitory: Гуртожиток
           drinking_water: Питна вода
           driving_school: Автошкола
           embassy: Амбасада
-          emergency_phone: Телефон для екстрених викликів
           fast_food: Швидке харчування
           ferry_terminal: Поромна станція
-          fire_hydrant: Пожежний гідрант
           fire_station: Пожежна станція
           food_court: Фуд-корт
           fountain: Фонтан
           fuel: Пальне
           gambling: Азартні ігри
           grave_yard: Цвинтар
-          gym: Тренажерний зал
-          health_centre: Лікарня
           hospital: Шпиталь
           hunting_stand: Мисливська вежа
           ice_cream: Морозиво
           kindergarten: Дитячий садок
           library: Бібліотека
-          market: Ринок
           marketplace: Ринок
           monastery: Монастир
           motorcycle_parking: Стоянка мотоциклів
           nightclub: Нічний клуб
-          nursery: Ясла
           nursing_home: Будинок престарілих
           office: Офіс
           parking: Стоянка
@@ -508,7 +504,6 @@ uk:
           prison: В’язниця
           pub: Паб
           public_building: Громадський заклад
-          reception_area: Зона прийому
           recycling: Місце переробки відходів
           restaurant: Ресторан
           retirement_home: Будинок для людей похилого віку
@@ -604,7 +599,6 @@ uk:
           trunk: Шосе
           trunk_link: З’їзд з/на шосе
           unclassified: Дорога без класифікації
-          unsurfaced: Дорога без покриття
           "yes": Дорога
         historic:
           archaeological_site: Археологічні дослідження
@@ -669,7 +663,6 @@ uk:
         leisure:
           beach_resort: Пляжний курорт
           bird_hide: Засідка (пункт спостереження за птахами)
-          club: Клуб
           common: Громадська земля
           dog_park: Майданчик для собак
           fishing: Район риболовлі
@@ -762,8 +755,6 @@ uk:
           "yes": Офіси
         place:
           allotments: Сади-городи, дачні ділянки
-          block: Квартал
-          airport: Аеропорт
           city: Місто
           country: Країна
           county: Район
@@ -775,7 +766,6 @@ uk:
           islet: Острівець
           isolated_dwelling: Окреме господарство
           locality: Місцевість
-          moor: Якірна стоянка
           municipality: Муніципалітет
           neighbourhood: Мікрорайон
           postcode: Індекс
@@ -792,10 +782,8 @@ uk:
           abandoned: Занедбані колії
           construction: Будівництво колії
           disused: Покинута колія
-          disused_station: Покинута залізнична станція
           funicular: Фунікулер
           halt: Зупинка поїзда
-          historic_station: Історична залізнична станція
           junction: Переїзд
           level_crossing: Залізничний переїзд
           light_rail: Швидкісний трамвай
@@ -859,7 +847,6 @@ uk:
           hairdresser: Перукарня
           hardware: Господарські товари
           hifi: Аудіо-техніка
-          insurance: Страхування
           jewelry: Ювелірний магазин
           kiosk: Кіоск
           laundry: Пральня
@@ -875,10 +862,8 @@ uk:
           pet: Зоомагазин
           pharmacy: Аптека
           photo: Фотомагазин
-          salon: Салон
           second_hand: Комісійний магазин
           shoes: Взуття
-          shopping_centre: Торговий центр
           sports: Спортивні товари
           stationery: Канцтовари
           supermarket: Супермаркет
@@ -1199,8 +1184,8 @@ uk:
         тематичних або регіональних списків розсилки.
     forums:
       title: Форуми
-      description: Ð\97апиÑ\82аннÑ\8f Ñ\82а Ð´Ð¸Ñ\81кÑ\83Ñ\81Ñ\96Ñ\97 Ð´Ð»Ñ\8f Ñ\82иÑ\85, Ñ\85Ñ\82о Ð²Ñ\96ддаÑ\94 Ð¿ÐµÑ\80евагÑ\83 Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81Ñ\83 Ð´Ð¾Ñ\88ки
-        обговорень.
+      description: Ð\97апиÑ\82аннÑ\8f Ñ\82а Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80еннÑ\8f Ð´Ð»Ñ\8f Ñ\82иÑ\85, Ñ\85Ñ\82о Ð²Ñ\96ддаÑ\94 Ð¿ÐµÑ\80евагÑ\83 Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81Ñ\83
+        Ð´Ð¾Ñ\88ки Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80енÑ\8c.
     irc:
       title: IRC
       description: Інтерактивний чат багатьма мовами на багато тем.
@@ -1711,7 +1696,7 @@ uk:
       allow_read_gpx: читати ваші приватні GPS-треки.
       allow_write_gpx: передавати GPS-треки на сервер.
       allow_write_notes: змінювати нотатки.
-      grant_access: Надання Доступу
+      grant_access: Надати доступ
     oauthorize_success:
       title: Дозволено запит на авторизацію
       allowed: Ви надали програмі %{app_name} доступ до вашого облікового запису.
@@ -2398,9 +2383,6 @@ uk:
         mapquest_car: Машина (MapQuest)
         mapquest_foot: Пішки (MapQuest)
         osrm_car: Машина (OSRM)
-        mapzen_bicycle: Велосипед (Mapzen)
-        mapzen_car: Автомобіль (Mapzen)
-        mapzen_foot: Пішки (Mapzen)
       descend: Вниз
       directions: Маршрут
       distance: Відстань
index 252fbfc36a6af00e66d88fecb92b707947704212..dbe68618b82e5beeb4076a39e356ca88160f12b6 100644 (file)
@@ -7,6 +7,7 @@
 # Author: Minh Nguyen
 # Author: Nemo bis
 # Author: Ninomax
+# Author: Phjtieudoc
 # Author: Ruila
 # Author: Trần Nguyễn Minh Huy
 ---
@@ -437,33 +438,26 @@ vi:
           crematorium: Lò Hỏa táng
           dentist: Nha sĩ
           doctors: Bác sĩ
-          dormitory: Ký túc xá
           drinking_water: Vòi Nước uống
           driving_school: Trường Lái xe
           embassy: Tòa Đại sứ
-          emergency_phone: Điện thoại Khẩn cấp
           fast_food: Nhà hàng Ăn nhanh
           ferry_terminal: Trạm Phà
-          fire_hydrant: Trụ Cứu hỏa
           fire_station: Trạm Cứu hỏa
           food_court: Khu Ẩm thực
           fountain: Vòi nước
           fuel: Cây xăng
           gambling: Xe Cáp treo Lớn
           grave_yard: Nghĩa địa
-          gym: Nhà Thể dục
-          health_centre: Trung tâm Y tế
           hospital: Bệnh viện
           hunting_stand: Ghế Dựng để Săn bắn
           ice_cream: Tiệm Kem
           kindergarten: Tiểu học
           library: Thư viện
-          market: Chợ
           marketplace: Chợ phiên
           monastery: Nhà tu
           motorcycle_parking: Chỗ Đậu Xe máy
           nightclub: Câu lạc bộ Đêm
-          nursery: Nhà trẻ
           nursing_home: Viện Dưỡng lão
           office: Văn phòng
           parking: Chỗ Đậu xe
@@ -477,7 +471,6 @@ vi:
           prison: Nhà tù
           pub: Quán rượu
           public_building: Tòa nhà Công cộng
-          reception_area: Phòng Tiếp khách
           recycling: Trung tâm hoặc Thùng Tái sinh
           restaurant: Nhà hàng
           retirement_home: Nhà về hưu
@@ -573,7 +566,6 @@ vi:
           trunk: Xa lộ
           trunk_link: Xa lộ
           unclassified: Ngõ
-          unsurfaced: Đường Không Lát
           "yes": Đường
         historic:
           archaeological_site: Khu vực Khảo cổ
@@ -638,7 +630,6 @@ vi:
         leisure:
           beach_resort: Khu Nghỉ mát Ven biển
           bird_hide: Căn nhà Quan sát Chim
-          club: Câu lạc bộ
           common: Đất Công
           dog_park: Công viên Chó
           fishing: Hồ Đánh cá
@@ -731,8 +722,6 @@ vi:
           "yes": Văn phòng
         place:
           allotments: Khu Vườn Gia đình
-          block: Khối phố
-          airport: Sân bay
           city: Thành phố
           country: Quốc gia
           county: Quận hạt
@@ -744,7 +733,6 @@ vi:
           islet: Đảo Nhỏ
           isolated_dwelling: Chỗ ở Cô đơn
           locality: Địa phương
-          moor: Truông
           municipality: Đô thị
           neighbourhood: Hàng xóm
           postcode: Mã Bưu chính
@@ -761,10 +749,8 @@ vi:
           abandoned: Đường sắt Bỏ hoang
           construction: Đường sắt Đang Xây
           disused: Đường sắt Không hoạt động
-          disused_station: Nhà ga Đóng cửa
           funicular: Đường sắt Leo núi
           halt: Ga Xép
-          historic_station: Nhà ga Lịch sử
           junction: Ga Đầu mối
           level_crossing: Điểm giao Đường sắt
           light_rail: Đường sắt Nhẹ
@@ -828,7 +814,6 @@ vi:
           hairdresser: Tiệm Làm tóc
           hardware: Tiệm Ngũ kim
           hifi: Cửa hàng Hi-fi
-          insurance: Bảo hiểm
           jewelry: Tiệm Kim hoàn
           kiosk: Quán
           laundry: Tiệm Giặt Quần áo
@@ -844,10 +829,8 @@ vi:
           pet: Tiệm Vật nuôi
           pharmacy: Nhà thuốc
           photo: Tiệm Rửa Hình
-          salon: Tiệm Làm tóc
           second_hand: Tiệm Mua lại
           shoes: Tiệm Giày
-          shopping_centre: Trung tâm Mua sắm
           sports: Tiệm Thể thao
           stationery: Tiệm Văn phòng phẩm
           supermarket: Siêu thị
@@ -1432,7 +1415,7 @@ vi:
       get_directions_title: Chỉ đường từ một địa điểm tới địa điểm khác
       from: Từ
       to: Đến
-      where_am_i: Tôi ở đâu?
+      where_am_i: Đây là đâu?
       where_am_i_title: Miêu tả vị trí đang ở dùng máy tìm kiếm
       submit_text: Đi
     key:
@@ -2339,9 +2322,6 @@ vi:
         mapquest_car: Xe hơi (MapQuest)
         mapquest_foot: Đi bộ (MapQuest)
         osrm_car: Xe hơi (OSRM)
-        mapzen_bicycle: Xe đạp (Mapzen)
-        mapzen_car: Xe hơi (Mapzen)
-        mapzen_foot: Đi bộ (Mapzen)
       descend: Xuống
       directions: Chỉ đường
       distance: Tầm xa
index 8b43a3338ddd3fdc9c75bfe8ceabd5b4bf193d7e..9e99eb53fca10a4c2f2814b2aaedbf54a951388b 100644 (file)
@@ -2,6 +2,7 @@
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Anakmalaysia
+# Author: Assoc
 # Author: Boyuan Yang
 # Author: David S. Hwang
 # Author: Dimension
@@ -157,6 +158,7 @@ zh-CN:
         title_comment: 修改集合 %{id} - %{comment}
       join_discussion: 登录以加入讨论
       discussion: 讨论
+      still_open: 修改集合仍在开启——一旦修改集合关闭将打开讨论。
     node:
       title: 节点:%{name}
       history_title: 节点历史:%{name}
@@ -205,7 +207,7 @@ zh-CN:
         way: 路径
         relation: 关系
     start_rjs:
-      feature_warning: 正在载入 %{num_features} 个特征,这可能使您的浏览器变慢或失去响应。您确定想要显示该数据吗?
+      feature_warning: 正在载入 %{num_features} 个要素,这可能使您的浏览器变慢或失去响应。您确定想要显示该数据吗?
       load_data: 载入数据
       loading: 正在载入...
     tag_details:
@@ -233,10 +235,10 @@ zh-CN:
       reopened_by_anonymous: 匿名用户重新激活于 <abbr title='%{exact_time}'>%{when} 前</abbr>
       hidden_by: '%{user} 隐藏于 <abbr title=''%{exact_time}''>%{when} 前</abbr>'
     query:
-      title: 查询特征
-      introduction: 点击地图以查找附近特征
+      title: 查询要素
+      introduction: 点击地图以查找附近要素
       nearby: 附近特征
-      enclosing: å\86\85æµ\8bå\8a\9fè\83½
+      enclosing: å°\81é\97­è¦\81ç´ 
   changeset:
     changeset_paging_nav:
       showing_page: 第 %{page} 页
@@ -358,7 +360,7 @@ zh-CN:
       map_image: 地图图像 (显示标准图层)
       embeddable_html: 可嵌入HTML
       licence: 许可协议
-      export_details: OpenStreetMap 数据采用<a href="http://opendatacommons.org/licenses/odbl/1.0/">开放数据共享开放数据库许可协议</a>
+      export_details: OpenStreetMap 数据采用<a href="https://opendatacommons.org/licenses/odbl/1.0/">开放数据共享开放数据库许可协议</a>
         (ODbL)授权。
       too_large:
         advice: 如果用上面的导出工具失败了,请考虑使用下面列出的来源来导出:
@@ -393,14 +395,14 @@ zh-CN:
   geocoder:
     search:
       title:
-        latlon: 来自<a href="http://openstreetmap.org/">内部</a>的结果
+        latlon: 来自<a href="https://openstreetmap.org/">内部</a>的结果
         uk_postcode: 来自 <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
           的结果
-        ca_postcode: 来自 <a href="http://geocoder.ca/">Geocoder.CA</a> 的结果
-        osm_nominatim: 来自 <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        ca_postcode: 来自 <a href="https://geocoder.ca/">Geocoder.CA</a> 的结果
+        osm_nominatim: 来自 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> 的结果
         geonames: 来自 <a href="http://www.geonames.org/">GeoNames</a> 的结果
-        osm_nominatim_reverse: 来自 <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim_reverse: 来自 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> 的结果
         geonames_reverse: 来自 <a href="http://www.geonames.org/">GeoNames</a> 的结果
     search_osm_nominatim:
@@ -411,12 +413,19 @@ zh-CN:
           chair_lift: 登山吊椅
           drag_lift: 上山牵引机
           gondola: 索道
+          platter: 拼盘电梯
+          pylon: 电缆塔
           station: 索道站
+          t-bar: T字形滑雪输送机
         aeroway:
           aerodrome: 小型飞机场
+          airstrip: 飞机跑道
           apron: 停机坪
           gate: 登机口
+          hangar: 飞机库
           helipad: 直升机停机坪
+          holding_position: 结束位置
+          parking_position: 停车位置
           runway: 跑道
           taxiway: 滑行道
           terminal: 航站楼
@@ -451,37 +460,32 @@ zh-CN:
           crematorium: 火葬场
           dentist: 牙科
           doctors: 医生办公室
-          dormitory: 宿舍
           drinking_water: 饮用水
           driving_school: 驾驶学校
           embassy: 大使馆
-          emergency_phone: 紧急电话
           fast_food: 快餐
           ferry_terminal: 轮渡码头
-          fire_hydrant: 消防栓
           fire_station: 消防局
           food_court: 美食广场
           fountain: 喷泉
           fuel: 加油站
           gambling: 赌博
           grave_yard: 墓地
-          gym: 健身中心/健身房
-          health_centre: 医疗中心
+          grit_bin: 砂砾箱
           hospital: 医院
           hunting_stand: 狩猎站
           ice_cream: 冰淇淋
           kindergarten: 幼儿园
           library: 图书馆
-          market: 市场
           marketplace: 商场
           monastery: 修道院
           motorcycle_parking: 摩托车停放处
           nightclub: 夜总会
-          nursery: 托儿所
           nursing_home: 疗养院
           office: 办公室
           parking: 停车场
           parking_entrance: 停车场入口
+          parking_space: 停车位
           pharmacy: 药店
           place_of_worship: 宗教场所
           police: 警察局
@@ -491,7 +495,6 @@ zh-CN:
           prison: 监狱
           pub: 酒馆
           public_building: 公共建筑
-          reception_area: 接待区
           recycling: 回收点
           restaurant: 餐馆
           retirement_home: 养老院
@@ -516,6 +519,7 @@ zh-CN:
           village_hall: 村政厅
           waste_basket: 垃圾桶
           waste_disposal: 废物处理
+          water_point: 引水点
           youth_centre: 青少年中心
         boundary:
           administrative: 行政区边界
@@ -524,6 +528,7 @@ zh-CN:
           protected_area: 保护区
         bridge:
           aqueduct: 沟渠
+          boardwalk: 木板人行道
           suspension: 悬索桥
           swing: 平旋桥
           viaduct: 高架桥
@@ -543,25 +548,31 @@ zh-CN:
           "yes": 工艺品店
         emergency:
           ambulance_station: 救护站
+          assembly_point: 集合点
           defibrillator: 除颤仪
           landing_site: 紧急着陆地点
           phone: 紧急电话
+          water_tank: 急救水箱
+          "yes": 紧急
         highway:
           abandoned: 弃用公路
           bridleway: 马道
           bus_guideway: 导轨公交车道
           bus_stop: 公共汽车站
           construction: 在建公路
+          corridor: 走廊
           cycleway: 自行车道
           elevator: 电梯
           emergency_access_point: 紧急求救点
           footway: 人行道
           ford: 浅滩
+          give_way: 让车标志
           living_street: 生活街
           milestone: 里程碑
           motorway: 高速公路
           motorway_junction: 高速公路连接线
           motorway_link: 高速公路
+          passing_place: 会车带
           path: 小径
           pedestrian: 步行街
           platform: 车站
@@ -578,6 +589,7 @@ zh-CN:
           services: 高速公路服务区
           speed_camera: 测速摄像头
           steps: 楼梯
+          stop: 停车标志
           street_lamp: 路灯
           tertiary: 三级道路
           tertiary_link: 三级道路
@@ -586,8 +598,8 @@ zh-CN:
           trail: 小路
           trunk: 主干道路
           trunk_link: 干道
+          turning_loop: 转弯循环
           unclassified: 无等级道路
-          unsurfaced: 无铺面道路
           "yes": 道路
         historic:
           archaeological_site: 遗址
@@ -606,6 +618,7 @@ zh-CN:
           manor: 庄园
           memorial: 纪念碑
           mine: 矿井
+          mine_shaft: 矿井
           monument: 纪念碑
           roman_road: 罗马道路
           ruins: 遗迹
@@ -615,6 +628,7 @@ zh-CN:
           wayside_cross: 路旁十字架
           wayside_shrine: 路旁神龛
           wreck: 残骸
+          "yes": 历史遗迹
         junction:
           "yes": 交叉点
         landuse:
@@ -652,9 +666,9 @@ zh-CN:
         leisure:
           beach_resort: 海滩度假村
           bird_hide: 野生动物观察站
-          club: 俱乐部
           common: 公共用地
           dog_park: 狗公园
+          firepit: 火山坑
           fishing: 垂钓区
           fitness_centre: 健身中心
           fitness_station: 健身设施
@@ -679,15 +693,46 @@ zh-CN:
           water_park: 水上公园
           "yes": 闲暇
         man_made:
+          adit: 坑道
+          beacon: 信号浮标
+          beehive: 蜂箱
+          breakwater: 防波堤
+          bridge: 桥
+          bunker_silo: 掩体
+          chimney: 烟囱
+          crane: 起重机
+          dolphin: 系船柱
+          dyke: 堤坝
+          embankment: 路堤
+          flagpole: 旗杆
+          gasometer: 贮气器
+          groyne: 防波堤
+          kiln: 窑
           lighthouse: 灯塔
+          mast: 桅杆
+          mine: 矿石
+          mineshaft: 矿井
+          monitoring_station: 监测电台
+          petroleum_well: 石油井
+          pier: 桥墩
           pipeline: 管道
+          silo: 地下贮藏库
+          storage_tank: 储油罐
+          surveillance: 监视
           tower: 塔
+          wastewater_plant: 污水处理厂
+          watermill: 水磨
+          water_tower: 水塔
+          water_well: 卖
+          water_works: 自来水厂
+          windmill: 风力机
           works: 工厂
           "yes": 人造
         military:
           airfield: 军用机场
           barracks: 营房
           bunker: 掩体
+          "yes": 军事
         mountain_pass:
           "yes": 山口
         natural:
@@ -733,11 +778,14 @@ zh-CN:
           accountant: 会计师事务所
           administrative: 管理
           architect: 设计院
+          association: 关联
           company: 公司
+          educational_institution: 教育机构
           employment_agency: 职业介绍所
           estate_agent: 地产代理
           government: 政府办公室
           insurance: 保险办公室
+          it: IT办公室
           lawyer: 律师事务所
           ngo: 非政府组织办公室
           telecommunication: 电信办公室
@@ -745,9 +793,8 @@ zh-CN:
           "yes": 办公室
         place:
           allotments: 分配的土地
-          block: 块
-          airport: 机场
           city: 城市
+          city_block: 城市街区
           country: 国家
           county: 县
           farm: 农场
@@ -758,12 +805,13 @@ zh-CN:
           islet: 屿
           isolated_dwelling: 独立的住宅
           locality: 地区
-          moor: 荒野
           municipality: 直辖市
           neighbourhood: 居住区
           postcode: 邮政编码
+          quarter: 宿舍
           region: 地区
           sea: 海
+          square: 方块
           state: 洲
           subdivision: 细分
           suburb: 郊区
@@ -775,10 +823,8 @@ zh-CN:
           abandoned: 已拆除铁路
           construction: 在建铁路
           disused: 废弃铁路
-          disused_station: 废弃火车站
           funicular: 缆索铁路
           halt: 火车停车点
-          historic_station: 历史火车站
           junction: 铁路枢纽
           level_crossing: 平交道口
           light_rail: 轻轨
@@ -804,6 +850,7 @@ zh-CN:
           beauty: 美容店
           beverages: 饮料店
           bicycle: 自行车店
+          bookmaker: 著作家
           books: 书店
           boutique: 精品店
           butcher: 肉店
@@ -842,12 +889,16 @@ zh-CN:
           hairdresser: 理发店
           hardware: 五金店
           hifi: Hi-Fi
-          insurance: 保险公司
+          houseware: 家庭用品店
+          interior_decoration: 内部装饰物
           jewelry: 珠宝店
           kiosk: 售货亭
+          kitchen: 厨房店
           laundry: 洗衣店
+          lottery: 彩票
           mall: 购物中心
           market: 市场
+          massage: 按摩
           mobile_phone: 手机店
           motorcycle: 摩托车店
           music: 音乐商店
@@ -855,21 +906,27 @@ zh-CN:
           optician: 眼镜店
           organic: 有机食品店
           outdoor: 户外用品店
+          paint: 油漆车间
+          pawnbroker: 当铺老板
           pet: 宠物店
           pharmacy: 药店
           photo: 照相馆
-          salon: 美容院
+          seafood: 海产食物
           second_hand: 二手商品商店
           shoes: 鞋店
-          shopping_centre: 购物中心
           sports: 体育用品店
           stationery: 文具店
           supermarket: 超市
           tailor: 裁缝店
+          ticket: 售票店
+          tobacco: 烟草店
           toys: 玩具店
           travel_agency: 旅行社
+          tyres: 轮胎店
+          vacant: 空置的店
+          variety_store: 杂货铺
           video: 音像店
-          wine: 无执照
+          wine: 葡萄酒店
           "yes": 商店
         tourism:
           alpine_hut: 高山小屋
@@ -893,6 +950,7 @@ zh-CN:
           viewpoint: 观景点
           zoo: 动物园
         tunnel:
+          building_passage: 建筑物通道
           culvert: 排水管
           "yes": 隧道
         waterway:
@@ -924,7 +982,7 @@ zh-CN:
         level10: 郊区界
     description:
       title:
-        osm_nominatim: <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> 中的位置
         geonames: <a href="http://www.geonames.org/">GeoNames</a> 中的位置
       types:
@@ -996,15 +1054,15 @@ zh-CN:
       title_html: 著作权与许可
       intro_1_html: |-
         OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup>是<i>开放数据</i>,由<a
-        href="http://osmfoundation.org/">OpenStreetMap基金会</a>(OSMF)采用<a
-        href="http://opendatacommons.org/licenses/odbl/">开放数据共享开放数据库许可协议</a>(ODbL)授权。
+        href="https://osmfoundation.org/">OpenStreetMap基金会</a>(OSMF)采用<a
+        href="https://opendatacommons.org/licenses/odbl/">开放数据共享开放数据库许可协议</a>(ODbL)授权。
       intro_2_html: 只要您表明来源为 OpenStreetMap 及其贡献者,您就可以自由地复制、分发、传送和改编我们的数据。如果您想转换或者以我们的数据为基础进行创作,您只能采用相同的许可协议发表您的作品。完整的<a
-        href="http://opendatacommons.org/licenses/odbl/1.0/">法律文本</a>阐明了您的权利和义务。
-      intro_3_html: 我们的地图图块中的绘图数据以及我们的文档采用<a href="http://creativecommons.org/licenses/by-sa/2.0/deed.zh">知识共享“署名-相同方式共享
+        href="https://opendatacommons.org/licenses/odbl/1.0/">法律文本</a>阐明了您的权利和义务。
+      intro_3_html: 我们的地图图块中的绘图数据以及我们的文档采用<a href="https://creativecommons.org/licenses/by-sa/2.0/deed.zh">知识共享“署名-相同方式共享
         2.0”</a>许可协议授权。
       credit_title_html: 如何表明作者是 OpenStreetMap
       credit_1_html: 我们需要您署名&ldquo;&copy; OpenStreetMap 贡献者&rdquo;。
-      credit_2_html: 您必须明确注明,我们的数据使用开放式数据库协议,若使用我们的地图图块,其协议须为 CC-BY-SA。您可以链接<a href="http://www.openstreetmap.org/copyright">此版权页</a>以注明。另外,若您要以数据形式发布
+      credit_2_html: 您必须明确注明,我们的数据使用开放式数据库协议,若使用我们的地图图块,其协议须为 CC-BY-SA。您可以链接<a href="https://www.openstreetmap.org/copyright">此版权页</a>以注明。另外,若您要以数据形式发布
         OSM,您可以属名并直接链接协议。若某些媒介无法进行链接(如印刷品),我们建议您引导您的读者至 openstreetmap.org (或 OpenStreetMap
         的完整网址)、opendatacommons.org,及可能相关的 creativecommons.org。
       credit_3_html: |-
@@ -1016,24 +1074,24 @@ zh-CN:
       more_title_html: 了解更多
       more_1_html: |-
         请在<a
-        href="http://osmfoundation.org/Licence">OSMF许可协议页面</a>阅读更多关于使用我们的数据,以及如何表明我们是作者的信息。
+        href="https://osmfoundation.org/Licence">OSMF许可协议页面</a>阅读更多关于使用我们的数据,以及如何表明我们是作者的信息。
       more_2_html: 尽管 OpenStreetMap 开放数据,但是我们无法为第三方提供免费的地图 API。详见我们的 <a href="https://operations.osmfoundation.org/policies/api/">API使用政策</a>、<a
         href="https://operations.osmfoundation.org/policies/tiles/">地图图块使用政策</a>及<a
         href="https://operations.osmfoundation.org/policies/nominatim/">名称服务使用政策</a>。
       contributors_title_html: 我们的贡献者
       contributors_intro_html: 我们的数据来源于成千上万人的贡献。但我们也从国家测绘机构等处获取公共版权的数据,其中包括:
-      contributors_at_html: <strong>奥地利</strong>:包含来自 <a href="http://data.wien.gv.at/">Stadt
-        Wien</a>(<a href="http://creativecommons.org/licenses/by/3.0/at/deed.zh">CC
-        BY</a>协议)、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
-        Vorarlberg</a>及 Land Tirol (修订的 <a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
+      contributors_at_html: <strong>奥地利</strong>:包含来自 <a href="https://data.wien.gv.at/">Stadt
+        Wien</a>(<a href="https://creativecommons.org/licenses/by/3.0/at/deed.zh">CC
+        BY</a>协议)、<a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+        Vorarlberg</a>及 Land Tirol (修订的 <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
         AT</a>协议)的数据。
       contributors_ca_html: <strong>加拿大</strong>:含有来自 GeoBase&reg;,GeoGratis(&copy;
         加拿大自然资源部),CanVec (&copy; 加拿大自然资源部)和StatCan (加拿大统计局地理处)的数据。
-      contributors_fi_html: <strong>芬兰</strong>:包含来自芬兰国家测绘局地形数据库和其他测绘机构的数据,依据 <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI
+      contributors_fi_html: <strong>芬兰</strong>:包含来自芬兰国家测绘局地形数据库和其他测绘机构的数据,依据 <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1">NLSFI
         协议</a>授权。
       contributors_fr_html: <strong>法国</strong>:含有来自 Direction Générale des Impôts
         的数据。
-      contributors_nl_html: <strong>荷兰</strong>:含有&copy; AND data, 2007(<a href="http://www.and.com">www.and.com</a>)
+      contributors_nl_html: <strong>荷兰</strong>:含有&copy; AND data, 2007(<a href="https://www.and.com">www.and.com</a>)
       contributors_nz_html: <strong>新西兰</strong>:包含来自新西兰土地信息部的数据。Crown 版权所有。
       contributors_si_html: |-
         <strong>斯洛文尼亚</strong>:包含来自
@@ -1043,15 +1101,15 @@ zh-CN:
       contributors_gb_html: <strong>英国</strong>:包含来自 Ordnance 的调查数据,&copy; Crown 版权所有及数据库权利,2010-12。
       contributors_footer_1_html: |-
         关于其进一步的细节,及其他被用来帮助提升 OpenStreetMap 的来源,详见 OpenStreetMap Wiki 的<a
-        href="http://wiki.openstreetmap.org/wiki/Zh-hans:Contributors">贡献者页面</a>。
+        href="https://wiki.openstreetmap.org/wiki/Zh-hans:Contributors">贡献者页面</a>。
       contributors_footer_2_html: OpenStreetMap 纳入数据并不意味着原始数据提供者认可 OpenStreetMap、提供任何担保或担负任何法律责任。
       infringement_title_html: 著作权侵犯
       infringement_1_html: OSM 的贡献者会被提醒,绝不要在没有著作权人的明确许可时添加来自任何有著作权的来源的数据(如谷歌地图或印刷地图)。
-      infringement_2_html: 如果您认为版权的材料已被不恰当地添加的 OpenStreetMap 数据库或该网站,请参见我们的<a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我们的<a
+      infringement_2_html: 如果您认为版权的材料已被不恰当地添加的 OpenStreetMap 数据库或该网站,请参见我们的<a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我们的<a
         href="http://dmca.openstreetmap.org/">在线申报页面</a>上提出。
       trademarks_title_html: <span id="trademarks"></span>商标
-      trademarks_1_html: OpenStreetMapã\80\81æ\94¾å¤§é\95\9cæ \87å¿\97å\92\8cå\9c°å\9b¾ç\8a¶æ\80\81æ\98¯OpenStreetMapå\9fºé\87\91ä¼\9aç\9a\84注å\86\8cå\95\86æ \87ã\80\82å¦\82æ\9e\9cæ\82¨å¯¹ä½¿ç\94¨è¿\99äº\9bæ \87å¿\97æ\9c\89ä»»ä½\95é\97®é¢\98ï¼\8c请å\9c¨<a
-        href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">授权工作组</a>提出您的问题
+      trademarks_1_html: OpenStreetMapã\80\81æ\94¾å¤§é\95\9cæ \87å¿\97å\92\8cå\9c°å\9b¾ç\8a¶æ\80\81æ\98¯OpenStreetMapå\9fºé\87\91ä¼\9aç\9a\84注å\86\8cå\95\86æ \87ã\80\82å¦\82æ\9e\9cæ\82¨å¯¹ä½¿ç\94¨è¿\99äº\9bæ \87å¿\97æ\9c\89ä»»ä½\95é\97®é¢\98ï¼\8c请å\8f\82è§\81æ\88\91们ç\9a\84<a
+        href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">商标方针</a>
   welcome_page:
     title: 欢迎!
     introduction_html: 欢迎访问 OpenStreeMap,自由且可编辑的世界地图。您已经登录,可以开始绘制地图。这里是含有您需要知道的最重要的信息的快速指南。
@@ -1069,7 +1127,7 @@ zh-CN:
     rules:
       title: 规则!
       paragraph_1_html: OpenStreetMap很少有正式规则,但我们期待所有参与者能合作,并与社区沟通。如果您在考虑任何除手工编辑的活动,请阅读并遵守<a
-        href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>导入</a>和<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自动编辑</a>的指导。
+        href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>导入</a>和<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自动编辑</a>的指导。
     questions:
       title: 还有疑问吗?
       paragraph_1_html: OpenStreetMap 有若干资源用于学习该项目,提问和回答问题,以及讨论与制作地图相关的话题并且撰写相关文档。<a
@@ -1092,7 +1150,7 @@ zh-CN:
     other_concerns:
       title: 其他问题
       explanation_html: 如果您有关于如何使用我们的数据或内容的关心请查阅我们在<a href='/copyright'>版权页面</a>的更多法律信息,或联系
-        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF 工作组</a>。
+        <a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF 工作组</a>。
   help_page:
     title: 获得帮助
     introduction: OpenStreetMap 有若干资源用于学习该项目,提问和回答问题,以及讨论与制作地图相关的话题并且撰写相关文档。
@@ -1101,7 +1159,7 @@ zh-CN:
       title: 欢迎访问 OSM
       description: 本快速指南涵盖了快速入门 OpenStreetMap 的基本知识。
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Zh-hans:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Zh-hans:Beginners%27_guide
       title: 初学者指南
       description: 社群维护的新手指南。
     help:
@@ -1121,7 +1179,7 @@ zh-CN:
       title: switch2osm
       description: 协助公司与组织改用 OpenStreetMap 为基础的地图与相关服务。
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: 浏览 wiki 深入了解 OSM 文档。
   about_page:
@@ -1135,17 +1193,19 @@ zh-CN:
     community_driven_title: 社区驱动
     community_driven_html: OpenStreetMap 是一个多元化的社区,它充满激情,并且每天都在成长。我们的参与者包括地图制作爱好者,地理信息系统(GIS)从业人员,维护
       OSM 服务器的工程师,标注灾害区域的人道主义自愿者,已经其他很多各界人士。想更多的了解社区请参见<a href='https://blog.openstreetmap.org'>OpenStreetMap博客</a>、<a
-      href='%{diary_path}'>用户日记</a>、<a href='http://blogs.openstreetmap.org/'>社区博客</a>,以及
-      <a href='http://www.osmfoundation.org/'>OSM 基金会</a>网站。
+      href='%{diary_path}'>用户日记</a>、<a href='https://blogs.openstreetmap.org/'>社区博客</a>,以及
+      <a href='https://www.osmfoundation.org/'>OSM 基金会</a>网站。
     open_data_title: 开放数据
     open_data_html: OpenStreetMap 是<i>开源数据</i>:只要您表明使用了 OpenStreetMap 并承认其贡献者的工作,您就可以使用
       OpenStreetMap。如果您改变或者使用这些数据,您必须按照相同的版权协议发布结果。详情请参见<a href='%{copyright_path}'>版权协议</a>。
     legal_title: 法律
     legal_html: |-
-      此网站和很多其他相关服务已由<a href='http://osmfoundation.org/'>OpenStreetMap基金会</a>(OSMF)正式代表社群运营。使用所有由OSMF运营的服务均需符合我们的<a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
-      可接受使用方针</a>和我们的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">隐私政策</a>
+      此网站和很多其他相关服务已由<a href='https://osmfoundation.org/'>OpenStreetMap基金会</a>(OSMF)正式代表社群运营。使用所有由OSMF运营的服务均需符合我们的<a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+      可接受使用方针</a>和我们的<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">隐私政策</a>
+      <br>
+      如果您有许可协议、版权或其他法律问题,请<a href='https://osmfoundation.org/Contact'>联络OSMF</a>。
       <br>
-      如果您有许可协议、版权或其他法律问题,请<a href='http://osmfoundation.org/Contact'>联络OSMF</a>。
+      OpenStreetMap、放大镜标志和地图状态是<a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">OSMF的注册商标</a>。
     partners_title: 合作伙伴
   notifier:
     diary_comment_notification:
@@ -1317,11 +1377,10 @@ zh-CN:
       anon_edits: (%{link})
       anon_edits_link_text: 了解为什么这很重要。
       flash_player_required: 您需要 Flash Player 来使用 OpenStreetMap Flash 编辑器 Potlatch。您可以<a
-        href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">从
-        Adobe.com 下载 Flash Player</a>。<a href="http://wiki.openstreetmap.org/wiki/Editing">其他几种选择</a>也可以用来编辑
-        OpenStreetMap。
+        href="https://get.adobe.com/flashplayer/">从 Adobe.com 下载 Flash Player</a>。<a
+        href="https://wiki.openstreetmap.org/wiki/Editing">其他几种选择</a>也可以用来编辑 OpenStreetMap。
       potlatch_unsaved_changes: 您有尚未保存的修改。(要在 Potlatch 中保存,如果在在线模式下编辑,您需要取消选择当前的路径或节点;或者点击保存,如果有保存按钮。)
-      potlatch2_not_configured: 尚未配置 Potlatch 2 - 请参阅 http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+      potlatch2_not_configured: 尚未配置 Potlatch 2 - 请参阅 https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
         以获得更多信息
       potlatch2_unsaved_changes: 您有尚未保存的修改。(要在 Potlatch 2 中保存,您应该点击保存。)
       id_not_configured: iD 尚未配置
@@ -1412,7 +1471,7 @@ zh-CN:
       edit: 编辑
       preview: 预览
     markdown_help:
-      title_html: 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: 使用 <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
         解析
       headings: 标题
       heading: 标题
@@ -1516,7 +1575,7 @@ zh-CN:
       public_traces_from: 来自 %{user} 的公开 GPS 轨迹
       description: 浏览最近上传的 GPS 轨迹
       tagged_with: 以 %{tags} 标记
-      empty_html: 尚无轨迹。<a href='%{upload_link}'>上传新轨迹</a>或在<a href='http://wiki.openstreetmap.org/wiki/Zh-hans:Beginners_Guide_1.2'>wiki页面</a>上了解
+      empty_html: 尚无轨迹。<a href='%{upload_link}'>上传新轨迹</a>或在<a href='https://wiki.openstreetmap.org/wiki/Zh-hans:Beginners_Guide_1.2'>wiki页面</a>上了解
         GPS 轨迹。
     delete:
       scheduled_for_deletion: 计划删除的轨迹
@@ -1705,10 +1764,10 @@ zh-CN:
         html: |-
           <p>不同于其他地图,OpenStreetMap 是完全由像您一样的人创建的,并且免费提供给任何人用以修正、更新、下载和使用。</p>
           <p>登录来贡献您的力量吧。我们将发送一份邮件来确认您的账号。</p>
-      license_agreement: 当您确认您的帐户时,您需要同意<a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">贡献者条款</a>。
+      license_agreement: 当您确认您的帐户时,您需要同意<a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">贡献者条款</a>。
       email address: 电子邮件地址:
       confirm email address: 确认电子邮件地址:
-      not displayed publicly: 您的地址未公开显示,请参见我们的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: 您的地址未公开显示,请参见我们的<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="OSMF隐私政策,包含部分电子邮件地址">隐私政策</a>以获取更多信息
       display name: 显示名称:
       display name description: 您公开显示的用户名。您可以稍后在首选项中进行修改。
@@ -1720,7 +1779,7 @@ zh-CN:
       continue: 注册
       terms accepted: 感谢您接受新的贡献条款!
       terms declined: 我们很遗憾您已决定不接受新的贡献者条款。有关详细信息,请参阅<a href="%{url}">此 wiki 页面</a>.
-      terms declined url: http://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: 贡献者条款
       heading: 贡献者条款
@@ -1820,26 +1879,26 @@ zh-CN:
       email never displayed publicly: (从不公开显示)
       external auth: 外部身份验证:
       openid:
-        link: http://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: 这是什么?
       public editing:
         heading: 公开编辑:
         enabled: 启用。非匿名用户,可以编辑数据。
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: 这是什么?
         disabled: 禁用且无法编辑数据,所有过去的编辑均为匿名。
         disabled link text: 我为什么不能编辑?
       public editing note:
         heading: 公开编辑
         text: 目前您的编辑是匿名的,人们不能发送邮件给您或看到您的位置。为了显示您的编辑,让别人通过网站与您联系,请点击下面的按钮。<b>由于 0.6
-          API 的转换,只有公开的用户可以编辑地图数据</b>。(<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">了解为什么</a>)。<ul><li>您的电子邮件地址将不会被因为成为公开用户而被透露。</li><li>此操作无法撤销,所有新用户现在都默认为公开的。</li></ul>
+          API 的转换,只有公开的用户可以编辑地图数据</b>。(<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">了解为什么</a>)。<ul><li>您的电子邮件地址将不会被因为成为公开用户而被透露。</li><li>此操作无法撤销,所有新用户现在都默认为公开的。</li></ul>
       contributor terms:
         heading: 贡献者条款:
         agreed: 您已同意新的贡献者条款。
         not yet agreed: 您还没有同意新的贡献者条款。
         review link text: 请跟随此链接,方便您查看并接受新的贡献者条款。
         agreed_with_pd: 您也将您的编辑释于公共领域。
-        link: http://www.osmfoundation.org/wiki/License/Contributor_Terms
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: 这是什么?
       profile description: 基本信息说明:
       preferred languages: 首选语言:
@@ -1943,6 +2002,7 @@ zh-CN:
       not_a_role: 字串 '%{role}' 不是有效的角色。
       already_has_role: 这个用户已经有角色 %{role}。
       doesnt_have_role: 这个用户没有角色 %{role}。
+      not_revoke_admin_current_user: 不能撤销当前用户的管理员角色。
     grant:
       title: 确认角色授予
       heading: 确认角色授予
@@ -2137,8 +2197,8 @@ zh-CN:
       createnote_disabled_tooltip: 放大地图以添加笔记
       map_notes_zoom_in_tooltip: 放大地图以查看笔记
       map_data_zoom_in_tooltip: 放大地图以查看数据
-      queryfeature_tooltip: 查询特征
-      queryfeature_disabled_tooltip: 放大地图以查询特征
+      queryfeature_tooltip: 查询要素
+      queryfeature_disabled_tooltip: 放大以查询要素
     changesets:
       show:
         comment: 评论
@@ -2148,7 +2208,8 @@ zh-CN:
         unhide_comment: 取消隐藏
     notes:
       new:
-        intro: 发现错误或缺少些什么东西吗?请告诉其他地图制作者以便于我们更正错误。将标记移动到正确的位置并输入备注解释当前问题。(请不要在此处输入个人信息或任何版权保护的地图相关信息或目录列表。)
+        intro: 发现错误或缺少些什么东西吗?请告诉其他地图制作者以便于我们更正错误。将标记移动到正确的位置并输入备注解释当前问题。
+        advice: 您的注释会公开,并可能用于更新地图,所以不要输入个人信息,或是来自版权保护地图的信息或目录列表。
         add: 添加笔记
       show:
         anonymous_warning: 该笔记包含匿名用户的评论,应独立地予以核实。
@@ -2168,9 +2229,6 @@ zh-CN:
         mapquest_car: 汽车(MapQuest)
         mapquest_foot: 步行(MapQuest)
         osrm_car: 汽车(OSRM)
-        mapzen_bicycle: 自行车(Mapzen)
-        mapzen_car: 汽车(Mapzen)
-        mapzen_foot: 脚(Mapzen)
       descend: 下降
       directions: 方向
       distance: 距离
@@ -2218,7 +2276,7 @@ zh-CN:
       node: 节点
       way: 路径
       relation: 关系
-      nothing_found: 没有找到特征
+      nothing_found: 没有找到要素
       error: 连接 %{server} 时出错:%{error}
       timeout: 连接 %{server} 超时
     context:
@@ -2226,8 +2284,8 @@ zh-CN:
       directions_to: 到这里的指示
       add_note: 在此添加注释
       show_address: 显示地址
-      query_features: 查询特征
-      centre_map: 中心地图在此
+      query_features: 查询要素
+      centre_map: 在此将地图放在中间
   redaction:
     edit:
       description: 说明
index 70fbd5a5788ae9d7c88cafb0b8e4ae0b7b98dd38..3a7a45ceeb86921555a712f7a35ca34db42db6a7 100644 (file)
@@ -156,6 +156,7 @@ zh-TW:
         title_comment: 變更集 %{id} - %{comment}
       join_discussion: 登入以參加討論
       discussion: 討論
+      still_open: 變更集仍為開啟 - 討論要在變更集關閉後才會開啟。
     node:
       title: 節點:%{name}
       history_title: 節點歷史:%{name}
@@ -186,7 +187,7 @@ zh-TW:
         way: 路徑
         relation: 關聯
         changeset: 變更集
-        note: 註
+        note: 註
     timeout:
       sorry: 抱歉,索取 id 為 %{id} 的 %{type} 資料,花費時間過長。
       type:
@@ -194,7 +195,7 @@ zh-TW:
         way: 路徑
         relation: 關聯
         changeset: 變更集
-        note: 註
+        note: 註
     redacted:
       redaction: 編修程序 %{id}
       message_html: 此 %{type} 的版本 %{version} 已被編修,因此未能顯示。詳細資訊請參閱 %{redaction_link}。
@@ -356,8 +357,8 @@ zh-TW:
       map_image: 地圖影像 (顯示標準圖層)
       embeddable_html: 內嵌式 HTML
       licence: 授權
-      export_details: OpenStreetMap 的資料採用 <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open
-        Data Commons 開放資料庫授權條款</a> (ODbL) 授權。
+      export_details: OpenStreetMap 的資料採用 <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
+        Data Commons 開放資料庫授權條款</a>(ODbL)授權。
       too_large:
         advice: 若以上匯出失敗,請考慮使用下列來源:
         body: 這個區域太大,無法匯出 OpenStreetMap XML 資料。請放大或選擇一個較小的區域,或使用下列大量資料下載源:
@@ -391,14 +392,14 @@ zh-TW:
   geocoder:
     search:
       title:
-        latlon: 來自<a href="http://openstreetmap.org/">內部</a>的結果
+        latlon: 來自<a href="https://openstreetmap.org/">內部</a>的結果
         uk_postcode: 來自<a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>的結果
-        ca_postcode: 來自<a href="http://geocoder.ca/">Geocoder.CA</a>的結果
-        osm_nominatim: 來自<a href="http://nominatim.openstreetmap.org/">OpenStreetMap
-          Nominatim</a>的結果
+        ca_postcode: 來自 <a href="https://geocoder.ca/">Geocoder.CA</a> 的結果
+        osm_nominatim: 來自 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a> 的結果
         geonames: 來自<a href="http://www.geonames.org/">GeoNames</a>的結果
-        osm_nominatim_reverse: 來自<a href="http://nominatim.openstreetmap.org/">OpenStreetMap
-          Nominatim</a>的結果
+        osm_nominatim_reverse: 來自 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a> 的結果
         geonames_reverse: 來自<a href="http://www.geonames.org/">GeoNames</a>的結果
     search_osm_nominatim:
       prefix:
@@ -407,12 +408,16 @@ zh-TW:
           chair_lift: 升降吊椅
           drag_lift: 上山牽引梯
           gondola: 小型纜車
+          pylon: 高壓電塔
           station: 空中纜車車站
         aeroway:
           aerodrome: 機場
+          airstrip: 飛機跑道
           apron: 停機坪
           gate: 登機口
+          hangar: 機棚
           helipad: 直升機停機坪
+          parking_position: 停車位置
           runway: 跑道
           taxiway: 滑行道
           terminal: 航廈
@@ -447,37 +452,31 @@ zh-TW:
           crematorium: 火葬場
           dentist: 牙醫
           doctors: 醫師
-          dormitory: 宿舍
           drinking_water: 飲用水
           driving_school: 駕訓班
           embassy: 大使館
-          emergency_phone: 緊急電話
           fast_food: 速食
           ferry_terminal: 渡輪碼頭
-          fire_hydrant: 消防栓
           fire_station: 消防隊
           food_court: 美食廣場
           fountain: 噴泉
           fuel: 燃料
           gambling: 賭場
           grave_yard: 墓園
-          gym: 瘦身中心 / 健身房
-          health_centre: 健康中心
           hospital: 醫院
           hunting_stand: 狩獵站
           ice_cream: 冰淇淋
           kindergarten: 幼稚園
           library: 圖書館
-          market: 市場
           marketplace: 市場
           monastery: 修道院
           motorcycle_parking: 機車停車場
           nightclub: 夜總會
-          nursery: 托兒所
           nursing_home: 護理院
           office: 辦公室
           parking: 停車場
           parking_entrance: 停車場入口
+          parking_space: 停車處
           pharmacy: 藥房
           place_of_worship: 宗教場所
           police: 警察
@@ -487,7 +486,6 @@ zh-TW:
           prison: 監獄
           pub: 酒館
           public_building: 公共建築
-          reception_area: 接待區
           recycling: 回收點
           restaurant: 餐廳
           retirement_home: 養老院
@@ -520,6 +518,7 @@ zh-TW:
           protected_area: 保護區
         bridge:
           aqueduct: 高架水道
+          boardwalk: 木板走道
           suspension: 吊橋
           swing: 平旋橋
           viaduct: 高架橋
@@ -548,16 +547,19 @@ zh-TW:
           bus_guideway: 軌道巴士線
           bus_stop: 巴士站
           construction: 建造中道路
+          corridor: 走廊
           cycleway: 自行車道
           elevator: 電梯
           emergency_access_point: 緊急聯絡點
           footway: 步道
           ford: 過水點
+          give_way: 讓路標誌
           living_street: 生活街道
           milestone: 里程標
           motorway: 高速公路
           motorway_junction: 高速公路交匯處
           motorway_link: 高速公路聯絡道
+          passing_place: 讓車道
           path: 小徑
           pedestrian: 人行道
           platform: 月台
@@ -574,6 +576,7 @@ zh-TW:
           services: 高速公路休息區
           speed_camera: 測速照相機
           steps: 階梯
+          stop: 停車標誌
           street_lamp: 路燈
           tertiary: 鄉道
           tertiary_link: 三級道路連接路
@@ -583,7 +586,6 @@ zh-TW:
           trunk: 快速道路
           trunk_link: 主要幹道連接路
           unclassified: 無分級道路
-          unsurfaced: 未鋪設道路
           "yes": 道路
         historic:
           archaeological_site: 考古遺址
@@ -611,6 +613,7 @@ zh-TW:
           wayside_cross: 路邊十字架
           wayside_shrine: 路邊神龕
           wreck: 殘骸
+          "yes": 古蹟
         junction:
           "yes": 路口
         landuse:
@@ -648,9 +651,9 @@ zh-TW:
         leisure:
           beach_resort: 海灘遊樂區
           bird_hide: 賞鳥亭
-          club: 俱樂部
           common: 公共用地
           dog_park: 狗狗公園
+          firepit: 火坑
           fishing: 垂釣區
           fitness_centre: 瘦身中心
           fitness_station: 健身站
@@ -675,9 +678,20 @@ zh-TW:
           water_park: 水上樂園
           "yes": 休閒
         man_made:
+          bridge: 橋
+          chimney: 煙囪
+          dyke: 堤
+          embankment: 堤
+          flagpole: 旗竿
           lighthouse: 燈塔
+          mine: 礦場
           pipeline: 管線
+          silo: 筒倉
           tower: 塔
+          watermill: 水車
+          water_tower: 水塔
+          water_well: 牆
+          windmill: 風車
           works: 工廠
           "yes": 人工設施
         military:
@@ -730,10 +744,12 @@ zh-TW:
           administrative: 管理局
           architect: 建築師事務所
           company: 公司
+          educational_institution: 教育機構
           employment_agency: 人力仲介
           estate_agent: 房地產仲介
           government: 政府辦事處
           insurance: 保險事務所
+          it: IT 辦公室
           lawyer: 律師
           ngo: 非政府組織辦公室
           telecommunication: 通訊信辦公室
@@ -741,9 +757,8 @@ zh-TW:
           "yes": 辦公室
         place:
           allotments: 社區農園
-          block: 街區
-          airport: 機場
           city: 城市
+          city_block: 街區
           country: 國家
           county: 縣
           farm: 農田
@@ -754,12 +769,12 @@ zh-TW:
           islet: 小島
           isolated_dwelling: 獨立住宅
           locality: 地區
-          moor: 荒野
           municipality: 自治市
           neighbourhood: 居住區
           postcode: 郵遞區號
           region: 區域
           sea: 海
+          square: 廣場
           state: 省
           subdivision: 次分區
           suburb: 郊區
@@ -771,10 +786,8 @@ zh-TW:
           abandoned: 已拆除鐵路
           construction: 建造中鐵路
           disused: 廢棄鐵路
-          disused_station: 廢棄鐵路車站
           funicular: 纜索鐵路
           halt: 鐵路停靠站
-          historic_station: 歷史鐵路車站
           junction: 鐵路交匯處
           level_crossing: 平交道
           light_rail: 輕鐵
@@ -838,12 +851,13 @@ zh-TW:
           hairdresser: 理髮店
           hardware: 五金行
           hifi: 音響店
-          insurance: 保險
           jewelry: 珠寶店
           kiosk: 販售亭
           laundry: 洗衣店
+          lottery: 樂透
           mall: 購物商場
           market: 市場
+          massage: 按摩店
           mobile_phone: 行動通訊行
           motorcycle: 機車行
           music: 唱片行
@@ -851,19 +865,24 @@ zh-TW:
           optician: 驗光師
           organic: 有機食品店
           outdoor: 戶外用品店
+          pawnbroker: 當鋪
           pet: 寵物店
           pharmacy: 藥房
           photo: 照相館
-          salon: ç¾\8e容é\99¢
+          seafood: æµ·ç\94¢
           second_hand: 二手商品店
           shoes: 鞋店
-          shopping_centre: 購物中心
           sports: 體育用品店
           stationery: 文具店
           supermarket: 超級市場
           tailor: 裁縫店
+          ticket: 售票處
+          tobacco: 菸草販賣
           toys: 玩具店
           travel_agency: 旅行社
+          tyres: 輪胎販售
+          vacant: 空置店舖
+          variety_store: 雜貨店
           video: 影音店
           wine: 酒館
           "yes": 商店
@@ -920,7 +939,7 @@ zh-TW:
         level10: 郊區邊界
     description:
       title:
-        osm_nominatim: 來自 <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+        osm_nominatim: 來自 <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a> 的位置
         geonames: 位置來自 <a href="http://www.geonames.org/">GeoNames</a>的位置
       types:
@@ -954,7 +973,7 @@ zh-TW:
     intro_header: 歡迎來到 OpenStreetMap!
     intro_text: OpenStreetMap 是一幅世界地圖,由像您這樣的人們所建立,在開放授權下可以自由使用。
     intro_2_create_account: 建立使用者帳號
-    partners_html: 主機由 %{ucl}、%{ic}、%{bytemark},和其他 %{partners} 所支援。
+    partners_html: 主機由 %{ucl}、%{bytemark}、%{ic},和其他 %{partners} 所支援。
     partners_ucl: 倫敦大學學院
     partners_ic: 倫敦帝國學院
     partners_bytemark: Bytemark 主機代管
@@ -987,17 +1006,18 @@ zh-TW:
       mapping_link: 開始製圖
     legal_babble:
       title_html: 版權與授權條款
-      intro_1_html: OpenStreetMap 為<i>開放資料</i>,以<a href="http://opendatacommons.org/licenses/odbl/">Open
-        Data Commons 開放資料庫授權條款</a> (ODbL) 授權。
+      intro_1_html: OpenStreetMap 為<i>開放資料</i>,以<a href="https://osmfoundation.org/">
+        OpenStreetMap 基金會</a>(OSMF)採用的<a href="https://opendatacommons.org/licenses/odbl/">
+        Open Data Commons 開放資料庫授權條款</a>(ODbL)授權。
       intro_2_html: |-
         您可以自由地複製、散布、傳輸及修改我們的資料,前提是您須標明作者為 OpenStreetMap 及其貢獻者。若您在我們的資料上作修改或據之衍生其他資料
-        ,則只可依相同授權條款散佈有關成果。授權的<a href="http://opendatacommons.org/licenses/odbl/1.0/">法律原文</a>詳述您的權責。
-      intro_3_html: 我們地圖影像塊的製圖法以及我們的文件,以<a href="http://creativecommons.org/licenses/by-sa/2.0/deed.zh_TW">創用CC
+        ,則只可依相同授權條款散佈有關成果。授權的<a href="https://opendatacommons.org/licenses/odbl/1.0/">法律原文</a>詳述您的權責。
+      intro_3_html: 我們地圖影像塊的製圖法以及我們的文件,以<a href="https://creativecommons.org/licenses/by-sa/2.0/deed.zh_TW">創用CC
         姓名標示-相同方式分享 (CC BY-SA) 2.0版</a>條款授權。
       credit_title_html: 如何標明作者是 OpenStreetMap
       credit_1_html: 我們要求您以&ldquo;&copy; OpenStreetMap 貢獻者&rdquo;標明作者。
       credit_2_html: 您亦須清晰註明,有關資料可透過開放資料庫授權條款取得。若使用我們的影像塊,則須註明其製圖法是按 CC-BY-SA 授權。您可以透過連結至<a
-        href="http://www.openstreetmap.org/copyright">此版權頁</a>以作註明。您亦可以指明並直接連結至授權內容
+        href="https://www.openstreetmap.org/copyright">此版權頁</a>以作註明。您亦可以指明並直接連結至授權內容
         (但若您要以資料形式發布 OSM,這是必要條件) 。在無法作出連結的媒體 (如印刷品) ,我們建議你引導你的讀者至 openstreetmap.org
         (如註明 OpenStreetMap 的完整網址) 、opendatacommons.org,及 (如相關的話) creativecommons.org。
       credit_3_html: |-
@@ -1009,18 +1029,17 @@ zh-TW:
       more_title_html: 尋找更多
       more_1_html: |-
         在<a
-        href="http://osmfoundation.org/Licence">OSMF 授權條款頁面</a>與<a
-        href="http://wiki.openstreetmap.org/wiki/Zh-hant:Legal_FAQ">法律上的常見問題</a>中,可閱讀更多關於使用我們的資料,以及如何標明我們是作者的資料。
+        href="https://osmfoundation.org/Licence"> OSMF 授權條款頁面</a>可閱讀更多關於使用我們的資料,以及如何標明我們是作者的資料。
       more_2_html: 雖然 OpenStreetMap 是開放資料,但我們無法為第三方提供免費的地圖 API。詳見我們的<a href="https://operations.osmfoundation.org/policies/api/">API
         使用政策</a>、<a href="https://operations.osmfoundation.org/policies/tiles/">地圖影像塊使用政策</a>及<a
         href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim
         服務使用政策</a>。
       contributors_title_html: 我們的貢獻者
       contributors_intro_html: 我們的貢獻者為成千上萬的人。我們也收納了從國家測繪機構及其他來源等取得的開放版權資料,其中包括:
-      contributors_at_html: <strong>奧地利</strong>:包含來自 <a href="http://data.wien.gv.at/">Stadt
-        Wien</a> (<a href="http://creativecommons.org/licenses/by/3.0/at/deed.zh_TW">CC
-        BY</a>授權) 、<a href="http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
-        Vorarlberg</a>及 Land Tirol (修訂的<a href="http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
+      contributors_at_html: <strong>奧地利</strong>:包含來自 <a href="https://data.wien.gv.at/">Stadt
+        Wien</a> (<a href="https://creativecommons.org/licenses/by/3.0/at/deed.zh_TW">CC
+        BY</a>授權) 、<a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+        Vorarlberg</a>及 Land Tirol (修訂的<a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC-BY
         AT</a>授權) 的資料。
       contributors_ca_html: |-
         <strong>加拿大</strong>:包含來自 GeoBase&reg;,GeoGratis (&copy; Department of Natural
@@ -1031,13 +1050,13 @@ zh-TW:
         <strong>芬蘭</strong>: 包含來自
         National Land Survey of Finland's Topographic Database
         及其他資料集的資料,以
-        <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">NLSFI License</a>授權。
+        <a href="https://www.maanmittauslaitos.fi/en/opendata-licence-version1"> NLSFI License </a>授權。
       contributors_fr_html: |-
         <strong>法國</strong>: 包含來自
         Direction Générale des Impôts 的資料。
       contributors_nl_html: |-
         <strong>荷蘭</strong>: 包含來自&copy; AND data, 2007
-        (<a href="http://www.and.com">www.and.com</a>) 的資料。
+        (<a href="https://www.and.com">www.and.com</a>) 的資料。
       contributors_nz_html: |-
         <strong>紐西蘭</strong>: 包含來自
         Land Information New Zealand (Crown Copyright reserved) 的資料。
@@ -1055,19 +1074,18 @@ zh-TW:
         2010-12) 的資料。
       contributors_footer_1_html: |-
         若需要進一步詳情,以及其他曾用以協助改進
-         OpenStreetMap 的資料來源,請參閱 OpenStreetMap Wiki 上的 <a
-        href="http://wiki.openstreetmap.org/wiki/Contributors">貢獻者
+         OpenStreetMap 的資料來源,請參閱 OpenStreetMap Wiki 上的<a
+        href="https://wiki.openstreetmap.org/wiki/Contributors">貢獻者
         頁面</a>。
       contributors_footer_2_html: OpenStreetMap 收錄一項資料,並不意味原本的資料提供者認可 OpenStreetMap、提供任何保證或承擔任何法律責任。
       infringement_title_html: 侵犯版權
       infringement_1_html: OSM 的貢獻者會被提醒,絕不要在沒有版權所有人的明確淮許下,加入來自任何有版權的來源的資料 (如 Google
         地圖或印刷地圖)。
-      infringement_2_html: 如果你認為有版權的材料被不恰當地加入到 OpenStreetMap 資料庫或此網站,請請參考我們的<a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我們的<a
+      infringement_2_html: 如果你認為有版權的材料被不恰當地加入到 OpenStreetMap 資料庫或此網站,請請參考我們的<a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">撤除程序</a>,或直接在我們的<a
         href="http://dmca.openstreetmap.org/">網上申報頁面</a>提出。
       trademarks_title_html: <span id="trademarks"></span>商標
-      trademarks_1_html: 開放街圖、放大鏡logo和開放街圖研討會是開放街圖基金會的註冊商標。如果你對於使用這些商標有疑問的話,請將你的問題寄到<a
-        href="http://wiki.osmfoundation.org/wiki/Licensing_Working_Group">授權條款工作小組
-        (Licence Working Group)</a>。
+      trademarks_1_html: OpenStreetMap、放大鏡標誌和 OpenStreetMap 研討會是 OpenStreetMap 基金會的註冊商標。如果你對於使用這些商標有疑問的話,請查看我們的<a
+        href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">商標方針</a>。
   welcome_page:
     title: 歡迎!
     introduction_html: 歡迎來到 OpenStreetMap,自由和可編輯的世界地圖。您目前已經登入,可以開始繪製地圖。這裡有一份您須知道最重要事項的快速指南。
@@ -1087,8 +1105,8 @@ zh-TW:
       tag_html: <strong>標籤</strong>是關於節點或路徑的簡要資料,例如餐廳的名字或道路的速度限制。
     rules:
       title: 規則!
-      paragraph_1_html: 開放街圖沒有多少正式規則,除了所有參與者都得與社群合作和溝通。如果你有想過用人工以外的方式參與的話,請先熟讀和遵循<a
-        href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>匯入</a>以及<a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自動化編輯</a>守則。
+      paragraph_1_html: OpenStreetMap 沒有多少正式規則,除了所有參與者都得與社群合作和溝通。如果你有想過用人工以外的方式參與的話,請先熟讀和遵循<a
+        href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>匯入</a>以及<a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>自動化編輯</a>守則。
     questions:
       title: 有任何問題嗎?
       paragraph_1_html: OpenStreetMap 有一些資源,可用於學習本專案、提出和回答問題,以及討論和紀錄與製作地圖相關的話題。 <a
@@ -1112,7 +1130,7 @@ zh-TW:
     other_concerns:
       title: 其他問題
       explanation_html: 如果您對我們的資料如何被應用或有關的內容有任何問題,請參閱我們的<a href='/copyright'>版權頁</a>瞭解更多法律資訊,或聯絡適當的<a
-        href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF 工作小組</a>。
+        href='https://wiki.osmfoundation.org/wiki/Working_Groups'> OSMF 工作小組</a>。
   help_page:
     title: 取得協助
     introduction: OpenStreetMap 有一些資源,可用於學習本專案、提出和回答問題,以及討論和紀錄與製作地圖相關的話題。
@@ -1121,7 +1139,7 @@ zh-TW:
       title: 歡迎來到開放街圖
       description: 這個快速指南涵蓋了開放街圖的基礎知識。
     beginners_guide:
-      url: http://wiki.openstreetmap.org/wiki/Zh-hant:Beginners%27_guide
+      url: https://wiki.openstreetmap.org/wiki/Zh-hant:Beginners%27_guide
       title: 新手指南
       description: 社群維護的新手指南
     help:
@@ -1141,7 +1159,7 @@ zh-TW:
       title: switch2osm
       description: 協助公司與組織改用 OpenStreetMap 為基礎的地圖與相關服務。
     wiki:
-      url: http://wiki.openstreetmap.org/
+      url: https://wiki.openstreetmap.org/
       title: wiki.openstreetmap.org
       description: 瀏覽 wiki,取得詳盡的 OSM 文件。
   about_page:
@@ -1157,16 +1175,16 @@ zh-TW:
     community_driven_title: 社群推動
     community_driven_html: |-
       OpenStreetMap 的社群多元化、懷有熱情,而且日益壯大。我們的貢獻者包括地圖製作愛好者,地理訊息系統的專業人員,提供 OSM 伺服器的工程師,為受災害影響區域製圖的人道主義志願人士,以及其他各界人士。
-      想進一步了解這個社群,請參閱<a href='%{diary_path}'>使用者日記</a>,
-      <a href='http://blogs.openstreetmap.org/'>社群部落格</a>,以及<a href='http://www.osmfoundation.org/'>OSM 基金會</a> 網站。
+      想進一步了解這個社群,請參閱<a href='https://blog.openstreetmap.org'> OpenStreetMap 部落格</a>、<a href='%{diary_path}'>使用者日記</a>,
+      <a href='https://blogs.openstreetmap.org/'>社群部落格</a>,以及<a href='https://www.osmfoundation.org/'> OSM 基金會</a> 網站。
     open_data_title: 開放資料
     open_data_html: OpenStreetMap 是<i>開放資料</i>的:您可以自由地使用作任何用途,前提是您須標明作者為 OpenStreetMap
       及其貢獻者。若您在我們的資料上作修改或以之透過某些方式衍生其他資料,則只可依相同授權條款散佈有關成果。詳情請參閱<a href='%{copyright_path}'>版權及授權條款頁面</a>。
     legal_title: 法律資訊
-    legal_html: "本站以及許多相關的服務正式由<a href='http://osmfoundation.org/'>OpenStreetMap 基金會</a>
-      (OSMF) 代表社群所營運。所有使用的OSMF運行服務皆符合我們的<a href=\"http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">可接受使用政策</a>和<a
-      href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">隱私政策</a>\n<br> \n若您有任何授權、版權或其他法律諮詢與問題,請<a
-      href='http://osmfoundation.org/Contact'>聯絡 OSMF</a>。"
+    legal_html: "本站以及許多相關的服務正式由<a href='https://osmfoundation.org/'>OpenStreetMap
+      基金會</a>(OSMF)代表社群所營運。所有使用的OSMF運行服務皆符合我們的<a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">可接受使用政策</a>和<a
+      href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">隱私政策</a>\n<br> \n若您有任何授權、版權或其他法律諮詢與問題,請<a
+      href='https://osmfoundation.org/Contact'>聯絡 OSMF</a>。"
     partners_title: 合作夥伴
   notifier:
     diary_comment_notification:
@@ -1341,12 +1359,11 @@ zh-TW:
       user_page_link: 使用者頁面
       anon_edits_link_text: 瞭解為什麼這很重要。
       flash_player_required: 您需要 Flash player 才能使用 Potlatch,OpenStreetMap Flash 編輯器。您可以<a
-        href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">在
-        Adobe.com 下載 Flash Player</a>。<a href="http://wiki.openstreetmap.org/wiki/Editing">還有其他許多選擇</a>也可以編輯
-        OpenStreetMap。
+        href="https://get.adobe.com/flashplayer/">在 Adobe.com 下載 Flash Player</a>。<a
+        href="https://wiki.openstreetmap.org/wiki/Editing">還有其他許多選擇</a>也可以編輯 OpenStreetMap。
       potlatch_unsaved_changes: 您還有未儲存的變更。 (要在 Potlatch 中儲存,您應該取消選擇目前的路徑或節點 (如果是在清單模式編輯),或是點選儲存
         (如果有儲存按鈕)。)
-      potlatch2_not_configured: Potlatch 2 尚未設定 - 請參閱 http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+      potlatch2_not_configured: Potlatch 2 尚未設定 - 請參閱 https://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
         以取得更多資訊
       potlatch2_unsaved_changes: 您有未儲存的更改。 (要在 Potlatch 2 中儲存,您應按一下儲存。)
       id_not_configured: iD 尚未設定
@@ -1360,7 +1377,7 @@ zh-TW:
       get_directions_title: 尋找兩點之間的路線
       from: 來自
       to: 到
-      where_am_i: 我在哪裡?
+      where_am_i: 這是哪裡?
       where_am_i_title: 使用搜尋引擎描述目前的位置
       submit_text: 出發
     key:
@@ -1437,7 +1454,7 @@ zh-TW:
       edit: 編輯
       preview: 預覽
     markdown_help:
-      title_html: 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: 使用 <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
         解析
       headings: 標題
       heading: 標題
@@ -1538,7 +1555,7 @@ zh-TW:
       public_traces_from: '%{user} 的公開 GPS 軌跡'
       description: 瀏覽最近的 GPS 軌跡上傳
       tagged_with: 有如下標籤:%{tags}
-      empty_html: 還沒有軌跡。<a href='%{upload_link}'>上傳新的軌跡</a>或在 <a href='http://wiki.openstreetmap.org/wiki/Zh-hant:Beginners_Guide_1.2'>wiki
+      empty_html: 還沒有軌跡。<a href='%{upload_link}'>上傳新的軌跡</a>或在 <a href='https://wiki.openstreetmap.org/wiki/Zh-hant:Beginners_Guide_1.2'>wiki
         頁面</a>上瞭解更多有關 GPS 軌跡的資訊。
     delete:
       scheduled_for_deletion: 軌跡已被排程刪除
@@ -1727,11 +1744,11 @@ zh-TW:
         html: |-
           <p>與其他地圖不同,OpenStreetMap 是完全由像你一樣的人們建立的,而且任何人都可自由地修正、更新、下載和使用。</p>
           <p>請註冊以開始貢獻吧。我們將發出電子郵件以確認你的帳號。</p>
-      license_agreement: 當您確認您的帳號,您需要同意<a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">貢獻者條款</a>
+      license_agreement: 當您確認您的帳號,您需要同意<a href="https://www.osmfoundation.org/wiki/License/Contributor_Terms">貢獻者條款</a>
         。
       email address: 電子郵件地址:
       confirm email address: 確認電子郵件地址:
-      not displayed publicly: 您的地址未公開顯示,請看我們的<a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy"
+      not displayed publicly: 您的地址未公開顯示,請看我們的<a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy"
         title="包含部份電郵地址的OSMF隱私權政策">隱私權政策</a>來獲得更多訊息
       display name: 顯示名稱:
       display name description: 您公開顯示的使用者名稱。您可以稍後在偏好設定中改變它。
@@ -1840,21 +1857,20 @@ zh-TW:
       email never displayed publicly: (永遠不公開顯示)
       external auth: 外部認證:
       openid:
-        link: HTTP://wiki.openstreetmap.org/wiki/OpenID
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: 這是什麼?
       public editing:
         heading: 公開編輯:
         enabled: 已開啟。非匿名且可以編輯資料。
-        enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: 這是什麼?
         disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
         disabled link text: 為什麼我不能編輯?
       public editing note:
         heading: 公開編輯
         text: 目前您的編輯是匿名的,人們不能發送郵件給您或看到您的位置。為了顯示你的編輯,讓別人透過網站與您聯繫,請點選下面的按鈕。 <b>由於 0.6
-          API 的轉換,只有公開的使用者可以編輯地圖資料</b> 。  ( <a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">知道為什麼</a>
-          ) 。 <ul><li>您的電子郵件地址將不會被因為成為公開使用者而被透露。 </li><li>這個動作不能逆轉,所有新的使用者現在都預設為公開的。
-          </li></ul>
+          API 的轉換,只有公開的使用者可以編輯地圖資料</b>。(<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">知道為什麼</a>)。<ul><li>您的電子郵件地址將不會被因為成為公開使用者而被透露。
+          </li><li>這個動作不能逆轉,所有新的使用者現在都預設為公開的。 </li></ul>
       contributor terms:
         heading: 貢獻者條款:
         agreed: 您已同意新的貢獻者條款。
@@ -1957,6 +1973,7 @@ zh-TW:
       not_a_role: 字串 "%{role}" 不是有效的身份。
       already_has_role: 這個使用者已經有 %{role} 身份。
       doesnt_have_role: 這個使用者沒有 %{role} 身份。
+      not_revoke_admin_current_user: 無法撤銷目前使用者的管理員身份。
     grant:
       title: 確認授與身份
       heading: 確認授與身份
@@ -2161,7 +2178,8 @@ zh-TW:
         unhide_comment: 取消隱藏
     notes:
       new:
-        intro: 發現錯誤或缺少些什麼東西嗎?請告訴其他地圖製作者以便於我們處理。將標記移動到正確的位置並輸入註記,以解釋問題。 (切勿在此輸入個人資料、抄襲自其他地圖的資訊,或者目錄清單。)
+        intro: 發現錯誤或缺少些什麼東西嗎?請告訴其他地圖製作者以便於我們處理。將標記移動到正確的位置並輸入註記,以解釋問題。
+        advice: 您的註記已公開並可用於更新地圖,因此請不要輸入個人訊息,或是來自於具版權保護地圖的訊息以及目錄清單。
         add: 送出註記
       show:
         anonymous_warning: 此項註記包含來自匿名使用者的評論,應作獨立核實。
@@ -2181,9 +2199,6 @@ zh-TW:
         mapquest_car: 開車 (MapQuest)
         mapquest_foot: 徒步 (MapQuest)
         osrm_car: 開車 (OSRM)
-        mapzen_bicycle: 腳踏車 (Mapzen)
-        mapzen_car: 開車 (Mapzen)
-        mapzen_foot: 徒步 (Mapzen)
       descend: 下降
       directions: 路線
       distance: 距離
@@ -2237,7 +2252,7 @@ zh-TW:
     context:
       directions_from: 從這裡的路線
       directions_to: 到這裡的路線
-      add_note: å\9c¨æ­¤æ\96°å¢\9e註解
+      add_note: å\9c¨æ­¤æ\96°å¢\9e註è¨\98
       show_address: 顯示地址
       query_features: 查詢圖徵
       centre_map: 中央地圖在此
index 5be81b69533d6854549cc185416190567e5c7630..3232e27411fe4181c198d425e743042c86bb76b1 100644 (file)
@@ -19,9 +19,7 @@ class MoveToInnodb < ActiveRecord::Migration[5.0]
       # current version to something less so that we can update the version in
       # batches of 10000
       tbl.classify.constantize.update_all(:version => -1)
-      while tbl.classify.constantize.where(:version => -1).count > 0
-        tbl.classify.constantize.update_all("version=(SELECT max(version) FROM #{tbl} WHERE #{tbl}.id = current_#{tbl}.id)", { :version => -1 }, { :limit => 10000 })
-      end
+      tbl.classify.constantize.update_all("version=(SELECT max(version) FROM #{tbl} WHERE #{tbl}.id = current_#{tbl}.id)", { :version => -1 }, { :limit => 10000 }) while tbl.classify.constantize.where(:version => -1).count > 0
       # execute "UPDATE current_#{tbl} SET version = " +
       #  "(SELECT max(version) FROM #{tbl} WHERE #{tbl}.id = current_#{tbl}.id)"
       # The above update causes a MySQL error:
index f12683d3c4831cd99db1ecb51ebb29245989e48a..1fc5dc69698a238821e125d2ae2f26d1dff485bf 100644 (file)
@@ -18,23 +18,17 @@ class BoundingBox
   end
 
   def self.from_bbox_params(params)
-    if params[:bbox] && params[:bbox].count(",") == 3
-      bbox_array = params[:bbox].split(",")
-    end
+    bbox_array = params[:bbox].split(",") if params[:bbox] && params[:bbox].count(",") == 3
     from_bbox_array(bbox_array)
   end
 
   def self.from_lon_lat_params(params)
-    if params[:minlon] && params[:minlat] && params[:maxlon] && params[:maxlat]
-      bbox_array = [params[:minlon], params[:minlat], params[:maxlon], params[:maxlat]]
-    end
+    bbox_array = [params[:minlon], params[:minlat], params[:maxlon], params[:maxlat]] if params[:minlon] && params[:minlat] && params[:maxlon] && params[:maxlat]
     from_bbox_array(bbox_array)
   end
 
   def self.from_lrbt_params(params)
-    if params[:l] && params[:b] && params[:t] && params[:t]
-      bbox_array = [params[:l], params[:b], params[:r], params[:t]]
-    end
+    bbox_array = [params[:l], params[:b], params[:r], params[:t]] if params[:l] && params[:b] && params[:t] && params[:t]
     from_bbox_array(bbox_array)
   end
 
@@ -65,12 +59,8 @@ class BoundingBox
 
   def check_boundaries
     # check the bbox is sane
-    if min_lon > max_lon
-      raise OSM::APIBadBoundingBox, "The minimum longitude must be less than the maximum longitude, but it wasn't"
-    end
-    if min_lat > max_lat
-      raise OSM::APIBadBoundingBox, "The minimum latitude must be less than the maximum latitude, but it wasn't"
-    end
+    raise OSM::APIBadBoundingBox, "The minimum longitude must be less than the maximum longitude, but it wasn't" if min_lon > max_lon
+    raise OSM::APIBadBoundingBox, "The minimum latitude must be less than the maximum latitude, but it wasn't" if min_lat > max_lat
     if min_lon < -LON_LIMIT || min_lat < -LAT_LIMIT || max_lon > +LON_LIMIT || max_lat > +LAT_LIMIT
       raise OSM::APIBadBoundingBox, "The latitudes must be between #{-LAT_LIMIT} and #{LAT_LIMIT}," \
                                        " and longitudes between #{-LON_LIMIT} and #{LON_LIMIT}"
@@ -166,9 +156,7 @@ class BoundingBox
     private
 
     def from_bbox_array(bbox_array)
-      unless bbox_array
-        raise OSM::APIBadUserInput, "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat"
-      end
+      raise OSM::APIBadUserInput, "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat" unless bbox_array
       # Take an array of length 4, create a bounding box with min_lon, min_lat, max_lon and
       # max_lat within their respective boundaries.
       min_lon = [[bbox_array[0].to_f, -LON_LIMIT].max, +LON_LIMIT].min
index 94c41a6d57751be96c3497fb99ffefb7d85e4229..cb553bfbcad71a095c0940f61b3fb5341d1d4712 100644 (file)
@@ -60,9 +60,7 @@ class DiffReader
           attributes = {}
 
           if @reader.has_attributes?
-            while @reader.move_to_next_attribute == 1
-              attributes[@reader.name] = @reader.value
-            end
+            attributes[@reader.name] = @reader.value while @reader.move_to_next_attribute == 1
 
             @reader.move_to_element
           end
@@ -112,9 +110,7 @@ class DiffReader
   # such as save_ and delete_with_history.
   def check(model, xml, new)
     raise OSM::APIBadXMLError.new(model, xml) if new.nil?
-    unless new.changeset_id == @changeset.id
-      raise OSM::APIChangesetMismatchError.new(new.changeset_id, @changeset.id)
-    end
+    raise OSM::APIChangesetMismatchError.new(new.changeset_id, @changeset.id) unless new.changeset_id == @changeset.id
   end
 
   ##
index 2a856a98106952ec1e69029f6d96a588a150a3e4..fc0be86440ffda3b5882b77ded5cc5c9a8911838 100644 (file)
@@ -47,6 +47,7 @@ module Potlatch2
     "it" => "it_IT",
     "ja" => "ja_JP",
     "ka" => "ka",
+    "kab" => "kab",
     "km" => "km",
     "kn" => "kn",
     "ko" => "ko",
@@ -59,6 +60,7 @@ module Potlatch2
     "lt" => "lt",
     "lv" => "lv",
     "lzz" => "lzz",
+    "mg" => "mg",
     "mk" => "mk",
     "mr" => "mr",
     "ms" => "ms",
@@ -78,6 +80,7 @@ module Potlatch2
     "sah" => "sah",
     "scn" => "scn",
     "sk" => "sk",
+    "skr" => "skr-arab",
     "sl" => "sl",
     "sq" => "sq",
     "sr" => "sr-ec",
index 5e933f48a39151360ad45616866d13e8cbecb3c1..6bd05f5ce7fb58a74ad013c95f23f9d8d3e822c7 100644 (file)
@@ -52,9 +52,7 @@ module SessionPersistence
 
   # Filter callback
   def persist_session
-    if session[session_persistence_key]
-      request.session_options[:expire_after] = session[session_persistence_key]
-    end
+    request.session_options[:expire_after] = session[session_persistence_key] if session[session_persistence_key]
   rescue StandardError
     reset_session
   end
index 924698c7fb115584a78dc11e2bd2dff87ba45f23..c9b384cfe48e8ee9c4067949759dd20021bf5cd9 100644 (file)
@@ -1,5 +1,5 @@
 task "test" do
-  Rails::TestUnit::Runner.rake_run(["test/system"])
+  Rails::TestUnit::Runner.rake_run(["test/system"]) unless ENV.key?("TEST")
 end
 
 namespace :test do
index 669cae37d5c1887b81fdf16a66c6c9c7322dc559..a8029a905d5dc8ddb3797508f55ecf65257d788c 100644 (file)
@@ -2,6 +2,6 @@
 <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
 
 <cross-domain-policy>
-       <allow-access-from domain="*"/>
-       <allow-http-request-headers-from domain="*" headers="*"/>
+       <allow-access-from domain="*" secure="false"/>
+       <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
 </cross-domain-policy>
index 669cae37d5c1887b81fdf16a66c6c9c7322dc559..a8029a905d5dc8ddb3797508f55ecf65257d788c 100644 (file)
@@ -2,6 +2,6 @@
 <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
 
 <cross-domain-policy>
-       <allow-access-from domain="*"/>
-       <allow-http-request-headers-from domain="*" headers="*"/>
+       <allow-access-from domain="*" secure="false"/>
+       <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
 </cross-domain-policy>
index 46f9642e7f60ea5bd9d2b7b16d6d5f7100149356..15a9fbdc7f613f7d14cb9b6119a6dc7719d39afc 100755 (executable)
@@ -25,7 +25,9 @@ exit 0 if date < 1.month.ago
 
 message.update(:message_read => true) if message
 
-mail = Mail.new(STDIN.readlines.join)
+mail = Mail.new(STDIN.read
+                     .encode(:universal_newline => true)
+                     .encode(:crlf_newline => true))
 
 message = Message.from_mail(mail, from, to)
 message.save!
index 83ef03bbf95cc4fb1d31dc1d2169eb5c6153d1d7..bd7a518843ef8237fa6140773e199e2fa0f92818 100644 (file)
@@ -1,8 +1,9 @@
 require "test_helper"
 require "stringio"
-include Potlatch
 
 class AmfControllerTest < ActionController::TestCase
+  include Potlatch
+
   ##
   # test all routes which lead to this controller
   def test_routes
@@ -730,8 +731,8 @@ class AmfControllerTest < ActionController::TestCase
     # This node has no tags
 
     # create a node with random lat/lon
-    lat = rand(100) - 50 + rand
-    lon = rand(100) - 50 + rand
+    lat = rand(-50..49) + rand
+    lon = rand(-50..49) + rand
 
     changeset = create(:changeset)
     user = changeset.user
@@ -770,8 +771,8 @@ class AmfControllerTest < ActionController::TestCase
     # This node has some tags
 
     # create a node with random lat/lon
-    lat = rand(100) - 50 + rand
-    lon = rand(100) - 50 + rand
+    lat = rand(-50..49) + rand
+    lon = rand(-50..49) + rand
 
     amf_content "putpoi", "/2", ["#{user.email}:test", changeset.id, nil, nil, lon, lat, { "key" => "value", "ping" => "pong" }, nil]
     post :amf_write
@@ -811,8 +812,8 @@ class AmfControllerTest < ActionController::TestCase
     # This node has no tags
 
     # create a node with random lat/lon
-    lat = rand(100) - 50 + rand
-    lon = rand(100) - 50 + rand
+    lat = rand(-50..49) + rand
+    lon = rand(-50..49) + rand
 
     changeset = create(:changeset)
     user = changeset.user
@@ -847,8 +848,8 @@ class AmfControllerTest < ActionController::TestCase
     # This node has no tags
 
     # create a node with random lat/lon
-    lat = rand(100) - 50 + rand
-    lon = rand(100) - 50 + rand
+    lat = rand(-50..49) + rand
+    lon = rand(-50..49) + rand
 
     changeset = create(:changeset)
     user = changeset.user
index a0f7960c31b7197702ac2927734853e7996c13b3..5205714df9171ca72232ce460438b4fe72a0c3db 100644 (file)
@@ -812,9 +812,7 @@ CHANGESET
     assert_equal 2, Node.find(new_node_id).tags.size, "new node should have two tags"
     assert_equal [new_node_id, node.id], Way.find(way.id).nds, "way nodes should match"
     Relation.find(relation.id).members.each do |type, id, _role|
-      if type == "node"
-        assert_equal new_node_id, id, "relation should contain new node"
-      end
+      assert_equal new_node_id, id, "relation should contain new node" if type == "node"
     end
   end
 
index 1fdb3f90728c92b88615b483a7e206653f454dfb..5f737f798a57c26a0a102739bfe62a013baa2ed7 100644 (file)
@@ -33,8 +33,8 @@ class NodeControllerTest < ActionController::TestCase
     changeset = create(:changeset, :user => user)
 
     # create a node with random lat/lon
-    lat = rand(100) - 50 + rand
-    lon = rand(100) - 50 + rand
+    lat = rand(-50..50) + rand
+    lon = rand(-50..50) + rand
 
     ## First try with no auth
     # create a minimal xml file
@@ -455,7 +455,7 @@ class NodeControllerTest < ActionController::TestCase
     end
 
     # check error when a non-existent node is included
-    get :nodes, :params => { :nodes => "#{node1.id},#{node2.id},#{node3.id},#{node4.id},#{node5.id},400" }
+    get :nodes, :params => { :nodes => "#{node1.id},#{node2.id},#{node3.id},#{node4.id},#{node5.id},0" }
     assert_response :not_found
   end
 
index f90b6b58e6562f29bb9e8139440977a8069d2dc6..8a7e8b2fe2b6bcf212c804e19ace3df7475e8efd 100644 (file)
@@ -188,7 +188,7 @@ class RelationControllerTest < ActionController::TestCase
     end
 
     # check error when a non-existent relation is included
-    get :relations, :params => { :relations => "#{relation1.id},#{relation2.id},#{relation3.id},#{relation4.id},400" }
+    get :relations, :params => { :relations => "#{relation1.id},#{relation2.id},#{relation3.id},#{relation4.id},0" }
     assert_response :not_found
   end
 
index f73fc9056293571f54845211fb60575cf664fcb0..f9e32140621081672573fd07ae88477a9ba5a998 100644 (file)
@@ -134,5 +134,10 @@ class UserRolesControllerTest < ActionController::TestCase
     end
     assert_redirected_to user_path(target_user.display_name)
     assert_equal "The string `no_such_role' is not a valid role.", flash[:error]
+
+    # Revoking administrator role from current user should fail
+    post :revoke, :params => { :display_name => administrator_user.display_name, :role => "administrator" }
+    assert_redirected_to user_path(administrator_user.display_name)
+    assert_equal "Cannot revoke administrator role from current user.", flash[:error]
   end
 end
index 285efe2691637cffab638d118f73dd1d34579c3d..3d466de8bbfca3893c9182173b7255c8f1f81e8b 100644 (file)
@@ -105,7 +105,7 @@ class WayControllerTest < ActionController::TestCase
     end
 
     # check error when a non-existent way is included
-    get :ways, :params => { :ways => "#{way1.id},#{way2.id},#{way3.id},#{way4.id},400" }
+    get :ways, :params => { :ways => "#{way1.id},#{way2.id},#{way3.id},#{way4.id},0" }
     assert_response :not_found
   end
 
index 13f65c97690f2ee8320c8eef71eed0e525a30ec1..e313858e5ee0805122a2f8220fdf3bc3d629dc4f 100644 (file)
@@ -104,7 +104,7 @@ class BrowseHelperTest < ActionView::TestCase
 
   def test_format_key
     html = format_key("highway")
-    assert_dom_equal "<a href=\"http://wiki.openstreetmap.org/wiki/Key:highway?uselang=en\" title=\"The wiki description page for the highway tag\">highway</a>", html
+    assert_dom_equal "<a href=\"https://wiki.openstreetmap.org/wiki/Key:highway?uselang=en\" title=\"The wiki description page for the highway tag\">highway</a>", html
 
     html = format_key("unknown")
     assert_dom_equal "unknown", html
@@ -112,7 +112,7 @@ class BrowseHelperTest < ActionView::TestCase
 
   def test_format_value
     html = format_value("highway", "primary")
-    assert_dom_equal "<a href=\"http://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=en\" title=\"The wiki description page for the highway=primary tag\">primary</a>", html
+    assert_dom_equal "<a href=\"https://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=en\" title=\"The wiki description page for the highway=primary tag\">primary</a>", html
 
     html = format_value("highway", "unknown")
     assert_dom_equal "unknown", html
@@ -124,7 +124,7 @@ class BrowseHelperTest < ActionView::TestCase
     assert_dom_equal "<a href=\"tel:+1234567890\" title=\"Call +1234567890\">+1234567890</a>", html
 
     html = format_value("wikipedia", "Test")
-    assert_dom_equal "<a title=\"The Test article on Wikipedia\" href=\"http://en.wikipedia.org/wiki/Test?uselang=en\">Test</a>", html
+    assert_dom_equal "<a title=\"The Test article on Wikipedia\" href=\"https://en.wikipedia.org/wiki/Test?uselang=en\">Test</a>", html
 
     html = format_value("wikidata", "Q42")
     assert_dom_equal "<a title=\"The Q42 item on Wikidata\" href=\"//www.wikidata.org/wiki/Q42?uselang=en\">Q42</a>", html
@@ -165,26 +165,26 @@ class BrowseHelperTest < ActionView::TestCase
 
   def test_wiki_link
     link = wiki_link("key", "highway")
-    assert_equal "http://wiki.openstreetmap.org/wiki/Key:highway?uselang=en", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/Key:highway?uselang=en", link
 
     link = wiki_link("tag", "highway=primary")
-    assert_equal "http://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=en", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=en", link
 
     I18n.locale = "de"
 
     link = wiki_link("key", "highway")
-    assert_equal "http://wiki.openstreetmap.org/wiki/DE:Key:highway?uselang=de", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/DE:Key:highway?uselang=de", link
 
     link = wiki_link("tag", "highway=primary")
-    assert_equal "http://wiki.openstreetmap.org/wiki/DE:Tag:highway=primary?uselang=de", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/DE:Tag:highway=primary?uselang=de", link
 
     I18n.locale = "tr"
 
     link = wiki_link("key", "highway")
-    assert_equal "http://wiki.openstreetmap.org/wiki/Tr:Key:highway?uselang=tr", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/Tr:Key:highway?uselang=tr", link
 
     link = wiki_link("tag", "highway=primary")
-    assert_equal "http://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=tr", link
+    assert_equal "https://wiki.openstreetmap.org/wiki/Tag:highway=primary?uselang=tr", link
   end
 
   def test_wikidata_links
@@ -268,33 +268,33 @@ class BrowseHelperTest < ActionView::TestCase
     assert_nil link
 
     link = wikipedia_link("wikipedia", "Test")
-    assert_equal "http://en.wikipedia.org/wiki/Test?uselang=en", link[:url]
+    assert_equal "https://en.wikipedia.org/wiki/Test?uselang=en", link[:url]
     assert_equal "Test", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Test")
-    assert_equal "http://de.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
     assert_equal "de:Test", link[:title]
 
     link = wikipedia_link("wikipedia:fr", "de:Test")
-    assert_equal "http://fr.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
+    assert_equal "https://fr.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
     assert_equal "de:Test", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Englischer Garten (München)#Japanisches Teehaus")
-    assert_equal "http://de.wikipedia.org/wiki/de:Englischer Garten (München)?uselang=en#Japanisches_Teehaus", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/de:Englischer Garten (München)?uselang=en#Japanisches_Teehaus", link[:url]
     assert_equal "de:Englischer Garten (München)#Japanisches Teehaus", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Alte Brücke (Heidelberg)#Brückenaffe")
-    assert_equal "http://de.wikipedia.org/wiki/de:Alte Brücke (Heidelberg)?uselang=en#Br.C3.BCckenaffe", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/de:Alte Brücke (Heidelberg)?uselang=en#Br.C3.BCckenaffe", link[:url]
     assert_equal "de:Alte Brücke (Heidelberg)#Brückenaffe", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus")
-    assert_equal "http://de.wikipedia.org/wiki/de:Liste der Baudenkmäler in Eichstätt?uselang=en#Br.C3.BCckenstra.C3.9Fe_1.2C_Ehemaliges_Bauernhaus", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/de:Liste der Baudenkmäler in Eichstätt?uselang=en#Br.C3.BCckenstra.C3.9Fe_1.2C_Ehemaliges_Bauernhaus", link[:url]
     assert_equal "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus", link[:title]
 
     I18n.locale = "pt-BR"
 
     link = wikipedia_link("wikipedia", "zh-classical:Test#Section")
-    assert_equal "http://zh-classical.wikipedia.org/wiki/zh-classical:Test?uselang=pt-BR#Section", link[:url]
+    assert_equal "https://zh-classical.wikipedia.org/wiki/zh-classical:Test?uselang=pt-BR#Section", link[:url]
     assert_equal "zh-classical:Test#Section", link[:title]
 
     link = wikipedia_link("foo", "Test")
diff --git a/test/integration/compressed_requests_test.rb b/test/integration/compressed_requests_test.rb
new file mode 100644 (file)
index 0000000..6ea875a
--- /dev/null
@@ -0,0 +1,181 @@
+require "test_helper"
+
+class CompressedRequestsTest < ActionDispatch::IntegrationTest
+  def test_no_compression
+    user = create(:user)
+    changeset = create(:changeset, :user => user)
+
+    node = create(:node)
+    way = create(:way)
+    relation = create(:relation)
+    other_relation = create(:relation)
+    # Create some tags, since we test that they are removed later
+    create(:node_tag, :node => node)
+    create(:way_tag, :way => way)
+    create(:relation_tag, :relation => relation)
+
+    # simple diff to change a node, way and relation by removing
+    # their tags
+    diff = <<CHANGESET.strip_heredoc
+      <osmChange>
+       <modify>
+        <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
+        <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
+         <nd ref='#{node.id}'/>
+        </way>
+       </modify>
+       <modify>
+        <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
+         <member type='way' role='some' ref='#{way.id}'/>
+         <member type='node' role='some' ref='#{node.id}'/>
+         <member type='relation' role='some' ref='#{other_relation.id}'/>
+        </relation>
+       </modify>
+      </osmChange>
+CHANGESET
+
+    # upload it
+    post "/api/0.6/changeset/#{changeset.id}/upload",
+         :params => diff,
+         :headers => {
+           "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
+           "HTTP_CONTENT_TYPE" => "application/xml"
+         }
+    assert_response :success,
+                    "can't upload an uncompressed diff to changeset: #{@response.body}"
+
+    # check that the changes made it into the database
+    assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
+    assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
+    assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
+  end
+
+  def test_gzip_compression
+    user = create(:user)
+    changeset = create(:changeset, :user => user)
+
+    node = create(:node)
+    way = create(:way)
+    relation = create(:relation)
+    other_relation = create(:relation)
+    # Create some tags, since we test that they are removed later
+    create(:node_tag, :node => node)
+    create(:way_tag, :way => way)
+    create(:relation_tag, :relation => relation)
+
+    # simple diff to change a node, way and relation by removing
+    # their tags
+    diff = <<CHANGESET.strip_heredoc
+      <osmChange>
+       <modify>
+        <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
+        <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
+         <nd ref='#{node.id}'/>
+        </way>
+       </modify>
+       <modify>
+        <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
+         <member type='way' role='some' ref='#{way.id}'/>
+         <member type='node' role='some' ref='#{node.id}'/>
+         <member type='relation' role='some' ref='#{other_relation.id}'/>
+        </relation>
+       </modify>
+      </osmChange>
+CHANGESET
+
+    # upload it
+    post "/api/0.6/changeset/#{changeset.id}/upload",
+         :params => gzip_content(diff),
+         :headers => {
+           "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
+           "HTTP_CONTENT_ENCODING" => "gzip",
+           "HTTP_CONTENT_TYPE" => "application/xml"
+         }
+    assert_response :success,
+                    "can't upload a gzip compressed diff to changeset: #{@response.body}"
+
+    # check that the changes made it into the database
+    assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
+    assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
+    assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
+  end
+
+  def test_deflate_compression
+    user = create(:user)
+    changeset = create(:changeset, :user => user)
+
+    node = create(:node)
+    way = create(:way)
+    relation = create(:relation)
+    other_relation = create(:relation)
+    # Create some tags, since we test that they are removed later
+    create(:node_tag, :node => node)
+    create(:way_tag, :way => way)
+    create(:relation_tag, :relation => relation)
+
+    # simple diff to change a node, way and relation by removing
+    # their tags
+    diff = <<CHANGESET.strip_heredoc
+      <osmChange>
+       <modify>
+        <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
+        <way id='#{way.id}' changeset='#{changeset.id}' version='1'>
+         <nd ref='#{node.id}'/>
+        </way>
+       </modify>
+       <modify>
+        <relation id='#{relation.id}' changeset='#{changeset.id}' version='1'>
+         <member type='way' role='some' ref='#{way.id}'/>
+         <member type='node' role='some' ref='#{node.id}'/>
+         <member type='relation' role='some' ref='#{other_relation.id}'/>
+        </relation>
+       </modify>
+      </osmChange>
+CHANGESET
+
+    # upload it
+    post "/api/0.6/changeset/#{changeset.id}/upload",
+         :params => deflate_content(diff),
+         :headers => {
+           "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
+           "HTTP_CONTENT_ENCODING" => "deflate",
+           "HTTP_CONTENT_TYPE" => "application/xml"
+         }
+    assert_response :success,
+                    "can't upload a deflate compressed diff to changeset: #{@response.body}"
+
+    # check that the changes made it into the database
+    assert_equal 0, Node.find(node.id).tags.size, "node #{node.id} should now have no tags"
+    assert_equal 0, Way.find(way.id).tags.size, "way #{way.id} should now have no tags"
+    assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags"
+  end
+
+  def test_invalid_compression
+    user = create(:user)
+    changeset = create(:changeset, :user => user)
+
+    # upload it
+    post "/api/0.6/changeset/#{changeset.id}/upload",
+         :params => "",
+         :headers => {
+           "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user.display_name}:test")),
+           "HTTP_CONTENT_ENCODING" => "unknown",
+           "HTTP_CONTENT_TYPE" => "application/xml"
+         }
+    assert_response :unsupported_media_type
+  end
+
+  private
+
+  def gzip_content(uncompressed)
+    compressed = StringIO.new
+    gz = Zlib::GzipWriter.new(compressed)
+    gz.write(uncompressed)
+    gz.close
+    compressed.string
+  end
+
+  def deflate_content(uncompressed)
+    Zlib::Deflate.deflate(uncompressed)
+  end
+end
index 4048d53034863c614a273becad8d97e98db43c08..9381365920a8ab116efbb65ee7cedf2f70bc12ac 100644 (file)
@@ -2,7 +2,7 @@ require "test_helper"
 
 class UserBlocksTest < ActionDispatch::IntegrationTest
   def auth_header(user, pass)
-    { "HTTP_AUTHORIZATION" => format("Basic %s", Base64.encode64("#{user}:#{pass}")) }
+    { "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}")) }
   end
 
   def test_api_blocked
index dcc7fa7e995e8395081544e6861c3842e0260097..7ec7fa7307248e038f47bfa118c5dcd27cfd4297 100644 (file)
@@ -74,7 +74,7 @@ class UserTermsSeenTest < ActionDispatch::IntegrationTest
   private
 
   def auth_header(user, pass)
-    { "HTTP_AUTHORIZATION" => format("Basic %s", Base64.encode64("#{user}:#{pass}")) }
+    { "HTTP_AUTHORIZATION" => format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}")) }
   end
 
   def with_terms_seen(value)
index 689f65097530a481749237099d14f9679a3e5c6a..3aa528ceb819db6244b9e54b7b971d005657cb23 100644 (file)
@@ -24,9 +24,7 @@ class I18nTest < ActiveSupport::TestCase
           end
         end
 
-        if key =~ /^(active(model|record)\.)?errors\./
-          variables.push("attribute")
-        end
+        variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
 
         value = I18n.t(key, :locale => locale, :fallback => true)
 
index 70f69a3ae94a590140eebd1a97fa15f46437775c..c9ec46dcf41cf1b78c9cab334b8027dde167aa0e 100644 (file)
@@ -82,7 +82,7 @@ module ActiveSupport
     ##
     # set request headers for HTTP basic authentication
     def basic_authorization(user, pass)
-      @request.env["HTTP_AUTHORIZATION"] = format("Basic %s", Base64.encode64("#{user}:#{pass}"))
+      @request.env["HTTP_AUTHORIZATION"] = format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}"))
     end
 
     ##
index 7473e0eb783e9756450e32d5b5a4a13ccab45c71..75ea2d0ac61691c50b50f9ac235af000db2c9490 100644 (file)
@@ -161,29 +161,68 @@ input::-moz-focus-inner {
 .cf:after {
     clear: both;
 }
-
-use { pointer-events: none; }
-
 /* base styles */
-.layer-osm path:not(.oneway) { fill: none; }     /* IE needs :not(.oneway) */
+.layer-osm path:not(.oneway-marker-path) {                /* IE/Edge needs :not(.oneway) */
+    fill: none;
+}
+.layer-osm path.viewfield-marker-path {                   /* IE/Edge rule for <use> marker style */
+    fill: #333;
+    fill-opacity: 0.75;
+    stroke: #fff;
+    stroke-width: 0.5px;
+    stroke-opacity: 0.75;
+}
+.fill-wireframe .layer-osm path.viewfield-marker-path {   /* IE/Edge rule for <use> marker style */
+    fill: none;
+}
 
 /* the above fill: none rule affects paths in <use> shadow dom only in Firefox */
 .layer-osm use.icon path { fill: #333; }                       /* FF svg Maki icons */
 .layer-osm .turn use path { fill: #000; }                      /* FF turn restriction icons */
-#turn-only-shape2, #turn-only-u-shape2 { fill: #7092FF; }  /* FF turn-only, turn-only-u */
-#turn-no-shape2, #turn-no-u-shape2     { fill: #E06D5F; }  /* FF turn-no, turn-no-u */
-#turn-yes-shape2, #turn-yes-u-shape2   { fill: #8CD05F; }  /* FF turn-yes, turn-yes-u */
+#turn-only-shape2, #turn-only-u-shape2 { fill: #7092ff; }      /* FF turn-only, turn-only-u */
+#turn-no-shape2, #turn-no-u-shape2     { fill: #e06d5f; }      /* FF turn-no, turn-no-u */
+#turn-yes-shape2, #turn-yes-u-shape2   { fill: #8cd05f; }      /* FF turn-yes, turn-yes-u */
 
-g.point .shadow,
-g.vertex .shadow,
-g.midpoint .shadow {
-    pointer-events: all;
+
+/* No interactivity except what we specifically allow */
+.layer-osm * {
+    pointer-events: none;
 }
 
-path.shadow {
+/* `.target` objects are interactive */
+/* They can be picked up, clicked, hovered, or things can connect to them */
+.node.target {
+    pointer-events: fill;
+    fill-opacity: 0.8;
+    fill: currentColor;
+    stroke: none;
+}
+
+.way.target {
     pointer-events: stroke;
+    fill: none;
+    stroke-width: 12;
+    stroke-opacity: 0.8;
+    stroke: currentColor;
+    stroke-linecap: round;
+    stroke-linejoin: round;
+}
+
+/* `.target-nope` objects are explicitly forbidden to join to */
+.surface:not(.nope-disabled) .node.target.target-nope,
+.surface:not(.nope-disabled) .way.target.target-nope {
+    cursor: not-allowed;
+}
+
+
+/* `.active` objects (currently being drawn or dragged) are not interactive */
+/* This is important to allow the events to drop through to whatever is */
+/* below them on the map, so you can still hover and connect to other things. */
+.layer-osm .active {
+    pointer-events: none !important;
 }
 
+
 /* points */
 
 g.point .stroke {
@@ -208,10 +247,6 @@ g.point.selected .shadow {
     stroke-opacity: 0.7;
 }
 
-g.point.active, g.point.active * {
-    pointer-events: none;
-}
-
 g.point ellipse.stroke {
     display: none;
 }
@@ -251,28 +286,6 @@ g.midpoint .shadow {
     fill-opacity: 0;
 }
 
-g.vertex.vertex-hover {
-    display: none;
-}
-
-.mode-draw-area g.vertex.vertex-hover,
-.mode-draw-line g.vertex.vertex-hover,
-.mode-add-area  g.vertex.vertex-hover,
-.mode-add-line  g.vertex.vertex-hover,
-.mode-add-point g.vertex.vertex-hover,
-.mode-drag-node g.vertex.vertex-hover {
-    display: block;
-}
-
-.mode-draw-area .hover-disabled g.vertex.vertex-hover,
-.mode-draw-line .hover-disabled g.vertex.vertex-hover,
-.mode-add-area  .hover-disabled g.vertex.vertex-hover,
-.mode-add-line  .hover-disabled g.vertex.vertex-hover,
-.mode-add-point .hover-disabled g.vertex.vertex-hover,
-.mode-drag-node .hover-disabled g.vertex.vertex-hover {
-    display: none;
-}
-
 g.vertex.related:not(.selected) .shadow,
 g.vertex.hover:not(.selected) .shadow,
 g.midpoint.related:not(.selected) .shadow,
@@ -284,13 +297,6 @@ g.vertex.selected .shadow {
     fill-opacity: 0.7;
 }
 
-.mode-draw-area g.midpoint,
-.mode-draw-line g.midpoint,
-.mode-add-area g.midpoint,
-.mode-add-line g.midpoint,
-.mode-add-point g.midpoint {
-  display: none;
-}
 
 /* lines */
 
@@ -301,7 +307,7 @@ g.vertex.selected .shadow {
 
 path.line {
     stroke-linecap: round;
-    stroke-linejoin: bevel;
+    stroke-linejoin: round;
 }
 
 path.stroke {
@@ -333,8 +339,7 @@ path.line.stroke {
 /* Labels / Markers */
 
 text {
-    font-size:10px;
-    pointer-events: none;
+    font-size: 10px;
     color: #222;
     opacity: 1;
 }
@@ -343,11 +348,11 @@ text {
     fill: #002F35;
 }
 
-path.oneway {
+.onewaygroup path.oneway,
+.viewfieldgroup path.viewfield {
     stroke-width: 6px;
 }
 
-
 text.arealabel-halo,
 text.linelabel-halo,
 text.pointlabel-halo,
@@ -359,7 +364,6 @@ text.pointlabel {
     font-size: 12px;
     font-weight: bold;
     fill: #333;
-    pointer-events: none;
     -webkit-transition: opacity 100ms linear;
     transition: opacity 100ms linear;
     -moz-transition: opacity 100ms linear;
@@ -373,14 +377,14 @@ text.pointlabel {
   dominant-baseline: auto;
 }
 
-.layer-halo text {
+.layer-labels-halo text {
     opacity: 0.7;
     stroke: #fff;
     stroke-width: 5px;
     stroke-miterlimit: 1;
 }
 
-text.proximate {
+text.nolabel {
     opacity: 0;
 }
 
@@ -410,8 +414,8 @@ g.turn circle {
 }
 
 .form-field-restrictions .vertex {
-    pointer-events: none;
     cursor: auto !important;
+    pointer-events: none;
 }
 
 .lasso #map {
@@ -425,15 +429,30 @@ g.turn circle {
 }
 
 path.gpx {
-    stroke: #FF26D4;
+    stroke: #ff26d4;
     stroke-width: 2;
     fill: none;
 }
 
-text.gpx {
-    fill: #FF26D4;
+text.gpxlabel-halo,
+text.gpxlabel {
+    font-size: 10px;
+    font-weight: bold;
+    dominant-baseline: middle;
+}
+
+text.gpxlabel {
+    fill: #ff26d4;
+}
+
+text.gpxlabel-halo {
+    opacity: 0.7;
+    stroke: #000;
+    stroke-width: 5px;
+    stroke-miterlimit: 1;
 }
 
+
 /* Default - light gray */
 path.area.stroke {
     stroke: #ddd;
@@ -944,6 +963,7 @@ path.casing.tag-unclassified {
 /* narrow highways */
 
 path.shadow.tag-highway-living_street,
+path.shadow.tag-highway-bus_guideway,
 path.shadow.tag-highway-service,
 path.shadow.tag-highway-track,
 path.shadow.tag-highway-road,
@@ -954,6 +974,7 @@ path.shadow.tag-road {
     stroke-width: 16;
 }
 path.casing.tag-highway-living_street,
+path.casing.tag-highway-bus_guideway,
 path.casing.tag-highway-service,
 path.casing.tag-highway-track,
 path.casing.tag-highway-road,
@@ -964,6 +985,7 @@ path.casing.tag-road {
     stroke-width: 7;
 }
 path.stroke.tag-highway-living_street,
+path.stroke.tag-highway-bus_guideway,
 path.stroke.tag-highway-service,
 path.stroke.tag-highway-track,
 path.stroke.tag-highway-road,
@@ -1024,6 +1046,7 @@ path.stroke.tag-steps {
 }
 
 .low-zoom path.shadow.tag-highway-living_street,
+.low-zoom path.shadow.tag-highway-bus_guideway,
 .low-zoom path.shadow.tag-highway-service,
 .low-zoom path.shadow.tag-highway-track,
 .low-zoom path.shadow.tag-highway-road,
@@ -1034,6 +1057,7 @@ path.stroke.tag-steps {
     stroke-width: 12;
 }
 .low-zoom path.casing.tag-highway-living_street,
+.low-zoom path.casing.tag-highway-bus_guideway,
 .low-zoom path.casing.tag-highway-service,
 .low-zoom path.casing.tag-highway-track,
 .low-zoom path.casing.tag-highway-road,
@@ -1044,6 +1068,7 @@ path.stroke.tag-steps {
     stroke-width: 5;
 }
 .low-zoom path.stroke.tag-highway-living_street,
+.low-zoom path.stroke.tag-highway-bus_guideway,
 .low-zoom path.stroke.tag-highway-service,
 .low-zoom path.stroke.tag-highway-track,
 .low-zoom path.stroke.tag-highway-road,
@@ -1174,15 +1199,19 @@ path.casing.tag-service {
     stroke:#666;
 }
 
+/* special service roads and bus guideways */
 /* with `service=* tag`  (e.g. parking_aisle, alley, drive-through */
+.preset-icon .icon.highway-bus_guideway,
 .preset-icon .icon.highway-service.tag-service {
     color: #dcd9b9;
     fill: #666;
 }
+path.stroke.tag-highway-bus_guideway,
 path.stroke.tag-highway-service.tag-service,
 path.stroke.tag-service.tag-service {
     stroke: #dcd9b9;
 }
+path.casing.tag-highway-bus_guideway,
 path.casing.tag-highway-service.tag-service,
 path.casing.tag-service.tag-service {
     stroke: #666;
@@ -1840,6 +1869,11 @@ path.fill.tag-amenity-shelter {
 }
 /* Cursors */
 
+.nope,
+.nope * {
+    cursor: not-allowed !important;
+}
+
 .map-in-map,
 #map {
     cursor: auto; /* Opera */
@@ -1889,16 +1923,6 @@ path.fill.tag-amenity-shelter {
     cursor: url(<%= asset_path("iD/img/cursor-select-remove.png") %>), pointer; /* FF */
 }
 
-#map .point:active,
-#map .vertex:active,
-#map .line:active,
-#map .area:active,
-#map .midpoint:active,
-#map .mode-select .selected {
-    cursor: pointer; /* Opera */
-    cursor: url(<%= asset_path("iD/img/cursor-select-acting.png") %>), pointer; /* FF */
-}
-
 .mode-draw-line #map,
 .mode-draw-area #map,
 .mode-add-line  #map,
@@ -1959,7 +1983,7 @@ path.fill.tag-amenity-shelter {
     position: absolute;
     right: 0;
     top: 0;
-    z-index: 500;
+    z-index: 48;
 }
 
 .photo-wrapper,
@@ -2176,6 +2200,14 @@ path.fill.tag-amenity-shelter {
     background: rgba(0,0,0,0.85);
     color: #fff;
 }
+
+.osc-image-wrap {
+    transform-origin:0 0;
+    -ms-transform-origin:0 0;
+    -webkit-transform-origin:0 0;
+    -moz-transform-origin:0 0;
+    -o-transform-origin:0 0;
+}
 /* Fill Styles */
 
 .low-zoom.fill-wireframe path.stroke,
@@ -2200,6 +2232,7 @@ path.fill.tag-amenity-shelter {
 }
 
 .fill-wireframe .point,
+.fill-wireframe .vertex.active,
 .fill-wireframe .areaicon,
 .fill-wireframe .areaicon-halo,
 .fill-wireframe path.casing,
@@ -2211,31 +2244,11 @@ path.fill.tag-amenity-shelter {
 .fill-partial path.area.fill {
     fill-opacity: 0;
     stroke-width: 60px;
-    pointer-events: visibleStroke;
-}
-
-/* Modes */
-
-.mode-draw-line .vertex.active,
-.mode-draw-area .vertex.active,
-.mode-drag-node .vertex.active {
-    display: none;
-}
-
-.mode-draw-line .way.active,
-.mode-draw-area .way.active,
-.mode-drag-node .active {
     pointer-events: none;
 }
-
-/* Ensure drawing doesn't interact with area fills. */
-.mode-add-point path.area.fill,
-.mode-draw-line path.area.fill,
-.mode-draw-area path.area.fill,
-.mode-add-line path.area.fill,
-.mode-add-area path.area.fill,
-.mode-drag-node path.area.fill {
-    pointer-events: none;
+.mode-browse .fill-partial path.area.fill,
+.mode-select .fill-partial path.area.fill {
+    pointer-events: visibleStroke;
 }
 /* Basics
 ------------------------------------------------------- */
@@ -2369,7 +2382,6 @@ a, button, input, textarea {
 a,
 button,
 .checkselect label:hover,
-.opacity-options li,
 .radial-menu-item {
     cursor: pointer;
 }
@@ -2507,7 +2519,7 @@ table th {
 }
 
 table.tags, table.tags td, table.tags th {
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     padding: 4px;
 }
 
@@ -2543,7 +2555,7 @@ ul li { list-style: none;}
     display: block;
     height: 30px;
     background-color: white;
-    color: #7092FF;
+    color: #7092ff;
     cursor: pointer;
 }
 
@@ -2953,7 +2965,7 @@ button.save.has-count .count::before {
     position: absolute;
     right: 0;
     top: 0;
-    height: 60px;
+    height: 59px;
     z-index: 50;
 }
 [dir='rtl'] .modal > button {
@@ -2979,6 +2991,30 @@ button.save.has-count .count::before {
     position: absolute;
 }
 
+
+/* Hide-Toggle
+------------------------------------------------------- */
+
+.hide-toggle .icon.pre-text {
+    vertical-align: text-top;
+    width: 16px;
+    height: 16px;
+    margin-left: -3px;
+}
+[dir='rtl'] .hide-toggle .icon.pre-text {
+    margin-left: 0;
+    margin-right: -3px;
+}
+
+a:visited.hide-toggle,
+a.hide-toggle {
+    display: inline-block;
+    font-size: 14px;
+    font-weight: bold;
+    padding-bottom: 5px;
+}
+
+
 /* Inspector
 ------------------------------------------------------- */
 
@@ -3021,7 +3057,6 @@ button.save.has-count .count::before {
     bottom: 0;
 }
 
-
 .feature-list-pane .inspector-body {
     top: 120px;
 }
@@ -3310,7 +3345,7 @@ button.save.has-count .count::before {
 
 .preset-list-item button.tag-reference-button {
     height: 100%;
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     border-radius: 0 3px 3px 0;
     position: absolute;
     top: 0;
@@ -3382,7 +3417,7 @@ button.save.has-count .count::before {
 }
 
 .preset-editor a.hide-toggle {
-    margin: 0 20px 10px 20px;
+    margin: 0 20px 5px 20px;
 }
 
 .preset-editor .form-fields-container {
@@ -3457,7 +3492,7 @@ button.save.has-count .count::before {
 }
 [dir='rtl'] .form-label button {
     border-left: none;
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
     border-radius: 4px 0 0 0;
     width: 31px;
 }
@@ -3813,13 +3848,13 @@ input[type=number] {
     float: left;
     height: 100%;
     width: 32px;
-    border-left: 1px solid #CCC;
+    border-left: 1px solid #ccc;
     border-radius: 0;
     background: rgba(0, 0, 0, 0);
 }
 [dir='rtl'] .spin-control button{
     border-left: 0;
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
 }
 
 .spin-control button.decrement {
@@ -3843,13 +3878,13 @@ input[type=number] {
 }
 
 .spin-control button.decrement::after {
-    border-top: 5px solid #CCC;
+    border-top: 5px solid #ccc;
     border-left: 5px solid transparent;
     border-right: 5px solid transparent;
 }
 
 .spin-control button.increment::after {
-    border-bottom: 5px solid #CCC;
+    border-bottom: 5px solid #ccc;
     border-left: 5px solid transparent;
     border-right: 5px solid transparent;
 }
@@ -3861,7 +3896,7 @@ input[type=number] {
     display: block;
     background: white;
     padding: 5px 10px;
-    color: #7092FF;
+    color: #7092ff;
 }
 
 .checkselect label:hover {
@@ -3959,7 +3994,7 @@ input[type=number] {
     right: 1px;
     width: 32px;
     margin-left: -32px;
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     border-top-width: 0;
     border-right-width: 0;
     border-radius: 0 0 4px 0;
@@ -4073,6 +4108,28 @@ input[type=number] {
     text-align: center;
 }
 
+/* Changeset editor while comment text is empty */
+
+.form-field-comment:not(.present) #preset-input-comment {
+    border-color: rgb(230, 100, 100);
+}
+
+.form-field-comment:not(.present) .form-label {
+    border-color: rgb(230, 100, 100);
+    background: rgba(230, 100, 100, 0.2);
+}
+
+.form-field-comment:not(.present) .form-label {
+}
+
+.form-field-comment:not(.present) .form-label-button-wrap {
+    border-color: rgb(230, 100, 100);
+}
+
+.form-field-comment:not(.present) button {
+    border-color: rgb(230, 100, 100);
+}
+
 /* combobox dropdown */
 
 div.combobox {
@@ -4155,12 +4212,12 @@ div.combobox {
     height: 31px;
     border: 0;
     border-radius: 0;
-    border-bottom: 1px solid #CCC;
-    border-left: 1px solid #CCC;
+    border-bottom: 1px solid #ccc;
+    border-left: 1px solid #ccc;
 }
 [dir='rtl'] .tag-row input {
     border-left: none;
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
 }
 
 .tag-row .key-wrap,
@@ -4180,14 +4237,14 @@ div.combobox {
 }
 
 .tag-row input.value {
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
 }
 [dir='rtl'] .tag-row input.value {
-    border-left: 1px solid #CCC;
+    border-left: 1px solid #ccc;
 }
 
 .tag-row:first-child input.key {
-    border-top: 1px solid #CCC;
+    border-top: 1px solid #ccc;
     border-top-left-radius: 4px;
 }
 [dir='rtl'] .tag-row:first-child input.key {
@@ -4196,14 +4253,14 @@ div.combobox {
 }
 
 .tag-row:first-child input.value {
-    border-top: 1px solid #CCC;
+    border-top: 1px solid #ccc;
 }
 
 .tag-row button {
     position: absolute;
     height: 31px;
     right: 10%;
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     border-top-width: 0;
     border-left-width: 0;
 }
@@ -4463,16 +4520,12 @@ div.full-screen > button:hover {
 
 .imagery-faq {
     margin-bottom: 10px;
-}
-
-.map-data-control .hide-toggle,
-.background-control .hide-toggle {
-    padding-bottom: 10px;
+    white-space: nowrap;
 }
 
 .layer-list, .controls-list {
     margin-bottom: 10px;
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     border-radius: 4px;
 }
 
@@ -4480,7 +4533,7 @@ div.full-screen > button:hover {
     position: relative;
     height: 30px;
     background-color: white;
-    color: #7092FF;
+    color: #7092ff;
 }
 
 .layer-list:empty {
@@ -4509,7 +4562,7 @@ div.full-screen > button:hover {
 
 .layer-list li.active,
 .layer-list li.switch {
-    background: #E8EBFF;
+    background: #e8ebff;
 }
 
 .layer-list li.best > div.best {
@@ -4541,60 +4594,38 @@ div.full-screen > button:hover {
     text-overflow: ellipsis;
 }
 
-.minimap-toggle {
-    display: block;
-    padding: 5px 10px;
-    cursor: pointer;
-    color: #7092FF;
-    border-radius: 3px;
-}
 
-.minimap-toggle.active {
-    background: #E8EBFF;
-}
+/* Background Display Options */
 
-.minimap-toggle:hover {
-    background-color: #ececec;
+.display-options-container {
+    padding: 10px;
 }
 
-.hide-toggle {
-    display: block;
-    padding-left: 12px;
-    position: relative;
-}
-[dir='rtl'] .hide-toggle {
-    padding-left: 0;
-    padding-right: 12px;
+.display-control h5 {
+    padding-bottom: 0;
+    padding-top: 10px;
 }
 
-.hide-toggle:before {
-    content: '';
-    display: block;
-    position: absolute;
-    height: 0;
-    width: 0;
-    left: 0;
-    top: 5px;
-    border-top:  4px solid transparent;
-    border-bottom:  4px solid transparent;
-    border-left:  8px solid #7092ff;
+.display-control h5 span {
+    margin: 5px;
 }
-[dir='rtl'] .hide-toggle:before {
-    left: auto;
-    right: 0;
-    border-left: none;
-    border-right: 8px solid #7092ff;
+
+.display-control .display-option-input {
+    height: 20px;
+    width: 155px;
 }
 
-.hide-toggle.expanded:before {
-    border-top:  8px solid #7092ff;
-    border-bottom: 0;
-    border-right:  4px solid transparent;
-    border-left:  4px solid transparent;
+.display-control button {
+    height: 30px;
+    width: 30px;
+    margin-left: 5px;
+    margin-right: 0px;
+    vertical-align: text-bottom;
+    border-radius: 4px;
 }
-[dir='rtl'] .hide-toggle.expanded:before {
-    border-left: 4px solid transparent;
-    border-right: 4px solid transparent;
+[dir='rtl'] .display-control button {
+    margin-left: 0px;
+    margin-right: 5px;
 }
 
 
@@ -4650,7 +4681,7 @@ div.full-screen > button:hover {
 }
 
 .nudge-container input.error {
-    border: 1px solid #FF7878;
+    border: 1px solid #ff7878;
     border-radius: 2px;
     background: #ffb;
 }
@@ -4702,92 +4733,43 @@ div.full-screen > button:hover {
 }
 
 .background-control .nudge.right::after {
-    border-top:  5px solid transparent;
-    border-bottom:  5px solid transparent;
-    border-left:  5px solid #222;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-left: 5px solid #222;
 }
 
 .background-control .nudge.left::after {
-    border-top:  5px solid transparent;
-    border-bottom:  5px solid transparent;
-    border-right:  5px solid #222;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-right: 5px solid #222;
 }
 
 .background-control .nudge.top::after {
-    border-right:  5px solid transparent;
-    border-left:  5px solid transparent;
-    border-bottom:  5px solid #222;
+    border-right: 5px solid transparent;
+    border-left: 5px solid transparent;
+    border-bottom: 5px solid #222;
 }
 
 .background-control .nudge.bottom::after {
-    border-right:  5px solid transparent;
-    border-left:  5px solid transparent;
-    border-top:  5px solid #222;
-}
-
-.opacity-options {
-    background: url(<%= asset_path("iD/img/background-pattern-opacity.png") %>) 0 0 repeat;
-    height: 20px;
-    width: 82px;
-    position: absolute;
-    right: 50px;
-    top: 20px;
-    border: 1px solid #ccc;
-}
-[dir='rtl'] .opacity-options {
-    left: 50px;
-    right: auto;
-}
-
-.opacity-options li {
-    height: 100%;
-    display: block;
-    float: left;
-}
-
-.opacity-options li .select-box{
-    position: absolute;
-    width: 20px;
-    height: 18px;
-    z-index: 9999;
-}
-
-.map-data-control li:hover .select-box,
-.map-data-control li.selected .select-box,
-.background-control li:hover .select-box,
-.background-control li.selected .select-box {
-    border: 2px solid #7092ff;
-    background: rgba(89, 123, 231, .5);
-    opacity: .5;
-}
-
-.map-data-control li.selected:hover .select-box,
-.map-data-control li.selected .select-box,
-.background-control li.selected:hover .select-box,
-.background-control li.selected .select-box {
-    opacity: 1;
+    border-right: 5px solid transparent;
+    border-left: 5px solid transparent;
+    border-top: 5px solid #222;
 }
 
-.background-control .opacity {
-    background:#222;
-    display:inline-block;
-    width:20px;
-    height:18px;
-}
 
 .map-data-control .layer-list button,
 .background-control .layer-list button {
     float: right;
     height: 100%;
     width: 10%;
-    border-left: 1px solid #CCC;
+    border-left: 1px solid #ccc;
     border-radius: 0;
 }
 [dir='rtl'] .map-data-control .layer-list button,
 [dir='rtl'] .background-control .layer-list button {
     float: left;
     border-left: none;
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
 }
 
 .map-data-control .layer-list button .icon,
@@ -4820,12 +4802,12 @@ div.full-screen > button:hover {
     border-radius: 0 0 0 4px;
 }
 [dir='rtl'] .geolocate-control button {
-  border-radius: 0 0 4px 0;
+    border-radius: 0 0 4px 0;
 }
 
 .map-overlay.content {
     position: fixed;
-    top:60px;
+    top: 60px;
     bottom: 30px;
     padding: 20px 50px 20px 20px;
     right: 0;
@@ -4837,13 +4819,17 @@ div.full-screen > button:hover {
     right: auto !important;
 }
 
+.map-overlay.content > div {
+    padding-bottom: 15px;
+}
+
 /* Help */
 
 .help-control button {
     border-radius: 0 0 0 4px;
 }
 [dir='rtl'] .help-control button {
-  border-radius: 0 0 4px 0;
+    border-radius: 0 0 4px 0;
 }
 
 .help-wrap p {
@@ -4852,13 +4838,27 @@ div.full-screen > button:hover {
 }
 
 .help-wrap .left-content .body p code {
-    padding:2px 4px;
-    background:#eee;
+    padding: 3px 4px;
+    font-size: 12px;
+    color: #555;
+    vertical-align: baseline;
+    background-color: #f6f6f6;
+    border: solid 1px #ccc;
+    margin: 0 2px;
+    border-bottom-color: #bbb;
+    border-radius: 3px;
+    box-shadow: inset 0 -1px 0 #bbb;
+}
+
+.help-wrap .left-content .icon.pre-text {
+    vertical-align: text-top;
+    margin-right: 0;
+    margin-left: 0;
+    display: inline-block;
 }
 
 .help-wrap .toc {
-    /* This is two columns, 41.66666 x .4 = 16.6666 */
-    width:40%;
+    width: 40%;
     float:right;
     margin-left: 20px;
     margin-bottom: 20px;
@@ -4868,7 +4868,7 @@ div.full-screen > button:hover {
 .help-wrap .toc li a,
 .help-wrap .nav a {
     display: block;
-    border: 1px solid #CCC;
+    border: 1px solid #ccc;
     padding: 5px 10px;
 }
 
@@ -4882,7 +4882,7 @@ div.full-screen > button:hover {
 }
 
 .help-wrap .toc li a.selected {
-    background: #E8EBFF;
+    background: #e8ebff;
 }
 
 .help-wrap .toc li:first-child a {
@@ -4890,7 +4890,7 @@ div.full-screen > button:hover {
 }
 
 .help-wrap .toc li:nth-last-child(3) a {
-    border-bottom: 1px solid #CCC;
+    border-bottom: 1px solid #ccc;
     border-radius: 0 0 4px 4px
 }
 
@@ -4935,12 +4935,12 @@ div.full-screen > button:hover {
 ------------------------------------------------------- */
 
 img.tile {
-    position:absolute;
-    transform-origin:0 0;
-    -ms-transform-origin:0 0;
-    -webkit-transform-origin:0 0;
-    -moz-transform-origin:0 0;
-    -o-transform-origin:0 0;
+    position: absolute;
+    transform-origin: 0 0;
+    -ms-transform-origin: 0 0;
+    -webkit-transform-origin: 0 0;
+    -moz-transform-origin: 0 0;
+    -o-transform-origin: 0 0;
 
     -moz-user-select: none;
     -webkit-user-select: none;
@@ -4950,8 +4950,16 @@ img.tile {
     opacity: 0;
 
     -webkit-transition: opacity 200ms linear;
-    transition: opacity 200ms linear;
     -moz-transition: opacity 200ms linear;
+    transition: opacity 200ms linear;
+}
+
+img.tile-loaded {
+    opacity: 1;
+}
+
+img.tile-removing {
+    opacity: 0;
 }
 
 .tile-label-debug {
@@ -4963,14 +4971,14 @@ img.tile {
     padding: 5px;
     border-radius: 3px;
     z-index: 2;
-    margin-left: -50px;
+    margin-left: -70px;
     margin-top: -20px;
 
-    transform-origin:0 0;
-    -ms-transform-origin:0 0;
-    -webkit-transform-origin:0 0;
-    -moz-transform-origin:0 0;
-    -o-transform-origin:0 0;
+    transform-origin: 0 0;
+    -ms-transform-origin: 0 0;
+    -webkit-transform-origin: 0 0;
+    -moz-transform-origin: 0 0;
+    -o-transform-origin: 0 0;
 
     -moz-user-select: none;
     -webkit-user-select: none;
@@ -4982,23 +4990,15 @@ img.tile-debug {
     outline: 1px solid red;
 }
 
-img.tile-loaded {
-    opacity: 1;
-}
-
-img.tile-removing {
-    opacity: 0;
-}
-
 
 /* Map
 ------------------------------------------------------- */
 
 #map {
-    position:relative;
-    overflow:hidden;
-    height:100%;
-    background:#000;
+    position: relative;
+    overflow: hidden;
+    height: 100%;
+    background: #000;
     -moz-user-select: none;
     -webkit-user-select: none;
     -ms-user-select: none;
@@ -5006,11 +5006,11 @@ img.tile-removing {
 }
 
 #supersurface {
-    transform-origin:0 0;
-    -ms-transform-origin:0 0;
-    -webkit-transform-origin:0 0;
-    -moz-transform-origin:0 0;
-    -o-transform-origin:0 0;
+    transform-origin: 0 0;
+    -ms-transform-origin: 0 0;
+    -webkit-transform-origin: 0 0;
+    -moz-transform-origin: 0 0;
+    -o-transform-origin: 0 0;
 }
 
 #supersurface, .layer {
@@ -5089,6 +5089,7 @@ img.tile-removing {
     stroke-width: 1;
 }
 
+.nocolor { color: rgba(0, 0, 0, 0); }
 .red     { color: rgba(255, 0, 0, 0.75); }
 .green   { color: rgba(0, 255, 0, 0.75); }
 .blue    { color: rgba(0, 0, 255, 0.75); }
@@ -5184,6 +5185,12 @@ img.tile-removing {
     position: relative;
 }
 
+.panel-content li span {
+    display: inline-block;
+    white-space: nowrap;
+    margin: 0 8px;
+}
+
 .panel-content .button {
     display: inline-block;
     background: #7092ff;
@@ -5199,11 +5206,11 @@ img.tile-removing {
 }
 
 .panel-content-history .links a {
-    margin-left: 10px;
+    margin-left: 8px;
 }
 [dir='rtl'] .panel-content-history .links a {
     margin-left: auto;
-    margin-right: 10px;
+    margin-right: 8px;
 }
 
 .panel-content-history .view-history-on-osm {
@@ -5277,13 +5284,13 @@ img.tile-removing {
     margin: 0 3px;
 }
 
-
 #footer {
     pointer-events: all;
     display: block;
     height: 30px;
 }
 
+/* footer flash message */
 
 #flash-wrap {
     display: flex;
@@ -5296,7 +5303,7 @@ img.tile-removing {
     left: 0;
 }
 
-#flash-wrap .content {
+.flash-content {
     display: flex;
     flex: 1 0 auto;
     flex-flow: row nowrap;
@@ -5305,15 +5312,38 @@ img.tile-removing {
     height: 30px;
 }
 
-
-#flash-wrap svg.operation-icon {
+.flash-icon {
     flex: 0 0 auto;
     width: 20px;
     height: 20px;
     margin: 0 8px;
 }
 
-#flash-wrap div.operation-tip {
+.flash-icon circle {
+    fill: #eee;
+}
+.flash-icon.disabled circle {
+    cursor: auto;
+    fill: rgba(255,255,255,0.7);
+}
+
+.flash-icon use {
+    color: #222;
+}
+.flash-icon.disabled use {
+    color: rgba(32,32,32,0.7);
+}
+
+.flash-icon.operation use {
+    fill: #222;
+    color: #79f;
+}
+.flash-icon.operation.disabled use {
+    fill: rgba(32,32,32,0.7);
+    color: rgba(40,40,40,0.7);
+}
+
+.flash-text {
     flex: 1 1 auto;
 }
 
@@ -5343,6 +5373,8 @@ img.tile-removing {
 }
 
 
+/* footer scale */
+
 #scale-block {
     vertical-align: bottom;
     width: 250px;
@@ -5539,7 +5571,7 @@ img.tile-removing {
 
 .modal-section {
     padding: 20px;
-    border-bottom: 1px solid #CCC;
+    border-bottom: 1px solid #ccc;
 }
 
 .modal-section.header h3 {
@@ -5572,8 +5604,8 @@ img.tile-removing {
 .modal-actions button,
 .save-success a.button {
     font-weight: normal;
-    color: #7092FF;
-    border-bottom: 1px solid #CCC;
+    color: #7092ff;
+    border-bottom: 1px solid #ccc;
     border-radius: 0;
     height: 160px;
     text-align: center;
@@ -5593,7 +5625,7 @@ img.tile-removing {
 }
 
 .modal-actions > :first-child {
-    border-right: 1px solid #CCC;
+    border-right: 1px solid #ccc;
 }
 
 .modal-section:last-child {
@@ -5603,7 +5635,7 @@ img.tile-removing {
 /* Restore Modal
 ------------------------------------------------------- */
 .modal-actions .logo-restore {
-    color: #7092FF;
+    color: #7092ff;
 }
 .modal-actions .logo-reset {
     color: #E06C5E;
@@ -5621,7 +5653,7 @@ img.tile-removing {
     padding-top: 15px;
 }
 .save-success .logo-osm {
-    color: #7092FF;
+    color: #7092ff;
     margin-bottom: 10px;
 }
 .save-success a.button.social {
@@ -5631,14 +5663,14 @@ img.tile-removing {
 .save-success .icon.social {
     height: 80px;
     width: 80px;
-    color: #7092FF;
+    color: #7092ff;
 }
 
 /* Splash Modal
 ------------------------------------------------------- */
 .modal-actions .logo-walkthrough,
 .modal-actions .logo-features {
-    color: #7092FF;
+    color: #7092ff;
 }
 
 
@@ -5727,11 +5759,11 @@ img.tile-removing {
     box-shadow: inset 0 -1px 0 #bbb;
 }
 
-.modal-shortcuts .shortcut-keys svg.mouseclick use.left {
+svg.mouseclick use.left {
     fill: rgba(112, 146, 255, 1);
     color: rgba(112, 146, 255, 0);
 }
-.modal-shortcuts .shortcut-keys svg.mouseclick use.right {
+svg.mouseclick use.right {
     fill: rgba(112, 146, 255, 0);
     color: rgba(112, 146, 255, 1);
 }
@@ -5829,7 +5861,7 @@ img.tile-removing {
 }
 
 .mode-save .commit-section .changeset-list button {
-    border-left: 1px solid #CCC;
+    border-left: 1px solid #ccc;
 }
 
 .changeset-list li span.count:before { content: '('; }
@@ -6218,6 +6250,7 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
 
 .edit-menu-item rect {
     fill: #eee;
+    cursor: default;
 }
 
 .edit-menu-item rect:active,
@@ -6236,6 +6269,7 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
 .edit-menu-item use {
     fill: #222;
     color: #79f;
+    pointer-events: none;
 }
 
 .edit-menu-item.disabled use {
@@ -6386,7 +6420,7 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
 .curtain-tooltip .tooltip-inner .instruction {
     font-weight: bold;
     display: block;
-    border-top: 1px solid #CCC;
+    border-top: 1px solid #ccc;
     margin-top: 10px;
     margin-left: -20px;
     margin-right: -20px;
@@ -6464,5 +6498,5 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
 .huge-modal-button .illustration {
     height: 100px;
     width: 100px;
-    color: #7092FF;
+    color: #7092ff;
 }
index a9e9863d4bb1ac4c84ccb0e4249dab10c1321829..1a879de65ff0050113176d2ca6037d51dc8e23f6 100644 (file)
@@ -1,11 +1,11 @@
 (function () {
-var version = "4.11.0";
+var version = "4.13.0";
 
-var d3_ascending = function(a, b) {
+function d3_ascending(a, b) {
   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
-};
+}
 
-var d3_bisector = function(compare) {
+function d3_bisector(compare) {
   if (compare.length === 1) compare = ascendingComparator(compare);
   return {
     left: function(a, x, lo, hi) {
@@ -29,7 +29,7 @@ var d3_bisector = function(compare) {
       return lo;
     }
   };
-};
+}
 
 function ascendingComparator(f) {
   return function(d, x) {
@@ -41,18 +41,18 @@ var ascendingBisect = d3_bisector(d3_ascending);
 var bisectRight = ascendingBisect.right;
 var bisectLeft = ascendingBisect.left;
 
-var pairs = function(array, f) {
+function pairs(array, f) {
   if (f == null) f = pair;
   var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
   while (i < n) pairs[i] = f(p, p = array[++i]);
   return pairs;
-};
+}
 
 function pair(a, b) {
   return [a, b];
 }
 
-var cross = function(values0, values1, reduce) {
+function cross(values0, values1, reduce) {
   var n0 = values0.length,
       n1 = values1.length,
       values = new Array(n0 * n1),
@@ -70,17 +70,17 @@ var cross = function(values0, values1, reduce) {
   }
 
   return values;
-};
+}
 
-var d3_descending = function(a, b) {
+function d3_descending(a, b) {
   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
-};
+}
 
-var number = function(x) {
+function number(x) {
   return x === null ? NaN : +x;
-};
+}
 
-var variance = function(values, valueof) {
+function variance(values, valueof) {
   var n = values.length,
       m = 0,
       i = -1,
@@ -110,14 +110,14 @@ var variance = function(values, valueof) {
   }
 
   if (m > 1) return sum / (m - 1);
-};
+}
 
-var deviation = function(array, f) {
+function deviation(array, f) {
   var v = variance(array, f);
   return v ? Math.sqrt(v) : v;
-};
+}
 
-var extent = function(values, valueof) {
+function extent(values, valueof) {
   var n = values.length,
       i = -1,
       value,
@@ -153,24 +153,24 @@ var extent = function(values, valueof) {
   }
 
   return [min, max];
-};
+}
 
 var array = Array.prototype;
 
 var slice = array.slice;
 var map = array.map;
 
-var constant = function(x) {
+function constant(x) {
   return function() {
     return x;
   };
-};
+}
 
-var identity = function(x) {
+function identity(x) {
   return x;
-};
+}
 
-var d3_range = function(start, stop, step) {
+function d3_range(start, stop, step) {
   start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
 
   var i = -1,
@@ -182,13 +182,13 @@ var d3_range = function(start, stop, step) {
   }
 
   return range;
-};
+}
 
 var e10 = Math.sqrt(50);
 var e5 = Math.sqrt(10);
 var e2 = Math.sqrt(2);
 
-var ticks = function(start, stop, count) {
+function ticks(start, stop, count) {
   var reverse,
       i = -1,
       n,
@@ -215,7 +215,7 @@ var ticks = function(start, stop, count) {
   if (reverse) ticks.reverse();
 
   return ticks;
-};
+}
 
 function tickIncrement(start, stop, count) {
   var step = (stop - start) / Math.max(0, count),
@@ -236,11 +236,11 @@ function tickStep(start, stop, count) {
   return stop < start ? -step1 : step1;
 }
 
-var sturges = function(values) {
+function sturges(values) {
   return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
-};
+}
 
-var histogram = function() {
+function histogram() {
   var value = identity,
       domain = extent,
       threshold = sturges;
@@ -305,9 +305,9 @@ var histogram = function() {
   };
 
   return histogram;
-};
+}
 
-var threshold = function(values, p, valueof) {
+function threshold(values, p, valueof) {
   if (valueof == null) valueof = number;
   if (!(n = values.length)) return;
   if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
@@ -318,18 +318,18 @@ var threshold = function(values, p, valueof) {
       value0 = +valueof(values[i0], i0, values),
       value1 = +valueof(values[i0 + 1], i0 + 1, values);
   return value0 + (value1 - value0) * (i - i0);
-};
+}
 
-var freedmanDiaconis = function(values, min, max) {
+function freedmanDiaconis(values, min, max) {
   values = map.call(values, number).sort(d3_ascending);
   return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
-};
+}
 
-var scott = function(values, min, max) {
+function scott(values, min, max) {
   return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
-};
+}
 
-var max = function(values, valueof) {
+function max(values, valueof) {
   var n = values.length,
       i = -1,
       value,
@@ -362,9 +362,9 @@ var max = function(values, valueof) {
   }
 
   return max;
-};
+}
 
-var mean = function(values, valueof) {
+function mean(values, valueof) {
   var n = values.length,
       m = n,
       i = -1,
@@ -386,9 +386,9 @@ var mean = function(values, valueof) {
   }
 
   if (m) return sum / m;
-};
+}
 
-var d3_median = function(values, valueof) {
+function d3_median(values, valueof) {
   var n = values.length,
       i = -1,
       value,
@@ -411,9 +411,9 @@ var d3_median = function(values, valueof) {
   }
 
   return threshold(numbers.sort(d3_ascending), 0.5);
-};
+}
 
-var merge = function(arrays) {
+function merge(arrays) {
   var n = arrays.length,
       m,
       i = -1,
@@ -433,9 +433,9 @@ var merge = function(arrays) {
   }
 
   return merged;
-};
+}
 
-var min = function(values, valueof) {
+function min(values, valueof) {
   var n = values.length,
       i = -1,
       value,
@@ -468,15 +468,15 @@ var min = function(values, valueof) {
   }
 
   return min;
-};
+}
 
-var permute = function(array, indexes) {
+function permute(array, indexes) {
   var i = indexes.length, permutes = new Array(i);
   while (i--) permutes[i] = array[indexes[i]];
   return permutes;
-};
+}
 
-var scan = function(values, compare) {
+function scan(values, compare) {
   if (!(n = values.length)) return;
   var n,
       i = 0,
@@ -493,9 +493,9 @@ var scan = function(values, compare) {
   }
 
   if (compare(xj, xj) === 0) return j;
-};
+}
 
-var shuffle = function(array, i0, i1) {
+function shuffle(array, i0, i1) {
   var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
       t,
       i;
@@ -508,9 +508,9 @@ var shuffle = function(array, i0, i1) {
   }
 
   return array;
-};
+}
 
-var sum = function(values, valueof) {
+function sum(values, valueof) {
   var n = values.length,
       i = -1,
       value,
@@ -529,9 +529,9 @@ var sum = function(values, valueof) {
   }
 
   return sum;
-};
+}
 
-var transpose = function(matrix) {
+function transpose(matrix) {
   if (!(n = matrix.length)) return [];
   for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
     for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
@@ -539,21 +539,21 @@ var transpose = function(matrix) {
     }
   }
   return transpose;
-};
+}
 
 function length(d) {
   return d.length;
 }
 
-var zip = function() {
+function zip() {
   return transpose(arguments);
-};
+}
 
 var slice$1 = Array.prototype.slice;
 
-var identity$1 = function(x) {
+function identity$1(x) {
   return x;
-};
+}
 
 var top = 1;
 var right = 2;
@@ -820,11 +820,11 @@ var namespaces = {
   xmlns: "http://www.w3.org/2000/xmlns/"
 };
 
-var namespace = function(name) {
+function namespace(name) {
   var prefix = name += "", i = prefix.indexOf(":");
   if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
   return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
-};
+}
 
 function creatorInherit(name) {
   return function() {
@@ -842,207 +842,22 @@ function creatorFixed(fullname) {
   };
 }
 
-var creator = function(name) {
+function creator(name) {
   var fullname = namespace(name);
   return (fullname.local
       ? creatorFixed
       : creatorInherit)(fullname);
-};
-
-var nextId = 0;
-
-function local$1() {
-  return new Local;
-}
-
-function Local() {
-  this._ = "@" + (++nextId).toString(36);
-}
-
-Local.prototype = local$1.prototype = {
-  constructor: Local,
-  get: function(node) {
-    var id = this._;
-    while (!(id in node)) if (!(node = node.parentNode)) return;
-    return node[id];
-  },
-  set: function(node, value) {
-    return node[this._] = value;
-  },
-  remove: function(node) {
-    return this._ in node && delete node[this._];
-  },
-  toString: function() {
-    return this._;
-  }
-};
-
-var matcher = function(selector) {
-  return function() {
-    return this.matches(selector);
-  };
-};
-
-if (typeof document !== "undefined") {
-  var element = document.documentElement;
-  if (!element.matches) {
-    var vendorMatches = element.webkitMatchesSelector
-        || element.msMatchesSelector
-        || element.mozMatchesSelector
-        || element.oMatchesSelector;
-    matcher = function(selector) {
-      return function() {
-        return vendorMatches.call(this, selector);
-      };
-    };
-  }
-}
-
-var matcher$1 = matcher;
-
-var filterEvents = {};
-
-var event = null;
-
-if (typeof document !== "undefined") {
-  var element$1 = document.documentElement;
-  if (!("onmouseenter" in element$1)) {
-    filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
-  }
-}
-
-function filterContextListener(listener, index, group) {
-  listener = contextListener(listener, index, group);
-  return function(event) {
-    var related = event.relatedTarget;
-    if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
-      listener.call(this, event);
-    }
-  };
-}
-
-function contextListener(listener, index, group) {
-  return function(event1) {
-    var event0 = event; // Events can be reentrant (e.g., focus).
-    event = event1;
-    try {
-      listener.call(this, this.__data__, index, group);
-    } finally {
-      event = event0;
-    }
-  };
-}
-
-function parseTypenames$1(typenames) {
-  return typenames.trim().split(/^|\s+/).map(function(t) {
-    var name = "", i = t.indexOf(".");
-    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
-    return {type: t, name: name};
-  });
-}
-
-function onRemove(typename) {
-  return function() {
-    var on = this.__on;
-    if (!on) return;
-    for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
-      if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
-        this.removeEventListener(o.type, o.listener, o.capture);
-      } else {
-        on[++i] = o;
-      }
-    }
-    if (++i) on.length = i;
-    else delete this.__on;
-  };
-}
-
-function onAdd(typename, value, capture) {
-  var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
-  return function(d, i, group) {
-    var on = this.__on, o, listener = wrap(value, i, group);
-    if (on) for (var j = 0, m = on.length; j < m; ++j) {
-      if ((o = on[j]).type === typename.type && o.name === typename.name) {
-        this.removeEventListener(o.type, o.listener, o.capture);
-        this.addEventListener(o.type, o.listener = listener, o.capture = capture);
-        o.value = value;
-        return;
-      }
-    }
-    this.addEventListener(typename.type, listener, capture);
-    o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
-    if (!on) this.__on = [o];
-    else on.push(o);
-  };
 }
 
-var selection_on = function(typename, value, capture) {
-  var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
-
-  if (arguments.length < 2) {
-    var on = this.node().__on;
-    if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
-      for (i = 0, o = on[j]; i < n; ++i) {
-        if ((t = typenames[i]).type === o.type && t.name === o.name) {
-          return o.value;
-        }
-      }
-    }
-    return;
-  }
-
-  on = value ? onAdd : onRemove;
-  if (capture == null) capture = false;
-  for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
-  return this;
-};
-
-function customEvent(event1, listener, that, args) {
-  var event0 = event;
-  event1.sourceEvent = event;
-  event = event1;
-  try {
-    return listener.apply(that, args);
-  } finally {
-    event = event0;
-  }
-}
-
-var sourceEvent = function() {
-  var current = event, source;
-  while (source = current.sourceEvent) current = source;
-  return current;
-};
-
-var point = function(node, event) {
-  var svg = node.ownerSVGElement || node;
-
-  if (svg.createSVGPoint) {
-    var point = svg.createSVGPoint();
-    point.x = event.clientX, point.y = event.clientY;
-    point = point.matrixTransform(node.getScreenCTM().inverse());
-    return [point.x, point.y];
-  }
-
-  var rect = node.getBoundingClientRect();
-  return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
-};
-
-var d3_mouse = function(node) {
-  var event = sourceEvent();
-  if (event.changedTouches) event = event.changedTouches[0];
-  return point(node, event);
-};
-
 function none() {}
 
-var selector = function(selector) {
+function selector(selector) {
   return selector == null ? none : function() {
     return this.querySelector(selector);
   };
-};
+}
 
-var selection_select = function(select) {
+function selection_select(select) {
   if (typeof select !== "function") select = selector(select);
 
   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
@@ -1055,19 +870,19 @@ var selection_select = function(select) {
   }
 
   return new Selection(subgroups, this._parents);
-};
+}
 
-function empty$1() {
+function empty() {
   return [];
 }
 
-var selectorAll = function(selector) {
-  return selector == null ? empty$1 : function() {
+function selectorAll(selector) {
+  return selector == null ? empty : function() {
     return this.querySelectorAll(selector);
   };
-};
+}
 
-var selection_selectAll = function(select) {
+function selection_selectAll(select) {
   if (typeof select !== "function") select = selectorAll(select);
 
   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
@@ -1080,9 +895,32 @@ var selection_selectAll = function(select) {
   }
 
   return new Selection(subgroups, parents);
+}
+
+var matcher = function(selector) {
+  return function() {
+    return this.matches(selector);
+  };
 };
 
-var selection_filter = function(match) {
+if (typeof document !== "undefined") {
+  var element = document.documentElement;
+  if (!element.matches) {
+    var vendorMatches = element.webkitMatchesSelector
+        || element.msMatchesSelector
+        || element.mozMatchesSelector
+        || element.oMatchesSelector;
+    matcher = function(selector) {
+      return function() {
+        return vendorMatches.call(this, selector);
+      };
+    };
+  }
+}
+
+var matcher$1 = matcher;
+
+function selection_filter(match) {
   if (typeof match !== "function") match = matcher$1(match);
 
   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
@@ -1094,15 +932,15 @@ var selection_filter = function(match) {
   }
 
   return new Selection(subgroups, this._parents);
-};
+}
 
-var sparse = function(update) {
+function sparse(update) {
   return new Array(update.length);
-};
+}
 
-var selection_enter = function() {
+function selection_enter() {
   return new Selection(this._enter || this._groups.map(sparse), this._parents);
-};
+}
 
 function EnterNode(parent, datum) {
   this.ownerDocument = parent.ownerDocument;
@@ -1120,11 +958,11 @@ EnterNode.prototype = {
   querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
 };
 
-var constant$1 = function(x) {
+function constant$1(x) {
   return function() {
     return x;
   };
-};
+}
 
 var keyPrefix = "$"; // Protect against keys like “__proto__”.
 
@@ -1198,7 +1036,7 @@ function bindKey(parent, group, enter, update, exit, data, key) {
   }
 }
 
-var selection_data = function(value, key) {
+function selection_data(value, key) {
   if (!value) {
     data = new Array(this.size()), j = -1;
     this.each(function(d) { data[++j] = d; });
@@ -1239,13 +1077,13 @@ var selection_data = function(value, key) {
   update._enter = enter;
   update._exit = exit;
   return update;
-};
+}
 
-var selection_exit = function() {
+function selection_exit() {
   return new Selection(this._exit || this._groups.map(sparse), this._parents);
-};
+}
 
-var selection_merge = function(selection$$1) {
+function selection_merge(selection$$1) {
 
   for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
@@ -1260,9 +1098,9 @@ var selection_merge = function(selection$$1) {
   }
 
   return new Selection(merges, this._parents);
-};
+}
 
-var selection_order = function() {
+function selection_order() {
 
   for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
     for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
@@ -1274,9 +1112,9 @@ var selection_order = function() {
   }
 
   return this;
-};
+}
 
-var selection_sort = function(compare) {
+function selection_sort(compare) {
   if (!compare) compare = ascending;
 
   function compareNode(a, b) {
@@ -1293,26 +1131,26 @@ var selection_sort = function(compare) {
   }
 
   return new Selection(sortgroups, this._parents).order();
-};
+}
 
 function ascending(a, b) {
   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
 }
 
-var selection_call = function() {
+function selection_call() {
   var callback = arguments[0];
   arguments[0] = this;
   callback.apply(null, arguments);
   return this;
-};
+}
 
-var selection_nodes = function() {
+function selection_nodes() {
   var nodes = new Array(this.size()), i = -1;
   this.each(function() { nodes[++i] = this; });
   return nodes;
-};
+}
 
-var selection_node = function() {
+function selection_node() {
 
   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
     for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
@@ -1322,19 +1160,19 @@ var selection_node = function() {
   }
 
   return null;
-};
+}
 
-var selection_size = function() {
+function selection_size() {
   var size = 0;
   this.each(function() { ++size; });
   return size;
-};
+}
 
-var selection_empty = function() {
+function selection_empty() {
   return !this.node();
-};
+}
 
-var selection_each = function(callback) {
+function selection_each(callback) {
 
   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
     for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
@@ -1343,7 +1181,7 @@ var selection_each = function(callback) {
   }
 
   return this;
-};
+}
 
 function attrRemove(name) {
   return function() {
@@ -1385,7 +1223,7 @@ function attrFunctionNS(fullname, value) {
   };
 }
 
-var selection_attr = function(name, value) {
+function selection_attr(name, value) {
   var fullname = namespace(name);
 
   if (arguments.length < 2) {
@@ -1399,13 +1237,13 @@ var selection_attr = function(name, value) {
       ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
       ? (fullname.local ? attrFunctionNS : attrFunction)
       : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
-};
+}
 
-var defaultView = function(node) {
+function defaultView(node) {
   return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
       || (node.document && node) // node is a Window
       || node.defaultView; // node is a Document
-};
+}
 
 function styleRemove(name) {
   return function() {
@@ -1427,14 +1265,14 @@ function styleFunction(name, value, priority) {
   };
 }
 
-var selection_style = function(name, value, priority) {
+function selection_style(name, value, priority) {
   return arguments.length > 1
       ? this.each((value == null
             ? styleRemove : typeof value === "function"
             ? styleFunction
             : styleConstant)(name, value, priority == null ? "" : priority))
       : styleValue(this.node(), name);
-};
+}
 
 function styleValue(node, name) {
   return node.style.getPropertyValue(name)
@@ -1461,14 +1299,14 @@ function propertyFunction(name, value) {
   };
 }
 
-var selection_property = function(name, value) {
+function selection_property(name, value) {
   return arguments.length > 1
       ? this.each((value == null
           ? propertyRemove : typeof value === "function"
           ? propertyFunction
           : propertyConstant)(name, value))
       : this.node()[name];
-};
+}
 
 function classArray(string) {
   return string.trim().split(/^|\s+/);
@@ -1531,7 +1369,7 @@ function classedFunction(names, value) {
   };
 }
 
-var selection_classed = function(name, value) {
+function selection_classed(name, value) {
   var names = classArray(name + "");
 
   if (arguments.length < 2) {
@@ -1544,7 +1382,7 @@ var selection_classed = function(name, value) {
       ? classedFunction : value
       ? classedTrue
       : classedFalse)(names, value));
-};
+}
 
 function textRemove() {
   this.textContent = "";
@@ -1563,14 +1401,14 @@ function textFunction(value) {
   };
 }
 
-var selection_text = function(value) {
+function selection_text(value) {
   return arguments.length
       ? this.each(value == null
           ? textRemove : (typeof value === "function"
           ? textFunction
           : textConstant)(value))
       : this.node().textContent;
-};
+}
 
 function htmlRemove() {
   this.innerHTML = "";
@@ -1589,64 +1427,184 @@ function htmlFunction(value) {
   };
 }
 
-var selection_html = function(value) {
+function selection_html(value) {
   return arguments.length
       ? this.each(value == null
           ? htmlRemove : (typeof value === "function"
           ? htmlFunction
           : htmlConstant)(value))
       : this.node().innerHTML;
-};
+}
 
 function raise() {
   if (this.nextSibling) this.parentNode.appendChild(this);
 }
 
-var selection_raise = function() {
+function selection_raise() {
   return this.each(raise);
-};
+}
 
 function lower() {
   if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
 }
 
-var selection_lower = function() {
+function selection_lower() {
   return this.each(lower);
-};
+}
 
-var selection_append = function(name) {
+function selection_append(name) {
   var create = typeof name === "function" ? name : creator(name);
   return this.select(function() {
     return this.appendChild(create.apply(this, arguments));
   });
-};
+}
 
 function constantNull() {
   return null;
 }
 
-var selection_insert = function(name, before) {
+function selection_insert(name, before) {
   var create = typeof name === "function" ? name : creator(name),
       select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
   return this.select(function() {
     return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
   });
-};
+}
 
 function remove() {
   var parent = this.parentNode;
   if (parent) parent.removeChild(this);
 }
 
-var selection_remove = function() {
+function selection_remove() {
   return this.each(remove);
-};
+}
+
+function selection_cloneShallow() {
+  return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
+}
+
+function selection_cloneDeep() {
+  return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
+}
+
+function selection_clone(deep) {
+  return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+}
 
-var selection_datum = function(value) {
+function selection_datum(value) {
   return arguments.length
       ? this.property("__data__", value)
       : this.node().__data__;
-};
+}
+
+var filterEvents = {};
+
+var event = null;
+
+if (typeof document !== "undefined") {
+  var element$1 = document.documentElement;
+  if (!("onmouseenter" in element$1)) {
+    filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
+  }
+}
+
+function filterContextListener(listener, index, group) {
+  listener = contextListener(listener, index, group);
+  return function(event) {
+    var related = event.relatedTarget;
+    if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
+      listener.call(this, event);
+    }
+  };
+}
+
+function contextListener(listener, index, group) {
+  return function(event1) {
+    var event0 = event; // Events can be reentrant (e.g., focus).
+    event = event1;
+    try {
+      listener.call(this, this.__data__, index, group);
+    } finally {
+      event = event0;
+    }
+  };
+}
+
+function parseTypenames$1(typenames) {
+  return typenames.trim().split(/^|\s+/).map(function(t) {
+    var name = "", i = t.indexOf(".");
+    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+    return {type: t, name: name};
+  });
+}
+
+function onRemove(typename) {
+  return function() {
+    var on = this.__on;
+    if (!on) return;
+    for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+      if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+        this.removeEventListener(o.type, o.listener, o.capture);
+      } else {
+        on[++i] = o;
+      }
+    }
+    if (++i) on.length = i;
+    else delete this.__on;
+  };
+}
+
+function onAdd(typename, value, capture) {
+  var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
+  return function(d, i, group) {
+    var on = this.__on, o, listener = wrap(value, i, group);
+    if (on) for (var j = 0, m = on.length; j < m; ++j) {
+      if ((o = on[j]).type === typename.type && o.name === typename.name) {
+        this.removeEventListener(o.type, o.listener, o.capture);
+        this.addEventListener(o.type, o.listener = listener, o.capture = capture);
+        o.value = value;
+        return;
+      }
+    }
+    this.addEventListener(typename.type, listener, capture);
+    o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
+    if (!on) this.__on = [o];
+    else on.push(o);
+  };
+}
+
+function selection_on(typename, value, capture) {
+  var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
+
+  if (arguments.length < 2) {
+    var on = this.node().__on;
+    if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+      for (i = 0, o = on[j]; i < n; ++i) {
+        if ((t = typenames[i]).type === o.type && t.name === o.name) {
+          return o.value;
+        }
+      }
+    }
+    return;
+  }
+
+  on = value ? onAdd : onRemove;
+  if (capture == null) capture = false;
+  for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
+  return this;
+}
+
+function customEvent(event1, listener, that, args) {
+  var event0 = event;
+  event1.sourceEvent = event;
+  event = event1;
+  try {
+    return listener.apply(that, args);
+  } finally {
+    event = event0;
+  }
+}
 
 function dispatchEvent(node, type, params) {
   var window = defaultView(node),
@@ -1675,11 +1633,11 @@ function dispatchFunction(type, params) {
   };
 }
 
-var selection_dispatch = function(type, params) {
+function selection_dispatch(type, params) {
   return this.each((typeof params === "function"
       ? dispatchFunction
       : dispatchConstant)(type, params));
-};
+}
 
 var root = [null];
 
@@ -1720,24 +1678,83 @@ Selection.prototype = selection.prototype = {
   append: selection_append,
   insert: selection_insert,
   remove: selection_remove,
+  clone: selection_clone,
   datum: selection_datum,
   on: selection_on,
   dispatch: selection_dispatch
 };
 
-var d3_select = function(selector) {
+function d3_select(selector) {
   return typeof selector === "string"
       ? new Selection([[document.querySelector(selector)]], [document.documentElement])
       : new Selection([[selector]], root);
+}
+
+function create(name) {
+  return d3_select(creator(name).call(document.documentElement));
+}
+
+var nextId = 0;
+
+function local() {
+  return new Local;
+}
+
+function Local() {
+  this._ = "@" + (++nextId).toString(36);
+}
+
+Local.prototype = local.prototype = {
+  constructor: Local,
+  get: function(node) {
+    var id = this._;
+    while (!(id in node)) if (!(node = node.parentNode)) return;
+    return node[id];
+  },
+  set: function(node, value) {
+    return node[this._] = value;
+  },
+  remove: function(node) {
+    return this._ in node && delete node[this._];
+  },
+  toString: function() {
+    return this._;
+  }
 };
 
-var d3_selectAll = function(selector) {
+function sourceEvent() {
+  var current = event, source;
+  while (source = current.sourceEvent) current = source;
+  return current;
+}
+
+function point(node, event) {
+  var svg = node.ownerSVGElement || node;
+
+  if (svg.createSVGPoint) {
+    var point = svg.createSVGPoint();
+    point.x = event.clientX, point.y = event.clientY;
+    point = point.matrixTransform(node.getScreenCTM().inverse());
+    return [point.x, point.y];
+  }
+
+  var rect = node.getBoundingClientRect();
+  return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
+}
+
+function d3_mouse(node) {
+  var event = sourceEvent();
+  if (event.changedTouches) event = event.changedTouches[0];
+  return point(node, event);
+}
+
+function d3_selectAll(selector) {
   return typeof selector === "string"
       ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
       : new Selection([selector == null ? [] : selector], root);
-};
+}
 
-var touch = function(node, touches, identifier) {
+function touch(node, touches, identifier) {
   if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
 
   for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
@@ -1747,9 +1764,9 @@ var touch = function(node, touches, identifier) {
   }
 
   return null;
-};
+}
 
-var d3_touches = function(node, touches) {
+function d3_touches(node, touches) {
   if (touches == null) touches = sourceEvent().touches;
 
   for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
@@ -1757,18 +1774,18 @@ var d3_touches = function(node, touches) {
   }
 
   return points;
-};
+}
 
 function nopropagation() {
   event.stopImmediatePropagation();
 }
 
-var noevent = function() {
+function noevent() {
   event.preventDefault();
   event.stopImmediatePropagation();
-};
+}
 
-var dragDisable = function(view) {
+function dragDisable(view) {
   var root = view.document.documentElement,
       selection = d3_select(view).on("dragstart.drag", noevent, true);
   if ("onselectstart" in root) {
@@ -1777,7 +1794,7 @@ var dragDisable = function(view) {
     root.__noselect = root.style.MozUserSelect;
     root.style.MozUserSelect = "none";
   }
-};
+}
 
 function yesdrag(view, noclick) {
   var root = view.document.documentElement,
@@ -1794,11 +1811,11 @@ function yesdrag(view, noclick) {
   }
 }
 
-var constant$2 = function(x) {
+function constant$2(x) {
   return function() {
     return x;
   };
-};
+}
 
 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
   this.target = target;
@@ -1819,7 +1836,7 @@ DragEvent.prototype.on = function() {
 };
 
 // Ignore right-click, since that should open the context menu.
-function defaultFilter$1() {
+function defaultFilter() {
   return !event.button;
 }
 
@@ -1835,8 +1852,8 @@ function defaultTouchable() {
   return "ontouchstart" in this;
 }
 
-var drag = function() {
-  var filter = defaultFilter$1,
+function drag() {
+  var filter = defaultFilter,
       container = defaultContainer,
       subject = defaultSubject,
       touchable = defaultTouchable,
@@ -1977,12 +1994,12 @@ var drag = function() {
   };
 
   return drag;
-};
+}
 
-var define = function(constructor, factory, prototype) {
+function define(constructor, factory, prototype) {
   constructor.prototype = factory.prototype = prototype;
   prototype.constructor = constructor;
-};
+}
 
 function extend(parent, definition) {
   var prototype = Object.create(parent.prototype);
@@ -2493,7 +2510,7 @@ function basis(t1, v0, v1, v2, v3) {
       + t3 * v3) / 6;
 }
 
-var basis$1 = function(values) {
+function basis$1(values) {
   var n = values.length - 1;
   return function(t) {
     var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
@@ -2503,9 +2520,9 @@ var basis$1 = function(values) {
         v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
     return basis((t - i / n) * n, v0, v1, v2, v3);
   };
-};
+}
 
-var basisClosed = function(values) {
+function basisClosed(values) {
   var n = values.length;
   return function(t) {
     var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
@@ -2515,13 +2532,13 @@ var basisClosed = function(values) {
         v3 = values[(i + 2) % n];
     return basis((t - i / n) * n, v0, v1, v2, v3);
   };
-};
+}
 
-var constant$3 = function(x) {
+function constant$3(x) {
   return function() {
     return x;
   };
-};
+}
 
 function linear(a, d) {
   return function(t) {
@@ -2552,12 +2569,12 @@ function nogamma(a, b) {
 }
 
 var d3_interpolateRgb = (function rgbGamma(y) {
-  var color$$1 = gamma(y);
+  var color = gamma(y);
 
   function rgb$$1(start, end) {
-    var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
-        g = color$$1(start.g, end.g),
-        b = color$$1(start.b, end.b),
+    var r = color((start = rgb(start)).r, (end = rgb(end)).r),
+        g = color(start.g, end.g),
+        b = color(start.b, end.b),
         opacity = nogamma(start.opacity, end.opacity);
     return function(t) {
       start.r = r(t);
@@ -2579,22 +2596,22 @@ function rgbSpline(spline) {
         r = new Array(n),
         g = new Array(n),
         b = new Array(n),
-        i, color$$1;
+        i, color;
     for (i = 0; i < n; ++i) {
-      color$$1 = rgb(colors[i]);
-      r[i] = color$$1.r || 0;
-      g[i] = color$$1.g || 0;
-      b[i] = color$$1.b || 0;
+      color = rgb(colors[i]);
+      r[i] = color.r || 0;
+      g[i] = color.g || 0;
+      b[i] = color.b || 0;
     }
     r = spline(r);
     g = spline(g);
     b = spline(b);
-    color$$1.opacity = 1;
+    color.opacity = 1;
     return function(t) {
-      color$$1.r = r(t);
-      color$$1.g = g(t);
-      color$$1.b = b(t);
-      return color$$1 + "";
+      color.r = r(t);
+      color.g = g(t);
+      color.b = b(t);
+      return color + "";
     };
   };
 }
@@ -2602,10 +2619,10 @@ function rgbSpline(spline) {
 var rgbBasis = rgbSpline(basis$1);
 var rgbBasisClosed = rgbSpline(basisClosed);
 
-var array$1 = function(a, b) {
+function array$1(a, b) {
   var nb = b ? b.length : 0,
       na = a ? Math.min(nb, a.length) : 0,
-      x = new Array(nb),
+      x = new Array(na),
       c = new Array(nb),
       i;
 
@@ -2616,22 +2633,22 @@ var array$1 = function(a, b) {
     for (i = 0; i < na; ++i) c[i] = x[i](t);
     return c;
   };
-};
+}
 
-var date = function(a, b) {
+function date(a, b) {
   var d = new Date;
   return a = +a, b -= a, function(t) {
     return d.setTime(a + b * t), d;
   };
-};
+}
 
-var d3_interpolateNumber = function(a, b) {
+function d3_interpolateNumber(a, b) {
   return a = +a, b -= a, function(t) {
     return a + b * t;
   };
-};
+}
 
-var object = function(a, b) {
+function object(a, b) {
   var i = {},
       c = {},
       k;
@@ -2651,7 +2668,7 @@ var object = function(a, b) {
     for (k in i) c[k] = i[k](t);
     return c;
   };
-};
+}
 
 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
 var reB = new RegExp(reA.source, "g");
@@ -2668,7 +2685,7 @@ function one(b) {
   };
 }
 
-var interpolateString = function(a, b) {
+function interpolateString(a, b) {
   var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
       am, // current match in a
       bm, // current match in b
@@ -2714,9 +2731,9 @@ var interpolateString = function(a, b) {
           for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
           return s.join("");
         });
-};
+}
 
-var d3_interpolate = function(a, b) {
+function d3_interpolate(a, b) {
   var t = typeof b, c;
   return b == null || t === "boolean" ? constant$3(b)
       : (t === "number" ? d3_interpolateNumber
@@ -2726,13 +2743,13 @@ var d3_interpolate = function(a, b) {
       : Array.isArray(b) ? array$1
       : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
       : d3_interpolateNumber)(a, b);
-};
+}
 
-var interpolateRound = function(a, b) {
+function interpolateRound(a, b) {
   return a = +a, b -= a, function(t) {
     return Math.round(a + b * t);
   };
-};
+}
 
 var degrees = 180 / Math.PI;
 
@@ -2745,7 +2762,7 @@ var identity$2 = {
   scaleY: 1
 };
 
-var decompose = function(a, b, c, d, e, f) {
+function decompose(a, b, c, d, e, f) {
   var scaleX, scaleY, skewX;
   if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
   if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
@@ -2759,7 +2776,7 @@ var decompose = function(a, b, c, d, e, f) {
     scaleX: scaleX,
     scaleY: scaleY
   };
-};
+}
 
 var cssNode;
 var cssRoot;
@@ -2865,7 +2882,7 @@ function tanh(x) {
 
 // p0 = [ux0, uy0, w0]
 // p1 = [ux1, uy1, w1]
-var interpolateZoom = function(p0, p1) {
+function interpolateZoom(p0, p1) {
   var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
       ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
       dx = ux1 - ux0,
@@ -2909,7 +2926,7 @@ var interpolateZoom = function(p0, p1) {
   i.duration = S * 1000;
 
   return i;
-};
+}
 
 function hsl$1(hue$$1) {
   return function(start, end) {
@@ -2990,11 +3007,11 @@ function cubehelix$1(hue$$1) {
 var cubehelix$2 = cubehelix$1(hue);
 var cubehelixLong = cubehelix$1(nogamma);
 
-var d3_quantize = function(interpolator, n) {
+function d3_quantize(interpolator, n) {
   var samples = new Array(n);
   for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
   return samples;
-};
+}
 
 var frame = 0;
 var timeout = 0;
@@ -3107,7 +3124,7 @@ function sleep(time) {
   }
 }
 
-var d3_timeout = function(callback, delay, time) {
+function d3_timeout(callback, delay, time) {
   var t = new Timer;
   delay = delay == null ? 0 : +delay;
   t.restart(function(elapsed) {
@@ -3115,9 +3132,9 @@ var d3_timeout = function(callback, delay, time) {
     callback(elapsed + delay);
   }, delay, time);
   return t;
-};
+}
 
-var interval$1 = function(callback, delay, time) {
+function interval$1(callback, delay, time) {
   var t = new Timer, total = delay;
   if (delay == null) return t.restart(callback, delay, time), t;
   delay = +delay, time = time == null ? now() : +time;
@@ -3127,7 +3144,7 @@ var interval$1 = function(callback, delay, time) {
     callback(elapsed);
   }, delay, time);
   return t;
-};
+}
 
 var emptyOn = dispatch("start", "end", "interrupt");
 var emptyTween = [];
@@ -3140,11 +3157,11 @@ var RUNNING = 4;
 var ENDING = 5;
 var ENDED = 6;
 
-var schedule = function(node, name, id, index, group, timing) {
+function schedule(node, name, id, index, group, timing) {
   var schedules = node.__transition;
   if (!schedules) node.__transition = {};
   else if (id in schedules) return;
-  create(node, id, {
+  create$1(node, id, {
     name: name,
     index: index, // For context during callback.
     group: group, // For context during callback.
@@ -3157,27 +3174,27 @@ var schedule = function(node, name, id, index, group, timing) {
     timer: null,
     state: CREATED
   });
-};
+}
 
 function init(node, id) {
-  var schedule = node.__transition;
-  if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
+  var schedule = get$1(node, id);
+  if (schedule.state > CREATED) throw new Error("too late; already scheduled");
   return schedule;
 }
 
 function set$1(node, id) {
-  var schedule = node.__transition;
-  if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
+  var schedule = get$1(node, id);
+  if (schedule.state > STARTING) throw new Error("too late; already started");
   return schedule;
 }
 
 function get$1(node, id) {
   var schedule = node.__transition;
-  if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
+  if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
   return schedule;
 }
 
-function create(node, id, self) {
+function create$1(node, id, self) {
   var schedules = node.__transition,
       tween;
 
@@ -3282,7 +3299,7 @@ function create(node, id, self) {
   }
 }
 
-var interrupt = function(node, name) {
+function interrupt(node, name) {
   var schedules = node.__transition,
       schedule$$1,
       active,
@@ -3303,13 +3320,13 @@ var interrupt = function(node, name) {
   }
 
   if (empty) delete node.__transition;
-};
+}
 
-var selection_interrupt = function(name) {
+function selection_interrupt(name) {
   return this.each(function() {
     interrupt(this, name);
   });
-};
+}
 
 function tweenRemove(id, name) {
   var tween0, tween1;
@@ -3360,7 +3377,7 @@ function tweenFunction(id, name, value) {
   };
 }
 
-var transition_tween = function(name, value) {
+function transition_tween(name, value) {
   var id = this._id;
 
   name += "";
@@ -3376,7 +3393,7 @@ var transition_tween = function(name, value) {
   }
 
   return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
-};
+}
 
 function tweenValue(transition, name, value) {
   var id = transition._id;
@@ -3391,13 +3408,13 @@ function tweenValue(transition, name, value) {
   };
 }
 
-var interpolate = function(a, b) {
+function interpolate(a, b) {
   var c;
   return (typeof b === "number" ? d3_interpolateNumber
       : b instanceof color ? d3_interpolateRgb
       : (c = color(b)) ? (b = c, d3_interpolateRgb)
       : interpolateString)(a, b);
-};
+}
 
 function attrRemove$1(name) {
   return function() {
@@ -3461,13 +3478,13 @@ function attrFunctionNS$1(fullname, interpolate$$1, value) {
   };
 }
 
-var transition_attr = function(name, value) {
+function transition_attr(name, value) {
   var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
   return this.attrTween(name, typeof value === "function"
       ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
       : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
       : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
-};
+}
 
 function attrTweenNS(fullname, value) {
   function tween() {
@@ -3491,14 +3508,14 @@ function attrTween(name, value) {
   return tween;
 }
 
-var transition_attrTween = function(name, value) {
+function transition_attrTween(name, value) {
   var key = "attr." + name;
   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
   if (value == null) return this.tween(key, null);
   if (typeof value !== "function") throw new Error;
   var fullname = namespace(name);
   return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
-};
+}
 
 function delayFunction(id, value) {
   return function() {
@@ -3512,7 +3529,7 @@ function delayConstant(id, value) {
   };
 }
 
-var transition_delay = function(value) {
+function transition_delay(value) {
   var id = this._id;
 
   return arguments.length
@@ -3520,7 +3537,7 @@ var transition_delay = function(value) {
           ? delayFunction
           : delayConstant)(id, value))
       : get$1(this.node(), id).delay;
-};
+}
 
 function durationFunction(id, value) {
   return function() {
@@ -3534,7 +3551,7 @@ function durationConstant(id, value) {
   };
 }
 
-var transition_duration = function(value) {
+function transition_duration(value) {
   var id = this._id;
 
   return arguments.length
@@ -3542,7 +3559,7 @@ var transition_duration = function(value) {
           ? durationFunction
           : durationConstant)(id, value))
       : get$1(this.node(), id).duration;
-};
+}
 
 function easeConstant(id, value) {
   if (typeof value !== "function") throw new Error;
@@ -3551,15 +3568,15 @@ function easeConstant(id, value) {
   };
 }
 
-var transition_ease = function(value) {
+function transition_ease(value) {
   var id = this._id;
 
   return arguments.length
       ? this.each(easeConstant(id, value))
       : get$1(this.node(), id).ease;
-};
+}
 
-var transition_filter = function(match) {
+function transition_filter(match) {
   if (typeof match !== "function") match = matcher$1(match);
 
   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
@@ -3571,9 +3588,9 @@ var transition_filter = function(match) {
   }
 
   return new Transition(subgroups, this._parents, this._name, this._id);
-};
+}
 
-var transition_merge = function(transition$$1) {
+function transition_merge(transition$$1) {
   if (transition$$1._id !== this._id) throw new Error;
 
   for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
@@ -3589,7 +3606,7 @@ var transition_merge = function(transition$$1) {
   }
 
   return new Transition(merges, this._parents, this._name, this._id);
-};
+}
 
 function start(name) {
   return (name + "").trim().split(/^|\s+/).every(function(t) {
@@ -3614,13 +3631,13 @@ function onFunction(id, name, listener) {
   };
 }
 
-var transition_on = function(name, listener) {
+function transition_on(name, listener) {
   var id = this._id;
 
   return arguments.length < 2
       ? get$1(this.node(), id).on.on(name)
       : this.each(onFunction(id, name, listener));
-};
+}
 
 function removeFunction(id) {
   return function() {
@@ -3630,11 +3647,11 @@ function removeFunction(id) {
   };
 }
 
-var transition_remove = function() {
+function transition_remove() {
   return this.on("end.remove", removeFunction(this._id));
-};
+}
 
-var transition_select = function(select) {
+function transition_select(select) {
   var name = this._name,
       id = this._id;
 
@@ -3651,9 +3668,9 @@ var transition_select = function(select) {
   }
 
   return new Transition(subgroups, this._parents, name, id);
-};
+}
 
-var transition_selectAll = function(select) {
+function transition_selectAll(select) {
   var name = this._name,
       id = this._id;
 
@@ -3674,13 +3691,13 @@ var transition_selectAll = function(select) {
   }
 
   return new Transition(subgroups, parents, name, id);
-};
+}
 
 var Selection$1 = selection.prototype.constructor;
 
-var transition_selection = function() {
+function transition_selection() {
   return new Selection$1(this._groups, this._parents);
-};
+}
 
 function styleRemove$1(name, interpolate$$1) {
   var value00,
@@ -3726,7 +3743,7 @@ function styleFunction$1(name, interpolate$$1, value) {
   };
 }
 
-var transition_style = function(name, value, priority) {
+function transition_style(name, value, priority) {
   var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
   return value == null ? this
           .styleTween(name, styleRemove$1(name, i))
@@ -3734,7 +3751,7 @@ var transition_style = function(name, value, priority) {
       : this.styleTween(name, typeof value === "function"
           ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
           : styleConstant$1(name, i, value + ""), priority);
-};
+}
 
 function styleTween(name, value, priority) {
   function tween() {
@@ -3747,13 +3764,13 @@ function styleTween(name, value, priority) {
   return tween;
 }
 
-var transition_styleTween = function(name, value, priority) {
+function transition_styleTween(name, value, priority) {
   var key = "style." + (name += "");
   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
   if (value == null) return this.tween(key, null);
   if (typeof value !== "function") throw new Error;
   return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
-};
+}
 
 function textConstant$1(value) {
   return function() {
@@ -3768,13 +3785,13 @@ function textFunction$1(value) {
   };
 }
 
-var transition_text = function(value) {
+function transition_text(value) {
   return this.tween("text", typeof value === "function"
       ? textFunction$1(tweenValue(this, "text", value))
       : textConstant$1(value == null ? "" : value + ""));
-};
+}
 
-var transition_transition = function() {
+function transition_transition() {
   var name = this._name,
       id0 = this._id,
       id1 = newId();
@@ -3794,7 +3811,7 @@ var transition_transition = function() {
   }
 
   return new Transition(groups, this._parents, name, id1);
-};
+}
 
 var id = 0;
 
@@ -4070,7 +4087,7 @@ function inherit(node, id) {
   return timing;
 }
 
-var selection_transition = function(name) {
+function selection_transition(name) {
   var id,
       timing;
 
@@ -4089,14 +4106,14 @@ var selection_transition = function(name) {
   }
 
   return new Transition(groups, this._parents, name, id);
-};
+}
 
 selection.prototype.interrupt = selection_interrupt;
 selection.prototype.transition = selection_transition;
 
 var root$1 = [null];
 
-var active = function(node, name) {
+function active(node, name) {
   var schedules = node.__transition,
       schedule$$1,
       i;
@@ -4111,28 +4128,28 @@ var active = function(node, name) {
   }
 
   return null;
-};
+}
 
-var constant$4 = function(x) {
+function constant$4(x) {
   return function() {
     return x;
   };
-};
+}
 
-var BrushEvent = function(target, type, selection) {
+function BrushEvent(target, type, selection) {
   this.target = target;
   this.type = type;
   this.selection = selection;
-};
+}
 
 function nopropagation$1() {
   event.stopImmediatePropagation();
 }
 
-var noevent$1 = function() {
+function noevent$1() {
   event.preventDefault();
   event.stopImmediatePropagation();
-};
+}
 
 var MODE_DRAG = {name: "drag"};
 var MODE_SPACE = {name: "space"};
@@ -4222,7 +4239,7 @@ function type(t) {
 }
 
 // Ignore right-click, since that should open the context menu.
-function defaultFilter() {
+function defaultFilter$1() {
   return !event.button;
 }
 
@@ -4232,12 +4249,12 @@ function defaultExtent() {
 }
 
 // Like d3.local, but with the name “__brush” rather than auto-generated.
-function local(node) {
+function local$1(node) {
   while (!node.__brush) if (!(node = node.parentNode)) return;
   return node.__brush;
 }
 
-function empty(extent) {
+function empty$1(extent) {
   return extent[0][0] === extent[1][0]
       || extent[0][1] === extent[1][1];
 }
@@ -4255,13 +4272,13 @@ function brushY() {
   return brush$1(Y);
 }
 
-var brush = function() {
+function brush() {
   return brush$1(XY);
-};
+}
 
 function brush$1(dim) {
   var extent = defaultExtent,
-      filter = defaultFilter,
+      filter = defaultFilter$1,
       listeners = dispatch(brush, "start", "brush", "end"),
       handleSize = 6,
       touchending;
@@ -4278,7 +4295,7 @@ function brush$1(dim) {
         .attr("cursor", cursors.overlay)
       .merge(overlay)
         .each(function() {
-          var extent = local(this).extent;
+          var extent = local$1(this).extent;
           d3_select(this)
               .attr("x", extent[0][0])
               .attr("y", extent[0][1])
@@ -4327,7 +4344,7 @@ function brush$1(dim) {
                 i = d3_interpolate(selection0, selection1);
 
             function tween(t) {
-              state.selection = t === 1 && empty(selection1) ? null : i(t);
+              state.selection = t === 1 && empty$1(selection1) ? null : i(t);
               redraw.call(that);
               emit.brush();
             }
@@ -4344,7 +4361,7 @@ function brush$1(dim) {
                 emit = emitter(that, args).beforestart();
 
             interrupt(that);
-            state.selection = selection1 == null || empty(selection1) ? null : selection1;
+            state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
             redraw.call(that);
             emit.start().brush().end();
           });
@@ -4353,7 +4370,7 @@ function brush$1(dim) {
 
   function redraw() {
     var group = d3_select(this),
-        selection = local(this).selection;
+        selection = local$1(this).selection;
 
     if (selection) {
       group.selectAll(".selection")
@@ -4424,7 +4441,7 @@ function brush$1(dim) {
         mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
         signX = dim === Y ? null : signsX[type],
         signY = dim === X ? null : signsY[type],
-        state = local(that),
+        state = local$1(that),
         extent = state.extent,
         selection = state.selection,
         W = extent[0][0], w0, w1,
@@ -4564,7 +4581,7 @@ function brush$1(dim) {
       group.attr("pointer-events", "all");
       overlay.attr("cursor", cursors.overlay);
       if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
-      if (empty(selection)) state.selection = null, redraw.call(that);
+      if (empty$1(selection)) state.selection = null, redraw.call(that);
       emit.end();
     }
 
@@ -4681,7 +4698,7 @@ function compareValue(compare) {
   };
 }
 
-var chord = function() {
+function chord() {
   var padAngle = 0,
       sortGroups = null,
       sortSubgroups = null,
@@ -4789,15 +4806,15 @@ var chord = function() {
   };
 
   return chord;
-};
+}
 
 var slice$2 = Array.prototype.slice;
 
-var constant$5 = function(x) {
+function constant$5(x) {
   return function() {
     return x;
   };
-};
+}
 
 var pi$2 = Math.PI;
 var tau$2 = 2 * pi$2;
@@ -4948,7 +4965,7 @@ function defaultEndAngle(d) {
   return d.endAngle;
 }
 
-var ribbon = function() {
+function ribbon() {
   var source = defaultSource,
       target = defaultTarget,
       radius = defaultRadius,
@@ -5009,7 +5026,7 @@ var ribbon = function() {
   };
 
   return ribbon;
-};
+}
 
 var prefix = "$";
 
@@ -5085,7 +5102,7 @@ function map$1(object, f) {
   return map;
 }
 
-var nest = function() {
+function nest() {
   var keys = [],
       sortKeys = [],
       sortValues,
@@ -5139,7 +5156,7 @@ var nest = function() {
     sortValues: function(order) { sortValues = order; return nest; },
     rollup: function(f) { rollup = f; return nest; }
   };
-};
+}
 
 function createObject() {
   return {};
@@ -5193,23 +5210,23 @@ function set$2(object, f) {
   return set;
 }
 
-var keys = function(map) {
+function keys(map) {
   var keys = [];
   for (var key in map) keys.push(key);
   return keys;
-};
+}
 
-var values = function(map) {
+function values(map) {
   var values = [];
   for (var key in map) values.push(map[key]);
   return values;
-};
+}
 
-var entries = function(map) {
+function entries(map) {
   var entries = [];
   for (var key in map) entries.push({key: key, value: map[key]});
   return entries;
-};
+}
 
 var EOL = {};
 var EOF = {};
@@ -5246,7 +5263,7 @@ function inferColumns(rows) {
   return columns;
 }
 
-var dsv = function(delimiter) {
+function dsv(delimiter) {
   var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
       DELIMITER = delimiter.charCodeAt(0);
 
@@ -5255,7 +5272,7 @@ var dsv = function(delimiter) {
       if (convert) return convert(row, i - 1);
       columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
     });
-    rows.columns = columns;
+    rows.columns = columns || [];
     return rows;
   }
 
@@ -5337,7 +5354,7 @@ var dsv = function(delimiter) {
     format: format,
     formatRows: formatRows
   };
-};
+}
 
 var csv = dsv(",");
 
@@ -5353,7 +5370,7 @@ var tsvParseRows = tsv.parseRows;
 var tsvFormat = tsv.format;
 var tsvFormatRows = tsv.formatRows;
 
-var center$1 = function(x, y) {
+function center$1(x, y) {
   var nodes;
 
   if (x == null) x = 0;
@@ -5388,23 +5405,23 @@ var center$1 = function(x, y) {
   };
 
   return force;
-};
+}
 
-var constant$6 = function(x) {
+function constant$6(x) {
   return function() {
     return x;
   };
-};
+}
 
-var jiggle = function() {
+function jiggle() {
   return (Math.random() - 0.5) * 1e-6;
-};
+}
 
-var tree_add = function(d) {
+function tree_add(d) {
   var x = +this._x.call(null, d),
       y = +this._y.call(null, d);
   return add(this.cover(x, y), x, y, d);
-};
+}
 
 function add(tree, x, y, d) {
   if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
@@ -5486,7 +5503,7 @@ function addAll(data) {
   return this;
 }
 
-var tree_cover = function(x, y) {
+function tree_cover(x, y) {
   if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
 
   var x0 = this._x0,
@@ -5543,31 +5560,31 @@ var tree_cover = function(x, y) {
   this._x1 = x1;
   this._y1 = y1;
   return this;
-};
+}
 
-var tree_data = function() {
+function tree_data() {
   var data = [];
   this.visit(function(node) {
     if (!node.length) do data.push(node.data); while (node = node.next)
   });
   return data;
-};
+}
 
-var tree_extent = function(_) {
+function tree_extent(_) {
   return arguments.length
       ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
       : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
-};
+}
 
-var Quad = function(node, x0, y0, x1, y1) {
+function Quad(node, x0, y0, x1, y1) {
   this.node = node;
   this.x0 = x0;
   this.y0 = y0;
   this.x1 = x1;
   this.y1 = y1;
-};
+}
 
-var tree_find = function(x, y, radius) {
+function tree_find(x, y, radius) {
   var data,
       x0 = this._x0,
       y0 = this._y0,
@@ -5634,9 +5651,9 @@ var tree_find = function(x, y, radius) {
   }
 
   return data;
-};
+}
 
-var tree_remove = function(d) {
+function tree_remove(d) {
   if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
 
   var parent,
@@ -5692,26 +5709,26 @@ var tree_remove = function(d) {
   }
 
   return this;
-};
+}
 
 function removeAll(data) {
   for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
   return this;
 }
 
-var tree_root = function() {
+function tree_root() {
   return this._root;
-};
+}
 
-var tree_size = function() {
+function tree_size() {
   var size = 0;
   this.visit(function(node) {
     if (!node.length) do ++size; while (node = node.next)
   });
   return size;
-};
+}
 
-var tree_visit = function(callback) {
+function tree_visit(callback) {
   var quads = [], q, node = this._root, child, x0, y0, x1, y1;
   if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
   while (q = quads.pop()) {
@@ -5724,9 +5741,9 @@ var tree_visit = function(callback) {
     }
   }
   return this;
-};
+}
 
-var tree_visitAfter = function(callback) {
+function tree_visitAfter(callback) {
   var quads = [], next = [], q;
   if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
   while (q = quads.pop()) {
@@ -5744,23 +5761,23 @@ var tree_visitAfter = function(callback) {
     callback(q.node, q.x0, q.y0, q.x1, q.y1);
   }
   return this;
-};
+}
 
 function defaultX(d) {
   return d[0];
 }
 
-var tree_x = function(_) {
+function tree_x(_) {
   return arguments.length ? (this._x = _, this) : this._x;
-};
+}
 
 function defaultY(d) {
   return d[1];
 }
 
-var tree_y = function(_) {
+function tree_y(_) {
   return arguments.length ? (this._y = _, this) : this._y;
-};
+}
 
 function quadtree(nodes, x, y) {
   var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
@@ -5831,7 +5848,7 @@ function y(d) {
   return d.y + d.vy;
 }
 
-var collide = function(radius) {
+function collide(radius) {
   var nodes,
       radii,
       strength = 1,
@@ -5916,9 +5933,9 @@ var collide = function(radius) {
   };
 
   return force;
-};
+}
 
-function index$1(d) {
+function index(d) {
   return d.index;
 }
 
@@ -5928,8 +5945,8 @@ function find(nodeById, nodeId) {
   return node;
 }
 
-var link = function(links) {
-  var id = index$1,
+function link(links) {
+  var id = index,
       strength = defaultStrength,
       strengths,
       distance = constant$6(30),
@@ -6029,7 +6046,7 @@ var link = function(links) {
   };
 
   return force;
-};
+}
 
 function x$1(d) {
   return d.x;
@@ -6042,7 +6059,7 @@ function y$1(d) {
 var initialRadius = 10;
 var initialAngle = Math.PI * (3 - Math.sqrt(5));
 
-var simulation = function(nodes) {
+function simulation(nodes) {
   var simulation,
       alpha = 1,
       alphaMin = 0.001,
@@ -6169,9 +6186,9 @@ var simulation = function(nodes) {
       return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
     }
   };
-};
+}
 
-var manyBody = function() {
+function manyBody() {
   var nodes,
       node,
       alpha,
@@ -6279,9 +6296,9 @@ var manyBody = function() {
   };
 
   return force;
-};
+}
 
-var radial = function(radius, x, y) {
+function radial(radius, x, y) {
   var nodes,
       strength = constant$6(0.1),
       strengths,
@@ -6335,9 +6352,9 @@ var radial = function(radius, x, y) {
   };
 
   return force;
-};
+}
 
-var x$2 = function(x) {
+function x$2(x) {
   var strength = constant$6(0.1),
       nodes,
       strengths,
@@ -6375,9 +6392,9 @@ var x$2 = function(x) {
   };
 
   return force;
-};
+}
 
-var y$2 = function(y) {
+function y$2(y) {
   var strength = constant$6(0.1),
       nodes,
       strengths,
@@ -6415,12 +6432,12 @@ var y$2 = function(y) {
   };
 
   return force;
-};
+}
 
 // Computes the decimal coefficient and exponent of the specified number x with
 // significant digits p, where x is positive and p is in [1, 21] or undefined.
 // For example, formatDecimal(1.23) returns ["123", 0].
-var formatDecimal = function(x, p) {
+function formatDecimal(x, p) {
   if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
   var i, coefficient = x.slice(0, i);
 
@@ -6430,13 +6447,13 @@ var formatDecimal = function(x, p) {
     coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
     +x.slice(i + 1)
   ];
-};
+}
 
-var exponent$1 = function(x) {
+function exponent$1(x) {
   return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
-};
+}
 
-var formatGroup = function(grouping, thousands) {
+function formatGroup(grouping, thousands) {
   return function(value, width) {
     var i = value.length,
         t = [],
@@ -6453,17 +6470,17 @@ var formatGroup = function(grouping, thousands) {
 
     return t.reverse().join(thousands);
   };
-};
+}
 
-var formatNumerals = function(numerals) {
+function formatNumerals(numerals) {
   return function(value) {
     return value.replace(/[0-9]/g, function(i) {
       return numerals[+i];
     });
   };
-};
+}
 
-var formatDefault = function(x, p) {
+function formatDefault(x, p) {
   x = x.toPrecision(p);
 
   out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
@@ -6476,11 +6493,11 @@ var formatDefault = function(x, p) {
   }
 
   return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
-};
+}
 
 var prefixExponent;
 
-var formatPrefixAuto = function(x, p) {
+function formatPrefixAuto(x, p) {
   var d = formatDecimal(x, p);
   if (!d) return x + "";
   var coefficient = d[0],
@@ -6491,9 +6508,9 @@ var formatPrefixAuto = function(x, p) {
       : i > n ? coefficient + new Array(i - n + 1).join("0")
       : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
       : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
-};
+}
 
-var formatRounded = function(x, p) {
+function formatRounded(x, p) {
   var d = formatDecimal(x, p);
   if (!d) return x + "";
   var coefficient = d[0],
@@ -6501,7 +6518,7 @@ var formatRounded = function(x, p) {
   return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
       : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
       : coefficient + new Array(exponent - coefficient.length + 2).join("0");
-};
+}
 
 var formatTypes = {
   "": formatDefault,
@@ -6575,13 +6592,13 @@ FormatSpecifier.prototype.toString = function() {
       + this.type;
 };
 
-var identity$3 = function(x) {
+function identity$3(x) {
   return x;
-};
+}
 
 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
 
-var formatLocale = function(locale) {
+function formatLocale(locale) {
   var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
       currency = locale.currency,
       decimal = locale.decimal,
@@ -6640,7 +6657,7 @@ var formatLocale = function(locale) {
 
         // Compute the prefix and suffix.
         valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
-        valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
+        valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
 
         // Break the formatted value into the integer “value” part that can be
         // grouped, and fractional or exponential “suffix” part that is not.
@@ -6698,7 +6715,7 @@ var formatLocale = function(locale) {
     format: newFormat,
     formatPrefix: formatPrefix
   };
-};
+}
 
 var locale;
 var format;
@@ -6718,18 +6735,18 @@ function defaultLocale(definition) {
   return locale;
 }
 
-var precisionFixed = function(step) {
+function precisionFixed(step) {
   return Math.max(0, -exponent$1(Math.abs(step)));
-};
+}
 
-var precisionPrefix = function(step, value) {
+function precisionPrefix(step, value) {
   return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
-};
+}
 
-var precisionRound = function(step, max) {
+function precisionRound(step, max) {
   step = Math.abs(step), max = Math.abs(max) - step;
   return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
-};
+}
 
 // Adds floating point numbers with twice the normal precision.
 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
@@ -6738,9 +6755,9 @@ var precisionRound = function(step, max) {
 // Code adapted from GeographicLib by Charles F. F. Karney,
 // http://geographiclib.sourceforge.net/
 
-var adder = function() {
+function adder() {
   return new Adder;
-};
+}
 
 function Adder() {
   this.reset();
@@ -6872,13 +6889,13 @@ function streamPolygon(coordinates, stream) {
   stream.polygonEnd();
 }
 
-var d3_geoStream = function(object, stream) {
+function d3_geoStream(object, stream) {
   if (object && streamObjectType.hasOwnProperty(object.type)) {
     streamObjectType[object.type](object, stream);
   } else {
     streamGeometry(object, stream);
   }
-};
+}
 
 var areaRingSum = adder();
 
@@ -6944,11 +6961,11 @@ function areaPoint(lambda, phi) {
   lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
 }
 
-var d3_geoArea = function(object) {
+function d3_geoArea(object) {
   areaSum.reset();
   d3_geoStream(object, areaStream);
   return areaSum * 2;
-};
+}
 
 function spherical(cartesian) {
   return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
@@ -7120,7 +7137,7 @@ function rangeContains(range, x) {
   return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
 }
 
-var d3_geoBounds = function(feature) {
+function d3_geoBounds(feature) {
   var i, n, a, b, merged, deltaMax, delta;
 
   phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
@@ -7155,7 +7172,7 @@ var d3_geoBounds = function(feature) {
   return lambda0$1 === Infinity || phi0 === Infinity
       ? [[NaN, NaN], [NaN, NaN]]
       : [[lambda0$1, phi0], [lambda1, phi1]];
-};
+}
 
 var W0;
 var W1;
@@ -7279,7 +7296,7 @@ function centroidRingPoint(lambda, phi) {
   centroidPointCartesian(x0, y0, z0);
 }
 
-var d3_geoCentroid = function(object) {
+function d3_geoCentroid(object) {
   W0 = W1 =
   X0 = Y0 = Z0 =
   X1 = Y1 = Z1 =
@@ -7302,15 +7319,15 @@ var d3_geoCentroid = function(object) {
   }
 
   return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
-};
+}
 
-var constant$7 = function(x) {
+function constant$7(x) {
   return function() {
     return x;
   };
-};
+}
 
-var compose = function(a, b) {
+function compose(a, b) {
 
   function compose(x, y) {
     return x = a(x, y), b(x[0], x[1]);
@@ -7321,7 +7338,7 @@ var compose = function(a, b) {
   };
 
   return compose;
-};
+}
 
 function rotationIdentity(lambda, phi) {
   return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
@@ -7381,7 +7398,7 @@ function rotationPhiGamma(deltaPhi, deltaGamma) {
   return rotation;
 }
 
-var rotation = function(rotate) {
+function rotation(rotate) {
   rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
 
   function forward(coordinates) {
@@ -7395,7 +7412,7 @@ var rotation = function(rotate) {
   };
 
   return forward;
-};
+}
 
 // Generates a circle centered at [0°, 0°], with a given radius and precision.
 function circleStream(stream, radius, delta, direction, t0, t1) {
@@ -7425,7 +7442,7 @@ function circleRadius(cosRadius, point) {
   return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
 }
 
-var circle = function() {
+function circle() {
   var center = constant$7([0, 0]),
       radius = constant$7(90),
       precision = constant$7(6),
@@ -7463,9 +7480,9 @@ var circle = function() {
   };
 
   return circle;
-};
+}
 
-var clipBuffer = function() {
+function clipBuffer() {
   var lines = [],
       line;
   return {
@@ -7486,11 +7503,11 @@ var clipBuffer = function() {
       return result;
     }
   };
-};
+}
 
-var pointEqual = function(a, b) {
+function pointEqual(a, b) {
   return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
-};
+}
 
 function Intersection(point, points, other, entry) {
   this.x = point;
@@ -7504,7 +7521,7 @@ function Intersection(point, points, other, entry) {
 // A generalized polygon clipping algorithm: given a polygon that has been cut
 // into its visible line segments, and rejoins the segments by interpolating
 // along the clip edge.
-var clipRejoin = function(segments, compareIntersection, startInside, interpolate, stream) {
+function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
   var subject = [],
       clip = [],
       i,
@@ -7575,7 +7592,7 @@ var clipRejoin = function(segments, compareIntersection, startInside, interpolat
     } while (!current.v);
     stream.lineEnd();
   }
-};
+}
 
 function link$1(array) {
   if (!(n = array.length)) return;
@@ -7594,7 +7611,7 @@ function link$1(array) {
 
 var sum$1 = adder();
 
-var polygonContains = function(polygon, point) {
+function polygonContains(polygon, point) {
   var lambda = point[0],
       phi = point[1],
       normal = [sin$1(lambda), -cos$1(lambda), 0],
@@ -7655,9 +7672,9 @@ var polygonContains = function(polygon, point) {
   // same side as the South pole.
 
   return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
-};
+}
 
-var clip = function(pointVisible, clipLine, interpolate, start) {
+function clip(pointVisible, clipLine, interpolate, start) {
   return function(sink) {
     var line = clipLine(sink),
         ringBuffer = clipBuffer(),
@@ -7770,7 +7787,7 @@ var clip = function(pointVisible, clipLine, interpolate, start) {
 
     return clip;
   };
-};
+}
 
 function validSegment(segment) {
   return segment.length > 1;
@@ -7873,7 +7890,7 @@ function clipAntimeridianInterpolate(from, to, direction, stream) {
   }
 }
 
-var clipCircle = function(radius) {
+function clipCircle(radius) {
   var cr = cos$1(radius),
       delta = 6 * radians,
       smallRadius = cr > 0,
@@ -8048,9 +8065,9 @@ var clipCircle = function(radius) {
   }
 
   return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
-};
+}
 
-var clipLine = function(a, b, x0, y0, x1, y1) {
+function clipLine(a, b, x0, y0, x1, y1) {
   var ax = a[0],
       ay = a[1],
       bx = b[0],
@@ -8108,7 +8125,7 @@ var clipLine = function(a, b, x0, y0, x1, y1) {
   if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
   if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
   return true;
-};
+}
 
 var clipMax = 1e9;
 var clipMin = -clipMax;
@@ -8274,7 +8291,7 @@ function clipRectangle(x0, y0, x1, y1) {
   };
 }
 
-var extent$1 = function() {
+function extent$1() {
   var x0 = 0,
       y0 = 0,
       x1 = 960,
@@ -8291,7 +8308,7 @@ var extent$1 = function() {
       return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
     }
   };
-};
+}
 
 var lengthSum = adder();
 var lambda0$2;
@@ -8336,20 +8353,20 @@ function lengthPoint(lambda, phi) {
   lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
 }
 
-var d3_geoLength = function(object) {
+function d3_geoLength(object) {
   lengthSum.reset();
   d3_geoStream(object, lengthStream);
   return +lengthSum;
-};
+}
 
 var coordinates = [null, null];
 var object$1 = {type: "LineString", coordinates: coordinates};
 
-var distance = function(a, b) {
+function distance(a, b) {
   coordinates[0] = a;
   coordinates[1] = b;
   return d3_geoLength(object$1);
-};
+}
 
 var containsObjectType = {
   Feature: function(object, point) {
@@ -8426,11 +8443,11 @@ function pointRadians(point) {
   return [point[0] * radians, point[1] * radians];
 }
 
-var contains = function(object, point) {
+function contains(object, point) {
   return (object && containsObjectType.hasOwnProperty(object.type)
       ? containsObjectType[object.type]
       : containsGeometry)(object, point);
-};
+}
 
 function graticuleX(y0, y1, dy) {
   var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
@@ -8535,7 +8552,7 @@ function graticule10() {
   return graticule()();
 }
 
-var interpolate$1 = function(a, b) {
+function interpolate$1(a, b) {
   var x0 = a[0] * radians,
       y0 = a[1] * radians,
       x1 = b[0] * radians,
@@ -8568,11 +8585,11 @@ var interpolate$1 = function(a, b) {
   interpolate.distance = d;
 
   return interpolate;
-};
+}
 
-var identity$4 = function(x) {
+function identity$4(x) {
   return x;
-};
+}
 
 var areaSum$1 = adder();
 var areaRingSum$1 = adder();
@@ -8884,7 +8901,7 @@ function circle$1(radius) {
       + "z";
 }
 
-var d3_geoPath = function(projection, context) {
+function d3_geoPath(projection, context) {
   var pointRadius = 4.5,
       projectionStream,
       contextStream;
@@ -8935,13 +8952,13 @@ var d3_geoPath = function(projection, context) {
   };
 
   return path.projection(projection).context(context);
-};
+}
 
-var d3_geoTransform = function(methods) {
+function d3_geoTransform(methods) {
   return {
     stream: transformer(methods)
   };
-};
+}
 
 function transformer(methods) {
   return function(stream) {
@@ -8964,41 +8981,57 @@ TransformStream.prototype = {
   polygonEnd: function() { this.stream.polygonEnd(); }
 };
 
-function fitExtent(projection, extent, object) {
-  var w = extent[1][0] - extent[0][0],
-      h = extent[1][1] - extent[0][1],
-      clip = projection.clipExtent && projection.clipExtent();
-
-  projection
-      .scale(150)
-      .translate([0, 0]);
-
+function fit(projection, fitBounds, object) {
+  var clip = projection.clipExtent && projection.clipExtent();
+  projection.scale(150).translate([0, 0]);
   if (clip != null) projection.clipExtent(null);
-
   d3_geoStream(object, projection.stream(boundsStream$1));
-
-  var b = boundsStream$1.result(),
-      k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
-      x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
-      y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
-
+  fitBounds(boundsStream$1.result());
   if (clip != null) projection.clipExtent(clip);
+  return projection;
+}
 
-  return projection
-      .scale(k * 150)
-      .translate([x, y]);
+function fitExtent(projection, extent, object) {
+  return fit(projection, function(b) {
+    var w = extent[1][0] - extent[0][0],
+        h = extent[1][1] - extent[0][1],
+        k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
+        x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
+        y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
 }
 
 function fitSize(projection, size, object) {
   return fitExtent(projection, [[0, 0], size], object);
 }
 
+function fitWidth(projection, width, object) {
+  return fit(projection, function(b) {
+    var w = +width,
+        k = w / (b[1][0] - b[0][0]),
+        x = (w - k * (b[1][0] + b[0][0])) / 2,
+        y = -k * b[0][1];
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
+}
+
+function fitHeight(projection, height, object) {
+  return fit(projection, function(b) {
+    var h = +height,
+        k = h / (b[1][1] - b[0][1]),
+        x = -k * b[0][0],
+        y = (h - k * (b[1][1] + b[0][1])) / 2;
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
+}
+
 var maxDepth = 16;
 var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
 
-var resample = function(project, delta2) {
+function resample(project, delta2) {
   return +delta2 ? resample$1(project, delta2) : resampleNone(project);
-};
+}
 
 function resampleNone(project) {
   return transformer({
@@ -9185,6 +9218,14 @@ function projectionMutator(projectAt) {
     return fitSize(projection, size, object);
   };
 
+  projection.fitWidth = function(width, object) {
+    return fitWidth(projection, width, object);
+  };
+
+  projection.fitHeight = function(height, object) {
+    return fitHeight(projection, height, object);
+  };
+
   function recenter() {
     projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
     var center = project(lambda, phi);
@@ -9253,20 +9294,20 @@ function conicEqualAreaRaw(y0, y1) {
   return project;
 }
 
-var conicEqualArea = function() {
+function conicEqualArea() {
   return conicProjection(conicEqualAreaRaw)
       .scale(155.424)
       .center([0, 33.6442]);
-};
+}
 
-var albers = function() {
+function albers() {
   return conicEqualArea()
       .parallels([29.5, 45.5])
       .scale(1070)
       .translate([480, 250])
       .rotate([96, 0])
       .center([-0.6, 38.7]);
-};
+}
 
 // The projections must have mutually exclusive clip regions on the sphere,
 // as this will avoid emitting interleaving lines and polygons.
@@ -9287,7 +9328,7 @@ function multiplex(streams) {
 // scale to 1285 and adjust the translate accordingly. The set of standard
 // parallels for each region comes from USGS, which is published here:
 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
-var albersUsa = function() {
+function albersUsa() {
   var cache,
       cacheStream,
       lower48 = albers(), lower48Point,
@@ -9358,13 +9399,21 @@ var albersUsa = function() {
     return fitSize(albersUsa, size, object);
   };
 
+  albersUsa.fitWidth = function(width, object) {
+    return fitWidth(albersUsa, width, object);
+  };
+
+  albersUsa.fitHeight = function(height, object) {
+    return fitHeight(albersUsa, height, object);
+  };
+
   function reset() {
     cache = cacheStream = null;
     return albersUsa;
   }
 
   return albersUsa.scale(1070);
-};
+}
 
 function azimuthalRaw(scale) {
   return function(x, y) {
@@ -9399,11 +9448,11 @@ azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
   return 2 * asin(z / 2);
 });
 
-var azimuthalEqualArea = function() {
+function azimuthalEqualArea() {
   return projection(azimuthalEqualAreaRaw)
       .scale(124.75)
       .clipAngle(180 - 1e-3);
-};
+}
 
 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
   return (c = acos(c)) && c / sin$1(c);
@@ -9413,11 +9462,11 @@ azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
   return z;
 });
 
-var azimuthalEquidistant = function() {
+function azimuthalEquidistant() {
   return projection(azimuthalEquidistantRaw)
       .scale(79.4188)
       .clipAngle(180 - 1e-3);
-};
+}
 
 function mercatorRaw(lambda, phi) {
   return [lambda, log(tan((halfPi$2 + phi) / 2))];
@@ -9427,10 +9476,10 @@ mercatorRaw.invert = function(x, y) {
   return [x, 2 * atan(exp(y)) - halfPi$2];
 };
 
-var mercator = function() {
+function mercator() {
   return mercatorProjection(mercatorRaw)
       .scale(961 / tau$3);
-};
+}
 
 function mercatorProjection(project) {
   var m = projection(project),
@@ -9494,11 +9543,11 @@ function conicConformalRaw(y0, y1) {
   return project;
 }
 
-var conicConformal = function() {
+function conicConformal() {
   return conicProjection(conicConformalRaw)
       .scale(109.5)
       .parallels([30, 30]);
-};
+}
 
 function equirectangularRaw(lambda, phi) {
   return [lambda, phi];
@@ -9506,10 +9555,10 @@ function equirectangularRaw(lambda, phi) {
 
 equirectangularRaw.invert = equirectangularRaw;
 
-var equirectangular = function() {
+function equirectangular() {
   return projection(equirectangularRaw)
       .scale(152.63);
-};
+}
 
 function conicEquidistantRaw(y0, y1) {
   var cy0 = cos$1(y0),
@@ -9531,11 +9580,11 @@ function conicEquidistantRaw(y0, y1) {
   return project;
 }
 
-var conicEquidistant = function() {
+function conicEquidistant() {
   return conicProjection(conicEquidistantRaw)
       .scale(131.154)
       .center([0, 13.9389]);
-};
+}
 
 function gnomonicRaw(x, y) {
   var cy = cos$1(y), k = cos$1(x) * cy;
@@ -9544,11 +9593,11 @@ function gnomonicRaw(x, y) {
 
 gnomonicRaw.invert = azimuthalInvert(atan);
 
-var gnomonic = function() {
+function gnomonic() {
   return projection(gnomonicRaw)
       .scale(144.049)
       .clipAngle(60);
-};
+}
 
 function scaleTranslate(kx, ky, tx, ty) {
   return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
@@ -9558,7 +9607,7 @@ function scaleTranslate(kx, ky, tx, ty) {
   });
 }
 
-var d3_geoIdentity = function() {
+function d3_geoIdentity() {
   var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
       x0 = null, y0, x1, y1, // clip extent
       postclip = identity$4,
@@ -9598,9 +9647,15 @@ var d3_geoIdentity = function() {
     },
     fitSize: function(size, object) {
       return fitSize(projection, size, object);
+    },
+    fitWidth: function(width, object) {
+      return fitWidth(projection, width, object);
+    },
+    fitHeight: function(height, object) {
+      return fitHeight(projection, height, object);
     }
   };
-};
+}
 
 function naturalEarth1Raw(lambda, phi) {
   var phi2 = phi * phi, phi4 = phi2 * phi2;
@@ -9623,10 +9678,10 @@ naturalEarth1Raw.invert = function(x, y) {
   ];
 };
 
-var naturalEarth1 = function() {
+function naturalEarth1() {
   return projection(naturalEarth1Raw)
       .scale(175.295);
-};
+}
 
 function orthographicRaw(x, y) {
   return [cos$1(y) * sin$1(x), sin$1(y)];
@@ -9634,11 +9689,11 @@ function orthographicRaw(x, y) {
 
 orthographicRaw.invert = azimuthalInvert(asin);
 
-var orthographic = function() {
+function orthographic() {
   return projection(orthographicRaw)
       .scale(249.5)
       .clipAngle(90 + epsilon$2);
-};
+}
 
 function stereographicRaw(x, y) {
   var cy = cos$1(y), k = 1 + cos$1(x) * cy;
@@ -9649,11 +9704,11 @@ stereographicRaw.invert = azimuthalInvert(function(z) {
   return 2 * atan(z);
 });
 
-var stereographic = function() {
+function stereographic() {
   return projection(stereographicRaw)
       .scale(250)
       .clipAngle(142);
-};
+}
 
 function transverseMercatorRaw(lambda, phi) {
   return [log(tan((halfPi$2 + phi) / 2)), -lambda];
@@ -9663,7 +9718,7 @@ transverseMercatorRaw.invert = function(x, y) {
   return [-y, 2 * atan(exp(x)) - halfPi$2];
 };
 
-var transverseMercator = function() {
+function transverseMercator() {
   var m = mercatorProjection(transverseMercatorRaw),
       center = m.center,
       rotate = m.rotate;
@@ -9678,7 +9733,7 @@ var transverseMercator = function() {
 
   return rotate([0, 0, 90])
       .scale(159.155);
-};
+}
 
 function defaultSeparation(a, b) {
   return a.parent === b.parent ? 1 : 2;
@@ -9712,7 +9767,7 @@ function leafRight(node) {
   return node;
 }
 
-var cluster = function() {
+function cluster() {
   var separation = defaultSeparation,
       dx = 1,
       dy = 1,
@@ -9763,7 +9818,7 @@ var cluster = function() {
   };
 
   return cluster;
-};
+}
 
 function count(node) {
   var sum = 0,
@@ -9774,11 +9829,11 @@ function count(node) {
   node.value = sum;
 }
 
-var node_count = function() {
+function node_count() {
   return this.eachAfter(count);
-};
+}
 
-var node_each = function(callback) {
+function node_each(callback) {
   var node = this, current, next = [node], children, i, n;
   do {
     current = next.reverse(), next = [];
@@ -9790,9 +9845,9 @@ var node_each = function(callback) {
     }
   } while (next.length);
   return this;
-};
+}
 
-var node_eachBefore = function(callback) {
+function node_eachBefore(callback) {
   var node = this, nodes = [node], children, i;
   while (node = nodes.pop()) {
     callback(node), children = node.children;
@@ -9801,9 +9856,9 @@ var node_eachBefore = function(callback) {
     }
   }
   return this;
-};
+}
 
-var node_eachAfter = function(callback) {
+function node_eachAfter(callback) {
   var node = this, nodes = [node], next = [], children, i, n;
   while (node = nodes.pop()) {
     next.push(node), children = node.children;
@@ -9815,9 +9870,9 @@ var node_eachAfter = function(callback) {
     callback(node);
   }
   return this;
-};
+}
 
-var node_sum = function(value) {
+function node_sum(value) {
   return this.eachAfter(function(node) {
     var sum = +value(node.data) || 0,
         children = node.children,
@@ -9825,17 +9880,17 @@ var node_sum = function(value) {
     while (--i >= 0) sum += children[i].value;
     node.value = sum;
   });
-};
+}
 
-var node_sort = function(compare) {
+function node_sort(compare) {
   return this.eachBefore(function(node) {
     if (node.children) {
       node.children.sort(compare);
     }
   });
-};
+}
 
-var node_path = function(end) {
+function node_path(end) {
   var start = this,
       ancestor = leastCommonAncestor(start, end),
       nodes = [start];
@@ -9849,7 +9904,7 @@ var node_path = function(end) {
     end = end.parent;
   }
   return nodes;
-};
+}
 
 function leastCommonAncestor(a, b) {
   if (a === b) return a;
@@ -9866,23 +9921,23 @@ function leastCommonAncestor(a, b) {
   return c;
 }
 
-var node_ancestors = function() {
+function node_ancestors() {
   var node = this, nodes = [node];
   while (node = node.parent) {
     nodes.push(node);
   }
   return nodes;
-};
+}
 
-var node_descendants = function() {
+function node_descendants() {
   var nodes = [];
   this.each(function(node) {
     nodes.push(node);
   });
   return nodes;
-};
+}
 
-var node_leaves = function() {
+function node_leaves() {
   var leaves = [];
   this.eachBefore(function(node) {
     if (!node.children) {
@@ -9890,9 +9945,9 @@ var node_leaves = function() {
     }
   });
   return leaves;
-};
+}
 
-var node_links = function() {
+function node_links() {
   var root = this, links = [];
   root.each(function(node) {
     if (node !== root) { // Don’t include the root’s parent, if any.
@@ -9900,7 +9955,7 @@ var node_links = function() {
     }
   });
   return links;
-};
+}
 
 function hierarchy(data, children) {
   var root = new Node(data),
@@ -9987,7 +10042,7 @@ function shuffle$1(array) {
   return array;
 }
 
-var enclose = function(circles) {
+function enclose(circles) {
   var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
 
   while (i < n) {
@@ -9997,7 +10052,7 @@ var enclose = function(circles) {
   }
 
   return e;
-};
+}
 
 function extendBasis(B, p) {
   var i, j;
@@ -10213,10 +10268,10 @@ function packEnclose(circles) {
   return c.r;
 }
 
-var siblings = function(circles) {
+function siblings(circles) {
   packEnclose(circles);
   return circles;
-};
+}
 
 function optional(f) {
   return f == null ? null : required(f);
@@ -10231,17 +10286,17 @@ function constantZero() {
   return 0;
 }
 
-var constant$8 = function(x) {
+function constant$8(x) {
   return function() {
     return x;
   };
-};
+}
 
 function defaultRadius$1(d) {
   return Math.sqrt(d.value);
 }
 
-var index$2 = function() {
+function index$1() {
   var radius = null,
       dx = 1,
       dy = 1,
@@ -10275,7 +10330,7 @@ var index$2 = function() {
   };
 
   return pack;
-};
+}
 
 function radiusLeaf(radius) {
   return function(node) {
@@ -10313,14 +10368,14 @@ function translateChild(k) {
   };
 }
 
-var roundNode = function(node) {
+function roundNode(node) {
   node.x0 = Math.round(node.x0);
   node.y0 = Math.round(node.y0);
   node.x1 = Math.round(node.x1);
   node.y1 = Math.round(node.y1);
-};
+}
 
-var treemapDice = function(parent, x0, y0, x1, y1) {
+function treemapDice(parent, x0, y0, x1, y1) {
   var nodes = parent.children,
       node,
       i = -1,
@@ -10331,9 +10386,9 @@ var treemapDice = function(parent, x0, y0, x1, y1) {
     node = nodes[i], node.y0 = y0, node.y1 = y1;
     node.x0 = x0, node.x1 = x0 += node.value * k;
   }
-};
+}
 
-var partition = function() {
+function partition() {
   var dx = 1,
       dy = 1,
       padding = 0,
@@ -10381,7 +10436,7 @@ var partition = function() {
   };
 
   return partition;
-};
+}
 
 var keyPrefix$1 = "$";
 var preroot = {depth: -1};
@@ -10395,7 +10450,7 @@ function defaultParentId(d) {
   return d.parentId;
 }
 
-var stratify = function() {
+function stratify() {
   var id = defaultId,
       parentId = defaultParentId;
 
@@ -10452,7 +10507,7 @@ var stratify = function() {
   };
 
   return stratify;
-};
+}
 
 function defaultSeparation$1(a, b) {
   return a.parent === b.parent ? 1 : 2;
@@ -10551,7 +10606,7 @@ function treeRoot(root) {
 }
 
 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
-var tree = function() {
+function tree() {
   var separation = defaultSeparation$1,
       dx = 1,
       dy = 1,
@@ -10688,9 +10743,9 @@ var tree = function() {
   };
 
   return tree;
-};
+}
 
-var treemapSlice = function(parent, x0, y0, x1, y1) {
+function treemapSlice(parent, x0, y0, x1, y1) {
   var nodes = parent.children,
       node,
       i = -1,
@@ -10701,7 +10756,7 @@ var treemapSlice = function(parent, x0, y0, x1, y1) {
     node = nodes[i], node.x0 = x0, node.x1 = x1;
     node.y0 = y0, node.y1 = y0 += node.value * k;
   }
-};
+}
 
 var phi = (1 + Math.sqrt(5)) / 2;
 
@@ -10767,7 +10822,7 @@ var squarify = (function custom(ratio) {
   return squarify;
 })(phi);
 
-var index$3 = function() {
+function index$2() {
   var tile = squarify,
       round = false,
       dx = 1,
@@ -10855,9 +10910,9 @@ var index$3 = function() {
   };
 
   return treemap;
-};
+}
 
-var binary = function(parent, x0, y0, x1, y1) {
+function binary(parent, x0, y0, x1, y1) {
   var nodes = parent.children,
       i, n = nodes.length,
       sum, sums = new Array(n + 1);
@@ -10902,11 +10957,11 @@ var binary = function(parent, x0, y0, x1, y1) {
       partition(k, j, valueRight, x0, yk, x1, y1);
     }
   }
-};
+}
 
-var sliceDice = function(parent, x0, y0, x1, y1) {
+function sliceDice(parent, x0, y0, x1, y1) {
   (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
-};
+}
 
 var resquarify = (function custom(ratio) {
 
@@ -10941,7 +10996,7 @@ var resquarify = (function custom(ratio) {
   return resquarify;
 })(phi);
 
-var d3_polygonArea = function(polygon) {
+function d3_polygonArea(polygon) {
   var i = -1,
       n = polygon.length,
       a,
@@ -10955,9 +11010,9 @@ var d3_polygonArea = function(polygon) {
   }
 
   return area / 2;
-};
+}
 
-var d3_polygonCentroid = function(polygon) {
+function d3_polygonCentroid(polygon) {
   var i = -1,
       n = polygon.length,
       x = 0,
@@ -10976,15 +11031,15 @@ var d3_polygonCentroid = function(polygon) {
   }
 
   return k *= 3, [x / k, y / k];
-};
+}
 
 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
 // negative if clockwise, and zero if the points are collinear.
-var cross$1 = function(a, b, c) {
+function cross$1(a, b, c) {
   return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
-};
+}
 
 function lexicographicOrder(a, b) {
   return a[0] - b[0] || a[1] - b[1];
@@ -11006,7 +11061,7 @@ function computeUpperHullIndexes(points) {
   return indexes.slice(0, size); // remove popped points
 }
 
-var d3_polygonHull = function(points) {
+function d3_polygonHull(points) {
   if ((n = points.length) < 3) return null;
 
   var i,
@@ -11032,9 +11087,9 @@ var d3_polygonHull = function(points) {
   for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
 
   return hull;
-};
+}
 
-var contains$1 = function(polygon, point) {
+function contains$1(polygon, point) {
   var n = polygon.length,
       p = polygon[n - 1],
       x = point[0], y = point[1],
@@ -11049,9 +11104,9 @@ var contains$1 = function(polygon, point) {
   }
 
   return inside;
-};
+}
 
-var length$1 = function(polygon) {
+function length$1(polygon) {
   var i = -1,
       n = polygon.length,
       b = polygon[n - 1],
@@ -11073,7 +11128,7 @@ var length$1 = function(polygon) {
   }
 
   return perimeter;
-};
+}
 
 var slice$4 = [].slice;
 
@@ -11197,9 +11252,9 @@ function queue(concurrency) {
   return new Queue(concurrency);
 }
 
-var defaultSource$1 = function() {
+function defaultSource$1() {
   return Math.random();
-};
+}
 
 var uniform = (function sourceRandomUniform(source) {
   function randomUniform(min, max) {
@@ -11295,7 +11350,7 @@ var exponential$1 = (function sourceRandomExponential(source) {
   return randomExponential;
 })(defaultSource$1);
 
-var d3_request = function(url, callback) {
+function d3_request(url, callback) {
   var request,
       event = dispatch("beforesend", "progress", "load", "error"),
       mimeType,
@@ -11429,7 +11484,7 @@ var d3_request = function(url, callback) {
   }
 
   return request;
-};
+}
 
 function fixCallback(callback) {
   return function(error, xhr) {
@@ -11444,7 +11499,7 @@ function hasResponse(xhr) {
       : xhr.responseText; // "" on error
 }
 
-var type$1 = function(defaultMimeType, response) {
+function type$1(defaultMimeType, response) {
   return function(url, callback) {
     var r = d3_request(url).mimeType(defaultMimeType).response(response);
     if (callback != null) {
@@ -11453,7 +11508,7 @@ var type$1 = function(defaultMimeType, response) {
     }
     return r;
   };
-};
+}
 
 var html = type$1("text/html", function(xhr) {
   return document.createRange().createContextualFragment(xhr.responseText);
@@ -11473,7 +11528,7 @@ var d3_xml = type$1("application/xml", function(xhr) {
   return xml;
 });
 
-var dsv$1 = function(defaultMimeType, parse) {
+function dsv$1(defaultMimeType, parse) {
   return function(url, row, callback) {
     if (arguments.length < 3) callback = row, row = null;
     var r = d3_request(url).mimeType(defaultMimeType);
@@ -11481,7 +11536,7 @@ var dsv$1 = function(defaultMimeType, parse) {
     r.row(row);
     return callback ? r.get(callback) : r;
   };
-};
+}
 
 function responseOf(parse, row) {
   return function(request) {
@@ -11641,15 +11696,15 @@ function point$1() {
   return pointish(band().paddingInner(1));
 }
 
-var constant$9 = function(x) {
+function constant$9(x) {
   return function() {
     return x;
   };
-};
+}
 
-var number$2 = function(x) {
+function number$2(x) {
   return +x;
-};
+}
 
 var unit = [0, 1];
 
@@ -11759,7 +11814,7 @@ function continuous(deinterpolate, reinterpolate) {
   return rescale();
 }
 
-var tickFormat = function(domain, count, specifier) {
+function tickFormat(domain, count, specifier) {
   var start = domain[0],
       stop = domain[domain.length - 1],
       step = tickStep(start, stop, count == null ? 10 : count),
@@ -11786,7 +11841,7 @@ var tickFormat = function(domain, count, specifier) {
     }
   }
   return format(specifier);
-};
+}
 
 function linearish(scale) {
   var domain = scale.domain;
@@ -11873,7 +11928,7 @@ function identity$5() {
   return linearish(scale);
 }
 
-var nice = function(domain, interval) {
+function nice(domain, interval) {
   domain = domain.slice();
 
   var i0 = 0,
@@ -11890,7 +11945,7 @@ var nice = function(domain, interval) {
   domain[i0] = interval.floor(x0);
   domain[i1] = interval.ceil(x1);
   return domain;
-};
+}
 
 function deinterpolate(a, b) {
   return (b = Math.log(b / a))
@@ -12199,11 +12254,12 @@ function newInterval(floori, offseti, count, field) {
   };
 
   interval.range = function(start, stop, step) {
-    var range = [];
+    var range = [], previous;
     start = interval.ceil(start);
     step = step == null ? 1 : Math.floor(step);
     if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
-    do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
+    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
+    while (previous < start && start < stop);
     return range;
   };
 
@@ -12265,18 +12321,18 @@ millisecond.every = function(k) {
 
 var milliseconds = millisecond.range;
 
-var durationSecond$1 = 1e3;
-var durationMinute$1 = 6e4;
-var durationHour$1 = 36e5;
-var durationDay$1 = 864e5;
-var durationWeek$1 = 6048e5;
+var durationSecond = 1e3;
+var durationMinute = 6e4;
+var durationHour = 36e5;
+var durationDay = 864e5;
+var durationWeek = 6048e5;
 
 var second = newInterval(function(date) {
-  date.setTime(Math.floor(date / durationSecond$1) * durationSecond$1);
+  date.setTime(Math.floor(date / durationSecond) * durationSecond);
 }, function(date, step) {
-  date.setTime(+date + step * durationSecond$1);
+  date.setTime(+date + step * durationSecond);
 }, function(start, end) {
-  return (end - start) / durationSecond$1;
+  return (end - start) / durationSecond;
 }, function(date) {
   return date.getUTCSeconds();
 });
@@ -12284,11 +12340,11 @@ var second = newInterval(function(date) {
 var seconds = second.range;
 
 var minute = newInterval(function(date) {
-  date.setTime(Math.floor(date / durationMinute$1) * durationMinute$1);
+  date.setTime(Math.floor(date / durationMinute) * durationMinute);
 }, function(date, step) {
-  date.setTime(+date + step * durationMinute$1);
+  date.setTime(+date + step * durationMinute);
 }, function(start, end) {
-  return (end - start) / durationMinute$1;
+  return (end - start) / durationMinute;
 }, function(date) {
   return date.getMinutes();
 });
@@ -12296,13 +12352,13 @@ var minute = newInterval(function(date) {
 var minutes = minute.range;
 
 var hour = newInterval(function(date) {
-  var offset = date.getTimezoneOffset() * durationMinute$1 % durationHour$1;
-  if (offset < 0) offset += durationHour$1;
-  date.setTime(Math.floor((+date - offset) / durationHour$1) * durationHour$1 + offset);
+  var offset = date.getTimezoneOffset() * durationMinute % durationHour;
+  if (offset < 0) offset += durationHour;
+  date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
 }, function(date, step) {
-  date.setTime(+date + step * durationHour$1);
+  date.setTime(+date + step * durationHour);
 }, function(start, end) {
-  return (end - start) / durationHour$1;
+  return (end - start) / durationHour;
 }, function(date) {
   return date.getHours();
 });
@@ -12314,7 +12370,7 @@ var day = newInterval(function(date) {
 }, function(date, step) {
   date.setDate(date.getDate() + step);
 }, function(start, end) {
-  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1;
+  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
 }, function(date) {
   return date.getDate() - 1;
 });
@@ -12328,7 +12384,7 @@ function weekday(i) {
   }, function(date, step) {
     date.setDate(date.getDate() + step * 7);
   }, function(start, end) {
-    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;
+    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
   });
 }
 
@@ -12388,9 +12444,9 @@ var years = year.range;
 var utcMinute = newInterval(function(date) {
   date.setUTCSeconds(0, 0);
 }, function(date, step) {
-  date.setTime(+date + step * durationMinute$1);
+  date.setTime(+date + step * durationMinute);
 }, function(start, end) {
-  return (end - start) / durationMinute$1;
+  return (end - start) / durationMinute;
 }, function(date) {
   return date.getUTCMinutes();
 });
@@ -12400,9 +12456,9 @@ var utcMinutes = utcMinute.range;
 var utcHour = newInterval(function(date) {
   date.setUTCMinutes(0, 0, 0);
 }, function(date, step) {
-  date.setTime(+date + step * durationHour$1);
+  date.setTime(+date + step * durationHour);
 }, function(start, end) {
-  return (end - start) / durationHour$1;
+  return (end - start) / durationHour;
 }, function(date) {
   return date.getUTCHours();
 });
@@ -12414,7 +12470,7 @@ var utcDay = newInterval(function(date) {
 }, function(date, step) {
   date.setUTCDate(date.getUTCDate() + step);
 }, function(start, end) {
-  return (end - start) / durationDay$1;
+  return (end - start) / durationDay;
 }, function(date) {
   return date.getUTCDate() - 1;
 });
@@ -12428,7 +12484,7 @@ function utcWeekday(i) {
   }, function(date, step) {
     date.setUTCDate(date.getUTCDate() + step * 7);
   }, function(start, end) {
-    return (end - start) / durationWeek$1;
+    return (end - start) / durationWeek;
   });
 }
 
@@ -12536,6 +12592,7 @@ function formatLocale$1(locale) {
     "c": null,
     "d": formatDayOfMonth,
     "e": formatDayOfMonth,
+    "f": formatMicroseconds,
     "H": formatHour24,
     "I": formatHour12,
     "j": formatDayOfYear,
@@ -12543,9 +12600,13 @@ function formatLocale$1(locale) {
     "m": formatMonthNumber,
     "M": formatMinutes,
     "p": formatPeriod,
+    "Q": formatUnixTimestamp,
+    "s": formatUnixTimestampSeconds,
     "S": formatSeconds,
+    "u": formatWeekdayNumberMonday,
     "U": formatWeekNumberSunday,
-    "w": formatWeekdayNumber,
+    "V": formatWeekNumberISO,
+    "w": formatWeekdayNumberSunday,
     "W": formatWeekNumberMonday,
     "x": null,
     "X": null,
@@ -12563,6 +12624,7 @@ function formatLocale$1(locale) {
     "c": null,
     "d": formatUTCDayOfMonth,
     "e": formatUTCDayOfMonth,
+    "f": formatUTCMicroseconds,
     "H": formatUTCHour24,
     "I": formatUTCHour12,
     "j": formatUTCDayOfYear,
@@ -12570,9 +12632,13 @@ function formatLocale$1(locale) {
     "m": formatUTCMonthNumber,
     "M": formatUTCMinutes,
     "p": formatUTCPeriod,
+    "Q": formatUnixTimestamp,
+    "s": formatUnixTimestampSeconds,
     "S": formatUTCSeconds,
+    "u": formatUTCWeekdayNumberMonday,
     "U": formatUTCWeekNumberSunday,
-    "w": formatUTCWeekdayNumber,
+    "V": formatUTCWeekNumberISO,
+    "w": formatUTCWeekdayNumberSunday,
     "W": formatUTCWeekNumberMonday,
     "x": null,
     "X": null,
@@ -12590,6 +12656,7 @@ function formatLocale$1(locale) {
     "c": parseLocaleDateTime,
     "d": parseDayOfMonth,
     "e": parseDayOfMonth,
+    "f": parseMicroseconds,
     "H": parseHour24,
     "I": parseHour24,
     "j": parseDayOfYear,
@@ -12597,9 +12664,13 @@ function formatLocale$1(locale) {
     "m": parseMonthNumber,
     "M": parseMinutes,
     "p": parsePeriod,
+    "Q": parseUnixTimestamp,
+    "s": parseUnixTimestampSeconds,
     "S": parseSeconds,
+    "u": parseWeekdayNumberMonday,
     "U": parseWeekNumberSunday,
-    "w": parseWeekdayNumber,
+    "V": parseWeekNumberISO,
+    "w": parseWeekdayNumberSunday,
     "W": parseWeekNumberMonday,
     "x": parseLocaleDate,
     "X": parseLocaleTime,
@@ -12648,16 +12719,38 @@ function formatLocale$1(locale) {
   function newParse(specifier, newDate) {
     return function(string) {
       var d = newYear(1900),
-          i = parseSpecifier(d, specifier, string += "", 0);
+          i = parseSpecifier(d, specifier, string += "", 0),
+          week, day$$1;
       if (i != string.length) return null;
 
+      // If a UNIX timestamp is specified, return it.
+      if ("Q" in d) return new Date(d.Q);
+
       // The am-pm flag is 0 for AM, and 1 for PM.
       if ("p" in d) d.H = d.H % 12 + d.p * 12;
 
       // Convert day-of-week and week-of-year to day-of-year.
-      if ("W" in d || "U" in d) {
-        if (!("w" in d)) d.w = "W" in d ? 1 : 0;
-        var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
+      if ("V" in d) {
+        if (d.V < 1 || d.V > 53) return null;
+        if (!("w" in d)) d.w = 1;
+        if ("Z" in d) {
+          week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
+          week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
+          week = utcDay.offset(week, (d.V - 1) * 7);
+          d.y = week.getUTCFullYear();
+          d.m = week.getUTCMonth();
+          d.d = week.getUTCDate() + (d.w + 6) % 7;
+        } else {
+          week = newDate(newYear(d.y)), day$$1 = week.getDay();
+          week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
+          week = day.offset(week, (d.V - 1) * 7);
+          d.y = week.getFullYear();
+          d.m = week.getMonth();
+          d.d = week.getDate() + (d.w + 6) % 7;
+        }
+      } else if ("W" in d || "U" in d) {
+        if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
+        day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
         d.m = 0;
         d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
       }
@@ -12801,7 +12894,7 @@ function formatLocale$1(locale) {
 var pads = {"-": "", "_": " ", "0": "0"};
 var numberRe = /^\s*\d+/;
 var percentRe = /^%/;
-var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+var requoteRe = /[\\^$*+?|[\]().{}]/g;
 
 function pad(value, fill, width) {
   var sign = value < 0 ? "-" : "",
@@ -12824,18 +12917,28 @@ function formatLookup(names) {
   return map;
 }
 
-function parseWeekdayNumber(d, string, i) {
+function parseWeekdayNumberSunday(d, string, i) {
   var n = numberRe.exec(string.slice(i, i + 1));
   return n ? (d.w = +n[0], i + n[0].length) : -1;
 }
 
+function parseWeekdayNumberMonday(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 1));
+  return n ? (d.u = +n[0], i + n[0].length) : -1;
+}
+
 function parseWeekNumberSunday(d, string, i) {
-  var n = numberRe.exec(string.slice(i));
+  var n = numberRe.exec(string.slice(i, i + 2));
   return n ? (d.U = +n[0], i + n[0].length) : -1;
 }
 
+function parseWeekNumberISO(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.V = +n[0], i + n[0].length) : -1;
+}
+
 function parseWeekNumberMonday(d, string, i) {
-  var n = numberRe.exec(string.slice(i));
+  var n = numberRe.exec(string.slice(i, i + 2));
   return n ? (d.W = +n[0], i + n[0].length) : -1;
 }
 
@@ -12850,7 +12953,7 @@ function parseYear(d, string, i) {
 }
 
 function parseZone(d, string, i) {
-  var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
+  var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
   return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
 }
 
@@ -12889,11 +12992,26 @@ function parseMilliseconds(d, string, i) {
   return n ? (d.L = +n[0], i + n[0].length) : -1;
 }
 
+function parseMicroseconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 6));
+  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
+}
+
 function parseLiteralPercent(d, string, i) {
   var n = percentRe.exec(string.slice(i, i + 1));
   return n ? i + n[0].length : -1;
 }
 
+function parseUnixTimestamp(d, string, i) {
+  var n = numberRe.exec(string.slice(i));
+  return n ? (d.Q = +n[0], i + n[0].length) : -1;
+}
+
+function parseUnixTimestampSeconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i));
+  return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
+}
+
 function formatDayOfMonth(d, p) {
   return pad(d.getDate(), p, 2);
 }
@@ -12914,6 +13032,10 @@ function formatMilliseconds(d, p) {
   return pad(d.getMilliseconds(), p, 3);
 }
 
+function formatMicroseconds(d, p) {
+  return formatMilliseconds(d, p) + "000";
+}
+
 function formatMonthNumber(d, p) {
   return pad(d.getMonth() + 1, p, 2);
 }
@@ -12926,11 +13048,22 @@ function formatSeconds(d, p) {
   return pad(d.getSeconds(), p, 2);
 }
 
+function formatWeekdayNumberMonday(d) {
+  var day$$1 = d.getDay();
+  return day$$1 === 0 ? 7 : day$$1;
+}
+
 function formatWeekNumberSunday(d, p) {
   return pad(sunday.count(year(d), d), p, 2);
 }
 
-function formatWeekdayNumber(d) {
+function formatWeekNumberISO(d, p) {
+  var day$$1 = d.getDay();
+  d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
+  return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
+}
+
+function formatWeekdayNumberSunday(d) {
   return d.getDay();
 }
 
@@ -12973,6 +13106,10 @@ function formatUTCMilliseconds(d, p) {
   return pad(d.getUTCMilliseconds(), p, 3);
 }
 
+function formatUTCMicroseconds(d, p) {
+  return formatUTCMilliseconds(d, p) + "000";
+}
+
 function formatUTCMonthNumber(d, p) {
   return pad(d.getUTCMonth() + 1, p, 2);
 }
@@ -12985,11 +13122,22 @@ function formatUTCSeconds(d, p) {
   return pad(d.getUTCSeconds(), p, 2);
 }
 
+function formatUTCWeekdayNumberMonday(d) {
+  var dow = d.getUTCDay();
+  return dow === 0 ? 7 : dow;
+}
+
 function formatUTCWeekNumberSunday(d, p) {
   return pad(utcSunday.count(utcYear(d), d), p, 2);
 }
 
-function formatUTCWeekdayNumber(d) {
+function formatUTCWeekNumberISO(d, p) {
+  var day$$1 = d.getUTCDay();
+  d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
+  return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
+}
+
+function formatUTCWeekdayNumberSunday(d) {
   return d.getUTCDay();
 }
 
@@ -13013,6 +13161,14 @@ function formatLiteralPercent() {
   return "%";
 }
 
+function formatUnixTimestamp(d) {
+  return +d;
+}
+
+function formatUnixTimestampSeconds(d) {
+  return Math.floor(+d / 1000);
+}
+
 var locale$1;
 var timeFormat;
 var timeParse;
@@ -13058,13 +13214,13 @@ var parseIso = +new Date("2000-01-01T00:00:00.000Z")
     ? parseIsoNative
     : utcParse(isoSpecifier);
 
-var durationSecond = 1000;
-var durationMinute = durationSecond * 60;
-var durationHour = durationMinute * 60;
-var durationDay = durationHour * 24;
-var durationWeek = durationDay * 7;
-var durationMonth = durationDay * 30;
-var durationYear = durationDay * 365;
+var durationSecond$1 = 1000;
+var durationMinute$1 = durationSecond$1 * 60;
+var durationHour$1 = durationMinute$1 * 60;
+var durationDay$1 = durationHour$1 * 24;
+var durationWeek$1 = durationDay$1 * 7;
+var durationMonth = durationDay$1 * 30;
+var durationYear = durationDay$1 * 365;
 
 function date$1(t) {
   return new Date(t);
@@ -13089,21 +13245,21 @@ function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1
       formatYear = format("%Y");
 
   var tickIntervals = [
-    [second$$1,  1,      durationSecond],
-    [second$$1,  5,  5 * durationSecond],
-    [second$$1, 15, 15 * durationSecond],
-    [second$$1, 30, 30 * durationSecond],
-    [minute$$1,  1,      durationMinute],
-    [minute$$1,  5,  5 * durationMinute],
-    [minute$$1, 15, 15 * durationMinute],
-    [minute$$1, 30, 30 * durationMinute],
-    [  hour$$1,  1,      durationHour  ],
-    [  hour$$1,  3,  3 * durationHour  ],
-    [  hour$$1,  6,  6 * durationHour  ],
-    [  hour$$1, 12, 12 * durationHour  ],
-    [   day$$1,  1,      durationDay   ],
-    [   day$$1,  2,  2 * durationDay   ],
-    [  week,  1,      durationWeek  ],
+    [second$$1,  1,      durationSecond$1],
+    [second$$1,  5,  5 * durationSecond$1],
+    [second$$1, 15, 15 * durationSecond$1],
+    [second$$1, 30, 30 * durationSecond$1],
+    [minute$$1,  1,      durationMinute$1],
+    [minute$$1,  5,  5 * durationMinute$1],
+    [minute$$1, 15, 15 * durationMinute$1],
+    [minute$$1, 30, 30 * durationMinute$1],
+    [  hour$$1,  1,      durationHour$1  ],
+    [  hour$$1,  3,  3 * durationHour$1  ],
+    [  hour$$1,  6,  6 * durationHour$1  ],
+    [  hour$$1, 12, 12 * durationHour$1  ],
+    [   day$$1,  1,      durationDay$1   ],
+    [   day$$1,  2,  2 * durationDay$1   ],
+    [  week,  1,      durationWeek$1  ],
     [ month$$1,  1,      durationMonth ],
     [ month$$1,  3,  3 * durationMonth ],
     [  year$$1,  1,      durationYear  ]
@@ -13136,7 +13292,7 @@ function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1
         step = i[1];
         interval = i[0];
       } else {
-        step = tickStep(start, stop, interval);
+        step = Math.max(tickStep(start, stop, interval), 1);
         interval = millisecond$$1;
       }
     }
@@ -13182,19 +13338,19 @@ function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1
   return scale;
 }
 
-var time = function() {
+function time() {
   return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
-};
+}
 
-var utcTime = function() {
+function utcTime() {
   return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
-};
+}
 
-var colors = function(s) {
+function colors(s) {
   return s.match(/.{6}/g).map(function(x) {
     return "#" + x;
   });
-};
+}
 
 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
 
@@ -13212,14 +13368,14 @@ var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
 
 var rainbow = cubehelix();
 
-var rainbow$1 = function(t) {
+function rainbow$1(t) {
   if (t < 0 || t > 1) t -= Math.floor(t);
   var ts = Math.abs(t - 0.5);
   rainbow.h = 360 * t - 100;
   rainbow.s = 1.5 - 1.5 * ts;
   rainbow.l = 0.8 - 0.9 * ts;
   return rainbow + "";
-};
+}
 
 function ramp(range) {
   var n = range.length;
@@ -13265,11 +13421,11 @@ function sequential(interpolator) {
   return linearish(scale);
 }
 
-var constant$10 = function(x) {
+function constant$10(x) {
   return function constant() {
     return x;
   };
-};
+}
 
 var abs$1 = Math.abs;
 var atan2$1 = Math.atan2;
@@ -13362,7 +13518,7 @@ function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
   };
 }
 
-var arc = function() {
+function arc() {
   var innerRadius = arcInnerRadius,
       outerRadius = arcOuterRadius,
       cornerRadius = constant$10(0),
@@ -13546,7 +13702,7 @@ var arc = function() {
   };
 
   return arc;
-};
+}
 
 function Linear(context) {
   this._context = context;
@@ -13576,9 +13732,9 @@ Linear.prototype = {
   }
 };
 
-var curveLinear = function(context) {
+function curveLinear(context) {
   return new Linear(context);
-};
+}
 
 function x$3(p) {
   return p[0];
@@ -13588,7 +13744,7 @@ function y$3(p) {
   return p[1];
 }
 
-var line = function() {
+function line() {
   var x$$1 = x$3,
       y$$1 = y$3,
       defined = constant$10(true),
@@ -13637,9 +13793,9 @@ var line = function() {
   };
 
   return line;
-};
+}
 
-var area = function() {
+function area() {
   var x0 = x$3,
       x1 = null,
       y0 = constant$10(0),
@@ -13741,17 +13897,17 @@ var area = function() {
   };
 
   return area;
-};
+}
 
-var descending = function(a, b) {
+function descending(a, b) {
   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
-};
+}
 
-var identity$6 = function(d) {
+function identity$6(d) {
   return d;
-};
+}
 
-var pie = function() {
+function pie() {
   var value = identity$6,
       sortValues = descending,
       sort = null,
@@ -13824,7 +13980,7 @@ var pie = function() {
   };
 
   return pie;
-};
+}
 
 var curveRadialLinear = curveRadial(curveLinear);
 
@@ -13874,11 +14030,11 @@ function lineRadial(l) {
   return l;
 }
 
-var lineRadial$1 = function() {
+function lineRadial$1() {
   return lineRadial(line().curve(curveRadialLinear));
-};
+}
 
-var areaRadial = function() {
+function areaRadial() {
   var a = area().curve(curveRadialLinear),
       c = a.curve,
       x0 = a.lineX0,
@@ -13902,11 +14058,11 @@ var areaRadial = function() {
   };
 
   return a;
-};
+}
 
-var pointRadial = function(x, y) {
+function pointRadial(x, y) {
   return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
-};
+}
 
 var slice$6 = Array.prototype.slice;
 
@@ -14111,7 +14267,7 @@ var symbols = [
   wye
 ];
 
-var symbol = function() {
+function symbol() {
   var type = constant$10(circle$2),
       size = constant$10(64),
       context = null;
@@ -14136,9 +14292,9 @@ var symbol = function() {
   };
 
   return symbol;
-};
+}
 
-var noop$2 = function() {};
+function noop$2() {}
 
 function point$2(that, x, y) {
   that._context.bezierCurveTo(
@@ -14188,9 +14344,9 @@ Basis.prototype = {
   }
 };
 
-var basis$2 = function(context) {
+function basis$2(context) {
   return new Basis(context);
-};
+}
 
 function BasisClosed(context) {
   this._context = context;
@@ -14238,9 +14394,9 @@ BasisClosed.prototype = {
   }
 };
 
-var basisClosed$1 = function(context) {
+function basisClosed$1(context) {
   return new BasisClosed(context);
-};
+}
 
 function BasisOpen(context) {
   this._context = context;
@@ -14276,9 +14432,9 @@ BasisOpen.prototype = {
   }
 };
 
-var basisOpen = function(context) {
+function basisOpen(context) {
   return new BasisOpen(context);
-};
+}
 
 function Bundle(context, beta) {
   this._basis = new Basis(context);
@@ -14741,9 +14897,9 @@ LinearClosed.prototype = {
   }
 };
 
-var linearClosed = function(context) {
+function linearClosed(context) {
   return new LinearClosed(context);
-};
+}
 
 function sign$1(x) {
   return x < 0 ? -1 : 1;
@@ -14912,9 +15068,9 @@ function controlPoints(x) {
   return [a, b];
 }
 
-var natural = function(context) {
+function natural(context) {
   return new Natural(context);
-};
+}
 
 function Step(context, t) {
   this._context = context;
@@ -14958,9 +15114,9 @@ Step.prototype = {
   }
 };
 
-var step = function(context) {
+function step(context) {
   return new Step(context, 0.5);
-};
+}
 
 function stepBefore(context) {
   return new Step(context, 0);
@@ -14970,7 +15126,7 @@ function stepAfter(context) {
   return new Step(context, 1);
 }
 
-var none$1 = function(series, order) {
+function none$1(series, order) {
   if (!((n = series.length) > 1)) return;
   for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
     s0 = s1, s1 = series[order[i]];
@@ -14978,19 +15134,19 @@ var none$1 = function(series, order) {
       s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
     }
   }
-};
+}
 
-var none$2 = function(series) {
+function none$2(series) {
   var n = series.length, o = new Array(n);
   while (--n >= 0) o[n] = n;
   return o;
-};
+}
 
 function stackValue(d, key) {
   return d[key];
 }
 
-var stack = function() {
+function stack() {
   var keys = constant$10([]),
       order = none$2,
       offset = none$1,
@@ -15037,18 +15193,18 @@ var stack = function() {
   };
 
   return stack;
-};
+}
 
-var expand = function(series, order) {
+function expand(series, order) {
   if (!((n = series.length) > 0)) return;
   for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
     for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
     if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
   }
   none$1(series, order);
-};
+}
 
-var diverging = function(series, order) {
+function diverging(series, order) {
   if (!((n = series.length) > 1)) return;
   for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
     for (yp = yn = 0, i = 0; i < n; ++i) {
@@ -15061,18 +15217,18 @@ var diverging = function(series, order) {
       }
     }
   }
-};
+}
 
-var silhouette = function(series, order) {
+function silhouette(series, order) {
   if (!((n = series.length) > 0)) return;
   for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
     for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
     s0[j][1] += s0[j][0] = -y / 2;
   }
   none$1(series, order);
-};
+}
 
-var wiggle = function(series, order) {
+function wiggle(series, order) {
   if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
   for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
     for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
@@ -15093,12 +15249,12 @@ var wiggle = function(series, order) {
   }
   s0[j - 1][1] += s0[j - 1][0] = y;
   none$1(series, order);
-};
+}
 
-var ascending$1 = function(series) {
+function ascending$1(series) {
   var sums = series.map(sum$2);
   return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
-};
+}
 
 function sum$2(series) {
   var s = 0, i = -1, n = series.length, v;
@@ -15106,11 +15262,11 @@ function sum$2(series) {
   return s;
 }
 
-var descending$1 = function(series) {
+function descending$1(series) {
   return ascending$1(series).reverse();
-};
+}
 
-var insideOut = function(series) {
+function insideOut(series) {
   var n = series.length,
       i,
       j,
@@ -15133,17 +15289,17 @@ var insideOut = function(series) {
   }
 
   return bottoms.reverse().concat(tops);
-};
+}
 
-var reverse = function(series) {
+function reverse(series) {
   return none$2(series).reverse();
-};
+}
 
-var constant$11 = function(x) {
+function constant$11(x) {
   return function() {
     return x;
   };
-};
+}
 
 function x$4(d) {
   return d[0];
@@ -16081,7 +16237,7 @@ Diagram.prototype = {
   }
 };
 
-var voronoi = function() {
+function voronoi() {
   var x$$1 = x$4,
       y$$1 = y$4,
       extent = null;
@@ -16124,13 +16280,13 @@ var voronoi = function() {
   };
 
   return voronoi;
-};
+}
 
-var constant$12 = function(x) {
+function constant$12(x) {
   return function() {
     return x;
   };
-};
+}
 
 function ZoomEvent(target, type, transform) {
   this.target = target;
@@ -16193,10 +16349,10 @@ function nopropagation$2() {
   event.stopImmediatePropagation();
 }
 
-var noevent$2 = function() {
+function noevent$2() {
   event.preventDefault();
   event.stopImmediatePropagation();
-};
+}
 
 // Ignore right-click, since that should open the context menu.
 function defaultFilter$2() {
@@ -16228,17 +16384,25 @@ function defaultTouchable$1() {
   return "ontouchstart" in this;
 }
 
-var d3_zoom = function() {
+function defaultConstrain(transform$$1, extent, translateExtent) {
+  var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
+      dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
+      dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
+      dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
+  return transform$$1.translate(
+    dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
+    dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
+  );
+}
+
+function d3_zoom() {
   var filter = defaultFilter$2,
       extent = defaultExtent$1,
+      constrain = defaultConstrain,
       wheelDelta = defaultWheelDelta,
       touchable = defaultTouchable$1,
-      k0 = 0,
-      k1 = Infinity,
-      x0 = -k1,
-      x1 = k1,
-      y0 = x0,
-      y1 = x1,
+      scaleExtent = [0, Infinity],
+      translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
       duration = 250,
       interpolate = interpolateZoom,
       gestures = [],
@@ -16293,7 +16457,7 @@ var d3_zoom = function() {
           p0 = centroid(e),
           p1 = t0.invert(p0),
           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
-      return constrain(translate(scale(t0, k1), p0, p1), e);
+      return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
     });
   };
 
@@ -16302,7 +16466,7 @@ var d3_zoom = function() {
       return constrain(this.__zoom.translate(
         typeof x === "function" ? x.apply(this, arguments) : x,
         typeof y === "function" ? y.apply(this, arguments) : y
-      ), extent.apply(this, arguments));
+      ), extent.apply(this, arguments), translateExtent);
     });
   };
 
@@ -16314,12 +16478,12 @@ var d3_zoom = function() {
       return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
         typeof x === "function" ? -x.apply(this, arguments) : -x,
         typeof y === "function" ? -y.apply(this, arguments) : -y
-      ), e);
+      ), e, translateExtent);
     });
   };
 
   function scale(transform$$1, k) {
-    k = Math.max(k0, Math.min(k1, k));
+    k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
     return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
   }
 
@@ -16328,17 +16492,6 @@ var d3_zoom = function() {
     return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
   }
 
-  function constrain(transform$$1, extent) {
-    var dx0 = transform$$1.invertX(extent[0][0]) - x0,
-        dx1 = transform$$1.invertX(extent[1][0]) - x1,
-        dy0 = transform$$1.invertY(extent[0][1]) - y0,
-        dy1 = transform$$1.invertY(extent[1][1]) - y1;
-    return transform$$1.translate(
-      dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
-      dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
-    );
-  }
-
   function centroid(extent) {
     return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
   }
@@ -16415,7 +16568,7 @@ var d3_zoom = function() {
     if (!filter.apply(this, arguments)) return;
     var g = gesture(this, arguments),
         t = this.__zoom,
-        k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+        k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
         p = d3_mouse(this);
 
     // If the mouse is in the same location as before, reuse it.
@@ -16439,7 +16592,7 @@ var d3_zoom = function() {
 
     noevent$2();
     g.wheel = setTimeout(wheelidled, wheelDelay);
-    g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent));
+    g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
 
     function wheelidled() {
       g.wheel = null;
@@ -16467,7 +16620,7 @@ var d3_zoom = function() {
         var dx = event.clientX - x0, dy = event.clientY - y0;
         g.moved = dx * dx + dy * dy > clickDistance2;
       }
-      g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent));
+      g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
     }
 
     function mouseupped() {
@@ -16484,7 +16637,7 @@ var d3_zoom = function() {
         p0 = d3_mouse(this),
         p1 = t0.invert(p0),
         k1 = t0.k * (event.shiftKey ? 0.5 : 2),
-        t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments));
+        t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
 
     noevent$2();
     if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
@@ -16548,7 +16701,7 @@ var d3_zoom = function() {
     }
     else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
     else return;
-    g.zoom("touch", constrain(translate(t, p, l), g.extent));
+    g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
   }
 
   function touchended() {
@@ -16586,11 +16739,15 @@ var d3_zoom = function() {
   };
 
   zoom.scaleExtent = function(_) {
-    return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1];
+    return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
   };
 
   zoom.translateExtent = function(_) {
-    return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]];
+    return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
+  };
+
+  zoom.constrain = function(_) {
+    return arguments.length ? (constrain = _, zoom) : constrain;
   };
 
   zoom.duration = function(_) {
@@ -16611,11 +16768,11 @@ var d3_zoom = function() {
   };
 
   return zoom;
-};
+}
 
 
 
-var index = Object.freeze({
+var index$3 = Object.freeze({
        version: version,
        bisect: bisectRight,
        bisectRight: bisectRight,
@@ -16785,13 +16942,13 @@ var index = Object.freeze({
        geoTransform: d3_geoTransform,
        cluster: cluster,
        hierarchy: hierarchy,
-       pack: index$2,
+       pack: index$1,
        packSiblings: siblings,
        packEnclose: enclose,
        partition: partition,
        stratify: stratify,
        tree: tree,
-       treemap: index$3,
+       treemap: index$2,
        treemapBinary: binary,
        treemapDice: treemapDice,
        treemapSlice: treemapSlice,
@@ -16869,12 +17026,14 @@ var index = Object.freeze({
        interpolateInferno: inferno,
        interpolatePlasma: plasma,
        scaleSequential: sequential,
+       create: create,
        creator: creator,
-       local: local$1,
+       local: local,
        matcher: matcher$1,
        mouse: d3_mouse,
        namespace: namespace,
        namespaces: namespaces,
+       clientPoint: point,
        select: d3_select,
        selectAll: d3_selectAll,
        selection: selection,
@@ -17026,35 +17185,235 @@ function actionAddEntity(way) {
 }
 
 /**
- * Creates an array with all falsey values removed. The values `false`, `null`,
- * `0`, `""`, `undefined`, and `NaN` are falsey.
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+function listCacheClear() {
+  this.__data__ = [];
+  this.size = 0;
+}
+
+/**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
  *
  * @static
  * @memberOf _
- * @since 0.1.0
- * @category Array
- * @param {Array} array The array to compact.
- * @returns {Array} Returns the new array of filtered values.
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  * @example
  *
- * _.compact([0, 1, false, 2, '', 3]);
- * // => [1, 2, 3]
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
  */
-function compact(array) {
+function eq(value, other) {
+  return value === other || (value !== value && other !== other);
+}
+
+/**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function assocIndexOf(array, key) {
+  var length = array.length;
+  while (length--) {
+    if (eq(array[length][0], key)) {
+      return length;
+    }
+  }
+  return -1;
+}
+
+/** Used for built-in method references. */
+var arrayProto = Array.prototype;
+
+/** Built-in value references. */
+var splice = arrayProto.splice;
+
+/**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function listCacheDelete(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  if (index < 0) {
+    return false;
+  }
+  var lastIndex = data.length - 1;
+  if (index == lastIndex) {
+    data.pop();
+  } else {
+    splice.call(data, index, 1);
+  }
+  --this.size;
+  return true;
+}
+
+/**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function listCacheGet(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  return index < 0 ? undefined : data[index][1];
+}
+
+/**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function listCacheHas(key) {
+  return assocIndexOf(this.__data__, key) > -1;
+}
+
+/**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+function listCacheSet(key, value) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  if (index < 0) {
+    ++this.size;
+    data.push([key, value]);
+  } else {
+    data[index][1] = value;
+  }
+  return this;
+}
+
+/**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function ListCache(entries) {
   var index = -1,
-      length = array == null ? 0 : array.length,
-      resIndex = 0,
-      result = [];
+      length = entries == null ? 0 : entries.length;
 
+  this.clear();
   while (++index < length) {
-    var value = array[index];
-    if (value) {
-      result[resIndex++] = value;
-    }
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
   }
+}
+
+// Add methods to `ListCache`.
+ListCache.prototype.clear = listCacheClear;
+ListCache.prototype['delete'] = listCacheDelete;
+ListCache.prototype.get = listCacheGet;
+ListCache.prototype.has = listCacheHas;
+ListCache.prototype.set = listCacheSet;
+
+/**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+function stackClear() {
+  this.__data__ = new ListCache;
+  this.size = 0;
+}
+
+/**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function stackDelete(key) {
+  var data = this.__data__,
+      result = data['delete'](key);
+
+  this.size = data.size;
   return result;
 }
 
+/**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function stackGet(key) {
+  return this.__data__.get(key);
+}
+
+/**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function stackHas(key) {
+  return this.__data__.has(key);
+}
+
 /** Detect free variable `global` from Node.js. */
 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
 
@@ -17068,20 +17427,20 @@ var root$2 = freeGlobal || freeSelf || Function('return this')();
 var Symbol = root$2.Symbol;
 
 /** Used for built-in method references. */
-var objectProto$2 = Object.prototype;
+var objectProto = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
+var hasOwnProperty = objectProto.hasOwnProperty;
 
 /**
  * Used to resolve the
  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  * of values.
  */
-var nativeObjectToString = objectProto$2.toString;
+var nativeObjectToString = objectProto.toString;
 
 /** Built-in value references. */
-var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
+var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
 
 /**
  * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
@@ -17091,34 +17450,34 @@ var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
  * @returns {string} Returns the raw `toStringTag`.
  */
 function getRawTag(value) {
-  var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
-      tag = value[symToStringTag$1];
+  var isOwn = hasOwnProperty.call(value, symToStringTag),
+      tag = value[symToStringTag];
 
   try {
-    value[symToStringTag$1] = undefined;
+    value[symToStringTag] = undefined;
     var unmasked = true;
   } catch (e) {}
 
   var result = nativeObjectToString.call(value);
   if (unmasked) {
     if (isOwn) {
-      value[symToStringTag$1] = tag;
+      value[symToStringTag] = tag;
     } else {
-      delete value[symToStringTag$1];
+      delete value[symToStringTag];
     }
   }
   return result;
 }
 
 /** Used for built-in method references. */
-var objectProto$3 = Object.prototype;
+var objectProto$1 = Object.prototype;
 
 /**
  * Used to resolve the
  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  * of values.
  */
-var nativeObjectToString$1 = objectProto$3.toString;
+var nativeObjectToString$1 = objectProto$1.toString;
 
 /**
  * Converts `value` to a string using `Object.prototype.toString`.
@@ -17136,7 +17495,7 @@ var nullTag = '[object Null]';
 var undefinedTag = '[object Undefined]';
 
 /** Built-in value references. */
-var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
 
 /**
  * The base implementation of `getTag` without fallbacks for buggy environments.
@@ -17149,7 +17508,7 @@ function baseGetTag(value) {
   if (value == null) {
     return value === undefined ? undefinedTag : nullTag;
   }
-  return (symToStringTag && symToStringTag in Object(value))
+  return (symToStringTag$1 && symToStringTag$1 in Object(value))
     ? getRawTag(value)
     : objectToString(value);
 }
@@ -17238,10 +17597,10 @@ function isMasked(func) {
 }
 
 /** Used for built-in method references. */
-var funcProto$1 = Function.prototype;
+var funcProto = Function.prototype;
 
 /** Used to resolve the decompiled source of functions. */
-var funcToString$1 = funcProto$1.toString;
+var funcToString = funcProto.toString;
 
 /**
  * Converts `func` to its source code.
@@ -17253,7 +17612,7 @@ var funcToString$1 = funcProto$1.toString;
 function toSource(func) {
   if (func != null) {
     try {
-      return funcToString$1.call(func);
+      return funcToString.call(func);
     } catch (e) {}
     try {
       return (func + '');
@@ -17272,18 +17631,18 @@ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
 var reIsHostCtor = /^\[object .+?Constructor\]$/;
 
 /** Used for built-in method references. */
-var funcProto = Function.prototype;
-var objectProto$1 = Object.prototype;
+var funcProto$1 = Function.prototype;
+var objectProto$2 = Object.prototype;
 
 /** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
+var funcToString$1 = funcProto$1.toString;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
+var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
 
 /** Used to detect if a method is native. */
 var reIsNative = RegExp('^' +
-  funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
+  funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
   .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
 );
 
@@ -17328,6 +17687,331 @@ function getNative(object, key) {
   return baseIsNative(value) ? value : undefined;
 }
 
+/* Built-in method references that are verified to be native. */
+var Map$1 = getNative(root$2, 'Map');
+
+/* Built-in method references that are verified to be native. */
+var nativeCreate = getNative(Object, 'create');
+
+/**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+function hashClear() {
+  this.__data__ = nativeCreate ? nativeCreate(null) : {};
+  this.size = 0;
+}
+
+/**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function hashDelete(key) {
+  var result = this.has(key) && delete this.__data__[key];
+  this.size -= result ? 1 : 0;
+  return result;
+}
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/** Used for built-in method references. */
+var objectProto$3 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
+
+/**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function hashGet(key) {
+  var data = this.__data__;
+  if (nativeCreate) {
+    var result = data[key];
+    return result === HASH_UNDEFINED ? undefined : result;
+  }
+  return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
+}
+
+/** Used for built-in method references. */
+var objectProto$4 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
+
+/**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function hashHas(key) {
+  var data = this.__data__;
+  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
+}
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
+
+/**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+function hashSet(key, value) {
+  var data = this.__data__;
+  this.size += this.has(key) ? 0 : 1;
+  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
+  return this;
+}
+
+/**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Hash(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+
+// Add methods to `Hash`.
+Hash.prototype.clear = hashClear;
+Hash.prototype['delete'] = hashDelete;
+Hash.prototype.get = hashGet;
+Hash.prototype.has = hashHas;
+Hash.prototype.set = hashSet;
+
+/**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+function mapCacheClear() {
+  this.size = 0;
+  this.__data__ = {
+    'hash': new Hash,
+    'map': new (Map$1 || ListCache),
+    'string': new Hash
+  };
+}
+
+/**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+function isKeyable(value) {
+  var type = typeof value;
+  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+    ? (value !== '__proto__')
+    : (value === null);
+}
+
+/**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+function getMapData(map, key) {
+  var data = map.__data__;
+  return isKeyable(key)
+    ? data[typeof key == 'string' ? 'string' : 'hash']
+    : data.map;
+}
+
+/**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function mapCacheDelete(key) {
+  var result = getMapData(this, key)['delete'](key);
+  this.size -= result ? 1 : 0;
+  return result;
+}
+
+/**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function mapCacheGet(key) {
+  return getMapData(this, key).get(key);
+}
+
+/**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function mapCacheHas(key) {
+  return getMapData(this, key).has(key);
+}
+
+/**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+function mapCacheSet(key, value) {
+  var data = getMapData(this, key),
+      size = data.size;
+
+  data.set(key, value);
+  this.size += data.size == size ? 0 : 1;
+  return this;
+}
+
+/**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function MapCache(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+
+// Add methods to `MapCache`.
+MapCache.prototype.clear = mapCacheClear;
+MapCache.prototype['delete'] = mapCacheDelete;
+MapCache.prototype.get = mapCacheGet;
+MapCache.prototype.has = mapCacheHas;
+MapCache.prototype.set = mapCacheSet;
+
+/** Used as the size to enable large array optimizations. */
+var LARGE_ARRAY_SIZE = 200;
+
+/**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
+function stackSet(key, value) {
+  var data = this.__data__;
+  if (data instanceof ListCache) {
+    var pairs = data.__data__;
+    if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+      pairs.push([key, value]);
+      this.size = ++data.size;
+      return this;
+    }
+    data = this.__data__ = new MapCache(pairs);
+  }
+  data.set(key, value);
+  this.size = data.size;
+  return this;
+}
+
+/**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Stack(entries) {
+  var data = this.__data__ = new ListCache(entries);
+  this.size = data.size;
+}
+
+// Add methods to `Stack`.
+Stack.prototype.clear = stackClear;
+Stack.prototype['delete'] = stackDelete;
+Stack.prototype.get = stackGet;
+Stack.prototype.has = stackHas;
+Stack.prototype.set = stackSet;
+
+/**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+function arrayEach(array, iteratee) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  while (++index < length) {
+    if (iteratee(array[index], index, array) === false) {
+      break;
+    }
+  }
+  return array;
+}
+
 var defineProperty = (function() {
   try {
     var func = getNative(Object, 'defineProperty');
@@ -17358,47 +18042,11 @@ function baseAssignValue(object, key, value) {
   }
 }
 
-/**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
-function eq(value, other) {
-  return value === other || (value !== value && other !== other);
-}
-
 /** Used for built-in method references. */
-var objectProto = Object.prototype;
+var objectProto$5 = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
+var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
 
 /**
  * Assigns `value` to `key` of `object` if the existing value is not equivalent
@@ -17412,7 +18060,7 @@ var hasOwnProperty = objectProto.hasOwnProperty;
  */
 function assignValue(object, key, value) {
   var objValue = object[key];
-  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+  if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
       (value === undefined && !(key in object))) {
     baseAssignValue(object, key, value);
   }
@@ -17455,414 +18103,100 @@ function copyObject(source, props, object, customizer) {
 }
 
 /**
- * This method returns the first argument it receives.
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+function baseTimes(n, iteratee) {
+  var index = -1,
+      result = Array(n);
+
+  while (++index < n) {
+    result[index] = iteratee(index);
+  }
+  return result;
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
  *
  * @static
- * @since 0.1.0
  * @memberOf _
- * @category Util
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  * @example
  *
- * var object = { 'a': 1 };
+ * _.isObjectLike({});
+ * // => true
  *
- * console.log(_.identity(object) === object);
+ * _.isObjectLike([1, 2, 3]);
  * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
  */
-function identity$8(value) {
-  return value;
+function isObjectLike(value) {
+  return value != null && typeof value == 'object';
 }
 
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]';
+
 /**
- * A faster alternative to `Function#apply`, this function invokes `func`
- * with the `this` binding of `thisArg` and the arguments of `args`.
+ * The base implementation of `_.isArguments`.
  *
  * @private
- * @param {Function} func The function to invoke.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {Array} args The arguments to invoke `func` with.
- * @returns {*} Returns the result of `func`.
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  */
-function apply(func, thisArg, args) {
-  switch (args.length) {
-    case 0: return func.call(thisArg);
-    case 1: return func.call(thisArg, args[0]);
-    case 2: return func.call(thisArg, args[0], args[1]);
-    case 3: return func.call(thisArg, args[0], args[1], args[2]);
-  }
-  return func.apply(thisArg, args);
+function baseIsArguments(value) {
+  return isObjectLike(value) && baseGetTag(value) == argsTag;
 }
 
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
+/** Used for built-in method references. */
+var objectProto$6 = Object.prototype;
 
-/**
- * A specialized version of `baseRest` which transforms the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @param {Function} transform The rest array transform.
- * @returns {Function} Returns the new function.
- */
-function overRest(func, start, transform) {
-  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
-  return function() {
-    var args = arguments,
-        index = -1,
-        length = nativeMax(args.length - start, 0),
-        array = Array(length);
+/** Used to check objects for own properties. */
+var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
 
-    while (++index < length) {
-      array[index] = args[start + index];
-    }
-    index = -1;
-    var otherArgs = Array(start + 1);
-    while (++index < start) {
-      otherArgs[index] = args[index];
-    }
-    otherArgs[start] = transform(array);
-    return apply(func, this, otherArgs);
-  };
-}
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
 
 /**
- * Creates a function that returns `value`.
+ * Checks if `value` is likely an `arguments` object.
  *
  * @static
  * @memberOf _
- * @since 2.4.0
- * @category Util
- * @param {*} value The value to return from the new function.
- * @returns {Function} Returns the new constant function.
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ *  else `false`.
  * @example
  *
- * var objects = _.times(2, _.constant({ 'a': 1 }));
- *
- * console.log(objects);
- * // => [{ 'a': 1 }, { 'a': 1 }]
- *
- * console.log(objects[0] === objects[1]);
+ * _.isArguments(function() { return arguments; }());
  * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
  */
-function constant$13(value) {
-  return function() {
-    return value;
-  };
-}
+var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
+  return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
+    !propertyIsEnumerable.call(value, 'callee');
+};
 
 /**
- * The base implementation of `setToString` without support for hot loop shorting.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
- */
-var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
-  return defineProperty(func, 'toString', {
-    'configurable': true,
-    'enumerable': false,
-    'value': constant$13(string),
-    'writable': true
-  });
-};
-
-/** Used to detect hot functions by number of calls within a span of milliseconds. */
-var HOT_COUNT = 800;
-var HOT_SPAN = 16;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeNow = Date.now;
-
-/**
- * Creates a function that'll short out and invoke `identity` instead
- * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
- * milliseconds.
- *
- * @private
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new shortable function.
- */
-function shortOut(func) {
-  var count = 0,
-      lastCalled = 0;
-
-  return function() {
-    var stamp = nativeNow(),
-        remaining = HOT_SPAN - (stamp - lastCalled);
-
-    lastCalled = stamp;
-    if (remaining > 0) {
-      if (++count >= HOT_COUNT) {
-        return arguments[0];
-      }
-    } else {
-      count = 0;
-    }
-    return func.apply(undefined, arguments);
-  };
-}
-
-/**
- * Sets the `toString` method of `func` to return `string`.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
- */
-var setToString = shortOut(baseSetToString);
-
-/**
- * The base implementation of `_.rest` which doesn't validate or coerce arguments.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- */
-function baseRest(func, start) {
-  return setToString(overRest(func, start, identity$8), func + '');
-}
-
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
-function isLength(value) {
-  return typeof value == 'number' &&
-    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
-function isArrayLike(value) {
-  return value != null && isLength(value.length) && !isFunction(value);
-}
-
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER$1 = 9007199254740991;
-
-/** Used to detect unsigned integer values. */
-var reIsUint = /^(?:0|[1-9]\d*)$/;
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  length = length == null ? MAX_SAFE_INTEGER$1 : length;
-  return !!length &&
-    (typeof value == 'number' || reIsUint.test(value)) &&
-    (value > -1 && value % 1 == 0 && value < length);
-}
-
-/**
- * Checks if the given arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
- *  else `false`.
- */
-function isIterateeCall(value, index, object) {
-  if (!isObject(object)) {
-    return false;
-  }
-  var type = typeof index;
-  if (type == 'number'
-        ? (isArrayLike(object) && isIndex(index, object.length))
-        : (type == 'string' && index in object)
-      ) {
-    return eq(object[index], value);
-  }
-  return false;
-}
-
-/**
- * Creates a function like `_.assign`.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @returns {Function} Returns the new assigner function.
- */
-function createAssigner(assigner) {
-  return baseRest(function(object, sources) {
-    var index = -1,
-        length = sources.length,
-        customizer = length > 1 ? sources[length - 1] : undefined,
-        guard = length > 2 ? sources[2] : undefined;
-
-    customizer = (assigner.length > 3 && typeof customizer == 'function')
-      ? (length--, customizer)
-      : undefined;
-
-    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
-      customizer = length < 3 ? undefined : customizer;
-      length = 1;
-    }
-    object = Object(object);
-    while (++index < length) {
-      var source = sources[index];
-      if (source) {
-        assigner(object, source, index, customizer);
-      }
-    }
-    return object;
-  });
-}
-
-/**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
-function baseTimes(n, iteratee) {
-  var index = -1,
-      result = Array(n);
-
-  while (++index < n) {
-    result[index] = iteratee(index);
-  }
-  return result;
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
-  return value != null && typeof value == 'object';
-}
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]';
-
-/**
- * The base implementation of `_.isArguments`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- */
-function baseIsArguments(value) {
-  return isObjectLike(value) && baseGetTag(value) == argsTag;
-}
-
-/** Used for built-in method references. */
-var objectProto$5 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
-
-/** Built-in value references. */
-var propertyIsEnumerable = objectProto$5.propertyIsEnumerable;
-
-/**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- *  else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
-  return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') &&
-    !propertyIsEnumerable.call(value, 'callee');
-};
-
-/**
- * Checks if `value` is classified as an `Array` object.
+ * Checks if `value` is classified as an `Array` object.
  *
  * @static
  * @memberOf _
@@ -17937,6 +18271,61 @@ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
  */
 var isBuffer = nativeIsBuffer || stubFalse;
 
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+  length = length == null ? MAX_SAFE_INTEGER : length;
+  return !!length &&
+    (typeof value == 'number' || reIsUint.test(value)) &&
+    (value > -1 && value % 1 == 0 && value < length);
+}
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER$1 = 9007199254740991;
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+  return typeof value == 'number' &&
+    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
+}
+
 /** `Object#toString` result references. */
 var argsTag$1 = '[object Arguments]';
 var arrayTag = '[object Array]';
@@ -18047,10 +18436,10 @@ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
 
 /** Used for built-in method references. */
-var objectProto$4 = Object.prototype;
+var objectProto$7 = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
+var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
 
 /**
  * Creates an array of the enumerable property names of the array-like `value`.
@@ -18070,7 +18459,7 @@ function arrayLikeKeys(value, inherited) {
       length = result.length;
 
   for (var key in value) {
-    if ((inherited || hasOwnProperty$3.call(value, key)) &&
+    if ((inherited || hasOwnProperty$6.call(value, key)) &&
         !(skipIndexes && (
            // Safari 9 has enumerable `arguments.length` in strict mode.
            key == 'length' ||
@@ -18088,7 +18477,7 @@ function arrayLikeKeys(value, inherited) {
 }
 
 /** Used for built-in method references. */
-var objectProto$7 = Object.prototype;
+var objectProto$8 = Object.prototype;
 
 /**
  * Checks if `value` is likely a prototype object.
@@ -18099,11 +18488,128 @@ var objectProto$7 = Object.prototype;
  */
 function isPrototype(value) {
   var Ctor = value && value.constructor,
-      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$7;
+      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
 
   return value === proto;
 }
 
+/**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+function overArg(func, transform) {
+  return function(arg) {
+    return func(transform(arg));
+  };
+}
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeKeys = overArg(Object.keys, Object);
+
+/** Used for built-in method references. */
+var objectProto$9 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
+
+/**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeys(object) {
+  if (!isPrototype(object)) {
+    return nativeKeys(object);
+  }
+  var result = [];
+  for (var key in Object(object)) {
+    if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
+      result.push(key);
+    }
+  }
+  return result;
+}
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+  return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+function keys$1(object) {
+  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+}
+
+/**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+  return object && copyObject(source, keys$1(source), object);
+}
+
 /**
  * This function is like
  * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
@@ -18124,10 +18630,10 @@ function nativeKeysIn(object) {
 }
 
 /** Used for built-in method references. */
-var objectProto$6 = Object.prototype;
+var objectProto$10 = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
+var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
 
 /**
  * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
@@ -18144,7 +18650,7 @@ function baseKeysIn(object) {
       result = [];
 
   for (var key in object) {
-    if (!(key == 'constructor' && (isProto || !hasOwnProperty$5.call(object, key)))) {
+    if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
       result.push(key);
     }
   }
@@ -18179,39 +18685,68 @@ function keysIn$1(object) {
 }
 
 /**
- * This method is like `_.assign` except that it iterates over own and
- * inherited source properties.
- *
- * **Note:** This method mutates `object`.
+ * The base implementation of `_.assignIn` without support for multiple sources
+ * or `customizer` functions.
  *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @alias extend
- * @category Object
+ * @private
  * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
+ * @param {Object} source The source object.
  * @returns {Object} Returns `object`.
- * @see _.assign
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- * }
- *
- * function Bar() {
- *   this.c = 3;
- * }
- *
- * Foo.prototype.b = 2;
- * Bar.prototype.d = 4;
- *
- * _.assignIn({ 'a': 0 }, new Foo, new Bar);
- * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
  */
-var assignIn = createAssigner(function(object, source) {
-  copyObject(source, keysIn$1(source), object);
-});
+function baseAssignIn(object, source) {
+  return object && copyObject(source, keysIn$1(source), object);
+}
+
+/** Detect free variable `exports`. */
+var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
+
+/** Built-in value references. */
+var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined;
+var allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
+
+/**
+ * Creates a clone of  `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
+function cloneBuffer(buffer, isDeep) {
+  if (isDeep) {
+    return buffer.slice();
+  }
+  var length = buffer.length,
+      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+
+  buffer.copy(result);
+  return result;
+}
+
+/**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+function copyArray(source, array) {
+  var index = -1,
+      length = source.length;
+
+  array || (array = Array(length));
+  while (++index < length) {
+    array[index] = source[index];
+  }
+  return array;
+}
 
 /**
  * A specialized version of `_.filter` for arrays without support for
@@ -18238,684 +18773,842 @@ function arrayFilter(array, predicate) {
 }
 
 /**
- * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+ * This method returns a new empty array.
  *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {Array} Returns the new empty array.
+ * @example
+ *
+ * var arrays = _.times(2, _.stubArray);
+ *
+ * console.log(arrays);
+ * // => [[], []]
+ *
+ * console.log(arrays[0] === arrays[1]);
+ * // => false
  */
-function createBaseFor(fromRight) {
-  return function(object, iteratee, keysFunc) {
-    var index = -1,
-        iterable = Object(object),
-        props = keysFunc(object),
-        length = props.length;
-
-    while (length--) {
-      var key = props[fromRight ? length : ++index];
-      if (iteratee(iterable[key], key, iterable) === false) {
-        break;
-      }
-    }
-    return object;
-  };
+function stubArray() {
+  return [];
 }
 
+/** Used for built-in method references. */
+var objectProto$11 = Object.prototype;
+
+/** Built-in value references. */
+var propertyIsEnumerable$1 = objectProto$11.propertyIsEnumerable;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols;
+
 /**
- * The base implementation of `baseForOwn` which iterates over `object`
- * properties returned by `keysFunc` and invokes `iteratee` for each property.
- * Iteratee functions may exit iteration early by explicitly returning `false`.
+ * Creates an array of the own enumerable symbols of `object`.
  *
  * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
  */
-var baseFor = createBaseFor();
+var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+  if (object == null) {
+    return [];
+  }
+  object = Object(object);
+  return arrayFilter(nativeGetSymbols(object), function(symbol) {
+    return propertyIsEnumerable$1.call(object, symbol);
+  });
+};
 
 /**
- * Creates a unary function that invokes `func` with its argument transformed.
+ * Copies own symbols of `source` to `object`.
  *
  * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
  */
-function overArg(func, transform) {
-  return function(arg) {
-    return func(transform(arg));
-  };
+function copySymbols(source, object) {
+  return copyObject(source, getSymbols(source), object);
 }
 
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeKeys = overArg(Object.keys, Object);
-
-/** Used for built-in method references. */
-var objectProto$8 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$6 = objectProto$8.hasOwnProperty;
-
 /**
- * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ * Appends the elements of `values` to `array`.
  *
  * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
  */
-function baseKeys(object) {
-  if (!isPrototype(object)) {
-    return nativeKeys(object);
-  }
-  var result = [];
-  for (var key in Object(object)) {
-    if (hasOwnProperty$6.call(object, key) && key != 'constructor') {
-      result.push(key);
-    }
+function arrayPush(array, values) {
+  var index = -1,
+      length = values.length,
+      offset = array.length;
+
+  while (++index < length) {
+    array[offset + index] = values[index];
   }
-  return result;
+  return array;
 }
 
+/** Built-in value references. */
+var getPrototype = overArg(Object.getPrototypeOf, Object);
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
+
 /**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * for more details.
+ * Creates an array of the own and inherited enumerable symbols of `object`.
  *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
+ * @private
  * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
+ * @returns {Array} Returns the array of symbols.
  */
-function keys$1(object) {
-  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
-}
+var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
+  var result = [];
+  while (object) {
+    arrayPush(result, getSymbols(object));
+    object = getPrototype(object);
+  }
+  return result;
+};
 
 /**
- * The base implementation of `_.forOwn` without support for iteratee shorthands.
+ * Copies own and inherited symbols of `source` to `object`.
  *
  * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
  * @returns {Object} Returns `object`.
  */
-function baseForOwn(object, iteratee) {
-  return object && baseFor(object, iteratee, keys$1);
+function copySymbolsIn(source, object) {
+  return copyObject(source, getSymbolsIn(source), object);
 }
 
 /**
- * Creates a `baseEach` or `baseEachRight` function.
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
  *
  * @private
- * @param {Function} eachFunc The function to iterate over a collection.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
  */
-function createBaseEach(eachFunc, fromRight) {
-  return function(collection, iteratee) {
-    if (collection == null) {
-      return collection;
-    }
-    if (!isArrayLike(collection)) {
-      return eachFunc(collection, iteratee);
-    }
-    var length = collection.length,
-        index = fromRight ? length : -1,
-        iterable = Object(collection);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      if (iteratee(iterable[index], index, iterable) === false) {
-        break;
-      }
-    }
-    return collection;
-  };
+function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+  var result = keysFunc(object);
+  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
 }
 
 /**
- * The base implementation of `_.forEach` without support for iteratee shorthands.
+ * Creates an array of own enumerable property names and symbols of `object`.
  *
  * @private
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array|Object} Returns `collection`.
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
  */
-var baseEach = createBaseEach(baseForOwn);
+function getAllKeys(object) {
+  return baseGetAllKeys(object, keys$1, getSymbols);
+}
 
 /**
- * The base implementation of `_.filter` without support for iteratee shorthands.
+ * Creates an array of own and inherited enumerable property names and
+ * symbols of `object`.
  *
  * @private
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
  */
-function baseFilter(collection, predicate) {
-  var result = [];
-  baseEach(collection, function(value, index, collection) {
-    if (predicate(value, index, collection)) {
-      result.push(value);
-    }
-  });
-  return result;
+function getAllKeysIn(object) {
+  return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
 }
 
+/* Built-in method references that are verified to be native. */
+var DataView = getNative(root$2, 'DataView');
+
+/* Built-in method references that are verified to be native. */
+var Promise = getNative(root$2, 'Promise');
+
+/* Built-in method references that are verified to be native. */
+var Set$1 = getNative(root$2, 'Set');
+
+/* Built-in method references that are verified to be native. */
+var WeakMap = getNative(root$2, 'WeakMap');
+
+/** `Object#toString` result references. */
+var mapTag$1 = '[object Map]';
+var objectTag$1 = '[object Object]';
+var promiseTag = '[object Promise]';
+var setTag$1 = '[object Set]';
+var weakMapTag$1 = '[object WeakMap]';
+
+var dataViewTag$1 = '[object DataView]';
+
+/** Used to detect maps, sets, and weakmaps. */
+var dataViewCtorString = toSource(DataView);
+var mapCtorString = toSource(Map$1);
+var promiseCtorString = toSource(Promise);
+var setCtorString = toSource(Set$1);
+var weakMapCtorString = toSource(WeakMap);
+
 /**
- * Removes all key-value entries from the list cache.
+ * Gets the `toStringTag` of `value`.
  *
  * @private
- * @name clear
- * @memberOf ListCache
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
  */
-function listCacheClear() {
-  this.__data__ = [];
-  this.size = 0;
+var getTag = baseGetTag;
+
+// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
+    (Map$1 && getTag(new Map$1) != mapTag$1) ||
+    (Promise && getTag(Promise.resolve()) != promiseTag) ||
+    (Set$1 && getTag(new Set$1) != setTag$1) ||
+    (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
+  getTag = function(value) {
+    var result = baseGetTag(value),
+        Ctor = result == objectTag$1 ? value.constructor : undefined,
+        ctorString = Ctor ? toSource(Ctor) : '';
+
+    if (ctorString) {
+      switch (ctorString) {
+        case dataViewCtorString: return dataViewTag$1;
+        case mapCtorString: return mapTag$1;
+        case promiseCtorString: return promiseTag;
+        case setCtorString: return setTag$1;
+        case weakMapCtorString: return weakMapTag$1;
+      }
+    }
+    return result;
+  };
 }
 
+var getTag$1 = getTag;
+
+/** Used for built-in method references. */
+var objectProto$12 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$9 = objectProto$12.hasOwnProperty;
+
 /**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
+ * Initializes an array clone.
  *
  * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
  */
-function assocIndexOf(array, key) {
-  var length = array.length;
-  while (length--) {
-    if (eq(array[length][0], key)) {
-      return length;
-    }
+function initCloneArray(array) {
+  var length = array.length,
+      result = array.constructor(length);
+
+  // Add properties assigned by `RegExp#exec`.
+  if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
+    result.index = array.index;
+    result.input = array.input;
   }
-  return -1;
+  return result;
 }
 
-/** Used for built-in method references. */
-var arrayProto = Array.prototype;
-
 /** Built-in value references. */
-var splice = arrayProto.splice;
+var Uint8Array = root$2.Uint8Array;
 
 /**
- * Removes `key` and its value from the list cache.
+ * Creates a clone of `arrayBuffer`.
  *
  * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
  */
-function listCacheDelete(key) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
-
-  if (index < 0) {
-    return false;
-  }
-  var lastIndex = data.length - 1;
-  if (index == lastIndex) {
-    data.pop();
-  } else {
-    splice.call(data, index, 1);
-  }
-  --this.size;
-  return true;
+function cloneArrayBuffer(arrayBuffer) {
+  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+  new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+  return result;
 }
 
 /**
- * Gets the list cache value for `key`.
+ * Creates a clone of `dataView`.
  *
  * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
  */
-function listCacheGet(key) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
-
-  return index < 0 ? undefined : data[index][1];
+function cloneDataView(dataView, isDeep) {
+  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
 }
 
 /**
- * Checks if a list cache value for `key` exists.
+ * Adds the key-value `pair` to `map`.
  *
  * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ * @param {Object} map The map to modify.
+ * @param {Array} pair The key-value pair to add.
+ * @returns {Object} Returns `map`.
  */
-function listCacheHas(key) {
-  return assocIndexOf(this.__data__, key) > -1;
+function addMapEntry(map, pair) {
+  // Don't return `map.set` because it's not chainable in IE 11.
+  map.set(pair[0], pair[1]);
+  return map;
 }
 
 /**
- * Sets the list cache `key` to `value`.
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
  *
  * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ *  the initial value.
+ * @returns {*} Returns the accumulated value.
  */
-function listCacheSet(key, value) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
+function arrayReduce(array, iteratee, accumulator, initAccum) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
 
-  if (index < 0) {
-    ++this.size;
-    data.push([key, value]);
-  } else {
-    data[index][1] = value;
+  if (initAccum && length) {
+    accumulator = array[++index];
   }
-  return this;
+  while (++index < length) {
+    accumulator = iteratee(accumulator, array[index], index, array);
+  }
+  return accumulator;
 }
 
 /**
- * Creates an list cache object.
+ * Converts `map` to its key-value pairs.
  *
  * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
  */
-function ListCache(entries) {
+function mapToArray(map) {
   var index = -1,
-      length = entries == null ? 0 : entries.length;
+      result = Array(map.size);
 
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
+  map.forEach(function(value, key) {
+    result[++index] = [key, value];
+  });
+  return result;
 }
 
-// Add methods to `ListCache`.
-ListCache.prototype.clear = listCacheClear;
-ListCache.prototype['delete'] = listCacheDelete;
-ListCache.prototype.get = listCacheGet;
-ListCache.prototype.has = listCacheHas;
-ListCache.prototype.set = listCacheSet;
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG = 1;
 
 /**
- * Removes all key-value entries from the stack.
+ * Creates a clone of `map`.
  *
  * @private
- * @name clear
- * @memberOf Stack
+ * @param {Object} map The map to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned map.
  */
-function stackClear() {
-  this.__data__ = new ListCache;
-  this.size = 0;
+function cloneMap(map, isDeep, cloneFunc) {
+  var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);
+  return arrayReduce(array, addMapEntry, new map.constructor);
 }
 
+/** Used to match `RegExp` flags from their coerced string values. */
+var reFlags = /\w*$/;
+
 /**
- * Removes `key` and its value from the stack.
+ * Creates a clone of `regexp`.
  *
  * @private
- * @name delete
- * @memberOf Stack
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
  */
-function stackDelete(key) {
-  var data = this.__data__,
-      result = data['delete'](key);
-
-  this.size = data.size;
+function cloneRegExp(regexp) {
+  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+  result.lastIndex = regexp.lastIndex;
   return result;
 }
 
 /**
- * Gets the stack value for `key`.
+ * Adds `value` to `set`.
  *
  * @private
- * @name get
- * @memberOf Stack
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
+ * @param {Object} set The set to modify.
+ * @param {*} value The value to add.
+ * @returns {Object} Returns `set`.
  */
-function stackGet(key) {
-  return this.__data__.get(key);
+function addSetEntry(set, value) {
+  // Don't return `set.add` because it's not chainable in IE 11.
+  set.add(value);
+  return set;
 }
 
 /**
- * Checks if a stack value for `key` exists.
+ * Converts `set` to an array of its values.
  *
  * @private
- * @name has
- * @memberOf Stack
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
  */
-function stackHas(key) {
-  return this.__data__.has(key);
-}
+function setToArray(set) {
+  var index = -1,
+      result = Array(set.size);
 
-/* Built-in method references that are verified to be native. */
-var Map$1 = getNative(root$2, 'Map');
+  set.forEach(function(value) {
+    result[++index] = value;
+  });
+  return result;
+}
 
-/* Built-in method references that are verified to be native. */
-var nativeCreate = getNative(Object, 'create');
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG$1 = 1;
 
 /**
- * Removes all key-value entries from the hash.
+ * Creates a clone of `set`.
  *
  * @private
- * @name clear
- * @memberOf Hash
+ * @param {Object} set The set to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned set.
  */
-function hashClear() {
-  this.__data__ = nativeCreate ? nativeCreate(null) : {};
-  this.size = 0;
+function cloneSet(set, isDeep, cloneFunc) {
+  var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG$1) : setToArray(set);
+  return arrayReduce(array, addSetEntry, new set.constructor);
 }
 
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined;
+var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
 /**
- * Removes `key` and its value from the hash.
+ * Creates a clone of the `symbol` object.
  *
  * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
  */
-function hashDelete(key) {
-  var result = this.has(key) && delete this.__data__[key];
-  this.size -= result ? 1 : 0;
-  return result;
+function cloneSymbol(symbol) {
+  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
 }
 
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED = '__lodash_hash_undefined__';
-
-/** Used for built-in method references. */
-var objectProto$9 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
-
 /**
- * Gets the hash value for `key`.
+ * Creates a clone of `typedArray`.
  *
  * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
  */
-function hashGet(key) {
-  var data = this.__data__;
-  if (nativeCreate) {
-    var result = data[key];
-    return result === HASH_UNDEFINED ? undefined : result;
-  }
-  return hasOwnProperty$7.call(data, key) ? data[key] : undefined;
+function cloneTypedArray(typedArray, isDeep) {
+  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
 }
 
-/** Used for built-in method references. */
-var objectProto$10 = Object.prototype;
+/** `Object#toString` result references. */
+var boolTag$1 = '[object Boolean]';
+var dateTag$1 = '[object Date]';
+var mapTag$2 = '[object Map]';
+var numberTag$1 = '[object Number]';
+var regexpTag$1 = '[object RegExp]';
+var setTag$2 = '[object Set]';
+var stringTag$1 = '[object String]';
+var symbolTag = '[object Symbol]';
 
-/** Used to check objects for own properties. */
-var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
+var arrayBufferTag$1 = '[object ArrayBuffer]';
+var dataViewTag$2 = '[object DataView]';
+var float32Tag$1 = '[object Float32Array]';
+var float64Tag$1 = '[object Float64Array]';
+var int8Tag$1 = '[object Int8Array]';
+var int16Tag$1 = '[object Int16Array]';
+var int32Tag$1 = '[object Int32Array]';
+var uint8Tag$1 = '[object Uint8Array]';
+var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
+var uint16Tag$1 = '[object Uint16Array]';
+var uint32Tag$1 = '[object Uint32Array]';
 
 /**
- * Checks if a hash value for `key` exists.
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  *
  * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
  */
-function hashHas(key) {
-  var data = this.__data__;
-  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key);
+function initCloneByTag(object, tag, cloneFunc, isDeep) {
+  var Ctor = object.constructor;
+  switch (tag) {
+    case arrayBufferTag$1:
+      return cloneArrayBuffer(object);
+
+    case boolTag$1:
+    case dateTag$1:
+      return new Ctor(+object);
+
+    case dataViewTag$2:
+      return cloneDataView(object, isDeep);
+
+    case float32Tag$1: case float64Tag$1:
+    case int8Tag$1: case int16Tag$1: case int32Tag$1:
+    case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
+      return cloneTypedArray(object, isDeep);
+
+    case mapTag$2:
+      return cloneMap(object, isDeep, cloneFunc);
+
+    case numberTag$1:
+    case stringTag$1:
+      return new Ctor(object);
+
+    case regexpTag$1:
+      return cloneRegExp(object);
+
+    case setTag$2:
+      return cloneSet(object, isDeep, cloneFunc);
+
+    case symbolTag:
+      return cloneSymbol(object);
+  }
 }
 
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
+/** Built-in value references. */
+var objectCreate = Object.create;
 
 /**
- * Sets the hash `key` to `value`.
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
  *
  * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
+ * @param {Object} proto The object to inherit from.
+ * @returns {Object} Returns the new object.
  */
-function hashSet(key, value) {
-  var data = this.__data__;
-  this.size += this.has(key) ? 0 : 1;
-  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
-  return this;
-}
+var baseCreate = (function() {
+  function object() {}
+  return function(proto) {
+    if (!isObject(proto)) {
+      return {};
+    }
+    if (objectCreate) {
+      return objectCreate(proto);
+    }
+    object.prototype = proto;
+    var result = new object;
+    object.prototype = undefined;
+    return result;
+  };
+}());
 
 /**
- * Creates a hash object.
+ * Initializes an object clone.
  *
  * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
  */
-function Hash(entries) {
-  var index = -1,
-      length = entries == null ? 0 : entries.length;
-
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
+function initCloneObject(object) {
+  return (typeof object.constructor == 'function' && !isPrototype(object))
+    ? baseCreate(getPrototype(object))
+    : {};
 }
 
-// Add methods to `Hash`.
-Hash.prototype.clear = hashClear;
-Hash.prototype['delete'] = hashDelete;
-Hash.prototype.get = hashGet;
-Hash.prototype.has = hashHas;
-Hash.prototype.set = hashSet;
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG$2 = 1;
+var CLONE_FLAT_FLAG = 2;
+var CLONE_SYMBOLS_FLAG = 4;
+
+/** `Object#toString` result references. */
+var argsTag$2 = '[object Arguments]';
+var arrayTag$1 = '[object Array]';
+var boolTag$2 = '[object Boolean]';
+var dateTag$2 = '[object Date]';
+var errorTag$1 = '[object Error]';
+var funcTag$2 = '[object Function]';
+var genTag$1 = '[object GeneratorFunction]';
+var mapTag$3 = '[object Map]';
+var numberTag$2 = '[object Number]';
+var objectTag$2 = '[object Object]';
+var regexpTag$2 = '[object RegExp]';
+var setTag$3 = '[object Set]';
+var stringTag$2 = '[object String]';
+var symbolTag$1 = '[object Symbol]';
+var weakMapTag$2 = '[object WeakMap]';
+
+var arrayBufferTag$2 = '[object ArrayBuffer]';
+var dataViewTag$3 = '[object DataView]';
+var float32Tag$2 = '[object Float32Array]';
+var float64Tag$2 = '[object Float64Array]';
+var int8Tag$2 = '[object Int8Array]';
+var int16Tag$2 = '[object Int16Array]';
+var int32Tag$2 = '[object Int32Array]';
+var uint8Tag$2 = '[object Uint8Array]';
+var uint8ClampedTag$2 = '[object Uint8ClampedArray]';
+var uint16Tag$2 = '[object Uint16Array]';
+var uint32Tag$2 = '[object Uint32Array]';
+
+/** Used to identify `toStringTag` values supported by `_.clone`. */
+var cloneableTags = {};
+cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
+cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
+cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
+cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
+cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
+cloneableTags[int32Tag$2] = cloneableTags[mapTag$3] =
+cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
+cloneableTags[regexpTag$2] = cloneableTags[setTag$3] =
+cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
+cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
+cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
+cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
+cloneableTags[weakMapTag$2] = false;
 
 /**
- * Removes all key-value entries from the map.
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
  *
  * @private
- * @name clear
- * @memberOf MapCache
+ * @param {*} value The value to clone.
+ * @param {boolean} bitmask The bitmask flags.
+ *  1 - Deep clone
+ *  2 - Flatten inherited properties
+ *  4 - Clone symbols
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
  */
-function mapCacheClear() {
-  this.size = 0;
-  this.__data__ = {
-    'hash': new Hash,
-    'map': new (Map$1 || ListCache),
-    'string': new Hash
-  };
+function baseClone(value, bitmask, customizer, key, object, stack) {
+  var result,
+      isDeep = bitmask & CLONE_DEEP_FLAG$2,
+      isFlat = bitmask & CLONE_FLAT_FLAG,
+      isFull = bitmask & CLONE_SYMBOLS_FLAG;
+
+  if (customizer) {
+    result = object ? customizer(value, key, object, stack) : customizer(value);
+  }
+  if (result !== undefined) {
+    return result;
+  }
+  if (!isObject(value)) {
+    return value;
+  }
+  var isArr = isArray(value);
+  if (isArr) {
+    result = initCloneArray(value);
+    if (!isDeep) {
+      return copyArray(value, result);
+    }
+  } else {
+    var tag = getTag$1(value),
+        isFunc = tag == funcTag$2 || tag == genTag$1;
+
+    if (isBuffer(value)) {
+      return cloneBuffer(value, isDeep);
+    }
+    if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
+      result = (isFlat || isFunc) ? {} : initCloneObject(value);
+      if (!isDeep) {
+        return isFlat
+          ? copySymbolsIn(value, baseAssignIn(result, value))
+          : copySymbols(value, baseAssign(result, value));
+      }
+    } else {
+      if (!cloneableTags[tag]) {
+        return object ? value : {};
+      }
+      result = initCloneByTag(value, tag, baseClone, isDeep);
+    }
+  }
+  // Check for circular references and return its corresponding clone.
+  stack || (stack = new Stack);
+  var stacked = stack.get(value);
+  if (stacked) {
+    return stacked;
+  }
+  stack.set(value, result);
+
+  var keysFunc = isFull
+    ? (isFlat ? getAllKeysIn : getAllKeys)
+    : (isFlat ? keysIn : keys$1);
+
+  var props = isArr ? undefined : keysFunc(value);
+  arrayEach(props || value, function(subValue, key) {
+    if (props) {
+      key = subValue;
+      subValue = value[key];
+    }
+    // Recursively populate clone (susceptible to call stack limits).
+    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+  });
+  return result;
 }
 
+/** Used to compose bitmasks for cloning. */
+var CLONE_SYMBOLS_FLAG$1 = 4;
+
 /**
- * Checks if `value` is suitable for use as unique object key.
+ * Creates a shallow clone of `value`.
  *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+ * and supports cloning arrays, array buffers, booleans, date objects, maps,
+ * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+ * arrays. The own enumerable properties of `arguments` objects are cloned
+ * as plain objects. An empty object is returned for uncloneable values such
+ * as error objects, functions, DOM nodes, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeep
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var shallow = _.clone(objects);
+ * console.log(shallow[0] === objects[0]);
+ * // => true
  */
-function isKeyable(value) {
-  var type = typeof value;
-  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
-    ? (value !== '__proto__')
-    : (value === null);
+function clone(value) {
+  return baseClone(value, CLONE_SYMBOLS_FLAG$1);
 }
 
 /**
- * Gets the data for `map`.
+ * A specialized version of `baseAggregator` for arrays.
  *
  * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform keys.
+ * @param {Object} accumulator The initial aggregated object.
+ * @returns {Function} Returns `accumulator`.
  */
-function getMapData(map, key) {
-  var data = map.__data__;
-  return isKeyable(key)
-    ? data[typeof key == 'string' ? 'string' : 'hash']
-    : data.map;
+function arrayAggregator(array, setter, iteratee, accumulator) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  while (++index < length) {
+    var value = array[index];
+    setter(accumulator, value, iteratee(value), array);
+  }
+  return accumulator;
 }
 
 /**
- * Removes `key` and its value from the map.
+ * Creates a base function for methods like `_.forIn` and `_.forOwn`.
  *
  * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
  */
-function mapCacheDelete(key) {
-  var result = getMapData(this, key)['delete'](key);
-  this.size -= result ? 1 : 0;
-  return result;
+function createBaseFor(fromRight) {
+  return function(object, iteratee, keysFunc) {
+    var index = -1,
+        iterable = Object(object),
+        props = keysFunc(object),
+        length = props.length;
+
+    while (length--) {
+      var key = props[fromRight ? length : ++index];
+      if (iteratee(iterable[key], key, iterable) === false) {
+        break;
+      }
+    }
+    return object;
+  };
 }
 
 /**
- * Gets the map value for `key`.
+ * The base implementation of `baseForOwn` which iterates over `object`
+ * properties returned by `keysFunc` and invokes `iteratee` for each property.
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
  *
  * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
  */
-function mapCacheGet(key) {
-  return getMapData(this, key).get(key);
-}
+var baseFor = createBaseFor();
 
 /**
- * Checks if a map value for `key` exists.
+ * The base implementation of `_.forOwn` without support for iteratee shorthands.
  *
  * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
  */
-function mapCacheHas(key) {
-  return getMapData(this, key).has(key);
+function baseForOwn(object, iteratee) {
+  return object && baseFor(object, iteratee, keys$1);
 }
 
 /**
- * Sets the map `key` to `value`.
+ * Creates a `baseEach` or `baseEachRight` function.
  *
  * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
  */
-function mapCacheSet(key, value) {
-  var data = getMapData(this, key),
-      size = data.size;
+function createBaseEach(eachFunc, fromRight) {
+  return function(collection, iteratee) {
+    if (collection == null) {
+      return collection;
+    }
+    if (!isArrayLike(collection)) {
+      return eachFunc(collection, iteratee);
+    }
+    var length = collection.length,
+        index = fromRight ? length : -1,
+        iterable = Object(collection);
 
-  data.set(key, value);
-  this.size += data.size == size ? 0 : 1;
-  return this;
+    while ((fromRight ? index-- : ++index < length)) {
+      if (iteratee(iterable[index], index, iterable) === false) {
+        break;
+      }
+    }
+    return collection;
+  };
 }
 
 /**
- * Creates a map cache object to store key-value pairs.
+ * The base implementation of `_.forEach` without support for iteratee shorthands.
  *
  * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function MapCache(entries) {
-  var index = -1,
-      length = entries == null ? 0 : entries.length;
-
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
-}
-
-// Add methods to `MapCache`.
-MapCache.prototype.clear = mapCacheClear;
-MapCache.prototype['delete'] = mapCacheDelete;
-MapCache.prototype.get = mapCacheGet;
-MapCache.prototype.has = mapCacheHas;
-MapCache.prototype.set = mapCacheSet;
-
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
-
-/**
- * Sets the stack `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Stack
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the stack cache instance.
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
  */
-function stackSet(key, value) {
-  var data = this.__data__;
-  if (data instanceof ListCache) {
-    var pairs = data.__data__;
-    if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
-      pairs.push([key, value]);
-      this.size = ++data.size;
-      return this;
-    }
-    data = this.__data__ = new MapCache(pairs);
-  }
-  data.set(key, value);
-  this.size = data.size;
-  return this;
-}
+var baseEach = createBaseEach(baseForOwn);
 
 /**
- * Creates a stack cache object to store key-value pairs.
+ * Aggregates elements of `collection` on `accumulator` with keys transformed
+ * by `iteratee` and values set by `setter`.
  *
  * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} setter The function to set `accumulator` values.
+ * @param {Function} iteratee The iteratee to transform keys.
+ * @param {Object} accumulator The initial aggregated object.
+ * @returns {Function} Returns `accumulator`.
  */
-function Stack(entries) {
-  var data = this.__data__ = new ListCache(entries);
-  this.size = data.size;
+function baseAggregator(collection, setter, iteratee, accumulator) {
+  baseEach(collection, function(value, key, collection) {
+    setter(accumulator, value, iteratee(value), collection);
+  });
+  return accumulator;
 }
 
-// Add methods to `Stack`.
-Stack.prototype.clear = stackClear;
-Stack.prototype['delete'] = stackDelete;
-Stack.prototype.get = stackGet;
-Stack.prototype.has = stackHas;
-Stack.prototype.set = stackSet;
-
 /** Used to stand-in for `undefined` hash values. */
 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
 
@@ -19004,8 +19697,8 @@ function cacheHas(cache, key) {
 }
 
 /** Used to compose bitmasks for value comparisons. */
-var COMPARE_PARTIAL_FLAG$2 = 1;
-var COMPARE_UNORDERED_FLAG$1 = 2;
+var COMPARE_PARTIAL_FLAG = 1;
+var COMPARE_UNORDERED_FLAG = 2;
 
 /**
  * A specialized version of `baseIsEqualDeep` for arrays with support for
@@ -19021,7 +19714,7 @@ var COMPARE_UNORDERED_FLAG$1 = 2;
  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
  */
 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
-  var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
+  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
       arrLength = array.length,
       othLength = other.length;
 
@@ -19035,7 +19728,7 @@ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
   }
   var index = -1,
       result = true,
-      seen = (bitmask & COMPARE_UNORDERED_FLAG$1) ? new SetCache : undefined;
+      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
 
   stack.set(array, other);
   stack.set(other, array);
@@ -19081,64 +19774,27 @@ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
   return result;
 }
 
-/** Built-in value references. */
-var Uint8Array = root$2.Uint8Array;
-
-/**
- * Converts `map` to its key-value pairs.
- *
- * @private
- * @param {Object} map The map to convert.
- * @returns {Array} Returns the key-value pairs.
- */
-function mapToArray(map) {
-  var index = -1,
-      result = Array(map.size);
-
-  map.forEach(function(value, key) {
-    result[++index] = [key, value];
-  });
-  return result;
-}
-
-/**
- * Converts `set` to an array of its values.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the values.
- */
-function setToArray(set) {
-  var index = -1,
-      result = Array(set.size);
-
-  set.forEach(function(value) {
-    result[++index] = value;
-  });
-  return result;
-}
-
 /** Used to compose bitmasks for value comparisons. */
-var COMPARE_PARTIAL_FLAG$3 = 1;
-var COMPARE_UNORDERED_FLAG$2 = 2;
+var COMPARE_PARTIAL_FLAG$1 = 1;
+var COMPARE_UNORDERED_FLAG$1 = 2;
 
 /** `Object#toString` result references. */
-var boolTag$1 = '[object Boolean]';
-var dateTag$1 = '[object Date]';
-var errorTag$1 = '[object Error]';
-var mapTag$1 = '[object Map]';
-var numberTag$1 = '[object Number]';
-var regexpTag$1 = '[object RegExp]';
-var setTag$1 = '[object Set]';
-var stringTag$1 = '[object String]';
-var symbolTag = '[object Symbol]';
+var boolTag$3 = '[object Boolean]';
+var dateTag$3 = '[object Date]';
+var errorTag$2 = '[object Error]';
+var mapTag$4 = '[object Map]';
+var numberTag$3 = '[object Number]';
+var regexpTag$3 = '[object RegExp]';
+var setTag$4 = '[object Set]';
+var stringTag$3 = '[object String]';
+var symbolTag$2 = '[object Symbol]';
 
-var arrayBufferTag$1 = '[object ArrayBuffer]';
-var dataViewTag$1 = '[object DataView]';
+var arrayBufferTag$3 = '[object ArrayBuffer]';
+var dataViewTag$4 = '[object DataView]';
 
 /** Used to convert symbols to primitives and strings. */
-var symbolProto = Symbol ? Symbol.prototype : undefined;
-var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
+var symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
 
 /**
  * A specialized version of `baseIsEqualDeep` for comparing objects of
@@ -19159,7 +19815,7 @@ var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
  */
 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
   switch (tag) {
-    case dataViewTag$1:
+    case dataViewTag$4:
       if ((object.byteLength != other.byteLength) ||
           (object.byteOffset != other.byteOffset)) {
         return false;
@@ -19167,35 +19823,35 @@ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
       object = object.buffer;
       other = other.buffer;
 
-    case arrayBufferTag$1:
+    case arrayBufferTag$3:
       if ((object.byteLength != other.byteLength) ||
           !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
         return false;
       }
       return true;
 
-    case boolTag$1:
-    case dateTag$1:
-    case numberTag$1:
+    case boolTag$3:
+    case dateTag$3:
+    case numberTag$3:
       // Coerce booleans to `1` or `0` and dates to milliseconds.
       // Invalid dates are coerced to `NaN`.
       return eq(+object, +other);
 
-    case errorTag$1:
+    case errorTag$2:
       return object.name == other.name && object.message == other.message;
 
-    case regexpTag$1:
-    case stringTag$1:
+    case regexpTag$3:
+    case stringTag$3:
       // Coerce regexes to strings and treat strings, primitives and objects,
       // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
       // for more details.
       return object == (other + '');
 
-    case mapTag$1:
+    case mapTag$4:
       var convert = mapToArray;
 
-    case setTag$1:
-      var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3;
+    case setTag$4:
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
       convert || (convert = setToArray);
 
       if (object.size != other.size && !isPartial) {
@@ -19206,7 +19862,7 @@ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
       if (stacked) {
         return stacked == other;
       }
-      bitmask |= COMPARE_UNORDERED_FLAG$2;
+      bitmask |= COMPARE_UNORDERED_FLAG$1;
 
       // Recursively compare objects (susceptible to call stack limits).
       stack.set(object, other);
@@ -19214,116 +19870,22 @@ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
       stack['delete'](object);
       return result;
 
-    case symbolTag:
-      if (symbolValueOf) {
-        return symbolValueOf.call(object) == symbolValueOf.call(other);
+    case symbolTag$2:
+      if (symbolValueOf$1) {
+        return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
       }
   }
   return false;
 }
 
-/**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
-function arrayPush(array, values) {
-  var index = -1,
-      length = values.length,
-      offset = array.length;
-
-  while (++index < length) {
-    array[offset + index] = values[index];
-  }
-  return array;
-}
-
-/**
- * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
- * `keysFunc` and `symbolsFunc` to get the enumerable property names and
- * symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @param {Function} symbolsFunc The function to get the symbols of `object`.
- * @returns {Array} Returns the array of property names and symbols.
- */
-function baseGetAllKeys(object, keysFunc, symbolsFunc) {
-  var result = keysFunc(object);
-  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
-}
-
-/**
- * This method returns a new empty array.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {Array} Returns the new empty array.
- * @example
- *
- * var arrays = _.times(2, _.stubArray);
- *
- * console.log(arrays);
- * // => [[], []]
- *
- * console.log(arrays[0] === arrays[1]);
- * // => false
- */
-function stubArray() {
-  return [];
-}
-
-/** Used for built-in method references. */
-var objectProto$13 = Object.prototype;
-
-/** Built-in value references. */
-var propertyIsEnumerable$1 = objectProto$13.propertyIsEnumerable;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeGetSymbols = Object.getOwnPropertySymbols;
-
-/**
- * Creates an array of the own enumerable symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
- */
-var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
-  if (object == null) {
-    return [];
-  }
-  object = Object(object);
-  return arrayFilter(nativeGetSymbols(object), function(symbol) {
-    return propertyIsEnumerable$1.call(object, symbol);
-  });
-};
-
-/**
- * Creates an array of own enumerable property names and symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
- */
-function getAllKeys(object) {
-  return baseGetAllKeys(object, keys$1, getSymbols);
-}
-
 /** Used to compose bitmasks for value comparisons. */
-var COMPARE_PARTIAL_FLAG$4 = 1;
+var COMPARE_PARTIAL_FLAG$2 = 1;
 
 /** Used for built-in method references. */
-var objectProto$12 = Object.prototype;
+var objectProto$13 = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$10 = objectProto$12.hasOwnProperty;
+var hasOwnProperty$10 = objectProto$13.hasOwnProperty;
 
 /**
  * A specialized version of `baseIsEqualDeep` for objects with support for
@@ -19339,7 +19901,7 @@ var hasOwnProperty$10 = objectProto$12.hasOwnProperty;
  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  */
 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
-  var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4,
+  var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
       objProps = getAllKeys(object),
       objLength = objProps.length,
       othProps = getAllKeys(other),
@@ -19402,82 +19964,19 @@ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
   return result;
 }
 
-/* Built-in method references that are verified to be native. */
-var DataView = getNative(root$2, 'DataView');
-
-/* Built-in method references that are verified to be native. */
-var Promise = getNative(root$2, 'Promise');
-
-/* Built-in method references that are verified to be native. */
-var Set$1 = getNative(root$2, 'Set');
-
-/* Built-in method references that are verified to be native. */
-var WeakMap = getNative(root$2, 'WeakMap');
-
-/** `Object#toString` result references. */
-var mapTag$2 = '[object Map]';
-var objectTag$2 = '[object Object]';
-var promiseTag = '[object Promise]';
-var setTag$2 = '[object Set]';
-var weakMapTag$1 = '[object WeakMap]';
-
-var dataViewTag$2 = '[object DataView]';
-
-/** Used to detect maps, sets, and weakmaps. */
-var dataViewCtorString = toSource(DataView);
-var mapCtorString = toSource(Map$1);
-var promiseCtorString = toSource(Promise);
-var setCtorString = toSource(Set$1);
-var weakMapCtorString = toSource(WeakMap);
-
-/**
- * Gets the `toStringTag` of `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
-var getTag = baseGetTag;
-
-// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
-if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$2) ||
-    (Map$1 && getTag(new Map$1) != mapTag$2) ||
-    (Promise && getTag(Promise.resolve()) != promiseTag) ||
-    (Set$1 && getTag(new Set$1) != setTag$2) ||
-    (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
-  getTag = function(value) {
-    var result = baseGetTag(value),
-        Ctor = result == objectTag$2 ? value.constructor : undefined,
-        ctorString = Ctor ? toSource(Ctor) : '';
-
-    if (ctorString) {
-      switch (ctorString) {
-        case dataViewCtorString: return dataViewTag$2;
-        case mapCtorString: return mapTag$2;
-        case promiseCtorString: return promiseTag;
-        case setCtorString: return setTag$2;
-        case weakMapCtorString: return weakMapTag$1;
-      }
-    }
-    return result;
-  };
-}
-
-var getTag$1 = getTag;
-
 /** Used to compose bitmasks for value comparisons. */
-var COMPARE_PARTIAL_FLAG$1 = 1;
+var COMPARE_PARTIAL_FLAG$3 = 1;
 
 /** `Object#toString` result references. */
-var argsTag$2 = '[object Arguments]';
-var arrayTag$1 = '[object Array]';
-var objectTag$1 = '[object Object]';
+var argsTag$3 = '[object Arguments]';
+var arrayTag$2 = '[object Array]';
+var objectTag$3 = '[object Object]';
 
 /** Used for built-in method references. */
-var objectProto$11 = Object.prototype;
+var objectProto$14 = Object.prototype;
 
 /** Used to check objects for own properties. */
-var hasOwnProperty$9 = objectProto$11.hasOwnProperty;
+var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
 
 /**
  * A specialized version of `baseIsEqual` for arrays and objects which performs
@@ -19496,14 +19995,14 @@ var hasOwnProperty$9 = objectProto$11.hasOwnProperty;
 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
   var objIsArr = isArray(object),
       othIsArr = isArray(other),
-      objTag = objIsArr ? arrayTag$1 : getTag$1(object),
-      othTag = othIsArr ? arrayTag$1 : getTag$1(other);
+      objTag = objIsArr ? arrayTag$2 : getTag$1(object),
+      othTag = othIsArr ? arrayTag$2 : getTag$1(other);
 
-  objTag = objTag == argsTag$2 ? objectTag$1 : objTag;
-  othTag = othTag == argsTag$2 ? objectTag$1 : othTag;
+  objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
+  othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
 
-  var objIsObj = objTag == objectTag$1,
-      othIsObj = othTag == objectTag$1,
+  var objIsObj = objTag == objectTag$3,
+      othIsObj = othTag == objectTag$3,
       isSameTag = objTag == othTag;
 
   if (isSameTag && isBuffer(object)) {
@@ -19519,9 +20018,9 @@ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
   }
-  if (!(bitmask & COMPARE_PARTIAL_FLAG$1)) {
-    var objIsWrapped = objIsObj && hasOwnProperty$9.call(object, '__wrapped__'),
-        othIsWrapped = othIsObj && hasOwnProperty$9.call(other, '__wrapped__');
+  if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
+    var objIsWrapped = objIsObj && hasOwnProperty$11.call(object, '__wrapped__'),
+        othIsWrapped = othIsObj && hasOwnProperty$11.call(other, '__wrapped__');
 
     if (objIsWrapped || othIsWrapped) {
       var objUnwrapped = objIsWrapped ? object.value() : object,
@@ -19563,8 +20062,8 @@ function baseIsEqual(value, other, bitmask, customizer, stack) {
 }
 
 /** Used to compose bitmasks for value comparisons. */
-var COMPARE_PARTIAL_FLAG = 1;
-var COMPARE_UNORDERED_FLAG = 2;
+var COMPARE_PARTIAL_FLAG$4 = 1;
+var COMPARE_UNORDERED_FLAG$2 = 2;
 
 /**
  * The base implementation of `_.isMatch` without support for iteratee shorthands.
@@ -19610,7 +20109,7 @@ function baseIsMatch(object, source, matchData, customizer) {
         var result = customizer(objValue, srcValue, key, object, source, stack);
       }
       if (!(result === undefined
-            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
+            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
             : result
           )) {
         return false;
@@ -19689,7 +20188,7 @@ function baseMatches(source) {
 }
 
 /** `Object#toString` result references. */
-var symbolTag$1 = '[object Symbol]';
+var symbolTag$3 = '[object Symbol]';
 
 /**
  * Checks if `value` is classified as a `Symbol` primitive or object.
@@ -19710,7 +20209,7 @@ var symbolTag$1 = '[object Symbol]';
  */
 function isSymbol(value) {
   return typeof value == 'symbol' ||
-    (isObjectLike(value) && baseGetTag(value) == symbolTag$1);
+    (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
 }
 
 /** Used to match property names within property paths. */
@@ -19880,8 +20379,8 @@ function arrayMap(array, iteratee) {
 var INFINITY = 1 / 0;
 
 /** Used to convert symbols to primitives and strings. */
-var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
-var symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;
+var symbolProto$2 = Symbol ? Symbol.prototype : undefined;
+var symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
 
 /**
  * The base implementation of `_.toString` which doesn't convert nullish
@@ -20112,6 +20611,26 @@ function baseMatchesProperty(path, srcValue) {
   };
 }
 
+/**
+ * This method returns the first argument it receives.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Util
+ * @param {*} value Any value.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ *
+ * console.log(_.identity(object) === object);
+ * // => true
+ */
+function identity$8(value) {
+  return value;
+}
+
 /**
  * The base implementation of `_.property` without support for deep paths.
  *
@@ -20189,1192 +20708,1147 @@ function baseIteratee(value) {
 }
 
 /**
- * Iterates over elements of `collection`, returning an array of all elements
- * `predicate` returns truthy for. The predicate is invoked with three
- * arguments: (value, index|key, collection).
+ * Creates a function like `_.groupBy`.
  *
- * **Note:** Unlike `_.remove`, this method returns a new array.
+ * @private
+ * @param {Function} setter The function to set accumulator values.
+ * @param {Function} [initializer] The accumulator object initializer.
+ * @returns {Function} Returns the new aggregator function.
+ */
+function createAggregator(setter, initializer) {
+  return function(collection, iteratee) {
+    var func = isArray(collection) ? arrayAggregator : baseAggregator,
+        accumulator = initializer ? initializer() : {};
+
+    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
+  };
+}
+
+/** Used for built-in method references. */
+var objectProto$15 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
+
+/**
+ * Creates an object composed of keys generated from the results of running
+ * each element of `collection` thru `iteratee`. The order of grouped values
+ * is determined by the order they occur in `collection`. The corresponding
+ * value of each key is an array of elements responsible for generating the
+ * key. The iteratee is invoked with one argument: (value).
  *
  * @static
  * @memberOf _
  * @since 0.1.0
  * @category Collection
  * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} [predicate=_.identity] The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
- * @see _.reject
+ * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+ * @returns {Object} Returns the composed aggregate object.
  * @example
  *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': true },
- *   { 'user': 'fred',   'age': 40, 'active': false }
- * ];
- *
- * _.filter(users, function(o) { return !o.active; });
- * // => objects for ['fred']
+ * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+ * // => { '4': [4.2], '6': [6.1, 6.3] }
  *
- * // The `_.matches` iteratee shorthand.
- * _.filter(users, { 'age': 36, 'active': true });
- * // => objects for ['barney']
+ * // The `_.property` iteratee shorthand.
+ * _.groupBy(['one', 'two', 'three'], 'length');
+ * // => { '3': ['one', 'two'], '5': ['three'] }
+ */
+var groupBy = createAggregator(function(result, value, key) {
+  if (hasOwnProperty$12.call(result, key)) {
+    result[key].push(value);
+  } else {
+    baseAssignValue(result, key, [value]);
+  }
+});
+
+/**
+ * Gets the last element of `array`.
  *
- * // The `_.matchesProperty` iteratee shorthand.
- * _.filter(users, ['active', false]);
- * // => objects for ['fred']
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
  *
- * // The `_.property` iteratee shorthand.
- * _.filter(users, 'active');
- * // => objects for ['barney']
+ * _.last([1, 2, 3]);
+ * // => 3
  */
-function filter(collection, predicate) {
-  var func = isArray(collection) ? arrayFilter : baseFilter;
-  return func(collection, baseIteratee(predicate, 3));
+function last(array) {
+  var length = array == null ? 0 : array.length;
+  return length ? array[length - 1] : undefined;
 }
 
 /**
- * Creates a `_.find` or `_.findLast` function.
+ * The base implementation of `_.slice` without an iteratee call guard.
  *
  * @private
- * @param {Function} findIndexFunc The function to find the collection index.
- * @returns {Function} Returns the new find function.
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
  */
-function createFind(findIndexFunc) {
-  return function(collection, predicate, fromIndex) {
-    var iterable = Object(collection);
-    if (!isArrayLike(collection)) {
-      var iteratee = baseIteratee(predicate, 3);
-      collection = keys$1(collection);
-      predicate = function(key) { return iteratee(iterable[key], key, iterable); };
-    }
-    var index = findIndexFunc(collection, predicate, fromIndex);
-    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
-  };
+function baseSlice(array, start, end) {
+  var index = -1,
+      length = array.length;
+
+  if (start < 0) {
+    start = -start > length ? 0 : (length + start);
+  }
+  end = end > length ? length : end;
+  if (end < 0) {
+    end += length;
+  }
+  length = start > end ? 0 : ((end - start) >>> 0);
+  start >>>= 0;
+
+  var result = Array(length);
+  while (++index < length) {
+    result[index] = array[index + start];
+  }
+  return result;
 }
 
 /**
- * The base implementation of `_.findIndex` and `_.findLastIndex` without
- * support for iteratee shorthands.
+ * Gets the parent value at `path` of `object`.
  *
  * @private
- * @param {Array} array The array to inspect.
- * @param {Function} predicate The function invoked per iteration.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched value, else `-1`.
+ * @param {Object} object The object to query.
+ * @param {Array} path The path to get the parent value of.
+ * @returns {*} Returns the parent value.
  */
-function baseFindIndex(array, predicate, fromIndex, fromRight) {
-  var length = array.length,
-      index = fromIndex + (fromRight ? 1 : -1);
-
-  while ((fromRight ? index-- : ++index < length)) {
-    if (predicate(array[index], index, array)) {
-      return index;
-    }
-  }
-  return -1;
+function parent(object, path) {
+  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
 }
 
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
+/**
+ * The base implementation of `_.unset`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The property path to unset.
+ * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+ */
+function baseUnset(object, path) {
+  path = castPath(path, object);
+  object = parent(object, path);
+  return object == null || delete object[toKey(last(path))];
+}
 
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
+/** `Object#toString` result references. */
+var objectTag$4 = '[object Object]';
 
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+/** Used for built-in method references. */
+var funcProto$2 = Function.prototype;
+var objectProto$16 = Object.prototype;
 
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
+/** Used to resolve the decompiled source of functions. */
+var funcToString$2 = funcProto$2.toString;
 
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
+/** Used to check objects for own properties. */
+var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
 
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
+/** Used to infer the `Object` constructor. */
+var objectCtorString = funcToString$2.call(Object);
 
 /**
- * Converts `value` to a number.
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
  *
  * @static
  * @memberOf _
- * @since 4.0.0
+ * @since 0.8.0
  * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
  * @example
  *
- * _.toNumber(3.2);
- * // => 3.2
+ * function Foo() {
+ *   this.a = 1;
+ * }
  *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
+ * _.isPlainObject(new Foo);
+ * // => false
  *
- * _.toNumber(Infinity);
- * // => Infinity
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
  *
- * _.toNumber('3.2');
- * // => 3.2
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
  */
-function toNumber(value) {
-  if (typeof value == 'number') {
-    return value;
-  }
-  if (isSymbol(value)) {
-    return NAN;
-  }
-  if (isObject(value)) {
-    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
-    value = isObject(other) ? (other + '') : other;
+function isPlainObject(value) {
+  if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
+    return false;
   }
-  if (typeof value != 'string') {
-    return value === 0 ? value : +value;
+  var proto = getPrototype(value);
+  if (proto === null) {
+    return true;
   }
-  value = value.replace(reTrim, '');
-  var isBinary = reIsBinary.test(value);
-  return (isBinary || reIsOctal.test(value))
-    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
-    : (reIsBadHex.test(value) ? NAN : +value);
+  var Ctor = hasOwnProperty$13.call(proto, 'constructor') && proto.constructor;
+  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+    funcToString$2.call(Ctor) == objectCtorString;
 }
 
-/** Used as references for various `Number` constants. */
-var INFINITY$2 = 1 / 0;
-var MAX_INTEGER = 1.7976931348623157e+308;
-
 /**
- * Converts `value` to a finite number.
- *
- * @static
- * @memberOf _
- * @since 4.12.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {number} Returns the converted number.
- * @example
- *
- * _.toFinite(3.2);
- * // => 3.2
+ * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
+ * objects.
  *
- * _.toFinite(Number.MIN_VALUE);
- * // => 5e-324
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {string} key The key of the property to inspect.
+ * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
+ */
+function customOmitClone(value) {
+  return isPlainObject(value) ? undefined : value;
+}
+
+/** Built-in value references. */
+var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
+
+/**
+ * Checks if `value` is a flattenable `arguments` object or array.
  *
- * _.toFinite(Infinity);
- * // => 1.7976931348623157e+308
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+ */
+function isFlattenable(value) {
+  return isArray(value) || isArguments(value) ||
+    !!(spreadableSymbol && value && value[spreadableSymbol]);
+}
+
+/**
+ * The base implementation of `_.flatten` with support for restricting flattening.
  *
- * _.toFinite('3.2');
- * // => 3.2
+ * @private
+ * @param {Array} array The array to flatten.
+ * @param {number} depth The maximum recursion depth.
+ * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+ * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+ * @param {Array} [result=[]] The initial result value.
+ * @returns {Array} Returns the new flattened array.
  */
-function toFinite(value) {
-  if (!value) {
-    return value === 0 ? value : 0;
-  }
-  value = toNumber(value);
-  if (value === INFINITY$2 || value === -INFINITY$2) {
-    var sign = (value < 0 ? -1 : 1);
-    return sign * MAX_INTEGER;
+function baseFlatten(array, depth, predicate, isStrict, result) {
+  var index = -1,
+      length = array.length;
+
+  predicate || (predicate = isFlattenable);
+  result || (result = []);
+
+  while (++index < length) {
+    var value = array[index];
+    if (depth > 0 && predicate(value)) {
+      if (depth > 1) {
+        // Recursively flatten arrays (susceptible to call stack limits).
+        baseFlatten(value, depth - 1, predicate, isStrict, result);
+      } else {
+        arrayPush(result, value);
+      }
+    } else if (!isStrict) {
+      result[result.length] = value;
+    }
   }
-  return value === value ? value : 0;
+  return result;
 }
 
 /**
- * Converts `value` to an integer.
- *
- * **Note:** This method is loosely based on
- * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+ * Flattens `array` a single level deep.
  *
  * @static
  * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {number} Returns the converted integer.
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
  * @example
  *
- * _.toInteger(3.2);
- * // => 3
- *
- * _.toInteger(Number.MIN_VALUE);
- * // => 0
- *
- * _.toInteger(Infinity);
- * // => 1.7976931348623157e+308
- *
- * _.toInteger('3.2');
- * // => 3
+ * _.flatten([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, [3, [4]], 5]
  */
-function toInteger(value) {
-  var result = toFinite(value),
-      remainder = result % 1;
+function flatten(array) {
+  var length = array == null ? 0 : array.length;
+  return length ? baseFlatten(array, 1) : [];
+}
 
-  return result === result ? (remainder ? result - remainder : result) : 0;
+/**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
+function apply(func, thisArg, args) {
+  switch (args.length) {
+    case 0: return func.call(thisArg);
+    case 1: return func.call(thisArg, args[0]);
+    case 2: return func.call(thisArg, args[0], args[1]);
+    case 3: return func.call(thisArg, args[0], args[1], args[2]);
+  }
+  return func.apply(thisArg, args);
 }
 
 /* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax$1 = Math.max;
+var nativeMax = Math.max;
 
 /**
- * This method is like `_.find` except that it returns the index of the first
- * element `predicate` returns truthy for instead of the element itself.
- *
- * @static
- * @memberOf _
- * @since 1.1.0
- * @category Array
- * @param {Array} array The array to inspect.
- * @param {Function} [predicate=_.identity] The function invoked per iteration.
- * @param {number} [fromIndex=0] The index to search from.
- * @returns {number} Returns the index of the found element, else `-1`.
- * @example
- *
- * var users = [
- *   { 'user': 'barney',  'active': false },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': true }
- * ];
- *
- * _.findIndex(users, function(o) { return o.user == 'barney'; });
- * // => 0
- *
- * // The `_.matches` iteratee shorthand.
- * _.findIndex(users, { 'user': 'fred', 'active': false });
- * // => 1
- *
- * // The `_.matchesProperty` iteratee shorthand.
- * _.findIndex(users, ['active', false]);
- * // => 0
+ * A specialized version of `baseRest` which transforms the rest array.
  *
- * // The `_.property` iteratee shorthand.
- * _.findIndex(users, 'active');
- * // => 2
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @param {Function} transform The rest array transform.
+ * @returns {Function} Returns the new function.
  */
-function findIndex(array, predicate, fromIndex) {
-  var length = array == null ? 0 : array.length;
-  if (!length) {
-    return -1;
-  }
-  var index = fromIndex == null ? 0 : toInteger(fromIndex);
-  if (index < 0) {
-    index = nativeMax$1(length + index, 0);
-  }
-  return baseFindIndex(array, baseIteratee(predicate, 3), index);
+function overRest(func, start, transform) {
+  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+  return function() {
+    var args = arguments,
+        index = -1,
+        length = nativeMax(args.length - start, 0),
+        array = Array(length);
+
+    while (++index < length) {
+      array[index] = args[start + index];
+    }
+    index = -1;
+    var otherArgs = Array(start + 1);
+    while (++index < start) {
+      otherArgs[index] = args[index];
+    }
+    otherArgs[start] = transform(array);
+    return apply(func, this, otherArgs);
+  };
 }
 
 /**
- * Iterates over elements of `collection`, returning the first element
- * `predicate` returns truthy for. The predicate is invoked with three
- * arguments: (value, index|key, collection).
+ * Creates a function that returns `value`.
  *
  * @static
  * @memberOf _
- * @since 0.1.0
- * @category Collection
- * @param {Array|Object} collection The collection to inspect.
- * @param {Function} [predicate=_.identity] The function invoked per iteration.
- * @param {number} [fromIndex=0] The index to search from.
- * @returns {*} Returns the matched element, else `undefined`.
+ * @since 2.4.0
+ * @category Util
+ * @param {*} value The value to return from the new function.
+ * @returns {Function} Returns the new constant function.
  * @example
  *
- * var users = [
- *   { 'user': 'barney',  'age': 36, 'active': true },
- *   { 'user': 'fred',    'age': 40, 'active': false },
- *   { 'user': 'pebbles', 'age': 1,  'active': true }
- * ];
- *
- * _.find(users, function(o) { return o.age < 40; });
- * // => object for 'barney'
- *
- * // The `_.matches` iteratee shorthand.
- * _.find(users, { 'age': 1, 'active': true });
- * // => object for 'pebbles'
+ * var objects = _.times(2, _.constant({ 'a': 1 }));
  *
- * // The `_.matchesProperty` iteratee shorthand.
- * _.find(users, ['active', false]);
- * // => object for 'fred'
+ * console.log(objects);
+ * // => [{ 'a': 1 }, { 'a': 1 }]
  *
- * // The `_.property` iteratee shorthand.
- * _.find(users, 'active');
- * // => object for 'barney'
+ * console.log(objects[0] === objects[1]);
+ * // => true
  */
-var find$1 = createFind(findIndex);
+function constant$13(value) {
+  return function() {
+    return value;
+  };
+}
 
 /**
- * The base implementation of `_.map` without support for iteratee shorthands.
+ * The base implementation of `setToString` without support for hot loop shorting.
  *
  * @private
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
-function baseMap(collection, iteratee) {
-  var index = -1,
-      result = isArrayLike(collection) ? Array(collection.length) : [];
-
-  baseEach(collection, function(value, key, collection) {
-    result[++index] = iteratee(value, key, collection);
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
+ */
+var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
+  return defineProperty(func, 'toString', {
+    'configurable': true,
+    'enumerable': false,
+    'value': constant$13(string),
+    'writable': true
   });
-  return result;
-}
+};
+
+/** Used to detect hot functions by number of calls within a span of milliseconds. */
+var HOT_COUNT = 800;
+var HOT_SPAN = 16;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeNow = Date.now;
 
 /**
- * Creates an array of values by running each element in `collection` thru
- * `iteratee`. The iteratee is invoked with three arguments:
- * (value, index|key, collection).
- *
- * Many lodash methods are guarded to work as iteratees for methods like
- * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
- *
- * The guarded methods are:
- * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
- * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
- * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
- * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Collection
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- * @example
- *
- * function square(n) {
- *   return n * n;
- * }
- *
- * _.map([4, 8], square);
- * // => [16, 64]
- *
- * _.map({ 'a': 4, 'b': 8 }, square);
- * // => [16, 64] (iteration order is not guaranteed)
- *
- * var users = [
- *   { 'user': 'barney' },
- *   { 'user': 'fred' }
- * ];
+ * Creates a function that'll short out and invoke `identity` instead
+ * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+ * milliseconds.
  *
- * // The `_.property` iteratee shorthand.
- * _.map(users, 'user');
- * // => ['barney', 'fred']
+ * @private
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new shortable function.
  */
-function map$4(collection, iteratee) {
-  var func = isArray(collection) ? arrayMap : baseMap;
-  return func(collection, baseIteratee(iteratee, 3));
+function shortOut(func) {
+  var count = 0,
+      lastCalled = 0;
+
+  return function() {
+    var stamp = nativeNow(),
+        remaining = HOT_SPAN - (stamp - lastCalled);
+
+    lastCalled = stamp;
+    if (remaining > 0) {
+      if (++count >= HOT_COUNT) {
+        return arguments[0];
+      }
+    } else {
+      count = 0;
+    }
+    return func.apply(undefined, arguments);
+  };
 }
 
 /**
- * The base implementation of `_.values` and `_.valuesIn` which creates an
- * array of `object` property values corresponding to the property names
- * of `props`.
+ * Sets the `toString` method of `func` to return `string`.
  *
  * @private
- * @param {Object} object The object to query.
- * @param {Array} props The property names to get values for.
- * @returns {Object} Returns the array of property values.
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
  */
-function baseValues(object, props) {
-  return arrayMap(props, function(key) {
-    return object[key];
-  });
+var setToString = shortOut(baseSetToString);
+
+/**
+ * A specialized version of `baseRest` which flattens the rest array.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @returns {Function} Returns the new function.
+ */
+function flatRest(func) {
+  return setToString(overRest(func, undefined, flatten), func + '');
 }
 
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG$3 = 1;
+var CLONE_FLAT_FLAG$1 = 2;
+var CLONE_SYMBOLS_FLAG$2 = 4;
+
 /**
- * Creates an array of the own enumerable string keyed property values of `object`.
+ * The opposite of `_.pick`; this method creates an object composed of the
+ * own and inherited enumerable property paths of `object` that are not omitted.
  *
- * **Note:** Non-object values are coerced to objects.
+ * **Note:** This method is considerably slower than `_.pick`.
  *
  * @static
  * @since 0.1.0
  * @memberOf _
  * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property values.
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to omit.
+ * @returns {Object} Returns the new object.
  * @example
  *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.values(new Foo);
- * // => [1, 2] (iteration order is not guaranteed)
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
  *
- * _.values('hi');
- * // => ['h', 'i']
+ * _.omit(object, ['a', 'c']);
+ * // => { 'b': '2' }
  */
-function values$1(object) {
-  return object == null ? [] : baseValues(object, keys$1(object));
-}
+var omit = flatRest(function(object, paths) {
+  var result = {};
+  if (object == null) {
+    return result;
+  }
+  var isDeep = false;
+  paths = arrayMap(paths, function(path) {
+    path = castPath(path, object);
+    isDeep || (isDeep = path.length > 1);
+    return path;
+  });
+  copyObject(object, getAllKeysIn(object), result);
+  if (isDeep) {
+    result = baseClone(result, CLONE_DEEP_FLAG$3 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
+  }
+  var length = paths.length;
+  while (length--) {
+    baseUnset(result, paths[length]);
+  }
+  return result;
+});
 
 /**
- * A specialized version of `_.forEach` for arrays without support for
- * iteratee shorthands.
+ * Creates an array with all falsey values removed. The values `false`, `null`,
+ * `0`, `""`, `undefined`, and `NaN` are falsey.
  *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to compact.
+ * @returns {Array} Returns the new array of filtered values.
+ * @example
+ *
+ * _.compact([0, 1, false, 2, '', 3]);
+ * // => [1, 2, 3]
  */
-function arrayEach(array, iteratee) {
+function compact(array) {
   var index = -1,
-      length = array == null ? 0 : array.length;
+      length = array == null ? 0 : array.length,
+      resIndex = 0,
+      result = [];
 
   while (++index < length) {
-    if (iteratee(array[index], index, array) === false) {
-      break;
+    var value = array[index];
+    if (value) {
+      result[resIndex++] = value;
     }
   }
-  return array;
-}
-
-/**
- * The base implementation of `_.assign` without support for multiple sources
- * or `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
-function baseAssign(object, source) {
-  return object && copyObject(source, keys$1(source), object);
+  return result;
 }
 
 /**
- * The base implementation of `_.assignIn` without support for multiple sources
- * or `customizer` functions.
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
  *
  * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
  */
-function baseAssignIn(object, source) {
-  return object && copyObject(source, keysIn$1(source), object);
+function baseRest(func, start) {
+  return setToString(overRest(func, start, identity$8), func + '');
 }
 
-/** Detect free variable `exports`. */
-var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
-
-/** Detect free variable `module`. */
-var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
-
-/** Detect the popular CommonJS extension `module.exports`. */
-var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
-
-/** Built-in value references. */
-var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined;
-var allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
-
 /**
- * Creates a clone of  `buffer`.
+ * Checks if the given arguments are from an iteratee call.
  *
  * @private
- * @param {Buffer} buffer The buffer to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Buffer} Returns the cloned buffer.
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+ *  else `false`.
  */
-function cloneBuffer(buffer, isDeep) {
-  if (isDeep) {
-    return buffer.slice();
+function isIterateeCall(value, index, object) {
+  if (!isObject(object)) {
+    return false;
   }
-  var length = buffer.length,
-      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
-
-  buffer.copy(result);
-  return result;
+  var type = typeof index;
+  if (type == 'number'
+        ? (isArrayLike(object) && isIndex(index, object.length))
+        : (type == 'string' && index in object)
+      ) {
+    return eq(object[index], value);
+  }
+  return false;
 }
 
 /**
- * Copies the values of `source` to `array`.
+ * Creates a function like `_.assign`.
  *
  * @private
- * @param {Array} source The array to copy values from.
- * @param {Array} [array=[]] The array to copy values to.
- * @returns {Array} Returns `array`.
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
  */
-function copyArray(source, array) {
-  var index = -1,
-      length = source.length;
+function createAssigner(assigner) {
+  return baseRest(function(object, sources) {
+    var index = -1,
+        length = sources.length,
+        customizer = length > 1 ? sources[length - 1] : undefined,
+        guard = length > 2 ? sources[2] : undefined;
 
-  array || (array = Array(length));
-  while (++index < length) {
-    array[index] = source[index];
-  }
-  return array;
+    customizer = (assigner.length > 3 && typeof customizer == 'function')
+      ? (length--, customizer)
+      : undefined;
+
+    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+      customizer = length < 3 ? undefined : customizer;
+      length = 1;
+    }
+    object = Object(object);
+    while (++index < length) {
+      var source = sources[index];
+      if (source) {
+        assigner(object, source, index, customizer);
+      }
+    }
+    return object;
+  });
 }
 
 /**
- * Copies own symbols of `source` to `object`.
+ * This method is like `_.assign` except that it iterates over own and
+ * inherited source properties.
  *
- * @private
- * @param {Object} source The object to copy symbols from.
- * @param {Object} [object={}] The object to copy symbols to.
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias extend
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
  * @returns {Object} Returns `object`.
+ * @see _.assign
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ * }
+ *
+ * function Bar() {
+ *   this.c = 3;
+ * }
+ *
+ * Foo.prototype.b = 2;
+ * Bar.prototype.d = 4;
+ *
+ * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+ * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
  */
-function copySymbols(source, object) {
-  return copyObject(source, getSymbols(source), object);
-}
-
-/** Built-in value references. */
-var getPrototype = overArg(Object.getPrototypeOf, Object);
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
+var assignIn = createAssigner(function(object, source) {
+  copyObject(source, keysIn$1(source), object);
+});
 
 /**
- * Creates an array of the own and inherited enumerable symbols of `object`.
+ * The base implementation of `_.filter` without support for iteratee shorthands.
  *
  * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
  */
-var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
+function baseFilter(collection, predicate) {
   var result = [];
-  while (object) {
-    arrayPush(result, getSymbols(object));
-    object = getPrototype(object);
-  }
+  baseEach(collection, function(value, index, collection) {
+    if (predicate(value, index, collection)) {
+      result.push(value);
+    }
+  });
   return result;
-};
+}
 
 /**
- * Copies own and inherited symbols of `source` to `object`.
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
  *
- * @private
- * @param {Object} source The object to copy symbols from.
- * @param {Object} [object={}] The object to copy symbols to.
- * @returns {Object} Returns `object`.
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.reject
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney', 'age': 36, 'active': true },
+ *   { 'user': 'fred',   'age': 40, 'active': false }
+ * ];
+ *
+ * _.filter(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.filter(users, { 'age': 36, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.filter(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.filter(users, 'active');
+ * // => objects for ['barney']
  */
-function copySymbolsIn(source, object) {
-  return copyObject(source, getSymbolsIn(source), object);
+function filter(collection, predicate) {
+  var func = isArray(collection) ? arrayFilter : baseFilter;
+  return func(collection, baseIteratee(predicate, 3));
 }
 
 /**
- * Creates an array of own and inherited enumerable property names and
- * symbols of `object`.
+ * Creates a `_.find` or `_.findLast` function.
  *
  * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
+ * @param {Function} findIndexFunc The function to find the collection index.
+ * @returns {Function} Returns the new find function.
  */
-function getAllKeysIn(object) {
-  return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
+function createFind(findIndexFunc) {
+  return function(collection, predicate, fromIndex) {
+    var iterable = Object(collection);
+    if (!isArrayLike(collection)) {
+      var iteratee = baseIteratee(predicate, 3);
+      collection = keys$1(collection);
+      predicate = function(key) { return iteratee(iterable[key], key, iterable); };
+    }
+    var index = findIndexFunc(collection, predicate, fromIndex);
+    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
+  };
 }
 
-/** Used for built-in method references. */
-var objectProto$14 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
-
 /**
- * Initializes an array clone.
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for iteratee shorthands.
  *
  * @private
- * @param {Array} array The array to clone.
- * @returns {Array} Returns the initialized clone.
+ * @param {Array} array The array to inspect.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
  */
-function initCloneArray(array) {
+function baseFindIndex(array, predicate, fromIndex, fromRight) {
   var length = array.length,
-      result = array.constructor(length);
+      index = fromIndex + (fromRight ? 1 : -1);
 
-  // Add properties assigned by `RegExp#exec`.
-  if (length && typeof array[0] == 'string' && hasOwnProperty$11.call(array, 'index')) {
-    result.index = array.index;
-    result.input = array.input;
+  while ((fromRight ? index-- : ++index < length)) {
+    if (predicate(array[index], index, array)) {
+      return index;
+    }
   }
-  return result;
+  return -1;
 }
 
-/**
- * Creates a clone of `arrayBuffer`.
- *
- * @private
- * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
- * @returns {ArrayBuffer} Returns the cloned array buffer.
- */
-function cloneArrayBuffer(arrayBuffer) {
-  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
-  new Uint8Array(result).set(new Uint8Array(arrayBuffer));
-  return result;
-}
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
 
-/**
- * Creates a clone of `dataView`.
- *
- * @private
- * @param {Object} dataView The data view to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned data view.
- */
-function cloneDataView(dataView, isDeep) {
-  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
-  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
-}
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
 
 /**
- * Adds the key-value `pair` to `map`.
+ * Converts `value` to a number.
  *
- * @private
- * @param {Object} map The map to modify.
- * @param {Array} pair The key-value pair to add.
- * @returns {Object} Returns `map`.
- */
-function addMapEntry(map, pair) {
-  // Don't return `map.set` because it's not chainable in IE 11.
-  map.set(pair[0], pair[1]);
-  return map;
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
 }
 
+/** Used as references for various `Number` constants. */
+var INFINITY$2 = 1 / 0;
+var MAX_INTEGER = 1.7976931348623157e+308;
+
 /**
- * A specialized version of `_.reduce` for arrays without support for
- * iteratee shorthands.
+ * Converts `value` to a finite number.
  *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {boolean} [initAccum] Specify using the first element of `array` as
- *  the initial value.
- * @returns {*} Returns the accumulated value.
+ * @static
+ * @memberOf _
+ * @since 4.12.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted number.
+ * @example
+ *
+ * _.toFinite(3.2);
+ * // => 3.2
+ *
+ * _.toFinite(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toFinite(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toFinite('3.2');
+ * // => 3.2
  */
-function arrayReduce(array, iteratee, accumulator, initAccum) {
-  var index = -1,
-      length = array == null ? 0 : array.length;
-
-  if (initAccum && length) {
-    accumulator = array[++index];
+function toFinite(value) {
+  if (!value) {
+    return value === 0 ? value : 0;
   }
-  while (++index < length) {
-    accumulator = iteratee(accumulator, array[index], index, array);
+  value = toNumber(value);
+  if (value === INFINITY$2 || value === -INFINITY$2) {
+    var sign = (value < 0 ? -1 : 1);
+    return sign * MAX_INTEGER;
   }
-  return accumulator;
+  return value === value ? value : 0;
 }
 
-/** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG$1 = 1;
+/**
+ * Converts `value` to an integer.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toInteger(3.2);
+ * // => 3
+ *
+ * _.toInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toInteger(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toInteger('3.2');
+ * // => 3
+ */
+function toInteger(value) {
+  var result = toFinite(value),
+      remainder = result % 1;
+
+  return result === result ? (remainder ? result - remainder : result) : 0;
+}
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax$1 = Math.max;
 
 /**
- * Creates a clone of `map`.
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
  *
- * @private
- * @param {Object} map The map to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned map.
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney',  'active': false },
+ *   { 'user': 'fred',    'active': false },
+ *   { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(o) { return o.user == 'barney'; });
+ * // => 0
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findIndex(users, ['active', false]);
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findIndex(users, 'active');
+ * // => 2
  */
-function cloneMap(map, isDeep, cloneFunc) {
-  var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG$1) : mapToArray(map);
-  return arrayReduce(array, addMapEntry, new map.constructor);
+function findIndex(array, predicate, fromIndex) {
+  var length = array == null ? 0 : array.length;
+  if (!length) {
+    return -1;
+  }
+  var index = fromIndex == null ? 0 : toInteger(fromIndex);
+  if (index < 0) {
+    index = nativeMax$1(length + index, 0);
+  }
+  return baseFindIndex(array, baseIteratee(predicate, 3), index);
 }
 
-/** Used to match `RegExp` flags from their coerced string values. */
-var reFlags = /\w*$/;
+/**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney',  'age': 36, 'active': true },
+ *   { 'user': 'fred',    'age': 40, 'active': false },
+ *   { 'user': 'pebbles', 'age': 1,  'active': true }
+ * ];
+ *
+ * _.find(users, function(o) { return o.age < 40; });
+ * // => object for 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.find(users, { 'age': 1, 'active': true });
+ * // => object for 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.find(users, ['active', false]);
+ * // => object for 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.find(users, 'active');
+ * // => object for 'barney'
+ */
+var find$1 = createFind(findIndex);
 
 /**
- * Creates a clone of `regexp`.
+ * The base implementation of `_.map` without support for iteratee shorthands.
  *
  * @private
- * @param {Object} regexp The regexp to clone.
- * @returns {Object} Returns the cloned regexp.
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
  */
-function cloneRegExp(regexp) {
-  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
-  result.lastIndex = regexp.lastIndex;
+function baseMap(collection, iteratee) {
+  var index = -1,
+      result = isArrayLike(collection) ? Array(collection.length) : [];
+
+  baseEach(collection, function(value, key, collection) {
+    result[++index] = iteratee(value, key, collection);
+  });
   return result;
 }
 
 /**
- * Adds `value` to `set`.
+ * Creates an array of values by running each element in `collection` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, index|key, collection).
  *
- * @private
- * @param {Object} set The set to modify.
- * @param {*} value The value to add.
- * @returns {Object} Returns `set`.
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+ * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+ * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+ * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function square(n) {
+ *   return n * n;
+ * }
+ *
+ * _.map([4, 8], square);
+ * // => [16, 64]
+ *
+ * _.map({ 'a': 4, 'b': 8 }, square);
+ * // => [16, 64] (iteration order is not guaranteed)
+ *
+ * var users = [
+ *   { 'user': 'barney' },
+ *   { 'user': 'fred' }
+ * ];
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
  */
-function addSetEntry(set, value) {
-  // Don't return `set.add` because it's not chainable in IE 11.
-  set.add(value);
-  return set;
+function map$4(collection, iteratee) {
+  var func = isArray(collection) ? arrayMap : baseMap;
+  return func(collection, baseIteratee(iteratee, 3));
 }
 
-/** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG$2 = 1;
-
 /**
- * Creates a clone of `set`.
+ * The base implementation of `_.values` and `_.valuesIn` which creates an
+ * array of `object` property values corresponding to the property names
+ * of `props`.
  *
  * @private
- * @param {Object} set The set to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned set.
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the array of property values.
  */
-function cloneSet(set, isDeep, cloneFunc) {
-  var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG$2) : setToArray(set);
-  return arrayReduce(array, addSetEntry, new set.constructor);
+function baseValues(object, props) {
+  return arrayMap(props, function(key) {
+    return object[key];
+  });
 }
 
-/** Used to convert symbols to primitives and strings. */
-var symbolProto$2 = Symbol ? Symbol.prototype : undefined;
-var symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;
-
 /**
- * Creates a clone of the `symbol` object.
+ * Creates an array of the own enumerable string keyed property values of `object`.
  *
- * @private
- * @param {Object} symbol The symbol object to clone.
- * @returns {Object} Returns the cloned symbol object.
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
  */
-function cloneSymbol(symbol) {
-  return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};
+function values$1(object) {
+  return object == null ? [] : baseValues(object, keys$1(object));
 }
 
 /**
- * Creates a clone of `typedArray`.
+ * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
+ * of key-value pairs for `object` corresponding to the property names of `props`.
  *
  * @private
- * @param {Object} typedArray The typed array to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned typed array.
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the key-value pairs.
  */
-function cloneTypedArray(typedArray, isDeep) {
-  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
-  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+function baseToPairs(object, props) {
+  return arrayMap(props, function(key) {
+    return [key, object[key]];
+  });
 }
 
-/** `Object#toString` result references. */
-var boolTag$3 = '[object Boolean]';
-var dateTag$3 = '[object Date]';
-var mapTag$4 = '[object Map]';
-var numberTag$3 = '[object Number]';
-var regexpTag$3 = '[object RegExp]';
-var setTag$4 = '[object Set]';
-var stringTag$3 = '[object String]';
-var symbolTag$3 = '[object Symbol]';
-
-var arrayBufferTag$3 = '[object ArrayBuffer]';
-var dataViewTag$4 = '[object DataView]';
-var float32Tag$2 = '[object Float32Array]';
-var float64Tag$2 = '[object Float64Array]';
-var int8Tag$2 = '[object Int8Array]';
-var int16Tag$2 = '[object Int16Array]';
-var int32Tag$2 = '[object Int32Array]';
-var uint8Tag$2 = '[object Uint8Array]';
-var uint8ClampedTag$2 = '[object Uint8ClampedArray]';
-var uint16Tag$2 = '[object Uint16Array]';
-var uint32Tag$2 = '[object Uint32Array]';
-
 /**
- * Initializes an object clone based on its `toStringTag`.
- *
- * **Note:** This function only supports cloning values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ * Converts `set` to its value-value pairs.
  *
  * @private
- * @param {Object} object The object to clone.
- * @param {string} tag The `toStringTag` of the object to clone.
- * @param {Function} cloneFunc The function to clone values.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the initialized clone.
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the value-value pairs.
  */
-function initCloneByTag(object, tag, cloneFunc, isDeep) {
-  var Ctor = object.constructor;
-  switch (tag) {
-    case arrayBufferTag$3:
-      return cloneArrayBuffer(object);
-
-    case boolTag$3:
-    case dateTag$3:
-      return new Ctor(+object);
-
-    case dataViewTag$4:
-      return cloneDataView(object, isDeep);
-
-    case float32Tag$2: case float64Tag$2:
-    case int8Tag$2: case int16Tag$2: case int32Tag$2:
-    case uint8Tag$2: case uint8ClampedTag$2: case uint16Tag$2: case uint32Tag$2:
-      return cloneTypedArray(object, isDeep);
-
-    case mapTag$4:
-      return cloneMap(object, isDeep, cloneFunc);
-
-    case numberTag$3:
-    case stringTag$3:
-      return new Ctor(object);
-
-    case regexpTag$3:
-      return cloneRegExp(object);
-
-    case setTag$4:
-      return cloneSet(object, isDeep, cloneFunc);
+function setToPairs(set) {
+  var index = -1,
+      result = Array(set.size);
 
-    case symbolTag$3:
-      return cloneSymbol(object);
-  }
+  set.forEach(function(value) {
+    result[++index] = [value, value];
+  });
+  return result;
 }
 
-/** Built-in value references. */
-var objectCreate = Object.create;
+/** `Object#toString` result references. */
+var mapTag$5 = '[object Map]';
+var setTag$5 = '[object Set]';
 
 /**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
+ * Creates a `_.toPairs` or `_.toPairsIn` function.
  *
  * @private
- * @param {Object} proto The object to inherit from.
- * @returns {Object} Returns the new object.
+ * @param {Function} keysFunc The function to get the keys of a given object.
+ * @returns {Function} Returns the new pairs function.
  */
-var baseCreate = (function() {
-  function object() {}
-  return function(proto) {
-    if (!isObject(proto)) {
-      return {};
+function createToPairs(keysFunc) {
+  return function(object) {
+    var tag = getTag$1(object);
+    if (tag == mapTag$5) {
+      return mapToArray(object);
     }
-    if (objectCreate) {
-      return objectCreate(proto);
+    if (tag == setTag$5) {
+      return setToPairs(object);
     }
-    object.prototype = proto;
-    var result = new object;
-    object.prototype = undefined;
-    return result;
+    return baseToPairs(object, keysFunc(object));
   };
-}());
+}
 
 /**
- * Initializes an object clone.
+ * Creates an array of own enumerable string keyed-value pairs for `object`
+ * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+ * entries are returned.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @alias entries
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the key-value pairs.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.toPairs(new Foo);
+ * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+ */
+var toPairs = createToPairs(keys$1);
+
+/**
+ * The base implementation of `_.isNaN` without support for number objects.
  *
  * @private
- * @param {Object} object The object to clone.
- * @returns {Object} Returns the initialized clone.
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
  */
-function initCloneObject(object) {
-  return (typeof object.constructor == 'function' && !isPrototype(object))
-    ? baseCreate(getPrototype(object))
-    : {};
+function baseIsNaN(value) {
+  return value !== value;
 }
 
-/** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG = 1;
-var CLONE_FLAT_FLAG = 2;
-var CLONE_SYMBOLS_FLAG$1 = 4;
-
-/** `Object#toString` result references. */
-var argsTag$3 = '[object Arguments]';
-var arrayTag$2 = '[object Array]';
-var boolTag$2 = '[object Boolean]';
-var dateTag$2 = '[object Date]';
-var errorTag$2 = '[object Error]';
-var funcTag$2 = '[object Function]';
-var genTag$1 = '[object GeneratorFunction]';
-var mapTag$3 = '[object Map]';
-var numberTag$2 = '[object Number]';
-var objectTag$3 = '[object Object]';
-var regexpTag$2 = '[object RegExp]';
-var setTag$3 = '[object Set]';
-var stringTag$2 = '[object String]';
-var symbolTag$2 = '[object Symbol]';
-var weakMapTag$2 = '[object WeakMap]';
-
-var arrayBufferTag$2 = '[object ArrayBuffer]';
-var dataViewTag$3 = '[object DataView]';
-var float32Tag$1 = '[object Float32Array]';
-var float64Tag$1 = '[object Float64Array]';
-var int8Tag$1 = '[object Int8Array]';
-var int16Tag$1 = '[object Int16Array]';
-var int32Tag$1 = '[object Int32Array]';
-var uint8Tag$1 = '[object Uint8Array]';
-var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
-var uint16Tag$1 = '[object Uint16Array]';
-var uint32Tag$1 = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values supported by `_.clone`. */
-var cloneableTags = {};
-cloneableTags[argsTag$3] = cloneableTags[arrayTag$2] =
-cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
-cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
-cloneableTags[float32Tag$1] = cloneableTags[float64Tag$1] =
-cloneableTags[int8Tag$1] = cloneableTags[int16Tag$1] =
-cloneableTags[int32Tag$1] = cloneableTags[mapTag$3] =
-cloneableTags[numberTag$2] = cloneableTags[objectTag$3] =
-cloneableTags[regexpTag$2] = cloneableTags[setTag$3] =
-cloneableTags[stringTag$2] = cloneableTags[symbolTag$2] =
-cloneableTags[uint8Tag$1] = cloneableTags[uint8ClampedTag$1] =
-cloneableTags[uint16Tag$1] = cloneableTags[uint32Tag$1] = true;
-cloneableTags[errorTag$2] = cloneableTags[funcTag$2] =
-cloneableTags[weakMapTag$2] = false;
-
-/**
- * The base implementation of `_.clone` and `_.cloneDeep` which tracks
- * traversed objects.
- *
- * @private
- * @param {*} value The value to clone.
- * @param {boolean} bitmask The bitmask flags.
- *  1 - Deep clone
- *  2 - Flatten inherited properties
- *  4 - Clone symbols
- * @param {Function} [customizer] The function to customize cloning.
- * @param {string} [key] The key of `value`.
- * @param {Object} [object] The parent object of `value`.
- * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
- * @returns {*} Returns the cloned value.
- */
-function baseClone(value, bitmask, customizer, key, object, stack) {
-  var result,
-      isDeep = bitmask & CLONE_DEEP_FLAG,
-      isFlat = bitmask & CLONE_FLAT_FLAG,
-      isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
-
-  if (customizer) {
-    result = object ? customizer(value, key, object, stack) : customizer(value);
-  }
-  if (result !== undefined) {
-    return result;
-  }
-  if (!isObject(value)) {
-    return value;
-  }
-  var isArr = isArray(value);
-  if (isArr) {
-    result = initCloneArray(value);
-    if (!isDeep) {
-      return copyArray(value, result);
-    }
-  } else {
-    var tag = getTag$1(value),
-        isFunc = tag == funcTag$2 || tag == genTag$1;
-
-    if (isBuffer(value)) {
-      return cloneBuffer(value, isDeep);
-    }
-    if (tag == objectTag$3 || tag == argsTag$3 || (isFunc && !object)) {
-      result = (isFlat || isFunc) ? {} : initCloneObject(value);
-      if (!isDeep) {
-        return isFlat
-          ? copySymbolsIn(value, baseAssignIn(result, value))
-          : copySymbols(value, baseAssign(result, value));
-      }
-    } else {
-      if (!cloneableTags[tag]) {
-        return object ? value : {};
-      }
-      result = initCloneByTag(value, tag, baseClone, isDeep);
-    }
-  }
-  // Check for circular references and return its corresponding clone.
-  stack || (stack = new Stack);
-  var stacked = stack.get(value);
-  if (stacked) {
-    return stacked;
-  }
-  stack.set(value, result);
-
-  var keysFunc = isFull
-    ? (isFlat ? getAllKeysIn : getAllKeys)
-    : (isFlat ? keysIn : keys$1);
-
-  var props = isArr ? undefined : keysFunc(value);
-  arrayEach(props || value, function(subValue, key) {
-    if (props) {
-      key = subValue;
-      subValue = value[key];
-    }
-    // Recursively populate clone (susceptible to call stack limits).
-    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
-  });
-  return result;
-}
-
-/** Used to compose bitmasks for cloning. */
-var CLONE_SYMBOLS_FLAG = 4;
-
-/**
- * Creates a shallow clone of `value`.
- *
- * **Note:** This method is loosely based on the
- * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
- * and supports cloning arrays, array buffers, booleans, date objects, maps,
- * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
- * arrays. The own enumerable properties of `arguments` objects are cloned
- * as plain objects. An empty object is returned for uncloneable values such
- * as error objects, functions, DOM nodes, and WeakMaps.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to clone.
- * @returns {*} Returns the cloned value.
- * @see _.cloneDeep
- * @example
- *
- * var objects = [{ 'a': 1 }, { 'b': 2 }];
- *
- * var shallow = _.clone(objects);
- * console.log(shallow[0] === objects[0]);
- * // => true
- */
-function clone(value) {
-  return baseClone(value, CLONE_SYMBOLS_FLAG);
-}
-
-/**
- * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
- * of key-value pairs for `object` corresponding to the property names of `props`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} props The property names to get values for.
- * @returns {Object} Returns the key-value pairs.
- */
-function baseToPairs(object, props) {
-  return arrayMap(props, function(key) {
-    return [key, object[key]];
-  });
-}
-
-/**
- * Converts `set` to its value-value pairs.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the value-value pairs.
- */
-function setToPairs(set) {
-  var index = -1,
-      result = Array(set.size);
-
-  set.forEach(function(value) {
-    result[++index] = [value, value];
-  });
-  return result;
-}
-
-/** `Object#toString` result references. */
-var mapTag$5 = '[object Map]';
-var setTag$5 = '[object Set]';
-
-/**
- * Creates a `_.toPairs` or `_.toPairsIn` function.
- *
- * @private
- * @param {Function} keysFunc The function to get the keys of a given object.
- * @returns {Function} Returns the new pairs function.
- */
-function createToPairs(keysFunc) {
-  return function(object) {
-    var tag = getTag$1(object);
-    if (tag == mapTag$5) {
-      return mapToArray(object);
-    }
-    if (tag == setTag$5) {
-      return setToPairs(object);
-    }
-    return baseToPairs(object, keysFunc(object));
-  };
-}
-
-/**
- * Creates an array of own enumerable string keyed-value pairs for `object`
- * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
- * entries are returned.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @alias entries
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the key-value pairs.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.toPairs(new Foo);
- * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
- */
-var toPairs = createToPairs(keys$1);
-
-/** Built-in value references. */
-var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
-
-/**
- * Checks if `value` is a flattenable `arguments` object or array.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
- */
-function isFlattenable(value) {
-  return isArray(value) || isArguments(value) ||
-    !!(spreadableSymbol && value && value[spreadableSymbol]);
-}
-
-/**
- * The base implementation of `_.flatten` with support for restricting flattening.
- *
- * @private
- * @param {Array} array The array to flatten.
- * @param {number} depth The maximum recursion depth.
- * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
- * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
- * @param {Array} [result=[]] The initial result value.
- * @returns {Array} Returns the new flattened array.
- */
-function baseFlatten(array, depth, predicate, isStrict, result) {
-  var index = -1,
-      length = array.length;
-
-  predicate || (predicate = isFlattenable);
-  result || (result = []);
-
-  while (++index < length) {
-    var value = array[index];
-    if (depth > 0 && predicate(value)) {
-      if (depth > 1) {
-        // Recursively flatten arrays (susceptible to call stack limits).
-        baseFlatten(value, depth - 1, predicate, isStrict, result);
-      } else {
-        arrayPush(result, value);
-      }
-    } else if (!isStrict) {
-      result[result.length] = value;
-    }
-  }
-  return result;
-}
-
-/**
- * The base implementation of `_.isNaN` without support for number objects.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
- */
-function baseIsNaN(value) {
-  return value !== value;
-}
-
-/**
- * A specialized version of `_.indexOf` which performs strict equality
- * comparisons of values, i.e. `===`.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} value The value to search for.
- * @param {number} fromIndex The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
-function strictIndexOf(array, value, fromIndex) {
-  var index = fromIndex - 1,
-      length = array.length;
+/**
+ * A specialized version of `_.indexOf` which performs strict equality
+ * comparisons of values, i.e. `===`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function strictIndexOf(array, value, fromIndex) {
+  var index = fromIndex - 1,
+      length = array.length;
 
   while (++index < length) {
     if (array[index] === value) {
@@ -21684,10 +22158,10 @@ var osmOneWayTags = {
         'yes': true
     },
     'highway': {
-        'motorway': true,
-        'motorway_link': true
+        'motorway': true
     },
     'junction': {
+        'circular': true,
         'roundabout': true
     },
     'man_made': {
@@ -21721,7 +22195,7 @@ var osmPavedTags = {
     }
 };
 
-var wikipedia$1 = [
+var wikipedia = [
     [
         "Abkhazian",
         "Аҧсшәа",
@@ -23144,19 +23618,19 @@ var wikipedia$1 = [
     ]
 ];
 
-var wikipedia$2 = Object.freeze({
-       default: wikipedia$1
+var wikipedia$1 = Object.freeze({
+       default: wikipedia
 });
 
-var require$$6 = ( wikipedia$2 && wikipedia$1 ) || wikipedia$2;
+var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
 
-var wikipedia = require$$6;
+var wikipedia$2 = require$$6;
 
-var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Shop":{"count":180},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Consultorio Dental":{"count":187},"Dentista":{"count":109},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Food Court":{"count":72},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco":{"count":82},"Costco Gas":{"count":62},"Costco Gasoline":{"count":59},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"GNV":{"count":58},"Gas":{"count":66},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jardin Infantil":{"count":85},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca Municipal":{"count":451},"Biblioteca Pública":{"count":66},"Biblioteca Pública Municipal":{"count":85},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Farmácia":{"count":85},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Belvedere":{"count":55},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Food Court":{"count":52},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Steak House":{"count":58},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Escola Estadual":{"count":73},"Escola Municipal":{"count":211},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Anfiteatro":{"count":94},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56},"Teatro Municipal":{"count":94}},"veterinary":{"Clinica Veterinaria":{"count":75},"Veterinaria":{"count":153}}};
-var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Polideportivo":{"count":248},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
+var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco":{"count":82},"Costco Gas":{"count":62},"Costco Gasoline":{"count":59},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Steak House":{"count":58},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56}}};
+var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
 var man_made = {"windmill":{"De Hoop":{"count":57}}};
-var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Panaderia":{"count":615},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Coffee Shop":{"count":71},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino":{"count":91},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kiosco":{"count":74},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimarket":{"count":255},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"Funeraria":{"count":51},"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Barbershop":{"count":51},"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon":{"count":57},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"ice_cream":{"Мороженое":{"count":51}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosco":{"count":203},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Мороженое":{"count":56},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65},"Kitchen":{"count":202},"kitchen":{"count":101}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket":{"count":122},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optica":{"count":159},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Stadium":{"count":53},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Casino":{"count":337},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado":{"count":63},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minimarket":{"count":69},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"tattoo":{"Tattoo":{"count":73}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Vulcanizing Shop":{"count":54},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
-var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Lavoir":{"count":109},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path continues":{"count":71},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80},"Campsite":{"count":70}},"guest_house":{"Casa":{"count":61},"Guest House":{"count":64},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel":{"count":105},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Museum":{"count":51},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
+var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"ice_cream":{"Мороженое":{"count":51}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Мороженое":{"count":56},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
+var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80}},"guest_house":{"Casa":{"count":61},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
 var dataSuggestions = {
        amenity: amenity,
        leisure: leisure,
@@ -23165,17 +23639,17 @@ var dataSuggestions = {
        tourism: tourism
 };
 
-var dataAddressFormats = [{"format":[["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street","unit"],["city"],["postcode"]]},{"countryCodes":["at","ch","de"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","si","sk","sm","va"],"format":[["unit","street","housenumber"],["postcode","city"]]},{"countryCodes":["pl"],"format":[["street","housenumber"],["postcode"],["place","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["unit","housenumber","street"],["postcode","city"]]},{"countryCodes":["br"],"format":[["street"],["housenumber","suburb"],["city","postcode"]]},{"countryCodes":["vn"],"format":[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{"countryCodes":["au","ca"],"format":[["housenumber","street","unit"],["city","province","postcode"]]},{"countryCodes":["us"],"format":[["housenumber","street","unit"],["city","state","postcode"]]},{"countryCodes":["tw"],"format":[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{"countryCodes":["jp"],"format":[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],"dropdowns":["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],"widths":{"postcode":0.3,"province":0.35,"county":0.35,"city":0.65,"suburb":0.35,"quarter":0.5,"neighbourhood":0.5,"block_number":0.5,"housenumber":0.5}},{"countryCodes":["tr"],"format":[["neighbourhood"],["street","housenumber","unit"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street","unit"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
+var dataAddressFormats = [{"format":[["housenumber","street"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street"],["city"],["postcode"]]},{"countryCodes":["at","ch","de","si"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],"format":[["street","housenumber","unit"],["postcode","city"]]},{"countryCodes":["pl"],"format":[["street","housenumber"],["postcode"],["place","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["housenumber","street"],["postcode","city"]]},{"countryCodes":["br"],"format":[["street"],["housenumber","suburb"],["city","postcode"]]},{"countryCodes":["vn"],"format":[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{"countryCodes":["au","ca"],"format":[["housenumber","street","unit"],["city","province","postcode"]]},{"countryCodes":["us"],"format":[["housenumber","street","unit"],["city","state","postcode"]]},{"countryCodes":["tw"],"format":[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{"countryCodes":["jp"],"format":[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],"dropdowns":["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],"widths":{"postcode":0.3,"province":0.35,"county":0.35,"city":0.65,"suburb":0.35,"quarter":0.5,"neighbourhood":0.5,"block_number":0.5,"housenumber":0.5}},{"countryCodes":["tr"],"format":[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
 
 var dataDeprecated = [{"old":{"amenity":"firepit"},"replace":{"leisure":"firepit"}},{"old":{"barrier":"wire_fence"},"replace":{"barrier":"fence","fence_type":"chain"}},{"old":{"barrier":"wood_fence"},"replace":{"barrier":"fence","fence_type":"wood"}},{"old":{"highway":"ford"},"replace":{"ford":"yes"}},{"old":{"highway":"stile"},"replace":{"barrier":"stile"}},{"old":{"highway":"incline"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"incline_steep"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"unsurfaced"},"replace":{"highway":"road","incline":"unpaved"}},{"old":{"landuse":"wood"},"replace":{"landuse":"forest","natural":"wood"}},{"old":{"natural":"marsh"},"replace":{"natural":"wetland","wetland":"marsh"}},{"old":{"power_source":"*"},"replace":{"generator:source":"$1"}},{"old":{"power_rating":"*"},"replace":{"generator:output":"$1"}},{"old":{"shop":"organic"},"replace":{"shop":"supermarket","organic":"only"}}];
 
 var dataDiscarded = ["created_by","odbl","odbl:note","tiger:upload_uuid","tiger:tlid","tiger:source","tiger:separated","geobase:datasetName","geobase:uuid","sub_sea:type","KSJ2:ADS","KSJ2:ARE","KSJ2:AdminArea","KSJ2:COP_label","KSJ2:DFD","KSJ2:INT","KSJ2:INT_label","KSJ2:LOC","KSJ2:LPN","KSJ2:OPC","KSJ2:PubFacAdmin","KSJ2:RAC","KSJ2:RAC_label","KSJ2:RIC","KSJ2:RIN","KSJ2:WSC","KSJ2:coordinate","KSJ2:curve_id","KSJ2:curve_type","KSJ2:filename","KSJ2:lake_id","KSJ2:lat","KSJ2:long","KSJ2:river_id","yh:LINE_NAME","yh:LINE_NUM","yh:STRUCTURE","yh:TOTYUMONO","yh:TYPE","yh:WIDTH","yh:WIDTH_RANK","SK53_bulk:load"];
 
-var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"eu":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":true},"lij":{"rtl":false},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
+var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"be":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"cy":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"eu":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":true},"lij":{"rtl":false},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
 
 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567","at":"+43 1 123 45 67","ci":"+225 20 12 34 56","bj":"+229 20 12 34 56"};
 
-var dataShortcuts = [{"tab":"browsing","text":"shortcuts.browsing.title","columns":[{"rows":[{"section":"navigation","text":"shortcuts.browsing.navigation.title"},{"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan","separator":","},{"modifiers":["⌘"],"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan_more","separator":","},{"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom","separator":","},{"modifiers":["⌘"],"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom_more","separator":","},{"section":"help","text":"shortcuts.browsing.help.title"},{"shortcuts":["help.key"],"text":"shortcuts.browsing.help.help"},{"shortcuts":["shortcuts.toggle.key"],"text":"shortcuts.browsing.help.keyboard"},{"section":"display_options","text":"shortcuts.browsing.display_options.title"},{"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background"},{"modifiers":["⌘"],"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background_switch"},{"shortcuts":["map_data.key"],"text":"shortcuts.browsing.display_options.map_data"},{"modifiers":["⌃","⌘"],"shortcuts":["F","F11"],"text":"shortcuts.browsing.display_options.fullscreen"},{"shortcuts":["area_fill.wireframe.key"],"text":"shortcuts.browsing.display_options.wireframe"},{"shortcuts":["background.minimap.key"],"text":"shortcuts.browsing.display_options.minimap"}]},{"rows":[{"section":"selecting","text":"shortcuts.browsing.selecting.title"},{"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_one"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_multi"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"gesture":"shortcuts.gesture.drag","text":"shortcuts.browsing.selecting.lasso"},{"shortcuts":[],"text":""},{"section":"with_selected","text":"shortcuts.browsing.with_selected.title"},{"shortcuts":["Right-click","shortcuts.key.space"],"text":"shortcuts.browsing.with_selected.edit_menu"},{"shortcuts":[],"text":""},{"section":"vertex_selected","text":"shortcuts.browsing.vertex_selected.title"},{"shortcuts":["[","↖"],"text":"shortcuts.browsing.vertex_selected.previous"},{"shortcuts":["]","↘"],"text":"shortcuts.browsing.vertex_selected.next"},{"shortcuts":["{","⇞"],"text":"shortcuts.browsing.vertex_selected.first"},{"shortcuts":["}","⇟"],"text":"shortcuts.browsing.vertex_selected.last"},{"shortcuts":["\\","shortcuts.key.pause"],"text":"shortcuts.browsing.vertex_selected.change_parent"}]}]},{"tab":"editing","text":"shortcuts.editing.title","columns":[{"rows":[{"section":"drawing","text":"shortcuts.editing.drawing.title"},{"shortcuts":["1"],"text":"shortcuts.editing.drawing.add_point"},{"shortcuts":["2"],"text":"shortcuts.editing.drawing.add_line"},{"shortcuts":["3"],"text":"shortcuts.editing.drawing.add_area"},{"shortcuts":["Left-click","shortcuts.key.space"],"text":"shortcuts.editing.drawing.place_point"},{"shortcuts":["⌥"],"text":"shortcuts.editing.drawing.disable_snap"},{"shortcuts":["↵","⎋"],"text":"shortcuts.editing.drawing.stop_line"},{"section":"commands","text":"shortcuts.editing.commands.title"},{"modifiers":["⌘"],"shortcuts":["C"],"text":"shortcuts.editing.commands.copy"},{"modifiers":["⌘"],"shortcuts":["V"],"text":"shortcuts.editing.commands.paste"},{"modifiers":["⌘"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.undo"},{"modifiers":["⌘","⇧"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.redo"},{"modifiers":["⌘"],"shortcuts":["S"],"text":"shortcuts.editing.commands.save"}]},{"rows":[{"section":"operations","text":"shortcuts.editing.operations.title"},{"shortcuts":["operations.continue.key"],"text":"shortcuts.editing.operations.continue_line"},{"shortcuts":["operations.merge.key"],"text":"shortcuts.editing.operations.merge"},{"shortcuts":["operations.disconnect.key"],"text":"shortcuts.editing.operations.disconnect"},{"shortcuts":["operations.split.key"],"text":"shortcuts.editing.operations.split"},{"shortcuts":["operations.reverse.key"],"text":"shortcuts.editing.operations.reverse"},{"shortcuts":["operations.move.key"],"text":"shortcuts.editing.operations.move"},{"shortcuts":["operations.rotate.key"],"text":"shortcuts.editing.operations.rotate"},{"shortcuts":["operations.orthogonalize.key"],"text":"shortcuts.editing.operations.orthogonalize"},{"shortcuts":["operations.circularize.key"],"text":"shortcuts.editing.operations.circularize"},{"shortcuts":["operations.reflect.key.long"],"text":"shortcuts.editing.operations.reflect_long"},{"shortcuts":["operations.reflect.key.short"],"text":"shortcuts.editing.operations.reflect_short"},{"modifiers":["⌘"],"shortcuts":["⌫"],"text":"shortcuts.editing.operations.delete"}]}]},{"tab":"tools","text":"shortcuts.tools.title","columns":[{"rows":[{"section":"info","text":"shortcuts.tools.info.title"},{"modifiers":["⌘"],"shortcuts":["info_panels.key"],"text":"shortcuts.tools.info.all"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.background.key"],"text":"shortcuts.tools.info.background"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.history.key"],"text":"shortcuts.tools.info.history"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.location.key"],"text":"shortcuts.tools.info.location"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.measurement.key"],"text":"shortcuts.tools.info.measurement"}]}]}];
+var dataShortcuts = [{"tab":"browsing","text":"shortcuts.browsing.title","columns":[{"rows":[{"section":"navigation","text":"shortcuts.browsing.navigation.title"},{"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan","separator":","},{"modifiers":["⌘"],"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan_more","separator":","},{"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom","separator":","},{"modifiers":["⌘"],"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom_more","separator":","},{"section":"help","text":"shortcuts.browsing.help.title"},{"shortcuts":["help.key"],"text":"shortcuts.browsing.help.help"},{"shortcuts":["shortcuts.toggle.key"],"text":"shortcuts.browsing.help.keyboard"},{"section":"display_options","text":"shortcuts.browsing.display_options.title"},{"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background"},{"modifiers":["⌘"],"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background_switch"},{"shortcuts":["map_data.key"],"text":"shortcuts.browsing.display_options.map_data"},{"modifiers":["⌃","⌘"],"shortcuts":["F","F11"],"text":"shortcuts.browsing.display_options.fullscreen"},{"shortcuts":["area_fill.wireframe.key"],"text":"shortcuts.browsing.display_options.wireframe"},{"shortcuts":["background.minimap.key"],"text":"shortcuts.browsing.display_options.minimap"}]},{"rows":[{"section":"selecting","text":"shortcuts.browsing.selecting.title"},{"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_one"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_multi"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"gesture":"shortcuts.gesture.drag","text":"shortcuts.browsing.selecting.lasso"},{"modifiers":["⌘"],"shortcuts":["F"],"text":"shortcuts.browsing.selecting.search"},{"section":"with_selected","text":"shortcuts.browsing.with_selected.title"},{"shortcuts":["Right-click","shortcuts.key.space"],"text":"shortcuts.browsing.with_selected.edit_menu"},{"shortcuts":[],"text":""},{"section":"vertex_selected","text":"shortcuts.browsing.vertex_selected.title"},{"shortcuts":["[","↖"],"text":"shortcuts.browsing.vertex_selected.previous"},{"shortcuts":["]","↘"],"text":"shortcuts.browsing.vertex_selected.next"},{"shortcuts":["{","⇞"],"text":"shortcuts.browsing.vertex_selected.first"},{"shortcuts":["}","⇟"],"text":"shortcuts.browsing.vertex_selected.last"},{"shortcuts":["\\","shortcuts.key.pause"],"text":"shortcuts.browsing.vertex_selected.change_parent"}]}]},{"tab":"editing","text":"shortcuts.editing.title","columns":[{"rows":[{"section":"drawing","text":"shortcuts.editing.drawing.title"},{"shortcuts":["1"],"text":"shortcuts.editing.drawing.add_point"},{"shortcuts":["2"],"text":"shortcuts.editing.drawing.add_line"},{"shortcuts":["3"],"text":"shortcuts.editing.drawing.add_area"},{"shortcuts":["Left-click","shortcuts.key.space"],"text":"shortcuts.editing.drawing.place_point"},{"shortcuts":["⌥"],"text":"shortcuts.editing.drawing.disable_snap"},{"shortcuts":["↵","⎋"],"text":"shortcuts.editing.drawing.stop_line"},{"section":"commands","text":"shortcuts.editing.commands.title"},{"modifiers":["⌘"],"shortcuts":["C"],"text":"shortcuts.editing.commands.copy"},{"modifiers":["⌘"],"shortcuts":["V"],"text":"shortcuts.editing.commands.paste"},{"modifiers":["⌘"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.undo"},{"modifiers":["⌘","⇧"],"shortcuts":["Z"],"text":"shortcuts.editing.commands.redo"},{"modifiers":["⌘"],"shortcuts":["S"],"text":"shortcuts.editing.commands.save"}]},{"rows":[{"section":"operations","text":"shortcuts.editing.operations.title"},{"shortcuts":["operations.continue.key"],"text":"shortcuts.editing.operations.continue_line"},{"shortcuts":["operations.merge.key"],"text":"shortcuts.editing.operations.merge"},{"shortcuts":["operations.disconnect.key"],"text":"shortcuts.editing.operations.disconnect"},{"shortcuts":["operations.split.key"],"text":"shortcuts.editing.operations.split"},{"shortcuts":["operations.reverse.key"],"text":"shortcuts.editing.operations.reverse"},{"shortcuts":["operations.move.key"],"text":"shortcuts.editing.operations.move"},{"shortcuts":["operations.rotate.key"],"text":"shortcuts.editing.operations.rotate"},{"shortcuts":["operations.orthogonalize.key"],"text":"shortcuts.editing.operations.orthogonalize"},{"shortcuts":["operations.circularize.key"],"text":"shortcuts.editing.operations.circularize"},{"shortcuts":["operations.reflect.key.long"],"text":"shortcuts.editing.operations.reflect_long"},{"shortcuts":["operations.reflect.key.short"],"text":"shortcuts.editing.operations.reflect_short"},{"modifiers":["⌘"],"shortcuts":["⌫"],"text":"shortcuts.editing.operations.delete"}]}]},{"tab":"tools","text":"shortcuts.tools.title","columns":[{"rows":[{"section":"info","text":"shortcuts.tools.info.title"},{"modifiers":["⌘"],"shortcuts":["info_panels.key"],"text":"shortcuts.tools.info.all"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.background.key"],"text":"shortcuts.tools.info.background"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.history.key"],"text":"shortcuts.tools.info.history"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.location.key"],"text":"shortcuts.tools.info.location"},{"modifiers":["⌘","⇧"],"shortcuts":["info_panels.measurement.key"],"text":"shortcuts.tools.info.measurement"}]}]}];
 
 var type$2 = "FeatureCollection";
 var features = [{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[180,55],[170,53],[180,49],[180,55]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
@@ -23191,17 +23665,17 @@ var dataDriveLeft = {
        features: features$1
 };
 
-var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","request_review":"I would like someone to review my edits.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","download_changes":"Download osmChange file","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"http://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","source":"Source","description":"Description","resolution":"Resolution","accuracy":"Accuracy","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles","show_vintage":"Show Vintage","hide_vintage":"Hide Vintage"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed":"closed","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","percent_brightness":"{opacity}% brightness","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}","fix_misalignment":"Adjust imagery offset","imagery_source_faq":"Where does this imagery come from?","reset":"reset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.","minimap":{"description":"Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"}},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","layers":{"osm":{"tooltip":"Map data from OpenStreetMap","title":"OpenStreetMap data"}},"fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.","osmhidden":"These features have been automatically hidden because the OpenStreetMap layer is hidden."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"restore":{"heading":"You have unsaved changes","description":"Do you wish to restore unsaved changes from a previous editing session?","restore":"Restore my changes","reset":"Discard my changes"},"save":{"title":"Save","help":"Review your changes and upload them to OpenStreetMap, making them visible to other users.","no_changes":"No changes to save.","error":"Errors occurred while trying to save","status_code":"Server returned status code {code}","unknown_error_details":"Please ensure you are connected to the internet.","uploading":"Uploading changes to OpenStreetMap...","unsaved_changes":"You have unsaved changes","conflict":{"header":"Resolve conflicting edits","count":"Conflict {num} of {total}","previous":"< Previous","next":"Next >","keep_local":"Keep mine","keep_remote":"Use theirs","restore":"Restore","delete":"Leave Deleted","download_changes":"Or download osmChange file","done":"All conflicts resolved!","help":"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},"merge_remote_changes":{"conflict":{"deleted":"This feature has been deleted by {user}.","location":"This feature was moved by both you and {user}.","nodelist":"Nodes were changed by both you and {user}.","memberlist":"Relation members were changed by both you and {user}.","tags":"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},"success":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","help_link_text":"Details","help_link_url":"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom in","out":"Zoom out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"mapillary_images":{"tooltip":"Street-level photos from Mapillary","title":"Photo Overlay (Mapillary)"},"mapillary_signs":{"tooltip":"Traffic signs from Mapillary (must enable Photo Overlay)","title":"Traffic Sign Overlay (Mapillary)"},"mapillary":{"view_on_mapillary":"View this image on Mapillary"},"openstreetcam_images":{"tooltip":"Street-level photos from OpenStreetCam","title":"Photo Overlay (OpenStreetCam)"},"openstreetcam":{"view_on_openstreetcam":"View this image on OpenStreetCam"},"help":{"title":"Help","key":"H","help":"# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n","editing_saving":"# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n","roads":"# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n","gps":"# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n","imagery":"# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n","addresses":"# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n","inspector":"# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n","buildings":"# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n","relations":"# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"},"intro":{"done":"done","ok":"OK","graph":{"block_number":"<value for addr:block_number>","city":"Three Rivers","county":"<value for addr:county>","district":"<value for addr:district>","hamlet":"<value for addr:hamlet>","neighbourhood":"<value for addr:neighbourhood>","postcode":"49093","province":"<value for addr:province>","quarter":"<value for addr:quarter>","state":"MI","subdistrict":"<value for addr:subdistrict>","suburb":"<value for addr:suburb>","countrycode":"us","name":{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},"welcome":{"title":"Welcome","welcome":"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.","practice":"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.","words":"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.","mouse":"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**","leftclick":"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**","rightclick":"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**","chapters":"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},"navigation":{"title":"Navigation","drag":"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**","zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**","features":"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.","points_lines_areas":"Map features are represented using *points, lines, or areas.*","nodes_ways":"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.","click_townhall":"All features on the map can be selected by clicking on them. **Click on the point to select it.**","selected_townhall":"Great! The point is now selected. Selected features are drawn with a pulsing glow.","editor_townhall":"When a feature is selected, the *feature editor* is displayed alongside the map.","preset_townhall":"The top part of the feature editor shows the feature's type. This point is a {preset}.","fields_townhall":"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.","close_townhall":"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**","search_street":"You can also search for features in the current view, or worldwide. **Search for '{name}'.**","choose_street":"**Choose {name} from the list to select it.**","selected_street":"Great! {name} is now selected.","editor_street":"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**","play":"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"points":{"title":"Points","add_point":"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**","place_point":"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**","search_cafe":"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**","choose_cafe":"**Choose {preset} from the list.**","feature_editor":"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.","add_name":"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**","add_close":"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**","reselect":"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**","update":"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**","update_close":"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**","rightclick":"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**","undo":"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**","play":"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},"areas":{"title":"Areas","add_playground":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","disable_snap":"Hold to disable point snapping","stop_line":"Finish drawing a line or area"},"operations":{"title":"Operations","continue_line":"Continue a line at the selected node","merge":"Combine (merge) selected features","disconnect":"Disconnect features at the selected node","split":"Split a line into two at the selected node","reverse":"Reverse a line","move":"Move selected features","rotate":"Rotate selected features","orthogonalize":"Straighten line / Square area corners","circularize":"Circularize a closed line or area","reflect_long":"Reflect features across the longer axis","reflect_short":"Reflect features across the shorter axis","delete":"Delete selected features"},"commands":{"title":"Commands","copy":"Copy selected features","paste":"Paste copied features","undo":"Undo last action","redo":"Redo last action","save":"Save changes"}},"tools":{"title":"Tools","info":{"title":"Information","all":"Toggle all information panels","background":"Toggle background panel","history":"Toggle history panel","location":"Toggle location panel","measurement":"Toggle measurement panel"}}},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"address":{"label":"Address","placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}},"admin_level":{"label":"Admin Level"},"aerialway":{"label":"Type"},"aerialway/access":{"label":"Access","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aerialway/bubble":{"label":"Bubble"},"aerialway/capacity":{"label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"label":"Heated"},"aerialway/occupancy":{"label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"label":"Access (summer)","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aeroway":{"label":"Type"},"agrarian":{"label":"Products"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boules":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"cables":{"label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"label":"Camera Mount"},"camera/type":{"label":"Camera Type","options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}},"capacity":{"label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"label":"Direction","options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}},"castle_type":{"label":"Type"},"clock_direction":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"comment":{"label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Content"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crane/type":{"label":"Crane Type","options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cutting":{"label":"Type","placeholder":"Default"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"devices":{"label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"label":"Diaper Changing Available"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"duration":{"label":"Duration","placeholder":"00:00"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"embankment":{"label":"Type","placeholder":"Default"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fitness_station":{"label":"Equipment Type"},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"frequency":{"label":"Operating Frequency"},"fuel_multi":{"label":"Fuel Types"},"fuel":{"label":"Fuel"},"gauge":{"label":"Gauge"},"gender":{"label":"Gender","placeholder":"Unknown","options":{"male":"Male","female":"Female","unisex":"Unisex"}},"generator/method":{"label":"Method"},"generator/output/electricity":{"label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"label":"Source"},"generator/type":{"label":"Type"},"government":{"label":"Type"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"hashtags":{"label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"label":"Type"},"healthcare/speciality":{"label":"Specialties"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"intermittent":{"label":"Intermittent"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"memorial":{"label":"Type"},"milestone_position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"mtb/scale":{"label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{"label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{"label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},"name":{"label":"Name","placeholder":"Common name (if any)"},"natural":{"label":"Natural"},"network_bicycle":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}},"network_foot":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}},"network_horse":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}},"network_road":{"label":"Network"},"network":{"label":"Network"},"note":{"label":"Note"},"office":{"label":"Type"},"oneway_yes":{"label":"One Way","options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward"}},"park_ride":{"label":"Park and Ride"},"parking":{"label":"Type","options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}},"payment_multi":{"label":"Payment Types"},"phases":{"label":"Phases","placeholder":"1, 2, 3..."},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"plant/output/electricity":{"label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"label":"Baby Seat"},"playground/max_age":{"label":"Maximum Age"},"playground/min_age":{"label":"Minimum Age"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"rating":{"label":"Power Rating"},"recycling_accepts":{"label":"Accepts"},"recycling_type":{"label":"Recycling Type","options":{"container":"Container","centre":"Recycling Center"}},"ref_aeroway_gate":{"label":"Gate Number"},"ref_golf_hole":{"label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"label":"Junction Number"},"ref_platform":{"label":"Platform Number"},"ref_road_number":{"label":"Road Number"},"ref_route":{"label":"Route Number"},"ref_runway":{"label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"label":"Stop Number"},"ref_taxiway":{"label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"label":"Reference Code"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"site":{"label":"Type"},"smoking":{"label":"Smoking","placeholder":"No, Separated, Yes...","options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}},"smoothness":{"label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}},"social_facility_for":{"label":"People Served"},"social_facility":{"label":"Type"},"source":{"label":"Sources"},"sport_ice":{"label":"Sports"},"sport_racing_motor":{"label":"Sports"},"sport_racing_nonmotor":{"label":"Sports"},"sport":{"label":"Sports"},"stars":{"label":"Stars"},"start_date":{"label":"Start Date"},"step_count":{"label":"Number of Steps"},"stop":{"label":"Stop Type","options":{"all":"All Ways","minor":"Minor Road"}},"structure_waterway":{"label":"Structure","placeholder":"Unknown","options":{"tunnel":"Tunnel"}},"structure":{"label":"Structure","placeholder":"Unknown","options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}},"studio":{"label":"Type"},"substance":{"label":"Substance"},"substation":{"label":"Type"},"supervised":{"label":"Supervised"},"support":{"label":"Support"},"surface":{"label":"Surface"},"surveillance":{"label":"Surveillance Kind"},"surveillance/type":{"label":"Surveillance Type","options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}},"surveillance/zone":{"label":"Surveillance Zone"},"switch":{"label":"Type","options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism_attraction":{"label":"Tourism"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"trade":{"label":"Type"},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"trail_visibility":{"label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}},"transformer":{"label":"Type","options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}},"trees":{"label":"Trees"},"tunnel":{"label":"Type","placeholder":"Default"},"vending":{"label":"Type of Goods"},"visibility":{"label":"Visibility","options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}},"volcano/status":{"label":"Volcano Status","options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}},"volcano/type":{"label":"Volcano Type","options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}},"voltage":{"label":"Voltage"},"voltage/primary":{"label":"Primary Voltage"},"voltage/secondary":{"label":"Secondary Voltage"},"voltage/tertiary":{"label":"Tertiary Voltage"},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"},"windings":{"label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"label":"Windings Configuration","options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"aerialway/cable_car":{"name":"Cable Car","terms":"tramway,ropeway"},"aerialway/chair_lift":{"name":"Chair Lift","terms":""},"aerialway/drag_lift":{"name":"Drag Lift","terms":""},"aerialway/gondola":{"name":"Gondola","terms":""},"aerialway/goods":{"name":"Goods Aerialway","terms":""},"aerialway/magic_carpet":{"name":"Magic Carpet Lift","terms":""},"aerialway/mixed_lift":{"name":"Mixed Lift","terms":""},"aerialway/platter":{"name":"Platter Lift","terms":"button lift,poma lift"},"aerialway/pylon":{"name":"Aerialway Pylon","terms":""},"aerialway/rope_tow":{"name":"Rope Tow Lift","terms":"handle tow,bugel lift"},"aerialway/station":{"name":"Aerialway Station","terms":""},"aerialway/t-bar":{"name":"T-bar Lift","terms":"tbar"},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"aeroway/apron":{"name":"Apron","terms":"ramp"},"aeroway/gate":{"name":"Airport Gate","terms":""},"aeroway/hangar":{"name":"Hangar","terms":""},"aeroway/helipad":{"name":"Helipad","terms":"helicopter,helipad,heliport"},"aeroway/runway":{"name":"Runway","terms":"landing strip"},"aeroway/taxiway":{"name":"Taxiway","terms":""},"aeroway/terminal":{"name":"Airport Terminal","terms":"airport,aerodrome"},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/scrapyard":{"name":"Scrap Yard","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,dog,horse,kitten,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{"name":"Animal Breeding Facility","terms":"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{"name":"Animal Shelter","terms":"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{"name":"Arts Center","terms":""},"amenity/atm":{"name":"ATM","terms":"money,cash,machine"},"amenity/bank":{"name":"Bank","terms":"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{"name":"Bar","terms":"dive,beer,bier,booze"},"amenity/bbq":{"name":"Barbecue/Grill","terms":"bbq,grill"},"amenity/bench":{"name":"Bench","terms":"seat"},"amenity/bicycle_parking":{"name":"Bicycle Parking","terms":"bike"},"amenity/bicycle_rental":{"name":"Bicycle Rental","terms":"bike"},"amenity/bicycle_repair_station":{"name":"Bicycle Repair Tool Stand","terms":"bike,repair,chain,pump"},"amenity/biergarten":{"name":"Beer Garden","terms":"beer,bier,booze"},"amenity/boat_rental":{"name":"Boat Rental","terms":""},"amenity/bureau_de_change":{"name":"Currency Exchange","terms":"bureau de change,money changer"},"amenity/bus_station":{"name":"Bus Station","terms":""},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clinic/abortion":{"name":"Abortion Clinic","terms":""},"amenity/clinic/fertility":{"name":"Fertility Clinic","terms":"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*,physician"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/ferry_terminal":{"name":"Ferry Terminal","terms":""},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/music_school":{"name":"Music School","terms":"school of music"},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{"name":"Hindu Temple","terms":"garbhargriha,mandu,puja,shrine,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/place_of_worship/shinto":{"name":"Shinto Shrine","terms":"kami,torii"},"amenity/place_of_worship/sikh":{"name":"Sikh Temple","terms":"gurudwara,temple"},"amenity/place_of_worship/taoist":{"name":"Taoist Temple","terms":"daoist,monastery,temple"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"amenity/vending_machine/excrement_bags":{"name":"Excrement Bag Vending Machine","terms":"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{"name":"Feminine Hygiene Vending Machine","terms":"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/sweets":{"name":"Snack Vending Machine","terms":"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{"name":"Veterinary","terms":"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{"name":"Waste Basket","terms":"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{"name":"Garbage Dumpster","terms":"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{"name":"Waste Transfer Station","terms":"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{"name":"Dog Excrement Bin","terms":"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{"name":"RV Drinking Water","terms":""},"amenity/watering_place":{"name":"Animal Watering Place","terms":""},"area":{"name":"Area","terms":""},"area/highway":{"name":"Road Surface","terms":""},"attraction/amusement_ride":{"name":"Amusement Ride","terms":"theme park,carnival ride"},"attraction/animal":{"name":"Animal","terms":"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{"name":"Big Wheel","terms":"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{"name":"Bumper Car","terms":"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{"name":"Bungee Jumping","terms":"theme park,bungy jumping,jumping platform"},"attraction/carousel":{"name":"Carousel","terms":"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{"name":"Dark Ride","terms":"theme park,ghost train"},"attraction/drop_tower":{"name":"Drop Tower","terms":"theme park,amusement ride,gondola,tower,big drop"},"attraction/pirate_ship":{"name":"Pirate Ship","terms":"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{"name":"River Rafting","terms":"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{"name":"Roller Coaster","terms":"theme park,amusement ride"},"attraction/train":{"name":"Tourist Train","terms":"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{"name":"Water Slide","terms":"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/college":{"name":"College Building","terms":"university"},"building/commercial":{"name":"Commercial Building","terms":""},"building/construction":{"name":"Building Under Construction","terms":""},"building/detached":{"name":"Detached House","terms":"home,single,family,residence,dwelling"},"building/dormitory":{"name":"Dormitory","terms":""},"building/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"building/greenhouse":{"name":"Greenhouse","terms":""},"building/hospital":{"name":"Hospital Building","terms":""},"building/hotel":{"name":"Hotel Building","terms":""},"building/house":{"name":"House","terms":"home,family,residence,dwelling"},"building/hut":{"name":"Hut","terms":""},"building/industrial":{"name":"Industrial Building","terms":""},"building/kindergarten":{"name":"Preschool/Kindergarten Building","terms":"kindergarden,pre-school"},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/school":{"name":"School Building","terms":"academy,elementary school,middle school,high school"},"building/semidetached_house":{"name":"Semi-Detached House","terms":"home,double,duplex,twin,family,residence,dwelling"},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/chimney_sweeper":{"name":"Chimney Sweeper","terms":""},"craft/clockmaker":{"name":"Clockmaker","terms":""},"craft/confectionery":{"name":"Candy Maker","terms":"sweet,candy"},"craft/distillery":{"name":"Distillery","terms":"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{"name":"Dressmaker","terms":"seamstress"},"craft/electrician":{"name":"Electrician","terms":"power,wire"},"craft/electronics_repair":{"name":"Electronics Repair Shop","terms":""},"craft/gardener":{"name":"Gardener","terms":"landscaper,grounds keeper"},"craft/glaziery":{"name":"Glaziery","terms":"glass,stained-glass,window"},"craft/handicraft":{"name":"Handicraft","terms":""},"craft/hvac":{"name":"HVAC","terms":"heat*,vent*,air conditioning"},"craft/insulator":{"name":"Insulator","terms":""},"craft/key_cutter":{"name":"Key Cutter","terms":""},"craft/metal_construction":{"name":"Metal Construction","terms":""},"craft/painter":{"name":"Painter","terms":""},"craft/photographer":{"name":"Photographer","terms":""},"craft/photographic_laboratory":{"name":"Photographic Laboratory","terms":"film"},"craft/plasterer":{"name":"Plasterer","terms":""},"craft/plumber":{"name":"Plumber","terms":"pipe"},"craft/pottery":{"name":"Pottery","terms":"ceramic"},"craft/rigger":{"name":"Rigger","terms":""},"craft/roofer":{"name":"Roofer","terms":""},"craft/saddler":{"name":"Saddler","terms":""},"craft/sailmaker":{"name":"Sailmaker","terms":""},"craft/sawmill":{"name":"Sawmill","terms":"lumber"},"craft/scaffolder":{"name":"Scaffolder","terms":""},"craft/sculptor":{"name":"Sculptor","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare":{"name":"Healthcare Facility","terms":"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{"name":"Alternative Medicine","terms":"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{"name":"Chiropractor","terms":"back,pain,spine"},"healthcare/audiologist":{"name":"Audiologist","terms":"ear,hearing,sound"},"healthcare/birthing_center":{"name":"Birthing Center","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{"name":"Hospice","terms":"terminal,illness"},"healthcare/midwife":{"name":"Midwife","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{"name":"Occupational Therapist","terms":"therapist,therapy"},"healthcare/optometrist":{"name":"Optometrist","terms":"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{"name":"Physiotherapist","terms":"physical,therapist,therapy"},"healthcare/podiatrist":{"name":"Podiatrist","terms":"foot,feet,nails"},"healthcare/psychotherapist":{"name":"Psychotherapist","terms":"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{"name":"Rehabilitation Facility","terms":"rehab,therapist,therapy"},"healthcare/speech_therapist":{"name":"Speech Therapist","terms":"speech,therapist,therapy,voice"},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_stop":{"name":"Bus Stop","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{"name":"Pedestrian Area","terms":"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{"name":"Pedestrian Street","terms":"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"highway/track":{"name":"Unmaintained Track Road","terms":"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{"name":"Traffic Mirror","terms":"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{"name":"Traffic Signals","terms":"light,stoplight,traffic light"},"highway/trunk_link":{"name":"Trunk Link","terms":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"highway/turning_circle":{"name":"Turning Circle","terms":"cul-de-sac"},"highway/turning_loop":{"name":"Turning Loop (Island)","terms":"cul-de-sac"},"highway/unclassified":{"name":"Minor/Unclassified Road","terms":""},"historic":{"name":"Historic Site","terms":""},"historic/archaeological_site":{"name":"Archaeological Site","terms":""},"historic/boundary_stone":{"name":"Boundary Stone","terms":""},"historic/castle":{"name":"Castle","terms":""},"historic/memorial":{"name":"Memorial","terms":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/brownfield":{"name":"Brownfield","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garages","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/greenfield":{"name":"Greenfield","terms":""},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/industrial/scrap_yard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{"name":"Slaughterhouse","terms":"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{"name":"Barracks","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{"name":"Military Bunker","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{"name":"Checkpoint","terms":"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{"name":"Danger Area","terms":"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{"name":"Naval Base","terms":"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{"name":"Nuclear Explosion Site","terms":"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{"name":"Obstacle Course","terms":"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{"name":"Military Office","terms":"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{"name":"Military Range","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{"name":"Training Area","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{"name":"Orchard","terms":"fruit"},"landuse/plant_nursery":{"name":"Plant Nursery","terms":"flower,garden,grow,vivero"},"landuse/quarry":{"name":"Quarry","terms":""},"landuse/railway":{"name":"Railway Corridor","terms":"rail,train,track"},"landuse/recreation_ground":{"name":"Recreation Ground","terms":"playing fields"},"landuse/religious":{"name":"Religious Area","terms":""},"landuse/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"leisure/bowling_alley":{"name":"Bowling Alley","terms":"bowling center"},"leisure/common":{"name":"Common","terms":"open space"},"leisure/dance":{"name":"Dance Hall","terms":"ballroom,jive,swing,tango,waltz"},"leisure/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{"name":"Exercise Balance Beam","terms":"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{"name":"Exercise Box","terms":"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{"name":"Exercise Horizontal Bar","terms":"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{"name":"Exercise Monkey Bars","terms":"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{"name":"Hyperextension Station","terms":"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{"name":"Parallel Bars","terms":"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{"name":"Push-Up Station","terms":"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{"name":"Exercise Rings","terms":"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{"name":"Exercise Instruction Sign","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{"name":"Sit-Up Station","terms":"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{"name":"Exercise Stairs","terms":"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{"name":"Garden","terms":""},"leisure/golf_course":{"name":"Golf Course","terms":"links"},"leisure/hackerspace":{"name":"Hackerspace","terms":"makerspace,hackspace,hacklab"},"leisure/horse_riding":{"name":"Horseback Riding Facility","terms":"equestrian,stable"},"leisure/ice_rink":{"name":"Ice Rink","terms":"hockey,skating,curling"},"leisure/marina":{"name":"Marina","terms":"boat"},"leisure/miniature_golf":{"name":"Miniature Golf","terms":"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{"name":"Nature Reserve","terms":"protected,wildlife"},"leisure/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/boules":{"name":"Boules/Bocce Court","terms":"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/sauna":{"name":"Sauna","terms":""},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock,jetty"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/watermill":{"name":"Watermill","terms":"water,wheel,mill"},"man_made/windmill":{"name":"Windmill","terms":"wind,wheel,mill"},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{"name":"Telecom Manhole","terms":"cover,phone,hole,telecom,telephone,bt"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"natural/coastline":{"name":"Coastline","terms":"shore"},"natural/fell":{"name":"Fell","terms":""},"natural/glacier":{"name":"Glacier","terms":""},"natural/grassland":{"name":"Grassland","terms":"prairie,savanna"},"natural/heath":{"name":"Heath","terms":""},"natural/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant Office","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/adoption_agency":{"name":"Adoption Agency","terms":""},"office/advertising_agency":{"name":"Advertising Agency","terms":"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{"name":"Architect Office","terms":""},"office/association":{"name":"Nonprofit Organization Office","terms":"association,non-profit,nonprofit,organization,society"},"office/charity":{"name":"Charity Office","terms":"charitable organization"},"office/company":{"name":"Company Office","terms":""},"office/coworking":{"name":"Coworking Space","terms":"coworking,office"},"office/educational_institution":{"name":"Educational Institution","terms":""},"office/employment_agency":{"name":"Employment Agency","terms":"job"},"office/energy_supplier":{"name":"Energy Supplier Office","terms":"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/forestry":{"name":"Forestry Office","terms":"forest,ranger"},"office/foundation":{"name":"Foundation Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/government/tax":{"name":"Tax and Revenue Office","terms":"fiscal authorities,revenue office,tax office"},"office/guide":{"name":"Tour Guide Office","terms":"dive guide,mountain guide,tour guide"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"Information Technology Office","terms":"computer,information,software,technology"},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":"clerk,signature,wills,deeds,estate"},"office/moving_company":{"name":"Moving Company Office","terms":"relocation"},"office/newspaper":{"name":"Newspaper Office","terms":""},"office/ngo":{"name":"NGO Office","terms":"ngo,non government,non-government,organization,organisation"},"office/notary":{"name":"Notary Office","terms":""},"office/political_party":{"name":"Political Party","terms":""},"office/private_investigator":{"name":"Private Investigator Office","terms":"PI,private eye,private detective"},"office/quango":{"name":"Quasi-NGO Office","terms":"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{"name":"Research Office","terms":""},"office/surveyor":{"name":"Surveyor Office","terms":""},"office/tax_advisor":{"name":"Tax Advisor Office","terms":"tax,tax consultant"},"office/telecommunication":{"name":"Telecom Office","terms":""},"office/therapist":{"name":"Therapist Office","terms":"therapy"},"office/water_utility":{"name":"Water Utility Office","terms":"water board,utility"},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{"name":"Islet","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"place/plot":{"name":"Plot","terms":"tract,land,lot,parcel"},"place/quarter":{"name":"Sub-Borough / Quarter","terms":"boro,borough,quarter"},"place/square":{"name":"Square","terms":""},"place/suburb":{"name":"Borough / Suburb","terms":"boro,borough,quarter"},"place/town":{"name":"Town","terms":""},"place/village":{"name":"Village","terms":""},"playground/balance_beam":{"name":"Play Balance Beam","terms":""},"playground/basket_spinner":{"name":"Basket Spinner","terms":"basket rotator"},"playground/basket_swing":{"name":"Basket Swing","terms":""},"playground/climbing_frame":{"name":"Climbing Frame","terms":""},"playground/cushion":{"name":"Bouncy Cushion","terms":""},"playground/horizontal_bar":{"name":"Play Horizontal Bar","terms":"high bar"},"playground/rocker":{"name":"Spring Rider","terms":"spring rocker,springy rocker"},"playground/roundabout":{"name":"Play Roundabout","terms":"merry-go-round"},"playground/sandpit":{"name":"Sandpit","terms":""},"playground/seesaw":{"name":"Seesaw","terms":""},"playground/slide":{"name":"Slide","terms":""},"playground/structure":{"name":"Play Structure","terms":""},"playground/swing":{"name":"Swing","terms":""},"playground/zipwire":{"name":"Zip Wire","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{"name":"Nuclear Reactor","terms":"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{"name":"Wind Turbine","terms":"generator,turbine,windmill,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/switch":{"name":"Power Switch","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/platform":{"name":"Platform","terms":""},"public_transport/stop_position":{"name":"Stop Position","terms":""},"railway/abandoned":{"name":"Abandoned Railway","terms":""},"railway/buffer_stop":{"name":"Buffer Stop","terms":"stop,halt,buffer"},"railway/crossing":{"name":"Railway Crossing (Path)","terms":"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{"name":"Railway Derailer","terms":"derailer"},"railway/disused":{"name":"Disused Railway","terms":""},"railway/funicular":{"name":"Funicular","terms":"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/halt":{"name":"Railway Halt","terms":"break,interrupt,rest,wait,interruption"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{"name":"Light Rail","terms":"light rail,streetcar,trolley"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/platform":{"name":"Railway Platform","terms":""},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/station":{"name":"Railway Station","terms":"train station,station"},"railway/subway_entrance":{"name":"Subway Entrance","terms":"metro,transit"},"railway/subway":{"name":"Subway","terms":"metro,transit"},"railway/switch":{"name":"Railway Switch","terms":"switch,points"},"railway/train_wash":{"name":"Train Wash","terms":"wash,clean"},"railway/tram_stop":{"name":"Tram Stop","terms":"light rail,streetcar,tram,trolley"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/agrarian":{"name":"Agriculture Shop","terms":"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":"sweet"},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"News Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tiles":{"name":"Tile Shop","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/trade":{"name":"Trade Shop","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":"climbing hut"},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Holiday Cottage","terms":"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{"name":"Art Gallery","terms":"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{"name":"Guest House","terms":"B&B,Bed and Breakfast"},"tourism/hostel":{"name":"Hostel","terms":""},"tourism/hotel":{"name":"Hotel","terms":""},"tourism/information":{"name":"Information","terms":""},"tourism/information/board":{"name":"Information Board","terms":""},"tourism/information/guidepost":{"name":"Guidepost","terms":"signpost"},"tourism/information/map":{"name":"Map","terms":""},"tourism/information/office":{"name":"Tourist Information Office","terms":""},"tourism/motel":{"name":"Motel","terms":""},"tourism/museum":{"name":"Museum","terms":"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{"name":"Picnic Site","terms":"camp"},"tourism/theme_park":{"name":"Theme Park","terms":""},"tourism/viewpoint":{"name":"Viewpoint","terms":""},"tourism/wilderness_hut":{"name":"Wilderness Hut","terms":"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Speed Table","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","terms":""},"type/route_master":{"name":"Route Master","terms":""},"type/route":{"name":"Route","terms":""},"type/route/bicycle":{"name":"Cycle Route","terms":""},"type/route/bus":{"name":"Bus Route","terms":""},"type/route/detour":{"name":"Detour Route","terms":""},"type/route/ferry":{"name":"Ferry Route","terms":""},"type/route/foot":{"name":"Foot Route","terms":""},"type/route/hiking":{"name":"Hiking Route","terms":""},"type/route/horse":{"name":"Riding Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"type/waterway":{"name":"Waterway","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{"name":"Intermittent Stream","terms":"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Standard Imagery Vintage"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"MAPNIK":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"description":"The default OpenStreetMap layer.","name":"OpenStreetMap (Standard)"},"Mapbox":{"attribution":{"text":"Terms & Feedback"},"description":"Satellite and aerial imagery.","name":"Mapbox Satellite"},"OSM_Inspector-Addresses":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Area"},"OSM_Inspector-Places":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Places"},"OSM_Inspector-Routing":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Tagging"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"US-TIGER-Roads-2014":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"TIGER Roads 2014"},"US-TIGER-Roads-2017":{"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","name":"TIGER Roads 2017"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"mapbox_locator_overlay":{"attribution":{"text":"Terms & Feedback"},"description":"Shows major features to help orient you.","name":"Locator Overlay"},"openpt_map":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenPT Map (overlay)"},"osm-gps":{"attribution":{"text":"© OpenStreetMap contributors"},"description":"Public GPS traces uploaded to OpenStreetMap.","name":"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (German Style)"},"qa_no_address":{"attribution":{"text":"Simon Poole, Data ©OpenStreetMap contributors"},"name":"QA No Address"},"skobbler":{"attribution":{"text":"© Tiles: skobbler Map data: OpenStreetMap contributors"},"name":"skobbler"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
+var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},"drag_node":{"connected_to_hidden":"This can't be edited because it is connected to a hidden feature."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","request_review":"I would like someone to review my edits.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","download_changes":"Download osmChange file","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"https://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","source":"Source","description":"Description","resolution":"Resolution","accuracy":"Accuracy","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles","show_vintage":"Show Vintage","hide_vintage":"Hide Vintage"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed_line":"closed line","closed_area":"closed area","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial","node_count":"Number of nodes"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","backgrounds":"Backgrounds","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n   - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   - {-y} or {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}","overlays":"Overlays","imagery_source_faq":"Imagery Info / Report a Problem","reset":"reset","display_options":"Display Options","brightness":"Brightness","contrast":"Contrast","saturation":"Saturation","sharpness":"Sharpness","minimap":{"description":"Show Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"},"fix_misalignment":"Adjust imagery offset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","layers":{"osm":{"tooltip":"Map data from OpenStreetMap","title":"OpenStreetMap data"}},"fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.","osmhidden":"These features have been automatically hidden because the OpenStreetMap layer is hidden."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"restore":{"heading":"You have unsaved changes","description":"Do you wish to restore unsaved changes from a previous editing session?","restore":"Restore my changes","reset":"Discard my changes"},"save":{"title":"Save","help":"Review your changes and upload them to OpenStreetMap, making them visible to other users.","no_changes":"No changes to save.","error":"Errors occurred while trying to save","status_code":"Server returned status code {code}","unknown_error_details":"Please ensure you are connected to the internet.","uploading":"Uploading changes to OpenStreetMap...","conflict_progress":"Checking for conflicts: {num} of {total}","unsaved_changes":"You have unsaved changes","conflict":{"header":"Resolve conflicting edits","count":"Conflict {num} of {total}","previous":"< Previous","next":"Next >","keep_local":"Keep mine","keep_remote":"Use theirs","restore":"Restore","delete":"Leave Deleted","download_changes":"Or download osmChange file","done":"All conflicts resolved!","help":"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},"merge_remote_changes":{"conflict":{"deleted":"This feature has been deleted by {user}.","location":"This feature was moved by both you and {user}.","nodelist":"Nodes were changed by both you and {user}.","memberlist":"Relation members were changed by both you and {user}.","tags":"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},"success":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","help_link_text":"Details","help_link_url":"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom in","out":"Zoom out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"mapillary_images":{"tooltip":"Street-level photos from Mapillary","title":"Photo Overlay (Mapillary)"},"mapillary_signs":{"tooltip":"Traffic signs from Mapillary (must enable Photo Overlay)","title":"Traffic Sign Overlay (Mapillary)"},"mapillary":{"view_on_mapillary":"View this image on Mapillary"},"openstreetcam_images":{"tooltip":"Street-level photos from OpenStreetCam","title":"Photo Overlay (OpenStreetCam)"},"openstreetcam":{"view_on_openstreetcam":"View this image on OpenStreetCam"},"help":{"title":"Help","key":"H","help":{"title":"Help","welcome":"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.","open_data_h":"Open Data","open_data":"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).","before_start_h":"Before you start","before_start":"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.","open_source_h":"Open Source","open_source":"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).","open_source_help":"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},"overview":{"title":"Overview","navigation_h":"Navigation","navigation_drag":"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.","navigation_zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.","features_h":"Map Features","features":"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.","nodes_ways":"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},"editing":{"title":"Editing & Saving","select_h":"Select","select_left_click":"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.","select_right_click":"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.","multiselect_h":"Multiselect","multiselect_shift_click":"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.","multiselect_lasso":"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.","undo_redo_h":"Undo & Redo","undo_redo":"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.","save_h":"Save","save":"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!","save_validation":"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.","upload_h":"Upload","upload":"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.","backups_h":"Automatic Backups","backups":"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.","keyboard_h":"Keyboard Shortcuts","keyboard":"You can view a list of keyboard shortcuts by pressing the `?` key."},"feature_editor":{"title":"Feature Editor","intro":"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.","definitions":"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.","type_h":"Feature Type","type":"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.","type_picker":"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.","fields_h":"Fields","fields_all_fields":"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.","fields_example":"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.","fields_add_field":"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.","tags_h":"Tags","tags_all_tags":"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.","tags_resources":"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},"points":{"title":"Points","intro":"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.","add_point_h":"Adding Points","add_point":"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.","add_point_finish":"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.","move_point_h":"Moving Points","move_point":"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.","delete_point_h":"Deleting Points","delete_point":"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.","delete_point_command":"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},"lines":{"title":"Lines","intro":"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.","add_line_h":"Adding Lines","add_line":"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.","add_line_draw":"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_line_finish":"To finish a line, press `{return}` or click again on the last node.","modify_line_h":"Modifying Lines","modify_line_dragnode":"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.","modify_line_addnode":"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.","connect_line_h":"Connecting Lines","connect_line":"Having roads connected properly is important for the map and essential for providing driving directions.","connect_line_display":"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.","connect_line_drag":"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.","connect_line_tag":"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.","disconnect_line_h":"Disconnecting Lines","disconnect_line_command":"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.","move_line_h":"Moving Lines","move_line_command":"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.","move_line_connected":"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.","delete_line_h":"Deleting Lines","delete_line":"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.","delete_line_command":"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},"areas":{"title":"Areas","intro":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.","point_or_area_h":"Points or Areas?","point_or_area":"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.","add_area_h":"Adding Areas","add_area_command":"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.","add_area_draw":"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.","add_area_finish":"To finish an area, press `{return}` or click again on either the first or last node.","square_area_h":"Square Corners","square_area_command":"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.","modify_area_h":"Modifying Areas","modify_area_dragnode":"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.","modify_area_addnode":"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.","delete_area_h":"Deleting Areas","delete_area":"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.","delete_area_command":"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},"relations":{"title":"Relations","intro":"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.","edit_relation_h":"Editing Relations","edit_relation":"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.","edit_relation_add":"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.","edit_relation_delete":"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.","maintain_relation_h":"Maintaining Relations","maintain_relation":"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.","relation_types_h":"Relation Types","multipolygon_h":"Multipolygons","multipolygon":"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.","multipolygon_create":"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.","multipolygon_merge":"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.","turn_restriction_h":"Turn restrictions","turn_restriction":"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.","turn_restriction_field":"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.","turn_restriction_editing":"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.","route_h":"Routes","route":"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.","route_add":"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.","boundary_h":"Boundaries","boundary":"A *boundary* relation is a group of one or more line features that together form an administrative boundary.","boundary_add":"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},"imagery":{"title":"Background Imagery","intro":"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.","sources_h":"Imagery Sources","choosing":"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.","sources":"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.","offsets_h":"Adjusting Imagery Offset","offset":"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.","offset_change":"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},"streetlevel":{"title":"Street Level Photos","intro":"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).","using_h":"Using Street Level Photos","using":"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.","photos":"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.","viewer":"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},"gps":{"title":"GPS Traces","intro":"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.","survey":"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).","using_h":"Using GPS Traces","using":"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.","tracing":"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.","upload":"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."}},"intro":{"done":"done","ok":"OK","graph":{"block_number":"<value for addr:block_number>","city":"Three Rivers","county":"<value for addr:county>","district":"<value for addr:district>","hamlet":"<value for addr:hamlet>","neighbourhood":"<value for addr:neighbourhood>","postcode":"49093","province":"<value for addr:province>","quarter":"<value for addr:quarter>","state":"MI","subdistrict":"<value for addr:subdistrict>","suburb":"<value for addr:suburb>","countrycode":"us","name":{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},"welcome":{"title":"Welcome","welcome":"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.","practice":"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.","words":"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.","mouse":"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**","leftclick":"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**","rightclick":"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**","chapters":"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},"navigation":{"title":"Navigation","drag":"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**","zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**","features":"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.","points_lines_areas":"Map features are represented using *points, lines, or areas.*","nodes_ways":"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.","click_townhall":"All features on the map can be selected by clicking on them. **Click on the point to select it.**","selected_townhall":"Great! The point is now selected. Selected features are drawn with a pulsing glow.","editor_townhall":"When a feature is selected, the *feature editor* is displayed alongside the map.","preset_townhall":"The top part of the feature editor shows the feature's type. This point is a {preset}.","fields_townhall":"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.","close_townhall":"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**","search_street":"You can also search for features in the current view, or worldwide. **Search for '{name}'.**","choose_street":"**Choose {name} from the list to select it.**","selected_street":"Great! {name} is now selected.","editor_street":"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**","play":"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"points":{"title":"Points","add_point":"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**","place_point":"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**","search_cafe":"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**","choose_cafe":"**Choose {preset} from the list.**","feature_editor":"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.","add_name":"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**","add_close":"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**","reselect":"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**","update":"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**","update_close":"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**","rightclick":"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**","undo":"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**","play":"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},"areas":{"title":"Areas","add_playground":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features","search":"Find features matching search text"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","disable_snap":"Hold to disable point snapping","stop_line":"Finish drawing a line or area"},"operations":{"title":"Operations","continue_line":"Continue a line at the selected node","merge":"Combine (merge) selected features","disconnect":"Disconnect features at the selected node","split":"Split a line into two at the selected node","reverse":"Reverse a line","move":"Move selected features","rotate":"Rotate selected features","orthogonalize":"Straighten line / Square area corners","circularize":"Circularize a closed line or area","reflect_long":"Reflect features across the longer axis","reflect_short":"Reflect features across the shorter axis","delete":"Delete selected features"},"commands":{"title":"Commands","copy":"Copy selected features","paste":"Paste copied features","undo":"Undo last action","redo":"Redo last action","save":"Save changes"}},"tools":{"title":"Tools","info":{"title":"Information","all":"Toggle all information panels","background":"Toggle background panel","history":"Toggle history panel","location":"Toggle location panel","measurement":"Toggle measurement panel"}}},"units":{"feet":"{quantity} ft","miles":"{quantity} mi","square_feet":"{quantity} sq ft","square_miles":"{quantity} sq mi","acres":"{quantity} ac","meters":"{quantity} m","kilometers":"{quantity} km","square_meters":"{quantity} m²","square_kilometers":"{quantity} km²","hectares":"{quantity} ha","area_pair":"{area1} ({area2})","arcdegrees":"{quantity}°","arcminutes":"{quantity}′","arcseconds":"{quantity}″","north":"N","south":"S","east":"E","west":"W","coordinate":"{coordinate}{direction}","coordinate_pair":"{latitude}, {longitude}"},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"address":{"label":"Address","placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}},"admin_level":{"label":"Admin Level"},"aerialway":{"label":"Type"},"aerialway/access":{"label":"Access","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aerialway/bubble":{"label":"Bubble"},"aerialway/capacity":{"label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"label":"Heated"},"aerialway/occupancy":{"label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"label":"Access (summer)","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aeroway":{"label":"Type"},"agrarian":{"label":"Products"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boules":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"brewery":{"label":"Draft Beers"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"cables":{"label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"label":"Camera Mount"},"camera/type":{"label":"Camera Type","options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}},"capacity":{"label":"Capacity","placeholder":"50, 100, 200..."},"castle_type":{"label":"Type"},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"comment":{"label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Content"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crane/type":{"label":"Crane Type","options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cutting":{"label":"Type","placeholder":"Default"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"devices":{"label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"label":"Diaper Changing Available"},"direction_cardinal":{"label":"Direction","options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}},"direction_clock":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"direction_vertex":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"duration":{"label":"Duration","placeholder":"00:00"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"embankment":{"label":"Type","placeholder":"Default"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fitness_station":{"label":"Equipment Type"},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"frequency":{"label":"Operating Frequency"},"fuel_multi":{"label":"Fuel Types"},"fuel":{"label":"Fuel"},"gauge":{"label":"Gauge"},"gender":{"label":"Gender","placeholder":"Unknown","options":{"male":"Male","female":"Female","unisex":"Unisex"}},"generator/method":{"label":"Method"},"generator/output/electricity":{"label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"label":"Source"},"generator/type":{"label":"Type"},"government":{"label":"Type"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"hashtags":{"label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"label":"Type"},"healthcare/speciality":{"label":"Specialties"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"intermittent":{"label":"Intermittent"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"memorial":{"label":"Type"},"monitoring_multi":{"label":"Monitoring"},"mtb/scale":{"label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{"label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{"label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},"name":{"label":"Name","placeholder":"Common name (if any)"},"natural":{"label":"Natural"},"network_bicycle":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}},"network_foot":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}},"network_horse":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}},"network_road":{"label":"Network"},"network":{"label":"Network"},"note":{"label":"Note"},"office":{"label":"Type"},"oneway_yes":{"label":"One Way","options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"park_ride":{"label":"Park and Ride"},"parking":{"label":"Type","options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}},"payment_multi":{"label":"Payment Types"},"phases":{"label":"Phases","placeholder":"1, 2, 3..."},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"plant/output/electricity":{"label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"label":"Baby Seat"},"playground/max_age":{"label":"Maximum Age"},"playground/min_age":{"label":"Minimum Age"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"railway/position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"railway/signal/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"rating":{"label":"Power Rating"},"recycling_accepts":{"label":"Accepts"},"ref_aeroway_gate":{"label":"Gate Number"},"ref_golf_hole":{"label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"label":"Junction Number"},"ref_platform":{"label":"Platform Number"},"ref_road_number":{"label":"Road Number"},"ref_route":{"label":"Route Number"},"ref_runway":{"label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"label":"Stop Number"},"ref_taxiway":{"label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"label":"Reference Code"},"ref/isil":{"label":"ISIL Code"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"site":{"label":"Type"},"smoking":{"label":"Smoking","placeholder":"No, Separated, Yes...","options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}},"smoothness":{"label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}},"social_facility_for":{"label":"People Served"},"social_facility":{"label":"Type"},"source":{"label":"Sources"},"sport_ice":{"label":"Sports"},"sport_racing_motor":{"label":"Sports"},"sport_racing_nonmotor":{"label":"Sports"},"sport":{"label":"Sports"},"stars":{"label":"Stars"},"start_date":{"label":"Start Date"},"step_count":{"label":"Number of Steps"},"stop":{"label":"Stop Type","options":{"all":"All Ways","minor":"Minor Road"}},"structure_waterway":{"label":"Structure","placeholder":"Unknown","options":{"tunnel":"Tunnel"}},"structure":{"label":"Structure","placeholder":"Unknown","options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}},"studio":{"label":"Type"},"substance":{"label":"Substance"},"substation":{"label":"Type"},"supervised":{"label":"Supervised"},"support":{"label":"Support"},"surface":{"label":"Surface"},"surveillance":{"label":"Surveillance Kind"},"surveillance/type":{"label":"Surveillance Type","options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}},"surveillance/zone":{"label":"Surveillance Zone"},"switch":{"label":"Type","options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism_attraction":{"label":"Tourism"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"trade":{"label":"Type"},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"traffic_signals/direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward","both":"Both / All"}},"trail_visibility":{"label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}},"transformer":{"label":"Type","options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}},"trees":{"label":"Trees"},"tunnel":{"label":"Type","placeholder":"Default"},"vending":{"label":"Type of Goods"},"visibility":{"label":"Visibility","options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}},"volcano/status":{"label":"Volcano Status","options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}},"volcano/type":{"label":"Volcano Type","options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}},"voltage":{"label":"Voltage"},"voltage/primary":{"label":"Primary Voltage"},"voltage/secondary":{"label":"Secondary Voltage"},"voltage/tertiary":{"label":"Tertiary Voltage"},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"},"windings":{"label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"label":"Windings Configuration","options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"circular":{"name":"Traffic Circle","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"aerialway/station":{"name":"Aerialway Station","terms":""},"aerialway/cable_car":{"name":"Cable Car","terms":"tramway,ropeway"},"aerialway/chair_lift":{"name":"Chair Lift","terms":""},"aerialway/drag_lift":{"name":"Drag Lift","terms":""},"aerialway/gondola":{"name":"Gondola","terms":""},"aerialway/goods":{"name":"Goods Aerialway","terms":""},"aerialway/magic_carpet":{"name":"Magic Carpet Lift","terms":""},"aerialway/mixed_lift":{"name":"Mixed Lift","terms":""},"aerialway/platter":{"name":"Platter Lift","terms":"button lift,poma lift"},"aerialway/pylon":{"name":"Aerialway Pylon","terms":""},"aerialway/rope_tow":{"name":"Rope Tow Lift","terms":"handle tow,bugel lift"},"aerialway/t-bar":{"name":"T-bar Lift","terms":"tbar"},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"aeroway/apron":{"name":"Apron","terms":"ramp"},"aeroway/gate":{"name":"Airport Gate","terms":""},"aeroway/hangar":{"name":"Hangar","terms":""},"aeroway/helipad":{"name":"Helipad","terms":"helicopter,helipad,heliport"},"aeroway/runway":{"name":"Runway","terms":"landing strip"},"aeroway/taxiway":{"name":"Taxiway","terms":""},"aeroway/terminal":{"name":"Airport Terminal","terms":"airport,aerodrome"},"amenity/bus_station":{"name":"Bus Station / Terminal","terms":""},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/ferry_terminal":{"name":"Ferry Station / Terminal","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/scrapyard":{"name":"Scrap Yard","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{"name":"Animal Breeding Facility","terms":"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{"name":"Animal Shelter","terms":"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{"name":"Arts Center","terms":""},"amenity/atm":{"name":"ATM","terms":"money,cash,machine"},"amenity/bank":{"name":"Bank","terms":"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{"name":"Bar","terms":"dive,beer,bier,booze"},"amenity/bbq":{"name":"Barbecue/Grill","terms":"bbq,grill"},"amenity/bench":{"name":"Bench","terms":"seat"},"amenity/bicycle_parking":{"name":"Bicycle Parking","terms":"bike"},"amenity/bicycle_rental":{"name":"Bicycle Rental","terms":"bike"},"amenity/bicycle_repair_station":{"name":"Bicycle Repair Tool Stand","terms":"bike,repair,chain,pump"},"amenity/biergarten":{"name":"Beer Garden","terms":"beer,bier,booze"},"amenity/boat_rental":{"name":"Boat Rental","terms":""},"amenity/bureau_de_change":{"name":"Currency Exchange","terms":"bureau de change,money changer"},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_pooling":{"name":"Car Pooling","terms":""},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clinic/abortion":{"name":"Abortion Clinic","terms":""},"amenity/clinic/fertility":{"name":"Fertility Clinic","terms":"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*,physician"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/love_hotel":{"name":"Love Hotel","terms":""},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/music_school":{"name":"Music School","terms":"school of music"},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{"name":"Hindu Temple","terms":"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/place_of_worship/shinto":{"name":"Shinto Shrine","terms":"kami,torii"},"amenity/place_of_worship/sikh":{"name":"Sikh Temple","terms":"gurudwara,temple"},"amenity/place_of_worship/taoist":{"name":"Taoist Temple","terms":"daoist,monastery,temple"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling Container","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/smoking_area":{"name":"Smoking Area","terms":""},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"amenity/vending_machine/excrement_bags":{"name":"Excrement Bag Vending Machine","terms":"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{"name":"Feminine Hygiene Vending Machine","terms":"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/sweets":{"name":"Snack Vending Machine","terms":"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{"name":"Veterinary","terms":"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{"name":"Waste Basket","terms":"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{"name":"Garbage Dumpster","terms":"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{"name":"Waste Transfer Station","terms":"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{"name":"Dog Excrement Bin","terms":"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{"name":"RV Drinking Water","terms":""},"amenity/watering_place":{"name":"Animal Watering Place","terms":""},"area":{"name":"Area","terms":""},"area/highway":{"name":"Road Surface","terms":""},"attraction/amusement_ride":{"name":"Amusement Ride","terms":"theme park,carnival ride"},"attraction/animal":{"name":"Animal","terms":"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{"name":"Big Wheel","terms":"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{"name":"Bumper Car","terms":"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{"name":"Bungee Jumping","terms":"theme park,bungy jumping,jumping platform"},"attraction/carousel":{"name":"Carousel","terms":"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{"name":"Dark Ride","terms":"theme park,ghost train"},"attraction/drop_tower":{"name":"Drop Tower","terms":"theme park,amusement ride,gondola,tower,big drop"},"attraction/pirate_ship":{"name":"Pirate Ship","terms":"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{"name":"River Rafting","terms":"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{"name":"Roller Coaster","terms":"theme park,amusement ride"},"attraction/train":{"name":"Tourist Train","terms":"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{"name":"Water Slide","terms":"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kerb":{"name":"Kerb","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/boathouse":{"name":"Boathouse","terms":""},"building/bungalow":{"name":"Bungalow","terms":"home,detached"},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/civic":{"name":"Civic Building","terms":""},"building/college":{"name":"College Building","terms":"university"},"building/commercial":{"name":"Commercial Building","terms":""},"building/construction":{"name":"Building Under Construction","terms":""},"building/detached":{"name":"Detached House","terms":"home,single,family,residence,dwelling"},"building/dormitory":{"name":"Dormitory","terms":""},"building/farm":{"name":"Farm Building","terms":""},"building/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"building/greenhouse":{"name":"Greenhouse","terms":""},"building/hospital":{"name":"Hospital Building","terms":""},"building/hotel":{"name":"Hotel Building","terms":""},"building/house":{"name":"House","terms":"home,family,residence,dwelling"},"building/hut":{"name":"Hut","terms":""},"building/industrial":{"name":"Industrial Building","terms":""},"building/kindergarten":{"name":"Preschool/Kindergarten Building","terms":"kindergarden,pre-school"},"building/mosque":{"name":"Mosque Building","terms":""},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/ruins":{"name":"Building Ruins","terms":""},"building/school":{"name":"School Building","terms":"academy,elementary school,middle school,high school"},"building/semidetached_house":{"name":"Semi-Detached House","terms":"home,double,duplex,twin,family,residence,dwelling"},"building/service":{"name":"Service Building","terms":""},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/stadium":{"name":"Stadium Building","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/temple":{"name":"Temple Building","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{"name":"Transportation Building","terms":""},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/chimney_sweeper":{"name":"Chimney Sweeper","terms":""},"craft/clockmaker":{"name":"Clockmaker","terms":""},"craft/confectionery":{"name":"Candy Maker","terms":"sweet,candy"},"craft/distillery":{"name":"Distillery","terms":"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{"name":"Dressmaker","terms":"seamstress"},"craft/electrician":{"name":"Electrician","terms":"power,wire"},"craft/electronics_repair":{"name":"Electronics Repair Shop","terms":""},"craft/gardener":{"name":"Gardener","terms":"landscaper,grounds keeper"},"craft/glaziery":{"name":"Glaziery","terms":"glass,stained-glass,window"},"craft/handicraft":{"name":"Handicraft","terms":""},"craft/hvac":{"name":"HVAC","terms":"heat*,vent*,air conditioning"},"craft/insulator":{"name":"Insulator","terms":""},"craft/key_cutter":{"name":"Key Cutter","terms":""},"craft/metal_construction":{"name":"Metal Construction","terms":""},"craft/painter":{"name":"Painter","terms":""},"craft/photographer":{"name":"Photographer","terms":""},"craft/photographic_laboratory":{"name":"Photographic Laboratory","terms":"film"},"craft/plasterer":{"name":"Plasterer","terms":""},"craft/plumber":{"name":"Plumber","terms":"pipe"},"craft/pottery":{"name":"Pottery","terms":"ceramic"},"craft/rigger":{"name":"Rigger","terms":""},"craft/roofer":{"name":"Roofer","terms":""},"craft/saddler":{"name":"Saddler","terms":""},"craft/sailmaker":{"name":"Sailmaker","terms":""},"craft/sawmill":{"name":"Sawmill","terms":"lumber"},"craft/scaffolder":{"name":"Scaffolder","terms":""},"craft/sculptor":{"name":"Sculptor","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"emergency/water_tank":{"name":"Emergency Water Tank","terms":"water tank,cistern,reservoir"},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare":{"name":"Healthcare Facility","terms":"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{"name":"Alternative Medicine","terms":"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{"name":"Chiropractor","terms":"back,pain,spine"},"healthcare/audiologist":{"name":"Audiologist","terms":"ear,hearing,sound"},"healthcare/birthing_center":{"name":"Birthing Center","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{"name":"Hospice","terms":"terminal,illness"},"healthcare/midwife":{"name":"Midwife","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{"name":"Occupational Therapist","terms":"therapist,therapy"},"healthcare/optometrist":{"name":"Optometrist","terms":"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{"name":"Physiotherapist","terms":"physical,therapist,therapy"},"healthcare/podiatrist":{"name":"Podiatrist","terms":"foot,feet,nails"},"healthcare/psychotherapist":{"name":"Psychotherapist","terms":"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{"name":"Rehabilitation Facility","terms":"rehab,therapist,therapy"},"healthcare/speech_therapist":{"name":"Speech Therapist","terms":"speech,therapist,therapy,voice"},"highway/bus_stop":{"name":"Bus Stop / Platform","terms":""},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_guideway":{"name":"Bus Guideway","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{"name":"Pedestrian Area","terms":"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{"name":"Pedestrian Street","terms":"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"highway/track":{"name":"Unmaintained Track Road","terms":"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{"name":"Traffic Mirror","terms":"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{"name":"Traffic Signals","terms":"light,stoplight,traffic light"},"highway/trunk_link":{"name":"Trunk Link","terms":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"highway/turning_circle":{"name":"Turning Circle","terms":"cul-de-sac"},"highway/turning_loop":{"name":"Turning Loop (Island)","terms":"cul-de-sac"},"highway/unclassified":{"name":"Minor/Unclassified Road","terms":""},"historic":{"name":"Historic Site","terms":""},"historic/archaeological_site":{"name":"Archaeological Site","terms":""},"historic/boundary_stone":{"name":"Boundary Stone","terms":""},"historic/castle":{"name":"Castle","terms":""},"historic/memorial":{"name":"Memorial","terms":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/brownfield":{"name":"Brownfield","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garage Landuse","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/greenfield":{"name":"Greenfield","terms":""},"landuse/greenhouse_horticulture":{"name":"Greenhouse Horticulture","terms":"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/industrial/scrap_yard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{"name":"Slaughterhouse","terms":"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{"name":"Barracks","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{"name":"Military Bunker","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{"name":"Checkpoint","terms":"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{"name":"Danger Area","terms":"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{"name":"Naval Base","terms":"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{"name":"Nuclear Explosion Site","terms":"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{"name":"Obstacle Course","terms":"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{"name":"Military Office","terms":"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{"name":"Military Range","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{"name":"Training Area","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{"name":"Orchard","terms":"fruit"},"landuse/plant_nursery":{"name":"Plant Nursery","terms":"flower,garden,grow,vivero"},"landuse/quarry":{"name":"Quarry","terms":""},"landuse/railway":{"name":"Railway Corridor","terms":"rail,train,track"},"landuse/recreation_ground":{"name":"Recreation Ground","terms":"playing fields"},"landuse/religious":{"name":"Religious Area","terms":""},"landuse/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"leisure/bowling_alley":{"name":"Bowling Alley","terms":"bowling center"},"leisure/common":{"name":"Common","terms":"open space"},"leisure/dance":{"name":"Dance Hall","terms":"ballroom,jive,swing,tango,waltz"},"leisure/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{"name":"Exercise Balance Beam","terms":"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{"name":"Exercise Box","terms":"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{"name":"Exercise Horizontal Bar","terms":"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{"name":"Exercise Monkey Bars","terms":"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{"name":"Hyperextension Station","terms":"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{"name":"Parallel Bars","terms":"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{"name":"Push-Up Station","terms":"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{"name":"Exercise Rings","terms":"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{"name":"Exercise Instruction Sign","terms":"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{"name":"Sit-Up Station","terms":"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{"name":"Exercise Stairs","terms":"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{"name":"Garden","terms":""},"leisure/golf_course":{"name":"Golf Course","terms":"links"},"leisure/hackerspace":{"name":"Hackerspace","terms":"makerspace,hackspace,hacklab"},"leisure/horse_riding":{"name":"Horseback Riding Facility","terms":"equestrian,stable"},"leisure/ice_rink":{"name":"Ice Rink","terms":"hockey,skating,curling"},"leisure/marina":{"name":"Marina","terms":"boat"},"leisure/miniature_golf":{"name":"Miniature Golf","terms":"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{"name":"Nature Reserve","terms":"protected,wildlife"},"leisure/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/boules":{"name":"Boules/Bocce Court","terms":"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/sauna":{"name":"Sauna","terms":""},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/monitoring_station":{"name":"Monitoring Station","terms":"weather,earthquake,seismology,air,gps"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock,jetty"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/watermill":{"name":"Watermill","terms":"water,wheel,mill"},"man_made/windmill":{"name":"Windmill","terms":"wind,wheel,mill"},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{"name":"Telecom Manhole","terms":"cover,phone,hole,telecom,telephone,bt"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"natural/coastline":{"name":"Coastline","terms":"shore"},"natural/fell":{"name":"Fell","terms":""},"natural/glacier":{"name":"Glacier","terms":""},"natural/grassland":{"name":"Grassland","terms":"prairie,savanna"},"natural/heath":{"name":"Heath","terms":""},"natural/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant Office","terms":""},"office/adoption_agency":{"name":"Adoption Agency","terms":""},"office/advertising_agency":{"name":"Advertising Agency","terms":"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{"name":"Architect Office","terms":""},"office/association":{"name":"Nonprofit Organization Office","terms":"association,non-profit,nonprofit,organization,society"},"office/charity":{"name":"Charity Office","terms":"charitable organization"},"office/company":{"name":"Corporate Office","terms":""},"office/coworking":{"name":"Coworking Space","terms":"coworking,office"},"office/educational_institution":{"name":"Educational Institution","terms":""},"office/employment_agency":{"name":"Employment Agency","terms":"job"},"office/energy_supplier":{"name":"Energy Supplier Office","terms":"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/forestry":{"name":"Forestry Office","terms":"forest,ranger"},"office/foundation":{"name":"Foundation Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/government/tax":{"name":"Tax and Revenue Office","terms":"fiscal authorities,revenue office,tax office"},"office/guide":{"name":"Tour Guide Office","terms":"dive guide,mountain guide,tour guide"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"Information Technology Office","terms":"computer,information,software,technology"},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":""},"office/moving_company":{"name":"Moving Company Office","terms":"relocation"},"office/newspaper":{"name":"Newspaper Office","terms":""},"office/ngo":{"name":"NGO Office","terms":"ngo,non government,non-government,organization,organisation"},"office/notary":{"name":"Notary Office","terms":"clerk,deeds,estate,signature,wills"},"office/political_party":{"name":"Political Party","terms":""},"office/private_investigator":{"name":"Private Investigator Office","terms":"PI,private eye,private detective"},"office/quango":{"name":"Quasi-NGO Office","terms":"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{"name":"Research Office","terms":""},"office/surveyor":{"name":"Surveyor Office","terms":""},"office/tax_advisor":{"name":"Tax Advisor Office","terms":"tax,tax consultant"},"office/telecommunication":{"name":"Telecom Office","terms":"communication,internet,phone,voice"},"office/therapist":{"name":"Therapist Office","terms":"therapy"},"office/water_utility":{"name":"Water Utility Office","terms":"water board,utility"},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{"name":"Islet","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"place/plot":{"name":"Plot","terms":"tract,land,lot,parcel"},"place/quarter":{"name":"Sub-Borough / Quarter","terms":"boro,borough,quarter"},"place/square":{"name":"Square","terms":""},"place/suburb":{"name":"Borough / Suburb","terms":"boro,borough,quarter"},"place/town":{"name":"Town","terms":""},"place/village":{"name":"Village","terms":""},"playground/balance_beam":{"name":"Play Balance Beam","terms":""},"playground/basket_spinner":{"name":"Basket Spinner","terms":"basket rotator"},"playground/basket_swing":{"name":"Basket Swing","terms":""},"playground/climbing_frame":{"name":"Climbing Frame","terms":""},"playground/cushion":{"name":"Bouncy Cushion","terms":""},"playground/horizontal_bar":{"name":"Play Horizontal Bar","terms":"high bar"},"playground/rocker":{"name":"Spring Rider","terms":"spring rocker,springy rocker"},"playground/roundabout":{"name":"Play Roundabout","terms":"merry-go-round"},"playground/sandpit":{"name":"Sandpit","terms":""},"playground/seesaw":{"name":"Seesaw","terms":""},"playground/slide":{"name":"Slide","terms":""},"playground/structure":{"name":"Play Structure","terms":""},"playground/swing":{"name":"Swing","terms":""},"playground/zipwire":{"name":"Zip Wire","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{"name":"Nuclear Reactor","terms":"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{"name":"Wind Turbine","terms":"generator,turbine,windmill,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/switch":{"name":"Power Switch","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/linear_platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{"name":"Aerialway Stop / Platform","terms":"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{"name":"Bus Stop / Platform","terms":"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{"name":"Ferry Stop / Platform","terms":"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{"name":"Light Rail Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{"name":"Monorail Stop / Platform","terms":"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{"name":"Subway Stop / Platform","terms":"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{"name":"Train Stop / Platform","terms":"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{"name":"Tram Stop / Platform","terms":"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{"name":"Trolleybus Stop / Platform","terms":"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{"name":"Transit Stop / Platform","terms":"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{"name":"Aerialway Station","terms":"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{"name":"Bus Station / Terminal","terms":"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{"name":"Ferry Station / Terminal","terms":"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{"name":"Light Rail Station","terms":"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{"name":"Monorail Station","terms":"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{"name":"Subway Station","terms":"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{"name":"Train Station (Halt / Request)","terms":"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{"name":"Train Station","terms":"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{"name":"Tram Station","terms":"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{"name":"Trolleybus Station / Terminal","terms":"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{"name":"Transit Station","terms":"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{"name":"Transit Stop Area","terms":""},"public_transport/stop_position_aerialway":{"name":"Aerialway Stopping Location","terms":"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{"name":"Bus Stopping Location","terms":"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{"name":"Ferry Stopping Location","terms":"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{"name":"Light Rail Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{"name":"Monorail Stopping Location","terms":"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{"name":"Subway Stopping Location","terms":"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{"name":"Train Stopping Location","terms":"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{"name":"Tram Stopping Location","terms":"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{"name":"Trolleybus Stopping Location","terms":"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{"name":"Transit Stopping Location","terms":"public transit,public transportation,transit,transportation"},"railway/halt":{"name":"Train Station (Halt / Request)","terms":"break,interrupt,rest,wait,interruption"},"railway/platform":{"name":"Train Stop / Platform","terms":""},"railway/station":{"name":"Train Station","terms":"train station,station"},"railway/tram_stop":{"name":"Tram Stopping Position","terms":"light rail,streetcar,tram,trolley"},"railway/abandoned":{"name":"Abandoned Railway","terms":""},"railway/buffer_stop":{"name":"Buffer Stop","terms":"stop,halt,buffer"},"railway/crossing":{"name":"Railway Crossing (Path)","terms":"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{"name":"Railway Derailer","terms":"derailer"},"railway/disused":{"name":"Disused Railway","terms":""},"railway/funicular":{"name":"Funicular","terms":"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{"name":"Light Rail","terms":"light rail,streetcar,trolley"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/miniature":{"name":"Miniature Railway","terms":"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/subway_entrance":{"name":"Subway Entrance","terms":"metro,transit"},"railway/subway":{"name":"Subway","terms":"metro,transit"},"railway/switch":{"name":"Railway Switch","terms":"switch,points"},"railway/train_wash":{"name":"Train Wash","terms":"wash,clean"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/agrarian":{"name":"Agriculture Shop","terms":"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":"sweet"},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tiles":{"name":"Tile Shop","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/trade":{"name":"Trade Shop","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":"climbing hut"},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Holiday Cottage","terms":"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{"name":"Art Gallery","terms":"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{"name":"Guest House","terms":"B&B,Bed and Breakfast"},"tourism/hostel":{"name":"Hostel","terms":""},"tourism/hotel":{"name":"Hotel","terms":""},"tourism/information":{"name":"Information","terms":""},"tourism/information/board":{"name":"Information Board","terms":""},"tourism/information/guidepost":{"name":"Guidepost","terms":"signpost"},"tourism/information/map":{"name":"Map","terms":""},"tourism/information/office":{"name":"Tourist Information Office","terms":""},"tourism/motel":{"name":"Motel","terms":""},"tourism/museum":{"name":"Museum","terms":"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{"name":"Picnic Site","terms":"camp"},"tourism/theme_park":{"name":"Theme Park","terms":""},"tourism/viewpoint":{"name":"Viewpoint","terms":""},"tourism/wilderness_hut":{"name":"Wilderness Hut","terms":"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Speed Table","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","terms":""},"type/route_master":{"name":"Route Master","terms":""},"type/route":{"name":"Route","terms":""},"type/route/bicycle":{"name":"Cycle Route","terms":""},"type/route/bus":{"name":"Bus Route","terms":""},"type/route/detour":{"name":"Detour Route","terms":""},"type/route/ferry":{"name":"Ferry Route","terms":""},"type/route/foot":{"name":"Foot Route","terms":""},"type/route/hiking":{"name":"Hiking Route","terms":""},"type/route/horse":{"name":"Riding Route","terms":""},"type/route/light_rail":{"name":"Light Rail Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/piste":{"name":"Piste/Ski Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/subway":{"name":"Subway Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"type/waterway":{"name":"Waterway","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{"name":"Intermittent Stream","terms":"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{"attribution":{"text":"Terms & Feedback"},"description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","name":"DigitalGlobe Standard Imagery Vintage"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"EsriWorldImageryClarity":{"attribution":{"text":"Terms & Feedback"},"description":"Esri archive imagery that may be clearer and more accurate than the default layer.","name":"Esri World Imagery (Clarity) Beta"},"MAPNIK":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"description":"The default OpenStreetMap layer.","name":"OpenStreetMap (Standard)"},"Mapbox":{"attribution":{"text":"Terms & Feedback"},"description":"Satellite and aerial imagery.","name":"Mapbox Satellite"},"OSM_Inspector-Addresses":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Area"},"OSM_Inspector-Places":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Places"},"OSM_Inspector-Routing":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Tagging"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"US-TIGER-Roads-2014":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"TIGER Roads 2014"},"US-TIGER-Roads-2017":{"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","name":"TIGER Roads 2017"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"mapbox_locator_overlay":{"attribution":{"text":"Terms & Feedback"},"description":"Shows major features to help orient you.","name":"Locator Overlay"},"openpt_map":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenPT Map (overlay)"},"osm-gps":{"attribution":{"text":"© OpenStreetMap contributors"},"description":"Public GPS traces uploaded to OpenStreetMap.","name":"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (German Style)"},"qa_no_address":{"attribution":{"text":"Simon Poole, Data ©OpenStreetMap contributors"},"name":"QA No Address"},"skobbler":{"attribution":{"text":"© Tiles: skobbler Map data: OpenStreetMap contributors"},"name":"skobbler"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
 
-var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2013-06-01T00:00:00.000Z","startDate":"2013-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"description":"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{"id":"sjcgis.org-Aerials_2016_WM","name":"2016 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2016-07-01T00:00:00.000Z","startDate":"2016-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"best":true,"description":"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{"id":"OS7","name":"7th Series (OS7)","type":"tms","template":"http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"http://agri.openstreetmap.org/{zoom}/{x}/{y}.png","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"id":"lu.geoportail.opendata.basemap","name":"Basemap geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"basemap.at","name":"basemap.at","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"basemap.at-orthofoto","name":"basemap.at Orthofoto","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","best":true,"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"bavaria-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]]},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"British_Columbia_Mosaic","name":"British Columbia Mosaic","type":"tms","template":"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png","endDate":"2013-06-01T00:00:00.000Z","startDate":"2009-01-01T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"terms_url":"http://imagery.paulnorman.ca/tiles/about.html","terms_text":"Copyright Province of British Columbia, City of Surrey"},{"id":"lu.geoportail.opendata.cadastre","name":"Cadastre geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"terms_url":"http://www.osm-tools.org/","terms_text":"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"http://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{"id":"South_Africa-CapeTown-Aerial","name":"City of Cape Town 2015 Aerial","type":"tms","template":"http://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","best":true,"description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{"id":"CRAIG-Auvergne-2013","name":"CRAIG - Auvergne 2013 - 25 cm","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"terms_url":"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer","terms_text":"Digital Aerial Solutions, LLC","description":"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{"id":"DigitalGlobe-Premium","name":"DigitalGlobe Premium Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNXltOTBucm0yd3BtY3E5czl6NmYifQ.qJJsPgCjyzMCm3YG3YWQBQ","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Premium-vintage","name":"DigitalGlobe Premium Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"DigitalGlobe-Standard","name":"DigitalGlobe Standard Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNW9qZjBudmgzMnA1a294OGRtNm8ifQ.06mo-nDisy4KmqjYxEVwQw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Standard-vintage","name":"DigitalGlobe Standard Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg==","overlay":true},{"id":"EsriWorldImagery","name":"Esri World Imagery","type":"tms","template":"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,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"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://kaart.maakaart.ee/orto/{zoom}/{x}/{y}.jpeg","scaleExtent":[14,18],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"id":"FOMI_2000","name":"FÖMI orthophoto 2000","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FOMI_2005","name":"FÖMI orthophoto 2005","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg","endDate":"2005-01-01T00:00:00.000Z","startDate":"2005-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FR-BAN","name":"FR-BAN","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","terms_text":"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL","description":"French address registry or Base Adresses Nationale"},{"id":"FR-Cadastre","name":"FR-Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,22],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation","terms_text":"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{"id":"Freemap.sk-Car","name":"Freemap.sk Car","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"IBGE_DF_Addresses","name":"IBGE Distrito Federal","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"description":"Addresses data from IBGE","overlay":true},{"id":"IBGE_Setores_Rurais","name":"IBGE Mapa de Setores Rurais","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_Setores_Urbanos","name":"IBGE Mapa de Setores Urbanos","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"id":"osmim-imagicode-S2A_R119_N09_20160327T050917","name":"imagico.de OSM images for mapping: Adams Bridge","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}","endDate":"2016-03-27T00:00:00.000Z","startDate":"2016-03-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Supplementing incomplete coverage in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80700162014211LGN00","name":"imagico.de OSM images for mapping: Alaska Range","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-07-31T00:00:00.000Z","startDate":"2014-07-31T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent summer image of the Alaska Range for mapping natural features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral2","name":"imagico.de OSM images for mapping: Aral Sea (high water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}","endDate":"2016-03-03T00:00:00.000Z","startDate":"2016-03-03T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral1","name":"imagico.de OSM images for mapping: Aral Sea (low water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}","endDate":"2016-09-09T00:00:00.000Z","startDate":"2016-09-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170417T140051","name":"imagico.de OSM images for mapping: Bahía Blanca (high tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-04-17T00:00:00.000Z","startDate":"2017-04-17T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170127T140051","name":"imagico.de OSM images for mapping: Bahía Blanca (low tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-01-27T00:00:00.000Z","startDate":"2017-01-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81190582014075LGN00","name":"imagico.de OSM images for mapping: Bakun Reservoir","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-03-16T00:00:00.000Z","startDate":"2014-03-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in older pre-2011 images (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81250592016107LGN00","name":"imagico.de OSM images for mapping: Batam","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80770232017156LGN00","name":"imagico.de OSM images for mapping: Bogoslof Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}","endDate":"2017-06-05T00:00:00.000Z","startDate":"2017-06-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image from after the eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81800982013291LGN00","name":"imagico.de OSM images for mapping: Bouvet Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-18T00:00:00.000Z","startDate":"2013-10-18T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","best":true,"description":"For more accurate coastline and glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R065_N47_20160929T102022","name":"imagico.de OSM images for mapping: Cental Alps in late September 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}","endDate":"2016-09-29T00:00:00.000Z","startDate":"2016-09-29T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82050982015344LGN00","name":"imagico.de OSM images for mapping: Clerke Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-10T00:00:00.000Z","startDate":"2015-12-10T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R086_N60_20160831T213532","name":"imagico.de OSM images for mapping: Cook Inlet","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}","endDate":"2016-08-31T00:00:00.000Z","startDate":"2016-08-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and glaciers in surrounding mountains (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0040712016264110KF","name":"imagico.de OSM images for mapping: Coropuna","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-09-21T00:00:00.000Z","startDate":"2016-09-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R022_N06_20151221T103009","name":"imagico.de OSM images for mapping: Cotonou","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}","endDate":"2015-12-21T00:00:00.000Z","startDate":"2015-12-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Patchy and partly cloudy coverage in usual sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R040_N01_20160311T164128","name":"imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}","endDate":"2016-03-11T00:00:00.000Z","startDate":"2016-03-11T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image, only old and poor images in other sources currently (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80360072014245LGN00","name":"imagico.de OSM images for mapping: Eastern Devon Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-09-02T00:00:00.000Z","startDate":"2014-09-02T00:00:00.000Z","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82160152013239LGN00","name":"imagico.de OSM images for mapping: Eastern Iceland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-08-27T00:00:00.000Z","startDate":"2013-08-27T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492","name":"imagico.de OSM images for mapping: El Altar","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}","endDate":"2012-02-05T00:00:00.000Z","startDate":"2012-02-05T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R009_S61_20160109","name":"imagico.de OSM images for mapping: Elephant Island/Clarence Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}","endDate":"2016-01-09T00:00:00.000Z","startDate":"2016-01-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Fairly clear up-to-date image for updating glacier edges (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-enderby","name":"imagico.de OSM images for mapping: Enderby Land and Kemp Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}","endDate":"2017-03-27T00:00:00.000Z","startDate":"2017-01-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 images of Enderby Land and Kemp Coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100502015347LGN00","name":"imagico.de OSM images for mapping: Fogo, Cape Verde","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2014/2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-greenland","name":"imagico.de OSM images for mapping: Greenland mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Landsat mosaic of Greenland (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R047_S54_20160411T044330","name":"imagico.de OSM images for mapping: Heard Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}","endDate":"2016-04-12T00:00:00.000Z","startDate":"2016-04-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82280982013259LGN00","name":"imagico.de OSM images for mapping: Isla Londonderry","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-16T00:00:00.000Z","startDate":"2013-09-16T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20151008","name":"imagico.de OSM images for mapping: Kangerlussuaq Autumn","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}","endDate":"2015-10-08T00:00:00.000Z","startDate":"2015-10-08T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20160518","name":"imagico.de OSM images for mapping: Kangerlussuaq Spring","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}","endDate":"2016-05-18T00:00:00.000Z","startDate":"2016-05-18T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and roads - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R021_N44_20160807T083013","name":"imagico.de OSM images for mapping: Kerch Strait","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}","endDate":"2016-08-07T00:00:00.000Z","startDate":"2016-08-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"State of bridge construction in August 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar2","name":"imagico.de OSM images for mapping: Landsat off-nadir July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}","endDate":"2016-07-17T00:00:00.000Z","startDate":"2016-07-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Latest images north of the regular Landsat limit (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de OSM images for mapping: Leskov Island ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}","endDate":"2013-11-16T00:00:00.000Z","startDate":"2013-11-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81991002015286LGN00","name":"imagico.de OSM images for mapping: Leskov Island Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar","name":"imagico.de OSM images for mapping: May 2013 off-nadir Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}","endDate":"2013-05-17T00:00:00.000Z","startDate":"2013-05-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S02_20160613T075613","name":"imagico.de OSM images for mapping: Mount Kenya 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}","endDate":"2016-06-13T00:00:00.000Z","startDate":"2016-06-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S05_20160802T075556","name":"imagico.de OSM images for mapping: Mount Kilimanjaro 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}","endDate":"2016-08-02T00:00:00.000Z","startDate":"2016-08-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80940622015159LGN00","name":"imagico.de OSM images for mapping: New Ireland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-06-08T00:00:00.000Z","startDate":"2015-06-08T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Many missing islands in OSM (mostly mapped meanwhile) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2016","name":"imagico.de OSM images for mapping: North Sea Coast 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-09-25T00:00:00.000Z","startDate":"2016-09-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2017","name":"imagico.de OSM images for mapping: North Sea Coast 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-06-02T00:00:00.000Z","startDate":"2017-06-02T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ural_s2_2016","name":"imagico.de OSM images for mapping: Northern and Polar Ural mountains August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ndvina","name":"imagico.de OSM images for mapping: Northern Dvina delta at low tide","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}","endDate":"2015-09-13T00:00:00.000Z","startDate":"2015-09-13T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Beaches, tidal flats and other costal forms (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast","name":"imagico.de OSM images for mapping: Northern Ellesmere Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-07-09T00:00:00.000Z","startDate":"2012-07-09T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2012 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast_2016","name":"imagico.de OSM images for mapping: Northern Ellesmere Island July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}","endDate":"2012-07-15T00:00:00.000Z","startDate":"2012-07-08T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2016 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00vis","name":"imagico.de OSM images for mapping: Northern German west coast tidalflats","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00ir","name":"imagico.de OSM images for mapping: Northern German west coast tidalflats (infrared)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ngreenland_ast","name":"imagico.de OSM images for mapping: Northern Greenland ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-08-13T00:00:00.000Z","startDate":"2005-06-21T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A1350972013086110KF","name":"imagico.de OSM images for mapping: Northwest Heard Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}","endDate":"2013-03-13T00:00:00.000Z","startDate":"2013-03-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R111_N09_20160604T154554","name":"imagico.de OSM images for mapping: Panama Canal","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}","endDate":"2016-06-07T00:00:00.000Z","startDate":"2016-06-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Images of the new locks (but partly cloudy) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0120532016364110KF","name":"imagico.de OSM images for mapping: Panama Canal - Pacific side","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-12-30T00:00:00.000Z","startDate":"2016-12-30T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N68_20160930T081002","name":"imagico.de OSM images for mapping: Pechora Sea Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}","endDate":"2016-09-30T00:00:00.000Z","startDate":"2016-09-30T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81511242016033LGN00","name":"imagico.de OSM images for mapping: Pensacola Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-02T00:00:00.000Z","startDate":"2016-02-02T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R136_N41_20150831T093006","name":"imagico.de OSM images for mapping: Prokletije Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}","endDate":"2015-08-31T00:00:00.000Z","startDate":"2015-08-31T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142622_03746_20110415_17533956","name":"imagico.de OSM images for mapping: Qasigiannguit","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}","endDate":"2011-04-15T00:00:00.000Z","startDate":"2011-04-15T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81510432015030LGN00","name":"imagico.de OSM images for mapping: Rann of Kutch","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R093_N41_20150828T092005","name":"imagico.de OSM images for mapping: Rila and Pirin Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}","endDate":"2015-08-28T00:00:00.000Z","startDate":"2015-08-28T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81730602015040LGN00","name":"imagico.de OSM images for mapping: Rwenzori Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-02-09T00:00:00.000Z","startDate":"2015-02-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N01_20160702T082522","name":"imagico.de OSM images for mapping: Rwenzori Mountains 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}","endDate":"2016-07-02T00:00:00.000Z","startDate":"2016-07-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80611072014036LGN00","name":"imagico.de OSM images for mapping: Scott Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-02-05T00:00:00.000Z","startDate":"2014-02-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100972015347LGN00","name":"imagico.de OSM images for mapping: Shag Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81130622013270LGN00","name":"imagico.de OSM images for mapping: Southeastern Sulawesi","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-27T00:00:00.000Z","startDate":"2013-09-27T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80281222016035LGN00","name":"imagico.de OSM images for mapping: Southern Transantarctic Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-04T00:00:00.000Z","startDate":"2016-02-04T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81030632015286LGN00","name":"imagico.de OSM images for mapping: Sudirman Range 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R088_S05_20160812T011732","name":"imagico.de OSM images for mapping: Sudirman Range 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Cloud free image of the Sudirman Range but with fresh snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-s2sval","name":"imagico.de OSM images for mapping: Svalbard mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 mosaic of Svalbard (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx","name":"imagico.de OSM images for mapping: Thule Air Base","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}","endDate":"2011-05-07T00:00:00.000Z","startDate":"2011-05-07T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule2_2015.09.25","name":"imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.10.06","name":"imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}","endDate":"2015-10-06T00:00:00.000Z","startDate":"2015-10-06T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.09.25","name":"imagico.de OSM images for mapping: Thule Airbase DMS overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R094_N79_20160812T105622","name":"imagico.de OSM images for mapping: Ushakov Island August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80910682014358LGN00","name":"imagico.de OSM images for mapping: Vanatinai","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-12-24T00:00:00.000Z","startDate":"2014-12-24T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coarse coastline due to cloud cover in Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82330892016031LGN00","name":"imagico.de OSM images for mapping: Volcán Calbuco","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-31T00:00:00.000Z","startDate":"2016-01-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R089_N52_20160623T024048","name":"imagico.de OSM images for mapping: Vostochny Cosmodrome","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}","endDate":"2016-06-23T00:00:00.000Z","startDate":"2016-06-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81490352013282LGN00","name":"imagico.de OSM images for mapping: Western Karakoram","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-09T00:00:00.000Z","startDate":"2013-10-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R039_S15_20160510T145731","name":"imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}","endDate":"2016-05-10T00:00:00.000Z","startDate":"2016-05-10T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Poor and outdated imagery in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"bartholomew_qi1940","name":"Ireland Bartholomew Quarter-Inch 1940","type":"tms","template":"http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png","scaleExtent":[5,13],"polygon":[[[-8.8312773,55.3963337],[-7.3221271,55.398605],[-7.2891331,55.4333162],[-7.2368042,55.4530757],[-7.18881,55.4497995],[-7.1528144,55.3968384],[-6.90561,55.394903],[-6.9047153,55.3842114],[-5.8485282,55.3922956],[-5.8378629,55.248676],[-5.3614762,55.2507024],[-5.3899172,53.8466464],[-5.8734141,53.8487436],[-5.8983,52.8256258],[-6.0191742,52.8256258],[-6.0262844,51.7712367],[-8.1131422,51.7712367],[-8.1273627,51.3268839],[-10.6052842,51.3091083],[-10.6271879,52.0328254],[-10.6469845,52.0322454],[-10.6469845,52.0440365],[-10.6271879,52.0448095],[-10.6290733,52.0745627],[-10.6699234,52.0743695],[-10.6702376,52.0876941],[-10.6312729,52.0898179],[-10.6393128,52.4147202],[-10.3137689,52.4185533],[-10.3166401,53.3341342],[-10.3699669,53.3330727],[-10.385965,54.3534472],[-8.8163777,54.3586265],[-8.8173427,54.6595721],[-8.8413398,54.6616284],[-8.8422286,54.6929749],[-8.8315632,54.7145436],[-8.8151208,54.7145436],[-8.8312773,55.3963337]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"GSGS4136","name":"Ireland British War Office One-Inch 1941-43 GSGS 4136","type":"tms","template":"http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png","scaleExtent":[5,15],"polygon":[[[-10.0847426,51.4147902],[-10.0906535,51.5064103],[-10.4564222,51.5003961],[-10.5005905,52.3043019],[-10.0837522,52.312741],[-10.0840973,52.3404698],[-10.055802,52.3408915],[-10.0768509,52.7628238],[-9.7780248,52.7684611],[-9.7818205,52.8577261],[-9.6337877,52.8596012],[-9.6449626,53.1294502],[-10.0919663,53.1227152],[-10.1051422,53.3912913],[-10.4052593,53.3866349],[-10.4530828,54.193502],[-10.2998523,54.1974988],[-10.3149801,54.4669592],[-8.9276095,54.4853897],[-8.9339534,54.7546562],[-8.7773069,54.755501],[-8.7826749,55.0252208],[-8.9402974,55.0238221],[-8.9451773,55.2934155],[-7.528039,55.2970274],[-7.525599,55.3874955],[-7.0541955,55.3841691],[-7.0556595,55.2939712],[-6.3241545,55.2859128],[-6.3217146,55.3253556],[-6.1035807,55.3223016],[-6.1045566,55.2828557],[-5.7985836,55.2772968],[-5.8117595,55.0087135],[-5.656577,55.0056351],[-5.6721928,54.7355021],[-5.3618278,54.729585],[-5.3964755,54.1917889],[-5.855679,54.2017807],[-5.9220464,52.8524504],[-6.070885,52.8551025],[-6.1030927,52.1373337],[-6.8331336,52.1463183],[-6.8355736,52.0578908],[-7.5641506,52.0617913],[-7.5661026,51.7921593],[-8.147305,51.792763],[-8.146329,51.7033331],[-8.2912636,51.7027283],[-8.2897996,51.5227274],[-9.1174397,51.516958],[-9.1179277,51.4625685],[-9.3692452,51.4616564],[-9.3672933,51.4254613],[-10.0847426,51.4147902]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"http://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[12,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]]},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],"terms_text":"Kanton Basel-Stadt OF 2015"},{"id":"KTBASELSTADT2017","name":"Kanton Basel-Stadt 2017","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.6713752,47.5952248],[7.6799583,47.6007811],[7.6845073,47.6018228],[7.6943779,47.601707],[7.6939487,47.5966718],[7.6870823,47.5935462],[7.6788425,47.5871208],[7.685709,47.585384],[7.6890564,47.5761205],[7.6941204,47.573399],[7.6924038,47.5669132],[7.6847005,47.5617009],[7.6642513,47.5616429],[7.6487159,47.5568934],[7.6303482,47.558689],[7.6235675,47.5566617],[7.6278591,47.5514483],[7.6273763,47.5365801],[7.6183319,47.5366163],[7.6133537,47.5326179],[7.5996208,47.5191137],[7.5850296,47.5191717],[7.5840854,47.5263589],[7.5771331,47.5316327],[7.581253,47.5398612],[7.5718975,47.5414835],[7.553873,47.5414835],[7.5537872,47.5512166],[7.5565338,47.5582836],[7.5537014,47.5603108],[7.5537872,47.5747308],[7.5643444,47.5812157],[7.5793647,47.579884],[7.583313,47.5901889],[7.5856304,47.5923306],[7.5920677,47.5923885],[7.598505,47.5907098],[7.609148,47.5864261],[7.6092338,47.5810999],[7.6191043,47.580463],[7.6368713,47.593141],[7.6378154,47.595572],[7.6416778,47.5988711],[7.6452827,47.6002602],[7.664938,47.5961798],[7.6713752,47.5952248]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn 25cm (SOGIS 2014-2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[15,19],"polygon":[[[7.3404127,47.2175697],[7.4154818,47.2402115],[7.4173645,47.2537956],[7.4658424,47.2646513],[7.4946766,47.2882287],[7.5328638,47.294534],[7.5483333,47.3163566],[7.5709479,47.3263111],[7.5604584,47.342492],[7.5388991,47.3476266],[7.5396485,47.3601134],[7.5217459,47.3651488],[7.5237238,47.3720704],[7.4634937,47.3702566],[7.4361035,47.3781317],[7.4434011,47.4023143],[7.4774682,47.4012772],[7.4792364,47.3897076],[7.5022557,47.384807],[7.5213659,47.3912021],[7.5311724,47.4035251],[7.5252352,47.4116329],[7.5807413,47.414704],[7.5682954,47.4223349],[7.5689044,47.436897],[7.5812069,47.4287807],[7.6157989,47.4327479],[7.6260723,47.4629139],[7.6044949,47.4704455],[7.6072998,47.4893984],[7.640966,47.4827341],[7.6559259,47.4873946],[7.6521711,47.4958144],[7.6661209,47.4968682],[7.6683266,47.4863467],[7.699761,47.4806325],[7.709878,47.4693848],[7.6848538,47.4478436],[7.6798021,47.417514],[7.6327228,47.4100311],[7.633317,47.382914],[7.6417611,47.3804694],[7.6442033,47.3672084],[7.7279138,47.3688589],[7.751519,47.3443275],[7.7935609,47.3390523],[7.8021665,47.3610959],[7.8788122,47.3835105],[7.8691367,47.3955143],[7.883332,47.4060973],[7.9097377,47.398521],[7.9550377,47.4156057],[7.9618317,47.4218343],[7.9467846,47.4431934],[7.9682836,47.4628082],[7.9872707,47.4287435],[7.9854653,47.4227641],[7.9827035,47.4283325],[7.9631993,47.4223547],[8.0072617,47.4065858],[8.0100022,47.395418],[8.0265612,47.3956224],[8.0313669,47.3836856],[8.0038366,47.3453146],[8.0051906,47.3367516],[7.9479701,47.3171432],[7.9478307,47.3325169],[7.9192088,47.3339507],[7.9078055,47.341719],[7.889098,47.3114878],[7.8611018,47.3061239],[7.8418057,47.2744707],[7.8166423,47.2616706],[7.8028241,47.2684079],[7.7861469,47.256098],[7.7746009,47.267869],[7.7568187,47.258095],[7.7326672,47.2591133],[7.684769,47.2939919],[7.6482742,47.2819898],[7.5801066,47.2763483],[7.5936981,47.2662199],[7.5959384,47.245569],[7.6261802,47.2263143],[7.6405558,47.2297944],[7.6484666,47.2189525],[7.6472258,47.2017823],[7.6715278,47.1949714],[7.6711002,47.1845216],[7.6779881,47.1819259],[7.6728612,47.1683945],[7.6600808,47.1684026],[7.6451021,47.1489207],[7.6155322,47.1565739],[7.5861404,47.1475453],[7.5810534,47.16013],[7.5634674,47.1683541],[7.5257686,47.162205],[7.5203336,47.1588879],[7.5297508,47.1487369],[7.5097234,47.1255457],[7.4613252,47.1082327],[7.4750945,47.0867101],[7.454461,47.074927],[7.4354156,47.0801664],[7.4340002,47.1005003],[7.3820271,47.0957398],[7.3704914,47.1209312],[7.4401788,47.1237276],[7.4217922,47.1358605],[7.447783,47.1550805],[7.4728074,47.1525609],[7.4970383,47.1700873],[7.4804964,47.171738],[7.4708545,47.181324],[7.4757226,47.1906485],[7.4497638,47.1895691],[7.4476258,47.1810839],[7.4332849,47.1847269],[7.4118135,47.1624212],[7.3842442,47.1601249],[7.3821749,47.1651186],[7.391911,47.1662739],[7.3835137,47.1803011],[7.3654609,47.1944525],[7.3544799,47.1915316],[7.3404127,47.2175697]],[[7.420816,47.4803666],[7.4349836,47.4981011],[7.4707584,47.480734],[7.487277,47.4820136],[7.5116652,47.5026958],[7.5317892,47.4973989],[7.5366964,47.4850517],[7.5274454,47.4739062],[7.5306791,47.4611886],[7.4565122,47.4492558],[7.445214,47.4623781],[7.4557367,47.4733767],[7.420816,47.4803666]],[[7.3759458,47.4140995],[7.3821514,47.4330266],[7.4209041,47.4459442],[7.4378427,47.4463232],[7.4555765,47.4279232],[7.4437574,47.413444],[7.3759458,47.4140995]],[[7.6744234,47.1539707],[7.6853662,47.1662986],[7.7007985,47.1617746],[7.6901531,47.1525567],[7.6744234,47.1539707]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015  10cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"id":"kelowna_2012","name":"Kelowna 2012","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png","endDate":"2012-05-14T00:00:00.000Z","startDate":"2012-05-13T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"description":"High quality aerial imagery taken for the City of Kelowna"},{"id":"kelowna_roads","name":"Kelowna Roads overlay","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"overlay":true},{"id":"landsat_233055","name":"Landsat 233055","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png","endDate":"2013-09-03T00:00:00.000Z","startDate":"2013-09-03T00:00:00.000Z","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"id":"landsat_047026","name":"Latest southwest British Columbia Landsat","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png","endDate":"2013-09-12T00:00:00.000Z","startDate":"2013-09-12T00:00:00.000Z","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"id":"LINZ_NZ_Aerial_Imagery","name":"LINZ NZ Aerial Imagery","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.0","best":true},{"id":"LINZ_NZ_Topo50_Gridless_Maps","name":"LINZ NZ Topo50 Gridless Maps","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://www.geoportal.lt","terms_text":"NŽT ORT10LT","best":true},{"id":"mapbox_locator_overlay","name":"Locator Overlay","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"id":"londrina2011","name":"Londrina Ortofoto 2011","type":"tms","template":"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"terms_url":"http://siglon.londrina.pr.gov.br/","terms_text":"Prefeitura do Londrinas, PR"},{"id":"NSW_LPI_BaseMap","name":"LPI NSW Base Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"NSW_LPI_Imagery","name":"LPI NSW Imagery","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","best":true},{"id":"NSW_LPI_TopographicMap","name":"LPI NSW Topographic Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgODAuNDcgMjAuMDIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDgwLjQ3IDIwLjAyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe29wYWNpdHk6MC42O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30uc3Qxe29wYWNpdHk6MC42O2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fTwvc3R5bGU+PGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTc5LjI5LDEzLjYxYzAsMC4xMS0wLjA5LDAuMi0wLjIsMC4yaC0xLjUzYy0wLjEyLDAtMC4yMy0wLjA2LTAuMjktMC4xNmwtMS4zNy0yLjI4bC0xLjM3LDIuMjhjLTAuMDYsMC4xLTAuMTcsMC4xNi0wLjI5LDAuMTZoLTEuNTNjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMS0wLjAzYy0wLjA5LTAuMDYtMC4xMi0wLjE4LTAuMDYtMC4yN2MwLDAsMCwwLDAsMGwyLjMxLTMuNWwtMi4yOC0zLjQ3Yy0wLjAyLTAuMDMtMC4wMy0wLjA3LTAuMDMtMC4xMWMwLTAuMTEsMC4wOS0wLjIsMC4yLTAuMmgxLjUzYzAuMTIsMCwwLjIzLDAuMDYsMC4yOSwwLjE2bDEuMzQsMi4yNWwxLjMzLTIuMjRjMC4wNi0wLjEsMC4xNy0wLjE2LDAuMjktMC4xNmgxLjUzYzAuMDQsMCwwLjA4LDAuMDEsMC4xMSwwLjAzYzAuMDksMC4wNiwwLjEyLDAuMTgsMC4wNiwwLjI3YzAsMCwwLDAsMCwwTDc2Ljk2LDEwbDIuMzEsMy41Qzc5LjI4LDEzLjUzLDc5LjI5LDEzLjU3LDc5LjI5LDEzLjYxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02My4wOSw5LjE2Yy0wLjM3LTEuNzktMS44Ny0zLjEyLTMuNjYtMy4xMmMtMC45OCwwLTEuOTMsMC40LTIuNiwxLjEyVjMuMzdjMC0wLjEyLTAuMS0wLjIyLTAuMjItMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjIsMC4xLTAuMjIsMC4yMnYxMC4yMWMwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMnYtMC43YzAuNjgsMC43MSwxLjYyLDEuMTIsMi42LDEuMTJjMS43OSwwLDMuMjktMS4zNCwzLjY2LTMuMTNDNjMuMjEsMTAuMyw2My4yMSw5LjcyLDYzLjA5LDkuMTZMNjMuMDksOS4xNnogTTU5LjEyLDEyLjQxYy0xLjI2LDAtMi4yOC0xLjA2LTIuMy0yLjM2VjkuOTljMC4wMi0xLjMxLDEuMDQtMi4zNiwyLjMtMi4zNnMyLjMsMS4wNywyLjMsMi4zOVM2MC4zOSwxMi40MSw1OS4xMiwxMi40MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNjguMjYsNi4wNGMtMS44OS0wLjAxLTMuNTQsMS4yOS0zLjk2LDMuMTNjLTAuMTIsMC41Ni0wLjEyLDEuMTMsMCwxLjY5YzAuNDIsMS44NSwyLjA3LDMuMTYsMy45NywzLjE0YzIuMjQsMCw0LjA2LTEuNzgsNC4wNi0zLjk5UzcwLjUxLDYuMDQsNjguMjYsNi4wNHogTTY4LjI0LDEyLjQyYy0xLjI3LDAtMi4zLTEuMDctMi4zLTIuMzlzMS4wMy0yLjQsMi4zLTIuNHMyLjMsMS4wNywyLjMsMi4zOVM2OS41MSwxMi40MSw2OC4yNCwxMi40Mkw2OC4yNCwxMi40MnoiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTkuMTIsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNjAuMzksNy42Myw1OS4xMiw3LjYzeiBNNTkuMTIsMTEuMjNjLTAuNiwwLTEuMDktMC41My0xLjExLTEuMTlWMTBjMC4wMS0wLjY2LDAuNTEtMS4xOSwxLjExLTEuMTlzMS4xMSwwLjU0LDEuMTEsMS4yMVM1OS43NCwxMS4yMyw1OS4xMiwxMS4yM3oiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjguMjQsNy42M2MtMS4yNywwLTIuMywxLjA3LTIuMywyLjM5czEuMDMsMi4zOSwyLjMsMi4zOXMyLjMtMS4wNywyLjMtMi4zOVM2OS41MSw3LjYzLDY4LjI0LDcuNjN6IE02OC4yNCwxMS4yM2MtMC42MSwwLTEuMTEtMC41NC0xLjExLTEuMjFzMC41LTEuMiwxLjExLTEuMnMxLjExLDAuNTQsMS4xMSwxLjIxUzY4Ljg1LDExLjIzLDY4LjI0LDExLjIzeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00My41Niw2LjI0aC0xLjMzYy0wLjEyLDAtMC4yMiwwLjEtMC4yMiwwLjIydjAuN2MtMC42OC0wLjcxLTEuNjItMS4xMi0yLjYtMS4xMmMtMi4wNywwLTMuNzUsMS43OC0zLjc1LDMuOTlzMS42OSwzLjk5LDMuNzUsMy45OWMwLjk5LDAsMS45My0wLjQxLDIuNi0xLjEzdjAuN2MwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMlY2LjQ0YzAtMC4xMS0wLjA5LTAuMjEtMC4yMS0wLjIxQzQzLjU3LDYuMjQsNDMuNTcsNi4yNCw0My41Niw2LjI0eiBNNDIuMDIsMTAuMDVjLTAuMDEsMS4zMS0xLjA0LDIuMzYtMi4zLDIuMzZzLTIuMy0xLjA3LTIuMy0yLjM5czEuMDMtMi40LDIuMjktMi40YzEuMjcsMCwyLjI4LDEuMDYsMi4zLDIuMzZMNDIuMDIsMTAuMDV6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTM5LjcyLDcuNjNjLTEuMjcsMC0yLjMsMS4wNy0yLjMsMi4zOXMxLjAzLDIuMzksMi4zLDIuMzlzMi4yOC0xLjA2LDIuMy0yLjM2VjkuOTlDNDIsOC42OCw0MC45OCw3LjYzLDM5LjcyLDcuNjN6IE0zOC42MiwxMC4wMmMwLTAuNjcsMC41LTEuMjEsMS4xMS0xLjIxYzAuNjEsMCwxLjA5LDAuNTMsMS4xMSwxLjE5djAuMDRjLTAuMDEsMC42NS0wLjUsMS4xOC0xLjExLDEuMThTMzguNjIsMTAuNjgsMzguNjIsMTAuMDJ6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTQ5LjkxLDYuMDRjLTAuOTgsMC0xLjkzLDAuNC0yLjYsMS4xMlY2LjQ1YzAtMC4xMi0wLjEtMC4yMi0wLjIyLTAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLDAuMS0wLjIyLDAuMjJ2MTAuMjFjMCwwLjEyLDAuMSwwLjIyLDAuMjIsMC4yMmgxLjMzYzAuMTIsMCwwLjIyLTAuMSwwLjIyLTAuMjJ2LTMuNzhjMC42OCwwLjcxLDEuNjIsMS4xMiwyLjYxLDEuMTJjMi4wNywwLDMuNzUtMS43OCwzLjc1LTMuOTlTNTEuOTgsNi4wNCw0OS45MSw2LjA0eiBNNDkuNiwxMi40MmMtMS4yNiwwLTIuMjgtMS4wNi0yLjMtMi4zNlY5Ljk5YzAuMDItMS4zMSwxLjA0LTIuMzcsMi4yOS0yLjM3YzEuMjYsMCwyLjMsMS4wNywyLjMsMi4zOVM1MC44NiwxMi40MSw0OS42LDEyLjQyTDQ5LjYsMTIuNDJ6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTQ5LjYsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNTAuODYsNy42Myw0OS42LDcuNjN6IE00OS42LDExLjIzYy0wLjYsMC0xLjA5LTAuNTMtMS4xMS0xLjE5VjEwQzQ4LjUsOS4zNCw0OSw4LjgxLDQ5LjYsOC44MWMwLjYsMCwxLjExLDAuNTUsMS4xMSwxLjIxUzUwLjIxLDExLjIzLDQ5LjYsMTEuMjN6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTM0LjM2LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzRjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWOS4yNGMwLTAuOTMtMC43LTEuNjMtMS41NC0xLjYzYy0wLjc2LDAtMS4zOSwwLjY3LTEuNTEsMS41NGwwLjAxLDQuNDRjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuODEsMC0xLjQ3LDAuNzUtMS41MiwxLjcxdjQuMjdjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ0YzAuMDEtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMSwwLjEsMC4yMiwwLjIxdjAuNjNjMC40OC0wLjY1LDEuMjQtMS4wNCwyLjA2LTEuMDVoMC4wM2MxLjA0LDAsMS45OSwwLjU3LDIuNDgsMS40OGMwLjQzLTAuOSwxLjMzLTEuNDgsMi4zMi0xLjQ5YzEuNTQsMCwyLjc5LDEuMTksMi43NiwyLjY1TDM0LjM2LDEzLjU5eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04MC4zMiwxMi45N2wtMC4wNy0wLjEyTDc4LjM4LDEwbDEuODUtMi44MWMwLjQyLTAuNjQsMC4yNS0xLjQ5LTAuMzktMS45MmMtMC4wMS0wLjAxLTAuMDItMC4wMS0wLjAzLTAuMDJjLTAuMjItMC4xNC0wLjQ4LTAuMjEtMC43NC0wLjIxaC0xLjUzYy0wLjUzLDAtMS4wMywwLjI4LTEuMywwLjc0bC0wLjMyLDAuNTNsLTAuMzItMC41M2MtMC4yOC0wLjQ2LTAuNzctMC43NC0xLjMxLTAuNzRoLTEuNTNjLTAuNTcsMC0xLjA4LDAuMzUtMS4yOSwwLjg4Yy0yLjA5LTEuNTgtNS4wMy0xLjQtNi45MSwwLjQzYy0wLjMzLDAuMzItMC42MiwwLjY5LTAuODUsMS4wOWMtMC44NS0xLjU1LTIuNDUtMi42LTQuMjgtMi42Yy0wLjQ4LDAtMC45NiwwLjA3LTEuNDEsMC4yMlYzLjM3YzAtMC43OC0wLjYzLTEuNDEtMS40LTEuNDFoLTEuMzNjLTAuNzcsMC0xLjQsMC42My0xLjQsMS40djMuNTdjLTAuOS0xLjMtMi4zOC0yLjA4LTMuOTctMi4wOWMtMC43LDAtMS4zOSwwLjE1LTIuMDIsMC40NWMtMC4yMy0wLjE2LTAuNTEtMC4yNS0wLjgtMC4yNWgtMS4zM2MtMC40MywwLTAuODMsMC4yLTEuMSwwLjUzYy0wLjAyLTAuMDMtMC4wNC0wLjA1LTAuMDctMC4wOGMtMC4yNy0wLjI5LTAuNjUtMC40NS0xLjA0LTAuNDVoLTEuMzJjLTAuMjksMC0wLjU3LDAuMDktMC44LDAuMjVDNDAuOCw1LDQwLjEyLDQuODUsMzkuNDIsNC44NWMtMS43NCwwLTMuMjcsMC45NS00LjE2LDIuMzhjLTAuMTktMC40NC0wLjQ2LTAuODUtMC43OS0xLjE5Yy0wLjc2LTAuNzctMS44LTEuMTktMi44OC0xLjE5aC0wLjAxYy0wLjg1LDAuMDEtMS42NywwLjMxLTIuMzQsMC44NGMtMC43LTAuNTQtMS41Ni0wLjg0LTIuNDUtMC44NGgtMC4wM2MtMC4yOCwwLTAuNTUsMC4wMy0wLjgyLDAuMWMtMC4yNywwLjA2LTAuNTMsMC4xNS0wLjc4LDAuMjdjLTAuMi0wLjExLTAuNDMtMC4xNy0wLjY3LTAuMTdoLTEuMzNjLTAuNzgsMC0xLjQsMC42My0xLjQsMS40djcuMTRjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zM2MwLjc4LDAsMS40MS0wLjYzLDEuNDEtMS40MWMwLDAsMCwwLDAsMFY5LjM1YzAuMDMtMC4zNCwwLjIyLTAuNTYsMC4zNC0wLjU2YzAuMTcsMCwwLjM2LDAuMTcsMC4zNiwwLjQ1djQuMzVjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zNGMwLjc4LDAsMS40LTAuNjMsMS40LTEuNGwtMC4wMS00LjM1YzAuMDYtMC4zLDAuMjQtMC40NSwwLjMzLTAuNDVjMC4xNywwLDAuMzYsMC4xNywwLjM2LDAuNDV2NC4zNWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjM0YzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0wLjM2YzAuOTEsMS4yMywyLjM0LDEuOTYsMy44NywxLjk2YzAuNywwLDEuMzktMC4xNSwyLjAyLTAuNDVjMC4yMywwLjE2LDAuNTEsMC4yNSwwLjgsMC4yNWgxLjMyYzAuMjksMCwwLjU3LTAuMDksMC44LTAuMjV2MS45MWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjMzYzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0xLjY5YzAuNDYsMC4xNCwwLjk0LDAuMjIsMS40MiwwLjIxYzEuNjIsMCwzLjA3LTAuODMsMy45Ny0yLjF2MC41YzAsMC43OCwwLjYzLDEuNCwxLjQsMS40aDEuMzNjMC4yOSwwLDAuNTctMC4wOSwwLjgtMC4yNWMwLjYzLDAuMywxLjMyLDAuNDUsMi4wMiwwLjQ1YzEuODMsMCwzLjQzLTEuMDUsNC4yOC0yLjZjMS40NywyLjUyLDQuNzEsMy4zNiw3LjIyLDEuODljMC4xNy0wLjEsMC4zNC0wLjIxLDAuNS0wLjM0YzAuMjEsMC41MiwwLjcyLDAuODcsMS4yOSwwLjg2aDEuNTNjMC41MywwLDEuMDMtMC4yOCwxLjMtMC43NGwwLjM1LTAuNThsMC4zNSwwLjU4YzAuMjgsMC40NiwwLjc3LDAuNzQsMS4zMSwwLjc0aDEuNTJjMC43NywwLDEuMzktMC42MywxLjM4LTEuMzlDODAuNDcsMTMuMzgsODAuNDIsMTMuMTcsODAuMzIsMTIuOTdMODAuMzIsMTIuOTd6IE0zNC4xNSwxMy44MWgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuNzYsMC0xLjM5LDAuNjctMS41MSwxLjU0bDAuMDEsNC40NGMwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjM0Yy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjkuMjRjMC0wLjkzLTAuNy0xLjYzLTEuNTQtMS42M2MtMC44MSwwLTEuNDcsMC43NS0xLjUyLDEuNzF2NC4yN2MwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjMzYy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjYuNDRjMC4wMS0wLjEyLDAuMS0wLjIxLDAuMjItMC4yMWgxLjMzYzAuMTIsMCwwLjIxLDAuMSwwLjIyLDAuMjF2MC42M2MwLjQ4LTAuNjUsMS4yNC0xLjA0LDIuMDYtMS4wNWgwLjAzYzEuMDQsMCwxLjk5LDAuNTcsMi40OCwxLjQ4YzAuNDMtMC45LDEuMzMtMS40OCwyLjMyLTEuNDljMS41NCwwLDIuNzksMS4xOSwyLjc2LDIuNjVsMC4wMSw0LjkxQzM0LjM3LDEzLjcsMzQuMjcsMTMuOCwzNC4xNSwxMy44MUMzNC4xNSwxMy44MSwzNC4xNSwxMy44MSwzNC4xNSwxMy44MXogTTQzLjc4LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJ2LTAuNzFDNDEuMzQsMTMuNiw0MC40LDE0LDM5LjQyLDE0Yy0yLjA3LDAtMy43NS0xLjc4LTMuNzUtMy45OXMxLjY5LTMuOTksMy43NS0zLjk5YzAuOTgsMCwxLjkyLDAuNDEsMi42LDEuMTJ2LTAuN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMS0wLjAxLDAuMjEsMC4wOCwwLjIyLDAuMmMwLDAuMDEsMCwwLjAxLDAsMC4wMlYxMy41OXogTTQ5LjkxLDE0Yy0wLjk4LDAtMS45Mi0wLjQxLTIuNi0xLjEydjMuNzhjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ1YzAtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMiwwLjEsMC4yMiwwLjIydjAuN2MwLjY4LTAuNzIsMS42Mi0xLjEyLDIuNi0xLjEyYzIuMDcsMCwzLjc1LDEuNzcsMy43NSwzLjk4UzUxLjk4LDE0LDQ5LjkxLDE0eiBNNjMuMDksMTAuODdDNjIuNzIsMTIuNjUsNjEuMjIsMTQsNTkuNDMsMTRjLTAuOTgsMC0xLjkyLTAuNDEtMi42LTEuMTJ2MC43YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWMy4zN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMiwwLDAuMjIsMC4xLDAuMjIsMC4yMnYzLjc4YzAuNjgtMC43MSwxLjYyLTEuMTIsMi42LTEuMTFjMS43OSwwLDMuMjksMS4zMywzLjY2LDMuMTJDNjMuMjEsOS43Myw2My4yMSwxMC4zMSw2My4wOSwxMC44N0w2My4wOSwxMC44N0w2My4wOSwxMC44N3ogTTY4LjI2LDE0LjAxYy0xLjksMC4wMS0zLjU1LTEuMjktMy45Ny0zLjE0Yy0wLjEyLTAuNTYtMC4xMi0xLjEzLDAtMS42OWMwLjQyLTEuODUsMi4wNy0zLjE1LDMuOTctMy4xNGMyLjI1LDAsNC4wNiwxLjc4LDQuMDYsMy45OVM3MC41LDE0LjAxLDY4LjI2LDE0LjAxTDY4LjI2LDE0LjAxeiBNNzkuMDksMTMuODFoLTEuNTNjLTAuMTIsMC0wLjIzLTAuMDYtMC4yOS0wLjE2bC0xLjM3LTIuMjhsLTEuMzcsMi4yOGMtMC4wNiwwLjEtMC4xNywwLjE2LTAuMjksMC4xNmgtMS41M2MtMC4wNCwwLTAuMDgtMC4wMS0wLjExLTAuMDNjLTAuMDktMC4wNi0wLjEyLTAuMTgtMC4wNi0wLjI3YzAsMCwwLDAsMCwwbDIuMzEtMy41bC0yLjI4LTMuNDdjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjExYzAtMC4xMSwwLjA5LTAuMiwwLjItMC4yaDEuNTNjMC4xMiwwLDAuMjMsMC4wNiwwLjI5LDAuMTZsMS4zNCwyLjI1bDEuMzQtMi4yNWMwLjA2LTAuMSwwLjE3LTAuMTYsMC4yOS0wLjE2aDEuNTNjMC4wNCwwLDAuMDgsMC4wMSwwLjExLDAuMDNjMC4wOSwwLjA2LDAuMTIsMC4xOCwwLjA2LDAuMjdjMCwwLDAsMCwwLDBMNzYuOTYsMTBsMi4zMSwzLjVjMC4wMiwwLjAzLDAuMDMsMC4wNywwLjAzLDAuMTFDNzkuMjksMTMuNzIsNzkuMiwxMy44MSw3OS4wOSwxMy44MUM3OS4wOSwxMy44MSw3OS4wOSwxMy44MSw3OS4wOSwxMy44MUw3OS4wOSwxMy44MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTAsMS4yMWMtNC44NywwLTguODEsMy45NS04LjgxLDguODFzMy45NSw4LjgxLDguODEsOC44MXM4LjgxLTMuOTUsOC44MS04LjgxQzE4LjgxLDUuMTUsMTQuODcsMS4yMSwxMCwxLjIxeiBNMTQuMTgsMTIuMTljLTEuODQsMS44NC00LjU1LDIuMi02LjM4LDIuMmMtMC42NywwLTEuMzQtMC4wNS0yLTAuMTVjMCwwLTAuOTctNS4zNywyLjA0LTguMzljMC43OS0wLjc5LDEuODYtMS4yMiwyLjk4LTEuMjJjMS4yMSwwLDIuMzcsMC40OSwzLjIzLDEuMzVDMTUuOCw3LjczLDE1Ljg1LDEwLjUsMTQuMTgsMTIuMTl6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTEwLDAuMDJjLTUuNTIsMC0xMCw0LjQ4LTEwLDEwczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMEMxOS45OSw0LjUsMTUuNTIsMC4wMiwxMCwwLjAyeiBNMTAsMTguODNjLTQuODcsMC04LjgxLTMuOTUtOC44MS04LjgxUzUuMTMsMS4yLDEwLDEuMnM4LjgxLDMuOTUsOC44MSw4LjgxQzE4LjgxLDE0Ljg5LDE0Ljg3LDE4LjgzLDEwLDE4LjgzeiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNC4wNCw1Ljk4Yy0xLjc1LTEuNzUtNC41My0xLjgxLTYuMi0wLjE0QzQuODMsOC44Niw1LjgsMTQuMjMsNS44LDE0LjIzczUuMzcsMC45Nyw4LjM5LTIuMDRDMTUuODUsMTAuNSwxNS44LDcuNzMsMTQuMDQsNS45OHogTTExLjg4LDkuODdsLTAuODcsMS43OGwtMC44Ni0xLjc4TDguMzgsOS4wMWwxLjc3LTAuODZsMC44Ni0xLjc4bDAuODcsMS43OGwxLjc3LDAuODZMMTEuODgsOS44N3oiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEzLjY1LDkuMDEgMTEuODgsOS44NyAxMS4wMSwxMS42NSAxMC4xNSw5Ljg3IDguMzgsOS4wMSAxMC4xNSw4LjE1IDExLjAxLDYuMzcgMTEuODgsOC4xNSAiLz48L2c+PC9zdmc+"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Six Inch resolution aerial imagery for the State of Maryland"},{"id":"geodata.md.gov-MD_ColorBasemap","name":"MD Transportation Basemap","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{"id":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{"id":"geodata.state.nj.us-Natural2015","name":"NJ 2015 Aerial Imagery (Natural Color)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{"id":"NLS-Bartholomew-hfinch-hist","name":"NLS - Bartholomew Half Inch, 1897-1907","type":"tms","template":"http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png","scaleExtent":[0,15],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-7th_Series","name":"NLS - OS 1-inch 7th Series 1955-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-1st_Series","name":"NLS - OS 1:25k 1st Series 1937-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-4.7157244,54.6796556],[-4.6850662,54.6800268],[-4.6835779,54.6623245],[-4.7148782,54.6615818],[-4.7157244,54.6796556]],[[-3.7085748,58.3371151],[-3.5405937,58.3380684],[-3.5315137,58.1608002],[-3.3608086,58.1622372],[-3.3653486,58.252173],[-3.1610473,58.2536063],[-3.1610473,58.3261509],[-3.0275704,58.3271045],[-3.0366505,58.6139001],[-3.0021463,58.614373],[-3.0030543,58.7036341],[-3.4180129,58.7003322],[-3.4171049,58.6290293],[-3.7240109,58.6266658],[-3.7231029,58.606806],[-4.2361262,58.5992374],[-4.2334022,58.5092347],[-3.88836,58.5144516],[-3.8829119,58.4261327],[-3.7158389,58.4270836],[-3.7085748,58.3371151]],[[-6.46676,49.9943621],[-6.1889102,50.004868],[-6.1789222,49.8967815],[-6.3169391,49.8915171],[-6.312399,49.8200979],[-6.4504159,49.8159968],[-6.46676,49.9943621]],[[-5.6453263,50.2029809],[-5.7801329,50.2014076],[-5.7637888,50.0197267],[-5.3479221,50.0290604],[-5.3388421,49.9414854],[-5.024672,49.9473287],[-5.0355681,50.0383923],[-5.0010639,50.0453901],[-4.9974319,50.1304478],[-4.855783,50.13394],[-4.861231,50.206057],[-4.6546085,50.2140172],[-4.6558926,50.3018616],[-4.5184924,50.3026818],[-4.51464,50.325642],[-4.2488284,50.3264618],[-4.2488284,50.3100631],[-4.10886,50.3141633],[-4.1062917,50.2411267],[-3.9648088,50.2432047],[-3.9640778,50.2254158],[-3.8522287,50.2273626],[-3.8503757,50.1552563],[-3.6921809,50.1572487],[-3.5414602,50.1602198],[-3.5465781,50.3226814],[-3.4068012,50.3241013],[-3.4165761,50.5892711],[-3.2746691,50.5962721],[-3.2749172,50.6106323],[-2.9971742,50.613972],[-2.9896008,50.688537],[-2.7120266,50.690565],[-2.710908,50.6195964],[-2.5695473,50.6157538],[-2.5651019,50.5134083],[-2.4014463,50.513379],[-2.3940583,50.6160348],[-2.2894123,50.6147436],[-2.2876184,50.6008549],[-2.1477855,50.6048506],[-2.1451013,50.5325437],[-1.9335117,50.5347477],[-1.9362139,50.6170445],[-1.8573025,50.6228094],[-1.8554865,50.709139],[-1.6066929,50.709139],[-1.6085089,50.6239615],[-1.4450678,50.6228094],[-1.4432518,50.5317039],[-1.1545059,50.5293951],[-1.1472419,50.6170485],[-1.011041,50.6205051],[-1.011041,50.7056889],[-0.704135,50.7045388],[-0.700503,50.7769401],[-0.5860943,50.7723465],[-0.5879103,50.7907181],[-0.0149586,50.7798108],[-0.0185906,50.7625836],[0.0967261,50.7620093],[0.0921861,50.6913106],[0.3046595,50.6890096],[0.3101075,50.7757917],[0.5511831,50.7726336],[0.5529991,50.8432096],[0.695556,50.8403428],[0.696464,50.8592608],[0.9852099,50.8523824],[0.9906579,50.9417226],[1.0160821,50.9411504],[1.0215301,51.0303204],[1.2812198,51.0240383],[1.2848518,51.0948044],[1.4277848,51.0948044],[1.4386809,51.2882859],[1.4713691,51.2871502],[1.4804492,51.3994534],[1.1590151,51.4073836],[1.1590151,51.3869889],[1.0191822,51.3903886],[1.0228142,51.4798247],[0.8793493,51.4843484],[0.8829813,51.5566675],[1.0264462,51.5544092],[1.0373423,51.7493319],[1.2607117,51.7482076],[1.2661598,51.8279642],[1.3351682,51.8335756],[1.3478803,51.9199021],[1.4840812,51.9199021],[1.4986093,52.0038271],[1.6438902,52.0027092],[1.6656823,52.270221],[1.7310588,52.270221],[1.7528509,52.4465637],[1.8254914,52.4476705],[1.8345714,52.624408],[1.7690346,52.6291402],[1.7741711,52.717904],[1.6996925,52.721793],[1.706113,52.8103687],[1.559724,52.8165777],[1.5648605,52.9034116],[1.4184715,52.9103818],[1.4223238,52.9281894],[1.3439928,52.9289635],[1.3491293,53.0001194],[0.4515789,53.022589],[0.4497629,52.9351139],[0.3789384,52.9351139],[0.3716744,52.846365],[0.2227614,52.8496552],[0.2336575,52.9329248],[0.3062979,52.9351139],[0.308114,53.022589],[0.3807544,53.0236813],[0.3993708,53.2933729],[0.3248922,53.2987454],[0.3274604,53.3853782],[0.2504136,53.38691],[0.2581183,53.4748924],[0.1862079,53.4779494],[0.1913443,53.6548777],[0.1502527,53.6594436],[0.1528209,53.7666003],[0.0012954,53.7734308],[0.0025796,53.8424326],[-0.0282392,53.841675],[-0.0226575,53.9311501],[-0.1406983,53.9322193],[-0.1416063,54.0219323],[-0.1706625,54.0235326],[-0.1679384,54.0949482],[-0.0126694,54.0912206],[-0.0099454,54.1811226],[-0.1615824,54.1837795],[-0.1606744,54.2029038],[-0.2405789,54.2034349],[-0.2378549,54.2936234],[-0.3894919,54.2941533],[-0.3857497,54.3837321],[-0.461638,54.3856364],[-0.4571122,54.4939066],[-0.6105651,54.4965434],[-0.6096571,54.5676704],[-0.7667421,54.569776],[-0.7640181,54.5887213],[-0.9192871,54.5908258],[-0.9148116,54.6608348],[-1.1485204,54.6634343],[-1.1472363,54.7528316],[-1.2268514,54.7532021],[-1.2265398,54.8429879],[-1.2991803,54.8435107],[-1.2991803,54.9333391],[-1.3454886,54.9354258],[-1.3436726,55.0234878],[-1.3772688,55.0255698],[-1.3754528,55.1310877],[-1.4997441,55.1315727],[-1.4969272,55.2928323],[-1.5296721,55.2942946],[-1.5258198,55.6523803],[-1.7659492,55.6545537],[-1.7620968,55.7435626],[-1.9688392,55.7435626],[-1.9698023,55.8334505],[-2.0019051,55.8336308],[-2.0015841,55.9235526],[-2.1604851,55.9240613],[-2.1613931,55.9413549],[-2.3202942,55.9408463],[-2.3212022,56.0145126],[-2.5627317,56.0124824],[-2.5645477,56.1022207],[-2.9658863,56.0991822],[-2.9667943,56.1710304],[-2.4828272,56.1755797],[-2.4882752,56.2856078],[-2.5645477,56.2835918],[-2.5681798,56.3742075],[-2.7261728,56.3732019],[-2.7316208,56.4425301],[-2.6190281,56.4425301],[-2.6153961,56.5317671],[-2.453771,56.5347715],[-2.4534686,56.6420248],[-2.4062523,56.6440218],[-2.3953562,56.7297964],[-2.2936596,56.7337811],[-2.2972916,56.807423],[-2.1629067,56.8113995],[-2.1592747,56.9958425],[-1.9922016,57.0017771],[-2.0067297,57.2737477],[-1.9195612,57.2757112],[-1.9304572,57.3482876],[-1.8106005,57.3443682],[-1.7997044,57.4402728],[-1.6616875,57.4285429],[-1.6689516,57.5398256],[-1.7452241,57.5398256],[-1.7524881,57.6313302],[-1.8287606,57.6332746],[-1.8287606,57.7187255],[-3.1768526,57.7171219],[-3.1794208,57.734264],[-3.5134082,57.7292105],[-3.5129542,57.7112683],[-3.7635638,57.7076303],[-3.7598539,57.635713],[-3.8420372,57.6343382],[-3.8458895,57.6178365],[-3.9794374,57.6157733],[-3.9794374,57.686544],[-3.8150708,57.689976],[-3.817639,57.7968899],[-3.6853753,57.7989429],[-3.6892276,57.8891567],[-3.9383458,57.8877915],[-3.9421981,57.9750592],[-3.6943641,57.9784638],[-3.6969323,58.0695865],[-4.0372226,58.0641528],[-4.0346543,57.9730163],[-4.2003051,57.9702923],[-4.1832772,57.7012869],[-4.518752,57.6951111],[-4.5122925,57.6050682],[-4.6789116,57.6016628],[-4.666022,57.4218334],[-3.6677696,57.4394729],[-3.671282,57.5295384],[-3.3384979,57.5331943],[-3.3330498,57.4438859],[-2.8336466,57.4485275],[-2.8236396,56.9992706],[-2.3305398,57.0006693],[-2.3298977,56.9113932],[-2.6579889,56.9092901],[-2.6559637,56.8198406],[-2.8216747,56.8188467],[-2.8184967,56.7295397],[-3.1449248,56.7265508],[-3.1435628,56.6362749],[-3.4679089,56.6350265],[-3.474265,56.7238108],[-3.8011471,56.7188284],[-3.785711,56.4493026],[-3.946428,56.4457896],[-3.9428873,56.2659777],[-4.423146,56.2588459],[-4.4141572,56.0815506],[-4.8944159,56.0708008],[-4.8791072,55.8896994],[-5.1994158,55.8821374],[-5.1852906,55.7023791],[-5.0273445,55.7067203],[-5.0222081,55.6879046],[-4.897649,55.6907999],[-4.8880181,55.6002822],[-4.7339244,55.6046348],[-4.7275038,55.5342082],[-4.773732,55.5334815],[-4.7685955,55.4447227],[-4.8494947,55.4418092],[-4.8405059,55.3506535],[-4.8700405,55.3513836],[-4.8649041,55.2629462],[-4.9920314,55.2592875],[-4.9907473,55.1691779],[-5.0600894,55.1655105],[-5.0575212,55.0751884],[-5.2141831,55.0722477],[-5.1991766,54.8020337],[-5.0466316,54.8062205],[-5.0502636,54.7244996],[-4.9703591,54.7203043],[-4.9776232,54.6215905],[-4.796022,54.6342056],[-4.796022,54.7307917],[-4.8977186,54.7265971],[-4.9086147,54.8145928],[-4.8069181,54.8166856],[-4.8105501,54.7915648],[-4.6943253,54.7978465],[-4.6761652,54.7244996],[-4.5744686,54.7244996],[-4.5599405,54.6426135],[-4.3093309,54.6384098],[-4.3333262,54.8229889],[-4.2626999,54.8274274],[-4.2549952,54.7348587],[-3.8338058,54.7400481],[-3.836374,54.8141105],[-3.7118149,54.8133706],[-3.7143831,54.8318654],[-3.5346072,54.8355633],[-3.5271039,54.9066228],[-3.4808758,54.9084684],[-3.4776655,54.7457328],[-3.5874573,54.744621],[-3.5836049,54.6546166],[-3.7107322,54.6531308],[-3.6991752,54.4550407],[-3.5746161,54.4572801],[-3.5759002,54.3863042],[-3.539945,54.3855564],[-3.5386609,54.297224],[-3.46033,54.2957252],[-3.4590458,54.2079507],[-3.3807149,54.2102037],[-3.381999,54.1169788],[-3.302878,54.1160656],[-3.300154,54.0276224],[-3.1013007,54.0292224],[-3.093596,53.6062158],[-3.2065981,53.6016441],[-3.2091663,53.4917753],[-3.2451215,53.4887193],[-3.2348486,53.4045934],[-3.5276266,53.3999999],[-3.5343966,53.328481],[-3.6488053,53.3252272],[-3.6527308,53.3057716],[-3.7271873,53.3046865],[-3.7315003,53.3945257],[-3.9108315,53.3912769],[-3.9071995,53.3023804],[-3.9521457,53.3015665],[-3.9566724,53.3912183],[-4.1081979,53.3889209],[-4.1081979,53.4072967],[-4.2622916,53.4065312],[-4.2635757,53.4753707],[-4.638537,53.4677274],[-4.6346847,53.3812621],[-4.7091633,53.3774321],[-4.7001745,53.1954965],[-4.5499332,53.1962658],[-4.5435126,53.1092488],[-4.3919871,53.1100196],[-4.3855666,53.0236002],[-4.6115707,53.0205105],[-4.603866,52.9284932],[-4.7566756,52.9261709],[-4.7476868,52.8370555],[-4.8208813,52.8331768],[-4.8208813,52.7446476],[-4.3701572,52.7539749],[-4.3765778,52.8401583],[-4.2314728,52.8455875],[-4.2237682,52.7586379],[-4.1056297,52.7570836],[-4.1015192,52.6714874],[-4.1487355,52.6703862],[-4.1305754,52.4008596],[-4.1995838,52.3986435],[-4.2050319,52.3110195],[-4.3466808,52.303247],[-4.3484968,52.2365693],[-4.4901457,52.2332328],[-4.4883297,52.2098702],[-4.6572188,52.2098702],[-4.6590348,52.1385939],[-4.7788916,52.13525],[-4.7807076,52.1162967],[-4.9259885,52.1140663],[-4.9187245,52.0392855],[-5.2365265,52.0314653],[-5.2347105,51.9442339],[-5.3473032,51.9408755],[-5.3473032,51.9195995],[-5.4925842,51.9162392],[-5.4853201,51.8265386],[-5.1983903,51.8321501],[-5.1893102,51.7625177],[-5.335825,51.7589528],[-5.3281204,51.6686495],[-5.1836575,51.6730296],[-5.1836575,51.6539134],[-5.0674452,51.6578966],[-5.0603825,51.5677905],[-4.5974594,51.5809588],[-4.60388,51.6726314],[-4.345773,51.6726314],[-4.3355001,51.4962964],[-3.9528341,51.5106841],[-3.9425611,51.5905333],[-3.8809237,51.5953198],[-3.8706508,51.5074872],[-3.7679216,51.4978952],[-3.7550805,51.4242895],[-3.5855774,51.41468],[-3.5778727,51.3329177],[-3.0796364,51.3329177],[-3.0770682,51.2494018],[-3.7216935,51.2381477],[-3.7216935,51.2558315],[-3.8706508,51.2558315],[-3.8680825,51.2365398],[-4.2944084,51.2252825],[-4.289272,51.0496352],[-4.5692089,51.0431767],[-4.5624122,50.9497388],[-4.5905604,50.9520269],[-4.5896524,50.8627065],[-4.6296046,50.8592677],[-4.6226411,50.7691513],[-4.6952816,50.7680028],[-4.6934655,50.6967379],[-4.8342064,50.6938621],[-4.8296664,50.6046231],[-4.9676833,50.6000126],[-4.9685913,50.5821427],[-5.1084242,50.5786832],[-5.1029762,50.4892254],[-5.1311244,50.48807],[-5.1274923,50.4163798],[-5.2664172,50.4117509],[-5.2609692,50.3034214],[-5.5124868,50.2976214],[-5.5061308,50.2256428],[-5.6468717,50.2209953],[-5.6453263,50.2029809]],[[-5.1336607,55.2630226],[-5.1021999,55.2639372],[-5.0999527,55.2458239],[-5.1322161,55.2446343],[-5.1336607,55.2630226]],[[-5.6431878,55.5095745],[-5.4861028,55.5126594],[-5.4715747,55.3348829],[-5.6277517,55.3302345],[-5.6431878,55.5095745]],[[-4.7213517,51.2180246],[-4.5804201,51.2212417],[-4.5746416,51.1306736],[-4.7174993,51.1280545],[-4.7213517,51.2180246]],[[-5.1608796,55.4153626],[-5.0045387,55.4190069],[-5.0184798,55.6153521],[-5.1755648,55.6138137],[-5.1608796,55.4153626]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-25inch-hist","name":"NLS - OS 25-inch (Scotland), 1892-1905","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25_inch/scotland_1/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-6inch-Scotland-hist","name":"NLS - OS 6-inch Scotland 1842-82","type":"tms","template":"http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLSC-EMAP5","name":"NLSC General Map with Contour line","type":"tms","template":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://maps.nlsc.gov.tw/","terms_text":"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0","description":"The emap from Taiwan National Land Surveying and Mapping Center","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"id":"IBGE_Salvador_Streets","name":"Nomes de Ruas IBGE Salvador-BA","type":"tms","template":"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-38.489742279052734,-12.811131765117107],[-38.54484558105469,-13.013924052026558],[-38.47755432128906,-13.034662471471638],[-38.33473205566406,-12.946846814654444],[-38.30005645751953,-12.906692193510644],[-38.33953857421875,-12.904349641337422],[-38.35481643676758,-12.830213284310222],[-38.38090896606445,-12.821844374997415],[-38.40717315673828,-12.867535227819912],[-38.46536636352539,-12.815985972925704],[-38.489742279052734,-12.811131765117107]]],"description":"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.","overlay":true},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,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"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"terms_url":"https://www.openstreetmap.org/copyright","terms_text":"© OpenStreetMap contributors","terms_html":"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.","description":"Public GPS traces uploaded to OpenStreetMap.","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.ortho2010","name":"Ortho 2010 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2010-07-02T00:00:00.000Z","startDate":"2010-06-24T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2013","name":"Ortho 2013 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2013-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2016","name":"Ortho 2016 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2016-08-16T00:00:00.000Z","startDate":"2013-08-30T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","best":true,"icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"overlay":true},{"id":"OS-OpenData_StreetView","name":"OS OpenData StreetView","type":"tms","template":"http://os.openstreetmap.org/sv/{zoom}/{x}/{y}.png","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"terms_url":"http://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance","terms_text":"Kadaster / Beeldmateriaal.nl, CC BY 4.0","best":true,"description":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABpCAMAAAD/V6aFAAABQVBMVEVHcEzFxcUIjtE3quLGxsYMlNMxseXFxcXFxcXGxsY3qeC82+c4qeA4quEcod3FxcXGxsbGxsbKysrHx8cGkdLGxsYPl9fExMTGxsbGxsbGxsYGjtDGxsYLlNXFxcXKysrGxsY3qeDFxcXGxsbFxcXGxsY3qeHGxsbIyMjGxsbGxsbFxcXFxcXFxcXGxsYBi883quHExMTGxsbGxsYgpdkYntoeqtXGxsYko93FxcXFxcUio97GxsYDjdAcn9rGxsbGxsbGxsYQmdjGxsYCjdAAis0IktM1qODGxsbHx8fGxsY3quHFxcUco93GxsbGxsbFxcUmotw3q+E4quE3quE3quACjtEKl9XGxsbFxcUZoNkBi883qeHGxsYAis44quEAic0AiM08rOIcnNk6q+IspN4Mk9QFj9EXmdclodzGxsbX17u1AAAAXnRSTlMA7d4ItK8KTHw//QHerC31nSgFHsszjQ5Bw23d6qMYFFmUZtVH78rkCTn4uIZUdvqAFKxPDUAEozao2iLQ5V39lLF/y+z+wd1he76y+hGNgC1uQO7BUNR6mYRR96TdoavfmwAABLhJREFUeF7s08Fqg0AQBuApCC0IBBtCYpBVbMQmNoF4CfGykV5aKKbXAn2B//0foOLspQF0xhQokO80/2l2WH66xnNx18vz6S+c0K+ha8TukQn62RWNFxzfeY2J0K96pLH2zSSf81hjwIHGevsG7nncYkhC45gDgNKdlWOA/Uo7MemsnwBkAYcGQtmcVJINWi8cZhZCR1JZWrSiKacSUkvSeEBnx2llIWQ/Vbegk8UcQ0i9asqTgJ05biF2Jrn1BJ2J0R6DKmzJGmSq371eWOgsSKK8+M4COrmoOimckHPwAR2PBPbRRQUaKKU0zK/hRHy72UDHTmmYqT1nx2tnhadz8ulfuLn5YazseRMEwjhuJDCIOhkXw8DiagchJkQGInZoHKxWk7Y5nkO09ft/gTb3Sjg4nt/4T7jf5XnhIlcR8SRzbUxaeO/XBFQCGxasd7QToLeyMBglvZZ4AUSw9VjyCcTCvTI1Z0TNciIAlydziwZ+ihZe+jUZVUekPNlbNPS3LEwQrXHVoblozdZas7KqmmU7rXstjm7N7sCSaW7TPO//yM4vOYiaJV9EADOfJUcgVoDK/ix9/NaQ5gQEQOzQh+hPOECTgdJkLPBnfRoQqzPa4DUBJZLImAD76ow9vEZP7yrhzVr11kxM2gTr0HfXgxa1t12jVucDr5mqu8MlZkkKLZbHrYao2eg7DEOkSh8Ke55c2zTPskZRI0VOgNYEMulqukl1SlAWb6s1884/GjyKDt4GKDY5UVxZEl9MjXhjTKojTjOnIKGpfNPAQNTMBLegzn4xVPBPDrNhk8XwddzOGbeg/trT+DxyPAOni/ivXfNbbRSIwvgpLCQiYIyIRmAT1hS1RCEJICmCgjdtKKmXe+ML+P4PsCmzG6Y96zczFO/yu3WGzxnPmTl/JCV37gTFXKb4m6e9zk2JQPWBp5cirfMHY1YoJOi+5MqOkHFrY5kXoLL8WsV4c4XMk6lK7QKZiI326QPPMZWJwafx+UtnojL8aCqzAFZWDYyjeJIYbdgVUIkuB04hvllsoJL4bueO79kclOFbA5mSEHkN5hwMZI4ECP9vs2fx9F1fxfGQX47YUiyc+UVfprWBSjIw5OLTVl/mAlT6QYYfA12NDDhZSLhIZRThAOuHAfBKOviJss5rx98ubGfwTQ+gZ2PSFdriY7EShrMDiyn12hmQx71wK3i1qLCjQUWmKqc6P9UyVmhhwrUYmI0NDH0C3LnjzTTZCicPjnhYh+NLNZbofyiim4IYZi2fnU733hm5ACrT0A5fbSti6AQryWm++9HXUhCRPquXzDnABWwCupJ20VlcBsq4Y0YM5aRyTzfC07+uUlcrD3KOpR01hGexI/ZI1/Nhk+cWjbBsoYqMbYm77TjWSkcpU24cnKYJCDMNl7NKaZR3YO8oA+T0Hu6EcnbqLi3D8YmDTyg2Qz3raUYQ7/NynLZtFzYpKT7vW50TgAdSDWkye5Z9bEMq1rKxvfmkS9DcwsEqIzUROC4BNrmXjxOyjn8FpEHagn9PMEEXht2S9NiyvGwaSmYAEyD9N3Zumma6BdkbyXH2NB2nm8xvmpB9L1WOJiRzWHI+CRHLbafh0l+p1Hb2B2WwRgDiX0fTAAAAAElFTkSuQmCC"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,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"},{"id":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"id":"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017","name":"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017","type":"tms","template":"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"id":"South_Africa-CD_NGI-Aerial","name":"South Africa CD:NGI Aerial","type":"tms","template":"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{"id":"South-Tyrol-Orthofoto-2014-2015","name":"South Tyrol Orthofoto 2014/2015","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","endDate":"2015-11-01T00:00:00.000Z","startDate":"2014-07-01T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0","best":true},{"id":"South-Tyrol-Topomap","name":"South Tyrol Topomap","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,20],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern ","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"id":"Surrey-Air_Survey","name":"Surrey Air Survey","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true},{"id":"tnris.org","name":"Texas Orthophoto","type":"tms","template":"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"id":"US-TIGER-Roads-2017","name":"TIGER Roads 2017","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.topo","name":"Topographical Map geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1919978,43.6328791],[1.2015377,43.6329729],[1.2011107,43.6554932],[1.2227985,43.6557029],[1.2226231,43.6653353],[1.2275341,43.6653849],[1.2275417,43.6656387],[1.2337568,43.6656883],[1.2337644,43.6650153],[1.2351218,43.6650319],[1.2350913,43.6670729],[1.2443566,43.6671556],[1.2441584,43.6743925],[1.2493973,43.6744256],[1.2493973,43.6746628],[1.2555666,43.6747234],[1.2555742,43.6744532],[1.2569545,43.6744697],[1.2568782,43.678529],[1.2874873,43.6788257],[1.2870803,43.7013229],[1.3088219,43.7014632],[1.3086493,43.7127673],[1.3303262,43.7129544],[1.3300242,43.7305221],[1.3367106,43.7305845],[1.3367322,43.7312235],[1.3734338,43.7310456],[1.3735848,43.7245772],[1.4604504,43.7252947],[1.4607783,43.7028034],[1.4824875,43.7029516],[1.4829828,43.6692071],[1.5046832,43.6693616],[1.5048383,43.6581174],[1.5265475,43.6582656],[1.5266945,43.6470298],[1.548368,43.6471633],[1.5485357,43.6359385],[1.5702172,43.636082],[1.5705123,43.6135777],[1.5488166,43.6134276],[1.549097,43.5909479],[1.5707695,43.5910694],[1.5709373,43.5798341],[1.5793714,43.5798894],[1.5794782,43.5737682],[1.5809119,43.5737792],[1.5810859,43.5573794],[1.5712334,43.5573131],[1.5716504,43.5235497],[1.3984804,43.5222618],[1.3986509,43.5110113],[1.3120959,43.5102543],[1.3118968,43.5215192],[1.2902569,43.5213126],[1.2898637,43.5438168],[1.311517,43.5440133],[1.3113271,43.5552596],[1.3036924,43.5551924],[1.3036117,43.5595099],[1.2955449,43.5594317],[1.2955449,43.5595489],[1.2895595,43.5594473],[1.2892899,43.5775366],[1.2675698,43.5773647],[1.2673973,43.5886141],[1.25355,43.5885047],[1.2533774,43.5956282],[1.2518029,43.5956282],[1.2518029,43.5949409],[1.2350437,43.5947847],[1.2350437,43.5945972],[1.2239572,43.5945972],[1.2239357,43.5994708],[1.2139708,43.599299],[1.2138845,43.6046408],[1.2020647,43.6044846],[1.2019464,43.61048],[1.1924294,43.6103695],[1.1919978,43.6328791]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2011","name":"Toulouse - Orthophotoplan 2011","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2013","name":"Toulouse - Orthophotoplan 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2013/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2015","name":"Toulouse - Orthophotoplan 2015","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2015/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Tours-Orthophoto-2008_2010","name":"Tours - Orthophotos 2008-2010","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s) Plus 2008"},{"id":"Tours-Orthophoto-2013","name":"Tours - Orthophotos 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[0.427093505859375,47.26199018174824],[0.427093505859375,47.50096732311069],[0.814361572265625,47.50096732311069],[0.814361572265625,47.26199018174824],[0.427093505859375,47.26199018174824]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,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"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,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"},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"id":"wien.gv.at-labels","name":"Vienna: Beschriftungen (annotations)","type":"tms","template":"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-aerial_image","name":"Vienna: Orthofoto (aerial image)","type":"tms","template":"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"}];
+var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2013-06-01T00:00:00.000Z","startDate":"2013-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"description":"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{"id":"sjcgis.org-Aerials_2016_WM","name":"2016 aerial imagery for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}","endDate":"2016-07-01T00:00:00.000Z","startDate":"2016-05-01T00:00:00.000Z","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"best":true,"description":"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{"id":"OS7","name":"7th Series (OS7)","type":"tms","template":"http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"id":"lu.geoportail.opendata.basemap","name":"Basemap geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"basemap.at","name":"basemap.at","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"basemap.at-orthofoto","name":"basemap.at Orthofoto","type":"tms","template":"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","best":true,"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"id":"bavaria-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]]},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"British_Columbia_Mosaic","name":"British Columbia Mosaic","type":"tms","template":"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png","endDate":"2013-06-01T00:00:00.000Z","startDate":"2009-01-01T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"terms_url":"http://imagery.paulnorman.ca/tiles/about.html","terms_text":"Copyright Province of British Columbia, City of Surrey"},{"id":"lu.geoportail.opendata.cadastre","name":"Cadastre geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"terms_url":"http://www.osm-tools.org/","terms_text":"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{"id":"South_Africa-CapeTown-Aerial","name":"City of Cape Town 2015 Aerial","type":"tms","template":"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"terms_url":"https://www.capetown.gov.za","terms_text":"City of Cape Town Aerial - OPENSTREETMAP USE ONLY","best":true,"description":"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{"id":"CRAIG-Auvergne-2013","name":"CRAIG - Auvergne 2013 - 25 cm","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"terms_url":"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer","terms_text":"Digital Aerial Solutions, LLC","description":"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{"id":"DigitalGlobe-Premium","name":"DigitalGlobe Premium Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNXltOTBucm0yd3BtY3E5czl6NmYifQ.qJJsPgCjyzMCm3YG3YWQBQ","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Premium-vintage","name":"DigitalGlobe Premium Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"DigitalGlobe-Standard","name":"DigitalGlobe Standard Imagery","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNW9qZjBudmgzMnA1a294OGRtNm8ifQ.06mo-nDisy4KmqjYxEVwQw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,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"},{"id":"DigitalGlobe-Standard-vintage","name":"DigitalGlobe Standard Imagery Vintage","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","description":"Imagery boundaries and capture dates. Labels appear at zoom level 14 and higher.","icon":"data:image/png;base64,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","overlay":true},{"id":"EsriWorldImagery","name":"Esri World Imagery","type":"tms","template":"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,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"},{"id":"EsriWorldImageryClarity","name":"Esri World Imagery (Clarity) Beta","type":"tms","template":"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri archive imagery that may be clearer and more accurate than the default layer.","icon":"data:image/png;base64,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"},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png","scaleExtent":[14,18],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"id":"FOMI_2000","name":"FÖMI orthophoto 2000","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg","endDate":"2000-01-01T00:00:00.000Z","startDate":"2000-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FOMI_2005","name":"FÖMI orthophoto 2005","type":"tms","template":"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg","endDate":"2005-01-01T00:00:00.000Z","startDate":"2005-01-01T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FR-BAN","name":"FR-BAN","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","terms_text":"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL","description":"French address registry or Base Adresses Nationale"},{"id":"FR-Cadastre","name":"FR-Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,22],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation","terms_text":"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{"id":"Freemap.sk-Car","name":"Freemap.sk Car","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[8,16],"polygon":[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],"terms_text":"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.","icon":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"Hampshire-Aerial-FCIR","name":"Hampshire Aerial FCIR","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"Hampshire-Aerial-RGB","name":"Hampshire Aerial RGB","type":"tms","template":"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[8,20],"polygon":[[[-1.315673,50.77809],[-1.491387,50.73027],[-1.57113,50.69041],[-1.680953,50.71748],[-1.693378,50.73484],[-1.695277,50.74065],[-1.686891,50.74999],[-1.710684,50.74812],[-1.719504,50.75261],[-1.746001,50.74452],[-1.748452,50.75675],[-1.742869,50.76397],[-1.751012,50.77577],[-1.78525,50.76177],[-1.799108,50.77236],[-1.822565,50.77225],[-1.826778,50.78077],[-1.822497,50.79933],[-1.807317,50.80074],[-1.81566,50.80752],[-1.808894,50.81358],[-1.805787,50.83249],[-1.798157,50.83535],[-1.806491,50.84414],[-1.809882,50.86189],[-1.813783,50.85591],[-1.830516,50.85261],[-1.852711,50.85651],[-1.85655,50.86684],[-1.849205,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.826931,50.89939],[-1.820062,50.90492],[-1.821513,50.91691],[-1.816889,50.92412],[-1.841137,50.92886],[-1.874458,50.91441],[-1.911294,50.9439],[-1.923386,50.95917],[-1.95751,50.97575],[-1.959101,50.99152],[-1.949071,50.98649],[-1.928787,51.00055],[-1.887094,51.0026],[-1.87393,51.0097],[-1.871695,50.99083],[-1.854331,51.00786],[-1.835675,51.01238],[-1.815019,50.9899],[-1.800312,50.99457],[-1.751838,50.98133],[-1.719271,50.98047],[-1.691416,50.95943],[-1.66829,50.95041],[-1.652596,50.95029],[-1.635362,50.96269],[-1.623972,50.95903],[-1.608898,50.97686],[-1.621721,50.98099],[-1.631149,50.99984],[-1.609836,51.01225],[-1.601734,51.01042],[-1.607874,51.01582],[-1.605696,51.02271],[-1.635423,51.03176],[-1.638583,51.04126],[-1.631067,51.07819],[-1.640253,51.09201],[-1.630602,51.10359],[-1.634078,51.11099],[-1.630674,51.11652],[-1.641093,51.12237],[-1.665249,51.12546],[-1.657236,51.15539],[-1.674737,51.177],[-1.67213,51.18708],[-1.696792,51.20233],[-1.69247,51.21617],[-1.652877,51.22301],[-1.635643,51.22019],[-1.623947,51.24136],[-1.614024,51.24467],[-1.607408,51.25513],[-1.577168,51.25863],[-1.544434,51.24826],[-1.538396,51.25085],[-1.534359,51.25919],[-1.543446,51.25957],[-1.540068,51.27602],[-1.545961,51.28095],[-1.535908,51.28978],[-1.525949,51.28975],[-1.530933,51.29948],[-1.530081,51.3111],[-1.536275,51.31596],[-1.529857,51.34057],[-1.515522,51.34219],[-1.494983,51.33228],[-1.435991,51.33861],[-1.447589,51.3464],[-1.446305,51.35699],[-1.430556,51.35941],[-1.416077,51.37517],[-1.348989,51.37045],[-1.314724,51.37627],[-1.275549,51.3707],[-1.251156,51.37511],[-1.241179,51.36938],[-1.222093,51.37271],[-1.176023,51.36102],[-1.143212,51.36028],[-1.118753,51.36156],[-1.120961,51.36859],[-1.116785,51.3767],[-1.083632,51.38712],[-1.047537,51.36122],[-0.990405,51.36619],[-0.972636,51.36297],[-0.92376,51.36937],[-0.876809,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.811219,51.34418],[-0.783225,51.34084],[-0.763252,51.32721],[-0.760048,51.32013],[-0.741834,51.31112],[-0.728423,51.28238],[-0.726306,51.25653],[-0.737128,51.23126],[-0.748978,51.2277],[-0.777122,51.23901],[-0.801926,51.23628],[-0.806106,51.24056],[-0.824914,51.23137],[-0.827009,51.22315],[-0.844932,51.20998],[-0.822682,51.18268],[-0.830416,51.15022],[-0.819518,51.15047],[-0.805037,51.15847],[-0.793819,51.15491],[-0.788794,51.14141],[-0.77846,51.13664],[-0.778131,51.13063],[-0.766544,51.11946],[-0.743652,51.11491],[-0.747146,51.10131],[-0.754112,51.10116],[-0.751217,51.09547],[-0.75506,51.08987],[-0.750757,51.0852],[-0.778501,51.07715],[-0.786448,51.06467],[-0.799544,51.06078],[-0.826446,51.05881],[-0.836458,51.0664],[-0.845193,51.06052],[-0.849904,51.0436],[-0.894853,51.01978],[-0.890651,51.00194],[-0.904614,50.99327],[-0.914614,50.97806],[-0.912784,50.9708],[-0.932457,50.94278],[-0.921188,50.9232],[-0.93793,50.91615],[-0.951325,50.89178],[-0.923681,50.86513],[-0.929757,50.85365],[-0.929033,50.84245],[-0.943419,50.82191],[-0.929902,50.78445],[-0.932748,50.77435],[-0.953469,50.73682],[-1.315673,50.77809]]]},{"id":"IBGE_DF_Addresses","name":"IBGE Distrito Federal","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"description":"Addresses data from IBGE","overlay":true},{"id":"IBGE_Setores_Rurais","name":"IBGE Mapa de Setores Rurais","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_Setores_Urbanos","name":"IBGE Mapa de Setores Urbanos","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.838943],[-66.52331,-9.985873],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"id":"osmim-imagicode-S2A_R119_N09_20160327T050917","name":"imagico.de: Adams Bridge","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}","endDate":"2016-03-27T00:00:00.000Z","startDate":"2016-03-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Supplementing incomplete coverage in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80700162014211LGN00","name":"imagico.de: Alaska Range","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-07-31T00:00:00.000Z","startDate":"2014-07-31T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent summer image of the Alaska Range for mapping natural features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral2","name":"imagico.de: Aral Sea (high water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}","endDate":"2016-03-03T00:00:00.000Z","startDate":"2016-03-03T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral1","name":"imagico.de: Aral Sea (low water level)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}","endDate":"2016-09-09T00:00:00.000Z","startDate":"2016-09-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Water and wetland extents, dams etc. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170417T140051","name":"imagico.de: Bahía Blanca (high tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-04-17T00:00:00.000Z","startDate":"2017-04-17T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170127T140051","name":"imagico.de: Bahía Blanca (low tide)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}","endDate":"2017-01-27T00:00:00.000Z","startDate":"2017-01-27T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and islands at the coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81190582014075LGN00","name":"imagico.de: Bakun Reservoir","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-03-16T00:00:00.000Z","startDate":"2014-03-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in older pre-2011 images (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81250592016107LGN00","name":"imagico.de: Batam","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80770232017156LGN00","name":"imagico.de: Bogoslof Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}","endDate":"2017-06-05T00:00:00.000Z","startDate":"2017-06-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image from after the eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81800982013291LGN00","name":"imagico.de: Bouvet Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-18T00:00:00.000Z","startDate":"2013-10-18T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","best":true,"description":"For more accurate coastline and glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R017_S67_20170223T022551","name":"imagico.de: Bunger Hills","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}","endDate":"2017-02-23T00:00:00.000Z","startDate":"2017-02-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R065_N47_20160929T102022","name":"imagico.de: Central Alps in late September 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}","endDate":"2016-09-29T00:00:00.000Z","startDate":"2016-09-29T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82050982015344LGN00","name":"imagico.de: Clerke Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-10T00:00:00.000Z","startDate":"2015-12-10T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R086_N60_20160831T213532","name":"imagico.de: Cook Inlet","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}","endDate":"2016-08-31T00:00:00.000Z","startDate":"2016-08-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Tidal flats and glaciers in surrounding mountains (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0040712016264110KF","name":"imagico.de: Coropuna","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-09-21T00:00:00.000Z","startDate":"2016-09-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R022_N06_20151221T103009","name":"imagico.de: Cotonou","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}","endDate":"2015-12-21T00:00:00.000Z","startDate":"2015-12-21T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Patchy and partly cloudy coverage in usual sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R040_N01_20160311T164128","name":"imagico.de: Darwin and Wolf islands, Galapagos","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}","endDate":"2016-03-11T00:00:00.000Z","startDate":"2016-03-11T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image, only old and poor images in other sources currently (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80360072014245LGN00","name":"imagico.de: Eastern Devon Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-09-02T00:00:00.000Z","startDate":"2014-09-02T00:00:00.000Z","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82160152013239LGN00","name":"imagico.de: Eastern Iceland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-08-27T00:00:00.000Z","startDate":"2013-08-27T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492","name":"imagico.de: El Altar","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}","endDate":"2012-02-05T00:00:00.000Z","startDate":"2012-02-05T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R009_S61_20160109","name":"imagico.de: Elephant Island/Clarence Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}","endDate":"2016-01-09T00:00:00.000Z","startDate":"2016-01-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Fairly clear up-to-date image for updating glacier edges (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-enderby","name":"imagico.de: Enderby Land and Kemp Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}","endDate":"2017-03-27T00:00:00.000Z","startDate":"2017-01-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 images of Enderby Land and Kemp Coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100502015347LGN00","name":"imagico.de: Fogo, Cape Verde","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2014/2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-greenland","name":"imagico.de: Greenland mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Landsat mosaic of Greenland (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R047_S54_20160411T044330","name":"imagico.de: Heard Island coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}","endDate":"2016-04-12T00:00:00.000Z","startDate":"2016-04-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82280982013259LGN00","name":"imagico.de: Isla Londonderry","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-16T00:00:00.000Z","startDate":"2013-09-16T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20151008","name":"imagico.de: Kangerlussuaq Autumn","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}","endDate":"2015-10-08T00:00:00.000Z","startDate":"2015-10-08T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20160518","name":"imagico.de: Kangerlussuaq Spring","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}","endDate":"2016-05-18T00:00:00.000Z","startDate":"2016-05-18T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the airport and roads - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R021_N44_20160807T083013","name":"imagico.de: Kerch Strait","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}","endDate":"2016-08-07T00:00:00.000Z","startDate":"2016-08-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"State of bridge construction in August 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar2","name":"imagico.de: Landsat off-nadir July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}","endDate":"2016-07-17T00:00:00.000Z","startDate":"2016-07-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Latest images north of the regular Landsat limit (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-larsen_2018","name":"imagico.de: Larsen C ice shelf after calving","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}","endDate":"2018-01-06T00:00:00.000Z","startDate":"2018-01-06T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"For updating the ice edge after the 2017 iceberg calving (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de: Leskov Island ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}","endDate":"2013-11-16T00:00:00.000Z","startDate":"2013-11-16T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81991002015286LGN00","name":"imagico.de: Leskov Island Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar","name":"imagico.de: May 2013 off-nadir Landsat","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}","endDate":"2013-05-17T00:00:00.000Z","startDate":"2013-05-17T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R042_S78_20170214T202521","name":"imagico.de: McMurdo Sound and Dry Valleys ","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}","endDate":"2017-02-14T00:00:00.000Z","startDate":"2017-02-14T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S02_20160613T075613","name":"imagico.de: Mount Kenya 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}","endDate":"2016-06-13T00:00:00.000Z","startDate":"2016-06-13T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S05_20160802T075556","name":"imagico.de: Mount Kilimanjaro 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}","endDate":"2016-08-02T00:00:00.000Z","startDate":"2016-08-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80940622015159LGN00","name":"imagico.de: New Ireland","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-06-08T00:00:00.000Z","startDate":"2015-06-08T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Many missing islands in OSM (mostly mapped meanwhile) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2016","name":"imagico.de: North Sea Coast 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-09-25T00:00:00.000Z","startDate":"2016-09-25T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2017","name":"imagico.de: North Sea Coast 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-06-02T00:00:00.000Z","startDate":"2017-06-02T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ural_s2_2016","name":"imagico.de: Northern and Polar Ural mountains August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ndvina","name":"imagico.de: Northern Dvina delta at low tide","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}","endDate":"2015-09-13T00:00:00.000Z","startDate":"2015-09-13T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Beaches, tidal flats and other costal forms (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast","name":"imagico.de: Northern Ellesmere Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-07-09T00:00:00.000Z","startDate":"2012-07-09T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2012 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast_2016","name":"imagico.de: Northern Ellesmere Island July 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}","endDate":"2012-07-15T00:00:00.000Z","startDate":"2012-07-08T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from July 2016 ASTER imagery (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00vis","name":"imagico.de: Northern German west coast tidalflats","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00ir","name":"imagico.de: Northern German west coast tidalflats (infrared)","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}","endDate":"2015-08-21T00:00:00.000Z","startDate":"2015-08-21T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ngreenland_ast","name":"imagico.de: Northern Greenland ASTER","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}","endDate":"2012-08-13T00:00:00.000Z","startDate":"2005-06-21T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A1350972013086110KF","name":"imagico.de: Northwest Heard Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}","endDate":"2013-03-13T00:00:00.000Z","startDate":"2013-03-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R111_N09_20160604T154554","name":"imagico.de: Panama Canal","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}","endDate":"2016-06-07T00:00:00.000Z","startDate":"2016-06-07T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Images of the new locks (but partly cloudy) (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0120532016364110KF","name":"imagico.de: Panama Canal - Pacific side","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}","endDate":"2016-12-30T00:00:00.000Z","startDate":"2016-12-30T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N68_20160930T081002","name":"imagico.de: Pechora Sea Coast","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}","endDate":"2016-09-30T00:00:00.000Z","startDate":"2016-09-30T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81511242016033LGN00","name":"imagico.de: Pensacola Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-02T00:00:00.000Z","startDate":"2016-02-02T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R136_N41_20150831T093006","name":"imagico.de: Prokletije Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}","endDate":"2015-08-31T00:00:00.000Z","startDate":"2015-08-31T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142622_03746_20110415_17533956","name":"imagico.de: Qasigiannguit","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}","endDate":"2011-04-15T00:00:00.000Z","startDate":"2011-04-15T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image of the settlement - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81510432015030LGN00","name":"imagico.de: Rann of Kutch","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-01-01T00:00:00.000Z","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R093_N41_20150828T092005","name":"imagico.de: Rila and Pirin Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}","endDate":"2015-08-28T00:00:00.000Z","startDate":"2015-08-28T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Late summer imagery where usual sources are severely limited by clouds and snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81730602015040LGN00","name":"imagico.de: Rwenzori Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-02-09T00:00:00.000Z","startDate":"2015-02-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N01_20160702T082522","name":"imagico.de: Rwenzori Mountains 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}","endDate":"2016-07-02T00:00:00.000Z","startDate":"2016-07-02T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date image for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80611072014036LGN00","name":"imagico.de: Scott Island","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-02-05T00:00:00.000Z","startDate":"2014-02-05T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100972015347LGN00","name":"imagico.de: Shag Rocks","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-12-13T00:00:00.000Z","startDate":"2015-12-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81130622013270LGN00","name":"imagico.de: Southeastern Sulawesi","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-09-27T00:00:00.000Z","startDate":"2013-09-27T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80281222016035LGN00","name":"imagico.de: Southern Transantarctic Mountains","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-02-04T00:00:00.000Z","startDate":"2016-02-04T00:00:00.000Z","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81030632015286LGN00","name":"imagico.de: Sudirman Range 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}","endDate":"2015-10-13T00:00:00.000Z","startDate":"2015-10-13T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R088_S05_20160812T011732","name":"imagico.de: Sudirman Range 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Cloud free image of the Sudirman Range but with fresh snow (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-s2sval","name":"imagico.de: Svalbard mosaic","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Sentinel-2 mosaic of Svalbard (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx","name":"imagico.de: Thule Air Base","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}","endDate":"2011-05-07T00:00:00.000Z","startDate":"2011-05-07T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule2_2015.09.25","name":"imagico.de: Thule Airbase DMS low altitude overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.10.06","name":"imagico.de: Thule Airbase DMS overflight October 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}","endDate":"2015-10-06T00:00:00.000Z","startDate":"2015-10-06T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.09.25","name":"imagico.de: Thule Airbase DMS overflight September 2015","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}","endDate":"2015-09-25T00:00:00.000Z","startDate":"2015-09-25T00:00:00.000Z","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS aerial images from Thule Airbase - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R094_N79_20160812T105622","name":"imagico.de: Ushakov Island August 2016","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}","endDate":"2016-08-12T00:00:00.000Z","startDate":"2016-08-12T00:00:00.000Z","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Up-to-date late summer imagery with few clouds (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80910682014358LGN00","name":"imagico.de: Vanatinai","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}","endDate":"2014-12-24T00:00:00.000Z","startDate":"2014-12-24T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coarse coastline due to cloud cover in Bing/Mapbox (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82330892016031LGN00","name":"imagico.de: Volcán Calbuco","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}","endDate":"2016-01-31T00:00:00.000Z","startDate":"2016-01-31T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Image from after the 2015 eruption (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R089_N52_20160623T024048","name":"imagico.de: Vostochny Cosmodrome","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}","endDate":"2016-06-23T00:00:00.000Z","startDate":"2016-06-23T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-walps_autumn_2017","name":"imagico.de: Western Alps autumn colors 2017","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}","endDate":"2017-10-17T00:00:00.000Z","startDate":"2017-10-17T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Autumn colors in the Alps, Jura and southwestern Germany  (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81490352013282LGN00","name":"imagico.de: Western Karakoram","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}","endDate":"2013-10-09T00:00:00.000Z","startDate":"2013-10-09T00:00:00.000Z","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R039_S15_20160510T145731","name":"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap","type":"tms","template":"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}","endDate":"2016-05-10T00:00:00.000Z","startDate":"2016-05-10T00:00:00.000Z","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Poor and outdated imagery in other sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"bartholomew_qi1940","name":"Ireland Bartholomew Quarter-Inch 1940","type":"tms","template":"http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png","scaleExtent":[5,13],"polygon":[[[-8.8312773,55.3963337],[-7.3221271,55.398605],[-7.2891331,55.4333162],[-7.2368042,55.4530757],[-7.18881,55.4497995],[-7.1528144,55.3968384],[-6.90561,55.394903],[-6.9047153,55.3842114],[-5.8485282,55.3922956],[-5.8378629,55.248676],[-5.3614762,55.2507024],[-5.3899172,53.8466464],[-5.8734141,53.8487436],[-5.8983,52.8256258],[-6.0191742,52.8256258],[-6.0262844,51.7712367],[-8.1131422,51.7712367],[-8.1273627,51.3268839],[-10.6052842,51.3091083],[-10.6271879,52.0328254],[-10.6469845,52.0322454],[-10.6469845,52.0440365],[-10.6271879,52.0448095],[-10.6290733,52.0745627],[-10.6699234,52.0743695],[-10.6702376,52.0876941],[-10.6312729,52.0898179],[-10.6393128,52.4147202],[-10.3137689,52.4185533],[-10.3166401,53.3341342],[-10.3699669,53.3330727],[-10.385965,54.3534472],[-8.8163777,54.3586265],[-8.8173427,54.6595721],[-8.8413398,54.6616284],[-8.8422286,54.6929749],[-8.8315632,54.7145436],[-8.8151208,54.7145436],[-8.8312773,55.3963337]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"GSGS4136","name":"Ireland British War Office One-Inch 1941-43 GSGS 4136","type":"tms","template":"http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png","scaleExtent":[5,15],"polygon":[[[-10.0847426,51.4147902],[-10.0906535,51.5064103],[-10.4564222,51.5003961],[-10.5005905,52.3043019],[-10.0837522,52.312741],[-10.0840973,52.3404698],[-10.055802,52.3408915],[-10.0768509,52.7628238],[-9.7780248,52.7684611],[-9.7818205,52.8577261],[-9.6337877,52.8596012],[-9.6449626,53.1294502],[-10.0919663,53.1227152],[-10.1051422,53.3912913],[-10.4052593,53.3866349],[-10.4530828,54.193502],[-10.2998523,54.1974988],[-10.3149801,54.4669592],[-8.9276095,54.4853897],[-8.9339534,54.7546562],[-8.7773069,54.755501],[-8.7826749,55.0252208],[-8.9402974,55.0238221],[-8.9451773,55.2934155],[-7.528039,55.2970274],[-7.525599,55.3874955],[-7.0541955,55.3841691],[-7.0556595,55.2939712],[-6.3241545,55.2859128],[-6.3217146,55.3253556],[-6.1035807,55.3223016],[-6.1045566,55.2828557],[-5.7985836,55.2772968],[-5.8117595,55.0087135],[-5.656577,55.0056351],[-5.6721928,54.7355021],[-5.3618278,54.729585],[-5.3964755,54.1917889],[-5.855679,54.2017807],[-5.9220464,52.8524504],[-6.070885,52.8551025],[-6.1030927,52.1373337],[-6.8331336,52.1463183],[-6.8355736,52.0578908],[-7.5641506,52.0617913],[-7.5661026,51.7921593],[-8.147305,51.792763],[-8.146329,51.7033331],[-8.2912636,51.7027283],[-8.2897996,51.5227274],[-9.1174397,51.516958],[-9.1179277,51.4625685],[-9.3692452,51.4616564],[-9.3672933,51.4254613],[-10.0847426,51.4147902]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"http://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[12,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]]},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],"terms_text":"Kanton Basel-Stadt OF 2015"},{"id":"KTBASELSTADT2017","name":"Kanton Basel-Stadt 2017","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.6713752,47.5952248],[7.6799583,47.6007811],[7.6845073,47.6018228],[7.6943779,47.601707],[7.6939487,47.5966718],[7.6870823,47.5935462],[7.6788425,47.5871208],[7.685709,47.585384],[7.6890564,47.5761205],[7.6941204,47.573399],[7.6924038,47.5669132],[7.6847005,47.5617009],[7.6642513,47.5616429],[7.6487159,47.5568934],[7.6303482,47.558689],[7.6235675,47.5566617],[7.6278591,47.5514483],[7.6273763,47.5365801],[7.6183319,47.5366163],[7.6133537,47.5326179],[7.5996208,47.5191137],[7.5850296,47.5191717],[7.5840854,47.5263589],[7.5771331,47.5316327],[7.581253,47.5398612],[7.5718975,47.5414835],[7.553873,47.5414835],[7.5537872,47.5512166],[7.5565338,47.5582836],[7.5537014,47.5603108],[7.5537872,47.5747308],[7.5643444,47.5812157],[7.5793647,47.579884],[7.583313,47.5901889],[7.5856304,47.5923306],[7.5920677,47.5923885],[7.598505,47.5907098],[7.609148,47.5864261],[7.6092338,47.5810999],[7.6191043,47.580463],[7.6368713,47.593141],[7.6378154,47.595572],[7.6416778,47.5988711],[7.6452827,47.6002602],[7.664938,47.5961798],[7.6713752,47.5952248]]],"terms_text":"Kanton Basel-Stadt OF 2017","best":true},{"id":"Solothurn-sogis2014-tms","name":"Kanton Solothurn 25cm (SOGIS 2014-2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[15,19],"polygon":[[[7.3404127,47.2175697],[7.4154818,47.2402115],[7.4173645,47.2537956],[7.4658424,47.2646513],[7.4946766,47.2882287],[7.5328638,47.294534],[7.5483333,47.3163566],[7.5709479,47.3263111],[7.5604584,47.342492],[7.5388991,47.3476266],[7.5396485,47.3601134],[7.5217459,47.3651488],[7.5237238,47.3720704],[7.4634937,47.3702566],[7.4361035,47.3781317],[7.4434011,47.4023143],[7.4774682,47.4012772],[7.4792364,47.3897076],[7.5022557,47.384807],[7.5213659,47.3912021],[7.5311724,47.4035251],[7.5252352,47.4116329],[7.5807413,47.414704],[7.5682954,47.4223349],[7.5689044,47.436897],[7.5812069,47.4287807],[7.6157989,47.4327479],[7.6260723,47.4629139],[7.6044949,47.4704455],[7.6072998,47.4893984],[7.640966,47.4827341],[7.6559259,47.4873946],[7.6521711,47.4958144],[7.6661209,47.4968682],[7.6683266,47.4863467],[7.699761,47.4806325],[7.709878,47.4693848],[7.6848538,47.4478436],[7.6798021,47.417514],[7.6327228,47.4100311],[7.633317,47.382914],[7.6417611,47.3804694],[7.6442033,47.3672084],[7.7279138,47.3688589],[7.751519,47.3443275],[7.7935609,47.3390523],[7.8021665,47.3610959],[7.8788122,47.3835105],[7.8691367,47.3955143],[7.883332,47.4060973],[7.9097377,47.398521],[7.9550377,47.4156057],[7.9618317,47.4218343],[7.9467846,47.4431934],[7.9682836,47.4628082],[7.9872707,47.4287435],[7.9854653,47.4227641],[7.9827035,47.4283325],[7.9631993,47.4223547],[8.0072617,47.4065858],[8.0100022,47.395418],[8.0265612,47.3956224],[8.0313669,47.3836856],[8.0038366,47.3453146],[8.0051906,47.3367516],[7.9479701,47.3171432],[7.9478307,47.3325169],[7.9192088,47.3339507],[7.9078055,47.341719],[7.889098,47.3114878],[7.8611018,47.3061239],[7.8418057,47.2744707],[7.8166423,47.2616706],[7.8028241,47.2684079],[7.7861469,47.256098],[7.7746009,47.267869],[7.7568187,47.258095],[7.7326672,47.2591133],[7.684769,47.2939919],[7.6482742,47.2819898],[7.5801066,47.2763483],[7.5936981,47.2662199],[7.5959384,47.245569],[7.6261802,47.2263143],[7.6405558,47.2297944],[7.6484666,47.2189525],[7.6472258,47.2017823],[7.6715278,47.1949714],[7.6711002,47.1845216],[7.6779881,47.1819259],[7.6728612,47.1683945],[7.6600808,47.1684026],[7.6451021,47.1489207],[7.6155322,47.1565739],[7.5861404,47.1475453],[7.5810534,47.16013],[7.5634674,47.1683541],[7.5257686,47.162205],[7.5203336,47.1588879],[7.5297508,47.1487369],[7.5097234,47.1255457],[7.4613252,47.1082327],[7.4750945,47.0867101],[7.454461,47.074927],[7.4354156,47.0801664],[7.4340002,47.1005003],[7.3820271,47.0957398],[7.3704914,47.1209312],[7.4401788,47.1237276],[7.4217922,47.1358605],[7.447783,47.1550805],[7.4728074,47.1525609],[7.4970383,47.1700873],[7.4804964,47.171738],[7.4708545,47.181324],[7.4757226,47.1906485],[7.4497638,47.1895691],[7.4476258,47.1810839],[7.4332849,47.1847269],[7.4118135,47.1624212],[7.3842442,47.1601249],[7.3821749,47.1651186],[7.391911,47.1662739],[7.3835137,47.1803011],[7.3654609,47.1944525],[7.3544799,47.1915316],[7.3404127,47.2175697]],[[7.420816,47.4803666],[7.4349836,47.4981011],[7.4707584,47.480734],[7.487277,47.4820136],[7.5116652,47.5026958],[7.5317892,47.4973989],[7.5366964,47.4850517],[7.5274454,47.4739062],[7.5306791,47.4611886],[7.4565122,47.4492558],[7.445214,47.4623781],[7.4557367,47.4733767],[7.420816,47.4803666]],[[7.3759458,47.4140995],[7.3821514,47.4330266],[7.4209041,47.4459442],[7.4378427,47.4463232],[7.4555765,47.4279232],[7.4437574,47.413444],[7.3759458,47.4140995]],[[7.6744234,47.1539707],[7.6853662,47.1662986],[7.7007985,47.1617746],[7.6901531,47.1525567],[7.6744234,47.1539707]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015  10cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"id":"kartverket-topo4","name":"Kartverket N50 topo","type":"tms","template":"http://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}","scaleExtent":[3,15],"polygon":[[[31.904253,70.4368136],[28.4765186,71.3289643],[23.6865015,71.2514263],[16.8090601,70.0730823],[11.1620655,67.5253903],[9.975542,64.811576],[4.2187061,62.1449966],[4.3725367,59.1871966],[6.1743055,57.8915032],[7.932118,57.7393554],[10.777577,58.8649103],[11.7224012,58.762509],[12.722157,60.1141506],[13.0517469,61.3493518],[12.5243921,63.6169922],[14.2382593,63.9856094],[15.1171656,65.9016624],[18.6987085,68.3749083],[20.0610132,68.2612583],[21.0058375,68.7841518],[25.2465601,68.3506025],[26.9384546,69.8472011],[28.7621851,69.6112133],[28.5864039,68.8556004],[31.069314,69.5191547],[31.904253,70.4368136]]],"terms_url":"https://wiki.openstreetmap.org/wiki/No:Kartverket_import","terms_text":"© Kartverket","description":"Topographic map N50, equivalent to Norway 1:50.000 paper map series.","icon":"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{"id":"kelowna_2012","name":"Kelowna 2012","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png","endDate":"2012-05-14T00:00:00.000Z","startDate":"2012-05-13T00:00:00.000Z","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"description":"High quality aerial imagery taken for the City of Kelowna"},{"id":"kelowna_roads","name":"Kelowna Roads overlay","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"overlay":true},{"id":"landsat_233055","name":"Landsat 233055","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png","endDate":"2013-09-03T00:00:00.000Z","startDate":"2013-09-03T00:00:00.000Z","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"id":"lu.geoportail.opendata.ortholatest","name":"Latest available ortho geoportail.lu","type":"tms","template":"http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","best":true,"icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"landsat_047026","name":"Latest southwest British Columbia Landsat","type":"tms","template":"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png","endDate":"2013-09-12T00:00:00.000Z","startDate":"2013-09-12T00:00:00.000Z","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"id":"LINZ_NZ_Aerial_Imagery","name":"LINZ NZ Aerial Imagery","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.0","best":true},{"id":"LINZ_NZ_Topo50_Gridless_Maps","name":"LINZ NZ Topo50 Gridless Maps","type":"tms","template":"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://www.geoportal.lt","terms_text":"NŽT ORT10LT","best":true},{"id":"mapbox_locator_overlay","name":"Locator Overlay","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"id":"londrina2011","name":"Londrina Ortofoto 2011","type":"tms","template":"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"terms_url":"http://siglon.londrina.pr.gov.br/","terms_text":"Prefeitura do Londrinas, PR"},{"id":"NSW_LPI_BaseMap","name":"LPI NSW Base Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"NSW_LPI_Imagery","name":"LPI NSW Imagery","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017","best":true},{"id":"NSW_LPI_TopographicMap","name":"LPI NSW Topographic Map","type":"tms","template":"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,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"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Six Inch resolution aerial imagery for the State of Maryland"},{"id":"geodata.md.gov-MD_ColorBasemap","name":"MD Transportation Basemap","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"terms_url":"http://imap.maryland.gov/Pages/imagery-products.aspx","terms_text":"DoIT, MD iMap, MDP","description":"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{"id":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{"id":"geodata.state.nj.us-Natural2015","name":"NJ 2015 Aerial Imagery (Natural Color)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"terms_url":"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}","terms_text":"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)","description":"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{"id":"NLS-Bartholomew-hfinch-hist","name":"NLS - Bartholomew Half Inch, 1897-1907","type":"tms","template":"http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png","scaleExtent":[0,15],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-7th_Series","name":"NLS - OS 1-inch 7th Series 1955-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-1st_Series","name":"NLS - OS 1:25k 1st Series 1937-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-4.7157244,54.6796556],[-4.6850662,54.6800268],[-4.6835779,54.6623245],[-4.7148782,54.6615818],[-4.7157244,54.6796556]],[[-3.7085748,58.3371151],[-3.5405937,58.3380684],[-3.5315137,58.1608002],[-3.3608086,58.1622372],[-3.3653486,58.252173],[-3.1610473,58.2536063],[-3.1610473,58.3261509],[-3.0275704,58.3271045],[-3.0366505,58.6139001],[-3.0021463,58.614373],[-3.0030543,58.7036341],[-3.4180129,58.7003322],[-3.4171049,58.6290293],[-3.7240109,58.6266658],[-3.7231029,58.606806],[-4.2361262,58.5992374],[-4.2334022,58.5092347],[-3.88836,58.5144516],[-3.8829119,58.4261327],[-3.7158389,58.4270836],[-3.7085748,58.3371151]],[[-6.46676,49.9943621],[-6.1889102,50.004868],[-6.1789222,49.8967815],[-6.3169391,49.8915171],[-6.312399,49.8200979],[-6.4504159,49.8159968],[-6.46676,49.9943621]],[[-5.6453263,50.2029809],[-5.7801329,50.2014076],[-5.7637888,50.0197267],[-5.3479221,50.0290604],[-5.3388421,49.9414854],[-5.024672,49.9473287],[-5.0355681,50.0383923],[-5.0010639,50.0453901],[-4.9974319,50.1304478],[-4.855783,50.13394],[-4.861231,50.206057],[-4.6546085,50.2140172],[-4.6558926,50.3018616],[-4.5184924,50.3026818],[-4.51464,50.325642],[-4.2488284,50.3264618],[-4.2488284,50.3100631],[-4.10886,50.3141633],[-4.1062917,50.2411267],[-3.9648088,50.2432047],[-3.9640778,50.2254158],[-3.8522287,50.2273626],[-3.8503757,50.1552563],[-3.6921809,50.1572487],[-3.5414602,50.1602198],[-3.5465781,50.3226814],[-3.4068012,50.3241013],[-3.4165761,50.5892711],[-3.2746691,50.5962721],[-3.2749172,50.6106323],[-2.9971742,50.613972],[-2.9896008,50.688537],[-2.7120266,50.690565],[-2.710908,50.6195964],[-2.5695473,50.6157538],[-2.5651019,50.5134083],[-2.4014463,50.513379],[-2.3940583,50.6160348],[-2.2894123,50.6147436],[-2.2876184,50.6008549],[-2.1477855,50.6048506],[-2.1451013,50.5325437],[-1.9335117,50.5347477],[-1.9362139,50.6170445],[-1.8573025,50.6228094],[-1.8554865,50.709139],[-1.6066929,50.709139],[-1.6085089,50.6239615],[-1.4450678,50.6228094],[-1.4432518,50.5317039],[-1.1545059,50.5293951],[-1.1472419,50.6170485],[-1.011041,50.6205051],[-1.011041,50.7056889],[-0.704135,50.7045388],[-0.700503,50.7769401],[-0.5860943,50.7723465],[-0.5879103,50.7907181],[-0.0149586,50.7798108],[-0.0185906,50.7625836],[0.0967261,50.7620093],[0.0921861,50.6913106],[0.3046595,50.6890096],[0.3101075,50.7757917],[0.5511831,50.7726336],[0.5529991,50.8432096],[0.695556,50.8403428],[0.696464,50.8592608],[0.9852099,50.8523824],[0.9906579,50.9417226],[1.0160821,50.9411504],[1.0215301,51.0303204],[1.2812198,51.0240383],[1.2848518,51.0948044],[1.4277848,51.0948044],[1.4386809,51.2882859],[1.4713691,51.2871502],[1.4804492,51.3994534],[1.1590151,51.4073836],[1.1590151,51.3869889],[1.0191822,51.3903886],[1.0228142,51.4798247],[0.8793493,51.4843484],[0.8829813,51.5566675],[1.0264462,51.5544092],[1.0373423,51.7493319],[1.2607117,51.7482076],[1.2661598,51.8279642],[1.3351682,51.8335756],[1.3478803,51.9199021],[1.4840812,51.9199021],[1.4986093,52.0038271],[1.6438902,52.0027092],[1.6656823,52.270221],[1.7310588,52.270221],[1.7528509,52.4465637],[1.8254914,52.4476705],[1.8345714,52.624408],[1.7690346,52.6291402],[1.7741711,52.717904],[1.6996925,52.721793],[1.706113,52.8103687],[1.559724,52.8165777],[1.5648605,52.9034116],[1.4184715,52.9103818],[1.4223238,52.9281894],[1.3439928,52.9289635],[1.3491293,53.0001194],[0.4515789,53.022589],[0.4497629,52.9351139],[0.3789384,52.9351139],[0.3716744,52.846365],[0.2227614,52.8496552],[0.2336575,52.9329248],[0.3062979,52.9351139],[0.308114,53.022589],[0.3807544,53.0236813],[0.3993708,53.2933729],[0.3248922,53.2987454],[0.3274604,53.3853782],[0.2504136,53.38691],[0.2581183,53.4748924],[0.1862079,53.4779494],[0.1913443,53.6548777],[0.1502527,53.6594436],[0.1528209,53.7666003],[0.0012954,53.7734308],[0.0025796,53.8424326],[-0.0282392,53.841675],[-0.0226575,53.9311501],[-0.1406983,53.9322193],[-0.1416063,54.0219323],[-0.1706625,54.0235326],[-0.1679384,54.0949482],[-0.0126694,54.0912206],[-0.0099454,54.1811226],[-0.1615824,54.1837795],[-0.1606744,54.2029038],[-0.2405789,54.2034349],[-0.2378549,54.2936234],[-0.3894919,54.2941533],[-0.3857497,54.3837321],[-0.461638,54.3856364],[-0.4571122,54.4939066],[-0.6105651,54.4965434],[-0.6096571,54.5676704],[-0.7667421,54.569776],[-0.7640181,54.5887213],[-0.9192871,54.5908258],[-0.9148116,54.6608348],[-1.1485204,54.6634343],[-1.1472363,54.7528316],[-1.2268514,54.7532021],[-1.2265398,54.8429879],[-1.2991803,54.8435107],[-1.2991803,54.9333391],[-1.3454886,54.9354258],[-1.3436726,55.0234878],[-1.3772688,55.0255698],[-1.3754528,55.1310877],[-1.4997441,55.1315727],[-1.4969272,55.2928323],[-1.5296721,55.2942946],[-1.5258198,55.6523803],[-1.7659492,55.6545537],[-1.7620968,55.7435626],[-1.9688392,55.7435626],[-1.9698023,55.8334505],[-2.0019051,55.8336308],[-2.0015841,55.9235526],[-2.1604851,55.9240613],[-2.1613931,55.9413549],[-2.3202942,55.9408463],[-2.3212022,56.0145126],[-2.5627317,56.0124824],[-2.5645477,56.1022207],[-2.9658863,56.0991822],[-2.9667943,56.1710304],[-2.4828272,56.1755797],[-2.4882752,56.2856078],[-2.5645477,56.2835918],[-2.5681798,56.3742075],[-2.7261728,56.3732019],[-2.7316208,56.4425301],[-2.6190281,56.4425301],[-2.6153961,56.5317671],[-2.453771,56.5347715],[-2.4534686,56.6420248],[-2.4062523,56.6440218],[-2.3953562,56.7297964],[-2.2936596,56.7337811],[-2.2972916,56.807423],[-2.1629067,56.8113995],[-2.1592747,56.9958425],[-1.9922016,57.0017771],[-2.0067297,57.2737477],[-1.9195612,57.2757112],[-1.9304572,57.3482876],[-1.8106005,57.3443682],[-1.7997044,57.4402728],[-1.6616875,57.4285429],[-1.6689516,57.5398256],[-1.7452241,57.5398256],[-1.7524881,57.6313302],[-1.8287606,57.6332746],[-1.8287606,57.7187255],[-3.1768526,57.7171219],[-3.1794208,57.734264],[-3.5134082,57.7292105],[-3.5129542,57.7112683],[-3.7635638,57.7076303],[-3.7598539,57.635713],[-3.8420372,57.6343382],[-3.8458895,57.6178365],[-3.9794374,57.6157733],[-3.9794374,57.686544],[-3.8150708,57.689976],[-3.817639,57.7968899],[-3.6853753,57.7989429],[-3.6892276,57.8891567],[-3.9383458,57.8877915],[-3.9421981,57.9750592],[-3.6943641,57.9784638],[-3.6969323,58.0695865],[-4.0372226,58.0641528],[-4.0346543,57.9730163],[-4.2003051,57.9702923],[-4.1832772,57.7012869],[-4.518752,57.6951111],[-4.5122925,57.6050682],[-4.6789116,57.6016628],[-4.666022,57.4218334],[-3.6677696,57.4394729],[-3.671282,57.5295384],[-3.3384979,57.5331943],[-3.3330498,57.4438859],[-2.8336466,57.4485275],[-2.8236396,56.9992706],[-2.3305398,57.0006693],[-2.3298977,56.9113932],[-2.6579889,56.9092901],[-2.6559637,56.8198406],[-2.8216747,56.8188467],[-2.8184967,56.7295397],[-3.1449248,56.7265508],[-3.1435628,56.6362749],[-3.4679089,56.6350265],[-3.474265,56.7238108],[-3.8011471,56.7188284],[-3.785711,56.4493026],[-3.946428,56.4457896],[-3.9428873,56.2659777],[-4.423146,56.2588459],[-4.4141572,56.0815506],[-4.8944159,56.0708008],[-4.8791072,55.8896994],[-5.1994158,55.8821374],[-5.1852906,55.7023791],[-5.0273445,55.7067203],[-5.0222081,55.6879046],[-4.897649,55.6907999],[-4.8880181,55.6002822],[-4.7339244,55.6046348],[-4.7275038,55.5342082],[-4.773732,55.5334815],[-4.7685955,55.4447227],[-4.8494947,55.4418092],[-4.8405059,55.3506535],[-4.8700405,55.3513836],[-4.8649041,55.2629462],[-4.9920314,55.2592875],[-4.9907473,55.1691779],[-5.0600894,55.1655105],[-5.0575212,55.0751884],[-5.2141831,55.0722477],[-5.1991766,54.8020337],[-5.0466316,54.8062205],[-5.0502636,54.7244996],[-4.9703591,54.7203043],[-4.9776232,54.6215905],[-4.796022,54.6342056],[-4.796022,54.7307917],[-4.8977186,54.7265971],[-4.9086147,54.8145928],[-4.8069181,54.8166856],[-4.8105501,54.7915648],[-4.6943253,54.7978465],[-4.6761652,54.7244996],[-4.5744686,54.7244996],[-4.5599405,54.6426135],[-4.3093309,54.6384098],[-4.3333262,54.8229889],[-4.2626999,54.8274274],[-4.2549952,54.7348587],[-3.8338058,54.7400481],[-3.836374,54.8141105],[-3.7118149,54.8133706],[-3.7143831,54.8318654],[-3.5346072,54.8355633],[-3.5271039,54.9066228],[-3.4808758,54.9084684],[-3.4776655,54.7457328],[-3.5874573,54.744621],[-3.5836049,54.6546166],[-3.7107322,54.6531308],[-3.6991752,54.4550407],[-3.5746161,54.4572801],[-3.5759002,54.3863042],[-3.539945,54.3855564],[-3.5386609,54.297224],[-3.46033,54.2957252],[-3.4590458,54.2079507],[-3.3807149,54.2102037],[-3.381999,54.1169788],[-3.302878,54.1160656],[-3.300154,54.0276224],[-3.1013007,54.0292224],[-3.093596,53.6062158],[-3.2065981,53.6016441],[-3.2091663,53.4917753],[-3.2451215,53.4887193],[-3.2348486,53.4045934],[-3.5276266,53.3999999],[-3.5343966,53.328481],[-3.6488053,53.3252272],[-3.6527308,53.3057716],[-3.7271873,53.3046865],[-3.7315003,53.3945257],[-3.9108315,53.3912769],[-3.9071995,53.3023804],[-3.9521457,53.3015665],[-3.9566724,53.3912183],[-4.1081979,53.3889209],[-4.1081979,53.4072967],[-4.2622916,53.4065312],[-4.2635757,53.4753707],[-4.638537,53.4677274],[-4.6346847,53.3812621],[-4.7091633,53.3774321],[-4.7001745,53.1954965],[-4.5499332,53.1962658],[-4.5435126,53.1092488],[-4.3919871,53.1100196],[-4.3855666,53.0236002],[-4.6115707,53.0205105],[-4.603866,52.9284932],[-4.7566756,52.9261709],[-4.7476868,52.8370555],[-4.8208813,52.8331768],[-4.8208813,52.7446476],[-4.3701572,52.7539749],[-4.3765778,52.8401583],[-4.2314728,52.8455875],[-4.2237682,52.7586379],[-4.1056297,52.7570836],[-4.1015192,52.6714874],[-4.1487355,52.6703862],[-4.1305754,52.4008596],[-4.1995838,52.3986435],[-4.2050319,52.3110195],[-4.3466808,52.303247],[-4.3484968,52.2365693],[-4.4901457,52.2332328],[-4.4883297,52.2098702],[-4.6572188,52.2098702],[-4.6590348,52.1385939],[-4.7788916,52.13525],[-4.7807076,52.1162967],[-4.9259885,52.1140663],[-4.9187245,52.0392855],[-5.2365265,52.0314653],[-5.2347105,51.9442339],[-5.3473032,51.9408755],[-5.3473032,51.9195995],[-5.4925842,51.9162392],[-5.4853201,51.8265386],[-5.1983903,51.8321501],[-5.1893102,51.7625177],[-5.335825,51.7589528],[-5.3281204,51.6686495],[-5.1836575,51.6730296],[-5.1836575,51.6539134],[-5.0674452,51.6578966],[-5.0603825,51.5677905],[-4.5974594,51.5809588],[-4.60388,51.6726314],[-4.345773,51.6726314],[-4.3355001,51.4962964],[-3.9528341,51.5106841],[-3.9425611,51.5905333],[-3.8809237,51.5953198],[-3.8706508,51.5074872],[-3.7679216,51.4978952],[-3.7550805,51.4242895],[-3.5855774,51.41468],[-3.5778727,51.3329177],[-3.0796364,51.3329177],[-3.0770682,51.2494018],[-3.7216935,51.2381477],[-3.7216935,51.2558315],[-3.8706508,51.2558315],[-3.8680825,51.2365398],[-4.2944084,51.2252825],[-4.289272,51.0496352],[-4.5692089,51.0431767],[-4.5624122,50.9497388],[-4.5905604,50.9520269],[-4.5896524,50.8627065],[-4.6296046,50.8592677],[-4.6226411,50.7691513],[-4.6952816,50.7680028],[-4.6934655,50.6967379],[-4.8342064,50.6938621],[-4.8296664,50.6046231],[-4.9676833,50.6000126],[-4.9685913,50.5821427],[-5.1084242,50.5786832],[-5.1029762,50.4892254],[-5.1311244,50.48807],[-5.1274923,50.4163798],[-5.2664172,50.4117509],[-5.2609692,50.3034214],[-5.5124868,50.2976214],[-5.5061308,50.2256428],[-5.6468717,50.2209953],[-5.6453263,50.2029809]],[[-5.1336607,55.2630226],[-5.1021999,55.2639372],[-5.0999527,55.2458239],[-5.1322161,55.2446343],[-5.1336607,55.2630226]],[[-5.6431878,55.5095745],[-5.4861028,55.5126594],[-5.4715747,55.3348829],[-5.6277517,55.3302345],[-5.6431878,55.5095745]],[[-4.7213517,51.2180246],[-4.5804201,51.2212417],[-4.5746416,51.1306736],[-4.7174993,51.1280545],[-4.7213517,51.2180246]],[[-5.1608796,55.4153626],[-5.0045387,55.4190069],[-5.0184798,55.6153521],[-5.1755648,55.6138137],[-5.1608796,55.4153626]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-25inch-hist","name":"NLS - OS 25-inch (Scotland), 1892-1905","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25_inch/scotland_1/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-6inch-Scotland-hist","name":"NLS - OS 6-inch Scotland 1842-82","type":"tms","template":"http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLSC-EMAP5","name":"NLSC General Map with Contour line","type":"tms","template":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://maps.nlsc.gov.tw/","terms_text":"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0","description":"The emap from Taiwan National Land Surveying and Mapping Center","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"id":"IBGE_Salvador_Streets","name":"Nomes de Ruas IBGE Salvador-BA","type":"tms","template":"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-38.489742279052734,-12.811131765117107],[-38.54484558105469,-13.013924052026558],[-38.47755432128906,-13.034662471471638],[-38.33473205566406,-12.946846814654444],[-38.30005645751953,-12.906692193510644],[-38.33953857421875,-12.904349641337422],[-38.35481643676758,-12.830213284310222],[-38.38090896606445,-12.821844374997415],[-38.40717315673828,-12.867535227819912],[-38.46536636352539,-12.815985972925704],[-38.489742279052734,-12.811131765117107]]],"description":"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.","overlay":true},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"terms_url":"https://www.openstreetmap.org/copyright","terms_text":"© OpenStreetMap contributors","terms_html":"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.","description":"Public GPS traces uploaded to OpenStreetMap.","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.ortho2010","name":"Ortho 2010 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2010-07-02T00:00:00.000Z","startDate":"2010-06-24T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2013","name":"Ortho 2013 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2013-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2016","name":"Ortho 2016 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2016-08-16T00:00:00.000Z","startDate":"2013-08-30T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"lu.geoportail.opendata.ortho2017","name":"Ortho 2017 geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg","endDate":"2017-06-22T00:00:00.000Z","startDate":"2017-06-14T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"overlay":true},{"id":"OS-OpenData_StreetView","name":"OS OpenData StreetView","type":"tms","template":"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"terms_url":"http://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance","terms_text":"Kadaster / Beeldmateriaal.nl, CC BY 4.0","best":true,"description":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,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"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,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"},{"id":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"id":"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017","name":"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017","type":"tms","template":"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"id":"South_Africa-CD_NGI-Aerial","name":"South Africa CD:NGI Aerial","type":"tms","template":"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{"id":"South-Tyrol-Orthofoto-2014-2015","name":"South Tyrol Orthofoto 2014/2015","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","endDate":"2015-11-01T00:00:00.000Z","startDate":"2014-07-01T00:00:00.000Z","scaleExtent":[0,18],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0","best":true},{"id":"South-Tyrol-Topomap","name":"South Tyrol Topomap","type":"tms","template":"http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg","scaleExtent":[0,20],"polygon":[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],"terms_url":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern ","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"id":"Surrey-Air_Survey","name":"Surrey Air Survey","type":"tms","template":"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,21],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true},{"id":"tnris.org","name":"Texas Orthophoto","type":"tms","template":"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}","startDate":"2012-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"id":"US-TIGER-Roads-2017","name":"TIGER Roads 2017","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","icon":"data:image/png;base64,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","overlay":true},{"id":"lu.geoportail.opendata.topo","name":"Topographical Map geoportail.lu","type":"tms","template":"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png","endDate":"2010-07-20T00:00:00.000Z","startDate":"2013-07-19T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,50.17631]]],"terms_url":"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts/","terms_text":"Administration du Cadastre et de la Topographie","icon":"https://www.geoportail.lu/static/img/lion.png"},{"id":"Tours-Orthophoto-2008_2010","name":"Tours - Orthophotos 2008-2010","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s) Plus 2008"},{"id":"Tours-Orthophoto-2013","name":"Tours - Orthophotos 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}","endDate":"2013-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,22],"polygon":[[[0.427093505859375,47.26199018174824],[0.427093505859375,47.50096732311069],[0.814361572265625,47.50096732311069],[0.814361572265625,47.26199018174824],[0.427093505859375,47.26199018174824]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"UrbISOrtho2017","name":"UrbIS-Ortho 2017","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Urbis:Ortho2017/https://geoservices-urbis.irisnet.be/geoserver/ows","endDate":"2018-01-01T00:00:00.000Z","startDate":"2017-01-01T00:00:00.000Z","polygon":[[[4.3797288,50.7638205],[4.3891701,50.7637662],[4.430283,50.7751656],[4.4350037,50.7750028],[4.464272,50.7864537],[4.4816956,50.7913372],[4.4823823,50.7961658],[4.459208,50.8062556],[4.4594655,50.8166144],[4.4797215,50.8203559],[4.4695935,50.8353735],[4.4689927,50.8457258],[4.4623837,50.8539626],[4.4496808,50.8559133],[4.4459901,50.8599226],[4.4253049,50.8661526],[4.431828,50.8762815],[4.4400677,50.8784478],[4.4310555,50.8901441],[4.4359479,50.8950167],[4.4295964,50.9010255],[4.4165501,50.9075748],[4.4154343,50.9134197],[4.3957791,50.914069],[4.3846211,50.9109303],[4.3811879,50.9031907],[4.3726048,50.9003218],[4.3621335,50.9032989],[4.3485722,50.9034072],[4.3402467,50.9041108],[4.328917,50.902487],[4.3164716,50.8960453],[4.3063435,50.8927429],[4.2900357,50.8898192],[4.2914948,50.8849461],[4.2955289,50.8826176],[4.2956147,50.8809389],[4.2827401,50.8722735],[4.2769894,50.8671277],[4.2780194,50.8591099],[4.2804227,50.8572136],[4.2809376,50.8421489],[4.2719254,50.8403603],[4.2546735,50.8369455],[4.2510686,50.83288],[4.2522702,50.8269708],[4.2434296,50.82182],[4.2440305,50.8154755],[4.2551884,50.8150959],[4.2580209,50.8093472],[4.2721829,50.8101065],[4.2757878,50.8069607],[4.2854008,50.8050623],[4.2890057,50.8069065],[4.298018,50.8059302],[4.3028245,50.7970881],[4.3145833,50.7945382],[4.3162141,50.7862367],[4.3295178,50.7738087],[4.3420491,50.7716375],[4.3452248,50.7733745],[4.3785271,50.7681092],[4.3797288,50.7638205]]],"terms_text":"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsSAAALEgHS3X78AAACnUlEQVQoz11SXUiTYRh93ndz06YMNWcpRmWRSpgO+0EUDYwQ6sZ+oAyti8y6yCyKxOimILqQsLKbukmHSpFFLYlMqSkUmi3/pjZ/Zmv+Tec2bU237z1dfFHSc/HcPOc5HM45DAAREREgGOM217BpzDjs7PEHfNGa2PT47KxN+RFqrYDgjBMRE0JijBMRAKOlzmgxhChDN0cla1ThM0uTE65vsRFxRRkXk3TpMiMBkEQQQFPvw0LDnoYvVStBNwAhBIApj+X6m5OlT/dbnX0AJCHxkbl+zhTWub6XA4ZDqcd3JJTl1to7HV7G2E3TxOU2zaWcKm1YZKO5RlaliNknBma6Bqe7V6SVc5mVrmVFxSvLu1G3bSlwy2jVaXE6IzE0JLzV+jxJlxYTvp5X5j3Qx2ePzPcn6VJVysiUaHXX+d2zy8HqlrE8/bq3xXoiStalr1Fpxl1DRMQ547s27NWGRikVKtmuju9e34pEYcrhWV/f7E8iUinDQrjaH/AREQfAmSJGEzc6P0Qkvbd5ymt7DqfEmEr0Tre/4PFXInK4R7z+hXjtRiIi2aKPtpbi+qxue6vHj5ou+8KvAIBPP7yG3mkAd9sry18ULPrdAAgQAIJS4EZLacXrwqVlDwBJiKAkJCEB+Gz/UNyQ1TxY/8dWIiYgFFx5JPXM7JLjWe8jIgKBM3DGXT5no7lmy9rteVsLiIjJGXPGBcQ2XdqBlKJWa1PHeLOCcRAEhKH7zuKy+4T+QohCDQhGjLBqJBGsNl0teZI3OGMG0GiuKarPNI0aZTEyhq0qHxhjXv/C7bYyASkjIddoqctPOnY07ezf5hHRvwcikg+TXtv9jmsOjy0n8eCpnVeIESMiecnE/6kC0D/Vea+90h/wARAQqwG/AaEjsUbwLtXdAAAAAElFTkSuQmCC"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,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"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,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"},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"id":"wien.gv.at-labels","name":"Vienna: Beschriftungen (annotations)","type":"tms","template":"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{"id":"wien.gv.at-aerial_image","name":"Vienna: Orthofoto (aerial image)","type":"tms","template":"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"}];
 
-var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"airport","fields":["aeroway"],"geometry":["point","vertex","line","area"],"tags":{"aeroway":"*"},"searchable":false,"name":"Aeroway"},"amenity":{"fields":["amenity"],"geometry":["point","vertex","area"],"tags":{"amenity":"*"},"searchable":false,"name":"Amenity"},"highway":{"fields":["name","highway"],"geometry":["point","vertex","line","area"],"tags":{"highway":"*"},"searchable":false,"name":"Highway"},"place":{"fields":["name","place"],"geometry":["point","vertex","area"],"tags":{"place":"*"},"searchable":false,"name":"Place"},"power":{"geometry":["point","vertex","line","area"],"tags":{"power":"*"},"fields":["power"],"searchable":false,"name":"Power"},"railway":{"fields":["railway"],"geometry":["point","vertex","line","area"],"tags":{"railway":"*"},"searchable":false,"name":"Railway"},"roundabout":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"roundabout"},"name":"Roundabout","searchable":false},"waterway":{"fields":["name","waterway"],"geometry":["point","vertex","line","area"],"tags":{"waterway":"*"},"searchable":false,"name":"Waterway"},"address":{"fields":["address"],"geometry":["point","vertex","area"],"tags":{"addr:*":"*"},"addTags":{},"removeTags":{},"reference":{"key":"addr"},"name":"Address","matchScore":0.15},"advertising/billboard":{"fields":["parallel_direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/cable_car":{"geometry":["line"],"terms":["tramway","ropeway"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"cable_car"},"name":"Cable Car"},"aerialway/chair_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"chair_lift"},"name":"Chair Lift"},"aerialway/drag_lift":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"drag_lift"},"name":"Drag Lift"},"aerialway/gondola":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"gondola"},"name":"Gondola"},"aerialway/goods":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"goods"},"name":"Goods Aerialway"},"aerialway/magic_carpet":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"magic_carpet"},"name":"Magic Carpet Lift"},"aerialway/mixed_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"mixed_lift"},"name":"Mixed Lift"},"aerialway/platter":{"geometry":["line"],"terms":["button lift","poma lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"platter"},"name":"Platter Lift"},"aerialway/pylon":{"geometry":["point","vertex"],"fields":["ref"],"tags":{"aerialway":"pylon"},"name":"Aerialway Pylon"},"aerialway/rope_tow":{"geometry":["line"],"terms":["handle tow","bugel lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"rope_tow"},"name":"Rope Tow Lift"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station"},"aerialway/t-bar":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"terms":["tbar"],"tags":{"aerialway":"t-bar"},"name":"T-bar Lift"},"aeroway/aerodrome":{"icon":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"airport","geometry":["point"],"fields":["ref_aeroway_gate"],"tags":{"aeroway":"gate"},"name":"Airport Gate"},"aeroway/hangar":{"geometry":["area"],"fields":["name","building_area"],"tags":{"aeroway":"hangar"},"name":"Hangar"},"aeroway/helipad":{"icon":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"geometry":["line","area"],"terms":["landing strip"],"fields":["ref_runway","surface","length","width"],"tags":{"aeroway":"runway"},"name":"Runway"},"aeroway/taxiway":{"geometry":["line"],"fields":["ref_taxiway","surface"],"tags":{"aeroway":"taxiway"},"name":"Taxiway"},"aeroway/terminal":{"icon":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/coworking_space":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"coworking_space"},"name":"Coworking Space","searchable":false},"amenity/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"tags":{"amenity":"nursing_home"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home","searchable":false},"amenity/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"amenity":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office","searchable":false},"amenity/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard","searchable":false},"amenity/swimming_pool":{"icon":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_boarding"],"geometry":["point","area"],"terms":["boarding","cat","dog","horse","kitten","pet boarding","pet care","pet hotel","puppy","reptile"],"tags":{"amenity":"animal_boarding"},"name":"Animal Boarding Facility"},"amenity/animal_breeding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_breeding"],"geometry":["point","area"],"terms":["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],"tags":{"amenity":"animal_breeding"},"name":"Animal Breeding Facility"},"amenity/animal_shelter":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_shelter"],"geometry":["point","area"],"terms":["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],"tags":{"amenity":"animal_shelter"},"name":"Animal Shelter"},"amenity/arts_centre":{"icon":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"bank","fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],"tags":{"amenity":"bank"},"name":"Bank"},"amenity/bar":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["dive","beer","bier","booze"],"tags":{"amenity":"bar"},"name":"Bar"},"amenity/bbq":{"icon":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"bicycle","fields":["bicycle_parking","capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_parking"},"name":"Bicycle Parking"},"amenity/bicycle_rental":{"icon":"bicycle","fields":["capacity","network","operator"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_rental"},"name":"Bicycle Rental"},"amenity/bicycle_repair_station":{"icon":"bicycle","fields":["operator","brand","opening_hours","fee","service/bicycle"],"geometry":["point","vertex"],"terms":["bike","repair","chain","pump"],"tags":{"amenity":"bicycle_repair_station"},"name":"Bicycle Repair Tool Stand"},"amenity/biergarten":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/bus_station":{"icon":"bus","fields":["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"bus_station"},"name":"Bus Station"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_rental":{"icon":"car","fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","roulette","craps","poker","blackjack"],"tags":{"amenity":"casino"},"name":"Casino"},"amenity/charging_station":{"icon":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"school","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["daycare","orphanage","playgroup"],"tags":{"amenity":"childcare"},"name":"Nursery/Childcare"},"amenity/cinema":{"icon":"cinema","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drive-in","film","flick","movie","theater","picture","show","screen"],"tags":{"amenity":"cinema"},"name":"Cinema"},"amenity/clinic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medical","urgentcare"],"tags":{"amenity":"clinic"},"addTags":{"amenity":"clinic","healthcare":"clinic"},"removeTags":{"amenity":"clinic","healthcare":"clinic"},"reference":{"key":"amenity","value":"clinic"},"name":"Clinic"},"amenity/clinic/abortion":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"abortion"},"reference":{"key":"amenity","value":"clinic"},"name":"Abortion Clinic"},"amenity/clinic/fertility":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["egg","fertility","reproductive","sperm","ovulation"],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"fertility"},"reference":{"key":"amenity","value":"clinic"},"name":"Fertility Clinic"},"amenity/clock":{"icon":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["university"],"tags":{"amenity":"college"},"name":"College Grounds"},"amenity/community_centre":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["event","hall"],"tags":{"amenity":"community_centre"},"name":"Community Center"},"amenity/compressed_air":{"icon":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"dentist","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["tooth","teeth"],"tags":{"amenity":"dentist"},"addTags":{"amenity":"dentist","healthcare":"dentist"},"removeTags":{"amenity":"dentist","healthcare":"dentist"},"reference":{"key":"amenity","value":"dentist"},"name":"Dentist"},"amenity/doctors":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medic*","physician"],"tags":{"amenity":"doctors"},"addTags":{"amenity":"doctors","healthcare":"doctor"},"removeTags":{"amenity":"doctors","healthcare":"doctor"},"reference":{"key":"amenity","value":"doctors"},"name":"Doctor"},"amenity/dojo":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["martial arts","dojang"],"tags":{"amenity":"dojo"},"name":"Dojo / Martial Arts Academy"},"amenity/drinking_water":{"icon":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"fast-food","fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"fast_food"},"terms":["restaurant","takeaway"],"name":"Fast Food"},"amenity/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Terminal"},"amenity/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["fast food","restaurant","food"],"tags":{"amenity":"food_court"},"name":"Food Court"},"amenity/fountain":{"icon":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"fuel"},"name":"Gas Station"},"amenity/grave_yard":{"icon":"cemetery","fields":["religion","denomination"],"geometry":["point","area"],"tags":{"amenity":"grave_yard"},"name":"Graveyard"},"amenity/grit_bin":{"fields":["access_simple"],"geometry":["point","vertex"],"tags":{"amenity":"grit_bin"},"terms":["salt","sand"],"name":"Grit Bin"},"amenity/hospital":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","emergency"],"geometry":["point","area"],"terms":["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],"tags":{"amenity":"hospital"},"addTags":{"amenity":"hospital","healthcare":"hospital"},"removeTags":{"amenity":"hospital","healthcare":"hospital"},"reference":{"key":"amenity","value":"hospital"},"name":"Hospital Grounds"},"amenity/hunting_stand":{"icon":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"ice-cream","fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"geometry":["point","area"],"terms":["gelato","sorbet","sherbet","frozen","yogurt"],"tags":{"amenity":"ice_cream"},"name":"Ice Cream Shop"},"amenity/internet_cafe":{"icon":"poi-mast","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],"tags":{"amenity":"internet_cafe"},"name":"Internet Cafe"},"amenity/kindergarten":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"library","fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/music_school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["school of music"],"tags":{"amenity":"music_school"},"name":"Music School"},"amenity/nightclub":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"amenity":"nightclub"},"terms":["disco*","night club","dancing","dance club"],"name":"Nightclub"},"amenity/parking_entrance":{"icon":"entrance-alt1","fields":["access_simple","ref"],"geometry":["vertex"],"tags":{"amenity":"parking_entrance"},"name":"Parking Garage Entrance/Exit"},"amenity/parking_space":{"fields":["capacity"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"parking_space"},"matchScore":0.95,"name":"Parking Space"},"amenity/parking":{"icon":"parking","fields":["operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay","address"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"pharmacy","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"tags":{"amenity":"pharmacy"},"addTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"removeTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"reference":{"key":"amenity","value":"pharmacy"},"terms":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area","service_times"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"place_of_worship"},"name":"Place of Worship"},"amenity/place_of_worship/buddhist":{"icon":"buddhism","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],"tags":{"amenity":"place_of_worship","religion":"buddhist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Buddhist Temple"},"amenity/place_of_worship/christian":{"icon":"religious-christian","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],"tags":{"amenity":"place_of_worship","religion":"christian"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Church"},"amenity/place_of_worship/hindu":{"icon":"poi-hinduist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["garbhargriha","mandu","puja","shrine","temple"],"tags":{"amenity":"place_of_worship","religion":"hindu"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Hindu Temple"},"amenity/place_of_worship/jewish":{"icon":"religious-jewish","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["jewish"],"tags":{"amenity":"place_of_worship","religion":"jewish"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Synagogue"},"amenity/place_of_worship/muslim":{"icon":"religious-muslim","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["muslim"],"tags":{"amenity":"place_of_worship","religion":"muslim"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Mosque"},"amenity/place_of_worship/shinto":{"icon":"poi-shintoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kami","torii"],"tags":{"amenity":"place_of_worship","religion":"shinto"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Shinto Shrine"},"amenity/place_of_worship/sikh":{"icon":"poi-sikhist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["gurudwara","temple"],"tags":{"amenity":"place_of_worship","religion":"sikh"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Sikh Temple"},"amenity/place_of_worship/taoist":{"icon":"poi-taoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["daoist","monastery","temple"],"tags":{"amenity":"place_of_worship","religion":"taoist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Taoist Temple"},"amenity/planetarium":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"police","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],"tags":{"amenity":"police"},"name":"Police"},"amenity/post_box":{"icon":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"post","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["letter","mail"],"tags":{"amenity":"post_office"},"name":"Post Office"},"amenity/prison":{"icon":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"pub"},"terms":["alcohol","drink","dive","beer","bier","booze"],"name":"Pub"},"amenity/public_bath":{"icon":"water","fields":["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"public_bath"},"terms":["onsen","foot bath","hot springs"],"name":"Public Bath"},"amenity/public_bookcase":{"icon":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/ranger_station":{"fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],"tags":{"amenity":"ranger_station"},"name":"Ranger Station"},"amenity/recycling_centre":{"icon":"waste-basket","fields":["name","operator","address","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_type","recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"name":"Recycling"},"amenity/restaurant":{"icon":"restaurant","fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],"tags":{"amenity":"restaurant"},"name":"Restaurant"},"amenity/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"amenity":"sanitary_dump_station"},"name":"RV Toilet Disposal"},"amenity/school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"amenity/shelter":{"icon":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"water","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/social_facility":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility"},"name":"Social Facility"},"amenity/social_facility/food_bank":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility","social_facility":"food_bank"},"reference":{"key":"social_facility","value":"food_bank"},"name":"Food Bank"},"amenity/social_facility/group_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["old","senior","living","care home","assisted living"],"tags":{"amenity":"social_facility","social_facility":"group_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"group_home"},"name":"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["houseless","unhoused","displaced"],"tags":{"amenity":"social_facility","social_facility":"shelter","social_facility:for":"homeless"},"reference":{"key":"social_facility","value":"shelter"},"name":"Homeless Shelter"},"amenity/social_facility/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["elderly","living","nursing","old","senior","assisted living"],"tags":{"amenity":"social_facility","social_facility":"nursing_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home"},"amenity/studio":{"icon":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"toilet","fields":["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],"geometry":["point","vertex","area"],"terms":["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],"tags":{"amenity":"toilets"},"name":"Toilets"},"amenity/townhall":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["village","city","government","courthouse","municipal"],"tags":{"amenity":"townhall"},"name":"Town Hall"},"amenity/university":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":[],"tags":{"amenity":"vending_machine"},"name":"Vending Machine"},"amenity/vending_machine/news_papers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"news_papers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine","searchable":false},"amenity/vending_machine/cigarettes":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cigarette"],"tags":{"amenity":"vending_machine","vending":"cigarettes"},"reference":{"key":"vending","value":"cigarettes"},"name":"Cigarette Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom"],"tags":{"amenity":"vending_machine","vending":"condoms"},"reference":{"key":"vending","value":"condoms"},"name":"Condom Vending Machine"},"amenity/vending_machine/drinks":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["drink","soda","beverage","juice","pop"],"tags":{"amenity":"vending_machine","vending":"drinks"},"reference":{"key":"vending","value":"drinks"},"name":"Drink Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["excrement bags","poop","dog","animal"],"tags":{"amenity":"vending_machine","vending":"excrement_bags"},"reference":{"key":"vending","value":"excrement_bags"},"name":"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],"tags":{"amenity":"vending_machine","vending":"feminine_hygiene"},"reference":{"key":"vending","value":"feminine_hygiene"},"name":"Feminine Hygiene Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"newspapers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parking","ticket"],"tags":{"amenity":"vending_machine","vending":"parking_tickets"},"reference":{"key":"vending","value":"parking_tickets"},"matchScore":0.94,"name":"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["bus","train","ferry","rail","ticket","transportation"],"tags":{"amenity":"vending_machine","vending":"public_transport_tickets"},"reference":{"key":"vending","value":"public_transport_tickets"},"name":"Transit Ticket Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["candy","gum","chip","pretzel","cookie","cracker"],"tags":{"amenity":"vending_machine","vending":"sweets"},"reference":{"key":"vending","value":"sweets"},"name":"Snack Vending Machine"},"amenity/veterinary":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pet clinic","veterinarian","animal hospital","pet doctor"],"tags":{"amenity":"veterinary"},"name":"Veterinary"},"amenity/waste_basket":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex"],"tags":{"amenity":"waste_basket"},"terms":["bin","garbage","rubbish","litter","trash"],"name":"Waste Basket"},"amenity/waste_disposal":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_disposal"},"terms":["garbage","rubbish","litter","trash"],"name":"Garbage Dumpster"},"amenity/waste_transfer_station":{"icon":"waste-basket","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["dump","garbage","recycling","rubbish","scrap","trash"],"tags":{"amenity":"waste_transfer_station"},"name":"Waste Transfer Station"},"amenity/waste/dog_excrement":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_basket","waste":"dog_excrement"},"reference":{"key":"waste","value":"dog_excrement"},"terms":["bin","garbage","rubbish","litter","trash","poo","dog"],"name":"Dog Excrement Bin"},"amenity/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"watering_place"},"name":"Animal Watering Place"},"area":{"fields":["name"],"geometry":["area"],"tags":{"area":"yes"},"name":"Area","matchScore":0.1},"area/highway":{"fields":["name","area/highway"],"geometry":["area"],"tags":{"area:highway":"*"},"name":"Road Surface"},"attraction/amusement_ride":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","carnival ride"],"tags":{"attraction":"amusement_ride"},"name":"Amusement Ride"},"attraction/animal":{"icon":"zoo","fields":["name","operator"],"geometry":["point","area"],"terms":["zoo","theme park","animal park","lion","tiger","bear"],"tags":{"attraction":"animal"},"name":"Animal"},"attraction/big_wheel":{"icon":"amusement-park","fields":["name","operator","height","opening_hours"],"geometry":["point"],"terms":["ferris wheel","theme park","amusement ride"],"tags":{"attraction":"big_wheel"},"name":"Big Wheel"},"attraction/bumper_car":{"icon":"car","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","dodgem cars","autoscooter"],"tags":{"attraction":"bumper_car"},"name":"Bumper Car"},"attraction/bungee_jumping":{"icon":"pitch","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","bungy jumping","jumping platform"],"tags":{"attraction":"bungee_jumping"},"name":"Bungee Jumping"},"attraction/carousel":{"icon":"horse-riding","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],"tags":{"attraction":"carousel"},"name":"Carousel"},"attraction/dark_ride":{"icon":"rail-metro","fields":["name","operator","opening_hours"],"geometry":["point","line","area"],"terms":["theme park","ghost train"],"tags":{"attraction":"dark_ride"},"name":"Dark Ride"},"attraction/drop_tower":{"icon":"poi-tower","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride","gondola","tower","big drop"],"tags":{"attraction":"drop_tower"},"name":"Drop Tower"},"attraction/pirate_ship":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point"],"terms":["theme park","carnival ride","amusement ride"],"tags":{"attraction":"pirate_ship"},"name":"Pirate Ship"},"attraction/river_rafting":{"icon":"ferry","fields":["name","operator","opening_hours"],"geometry":["point","line"],"terms":["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],"tags":{"attraction":"river_rafting"},"name":"River Rafting"},"attraction/roller_coaster":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"rail","fields":["name","operator","fee","opening_hours"],"geometry":["point","line"],"terms":["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],"tags":{"attraction":"train"},"name":"Tourist Train"},"attraction/water_slide":{"icon":"swimming","fields":["name","operator","opening_hours"],"geometry":["line","area"],"terms":["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],"tags":{"attraction":"water_slide"},"name":"Water Slide"},"barrier":{"icon":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"barrier","fields":["wall","height"],"geometry":["line","area"],"tags":{"barrier":"wall"},"name":"Wall","matchScore":0.25},"boundary/administrative":{"name":"Administrative Boundary","geometry":["line"],"tags":{"boundary":"administrative"},"fields":["name","admin_level"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"jeweler"},"reference":{"key":"shop","value":"jewelry"},"name":"Jeweler","searchable":false},"craft/locksmith":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"locksmith"},"reference":{"key":"shop","value":"locksmith"},"name":"Locksmith","searchable":false},"craft/optician":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"optician"},"reference":{"key":"shop","value":"optician"},"name":"Optician","searchable":false},"craft/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"craft":"tailor"},"reference":{"key":"shop","value":"tailor"},"name":"Tailor","searchable":false},"craft/basket_maker":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beer","beverage","bier","booze","cider"],"tags":{"craft":"brewery"},"name":"Brewery"},"craft/carpenter":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/chimney_sweeper":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"chimney_sweeper"},"name":"Chimney Sweeper"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],"tags":{"craft":"distillery"},"name":"Distillery"},"craft/dressmaker":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculptor":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculptor"},"name":"Sculptor"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"emergency/designated":{"fields":[],"geometry":["line"],"tags":{"emergency":"designated"},"terms":[],"name":"Emergency Access Designated","searchable":false,"matchScore":0.01},"emergency/destination":{"fields":[],"geometry":["line"],"tags":{"emergency":"destination"},"terms":[],"name":"Emergency Access Destination","searchable":false,"matchScore":0.01},"emergency/no":{"fields":[],"geometry":["line"],"tags":{"emergency":"no"},"terms":[],"name":"Emergency Access No","searchable":false,"matchScore":0.01},"emergency/official":{"fields":[],"geometry":["line"],"tags":{"emergency":"official"},"terms":[],"name":"Emergency Access Official","searchable":false,"matchScore":0.01},"emergency/private":{"fields":[],"geometry":["line"],"tags":{"emergency":"private"},"terms":[],"name":"Emergency Access Private","searchable":false,"matchScore":0.01},"emergency/yes":{"fields":[],"geometry":["line"],"tags":{"emergency":"yes"},"terms":[],"name":"Emergency Access Yes","searchable":false,"matchScore":0.01},"emergency/ambulance_station":{"icon":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-fire-hydrant","fields":["fire_hydrant/type","fire_hydrant/position","ref","operator"],"geometry":["point","vertex"],"terms":["fire plug"],"tags":{"emergency":"fire_hydrant"},"name":"Fire Hydrant"},"emergency/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra"},"reference":{"key":"footway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"green","landuse":"grass","leisure":"pitch","sport":"golf"},"reference":{"key":"golf","value":"green"},"name":"Putting Green"},"golf/hole":{"icon":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"lateral_water_hazard","natural":"water"},"reference":{"key":"golf","value":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"tee","landuse":"grass"},"terms":["teeing ground"],"reference":{"key":"golf","value":"tee"},"name":"Tee Box"},"golf/water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"water_hazard","natural":"water"},"reference":{"key":"golf","value":"water_hazard"},"name":"Water Hazard"},"golf/water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"hospital","fields":["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"healthcare":"*"},"terms":["clinic","doctor","disease","health","institution","sick","surgery","wellness"],"name":"Healthcare Facility"},"healthcare/alternative":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],"tags":{"healthcare":"alternative"},"name":"Alternative Medicine"},"healthcare/alternative/chiropractic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["back","pain","spine"],"tags":{"healthcare":"alternative","healthcare:speciality":"chiropractic"},"name":"Chiropractor"},"healthcare/audiologist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["ear","hearing","sound"],"tags":{"healthcare":"audiologist"},"name":"Audiologist"},"healthcare/birthing_center":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"birthing_center"},"name":"Birthing Center"},"healthcare/blood_donation":{"icon":"blood-bank","fields":["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],"tags":{"healthcare":"blood_donation"},"name":"Blood Donor Center"},"healthcare/hospice":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"midwife"},"name":"Midwife"},"healthcare/occupational_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["therapist","therapy"],"tags":{"healthcare":"occupational_therapist"},"name":"Occupational Therapist"},"healthcare/optometrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses","lasik","lenses","vision"],"tags":{"healthcare":"optometrist"},"name":"Optometrist"},"healthcare/physiotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["physical","therapist","therapy"],"tags":{"healthcare":"physiotherapist"},"name":"Physiotherapist"},"healthcare/podiatrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["foot","feet","nails"],"tags":{"healthcare":"podiatrist"},"name":"Podiatrist"},"healthcare/psychotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],"tags":{"healthcare":"psychotherapist"},"name":"Psychotherapist"},"healthcare/rehabilitation":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["rehab","therapist","therapy"],"tags":{"healthcare":"rehabilitation"},"name":"Rehabilitation Facility"},"healthcare/speech_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["speech","therapist","therapy","voice"],"tags":{"healthcare":"speech_therapist"},"name":"Speech Therapist"},"highway/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"terms":[],"name":"Bus Stop"},"highway/corridor":{"icon":"highway-footway","fields":["name","width","level","access_simple"],"geometry":["line"],"tags":{"highway":"corridor"},"terms":["gallery","hall","hallway","indoor","passage","passageway"],"name":"Indoor Corridor"},"highway/crossing-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"highway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["parallel_direction"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["clock_direction"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"highway-motorway","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"motorway"},"terms":["autobahn","expressway","freeway","highway","interstate","parkway","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian_area":{"icon":"poi-foot","fields":["name","surface","lit","width","structure","access"],"geometry":["area"],"tags":{"highway":"pedestrian","area":"yes"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Area"},"highway/pedestrian_line":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line"],"tags":{"highway":"pedestrian"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Street"},"highway/primary_link":{"icon":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"highway-unclassified","fields":["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],"geometry":["point","line","area"],"tags":{"highway":"raceway"},"addTags":{"highway":"raceway","sport":"motor"},"terms":["auto*","formula one","kart","motocross","nascar","race*","track"],"name":"Racetrack (Motorsport)"},"highway/residential":{"icon":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"alley"},"reference":{"key":"service","value":"alley"},"name":"Alley"},"highway/service/drive-through":{"icon":"highway-service","fields":["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],"geometry":["line"],"tags":{"highway":"service","service":"drive-through"},"reference":{"key":"service","value":"drive-through"},"name":"Drive-Through"},"highway/service/driveway":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"driveway"},"reference":{"key":"service","value":"driveway"},"name":"Driveway"},"highway/service/emergency_access":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"emergency_access"},"reference":{"key":"service","value":"emergency_access"},"name":"Emergency Access"},"highway/service/parking_aisle":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"parking_aisle"},"reference":{"key":"service","value":"parking_aisle"},"name":"Parking Aisle"},"highway/services":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","parallel_direction"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-street-lamp","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","ref"],"terms":["streetlight","street light","lamp","light","gaslight"],"name":"Street Lamp"},"highway/tertiary_link":{"icon":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"geometry":["line"],"tags":{"highway":"track"},"terms":["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],"name":"Unmaintained Track Road"},"highway/traffic_mirror":{"geometry":["point","vertex"],"tags":{"highway":"traffic_mirror"},"terms":["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],"name":"Traffic Mirror"},"highway/traffic_signals":{"icon":"poi-traffic-signals","geometry":["vertex"],"tags":{"highway":"traffic_signals"},"fields":["traffic_signals"],"terms":["light","stoplight","traffic light"],"name":"Traffic Signals"},"highway/trunk_link":{"icon":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-junction","fields":["name"],"geometry":["vertex","area"],"tags":{"junction":"yes"},"name":"Junction"},"landuse":{"fields":["name","landuse"],"geometry":["area"],"tags":{"landuse":"*"},"matchScore":0.9,"name":"Land Use"},"landuse/farm":{"icon":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"aquarium","fields":["name","operator","produce"],"geometry":["area"],"tags":{"landuse":"aquaculture"},"terms":["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],"name":"Aquaculture"},"landuse/basin":{"icon":"water","fields":["name"],"geometry":["area"],"tags":{"landuse":"basin"},"terms":[],"name":"Basin"},"landuse/brownfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"brownfield"},"terms":[],"name":"Brownfield"},"landuse/cemetery":{"icon":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"commercial","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"garages"},"terms":[],"name":"Garages"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/greenfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"greenfield"},"terms":[],"name":"Greenfield"},"landuse/harbour":{"icon":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/industrial/scrap_yard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"scrap_yard"},"addTags":{"landuse":"industrial","industrial":"scrap_yard"},"removeTags":{"landuse":"industrial","industrial":"scrap_yard"},"reference":{"key":"industrial","value":"scrap_yard"},"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"name":"Scrap Yard"},"landuse/industrial/slaughterhouse":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"slaughterhouse"},"addTags":{"landuse":"industrial","industrial":"slaughterhouse"},"removeTags":{"landuse":"industrial","industrial":"slaughterhouse"},"reference":{"key":"industrial","value":"slaughterhouse"},"terms":["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],"name":"Slaughterhouse"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"barracks"},"addTags":{"landuse":"military","military":"barracks"},"removeTags":{"landuse":"military","military":"barracks"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Barracks"},"landuse/military/bunker":{"icon":"poi-military","fields":["name","bunker_type","building_area"],"geometry":["point","area"],"tags":{"military":"bunker"},"addTags":{"building":"bunker","landuse":"military","military":"bunker"},"removeTags":{"building":"bunker","landuse":"military","military":"bunker"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Military Bunker"},"landuse/military/checkpoint":{"icon":"barrier","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"checkpoint"},"addTags":{"landuse":"military","military":"checkpoint"},"removeTags":{"landuse":"military","military":"checkpoint"},"terms":["air force","army","base","force","guard","marine","navy","troop","war"],"name":"Checkpoint"},"landuse/military/danger_area":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"danger_area"},"addTags":{"landuse":"military","military":"danger_area"},"removeTags":{"landuse":"military","military":"danger_area"},"terms":["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],"name":"Danger Area"},"landuse/military/naval_base":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"naval_base"},"addTags":{"landuse":"military","military":"naval_base"},"removeTags":{"landuse":"military","military":"naval_base"},"terms":["base","fight","force","guard","marine","navy","ship","sub","troop","war"],"name":"Naval Base"},"landuse/military/nuclear_explosion_site":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"nuclear_explosion_site"},"addTags":{"landuse":"military","military":"nuclear_explosion_site"},"removeTags":{"landuse":"military","military":"nuclear_explosion_site"},"terms":["atom","blast","bomb","detonat*","nuke","site","test"],"name":"Nuclear Explosion Site"},"landuse/military/obstacle_course":{"icon":"poi-military","geometry":["point","area"],"tags":{"military":"obstacle_course"},"addTags":{"landuse":"military","military":"obstacle_course"},"removeTags":{"landuse":"military","military":"obstacle_course"},"terms":["army","base","force","guard","marine","navy","troop","war"],"name":"Obstacle Course"},"landuse/military/office":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"office"},"addTags":{"landuse":"military","military":"office"},"removeTags":{"landuse":"military","military":"office"},"terms":["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],"name":"Military Office"},"landuse/military/range":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"range"},"addTags":{"landuse":"military","military":"range"},"removeTags":{"landuse":"military","military":"range"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Military Range"},"landuse/military/training_area":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"training_area"},"addTags":{"landuse":"military","military":"training_area"},"removeTags":{"landuse":"military","military":"training_area"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Training Area"},"landuse/orchard":{"icon":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"garden","fields":["name","operator","plant"],"geometry":["area"],"tags":{"landuse":"plant_nursery"},"terms":["flower","garden","grow","vivero"],"name":"Plant Nursery"},"landuse/quarry":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"quarry"},"terms":[],"name":"Quarry"},"landuse/railway":{"icon":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/religious":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"name":"Residential Area"},"landuse/retail":{"icon":"shop","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"name":"Retail Area"},"landuse/vineyard":{"fields":["name","operator","grape_variety"],"geometry":["area"],"tags":{"landuse":"vineyard"},"addTags":{"landuse":"vineyard","crop":"grape"},"removeTags":{"landuse":"vineyard","crop":"grape","grape_variety":"*"},"terms":["grape","wine"],"name":"Vineyard"},"leisure":{"icon":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","slot machine"],"tags":{"leisure":"adult_gaming_centre"},"name":"Adult Gaming Center"},"leisure/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-bowling","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["bowling center"],"tags":{"leisure":"bowling_alley"},"name":"Bowling Alley"},"leisure/common":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_centre"},"terms":["health","gym","leisure","studio"],"name":"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["studio"],"tags":{"leisure":"fitness_centre","sport":"yoga"},"reference":{"key":"sport","value":"yoga"},"name":"Yoga Studio"},"leisure/fitness_station":{"icon":"pitch","fields":["fitness_station","ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"addTags":{"leisure":"fitness_station","sport":"fitness"},"removeTags":{"leisure":"fitness_station","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"balance_beam"},"addTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["balance","exercise","fitness","gym","trim trail"],"name":"Exercise Balance Beam"},"leisure/fitness_station/box":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"box"},"addTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["box","exercise","fitness","gym","jump","trim trail"],"name":"Exercise Box"},"leisure/fitness_station/horizontal_bar":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_bar"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],"name":"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],"name":"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"hyperextension"},"addTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["back","exercise","extension","fitness","gym","roman chair","trim trail"],"name":"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"parallel_bars"},"addTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","dip","exercise","fitness","gym","trim trail"],"name":"Parallel Bars"},"leisure/fitness_station/push-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"push-up"},"addTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","exercise","fitness","gym","pushup","push up","trim trail"],"name":"Push-Up Station"},"leisure/fitness_station/rings":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"rings"},"addTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],"name":"Exercise Rings"},"leisure/fitness_station/sign":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sign"},"addTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sit-up"},"addTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["crunch","exercise","fitness","gym","situp","sit up","trim trail"],"name":"Sit-Up Station"},"leisure/fitness_station/stairs":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"stairs"},"addTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","steps","trim trail"],"name":"Exercise Stairs"},"leisure/garden":{"icon":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"commercial","fields":["name","address","building_area","opening_hours","website"],"geometry":["point","area"],"terms":["makerspace","hackspace","hacklab"],"tags":{"leisure":"hackerspace"},"name":"Hackerspace"},"leisure/horse_riding":{"icon":"horse-riding","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["equestrian","stable"],"tags":{"leisure":"horse_riding"},"name":"Horseback Riding Facility"},"leisure/ice_rink":{"icon":"pitch","fields":["name","seasonal","sport_ice","operator","address","building","opening_hours"],"geometry":["point","area"],"terms":["hockey","skating","curling"],"tags":{"leisure":"ice_rink"},"name":"Ice Rink"},"leisure/marina":{"icon":"harbor","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["boat"],"tags":{"leisure":"marina"},"name":"Marina"},"leisure/miniature_golf":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["crazy golf","mini golf","putt-putt"],"tags":{"leisure":"miniature_golf"},"name":"Miniature Golf"},"leisure/nature_reserve":{"icon":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"park","geometry":["point","area"],"fields":["name"],"terms":["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],"tags":{"leisure":"park"},"name":"Park"},"leisure/picnic_table":{"icon":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["surface","hoops","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"basketball"},"reference":{"key":"sport","value":"basketball"},"terms":[],"name":"Basketball Court"},"leisure/pitch/beachvolleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"beachvolleyball"},"addTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"removeTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"reference":{"key":"sport","value":"beachvolleyball"},"terms":["volleyball"],"name":"Beach Volleyball Court"},"leisure/pitch/boules":{"icon":"pitch","fields":["boules","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"boules"},"reference":{"key":"sport","value":"boules"},"terms":["bocce","lyonnaise","pétanque"],"name":"Boules/Bocce Court"},"leisure/pitch/bowls":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["surface","lit","building"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"equestrian"},"reference":{"key":"sport","value":"equestrian"},"terms":["dressage","equestrian","horse","horseback","riding"],"name":"Riding Arena"},"leisure/pitch/rugby_league":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_league"},"reference":{"key":"sport","value":"rugby_league"},"terms":[],"name":"Rugby League Field"},"leisure/pitch/rugby_union":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_union"},"reference":{"key":"sport","value":"rugby_union"},"terms":[],"name":"Rugby Union Field"},"leisure/pitch/skateboard":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"table_tennis"},"reference":{"key":"sport","value":"table_tennis"},"terms":["table tennis","ping pong"],"name":"Ping Pong Table"},"leisure/pitch/tennis":{"icon":"tennis","fields":["surface","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"tennis"},"reference":{"key":"sport","value":"tennis"},"terms":[],"name":"Tennis Court"},"leisure/pitch/volleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"playground","fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"geometry":["point","area"],"terms":["jungle gym","play area"],"tags":{"leisure":"playground"},"name":"Playground"},"leisure/resort":{"icon":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"pitch","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track","sport":"running"},"terms":["race*","running","sprint","track"],"name":"Racetrack (Running)"},"leisure/sauna":{"fields":["name","operator","address","opening_hours","access_simple","fee"],"geometry":["point","area"],"tags":{"leisure":"sauna"},"name":"Sauna"},"leisure/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"sports_centre"},"terms":[],"name":"Sports Center / Complex"},"leisure/sports_centre/swimming":{"icon":"swimming","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"sports_centre","sport":"swimming"},"reference":{"key":"sport","value":"swimming"},"name":"Swimming Pool Facility"},"leisure/stadium":{"icon":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"highway-road","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track"},"terms":["cycle","dog","greyhound","horse","race*","track"],"name":"Racetrack (Non-Motorsport)"},"leisure/water_park":{"icon":"swimming","fields":["name","operator","address"],"geometry":["point","area"],"terms":["swim","pool","dive"],"tags":{"leisure":"water_park"},"name":"Water Park"},"line":{"fields":["name"],"geometry":["line"],"tags":{},"name":"Line","matchScore":0.1},"man_made":{"icon":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","geometry":["point","area"],"terms":["gas holder"],"tags":{"man_made":"gasometer"},"name":"Gasometer"},"man_made/groyne":{"geometry":["line","area"],"tags":{"man_made":"groyne"},"name":"Groyne"},"man_made/lighthouse":{"icon":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","fields":["tower/type","tower/construction","height","communication_multi"],"geometry":["point"],"terms":["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],"tags":{"man_made":"mast"},"name":"Mast"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-storage-tank","geometry":["point"],"terms":["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],"tags":{"man_made":"petroleum_well"},"name":"Oil Well"},"man_made/pier":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator","substance"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance","surveillance:type":"camera"},"name":"Surveillance Camera"},"man_made/surveillance":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","surveillance/zone"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance"},"name":"Surveillance"},"man_made/survey_point":{"icon":"monument","fields":["ref"],"geometry":["point","vertex"],"terms":["trig point","triangulation pillar","trigonometrical station"],"tags":{"man_made":"survey_point"},"name":"Survey Point"},"man_made/tower":{"icon":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"terms":["sewage*","water treatment plant","reclamation plant"],"tags":{"man_made":"wastewater_plant"},"name":"Wastewater Plant"},"man_made/water_tower":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"industry","fields":["name","operator","address","building_area","product"],"geometry":["point","area"],"terms":["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],"tags":{"man_made":"works"},"name":"Factory"},"manhole":{"icon":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"natural","fields":["name","natural"],"geometry":["point","vertex","area"],"tags":{"natural":"*"},"name":"Natural"},"natural/bare_rock":{"geometry":["area"],"tags":{"natural":"bare_rock"},"terms":["rock"],"name":"Bare Rock"},"natural/bay":{"icon":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"triangle","geometry":["point","area"],"fields":["fee","access_simple"],"tags":{"natural":"cave_entrance"},"terms":["cavern","hollow","grotto","shelter","cavity"],"name":"Cave Entrance"},"natural/cliff":{"icon":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"name":"Cliff"},"natural/coastline":{"geometry":["line"],"tags":{"natural":"coastline"},"terms":["shore"],"name":"Coastline"},"natural/fell":{"geometry":["area"],"tags":{"natural":"fell"},"terms":[],"name":"Fell"},"natural/glacier":{"geometry":["area"],"tags":{"natural":"glacier"},"terms":[],"name":"Glacier"},"natural/grassland":{"geometry":["area"],"tags":{"natural":"grassland"},"terms":["prairie","savanna"],"name":"Grassland"},"natural/heath":{"geometry":["area"],"tags":{"natural":"heath"},"terms":[],"name":"Heath"},"natural/peak":{"icon":"mountain","fields":["name","elevation"],"geometry":["point","vertex"],"tags":{"natural":"peak"},"terms":["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],"name":"Peak"},"natural/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"triangle-stroked","fields":["elevation"],"geometry":["point","vertex"],"tags":{"natural":"saddle"},"terms":["pass","mountain pass","top"],"name":"Saddle"},"natural/sand":{"geometry":["area"],"tags":{"natural":"sand"},"terms":["desert"],"name":"Sand"},"natural/scree":{"geometry":["area"],"tags":{"natural":"scree"},"terms":["loose rocks"],"name":"Scree"},"natural/scrub":{"geometry":["area"],"tags":{"natural":"scrub"},"terms":["bush","shrubs"],"name":"Scrub"},"natural/spring":{"icon":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"lake"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","loch","mere"],"name":"Lake"},"natural/water/pond":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"pond"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","millpond","tarn","pool","mere"],"name":"Pond"},"natural/water/reservoir":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"commercial","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/physician":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/administrative":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"name":"Administrative Office"},"office/adoption_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"advertising_agency"},"terms":["ad","ad agency","advert agency","advertising","marketing"],"name":"Advertising Agency"},"office/architect":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"association"},"terms":["association","non-profit","nonprofit","organization","society"],"name":"Nonprofit Organization Office"},"office/charity":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Company Office"},"office/coworking":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["coworking","office"],"tags":{"office":"coworking"},"reference":{"key":"amenity","value":"coworking_space"},"name":"Coworking Space"},"office/educational_institution":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"energy_supplier"},"terms":["electricity","energy company","energy utility","gas utility"],"name":"Energy Supplier Office"},"office/estate_agent":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"commercial","fields":["name","government","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"government"},"terms":[],"name":"Government Office"},"office/government/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["clerk","marriage","death","birth","certificate"],"tags":{"office":"government","government":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office"},"office/government/tax":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["fiscal authorities","revenue office","tax office"],"tags":{"office":"government","government":"tax"},"reference":{"key":"government","value":"tax"},"name":"Tax and Revenue Office"},"office/guide":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"guide"},"terms":["dive guide","mountain guide","tour guide"],"name":"Tour Guide Office"},"office/insurance":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"it"},"terms":["computer","information","software","technology"],"name":"Information Technology Office"},"office/lawyer":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"terms":["clerk","signature","wills","deeds","estate"],"name":"Notary Office"},"office/moving_company":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"ngo"},"terms":["ngo","non government","non-government","organization","organisation"],"name":"NGO Office"},"office/notary":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"notary"},"terms":[],"name":"Notary Office"},"office/political_party":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"private_investigator"},"terms":["PI","private eye","private detective"],"name":"Private Investigator Office"},"office/quango":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"quango"},"terms":["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],"name":"Quasi-NGO Office"},"office/research":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"tax_advisor"},"terms":["tax","tax consultant"],"name":"Tax Advisor Office"},"office/telecommunication":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"telecommunication"},"terms":[],"name":"Telecom Office"},"office/therapist":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"commercial","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"office":"water_utility"},"terms":["water board","utility"],"name":"Water Utility Office"},"piste":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/islet":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"islet"},"name":"Islet"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/plot":{"icon":"triangle-stroked","fields":["name"],"geometry":["point","area"],"tags":{"place":"plot"},"terms":["tract","land","lot","parcel"],"name":"Plot"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"geometry":["point","area"],"fields":["name"],"tags":{"place":"square"},"name":"Square"},"place/suburb":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Play Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Play Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Spring Rider","terms":["spring rocker","springy rocker"]},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout","terms":["merry-go-round"]},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"zipwire"},"name":"Zip Wire"},"point":{"fields":["name"],"geometry":["point"],"tags":{},"name":"Point","matchScore":0.1},"power/sub_station":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-power","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["hydro","solar","turbine","wind"],"tags":{"power":"generator"},"name":"Power Generator"},"power/generator/source_nuclear":{"icon":"poi-nuclear","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["fission","generator","nuclear","nuke","reactor"],"tags":{"power":"generator","generator:source":"nuclear","generator:method":"fission"},"reference":{"key":"generator:source","value":"nuclear"},"name":"Nuclear Reactor"},"power/generator/source_wind":{"icon":"poi-wind","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],"geometry":["point","vertex","area"],"terms":["generator","turbine","windmill","wind"],"tags":{"power":"generator","generator:source":"wind","generator:method":"wind_turbine"},"reference":{"key":"generator:source","value":"wind"},"name":"Wind Turbine"},"power/line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"industry","fields":["name","operator","address","plant/output/electricity","start_date"],"geometry":["area"],"tags":{"power":"plant"},"addTags":{"power":"plant","landuse":"industrial"},"removeTags":{"power":"plant","landuse":"industrial"},"terms":["coal","gas","generat*","hydro","nuclear","power","station"],"name":"Power Station Grounds"},"power/pole":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/switch":{"icon":"poi-power","fields":["switch","operator","location","cables","voltage","ref"],"geometry":["point","vertex","area"],"tags":{"power":"switch"},"name":"Power Switch"},"power/tower":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","fields":["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],"geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","shelter"],"geometry":["point","vertex","line","area"],"tags":{"public_transport":"platform"},"name":"Platform"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"name":"Stop Position"},"railway/abandoned":{"icon":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"crossing"},"terms":["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],"name":"Railway Crossing (Path)"},"railway/derail":{"icon":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"railway-rail","geometry":["line"],"terms":["venicular","cliff railway","cable car","cable railway","funicular railway"],"fields":["structure","gauge","service_rail"],"tags":{"railway":"funicular"},"name":"Funicular"},"railway/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"name":"Railway Halt","terms":["break","interrupt","rest","wait","interruption"]},"railway/level_crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"level_crossing"},"terms":["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],"name":"Railway Crossing (Road)"},"railway/light_rail":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"light_rail"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","trolley"],"name":"Light Rail"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["milestone_position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/monorail":{"icon":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Railway Platform"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-railway-signals","geometry":["point","vertex"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"railway/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"tags":{"railway":"station"},"terms":["train station","station"],"name":"Railway Station"},"railway/subway_entrance":{"icon":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram_stop":{"icon":"rail-light","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stop"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fishmonger"},"reference":{"key":"shop","value":"seafood"},"name":"Fishmonger","searchable":false},"shop/furnace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["oven","stove"],"tags":{"shop":"furnace"},"name":"Furnace Store","searchable":false},"shop/vacant":{"icon":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/agrarian":{"icon":"shop","fields":["name","operator","agrarian","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],"tags":{"shop":"agrarian"},"name":"Agriculture Shop"},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["alcohol","beer","booze","wine"],"tags":{"shop":"alcohol"},"name":"Liquor Store"},"shop/anime":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"anime"},"terms":["manga","japan","cosplay","figurine","dakimakura"],"name":"Anime Shop"},"shop/antiques":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],"tags":{"shop":"appliance"},"name":"Appliance Store"},"shop/art":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery"],"tags":{"shop":"art"},"name":"Art Store"},"shop/baby_goods":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["handbag","purse"],"tags":{"shop":"bag"},"name":"Bag/Luggage Store"},"shop/bakery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","beauty"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["manicure","pedicure"],"tags":{"shop":"beauty","beauty":"nails"},"reference":{"key":"shop","value":"beauty"},"name":"Nail Salon"},"shop/beauty/tanning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beauty","beauty":"tanning"},"reference":{"key":"leisure","value":"tanning_salon"},"name":"Tanning Salon"},"shop/bed":{"icon":"lodging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"shop":"books"},"name":"Book Store"},"shop/boutique":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"geometry":["point","area"],"terms":["auto","garage","service"],"tags":{"shop":"car_repair"},"name":"Car Repair Shop"},"shop/car":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["thrift","op shop","nonprofit"],"tags":{"shop":"charity"},"name":"Charity Store"},"shop/cheese":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"craft"},"terms":["art*","paint*","frame"],"name":"Arts and Crafts Store"},"shop/curtain":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["milk","egg","cheese"],"tags":{"shop":"dairy"},"name":"Dairy Store"},"shop/deli":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lunch","meat","sandwich"],"tags":{"shop":"deli"},"name":"Deli"},"shop/department_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"e-cigarette"},"terms":["electronic","vapor"],"name":"E-Cigarette Shop"},"shop/electronics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],"tags":{"shop":"electronics"},"name":"Electronics Store"},"shop/erotic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["farm shop","farm stand"],"tags":{"shop":"farm"},"name":"Produce Stand"},"shop/fashion":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"frame"},"terms":["art*","paint*","photo*","frame"],"name":"Framing Shop"},"shop/funeral_directors":{"icon":"cemetery","fields":["name","operator","address","building_area","religion","denomination"],"geometry":["point","area"],"terms":["undertaker","memorial home"],"tags":{"shop":"funeral_directors"},"name":"Funeral Home"},"shop/furniture":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["chair","sofa","table"],"tags":{"shop":"furniture"},"name":"Furniture Store"},"shop/garden_centre":{"icon":"garden-center","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscape","mulch","shrub","tree"],"tags":{"shop":"garden_centre"},"name":"Garden Center"},"shop/gas":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cng","lpg","natural gas","propane","refill","tank"],"tags":{"shop":"gas"},"name":"Bottled Gas Shop"},"shop/gift":{"icon":"gift","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["home","household"],"tags":{"shop":"houseware"},"name":"Houseware Store"},"shop/interior_decoration":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"News Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"medical_supply"},"name":"Medical Supply Store"},"shop/mobile_phone":{"icon":"mobile-phone","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"mobile_phone"},"name":"Mobile Phone Store"},"shop/money_lender":{"icon":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["CD","vinyl"],"tags":{"shop":"music"},"name":"Music Store"},"shop/musical_instrument":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["guitar"],"tags":{"shop":"musical_instrument"},"name":"Musical Instrument Store"},"shop/newsagent":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camping","climbing","hiking"],"tags":{"shop":"outdoor"},"name":"Outdoors Store"},"shop/paint":{"icon":"water","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pastry"},"terms":["patisserie","cake shop","cakery"],"name":"Pastry Shop"},"shop/pawnbroker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["animal","cat","dog","fish","kitten","puppy","reptile"],"tags":{"shop":"pet"},"name":"Pet Store"},"shop/photo":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","religion","denomination"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["secondhand","second hand","resale","thrift","used"],"tags":{"shop":"second_hand"},"name":"Consignment/Thrift Store"},"shop/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["grocery","store","shop"],"tags":{"shop":"supermarket"},"name":"Supermarket"},"shop/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"lodging","fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["climbing hut"],"tags":{"tourism":"alpine_hut"},"name":"Alpine Hut"},"tourism/apartment":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"apartment"},"name":"Guest Apartment / Condo"},"tourism/aquarium":{"icon":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"monument","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["tent","rv"],"tags":{"tourism":"camp_site"},"name":"Campground"},"tourism/caravan_site":{"icon":"bus","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper"],"tags":{"tourism":"caravan_site"},"name":"RV Park"},"tourism/chalet":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["holiday","holiday cottage","holiday home","vacation","vacation home"],"tags":{"tourism":"chalet"},"name":"Holiday Cottage"},"tourism/gallery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","paint*","photo*","sculpt*"],"tags":{"tourism":"gallery"},"name":"Art Gallery"},"tourism/guest_house":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"guest_house"},"terms":["B&B","Bed and Breakfast"],"name":"Guest House"},"tourism/hostel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hostel"},"name":"Hostel"},"tourism/hotel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hotel"},"name":"Hotel"},"tourism/information":{"icon":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"information","fields":["name","operator","board_type"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["operator","ref"],"geometry":["point","vertex"],"terms":["signpost"],"tags":{"tourism":"information","information":"guidepost"},"reference":{"key":"information","value":"guidepost"},"name":"Guidepost"},"tourism/information/map":{"icon":"information","fields":["operator","map_type","map_size"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"map"},"reference":{"key":"information","value":"map"},"name":"Map"},"tourism/information/office":{"icon":"information","fields":["name","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information","information":"office"},"reference":{"key":"information","value":"office"},"name":"Tourist Information Office"},"tourism/motel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"motel"},"name":"Motel"},"tourism/museum":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],"tags":{"tourism":"museum"},"name":"Museum"},"tourism/picnic_site":{"icon":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/wilderness_hut":{"icon":"lodging","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["wilderness hut","backcountry hut","bothy"],"tags":{"tourism":"wilderness_hut"},"name":"Wilderness Hut"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","parallel_direction"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"restriction-no-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_left_turn"},"name":"No Left Turn"},"type/restriction/no_right_turn":{"icon":"restriction-no-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_right_turn"},"name":"No Right Turn"},"type/restriction/no_straight_on":{"icon":"restriction-no-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_straight_on"},"name":"No Straight On"},"type/restriction/no_u_turn":{"icon":"restriction-no-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_u_turn"},"name":"No U-turn"},"type/restriction/only_left_turn":{"icon":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"route-water","fields":["name","waterway","ref"],"geometry":["relation"],"tags":{"type":"waterway"},"name":"Waterway"},"vertex":{"fields":["name"],"geometry":["vertex"],"tags":{},"name":"Other","matchScore":0.1},"waterway/boatyard":{"icon":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"harbor","fields":["name","dock","operator"],"geometry":["area","vertex","point"],"terms":["boat","ship","vessel","marine"],"tags":{"waterway":"dock"},"name":"Wet Dock / Dry Dock"},"waterway/drain":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","gas","diesel","boat"],"tags":{"waterway":"fuel"},"name":"Marine Fuel Station"},"waterway/river":{"icon":"waterway-river","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],"tags":{"waterway":"river"},"name":"River"},"waterway/riverbank":{"icon":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["name","operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"waterway":"sanitary_dump_station"},"name":"Marine Toilet Disposal"},"waterway/stream_intermittent":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],"tags":{"waterway":"stream","intermittent":"yes"},"reference":{"key":"waterway","value":"stream"},"name":"Intermittent Stream"},"waterway/stream":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],"tags":{"waterway":"stream"},"name":"Stream"},"waterway/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Shop":{"tags":{"name":"Coffee Shop","amenity":"cafe"},"name":"Coffee Shop","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Consultorio Dental":{"tags":{"name":"Consultorio Dental","healthcare":"dentist","amenity":"dentist"},"name":"Consultorio Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Dentista":{"tags":{"name":"Dentista","healthcare":"dentist","amenity":"dentist"},"name":"Dentista","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Food Court":{"tags":{"name":"Food Court","amenity":"fast_food"},"name":"Food Court","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gas":{"tags":{"name":"Costco Gas","amenity":"fuel"},"name":"Costco Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gasoline":{"tags":{"name":"Costco Gasoline","amenity":"fuel"},"name":"Costco Gasoline","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GNV":{"tags":{"name":"GNV","amenity":"fuel"},"name":"GNV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gas":{"tags":{"name":"Gas","amenity":"fuel"},"name":"Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jardin Infantil":{"tags":{"name":"Jardin Infantil","amenity":"kindergarten"},"name":"Jardin Infantil","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Municipal":{"tags":{"name":"Biblioteca Municipal","amenity":"library"},"name":"Biblioteca Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública":{"tags":{"name":"Biblioteca Pública","amenity":"library"},"name":"Biblioteca Pública","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública Municipal":{"tags":{"name":"Biblioteca Pública Municipal","amenity":"library"},"name":"Biblioteca Pública Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmácia":{"tags":{"name":"Farmácia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmácia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Belvedere":{"tags":{"name":"Belvedere","amenity":"restaurant"},"name":"Belvedere","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak House":{"tags":{"name":"Steak House","amenity":"restaurant"},"name":"Steak House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Estadual":{"tags":{"name":"Escola Estadual","amenity":"school"},"name":"Escola Estadual","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Municipal":{"tags":{"name":"Escola Municipal","amenity":"school"},"name":"Escola Municipal","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Anfiteatro":{"tags":{"name":"Anfiteatro","amenity":"theatre"},"name":"Anfiteatro","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Municipal":{"tags":{"name":"Teatro Municipal","amenity":"theatre"},"name":"Teatro Municipal","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/veterinary/Clinica Veterinaria":{"tags":{"name":"Clinica Veterinaria","amenity":"veterinary"},"name":"Clinica Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/veterinary/Veterinaria":{"tags":{"name":"Veterinaria","amenity":"veterinary"},"name":"Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Polideportivo":{"tags":{"name":"Polideportivo","leisure":"sports_centre"},"name":"Polideportivo","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Panaderia":{"tags":{"name":"Panaderia","shop":"bakery"},"name":"Panaderia","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimarket":{"tags":{"name":"Minimarket","shop":"convenience"},"name":"Minimarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/funeral_directors/Funeraria":{"tags":{"name":"Funeraria","shop":"funeral_directors"},"name":"Funeraria","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Barbershop":{"tags":{"name":"Barbershop","shop":"hairdresser"},"name":"Barbershop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon":{"tags":{"name":"Salon","shop":"hairdresser"},"name":"Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosco":{"tags":{"name":"Kiosco","shop":"kiosk"},"name":"Kiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Kitchen":{"tags":{"name":"Kitchen","shop":"kitchen"},"name":"Kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/kitchen":{"tags":{"name":"kitchen","shop":"kitchen"},"name":"kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket":{"tags":{"name":"Cricket","shop":"mobile_phone"},"name":"Cricket","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optica":{"tags":{"name":"Optica","shop":"optician"},"name":"Optica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Stadium":{"tags":{"name":"Stadium","shop":"sports"},"name":"Stadium","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Casino":{"tags":{"name":"Casino","shop":"supermarket"},"name":"Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Costco":{"tags":{"name":"Costco","shop":"supermarket"},"name":"Costco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado":{"tags":{"name":"Mercado","shop":"supermarket"},"name":"Mercado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tattoo/Tattoo":{"tags":{"name":"Tattoo","shop":"tattoo"},"name":"Tattoo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vulcanizing Shop":{"tags":{"name":"Vulcanizing Shop","shop":"tyres"},"name":"Vulcanizing Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Lavoir":{"tags":{"name":"Lavoir","tourism":"attraction"},"name":"Lavoir","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path continues":{"tags":{"name":"path continues","tourism":"attraction"},"name":"path continues","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Campsite":{"tags":{"name":"Campsite","tourism":"camp_site"},"name":"Campsite","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Guest House":{"tags":{"name":"Guest House","tourism":"guest_house"},"name":"Guest House","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel":{"tags":{"name":"Motel","tourism":"motel"},"name":"Motel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Museum":{"tags":{"name":"Museum","tourism":"museum"},"name":"Museum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
+var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"airport","fields":["aeroway"],"geometry":["point","vertex","line","area"],"tags":{"aeroway":"*"},"searchable":false,"name":"Aeroway"},"amenity":{"fields":["amenity"],"geometry":["point","vertex","area"],"tags":{"amenity":"*"},"searchable":false,"name":"Amenity"},"circular":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"circular"},"name":"Traffic Circle","searchable":false},"highway":{"fields":["name","highway"],"geometry":["point","vertex","line","area"],"tags":{"highway":"*"},"searchable":false,"name":"Highway"},"place":{"fields":["name","place"],"geometry":["point","vertex","area"],"tags":{"place":"*"},"searchable":false,"name":"Place"},"power":{"geometry":["point","vertex","line","area"],"tags":{"power":"*"},"fields":["power"],"searchable":false,"name":"Power"},"railway":{"fields":["railway"],"geometry":["point","vertex","line","area"],"tags":{"railway":"*"},"searchable":false,"name":"Railway"},"roundabout":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"roundabout"},"name":"Roundabout","searchable":false},"waterway":{"fields":["name","waterway"],"geometry":["point","vertex","line","area"],"tags":{"waterway":"*"},"searchable":false,"name":"Waterway"},"address":{"fields":["address"],"geometry":["point","vertex","area"],"tags":{"addr:*":"*"},"addTags":{},"removeTags":{},"reference":{"key":"addr"},"name":"Address","matchScore":0.15},"advertising/billboard":{"fields":["direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station","searchable":false},"aerialway/cable_car":{"geometry":["line"],"terms":["tramway","ropeway"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"cable_car"},"name":"Cable Car"},"aerialway/chair_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"chair_lift"},"name":"Chair Lift"},"aerialway/drag_lift":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"drag_lift"},"name":"Drag Lift"},"aerialway/gondola":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"gondola"},"name":"Gondola"},"aerialway/goods":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"goods"},"name":"Goods Aerialway"},"aerialway/magic_carpet":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"magic_carpet"},"name":"Magic Carpet Lift"},"aerialway/mixed_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"mixed_lift"},"name":"Mixed Lift"},"aerialway/platter":{"geometry":["line"],"terms":["button lift","poma lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"platter"},"name":"Platter Lift"},"aerialway/pylon":{"geometry":["point","vertex"],"fields":["ref"],"tags":{"aerialway":"pylon"},"name":"Aerialway Pylon"},"aerialway/rope_tow":{"geometry":["line"],"terms":["handle tow","bugel lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"rope_tow"},"name":"Rope Tow Lift"},"aerialway/t-bar":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"terms":["tbar"],"tags":{"aerialway":"t-bar"},"name":"T-bar Lift"},"aeroway/aerodrome":{"icon":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"airport","geometry":["point"],"fields":["ref_aeroway_gate"],"tags":{"aeroway":"gate"},"name":"Airport Gate"},"aeroway/hangar":{"geometry":["area"],"fields":["name","building_area"],"tags":{"aeroway":"hangar"},"name":"Hangar"},"aeroway/helipad":{"icon":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"geometry":["line","area"],"terms":["landing strip"],"fields":["ref_runway","surface","length","width"],"tags":{"aeroway":"runway"},"name":"Runway"},"aeroway/taxiway":{"geometry":["line"],"fields":["ref_taxiway","surface"],"tags":{"aeroway":"taxiway"},"name":"Taxiway"},"aeroway/terminal":{"icon":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/bus_station":{"icon":"bus","fields":["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"bus_station"},"name":"Bus Station / Terminal","searchable":false},"amenity/coworking_space":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"coworking_space"},"name":"Coworking Space","searchable":false},"amenity/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Station / Terminal","searchable":false},"amenity/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"tags":{"amenity":"nursing_home"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home","searchable":false},"amenity/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"amenity":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office","searchable":false},"amenity/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard","searchable":false},"amenity/swimming_pool":{"icon":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_boarding"],"geometry":["point","area"],"terms":["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],"tags":{"amenity":"animal_boarding"},"name":"Animal Boarding Facility"},"amenity/animal_breeding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_breeding"],"geometry":["point","area"],"terms":["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],"tags":{"amenity":"animal_breeding"},"name":"Animal Breeding Facility"},"amenity/animal_shelter":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_shelter"],"geometry":["point","area"],"terms":["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],"tags":{"amenity":"animal_shelter"},"name":"Animal Shelter"},"amenity/arts_centre":{"icon":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"bank","fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],"tags":{"amenity":"bank"},"name":"Bank"},"amenity/bar":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"terms":["dive","beer","bier","booze"],"tags":{"amenity":"bar"},"name":"Bar"},"amenity/bbq":{"icon":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"bicycle","fields":["bicycle_parking","capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_parking"},"name":"Bicycle Parking"},"amenity/bicycle_rental":{"icon":"bicycle","fields":["capacity","network","operator","payment_multi"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_rental"},"name":"Bicycle Rental"},"amenity/bicycle_repair_station":{"icon":"bicycle","fields":["operator","brand","opening_hours","fee","service/bicycle"],"geometry":["point","vertex"],"terms":["bike","repair","chain","pump"],"tags":{"amenity":"bicycle_repair_station"},"name":"Bicycle Repair Tool Stand"},"amenity/biergarten":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_pooling":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_pooling"},"name":"Car Pooling"},"amenity/car_rental":{"icon":"car","fields":["name","operator","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","payment_multi","smoking"],"geometry":["point","area"],"terms":["gambling","roulette","craps","poker","blackjack"],"tags":{"amenity":"casino"},"name":"Casino"},"amenity/charging_station":{"icon":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"school","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["daycare","orphanage","playgroup"],"tags":{"amenity":"childcare"},"name":"Nursery/Childcare"},"amenity/cinema":{"icon":"cinema","fields":["name","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["drive-in","film","flick","movie","theater","picture","show","screen"],"tags":{"amenity":"cinema"},"name":"Cinema"},"amenity/clinic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medical","urgentcare"],"tags":{"amenity":"clinic"},"addTags":{"amenity":"clinic","healthcare":"clinic"},"removeTags":{"amenity":"clinic","healthcare":"clinic"},"reference":{"key":"amenity","value":"clinic"},"name":"Clinic"},"amenity/clinic/abortion":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"abortion"},"reference":{"key":"amenity","value":"clinic"},"name":"Abortion Clinic"},"amenity/clinic/fertility":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["egg","fertility","reproductive","sperm","ovulation"],"tags":{"amenity":"clinic","healthcare":"clinic","healthcare:speciality":"fertility"},"reference":{"key":"amenity","value":"clinic"},"name":"Fertility Clinic"},"amenity/clock":{"icon":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["university"],"tags":{"amenity":"college"},"name":"College Grounds"},"amenity/community_centre":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["event","hall"],"tags":{"amenity":"community_centre"},"name":"Community Center"},"amenity/compressed_air":{"icon":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"dentist","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["tooth","teeth"],"tags":{"amenity":"dentist"},"addTags":{"amenity":"dentist","healthcare":"dentist"},"removeTags":{"amenity":"dentist","healthcare":"dentist"},"reference":{"key":"amenity","value":"dentist"},"name":"Dentist"},"amenity/doctors":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medic*","physician"],"tags":{"amenity":"doctors"},"addTags":{"amenity":"doctors","healthcare":"doctor"},"removeTags":{"amenity":"doctors","healthcare":"doctor"},"reference":{"key":"amenity","value":"doctors"},"name":"Doctor"},"amenity/dojo":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["martial arts","dojang"],"tags":{"amenity":"dojo"},"name":"Dojo / Martial Arts Academy"},"amenity/drinking_water":{"icon":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"fast-food","fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"fast_food"},"terms":["restaurant","takeaway"],"name":"Fast Food"},"amenity/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["fast food","restaurant","food"],"tags":{"amenity":"food_court"},"name":"Food Court"},"amenity/fountain":{"icon":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"fuel"},"name":"Gas Station"},"amenity/grave_yard":{"icon":"cemetery","fields":["religion","denomination"],"geometry":["point","area"],"tags":{"amenity":"grave_yard"},"name":"Graveyard"},"amenity/grit_bin":{"fields":["access_simple"],"geometry":["point","vertex"],"tags":{"amenity":"grit_bin"},"terms":["salt","sand"],"name":"Grit Bin"},"amenity/hospital":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","emergency"],"geometry":["point","area"],"terms":["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],"tags":{"amenity":"hospital"},"addTags":{"amenity":"hospital","healthcare":"hospital"},"removeTags":{"amenity":"hospital","healthcare":"hospital"},"reference":{"key":"amenity","value":"hospital"},"name":"Hospital Grounds"},"amenity/hunting_stand":{"icon":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"ice-cream","fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"geometry":["point","area"],"terms":["gelato","sorbet","sherbet","frozen","yogurt"],"tags":{"amenity":"ice_cream"},"name":"Ice Cream Shop"},"amenity/internet_cafe":{"icon":"poi-mast","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],"tags":{"amenity":"internet_cafe"},"name":"Internet Cafe"},"amenity/kindergarten":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"library","fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/love_hotel":{"icon":"heart","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"love_hotel"},"name":"Love Hotel"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/music_school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["school of music"],"tags":{"amenity":"music_school"},"name":"Music School"},"amenity/nightclub":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"amenity":"nightclub"},"terms":["disco*","night club","dancing","dance club"],"name":"Nightclub"},"amenity/parking_entrance":{"icon":"entrance-alt1","fields":["access_simple","ref"],"geometry":["vertex"],"tags":{"amenity":"parking_entrance"},"name":"Parking Garage Entrance/Exit"},"amenity/parking_space":{"fields":["capacity"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"parking_space"},"matchScore":0.95,"name":"Parking Space"},"amenity/parking":{"icon":"parking","fields":["operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"pharmacy","fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"amenity":"pharmacy"},"addTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"removeTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"reference":{"key":"amenity","value":"pharmacy"},"terms":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area","service_times"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"place_of_worship"},"name":"Place of Worship"},"amenity/place_of_worship/buddhist":{"icon":"buddhism","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],"tags":{"amenity":"place_of_worship","religion":"buddhist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Buddhist Temple"},"amenity/place_of_worship/christian":{"icon":"religious-christian","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],"tags":{"amenity":"place_of_worship","religion":"christian"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Church"},"amenity/place_of_worship/hindu":{"icon":"poi-hinduist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],"tags":{"amenity":"place_of_worship","religion":"hindu"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Hindu Temple"},"amenity/place_of_worship/jewish":{"icon":"religious-jewish","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["jewish"],"tags":{"amenity":"place_of_worship","religion":"jewish"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Synagogue"},"amenity/place_of_worship/muslim":{"icon":"religious-muslim","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["muslim"],"tags":{"amenity":"place_of_worship","religion":"muslim"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Mosque"},"amenity/place_of_worship/shinto":{"icon":"poi-shintoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kami","torii"],"tags":{"amenity":"place_of_worship","religion":"shinto"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Shinto Shrine"},"amenity/place_of_worship/sikh":{"icon":"poi-sikhist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["gurudwara","temple"],"tags":{"amenity":"place_of_worship","religion":"sikh"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Sikh Temple"},"amenity/place_of_worship/taoist":{"icon":"poi-taoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["daoist","monastery","temple"],"tags":{"amenity":"place_of_worship","religion":"taoist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Taoist Temple"},"amenity/planetarium":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"police","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],"tags":{"amenity":"police"},"name":"Police"},"amenity/post_box":{"icon":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"post","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["letter","mail"],"tags":{"amenity":"post_office"},"name":"Post Office"},"amenity/prison":{"icon":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"geometry":["point","area"],"tags":{"amenity":"pub"},"terms":["alcohol","drink","dive","beer","bier","booze"],"name":"Pub"},"amenity/public_bath":{"icon":"water","fields":["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"public_bath"},"terms":["onsen","foot bath","hot springs"],"name":"Public Bath"},"amenity/public_bookcase":{"icon":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/ranger_station":{"fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],"tags":{"amenity":"ranger_station"},"name":"Ranger Station"},"amenity/recycling_centre":{"icon":"recycling","fields":["name","operator","address","building","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"reference":{"key":"recycling_type","value":"*"},"name":"Recycling Center"},"amenity/recycling":{"icon":"recycling","fields":["recycling_accepts","collection_times"],"geometry":["point","area"],"terms":["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling"},"addTags":{"amenity":"recycling","recycling_type":"container"},"removeTags":{"amenity":"recycling","recycling_type":"container"},"reference":{"key":"amenity","value":"recycling"},"name":"Recycling Container"},"amenity/restaurant":{"icon":"restaurant","fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],"tags":{"amenity":"restaurant"},"name":"Restaurant"},"amenity/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"amenity":"sanitary_dump_station"},"name":"RV Toilet Disposal"},"amenity/school":{"icon":"school","fields":["name","operator","address","religion","denomination"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"amenity/shelter":{"icon":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"poi-shower","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/smoking_area":{"fields":["name","shelter","bin","bench","opening_hours"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"smoking_area"},"name":"Smoking Area"},"amenity/social_facility":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility"},"name":"Social Facility"},"amenity/social_facility/food_bank":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility","social_facility":"food_bank"},"reference":{"key":"social_facility","value":"food_bank"},"name":"Food Bank"},"amenity/social_facility/group_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["old","senior","living","care home","assisted living"],"tags":{"amenity":"social_facility","social_facility":"group_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"group_home"},"name":"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["houseless","unhoused","displaced"],"tags":{"amenity":"social_facility","social_facility":"shelter","social_facility:for":"homeless"},"reference":{"key":"social_facility","value":"shelter"},"name":"Homeless Shelter"},"amenity/social_facility/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["elderly","living","nursing","old","senior","assisted living"],"tags":{"amenity":"social_facility","social_facility":"nursing_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home"},"amenity/studio":{"icon":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","fields":["operator","phone","fee","payment_multi","covered","indoor"],"geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"toilet","fields":["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],"geometry":["point","vertex","area"],"terms":["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],"tags":{"amenity":"toilets"},"name":"Toilets"},"amenity/townhall":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["village","city","government","courthouse","municipal"],"tags":{"amenity":"townhall"},"name":"Town Hall"},"amenity/university":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-vending-machine","fields":["vending","operator","payment_multi","currency_multi"],"geometry":["point"],"terms":[],"tags":{"amenity":"vending_machine"},"name":"Vending Machine"},"amenity/vending_machine/news_papers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"news_papers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine","searchable":false},"amenity/vending_machine/cigarettes":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cigarette"],"tags":{"amenity":"vending_machine","vending":"cigarettes"},"reference":{"key":"vending","value":"cigarettes"},"name":"Cigarette Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom"],"tags":{"amenity":"vending_machine","vending":"condoms"},"reference":{"key":"vending","value":"condoms"},"name":"Condom Vending Machine"},"amenity/vending_machine/drinks":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["drink","soda","beverage","juice","pop"],"tags":{"amenity":"vending_machine","vending":"drinks"},"reference":{"key":"vending","value":"drinks"},"name":"Drink Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["excrement bags","poop","dog","animal"],"tags":{"amenity":"vending_machine","vending":"excrement_bags"},"reference":{"key":"vending","value":"excrement_bags"},"name":"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],"tags":{"amenity":"vending_machine","vending":"feminine_hygiene"},"reference":{"key":"vending","value":"feminine_hygiene"},"name":"Feminine Hygiene Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["newspaper"],"tags":{"amenity":"vending_machine","vending":"newspapers"},"reference":{"key":"vending","value":"newspapers"},"name":"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parking","ticket"],"tags":{"amenity":"vending_machine","vending":"parking_tickets"},"reference":{"key":"vending","value":"parking_tickets"},"matchScore":0.94,"name":"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["bus","train","ferry","rail","ticket","transportation"],"tags":{"amenity":"vending_machine","vending":"public_transport_tickets"},"reference":{"key":"vending","value":"public_transport_tickets"},"name":"Transit Ticket Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["candy","gum","chip","pretzel","cookie","cracker"],"tags":{"amenity":"vending_machine","vending":"sweets"},"reference":{"key":"vending","value":"sweets"},"name":"Snack Vending Machine"},"amenity/veterinary":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pet clinic","veterinarian","animal hospital","pet doctor"],"tags":{"amenity":"veterinary"},"name":"Veterinary"},"amenity/waste_basket":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex"],"tags":{"amenity":"waste_basket"},"terms":["bin","garbage","rubbish","litter","trash"],"name":"Waste Basket"},"amenity/waste_disposal":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_disposal"},"terms":["garbage","rubbish","litter","trash"],"name":"Garbage Dumpster"},"amenity/waste_transfer_station":{"icon":"waste-basket","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["dump","garbage","recycling","rubbish","scrap","trash"],"tags":{"amenity":"waste_transfer_station"},"name":"Waste Transfer Station"},"amenity/waste/dog_excrement":{"icon":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_basket","waste":"dog_excrement"},"reference":{"key":"waste","value":"dog_excrement"},"terms":["bin","garbage","rubbish","litter","trash","poo","dog"],"name":"Dog Excrement Bin"},"amenity/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"watering_place"},"name":"Animal Watering Place"},"area":{"fields":["name"],"geometry":["area"],"tags":{"area":"yes"},"name":"Area","matchScore":0.1},"area/highway":{"fields":["name","area/highway"],"geometry":["area"],"tags":{"area:highway":"*"},"name":"Road Surface"},"attraction/amusement_ride":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","carnival ride"],"tags":{"attraction":"amusement_ride"},"name":"Amusement Ride"},"attraction/animal":{"icon":"zoo","fields":["name","operator"],"geometry":["point","area"],"terms":["zoo","theme park","animal park","lion","tiger","bear"],"tags":{"attraction":"animal"},"name":"Animal"},"attraction/big_wheel":{"icon":"amusement-park","fields":["name","operator","height","opening_hours"],"geometry":["point"],"terms":["ferris wheel","theme park","amusement ride"],"tags":{"attraction":"big_wheel"},"name":"Big Wheel"},"attraction/bumper_car":{"icon":"car","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","dodgem cars","autoscooter"],"tags":{"attraction":"bumper_car"},"name":"Bumper Car"},"attraction/bungee_jumping":{"icon":"pitch","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","bungy jumping","jumping platform"],"tags":{"attraction":"bungee_jumping"},"name":"Bungee Jumping"},"attraction/carousel":{"icon":"horse-riding","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],"tags":{"attraction":"carousel"},"name":"Carousel"},"attraction/dark_ride":{"icon":"rail-metro","fields":["name","operator","opening_hours"],"geometry":["point","line","area"],"terms":["theme park","ghost train"],"tags":{"attraction":"dark_ride"},"name":"Dark Ride"},"attraction/drop_tower":{"icon":"poi-tower","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride","gondola","tower","big drop"],"tags":{"attraction":"drop_tower"},"name":"Drop Tower"},"attraction/pirate_ship":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point"],"terms":["theme park","carnival ride","amusement ride"],"tags":{"attraction":"pirate_ship"},"name":"Pirate Ship"},"attraction/river_rafting":{"icon":"ferry","fields":["name","operator","opening_hours"],"geometry":["point","line"],"terms":["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],"tags":{"attraction":"river_rafting"},"name":"River Rafting"},"attraction/roller_coaster":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"rail","fields":["name","operator","fee","opening_hours"],"geometry":["point","line"],"terms":["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],"tags":{"attraction":"train"},"name":"Tourist Train"},"attraction/water_slide":{"icon":"swimming","fields":["name","operator","opening_hours"],"geometry":["line","area"],"terms":["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],"tags":{"attraction":"water_slide"},"name":"Water Slide"},"barrier":{"icon":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kerb":{"icon":"wheelchair","fields":["kerb","tactile_paving"],"geometry":["vertex","line"],"tags":{"barrier":"kerb"},"name":"Kerb"},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"barrier","fields":["wall","height"],"geometry":["line","area"],"tags":{"barrier":"wall"},"name":"Wall","matchScore":0.25},"boundary/administrative":{"name":"Administrative Boundary","geometry":["line"],"tags":{"boundary":"administrative"},"fields":["name","admin_level"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/boathouse":{"icon":"harbor","fields":["name","levels","address"],"geometry":["area"],"tags":{"building":"boathouse"},"matchScore":0.5,"terms":[],"name":"Boathouse"},"building/bungalow":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bungalow"},"terms":["home","detached"],"matchScore":0.5,"name":"Bungalow"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/civic":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"civic"},"matchScore":0.5,"name":"Civic Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"suitcase","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/farm":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"farm"},"matchScore":0.5,"name":"Farm Building"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/mosque":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"mosque"},"matchScore":0.5,"name":"Mosque Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/ruins":{"icon":"poi-ruins","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"ruins"},"matchScore":0.5,"name":"Building Ruins"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/service":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"service"},"matchScore":0.5,"name":"Service Building"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/stadium":{"icon":"stadium","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"stadium"},"matchScore":0.5,"name":"Stadium Building"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/temple":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"temple"},"matchScore":0.5,"name":"Temple Building"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/transportation":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"transportation"},"matchScore":0.5,"name":"Transportation Building"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"jeweler"},"reference":{"key":"shop","value":"jewelry"},"name":"Jeweler","searchable":false},"craft/locksmith":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"locksmith"},"reference":{"key":"shop","value":"locksmith"},"name":"Locksmith","searchable":false},"craft/optician":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"optician"},"reference":{"key":"shop","value":"optician"},"name":"Optician","searchable":false},"craft/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"craft":"tailor"},"reference":{"key":"shop","value":"tailor"},"name":"Tailor","searchable":false},"craft/basket_maker":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beer","beverage","bier","booze","cider"],"tags":{"craft":"brewery"},"name":"Brewery"},"craft/carpenter":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/chimney_sweeper":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"chimney_sweeper"},"name":"Chimney Sweeper"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],"tags":{"craft":"distillery"},"name":"Distillery"},"craft/dressmaker":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculptor":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculptor"},"name":"Sculptor"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"emergency/designated":{"fields":[],"geometry":["line"],"tags":{"emergency":"designated"},"terms":[],"name":"Emergency Access Designated","searchable":false,"matchScore":0.01},"emergency/destination":{"fields":[],"geometry":["line"],"tags":{"emergency":"destination"},"terms":[],"name":"Emergency Access Destination","searchable":false,"matchScore":0.01},"emergency/no":{"fields":[],"geometry":["line"],"tags":{"emergency":"no"},"terms":[],"name":"Emergency Access No","searchable":false,"matchScore":0.01},"emergency/official":{"fields":[],"geometry":["line"],"tags":{"emergency":"official"},"terms":[],"name":"Emergency Access Official","searchable":false,"matchScore":0.01},"emergency/private":{"fields":[],"geometry":["line"],"tags":{"emergency":"private"},"terms":[],"name":"Emergency Access Private","searchable":false,"matchScore":0.01},"emergency/yes":{"fields":[],"geometry":["line"],"tags":{"emergency":"yes"},"terms":[],"name":"Emergency Access Yes","searchable":false,"matchScore":0.01},"emergency/ambulance_station":{"icon":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-fire-hydrant","fields":["fire_hydrant/type","fire_hydrant/position","ref","operator"],"geometry":["point","vertex"],"terms":["fire plug"],"tags":{"emergency":"fire_hydrant"},"name":"Fire Hydrant"},"emergency/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"emergency/water_tank":{"icon":"water","fields":["name","operator","ref"],"geometry":["point","vertex"],"terms":["water tank","cistern","reservoir"],"tags":{"emergency":"water_tank"},"name":"Emergency Water Tank"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra"},"reference":{"key":"footway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"green","landuse":"grass","leisure":"pitch","sport":"golf"},"reference":{"key":"golf","value":"green"},"name":"Putting Green"},"golf/hole":{"icon":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"lateral_water_hazard","natural":"water"},"reference":{"key":"golf","value":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"tee","landuse":"grass"},"terms":["teeing ground"],"reference":{"key":"golf","value":"tee"},"name":"Tee Box"},"golf/water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"water_hazard","natural":"water"},"reference":{"key":"golf","value":"water_hazard"},"name":"Water Hazard"},"golf/water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"hospital","fields":["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"healthcare":"*"},"terms":["clinic","doctor","disease","health","institution","sick","surgery","wellness"],"name":"Healthcare Facility"},"healthcare/alternative":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],"tags":{"healthcare":"alternative"},"name":"Alternative Medicine"},"healthcare/alternative/chiropractic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["back","pain","spine"],"tags":{"healthcare":"alternative","healthcare:speciality":"chiropractic"},"name":"Chiropractor"},"healthcare/audiologist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["ear","hearing","sound"],"tags":{"healthcare":"audiologist"},"name":"Audiologist"},"healthcare/birthing_center":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"birthing_center"},"name":"Birthing Center"},"healthcare/blood_donation":{"icon":"blood-bank","fields":["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],"tags":{"healthcare":"blood_donation"},"name":"Blood Donor Center"},"healthcare/hospice":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"midwife"},"name":"Midwife"},"healthcare/occupational_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["therapist","therapy"],"tags":{"healthcare":"occupational_therapist"},"name":"Occupational Therapist"},"healthcare/optometrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses","lasik","lenses","vision"],"tags":{"healthcare":"optometrist"},"name":"Optometrist"},"healthcare/physiotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["physical","therapist","therapy"],"tags":{"healthcare":"physiotherapist"},"name":"Physiotherapist"},"healthcare/podiatrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["foot","feet","nails"],"tags":{"healthcare":"podiatrist"},"name":"Podiatrist"},"healthcare/psychotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],"tags":{"healthcare":"psychotherapist"},"name":"Psychotherapist"},"healthcare/rehabilitation":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["rehab","therapist","therapy"],"tags":{"healthcare":"rehabilitation"},"name":"Rehabilitation Facility"},"healthcare/speech_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["speech","therapist","therapy","voice"],"tags":{"healthcare":"speech_therapist"},"name":"Speech Therapist"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"name":"Bus Stop / Platform","searchable":false},"highway/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_guideway":{"icon":"highway-bus_guideway","fields":["name","operator","oneway"],"geometry":["line"],"tags":{"highway":"bus_guideway"},"addTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"removeTags":{"highway":"bus_guideway","access":"no","bus":"designated"},"terms":[],"name":"Bus Guideway"},"highway/corridor":{"icon":"highway-footway","fields":["name","width","level","access_simple"],"geometry":["line"],"tags":{"highway":"corridor"},"terms":["gallery","hall","hallway","indoor","passage","passageway"],"name":"Indoor Corridor"},"highway/crossing-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"highway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["direction_vertex"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["direction_clock"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"highway-motorway","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"motorway"},"terms":["autobahn","expressway","freeway","highway","interstate","parkway","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian_area":{"icon":"poi-foot","fields":["name","surface","lit","width","structure","access"],"geometry":["area"],"tags":{"highway":"pedestrian","area":"yes"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Area"},"highway/pedestrian_line":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line"],"tags":{"highway":"pedestrian"},"terms":["center","centre","plaza","quad","square","walkway"],"name":"Pedestrian Street"},"highway/primary_link":{"icon":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"highway-unclassified","fields":["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],"geometry":["point","line","area"],"tags":{"highway":"raceway"},"addTags":{"highway":"raceway","sport":"motor"},"terms":["auto*","formula one","kart","motocross","nascar","race*","track"],"name":"Racetrack (Motorsport)"},"highway/residential":{"icon":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"alley"},"reference":{"key":"service","value":"alley"},"name":"Alley"},"highway/service/drive-through":{"icon":"highway-service","fields":["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],"geometry":["line"],"tags":{"highway":"service","service":"drive-through"},"reference":{"key":"service","value":"drive-through"},"name":"Drive-Through"},"highway/service/driveway":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"driveway"},"reference":{"key":"service","value":"driveway"},"name":"Driveway"},"highway/service/emergency_access":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"emergency_access"},"reference":{"key":"service","value":"emergency_access"},"name":"Emergency Access"},"highway/service/parking_aisle":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"parking_aisle"},"reference":{"key":"service","value":"parking_aisle"},"name":"Parking Aisle"},"highway/services":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["direction","ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","direction_vertex"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-bulb","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","direction","ref"],"terms":["streetlight","street light","lamp","light","gaslight"],"name":"Street Lamp"},"highway/tertiary_link":{"icon":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"geometry":["line"],"tags":{"highway":"track"},"terms":["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],"name":"Unmaintained Track Road"},"highway/traffic_mirror":{"geometry":["point","vertex"],"fields":["direction"],"tags":{"highway":"traffic_mirror"},"terms":["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],"name":"Traffic Mirror"},"highway/traffic_signals":{"icon":"poi-traffic-signals","geometry":["vertex"],"tags":{"highway":"traffic_signals"},"fields":["traffic_signals","traffic_signals/direction"],"terms":["light","stoplight","traffic light"],"name":"Traffic Signals"},"highway/trunk_link":{"icon":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-junction","fields":["name"],"geometry":["vertex","area"],"tags":{"junction":"yes"},"name":"Junction"},"landuse":{"fields":["name","landuse"],"geometry":["area"],"tags":{"landuse":"*"},"matchScore":0.9,"name":"Land Use"},"landuse/farm":{"icon":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"aquarium","fields":["name","operator","produce"],"geometry":["area"],"tags":{"landuse":"aquaculture"},"terms":["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],"name":"Aquaculture"},"landuse/basin":{"icon":"water","fields":["name"],"geometry":["area"],"tags":{"landuse":"basin"},"terms":[],"name":"Basin"},"landuse/brownfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"brownfield"},"terms":[],"matchScore":0.9,"name":"Brownfield"},"landuse/cemetery":{"icon":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"suitcase","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"matchScore":0.9,"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"garages"},"terms":[],"name":"Garage Landuse"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/greenfield":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"greenfield"},"terms":[],"matchScore":0.9,"name":"Greenfield"},"landuse/greenhouse_horticulture":{"icon":"garden","fields":["name","operator"],"geometry":["area"],"terms":["flower","greenhouse","horticulture","grow","vivero"],"tags":{"landuse":"greenhouse_horticulture"},"matchScore":0.9,"name":"Greenhouse Horticulture"},"landuse/harbour":{"icon":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/industrial/scrap_yard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"scrap_yard"},"addTags":{"landuse":"industrial","industrial":"scrap_yard"},"removeTags":{"landuse":"industrial","industrial":"scrap_yard"},"reference":{"key":"industrial","value":"scrap_yard"},"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"name":"Scrap Yard"},"landuse/industrial/slaughterhouse":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"industrial":"slaughterhouse"},"addTags":{"landuse":"industrial","industrial":"slaughterhouse"},"removeTags":{"landuse":"industrial","industrial":"slaughterhouse"},"reference":{"key":"industrial","value":"slaughterhouse"},"terms":["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],"name":"Slaughterhouse"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"icon":"garden","geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"barracks"},"addTags":{"landuse":"military","military":"barracks"},"removeTags":{"landuse":"military","military":"barracks"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Barracks"},"landuse/military/bunker":{"icon":"poi-military","fields":["name","bunker_type","building_area"],"geometry":["point","area"],"tags":{"military":"bunker"},"addTags":{"building":"bunker","landuse":"military","military":"bunker"},"removeTags":{"building":"bunker","landuse":"military","military":"bunker"},"terms":["air force","army","base","fight","force","guard","marine","navy","troop","war"],"name":"Military Bunker"},"landuse/military/checkpoint":{"icon":"barrier","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"checkpoint"},"addTags":{"landuse":"military","military":"checkpoint"},"removeTags":{"landuse":"military","military":"checkpoint"},"terms":["air force","army","base","force","guard","marine","navy","troop","war"],"name":"Checkpoint"},"landuse/military/danger_area":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"danger_area"},"addTags":{"landuse":"military","military":"danger_area"},"removeTags":{"landuse":"military","military":"danger_area"},"terms":["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],"name":"Danger Area"},"landuse/military/naval_base":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"naval_base"},"addTags":{"landuse":"military","military":"naval_base"},"removeTags":{"landuse":"military","military":"naval_base"},"terms":["base","fight","force","guard","marine","navy","ship","sub","troop","war"],"name":"Naval Base"},"landuse/military/nuclear_explosion_site":{"icon":"danger","fields":["name"],"geometry":["point","vertex","area"],"tags":{"military":"nuclear_explosion_site"},"addTags":{"landuse":"military","military":"nuclear_explosion_site"},"removeTags":{"landuse":"military","military":"nuclear_explosion_site"},"terms":["atom","blast","bomb","detonat*","nuke","site","test"],"name":"Nuclear Explosion Site"},"landuse/military/obstacle_course":{"icon":"poi-military","geometry":["point","area"],"tags":{"military":"obstacle_course"},"addTags":{"landuse":"military","military":"obstacle_course"},"removeTags":{"landuse":"military","military":"obstacle_course"},"terms":["army","base","force","guard","marine","navy","troop","war"],"name":"Obstacle Course"},"landuse/military/office":{"icon":"poi-military","fields":["name","building_area"],"geometry":["point","area"],"tags":{"military":"office"},"addTags":{"landuse":"military","military":"office"},"removeTags":{"landuse":"military","military":"office"},"terms":["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],"name":"Military Office"},"landuse/military/range":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"range"},"addTags":{"landuse":"military","military":"range"},"removeTags":{"landuse":"military","military":"range"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Military Range"},"landuse/military/training_area":{"icon":"poi-military","fields":["name"],"geometry":["point","area"],"tags":{"military":"training_area"},"addTags":{"landuse":"military","military":"training_area"},"removeTags":{"landuse":"military","military":"training_area"},"terms":["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],"name":"Training Area"},"landuse/orchard":{"icon":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"garden","fields":["name","operator","plant"],"geometry":["area"],"tags":{"landuse":"plant_nursery"},"terms":["flower","garden","grow","vivero"],"name":"Plant Nursery"},"landuse/quarry":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"quarry"},"terms":[],"name":"Quarry"},"landuse/railway":{"icon":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/religious":{"geometry":["area"],"fields":["name","religion","denomination"],"tags":{"landuse":"religious"},"terms":[],"name":"Religious Area"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"matchScore":0.9,"name":"Residential Area"},"landuse/retail":{"icon":"commercial","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"matchScore":0.9,"name":"Retail Area"},"landuse/vineyard":{"fields":["name","operator","grape_variety"],"geometry":["area"],"tags":{"landuse":"vineyard"},"addTags":{"landuse":"vineyard","crop":"grape"},"removeTags":{"landuse":"vineyard","crop":"grape","grape_variety":"*"},"terms":["grape","wine"],"name":"Vineyard"},"leisure":{"icon":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","slot machine"],"tags":{"leisure":"adult_gaming_centre"},"name":"Adult Gaming Center"},"leisure/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-bowling","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["bowling center"],"tags":{"leisure":"bowling_alley"},"name":"Bowling Alley"},"leisure/common":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_centre"},"terms":["health","gym","leisure","studio"],"name":"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["studio"],"tags":{"leisure":"fitness_centre","sport":"yoga"},"reference":{"key":"sport","value":"yoga"},"name":"Yoga Studio"},"leisure/fitness_station":{"icon":"pitch","fields":["fitness_station","ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"addTags":{"leisure":"fitness_station","sport":"fitness"},"removeTags":{"leisure":"fitness_station","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"balance_beam"},"addTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"balance_beam","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["balance","exercise","fitness","gym","trim trail"],"name":"Exercise Balance Beam"},"leisure/fitness_station/box":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"box"},"addTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"box","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["box","exercise","fitness","gym","jump","trim trail"],"name":"Exercise Box"},"leisure/fitness_station/horizontal_bar":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_bar"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_bar","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],"name":"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder"},"addTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"horizontal_ladder","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],"name":"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"hyperextension"},"addTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"hyperextension","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["back","exercise","extension","fitness","gym","roman chair","trim trail"],"name":"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"parallel_bars"},"addTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"parallel_bars","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","dip","exercise","fitness","gym","trim trail"],"name":"Parallel Bars"},"leisure/fitness_station/push-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"push-up"},"addTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"push-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["bar","exercise","fitness","gym","pushup","push up","trim trail"],"name":"Push-Up Station"},"leisure/fitness_station/rings":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"rings"},"addTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"rings","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],"name":"Exercise Rings"},"leisure/fitness_station/sign":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sign"},"addTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sign","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","trim trail"],"name":"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"sit-up"},"addTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"sit-up","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["crunch","exercise","fitness","gym","situp","sit up","trim trail"],"name":"Sit-Up Station"},"leisure/fitness_station/stairs":{"icon":"pitch","fields":["ref","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station","fitness_station":"stairs"},"addTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"removeTags":{"leisure":"fitness_station","fitness_station":"stairs","sport":"fitness"},"reference":{"key":"leisure","value":"fitness_station"},"terms":["exercise","fitness","gym","steps","trim trail"],"name":"Exercise Stairs"},"leisure/garden":{"icon":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"commercial","fields":["name","address","building_area","opening_hours","website"],"geometry":["point","area"],"terms":["makerspace","hackspace","hacklab"],"tags":{"leisure":"hackerspace"},"name":"Hackerspace"},"leisure/horse_riding":{"icon":"horse-riding","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["equestrian","stable"],"tags":{"leisure":"horse_riding"},"name":"Horseback Riding Facility"},"leisure/ice_rink":{"icon":"pitch","fields":["name","seasonal","sport_ice","operator","address","building","opening_hours"],"geometry":["point","area"],"terms":["hockey","skating","curling"],"tags":{"leisure":"ice_rink"},"name":"Ice Rink"},"leisure/marina":{"icon":"harbor","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["boat"],"tags":{"leisure":"marina"},"name":"Marina"},"leisure/miniature_golf":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["crazy golf","mini golf","putt-putt"],"tags":{"leisure":"miniature_golf"},"name":"Miniature Golf"},"leisure/nature_reserve":{"icon":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"park","geometry":["point","area"],"fields":["name"],"terms":["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],"tags":{"leisure":"park"},"name":"Park"},"leisure/picnic_table":{"icon":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["surface","hoops","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"basketball"},"reference":{"key":"sport","value":"basketball"},"terms":[],"name":"Basketball Court"},"leisure/pitch/beachvolleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"beachvolleyball"},"addTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"removeTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"reference":{"key":"sport","value":"beachvolleyball"},"terms":["volleyball"],"name":"Beach Volleyball Court"},"leisure/pitch/boules":{"icon":"pitch","fields":["boules","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"boules"},"reference":{"key":"sport","value":"boules"},"terms":["bocce","lyonnaise","pétanque"],"name":"Boules/Bocce Court"},"leisure/pitch/bowls":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["surface","lit","building"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"equestrian"},"reference":{"key":"sport","value":"equestrian"},"terms":["dressage","equestrian","horse","horseback","riding"],"name":"Riding Arena"},"leisure/pitch/rugby_league":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_league"},"reference":{"key":"sport","value":"rugby_league"},"terms":[],"name":"Rugby League Field"},"leisure/pitch/rugby_union":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_union"},"reference":{"key":"sport","value":"rugby_union"},"terms":[],"name":"Rugby Union Field"},"leisure/pitch/skateboard":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"table_tennis"},"reference":{"key":"sport","value":"table_tennis"},"terms":["table tennis","ping pong"],"name":"Ping Pong Table"},"leisure/pitch/tennis":{"icon":"tennis","fields":["surface","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"tennis"},"reference":{"key":"sport","value":"tennis"},"terms":[],"name":"Tennis Court"},"leisure/pitch/volleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"playground","fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"geometry":["point","area"],"terms":["jungle gym","play area"],"tags":{"leisure":"playground"},"name":"Playground"},"leisure/resort":{"icon":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"pitch","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track","sport":"running"},"terms":["race*","running","sprint","track"],"name":"Racetrack (Running)"},"leisure/sauna":{"fields":["name","operator","address","opening_hours","access_simple","fee"],"geometry":["point","area"],"tags":{"leisure":"sauna"},"name":"Sauna"},"leisure/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"pitch","fields":["name","sport","building","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"sports_centre"},"terms":[],"name":"Sports Center / Complex"},"leisure/sports_centre/swimming":{"icon":"swimming","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"sports_centre","sport":"swimming"},"reference":{"key":"sport","value":"swimming"},"name":"Swimming Pool Facility"},"leisure/stadium":{"icon":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"highway-road","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track"},"terms":["cycle","dog","greyhound","horse","race*","track"],"name":"Racetrack (Non-Motorsport)"},"leisure/water_park":{"icon":"swimming","fields":["name","operator","address"],"geometry":["point","area"],"terms":["swim","pool","dive"],"tags":{"leisure":"water_park"},"name":"Water Park"},"line":{"fields":["name"],"geometry":["line"],"tags":{},"name":"Line","matchScore":0.1},"man_made":{"icon":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator","direction"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","geometry":["point","area"],"terms":["gas holder"],"tags":{"man_made":"gasometer"},"name":"Gasometer"},"man_made/groyne":{"geometry":["line","area"],"tags":{"man_made":"groyne"},"name":"Groyne"},"man_made/lighthouse":{"icon":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","fields":["tower/type","tower/construction","height","communication_multi"],"geometry":["point"],"terms":["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],"tags":{"man_made":"mast"},"name":"Mast"},"man_made/monitoring_station":{"icon":"poi-mast","geometry":["point","area"],"fields":["monitoring_multi","operator"],"terms":["weather","earthquake","seismology","air","gps"],"tags":{"man_made":"monitoring_station"},"name":"Monitoring Station"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-storage-tank","geometry":["point"],"terms":["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],"tags":{"man_made":"petroleum_well"},"name":"Oil Well"},"man_made/pier":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator","substance"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance","surveillance:type":"camera"},"name":"Surveillance Camera"},"man_made/surveillance":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","surveillance/zone","direction"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance"},"name":"Surveillance"},"man_made/survey_point":{"icon":"monument","fields":["ref"],"geometry":["point","vertex"],"terms":["trig point","triangulation pillar","trigonometrical station"],"tags":{"man_made":"survey_point"},"name":"Survey Point"},"man_made/tower":{"icon":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"terms":["sewage*","water treatment plant","reclamation plant"],"tags":{"man_made":"wastewater_plant"},"name":"Wastewater Plant"},"man_made/water_tower":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"industry","fields":["name","operator","address","building_area","product"],"geometry":["point","area"],"terms":["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],"tags":{"man_made":"works"},"name":"Factory"},"manhole":{"icon":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"natural","fields":["name","natural"],"geometry":["point","vertex","area"],"tags":{"natural":"*"},"name":"Natural"},"natural/bare_rock":{"geometry":["area"],"tags":{"natural":"bare_rock"},"terms":["rock"],"name":"Bare Rock"},"natural/bay":{"icon":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"triangle","geometry":["point","area"],"fields":["fee","access_simple","direction"],"tags":{"natural":"cave_entrance"},"terms":["cavern","hollow","grotto","shelter","cavity"],"name":"Cave Entrance"},"natural/cliff":{"icon":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"name":"Cliff"},"natural/coastline":{"geometry":["line"],"tags":{"natural":"coastline"},"terms":["shore"],"name":"Coastline"},"natural/fell":{"geometry":["area"],"tags":{"natural":"fell"},"terms":[],"name":"Fell"},"natural/glacier":{"geometry":["area"],"tags":{"natural":"glacier"},"terms":[],"name":"Glacier"},"natural/grassland":{"geometry":["area"],"tags":{"natural":"grassland"},"terms":["prairie","savanna"],"name":"Grassland"},"natural/heath":{"geometry":["area"],"tags":{"natural":"heath"},"terms":[],"name":"Heath"},"natural/peak":{"icon":"mountain","fields":["name","elevation"],"geometry":["point","vertex"],"tags":{"natural":"peak"},"terms":["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],"name":"Peak"},"natural/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"triangle-stroked","fields":["elevation"],"geometry":["point","vertex"],"tags":{"natural":"saddle"},"terms":["pass","mountain pass","top"],"name":"Saddle"},"natural/sand":{"geometry":["area"],"tags":{"natural":"sand"},"terms":["desert"],"name":"Sand"},"natural/scree":{"geometry":["area"],"tags":{"natural":"scree"},"terms":["loose rocks"],"name":"Scree"},"natural/scrub":{"geometry":["area"],"tags":{"natural":"scrub"},"terms":["bush","shrubs"],"name":"Scrub"},"natural/spring":{"icon":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"lake"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","loch","mere"],"name":"Lake"},"natural/water/pond":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"pond"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","millpond","tarn","pool","mere"],"name":"Pond"},"natural/water/reservoir":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"suitcase","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/administrative":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"administrative"},"terms":[],"searchable":false,"name":"Administrative Office"},"office/physician":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant Office"},"office/adoption_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"adoption_agency"},"terms":[],"name":"Adoption Agency"},"office/advertising_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"advertising_agency"},"terms":["ad","ad agency","advert agency","advertising","marketing"],"name":"Advertising Agency"},"office/architect":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect Office"},"office/association":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"association"},"terms":["association","non-profit","nonprofit","organization","society"],"name":"Nonprofit Organization Office"},"office/charity":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"charity"},"terms":["charitable organization"],"name":"Charity Office"},"office/company":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"company"},"terms":[],"name":"Corporate Office"},"office/coworking":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["coworking","office"],"tags":{"office":"coworking"},"reference":{"key":"amenity","value":"coworking_space"},"name":"Coworking Space"},"office/educational_institution":{"icon":"school","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/energy_supplier":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"energy_supplier"},"terms":["electricity","energy company","energy utility","gas utility"],"name":"Energy Supplier Office"},"office/estate_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/forestry":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"forestry"},"terms":["forest","ranger"],"name":"Forestry Office"},"office/foundation":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"foundation"},"terms":[],"name":"Foundation Office"},"office/government":{"icon":"town-hall","fields":["name","government","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"government"},"terms":[],"name":"Government Office"},"office/government/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["clerk","marriage","death","birth","certificate"],"tags":{"office":"government","government":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office"},"office/government/tax":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["fiscal authorities","revenue office","tax office"],"tags":{"office":"government","government":"tax"},"reference":{"key":"government","value":"tax"},"name":"Tax and Revenue Office"},"office/guide":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"guide"},"terms":["dive guide","mountain guide","tour guide"],"name":"Tour Guide Office"},"office/insurance":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"it"},"terms":["computer","information","software","technology"],"name":"Information Technology Office"},"office/lawyer":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"searchable":false,"name":"Notary Office"},"office/moving_company":{"icon":"warehouse","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"moving_company"},"terms":["relocation"],"name":"Moving Company Office"},"office/newspaper":{"icon":"library","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper Office"},"office/ngo":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"office":"ngo"},"terms":["ngo","non government","non-government","organization","organisation"],"name":"NGO Office"},"office/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"notary"},"terms":["clerk","deeds","estate","signature","wills"],"name":"Notary Office"},"office/political_party":{"icon":"town-hall","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/private_investigator":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"private_investigator"},"terms":["PI","private eye","private detective"],"name":"Private Investigator Office"},"office/quango":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"quango"},"terms":["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],"name":"Quasi-NGO Office"},"office/research":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/surveyor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"surveyor"},"terms":[],"name":"Surveyor Office"},"office/tax_advisor":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"tax_advisor"},"terms":["tax","tax consultant"],"name":"Tax Advisor Office"},"office/telecommunication":{"icon":"telephone","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"telecommunication"},"terms":["communication","internet","phone","voice"],"name":"Telecom Office"},"office/therapist":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"office":"therapist"},"terms":["therapy"],"name":"Therapist Office"},"office/water_utility":{"icon":"suitcase","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"tags":{"office":"water_utility"},"terms":["water board","utility"],"name":"Water Utility Office"},"piste":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/islet":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"islet"},"name":"Islet"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/plot":{"icon":"triangle-stroked","fields":["name"],"geometry":["point","area"],"tags":{"place":"plot"},"terms":["tract","land","lot","parcel"],"name":"Plot"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"geometry":["point","area"],"fields":["name"],"tags":{"place":"square"},"name":"Square"},"place/suburb":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Play Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Play Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Spring Rider","terms":["spring rocker","springy rocker"]},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout","terms":["merry-go-round"]},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"zipwire"},"name":"Zip Wire"},"point":{"fields":["name"],"geometry":["point"],"tags":{},"name":"Point","matchScore":0.1},"power/sub_station":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-power","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["hydro","solar","turbine","wind"],"tags":{"power":"generator"},"name":"Power Generator"},"power/generator/source_nuclear":{"icon":"poi-nuclear","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],"geometry":["point","vertex","area"],"terms":["fission","generator","nuclear","nuke","reactor"],"tags":{"power":"generator","generator:source":"nuclear","generator:method":"fission"},"reference":{"key":"generator:source","value":"nuclear"},"name":"Nuclear Reactor"},"power/generator/source_wind":{"icon":"poi-wind","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],"geometry":["point","vertex","area"],"terms":["generator","turbine","windmill","wind"],"tags":{"power":"generator","generator:source":"wind","generator:method":"wind_turbine"},"reference":{"key":"generator:source","value":"wind"},"name":"Wind Turbine"},"power/line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","fields":["name","operator","voltage","ref"],"geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"industry","fields":["name","operator","address","plant/output/electricity","start_date"],"geometry":["area"],"tags":{"power":"plant"},"addTags":{"power":"plant","landuse":"industrial"},"removeTags":{"power":"plant","landuse":"industrial"},"terms":["coal","gas","generat*","hydro","nuclear","power","station"],"name":"Power Station Grounds"},"power/pole":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building","ref"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/switch":{"icon":"poi-power","fields":["switch","operator","location","cables","voltage","ref"],"geometry":["point","vertex","area"],"tags":{"power":"switch"},"name":"Power Switch"},"power/tower":{"fields":["ref"],"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","fields":["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],"geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/linear_platform_aerialway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/linear_platform_train":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/linear_platform_tram":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/linear_platform":{"icon":"highway-footway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["line"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/platform_aerialway":{"icon":"aerialway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","aerialway":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],"name":"Aerialway Stop / Platform"},"public_transport/platform_bus":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","bus":"yes"},"addTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","bus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","platform","public transit","public transportation","transit","transportation"],"name":"Bus Stop / Platform"},"public_transport/platform_ferry":{"icon":"ferry","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","ferry":"yes"},"reference":{"key":"public_transport","value":"platform"},"terms":["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],"name":"Ferry Stop / Platform"},"public_transport/platform_light_rail":{"icon":"poi-light-rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","light_rail":"yes"},"addTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","light_rail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stop / Platform"},"public_transport/platform_monorail":{"icon":"poi-monorail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","monorail":"yes"},"addTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","monorail":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["monorail","platform","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stop / Platform"},"public_transport/platform_subway":{"icon":"poi-subway","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stop / Platform"},"public_transport/platform_train":{"icon":"rail","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","train":"yes"},"addTags":{"public_transport":"platform","train":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","train":"yes","railway":"platform"},"reference":{"key":"railway","value":"platform"},"terms":["platform","public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stop / Platform"},"public_transport/platform_tram":{"icon":"poi-tram","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","tram":"yes"},"addTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"removeTags":{"public_transport":"platform","tram":"yes","railway":"platform"},"reference":{"key":"public_transport","value":"platform"},"terms":["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stop / Platform"},"public_transport/platform_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform","trolleybus":"yes"},"addTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"removeTags":{"public_transport":"platform","trolleybus":"yes","highway":"bus_stop"},"reference":{"key":"public_transport","value":"platform"},"terms":["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stop / Platform"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","surface","lit","bench","shelter"],"geometry":["point","area"],"tags":{"public_transport":"platform"},"terms":["platform","public transit","public transportation","transit","transportation"],"name":"Transit Stop / Platform","matchScore":0.2},"public_transport/station_aerialway":{"icon":"aerialway","fields":["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","aerialway":"yes"},"reference":{"key":"aerialway","value":"station"},"terms":["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],"name":"Aerialway Station"},"public_transport/station_bus":{"icon":"bus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","bus":"yes"},"addTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","bus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","public transit","public transportation","station","terminal","transit","transportation"],"name":"Bus Station / Terminal"},"public_transport/station_ferry":{"icon":"ferry","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","ferry":"yes"},"addTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"removeTags":{"public_transport":"station","ferry":"yes","amenity":"ferry_terminal"},"reference":{"key":"amenity","value":"ferry_terminal"},"terms":["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],"name":"Ferry Station / Terminal"},"public_transport/station_light_rail":{"icon":"poi-light-rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","light_rail":"yes"},"addTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"removeTags":{"public_transport":"station","light_rail":"yes","railway":"station","station":"light_rail"},"reference":{"key":"station","value":"light_rail"},"terms":["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],"name":"Light Rail Station"},"public_transport/station_monorail":{"icon":"poi-monorail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","monorail":"yes"},"addTags":{"public_transport":"station","monorail":"yes","railway":"station"},"removeTags":{"public_transport":"station","monorail":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],"name":"Monorail Station"},"public_transport/station_subway":{"icon":"poi-subway","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","subway":"yes"},"addTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"removeTags":{"public_transport":"station","subway":"yes","railway":"station","station":"subway"},"reference":{"key":"station","value":"subway"},"terms":["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],"name":"Subway Station"},"public_transport/station_train_halt":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes","railway":"halt"},"reference":{"key":"railway","value":"halt"},"terms":["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],"name":"Train Station (Halt / Request)"},"public_transport/station_train":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","train":"yes"},"addTags":{"public_transport":"station","train":"yes","railway":"station"},"removeTags":{"public_transport":"station","train":"yes","railway":"station"},"reference":{"key":"railway","value":"station"},"terms":["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],"name":"Train Station"},"public_transport/station_tram":{"icon":"poi-tram","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","tram":"yes"},"reference":{"key":"public_transport","value":"station"},"terms":["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],"name":"Tram Station"},"public_transport/station_trolleybus":{"icon":"poi-trolleybus","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station","trolleybus":"yes"},"addTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"removeTags":{"public_transport":"station","trolleybus":"yes","amenity":"bus_station"},"reference":{"key":"amenity","value":"bus_station"},"terms":["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Station / Terminal"},"public_transport/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"public_transport":"station"},"terms":["public transit","public transportation","station","terminal","transit","transportation"],"name":"Transit Station","matchScore":0.2},"public_transport/stop_area":{"icon":"bus","fields":["name","ref","network","operator"],"geometry":["relation"],"tags":{"type":"public_transport","public_transport":"stop_area"},"addTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"removeTags":{"type":"public_transport","public_transport":"stop_area","public_transport:version":"2"},"reference":{"key":"public_transport","value":"stop_area"},"name":"Transit Stop Area"},"public_transport/stop_position_aerialway":{"icon":"aerialway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","aerialway":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["aerialway","cable car","public transit","public transportation","transit","transportation"],"name":"Aerialway Stopping Location"},"public_transport/stop_position_bus":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","bus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","public transit","public transportation","transit","transportation"],"name":"Bus Stopping Location"},"public_transport/stop_position_ferry":{"icon":"ferry","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","ferry":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],"name":"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{"icon":"poi-light-rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","light_rail":"yes"},"addTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","light_rail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],"name":"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{"icon":"poi-monorail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","monorail":"yes"},"addTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","monorail":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["monorail","public transit","public transportation","rail","transit","transportation"],"name":"Monorail Stopping Location"},"public_transport/stop_position_subway":{"icon":"poi-subway","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","subway":"yes"},"addTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","subway":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],"name":"Subway Stopping Location"},"public_transport/stop_position_train":{"icon":"rail","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","train":"yes"},"addTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"removeTags":{"public_transport":"stop_position","train":"yes","railway":"stop"},"reference":{"key":"railway","value":"stop"},"terms":["public transit","public transportation","rail","track","train","transit","transportation"],"name":"Train Stopping Location"},"public_transport/stop_position_tram":{"icon":"poi-tram","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","tram":"yes"},"addTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"removeTags":{"public_transport":"stop_position","tram":"yes","railway":"tram_stop"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],"name":"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{"icon":"poi-trolleybus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position","trolleybus":"yes"},"reference":{"key":"public_transport","value":"stop_position"},"terms":["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],"name":"Trolleybus Stopping Location"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"terms":["public transit","public transportation","transit","transportation"],"name":"Transit Stopping Location","matchScore":0.2},"railway/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"terms":["break","interrupt","rest","wait","interruption"],"name":"Train Station (Halt / Request)","searchable":false},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Train Stop / Platform","searchable":false},"railway/station":{"icon":"rail","fields":["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"tags":{"railway":"station"},"terms":["train station","station"],"name":"Train Station","searchable":false},"railway/tram_stop":{"icon":"poi-tram","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stopping Position","searchable":false},"railway/abandoned":{"icon":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"crossing"},"terms":["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],"name":"Railway Crossing (Path)"},"railway/derail":{"icon":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"railway-rail","geometry":["line"],"terms":["venicular","cliff railway","cable car","cable railway","funicular railway"],"fields":["structure","gauge","service_rail"],"tags":{"railway":"funicular"},"name":"Funicular"},"railway/level_crossing":{"icon":"cross","geometry":["vertex"],"tags":{"railway":"level_crossing"},"terms":["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],"name":"Railway Crossing (Road)"},"railway/light_rail":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"light_rail"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","trolley"],"name":"Light Rail"},"railway/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["railway/position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/miniature":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"miniature"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["rideable miniature railway","narrow gauge railway","minimum gauge railway"],"name":"Miniature Railway"},"railway/monorail":{"icon":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-railway-signals","geometry":["point","vertex"],"fields":["railway/position","railway/signal/direction","ref"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"railway/subway_entrance":{"icon":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fishmonger"},"reference":{"key":"shop","value":"seafood"},"name":"Fishmonger","searchable":false},"shop/furnace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["oven","stove"],"tags":{"shop":"furnace"},"name":"Furnace Store","searchable":false},"shop/vacant":{"icon":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/agrarian":{"icon":"shop","fields":["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],"tags":{"shop":"agrarian"},"name":"Agriculture Shop"},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"geometry":["point","area"],"terms":["alcohol","beer","booze","wine"],"tags":{"shop":"alcohol"},"name":"Liquor Store"},"shop/anime":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"anime"},"terms":["manga","japan","cosplay","figurine","dakimakura"],"name":"Anime Shop"},"shop/antiques":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],"tags":{"shop":"appliance"},"name":"Appliance Store"},"shop/art":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery"],"tags":{"shop":"art"},"name":"Art Store"},"shop/baby_goods":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["handbag","purse"],"tags":{"shop":"bag"},"name":"Bag/Luggage Store"},"shop/bakery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["manicure","pedicure"],"tags":{"shop":"beauty","beauty":"nails"},"reference":{"key":"shop","value":"beauty"},"name":"Nail Salon"},"shop/beauty/tanning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beauty","beauty":"tanning"},"reference":{"key":"leisure","value":"tanning_salon"},"name":"Tanning Salon"},"shop/bed":{"icon":"lodging","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"shop":"books"},"name":"Book Store"},"shop/boutique":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto","garage","service"],"tags":{"shop":"car_repair"},"name":"Car Repair Shop"},"shop/car":{"icon":"car","fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["thrift","op shop","nonprofit"],"tags":{"shop":"charity"},"name":"Charity Store"},"shop/cheese":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"craft"},"terms":["art*","paint*","frame"],"name":"Arts and Crafts Store"},"shop/curtain":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["milk","egg","cheese"],"tags":{"shop":"dairy"},"name":"Dairy Store"},"shop/deli":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["lunch","meat","sandwich"],"tags":{"shop":"deli"},"name":"Deli"},"shop/department_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"e-cigarette"},"terms":["electronic","vapor"],"name":"E-Cigarette Shop"},"shop/electronics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],"tags":{"shop":"electronics"},"name":"Electronics Store"},"shop/erotic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["farm shop","farm stand"],"tags":{"shop":"farm"},"name":"Produce Stand"},"shop/fashion":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"frame"},"terms":["art*","paint*","photo*","frame"],"name":"Framing Shop"},"shop/funeral_directors":{"icon":"cemetery","fields":["name","operator","address","building_area","religion","denomination"],"geometry":["point","area"],"terms":["undertaker","memorial home"],"tags":{"shop":"funeral_directors"},"name":"Funeral Home"},"shop/furniture":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["chair","sofa","table"],"tags":{"shop":"furniture"},"name":"Furniture Store"},"shop/garden_centre":{"icon":"garden-center","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["landscape","mulch","shrub","tree"],"tags":{"shop":"garden_centre"},"name":"Garden Center"},"shop/gas":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["cng","lpg","natural gas","propane","refill","tank"],"tags":{"shop":"gas"},"name":"Bottled Gas Shop"},"shop/gift":{"icon":"gift","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["home","household"],"tags":{"shop":"houseware"},"name":"Houseware Store"},"shop/interior_decoration":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"medical_supply"},"name":"Medical Supply Store"},"shop/mobile_phone":{"icon":"mobile-phone","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"mobile_phone"},"name":"Mobile Phone Store"},"shop/money_lender":{"icon":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["CD","vinyl"],"tags":{"shop":"music"},"name":"Music Store"},"shop/musical_instrument":{"icon":"music","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["guitar"],"tags":{"shop":"musical_instrument"},"name":"Musical Instrument Store"},"shop/newsagent":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["camping","climbing","hiking"],"tags":{"shop":"outdoor"},"name":"Outdoors Store"},"shop/paint":{"icon":"water","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pastry"},"terms":["patisserie","cake shop","cakery"],"name":"Pastry Shop"},"shop/pawnbroker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["animal","cat","dog","fish","kitten","puppy","reptile"],"tags":{"shop":"pet"},"name":"Pet Store"},"shop/photo":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["secondhand","second hand","resale","thrift","used"],"tags":{"shop":"second_hand"},"name":"Consignment/Thrift Store"},"shop/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["grocery","store","shop"],"tags":{"shop":"supermarket"},"name":"Supermarket"},"shop/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","payment_multi"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"lodging","fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["climbing hut"],"tags":{"tourism":"alpine_hut"},"name":"Alpine Hut"},"tourism/apartment":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"apartment"},"name":"Guest Apartment / Condo"},"tourism/aquarium":{"icon":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"star","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["tent","rv"],"tags":{"tourism":"camp_site"},"name":"Campground"},"tourism/caravan_site":{"icon":"bus","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper"],"tags":{"tourism":"caravan_site"},"name":"RV Park"},"tourism/chalet":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["holiday","holiday cottage","holiday home","vacation","vacation home"],"tags":{"tourism":"chalet"},"name":"Holiday Cottage"},"tourism/gallery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","paint*","photo*","sculpt*"],"tags":{"tourism":"gallery"},"name":"Art Gallery"},"tourism/guest_house":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"guest_house"},"terms":["B&B","Bed and Breakfast"],"name":"Guest House"},"tourism/hostel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hostel"},"name":"Hostel"},"tourism/hotel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hotel"},"name":"Hotel"},"tourism/information":{"icon":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"information","fields":["name","operator","board_type","direction"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["name","elevation","operator","ref"],"geometry":["point","vertex"],"terms":["signpost"],"tags":{"tourism":"information","information":"guidepost"},"reference":{"key":"information","value":"guidepost"},"name":"Guidepost"},"tourism/information/map":{"icon":"information","fields":["operator","map_type","map_size","direction"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"map"},"reference":{"key":"information","value":"map"},"name":"Map"},"tourism/information/office":{"icon":"information","fields":["name","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information","information":"office"},"reference":{"key":"information","value":"office"},"name":"Tourist Information Office"},"tourism/motel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"motel"},"name":"Motel"},"tourism/museum":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],"tags":{"tourism":"museum"},"name":"Museum"},"tourism/picnic_site":{"icon":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"fields":["direction"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/wilderness_hut":{"icon":"lodging","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["wilderness hut","backcountry hut","bothy"],"tags":{"tourism":"wilderness_hut"},"name":"Wilderness Hut"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","direction_vertex"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","direction_vertex"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["direction_vertex"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"restriction-no-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_left_turn"},"name":"No Left Turn"},"type/restriction/no_right_turn":{"icon":"restriction-no-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_right_turn"},"name":"No Right Turn"},"type/restriction/no_straight_on":{"icon":"restriction-no-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_straight_on"},"name":"No Straight On"},"type/restriction/no_u_turn":{"icon":"restriction-no-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_u_turn"},"name":"No U-turn"},"type/restriction/only_left_turn":{"icon":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/light_rail":{"icon":"route-light-rail","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"light_rail"},"name":"Light Rail Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/piste":{"icon":"route-piste","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"piste"},"name":"Piste/Ski Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/subway":{"icon":"route-subway","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"subway"},"name":"Subway Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"route-water","fields":["name","waterway","ref"],"geometry":["relation"],"tags":{"type":"waterway"},"name":"Waterway"},"vertex":{"fields":["name"],"geometry":["vertex"],"tags":{},"name":"Other","matchScore":0.1},"waterway/boatyard":{"icon":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"harbor","fields":["name","dock","operator"],"geometry":["area","vertex","point"],"terms":["boat","ship","vessel","marine"],"tags":{"waterway":"dock"},"name":"Wet Dock / Dry Dock"},"waterway/drain":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","gas","diesel","boat"],"tags":{"waterway":"fuel"},"name":"Marine Fuel Station"},"waterway/river":{"icon":"waterway-river","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],"tags":{"waterway":"river"},"name":"River"},"waterway/riverbank":{"icon":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["name","operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"waterway":"sanitary_dump_station"},"name":"Marine Toilet Disposal"},"waterway/stream_intermittent":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],"tags":{"waterway":"stream","intermittent":"yes"},"reference":{"key":"waterway","value":"stream"},"name":"Intermittent Stream"},"waterway/stream":{"icon":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],"tags":{"waterway":"stream"},"name":"Stream"},"waterway/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator","payment_multi"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator","payment_multi"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Costco Gas":{"tags":{"name":"Costco Gas","amenity":"fuel"},"name":"Costco Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Costco Gasoline":{"tags":{"name":"Costco Gasoline","amenity":"fuel"},"name":"Costco Gasoline","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","fuel_multi","opening_hours","payment_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","drive_through","opening_hours","payment_multi"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak House":{"tags":{"name":"Steak House","amenity":"restaurant"},"name":"Steak House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address","religion","denomination"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","building","address","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Costco":{"tags":{"name":"Costco","shop":"supermarket"},"name":"Costco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","payment_multi"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"star","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
 
-var defaults = {"area":["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],"line":["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],"point":["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],"vertex":["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],"relation":["category-route","category-restriction","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
+var defaults = {"area":["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],"line":["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],"point":["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],"vertex":["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],"relation":["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
 
-var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"golf","geometry":"area","name":"Golf Features","members":["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{"icon":"landuse","geometry":"area","name":"Land Use Features","members":["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{"icon":"natural","geometry":"area","name":"Natural Features","members":["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{"icon":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"restriction","geometry":"relation","name":"Restriction Features","members":["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction"]},"category-road":{"icon":"category-roads","geometry":"line","name":"Road Features","members":["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{"icon":"route","geometry":"relation","name":"Route Features","members":["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/bus","type/route/train","type/route/tram","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
+var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"golf","geometry":"area","name":"Golf Features","members":["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{"icon":"landuse","geometry":"area","name":"Land Use Features","members":["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{"icon":"natural","geometry":"area","name":"Natural Features","members":["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{"icon":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"restriction","geometry":"relation","name":"Restriction Features","members":["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction"]},"category-road":{"icon":"category-roads","geometry":"line","name":"Road Features","members":["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{"icon":"route","geometry":"relation","name":"Route Features","members":["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
 
-var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","no"]},"access":{"keys":["access","foot","motor_vehicle","bicycle","horse"],"reference":{"key":"access"},"type":"access","label":"Allowed Access","placeholder":"Not Specified","strings":{"types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"address":{"type":"address","keys":["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],"reference":{"key":"addr"},"icon":"address","universal":true,"label":"Address","strings":{"placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}}},"admin_level":{"key":"admin_level","type":"number","label":"Admin Level"},"aerialway":{"key":"aerialway","type":"typeCombo","label":"Type"},"aerialway/access":{"key":"aerialway:access","type":"combo","label":"Access","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aerialway/bubble":{"key":"aerialway:bubble","type":"check","label":"Bubble"},"aerialway/capacity":{"key":"aerialway:capacity","type":"number","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"key":"aerialway:summer:access","type":"combo","label":"Access (summer)","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aeroway":{"key":"aeroway","type":"typeCombo","label":"Type"},"agrarian":{"key":"agrarian","type":"semiCombo","label":"Products"},"amenity":{"key":"amenity","type":"typeCombo","label":"Type"},"animal_boarding":{"key":"animal_boarding","type":"semiCombo","label":"For Animals"},"animal_breeding":{"key":"animal_breeding","type":"semiCombo","label":"For Animals"},"animal_shelter":{"key":"animal_shelter","type":"semiCombo","label":"For Animals"},"area/highway":{"key":"area:highway","type":"typeCombo","label":"Type"},"artist":{"key":"artist_name","type":"text","label":"Artist"},"artwork_type":{"key":"artwork_type","type":"combo","label":"Type"},"atm":{"key":"atm","type":"check","label":"ATM"},"backrest":{"key":"backrest","type":"check","label":"Backrest"},"barrier":{"key":"barrier","type":"typeCombo","label":"Type"},"bath/open_air":{"key":"bath:open_air","label":"Open Air","type":"check"},"bath/sand_bath":{"key":"bath:sand_bath","label":"Sand Bath","type":"check"},"bath/type":{"key":"bath:type","type":"combo","label":"Specialty","strings":{"options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}}},"beauty":{"key":"beauty","type":"combo","label":"Shop Type"},"bench":{"key":"bench","type":"check","label":"Bench"},"bicycle_parking":{"key":"bicycle_parking","type":"combo","label":"Type"},"bin":{"key":"bin","type":"check","label":"Waste Bin"},"blood_components":{"key":"blood:","type":"multiCombo","label":"Blood Components","strings":{"options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}}},"board_type":{"key":"board_type","type":"typeCombo","label":"Type"},"boules":{"key":"boules","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"bridge":{"key":"bridge","type":"typeCombo","label":"Type","placeholder":"Default"},"building_area":{"key":"building","type":"combo","default":"yes","geometry":"area","label":"Building"},"building":{"key":"building","type":"combo","label":"Building"},"bunker_type":{"key":"bunker_type","type":"combo","label":"Type"},"cables":{"key":"cables","type":"number","label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"key":"camera:direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"key":"camera:mount","type":"combo","label":"Camera Mount"},"camera/type":{"key":"camera:type","type":"combo","label":"Camera Type","strings":{"options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}}},"capacity":{"key":"capacity","type":"number","label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}}},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clock_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"clothes":{"key":"clothes","type":"semiCombo","label":"Clothes"},"club":{"key":"club","type":"typeCombo","label":"Type"},"collection_times":{"key":"collection_times","type":"text","label":"Collection Times"},"comment":{"key":"comment","type":"textarea","label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"key":"communication:","type":"multiCombo","label":"Communication Types"},"construction":{"key":"construction","type":"combo","label":"Type"},"contact/webcam":{"key":"contact:webcam","type":"url","icon":"website","label":"Webcam URL","placeholder":"http://example.com/"},"content":{"key":"content","type":"combo","label":"Content"},"country":{"key":"country","type":"combo","label":"Country"},"covered":{"key":"covered","type":"check","label":"Covered"},"craft":{"key":"craft","type":"typeCombo","label":"Type"},"crane/type":{"key":"crane:type","type":"combo","label":"Crane Type","strings":{"options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}}},"crop":{"key":"crop","type":"semiCombo","label":"Crops"},"crossing":{"key":"crossing","type":"combo","label":"Type"},"cuisine":{"key":"cuisine","type":"semiCombo","label":"Cuisines"},"currency_multi":{"key":"currency:","type":"multiCombo","label":"Currency Types"},"cutting":{"key":"cutting","type":"typeCombo","label":"Type","placeholder":"Default"},"cycle_network":{"key":"cycle_network","type":"networkCombo","label":"Network"},"cycleway":{"keys":["cycleway:left","cycleway:right"],"reference":{"key":"cycleway"},"type":"cycleway","label":"Bike Lanes","placeholder":"none","strings":{"types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}}},"date":{"key":"date","type":"check","label":"Date"},"delivery":{"key":"delivery","type":"check","label":"Delivery"},"denomination":{"key":"denomination","type":"combo","label":"Denomination"},"denotation":{"key":"denotation","type":"combo","label":"Denotation"},"description":{"key":"description","type":"textarea","label":"Description","universal":true},"devices":{"key":"devices","type":"number","label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"display":{"key":"display","type":"combo","label":"Display","options":["analog","digital","sundial","unorthodox"]},"dock":{"key":"dock","type":"combo","label":"Type"},"drive_through":{"key":"drive_through","type":"check","label":"Drive-Through"},"duration":{"key":"duration","type":"text","label":"Duration","placeholder":"00:00"},"electrified":{"key":"electrified","type":"combo","label":"Electrification","placeholder":"Contact Line, Electrified Rail...","strings":{"options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}}},"elevation":{"key":"ele","type":"number","icon":"elevation","universal":true,"label":"Elevation"},"email":{"key":"email","type":"email","placeholder":"example@example.com","universal":true,"label":"Email"},"embankment":{"key":"embankment","type":"typeCombo","label":"Type","placeholder":"Default"},"emergency":{"key":"emergency","type":"check","label":"Emergency"},"entrance":{"key":"entrance","type":"typeCombo","label":"Type"},"except":{"key":"except","type":"combo","label":"Exceptions"},"fax":{"key":"fax","type":"tel","label":"Fax","universal":true,"placeholder":"+31 42 123 4567"},"fee":{"key":"fee","type":"check","label":"Fee"},"fence_type":{"key":"fence_type","type":"combo","label":"Type"},"fire_hydrant/position":{"key":"fire_hydrant:position","type":"combo","label":"Position","strings":{"options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}}},"fire_hydrant/type":{"key":"fire_hydrant:type","type":"combo","label":"Type","strings":{"options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}}},"fitness_station":{"key":"fitness_station","type":"typeCombo","label":"Equipment Type"},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"frequency":{"key":"frequency","type":"combo","label":"Operating Frequency"},"fuel_multi":{"key":"fuel:","type":"multiCombo","label":"Fuel Types"},"fuel":{"key":"fuel","type":"combo","label":"Fuel"},"gauge":{"key":"gauge","type":"combo","label":"Gauge"},"gender":{"type":"radio","keys":["male","female","unisex"],"label":"Gender","placeholder":"Unknown","strings":{"options":{"male":"Male","female":"Female","unisex":"Unisex"}}},"generator/method":{"key":"generator:method","type":"combo","label":"Method"},"generator/output/electricity":{"key":"generator:output:electricity","type":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"key":"generator:source","type":"combo","label":"Source"},"generator/type":{"key":"generator:type","type":"combo","label":"Type"},"government":{"key":"government","type":"typeCombo","label":"Type"},"grape_variety":{"key":"grape_variety","type":"semiCombo","label":"Grape Varieties"},"handicap":{"key":"handicap","type":"number","label":"Handicap","placeholder":"1-18"},"handrail":{"key":"handrail","type":"check","label":"Handrail"},"hashtags":{"key":"hashtags","type":"semiCombo","label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"key":"healthcare","type":"typeCombo","label":"Type"},"healthcare/speciality":{"key":"healthcare:speciality","type":"semiCombo","reference":{"key":"healthcare"},"label":"Specialties"},"height":{"key":"height","type":"number","label":"Height (Meters)"},"highway":{"key":"highway","type":"typeCombo","label":"Type"},"historic":{"key":"historic","type":"typeCombo","label":"Type"},"historic/civilization":{"key":"historic:civilization","type":"combo","label":"Historic Civilization"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"key":"iata","type":"text","label":"IATA"},"icao":{"key":"icao","type":"text","label":"ICAO"},"incline_steps":{"key":"incline","type":"combo","label":"Incline","strings":{"options":{"up":"Up","down":"Down"}}},"incline":{"key":"incline","type":"combo","label":"Incline"},"indoor":{"key":"indoor","type":"check","label":"Indoor"},"information":{"key":"information","type":"typeCombo","label":"Type"},"inscription":{"key":"inscription","type":"textarea","label":"Inscription"},"intermittent":{"key":"intermittent","type":"check","label":"Intermittent"},"internet_access":{"key":"internet_access","type":"combo","label":"Internet Access","strings":{"options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}}},"internet_access/fee":{"key":"internet_access:fee","type":"check","label":"Internet Access Fee"},"internet_access/ssid":{"key":"internet_access:ssid","type":"text","label":"SSID (Network Name)"},"kerb":{"key":"kerb","type":"combo","label":"Curb"},"label":{"key":"label","type":"textarea","label":"Label"},"lamp_type":{"key":"lamp_type","type":"combo","label":"Type"},"landuse":{"key":"landuse","type":"typeCombo","label":"Type"},"lanes":{"key":"lanes","type":"number","label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"key":"layer","type":"number","label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}}},"leaf_cycle":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}}},"leaf_type_singular":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}}},"leaf_type":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}}},"leisure":{"key":"leisure","type":"typeCombo","label":"Type"},"length":{"key":"length","type":"number","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"location":{"key":"location","type":"combo","label":"Location"},"man_made":{"key":"man_made","type":"typeCombo","label":"Type"},"manhole":{"key":"manhole","type":"typeCombo","label":"Type"},"map_size":{"key":"map_size","type":"typeCombo","label":"Coverage"},"map_type":{"key":"map_type","type":"typeCombo","label":"Type"},"maxheight":{"key":"maxheight","type":"combo","label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\"","snake_case":false},"maxspeed":{"key":"maxspeed","type":"maxspeed","label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"key":"maxstay","type":"combo","label":"Max Stay","options":["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],"snake_case":false},"maxweight":{"key":"maxweight","type":"combo","label":"Max Weight","snake_case":false},"memorial":{"key":"memorial","type":"typeCombo","label":"Type"},"milestone_position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"mtb/scale":{"key":"mtb:scale","type":"combo","label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{"key":"mtb:scale:imba","type":"combo","label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","strings":{"options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{"key":"mtb:scale:uphill","type":"combo","label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},"name":{"key":"name","type":"localized","label":"Name","universal":true,"placeholder":"Common name (if any)"},"natural":{"key":"natural","type":"typeCombo","label":"Natural"},"network_bicycle":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}}},"network_foot":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}}},"network_horse":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}}},"network_road":{"key":"network","type":"networkCombo","label":"Network"},"network":{"key":"network","type":"text","label":"Network"},"note":{"key":"note","type":"textarea","universal":true,"icon":"note","label":"Note"},"office":{"key":"office","type":"typeCombo","label":"Type"},"oneway_yes":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}}},"opening_hours":{"key":"opening_hours","type":"combo","label":"Hours","snake_case":false},"operator":{"key":"operator","type":"text","label":"Operator"},"outdoor_seating":{"key":"outdoor_seating","type":"check","label":"Outdoor Seating"},"par":{"key":"par","type":"number","label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward"}}},"park_ride":{"key":"park_ride","type":"check","label":"Park and Ride"},"parking":{"key":"parking","type":"combo","label":"Type","strings":{"options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}}},"payment_multi":{"key":"payment:","type":"multiCombo","label":"Payment Types"},"phases":{"key":"phases","type":"number","label":"Phases","placeholder":"1, 2, 3..."},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"key":"piste:difficulty","type":"combo","label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","strings":{"options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}}},"piste/grooming":{"key":"piste:grooming","type":"combo","label":"Grooming","strings":{"options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}}},"piste/type":{"key":"piste:type","type":"typeCombo","label":"Type","strings":{"options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}}},"place":{"key":"place","type":"typeCombo","label":"Type"},"plant":{"key":"plant","type":"combo","label":"Plant"},"plant/output/electricity":{"key":"plant:output:electricity","type":"text","label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"key":"baby","type":"check","label":"Baby Seat"},"playground/max_age":{"key":"max_age","type":"number","label":"Maximum Age"},"playground/min_age":{"key":"min_age","type":"number","label":"Minimum Age"},"population":{"key":"population","type":"text","label":"Population"},"power_supply":{"key":"power_supply","type":"check","label":"Power Supply"},"power":{"key":"power","type":"typeCombo","label":"Type"},"produce":{"key":"produce","type":"semiCombo","label":"Produce"},"product":{"key":"product","type":"semiCombo","label":"Products"},"railway":{"key":"railway","type":"typeCombo","label":"Type"},"rating":{"key":"rating","type":"combo","label":"Power Rating","snake_case":false},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"recycling_type":{"key":"recycling_type","default":"container","type":"combo","label":"Recycling Type","strings":{"options":{"container":"Container","centre":"Recycling Center"}}},"ref_aeroway_gate":{"key":"ref","type":"text","label":"Gate Number"},"ref_golf_hole":{"key":"ref","type":"text","label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"key":"ref","type":"text","label":"Junction Number"},"ref_platform":{"key":"ref","type":"text","label":"Platform Number"},"ref_road_number":{"key":"ref","type":"text","label":"Road Number"},"ref_route":{"key":"ref","type":"text","label":"Route Number"},"ref_runway":{"key":"ref","type":"text","label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"key":"ref","type":"text","label":"Stop Number"},"ref_taxiway":{"key":"ref","type":"text","label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"key":"ref","type":"text","label":"Reference Code"},"relation":{"key":"type","type":"combo","label":"Type"},"religion":{"key":"religion","type":"combo","label":"Religion"},"restriction":{"key":"restriction","type":"combo","label":"Type"},"restrictions":{"type":"restrictions","geometry":"vertex","icon":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","label":"Rooms"},"route_master":{"key":"route_master","type":"combo","label":"Type"},"route":{"key":"route","type":"combo","label":"Type"},"sac_scale":{"key":"sac_scale","type":"combo","label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","strings":{"options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}}},"sanitary_dump_station":{"key":"sanitary_dump_station","type":"check","label":"Toilet Disposal"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"second_hand":{"key":"second_hand","type":"combo","label":"Sells Used","placeholder":"Yes, No, Only","strings":{"options":{"yes":"Yes","no":"No","only":"Only"}}},"service_rail":{"key":"service","type":"combo","label":"Service Type","strings":{"options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}}},"service_times":{"key":"service_times","type":"text","label":"Service Times"},"service":{"key":"service","type":"combo","label":"Type","options":["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{"key":"service:bicycle:","type":"multiCombo","label":"Services"},"service/vehicle":{"key":"service:vehicle:","type":"multiCombo","label":"Services"},"shelter_type":{"key":"shelter_type","type":"combo","label":"Type"},"shelter":{"key":"shelter","type":"check","label":"Shelter"},"shop":{"key":"shop","type":"typeCombo","label":"Type"},"site":{"key":"site","type":"combo","label":"Type"},"smoking":{"key":"smoking","type":"combo","label":"Smoking","placeholder":"No, Separated, Yes...","strings":{"options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}}},"smoothness":{"key":"smoothness","type":"combo","label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","strings":{"options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}}},"social_facility_for":{"key":"social_facility:for","type":"combo","label":"People Served"},"social_facility":{"key":"social_facility","type":"combo","label":"Type"},"source":{"key":"source","type":"semiCombo","icon":"source","universal":true,"label":"Sources","snake_case":false,"options":["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},"sport_ice":{"key":"sport","type":"semiCombo","label":"Sports","options":["skating","hockey","multi","curling","ice_stock"]},"sport_racing_motor":{"key":"sport","type":"semiCombo","label":"Sports","options":["motor","karting","motocross"]},"sport_racing_nonmotor":{"key":"sport","type":"semiCombo","label":"Sports","options":["bmx","cycling","dog_racing","horse_racing","running"]},"sport":{"key":"sport","type":"semiCombo","label":"Sports"},"stars":{"key":"stars","type":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","label":"Number of Steps"},"stop":{"key":"stop","type":"combo","label":"Stop Type","strings":{"options":{"all":"All Ways","minor":"Minor Road"}}},"structure_waterway":{"type":"structureRadio","keys":["tunnel"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"tunnel":"Tunnel"}}},"structure":{"type":"structureRadio","keys":["bridge","tunnel","embankment","cutting","ford"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}}},"studio":{"key":"studio","type":"combo","label":"Type"},"substance":{"key":"substance","type":"combo","label":"Substance"},"substation":{"key":"substation","type":"typeCombo","label":"Type"},"supervised":{"key":"supervised","type":"check","label":"Supervised"},"support":{"key":"support","type":"combo","label":"Support"},"surface":{"key":"surface","type":"combo","label":"Surface"},"surveillance":{"key":"surveillance","type":"combo","label":"Surveillance Kind"},"surveillance/type":{"key":"surveillance:type","type":"combo","label":"Surveillance Type","strings":{"options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}}},"surveillance/zone":{"key":"surveillance:zone","type":"combo","label":"Surveillance Zone"},"switch":{"key":"switch","type":"combo","label":"Type","strings":{"options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}}},"tactile_paving":{"key":"tactile_paving","type":"check","label":"Tactile Paving"},"takeaway":{"key":"takeaway","type":"combo","label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","strings":{"options":{"yes":"Yes","no":"No","only":"Takeaway Only"}}},"toilets/disposal":{"key":"toilets:disposal","type":"combo","label":"Disposal","strings":{"options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}}},"toll":{"key":"toll","type":"check","label":"Toll"},"tomb":{"key":"tomb","type":"typeCombo","label":"Type"},"tourism_attraction":{"key":"tourism","default":"attraction","type":"typeCombo","universal":true,"label":"Tourism"},"tourism":{"key":"tourism","type":"typeCombo","label":"Type"},"tower/construction":{"key":"tower:construction","type":"combo","label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"key":"tower:type","type":"combo","label":"Type"},"tracktype":{"key":"tracktype","type":"combo","label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","strings":{"options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}}},"trade":{"key":"trade","type":"typeCombo","label":"Type"},"traffic_calming":{"key":"traffic_calming","type":"typeCombo","label":"Type"},"traffic_signals":{"key":"traffic_signals","type":"combo","label":"Type","default":"signal"},"trail_visibility":{"key":"trail_visibility","type":"combo","label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","strings":{"options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}}},"transformer":{"key":"transformer","type":"combo","label":"Type","strings":{"options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}}},"trees":{"key":"trees","type":"semiCombo","label":"Trees"},"tunnel":{"key":"tunnel","type":"typeCombo","label":"Type","placeholder":"Default"},"vending":{"key":"vending","type":"combo","label":"Type of Goods"},"visibility":{"key":"visibility","type":"combo","label":"Visibility","strings":{"options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}}},"volcano/status":{"key":"volcano:status","type":"combo","label":"Volcano Status","strings":{"options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}}},"volcano/type":{"key":"volcano:type","type":"combo","label":"Volcano Type","strings":{"options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}}},"voltage":{"key":"voltage","type":"combo","label":"Voltage"},"voltage/primary":{"key":"voltage:primary","type":"combo","label":"Primary Voltage"},"voltage/secondary":{"key":"voltage:secondary","type":"combo","label":"Secondary Voltage"},"voltage/tertiary":{"key":"voltage:tertiary","type":"combo","label":"Tertiary Voltage"},"wall":{"key":"wall","type":"combo","label":"Type"},"water_point":{"key":"water_point","type":"check","label":"Water Point"},"water":{"key":"water","type":"combo","label":"Type"},"waterway":{"key":"waterway","type":"typeCombo","label":"Type"},"website":{"key":"website","type":"url","icon":"website","placeholder":"http://example.com/","universal":true,"label":"Website"},"wetland":{"key":"wetland","type":"combo","label":"Type"},"wheelchair":{"key":"wheelchair","type":"radio","options":["yes","limited","no"],"icon":"wheelchair","universal":true,"label":"Wheelchair Access"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"},"windings":{"key":"windings","type":"number","label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"key":"windings:configuration","type":"combo","label":"Windings Configuration","strings":{"options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}}};
+var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","no"]},"access":{"keys":["access","foot","motor_vehicle","bicycle","horse"],"reference":{"key":"access"},"type":"access","label":"Allowed Access","placeholder":"Not Specified","strings":{"types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"address":{"type":"address","keys":["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],"reference":{"key":"addr"},"icon":"address","universal":true,"label":"Address","strings":{"placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}}},"admin_level":{"key":"admin_level","type":"number","label":"Admin Level"},"aerialway":{"key":"aerialway","type":"typeCombo","label":"Type"},"aerialway/access":{"key":"aerialway:access","type":"combo","label":"Access","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aerialway/bubble":{"key":"aerialway:bubble","type":"check","label":"Bubble"},"aerialway/capacity":{"key":"aerialway:capacity","type":"number","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"key":"aerialway:summer:access","type":"combo","label":"Access (summer)","strings":{"options":{"entry":"Entry","exit":"Exit","both":"Both"}}},"aeroway":{"key":"aeroway","type":"typeCombo","label":"Type"},"agrarian":{"key":"agrarian","type":"semiCombo","label":"Products"},"amenity":{"key":"amenity","type":"typeCombo","label":"Type"},"animal_boarding":{"key":"animal_boarding","type":"semiCombo","label":"For Animals"},"animal_breeding":{"key":"animal_breeding","type":"semiCombo","label":"For Animals"},"animal_shelter":{"key":"animal_shelter","type":"semiCombo","label":"For Animals"},"area/highway":{"key":"area:highway","type":"typeCombo","label":"Type"},"artist":{"key":"artist_name","type":"text","label":"Artist"},"artwork_type":{"key":"artwork_type","type":"combo","label":"Type"},"atm":{"key":"atm","type":"check","label":"ATM"},"backrest":{"key":"backrest","type":"check","label":"Backrest"},"barrier":{"key":"barrier","type":"typeCombo","label":"Type"},"bath/open_air":{"key":"bath:open_air","label":"Open Air","type":"check"},"bath/sand_bath":{"key":"bath:sand_bath","label":"Sand Bath","type":"check"},"bath/type":{"key":"bath:type","type":"combo","label":"Specialty","strings":{"options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}}},"beauty":{"key":"beauty","type":"combo","label":"Shop Type"},"bench":{"key":"bench","type":"check","label":"Bench"},"bicycle_parking":{"key":"bicycle_parking","type":"combo","label":"Type"},"bin":{"key":"bin","type":"check","label":"Waste Bin"},"blood_components":{"key":"blood:","type":"multiCombo","label":"Blood Components","strings":{"options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}}},"board_type":{"key":"board_type","type":"typeCombo","label":"Type"},"boules":{"key":"boules","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"brewery":{"key":"brewery","type":"semiCombo","label":"Draft Beers"},"bridge":{"key":"bridge","type":"typeCombo","label":"Type","placeholder":"Default"},"building_area":{"key":"building","type":"combo","default":"yes","geometry":"area","label":"Building"},"building":{"key":"building","type":"combo","label":"Building"},"bunker_type":{"key":"bunker_type","type":"combo","label":"Type"},"cables":{"key":"cables","type":"number","label":"Cables","placeholder":"1, 2, 3..."},"camera/direction":{"key":"camera:direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"key":"camera:mount","type":"combo","label":"Camera Mount"},"camera/type":{"key":"camera:type","type":"combo","label":"Camera Type","strings":{"options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}}},"capacity":{"key":"capacity","type":"number","label":"Capacity","placeholder":"50, 100, 200..."},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clothes":{"key":"clothes","type":"semiCombo","label":"Clothes"},"club":{"key":"club","type":"typeCombo","label":"Type"},"collection_times":{"key":"collection_times","type":"text","label":"Collection Times"},"comment":{"key":"comment","type":"textarea","label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"key":"communication:","type":"multiCombo","label":"Communication Types"},"construction":{"key":"construction","type":"combo","label":"Type"},"contact/webcam":{"key":"contact:webcam","type":"url","icon":"website","label":"Webcam URL","placeholder":"http://example.com/"},"content":{"key":"content","type":"combo","label":"Content"},"country":{"key":"country","type":"combo","label":"Country"},"covered":{"key":"covered","type":"check","label":"Covered"},"craft":{"key":"craft","type":"typeCombo","label":"Type"},"crane/type":{"key":"crane:type","type":"combo","label":"Crane Type","strings":{"options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}}},"crop":{"key":"crop","type":"semiCombo","label":"Crops"},"crossing":{"key":"crossing","type":"combo","label":"Type"},"cuisine":{"key":"cuisine","type":"semiCombo","label":"Cuisines"},"currency_multi":{"key":"currency:","type":"multiCombo","label":"Currency Types"},"cutting":{"key":"cutting","type":"typeCombo","label":"Type","placeholder":"Default"},"cycle_network":{"key":"cycle_network","type":"networkCombo","label":"Network"},"cycleway":{"keys":["cycleway:left","cycleway:right"],"reference":{"key":"cycleway"},"type":"cycleway","label":"Bike Lanes","placeholder":"none","strings":{"types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}}},"date":{"key":"date","type":"check","label":"Date"},"delivery":{"key":"delivery","type":"check","label":"Delivery"},"denomination":{"key":"denomination","type":"combo","label":"Denomination"},"denotation":{"key":"denotation","type":"combo","label":"Denotation"},"description":{"key":"description","type":"textarea","label":"Description","universal":true},"devices":{"key":"devices","type":"number","label":"Devices","placeholder":"1, 2, 3..."},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"direction_cardinal":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}}},"direction_clock":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"direction_vertex":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"direction":{"key":"direction","type":"number","label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"display":{"key":"display","type":"combo","label":"Display","options":["analog","digital","sundial","unorthodox"]},"dock":{"key":"dock","type":"combo","label":"Type"},"drive_through":{"key":"drive_through","type":"check","label":"Drive-Through"},"duration":{"key":"duration","type":"text","label":"Duration","placeholder":"00:00"},"electrified":{"key":"electrified","type":"combo","label":"Electrification","placeholder":"Contact Line, Electrified Rail...","strings":{"options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}}},"elevation":{"key":"ele","type":"number","icon":"elevation","universal":true,"label":"Elevation"},"email":{"key":"email","type":"email","placeholder":"example@example.com","universal":true,"label":"Email"},"embankment":{"key":"embankment","type":"typeCombo","label":"Type","placeholder":"Default"},"emergency":{"key":"emergency","type":"check","label":"Emergency"},"entrance":{"key":"entrance","type":"typeCombo","label":"Type"},"except":{"key":"except","type":"combo","label":"Exceptions"},"fax":{"key":"fax","type":"tel","label":"Fax","universal":true,"placeholder":"+31 42 123 4567"},"fee":{"key":"fee","type":"check","label":"Fee"},"fence_type":{"key":"fence_type","type":"combo","label":"Type"},"fire_hydrant/position":{"key":"fire_hydrant:position","type":"combo","label":"Position","strings":{"options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}}},"fire_hydrant/type":{"key":"fire_hydrant:type","type":"combo","label":"Type","strings":{"options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}}},"fitness_station":{"key":"fitness_station","type":"typeCombo","label":"Equipment Type"},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"frequency":{"key":"frequency","type":"combo","label":"Operating Frequency"},"fuel_multi":{"key":"fuel:","type":"multiCombo","label":"Fuel Types"},"fuel":{"key":"fuel","type":"combo","label":"Fuel"},"gauge":{"key":"gauge","type":"combo","label":"Gauge"},"gender":{"type":"radio","keys":["male","female","unisex"],"label":"Gender","placeholder":"Unknown","strings":{"options":{"male":"Male","female":"Female","unisex":"Unisex"}}},"generator/method":{"key":"generator:method","type":"combo","label":"Method"},"generator/output/electricity":{"key":"generator:output:electricity","type":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"key":"generator:source","type":"combo","label":"Source"},"generator/type":{"key":"generator:type","type":"combo","label":"Type"},"government":{"key":"government","type":"typeCombo","label":"Type"},"grape_variety":{"key":"grape_variety","type":"semiCombo","label":"Grape Varieties"},"handicap":{"key":"handicap","type":"number","label":"Handicap","placeholder":"1-18"},"handrail":{"key":"handrail","type":"check","label":"Handrail"},"hashtags":{"key":"hashtags","type":"semiCombo","label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"key":"healthcare","type":"typeCombo","label":"Type"},"healthcare/speciality":{"key":"healthcare:speciality","type":"semiCombo","reference":{"key":"healthcare"},"label":"Specialties"},"height":{"key":"height","type":"number","label":"Height (Meters)"},"highway":{"key":"highway","type":"typeCombo","label":"Type"},"historic":{"key":"historic","type":"typeCombo","label":"Type"},"historic/civilization":{"key":"historic:civilization","type":"combo","label":"Historic Civilization"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"key":"iata","type":"text","label":"IATA"},"icao":{"key":"icao","type":"text","label":"ICAO"},"incline_steps":{"key":"incline","type":"combo","label":"Incline","strings":{"options":{"up":"Up","down":"Down"}}},"incline":{"key":"incline","type":"combo","label":"Incline"},"indoor":{"key":"indoor","type":"check","label":"Indoor"},"information":{"key":"information","type":"typeCombo","label":"Type"},"inscription":{"key":"inscription","type":"textarea","label":"Inscription"},"intermittent":{"key":"intermittent","type":"check","label":"Intermittent"},"internet_access":{"key":"internet_access","type":"combo","label":"Internet Access","strings":{"options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}}},"internet_access/fee":{"key":"internet_access:fee","type":"check","label":"Internet Access Fee"},"internet_access/ssid":{"key":"internet_access:ssid","type":"text","label":"SSID (Network Name)"},"kerb":{"key":"kerb","type":"combo","label":"Curb"},"label":{"key":"label","type":"textarea","label":"Label"},"lamp_type":{"key":"lamp_type","type":"combo","label":"Type"},"landuse":{"key":"landuse","type":"typeCombo","label":"Type"},"lanes":{"key":"lanes","type":"number","label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"key":"layer","type":"number","label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}}},"leaf_cycle":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}}},"leaf_type_singular":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}}},"leaf_type":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}}},"leisure":{"key":"leisure","type":"typeCombo","label":"Type"},"length":{"key":"length","type":"number","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"location":{"key":"location","type":"combo","label":"Location"},"man_made":{"key":"man_made","type":"typeCombo","label":"Type"},"manhole":{"key":"manhole","type":"typeCombo","label":"Type"},"map_size":{"key":"map_size","type":"typeCombo","label":"Coverage"},"map_type":{"key":"map_type","type":"typeCombo","label":"Type"},"maxheight":{"key":"maxheight","type":"combo","label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\"","snake_case":false},"maxspeed":{"key":"maxspeed","type":"maxspeed","label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"key":"maxstay","type":"combo","label":"Max Stay","options":["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],"snake_case":false},"maxweight":{"key":"maxweight","type":"combo","label":"Max Weight","snake_case":false},"memorial":{"key":"memorial","type":"typeCombo","label":"Type"},"monitoring_multi":{"key":"monitoring:","type":"multiCombo","label":"Monitoring"},"mtb/scale":{"key":"mtb:scale","type":"combo","label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{"key":"mtb:scale:imba","type":"combo","label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","strings":{"options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{"key":"mtb:scale:uphill","type":"combo","label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","strings":{"options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},"name":{"key":"name","type":"localized","label":"Name","universal":true,"placeholder":"Common name (if any)"},"natural":{"key":"natural","type":"typeCombo","label":"Natural"},"network_bicycle":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}}},"network_foot":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}}},"network_horse":{"key":"network","type":"combo","label":"Network Type","placeholder":"Local, Regional, National, International","strings":{"options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}}},"network_road":{"key":"network","type":"networkCombo","label":"Network"},"network":{"key":"network","type":"text","label":"Network"},"note":{"key":"note","type":"textarea","universal":true,"icon":"note","label":"Note"},"office":{"key":"office","type":"typeCombo","label":"Type"},"oneway_yes":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No","reversible":"Reversible","alternating":"Alternating"}}},"opening_hours":{"key":"opening_hours","type":"combo","label":"Hours","snake_case":false},"operator":{"key":"operator","type":"text","label":"Operator"},"outdoor_seating":{"key":"outdoor_seating","type":"check","label":"Outdoor Seating"},"par":{"key":"par","type":"number","label":"Par","placeholder":"3, 4, 5..."},"park_ride":{"key":"park_ride","type":"check","label":"Park and Ride"},"parking":{"key":"parking","type":"combo","label":"Type","strings":{"options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}}},"payment_multi":{"key":"payment:","type":"multiCombo","label":"Payment Types","universal":true},"phases":{"key":"phases","type":"number","label":"Phases","placeholder":"1, 2, 3..."},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"key":"piste:difficulty","type":"combo","label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","strings":{"options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}}},"piste/grooming":{"key":"piste:grooming","type":"combo","label":"Grooming","strings":{"options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}}},"piste/type":{"key":"piste:type","type":"typeCombo","label":"Type","strings":{"options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}}},"place":{"key":"place","type":"typeCombo","label":"Type"},"plant":{"key":"plant","type":"combo","label":"Plant"},"plant/output/electricity":{"key":"plant:output:electricity","type":"text","label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"key":"baby","type":"check","label":"Baby Seat"},"playground/max_age":{"key":"max_age","type":"number","label":"Maximum Age"},"playground/min_age":{"key":"min_age","type":"number","label":"Minimum Age"},"population":{"key":"population","type":"text","label":"Population"},"power_supply":{"key":"power_supply","type":"check","label":"Power Supply"},"power":{"key":"power","type":"typeCombo","label":"Type"},"produce":{"key":"produce","type":"semiCombo","label":"Produce"},"product":{"key":"product","type":"semiCombo","label":"Products"},"railway":{"key":"railway","type":"typeCombo","label":"Type"},"railway/position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"railway/signal/direction":{"key":"railway:signal:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"rating":{"key":"rating","type":"combo","label":"Power Rating","snake_case":false},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"ref_aeroway_gate":{"key":"ref","type":"text","label":"Gate Number"},"ref_golf_hole":{"key":"ref","type":"text","label":"Hole Number","placeholder":"1-18"},"ref_highway_junction":{"key":"ref","type":"text","label":"Junction Number"},"ref_platform":{"key":"ref","type":"text","label":"Platform Number"},"ref_road_number":{"key":"ref","type":"text","label":"Road Number"},"ref_route":{"key":"ref","type":"text","label":"Route Number"},"ref_runway":{"key":"ref","type":"text","label":"Runway Number","placeholder":"e.g. 01L/19R"},"ref_stop_position":{"key":"ref","type":"text","label":"Stop Number"},"ref_taxiway":{"key":"ref","type":"text","label":"Taxiway Name","placeholder":"e.g. A5"},"ref":{"key":"ref","type":"text","label":"Reference Code"},"ref/isil":{"key":"ref:isil","type":"text","label":"ISIL Code"},"relation":{"key":"type","type":"combo","label":"Type"},"religion":{"key":"religion","type":"combo","label":"Religion"},"restriction":{"key":"restriction","type":"combo","label":"Type"},"restrictions":{"type":"restrictions","geometry":"vertex","icon":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","label":"Rooms"},"route_master":{"key":"route_master","type":"combo","label":"Type"},"route":{"key":"route","type":"combo","label":"Type"},"sac_scale":{"key":"sac_scale","type":"combo","label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","strings":{"options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}}},"sanitary_dump_station":{"key":"sanitary_dump_station","type":"check","label":"Toilet Disposal"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"second_hand":{"key":"second_hand","type":"combo","label":"Sells Used","placeholder":"Yes, No, Only","strings":{"options":{"yes":"Yes","no":"No","only":"Only"}}},"service_rail":{"key":"service","type":"combo","label":"Service Type","strings":{"options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}}},"service_times":{"key":"service_times","type":"text","label":"Service Times"},"service":{"key":"service","type":"combo","label":"Type","options":["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{"key":"service:bicycle:","type":"multiCombo","label":"Services"},"service/vehicle":{"key":"service:vehicle:","type":"multiCombo","label":"Services"},"shelter_type":{"key":"shelter_type","type":"combo","label":"Type"},"shelter":{"key":"shelter","type":"check","label":"Shelter"},"shop":{"key":"shop","type":"typeCombo","label":"Type"},"site":{"key":"site","type":"combo","label":"Type"},"smoking":{"key":"smoking","type":"combo","label":"Smoking","placeholder":"No, Separated, Yes...","strings":{"options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}}},"smoothness":{"key":"smoothness","type":"combo","label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","strings":{"options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}}},"social_facility_for":{"key":"social_facility:for","type":"combo","label":"People Served"},"social_facility":{"key":"social_facility","type":"combo","label":"Type"},"source":{"key":"source","type":"semiCombo","icon":"source","universal":true,"label":"Sources","snake_case":false,"caseSensitive":true,"options":["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},"sport_ice":{"key":"sport","type":"semiCombo","label":"Sports","options":["skating","hockey","multi","curling","ice_stock"]},"sport_racing_motor":{"key":"sport","type":"semiCombo","label":"Sports","options":["motor","karting","motocross"]},"sport_racing_nonmotor":{"key":"sport","type":"semiCombo","label":"Sports","options":["bmx","cycling","dog_racing","horse_racing","running"]},"sport":{"key":"sport","type":"semiCombo","label":"Sports"},"stars":{"key":"stars","type":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","label":"Number of Steps"},"stop":{"key":"stop","type":"combo","label":"Stop Type","strings":{"options":{"all":"All Ways","minor":"Minor Road"}}},"structure_waterway":{"type":"structureRadio","keys":["tunnel"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"tunnel":"Tunnel"}}},"structure":{"type":"structureRadio","keys":["bridge","tunnel","embankment","cutting","ford"],"label":"Structure","placeholder":"Unknown","strings":{"options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}}},"studio":{"key":"studio","type":"combo","label":"Type"},"substance":{"key":"substance","type":"combo","label":"Substance"},"substation":{"key":"substation","type":"typeCombo","label":"Type"},"supervised":{"key":"supervised","type":"check","label":"Supervised"},"support":{"key":"support","type":"combo","label":"Support"},"surface":{"key":"surface","type":"combo","label":"Surface"},"surveillance":{"key":"surveillance","type":"combo","label":"Surveillance Kind"},"surveillance/type":{"key":"surveillance:type","type":"combo","label":"Surveillance Type","strings":{"options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}}},"surveillance/zone":{"key":"surveillance:zone","type":"combo","label":"Surveillance Zone"},"switch":{"key":"switch","type":"combo","label":"Type","strings":{"options":{"mechanical":"Mechanical","circuit_breaker":"Circuit Breaker","disconnector":"Disconnector","earthing":"Earthing"}}},"tactile_paving":{"key":"tactile_paving","type":"check","label":"Tactile Paving"},"takeaway":{"key":"takeaway","type":"combo","label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","strings":{"options":{"yes":"Yes","no":"No","only":"Takeaway Only"}}},"toilets/disposal":{"key":"toilets:disposal","type":"combo","label":"Disposal","strings":{"options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}}},"toll":{"key":"toll","type":"check","label":"Toll"},"tomb":{"key":"tomb","type":"typeCombo","label":"Type"},"tourism_attraction":{"key":"tourism","default":"attraction","type":"typeCombo","universal":true,"label":"Tourism"},"tourism":{"key":"tourism","type":"typeCombo","label":"Type"},"tower/construction":{"key":"tower:construction","type":"combo","label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"key":"tower:type","type":"combo","label":"Type"},"tracktype":{"key":"tracktype","type":"combo","label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","strings":{"options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}}},"trade":{"key":"trade","type":"typeCombo","label":"Type"},"traffic_calming":{"key":"traffic_calming","type":"typeCombo","label":"Type"},"traffic_signals":{"key":"traffic_signals","type":"combo","label":"Type","default":"signal"},"traffic_signals/direction":{"key":"traffic_signals:direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward","both":"Both / All"}}},"trail_visibility":{"key":"trail_visibility","type":"combo","label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","strings":{"options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}}},"transformer":{"key":"transformer","type":"combo","label":"Type","strings":{"options":{"distribution":"Distribution","generator":"Generator","converter":"Converter","traction":"Traction","auto":"Autotransformer","phase_angle_regulator":"Phase Angle Regulator","auxiliary":"Auxiliary","yes":"Unknown"}}},"trees":{"key":"trees","type":"semiCombo","label":"Trees"},"tunnel":{"key":"tunnel","type":"typeCombo","label":"Type","placeholder":"Default"},"vending":{"key":"vending","type":"combo","label":"Type of Goods"},"visibility":{"key":"visibility","type":"combo","label":"Visibility","strings":{"options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}}},"volcano/status":{"key":"volcano:status","type":"combo","label":"Volcano Status","strings":{"options":{"active":"Active","dormant":"Dormant","extinct":"Extinct"}}},"volcano/type":{"key":"volcano:type","type":"combo","label":"Volcano Type","strings":{"options":{"stratovolcano":"Stratovolcano","shield":"Shield","scoria":"Scoria"}}},"voltage":{"key":"voltage","type":"combo","label":"Voltage"},"voltage/primary":{"key":"voltage:primary","type":"combo","label":"Primary Voltage"},"voltage/secondary":{"key":"voltage:secondary","type":"combo","label":"Secondary Voltage"},"voltage/tertiary":{"key":"voltage:tertiary","type":"combo","label":"Tertiary Voltage"},"wall":{"key":"wall","type":"combo","label":"Type"},"water_point":{"key":"water_point","type":"check","label":"Water Point"},"water":{"key":"water","type":"combo","label":"Type"},"waterway":{"key":"waterway","type":"typeCombo","label":"Type"},"website":{"key":"website","type":"url","icon":"website","placeholder":"http://example.com/","universal":true,"label":"Website"},"wetland":{"key":"wetland","type":"combo","label":"Type"},"wheelchair":{"key":"wheelchair","type":"radio","options":["yes","limited","no"],"icon":"wheelchair","universal":true,"label":"Wheelchair Access"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"},"windings":{"key":"windings","type":"number","label":"Windings","placeholder":"1, 2, 3..."},"windings/configuration":{"key":"windings:configuration","type":"combo","label":"Windings Configuration","strings":{"options":{"star":"Star / Wye","delta":"Delta","open-delta":"Open Delta","zigzag":"Zig Zag","open":"Open","scott":"Scott","leblanc":"Leblanc"}}}};
 
 var all = ["aerialway","airfield","airport","alcohol-shop","america-football","amusement-park","aquarium","art-gallery","attraction","bakery","bank","bar","barrier","baseball","basketball","bbq","beer","bicycle","bicycle-share","blood-bank","buddhism","building","building-alt1","bus","cafe","campsite","car","castle","cemetery","cinema","circle","circle-stroked","city","clothing-store","college","commercial","cricket","cross","dam","danger","defibrillator","dentist","doctor","dog-park","drinking-water","embassy","emergency-phone","entrance","entrance-alt1","farm","fast-food","fence","ferry","fire-station","florist","fuel","gaming","garden","garden-center","gift","golf","grocery","hairdresser","harbor","heart","heliport","home","horse-riding","hospital","ice-cream","industry","information","karaoke","landmark","landuse","laundry","library","lighthouse","lodging","logging","marker","marker-stroked","mobile-phone","monument","mountain","museum","music","natural","park","park-alt1","parking","parking-garage","pharmacy","picnic-site","pitch","place-of-worship","playground","police","post","prison","rail","rail-light","rail-metro","ranger-station","recycling","religious-christian","religious-jewish","religious-muslim","residential-community","restaurant","roadblock","rocket","school","scooter","shelter","shop","skiing","slaughterhouse","snowmobile","soccer","square","square-stroked","stadium","star","star-stroked","suitcase","sushi","swimming","teahouse","telephone","tennis","theatre","toilet","town","town-hall","triangle","triangle-stroked","veterinary","village","volcano","warehouse","waste-basket","water","wetland","wheelchair","zoo"];
 var all$1 = {
@@ -23437,6 +23911,204 @@ osmEntity.prototype = {
     }
 };
 
+function geoExtent(min, max) {
+    if (!(this instanceof geoExtent)) return new geoExtent(min, max);
+    if (min instanceof geoExtent) {
+        return min;
+    } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
+        this[0] = min[0];
+        this[1] = min[1];
+    } else {
+        this[0] = min        || [ Infinity,  Infinity];
+        this[1] = max || min || [-Infinity, -Infinity];
+    }
+}
+
+geoExtent.prototype = new Array(2);
+
+assignIn(geoExtent.prototype, {
+
+    equals: function (obj) {
+        return this[0][0] === obj[0][0] &&
+            this[0][1] === obj[0][1] &&
+            this[1][0] === obj[1][0] &&
+            this[1][1] === obj[1][1];
+    },
+
+
+    extend: function(obj) {
+        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+        return geoExtent(
+            [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
+            [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
+        );
+    },
+
+
+    _extend: function(extent) {
+        this[0][0] = Math.min(extent[0][0], this[0][0]);
+        this[0][1] = Math.min(extent[0][1], this[0][1]);
+        this[1][0] = Math.max(extent[1][0], this[1][0]);
+        this[1][1] = Math.max(extent[1][1], this[1][1]);
+    },
+
+
+    area: function() {
+        return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
+    },
+
+
+    center: function() {
+        return [(this[0][0] + this[1][0]) / 2,
+                (this[0][1] + this[1][1]) / 2];
+    },
+
+
+    rectangle: function() {
+        return [this[0][0], this[0][1], this[1][0], this[1][1]];
+    },
+
+
+    bbox: function() {
+        return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
+    },
+
+
+    polygon: function() {
+        return [
+            [this[0][0], this[0][1]],
+            [this[0][0], this[1][1]],
+            [this[1][0], this[1][1]],
+            [this[1][0], this[0][1]],
+            [this[0][0], this[0][1]]
+        ];
+    },
+
+
+    contains: function(obj) {
+        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+        return obj[0][0] >= this[0][0] &&
+               obj[0][1] >= this[0][1] &&
+               obj[1][0] <= this[1][0] &&
+               obj[1][1] <= this[1][1];
+    },
+
+
+    intersects: function(obj) {
+        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+        return obj[0][0] <= this[1][0] &&
+               obj[0][1] <= this[1][1] &&
+               obj[1][0] >= this[0][0] &&
+               obj[1][1] >= this[0][1];
+    },
+
+
+    intersection: function(obj) {
+        if (!this.intersects(obj)) return new geoExtent();
+        return new geoExtent(
+            [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
+            [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
+        );
+    },
+
+
+    percentContainedIn: function(obj) {
+        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+        var a1 = this.intersection(obj).area(),
+            a2 = this.area();
+
+        if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
+            return 0;
+        } else {
+            return a1 / a2;
+        }
+    },
+
+
+    padByMeters: function(meters) {
+        var dLat = geoMetersToLat(meters),
+            dLon = geoMetersToLon(meters, this.center()[1]);
+        return geoExtent(
+            [this[0][0] - dLon, this[0][1] - dLat],
+            [this[1][0] + dLon, this[1][1] + dLat]
+        );
+    },
+
+
+    toParam: function() {
+        return this.rectangle().join(',');
+    }
+
+});
+
+// constants
+var TAU = 2 * Math.PI;
+var EQUATORIAL_RADIUS = 6356752.314245179;
+var POLAR_RADIUS = 6378137.0;
+
+
+function geoLatToMeters(dLat) {
+    return dLat * (TAU * POLAR_RADIUS / 360);
+}
+
+
+function geoLonToMeters(dLon, atLat) {
+    return Math.abs(atLat) >= 90 ? 0 :
+        dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
+}
+
+
+function geoMetersToLat(m) {
+    return m / (TAU * POLAR_RADIUS / 360);
+}
+
+
+function geoMetersToLon(m, atLat) {
+    return Math.abs(atLat) >= 90 ? 0 :
+        m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
+}
+
+
+function geoMetersToOffset(meters, tileSize) {
+    tileSize = tileSize || 256;
+    return [
+        meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
+        -meters[1] * tileSize / (TAU * POLAR_RADIUS)
+    ];
+}
+
+
+function geoOffsetToMeters(offset, tileSize) {
+    tileSize = tileSize || 256;
+    return [
+        offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
+        -offset[1] * TAU * POLAR_RADIUS / tileSize
+    ];
+}
+
+
+// Equirectangular approximation of spherical distances on Earth
+function geoSphericalDistance(a, b) {
+    var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
+    var y = geoLatToMeters(a[1] - b[1]);
+    return Math.sqrt((x * x) + (y * y));
+}
+
+
+// scale to zoom
+function geoScaleToZoom(k, tileSize) {
+    tileSize = tileSize || 256;
+    var log2ts = Math.log(tileSize) * Math.LOG2E;
+    return Math.log(k * TAU) / Math.LN2 - log2ts;
+}
+
+
+// zoom to scale
+function geoZoomToScale(z, tileSize) {
+    tileSize = tileSize || 256;
+    return tileSize * Math.pow(2, z) / TAU;
+}
+
 /**
  * A specialized version of `_.every` for arrays without support for
  * iteratee shorthands.
@@ -23589,113 +24261,87 @@ function some(collection, predicate, guard) {
   return func(collection, baseIteratee(predicate, 3));
 }
 
-function geoRoundCoords(c) {
-    return [Math.floor(c[0]), Math.floor(c[1])];
-}
-
-
-function geoInterp(p1, p2, t) {
-    return [p1[0] + (p2[0] - p1[0]) * t,
-            p1[1] + (p2[1] - p1[1]) * t];
-}
-
-
-// 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product.
-// Returns a positive value, if OAB makes a counter-clockwise turn,
-// negative for clockwise turn, and zero if the points are collinear.
-function geoCross(o, a, b) {
-    return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
-}
-
-
-// http://jsperf.com/id-dist-optimization
-function geoEuclideanDistance(a, b) {
-    var x = a[0] - b[0], y = a[1] - b[1];
-    return Math.sqrt((x * x) + (y * y));
-}
-
-
-// using WGS84 polar radius (6356752.314245179 m)
-// const = 2 * PI * r / 360
-function geoLatToMeters(dLat) {
-    return dLat * 110946.257617;
+// vector equals
+function geoVecEqual(a, b, epsilon) {
+    if (epsilon) {
+        return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
+    } else {
+        return (a[0] === b[0]) && (a[1] === b[1]);
+    }
 }
 
-
-// using WGS84 equatorial radius (6378137.0 m)
-// const = 2 * PI * r / 360
-function geoLonToMeters(dLon, atLat) {
-    return Math.abs(atLat) >= 90 ? 0 :
-        dLon * 111319.490793 * Math.abs(Math.cos(atLat * (Math.PI/180)));
+// vector addition
+function geoVecAdd(a, b) {
+    return [ a[0] + b[0], a[1] + b[1] ];
 }
 
-
-// using WGS84 polar radius (6356752.314245179 m)
-// const = 2 * PI * r / 360
-function geoMetersToLat(m) {
-    return m / 110946.257617;
+// vector subtraction
+function geoVecSubtract(a, b) {
+    return [ a[0] - b[0], a[1] - b[1] ];
 }
 
-
-// using WGS84 equatorial radius (6378137.0 m)
-// const = 2 * PI * r / 360
-function geoMetersToLon(m, atLat) {
-    return Math.abs(atLat) >= 90 ? 0 :
-        m / 111319.490793 / Math.abs(Math.cos(atLat * (Math.PI/180)));
+// vector scaling
+function geoVecScale(a, mag) {
+    return [ a[0] * mag, a[1] * mag ];
 }
 
-
-function geoOffsetToMeters(offset) {
-    var equatRadius = 6356752.314245179,
-        polarRadius = 6378137.0,
-        tileSize = 256;
-
-    return [
-        offset[0] * 2 * Math.PI * equatRadius / tileSize,
-        -offset[1] * 2 * Math.PI * polarRadius / tileSize
-    ];
+// vector rounding (was: geoRoundCoordinates)
+function geoVecFloor(a) {
+    return [ Math.floor(a[0]), Math.floor(a[1]) ];
 }
 
-
-function geoMetersToOffset(meters) {
-    var equatRadius = 6356752.314245179,
-        polarRadius = 6378137.0,
-        tileSize = 256;
-
+// linear interpolation
+function geoVecInterp(a, b, t) {
     return [
-        meters[0] * tileSize / (2 * Math.PI * equatRadius),
-        -meters[1] * tileSize / (2 * Math.PI * polarRadius)
+        a[0] + (b[0] - a[0]) * t,
+        a[1] + (b[1] - a[1]) * t
     ];
 }
 
-
-// Equirectangular approximation of spherical distances on Earth
-function geoSphericalDistance(a, b) {
-    var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2),
-        y = geoLatToMeters(a[1] - b[1]);
+// http://jsperf.com/id-dist-optimization
+function geoVecLength(a, b) {
+    var x = a[0] - b[0];
+    var y = a[1] - b[1];
     return Math.sqrt((x * x) + (y * y));
 }
 
+// Return the counterclockwise angle in the range (-pi, pi)
+// between the positive X axis and the line intersecting a and b.
+function geoVecAngle(a, b) {
+    return Math.atan2(b[1] - a[1], b[0] - a[0]);
+}
 
-function geoEdgeEqual(a, b) {
-    return (a[0] === b[0] && a[1] === b[1]) ||
-        (a[0] === b[1] && a[1] === b[0]);
+// dot product
+function geoVecDot(a, b, origin) {
+    origin = origin || [0, 0];
+    return (a[0] - origin[0]) * (b[0] - origin[0]) +
+        (a[1] - origin[1]) * (b[1] - origin[1]);
 }
 
+// 2D cross product of OA and OB vectors, returns magnitude of Z vector
+// Returns a positive value, if OAB makes a counter-clockwise turn,
+// negative for clockwise turn, and zero if the points are collinear.
+function geoVecCross(a, b, origin) {
+    origin = origin || [0, 0];
+    return (a[0] - origin[0]) * (b[1] - origin[1]) -
+        (a[1] - origin[1]) * (b[0] - origin[0]);
+}
 
 // Return the counterclockwise angle in the range (-pi, pi)
 // between the positive X axis and the line intersecting a and b.
 function geoAngle(a, b, projection) {
-    a = projection(a.loc);
-    b = projection(b.loc);
-    return Math.atan2(b[1] - a[1], b[0] - a[0]);
+    return geoVecAngle(projection(a.loc), projection(b.loc));
 }
 
+function geoEdgeEqual(a, b) {
+    return (a[0] === b[0] && a[1] === b[1]) ||
+        (a[0] === b[1] && a[1] === b[0]);
+}
 
 // Rotate all points counterclockwise around a pivot point by given angle
 function geoRotate(points, angle, around) {
     return points.map(function(point) {
-        var radial = [point[0] - around[0], point[1] - around[1]];
+        var radial = geoVecSubtract(point, around);
         return [
             radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
             radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
@@ -23708,24 +24354,22 @@ function geoRotate(points, angle, around) {
 // projection onto that edge, if such a projection exists, or the distance to
 // the closest vertex on that edge. Returns an object with the `index` of the
 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
-function geoChooseEdge(nodes, point, projection) {
-    var dist = geoEuclideanDistance,
-        points = nodes.map(function(n) { return projection(n.loc); }),
-        min = Infinity,
-        idx, loc;
-
-    function dot(p, q) {
-        return p[0] * q[0] + p[1] * q[1];
-    }
+function geoChooseEdge(nodes, point, projection, activeID) {
+    var dist = geoVecLength;
+    var points = nodes.map(function(n) { return projection(n.loc); });
+    var ids = nodes.map(function(n) { return n.id; });
+    var min = Infinity;
+    var idx;
+    var loc;
 
     for (var i = 0; i < points.length - 1; i++) {
-        var o = points[i],
-            s = [points[i + 1][0] - o[0],
-                 points[i + 1][1] - o[1]],
-            v = [point[0] - o[0],
-                 point[1] - o[1]],
-            proj = dot(v, s) / dot(s, s),
-            p;
+        if (ids[i] === activeID || ids[i + 1] === activeID) continue;
+
+        var o = points[i];
+        var s = geoVecSubtract(points[i + 1], o);
+        var v = geoVecSubtract(point, o);
+        var proj = geoVecDot(v, s) / geoVecDot(s, s);
+        var p;
 
         if (proj < 0) {
             p = o;
@@ -23743,11 +24387,102 @@ function geoChooseEdge(nodes, point, projection) {
         }
     }
 
-    return {
-        index: idx,
-        distance: min,
-        loc: loc
-    };
+    if (idx !== undefined) {
+        return { index: idx, distance: min, loc: loc };
+    } else {
+        return null;
+    }
+}
+
+
+// Test active (dragged or drawing) segments against inactive segments
+// This is used to test e.g. multipolygon rings that cross
+// `activeNodes` is the ring containing the activeID being dragged.
+// `inactiveNodes` is the other ring to test against
+function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
+    var actives = [];
+    var inactives = [];
+    var j, k, n1, n2, segment;
+
+    // gather active segments (only segments in activeNodes that contain the activeID)
+    for (j = 0; j < activeNodes.length - 1; j++) {
+        n1 = activeNodes[j];
+        n2 = activeNodes[j+1];
+        segment = [n1.loc, n2.loc];
+        if (n1.id === activeID || n2.id === activeID) {
+            actives.push(segment);
+        }
+    }
+
+    // gather inactive segments
+    for (j = 0; j < inactiveNodes.length - 1; j++) {
+        n1 = inactiveNodes[j];
+        n2 = inactiveNodes[j+1];
+        segment = [n1.loc, n2.loc];
+        inactives.push(segment);
+    }
+
+    // test
+    for (j = 0; j < actives.length; j++) {
+        for (k = 0; k < inactives.length; k++) {
+            var p = actives[j];
+            var q = inactives[k];
+            var hit = geoLineIntersection(p, q);
+            if (hit) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+
+// Test active (dragged or drawing) segments against inactive segments
+// This is used to test whether a way intersects with itself.
+function geoHasSelfIntersections(nodes, activeID) {
+    var actives = [];
+    var inactives = [];
+    var j, k;
+
+    // group active and passive segments along the nodes
+    for (j = 0; j < nodes.length - 1; j++) {
+        var n1 = nodes[j];
+        var n2 = nodes[j+1];
+        var segment = [n1.loc, n2.loc];
+        if (n1.id === activeID || n2.id === activeID) {
+            actives.push(segment);
+        } else {
+            inactives.push(segment);
+        }
+    }
+
+    // test
+    for (j = 0; j < actives.length; j++) {
+        for (k = 0; k < inactives.length; k++) {
+            var p = actives[j];
+            var q = inactives[k];
+            // skip if segments share an endpoint
+            if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
+                geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
+                continue;
+            }
+
+            var hit = geoLineIntersection(p, q);
+            if (hit) {
+                var epsilon = 1e-8;
+                // skip if the hit is at the segment's endpoint
+                if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
+                    geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
+                    continue;
+                } else {
+                    return true;
+                }
+            }
+        }
+    }
+
+    return false;
 }
 
 
@@ -23756,28 +24491,21 @@ function geoChooseEdge(nodes, point, projection) {
 // This uses the vector cross product approach described below:
 //  http://stackoverflow.com/a/565282/786339
 function geoLineIntersection(a, b) {
-    function subtractPoints(point1, point2) {
-        return [point1[0] - point2[0], point1[1] - point2[1]];
-    }
-    function crossProduct(point1, point2) {
-        return point1[0] * point2[1] - point1[1] * point2[0];
-    }
-
-    var p = [a[0][0], a[0][1]],
-        p2 = [a[1][0], a[1][1]],
-        q = [b[0][0], b[0][1]],
-        q2 = [b[1][0], b[1][1]],
-        r = subtractPoints(p2, p),
-        s = subtractPoints(q2, q),
-        uNumerator = crossProduct(subtractPoints(q, p), r),
-        denominator = crossProduct(r, s);
+    var p = [a[0][0], a[0][1]];
+    var p2 = [a[1][0], a[1][1]];
+    var q = [b[0][0], b[0][1]];
+    var q2 = [b[1][0], b[1][1]];
+    var r = geoVecSubtract(p2, p);
+    var s = geoVecSubtract(q2, q);
+    var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
+    var denominator = geoVecCross(r, s);
 
     if (uNumerator && denominator) {
-        var u = uNumerator / denominator,
-            t = crossProduct(subtractPoints(q, p), s) / denominator;
+        var u = uNumerator / denominator;
+        var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
 
         if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
-            return geoInterp(p, p2, t);
+            return geoVecInterp(p, p2, t);
         }
     }
 
@@ -23789,15 +24517,31 @@ function geoPathIntersections(path1, path2) {
     var intersections = [];
     for (var i = 0; i < path1.length - 1; i++) {
         for (var j = 0; j < path2.length - 1; j++) {
-            var a = [ path1[i], path1[i+1] ],
-                b = [ path2[j], path2[j+1] ],
-                hit = geoLineIntersection(a, b);
-            if (hit) intersections.push(hit);
+            var a = [ path1[i], path1[i+1] ];
+            var b = [ path2[j], path2[j+1] ];
+            var hit = geoLineIntersection(a, b);
+            if (hit) {
+                intersections.push(hit);
+            }
         }
     }
     return intersections;
 }
 
+function geoPathHasIntersections(path1, path2) {
+    for (var i = 0; i < path1.length - 1; i++) {
+        for (var j = 0; j < path2.length - 1; j++) {
+            var a = [ path1[i], path1[i+1] ];
+            var b = [ path2[j], path2[j+1] ];
+            var hit = geoLineIntersection(a, b);
+            if (hit) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
 
 // Return whether point is contained in polygon.
 //
@@ -23809,13 +24553,15 @@ function geoPathIntersections(path1, path2) {
 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
 //
 function geoPointInPolygon(point, polygon) {
-    var x = point[0],
-        y = point[1],
-        inside = false;
+    var x = point[0];
+    var y = point[1];
+    var inside = false;
 
     for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
-        var xi = polygon[i][0], yi = polygon[i][1];
-        var xj = polygon[j][0], yj = polygon[j][1];
+        var xi = polygon[i][0];
+        var yi = polygon[i][1];
+        var xj = polygon[j][0];
+        var yj = polygon[j][1];
 
         var intersect = ((yi > y) !== (yj > y)) &&
             (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
@@ -23834,164 +24580,47 @@ function geoPolygonContainsPolygon(outer, inner) {
 
 
 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
-    function testSegments(outer, inner) {
-        for (var i = 0; i < outer.length - 1; i++) {
-            for (var j = 0; j < inner.length - 1; j++) {
-                var a = [ outer[i], outer[i+1] ],
-                    b = [ inner[j], inner[j+1] ];
-                if (geoLineIntersection(a, b)) return true;
-            }
-        }
-        return false;
-    }
-
     function testPoints(outer, inner) {
         return some(inner, function(point) {
             return geoPointInPolygon(point, outer);
         });
     }
 
-   return testPoints(outer, inner) || (!!checkSegments && testSegments(outer, inner));
+   return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
 }
 
 
 function geoPathLength(path) {
     var length = 0;
     for (var i = 0; i < path.length - 1; i++) {
-        length += geoEuclideanDistance(path[i], path[i + 1]);
+        length += geoVecLength(path[i], path[i + 1]);
     }
     return length;
 }
 
-function geoExtent(min, max) {
-    if (!(this instanceof geoExtent)) return new geoExtent(min, max);
-    if (min instanceof geoExtent) {
-        return min;
-    } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
-        this[0] = min[0];
-        this[1] = min[1];
-    } else {
-        this[0] = min        || [ Infinity,  Infinity];
-        this[1] = max || min || [-Infinity, -Infinity];
-    }
-}
-
-geoExtent.prototype = new Array(2);
-
-assignIn(geoExtent.prototype, {
-
-    equals: function (obj) {
-        return this[0][0] === obj[0][0] &&
-            this[0][1] === obj[0][1] &&
-            this[1][0] === obj[1][0] &&
-            this[1][1] === obj[1][1];
-    },
-
-
-    extend: function(obj) {
-        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
-        return geoExtent(
-            [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
-            [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
-        );
-    },
-
-
-    _extend: function(extent) {
-        this[0][0] = Math.min(extent[0][0], this[0][0]);
-        this[0][1] = Math.min(extent[0][1], this[0][1]);
-        this[1][0] = Math.max(extent[1][0], this[1][0]);
-        this[1][1] = Math.max(extent[1][1], this[1][1]);
-    },
-
-
-    area: function() {
-        return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
-    },
-
-
-    center: function() {
-        return [(this[0][0] + this[1][0]) / 2,
-                (this[0][1] + this[1][1]) / 2];
-    },
-
-
-    rectangle: function() {
-        return [this[0][0], this[0][1], this[1][0], this[1][1]];
-    },
-
-
-    bbox: function() {
-        return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
-    },
-
-
-    polygon: function() {
-        return [
-            [this[0][0], this[0][1]],
-            [this[0][0], this[1][1]],
-            [this[1][0], this[1][1]],
-            [this[1][0], this[0][1]],
-            [this[0][0], this[0][1]]
-        ];
-    },
-
-
-    contains: function(obj) {
-        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
-        return obj[0][0] >= this[0][0] &&
-               obj[0][1] >= this[0][1] &&
-               obj[1][0] <= this[1][0] &&
-               obj[1][1] <= this[1][1];
-    },
-
-
-    intersects: function(obj) {
-        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
-        return obj[0][0] <= this[1][0] &&
-               obj[0][1] <= this[1][1] &&
-               obj[1][0] >= this[0][0] &&
-               obj[1][1] >= this[0][1];
-    },
-
-
-    intersection: function(obj) {
-        if (!this.intersects(obj)) return new geoExtent();
-        return new geoExtent(
-            [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
-            [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
-        );
-    },
-
 
-    percentContainedIn: function(obj) {
-        if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
-        var a1 = this.intersection(obj).area(),
-            a2 = this.area();
-
-        if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
-            return 0;
-        } else {
-            return a1 / a2;
-        }
-    },
-
-
-    padByMeters: function(meters) {
-        var dLat = geoMetersToLat(meters),
-            dLon = geoMetersToLon(meters, this.center()[1]);
-        return geoExtent(
-            [this[0][0] - dLon, this[0][1] - dLat],
-            [this[1][0] + dLon, this[1][1] + dLat]
-        );
-    },
+// If the given point is at the edge of the padded viewport,
+// return a vector that will nudge the viewport in that direction
+function geoViewportEdge(point, dimensions) {
+    var pad = [80, 20, 50, 20];   // top, right, bottom, left
+    var x = 0;
+    var y = 0;
 
+    if (point[0] > dimensions[0] - pad[1])
+        x = -10;
+    if (point[0] < pad[3])
+        x = 10;
+    if (point[1] > dimensions[1] - pad[2])
+        y = -10;
+    if (point[1] < pad[0])
+        y = 10;
 
-    toParam: function() {
-        return this.rectangle().join(',');
+    if (x || y) {
+        return [x, y];
+    } else {
+        return null;
     }
-
-});
+}
 
 /*
     Bypasses features of D3's default projection stream pipeline that are unnecessary:
@@ -24193,6 +24822,28 @@ assignIn(osmChangeset.prototype, {
 
 });
 
+/**
+ * Creates a duplicate-free version of an array, using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons, in which only the first occurrence of each element
+ * is kept. The order of result values is determined by the order they occur
+ * in the array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniq([2, 1, 2]);
+ * // => [2, 1]
+ */
+function uniq(array) {
+  return (array && array.length) ? baseUniq(array) : [];
+}
+
 function osmNode() {
     if (!(this instanceof osmNode)) {
         return (new osmNode()).initialize(arguments);
@@ -24236,6 +24887,103 @@ assignIn(osmNode.prototype, {
     },
 
 
+    // Inspect tags and geometry to determine which direction(s) this node/vertex points
+    directions: function(resolver, projection) {
+        var val;
+        var i;
+
+        // which tag to use?
+        if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
+            // all-way stop tag on a highway intersection
+            val = 'all';
+        } else {
+            // generic direction tag
+            val = (this.tags.direction || '').toLowerCase();
+
+            // better suffix-style direction tag
+            var re = /:direction$/i;
+            var keys = Object.keys(this.tags);
+            for (i = 0; i < keys.length; i++) {
+                if (re.test(keys[i])) {
+                    val = this.tags[keys[i]].toLowerCase();
+                    break;
+                }
+            }
+        }
+
+        if (val === '') return [];
+
+        var cardinal = {
+            north: 0,               n: 0,
+            northnortheast: 22,     nne: 22,
+            northeast: 45,          ne: 45,
+            eastnortheast: 67,      ene: 67,
+            east: 90,               e: 90,
+            eastsoutheast: 112,     ese: 112,
+            southeast: 135,         se: 135,
+            southsoutheast: 157,    sse: 157,
+            south: 180,             s: 180,
+            southsouthwest: 202,    ssw: 202,
+            southwest: 225,         sw: 225,
+            westsouthwest: 247,     wsw: 247,
+            west: 270,              w: 270,
+            westnorthwest: 292,     wnw: 292,
+            northwest: 315,         nw: 315,
+            northnorthwest: 337,    nnw: 337
+        };
+
+
+        var values = val.split(';');
+        var results = [];
+
+        values.forEach(function(v) {
+            // swap cardinal for numeric directions
+            if (cardinal[v] !== undefined) {
+                v = cardinal[v];
+            }
+
+            // numeric direction - just add to results
+            if (v !== '' && !isNaN(+v)) {
+                results.push(+v);
+                return;
+            }
+
+            // string direction - inspect parent ways
+            var lookBackward =
+                (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
+            var lookForward =
+                (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
+
+            if (!lookForward && !lookBackward) return;
+
+            var nodeIds = {};
+            resolver.parentWays(this).forEach(function(parent) {
+                var nodes = parent.nodes;
+                for (i = 0; i < nodes.length; i++) {
+                    if (nodes[i] === this.id) {  // match current entity
+                        if (lookForward && i > 0) {
+                            nodeIds[nodes[i - 1]] = true;  // look back to prev node
+                        }
+                        if (lookBackward && i < nodes.length - 1) {
+                            nodeIds[nodes[i + 1]] = true;  // look ahead to next node
+                        }
+                    }
+                }
+            }, this);
+
+            Object.keys(nodeIds).forEach(function(nodeId) {
+                // +90 because geoAngle returns angle from X axis, not Y (north)
+                results.push(
+                    (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
+                );
+            }, this);
+
+        }, this);
+
+        return uniq(results);
+    },
+
+
     isEndpoint: function(resolver) {
         return resolver.transient(this, 'isEndpoint', function() {
             var id = this.id;
@@ -24489,8 +25237,8 @@ function transform$1(object, iteratee, accumulator) {
    in order to ensure associated nodes (eg a Stop Sign) is also reversed
 
     Node Keys:
-        direction=forward ⟺ direction=backward
-        direction=left ⟺ direction=right
+        *direction=forward ⟺ *direction=backward
+        *direction=left ⟺ *direction=right
         *:forward=* ⟺ *:backward=*
         *:left=* ⟺ *:right=*
 
@@ -24547,7 +25295,8 @@ function actionReverse(wayId, options) {
         // Update the direction based tags as appropriate then return an updated node
         return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
             // See if this is a direction tag and reverse (or use existing value if not recognised)
-            if (tagKey === 'direction') {
+            var re = /direction$/;
+            if (re.test(tagKey)) {
                 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
             } else {
                 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
@@ -24597,473 +25346,6 @@ function actionReverse(wayId, options) {
     };
 }
 
-// For fixing up rendering of multipolygons with tags on the outer member.
-// https://github.com/openstreetmap/iD/issues/613
-function osmIsSimpleMultipolygonOuterMember(entity, graph) {
-    if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
-        return false;
-
-    var parents = graph.parentRelations(entity);
-    if (parents.length !== 1)
-        return false;
-
-    var parent = parents[0];
-    if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
-        return false;
-
-    var members = parent.members, member;
-    for (var i = 0; i < members.length; i++) {
-        member = members[i];
-        if (member.id === entity.id && member.role && member.role !== 'outer')
-            return false; // Not outer member
-        if (member.id !== entity.id && (!member.role || member.role === 'outer'))
-            return false; // Not a simple multipolygon
-    }
-
-    return parent;
-}
-
-
-function osmSimpleMultipolygonOuterMember(entity, graph) {
-    if (entity.type !== 'way')
-        return false;
-
-    var parents = graph.parentRelations(entity);
-    if (parents.length !== 1)
-        return false;
-
-    var parent = parents[0];
-    if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
-        return false;
-
-    var members = parent.members, member, outerMember;
-    for (var i = 0; i < members.length; i++) {
-        member = members[i];
-        if (!member.role || member.role === 'outer') {
-            if (outerMember)
-                return false; // Not a simple multipolygon
-            outerMember = member;
-        }
-    }
-
-    if (!outerMember)
-        return false;
-
-    var outerEntity = graph.hasEntity(outerMember.id);
-    if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
-        return false;
-
-    return outerEntity;
-}
-
-
-// Join `array` into sequences of connecting ways.
-//
-// Segments which share identical start/end nodes will, as much as possible,
-// be connected with each other.
-//
-// The return value is a nested array. Each constituent array contains elements
-// of `array` which have been determined to connect. Each consitituent array
-// also has a `nodes` property whose value is an ordered array of member nodes,
-// with appropriate order reversal and start/end coordinate de-duplication.
-//
-// Members of `array` must have, at minimum, `type` and `id` properties.
-// Thus either an array of `osmWay`s or a relation member array may be
-// used.
-//
-// If an member has a `tags` property, its tags will be reversed via
-// `actionReverse` in the output.
-//
-// Incomplete members (those for which `graph.hasEntity(element.id)` returns
-// false) and non-way members are ignored.
-//
-function osmJoinWays(array, graph) {
-    var joined = [], member, current, nodes, first, last, i, how, what;
-
-    array = array.filter(function(member) {
-        return member.type === 'way' && graph.hasEntity(member.id);
-    });
-
-    function resolve(member) {
-        return graph.childNodes(graph.entity(member.id));
-    }
-
-    function reverse(member) {
-        return member.tags ? actionReverse(member.id, { reverseOneway: true })(graph).entity(member.id) : member;
-    }
-
-    while (array.length) {
-        member = array.shift();
-        current = [member];
-        current.nodes = nodes = resolve(member).slice();
-        joined.push(current);
-
-        while (array.length && nodes[0] !== nodes[nodes.length - 1]) {
-            first = nodes[0];
-            last  = nodes[nodes.length - 1];
-
-            for (i = 0; i < array.length; i++) {
-                member = array[i];
-                what = resolve(member);
-
-                if (last === what[0]) {
-                    how  = nodes.push;
-                    what = what.slice(1);
-                    break;
-                } else if (last === what[what.length - 1]) {
-                    how  = nodes.push;
-                    what = what.slice(0, -1).reverse();
-                    member = reverse(member);
-                    break;
-                } else if (first === what[what.length - 1]) {
-                    how  = nodes.unshift;
-                    what = what.slice(0, -1);
-                    break;
-                } else if (first === what[0]) {
-                    how  = nodes.unshift;
-                    what = what.slice(1).reverse();
-                    member = reverse(member);
-                    break;
-                } else {
-                    what = how = null;
-                }
-            }
-
-            if (!what)
-                break; // No more joinable ways.
-
-            how.apply(current, [member]);
-            how.apply(nodes, what);
-
-            array.splice(i, 1);
-        }
-    }
-
-    return joined;
-}
-
-function osmRelation() {
-    if (!(this instanceof osmRelation)) {
-        return (new osmRelation()).initialize(arguments);
-    } else if (arguments.length) {
-        this.initialize(arguments);
-    }
-}
-
-
-osmEntity.relation = osmRelation;
-
-osmRelation.prototype = Object.create(osmEntity.prototype);
-
-
-osmRelation.creationOrder = function(a, b) {
-    var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
-    var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
-
-    if (aId < 0 || bId < 0) return aId - bId;
-    return bId - aId;
-};
-
-
-assignIn(osmRelation.prototype, {
-    type: 'relation',
-    members: [],
-
-
-    copy: function(resolver, copies) {
-        if (copies[this.id])
-            return copies[this.id];
-
-        var copy = osmEntity.prototype.copy.call(this, resolver, copies);
-
-        var members = this.members.map(function(member) {
-            return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
-        });
-
-        copy = copy.update({members: members});
-        copies[this.id] = copy;
-
-        return copy;
-    },
-
-
-    extent: function(resolver, memo) {
-        return resolver.transient(this, 'extent', function() {
-            if (memo && memo[this.id]) return geoExtent();
-            memo = memo || {};
-            memo[this.id] = true;
-
-            var extent = geoExtent();
-            for (var i = 0; i < this.members.length; i++) {
-                var member = resolver.hasEntity(this.members[i].id);
-                if (member) {
-                    extent._extend(member.extent(resolver, memo));
-                }
-            }
-            return extent;
-        });
-    },
-
-
-    geometry: function(graph) {
-        return graph.transient(this, 'geometry', function() {
-            return this.isMultipolygon() ? 'area' : 'relation';
-        });
-    },
-
-
-    isDegenerate: function() {
-        return this.members.length === 0;
-    },
-
-
-    // Return an array of members, each extended with an 'index' property whose value
-    // is the member index.
-    indexedMembers: function() {
-        var result = new Array(this.members.length);
-        for (var i = 0; i < this.members.length; i++) {
-            result[i] = assignIn({}, this.members[i], {index: i});
-        }
-        return result;
-    },
-
-
-    // Return the first member with the given role. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberByRole: function(role) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].role === role) {
-                return assignIn({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-
-    // Return the first member with the given id. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberById: function(id) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].id === id) {
-                return assignIn({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-
-    // Return the first member with the given id and role. A copy of the member object
-    // is returned, extended with an 'index' property whose value is the member index.
-    memberByIdAndRole: function(id, role) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (this.members[i].id === id && this.members[i].role === role) {
-                return assignIn({}, this.members[i], {index: i});
-            }
-        }
-    },
-
-
-    addMember: function(member, index) {
-        var members = this.members.slice();
-        members.splice(index === undefined ? members.length : index, 0, member);
-        return this.update({members: members});
-    },
-
-
-    updateMember: function(member, index) {
-        var members = this.members.slice();
-        members.splice(index, 1, assignIn({}, members[index], member));
-        return this.update({members: members});
-    },
-
-
-    removeMember: function(index) {
-        var members = this.members.slice();
-        members.splice(index, 1);
-        return this.update({members: members});
-    },
-
-
-    removeMembersWithID: function(id) {
-        var members = reject(this.members, function(m) { return m.id === id; });
-        return this.update({members: members});
-    },
-
-
-    // Wherever a member appears with id `needle.id`, replace it with a member
-    // with id `replacement.id`, type `replacement.type`, and the original role,
-    // unless a member already exists with that id and role. Return an updated
-    // relation.
-    replaceMember: function(needle, replacement) {
-        if (!this.memberById(needle.id))
-            return this;
-
-        var members = [];
-
-        for (var i = 0; i < this.members.length; i++) {
-            var member = this.members[i];
-            if (member.id !== needle.id) {
-                members.push(member);
-            } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
-                members.push({id: replacement.id, type: replacement.type, role: member.role});
-            }
-        }
-
-        return this.update({members: members});
-    },
-
-
-    asJXON: function(changeset_id) {
-        var r = {
-            relation: {
-                '@id': this.osmId(),
-                '@version': this.version || 0,
-                member: map$4(this.members, function(member) {
-                    return {
-                        keyAttributes: {
-                            type: member.type,
-                            role: member.role,
-                            ref: osmEntity.id.toOSM(member.id)
-                        }
-                    };
-                }),
-                tag: map$4(this.tags, function(v, k) {
-                    return { keyAttributes: { k: k, v: v } };
-                })
-            }
-        };
-        if (changeset_id) r.relation['@changeset'] = changeset_id;
-        return r;
-    },
-
-
-    asGeoJSON: function(resolver) {
-        return resolver.transient(this, 'GeoJSON', function () {
-            if (this.isMultipolygon()) {
-                return {
-                    type: 'MultiPolygon',
-                    coordinates: this.multipolygon(resolver)
-                };
-            } else {
-                return {
-                    type: 'FeatureCollection',
-                    properties: this.tags,
-                    features: this.members.map(function (member) {
-                        return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
-                    })
-                };
-            }
-        });
-    },
-
-
-    area: function(resolver) {
-        return resolver.transient(this, 'area', function() {
-            return d3_geoArea(this.asGeoJSON(resolver));
-        });
-    },
-
-
-    isMultipolygon: function() {
-        return this.tags.type === 'multipolygon';
-    },
-
-
-    isComplete: function(resolver) {
-        for (var i = 0; i < this.members.length; i++) {
-            if (!resolver.hasEntity(this.members[i].id)) {
-                return false;
-            }
-        }
-        return true;
-    },
-
-
-    isRestriction: function() {
-        return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
-    },
-
-
-    // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
-    // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
-    //
-    // This corresponds to the structure needed for rendering a multipolygon path using a
-    // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
-    //
-    // In the case of invalid geometries, this function will still return a result which
-    // includes the nodes of all way members, but some Nds may be unclosed and some inner
-    // rings not matched with the intended outer ring.
-    //
-    multipolygon: function(resolver) {
-        var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
-            inners = this.members.filter(function(m) { return 'inner' === m.role; });
-
-        outers = osmJoinWays(outers, resolver);
-        inners = osmJoinWays(inners, resolver);
-
-        outers = outers.map(function(outer) { return map$4(outer.nodes, 'loc'); });
-        inners = inners.map(function(inner) { return map$4(inner.nodes, 'loc'); });
-
-        var result = outers.map(function(o) {
-            // Heuristic for detecting counterclockwise winding order. Assumes
-            // that OpenStreetMap polygons are not hemisphere-spanning.
-            return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
-        });
-
-        function findOuter(inner) {
-            var o, outer;
-
-            for (o = 0; o < outers.length; o++) {
-                outer = outers[o];
-                if (geoPolygonContainsPolygon(outer, inner))
-                    return o;
-            }
-
-            for (o = 0; o < outers.length; o++) {
-                outer = outers[o];
-                if (geoPolygonIntersectsPolygon(outer, inner, false))
-                    return o;
-            }
-        }
-
-        for (var i = 0; i < inners.length; i++) {
-            var inner = inners[i];
-
-            if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
-                inner = inner.reverse();
-            }
-
-            var o = findOuter(inners[i]);
-            if (o !== undefined)
-                result[o].push(inners[i]);
-            else
-                result.push([inners[i]]); // Invalid geometry
-        }
-
-        return result;
-    }
-});
-
-/**
- * Creates a duplicate-free version of an array, using
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * for equality comparisons, in which only the first occurrence of each element
- * is kept. The order of result values is determined by the order they occur
- * in the array.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Array
- * @param {Array} array The array to inspect.
- * @returns {Array} Returns the new duplicate free array.
- * @example
- *
- * _.uniq([2, 1, 2]);
- * // => [2, 1]
- */
-function uniq(array) {
-  return (array && array.length) ? baseUniq(array) : [];
-}
-
 /** `Object#toString` result references. */
 var numberTag$4 = '[object Number]';
 
@@ -25403,8 +25685,8 @@ function mapToLanesObj(lanesObj, data, key) {
 }
 
 /** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG$3 = 1;
-var CLONE_SYMBOLS_FLAG$2 = 4;
+var CLONE_DEEP_FLAG$4 = 1;
+var CLONE_SYMBOLS_FLAG$3 = 4;
 
 /**
  * This method is like `_.clone` except that it recursively clones `value`.
@@ -25425,7 +25707,7 @@ var CLONE_SYMBOLS_FLAG$2 = 4;
  * // => false
  */
 function cloneDeep(value) {
-  return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$2);
+  return baseClone(value, CLONE_DEEP_FLAG$4 | CLONE_SYMBOLS_FLAG$3);
 }
 
 /**
@@ -25775,8 +26057,8 @@ function setTextDirection(dir) {
 }
 
 /** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG$4 = 1;
-var CLONE_SYMBOLS_FLAG$3 = 4;
+var CLONE_DEEP_FLAG$5 = 1;
+var CLONE_SYMBOLS_FLAG$4 = 4;
 
 /**
  * This method is like `_.cloneWith` except that it recursively clones `value`.
@@ -25808,7 +26090,7 @@ var CLONE_SYMBOLS_FLAG$3 = 4;
  */
 function cloneDeepWith(value, customizer) {
   customizer = typeof customizer == 'function' ? customizer : undefined;
-  return baseClone(value, CLONE_DEEP_FLAG$4 | CLONE_SYMBOLS_FLAG$3, customizer);
+  return baseClone(value, CLONE_DEEP_FLAG$5 | CLONE_SYMBOLS_FLAG$4, customizer);
 }
 
 /**
@@ -25838,388 +26120,73 @@ var difference = baseRest(function(array, values) {
     : [];
 });
 
+/** `Object#toString` result references. */
+var mapTag$6 = '[object Map]';
+var setTag$6 = '[object Set]';
+
+/** Used for built-in method references. */
+var objectProto$17 = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
+
 /**
- * Flattens `array` a single level deep.
+ * Checks if `value` is an empty object, collection, map, or set.
+ *
+ * Objects are considered empty if they have no own enumerable string keyed
+ * properties.
+ *
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
  *
  * @static
  * @memberOf _
  * @since 0.1.0
- * @category Array
- * @param {Array} array The array to flatten.
- * @returns {Array} Returns the new flattened array.
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
  * @example
  *
- * _.flatten([1, [2, [3, [4]], 5]]);
- * // => [1, 2, [3, [4]], 5]
- */
-function flatten(array) {
-  var length = array == null ? 0 : array.length;
-  return length ? baseFlatten(array, 1) : [];
-}
-
-/**
- * A specialized version of `baseAggregator` for arrays.
+ * _.isEmpty(null);
+ * // => true
  *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} setter The function to set `accumulator` values.
- * @param {Function} iteratee The iteratee to transform keys.
- * @param {Object} accumulator The initial aggregated object.
- * @returns {Function} Returns `accumulator`.
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
  */
-function arrayAggregator(array, setter, iteratee, accumulator) {
-  var index = -1,
-      length = array == null ? 0 : array.length;
-
-  while (++index < length) {
-    var value = array[index];
-    setter(accumulator, value, iteratee(value), array);
+function isEmpty(value) {
+  if (value == null) {
+    return true;
   }
-  return accumulator;
+  if (isArrayLike(value) &&
+      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
+        isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+    return !value.length;
+  }
+  var tag = getTag$1(value);
+  if (tag == mapTag$6 || tag == setTag$6) {
+    return !value.size;
+  }
+  if (isPrototype(value)) {
+    return !baseKeys(value).length;
+  }
+  for (var key in value) {
+    if (hasOwnProperty$14.call(value, key)) {
+      return false;
+    }
+  }
+  return true;
 }
 
-/**
- * Aggregates elements of `collection` on `accumulator` with keys transformed
- * by `iteratee` and values set by `setter`.
- *
- * @private
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} setter The function to set `accumulator` values.
- * @param {Function} iteratee The iteratee to transform keys.
- * @param {Object} accumulator The initial aggregated object.
- * @returns {Function} Returns `accumulator`.
- */
-function baseAggregator(collection, setter, iteratee, accumulator) {
-  baseEach(collection, function(value, key, collection) {
-    setter(accumulator, value, iteratee(value), collection);
-  });
-  return accumulator;
-}
-
-/**
- * Creates a function like `_.groupBy`.
- *
- * @private
- * @param {Function} setter The function to set accumulator values.
- * @param {Function} [initializer] The accumulator object initializer.
- * @returns {Function} Returns the new aggregator function.
- */
-function createAggregator(setter, initializer) {
-  return function(collection, iteratee) {
-    var func = isArray(collection) ? arrayAggregator : baseAggregator,
-        accumulator = initializer ? initializer() : {};
-
-    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
-  };
-}
-
-/** Used for built-in method references. */
-var objectProto$15 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
-
-/**
- * Creates an object composed of keys generated from the results of running
- * each element of `collection` thru `iteratee`. The order of grouped values
- * is determined by the order they occur in `collection`. The corresponding
- * value of each key is an array of elements responsible for generating the
- * key. The iteratee is invoked with one argument: (value).
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Collection
- * @param {Array|Object} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.groupBy([6.1, 4.2, 6.3], Math.floor);
- * // => { '4': [4.2], '6': [6.1, 6.3] }
- *
- * // The `_.property` iteratee shorthand.
- * _.groupBy(['one', 'two', 'three'], 'length');
- * // => { '3': ['one', 'two'], '5': ['three'] }
- */
-var groupBy = createAggregator(function(result, value, key) {
-  if (hasOwnProperty$12.call(result, key)) {
-    result[key].push(value);
-  } else {
-    baseAssignValue(result, key, [value]);
-  }
-});
-
-/** `Object#toString` result references. */
-var mapTag$6 = '[object Map]';
-var setTag$6 = '[object Set]';
-
-/** Used for built-in method references. */
-var objectProto$16 = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
-
-/**
- * Checks if `value` is an empty object, collection, map, or set.
- *
- * Objects are considered empty if they have no own enumerable string keyed
- * properties.
- *
- * Array-like values such as `arguments` objects, arrays, buffers, strings, or
- * jQuery-like collections are considered empty if they have a `length` of `0`.
- * Similarly, maps and sets are considered empty if they have a `size` of `0`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty(null);
- * // => true
- *
- * _.isEmpty(true);
- * // => true
- *
- * _.isEmpty(1);
- * // => true
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({ 'a': 1 });
- * // => false
- */
-function isEmpty(value) {
-  if (value == null) {
-    return true;
-  }
-  if (isArrayLike(value) &&
-      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
-        isBuffer(value) || isTypedArray(value) || isArguments(value))) {
-    return !value.length;
-  }
-  var tag = getTag$1(value);
-  if (tag == mapTag$6 || tag == setTag$6) {
-    return !value.size;
-  }
-  if (isPrototype(value)) {
-    return !baseKeys(value).length;
-  }
-  for (var key in value) {
-    if (hasOwnProperty$13.call(value, key)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-/**
- * Gets the last element of `array`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the last element of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- */
-function last(array) {
-  var length = array == null ? 0 : array.length;
-  return length ? array[length - 1] : undefined;
-}
-
-/**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
-function baseSlice(array, start, end) {
-  var index = -1,
-      length = array.length;
-
-  if (start < 0) {
-    start = -start > length ? 0 : (length + start);
-  }
-  end = end > length ? length : end;
-  if (end < 0) {
-    end += length;
-  }
-  length = start > end ? 0 : ((end - start) >>> 0);
-  start >>>= 0;
-
-  var result = Array(length);
-  while (++index < length) {
-    result[index] = array[index + start];
-  }
-  return result;
-}
-
-/**
- * Gets the parent value at `path` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} path The path to get the parent value of.
- * @returns {*} Returns the parent value.
- */
-function parent(object, path) {
-  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
-}
-
-/**
- * The base implementation of `_.unset`.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {Array|string} path The property path to unset.
- * @returns {boolean} Returns `true` if the property is deleted, else `false`.
- */
-function baseUnset(object, path) {
-  path = castPath(path, object);
-  object = parent(object, path);
-  return object == null || delete object[toKey(last(path))];
-}
-
-/** `Object#toString` result references. */
-var objectTag$4 = '[object Object]';
-
-/** Used for built-in method references. */
-var funcProto$2 = Function.prototype;
-var objectProto$17 = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var funcToString$2 = funcProto$2.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
-
-/** Used to infer the `Object` constructor. */
-var objectCtorString = funcToString$2.call(Object);
-
-/**
- * Checks if `value` is a plain object, that is, an object created by the
- * `Object` constructor or one with a `[[Prototype]]` of `null`.
- *
- * @static
- * @memberOf _
- * @since 0.8.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- * }
- *
- * _.isPlainObject(new Foo);
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'x': 0, 'y': 0 });
- * // => true
- *
- * _.isPlainObject(Object.create(null));
- * // => true
- */
-function isPlainObject(value) {
-  if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
-    return false;
-  }
-  var proto = getPrototype(value);
-  if (proto === null) {
-    return true;
-  }
-  var Ctor = hasOwnProperty$14.call(proto, 'constructor') && proto.constructor;
-  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
-    funcToString$2.call(Ctor) == objectCtorString;
-}
-
-/**
- * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
- * objects.
- *
- * @private
- * @param {*} value The value to inspect.
- * @param {string} key The key of the property to inspect.
- * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
- */
-function customOmitClone(value) {
-  return isPlainObject(value) ? undefined : value;
-}
-
-/**
- * A specialized version of `baseRest` which flattens the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @returns {Function} Returns the new function.
- */
-function flatRest(func) {
-  return setToString(overRest(func, undefined, flatten), func + '');
-}
-
-/** Used to compose bitmasks for cloning. */
-var CLONE_DEEP_FLAG$5 = 1;
-var CLONE_FLAT_FLAG$1 = 2;
-var CLONE_SYMBOLS_FLAG$4 = 4;
-
-/**
- * The opposite of `_.pick`; this method creates an object composed of the
- * own and inherited enumerable property paths of `object` that are not omitted.
- *
- * **Note:** This method is considerably slower than `_.pick`.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
- * @param {Object} object The source object.
- * @param {...(string|string[])} [paths] The property paths to omit.
- * @returns {Object} Returns the new object.
- * @example
- *
- * var object = { 'a': 1, 'b': '2', 'c': 3 };
- *
- * _.omit(object, ['a', 'c']);
- * // => { 'b': '2' }
- */
-var omit = flatRest(function(object, paths) {
-  var result = {};
-  if (object == null) {
-    return result;
-  }
-  var isDeep = false;
-  paths = arrayMap(paths, function(path) {
-    path = castPath(path, object);
-    isDeep || (isDeep = path.length > 1);
-    return path;
-  });
-  copyObject(object, getAllKeysIn(object), result);
-  if (isDeep) {
-    result = baseClone(result, CLONE_DEEP_FLAG$5 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$4, customOmitClone);
-  }
-  var length = paths.length;
-  while (length--) {
-    baseUnset(result, paths[length]);
-  }
-  return result;
-});
-
 var detected;
 
 function utilDetect(force) {
@@ -26330,6 +26297,8 @@ function utilDetect(force) {
 
     detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
 
+    detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
+
     function nav(x) {
         return navigator.userAgent.indexOf(x) !== -1;
     }
@@ -27340,12 +27309,21 @@ function validationDisconnectedHighway() {
 function validationManyDeletions() {
     var threshold = 100;
 
-    var validation = function(changes) {
+    var validation = function(changes, graph) {
         var warnings = [];
+        var nodes=0, ways=0, areas=0, relations=0;
+
+        changes.deleted.forEach(function(c) {
+            if (c.type === 'node') {nodes++;}
+            else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
+            else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
+            else if (c.type === 'relation') {relations++;}
+        });
         if (changes.deleted.length > threshold) {
             warnings.push({
                 id: 'many_deletions',
-                message: t('validations.many_deletions', { n: changes.deleted.length })
+                message: t('validations.many_deletions',
+                    { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
             });
         }
 
@@ -28093,16 +28071,14 @@ coreGraph.prototype = {
     }
 };
 
-var quickselect = partialSort;
+var quickselect_1 = quickselect;
+var default_1 = quickselect;
 
-// Floyd-Rivest selection algorithm:
-// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
-// The k-th element will have the (k - left + 1)th smallest value in [left, right]
+function quickselect(arr, k, left, right, compare) {
+    quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
+}
 
-function partialSort(arr, k, left, right, compare) {
-    left = left || 0;
-    right = right || (arr.length - 1);
-    compare = compare || defaultCompare;
+function quickselectStep(arr, k, left, right, compare) {
 
     while (right > left) {
         if (right - left > 600) {
@@ -28113,7 +28089,7 @@ function partialSort(arr, k, left, right, compare) {
             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-            partialSort(arr, k, newLeft, newRight, compare);
+            quickselectStep(arr, k, newLeft, newRight, compare);
         }
 
         var t = arr[k];
@@ -28152,7 +28128,10 @@ function defaultCompare(a, b) {
     return a < b ? -1 : a > b ? 1 : 0;
 }
 
+quickselect_1.default = default_1;
+
 var rbush_1 = rbush;
+var default_1$1 = rbush;
 
 
 
@@ -28242,7 +28221,7 @@ rbush.prototype = {
             return this;
         }
 
-        // recursively build the tree with the given data from stratch using OMT algorithm
+        // recursively build the tree with the given data from scratch using OMT algorithm
         var node = this._build(data.slice(), 0, data.length - 1, 0);
 
         if (!this.data.children.length) {
@@ -28706,12 +28685,14 @@ function multiSelect(arr, left, right, n, compare) {
         if (right - left <= n) continue;
 
         mid = left + Math.ceil((right - left) / n / 2) * n;
-        quickselect(arr, mid, left, right, compare);
+        quickselect_1(arr, mid, left, right, compare);
 
         stack.push(left, mid, mid, right);
     }
 }
 
+rbush_1.default = default_1$1;
+
 function coreTree(head) {
     var rtree = rbush_1(),
         bboxes = {},
@@ -28855,22 +28836,34 @@ function d3keybinding(namespace) {
 
         function matches(binding, testShift) {
             var event$$1 = event;
+            var isMatch = false;
+            var tryKeyCode = true;
+
+            // Prefer a match on `KeyboardEvent.key`
             if (event$$1.key !== undefined) {
+                tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
+                isMatch = true;
+
                 if (binding.event.key === undefined) {
-                    return false;
+                    isMatch = false;
                 } else if (Array.isArray(binding.event.key)) {
                     if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
-                        return false;
+                        isMatch = false;
                 } else {
                     if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
-                        return false;
+                        isMatch = false;
                 }
-            } else {
-                // check keycodes if browser doesn't support KeyboardEvent.key
-                if (event$$1.keyCode !== binding.event.keyCode)
-                    return false;
             }
 
+            // Fallback match on `KeyboardEvent.keyCode`, can happen if:
+            // - browser doesn't support `KeyboardEvent.key`
+            // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
+            if (!isMatch && tryKeyCode) {
+                isMatch = (event$$1.keyCode === binding.event.keyCode);
+            }
+
+            if (!isMatch) return false;
+
             // test modifier keys
             if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
                 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
@@ -28921,8 +28914,8 @@ function d3keybinding(namespace) {
             var code = arr[i];
             var binding = {
                 event: {
-                    key: undefined,
-                    keyCode: 0, // only for browsers that don't support KeyboardEvent.key
+                    key: undefined,  // preferred
+                    keyCode: 0,      // fallback
                     modifiers: {
                         shiftKey: false,
                         ctrlKey: false,
@@ -29395,16 +29388,16 @@ function behaviorEdit(context) {
    have the .hover class.
  */
 function behaviorHover(context) {
-    var dispatch$$1 = dispatch('hover'),
-        _selection = d3_select(null),
-        newId = null,
-        buttonDown,
-        altDisables,
-        target;
+    var dispatch$$1 = dispatch('hover');
+    var _selection = d3_select(null);
+    var _newId = null;
+    var _buttonDown;
+    var _altDisables;
+    var _target;
 
 
     function keydown() {
-        if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
+        if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
             _selection.selectAll('.hover')
                 .classed('hover-suppressed', true)
                 .classed('hover', false);
@@ -29418,7 +29411,7 @@ function behaviorHover(context) {
 
 
     function keyup() {
-        if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
+        if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
             _selection.selectAll('.hover-suppressed')
                 .classed('hover-suppressed', false)
                 .classed('hover', true);
@@ -29426,14 +29419,14 @@ function behaviorHover(context) {
             _selection
                 .classed('hover-disabled', false);
 
-            dispatch$$1.call('hover', this, target ? target.id : null);
+            dispatch$$1.call('hover', this, _target ? _target.id : null);
         }
     }
 
 
     var hover = function(selection) {
         _selection = selection;
-        newId = null;
+        _newId = null;
 
         _selection
             .on('mouseover.hover', mouseover)
@@ -29446,65 +29439,71 @@ function behaviorHover(context) {
 
 
         function mouseover() {
-            if (buttonDown) return;
+            if (_buttonDown) return;
             var target = event.target;
             enter(target ? target.__data__ : null);
         }
 
 
         function mouseout() {
-            if (buttonDown) return;
+            if (_buttonDown) return;
             var target = event.relatedTarget;
             enter(target ? target.__data__ : null);
         }
 
 
         function mousedown() {
-            buttonDown = true;
+            _buttonDown = true;
             d3_select(window)
                 .on('mouseup.hover', mouseup, true);
         }
 
 
         function mouseup() {
-            buttonDown = false;
+            _buttonDown = false;
             d3_select(window)
                 .on('mouseup.hover', null, true);
         }
 
 
-        function enter(d) {
-            if (d === target) return;
-            target = d;
+        function enter(datum) {
+            if (datum === _target) return;
+            _target = datum;
 
             _selection.selectAll('.hover')
                 .classed('hover', false);
             _selection.selectAll('.hover-suppressed')
                 .classed('hover-suppressed', false);
 
-            if (target instanceof osmEntity && target.id !== newId) {
+            var entity;
+            if (datum instanceof osmEntity) {
+                entity = datum;
+            } else {
+                entity = datum && datum.properties && datum.properties.entity;
+            }
 
+            if (entity && entity.id !== _newId) {
                 // If drawing a way, don't hover on a node that was just placed. #3974
                 var mode = context.mode() && context.mode().id;
-                if ((mode === 'draw-line' || mode === 'draw-area') && !newId && target.type === 'node') {
-                    newId = target.id;
+                if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
+                    _newId = entity.id;
                     return;
                 }
 
-                var selector = '.' + target.id;
+                var selector = '.' + entity.id;
 
-                if (target.type === 'relation') {
-                    target.members.forEach(function(member) {
+                if (entity.type === 'relation') {
+                    entity.members.forEach(function(member) {
                         selector += ', .' + member.id;
                     });
                 }
 
-                var suppressed = altDisables && event && event.altKey;
+                var suppressed = _altDisables && event && event.altKey;
 
                 _selection.selectAll(selector)
                     .classed(suppressed ? 'hover-suppressed' : 'hover', true);
 
-                dispatch$$1.call('hover', this, !suppressed && target.id);
+                dispatch$$1.call('hover', this, !suppressed && entity.id);
 
             } else {
                 dispatch$$1.call('hover', this, null);
@@ -29522,7 +29521,6 @@ function behaviorHover(context) {
         selection
             .classed('hover-disabled', false);
 
-
         selection
             .on('mouseover.hover', null)
             .on('mouseout.hover', null)
@@ -29535,8 +29533,8 @@ function behaviorHover(context) {
 
 
     hover.altDisables = function(_) {
-        if (!arguments.length) return altDisables;
-        altDisables = _;
+        if (!arguments.length) return _altDisables;
+        _altDisables = _;
         return hover;
     };
 
@@ -29667,34 +29665,45 @@ function behaviorTail() {
     return tail;
 }
 
-var usedTails = {};
-var disableSpace = false;
-var lastSpace = null;
+var _usedTails = {};
+var _disableSpace = false;
+var _lastSpace = null;
 
 
 function behaviorDraw(context) {
-    var dispatch$$1 = dispatch('move', 'click', 'clickWay',
-            'clickNode', 'undo', 'cancel', 'finish'),
-        keybinding = d3keybinding('draw'),
-        hover = behaviorHover(context)
-            .altDisables(true)
-            .on('hover', context.ui().sidebar.hover),
-        tail = behaviorTail(),
-        edit = behaviorEdit(context),
-        closeTolerance = 4,
-        tolerance = 12,
-        mouseLeave = false,
-        lastMouse = null;
+    var dispatch$$1 = dispatch(
+        'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
+    );
+
+    var keybinding = d3keybinding('draw');
+
+    var hover = behaviorHover(context).altDisables(true)
+        .on('hover', context.ui().sidebar.hover);
+    var tail = behaviorTail();
+    var edit = behaviorEdit(context);
 
+    var closeTolerance = 4;
+    var tolerance = 12;
+    var _mouseLeave = false;
+    var _lastMouse = null;
 
+
+    // related code
+    // - `mode/drag_node.js` `datum()`
     function datum() {
         if (event.altKey) return {};
 
+        var element;
         if (event.type === 'keydown') {
-            return (lastMouse && lastMouse.target.__data__) || {};
+            element = _lastMouse && _lastMouse.target;
         } else {
-            return event.target.__data__ || {};
+            element = event.target;
         }
+
+        // When drawing, snap only to touch targets..
+        // (this excludes area fills and active drawing elements)
+        var d = element.__data__;
+        return (d && d.properties && d.properties.target) ? d : {};
     }
 
 
@@ -29707,17 +29716,17 @@ function behaviorDraw(context) {
             })[0] : d3_mouse(p);
         }
 
-        var element = d3_select(this),
-            touchId = event.touches ? event.changedTouches[0].identifier : null,
-            t1 = +new Date(),
-            p1 = point();
+        var element = d3_select(this);
+        var touchId = event.touches ? event.changedTouches[0].identifier : null;
+        var t1 = +new Date();
+        var p1 = point();
 
         element.on('mousemove.draw', null);
 
         d3_select(window).on('mouseup.draw', function() {
-            var t2 = +new Date(),
-                p2 = point(),
-                dist = geoEuclideanDistance(p1, p2);
+            var t2 = +new Date();
+            var p2 = point();
+            var dist = geoVecLength(p1, p2);
 
             element.on('mousemove.draw', mousemove);
             d3_select(window).on('mouseup.draw', null);
@@ -29742,44 +29751,45 @@ function behaviorDraw(context) {
 
 
     function mousemove() {
-        lastMouse = event;
+        _lastMouse = event;
         dispatch$$1.call('move', this, datum());
     }
 
 
     function mouseenter() {
-        mouseLeave = false;
+        _mouseLeave = false;
     }
 
 
     function mouseleave() {
-        mouseLeave = true;
+        _mouseLeave = true;
     }
 
 
+    // related code
+    // - `mode/drag_node.js`     `doMode()`
+    // - `behavior/draw.js`      `click()`
+    // - `behavior/draw_way.js`  `move()`
     function click() {
         var d = datum();
-        if (d.type === 'way') {
-            var dims = context.map().dimensions(),
-                mouse$$1 = context.mouse(),
-                pad = 5,
-                trySnap = mouse$$1[0] > pad && mouse$$1[0] < dims[0] - pad &&
-                    mouse$$1[1] > pad && mouse$$1[1] < dims[1] - pad;
-
-            if (trySnap) {
-                var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection),
-                    edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
-                dispatch$$1.call('clickWay', this, choice.loc, edge);
-            } else {
-                dispatch$$1.call('click', this, context.map().mouseCoordinates());
-            }
+        var target = d && d.properties && d.properties.entity;
 
-        } else if (d.type === 'node') {
-            dispatch$$1.call('clickNode', this, d);
+        if (target && target.type === 'node') {   // Snap to a node
+            dispatch$$1.call('clickNode', this, target, d);
+            return;
 
-        } else {
-            dispatch$$1.call('click', this, context.map().mouseCoordinates());
+        } else if (target && target.type === 'way') {   // Snap to a way
+            var choice = geoChooseEdge(
+                context.childNodes(target), context.mouse(), context.projection, context.activeID()
+            );
+            if (choice) {
+                var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
+                dispatch$$1.call('clickWay', this, choice.loc, edge, d);
+                return;
+            }
         }
+
+        dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
     }
 
 
@@ -29788,23 +29798,23 @@ function behaviorDraw(context) {
         event.stopPropagation();
 
         var currSpace = context.mouse();
-        if (disableSpace && lastSpace) {
-            var dist = geoEuclideanDistance(lastSpace, currSpace);
+        if (_disableSpace && _lastSpace) {
+            var dist = geoVecLength(_lastSpace, currSpace);
             if (dist > tolerance) {
-                disableSpace = false;
+                _disableSpace = false;
             }
         }
 
-        if (disableSpace || mouseLeave || !lastMouse) return;
+        if (_disableSpace || _mouseLeave || !_lastMouse) return;
 
         // user must move mouse or release space bar to allow another click
-        lastSpace = currSpace;
-        disableSpace = true;
+        _lastSpace = currSpace;
+        _disableSpace = true;
 
         d3_select(window).on('keyup.space-block', function() {
             event.preventDefault();
             event.stopPropagation();
-            disableSpace = false;
+            _disableSpace = false;
             d3_select(window).on('keyup.space-block', null);
         });
 
@@ -29834,7 +29844,7 @@ function behaviorDraw(context) {
         context.install(hover);
         context.install(edit);
 
-        if (!context.inIntro() && !usedTails[tail.text()]) {
+        if (!context.inIntro() && !_usedTails[tail.text()]) {
             context.install(tail);
         }
 
@@ -29864,9 +29874,9 @@ function behaviorDraw(context) {
         context.uninstall(hover);
         context.uninstall(edit);
 
-        if (!context.inIntro() && !usedTails[tail.text()]) {
+        if (!context.inIntro() && !_usedTails[tail.text()]) {
             context.uninstall(tail);
-            usedTails[tail.text()] = true;
+            _usedTails[tail.text()] = true;
         }
 
         selection
@@ -30114,46 +30124,22 @@ function modeDragNode(context) {
         id: 'drag-node',
         button: 'browse'
     };
+    var hover = behaviorHover(context).altDisables(true)
+        .on('hover', context.ui().sidebar.hover);
+    var edit = behaviorEdit(context);
 
-    var nudgeInterval,
-        activeIDs,
-        wasMidpoint,
-        isCancelled,
-        lastLoc,
-        selectedIDs = [],
-        hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover),
-        edit = behaviorEdit(context);
-
-
-    function vecSub(a, b) {
-        return [a[0] - b[0], a[1] - b[1]];
-    }
-
-    function edge(point, size) {
-        var pad = [80, 20, 50, 20],   // top, right, bottom, left
-            x = 0,
-            y = 0;
-
-        if (point[0] > size[0] - pad[1])
-            x = -10;
-        if (point[0] < pad[3])
-            x = 10;
-        if (point[1] > size[1] - pad[2])
-            y = -10;
-        if (point[1] < pad[0])
-            y = 10;
-
-        if (x || y) {
-            return [x, y];
-        } else {
-            return null;
-        }
-    }
+    var _nudgeInterval;
+    var _restoreSelectedIDs = [];
+    var _wasMidpoint = false;
+    var _isCancelled = false;
+    var _activeEntity;
+    var _startLoc;
+    var _lastLoc;
 
 
     function startNudge(entity, nudge) {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = window.setInterval(function() {
+        if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+        _nudgeInterval = window.setInterval(function() {
             context.pan(nudge);
             doMove(entity, nudge);
         }, 50);
@@ -30161,9 +30147,9 @@ function modeDragNode(context) {
 
 
     function stopNudge() {
-        if (nudgeInterval) {
-            window.clearInterval(nudgeInterval);
-            nudgeInterval = null;
+        if (_nudgeInterval) {
+            window.clearInterval(_nudgeInterval);
+            _nudgeInterval = null;
         }
     }
 
@@ -30183,44 +30169,79 @@ function modeDragNode(context) {
     }
 
 
+    function keydown() {
+        if (event.keyCode === d3keybinding.modifierCodes.alt) {
+            if (context.surface().classed('nope')) {
+                context.surface()
+                    .classed('nope-suppressed', true);
+            }
+            context.surface()
+                .classed('nope', false)
+                .classed('nope-disabled', true);
+        }
+    }
+
+
+    function keyup() {
+        if (event.keyCode === d3keybinding.modifierCodes.alt) {
+            if (context.surface().classed('nope-suppressed')) {
+                context.surface()
+                    .classed('nope', true);
+            }
+            context.surface()
+                .classed('nope-suppressed', false)
+                .classed('nope-disabled', false);
+        }
+    }
+
+
     function start(entity) {
-        wasMidpoint = entity.type === 'midpoint';
+        _wasMidpoint = entity.type === 'midpoint';
+        var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
+        _isCancelled = event.sourceEvent.shiftKey || hasHidden;
 
-        isCancelled = event.sourceEvent.shiftKey ||
-            context.features().hasHiddenConnections(entity, context.graph());
 
-        if (isCancelled) {
-            return behavior.cancel();
+        if (_isCancelled) {
+            if (hasHidden) {
+                uiFlash().text(t('modes.drag_node.connected_to_hidden'))();
+            }
+            return drag.cancel();
         }
 
-        if (wasMidpoint) {
+        if (_wasMidpoint) {
             var midpoint = entity;
             entity = osmNode();
             context.perform(actionAddMidpoint(midpoint, entity));
+            entity = context.entity(entity.id);   // get post-action entity
 
             var vertex = context.surface().selectAll('.' + entity.id);
-            behavior.target(vertex.node(), entity);
+            drag.target(vertex.node(), entity);
 
         } else {
             context.perform(actionNoop());
         }
 
-        // activeIDs generate no pointer events.  This prevents the node or vertex
-        // being dragged from trying to connect to itself or its parent element.
-        activeIDs = map$4(context.graph().parentWays(entity), 'id');
-        activeIDs.push(entity.id);
-        setActiveElements();
+        _activeEntity = entity;
+        _startLoc = entity.loc;
+
+        context.surface().selectAll('.' + _activeEntity.id)
+            .classed('active', true);
 
         context.enter(mode);
     }
 
 
+    // related code
+    // - `behavior/draw.js` `datum()`
     function datum() {
         var event$$1 = event && event.sourceEvent;
         if (!event$$1 || event$$1.altKey) {
             return {};
         } else {
-            return event$$1.target.__data__ || {};
+            // When dragging, snap only to touch targets..
+            // (this excludes area fills and active drawing elements)
+            var d = event$$1.target.__data__;
+            return (d && d.properties && d.properties.target) ? d : {};
         }
     }
 
@@ -30228,16 +30249,27 @@ function modeDragNode(context) {
     function doMove(entity, nudge) {
         nudge = nudge || [0, 0];
 
-        var currPoint = (event && event.point) || context.projection(lastLoc),
-            currMouse = vecSub(currPoint, nudge),
-            loc = context.projection.invert(currMouse),
-            d = datum();
-
-        if (!nudgeInterval) {
-            if (d.type === 'node' && d.id !== entity.id) {
-                loc = d.loc;
-            } else if (d.type === 'way' && !d3_select(event.sourceEvent.target).classed('fill')) {
-                loc = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection).loc;
+        var currPoint = (event && event.point) || context.projection(_lastLoc);
+        var currMouse = geoVecSubtract(currPoint, nudge);
+        var loc = context.projection.invert(currMouse);
+
+        if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
+            // related code
+            // - `mode/drag_node.js`     `doMode()`
+            // - `behavior/draw.js`      `click()`
+            // - `behavior/draw_way.js`  `move()`
+            var d = datum();
+            var targetLoc = d && d.properties && d.properties.entity && d.properties.entity.loc;
+            var targetNodes = d && d.properties && d.properties.nodes;
+
+            if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
+                loc = targetLoc;
+
+            } else if (targetNodes) {   // snap to way - a line target with `.nodes`
+                var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
+                if (choice) {
+                    loc = choice.loc;
+                }
             }
         }
 
@@ -30246,17 +30278,89 @@ function modeDragNode(context) {
             moveAnnotation(entity)
         );
 
-        lastLoc = loc;
+
+        // check if this movement causes the geometry to break
+        var nopeDisabled = context.surface().classed('nope-disabled');
+        var isInvalid = isInvalidGeometry(entity, context.graph());
+        if (nopeDisabled) {
+            context.surface()
+                .classed('nope', false)
+                .classed('nope-suppressed', isInvalid);
+        } else {
+            context.surface()
+                .classed('nope', isInvalid)
+                .classed('nope-suppressed', false);
+        }
+
+        _lastLoc = loc;
+    }
+
+
+    function isInvalidGeometry(entity, graph) {
+        var parents = graph.parentWays(entity);
+        var i, j, k;
+
+        for (i = 0; i < parents.length; i++) {
+            var parent = parents[i];
+            var nodes = [];
+            var activeIndex = null;    // which multipolygon ring contains node being dragged
+
+            // test any parent multipolygons for valid geometry
+            var relations = graph.parentRelations(parent);
+            for (j = 0; j < relations.length; j++) {
+                if (!relations[j].isMultipolygon()) continue;
+
+                var rings = osmJoinWays(relations[j].members, graph);
+
+                // find active ring and test it for self intersections
+                for (k = 0; k < rings.length; k++) {
+                    nodes = rings[k].nodes;
+                    if (find$1(nodes, function(n) { return n.id === entity.id; })) {
+                        activeIndex = k;
+                        if (geoHasSelfIntersections(nodes, entity.id)) {
+                            return true;
+                        }
+                    }
+                    rings[k].coords = nodes.map(function(n) { return n.loc; });
+                }
+
+                // test active ring for intersections with other rings in the multipolygon
+                for (k = 0; k < rings.length; k++) {
+                    if (k === activeIndex) continue;
+
+                    // make sure active ring doesnt cross passive rings
+                    if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
+                        return true;
+                    }
+                }
+            }
+
+
+            // If we still haven't tested this node's parent way for self-intersections.
+            // (because it's not a member of a multipolygon), test it now.
+            if (activeIndex === null) {
+                nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
+                if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
+                    return true;
+                }
+            }
+
+        }
+
+        return false;
     }
 
 
     function move(entity) {
-        if (isCancelled) return;
+        if (_isCancelled) return;
         event.sourceEvent.stopPropagation();
-        lastLoc = context.projection.invert(event.point);
+
+        context.surface().classed('nope-disabled', event.sourceEvent.altKey);
+
+        _lastLoc = context.projection.invert(event.point);
 
         doMove(entity);
-        var nudge = edge(event.point, context.map().dimensions());
+        var nudge = geoViewportEdge(event.point, context.map().dimensions());
         if (nudge) {
             startNudge(entity, nudge);
         } else {
@@ -30266,24 +30370,34 @@ function modeDragNode(context) {
 
 
     function end(entity) {
-        if (isCancelled) return;
+        if (_isCancelled) return;
 
         var d = datum();
+        var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
+        var target = d && d.properties && d.properties.entity;   // entity to snap to
 
-        if (d.type === 'way') {
-            var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection);
+        if (nope) {   // bounce back
+            context.perform(
+                _actionBounceBack(entity.id, _startLoc)
+            );
+
+        } else if (target && target.type === 'way') {
+            var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
             context.replace(
-                actionAddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
-                connectAnnotation(d)
+                actionAddMidpoint({
+                    loc: choice.loc,
+                    edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
+                }, entity),
+                connectAnnotation(target)
             );
 
-        } else if (d.type === 'node' && d.id !== entity.id) {
+        } else if (target && target.type === 'node') {
             context.replace(
-                actionConnect([d.id, entity.id]),
-                connectAnnotation(d)
+                actionConnect([target.id, entity.id]),
+                connectAnnotation(target)
             );
 
-        } else if (wasMidpoint) {
+        } else if (_wasMidpoint) {
             context.replace(
                 actionNoop(),
                 t('operations.add.annotation.vertex')
@@ -30296,7 +30410,7 @@ function modeDragNode(context) {
             );
         }
 
-        var reselection = selectedIDs.filter(function(id) {
+        var reselection = _restoreSelectedIDs.filter(function(id) {
             return context.graph().hasEntity(id);
         });
 
@@ -30308,20 +30422,27 @@ function modeDragNode(context) {
     }
 
 
-    function cancel() {
-        behavior.cancel();
-        context.enter(modeBrowse(context));
+    function _actionBounceBack(nodeID, toLoc) {
+        var moveNode = actionMoveNode(nodeID, toLoc);
+        var action = function(graph, t$$1) {
+            // last time through, pop off the bounceback perform.
+            // it will then overwrite the initial perform with a moveNode that does nothing
+            if (t$$1 === 1) context.pop();
+            return moveNode(graph, t$$1);
+        };
+        action.transitionable = true;
+        return action;
     }
 
 
-    function setActiveElements() {
-        context.surface().selectAll(utilEntitySelector(activeIDs))
-            .classed('active', true);
+    function cancel() {
+        drag.cancel();
+        context.enter(modeBrowse(context));
     }
 
 
-    var behavior = behaviorDrag()
-        .selector('g.node, g.point, g.midpoint')
+    var drag = behaviorDrag()
+        .selector('.layer-points-targets .target')
         .surface(d3_select('#map').node())
         .origin(origin)
         .on('start', start)
@@ -30333,13 +30454,12 @@ function modeDragNode(context) {
         context.install(hover);
         context.install(edit);
 
+        d3_select(window)
+            .on('keydown.drawWay', keydown)
+            .on('keyup.drawWay', keyup);
+
         context.history()
             .on('undone.drag-node', cancel);
-
-        context.map()
-            .on('drawn.drag-node', setActiveElements);
-
-        setActiveElements();
     };
 
 
@@ -30348,13 +30468,22 @@ function modeDragNode(context) {
         context.uninstall(hover);
         context.uninstall(edit);
 
+        d3_select(window)
+            .on('keydown.hover', null)
+            .on('keyup.hover', null);
+
         context.history()
             .on('undone.drag-node', null);
 
         context.map()
             .on('drawn.drag-node', null);
 
+        _activeEntity = null;
+
         context.surface()
+            .classed('nope', false)
+            .classed('nope-suppressed', false)
+            .classed('nope-disabled', false)
             .selectAll('.active')
             .classed('active', false);
 
@@ -30362,14 +30491,28 @@ function modeDragNode(context) {
     };
 
 
-    mode.selectedIDs = function(_) {
-        if (!arguments.length) return selectedIDs;
-        selectedIDs = _;
+    mode.selectedIDs = function() {
+        if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
+        // no assign
+        return mode;
+    };
+
+
+    mode.activeID = function() {
+        if (!arguments.length) return _activeEntity && _activeEntity.id;
+        // no assign
         return mode;
     };
 
 
-    mode.behavior = behavior;
+    mode.restoreSelectedIDs = function(_) {
+        if (!arguments.length) return _restoreSelectedIDs;
+        _restoreSelectedIDs = _;
+        return mode;
+    };
+
+
+    mode.behavior = drag;
 
 
     return mode;
@@ -30449,14 +30592,14 @@ function modeDrawArea(context, wayId, startGraph) {
 
         var addNode = behavior.addNode;
 
-        behavior.addNode = function(node) {
-            var length = way.nodes.length,
-                penultimate = length > 2 ? way.nodes[length - 2] : null;
+        behavior.addNode = function(node, d) {
+            var length = way.nodes.length;
+            var penultimate = length > 2 ? way.nodes[length - 2] : null;
 
             if (node.id === way.first() || node.id === penultimate) {
                 behavior.finish();
             } else {
-                addNode(node);
+                addNode(node, d);
             }
         };
 
@@ -30474,6 +30617,11 @@ function modeDrawArea(context, wayId, startGraph) {
     };
 
 
+    mode.activeID = function() {
+        return (behavior && behavior.activeID()) || [];
+    };
+
+
     return mode;
 }
 
@@ -30487,20 +30635,19 @@ function modeDrawLine(context, wayId, startGraph, affix) {
 
 
     mode.enter = function() {
-        var way = context.entity(wayId),
-            index = (affix === 'prefix') ? 0 : undefined,
-            headId = (affix === 'prefix') ? way.first() : way.last();
+        var way = context.entity(wayId);
+        var index = (affix === 'prefix') ? 0 : undefined;
+        var headId = (affix === 'prefix') ? way.first() : way.last();
 
         behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
             .tail(t('modes.draw_line.tail'));
 
         var addNode = behavior.addNode;
-
-        behavior.addNode = function(node) {
+        behavior.addNode = function(node, d) {
             if (node.id === headId) {
                 behavior.finish();
             } else {
-                addNode(node);
+                addNode(node, d);
             }
         };
 
@@ -30518,6 +30665,10 @@ function modeDrawLine(context, wayId, startGraph, affix) {
     };
 
 
+    mode.activeID = function() {
+        return (behavior && behavior.activeID()) || [];
+    };
+
     return mode;
 }
 
@@ -30645,6 +30796,7 @@ function operationDelete(selectedIDs, context) {
 
     var operation = function() {
         var nextSelectedID;
+        var nextSelectedLoc;
 
         if (selectedIDs.length === 1) {
             var id = selectedIDs[0],
@@ -30654,7 +30806,7 @@ function operationDelete(selectedIDs, context) {
                 parent = parents[0];
 
             // Select the next closest node in the way.
-            if (geometry === 'vertex' && parent.nodes.length > 2) {
+            if (geometry === 'vertex') {
                 var nodes = parent.nodes,
                     i = nodes.indexOf(id);
 
@@ -30669,13 +30821,19 @@ function operationDelete(selectedIDs, context) {
                 }
 
                 nextSelectedID = nodes[i];
+                nextSelectedLoc = context.entity(nextSelectedID).loc;
             }
         }
 
         context.perform(action, operation.annotation());
 
-        if (nextSelectedID && context.hasEntity(nextSelectedID)) {
-            context.enter(modeSelect(context, [nextSelectedID]).follow(true));
+        if (nextSelectedID && nextSelectedLoc) {
+            if (context.hasEntity(nextSelectedID)) {
+                context.enter(modeSelect(context, [nextSelectedID]).follow(true));
+            } else {
+                context.map().centerEase(nextSelectedLoc);
+                context.enter(modeBrowse(context));
+            }
         } else {
             context.enter(modeBrowse(context));
         }
@@ -30896,6 +31054,156 @@ function operationMerge(selectedIDs, context) {
 }
 
 function operationMove(selectedIDs, context) {
+    var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
+    var extent = selectedIDs.reduce(function(extent, id) {
+        return extent.extend(context.entity(id).extent(context.graph()));
+    }, geoExtent());
+
+
+    var operation = function() {
+        context.enter(modeMove(context, selectedIDs));
+    };
+
+
+    operation.available = function() {
+        return selectedIDs.length > 1 ||
+            context.entity(selectedIDs[0]).type !== 'node';
+    };
+
+
+    operation.disabled = function() {
+        var reason;
+        if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
+            reason = 'too_large';
+        } else if (some(selectedIDs, context.hasHiddenConnections)) {
+            reason = 'connected_to_hidden';
+        } else if (some(selectedIDs, incompleteRelation)) {
+            reason = 'incomplete_relation';
+        }
+        return reason;
+
+        function incompleteRelation(id) {
+            var entity = context.entity(id);
+            return entity.type === 'relation' && !entity.isComplete(context.graph());
+        }
+    };
+
+
+    operation.tooltip = function() {
+        var disable = operation.disabled();
+        return disable ?
+            t('operations.move.' + disable + '.' + multi) :
+            t('operations.move.description.' + multi);
+    };
+
+
+    operation.annotation = function() {
+        return selectedIDs.length === 1 ?
+            t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
+            t('operations.move.annotation.multiple');
+    };
+
+
+    operation.id = 'move';
+    operation.keys = [t('operations.move.key')];
+    operation.title = t('operations.move.title');
+    operation.behavior = behaviorOperation(context).which(operation);
+
+    return operation;
+}
+
+function operationOrthogonalize(selectedIDs, context) {
+    var entityId = selectedIDs[0],
+        entity = context.entity(entityId),
+        extent = entity.extent(context.graph()),
+        geometry = context.geometry(entityId),
+        action = actionOrthogonalize(entityId, context.projection);
+
+
+    var operation = function() {
+        context.perform(action, operation.annotation());
+    };
+
+
+    operation.available = function() {
+        return selectedIDs.length === 1 &&
+            entity.type === 'way' &&
+            entity.isClosed() &&
+            uniq(entity.nodes).length > 2;
+    };
+
+
+    operation.disabled = function() {
+        var reason;
+        if (extent.percentContainedIn(context.extent()) < 0.8) {
+            reason = 'too_large';
+        } else if (context.hasHiddenConnections(entityId)) {
+            reason = 'connected_to_hidden';
+        }
+        return action.disabled(context.graph()) || reason;
+    };
+
+
+    operation.tooltip = function() {
+        var disable = operation.disabled();
+        return disable ?
+            t('operations.orthogonalize.' + disable) :
+            t('operations.orthogonalize.description.' + geometry);
+    };
+
+
+    operation.annotation = function() {
+        return t('operations.orthogonalize.annotation.' + geometry);
+    };
+
+
+    operation.id = 'orthogonalize';
+    operation.keys = [t('operations.orthogonalize.key')];
+    operation.title = t('operations.orthogonalize.title');
+    operation.behavior = behaviorOperation(context).which(operation);
+
+    return operation;
+}
+
+/**
+ * This method is like `_.uniq` except that it accepts `iteratee` which is
+ * invoked for each element in `array` to generate the criterion by which
+ * uniqueness is computed. The order of result values is determined by the
+ * order they occur in the array. The iteratee is invoked with one argument:
+ * (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ * @example
+ *
+ * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+ * // => [2.1, 1.2]
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+ * // => [{ 'x': 1 }, { 'x': 2 }]
+ */
+function uniqBy(array, iteratee) {
+  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
+}
+
+function operationReflectShort(selectedIDs, context) {
+    return operationReflect(selectedIDs, context, 'short');
+}
+
+
+function operationReflectLong(selectedIDs, context) {
+    return operationReflect(selectedIDs, context, 'long');
+}
+
+
+function operationReflect(selectedIDs, context, axis) {
+    axis = axis || 'long';
     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
         extent = selectedIDs.reduce(function(extent, id) {
             return extent.extend(context.entity(id).extent(context.graph()));
@@ -30903,165 +31211,15 @@ function operationMove(selectedIDs, context) {
 
 
     var operation = function() {
-        context.enter(modeMove(context, selectedIDs));
+        var action = actionReflect(selectedIDs, context.projection)
+            .useLongAxis(Boolean(axis === 'long'));
+        context.perform(action, operation.annotation());
     };
 
 
     operation.available = function() {
-        return selectedIDs.length > 1 ||
-            context.entity(selectedIDs[0]).type !== 'node';
-    };
-
-
-    operation.disabled = function() {
-        var reason;
-        if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
-            reason = 'too_large';
-        } else if (some(selectedIDs, context.hasHiddenConnections)) {
-            reason = 'connected_to_hidden';
-        } else if (some(selectedIDs, incompleteRelation)) {
-            reason = 'incomplete_relation';
-        }
-        return reason;
-
-        function incompleteRelation(id) {
-            var entity = context.entity(id);
-            return entity.type === 'relation' && !entity.isComplete(context.graph());
-        }
-    };
-
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.move.' + disable + '.' + multi) :
-            t('operations.move.description.' + multi);
-    };
-
-
-    operation.annotation = function() {
-        return selectedIDs.length === 1 ?
-            t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
-            t('operations.move.annotation.multiple');
-    };
-
-
-    operation.id = 'move';
-    operation.keys = [t('operations.move.key')];
-    operation.title = t('operations.move.title');
-    operation.behavior = behaviorOperation(context).which(operation);
-
-    return operation;
-}
-
-function operationOrthogonalize(selectedIDs, context) {
-    var entityId = selectedIDs[0],
-        entity = context.entity(entityId),
-        extent = entity.extent(context.graph()),
-        geometry = context.geometry(entityId),
-        action = actionOrthogonalize(entityId, context.projection);
-
-
-    var operation = function() {
-        context.perform(action, operation.annotation());
-    };
-
-
-    operation.available = function() {
-        return selectedIDs.length === 1 &&
-            entity.type === 'way' &&
-            entity.isClosed() &&
-            uniq(entity.nodes).length > 2;
-    };
-
-
-    operation.disabled = function() {
-        var reason;
-        if (extent.percentContainedIn(context.extent()) < 0.8) {
-            reason = 'too_large';
-        } else if (context.hasHiddenConnections(entityId)) {
-            reason = 'connected_to_hidden';
-        }
-        return action.disabled(context.graph()) || reason;
-    };
-
-
-    operation.tooltip = function() {
-        var disable = operation.disabled();
-        return disable ?
-            t('operations.orthogonalize.' + disable) :
-            t('operations.orthogonalize.description.' + geometry);
-    };
-
-
-    operation.annotation = function() {
-        return t('operations.orthogonalize.annotation.' + geometry);
-    };
-
-
-    operation.id = 'orthogonalize';
-    operation.keys = [t('operations.orthogonalize.key')];
-    operation.title = t('operations.orthogonalize.title');
-    operation.behavior = behaviorOperation(context).which(operation);
-
-    return operation;
-}
-
-/**
- * This method is like `_.uniq` except that it accepts `iteratee` which is
- * invoked for each element in `array` to generate the criterion by which
- * uniqueness is computed. The order of result values is determined by the
- * order they occur in the array. The iteratee is invoked with one argument:
- * (value).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Array
- * @param {Array} array The array to inspect.
- * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
- * @returns {Array} Returns the new duplicate free array.
- * @example
- *
- * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
- * // => [2.1, 1.2]
- *
- * // The `_.property` iteratee shorthand.
- * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
- * // => [{ 'x': 1 }, { 'x': 2 }]
- */
-function uniqBy(array, iteratee) {
-  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
-}
-
-function operationReflectShort(selectedIDs, context) {
-    return operationReflect(selectedIDs, context, 'short');
-}
-
-
-function operationReflectLong(selectedIDs, context) {
-    return operationReflect(selectedIDs, context, 'long');
-}
-
-
-function operationReflect(selectedIDs, context, axis) {
-    axis = axis || 'long';
-    var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
-        extent = selectedIDs.reduce(function(extent, id) {
-            return extent.extend(context.entity(id).extent(context.graph()));
-        }, geoExtent());
-
-
-    var operation = function() {
-        var action = actionReflect(selectedIDs, context.projection)
-            .useLongAxis(Boolean(axis === 'long'));
-        context.perform(action, operation.annotation());
-    };
-
-
-    operation.available = function() {
-        var nodes = utilGetAllNodes(selectedIDs, context.graph());
-        return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
+        var nodes = utilGetAllNodes(selectedIDs, context.graph());
+        return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
     };
 
 
@@ -31337,76 +31495,50 @@ function modeMove(context, entityIDs, baseGraph) {
         button: 'browse'
     };
 
-    var keybinding = d3keybinding('move'),
-        behaviors = [
-            behaviorEdit(context),
-            operationCircularize(entityIDs, context).behavior,
-            operationDelete(entityIDs, context).behavior,
-            operationOrthogonalize(entityIDs, context).behavior,
-            operationReflectLong(entityIDs, context).behavior,
-            operationReflectShort(entityIDs, context).behavior,
-            operationRotate(entityIDs, context).behavior
-        ],
-        annotation = entityIDs.length === 1 ?
-            t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
-            t('operations.move.annotation.multiple'),
-        prevGraph,
-        cache,
-        origin,
-        nudgeInterval;
-
-
-    function vecSub(a, b) {
-        return [a[0] - b[0], a[1] - b[1]];
-    }
-
+    var keybinding = d3keybinding('move');
+    var behaviors = [
+        behaviorEdit(context),
+        operationCircularize(entityIDs, context).behavior,
+        operationDelete(entityIDs, context).behavior,
+        operationOrthogonalize(entityIDs, context).behavior,
+        operationReflectLong(entityIDs, context).behavior,
+        operationReflectShort(entityIDs, context).behavior,
+        operationRotate(entityIDs, context).behavior
+    ];
+    var annotation = entityIDs.length === 1 ?
+        t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
+        t('operations.move.annotation.multiple');
 
-    function edge(point, size) {
-        var pad = [80, 20, 50, 20],   // top, right, bottom, left
-            x = 0,
-            y = 0;
-
-        if (point[0] > size[0] - pad[1])
-            x = -10;
-        if (point[0] < pad[3])
-            x = 10;
-        if (point[1] > size[1] - pad[2])
-            y = -10;
-        if (point[1] < pad[0])
-            y = 10;
-
-        if (x || y) {
-            return [x, y];
-        } else {
-            return null;
-        }
-    }
+    var _prevGraph;
+    var _cache;
+    var _origin;
+    var _nudgeInterval;
 
 
     function doMove(nudge) {
         nudge = nudge || [0, 0];
 
         var fn;
-        if (prevGraph !== context.graph()) {
-            cache = {};
-            origin = context.map().mouseCoordinates();
+        if (_prevGraph !== context.graph()) {
+            _cache = {};
+            _origin = context.map().mouseCoordinates();
             fn = context.perform;
         } else {
             fn = context.overwrite;
         }
 
-        var currMouse = context.mouse(),
-            origMouse = context.projection(origin),
-            delta = vecSub(vecSub(currMouse, origMouse), nudge);
+        var currMouse = context.mouse();
+        var origMouse = context.projection(_origin);
+        var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
 
-        fn(actionMove(entityIDs, delta, context.projection, cache), annotation);
-        prevGraph = context.graph();
+        fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
+        _prevGraph = context.graph();
     }
 
 
     function startNudge(nudge) {
-        if (nudgeInterval) window.clearInterval(nudgeInterval);
-        nudgeInterval = window.setInterval(function() {
+        if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+        _nudgeInterval = window.setInterval(function() {
             context.pan(nudge);
             doMove(nudge);
         }, 50);
@@ -31414,16 +31546,16 @@ function modeMove(context, entityIDs, baseGraph) {
 
 
     function stopNudge() {
-        if (nudgeInterval) {
-            window.clearInterval(nudgeInterval);
-            nudgeInterval = null;
+        if (_nudgeInterval) {
+            window.clearInterval(_nudgeInterval);
+            _nudgeInterval = null;
         }
     }
 
 
     function move() {
         doMove();
-        var nudge = edge(context.mouse(), context.map().dimensions());
+        var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
         if (nudge) {
             startNudge(nudge);
         } else {
@@ -31457,9 +31589,9 @@ function modeMove(context, entityIDs, baseGraph) {
 
 
     mode.enter = function() {
-        origin = context.map().mouseCoordinates();
-        prevGraph = null;
-        cache = {};
+        _origin = context.map().mouseCoordinates();
+        _prevGraph = null;
+        _cache = {};
 
         behaviors.forEach(function(behavior) {
             context.install(behavior);
@@ -31499,6 +31631,13 @@ function modeMove(context, entityIDs, baseGraph) {
     };
 
 
+    mode.selectedIDs = function() {
+        if (!arguments.length) return entityIDs;
+        // no assign
+        return mode;
+    };
+
+
     return mode;
 }
 
@@ -31508,66 +31647,67 @@ function modeRotate(context, entityIDs) {
         button: 'browse'
     };
 
-    var keybinding = d3keybinding('rotate'),
-        behaviors = [
-            behaviorEdit(context),
-            operationCircularize(entityIDs, context).behavior,
-            operationDelete(entityIDs, context).behavior,
-            operationMove(entityIDs, context).behavior,
-            operationOrthogonalize(entityIDs, context).behavior,
-            operationReflectLong(entityIDs, context).behavior,
-            operationReflectShort(entityIDs, context).behavior
-        ],
-        annotation = entityIDs.length === 1 ?
-            t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
-            t('operations.rotate.annotation.multiple'),
-        prevGraph,
-        prevAngle,
-        prevTransform,
-        pivot;
+    var keybinding = d3keybinding('rotate');
+    var behaviors = [
+        behaviorEdit(context),
+        operationCircularize(entityIDs, context).behavior,
+        operationDelete(entityIDs, context).behavior,
+        operationMove(entityIDs, context).behavior,
+        operationOrthogonalize(entityIDs, context).behavior,
+        operationReflectLong(entityIDs, context).behavior,
+        operationReflectShort(entityIDs, context).behavior
+    ];
+    var annotation = entityIDs.length === 1 ?
+        t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
+        t('operations.rotate.annotation.multiple');
+
+    var _prevGraph;
+    var _prevAngle;
+    var _prevTransform;
+    var _pivot;
 
 
     function doRotate() {
         var fn;
-        if (context.graph() !== prevGraph) {
+        if (context.graph() !== _prevGraph) {
             fn = context.perform;
         } else {
             fn = context.replace;
         }
 
-        // projection changed, recalculate pivot
+        // projection changed, recalculate _pivot
         var projection = context.projection;
         var currTransform = projection.transform();
-        if (!prevTransform ||
-            currTransform.k !== prevTransform.k ||
-            currTransform.x !== prevTransform.x ||
-            currTransform.y !== prevTransform.y) {
+        if (!_prevTransform ||
+            currTransform.k !== _prevTransform.k ||
+            currTransform.x !== _prevTransform.x ||
+            currTransform.y !== _prevTransform.y) {
 
-            var nodes = utilGetAllNodes(entityIDs, context.graph()),
-                points = nodes.map(function(n) { return projection(n.loc); });
+            var nodes = utilGetAllNodes(entityIDs, context.graph());
+            var points = nodes.map(function(n) { return projection(n.loc); });
 
             if (points.length === 1) {  // degenerate case
-                pivot = points[0];
+                _pivot = points[0];
             } else if (points.length === 2) {
-                pivot = geoInterp(points[0], points[1], 0.5);
+                _pivot = geoVecInterp(points[0], points[1], 0.5);
             } else {
-                pivot = d3_polygonCentroid(d3_polygonHull(points));
+                _pivot = d3_polygonCentroid(d3_polygonHull(points));
             }
-            prevAngle = undefined;
+            _prevAngle = undefined;
         }
 
 
-        var currMouse = context.mouse(),
-            currAngle = Math.atan2(currMouse[1] - pivot[1], currMouse[0] - pivot[0]);
+        var currMouse = context.mouse();
+        var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
 
-        if (typeof prevAngle === 'undefined') prevAngle = currAngle;
-        var delta = currAngle - prevAngle;
+        if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
+        var delta = currAngle - _prevAngle;
 
-        fn(actionRotate(entityIDs, pivot, delta, projection), annotation);
+        fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
 
-        prevTransform = currTransform;
-        prevAngle = currAngle;
-        prevGraph = context.graph();
+        _prevTransform = currTransform;
+        _prevAngle = currAngle;
+        _prevGraph = context.graph();
     }
 
 
@@ -31625,6 +31765,13 @@ function modeRotate(context, entityIDs) {
     };
 
 
+    mode.selectedIDs = function() {
+        if (!arguments.length) return entityIDs;
+        // no assign
+        return mode;
+    };
+
+
     return mode;
 }
 
@@ -31694,17 +31841,31 @@ function reduce(collection, iteratee, accumulator) {
   return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
 }
 
+var _isSaving = false;
+
+
 function modeSave(context) {
-    var mode = {
-        id: 'save'
-    };
+    var mode = { id: 'save' };
+    var keybinding = d3keybinding('modeSave');
 
-    var keybinding = d3keybinding('select');
+    var loading = uiLoading(context)
+        .message(t('save.uploading'))
+        .blocking(true);
 
     var commit = uiCommit(context)
         .on('cancel', cancel)
         .on('save', save);
 
+    var _toCheck = [];
+    var _toLoad = [];
+    var _loaded = {};
+    var _toLoadCount = 0;
+    var _toLoadTotal = 0;
+
+    var _conflicts = [];
+    var _errors = [];
+    var _origChanges;
+
 
     function cancel(selectedID) {
         if (selectedID) {
@@ -31715,42 +31876,85 @@ function modeSave(context) {
     }
 
 
-    function save(changeset, tryAgain) {
+    function save(changeset, tryAgain, checkConflicts) {
+        // Guard against accidentally entering save code twice - #4641
+        if (_isSaving && !tryAgain) {
+            return;
+        }
 
-        var osm = context.connection(),
-            loading = uiLoading(context).message(t('save.uploading')).blocking(true),
-            history = context.history(),
-            origChanges = history.changes(actionDiscardTags(history.difference())),
-            localGraph = context.graph(),
-            remoteGraph = coreGraph(history.base(), true),
-            modified = filter(history.difference().summary(), {changeType: 'modified'}),
-            toCheck = map$4(map$4(modified, 'entity'), 'id'),
-            toLoad = withChildNodes(toCheck, localGraph),
-            conflicts = [],
-            errors = [];
+        var osm = context.connection();
+        if (!osm) {
+            cancel();
+            return;
+        }
 
-        if (!osm) return;
+        // If user somehow got logged out mid-save, try to reauthenticate..
+        // This can happen if they were logged in from before, but the tokens are no longer valid.
+        if (!osm.authenticated()) {
+            osm.authenticate(function(err) {
+                if (err) {
+                    cancel();   // quit save mode..
+                } else {
+                    save(changeset, tryAgain, checkConflicts);  // continue where we left off..
+                }
+            });
+            return;
+        }
+
+        if (!_isSaving) {
+            keybindingOff();
+            context.container().call(loading);  // block input
+            _isSaving = true;
+        }
+
+        var history = context.history();
+        var localGraph = context.graph();
+        var remoteGraph = coreGraph(history.base(), true);
+
+        _conflicts = [];
+        _errors = [];
 
+        // Store original changes, in case user wants to download them as an .osc file
+        _origChanges = history.changes(actionDiscardTags(history.difference()));
+
+        // First time, `history.perform` a no-op action.
+        // Any conflict resolutions will be done as `history.replace`
         if (!tryAgain) {
-            history.perform(actionNoop());  // checkpoint
+            history.perform(actionNoop());
         }
 
-        context.container().call(loading);
+        // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
+        if (!checkConflicts) {
+            upload(changeset);
 
-        if (toCheck.length) {
-            osm.loadMultiple(toLoad, loaded);
+        // Do the full (slow) conflict check..
         } else {
-            upload();
+            var modified = filter(history.difference().summary(), { changeType: 'modified' });
+            _toCheck = map$4(map$4(modified, 'entity'), 'id');
+            _toLoad = withChildNodes(_toCheck, localGraph);
+            _loaded = {};
+            _toLoadCount = 0;
+            _toLoadTotal = _toLoad.length;
+
+            if (_toCheck.length) {
+                showProgress(_toLoadCount, _toLoadTotal);
+                _toLoad.forEach(function(id) { _loaded[id] = false; });
+                osm.loadMultiple(_toLoad, loaded);
+            } else {
+                upload(changeset);
+            }
         }
 
+        return;
+
 
         function withChildNodes(ids, graph) {
             return uniq(reduce(ids, function(result, id) {
                 var entity = graph.entity(id);
                 if (entity.type === 'way') {
                     try {
-                        var cn = graph.childNodes(entity);
-                        result.push.apply(result, map$4(filter(cn, 'version'), 'id'));
+                        var children = graph.childNodes(entity);
+                        result.push.apply(result, map$4(filter(children, 'version'), 'id'));
                     } catch (err) {
                         /* eslint-disable no-console */
                         if (typeof console !== 'undefined') console.error(err);
@@ -31764,46 +31968,64 @@ function modeSave(context) {
 
         // Reload modified entities into an alternate graph and check for conflicts..
         function loaded(err, result) {
-            if (errors.length) return;
+            if (_errors.length) return;
 
             if (err) {
-                errors.push({
-                    msg: err.responseText,
+                _errors.push({
+                    msg: err.message || err.responseText,
                     details: [ t('save.status_code', { code: err.status }) ]
                 });
                 showErrors();
 
             } else {
                 var loadMore = [];
-                forEach(result.data, function(entity) {
+
+                result.data.forEach(function(entity) {
                     remoteGraph.replace(entity);
-                    toLoad = without(toLoad, entity.id);
+                    _loaded[entity.id] = true;
+                    _toLoad = without(_toLoad, entity.id);
+
+                    if (!entity.visible) return;
 
                     // Because loadMultiple doesn't download /full like loadEntity,
                     // need to also load children that aren't already being checked..
-                    if (!entity.visible) return;
+                    var i, id;
                     if (entity.type === 'way') {
-                        loadMore.push.apply(loadMore,
-                            difference(entity.nodes, toCheck, toLoad, loadMore));
+                        for (i = 0; i < entity.nodes.length; i++) {
+                            id = entity.nodes[i];
+                            if (_loaded[id] === undefined) {
+                                _loaded[id] = false;
+                                loadMore.push(id);
+                            }
+                        }
                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
-                        loadMore.push.apply(loadMore,
-                            difference(map$4(entity.members, 'id'), toCheck, toLoad, loadMore));
+                        for (i = 0; i < entity.members.length; i++) {
+                            id = entity.members[i].id;
+                            if (_loaded[id] === undefined) {
+                                _loaded[id] = false;
+                                loadMore.push(id);
+                            }
+                        }
                     }
                 });
 
+                _toLoadCount += result.data.length;
+                _toLoadTotal += loadMore.length;
+                showProgress(_toLoadCount, _toLoadTotal);
+
                 if (loadMore.length) {
-                    toLoad.push.apply(toLoad, loadMore);
+                    _toLoad.push.apply(_toLoad, loadMore);
                     osm.loadMultiple(loadMore, loaded);
                 }
 
-                if (!toLoad.length) {
-                    checkConflicts();
+                if (!_toLoad.length) {
+                    detectConflicts();
                 }
             }
         }
 
 
-        function checkConflicts() {
+        function detectConflicts() {
             function choice(id, text, action) {
                 return { id: id, text: text, action: function() { history.replace(action); } };
             }
@@ -31814,16 +32036,14 @@ function modeSave(context) {
                 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
             }
 
-            function compareVersions(local, remote) {
+            function sameVersions(local, remote) {
                 if (local.version !== remote.version) return false;
 
                 if (local.type === 'way') {
                     var children = union(local.nodes, remote.nodes);
-
                     for (var i = 0; i < children.length; i++) {
-                        var a = localGraph.hasEntity(children[i]),
-                            b = remoteGraph.hasEntity(children[i]);
-
+                        var a = localGraph.hasEntity(children[i]);
+                        var b = remoteGraph.hasEntity(children[i]);
                         if (a && b && a.version !== b.version) return false;
                     }
                 }
@@ -31831,26 +32051,26 @@ function modeSave(context) {
                 return true;
             }
 
-            forEach(toCheck, function(id) {
-                var local = localGraph.entity(id),
-                    remote = remoteGraph.entity(id);
+            _toCheck.forEach(function(id) {
+                var local = localGraph.entity(id);
+                var remote = remoteGraph.entity(id);
 
-                if (compareVersions(local, remote)) return;
+                if (sameVersions(local, remote)) return;
 
-                var action = actionMergeRemoteChanges,
-                    merge = action(id, localGraph, remoteGraph, formatUser);
+                var action = actionMergeRemoteChanges;
+                var merge = action(id, localGraph, remoteGraph, formatUser);
 
                 history.replace(merge);
 
                 var mergeConflicts = merge.conflicts();
                 if (!mergeConflicts.length) return;  // merged safely
 
-                var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local'),
-                    forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote'),
-                    keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore')),
-                    keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
+                var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
+                var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
+                var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
+                var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
 
-                conflicts.push({
+                _conflicts.push({
                     id: id,
                     name: entityName(local),
                     details: mergeConflicts,
@@ -31862,163 +32082,206 @@ function modeSave(context) {
                 });
             });
 
-            upload();
+            upload(changeset);
         }
+    }
 
 
-        function upload() {
-            if (conflicts.length) {
-                conflicts.sort(function(a,b) { return b.id.localeCompare(a.id); });
-                showConflicts();
-            } else if (errors.length) {
-                showErrors();
-            } else {
-                var changes = history.changes(actionDiscardTags(history.difference()));
-                if (changes.modified.length || changes.created.length || changes.deleted.length) {
-                    osm.putChangeset(changeset, changes, uploadCallback);
-                } else {        // changes were insignificant or reverted by user
-                    d3_select('.inspector-wrap *').remove();
-                    loading.close();
-                    context.flush();
-                    cancel();
-                }
+    function upload(changeset) {
+        var osm = context.connection();
+        if (!osm) {
+            _errors.push({ msg: 'No OSM Service' });
+        }
+
+        if (_conflicts.length) {
+            _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
+            showConflicts(changeset);
+
+        } else if (_errors.length) {
+            showErrors();
+
+        } else {
+            var history = context.history();
+            var changes = history.changes(actionDiscardTags(history.difference()));
+            if (changes.modified.length || changes.created.length || changes.deleted.length) {
+                osm.putChangeset(changeset, changes, uploadCallback);
+            } else {        // changes were insignificant or reverted by user
+                d3_select('.inspector-wrap *').remove();
+                loading.close();
+                _isSaving = false;
+                context.flush();
+                cancel();
             }
         }
+    }
 
 
-        function uploadCallback(err, changeset) {
-            if (err) {
-                errors.push({
-                    msg: err.responseText,
+    function uploadCallback(err, changeset) {
+        if (err) {
+            if (err.status === 409) {          // 409 Conflict
+                save(changeset, true, true);   // tryAgain = true, checkConflicts = true
+            } else {
+                _errors.push({
+                    msg: err.message || err.responseText,
                     details: [ t('save.status_code', { code: err.status }) ]
                 });
                 showErrors();
-            } else {
-                history.clearSaved();
-                success(changeset);
-                // Add delay to allow for postgres replication #1646 #2678
-                window.setTimeout(function() {
-                    d3_select('.inspector-wrap *').remove();
-                    loading.close();
-                    context.flush();
-                }, 2500);
             }
+
+        } else {
+            context.history().clearSaved();
+            success(changeset);
+            // Add delay to allow for postgres replication #1646 #2678
+            window.setTimeout(function() {
+                d3_select('.inspector-wrap *').remove();
+                loading.close();
+                _isSaving = false;
+                context.flush();
+            }, 2500);
         }
+    }
 
 
-        function showConflicts() {
-            var selection = context.container()
-                .select('#sidebar')
-                .append('div')
-                .attr('class','sidebar-component');
+    function showProgress(num, total) {
+        var modal = context.container().select('.loading-modal .modal-section');
+        var progress = modal.selectAll('.progress')
+            .data([0]);
 
-            loading.close();
+        // enter/update
+        progress.enter()
+            .append('div')
+            .attr('class', 'progress')
+            .merge(progress)
+            .text(t('save.conflict_progress', { num: num, total: total }));
+    }
 
-            selection.call(uiConflicts(context)
-                .list(conflicts)
-                .origChanges(origChanges)
-                .on('cancel', function() {
-                    history.pop();
-                    selection.remove();
-                })
-                .on('save', function() {
-                    for (var i = 0; i < conflicts.length; i++) {
-                        if (conflicts[i].chosen === 1) {  // user chose "keep theirs"
-                            var entity = context.hasEntity(conflicts[i].id);
-                            if (entity && entity.type === 'way') {
-                                var children = uniq(entity.nodes);
-                                for (var j = 0; j < children.length; j++) {
-                                    history.replace(actionRevert(children[j]));
-                                }
+
+    function showConflicts(changeset) {
+        var history = context.history();
+        var selection = context.container()
+            .select('#sidebar')
+            .append('div')
+            .attr('class','sidebar-component');
+
+        loading.close();
+        _isSaving = false;
+
+        var ui = uiConflicts(context)
+            .conflictList(_conflicts)
+            .origChanges(_origChanges)
+            .on('cancel', function() {
+                history.pop();
+                selection.remove();
+                keybindingOn();
+            })
+            .on('save', function() {
+                for (var i = 0; i < _conflicts.length; i++) {
+                    if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
+                        var entity = context.hasEntity(_conflicts[i].id);
+                        if (entity && entity.type === 'way') {
+                            var children = uniq(entity.nodes);
+                            for (var j = 0; j < children.length; j++) {
+                                history.replace(actionRevert(children[j]));
                             }
-                            history.replace(actionRevert(conflicts[i].id));
                         }
+                        history.replace(actionRevert(_conflicts[i].id));
                     }
+                }
 
-                    selection.remove();
-                    save(changeset, true);
-                })
-            );
-        }
-
+                selection.remove();
+                save(changeset, true, false);  // tryAgain = true, checkConflicts = false
+            });
 
-        function showErrors() {
-            var selection = uiConfirm(context.container());
+        selection.call(ui);
+    }
 
-            history.pop();
-            loading.close();
 
-            selection
-                .select('.modal-section.header')
-                .append('h3')
-                .text(t('save.error'));
+    function showErrors() {
+        keybindingOn();
+        context.history().pop();
+        loading.close();
+        _isSaving = false;
 
-            addErrors(selection, errors);
-            selection.okButton();
-        }
+        var selection = uiConfirm(context.container());
+        selection
+            .select('.modal-section.header')
+            .append('h3')
+            .text(t('save.error'));
 
+        addErrors(selection, _errors);
+        selection.okButton();
+    }
 
-        function addErrors(selection, data) {
-            var message = selection
-                .select('.modal-section.message-text');
 
-            var items = message
-                .selectAll('.error-container')
-                .data(data);
+    function addErrors(selection, data) {
+        var message = selection
+            .select('.modal-section.message-text');
 
-            var enter = items.enter()
-                .append('div')
-                .attr('class', 'error-container');
+        var items = message
+            .selectAll('.error-container')
+            .data(data);
 
-            enter
-                .append('a')
-                .attr('class', 'error-description')
-                .attr('href', '#')
-                .classed('hide-toggle', true)
-                .text(function(d) { return d.msg || t('save.unknown_error_details'); })
-                .on('click', function() {
-                    var error = d3_select(this),
-                        detail = d3_select(this.nextElementSibling),
-                        exp = error.classed('expanded');
+        var enter = items.enter()
+            .append('div')
+            .attr('class', 'error-container');
 
-                    detail.style('display', exp ? 'none' : 'block');
-                    error.classed('expanded', !exp);
+        enter
+            .append('a')
+            .attr('class', 'error-description')
+            .attr('href', '#')
+            .classed('hide-toggle', true)
+            .text(function(d) { return d.msg || t('save.unknown_error_details'); })
+            .on('click', function() {
+                event.preventDefault();
 
-                    event.preventDefault();
-                });
+                var error = d3_select(this);
+                var detail = d3_select(this.nextElementSibling);
+                var exp = error.classed('expanded');
 
-            var details = enter
-                .append('div')
-                .attr('class', 'error-detail-container')
-                .style('display', 'none');
+                detail.style('display', exp ? 'none' : 'block');
+                error.classed('expanded', !exp);
+            });
 
-            details
-                .append('ul')
-                .attr('class', 'error-detail-list')
-                .selectAll('li')
-                .data(function(d) { return d.details || []; })
-                .enter()
-                .append('li')
-                .attr('class', 'error-detail-item')
-                .text(function(d) { return d; });
+        var details = enter
+            .append('div')
+            .attr('class', 'error-detail-container')
+            .style('display', 'none');
 
-            items.exit()
-                .remove();
-        }
+        details
+            .append('ul')
+            .attr('class', 'error-detail-list')
+            .selectAll('li')
+            .data(function(d) { return d.details || []; })
+            .enter()
+            .append('li')
+            .attr('class', 'error-detail-item')
+            .text(function(d) { return d; });
 
+        items.exit()
+            .remove();
     }
 
 
     function success(changeset) {
         commit.reset();
-        context.enter(modeBrowse(context)
-            .sidebar(uiSuccess(context)
-                .changeset(changeset)
-                .on('cancel', function() {
-                    context.ui().sidebar.hide();
-                })
-            )
-        );
+
+        var ui = uiSuccess(context)
+            .changeset(changeset)
+            .on('cancel', function() { context.ui().sidebar.hide(); });
+
+        context.enter(modeBrowse(context).sidebar(ui));
+    }
+
+
+    function keybindingOn() {
+        d3_select(document)
+            .call(keybinding.on('⎋', cancel, true));
+    }
+
+
+    function keybindingOff() {
+        d3_select(document)
+            .call(keybinding.off);
     }
 
 
@@ -32027,17 +32290,16 @@ function modeSave(context) {
             context.ui().sidebar.show(commit);
         }
 
-        keybinding
-            .on('⎋', cancel, true);
-
-        d3_select(document)
-            .call(keybinding);
+        keybindingOn();
 
         context.container().selectAll('#content')
             .attr('class', 'inactive');
 
         var osm = context.connection();
-        if (!osm) return;
+        if (!osm) {
+            cancel();
+            return;
+        }
 
         if (osm.authenticated()) {
             done();
@@ -32054,7 +32316,9 @@ function modeSave(context) {
 
 
     mode.exit = function() {
-        keybinding.off();
+        _isSaving = false;
+
+        keybindingOff();
 
         context.container().selectAll('#content')
             .attr('class', 'active');
@@ -32243,7 +32507,7 @@ function modeSelect(context, selectedIDs) {
             behaviorHover(context),
             behaviorSelect(context),
             behaviorLasso(context),
-            modeDragNode(context).selectedIDs(selectedIDs).behavior
+            modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior
         ],
         inspector,
         editMenu,
@@ -32425,13 +32689,16 @@ function modeSelect(context, selectedIDs) {
 
 
         function dblclick() {
-            var target = d3_select(event.target),
-                datum = target.datum();
+            var target = d3_select(event.target);
 
-            if (datum instanceof osmWay && !target.classed('fill')) {
-                var choice = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection),
-                    prev = datum.nodes[choice.index - 1],
-                    next = datum.nodes[choice.index];
+            var datum = target.datum();
+            var entity = datum && datum.properties && datum.properties.entity;
+            if (!entity) return;
+
+            if (entity instanceof osmWay && target.classed('target')) {
+                var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
+                var prev = entity.nodes[choice.index - 1];
+                var next = entity.nodes[choice.index];
 
                 context.perform(
                     actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
@@ -32441,9 +32708,9 @@ function modeSelect(context, selectedIDs) {
                 event.preventDefault();
                 event.stopPropagation();
 
-            } else if (datum.type === 'midpoint') {
+            } else if (entity.type === 'midpoint') {
                 context.perform(
-                    actionAddMidpoint({loc: datum.loc, edge: datum.edge}, osmNode()),
+                    actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
                     t('operations.add.annotation.vertex'));
 
                 event.preventDefault();
@@ -33015,17 +33282,18 @@ function behaviorCopy(context) {
  */
 
 function behaviorDrag() {
-    var event$$1 = dispatch('start', 'move', 'end'),
-        origin = null,
-        selector = '',
-        filter = null,
-        event_, target, surface;
-
-
-    var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect'),
-        d3_event_userSelectSuppress = function() {
-            var selection$$1 = selection(),
-                select$$1 = selection$$1.style(d3_event_userSelectProperty);
+    var dispatch$$1 = dispatch('start', 'move', 'end');
+    var _origin = null;
+    var _selector = '';
+    var _event;
+    var _target;
+    var _surface;
+
+
+    var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
+    var d3_event_userSelectSuppress = function() {
+            var selection$$1 = selection();
+            var select$$1 = selection$$1.style(d3_event_userSelectProperty);
             selection$$1.style(d3_event_userSelectProperty, 'none');
             return function() {
                 selection$$1.style(d3_event_userSelectProperty, select$$1);
@@ -33042,29 +33310,29 @@ function behaviorDrag() {
     function eventOf(thiz, argumentz) {
         return function(e1) {
             e1.target = drag;
-            customEvent(e1, event$$1.apply, event$$1, [e1.type, thiz, argumentz]);
+            customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
         };
     }
 
 
     function dragstart() {
-        target = this;
-        event_ = eventOf(target, arguments);
+        _target = this;
+        _event = eventOf(_target, arguments);
 
-        var eventTarget = event.target,
-            touchId = event.touches ? event.changedTouches[0].identifier : null,
-            offset,
-            origin_ = point(),
-            started = false,
-            selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
+        var eventTarget = event.target;
+        var touchId = event.touches ? event.changedTouches[0].identifier : null;
+        var offset;
+        var startOrigin = point();
+        var started = false;
+        var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
 
         d3_select(window)
             .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
             .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
 
-        if (origin) {
-            offset = origin.apply(target, arguments);
-            offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
+        if (_origin) {
+            offset = _origin.apply(_target, arguments);
+            offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
         } else {
             offset = [0, 0];
         }
@@ -33075,7 +33343,7 @@ function behaviorDrag() {
 
 
         function point() {
-            var p = surface || target.parentNode;
+            var p = _surface || _target.parentNode;
             return touchId !== null ? d3_touches(p).filter(function(p) {
                 return p.identifier === touchId;
             })[0] : d3_mouse(p);
@@ -33083,32 +33351,32 @@ function behaviorDrag() {
 
 
         function dragmove() {
-            var p = point(),
-                dx = p[0] - origin_[0],
-                dy = p[1] - origin_[1];
+            var p = point();
+            var dx = p[0] - startOrigin[0];
+            var dy = p[1] - startOrigin[1];
 
             if (dx === 0 && dy === 0)
                 return;
 
+            startOrigin = p;
+            d3_eventCancel();
+
             if (!started) {
                 started = true;
-                event_({ type: 'start' });
+                _event({ type: 'start' });
+            } else {
+                _event({
+                    type: 'move',
+                    point: [p[0] + offset[0],  p[1] + offset[1]],
+                    delta: [dx, dy]
+                });
             }
-
-            origin_ = p;
-            d3_eventCancel();
-
-            event_({
-                type: 'move',
-                point: [p[0] + offset[0],  p[1] + offset[1]],
-                delta: [dx, dy]
-            });
         }
 
 
         function dragend() {
             if (started) {
-                event_({ type: 'end' });
+                _event({ type: 'end' });
 
                 d3_eventCancel();
                 if (event.target === eventTarget) {
@@ -33134,52 +33402,46 @@ function behaviorDrag() {
 
 
     function drag(selection$$1) {
-        var matchesSelector = utilPrefixDOMProperty('matchesSelector'),
-            delegate = dragstart;
+        var matchesSelector = utilPrefixDOMProperty('matchesSelector');
+        var delegate = dragstart;
 
-        if (selector) {
+        if (_selector) {
             delegate = function() {
-                var root = this,
-                    target = event.target;
+                var root = this;
+                var target = event.target;
                 for (; target && target !== root; target = target.parentNode) {
-                    if (target[matchesSelector](selector) &&
-                            (!filter || filter(target.__data__))) {
-                        return dragstart.call(target, target.__data__);
+                    var datum = target.__data__;
+                    var entity = datum && datum.properties && datum.properties.entity;
+                    if (entity && target[matchesSelector](_selector)) {
+                        return dragstart.call(target, entity);
                     }
                 }
             };
         }
 
         selection$$1
-            .on('mousedown.drag' + selector, delegate)
-            .on('touchstart.drag' + selector, delegate);
+            .on('mousedown.drag' + _selector, delegate)
+            .on('touchstart.drag' + _selector, delegate);
     }
 
 
     drag.off = function(selection$$1) {
         selection$$1
-            .on('mousedown.drag' + selector, null)
-            .on('touchstart.drag' + selector, null);
+            .on('mousedown.drag' + _selector, null)
+            .on('touchstart.drag' + _selector, null);
     };
 
 
     drag.selector = function(_) {
-        if (!arguments.length) return selector;
-        selector = _;
-        return drag;
-    };
-
-
-    drag.filter = function(_) {
-        if (!arguments.length) return origin;
-        filter = _;
+        if (!arguments.length) return _selector;
+        _selector = _;
         return drag;
     };
 
 
     drag.origin = function (_) {
-        if (!arguments.length) return origin;
-        origin = _;
+        if (!arguments.length) return _origin;
+        _origin = _;
         return drag;
     };
 
@@ -33193,86 +33455,131 @@ function behaviorDrag() {
 
 
     drag.target = function() {
-        if (!arguments.length) return target;
-        target = arguments[0];
-        event_ = eventOf(target, Array.prototype.slice.call(arguments, 1));
+        if (!arguments.length) return _target;
+        _target = arguments[0];
+        _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
         return drag;
     };
 
 
     drag.surface = function() {
-        if (!arguments.length) return surface;
-        surface = arguments[0];
+        if (!arguments.length) return _surface;
+        _surface = arguments[0];
         return drag;
     };
 
 
-    return utilRebind(drag, event$$1, 'on');
+    return utilRebind(drag, dispatch$$1, 'on');
 }
 
 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
+    var origWay = context.entity(wayId);
+    var annotation = t((origWay.isDegenerate() ?
+        'operations.start.annotation.' :
+        'operations.continue.annotation.') + context.geometry(wayId)
+    );
+    var behavior = behaviorDraw(context);
+    var _tempEdits = 0;
 
-    var origWay = context.entity(wayId),
-        isArea = context.geometry(wayId) === 'area',
-        tempEdits = 0,
-        annotation = t((origWay.isDegenerate() ?
-            'operations.start.annotation.' :
-            'operations.continue.annotation.') + context.geometry(wayId)),
-        draw = behaviorDraw(context),
-        startIndex,
-        start,
-        end,
-        segment;
-
-
-    // initialize the temporary drawing entities
-    if (!isArea) {
-        startIndex = typeof index === 'undefined' ? origWay.nodes.length - 1 : 0;
-        start = osmNode({ id: 'nStart', loc: context.entity(origWay.nodes[startIndex]).loc });
-        end = osmNode({ id: 'nEnd', loc: context.map().mouseCoordinates() });
-        segment = osmWay({ id: 'wTemp',
-            nodes: typeof index === 'undefined' ? [start.id, end.id] : [end.id, start.id],
-            tags: clone(origWay.tags)
-        });
-    } else {
-        end = osmNode({ loc: context.map().mouseCoordinates() });
-    }
+    var end = osmNode({ loc: context.map().mouseCoordinates() });
 
     // Push an annotated state for undo to return back to.
     // We must make sure to remove this edit later.
     context.perform(actionNoop(), annotation);
-    tempEdits++;
+    _tempEdits++;
 
-    // Add the temporary drawing entities to the graph.
+    // Add the drawing node to the graph.
     // We must make sure to remove this edit later.
-    context.perform(AddDrawEntities());
-    tempEdits++;
+    context.perform(_actionAddDrawNode());
+    _tempEdits++;
 
 
-    function move(datum) {
-        var loc;
 
-        if (datum.type === 'node' && datum.id !== end.id) {
-            loc = datum.loc;
+    function keydown() {
+        if (event.keyCode === d3keybinding.modifierCodes.alt) {
+            if (context.surface().classed('nope')) {
+                context.surface()
+                    .classed('nope-suppressed', true);
+            }
+            context.surface()
+                .classed('nope', false)
+                .classed('nope-disabled', true);
+        }
+    }
 
-        } else if (datum.type === 'way') {
-            var dims = context.map().dimensions(),
-                mouse = context.mouse(),
-                pad = 5,
-                trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
-                    mouse[1] > pad && mouse[1] < dims[1] - pad;
 
-            if (trySnap) {
-                loc = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc;
+    function keyup() {
+        if (event.keyCode === d3keybinding.modifierCodes.alt) {
+            if (context.surface().classed('nope-suppressed')) {
+                context.surface()
+                    .classed('nope', true);
             }
+            context.surface()
+                .classed('nope-suppressed', false)
+                .classed('nope-disabled', false);
         }
+    }
+
+
+    // related code
+    // - `mode/drag_node.js`     `doMode()`
+    // - `behavior/draw.js`      `click()`
+    // - `behavior/draw_way.js`  `move()`
+    function move(datum) {
+        context.surface().classed('nope-disabled', event.altKey);
+
+        var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
+        var targetNodes = datum && datum.properties && datum.properties.nodes;
+        var loc = context.map().mouseCoordinates();
 
-        if (!loc) {
-            loc = context.map().mouseCoordinates();
+        if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
+            loc = targetLoc;
+
+        } else if (targetNodes) {   // snap to way - a line target with `.nodes`
+            var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
+            if (choice) {
+                loc = choice.loc;
+            }
         }
 
         context.replace(actionMoveNode(end.id, loc));
         end = context.entity(end.id);
+        checkGeometry(origWay.isClosed());    // skipLast = true when drawing areas
+    }
+
+
+    // Check whether this edit causes the geometry to break.
+    // If so, class the surface with a nope cursor.
+    // `skipLast` - include closing segment in the check, see #4655
+    function checkGeometry(skipLast) {
+        var nopeDisabled = context.surface().classed('nope-disabled');
+        var isInvalid = isInvalidGeometry(end, context.graph(), skipLast);
+
+        if (nopeDisabled) {
+            context.surface()
+                .classed('nope', false)
+                .classed('nope-suppressed', isInvalid);
+        } else {
+            context.surface()
+                .classed('nope', isInvalid)
+                .classed('nope-suppressed', false);
+        }
+    }
+
+
+    function isInvalidGeometry(entity, graph, skipLast) {
+        var parents = graph.parentWays(entity);
+
+        for (var i = 0; i < parents.length; i++) {
+            var parent = parents[i];
+            var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
+            if (skipLast)  nodes.pop();   // disregard closing segment - #4655
+            if (geoHasSelfIntersections(nodes, entity.id)) {
+                return true;
+            }
+        }
+
+        return false;
     }
 
 
@@ -33280,7 +33587,7 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
         // Undo popped the history back to the initial annotated no-op edit.
         // Remove initial no-op edit and whatever edit happened immediately before it.
         context.pop(2);
-        tempEdits = 0;
+        _tempEdits = 0;
 
         if (context.hasEntity(wayId)) {
             context.enter(mode);
@@ -33291,14 +33598,14 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
 
 
     function setActiveElements() {
-        var active = isArea ? [wayId, end.id] : [segment.id, start.id, end.id];
-        context.surface().selectAll(utilEntitySelector(active))
+        context.surface().selectAll('.' + end.id)
             .classed('active', true);
     }
 
 
     var drawWay = function(surface) {
-        draw.on('move', move)
+        behavior
+            .on('move', move)
             .on('click', drawWay.add)
             .on('clickWay', drawWay.addWay)
             .on('clickNode', drawWay.addNode)
@@ -33306,13 +33613,17 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
             .on('cancel', drawWay.cancel)
             .on('finish', drawWay.finish);
 
+        d3_select(window)
+            .on('keydown.drawWay', keydown)
+            .on('keyup.drawWay', keyup);
+
         context.map()
             .dblclickEnable(false)
             .on('drawn.draw', setActiveElements);
 
         setActiveElements();
 
-        surface.call(draw);
+        surface.call(behavior);
 
         context.history()
             .on('undone.draw', undone);
@@ -33323,8 +33634,8 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
         // Drawing was interrupted unexpectedly.
         // This can happen if the user changes modes,
         // clicks geolocate button, a hashchange event occurs, etc.
-        if (tempEdits) {
-            context.pop(tempEdits);
+        if (_tempEdits) {
+            context.pop(_tempEdits);
             while (context.graph() !== startGraph) {
                 context.pop();
             }
@@ -33333,138 +33644,96 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
         context.map()
             .on('drawn.draw', null);
 
-        surface.call(draw.off)
+        surface.call(behavior.off)
             .selectAll('.active')
             .classed('active', false);
 
+        surface
+            .classed('nope', false)
+            .classed('nope-suppressed', false)
+            .classed('nope-disabled', false);
+
+        d3_select(window)
+            .on('keydown.hover', null)
+            .on('keyup.hover', null);
+
         context.history()
             .on('undone.draw', null);
     };
 
 
-    function AddDrawEntities() {
+    function _actionAddDrawNode() {
         return function(graph) {
-            if (isArea) {
-                // For area drawing, there is no need for a temporary node.
-                // `end` gets inserted into the way as the penultimate node.
-                return graph
-                    .replace(end)
-                    .replace(origWay.addNode(end.id));
-            } else {
-                // For line drawing, add a temporary start, end, and segment to the graph.
-                // This allows us to class the new segment as `active`, but still
-                // connect it back to parts of the way that have already been drawn.
-                return graph
-                    .replace(start)
-                    .replace(end)
-                    .replace(segment);
-            }
+            return graph
+                .replace(end)
+                .replace(origWay.addNode(end.id, index));
         };
     }
 
 
-    function ReplaceDrawEntities(newNode) {
+    function _actionReplaceDrawNode(newNode) {
         return function(graph) {
-            if (isArea) {
-                // For area drawing, we didn't create a temporary node.
-                // `newNode` gets inserted into the _original_ way as the penultimate node.
-                return graph
-                    .replace(origWay.addNode(newNode.id))
-                    .remove(end);
-            } else {
-                // For line drawing, add the `newNode` to the way at specified index,
-                // and remove the temporary start, end, and segment.
-                return graph
-                    .replace(origWay.addNode(newNode.id, index))
-                    .remove(end)
-                    .remove(segment)
-                    .remove(start);
-            }
+            return graph
+                .replace(origWay.addNode(newNode.id, index))
+                .remove(end);
         };
     }
 
 
-    // Accept the current position of the temporary node and continue drawing.
-    drawWay.add = function(loc) {
-        // prevent duplicate nodes
-        var last = context.hasEntity(origWay.nodes[origWay.nodes.length - (isArea ? 2 : 1)]);
-        if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
+    // Accept the current position of the drawing node and continue drawing.
+    drawWay.add = function(loc, d) {
+        if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
+            return;   // can't click here
+        }
 
-        context.pop(tempEdits);
+        context.pop(_tempEdits);
+        _tempEdits = 0;
 
-        if (isArea) {
-            context.perform(
-                AddDrawEntities(),
-                annotation
-            );
-        } else {
-            var newNode = osmNode({loc: loc});
-            context.perform(
-                actionAddEntity(newNode),
-                ReplaceDrawEntities(newNode),
-                annotation
-            );
-        }
+        context.perform(
+            _actionAddDrawNode(),
+            annotation
+        );
 
-        tempEdits = 0;
+        checkGeometry(false);   // skipLast = false
         context.enter(mode);
     };
 
 
     // Connect the way to an existing way.
-    drawWay.addWay = function(loc, edge) {
-        if (isArea) {
-            context.pop(tempEdits);
-
-            context.perform(
-                AddDrawEntities(),
-                actionAddMidpoint({ loc: loc, edge: edge}, end),
-                annotation
-            );
-        } else {
-            var previousEdge = startIndex ?
-                [origWay.nodes[startIndex], origWay.nodes[startIndex - 1]] :
-                [origWay.nodes[0], origWay.nodes[1]];
-
-            // Avoid creating duplicate segments
-            if (geoEdgeEqual(edge, previousEdge))
-                return;
+    drawWay.addWay = function(loc, edge, d) {
+        if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
+            return;   // can't click here
+        }
 
-            context.pop(tempEdits);
+        context.pop(_tempEdits);
+        _tempEdits = 0;
 
-            var newNode = osmNode({ loc: loc });
-            context.perform(
-                actionAddMidpoint({ loc: loc, edge: edge}, newNode),
-                ReplaceDrawEntities(newNode),
-                annotation
-            );
-        }
+        context.perform(
+            _actionAddDrawNode(),
+            actionAddMidpoint({ loc: loc, edge: edge }, end),
+            annotation
+        );
 
-        tempEdits = 0;
+        checkGeometry(false);   // skipLast = false
         context.enter(mode);
     };
 
 
     // Connect the way to an existing node and continue drawing.
-    drawWay.addNode = function(node) {
-        // Avoid creating duplicate segments
-        if (origWay.areAdjacent(node.id, origWay.nodes[origWay.nodes.length - 1])) return;
-
-        // Clicks should not occur on the drawing node, however a space keypress can
-        // sometimes grab that node's datum (before it gets classed as `active`?)  #4016
-        if (node.id === end.id) {
-            drawWay.add(node.loc);
-            return;
+    drawWay.addNode = function(node, d) {
+        if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
+            return;   // can't click here
         }
 
-        context.pop(tempEdits);
+        context.pop(_tempEdits);
+        _tempEdits = 0;
 
         context.perform(
-            ReplaceDrawEntities(node),
+            _actionReplaceDrawNode(node),
             annotation
         );
 
-        tempEdits = 0;
+        checkGeometry(false);   // skipLast = false
         context.enter(mode);
     };
 
@@ -33473,8 +33742,13 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
     // If the way has enough nodes to be valid, it's selected.
     // Otherwise, delete everything and return to browse mode.
     drawWay.finish = function() {
-        context.pop(tempEdits);
-        tempEdits = 0;
+        checkGeometry(true);   // skipLast = true
+        if (context.surface().classed('nope')) {
+            return;   // can't click here
+        }
+
+        context.pop(_tempEdits);
+        _tempEdits = 0;
 
         var way = context.hasEntity(wayId);
         if (!way || way.isDegenerate()) {
@@ -33492,8 +33766,8 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
 
     // Cancel the draw operation, delete everything, and return to browse mode.
     drawWay.cancel = function() {
-        context.pop(tempEdits);
-        tempEdits = 0;
+        context.pop(_tempEdits);
+        _tempEdits = 0;
 
         while (context.graph() !== startGraph) {
             context.pop();
@@ -33503,12 +33777,24 @@ function behaviorDrawWay(context, wayId, index, mode, startGraph) {
             context.map().dblclickEnable(true);
         }, 1000);
 
+        context.surface()
+            .classed('nope', false)
+            .classed('nope-disabled', false)
+            .classed('nope-suppressed', false);
+
         context.enter(modeBrowse(context));
     };
 
 
+    drawWay.activeID = function() {
+        if (!arguments.length) return end.id;
+        // no assign
+        return drawWay;
+    };
+
+
     drawWay.tail = function(text) {
-        draw.tail(text);
+        behavior.tail(text);
         return drawWay;
     };
 
@@ -33795,61 +34081,40 @@ function behaviorLasso(context) {
 
 /* Creates a keybinding behavior for an operation */
 function behaviorOperation() {
-    var which, keybinding;
-
-
-    function drawIcon(selection) {
-        var button = selection
-            .append('svg')
-            .attr('class', 'operation-icon')
-            .append('g')
-            .attr('class', 'radial-menu-item radial-menu-item-' + which.id)
-            .attr('transform', 'translate(10,10)')
-            .classed('disabled', which.disabled());
-
-        button
-            .append('circle')
-            .attr('r', 9);
-
-        button
-            .append('use')
-            .attr('transform', 'translate(-7,-7)')
-            .attr('width', '14')
-            .attr('height', '14')
-            .attr('xlink:href', '#operation-' + which.id);
-
-        return selection;
-    }
-
+    var _operation, keybinding;
 
     var behavior = function () {
-        if (which && which.available()) {
-            keybinding = d3keybinding('behavior.key.' + which.id);
-            keybinding.on(which.keys, function() {
+        if (_operation && _operation.available()) {
+            keybinding = d3keybinding('behavior.key.' + _operation.id);
+            keybinding.on(_operation.keys, function() {
                 event.preventDefault();
-                var disabled = which.disabled();
+                var disabled = _operation.disabled();
+                var flash;
 
                 if (disabled) {
-                    uiFlash(3000)
-                        .html('')
-                        .call(drawIcon)
-                        .append('div')
-                        .attr('class', 'operation-tip')
-                        .text(which.tooltip);
+                    flash = uiFlash()
+                        .duration(4000)
+                        .iconName('#operation-' + _operation.id)
+                        .iconClass('operation disabled')
+                        .text(_operation.tooltip);
+
+                    flash();
 
                 } else {
-                    uiFlash(1500)
-                        .html('')
-                        .call(drawIcon)
-                        .append('div')
-                        .attr('class', 'operation-tip')
-                        .text(which.annotation() || which.title);
-
-                    which();
+                    flash = uiFlash()
+                        .duration(2000)
+                        .iconName('#operation-' + _operation.id)
+                        .iconClass('operation')
+                        .text(_operation.annotation() || _operation.title);
+
+                    flash();
+                    _operation();
                 }
             });
+
             d3_select(document).call(keybinding);
         }
+
         return behavior;
     };
 
@@ -33862,8 +34127,8 @@ function behaviorOperation() {
 
 
     behavior.which = function (_) {
-        if (!arguments.length) return which;
-        which = _;
+        if (!arguments.length) return _operation;
+        _operation = _;
         return behavior;
     };
 
@@ -34035,10 +34300,10 @@ function behaviorPaste(context) {
 }
 
 function behaviorSelect(context) {
-    var lastMouse = null,
-        suppressMenu = true,
-        tolerance = 4,
-        p1 = null;
+    var lastMouse = null;
+    var suppressMenu = true;
+    var tolerance = 4;
+    var p1 = null;
 
 
     function point() {
@@ -34120,19 +34385,21 @@ function behaviorSelect(context) {
             .on('mouseup.select', null, true);
 
         if (!p1) return;
-        var p2 = point(),
-            dist = geoEuclideanDistance(p1, p2);
+        var p2 = point();
+        var dist = geoVecLength(p1, p2);
 
         p1 = null;
         if (dist > tolerance) {
             return;
         }
 
-        var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node(),
-            isShowAlways = +context.storage('edit-menu-show-always') === 1,
-            datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__),
-            mode = context.mode();
+        var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
+        var isShowAlways = +context.storage('edit-menu-show-always') === 1;
+        var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
+        var mode = context.mode();
 
+        var entity = datum && datum.properties && datum.properties.entity;
+        if (entity) datum = entity;
 
         if (datum && datum.type === 'midpoint') {
             datum = datum.parents[0];
@@ -34305,6 +34572,7 @@ var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
 var maxResults = 1000;
 var tileZoom = 14;
 var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
+var _mlyFallback = false;
 var _mlyCache;
 var _mlyClicks;
 var _mlySelectedImage;
@@ -34342,9 +34610,15 @@ function maxPageAtZoom(z) {
 
 function localeTimestamp(s) {
     if (!s) return null;
+    var detected = utilDetect();
+    var options = {
+        day: 'numeric', month: 'short', year: 'numeric',
+        hour: 'numeric', minute: 'numeric', second: 'numeric',
+        timeZone: 'UTC'
+    };
     var d = new Date(s);
     if (isNaN(d.getTime())) return null;
-    return d.toLocaleString(undefined, { timeZone: 'UTC' });
+    return d.toLocaleString(detected.locale, options);
 }
 
 
@@ -34753,6 +35027,10 @@ var serviceMapillary = {
     hideViewer: function() {
         _mlySelectedImage = null;
 
+        if (!_mlyFallback) {
+            _mlyViewer.getComponent('sequence').stop();
+        }
+
         var viewer = d3_select('#photoviewer');
         if (!viewer.empty()) viewer.datum(null);
 
@@ -34777,7 +35055,8 @@ var serviceMapillary = {
         if (!_mlyViewer) {
             this.initViewer(imageKey, context);
         } else {
-            _mlyViewer.moveToKey(imageKey);
+            _mlyViewer.moveToKey(imageKey)
+                .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
         }
 
         return this;
@@ -34796,8 +35075,26 @@ var serviceMapillary = {
                 }
             };
 
-            _mlyViewer = new Mapillary.Viewer('mly', clientId, imageKey, opts);
+            // Disable components requiring WebGL support
+            if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
+                _mlyFallback = true;
+                opts.component = {
+                    cover: false,
+                    direction: false,
+                    imagePlane: false,
+                    keyboard: false,
+                    mouse: false,
+                    sequence: false,
+                    tag: false,
+                    image: true,        // fallback
+                    navigation: true    // fallback
+                };
+            }
+
+            _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
             _mlyViewer.on('nodechanged', nodeChanged);
+            _mlyViewer.moveToKey(imageKey)
+                .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
         }
 
         // nodeChanged: called after the viewer has changed images and is ready.
@@ -34809,7 +35106,9 @@ var serviceMapillary = {
         // Clicks are added to the array in `selectedImage` and removed here.
         //
         function nodeChanged(node) {
-            _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
+            if (!_mlyFallback) {
+                _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
+            }
 
             var clicks = _mlyClicks;
             var index = clicks.indexOf(node.key);
@@ -34957,7 +35256,7 @@ var serviceMapillary = {
 
 
     updateDetections: function(d) {
-        if (!_mlyViewer) return;
+        if (!_mlyViewer || _mlyFallback) return;
 
         var imageKey = d && d.key;
         var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
@@ -35143,6 +35442,11 @@ var apibase$2 = 'https://openstreetcam.org';
 var maxResults$1 = 1000;
 var tileZoom$1 = 14;
 var dispatch$2 = dispatch('loadedImages');
+var imgZoom = d3_zoom()
+        .extent([[0, 0], [320, 240]])
+        .translateExtent([[0, 0], [320, 240]])
+        .scaleExtent([1, 15])
+        .on('zoom', zoomPan);
 var _oscCache;
 var _oscSelectedImage;
 
@@ -35252,9 +35556,11 @@ function loadNextTilePage$1(which, currZoom, url, tile) {
 
             function localeDateString(s) {
                 if (!s) return null;
+                var detected = utilDetect();
+                var options = { day: 'numeric', month: 'short', year: 'numeric' };
                 var d = new Date(s);
                 if (isNaN(d.getTime())) return null;
-                return d.toLocaleDateString();
+                return d.toLocaleDateString(detected.locale, options);
             }
 
             var features = data.currentPageItems.map(function(item) {
@@ -35340,6 +35646,12 @@ function searchLimited$1(psize, limit, projection, rtree) {
 }
 
 
+function zoomPan() {
+    var t = event.transform;
+    d3_select('#photoviewer .osc-image-wrap')
+        .call(utilSetTransform, t.x, t.y, t.k);
+}
+
 
 var serviceOpenstreetcam = {
 
@@ -35420,7 +35732,9 @@ var serviceOpenstreetcam = {
         var wrapEnter = wrap.enter()
             .append('div')
             .attr('class', 'photo-wrapper osc-wrapper')
-            .classed('hide', true);
+            .classed('hide', true)
+            .call(imgZoom)
+            .on('dblclick.zoom', null);
 
         wrapEnter
             .append('div')
@@ -35452,6 +35766,10 @@ var serviceOpenstreetcam = {
             .on('click.forward', step(1))
             .text('►');
 
+        wrapEnter
+            .append('div')
+            .attr('class', 'osc-image-wrap');
+
 
         function rotate(deg) {
             return function() {
@@ -35462,9 +35780,19 @@ var serviceOpenstreetcam = {
 
                 var r = sequence.rotation || 0;
                 r += deg;
+
+                if (r > 180) r -= 360;
+                if (r < -180) r += 360;
                 sequence.rotation = r;
 
-                d3_select('#photoviewer .osc-wrapper .osc-image')
+                var wrap = d3_select('#photoviewer .osc-wrapper');
+
+                wrap
+                    .transition()
+                    .duration(100)
+                    .call(imgZoom.transform, identity$7);
+
+                wrap.selectAll('.osc-image')
                     .transition()
                     .duration(100)
                     .style('transform', 'rotate(' + r + 'deg)');
@@ -35532,20 +35860,27 @@ var serviceOpenstreetcam = {
 
     updateViewer: function(d) {
         var wrap = d3_select('#photoviewer .osc-wrapper');
+        var imageWrap = wrap.selectAll('.osc-image-wrap');
+        var attribution = wrap.selectAll('.photo-attribution').html('');
+
+        wrap
+            .transition()
+            .duration(100)
+            .call(imgZoom.transform, identity$7);
 
-        wrap.selectAll('.osc-image')
+        imageWrap
+            .selectAll('.osc-image')
             .remove();
 
         if (d) {
             var sequence = _oscCache.sequences[d.sequence_id];
             var r = (sequence && sequence.rotation) || 0;
 
-            wrap.append('img')
+            imageWrap
+                .append('img')
                 .attr('class', 'osc-image')
-                .style('transform', 'rotate(' + r + 'deg)')
-                .attr('src', apibase$2 + '/' + d.imagePath);
-
-            var attribution = wrap.selectAll('.photo-attribution').html('');
+                .attr('src', apibase$2 + '/' + d.imagePath)
+                .style('transform', 'rotate(' + r + 'deg)');
 
             if (d.captured_by) {
                 attribution
@@ -37653,14 +37988,14 @@ var util = {
        assign: assign$1,
        create: create$2,
        trim: trim,
-       bind: bind$1,
-       slice: slice$8,
-       each: each$1,
+       bind: bind,
+       slice: slice$7,
+       each: each,
        map: map$5,
-       pluck: pluck$1,
-       isList: isList$1,
-       isFunction: isFunction$2,
-       isObject: isObject$3,
+       pluck: pluck,
+       isList: isList,
+       isFunction: isFunction$1,
+       isObject: isObject$2,
        Global: Global
 };
 
@@ -37670,7 +38005,7 @@ function make_assign() {
        } else {
                return function shimAssign(obj, props1, props2, etc) {
                        for (var i = 1; i < arguments.length; i++) {
-                               each$1(Object(arguments[i]), function(val, key) {
+                               each(Object(arguments[i]), function(val, key) {
                                        obj[key] = val;
                                });
                        }                       
@@ -37682,13 +38017,13 @@ function make_assign() {
 function make_create() {
        if (Object.create) {
                return function create(obj, assignProps1, assignProps2, etc) {
-                       var assignArgsList = slice$8(arguments, 1);
+                       var assignArgsList = slice$7(arguments, 1);
                        return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
                }
        } else {
                function F() {} // eslint-disable-line no-inner-declarations
                return function create(obj, assignProps1, assignProps2, etc) {
-                       var assignArgsList = slice$8(arguments, 1);
+                       var assignArgsList = slice$7(arguments, 1);
                        F.prototype = obj;
                        return assign$1.apply(this, [new F()].concat(assignArgsList))
                }
@@ -37707,34 +38042,34 @@ function make_trim() {
        }
 }
 
-function bind$1(obj, fn) {
+function bind(obj, fn) {
        return function() {
                return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
        }
 }
 
-function slice$8(arr, index) {
+function slice$7(arr, index) {
        return Array.prototype.slice.call(arr, index || 0)
 }
 
-function each$1(obj, fn) {
-       pluck$1(obj, function(val, key) {
+function each(obj, fn) {
+       pluck(obj, function(val, key) {
                fn(val, key);
                return false
        });
 }
 
 function map$5(obj, fn) {
-       var res = (isList$1(obj) ? [] : {});
-       pluck$1(obj, function(v, k) {
+       var res = (isList(obj) ? [] : {});
+       pluck(obj, function(v, k) {
                res[k] = fn(v, k);
                return false
        });
        return res
 }
 
-function pluck$1(obj, fn) {
-       if (isList$1(obj)) {
+function pluck(obj, fn) {
+       if (isList(obj)) {
                for (var i=0; i<obj.length; i++) {
                        if (fn(obj[i], i)) {
                                return obj[i]
@@ -37751,26 +38086,26 @@ function pluck$1(obj, fn) {
        }
 }
 
-function isList$1(val) {
+function isList(val) {
        return (val != null && typeof val != 'function' && typeof val.length == 'number')
 }
 
-function isFunction$2(val) {
+function isFunction$1(val) {
        return val && {}.toString.call(val) === '[object Function]'
 }
 
-function isObject$3(val) {
+function isObject$2(val) {
        return val && {}.toString.call(val) === '[object Object]'
 }
 
-var slice$7 = util.slice;
-var pluck = util.pluck;
-var each = util.each;
-var bind = util.bind;
-var create$1 = util.create;
-var isList = util.isList;
-var isFunction$1 = util.isFunction;
-var isObject$2 = util.isObject;
+var slice$8 = util.slice;
+var pluck$1 = util.pluck;
+var each$1 = util.each;
+var bind$1 = util.bind;
+var create$3 = util.create;
+var isList$1 = util.isList;
+var isFunction$2 = util.isFunction;
+var isObject$3 = util.isObject;
 
 var storeEngine = {
        createStore: createStore
@@ -37851,10 +38186,10 @@ function createStore(storages, plugins, namespace) {
        if (!namespace) {
                namespace = '';
        }
-       if (storages && !isList(storages)) {
+       if (storages && !isList$1(storages)) {
                storages = [storages];
        }
-       if (plugins && !isList(plugins)) {
+       if (plugins && !isList$1(plugins)) {
                plugins = [plugins];
        }
 
@@ -37884,14 +38219,14 @@ function createStore(storages, plugins, namespace) {
                _assignPluginFnProp: function(pluginFnProp, propName) {
                        var oldFn = this[propName];
                        this[propName] = function pluginFn() {
-                               var args = slice$7(arguments, 0);
+                               var args = slice$8(arguments, 0);
                                var self = this;
 
                                // super_fn calls the old function which was overwritten by
                                // this mixin.
                                function super_fn() {
                                        if (!oldFn) { return }
-                                       each(arguments, function(arg, i) {
+                                       each$1(arguments, function(arg, i) {
                                                args[i] = arg;
                                        });
                                        return oldFn.apply(self, args)
@@ -37936,8 +38271,8 @@ function createStore(storages, plugins, namespace) {
 
                        // If the plugin is an array, then add all plugins in the array.
                        // This allows for a plugin to depend on other plugins.
-                       if (isList(plugin)) {
-                               each(plugin, function(plugin) {
+                       if (isList$1(plugin)) {
+                               each$1(plugin, function(plugin) {
                                        self._addPlugin(plugin);
                                });
                                return
@@ -37945,7 +38280,7 @@ function createStore(storages, plugins, namespace) {
 
                        // Keep track of all plugins we've seen so far, so that we
                        // don't add any of them twice.
-                       var seenPlugin = pluck(this.plugins, function(seenPlugin) {
+                       var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
                                return (plugin === seenPlugin)
                        });
                        if (seenPlugin) {
@@ -37954,18 +38289,18 @@ function createStore(storages, plugins, namespace) {
                        this.plugins.push(plugin);
 
                        // Check that the plugin is properly formed
-                       if (!isFunction$1(plugin)) {
+                       if (!isFunction$2(plugin)) {
                                throw new Error('Plugins must be function values that return objects')
                        }
 
                        var pluginProperties = plugin.call(this);
-                       if (!isObject$2(pluginProperties)) {
+                       if (!isObject$3(pluginProperties)) {
                                throw new Error('Plugins must return an object of function properties')
                        }
 
                        // Add the plugin function properties to this store instance.
-                       each(pluginProperties, function(pluginFnProp, propName) {
-                               if (!isFunction$1(pluginFnProp)) {
+                       each$1(pluginProperties, function(pluginFnProp, propName) {
+                               if (!isFunction$2(pluginFnProp)) {
                                        throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
                                }
                                self._assignPluginFnProp(pluginFnProp, propName);
@@ -37982,19 +38317,19 @@ function createStore(storages, plugins, namespace) {
                }
        };
 
-       var store = create$1(_privateStoreProps, storeAPI, {
+       var store = create$3(_privateStoreProps, storeAPI, {
                plugins: []
        });
        store.raw = {};
-       each(store, function(prop, propName) {
-               if (isFunction$1(prop)) {
-                       store.raw[propName] = bind(store, prop);                        
+       each$1(store, function(prop, propName) {
+               if (isFunction$2(prop)) {
+                       store.raw[propName] = bind$1(store, prop);                      
                }
        });
-       each(storages, function(storage) {
+       each$1(storages, function(storage) {
                store._addStorage(storage);
        });
-       each(plugins, function(plugin) {
+       each$1(plugins, function(plugin) {
                store._addPlugin(plugin);
        });
        return store
@@ -38866,14 +39201,14 @@ if (typeof JSON !== "object") {
     }
 }());
 
-var json2 = json2Plugin;
+var json2$1 = json2Plugin;
 
 function json2Plugin() {
        
        return {}
 }
 
-var plugins = [json2];
+var plugins = [json2$1];
 
 var store_legacy = storeEngine.createStore(all$3, plugins);
 
@@ -39281,23 +39616,24 @@ var JXON = new (function () {
 
 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
 var urlroot = 'https://www.openstreetmap.org';
-var blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
-var inflight$1 = {};
-var loadedTiles = {};
-var entityCache = {};
-var connectionId = 1;
-var tileZoom$2 = 16;
 var oauth = osmAuth({
-        url: urlroot,
-        oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
-        oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
-        loading: authLoading,
-        done: authDone
-    });
-var rateLimitError;
-var userChangesets;
-var userDetails;
-var off;
+    url: urlroot,
+    oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
+    oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
+    loading: authLoading,
+    done: authDone
+});
+
+var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
+var _tiles = { loaded: {}, inflight: {} };
+var _changeset = {};
+var _entityCache = {};
+var _connectionID = 1;
+var _tileZoom = 16;
+var _rateLimitError;
+var _userChangesets;
+var _userDetails;
+var _off;
 
 
 function authLoading() {
@@ -39318,15 +39654,15 @@ function abortRequest$2(i) {
 
 
 function getLoc(attrs) {
-    var lon = attrs.lon && attrs.lon.value,
-        lat = attrs.lat && attrs.lat.value;
+    var lon = attrs.lon && attrs.lon.value;
+    var lat = attrs.lat && attrs.lat.value;
     return [parseFloat(lon), parseFloat(lat)];
 }
 
 
 function getNodes(obj) {
-    var elems = obj.getElementsByTagName('nd'),
-        nodes = new Array(elems.length);
+    var elems = obj.getElementsByTagName('nd');
+    var nodes = new Array(elems.length);
     for (var i = 0, l = elems.length; i < l; i++) {
         nodes[i] = 'n' + elems[i].attributes.ref.value;
     }
@@ -39335,8 +39671,8 @@ function getNodes(obj) {
 
 
 function getTags(obj) {
-    var elems = obj.getElementsByTagName('tag'),
-        tags = {};
+    var elems = obj.getElementsByTagName('tag');
+    var tags = {};
     for (var i = 0, l = elems.length; i < l; i++) {
         var attrs = elems[i].attributes;
         tags[attrs.k.value] = attrs.v.value;
@@ -39347,8 +39683,8 @@ function getTags(obj) {
 
 
 function getMembers(obj) {
-    var elems = obj.getElementsByTagName('member'),
-        members = new Array(elems.length);
+    var elems = obj.getElementsByTagName('member');
+    var members = new Array(elems.length);
     for (var i = 0, l = elems.length; i < l; i++) {
         var attrs = elems[i].attributes;
         members[i] = {
@@ -39418,14 +39754,14 @@ function parse(xml$$1, callback, options) {
     options = assignIn({ cache: true }, options);
     if (!xml$$1 || !xml$$1.childNodes) return;
 
-    var root = xml$$1.childNodes[0],
-        children = root.childNodes;
+    var root = xml$$1.childNodes[0];
+    var children = root.childNodes;
 
     function parseChild(child) {
         var parser = parsers[child.nodeName];
         if (parser) {
             var uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
-            if (options.cache && entityCache[uid]) {
+            if (options.cache && _entityCache[uid]) {
                 return null;
             }
             return parser(child, uid);
@@ -39444,20 +39780,21 @@ var serviceOsm = {
 
 
     reset: function() {
-        connectionId++;
-        userChangesets = undefined;
-        userDetails = undefined;
-        rateLimitError = undefined;
-        forEach(inflight$1, abortRequest$2);
-        entityCache = {};
-        loadedTiles = {};
-        inflight$1 = {};
+        _connectionID++;
+        _userChangesets = undefined;
+        _userDetails = undefined;
+        _rateLimitError = undefined;
+        forEach(_tiles.inflight, abortRequest$2);
+        if (_changeset.inflight) abortRequest$2(_changeset.inflight);
+        _tiles = { loaded: {}, inflight: {} };
+        _changeset = {};
+        _entityCache = {};
         return this;
     },
 
 
     getConnectionId: function() {
-        return connectionId;
+        return _connectionID;
     },
 
 
@@ -39493,7 +39830,7 @@ var serviceOsm = {
     loadFromAPI: function(path, callback, options) {
         options = assignIn({ cache: true }, options);
         var that = this;
-        var cid = connectionId;
+        var cid = _connectionID;
 
         function done(err, xml$$1) {
             if (that.getConnectionId() !== cid) {
@@ -39505,8 +39842,7 @@ var serviceOsm = {
 
             // 400 Bad Request, 401 Unauthorized, 403 Forbidden
             // Logout and retry the request..
-            if (isAuthenticated && err &&
-                    (err.status === 400 || err.status === 401 || err.status === 403)) {
+            if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
                 that.logout();
                 that.loadFromAPI(path, callback);
 
@@ -39514,9 +39850,9 @@ var serviceOsm = {
             } else {
                 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
                 // Set the rateLimitError flag and trigger a warning..
-                if (!isAuthenticated && !rateLimitError && err &&
+                if (!isAuthenticated && !_rateLimitError && err &&
                         (err.status === 509 || err.status === 429)) {
-                    rateLimitError = err;
+                    _rateLimitError = err;
                     dispatch$3.call('change');
                 }
 
@@ -39525,7 +39861,7 @@ var serviceOsm = {
                     parse(xml$$1, function (entities) {
                         if (options.cache) {
                             for (var i in entities) {
-                                entityCache[entities[i].id] = true;
+                                _entityCache[entities[i].id] = true;
                             }
                         }
                         callback(null, entities);
@@ -39544,9 +39880,9 @@ var serviceOsm = {
 
 
     loadEntity: function(id, callback) {
-        var type = osmEntity.id.type(id),
-            osmID = osmEntity.id.toOSM(id),
-            options = { cache: false };
+        var type = osmEntity.id.type(id);
+        var osmID = osmEntity.id.toOSM(id);
+        var options = { cache: false };
 
         this.loadFromAPI(
             '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
@@ -39559,9 +39895,9 @@ var serviceOsm = {
 
 
     loadEntityVersion: function(id, version, callback) {
-        var type = osmEntity.id.type(id),
-            osmID = osmEntity.id.toOSM(id),
-            options = { cache: false };
+        var type = osmEntity.id.type(id);
+        var osmID = osmEntity.id.toOSM(id);
+        var options = { cache: false };
 
         this.loadFromAPI(
             '/api/0.6/' + type + '/' + osmID + '/' + version,
@@ -39577,9 +39913,9 @@ var serviceOsm = {
         var that = this;
 
         forEach(groupBy(uniq(ids), osmEntity.id.type), function(v, k) {
-            var type = k + 's',
-                osmIDs = map$4(v, osmEntity.id.toOSM),
-                options = { cache: false };
+            var type = k + 's';
+            var osmIDs = map$4(v, osmEntity.id.toOSM);
+            var options = { cache: false };
 
             forEach(chunk(osmIDs, 150), function(arr) {
                 that.loadFromAPI(
@@ -39600,32 +39936,46 @@ var serviceOsm = {
 
 
     putChangeset: function(changeset, changes, callback) {
+        if (_changeset.inflight) {
+            return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
+        }
+
         var that = this;
-        var cid = connectionId;
+        var cid = _connectionID;
+
+        if (_changeset.open) {   // reuse existing open changeset..
+            createdChangeset(null, _changeset.open);
+        } else {                 // open a new changeset..
+            _changeset.inflight = oauth.xhr({
+                method: 'PUT',
+                path: '/api/0.6/changeset/create',
+                options: { header: { 'Content-Type': 'text/xml' } },
+                content: JXON.stringify(changeset.asJXON())
+            }, createdChangeset);
+        }
 
-        // Create the changeset..
-        oauth.xhr({
-            method: 'PUT',
-            path: '/api/0.6/changeset/create',
-            options: { header: { 'Content-Type': 'text/xml' } },
-            content: JXON.stringify(changeset.asJXON())
-        }, createdChangeset);
 
+        function createdChangeset(err, changesetID) {
+            _changeset.inflight = null;
 
-        function createdChangeset(err, changeset_id) {
             if (err) {
-                return callback(err);
+                // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
+                if (err.status === 400 || err.status === 401 || err.status === 403) {
+                    that.logout();
+                }
+                return callback(err, changeset);
             }
             if (that.getConnectionId() !== cid) {
-                return callback({ message: 'Connection Switched', status: -1 });
+                return callback({ message: 'Connection Switched', status: -1 }, changeset);
             }
 
-            changeset = changeset.update({ id: changeset_id });
+            _changeset.open = changesetID;
+            changeset = changeset.update({ id: changesetID });
 
             // Upload the changeset..
-            oauth.xhr({
+            _changeset.inflight = oauth.xhr({
                 method: 'POST',
-                path: '/api/0.6/changeset/' + changeset_id + '/upload',
+                path: '/api/0.6/changeset/' + changesetID + '/upload',
                 options: { header: { 'Content-Type': 'text/xml' } },
                 content: JXON.stringify(changeset.osmChangeJXON(changes))
             }, uploadedChangeset);
@@ -39633,7 +39983,9 @@ var serviceOsm = {
 
 
         function uploadedChangeset(err) {
-            if (err) return callback(err);
+            _changeset.inflight = null;
+
+            if (err) return callback(err, changeset);
 
             // Upload was successful, safe to call the callback.
             // Add delay to allow for postgres replication #1646 #2678
@@ -39641,6 +39993,8 @@ var serviceOsm = {
                 callback(null, changeset);
             }, 2500);
 
+            _changeset.open = null;
+
             // At this point, we don't really care if the connection was switched..
             // Only try to close the changeset if we're still talking to the same server.
             if (that.getConnectionId() === cid) {
@@ -39656,45 +40010,50 @@ var serviceOsm = {
 
 
     userDetails: function(callback) {
-        if (userDetails) {
-            callback(undefined, userDetails);
+        if (_userDetails) {
+            callback(undefined, _userDetails);
             return;
         }
 
         var that = this;
-        var cid = connectionId;
+        var cid = _connectionID;
 
         function done(err, user_details) {
             if (err) {
+                // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
+                if (err.status === 400 || err.status === 401 || err.status === 403) {
+                    that.logout();
+                }
                 return callback(err);
             }
             if (that.getConnectionId() !== cid) {
                 return callback({ message: 'Connection Switched', status: -1 });
             }
 
-            var u = user_details.getElementsByTagName('user')[0],
-                img = u.getElementsByTagName('img'),
-                image_url = '';
+
+            var u = user_details.getElementsByTagName('user')[0];
+            var img = u.getElementsByTagName('img');
+            var image_url = '';
 
             if (img && img[0] && img[0].getAttribute('href')) {
                 image_url = img[0].getAttribute('href');
             }
 
-            var changesets = u.getElementsByTagName('changesets'),
-                changesets_count = 0;
+            var changesets = u.getElementsByTagName('changesets');
+            var changesets_count = 0;
 
             if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
                 changesets_count = changesets[0].getAttribute('count');
             }
 
-            userDetails = {
+            _userDetails = {
                 id: u.attributes.id.value,
                 display_name: u.attributes.display_name.value,
                 image_url: image_url,
                 changesets_count: changesets_count
             };
 
-            callback(undefined, userDetails);
+            callback(undefined, _userDetails);
         }
 
         oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
@@ -39702,13 +40061,13 @@ var serviceOsm = {
 
 
     userChangesets: function(callback) {
-        if (userChangesets) {
-            callback(undefined, userChangesets);
+        if (_userChangesets) {
+            callback(undefined, _userChangesets);
             return;
         }
 
         var that = this;
-        var cid = connectionId;
+        var cid = _connectionID;
 
         this.userDetails(function(err, user) {
             if (err) {
@@ -39720,13 +40079,17 @@ var serviceOsm = {
 
             function done(err, changesets) {
                 if (err) {
+                    // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
+                    if (err.status === 400 || err.status === 401 || err.status === 403) {
+                        that.logout();
+                    }
                     return callback(err);
                 }
                 if (that.getConnectionId() !== cid) {
                     return callback({ message: 'Connection Switched', status: -1 });
                 }
 
-                userChangesets = Array.prototype.map.call(
+                _userChangesets = Array.prototype.map.call(
                     changesets.getElementsByTagName('changeset'),
                     function (changeset) {
                         return { tags: getTags(changeset) };
@@ -39736,7 +40099,7 @@ var serviceOsm = {
                     return comment && comment !== '';
                 });
 
-                callback(undefined, userChangesets);
+                callback(undefined, _userChangesets);
             }
 
             oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
@@ -39746,7 +40109,7 @@ var serviceOsm = {
 
     status: function(callback) {
         var that = this;
-        var cid = connectionId;
+        var cid = _connectionID;
 
         function done(xml$$1) {
             if (that.getConnectionId() !== cid) {
@@ -39754,8 +40117,8 @@ var serviceOsm = {
             }
 
             // update blacklists
-            var elements = xml$$1.getElementsByTagName('blacklist'),
-                regexes = [];
+            var elements = xml$$1.getElementsByTagName('blacklist');
+            var regexes = [];
             for (var i = 0; i < elements.length; i++) {
                 var regex = elements[i].getAttribute('regex');  // needs unencode?
                 if (regex) {
@@ -39763,15 +40126,15 @@ var serviceOsm = {
                 }
             }
             if (regexes.length) {
-                blacklists = regexes;
+                _blacklists = regexes;
             }
 
 
-            if (rateLimitError) {
-                callback(rateLimitError, 'rateLimited');
+            if (_rateLimitError) {
+                callback(_rateLimitError, 'rateLimited');
             } else {
-                var apiStatus = xml$$1.getElementsByTagName('status'),
-                    val = apiStatus[0].getAttribute('api');
+                var apiStatus = xml$$1.getElementsByTagName('status');
+                var val = apiStatus[0].getAttribute('api');
 
                 callback(undefined, val);
             }
@@ -39784,37 +40147,37 @@ var serviceOsm = {
 
 
     imageryBlacklists: function() {
-        return blacklists;
+        return _blacklists;
     },
 
 
     tileZoom: function(_) {
-        if (!arguments.length) return tileZoom$2;
-        tileZoom$2 = _;
+        if (!arguments.length) return _tileZoom;
+        _tileZoom = _;
         return this;
     },
 
 
     loadTiles: function(projection, dimensions, callback) {
-        if (off) return;
-
-        var that = this,
-            s = projection.scale() * 2 * Math.PI,
-            z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
-            ts = 256 * Math.pow(2, z - tileZoom$2),
-            origin = [
-                s / 2 - projection.translate()[0],
-                s / 2 - projection.translate()[1]
-            ];
+        if (_off) return;
+
+        var that = this;
+        var s = projection.scale() * 2 * Math.PI;
+        var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
+        var ts = 256 * Math.pow(2, z - _tileZoom);
+        var origin = [
+            s / 2 - projection.translate()[0],
+            s / 2 - projection.translate()[1]
+        ];
 
         var tiles = d3geoTile()
-            .scaleExtent([tileZoom$2, tileZoom$2])
+            .scaleExtent([_tileZoom, _tileZoom])
             .scale(s)
             .size(dimensions)
             .translate(projection.translate())()
             .map(function(tile) {
-                var x = tile[0] * ts - origin[0],
-                    y = tile[1] * ts - origin[1];
+                var x = tile[0] * ts - origin[0];
+                var y = tile[1] * ts - origin[1];
 
                 return {
                     id: tile.toString(),
@@ -39824,36 +40187,36 @@ var serviceOsm = {
                 };
             });
 
-        filter(inflight$1, function(v, i) {
+        filter(_tiles.inflight, function(v, i) {
             var wanted = find$1(tiles, function(tile) {
                 return i === tile.id;
             });
-            if (!wanted) delete inflight$1[i];
+            if (!wanted) delete _tiles.inflight[i];
             return !wanted;
         }).map(abortRequest$2);
 
         tiles.forEach(function(tile) {
             var id = tile.id;
 
-            if (loadedTiles[id] || inflight$1[id]) return;
+            if (_tiles.loaded[id] || _tiles.inflight[id]) return;
 
-            if (isEmpty(inflight$1)) {
+            if (isEmpty(_tiles.inflight)) {
                 dispatch$3.call('loading');
             }
 
-            inflight$1[id] = that.loadFromAPI(
+            _tiles.inflight[id] = that.loadFromAPI(
                 '/api/0.6/map?bbox=' + tile.extent.toParam(),
                 function(err, parsed) {
-                    delete inflight$1[id];
+                    delete _tiles.inflight[id];
                     if (!err) {
-                        loadedTiles[id] = true;
+                        _tiles.loaded[id] = true;
                     }
 
                     if (callback) {
                         callback(err, assignIn({ data: parsed }, tile));
                     }
 
-                    if (isEmpty(inflight$1)) {
+                    if (isEmpty(_tiles.inflight)) {
                         dispatch$3.call('loaded');
                     }
                 }
@@ -39879,21 +40242,21 @@ var serviceOsm = {
 
 
     toggle: function(_) {
-        off = !_;
+        _off = !_;
         return this;
     },
 
 
     loadedTiles: function(_) {
-        if (!arguments.length) return loadedTiles;
-        loadedTiles = _;
+        if (!arguments.length) return _tiles.loaded;
+        _tiles.loaded = _;
         return this;
     },
 
 
     logout: function() {
-        userChangesets = undefined;
-        userDetails = undefined;
+        _userChangesets = undefined;
+        _userDetails = undefined;
         oauth.logout();
         dispatch$3.call('change');
         return this;
@@ -39902,9 +40265,9 @@ var serviceOsm = {
 
     authenticate: function(callback) {
         var that = this;
-        var cid = connectionId;
-        userChangesets = undefined;
-        userDetails = undefined;
+        var cid = _connectionID;
+        _userChangesets = undefined;
+        _userDetails = undefined;
 
         function done(err, res) {
             if (err) {
@@ -39915,7 +40278,7 @@ var serviceOsm = {
                 if (callback) callback({ message: 'Connection Switched', status: -1 });
                 return;
             }
-            rateLimitError = undefined;
+            _rateLimitError = undefined;
             dispatch$3.call('change');
             if (callback) callback(err, res);
             that.userChangesets(function() {});  // eagerly load user details/changesets
@@ -39926,7 +40289,7 @@ var serviceOsm = {
 };
 
 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/';
-var inflight$2 = {};
+var inflight$1 = {};
 var popularKeys = {};
 var taginfoCache = {};
 var tag_sorts = {
@@ -40056,12 +40419,12 @@ function sortKeys(a, b) {
 var debouncedRequest = debounce(request, 500, { leading: false });
 
 function request(url, params, exactMatch, callback, loaded) {
-    if (inflight$2[url]) return;
+    if (inflight$1[url]) return;
 
     if (checkCache(url, params, exactMatch, callback)) return;
 
-    inflight$2[url] = d3_json(url, function (err, data) {
-        delete inflight$2[url];
+    inflight$1[url] = d3_json(url, function (err, data) {
+        delete inflight$1[url];
         loaded(err, data);
     });
 }
@@ -40097,7 +40460,7 @@ function checkCache(url, params, exactMatch, callback) {
 var serviceTaginfo = {
 
     init: function() {
-        inflight$2 = {};
+        inflight$1 = {};
         taginfoCache = {};
         popularKeys = {};
 
@@ -40116,8 +40479,8 @@ var serviceTaginfo = {
 
 
     reset: function() {
-        forEach(inflight$2, function(req) { req.abort(); });
-        inflight$2 = {};
+        forEach(inflight$1, function(req) { req.abort(); });
+        inflight$1 = {};
     },
 
 
@@ -40456,7 +40819,59 @@ function svgAreas(projection, context) {
     }
 
 
-    return function drawAreas(selection, graph, entities, filter) {
+    function drawTargets(selection, graph, entities, filter) {
+        var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+        var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+        var getPath = svgPath(projection).geojson;
+        var activeID = context.activeID();
+
+        // The targets and nopes will be MultiLineString sub-segments of the ways
+        var data = { targets: [], nopes: [] };
+
+        entities.forEach(function(way) {
+            var features = svgSegmentWay(way, graph, activeID);
+            data.targets.push.apply(data.targets, features.passive);
+            data.nopes.push.apply(data.nopes, features.active);
+        });
+
+
+        // Targets allow hover and vertex snapping
+        var targets = selection.selectAll('.area.target-allowed')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data.targets, function key(d) { return d.id; });
+
+        // exit
+        targets.exit()
+            .remove();
+
+        // enter/update
+        targets.enter()
+            .append('path')
+            .merge(targets)
+            .attr('d', getPath)
+            .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
+
+
+        // NOPE
+        var nopes = selection.selectAll('.area.target-nope')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data.nopes, function key(d) { return d.id; });
+
+        // exit
+        nopes.exit()
+            .remove();
+
+        // enter/update
+        nopes.enter()
+            .append('path')
+            .merge(nopes)
+            .attr('d', getPath)
+            .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
+    }
+
+
+
+    function drawAreas(selection, graph, entities, filter) {
         var path = svgPath(projection, graph, true),
             areas = {},
             multipolygon;
@@ -40514,7 +40929,7 @@ function svgAreas(projection, context) {
            .attr('d', path);
 
 
-        var layer = selection.selectAll('.layer-areas');
+        var layer = selection.selectAll('.layer-areas .layer-areas-areas');
 
         var areagroup = layer
             .selectAll('g.areagroup')
@@ -40560,7 +40975,14 @@ function svgAreas(projection, context) {
             })
             .call(svgTagClasses())
             .attr('d', path);
-    };
+
+
+        // touch targets
+        selection.selectAll('.layer-areas .layer-areas-targets')
+            .call(drawTargets, graph, data.stroke, filter);
+    }
+
+    return drawAreas;
 }
 
 function svgDebug(projection, context) {
@@ -40575,13 +40997,12 @@ function svgDebug(projection, context) {
     }
 
     function drawDebug(selection) {
-        var showsTile = context.getDebug('tile'),
-            showsCollision = context.getDebug('collision'),
-            showsImagery = context.getDebug('imagery'),
-            showsImperial = context.getDebug('imperial'),
-            showsDriveLeft = context.getDebug('driveLeft'),
-            path = d3_geoPath(projection);
-
+        var showsTile = context.getDebug('tile');
+        var showsCollision = context.getDebug('collision');
+        var showsImagery = context.getDebug('imagery');
+        var showsImperial = context.getDebug('imperial');
+        var showsDriveLeft = context.getDebug('driveLeft');
+        var showsTouchTargets = context.getDebug('target');
 
         var debugData = [];
         if (showsTile) {
@@ -40599,6 +41020,9 @@ function svgDebug(projection, context) {
         if (showsDriveLeft) {
             debugData.push({ class: 'green', label: 'driveLeft' });
         }
+        if (showsTouchTargets) {
+            debugData.push({ class: 'pink', label: 'touchTargets' });
+        }
 
 
         var legend = d3_select('#content')
@@ -40638,14 +41062,14 @@ function svgDebug(projection, context) {
             .merge(layer);
 
 
-        var extent = context.map().extent(),
-            dataImagery = data.imagery || [],
-            availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
-                if (!source.polygon) return false;
-                return source.polygon.some(function(polygon) {
-                    return geoPolygonIntersectsPolygon(polygon, extent, true);
-                });
-            }));
+        var extent = context.map().extent();
+        var dataImagery = data.imagery || [];
+        var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
+            if (!source.polygon) return false;
+            return source.polygon.some(function(polygon) {
+                return geoPolygonIntersectsPolygon(polygon, extent, true);
+            });
+        }));
 
         var imagery = layer.selectAll('path.debug-imagery')
             .data(showsImagery ? availableImagery : []);
@@ -40684,7 +41108,7 @@ function svgDebug(projection, context) {
 
         // update
         layer.selectAll('path')
-            .attr('d', path);
+            .attr('d', svgPath(projection).geojson);
     }
 
 
@@ -40696,7 +41120,8 @@ function svgDebug(projection, context) {
                 context.getDebug('collision') ||
                 context.getDebug('imagery') ||
                 context.getDebug('imperial') ||
-                context.getDebug('driveLeft');
+                context.getDebug('driveLeft') ||
+                context.getDebug('target');
         } else {
             return this;
         }
@@ -40730,24 +41155,61 @@ function svgDefs(context) {
     return function drawDefs(selection) {
         var defs = selection.append('defs');
 
-        // marker
-        defs.append('marker')
+        // markers
+        defs
+            .append('marker')
             .attr('id', 'oneway-marker')
-            .attr('viewBox', '0 0 10 10')
+            .attr('viewBox', '0 0 10 5')
+            .attr('refX', 2.5)
             .attr('refY', 2.5)
-            .attr('refX', 5)
             .attr('markerWidth', 2)
             .attr('markerHeight', 2)
             .attr('markerUnits', 'strokeWidth')
             .attr('orient', 'auto')
-
             .append('path')
-            .attr('class', 'oneway')
-            .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z')
+            .attr('class', 'oneway-marker-path')
+            .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
             .attr('stroke', 'none')
             .attr('fill', '#000')
             .attr('opacity', '0.75');
 
+        defs
+            .append('marker')
+            .attr('id', 'viewfield-marker')
+            .attr('viewBox', '0 0 16 16')
+            .attr('refX', 8)
+            .attr('refY', 16)
+            .attr('markerWidth', 4)
+            .attr('markerHeight', 4)
+            .attr('markerUnits', 'strokeWidth')
+            .attr('orient', 'auto')
+            .append('path')
+            .attr('class', 'viewfield-marker-path')
+            .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
+            .attr('fill', '#333')
+            .attr('fill-opacity', '0.75')
+            .attr('stroke', '#fff')
+            .attr('stroke-width', '0.5px')
+            .attr('stroke-opacity', '0.75');
+
+        defs
+            .append('marker')
+            .attr('id', 'viewfield-marker-wireframe')
+            .attr('viewBox', '0 0 16 16')
+            .attr('refX', 8)
+            .attr('refY', 16)
+            .attr('markerWidth', 4)
+            .attr('markerHeight', 4)
+            .attr('markerUnits', 'strokeWidth')
+            .attr('orient', 'auto')
+            .append('path')
+            .attr('class', 'viewfield-marker-path')
+            .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
+            .attr('fill', 'none')
+            .attr('stroke', '#fff')
+            .attr('stroke-width', '0.5px')
+            .attr('stroke-opacity', '0.75');
+
         // patterns
         var patterns = defs.selectAll('pattern')
             .data([
@@ -40763,23 +41225,21 @@ function svgDefs(context) {
             ])
             .enter()
             .append('pattern')
-            .attr('id', function (d) {
-                return 'pattern-' + d[0];
-            })
+            .attr('id', function (d) { return 'pattern-' + d[0]; })
             .attr('width', 32)
             .attr('height', 32)
             .attr('patternUnits', 'userSpaceOnUse');
 
-        patterns.append('rect')
+        patterns
+            .append('rect')
             .attr('x', 0)
             .attr('y', 0)
             .attr('width', 32)
             .attr('height', 32)
-            .attr('class', function (d) {
-                    return 'pattern-color-' + d[0];
-            });
+            .attr('class', function (d) { return 'pattern-color-' + d[0]; });
 
-        patterns.append('image')
+        patterns
+            .append('image')
             .attr('x', 0)
             .attr('y', 0)
             .attr('width', 32)
@@ -40789,30 +41249,21 @@ function svgDefs(context) {
             });
 
         // clip paths
-        defs.selectAll()
+        defs.selectAll('clipPath')
             .data([12, 18, 20, 32, 45])
             .enter()
             .append('clipPath')
-            .attr('id', function (d) {
-                return 'clip-square-' + d;
-            })
+            .attr('id', function (d) { return 'clip-square-' + d; })
             .append('rect')
             .attr('x', 0)
             .attr('y', 0)
-            .attr('width', function (d) {
-                return d;
-            })
-            .attr('height', function (d) {
-                return d;
-            });
-
-        defs.call(SVGSpriteDefinition(
-            'iD-sprite',
-            context.imagePath('iD-sprite.svg')));
+            .attr('width', function (d) { return d; })
+            .attr('height', function (d) { return d; });
 
-        defs.call(SVGSpriteDefinition(
-            'maki-sprite',
-            context.imagePath('maki-sprite.svg')));
+        // symbol spritesheets
+        defs
+            .call(SVGSpriteDefinition('iD-sprite', context.imagePath('iD-sprite.svg')))
+            .call(SVGSpriteDefinition('maki-sprite', context.imagePath('maki-sprite.svg')));
     };
 }
 
@@ -43409,18 +43860,23 @@ var toGeoJSON = (function() {
 module.exports = toGeoJSON;
 });
 
+var _initialized = false;
+var _enabled = false;
+var _geojson;
+
+
 function svgGpx(projection, context, dispatch) {
-    var showLabels = true,
-        detected = utilDetect(),
-        layer,
-        src;
+    var _showLabels = true;
+    var detected = utilDetect();
+    var layer;
+    var _src;
 
 
     function init() {
-        if (svgGpx.initialized) return;  // run once
+        if (_initialized) return;  // run once
 
-        svgGpx.geojson = {};
-        svgGpx.enabled = true;
+        _geojson = {};
+        _enabled = true;
 
         function over() {
             event.stopPropagation();
@@ -43440,16 +43896,15 @@ function svgGpx(projection, context, dispatch) {
             .on('dragexit.localgpx', over)
             .on('dragover.localgpx', over);
 
-        svgGpx.initialized = true;
+        _initialized = true;
     }
 
 
     function drawGpx(selection) {
-        var geojson = svgGpx.geojson,
-            enabled = svgGpx.enabled;
+        var getPath = svgPath(projection).geojson;
 
         layer = selection.selectAll('.layer-gpx')
-            .data(enabled ? [0] : []);
+            .data(_enabled ? [0] : []);
 
         layer.exit()
             .remove();
@@ -43462,7 +43917,7 @@ function svgGpx(projection, context, dispatch) {
 
         var paths = layer
             .selectAll('path')
-            .data([geojson]);
+            .data([_geojson]);
 
         paths.exit()
             .remove();
@@ -43472,37 +43927,43 @@ function svgGpx(projection, context, dispatch) {
             .attr('class', 'gpx')
             .merge(paths);
 
-
-        var path = d3_geoPath(projection);
-
         paths
-            .attr('d', path);
+            .attr('d', getPath);
 
 
-        var labels = layer.selectAll('text')
-            .data(showLabels && geojson.features ? geojson.features : []);
+        var labelData = _showLabels && _geojson.features ? _geojson.features : [];
+        labelData = labelData.filter(getPath);
 
-        labels.exit()
-            .remove();
+        layer
+            .call(drawLabels, 'gpxlabel-halo', labelData)
+            .call(drawLabels, 'gpxlabel', labelData);
 
-        labels = labels.enter()
-            .append('text')
-            .attr('class', 'gpx')
-            .merge(labels);
 
-        labels
-            .text(function(d) {
-                return d.properties.desc || d.properties.name;
-            })
-            .attr('x', function(d) {
-                var centroid = path.centroid(d);
-                return centroid[0] + 7;
-            })
-            .attr('y', function(d) {
-                var centroid = path.centroid(d);
-                return centroid[1];
-            });
+        function drawLabels(selection, textClass, data) {
+            var labels = selection.selectAll('text.' + textClass)
+                .data(data);
 
+            // exit
+            labels.exit()
+                .remove();
+
+            // enter/update
+            labels = labels.enter()
+                .append('text')
+                .attr('class', textClass)
+                .merge(labels)
+                .text(function(d) {
+                    return d.properties.desc || d.properties.name;
+                })
+                .attr('x', function(d) {
+                    var centroid = getPath.centroid(d);
+                    return centroid[0] + 11;
+                })
+                .attr('y', function(d) {
+                    var centroid = getPath.centroid(d);
+                    return centroid[1];
+                });
+        }
     }
 
 
@@ -43542,30 +44003,29 @@ function svgGpx(projection, context, dispatch) {
 
 
     drawGpx.showLabels = function(_) {
-        if (!arguments.length) return showLabels;
-        showLabels = _;
+        if (!arguments.length) return _showLabels;
+        _showLabels = _;
         return this;
     };
 
 
     drawGpx.enabled = function(_) {
-        if (!arguments.length) return svgGpx.enabled;
-        svgGpx.enabled = _;
+        if (!arguments.length) return _enabled;
+        _enabled = _;
         dispatch.call('change');
         return this;
     };
 
 
     drawGpx.hasGpx = function() {
-        var geojson = svgGpx.geojson;
-        return (!(isEmpty(geojson) || isEmpty(geojson.features)));
+        return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
     };
 
 
     drawGpx.geojson = function(gj) {
-        if (!arguments.length) return svgGpx.geojson;
+        if (!arguments.length) return _geojson;
         if (isEmpty(gj) || isEmpty(gj.features)) return this;
-        svgGpx.geojson = gj;
+        _geojson = gj;
         dispatch.call('change');
         return this;
     };
@@ -43574,8 +44034,7 @@ function svgGpx(projection, context, dispatch) {
     drawGpx.url = function(url) {
         d3_text(url, function(err, data) {
             if (!err) {
-                src = url;
-
+                _src = url;
                 var extension = getExtension(url);
                 parseSaveAndZoom(extension, data);
             }
@@ -43590,10 +44049,8 @@ function svgGpx(projection, context, dispatch) {
             reader = new FileReader();
 
         reader.onload = (function(file) {
-            src = file.name;
-
+            _src = file.name;
             var extension = getExtension(file.name);
-
             return function (e) {
                 parseSaveAndZoom(extension, e.target.result);
             };
@@ -43603,38 +44060,39 @@ function svgGpx(projection, context, dispatch) {
         return this;
     };
 
+
     drawGpx.getSrc = function () {
-      return src;
+        return _src;
     };
 
+
     drawGpx.fitZoom = function() {
         if (!this.hasGpx()) return this;
-        var geojson = svgGpx.geojson;
 
-        var map = context.map(),
-            viewport = map.trimmedExtent().polygon(),
-            coords = reduce(geojson.features, function(coords, feature) {
-                var c = feature.geometry.coordinates;
-
-                /* eslint-disable no-fallthrough */
-                switch (feature.geometry.type) {
-                    case 'Point':
-                        c = [c];
-                    case 'MultiPoint':
-                    case 'LineString':
-                        break;
+        var map = context.map();
+        var viewport = map.trimmedExtent().polygon();
+        var coords = reduce(_geojson.features, function(coords, feature) {
+            var c = feature.geometry.coordinates;
+
+            /* eslint-disable no-fallthrough */
+            switch (feature.geometry.type) {
+                case 'Point':
+                    c = [c];
+                case 'MultiPoint':
+                case 'LineString':
+                    break;
 
-                    case 'MultiPolygon':
-                        c = flatten(c);
-                    case 'Polygon':
-                    case 'MultiLineString':
-                        c = flatten(c);
-                        break;
-                }
-                /* eslint-enable no-fallthrough */
+                case 'MultiPolygon':
+                    c = flatten(c);
+                case 'Polygon':
+                case 'MultiLineString':
+                    c = flatten(c);
+                    break;
+            }
+            /* eslint-enable no-fallthrough */
 
-                return union(coords, c);
-            }, []);
+            return union(coords, c);
+        }, []);
 
         if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
             var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
@@ -43663,13 +44121,13 @@ function svgIcon(name, svgklass, useklass) {
 }
 
 function svgLabels(projection, context) {
-    var path = d3_geoPath(projection),
-        detected = utilDetect(),
-        baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge'),
-        rdrawn = rbush_1(),
-        rskipped = rbush_1(),
-        textWidthCache = {},
-        entitybboxes = {};
+    var path = d3_geoPath(projection);
+    var detected = utilDetect();
+    var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
+    var _rdrawn = rbush_1();
+    var _rskipped = rbush_1();
+    var _textWidthCache = {};
+    var _entitybboxes = {};
 
     // Listed from highest to lowest priority
     var labelStack = [
@@ -43722,8 +44180,8 @@ function svgLabels(projection, context) {
 
 
     function textWidth(text, size, elem) {
-        var c = textWidthCache[size];
-        if (!c) c = textWidthCache[size] = {};
+        var c = _textWidthCache[size];
+        if (!c) c = _textWidthCache[size] = {};
 
         if (c[text]) {
             return c[text];
@@ -43748,9 +44206,11 @@ function svgLabels(projection, context) {
             .filter(filter)
             .data(entities, osmEntity.key);
 
+        // exit
         paths.exit()
             .remove();
 
+        // enter/update
         paths.enter()
             .append('path')
             .style('stroke-width', get(labels, 'font-size'))
@@ -43766,9 +44226,11 @@ function svgLabels(projection, context) {
             .filter(filter)
             .data(entities, osmEntity.key);
 
+        // exit
         texts.exit()
             .remove();
 
+        // enter
         texts.enter()
             .append('text')
             .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
@@ -43776,9 +44238,8 @@ function svgLabels(projection, context) {
             .append('textPath')
             .attr('class', 'textpath');
 
-        texts = selection.selectAll('text.' + classes);
-
-        texts.selectAll('.textpath')
+        // update
+        selection.selectAll('text.' + classes).selectAll('.textpath')
             .filter(filter)
             .data(entities, osmEntity.key)
             .attr('startOffset', '50%')
@@ -43792,17 +44253,17 @@ function svgLabels(projection, context) {
             .filter(filter)
             .data(entities, osmEntity.key);
 
+        // exit
         texts.exit()
             .remove();
 
-        texts = texts.enter()
+        // enter/update
+        texts.enter()
             .append('text')
             .attr('class', function(d, i) {
                 return classes + ' ' + labels[i].classes + ' ' + d.id;
             })
-            .merge(texts);
-
-        texts
+            .merge(texts)
             .attr('x', get(labels, 'x'))
             .attr('y', get(labels, 'y'))
             .style('text-anchor', get(labels, 'textAnchor'))
@@ -43829,25 +44290,25 @@ function svgLabels(projection, context) {
             .filter(filter)
             .data(entities, osmEntity.key);
 
+        // exit
         icons.exit()
             .remove();
 
-        icons = icons.enter()
+        // enter/update
+        icons.enter()
             .append('use')
             .attr('class', 'icon ' + classes)
             .attr('width', '17px')
             .attr('height', '17px')
-            .merge(icons);
-
-        icons
+            .merge(icons)
             .attr('transform', get(labels, 'transform'))
             .attr('xlink:href', function(d) {
-                var preset = context.presets().match(d, context.graph()),
-                    picon = preset && preset.icon;
+                var preset = context.presets().match(d, context.graph());
+                var picon = preset && preset.icon;
 
-                if (!picon)
+                if (!picon) {
                     return '';
-                else {
+                else {
                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
                     return '#' + picon + (isMaki ? '-15' : '');
                 }
@@ -43856,23 +44317,11 @@ function svgLabels(projection, context) {
 
 
     function drawCollisionBoxes(selection, rtree, which) {
-        var showDebug = context.getDebug('collision'),
-            classes = 'debug ' + which + ' ' +
-                (which === 'debug-skipped' ? 'orange' : 'yellow');
-
-        var debug = selection.selectAll('.layer-label-debug')
-                .data(showDebug ? [true] : []);
-
-        debug.exit()
-            .remove();
+        var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
 
-        debug = debug.enter()
-            .append('g')
-            .attr('class', 'layer-label-debug')
-            .merge(debug);
-
-        if (showDebug) {
-            var gj = rtree.all().map(function(d) {
+        var gj = [];
+        if (context.getDebug('collision')) {
+            gj = rtree.all().map(function(d) {
                 return { type: 'Polygon', coordinates: [[
                     [d.minX, d.minY],
                     [d.maxX, d.minY],
@@ -43881,67 +44330,102 @@ function svgLabels(projection, context) {
                     [d.minX, d.minY]
                 ]]};
             });
+        }
 
-            var debugboxes = debug.selectAll('.' + which)
-                .data(gj);
+        var boxes = selection.selectAll('.' + which)
+            .data(gj);
 
-            debugboxes.exit()
-                .remove();
-
-            debugboxes = debugboxes.enter()
-                .append('path')
-                .attr('class', classes)
-                .merge(debugboxes);
+        // exit
+        boxes.exit()
+            .remove();
 
-            debugboxes
-                .attr('d', d3_geoPath());
-        }
+        // enter/update
+        boxes.enter()
+            .append('path')
+            .attr('class', classes)
+            .merge(boxes)
+            .attr('d', d3_geoPath());
     }
 
 
     function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
-        var lowZoom = context.surface().classed('low-zoom');
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+
+        var labelable = [];
+        var renderNodeAs = {};
+        var i, j, k, entity, geometry;
 
-        var labelable = [], i, j, k, entity, geometry;
         for (i = 0; i < labelStack.length; i++) {
             labelable.push([]);
         }
 
         if (fullRedraw) {
-            rdrawn.clear();
-            rskipped.clear();
-            entitybboxes = {};
+            _rdrawn.clear();
+            _rskipped.clear();
+            _entitybboxes = {};
+
         } else {
             for (i = 0; i < entities.length; i++) {
                 entity = entities[i];
                 var toRemove = []
-                    .concat(entitybboxes[entity.id] || [])
-                    .concat(entitybboxes[entity.id + 'I'] || []);
+                    .concat(_entitybboxes[entity.id] || [])
+                    .concat(_entitybboxes[entity.id + 'I'] || []);
 
                 for (j = 0; j < toRemove.length; j++) {
-                    rdrawn.remove(toRemove[j]);
-                    rskipped.remove(toRemove[j]);
+                    _rdrawn.remove(toRemove[j]);
+                    _rskipped.remove(toRemove[j]);
                 }
             }
         }
 
-        // Split entities into groups specified by labelStack
+        // Loop through all the entities to do some preprocessing
         for (i = 0; i < entities.length; i++) {
             entity = entities[i];
             geometry = entity.geometry(graph);
-            if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
 
-            var preset = geometry === 'area' && context.presets().match(entity, graph),
-                icon = preset && !blacklisted(preset) && preset.icon;
+            // Insert collision boxes around interesting points/vertices
+            if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
+                var hasDirections = entity.directions(graph, projection).length;
+                var markerPadding;
+
+                if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
+                    renderNodeAs[entity.id] = 'point';
+                    markerPadding = 20;   // extra y for marker height
+                } else {
+                    renderNodeAs[entity.id] = 'vertex';
+                    markerPadding = 0;
+                }
+
+                var coord = projection(entity.loc);
+                var nodePadding = 10;
+                var bbox = {
+                    minX: coord[0] - nodePadding,
+                    minY: coord[1] - nodePadding - markerPadding,
+                    maxX: coord[0] + nodePadding,
+                    maxY: coord[1] + nodePadding
+                };
+
+                doInsert(bbox, entity.id + 'P');
+            }
+
+            // From here on, treat vertices like points
+            if (geometry === 'vertex') {
+                geometry = 'point';
+            }
+
+            // Determine which entities are label-able
+            var preset = geometry === 'area' && context.presets().match(entity, graph);
+            var icon = preset && !blacklisted(preset) && preset.icon;
 
             if (!icon && !utilDisplayName(entity))
                 continue;
 
             for (k = 0; k < labelStack.length; k++) {
-                var matchGeom = labelStack[k][0],
-                    matchKey = labelStack[k][1],
-                    matchVal = labelStack[k][2],
-                    hasVal = entity.tags[matchKey];
+                var matchGeom = labelStack[k][0];
+                var matchKey = labelStack[k][1];
+                var matchVal = labelStack[k][2];
+                var hasVal = entity.tags[matchKey];
 
                 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
                     labelable[k].push(entity);
@@ -43965,22 +44449,28 @@ function svgLabels(projection, context) {
         // Try and find a valid label for labellable entities
         for (k = 0; k < labelable.length; k++) {
             var fontSize = labelStack[k][3];
+
             for (i = 0; i < labelable[k].length; i++) {
                 entity = labelable[k][i];
                 geometry = entity.geometry(graph);
 
-                var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName,
-                    name = getName(entity),
-                    width = name && textWidth(name, fontSize),
-                    p = null;
+                var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
+                var name = getName(entity);
+                var width = name && textWidth(name, fontSize);
+                var p = null;
+
+                if (geometry === 'point' || geometry === 'vertex') {
+                    // no point or vertex labels in wireframe mode
+                    // no vertex labels at low zooms (vertices have no icons)
+                    if (wireframe) continue;
+                    var renderAs = renderNodeAs[entity.id];
+                    if (renderAs === 'vertex' && zoom < 17) continue;
+
+                    p = getPointLabel(entity, width, fontSize, renderAs);
 
-                if (geometry === 'point') {
-                    p = getPointLabel(entity, width, fontSize, geometry);
-                } else if (geometry === 'vertex' && !lowZoom) {
-                    // don't label vertices at low zoom because they don't have icons
-                    p = getPointLabel(entity, width, fontSize, geometry);
                 } else if (geometry === 'line') {
                     p = getLineLabel(entity, width, fontSize);
+
                 } else if (geometry === 'area') {
                     p = getAreaLabel(entity, width, fontSize);
                 }
@@ -43995,38 +44485,52 @@ function svgLabels(projection, context) {
         }
 
 
+        function isInterestingVertex(entity) {
+            var selectedIDs = context.selectedIDs();
+
+            return entity.hasInterestingTags() ||
+                entity.isEndpoint(graph) ||
+                entity.isConnected(graph) ||
+                selectedIDs.indexOf(entity.id) !== -1 ||
+                some(graph.parentWays(entity), function(parent) {
+                    return selectedIDs.indexOf(parent.id) !== -1;
+                });
+        }
+
+
         function getPointLabel(entity, width, height, geometry) {
-            var y = (geometry === 'point' ? -12 : 0),
-                pointOffsets = {
-                    ltr: [15, y, 'start'],
-                    rtl: [-15, y, 'end']
-                };
+            var y = (geometry === 'point' ? -12 : 0);
+            var pointOffsets = {
+                ltr: [15, y, 'start'],
+                rtl: [-15, y, 'end']
+            };
 
-            var coord = projection(entity.loc),
-                margin = 2,
-                offset = pointOffsets[textDirection],
-                p = {
-                    height: height,
-                    width: width,
-                    x: coord[0] + offset[0],
-                    y: coord[1] + offset[1],
-                    textAnchor: offset[2]
-                },
-                bbox;
+            var coord = projection(entity.loc);
+            var textPadding = 2;
+            var offset = pointOffsets[textDirection];
+            var p = {
+                height: height,
+                width: width,
+                x: coord[0] + offset[0],
+                y: coord[1] + offset[1],
+                textAnchor: offset[2]
+            };
 
+            // insert a collision box for the text label..
+            var bbox;
             if (textDirection === 'rtl') {
                 bbox = {
-                    minX: p.x - width - margin,
-                    minY: p.y - (height / 2) - margin,
-                    maxX: p.x + margin,
-                    maxY: p.y + (height / 2) + margin
+                    minX: p.x - width - textPadding,
+                    minY: p.y - (height / 2) - textPadding,
+                    maxX: p.x + textPadding,
+                    maxY: p.y + (height / 2) + textPadding
                 };
             } else {
                 bbox = {
-                    minX: p.x - margin,
-                    minY: p.y - (height / 2) - margin,
-                    maxX: p.x + width + margin,
-                    maxY: p.y + (height / 2) + margin
+                    minX: p.x - textPadding,
+                    minY: p.y - (height / 2) - textPadding,
+                    maxX: p.x + width + textPadding,
+                    maxY: p.y + (height / 2) + textPadding
                 };
             }
 
@@ -44037,26 +44541,28 @@ function svgLabels(projection, context) {
 
 
         function getLineLabel(entity, width, height) {
-            var viewport = geoExtent(context.projection.clipExtent()).polygon(),
-                nodes = map$4(graph.childNodes(entity), 'loc').map(projection),
-                length = geoPathLength(nodes);
+            var viewport = geoExtent(context.projection.clipExtent()).polygon();
+            var points = map$4(graph.childNodes(entity), 'loc').map(projection);
+            var length = geoPathLength(points);
 
             if (length < width + 20) return;
 
+            // todo: properly clip points to viewport
+
             // % along the line to attempt to place the label
             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
                                25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
-            var margin = 3;
+            var padding = 3;
 
             for (var i = 0; i < lineOffsets.length; i++) {
-                var offset = lineOffsets[i],
-                    middle = offset / 100 * length,
-                    start = middle - width / 2;
+                var offset = lineOffsets[i];
+                var middle = offset / 100 * length;
+                var start = middle - width / 2;
 
                 if (start < 0 || start + width > length) continue;
 
                 // generate subpath and ignore paths that are invalid or don't cross viewport.
-                var sub = subpath(nodes, start, start + width);
+                var sub = subpath(points, start, start + width);
                 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
                     continue;
                 }
@@ -44066,20 +44572,22 @@ function svgLabels(projection, context) {
                     sub = sub.reverse();
                 }
 
-                var bboxes = [],
-                    boxsize = (height + 2) / 2;
+                var bboxes = [];
+                var boxsize = (height + 2) / 2;
 
                 for (var j = 0; j < sub.length - 1; j++) {
                     var a = sub[j];
                     var b = sub[j + 1];
-                    var num = Math.max(1, Math.floor(geoEuclideanDistance(a, b) / boxsize / 2));
+
+                    // split up the text into small collision boxes
+                    var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
 
                     for (var box = 0; box < num; box++) {
-                        var p = geoInterp(a, b, box / num);
-                        var x0 = p[0] - boxsize - margin;
-                        var y0 = p[1] - boxsize - margin;
-                        var x1 = p[0] + boxsize + margin;
-                        var y1 = p[1] + boxsize + margin;
+                        var p = geoVecInterp(a, b, box / num);
+                        var x0 = p[0] - boxsize - padding;
+                        var y0 = p[1] - boxsize - padding;
+                        var x1 = p[0] + boxsize + padding;
+                        var y1 = p[1] + boxsize + padding;
 
                         bboxes.push({
                             minX: Math.min(x0, x1),
@@ -44090,7 +44598,7 @@ function svgLabels(projection, context) {
                     }
                 }
 
-                if (tryInsert(bboxes, entity.id, false)) {
+                if (tryInsert(bboxes, entity.id, false)) {   // accept this one
                     return {
                         'font-size': height + 2,
                         lineString: lineString(sub),
@@ -44104,18 +44612,18 @@ function svgLabels(projection, context) {
                 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
             }
 
-            function lineString(nodes) {
-                return 'M' + nodes.join('L');
+            function lineString(points) {
+                return 'M' + points.join('L');
             }
 
-            function subpath(nodes, from, to) {
-                var sofar = 0,
-                    start, end, i0, i1;
+            function subpath(points, from, to) {
+                var sofar = 0;
+                var start, end, i0, i1;
 
-                for (var i = 0; i < nodes.length - 1; i++) {
-                    var a = nodes[i],
-                        b = nodes[i + 1];
-                    var current = geoEuclideanDistance(a, b);
+                for (var i = 0; i < points.length - 1; i++) {
+                    var a = points[i];
+                    var b = points[i + 1];
+                    var current = geoVecLength(a, b);
                     var portion;
                     if (!start && sofar + current >= from) {
                         portion = (from - sofar) / current;
@@ -44136,30 +44644,30 @@ function svgLabels(projection, context) {
                     sofar += current;
                 }
 
-                var ret = nodes.slice(i0, i1);
-                ret.unshift(start);
-                ret.push(end);
-                return ret;
+                var result = points.slice(i0, i1);
+                result.unshift(start);
+                result.push(end);
+                return result;
             }
         }
 
 
         function getAreaLabel(entity, width, height) {
-            var centroid = path.centroid(entity.asGeoJSON(graph, true)),
-                extent = entity.extent(graph),
-                areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
+            var centroid = path.centroid(entity.asGeoJSON(graph, true));
+            var extent = entity.extent(graph);
+            var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
 
             if (isNaN(centroid[0]) || areaWidth < 20) return;
 
-            var preset = context.presets().match(entity, context.graph()),
-                picon = preset && preset.icon,
-                iconSize = 17,
-                margin = 2,
-                p = {};
+            var preset = context.presets().match(entity, context.graph());
+            var picon = preset && preset.icon;
+            var iconSize = 17;
+            var padding = 2;
+            var p = {};
 
             if (picon) {  // icon and label..
                 if (addIcon()) {
-                    addLabel(iconSize + margin);
+                    addLabel(iconSize + padding);
                     return p;
                 }
             } else {   // label only..
@@ -44191,10 +44699,10 @@ function svgLabels(projection, context) {
                     var labelX = centroid[0];
                     var labelY = centroid[1] + yOffset;
                     var bbox = {
-                        minX: labelX - (width / 2) - margin,
-                        minY: labelY - (height / 2) - margin,
-                        maxX: labelX + (width / 2) + margin,
-                        maxY: labelY + (height / 2) + margin
+                        minX: labelX - (width / 2) - padding,
+                        minY: labelY - (height / 2) - padding,
+                        maxX: labelX + (width / 2) + padding,
+                        maxY: labelY + (height / 2) + padding
                     };
 
                     if (tryInsert([bbox], entity.id, true)) {
@@ -44210,12 +44718,25 @@ function svgLabels(projection, context) {
         }
 
 
+        // force insert a singular bounding box
+        // singular box only, no array, id better be unique
+        function doInsert(bbox, id) {
+            bbox.id = id;
+
+            var oldbox = _entitybboxes[id];
+            if (oldbox) {
+                _rdrawn.remove(oldbox);
+            }
+            _entitybboxes[id] = bbox;
+            _rdrawn.insert(bbox);
+        }
+
+
         function tryInsert(bboxes, id, saveSkipped) {
-            var skipped = false,
-                bbox;
+            var skipped = false;
 
             for (var i = 0; i < bboxes.length; i++) {
-                bbox = bboxes[i];
+                var bbox = bboxes[i];
                 bbox.id = id;
 
                 // Check that label is visible
@@ -44223,28 +44744,30 @@ function svgLabels(projection, context) {
                     skipped = true;
                     break;
                 }
-                if (rdrawn.collides(bbox)) {
+                if (_rdrawn.collides(bbox)) {
                     skipped = true;
                     break;
                 }
             }
 
-            entitybboxes[id] = bboxes;
+            _entitybboxes[id] = bboxes;
 
             if (skipped) {
                 if (saveSkipped) {
-                    rskipped.load(bboxes);
+                    _rskipped.load(bboxes);
                 }
             } else {
-                rdrawn.load(bboxes);
+                _rdrawn.load(bboxes);
             }
 
             return !skipped;
         }
 
 
-        var label = selection.selectAll('.layer-label'),
-            halo = selection.selectAll('.layer-halo');
+        var layer = selection.selectAll('.layer-labels');
+        var halo = layer.selectAll('.layer-labels-halo');
+        var label = layer.selectAll('.layer-labels-label');
+        var debug = layer.selectAll('.layer-labels-debug');
 
         // points
         drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
@@ -44262,51 +44785,74 @@ function svgLabels(projection, context) {
         drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
 
         // debug
-        drawCollisionBoxes(label, rskipped, 'debug-skipped');
-        drawCollisionBoxes(label, rdrawn, 'debug-drawn');
+        drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
+        drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
 
-        selection.call(filterLabels);
+        layer.call(filterLabels);
     }
 
 
     function filterLabels(selection) {
         var layers = selection
-            .selectAll('.layer-label, .layer-halo');
+            .selectAll('.layer-labels-label, .layer-labels-halo');
 
-        layers.selectAll('.proximate')
-            .classed('proximate', false);
+        layers.selectAll('.nolabel')
+            .classed('nolabel', false);
 
-        var mouse = context.mouse(),
-            graph = context.graph(),
-            selectedIDs = context.selectedIDs(),
-            ids = [],
-            pad, bbox;
+        var mouse = context.mouse();
+        var graph = context.graph();
+        var selectedIDs = context.selectedIDs();
+        var ids = [];
+        var pad, bbox;
 
         // hide labels near the mouse
         if (mouse) {
             pad = 20;
             bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
-            ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
+            ids.push.apply(ids, map$4(_rdrawn.search(bbox), 'id'));
         }
 
-        // hide labels along selected ways, or near selected vertices
+        // hide labels on selected nodes (they look weird when dragging / haloed)
         for (var i = 0; i < selectedIDs.length; i++) {
             var entity = graph.hasEntity(selectedIDs[i]);
-            if (!entity) continue;
-            var geometry = entity.geometry(graph);
-
-            if (geometry === 'line') {
+            if (entity && entity.type === 'node') {
                 ids.push(selectedIDs[i]);
-            } else if (geometry === 'vertex') {
-                var point = context.projection(entity.loc);
-                pad = 10;
-                bbox = { minX: point[0] - pad, minY: point[1] - pad, maxX: point[0] + pad, maxY: point[1] + pad };
-                ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
             }
         }
 
         layers.selectAll(utilEntitySelector(ids))
-            .classed('proximate', true);
+            .classed('nolabel', true);
+
+
+        // draw the mouse bbox if debugging is on..
+        var debug = selection.selectAll('.layer-labels-debug');
+        var gj = [];
+        if (context.getDebug('collision')) {
+            gj = bbox ? [{
+                type: 'Polygon',
+                coordinates: [[
+                    [bbox.minX, bbox.minY],
+                    [bbox.maxX, bbox.minY],
+                    [bbox.maxX, bbox.maxY],
+                    [bbox.minX, bbox.maxY],
+                    [bbox.minX, bbox.minY]
+                ]]
+            }] : [];
+        }
+
+        var box = debug.selectAll('.debug-mouse')
+            .data(gj);
+
+        // exit
+        box.exit()
+            .remove();
+
+        // enter/update
+        box.enter()
+            .append('path')
+            .attr('class', 'debug debug-mouse yellow')
+            .merge(box)
+            .attr('d', d3_geoPath());
     }
 
 
@@ -44330,21 +44876,13 @@ function svgLabels(projection, context) {
     return drawLabels;
 }
 
-function svgPointTransform(projection) {
-    return function(entity) {
-        // http://jsperf.com/short-array-join
-        var pt = projection(entity.loc);
-        return 'translate(' + pt[0] + ',' + pt[1] + ')';
-    };
-}
-
 function svgMapillaryImages(projection, context, dispatch) {
-    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
-        minZoom = 12,
-        minMarkerZoom = 16,
-        minViewfieldZoom = 18,
-        layer = d3_select(null),
-        _mapillary;
+    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
+    var minZoom = 12;
+    var minMarkerZoom = 16;
+    var minViewfieldZoom = 18;
+    var layer = d3_select(null);
+    var _mapillary;
 
 
     function init() {
@@ -44455,25 +44993,19 @@ function svgMapillaryImages(projection, context, dispatch) {
         var sequences = (service ? service.sequences(projection) : []);
         var images = (service && showMarkers ? service.images(projection) : []);
 
-        var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
-        var project = projection.stream;
-        var makePath = d3_geoPath().projection({ stream: function(output) {
-            return project(clip(output));
-        }});
-
         var traces = layer.selectAll('.sequences').selectAll('.sequence')
             .data(sequences, function(d) { return d.properties.key; });
 
+        // exit
         traces.exit()
             .remove();
 
+        // enter/update
         traces = traces.enter()
             .append('path')
             .attr('class', 'sequence')
-            .merge(traces);
-
-        traces
-            .attr('d', makePath);
+            .merge(traces)
+            .attr('d', svgPath(projection).geojson);
 
 
         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
@@ -44599,10 +45131,10 @@ function svgMapillaryImages(projection, context, dispatch) {
 }
 
 function svgMapillarySigns(projection, context, dispatch) {
-    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
-        minZoom = 12,
-        layer = d3_select(null),
-        _mapillary;
+    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
+    var minZoom = 12;
+    var layer = d3_select(null);
+    var _mapillary;
 
 
     function init() {
@@ -44763,12 +45295,12 @@ function svgMapillarySigns(projection, context, dispatch) {
 }
 
 function svgOpenstreetcamImages(projection, context, dispatch) {
-    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
-        minZoom = 12,
-        minMarkerZoom = 16,
-        minViewfieldZoom = 18,
-        layer = d3_select(null),
-        _openstreetcam;
+    var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
+    var minZoom = 12;
+    var minMarkerZoom = 16;
+    var minViewfieldZoom = 18;
+    var layer = d3_select(null);
+    var _openstreetcam;
 
 
     function init() {
@@ -44879,25 +45411,19 @@ function svgOpenstreetcamImages(projection, context, dispatch) {
         var sequences = (service ? service.sequences(projection) : []);
         var images = (service && showMarkers ? service.images(projection) : []);
 
-        var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
-        var project = projection.stream;
-        var makePath = d3_geoPath().projection({ stream: function(output) {
-            return project(clip(output));
-        }});
-
         var traces = layer.selectAll('.sequences').selectAll('.sequence')
             .data(sequences, function(d) { return d.properties.key; });
 
+        // exit
         traces.exit()
             .remove();
 
+        // enter/update
         traces = traces.enter()
             .append('path')
             .attr('class', 'sequence')
-            .merge(traces);
-
-        traces
-            .attr('d', makePath);
+            .merge(traces)
+            .attr('d', svgPath(projection).geojson);
 
 
         var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
@@ -45019,10 +45545,34 @@ function svgOsm(projection, context, dispatch) {
 
     function drawOsm(selection) {
         selection.selectAll('.layer-osm')
-            .data(['areas', 'lines', 'hit', 'halo', 'label'])
+            .data(['covered', 'areas', 'lines', 'points', 'labels'])
             .enter()
             .append('g')
             .attr('class', function(d) { return 'layer-osm layer-' + d; });
+
+        selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
+            .data(['areas', 'targets'])
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
+
+        selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
+            .data(['lines', 'targets'])
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
+
+        selection.selectAll('.layer-points').selectAll('.layer-points-group')
+            .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
+
+        selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
+            .data(['halo', 'label', 'debug'])
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
     }
 
 
@@ -45187,13 +45737,63 @@ function svgLines(projection, context) {
     };
 
 
-    function drawLines(selection, graph, entities, filter$$1) {
+    function drawTargets(selection, graph, entities, filter$$1) {
+        var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+        var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+        var getPath = svgPath(projection).geojson;
+        var activeID = context.activeID();
+
+        // The targets and nopes will be MultiLineString sub-segments of the ways
+        var data = { targets: [], nopes: [] };
+
+        entities.forEach(function(way) {
+            var features = svgSegmentWay(way, graph, activeID);
+            data.targets.push.apply(data.targets, features.passive);
+            data.nopes.push.apply(data.nopes, features.active);
+        });
+
+
+        // Targets allow hover and vertex snapping
+        var targets = selection.selectAll('.line.target-allowed')
+            .filter(function(d) { return filter$$1(d.properties.entity); })
+            .data(data.targets, function key(d) { return d.id; });
+
+        // exit
+        targets.exit()
+            .remove();
+
+        // enter/update
+        targets.enter()
+            .append('path')
+            .merge(targets)
+            .attr('d', getPath)
+            .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
+
 
+        // NOPE
+        var nopes = selection.selectAll('.line.target-nope')
+            .filter(function(d) { return filter$$1(d.properties.entity); })
+            .data(data.nopes, function key(d) { return d.id; });
+
+        // exit
+        nopes.exit()
+            .remove();
+
+        // enter/update
+        nopes.enter()
+            .append('path')
+            .merge(nopes)
+            .attr('d', getPath)
+            .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
+    }
+
+
+    function drawLines(selection, graph, entities, filter$$1) {
 
         function waystack(a, b) {
-            var selected = context.selectedIDs(),
-                scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0,
-                scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
+            var selected = context.selectedIDs();
+            var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
+            var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
 
             if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
             if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
@@ -45202,6 +45802,11 @@ function svgLines(projection, context) {
 
 
         function drawLineGroup(selection, klass, isSelected) {
+            // Note: Don't add `.selected` class in draw modes
+            var mode = context.mode();
+            var isDrawing = mode && /^draw/.test(mode.id);
+            var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
+
             var lines = selection
                 .selectAll('path')
                 .filter(filter$$1)
@@ -45210,13 +45815,13 @@ function svgLines(projection, context) {
             lines.exit()
                 .remove();
 
-            // Optimization: call simple TagClasses only on enter selection. This
+            // Optimization: Call expensive TagClasses only on enter selection. This
             // works because osmEntity.key is defined to include the entity v attribute.
             lines.enter()
                 .append('path')
                 .attr('class', function(d) {
-                    return 'way line ' + klass + ' ' + d.id + (isSelected ? ' selected' : '') +
-                        (oldMultiPolygonOuters[d.id] ? ' old-multipolygon' : '');
+                    var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
+                    return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
                 })
                 .call(svgTagClasses())
                 .merge(lines)
@@ -45242,15 +45847,15 @@ function svgLines(projection, context) {
         }
 
 
-        var getPath = svgPath(projection, graph),
-            ways = [],
-            pathdata = {},
-            onewaydata = {},
-            oldMultiPolygonOuters = {};
+        var getPath = svgPath(projection, graph);
+        var ways = [];
+        var pathdata = {};
+        var onewaydata = {};
+        var oldMultiPolygonOuters = {};
 
         for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i],
-                outer = osmSimpleMultipolygonOuterMember(entity, graph);
+            var entity = entities[i];
+            var outer = osmSimpleMultipolygonOuterMember(entity, graph);
             if (outer) {
                 ways.push(entity.mergeTags(outer.tags));
                 oldMultiPolygonOuters[outer.id] = true;
@@ -45268,89 +45873,139 @@ function svgLines(projection, context) {
         });
 
 
-        var layer = selection.selectAll('.layer-lines');
+        var covered = selection.selectAll('.layer-covered');                      // under areas
+        var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
 
-        var layergroup = layer
-            .selectAll('g.layergroup')
-            .data(d3_range(-10, 11));
+        [covered, uncovered].forEach(function(selection) {
+            var range$$1 = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
+            var layergroup = selection
+                .selectAll('g.layergroup')
+                .data(range$$1);
 
-        layergroup = layergroup.enter()
-            .append('g')
-            .attr('class', function(d) { return 'layergroup layer' + String(d); })
-            .merge(layergroup);
+            layergroup = layergroup.enter()
+                .append('g')
+                .attr('class', function(d) { return 'layergroup layer' + String(d); })
+                .merge(layergroup);
 
-        layergroup
-            .selectAll('g.linegroup')
-            .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
-            .enter()
-            .append('g')
-            .attr('class', function(d) { return 'linegroup line-' + d; });
+            layergroup
+                .selectAll('g.linegroup')
+                .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
+                .enter()
+                .append('g')
+                .attr('class', function(d) { return 'linegroup line-' + d; });
+
+            layergroup.selectAll('g.line-shadow')
+                .call(drawLineGroup, 'shadow', false);
+            layergroup.selectAll('g.line-casing')
+                .call(drawLineGroup, 'casing', false);
+            layergroup.selectAll('g.line-stroke')
+                .call(drawLineGroup, 'stroke', false);
+
+            layergroup.selectAll('g.line-shadow-highlighted')
+                .call(drawLineGroup, 'shadow', true);
+            layergroup.selectAll('g.line-casing-highlighted')
+                .call(drawLineGroup, 'casing', true);
+            layergroup.selectAll('g.line-stroke-highlighted')
+                .call(drawLineGroup, 'stroke', true);
+
+
+            var onewaygroup = layergroup
+                .selectAll('g.onewaygroup')
+                .data(['oneway']);
+
+            onewaygroup = onewaygroup.enter()
+                .append('g')
+                .attr('class', 'onewaygroup')
+                .merge(onewaygroup);
+
+            var oneways = onewaygroup
+                .selectAll('path')
+                .filter(filter$$1)
+                .data(
+                    function data() { return onewaydata[this.parentNode.__data__] || []; },
+                    function key(d) { return [d.id, d.index]; }
+                );
 
+            oneways.exit()
+                .remove();
 
-        layergroup.selectAll('g.line-shadow')
-            .call(drawLineGroup, 'shadow', false);
-        layergroup.selectAll('g.line-casing')
-            .call(drawLineGroup, 'casing', false);
-        layergroup.selectAll('g.line-stroke')
-            .call(drawLineGroup, 'stroke', false);
+            oneways = oneways.enter()
+                .append('path')
+                .attr('class', 'oneway')
+                .attr('marker-mid', 'url(#oneway-marker)')
+                .merge(oneways)
+                .attr('d', function(d) { return d.d; });
 
-        layergroup.selectAll('g.line-shadow-highlighted')
-            .call(drawLineGroup, 'shadow', true);
-        layergroup.selectAll('g.line-casing-highlighted')
-            .call(drawLineGroup, 'casing', true);
-        layergroup.selectAll('g.line-stroke-highlighted')
-            .call(drawLineGroup, 'stroke', true);
+            if (detected.ie) {
+                oneways.each(function() { this.parentNode.insertBefore(this, this); });
+            }
+        });
 
+        // touch targets
+        selection.selectAll('.layer-lines .layer-lines-targets')
+            .call(drawTargets, graph, ways, filter$$1);
+    }
 
-        var onewaygroup = layergroup
-            .selectAll('g.onewaygroup')
-            .data(['oneway']);
 
-        onewaygroup = onewaygroup.enter()
-            .append('g')
-            .attr('class', 'onewaygroup')
-            .merge(onewaygroup);
+    return drawLines;
+}
 
-        var oneways = onewaygroup
-            .selectAll('path')
-            .filter(filter$$1)
-            .data(
-                function() { return onewaydata[this.parentNode.__data__] || []; },
-                function(d) { return [d.id, d.index]; }
-            );
+function svgMidpoints(projection, context) {
+    var targetRadius = 8;
 
-        oneways.exit()
-            .remove();
+    function drawTargets(selection, graph, entities, filter) {
+        var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+        var getTransform = svgPointTransform(projection).geojson;
 
-        oneways = oneways.enter()
-            .append('path')
-            .attr('class', 'oneway')
-            .attr('marker-mid', 'url(#oneway-marker)')
-            .merge(oneways)
-            .attr('d', function(d) { return d.d; });
+        var data = entities.map(function(midpoint) {
+            return {
+                type: 'Feature',
+                id: midpoint.id,
+                properties: {
+                    target: true,
+                    entity: midpoint
+                },
+                geometry: {
+                    type: 'Point',
+                    coordinates: midpoint.loc
+                }
+            };
+        });
 
-        if (detected.ie) {
-            oneways.each(function() { this.parentNode.insertBefore(this, this); });
-        }
-    }
+        var targets = selection.selectAll('.midpoint.target')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data, function key(d) { return d.id; });
 
+        // exit
+        targets.exit()
+            .remove();
 
-    return drawLines;
-}
+        // enter/update
+        targets.enter()
+            .append('circle')
+            .attr('r', targetRadius)
+            .merge(targets)
+            .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
+            .attr('transform', getTransform);
+    }
 
-function svgMidpoints(projection, context) {
 
-    return function drawMidpoints(selection, graph, entities, filter, extent) {
-        var layer = selection.selectAll('.layer-hit');
+    function drawMidpoints(selection, graph, entities, filter, extent) {
+        var layer = selection.selectAll('.layer-points .layer-points-midpoints');
 
         var mode = context.mode();
         if (mode && mode.id !== 'select') {
-            layer.selectAll('g.midpoint').remove();
+            layer.selectAll('g.midpoint')
+                .remove();
+
+            selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
+                .remove();
+
             return;
         }
 
-        var poly = extent.polygon(),
-            midpoints = {};
+        var poly = extent.polygon();
+        var midpoints = {};
 
         for (var i = 0; i < entities.length; i++) {
             var entity = entities[i];
@@ -45365,16 +46020,16 @@ function svgMidpoints(projection, context) {
             var nodes = graph.childNodes(entity);
             for (var j = 0; j < nodes.length - 1; j++) {
 
-                var a = nodes[j],
-                    b = nodes[j + 1],
-                    id = [a.id, b.id].sort().join('-');
+                var a = nodes[j];
+                var b = nodes[j + 1];
+                var id = [a.id, b.id].sort().join('-');
 
                 if (midpoints[id]) {
                     midpoints[id].parents.push(entity);
                 } else {
-                    if (geoEuclideanDistance(projection(a.loc), projection(b.loc)) > 40) {
-                        var point = geoInterp(a.loc, b.loc, 0.5),
-                            loc = null;
+                    if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
+                        var point = geoVecInterp(a.loc, b.loc, 0.5);
+                        var loc = null;
 
                         if (extent.intersects(point)) {
                             loc = point;
@@ -45382,8 +46037,8 @@ function svgMidpoints(projection, context) {
                             for (var k = 0; k < 4; k++) {
                                 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
                                 if (point &&
-                                    geoEuclideanDistance(projection(a.loc), projection(point)) > 20 &&
-                                    geoEuclideanDistance(projection(b.loc), projection(point)) > 20)
+                                    geoVecLength(projection(a.loc), projection(point)) > 20 &&
+                                    geoVecLength(projection(b.loc), projection(point)) > 20)
                                 {
                                     loc = point;
                                     break;
@@ -45432,22 +46087,24 @@ function svgMidpoints(projection, context) {
             .insert('g', ':first-child')
             .attr('class', 'midpoint');
 
-        enter.append('polygon')
+        enter
+            .append('polygon')
             .attr('points', '-6,8 10,0 -6,-8')
             .attr('class', 'shadow');
 
-        enter.append('polygon')
+        enter
+            .append('polygon')
             .attr('points', '-3,4 5,0 -3,-4')
             .attr('class', 'fill');
 
         groups = groups
             .merge(enter)
             .attr('transform', function(d) {
-                var translate = svgPointTransform(projection),
-                    a = graph.entity(d.edge[0]),
-                    b = graph.entity(d.edge[1]),
-                    angleVal = Math.round(geoAngle(a, b, projection) * (180 / Math.PI));
-                return translate(d) + ' rotate(' + angleVal + ')';
+                var translate = svgPointTransform(projection);
+                var a = graph.entity(d.edge[0]);
+                var b = graph.entity(d.edge[1]);
+                var angle = geoAngle(a, b, projection) * (180 / Math.PI);
+                return translate(d) + ' rotate(' + angle + ')';
             })
             .call(svgTagClasses().tags(
                 function(d) { return d.parents[0].tags; }
@@ -45457,59 +46114,128 @@ function svgMidpoints(projection, context) {
         groups.select('polygon.shadow');
         groups.select('polygon.fill');
 
-    };
+
+        // Draw touch targets..
+        selection.selectAll('.layer-points .layer-points-targets')
+            .call(drawTargets, graph, values$1(midpoints), midpointFilter);
+    }
+
+    return drawMidpoints;
+}
+
+// Touch targets control which other vertices we can drag a vertex onto.
+//
+// - the activeID - nope
+// - 1 away (adjacent) to the activeID - yes (vertices will be merged)
+// - 2 away from the activeID - nope (would create a self intersecting segment)
+// - all others on a linear way - yes
+// - all others on a closed way - nope (would create a self intersecting polygon)
+//
+// returns
+// 0 = active vertex - no touch/connect
+// 1 = passive vertex - yes touch/connect
+// 2 = adjacent vertex - yes but pay attention segmenting a line here
+//
+function svgPassiveVertex(node, graph, activeID) {
+    if (!activeID) return 1;
+    if (activeID === node.id) return 0;
+
+    var parents = graph.parentWays(node);
+
+    for (var i = 0; i < parents.length; i++) {
+        var nodes = parents[i].nodes;
+        var isClosed = parents[i].isClosed();
+        for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
+            if (nodes[j] === node.id) {
+                var ix1 = j - 2;
+                var ix2 = j - 1;
+                var ix3 = j + 1;
+                var ix4 = j + 2;
+
+                if (isClosed) {  // wraparound if needed
+                    var max = nodes.length - 1;
+                    if (ix1 < 0)   ix1 = max + ix1;
+                    if (ix2 < 0)   ix2 = max + ix2;
+                    if (ix3 > max) ix3 = ix3 - max;
+                    if (ix4 > max) ix4 = ix4 - max;
+                }
+
+                if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
+                else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
+                else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
+                else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
+                else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
+            }
+        }
+    }
+
+    return 1;   // ok
 }
 
+
 function svgOneWaySegments(projection, graph, dt) {
     return function(entity) {
-        var a,
-            b,
-            i = 0,
-            offset = dt,
-            segments = [],
-            clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream,
-            coordinates = graph.childNodes(entity).map(function(n) {
-                return n.loc;
-            });
+        var i = 0;
+        var offset = dt;
+        var segments = [];
+        var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
+        var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
+        var a, b;
+
+        if (entity.tags.oneway === '-1') {
+            coordinates.reverse();
+        }
 
-        if (entity.tags.oneway === '-1') coordinates.reverse();
+        var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
 
         d3_geoStream({
             type: 'LineString',
             coordinates: coordinates
         }, projection.stream(clip({
             lineStart: function() {},
-            lineEnd: function() {
-                a = null;
-            },
+            lineEnd: function() { a = null; },
             point: function(x, y) {
                 b = [x, y];
 
                 if (a) {
-                    var span = geoEuclideanDistance(a, b) - offset;
+                    var span = geoVecLength(a, b) - offset;
 
                     if (span >= 0) {
-                        var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
-                            dx = dt * Math.cos(angle),
-                            dy = dt * Math.sin(angle),
-                            p = [a[0] + offset * Math.cos(angle),
-                                 a[1] + offset * Math.sin(angle)];
-
-                        var segment = 'M' + a[0] + ',' + a[1] +
-                                      'L' + p[0] + ',' + p[1];
+                        var heading = geoVecAngle(a, b);
+                        var dx = dt * Math.cos(heading);
+                        var dy = dt * Math.sin(heading);
+                        var p = [
+                            a[0] + offset * Math.cos(heading),
+                            a[1] + offset * Math.sin(heading)
+                        ];
 
+                        // gather coordinates
+                        var coord = [a, p];
                         for (span -= dt; span >= 0; span -= dt) {
-                            p[0] += dx;
-                            p[1] += dy;
-                            segment += 'L' + p[0] + ',' + p[1];
+                            p = geoVecAdd(p, [dx, dy]);
+                            coord.push(p);
+                        }
+                        coord.push(b);
+
+                        // generate svg paths
+                        var segment = '';
+                        var j;
+
+                        for (j = 0; j < coord.length; j++) {
+                            segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
                         }
+                        segments.push({ id: entity.id, index: i++, d: segment });
 
-                        segment += 'L' + b[0] + ',' + b[1];
-                        segments.push({id: entity.id, index: i, d: segment});
+                        if (isReversible) {
+                            segment = '';
+                            for (j = coord.length - 1; j >= 0; j--) {
+                                segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
+                            }
+                            segments.push({ id: entity.id, index: i++, d: segment });
+                        }
                     }
 
                     offset = -span;
-                    i++;
                 }
 
                 a = b;
@@ -45520,6 +46246,7 @@ function svgOneWaySegments(projection, graph, dt) {
     };
 }
 
+
 function svgPath(projection, graph, isArea) {
 
     // Explanation of magic numbers:
@@ -45531,25 +46258,125 @@ function svgPath(projection, graph, isArea) {
     // When drawing areas, pad viewport by 65px in each direction to allow
     // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
 
-    var cache = {},
-        padding = isArea ? 65 : 5,
-        viewport = projection.clipExtent(),
-        paddedExtent = [
-            [viewport[0][0] - padding, viewport[0][1] - padding],
-            [viewport[1][0] + padding, viewport[1][1] + padding]
-        ],
-        clip = d3_geoIdentity().clipExtent(paddedExtent).stream,
-        project = projection.stream,
-        path = d3_geoPath()
-            .projection({stream: function(output) { return project(clip(output)); }});
+    var cache = {};
+    var padding = isArea ? 65 : 5;
+    var viewport = projection.clipExtent();
+    var paddedExtent = [
+        [viewport[0][0] - padding, viewport[0][1] - padding],
+        [viewport[1][0] + padding, viewport[1][1] + padding]
+    ];
+    var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
+    var project = projection.stream;
+    var path = d3_geoPath()
+        .projection({stream: function(output) { return project(clip(output)); }});
 
-    return function(entity) {
+    var svgpath = function(entity) {
         if (entity.id in cache) {
             return cache[entity.id];
         } else {
             return cache[entity.id] = path(entity.asGeoJSON(graph));
         }
     };
+
+    svgpath.geojson = path;
+
+    return svgpath;
+}
+
+
+function svgPointTransform(projection) {
+    var svgpoint = function(entity) {
+        // http://jsperf.com/short-array-join
+        var pt = projection(entity.loc);
+        return 'translate(' + pt[0] + ',' + pt[1] + ')';
+    };
+
+    svgpoint.geojson = function(d) {
+        return svgpoint(d.properties.entity);
+    };
+
+    return svgpoint;
+}
+
+
+function svgRelationMemberTags(graph) {
+    return function(entity) {
+        var tags = entity.tags;
+        graph.parentRelations(entity).forEach(function(relation) {
+            var type = relation.tags.type;
+            if (type === 'multipolygon' || type === 'boundary') {
+                tags = assignIn({}, relation.tags, tags);
+            }
+        });
+        return tags;
+    };
+}
+
+
+function svgSegmentWay(way, graph, activeID) {
+    var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
+    var features = { passive: [], active: [] };
+    var start = {};
+    var end = {};
+    var node, type;
+
+    for (var i = 0; i < way.nodes.length; i++) {
+        node = graph.entity(way.nodes[i]);
+        type = svgPassiveVertex(node, graph, activeID);
+        end = { node: node, type: type };
+
+        if (start.type !== undefined) {
+            if (start.node.id === activeID || end.node.id === activeID) {
+                // push nothing
+            } else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
+                pushActive(start, end, i);
+            } else if (start.type === 0 && end.type === 0) {   // both active vertices
+                pushActive(start, end, i);
+            } else {
+                pushPassive(start, end, i);
+            }
+        }
+
+        start = end;
+    }
+
+    return features;
+
+
+    function pushActive(start, end, index) {
+        features.active.push({
+            type: 'Feature',
+            id: way.id + '-' + index + '-nope',
+            properties: {
+                nope: true,
+                target: true,
+                entity: way,
+                nodes: [start.node, end.node],
+                index: index
+            },
+            geometry: {
+                type: 'LineString',
+                coordinates: [start.node.loc, end.node.loc]
+            }
+        });
+    }
+
+    function pushPassive(start, end, index) {
+        features.passive.push({
+            type: 'Feature',
+            id: way.id + '-' + index,
+            properties: {
+                target: true,
+                entity: way,
+                nodes: [start.node, end.node],
+                index: index
+            },
+            geometry: {
+                type: 'LineString',
+                coordinates: [start.node.loc, end.node.loc]
+            }
+        });
+    }
 }
 
 function svgPoints(projection, context) {
@@ -45566,19 +46393,77 @@ function svgPoints(projection, context) {
     }
 
 
-    return function drawPoints(selection, graph, entities, filter$$1) {
-        var wireframe = context.surface().classed('fill-wireframe'),
-            points = wireframe ? [] : filter(entities, function(e) {
-                return e.geometry(graph) === 'point';
+    // Avoid exit/enter if we're just moving stuff around.
+    // The node will get a new version but we only need to run the update selection.
+    function fastEntityKey(d) {
+        var mode = context.mode();
+        var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+        return isMoving ? d.id : osmEntity.key(d);
+    }
+
+
+    function drawTargets(selection, graph, entities, filter) {
+        var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+        var getTransform = svgPointTransform(projection).geojson;
+        var activeID = context.activeID();
+        var data$$1 = [];
+
+        entities.forEach(function(node) {
+            if (activeID === node.id) return;   // draw no target on the activeID
+
+            data$$1.push({
+                type: 'Feature',
+                id: node.id,
+                properties: {
+                    target: true,
+                    entity: node
+                },
+                geometry: node.asGeoJSON()
             });
+        });
+
+        var targets = selection.selectAll('.point.target')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data$$1, function key(d) { return d.id; });
+
+        // exit
+        targets.exit()
+            .remove();
+
+        // enter/update
+        targets.enter()
+            .append('rect')
+            .attr('x', -10)
+            .attr('y', -26)
+            .attr('width', 20)
+            .attr('height', 30)
+            .merge(targets)
+            .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
+            .attr('transform', getTransform);
+    }
+
+
+    function drawPoints(selection, graph, entities, filter) {
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+
+        // points with a direction will render as vertices at higher zooms
+        function renderAsPoint(entity) {
+            return entity.geometry(graph) === 'point' &&
+                !(zoom >= 18 && entity.directions(graph, projection).length);
+        }
+
+        // all points will render as vertices in wireframe mode too
+        var points = wireframe ? [] : entities.filter(renderAsPoint);
 
         points.sort(sortY);
 
-        var layer = selection.selectAll('.layer-hit');
+
+        var layer = selection.selectAll('.layer-points .layer-points-points');
 
         var groups = layer.selectAll('g.point')
-            .filter(filter$$1)
-            .data(points, osmEntity.key);
+            .filter(filter)
+            .data(points, fastEntityKey);
 
         groups.exit()
             .remove();
@@ -45588,20 +46473,24 @@ function svgPoints(projection, context) {
             .attr('class', function(d) { return 'node point ' + d.id; })
             .order();
 
-        enter.append('path')
+        enter
+            .append('path')
             .call(markerPath, 'shadow');
 
-        enter.append('ellipse')
+        enter
+            .append('ellipse')
             .attr('cx', 0.5)
             .attr('cy', 1)
             .attr('rx', 6.5)
             .attr('ry', 3)
             .attr('class', 'stroke');
 
-        enter.append('path')
+        enter
+            .append('path')
             .call(markerPath, 'stroke');
 
-        enter.append('use')
+        enter
+            .append('use')
             .attr('transform', 'translate(-5, -19)')
             .attr('class', 'icon')
             .attr('width', '11px')
@@ -45618,8 +46507,8 @@ function svgPoints(projection, context) {
         groups.select('.stroke');
         groups.select('.icon')
             .attr('xlink:href', function(entity) {
-                var preset = context.presets().match(entity, graph),
-                    picon = preset && preset.icon;
+                var preset = context.presets().match(entity, graph);
+                var picon = preset && preset.icon;
 
                 if (!picon)
                     return '';
@@ -45628,20 +46517,15 @@ function svgPoints(projection, context) {
                     return '#' + picon + (isMaki ? '-11' : '');
                 }
             });
-    };
-}
 
-function svgRelationMemberTags(graph) {
-    return function(entity) {
-        var tags = entity.tags;
-        graph.parentRelations(entity).forEach(function(relation) {
-            var type = relation.tags.type;
-            if (type === 'multipolygon' || type === 'boundary') {
-                tags = assignIn({}, relation.tags, tags);
-            }
-        });
-        return tags;
-    };
+
+        // touch targets
+        selection.selectAll('.layer-points .layer-points-targets')
+            .call(drawTargets, graph, points, filter);
+    }
+
+
+    return drawPoints;
 }
 
 function svgTagClasses() {
@@ -45776,7 +46660,8 @@ function svgTurns(projection) {
                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
         }
 
-        var groups = selection.selectAll('.layer-hit').selectAll('g.turn')
+        var layer = selection.selectAll('.layer-points .layer-points-turns');
+        var groups = layer.selectAll('g.turn')
             .data(turns, key);
 
         groups.exit()
@@ -45840,202 +46725,412 @@ function svgTurns(projection) {
 
 function svgVertices(projection, context) {
     var radiuses = {
-        //       z16-, z17, z18+, tagged
-        shadow: [6,    7.5,   7.5,  11.5],
-        stroke: [2.5,  3.5,   3.5,  7],
-        fill:   [1,    1.5,   1.5,  1.5]
+        //       z16-, z17,   z18+,  w/icon
+        shadow: [6,    7.5,   7.5,   12],
+        stroke: [2.5,  3.5,   3.5,   8],
+        fill:   [1,    1.5,   1.5,   1.5]
     };
 
-    var hover;
+    var _currHoverTarget;
+    var _currPersistent = {};
+    var _currHover = {};
+    var _prevHover = {};
+    var _currSelected = {};
+    var _prevSelected = {};
+    var _radii = {};
 
 
-    function siblingAndChildVertices(ids, graph, extent) {
-        var vertices = {};
+    function sortY(a, b) {
+        return b.loc[1] - a.loc[1];
+    }
 
-        function addChildVertices(entity) {
-            if (!context.features().isHiddenFeature(entity, graph, entity.geometry(graph))) {
-                var i;
-                if (entity.type === 'way') {
-                    for (i = 0; i < entity.nodes.length; i++) {
-                        addChildVertices(graph.entity(entity.nodes[i]));
-                    }
-                } else if (entity.type === 'relation') {
-                    for (i = 0; i < entity.members.length; i++) {
-                        var member = context.hasEntity(entity.members[i].id);
-                        if (member) {
-                            addChildVertices(member);
-                        }
-                    }
-                } else if (entity.intersects(extent, graph)) {
-                    vertices[entity.id] = entity;
-                }
-            }
-        }
+    // Avoid exit/enter if we're just moving stuff around.
+    // The node will get a new version but we only need to run the update selection.
+    function fastEntityKey(d) {
+        var mode = context.mode();
+        var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+        return isMoving ? d.id : osmEntity.key(d);
+    }
 
-        ids.forEach(function(id) {
-            var entity = context.hasEntity(id);
-            if (entity && entity.type === 'node') {
-                vertices[entity.id] = entity;
-                context.graph().parentWays(entity).forEach(function(entity) {
-                    addChildVertices(entity);
-                });
-            } else if (entity) {
-                addChildVertices(entity);
-            }
-        });
 
-        return vertices;
-    }
+    function draw(selection, graph, vertices, sets, filter) {
+        sets = sets || { selected: {}, important: {}, hovered: {} };
 
+        var icons = {};
+        var directions = {};
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+        var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
 
-    function draw(selection, vertices, klass, graph, zoom, siblings) {
 
-        function icon(entity) {
+        function getIcon(entity) {
             if (entity.id in icons) return icons[entity.id];
+
             icons[entity.id] =
                 entity.hasInterestingTags() &&
                 context.presets().match(entity, graph).icon;
             return icons[entity.id];
         }
 
-        function setClass(klass) {
-            return function(entity) {
-                this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
-            };
+
+        // memoize directions results, return false for empty arrays (for use in filter)
+        function getDirections(entity) {
+            if (entity.id in directions) return directions[entity.id];
+
+            var angles = entity.directions(graph, projection);
+            directions[entity.id] = angles.length ? angles : false;
+            return angles;
         }
 
-        function setAttributes(selection) {
-            ['shadow','stroke','fill'].forEach(function(klass) {
+
+        function updateAttributes(selection) {
+            ['shadow', 'stroke', 'fill'].forEach(function(klass) {
                 var rads = radiuses[klass];
                 selection.selectAll('.' + klass)
                     .each(function(entity) {
-                        var i = z && icon(entity),
-                            c = i ? 0.5 : 0,
-                            r = rads[i ? 3 : z];
+                        var i = z && getIcon(entity);
+                        var r = rads[i ? 3 : z];
 
                         // slightly increase the size of unconnected endpoints #3775
                         if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
                             r += 1.5;
                         }
 
-                        this.setAttribute('cx', c);
-                        this.setAttribute('cy', -c);
-                        this.setAttribute('r', r);
-                        if (i && klass === 'fill') {
-                            this.setAttribute('visibility', 'hidden');
-                        } else {
-                            this.removeAttribute('visibility');
+                        if (klass === 'shadow') {   // remember this value, so we don't need to
+                            _radii[entity.id] = r;  // recompute it when we draw the touch targets
                         }
+
+                        d3_select(this)
+                            .attr('r', r)
+                            .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
                     });
             });
 
             selection.selectAll('use')
-                .each(function() {
-                    if (z) {
-                        this.removeAttribute('visibility');
-                    } else {
-                        this.setAttribute('visibility', 'hidden');
-                    }
-                });
+                .attr('visibility', (z === 0 ? 'hidden' : null));
         }
 
+        vertices.sort(sortY);
 
-        siblings = siblings || {};
-
-        var icons = {},
-            z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
-
-        var groups = selection
-            .data(vertices, osmEntity.key);
+        var groups = selection.selectAll('g.vertex')
+            .filter(filter)
+            .data(vertices, fastEntityKey);
 
+        // exit
         groups.exit()
             .remove();
 
+        // enter
         var enter = groups.enter()
             .append('g')
-            .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
+            .attr('class', function(d) { return 'node vertex ' + d.id; })
+            .order();
 
-        enter.append('circle')
-            .each(setClass('shadow'));
+        enter
+            .append('circle')
+            .attr('class', 'shadow');
 
-        enter.append('circle')
-            .each(setClass('stroke'));
+        enter
+            .append('circle')
+            .attr('class', 'stroke');
 
         // Vertices with icons get a `use`.
-        enter.filter(function(d) { return icon(d); })
+        enter.filter(function(d) { return getIcon(d); })
             .append('use')
-            .attr('transform', 'translate(-5, -6)')
-            .attr('xlink:href', function(d) {
-                var picon = icon(d),
-                    isMaki = dataFeatureIcons.indexOf(picon) !== -1;
-                return '#' + picon + (isMaki ? '-11' : '');
-            })
+            .attr('class', 'icon')
             .attr('width', '11px')
             .attr('height', '11px')
-            .each(setClass('icon'));
+            .attr('transform', 'translate(-5.5, -5.5)')
+            .attr('xlink:href', function(d) {
+                var picon = getIcon(d);
+                var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
+                return '#' + picon + (isMaki ? '-11' : '');
+            });
 
         // Vertices with tags get a fill.
         enter.filter(function(d) { return d.hasInterestingTags(); })
             .append('circle')
-            .each(setClass('fill'));
+            .attr('class', 'fill');
 
-        groups
+        // update
+        groups = groups
             .merge(enter)
             .attr('transform', svgPointTransform(projection))
-            .classed('sibling', function(entity) { return entity.id in siblings; })
-            .classed('shared', function(entity) { return graph.isShared(entity); })
-            .classed('endpoint', function(entity) { return entity.isEndpoint(graph); })
-            .call(setAttributes);
+            .classed('sibling', function(d) { return d.id in sets.selected; })
+            .classed('shared', function(d) { return graph.isShared(d); })
+            .classed('endpoint', function(d) { return d.isEndpoint(graph); })
+            .call(updateAttributes);
+
+
+        // Directional vertices get viewfields
+        var dgroups = groups.filter(function(d) { return getDirections(d); })
+            .selectAll('.viewfieldgroup')
+            .data(function data$$1(d) { return zoom >= 18 ? [d] : []; }, osmEntity.key);
+
+        // exit
+        dgroups.exit()
+            .remove();
+
+        // enter/update
+        dgroups = dgroups.enter()
+            .insert('g', '.shadow')
+            .attr('class', 'viewfieldgroup')
+            .merge(dgroups);
+
+        var viewfields = dgroups.selectAll('.viewfield')
+            .data(getDirections, function key(d) { return d; });
+
+        // exit
+        viewfields.exit()
+            .remove();
+
+        // enter/update
+        viewfields.enter()
+            .append('path')
+            .attr('class', 'viewfield')
+            .attr('d', 'M0,0H0')
+            .merge(viewfields)
+            .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
+            .attr('transform', function(d) { return 'rotate(' + d + ')'; });
     }
 
 
-    function drawVertices(selection, graph, entities, filter, extent, zoom) {
-        var siblings = siblingAndChildVertices(context.selectedIDs(), graph, extent),
-            wireframe = context.surface().classed('fill-wireframe'),
-            vertices = [];
+    function drawTargets(selection, graph, entities, filter) {
+        var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+        var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
+        var getTransform = svgPointTransform(projection).geojson;
+        var activeID = context.activeID();
+        var data$$1 = { targets: [], nopes: [] };
 
-        for (var i = 0; i < entities.length; i++) {
-            var entity = entities[i],
-                geometry = entity.geometry(graph);
+        entities.forEach(function(node) {
+            if (activeID === node.id) return;   // draw no target on the activeID
 
-            if (wireframe && geometry === 'point') {
-                vertices.push(entity);
-                continue;
+            var vertexType = svgPassiveVertex(node, graph, activeID);
+            if (vertexType !== 0) {     // passive or adjacent - allow to connect
+                data$$1.targets.push({
+                    type: 'Feature',
+                    id: node.id,
+                    properties: {
+                        target: true,
+                        entity: node
+                    },
+                    geometry: node.asGeoJSON()
+                });
+            } else {
+                data$$1.nopes.push({
+                    type: 'Feature',
+                    id: node.id + '-nope',
+                    properties: {
+                        nope: true,
+                        target: true,
+                        entity: node
+                    },
+                    geometry: node.asGeoJSON()
+                });
             }
+        });
 
-            if (geometry !== 'vertex')
-                continue;
 
-            if (entity.id in siblings ||
-                entity.hasInterestingTags() ||
-                entity.isEndpoint(graph) ||
-                entity.isConnected(graph)) {
-                vertices.push(entity);
+        // Targets allow hover and vertex snapping
+        var targets = selection.selectAll('.vertex.target-allowed')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data$$1.targets, function key(d) { return d.id; });
+
+        // exit
+        targets.exit()
+            .remove();
+
+        // enter/update
+        targets.enter()
+            .append('circle')
+            .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
+            .merge(targets)
+            .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
+            .attr('transform', getTransform);
+
+
+        // NOPE
+        var nopes = selection.selectAll('.vertex.target-nope')
+            .filter(function(d) { return filter(d.properties.entity); })
+            .data(data$$1.nopes, function key(d) { return d.id; });
+
+        // exit
+        nopes.exit()
+            .remove();
+
+        // enter/update
+        nopes.enter()
+            .append('circle')
+            .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
+            .merge(nopes)
+            .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
+            .attr('transform', getTransform);
+    }
+
+
+    // Points can also render as vertices:
+    // 1. in wireframe mode or
+    // 2. at higher zooms if they have a direction
+    function renderAsVertex(entity, graph, wireframe, zoom) {
+        var geometry = entity.geometry(graph);
+        return geometry === 'vertex' || (geometry === 'point' && (
+            wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
+        ));
+    }
+
+
+    function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
+        var results = {};
+
+        function addChildVertices(entity) {
+            var geometry = entity.geometry(graph);
+            if (!context.features().isHiddenFeature(entity, graph, geometry)) {
+                var i;
+                if (entity.type === 'way') {
+                    for (i = 0; i < entity.nodes.length; i++) {
+                        var child = graph.hasEntity(entity.nodes[i]);
+                        if (child) {
+                            addChildVertices(child);
+                        }
+                    }
+                } else if (entity.type === 'relation') {
+                    for (i = 0; i < entity.members.length; i++) {
+                        var member = graph.hasEntity(entity.members[i].id);
+                        if (member) {
+                            addChildVertices(member);
+                        }
+                    }
+                } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
+                    results[entity.id] = entity;
+                }
             }
         }
 
-        var layer = selection.selectAll('.layer-hit');
-        layer.selectAll('g.vertex.vertex-persistent')
-            .filter(filter)
-            .call(draw, vertices, 'vertex-persistent', graph, zoom, siblings);
+        ids.forEach(function(id) {
+            var entity = graph.hasEntity(id);
+            if (!entity) return;
+
+            if (entity.type === 'node') {
+                if (renderAsVertex(entity, graph, wireframe, zoom)) {
+                    results[entity.id] = entity;
+                    graph.parentWays(entity).forEach(function(entity) {
+                        addChildVertices(entity);
+                    });
+                }
+            } else {  // way, relation
+                addChildVertices(entity);
+            }
+        });
 
-        drawHover(selection, graph, extent, zoom);
+        return results;
     }
 
 
-    function drawHover(selection, graph, extent, zoom) {
-        var hovered = hover ? siblingAndChildVertices([hover.id], graph, extent) : {};
-        var layer = selection.selectAll('.layer-hit');
+    function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+        var mode = context.mode();
+        var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
+
+        if (fullRedraw) {
+            _currPersistent = {};
+            _radii = {};
+        }
+
+        // Collect important vertices from the `entities` list..
+        // (during a paritial redraw, it will not contain everything)
+        for (var i = 0; i < entities.length; i++) {
+            var entity = entities[i];
+            var geometry = entity.geometry(graph);
+            var keep = false;
+
+            // a point that looks like a vertex..
+            if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
+                _currPersistent[entity.id] = entity;
+                keep = true;
+
+            // a vertex of some importance..
+            } else if (geometry === 'vertex' &&
+                (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
+                _currPersistent[entity.id] = entity;
+                keep = true;
+            }
+
+            // whatever this is, it's not a persistent vertex..
+            if (!keep && !fullRedraw) {
+                delete _currPersistent[entity.id];
+            }
+        }
+
+        // 3 sets of vertices to consider:
+        var sets = {
+            persistent: _currPersistent,  // persistent = important vertices (render always)
+            selected: _currSelected,      // selected + siblings of selected (render always)
+            hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
+        };
+
+        var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
+
+        // Draw the vertices..
+        // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
+        // Adjust the filter function to expand the scope beyond whatever entities were passed in.
+        var filterRendered = function(d) {
+            return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
+        };
+        selection.selectAll('.layer-points .layer-points-vertices')
+            .call(draw, graph, currentVisible(all), sets, filterRendered);
+
+        // Draw touch targets..
+        // When drawing, render all targets (not just those affected by a partial redraw)
+        var filterTouch = function(d) {
+            return isMoving ? true : filterRendered(d);
+        };
+        selection.selectAll('.layer-points .layer-points-targets')
+            .call(drawTargets, graph, currentVisible(all), filterTouch);
+
 
-        layer.selectAll('g.vertex.vertex-hover')
-            .call(draw, values$1(hovered), 'vertex-hover', graph, zoom);
+        function currentVisible(which) {
+            return Object.keys(which)
+                .map(graph.hasEntity, graph)     // the current version of this entity
+                .filter(function (entity) { return entity && entity.intersects(extent, graph); });
+        }
     }
 
 
-    drawVertices.drawHover = function(selection, graph, target, extent, zoom) {
-        if (target === hover) return;
-        hover = target;
-        drawHover(selection, graph, extent, zoom);
+    // partial redraw - only update the selected items..
+    drawVertices.drawSelected = function(selection, graph, extent) {
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+
+        _prevSelected = _currSelected || {};
+        _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
+
+        // note that drawVertices will add `_currSelected` automatically if needed..
+        var filter = function(d) { return d.id in _prevSelected; };
+        drawVertices(selection, graph, values$1(_prevSelected), filter, extent, false);
+    };
+
+
+    // partial redraw - only update the hovered items..
+    drawVertices.drawHover = function(selection, graph, target, extent) {
+        if (target === _currHoverTarget) return;  // continue only if something changed
+
+        var wireframe = context.surface().classed('fill-wireframe');
+        var zoom = geoScaleToZoom(projection.scale());
+
+        _prevHover = _currHover || {};
+        _currHoverTarget = target;
+        var entity = target && target.properties && target.properties.entity;
+
+        if (entity) {
+            _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
+        } else {
+            _currHover = {};
+        }
+
+        // note that drawVertices will add `_currHover` automatically if needed..
+        var filter = function(d) { return d.id in _prevHover; };
+        drawVertices(selection, graph, values$1(_prevHover), filter, extent, false);
     };
 
     return drawVertices;
@@ -46215,9676 +47310,10812 @@ function uiAttribution(context) {
     };
 }
 
-function localeDateString(s) {
-    if (!s) return null;
-    var d = new Date(s);
-    if (isNaN(d.getTime())) return null;
-    return d.toLocaleDateString();
+// toggles the visibility of ui elements, using a combination of the
+// hide class, which sets display=none, and a d3 transition for opacity.
+// this will cause blinking when called repeatedly, so check that the
+// value actually changes between calls.
+function uiToggle(show, callback) {
+    return function(selection) {
+        selection
+            .style('opacity', show ? 0 : 1)
+            .classed('hide', false)
+            .transition()
+            .style('opacity', show ? 1 : 0)
+            .on('end', function() {
+                d3_select(this)
+                    .classed('hide', !show)
+                    .style('opacity', null);
+                if (callback) callback.apply(this);
+            });
+    };
 }
 
-function vintageRange(vintage) {
-    var s;
-    if (vintage.start || vintage.end) {
-        s = (vintage.start || '?');
-        if (vintage.start !== vintage.end) {
-            s += ' - ' + (vintage.end || '?');
-        }
-    }
-    return s;
-}
+function uiDisclosure(context, key, expandedDefault) {
+    var dispatch$$1 = dispatch('toggled'),
+        _preference = (context.storage('disclosure.' + key + '.expanded')),
+        _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true')),
+        _title,
+        _updatePreference = true,
+        _content = function () {};
 
 
-function rendererBackgroundSource(data) {
-    var source = clone(data),
-        offset = [0, 0],
-        name = source.name,
-        description = source.description,
-        best = !!source.best,
-        template = source.template;
+    var disclosure = function(selection) {
+        var hideToggle = selection.selectAll('.hide-toggle-' + key)
+            .data([0]);
 
-    source.scaleExtent = data.scaleExtent || [0, 22];
-    source.overzoom = data.overzoom !== false;
+        // enter
+        var hideToggleEnter = hideToggle.enter()
+            .append('a')
+            .attr('href', '#')
+            .attr('class', 'hide-toggle hide-toggle-' + key)
+            .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
 
+        hideToggleEnter
+            .append('span')
+            .attr('class', 'hide-toggle-text');
 
-    source.offset = function(_) {
-        if (!arguments.length) return offset;
-        offset = _;
-        return source;
-    };
+        // update
+        hideToggle = hideToggleEnter
+            .merge(hideToggle);
 
+        hideToggle
+            .on('click', toggle)
+            .classed('expanded', _expanded);
 
-    source.nudge = function(_, zoomlevel) {
-        offset[0] += _[0] / Math.pow(2, zoomlevel);
-        offset[1] += _[1] / Math.pow(2, zoomlevel);
-        return source;
-    };
+        hideToggle.selectAll('.hide-toggle-text')
+            .text(_title);
 
+        hideToggle.selectAll('.hide-toggle-icon')
+            .attr('xlink:href', _expanded ? '#icon-down'
+                : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
+            );
 
-    source.name = function() {
-        var id_safe = source.id.replace('.', '<TX_DOT>');
-        return t('imagery.' + id_safe + '.name', { default: name });
-    };
 
+        var wrap = selection.selectAll('.disclosure-wrap')
+            .data([0]);
 
-    source.description = function() {
-        var id_safe = source.id.replace('.', '<TX_DOT>');
-        return t('imagery.' + id_safe + '.description', { default: description });
-    };
+        wrap = wrap.enter()
+            .append('div')
+            .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
+            .merge(wrap);
 
+        wrap
+            .classed('hide', !_expanded)
+            .call(_content);
 
-    source.best = function() {
-        return best;
-    };
 
+        function toggle() {
+            event.preventDefault();
 
-    source.area = function() {
-        if (!data.polygon) return Number.MAX_VALUE;  // worldwide
-        var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
-        return isNaN(area) ? 0 : area;
-    };
+            _expanded = !_expanded;
 
+            if (_updatePreference) {
+                context.storage('disclosure.' + key + '.expanded', _expanded);
+            }
 
-    source.imageryUsed = function() {
-        return name || source.id;
-    };
+            hideToggle
+                .classed('expanded', _expanded);
 
+            hideToggle.selectAll('.hide-toggle-icon')
+                .attr('xlink:href', _expanded ? '#icon-down'
+                    : (textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'
+                );
 
-    source.template = function(_) {
-        if (!arguments.length) return template;
-        if (source.id === 'custom') template = _;
-        return source;
+            wrap
+                .call(uiToggle(_expanded));
+
+            dispatch$$1.call('toggled', this, _expanded);
+        }
     };
 
 
-    source.url = function(coord) {
-        return template
-            .replace('{x}', coord[0])
-            .replace('{y}', coord[1])
-            // TMS-flipped y coordinate
-            .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
-            .replace(/\{z(oom)?\}/, coord[2])
-            .replace(/\{switch:([^}]+)\}/, function(s, r) {
-                var subdomains = r.split(',');
-                return subdomains[(coord[0] + coord[1]) % subdomains.length];
-            })
-            .replace('{u}', function() {
-                var u = '';
-                for (var zoom = coord[2]; zoom > 0; zoom--) {
-                    var b = 0;
-                    var mask = 1 << (zoom - 1);
-                    if ((coord[0] & mask) !== 0) b++;
-                    if ((coord[1] & mask) !== 0) b += 2;
-                    u += b.toString();
-                }
-                return u;
-            });
+    disclosure.title = function(_) {
+        if (!arguments.length) return _title;
+        _title = _;
+        return disclosure;
     };
 
 
-    source.intersects = function(extent) {
-        extent = extent.polygon();
-        return !data.polygon || data.polygon.some(function(polygon) {
-            return geoPolygonIntersectsPolygon(polygon, extent, true);
-        });
+    disclosure.expanded = function(_) {
+        if (!arguments.length) return _expanded;
+        _expanded = _;
+        return disclosure;
     };
 
 
-    source.validZoom = function(z) {
-        return source.scaleExtent[0] <= z &&
-            (source.overzoom || source.scaleExtent[1] > z);
+    disclosure.updatePreference = function(_) {
+        if (!arguments.length) return _updatePreference;
+        _updatePreference = _;
+        return disclosure;
     };
 
 
-    source.isLocatorOverlay = function() {
-        return source.id === 'mapbox_locator_overlay';
+    disclosure.content = function(_) {
+        if (!arguments.length) return _content;
+        _content = _;
+        return disclosure;
     };
 
 
-    /* hides a source from the list, but leaves it available for use */
-    source.isHidden = function() {
-        return source.id === 'DigitalGlobe-Premium-vintage' ||
-            source.id === 'DigitalGlobe-Standard-vintage';
+    return utilRebind(disclosure, dispatch$$1, 'on');
+}
+
+function uiBackgroundDisplayOptions(context) {
+    var detected = utilDetect();
+    var storedOpacity = context.storage('background-opacity');
+    var minVal = 0.25;
+    var maxVal = detected.cssfilters ? 2 : 1;
+
+    var sliders = detected.cssfilters
+        ? ['brightness', 'contrast', 'saturation', 'sharpness']
+        : ['brightness'];
+
+    var _options = {
+        brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
+        contrast: 1,
+        saturation: 1,
+        sharpness: 1
     };
 
+    var _selection = d3_select(null);
 
-    source.copyrightNotices = function() {};
 
+    function clamp(x, min, max) {
+        return Math.max(min, Math.min(x, max));
+    }
 
-    source.getMetadata = function(center, tileCoord, callback) {
-        var vintage = {
-            start: localeDateString(source.startDate),
-            end: localeDateString(source.endDate)
-        };
-        vintage.range = vintageRange(vintage);
 
-        var metadata = { vintage: vintage };
-        callback(null, metadata);
-    };
+    function updateValue(d, val) {
+        if (!val && event && event.target) {
+            val = event.target.value;
+        }
 
+        val = clamp(val, minVal, maxVal);
 
-    return source;
-}
+        _options[d] = val;
+        context.background()[d](val);
 
+        if (d === 'brightness') {
+            context.storage('background-opacity', val);
+        }
 
-rendererBackgroundSource.Bing = function(data, dispatch) {
-    // http://msdn.microsoft.com/en-us/library/ff701716.aspx
-    // http://msdn.microsoft.com/en-us/library/ff701701.aspx
+        _selection
+            .call(render);
+    }
 
-    data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
 
-    var bing = rendererBackgroundSource(data),
-        key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
-        url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
-            key + '&jsonp={callback}',
-        cache = {},
-        inflight = {},
-        providers = [];
+    function render(selection) {
+        var container = selection.selectAll('.display-options-container')
+            .data([0]);
 
-    jsonpRequest(url, function(json) {
-        providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
-            return {
-                attribution: provider.attribution,
-                areas: provider.coverageAreas.map(function(area) {
-                    return {
-                        zoom: [area.zoomMin, area.zoomMax],
-                        extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
-                    };
-                })
-            };
-        });
-        dispatch.call('change');
-    });
+        var containerEnter = container.enter()
+            .append('div')
+            .attr('class', 'display-options-container controls-list');
 
+        // add slider controls
+        var slidersEnter = containerEnter.selectAll('.display-control')
+            .data(sliders)
+            .enter()
+            .append('div')
+            .attr('class', function(d) { return 'display-control display-control-' + d; });
 
-    bing.copyrightNotices = function(zoom, extent) {
-        zoom = Math.min(zoom, 21);
-        return providers.filter(function(provider) {
-            return some(provider.areas, function(area) {
-                return extent.intersects(area.extent) &&
-                    area.zoom[0] <= zoom &&
-                    area.zoom[1] >= zoom;
+        slidersEnter
+            .append('h5')
+            .text(function(d) { return t('background.' + d); })
+            .append('span')
+            .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
+
+        slidersEnter
+            .append('input')
+            .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
+            .attr('type', 'range')
+            .attr('min', minVal)
+            .attr('max', maxVal)
+            .attr('step', '0.05')
+            .on('input', function(d) {
+                var val = d3_select(this).property('value');
+                updateValue(d, val);
             });
-        }).map(function(provider) {
-            return provider.attribution;
-        }).join(', ');
-    };
 
+        slidersEnter
+            .append('button')
+            .attr('title', t('background.reset'))
+            .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
+            .on('click', function(d) {
+                if (event.button !== 0) return;
+                updateValue(d, 1);
+            })
+            .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
 
-    bing.getMetadata = function(center, tileCoord, callback) {
-        var tileId = tileCoord.slice(0, 3).join('/'),
-            zoom = Math.min(tileCoord[2], 21),
-            centerPoint = center[1] + ',' + center[0],  // lat,lng
-            url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
-                '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
 
-        if (inflight[tileId]) return;
+        // update
+        container = containerEnter
+            .merge(container);
 
-        if (!cache[tileId]) {
-            cache[tileId] = {};
-        }
-        if (cache[tileId] && cache[tileId].metadata) {
-            return callback(null, cache[tileId].metadata);
+        container.selectAll('.display-option-input')
+            .property('value', function(d) { return _options[d]; });
+
+        container.selectAll('.display-option-value')
+            .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
+
+        container.selectAll('.display-option-reset')
+            .classed('disabled', function(d) { return _options[d] === 1; });
+
+        // first time only, set brightness if needed
+        if (containerEnter.size() && _options.brightness !== 1) {
+            context.background().brightness(_options.brightness);
         }
+    }
 
-        inflight[tileId] = true;
-        jsonpRequest(url, function(result) {
-            delete inflight[tileId];
 
-            var err = (!result && 'Unknown Error') || result.errorDetails;
-            if (err) {
-                return callback(err);
-            } else {
-                var vintage = {
-                    start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
-                    end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
-                };
-                vintage.range = vintageRange(vintage);
+    function backgroundDisplayOptions(selection) {
+        _selection = selection;
 
-                var metadata = { vintage: vintage };
-                cache[tileId].metadata = metadata;
-                return callback(null, metadata);
-            }
-        });
-    };
+        selection
+            .call(uiDisclosure(context, 'background_display_options', true)
+                .title(t('background.display_options'))
+                .content(render)
+            );
+    }
 
 
-    bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
+    return backgroundDisplayOptions;
+}
 
+function uiBackgroundOffset(context) {
+    var directions = [
+        ['right', [0.5, 0]],
+        ['top', [0, -0.5]],
+        ['left', [-0.5, 0]],
+        ['bottom', [0, 0.5]]
+    ];
 
-    return bing;
-};
 
+    function d3_eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
+    }
 
 
-rendererBackgroundSource.Esri = function(data) {
+    function updateValue() {
+        var meters = geoOffsetToMeters(context.background().offset());
+        var x = +meters[0].toFixed(2);
+        var y = +meters[1].toFixed(2);
 
-    // don't request blank tiles, instead overzoom real tiles - #4327
-    // deprecated technique, but it works (for now)
-    if (data.template.match(/blankTile/) === null) {
-        data.template = data.template + '?blankTile=false';
+        d3_selectAll('.nudge-inner-rect')
+            .select('input')
+            .classed('error', false)
+            .property('value', x + ', ' + y);
+
+        d3_selectAll('.nudge-reset')
+            .classed('disabled', function() {
+                return (x === 0 && y === 0);
+            });
     }
 
-    var esri = rendererBackgroundSource(data),
-        cache = {},
-        inflight = {};
 
-    esri.getMetadata = function(center, tileCoord, callback) {
-        var tileId = tileCoord.slice(0, 3).join('/'),
-            zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
-            centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
-            unknown = t('info_panels.background.unknown'),
-            metadataLayer,
-            vintage = {},
-            metadata = {};
+    function resetOffset() {
+        context.background().offset([0, 0]);
+        updateValue();
+    }
 
-        if (inflight[tileId]) return;
 
-        switch (true) {
-            case zoom >= 19:
-                metadataLayer = 3;
-                break;
-            case zoom >= 17:
-                metadataLayer = 2;
-                break;
-            case zoom >= 13:
-                metadataLayer = 0;
-                break;
-            default:
-                metadataLayer = 99;
-        }
+    function nudge(d) {
+        context.background().nudge(d, context.map().zoom());
+        updateValue();
+    }
 
-        // build up query using the layer appropriate to the current zoom
-        var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
 
-        if (!cache[tileId]) {
-            cache[tileId] = {};
-        }
-        if (cache[tileId] && cache[tileId].metadata) {
-            return callback(null, cache[tileId].metadata);
+    function clickNudgeButton(d) {
+        var interval;
+        var timeout = window.setTimeout(function() {
+                interval = window.setInterval(nudge.bind(null, d), 100);
+            }, 500);
+
+        function doneNudge() {
+            window.clearTimeout(timeout);
+            window.clearInterval(interval);
+            d3_select(window)
+                .on('mouseup.buttonoffset', null, true)
+                .on('mousedown.buttonoffset', null, true);
         }
 
-        // accurate metadata is only available >= 13
-        if (metadataLayer === 99) {
-            vintage = {
-                start: null,
-                end: null,
-                range: null
-            };
-            metadata = {
-                vintage: null,
-                source: unknown,
-                description: unknown,
-                resolution: unknown,
-                accuracy: unknown
-            };
+        d3_select(window)
+            .on('mouseup.buttonoffset', doneNudge, true)
+            .on('mousedown.buttonoffset', doneNudge, true);
 
-            callback(null, metadata);
+        nudge(d);
+    }
 
-        } else {
-            inflight[tileId] = true;
-            jsonpRequest(url, function(result) {
-                delete inflight[tileId];
 
-                var err;
-                if (!result) {
-                    err = 'Unknown Error';
-                } else if (result.features && result.features.length < 1) {
-                    err = 'No Results';
-                } else if (result.error && result.error.message) {
-                    err = result.error.message;
-                }
+    function inputOffset() {
+        var input = d3_select(this);
+        var d = input.node().value;
 
-                if (err) {
-                    return callback(err);
-                } else {
-                    // pass through the discrete capture date from metadata
-                    var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
-                    vintage = {
-                        start: captureDate,
-                        end: captureDate,
-                        range: captureDate
-                    };
-                    metadata = {
-                        vintage: vintage,
-                        source: clean(result.features[0].attributes.NICE_NAME),
-                        description: clean(result.features[0].attributes.NICE_DESC),
-                        resolution: clean(result.features[0].attributes.SRC_RES),
-                        accuracy: clean(result.features[0].attributes.SRC_ACC)
-                    };
+        if (d === '') return resetOffset();
 
-                    // append units - meters
-                    if (isFinite(metadata.resolution)) {
-                        metadata.resolution += ' m';
-                    }
-                    if (isFinite(metadata.accuracy)) {
-                        metadata.accuracy += ' m';
-                    }
+        d = d.replace(/;/g, ',').split(',').map(function(n) {
+            // if n is NaN, it will always get mapped to false.
+            return !isNaN(n) && n;
+        });
 
-                    cache[tileId].metadata = metadata;
-                    return callback(null, metadata);
-                }
-            });
+        if (d.length !== 2 || !d[0] || !d[1]) {
+            input.classed('error', true);
+            return;
         }
 
+        context.background().offset(geoMetersToOffset(d));
+        updateValue();
+    }
 
-        function clean(val) {
-            return String(val).trim() || unknown;
-        }
-    };
 
-    return esri;
-};
+    function dragOffset() {
+        event.preventDefault();
+        if (event.button !== 0) return;
 
+        var origin = [event.clientX, event.clientY];
 
-rendererBackgroundSource.None = function() {
-    var source = rendererBackgroundSource({ id: 'none', template: '' });
+        context.container()
+            .append('div')
+            .attr('class', 'nudge-surface');
 
+        d3_select(window)
+            .on('mousemove.offset', function() {
+                var latest = [event.clientX, event.clientY];
+                var d = [
+                    -(origin[0] - latest[0]) / 4,
+                    -(origin[1] - latest[1]) / 4
+                ];
 
-    source.name = function() {
-        return t('background.none');
-    };
+                origin = latest;
+                nudge(d);
+            })
+            .on('mouseup.offset', function() {
+                if (event.button !== 0) return;
+                d3_selectAll('.nudge-surface')
+                    .remove();
+
+                d3_select(window)
+                    .on('mousemove.offset', null)
+                    .on('mouseup.offset', null);
+            });
+    }
 
 
-    source.imageryUsed = function() {
-        return 'None';
-    };
+    function render(selection) {
+        var container = selection.selectAll('.nudge-container')
+            .data([0]);
 
+        var containerEnter = container.enter()
+            .append('div')
+            .attr('class', 'nudge-container cf');
 
-    source.area = function() {
-        return -1;  // sources in background pane are sorted by area
-    };
+        containerEnter
+            .append('div')
+            .attr('class', 'nudge-instructions')
+            .text(t('background.offset'));
 
+        var nudgeEnter = containerEnter
+            .append('div')
+            .attr('class', 'nudge-outer-rect')
+            .on('mousedown', dragOffset);
 
-    return source;
-};
+        nudgeEnter
+            .append('div')
+            .attr('class', 'nudge-inner-rect')
+            .append('input')
+            .on('change', inputOffset);
 
+        containerEnter
+            .append('div')
+            .selectAll('button')
+            .data(directions).enter()
+            .append('button')
+            .attr('class', function(d) { return d[0] + ' nudge'; })
+            .on('contextmenu', d3_eventCancel)
+            .on('mousedown', function(d) {
+                if (event.button !== 0) return;
+                clickNudgeButton(d[1]);
+            });
 
-rendererBackgroundSource.Custom = function(template) {
-    var source = rendererBackgroundSource({ id: 'custom', template: template });
+        containerEnter
+            .append('button')
+            .attr('title', t('background.reset'))
+            .attr('class', 'nudge-reset disabled')
+            .on('contextmenu', d3_eventCancel)
+            .on('click', function() {
+                if (event.button !== 0) return;
+                resetOffset();
+            })
+            .call(svgIcon('#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
 
+        updateValue();
+    }
 
-    source.name = function() {
-        return t('background.custom');
-    };
 
+    function backgroundOffset(selection) {
+        selection
+            .call(uiDisclosure(context, 'background_offset', false)
+                .title(t('background.fix_misalignment'))
+                .content(render)
+            );
+    }
 
-    source.imageryUsed = function() {
-        return 'Custom (' + source.template() + ')';
-    };
 
+    context.background()
+        .on('change.backgroundOffset-update', updateValue);
 
-    source.area = function() {
-        return -2;  // sources in background pane are sorted by area
-    };
+    return backgroundOffset;
+}
 
+var marked = createCommonjsModule(function (module, exports) {
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
 
-    return source;
+(function() {
+var block = {
+  newline: /^\n+/,
+  code: /^( {4}[^\n]+\n*)+/,
+  fences: noop,
+  hr: /^( *[-*_]){3,} *(?:\n+|$)/,
+  heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
+  nptable: noop,
+  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+  blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
+  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+  html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
+  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
+  table: noop,
+  paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
+  text: /^[^\n]+/
 };
 
-function rendererTileLayer(context) {
-    var tileSize = 256,
-        geotile = d3geoTile(),
-        projection,
-        cache = {},
-        tileOrigin,
-        z,
-        transformProp = utilPrefixCSSProperty('Transform'),
-        source;
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = replace(block.item, 'gm')
+  (/bull/g, block.bullet)
+  ();
 
+block.list = replace(block.list)
+  (/bull/g, block.bullet)
+  ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
+  ('def', '\\n+(?=' + block.def.source + ')')
+  ();
 
-    // blacklist overlay tiles around Null Island..
-    function nearNullIsland(x, y, z) {
-        if (z >= 7) {
-            var center = Math.pow(2, z - 1),
-                width = Math.pow(2, z - 6),
-                min = center - (width / 2),
-                max = center + (width / 2) - 1;
-            return x >= min && x <= max && y >= min && y <= max;
-        }
-        return false;
-    }
+block.blockquote = replace(block.blockquote)
+  ('def', block.def)
+  ();
 
+block._tag = '(?!(?:'
+  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
+  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
+  + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
 
-    function tileSizeAtZoom(d, z) {
-        var epsilon = 0.002;
-        return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + epsilon;
-    }
+block.html = replace(block.html)
+  ('comment', /<!--[\s\S]*?-->/)
+  ('closed', /<(tag)[\s\S]+?<\/\1>/)
+  ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
+  (/tag/g, block._tag)
+  ();
 
+block.paragraph = replace(block.paragraph)
+  ('hr', block.hr)
+  ('heading', block.heading)
+  ('lheading', block.lheading)
+  ('blockquote', block.blockquote)
+  ('tag', '<' + block._tag)
+  ('def', block.def)
+  ();
 
-    function atZoom(t$$1, distance) {
-        var power = Math.pow(2, distance);
-        return [
-            Math.floor(t$$1[0] * power),
-            Math.floor(t$$1[1] * power),
-            t$$1[2] + distance
-        ];
-    }
+/**
+ * Normal Block Grammar
+ */
 
+block.normal = merge({}, block);
 
-    function lookUp(d) {
-        for (var up = -1; up > -d[2]; up--) {
-            var tile = atZoom(d, up);
-            if (cache[source.url(tile)] !== false) {
-                return tile;
-            }
-        }
-    }
+/**
+ * GFM Block Grammar
+ */
 
+block.gfm = merge({}, block.normal, {
+  fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
+  paragraph: /^/,
+  heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
 
-    function uniqueBy(a, n) {
-        var o = [], seen = {};
-        for (var i = 0; i < a.length; i++) {
-            if (seen[a[i][n]] === undefined) {
-                o.push(a[i]);
-                seen[a[i][n]] = true;
-            }
-        }
-        return o;
-    }
+block.gfm.paragraph = replace(block.paragraph)
+  ('(?!', '(?!'
+    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+    + block.list.source.replace('\\1', '\\3') + '|')
+  ();
 
+/**
+ * GFM + Tables Block Grammar
+ */
 
-    function addSource(d) {
-        d.push(source.url(d));
-        return d;
-    }
+block.tables = merge({}, block.gfm, {
+  nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
+  table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
+});
 
+/**
+ * Block Lexer
+ */
 
-    // Update tiles based on current state of `projection`.
-    function background(selection) {
-        z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
+function Lexer(options) {
+  this.tokens = [];
+  this.tokens.links = {};
+  this.options = options || marked.defaults;
+  this.rules = block.normal;
 
-        var pixelOffset;
-        if (source) {
-            pixelOffset = [
-                source.offset()[0] * Math.pow(2, z),
-                source.offset()[1] * Math.pow(2, z)
-            ];
-        } else {
-            pixelOffset = [0, 0];
-        }
+  if (this.options.gfm) {
+    if (this.options.tables) {
+      this.rules = block.tables;
+    } else {
+      this.rules = block.gfm;
+    }
+  }
+}
 
-        var translate = [
-            projection.translate()[0] + pixelOffset[0],
-            projection.translate()[1] + pixelOffset[1]
-        ];
+/**
+ * Expose Block Rules
+ */
 
-        geotile
-            .scale(projection.scale() * 2 * Math.PI)
-            .translate(translate);
+Lexer.rules = block;
 
-        tileOrigin = [
-            projection.scale() * Math.PI - translate[0],
-            projection.scale() * Math.PI - translate[1]
-        ];
+/**
+ * Static Lex Method
+ */
 
-        render(selection);
-    }
+Lexer.lex = function(src, options) {
+  var lexer = new Lexer(options);
+  return lexer.lex(src);
+};
 
+/**
+ * Preprocessing
+ */
 
-    // Derive the tiles onscreen, remove those offscreen and position them.
-    // Important that this part not depend on `projection` because it's
-    // rentered when tiles load/error (see #644).
-    function render(selection) {
-        if (!source) return;
-        var requests = [];
-        var showDebug = context.getDebug('tile') && !source.overlay;
+Lexer.prototype.lex = function(src) {
+  src = src
+    .replace(/\r\n|\r/g, '\n')
+    .replace(/\t/g, '    ')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\u2424/g, '\n');
 
-        if (source.validZoom(z)) {
-            geotile().forEach(function(d) {
-                addSource(d);
-                if (d[3] === '') return;
-                if (typeof d[3] !== 'string') return; // Workaround for #2295
-                requests.push(d);
-                if (cache[d[3]] === false && lookUp(d)) {
-                    requests.push(addSource(lookUp(d)));
-                }
-            });
+  return this.token(src, true);
+};
 
-            requests = uniqueBy(requests, 3).filter(function(r) {
-                if (!!source.overlay && nearNullIsland(r[0], r[1], r[2])) {
-                    return false;
-                }
-                // don't re-request tiles which have failed in the past
-                return cache[r[3]] !== false;
-            });
-        }
+/**
+ * Lexing
+ */
 
+Lexer.prototype.token = function(src, top, bq) {
+  var src = src.replace(/^ +$/gm, '')
+    , next
+    , loose
+    , cap
+    , bull
+    , b
+    , item
+    , space
+    , i
+    , l;
 
-        function load(d) {
-            cache[d[3]] = true;
-            d3_select(this)
-                .on('error', null)
-                .on('load', null)
-                .classed('tile-loaded', true);
-            render(selection);
-        }
+  while (src) {
+    // newline
+    if (cap = this.rules.newline.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[0].length > 1) {
+        this.tokens.push({
+          type: 'space'
+        });
+      }
+    }
 
-        function error(d) {
-            cache[d[3]] = false;
-            d3_select(this)
-                .on('error', null)
-                .on('load', null)
-                .remove();
-            render(selection);
-        }
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      cap = cap[0].replace(/^ {4}/gm, '');
+      this.tokens.push({
+        type: 'code',
+        text: !this.options.pedantic
+          ? cap.replace(/\n+$/, '')
+          : cap
+      });
+      continue;
+    }
 
-        function imageTransform(d) {
-            var _ts = tileSize * Math.pow(2, z - d[2]);
-            var scale = tileSizeAtZoom(d, z);
-            return 'translate(' +
-                ((d[0] * _ts) - tileOrigin[0]) + 'px,' +
-                ((d[1] * _ts) - tileOrigin[1]) + 'px) ' +
-                'scale(' + scale + ',' + scale + ')';
-        }
+    // fences (gfm)
+    if (cap = this.rules.fences.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'code',
+        lang: cap[2],
+        text: cap[3] || ''
+      });
+      continue;
+    }
 
-        function tileCenter(d) {
-            var _ts = tileSize * Math.pow(2, z - d[2]);
-            return [
-                ((d[0] * _ts) - tileOrigin[0] + (_ts / 2)),
-                ((d[1] * _ts) - tileOrigin[1] + (_ts / 2))
-            ];
-        }
+    // heading
+    if (cap = this.rules.heading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[1].length,
+        text: cap[2]
+      });
+      continue;
+    }
 
-        function debugTransform(d) {
-            var coord = tileCenter(d);
-            return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
-        }
+    // table no leading pipe (gfm)
+    if (top && (cap = this.rules.nptable.exec(src))) {
+      src = src.substring(cap[0].length);
 
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/\n$/, '').split('\n')
+      };
 
-        // Pick a representative tile near the center of the viewport
-        // (This is useful for sampling the imagery vintage)
-        var dims = geotile.size(),
-            mapCenter = [dims[0] / 2, dims[1] / 2],
-            minDist = Math.max(dims[0], dims[1]),
-            nearCenter;
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
 
-        requests.forEach(function(d) {
-            var c = tileCenter(d);
-            var dist = geoEuclideanDistance(c, mapCenter);
-            if (dist < minDist) {
-                minDist = dist;
-                nearCenter = d;
-            }
-        });
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i].split(/ *\| */);
+      }
 
+      this.tokens.push(item);
 
-        var image = selection.selectAll('img')
-            .data(requests, function(d) { return d[3]; });
+      continue;
+    }
 
-        image.exit()
-            .style(transformProp, imageTransform)
-            .classed('tile-removing', true)
-            .classed('tile-center', false)
-            .each(function() {
-                var tile = d3_select(this);
-                window.setTimeout(function() {
-                    if (tile.classed('tile-removing')) {
-                        tile.remove();
-                    }
-                }, 300);
-            });
+    // lheading
+    if (cap = this.rules.lheading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[2] === '=' ? 1 : 2,
+        text: cap[1]
+      });
+      continue;
+    }
 
-        image.enter()
-          .append('img')
-            .attr('class', 'tile')
-            .attr('src', function(d) { return d[3]; })
-            .on('error', error)
-            .on('load', load)
-          .merge(image)
-            .style(transformProp, imageTransform)
-            .classed('tile-debug', showDebug)
-            .classed('tile-removing', false)
-            .classed('tile-center', function(d) { return d === nearCenter; });
+    // hr
+    if (cap = this.rules.hr.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'hr'
+      });
+      continue;
+    }
 
+    // blockquote
+    if (cap = this.rules.blockquote.exec(src)) {
+      src = src.substring(cap[0].length);
 
+      this.tokens.push({
+        type: 'blockquote_start'
+      });
 
-        var debug = selection.selectAll('.tile-label-debug')
-            .data(showDebug ? requests : [], function(d) { return d[3]; });
+      cap = cap[0].replace(/^ *> ?/gm, '');
 
-        debug.exit()
-            .remove();
+      // Pass `top` to keep the current
+      // "toplevel" state. This is exactly
+      // how markdown.pl works.
+      this.token(cap, top, true);
 
-        if (showDebug) {
-            var debugEnter = debug.enter()
-                .append('div')
-                .attr('class', 'tile-label-debug');
+      this.tokens.push({
+        type: 'blockquote_end'
+      });
 
-            debugEnter
-                .append('div')
-                .attr('class', 'tile-label-debug-coord');
+      continue;
+    }
 
-            debugEnter
-                .append('div')
-                .attr('class', 'tile-label-debug-vintage');
+    // list
+    if (cap = this.rules.list.exec(src)) {
+      src = src.substring(cap[0].length);
+      bull = cap[2];
 
-            debug = debug.merge(debugEnter);
+      this.tokens.push({
+        type: 'list_start',
+        ordered: bull.length > 1
+      });
 
-            debug
-                .style(transformProp, debugTransform);
+      // Get each top-level item.
+      cap = cap[0].match(this.rules.item);
 
-            debug
-                .selectAll('.tile-label-debug-coord')
-                .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
+      next = false;
+      l = cap.length;
+      i = 0;
 
-            debug
-                .selectAll('.tile-label-debug-vintage')
-                .each(function(d) {
-                    var span = d3_select(this);
-                    var center = context.projection.invert(tileCenter(d));
-                    source.getMetadata(center, d, function(err, result) {
-                        span.text((result && result.vintage && result.vintage.range) ||
-                            t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
-                        );
-                    });
-                });
+      for (; i < l; i++) {
+        item = cap[i];
+
+        // Remove the list item's bullet
+        // so it is seen as the next token.
+        space = item.length;
+        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+        // Outdent whatever the
+        // list item contains. Hacky.
+        if (~item.indexOf('\n ')) {
+          space -= item.length;
+          item = !this.options.pedantic
+            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+            : item.replace(/^ {1,4}/gm, '');
         }
 
-    }
+        // Determine whether the next list item belongs here.
+        // Backpedal if it does not belong in this list.
+        if (this.options.smartLists && i !== l - 1) {
+          b = block.bullet.exec(cap[i + 1])[0];
+          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+            src = cap.slice(i + 1).join('\n') + src;
+            i = l - 1;
+          }
+        }
 
+        // Determine whether item is loose or not.
+        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+        // for discount behavior.
+        loose = next || /\n\n(?!\s*$)/.test(item);
+        if (i !== l - 1) {
+          next = item.charAt(item.length - 1) === '\n';
+          if (!loose) loose = next;
+        }
 
-    background.projection = function(_) {
-        if (!arguments.length) return projection;
-        projection = _;
-        return background;
-    };
+        this.tokens.push({
+          type: loose
+            ? 'loose_item_start'
+            : 'list_item_start'
+        });
 
+        // Recurse.
+        this.token(item, false, bq);
 
-    background.dimensions = function(_) {
-        if (!arguments.length) return geotile.size();
-        geotile.size(_);
-        return background;
-    };
+        this.tokens.push({
+          type: 'list_item_end'
+        });
+      }
 
+      this.tokens.push({
+        type: 'list_end'
+      });
 
-    background.source = function(_) {
-        if (!arguments.length) return source;
-        source = _;
-        cache = {};
-        geotile.scaleExtent(source.scaleExtent);
-        return background;
-    };
+      continue;
+    }
 
+    // html
+    if (cap = this.rules.html.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: this.options.sanitize
+          ? 'paragraph'
+          : 'html',
+        pre: !this.options.sanitizer
+          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+        text: cap[0]
+      });
+      continue;
+    }
 
-    return background;
-}
+    // def
+    if ((!bq && top) && (cap = this.rules.def.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.links[cap[1].toLowerCase()] = {
+        href: cap[2],
+        title: cap[3]
+      };
+      continue;
+    }
 
-function rendererBackground(context) {
-    var dispatch$$1 = dispatch('change'),
-        baseLayer = rendererTileLayer(context).projection(context.projection),
-        overlayLayers = [],
-        backgroundSources;
+    // table (gfm)
+    if (top && (cap = this.rules.table.exec(src))) {
+      src = src.substring(cap[0].length);
 
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
+      };
 
-    function background(selection) {
-        var base = selection.selectAll('.layer-background')
-            .data([0]);
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
 
-        base.enter()
-            .insert('div', '.layer-data')
-            .attr('class', 'layer layer-background')
-            .merge(base)
-            .call(baseLayer);
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i]
+          .replace(/^ *\| *| *\| *$/g, '')
+          .split(/ *\| */);
+      }
 
-        var overlays = selection.selectAll('.layer-overlay')
-            .data(overlayLayers, function(d) { return d.source().name(); });
+      this.tokens.push(item);
 
-        overlays.exit()
-            .remove();
+      continue;
+    }
 
-        overlays.enter()
-            .insert('div', '.layer-data')
-            .attr('class', 'layer layer-overlay')
-            .merge(overlays)
-            .each(function(layer) { d3_select(this).call(layer); });
+    // top-level paragraph
+    if (top && (cap = this.rules.paragraph.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'paragraph',
+        text: cap[1].charAt(cap[1].length - 1) === '\n'
+          ? cap[1].slice(0, -1)
+          : cap[1]
+      });
+      continue;
     }
 
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      // Top-level should never reach here.
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'text',
+        text: cap[0]
+      });
+      continue;
+    }
 
-    background.updateImagery = function() {
-        if (context.inIntro()) return;
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
 
-        var b = background.baseLayerSource(),
-            o = overlayLayers
-                .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
-                .map(function (d) { return d.source().id; })
-                .join(','),
-            meters = geoOffsetToMeters(b.offset()),
-            epsilon = 0.01,
-            x = +meters[0].toFixed(2),
-            y = +meters[1].toFixed(2),
-            q = utilStringQs(window.location.hash.substring(1));
+  return this.tokens;
+};
 
-        var id = b.id;
-        if (id === 'custom') {
-            id = 'custom:' + b.template();
-        }
+/**
+ * Inline-Level Grammar
+ */
 
-        if (id) {
-            q.background = id;
-        } else {
-            delete q.background;
-        }
+var inline = {
+  escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
+  autolink: /^<([^ <>]+(@|:\/)[^ <>]+)>/,
+  url: noop,
+  tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^<'">])*?>/,
+  link: /^!?\[(inside)\]\(href\)/,
+  reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
+  nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
+  strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
+  em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
+  code: /^(`+)([\s\S]*?[^`])\1(?!`)/,
+  br: /^ {2,}\n(?!\s*$)/,
+  del: noop,
+  text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
+};
 
-        if (o) {
-            q.overlays = o;
-        } else {
-            delete q.overlays;
-        }
+inline._inside = /(?:\[[^\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/;
+inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
 
-        if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
-            q.offset = x + ',' + y;
-        } else {
-            delete q.offset;
-        }
+inline.link = replace(inline.link)
+  ('inside', inline._inside)
+  ('href', inline._href)
+  ();
 
-        if (!window.mocha) {
-            window.location.replace('#' + utilQsString(q, true));
-        }
+inline.reflink = replace(inline.reflink)
+  ('inside', inline._inside)
+  ();
 
-        var imageryUsed = [b.imageryUsed()];
+/**
+ * Normal Inline Grammar
+ */
 
-        overlayLayers
-            .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
-            .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
+inline.normal = merge({}, inline);
 
-        var gpx = context.layers().layer('gpx');
-        if (gpx && gpx.enabled() && gpx.hasGpx()) {
-            // Include a string like '.gpx data file' or '.geojson data file'
-            var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
-            var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
-            imageryUsed.push(extension + 'data file');
-        }
+/**
+ * Pedantic Inline Grammar
+ */
 
-        var mapillary_images = context.layers().layer('mapillary-images');
-        if (mapillary_images && mapillary_images.enabled()) {
-            imageryUsed.push('Mapillary Images');
-        }
+inline.pedantic = merge({}, inline.normal, {
+  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
+});
 
-        var mapillary_signs = context.layers().layer('mapillary-signs');
-        if (mapillary_signs && mapillary_signs.enabled()) {
-            imageryUsed.push('Mapillary Signs');
-        }
+/**
+ * GFM Inline Grammar
+ */
 
-        var openstreetcam_images = context.layers().layer('openstreetcam-images');
-        if (openstreetcam_images && openstreetcam_images.enabled()) {
-            imageryUsed.push('OpenStreetCam Images');
-        }
+inline.gfm = merge({}, inline.normal, {
+  escape: replace(inline.escape)('])', '~|])')(),
+  url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
+  del: /^~~(?=\S)([\s\S]*?\S)~~/,
+  text: replace(inline.text)
+    (']|', '~]|')
+    ('|', '|https?://|')
+    ()
+});
 
-        context.history().imageryUsed(imageryUsed);
-    };
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
 
+inline.breaks = merge({}, inline.gfm, {
+  br: replace(inline.br)('{2,}', '*')(),
+  text: replace(inline.gfm.text)('{2,}', '*')()
+});
 
-    background.sources = function(extent) {
-        return backgroundSources.filter(function(source) {
-            return source.intersects(extent);
-        });
-    };
+/**
+ * Inline Lexer & Compiler
+ */
 
+function InlineLexer(links, options) {
+  this.options = options || marked.defaults;
+  this.links = links;
+  this.rules = inline.normal;
+  this.renderer = this.options.renderer || new Renderer;
+  this.renderer.options = this.options;
 
-    background.dimensions = function(_) {
-        if (!_) return;
-        baseLayer.dimensions(_);
+  if (!this.links) {
+    throw new
+      Error('Tokens array requires a `links` property.');
+  }
 
-        overlayLayers.forEach(function(layer) {
-            layer.dimensions(_);
-        });
-    };
+  if (this.options.gfm) {
+    if (this.options.breaks) {
+      this.rules = inline.breaks;
+    } else {
+      this.rules = inline.gfm;
+    }
+  } else if (this.options.pedantic) {
+    this.rules = inline.pedantic;
+  }
+}
 
+/**
+ * Expose Inline Rules
+ */
 
-    background.baseLayerSource = function(d) {
-        if (!arguments.length) return baseLayer.source();
+InlineLexer.rules = inline;
 
-        // test source against OSM imagery blacklists..
-        var osm = context.connection();
-        if (!osm) return background;
+/**
+ * Static Lexing/Compiling Method
+ */
 
-        var blacklists = context.connection().imageryBlacklists();
+InlineLexer.output = function(src, links, options) {
+  var inline = new InlineLexer(links, options);
+  return inline.output(src);
+};
 
-        var template = d.template(),
-            fail = false,
-            tested = 0,
-            regex, i;
+/**
+ * Lexing/Compiling
+ */
 
-        for (i = 0; i < blacklists.length; i++) {
-            try {
-                regex = new RegExp(blacklists[i]);
-                fail = regex.test(template);
-                tested++;
-                if (fail) break;
-            } catch (e) {
-                /* noop */
-            }
-        }
+InlineLexer.prototype.output = function(src) {
+  var out = ''
+    , link
+    , text
+    , href
+    , cap;
 
-        // ensure at least one test was run.
-        if (!tested) {
-            regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
-            fail = regex.test(template);
-        }
+  while (src) {
+    // escape
+    if (cap = this.rules.escape.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += cap[1];
+      continue;
+    }
 
-        baseLayer.source(!fail ? d : background.findSource('none'));
-        dispatch$$1.call('change');
-        background.updateImagery();
-        return background;
-    };
+    // autolink
+    if (cap = this.rules.autolink.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(
+          cap[1].charAt(6) === ':'
+          ? this.mangle(cap[1].substring(7))
+          : this.mangle(cap[1])
+        );
+        href = this.mangle('mailto:') + text;
+      } else {
+        text = escape(cap[1]);
+        href = text;
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
 
+    // url (gfm)
+    if (!this.inLink && (cap = this.rules.url.exec(src))) {
+      src = src.substring(cap[0].length);
+      text = escape(cap[1]);
+      href = text;
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
 
-    background.findSource = function(id) {
-        return find$1(backgroundSources, function(d) {
-            return d.id && d.id === id;
-        });
-    };
+    // tag
+    if (cap = this.rules.tag.exec(src)) {
+      if (!this.inLink && /^<a /i.test(cap[0])) {
+        this.inLink = true;
+      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+        this.inLink = false;
+      }
+      src = src.substring(cap[0].length);
+      out += this.options.sanitize
+        ? this.options.sanitizer
+          ? this.options.sanitizer(cap[0])
+          : escape(cap[0])
+        : cap[0];
+      continue;
+    }
 
+    // link
+    if (cap = this.rules.link.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.inLink = true;
+      out += this.outputLink(cap, {
+        href: cap[2],
+        title: cap[3]
+      });
+      this.inLink = false;
+      continue;
+    }
 
-    background.bing = function() {
-        background.baseLayerSource(background.findSource('Bing'));
-    };
+    // reflink, nolink
+    if ((cap = this.rules.reflink.exec(src))
+        || (cap = this.rules.nolink.exec(src))) {
+      src = src.substring(cap[0].length);
+      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+      link = this.links[link.toLowerCase()];
+      if (!link || !link.href) {
+        out += cap[0].charAt(0);
+        src = cap[0].substring(1) + src;
+        continue;
+      }
+      this.inLink = true;
+      out += this.outputLink(cap, link);
+      this.inLink = false;
+      continue;
+    }
 
+    // strong
+    if (cap = this.rules.strong.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.strong(this.output(cap[2] || cap[1]));
+      continue;
+    }
 
-    background.showsLayer = function(d) {
-        return d.id === baseLayer.source().id ||
-            overlayLayers.some(function(layer) { return d.id === layer.source().id; });
-    };
+    // em
+    if (cap = this.rules.em.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.em(this.output(cap[2] || cap[1]));
+      continue;
+    }
 
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.codespan(escape(cap[2].trim(), true));
+      continue;
+    }
 
-    background.overlayLayerSources = function() {
-        return overlayLayers.map(function (l) { return l.source(); });
-    };
+    // br
+    if (cap = this.rules.br.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.br();
+      continue;
+    }
 
+    // del (gfm)
+    if (cap = this.rules.del.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.del(this.output(cap[1]));
+      continue;
+    }
 
-    background.toggleOverlayLayer = function(d) {
-        var layer;
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.text(escape(this.smartypants(cap[0])));
+      continue;
+    }
 
-        for (var i = 0; i < overlayLayers.length; i++) {
-            layer = overlayLayers[i];
-            if (layer.source() === d) {
-                overlayLayers.splice(i, 1);
-                dispatch$$1.call('change');
-                background.updateImagery();
-                return;
-            }
-        }
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
 
-        layer = rendererTileLayer(context)
-            .source(d)
-            .projection(context.projection)
-            .dimensions(baseLayer.dimensions());
+  return out;
+};
 
-        overlayLayers.push(layer);
-        dispatch$$1.call('change');
-        background.updateImagery();
-    };
+/**
+ * Compile Link
+ */
 
+InlineLexer.prototype.outputLink = function(cap, link) {
+  var href = escape(link.href)
+    , title = link.title ? escape(link.title) : null;
 
-    background.nudge = function(d, zoom) {
-        baseLayer.source().nudge(d, zoom);
-        dispatch$$1.call('change');
-        background.updateImagery();
-        return background;
-    };
+  return cap[0].charAt(0) !== '!'
+    ? this.renderer.link(href, title, this.output(cap[1]))
+    : this.renderer.image(href, title, escape(cap[1]));
+};
 
+/**
+ * Smartypants Transformations
+ */
 
-    background.offset = function(d) {
-        if (!arguments.length) return baseLayer.source().offset();
-        baseLayer.source().offset(d);
-        dispatch$$1.call('change');
-        background.updateImagery();
-        return background;
-    };
+InlineLexer.prototype.smartypants = function(text) {
+  if (!this.options.smartypants) return text;
+  return text
+    // em-dashes
+    .replace(/---/g, '\u2014')
+    // en-dashes
+    .replace(/--/g, '\u2013')
+    // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+    // closing singles & apostrophes
+    .replace(/'/g, '\u2019')
+    // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+    // closing doubles
+    .replace(/"/g, '\u201d')
+    // ellipses
+    .replace(/\.{3}/g, '\u2026');
+};
 
+/**
+ * Mangle Links
+ */
 
-    background.init = function() {
-        function parseMap(qmap) {
-            if (!qmap) return false;
-            var args = qmap.split('/').map(Number);
-            if (args.length < 3 || args.some(isNaN)) return false;
-            return geoExtent([args[2], args[1]]);
-        }
+InlineLexer.prototype.mangle = function(text) {
+  if (!this.options.mangle) return text;
+  var out = ''
+    , l = text.length
+    , i = 0
+    , ch;
 
-        var dataImagery = data.imagery || [],
-            q = utilStringQs(window.location.hash.substring(1)),
-            requested = q.background || q.layer,
-            extent = parseMap(q.map),
-            first,
-            best;
+  for (; i < l; i++) {
+    ch = text.charCodeAt(i);
+    if (Math.random() > 0.5) {
+      ch = 'x' + ch.toString(16);
+    }
+    out += '&#' + ch + ';';
+  }
 
-        // Add all the available imagery sources
-        backgroundSources = dataImagery.map(function(source) {
-            if (source.type === 'bing') {
-                return rendererBackgroundSource.Bing(source, dispatch$$1);
-            } else if (source.id === 'EsriWorldImagery') {
-                return rendererBackgroundSource.Esri(source);
-            } else {
-                return rendererBackgroundSource(source);
-            }
-        });
+  return out;
+};
 
-        first = backgroundSources.length && backgroundSources[0];
+/**
+ * Renderer
+ */
 
-        // Add 'None'
-        backgroundSources.unshift(rendererBackgroundSource.None());
+function Renderer(options) {
+  this.options = options || {};
+}
 
-        // Add 'Custom'
-        var template = context.storage('background-custom-template') || '';
-        var custom = rendererBackgroundSource.Custom(template);
-        backgroundSources.unshift(custom);
+Renderer.prototype.code = function(code, lang, escaped) {
+  if (this.options.highlight) {
+    var out = this.options.highlight(code, lang);
+    if (out != null && out !== code) {
+      escaped = true;
+      code = out;
+    }
+  }
 
+  if (!lang) {
+    return '<pre><code>'
+      + (escaped ? code : escape(code, true))
+      + '\n</code></pre>';
+  }
 
-        // Decide which background layer to display
-        if (!requested && extent) {
-            best = find$1(this.sources(extent), function(s) { return s.best(); });
-        }
-        if (requested && requested.indexOf('custom:') === 0) {
-            template = requested.replace(/^custom:/, '');
-            background.baseLayerSource(custom.template(template));
-            context.storage('background-custom-template', template);
-        } else {
-            background.baseLayerSource(
-                background.findSource(requested) ||
-                best ||
-                background.findSource('Bing') ||
-                first ||
-                background.findSource('none')
-            );
-        }
+  return '<pre><code class="'
+    + this.options.langPrefix
+    + escape(lang, true)
+    + '">'
+    + (escaped ? code : escape(code, true))
+    + '\n</code></pre>\n';
+};
 
-        var locator = find$1(backgroundSources, function(d) {
-            return d.overlay && d.default;
-        });
+Renderer.prototype.blockquote = function(quote) {
+  return '<blockquote>\n' + quote + '</blockquote>\n';
+};
 
-        if (locator) {
-            background.toggleOverlayLayer(locator);
-        }
+Renderer.prototype.html = function(html) {
+  return html;
+};
 
-        var overlays = (q.overlays || '').split(',');
-        overlays.forEach(function(overlay) {
-            overlay = background.findSource(overlay);
-            if (overlay) {
-                background.toggleOverlayLayer(overlay);
-            }
-        });
+Renderer.prototype.heading = function(text, level, raw) {
+  return '<h'
+    + level
+    + ' id="'
+    + this.options.headerPrefix
+    + raw.toLowerCase().replace(/[^\w]+/g, '-')
+    + '">'
+    + text
+    + '</h'
+    + level
+    + '>\n';
+};
 
-        if (q.gpx) {
-            var gpx = context.layers().layer('gpx');
-            if (gpx) {
-                gpx.url(q.gpx);
-            }
-        }
+Renderer.prototype.hr = function() {
+  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
 
-        if (q.offset) {
-            var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
-                return !isNaN(n) && n;
-            });
+Renderer.prototype.list = function(body, ordered) {
+  var type = ordered ? 'ol' : 'ul';
+  return '<' + type + '>\n' + body + '</' + type + '>\n';
+};
 
-            if (offset.length === 2) {
-                background.offset(geoMetersToOffset(offset));
-            }
-        }
-    };
+Renderer.prototype.listitem = function(text) {
+  return '<li>' + text + '</li>\n';
+};
 
+Renderer.prototype.paragraph = function(text) {
+  return '<p>' + text + '</p>\n';
+};
 
-    return utilRebind(background, dispatch$$1, 'on');
-}
+Renderer.prototype.table = function(header, body) {
+  return '<table>\n'
+    + '<thead>\n'
+    + header
+    + '</thead>\n'
+    + '<tbody>\n'
+    + body
+    + '</tbody>\n'
+    + '</table>\n';
+};
 
-function rendererFeatures(context) {
-    var traffic_roads = {
-        'motorway': true,
-        'motorway_link': true,
-        'trunk': true,
-        'trunk_link': true,
-        'primary': true,
-        'primary_link': true,
-        'secondary': true,
-        'secondary_link': true,
-        'tertiary': true,
-        'tertiary_link': true,
-        'residential': true,
-        'unclassified': true,
-        'living_street': true
-    };
+Renderer.prototype.tablerow = function(content) {
+  return '<tr>\n' + content + '</tr>\n';
+};
 
-    var service_roads = {
-        'service': true,
-        'road': true,
-        'track': true
-    };
+Renderer.prototype.tablecell = function(content, flags) {
+  var type = flags.header ? 'th' : 'td';
+  var tag = flags.align
+    ? '<' + type + ' style="text-align:' + flags.align + '">'
+    : '<' + type + '>';
+  return tag + content + '</' + type + '>\n';
+};
 
-    var paths = {
-        'path': true,
-        'footway': true,
-        'cycleway': true,
-        'bridleway': true,
-        'steps': true,
-        'pedestrian': true,
-        'corridor': true
-    };
+// span level renderer
+Renderer.prototype.strong = function(text) {
+  return '<strong>' + text + '</strong>';
+};
 
-    var past_futures = {
-        'proposed': true,
-        'construction': true,
-        'abandoned': true,
-        'dismantled': true,
-        'disused': true,
-        'razed': true,
-        'demolished': true,
-        'obliterated': true
-    };
+Renderer.prototype.em = function(text) {
+  return '<em>' + text + '</em>';
+};
 
-    var dispatch$$1 = dispatch('change', 'redraw'),
-        _cullFactor = 1,
-        _cache = {},
-        _features = {},
-        _stats = {},
-        _keys = [],
-        _hidden = [];
+Renderer.prototype.codespan = function(text) {
+  return '<code>' + text + '</code>';
+};
 
+Renderer.prototype.br = function() {
+  return this.options.xhtml ? '<br/>' : '<br>';
+};
 
-    function update() {
-        if (!window.mocha) {
-            var q = utilStringQs(window.location.hash.substring(1));
-            var disabled = features.disabled();
-            if (disabled.length) {
-                q.disable_features = features.disabled().join(',');
-            } else {
-                delete q.disable_features;
-            }
-            window.location.replace('#' + utilQsString(q, true));
-        }
+Renderer.prototype.del = function(text) {
+  return '<del>' + text + '</del>';
+};
 
-        _hidden = features.hidden();
-        dispatch$$1.call('change');
-        dispatch$$1.call('redraw');
+Renderer.prototype.link = function(href, title, text) {
+  if (this.options.sanitize) {
+    try {
+      var prot = decodeURIComponent(unescape(href))
+        .replace(/[^\w:]/g, '')
+        .toLowerCase();
+    } catch (e) {
+      return text;
     }
-
-
-    function defineFeature(k, filter, max) {
-        var isEnabled = true;
-
-        _keys.push(k);
-        _features[k] = {
-            filter: filter,
-            enabled: isEnabled,   // whether the user wants it enabled..
-            count: 0,
-            currentMax: (max || Infinity),
-            defaultMax: (max || Infinity),
-            enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
-            disable: function() { this.enabled = false; this.currentMax = 0; },
-            hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
-            autoHidden: function() { return this.hidden() && this.currentMax > 0; }
-        };
+    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+      return text;
     }
+  }
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<a href="' + href + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += '>' + text + '</a>';
+  return out;
+};
 
+Renderer.prototype.image = function(href, title, text) {
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<img src="' + href + '" alt="' + text + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += this.options.xhtml ? '/>' : '>';
+  return out;
+};
 
-    defineFeature('points', function isPoint(entity, resolver, geometry) {
-        return geometry === 'point';
-    }, 200);
+Renderer.prototype.text = function(text) {
+  return text;
+};
 
-    defineFeature('traffic_roads', function isTrafficRoad(entity) {
-        return traffic_roads[entity.tags.highway];
-    });
+/**
+ * Parsing & Compiling
+ */
 
-    defineFeature('service_roads', function isServiceRoad(entity) {
-        return service_roads[entity.tags.highway];
-    });
+function Parser(options) {
+  this.tokens = [];
+  this.token = null;
+  this.options = options || marked.defaults;
+  this.options.renderer = this.options.renderer || new Renderer;
+  this.renderer = this.options.renderer;
+  this.renderer.options = this.options;
+}
 
-    defineFeature('paths', function isPath(entity) {
-        return paths[entity.tags.highway];
-    });
+/**
+ * Static Parse Method
+ */
 
-    defineFeature('buildings', function isBuilding(entity) {
-        return (
-            !!entity.tags['building:part'] ||
-            (!!entity.tags.building && entity.tags.building !== 'no') ||
-            entity.tags.amenity === 'shelter' ||
-            entity.tags.parking === 'multi-storey' ||
-            entity.tags.parking === 'sheds' ||
-            entity.tags.parking === 'carports' ||
-            entity.tags.parking === 'garage_boxes'
-        );
-    }, 250);
+Parser.parse = function(src, options, renderer) {
+  var parser = new Parser(options, renderer);
+  return parser.parse(src);
+};
 
-    defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
-        return geometry === 'area' &&
-            !_features.buildings.filter(entity) &&
-            !_features.water.filter(entity);
-    });
+/**
+ * Parse Loop
+ */
 
-    defineFeature('boundaries', function isBoundary(entity) {
-        return !!entity.tags.boundary;
-    });
+Parser.prototype.parse = function(src) {
+  this.inline = new InlineLexer(src.links, this.options, this.renderer);
+  this.tokens = src.reverse();
 
-    defineFeature('water', function isWater(entity) {
-        return (
-            !!entity.tags.waterway ||
-            entity.tags.natural === 'water' ||
-            entity.tags.natural === 'coastline' ||
-            entity.tags.natural === 'bay' ||
-            entity.tags.landuse === 'pond' ||
-            entity.tags.landuse === 'basin' ||
-            entity.tags.landuse === 'reservoir' ||
-            entity.tags.landuse === 'salt_pond'
-        );
-    });
+  var out = '';
+  while (this.next()) {
+    out += this.tok();
+  }
 
-    defineFeature('rail', function isRail(entity) {
-        return (
-            !!entity.tags.railway ||
-            entity.tags.landuse === 'railway'
-        ) && !(
-            traffic_roads[entity.tags.highway] ||
-            service_roads[entity.tags.highway] ||
-            paths[entity.tags.highway]
-        );
-    });
+  return out;
+};
 
-    defineFeature('power', function isPower(entity) {
-        return !!entity.tags.power;
-    });
+/**
+ * Next Token
+ */
 
-    // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
-    defineFeature('past_future', function isPastFuture(entity) {
-        if (
-            traffic_roads[entity.tags.highway] ||
-            service_roads[entity.tags.highway] ||
-            paths[entity.tags.highway]
-        ) { return false; }
+Parser.prototype.next = function() {
+  return this.token = this.tokens.pop();
+};
 
-        var strings = Object.keys(entity.tags);
+/**
+ * Preview Next Token
+ */
 
-        for (var i = 0; i < strings.length; i++) {
-            var s = strings[i];
-            if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
-        }
-        return false;
-    });
+Parser.prototype.peek = function() {
+  return this.tokens[this.tokens.length - 1] || 0;
+};
 
-    // Lines or areas that don't match another feature filter.
-    // IMPORTANT: The 'others' feature must be the last one defined,
-    //   so that code in getMatches can skip this test if `hasMatch = true`
-    defineFeature('others', function isOther(entity, resolver, geometry) {
-        return (geometry === 'line' || geometry === 'area');
-    });
+/**
+ * Parse Text Tokens
+ */
 
+Parser.prototype.parseText = function() {
+  var body = this.token.text;
 
-    function features() {}
+  while (this.peek().type === 'text') {
+    body += '\n' + this.next().text;
+  }
 
+  return this.inline.output(body);
+};
 
-    features.features = function() {
-        return _features;
-    };
+/**
+ * Parse Current Token
+ */
 
+Parser.prototype.tok = function() {
+  switch (this.token.type) {
+    case 'space': {
+      return '';
+    }
+    case 'hr': {
+      return this.renderer.hr();
+    }
+    case 'heading': {
+      return this.renderer.heading(
+        this.inline.output(this.token.text),
+        this.token.depth,
+        this.token.text);
+    }
+    case 'code': {
+      return this.renderer.code(this.token.text,
+        this.token.lang,
+        this.token.escaped);
+    }
+    case 'table': {
+      var header = ''
+        , body = ''
+        , i
+        , row
+        , cell
+        , flags
+        , j;
 
-    features.keys = function() {
-        return _keys;
-    };
+      // header
+      cell = '';
+      for (i = 0; i < this.token.header.length; i++) {
+        flags = { header: true, align: this.token.align[i] };
+        cell += this.renderer.tablecell(
+          this.inline.output(this.token.header[i]),
+          { header: true, align: this.token.align[i] }
+        );
+      }
+      header += this.renderer.tablerow(cell);
 
+      for (i = 0; i < this.token.cells.length; i++) {
+        row = this.token.cells[i];
 
-    features.enabled = function(k) {
-        if (!arguments.length) {
-            return _keys.filter(function(k) { return _features[k].enabled; });
+        cell = '';
+        for (j = 0; j < row.length; j++) {
+          cell += this.renderer.tablecell(
+            this.inline.output(row[j]),
+            { header: false, align: this.token.align[j] }
+          );
         }
-        return _features[k] && _features[k].enabled;
-    };
 
+        body += this.renderer.tablerow(cell);
+      }
+      return this.renderer.table(header, body);
+    }
+    case 'blockquote_start': {
+      var body = '';
 
-    features.disabled = function(k) {
-        if (!arguments.length) {
-            return _keys.filter(function(k) { return !_features[k].enabled; });
-        }
-        return _features[k] && !_features[k].enabled;
-    };
+      while (this.next().type !== 'blockquote_end') {
+        body += this.tok();
+      }
 
+      return this.renderer.blockquote(body);
+    }
+    case 'list_start': {
+      var body = ''
+        , ordered = this.token.ordered;
 
-    features.hidden = function(k) {
-        if (!arguments.length) {
-            return _keys.filter(function(k) { return _features[k].hidden(); });
-        }
-        return _features[k] && _features[k].hidden();
-    };
+      while (this.next().type !== 'list_end') {
+        body += this.tok();
+      }
 
+      return this.renderer.list(body, ordered);
+    }
+    case 'list_item_start': {
+      var body = '';
 
-    features.autoHidden = function(k) {
-        if (!arguments.length) {
-            return _keys.filter(function(k) { return _features[k].autoHidden(); });
-        }
-        return _features[k] && _features[k].autoHidden();
-    };
+      while (this.next().type !== 'list_item_end') {
+        body += this.token.type === 'text'
+          ? this.parseText()
+          : this.tok();
+      }
 
+      return this.renderer.listitem(body);
+    }
+    case 'loose_item_start': {
+      var body = '';
 
-    features.enable = function(k) {
-        if (_features[k] && !_features[k].enabled) {
-            _features[k].enable();
-            update();
-        }
-    };
+      while (this.next().type !== 'list_item_end') {
+        body += this.tok();
+      }
 
+      return this.renderer.listitem(body);
+    }
+    case 'html': {
+      var html = !this.token.pre && !this.options.pedantic
+        ? this.inline.output(this.token.text)
+        : this.token.text;
+      return this.renderer.html(html);
+    }
+    case 'paragraph': {
+      return this.renderer.paragraph(this.inline.output(this.token.text));
+    }
+    case 'text': {
+      return this.renderer.paragraph(this.parseText());
+    }
+  }
+};
 
-    features.disable = function(k) {
-        if (_features[k] && _features[k].enabled) {
-            _features[k].disable();
-            update();
-        }
-    };
+/**
+ * Helpers
+ */
 
+function escape(html, encode) {
+  return html
+    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/"/g, '&quot;')
+    .replace(/'/g, '&#39;');
+}
 
-    features.toggle = function(k) {
-        if (_features[k]) {
-            (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
-            update();
-        }
-    };
+function unescape(html) {
+       // explicitly match decimal, hex, and named HTML entities
+  return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+    n = n.toLowerCase();
+    if (n === 'colon') return ':';
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1));
+    }
+    return '';
+  });
+}
 
+function replace(regex, opt) {
+  regex = regex.source;
+  opt = opt || '';
+  return function self(name, val) {
+    if (!name) return new RegExp(regex, opt);
+    val = val.source || val;
+    val = val.replace(/(^|[^\[])\^/g, '$1');
+    regex = regex.replace(name, val);
+    return self;
+  };
+}
 
-    features.resetStats = function() {
-        for (var i = 0; i < _keys.length; i++) {
-            _features[_keys[i]].count = 0;
-        }
-        dispatch$$1.call('change');
-    };
+function resolveUrl(base, href) {
+  if (!baseUrls[' ' + base]) {
+    // we can ignore everything in base after the last slash of its path component,
+    // but we might need to add _that_
+    // https://tools.ietf.org/html/rfc3986#section-3
+    if (/^[^:]+:\/*[^/]*$/.test(base)) {
+      baseUrls[' ' + base] = base + '/';
+    } else {
+      baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
+    }
+  }
+  base = baseUrls[' ' + base];
 
+  if (href.slice(0, 2) === '//') {
+    return base.replace(/:[\s\S]*/, ':') + href;
+  } else if (href.charAt(0) === '/') {
+    return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+  } else {
+    return base + href;
+  }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
 
-    features.gatherStats = function(d, resolver, dimensions) {
-        var needsRedraw = false,
-            type = groupBy(d, function(ent) { return ent.type; }),
-            entities = [].concat(type.relation || [], type.way || [], type.node || []),
-            currHidden, geometry, matches, i, j;
+function noop() {}
+noop.exec = noop;
 
-        for (i = 0; i < _keys.length; i++) {
-            _features[_keys[i]].count = 0;
-        }
+function merge(obj) {
+  var i = 1
+    , target
+    , key;
 
-        // adjust the threshold for point/building culling based on viewport size..
-        // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
-        _cullFactor = dimensions[0] * dimensions[1] / 1000000;
+  for (; i < arguments.length; i++) {
+    target = arguments[i];
+    for (key in target) {
+      if (Object.prototype.hasOwnProperty.call(target, key)) {
+        obj[key] = target[key];
+      }
+    }
+  }
 
-        for (i = 0; i < entities.length; i++) {
-            geometry = entities[i].geometry(resolver);
-            if (!(geometry === 'vertex' || geometry === 'relation')) {
-                matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
-                for (j = 0; j < matches.length; j++) {
-                    _features[matches[j]].count++;
-                }
-            }
-        }
+  return obj;
+}
 
-        currHidden = features.hidden();
-        if (currHidden !== _hidden) {
-            _hidden = currHidden;
-            needsRedraw = true;
-            dispatch$$1.call('change');
-        }
 
-        return needsRedraw;
-    };
+/**
+ * Marked
+ */
 
+function marked(src, opt, callback) {
+  if (callback || typeof opt === 'function') {
+    if (!callback) {
+      callback = opt;
+      opt = null;
+    }
 
-    features.stats = function() {
-        for (var i = 0; i < _keys.length; i++) {
-            _stats[_keys[i]] = _features[_keys[i]].count;
-        }
+    opt = merge({}, marked.defaults, opt || {});
 
-        return _stats;
-    };
+    var highlight = opt.highlight
+      , tokens
+      , pending
+      , i = 0;
 
+    try {
+      tokens = Lexer.lex(src, opt);
+    } catch (e) {
+      return callback(e);
+    }
 
-    features.clear = function(d) {
-        for (var i = 0; i < d.length; i++) {
-            features.clearEntity(d[i]);
-        }
-    };
+    pending = tokens.length;
+
+    var done = function(err) {
+      if (err) {
+        opt.highlight = highlight;
+        return callback(err);
+      }
 
+      var out;
 
-    features.clearEntity = function(entity) {
-        delete _cache[osmEntity.key(entity)];
-    };
+      try {
+        out = Parser.parse(tokens, opt);
+      } catch (e) {
+        err = e;
+      }
 
+      opt.highlight = highlight;
 
-    features.reset = function() {
-        _cache = {};
+      return err
+        ? callback(err)
+        : callback(null, out);
     };
 
+    if (!highlight || highlight.length < 3) {
+      return done();
+    }
 
-    features.getMatches = function(entity, resolver, geometry) {
-        if (geometry === 'vertex' || geometry === 'relation') return {};
+    delete opt.highlight;
 
-        var ent = osmEntity.key(entity);
-        if (!_cache[ent]) {
-            _cache[ent] = {};
+    if (!pending) return done();
+
+    for (; i < tokens.length; i++) {
+      (function(token) {
+        if (token.type !== 'code') {
+          return --pending || done();
         }
+        return highlight(token.text, token.lang, function(err, code) {
+          if (err) return done(err);
+          if (code == null || code === token.text) {
+            return --pending || done();
+          }
+          token.text = code;
+          token.escaped = true;
+          --pending || done();
+        });
+      })(tokens[i]);
+    }
 
-        if (!_cache[ent].matches) {
-            var matches = {},
-                hasMatch = false;
+    return;
+  }
+  try {
+    if (opt) opt = merge({}, marked.defaults, opt);
+    return Parser.parse(Lexer.lex(src, opt), opt);
+  } catch (e) {
+    e.message += '\nPlease report this to https://github.com/chjj/marked.';
+    if ((opt || marked.defaults).silent) {
+      return '<p>An error occurred:</p><pre>'
+        + escape(e.message + '', true)
+        + '</pre>';
+    }
+    throw e;
+  }
+}
 
-            for (var i = 0; i < _keys.length; i++) {
-                if (_keys[i] === 'others') {
-                    if (hasMatch) continue;
+/**
+ * Options
+ */
 
-                    // Multipolygon members:
-                    // If an entity...
-                    //   1. is a way that hasn't matched other 'interesting' feature rules,
-                    //   2. and it belongs to a single parent multipolygon relation
-                    // ...then match whatever feature rules the parent multipolygon has matched.
-                    // see #2548, #2887
-                    //
-                    // IMPORTANT:
-                    // For this to work, getMatches must be called on relations before ways.
-                    //
-                    if (entity.type === 'way') {
-                        var parents = features.getParents(entity, resolver, geometry);
-                        if (parents.length === 1 && parents[0].isMultipolygon()) {
-                            var pkey = osmEntity.key(parents[0]);
-                            if (_cache[pkey] && _cache[pkey].matches) {
-                                matches = clone(_cache[pkey].matches);
-                                continue;
-                            }
-                        }
-                    }
-                }
+marked.options =
+marked.setOptions = function(opt) {
+  merge(marked.defaults, opt);
+  return marked;
+};
 
-                if (_features[_keys[i]].filter(entity, resolver, geometry)) {
-                    matches[_keys[i]] = hasMatch = true;
-                }
-            }
-            _cache[ent].matches = matches;
-        }
+marked.defaults = {
+  gfm: true,
+  tables: true,
+  breaks: false,
+  pedantic: false,
+  sanitize: false,
+  sanitizer: null,
+  mangle: true,
+  smartLists: false,
+  silent: false,
+  highlight: null,
+  langPrefix: 'lang-',
+  smartypants: false,
+  headerPrefix: '',
+  renderer: new Renderer,
+  xhtml: false,
+  baseUrl: null
+};
 
-        return _cache[ent].matches;
-    };
+/**
+ * Expose
+ */
 
+marked.Parser = Parser;
+marked.parser = Parser.parse;
 
-    features.getParents = function(entity, resolver, geometry) {
-        if (geometry === 'point') return [];
+marked.Renderer = Renderer;
 
-        var ent = osmEntity.key(entity);
-        if (!_cache[ent]) {
-            _cache[ent] = {};
-        }
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
 
-        if (!_cache[ent].parents) {
-            var parents = [];
-            if (geometry === 'vertex') {
-                parents = resolver.parentWays(entity);
-            } else {   // 'line', 'area', 'relation'
-                parents = resolver.parentRelations(entity);
-            }
-            _cache[ent].parents = parents;
-        }
-        return _cache[ent].parents;
-    };
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
 
+marked.parse = marked;
 
-    features.isHiddenFeature = function(entity, resolver, geometry) {
-        if (!_hidden.length) return false;
-        if (!entity.version) return false;
+{
+  module.exports = marked;
+}
 
-        var matches = features.getMatches(entity, resolver, geometry);
+}).call(function() {
+  return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
+}());
+});
 
-        for (var i = 0; i < _hidden.length; i++) {
-            if (matches[_hidden[i]]) return true;
-        }
-        return false;
+function pointBox(loc, context) {
+    var rect = context.surfaceRect();
+    var point = context.curtainProjection(loc);
+    return {
+        left: point[0] + rect.left - 40,
+        top: point[1] + rect.top - 60,
+        width: 80,
+        height: 90
     };
+}
 
 
-    features.isHiddenChild = function(entity, resolver, geometry) {
-        if (!_hidden.length) return false;
-        if (!entity.version || geometry === 'point') return false;
-
-        var parents = features.getParents(entity, resolver, geometry);
-        if (!parents.length) return false;
+function pad$1(locOrBox, padding, context) {
+    var box;
+    if (locOrBox instanceof Array) {
+        var rect = context.surfaceRect();
+        var point = context.curtainProjection(locOrBox);
+        box = {
+            left: point[0] + rect.left,
+            top: point[1] + rect.top
+        };
+    } else {
+        box = locOrBox;
+    }
 
-        for (var i = 0; i < parents.length; i++) {
-            if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
-                return false;
-            }
-        }
-        return true;
+    return {
+        left: box.left - padding,
+        top: box.top - padding,
+        width: (box.width || 0) + 2 * padding,
+        height: (box.width || 0) + 2 * padding
     };
+}
 
 
-    features.hasHiddenConnections = function(entity, resolver) {
-        if (!_hidden.length) return false;
-        var childNodes, connections;
+function icon(name, svgklass, useklass) {
+    return '<svg class="icon ' + (svgklass || '') + '">' +
+         '<use xlink:href="' + name + '"' +
+         (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
+}
 
-        if (entity.type === 'midpoint') {
-            childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
-            connections = [];
-        } else {
-            childNodes = entity.nodes ? resolver.childNodes(entity) : [];
-            connections = features.getParents(entity, resolver, entity.geometry(resolver));
-        }
 
-        // gather ways connected to child nodes..
-        connections = reduce(childNodes, function(result, e) {
-            return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
-        }, connections);
+function slugify(text) {
+    return text.toString().toLowerCase()
+        .replace(/\s+/g, '-')           // Replace spaces with -
+        .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
+        .replace(/\-\-+/g, '-')         // Replace multiple - with single -
+        .replace(/^-+/, '')             // Trim - from start of text
+        .replace(/-+$/, '');            // Trim - from end of text
+}
 
-        return connections.length ? some(connections, function(e) {
-            return features.isHidden(e, resolver, e.geometry(resolver));
-        }) : false;
-    };
+
+// console warning for missing walkthrough names
+var missingStrings = {};
+function checkKey(key, text) {
+    if (t(key, { default: undefined}) === undefined) {
+        if (missingStrings.hasOwnProperty(key)) return;  // warn once
+        missingStrings[key] = text;
+        var missing = key + ': ' + text;
+        if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
+    }
+}
 
 
-    features.isHidden = function(entity, resolver, geometry) {
-        if (!_hidden.length) return false;
-        if (!entity.version) return false;
+function localize(obj) {
+    var key;
 
-        var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
-        return fn(entity, resolver, geometry);
-    };
+    // Assign name if entity has one..
+    var name = obj.tags && obj.tags.name;
+    if (name) {
+        key = 'intro.graph.name.' + slugify(name);
+        obj.tags.name = t(key, { default: name });
+        checkKey(key, name);
+    }
 
+    // Assign street name if entity has one..
+    var street = obj.tags && obj.tags['addr:street'];
+    if (street) {
+        key = 'intro.graph.name.' + slugify(street);
+        obj.tags['addr:street'] = t(key, { default: street });
+        checkKey(key, street);
 
-    features.filter = function(d, resolver) {
-        if (!_hidden.length) return d;
+        // Add address details common across walkthrough..
+        var addrTags = [
+            'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
+            'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
+        ];
+        addrTags.forEach(function(k) {
+            var key = 'intro.graph.' + k,
+                tag = 'addr:' + k,
+                val = obj.tags && obj.tags[tag],
+                str = t(key, { default: val });
 
-        var result = [];
-        for (var i = 0; i < d.length; i++) {
-            var entity = d[i];
-            if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
-                result.push(entity);
+            if (str) {
+                if (str.match(/^<.*>$/) !== null) {
+                    delete obj.tags[tag];
+                } else {
+                    obj.tags[tag] = str;
+                }
             }
-        }
-        return result;
-    };
+        });
+    }
 
+    return obj;
+}
 
-    features.init = function() {
-        var q = utilStringQs(window.location.hash.substring(1));
 
-        if (q.disable_features) {
-            var disabled = q.disable_features.replace(/;/g, ',').split(',');
-            disabled.forEach(features.disable);
+// Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
+function isMostlySquare(points) {
+    // note: uses 15 here instead of the 12 from actionOrthogonalize because
+    // actionOrthogonalize can actually straighten some larger angles as it iterates
+    var threshold = 15, // degrees within right or straight
+        lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
+        upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
+        mag;
+
+    for (var i = 0; i < points.length; i++) {
+        mag = Math.abs(normalizedDotProduct(i, points));
+        if (mag > lowerBound && mag < upperBound) {
+            return false;
         }
-    };
+    }
 
-    return utilRebind(features, dispatch$$1, 'on');
-}
+    return true;
 
-function utilBindOnce(target, type, listener, capture) {
-    var typeOnce = type + '.once';
-    function one() {
-        target.on(typeOnce, null);
-        listener.apply(this, arguments);
-    }
-    target.on(typeOnce, one, capture);
-    return this;
-}
 
-function rendererMap(context) {
+    function normalizedDotProduct(i, points) {
+        var a = points[(i - 1 + points.length) % points.length],
+            b = points[i],
+            c = points[(i + 1) % points.length],
+            p = subtractPoints(a, b),
+            q = subtractPoints(c, b);
 
-    var dimensions = [1, 1],
-        dispatch$$1 = dispatch('move', 'drawn'),
-        projection = context.projection,
-        curtainProjection = context.curtainProjection,
-        dblclickEnabled = true,
-        redrawEnabled = true,
-        transformStart = projection.transform(),
-        transformLast,
-        transformed = false,
-        minzoom = 0,
-        drawLayers = svgLayers(projection, context),
-        drawPoints = svgPoints(projection, context),
-        drawVertices = svgVertices(projection, context),
-        drawLines = svgLines(projection, context),
-        drawAreas = svgAreas(projection, context),
-        drawMidpoints = svgMidpoints(projection, context),
-        drawLabels = svgLabels(projection, context),
-        supersurface = d3_select(null),
-        wrapper = d3_select(null),
-        surface = d3_select(null),
-        mouse,
-        mousemove;
+        p = normalizePoint(p);
+        q = normalizePoint(q);
 
-    var zoom$$1 = d3_zoom()
-        .scaleExtent([ztok(2), ztok(24)])
-        .interpolate(d3_interpolate)
-        .filter(zoomEventFilter)
-        .on('zoom', zoomPan);
+        return p[0] * q[0] + p[1] * q[1];
 
-    var _selection = d3_select(null);
 
-    var scheduleRedraw = throttle(redraw, 750);
-    // var isRedrawScheduled = false;
-    // var pendingRedrawCall;
-    // function scheduleRedraw() {
-    //     // Only schedule the redraw if one has not already been set.
-    //     if (isRedrawScheduled) return;
-    //     isRedrawScheduled = true;
-    //     var that = this;
-    //     var args = arguments;
-    //     pendingRedrawCall = window.requestIdleCallback(function () {
-    //         // Reset the boolean so future redraws can be set.
-    //         isRedrawScheduled = false;
-    //         redraw.apply(that, args);
-    //     }, { timeout: 1400 });
-    // }
+        function subtractPoints(a, b) {
+            return [a[0] - b[0], a[1] - b[1]];
+        }
 
-    function cancelPendingRedraw() {
-        scheduleRedraw.cancel();
-        // isRedrawScheduled = false;
-        // window.cancelIdleCallback(pendingRedrawCall);
+        function normalizePoint(point) {
+            var vector = [0, 0];
+            var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
+            if (length !== 0) {
+                vector[0] = point[0] / length;
+                vector[1] = point[1] / length;
+            }
+            return vector;
+        }
     }
+}
 
-    function map(selection) {
 
-        _selection = selection;
+function selectMenuItem(operation) {
+    var selector = '.edit-menu .edit-menu-item-' + operation +
+        ', .radial-menu .radial-menu-item-' + operation;
+    return d3_select(selector);
+}
 
-        context
-            .on('change.map', immediateRedraw);
 
-        var osm = context.connection();
-        if (osm) {
-            osm.on('change.map', immediateRedraw);
-        }
+function transitionTime(point1, point2) {
+    var distance = geoSphericalDistance(point1, point2);
+    if (distance === 0)
+        return 0;
+    else if (distance < 80)
+        return 500;
+    else
+        return 1000;
+}
 
-        context.history()
-            .on('change.map', immediateRedraw)
-            .on('undone.map redone.map', function(stack) {
-                var mode = context.mode().id;
-                if (mode !== 'browse' && mode !== 'select') return;
+var dataIntroGraph = {"n1":{"id":"n1","loc":[-85.631039,41.948829]},"n10":{"id":"n10","loc":[-85.634733,41.941588]},"n100":{"id":"n100","loc":[-85.637395,41.942252]},"n1000":{"id":"n1000","loc":[-85.632699,41.944763]},"n1001":{"id":"n1001","loc":[-85.632685,41.944763]},"n1002":{"id":"n1002","loc":[-85.632673,41.944755]},"n1003":{"id":"n1003","loc":[-85.632595,41.944682]},"n1004":{"id":"n1004","loc":[-85.632576,41.944673]},"n1005":{"id":"n1005","loc":[-85.632551,41.944667]},"n1006":{"id":"n1006","loc":[-85.63253,41.944667]},"n1007":{"id":"n1007","loc":[-85.632502,41.944669]},"n1008":{"id":"n1008","loc":[-85.632483,41.944677]},"n1009":{"id":"n1009","loc":[-85.632383,41.944731]},"n101":{"id":"n101","loc":[-85.637357,41.942252]},"n1010":{"id":"n1010","loc":[-85.63349,41.944976],"tags":{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Sherwin-Williams","shop":"paint"}},"n1011":{"id":"n1011","loc":[-85.633548,41.945034],"tags":{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Unique Jewelry","shop":"jewelry"}},"n1012":{"id":"n1012","loc":[-85.633683,41.945129],"tags":{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"World Fare","shop":"gift"}},"n1013":{"id":"n1013","loc":[-85.634563,41.945469],"tags":{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Golden Finch Framing","shop":"frame"}},"n1014":{"id":"n1014","loc":[-85.634469,41.945379],"tags":{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Dollar Tree","shop":"second_hand"}},"n1015":{"id":"n1015","loc":[-85.634227,41.945159],"tags":{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"theatre","name":"Riviera Theatre"}},"n1016":{"id":"n1016","loc":[-85.634057,41.945012],"tags":{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"River City Appliance","shop":"appliance"}},"n1017":{"id":"n1017","loc":[-85.633879,41.945325],"tags":{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paparazzi Tattoo","shop":"tattoo"}},"n1018":{"id":"n1018","loc":[-85.634914,41.945839],"tags":{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"bank","name":"Southern Michigan Bank"}},"n1019":{"id":"n1019","loc":[-85.634514,41.946176]},"n102":{"id":"n102","loc":[-85.637357,41.942216]},"n1020":{"id":"n1020","loc":[-85.634087,41.946178]},"n1021":{"id":"n1021","loc":[-85.634357,41.945805]},"n1022":{"id":"n1022","loc":[-85.634389,41.945788]},"n1023":{"id":"n1023","loc":[-85.634491,41.94581]},"n1024":{"id":"n1024","loc":[-85.634513,41.945853]},"n1025":{"id":"n1025","loc":[-85.634506,41.94583]},"n1026":{"id":"n1026","loc":[-85.634762,41.946056],"tags":{"crossing":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","highway":"crossing"}},"n1029":{"id":"n1029","loc":[-85.640655,41.942057]},"n103":{"id":"n103","loc":[-85.637386,41.942054]},"n1030":{"id":"n1030","loc":[-85.640947,41.942057]},"n1031":{"id":"n1031","loc":[-85.640957,41.942593]},"n1032":{"id":"n1032","loc":[-85.630953,41.960873]},"n1033":{"id":"n1033","loc":[-85.632174,41.960679]},"n1034":{"id":"n1034","loc":[-85.638785,41.943066]},"n1035":{"id":"n1035","loc":[-85.638853,41.943065]},"n1036":{"id":"n1036","loc":[-85.638855,41.943183]},"n1037":{"id":"n1037","loc":[-85.638552,41.943189]},"n1038":{"id":"n1038","loc":[-85.63855,41.943149]},"n1039":{"id":"n1039","loc":[-85.638638,41.943068]},"n104":{"id":"n104","loc":[-85.637387,41.942125]},"n1040":{"id":"n1040","loc":[-85.638638,41.943078]},"n1041":{"id":"n1041","loc":[-85.638813,41.943163]},"n1042":{"id":"n1042","loc":[-85.638684,41.943165]},"n1043":{"id":"n1043","loc":[-85.638682,41.943105]},"n1044":{"id":"n1044","loc":[-85.638706,41.943105]},"n1045":{"id":"n1045","loc":[-85.638707,41.943117]},"n1046":{"id":"n1046","loc":[-85.638812,41.943115]},"n1047":{"id":"n1047","loc":[-85.638769,41.943407]},"n1048":{"id":"n1048","loc":[-85.638549,41.943407]},"n1049":{"id":"n1049","loc":[-85.638567,41.943555]},"n105":{"id":"n105","loc":[-85.637319,41.942125]},"n1050":{"id":"n1050","loc":[-85.638426,41.943554]},"n1051":{"id":"n1051","loc":[-85.638427,41.94346]},"n1052":{"id":"n1052","loc":[-85.638568,41.943461]},"n1053":{"id":"n1053","loc":[-85.639264,41.943415]},"n1054":{"id":"n1054","loc":[-85.639082,41.943417]},"n1055":{"id":"n1055","loc":[-85.63908,41.943331]},"n1056":{"id":"n1056","loc":[-85.639136,41.94333]},"n1057":{"id":"n1057","loc":[-85.639158,41.943312]},"n1058":{"id":"n1058","loc":[-85.639188,41.943313]},"n1059":{"id":"n1059","loc":[-85.639211,41.943331]},"n106":{"id":"n106","loc":[-85.637319,41.942137]},"n1060":{"id":"n1060","loc":[-85.639262,41.943331]},"n1061":{"id":"n1061","loc":[-85.638986,41.943515]},"n1062":{"id":"n1062","loc":[-85.63888,41.943521]},"n1063":{"id":"n1063","loc":[-85.638871,41.943436]},"n1064":{"id":"n1064","loc":[-85.638958,41.943431]},"n1065":{"id":"n1065","loc":[-85.638979,41.943443]},"n1066":{"id":"n1066","loc":[-85.63926,41.943703]},"n1067":{"id":"n1067","loc":[-85.639152,41.943704]},"n1068":{"id":"n1068","loc":[-85.639152,41.943691]},"n1069":{"id":"n1069","loc":[-85.639063,41.943691]},"n107":{"id":"n107","loc":[-85.637259,41.942137]},"n1070":{"id":"n1070","loc":[-85.639062,41.943613]},"n1071":{"id":"n1071","loc":[-85.639259,41.943611]},"n1072":{"id":"n1072","loc":[-85.639117,41.943726]},"n1073":{"id":"n1073","loc":[-85.639118,41.943767]},"n1074":{"id":"n1074","loc":[-85.639051,41.943768]},"n1075":{"id":"n1075","loc":[-85.63905,41.943727]},"n1076":{"id":"n1076","loc":[-85.638627,41.943716]},"n1077":{"id":"n1077","loc":[-85.63863,41.943634]},"n1078":{"id":"n1078","loc":[-85.63844,41.943631]},"n1079":{"id":"n1079","loc":[-85.638437,41.943729]},"n108":{"id":"n108","loc":[-85.637259,41.942126]},"n1080":{"id":"n1080","loc":[-85.638533,41.94373]},"n1081":{"id":"n1081","loc":[-85.638534,41.943715]},"n1082":{"id":"n1082","loc":[-85.638678,41.943941]},"n1083":{"id":"n1083","loc":[-85.638522,41.943944]},"n1084":{"id":"n1084","loc":[-85.63852,41.943864]},"n1085":{"id":"n1085","loc":[-85.638676,41.943861]},"n1086":{"id":"n1086","loc":[-85.638663,41.944059]},"n1087":{"id":"n1087","loc":[-85.638513,41.944061]},"n1088":{"id":"n1088","loc":[-85.638511,41.943991]},"n1089":{"id":"n1089","loc":[-85.638661,41.943989]},"n109":{"id":"n109","loc":[-85.637193,41.942126]},"n1090":{"id":"n1090","loc":[-85.63865,41.944134]},"n1091":{"id":"n1091","loc":[-85.638429,41.944144]},"n1092":{"id":"n1092","loc":[-85.638426,41.944106]},"n1093":{"id":"n1093","loc":[-85.638476,41.944104]},"n1094":{"id":"n1094","loc":[-85.638475,41.94409]},"n1095":{"id":"n1095","loc":[-85.638594,41.944084]},"n1096":{"id":"n1096","loc":[-85.638595,41.944101]},"n1097":{"id":"n1097","loc":[-85.638647,41.944099]},"n1098":{"id":"n1098","loc":[-85.63829,41.944154]},"n1099":{"id":"n1099","loc":[-85.638558,41.944155]},"n11":{"id":"n11","loc":[-85.634602,41.941523]},"n110":{"id":"n110","loc":[-85.637192,41.942053]},"n1100":{"id":"n1100","loc":[-85.638558,41.944338]},"n1101":{"id":"n1101","loc":[-85.638851,41.944408]},"n1102":{"id":"n1102","loc":[-85.637771,41.943989]},"n1103":{"id":"n1103","loc":[-85.639345,41.943964]},"n1104":{"id":"n1104","loc":[-85.638515,41.94397]},"n1105":{"id":"n1105","loc":[-85.639256,41.943928]},"n1106":{"id":"n1106","loc":[-85.639157,41.943929]},"n1107":{"id":"n1107","loc":[-85.639156,41.9439]},"n1108":{"id":"n1108","loc":[-85.639118,41.9439]},"n1109":{"id":"n1109","loc":[-85.639116,41.94382]},"n111":{"id":"n111","loc":[-85.637248,41.942053]},"n1110":{"id":"n1110","loc":[-85.639202,41.943819]},"n1111":{"id":"n1111","loc":[-85.639202,41.943837]},"n1112":{"id":"n1112","loc":[-85.639293,41.943836]},"n1113":{"id":"n1113","loc":[-85.639295,41.943898]},"n1114":{"id":"n1114","loc":[-85.639255,41.943898]},"n1115":{"id":"n1115","loc":[-85.639296,41.944083]},"n1116":{"id":"n1116","loc":[-85.639144,41.944084]},"n1117":{"id":"n1117","loc":[-85.639143,41.944026]},"n1118":{"id":"n1118","loc":[-85.639162,41.944026]},"n1119":{"id":"n1119","loc":[-85.639162,41.944]},"n112":{"id":"n112","loc":[-85.637248,41.942042]},"n1120":{"id":"n1120","loc":[-85.639295,41.943999]},"n1121":{"id":"n1121","loc":[-85.639131,41.944139]},"n1122":{"id":"n1122","loc":[-85.63901,41.94414]},"n1123":{"id":"n1123","loc":[-85.63901,41.944076]},"n1124":{"id":"n1124","loc":[-85.63913,41.944075]},"n1125":{"id":"n1125","loc":[-85.639092,41.944155]},"n1126":{"id":"n1126","loc":[-85.639093,41.944308]},"n1127":{"id":"n1127","loc":[-85.639225,41.944308]},"n1128":{"id":"n1128","loc":[-85.639225,41.94429]},"n1129":{"id":"n1129","loc":[-85.639253,41.944289]},"n113":{"id":"n113","loc":[-85.637338,41.942041]},"n1130":{"id":"n1130","loc":[-85.639253,41.944269]},"n1131":{"id":"n1131","loc":[-85.639243,41.944269]},"n1132":{"id":"n1132","loc":[-85.639243,41.944229]},"n1133":{"id":"n1133","loc":[-85.639224,41.944229]},"n1134":{"id":"n1134","loc":[-85.639224,41.944196]},"n1135":{"id":"n1135","loc":[-85.639195,41.944196]},"n1136":{"id":"n1136","loc":[-85.639195,41.944155]},"n1137":{"id":"n1137","loc":[-85.639072,41.944154]},"n1138":{"id":"n1138","loc":[-85.638865,41.944154]},"n1139":{"id":"n1139","loc":[-85.638863,41.943967]},"n114":{"id":"n114","loc":[-85.637338,41.942055]},"n1140":{"id":"n1140","loc":[-85.6386,41.942698]},"n1141":{"id":"n1141","loc":[-85.639348,41.942698]},"n1142":{"id":"n1142","loc":[-85.639377,41.944984]},"n1143":{"id":"n1143","loc":[-85.63937,41.945013]},"n1144":{"id":"n1144","loc":[-85.639357,41.945033]},"n1145":{"id":"n1145","loc":[-85.639353,41.945053]},"n1146":{"id":"n1146","loc":[-85.639352,41.945084]},"n1147":{"id":"n1147","loc":[-85.638278,41.945516]},"n1148":{"id":"n1148","loc":[-85.637505,41.945801]},"n1149":{"id":"n1149","loc":[-85.637327,41.945857]},"n115":{"id":"n115","loc":[-85.637583,41.941943]},"n1150":{"id":"n1150","loc":[-85.637168,41.945899]},"n1151":{"id":"n1151","loc":[-85.637017,41.94593]},"n1152":{"id":"n1152","loc":[-85.637185,41.945938]},"n1153":{"id":"n1153","loc":[-85.63682,41.945963]},"n1154":{"id":"n1154","loc":[-85.636639,41.945984]},"n1155":{"id":"n1155","loc":[-85.636439,41.945999]},"n1156":{"id":"n1156","loc":[-85.635801,41.945999]},"n1157":{"id":"n1157","loc":[-85.635769,41.945908]},"n1158":{"id":"n1158","loc":[-85.635953,41.946154]},"n1159":{"id":"n1159","loc":[-85.635472,41.94598]},"n116":{"id":"n116","loc":[-85.637584,41.941983]},"n1160":{"id":"n1160","loc":[-85.635409,41.945981]},"n1161":{"id":"n1161","loc":[-85.635583,41.945987]},"n1162":{"id":"n1162","loc":[-85.636452,41.945805]},"n1163":{"id":"n1163","loc":[-85.636425,41.94582]},"n1164":{"id":"n1164","loc":[-85.636396,41.945817]},"n1165":{"id":"n1165","loc":[-85.636368,41.945797]},"n1166":{"id":"n1166","loc":[-85.636346,41.945767]},"n1167":{"id":"n1167","loc":[-85.636307,41.945745]},"n1168":{"id":"n1168","loc":[-85.636194,41.94565]},"n1169":{"id":"n1169","loc":[-85.636121,41.945579]},"n117":{"id":"n117","loc":[-85.63751,41.941983]},"n1170":{"id":"n1170","loc":[-85.635995,41.945432]},"n1171":{"id":"n1171","loc":[-85.637564,41.943538]},"n1172":{"id":"n1172","loc":[-85.63756,41.943505]},"n1173":{"id":"n1173","loc":[-85.637435,41.943489]},"n1174":{"id":"n1174","loc":[-85.637093,41.943556]},"n1175":{"id":"n1175","loc":[-85.634836,41.941574]},"n1176":{"id":"n1176","loc":[-85.634692,41.9415]},"n1177":{"id":"n1177","loc":[-85.634261,41.941337]},"n1178":{"id":"n1178","loc":[-85.634208,41.940962]},"n1179":{"id":"n1179","loc":[-85.635247,41.940968]},"n118":{"id":"n118","loc":[-85.637509,41.941944]},"n1180":{"id":"n1180","loc":[-85.63514,41.941205]},"n1181":{"id":"n1181","loc":[-85.634858,41.941511]},"n1182":{"id":"n1182","loc":[-85.630725,41.943465]},"n1183":{"id":"n1183","loc":[-85.632591,41.942826]},"n1184":{"id":"n1184","loc":[-85.634487,41.941928]},"n1185":{"id":"n1185","loc":[-85.634499,41.942056]},"n1186":{"id":"n1186","loc":[-85.63433,41.943102]},"n1187":{"id":"n1187","loc":[-85.634158,41.943151]},"n1188":{"id":"n1188","loc":[-85.634107,41.94305]},"n1189":{"id":"n1189","loc":[-85.634279,41.943002]},"n119":{"id":"n119","loc":[-85.637724,41.941973]},"n1190":{"id":"n1190","loc":[-85.634362,41.943762]},"n1191":{"id":"n1191","loc":[-85.634331,41.943731]},"n1192":{"id":"n1192","loc":[-85.634396,41.943695]},"n1193":{"id":"n1193","loc":[-85.634426,41.943726]},"n1194":{"id":"n1194","loc":[-85.621569,41.956021]},"n1195":{"id":"n1195","loc":[-85.621574,41.956164]},"n1196":{"id":"n1196","loc":[-85.621489,41.956165]},"n1197":{"id":"n1197","loc":[-85.621488,41.956136]},"n1198":{"id":"n1198","loc":[-85.621372,41.956139]},"n1199":{"id":"n1199","loc":[-85.621369,41.956049]},"n12":{"id":"n12","loc":[-85.63359,41.941093]},"n120":{"id":"n120","loc":[-85.637633,41.941973]},"n1200":{"id":"n1200","loc":[-85.621493,41.956047]},"n1201":{"id":"n1201","loc":[-85.621492,41.956022]},"n1202":{"id":"n1202","loc":[-85.619744,41.953192]},"n1203":{"id":"n1203","loc":[-85.619059,41.953902]},"n1204":{"id":"n1204","loc":[-85.623984,41.95469]},"n1205":{"id":"n1205","loc":[-85.630159,41.958208]},"n1206":{"id":"n1206","loc":[-85.63002,41.958208]},"n1207":{"id":"n1207","loc":[-85.630021,41.95814]},"n1208":{"id":"n1208","loc":[-85.63,41.95814]},"n1209":{"id":"n1209","loc":[-85.63,41.958043]},"n121":{"id":"n121","loc":[-85.637633,41.941853]},"n1210":{"id":"n1210","loc":[-85.630159,41.958043]},"n1211":{"id":"n1211","loc":[-85.630304,41.957566]},"n1212":{"id":"n1212","loc":[-85.630303,41.957684]},"n1213":{"id":"n1213","loc":[-85.630073,41.957683]},"n1214":{"id":"n1214","loc":[-85.630072,41.957721]},"n1215":{"id":"n1215","loc":[-85.629993,41.95772]},"n1216":{"id":"n1216","loc":[-85.629993,41.95768]},"n1217":{"id":"n1217","loc":[-85.629968,41.95768]},"n1218":{"id":"n1218","loc":[-85.629969,41.957588]},"n1219":{"id":"n1219","loc":[-85.630219,41.95759]},"n122":{"id":"n122","loc":[-85.637724,41.941853]},"n1220":{"id":"n1220","loc":[-85.630219,41.957566]},"n1221":{"id":"n1221","loc":[-85.630717,41.957744]},"n1222":{"id":"n1222","loc":[-85.630596,41.957745]},"n1223":{"id":"n1223","loc":[-85.630598,41.957553]},"n1224":{"id":"n1224","loc":[-85.630717,41.957555]},"n1225":{"id":"n1225","loc":[-85.630609,41.957745]},"n1226":{"id":"n1226","loc":[-85.63061,41.957789]},"n1227":{"id":"n1227","loc":[-85.630327,41.957791]},"n1228":{"id":"n1228","loc":[-85.630324,41.95752]},"n1229":{"id":"n1229","loc":[-85.630325,41.95756]},"n123":{"id":"n123","loc":[-85.637773,41.941988]},"n1230":{"id":"n1230","loc":[-85.63057,41.95756]},"n1231":{"id":"n1231","loc":[-85.63069,41.958016]},"n1232":{"id":"n1232","loc":[-85.630586,41.958017]},"n1233":{"id":"n1233","loc":[-85.630584,41.957956]},"n1234":{"id":"n1234","loc":[-85.630614,41.957956]},"n1235":{"id":"n1235","loc":[-85.630611,41.957835]},"n1236":{"id":"n1236","loc":[-85.630737,41.957833]},"n1237":{"id":"n1237","loc":[-85.630739,41.957921]},"n1238":{"id":"n1238","loc":[-85.630688,41.957922]},"n1239":{"id":"n1239","loc":[-85.630719,41.958291]},"n124":{"id":"n124","loc":[-85.637773,41.942046]},"n1240":{"id":"n1240","loc":[-85.630592,41.958291]},"n1241":{"id":"n1241","loc":[-85.630593,41.958108]},"n1242":{"id":"n1242","loc":[-85.630701,41.958109]},"n1243":{"id":"n1243","loc":[-85.6307,41.958173]},"n1244":{"id":"n1244","loc":[-85.630711,41.958173]},"n1245":{"id":"n1245","loc":[-85.630711,41.958233]},"n1246":{"id":"n1246","loc":[-85.630719,41.958233]},"n1247":{"id":"n1247","loc":[-85.630523,41.958329]},"n1248":{"id":"n1248","loc":[-85.630388,41.958329]},"n1249":{"id":"n1249","loc":[-85.630387,41.958262]},"n125":{"id":"n125","loc":[-85.637693,41.942047]},"n1250":{"id":"n1250","loc":[-85.630523,41.958261]},"n1251":{"id":"n1251","loc":[-85.63072,41.958636]},"n1252":{"id":"n1252","loc":[-85.630721,41.958709]},"n1253":{"id":"n1253","loc":[-85.630503,41.958712]},"n1254":{"id":"n1254","loc":[-85.630498,41.958511]},"n1255":{"id":"n1255","loc":[-85.630635,41.95851]},"n1256":{"id":"n1256","loc":[-85.630638,41.958636]},"n1257":{"id":"n1257","loc":[-85.630437,41.958822]},"n1258":{"id":"n1258","loc":[-85.630437,41.958849]},"n1259":{"id":"n1259","loc":[-85.630393,41.958849]},"n126":{"id":"n126","loc":[-85.637692,41.941988]},"n1260":{"id":"n1260","loc":[-85.630393,41.958822]},"n1261":{"id":"n1261","loc":[-85.630605,41.959102]},"n1262":{"id":"n1262","loc":[-85.63049,41.959104]},"n1263":{"id":"n1263","loc":[-85.630487,41.958996]},"n1264":{"id":"n1264","loc":[-85.630462,41.958996]},"n1265":{"id":"n1265","loc":[-85.63046,41.958922]},"n1266":{"id":"n1266","loc":[-85.630562,41.958921]},"n1267":{"id":"n1267","loc":[-85.630564,41.958992]},"n1268":{"id":"n1268","loc":[-85.630602,41.958992]},"n1269":{"id":"n1269","loc":[-85.630126,41.957096]},"n127":{"id":"n127","loc":[-85.637604,41.941994]},"n1270":{"id":"n1270","loc":[-85.630129,41.957283]},"n1271":{"id":"n1271","loc":[-85.629993,41.957284]},"n1272":{"id":"n1272","loc":[-85.629992,41.957216]},"n1273":{"id":"n1273","loc":[-85.630015,41.957215]},"n1274":{"id":"n1274","loc":[-85.630013,41.957097]},"n1275":{"id":"n1275","loc":[-85.630211,41.956592]},"n1276":{"id":"n1276","loc":[-85.630211,41.956676]},"n1277":{"id":"n1277","loc":[-85.630162,41.956676]},"n1278":{"id":"n1278","loc":[-85.630162,41.95676]},"n1279":{"id":"n1279","loc":[-85.630037,41.956761]},"n128":{"id":"n128","loc":[-85.637604,41.942057]},"n1280":{"id":"n1280","loc":[-85.630037,41.956592]},"n1281":{"id":"n1281","loc":[-85.630309,41.95653]},"n1282":{"id":"n1282","loc":[-85.630326,41.957065]},"n1283":{"id":"n1283","loc":[-85.630118,41.957065]},"n1284":{"id":"n1284","loc":[-85.630119,41.957096]},"n1285":{"id":"n1285","loc":[-85.63067,41.957307]},"n1286":{"id":"n1286","loc":[-85.630536,41.957308]},"n1287":{"id":"n1287","loc":[-85.630533,41.957111]},"n1288":{"id":"n1288","loc":[-85.630667,41.95711]},"n1289":{"id":"n1289","loc":[-85.630676,41.956808]},"n129":{"id":"n129","loc":[-85.63748,41.942057]},"n1290":{"id":"n1290","loc":[-85.630551,41.956808]},"n1291":{"id":"n1291","loc":[-85.630552,41.956982]},"n1292":{"id":"n1292","loc":[-85.63059,41.956982]},"n1293":{"id":"n1293","loc":[-85.63059,41.957001]},"n1294":{"id":"n1294","loc":[-85.630692,41.957001]},"n1295":{"id":"n1295","loc":[-85.630692,41.956936]},"n1296":{"id":"n1296","loc":[-85.630676,41.956936]},"n1297":{"id":"n1297","loc":[-85.630496,41.956889]},"n1298":{"id":"n1298","loc":[-85.630501,41.956947]},"n1299":{"id":"n1299","loc":[-85.630377,41.956953]},"n13":{"id":"n13","loc":[-85.633643,41.941143]},"n130":{"id":"n130","loc":[-85.63748,41.941994]},"n1300":{"id":"n1300","loc":[-85.630359,41.956938]},"n1301":{"id":"n1301","loc":[-85.630359,41.956912]},"n1302":{"id":"n1302","loc":[-85.63038,41.956894]},"n1303":{"id":"n1303","loc":[-85.630679,41.956747]},"n1304":{"id":"n1304","loc":[-85.630572,41.956748]},"n1305":{"id":"n1305","loc":[-85.63057,41.956668]},"n1306":{"id":"n1306","loc":[-85.630501,41.956669]},"n1307":{"id":"n1307","loc":[-85.630499,41.95659]},"n1308":{"id":"n1308","loc":[-85.630565,41.956589]},"n1309":{"id":"n1309","loc":[-85.630564,41.956541]},"n131":{"id":"n131","loc":[-85.637431,41.941832]},"n1310":{"id":"n1310","loc":[-85.630686,41.956539]},"n1311":{"id":"n1311","loc":[-85.630688,41.956631]},"n1312":{"id":"n1312","loc":[-85.630676,41.956631]},"n1313":{"id":"n1313","loc":[-85.630686,41.956487]},"n1314":{"id":"n1314","loc":[-85.63059,41.956487]},"n1315":{"id":"n1315","loc":[-85.63059,41.956396]},"n1316":{"id":"n1316","loc":[-85.630686,41.956396]},"n1317":{"id":"n1317","loc":[-85.630643,41.9563]},"n1318":{"id":"n1318","loc":[-85.630548,41.956301]},"n1319":{"id":"n1319","loc":[-85.630545,41.956217]},"n132":{"id":"n132","loc":[-85.637432,41.94189]},"n1320":{"id":"n1320","loc":[-85.630529,41.956214]},"n1321":{"id":"n1321","loc":[-85.630521,41.956202]},"n1322":{"id":"n1322","loc":[-85.63052,41.95618]},"n1323":{"id":"n1323","loc":[-85.630527,41.956169]},"n1324":{"id":"n1324","loc":[-85.630544,41.956163]},"n1325":{"id":"n1325","loc":[-85.630543,41.956094]},"n1326":{"id":"n1326","loc":[-85.630641,41.956093]},"n1327":{"id":"n1327","loc":[-85.630642,41.956134]},"n1328":{"id":"n1328","loc":[-85.630656,41.956134]},"n1329":{"id":"n1329","loc":[-85.630657,41.956252]},"n133":{"id":"n133","loc":[-85.637412,41.94189]},"n1330":{"id":"n1330","loc":[-85.630643,41.956252]},"n1331":{"id":"n1331","loc":[-85.630409,41.956044]},"n1332":{"id":"n1332","loc":[-85.630409,41.956075]},"n1333":{"id":"n1333","loc":[-85.630195,41.956078]},"n1334":{"id":"n1334","loc":[-85.630195,41.9561]},"n1335":{"id":"n1335","loc":[-85.630088,41.956101]},"n1336":{"id":"n1336","loc":[-85.630087,41.956048]},"n1337":{"id":"n1337","loc":[-85.630345,41.956114]},"n1338":{"id":"n1338","loc":[-85.630328,41.956113]},"n1339":{"id":"n1339","loc":[-85.63034,41.956189]},"n134":{"id":"n134","loc":[-85.637413,41.941938]},"n1340":{"id":"n1340","loc":[-85.630355,41.956185]},"n1341":{"id":"n1341","loc":[-85.630311,41.956117]},"n1342":{"id":"n1342","loc":[-85.630297,41.956125]},"n1343":{"id":"n1343","loc":[-85.630287,41.956136]},"n1344":{"id":"n1344","loc":[-85.630283,41.956149]},"n1345":{"id":"n1345","loc":[-85.630285,41.956162]},"n1346":{"id":"n1346","loc":[-85.630293,41.956174]},"n1347":{"id":"n1347","loc":[-85.630306,41.956183]},"n1348":{"id":"n1348","loc":[-85.630322,41.956188]},"n1349":{"id":"n1349","loc":[-85.630368,41.956179]},"n135":{"id":"n135","loc":[-85.637342,41.941939]},"n1350":{"id":"n1350","loc":[-85.630378,41.95617]},"n1351":{"id":"n1351","loc":[-85.630384,41.956159]},"n1352":{"id":"n1352","loc":[-85.630385,41.956147]},"n1353":{"id":"n1353","loc":[-85.630381,41.956136]},"n1354":{"id":"n1354","loc":[-85.630372,41.956126]},"n1355":{"id":"n1355","loc":[-85.63036,41.956118]},"n1356":{"id":"n1356","loc":[-85.630776,41.956041]},"n1357":{"id":"n1357","loc":[-85.630195,41.956036]},"n1358":{"id":"n1358","loc":[-85.630137,41.956037]},"n1359":{"id":"n1359","loc":[-85.630136,41.956006]},"n136":{"id":"n136","loc":[-85.637342,41.941914]},"n1360":{"id":"n1360","loc":[-85.630194,41.956005]},"n1361":{"id":"n1361","loc":[-85.629864,41.956039]},"n1362":{"id":"n1362","loc":[-85.629864,41.955862]},"n1363":{"id":"n1363","loc":[-85.629541,41.958291]},"n1364":{"id":"n1364","loc":[-85.629419,41.958292]},"n1365":{"id":"n1365","loc":[-85.629417,41.958168]},"n1366":{"id":"n1366","loc":[-85.629445,41.958168]},"n1367":{"id":"n1367","loc":[-85.629444,41.958109]},"n1368":{"id":"n1368","loc":[-85.629537,41.958108]},"n1369":{"id":"n1369","loc":[-85.629351,41.958136]},"n137":{"id":"n137","loc":[-85.637212,41.941916]},"n1370":{"id":"n1370","loc":[-85.629352,41.958202]},"n1371":{"id":"n1371","loc":[-85.629365,41.958202]},"n1372":{"id":"n1372","loc":[-85.629365,41.958223]},"n1373":{"id":"n1373","loc":[-85.629291,41.958224]},"n1374":{"id":"n1374","loc":[-85.62929,41.958137]},"n1375":{"id":"n1375","loc":[-85.629443,41.958073]},"n1376":{"id":"n1376","loc":[-85.629252,41.958075]},"n1377":{"id":"n1377","loc":[-85.629253,41.95827]},"n1378":{"id":"n1378","loc":[-85.629566,41.957585]},"n1379":{"id":"n1379","loc":[-85.629566,41.957692]},"n138":{"id":"n138","loc":[-85.637211,41.941835]},"n1380":{"id":"n1380","loc":[-85.629281,41.957693]},"n1381":{"id":"n1381","loc":[-85.62928,41.957585]},"n1382":{"id":"n1382","loc":[-85.629004,41.957599]},"n1383":{"id":"n1383","loc":[-85.629004,41.957682]},"n1384":{"id":"n1384","loc":[-85.628902,41.957682]},"n1385":{"id":"n1385","loc":[-85.628902,41.957723]},"n1386":{"id":"n1386","loc":[-85.628731,41.957724]},"n1387":{"id":"n1387","loc":[-85.628731,41.9576]},"n1388":{"id":"n1388","loc":[-85.62836,41.957679]},"n1389":{"id":"n1389","loc":[-85.628359,41.957759]},"n139":{"id":"n139","loc":[-85.637293,41.941834]},"n1390":{"id":"n1390","loc":[-85.628062,41.957757]},"n1391":{"id":"n1391","loc":[-85.628063,41.957657]},"n1392":{"id":"n1392","loc":[-85.628198,41.957657]},"n1393":{"id":"n1393","loc":[-85.628198,41.957678]},"n1394":{"id":"n1394","loc":[-85.627775,41.958095]},"n1395":{"id":"n1395","loc":[-85.627608,41.958095]},"n1396":{"id":"n1396","loc":[-85.627606,41.957829]},"n1397":{"id":"n1397","loc":[-85.627774,41.957829]},"n1398":{"id":"n1398","loc":[-85.626816,41.957636]},"n1399":{"id":"n1399","loc":[-85.626787,41.957681]},"n14":{"id":"n14","loc":[-85.633643,41.940122]},"n140":{"id":"n140","loc":[-85.637293,41.941823]},"n1400":{"id":"n1400","loc":[-85.626673,41.95764]},"n1401":{"id":"n1401","loc":[-85.626703,41.957594]},"n1402":{"id":"n1402","loc":[-85.62694,41.95752]},"n1403":{"id":"n1403","loc":[-85.62688,41.957611]},"n1404":{"id":"n1404","loc":[-85.626798,41.957582]},"n1405":{"id":"n1405","loc":[-85.626793,41.95759]},"n1406":{"id":"n1406","loc":[-85.626657,41.95754]},"n1407":{"id":"n1407","loc":[-85.626666,41.957526]},"n1408":{"id":"n1408","loc":[-85.626584,41.957497]},"n1409":{"id":"n1409","loc":[-85.626638,41.957415]},"n141":{"id":"n141","loc":[-85.637363,41.941822]},"n1410":{"id":"n1410","loc":[-85.626731,41.957449]},"n1411":{"id":"n1411","loc":[-85.626725,41.957457]},"n1412":{"id":"n1412","loc":[-85.626843,41.9575]},"n1413":{"id":"n1413","loc":[-85.626851,41.957487]},"n1414":{"id":"n1414","loc":[-85.626579,41.957521]},"n1415":{"id":"n1415","loc":[-85.626537,41.957587]},"n1416":{"id":"n1416","loc":[-85.626427,41.957551]},"n1417":{"id":"n1417","loc":[-85.626468,41.957483]},"n1418":{"id":"n1418","loc":[-85.626592,41.957639]},"n1419":{"id":"n1419","loc":[-85.626807,41.957713]},"n142":{"id":"n142","loc":[-85.637364,41.941833]},"n1420":{"id":"n1420","loc":[-85.627129,41.957401]},"n1421":{"id":"n1421","loc":[-85.627209,41.95742]},"n1422":{"id":"n1422","loc":[-85.627302,41.957435]},"n1423":{"id":"n1423","loc":[-85.629566,41.957048]},"n1424":{"id":"n1424","loc":[-85.629568,41.957215]},"n1425":{"id":"n1425","loc":[-85.629383,41.957216]},"n1426":{"id":"n1426","loc":[-85.629384,41.95727]},"n1427":{"id":"n1427","loc":[-85.629231,41.957271]},"n1428":{"id":"n1428","loc":[-85.62923,41.957198]},"n1429":{"id":"n1429","loc":[-85.629322,41.957198]},"n143":{"id":"n143","loc":[-85.637559,41.942448]},"n1430":{"id":"n1430","loc":[-85.629321,41.957108]},"n1431":{"id":"n1431","loc":[-85.629441,41.957108]},"n1432":{"id":"n1432","loc":[-85.62944,41.957049]},"n1433":{"id":"n1433","loc":[-85.629337,41.957018]},"n1434":{"id":"n1434","loc":[-85.629366,41.957028]},"n1435":{"id":"n1435","loc":[-85.629375,41.957044]},"n1436":{"id":"n1436","loc":[-85.629354,41.957071]},"n1437":{"id":"n1437","loc":[-85.629317,41.957071]},"n1438":{"id":"n1438","loc":[-85.62929,41.957074]},"n1439":{"id":"n1439","loc":[-85.62927,41.957084]},"n144":{"id":"n144","loc":[-85.637036,41.942454]},"n1440":{"id":"n1440","loc":[-85.629232,41.957081]},"n1441":{"id":"n1441","loc":[-85.629222,41.957057]},"n1442":{"id":"n1442","loc":[-85.629259,41.957025]},"n1443":{"id":"n1443","loc":[-85.629293,41.957017]},"n1444":{"id":"n1444","loc":[-85.629251,41.957085]},"n1445":{"id":"n1445","loc":[-85.629235,41.957041]},"n1446":{"id":"n1446","loc":[-85.62937,41.95706]},"n1447":{"id":"n1447","loc":[-85.629531,41.956909]},"n1448":{"id":"n1448","loc":[-85.629408,41.956909]},"n1449":{"id":"n1449","loc":[-85.629402,41.956681]},"n145":{"id":"n145","loc":[-85.636692,41.942828]},"n1450":{"id":"n1450","loc":[-85.62953,41.956681]},"n1451":{"id":"n1451","loc":[-85.629402,41.956728]},"n1452":{"id":"n1452","loc":[-85.629408,41.956845]},"n1453":{"id":"n1453","loc":[-85.629385,41.956845]},"n1454":{"id":"n1454","loc":[-85.629384,41.956728]},"n1455":{"id":"n1455","loc":[-85.629063,41.956973]},"n1456":{"id":"n1456","loc":[-85.629064,41.957009]},"n1457":{"id":"n1457","loc":[-85.62902,41.957009]},"n1458":{"id":"n1458","loc":[-85.629019,41.956973]},"n1459":{"id":"n1459","loc":[-85.629136,41.956633]},"n146":{"id":"n146","loc":[-85.635929,41.942826]},"n1460":{"id":"n1460","loc":[-85.629084,41.956632]},"n1461":{"id":"n1461","loc":[-85.629084,41.956605]},"n1462":{"id":"n1462","loc":[-85.629136,41.956605]},"n1463":{"id":"n1463","loc":[-85.629153,41.956657]},"n1464":{"id":"n1464","loc":[-85.627914,41.956661]},"n1465":{"id":"n1465","loc":[-85.630096,41.956101]},"n1466":{"id":"n1466","loc":[-85.630097,41.95612]},"n1467":{"id":"n1467","loc":[-85.630011,41.956121]},"n1468":{"id":"n1468","loc":[-85.630015,41.956374]},"n1469":{"id":"n1469","loc":[-85.629148,41.95626]},"n147":{"id":"n147","loc":[-85.636433,41.942828]},"n1470":{"id":"n1470","loc":[-85.629527,41.956591]},"n1471":{"id":"n1471","loc":[-85.629405,41.956591]},"n1472":{"id":"n1472","loc":[-85.629405,41.956459]},"n1473":{"id":"n1473","loc":[-85.629369,41.956459]},"n1474":{"id":"n1474","loc":[-85.629369,41.956424]},"n1475":{"id":"n1475","loc":[-85.629413,41.956424]},"n1476":{"id":"n1476","loc":[-85.629414,41.956326]},"n1477":{"id":"n1477","loc":[-85.629522,41.956326]},"n1478":{"id":"n1478","loc":[-85.629522,41.956487]},"n1479":{"id":"n1479","loc":[-85.629527,41.956487]},"n148":{"id":"n148","loc":[-85.636435,41.942864],"tags":{"entrance":"yes"}},"n1480":{"id":"n1480","loc":[-85.629414,41.95634]},"n1481":{"id":"n1481","loc":[-85.629149,41.956338]},"n1482":{"id":"n1482","loc":[-85.62931,41.956531]},"n1483":{"id":"n1483","loc":[-85.629291,41.95655]},"n1484":{"id":"n1484","loc":[-85.629255,41.95655]},"n1485":{"id":"n1485","loc":[-85.629236,41.956533]},"n1486":{"id":"n1486","loc":[-85.629237,41.956461]},"n1487":{"id":"n1487","loc":[-85.629257,41.956445]},"n1488":{"id":"n1488","loc":[-85.629257,41.956428]},"n1489":{"id":"n1489","loc":[-85.629287,41.956428]},"n149":{"id":"n149","loc":[-85.637235,41.942622]},"n1490":{"id":"n1490","loc":[-85.629287,41.956445]},"n1491":{"id":"n1491","loc":[-85.62931,41.95646]},"n1492":{"id":"n1492","loc":[-85.629049,41.956425]},"n1493":{"id":"n1493","loc":[-85.628907,41.956427]},"n1494":{"id":"n1494","loc":[-85.628907,41.956455]},"n1495":{"id":"n1495","loc":[-85.628841,41.956455]},"n1496":{"id":"n1496","loc":[-85.62884,41.956424]},"n1497":{"id":"n1497","loc":[-85.628764,41.956425]},"n1498":{"id":"n1498","loc":[-85.628762,41.956323]},"n1499":{"id":"n1499","loc":[-85.628808,41.956323]},"n15":{"id":"n15","loc":[-85.633477,41.940187]},"n150":{"id":"n150","loc":[-85.637247,41.943116]},"n1500":{"id":"n1500","loc":[-85.628808,41.956314]},"n1501":{"id":"n1501","loc":[-85.628911,41.956313]},"n1502":{"id":"n1502","loc":[-85.628911,41.956322]},"n1503":{"id":"n1503","loc":[-85.62896,41.956322]},"n1504":{"id":"n1504","loc":[-85.62896,41.956348]},"n1505":{"id":"n1505","loc":[-85.629047,41.956347]},"n1506":{"id":"n1506","loc":[-85.628893,41.957263]},"n1507":{"id":"n1507","loc":[-85.628788,41.957264]},"n1508":{"id":"n1508","loc":[-85.628786,41.95711]},"n1509":{"id":"n1509","loc":[-85.628894,41.957109]},"n151":{"id":"n151","loc":[-85.637564,41.943116]},"n1510":{"id":"n1510","loc":[-85.628893,41.957075]},"n1511":{"id":"n1511","loc":[-85.628965,41.957075]},"n1512":{"id":"n1512","loc":[-85.628965,41.957111]},"n1513":{"id":"n1513","loc":[-85.629035,41.95711]},"n1514":{"id":"n1514","loc":[-85.629036,41.957209]},"n1515":{"id":"n1515","loc":[-85.628893,41.95721]},"n1516":{"id":"n1516","loc":[-85.631348,41.95773]},"n1517":{"id":"n1517","loc":[-85.631101,41.957732]},"n1518":{"id":"n1518","loc":[-85.631099,41.957558]},"n1519":{"id":"n1519","loc":[-85.63123,41.957557]},"n152":{"id":"n152","loc":[-85.637552,41.942619]},"n1520":{"id":"n1520","loc":[-85.631231,41.957618]},"n1521":{"id":"n1521","loc":[-85.63129,41.957618]},"n1522":{"id":"n1522","loc":[-85.63129,41.957651]},"n1523":{"id":"n1523","loc":[-85.631346,41.957651]},"n1524":{"id":"n1524","loc":[-85.631366,41.95802]},"n1525":{"id":"n1525","loc":[-85.631141,41.958021]},"n1526":{"id":"n1526","loc":[-85.63114,41.957943]},"n1527":{"id":"n1527","loc":[-85.631167,41.957943]},"n1528":{"id":"n1528","loc":[-85.631166,41.957808]},"n1529":{"id":"n1529","loc":[-85.631301,41.957807]},"n153":{"id":"n153","loc":[-85.63763,41.942528]},"n1530":{"id":"n1530","loc":[-85.631302,41.95789]},"n1531":{"id":"n1531","loc":[-85.631364,41.95789]},"n1532":{"id":"n1532","loc":[-85.631539,41.957754]},"n1533":{"id":"n1533","loc":[-85.631069,41.957756]},"n1534":{"id":"n1534","loc":[-85.631536,41.957518]},"n1535":{"id":"n1535","loc":[-85.631543,41.957995]},"n1536":{"id":"n1536","loc":[-85.631531,41.957748]},"n1537":{"id":"n1537","loc":[-85.631485,41.957748]},"n1538":{"id":"n1538","loc":[-85.631484,41.957698]},"n1539":{"id":"n1539","loc":[-85.631531,41.957698]},"n154":{"id":"n154","loc":[-85.637151,41.94253]},"n1540":{"id":"n1540","loc":[-85.631586,41.957742]},"n1541":{"id":"n1541","loc":[-85.63155,41.957742]},"n1542":{"id":"n1542","loc":[-85.631551,41.957702]},"n1543":{"id":"n1543","loc":[-85.631587,41.957702]},"n1544":{"id":"n1544","loc":[-85.631534,41.95807]},"n1545":{"id":"n1545","loc":[-85.631534,41.958097]},"n1546":{"id":"n1546","loc":[-85.631491,41.958097]},"n1547":{"id":"n1547","loc":[-85.631491,41.95807]},"n1548":{"id":"n1548","loc":[-85.631304,41.958861]},"n1549":{"id":"n1549","loc":[-85.631186,41.958862]},"n155":{"id":"n155","loc":[-85.63715,41.942424]},"n1550":{"id":"n1550","loc":[-85.631182,41.958653]},"n1551":{"id":"n1551","loc":[-85.6313,41.958651]},"n1552":{"id":"n1552","loc":[-85.631293,41.95854]},"n1553":{"id":"n1553","loc":[-85.631176,41.958539]},"n1554":{"id":"n1554","loc":[-85.631176,41.958377]},"n1555":{"id":"n1555","loc":[-85.631297,41.958377]},"n1556":{"id":"n1556","loc":[-85.631297,41.958422]},"n1557":{"id":"n1557","loc":[-85.631333,41.958422]},"n1558":{"id":"n1558","loc":[-85.631333,41.958479]},"n1559":{"id":"n1559","loc":[-85.631293,41.958479]},"n156":{"id":"n156","loc":[-85.637629,41.942422]},"n1560":{"id":"n1560","loc":[-85.631951,41.958908]},"n1561":{"id":"n1561","loc":[-85.631838,41.958909]},"n1562":{"id":"n1562","loc":[-85.631837,41.958847]},"n1563":{"id":"n1563","loc":[-85.631859,41.958847]},"n1564":{"id":"n1564","loc":[-85.631858,41.958746]},"n1565":{"id":"n1565","loc":[-85.631961,41.958745]},"n1566":{"id":"n1566","loc":[-85.631962,41.958812]},"n1567":{"id":"n1567","loc":[-85.631949,41.958813]},"n1568":{"id":"n1568","loc":[-85.631579,41.958913]},"n1569":{"id":"n1569","loc":[-85.631567,41.95864]},"n157":{"id":"n157","loc":[-85.638232,41.942477]},"n1570":{"id":"n1570","loc":[-85.631942,41.958639]},"n1571":{"id":"n1571","loc":[-85.631543,41.958594]},"n1572":{"id":"n1572","loc":[-85.631543,41.958065]},"n1573":{"id":"n1573","loc":[-85.631888,41.958546]},"n1574":{"id":"n1574","loc":[-85.631804,41.958546]},"n1575":{"id":"n1575","loc":[-85.631803,41.95841]},"n1576":{"id":"n1576","loc":[-85.631886,41.958409]},"n1577":{"id":"n1577","loc":[-85.631897,41.958125]},"n1578":{"id":"n1578","loc":[-85.631755,41.958126]},"n1579":{"id":"n1579","loc":[-85.631756,41.958174]},"n158":{"id":"n158","loc":[-85.637775,41.942483]},"n1580":{"id":"n1580","loc":[-85.63178,41.958174]},"n1581":{"id":"n1581","loc":[-85.631782,41.958272]},"n1582":{"id":"n1582","loc":[-85.631922,41.958271]},"n1583":{"id":"n1583","loc":[-85.631922,41.958244]},"n1584":{"id":"n1584","loc":[-85.631883,41.958245]},"n1585":{"id":"n1585","loc":[-85.631882,41.958175]},"n1586":{"id":"n1586","loc":[-85.631898,41.958175]},"n1587":{"id":"n1587","loc":[-85.631924,41.958032]},"n1588":{"id":"n1588","loc":[-85.631762,41.958032]},"n1589":{"id":"n1589","loc":[-85.63176,41.957827]},"n159":{"id":"n159","loc":[-85.638107,41.942512]},"n1590":{"id":"n1590","loc":[-85.631888,41.957826]},"n1591":{"id":"n1591","loc":[-85.631888,41.957892]},"n1592":{"id":"n1592","loc":[-85.631871,41.957892]},"n1593":{"id":"n1593","loc":[-85.631872,41.957949]},"n1594":{"id":"n1594","loc":[-85.631923,41.957949]},"n1595":{"id":"n1595","loc":[-85.631695,41.95795]},"n1596":{"id":"n1596","loc":[-85.631666,41.957975]},"n1597":{"id":"n1597","loc":[-85.63163,41.957975]},"n1598":{"id":"n1598","loc":[-85.6316,41.957951]},"n1599":{"id":"n1599","loc":[-85.6316,41.95785]},"n16":{"id":"n16","loc":[-85.63341,41.94032]},"n160":{"id":"n160","loc":[-85.637763,41.942514]},"n1600":{"id":"n1600","loc":[-85.63166,41.95785]},"n1601":{"id":"n1601","loc":[-85.631696,41.957873]},"n1602":{"id":"n1602","loc":[-85.631924,41.957762]},"n1603":{"id":"n1603","loc":[-85.631762,41.957762]},"n1604":{"id":"n1604","loc":[-85.631762,41.957708]},"n1605":{"id":"n1605","loc":[-85.631785,41.957708]},"n1606":{"id":"n1606","loc":[-85.631785,41.957606]},"n1607":{"id":"n1607","loc":[-85.631734,41.957606]},"n1608":{"id":"n1608","loc":[-85.631734,41.957538]},"n1609":{"id":"n1609","loc":[-85.631821,41.957538]},"n161":{"id":"n161","loc":[-85.637763,41.942445]},"n1610":{"id":"n1610","loc":[-85.631935,41.957545]},"n1611":{"id":"n1611","loc":[-85.631821,41.957544]},"n1612":{"id":"n1612","loc":[-85.631935,41.957645]},"n1613":{"id":"n1613","loc":[-85.631924,41.957645]},"n1614":{"id":"n1614","loc":[-85.627135,41.953828]},"n1615":{"id":"n1615","loc":[-85.633517,41.941353],"tags":{"man_made":"lighthouse"}},"n1616":{"id":"n1616","loc":[-85.633659,41.942041],"tags":{"amenity":"bbq"}},"n1617":{"id":"n1617","loc":[-85.63662,41.942911],"tags":{"amenity":"toilets"}},"n1618":{"id":"n1618","loc":[-85.637487,41.943876],"tags":{"amenity":"toilets"}},"n1619":{"id":"n1619","loc":[-85.634938,41.941917],"tags":{"amenity":"toilets"}},"n162":{"id":"n162","loc":[-85.638107,41.942443]},"n1620":{"id":"n1620","loc":[-85.632427,41.941678],"tags":{"amenity":"bbq"}},"n1621":{"id":"n1621","loc":[-85.638033,41.944568],"tags":{"amenity":"bbq"}},"n1622":{"id":"n1622","loc":[-85.638052,41.944522],"tags":{"amenity":"bbq"}},"n1623":{"id":"n1623","loc":[-85.635001,41.941965]},"n1624":{"id":"n1624","loc":[-85.634635,41.941884]},"n1625":{"id":"n1625","loc":[-85.634667,41.941894]},"n1626":{"id":"n1626","loc":[-85.634791,41.942011]},"n1627":{"id":"n1627","loc":[-85.634749,41.941938]},"n1628":{"id":"n1628","loc":[-85.627295,41.953946],"tags":{"barrier":"gate"}},"n1629":{"id":"n1629","loc":[-85.629076,41.954689]},"n163":{"id":"n163","loc":[-85.638813,41.942475]},"n1630":{"id":"n1630","loc":[-85.640667,41.942595]},"n1631":{"id":"n1631","loc":[-85.639455,41.94261]},"n1632":{"id":"n1632","loc":[-85.643407,41.942336]},"n1633":{"id":"n1633","loc":[-85.641845,41.941316]},"n1634":{"id":"n1634","loc":[-85.643322,41.942224]},"n1635":{"id":"n1635","loc":[-85.643301,41.942124]},"n1636":{"id":"n1636","loc":[-85.640639,41.941326]},"n1637":{"id":"n1637","loc":[-85.640614,41.940058]},"n1638":{"id":"n1638","loc":[-85.639428,41.941335]},"n1639":{"id":"n1639","loc":[-85.643078,41.941293]},"n164":{"id":"n164","loc":[-85.63883,41.942422]},"n1640":{"id":"n1640","loc":[-85.64371,41.942302]},"n1641":{"id":"n1641","loc":[-85.643056,41.94001]},"n1642":{"id":"n1642","loc":[-85.643097,41.942575],"tags":{"highway":"traffic_signals","traffic_signals":"signal","traffic_signals:direction":"both"}},"n1643":{"id":"n1643","loc":[-85.641855,41.942586]},"n1644":{"id":"n1644","loc":[-85.643549,41.942209]},"n1645":{"id":"n1645","loc":[-85.639359,41.94007]},"n1646":{"id":"n1646","loc":[-85.642797,41.940522]},"n1647":{"id":"n1647","loc":[-85.642589,41.940523]},"n1648":{"id":"n1648","loc":[-85.642587,41.940287]},"n1649":{"id":"n1649","loc":[-85.642797,41.940286]},"n165":{"id":"n165","loc":[-85.63883,41.942508]},"n1650":{"id":"n1650","loc":[-85.642571,41.940523]},"n1651":{"id":"n1651","loc":[-85.642568,41.940286]},"n1652":{"id":"n1652","loc":[-85.642316,41.940289]},"n1653":{"id":"n1653","loc":[-85.642321,41.940436]},"n1654":{"id":"n1654","loc":[-85.642292,41.940458]},"n1655":{"id":"n1655","loc":[-85.642287,41.940483]},"n1656":{"id":"n1656","loc":[-85.642323,41.940509]},"n1657":{"id":"n1657","loc":[-85.642385,41.940511]},"n1658":{"id":"n1658","loc":[-85.642408,41.940526]},"n1659":{"id":"n1659","loc":[-85.641962,41.94109]},"n166":{"id":"n166","loc":[-85.638364,41.942508]},"n1660":{"id":"n1660","loc":[-85.642753,41.941084]},"n1661":{"id":"n1661","loc":[-85.642752,41.941004]},"n1662":{"id":"n1662","loc":[-85.642806,41.941003]},"n1663":{"id":"n1663","loc":[-85.642803,41.940731]},"n1664":{"id":"n1664","loc":[-85.642741,41.940732]},"n1665":{"id":"n1665","loc":[-85.64274,41.940645]},"n1666":{"id":"n1666","loc":[-85.641957,41.940651]},"n1667":{"id":"n1667","loc":[-85.642937,41.941241]},"n1668":{"id":"n1668","loc":[-85.641776,41.941253]},"n1669":{"id":"n1669","loc":[-85.641766,41.940598]},"n167":{"id":"n167","loc":[-85.638836,41.942167]},"n1670":{"id":"n1670","loc":[-85.64198,41.940598]},"n1671":{"id":"n1671","loc":[-85.641961,41.940137]},"n1672":{"id":"n1672","loc":[-85.642934,41.94012]},"n1673":{"id":"n1673","loc":[-85.643074,41.941173]},"n1674":{"id":"n1674","loc":[-85.642841,41.940997]},"n1675":{"id":"n1675","loc":[-85.642839,41.940721]},"n1676":{"id":"n1676","loc":[-85.643065,41.940552]},"n1677":{"id":"n1677","loc":[-85.642732,41.94124]},"n1678":{"id":"n1678","loc":[-85.641815,41.941246]},"n1679":{"id":"n1679","loc":[-85.641813,41.941132]},"n168":{"id":"n168","loc":[-85.638836,41.94229]},"n1680":{"id":"n1680","loc":[-85.641839,41.941111]},"n1681":{"id":"n1681","loc":[-85.641884,41.941098]},"n1682":{"id":"n1682","loc":[-85.642732,41.941092]},"n1683":{"id":"n1683","loc":[-85.642776,41.941302]},"n1684":{"id":"n1684","loc":[-85.632788,41.946236]},"n1685":{"id":"n1685","loc":[-85.622342,41.953127]},"n1686":{"id":"n1686","loc":[-85.641848,41.941167]},"n1687":{"id":"n1687","loc":[-85.643753,41.941503]},"n1688":{"id":"n1688","loc":[-85.643762,41.942119]},"n1689":{"id":"n1689","loc":[-85.64238,41.942262]},"n169":{"id":"n169","loc":[-85.638594,41.94229]},"n1690":{"id":"n1690","loc":[-85.642374,41.941944]},"n1691":{"id":"n1691","loc":[-85.642518,41.941943]},"n1692":{"id":"n1692","loc":[-85.642519,41.94198]},"n1693":{"id":"n1693","loc":[-85.642831,41.941977]},"n1694":{"id":"n1694","loc":[-85.642837,41.942312]},"n1695":{"id":"n1695","loc":[-85.642495,41.942315]},"n1696":{"id":"n1696","loc":[-85.642494,41.942261]},"n1697":{"id":"n1697","loc":[-85.641087,41.942433]},"n1698":{"id":"n1698","loc":[-85.641081,41.942006]},"n1699":{"id":"n1699","loc":[-85.641244,41.942005]},"n17":{"id":"n17","loc":[-85.633478,41.94081]},"n170":{"id":"n170","loc":[-85.638594,41.942422]},"n1700":{"id":"n1700","loc":[-85.64125,41.942431]},"n1701":{"id":"n1701","loc":[-85.641331,41.942968]},"n1702":{"id":"n1702","loc":[-85.641328,41.942713]},"n1703":{"id":"n1703","loc":[-85.641521,41.942712]},"n1704":{"id":"n1704","loc":[-85.641523,41.942924]},"n1705":{"id":"n1705","loc":[-85.641504,41.942924]},"n1706":{"id":"n1706","loc":[-85.641505,41.942967]},"n1707":{"id":"n1707","loc":[-85.638612,41.942408]},"n1708":{"id":"n1708","loc":[-85.638612,41.942327]},"n1709":{"id":"n1709","loc":[-85.638775,41.942327]},"n171":{"id":"n171","loc":[-85.638364,41.942356]},"n1710":{"id":"n1710","loc":[-85.638775,41.942299]},"n1711":{"id":"n1711","loc":[-85.638835,41.942298]},"n1712":{"id":"n1712","loc":[-85.638835,41.942407]},"n1713":{"id":"n1713","loc":[-85.639116,41.942444]},"n1714":{"id":"n1714","loc":[-85.639114,41.942362]},"n1715":{"id":"n1715","loc":[-85.639294,41.94236]},"n1716":{"id":"n1716","loc":[-85.639296,41.942442]},"n1717":{"id":"n1717","loc":[-85.639808,41.942385]},"n1718":{"id":"n1718","loc":[-85.639805,41.942285]},"n1719":{"id":"n1719","loc":[-85.639988,41.942283]},"n172":{"id":"n172","loc":[-85.638364,41.942167]},"n1720":{"id":"n1720","loc":[-85.63999,41.942383]},"n1721":{"id":"n1721","loc":[-85.639633,41.943023]},"n1722":{"id":"n1722","loc":[-85.639867,41.943019]},"n1723":{"id":"n1723","loc":[-85.639866,41.942964]},"n1724":{"id":"n1724","loc":[-85.639888,41.942963]},"n1725":{"id":"n1725","loc":[-85.639883,41.942779]},"n1726":{"id":"n1726","loc":[-85.639851,41.94278]},"n1727":{"id":"n1727","loc":[-85.63985,41.94274]},"n1728":{"id":"n1728","loc":[-85.639789,41.942741]},"n1729":{"id":"n1729","loc":[-85.639789,41.942753]},"n173":{"id":"n173","loc":[-85.639038,41.942463]},"n1730":{"id":"n1730","loc":[-85.639698,41.942754]},"n1731":{"id":"n1731","loc":[-85.639699,41.942788]},"n1732":{"id":"n1732","loc":[-85.639675,41.942789]},"n1733":{"id":"n1733","loc":[-85.639676,41.94283]},"n1734":{"id":"n1734","loc":[-85.639701,41.942829]},"n1735":{"id":"n1735","loc":[-85.639702,41.942869]},"n1736":{"id":"n1736","loc":[-85.639629,41.94287]},"n1737":{"id":"n1737","loc":[-85.643568,41.942946]},"n1738":{"id":"n1738","loc":[-85.643568,41.942777]},"n1739":{"id":"n1739","loc":[-85.643401,41.942777]},"n174":{"id":"n174","loc":[-85.638897,41.942464]},"n1740":{"id":"n1740","loc":[-85.643401,41.942863]},"n1741":{"id":"n1741","loc":[-85.643448,41.942863]},"n1742":{"id":"n1742","loc":[-85.643448,41.942946]},"n1743":{"id":"n1743","loc":[-85.642836,41.942981]},"n1744":{"id":"n1744","loc":[-85.642917,41.942979]},"n1745":{"id":"n1745","loc":[-85.642914,41.942904]},"n1746":{"id":"n1746","loc":[-85.642938,41.942903]},"n1747":{"id":"n1747","loc":[-85.642935,41.942813]},"n1748":{"id":"n1748","loc":[-85.642775,41.942816]},"n1749":{"id":"n1749","loc":[-85.642778,41.942906]},"n175":{"id":"n175","loc":[-85.638897,41.942423]},"n1750":{"id":"n1750","loc":[-85.642833,41.942905]},"n1751":{"id":"n1751","loc":[-85.642302,41.942886]},"n1752":{"id":"n1752","loc":[-85.642299,41.942721]},"n1753":{"id":"n1753","loc":[-85.642422,41.94272]},"n1754":{"id":"n1754","loc":[-85.642425,41.942868]},"n1755":{"id":"n1755","loc":[-85.642385,41.942869]},"n1756":{"id":"n1756","loc":[-85.642385,41.942885]},"n1757":{"id":"n1757","loc":[-85.641533,41.942939]},"n1758":{"id":"n1758","loc":[-85.64161,41.942877]},"n1759":{"id":"n1759","loc":[-85.641676,41.942922]},"n176":{"id":"n176","loc":[-85.638853,41.942423]},"n1760":{"id":"n1760","loc":[-85.6416,41.942985]},"n1761":{"id":"n1761","loc":[-85.64206,41.942802]},"n1762":{"id":"n1762","loc":[-85.642059,41.942741]},"n1763":{"id":"n1763","loc":[-85.642196,41.942741]},"n1764":{"id":"n1764","loc":[-85.642196,41.942818]},"n1765":{"id":"n1765","loc":[-85.642128,41.942819]},"n1766":{"id":"n1766","loc":[-85.642128,41.942801]},"n1767":{"id":"n1767","loc":[-85.640943,41.942934]},"n1768":{"id":"n1768","loc":[-85.641035,41.942933]},"n1769":{"id":"n1769","loc":[-85.641032,41.942797]},"n177":{"id":"n177","loc":[-85.638852,41.94237]},"n1770":{"id":"n1770","loc":[-85.640997,41.942798]},"n1771":{"id":"n1771","loc":[-85.640996,41.942764]},"n1772":{"id":"n1772","loc":[-85.640861,41.942766]},"n1773":{"id":"n1773","loc":[-85.640862,41.942848]},"n1774":{"id":"n1774","loc":[-85.640941,41.942847]},"n1775":{"id":"n1775","loc":[-85.643766,41.942226]},"n1776":{"id":"n1776","loc":[-85.643768,41.942407]},"n1777":{"id":"n1777","loc":[-85.643218,41.94177]},"n1778":{"id":"n1778","loc":[-85.64321,41.941327]},"n1779":{"id":"n1779","loc":[-85.643649,41.941323]},"n178":{"id":"n178","loc":[-85.638892,41.94237]},"n1780":{"id":"n1780","loc":[-85.643656,41.941716]},"n1781":{"id":"n1781","loc":[-85.64358,41.941717]},"n1782":{"id":"n1782","loc":[-85.64358,41.941767]},"n1783":{"id":"n1783","loc":[-85.64382,41.941495]},"n1784":{"id":"n1784","loc":[-85.643817,41.941317]},"n1785":{"id":"n1785","loc":[-85.643235,41.941833]},"n1786":{"id":"n1786","loc":[-85.64335,41.941842]},"n1787":{"id":"n1787","loc":[-85.643504,41.941903]},"n1788":{"id":"n1788","loc":[-85.643554,41.941946]},"n1789":{"id":"n1789","loc":[-85.643618,41.942015]},"n179":{"id":"n179","loc":[-85.638891,41.942334]},"n1790":{"id":"n1790","loc":[-85.64346,41.941971]},"n1791":{"id":"n1791","loc":[-85.643528,41.942468]},"n1792":{"id":"n1792","loc":[-85.643621,41.942363]},"n1793":{"id":"n1793","loc":[-85.643496,41.942297]},"n1794":{"id":"n1794","loc":[-85.643446,41.942246]},"n1795":{"id":"n1795","loc":[-85.643398,41.942177]},"n1796":{"id":"n1796","loc":[-85.643398,41.942031]},"n1797":{"id":"n1797","loc":[-85.621531,41.952693]},"n1798":{"id":"n1798","loc":[-85.643221,41.942028]},"n1799":{"id":"n1799","loc":[-85.643225,41.942276]},"n18":{"id":"n18","loc":[-85.63345,41.94071]},"n180":{"id":"n180","loc":[-85.639037,41.942334]},"n1800":{"id":"n1800","loc":[-85.643265,41.942347]},"n1801":{"id":"n1801","loc":[-85.643323,41.942413]},"n1802":{"id":"n1802","loc":[-85.643411,41.94247]},"n1803":{"id":"n1803","loc":[-85.643459,41.942435]},"n1804":{"id":"n1804","loc":[-85.643767,41.942307]},"n1805":{"id":"n1805","loc":[-85.643661,41.942293]},"n1806":{"id":"n1806","loc":[-85.643578,41.942247]},"n1807":{"id":"n1807","loc":[-85.643522,41.942125]},"n1808":{"id":"n1808","loc":[-85.643515,41.942061]},"n1809":{"id":"n1809","loc":[-85.643346,41.941924]},"n181":{"id":"n181","loc":[-85.638074,41.941839]},"n1810":{"id":"n1810","loc":[-85.643086,41.94192]},"n1811":{"id":"n1811","loc":[-85.643529,41.94217]},"n1812":{"id":"n1812","loc":[-85.643489,41.942003]},"n1813":{"id":"n1813","loc":[-85.643295,41.941919]},"n1814":{"id":"n1814","loc":[-85.643305,41.942163]},"n1815":{"id":"n1815","loc":[-85.643354,41.942285]},"n1816":{"id":"n1816","loc":[-85.643472,41.942389]},"n1817":{"id":"n1817","loc":[-85.643608,41.942271]},"n1818":{"id":"n1818","loc":[-85.643876,41.941402]},"n1819":{"id":"n1819","loc":[-85.643818,41.941369]},"n182":{"id":"n182","loc":[-85.638076,41.941942]},"n1820":{"id":"n1820","loc":[-85.643682,41.941304]},"n1821":{"id":"n1821","loc":[-85.64359,41.941286]},"n1822":{"id":"n1822","loc":[-85.643317,41.941727]},"n1823":{"id":"n1823","loc":[-85.643301,41.941286]},"n1824":{"id":"n1824","loc":[-85.643553,41.941698]},"n1825":{"id":"n1825","loc":[-85.643543,41.941286]},"n1826":{"id":"n1826","loc":[-85.636967,41.940118]},"n1827":{"id":"n1827","loc":[-85.63378,41.940114]},"n1828":{"id":"n1828","loc":[-85.637254,41.940075]},"n1829":{"id":"n1829","loc":[-85.637002,41.941355]},"n183":{"id":"n183","loc":[-85.637955,41.941944]},"n1830":{"id":"n1830","loc":[-85.643532,41.94204]},"n1831":{"id":"n1831","loc":[-85.638235,41.942615]},"n1832":{"id":"n1832","loc":[-85.637039,41.942624]},"n1833":{"id":"n1833","loc":[-85.636369,41.94266]},"n1834":{"id":"n1834","loc":[-85.63582,41.942771],"tags":{"highway":"traffic_signals","traffic_signals":"emergency","traffic_signals:direction":"both"}},"n1835":{"id":"n1835","loc":[-85.634873,41.943044]},"n1836":{"id":"n1836","loc":[-85.643482,41.941976]},"n1837":{"id":"n1837","loc":[-85.64345,41.941945]},"n1838":{"id":"n1838","loc":[-85.641885,41.943851]},"n1839":{"id":"n1839","loc":[-85.641915,41.945121]},"n184":{"id":"n184","loc":[-85.637953,41.94184]},"n1840":{"id":"n1840","loc":[-85.639454,41.943871]},"n1841":{"id":"n1841","loc":[-85.639491,41.945191]},"n1842":{"id":"n1842","loc":[-85.635768,41.940113]},"n1843":{"id":"n1843","loc":[-85.638206,41.941345]},"n1844":{"id":"n1844","loc":[-85.640721,41.94513]},"n1845":{"id":"n1845","loc":[-85.643137,41.945103]},"n1846":{"id":"n1846","loc":[-85.638199,41.940079]},"n1847":{"id":"n1847","loc":[-85.640688,41.943861]},"n1848":{"id":"n1848","loc":[-85.643397,41.941924]},"n1849":{"id":"n1849","loc":[-85.643117,41.943841]},"n185":{"id":"n185","loc":[-85.637953,41.941866]},"n1850":{"id":"n1850","loc":[-85.636731,41.94263]},"n1851":{"id":"n1851","loc":[-85.63518,41.942955],"tags":{"highway":"crossing"}},"n1852":{"id":"n1852","loc":[-85.636152,41.942695]},"n1853":{"id":"n1853","loc":[-85.644202,41.941499]},"n1854":{"id":"n1854","loc":[-85.644211,41.942116]},"n1855":{"id":"n1855","loc":[-85.644233,41.942404]},"n1856":{"id":"n1856","loc":[-85.644231,41.942223]},"n1857":{"id":"n1857","loc":[-85.644133,41.941315]},"n1858":{"id":"n1858","loc":[-85.644136,41.941493]},"n1859":{"id":"n1859","loc":[-85.644345,41.942307]},"n186":{"id":"n186","loc":[-85.637873,41.941867]},"n1860":{"id":"n1860","loc":[-85.644232,41.942304]},"n1861":{"id":"n1861","loc":[-85.644134,41.941403]},"n1862":{"id":"n1862","loc":[-85.63607,41.943005],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"fire_station","name":"Three Rivers Fire Department"}},"n1863":{"id":"n1863","loc":[-85.637,41.941236]},"n1864":{"id":"n1864","loc":[-85.634476,41.941475]},"n1865":{"id":"n1865","loc":[-85.635036,41.941858]},"n1866":{"id":"n1866","loc":[-85.635362,41.941962]},"n1867":{"id":"n1867","loc":[-85.635796,41.941962]},"n1868":{"id":"n1868","loc":[-85.63295,41.943006]},"n1869":{"id":"n1869","loc":[-85.634692,41.943098]},"n187":{"id":"n187","loc":[-85.637877,41.941975]},"n1870":{"id":"n1870","loc":[-85.633128,41.940484]},"n1871":{"id":"n1871","loc":[-85.633117,41.942798]},"n1872":{"id":"n1872","loc":[-85.633303,41.942412]},"n1873":{"id":"n1873","loc":[-85.633482,41.941912]},"n1874":{"id":"n1874","loc":[-85.633455,41.941359]},"n1875":{"id":"n1875","loc":[-85.633162,41.942679]},"n1876":{"id":"n1876","loc":[-85.634274,41.943479]},"n1877":{"id":"n1877","loc":[-85.634678,41.942909]},"n1878":{"id":"n1878","loc":[-85.6339,41.941453]},"n1879":{"id":"n1879","loc":[-85.634571,41.942774]},"n188":{"id":"n188","loc":[-85.636855,41.942488]},"n1880":{"id":"n1880","loc":[-85.63419,41.941732]},"n1881":{"id":"n1881","loc":[-85.634067,41.941565]},"n1882":{"id":"n1882","loc":[-85.63436,41.942358]},"n1883":{"id":"n1883","loc":[-85.634327,41.942247]},"n1884":{"id":"n1884","loc":[-85.633391,41.941231]},"n1885":{"id":"n1885","loc":[-85.634303,41.941972]},"n1886":{"id":"n1886","loc":[-85.633541,41.940147]},"n1887":{"id":"n1887","loc":[-85.633433,41.940252]},"n1888":{"id":"n1888","loc":[-85.633402,41.940411]},"n1889":{"id":"n1889","loc":[-85.633551,41.941023]},"n189":{"id":"n189","loc":[-85.636702,41.942488]},"n1890":{"id":"n1890","loc":[-85.633719,41.941186]},"n1891":{"id":"n1891","loc":[-85.633067,41.941845]},"n1892":{"id":"n1892","loc":[-85.634902,41.942766]},"n1893":{"id":"n1893","loc":[-85.634603,41.942202]},"n1894":{"id":"n1894","loc":[-85.634858,41.942152]},"n1895":{"id":"n1895","loc":[-85.634842,41.942269]},"n1896":{"id":"n1896","loc":[-85.634907,41.942313]},"n1897":{"id":"n1897","loc":[-85.635049,41.942331]},"n1898":{"id":"n1898","loc":[-85.635101,41.942281]},"n1899":{"id":"n1899","loc":[-85.635129,41.942144]},"n19":{"id":"n19","loc":[-85.633009,41.942229]},"n190":{"id":"n190","loc":[-85.636702,41.942434]},"n1900":{"id":"n1900","loc":[-85.635531,41.942143]},"n1901":{"id":"n1901","loc":[-85.635534,41.942577]},"n1902":{"id":"n1902","loc":[-85.635158,41.942656]},"n1903":{"id":"n1903","loc":[-85.635121,41.942703]},"n1904":{"id":"n1904","loc":[-85.635087,41.941508]},"n1905":{"id":"n1905","loc":[-85.63536,41.941106]},"n1906":{"id":"n1906","loc":[-85.635442,41.941094]},"n1907":{"id":"n1907","loc":[-85.635508,41.941104]},"n1908":{"id":"n1908","loc":[-85.635569,41.941125]},"n1909":{"id":"n1909","loc":[-85.635583,41.941106]},"n191":{"id":"n191","loc":[-85.636761,41.942434]},"n1910":{"id":"n1910","loc":[-85.635555,41.940976]},"n1911":{"id":"n1911","loc":[-85.635501,41.940915]},"n1912":{"id":"n1912","loc":[-85.635392,41.940922]},"n1913":{"id":"n1913","loc":[-85.635276,41.940974]},"n1914":{"id":"n1914","loc":[-85.63517,41.941204]},"n1915":{"id":"n1915","loc":[-85.634888,41.941517]},"n1916":{"id":"n1916","loc":[-85.634897,41.941576]},"n1917":{"id":"n1917","loc":[-85.634961,41.94164]},"n1918":{"id":"n1918","loc":[-85.635028,41.941659]},"n1919":{"id":"n1919","loc":[-85.635118,41.941621]},"n192":{"id":"n192","loc":[-85.636761,41.942369]},"n1920":{"id":"n1920","loc":[-85.635085,41.941558]},"n1921":{"id":"n1921","loc":[-85.63504,41.94136]},"n1922":{"id":"n1922","loc":[-85.635221,41.941077]},"n1923":{"id":"n1923","loc":[-85.634387,41.941559]},"n1924":{"id":"n1924","loc":[-85.634351,41.941587]},"n1925":{"id":"n1925","loc":[-85.634416,41.941756]},"n1926":{"id":"n1926","loc":[-85.634461,41.941797]},"n1927":{"id":"n1927","loc":[-85.634501,41.941819]},"n1928":{"id":"n1928","loc":[-85.634597,41.941816]},"n1929":{"id":"n1929","loc":[-85.634732,41.941724]},"n193":{"id":"n193","loc":[-85.636855,41.942369]},"n1930":{"id":"n1930","loc":[-85.634672,41.941775]},"n1931":{"id":"n1931","loc":[-85.633403,41.939101]},"n1932":{"id":"n1932","loc":[-85.633297,41.939397]},"n1933":{"id":"n1933","loc":[-85.633205,41.939674]},"n1934":{"id":"n1934","loc":[-85.63322,41.939777]},"n1935":{"id":"n1935","loc":[-85.633345,41.939936]},"n1936":{"id":"n1936","loc":[-85.633376,41.940002]},"n1937":{"id":"n1937","loc":[-85.633266,41.940228]},"n1938":{"id":"n1938","loc":[-85.633236,41.940352]},"n1939":{"id":"n1939","loc":[-85.633282,41.94063]},"n194":{"id":"n194","loc":[-85.636645,41.94249]},"n1940":{"id":"n1940","loc":[-85.633364,41.940874]},"n1941":{"id":"n1941","loc":[-85.633439,41.941052]},"n1942":{"id":"n1942","loc":[-85.633582,41.941172]},"n1943":{"id":"n1943","loc":[-85.633748,41.941273]},"n1944":{"id":"n1944","loc":[-85.634317,41.941527]},"n1945":{"id":"n1945","loc":[-85.634389,41.94174]},"n1946":{"id":"n1946","loc":[-85.634441,41.941801]},"n1947":{"id":"n1947","loc":[-85.634514,41.941837]},"n1948":{"id":"n1948","loc":[-85.634485,41.942005]},"n1949":{"id":"n1949","loc":[-85.63457,41.942202]},"n195":{"id":"n195","loc":[-85.636565,41.94249]},"n1950":{"id":"n1950","loc":[-85.634869,41.942769]},"n1951":{"id":"n1951","loc":[-85.634943,41.942792]},"n1952":{"id":"n1952","loc":[-85.635139,41.942882]},"n1953":{"id":"n1953","loc":[-85.634962,41.943161]},"n1954":{"id":"n1954","loc":[-85.635002,41.943131]},"n1955":{"id":"n1955","loc":[-85.635005,41.943091]},"n1956":{"id":"n1956","loc":[-85.635216,41.943033]},"n1957":{"id":"n1957","loc":[-85.634817,41.94267]},"n1958":{"id":"n1958","loc":[-85.634614,41.942599]},"n1959":{"id":"n1959","loc":[-85.634494,41.942381]},"n196":{"id":"n196","loc":[-85.636565,41.942474]},"n1960":{"id":"n1960","loc":[-85.634486,41.9423]},"n1961":{"id":"n1961","loc":[-85.634671,41.941795]},"n1962":{"id":"n1962","loc":[-85.634595,41.941831]},"n1963":{"id":"n1963","loc":[-85.634332,41.941866]},"n1964":{"id":"n1964","loc":[-85.634207,41.941885]},"n1965":{"id":"n1965","loc":[-85.634133,41.941892]},"n1966":{"id":"n1966","loc":[-85.634131,41.942203]},"n1967":{"id":"n1967","loc":[-85.634047,41.942327]},"n1968":{"id":"n1968","loc":[-85.634219,41.942793]},"n1969":{"id":"n1969","loc":[-85.634061,41.942392]},"n197":{"id":"n197","loc":[-85.636514,41.942474]},"n1970":{"id":"n1970","loc":[-85.633989,41.942407]},"n1971":{"id":"n1971","loc":[-85.633971,41.942356]},"n1972":{"id":"n1972","loc":[-85.63361,41.942423]},"n1973":{"id":"n1973","loc":[-85.633714,41.942682]},"n1974":{"id":"n1974","loc":[-85.633698,41.942863]},"n1975":{"id":"n1975","loc":[-85.633882,41.942865]},"n1976":{"id":"n1976","loc":[-85.633941,41.943007]},"n1977":{"id":"n1977","loc":[-85.633887,41.943035]},"n1978":{"id":"n1978","loc":[-85.633768,41.942815]},"n1979":{"id":"n1979","loc":[-85.633682,41.942351]},"n198":{"id":"n198","loc":[-85.636514,41.942326]},"n1980":{"id":"n1980","loc":[-85.634037,41.942273]},"n1981":{"id":"n1981","loc":[-85.634029,41.942252]},"n1982":{"id":"n1982","loc":[-85.633673,41.942331]},"n1983":{"id":"n1983","loc":[-85.634219,41.942571]},"n1984":{"id":"n1984","loc":[-85.634252,41.942565]},"n1985":{"id":"n1985","loc":[-85.634144,41.942299]},"n1986":{"id":"n1986","loc":[-85.634115,41.942306]},"n1987":{"id":"n1987","loc":[-85.634059,41.943094]},"n1988":{"id":"n1988","loc":[-85.633944,41.942903]},"n1989":{"id":"n1989","loc":[-85.634311,41.942821]},"n199":{"id":"n199","loc":[-85.636561,41.942326]},"n1990":{"id":"n1990","loc":[-85.634351,41.94277]},"n1991":{"id":"n1991","loc":[-85.634153,41.942254]},"n1992":{"id":"n1992","loc":[-85.634092,41.94222]},"n1993":{"id":"n1993","loc":[-85.633571,41.942336]},"n1994":{"id":"n1994","loc":[-85.633513,41.942387]},"n1995":{"id":"n1995","loc":[-85.633509,41.942455]},"n1996":{"id":"n1996","loc":[-85.63363,41.942665]},"n1997":{"id":"n1997","loc":[-85.63414,41.94286]},"n1998":{"id":"n1998","loc":[-85.63397,41.942449]},"n1999":{"id":"n1999","loc":[-85.633551,41.942529]},"n2":{"id":"n2","loc":[-85.627421,41.953877]},"n20":{"id":"n20","loc":[-85.633013,41.941438]},"n200":{"id":"n200","loc":[-85.636561,41.942311]},"n2000":{"id":"n2000","loc":[-85.633741,41.942493]},"n2001":{"id":"n2001","loc":[-85.633894,41.942869]},"n2002":{"id":"n2002","loc":[-85.634132,41.941954]},"n2003":{"id":"n2003","loc":[-85.634032,41.942038]},"n2004":{"id":"n2004","loc":[-85.633765,41.942238]},"n2005":{"id":"n2005","loc":[-85.63376,41.942268]},"n2006":{"id":"n2006","loc":[-85.633768,41.942293]},"n2007":{"id":"n2007","loc":[-85.633808,41.942386]},"n2008":{"id":"n2008","loc":[-85.634946,41.941663]},"n2009":{"id":"n2009","loc":[-85.63511,41.941697]},"n201":{"id":"n201","loc":[-85.636621,41.942311]},"n2010":{"id":"n2010","loc":[-85.635337,41.94168]},"n2011":{"id":"n2011","loc":[-85.634997,41.942251]},"n2012":{"id":"n2012","loc":[-85.635013,41.942173]},"n2013":{"id":"n2013","loc":[-85.634876,41.942157]},"n2014":{"id":"n2014","loc":[-85.634859,41.942235]},"n2015":{"id":"n2015","loc":[-85.634992,41.941951]},"n2016":{"id":"n2016","loc":[-85.634952,41.941877]},"n2017":{"id":"n2017","loc":[-85.634844,41.94191]},"n2018":{"id":"n2018","loc":[-85.634884,41.941983]},"n2019":{"id":"n2019","loc":[-85.635189,41.941691]},"n202":{"id":"n202","loc":[-85.636621,41.942351]},"n2020":{"id":"n2020","loc":[-85.635089,41.941896]},"n2021":{"id":"n2021","loc":[-85.635077,41.941964]},"n2022":{"id":"n2022","loc":[-85.635058,41.942147]},"n2023":{"id":"n2023","loc":[-85.635099,41.942161]},"n2024":{"id":"n2024","loc":[-85.635099,41.942213]},"n2025":{"id":"n2025","loc":[-85.635079,41.942285]},"n2026":{"id":"n2026","loc":[-85.635047,41.942316]},"n2027":{"id":"n2027","loc":[-85.634925,41.9423]},"n2028":{"id":"n2028","loc":[-85.634911,41.942276]},"n2029":{"id":"n2029","loc":[-85.634917,41.942242]},"n203":{"id":"n203","loc":[-85.63666,41.942351]},"n2030":{"id":"n2030","loc":[-85.634698,41.941898]},"n2031":{"id":"n2031","loc":[-85.634964,41.941878]},"n2032":{"id":"n2032","loc":[-85.635025,41.941929]},"n2033":{"id":"n2033","loc":[-85.634862,41.941887]},"n2034":{"id":"n2034","loc":[-85.634811,41.94181]},"n2035":{"id":"n2035","loc":[-85.634731,41.941745]},"n2036":{"id":"n2036","loc":[-85.634933,41.94176]},"n2037":{"id":"n2037","loc":[-85.634942,41.942145]},"n2038":{"id":"n2038","loc":[-85.634944,41.942065]},"n2039":{"id":"n2039","loc":[-85.634914,41.941996]},"n204":{"id":"n204","loc":[-85.63666,41.942453]},"n2040":{"id":"n2040","loc":[-85.634981,41.941979]},"n2041":{"id":"n2041","loc":[-85.633419,41.942172]},"n2042":{"id":"n2042","loc":[-85.633509,41.941631]},"n2043":{"id":"n2043","loc":[-85.633686,41.942937]},"n2044":{"id":"n2044","loc":[-85.633371,41.942722]},"n2045":{"id":"n2045","loc":[-85.633291,41.942538]},"n2046":{"id":"n2046","loc":[-85.633902,41.940941]},"n2047":{"id":"n2047","loc":[-85.635254,41.940939]},"n2048":{"id":"n2048","loc":[-85.635686,41.940829]},"n2049":{"id":"n2049","loc":[-85.635712,41.942681]},"n205":{"id":"n205","loc":[-85.636645,41.942453]},"n2050":{"id":"n2050","loc":[-85.633721,41.942118]},"n2051":{"id":"n2051","loc":[-85.633698,41.942057]},"n2052":{"id":"n2052","loc":[-85.633591,41.942079]},"n2053":{"id":"n2053","loc":[-85.633614,41.94214]},"n2054":{"id":"n2054","loc":[-85.633968,41.941099]},"n2055":{"id":"n2055","loc":[-85.633907,41.941138]},"n2056":{"id":"n2056","loc":[-85.633968,41.941197]},"n2057":{"id":"n2057","loc":[-85.63404,41.941162]},"n2058":{"id":"n2058","loc":[-85.634839,41.941665]},"n2059":{"id":"n2059","loc":[-85.635314,41.943035]},"n206":{"id":"n206","loc":[-85.636394,41.942471]},"n2060":{"id":"n2060","loc":[-85.634919,41.943142]},"n2061":{"id":"n2061","loc":[-85.636433,41.942959],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"townhall","name":"Three Rivers City Hall"}},"n2062":{"id":"n2062","loc":[-85.637039,41.942789]},"n2063":{"id":"n2063","loc":[-85.636333,41.94279]},"n2064":{"id":"n2064","loc":[-85.634484,41.940726]},"n2065":{"id":"n2065","loc":[-85.634483,41.940603]},"n2066":{"id":"n2066","loc":[-85.634908,41.940601]},"n2067":{"id":"n2067","loc":[-85.634908,41.94053]},"n2068":{"id":"n2068","loc":[-85.634934,41.94053]},"n2069":{"id":"n2069","loc":[-85.634934,41.940496]},"n207":{"id":"n207","loc":[-85.636262,41.942472]},"n2070":{"id":"n2070","loc":[-85.63504,41.940495]},"n2071":{"id":"n2071","loc":[-85.63504,41.940531]},"n2072":{"id":"n2072","loc":[-85.635068,41.940531]},"n2073":{"id":"n2073","loc":[-85.635071,41.940794]},"n2074":{"id":"n2074","loc":[-85.635183,41.940793]},"n2075":{"id":"n2075","loc":[-85.635185,41.940916]},"n2076":{"id":"n2076","loc":[-85.634799,41.940919]},"n2077":{"id":"n2077","loc":[-85.634798,41.940798]},"n2078":{"id":"n2078","loc":[-85.634925,41.940797]},"n2079":{"id":"n2079","loc":[-85.634924,41.940724]},"n208":{"id":"n208","loc":[-85.636261,41.94233]},"n2080":{"id":"n2080","loc":[-85.637448,41.938233]},"n2081":{"id":"n2081","loc":[-85.634168,41.943279]},"n2082":{"id":"n2082","loc":[-85.635744,41.938248]},"n2083":{"id":"n2083","loc":[-85.638744,41.951211]},"n2084":{"id":"n2084","loc":[-85.636421,41.946392]},"n2085":{"id":"n2085","loc":[-85.635965,41.945809]},"n2086":{"id":"n2086","loc":[-85.635683,41.945449]},"n2087":{"id":"n2087","loc":[-85.635281,41.945025]},"n2088":{"id":"n2088","loc":[-85.632443,41.942574]},"n2089":{"id":"n2089","loc":[-85.638243,41.943674]},"n209":{"id":"n209","loc":[-85.636353,41.942329]},"n2090":{"id":"n2090","loc":[-85.638228,41.943747]},"n2091":{"id":"n2091","loc":[-85.638163,41.943797]},"n2092":{"id":"n2092","loc":[-85.638089,41.943832]},"n2093":{"id":"n2093","loc":[-85.637969,41.943841]},"n2094":{"id":"n2094","loc":[-85.637841,41.943833]},"n2095":{"id":"n2095","loc":[-85.637342,41.943734]},"n2096":{"id":"n2096","loc":[-85.637232,41.943707]},"n2097":{"id":"n2097","loc":[-85.637163,41.943668]},"n2098":{"id":"n2098","loc":[-85.637118,41.943615]},"n2099":{"id":"n2099","loc":[-85.637078,41.943494]},"n21":{"id":"n21","loc":[-85.634126,41.942228]},"n210":{"id":"n210","loc":[-85.636354,41.94239]},"n2100":{"id":"n2100","loc":[-85.632903,41.998429],"tags":{"railway":"level_crossing"}},"n2101":{"id":"n2101","loc":[-85.633616,41.943581],"tags":{"railway":"level_crossing"}},"n2102":{"id":"n2102","loc":[-85.636943,41.947311]},"n2103":{"id":"n2103","loc":[-85.6376,41.94854]},"n2104":{"id":"n2104","loc":[-85.634565,41.93631]},"n2105":{"id":"n2105","loc":[-85.629597,41.942562]},"n2106":{"id":"n2106","loc":[-85.630821,41.943077]},"n2107":{"id":"n2107","loc":[-85.627473,41.940659]},"n2108":{"id":"n2108","loc":[-85.629708,41.942872]},"n2109":{"id":"n2109","loc":[-85.634093,41.935448]},"n211":{"id":"n211","loc":[-85.636393,41.94239]},"n2110":{"id":"n2110","loc":[-85.630413,41.94366]},"n2111":{"id":"n2111","loc":[-85.630488,41.942662]},"n2112":{"id":"n2112","loc":[-85.63361,41.936749]},"n2113":{"id":"n2113","loc":[-85.630038,41.941808]},"n2114":{"id":"n2114","loc":[-85.632016,41.942922]},"n2115":{"id":"n2115","loc":[-85.631525,41.944303]},"n2116":{"id":"n2116","loc":[-85.626862,41.94022]},"n2117":{"id":"n2117","loc":[-85.629673,41.94121]},"n2118":{"id":"n2118","loc":[-85.632752,41.943101]},"n2119":{"id":"n2119","loc":[-85.631147,41.943201]},"n212":{"id":"n212","loc":[-85.63444,41.943176]},"n2120":{"id":"n2120","loc":[-85.624974,41.940579]},"n2121":{"id":"n2121","loc":[-85.629518,41.941783]},"n2122":{"id":"n2122","loc":[-85.632349,41.942699]},"n2123":{"id":"n2123","loc":[-85.628418,41.940356]},"n2124":{"id":"n2124","loc":[-85.629147,41.94129]},"n2125":{"id":"n2125","loc":[-85.631111,41.943979]},"n2126":{"id":"n2126","loc":[-85.632087,41.940013]},"n2127":{"id":"n2127","loc":[-85.634469,41.935057]},"n2128":{"id":"n2128","loc":[-85.630097,41.943449]},"n2129":{"id":"n2129","loc":[-85.6331,41.937878]},"n213":{"id":"n213","loc":[-85.63375,41.942814]},"n2130":{"id":"n2130","loc":[-85.625274,41.941114]},"n2131":{"id":"n2131","loc":[-85.632632,41.941217]},"n2132":{"id":"n2132","loc":[-85.632739,41.941926]},"n2133":{"id":"n2133","loc":[-85.631647,41.94366]},"n2134":{"id":"n2134","loc":[-85.635059,41.935456]},"n2135":{"id":"n2135","loc":[-85.631259,41.944349]},"n2136":{"id":"n2136","loc":[-85.626336,41.940811]},"n2137":{"id":"n2137","loc":[-85.631507,41.943875]},"n2138":{"id":"n2138","loc":[-85.625081,41.940859]},"n2139":{"id":"n2139","loc":[-85.625778,41.940093]},"n214":{"id":"n214","loc":[-85.633674,41.942869]},"n2140":{"id":"n2140","loc":[-85.632641,41.942436]},"n2141":{"id":"n2141","loc":[-85.628825,41.941034]},"n2142":{"id":"n2142","loc":[-85.627913,41.940292]},"n2143":{"id":"n2143","loc":[-85.628943,41.940516]},"n2144":{"id":"n2144","loc":[-85.63139,41.943941]},"n2145":{"id":"n2145","loc":[-85.630081,41.94204]},"n2146":{"id":"n2146","loc":[-85.632194,41.93963]},"n2147":{"id":"n2147","loc":[-85.632913,41.93939]},"n2148":{"id":"n2148","loc":[-85.632001,41.943492]},"n2149":{"id":"n2149","loc":[-85.63149,41.943154]},"n215":{"id":"n215","loc":[-85.633542,41.942768]},"n2150":{"id":"n2150","loc":[-85.625167,41.940117]},"n2151":{"id":"n2151","loc":[-85.63287,41.939941]},"n2152":{"id":"n2152","loc":[-85.630789,41.943732]},"n2153":{"id":"n2153","loc":[-85.632173,41.940348]},"n2154":{"id":"n2154","loc":[-85.626587,41.940113]},"n2155":{"id":"n2155","loc":[-85.62684,41.940667]},"n2156":{"id":"n2156","loc":[-85.632527,41.938904]},"n2157":{"id":"n2157","loc":[-85.624866,41.94018]},"n2158":{"id":"n2158","loc":[-85.633267,41.93872]},"n2159":{"id":"n2159","loc":[-85.62934,41.940843]},"n216":{"id":"n216","loc":[-85.633618,41.942714]},"n2160":{"id":"n2160","loc":[-85.62272,41.953817]},"n2161":{"id":"n2161","loc":[-85.622555,41.954453]},"n2162":{"id":"n2162","loc":[-85.637225,41.944128]},"n2163":{"id":"n2163","loc":[-85.622628,41.953683]},"n2164":{"id":"n2164","loc":[-85.635441,41.943989]},"n2165":{"id":"n2165","loc":[-85.622629,41.953807]},"n2166":{"id":"n2166","loc":[-85.62262,41.953807]},"n2167":{"id":"n2167","loc":[-85.62262,41.953837]},"n2168":{"id":"n2168","loc":[-85.622532,41.953838]},"n2169":{"id":"n2169","loc":[-85.637469,41.944579]},"n217":{"id":"n217","loc":[-85.634001,41.942336]},"n2170":{"id":"n2170","loc":[-85.63688,41.943935]},"n2171":{"id":"n2171","loc":[-85.638263,41.946367]},"n2172":{"id":"n2172","loc":[-85.622532,41.953807]},"n2173":{"id":"n2173","loc":[-85.622353,41.953808]},"n2174":{"id":"n2174","loc":[-85.622352,41.953685]},"n2175":{"id":"n2175","loc":[-85.622464,41.953684]},"n2176":{"id":"n2176","loc":[-85.622464,41.953648]},"n2177":{"id":"n2177","loc":[-85.637136,41.94576]},"n2178":{"id":"n2178","loc":[-85.622521,41.953648]},"n2179":{"id":"n2179","loc":[-85.637129,41.945415]},"n218":{"id":"n218","loc":[-85.633825,41.942376]},"n2180":{"id":"n2180","loc":[-85.637473,41.94607]},"n2181":{"id":"n2181","loc":[-85.622521,41.953683]},"n2182":{"id":"n2182","loc":[-85.622717,41.954104]},"n2183":{"id":"n2183","loc":[-85.637769,41.946095]},"n2184":{"id":"n2184","loc":[-85.623872,41.953515]},"n2185":{"id":"n2185","loc":[-85.623851,41.953588]},"n2186":{"id":"n2186","loc":[-85.631385,41.94433]},"n2187":{"id":"n2187","loc":[-85.623608,41.953543]},"n2188":{"id":"n2188","loc":[-85.637308,41.944882]},"n2189":{"id":"n2189","loc":[-85.634898,41.944041]},"n219":{"id":"n219","loc":[-85.633807,41.942334]},"n2190":{"id":"n2190","loc":[-85.623604,41.953442]},"n2191":{"id":"n2191","loc":[-85.623705,41.953442]},"n2192":{"id":"n2192","loc":[-85.623708,41.953493]},"n2193":{"id":"n2193","loc":[-85.624064,41.952655]},"n2194":{"id":"n2194","loc":[-85.62395,41.952654]},"n2195":{"id":"n2195","loc":[-85.623951,41.952579]},"n2196":{"id":"n2196","loc":[-85.637435,41.944342]},"n2197":{"id":"n2197","loc":[-85.624064,41.952579]},"n2198":{"id":"n2198","loc":[-85.623812,41.952648]},"n2199":{"id":"n2199","loc":[-85.623813,41.952705]},"n22":{"id":"n22","loc":[-85.633531,41.942357]},"n220":{"id":"n220","loc":[-85.633983,41.942294]},"n2200":{"id":"n2200","loc":[-85.637169,41.945098]},"n2201":{"id":"n2201","loc":[-85.623552,41.952707]},"n2202":{"id":"n2202","loc":[-85.623551,41.95263]},"n2203":{"id":"n2203","loc":[-85.623701,41.952629]},"n2204":{"id":"n2204","loc":[-85.635894,41.943719]},"n2205":{"id":"n2205","loc":[-85.637297,41.945992]},"n2206":{"id":"n2206","loc":[-85.623724,41.952648]},"n2207":{"id":"n2207","loc":[-85.623812,41.952438]},"n2208":{"id":"n2208","loc":[-85.625239,41.952197]},"n2209":{"id":"n2209","loc":[-85.625232,41.952257]},"n221":{"id":"n221","loc":[-85.634182,41.942495]},"n2210":{"id":"n2210","loc":[-85.635175,41.94408]},"n2211":{"id":"n2211","loc":[-85.636381,41.943761]},"n2212":{"id":"n2212","loc":[-85.625115,41.952249]},"n2213":{"id":"n2213","loc":[-85.638578,41.946644]},"n2214":{"id":"n2214","loc":[-85.625122,41.952189]},"n2215":{"id":"n2215","loc":[-85.625085,41.952031]},"n2216":{"id":"n2216","loc":[-85.636126,41.943713]},"n2217":{"id":"n2217","loc":[-85.635005,41.944041]},"n2218":{"id":"n2218","loc":[-85.63714,41.945328]},"n2219":{"id":"n2219","loc":[-85.634871,41.943292]},"n222":{"id":"n222","loc":[-85.634149,41.942503]},"n2220":{"id":"n2220","loc":[-85.635705,41.943799]},"n2221":{"id":"n2221","loc":[-85.634995,41.943576]},"n2222":{"id":"n2222","loc":[-85.635026,41.943829]},"n2223":{"id":"n2223","loc":[-85.632874,41.941031]},"n2224":{"id":"n2224","loc":[-85.632531,41.940233]},"n2225":{"id":"n2225","loc":[-85.634247,41.936003]},"n2226":{"id":"n2226","loc":[-85.62929,41.941127]},"n2227":{"id":"n2227","loc":[-85.630428,41.943266]},"n2228":{"id":"n2228","loc":[-85.631608,41.943425]},"n2229":{"id":"n2229","loc":[-85.632316,41.943042]},"n223":{"id":"n223","loc":[-85.634098,41.942373]},"n2230":{"id":"n2230","loc":[-85.628711,41.940744]},"n2231":{"id":"n2231","loc":[-85.627831,41.940536]},"n2232":{"id":"n2232","loc":[-85.625514,41.94052]},"n2233":{"id":"n2233","loc":[-85.631127,41.943545]},"n2234":{"id":"n2234","loc":[-85.632909,41.942531]},"n2235":{"id":"n2235","loc":[-85.632917,41.938796]},"n2236":{"id":"n2236","loc":[-85.626716,41.94044]},"n2237":{"id":"n2237","loc":[-85.630122,41.942852]},"n2238":{"id":"n2238","loc":[-85.632509,41.939674]},"n2239":{"id":"n2239","loc":[-85.634762,41.935237]},"n224":{"id":"n224","loc":[-85.634131,41.942366]},"n2240":{"id":"n2240","loc":[-85.63384,41.937025]},"n2241":{"id":"n2241","loc":[-85.629741,41.941909]},"n2242":{"id":"n2242","loc":[-85.635254,41.945001],"tags":{"railway":"level_crossing"}},"n2243":{"id":"n2243","loc":[-85.634005,41.938168]},"n2244":{"id":"n2244","loc":[-85.63393,41.938335]},"n2245":{"id":"n2245","loc":[-85.633859,41.93846]},"n2246":{"id":"n2246","loc":[-85.633663,41.938776]},"n2247":{"id":"n2247","loc":[-85.633513,41.938936]},"n2248":{"id":"n2248","loc":[-85.635295,41.943225]},"n2249":{"id":"n2249","loc":[-85.635393,41.943293]},"n225":{"id":"n225","loc":[-85.635986,41.94177]},"n2250":{"id":"n2250","loc":[-85.635645,41.94332]},"n2251":{"id":"n2251","loc":[-85.63629,41.943328]},"n2252":{"id":"n2252","loc":[-85.636554,41.943372]},"n2253":{"id":"n2253","loc":[-85.636869,41.943526]},"n2254":{"id":"n2254","loc":[-85.637099,41.943704]},"n2255":{"id":"n2255","loc":[-85.637268,41.943773]},"n2256":{"id":"n2256","loc":[-85.637483,41.943821]},"n2257":{"id":"n2257","loc":[-85.637616,41.943929]},"n2258":{"id":"n2258","loc":[-85.637752,41.944114]},"n2259":{"id":"n2259","loc":[-85.638399,41.944308]},"n226":{"id":"n226","loc":[-85.635982,41.941523]},"n2260":{"id":"n2260","loc":[-85.638573,41.944451]},"n2261":{"id":"n2261","loc":[-85.638702,41.944574]},"n2262":{"id":"n2262","loc":[-85.638718,41.944652]},"n2263":{"id":"n2263","loc":[-85.638715,41.944809]},"n2264":{"id":"n2264","loc":[-85.638766,41.944988]},"n2265":{"id":"n2265","loc":[-85.638773,41.945136]},"n2266":{"id":"n2266","loc":[-85.638705,41.945251]},"n2267":{"id":"n2267","loc":[-85.638335,41.944291]},"n2268":{"id":"n2268","loc":[-85.638474,41.944352]},"n2269":{"id":"n2269","loc":[-85.635408,41.943429]},"n227":{"id":"n227","loc":[-85.636108,41.941521]},"n2270":{"id":"n2270","loc":[-85.635271,41.943654]},"n2271":{"id":"n2271","loc":[-85.635266,41.943744]},"n2272":{"id":"n2272","loc":[-85.635271,41.943819]},"n2273":{"id":"n2273","loc":[-85.635192,41.943876]},"n2274":{"id":"n2274","loc":[-85.635129,41.943857]},"n2275":{"id":"n2275","loc":[-85.635122,41.943764]},"n2276":{"id":"n2276","loc":[-85.635124,41.943664]},"n2277":{"id":"n2277","loc":[-85.63515,41.943611]},"n2278":{"id":"n2278","loc":[-85.635106,41.943534]},"n2279":{"id":"n2279","loc":[-85.634972,41.943197]},"n228":{"id":"n228","loc":[-85.636109,41.941559]},"n2280":{"id":"n2280","loc":[-85.633978,41.938227]},"n2281":{"id":"n2281","loc":[-85.634216,41.943255]},"n2282":{"id":"n2282","loc":[-85.634434,41.943622]},"n2283":{"id":"n2283","loc":[-85.632406,41.940854]},"n2284":{"id":"n2284","loc":[-85.632488,41.941063],"tags":{"leisure":"slipway"}},"n2285":{"id":"n2285","loc":[-85.632726,41.941537]},"n2286":{"id":"n2286","loc":[-85.632639,41.94136]},"n2287":{"id":"n2287","loc":[-85.632704,41.941439]},"n2288":{"id":"n2288","loc":[-85.632289,41.940601]},"n2289":{"id":"n2289","loc":[-85.632541,41.942526]},"n229":{"id":"n229","loc":[-85.636145,41.941559]},"n2290":{"id":"n2290","loc":[-85.634058,41.943173]},"n2291":{"id":"n2291","loc":[-85.636175,41.945974]},"n2292":{"id":"n2292","loc":[-85.636528,41.945975]},"n2293":{"id":"n2293","loc":[-85.637092,41.945893]},"n2294":{"id":"n2294","loc":[-85.637881,41.945647]},"n2295":{"id":"n2295","loc":[-85.639329,41.945162]},"n2296":{"id":"n2296","loc":[-85.639323,41.945026]},"n2297":{"id":"n2297","loc":[-85.638826,41.945032]},"n2298":{"id":"n2298","loc":[-85.638817,41.944174]},"n2299":{"id":"n2299","loc":[-85.638291,41.94418]},"n23":{"id":"n23","loc":[-85.633504,41.942418]},"n230":{"id":"n230","loc":[-85.636145,41.941551]},"n2300":{"id":"n2300","loc":[-85.63828,41.943811]},"n2301":{"id":"n2301","loc":[-85.638195,41.943601]},"n2302":{"id":"n2302","loc":[-85.63719,41.943592]},"n2303":{"id":"n2303","loc":[-85.636697,41.943273]},"n2304":{"id":"n2304","loc":[-85.635375,41.943274]},"n2305":{"id":"n2305","loc":[-85.635091,41.943547]},"n2306":{"id":"n2306","loc":[-85.63442,41.944117]},"n2307":{"id":"n2307","loc":[-85.635117,41.943717]},"n2308":{"id":"n2308","loc":[-85.635601,41.945177]},"n2309":{"id":"n2309","loc":[-85.635819,41.945494]},"n231":{"id":"n231","loc":[-85.636312,41.941549]},"n2310":{"id":"n2310","loc":[-85.635303,41.944891]},"n2311":{"id":"n2311","loc":[-85.637674,41.943802]},"n2312":{"id":"n2312","loc":[-85.638263,41.944272]},"n2313":{"id":"n2313","loc":[-85.634267,41.935266]},"n2314":{"id":"n2314","loc":[-85.639788,41.945152]},"n2315":{"id":"n2315","loc":[-85.639645,41.945167]},"n2316":{"id":"n2316","loc":[-85.639362,41.945233]},"n2317":{"id":"n2317","loc":[-85.638616,41.945163]},"n2318":{"id":"n2318","loc":[-85.638514,41.944936]},"n2319":{"id":"n2319","loc":[-85.638578,41.94503]},"n232":{"id":"n232","loc":[-85.636314,41.941649]},"n2320":{"id":"n2320","loc":[-85.638578,41.945215]},"n2321":{"id":"n2321","loc":[-85.640495,41.947015]},"n2322":{"id":"n2322","loc":[-85.639577,41.946495]},"n2323":{"id":"n2323","loc":[-85.638935,41.946087]},"n2324":{"id":"n2324","loc":[-85.637535,41.94584]},"n2325":{"id":"n2325","loc":[-85.638357,41.945404]},"n2326":{"id":"n2326","loc":[-85.638051,41.94553]},"n2327":{"id":"n2327","loc":[-85.637732,41.945555]},"n2328":{"id":"n2328","loc":[-85.637657,41.945524]},"n2329":{"id":"n2329","loc":[-85.637598,41.945467]},"n233":{"id":"n233","loc":[-85.636152,41.94165]},"n2330":{"id":"n2330","loc":[-85.637669,41.945318]},"n2331":{"id":"n2331","loc":[-85.637894,41.945171]},"n2332":{"id":"n2332","loc":[-85.637923,41.945082]},"n2333":{"id":"n2333","loc":[-85.63793,41.944756]},"n2334":{"id":"n2334","loc":[-85.637976,41.944696]},"n2335":{"id":"n2335","loc":[-85.638044,41.944671]},"n2336":{"id":"n2336","loc":[-85.638129,41.944597]},"n2337":{"id":"n2337","loc":[-85.638252,41.944413]},"n2338":{"id":"n2338","loc":[-85.638092,41.945442]},"n2339":{"id":"n2339","loc":[-85.638409,41.945315]},"n234":{"id":"n234","loc":[-85.636152,41.941628]},"n2340":{"id":"n2340","loc":[-85.638325,41.944771]},"n2341":{"id":"n2341","loc":[-85.638103,41.944744]},"n2342":{"id":"n2342","loc":[-85.637976,41.944781]},"n2343":{"id":"n2343","loc":[-85.637983,41.944865]},"n2344":{"id":"n2344","loc":[-85.638063,41.945074]},"n2345":{"id":"n2345","loc":[-85.638041,41.945206]},"n2346":{"id":"n2346","loc":[-85.637907,41.945309]},"n2347":{"id":"n2347","loc":[-85.637925,41.94539]},"n2348":{"id":"n2348","loc":[-85.637998,41.94545]},"n2349":{"id":"n2349","loc":[-85.637135,41.946254]},"n235":{"id":"n235","loc":[-85.63611,41.941628]},"n2350":{"id":"n2350","loc":[-85.636837,41.946615]},"n2351":{"id":"n2351","loc":[-85.637954,41.948909]},"n2352":{"id":"n2352","loc":[-85.638382,41.949786]},"n2353":{"id":"n2353","loc":[-85.639367,41.951242]},"n2354":{"id":"n2354","loc":[-85.640554,41.951777]},"n2355":{"id":"n2355","loc":[-85.6411,41.952234]},"n2356":{"id":"n2356","loc":[-85.641742,41.952657]},"n2357":{"id":"n2357","loc":[-85.642321,41.952941]},"n2358":{"id":"n2358","loc":[-85.64277,41.953228]},"n2359":{"id":"n2359","loc":[-85.643333,41.953825]},"n236":{"id":"n236","loc":[-85.636113,41.941768]},"n2360":{"id":"n2360","loc":[-85.643579,41.954365]},"n2361":{"id":"n2361","loc":[-85.644439,41.954105]},"n2362":{"id":"n2362","loc":[-85.64506,41.954]},"n2363":{"id":"n2363","loc":[-85.645483,41.953911]},"n2364":{"id":"n2364","loc":[-85.646046,41.953853]},"n2365":{"id":"n2365","loc":[-85.646318,41.953717]},"n2366":{"id":"n2366","loc":[-85.646276,41.953414]},"n2367":{"id":"n2367","loc":[-85.631063,41.957478],"tags":{"emergency":"fire_hydrant"}},"n2368":{"id":"n2368","loc":[-85.630996,41.955857],"tags":{"emergency":"fire_hydrant"}},"n2369":{"id":"n2369","loc":[-85.630976,41.954608],"tags":{"emergency":"fire_hydrant"}},"n237":{"id":"n237","loc":[-85.635983,41.941589],"tags":{"entrance":"yes"}},"n2370":{"id":"n2370","loc":[-85.646,41.953154]},"n2371":{"id":"n2371","loc":[-85.645222,41.953193]},"n2372":{"id":"n2372","loc":[-85.644732,41.953181]},"n2373":{"id":"n2373","loc":[-85.644064,41.953298]},"n2374":{"id":"n2374","loc":[-85.643818,41.953177]},"n2375":{"id":"n2375","loc":[-85.644001,41.95284]},"n2376":{"id":"n2376","loc":[-85.628174,41.95456],"tags":{"emergency":"fire_hydrant"}},"n2377":{"id":"n2377","loc":[-85.644267,41.952591]},"n2378":{"id":"n2378","loc":[-85.644288,41.952328]},"n2379":{"id":"n2379","loc":[-85.627276,41.953987],"tags":{"emergency":"fire_hydrant"}},"n238":{"id":"n238","loc":[-85.635906,41.94159]},"n2380":{"id":"n2380","loc":[-85.644262,41.952153]},"n2381":{"id":"n2381","loc":[-85.644168,41.95204]},"n2382":{"id":"n2382","loc":[-85.64421,41.951749]},"n2383":{"id":"n2383","loc":[-85.64385,41.951586]},"n2384":{"id":"n2384","loc":[-85.62736,41.955964],"tags":{"emergency":"fire_hydrant"}},"n2385":{"id":"n2385","loc":[-85.626307,41.957198],"tags":{"emergency":"fire_hydrant"}},"n2386":{"id":"n2386","loc":[-85.643589,41.951323]},"n2387":{"id":"n2387","loc":[-85.62747,41.957509],"tags":{"emergency":"fire_hydrant"}},"n2388":{"id":"n2388","loc":[-85.628665,41.957492],"tags":{"emergency":"fire_hydrant"}},"n2389":{"id":"n2389","loc":[-85.642535,41.951031]},"n239":{"id":"n239","loc":[-85.635883,41.940182]},"n2390":{"id":"n2390","loc":[-85.642269,41.95088]},"n2391":{"id":"n2391","loc":[-85.641878,41.950814]},"n2392":{"id":"n2392","loc":[-85.641549,41.950806]},"n2393":{"id":"n2393","loc":[-85.641103,41.950549]},"n2394":{"id":"n2394","loc":[-85.630864,41.959046],"tags":{"emergency":"fire_hydrant"}},"n2395":{"id":"n2395","loc":[-85.632249,41.958969],"tags":{"emergency":"fire_hydrant"}},"n2396":{"id":"n2396","loc":[-85.641037,41.949821]},"n2397":{"id":"n2397","loc":[-85.641006,41.949433]},"n2398":{"id":"n2398","loc":[-85.632232,41.95859],"tags":{"emergency":"fire_hydrant"}},"n2399":{"id":"n2399","loc":[-85.632071,41.958345],"tags":{"emergency":"fire_hydrant"}},"n24":{"id":"n24","loc":[-85.634346,41.942792]},"n240":{"id":"n240","loc":[-85.635916,41.94264]},"n2400":{"id":"n2400","loc":[-85.632228,41.9573],"tags":{"emergency":"fire_hydrant"}},"n2401":{"id":"n2401","loc":[-85.641152,41.948257]},"n2402":{"id":"n2402","loc":[-85.641055,41.947304]},"n2403":{"id":"n2403","loc":[-85.638022,41.945897]},"n2404":{"id":"n2404","loc":[-85.638672,41.950778]},"n2405":{"id":"n2405","loc":[-85.63666,41.944492],"tags":{"name":"Memory Isle","place":"island"}},"n2406":{"id":"n2406","loc":[-85.635,41.946389],"tags":{"amenity":"post_office","name":"Three Rivers Post Office"}},"n2407":{"id":"n2407","loc":[-85.633676,41.946036]},"n2408":{"id":"n2408","loc":[-85.633736,41.946078]},"n2409":{"id":"n2409","loc":[-85.633997,41.946185]},"n241":{"id":"n241","loc":[-85.635795,41.941906]},"n2410":{"id":"n2410","loc":[-85.634448,41.945626],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2411":{"id":"n2411","loc":[-85.63456,41.945731],"tags":{"crossing":"zebra","highway":"crossing"}},"n2412":{"id":"n2412","loc":[-85.634592,41.94578]},"n2413":{"id":"n2413","loc":[-85.634607,41.945815]},"n2414":{"id":"n2414","loc":[-85.634614,41.945864]},"n2415":{"id":"n2415","loc":[-85.636066,41.946185]},"n2416":{"id":"n2416","loc":[-85.636128,41.946352]},"n2417":{"id":"n2417","loc":[-85.636142,41.946452]},"n2418":{"id":"n2418","loc":[-85.635327,41.945292]},"n2419":{"id":"n2419","loc":[-85.635648,41.94558]},"n242":{"id":"n242","loc":[-85.635909,41.941906]},"n2420":{"id":"n2420","loc":[-85.635769,41.945729]},"n2421":{"id":"n2421","loc":[-85.637349,41.945897]},"n2422":{"id":"n2422","loc":[-85.632211,41.95596],"tags":{"emergency":"fire_hydrant"}},"n2423":{"id":"n2423","loc":[-85.635942,41.94598]},"n2424":{"id":"n2424","loc":[-85.636443,41.946042]},"n2425":{"id":"n2425","loc":[-85.635819,41.946052]},"n2426":{"id":"n2426","loc":[-85.636669,41.946025]},"n2427":{"id":"n2427","loc":[-85.636832,41.946005]},"n2428":{"id":"n2428","loc":[-85.637039,41.945968]},"n2429":{"id":"n2429","loc":[-85.636291,41.946046]},"n243":{"id":"n243","loc":[-85.636359,41.941904]},"n2430":{"id":"n2430","loc":[-85.634005,41.943367]},"n2431":{"id":"n2431","loc":[-85.633366,41.943724]},"n2432":{"id":"n2432","loc":[-85.634617,41.946057]},"n2433":{"id":"n2433","loc":[-85.636534,41.944793]},"n2434":{"id":"n2434","loc":[-85.637055,41.945188]},"n2435":{"id":"n2435","loc":[-85.636153,41.944618]},"n2436":{"id":"n2436","loc":[-85.636803,41.944944]},"n2437":{"id":"n2437","loc":[-85.633389,41.945735]},"n2438":{"id":"n2438","loc":[-85.633536,41.94585]},"n2439":{"id":"n2439","loc":[-85.63363,41.945993]},"n244":{"id":"n244","loc":[-85.636351,41.941438]},"n2440":{"id":"n2440","loc":[-85.633268,41.94568]},"n2441":{"id":"n2441","loc":[-85.635947,41.94546]},"n2442":{"id":"n2442","loc":[-85.636277,41.945268]},"n2443":{"id":"n2443","loc":[-85.635203,41.944287]},"n2444":{"id":"n2444","loc":[-85.634876,41.944477]},"n2445":{"id":"n2445","loc":[-85.634975,41.944419]},"n2446":{"id":"n2446","loc":[-85.633877,41.943438]},"n2447":{"id":"n2447","loc":[-85.63508,41.945113]},"n2448":{"id":"n2448","loc":[-85.635372,41.944932]},"n2449":{"id":"n2449","loc":[-85.636594,41.945935]},"n245":{"id":"n245","loc":[-85.635903,41.941436]},"n2450":{"id":"n2450","loc":[-85.636901,41.945747]},"n2451":{"id":"n2451","loc":[-85.636329,41.945228]},"n2452":{"id":"n2452","loc":[-85.636025,41.945417]},"n2453":{"id":"n2453","loc":[-85.634002,41.944644]},"n2454":{"id":"n2454","loc":[-85.63407,41.944692]},"n2455":{"id":"n2455","loc":[-85.634114,41.944756]},"n2456":{"id":"n2456","loc":[-85.633762,41.944809]},"n2457":{"id":"n2457","loc":[-85.634184,41.944807]},"n2458":{"id":"n2458","loc":[-85.634291,41.944819]},"n2459":{"id":"n2459","loc":[-85.634639,41.944845]},"n246":{"id":"n246","loc":[-85.635788,41.941436]},"n2460":{"id":"n2460","loc":[-85.633822,41.944861]},"n2461":{"id":"n2461","loc":[-85.63411,41.944855]},"n2462":{"id":"n2462","loc":[-85.63435,41.944872]},"n2463":{"id":"n2463","loc":[-85.63441,41.944903]},"n2464":{"id":"n2464","loc":[-85.633883,41.944913]},"n2465":{"id":"n2465","loc":[-85.634164,41.944896]},"n2466":{"id":"n2466","loc":[-85.633487,41.944926]},"n2467":{"id":"n2467","loc":[-85.634736,41.944929]},"n2468":{"id":"n2468","loc":[-85.633944,41.944965]},"n2469":{"id":"n2469","loc":[-85.633555,41.944983]},"n247":{"id":"n247","loc":[-85.635929,41.941511]},"n2470":{"id":"n2470","loc":[-85.633995,41.945013]},"n2471":{"id":"n2471","loc":[-85.633614,41.945037]},"n2472":{"id":"n2472","loc":[-85.634848,41.945031]},"n2473":{"id":"n2473","loc":[-85.634049,41.945061]},"n2474":{"id":"n2474","loc":[-85.633678,41.945094]},"n2475":{"id":"n2475","loc":[-85.63317,41.945111]},"n2476":{"id":"n2476","loc":[-85.633357,41.945103]},"n2477":{"id":"n2477","loc":[-85.633728,41.945136]},"n2478":{"id":"n2478","loc":[-85.634146,41.945148]},"n2479":{"id":"n2479","loc":[-85.633416,41.945157]},"n248":{"id":"n248","loc":[-85.635929,41.941317]},"n2480":{"id":"n2480","loc":[-85.634625,41.945172]},"n2481":{"id":"n2481","loc":[-85.633239,41.945174]},"n2482":{"id":"n2482","loc":[-85.63469,41.945185]},"n2483":{"id":"n2483","loc":[-85.634661,41.945203]},"n2484":{"id":"n2484","loc":[-85.63348,41.945214]},"n2485":{"id":"n2485","loc":[-85.633578,41.945221]},"n2486":{"id":"n2486","loc":[-85.634742,41.945231]},"n2487":{"id":"n2487","loc":[-85.634251,41.94525]},"n2488":{"id":"n2488","loc":[-85.633524,41.945254]},"n2489":{"id":"n2489","loc":[-85.63468,41.945271]},"n249":{"id":"n249","loc":[-85.636414,41.941316]},"n2490":{"id":"n2490","loc":[-85.633885,41.945272]},"n2491":{"id":"n2491","loc":[-85.634795,41.945288]},"n2492":{"id":"n2492","loc":[-85.634742,41.94532]},"n2493":{"id":"n2493","loc":[-85.633946,41.945327]},"n2494":{"id":"n2494","loc":[-85.634844,41.945331]},"n2495":{"id":"n2495","loc":[-85.63435,41.945349]},"n2496":{"id":"n2496","loc":[-85.633733,41.945357]},"n2497":{"id":"n2497","loc":[-85.633987,41.945375]},"n2498":{"id":"n2498","loc":[-85.634911,41.945419]},"n2499":{"id":"n2499","loc":[-85.634049,41.945431]},"n25":{"id":"n25","loc":[-85.634333,41.942809]},"n250":{"id":"n250","loc":[-85.636414,41.941511]},"n2500":{"id":"n2500","loc":[-85.633705,41.945461]},"n2501":{"id":"n2501","loc":[-85.633642,41.945408]},"n2502":{"id":"n2502","loc":[-85.634493,41.945475]},"n2503":{"id":"n2503","loc":[-85.634106,41.945484]},"n2504":{"id":"n2504","loc":[-85.635008,41.945505]},"n2505":{"id":"n2505","loc":[-85.633757,41.945506]},"n2506":{"id":"n2506","loc":[-85.634542,41.945519]},"n2507":{"id":"n2507","loc":[-85.634162,41.945536]},"n2508":{"id":"n2508","loc":[-85.633843,41.945547]},"n2509":{"id":"n2509","loc":[-85.634919,41.94556]},"n251":{"id":"n251","loc":[-85.636819,41.941617]},"n2510":{"id":"n2510","loc":[-85.633818,41.945561]},"n2511":{"id":"n2511","loc":[-85.634638,41.94559]},"n2512":{"id":"n2512","loc":[-85.633901,41.945598]},"n2513":{"id":"n2513","loc":[-85.634257,41.945626]},"n2514":{"id":"n2514","loc":[-85.633967,41.945652]},"n2515":{"id":"n2515","loc":[-85.634735,41.945676]},"n2516":{"id":"n2516","loc":[-85.635057,41.945683]},"n2517":{"id":"n2517","loc":[-85.635296,41.945703]},"n2518":{"id":"n2518","loc":[-85.635112,41.945703]},"n2519":{"id":"n2519","loc":[-85.634782,41.945729]},"n252":{"id":"n252","loc":[-85.636718,41.941619]},"n2520":{"id":"n2520","loc":[-85.634052,41.945747]},"n2521":{"id":"n2521","loc":[-85.635296,41.945757]},"n2522":{"id":"n2522","loc":[-85.635314,41.945757]},"n2523":{"id":"n2523","loc":[-85.635112,41.945761]},"n2524":{"id":"n2524","loc":[-85.63484,41.945778]},"n2525":{"id":"n2525","loc":[-85.635314,41.945938]},"n2526":{"id":"n2526","loc":[-85.63484,41.945922]},"n2527":{"id":"n2527","loc":[-85.635461,41.944879]},"n2528":{"id":"n2528","loc":[-85.636024,41.945384]},"n2529":{"id":"n2529","loc":[-85.636145,41.945312]},"n253":{"id":"n253","loc":[-85.636716,41.941509]},"n2530":{"id":"n2530","loc":[-85.6356,41.944797]},"n2531":{"id":"n2531","loc":[-85.635135,41.944354]},"n2532":{"id":"n2532","loc":[-85.632988,41.945369]},"n2533":{"id":"n2533","loc":[-85.633376,41.94563]},"n2534":{"id":"n2534","loc":[-85.633539,41.945534]},"n2535":{"id":"n2535","loc":[-85.633238,41.945248]},"n2536":{"id":"n2536","loc":[-85.633166,41.945216]},"n2537":{"id":"n2537","loc":[-85.633114,41.945188]},"n2538":{"id":"n2538","loc":[-85.633078,41.945127]},"n2539":{"id":"n2539","loc":[-85.633066,41.94508]},"n254":{"id":"n254","loc":[-85.636732,41.941509]},"n2540":{"id":"n2540","loc":[-85.633222,41.945358]},"n2541":{"id":"n2541","loc":[-85.633425,41.945541]},"n2542":{"id":"n2542","loc":[-85.63299,41.9455]},"n2543":{"id":"n2543","loc":[-85.634374,41.944327]},"n2544":{"id":"n2544","loc":[-85.633648,41.943697]},"n2545":{"id":"n2545","loc":[-85.633533,41.943764]},"n2546":{"id":"n2546","loc":[-85.634239,41.944417]},"n2547":{"id":"n2547","loc":[-85.634122,41.944395]},"n2548":{"id":"n2548","loc":[-85.634235,41.944326]},"n2549":{"id":"n2549","loc":[-85.633613,41.943787]},"n255":{"id":"n255","loc":[-85.636731,41.941461]},"n2550":{"id":"n2550","loc":[-85.633915,41.943613]},"n2551":{"id":"n2551","loc":[-85.634015,41.943555]},"n2552":{"id":"n2552","loc":[-85.63433,41.943839]},"n2553":{"id":"n2553","loc":[-85.634236,41.943894]},"n2554":{"id":"n2554","loc":[-85.635413,41.946052]},"n2555":{"id":"n2555","loc":[-85.635405,41.94569]},"n2556":{"id":"n2556","loc":[-85.635684,41.945925]},"n2557":{"id":"n2557","loc":[-85.635614,41.945742]},"n2558":{"id":"n2558","loc":[-85.635401,41.945745]},"n2559":{"id":"n2559","loc":[-85.635406,41.945928]},"n256":{"id":"n256","loc":[-85.636799,41.941461]},"n2560":{"id":"n2560","loc":[-85.633478,41.943663]},"n2561":{"id":"n2561","loc":[-85.633291,41.943526]},"n2562":{"id":"n2562","loc":[-85.633094,41.943541]},"n2563":{"id":"n2563","loc":[-85.633302,41.943492]},"n2564":{"id":"n2564","loc":[-85.633047,41.943623]},"n2565":{"id":"n2565","loc":[-85.633275,41.943562]},"n2566":{"id":"n2566","loc":[-85.633351,41.943518]},"n2567":{"id":"n2567","loc":[-85.633224,41.9434]},"n2568":{"id":"n2568","loc":[-85.633235,41.943369]},"n2569":{"id":"n2569","loc":[-85.635179,41.943911]},"n257":{"id":"n257","loc":[-85.6368,41.9415]},"n2570":{"id":"n2570","loc":[-85.635146,41.943918]},"n2571":{"id":"n2571","loc":[-85.634888,41.943905]},"n2572":{"id":"n2572","loc":[-85.634832,41.943911]},"n2573":{"id":"n2573","loc":[-85.634638,41.944007]},"n2574":{"id":"n2574","loc":[-85.634568,41.94405]},"n2575":{"id":"n2575","loc":[-85.635994,41.94501]},"n2576":{"id":"n2576","loc":[-85.636388,41.944608]},"n2577":{"id":"n2577","loc":[-85.636215,41.944787]},"n2578":{"id":"n2578","loc":[-85.637948,41.944587]},"n2579":{"id":"n2579","loc":[-85.637849,41.944567]},"n258":{"id":"n258","loc":[-85.636814,41.9415]},"n2580":{"id":"n2580","loc":[-85.637895,41.944455]},"n2581":{"id":"n2581","loc":[-85.637996,41.944477]},"n2582":{"id":"n2582","loc":[-85.635525,41.94337]},"n2583":{"id":"n2583","loc":[-85.637847,41.943923]},"n2584":{"id":"n2584","loc":[-85.637891,41.944124]},"n2585":{"id":"n2585","loc":[-85.638167,41.944229]},"n2586":{"id":"n2586","loc":[-85.638236,41.944097]},"n2587":{"id":"n2587","loc":[-85.638207,41.944025]},"n2588":{"id":"n2588","loc":[-85.638141,41.943997]},"n2589":{"id":"n2589","loc":[-85.638057,41.944015]},"n259":{"id":"n259","loc":[-85.636815,41.941538]},"n2590":{"id":"n2590","loc":[-85.637902,41.944231]},"n2591":{"id":"n2591","loc":[-85.638134,41.944307]},"n2592":{"id":"n2592","loc":[-85.638242,41.944294]},"n2593":{"id":"n2593","loc":[-85.638274,41.944222]},"n2594":{"id":"n2594","loc":[-85.638236,41.944174]},"n2595":{"id":"n2595","loc":[-85.638207,41.944157]},"n2596":{"id":"n2596","loc":[-85.637818,41.943984]},"n2597":{"id":"n2597","loc":[-85.634996,41.944439]},"n2598":{"id":"n2598","loc":[-85.633946,41.945804]},"n2599":{"id":"n2599","loc":[-85.634102,41.945864]},"n26":{"id":"n26","loc":[-85.634346,41.942744]},"n260":{"id":"n260","loc":[-85.636827,41.941538]},"n2600":{"id":"n2600","loc":[-85.633819,41.945756]},"n2601":{"id":"n2601","loc":[-85.634025,41.945975]},"n2602":{"id":"n2602","loc":[-85.633742,41.945867]},"n2603":{"id":"n2603","loc":[-85.63373,41.946004]},"n2604":{"id":"n2604","loc":[-85.633947,41.946081]},"n2605":{"id":"n2605","loc":[-85.633872,41.945917]},"n2606":{"id":"n2606","loc":[-85.633825,41.945985]},"n2607":{"id":"n2607","loc":[-85.633762,41.94596]},"n2608":{"id":"n2608","loc":[-85.634224,41.946037]},"n2609":{"id":"n2609","loc":[-85.634357,41.945851]},"n261":{"id":"n261","loc":[-85.636828,41.941584]},"n2610":{"id":"n2610","loc":[-85.634398,41.945813]},"n2611":{"id":"n2611","loc":[-85.634461,41.945812]},"n2612":{"id":"n2612","loc":[-85.634501,41.945852]},"n2613":{"id":"n2613","loc":[-85.634503,41.94597]},"n2614":{"id":"n2614","loc":[-85.634462,41.945971]},"n2615":{"id":"n2615","loc":[-85.634465,41.946036]},"n2616":{"id":"n2616","loc":[-85.634235,41.946072]},"n2617":{"id":"n2617","loc":[-85.634447,41.946036]},"n2618":{"id":"n2618","loc":[-85.634448,41.946052]},"n2619":{"id":"n2619","loc":[-85.634494,41.946051]},"n262":{"id":"n262","loc":[-85.636819,41.941585]},"n2620":{"id":"n2620","loc":[-85.634497,41.946144]},"n2621":{"id":"n2621","loc":[-85.634453,41.946144]},"n2622":{"id":"n2622","loc":[-85.634454,41.94616]},"n2623":{"id":"n2623","loc":[-85.634393,41.946161]},"n2624":{"id":"n2624","loc":[-85.634394,41.94618]},"n2625":{"id":"n2625","loc":[-85.634345,41.94618]},"n2626":{"id":"n2626","loc":[-85.634344,41.946162]},"n2627":{"id":"n2627","loc":[-85.63427,41.946163]},"n2628":{"id":"n2628","loc":[-85.634266,41.946071]},"n2629":{"id":"n2629","loc":[-85.634148,41.946163]},"n263":{"id":"n263","loc":[-85.636854,41.941714]},"n2630":{"id":"n2630","loc":[-85.634213,41.946072]},"n2631":{"id":"n2631","loc":[-85.633293,41.946309]},"n2632":{"id":"n2632","loc":[-85.633122,41.946239]},"n2633":{"id":"n2633","loc":[-85.633295,41.946005]},"n2634":{"id":"n2634","loc":[-85.633395,41.946047]},"n2635":{"id":"n2635","loc":[-85.633404,41.946035]},"n2636":{"id":"n2636","loc":[-85.633459,41.946057]},"n2637":{"id":"n2637","loc":[-85.633387,41.946154]},"n2638":{"id":"n2638","loc":[-85.633403,41.946161]},"n2639":{"id":"n2639","loc":[-85.634176,41.946415]},"n264":{"id":"n264","loc":[-85.636855,41.941774]},"n2640":{"id":"n2640","loc":[-85.634179,41.946339]},"n2641":{"id":"n2641","loc":[-85.634455,41.946345]},"n2642":{"id":"n2642","loc":[-85.634452,41.946422]},"n2643":{"id":"n2643","loc":[-85.63437,41.946421]},"n2644":{"id":"n2644","loc":[-85.634367,41.946497]},"n2645":{"id":"n2645","loc":[-85.634289,41.946495]},"n2646":{"id":"n2646","loc":[-85.634291,41.946448]},"n2647":{"id":"n2647","loc":[-85.634269,41.946448]},"n2648":{"id":"n2648","loc":[-85.63427,41.946417]},"n2649":{"id":"n2649","loc":[-85.63484,41.946328]},"n265":{"id":"n265","loc":[-85.636822,41.941774]},"n2650":{"id":"n2650","loc":[-85.634839,41.946187]},"n2651":{"id":"n2651","loc":[-85.635148,41.946186]},"n2652":{"id":"n2652","loc":[-85.635148,41.946216]},"n2653":{"id":"n2653","loc":[-85.63521,41.946216]},"n2654":{"id":"n2654","loc":[-85.63521,41.946348]},"n2655":{"id":"n2655","loc":[-85.635154,41.946348]},"n2656":{"id":"n2656","loc":[-85.635153,41.946327]},"n2657":{"id":"n2657","loc":[-85.634037,41.946957]},"n2658":{"id":"n2658","loc":[-85.634253,41.946953]},"n2659":{"id":"n2659","loc":[-85.63481,41.946543]},"n266":{"id":"n266","loc":[-85.636822,41.941778]},"n2660":{"id":"n2660","loc":[-85.634809,41.946459]},"n2661":{"id":"n2661","loc":[-85.635154,41.946458]},"n2662":{"id":"n2662","loc":[-85.635155,41.946554]},"n2663":{"id":"n2663","loc":[-85.635022,41.946547]},"n2664":{"id":"n2664","loc":[-85.635022,41.946573]},"n2665":{"id":"n2665","loc":[-85.634909,41.946574]},"n2666":{"id":"n2666","loc":[-85.634909,41.946561]},"n2667":{"id":"n2667","loc":[-85.634896,41.947159]},"n2668":{"id":"n2668","loc":[-85.634894,41.947032]},"n2669":{"id":"n2669","loc":[-85.635024,41.947031]},"n267":{"id":"n267","loc":[-85.636756,41.941779]},"n2670":{"id":"n2670","loc":[-85.635026,41.947158]},"n2671":{"id":"n2671","loc":[-85.635233,41.947105]},"n2672":{"id":"n2672","loc":[-85.635236,41.946991]},"n2673":{"id":"n2673","loc":[-85.635369,41.946993]},"n2674":{"id":"n2674","loc":[-85.635366,41.947107]},"n2675":{"id":"n2675","loc":[-85.634824,41.946929]},"n2676":{"id":"n2676","loc":[-85.634825,41.946818]},"n2677":{"id":"n2677","loc":[-85.63512,41.946819]},"n2678":{"id":"n2678","loc":[-85.635119,41.94693]},"n2679":{"id":"n2679","loc":[-85.634796,41.946806]},"n268":{"id":"n268","loc":[-85.636756,41.941774]},"n2680":{"id":"n2680","loc":[-85.634792,41.946604]},"n2681":{"id":"n2681","loc":[-85.634948,41.946602]},"n2682":{"id":"n2682","loc":[-85.634949,41.946645]},"n2683":{"id":"n2683","loc":[-85.634975,41.946644]},"n2684":{"id":"n2684","loc":[-85.634974,41.946599]},"n2685":{"id":"n2685","loc":[-85.635117,41.946598]},"n2686":{"id":"n2686","loc":[-85.635122,41.946801]},"n2687":{"id":"n2687","loc":[-85.634981,41.946803]},"n2688":{"id":"n2688","loc":[-85.634979,41.946752]},"n2689":{"id":"n2689","loc":[-85.634952,41.946752]},"n269":{"id":"n269","loc":[-85.636721,41.941774]},"n2690":{"id":"n2690","loc":[-85.634953,41.946804]},"n2691":{"id":"n2691","loc":[-85.634649,41.946841]},"n2692":{"id":"n2692","loc":[-85.634331,41.94684]},"n2693":{"id":"n2693","loc":[-85.634183,41.946809]},"n2694":{"id":"n2694","loc":[-85.633699,41.946607]},"n2695":{"id":"n2695","loc":[-85.634487,41.946664]},"n2696":{"id":"n2696","loc":[-85.634486,41.946598]},"n2697":{"id":"n2697","loc":[-85.63423,41.946599]},"n2698":{"id":"n2698","loc":[-85.634231,41.946662]},"n2699":{"id":"n2699","loc":[-85.634284,41.946662]},"n27":{"id":"n27","loc":[-85.634136,41.943183]},"n270":{"id":"n270","loc":[-85.63672,41.941714]},"n2700":{"id":"n2700","loc":[-85.634284,41.946679]},"n2701":{"id":"n2701","loc":[-85.634365,41.946679]},"n2702":{"id":"n2702","loc":[-85.634365,41.946664]},"n2703":{"id":"n2703","loc":[-85.635443,41.947015]},"n2704":{"id":"n2704","loc":[-85.635442,41.946801]},"n2705":{"id":"n2705","loc":[-85.63603,41.9468]},"n2706":{"id":"n2706","loc":[-85.636028,41.947016]},"n2707":{"id":"n2707","loc":[-85.635457,41.946582]},"n2708":{"id":"n2708","loc":[-85.635455,41.946211]},"n2709":{"id":"n2709","loc":[-85.635636,41.946579]},"n271":{"id":"n271","loc":[-85.636767,41.941713]},"n2710":{"id":"n2710","loc":[-85.635716,41.9468]},"n2711":{"id":"n2711","loc":[-85.635969,41.9468]},"n2712":{"id":"n2712","loc":[-85.635973,41.946295]},"n2713":{"id":"n2713","loc":[-85.636019,41.946484]},"n2714":{"id":"n2714","loc":[-85.636022,41.946388]},"n2715":{"id":"n2715","loc":[-85.635961,41.946493]},"n2716":{"id":"n2716","loc":[-85.635713,41.94621]},"n2717":{"id":"n2717","loc":[-85.635416,41.946142]},"n2718":{"id":"n2718","loc":[-85.635759,41.946203]},"n2719":{"id":"n2719","loc":[-85.636153,41.946747]},"n272":{"id":"n272","loc":[-85.636767,41.941706]},"n2720":{"id":"n2720","loc":[-85.635417,41.946915]},"n2721":{"id":"n2721","loc":[-85.636154,41.946915]},"n2722":{"id":"n2722","loc":[-85.635866,41.946473]},"n2723":{"id":"n2723","loc":[-85.635717,41.946633]},"n2724":{"id":"n2724","loc":[-85.635556,41.946166]},"n2725":{"id":"n2725","loc":[-85.63556,41.946556]},"n2726":{"id":"n2726","loc":[-85.635731,41.946594]},"n2727":{"id":"n2727","loc":[-85.635866,41.946595]},"n2728":{"id":"n2728","loc":[-85.635456,41.947028]},"n2729":{"id":"n2729","loc":[-85.635796,41.947023]},"n273":{"id":"n273","loc":[-85.636779,41.941698]},"n2730":{"id":"n2730","loc":[-85.635798,41.947091]},"n2731":{"id":"n2731","loc":[-85.63573,41.947092]},"n2732":{"id":"n2732","loc":[-85.635733,41.947233]},"n2733":{"id":"n2733","loc":[-85.636283,41.946863]},"n2734":{"id":"n2734","loc":[-85.63628,41.946706]},"n2735":{"id":"n2735","loc":[-85.636341,41.946705]},"n2736":{"id":"n2736","loc":[-85.636273,41.946584]},"n2737":{"id":"n2737","loc":[-85.636396,41.946545]},"n2738":{"id":"n2738","loc":[-85.636474,41.946684]},"n2739":{"id":"n2739","loc":[-85.636511,41.946861]},"n274":{"id":"n274","loc":[-85.636798,41.941697]},"n2740":{"id":"n2740","loc":[-85.633713,41.947184]},"n2741":{"id":"n2741","loc":[-85.633651,41.94716]},"n2742":{"id":"n2742","loc":[-85.633704,41.947085]},"n2743":{"id":"n2743","loc":[-85.6336,41.947044]},"n2744":{"id":"n2744","loc":[-85.633506,41.947177]},"n2745":{"id":"n2745","loc":[-85.629586,41.952469]},"n2746":{"id":"n2746","loc":[-85.634723,41.953681]},"n2747":{"id":"n2747","loc":[-85.63478,41.959007]},"n2748":{"id":"n2748","loc":[-85.632793,41.94405],"tags":{"highway":"traffic_signals","traffic_signals":"signal","traffic_signals:direction":"both"}},"n2749":{"id":"n2749","loc":[-85.634648,41.947325]},"n275":{"id":"n275","loc":[-85.63681,41.941705]},"n2750":{"id":"n2750","loc":[-85.625078,41.952097]},"n2751":{"id":"n2751","loc":[-85.633195,41.94734]},"n2752":{"id":"n2752","loc":[-85.626447,41.957168]},"n2753":{"id":"n2753","loc":[-85.632023,41.949012]},"n2754":{"id":"n2754","loc":[-85.630835,41.950656]},"n2755":{"id":"n2755","loc":[-85.634655,41.948612]},"n2756":{"id":"n2756","loc":[-85.636182,41.948605]},"n2757":{"id":"n2757","loc":[-85.634729,41.954667]},"n2758":{"id":"n2758","loc":[-85.634686,41.951159]},"n2759":{"id":"n2759","loc":[-85.636206,41.951146]},"n276":{"id":"n276","loc":[-85.63681,41.941714]},"n2760":{"id":"n2760","loc":[-85.634668,41.949891]},"n2761":{"id":"n2761","loc":[-85.634701,41.952422]},"n2762":{"id":"n2762","loc":[-85.634747,41.955907]},"n2763":{"id":"n2763","loc":[-85.627975,41.954695]},"n2764":{"id":"n2764","loc":[-85.626832,41.954698]},"n2765":{"id":"n2765","loc":[-85.632278,41.948624]},"n2766":{"id":"n2766","loc":[-85.628639,41.953725]},"n2767":{"id":"n2767","loc":[-85.636233,41.95241]},"n2768":{"id":"n2768","loc":[-85.631385,41.949913]},"n2769":{"id":"n2769","loc":[-85.630486,41.951194]},"n277":{"id":"n277","loc":[-85.636861,41.942041]},"n2770":{"id":"n2770","loc":[-85.624937,41.952088]},"n2771":{"id":"n2771","loc":[-85.624945,41.952022]},"n2772":{"id":"n2772","loc":[-85.636162,41.94731]},"n2773":{"id":"n2773","loc":[-85.636188,41.949881]},"n2774":{"id":"n2774","loc":[-85.631422,41.948294]},"n2775":{"id":"n2775","loc":[-85.632844,41.945547]},"n2776":{"id":"n2776","loc":[-85.632484,41.945344]},"n2777":{"id":"n2777","loc":[-85.631775,41.944636]},"n2778":{"id":"n2778","loc":[-85.632656,41.945471]},"n2779":{"id":"n2779","loc":[-85.631959,41.944827]},"n278":{"id":"n278","loc":[-85.636862,41.942099]},"n2780":{"id":"n2780","loc":[-85.631679,41.94438]},"n2781":{"id":"n2781","loc":[-85.625129,41.959272]},"n2782":{"id":"n2782","loc":[-85.632446,41.944861]},"n2783":{"id":"n2783","loc":[-85.632804,41.945477]},"n2784":{"id":"n2784","loc":[-85.632255,41.944962]},"n2785":{"id":"n2785","loc":[-85.632736,41.944757]},"n2786":{"id":"n2786","loc":[-85.632543,41.94486]},"n2787":{"id":"n2787","loc":[-85.632889,41.945561]},"n2788":{"id":"n2788","loc":[-85.632091,41.944949]},"n2789":{"id":"n2789","loc":[-85.632537,41.944713]},"n279":{"id":"n279","loc":[-85.636807,41.942099]},"n2790":{"id":"n2790","loc":[-85.632279,41.94485]},"n2791":{"id":"n2791","loc":[-85.632749,41.943247]},"n2792":{"id":"n2792","loc":[-85.632824,41.943152]},"n2793":{"id":"n2793","loc":[-85.632929,41.94317]},"n2794":{"id":"n2794","loc":[-85.632897,41.943078]},"n2795":{"id":"n2795","loc":[-85.632626,41.943231]},"n2796":{"id":"n2796","loc":[-85.634048,41.947257]},"n2797":{"id":"n2797","loc":[-85.634264,41.947252]},"n2798":{"id":"n2798","loc":[-85.635418,41.947317]},"n2799":{"id":"n2799","loc":[-85.635461,41.947237]},"n28":{"id":"n28","loc":[-85.63821,41.944308]},"n280":{"id":"n280","loc":[-85.636807,41.942126]},"n2800":{"id":"n2800","loc":[-85.632868,41.946229]},"n2801":{"id":"n2801","loc":[-85.633673,41.947242]},"n2802":{"id":"n2802","loc":[-85.623604,41.945881],"tags":{"amenity":"school","name":"Barrows School"}},"n2803":{"id":"n2803","loc":[-85.627401,41.943496]},"n2804":{"id":"n2804","loc":[-85.627403,41.943625]},"n2805":{"id":"n2805","loc":[-85.626409,41.943215]},"n2806":{"id":"n2806","loc":[-85.624884,41.943508]},"n2807":{"id":"n2807","loc":[-85.625191,41.943509]},"n2808":{"id":"n2808","loc":[-85.624882,41.94382]},"n2809":{"id":"n2809","loc":[-85.624893,41.945618]},"n281":{"id":"n281","loc":[-85.636726,41.942126]},"n2810":{"id":"n2810","loc":[-85.624912,41.946524]},"n2811":{"id":"n2811","loc":[-85.622721,41.946535]},"n2812":{"id":"n2812","loc":[-85.627399,41.94469]},"n2813":{"id":"n2813","loc":[-85.622716,41.945622]},"n2814":{"id":"n2814","loc":[-85.624886,41.944724]},"n2815":{"id":"n2815","loc":[-85.622674,41.944737]},"n2816":{"id":"n2816","loc":[-85.625092,41.945063]},"n2817":{"id":"n2817","loc":[-85.625233,41.945064]},"n2818":{"id":"n2818","loc":[-85.625229,41.944871]},"n2819":{"id":"n2819","loc":[-85.625066,41.944871]},"n282":{"id":"n282","loc":[-85.636726,41.942098]},"n2820":{"id":"n2820","loc":[-85.625024,41.944901]},"n2821":{"id":"n2821","loc":[-85.625025,41.944924]},"n2822":{"id":"n2822","loc":[-85.625087,41.944926]},"n2823":{"id":"n2823","loc":[-85.625349,41.944506]},"n2824":{"id":"n2824","loc":[-85.625347,41.944388]},"n2825":{"id":"n2825","loc":[-85.625152,41.94439]},"n2826":{"id":"n2826","loc":[-85.625152,41.944431]},"n2827":{"id":"n2827","loc":[-85.625134,41.944431]},"n2828":{"id":"n2828","loc":[-85.625136,41.944508]},"n2829":{"id":"n2829","loc":[-85.623236,41.946341]},"n283":{"id":"n283","loc":[-85.636708,41.942098]},"n2830":{"id":"n2830","loc":[-85.623241,41.946067]},"n2831":{"id":"n2831","loc":[-85.623207,41.946067]},"n2832":{"id":"n2832","loc":[-85.623212,41.945827]},"n2833":{"id":"n2833","loc":[-85.622981,41.945825]},"n2834":{"id":"n2834","loc":[-85.622976,41.946063]},"n2835":{"id":"n2835","loc":[-85.623006,41.946063]},"n2836":{"id":"n2836","loc":[-85.623002,41.946256]},"n2837":{"id":"n2837","loc":[-85.623075,41.946256]},"n2838":{"id":"n2838","loc":[-85.623074,41.946339]},"n2839":{"id":"n2839","loc":[-85.624574,41.951755]},"n284":{"id":"n284","loc":[-85.636708,41.942041]},"n2840":{"id":"n2840","loc":[-85.62498,41.951844]},"n2841":{"id":"n2841","loc":[-85.625086,41.95188]},"n2842":{"id":"n2842","loc":[-85.625135,41.951922]},"n2843":{"id":"n2843","loc":[-85.615273,41.945637]},"n2844":{"id":"n2844","loc":[-85.620172,41.945627]},"n2845":{"id":"n2845","loc":[-85.625167,41.951985]},"n2846":{"id":"n2846","loc":[-85.622741,41.947437]},"n2847":{"id":"n2847","loc":[-85.624907,41.947428]},"n2848":{"id":"n2848","loc":[-85.627046,41.940995]},"n2849":{"id":"n2849","loc":[-85.627295,41.941304]},"n285":{"id":"n285","loc":[-85.635618,41.941852]},"n2850":{"id":"n2850","loc":[-85.627352,41.94148]},"n2851":{"id":"n2851","loc":[-85.62737,41.942261]},"n2852":{"id":"n2852","loc":[-85.6264,41.942263]},"n2853":{"id":"n2853","loc":[-85.622769,41.949228]},"n2854":{"id":"n2854","loc":[-85.624937,41.949218]},"n2855":{"id":"n2855","loc":[-85.630001,41.944664]},"n2856":{"id":"n2856","loc":[-85.624873,41.942022]},"n2857":{"id":"n2857","loc":[-85.622761,41.948333]},"n2858":{"id":"n2858","loc":[-85.624924,41.948334]},"n2859":{"id":"n2859","loc":[-85.620051,41.94383]},"n286":{"id":"n286","loc":[-85.635621,41.94202]},"n2860":{"id":"n2860","loc":[-85.627629,41.946498]},"n2861":{"id":"n2861","loc":[-85.622757,41.950111]},"n2862":{"id":"n2862","loc":[-85.623685,41.954624]},"n2863":{"id":"n2863","loc":[-85.621459,41.944756]},"n2864":{"id":"n2864","loc":[-85.628637,41.944676]},"n2865":{"id":"n2865","loc":[-85.630125,41.944654]},"n2866":{"id":"n2866","loc":[-85.625196,41.952097]},"n2867":{"id":"n2867","loc":[-85.630257,41.944637]},"n2868":{"id":"n2868","loc":[-85.631247,41.944459]},"n2869":{"id":"n2869","loc":[-85.624867,41.94159]},"n287":{"id":"n287","loc":[-85.63524,41.942023]},"n2870":{"id":"n2870","loc":[-85.624958,41.950343]},"n2871":{"id":"n2871","loc":[-85.624948,41.950484]},"n2872":{"id":"n2872","loc":[-85.624813,41.950983]},"n2873":{"id":"n2873","loc":[-85.624723,41.951789]},"n2874":{"id":"n2874","loc":[-85.624262,41.9512]},"n2875":{"id":"n2875","loc":[-85.62414,41.951201]},"n2876":{"id":"n2876","loc":[-85.624139,41.95112]},"n2877":{"id":"n2877","loc":[-85.628481,41.945611]},"n2878":{"id":"n2878","loc":[-85.620072,41.946538]},"n2879":{"id":"n2879","loc":[-85.622763,41.95099]},"n288":{"id":"n288","loc":[-85.635237,41.941855]},"n2880":{"id":"n2880","loc":[-85.62814,41.946963]},"n2881":{"id":"n2881","loc":[-85.628245,41.947031]},"n2882":{"id":"n2882","loc":[-85.628331,41.947066]},"n2883":{"id":"n2883","loc":[-85.629722,41.944444],"tags":{"leisure":"park","name":"Scouter Park"}},"n2884":{"id":"n2884","loc":[-85.629977,41.943907]},"n2885":{"id":"n2885","loc":[-85.629947,41.943775]},"n2886":{"id":"n2886","loc":[-85.629899,41.943625]},"n2887":{"id":"n2887","loc":[-85.632286,41.944257]},"n2888":{"id":"n2888","loc":[-85.632523,41.944179]},"n2889":{"id":"n2889","loc":[-85.632141,41.944293]},"n289":{"id":"n289","loc":[-85.635568,41.940475]},"n2890":{"id":"n2890","loc":[-85.631571,41.9444]},"n2891":{"id":"n2891","loc":[-85.643236,41.941895]},"n2892":{"id":"n2892","loc":[-85.62865,41.945353]},"n2893":{"id":"n2893","loc":[-85.628594,41.945481]},"n2894":{"id":"n2894","loc":[-85.628581,41.947169]},"n2895":{"id":"n2895","loc":[-85.631843,41.943793]},"n2896":{"id":"n2896","loc":[-85.632299,41.943472]},"n2897":{"id":"n2897","loc":[-85.631519,41.944881]},"n2898":{"id":"n2898","loc":[-85.628429,41.947219]},"n2899":{"id":"n2899","loc":[-85.63145,41.945162]},"n29":{"id":"n29","loc":[-85.637963,41.944263]},"n290":{"id":"n290","loc":[-85.634584,41.940477]},"n2900":{"id":"n2900","loc":[-85.630939,41.945519]},"n2901":{"id":"n2901","loc":[-85.62903,41.945719]},"n2902":{"id":"n2902","loc":[-85.630521,41.945559]},"n2903":{"id":"n2903","loc":[-85.629294,41.945585]},"n2904":{"id":"n2904","loc":[-85.629845,41.945543]},"n2905":{"id":"n2905","loc":[-85.631497,41.944625]},"n2906":{"id":"n2906","loc":[-85.630281,41.945553]},"n2907":{"id":"n2907","loc":[-85.628553,41.946973]},"n2908":{"id":"n2908","loc":[-85.631383,41.945338]},"n2909":{"id":"n2909","loc":[-85.628843,41.946103]},"n291":{"id":"n291","loc":[-85.634583,41.940203]},"n2910":{"id":"n2910","loc":[-85.631193,41.945473]},"n2911":{"id":"n2911","loc":[-85.628897,41.945944]},"n2912":{"id":"n2912","loc":[-85.628789,41.946454]},"n2913":{"id":"n2913","loc":[-85.632548,41.944563]},"n2914":{"id":"n2914","loc":[-85.627527,41.944555]},"n2915":{"id":"n2915","loc":[-85.62752,41.943726]},"n2916":{"id":"n2916","loc":[-85.627894,41.943723]},"n2917":{"id":"n2917","loc":[-85.627897,41.943919]},"n2918":{"id":"n2918","loc":[-85.627991,41.943934]},"n2919":{"id":"n2919","loc":[-85.628082,41.943966]},"n292":{"id":"n292","loc":[-85.635567,41.940201]},"n2920":{"id":"n2920","loc":[-85.628177,41.944015]},"n2921":{"id":"n2921","loc":[-85.628193,41.944048]},"n2922":{"id":"n2922","loc":[-85.628167,41.944054]},"n2923":{"id":"n2923","loc":[-85.628193,41.944094]},"n2924":{"id":"n2924","loc":[-85.628213,41.944144]},"n2925":{"id":"n2925","loc":[-85.628214,41.944199]},"n2926":{"id":"n2926","loc":[-85.62833,41.944196]},"n2927":{"id":"n2927","loc":[-85.628328,41.944262]},"n2928":{"id":"n2928","loc":[-85.628173,41.944262]},"n2929":{"id":"n2929","loc":[-85.628171,41.944293]},"n293":{"id":"n293","loc":[-85.635816,41.942673],"tags":{"crossing":"zebra","highway":"crossing"}},"n2930":{"id":"n2930","loc":[-85.628039,41.944296]},"n2931":{"id":"n2931","loc":[-85.62804,41.944329]},"n2932":{"id":"n2932","loc":[-85.627829,41.944335]},"n2933":{"id":"n2933","loc":[-85.627835,41.94455]},"n2936":{"id":"n2936","loc":[-85.632823,41.945994]},"n294":{"id":"n294","loc":[-85.635696,41.942712]},"n2940":{"id":"n2940","loc":[-85.632192,41.945973]},"n2941":{"id":"n2941","loc":[-85.63226,41.94587]},"n2942":{"id":"n2942","loc":[-85.632721,41.946036]},"n2943":{"id":"n2943","loc":[-85.632641,41.946142]},"n2944":{"id":"n2944","loc":[-85.62937,41.947467]},"n2945":{"id":"n2945","loc":[-85.62959,41.942936]},"n2946":{"id":"n2946","loc":[-85.629551,41.94284]},"n2947":{"id":"n2947","loc":[-85.629501,41.942704]},"n2948":{"id":"n2948","loc":[-85.629472,41.942578]},"n2949":{"id":"n2949","loc":[-85.629361,41.941801]},"n295":{"id":"n295","loc":[-85.635679,41.941962]},"n2950":{"id":"n2950","loc":[-85.629339,41.941716]},"n2951":{"id":"n2951","loc":[-85.629315,41.94166]},"n2952":{"id":"n2952","loc":[-85.629279,41.941602]},"n2953":{"id":"n2953","loc":[-85.629227,41.941556]},"n2954":{"id":"n2954","loc":[-85.624261,41.95112]},"n2955":{"id":"n2955","loc":[-85.629153,41.941524]},"n2956":{"id":"n2956","loc":[-85.626904,41.941098]},"n2957":{"id":"n2957","loc":[-85.624588,41.951294]},"n2958":{"id":"n2958","loc":[-85.631844,41.942945]},"n2959":{"id":"n2959","loc":[-85.625854,41.949222]},"n296":{"id":"n296","loc":[-85.635672,41.941337]},"n2960":{"id":"n2960","loc":[-85.625146,41.955238]},"n2961":{"id":"n2961","loc":[-85.626745,41.948296]},"n2962":{"id":"n2962","loc":[-85.625721,41.95524]},"n2963":{"id":"n2963","loc":[-85.624706,41.952317]},"n2964":{"id":"n2964","loc":[-85.62609,41.956147]},"n2965":{"id":"n2965","loc":[-85.624401,41.954928]},"n2966":{"id":"n2966","loc":[-85.626558,41.955367]},"n2967":{"id":"n2967","loc":[-85.62468,41.955096]},"n2968":{"id":"n2968","loc":[-85.624159,41.953929]},"n2969":{"id":"n2969","loc":[-85.62506,41.951113]},"n297":{"id":"n297","loc":[-85.635658,41.941284]},"n2970":{"id":"n2970","loc":[-85.624942,41.951591]},"n2971":{"id":"n2971","loc":[-85.627399,41.947546]},"n2972":{"id":"n2972","loc":[-85.627695,41.947404]},"n2973":{"id":"n2973","loc":[-85.625925,41.94896]},"n2974":{"id":"n2974","loc":[-85.625725,41.950211]},"n2975":{"id":"n2975","loc":[-85.627008,41.947963]},"n2976":{"id":"n2976","loc":[-85.624373,41.953458]},"n2977":{"id":"n2977","loc":[-85.624137,41.954392]},"n2978":{"id":"n2978","loc":[-85.628257,41.947307]},"n2979":{"id":"n2979","loc":[-85.625281,41.95066]},"n298":{"id":"n298","loc":[-85.635602,41.941166]},"n2980":{"id":"n2980","loc":[-85.625865,41.949804]},"n2981":{"id":"n2981","loc":[-85.626508,41.955932]},"n2982":{"id":"n2982","loc":[-85.626333,41.955216]},"n2983":{"id":"n2983","loc":[-85.626637,41.955676]},"n2984":{"id":"n2984","loc":[-85.624223,41.954599]},"n2985":{"id":"n2985","loc":[-85.626219,41.948671]},"n2986":{"id":"n2986","loc":[-85.624556,41.953043]},"n2987":{"id":"n2987","loc":[-85.625598,41.956302]},"n2988":{"id":"n2988","loc":[-85.624571,41.952971]},"n2989":{"id":"n2989","loc":[-85.627141,41.940727]},"n299":{"id":"n299","loc":[-85.635598,41.941138]},"n2990":{"id":"n2990","loc":[-85.627102,41.939144]},"n2991":{"id":"n2991","loc":[-85.627127,41.940086]},"n2992":{"id":"n2992","loc":[-85.627116,41.940843]},"n2993":{"id":"n2993","loc":[-85.627132,41.9402]},"n2994":{"id":"n2994","loc":[-85.629734,41.940078]},"n2995":{"id":"n2995","loc":[-85.6276,41.937412]},"n2996":{"id":"n2996","loc":[-85.627451,41.937549]},"n2997":{"id":"n2997","loc":[-85.627375,41.937618]},"n2998":{"id":"n2998","loc":[-85.627278,41.937728]},"n2999":{"id":"n2999","loc":[-85.627199,41.937842]},"n3":{"id":"n3","loc":[-85.627345,41.953983]},"n30":{"id":"n30","loc":[-85.637882,41.944205]},"n300":{"id":"n300","loc":[-85.635614,41.941076]},"n3000":{"id":"n3000","loc":[-85.627141,41.937981]},"n3001":{"id":"n3001","loc":[-85.627109,41.938153]},"n3002":{"id":"n3002","loc":[-85.627101,41.938699]},"n3003":{"id":"n3003","loc":[-85.628311,41.942261]},"n3004":{"id":"n3004","loc":[-85.628439,41.940082]},"n3005":{"id":"n3005","loc":[-85.619538,41.942622],"tags":{"leisure":"slipway"}},"n3006":{"id":"n3006","loc":[-85.619872,41.942618]},"n3007":{"id":"n3007","loc":[-85.619755,41.942612]},"n3008":{"id":"n3008","loc":[-85.619647,41.942628]},"n3009":{"id":"n3009","loc":[-85.619415,41.942626]},"n301":{"id":"n301","loc":[-85.635659,41.940956]},"n3010":{"id":"n3010","loc":[-85.619212,41.942623]},"n3011":{"id":"n3011","loc":[-85.631485,41.942472]},"n3012":{"id":"n3012","loc":[-85.630986,41.941786]},"n3013":{"id":"n3013","loc":[-85.631797,41.942006]},"n3014":{"id":"n3014","loc":[-85.630972,41.941162]},"n3015":{"id":"n3015","loc":[-85.631396,41.941611],"tags":{"railway":"level_crossing"}},"n3016":{"id":"n3016","loc":[-85.631878,41.941545]},"n3017":{"id":"n3017","loc":[-85.630461,41.94055]},"n3018":{"id":"n3018","loc":[-85.629751,41.939539],"tags":{"railway":"level_crossing"}},"n3019":{"id":"n3019","loc":[-85.631663,41.941513]},"n302":{"id":"n302","loc":[-85.635666,41.940922]},"n3020":{"id":"n3020","loc":[-85.631328,41.941375]},"n3021":{"id":"n3021","loc":[-85.632554,41.941779]},"n3022":{"id":"n3022","loc":[-85.63245,41.941769]},"n3023":{"id":"n3023","loc":[-85.632475,41.941644]},"n3024":{"id":"n3024","loc":[-85.632581,41.941654]},"n3025":{"id":"n3025","loc":[-85.631957,41.941352]},"n3026":{"id":"n3026","loc":[-85.632293,41.941139]},"n3027":{"id":"n3027","loc":[-85.632315,41.941153]},"n3028":{"id":"n3028","loc":[-85.632302,41.941262]},"n3029":{"id":"n3029","loc":[-85.63237,41.941267]},"n303":{"id":"n303","loc":[-85.635667,41.940877]},"n3030":{"id":"n3030","loc":[-85.632356,41.941538]},"n3031":{"id":"n3031","loc":[-85.632134,41.941678]},"n3032":{"id":"n3032","loc":[-85.631942,41.941687]},"n3033":{"id":"n3033","loc":[-85.63203,41.941694]},"n3034":{"id":"n3034","loc":[-85.632166,41.941555]},"n3035":{"id":"n3035","loc":[-85.632412,41.941416]},"n3036":{"id":"n3036","loc":[-85.63248,41.941342]},"n3037":{"id":"n3037","loc":[-85.632502,41.941259]},"n3038":{"id":"n3038","loc":[-85.632453,41.941161]},"n3039":{"id":"n3039","loc":[-85.63235,41.941103]},"n304":{"id":"n304","loc":[-85.635668,41.940655]},"n3040":{"id":"n3040","loc":[-85.632236,41.941118]},"n3041":{"id":"n3041","loc":[-85.631894,41.941355]},"n3042":{"id":"n3042","loc":[-85.631859,41.941411]},"n3043":{"id":"n3043","loc":[-85.632011,41.941587]},"n3044":{"id":"n3044","loc":[-85.632446,41.941379]},"n3045":{"id":"n3045","loc":[-85.632511,41.941416]},"n3046":{"id":"n3046","loc":[-85.632545,41.941634]},"n3047":{"id":"n3047","loc":[-85.632612,41.94164]},"n3048":{"id":"n3048","loc":[-85.632595,41.942197]},"n3049":{"id":"n3049","loc":[-85.632565,41.942241]},"n305":{"id":"n305","loc":[-85.635628,41.940617]},"n3050":{"id":"n3050","loc":[-85.632515,41.942256]},"n3051":{"id":"n3051","loc":[-85.63245,41.94223]},"n3052":{"id":"n3052","loc":[-85.632401,41.942174]},"n3053":{"id":"n3053","loc":[-85.632391,41.942115]},"n3054":{"id":"n3054","loc":[-85.632029,41.941859]},"n3055":{"id":"n3055","loc":[-85.631828,41.941639]},"n3056":{"id":"n3056","loc":[-85.631829,41.941508]},"n3057":{"id":"n3057","loc":[-85.631281,41.94312]},"n3058":{"id":"n3058","loc":[-85.631421,41.943065]},"n3059":{"id":"n3059","loc":[-85.631339,41.942949]},"n306":{"id":"n306","loc":[-85.635623,41.940272]},"n3060":{"id":"n3060","loc":[-85.631199,41.943004]},"n3061":{"id":"n3061","loc":[-85.631102,41.942931]},"n3062":{"id":"n3062","loc":[-85.631009,41.942809]},"n3063":{"id":"n3063","loc":[-85.631383,41.94265]},"n3064":{"id":"n3064","loc":[-85.631477,41.942773]},"n3065":{"id":"n3065","loc":[-85.630638,41.942809]},"n3066":{"id":"n3066","loc":[-85.630738,41.942943]},"n3067":{"id":"n3067","loc":[-85.630841,41.9429]},"n3068":{"id":"n3068","loc":[-85.630741,41.942766]},"n3069":{"id":"n3069","loc":[-85.63054,41.942603]},"n307":{"id":"n307","loc":[-85.635651,41.940183]},"n3070":{"id":"n3070","loc":[-85.630498,41.942619]},"n3071":{"id":"n3071","loc":[-85.630567,41.942718]},"n3072":{"id":"n3072","loc":[-85.630616,41.942698]},"n3073":{"id":"n3073","loc":[-85.630642,41.94273]},"n3074":{"id":"n3074","loc":[-85.630686,41.942714]},"n3075":{"id":"n3075","loc":[-85.630715,41.942754]},"n3076":{"id":"n3076","loc":[-85.6309,41.942681]},"n3077":{"id":"n3077","loc":[-85.630843,41.942605]},"n3078":{"id":"n3078","loc":[-85.6309,41.942581]},"n3079":{"id":"n3079","loc":[-85.630832,41.942487]},"n308":{"id":"n308","loc":[-85.63577,41.940183],"tags":{"crossing":"zebra","highway":"crossing"}},"n3080":{"id":"n3080","loc":[-85.630773,41.942509]},"n3081":{"id":"n3081","loc":[-85.630718,41.942436]},"n3082":{"id":"n3082","loc":[-85.630485,41.942524]},"n3083":{"id":"n3083","loc":[-85.631468,41.941233]},"n3084":{"id":"n3084","loc":[-85.631334,41.94114]},"n3085":{"id":"n3085","loc":[-85.632052,41.940568]},"n3086":{"id":"n3086","loc":[-85.63219,41.940663]},"n3087":{"id":"n3087","loc":[-85.631323,41.940834]},"n3088":{"id":"n3088","loc":[-85.631122,41.941002]},"n3089":{"id":"n3089","loc":[-85.631321,41.941133]},"n309":{"id":"n309","loc":[-85.636939,41.942544]},"n3090":{"id":"n3090","loc":[-85.631521,41.940966]},"n3091":{"id":"n3091","loc":[-85.631103,41.940253]},"n3092":{"id":"n3092","loc":[-85.631226,41.940211]},"n3093":{"id":"n3093","loc":[-85.631597,41.940805]},"n3094":{"id":"n3094","loc":[-85.631474,41.940847]},"n3095":{"id":"n3095","loc":[-85.631811,41.940534]},"n3096":{"id":"n3096","loc":[-85.631588,41.94061]},"n3097":{"id":"n3097","loc":[-85.631438,41.940366]},"n3098":{"id":"n3098","loc":[-85.631661,41.94029]},"n3099":{"id":"n3099","loc":[-85.630621,41.940041]},"n31":{"id":"n31","loc":[-85.63827,41.944203]},"n310":{"id":"n310","loc":[-85.636323,41.942552]},"n3100":{"id":"n3100","loc":[-85.630436,41.939773]},"n3101":{"id":"n3101","loc":[-85.63059,41.939714]},"n3102":{"id":"n3102","loc":[-85.630775,41.939983]},"n3103":{"id":"n3103","loc":[-85.63047,41.940167]},"n3104":{"id":"n3104","loc":[-85.63013,41.939686]},"n3105":{"id":"n3105","loc":[-85.630302,41.939618]},"n3106":{"id":"n3106","loc":[-85.630641,41.9401]},"n3107":{"id":"n3107","loc":[-85.630966,41.940619]},"n3108":{"id":"n3108","loc":[-85.630874,41.940493]},"n3109":{"id":"n3109","loc":[-85.630933,41.940469]},"n311":{"id":"n311","loc":[-85.636257,41.942555]},"n3110":{"id":"n3110","loc":[-85.630763,41.940236]},"n3111":{"id":"n3111","loc":[-85.63088,41.940189]},"n3112":{"id":"n3112","loc":[-85.631142,41.940548]},"n3113":{"id":"n3113","loc":[-85.630958,41.940871]},"n3114":{"id":"n3114","loc":[-85.630874,41.940778]},"n3115":{"id":"n3115","loc":[-85.631062,41.940684]},"n3116":{"id":"n3116","loc":[-85.631146,41.940777]},"n3117":{"id":"n3117","loc":[-85.632031,41.940575]},"n3118":{"id":"n3118","loc":[-85.631777,41.940186]},"n3119":{"id":"n3119","loc":[-85.631346,41.940179]},"n312":{"id":"n312","loc":[-85.636208,41.942561]},"n3120":{"id":"n3120","loc":[-85.631342,41.94012]},"n3121":{"id":"n3121","loc":[-85.631831,41.940118]},"n3122":{"id":"n3122","loc":[-85.632115,41.940543]},"n3123":{"id":"n3123","loc":[-85.631031,41.941683]},"n3124":{"id":"n3124","loc":[-85.630981,41.941608]},"n3125":{"id":"n3125","loc":[-85.631209,41.941516]},"n3126":{"id":"n3126","loc":[-85.631264,41.941586]},"n3127":{"id":"n3127","loc":[-85.630938,41.94155]},"n3128":{"id":"n3128","loc":[-85.631156,41.941462]},"n3129":{"id":"n3129","loc":[-85.631197,41.94152]},"n313":{"id":"n313","loc":[-85.636159,41.942573]},"n3130":{"id":"n3130","loc":[-85.630895,41.941485]},"n3131":{"id":"n3131","loc":[-85.630824,41.941389]},"n3132":{"id":"n3132","loc":[-85.630986,41.941323]},"n3133":{"id":"n3133","loc":[-85.631057,41.941419]},"n3134":{"id":"n3134","loc":[-85.630777,41.941328]},"n3135":{"id":"n3135","loc":[-85.630907,41.941274]},"n3136":{"id":"n3136","loc":[-85.630953,41.941335]},"n3137":{"id":"n3137","loc":[-85.630797,41.941247]},"n3138":{"id":"n3138","loc":[-85.630701,41.94117]},"n3139":{"id":"n3139","loc":[-85.630829,41.941113]},"n314":{"id":"n314","loc":[-85.635743,41.942881]},"n3140":{"id":"n3140","loc":[-85.6309,41.941201]},"n3141":{"id":"n3141","loc":[-85.630765,41.941206]},"n3142":{"id":"n3142","loc":[-85.630739,41.941218]},"n3143":{"id":"n3143","loc":[-85.630582,41.941039]},"n3144":{"id":"n3144","loc":[-85.630412,41.940818]},"n3145":{"id":"n3145","loc":[-85.630509,41.940777]},"n3146":{"id":"n3146","loc":[-85.630678,41.941004]},"n3147":{"id":"n3147","loc":[-85.630773,41.942166]},"n3148":{"id":"n3148","loc":[-85.630708,41.942074]},"n3149":{"id":"n3149","loc":[-85.630863,41.942013]},"n315":{"id":"n315","loc":[-85.635452,41.942966]},"n3150":{"id":"n3150","loc":[-85.630928,41.942105]},"n3151":{"id":"n3151","loc":[-85.630701,41.942026]},"n3152":{"id":"n3152","loc":[-85.630665,41.941971]},"n3153":{"id":"n3153","loc":[-85.630793,41.941918]},"n3154":{"id":"n3154","loc":[-85.630837,41.94197]},"n3155":{"id":"n3155","loc":[-85.630757,41.941871]},"n3156":{"id":"n3156","loc":[-85.630629,41.941923]},"n3157":{"id":"n3157","loc":[-85.630694,41.941783]},"n3158":{"id":"n3158","loc":[-85.630534,41.941847]},"n3159":{"id":"n3159","loc":[-85.630598,41.941935]},"n316":{"id":"n316","loc":[-85.634911,41.943118]},"n3160":{"id":"n3160","loc":[-85.631548,41.93938]},"n3161":{"id":"n3161","loc":[-85.631525,41.939919]},"n3162":{"id":"n3162","loc":[-85.631648,41.940043]},"n3163":{"id":"n3163","loc":[-85.624586,41.951121]},"n3164":{"id":"n3164","loc":[-85.622139,41.952064]},"n3165":{"id":"n3165","loc":[-85.622141,41.952144]},"n3166":{"id":"n3166","loc":[-85.621977,41.952146]},"n3167":{"id":"n3167","loc":[-85.621978,41.952211]},"n3168":{"id":"n3168","loc":[-85.62191,41.952212]},"n3169":{"id":"n3169","loc":[-85.633628,41.935437]},"n317":{"id":"n317","loc":[-85.634743,41.943167]},"n3170":{"id":"n3170","loc":[-85.632849,41.935518]},"n3171":{"id":"n3171","loc":[-85.632376,41.93574]},"n3172":{"id":"n3172","loc":[-85.631517,41.935897]},"n3173":{"id":"n3173","loc":[-85.630433,41.936124]},"n3174":{"id":"n3174","loc":[-85.630207,41.936427]},"n3175":{"id":"n3175","loc":[-85.630346,41.936795]},"n3176":{"id":"n3176","loc":[-85.62996,41.936974]},"n3177":{"id":"n3177","loc":[-85.629916,41.937488]},"n3178":{"id":"n3178","loc":[-85.629946,41.937802]},"n3179":{"id":"n3179","loc":[-85.629977,41.937905]},"n318":{"id":"n318","loc":[-85.634401,41.94328]},"n3180":{"id":"n3180","loc":[-85.63016,41.937909]},"n3181":{"id":"n3181","loc":[-85.630804,41.937791]},"n3182":{"id":"n3182","loc":[-85.631688,41.937808]},"n3183":{"id":"n3183","loc":[-85.631685,41.938008]},"n3184":{"id":"n3184","loc":[-85.631845,41.938116]},"n3185":{"id":"n3185","loc":[-85.63207,41.938181]},"n3186":{"id":"n3186","loc":[-85.632143,41.938371]},"n3187":{"id":"n3187","loc":[-85.632056,41.938435]},"n3188":{"id":"n3188","loc":[-85.631787,41.938457]},"n3189":{"id":"n3189","loc":[-85.631657,41.938728]},"n319":{"id":"n319","loc":[-85.634345,41.943299]},"n3190":{"id":"n3190","loc":[-85.631595,41.93775]},"n3191":{"id":"n3191","loc":[-85.630264,41.937839]},"n3192":{"id":"n3192","loc":[-85.628591,41.948536]},"n3193":{"id":"n3193","loc":[-85.63205,41.951181]},"n3194":{"id":"n3194","loc":[-85.632034,41.949909]},"n3195":{"id":"n3195","loc":[-85.630841,41.951191]},"n3196":{"id":"n3196","loc":[-85.632083,41.9537]},"n3197":{"id":"n3197","loc":[-85.630929,41.959037]},"n3198":{"id":"n3198","loc":[-85.632151,41.959028]},"n3199":{"id":"n3199","loc":[-85.630911,41.957428]},"n32":{"id":"n32","loc":[-85.638273,41.944246]},"n320":{"id":"n320","loc":[-85.634287,41.943326]},"n3200":{"id":"n3200","loc":[-85.63213,41.957427]},"n3201":{"id":"n3201","loc":[-85.632072,41.952447]},"n3202":{"id":"n3202","loc":[-85.632095,41.954677]},"n3203":{"id":"n3203","loc":[-85.632111,41.955911]},"n3204":{"id":"n3204","loc":[-85.630855,41.952457]},"n3205":{"id":"n3205","loc":[-85.630869,41.953709]},"n3206":{"id":"n3206","loc":[-85.63088,41.954682]},"n3207":{"id":"n3207","loc":[-85.630894,41.955913]},"n3208":{"id":"n3208","loc":[-85.633214,41.948619]},"n3209":{"id":"n3209","loc":[-85.633253,41.951171]},"n321":{"id":"n321","loc":[-85.634233,41.943354]},"n3210":{"id":"n3210","loc":[-85.633234,41.949901]},"n3211":{"id":"n3211","loc":[-85.633922,41.948616]},"n3212":{"id":"n3212","loc":[-85.625188,41.947832]},"n3213":{"id":"n3213","loc":[-85.625208,41.947775]},"n3214":{"id":"n3214","loc":[-85.625229,41.94776]},"n3215":{"id":"n3215","loc":[-85.625201,41.947749]},"n3216":{"id":"n3216","loc":[-85.625168,41.947707]},"n3217":{"id":"n3217","loc":[-85.625171,41.947609]},"n3218":{"id":"n3218","loc":[-85.625213,41.947564]},"n3219":{"id":"n3219","loc":[-85.62529,41.94756]},"n322":{"id":"n322","loc":[-85.634099,41.943429]},"n3220":{"id":"n3220","loc":[-85.625303,41.947533]},"n3221":{"id":"n3221","loc":[-85.625344,41.947482]},"n3222":{"id":"n3222","loc":[-85.625442,41.947468]},"n3223":{"id":"n3223","loc":[-85.62565,41.947494]},"n3224":{"id":"n3224","loc":[-85.625726,41.947613]},"n3225":{"id":"n3225","loc":[-85.625703,41.947728]},"n3226":{"id":"n3226","loc":[-85.625534,41.94781]},"n3227":{"id":"n3227","loc":[-85.625391,41.947822]},"n3228":{"id":"n3228","loc":[-85.625304,41.947859]},"n3229":{"id":"n3229","loc":[-85.625203,41.947885]},"n323":{"id":"n323","loc":[-85.633958,41.943507],"tags":{"highway":"crossing"}},"n3230":{"id":"n3230","loc":[-85.624691,41.948659]},"n3231":{"id":"n3231","loc":[-85.624328,41.948661]},"n3232":{"id":"n3232","loc":[-85.624331,41.949046]},"n3233":{"id":"n3233","loc":[-85.624694,41.949045]},"n3234":{"id":"n3234","loc":[-85.623623,41.949606]},"n3235":{"id":"n3235","loc":[-85.623623,41.9497]},"n3236":{"id":"n3236","loc":[-85.623357,41.9497]},"n3237":{"id":"n3237","loc":[-85.623357,41.949614]},"n3238":{"id":"n3238","loc":[-85.623974,41.949429]},"n3239":{"id":"n3239","loc":[-85.623974,41.949605]},"n324":{"id":"n324","loc":[-85.633698,41.943651],"tags":{"railway":"crossing"}},"n3240":{"id":"n3240","loc":[-85.624501,41.951226]},"n3241":{"id":"n3241","loc":[-85.624501,41.951123]},"n3242":{"id":"n3242","loc":[-85.624319,41.951123]},"n3243":{"id":"n3243","loc":[-85.624319,41.951226]},"n3244":{"id":"n3244","loc":[-85.624121,41.950866]},"n3245":{"id":"n3245","loc":[-85.624115,41.950525]},"n3246":{"id":"n3246","loc":[-85.624315,41.950523]},"n3247":{"id":"n3247","loc":[-85.62432,41.950865]},"n3248":{"id":"n3248","loc":[-85.624393,41.950867]},"n3249":{"id":"n3249","loc":[-85.62439,41.950596]},"n325":{"id":"n325","loc":[-85.633508,41.943757]},"n3250":{"id":"n3250","loc":[-85.624673,41.950594]},"n3251":{"id":"n3251","loc":[-85.624675,41.95082]},"n3252":{"id":"n3252","loc":[-85.62451,41.950821]},"n3253":{"id":"n3253","loc":[-85.62451,41.950866]},"n3254":{"id":"n3254","loc":[-85.624101,41.949346]},"n3255":{"id":"n3255","loc":[-85.624244,41.949346]},"n3256":{"id":"n3256","loc":[-85.624244,41.949368]},"n3257":{"id":"n3257","loc":[-85.62434,41.949368]},"n3258":{"id":"n3258","loc":[-85.624342,41.949351]},"n3259":{"id":"n3259","loc":[-85.624725,41.949348]},"n326":{"id":"n326","loc":[-85.634839,41.942974]},"n3260":{"id":"n3260","loc":[-85.624755,41.950495]},"n3261":{"id":"n3261","loc":[-85.624121,41.950502]},"n3262":{"id":"n3262","loc":[-85.625453,41.950163]},"n3263":{"id":"n3263","loc":[-85.625454,41.949976]},"n3264":{"id":"n3264","loc":[-85.625549,41.949977]},"n3265":{"id":"n3265","loc":[-85.62555,41.949833]},"n3266":{"id":"n3266","loc":[-85.625577,41.949833]},"n3267":{"id":"n3267","loc":[-85.625578,41.949656]},"n3268":{"id":"n3268","loc":[-85.625195,41.949655]},"n3269":{"id":"n3269","loc":[-85.625192,41.950162]},"n327":{"id":"n327","loc":[-85.634657,41.943028]},"n3270":{"id":"n3270","loc":[-85.622992,41.949614]},"n3271":{"id":"n3271","loc":[-85.622991,41.949431]},"n3272":{"id":"n3272","loc":[-85.620103,41.951]},"n3273":{"id":"n3273","loc":[-85.605644,41.947468]},"n3274":{"id":"n3274","loc":[-85.617421,41.947457]},"n3275":{"id":"n3275","loc":[-85.620078,41.947444]},"n3276":{"id":"n3276","loc":[-85.620087,41.94924]},"n3277":{"id":"n3277","loc":[-85.62156,41.948333]},"n3278":{"id":"n3278","loc":[-85.620106,41.950132]},"n3279":{"id":"n3279","loc":[-85.637412,41.951136]},"n328":{"id":"n328","loc":[-85.634222,41.943152]},"n3280":{"id":"n3280","loc":[-85.635429,41.948608]},"n3281":{"id":"n3281","loc":[-85.635047,41.947788]},"n3282":{"id":"n3282","loc":[-85.635048,41.947796]},"n3283":{"id":"n3283","loc":[-85.635002,41.947797]},"n3284":{"id":"n3284","loc":[-85.635002,41.947788]},"n3285":{"id":"n3285","loc":[-85.634914,41.94779]},"n3286":{"id":"n3286","loc":[-85.634913,41.947753]},"n3287":{"id":"n3287","loc":[-85.63494,41.947753]},"n3288":{"id":"n3288","loc":[-85.634938,41.947708]},"n3289":{"id":"n3289","loc":[-85.635124,41.947705]},"n329":{"id":"n329","loc":[-85.634099,41.943202]},"n3290":{"id":"n3290","loc":[-85.635126,41.947787]},"n3291":{"id":"n3291","loc":[-85.634972,41.947599]},"n3292":{"id":"n3292","loc":[-85.634921,41.9476]},"n3293":{"id":"n3293","loc":[-85.63485,41.947546]},"n3294":{"id":"n3294","loc":[-85.63485,41.947508]},"n3295":{"id":"n3295","loc":[-85.634924,41.947457]},"n3296":{"id":"n3296","loc":[-85.634967,41.947456]},"n3297":{"id":"n3297","loc":[-85.635041,41.947512]},"n3298":{"id":"n3298","loc":[-85.635041,41.947542]},"n3299":{"id":"n3299","loc":[-85.634244,41.947839]},"n33":{"id":"n33","loc":[-85.638257,41.944188]},"n330":{"id":"n330","loc":[-85.634093,41.943138]},"n3300":{"id":"n3300","loc":[-85.634243,41.947793]},"n3301":{"id":"n3301","loc":[-85.634244,41.947686]},"n3302":{"id":"n3302","loc":[-85.634243,41.947657]},"n3303":{"id":"n3303","loc":[-85.634462,41.947653]},"n3304":{"id":"n3304","loc":[-85.634468,41.947835]},"n3305":{"id":"n3305","loc":[-85.634416,41.948006]},"n3306":{"id":"n3306","loc":[-85.634415,41.947898]},"n3307":{"id":"n3307","loc":[-85.634275,41.947899]},"n3308":{"id":"n3308","loc":[-85.634275,41.947927]},"n3309":{"id":"n3309","loc":[-85.63425,41.947927]},"n331":{"id":"n331","loc":[-85.633938,41.943291]},"n3310":{"id":"n3310","loc":[-85.63425,41.947976]},"n3311":{"id":"n3311","loc":[-85.634274,41.947976]},"n3312":{"id":"n3312","loc":[-85.634275,41.948007]},"n3313":{"id":"n3313","loc":[-85.634342,41.947635]},"n3314":{"id":"n3314","loc":[-85.634339,41.947497]},"n3315":{"id":"n3315","loc":[-85.634313,41.94748]},"n3316":{"id":"n3316","loc":[-85.634287,41.947474]},"n3317":{"id":"n3317","loc":[-85.63498,41.94815]},"n3318":{"id":"n3318","loc":[-85.634891,41.94815]},"n3319":{"id":"n3319","loc":[-85.634892,41.948169]},"n332":{"id":"n332","loc":[-85.633535,41.943511],"tags":{"railway":"crossing"}},"n3320":{"id":"n3320","loc":[-85.634852,41.948169]},"n3321":{"id":"n3321","loc":[-85.634853,41.948268]},"n3322":{"id":"n3322","loc":[-85.634832,41.948268]},"n3323":{"id":"n3323","loc":[-85.634832,41.948296]},"n3324":{"id":"n3324","loc":[-85.634965,41.948295]},"n3325":{"id":"n3325","loc":[-85.634966,41.948321]},"n3326":{"id":"n3326","loc":[-85.634999,41.948321]},"n3327":{"id":"n3327","loc":[-85.634999,41.948295]},"n3328":{"id":"n3328","loc":[-85.635175,41.948293]},"n3329":{"id":"n3329","loc":[-85.635175,41.948262]},"n333":{"id":"n333","loc":[-85.63339,41.943596]},"n3330":{"id":"n3330","loc":[-85.635159,41.948262]},"n3331":{"id":"n3331","loc":[-85.635158,41.948152]},"n3332":{"id":"n3332","loc":[-85.635067,41.948152]},"n3333":{"id":"n3333","loc":[-85.635065,41.947966]},"n3334":{"id":"n3334","loc":[-85.634979,41.947966]},"n3335":{"id":"n3335","loc":[-85.634307,41.948326]},"n3336":{"id":"n3336","loc":[-85.634305,41.948298]},"n3337":{"id":"n3337","loc":[-85.634331,41.948055]},"n3338":{"id":"n3338","loc":[-85.634331,41.948046]},"n3339":{"id":"n3339","loc":[-85.634435,41.948047]},"n334":{"id":"n334","loc":[-85.632842,41.943895]},"n3340":{"id":"n3340","loc":[-85.634434,41.948375]},"n3341":{"id":"n3341","loc":[-85.634463,41.948373]},"n3342":{"id":"n3342","loc":[-85.634464,41.948456]},"n3343":{"id":"n3343","loc":[-85.63443,41.948457]},"n3344":{"id":"n3344","loc":[-85.634432,41.948505]},"n3345":{"id":"n3345","loc":[-85.637386,41.94906]},"n3346":{"id":"n3346","loc":[-85.637113,41.9486]},"n3347":{"id":"n3347","loc":[-85.635448,41.949424]},"n335":{"id":"n335","loc":[-85.633856,41.943315]},"n3352":{"id":"n3352","loc":[-85.635457,41.949787]},"n3353":{"id":"n3353","loc":[-85.635459,41.949886]},"n336":{"id":"n336","loc":[-85.633697,41.943405]},"n337":{"id":"n337","loc":[-85.63347,41.943181]},"n3372":{"id":"n3372","loc":[-85.634423,41.950964]},"n3373":{"id":"n3373","loc":[-85.634424,41.95074]},"n3374":{"id":"n3374","loc":[-85.634394,41.950284]},"n3375":{"id":"n3375","loc":[-85.634398,41.950626]},"n3376":{"id":"n3376","loc":[-85.63452,41.951063]},"n3377":{"id":"n3377","loc":[-85.634511,41.949977]},"n3378":{"id":"n3378","loc":[-85.637409,41.949873]},"n3379":{"id":"n3379","loc":[-85.634824,41.94996]},"n338":{"id":"n338","loc":[-85.633597,41.943109]},"n3380":{"id":"n3380","loc":[-85.635437,41.949954]},"n3381":{"id":"n3381","loc":[-85.634844,41.951064]},"n3382":{"id":"n3382","loc":[-85.635458,41.951058]},"n3383":{"id":"n3383","loc":[-85.633921,41.947333]},"n3384":{"id":"n3384","loc":[-85.634208,41.947793]},"n3385":{"id":"n3385","loc":[-85.634204,41.947687]},"n3386":{"id":"n3386","loc":[-85.63424,41.947475]},"n3387":{"id":"n3387","loc":[-85.63424,41.947635]},"n3388":{"id":"n3388","loc":[-85.634089,41.948328]},"n3389":{"id":"n3389","loc":[-85.63424,41.948299]},"n339":{"id":"n339","loc":[-85.633673,41.943184]},"n3390":{"id":"n3390","loc":[-85.634239,41.948212]},"n3391":{"id":"n3391","loc":[-85.634086,41.948214]},"n3392":{"id":"n3392","loc":[-85.63408,41.948056]},"n3393":{"id":"n3393","loc":[-85.634093,41.948506]},"n3394":{"id":"n3394","loc":[-85.64344,41.941866]},"n3395":{"id":"n3395","loc":[-85.63378,41.95099]},"n3396":{"id":"n3396","loc":[-85.633779,41.950967]},"n3397":{"id":"n3397","loc":[-85.63375,41.950746]},"n3398":{"id":"n3398","loc":[-85.63375,41.950697]},"n3399":{"id":"n3399","loc":[-85.633903,41.950696]},"n34":{"id":"n34","loc":[-85.638176,41.944312]},"n340":{"id":"n340","loc":[-85.633714,41.94316]},"n3400":{"id":"n3400","loc":[-85.633901,41.950436]},"n3401":{"id":"n3401","loc":[-85.633492,41.950438]},"n3402":{"id":"n3402","loc":[-85.633494,41.950756]},"n3403":{"id":"n3403","loc":[-85.633454,41.950756]},"n3404":{"id":"n3404","loc":[-85.633456,41.950992]},"n3405":{"id":"n3405","loc":[-85.633994,41.950284]},"n3406":{"id":"n3406","loc":[-85.633998,41.950628]},"n3407":{"id":"n3407","loc":[-85.633364,41.951068]},"n3408":{"id":"n3408","loc":[-85.633356,41.949982]},"n3409":{"id":"n3409","loc":[-85.643327,41.941903]},"n341":{"id":"n341","loc":[-85.633811,41.943256]},"n3410":{"id":"n3410","loc":[-85.633292,41.953691]},"n3411":{"id":"n3411","loc":[-85.637432,41.952399]},"n3412":{"id":"n3412","loc":[-85.633349,41.957422]},"n3413":{"id":"n3413","loc":[-85.633326,41.955909]},"n3414":{"id":"n3414","loc":[-85.633307,41.954673]},"n3415":{"id":"n3415","loc":[-85.633273,41.952436]},"n3416":{"id":"n3416","loc":[-85.633361,41.95823],"tags":{"highway":"turning_circle"}},"n3417":{"id":"n3417","loc":[-85.619899,41.945527]},"n3418":{"id":"n3418","loc":[-85.643422,41.941946]},"n3419":{"id":"n3419","loc":[-85.643505,41.942033]},"n342":{"id":"n342","loc":[-85.633801,41.943261]},"n3420":{"id":"n3420","loc":[-85.620088,41.945571]},"n3421":{"id":"n3421","loc":[-85.620051,41.945505]},"n3422":{"id":"n3422","loc":[-85.62001,41.94541]},"n3423":{"id":"n3423","loc":[-85.620982,41.944742]},"n3424":{"id":"n3424","loc":[-85.621305,41.944782]},"n3425":{"id":"n3425","loc":[-85.621174,41.944819]},"n3426":{"id":"n3426","loc":[-85.621029,41.944871]},"n3427":{"id":"n3427","loc":[-85.620741,41.945011]},"n3428":{"id":"n3428","loc":[-85.620616,41.945085]},"n3429":{"id":"n3429","loc":[-85.620506,41.945172]},"n343":{"id":"n343","loc":[-85.63374,41.943514]},"n3430":{"id":"n3430","loc":[-85.620394,41.945273]},"n3431":{"id":"n3431","loc":[-85.620316,41.94536]},"n3432":{"id":"n3432","loc":[-85.620257,41.945452]},"n3433":{"id":"n3433","loc":[-85.620212,41.945535]},"n3434":{"id":"n3434","loc":[-85.620101,41.945811]},"n3435":{"id":"n3435","loc":[-85.620081,41.945937]},"n3436":{"id":"n3436","loc":[-85.619899,41.943718]},"n3437":{"id":"n3437","loc":[-85.619969,41.943211]},"n3438":{"id":"n3438","loc":[-85.619894,41.943292]},"n3439":{"id":"n3439","loc":[-85.620047,41.944738]},"n344":{"id":"n344","loc":[-85.633665,41.943441]},"n3440":{"id":"n3440","loc":[-85.620226,41.946088]},"n3441":{"id":"n3441","loc":[-85.620225,41.945864]},"n3442":{"id":"n3442","loc":[-85.620518,41.945863]},"n3443":{"id":"n3443","loc":[-85.620519,41.945944]},"n3444":{"id":"n3444","loc":[-85.620388,41.945944]},"n3445":{"id":"n3445","loc":[-85.620389,41.946088]},"n3446":{"id":"n3446","loc":[-85.618405,41.946566]},"n3447":{"id":"n3447","loc":[-85.619156,41.946562]},"n3448":{"id":"n3448","loc":[-85.619154,41.946319]},"n3449":{"id":"n3449","loc":[-85.618736,41.946322]},"n345":{"id":"n345","loc":[-85.633162,41.942947]},"n3450":{"id":"n3450","loc":[-85.618733,41.94612]},"n3451":{"id":"n3451","loc":[-85.619317,41.946116]},"n3452":{"id":"n3452","loc":[-85.619316,41.946023]},"n3453":{"id":"n3453","loc":[-85.619622,41.946021]},"n3454":{"id":"n3454","loc":[-85.619624,41.946171]},"n3455":{"id":"n3455","loc":[-85.61977,41.94617]},"n3456":{"id":"n3456","loc":[-85.619769,41.94602]},"n3457":{"id":"n3457","loc":[-85.619732,41.94602]},"n3458":{"id":"n3458","loc":[-85.619731,41.945856]},"n3459":{"id":"n3459","loc":[-85.619617,41.945857]},"n346":{"id":"n346","loc":[-85.633598,41.943083]},"n3460":{"id":"n3460","loc":[-85.619616,41.945776]},"n3461":{"id":"n3461","loc":[-85.619447,41.945777]},"n3462":{"id":"n3462","loc":[-85.619415,41.945778]},"n3463":{"id":"n3463","loc":[-85.618378,41.945788]},"n3464":{"id":"n3464","loc":[-85.618384,41.946132]},"n3465":{"id":"n3465","loc":[-85.618503,41.94613]},"n3466":{"id":"n3466","loc":[-85.618506,41.946319]},"n3467":{"id":"n3467","loc":[-85.6184,41.94632]},"n3468":{"id":"n3468","loc":[-85.618248,41.946416]},"n3469":{"id":"n3469","loc":[-85.618247,41.946319]},"n347":{"id":"n347","loc":[-85.63343,41.943179]},"n3470":{"id":"n3470","loc":[-85.618039,41.946321]},"n3471":{"id":"n3471","loc":[-85.61804,41.946418]},"n3472":{"id":"n3472","loc":[-85.620118,41.951895]},"n3473":{"id":"n3473","loc":[-85.617075,41.95469]},"n3474":{"id":"n3474","loc":[-85.620107,41.952113]},"n3475":{"id":"n3475","loc":[-85.620091,41.95232]},"n3476":{"id":"n3476","loc":[-85.620047,41.952505]},"n3477":{"id":"n3477","loc":[-85.61998,41.952715]},"n3478":{"id":"n3478","loc":[-85.619861,41.952986]},"n3479":{"id":"n3479","loc":[-85.619622,41.953365]},"n348":{"id":"n348","loc":[-85.633669,41.94341]},"n3480":{"id":"n3480","loc":[-85.619441,41.953567]},"n3481":{"id":"n3481","loc":[-85.619259,41.953741]},"n3482":{"id":"n3482","loc":[-85.618835,41.954056]},"n3483":{"id":"n3483","loc":[-85.618602,41.954194]},"n3484":{"id":"n3484","loc":[-85.618305,41.954347]},"n3485":{"id":"n3485","loc":[-85.618006,41.954466]},"n3486":{"id":"n3486","loc":[-85.617611,41.954587]},"n3487":{"id":"n3487","loc":[-85.615094,41.943412]},"n3488":{"id":"n3488","loc":[-85.619337,41.943025]},"n3489":{"id":"n3489","loc":[-85.610477,41.945527]},"n349":{"id":"n349","loc":[-85.633566,41.943466]},"n3490":{"id":"n3490","loc":[-85.610477,41.943718]},"n3491":{"id":"n3491","loc":[-85.619804,41.942976]},"n3492":{"id":"n3492","loc":[-85.61921,41.942672]},"n3493":{"id":"n3493","loc":[-85.619862,41.942836]},"n3494":{"id":"n3494","loc":[-85.616326,41.942769]},"n3495":{"id":"n3495","loc":[-85.617953,41.942917]},"n3496":{"id":"n3496","loc":[-85.61972,41.942728]},"n3497":{"id":"n3497","loc":[-85.61944,41.942784]},"n3498":{"id":"n3498","loc":[-85.615323,41.942841]},"n3499":{"id":"n3499","loc":[-85.612923,41.943718]},"n35":{"id":"n35","loc":[-85.637928,41.944249]},"n350":{"id":"n350","loc":[-85.633031,41.942986]},"n3500":{"id":"n3500","loc":[-85.61958,41.942756]},"n3501":{"id":"n3501","loc":[-85.619643,41.942647],"tags":{"leisure":"fishing"}},"n3502":{"id":"n3502","loc":[-85.619935,41.942962]},"n3503":{"id":"n3503","loc":[-85.629677,41.954687]},"n3504":{"id":"n3504","loc":[-85.629083,41.953722]},"n3505":{"id":"n3505","loc":[-85.621907,41.952067]},"n3506":{"id":"n3506","loc":[-85.621788,41.952058]},"n3507":{"id":"n3507","loc":[-85.629665,41.953718]},"n3508":{"id":"n3508","loc":[-85.624454,41.954707]},"n3509":{"id":"n3509","loc":[-85.634609,41.954585]},"n351":{"id":"n351","loc":[-85.633238,41.94283]},"n3510":{"id":"n3510","loc":[-85.634595,41.953772]},"n3511":{"id":"n3511","loc":[-85.633425,41.953783]},"n3512":{"id":"n3512","loc":[-85.633439,41.954596]},"n3517":{"id":"n3517","loc":[-85.621789,41.952179]},"n3518":{"id":"n3518","loc":[-85.624105,41.954704]},"n3519":{"id":"n3519","loc":[-85.623306,41.954542]},"n352":{"id":"n352","loc":[-85.633173,41.943556]},"n3520":{"id":"n3520","loc":[-85.623123,41.954502]},"n3521":{"id":"n3521","loc":[-85.622965,41.954473]},"n3522":{"id":"n3522","loc":[-85.622822,41.954455]},"n3523":{"id":"n3523","loc":[-85.62269,41.954448]},"n3524":{"id":"n3524","loc":[-85.622388,41.954467]},"n3525":{"id":"n3525","loc":[-85.62403,41.954895]},"n3526":{"id":"n3526","loc":[-85.623579,41.954855]},"n3527":{"id":"n3527","loc":[-85.623836,41.954951]},"n3528":{"id":"n3528","loc":[-85.622473,41.954592]},"n3529":{"id":"n3529","loc":[-85.622753,41.95458]},"n353":{"id":"n353","loc":[-85.633127,41.943552]},"n3530":{"id":"n3530","loc":[-85.62404,41.955078]},"n3531":{"id":"n3531","loc":[-85.624126,41.954999]},"n3532":{"id":"n3532","loc":[-85.623171,41.954687]},"n3533":{"id":"n3533","loc":[-85.624276,41.955206]},"n3534":{"id":"n3534","loc":[-85.62491,41.952801]},"n3535":{"id":"n3535","loc":[-85.625186,41.952756]},"n3536":{"id":"n3536","loc":[-85.625552,41.952792]},"n3537":{"id":"n3537","loc":[-85.626001,41.952948]},"n3538":{"id":"n3538","loc":[-85.626528,41.952984]},"n3539":{"id":"n3539","loc":[-85.626942,41.952886]},"n354":{"id":"n354","loc":[-85.632745,41.943222]},"n3540":{"id":"n3540","loc":[-85.627092,41.952685]},"n3541":{"id":"n3541","loc":[-85.627212,41.95244]},"n3542":{"id":"n3542","loc":[-85.627158,41.952226]},"n3543":{"id":"n3543","loc":[-85.627002,41.951972]},"n3544":{"id":"n3544","loc":[-85.626822,41.951838]},"n3545":{"id":"n3545","loc":[-85.626528,41.951807]},"n3546":{"id":"n3546","loc":[-85.625653,41.951852]},"n3547":{"id":"n3547","loc":[-85.625348,41.951834]},"n3548":{"id":"n3548","loc":[-85.625114,41.951767]},"n3549":{"id":"n3549","loc":[-85.620627,41.954682]},"n355":{"id":"n355","loc":[-85.632756,41.943199]},"n3550":{"id":"n3550","loc":[-85.622758,41.951884]},"n3551":{"id":"n3551","loc":[-85.618135,41.954734]},"n3552":{"id":"n3552","loc":[-85.620229,41.95472]},"n3553":{"id":"n3553","loc":[-85.624491,41.955573]},"n3554":{"id":"n3554","loc":[-85.621792,41.958314]},"n3555":{"id":"n3555","loc":[-85.623395,41.960001]},"n3556":{"id":"n3556","loc":[-85.620461,41.956212]},"n3557":{"id":"n3557","loc":[-85.62109,41.956766]},"n3558":{"id":"n3558","loc":[-85.620246,41.956224]},"n3559":{"id":"n3559","loc":[-85.625017,41.956068]},"n356":{"id":"n356","loc":[-85.632855,41.943147]},"n3560":{"id":"n3560","loc":[-85.622795,41.959702]},"n3561":{"id":"n3561","loc":[-85.621573,41.958457]},"n3562":{"id":"n3562","loc":[-85.619631,41.9573]},"n3563":{"id":"n3563","loc":[-85.62095,41.956311]},"n3564":{"id":"n3564","loc":[-85.619694,41.957408]},"n3565":{"id":"n3565","loc":[-85.621079,41.957751]},"n3566":{"id":"n3566","loc":[-85.622426,41.961142]},"n3567":{"id":"n3567","loc":[-85.623251,41.960484]},"n3568":{"id":"n3568","loc":[-85.619084,41.956291]},"n3569":{"id":"n3569","loc":[-85.622227,41.959303]},"n357":{"id":"n357","loc":[-85.632888,41.94315]},"n3570":{"id":"n3570","loc":[-85.620976,41.959104]},"n3571":{"id":"n3571","loc":[-85.621208,41.95653]},"n3572":{"id":"n3572","loc":[-85.623531,41.95951]},"n3573":{"id":"n3573","loc":[-85.623556,41.957935]},"n3574":{"id":"n3574","loc":[-85.623037,41.95746]},"n3575":{"id":"n3575","loc":[-85.621175,41.956427]},"n3576":{"id":"n3576","loc":[-85.622651,41.960109]},"n3577":{"id":"n3577","loc":[-85.621803,41.960747]},"n3578":{"id":"n3578","loc":[-85.620791,41.961874]},"n3579":{"id":"n3579","loc":[-85.625295,41.956786]},"n358":{"id":"n358","loc":[-85.633232,41.943547]},"n3580":{"id":"n3580","loc":[-85.619662,41.956894]},"n3581":{"id":"n3581","loc":[-85.622442,41.958708]},"n3582":{"id":"n3582","loc":[-85.621744,41.955864]},"n3583":{"id":"n3583","loc":[-85.621336,41.959212]},"n3584":{"id":"n3584","loc":[-85.622801,41.957304]},"n3585":{"id":"n3585","loc":[-85.619973,41.957433]},"n3586":{"id":"n3586","loc":[-85.619556,41.955717]},"n3587":{"id":"n3587","loc":[-85.622978,41.958601]},"n3588":{"id":"n3588","loc":[-85.625396,41.956264]},"n3589":{"id":"n3589","loc":[-85.623525,41.958034]},"n359":{"id":"n359","loc":[-85.633302,41.94351]},"n3590":{"id":"n3590","loc":[-85.623299,41.959631]},"n3591":{"id":"n3591","loc":[-85.622678,41.959873]},"n3592":{"id":"n3592","loc":[-85.625553,41.956179]},"n3593":{"id":"n3593","loc":[-85.623557,41.959231]},"n3594":{"id":"n3594","loc":[-85.622843,41.957373]},"n3595":{"id":"n3595","loc":[-85.619378,41.955677]},"n3596":{"id":"n3596","loc":[-85.620092,41.955425]},"n3597":{"id":"n3597","loc":[-85.622666,41.96044]},"n3598":{"id":"n3598","loc":[-85.621996,41.960256]},"n3599":{"id":"n3599","loc":[-85.623273,41.959997]},"n36":{"id":"n36","loc":[-85.637894,41.945551]},"n360":{"id":"n360","loc":[-85.633442,41.943794],"tags":{"highway":"crossing"}},"n3600":{"id":"n3600","loc":[-85.62477,41.95689]},"n3601":{"id":"n3601","loc":[-85.621641,41.955015]},"n3602":{"id":"n3602","loc":[-85.622495,41.960392]},"n3603":{"id":"n3603","loc":[-85.61918,41.955565]},"n3604":{"id":"n3604","loc":[-85.620017,41.955505]},"n3605":{"id":"n3605","loc":[-85.621739,41.956315]},"n3606":{"id":"n3606","loc":[-85.622957,41.959837]},"n3607":{"id":"n3607","loc":[-85.620912,41.960919]},"n3608":{"id":"n3608","loc":[-85.625231,41.956235]},"n3609":{"id":"n3609","loc":[-85.620976,41.961868]},"n361":{"id":"n361","loc":[-85.633381,41.94383]},"n3610":{"id":"n3610","loc":[-85.620956,41.958908]},"n3611":{"id":"n3611","loc":[-85.619035,41.956139]},"n3612":{"id":"n3612","loc":[-85.623643,41.958669]},"n3613":{"id":"n3613","loc":[-85.61949,41.956539]},"n3614":{"id":"n3614","loc":[-85.621927,41.958242]},"n3615":{"id":"n3615","loc":[-85.620826,41.955721]},"n3616":{"id":"n3616","loc":[-85.621202,41.961321]},"n3617":{"id":"n3617","loc":[-85.624877,41.95594]},"n3618":{"id":"n3618","loc":[-85.62065,41.958369]},"n3619":{"id":"n3619","loc":[-85.621524,41.956279]},"n362":{"id":"n362","loc":[-85.632977,41.944053]},"n3620":{"id":"n3620","loc":[-85.624662,41.955932]},"n3621":{"id":"n3621","loc":[-85.623048,41.958509]},"n3622":{"id":"n3622","loc":[-85.62111,41.95754]},"n3623":{"id":"n3623","loc":[-85.621508,41.954847]},"n3624":{"id":"n3624","loc":[-85.620655,41.958601]},"n3625":{"id":"n3625","loc":[-85.62154,41.954971]},"n3626":{"id":"n3626","loc":[-85.621691,41.955521]},"n3627":{"id":"n3627","loc":[-85.62154,41.954739]},"n3628":{"id":"n3628","loc":[-85.621996,41.959913]},"n3629":{"id":"n3629","loc":[-85.622286,41.960699]},"n363":{"id":"n363","loc":[-85.632915,41.943981],"tags":{"crossing":"zebra","highway":"crossing"}},"n3630":{"id":"n3630","loc":[-85.622844,41.9572]},"n3631":{"id":"n3631","loc":[-85.620252,41.955446]},"n3632":{"id":"n3632","loc":[-85.623434,41.957528]},"n3633":{"id":"n3633","loc":[-85.623429,41.956858]},"n3634":{"id":"n3634","loc":[-85.622957,41.957137]},"n3635":{"id":"n3635","loc":[-85.622554,41.959027]},"n3636":{"id":"n3636","loc":[-85.623289,41.958314]},"n3637":{"id":"n3637","loc":[-85.622977,41.960855]},"n3638":{"id":"n3638","loc":[-85.624008,41.956953]},"n3639":{"id":"n3639","loc":[-85.621278,41.960855]},"n364":{"id":"n364","loc":[-85.632724,41.943969],"tags":{"crossing":"zebra","highway":"crossing"}},"n3640":{"id":"n3640","loc":[-85.623128,41.956993]},"n3641":{"id":"n3641","loc":[-85.622452,41.959183]},"n3642":{"id":"n3642","loc":[-85.621095,41.961082]},"n3643":{"id":"n3643","loc":[-85.622011,41.960544]},"n3644":{"id":"n3644","loc":[-85.621637,41.955385]},"n3645":{"id":"n3645","loc":[-85.620999,41.959271]},"n3646":{"id":"n3646","loc":[-85.620044,41.956347]},"n3647":{"id":"n3647","loc":[-85.621936,41.959682]},"n3648":{"id":"n3648","loc":[-85.623761,41.95685]},"n3649":{"id":"n3649","loc":[-85.621239,41.959343]},"n365":{"id":"n365","loc":[-85.632621,41.944034]},"n3650":{"id":"n3650","loc":[-85.621073,41.956012]},"n3651":{"id":"n3651","loc":[-85.621271,41.956184]},"n3652":{"id":"n3652","loc":[-85.623444,41.95778]},"n3653":{"id":"n3653","loc":[-85.62125,41.96186]},"n3654":{"id":"n3654","loc":[-85.62169,41.961059]},"n3655":{"id":"n3655","loc":[-85.620012,41.955637]},"n3656":{"id":"n3656","loc":[-85.621058,41.9573]},"n3657":{"id":"n3657","loc":[-85.621138,41.957663]},"n3658":{"id":"n3658","loc":[-85.620773,41.957895]},"n3659":{"id":"n3659","loc":[-85.62007,41.957157]},"n366":{"id":"n366","loc":[-85.632684,41.944109],"tags":{"crossing":"zebra","highway":"crossing"}},"n3660":{"id":"n3660","loc":[-85.624534,41.955844]},"n3661":{"id":"n3661","loc":[-85.621932,41.960807]},"n3662":{"id":"n3662","loc":[-85.623358,41.958138]},"n3663":{"id":"n3663","loc":[-85.620456,41.955514]},"n3664":{"id":"n3664","loc":[-85.623504,41.957607]},"n3665":{"id":"n3665","loc":[-85.621444,41.960751]},"n3666":{"id":"n3666","loc":[-85.623492,41.960213]},"n3667":{"id":"n3667","loc":[-85.621669,41.954655]},"n3668":{"id":"n3668","loc":[-85.623106,41.958685]},"n3669":{"id":"n3669","loc":[-85.620922,41.957867]},"n367":{"id":"n367","loc":[-85.632738,41.944172]},"n3670":{"id":"n3670","loc":[-85.620092,41.957296]},"n3671":{"id":"n3671","loc":[-85.621669,41.955222]},"n3672":{"id":"n3672","loc":[-85.621614,41.960967]},"n3673":{"id":"n3673","loc":[-85.621691,41.955732]},"n3674":{"id":"n3674","loc":[-85.619207,41.956419]},"n3675":{"id":"n3675","loc":[-85.621116,41.956603]},"n3676":{"id":"n3676","loc":[-85.623311,41.956929]},"n3677":{"id":"n3677","loc":[-85.625671,41.956499]},"n3678":{"id":"n3678","loc":[-85.623525,41.956738]},"n3679":{"id":"n3679","loc":[-85.625381,41.956634]},"n368":{"id":"n368","loc":[-85.63287,41.944135],"tags":{"crossing":"zebra","highway":"crossing"}},"n3680":{"id":"n3680","loc":[-85.620096,41.95677]},"n3681":{"id":"n3681","loc":[-85.623803,41.958745]},"n3682":{"id":"n3682","loc":[-85.623498,41.958457]},"n3683":{"id":"n3683","loc":[-85.624223,41.957009]},"n3684":{"id":"n3684","loc":[-85.620026,41.956946]},"n3685":{"id":"n3685","loc":[-85.623005,41.960124]},"n3686":{"id":"n3686","loc":[-85.619073,41.955832]},"n3687":{"id":"n3687","loc":[-85.621744,41.95501]},"n3688":{"id":"n3688","loc":[-85.620804,41.958781]},"n3689":{"id":"n3689","loc":[-85.619844,41.957448]},"n369":{"id":"n369","loc":[-85.63298,41.944076]},"n3690":{"id":"n3690","loc":[-85.623713,41.958872]},"n3691":{"id":"n3691","loc":[-85.622329,41.960507]},"n3692":{"id":"n3692","loc":[-85.620804,41.956244]},"n3693":{"id":"n3693","loc":[-85.621818,41.955968]},"n3694":{"id":"n3694","loc":[-85.621405,41.958697]},"n3695":{"id":"n3695","loc":[-85.620998,41.960996]},"n3696":{"id":"n3696","loc":[-85.621621,41.960444]},"n3697":{"id":"n3697","loc":[-85.620941,41.961637]},"n3698":{"id":"n3698","loc":[-85.622195,41.958333]},"n3699":{"id":"n3699","loc":[-85.621668,41.961529]},"n37":{"id":"n37","loc":[-85.637611,41.945383]},"n370":{"id":"n370","loc":[-85.633191,41.944471]},"n3700":{"id":"n3700","loc":[-85.621015,41.957049]},"n3701":{"id":"n3701","loc":[-85.619368,41.955521]},"n3702":{"id":"n3702","loc":[-85.651578,41.942534]},"n3703":{"id":"n3703","loc":[-85.651541,41.943847]},"n3704":{"id":"n3704","loc":[-85.651365,41.944817]},"n3705":{"id":"n3705","loc":[-85.651076,41.945985]},"n3706":{"id":"n3706","loc":[-85.650626,41.947213]},"n3707":{"id":"n3707","loc":[-85.649669,41.949161]},"n3708":{"id":"n3708","loc":[-85.641802,41.961801]},"n3709":{"id":"n3709","loc":[-85.623333,41.961987]},"n371":{"id":"n371","loc":[-85.633132,41.94372]},"n3710":{"id":"n3710","loc":[-85.620621,41.965658]},"n3711":{"id":"n3711","loc":[-85.605673,41.965764]},"n3712":{"id":"n3712","loc":[-85.605664,41.962094]},"n3713":{"id":"n3713","loc":[-85.583774,41.962178]},"n3714":{"id":"n3714","loc":[-85.583774,41.961789]},"n3715":{"id":"n3715","loc":[-85.581303,41.961783]},"n3716":{"id":"n3716","loc":[-85.581245,41.958394]},"n3717":{"id":"n3717","loc":[-85.585299,41.955483]},"n3718":{"id":"n3718","loc":[-85.585588,41.955331]},"n3719":{"id":"n3719","loc":[-85.586053,41.955163]},"n372":{"id":"n372","loc":[-85.633011,41.943788]},"n3720":{"id":"n3720","loc":[-85.58632,41.955076]},"n3721":{"id":"n3721","loc":[-85.586478,41.955025]},"n3722":{"id":"n3722","loc":[-85.58692,41.954947]},"n3723":{"id":"n3723","loc":[-85.587345,41.954913]},"n3724":{"id":"n3724","loc":[-85.605592,41.954766]},"n3725":{"id":"n3725","loc":[-85.605303,41.936236]},"n3726":{"id":"n3726","loc":[-85.606941,41.936117]},"n3727":{"id":"n3727","loc":[-85.60876,41.935856]},"n3728":{"id":"n3728","loc":[-85.610092,41.935451]},"n3729":{"id":"n3729","loc":[-85.610681,41.935247]},"n373":{"id":"n373","loc":[-85.632854,41.943632]},"n3730":{"id":"n3730","loc":[-85.611446,41.934955]},"n3731":{"id":"n3731","loc":[-85.612057,41.934696]},"n3732":{"id":"n3732","loc":[-85.613256,41.934084]},"n3733":{"id":"n3733","loc":[-85.613948,41.933682]},"n3734":{"id":"n3734","loc":[-85.614638,41.933212]},"n3735":{"id":"n3735","loc":[-85.619801,41.929305]},"n3736":{"id":"n3736","loc":[-85.619768,41.925548]},"n3737":{"id":"n3737","loc":[-85.625761,41.925597]},"n3738":{"id":"n3738","loc":[-85.6263,41.927323]},"n3739":{"id":"n3739","loc":[-85.633708,41.927402]},"n374":{"id":"n374","loc":[-85.632974,41.943565]},"n3740":{"id":"n3740","loc":[-85.633927,41.929109]},"n3741":{"id":"n3741","loc":[-85.639213,41.929088]},"n3742":{"id":"n3742","loc":[-85.639204,41.925488]},"n3743":{"id":"n3743","loc":[-85.651425,41.925406]},"n3744":{"id":"n3744","loc":[-85.643386,41.941933]},"n3745":{"id":"n3745","loc":[-85.642776,41.941161]},"n3746":{"id":"n3746","loc":[-85.637277,41.948812]},"n3747":{"id":"n3747","loc":[-85.637366,41.94897]},"n3748":{"id":"n3748","loc":[-85.637329,41.94889]},"n3749":{"id":"n3749","loc":[-85.629649,41.952596]},"n375":{"id":"n375","loc":[-85.632741,41.943351]},"n3750":{"id":"n3750","loc":[-85.630291,41.954684]},"n3751":{"id":"n3751","loc":[-85.630284,41.953713]},"n3752":{"id":"n3752","loc":[-85.630269,41.952463]},"n3753":{"id":"n3753","loc":[-85.633933,41.949896]},"n3754":{"id":"n3754","loc":[-85.629339,41.941467]},"n3755":{"id":"n3755","loc":[-85.629857,41.94316]},"n3756":{"id":"n3756","loc":[-85.629987,41.944025]},"n3757":{"id":"n3757","loc":[-85.628538,41.948604]},"n3758":{"id":"n3758","loc":[-85.627415,41.957442]},"n3759":{"id":"n3759","loc":[-85.627019,41.957369]},"n376":{"id":"n376","loc":[-85.63251,41.943481]},"n3760":{"id":"n3760","loc":[-85.62167,41.952179]},"n3761":{"id":"n3761","loc":[-85.62167,41.952138]},"n3762":{"id":"n3762","loc":[-85.621562,41.952139]},"n3763":{"id":"n3763","loc":[-85.621562,41.952058]},"n3764":{"id":"n3764","loc":[-85.621476,41.952043]},"n3765":{"id":"n3765","loc":[-85.621477,41.952132]},"n3766":{"id":"n3766","loc":[-85.621386,41.952132]},"n3767":{"id":"n3767","loc":[-85.621387,41.95214]},"n3768":{"id":"n3768","loc":[-85.621262,41.95214]},"n3769":{"id":"n3769","loc":[-85.621261,41.952038]},"n377":{"id":"n377","loc":[-85.632706,41.943715]},"n3770":{"id":"n3770","loc":[-85.621389,41.952038]},"n3771":{"id":"n3771","loc":[-85.621389,41.952043]},"n3772":{"id":"n3772","loc":[-85.620898,41.952024]},"n3773":{"id":"n3773","loc":[-85.620898,41.952085]},"n3774":{"id":"n3774","loc":[-85.620774,41.952084]},"n3775":{"id":"n3775","loc":[-85.620774,41.952023]},"n3776":{"id":"n3776","loc":[-85.620749,41.952036]},"n3777":{"id":"n3777","loc":[-85.620723,41.952097]},"n3778":{"id":"n3778","loc":[-85.626158,41.958996]},"n3779":{"id":"n3779","loc":[-85.626319,41.958686]},"n378":{"id":"n378","loc":[-85.638683,41.943295]},"n3780":{"id":"n3780","loc":[-85.626119,41.958629]},"n3781":{"id":"n3781","loc":[-85.626064,41.958733]},"n3782":{"id":"n3782","loc":[-85.626155,41.958759]},"n3783":{"id":"n3783","loc":[-85.626048,41.958965]},"n3784":{"id":"n3784","loc":[-85.620648,41.952079]},"n3785":{"id":"n3785","loc":[-85.63826,41.961213]},"n3786":{"id":"n3786","loc":[-85.638003,41.961614]},"n3787":{"id":"n3787","loc":[-85.638817,41.961902]},"n3788":{"id":"n3788","loc":[-85.639073,41.961501]},"n3789":{"id":"n3789","loc":[-85.620674,41.952018]},"n379":{"id":"n379","loc":[-85.638684,41.94323]},"n3790":{"id":"n3790","loc":[-85.62082,41.952106]},"n3791":{"id":"n3791","loc":[-85.620819,41.952143]},"n3792":{"id":"n3792","loc":[-85.620778,41.952143]},"n3793":{"id":"n3793","loc":[-85.620778,41.952106]},"n3794":{"id":"n3794","loc":[-85.620563,41.952276]},"n3795":{"id":"n3795","loc":[-85.620543,41.95238]},"n3796":{"id":"n3796","loc":[-85.620422,41.952367]},"n3797":{"id":"n3797","loc":[-85.620441,41.952263]},"n3798":{"id":"n3798","loc":[-85.620561,41.952266]},"n3799":{"id":"n3799","loc":[-85.620444,41.952254]},"n38":{"id":"n38","loc":[-85.63879,41.943295]},"n380":{"id":"n380","loc":[-85.638627,41.94322]},"n3800":{"id":"n3800","loc":[-85.620773,41.955585]},"n3801":{"id":"n3801","loc":[-85.621265,41.955989]},"n3802":{"id":"n3802","loc":[-85.620692,41.954969]},"n3803":{"id":"n3803","loc":[-85.620691,41.955367]},"n3804":{"id":"n3804","loc":[-85.620458,41.952178]},"n3805":{"id":"n3805","loc":[-85.620575,41.95219]},"n3806":{"id":"n3806","loc":[-85.617609,41.952712]},"n3807":{"id":"n3807","loc":[-85.617533,41.952801],"tags":{"entrance":"yes"}},"n3808":{"id":"n3808","loc":[-85.616816,41.952911]},"n3809":{"id":"n3809","loc":[-85.616797,41.952901]},"n381":{"id":"n381","loc":[-85.638624,41.943294]},"n3810":{"id":"n3810","loc":[-85.616343,41.952694]},"n3811":{"id":"n3811","loc":[-85.616336,41.952729]},"n3812":{"id":"n3812","loc":[-85.616343,41.952772]},"n3813":{"id":"n3813","loc":[-85.628479,41.948649]},"n3814":{"id":"n3814","loc":[-85.628413,41.948679]},"n3815":{"id":"n3815","loc":[-85.628336,41.948694]},"n3816":{"id":"n3816","loc":[-85.62826,41.948694]},"n3817":{"id":"n3817","loc":[-85.628185,41.948679]},"n3818":{"id":"n3818","loc":[-85.628103,41.948649]},"n3819":{"id":"n3819","loc":[-85.627482,41.948395]},"n382":{"id":"n382","loc":[-85.638437,41.943291]},"n3820":{"id":"n3820","loc":[-85.619957,41.951168]},"n3821":{"id":"n3821","loc":[-85.619955,41.952077]},"n3822":{"id":"n3822","loc":[-85.619843,41.952666]},"n3823":{"id":"n3823","loc":[-85.619513,41.95324]},"n3824":{"id":"n3824","loc":[-85.619163,41.953668]},"n3825":{"id":"n3825","loc":[-85.618813,41.953947]},"n3826":{"id":"n3826","loc":[-85.618265,41.954252]},"n3827":{"id":"n3827","loc":[-85.617691,41.954458]},"n3828":{"id":"n3828","loc":[-85.616978,41.95459]},"n3829":{"id":"n3829","loc":[-85.615408,41.954628]},"n383":{"id":"n383","loc":[-85.63844,41.943209]},"n3830":{"id":"n3830","loc":[-85.615374,41.951076]},"n3831":{"id":"n3831","loc":[-85.61932,41.947564]},"n3832":{"id":"n3832","loc":[-85.610553,41.94755]},"n3833":{"id":"n3833","loc":[-85.610572,41.951065]},"n3834":{"id":"n3834","loc":[-85.617548,41.94757]},"n3835":{"id":"n3835","loc":[-85.619842,41.947939]},"n3836":{"id":"n3836","loc":[-85.619874,41.950905]},"n3837":{"id":"n3837","loc":[-85.619695,41.950911]},"n3838":{"id":"n3838","loc":[-85.617591,41.951078]},"n3839":{"id":"n3839","loc":[-85.619551,41.951065]},"n384":{"id":"n384","loc":[-85.632616,41.944021]},"n3840":{"id":"n3840","loc":[-85.626813,41.947337]},"n3841":{"id":"n3841","loc":[-85.616371,41.952814]},"n3842":{"id":"n3842","loc":[-85.617205,41.951308]},"n3843":{"id":"n3843","loc":[-85.616795,41.950953]},"n3844":{"id":"n3844","loc":[-85.617441,41.950889]},"n3845":{"id":"n3845","loc":[-85.619155,41.949377]},"n3846":{"id":"n3846","loc":[-85.618556,41.949377]},"n3847":{"id":"n3847","loc":[-85.618557,41.948372]},"n3848":{"id":"n3848","loc":[-85.619156,41.948372]},"n3849":{"id":"n3849","loc":[-85.61927,41.949796]},"n385":{"id":"n385","loc":[-85.632319,41.944172]},"n3850":{"id":"n3850","loc":[-85.61926,41.948344]},"n3851":{"id":"n3851","loc":[-85.619219,41.948264]},"n3852":{"id":"n3852","loc":[-85.619147,41.948196]},"n3853":{"id":"n3853","loc":[-85.619049,41.948144]},"n3854":{"id":"n3854","loc":[-85.618942,41.948116]},"n3855":{"id":"n3855","loc":[-85.618822,41.948109]},"n3856":{"id":"n3856","loc":[-85.618699,41.94813]},"n3857":{"id":"n3857","loc":[-85.618937,41.951943]},"n3858":{"id":"n3858","loc":[-85.616762,41.952222]},"n3859":{"id":"n3859","loc":[-85.616799,41.95472]},"n386":{"id":"n386","loc":[-85.63221,41.944066]},"n3860":{"id":"n3860","loc":[-85.616458,41.954735]},"n3861":{"id":"n3861","loc":[-85.61763,41.951515]},"n3862":{"id":"n3862","loc":[-85.617735,41.951572]},"n3863":{"id":"n3863","loc":[-85.61929,41.951573]},"n3864":{"id":"n3864","loc":[-85.617134,41.951348]},"n3865":{"id":"n3865","loc":[-85.616598,41.95192]},"n3866":{"id":"n3866","loc":[-85.616557,41.951997]},"n3867":{"id":"n3867","loc":[-85.61658,41.952093]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616918,41.952276]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617098,41.952235]},"n3871":{"id":"n3871","loc":[-85.61892,41.951467]},"n3872":{"id":"n3872","loc":[-85.618035,41.951473]},"n3873":{"id":"n3873","loc":[-85.618036,41.951572]},"n3874":{"id":"n3874","loc":[-85.61892,41.951573]},"n3875":{"id":"n3875","loc":[-85.618919,41.951957]},"n3876":{"id":"n3876","loc":[-85.619457,41.952237]},"n3877":{"id":"n3877","loc":[-85.618178,41.953618]},"n3878":{"id":"n3878","loc":[-85.617658,41.953366]},"n3879":{"id":"n3879","loc":[-85.617987,41.953024]},"n388":{"id":"n388","loc":[-85.632268,41.943621]},"n3880":{"id":"n3880","loc":[-85.618429,41.953248]},"n3881":{"id":"n3881","loc":[-85.618554,41.953119]},"n3882":{"id":"n3882","loc":[-85.618077,41.952868]},"n3883":{"id":"n3883","loc":[-85.618039,41.952886]},"n3884":{"id":"n3884","loc":[-85.619375,41.952169]},"n3885":{"id":"n3885","loc":[-85.618137,41.953538]},"n3886":{"id":"n3886","loc":[-85.61799,41.953555]},"n3887":{"id":"n3887","loc":[-85.617729,41.953423]},"n3888":{"id":"n3888","loc":[-85.618101,41.953029]},"n3889":{"id":"n3889","loc":[-85.618516,41.953119]},"n389":{"id":"n389","loc":[-85.631951,41.943773]},"n3890":{"id":"n3890","loc":[-85.619132,41.952042]},"n3891":{"id":"n3891","loc":[-85.618235,41.952981]},"n3892":{"id":"n3892","loc":[-85.618485,41.952425]},"n3893":{"id":"n3893","loc":[-85.618676,41.952519]},"n3894":{"id":"n3894","loc":[-85.618942,41.952648]},"n3895":{"id":"n3895","loc":[-85.618287,41.953122]},"n3896":{"id":"n3896","loc":[-85.617914,41.953516]},"n3897":{"id":"n3897","loc":[-85.617836,41.953573]},"n3898":{"id":"n3898","loc":[-85.616477,41.95289]},"n3899":{"id":"n3899","loc":[-85.618441,41.953201]},"n39":{"id":"n39","loc":[-85.619931,41.951013]},"n390":{"id":"n390","loc":[-85.631981,41.943654]},"n3900":{"id":"n3900","loc":[-85.617537,41.953335]},"n3901":{"id":"n3901","loc":[-85.617221,41.953166]},"n3902":{"id":"n3902","loc":[-85.617253,41.953135]},"n3903":{"id":"n3903","loc":[-85.617211,41.953114]},"n3904":{"id":"n3904","loc":[-85.617197,41.95313]},"n3905":{"id":"n3905","loc":[-85.616802,41.952925]},"n3906":{"id":"n3906","loc":[-85.616771,41.952928]},"n3907":{"id":"n3907","loc":[-85.616493,41.952785]},"n3908":{"id":"n3908","loc":[-85.616823,41.952426]},"n3909":{"id":"n3909","loc":[-85.617191,41.952616]},"n391":{"id":"n391","loc":[-85.631886,41.943699]},"n3910":{"id":"n3910","loc":[-85.61724,41.952559]},"n3911":{"id":"n3911","loc":[-85.61721,41.952542]},"n3912":{"id":"n3912","loc":[-85.617395,41.952351]},"n3913":{"id":"n3913","loc":[-85.617426,41.952368]},"n3914":{"id":"n3914","loc":[-85.617483,41.952309]},"n3915":{"id":"n3915","loc":[-85.617332,41.952229]},"n3916":{"id":"n3916","loc":[-85.617451,41.952102]},"n3917":{"id":"n3917","loc":[-85.617477,41.952115]},"n3918":{"id":"n3918","loc":[-85.617658,41.951923]},"n3919":{"id":"n3919","loc":[-85.617634,41.95191]},"n392":{"id":"n392","loc":[-85.631807,41.943606]},"n3920":{"id":"n3920","loc":[-85.617747,41.951786]},"n3921":{"id":"n3921","loc":[-85.618268,41.952056]},"n3922":{"id":"n3922","loc":[-85.618211,41.952122]},"n3923":{"id":"n3923","loc":[-85.618386,41.95222]},"n3924":{"id":"n3924","loc":[-85.618098,41.952527]},"n3925":{"id":"n3925","loc":[-85.617916,41.95243]},"n3926":{"id":"n3926","loc":[-85.617854,41.952498]},"n3927":{"id":"n3927","loc":[-85.617769,41.952453]},"n3928":{"id":"n3928","loc":[-85.617476,41.952773]},"n3929":{"id":"n3929","loc":[-85.617876,41.952973]},"n393":{"id":"n393","loc":[-85.631902,41.943561]},"n3930":{"id":"n3930","loc":[-85.617174,41.953638]},"n3931":{"id":"n3931","loc":[-85.618016,41.953578]},"n3932":{"id":"n3932","loc":[-85.618107,41.953628]},"n3933":{"id":"n3933","loc":[-85.618067,41.954268]},"n3934":{"id":"n3934","loc":[-85.617864,41.954263]},"n3935":{"id":"n3935","loc":[-85.61762,41.954205]},"n3936":{"id":"n3936","loc":[-85.617437,41.954103]},"n3937":{"id":"n3937","loc":[-85.617294,41.953978]},"n3938":{"id":"n3938","loc":[-85.617217,41.95384]},"n3939":{"id":"n3939","loc":[-85.616814,41.954327]},"n394":{"id":"n394","loc":[-85.63236,41.943543]},"n3940":{"id":"n3940","loc":[-85.616778,41.95381]},"n3941":{"id":"n3941","loc":[-85.616585,41.953707]},"n3942":{"id":"n3942","loc":[-85.616458,41.954318]},"n3943":{"id":"n3943","loc":[-85.616643,41.954345]},"n3944":{"id":"n3944","loc":[-85.618133,41.951412]},"n3945":{"id":"n3945","loc":[-85.618326,41.951411]},"n3946":{"id":"n3946","loc":[-85.618503,41.95141]},"n3947":{"id":"n3947","loc":[-85.618681,41.951409]},"n3948":{"id":"n3948","loc":[-85.618868,41.951408]},"n3949":{"id":"n3949","loc":[-85.617047,41.95136]},"n395":{"id":"n395","loc":[-85.633839,41.944082]},"n3950":{"id":"n3950","loc":[-85.616502,41.951946]},"n3951":{"id":"n3951","loc":[-85.616497,41.952072]},"n3952":{"id":"n3952","loc":[-85.616565,41.952165]},"n3953":{"id":"n3953","loc":[-85.616663,41.952218]},"n3954":{"id":"n3954","loc":[-85.616733,41.952255]},"n3955":{"id":"n3955","loc":[-85.617238,41.952512],"tags":{"entrance":"yes"}},"n3956":{"id":"n3956","loc":[-85.617043,41.952406]},"n3957":{"id":"n3957","loc":[-85.617691,41.951711]},"n3958":{"id":"n3958","loc":[-85.617773,41.951679]},"n3959":{"id":"n3959","loc":[-85.619085,41.951681]},"n396":{"id":"n396","loc":[-85.63376,41.944097]},"n3960":{"id":"n3960","loc":[-85.617943,41.952895]},"n3961":{"id":"n3961","loc":[-85.618039,41.952938]},"n3962":{"id":"n3962","loc":[-85.61763,41.95336]},"n3963":{"id":"n3963","loc":[-85.617554,41.95344]},"n3964":{"id":"n3964","loc":[-85.617381,41.952366],"tags":{"entrance":"yes"}},"n3965":{"id":"n3965","loc":[-85.617184,41.952254]},"n3966":{"id":"n3966","loc":[-85.617208,41.952496]},"n3967":{"id":"n3967","loc":[-85.617124,41.952581],"tags":{"entrance":"yes"}},"n3968":{"id":"n3968","loc":[-85.618094,41.952735]},"n3969":{"id":"n3969","loc":[-85.617702,41.952525],"tags":{"entrance":"yes"}},"n397":{"id":"n397","loc":[-85.63361,41.943957]},"n3970":{"id":"n3970","loc":[-85.617554,41.952686],"tags":{"entrance":"yes"}},"n3971":{"id":"n3971","loc":[-85.617959,41.952878]},"n3972":{"id":"n3972","loc":[-85.616367,41.952655]},"n3973":{"id":"n3973","loc":[-85.616416,41.952851]},"n3974":{"id":"n3974","loc":[-85.619777,41.951075]},"n3975":{"id":"n3975","loc":[-85.618611,41.94817]},"n3976":{"id":"n3976","loc":[-85.618538,41.948229]},"n3977":{"id":"n3977","loc":[-85.617421,41.947559]},"n3978":{"id":"n3978","loc":[-85.617395,41.951039]},"n3979":{"id":"n3979","loc":[-85.618488,41.94829]},"n398":{"id":"n398","loc":[-85.633309,41.943886]},"n3980":{"id":"n3980","loc":[-85.610238,41.954774]},"n3981":{"id":"n3981","loc":[-85.617449,41.950756]},"n3982":{"id":"n3982","loc":[-85.617288,41.951286]},"n3983":{"id":"n3983","loc":[-85.61745,41.950197]},"n3984":{"id":"n3984","loc":[-85.617436,41.948908]},"n3985":{"id":"n3985","loc":[-85.615915,41.953804]},"n3986":{"id":"n3986","loc":[-85.615953,41.953968]},"n3987":{"id":"n3987","loc":[-85.616031,41.954085]},"n3988":{"id":"n3988","loc":[-85.616135,41.954181]},"n3989":{"id":"n3989","loc":[-85.616273,41.954263]},"n399":{"id":"n399","loc":[-85.633226,41.943931]},"n3990":{"id":"n3990","loc":[-85.618327,41.951083]},"n3991":{"id":"n3991","loc":[-85.618135,41.951084]},"n3992":{"id":"n3992","loc":[-85.618503,41.951082]},"n3993":{"id":"n3993","loc":[-85.618682,41.951081]},"n3994":{"id":"n3994","loc":[-85.618864,41.951082]},"n3995":{"id":"n3995","loc":[-85.616761,41.950101]},"n3996":{"id":"n3996","loc":[-85.617317,41.947558]},"n3997":{"id":"n3997","loc":[-85.617336,41.948883]},"n3998":{"id":"n3998","loc":[-85.616779,41.949295]},"n3999":{"id":"n3999","loc":[-85.616754,41.949349]},"n4":{"id":"n4","loc":[-85.622764,41.950892],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n40":{"id":"n40","loc":[-85.619841,41.951037]},"n400":{"id":"n400","loc":[-85.63326,41.943966]},"n4000":{"id":"n4000","loc":[-85.616761,41.950865]},"n4001":{"id":"n4001","loc":[-85.616883,41.951041]},"n4002":{"id":"n4002","loc":[-85.617004,41.951142]},"n4003":{"id":"n4003","loc":[-85.617062,41.951248]},"n4004":{"id":"n4004","loc":[-85.616809,41.949273]},"n4005":{"id":"n4005","loc":[-85.616755,41.949489]},"n4006":{"id":"n4006","loc":[-85.616759,41.949971]},"n4007":{"id":"n4007","loc":[-85.616757,41.949702]},"n4008":{"id":"n4008","loc":[-85.618456,41.94836]},"n4009":{"id":"n4009","loc":[-85.618447,41.948428]},"n401":{"id":"n401","loc":[-85.63324,41.943976]},"n4010":{"id":"n4010","loc":[-85.618437,41.949322]},"n4011":{"id":"n4011","loc":[-85.618447,41.949418]},"n4012":{"id":"n4012","loc":[-85.618478,41.949491]},"n4013":{"id":"n4013","loc":[-85.618535,41.949559]},"n4014":{"id":"n4014","loc":[-85.618623,41.94962]},"n4015":{"id":"n4015","loc":[-85.618721,41.94966]},"n4016":{"id":"n4016","loc":[-85.618838,41.949674]},"n4017":{"id":"n4017","loc":[-85.618967,41.949667]},"n4018":{"id":"n4018","loc":[-85.619065,41.949632]},"n4019":{"id":"n4019","loc":[-85.61915,41.949578]},"n402":{"id":"n402","loc":[-85.63327,41.944006]},"n4020":{"id":"n4020","loc":[-85.619216,41.949507]},"n4021":{"id":"n4021","loc":[-85.61927,41.949399]},"n4022":{"id":"n4022","loc":[-85.619074,41.947639]},"n4023":{"id":"n4023","loc":[-85.619073,41.947793]},"n4024":{"id":"n4024","loc":[-85.618912,41.947793]},"n4025":{"id":"n4025","loc":[-85.618911,41.947947]},"n4026":{"id":"n4026","loc":[-85.618752,41.947947]},"n4027":{"id":"n4027","loc":[-85.618754,41.947637]},"n4028":{"id":"n4028","loc":[-85.617896,41.947599]},"n4029":{"id":"n4029","loc":[-85.617898,41.947811]},"n403":{"id":"n403","loc":[-85.633278,41.944002]},"n4030":{"id":"n4030","loc":[-85.617717,41.947812]},"n4031":{"id":"n4031","loc":[-85.617715,41.9476]},"n4032":{"id":"n4032","loc":[-85.619003,41.949828]},"n4033":{"id":"n4033","loc":[-85.619003,41.949882]},"n4034":{"id":"n4034","loc":[-85.618926,41.949882]},"n4035":{"id":"n4035","loc":[-85.618926,41.949828]},"n4036":{"id":"n4036","loc":[-85.618861,41.949809]},"n4037":{"id":"n4037","loc":[-85.618861,41.949898]},"n4038":{"id":"n4038","loc":[-85.618688,41.949898]},"n4039":{"id":"n4039","loc":[-85.618687,41.94981]},"n404":{"id":"n404","loc":[-85.63331,41.944036]},"n4040":{"id":"n4040","loc":[-85.618349,41.949473]},"n4041":{"id":"n4041","loc":[-85.618287,41.949473]},"n4042":{"id":"n4042","loc":[-85.618287,41.94942]},"n4043":{"id":"n4043","loc":[-85.618348,41.949419]},"n4044":{"id":"n4044","loc":[-85.62316,41.951604]},"n4045":{"id":"n4045","loc":[-85.623026,41.951605]},"n4046":{"id":"n4046","loc":[-85.623023,41.951466]},"n4047":{"id":"n4047","loc":[-85.623134,41.951465]},"n4048":{"id":"n4048","loc":[-85.623136,41.951539]},"n4049":{"id":"n4049","loc":[-85.623159,41.951539]},"n405":{"id":"n405","loc":[-85.633348,41.944015]},"n4050":{"id":"n4050","loc":[-85.623025,41.95155]},"n4051":{"id":"n4051","loc":[-85.622955,41.951551]},"n4052":{"id":"n4052","loc":[-85.622953,41.951507]},"n4053":{"id":"n4053","loc":[-85.623024,41.951506]},"n4054":{"id":"n4054","loc":[-85.623318,41.951242]},"n4055":{"id":"n4055","loc":[-85.623175,41.951241]},"n4056":{"id":"n4056","loc":[-85.623176,41.951153]},"n4057":{"id":"n4057","loc":[-85.623319,41.951154]},"n4058":{"id":"n4058","loc":[-85.623077,41.951191]},"n4059":{"id":"n4059","loc":[-85.622973,41.951191]},"n406":{"id":"n406","loc":[-85.63338,41.944048]},"n4060":{"id":"n4060","loc":[-85.622972,41.951349]},"n4061":{"id":"n4061","loc":[-85.623059,41.95135]},"n4062":{"id":"n4062","loc":[-85.62306,41.951301]},"n4063":{"id":"n4063","loc":[-85.623077,41.951301]},"n4064":{"id":"n4064","loc":[-85.623117,41.951405]},"n4065":{"id":"n4065","loc":[-85.62312,41.951087]},"n4066":{"id":"n4066","loc":[-85.623118,41.951274]},"n4067":{"id":"n4067","loc":[-85.62328,41.951275]},"n4068":{"id":"n4068","loc":[-85.62328,41.951242]},"n4069":{"id":"n4069","loc":[-85.623179,41.951392]},"n407":{"id":"n407","loc":[-85.633431,41.94402]},"n4070":{"id":"n4070","loc":[-85.623141,41.951392]},"n4071":{"id":"n4071","loc":[-85.623142,41.95136]},"n4072":{"id":"n4072","loc":[-85.623179,41.951361]},"n4073":{"id":"n4073","loc":[-85.622565,41.951639]},"n4074":{"id":"n4074","loc":[-85.622565,41.951741]},"n4075":{"id":"n4075","loc":[-85.622463,41.95174]},"n4076":{"id":"n4076","loc":[-85.622463,41.95173]},"n4077":{"id":"n4077","loc":[-85.622442,41.95173]},"n4078":{"id":"n4078","loc":[-85.622442,41.951742]},"n4079":{"id":"n4079","loc":[-85.622361,41.951742]},"n408":{"id":"n408","loc":[-85.633425,41.944014]},"n4080":{"id":"n4080","loc":[-85.622362,41.951667]},"n4081":{"id":"n4081","loc":[-85.622441,41.951667]},"n4082":{"id":"n4082","loc":[-85.622441,41.951688]},"n4083":{"id":"n4083","loc":[-85.622461,41.951688]},"n4084":{"id":"n4084","loc":[-85.622461,41.951638]},"n4085":{"id":"n4085","loc":[-85.62255,41.951587]},"n4086":{"id":"n4086","loc":[-85.622449,41.95159]},"n4087":{"id":"n4087","loc":[-85.622441,41.951448]},"n4088":{"id":"n4088","loc":[-85.62253,41.951445]},"n4089":{"id":"n4089","loc":[-85.622532,41.951486]},"n409":{"id":"n409","loc":[-85.633457,41.943997]},"n4090":{"id":"n4090","loc":[-85.622555,41.951485]},"n4091":{"id":"n4091","loc":[-85.622558,41.951531]},"n4092":{"id":"n4092","loc":[-85.622547,41.951531]},"n4093":{"id":"n4093","loc":[-85.622451,41.95159]},"n4094":{"id":"n4094","loc":[-85.622452,41.95161]},"n4095":{"id":"n4095","loc":[-85.622106,41.951617]},"n4096":{"id":"n4096","loc":[-85.622133,41.951443]},"n4097":{"id":"n4097","loc":[-85.622552,41.951379]},"n4098":{"id":"n4098","loc":[-85.622443,41.95138]},"n4099":{"id":"n4099","loc":[-85.622441,41.951281]},"n41":{"id":"n41","loc":[-85.636233,41.942764]},"n410":{"id":"n410","loc":[-85.633429,41.943969]},"n4100":{"id":"n4100","loc":[-85.62255,41.95128]},"n4101":{"id":"n4101","loc":[-85.622541,41.951437]},"n4102":{"id":"n4102","loc":[-85.622441,41.951438]},"n4103":{"id":"n4103","loc":[-85.621561,41.951444]},"n4104":{"id":"n4104","loc":[-85.622302,41.951479]},"n4105":{"id":"n4105","loc":[-85.6223,41.95152]},"n4106":{"id":"n4106","loc":[-85.622169,41.951517]},"n4107":{"id":"n4107","loc":[-85.622171,41.951476]},"n4108":{"id":"n4108","loc":[-85.622543,41.951228]},"n4109":{"id":"n4109","loc":[-85.622433,41.951228]},"n411":{"id":"n411","loc":[-85.633442,41.943962]},"n4110":{"id":"n4110","loc":[-85.622433,41.951133]},"n4111":{"id":"n4111","loc":[-85.622543,41.951133]},"n4112":{"id":"n4112","loc":[-85.622356,41.951256]},"n4113":{"id":"n4113","loc":[-85.622293,41.951256]},"n4114":{"id":"n4114","loc":[-85.622292,41.9512]},"n4115":{"id":"n4115","loc":[-85.622313,41.9512]},"n4116":{"id":"n4116","loc":[-85.622312,41.951173]},"n4117":{"id":"n4117","loc":[-85.622364,41.951173]},"n4118":{"id":"n4118","loc":[-85.622365,41.951231]},"n4119":{"id":"n4119","loc":[-85.622355,41.951231]},"n412":{"id":"n412","loc":[-85.633411,41.943932]},"n4120":{"id":"n4120","loc":[-85.62197,41.951155]},"n4121":{"id":"n4121","loc":[-85.62197,41.951213]},"n4122":{"id":"n4122","loc":[-85.621848,41.951213]},"n4123":{"id":"n4123","loc":[-85.621848,41.951155]},"n4124":{"id":"n4124","loc":[-85.622193,41.951268]},"n4125":{"id":"n4125","loc":[-85.622194,41.951305]},"n4126":{"id":"n4126","loc":[-85.622121,41.951306]},"n4127":{"id":"n4127","loc":[-85.622121,41.951322]},"n4128":{"id":"n4128","loc":[-85.621984,41.951324]},"n4129":{"id":"n4129","loc":[-85.621983,41.951271]},"n413":{"id":"n413","loc":[-85.633421,41.943926]},"n4130":{"id":"n4130","loc":[-85.622171,41.9514]},"n4131":{"id":"n4131","loc":[-85.622148,41.951382]},"n4132":{"id":"n4132","loc":[-85.6221,41.951414]},"n4133":{"id":"n4133","loc":[-85.622122,41.951433]},"n4134":{"id":"n4134","loc":[-85.621782,41.951148]},"n4135":{"id":"n4135","loc":[-85.621783,41.951219]},"n4136":{"id":"n4136","loc":[-85.62164,41.951221]},"n4137":{"id":"n4137","loc":[-85.62164,41.951236]},"n4138":{"id":"n4138","loc":[-85.621556,41.951237]},"n4139":{"id":"n4139","loc":[-85.621555,41.95117]},"n414":{"id":"n414","loc":[-85.633376,41.94388]},"n4140":{"id":"n4140","loc":[-85.621644,41.951169]},"n4141":{"id":"n4141","loc":[-85.621643,41.951139]},"n4142":{"id":"n4142","loc":[-85.621719,41.951138]},"n4143":{"id":"n4143","loc":[-85.621719,41.951148]},"n4144":{"id":"n4144","loc":[-85.621409,41.951322]},"n4145":{"id":"n4145","loc":[-85.621338,41.951322]},"n4146":{"id":"n4146","loc":[-85.621336,41.95115]},"n4147":{"id":"n4147","loc":[-85.621521,41.951149]},"n4148":{"id":"n4148","loc":[-85.621522,41.951228]},"n4149":{"id":"n4149","loc":[-85.621408,41.951228]},"n415":{"id":"n415","loc":[-85.633348,41.943895]},"n4150":{"id":"n4150","loc":[-85.621284,41.951219]},"n4151":{"id":"n4151","loc":[-85.621153,41.951219]},"n4152":{"id":"n4152","loc":[-85.621152,41.951152]},"n4153":{"id":"n4153","loc":[-85.621283,41.951152]},"n4154":{"id":"n4154","loc":[-85.621159,41.951241]},"n4155":{"id":"n4155","loc":[-85.62116,41.951301]},"n4156":{"id":"n4156","loc":[-85.621088,41.951302]},"n4157":{"id":"n4157","loc":[-85.621088,41.951241]},"n4158":{"id":"n4158","loc":[-85.621049,41.951158]},"n4159":{"id":"n4159","loc":[-85.62105,41.951229]},"n416":{"id":"n416","loc":[-85.633341,41.943888]},"n4160":{"id":"n4160","loc":[-85.620976,41.951229]},"n4161":{"id":"n4161","loc":[-85.620977,41.951295]},"n4162":{"id":"n4162","loc":[-85.620887,41.951296]},"n4163":{"id":"n4163","loc":[-85.620886,41.951229]},"n4164":{"id":"n4164","loc":[-85.620862,41.951229]},"n4165":{"id":"n4165","loc":[-85.620861,41.951159]},"n4166":{"id":"n4166","loc":[-85.620626,41.951133]},"n4167":{"id":"n4167","loc":[-85.620626,41.951205]},"n4168":{"id":"n4168","loc":[-85.620412,41.951206]},"n4169":{"id":"n4169","loc":[-85.620411,41.951134]},"n417":{"id":"n417","loc":[-85.633321,41.943898]},"n4170":{"id":"n4170","loc":[-85.621775,41.951443]},"n4171":{"id":"n4171","loc":[-85.621777,41.951264]},"n4172":{"id":"n4172","loc":[-85.621565,41.951654]},"n4173":{"id":"n4173","loc":[-85.621331,41.951439]},"n4174":{"id":"n4174","loc":[-85.621031,41.951443]},"n4175":{"id":"n4175","loc":[-85.621836,41.951724]},"n4176":{"id":"n4176","loc":[-85.621834,41.951621]},"n4177":{"id":"n4177","loc":[-85.62197,41.951619]},"n4178":{"id":"n4178","loc":[-85.621972,41.951722]},"n4179":{"id":"n4179","loc":[-85.621772,41.951638]},"n418":{"id":"n418","loc":[-85.633547,41.943896]},"n4180":{"id":"n4180","loc":[-85.621772,41.951715]},"n4181":{"id":"n4181","loc":[-85.621699,41.951716]},"n4182":{"id":"n4182","loc":[-85.6217,41.951722]},"n4183":{"id":"n4183","loc":[-85.621641,41.951722]},"n4184":{"id":"n4184","loc":[-85.62164,41.951639]},"n4185":{"id":"n4185","loc":[-85.621505,41.951655]},"n4186":{"id":"n4186","loc":[-85.621505,41.951729]},"n4187":{"id":"n4187","loc":[-85.621389,41.951729]},"n4188":{"id":"n4188","loc":[-85.62139,41.951654]},"n4189":{"id":"n4189","loc":[-85.621105,41.951635]},"n419":{"id":"n419","loc":[-85.633467,41.944075]},"n4190":{"id":"n4190","loc":[-85.621104,41.951576]},"n4191":{"id":"n4191","loc":[-85.621168,41.951576]},"n4192":{"id":"n4192","loc":[-85.621168,41.951595]},"n4193":{"id":"n4193","loc":[-85.621261,41.951595]},"n4194":{"id":"n4194","loc":[-85.621261,41.951646]},"n4195":{"id":"n4195","loc":[-85.621294,41.951646]},"n4196":{"id":"n4196","loc":[-85.621294,41.951732]},"n4197":{"id":"n4197","loc":[-85.621251,41.951732]},"n4198":{"id":"n4198","loc":[-85.621251,41.95174]},"n4199":{"id":"n4199","loc":[-85.621175,41.951741]},"n42":{"id":"n42","loc":[-85.635996,41.942727]},"n420":{"id":"n420","loc":[-85.633578,41.944055]},"n4200":{"id":"n4200","loc":[-85.621175,41.951651]},"n4201":{"id":"n4201","loc":[-85.621189,41.951651]},"n4202":{"id":"n4202","loc":[-85.621189,41.951635]},"n4203":{"id":"n4203","loc":[-85.620554,41.951641]},"n4204":{"id":"n4204","loc":[-85.620555,41.951742]},"n4205":{"id":"n4205","loc":[-85.620719,41.951742]},"n4206":{"id":"n4206","loc":[-85.620719,41.951731]},"n4207":{"id":"n4207","loc":[-85.620803,41.95173]},"n4208":{"id":"n4208","loc":[-85.620803,41.951603]},"n4209":{"id":"n4209","loc":[-85.62072,41.951603]},"n421":{"id":"n421","loc":[-85.633462,41.944125]},"n4210":{"id":"n4210","loc":[-85.620721,41.951641]},"n4211":{"id":"n4211","loc":[-85.620269,41.953053]},"n4212":{"id":"n4212","loc":[-85.620229,41.953051]},"n4213":{"id":"n4213","loc":[-85.620231,41.953013]},"n4214":{"id":"n4214","loc":[-85.620271,41.953015]},"n4215":{"id":"n4215","loc":[-85.620215,41.953133]},"n4216":{"id":"n4216","loc":[-85.62013,41.953134]},"n4217":{"id":"n4217","loc":[-85.620129,41.953083]},"n4218":{"id":"n4218","loc":[-85.620214,41.953082]},"n4219":{"id":"n4219","loc":[-85.62016,41.953272]},"n422":{"id":"n422","loc":[-85.633372,41.944061]},"n4220":{"id":"n4220","loc":[-85.620046,41.953273]},"n4221":{"id":"n4221","loc":[-85.620045,41.953171]},"n4222":{"id":"n4222","loc":[-85.620088,41.953171]},"n4223":{"id":"n4223","loc":[-85.620087,41.953162]},"n4224":{"id":"n4224","loc":[-85.620121,41.953162]},"n4225":{"id":"n4225","loc":[-85.620121,41.953173]},"n4226":{"id":"n4226","loc":[-85.620157,41.953173]},"n4227":{"id":"n4227","loc":[-85.620158,41.953196]},"n4228":{"id":"n4228","loc":[-85.620189,41.953196]},"n4229":{"id":"n4229","loc":[-85.620189,41.953246]},"n423":{"id":"n423","loc":[-85.633509,41.943981]},"n4230":{"id":"n4230","loc":[-85.62016,41.953246]},"n4231":{"id":"n4231","loc":[-85.6195,41.954012]},"n4232":{"id":"n4232","loc":[-85.619438,41.954057]},"n4233":{"id":"n4233","loc":[-85.619418,41.954043]},"n4234":{"id":"n4234","loc":[-85.619381,41.954069]},"n4235":{"id":"n4235","loc":[-85.619399,41.954083]},"n4236":{"id":"n4236","loc":[-85.619339,41.954126]},"n4237":{"id":"n4237","loc":[-85.619584,41.954313]},"n4238":{"id":"n4238","loc":[-85.619743,41.954198]},"n4239":{"id":"n4239","loc":[-85.619453,41.954727]},"n424":{"id":"n424","loc":[-85.635421,41.945367]},"n4240":{"id":"n4240","loc":[-85.619503,41.954581]},"n4241":{"id":"n4241","loc":[-85.619597,41.954472]},"n4242":{"id":"n4242","loc":[-85.619862,41.95419]},"n4243":{"id":"n4243","loc":[-85.619506,41.953907]},"n4244":{"id":"n4244","loc":[-85.619261,41.9541]},"n4245":{"id":"n4245","loc":[-85.619246,41.954139]},"n4246":{"id":"n4246","loc":[-85.619244,41.9542]},"n4247":{"id":"n4247","loc":[-85.619259,41.954243]},"n4248":{"id":"n4248","loc":[-85.619285,41.954274]},"n4249":{"id":"n4249","loc":[-85.619123,41.954381]},"n425":{"id":"n425","loc":[-85.634425,41.943552]},"n4250":{"id":"n4250","loc":[-85.619641,41.954607]},"n4251":{"id":"n4251","loc":[-85.619383,41.954615]},"n4252":{"id":"n4252","loc":[-85.61896,41.954391]},"n4253":{"id":"n4253","loc":[-85.619211,41.954178]},"n4254":{"id":"n4254","loc":[-85.619115,41.954102]},"n4255":{"id":"n4255","loc":[-85.619519,41.953821]},"n4256":{"id":"n4256","loc":[-85.619956,41.954156]},"n4257":{"id":"n4257","loc":[-85.619851,41.954266]},"n4258":{"id":"n4258","loc":[-85.619779,41.95436]},"n4259":{"id":"n4259","loc":[-85.620525,41.954364]},"n426":{"id":"n426","loc":[-85.634248,41.943654]},"n4260":{"id":"n4260","loc":[-85.620398,41.954365]},"n4261":{"id":"n4261","loc":[-85.620398,41.954324]},"n4262":{"id":"n4262","loc":[-85.620525,41.954323]},"n4263":{"id":"n4263","loc":[-85.620359,41.954588]},"n4264":{"id":"n4264","loc":[-85.620321,41.954588]},"n4265":{"id":"n4265","loc":[-85.620321,41.954599]},"n4266":{"id":"n4266","loc":[-85.620296,41.954599]},"n4267":{"id":"n4267","loc":[-85.620296,41.954587]},"n4268":{"id":"n4268","loc":[-85.620262,41.954588]},"n4269":{"id":"n4269","loc":[-85.620261,41.954516]},"n427":{"id":"n427","loc":[-85.634177,41.943585]},"n4270":{"id":"n4270","loc":[-85.620282,41.954516]},"n4271":{"id":"n4271","loc":[-85.620282,41.954373]},"n4272":{"id":"n4272","loc":[-85.620378,41.954373]},"n4273":{"id":"n4273","loc":[-85.620379,41.954486]},"n4274":{"id":"n4274","loc":[-85.620348,41.954486]},"n4275":{"id":"n4275","loc":[-85.620348,41.954537]},"n4276":{"id":"n4276","loc":[-85.620359,41.954537]},"n4277":{"id":"n4277","loc":[-85.620463,41.95521]},"n4278":{"id":"n4278","loc":[-85.620409,41.955273]},"n4279":{"id":"n4279","loc":[-85.620205,41.955177]},"n428":{"id":"n428","loc":[-85.634354,41.943484]},"n4280":{"id":"n4280","loc":[-85.620288,41.955079]},"n4281":{"id":"n4281","loc":[-85.620379,41.955121]},"n4282":{"id":"n4282","loc":[-85.620349,41.955157]},"n4283":{"id":"n4283","loc":[-85.620083,41.955101]},"n4284":{"id":"n4284","loc":[-85.620083,41.954986]},"n4285":{"id":"n4285","loc":[-85.620016,41.954986]},"n4286":{"id":"n4286","loc":[-85.620016,41.954999]},"n4287":{"id":"n4287","loc":[-85.619941,41.954999]},"n4288":{"id":"n4288","loc":[-85.619941,41.954988]},"n4289":{"id":"n4289","loc":[-85.619815,41.954988]},"n429":{"id":"n429","loc":[-85.638577,41.943212]},"n4290":{"id":"n4290","loc":[-85.619815,41.955075]},"n4291":{"id":"n4291","loc":[-85.619948,41.955075]},"n4292":{"id":"n4292","loc":[-85.619948,41.955082]},"n4293":{"id":"n4293","loc":[-85.620004,41.955082]},"n4294":{"id":"n4294","loc":[-85.620004,41.955101]},"n4295":{"id":"n4295","loc":[-85.619293,41.955127]},"n4296":{"id":"n4296","loc":[-85.619208,41.955124]},"n4297":{"id":"n4297","loc":[-85.619212,41.955061]},"n4298":{"id":"n4298","loc":[-85.619297,41.955064]},"n4299":{"id":"n4299","loc":[-85.619068,41.954936]},"n43":{"id":"n43","loc":[-85.637047,41.943054]},"n430":{"id":"n430","loc":[-85.638576,41.943219]},"n4300":{"id":"n4300","loc":[-85.619003,41.954936]},"n4301":{"id":"n4301","loc":[-85.619004,41.955003]},"n4302":{"id":"n4302","loc":[-85.618994,41.955003]},"n4303":{"id":"n4303","loc":[-85.618994,41.955016]},"n4304":{"id":"n4304","loc":[-85.618973,41.955016]},"n4305":{"id":"n4305","loc":[-85.618973,41.955071]},"n4306":{"id":"n4306","loc":[-85.619061,41.955071]},"n4307":{"id":"n4307","loc":[-85.61906,41.955024]},"n4308":{"id":"n4308","loc":[-85.619105,41.955024]},"n4309":{"id":"n4309","loc":[-85.619105,41.954956]},"n431":{"id":"n431","loc":[-85.638653,41.943078]},"n4310":{"id":"n4310","loc":[-85.619068,41.954956]},"n4311":{"id":"n4311","loc":[-85.618294,41.954596]},"n4312":{"id":"n4312","loc":[-85.618235,41.954602]},"n4313":{"id":"n4313","loc":[-85.618222,41.954535]},"n4314":{"id":"n4314","loc":[-85.618281,41.954529]},"n4315":{"id":"n4315","loc":[-85.618593,41.954556]},"n4316":{"id":"n4316","loc":[-85.618551,41.954565]},"n4317":{"id":"n4317","loc":[-85.618545,41.954552]},"n4318":{"id":"n4318","loc":[-85.618493,41.954563]},"n4319":{"id":"n4319","loc":[-85.618449,41.954455]},"n432":{"id":"n432","loc":[-85.638654,41.943148]},"n4320":{"id":"n4320","loc":[-85.618544,41.954434]},"n4321":{"id":"n4321","loc":[-85.622545,41.950775]},"n4322":{"id":"n4322","loc":[-85.622546,41.950843]},"n4323":{"id":"n4323","loc":[-85.622503,41.950844]},"n4324":{"id":"n4324","loc":[-85.622503,41.950853]},"n4325":{"id":"n4325","loc":[-85.622479,41.950853]},"n4326":{"id":"n4326","loc":[-85.622478,41.950843]},"n4327":{"id":"n4327","loc":[-85.622425,41.950843]},"n4328":{"id":"n4328","loc":[-85.622425,41.950808]},"n4329":{"id":"n4329","loc":[-85.622366,41.950809]},"n433":{"id":"n433","loc":[-85.638387,41.943151]},"n4330":{"id":"n4330","loc":[-85.622364,41.950673]},"n4331":{"id":"n4331","loc":[-85.622448,41.950673]},"n4332":{"id":"n4332","loc":[-85.622449,41.950732]},"n4333":{"id":"n4333","loc":[-85.622479,41.950731]},"n4334":{"id":"n4334","loc":[-85.622479,41.950775]},"n4335":{"id":"n4335","loc":[-85.621909,41.950641]},"n4336":{"id":"n4336","loc":[-85.621864,41.950641]},"n4337":{"id":"n4337","loc":[-85.621865,41.950567]},"n4338":{"id":"n4338","loc":[-85.62191,41.950567]},"n4339":{"id":"n4339","loc":[-85.621787,41.950829]},"n434":{"id":"n434","loc":[-85.638386,41.94308]},"n4340":{"id":"n4340","loc":[-85.621786,41.950775]},"n4341":{"id":"n4341","loc":[-85.621588,41.950776]},"n4342":{"id":"n4342","loc":[-85.621589,41.950848]},"n4343":{"id":"n4343","loc":[-85.621737,41.950847]},"n4344":{"id":"n4344","loc":[-85.621737,41.950829]},"n4345":{"id":"n4345","loc":[-85.621509,41.950846]},"n4346":{"id":"n4346","loc":[-85.621399,41.950846]},"n4347":{"id":"n4347","loc":[-85.621398,41.95073]},"n4348":{"id":"n4348","loc":[-85.621509,41.95073]},"n4349":{"id":"n4349","loc":[-85.621217,41.950841]},"n435":{"id":"n435","loc":[-85.634427,41.943533]},"n4350":{"id":"n4350","loc":[-85.6211,41.95084]},"n4351":{"id":"n4351","loc":[-85.6211,41.950777]},"n4352":{"id":"n4352","loc":[-85.621218,41.950778]},"n4353":{"id":"n4353","loc":[-85.621055,41.950764]},"n4354":{"id":"n4354","loc":[-85.621054,41.950826]},"n4355":{"id":"n4355","loc":[-85.620988,41.950826]},"n4356":{"id":"n4356","loc":[-85.620988,41.950843]},"n4357":{"id":"n4357","loc":[-85.620842,41.950843]},"n4358":{"id":"n4358","loc":[-85.620842,41.950764]},"n4359":{"id":"n4359","loc":[-85.620825,41.950922]},"n436":{"id":"n436","loc":[-85.63428,41.943229]},"n4360":{"id":"n4360","loc":[-85.620824,41.950553]},"n4361":{"id":"n4361","loc":[-85.620543,41.950771]},"n4362":{"id":"n4362","loc":[-85.620431,41.950772]},"n4363":{"id":"n4363","loc":[-85.62043,41.950585]},"n4364":{"id":"n4364","loc":[-85.620542,41.950585]},"n4365":{"id":"n4365","loc":[-85.62068,41.950505]},"n4366":{"id":"n4366","loc":[-85.620681,41.950552]},"n4367":{"id":"n4367","loc":[-85.620589,41.950553]},"n4368":{"id":"n4368","loc":[-85.620588,41.950506]},"n4369":{"id":"n4369","loc":[-85.620539,41.950407]},"n437":{"id":"n437","loc":[-85.634499,41.943461]},"n4370":{"id":"n4370","loc":[-85.62054,41.950504]},"n4371":{"id":"n4371","loc":[-85.620416,41.950504]},"n4372":{"id":"n4372","loc":[-85.620416,41.950408]},"n4373":{"id":"n4373","loc":[-85.620742,41.95038]},"n4374":{"id":"n4374","loc":[-85.620527,41.95038]},"n4375":{"id":"n4375","loc":[-85.620528,41.950408]},"n4376":{"id":"n4376","loc":[-85.622449,41.950373]},"n4377":{"id":"n4377","loc":[-85.622452,41.950397]},"n4378":{"id":"n4378","loc":[-85.622336,41.950404]},"n4379":{"id":"n4379","loc":[-85.622333,41.950379]},"n438":{"id":"n438","loc":[-85.634514,41.943486]},"n4380":{"id":"n4380","loc":[-85.622263,41.950324]},"n4381":{"id":"n4381","loc":[-85.622261,41.950256]},"n4382":{"id":"n4382","loc":[-85.62236,41.950254]},"n4383":{"id":"n4383","loc":[-85.62236,41.95027]},"n4384":{"id":"n4384","loc":[-85.622402,41.950281]},"n4385":{"id":"n4385","loc":[-85.622403,41.9503]},"n4386":{"id":"n4386","loc":[-85.622439,41.950299]},"n4387":{"id":"n4387","loc":[-85.62244,41.950334]},"n4388":{"id":"n4388","loc":[-85.622414,41.950335]},"n4389":{"id":"n4389","loc":[-85.622414,41.95036]},"n439":{"id":"n439","loc":[-85.63452,41.943511]},"n4390":{"id":"n4390","loc":[-85.62231,41.950362]},"n4391":{"id":"n4391","loc":[-85.622309,41.950323]},"n4392":{"id":"n4392","loc":[-85.622015,41.950539]},"n4393":{"id":"n4393","loc":[-85.621909,41.95054]},"n4394":{"id":"n4394","loc":[-85.621909,41.950472]},"n4395":{"id":"n4395","loc":[-85.622015,41.950471]},"n4396":{"id":"n4396","loc":[-85.62199,41.950439]},"n4397":{"id":"n4397","loc":[-85.621956,41.95044]},"n4398":{"id":"n4398","loc":[-85.621955,41.950405]},"n4399":{"id":"n4399","loc":[-85.621988,41.950404]},"n44":{"id":"n44","loc":[-85.636799,41.943055]},"n440":{"id":"n440","loc":[-85.63451,41.943534]},"n4400":{"id":"n4400","loc":[-85.621668,41.950418]},"n4401":{"id":"n4401","loc":[-85.621667,41.950343]},"n4402":{"id":"n4402","loc":[-85.621745,41.950342]},"n4403":{"id":"n4403","loc":[-85.621744,41.950306]},"n4404":{"id":"n4404","loc":[-85.621764,41.950306]},"n4405":{"id":"n4405","loc":[-85.621763,41.950254]},"n4406":{"id":"n4406","loc":[-85.621861,41.950253]},"n4407":{"id":"n4407","loc":[-85.621861,41.950274]},"n4408":{"id":"n4408","loc":[-85.621896,41.950273]},"n4409":{"id":"n4409","loc":[-85.621898,41.950389]},"n441":{"id":"n441","loc":[-85.634483,41.943556]},"n4410":{"id":"n4410","loc":[-85.621843,41.95039]},"n4411":{"id":"n4411","loc":[-85.621843,41.950425]},"n4412":{"id":"n4412","loc":[-85.621789,41.950425]},"n4413":{"id":"n4413","loc":[-85.621789,41.950386]},"n4414":{"id":"n4414","loc":[-85.621752,41.950387]},"n4415":{"id":"n4415","loc":[-85.621753,41.950417]},"n4416":{"id":"n4416","loc":[-85.621556,41.950562]},"n4417":{"id":"n4417","loc":[-85.621552,41.950217]},"n4418":{"id":"n4418","loc":[-85.621788,41.950562]},"n4419":{"id":"n4419","loc":[-85.621155,41.950562]},"n442":{"id":"n442","loc":[-85.63419,41.943713]},"n4420":{"id":"n4420","loc":[-85.622473,41.950551]},"n4421":{"id":"n4421","loc":[-85.622043,41.950551]},"n4422":{"id":"n4422","loc":[-85.62142,41.950454]},"n4423":{"id":"n4423","loc":[-85.621315,41.950455]},"n4424":{"id":"n4424","loc":[-85.621313,41.950311]},"n4425":{"id":"n4425","loc":[-85.621388,41.950311]},"n4426":{"id":"n4426","loc":[-85.621387,41.950261]},"n4427":{"id":"n4427","loc":[-85.621468,41.95026]},"n4428":{"id":"n4428","loc":[-85.621468,41.950271]},"n4429":{"id":"n4429","loc":[-85.621503,41.95027]},"n443":{"id":"n443","loc":[-85.634462,41.943294]},"n4430":{"id":"n4430","loc":[-85.621505,41.950353]},"n4431":{"id":"n4431","loc":[-85.621483,41.950354]},"n4432":{"id":"n4432","loc":[-85.621483,41.950392]},"n4433":{"id":"n4433","loc":[-85.621419,41.950393]},"n4434":{"id":"n4434","loc":[-85.621213,41.95039]},"n4435":{"id":"n4435","loc":[-85.621127,41.950391]},"n4436":{"id":"n4436","loc":[-85.621126,41.950357]},"n4437":{"id":"n4437","loc":[-85.621094,41.950357]},"n4438":{"id":"n4438","loc":[-85.621094,41.950391]},"n4439":{"id":"n4439","loc":[-85.620977,41.950392]},"n444":{"id":"n444","loc":[-85.634298,41.943389]},"n4440":{"id":"n4440","loc":[-85.620975,41.950278]},"n4441":{"id":"n4441","loc":[-85.621087,41.950277]},"n4442":{"id":"n4442","loc":[-85.621088,41.950331]},"n4443":{"id":"n4443","loc":[-85.621211,41.950312]},"n4444":{"id":"n4444","loc":[-85.621104,41.950313]},"n4445":{"id":"n4445","loc":[-85.621105,41.950331]},"n4446":{"id":"n4446","loc":[-85.620706,41.950328]},"n4447":{"id":"n4447","loc":[-85.620606,41.950327]},"n4448":{"id":"n4448","loc":[-85.620607,41.950261]},"n4449":{"id":"n4449","loc":[-85.620707,41.950262]},"n445":{"id":"n445","loc":[-85.634527,41.943623]},"n4450":{"id":"n4450","loc":[-85.620599,41.950336]},"n4451":{"id":"n4451","loc":[-85.620559,41.950336]},"n4452":{"id":"n4452","loc":[-85.620559,41.950299]},"n4453":{"id":"n4453","loc":[-85.620599,41.950299]},"n4454":{"id":"n4454","loc":[-85.620545,41.950357]},"n4455":{"id":"n4455","loc":[-85.620418,41.950357]},"n4456":{"id":"n4456","loc":[-85.620417,41.950257]},"n4457":{"id":"n4457","loc":[-85.620544,41.950256]},"n4458":{"id":"n4458","loc":[-85.620246,41.950131],"tags":{"highway":"crossing"}},"n4459":{"id":"n4459","loc":[-85.620252,41.950956]},"n446":{"id":"n446","loc":[-85.634608,41.943577]},"n4460":{"id":"n4460","loc":[-85.620245,41.950179]},"n4461":{"id":"n4461","loc":[-85.620246,41.950088]},"n4462":{"id":"n4462","loc":[-85.620251,41.950885]},"n4463":{"id":"n4463","loc":[-85.620103,41.950884],"tags":{"crossing":"zebra","highway":"crossing"}},"n4464":{"id":"n4464","loc":[-85.619992,41.950884]},"n4465":{"id":"n4465","loc":[-85.619704,41.951008]},"n4466":{"id":"n4466","loc":[-85.619599,41.951122]},"n4467":{"id":"n4467","loc":[-85.619264,41.951486]},"n4468":{"id":"n4468","loc":[-85.619179,41.951573],"tags":{"highway":"crossing"}},"n4469":{"id":"n4469","loc":[-85.620251,41.950999],"tags":{"highway":"crossing"}},"n447":{"id":"n447","loc":[-85.634555,41.943531]},"n4470":{"id":"n4470","loc":[-85.620249,41.951066]},"n4471":{"id":"n4471","loc":[-85.620256,41.951374]},"n4472":{"id":"n4472","loc":[-85.620249,41.951389]},"n4473":{"id":"n4473","loc":[-85.620249,41.951407]},"n4474":{"id":"n4474","loc":[-85.620255,41.951423]},"n4475":{"id":"n4475","loc":[-85.62026,41.951853]},"n4476":{"id":"n4476","loc":[-85.620262,41.951894],"tags":{"highway":"crossing"}},"n4477":{"id":"n4477","loc":[-85.620265,41.951957]},"n4478":{"id":"n4478","loc":[-85.620262,41.952135]},"n4479":{"id":"n4479","loc":[-85.620241,41.952424]},"n448":{"id":"n448","loc":[-85.634555,41.943482]},"n4480":{"id":"n4480","loc":[-85.620213,41.952583]},"n4481":{"id":"n4481","loc":[-85.620158,41.952754]},"n4482":{"id":"n4482","loc":[-85.620065,41.952942]},"n4483":{"id":"n4483","loc":[-85.619753,41.953439]},"n4484":{"id":"n4484","loc":[-85.619605,41.953626]},"n4485":{"id":"n4485","loc":[-85.619381,41.953834]},"n4486":{"id":"n4486","loc":[-85.619069,41.954066]},"n4487":{"id":"n4487","loc":[-85.618674,41.95429]},"n4488":{"id":"n4488","loc":[-85.621816,41.952389]},"n4489":{"id":"n4489","loc":[-85.6217,41.952386]},"n449":{"id":"n449","loc":[-85.634509,41.943427]},"n4490":{"id":"n4490","loc":[-85.621705,41.952306]},"n4491":{"id":"n4491","loc":[-85.621821,41.95231]},"n4492":{"id":"n4492","loc":[-85.621819,41.952272]},"n4493":{"id":"n4493","loc":[-85.621778,41.952272]},"n4494":{"id":"n4494","loc":[-85.621778,41.952199]},"n4495":{"id":"n4495","loc":[-85.621818,41.952199]},"n4496":{"id":"n4496","loc":[-85.621754,41.952281]},"n4497":{"id":"n4497","loc":[-85.621701,41.95228]},"n4498":{"id":"n4498","loc":[-85.621702,41.952197]},"n4499":{"id":"n4499","loc":[-85.621755,41.952197]},"n45":{"id":"n45","loc":[-85.636791,41.942792]},"n450":{"id":"n450","loc":[-85.63453,41.943365]},"n4500":{"id":"n4500","loc":[-85.628201,41.954694],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all","direction":"backward"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4508":{"id":"n4508","loc":[-85.629559,41.957343]},"n4509":{"id":"n4509","loc":[-85.628723,41.95735]},"n451":{"id":"n451","loc":[-85.634356,41.943468]},"n4510":{"id":"n4510","loc":[-85.62842,41.957515]},"n4511":{"id":"n4511","loc":[-85.627561,41.957525]},"n4512":{"id":"n4512","loc":[-85.630323,41.957508]},"n4513":{"id":"n4513","loc":[-85.630811,41.957506]},"n4514":{"id":"n4514","loc":[-85.630839,41.960874]},"n4515":{"id":"n4515","loc":[-85.631035,41.957506]},"n4516":{"id":"n4516","loc":[-85.632027,41.9575]},"n4517":{"id":"n4517","loc":[-85.631038,41.958066]},"n4518":{"id":"n4518","loc":[-85.630787,41.954769]},"n4519":{"id":"n4519","loc":[-85.630806,41.957342]},"n452":{"id":"n452","loc":[-85.634123,41.943596]},"n4520":{"id":"n4520","loc":[-85.630809,41.957428],"tags":{"highway":"crossing"}},"n4521":{"id":"n4521","loc":[-85.630912,41.957506],"tags":{"highway":"crossing"}},"n4522":{"id":"n4522","loc":[-85.631033,41.957428],"tags":{"highway":"crossing"}},"n4523":{"id":"n4523","loc":[-85.631032,41.957341]},"n4524":{"id":"n4524","loc":[-85.63091,41.957341],"tags":{"highway":"crossing"}},"n4525":{"id":"n4525","loc":[-85.631027,41.95597]},"n4526":{"id":"n4526","loc":[-85.631027,41.955913],"tags":{"highway":"crossing"}},"n4527":{"id":"n4527","loc":[-85.631025,41.955873]},"n4528":{"id":"n4528","loc":[-85.631073,41.955913],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4529":{"id":"n4529","loc":[-85.631007,41.954766]},"n453":{"id":"n453","loc":[-85.634709,41.943926]},"n4530":{"id":"n4530","loc":[-85.630881,41.954768],"tags":{"highway":"crossing"}},"n4531":{"id":"n4531","loc":[-85.628022,41.954776]},"n4532":{"id":"n4532","loc":[-85.627385,41.95584]},"n4533":{"id":"n4533","loc":[-85.627329,41.955937]},"n4534":{"id":"n4534","loc":[-85.626583,41.957153]},"n4535":{"id":"n4535","loc":[-85.629675,41.954564],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4538":{"id":"n4538","loc":[-85.630784,41.954682],"tags":{"highway":"crossing"}},"n4539":{"id":"n4539","loc":[-85.63078,41.954595]},"n454":{"id":"n454","loc":[-85.63525,41.943855]},"n4540":{"id":"n4540","loc":[-85.630879,41.954595],"tags":{"highway":"crossing"}},"n4541":{"id":"n4541","loc":[-85.631004,41.954594]},"n4542":{"id":"n4542","loc":[-85.631006,41.954681],"tags":{"highway":"crossing"}},"n4543":{"id":"n4543","loc":[-85.631045,41.959036],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way","direction":"forward"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way","direction":"backward"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4552":{"id":"n4552","loc":[-85.626519,41.957256]},"n4553":{"id":"n4553","loc":[-85.625334,41.959165]},"n4554":{"id":"n4554","loc":[-85.626483,41.95806]},"n4555":{"id":"n4555","loc":[-85.626481,41.958175]},"n4556":{"id":"n4556","loc":[-85.626412,41.958174]},"n4557":{"id":"n4557","loc":[-85.626412,41.958202]},"n4558":{"id":"n4558","loc":[-85.62628,41.958201]},"n4559":{"id":"n4559","loc":[-85.626283,41.958057]},"n456":{"id":"n456","loc":[-85.638854,41.943104]},"n4560":{"id":"n4560","loc":[-85.622763,41.95109],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4561":{"id":"n4561","loc":[-85.622858,41.950876],"tags":{"emergency":"fire_hydrant"}},"n4562":{"id":"n4562","loc":[-85.624073,41.950393]},"n4563":{"id":"n4563","loc":[-85.624077,41.950924]},"n4564":{"id":"n4564","loc":[-85.624599,41.950984],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4565":{"id":"n4565","loc":[-85.624831,41.95119],"tags":{"emergency":"fire_hydrant"}},"n4566":{"id":"n4566","loc":[-85.624437,41.952568],"tags":{"emergency":"fire_hydrant"}},"n4567":{"id":"n4567","loc":[-85.624077,41.954606],"tags":{"emergency":"fire_hydrant"}},"n4568":{"id":"n4568","loc":[-85.624263,41.954888]},"n4569":{"id":"n4569","loc":[-85.624206,41.954919]},"n457":{"id":"n457","loc":[-85.635186,41.943901]},"n4570":{"id":"n4570","loc":[-85.624154,41.954865]},"n4571":{"id":"n4571","loc":[-85.624212,41.954835]},"n4572":{"id":"n4572","loc":[-85.622442,41.954401],"tags":{"emergency":"fire_hydrant"}},"n4573":{"id":"n4573","loc":[-85.619751,41.954658],"tags":{"emergency":"fire_hydrant"}},"n4574":{"id":"n4574","loc":[-85.617785,41.954534]},"n4575":{"id":"n4575","loc":[-85.617416,41.954721]},"n4576":{"id":"n4576","loc":[-85.617662,41.95474]},"n4577":{"id":"n4577","loc":[-85.618014,41.954717]},"n4578":{"id":"n4578","loc":[-85.617886,41.954671]},"n4579":{"id":"n4579","loc":[-85.617831,41.954612]},"n458":{"id":"n458","loc":[-85.635162,41.943917]},"n4580":{"id":"n4580","loc":[-85.617968,41.954752]},"n4581":{"id":"n4581","loc":[-85.617815,41.954752]},"n4582":{"id":"n4582","loc":[-85.617938,41.954695]},"n4583":{"id":"n4583","loc":[-85.617856,41.954642],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4584":{"id":"n4584","loc":[-85.619116,41.954164],"tags":{"man_made":"flagpole"}},"n4585":{"id":"n4585","loc":[-85.619569,41.953255],"tags":{"emergency":"fire_hydrant"}},"n4586":{"id":"n4586","loc":[-85.620352,41.951894],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n459":{"id":"n459","loc":[-85.634856,41.943905]},"n4590":{"id":"n4590","loc":[-85.620374,41.95018],"tags":{"emergency":"fire_hydrant"}},"n4591":{"id":"n4591","loc":[-85.620301,41.949239],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4594":{"id":"n4594","loc":[-85.620191,41.947352],"tags":{"emergency":"fire_hydrant"}},"n4595":{"id":"n4595","loc":[-85.622819,41.947493],"tags":{"emergency":"fire_hydrant"}},"n4596":{"id":"n4596","loc":[-85.622744,41.947541],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4598":{"id":"n4598","loc":[-85.622909,41.948333],"tags":{"highway":"give_way"}},"n4599":{"id":"n4599","loc":[-85.622593,41.948333],"tags":{"highway":"give_way"}},"n46":{"id":"n46","loc":[-85.637131,41.94307]},"n460":{"id":"n460","loc":[-85.634811,41.944007]},"n4600":{"id":"n4600","loc":[-85.622835,41.948387],"tags":{"emergency":"fire_hydrant"}},"n4601":{"id":"n4601","loc":[-85.622768,41.949125],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way","direction":"forward"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4606":{"id":"n4606","loc":[-85.624849,41.949106],"tags":{"emergency":"fire_hydrant"}},"n4607":{"id":"n4607","loc":[-85.624858,41.950119],"tags":{"emergency":"fire_hydrant"}},"n4608":{"id":"n4608","loc":[-85.624752,41.948334],"tags":{"highway":"give_way"}},"n4609":{"id":"n4609","loc":[-85.624845,41.948422],"tags":{"emergency":"fire_hydrant"}},"n461":{"id":"n461","loc":[-85.634987,41.943112]},"n4610":{"id":"n4610","loc":[-85.62484,41.947539],"tags":{"emergency":"fire_hydrant"}},"n4611":{"id":"n4611","loc":[-85.62476,41.947428],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4612":{"id":"n4612","loc":[-85.620286,41.950926]},"n4613":{"id":"n4613","loc":[-85.618237,41.950963]},"n4614":{"id":"n4614","loc":[-85.618107,41.950876]},"n4615":{"id":"n4615","loc":[-85.618131,41.950393]},"n4616":{"id":"n4616","loc":[-85.618232,41.949913]},"n4617":{"id":"n4617","loc":[-85.619138,41.950212]},"n4618":{"id":"n4618","loc":[-85.619299,41.950388]},"n4619":{"id":"n4619","loc":[-85.619306,41.950897]},"n462":{"id":"n462","loc":[-85.634698,41.943194]},"n4620":{"id":"n4620","loc":[-85.619155,41.950958]},"n4621":{"id":"n4621","loc":[-85.620079,41.947715]},"n4622":{"id":"n4622","loc":[-85.619674,41.947728]},"n4623":{"id":"n4623","loc":[-85.619634,41.947735]},"n4624":{"id":"n4624","loc":[-85.619587,41.947756],"tags":{"barrier":"gate"}},"n4625":{"id":"n4625","loc":[-85.61953,41.947796]},"n4626":{"id":"n4626","loc":[-85.619475,41.947847]},"n4627":{"id":"n4627","loc":[-85.619433,41.947903]},"n4628":{"id":"n4628","loc":[-85.619402,41.947982]},"n4629":{"id":"n4629","loc":[-85.619394,41.948043]},"n463":{"id":"n463","loc":[-85.634632,41.943219]},"n4630":{"id":"n4630","loc":[-85.619395,41.948476]},"n4631":{"id":"n4631","loc":[-85.618367,41.947452]},"n4632":{"id":"n4632","loc":[-85.618371,41.947567],"tags":{"barrier":"gate"}},"n4633":{"id":"n4633","loc":[-85.618341,41.947622]},"n4634":{"id":"n4634","loc":[-85.618138,41.94773]},"n4635":{"id":"n4635","loc":[-85.618078,41.947814]},"n4636":{"id":"n4636","loc":[-85.618072,41.948009]},"n4637":{"id":"n4637","loc":[-85.618269,41.947666]},"n4638":{"id":"n4638","loc":[-85.618099,41.947765]},"n4639":{"id":"n4639","loc":[-85.618378,41.954453]},"n464":{"id":"n464","loc":[-85.63459,41.943239]},"n4640":{"id":"n4640","loc":[-85.618198,41.95453]},"n4641":{"id":"n4641","loc":[-85.618212,41.954623]},"n4642":{"id":"n4642","loc":[-85.635211,41.943103],"tags":{"leisure":"picnic_table"}},"n4643":{"id":"n4643","loc":[-85.635345,41.943448],"tags":{"leisure":"picnic_table"}},"n4644":{"id":"n4644","loc":[-85.635901,41.943353],"tags":{"amenity":"bench"}},"n4645":{"id":"n4645","loc":[-85.635815,41.942638],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4646":{"id":"n4646","loc":[-85.635355,41.942044],"tags":{"leisure":"picnic_table"}},"n4647":{"id":"n4647","loc":[-85.635206,41.942045],"tags":{"leisure":"picnic_table"}},"n4648":{"id":"n4648","loc":[-85.63504,41.941992],"tags":{"leisure":"picnic_table"}},"n4649":{"id":"n4649","loc":[-85.635185,41.942001]},"n465":{"id":"n465","loc":[-85.634555,41.943263]},"n4650":{"id":"n4650","loc":[-85.635176,41.942021]},"n4651":{"id":"n4651","loc":[-85.635127,41.942008]},"n4652":{"id":"n4652","loc":[-85.635136,41.941988]},"n4653":{"id":"n4653","loc":[-85.635,41.941709],"tags":{"emergency":"fire_hydrant"}},"n4654":{"id":"n4654","loc":[-85.634893,41.941801]},"n4655":{"id":"n4655","loc":[-85.634937,41.941843]},"n4656":{"id":"n4656","loc":[-85.634963,41.941859]},"n4657":{"id":"n4657","loc":[-85.635027,41.941904]},"n4658":{"id":"n4658","loc":[-85.63494,41.94187]},"n4659":{"id":"n4659","loc":[-85.634951,41.941871]},"n466":{"id":"n466","loc":[-85.634526,41.943289]},"n4660":{"id":"n4660","loc":[-85.634753,41.941701],"tags":{"amenity":"drinking_water"}},"n4661":{"id":"n4661","loc":[-85.634717,41.941804],"tags":{"amenity":"bench"}},"n4662":{"id":"n4662","loc":[-85.634554,41.941883],"tags":{"amenity":"bench"}},"n4663":{"id":"n4663","loc":[-85.635002,41.941579],"tags":{"amenity":"fountain"}},"n4664":{"id":"n4664","loc":[-85.635258,41.94188],"tags":{"amenity":"waste_basket"}},"n4665":{"id":"n4665","loc":[-85.635262,41.941581],"tags":{"amenity":"bench"}},"n4666":{"id":"n4666","loc":[-85.635319,41.941744],"tags":{"amenity":"bench"}},"n4667":{"id":"n4667","loc":[-85.634702,41.941473],"tags":{"amenity":"waste_basket"}},"n4668":{"id":"n4668","loc":[-85.633981,41.941966],"tags":{"amenity":"bench"}},"n4669":{"id":"n4669","loc":[-85.63388,41.941743]},"n467":{"id":"n467","loc":[-85.635163,41.944985]},"n4670":{"id":"n4670","loc":[-85.633746,41.941741]},"n4671":{"id":"n4671","loc":[-85.633749,41.941664]},"n4672":{"id":"n4672","loc":[-85.633883,41.941667]},"n4673":{"id":"n4673","loc":[-85.634283,41.941183],"tags":{"leisure":"picnic_table"}},"n4674":{"id":"n4674","loc":[-85.634046,41.941102],"tags":{"amenity":"bbq"}},"n4675":{"id":"n4675","loc":[-85.63401,41.941093],"tags":{"amenity":"bbq"}},"n4676":{"id":"n4676","loc":[-85.633408,41.940862],"tags":{"amenity":"bench"}},"n4677":{"id":"n4677","loc":[-85.633359,41.940651],"tags":{"amenity":"bench"}},"n4678":{"id":"n4678","loc":[-85.634109,41.940831]},"n4679":{"id":"n4679","loc":[-85.63396,41.940867]},"n468":{"id":"n468","loc":[-85.635095,41.945035]},"n4680":{"id":"n4680","loc":[-85.633816,41.940913]},"n4681":{"id":"n4681","loc":[-85.633237,41.940455]},"n4682":{"id":"n4682","loc":[-85.634453,41.940025],"tags":{"emergency":"fire_hydrant"}},"n4683":{"id":"n4683","loc":[-85.635692,41.940218],"tags":{"emergency":"fire_hydrant"}},"n4684":{"id":"n4684","loc":[-85.635566,41.940102],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4686":{"id":"n4686","loc":[-85.635883,41.94012],"tags":{"crossing":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","highway":"crossing"}},"n4689":{"id":"n4689","loc":[-85.635669,41.940043]},"n469":{"id":"n469","loc":[-85.634269,41.944431]},"n4690":{"id":"n4690","loc":[-85.635661,41.940107],"tags":{"crossing":"zebra","highway":"crossing"}},"n4691":{"id":"n4691","loc":[-85.635424,41.941005],"tags":{"amenity":"fountain"}},"n4692":{"id":"n4692","loc":[-85.635542,41.941371],"tags":{"amenity":"bench"}},"n4693":{"id":"n4693","loc":[-85.635709,41.941341],"tags":{"emergency":"fire_hydrant"}},"n4694":{"id":"n4694","loc":[-85.637038,41.942513],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way","direction":"forward"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way","direction":"backward"}},"n4699":{"id":"n4699","loc":[-85.638288,41.941236],"tags":{"emergency":"fire_hydrant"}},"n47":{"id":"n47","loc":[-85.636693,41.943073]},"n470":{"id":"n470","loc":[-85.634352,41.944376]},"n4700":{"id":"n4700","loc":[-85.63935,41.94128],"tags":{"emergency":"fire_hydrant"}},"n4701":{"id":"n4701","loc":[-85.639277,41.941337],"tags":{"highway":"give_way","direction":"forward"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way","direction":"backward"}},"n4703":{"id":"n4703","loc":[-85.642191,41.940039]},"n4704":{"id":"n4704","loc":[-85.640585,41.941263],"tags":{"emergency":"fire_hydrant"}},"n4705":{"id":"n4705","loc":[-85.64049,41.941327],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop","direction":"forward","stop":"all"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"n4709":{"id":"n4709","loc":[-85.641756,41.941392],"tags":{"emergency":"fire_hydrant"}},"n471":{"id":"n471","loc":[-85.634747,41.944561],"tags":{"railway":"crossing"}},"n4710":{"id":"n4710","loc":[-85.642014,41.941313],"tags":{"highway":"stop","direction":"forward","stop":"all"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4719":{"id":"n4719","loc":[-85.639527,41.942505],"tags":{"emergency":"fire_hydrant"}},"n472":{"id":"n472","loc":[-85.634667,41.944613]},"n4720":{"id":"n4720","loc":[-85.638238,41.942745],"tags":{"highway":"stop","direction":"backward","stop":"minor"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4722":{"id":"n4722","loc":[-85.638018,41.94299],"tags":{"amenity":"waste_disposal"}},"n4723":{"id":"n4723","loc":[-85.637918,41.944152],"tags":{"amenity":"waste_basket"}},"n4724":{"id":"n4724","loc":[-85.635902,41.943291],"tags":{"leisure":"picnic_table"}},"n4725":{"id":"n4725","loc":[-85.63704,41.942741],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4728":{"id":"n4728","loc":[-85.632154,41.943539],"tags":{"emergency":"fire_hydrant"}},"n4729":{"id":"n4729","loc":[-85.633567,41.944641],"tags":{"amenity":"bench"}},"n473":{"id":"n473","loc":[-85.634161,41.944371]},"n4730":{"id":"n4730","loc":[-85.633127,41.944574],"tags":{"amenity":"bench"}},"n4731":{"id":"n4731","loc":[-85.633439,41.944871],"tags":{"amenity":"bench"}},"n4732":{"id":"n4732","loc":[-85.633676,41.944799],"tags":{"amenity":"waste_basket"}},"n4733":{"id":"n4733","loc":[-85.633466,41.944862],"tags":{"amenity":"waste_basket"}},"n4734":{"id":"n4734","loc":[-85.633451,41.944847],"tags":{"emergency":"fire_hydrant"}},"n4735":{"id":"n4735","loc":[-85.634202,41.945543],"tags":{"amenity":"waste_basket"}},"n4736":{"id":"n4736","loc":[-85.634652,41.945472],"tags":{"leisure":"picnic_table"}},"n4737":{"id":"n4737","loc":[-85.6347,41.945445],"tags":{"leisure":"picnic_table"}},"n4738":{"id":"n4738","loc":[-85.634646,41.945662],"tags":{"emergency":"fire_hydrant"}},"n4739":{"id":"n4739","loc":[-85.634673,41.945687],"tags":{"amenity":"waste_basket"}},"n474":{"id":"n474","loc":[-85.633861,41.944117]},"n4740":{"id":"n4740","loc":[-85.63449,41.945827],"tags":{"amenity":"clock","display":"analog"}},"n4741":{"id":"n4741","loc":[-85.63481,41.946056],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4742":{"id":"n4742","loc":[-85.634814,41.946176],"tags":{"amenity":"post_box"}},"n4743":{"id":"n4743","loc":[-85.638744,41.945328]},"n4744":{"id":"n4744","loc":[-85.63867,41.945228],"tags":{"amenity":"bench"}},"n4745":{"id":"n4745","loc":[-85.639487,41.945042],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop","stop":"minor","direction":"backward"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop","direction":"forward","stop":"minor"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way","direction":"backward"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way","direction":"forward"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop","stop":"minor","direction":"forward"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop","direction":"backward","stop":"all"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop","stop":"all","direction":"forward"}},"n476":{"id":"n476","loc":[-85.63423,41.943692]},"n4760":{"id":"n4760","loc":[-85.63169,41.947812]},"n4761":{"id":"n4761","loc":[-85.631307,41.947655]},"n4762":{"id":"n4762","loc":[-85.631407,41.947413]},"n4763":{"id":"n4763","loc":[-85.631173,41.947306]},"n4764":{"id":"n4764","loc":[-85.631316,41.947145]},"n4765":{"id":"n4765","loc":[-85.631476,41.947087]},"n4766":{"id":"n4766","loc":[-85.631793,41.946871]},"n4767":{"id":"n4767","loc":[-85.631884,41.946723]},"n4768":{"id":"n4768","loc":[-85.631814,41.946397]},"n4769":{"id":"n4769","loc":[-85.631382,41.947685]},"n477":{"id":"n477","loc":[-85.635096,41.942814]},"n4770":{"id":"n4770","loc":[-85.63109,41.947819]},"n4771":{"id":"n4771","loc":[-85.630921,41.947961]},"n4772":{"id":"n4772","loc":[-85.630249,41.947709]},"n4773":{"id":"n4773","loc":[-85.630149,41.947451]},"n4774":{"id":"n4774","loc":[-85.629733,41.947339]},"n4775":{"id":"n4775","loc":[-85.629755,41.946948]},"n4776":{"id":"n4776","loc":[-85.630457,41.947103]},"n4777":{"id":"n4777","loc":[-85.630934,41.946939]},"n4778":{"id":"n4778","loc":[-85.631277,41.946852]},"n4779":{"id":"n4779","loc":[-85.63142,41.946781]},"n478":{"id":"n478","loc":[-85.635058,41.942795]},"n4780":{"id":"n4780","loc":[-85.631116,41.946474]},"n4781":{"id":"n4781","loc":[-85.63073,41.945965]},"n4782":{"id":"n4782","loc":[-85.631337,41.94571]},"n4783":{"id":"n4783","loc":[-85.631589,41.945487]},"n4784":{"id":"n4784","loc":[-85.632278,41.945784]},"n4785":{"id":"n4785","loc":[-85.632105,41.946034]},"n4786":{"id":"n4786","loc":[-85.632532,41.946198]},"n4787":{"id":"n4787","loc":[-85.632566,41.946151]},"n4788":{"id":"n4788","loc":[-85.632684,41.946196]},"n4789":{"id":"n4789","loc":[-85.628676,41.947106]},"n479":{"id":"n479","loc":[-85.635002,41.94279]},"n4790":{"id":"n4790","loc":[-85.628973,41.946476]},"n4791":{"id":"n4791","loc":[-85.629094,41.946079]},"n4792":{"id":"n4792","loc":[-85.629226,41.94578]},"n4793":{"id":"n4793","loc":[-85.629479,41.945682]},"n4794":{"id":"n4794","loc":[-85.630606,41.94569]},"n4795":{"id":"n4795","loc":[-85.631255,41.945588]},"n4796":{"id":"n4796","loc":[-85.631546,41.945281]},"n4797":{"id":"n4797","loc":[-85.631629,41.944823]},"n4798":{"id":"n4798","loc":[-85.631766,41.944958]},"n4799":{"id":"n4799","loc":[-85.631689,41.945318]},"n48":{"id":"n48","loc":[-85.636689,41.94276]},"n480":{"id":"n480","loc":[-85.634908,41.94279]},"n4800":{"id":"n4800","loc":[-85.615069,41.945527]},"n4801":{"id":"n4801","loc":[-85.615058,41.946677]},"n4802":{"id":"n4802","loc":[-85.613692,41.946689]},"n4803":{"id":"n4803","loc":[-85.613475,41.946531]},"n4804":{"id":"n4804","loc":[-85.611717,41.946252]},"n4805":{"id":"n4805","loc":[-85.611353,41.946385]},"n4806":{"id":"n4806","loc":[-85.611304,41.947397]},"n4807":{"id":"n4807","loc":[-85.610564,41.947401]},"n4808":{"id":"n4808","loc":[-85.610553,41.947122]},"n4809":{"id":"n4809","loc":[-85.610194,41.946992]},"n481":{"id":"n481","loc":[-85.634478,41.942342]},"n4810":{"id":"n4810","loc":[-85.609976,41.946628]},"n4811":{"id":"n4811","loc":[-85.609769,41.946523]},"n4812":{"id":"n4812","loc":[-85.609307,41.946523]},"n4813":{"id":"n4813","loc":[-85.609035,41.946462]},"n4814":{"id":"n4814","loc":[-85.609018,41.943277]},"n4815":{"id":"n4815","loc":[-85.609617,41.943423]},"n4816":{"id":"n4816","loc":[-85.610471,41.943447]},"n4817":{"id":"n4817","loc":[-85.621491,41.949168]},"n4818":{"id":"n4818","loc":[-85.620266,41.94917]},"n4819":{"id":"n4819","loc":[-85.620262,41.947557]},"n482":{"id":"n482","loc":[-85.634521,41.942254]},"n4820":{"id":"n4820","loc":[-85.620825,41.947556]},"n4821":{"id":"n4821","loc":[-85.620827,41.948371]},"n4822":{"id":"n4822","loc":[-85.621489,41.94837]},"n4823":{"id":"n4823","loc":[-85.622865,41.950928]},"n4824":{"id":"n4824","loc":[-85.622858,41.949744]},"n4825":{"id":"n4825","loc":[-85.623696,41.949714]},"n4826":{"id":"n4826","loc":[-85.623696,41.949647]},"n4827":{"id":"n4827","loc":[-85.624019,41.949647]},"n4828":{"id":"n4828","loc":[-85.624024,41.950093]},"n4829":{"id":"n4829","loc":[-85.622885,41.949711]},"n483":{"id":"n483","loc":[-85.63425,41.941819]},"n4830":{"id":"n4830","loc":[-85.624584,41.951049]},"n4831":{"id":"n4831","loc":[-85.624669,41.9511]},"n4832":{"id":"n4832","loc":[-85.624316,41.952218]},"n4833":{"id":"n4833","loc":[-85.623819,41.952094]},"n4834":{"id":"n4834","loc":[-85.623385,41.952101]},"n4835":{"id":"n4835","loc":[-85.623456,41.951238]},"n4836":{"id":"n4836","loc":[-85.623535,41.951051]},"n4837":{"id":"n4837","loc":[-85.624693,41.950921]},"n4838":{"id":"n4838","loc":[-85.624727,41.950897]},"n4839":{"id":"n4839","loc":[-85.624869,41.950341]},"n484":{"id":"n484","loc":[-85.634324,41.942131]},"n4840":{"id":"n4840","loc":[-85.624859,41.949284]},"n4841":{"id":"n4841","loc":[-85.624788,41.949262]},"n4842":{"id":"n4842","loc":[-85.62402,41.949265]},"n4843":{"id":"n4843","loc":[-85.610382,41.954663]},"n4844":{"id":"n4844","loc":[-85.605675,41.954667]},"n4845":{"id":"n4845","loc":[-85.605669,41.949407]},"n4846":{"id":"n4846","loc":[-85.610376,41.949404]},"n4847":{"id":"n4847","loc":[-85.605552,41.958536]},"n4848":{"id":"n4848","loc":[-85.595755,41.958588]},"n4849":{"id":"n4849","loc":[-85.595732,41.956419]},"n485":{"id":"n485","loc":[-85.634211,41.941374]},"n4850":{"id":"n4850","loc":[-85.596908,41.955605]},"n4851":{"id":"n4851","loc":[-85.597723,41.955596]},"n4852":{"id":"n4852","loc":[-85.597715,41.954967]},"n4853":{"id":"n4853","loc":[-85.5874,41.955018]},"n4854":{"id":"n4854","loc":[-85.586615,41.955124]},"n4855":{"id":"n4855","loc":[-85.58613,41.955293]},"n4856":{"id":"n4856","loc":[-85.586166,41.962122]},"n4857":{"id":"n4857","loc":[-85.587008,41.955052]},"n4858":{"id":"n4858","loc":[-85.591685,41.95499]},"n4859":{"id":"n4859","loc":[-85.591718,41.956649]},"n486":{"id":"n486","loc":[-85.634085,41.940704]},"n4860":{"id":"n4860","loc":[-85.591133,41.956649]},"n4861":{"id":"n4861","loc":[-85.591061,41.95582]},"n4862":{"id":"n4862","loc":[-85.590677,41.95613]},"n4863":{"id":"n4863","loc":[-85.590826,41.956369]},"n4864":{"id":"n4864","loc":[-85.591016,41.954991]},"n4865":{"id":"n4865","loc":[-85.587656,41.954855]},"n4866":{"id":"n4866","loc":[-85.5964,41.955274]},"n4867":{"id":"n4867","loc":[-85.58776,41.96178]},"n4868":{"id":"n4868","loc":[-85.601172,41.960448]},"n4869":{"id":"n4869","loc":[-85.589489,41.960478]},"n487":{"id":"n487","loc":[-85.635567,41.940944]},"n4870":{"id":"n4870","loc":[-85.586664,41.960493]},"n4871":{"id":"n4871","loc":[-85.591227,41.95676]},"n4872":{"id":"n4872","loc":[-85.589424,41.958093]},"n4873":{"id":"n4873","loc":[-85.588779,41.957611]},"n4874":{"id":"n4874","loc":[-85.590583,41.956278]},"n4875":{"id":"n4875","loc":[-85.590759,41.957106]},"n4876":{"id":"n4876","loc":[-85.592213,41.958218]},"n4877":{"id":"n4877","loc":[-85.592262,41.958279]},"n4878":{"id":"n4878","loc":[-85.592304,41.958358]},"n4879":{"id":"n4879","loc":[-85.592351,41.95849]},"n488":{"id":"n488","loc":[-85.635542,41.940919]},"n4880":{"id":"n4880","loc":[-85.592363,41.958605]},"n4881":{"id":"n4881","loc":[-85.592383,41.96047]},"n4882":{"id":"n4882","loc":[-85.592376,41.959808]},"n4883":{"id":"n4883","loc":[-85.600825,41.959779]},"n4884":{"id":"n4884","loc":[-85.601084,41.959844]},"n4885":{"id":"n4885","loc":[-85.601144,41.959908]},"n4886":{"id":"n4886","loc":[-85.601164,41.960008]},"n4887":{"id":"n4887","loc":[-85.601162,41.960125]},"n4888":{"id":"n4888","loc":[-85.601134,41.960221]},"n4889":{"id":"n4889","loc":[-85.600993,41.960353]},"n489":{"id":"n489","loc":[-85.635514,41.940906]},"n4890":{"id":"n4890","loc":[-85.600794,41.960449]},"n4891":{"id":"n4891","loc":[-85.60098,41.959792]},"n4892":{"id":"n4892","loc":[-85.601067,41.960294]},"n4893":{"id":"n4893","loc":[-85.596829,41.959793]},"n4894":{"id":"n4894","loc":[-85.596839,41.960459]},"n4895":{"id":"n4895","loc":[-85.589364,41.958048]},"n4896":{"id":"n4896","loc":[-85.587374,41.959511]},"n4897":{"id":"n4897","loc":[-85.587286,41.959564]},"n4898":{"id":"n4898","loc":[-85.587163,41.959632]},"n4899":{"id":"n4899","loc":[-85.586694,41.959865]},"n49":{"id":"n49","loc":[-85.637127,41.942757]},"n490":{"id":"n490","loc":[-85.635469,41.940896]},"n4900":{"id":"n4900","loc":[-85.586634,41.959921]},"n4901":{"id":"n4901","loc":[-85.586607,41.960001]},"n4902":{"id":"n4902","loc":[-85.586599,41.960099]},"n4903":{"id":"n4903","loc":[-85.586602,41.96034]},"n4904":{"id":"n4904","loc":[-85.586669,41.960439]},"n4905":{"id":"n4905","loc":[-85.586758,41.960493]},"n4906":{"id":"n4906","loc":[-85.586618,41.960391]},"n4907":{"id":"n4907","loc":[-85.591201,41.956352]},"n4908":{"id":"n4908","loc":[-85.59112,41.954843]},"n4909":{"id":"n4909","loc":[-85.591536,41.956349]},"n491":{"id":"n491","loc":[-85.635667,41.940826]},"n4910":{"id":"n4910","loc":[-85.590953,41.956354]},"n4911":{"id":"n4911","loc":[-85.591468,41.956406]},"n4912":{"id":"n4912","loc":[-85.591469,41.956478]},"n4913":{"id":"n4913","loc":[-85.591123,41.956481]},"n4914":{"id":"n4914","loc":[-85.591121,41.956409]},"n4915":{"id":"n4915","loc":[-85.590826,41.955954]},"n4916":{"id":"n4916","loc":[-85.590612,41.956115]},"n4917":{"id":"n4917","loc":[-85.590402,41.955962]},"n4918":{"id":"n4918","loc":[-85.590622,41.955804]},"n4919":{"id":"n4919","loc":[-85.59011,41.956502]},"n492":{"id":"n492","loc":[-85.636197,41.940599]},"n4920":{"id":"n4920","loc":[-85.589877,41.956668]},"n4921":{"id":"n4921","loc":[-85.589777,41.95659]},"n4922":{"id":"n4922","loc":[-85.59001,41.956424]},"n4923":{"id":"n4923","loc":[-85.589595,41.956427]},"n4924":{"id":"n4924","loc":[-85.589434,41.956549]},"n4925":{"id":"n4925","loc":[-85.589262,41.956424]},"n4926":{"id":"n4926","loc":[-85.589422,41.956302]},"n4927":{"id":"n4927","loc":[-85.589358,41.956286]},"n4928":{"id":"n4928","loc":[-85.5892,41.956408]},"n4929":{"id":"n4929","loc":[-85.589032,41.956288]},"n493":{"id":"n493","loc":[-85.6362,41.940686]},"n4930":{"id":"n4930","loc":[-85.58919,41.956166]},"n4931":{"id":"n4931","loc":[-85.589165,41.956132]},"n4932":{"id":"n4932","loc":[-85.589002,41.956253]},"n4933":{"id":"n4933","loc":[-85.588826,41.956122]},"n4934":{"id":"n4934","loc":[-85.588989,41.956001]},"n4935":{"id":"n4935","loc":[-85.588673,41.955757]},"n4936":{"id":"n4936","loc":[-85.588502,41.955882]},"n4937":{"id":"n4937","loc":[-85.588339,41.955759]},"n4938":{"id":"n4938","loc":[-85.58851,41.955633]},"n4939":{"id":"n4939","loc":[-85.590382,41.955892]},"n494":{"id":"n494","loc":[-85.635969,41.94069]},"n4940":{"id":"n4940","loc":[-85.589923,41.956231]},"n4941":{"id":"n4941","loc":[-85.58984,41.956168]},"n4942":{"id":"n4942","loc":[-85.5903,41.95583]},"n4943":{"id":"n4943","loc":[-85.589636,41.956038]},"n4944":{"id":"n4944","loc":[-85.589546,41.956105]},"n4945":{"id":"n4945","loc":[-85.589045,41.955729]},"n4946":{"id":"n4946","loc":[-85.589135,41.955662]},"n4947":{"id":"n4947","loc":[-85.590718,41.955293]},"n4948":{"id":"n4948","loc":[-85.590718,41.955374]},"n4949":{"id":"n4949","loc":[-85.589211,41.955369]},"n495":{"id":"n495","loc":[-85.635965,41.940561]},"n4950":{"id":"n4950","loc":[-85.589212,41.955287]},"n4951":{"id":"n4951","loc":[-85.589675,41.956817]},"n4952":{"id":"n4952","loc":[-85.58947,41.95697]},"n4953":{"id":"n4953","loc":[-85.589219,41.956784]},"n4954":{"id":"n4954","loc":[-85.589425,41.95663]},"n4955":{"id":"n4955","loc":[-85.589373,41.95702]},"n4956":{"id":"n4956","loc":[-85.589171,41.957172]},"n4957":{"id":"n4957","loc":[-85.588962,41.957019]},"n4958":{"id":"n4958","loc":[-85.589164,41.956867]},"n4959":{"id":"n4959","loc":[-85.588881,41.955006]},"n496":{"id":"n496","loc":[-85.636031,41.94056]},"n4960":{"id":"n4960","loc":[-85.588804,41.955006]},"n4961":{"id":"n4961","loc":[-85.604773,41.954521]},"n4962":{"id":"n4962","loc":[-85.601603,41.954527]},"n4963":{"id":"n4963","loc":[-85.600823,41.954169]},"n4964":{"id":"n4964","loc":[-85.600828,41.950191]},"n4965":{"id":"n4965","loc":[-85.601673,41.949457]},"n4966":{"id":"n4966","loc":[-85.604464,41.949488]},"n4967":{"id":"n4967","loc":[-85.60538,41.950212]},"n4968":{"id":"n4968","loc":[-85.605395,41.954108]},"n4969":{"id":"n4969","loc":[-85.604771,41.954109]},"n497":{"id":"n497","loc":[-85.636032,41.940602]},"n4970":{"id":"n4970","loc":[-85.600613,41.953916]},"n4971":{"id":"n4971","loc":[-85.599758,41.954649]},"n4972":{"id":"n4972","loc":[-85.591194,41.954663]},"n4973":{"id":"n4973","loc":[-85.591182,41.950465]},"n4974":{"id":"n4974","loc":[-85.591871,41.950464]},"n4975":{"id":"n4975","loc":[-85.591868,41.949209]},"n4976":{"id":"n4976","loc":[-85.592155,41.949209]},"n4977":{"id":"n4977","loc":[-85.592155,41.94848]},"n4978":{"id":"n4978","loc":[-85.600615,41.948482]},"n4979":{"id":"n4979","loc":[-85.605421,41.949378]},"n498":{"id":"n498","loc":[-85.635776,41.940583]},"n4980":{"id":"n4980","loc":[-85.600614,41.949373]},"n4981":{"id":"n4981","loc":[-85.601316,41.94849]},"n4982":{"id":"n4982","loc":[-85.601592,41.947641]},"n4983":{"id":"n4983","loc":[-85.60395,41.947618]},"n4984":{"id":"n4984","loc":[-85.603973,41.948114]},"n4985":{"id":"n4985","loc":[-85.605398,41.948103]},"n4986":{"id":"n4986","loc":[-85.614017,41.965566]},"n4987":{"id":"n4987","loc":[-85.605787,41.965619]},"n4988":{"id":"n4988","loc":[-85.60577,41.963821]},"n4989":{"id":"n4989","loc":[-85.612886,41.963808]},"n499":{"id":"n499","loc":[-85.63589,41.940578]},"n4990":{"id":"n4990","loc":[-85.613207,41.963705]},"n4991":{"id":"n4991","loc":[-85.613511,41.963525]},"n4992":{"id":"n4992","loc":[-85.613667,41.963305]},"n4993":{"id":"n4993","loc":[-85.613779,41.962983]},"n4994":{"id":"n4994","loc":[-85.613797,41.959709]},"n4995":{"id":"n4995","loc":[-85.613663,41.95936]},"n4996":{"id":"n4996","loc":[-85.61339,41.959064]},"n4997":{"id":"n4997","loc":[-85.610503,41.956898]},"n4998":{"id":"n4998","loc":[-85.610485,41.956595]},"n4999":{"id":"n4999","loc":[-85.613892,41.956621]},"n5":{"id":"n5","loc":[-85.622744,41.95268]},"n50":{"id":"n50","loc":[-85.636673,41.943143]},"n500":{"id":"n500","loc":[-85.636198,41.940578]},"n5000":{"id":"n5000","loc":[-85.613866,41.958574]},"n5001":{"id":"n5001","loc":[-85.615262,41.958561]},"n5002":{"id":"n5002","loc":[-85.615279,41.959541]},"n5003":{"id":"n5003","loc":[-85.615314,41.95597]},"n5004":{"id":"n5004","loc":[-85.613887,41.955988]},"n5005":{"id":"n5005","loc":[-85.613074,41.962244]},"n5006":{"id":"n5006","loc":[-85.611678,41.963354]},"n5007":{"id":"n5007","loc":[-85.611678,41.963487]},"n5008":{"id":"n5008","loc":[-85.606906,41.963502]},"n5009":{"id":"n5009","loc":[-85.605777,41.962657]},"n501":{"id":"n501","loc":[-85.636251,41.940584]},"n5010":{"id":"n5010","loc":[-85.605711,41.9599]},"n5011":{"id":"n5011","loc":[-85.608139,41.9585]},"n5012":{"id":"n5012","loc":[-85.60814,41.956306]},"n5013":{"id":"n5013","loc":[-85.608854,41.95581]},"n5014":{"id":"n5014","loc":[-85.610039,41.955883]},"n5015":{"id":"n5015","loc":[-85.610068,41.956754]},"n5016":{"id":"n5016","loc":[-85.613058,41.959411]},"n5017":{"id":"n5017","loc":[-85.610234,41.957068]},"n5018":{"id":"n5018","loc":[-85.609826,41.95581]},"n5019":{"id":"n5019","loc":[-85.606987,41.958505]},"n502":{"id":"n502","loc":[-85.636279,41.940605]},"n5020":{"id":"n5020","loc":[-85.606498,41.958846]},"n5021":{"id":"n5021","loc":[-85.606013,41.959342]},"n5022":{"id":"n5022","loc":[-85.614553,41.961581]},"n5023":{"id":"n5023","loc":[-85.61465,41.96214]},"n5024":{"id":"n5024","loc":[-85.615277,41.962442]},"n5025":{"id":"n5025","loc":[-85.615451,41.962972]},"n5026":{"id":"n5026","loc":[-85.614355,41.964826]},"n5027":{"id":"n5027","loc":[-85.615133,41.964589]},"n5028":{"id":"n5028","loc":[-85.615342,41.963818]},"n5029":{"id":"n5029","loc":[-85.615971,41.963792]},"n503":{"id":"n503","loc":[-85.636285,41.940633]},"n5030":{"id":"n5030","loc":[-85.615751,41.963122]},"n5031":{"id":"n5031","loc":[-85.616575,41.963123]},"n5032":{"id":"n5032","loc":[-85.612527,41.963846]},"n5033":{"id":"n5033","loc":[-85.630653,41.940709]},"n5034":{"id":"n5034","loc":[-85.629858,41.939568]},"n5035":{"id":"n5035","loc":[-85.629847,41.937926]},"n504":{"id":"n504","loc":[-85.636281,41.940662]},"n505":{"id":"n505","loc":[-85.636266,41.940688]},"n506":{"id":"n506","loc":[-85.636236,41.940701]},"n507":{"id":"n507","loc":[-85.63619,41.940706]},"n508":{"id":"n508","loc":[-85.635892,41.940707]},"n509":{"id":"n509","loc":[-85.635777,41.9407]},"n51":{"id":"n51","loc":[-85.636673,41.942864]},"n510":{"id":"n510","loc":[-85.636044,41.940578]},"n511":{"id":"n511","loc":[-85.635946,41.940578]},"n512":{"id":"n512","loc":[-85.636475,41.940732]},"n513":{"id":"n513","loc":[-85.636475,41.940777]},"n514":{"id":"n514","loc":[-85.636405,41.940777]},"n515":{"id":"n515","loc":[-85.636405,41.940732]},"n516":{"id":"n516","loc":[-85.636471,41.940916]},"n517":{"id":"n517","loc":[-85.636471,41.940961]},"n518":{"id":"n518","loc":[-85.636404,41.940961]},"n519":{"id":"n519","loc":[-85.636404,41.940916]},"n52":{"id":"n52","loc":[-85.636227,41.942864]},"n520":{"id":"n520","loc":[-85.636286,41.941127]},"n521":{"id":"n521","loc":[-85.636203,41.941126]},"n522":{"id":"n522","loc":[-85.636204,41.941083]},"n523":{"id":"n523","loc":[-85.636287,41.941083]},"n524":{"id":"n524","loc":[-85.636124,41.941064]},"n525":{"id":"n525","loc":[-85.636,41.941065]},"n526":{"id":"n526","loc":[-85.636,41.940964]},"n527":{"id":"n527","loc":[-85.636045,41.940964]},"n528":{"id":"n528","loc":[-85.636045,41.940928]},"n529":{"id":"n529","loc":[-85.636111,41.940928]},"n53":{"id":"n53","loc":[-85.636227,41.943143]},"n530":{"id":"n530","loc":[-85.636111,41.940961]},"n531":{"id":"n531","loc":[-85.636123,41.940961]},"n532":{"id":"n532","loc":[-85.636124,41.940997]},"n533":{"id":"n533","loc":[-85.636164,41.940997]},"n534":{"id":"n534","loc":[-85.636164,41.941044]},"n535":{"id":"n535","loc":[-85.636124,41.941044]},"n536":{"id":"n536","loc":[-85.636534,41.941256]},"n537":{"id":"n537","loc":[-85.63645,41.941246]},"n538":{"id":"n538","loc":[-85.636462,41.941189]},"n539":{"id":"n539","loc":[-85.636546,41.941199]},"n54":{"id":"n54","loc":[-85.636198,41.943119]},"n540":{"id":"n540","loc":[-85.636802,41.941226]},"n541":{"id":"n541","loc":[-85.636701,41.941215]},"n542":{"id":"n542","loc":[-85.636709,41.941174]},"n543":{"id":"n543","loc":[-85.636656,41.941168]},"n544":{"id":"n544","loc":[-85.636666,41.941122]},"n545":{"id":"n545","loc":[-85.636781,41.941136]},"n546":{"id":"n546","loc":[-85.636774,41.94117]},"n547":{"id":"n547","loc":[-85.636812,41.941175]},"n548":{"id":"n548","loc":[-85.636803,41.941047]},"n549":{"id":"n549","loc":[-85.636785,41.941047]},"n55":{"id":"n55","loc":[-85.635945,41.94312]},"n550":{"id":"n550","loc":[-85.636785,41.941058]},"n551":{"id":"n551","loc":[-85.636644,41.941059]},"n552":{"id":"n552","loc":[-85.636644,41.941038]},"n553":{"id":"n553","loc":[-85.636581,41.941039]},"n554":{"id":"n554","loc":[-85.636581,41.940995]},"n555":{"id":"n555","loc":[-85.636746,41.940995]},"n556":{"id":"n556","loc":[-85.636746,41.940978]},"n557":{"id":"n557","loc":[-85.636803,41.940978]},"n558":{"id":"n558","loc":[-85.636781,41.940768]},"n559":{"id":"n559","loc":[-85.636783,41.940828]},"n56":{"id":"n56","loc":[-85.635943,41.942909]},"n560":{"id":"n560","loc":[-85.636761,41.940828]},"n561":{"id":"n561","loc":[-85.636762,41.940857]},"n562":{"id":"n562","loc":[-85.636641,41.940859]},"n563":{"id":"n563","loc":[-85.63664,41.940805]},"n564":{"id":"n564","loc":[-85.636676,41.940804]},"n565":{"id":"n565","loc":[-85.636675,41.940769]},"n566":{"id":"n566","loc":[-85.636733,41.94033]},"n567":{"id":"n567","loc":[-85.636471,41.940334]},"n568":{"id":"n568","loc":[-85.636469,41.940262]},"n569":{"id":"n569","loc":[-85.636731,41.940257]},"n57":{"id":"n57","loc":[-85.636227,41.942909]},"n570":{"id":"n570","loc":[-85.636798,41.940419]},"n571":{"id":"n571","loc":[-85.6368,41.940524]},"n572":{"id":"n572","loc":[-85.63664,41.940526]},"n573":{"id":"n573","loc":[-85.636638,41.940421]},"n574":{"id":"n574","loc":[-85.636372,41.940551]},"n575":{"id":"n575","loc":[-85.636338,41.94055]},"n576":{"id":"n576","loc":[-85.636339,41.940524]},"n577":{"id":"n577","loc":[-85.636373,41.940525]},"n578":{"id":"n578","loc":[-85.636388,41.940435]},"n579":{"id":"n579","loc":[-85.636222,41.940436]},"n58":{"id":"n58","loc":[-85.63627,41.943175]},"n580":{"id":"n580","loc":[-85.636222,41.940366]},"n581":{"id":"n581","loc":[-85.636387,41.940365]},"n582":{"id":"n582","loc":[-85.636158,41.940482]},"n583":{"id":"n583","loc":[-85.635963,41.940484]},"n584":{"id":"n584","loc":[-85.635961,41.940399]},"n585":{"id":"n585","loc":[-85.636156,41.940397]},"n586":{"id":"n586","loc":[-85.635987,41.940314]},"n587":{"id":"n587","loc":[-85.635987,41.940268]},"n588":{"id":"n588","loc":[-85.635968,41.940268]},"n589":{"id":"n589","loc":[-85.635967,41.940212]},"n59":{"id":"n59","loc":[-85.635531,41.943176]},"n590":{"id":"n590","loc":[-85.636082,41.940211]},"n591":{"id":"n591","loc":[-85.636083,41.94027]},"n592":{"id":"n592","loc":[-85.636064,41.94027]},"n593":{"id":"n593","loc":[-85.636064,41.940313]},"n594":{"id":"n594","loc":[-85.638071,41.941562]},"n595":{"id":"n595","loc":[-85.637953,41.941562]},"n596":{"id":"n596","loc":[-85.637952,41.941522]},"n597":{"id":"n597","loc":[-85.637876,41.941523]},"n598":{"id":"n598","loc":[-85.637876,41.941471]},"n599":{"id":"n599","loc":[-85.638035,41.94147]},"n6":{"id":"n6","loc":[-85.624925,41.950604]},"n60":{"id":"n60","loc":[-85.63542,41.942883]},"n600":{"id":"n600","loc":[-85.638035,41.941513]},"n601":{"id":"n601","loc":[-85.638071,41.941512]},"n602":{"id":"n602","loc":[-85.637038,41.942543],"tags":{"crossing":"zebra","highway":"crossing"}},"n603":{"id":"n603","loc":[-85.637134,41.942542]},"n604":{"id":"n604","loc":[-85.638122,41.942532]},"n605":{"id":"n605","loc":[-85.638121,41.942478]},"n606":{"id":"n606","loc":[-85.638104,41.941424]},"n607":{"id":"n607","loc":[-85.637115,41.941438]},"n608":{"id":"n608","loc":[-85.637133,41.942453]},"n609":{"id":"n609","loc":[-85.637429,41.942004]},"n61":{"id":"n61","loc":[-85.635701,41.942802]},"n610":{"id":"n610","loc":[-85.637125,41.942004]},"n611":{"id":"n611","loc":[-85.637022,41.942004]},"n612":{"id":"n612","loc":[-85.635952,41.943579]},"n613":{"id":"n613","loc":[-85.635872,41.943594]},"n614":{"id":"n614","loc":[-85.635857,41.943551]},"n615":{"id":"n615","loc":[-85.635937,41.943535]},"n616":{"id":"n616","loc":[-85.63671,41.94344]},"n617":{"id":"n617","loc":[-85.636427,41.94334]},"n618":{"id":"n618","loc":[-85.635353,41.943279]},"n619":{"id":"n619","loc":[-85.635319,41.943257]},"n62":{"id":"n62","loc":[-85.6358,41.942997]},"n620":{"id":"n620","loc":[-85.638786,41.943105]},"n621":{"id":"n621","loc":[-85.634957,41.943146]},"n622":{"id":"n622","loc":[-85.635012,41.943119]},"n623":{"id":"n623","loc":[-85.632409,41.944222]},"n624":{"id":"n624","loc":[-85.631863,41.944749]},"n625":{"id":"n625","loc":[-85.631915,41.944722]},"n626":{"id":"n626","loc":[-85.631884,41.94464]},"n627":{"id":"n627","loc":[-85.631792,41.944359]},"n628":{"id":"n628","loc":[-85.631817,41.944703]},"n629":{"id":"n629","loc":[-85.633464,41.945787]},"n63":{"id":"n63","loc":[-85.635808,41.943176]},"n630":{"id":"n630","loc":[-85.633583,41.945919]},"n631":{"id":"n631","loc":[-85.63382,41.945698]},"n632":{"id":"n632","loc":[-85.633681,41.945571]},"n633":{"id":"n633","loc":[-85.634217,41.946824]},"n634":{"id":"n634","loc":[-85.634271,41.946836]},"n635":{"id":"n635","loc":[-85.634319,41.94573]},"n636":{"id":"n636","loc":[-85.634377,41.945672]},"n637":{"id":"n637","loc":[-85.634909,41.945354]},"n638":{"id":"n638","loc":[-85.634726,41.945493],"tags":{"artwork_type":"mural","tourism":"artwork"}},"n639":{"id":"n639","loc":[-85.63546,41.945612]},"n64":{"id":"n64","loc":[-85.63631,41.943253]},"n640":{"id":"n640","loc":[-85.635561,41.945493]},"n641":{"id":"n641","loc":[-85.635417,41.945565]},"n642":{"id":"n642","loc":[-85.635315,41.945583]},"n643":{"id":"n643","loc":[-85.63506,41.945383]},"n644":{"id":"n644","loc":[-85.635198,41.945199]},"n645":{"id":"n645","loc":[-85.635361,41.94558]},"n646":{"id":"n646","loc":[-85.635017,41.945066]},"n647":{"id":"n647","loc":[-85.634779,41.945206]},"n648":{"id":"n648","loc":[-85.63425,41.945655]},"n649":{"id":"n649","loc":[-85.634247,41.945631]},"n65":{"id":"n65","loc":[-85.635398,41.943259]},"n650":{"id":"n650","loc":[-85.634889,41.945921]},"n651":{"id":"n651","loc":[-85.634889,41.945939]},"n652":{"id":"n652","loc":[-85.634889,41.945761]},"n653":{"id":"n653","loc":[-85.634889,41.945778]},"n654":{"id":"n654","loc":[-85.635112,41.945715]},"n655":{"id":"n655","loc":[-85.635025,41.945714]},"n656":{"id":"n656","loc":[-85.635027,41.945761]},"n657":{"id":"n657","loc":[-85.635438,41.945665]},"n658":{"id":"n658","loc":[-85.635416,41.945676]},"n659":{"id":"n659","loc":[-85.635401,41.945709]},"n66":{"id":"n66","loc":[-85.635336,41.943036]},"n660":{"id":"n660","loc":[-85.635271,41.945566]},"n661":{"id":"n661","loc":[-85.636106,41.946268]},"n662":{"id":"n662","loc":[-85.635867,41.946747]},"n663":{"id":"n663","loc":[-85.636476,41.946797]},"n664":{"id":"n664","loc":[-85.63651,41.946796]},"n665":{"id":"n665","loc":[-85.635367,41.946389]},"n666":{"id":"n666","loc":[-85.635367,41.946437]},"n667":{"id":"n667","loc":[-85.634787,41.946441]},"n668":{"id":"n668","loc":[-85.6358,41.946243]},"n669":{"id":"n669","loc":[-85.635784,41.94622]},"n67":{"id":"n67","loc":[-85.635911,41.942899]},"n670":{"id":"n670","loc":[-85.635727,41.946195]},"n671":{"id":"n671","loc":[-85.635708,41.946588]},"n672":{"id":"n672","loc":[-85.635648,41.946561]},"n673":{"id":"n673","loc":[-85.635624,41.946555]},"n674":{"id":"n674","loc":[-85.635417,41.946559]},"n675":{"id":"n675","loc":[-85.634866,41.946561]},"n676":{"id":"n676","loc":[-85.634866,41.946543]},"n677":{"id":"n677","loc":[-85.635085,41.946546]},"n678":{"id":"n678","loc":[-85.635085,41.946554]},"n679":{"id":"n679","loc":[-85.634584,41.94488]},"n68":{"id":"n68","loc":[-85.635915,41.943156]},"n680":{"id":"n680","loc":[-85.634557,41.944882]},"n681":{"id":"n681","loc":[-85.634455,41.944943]},"n682":{"id":"n682","loc":[-85.634305,41.944968]},"n683":{"id":"n683","loc":[-85.634261,41.944927]},"n684":{"id":"n684","loc":[-85.634132,41.944741]},"n685":{"id":"n685","loc":[-85.633705,41.944759]},"n686":{"id":"n686","loc":[-85.633918,41.944616]},"n687":{"id":"n687","loc":[-85.633974,41.944663]},"n688":{"id":"n688","loc":[-85.6336,41.944665]},"n689":{"id":"n689","loc":[-85.633817,41.944528]},"n69":{"id":"n69","loc":[-85.63631,41.943157]},"n690":{"id":"n690","loc":[-85.633889,41.944485]},"n691":{"id":"n691","loc":[-85.633931,41.944525]},"n692":{"id":"n692","loc":[-85.633864,41.944563]},"n693":{"id":"n693","loc":[-85.633456,41.944524]},"n694":{"id":"n694","loc":[-85.633676,41.944399]},"n695":{"id":"n695","loc":[-85.633352,41.944415]},"n696":{"id":"n696","loc":[-85.633655,41.944234]},"n697":{"id":"n697","loc":[-85.633761,41.94435]},"n698":{"id":"n698","loc":[-85.633254,41.944318]},"n699":{"id":"n699","loc":[-85.633472,41.944188]},"n7":{"id":"n7","loc":[-85.638791,41.943231]},"n70":{"id":"n70","loc":[-85.63579,41.942967]},"n700":{"id":"n700","loc":[-85.633524,41.944237]},"n701":{"id":"n701","loc":[-85.633583,41.944202]},"n702":{"id":"n702","loc":[-85.633632,41.944247]},"n703":{"id":"n703","loc":[-85.633165,41.944228]},"n704":{"id":"n704","loc":[-85.633388,41.944105]},"n705":{"id":"n705","loc":[-85.633117,41.944175]},"n706":{"id":"n706","loc":[-85.633302,41.944077]},"n707":{"id":"n707","loc":[-85.633352,41.944126]},"n708":{"id":"n708","loc":[-85.633052,41.944107]},"n709":{"id":"n709","loc":[-85.633237,41.944009]},"n71":{"id":"n71","loc":[-85.637506,41.942824]},"n710":{"id":"n710","loc":[-85.633187,41.943955]},"n711":{"id":"n711","loc":[-85.633,41.944054]},"n712":{"id":"n712","loc":[-85.633155,41.944265]},"n713":{"id":"n713","loc":[-85.633669,41.944765]},"n714":{"id":"n714","loc":[-85.634468,41.945503]},"n715":{"id":"n715","loc":[-85.63455,41.945566]},"n716":{"id":"n716","loc":[-85.634737,41.945729]},"n717":{"id":"n717","loc":[-85.634753,41.945752]},"n718":{"id":"n718","loc":[-85.634756,41.945781]},"n719":{"id":"n719","loc":[-85.634758,41.945978]},"n72":{"id":"n72","loc":[-85.637511,41.943056]},"n720":{"id":"n720","loc":[-85.634363,41.945548],"tags":{"crossing":"zebra","highway":"crossing"}},"n721":{"id":"n721","loc":[-85.634245,41.945599]},"n722":{"id":"n722","loc":[-85.633474,41.944889]},"n723":{"id":"n723","loc":[-85.632997,41.944418]},"n724":{"id":"n724","loc":[-85.63278,41.944183]},"n725":{"id":"n725","loc":[-85.63331,41.944429]},"n726":{"id":"n726","loc":[-85.633568,41.944829],"tags":{"crossing":"zebra","highway":"crossing"}},"n727":{"id":"n727","loc":[-85.634669,41.94567]},"n728":{"id":"n728","loc":[-85.634462,41.945787]},"n729":{"id":"n729","loc":[-85.634272,41.945625]},"n73":{"id":"n73","loc":[-85.637361,41.943058]},"n730":{"id":"n730","loc":[-85.634344,41.945699],"tags":{"crossing":"zebra","highway":"crossing"}},"n731":{"id":"n731","loc":[-85.634426,41.945783]},"n732":{"id":"n732","loc":[-85.632425,41.944137]},"n733":{"id":"n733","loc":[-85.632302,41.944192]},"n734":{"id":"n734","loc":[-85.632762,41.944174]},"n735":{"id":"n735","loc":[-85.632713,41.944179]},"n736":{"id":"n736","loc":[-85.632411,41.944327]},"n737":{"id":"n737","loc":[-85.632362,41.944341]},"n738":{"id":"n738","loc":[-85.632236,41.944204]},"n739":{"id":"n739","loc":[-85.634939,41.942165]},"n74":{"id":"n74","loc":[-85.637356,41.942825]},"n740":{"id":"n740","loc":[-85.635079,41.941535]},"n741":{"id":"n741","loc":[-85.635112,41.941595]},"n742":{"id":"n742","loc":[-85.635113,41.941633]},"n743":{"id":"n743","loc":[-85.635067,41.941652]},"n744":{"id":"n744","loc":[-85.634989,41.941651]},"n745":{"id":"n745","loc":[-85.634921,41.941609]},"n746":{"id":"n746","loc":[-85.634881,41.941544]},"n747":{"id":"n747","loc":[-85.635537,41.940939]},"n748":{"id":"n748","loc":[-85.635573,41.941048]},"n749":{"id":"n749","loc":[-85.635453,41.94091]},"n75":{"id":"n75","loc":[-85.638097,41.942833]},"n750":{"id":"n750","loc":[-85.635319,41.940943]},"n751":{"id":"n751","loc":[-85.637057,41.943224]},"n752":{"id":"n752","loc":[-85.636989,41.943296]},"n753":{"id":"n753","loc":[-85.636851,41.943299]},"n754":{"id":"n754","loc":[-85.636848,41.94322]},"n755":{"id":"n755","loc":[-85.636986,41.943217]},"n756":{"id":"n756","loc":[-85.637569,41.943454]},"n757":{"id":"n757","loc":[-85.637437,41.943458]},"n758":{"id":"n758","loc":[-85.637432,41.943384]},"n759":{"id":"n759","loc":[-85.637564,41.94338]},"n76":{"id":"n76","loc":[-85.638098,41.942912]},"n760":{"id":"n760","loc":[-85.637213,41.943378]},"n761":{"id":"n761","loc":[-85.637217,41.943435]},"n762":{"id":"n762","loc":[-85.637235,41.943434]},"n763":{"id":"n763","loc":[-85.637237,41.943465]},"n764":{"id":"n764","loc":[-85.637424,41.943459]},"n765":{"id":"n765","loc":[-85.637418,41.943371]},"n766":{"id":"n766","loc":[-85.638094,41.943149]},"n767":{"id":"n767","loc":[-85.638096,41.943201]},"n768":{"id":"n768","loc":[-85.638041,41.943202]},"n769":{"id":"n769","loc":[-85.638042,41.943216]},"n77":{"id":"n77","loc":[-85.637705,41.942913]},"n770":{"id":"n770","loc":[-85.637927,41.943218]},"n771":{"id":"n771","loc":[-85.637926,41.943201]},"n772":{"id":"n772","loc":[-85.637897,41.943201]},"n773":{"id":"n773","loc":[-85.637896,41.943155]},"n774":{"id":"n774","loc":[-85.637962,41.943153]},"n775":{"id":"n775","loc":[-85.637962,41.943134]},"n776":{"id":"n776","loc":[-85.638017,41.943132]},"n777":{"id":"n777","loc":[-85.638018,41.943151]},"n778":{"id":"n778","loc":[-85.638045,41.943289]},"n779":{"id":"n779","loc":[-85.638048,41.943363]},"n78":{"id":"n78","loc":[-85.637705,41.942834]},"n780":{"id":"n780","loc":[-85.637842,41.943367]},"n781":{"id":"n781","loc":[-85.637839,41.943296]},"n782":{"id":"n782","loc":[-85.637896,41.943295]},"n783":{"id":"n783","loc":[-85.637897,41.943314]},"n784":{"id":"n784","loc":[-85.637957,41.943312]},"n785":{"id":"n785","loc":[-85.637957,41.943291]},"n786":{"id":"n786","loc":[-85.637816,41.943375]},"n787":{"id":"n787","loc":[-85.637815,41.943416]},"n788":{"id":"n788","loc":[-85.637715,41.943415]},"n789":{"id":"n789","loc":[-85.637716,41.943374]},"n79":{"id":"n79","loc":[-85.638071,41.942298]},"n790":{"id":"n790","loc":[-85.637912,41.943545]},"n791":{"id":"n791","loc":[-85.637909,41.943479]},"n792":{"id":"n792","loc":[-85.637967,41.943477]},"n793":{"id":"n793","loc":[-85.637967,41.94346]},"n794":{"id":"n794","loc":[-85.638077,41.943457]},"n795":{"id":"n795","loc":[-85.638078,41.943473]},"n796":{"id":"n796","loc":[-85.638124,41.943471]},"n797":{"id":"n797","loc":[-85.638126,41.943514]},"n798":{"id":"n798","loc":[-85.638079,41.943515]},"n799":{"id":"n799","loc":[-85.638079,41.943532]},"n8":{"id":"n8","loc":[-85.635241,41.941948]},"n80":{"id":"n80","loc":[-85.638074,41.942431]},"n800":{"id":"n800","loc":[-85.638028,41.943534]},"n801":{"id":"n801","loc":[-85.638028,41.943542]},"n802":{"id":"n802","loc":[-85.638845,41.942983]},"n803":{"id":"n803","loc":[-85.638846,41.94305]},"n804":{"id":"n804","loc":[-85.638661,41.943052]},"n805":{"id":"n805","loc":[-85.63866,41.942984]},"n806":{"id":"n806","loc":[-85.638579,41.942753]},"n807":{"id":"n807","loc":[-85.638445,41.942755]},"n808":{"id":"n808","loc":[-85.638452,41.942978]},"n809":{"id":"n809","loc":[-85.638545,41.942976]},"n81":{"id":"n81","loc":[-85.637836,41.942433]},"n810":{"id":"n810","loc":[-85.638543,41.942935]},"n811":{"id":"n811","loc":[-85.638571,41.942934]},"n812":{"id":"n812","loc":[-85.63857,41.942901]},"n813":{"id":"n813","loc":[-85.638611,41.9429]},"n814":{"id":"n814","loc":[-85.638607,41.942769]},"n815":{"id":"n815","loc":[-85.63858,41.94277]},"n816":{"id":"n816","loc":[-85.638597,41.942614]},"n817":{"id":"n817","loc":[-85.638601,41.94273]},"n818":{"id":"n818","loc":[-85.638686,41.942731]},"n819":{"id":"n819","loc":[-85.638689,41.942917]},"n82":{"id":"n82","loc":[-85.637835,41.94242]},"n820":{"id":"n820","loc":[-85.638558,41.943018]},"n821":{"id":"n821","loc":[-85.638243,41.943019]},"n822":{"id":"n822","loc":[-85.637536,41.943887]},"n823":{"id":"n823","loc":[-85.63749,41.943926]},"n824":{"id":"n824","loc":[-85.63743,41.943886]},"n825":{"id":"n825","loc":[-85.637476,41.943847]},"n826":{"id":"n826","loc":[-85.637527,41.943846]},"n827":{"id":"n827","loc":[-85.637141,41.943728]},"n828":{"id":"n828","loc":[-85.637201,41.943755]},"n829":{"id":"n829","loc":[-85.636987,41.943608]},"n83":{"id":"n83","loc":[-85.63776,41.942421]},"n830":{"id":"n830","loc":[-85.637441,41.943807]},"n831":{"id":"n831","loc":[-85.637673,41.94399]},"n832":{"id":"n832","loc":[-85.637783,41.944137]},"n833":{"id":"n833","loc":[-85.63845,41.944333]},"n834":{"id":"n834","loc":[-85.638159,41.944248]},"n835":{"id":"n835","loc":[-85.637859,41.94416]},"n836":{"id":"n836","loc":[-85.638685,41.944542]},"n837":{"id":"n837","loc":[-85.638714,41.944611]},"n838":{"id":"n838","loc":[-85.638711,41.944757]},"n839":{"id":"n839","loc":[-85.638774,41.945069]},"n84":{"id":"n84","loc":[-85.637758,41.942339]},"n840":{"id":"n840","loc":[-85.638742,41.945205]},"n841":{"id":"n841","loc":[-85.640267,41.942403]},"n842":{"id":"n842","loc":[-85.640154,41.942404]},"n843":{"id":"n843","loc":[-85.640152,41.942249]},"n844":{"id":"n844","loc":[-85.640266,41.942248]},"n845":{"id":"n845","loc":[-85.640366,41.942599]},"n846":{"id":"n846","loc":[-85.640362,41.942192]},"n847":{"id":"n847","loc":[-85.640146,41.942191]},"n848":{"id":"n848","loc":[-85.640122,41.942196]},"n849":{"id":"n849","loc":[-85.640108,41.942211]},"n85":{"id":"n85","loc":[-85.637836,41.942339]},"n850":{"id":"n850","loc":[-85.640101,41.942236]},"n851":{"id":"n851","loc":[-85.640103,41.94241]},"n852":{"id":"n852","loc":[-85.64011,41.942435]},"n853":{"id":"n853","loc":[-85.640126,41.942445]},"n854":{"id":"n854","loc":[-85.640153,41.942451]},"n855":{"id":"n855","loc":[-85.640183,41.942452]},"n856":{"id":"n856","loc":[-85.640364,41.942452]},"n857":{"id":"n857","loc":[-85.640007,41.942452]},"n858":{"id":"n858","loc":[-85.639449,41.942461]},"n859":{"id":"n859","loc":[-85.640049,41.942391]},"n86":{"id":"n86","loc":[-85.637835,41.942301]},"n860":{"id":"n860","loc":[-85.640052,41.942503]},"n861":{"id":"n861","loc":[-85.639575,41.94251]},"n862":{"id":"n862","loc":[-85.639572,41.942398]},"n863":{"id":"n863","loc":[-85.638782,41.942227]},"n864":{"id":"n864","loc":[-85.63843,41.942226]},"n865":{"id":"n865","loc":[-85.63823,41.942183]},"n866":{"id":"n866","loc":[-85.638363,41.942216],"tags":{"barrier":"gate"}},"n867":{"id":"n867","loc":[-85.6384,41.942223]},"n868":{"id":"n868","loc":[-85.636042,41.942797]},"n869":{"id":"n869","loc":[-85.636308,41.942752]},"n87":{"id":"n87","loc":[-85.637566,41.942367]},"n870":{"id":"n870","loc":[-85.636516,41.942729]},"n871":{"id":"n871","loc":[-85.636782,41.942712]},"n872":{"id":"n872","loc":[-85.636944,41.942706]},"n873":{"id":"n873","loc":[-85.63704,41.942706]},"n874":{"id":"n874","loc":[-85.637237,41.942703]},"n875":{"id":"n875","loc":[-85.637553,41.9427]},"n876":{"id":"n876","loc":[-85.638236,41.942697]},"n877":{"id":"n877","loc":[-85.636284,41.942781]},"n878":{"id":"n878","loc":[-85.636551,41.942641]},"n879":{"id":"n879","loc":[-85.633914,41.943693]},"n88":{"id":"n88","loc":[-85.637566,41.94241]},"n880":{"id":"n880","loc":[-85.63389,41.943708]},"n881":{"id":"n881","loc":[-85.633866,41.943686]},"n882":{"id":"n882","loc":[-85.63389,41.943671]},"n883":{"id":"n883","loc":[-85.633857,41.943609]},"n884":{"id":"n884","loc":[-85.634858,41.944474]},"n885":{"id":"n885","loc":[-85.633988,41.943234]},"n886":{"id":"n886","loc":[-85.633999,41.943485]},"n887":{"id":"n887","loc":[-85.634109,41.943449],"tags":{"emergency":"fire_hydrant"}},"n888":{"id":"n888","loc":[-85.635728,41.942655],"tags":{"emergency":"fire_hydrant"}},"n889":{"id":"n889","loc":[-85.636499,41.942845],"tags":{"man_made":"flagpole"}},"n89":{"id":"n89","loc":[-85.637455,41.94241]},"n890":{"id":"n890","loc":[-85.636197,41.943073]},"n891":{"id":"n891","loc":[-85.636227,41.943073]},"n892":{"id":"n892","loc":[-85.637433,41.942933],"tags":{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"restaurant","cuisine":"pizza","name":"Pizza Hut"}},"n893":{"id":"n893","loc":[-85.637907,41.942879],"tags":{"amenity":"car_wash"}},"n894":{"id":"n894","loc":[-85.637661,41.943018]},"n895":{"id":"n895","loc":[-85.636933,41.942733],"tags":{"emergency":"fire_hydrant"}},"n896":{"id":"n896","loc":[-85.637661,41.94304]},"n897":{"id":"n897","loc":[-85.637562,41.943041]},"n898":{"id":"n898","loc":[-85.637556,41.942725]},"n899":{"id":"n899","loc":[-85.637656,41.942724]},"n9":{"id":"n9","loc":[-85.635159,41.941926]},"n90":{"id":"n90","loc":[-85.637454,41.942367]},"n900":{"id":"n900","loc":[-85.637657,41.942779]},"n901":{"id":"n901","loc":[-85.637983,41.942777]},"n902":{"id":"n902","loc":[-85.637982,41.942616]},"n903":{"id":"n903","loc":[-85.637777,41.942778]},"n904":{"id":"n904","loc":[-85.637775,41.942699]},"n905":{"id":"n905","loc":[-85.637772,41.942618]},"n906":{"id":"n906","loc":[-85.637982,41.942698]},"n907":{"id":"n907","loc":[-85.637941,41.942378],"tags":{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Gem Pawnbroker","shop":"pawnbroker"}},"n908":{"id":"n908","loc":[-85.637515,41.942394],"tags":{"second_hand":"only","shop":"car"}},"n909":{"id":"n909","loc":[-85.638743,41.942374],"tags":{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes","shop":"car_repair"}},"n91":{"id":"n91","loc":[-85.637565,41.942341]},"n910":{"id":"n910","loc":[-85.638594,41.942357]},"n911":{"id":"n911","loc":[-85.634312,41.943562],"tags":{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"cafe","cuisine":"coffee_shop","name":"L.A.'s Coffee Cafe","outdoor_seating":"yes"}},"n912":{"id":"n912","loc":[-85.634404,41.943512]},"n913":{"id":"n913","loc":[-85.634391,41.943519],"tags":{"entrance":"yes"}},"n914":{"id":"n914","loc":[-85.634259,41.943538],"tags":{"entrance":"yes"}},"n915":{"id":"n915","loc":[-85.634247,41.943528]},"n916":{"id":"n916","loc":[-85.633747,41.943322],"tags":{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Preferred Insurance Services","office":"insurance"}},"n917":{"id":"n917","loc":[-85.63299,41.943686],"tags":{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lynn's Garage","service:vehicle:tyres":"yes","shop":"car_repair"}},"n918":{"id":"n918","loc":[-85.633438,41.944883]},"n919":{"id":"n919","loc":[-85.633265,41.944983]},"n92":{"id":"n92","loc":[-85.637481,41.942341]},"n920":{"id":"n920","loc":[-85.633315,41.945027]},"n921":{"id":"n921","loc":[-85.633376,41.944827]},"n922":{"id":"n922","loc":[-85.633199,41.944922]},"n923":{"id":"n923","loc":[-85.633316,41.944772]},"n924":{"id":"n924","loc":[-85.633147,41.944867]},"n925":{"id":"n925","loc":[-85.633261,41.944719]},"n926":{"id":"n926","loc":[-85.633096,41.944812]},"n927":{"id":"n927","loc":[-85.633191,41.944645]},"n928":{"id":"n928","loc":[-85.632981,41.94476]},"n929":{"id":"n929","loc":[-85.633062,41.94483]},"n93":{"id":"n93","loc":[-85.637481,41.94226]},"n930":{"id":"n930","loc":[-85.633146,41.944602]},"n931":{"id":"n931","loc":[-85.632969,41.944703]},"n932":{"id":"n932","loc":[-85.633008,41.944745]},"n933":{"id":"n933","loc":[-85.633088,41.944545]},"n934":{"id":"n934","loc":[-85.632868,41.944655]},"n935":{"id":"n935","loc":[-85.632941,41.944718]},"n936":{"id":"n936","loc":[-85.633028,41.944483]},"n937":{"id":"n937","loc":[-85.632817,41.944605]},"n938":{"id":"n938","loc":[-85.632923,41.944373]},"n939":{"id":"n939","loc":[-85.632692,41.944485]},"n94":{"id":"n94","loc":[-85.637565,41.94226]},"n940":{"id":"n940","loc":[-85.632871,41.944316]},"n941":{"id":"n941","loc":[-85.632655,41.944421]},"n942":{"id":"n942","loc":[-85.632711,41.944478]},"n943":{"id":"n943","loc":[-85.632825,41.94426]},"n944":{"id":"n944","loc":[-85.632606,41.944363]},"n945":{"id":"n945","loc":[-85.63275,41.94418]},"n946":{"id":"n946","loc":[-85.632588,41.944256]},"n947":{"id":"n947","loc":[-85.632611,41.944279]},"n948":{"id":"n948","loc":[-85.632548,41.944306]},"n949":{"id":"n949","loc":[-85.632512,41.944406]},"n95":{"id":"n95","loc":[-85.637188,41.942217]},"n950":{"id":"n950","loc":[-85.632565,41.944463]},"n951":{"id":"n951","loc":[-85.632579,41.944456]},"n952":{"id":"n952","loc":[-85.632634,41.944518]},"n953":{"id":"n953","loc":[-85.632686,41.944569]},"n954":{"id":"n954","loc":[-85.632745,41.944537]},"n955":{"id":"n955","loc":[-85.632659,41.944587]},"n956":{"id":"n956","loc":[-85.632778,41.944705]},"n957":{"id":"n957","loc":[-85.632815,41.944301],"tags":{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Access Point Employment","office":"employment_agency"}},"n958":{"id":"n958","loc":[-85.6332,41.944174],"tags":{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paisley Emporium","shop":"second_hand"}},"n959":{"id":"n959","loc":[-85.633578,41.944568],"tags":{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lowry's Books","shop":"books"}},"n96":{"id":"n96","loc":[-85.637189,41.942303]},"n960":{"id":"n960","loc":[-85.63344,41.944443],"tags":{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"restaurant","cuisine":"pizza","name":"Paisano's Bar and Grill"}},"n961":{"id":"n961","loc":[-85.633009,41.944542],"tags":{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"cafe","cuisine":"american","internet_access":"yes","name":"Main Street Cafe"}},"n962":{"id":"n962","loc":[-85.633674,41.944682],"tags":{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Fitness"}},"n963":{"id":"n963","loc":[-85.633376,41.944868],"tags":{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Barbell"}},"n964":{"id":"n964","loc":[-85.633366,41.944783]},"n965":{"id":"n965","loc":[-85.633296,41.94482]},"n966":{"id":"n966","loc":[-85.633214,41.94487]},"n967":{"id":"n967","loc":[-85.633005,41.944988]},"n968":{"id":"n968","loc":[-85.633269,41.944816]},"n969":{"id":"n969","loc":[-85.633215,41.944842]},"n97":{"id":"n97","loc":[-85.637299,41.942302]},"n970":{"id":"n970","loc":[-85.633245,41.944871]},"n971":{"id":"n971","loc":[-85.633296,41.944845]},"n972":{"id":"n972","loc":[-85.633254,41.944845],"tags":{"natural":"tree"}},"n973":{"id":"n973","loc":[-85.633557,41.945515]},"n974":{"id":"n974","loc":[-85.633279,41.945246]},"n975":{"id":"n975","loc":[-85.63324,41.945226]},"n976":{"id":"n976","loc":[-85.6332,41.945213]},"n977":{"id":"n977","loc":[-85.633133,41.945164]},"n978":{"id":"n978","loc":[-85.63312,41.945132]},"n979":{"id":"n979","loc":[-85.633095,41.945081]},"n98":{"id":"n98","loc":[-85.637299,41.942314]},"n980":{"id":"n980","loc":[-85.633064,41.945047]},"n981":{"id":"n981","loc":[-85.632739,41.944742]},"n982":{"id":"n982","loc":[-85.633281,41.945026]},"n983":{"id":"n983","loc":[-85.633155,41.944903]},"n984":{"id":"n984","loc":[-85.633079,41.944829]},"n985":{"id":"n985","loc":[-85.63304,41.944853]},"n986":{"id":"n986","loc":[-85.632949,41.944776]},"n987":{"id":"n987","loc":[-85.632921,41.944725]},"n988":{"id":"n988","loc":[-85.632859,41.944673]},"n989":{"id":"n989","loc":[-85.632895,41.94505]},"n99":{"id":"n99","loc":[-85.637396,41.942313]},"n990":{"id":"n990","loc":[-85.633336,41.945138]},"n991":{"id":"n991","loc":[-85.633466,41.945265]},"n992":{"id":"n992","loc":[-85.633367,41.945327]},"n993":{"id":"n993","loc":[-85.633163,41.945189]},"n994":{"id":"n994","loc":[-85.633678,41.945309]},"n995":{"id":"n995","loc":[-85.633619,41.945261]},"n996":{"id":"n996","loc":[-85.63355,41.945301]},"n997":{"id":"n997","loc":[-85.633607,41.945352]},"n998":{"id":"n998","loc":[-85.633579,41.945327],"tags":{"entrance":"yes"}},"n999":{"id":"n999","loc":[-85.633445,41.945404]},"r2":{"id":"r2","members":[{"id":"w225","role":"outer","type":"way"}],"tags":{"type":"multipolygon","waterway":"riverbank"}},"r5":{"id":"r5","members":[{"id":"w642","role":"outer","type":"way"}],"tags":{"admin_level":"8","border_type":"city","boundary":"administrative","name":"Three Rivers","place":"city","type":"boundary"}},"w1":{"id":"w1","nodes":["n5","n1797"],"tags":{"highway":"residential","name":"12th Avenue"}},"w10":{"id":"w10","nodes":["n54","n55","n56","n57","n891","n890","n54"],"tags":{"building":"yes"}},"w100":{"id":"w100","nodes":["n451","n915","n452"],"tags":{"highway":"footway"}},"w101":{"id":"w101","nodes":["n461","n462","n463","n464","n465","n466"],"tags":{"barrier":"fence"}},"w102":{"id":"w102","nodes":["n467","n468","n469","n470","n472","n467"],"tags":{"amenity":"parking"}},"w103":{"id":"w103","nodes":["n2597","n2444","n471","n472"],"tags":{"highway":"footway"}},"w104":{"id":"w104","nodes":["n473","n474","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w105":{"id":"w105","nodes":["n475","n324","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w106":{"id":"w106","nodes":["n886","n452","n476"],"tags":{"footway":"sidewalk","highway":"footway"}},"w107":{"id":"w107","nodes":["n485","n4678","n486","n18"],"tags":{"highway":"service"}},"w108":{"id":"w108","nodes":["n300","n487","n488","n489","n490"],"tags":{"highway":"footway"}},"w109":{"id":"w109","nodes":["n490","n491"],"tags":{"highway":"footway"}},"w11":{"id":"w11","nodes":["n58","n63","n59","n315","n60"],"tags":{"highway":"service"}},"w110":{"id":"w110","nodes":["n492","n493","n494","n495","n496","n497","n492"],"tags":{"building":"yes"}},"w111":{"id":"w111","nodes":["n498","n499","n511"],"tags":{"highway":"service"}},"w112":{"id":"w112","nodes":["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],"tags":{"highway":"service"}},"w113":{"id":"w113","nodes":["n511","n510"],"tags":{"covered":"yes","highway":"service"}},"w114":{"id":"w114","nodes":["n512","n513","n514","n515","n512"],"tags":{"building":"yes"}},"w115":{"id":"w115","nodes":["n516","n517","n518","n519","n516"],"tags":{"building":"yes"}},"w116":{"id":"w116","nodes":["n520","n521","n522","n523","n520"],"tags":{"building":"yes"}},"w117":{"id":"w117","nodes":["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],"tags":{"building":"yes"}},"w118":{"id":"w118","nodes":["n536","n537","n538","n539","n536"],"tags":{"building":"yes"}},"w119":{"id":"w119","nodes":["n540","n541","n542","n543","n544","n545","n546","n547","n540"],"tags":{"building":"yes"}},"w12":{"id":"w12","nodes":["n61","n314","n70","n62","n63"],"tags":{"highway":"service"}},"w120":{"id":"w120","nodes":["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],"tags":{"building":"yes"}},"w121":{"id":"w121","nodes":["n558","n559","n560","n561","n562","n563","n564","n565","n558"],"tags":{"building":"yes"}},"w122":{"id":"w122","nodes":["n566","n567","n568","n569","n566"],"tags":{"building":"yes"}},"w123":{"id":"w123","nodes":["n570","n571","n572","n573","n570"],"tags":{"building":"yes"}},"w124":{"id":"w124","nodes":["n574","n575","n576","n577","n574"],"tags":{"building":"yes"}},"w125":{"id":"w125","nodes":["n578","n579","n580","n581","n578"],"tags":{"building":"yes"}},"w126":{"id":"w126","nodes":["n582","n583","n584","n585","n582"],"tags":{"building":"yes"}},"w127":{"id":"w127","nodes":["n586","n587","n588","n589","n590","n591","n592","n593","n586"],"tags":{"building":"yes"}},"w128":{"id":"w128","nodes":["n594","n595","n596","n597","n598","n599","n600","n601","n594"],"tags":{"building":"yes"}},"w129":{"id":"w129","nodes":["n309","n602","n603"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w13":{"id":"w13","nodes":["n64","n65","n66","n67","n68","n69","n64"],"tags":{"amenity":"parking"}},"w130":{"id":"w130","nodes":["n603","n604"],"tags":{"footway":"sidewalk","highway":"footway"}},"w131":{"id":"w131","nodes":["n604","n605","n606"],"tags":{"footway":"sidewalk","highway":"footway"}},"w132":{"id":"w132","nodes":["n606","n607"],"tags":{"footway":"sidewalk","highway":"footway"}},"w133":{"id":"w133","nodes":["n607","n610","n608","n603"],"tags":{"footway":"sidewalk","highway":"footway"}},"w134":{"id":"w134","nodes":["n609","n610","n611"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w135":{"id":"w135","nodes":["n244","n245","n246"],"tags":{"highway":"service"}},"w136":{"id":"w136","nodes":["n612","n613","n614","n615","n612"],"tags":{"amenity":"shelter"}},"w137":{"id":"w137","nodes":["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],"tags":{"highway":"residential","name":"Foster Street"}},"w138":{"id":"w138","nodes":["n2779","n625","n626","n627"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w139":{"id":"w139","nodes":["n630","n631","n632","n2437"],"tags":{"highway":"service"}},"w14":{"id":"w14","nodes":["n71","n72","n73","n74","n71"],"tags":{"building":"yes"}},"w140":{"id":"w140","nodes":["n643","n637","n715","n2410"],"tags":{"highway":"footway","name":"Mural Mall"}},"w141":{"id":"w141","nodes":["n639","n2516"],"tags":{"barrier":"wall"}},"w142":{"id":"w142","nodes":["n640","n641","n645","n642","n660","n643","n644"],"tags":{"highway":"service"}},"w143":{"id":"w143","nodes":["n646","n647"],"tags":{"highway":"service"}},"w144":{"id":"w144","nodes":["n654","n655","n656"],"tags":{"barrier":"wall"}},"w145":{"id":"w145","nodes":["n665","n666","n667"],"tags":{"barrier":"wall"}},"w146":{"id":"w146","nodes":["n2727","n662","n2719"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w147":{"id":"w147","nodes":["n2725","n674"],"tags":{"highway":"service","oneway":"yes"}},"w148":{"id":"w148","nodes":["n2464","n2460","n2454","n684","n2455","n2464"],"tags":{"building":"yes"}},"w149":{"id":"w149","nodes":["n2456","n685","n686","n687","n2456"],"tags":{"building":"yes"}},"w15":{"id":"w15","nodes":["n75","n76","n77","n78","n75"],"tags":{"building":"yes"}},"w150":{"id":"w150","nodes":["n685","n688","n689","n690","n691","n692","n686","n685"],"tags":{"building":"yes"}},"w151":{"id":"w151","nodes":["n688","n693","n694","n689","n688"],"tags":{"building":"yes"}},"w152":{"id":"w152","nodes":["n693","n695","n702","n696","n697","n694","n693"],"tags":{"building":"yes"}},"w153":{"id":"w153","nodes":["n695","n698","n699","n700","n701","n702","n695"],"tags":{"building":"yes"}},"w154":{"id":"w154","nodes":["n698","n703","n707","n704","n699","n698"],"tags":{"building":"yes"}},"w155":{"id":"w155","nodes":["n703","n705","n706","n707","n703"],"tags":{"building":"yes"}},"w156":{"id":"w156","nodes":["n705","n708","n709","n706","n705"],"tags":{"building":"yes"}},"w157":{"id":"w157","nodes":["n709","n710","n711","n708","n709"],"tags":{"building":"yes"}},"w158":{"id":"w158","nodes":["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w159":{"id":"w159","nodes":["n714","n720","n721"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w16":{"id":"w16","nodes":["n79","n80","n81","n82","n83","n84","n85","n86","n79"],"tags":{"building":"yes"}},"w160":{"id":"w160","nodes":["n729","n721","n722","n964","n723","n724"],"tags":{"footway":"sidewalk","highway":"footway"}},"w161":{"id":"w161","nodes":["n713","n726","n722"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w164":{"id":"w164","nodes":["n365","n732","n733","n738"],"tags":{"footway":"sidewalk","highway":"footway"}},"w165":{"id":"w165","nodes":["n724","n734","n367","n735","n736","n737"],"tags":{"footway":"sidewalk","highway":"footway"}},"w166":{"id":"w166","nodes":["n739","n2037","n2038","n2039","n2040","n1623","n2032"],"tags":{"highway":"footway"}},"w167":{"id":"w167","nodes":["n150","n751"],"tags":{"highway":"service"}},"w168":{"id":"w168","nodes":["n752","n753","n754","n755","n752"],"tags":{"building":"yes"}},"w169":{"id":"w169","nodes":["n756","n757","n758","n759","n756"],"tags":{"building":"yes"}},"w17":{"id":"w17","nodes":["n87","n88","n89","n90","n87"],"tags":{"building":"yes"}},"w170":{"id":"w170","nodes":["n760","n761","n762","n763","n764","n765","n760"],"tags":{"building":"yes"}},"w171":{"id":"w171","nodes":["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],"tags":{"building":"yes"}},"w172":{"id":"w172","nodes":["n778","n779","n780","n781","n782","n783","n784","n785","n778"],"tags":{"building":"yes"}},"w173":{"id":"w173","nodes":["n786","n787","n788","n789","n786"],"tags":{"building":"yes"}},"w174":{"id":"w174","nodes":["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],"tags":{"building":"yes"}},"w175":{"id":"w175","nodes":["n802","n803","n804","n805","n802"],"tags":{"building":"yes"}},"w176":{"id":"w176","nodes":["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],"tags":{"building":"yes"}},"w177":{"id":"w177","nodes":["n816","n1140","n817","n818","n819","n820","n821"],"tags":{"highway":"service"}},"w178":{"id":"w178","nodes":["n822","n823","n824","n825","n822"],"tags":{"building":"yes"}},"w179":{"id":"w179","nodes":["n841","n842","n843","n844","n841"],"tags":{"building":"yes"}},"w18":{"id":"w18","nodes":["n91","n92","n93","n94","n91"],"tags":{"building":"yes"}},"w180":{"id":"w180","nodes":["n845","n856","n846"],"tags":{"highway":"service"}},"w181":{"id":"w181","nodes":["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],"tags":{"highway":"service","oneway":"yes","service":"drive-through"}},"w182":{"id":"w182","nodes":["n857","n858"],"tags":{"highway":"service"}},"w183":{"id":"w183","nodes":["n859","n860","n861","n862","n859"],"tags":{"amenity":"parking"}},"w184":{"id":"w184","nodes":["n863","n864","n867","n866","n865"],"tags":{"highway":"service"}},"w185":{"id":"w185","nodes":["n883","n884"],"tags":{"barrier":"fence"}},"w186":{"id":"w186","nodes":["n1954","n622","n1955"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w187":{"id":"w187","nodes":["n621","n1954"],"tags":{"highway":"steps","incline":"up","name":"Riverwalk Trail","surface":"wood"}},"w188":{"id":"w188","nodes":["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"wood"}},"w189":{"id":"w189","nodes":["n2273","n2274"],"tags":{"highway":"steps","incline":"down","name":"Riverwalk Trail","surface":"wood"}},"w19":{"id":"w19","nodes":["n95","n96","n97","n98","n99","n100","n101","n102","n95"],"tags":{"building":"yes"}},"w190":{"id":"w190","nodes":["n821","n894","n900","n903","n901"],"tags":{"highway":"service"}},"w191":{"id":"w191","nodes":["n896","n897","n898","n899","n900","n894","n896"],"tags":{"amenity":"parking"}},"w192":{"id":"w192","nodes":["n903","n904","n905"],"tags":{"highway":"service"}},"w193":{"id":"w193","nodes":["n901","n906","n902"],"tags":{"highway":"service"}},"w194":{"id":"w194","nodes":["n912","n913"],"tags":{"highway":"footway"}},"w195":{"id":"w195","nodes":["n914","n915"],"tags":{"highway":"footway"}},"w196":{"id":"w196","nodes":["n2466","n918","n919","n920","n2466"],"tags":{"building":"yes"}},"w197":{"id":"w197","nodes":["n918","n921","n922","n919","n918"],"tags":{"building":"yes"}},"w198":{"id":"w198","nodes":["n923","n925","n926","n924","n923"],"tags":{"building":"yes"}},"w199":{"id":"w199","nodes":["n925","n927","n932","n928","n929","n926","n925"],"tags":{"building":"yes"}},"w2":{"id":"w2","nodes":["n3523","n2182","n2160"],"tags":{"highway":"service"}},"w20":{"id":"w20","nodes":["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],"tags":{"building":"yes"}},"w200":{"id":"w200","nodes":["n927","n930","n931","n932","n927"],"tags":{"building":"yes"}},"w201":{"id":"w201","nodes":["n930","n933","n934","n935","n931","n930"],"tags":{"building":"yes"}},"w202":{"id":"w202","nodes":["n933","n936","n937","n934","n933"],"tags":{"building":"yes"}},"w203":{"id":"w203","nodes":["n936","n938","n942","n939","n954","n937","n936"],"tags":{"building":"yes"}},"w204":{"id":"w204","nodes":["n938","n940","n941","n942","n938"],"tags":{"building":"yes"}},"w205":{"id":"w205","nodes":["n940","n943","n944","n941","n940"],"tags":{"building":"yes"}},"w206":{"id":"w206","nodes":["n943","n945","n946","n947","n948","n944","n943"],"tags":{"building":"yes"}},"w207":{"id":"w207","nodes":["n944","n949","n950","n951","n941","n944"],"tags":{"building":"yes"}},"w208":{"id":"w208","nodes":["n941","n951","n952","n939","n942","n941"],"tags":{"building":"yes"}},"w209":{"id":"w209","nodes":["n952","n953","n954","n939","n952"],"tags":{"building":"yes"}},"w21":{"id":"w21","nodes":["n115","n116","n117","n118","n115"],"tags":{"building":"yes"}},"w210":{"id":"w210","nodes":["n953","n955","n956","n934","n937","n954","n953"],"tags":{"building":"yes"}},"w211":{"id":"w211","nodes":["n964","n965"],"tags":{"highway":"footway"}},"w212":{"id":"w212","nodes":["n966","n983","n967","n989"],"tags":{"highway":"footway"}},"w213":{"id":"w213","nodes":["n965","n968","n969","n966","n970","n971","n965"],"tags":{"highway":"footway"}},"w214":{"id":"w214","nodes":["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],"tags":{"footway":"sidewalk","highway":"footway"}},"w215":{"id":"w215","nodes":["n978","n982","n983","n984","n985","n986","n987","n988","n981"],"tags":{"highway":"footway"}},"w216":{"id":"w216","nodes":["n976","n990","n991","n992"],"tags":{"highway":"footway"}},"w217":{"id":"w217","nodes":["n998","n999"],"tags":{"highway":"footway"}},"w218":{"id":"w218","nodes":["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],"tags":{"footway":"sidewalk","highway":"footway"}},"w219":{"id":"w219","nodes":["n719","n1026","n1027"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w22":{"id":"w22","nodes":["n119","n120","n121","n122","n119"],"tags":{"building":"yes"}},"w220":{"id":"w220","nodes":["n1027","n1028","n1019"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w221":{"id":"w221","nodes":["n2080","n1828","n1863","n1829"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w222":{"id":"w222","nodes":["n1029","n1030","n1031"],"tags":{"highway":"service"}},"w223":{"id":"w223","nodes":["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],"tags":{"name":"Rocky River","waterway":"river"}},"w224":{"id":"w224","nodes":["n3750","n3751","n3752"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w225":{"id":"w225","nodes":["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},"w226":{"id":"w226","nodes":["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w227":{"id":"w227","nodes":["n2994","n3012","n3011","n2958"],"tags":{"highway":"secondary","name":"Main Street"}},"w228":{"id":"w228","nodes":["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],"tags":{"highway":"primary","name":"Main Street"}},"w229":{"id":"w229","nodes":["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w23":{"id":"w23","nodes":["n123","n124","n125","n126","n123"],"tags":{"building":"yes"}},"w230":{"id":"w230","nodes":["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],"tags":{"name":"Saint Joseph River","waterway":"river"}},"w231":{"id":"w231","nodes":["n456","n1036","n1037","n1038"],"tags":{"barrier":"wall"}},"w232":{"id":"w232","nodes":["n1034","n1039","n1040"],"tags":{"barrier":"wall"}},"w233":{"id":"w233","nodes":["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],"tags":{"access":"private","leisure":"swimming_pool"}},"w234":{"id":"w234","nodes":["n1047","n1048"],"tags":{"barrier":"hedge"}},"w235":{"id":"w235","nodes":["n1049","n1050","n1051","n1052","n1049"],"tags":{"building":"yes"}},"w236":{"id":"w236","nodes":["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],"tags":{"building":"yes"}},"w237":{"id":"w237","nodes":["n1061","n1062","n1063","n1064","n1065","n1061"],"tags":{"building":"yes"}},"w238":{"id":"w238","nodes":["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],"tags":{"building":"yes"}},"w239":{"id":"w239","nodes":["n1072","n1073","n1074","n1075","n1072"],"tags":{"building":"yes"}},"w24":{"id":"w24","nodes":["n127","n128","n129","n130","n127"],"tags":{"building":"yes"}},"w240":{"id":"w240","nodes":["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],"tags":{"building":"yes"}},"w241":{"id":"w241","nodes":["n1082","n1083","n1084","n1085","n1082"],"tags":{"building":"yes"}},"w242":{"id":"w242","nodes":["n1086","n1087","n1088","n1089","n1086"],"tags":{"building":"yes"}},"w243":{"id":"w243","nodes":["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],"tags":{"building":"yes"}},"w244":{"id":"w244","nodes":["n1098","n1099","n1100","n1101"],"tags":{"barrier":"fence"}},"w245":{"id":"w245","nodes":["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],"tags":{"highway":"service"}},"w246":{"id":"w246","nodes":["n1103","n1139","n1104"],"tags":{"barrier":"fence"}},"w247":{"id":"w247","nodes":["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],"tags":{"building":"yes"}},"w248":{"id":"w248","nodes":["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],"tags":{"building":"yes"}},"w249":{"id":"w249","nodes":["n1121","n1122","n1123","n1124","n1121"],"tags":{"building":"yes"}},"w25":{"id":"w25","nodes":["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],"tags":{"building":"yes"}},"w250":{"id":"w250","nodes":["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],"tags":{"building":"yes"}},"w251":{"id":"w251","nodes":["n1137","n1138","n1139"],"tags":{"barrier":"fence"}},"w252":{"id":"w252","nodes":["n876","n1140","n1141"],"tags":{"footway":"sidewalk","highway":"footway"}},"w253":{"id":"w253","nodes":["n1141","n1142","n1143","n1144","n1145","n1146"],"tags":{"footway":"sidewalk","highway":"footway"}},"w254":{"id":"w254","nodes":["n1146","n4743","n1147","n1148"],"tags":{"footway":"sidewalk","highway":"footway"}},"w255":{"id":"w255","nodes":["n1148","n1149","n1150","n1151"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w256":{"id":"w256","nodes":["n1151","n1153","n1154","n1155"],"tags":{"footway":"sidewalk","highway":"footway"}},"w257":{"id":"w257","nodes":["n1155","n1156"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w258":{"id":"w258","nodes":["n1157","n1158"],"tags":{"barrier":"retaining_wall"}},"w259":{"id":"w259","nodes":["n1156","n1161","n1159","n1160","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w26":{"id":"w26","nodes":["n143","n608","n144"],"tags":{"highway":"service"}},"w260":{"id":"w260","nodes":["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],"tags":{"highway":"footway"}},"w261":{"id":"w261","nodes":["n1171","n1172","n1173"],"tags":{"barrier":"wall"}},"w262":{"id":"w262","nodes":["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],"tags":{"natural":"wood"}},"w263":{"id":"w263","nodes":["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w264":{"id":"w264","nodes":["n1186","n1187","n1188","n1189","n1186"],"tags":{"building":"yes"}},"w265":{"id":"w265","nodes":["n1190","n1191","n1192","n1193","n1190"],"tags":{"building":"yes"}},"w266":{"id":"w266","nodes":["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],"tags":{"building":"yes"}},"w267":{"id":"w267","nodes":["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],"tags":{"building":"house"}},"w268":{"id":"w268","nodes":["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],"tags":{"building":"house"}},"w269":{"id":"w269","nodes":["n1221","n1225","n1222","n1223","n1224","n1221"],"tags":{"building":"house"}},"w27":{"id":"w27","nodes":["n145","n147","n146"],"tags":{"highway":"footway"}},"w270":{"id":"w270","nodes":["n1225","n1226","n1227","n1229","n1228"],"tags":{"barrier":"fence"}},"w271":{"id":"w271","nodes":["n1229","n1230"],"tags":{"barrier":"fence"}},"w272":{"id":"w272","nodes":["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],"tags":{"building":"house"}},"w273":{"id":"w273","nodes":["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],"tags":{"building":"house"}},"w274":{"id":"w274","nodes":["n1247","n1248","n1249","n1250","n1247"],"tags":{"building":"house"}},"w275":{"id":"w275","nodes":["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],"tags":{"building":"house"}},"w276":{"id":"w276","nodes":["n1257","n1258","n1259","n1260","n1257"],"tags":{"building":"shed"}},"w277":{"id":"w277","nodes":["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],"tags":{"building":"house"}},"w278":{"id":"w278","nodes":["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],"tags":{"building":"house"}},"w279":{"id":"w279","nodes":["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],"tags":{"building":"house"}},"w28":{"id":"w28","nodes":["n147","n148"],"tags":{"highway":"footway"}},"w280":{"id":"w280","nodes":["n1281","n1282","n1283","n1284"],"tags":{"barrier":"fence"}},"w281":{"id":"w281","nodes":["n1285","n1286","n1287","n1288","n1285"],"tags":{"building":"house"}},"w282":{"id":"w282","nodes":["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],"tags":{"building":"house"}},"w283":{"id":"w283","nodes":["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],"tags":{"access":"private","leisure":"swimming_pool"}},"w284":{"id":"w284","nodes":["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],"tags":{"building":"house"}},"w285":{"id":"w285","nodes":["n1313","n1314","n1315","n1316","n1313"],"tags":{"building":"house"}},"w286":{"id":"w286","nodes":["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],"tags":{"building":"house"}},"w287":{"id":"w287","nodes":["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],"tags":{"building":"yes"}},"w288":{"id":"w288","nodes":["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],"tags":{"access":"private","leisure":"swimming_pool"}},"w289":{"id":"w289","nodes":["n1356","n1331"],"tags":{"barrier":"fence"}},"w29":{"id":"w29","nodes":["n149","n874","n150","n151","n897","n898","n875","n152"],"tags":{"highway":"service","oneway":"yes"}},"w290":{"id":"w290","nodes":["n1357","n1358","n1359","n1360","n1357"],"tags":{"building":"shed"}},"w291":{"id":"w291","nodes":["n1358","n1361","n1362"],"tags":{"barrier":"fence"}},"w292":{"id":"w292","nodes":["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],"tags":{"building":"house"}},"w293":{"id":"w293","nodes":["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],"tags":{"leisure":"swimming_pool"}},"w294":{"id":"w294","nodes":["n1367","n1375","n1376","n1377"],"tags":{"barrier":"fence"}},"w295":{"id":"w295","nodes":["n1378","n1379","n1380","n1381","n1378"],"tags":{"building":"house"}},"w296":{"id":"w296","nodes":["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],"tags":{"building":"house"}},"w297":{"id":"w297","nodes":["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],"tags":{"building":"house"}},"w298":{"id":"w298","nodes":["n1394","n1395","n1396","n1397","n1394"],"tags":{"building":"house"}},"w299":{"id":"w299","nodes":["n1398","n1399","n1400","n1401","n1398"],"tags":{"access":"private3","leisure":"swimming_pool"}},"w3":{"id":"w3","nodes":["n1","n2"],"tags":{"highway":"track","name":"Water Street"}},"w30":{"id":"w30","nodes":["n153","n154","n155","n156","n153"],"tags":{"amenity":"parking"}},"w300":{"id":"w300","nodes":["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],"tags":{"building":"house"}},"w301":{"id":"w301","nodes":["n1414","n1415","n1416","n1417","n1414"],"tags":{"building":"garage"}},"w302":{"id":"w302","nodes":["n1406","n1418","n1419","n1403"],"tags":{"barrier":"fence"}},"w303":{"id":"w303","nodes":["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],"tags":{"building":"house"}},"w304":{"id":"w304","nodes":["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],"tags":{"access":"private","leisure":"swimming_pool"}},"w305":{"id":"w305","nodes":["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],"tags":{"building":"house"}},"w306":{"id":"w306","nodes":["n1455","n1456","n1457","n1458","n1455"],"tags":{"building":"shed"}},"w307":{"id":"w307","nodes":["n1459","n1460","n1461","n1462","n1459"],"tags":{"building":"shed"}},"w308":{"id":"w308","nodes":["n1463","n1464"],"tags":{"barrier":"fence"}},"w309":{"id":"w309","nodes":["n1465","n1466","n1467","n1468"],"tags":{"barrier":"fence"}},"w31":{"id":"w31","nodes":["n157","n605","n158"],"tags":{"highway":"service"}},"w310":{"id":"w310","nodes":["n1469","n1481","n1463"],"tags":{"barrier":"hedge"}},"w311":{"id":"w311","nodes":["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],"tags":{"building":"house"}},"w312":{"id":"w312","nodes":["n1480","n1481"],"tags":{"barrier":"wall"}},"w313":{"id":"w313","nodes":["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],"tags":{"access":"private","leisure":"swimming_pool"}},"w314":{"id":"w314","nodes":["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],"tags":{"building":"house"}},"w315":{"id":"w315","nodes":["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],"tags":{"building":"house"}},"w316":{"id":"w316","nodes":["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],"tags":{"building":"house"}},"w317":{"id":"w317","nodes":["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],"tags":{"building":"house"}},"w318":{"id":"w318","nodes":["n1532","n1533"],"tags":{"barrier":"fence"}},"w319":{"id":"w319","nodes":["n1534","n1532","n1535"],"tags":{"barrier":"fence"}},"w32":{"id":"w32","nodes":["n159","n160","n161","n162","n159"],"tags":{"amenity":"parking"}},"w320":{"id":"w320","nodes":["n1536","n1537","n1538","n1539","n1536"],"tags":{"building":"shed"}},"w321":{"id":"w321","nodes":["n1540","n1541","n1542","n1543","n1540"],"tags":{"building":"shed"}},"w322":{"id":"w322","nodes":["n1544","n1545","n1546","n1547","n1544"],"tags":{"building":"shed"}},"w323":{"id":"w323","nodes":["n1548","n1549","n1550","n1551","n1548"],"tags":{"building":"house"}},"w324":{"id":"w324","nodes":["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],"tags":{"building":"house"}},"w325":{"id":"w325","nodes":["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],"tags":{"building":"house"}},"w326":{"id":"w326","nodes":["n1561","n1568","n1569","n1570"],"tags":{"barrier":"wall"}},"w327":{"id":"w327","nodes":["n1571","n1572"],"tags":{"barrier":"fence"}},"w328":{"id":"w328","nodes":["n1573","n1574","n1575","n1576","n1573"],"tags":{"building":"house"}},"w329":{"id":"w329","nodes":["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],"tags":{"building":"house"}},"w33":{"id":"w33","nodes":["n157","n163"],"tags":{"highway":"service"}},"w330":{"id":"w330","nodes":["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],"tags":{"building":"house"}},"w331":{"id":"w331","nodes":["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],"tags":{"access":"private","leisure":"swimming_pool"}},"w332":{"id":"w332","nodes":["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],"tags":{"building":"house"}},"w333":{"id":"w333","nodes":["n2018","n1626","n1627","n2017","n2018"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w334":{"id":"w334","nodes":["n2","n3","n2764"],"tags":{"highway":"service","name":"Water Street"}},"w335":{"id":"w335","nodes":["n3","n1628","n1614"],"tags":{"highway":"service"}},"w336":{"id":"w336","nodes":["n3198","n4545","n2747"],"tags":{"highway":"residential","name":"Morris Avenue"}},"w337":{"id":"w337","nodes":["n1629","n3504"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w338":{"id":"w338","nodes":["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],"tags":{"highway":"service","service":"parking_aisle"}},"w339":{"id":"w339","nodes":["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],"tags":{"highway":"residential","name":"Millard Street"}},"w34":{"id":"w34","nodes":["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],"tags":{"amenity":"parking"}},"w340":{"id":"w340","nodes":["n1824","n1825"],"tags":{"highway":"service","service":"parking_aisle"}},"w341":{"id":"w341","nodes":["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],"tags":{"building":"yes"}},"w342":{"id":"w342","nodes":["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],"tags":{"amenity":"parking","fee":"no"}},"w343":{"id":"w343","nodes":["n1757","n1758","n1759","n1760","n1757"],"tags":{"building":"yes"}},"w344":{"id":"w344","nodes":["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],"tags":{"building":"school"}},"w345":{"id":"w345","nodes":["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],"tags":{"building":"yes"}},"w346":{"id":"w346","nodes":["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],"tags":{"highway":"residential","name":"Douglas Avenue"}},"w347":{"id":"w347","nodes":["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w348":{"id":"w348","nodes":["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],"tags":{"leisure":"playground"}},"w349":{"id":"w349","nodes":["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],"tags":{"highway":"service"}},"w35":{"id":"w35","nodes":["n168","n167","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w350":{"id":"w350","nodes":["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],"tags":{"amenity":"parking"}},"w351":{"id":"w351","nodes":["n1717","n1718","n1719","n1720","n1717"],"tags":{"building":"yes"}},"w352":{"id":"w352","nodes":["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],"tags":{"building":"yes"}},"w353":{"id":"w353","nodes":["n1637","n1636","n1029","n4715","n1630"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w354":{"id":"w354","nodes":["n1713","n1714","n1715","n1716","n1713"],"tags":{"building":"yes"}},"w355":{"id":"w355","nodes":["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],"tags":{"building":"yes"}},"w356":{"id":"w356","nodes":["n1631","n4717","n1840","n4745","n1841"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w357":{"id":"w357","nodes":["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],"tags":{"building":"yes"}},"w358":{"id":"w358","nodes":["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],"tags":{"building":"yes"}},"w359":{"id":"w359","nodes":["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],"tags":{"highway":"residential","name":"South Street"}},"w36":{"id":"w36","nodes":["n910","n171","n866","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w360":{"id":"w360","nodes":["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],"tags":{"building":"yes"}},"w361":{"id":"w361","nodes":["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],"tags":{"highway":"service"}},"w362":{"id":"w362","nodes":["n1639","n1683","n4710","n1633"],"tags":{"highway":"residential","name":"South Street","oneway":"yes"}},"w363":{"id":"w363","nodes":["n1646","n1647","n1648","n1649","n1646"],"tags":{"leisure":"pitch","pitch":"basketball"}},"w364":{"id":"w364","nodes":["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],"tags":{"amenity":"school","name":"Three Rivers Middle School"}},"w365":{"id":"w365","nodes":["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],"tags":{"building":"yes"}},"w366":{"id":"w366","nodes":["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],"tags":{"amenity":"parking"}},"w367":{"id":"w367","nodes":["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],"tags":{"highway":"residential","name":"Grant Avenue"}},"w368":{"id":"w368","nodes":["n1853","n1687","n1688","n1854","n1853"],"tags":{"amenity":"library","building":"yes","name":"Three Rivers Public Library"}},"w369":{"id":"w369","nodes":["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],"tags":{"amenity":"parking"}},"w37":{"id":"w37","nodes":["n173","n174","n175","n176","n177","n178","n179","n180","n173"],"tags":{"building":"yes"}},"w370":{"id":"w370","nodes":["n1645","n1638","n858","n4718","n1631"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w371":{"id":"w371","nodes":["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],"tags":{"amenity":"school","name":"Three Rivers High School"}},"w372":{"id":"w372","nodes":["n1697","n1698","n1699","n1700","n1697"],"tags":{"building":"yes"}},"w373":{"id":"w373","nodes":["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],"tags":{"amenity":"parking"}},"w374":{"id":"w374","nodes":["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],"tags":{"building":"yes"}},"w375":{"id":"w375","nodes":["n1822","n1823"],"tags":{"highway":"service","service":"parking_aisle"}},"w376":{"id":"w376","nodes":["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],"tags":{"amenity":"parking"}},"w377":{"id":"w377","nodes":["n1676","n1675","n1674","n1673"],"tags":{"highway":"service","oneway":"yes"}},"w378":{"id":"w378","nodes":["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],"tags":{"amenity":"school","name":"Andrews Elementary School"}},"w379":{"id":"w379","nodes":["n1630","n4714","n1847","n4750","n1844"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w38":{"id":"w38","nodes":["n181","n182","n183","n185","n184","n181"],"tags":{"building":"yes"}},"w380":{"id":"w380","nodes":["n1683","n3745","n1686","n1633"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w381":{"id":"w381","nodes":["n2022","n2037"],"tags":{"highway":"footway"}},"w382":{"id":"w382","nodes":["n1826","n1863"],"tags":{"highway":"residential"}},"w383":{"id":"w383","nodes":["n2011","n2012","n739","n2013","n2014","n2029","n2011"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w384":{"id":"w384","nodes":["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],"tags":{"building":"yes"}},"w385":{"id":"w385","nodes":["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],"tags":{"natural":"water"}},"w386":{"id":"w386","nodes":["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],"tags":{"highway":"service"}},"w387":{"id":"w387","nodes":["n1846","n1843","n865","n157","n4721","n1831"],"tags":{"highway":"residential","name":"Andrews Street"}},"w388":{"id":"w388","nodes":["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],"tags":{"highway":"footway"}},"w389":{"id":"w389","nodes":["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],"tags":{"name":"Rocky River","waterway":"river"}},"w39":{"id":"w39","nodes":["n185","n186","n187"],"tags":{"barrier":"fence"}},"w390":{"id":"w390","nodes":["n2050","n2051","n2052","n2053","n2050"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w391":{"id":"w391","nodes":["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],"tags":{"highway":"residential","name":"Constantine Street"}},"w392":{"id":"w392","nodes":["n1869","n212","n436","n2281","n2081"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w393":{"id":"w393","nodes":["n1829","n611","n144","n4694","n602","n1832"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w394":{"id":"w394","nodes":["n1997","n1998","n2000","n1999"],"tags":{"highway":"service","service":"parking_aisle"}},"w395":{"id":"w395","nodes":["n1835","n1869"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w396":{"id":"w396","nodes":["n2000","n2001"],"tags":{"highway":"service","service":"parking_aisle"}},"w397":{"id":"w397","nodes":["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],"tags":{"highway":"residential","name":"Spring Street"}},"w398":{"id":"w398","nodes":["n2015","n2016","n2017","n2018","n2015"],"tags":{"building":"yes"}},"w399":{"id":"w399","nodes":["n2062","n45","n2063","n877","n41","n1852"],"tags":{"highway":"service"}},"w4":{"id":"w4","nodes":["n7","n38","n378","n379","n7"],"tags":{"building":"yes"}},"w40":{"id":"w40","nodes":["n188","n189","n190","n191","n192","n193","n188"],"tags":{"building":"house"}},"w400":{"id":"w400","nodes":["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],"tags":{"amenity":"parking"}},"w401":{"id":"w401","nodes":["n1963","n1964"],"tags":{"bridge":"yes","highway":"footway"}},"w402":{"id":"w402","nodes":["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","barrier":"fence","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"}},"w403":{"id":"w403","nodes":["n1957","n1958","n1959","n481","n1960","n482","n1949"],"tags":{"highway":"path"}},"w404":{"id":"w404","nodes":["n2281","n27","n330","n1987","n1988"],"tags":{"highway":"service"}},"w405":{"id":"w405","nodes":["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w406":{"id":"w406","nodes":["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],"tags":{"highway":"footway"}},"w407":{"id":"w407","nodes":["n2034","n2036","n2009"],"tags":{"highway":"footway"}},"w408":{"id":"w408","nodes":["n1964","n1965","n2002","n1966","n21","n1967","n1969"],"tags":{"highway":"footway"}},"w409":{"id":"w409","nodes":["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],"tags":{"natural":"water"}},"w41":{"id":"w41","nodes":["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],"tags":{"building":"house"}},"w410":{"id":"w410","nodes":["n1868","n2088"],"tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail"}},"w411":{"id":"w411","nodes":["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],"tags":{"highway":"footway"}},"w412":{"id":"w412","nodes":["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","leisure":"park","name":"Scidmore Park"}},"w413":{"id":"w413","nodes":["n1831","n876","n4720","n821","n2089"],"tags":{"highway":"residential","name":"Andrews Street"}},"w414":{"id":"w414","nodes":["n2002","n2003","n2004","n2005","n2006","n2007"],"tags":{"highway":"footway"}},"w415":{"id":"w415","nodes":["n1979","n1980","n1981","n1982","n1979"],"tags":{"amenity":"parking"}},"w416":{"id":"w416","nodes":["n2054","n2055","n2056","n2057","n2054"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w417":{"id":"w417","nodes":["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],"tags":{"leisure":"park","name":"Memory Isle Park"}},"w418":{"id":"w418","nodes":["n2033","n2034","n2035"],"tags":{"highway":"footway"}},"w419":{"id":"w419","nodes":["n1983","n1984","n1985","n1986","n1983"],"tags":{"amenity":"parking"}},"w42":{"id":"w42","nodes":["n206","n207","n208","n209","n210","n211","n206"],"tags":{"building":"house"}},"w420":{"id":"w420","nodes":["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],"tags":{"highway":"residential","name":"French Street"}},"w421":{"id":"w421","nodes":["n2337","n2268"],"tags":{"highway":"path"}},"w422":{"id":"w422","nodes":["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],"tags":{"natural":"water"}},"w423":{"id":"w423","nodes":["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],"tags":{"natural":"wetland"}},"w424":{"id":"w424","nodes":["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],"tags":{"highway":"residential","name":"Pealer Street"}},"w425":{"id":"w425","nodes":["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w426":{"id":"w426","nodes":["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],"tags":{"building":"yes"}},"w427":{"id":"w427","nodes":["n2671","n2672","n2673","n2674","n2671"],"tags":{"building":"yes"}},"w428":{"id":"w428","nodes":["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],"tags":{"building":"yes"}},"w429":{"id":"w429","nodes":["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],"tags":{"amenity":"parking"}},"w43":{"id":"w43","nodes":["n1955","n1956"],"tags":{"footway":"sidewalk","highway":"footway","name":"Riverwalk Trail"}},"w430":{"id":"w430","nodes":["n2471","n2474","n2484","n2479","n2471"],"tags":{"building":"yes"}},"w431":{"id":"w431","nodes":["n2218","n2434","n2436","n2433","n2435","n2210"],"tags":{"name":"Rocky River","waterway":"river"}},"w432":{"id":"w432","nodes":["n2782","n2532","n2783","n2784","n2782"],"tags":{"amenity":"parking"}},"w433":{"id":"w433","nodes":["n2513","n649","n2520","n2514","n2507","n2513"],"tags":{"building":"yes"}},"w434":{"id":"w434","nodes":["n2470","n2468","n2461","n2465","n2470"],"tags":{"building":"yes"}},"w435":{"id":"w435","nodes":["n2598","n2599","n648","n649","n2520","n2598"],"tags":{"building":"yes"}},"w436":{"id":"w436","nodes":["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],"tags":{"building":"yes"}},"w437":{"id":"w437","nodes":["n2503","n2512","n2508","n2499","n2503"],"tags":{"building":"yes"}},"w438":{"id":"w438","nodes":["n2440","n2800","n2774","n1"],"tags":{"highway":"residential","name":"Water Street"}},"w439":{"id":"w439","nodes":["n2675","n2676","n2677","n2678","n2675"],"tags":{"building":"yes"}},"w44":{"id":"w44","nodes":["n213","n214","n215","n216","n213"],"tags":{"building":"yes"}},"w440":{"id":"w440","nodes":["n2512","n2503","n2507","n2514","n2512"],"tags":{"building":"yes"}},"w441":{"id":"w441","nodes":["n2554","n2717","n674","n2720","n2798"],"tags":{"highway":"service","oneway":"yes"}},"w442":{"id":"w442","nodes":["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],"tags":{"amenity":"parking"}},"w443":{"id":"w443","nodes":["n2629","n2627","n2628","n2616","n2630","n2629"],"tags":{"building":"yes"}},"w444":{"id":"w444","nodes":["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w445":{"id":"w445","nodes":["n2572","n2573"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w446":{"id":"w446","nodes":["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],"tags":{"building":"yes"}},"w447":{"id":"w447","nodes":["n2780","n2777","n628","n624","n2779"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w448":{"id":"w448","nodes":["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],"tags":{"building":"yes"}},"w449":{"id":"w449","nodes":["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],"tags":{"amenity":"parking"}},"w45":{"id":"w45","nodes":["n217","n218","n219","n220","n217"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w450":{"id":"w450","nodes":["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],"tags":{"building":"yes"}},"w451":{"id":"w451","nodes":["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],"tags":{"amenity":"parking"}},"w452":{"id":"w452","nodes":["n2273","n457","n2569","n458","n2570"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w453":{"id":"w453","nodes":["n2447","n2242","n2448","n2527","n2530"],"tags":{"highway":"service"}},"w454":{"id":"w454","nodes":["n2560","n333","n2561"],"tags":{"highway":"service","service":"parking_aisle"}},"w455":{"id":"w455","nodes":["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],"tags":{"building":"yes"}},"w456":{"id":"w456","nodes":["n2425","n2429","n2424"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w457":{"id":"w457","nodes":["n2487","n2467","n2472","n2480","n2495","n2487"],"tags":{"building":"yes"}},"w458":{"id":"w458","nodes":["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],"tags":{"building":"yes"}},"w459":{"id":"w459","nodes":["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],"tags":{"building":"yes"}},"w46":{"id":"w46","nodes":["n221","n222","n223","n224","n221"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w460":{"id":"w460","nodes":["n2468","n2464","n2455","n2457","n2461","n2468"],"tags":{"building":"yes"}},"w461":{"id":"w461","nodes":["n2478","n2473","n683","n682","n2463","n681","n2478"],"tags":{"building":"yes"}},"w462":{"id":"w462","nodes":["n2547","n473","n2548","n2549"],"tags":{"highway":"service","service":"parking_aisle"}},"w463":{"id":"w463","nodes":["n2573","n2574"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w464":{"id":"w464","nodes":["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],"tags":{"highway":"service","service":"parking_aisle"}},"w465":{"id":"w465","nodes":["n2571","n459","n2572"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w466":{"id":"w466","nodes":["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],"tags":{"highway":"service"}},"w467":{"id":"w467","nodes":["n2484","n2474","n2477","n2485","n2488","n2484"],"tags":{"building":"yes"}},"w468":{"id":"w468","nodes":["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],"tags":{"building":"yes"}},"w469":{"id":"w469","nodes":["n2469","n2476","n2481","n2475","n920","n2466","n2469"],"tags":{"building":"yes"}},"w47":{"id":"w47","nodes":["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],"tags":{"highway":"service"}},"w470":{"id":"w470","nodes":["n2473","n2470","n2465","n2458","n2462","n683","n2473"],"tags":{"building":"yes"}},"w471":{"id":"w471","nodes":["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],"tags":{"building":"yes"}},"w472":{"id":"w472","nodes":["n2424","n2426","n2427","n2428"],"tags":{"highway":"residential","name":"Moore Street"}},"w473":{"id":"w473","nodes":["n2432","n1026","n4741","n2554","n2425"],"tags":{"highway":"residential","name":"Moore Street"}},"w474":{"id":"w474","nodes":["n2577","n2576"],"tags":{"bridge":"yes","highway":"footway"}},"w475":{"id":"w475","nodes":["n2497","n2505","n2500","n2493","n2497"],"tags":{"building":"yes"}},"w476":{"id":"w476","nodes":["n2493","n2500","n2501","n2496","n2490","n2493"],"tags":{"building":"yes"}},"w477":{"id":"w477","nodes":["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],"tags":{"highway":"residential","name":"Railroad Drive"}},"w478":{"id":"w478","nodes":["n2515","n2511","n2498","n2504","n2509","n2515"],"tags":{"building":"yes"}},"w479":{"id":"w479","nodes":["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],"tags":{"building":"yes"}},"w48":{"id":"w48","nodes":["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],"tags":{"building":"yes"}},"w480":{"id":"w480","nodes":["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],"tags":{"amenity":"parking"}},"w481":{"id":"w481","nodes":["n2796","n2657","n2658","n2797","n2796"],"tags":{"building":"yes"}},"w482":{"id":"w482","nodes":["n2550","n2551","n442","n2552","n2553","n2550"],"tags":{"amenity":"parking"}},"w483":{"id":"w483","nodes":["n2790","n2542"],"tags":{"highway":"service","service":"parking_aisle"}},"w484":{"id":"w484","nodes":["n2311","n1102"],"tags":{"highway":"service"}},"w485":{"id":"w485","nodes":["n2515","n2509","n2516","n2519","n2515"],"tags":{"building":"yes"}},"w486":{"id":"w486","nodes":["n2506","n2502","n2492","n2491","n2494","n2506"],"tags":{"building":"yes"}},"w487":{"id":"w487","nodes":["n2667","n2668","n2669","n2670","n2667"],"tags":{"building":"yes"}},"w488":{"id":"w488","nodes":["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],"tags":{"building":"yes"}},"w489":{"id":"w489","nodes":["n2081","n2430"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w49":{"id":"w49","nodes":["n237","n238"],"tags":{"highway":"footway"}},"w490":{"id":"w490","nodes":["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],"tags":{"highway":"residential","name":"Portage Avenue"}},"w491":{"id":"w491","nodes":["n2578","n2579","n2580","n2581","n2578"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w492":{"id":"w492","nodes":["n2556","n2557","n2558","n2559","n2556"],"tags":{"amenity":"parking"}},"w493":{"id":"w493","nodes":["n2460","n2456","n687","n2453","n2454","n2460"],"tags":{"building":"yes"}},"w494":{"id":"w494","nodes":["n2471","n2479","n2476","n2469","n2471"],"tags":{"building":"yes"}},"w495":{"id":"w495","nodes":["n2724","n2725","n673","n672","n671","n2726","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w496":{"id":"w496","nodes":["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],"tags":{"building":"yes"}},"w497":{"id":"w497","nodes":["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w498":{"id":"w498","nodes":["n2691","n2692","n634","n633","n2693","n2694"],"tags":{"highway":"service"}},"w499":{"id":"w499","nodes":["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],"tags":{"highway":"residential","name":"West Street"}},"w5":{"id":"w5","nodes":["n380","n381","n382","n383","n429","n430","n380"],"tags":{"building":"yes"}},"w50":{"id":"w50","nodes":["n239","n499","n508","n245","n238","n242","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w500":{"id":"w500","nodes":["n2428","n1152","n2421","n2324"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w501":{"id":"w501","nodes":["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],"tags":{"building":"yes"}},"w502":{"id":"w502","nodes":["n2570","n2571"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w503":{"id":"w503","nodes":["n2540","n2542","n2787"],"tags":{"highway":"service"}},"w504":{"id":"w504","nodes":["n2269","n2582","n2250"],"tags":{"highway":"path"}},"w505":{"id":"w505","nodes":["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],"tags":{"building":"yes"}},"w506":{"id":"w506","nodes":["n2543","n2544","n2545","n395","n2546","n2543"],"tags":{"amenity":"parking"}},"w507":{"id":"w507","nodes":["n2449","n2450","n2451","n2452","n1162","n2449"],"tags":{"leisure":"pitch","sport":"tennis"}},"w508":{"id":"w508","nodes":["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],"tags":{"highway":"service"}},"w509":{"id":"w509","nodes":["n2499","n2508","n2510","n2505","n2497","n2499"],"tags":{"building":"yes"}},"w51":{"id":"w51","nodes":["n241","n242","n243","n244"],"tags":{"highway":"service","surface":"unpaved"}},"w510":{"id":"w510","nodes":["n2575","n2577"],"tags":{"highway":"footway"}},"w511":{"id":"w511","nodes":["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],"tags":{"amenity":"parking"}},"w512":{"id":"w512","nodes":["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],"tags":{"building":"yes"}},"w513":{"id":"w513","nodes":["n2720","n2721"],"tags":{"highway":"service","service":"parking_aisle"}},"w514":{"id":"w514","nodes":["n2788","n2790","n2789","n989","n2540","n2541"],"tags":{"highway":"service","service":"parking_aisle"}},"w515":{"id":"w515","nodes":["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],"tags":{"highway":"residential","name":"Middle Street"}},"w516":{"id":"w516","nodes":["n2852","n2805"],"tags":{"access":"private","highway":"service","name":"Battle Street"}},"w517":{"id":"w517","nodes":["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w518":{"id":"w518","nodes":["n2859","n2808"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w519":{"id":"w519","nodes":["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],"tags":{"building":"yes"}},"w52":{"id":"w52","nodes":["n247","n248","n249","n250","n247"],"tags":{"amenity":"parking"}},"w520":{"id":"w520","nodes":["n2806","n2807","n2803"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w521":{"id":"w521","nodes":["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],"tags":{"building":"yes"}},"w522":{"id":"w522","nodes":["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],"tags":{"highway":"residential","name":"Washington Street"}},"w523":{"id":"w523","nodes":["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],"tags":{"highway":"residential","name":"5th Avenue"}},"w524":{"id":"w524","nodes":["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],"tags":{"building":"yes"}},"w525":{"id":"w525","nodes":["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],"tags":{"highway":"residential","name":"Wood Street"}},"w526":{"id":"w526","nodes":["n2877","n2809","n2813","n2844","n2843"],"tags":{"highway":"residential","name":"4th Avenue"}},"w527":{"id":"w527","nodes":["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],"tags":{"amenity":"parking"}},"w528":{"id":"w528","nodes":["n2864","n2892","n2893","n2877","n2860","n3840"],"tags":{"highway":"residential","name":"Garden Street"}},"w529":{"id":"w529","nodes":["n2868","n2890"],"tags":{"bridge":"yes","highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w53":{"id":"w53","nodes":["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],"tags":{"building":"yes"}},"w530":{"id":"w530","nodes":["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],"tags":{"building":"yes"}},"w531":{"id":"w531","nodes":["n2958","n2896"],"tags":{"bridge":"yes","highway":"secondary","name":"Main Street"}},"w532":{"id":"w532","nodes":["n2896","n394","n364","n2748"],"tags":{"highway":"secondary","name":"Main Street"}},"w533":{"id":"w533","nodes":["n2800","n2943","n2940","n2941","n2942","n2943"],"tags":{"highway":"service","service":"parking_aisle"}},"w534":{"id":"w534","nodes":["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],"tags":{"barrier":"fence"}},"w535":{"id":"w535","nodes":["n2894","n2944","n2774","n2765"],"tags":{"highway":"residential","name":"5th Avenue"}},"w536":{"id":"w536","nodes":["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w537":{"id":"w537","nodes":["n2895","n738","n2887","n737","n2913"],"tags":{"highway":"residential","name":"Water Street"}},"w538":{"id":"w538","nodes":["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],"tags":{"highway":"residential","name":"River Drive"}},"w539":{"id":"w539","nodes":["n2882","n2894"],"tags":{"bridge":"yes","highway":"residential","name":"5th Avenue"}},"w54":{"id":"w54","nodes":["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],"tags":{"building":"yes"}},"w540":{"id":"w540","nodes":["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],"tags":{"name":"Portage River","waterway":"river"}},"w541":{"id":"w541","nodes":["n2852","n2851","n3003"],"tags":{"highway":"residential","name":"1st Avenue"}},"w542":{"id":"w542","nodes":["n2991","n3004","n2994"],"tags":{"highway":"residential","name":"River Street"}},"w543":{"id":"w543","nodes":["n2993","n2989"],"tags":{"bridge":"yes","highway":"residential","name":"6th Street"}},"w544":{"id":"w544","nodes":["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],"tags":{"highway":"residential","name":"6th Street"}},"w545":{"id":"w545","nodes":["n2989","n2992","n2848"],"tags":{"highway":"residential","name":"6th Street"}},"w546":{"id":"w546","nodes":["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],"tags":{"natural":"wetland"}},"w547":{"id":"w547","nodes":["n2088","n3013","n3015","n3014","n3017","n3018"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w548":{"id":"w548","nodes":["n3083","n3084","n3085","n3086","n3083"],"tags":{"building":"yes"}},"w549":{"id":"w549","nodes":["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],"tags":{"leisure":"park","name":"Conservation Park"}},"w55":{"id":"w55","nodes":["n277","n278","n279","n280","n281","n282","n283","n284","n277"],"tags":{"building":"yes"}},"w550":{"id":"w550","nodes":["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],"tags":{"highway":"service"}},"w551":{"id":"w551","nodes":["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],"tags":{"highway":"footway"}},"w552":{"id":"w552","nodes":["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],"tags":{"building":"yes"}},"w553":{"id":"w553","nodes":["n3123","n3124","n3129","n3125","n3126","n3123"],"tags":{"building":"yes"}},"w554":{"id":"w554","nodes":["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],"tags":{"building":"yes"}},"w555":{"id":"w555","nodes":["n3087","n3088","n3089","n3090","n3087"],"tags":{"building":"yes"}},"w556":{"id":"w556","nodes":["n3113","n3114","n3115","n3116","n3113"],"tags":{"building":"yes"}},"w557":{"id":"w557","nodes":["n3103","n3104","n3105","n3106","n3103"],"tags":{"building":"yes"}},"w558":{"id":"w558","nodes":["n3127","n3128","n3129","n3124","n3127"],"tags":{"building":"yes"}},"w559":{"id":"w559","nodes":["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],"tags":{"building":"yes"}},"w56":{"id":"w56","nodes":["n285","n286","n287","n288","n285"],"tags":{"amenity":"parking"}},"w560":{"id":"w560","nodes":["n3091","n3092","n3093","n3094","n3091"],"tags":{"building":"yes"}},"w561":{"id":"w561","nodes":["n3155","n3157","n3158","n3159","n3156","n3155"],"tags":{"building":"yes"}},"w562":{"id":"w562","nodes":["n3057","n3058","n3059","n3060","n3057"],"tags":{"building":"yes"}},"w563":{"id":"w563","nodes":["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],"tags":{"building":"yes"}},"w564":{"id":"w564","nodes":["n3134","n3135","n3136","n3131","n3134"],"tags":{"building":"yes"}},"w565":{"id":"w565","nodes":["n3143","n3144","n3145","n3146","n3143"],"tags":{"building":"yes"}},"w566":{"id":"w566","nodes":["n3095","n3096","n3097","n3098","n3095"],"tags":{"building":"yes"}},"w567":{"id":"w567","nodes":["n3130","n3131","n3136","n3132","n3133","n3130"],"tags":{"building":"yes"}},"w568":{"id":"w568","nodes":["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],"tags":{"amenity":"parking"}},"w569":{"id":"w569","nodes":["n3061","n3062","n3063","n3064","n3061"],"tags":{"building":"yes"}},"w57":{"id":"w57","nodes":["n289","n290","n291","n292","n289"],"tags":{"amenity":"parking"}},"w570":{"id":"w570","nodes":["n3155","n3156","n3152","n3153","n3155"],"tags":{"building":"yes"}},"w571":{"id":"w571","nodes":["n3099","n3100","n3101","n3102","n3099"],"tags":{"building":"yes"}},"w572":{"id":"w572","nodes":["n3147","n3148","n3149","n3150","n3147"],"tags":{"building":"yes"}},"w573":{"id":"w573","nodes":["n3039","n2284"],"tags":{"highway":"service"}},"w574":{"id":"w574","nodes":["n3151","n3152","n3153","n3154","n3151"],"tags":{"building":"yes"}},"w575":{"id":"w575","nodes":["n3021","n3022","n3023","n3024","n3021"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w576":{"id":"w576","nodes":["n3065","n3066","n3067","n3068","n3065"],"tags":{"building":"yes"}},"w577":{"id":"w577","nodes":["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],"tags":{"highway":"service","name":"Willow Drive","service":"driveway","surface":"unpaved"}},"w578":{"id":"w578","nodes":["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],"tags":{"building":"yes"}},"w579":{"id":"w579","nodes":["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],"tags":{"highway":"residential","name":"Elm Street"}},"w58":{"id":"w58","nodes":["n240","n293","n294"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w580":{"id":"w580","nodes":["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],"tags":{"building":"yes"}},"w581":{"id":"w581","nodes":["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],"tags":{"highway":"residential","name":"Kelsey Street"}},"w582":{"id":"w582","nodes":["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],"tags":{"highway":"residential","name":"Walnut Street"}},"w583":{"id":"w583","nodes":["n3272","n4469","n4588","n2879","n4564","n2872"],"tags":{"highway":"residential","name":"10th Avenue"}},"w584":{"id":"w584","nodes":["n3243","n3242","n3241","n3240","n3243"],"tags":{"building":"industrial"}},"w585":{"id":"w585","nodes":["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],"tags":{"highway":"residential","name":"6th Avenue"}},"w586":{"id":"w586","nodes":["n3276","n4591","n2853","n4605","n2854"],"tags":{"highway":"residential","name":"8th Avenue"}},"w587":{"id":"w587","nodes":["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],"tags":{"building":"industrial"}},"w588":{"id":"w588","nodes":["n3277","n4599","n2857","n4598","n4608","n2858"],"tags":{"highway":"residential","name":"7th Avenue"}},"w589":{"id":"w589","nodes":["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],"tags":{"building":"yes"}},"w59":{"id":"w59","nodes":["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],"tags":{"footway":"sidewalk","highway":"footway"}},"w590":{"id":"w590","nodes":["n3278","n4458","n4589","n4604","n2861"],"tags":{"highway":"residential","name":"9th Avenue"}},"w591":{"id":"w591","nodes":["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],"tags":{"building":"industrial"}},"w592":{"id":"w592","nodes":["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],"tags":{"natural":"water","water":"pond"}},"w593":{"id":"w593","nodes":["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],"tags":{"building":"industrial"}},"w594":{"id":"w594","nodes":["n3233","n3232","n3231","n3230","n3233"],"tags":{"building":"yes"}},"w595":{"id":"w595","nodes":["n3247","n3246","n3245","n3244","n3247"],"tags":{"building":"industrial"}},"w596":{"id":"w596","nodes":["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],"tags":{"highway":"residential","name":"Armitage Street"}},"w597":{"id":"w597","nodes":["n2193","n2194","n2195","n2197","n2193"],"tags":{"building":"yes"}},"w598":{"id":"w598","nodes":["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],"tags":{"building":"school"}},"w6":{"id":"w6","nodes":["n879","n880","n881","n882","n879"],"tags":{"building":"shed"}},"w60":{"id":"w60","nodes":["n239","n308","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w600":{"id":"w600","nodes":["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],"tags":{"building":"yes"}},"w601":{"id":"w601","nodes":["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],"tags":{"building":"yes"}},"w602":{"id":"w602","nodes":["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],"tags":{"building":"yes"}},"w603":{"id":"w603","nodes":["n3353","n3352","n3347","n3280","n2798"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w604":{"id":"w604","nodes":["n3753","n3211","n3383"],"tags":{"highway":"service","service":"alley"}},"w605":{"id":"w605","nodes":["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],"tags":{"building":"yes"}},"w606":{"id":"w606","nodes":["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],"tags":{"building":"yes"}},"w607":{"id":"w607","nodes":["n2198","n2207"],"tags":{"barrier":"wall"}},"w608":{"id":"w608","nodes":["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],"tags":{"highway":"residential","name":"East Street"}},"w609":{"id":"w609","nodes":["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],"tags":{"highway":"residential","name":"Maple Street"}},"w61":{"id":"w61","nodes":["n309","n310","n311","n312","n313","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w610":{"id":"w610","nodes":["n3379","n3380","n3382","n3381","n3379"],"tags":{"leisure":"park","name":"LaFayette Park"}},"w611":{"id":"w611","nodes":["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],"tags":{"highway":"residential","name":"Bennett Street"}},"w612":{"id":"w612","nodes":["n2751","n3383","n2749","n2798","n2772"],"tags":{"highway":"residential","name":"Market Street"}},"w613":{"id":"w613","nodes":["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],"tags":{"building":"yes"}},"w614":{"id":"w614","nodes":["n3375","n3406","n3405","n3374","n3375"],"tags":{"leisure":"playground"}},"w615":{"id":"w615","nodes":["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],"tags":{"building":"yes"}},"w616":{"id":"w616","nodes":["n3376","n3407","n3408","n3377","n3376"],"tags":{"amenity":"school","name":"Three Rivers Elementary School"}},"w617":{"id":"w617","nodes":["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],"tags":{"building":"yes"}},"w619":{"id":"w619","nodes":["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],"tags":{"highway":"secondary","name":"Michigan Avenue","ref":"M 60"}},"w62":{"id":"w62","nodes":["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],"tags":{"footway":"sidewalk","highway":"footway"}},"w620":{"id":"w620","nodes":["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],"tags":{"highway":"residential"}},"w621":{"id":"w621","nodes":["n3468","n3469","n3470","n3471","n3468"],"tags":{"building":"yes"}},"w622":{"id":"w622","nodes":["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],"tags":{"landuse":"cemetery","name":"Riverside Cemetery"}},"w623":{"id":"w623","nodes":["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],"tags":{"building":"yes"}},"w624":{"id":"w624","nodes":["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],"tags":{"building":"yes"}},"w625":{"id":"w625","nodes":["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],"tags":{"highway":"secondary","name":"Jefferson Street","name_1":"State Highway 60","ref":"M 60"}},"w626":{"id":"w626","nodes":["n3439","n3423","n2863"],"tags":{"highway":"unclassified","name":"Michigan Avenue","name_1":"State Highway 60"}},"w627":{"id":"w627","nodes":["n3500","n3005"],"tags":{"highway":"service"}},"w628":{"id":"w628","nodes":["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],"tags":{"leisure":"park","name":"Marina Park"}},"w629":{"id":"w629","nodes":["n2208","n2209","n2212","n2214","n2208"],"tags":{"building":"yes"}},"w63":{"id":"w63","nodes":["n1955","n316"],"tags":{"footway":"sidewalk","highway":"footway"}},"w630":{"id":"w630","nodes":["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w631":{"id":"w631","nodes":["n2215","n2750","n2770","n2771","n2215"],"tags":{"building":"yes"}},"w632":{"id":"w632","nodes":["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],"tags":{"highway":"residential","name":"Cushman Street"}},"w633":{"id":"w633","nodes":["n2745","n3749","n3507","n4535","n3503"],"tags":{"highway":"residential","name":"Pine Street"}},"w634":{"id":"w634","nodes":["n3510","n3511","n3512","n3509","n3510"],"tags":{"leisure":"park","name":"Bowman Park"}},"w636":{"id":"w636","nodes":["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],"tags":{"highway":"residential","name":"Wheeler Street"}},"w637":{"id":"w637","nodes":["n3550","n4586","n4476","n3472"],"tags":{"highway":"residential","name":"11th Avenue"}},"w638":{"id":"w638","nodes":["n3508","n3518"],"tags":{"bridge":"yes","highway":"residential","name":"Hoffman Street"}},"w639":{"id":"w639","nodes":["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w64":{"id":"w64","nodes":["n316","n317"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w640":{"id":"w640","nodes":["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],"tags":{"landuse":"reservoir","name":"Hoffman Pond","natural":"water"}},"w641":{"id":"w641","nodes":["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],"tags":{"waterway":"river"}},"w642":{"id":"w642","nodes":["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],"tags":{"admin_level":"8","boundary":"administrative"}},"w643":{"id":"w643","nodes":["n2839","n2873"],"tags":{"highway":"service","service":"driveway"}},"w644":{"id":"w644","nodes":["n2873","n2840"],"tags":{"bridge":"yes","highway":"service","layer":"1","service":"driveway"}},"w645":{"id":"w645","nodes":["n2840","n2841","n2842","n2845","n2866"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w646":{"id":"w646","nodes":["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],"tags":{"highway":"residential","name":"Flower Street"}},"w647":{"id":"w647","nodes":["n2874","n2875","n2876","n2954","n2874"],"tags":{"building":"industrial"}},"w648":{"id":"w648","nodes":["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],"tags":{"building":"yes"}},"w649":{"id":"w649","nodes":["n3197","n4543","n4544","n3198"],"tags":{"highway":"residential","name":"Morris Avenue","surface":"unpaved"}},"w65":{"id":"w65","nodes":["n317","n318","n319","n320","n321"],"tags":{"footway":"sidewalk","highway":"footway"}},"w650":{"id":"w650","nodes":["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],"tags":{"highway":"residential","name":"Adams Street"}},"w651":{"id":"w651","nodes":["n3788","n3785","n3786","n3787","n3788"],"tags":{"power":"station"}},"w652":{"id":"w652","nodes":["n2957","n3163","n3241"],"tags":{"barrier":"wall"}},"w653":{"id":"w653","nodes":["n3549","n3802","n3803","n3800","n3801"],"tags":{"highway":"service","surface":"unpaved"}},"w654":{"id":"w654","nodes":["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],"tags":{"building":"yes"}},"w655":{"id":"w655","nodes":["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],"tags":{"building":"yes"}},"w656":{"id":"w656","nodes":["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],"tags":{"building":"yes"}},"w657":{"id":"w657","nodes":["n3772","n3773","n3774","n3775","n3772"],"tags":{"building":"yes"}},"w658":{"id":"w658","nodes":["n3776","n3777","n3784","n3789","n3776"],"tags":{"building":"yes"}},"w659":{"id":"w659","nodes":["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],"tags":{"leisure":"pitch","sport":"baseball"}},"w66":{"id":"w66","nodes":["n321","n322"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w660":{"id":"w660","nodes":["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],"tags":{"highway":"service"}},"w661":{"id":"w661","nodes":["n3968","n3969"],"tags":{"highway":"footway"}},"w662":{"id":"w662","nodes":["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],"tags":{"amenity":"parking"}},"w663":{"id":"w663","nodes":["n3964","n3965"],"tags":{"highway":"footway"}},"w664":{"id":"w664","nodes":["n3966","n3967"],"tags":{"highway":"footway"}},"w665":{"id":"w665","nodes":["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],"tags":{"highway":"service","service":"parking_aisle"}},"w666":{"id":"w666","nodes":["n3895","n3896"],"tags":{"highway":"service","service":"parking_aisle"}},"w667":{"id":"w667","nodes":["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],"tags":{"access":"private","highway":"service","name":"Collins Drive"}},"w668":{"id":"w668","nodes":["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],"tags":{"building":"school"}},"w669":{"id":"w669","nodes":["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],"tags":{"highway":"service"}},"w67":{"id":"w67","nodes":["n322","n886","n323","n475"],"tags":{"footway":"crossing","highway":"footway"}},"w670":{"id":"w670","nodes":["n3473","n3859","n3860","n3980","n4908","n4865"],"tags":{"highway":"secondary","name":"Hoffman Street","ref":"M 60"}},"w671":{"id":"w671","nodes":["n3970","n3806","n3971"],"tags":{"highway":"footway"}},"w672":{"id":"w672","nodes":["n3892","n3893","n3894"],"tags":{"highway":"service","service":"parking_aisle"}},"w673":{"id":"w673","nodes":["n3945","n3946","n3992","n3990","n3945"],"tags":{"leisure":"pitch","sport":"tennis"}},"w674":{"id":"w674","nodes":["n3890","n3893","n3891"],"tags":{"highway":"service","service":"parking_aisle"}},"w675":{"id":"w675","nodes":["n3947","n3948","n3994","n3993","n3947"],"tags":{"leisure":"pitch","sport":"tennis"}},"w676":{"id":"w676","nodes":["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],"tags":{"highway":"service"}},"w677":{"id":"w677","nodes":["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],"tags":{"highway":"footway"}},"w678":{"id":"w678","nodes":["n3887","n3888","n3895","n3899"],"tags":{"highway":"service","service":"parking_aisle"}},"w679":{"id":"w679","nodes":["n3946","n3947","n3993","n3992","n3946"],"tags":{"leisure":"pitch","sport":"tennis"}},"w68":{"id":"w68","nodes":["n294","n1952","n326"],"tags":{"footway":"sidewalk","highway":"footway"}},"w680":{"id":"w680","nodes":["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],"tags":{"leisure":"pitch","sport":"baseball"}},"w681":{"id":"w681","nodes":["n3990","n3991","n3944","n3945","n3990"],"tags":{"leisure":"pitch","sport":"tennis"}},"w682":{"id":"w682","nodes":["n3871","n3872","n3873","n3874","n3871"],"tags":{"amenity":"parking"}},"w683":{"id":"w683","nodes":["n3956","n3965","n3957","n3958","n3959"],"tags":{"footway":"sidewalk","highway":"footway"}},"w684":{"id":"w684","nodes":["n3790","n3791","n3792","n3793","n3790"],"tags":{"building":"shed"}},"w685":{"id":"w685","nodes":["n3794","n3795","n3796","n3797","n3794"],"tags":{"building":"yes"}},"w686":{"id":"w686","nodes":["n3798","n3799","n3804","n3805","n3798"],"tags":{"building":"yes"}},"w687":{"id":"w687","nodes":["n3806","n3807"],"tags":{"highway":"footway"}},"w688":{"id":"w688","nodes":["n3845","n3846","n3847","n3848","n3845"],"tags":{"leisure":"pitch","sport":"american_football"}},"w689":{"id":"w689","nodes":["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],"tags":{"leisure":"track","sport":"running"}},"w69":{"id":"w69","nodes":["n326","n327"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w690":{"id":"w690","nodes":["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],"tags":{"building":"yes"}},"w691":{"id":"w691","nodes":["n4028","n4029","n4030","n4031","n4028"],"tags":{"building":"yes"}},"w692":{"id":"w692","nodes":["n4032","n4033","n4034","n4035","n4032"],"tags":{"building":"yes"}},"w693":{"id":"w693","nodes":["n4036","n4037","n4038","n4039","n4036"],"tags":{"building":"yes"}},"w694":{"id":"w694","nodes":["n4040","n4041","n4042","n4043","n4040"],"tags":{"building":"yes"}},"w695":{"id":"w695","nodes":["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],"tags":{"building":"yes"}},"w696":{"id":"w696","nodes":["n4050","n4051","n4052","n4053","n4050"],"tags":{"building":"roof"}},"w697":{"id":"w697","nodes":["n4054","n4068","n4055","n4056","n4057","n4054"],"tags":{"building":"yes"}},"w698":{"id":"w698","nodes":["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],"tags":{"building":"yes"}},"w699":{"id":"w699","nodes":["n4064","n4066","n4065"],"tags":{"barrier":"fence"}},"w7":{"id":"w7","nodes":["n43","n44","n45"],"tags":{"highway":"service"}},"w70":{"id":"w70","nodes":["n327","n328","n27","n329"],"tags":{"footway":"sidewalk","highway":"footway"}},"w700":{"id":"w700","nodes":["n4066","n4067","n4068"],"tags":{"barrier":"fence"}},"w701":{"id":"w701","nodes":["n4069","n4070","n4071","n4072","n4069"],"tags":{"building":"shed"}},"w702":{"id":"w702","nodes":["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],"tags":{"building":"yes"}},"w703":{"id":"w703","nodes":["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],"tags":{"building":"yes"}},"w704":{"id":"w704","nodes":["n4093","n4094","n4095","n4096"],"tags":{"barrier":"fence"}},"w705":{"id":"w705","nodes":["n4097","n4098","n4099","n4100","n4097"],"tags":{"building":"yes"}},"w706":{"id":"w706","nodes":["n4098","n4102","n4087"],"tags":{"barrier":"fence"}},"w707":{"id":"w707","nodes":["n4101","n4102","n4096","n4170","n4103"],"tags":{"barrier":"fence"}},"w708":{"id":"w708","nodes":["n4104","n4105","n4106","n4107","n4104"],"tags":{"access":"private","leisure":"swimming_pool"}},"w709":{"id":"w709","nodes":["n4108","n4109","n4110","n4111","n4108"],"tags":{"building":"yes"}},"w71":{"id":"w71","nodes":["n329","n331"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w710":{"id":"w710","nodes":["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],"tags":{"building":"yes"}},"w711":{"id":"w711","nodes":["n4120","n4121","n4122","n4123","n4120"],"tags":{"building":"yes"}},"w712":{"id":"w712","nodes":["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],"tags":{"building":"yes"}},"w713":{"id":"w713","nodes":["n4130","n4131","n4132","n4133","n4130"],"tags":{"building":"shed"}},"w714":{"id":"w714","nodes":["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],"tags":{"building":"yes"}},"w715":{"id":"w715","nodes":["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],"tags":{"building":"yes"}},"w716":{"id":"w716","nodes":["n4150","n4151","n4152","n4153","n4150"],"tags":{"building":"yes"}},"w717":{"id":"w717","nodes":["n4154","n4155","n4156","n4157","n4154"],"tags":{"building":"yes"}},"w718":{"id":"w718","nodes":["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],"tags":{"building":"yes"}},"w719":{"id":"w719","nodes":["n4166","n4167","n4168","n4169","n4166"],"tags":{"building":"yes"}},"w72":{"id":"w72","nodes":["n331","n344","n332","n333","n334"],"tags":{"footway":"sidewalk","highway":"footway"}},"w720":{"id":"w720","nodes":["n4170","n4171"],"tags":{"barrier":"fence"}},"w721":{"id":"w721","nodes":["n4138","n4103"],"tags":{"barrier":"fence"}},"w722":{"id":"w722","nodes":["n4103","n4172"],"tags":{"barrier":"fence"}},"w723":{"id":"w723","nodes":["n4173","n4174"],"tags":{"barrier":"fence"}},"w724":{"id":"w724","nodes":["n4175","n4176","n4177","n4178","n4175"],"tags":{"building":"yes"}},"w725":{"id":"w725","nodes":["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],"tags":{"building":"yes"}},"w726":{"id":"w726","nodes":["n4185","n4186","n4187","n4188","n4185"],"tags":{"building":"yes"}},"w727":{"id":"w727","nodes":["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],"tags":{"building":"yes"}},"w728":{"id":"w728","nodes":["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],"tags":{"building":"yes"}},"w729":{"id":"w729","nodes":["n4211","n4212","n4213","n4214","n4211"],"tags":{"building":"shed"}},"w73":{"id":"w73","nodes":["n335","n336","n337","n338","n339","n340","n341","n342","n335"],"tags":{"building":"yes"}},"w730":{"id":"w730","nodes":["n4215","n4216","n4217","n4218","n4215"],"tags":{"building":"yes"}},"w731":{"id":"w731","nodes":["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],"tags":{"building":"yes"}},"w732":{"id":"w732","nodes":["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],"tags":{"building":"yes"}},"w733":{"id":"w733","nodes":["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],"tags":{"highway":"service"}},"w734":{"id":"w734","nodes":["n4240","n4249","n4248"],"tags":{"highway":"service","service":"parking_aisle"}},"w735":{"id":"w735","nodes":["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],"tags":{"amenity":"parking"}},"w736":{"id":"w736","nodes":["n4259","n4260","n4261","n4262","n4259"],"tags":{"building":"yes"}},"w737":{"id":"w737","nodes":["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],"tags":{"building":"yes"}},"w738":{"id":"w738","nodes":["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],"tags":{"building":"yes"}},"w739":{"id":"w739","nodes":["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],"tags":{"building":"yes"}},"w74":{"id":"w74","nodes":["n343","n344","n345"],"tags":{"highway":"service"}},"w740":{"id":"w740","nodes":["n4295","n4296","n4297","n4298","n4295"],"tags":{"building":"yes"}},"w741":{"id":"w741","nodes":["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],"tags":{"building":"yes"}},"w742":{"id":"w742","nodes":["n4311","n4312","n4313","n4314","n4311"],"tags":{"building":"shed"}},"w743":{"id":"w743","nodes":["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],"tags":{"building":"yes"}},"w744":{"id":"w744","nodes":["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],"tags":{"building":"yes"}},"w745":{"id":"w745","nodes":["n4335","n4336","n4337","n4338","n4335"],"tags":{"building":"shed"}},"w746":{"id":"w746","nodes":["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],"tags":{"building":"yes"}},"w747":{"id":"w747","nodes":["n4345","n4346","n4347","n4348","n4345"],"tags":{"building":"yes"}},"w748":{"id":"w748","nodes":["n4349","n4350","n4351","n4352","n4349"],"tags":{"building":"yes"}},"w749":{"id":"w749","nodes":["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],"tags":{"building":"yes"}},"w75":{"id":"w75","nodes":["n346","n347","n348","n349","n350","n351","n346"],"tags":{"amenity":"parking"}},"w750":{"id":"w750","nodes":["n4612","n4359","n4360"],"tags":{"barrier":"fence"}},"w751":{"id":"w751","nodes":["n4361","n4362","n4363","n4364","n4361"],"tags":{"building":"yes"}},"w752":{"id":"w752","nodes":["n4365","n4366","n4367","n4368","n4365"],"tags":{"building":"yes"}},"w753":{"id":"w753","nodes":["n4369","n4370","n4371","n4372","n4375","n4369"],"tags":{"building":"yes"}},"w754":{"id":"w754","nodes":["n4373","n4374","n4375"],"tags":{"barrier":"fence"}},"w755":{"id":"w755","nodes":["n4376","n4377","n4378","n4379","n4376"],"tags":{"building":"shed"}},"w756":{"id":"w756","nodes":["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],"tags":{"building":"yes"}},"w757":{"id":"w757","nodes":["n4392","n4393","n4394","n4395","n4392"],"tags":{"building":"yes"}},"w758":{"id":"w758","nodes":["n4396","n4397","n4398","n4399","n4396"],"tags":{"building":"shed"}},"w759":{"id":"w759","nodes":["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],"tags":{"building":"yes"}},"w76":{"id":"w76","nodes":["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w760":{"id":"w760","nodes":["n4416","n4417"],"tags":{"barrier":"fence"}},"w761":{"id":"w761","nodes":["n4418","n4416","n4419"],"tags":{"barrier":"fence"}},"w762":{"id":"w762","nodes":["n4420","n4421"],"tags":{"barrier":"fence"}},"w763":{"id":"w763","nodes":["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],"tags":{"building":"yes"}},"w764":{"id":"w764","nodes":["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],"tags":{"building":"yes"}},"w765":{"id":"w765","nodes":["n4446","n4447","n4448","n4449","n4446"],"tags":{"building":"yes"}},"w766":{"id":"w766","nodes":["n4450","n4451","n4452","n4453","n4450"],"tags":{"building":"yes"}},"w767":{"id":"w767","nodes":["n4454","n4455","n4456","n4457","n4454"],"tags":{"building":"yes"}},"w768":{"id":"w768","nodes":["n4461","n4458","n4460"],"tags":{"footway":"crossing","highway":"footway"}},"w769":{"id":"w769","nodes":["n4460","n4462","n4459"],"tags":{"footway":"sidewalk","highway":"footway"}},"w77":{"id":"w77","nodes":["n325","n360","n361"],"tags":{"footway":"crossing","highway":"footway"}},"w770":{"id":"w770","nodes":["n4462","n4463","n4464"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w771":{"id":"w771","nodes":["n4464","n4465","n4466","n4467"],"tags":{"footway":"sidewalk","highway":"footway"}},"w772":{"id":"w772","nodes":["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],"tags":{"footway":"sidewalk","highway":"footway"}},"w773":{"id":"w773","nodes":["n4467","n4468","n3959"],"tags":{"footway":"crossing","highway":"footway"}},"w774":{"id":"w774","nodes":["n4459","n4469","n4470"],"tags":{"footway":"crossing","highway":"footway"}},"w775":{"id":"w775","nodes":["n4470","n4471","n4472","n4473","n4474","n4475"],"tags":{"footway":"sidewalk","highway":"footway"}},"w776":{"id":"w776","nodes":["n4475","n4476","n4477"],"tags":{"footway":"crossing","highway":"footway"}},"w777":{"id":"w777","nodes":["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],"tags":{"footway":"sidewalk","highway":"footway"}},"w778":{"id":"w778","nodes":["n4488","n4489","n4490","n4491","n4488"],"tags":{"building":"yes"}},"w779":{"id":"w779","nodes":["n4492","n4493","n4494","n4495","n4492"],"tags":{"building":"yes"}},"w78":{"id":"w78","nodes":["n361","n362","n369"],"tags":{"footway":"sidewalk","highway":"footway"}},"w780":{"id":"w780","nodes":["n4496","n4497","n4498","n4499","n4496"],"tags":{"access":"private","leisure":"swimming_pool"}},"w781":{"id":"w781","nodes":["n4508","n4509"],"tags":{"footway":"sidewalk","highway":"footway"}},"w782":{"id":"w782","nodes":["n4510","n4511"],"tags":{"footway":"sidewalk","highway":"footway"}},"w783":{"id":"w783","nodes":["n4512","n4513"],"tags":{"footway":"sidewalk","highway":"footway"}},"w784":{"id":"w784","nodes":["n4513","n4514"],"tags":{"footway":"sidewalk","highway":"footway"}},"w785":{"id":"w785","nodes":["n4515","n4516"],"tags":{"footway":"sidewalk","highway":"footway"}},"w786":{"id":"w786","nodes":["n4517","n4515"],"tags":{"footway":"sidewalk","highway":"footway"}},"w787":{"id":"w787","nodes":["n4518","n4519"],"tags":{"footway":"sidewalk","highway":"footway"}},"w788":{"id":"w788","nodes":["n4519","n4520","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w789":{"id":"w789","nodes":["n4515","n4521","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w79":{"id":"w79","nodes":["n362","n363","n334"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w790":{"id":"w790","nodes":["n4515","n4522","n4523"],"tags":{"footway":"crossing","highway":"footway"}},"w791":{"id":"w791","nodes":["n4523","n4524","n4519"],"tags":{"footway":"crossing","highway":"footway"}},"w792":{"id":"w792","nodes":["n4523","n4525"],"tags":{"footway":"sidewalk","highway":"footway"}},"w793":{"id":"w793","nodes":["n4525","n4526","n4527"],"tags":{"footway":"crossing","highway":"footway"}},"w794":{"id":"w794","nodes":["n4527","n4529"],"tags":{"footway":"sidewalk","highway":"footway"}},"w795":{"id":"w795","nodes":["n4529","n4530","n4518"],"tags":{"footway":"crossing","highway":"footway"}},"w796":{"id":"w796","nodes":["n4518","n4531"],"tags":{"footway":"sidewalk","highway":"footway"}},"w797":{"id":"w797","nodes":["n4531","n4532"],"tags":{"footway":"sidewalk","highway":"footway"}},"w798":{"id":"w798","nodes":["n4533","n4534"],"tags":{"footway":"sidewalk","highway":"footway"}},"w799":{"id":"w799","nodes":["n4518","n4538","n4539"],"tags":{"footway":"crossing","highway":"footway"}},"w8":{"id":"w8","nodes":["n46","n47","n145","n48","n49","n46"],"tags":{"amenity":"parking"}},"w80":{"id":"w80","nodes":["n334","n364","n365"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w800":{"id":"w800","nodes":["n4539","n4540","n4541"],"tags":{"footway":"crossing","highway":"footway"}},"w801":{"id":"w801","nodes":["n4541","n4542","n4529"],"tags":{"footway":"crossing","highway":"footway"}},"w802":{"id":"w802","nodes":["n4552","n4553"],"tags":{"footway":"sidewalk","highway":"footway"}},"w803":{"id":"w803","nodes":["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],"tags":{"building":"yes"}},"w804":{"id":"w804","nodes":["n4562","n4563"],"tags":{"barrier":"retaining_wall"}},"w805":{"id":"w805","nodes":["n4568","n4569","n4570","n4571","n4568"],"tags":{"building":"yes"}},"w806":{"id":"w806","nodes":["n3473","n4575","n4576","n4581","n4580","n3551"],"tags":{"highway":"residential","oneway":"yes"}},"w807":{"id":"w807","nodes":["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],"tags":{"leisure":"pitch","sport":"baseball"}},"w808":{"id":"w808","nodes":["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],"tags":{"highway":"service"}},"w809":{"id":"w809","nodes":["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],"tags":{"highway":"service"}},"w81":{"id":"w81","nodes":["n365","n366","n367"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w810":{"id":"w810","nodes":["n4639","n4640","n4641"],"tags":{"barrier":"fence"}},"w811":{"id":"w811","nodes":["n4649","n4650","n4651","n4652","n4649"],"tags":{"building":"yes"}},"w812":{"id":"w812","nodes":["n4654","n4655"],"tags":{"barrier":"fence"}},"w813":{"id":"w813","nodes":["n4656","n4657"],"tags":{"barrier":"fence"}},"w814":{"id":"w814","nodes":["n4669","n4670","n4671","n4672","n4669"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w820":{"id":"w820","nodes":["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],"tags":{"natural":"wood"}},"w821":{"id":"w821","nodes":["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],"tags":{"natural":"scrub"}},"w822":{"id":"w822","nodes":["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],"tags":{"natural":"wood"}},"w823":{"id":"w823","nodes":["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],"tags":{"natural":"wood"}},"w824":{"id":"w824","nodes":["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],"tags":{"landuse":"recreation_ground"}},"w825":{"id":"w825","nodes":["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],"tags":{"landuse":"recreation_ground"}},"w826":{"id":"w826","nodes":["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],"tags":{"landuse":"industrial"}},"w827":{"id":"w827","nodes":["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],"tags":{"landuse":"industrial"}},"w828":{"id":"w828","nodes":["n4843","n4844","n4845","n4846","n4843"],"tags":{"landuse":"farmland"}},"w829":{"id":"w829","nodes":["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],"tags":{"aeroway":"aerodrome","name":"Three Rivers Municipal Airport"}},"w83":{"id":"w83","nodes":["n371","n372","n373","n374","n371"],"tags":{"building":"yes"}},"w830":{"id":"w830","nodes":["n4855","n4854","n4857","n4853","n4960"],"tags":{"barrier":"fence"}},"w831":{"id":"w831","nodes":["n4860","n4859","n4858","n4852","n4851"],"tags":{"barrier":"fence"}},"w832":{"id":"w832","nodes":["n4866","n4878","n4869","n4867"],"tags":{"aeroway":"runway","ref":"5/23"}},"w833":{"id":"w833","nodes":["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],"tags":{"aeroway":"runway","ref":"9/27"}},"w834":{"id":"w834","nodes":["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],"tags":{"aeroway":"apron"}},"w835":{"id":"w835","nodes":["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],"tags":{"aeroway":"taxiway"}},"w836":{"id":"w836","nodes":["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],"tags":{"aeroway":"taxiway"}},"w837":{"id":"w837","nodes":["n4893","n4894"],"tags":{"aeroway":"taxiway"}},"w838":{"id":"w838","nodes":["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],"tags":{"aeroway":"taxiway"}},"w839":{"id":"w839","nodes":["n4907","n4908"],"tags":{"highway":"service"}},"w84":{"id":"w84","nodes":["n374","n375","n376","n377","n373","n374"],"tags":{"building":"yes"}},"w840":{"id":"w840","nodes":["n4909","n4907","n4910"],"tags":{"highway":"service"}},"w841":{"id":"w841","nodes":["n4911","n4912","n4913","n4914","n4911"],"tags":{"building":"yes"}},"w842":{"id":"w842","nodes":["n4915","n4916","n4917","n4918","n4915"],"tags":{"aeroway":"hangar","building":"yes"}},"w843":{"id":"w843","nodes":["n4919","n4920","n4921","n4922","n4919"],"tags":{"building":"yes"}},"w844":{"id":"w844","nodes":["n4923","n4924","n4925","n4926","n4923"],"tags":{"aeroway":"hangar","building":"yes"}},"w845":{"id":"w845","nodes":["n4927","n4928","n4929","n4930","n4927"],"tags":{"aeroway":"hangar","building":"yes"}},"w846":{"id":"w846","nodes":["n4931","n4932","n4933","n4934","n4931"],"tags":{"aeroway":"hangar","building":"yes"}},"w847":{"id":"w847","nodes":["n4935","n4936","n4937","n4938","n4935"],"tags":{"aeroway":"hangar","building":"yes"}},"w848":{"id":"w848","nodes":["n4939","n4940","n4941","n4942","n4939"],"tags":{"aeroway":"hangar","building":"yes"}},"w849":{"id":"w849","nodes":["n4943","n4944","n4945","n4946","n4943"],"tags":{"aeroway":"hangar","building":"yes"}},"w85":{"id":"w85","nodes":["n431","n432","n1038","n433","n434","n1040","n431"],"tags":{"building":"yes"}},"w850":{"id":"w850","nodes":["n4947","n4948","n4949","n4950","n4947"],"tags":{"aeroway":"hangar","building":"yes"}},"w851":{"id":"w851","nodes":["n4951","n4952","n4953","n4954","n4951"],"tags":{"aeroway":"hangar","building":"yes"}},"w852":{"id":"w852","nodes":["n4955","n4956","n4957","n4958","n4955"],"tags":{"aeroway":"hangar","building":"yes"}},"w853":{"id":"w853","nodes":["n4959","n4864","n4861","n4862","n4863"],"tags":{"barrier":"fence"}},"w854":{"id":"w854","nodes":["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],"tags":{"landuse":"farmland"}},"w855":{"id":"w855","nodes":["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],"tags":{"landuse":"farmland"}},"w856":{"id":"w856","nodes":["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],"tags":{"natural":"scrub"}},"w857":{"id":"w857","nodes":["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],"tags":{"landuse":"farmland"}},"w858":{"id":"w858","nodes":["n5001","n5003","n5004","n4999","n5000","n5001"],"tags":{"natural":"scrub"}},"w859":{"id":"w859","nodes":["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],"tags":{"landuse":"farmland"}},"w86":{"id":"w86","nodes":["n384","n385","n386","n387","n384"],"tags":{"building":"yes"}},"w860":{"id":"w860","nodes":["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],"tags":{"landuse":"industrial"}},"w87":{"id":"w87","nodes":["n387","n388","n389","n386","n387"],"tags":{"building":"yes"}},"w88":{"id":"w88","nodes":["n390","n391","n392","n393","n390"],"tags":{"building":"yes"}},"w89":{"id":"w89","nodes":["n394","n2895"],"tags":{"highway":"service"}},"w9":{"id":"w9","nodes":["n50","n51","n148","n52","n57","n891","n53","n50"],"tags":{"building":"yes"}},"w90":{"id":"w90","nodes":["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],"tags":{"building":"yes"}},"w91":{"id":"w91","nodes":["n418","n423","n419"],"tags":{"highway":"service"}},"w92":{"id":"w92","nodes":["n420","n421","n422","n423","n420"],"tags":{"amenity":"parking"}},"w93":{"id":"w93","nodes":["n2282","n1876"],"tags":{"name":"Rocky River","tunnel":"building_passage","waterway":"river"}},"w94":{"id":"w94","nodes":["n1876","n885","n1875","n2234"],"tags":{"name":"Rocky River","waterway":"river"}},"w95":{"id":"w95","nodes":["n425","n426","n427","n914","n428","n913","n425"],"tags":{"building":"yes"}},"w96":{"id":"w96","nodes":["n456","n620","n1034","n1035","n456"],"tags":{"building":"yes"}},"w97":{"id":"w97","nodes":["n435","n912","n451","n321"],"tags":{"highway":"footway"}},"w98":{"id":"w98","nodes":["n436","n319","n437","n438","n439","n440","n441","n476","n442"],"tags":{"highway":"service"}},"w99":{"id":"w99","nodes":["n443","n444","n445","n446","n447","n448","n449","n450","n443"],"tags":{"amenity":"parking"}},"n2934":{"id":"n2934","loc":[-85.617051,41.952263]},"n2935":{"id":"n2935","loc":[-85.61699,41.952276]},"n2937":{"id":"n2937","loc":[-85.616847,41.952262]},"n2938":{"id":"n2938","loc":[-85.616577,41.951956]},"n2939":{"id":"n2939","loc":[-85.61656,41.952044]},"n3348":{"id":"n3348","loc":[-85.61714,41.9522]},"n3349":{"id":"n3349","loc":[-85.616517,41.95212]},"n3350":{"id":"n3350","loc":[-85.616489,41.952033]},"n3351":{"id":"n3351","loc":[-85.616529,41.951907]},"n3354":{"id":"n3354","loc":[-85.616488,41.951994]}};
 
-                var followSelected = false;
-                if (Array.isArray(stack.selectedIDs)) {
-                    followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
-                    context.enter(
-                        modeSelect(context, stack.selectedIDs).follow(followSelected)
-                    );
-                }
-                if (!followSelected && stack.transform) {
-                    map.transformEase(stack.transform);
-                }
-            });
+// Tooltips and svg mask used to highlight certain features
+function uiCurtain() {
 
-        context.background()
-            .on('change.map', immediateRedraw);
+    var surface = d3_select(null),
+        tooltip = d3_select(null),
+        darkness = d3_select(null);
 
-        context.features()
-            .on('redraw.map', immediateRedraw);
+    function curtain(selection) {
+        surface = selection
+            .append('svg')
+            .attr('id', 'curtain')
+            .style('z-index', 1000)
+            .style('pointer-events', 'none')
+            .style('position', 'absolute')
+            .style('top', 0)
+            .style('left', 0);
 
-        drawLayers
-            .on('change.map', function() {
-                context.background().updateImagery();
-                immediateRedraw();
-            });
+        darkness = surface.append('path')
+            .attr('x', 0)
+            .attr('y', 0)
+            .attr('class', 'curtain-darkness');
 
-        selection
-            .on('dblclick.map', dblClick)
-            .call(zoom$$1)
-            .call(zoom$$1.transform, projection.transform());
+        d3_select(window).on('resize.curtain', resize);
 
-        supersurface = selection.append('div')
-            .attr('id', 'supersurface')
-            .call(utilSetTransform, 0, 0);
+        tooltip = selection.append('div')
+            .attr('class', 'tooltip')
+            .style('z-index', 1002);
 
-        // Need a wrapper div because Opera can't cope with an absolutely positioned
-        // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
-        wrapper = supersurface
+        tooltip
             .append('div')
-            .attr('class', 'layer layer-data');
+            .attr('class', 'tooltip-arrow');
 
-        map.surface = surface = wrapper
-            .call(drawLayers)
-            .selectAll('.surface')
-            .attr('id', 'surface');
+        tooltip
+            .append('div')
+            .attr('class', 'tooltip-inner');
 
-        surface
-            .call(drawLabels.observe)
-            .on('mousedown.zoom', function() {
-                if (event.button === 2) {
-                    event.stopPropagation();
-                }
-            }, true)
-            .on('mouseup.zoom', function() {
-                if (resetTransform()) immediateRedraw();
-            })
-            .on('mousemove.map', function() {
-                mousemove = event;
-            })
-            .on('mouseover.vertices', function() {
-                if (map.editable() && !transformed) {
-                    var hover = event.target.__data__;
-                    surface.selectAll('.data-layer-osm')
-                        .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
-                    dispatch$$1.call('drawn', this, {full: false});
-                }
-            })
-            .on('mouseout.vertices', function() {
-                if (map.editable() && !transformed) {
-                    var hover = event.relatedTarget && event.relatedTarget.__data__;
-                    surface.selectAll('.data-layer-osm')
-                        .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
-                    dispatch$$1.call('drawn', this, {full: false});
-                }
-            });
+        resize();
 
-        supersurface
-            .call(context.background());
 
-        context.on('enter.map', function() {
-            if (map.editable() && !transformed) {
-                var all = context.intersects(map.extent()),
-                    filter = utilFunctor(true),
-                    graph = context.graph();
+        function resize() {
+            surface
+                .attr('width', window.innerWidth)
+                .attr('height', window.innerHeight);
+            curtain.cut(darkness.datum());
+        }
+    }
 
-                all = context.features().filter(all, graph);
-                surface.selectAll('.data-layer-osm')
-                    .call(drawVertices, graph, all, filter, map.extent(), map.zoom())
-                    .call(drawMidpoints, graph, all, filter, map.trimmedExtent());
-                dispatch$$1.call('drawn', this, {full: false});
-            }
-        });
 
-        map.dimensions(utilGetDimensions(selection));
-    }
+    /**
+     * Reveal cuts the curtain to highlight the given box,
+     * and shows a tooltip with instructions next to the box.
+     *
+     * @param  {String|ClientRect} [box]   box used to cut the curtain
+     * @param  {String}    [text]          text for a tooltip
+     * @param  {Object}    [options]
+     * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
+     * @param  {integer}   [options.duration]        transition time in milliseconds
+     * @param  {string}    [options.buttonText]      if set, create a button with this text label
+     * @param  {function}  [options.buttonCallback]  if set, the callback for the button
+     * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
+     */
+    curtain.reveal = function(box, text, options) {
+        if (typeof box === 'string') {
+            box = d3_select(box).node();
+        }
+        if (box && box.getBoundingClientRect) {
+            box = copyBox(box.getBoundingClientRect());
+        }
 
+        options = options || {};
 
-    function zoomEventFilter() {
-        // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
-        // Intercept `mousedown` and check if there is an orphaned zoom gesture.
-        // This can happen if a previous `mousedown` occurred without a `mouseup`.
-        // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
-        // so that d3-zoom won't stop propagation of new `mousedown` events.
-        if (event.type === 'mousedown') {
-            var hasOrphan = false;
-            var listeners = window.__on;
-            for (var i = 0; i < listeners.length; i++) {
-                var listener = listeners[i];
-                if (listener.name === 'zoom' && listener.type === 'mouseup') {
-                    hasOrphan = true;
-                    break;
-                }
+        var tooltipBox;
+        if (options.tooltipBox) {
+            tooltipBox = options.tooltipBox;
+            if (typeof tooltipBox === 'string') {
+                tooltipBox = d3_select(tooltipBox).node();
             }
-            if (hasOrphan) {
-                var event$$1 = window.CustomEvent;
-                if (event$$1) {
-                    event$$1 = new event$$1('mouseup');
-                } else {
-                    event$$1 = window.document.createEvent('Event');
-                    event$$1.initEvent('mouseup', false, false);
-                }
-                // Event needs to be dispatched with an event.view property.
-                event$$1.view = window;
-                window.dispatchEvent(event$$1);
+            if (tooltipBox && tooltipBox.getBoundingClientRect) {
+                tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
             }
+        } else {
+            tooltipBox = box;
         }
 
-        return event.button !== 2;   // ignore right clicks
-    }
+        if (tooltipBox && text) {
+            // pseudo markdown bold text for the instruction section..
+            var parts = text.split('**');
+            var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
+            if (parts[1]) {
+                html += '<span class="instruction">' + parts[1] + '</span>';
+            }
 
+            html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
+            html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
 
-    function ztok(z) {
-        return 256 * Math.pow(2, z);
-    }
+            if (options.buttonText && options.buttonCallback) {
+                html += '<div class="button-section">' +
+                    '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
+            }
 
-    function ktoz(k) {
-        return Math.max(Math.log(k) / Math.LN2 - 8, 0);
-    }
+            var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
+            tooltip
+                .classed(classes, true)
+                .selectAll('.tooltip-inner')
+                .html(html);
 
-    function pxCenter() {
-        return [dimensions[0] / 2, dimensions[1] / 2];
-    }
+            if (options.buttonText && options.buttonCallback) {
+                var button = tooltip.selectAll('.button-section .button.action');
+                button
+                    .on('click', function() {
+                        event.preventDefault();
+                        options.buttonCallback();
+                    });
+            }
 
+            var tip = copyBox(tooltip.node().getBoundingClientRect()),
+                w = window.innerWidth,
+                h = window.innerHeight,
+                tooltipWidth = 200,
+                tooltipArrow = 5,
+                side, pos;
 
-    function drawVector(difference, extent) {
-        var graph = context.graph(),
-            features = context.features(),
-            all = context.intersects(map.extent()),
-            data, filter;
 
-        if (difference) {
-            var complete = difference.complete(map.extent());
-            data = compact(values$1(complete));
-            filter = function(d) { return d.id in complete; };
-            features.clear(data);
+            // hack: this will have bottom placement,
+            // so need to reserve extra space for the tooltip illustration.
+            if (options.tooltipClass === 'intro-mouse') {
+                tip.height += 80;
+            }
 
-        } else {
-            // force a full redraw if gatherStats detects that a feature
-            // should be auto-hidden (e.g. points or buildings)..
-            if (features.gatherStats(all, graph, dimensions)) {
-                extent = undefined;
+            // trim box dimensions to just the portion that fits in the window..
+            if (tooltipBox.top + tooltipBox.height > h) {
+                tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
+            }
+            if (tooltipBox.left + tooltipBox.width > w) {
+                tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
             }
 
-            if (extent) {
-                data = context.intersects(map.extent().intersection(extent));
-                var set$$1 = set$2(map$4(data, 'id'));
-                filter = function(d) { return set$$1.has(d.id); };
+            // determine tooltip placement..
 
-            } else {
-                data = all;
-                filter = utilFunctor(true);
-            }
-        }
+            if (tooltipBox.top + tooltipBox.height < 100) {
+                // tooltip below box..
+                side = 'bottom';
+                pos = [
+                    tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
+                    tooltipBox.top + tooltipBox.height
+                ];
 
-        data = features.filter(data, graph);
+            } else if (tooltipBox.top > h - 140) {
+                // tooltip above box..
+                side = 'top';
+                pos = [
+                    tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
+                    tooltipBox.top - tip.height
+                ];
 
-        surface.selectAll('.data-layer-osm')
-            .call(drawVertices, graph, data, filter, map.extent(), map.zoom())
-            .call(drawLines, graph, data, filter)
-            .call(drawAreas, graph, data, filter)
-            .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
-            .call(drawLabels, graph, data, filter, dimensions, !difference && !extent)
-            .call(drawPoints, graph, data, filter);
+            } else {
+                // tooltip to the side of the tooltipBox..
+                var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
 
-        dispatch$$1.call('drawn', this, {full: true});
-    }
+                if (textDirection === 'rtl') {
+                    if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
+                        side = 'right';
+                        pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
 
+                    } else {
+                        side = 'left';
+                        pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+                    }
 
-    function editOff() {
-        context.features().resetStats();
-        surface.selectAll('.layer-osm *').remove();
-        context.enter(modeBrowse(context));
-        dispatch$$1.call('drawn', this, {full: true});
-    }
+                } else {
+                    if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
+                        side = 'left';
+                        pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
+                    }
+                    else {
+                        side = 'right';
+                        pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
+                    }
+                }
+            }
 
+            if (options.duration !== 0 || !tooltip.classed(side)) {
+                tooltip.call(uiToggle(true));
+            }
 
-    function dblClick() {
-        if (!dblclickEnabled) {
-            event.preventDefault();
-            event.stopImmediatePropagation();
-        }
-    }
+            tooltip
+                .style('top', pos[1] + 'px')
+                .style('left', pos[0] + 'px')
+                .attr('class', classes + ' ' + side);
 
 
-    function zoomPan(manualEvent) {
-        var event$$1 = (manualEvent || event),
-            source = event$$1.sourceEvent,
-            eventTransform = event$$1.transform;
+            // shift tooltip-inner if it is very close to the top or bottom edge
+            // (doesn't affect the placement of the tooltip-arrow)
+            var shiftY = 0;
+            if (side === 'left' || side === 'right') {
+                if (pos[1] < 60) {
+                    shiftY = 60 - pos[1];
+                }
+                else if (pos[1] + tip.height > h - 100) {
+                    shiftY = h - pos[1] - tip.height - 100;
+                }
+            }
+            tooltip.selectAll('.tooltip-inner')
+                .style('top', shiftY + 'px');
 
-        if (transformStart.x === eventTransform.x &&
-            transformStart.y === eventTransform.y &&
-            transformStart.k === eventTransform.k) {
-            return;  // no change
+        } else {
+            tooltip
+                .classed('in', false)
+                .call(uiToggle(false));
         }
 
-        // Normalize mousewheel - #3029
-        // If wheel delta is provided in LINE units, recalculate it in PIXEL units
-        // We are essentially redoing the calculations that occur here:
-        //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
-        // See this for more info:
-        //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
-        if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
-            // pick sensible scroll amount if user scrolling fast or slow..
-            var lines = Math.abs(source.deltaY),
-                scroll = lines > 2 ? 40 : lines * 10;
+        curtain.cut(box, options.duration);
 
-            var t0 = transformed ? transformLast : transformStart,
-                p0 = mouse(source),
-                p1 = t0.invert(p0),
-                k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500),
-                x2 = p0[0] - p1[0] * k2,
-                y2 = p0[1] - p1[1] * k2;
+        return tooltip;
+    };
 
-            eventTransform = identity$7.translate(x2,y2).scale(k2);
-            _selection.node().__zoom = eventTransform;
-        }
 
-        if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
-            surface.interrupt();
-            uiFlash().text(t('cannot_zoom'));
-            setZoom(context.minEditableZoom(), true);
-            scheduleRedraw();
-            dispatch$$1.call('move', this, map);
-            return;
+    curtain.cut = function(datum, duration) {
+        darkness.datum(datum)
+            .interrupt();
+
+        var selection;
+        if (duration === 0) {
+            selection = darkness;
+        } else {
+            selection = darkness
+                .transition()
+                .duration(duration || 600)
+                .ease(linear$1);
         }
 
-        projection.transform(eventTransform);
+        selection
+            .attr('d', function(d) {
+                var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
+                    window.innerWidth + ',' + window.innerHeight + 'L' +
+                    window.innerWidth + ',0 Z';
 
-        var scale = eventTransform.k / transformStart.k,
-            tX = (eventTransform.x / scale - transformStart.x) * scale,
-            tY = (eventTransform.y / scale - transformStart.y) * scale;
+                if (!d) return string;
+                return string + 'M' +
+                    d.left + ',' + d.top + 'L' +
+                    d.left + ',' + (d.top + d.height) + 'L' +
+                    (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
+                    (d.left + d.width) + ',' + (d.top) + 'Z';
 
-        if (context.inIntro()) {
-            curtainProjection.transform({
-                x: eventTransform.x - tX,
-                y: eventTransform.y - tY,
-                k: eventTransform.k
             });
-        }
-
-        mousemove = event$$1;
-        transformed = true;
-        transformLast = eventTransform;
-        utilSetTransform(supersurface, tX, tY, scale);
-        scheduleRedraw();
+    };
 
-        dispatch$$1.call('move', this, map);
-    }
 
+    curtain.remove = function() {
+        surface.remove();
+        tooltip.remove();
+        d3_select(window).on('resize.curtain', null);
+    };
 
-    function resetTransform() {
-        if (!transformed) return false;
 
-        // deprecation warning - Radial Menu to be removed in iD v3
-        surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
-        utilSetTransform(supersurface, 0, 0);
-        transformed = false;
-        if (context.inIntro()) {
-            curtainProjection.transform(projection.transform());
-        }
-        return true;
+    // ClientRects are immutable, so copy them to an object,
+    // in case we need to trim the height/width.
+    function copyBox(src) {
+        return {
+            top: src.top,
+            right: src.right,
+            bottom: src.bottom,
+            left: src.left,
+            width: src.width,
+            height: src.height
+        };
     }
 
 
-    function redraw(difference, extent) {
-        if (surface.empty() || !redrawEnabled) return;
-
-        // If we are in the middle of a zoom/pan, we can't do differenced redraws.
-        // It would result in artifacts where differenced entities are redrawn with
-        // one transform and unchanged entities with another.
-        if (resetTransform()) {
-            difference = extent = undefined;
-        }
-
-        var z = String(~~map.zoom());
-        if (surface.attr('data-zoom') !== z) {
-            surface.attr('data-zoom', z)
-                .classed('low-zoom', z <= 16);
-        }
-
-        if (!difference) {
-            supersurface.call(context.background());
-        }
-
-        wrapper
-            .call(drawLayers);
-
-        // OSM
-        if (map.editable()) {
-            context.loadTiles(projection, dimensions);
-            drawVector(difference, extent);
-        } else {
-            editOff();
-        }
-
-        transformStart = projection.transform();
-
-        return map;
-    }
-
+    return curtain;
+}
 
+function uiIntroWelcome(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        listener = clickListener();
 
-    var immediateRedraw = function(difference, extent) {
-        if (!difference && !extent) cancelPendingRedraw();
-        redraw(difference, extent);
+    var chapter = {
+        title: 'intro.welcome.title'
     };
 
 
-    function pointLocation(p) {
-        var translate = projection.translate(),
-            scale = projection.scale() * 2 * Math.PI;
-        return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
+    function welcome() {
+        context.map().centerZoom([-85.63591, 41.94285], 19);
+        reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.welcome'),
+            { buttonText: t('intro.ok'), buttonCallback: practice }
+        );
     }
 
+    function practice() {
+        reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.practice'),
+            { buttonText: t('intro.ok'), buttonCallback: words }
+        );
+    }
 
-    function locationPoint(l) {
-        var translate = projection.translate(),
-            scale = projection.scale() * 2 * Math.PI;
-        return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
+    function words() {
+        reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.words'),
+            { buttonText: t('intro.ok'), buttonCallback: mouse }
+        );
     }
 
 
-    map.mouse = function() {
-        var event$$1 = mousemove || event;
-        if (event$$1) {
-            var s;
-            while ((s = event$$1.sourceEvent)) { event$$1 = s; }
-            return mouse(event$$1);
-        }
-        return null;
-    };
+    function mouse() {
+        reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.mouse'),
+            { buttonText: t('intro.ok'), buttonCallback: leftClick }
+        );
+    }
 
 
-    map.mouseCoordinates = function() {
-        return projection.invert(map.mouse());
-    };
+    function leftClick() {
+        var counter = 0,
+            times = 5;
 
+        var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.leftclick', { num: times }),
+            { tooltipClass: 'intro-mouse' }
+        );
 
-    map.dblclickEnable = function(_) {
-        if (!arguments.length) return dblclickEnabled;
-        dblclickEnabled = _;
-        return map;
-    };
+        tooltip.selectAll('.tooltip-inner')
+            .insert('svg', 'span')
+            .attr('class', 'tooltip-illustration')
+            .append('use')
+            .attr('xlink:href', '#walkthrough-mouse');
 
+        tooltip
+            .append('div')
+            .attr('class', 'counter');
 
-    map.redrawEnable = function(_) {
-        if (!arguments.length) return redrawEnabled;
-        redrawEnabled = _;
-        return map;
-    };
+        tooltip.call(listener);
 
+        listener.on('click', function(which) {
+            if (which === 'left') {
+                d3_select('.curtain-tooltip.intro-mouse .counter')
+                    .text(String(++counter));
 
-    function setTransform(t2, duration, force) {
-        var t$$1 = projection.transform();
-        if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
-            return false;
-        }
+                if (counter === times) {
+                    window.setTimeout(function() { continueTo(rightClick); }, 1000);
+                }
+            }
+        });
 
-        if (duration) {
-            _selection
-                .transition()
-                .duration(duration)
-                .on('start', function() { map.startEase(); })
-                .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
-        } else {
-            projection.transform(t2);
-            transformStart = t2;
-            _selection.call(zoom$$1.transform, transformStart);
+        function continueTo(nextStep) {
+            listener.on('click', null);
+            tooltip.call(listener.off);
+            tooltip.select('.counter').remove();
+            nextStep();
         }
     }
 
 
-    function setZoom(z2, force, duration) {
-        if (z2 === map.zoom() && !force) {
-            return false;
-        }
-
-        var k = projection.scale(),
-            k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
-            center = pxCenter(),
-            l = pointLocation(center);
+    function rightClick() {
+        var counter = 0,
+            times = 5;
 
-        projection.scale(k2);
+        var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
+            t('intro.welcome.rightclick', { num: times }),
+            { tooltipClass: 'intro-mouse' }
+        );
 
-        var t$$1 = projection.translate();
-        l = locationPoint(l);
+        tooltip.selectAll('.tooltip-inner')
+            .insert('svg', 'span')
+            .attr('class', 'tooltip-illustration')
+            .append('use')
+            .attr('xlink:href', '#walkthrough-mouse');
 
-        t$$1[0] += center[0] - l[0];
-        t$$1[1] += center[1] - l[1];
+        tooltip
+            .append('div')
+            .attr('class', 'counter');
 
-        if (duration) {
-            projection.scale(k);  // reset scale
-            _selection
-                .transition()
-                .duration(duration)
-                .on('start', function() { map.startEase(); })
-                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
-        } else {
-            projection.translate(t$$1);
-            transformStart = projection.transform();
-            _selection.call(zoom$$1.transform, transformStart);
-        }
+        tooltip.call(listener);
 
-        return true;
-    }
+        listener.on('click', function(which) {
+            if (which === 'right') {
+                d3_select('.curtain-tooltip.intro-mouse .counter')
+                    .text(String(++counter));
 
+                if (counter === times) {
+                    window.setTimeout(function() { continueTo(chapters); }, 1000);
+                }
+            }
+        });
 
-    function setCenter(loc2, duration) {
-        var c = map.center();
-        if (loc2[0] === c[0] && loc2[1] === c[1]) {
-            return false;
+        function continueTo(nextStep) {
+            listener.on('click', null);
+            tooltip.call(listener.off);
+            tooltip.select('.counter').remove();
+            nextStep();
         }
+    }
 
-        var t$$1 = projection.translate(),
-            k = projection.scale(),
-            pxC = pxCenter(),
-            ll = projection(loc2);
-
-        t$$1[0] = t$$1[0] - ll[0] + pxC[0];
-        t$$1[1] = t$$1[1] - ll[1] + pxC[1];
-
-        if (duration) {
-            _selection
-                .transition()
-                .duration(duration)
-                .on('start', function() { map.startEase(); })
-                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
-        } else {
-            projection.translate(t$$1);
-            transformStart = projection.transform();
-            _selection.call(zoom$$1.transform, transformStart);
-        }
 
-        return true;
+    function chapters() {
+        dispatch$$1.call('done');
+        reveal('.intro-nav-wrap .chapter-navigation',
+            t('intro.welcome.chapters', { next: t('intro.navigation.title') })
+        );
     }
 
 
-    map.pan = function(delta, duration) {
-        var t$$1 = projection.translate(),
-            k = projection.scale();
-
-        t$$1[0] += delta[0];
-        t$$1[1] += delta[1];
+    chapter.enter = function() {
+        welcome();
+    };
 
-        if (duration) {
-            _selection
-                .transition()
-                .duration(duration)
-                .on('start', function() { map.startEase(); })
-                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
-        } else {
-            projection.translate(t$$1);
-            transformStart = projection.transform();
-            _selection.call(zoom$$1.transform, transformStart);
-            dispatch$$1.call('move', this, map);
-            immediateRedraw();
-        }
 
-        return map;
+    chapter.exit = function() {
+        listener.off();
+        d3_select('.curtain-tooltip.intro-mouse')
+            .selectAll('.counter')
+            .remove();
     };
 
 
-    map.dimensions = function(_) {
-        if (!arguments.length) return dimensions;
-        var center = map.center();
-        dimensions = _;
-        drawLayers.dimensions(dimensions);
-        context.background().dimensions(dimensions);
-        projection.clipExtent([[0, 0], dimensions]);
-        mouse = utilFastMouse(supersurface.node());
-        setCenter(center);
-
-        scheduleRedraw();
-        return map;
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
     };
 
 
-    function zoomIn(delta) {
-        setZoom(~~map.zoom() + delta, true, 250);
-    }
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-    function zoomOut(delta) {
-        setZoom(~~map.zoom() - delta, true, 250);
-    }
 
-    map.zoomIn = function() { zoomIn(1); };
-    map.zoomInFurther = function() { zoomIn(4); };
 
-    map.zoomOut = function() { zoomOut(1); };
-    map.zoomOutFurther = function() { zoomOut(4); };
+function clickListener() {
+    var dispatch$$1 = dispatch('click'),
+        minTime = 120,
+        tooltip = d3_select(null),
+        down = {};
 
+    // `down` keeps track of which buttons/keys are down.
+    // Setting a property in `down` happens immediately.
+    // Unsetting a property in `down` is delayed because
+    //   on Windows a contextmenu event happens after keyup/mouseup
 
-    map.center = function(loc2) {
-        if (!arguments.length) {
-            return projection.invert(pxCenter());
+    function keydown() {
+        if (event.keyCode === 93)  {   // context menu
+            event.preventDefault();
+            event.stopPropagation();
+            down.menu = event.timeStamp;
+            tooltip.classed('rightclick', true);
         }
+    }
 
-        if (setCenter(loc2)) {
-            dispatch$$1.call('move', this, map);
-        }
 
-        scheduleRedraw();
-        return map;
-    };
+    function keyup() {
+        if (event.keyCode === 93)  {   // context menu
+            event.preventDefault();
+            event.stopPropagation();
+            var endTime = event.timeStamp,
+                startTime = down.menu || endTime,
+                delay = (endTime - startTime < minTime) ? minTime : 0;
 
+            window.setTimeout(function() {
+                tooltip.classed('rightclick', false);
+                down.menu = undefined;  // delayed, for Windows
+            }, delay);
 
-    map.zoom = function(z2) {
-        if (!arguments.length) {
-            return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
+            dispatch$$1.call('click', this, 'right');
         }
+    }
 
-        if (z2 < minzoom) {
-            surface.interrupt();
-            uiFlash().text(t('cannot_zoom'));
-            z2 = context.minEditableZoom();
-        }
 
-        if (setZoom(z2)) {
-            dispatch$$1.call('move', this, map);
+    function mousedown() {
+        var button = event.button;
+        if (button === 0 && !event.ctrlKey) {
+            tooltip.classed('leftclick', true);
+        } else if (button === 2) {
+            tooltip.classed('rightclick', true);
         }
+        down[button] = event.timeStamp;
+    }
 
-        scheduleRedraw();
-        return map;
-    };
 
+    function mouseup() {
+        var button = event.button,
+            endTime = event.timeStamp,
+            startTime = down[button] || endTime,
+            delay = (endTime - startTime < minTime) ? minTime : 0;
 
-    map.zoomTo = function(entity, zoomLimits) {
-        var extent = entity.extent(context.graph());
-        if (!isFinite(extent.area())) return;
+        if (button === 0 && !event.ctrlKey) {
+            window.setTimeout(function() {
+                tooltip.classed('leftclick', false);
+                down[button] = undefined;  // delayed, for Windows
+            }, delay);
 
-        var z2 = map.trimmedExtentZoom(extent);
-        zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
-        map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
-    };
+            dispatch$$1.call('click', this, 'left');
 
+        } else if (button === 2) {
+            window.setTimeout(function() {
+                tooltip.classed('rightclick', false);
+                down[button] = undefined;  // delayed, for Windows
+            }, delay);
 
-    map.centerZoom = function(loc2, z2) {
-        var centered = setCenter(loc2),
-            zoomed   = setZoom(z2);
+            dispatch$$1.call('click', this, 'right');
 
-        if (centered || zoomed) {
-            dispatch$$1.call('move', this, map);
+        } else {
+            window.setTimeout(function() {
+                down[button] = undefined;  // delayed, for Windows
+            }, delay);
         }
+    }
 
-        scheduleRedraw();
-        return map;
-    };
 
+    function contextmenu() {
+        event.preventDefault();
+        event.stopPropagation();
+        if (!down[2] && !down.menu) {
+            tooltip.classed('rightclick', true);
+            window.setTimeout(function() {
+                tooltip.classed('rightclick', false);
+            }, minTime);
+            dispatch$$1.call('click', this, 'right');
+        }
+    }
 
-    map.centerEase = function(loc2, duration) {
-        duration = duration || 250;
-        setCenter(loc2, duration);
-        return map;
-    };
 
+    var behavior = function(selection) {
+        tooltip = selection;
+        down = {};
 
-    map.zoomEase = function(z2, duration) {
-        duration = duration || 250;
-        setZoom(z2, false, duration);
-        return map;
+        d3_select(window)
+            .on('keydown.intro', keydown)
+            .on('keyup.intro', keyup)
+            .on('mousedown.intro', mousedown)
+            .on('mouseup.intro', mouseup)
+            .on('contextmenu.intro', contextmenu);
     };
 
 
-    map.transformEase = function(t2, duration) {
-        duration = duration || 250;
-        setTransform(t2, duration, false);
-        return map;
-    };
-
+    behavior.off = function() {
+        d3_select(window)
+            .on('keydown.intro', null)
+            .on('keyup.intro', null)
+            .on('mousedown.intro', null)
+            .on('mouseup.intro', null)
+            .on('contextmenu.intro', null);
 
-    map.startEase = function() {
-        utilBindOnce(surface, 'mousedown.ease', function() {
-            map.cancelEase();
-        });
-        return map;
+        tooltip
+            .classed('leftclick', false)
+            .classed('rightclick', false);
     };
 
+    return utilRebind(behavior, dispatch$$1, 'on');
+}
 
-    map.cancelEase = function() {
-        _selection.interrupt();
-        return map;
-    };
+function uiIntroNavigation(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        timeouts = [],
+        hallId = 'n2061',
+        townHall = [-85.63591, 41.94285],
+        springStreetId = 'w397',
+        springStreetEndId = 'n1834',
+        springStreet = [-85.63582, 41.94255],
+        onewayField = context.presets().field('oneway'),
+        maxspeedField = context.presets().field('maxspeed');
 
 
-    map.extent = function(_) {
-        if (!arguments.length) {
-            return new geoExtent(projection.invert([0, dimensions[1]]),
-                                 projection.invert([dimensions[0], 0]));
-        } else {
-            var extent = geoExtent(_);
-            map.centerZoom(extent.center(), map.extentZoom(extent));
-        }
+    var chapter = {
+        title: 'intro.navigation.title'
     };
 
 
-    map.trimmedExtent = function(_) {
-        if (!arguments.length) {
-            var headerY = 60, footerY = 30, pad = 10;
-            return new geoExtent(projection.invert([pad, dimensions[1] - footerY - pad]),
-                                 projection.invert([dimensions[0] - pad, headerY + pad]));
-        } else {
-            var extent = geoExtent(_);
-            map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
-        }
-    };
+    function timeout(f, t$$1) {
+        timeouts.push(window.setTimeout(f, t$$1));
+    }
 
 
-    function calcZoom(extent, dim) {
-        var tl = projection([extent[0][0], extent[1][1]]),
-            br = projection([extent[1][0], extent[0][1]]);
+    function eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
+    }
 
-        // Calculate maximum zoom that fits extent
-        var hFactor = (br[0] - tl[0]) / dim[0],
-            vFactor = (br[1] - tl[1]) / dim[1],
-            hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
-            vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
-            newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
 
-        return newZoom;
+    function isTownHallSelected() {
+        var ids = context.selectedIDs();
+        return ids.length === 1 && ids[0] === hallId;
     }
 
 
-    map.extentZoom = function(_) {
-        return calcZoom(geoExtent(_), dimensions);
-    };
+    function dragMap() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
 
+        var msec = transitionTime(townHall, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(townHall, msec);
 
-    map.trimmedExtentZoom = function(_) {
-        var trimY = 120, trimX = 40,
-            trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
-        return calcZoom(geoExtent(_), trimmed);
-    };
+        timeout(function() {
+            var centerStart = context.map().center();
 
+            reveal('#surface', t('intro.navigation.drag'));
+            context.map().on('drawn.intro', function() {
+                reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
+            });
 
-    map.editable = function() {
-        var osmLayer = surface.selectAll('.data-layer-osm');
-        if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
-
-        return map.zoom() >= context.minEditableZoom();
-    };
+            context.map().on('move.intro', function() {
+                var centerNow = context.map().center();
+                if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
+                    context.map().on('move.intro', null);
+                    timeout(function() { continueTo(zoomMap); }, 3000);
+                }
+            });
 
+        }, msec + 100);
 
-    map.minzoom = function(_) {
-        if (!arguments.length) return minzoom;
-        minzoom = _;
-        return map;
-    };
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
+    }
 
 
-    map.layers = drawLayers;
+    function zoomMap() {
+        var zoomStart = context.map().zoom();
 
+        reveal('#surface',
+            t('intro.navigation.zoom', {
+                plus: icon('#icon-plus', 'pre-text'),
+                minus: icon('#icon-minus', 'pre-text')
+            })
+        );
 
-    return utilRebind(map, dispatch$$1, 'on');
-}
+        context.map().on('drawn.intro', function() {
+            reveal('#surface',
+                t('intro.navigation.zoom', {
+                    plus: icon('#icon-plus', 'pre-text'),
+                    minus: icon('#icon-minus', 'pre-text')
+                }), { duration: 0 }
+            );
+        });
 
-var TAU = 2 * Math.PI;
-function ztok(z) { return 256 * Math.pow(2, z) / TAU; }
-function ktoz(k) { return Math.log(k * TAU) / Math.LN2 - 8; }
-function vecSub(a, b) { return [ a[0] - b[0], a[1] - b[1] ]; }
-function vecScale(a, b) { return [ a[0] * b, a[1] * b ]; }
+        context.map().on('move.intro', function() {
+            if (context.map().zoom() !== zoomStart) {
+                context.map().on('move.intro', null);
+                timeout(function() { continueTo(features); }, 3000);
+            }
+        });
 
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
+    }
 
-function uiMapInMap(context) {
 
+    function features() {
+        var onClick = function() { continueTo(pointsLinesAreas); };
 
-    function map_in_map(selection) {
-        var backgroundLayer = rendererTileLayer(context),
-            overlayLayers = {},
-            projection = geoRawMercator(),
-            gpxLayer = svgGpx(projection, context).showLabels(false),
-            debugLayer = svgDebug(projection, context),
-            zoom$$1 = d3_zoom()
-                .scaleExtent([ztok(0.5), ztok(24)])
-                .on('start', zoomStarted)
-                .on('zoom', zoomed)
-                .on('end', zoomEnded),
-            isTransformed = false,
-            isHidden = true,
-            skipEvents = false,
-            gesture = null,
-            zDiff = 6,    // by default, minimap renders at (main zoom - 6)
-            wrap = d3_select(null),
-            tiles = d3_select(null),
-            viewport = d3_select(null),
-            tStart,  // transform at start of gesture
-            tCurr,   // transform at most recent event
-            timeoutId;
+        reveal('#surface', t('intro.navigation.features'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
+        context.map().on('drawn.intro', function() {
+            reveal('#surface', t('intro.navigation.features'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+            );
+        });
 
-        function zoomStarted() {
-            if (skipEvents) return;
-            tStart = tCurr = projection.transform();
-            gesture = null;
+        function continueTo(nextStep) {
+            context.map().on('drawn.intro', null);
+            nextStep();
         }
+    }
 
+    function pointsLinesAreas() {
+        var onClick = function() { continueTo(nodesWays); };
 
-        function zoomed() {
-            if (skipEvents) return;
-
-            var x = event.transform.x,
-                y = event.transform.y,
-                k = event.transform.k,
-                isZooming = (k !== tStart.k),
-                isPanning = (x !== tStart.x || y !== tStart.y);
-
-            if (!isZooming && !isPanning) {
-                return;  // no change
-            }
-
-            // lock in either zooming or panning, don't allow both in minimap.
-            if (!gesture) {
-                gesture = isZooming ? 'zoom' : 'pan';
-            }
+        reveal('#surface', t('intro.navigation.points_lines_areas'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-            var tMini = projection.transform(),
-                tX, tY, scale;
+        context.map().on('drawn.intro', function() {
+            reveal('#surface', t('intro.navigation.points_lines_areas'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+            );
+        });
 
-            if (gesture === 'zoom') {
-                var dMini = utilGetDimensions(wrap),
-                    cMini = vecScale(dMini, 0.5);
-                scale = k / tMini.k;
-                tX = (cMini[0] / scale - cMini[0]) * scale;
-                tY = (cMini[1] / scale - cMini[1]) * scale;
-            } else {
-                k = tMini.k;
-                scale = 1;
-                tX = x - tMini.x;
-                tY = y - tMini.y;
-            }
+        function continueTo(nextStep) {
+            context.map().on('drawn.intro', null);
+            nextStep();
+        }
+    }
 
-            utilSetTransform(tiles, tX, tY, scale);
-            utilSetTransform(viewport, 0, 0, scale);
-            isTransformed = true;
-            tCurr = identity$7.translate(x, y).scale(k);
+    function nodesWays() {
+        var onClick = function() { continueTo(clickTownHall); };
 
-            var zMain = ktoz(context.projection.scale()),
-                zMini = ktoz(k);
+        reveal('#surface', t('intro.navigation.nodes_ways'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-            zDiff = zMain - zMini;
+        context.map().on('drawn.intro', function() {
+            reveal('#surface', t('intro.navigation.nodes_ways'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+            );
+        });
 
-            queueRedraw();
+        function continueTo(nextStep) {
+            context.map().on('drawn.intro', null);
+            nextStep();
         }
+    }
 
+    function clickTownHall() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
 
-        function zoomEnded() {
-            if (skipEvents) return;
-            if (gesture !== 'pan') return;
-
-            updateProjection();
-            gesture = null;
-            var dMini = utilGetDimensions(wrap),
-                cMini = vecScale(dMini, 0.5);
-            context.map().center(projection.invert(cMini));   // recenter main map..
-        }
+        reveal(null, null, { duration: 0 });
+        context.map().zoomEase(19, 500);
 
+        timeout(function() {
+            var entity = context.hasEntity(hallId);
+            if (!entity) return;
+            context.map().centerEase(entity.loc, 500);
 
-        function updateProjection() {
-            var loc = context.map().center(),
-                dMini = utilGetDimensions(wrap),
-                cMini = vecScale(dMini, 0.5),
-                tMain = context.projection.transform(),
-                zMain = ktoz(tMain.k),
-                zMini = Math.max(zMain - zDiff, 0.5),
-                kMini = ztok(zMini);
+            timeout(function() {
+                var entity = context.hasEntity(hallId);
+                if (!entity) return;
+                var box = pointBox(entity.loc, context);
+                reveal(box, t('intro.navigation.click_townhall'));
 
-            projection
-                .translate([tMain.x, tMain.y])
-                .scale(kMini);
+                context.map().on('move.intro drawn.intro', function() {
+                    var entity = context.hasEntity(hallId);
+                    if (!entity) return;
+                    var box = pointBox(entity.loc, context);
+                    reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
+                });
 
-            var point = projection(loc),
-                mouse = (gesture === 'pan') ? vecSub([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0],
-                xMini = cMini[0] - point[0] + tMain.x + mouse[0],
-                yMini = cMini[1] - point[1] + tMain.y + mouse[1];
+                context.on('enter.intro', function() {
+                    if (isTownHallSelected()) continueTo(selectedTownHall);
+                });
 
-            projection
-                .translate([xMini, yMini])
-                .clipExtent([[0, 0], dMini]);
+            }, 550);  // after centerEase
 
-            tCurr = projection.transform();
+        }, 550); // after zoomEase
 
-            if (isTransformed) {
-                utilSetTransform(tiles, 0, 0);
-                utilSetTransform(viewport, 0, 0);
-                isTransformed = false;
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(hallId)) {
+                continueTo(clickTownHall);
             }
+        });
 
-            zoom$$1
-                .scaleExtent([ztok(0.5), ztok(zMain - 3)]);
-
-            skipEvents = true;
-            wrap.call(zoom$$1.transform, tCurr);
-            skipEvents = false;
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
         }
+    }
 
 
-        function redraw() {
-            clearTimeout(timeoutId);
-            if (isHidden) return;
-
-            updateProjection();
-
-            var dMini = utilGetDimensions(wrap),
-                zMini = ktoz(projection.scale());
-
-            // setup tile container
-            tiles = wrap
-                .selectAll('.map-in-map-tiles')
-                .data([0]);
-
-            tiles = tiles.enter()
-                .append('div')
-                .attr('class', 'map-in-map-tiles')
-                .merge(tiles);
+    function selectedTownHall() {
+        if (!isTownHallSelected()) return clickTownHall();
 
-            // redraw background
-            backgroundLayer
-                .source(context.background().baseLayerSource())
-                .projection(projection)
-                .dimensions(dMini);
+        var entity = context.hasEntity(hallId);
+        if (!entity) return clickTownHall();
 
-            var background = tiles
-                .selectAll('.map-in-map-background')
-                .data([0]);
+        var box = pointBox(entity.loc, context);
+        var onClick = function() { continueTo(editorTownHall); };
 
-            background.enter()
-                .append('div')
-                .attr('class', 'map-in-map-background')
-                .merge(background)
-                .call(backgroundLayer);
+        reveal(box, t('intro.navigation.selected_townhall'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
+        context.map().on('move.intro drawn.intro', function() {
+            var entity = context.hasEntity(hallId);
+            if (!entity) return;
+            var box = pointBox(entity.loc, context);
+            reveal(box, t('intro.navigation.selected_townhall'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+            );
+        });
 
-            // redraw overlay
-            var overlaySources = context.background().overlayLayerSources();
-            var activeOverlayLayers = [];
-            for (var i = 0; i < overlaySources.length; i++) {
-                if (overlaySources[i].validZoom(zMini)) {
-                    if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
-                    activeOverlayLayers.push(overlayLayers[i]
-                        .source(overlaySources[i])
-                        .projection(projection)
-                        .dimensions(dMini));
-                }
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(hallId)) {
+                continueTo(clickTownHall);
             }
+        });
 
-            var overlay = tiles
-                .selectAll('.map-in-map-overlay')
-                .data([0]);
-
-            overlay = overlay.enter()
-                .append('div')
-                .attr('class', 'map-in-map-overlay')
-                .merge(overlay);
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
 
-            var overlays = overlay
-                .selectAll('div')
-                .data(activeOverlayLayers, function(d) { return d.source().name(); });
+    function editorTownHall() {
+        if (!isTownHallSelected()) return clickTownHall();
 
-            overlays.exit()
-                .remove();
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-            overlays = overlays.enter()
-                .append('div')
-                .merge(overlays)
-                .each(function(layer) { d3_select(this).call(layer); });
+        var onClick = function() { continueTo(presetTownHall); };
 
+        reveal('.entity-editor-pane',
+            t('intro.navigation.editor_townhall'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-            var dataLayers = tiles
-                .selectAll('.map-in-map-data')
-                .data([0]);
+        context.on('exit.intro', function() {
+            continueTo(clickTownHall);
+        });
 
-            dataLayers.exit()
-                .remove();
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(hallId)) {
+                continueTo(clickTownHall);
+            }
+        });
 
-            dataLayers = dataLayers.enter()
-                .append('svg')
-                .attr('class', 'map-in-map-data')
-                .merge(dataLayers)
-                .call(gpxLayer)
-                .call(debugLayer);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            nextStep();
+        }
+    }
 
 
-            // redraw viewport bounding box
-            if (gesture !== 'pan') {
-                var getPath = d3_geoPath(projection),
-                    bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
+    function presetTownHall() {
+        if (!isTownHallSelected()) return clickTownHall();
 
-                viewport = wrap.selectAll('.map-in-map-viewport')
-                    .data([0]);
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-                viewport = viewport.enter()
-                    .append('svg')
-                    .attr('class', 'map-in-map-viewport')
-                    .merge(viewport);
+        // preset match, in case the user happened to change it.
+        var entity = context.entity(context.selectedIDs()[0]);
+        var preset = context.presets().match(entity, context.graph());
 
+        var onClick = function() { continueTo(fieldsTownHall); };
 
-                var path = viewport.selectAll('.map-in-map-bbox')
-                    .data([bbox]);
+        context.on('exit.intro', function() {
+            continueTo(clickTownHall);
+        });
 
-                path.enter()
-                    .append('path')
-                    .attr('class', 'map-in-map-bbox')
-                    .merge(path)
-                    .attr('d', getPath)
-                    .classed('thick', function(d) { return getPath.area(d) < 30; });
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(hallId)) {
+                continueTo(clickTownHall);
             }
-        }
+        });
 
+        reveal('.inspector-body .preset-list-item.inspector-inner',
+            t('intro.navigation.preset_townhall', { preset: preset.name() }),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-        function queueRedraw() {
-            clearTimeout(timeoutId);
-            timeoutId = setTimeout(function() { redraw(); }, 750);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            nextStep();
         }
+    }
 
 
-        function toggle() {
-            if (event) event.preventDefault();
+    function fieldsTownHall() {
+        if (!isTownHallSelected()) return clickTownHall();
 
-            isHidden = !isHidden;
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-            var label = d3_select('.minimap-toggle');
-            label.classed('active', !isHidden)
-                .select('input').property('checked', !isHidden);
+        var onClick = function() { continueTo(closeTownHall); };
 
-            if (isHidden) {
-                wrap
-                    .style('display', 'block')
-                    .style('opacity', '1')
-                    .transition()
-                    .duration(200)
-                    .style('opacity', '0')
-                    .on('end', function() {
-                        selection.selectAll('.map-in-map')
-                            .style('display', 'none');
-                    });
-            } else {
-                wrap
-                    .style('display', 'block')
-                    .style('opacity', '0')
-                    .transition()
-                    .duration(200)
-                    .style('opacity', '1')
-                    .on('end', function() {
-                        redraw();
-                    });
-            }
-        }
+        reveal('.inspector-body .preset-editor',
+            t('intro.navigation.fields_townhall'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
+        context.on('exit.intro', function() {
+            continueTo(clickTownHall);
+        });
 
-        uiMapInMap.toggle = toggle;
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(hallId)) {
+                continueTo(clickTownHall);
+            }
+        });
 
-        wrap = selection.selectAll('.map-in-map')
-            .data([0]);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            nextStep();
+        }
+    }
 
-        wrap = wrap.enter()
-            .append('div')
-            .attr('class', 'map-in-map')
-            .style('display', (isHidden ? 'none' : 'block'))
-            .call(zoom$$1)
-            .on('dblclick.zoom', null)
-            .merge(wrap);
 
-        context.map()
-            .on('drawn.map-in-map', function(drawn) {
-                if (drawn.full === true) {
-                    redraw();
-                }
-            });
+    function closeTownHall() {
+        if (!isTownHallSelected()) return clickTownHall();
 
-        redraw();
+        var selector = '.entity-editor-pane button.preset-close svg use';
+        var href = d3_select(selector).attr('href') || '#icon-close';
 
-        var keybinding = d3keybinding('map-in-map')
-            .on(t('background.minimap.key'), toggle);
+        reveal('.entity-editor-pane',
+            t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
+        );
 
-        d3_select(document)
-            .call(keybinding);
-    }
+        context.on('exit.intro', function() {
+            continueTo(searchStreet);
+        });
 
-    return map_in_map;
-}
+        context.history().on('change.intro', function() {
+            // update the close icon in the tooltip if the user edits something.
+            var selector = '.entity-editor-pane button.preset-close svg use';
+            var href = d3_select(selector).attr('href') || '#icon-close';
 
-function uiTooltipHtml(text, key, heading) {
-    var s = '';
+            reveal('.entity-editor-pane',
+                t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
+                { duration: 0 }
+            );
+        });
 
-    if (heading) {
-        s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
-    }
-    if (text) {
-        s += '<div class="tooltip-text"><span>' + text + '</span></div>';
-    }
-    if (key) {
-        s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
-            '<span class="keyhint">' + key + '</span></div>';
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
     }
 
-    return s;
-}
 
-function uiBackground(context) {
-    var key = t('background.key'),
-        detected = utilDetect(),
-        opacities = [1, 0.75, 0.5, 0.25],
-        directions = [
-            ['right', [0.5, 0]],
-            ['top', [0, -0.5]],
-            ['left', [-0.5, 0]],
-            ['bottom', [0, 0.5]]],
-        opacityDefault = (context.storage('background-opacity') !== null) ?
-            (+context.storage('background-opacity')) : 1.0,
-        customSource = context.background().findSource('custom'),
-        previous;
-
-    // Can be 0 from <1.3.0 use or due to issue #1923.
-    if (opacityDefault === 0) opacityDefault = 1.0;
+    function searchStreet() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');  // ensure spring street exists
 
+        var msec = transitionTime(springStreet, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
 
-    function background(selection) {
+        timeout(function() {
+            reveal('.search-header input',
+                t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
+            );
 
-        function sortSources(a, b) {
-            return a.best() && !b.best() ? -1
-                : b.best() && !a.best() ? 1
-                : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
-        }
+            d3_select('.search-header input')
+                .on('keyup.intro', checkSearchResult);
+        }, msec + 100);
+    }
 
 
-        function setOpacity(d) {
-            var bg = context.container().selectAll('.layer-background')
-                .transition()
-                .style('opacity', d)
-                .attr('data-opacity', d);
+    function checkSearchResult() {
+        var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
+            firstName = first.select('.entity-name'),
+            name = t('intro.graph.name.spring-street');
 
-            if (!detected.opera) {
-                utilSetTransform(bg, 0, 0);
-            }
+        if (!firstName.empty() && firstName.text() === name) {
+            reveal(first.node(),
+                t('intro.navigation.choose_street', { name: name }),
+                { duration: 300 }
+            );
 
-            opacityList.selectAll('li')
-                .classed('active', function(_) { return _ === d; });
+            context.on('exit.intro', function() {
+                continueTo(selectedStreet);
+            });
 
-            context.storage('background-opacity', d);
+            d3_select('.search-header input')
+                .on('keydown.intro', eventCancel, true)
+                .on('keyup.intro', null);
         }
 
-
-        function setTooltips(selection) {
-            selection.each(function(d, i, nodes) {
-                var item = d3_select(this).select('label'),
-                    span = item.select('span'),
-                    placement = (i < nodes.length / 2) ? 'bottom' : 'top',
-                    description = d.description(),
-                    isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
-
-                if (d === previous) {
-                    item.call(tooltip()
-                        .placement(placement)
-                        .html(true)
-                        .title(function() {
-                            var tip = '<div>' + t('background.switch') + '</div>';
-                            return uiTooltipHtml(tip, uiCmd('⌘' + key));
-                        })
-                    );
-                } else if (description || isOverflowing) {
-                    item.call(tooltip()
-                        .placement(placement)
-                        .title(description || d.name())
-                    );
-                } else {
-                    item.call(tooltip().destroy);
-                }
-            });
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            d3_select('.search-header input')
+                .on('keydown.intro', null)
+                .on('keyup.intro', null);
+            nextStep();
         }
+    }
 
 
-        function selectLayer() {
-            function active(d) {
-                return context.background().showsLayer(d);
-            }
-
-            content.selectAll('.layer')
-                .classed('active', active)
-                .classed('switch', function(d) { return d === previous; })
-                .call(setTooltips)
-                .selectAll('input')
-                .property('checked', active);
+    function selectedStreet() {
+        if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+            return searchStreet();
         }
 
+        var onClick = function() { continueTo(editorStreet); };
+        var entity = context.entity(springStreetEndId);
+        var box = pointBox(entity.loc, context);
+        box.height = 500;
 
-        function clickSetSource(d) {
-            if (d.id === 'custom' && !d.template()) {
-                return editCustom();
-            }
-
-            event.preventDefault();
-            previous = context.background().baseLayerSource();
-            context.background().baseLayerSource(d);
-            selectLayer();
-            document.activeElement.blur();
-        }
-
+        reveal(box,
+            t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
+            { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-        function editCustom() {
-            event.preventDefault();
-            var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
-            var template = window.prompt(
-                t('background.custom_prompt', { example: example }),
-                customSource.template() || example
-            );
+        timeout(function() {
+            context.map().on('move.intro drawn.intro', function() {
+                var entity = context.hasEntity(springStreetEndId);
+                if (!entity) return;
+                var box = pointBox(entity.loc, context);
+                box.height = 500;
+                reveal(box,
+                    t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
+                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+                );
+            });
+        }, 600);  // after reveal.
 
-            if (template) {
-                context.storage('background-custom-template', template);
-                customSource.template(template);
-                clickSetSource(customSource);
-            } else {
-                selectLayer();
+        context.on('enter.intro', function(mode) {
+            if (!context.hasEntity(springStreetId)) {
+                return continueTo(searchStreet);
             }
-        }
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
+                // keep Spring Street selected..
+                context.enter(modeSelect(context, [springStreetId]));
+            }
+        });
 
+        context.history().on('change.intro', function() {
+            if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
+                timeout(function() {
+                    continueTo(searchStreet);
+                }, 300);  // after any transition (e.g. if user deleted intersection)
+            }
+        });
 
-        function clickSetOverlay(d) {
-            event.preventDefault();
-            context.background().toggleOverlayLayer(d);
-            selectLayer();
-            document.activeElement.blur();
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
         }
+    }
 
 
-        function drawList(layerList, type, change, filter) {
-            var sources = context.background()
-                .sources(context.map().extent())
-                .filter(filter);
+    function editorStreet() {
+        var selector = '.entity-editor-pane button.preset-close svg use';
+        var href = d3_select(selector).attr('href') || '#icon-close';
 
-            var layerLinks = layerList.selectAll('li.layer')
-                .data(sources, function(d) { return d.name(); });
+        reveal('.entity-editor-pane',
+            t('intro.navigation.editor_street', {
+                button: icon(href, 'pre-text'),
+                field1: onewayField.label(),
+                field2: maxspeedField.label()
+            })
+        );
 
-            layerLinks.exit()
-                .remove();
+        context.on('exit.intro', function() {
+            continueTo(play);
+        });
 
-            var enter = layerLinks.enter()
-                .append('li')
-                .attr('class', 'layer')
-                .classed('layer-custom', function(d) { return d.id === 'custom'; })
-                .classed('best', function(d) { return d.best(); });
+        context.history().on('change.intro', function() {
+            // update the close icon in the tooltip if the user edits something.
+            var selector = '.entity-editor-pane button.preset-close svg use';
+            var href = d3_select(selector).attr('href') || '#icon-close';
 
-            enter.filter(function(d) { return d.id === 'custom'; })
-                .append('button')
-                .attr('class', 'layer-browse')
-                .call(tooltip()
-                    .title(t('background.custom_button'))
-                    .placement((textDirection === 'rtl') ? 'right' : 'left'))
-                .on('click', editCustom)
-                .call(svgIcon('#icon-search'));
+            reveal('.entity-editor-pane',
+                t('intro.navigation.editor_street', {
+                    button: icon(href, 'pre-text'),
+                    field1: onewayField.label().toLowerCase(),
+                    field2: maxspeedField.label().toLowerCase()
+                }), { duration: 0 }
+            );
+        });
 
-            enter.filter(function(d) { return d.best(); })
-                .append('div')
-                .attr('class', 'best')
-                .call(tooltip()
-                    .title(t('background.best_imagery'))
-                    .placement((textDirection === 'rtl') ? 'right' : 'left'))
-                .append('span')
-                .html('&#9733;');
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
-            var label = enter
-                .append('label');
 
-            label
-                .append('input')
-                .attr('type', type)
-                .attr('name', 'layers')
-                .on('change', change);
+    function play() {
+        dispatch$$1.call('done');
+        reveal('#id-container',
+            t('intro.navigation.play', { next: t('intro.points.title') }), {
+                tooltipBox: '.intro-nav-wrap .chapter-point',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { reveal('#id-container'); }
+            }
+        );
+    }
 
-            label
-                .append('span')
-                .text(function(d) { return d.name(); });
 
+    chapter.enter = function() {
+        dragMap();
+    };
 
-            layerList.selectAll('li.layer')
-                .sort(sortSources)
-                .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
-        }
 
+    chapter.exit = function() {
+        timeouts.forEach(window.clearTimeout);
+        context.on('enter.intro exit.intro', null);
+        context.map().on('move.intro drawn.intro', null);
+        context.history().on('change.intro', null);
+        d3_select('.inspector-wrap').on('wheel.intro', null);
+        d3_select('.search-header input').on('keydown.intro keyup.intro', null);
+    };
 
-        function update() {
-            backgroundList.call(drawList, 'radio', clickSetSource, function(d) { return !d.isHidden() && !d.overlay; });
-            overlayList.call(drawList, 'checkbox', clickSetOverlay, function(d) { return !d.isHidden() && d.overlay; });
 
-            selectLayer();
-            updateOffsetVal();
-        }
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
+    };
 
 
-        function updateOffsetVal() {
-            var meters = geoOffsetToMeters(context.background().offset()),
-                x = +meters[0].toFixed(2),
-                y = +meters[1].toFixed(2);
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-            d3_selectAll('.nudge-inner-rect')
-                .select('input')
-                .classed('error', false)
-                .property('value', x + ', ' + y);
+function uiIntroPoint(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        timeouts = [],
+        intersection = [-85.63279, 41.94394],
+        building = [-85.632422, 41.944045],
+        cafePreset = context.presets().item('amenity/cafe'),
+        pointId = null;
 
-            d3_selectAll('.nudge-reset')
-                .classed('disabled', function() {
-                    return (x === 0 && y === 0);
-                });
-        }
 
+    var chapter = {
+        title: 'intro.points.title'
+    };
 
-        function resetOffset() {
-            if (event.button !== 0) return;
-            context.background().offset([0, 0]);
-            updateOffsetVal();
-        }
 
+    function timeout(f, t$$1) {
+        timeouts.push(window.setTimeout(f, t$$1));
+    }
 
-        function nudge(d) {
-            context.background().nudge(d, context.map().zoom());
-            updateOffsetVal();
-        }
 
+    function revealEditMenu(loc, text, options) {
+        var rect = context.surfaceRect();
+        var point = context.curtainProjection(loc);
+        var pad = 40;
+        var width = 250 + (2 * pad);
+        var height = 250;
+        var startX = rect.left + point[0];
+        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
+        var box = {
+            left: left,
+            top: point[1] + rect.top - 60,
+            width: width,
+            height: height
+        };
+        reveal(box, text, options);
+    }
 
-        function buttonOffset(d) {
-            if (event.button !== 0) return;
-            var timeout = window.setTimeout(function() {
-                    interval = window.setInterval(nudge.bind(null, d), 100);
-                }, 500),
-                interval;
 
-            function doneNudge() {
-                window.clearTimeout(timeout);
-                window.clearInterval(interval);
-                d3_select(window)
-                    .on('mouseup.buttonoffset', null, true)
-                    .on('mousedown.buttonoffset', null, true);
-            }
+    function eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
+    }
 
-            d3_select(window)
-                .on('mouseup.buttonoffset', doneNudge, true)
-                .on('mousedown.buttonoffset', doneNudge, true);
 
-            nudge(d);
-        }
+    function addPoint() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
 
+        var msec = transitionTime(intersection, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(intersection, msec);
 
-        function inputOffset() {
-            if (event.button !== 0) return;
-            var input = d3_select(this);
-            var d = input.node().value;
+        timeout(function() {
+            var tooltip = reveal('button.add-point',
+                t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
 
-            if (d === '') return resetOffset();
+            pointId = null;
 
-            d = d.replace(/;/g, ',').split(',').map(function(n) {
-                // if n is NaN, it will always get mapped to false.
-                return !isNaN(n) && n;
-            });
+            tooltip.selectAll('.tooltip-inner')
+                .insert('svg', 'span')
+                .attr('class', 'tooltip-illustration')
+                .append('use')
+                .attr('xlink:href', '#poi-images');
 
-            if (d.length !== 2 || !d[0] || !d[1]) {
-                input.classed('error', true);
-                return;
-            }
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'add-point') return;
+                continueTo(placePoint);
+            });
+        }, msec + 100);
 
-            context.background().offset(geoMetersToOffset(d));
-            updateOffsetVal();
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
         }
+    }
 
 
-        function dragOffset() {
-            if (event.button !== 0) return;
-            var origin = [event.clientX, event.clientY];
+    function placePoint() {
+        if (context.mode().id !== 'add-point') {
+            return chapter.restart();
+        }
 
-            context.container()
-                .append('div')
-                .attr('class', 'nudge-surface');
+        var pointBox$$1 = pad$1(building, 150, context);
+        reveal(pointBox$$1, t('intro.points.place_point'));
 
-            d3_select(window)
-                .on('mousemove.offset', function() {
-                    var latest = [event.clientX, event.clientY];
-                    var d = [
-                        -(origin[0] - latest[0]) / 4,
-                        -(origin[1] - latest[1]) / 4
-                    ];
-
-                    origin = latest;
-                    nudge(d);
-                })
-                .on('mouseup.offset', function() {
-                    if (event.button !== 0) return;
-                    d3_selectAll('.nudge-surface')
-                        .remove();
+        context.map().on('move.intro drawn.intro', function() {
+            pointBox$$1 = pad$1(building, 150, context);
+            reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
+        });
 
-                    d3_select(window)
-                        .on('mousemove.offset', null)
-                        .on('mouseup.offset', null);
-                });
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'select') return chapter.restart();
+            pointId = context.mode().selectedIDs()[0];
+            continueTo(searchPreset);
+        });
 
-            event.preventDefault();
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
         }
+    }
 
 
-        function hide() {
-            setVisible(false);
+    function searchPreset() {
+        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
+            return addPoint();
         }
 
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-        function toggle() {
-            if (event) {
-                event.preventDefault();
-            }
-            tooltipBehavior.hide(button);
-            setVisible(!button.classed('active'));
-        }
+        d3_select('.preset-search-input')
+            .on('keydown.intro', null)
+            .on('keyup.intro', checkPresetSearch);
 
+        reveal('.preset-search-input',
+            t('intro.points.search_cafe', { preset: cafePreset.name() })
+        );
 
-        function quickSwitch() {
-            if (event) {
-                event.stopImmediatePropagation();
-                event.preventDefault();
-            }
-            if (previous) {
-                clickSetSource(previous);
+        context.on('enter.intro', function(mode) {
+            if (!pointId || !context.hasEntity(pointId)) {
+                return continueTo(addPoint);
             }
-        }
 
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
+                // keep the user's point selected..
+                context.enter(modeSelect(context, [pointId]));
 
-        function setVisible(show) {
-            if (show !== shown) {
-                button.classed('active', show);
-                shown = show;
+                // disallow scrolling
+                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-                if (show) {
-                    selection
-                        .on('mousedown.background-inside', function() {
-                            event.stopPropagation();
-                        });
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', null)
+                    .on('keyup.intro', checkPresetSearch);
 
-                    content
-                        .style('display', 'block')
-                        .style('right', '-300px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '0px');
+                reveal('.preset-search-input',
+                    t('intro.points.search_cafe', { preset: cafePreset.name() })
+                );
 
-                    content.selectAll('.layer')
-                        .call(setTooltips);
+                context.history().on('change.intro', null);
+            }
+        });
 
-                } else {
-                    content
-                        .style('display', 'block')
-                        .style('right', '0px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '-300px')
-                        .on('end', function() {
-                            d3_select(this).style('display', 'none');
-                        });
 
-                    selection
-                        .on('mousedown.background-inside', null);
-                }
+        function checkPresetSearch() {
+            var first = d3_select('.preset-list-item:first-child');
+
+            if (first.classed('preset-amenity-cafe')) {
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', eventCancel, true)
+                    .on('keyup.intro', null);
+
+                reveal(first.select('.preset-list-button').node(),
+                    t('intro.points.choose_cafe', { preset: cafePreset.name() }),
+                    { duration: 300 }
+                );
+
+                context.history().on('change.intro', function() {
+                    continueTo(aboutFeatureEditor);
+                });
             }
         }
 
-
-        var content = selection
-                .append('div')
-                .attr('class', 'fillL map-overlay col3 content hide'),
-            tooltipBehavior = tooltip()
-                .placement((textDirection === 'rtl') ? 'right' : 'left')
-                .html(true)
-                .title(uiTooltipHtml(t('background.description'), key)),
-            button = selection
-                .append('button')
-                .attr('tabindex', -1)
-                .on('click', toggle)
-                .call(svgIcon('#icon-layers', 'light'))
-                .call(tooltipBehavior),
-            shown = false;
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+            nextStep();
+        }
+    }
 
 
-        /* opacity switcher */
+    function aboutFeatureEditor() {
+        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
+            return addPoint();
+        }
 
-        var opawrap = content
-                .append('div')
-                .attr('class', 'opacity-options-wrapper');
+        timeout(function() {
+            reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
+                tooltipClass: 'intro-points-describe',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { continueTo(addName); }
+            });
+        }, 400);
 
-        opawrap
-            .append('h4')
-            .text(t('background.title'));
+        context.on('exit.intro', function() {
+            // if user leaves select mode here, just continue with the tutorial.
+            continueTo(reselectPoint);
+        });
 
-        var opacityList = opawrap
-            .append('ul')
-            .attr('class', 'opacity-options');
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
 
-        opacityList.selectAll('div.opacity')
-            .data(opacities)
-            .enter()
-            .append('li')
-            .attr('data-original-title', function(d) {
-                return t('background.percent_brightness', { opacity: (d * 100) });
-            })
-            .on('click.set-opacity', setOpacity)
-            .html('<div class="select-box"></div>')
-            .call(tooltip()
-                .placement((textDirection === 'rtl') ? 'right' : 'left'))
-            .append('div')
-            .attr('class', 'opacity')
-            .style('opacity', function(d) { return 1.25 - d; });
 
+    function addName() {
+        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
+            return addPoint();
+        }
 
-        /* background list */
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-        var backgroundList = content
-            .append('ul')
-            .attr('class', 'layer-list')
-            .attr('dir', 'auto');
+        timeout(function() {
+            // It's possible for the user to add a name in a previous step..
+            // If so, don't tell them to add the name in this step.
+            // Give them an OK button instead.
+            var entity = context.entity(pointId);
+            if (entity.tags.name) {
+                var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
+                    tooltipClass: 'intro-points-describe',
+                    buttonText: t('intro.ok'),
+                    buttonCallback: function() { continueTo(addCloseEditor); }
+                });
+                tooltip.select('.instruction').style('display', 'none');
 
-        content
-            .append('div')
-            .attr('class', 'imagery-faq')
-            .append('a')
-            .attr('target', '_blank')
-            .attr('tabindex', -1)
-            .call(svgIcon('#icon-out-link', 'inline'))
-            .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
-            .append('span')
-            .text(t('background.imagery_source_faq'));
+            } else {
+                reveal('.entity-editor-pane', t('intro.points.add_name'),
+                    { tooltipClass: 'intro-points-describe' }
+                );
+            }
+        }, 400);
 
+        context.history().on('change.intro', function() {
+            continueTo(addCloseEditor);
+        });
 
-        /* overlay list */
+        context.on('exit.intro', function() {
+            // if user leaves select mode here, just continue with the tutorial.
+            continueTo(reselectPoint);
+        });
 
-        var overlayList = content
-            .append('ul')
-            .attr('class', 'layer-list');
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
-        var controls = content
-            .append('div')
-            .attr('class', 'controls-list');
 
+    function addCloseEditor() {
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-        /* minimap toggle */
+        var selector = '.entity-editor-pane button.preset-close svg use';
+        var href = d3_select(selector).attr('href') || '#icon-close';
 
-        var minimapLabel = controls
-            .append('label')
-            .call(tooltip()
-                .html(true)
-                .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
-                .placement('top')
-            );
+        context.on('exit.intro', function() {
+            continueTo(reselectPoint);
+        });
 
-        minimapLabel
-            .classed('minimap-toggle', true)
-            .append('input')
-            .attr('type', 'checkbox')
-            .on('change', function() {
-                uiMapInMap.toggle();
-                event.preventDefault();
-            });
+        reveal('.entity-editor-pane',
+            t('intro.points.add_close', { button: icon(href, 'pre-text') })
+        );
 
-        minimapLabel
-            .append('span')
-            .text(t('background.minimap.description'));
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
 
 
-        /* imagery offset controls */
+    function reselectPoint() {
+        if (!pointId) return chapter.restart();
+        var entity = context.hasEntity(pointId);
+        if (!entity) return chapter.restart();
 
-        var adjustments = content
-            .append('div')
-            .attr('class', 'adjustments');
+        // make sure it's still a cafe, in case user somehow changed it..
+        var oldPreset = context.presets().match(entity, context.graph());
+        context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
 
-        adjustments
-            .append('a')
-            .text(t('background.fix_misalignment'))
-            .attr('href', '#')
-            .classed('hide-toggle', true)
-            .classed('expanded', false)
-            .on('click', function() {
-                if (event.button !== 0) return;
-                var exp = d3_select(this).classed('expanded');
-                nudgeContainer.style('display', exp ? 'none' : 'block');
-                d3_select(this).classed('expanded', !exp);
-                event.preventDefault();
-            });
+        context.enter(modeBrowse(context));
 
-        var nudgeContainer = adjustments
-            .append('div')
-            .attr('class', 'nudge-container cf')
-            .style('display', 'none');
+        var msec = transitionTime(entity.loc, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().centerEase(entity.loc, msec);
 
-        nudgeContainer
-            .append('div')
-            .attr('class', 'nudge-instructions')
-            .text(t('background.offset'));
+        timeout(function() {
+            var box = pointBox(entity.loc, context);
+            reveal(box, t('intro.points.reselect'), { duration: 600 });
 
-        var nudgeRect = nudgeContainer
-            .append('div')
-            .attr('class', 'nudge-outer-rect')
-            .on('mousedown', dragOffset);
+            timeout(function() {
+                context.map().on('move.intro drawn.intro', function() {
+                    var entity = context.hasEntity(pointId);
+                    if (!entity) return chapter.restart();
+                    var box = pointBox(entity.loc, context);
+                    reveal(box, t('intro.points.reselect'), { duration: 0 });
+                });
+            }, 600); // after reveal..
 
-        nudgeRect
-            .append('div')
-            .attr('class', 'nudge-inner-rect')
-            .append('input')
-            .on('change', inputOffset)
-            .on('mousedown', function() {
-                if (event.button !== 0) return;
-                event.stopPropagation();
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'select') return;
+                continueTo(updatePoint);
             });
 
-        nudgeContainer
-            .append('div')
-            .selectAll('button')
-            .data(directions).enter()
-            .append('button')
-            .attr('class', function(d) { return d[0] + ' nudge'; })
-            .on('mousedown', function(d) {
-                if (event.button !== 0) return;
-                buttonOffset(d[1]);
-            });
+        }, msec + 100);
 
-        nudgeContainer
-            .append('button')
-            .attr('title', t('background.reset'))
-            .attr('class', 'nudge-reset disabled')
-            .on('click', resetOffset)
-            .call(
-                (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
-            );
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-        context.map()
-            .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
 
-        context.background()
-            .on('change.background-update', update);
+    function updatePoint() {
+        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
+            return continueTo(reselectPoint);
+        }
 
+        // reset pane, in case user happened to untag the point..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-        update();
-        setOpacity(opacityDefault);
+        context.on('exit.intro', function() {
+            continueTo(reselectPoint);
+        });
 
-        var keybinding = d3keybinding('background')
-            .on(key, toggle)
-            .on(uiCmd('⌘' + key), quickSwitch)
-            .on([t('map_data.key'), t('help.key')], hide);
+        context.history().on('change.intro', function() {
+            continueTo(updateCloseEditor);
+        });
 
-        d3_select(document)
-            .call(keybinding);
+        timeout(function() {
+            reveal('.entity-editor-pane', t('intro.points.update'),
+                { tooltipClass: 'intro-points-describe' }
+            );
+        }, 400);
 
-        context.surface().on('mousedown.background-outside', hide);
-        context.container().on('mousedown.background-outside', hide);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
     }
 
-    return background;
-}
-
-function uiContributors(context) {
-    var osm = context.connection(),
-        debouncedUpdate = debounce(function() { update(); }, 1000),
-        limit = 4,
-        hidden = false,
-        wrap = d3_select(null);
-
 
-    function update() {
-        if (!osm) return;
+    function updateCloseEditor() {
+        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
+            return continueTo(reselectPoint);
+        }
 
-        var users = {},
-            entities = context.intersects(context.map().extent());
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-        entities.forEach(function(entity) {
-            if (entity && entity.user) users[entity.user] = true;
+        context.on('exit.intro', function() {
+            continueTo(rightClickPoint);
         });
 
-        var u = Object.keys(users),
-            subset = u.slice(0, u.length > limit ? limit - 1 : limit);
-
-        wrap.html('')
-            .call(svgIcon('#icon-nearby', 'pre-text light'));
-
-        var userList = d3_select(document.createElement('span'));
-
-        userList.selectAll()
-            .data(subset)
-            .enter()
-            .append('a')
-            .attr('class', 'user-link')
-            .attr('href', function(d) { return osm.userURL(d); })
-            .attr('target', '_blank')
-            .attr('tabindex', -1)
-            .text(String);
-
-        if (u.length > limit) {
-            var count = d3_select(document.createElement('span'));
-
-            count.append('a')
-                .attr('target', '_blank')
-                .attr('tabindex', -1)
-                .attr('href', function() {
-                    return osm.changesetsURL(context.map().center(), context.map().zoom());
-                })
-                .text(u.length - limit + 1);
-
-            wrap.append('span')
-                .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
-
-        } else {
-            wrap.append('span')
-                .html(t('contributors.list', { users: userList.html() }));
-        }
-
-        if (!u.length) {
-            hidden = true;
-            wrap
-                .transition()
-                .style('opacity', 0);
+        timeout(function() {
+            reveal('.entity-editor-pane',
+                t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
+            );
+        }, 500);
 
-        } else if (hidden) {
-            wrap
-                .transition()
-                .style('opacity', 1);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
         }
     }
 
 
-    return function(selection) {
-        if (!osm) return;
-        wrap = selection;
-        update();
+    function rightClickPoint() {
+        if (!pointId) return chapter.restart();
+        var entity = context.hasEntity(pointId);
+        if (!entity) return chapter.restart();
 
-        osm.on('loaded.contributors', debouncedUpdate);
-        context.map().on('move.contributors', debouncedUpdate);
-    };
-}
+        context.enter(modeBrowse(context));
 
-function uiFeatureInfo(context) {
-    function update(selection) {
-        var features = context.features(),
-            stats = features.stats(),
-            count = 0,
-            hiddenList = compact(map$4(features.hidden(), function(k) {
-                if (stats[k]) {
-                    count += stats[k];
-                    return String(stats[k]) + ' ' + t('feature.' + k + '.description');
-                }
-            }));
+        var box = pointBox(entity.loc, context);
+        reveal(box, t('intro.points.rightclick'), { duration: 600 });
 
-        selection.html('');
+        timeout(function() {
+            context.map().on('move.intro drawn.intro', function() {
+                var entity = context.hasEntity(pointId);
+                if (!entity) return chapter.restart();
+                var box = pointBox(entity.loc, context);
+                reveal(box, t('intro.points.rightclick'), { duration: 0 });
+            });
+        }, 600); // after reveal
 
-        if (hiddenList.length) {
-            var tooltipBehavior = tooltip()
-                .placement('top')
-                .html(true)
-                .title(function() {
-                    return uiTooltipHtml(hiddenList.join('<br/>'));
-                });
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'select') return;
+            var ids = context.selectedIDs();
+            if (ids.length !== 1 || ids[0] !== pointId) return;
 
-            var warning = selection.append('a')
-                .attr('href', '#')
-                .attr('tabindex', -1)
-                .html(t('feature_info.hidden_warning', { count: count }))
-                .call(tooltipBehavior)
-                .on('click', function() {
-                    tooltipBehavior.hide(warning);
-                    // open map data panel?
-                    event.preventDefault();
-                });
-        }
+            timeout(function() {
+                var node = selectMenuItem('delete').node();
+                if (!node) return;
+                continueTo(enterDelete);
+            }, 300);  // after menu visible
+        });
 
-        selection
-            .classed('hide', !hiddenList.length);
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
     }
 
 
-    return function(selection) {
-        update(selection);
+    function enterDelete() {
+        if (!pointId) return chapter.restart();
+        var entity = context.hasEntity(pointId);
+        if (!entity) return chapter.restart();
 
-        context.features().on('change.feature_info', function() {
-            update(selection);
-        });
-    };
-}
+        var node = selectMenuItem('delete').node();
+        if (!node) { return continueTo(rightClickPoint); }
 
-function uiFullScreen(context) {
-    var element = context.container().node(),
-        keybinding = d3keybinding('full-screen');
-        // button;
+        revealEditMenu(entity.loc,
+            t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
+        );
 
+        timeout(function() {
+            context.map().on('move.intro drawn.intro', function() {
+                revealEditMenu(entity.loc,
+                    t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
+                    { duration: 0}
+                );
+            });
+        }, 300); // after menu visible
 
-    function getFullScreenFn() {
-        if (element.requestFullscreen) {
-            return element.requestFullscreen;
-        } else if (element.msRequestFullscreen) {
-            return element.msRequestFullscreen;
-        } else if (element.mozRequestFullScreen) {
-            return element.mozRequestFullScreen;
-        } else if (element.webkitRequestFullscreen) {
-            return element.webkitRequestFullscreen;
-        }
-    }
+        context.on('exit.intro', function() {
+            if (!pointId) return chapter.restart();
+            var entity = context.hasEntity(pointId);
+            if (entity) return continueTo(rightClickPoint);  // point still exists
+        });
 
+        context.history().on('change.intro', function(changed) {
+            if (changed.deleted().length) {
+                continueTo(undo);
+            }
+        });
 
-    function getExitFullScreenFn() {
-        if (document.exitFullscreen) {
-            return document.exitFullscreen;
-        } else if (document.msExitFullscreen) {
-            return document.msExitFullscreen;
-        } else if (document.mozCancelFullScreen) {
-            return document.mozCancelFullScreen;
-        } else if (document.webkitExitFullscreen) {
-            return document.webkitExitFullscreen;
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            context.on('exit.intro', null);
+            nextStep();
         }
     }
 
 
-    function isFullScreen() {
-        return document.fullscreenElement ||
-            document.mozFullScreenElement ||
-            document.webkitFullscreenElement ||
-            document.msFullscreenElement;
-    }
+    function undo() {
+        context.history().on('change.intro', function() {
+            continueTo(play);
+        });
 
+        var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
+        reveal('#bar button.undo-button',
+            t('intro.points.undo', { button: icon(iconName, 'pre-text') })
+        );
 
-    function isSupported() {
-        return !!getFullScreenFn();
+        function continueTo(nextStep) {
+            context.history().on('change.intro', null);
+            nextStep();
+        }
     }
 
 
-    function fullScreen() {
-        event.preventDefault();
-        if (!isFullScreen()) {
-            // button.classed('active', true);
-            getFullScreenFn().apply(element);
-        } else {
-            // button.classed('active', false);
-            getExitFullScreenFn().apply(document);
-        }
+    function play() {
+        dispatch$$1.call('done');
+        reveal('#id-container',
+            t('intro.points.play', { next: t('intro.areas.title') }), {
+                tooltipBox: '.intro-nav-wrap .chapter-area',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { reveal('#id-container'); }
+            }
+        );
     }
 
 
-    return function() { // selection) {
-        if (!isSupported())
-            return;
+    chapter.enter = function() {
+        addPoint();
+    };
 
-        // button = selection.append('button')
-        //     .attr('title', t('full_screen'))
-        //     .attr('tabindex', -1)
-        //     .on('click', fullScreen)
-        //     .call(tooltip);
 
-        // button.append('span')
-        //     .attr('class', 'icon full-screen');
+    chapter.exit = function() {
+        timeouts.forEach(window.clearTimeout);
+        context.on('enter.intro exit.intro', null);
+        context.map().on('move.intro drawn.intro', null);
+        context.history().on('change.intro', null);
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+    };
 
-        var detected = utilDetect();
-        var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
-        keybinding.on(keys, fullScreen);
 
-        d3_select(document)
-            .call(keybinding);
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
     };
-}
-
-function uiModal(selection, blocking) {
-    var keybinding = d3keybinding('modal');
-    var previous = selection.select('div.modal');
-    var animate = previous.empty();
 
-    previous.transition()
-        .duration(200)
-        .style('opacity', 0)
-        .remove();
 
-    var shaded = selection
-        .append('div')
-        .attr('class', 'shaded')
-        .style('opacity', 0);
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-    shaded.close = function() {
-        shaded
-            .transition()
-            .duration(200)
-            .style('opacity',0)
-            .remove();
+function uiIntroArea(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        playground = [-85.63552, 41.94159],
+        playgroundPreset = context.presets().item('leisure/playground'),
+        descriptionField = context.presets().field('description'),
+        timeouts = [],
+        areaId;
 
-        modal
-            .transition()
-            .duration(200)
-            .style('top','0px');
 
-        keybinding.off();
+    var chapter = {
+        title: 'intro.areas.title'
     };
 
 
-    var modal = shaded
-        .append('div')
-        .attr('class', 'modal fillL col6');
-
-    if (!blocking) {
-        shaded.on('click.remove-modal', function() {
-            if (event.target === this) {
-                shaded.close();
-            }
-        });
-
-        modal.append('button')
-            .attr('class', 'close')
-            .on('click', shaded.close)
-            .call(svgIcon('#icon-close'));
-
-        keybinding
-            .on('⌫', shaded.close)
-            .on('⎋', shaded.close);
-
-        d3_select(document)
-            .call(keybinding);
+    function timeout(f, t$$1) {
+        timeouts.push(window.setTimeout(f, t$$1));
     }
 
-    modal
-        .append('div')
-        .attr('class', 'content');
 
-    if (animate) {
-        shaded.transition().style('opacity', 1);
-    } else {
-        shaded.style('opacity', 1);
+    function eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
     }
 
 
-    return shaded;
-}
+    function revealPlayground(center, text, options) {
+        var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
+        var box = pad$1(center, padding, context);
+        reveal(box, text, options);
+    }
 
-function uiLoading(context) {
-    var message = '',
-        blocking = false,
-        modalSelection;
 
+    function addArea() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
+        areaId = null;
 
-    var loading = function(selection) {
-        modalSelection = uiModal(selection, blocking);
+        var msec = transitionTime(playground, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(playground, msec);
 
-        var loadertext = modalSelection.select('.content')
-            .classed('loading-modal', true)
-            .append('div')
-            .attr('class', 'modal-section fillL');
+        timeout(function() {
+            var tooltip = reveal('button.add-area',
+                t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
 
-        loadertext
-            .append('img')
-            .attr('class', 'loader')
-            .attr('src', context.imagePath('loader-white.gif'));
+            tooltip.selectAll('.tooltip-inner')
+                .insert('svg', 'span')
+                .attr('class', 'tooltip-illustration')
+                .append('use')
+                .attr('xlink:href', '#landuse-images');
 
-        loadertext
-            .append('h3')
-            .text(message);
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'add-area') return;
+                continueTo(startPlayground);
+            });
+        }, msec + 100);
 
-        modalSelection.select('button.close')
-            .attr('class', 'hide');
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-        return loading;
-    };
 
+    function startPlayground() {
+        if (context.mode().id !== 'add-area') {
+            return chapter.restart();
+        }
 
-    loading.message = function(_) {
-        if (!arguments.length) return message;
-        message = _;
-        return loading;
-    };
+        areaId = null;
+        context.map().zoomEase(19.5, 500);
 
+        timeout(function() {
+            revealPlayground(playground,
+                t('intro.areas.start_playground'), { duration: 250 }
+            );
 
-    loading.blocking = function(_) {
-        if (!arguments.length) return blocking;
-        blocking = _;
-        return loading;
-    };
+            timeout(function() {
+                context.map().on('move.intro drawn.intro', function() {
+                    revealPlayground(playground,
+                        t('intro.areas.start_playground'), { duration: 0 }
+                    );
+                });
+                context.on('enter.intro', function(mode) {
+                    if (mode.id !== 'draw-area') return chapter.restart();
+                    continueTo(continuePlayground);
+                });
+            }, 250);  // after reveal
 
+        }, 550);  // after easing
 
-    loading.close = function() {
-        modalSelection.remove();
-    };
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
 
-    return loading;
-}
+    function continuePlayground() {
+        if (context.mode().id !== 'draw-area') {
+            return chapter.restart();
+        }
 
-function uiGeolocate(context) {
-    var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
-        locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
-        timeoutId;
+        areaId = null;
+        revealPlayground(playground,
+            t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
+            { duration: 250 }
+        );
 
+        timeout(function() {
+            context.map().on('move.intro drawn.intro', function() {
+                revealPlayground(playground,
+                    t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
+                    { duration: 0 }
+                );
+            });
+        }, 250);  // after reveal
 
-    function click() {
-        if (context.inIntro()) return;
-        context.enter(modeBrowse(context));
-        context.container().call(locating);
-        navigator.geolocation.getCurrentPosition(success, error, geoOptions);
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-area') {
+                var entity = context.hasEntity(context.selectedIDs()[0]);
+                if (entity && entity.nodes.length >= 6) {
+                    return continueTo(finishPlayground);
+                } else {
+                    return;
+                }
+            } else if (mode.id === 'select') {
+                areaId = context.selectedIDs()[0];
+                return continueTo(searchPresets);
+            } else {
+                return chapter.restart();
+            }
+        });
 
-        // This timeout ensures that we still call finish() even if
-        // the user declines to share their location in Firefox
-        timeoutId = setTimeout(finish, 10000 /* 10sec */ );
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
 
 
-    function success(position) {
-        var map = context.map(),
-            extent = geoExtent([position.coords.longitude, position.coords.latitude])
-                .padByMeters(position.coords.accuracy);
+    function finishPlayground() {
+        if (context.mode().id !== 'draw-area') {
+            return chapter.restart();
+        }
 
-        map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
-        finish();
-    }
+        areaId = null;
+        revealPlayground(playground,
+            t('intro.areas.finish_playground'), { duration: 250 }
+        );
 
+        timeout(function() {
+            context.map().on('move.intro drawn.intro', function() {
+                revealPlayground(playground,
+                    t('intro.areas.finish_playground'), { duration: 0 }
+                );
+            });
+        }, 250);  // after reveal
 
-    function error() {
-        finish();
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-area') {
+                return;
+            } else if (mode.id === 'select') {
+                areaId = context.selectedIDs()[0];
+                return continueTo(searchPresets);
+            } else {
+                return chapter.restart();
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
 
 
-    function finish() {
-        locating.close();  // unblock ui
-        if (timeoutId) { clearTimeout(timeoutId); }
-        timeoutId = undefined;
-    }
+    function searchPresets() {
+        if (!areaId || !context.hasEntity(areaId)) {
+            return addArea();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
+            context.enter(modeSelect(context, [areaId]));
+        }
 
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-    return function(selection) {
-        if (!navigator.geolocation) return;
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-        selection
-            .append('button')
-            .attr('tabindex', -1)
-            .attr('title', t('geolocate.title'))
-            .on('click', click)
-            .call(svgIcon('#icon-geolocate', 'light'))
-            .call(tooltip()
-                .placement((textDirection === 'rtl') ? 'right' : 'left'));
-    };
-}
+            d3_select('.preset-search-input')
+                .on('keydown.intro', null)
+                .on('keyup.intro', checkPresetSearch);
 
-var marked = createCommonjsModule(function (module, exports) {
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
+            reveal('.preset-search-input',
+                t('intro.areas.search_playground', { preset: playgroundPreset.name() })
+            );
+        }, 400);  // after preset list pane visible..
 
-(function() {
+        context.on('enter.intro', function(mode) {
+            if (!areaId || !context.hasEntity(areaId)) {
+                return continueTo(addArea);
+            }
 
-/**
- * Block-Level Grammar
- */
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
+                // keep the user's area selected..
+                context.enter(modeSelect(context, [areaId]));
 
-var block = {
-  newline: /^\n+/,
-  code: /^( {4}[^\n]+\n*)+/,
-  fences: noop,
-  hr: /^( *[-*_]){3,} *(?:\n+|$)/,
-  heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
-  nptable: noop,
-  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
-  blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
-  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
-  html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
-  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
-  table: noop,
-  paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-  text: /^[^\n]+/
-};
+                // reset pane, in case user somehow happened to change it..
+                d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+                // disallow scrolling
+                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-block.bullet = /(?:[*+-]|\d+\.)/;
-block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
-block.item = replace(block.item, 'gm')
-  (/bull/g, block.bullet)
-  ();
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', null)
+                    .on('keyup.intro', checkPresetSearch);
 
-block.list = replace(block.list)
-  (/bull/g, block.bullet)
-  ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
-  ('def', '\\n+(?=' + block.def.source + ')')
-  ();
+                reveal('.preset-search-input',
+                    t('intro.areas.search_playground', { preset: playgroundPreset.name() })
+                );
 
-block.blockquote = replace(block.blockquote)
-  ('def', block.def)
-  ();
+                context.history().on('change.intro', null);
+            }
+        });
 
-block._tag = '(?!(?:'
-  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
-  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
-  + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
+        function checkPresetSearch() {
+            var first = d3_select('.preset-list-item:first-child');
 
-block.html = replace(block.html)
-  ('comment', /<!--[\s\S]*?-->/)
-  ('closed', /<(tag)[\s\S]+?<\/\1>/)
-  ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
-  (/tag/g, block._tag)
-  ();
+            if (first.classed('preset-leisure-playground')) {
+                reveal(first.select('.preset-list-button').node(),
+                    t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
+                    { duration: 300 }
+                );
 
-block.paragraph = replace(block.paragraph)
-  ('hr', block.hr)
-  ('heading', block.heading)
-  ('lheading', block.lheading)
-  ('blockquote', block.blockquote)
-  ('tag', '<' + block._tag)
-  ('def', block.def)
-  ();
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', eventCancel, true)
+                    .on('keyup.intro', null);
 
-/**
- * Normal Block Grammar
- */
+                context.history().on('change.intro', function() {
+                    continueTo(clickAddField);
+                });
+            }
+        }
 
-block.normal = merge({}, block);
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+            nextStep();
+        }
+    }
 
-/**
- * GFM Block Grammar
- */
 
-block.gfm = merge({}, block.normal, {
-  fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
-  paragraph: /^/,
-  heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
-});
+    function clickAddField() {
+        if (!areaId || !context.hasEntity(areaId)) {
+            return addArea();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
+            return searchPresets();
+        }
 
-block.gfm.paragraph = replace(block.paragraph)
-  ('(?!', '(?!'
-    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
-    + block.list.source.replace('\\1', '\\3') + '|')
-  ();
+        if (!d3_select('.form-field-description').empty()) {
+            return continueTo(describePlayground);
+        }
 
-/**
- * GFM + Tables Block Grammar
- */
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-block.tables = merge({}, block.gfm, {
-  nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
-  table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
-});
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-/**
- * Block Lexer
- */
+            // It's possible for the user to add a description in a previous step..
+            // If they did this already, just continue to next step.
+            var entity = context.entity(areaId);
+            if (entity.tags.description) {
+                return continueTo(play);
+            }
 
-function Lexer(options) {
-  this.tokens = [];
-  this.tokens.links = {};
-  this.options = options || marked.defaults;
-  this.rules = block.normal;
+            // scroll "Add field" into view
+            var box = d3_select('.more-fields').node().getBoundingClientRect();
+            if (box.top > 300) {
+                var pane = d3_select('.entity-editor-pane .inspector-body');
+                var start = pane.node().scrollTop;
+                var end = start + (box.top - 300);
 
-  if (this.options.gfm) {
-    if (this.options.tables) {
-      this.rules = block.tables;
-    } else {
-      this.rules = block.gfm;
-    }
-  }
-}
+                pane
+                    .transition()
+                    .duration(250)
+                    .tween('scroll.inspector', function() {
+                        var node = this;
+                        var i = d3_interpolateNumber(start, end);
+                        return function(t$$1) {
+                            node.scrollTop = i(t$$1);
+                        };
+                    });
+            }
 
-/**
- * Expose Block Rules
- */
+            timeout(function() {
+                reveal('.more-fields .combobox-input',
+                    t('intro.areas.add_field'),
+                    { duration: 300 }
+                );
 
-Lexer.rules = block;
+                d3_select('.more-fields .combobox-input')
+                    .on('click.intro', function() {
+                        continueTo(chooseDescriptionField);
+                    });
+            }, 300);  // after "Add Field" visible
 
-/**
- * Static Lex Method
- */
+        }, 400);  // after editor pane visible
 
-Lexer.lex = function(src, options) {
-  var lexer = new Lexer(options);
-  return lexer.lex(src);
-};
+        context.on('exit.intro', function() {
+            return continueTo(searchPresets);
+        });
 
-/**
- * Preprocessing
- */
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.more-fields .combobox-input').on('click.intro', null);
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
 
-Lexer.prototype.lex = function(src) {
-  src = src
-    .replace(/\r\n|\r/g, '\n')
-    .replace(/\t/g, '    ')
-    .replace(/\u00a0/g, ' ')
-    .replace(/\u2424/g, '\n');
 
-  return this.token(src, true);
-};
+    function chooseDescriptionField() {
+        if (!areaId || !context.hasEntity(areaId)) {
+            return addArea();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
+            return searchPresets();
+        }
 
-/**
- * Lexing
- */
+        if (!d3_select('.form-field-description').empty()) {
+            return continueTo(describePlayground);
+        }
 
-Lexer.prototype.token = function(src, top, bq) {
-  var src = src.replace(/^ +$/gm, '')
-    , next
-    , loose
-    , cap
-    , bull
-    , b
-    , item
-    , space
-    , i
-    , l;
+        // Make sure combobox is ready..
+        if (d3_select('div.combobox').empty()) {
+            return continueTo(clickAddField);
+        }
+        // Watch for the combobox to go away..
+        var watcher;
+        watcher = window.setInterval(function() {
+            if (d3_select('div.combobox').empty()) {
+                window.clearInterval(watcher);
+                timeout(function() {
+                    if (d3_select('.form-field-description').empty()) {
+                        continueTo(retryChooseDescription);
+                    } else {
+                        continueTo(describePlayground);
+                    }
+                }, 300);  // after description field added.
+            }
+        }, 300);
 
-  while (src) {
-    // newline
-    if (cap = this.rules.newline.exec(src)) {
-      src = src.substring(cap[0].length);
-      if (cap[0].length > 1) {
-        this.tokens.push({
-          type: 'space'
-        });
-      }
-    }
+        reveal('div.combobox',
+            t('intro.areas.choose_field', { field: descriptionField.label() }),
+            { duration: 300 }
+        );
 
-    // code
-    if (cap = this.rules.code.exec(src)) {
-      src = src.substring(cap[0].length);
-      cap = cap[0].replace(/^ {4}/gm, '');
-      this.tokens.push({
-        type: 'code',
-        text: !this.options.pedantic
-          ? cap.replace(/\n+$/, '')
-          : cap
-      });
-      continue;
-    }
+        context.on('exit.intro', function() {
+            return continueTo(searchPresets);
+        });
 
-    // fences (gfm)
-    if (cap = this.rules.fences.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'code',
-        lang: cap[2],
-        text: cap[3] || ''
-      });
-      continue;
+        function continueTo(nextStep) {
+            if (watcher) window.clearInterval(watcher);
+            context.on('exit.intro', null);
+            nextStep();
+        }
     }
 
-    // heading
-    if (cap = this.rules.heading.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'heading',
-        depth: cap[1].length,
-        text: cap[2]
-      });
-      continue;
-    }
 
-    // table no leading pipe (gfm)
-    if (top && (cap = this.rules.nptable.exec(src))) {
-      src = src.substring(cap[0].length);
+    function describePlayground() {
+        if (!areaId || !context.hasEntity(areaId)) {
+            return addArea();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
+            return searchPresets();
+        }
 
-      item = {
-        type: 'table',
-        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
-        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
-        cells: cap[3].replace(/\n$/, '').split('\n')
-      };
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-      for (i = 0; i < item.align.length; i++) {
-        if (/^ *-+: *$/.test(item.align[i])) {
-          item.align[i] = 'right';
-        } else if (/^ *:-+: *$/.test(item.align[i])) {
-          item.align[i] = 'center';
-        } else if (/^ *:-+ *$/.test(item.align[i])) {
-          item.align[i] = 'left';
-        } else {
-          item.align[i] = null;
+        if (d3_select('.form-field-description').empty()) {
+            return continueTo(retryChooseDescription);
         }
-      }
 
-      for (i = 0; i < item.cells.length; i++) {
-        item.cells[i] = item.cells[i].split(/ *\| */);
-      }
+        context.on('exit.intro', function() {
+            continueTo(play);
+        });
 
-      this.tokens.push(item);
+        reveal('.entity-editor-pane',
+            t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
+            { duration: 300 }
+        );
 
-      continue;
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
     }
 
-    // lheading
-    if (cap = this.rules.lheading.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'heading',
-        depth: cap[2] === '=' ? 1 : 2,
-        text: cap[1]
-      });
-      continue;
-    }
 
-    // hr
-    if (cap = this.rules.hr.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'hr'
-      });
-      continue;
-    }
+    function retryChooseDescription() {
+        if (!areaId || !context.hasEntity(areaId)) {
+            return addArea();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
+            return searchPresets();
+        }
 
-    // blockquote
-    if (cap = this.rules.blockquote.exec(src)) {
-      src = src.substring(cap[0].length);
+        // reset pane, in case user happened to change it..
+        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-      this.tokens.push({
-        type: 'blockquote_start'
-      });
+        reveal('.entity-editor-pane',
+            t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
+            buttonText: t('intro.ok'),
+            buttonCallback: function() { continueTo(clickAddField); }
+        });
 
-      cap = cap[0].replace(/^ *> ?/gm, '');
+        context.on('exit.intro', function() {
+            return continueTo(searchPresets);
+        });
 
-      // Pass `top` to keep the current
-      // "toplevel" state. This is exactly
-      // how markdown.pl works.
-      this.token(cap, top, true);
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
 
-      this.tokens.push({
-        type: 'blockquote_end'
-      });
 
-      continue;
+    function play() {
+        dispatch$$1.call('done');
+        reveal('#id-container',
+            t('intro.areas.play', { next: t('intro.lines.title') }), {
+                tooltipBox: '.intro-nav-wrap .chapter-line',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { reveal('#id-container'); }
+            }
+        );
     }
 
-    // list
-    if (cap = this.rules.list.exec(src)) {
-      src = src.substring(cap[0].length);
-      bull = cap[2];
 
-      this.tokens.push({
-        type: 'list_start',
-        ordered: bull.length > 1
-      });
+    chapter.enter = function() {
+        addArea();
+    };
 
-      // Get each top-level item.
-      cap = cap[0].match(this.rules.item);
 
-      next = false;
-      l = cap.length;
-      i = 0;
-
-      for (; i < l; i++) {
-        item = cap[i];
+    chapter.exit = function() {
+        timeouts.forEach(window.clearTimeout);
+        context.on('enter.intro exit.intro', null);
+        context.map().on('move.intro drawn.intro', null);
+        context.history().on('change.intro', null);
+        d3_select('.inspector-wrap').on('wheel.intro', null);
+        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+        d3_select('.more-fields .combobox-input').on('click.intro', null);
+    };
 
-        // Remove the list item's bullet
-        // so it is seen as the next token.
-        space = item.length;
-        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
 
-        // Outdent whatever the
-        // list item contains. Hacky.
-        if (~item.indexOf('\n ')) {
-          space -= item.length;
-          item = !this.options.pedantic
-            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
-            : item.replace(/^ {1,4}/gm, '');
-        }
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
+    };
 
-        // Determine whether the next list item belongs here.
-        // Backpedal if it does not belong in this list.
-        if (this.options.smartLists && i !== l - 1) {
-          b = block.bullet.exec(cap[i + 1])[0];
-          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
-            src = cap.slice(i + 1).join('\n') + src;
-            i = l - 1;
-          }
-        }
 
-        // Determine whether item is loose or not.
-        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
-        // for discount behavior.
-        loose = next || /\n\n(?!\s*$)/.test(item);
-        if (i !== l - 1) {
-          next = item.charAt(item.length - 1) === '\n';
-          if (!loose) loose = next;
-        }
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-        this.tokens.push({
-          type: loose
-            ? 'loose_item_start'
-            : 'list_item_start'
-        });
+function uiIntroLine(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        timeouts = [],
+        tulipRoadId = null,
+        flowerRoadId = 'w646',
+        tulipRoadStart = [-85.6297754121684, 41.95805253325314],
+        tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
+        tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
+        roadCategory = context.presets().item('category-road'),
+        residentialPreset = context.presets().item('highway/residential'),
+        woodRoadId = 'w525',
+        woodRoadEndId = 'n2862',
+        woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
+        woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
+        woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
+        washingtonStreetId = 'w522',
+        twelfthAvenueId = 'w1',
+        eleventhAvenueEndId = 'n3550',
+        twelfthAvenueEndId = 'n5',
+        washingtonSegmentId = null,
+        eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
+        twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
+        deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
+        twelfthAvenue = [-85.62219310052491, 41.952505413152956];
 
-        // Recurse.
-        this.token(item, false, bq);
 
-        this.tokens.push({
-          type: 'list_item_end'
-        });
-      }
+    var chapter = {
+        title: 'intro.lines.title'
+    };
 
-      this.tokens.push({
-        type: 'list_end'
-      });
 
-      continue;
+    function timeout(f, t$$1) {
+        timeouts.push(window.setTimeout(f, t$$1));
     }
 
-    // html
-    if (cap = this.rules.html.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: this.options.sanitize
-          ? 'paragraph'
-          : 'html',
-        pre: !this.options.sanitizer
-          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
-        text: cap[0]
-      });
-      continue;
-    }
 
-    // def
-    if ((!bq && top) && (cap = this.rules.def.exec(src))) {
-      src = src.substring(cap[0].length);
-      this.tokens.links[cap[1].toLowerCase()] = {
-        href: cap[2],
-        title: cap[3]
-      };
-      continue;
+    function eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
     }
 
-    // table (gfm)
-    if (top && (cap = this.rules.table.exec(src))) {
-      src = src.substring(cap[0].length);
 
-      item = {
-        type: 'table',
-        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
-        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
-        cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
-      };
+    function revealEditMenu(loc, text, options) {
+        var rect = context.surfaceRect();
+        var point = context.curtainProjection(loc);
+        var pad = 40;
+        var width = 250 + (2 * pad);
+        var height = 350;
+        var startX = rect.left + point[0];
+        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
+        var box = {
+            left: left,
+            top: point[1] + rect.top - 60,
+            width: width,
+            height: height
+        };
+        reveal(box, text, options);
+    }
 
-      for (i = 0; i < item.align.length; i++) {
-        if (/^ *-+: *$/.test(item.align[i])) {
-          item.align[i] = 'right';
-        } else if (/^ *:-+: *$/.test(item.align[i])) {
-          item.align[i] = 'center';
-        } else if (/^ *:-+ *$/.test(item.align[i])) {
-          item.align[i] = 'left';
-        } else {
-          item.align[i] = null;
-        }
-      }
 
-      for (i = 0; i < item.cells.length; i++) {
-        item.cells[i] = item.cells[i]
-          .replace(/^ *\| *| *\| *$/g, '')
-          .split(/ *\| */);
-      }
+    function addLine() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
 
-      this.tokens.push(item);
+        var msec = transitionTime(tulipRoadStart, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
 
-      continue;
-    }
+        timeout(function() {
+            var tooltip = reveal('button.add-line',
+                t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
 
-    // top-level paragraph
-    if (top && (cap = this.rules.paragraph.exec(src))) {
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'paragraph',
-        text: cap[1].charAt(cap[1].length - 1) === '\n'
-          ? cap[1].slice(0, -1)
-          : cap[1]
-      });
-      continue;
-    }
+            tooltip.selectAll('.tooltip-inner')
+                .insert('svg', 'span')
+                .attr('class', 'tooltip-illustration')
+                .append('use')
+                .attr('xlink:href', '#feature-images');
 
-    // text
-    if (cap = this.rules.text.exec(src)) {
-      // Top-level should never reach here.
-      src = src.substring(cap[0].length);
-      this.tokens.push({
-        type: 'text',
-        text: cap[0]
-      });
-      continue;
-    }
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'add-line') return;
+                continueTo(startLine);
+            });
+        }, msec + 100);
 
-    if (src) {
-      throw new
-        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-  }
-
-  return this.tokens;
-};
-
-/**
- * Inline-Level Grammar
- */
 
-var inline = {
-  escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
-  autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
-  url: noop,
-  tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
-  link: /^!?\[(inside)\]\(href\)/,
-  reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
-  nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
-  strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
-  em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-  code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
-  br: /^ {2,}\n(?!\s*$)/,
-  del: noop,
-  text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
-};
 
-inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
-inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
+    function startLine() {
+        if (context.mode().id !== 'add-line') {
+            return chapter.restart();
+        }
 
-inline.link = replace(inline.link)
-  ('inside', inline._inside)
-  ('href', inline._href)
-  ();
+        tulipRoadId = null;
 
-inline.reflink = replace(inline.reflink)
-  ('inside', inline._inside)
-  ();
+        var padding = 70 * Math.pow(2, context.map().zoom() - 18);
+        var box = pad$1(tulipRoadStart, padding, context);
+        box.height = box.height + 100;
+        reveal(box, t('intro.lines.start_line'));
 
-/**
- * Normal Inline Grammar
- */
+        context.map().on('move.intro drawn.intro', function() {
+            padding = 70 * Math.pow(2, context.map().zoom() - 18);
+            box = pad$1(tulipRoadStart, padding, context);
+            box.height = box.height + 100;
+            reveal(box, t('intro.lines.start_line'), { duration: 0 });
+        });
 
-inline.normal = merge({}, inline);
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'draw-line') return chapter.restart();
+            continueTo(drawLine);
+        });
 
-/**
- * Pedantic Inline Grammar
- */
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-inline.pedantic = merge({}, inline.normal, {
-  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
-});
 
-/**
- * GFM Inline Grammar
- */
+    function drawLine() {
+        if (context.mode().id !== 'draw-line') {
+            return chapter.restart();
+        }
 
-inline.gfm = merge({}, inline.normal, {
-  escape: replace(inline.escape)('])', '~|])')(),
-  url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
-  del: /^~~(?=\S)([\s\S]*?\S)~~/,
-  text: replace(inline.text)
-    (']|', '~]|')
-    ('|', '|https?://|')
-    ()
-});
+        tulipRoadId = context.mode().selectedIDs()[0];
+        context.map().centerEase(tulipRoadMidpoint, 500);
 
-/**
- * GFM + Line Breaks Inline Grammar
- */
+        timeout(function() {
+            var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+            var box = pad$1(tulipRoadMidpoint, padding, context);
+            box.height = box.height * 2;
+            reveal(box,
+                t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
+            );
 
-inline.breaks = merge({}, inline.gfm, {
-  br: replace(inline.br)('{2,}', '*')(),
-  text: replace(inline.gfm.text)('{2,}', '*')()
-});
+            context.map().on('move.intro drawn.intro', function() {
+                padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
+                box = pad$1(tulipRoadMidpoint, padding, context);
+                box.height = box.height * 2;
+                reveal(box,
+                    t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
+                    { duration: 0 }
+                );
+            });
+        }, 550);  // after easing..
 
-/**
- * Inline Lexer & Compiler
- */
+        context.history().on('change.intro', function() {
+            var entity = tulipRoadId && context.hasEntity(tulipRoadId);
+            if (!entity) return chapter.restart();
 
-function InlineLexer(links, options) {
-  this.options = options || marked.defaults;
-  this.links = links;
-  this.rules = inline.normal;
-  this.renderer = this.options.renderer || new Renderer;
-  this.renderer.options = this.options;
+            if (isLineConnected()) {
+                continueTo(continueLine);
+            }
+        });
 
-  if (!this.links) {
-    throw new
-      Error('Tokens array requires a `links` property.');
-  }
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-line')
+                return;
+            else if (mode.id === 'select') {
+                continueTo(retryIntersect);
+                return;
+            }
+            else
+                return chapter.restart();
+        });
 
-  if (this.options.gfm) {
-    if (this.options.breaks) {
-      this.rules = inline.breaks;
-    } else {
-      this.rules = inline.gfm;
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-  } else if (this.options.pedantic) {
-    this.rules = inline.pedantic;
-  }
-}
 
-/**
- * Expose Inline Rules
- */
 
-InlineLexer.rules = inline;
+    function isLineConnected() {
+        var entity = tulipRoadId && context.hasEntity(tulipRoadId);
+        if (!entity) return false;
 
-/**
- * Static Lexing/Compiling Method
- */
+        var drawNodes = context.graph().childNodes(entity);
+        return some(drawNodes, function(node) {
+            return some(context.graph().parentWays(node), function(parent) {
+                return parent.id === flowerRoadId;
+            });
+        });
+    }
 
-InlineLexer.output = function(src, links, options) {
-  var inline = new InlineLexer(links, options);
-  return inline.output(src);
-};
 
-/**
- * Lexing/Compiling
- */
+    function retryIntersect() {
+        d3_select(window).on('mousedown.intro', eventCancel, true);
 
-InlineLexer.prototype.output = function(src) {
-  var out = ''
-    , link
-    , text
-    , href
-    , cap;
+        var box = pad$1(tulipRoadIntersection, 80, context);
+        reveal(box,
+            t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
+        );
 
-  while (src) {
-    // escape
-    if (cap = this.rules.escape.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += cap[1];
-      continue;
+        timeout(chapter.restart, 3000);
     }
 
-    // autolink
-    if (cap = this.rules.autolink.exec(src)) {
-      src = src.substring(cap[0].length);
-      if (cap[2] === '@') {
-        text = cap[1].charAt(6) === ':'
-          ? this.mangle(cap[1].substring(7))
-          : this.mangle(cap[1]);
-        href = this.mangle('mailto:') + text;
-      } else {
-        text = escape(cap[1]);
-        href = text;
-      }
-      out += this.renderer.link(href, null, text);
-      continue;
-    }
 
-    // url (gfm)
-    if (!this.inLink && (cap = this.rules.url.exec(src))) {
-      src = src.substring(cap[0].length);
-      text = escape(cap[1]);
-      href = text;
-      out += this.renderer.link(href, null, text);
-      continue;
-    }
+    function continueLine() {
+        if (context.mode().id !== 'draw-line') return chapter.restart();
+        var entity = tulipRoadId && context.hasEntity(tulipRoadId);
+        if (!entity) return chapter.restart();
 
-    // tag
-    if (cap = this.rules.tag.exec(src)) {
-      if (!this.inLink && /^<a /i.test(cap[0])) {
-        this.inLink = true;
-      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
-        this.inLink = false;
-      }
-      src = src.substring(cap[0].length);
-      out += this.options.sanitize
-        ? this.options.sanitizer
-          ? this.options.sanitizer(cap[0])
-          : escape(cap[0])
-        : cap[0];
-      continue;
-    }
+        context.map().centerEase(tulipRoadIntersection, 500);
 
-    // link
-    if (cap = this.rules.link.exec(src)) {
-      src = src.substring(cap[0].length);
-      this.inLink = true;
-      out += this.outputLink(cap, {
-        href: cap[2],
-        title: cap[3]
-      });
-      this.inLink = false;
-      continue;
-    }
+        reveal('#surface', t('intro.lines.continue_line'));
 
-    // reflink, nolink
-    if ((cap = this.rules.reflink.exec(src))
-        || (cap = this.rules.nolink.exec(src))) {
-      src = src.substring(cap[0].length);
-      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
-      link = this.links[link.toLowerCase()];
-      if (!link || !link.href) {
-        out += cap[0].charAt(0);
-        src = cap[0].substring(1) + src;
-        continue;
-      }
-      this.inLink = true;
-      out += this.outputLink(cap, link);
-      this.inLink = false;
-      continue;
-    }
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-line')
+                return;
+            else if (mode.id === 'select')
+                return continueTo(chooseCategoryRoad);
+            else
+                return chapter.restart();
+        });
 
-    // strong
-    if (cap = this.rules.strong.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.strong(this.output(cap[2] || cap[1]));
-      continue;
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
 
-    // em
-    if (cap = this.rules.em.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.em(this.output(cap[2] || cap[1]));
-      continue;
-    }
 
-    // code
-    if (cap = this.rules.code.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.codespan(escape(cap[2], true));
-      continue;
-    }
+    function chooseCategoryRoad() {
+        if (context.mode().id !== 'select') {
+            return chapter.restart();
+        }
 
-    // br
-    if (cap = this.rules.br.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.br();
-      continue;
-    }
+        context.on('exit.intro', function() {
+            return chapter.restart();
+        });
 
-    // del (gfm)
-    if (cap = this.rules.del.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.del(this.output(cap[1]));
-      continue;
+        var button = d3_select('.preset-category-road .preset-list-button');
+        if (button.empty()) return chapter.restart();
+
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+
+            reveal(button.node(),
+                t('intro.lines.choose_category_road', { category: roadCategory.name() })
+            );
+
+            button.on('click.intro', function() {
+                continueTo(choosePresetResidential);
+            });
+
+        }, 400);  // after editor pane visible
+
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.preset-list-button').on('click.intro', null);
+            context.on('exit.intro', null);
+            nextStep();
+        }
     }
 
-    // text
-    if (cap = this.rules.text.exec(src)) {
-      src = src.substring(cap[0].length);
-      out += this.renderer.text(escape(this.smartypants(cap[0])));
-      continue;
+
+    function choosePresetResidential() {
+        if (context.mode().id !== 'select') {
+            return chapter.restart();
+        }
+
+        context.on('exit.intro', function() {
+            return chapter.restart();
+        });
+
+        var subgrid = d3_select('.preset-category-road .subgrid');
+        if (subgrid.empty()) return chapter.restart();
+
+        subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
+            .on('click.intro', function() {
+                continueTo(retryPresetResidential);
+            });
+
+        subgrid.selectAll('.preset-highway-residential .preset-list-button')
+            .on('click.intro', function() {
+                continueTo(nameRoad);
+            });
+
+        timeout(function() {
+            reveal(subgrid.node(),
+                t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
+                { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
+            );
+        }, 300);
+
+        function continueTo(nextStep) {
+            d3_select('.preset-list-button').on('click.intro', null);
+            context.on('exit.intro', null);
+            nextStep();
+        }
     }
 
-    if (src) {
-      throw new
-        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+
+    // selected wrong road type
+    function retryPresetResidential() {
+        if (context.mode().id !== 'select') {
+            return chapter.restart();
+        }
+
+        context.on('exit.intro', function() {
+            return chapter.restart();
+        });
+
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+
+        timeout(function() {
+            var button = d3_select('.entity-editor-pane .preset-list-button');
+
+            reveal(button.node(),
+                t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
+            );
+
+            button.on('click.intro', function() {
+                continueTo(chooseCategoryRoad);
+            });
+
+        }, 500);
+
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.preset-list-button').on('click.intro', null);
+            context.on('exit.intro', null);
+            nextStep();
+        }
     }
-  }
 
-  return out;
-};
 
-/**
- * Compile Link
- */
+    function nameRoad() {
+        context.on('exit.intro', function() {
+            continueTo(didNameRoad);
+        });
 
-InlineLexer.prototype.outputLink = function(cap, link) {
-  var href = escape(link.href)
-    , title = link.title ? escape(link.title) : null;
+        timeout(function() {
+            reveal('.entity-editor-pane',
+                t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
+                { tooltipClass: 'intro-lines-name_road' }
+            );
+        }, 500);
 
-  return cap[0].charAt(0) !== '!'
-    ? this.renderer.link(href, title, this.output(cap[1]))
-    : this.renderer.image(href, title, escape(cap[1]));
-};
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
 
-/**
- * Smartypants Transformations
- */
 
-InlineLexer.prototype.smartypants = function(text) {
-  if (!this.options.smartypants) return text;
-  return text
-    // em-dashes
-    .replace(/---/g, '\u2014')
-    // en-dashes
-    .replace(/--/g, '\u2013')
-    // opening singles
-    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
-    // closing singles & apostrophes
-    .replace(/'/g, '\u2019')
-    // opening doubles
-    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
-    // closing doubles
-    .replace(/"/g, '\u201d')
-    // ellipses
-    .replace(/\.{3}/g, '\u2026');
-};
+    function didNameRoad() {
+        context.history().checkpoint('doneAddLine');
 
-/**
- * Mangle Links
- */
+        timeout(function() {
+            reveal('#surface', t('intro.lines.did_name_road'), {
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { continueTo(updateLine); }
+            });
+        }, 500);
 
-InlineLexer.prototype.mangle = function(text) {
-  if (!this.options.mangle) return text;
-  var out = ''
-    , l = text.length
-    , i = 0
-    , ch;
+        function continueTo(nextStep) {
+            nextStep();
+        }
+    }
 
-  for (; i < l; i++) {
-    ch = text.charCodeAt(i);
-    if (Math.random() > 0.5) {
-      ch = 'x' + ch.toString(16);
+
+    function updateLine() {
+        context.history().reset('doneAddLine');
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return chapter.restart();
+        }
+
+        var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
+
+        timeout(function() {
+            var padding = 250 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadDragMidpoint, padding, context);
+            var advance = function() { continueTo(addNode); };
+
+            reveal(box, t('intro.lines.update_line'),
+                { buttonText: t('intro.ok'), buttonCallback: advance }
+            );
+
+            context.map().on('move.intro drawn.intro', function() {
+                var padding = 250 * Math.pow(2, context.map().zoom() - 19);
+                var box = pad$1(woodRoadDragMidpoint, padding, context);
+                reveal(box, t('intro.lines.update_line'),
+                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
+                );
+            });
+        }, msec + 100);
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
     }
-    out += '&#' + ch + ';';
-  }
 
-  return out;
-};
 
-/**
- * Renderer
- */
+    function addNode() {
+        context.history().reset('doneAddLine');
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return chapter.restart();
+        }
 
-function Renderer(options) {
-  this.options = options || {};
-}
+        var padding = 40 * Math.pow(2, context.map().zoom() - 19);
+        var box = pad$1(woodRoadAddNode, padding, context);
+        reveal(box, t('intro.lines.add_node'));
 
-Renderer.prototype.code = function(code, lang, escaped) {
-  if (this.options.highlight) {
-    var out = this.options.highlight(code, lang);
-    if (out != null && out !== code) {
-      escaped = true;
-      code = out;
+        context.map().on('move.intro drawn.intro', function() {
+            var padding = 40 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadAddNode, padding, context);
+            reveal(box, t('intro.lines.add_node'), { duration: 0 });
+        });
+
+        context.history().on('change.intro', function(changed) {
+            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+                return continueTo(updateLine);
+            }
+            if (changed.created().length === 1) {
+                timeout(function() { continueTo(startDragEndpoint); }, 500);
+            }
+        });
+
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'select') {
+                continueTo(updateLine);
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-  }
 
-  if (!lang) {
-    return '<pre><code>'
-      + (escaped ? code : escape(code, true))
-      + '\n</code></pre>';
-  }
 
-  return '<pre><code class="'
-    + this.options.langPrefix
-    + escape(lang, true)
-    + '">'
-    + (escaped ? code : escape(code, true))
-    + '\n</code></pre>\n';
-};
+    function startDragEndpoint() {
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return continueTo(updateLine);
+        }
+        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+        var box = pad$1(woodRoadDragEndpoint, padding, context);
+        reveal(box, t('intro.lines.start_drag_endpoint'));
 
-Renderer.prototype.blockquote = function(quote) {
-  return '<blockquote>\n' + quote + '</blockquote>\n';
-};
+        context.map().on('move.intro drawn.intro', function() {
+            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+                return continueTo(updateLine);
+            }
+            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadDragEndpoint, padding, context);
+            reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
 
-Renderer.prototype.html = function(html) {
-  return html;
-};
+            var entity = context.entity(woodRoadEndId);
+            if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
+                continueTo(finishDragEndpoint);
+            }
+        });
 
-Renderer.prototype.heading = function(text, level, raw) {
-  return '<h'
-    + level
-    + ' id="'
-    + this.options.headerPrefix
-    + raw.toLowerCase().replace(/[^\w]+/g, '-')
-    + '">'
-    + text
-    + '</h'
-    + level
-    + '>\n';
-};
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
+    }
 
-Renderer.prototype.hr = function() {
-  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
-};
 
-Renderer.prototype.list = function(body, ordered) {
-  var type = ordered ? 'ol' : 'ul';
-  return '<' + type + '>\n' + body + '</' + type + '>\n';
-};
+    function finishDragEndpoint() {
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return continueTo(updateLine);
+        }
 
-Renderer.prototype.listitem = function(text) {
-  return '<li>' + text + '</li>\n';
-};
+        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+        var box = pad$1(woodRoadDragEndpoint, padding, context);
+        reveal(box, t('intro.lines.finish_drag_endpoint'));
 
-Renderer.prototype.paragraph = function(text) {
-  return '<p>' + text + '</p>\n';
-};
+        context.map().on('move.intro drawn.intro', function() {
+            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+                return continueTo(updateLine);
+            }
+            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadDragEndpoint, padding, context);
+            reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
 
-Renderer.prototype.table = function(header, body) {
-  return '<table>\n'
-    + '<thead>\n'
-    + header
-    + '</thead>\n'
-    + '<tbody>\n'
-    + body
-    + '</tbody>\n'
-    + '</table>\n';
-};
+            var entity = context.entity(woodRoadEndId);
+            if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
+                continueTo(startDragEndpoint);
+            }
+        });
 
-Renderer.prototype.tablerow = function(content) {
-  return '<tr>\n' + content + '</tr>\n';
-};
+        context.on('enter.intro', function() {
+            continueTo(startDragMidpoint);
+        });
 
-Renderer.prototype.tablecell = function(content, flags) {
-  var type = flags.header ? 'th' : 'td';
-  var tag = flags.align
-    ? '<' + type + ' style="text-align:' + flags.align + '">'
-    : '<' + type + '>';
-  return tag + content + '</' + type + '>\n';
-};
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-// span level renderer
-Renderer.prototype.strong = function(text) {
-  return '<strong>' + text + '</strong>';
-};
 
-Renderer.prototype.em = function(text) {
-  return '<em>' + text + '</em>';
-};
+    function startDragMidpoint() {
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return continueTo(updateLine);
+        }
+        if (context.selectedIDs().indexOf(woodRoadId) === -1) {
+            context.enter(modeSelect(context, [woodRoadId]));
+        }
 
-Renderer.prototype.codespan = function(text) {
-  return '<code>' + text + '</code>';
-};
+        var padding = 80 * Math.pow(2, context.map().zoom() - 19);
+        var box = pad$1(woodRoadDragMidpoint, padding, context);
+        reveal(box, t('intro.lines.start_drag_midpoint'));
 
-Renderer.prototype.br = function() {
-  return this.options.xhtml ? '<br/>' : '<br>';
-};
+        context.map().on('move.intro drawn.intro', function() {
+            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+                return continueTo(updateLine);
+            }
+            var padding = 80 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadDragMidpoint, padding, context);
+            reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
+        });
 
-Renderer.prototype.del = function(text) {
-  return '<del>' + text + '</del>';
-};
+        context.history().on('change.intro', function(changed) {
+            if (changed.created().length === 1) {
+                continueTo(continueDragMidpoint);
+            }
+        });
 
-Renderer.prototype.link = function(href, title, text) {
-  if (this.options.sanitize) {
-    try {
-      var prot = decodeURIComponent(unescape(href))
-        .replace(/[^\w:]/g, '')
-        .toLowerCase();
-    } catch (e) {
-      return '';
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'select') {
+                // keep Wood Road selected so midpoint triangles are drawn..
+                context.enter(modeSelect(context, [woodRoadId]));
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
-      return '';
+
+
+    function continueDragMidpoint() {
+        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+            return continueTo(updateLine);
+        }
+
+        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+        var box = pad$1(woodRoadDragEndpoint, padding, context);
+        box.height += 400;
+
+        var advance = function() {
+            context.history().checkpoint('doneUpdateLine');
+            continueTo(deleteLines);
+        };
+
+        reveal(box, t('intro.lines.continue_drag_midpoint'),
+            { buttonText: t('intro.ok'), buttonCallback: advance }
+        );
+
+        context.map().on('move.intro drawn.intro', function() {
+            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
+                return continueTo(updateLine);
+            }
+            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
+            var box = pad$1(woodRoadDragEndpoint, padding, context);
+            box.height += 400;
+            reveal(box, t('intro.lines.continue_drag_midpoint'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
+            );
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
     }
-  }
-  var out = '<a href="' + href + '"';
-  if (title) {
-    out += ' title="' + title + '"';
-  }
-  out += '>' + text + '</a>';
-  return out;
-};
 
-Renderer.prototype.image = function(href, title, text) {
-  var out = '<img src="' + href + '" alt="' + text + '"';
-  if (title) {
-    out += ' title="' + title + '"';
-  }
-  out += this.options.xhtml ? '/>' : '>';
-  return out;
-};
 
-Renderer.prototype.text = function(text) {
-  return text;
-};
+    function deleteLines() {
+        context.history().reset('doneUpdateLine');
+        context.enter(modeBrowse(context));
+
+        if (!context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return chapter.restart();
+        }
+
+        var msec = transitionTime(deleteLinesLoc, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(18).centerEase(deleteLinesLoc, msec);
+
+        timeout(function() {
+            var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+            var box = pad$1(deleteLinesLoc, padding, context);
+            box.top -= 200;
+            box.height += 400;
+            var advance = function() { continueTo(rightClickIntersection); };
+
+            reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
+                { buttonText: t('intro.ok'), buttonCallback: advance }
+            );
+
+            context.map().on('move.intro drawn.intro', function() {
+                var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+                var box = pad$1(deleteLinesLoc, padding, context);
+                box.top -= 200;
+                box.height += 400;
+                reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
+                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
+                );
+            });
+
+            context.history().on('change.intro', function() {
+                timeout(function() {
+                    continueTo(deleteLines);
+                }, 500);  // after any transition (e.g. if user deleted intersection)
+            });
+
+        }, msec + 100);
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function rightClickIntersection() {
+        context.history().reset('doneUpdateLine');
+        context.enter(modeBrowse(context));
+
+        context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
+
+        timeout(function() {
+            var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+            var box = pad$1(eleventhAvenueEnd, padding, context);
+            reveal(box, t('intro.lines.rightclick_intersection',
+                { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
+            );
+
+            context.map().on('move.intro drawn.intro', function() {
+                var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+                var box = pad$1(eleventhAvenueEnd, padding, context);
+                reveal(box, t('intro.lines.rightclick_intersection',
+                    { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
+                    { duration: 0 }
+                );
+            });
+
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'select') return;
+                var ids = context.selectedIDs();
+                if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
+
+                timeout(function() {
+                    var node = selectMenuItem('split').node();
+                    if (!node) return;
+                    continueTo(splitIntersection);
+                }, 300);  // after menu visible
+            });
+
+            context.history().on('change.intro', function() {
+                timeout(function() {
+                    continueTo(deleteLines);
+                }, 300);  // after any transition (e.g. if user deleted intersection)
+            });
+
+        }, 600);
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function splitIntersection() {
+        if (!context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return continueTo(deleteLines);
+        }
+
+        var node = selectMenuItem('split').node();
+        if (!node) { return continueTo(rightClickIntersection); }
+
+        var wasChanged = false;
+        var menuCoords = context.map().mouseCoordinates();
+        washingtonSegmentId = null;
+
+        revealEditMenu(menuCoords, t('intro.lines.split_intersection',
+            { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
+        );
+
+        context.map().on('move.intro drawn.intro', function() {
+            var node = selectMenuItem('split').node();
+            if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
+
+            revealEditMenu(menuCoords, t('intro.lines.split_intersection',
+                { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
+                { duration: 0 }
+            );
+        });
+
+        context.history().on('change.intro', function(changed) {
+            wasChanged = true;
+            timeout(function() {
+                if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
+                    washingtonSegmentId = changed.created()[0].id;
+                    continueTo(didSplit);
+                } else {
+                    washingtonSegmentId = null;
+                    continueTo(retrySplit);
+                }
+            }, 300);  // after any transition (e.g. if user deleted intersection)
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function retrySplit() {
+        context.enter(modeBrowse(context));
+        context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
+        var advance = function() { continueTo(rightClickIntersection); };
+
+        var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+        var box = pad$1(eleventhAvenueEnd, padding, context);
+        reveal(box, t('intro.lines.retry_split'),
+            { buttonText: t('intro.ok'), buttonCallback: advance }
+        );
+
+        context.map().on('move.intro drawn.intro', function() {
+            var padding = 60 * Math.pow(2, context.map().zoom() - 18);
+            var box = pad$1(eleventhAvenueEnd, padding, context);
+            reveal(box, t('intro.lines.retry_split'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
+            );
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function didSplit() {
+        if (!washingtonSegmentId ||
+            !context.hasEntity(washingtonSegmentId) ||
+            !context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return continueTo(rightClickIntersection);
+        }
+
+        var ids = context.selectedIDs();
+        var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
+        var street = t('intro.graph.name.washington-street');
+
+        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+        var box = pad$1(twelfthAvenue, padding, context);
+        box.width = box.width / 2;
+        reveal(box, t(string, { street1: street, street2: street }),
+            { duration: 500 }
+        );
+
+        timeout(function() {
+            context.map().zoom(18).centerEase(twelfthAvenue, 500);
+
+            context.map().on('move.intro drawn.intro', function() {
+                var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+                var box = pad$1(twelfthAvenue, padding, context);
+                box.width = box.width / 2;
+                reveal(box, t(string, { street1: street, street2: street }),
+                    { duration: 0 }
+                );
+            });
+        }, 600);  // after initial reveal and curtain cut
+
+        context.on('enter.intro', function() {
+            var ids = context.selectedIDs();
+            if (ids.length === 1 && ids[0] === washingtonSegmentId) {
+                continueTo(multiSelect);
+            }
+        });
+
+        context.history().on('change.intro', function() {
+            if (!washingtonSegmentId ||
+                !context.hasEntity(washingtonSegmentId) ||
+                !context.hasEntity(washingtonStreetId) ||
+                !context.hasEntity(twelfthAvenueId) ||
+                !context.hasEntity(eleventhAvenueEndId)) {
+                return continueTo(rightClickIntersection);
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function multiSelect() {
+        if (!washingtonSegmentId ||
+            !context.hasEntity(washingtonSegmentId) ||
+            !context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return continueTo(rightClickIntersection);
+        }
+
+        var ids = context.selectedIDs();
+        var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
+        var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
+
+        if (hasWashington && hasTwelfth) {
+            return continueTo(multiRightClick);
+        } else if (!hasWashington && !hasTwelfth) {
+            return continueTo(didSplit);
+        }
+
+        context.map().zoom(18).centerEase(twelfthAvenue, 500);
+
+        timeout(function() {
+            var selected, other, padding, box;
+            if (hasWashington) {
+                selected = t('intro.graph.name.washington-street');
+                other = t('intro.graph.name.12th-avenue');
+                padding = 60 * Math.pow(2, context.map().zoom() - 18);
+                box = pad$1(twelfthAvenueEnd, padding, context);
+                box.width *= 3;
+            } else {
+                selected = t('intro.graph.name.12th-avenue');
+                other = t('intro.graph.name.washington-street');
+                padding = 200 * Math.pow(2, context.map().zoom() - 18);
+                box = pad$1(twelfthAvenue, padding, context);
+                box.width /= 2;
+            }
+
+            reveal(box,
+                t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
+            );
+
+            context.map().on('move.intro drawn.intro', function() {
+                if (hasWashington) {
+                    selected = t('intro.graph.name.washington-street');
+                    other = t('intro.graph.name.12th-avenue');
+                    padding = 60 * Math.pow(2, context.map().zoom() - 18);
+                    box = pad$1(twelfthAvenueEnd, padding, context);
+                    box.width *= 3;
+                } else {
+                    selected = t('intro.graph.name.12th-avenue');
+                    other = t('intro.graph.name.washington-street');
+                    padding = 200 * Math.pow(2, context.map().zoom() - 18);
+                    box = pad$1(twelfthAvenue, padding, context);
+                    box.width /= 2;
+                }
+
+                reveal(box,
+                    t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
+                    { duration: 0 }
+                );
+            });
+
+            context.on('enter.intro', function() {
+                continueTo(multiSelect);
+            });
+
+            context.history().on('change.intro', function() {
+                if (!washingtonSegmentId ||
+                    !context.hasEntity(washingtonSegmentId) ||
+                    !context.hasEntity(washingtonStreetId) ||
+                    !context.hasEntity(twelfthAvenueId) ||
+                    !context.hasEntity(eleventhAvenueEndId)) {
+                    return continueTo(rightClickIntersection);
+                }
+            });
+        }, 600);
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function multiRightClick() {
+        if (!washingtonSegmentId ||
+            !context.hasEntity(washingtonSegmentId) ||
+            !context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return continueTo(rightClickIntersection);
+        }
+
+        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+        var box = pad$1(twelfthAvenue, padding, context);
+        reveal(box, t('intro.lines.multi_rightclick'));
+
+        context.map().on('move.intro drawn.intro', function() {
+            var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+            var box = pad$1(twelfthAvenue, padding, context);
+            reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
+        });
+
+        d3_select(window).on('click.intro contextmenu.intro', function() {
+            timeout(function() {
+                var ids = context.selectedIDs();
+                if (ids.length === 2 &&
+                    ids.indexOf(twelfthAvenueId) !== -1 &&
+                    ids.indexOf(washingtonSegmentId) !== -1) {
+                        var node = selectMenuItem('delete').node();
+                        if (!node) return;
+                        continueTo(multiDelete);
+                } else if (ids.length === 1 &&
+                    ids.indexOf(washingtonSegmentId) !== -1) {
+                    return continueTo(multiSelect);
+                } else {
+                    return continueTo(didSplit);
+                }
+            }, 300);  // after edit menu visible
+        }, true);
+
+        context.history().on('change.intro', function() {
+            if (!washingtonSegmentId ||
+                !context.hasEntity(washingtonSegmentId) ||
+                !context.hasEntity(washingtonStreetId) ||
+                !context.hasEntity(twelfthAvenueId) ||
+                !context.hasEntity(eleventhAvenueEndId)) {
+                return continueTo(rightClickIntersection);
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            d3_select(window).on('click.intro contextmenu.intro', null, true);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function multiDelete() {
+        if (!washingtonSegmentId ||
+            !context.hasEntity(washingtonSegmentId) ||
+            !context.hasEntity(washingtonStreetId) ||
+            !context.hasEntity(twelfthAvenueId) ||
+            !context.hasEntity(eleventhAvenueEndId)) {
+            return continueTo(rightClickIntersection);
+        }
+
+        var node = selectMenuItem('delete').node();
+        if (!node) return continueTo(multiRightClick);
+
+        var menuCoords = context.map().mouseCoordinates();
+        revealEditMenu(menuCoords,
+            t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
+        );
+
+        context.map().on('move.intro drawn.intro', function() {
+            revealEditMenu(menuCoords,
+                t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
+                { duration: 0 }
+            );
+        });
+
+        context.on('exit.intro', function() {
+            if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
+                return continueTo(multiSelect);  // left select mode but roads still exist
+            }
+        });
+
+        context.history().on('change.intro', function() {
+            if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
+                continueTo(retryDelete);         // changed something but roads still exist
+            } else {
+                continueTo(play);
+            }
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('exit.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function retryDelete() {
+        context.enter(modeBrowse(context));
+
+        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
+        var box = pad$1(twelfthAvenue, padding, context);
+        reveal(box, t('intro.lines.retry_delete'), {
+            buttonText: t('intro.ok'),
+            buttonCallback: function() { continueTo(multiSelect); }
+        });
+
+        function continueTo(nextStep) {
+            nextStep();
+        }
+    }
+
+
+    function play() {
+        dispatch$$1.call('done');
+        reveal('#id-container',
+            t('intro.lines.play', { next: t('intro.buildings.title') }), {
+                tooltipBox: '.intro-nav-wrap .chapter-building',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { reveal('#id-container'); }
+            }
+        );
+   }
+
+
+    chapter.enter = function() {
+        addLine();
+    };
+
+
+    chapter.exit = function() {
+        timeouts.forEach(window.clearTimeout);
+        d3_select(window).on('mousedown.intro', null, true);
+        context.on('enter.intro exit.intro', null);
+        context.map().on('move.intro drawn.intro', null);
+        context.history().on('change.intro', null);
+        d3_select('.inspector-wrap').on('wheel.intro', null);
+        d3_select('.preset-list-button').on('click.intro', null);
+    };
+
+
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
+    };
+
+
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
+
+function uiIntroBuilding(context, reveal) {
+    var dispatch$$1 = dispatch('done'),
+        house = [-85.62815, 41.95638],
+        tank = [-85.62732, 41.95347],
+        buildingCatetory = context.presets().item('category-building'),
+        housePreset = context.presets().item('building/house'),
+        tankPreset = context.presets().item('man_made/storage_tank'),
+        timeouts = [],
+        houseId = null,
+        tankId = null;
+
+
+    var chapter = {
+        title: 'intro.buildings.title'
+    };
+
+
+    function timeout(f, t$$1) {
+        timeouts.push(window.setTimeout(f, t$$1));
+    }
+
+
+    function eventCancel() {
+        event.stopPropagation();
+        event.preventDefault();
+    }
+
+
+    function revealHouse(center, text, options) {
+        var padding = 160 * Math.pow(2, context.map().zoom() - 20);
+        var box = pad$1(center, padding, context);
+        reveal(box, text, options);
+    }
 
-/**
- * Parsing & Compiling
- */
 
-function Parser(options) {
-  this.tokens = [];
-  this.token = null;
-  this.options = options || marked.defaults;
-  this.options.renderer = this.options.renderer || new Renderer;
-  this.renderer = this.options.renderer;
-  this.renderer.options = this.options;
-}
+    function revealTank(center, text, options) {
+        var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
+        var box = pad$1(center, padding, context);
+        reveal(box, text, options);
+    }
 
-/**
- * Static Parse Method
- */
 
-Parser.parse = function(src, options, renderer) {
-  var parser = new Parser(options, renderer);
-  return parser.parse(src);
-};
+    function revealEditMenu(loc, text, options) {
+        var rect = context.surfaceRect();
+        var point = context.curtainProjection(loc);
+        var pad = 40;
+        var width = 250 + (2 * pad);
+        var height = 350;
+        var startX = rect.left + point[0];
+        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
+        var box = {
+            left: left,
+            top: point[1] + rect.top - 60,
+            width: width,
+            height: height
+        };
+        reveal(box, text, options);
+    }
 
-/**
- * Parse Loop
- */
 
-Parser.prototype.parse = function(src) {
-  this.inline = new InlineLexer(src.links, this.options, this.renderer);
-  this.tokens = src.reverse();
+    function addHouse() {
+        context.enter(modeBrowse(context));
+        context.history().reset('initial');
+        houseId = null;
 
-  var out = '';
-  while (this.next()) {
-    out += this.tok();
-  }
+        var msec = transitionTime(house, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19).centerEase(house, msec);
 
-  return out;
-};
+        timeout(function() {
+            var tooltip = reveal('button.add-area',
+                t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
 
-/**
- * Next Token
- */
+            tooltip.selectAll('.tooltip-inner')
+                .insert('svg', 'span')
+                .attr('class', 'tooltip-illustration')
+                .append('use')
+                .attr('xlink:href', '#building-images');
 
-Parser.prototype.next = function() {
-  return this.token = this.tokens.pop();
-};
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'add-area') return;
+                continueTo(startHouse);
+            });
+        }, msec + 100);
 
-/**
- * Preview Next Token
- */
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-Parser.prototype.peek = function() {
-  return this.tokens[this.tokens.length - 1] || 0;
-};
 
-/**
- * Parse Text Tokens
- */
+    function startHouse() {
+        if (context.mode().id !== 'add-area') {
+            return continueTo(addHouse);
+        }
 
-Parser.prototype.parseText = function() {
-  var body = this.token.text;
+        houseId = null;
+        context.map().zoomEase(20, 500);
 
-  while (this.peek().type === 'text') {
-    body += '\n' + this.next().text;
-  }
+        timeout(function() {
+            revealHouse(house, t('intro.buildings.start_building'));
 
-  return this.inline.output(body);
-};
+            context.map().on('move.intro drawn.intro', function() {
+                revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
+            });
 
-/**
- * Parse Current Token
- */
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'draw-area') return chapter.restart();
+                continueTo(continueHouse);
+            });
 
-Parser.prototype.tok = function() {
-  switch (this.token.type) {
-    case 'space': {
-      return '';
-    }
-    case 'hr': {
-      return this.renderer.hr();
-    }
-    case 'heading': {
-      return this.renderer.heading(
-        this.inline.output(this.token.text),
-        this.token.depth,
-        this.token.text);
-    }
-    case 'code': {
-      return this.renderer.code(this.token.text,
-        this.token.lang,
-        this.token.escaped);
-    }
-    case 'table': {
-      var header = ''
-        , body = ''
-        , i
-        , row
-        , cell
-        , flags
-        , j;
+        }, 550);  // after easing
 
-      // header
-      cell = '';
-      for (i = 0; i < this.token.header.length; i++) {
-        flags = { header: true, align: this.token.align[i] };
-        cell += this.renderer.tablecell(
-          this.inline.output(this.token.header[i]),
-          { header: true, align: this.token.align[i] }
-        );
-      }
-      header += this.renderer.tablerow(cell);
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
+    }
 
-      for (i = 0; i < this.token.cells.length; i++) {
-        row = this.token.cells[i];
 
-        cell = '';
-        for (j = 0; j < row.length; j++) {
-          cell += this.renderer.tablecell(
-            this.inline.output(row[j]),
-            { header: false, align: this.token.align[j] }
-          );
+    function continueHouse() {
+        if (context.mode().id !== 'draw-area') {
+            return continueTo(addHouse);
         }
 
-        body += this.renderer.tablerow(cell);
-      }
-      return this.renderer.table(header, body);
-    }
-    case 'blockquote_start': {
-      var body = '';
+        houseId = null;
 
-      while (this.next().type !== 'blockquote_end') {
-        body += this.tok();
-      }
+        revealHouse(house, t('intro.buildings.continue_building'));
 
-      return this.renderer.blockquote(body);
-    }
-    case 'list_start': {
-      var body = ''
-        , ordered = this.token.ordered;
+        context.map().on('move.intro drawn.intro', function() {
+            revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
+        });
 
-      while (this.next().type !== 'list_end') {
-        body += this.tok();
-      }
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-area') {
+                return;
+            } else if (mode.id === 'select') {
+                var graph = context.graph(),
+                    way = context.entity(context.selectedIDs()[0]),
+                    nodes = graph.childNodes(way),
+                    points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
 
-      return this.renderer.list(body, ordered);
-    }
-    case 'list_item_start': {
-      var body = '';
+                if (isMostlySquare(points)) {
+                    houseId = way.id;
+                    return continueTo(chooseCategoryBuilding);
+                } else {
+                    return continueTo(retryHouse);
+                }
 
-      while (this.next().type !== 'list_item_end') {
-        body += this.token.type === 'text'
-          ? this.parseText()
-          : this.tok();
-      }
+            } else {
+                return chapter.restart();
+            }
+        });
 
-      return this.renderer.listitem(body);
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-    case 'loose_item_start': {
-      var body = '';
 
-      while (this.next().type !== 'list_item_end') {
-        body += this.tok();
-      }
 
-      return this.renderer.listitem(body);
-    }
-    case 'html': {
-      var html = !this.token.pre && !this.options.pedantic
-        ? this.inline.output(this.token.text)
-        : this.token.text;
-      return this.renderer.html(html);
-    }
-    case 'paragraph': {
-      return this.renderer.paragraph(this.inline.output(this.token.text));
-    }
-    case 'text': {
-      return this.renderer.paragraph(this.parseText());
-    }
-  }
-};
+    function retryHouse() {
+        var onClick = function() { continueTo(addHouse); };
 
-/**
- * Helpers
- */
+        revealHouse(house, t('intro.buildings.retry_building'),
+            { buttonText: t('intro.ok'), buttonCallback: onClick }
+        );
 
-function escape(html, encode) {
-  return html
-    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;')
-    .replace(/"/g, '&quot;')
-    .replace(/'/g, '&#39;');
-}
+        context.map().on('move.intro drawn.intro', function() {
+            revealHouse(house, t('intro.buildings.retry_building'),
+                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+            );
+        });
 
-function unescape(html) {
-       // explicitly match decimal, hex, and named HTML entities 
-  return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
-    n = n.toLowerCase();
-    if (n === 'colon') return ':';
-    if (n.charAt(0) === '#') {
-      return n.charAt(1) === 'x'
-        ? String.fromCharCode(parseInt(n.substring(2), 16))
-        : String.fromCharCode(+n.substring(1));
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            nextStep();
+        }
     }
-    return '';
-  });
-}
 
-function replace(regex, opt) {
-  regex = regex.source;
-  opt = opt || '';
-  return function self(name, val) {
-    if (!name) return new RegExp(regex, opt);
-    val = val.source || val;
-    val = val.replace(/(^|[^\[])\^/g, '$1');
-    regex = regex.replace(name, val);
-    return self;
-  };
-}
 
-function noop() {}
-noop.exec = noop;
+    function chooseCategoryBuilding() {
+        if (!houseId || !context.hasEntity(houseId)) {
+            return addHouse();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
+            context.enter(modeSelect(context, [houseId]));
+        }
 
-function merge(obj) {
-  var i = 1
-    , target
-    , key;
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-  for (; i < arguments.length; i++) {
-    target = arguments[i];
-    for (key in target) {
-      if (Object.prototype.hasOwnProperty.call(target, key)) {
-        obj[key] = target[key];
-      }
-    }
-  }
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-  return obj;
-}
+            var button = d3_select('.preset-category-building .preset-list-button');
 
+            reveal(button.node(),
+                t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
+            );
 
-/**
- * Marked
- */
+            button.on('click.intro', function() {
+                button.on('click.intro', null);
+                continueTo(choosePresetHouse);
+            });
 
-function marked(src, opt, callback) {
-  if (callback || typeof opt === 'function') {
-    if (!callback) {
-      callback = opt;
-      opt = null;
-    }
+        }, 400);  // after preset list pane visible..
 
-    opt = merge({}, marked.defaults, opt || {});
 
-    var highlight = opt.highlight
-      , tokens
-      , pending
-      , i = 0;
+        context.on('enter.intro', function(mode) {
+            if (!houseId || !context.hasEntity(houseId)) {
+                return continueTo(addHouse);
+            }
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
+                return continueTo(chooseCategoryBuilding);
+            }
+        });
 
-    try {
-      tokens = Lexer.lex(src, opt);
-    } catch (e) {
-      return callback(e);
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.preset-list-button').on('click.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
 
-    pending = tokens.length;
 
-    var done = function(err) {
-      if (err) {
-        opt.highlight = highlight;
-        return callback(err);
-      }
+    function choosePresetHouse() {
+        if (!houseId || !context.hasEntity(houseId)) {
+            return addHouse();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
+            context.enter(modeSelect(context, [houseId]));
+        }
 
-      var out;
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-      try {
-        out = Parser.parse(tokens, opt);
-      } catch (e) {
-        err = e;
-      }
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-      opt.highlight = highlight;
+            var button = d3_select('.preset-building-house .preset-list-button');
 
-      return err
-        ? callback(err)
-        : callback(null, out);
-    };
+            reveal(button.node(),
+                t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
+                { duration: 300 }
+            );
 
-    if (!highlight || highlight.length < 3) {
-      return done();
-    }
+            button.on('click.intro', function() {
+                button.on('click.intro', null);
+                continueTo(closeEditorHouse);
+            });
 
-    delete opt.highlight;
 
-    if (!pending) return done();
+        }, 400);  // after preset list pane visible..
 
-    for (; i < tokens.length; i++) {
-      (function(token) {
-        if (token.type !== 'code') {
-          return --pending || done();
-        }
-        return highlight(token.text, token.lang, function(err, code) {
-          if (err) return done(err);
-          if (code == null || code === token.text) {
-            return --pending || done();
-          }
-          token.text = code;
-          token.escaped = true;
-          --pending || done();
+        context.on('enter.intro', function(mode) {
+            if (!houseId || !context.hasEntity(houseId)) {
+                return continueTo(addHouse);
+            }
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
+                return continueTo(chooseCategoryBuilding);
+            }
         });
-      })(tokens[i]);
-    }
 
-    return;
-  }
-  try {
-    if (opt) opt = merge({}, marked.defaults, opt);
-    return Parser.parse(Lexer.lex(src, opt), opt);
-  } catch (e) {
-    e.message += '\nPlease report this to https://github.com/chjj/marked.';
-    if ((opt || marked.defaults).silent) {
-      return '<p>An error occured:</p><pre>'
-        + escape(e.message + '', true)
-        + '</pre>';
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            d3_select('.preset-list-button').on('click.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
+        }
     }
-    throw e;
-  }
-}
 
-/**
- * Options
- */
 
-marked.options =
-marked.setOptions = function(opt) {
-  merge(marked.defaults, opt);
-  return marked;
-};
+    function closeEditorHouse() {
+        if (!houseId || !context.hasEntity(houseId)) {
+            return addHouse();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
+            context.enter(modeSelect(context, [houseId]));
+        }
 
-marked.defaults = {
-  gfm: true,
-  tables: true,
-  breaks: false,
-  pedantic: false,
-  sanitize: false,
-  sanitizer: null,
-  mangle: true,
-  smartLists: false,
-  silent: false,
-  highlight: null,
-  langPrefix: 'lang-',
-  smartypants: false,
-  headerPrefix: '',
-  renderer: new Renderer,
-  xhtml: false
-};
+        context.history().checkpoint('hasHouse');
 
-/**
- * Expose
- */
+        context.on('exit.intro', function() {
+            continueTo(rightClickHouse);
+        });
 
-marked.Parser = Parser;
-marked.parser = Parser.parse;
+        timeout(function() {
+            reveal('.entity-editor-pane',
+                t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
+            );
+        }, 500);
+
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
+        }
+    }
+
+
+    function rightClickHouse() {
+        if (!houseId) return chapter.restart();
+
+        context.enter(modeBrowse(context));
+        context.history().reset('hasHouse');
+        context.map().centerEase(house, 500);
+
+        timeout(function() {
+            if (context.map().zoom() < 20) {
+                context.map().zoomEase(20, 500);
+            }
+        }, 520);
 
-marked.Renderer = Renderer;
+        context.on('enter.intro', function(mode) {
+            if (mode.id !== 'select') return;
+            var ids = context.selectedIDs();
+            if (ids.length !== 1 || ids[0] !== houseId) return;
 
-marked.Lexer = Lexer;
-marked.lexer = Lexer.lex;
+            timeout(function() {
+                var node = selectMenuItem('orthogonalize').node();
+                if (!node) return;
+                continueTo(clickSquare);
+            }, 300);  // after menu visible
+        });
 
-marked.InlineLexer = InlineLexer;
-marked.inlineLexer = InlineLexer.output;
+        context.map().on('move.intro drawn.intro', function() {
+            revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
+        });
 
-marked.parse = marked;
+        context.history().on('change.intro', function() {
+            continueTo(rightClickHouse);
+        });
 
-{
-  module.exports = marked;
-}
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
-}).call(function() {
-  return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
-}());
-});
 
-function pointBox(loc, context) {
-    var rect = context.surfaceRect();
-    var point = context.curtainProjection(loc);
-    return {
-        left: point[0] + rect.left - 40,
-        top: point[1] + rect.top - 60,
-        width: 80,
-        height: 90
-    };
-}
+    function clickSquare() {
+        if (!houseId) return chapter.restart();
+        var entity = context.hasEntity(houseId);
+        if (!entity) return continueTo(rightClickHouse);
 
+        var node = selectMenuItem('orthogonalize').node();
+        if (!node) { return continueTo(rightClickHouse); }
 
-function pad$1(locOrBox, padding, context) {
-    var box;
-    if (locOrBox instanceof Array) {
-        var rect = context.surfaceRect();
-        var point = context.curtainProjection(locOrBox);
-        box = {
-            left: point[0] + rect.left,
-            top: point[1] + rect.top
-        };
-    } else {
-        box = locOrBox;
-    }
+        var wasChanged = false;
+        var menuCoords = context.map().mouseCoordinates();
 
-    return {
-        left: box.left - padding,
-        top: box.top - padding,
-        width: (box.width || 0) + 2 * padding,
-        height: (box.width || 0) + 2 * padding
-    };
-}
+        revealEditMenu(menuCoords,
+            t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
+        );
 
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'browse') {
+                continueTo(rightClickHouse);
+            } else if (mode.id === 'move' || mode.id === 'rotate') {
+                continueTo(retryClickSquare);
+            }
+        });
 
-function icon(name, svgklass) {
-    return '<svg class="icon ' + (svgklass || '') + '">' +
-         '<use xlink:href="' + name + '"></use></svg>';
-}
+        context.map().on('move.intro drawn.intro', function() {
+            var node = selectMenuItem('orthogonalize').node();
+            if (!wasChanged && !node) { return continueTo(rightClickHouse); }
 
+            revealEditMenu(menuCoords,
+                t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
+                { duration: 0 }
+            );
+        });
 
-function slugify(text) {
-    return text.toString().toLowerCase()
-        .replace(/\s+/g, '-')           // Replace spaces with -
-        .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
-        .replace(/\-\-+/g, '-')         // Replace multiple - with single -
-        .replace(/^-+/, '')             // Trim - from start of text
-        .replace(/-+$/, '');            // Trim - from end of text
-}
+        context.history().on('change.intro', function() {
+            wasChanged = true;
+            context.history().on('change.intro', null);
 
+            // Something changed.  Wait for transition to complete and check undo annotation.
+            timeout(function() {
+                if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
+                    continueTo(doneSquare);
+                } else {
+                    continueTo(retryClickSquare);
+                }
+            }, 500);  // after transitioned actions
+        });
 
-// console warning for missing walkthrough names
-var missingStrings = {};
-function checkKey(key, text) {
-    if (t(key, { default: undefined}) === undefined) {
-        if (missingStrings.hasOwnProperty(key)) return;  // warn once
-        missingStrings[key] = text;
-        var missing = key + ': ' + text;
-        if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
     }
-}
 
 
-function localize(obj) {
-    var key;
+    function retryClickSquare() {
+        context.enter(modeBrowse(context));
 
-    // Assign name if entity has one..
-    var name = obj.tags && obj.tags.name;
-    if (name) {
-        key = 'intro.graph.name.' + slugify(name);
-        obj.tags.name = t(key, { default: name });
-        checkKey(key, name);
+        revealHouse(house, t('intro.buildings.retry_square'), {
+            buttonText: t('intro.ok'),
+            buttonCallback: function() { continueTo(rightClickHouse); }
+        });
+
+        function continueTo(nextStep) {
+            nextStep();
+        }
     }
 
-    // Assign street name if entity has one..
-    var street = obj.tags && obj.tags['addr:street'];
-    if (street) {
-        key = 'intro.graph.name.' + slugify(street);
-        obj.tags['addr:street'] = t(key, { default: street });
-        checkKey(key, street);
 
-        // Add address details common across walkthrough..
-        var addrTags = [
-            'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
-            'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
-        ];
-        addrTags.forEach(function(k) {
-            var key = 'intro.graph.' + k,
-                tag = 'addr:' + k,
-                val = obj.tags && obj.tags[tag],
-                str = t(key, { default: val });
+    function doneSquare() {
+        context.history().checkpoint('doneSquare');
 
-            if (str) {
-                if (str.match(/^<.*>$/) !== null) {
-                    delete obj.tags[tag];
-                } else {
-                    obj.tags[tag] = str;
-                }
-            }
+        revealHouse(house, t('intro.buildings.done_square'), {
+            buttonText: t('intro.ok'),
+            buttonCallback: function() { continueTo(addTank); }
         });
+
+        function continueTo(nextStep) {
+            nextStep();
+        }
     }
 
-    return obj;
-}
 
+    function addTank() {
+        context.enter(modeBrowse(context));
+        context.history().reset('doneSquare');
+        tankId = null;
 
-// Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
-function isMostlySquare(points) {
-    // note: uses 15 here instead of the 12 from actionOrthogonalize because
-    // actionOrthogonalize can actually straighten some larger angles as it iterates
-    var threshold = 15, // degrees within right or straight
-        lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
-        upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
-        mag;
+        var msec = transitionTime(tank, context.map().center());
+        if (msec) { reveal(null, null, { duration: 0 }); }
+        context.map().zoom(19.5).centerEase(tank, msec);
 
-    for (var i = 0; i < points.length; i++) {
-        mag = Math.abs(normalizedDotProduct(i, points));
-        if (mag > lowerBound && mag < upperBound) {
-            return false;
+        timeout(function() {
+            reveal('button.add-area',
+                t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
+            );
+
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'add-area') return;
+                continueTo(startTank);
+            });
+        }, msec + 100);
+
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            nextStep();
         }
     }
 
-    return true;
 
+    function startTank() {
+        if (context.mode().id !== 'add-area') {
+            return continueTo(addTank);
+        }
 
-    function normalizedDotProduct(i, points) {
-        var a = points[(i - 1 + points.length) % points.length],
-            b = points[i],
-            c = points[(i + 1) % points.length],
-            p = subtractPoints(a, b),
-            q = subtractPoints(c, b);
+        tankId = null;
 
-        p = normalizePoint(p);
-        q = normalizePoint(q);
+        timeout(function() {
+            revealTank(tank, t('intro.buildings.start_tank'));
 
-        return p[0] * q[0] + p[1] * q[1];
+            context.map().on('move.intro drawn.intro', function() {
+                revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
+            });
 
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'draw-area') return chapter.restart();
+                continueTo(continueTank);
+            });
 
-        function subtractPoints(a, b) {
-            return [a[0] - b[0], a[1] - b[1]];
+        }, 550);  // after easing
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
         }
+    }
 
-        function normalizePoint(point) {
-            var vector = [0, 0];
-            var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
-            if (length !== 0) {
-                vector[0] = point[0] / length;
-                vector[1] = point[1] / length;
+
+    function continueTank() {
+        if (context.mode().id !== 'draw-area') {
+            return continueTo(addTank);
+        }
+
+        tankId = null;
+
+        revealTank(tank, t('intro.buildings.continue_tank'));
+
+        context.map().on('move.intro drawn.intro', function() {
+            revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
+        });
+
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'draw-area') {
+                return;
+            } else if (mode.id === 'select') {
+                tankId = context.selectedIDs()[0];
+                return continueTo(searchPresetTank);
+            } else {
+                return continueTo(addTank);
             }
-            return vector;
+        });
+
+        function continueTo(nextStep) {
+            context.map().on('move.intro drawn.intro', null);
+            context.on('enter.intro', null);
+            nextStep();
         }
     }
-}
 
 
-function selectMenuItem(operation) {
-    var selector = '.edit-menu .edit-menu-item-' + operation +
-        ', .radial-menu .radial-menu-item-' + operation;
-    return d3_select(selector);
-}
+    function searchPresetTank() {
+        if (!tankId || !context.hasEntity(tankId)) {
+            return addTank();
+        }
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
+            context.enter(modeSelect(context, [tankId]));
+        }
 
+        // disallow scrolling
+        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-function transitionTime(point1, point2) {
-    var distance = geoSphericalDistance(point1, point2);
-    if (distance === 0)
-        return 0;
-    else if (distance < 80)
-        return 500;
-    else
-        return 1000;
-}
+        timeout(function() {
+            // reset pane, in case user somehow happened to change it..
+            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-var dataIntroGraph = {"n1":{"id":"n1","loc":[-85.631039,41.948829]},"n10":{"id":"n10","loc":[-85.634733,41.941588]},"n100":{"id":"n100","loc":[-85.637395,41.942252]},"n1000":{"id":"n1000","loc":[-85.632699,41.944763]},"n1001":{"id":"n1001","loc":[-85.632685,41.944763]},"n1002":{"id":"n1002","loc":[-85.632673,41.944755]},"n1003":{"id":"n1003","loc":[-85.632595,41.944682]},"n1004":{"id":"n1004","loc":[-85.632576,41.944673]},"n1005":{"id":"n1005","loc":[-85.632551,41.944667]},"n1006":{"id":"n1006","loc":[-85.63253,41.944667]},"n1007":{"id":"n1007","loc":[-85.632502,41.944669]},"n1008":{"id":"n1008","loc":[-85.632483,41.944677]},"n1009":{"id":"n1009","loc":[-85.632383,41.944731]},"n101":{"id":"n101","loc":[-85.637357,41.942252]},"n1010":{"id":"n1010","loc":[-85.63349,41.944976],"tags":{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Sherwin-Williams","shop":"paint"}},"n1011":{"id":"n1011","loc":[-85.633548,41.945034],"tags":{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Unique Jewelry","shop":"jewelry"}},"n1012":{"id":"n1012","loc":[-85.633683,41.945129],"tags":{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"World Fare","shop":"gift"}},"n1013":{"id":"n1013","loc":[-85.634563,41.945469],"tags":{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Golden Finch Framing","shop":"frame"}},"n1014":{"id":"n1014","loc":[-85.634469,41.945379],"tags":{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Dollar Tree","shop":"second_hand"}},"n1015":{"id":"n1015","loc":[-85.634227,41.945159],"tags":{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"theatre","name":"Riviera Theatre"}},"n1016":{"id":"n1016","loc":[-85.634057,41.945012],"tags":{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"River City Appliance","shop":"appliance"}},"n1017":{"id":"n1017","loc":[-85.633879,41.945325],"tags":{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paparazzi Tattoo","shop":"tattoo"}},"n1018":{"id":"n1018","loc":[-85.634914,41.945839],"tags":{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"bank","name":"Southern Michigan Bank"}},"n1019":{"id":"n1019","loc":[-85.634514,41.946176]},"n102":{"id":"n102","loc":[-85.637357,41.942216]},"n1020":{"id":"n1020","loc":[-85.634087,41.946178]},"n1021":{"id":"n1021","loc":[-85.634357,41.945805]},"n1022":{"id":"n1022","loc":[-85.634389,41.945788]},"n1023":{"id":"n1023","loc":[-85.634491,41.94581]},"n1024":{"id":"n1024","loc":[-85.634513,41.945853]},"n1025":{"id":"n1025","loc":[-85.634506,41.94583]},"n1026":{"id":"n1026","loc":[-85.634762,41.946056],"tags":{"crossing":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","highway":"crossing"}},"n1029":{"id":"n1029","loc":[-85.640655,41.942057]},"n103":{"id":"n103","loc":[-85.637386,41.942054]},"n1030":{"id":"n1030","loc":[-85.640947,41.942057]},"n1031":{"id":"n1031","loc":[-85.640957,41.942593]},"n1032":{"id":"n1032","loc":[-85.630953,41.960873]},"n1033":{"id":"n1033","loc":[-85.632174,41.960679]},"n1034":{"id":"n1034","loc":[-85.638785,41.943066]},"n1035":{"id":"n1035","loc":[-85.638853,41.943065]},"n1036":{"id":"n1036","loc":[-85.638855,41.943183]},"n1037":{"id":"n1037","loc":[-85.638552,41.943189]},"n1038":{"id":"n1038","loc":[-85.63855,41.943149]},"n1039":{"id":"n1039","loc":[-85.638638,41.943068]},"n104":{"id":"n104","loc":[-85.637387,41.942125]},"n1040":{"id":"n1040","loc":[-85.638638,41.943078]},"n1041":{"id":"n1041","loc":[-85.638813,41.943163]},"n1042":{"id":"n1042","loc":[-85.638684,41.943165]},"n1043":{"id":"n1043","loc":[-85.638682,41.943105]},"n1044":{"id":"n1044","loc":[-85.638706,41.943105]},"n1045":{"id":"n1045","loc":[-85.638707,41.943117]},"n1046":{"id":"n1046","loc":[-85.638812,41.943115]},"n1047":{"id":"n1047","loc":[-85.638769,41.943407]},"n1048":{"id":"n1048","loc":[-85.638549,41.943407]},"n1049":{"id":"n1049","loc":[-85.638567,41.943555]},"n105":{"id":"n105","loc":[-85.637319,41.942125]},"n1050":{"id":"n1050","loc":[-85.638426,41.943554]},"n1051":{"id":"n1051","loc":[-85.638427,41.94346]},"n1052":{"id":"n1052","loc":[-85.638568,41.943461]},"n1053":{"id":"n1053","loc":[-85.639264,41.943415]},"n1054":{"id":"n1054","loc":[-85.639082,41.943417]},"n1055":{"id":"n1055","loc":[-85.63908,41.943331]},"n1056":{"id":"n1056","loc":[-85.639136,41.94333]},"n1057":{"id":"n1057","loc":[-85.639158,41.943312]},"n1058":{"id":"n1058","loc":[-85.639188,41.943313]},"n1059":{"id":"n1059","loc":[-85.639211,41.943331]},"n106":{"id":"n106","loc":[-85.637319,41.942137]},"n1060":{"id":"n1060","loc":[-85.639262,41.943331]},"n1061":{"id":"n1061","loc":[-85.638986,41.943515]},"n1062":{"id":"n1062","loc":[-85.63888,41.943521]},"n1063":{"id":"n1063","loc":[-85.638871,41.943436]},"n1064":{"id":"n1064","loc":[-85.638958,41.943431]},"n1065":{"id":"n1065","loc":[-85.638979,41.943443]},"n1066":{"id":"n1066","loc":[-85.63926,41.943703]},"n1067":{"id":"n1067","loc":[-85.639152,41.943704]},"n1068":{"id":"n1068","loc":[-85.639152,41.943691]},"n1069":{"id":"n1069","loc":[-85.639063,41.943691]},"n107":{"id":"n107","loc":[-85.637259,41.942137]},"n1070":{"id":"n1070","loc":[-85.639062,41.943613]},"n1071":{"id":"n1071","loc":[-85.639259,41.943611]},"n1072":{"id":"n1072","loc":[-85.639117,41.943726]},"n1073":{"id":"n1073","loc":[-85.639118,41.943767]},"n1074":{"id":"n1074","loc":[-85.639051,41.943768]},"n1075":{"id":"n1075","loc":[-85.63905,41.943727]},"n1076":{"id":"n1076","loc":[-85.638627,41.943716]},"n1077":{"id":"n1077","loc":[-85.63863,41.943634]},"n1078":{"id":"n1078","loc":[-85.63844,41.943631]},"n1079":{"id":"n1079","loc":[-85.638437,41.943729]},"n108":{"id":"n108","loc":[-85.637259,41.942126]},"n1080":{"id":"n1080","loc":[-85.638533,41.94373]},"n1081":{"id":"n1081","loc":[-85.638534,41.943715]},"n1082":{"id":"n1082","loc":[-85.638678,41.943941]},"n1083":{"id":"n1083","loc":[-85.638522,41.943944]},"n1084":{"id":"n1084","loc":[-85.63852,41.943864]},"n1085":{"id":"n1085","loc":[-85.638676,41.943861]},"n1086":{"id":"n1086","loc":[-85.638663,41.944059]},"n1087":{"id":"n1087","loc":[-85.638513,41.944061]},"n1088":{"id":"n1088","loc":[-85.638511,41.943991]},"n1089":{"id":"n1089","loc":[-85.638661,41.943989]},"n109":{"id":"n109","loc":[-85.637193,41.942126]},"n1090":{"id":"n1090","loc":[-85.63865,41.944134]},"n1091":{"id":"n1091","loc":[-85.638429,41.944144]},"n1092":{"id":"n1092","loc":[-85.638426,41.944106]},"n1093":{"id":"n1093","loc":[-85.638476,41.944104]},"n1094":{"id":"n1094","loc":[-85.638475,41.94409]},"n1095":{"id":"n1095","loc":[-85.638594,41.944084]},"n1096":{"id":"n1096","loc":[-85.638595,41.944101]},"n1097":{"id":"n1097","loc":[-85.638647,41.944099]},"n1098":{"id":"n1098","loc":[-85.63829,41.944154]},"n1099":{"id":"n1099","loc":[-85.638558,41.944155]},"n11":{"id":"n11","loc":[-85.634602,41.941523]},"n110":{"id":"n110","loc":[-85.637192,41.942053]},"n1100":{"id":"n1100","loc":[-85.638558,41.944338]},"n1101":{"id":"n1101","loc":[-85.638851,41.944408]},"n1102":{"id":"n1102","loc":[-85.637771,41.943989]},"n1103":{"id":"n1103","loc":[-85.639345,41.943964]},"n1104":{"id":"n1104","loc":[-85.638515,41.94397]},"n1105":{"id":"n1105","loc":[-85.639256,41.943928]},"n1106":{"id":"n1106","loc":[-85.639157,41.943929]},"n1107":{"id":"n1107","loc":[-85.639156,41.9439]},"n1108":{"id":"n1108","loc":[-85.639118,41.9439]},"n1109":{"id":"n1109","loc":[-85.639116,41.94382]},"n111":{"id":"n111","loc":[-85.637248,41.942053]},"n1110":{"id":"n1110","loc":[-85.639202,41.943819]},"n1111":{"id":"n1111","loc":[-85.639202,41.943837]},"n1112":{"id":"n1112","loc":[-85.639293,41.943836]},"n1113":{"id":"n1113","loc":[-85.639295,41.943898]},"n1114":{"id":"n1114","loc":[-85.639255,41.943898]},"n1115":{"id":"n1115","loc":[-85.639296,41.944083]},"n1116":{"id":"n1116","loc":[-85.639144,41.944084]},"n1117":{"id":"n1117","loc":[-85.639143,41.944026]},"n1118":{"id":"n1118","loc":[-85.639162,41.944026]},"n1119":{"id":"n1119","loc":[-85.639162,41.944]},"n112":{"id":"n112","loc":[-85.637248,41.942042]},"n1120":{"id":"n1120","loc":[-85.639295,41.943999]},"n1121":{"id":"n1121","loc":[-85.639131,41.944139]},"n1122":{"id":"n1122","loc":[-85.63901,41.94414]},"n1123":{"id":"n1123","loc":[-85.63901,41.944076]},"n1124":{"id":"n1124","loc":[-85.63913,41.944075]},"n1125":{"id":"n1125","loc":[-85.639092,41.944155]},"n1126":{"id":"n1126","loc":[-85.639093,41.944308]},"n1127":{"id":"n1127","loc":[-85.639225,41.944308]},"n1128":{"id":"n1128","loc":[-85.639225,41.94429]},"n1129":{"id":"n1129","loc":[-85.639253,41.944289]},"n113":{"id":"n113","loc":[-85.637338,41.942041]},"n1130":{"id":"n1130","loc":[-85.639253,41.944269]},"n1131":{"id":"n1131","loc":[-85.639243,41.944269]},"n1132":{"id":"n1132","loc":[-85.639243,41.944229]},"n1133":{"id":"n1133","loc":[-85.639224,41.944229]},"n1134":{"id":"n1134","loc":[-85.639224,41.944196]},"n1135":{"id":"n1135","loc":[-85.639195,41.944196]},"n1136":{"id":"n1136","loc":[-85.639195,41.944155]},"n1137":{"id":"n1137","loc":[-85.639072,41.944154]},"n1138":{"id":"n1138","loc":[-85.638865,41.944154]},"n1139":{"id":"n1139","loc":[-85.638863,41.943967]},"n114":{"id":"n114","loc":[-85.637338,41.942055]},"n1140":{"id":"n1140","loc":[-85.6386,41.942698]},"n1141":{"id":"n1141","loc":[-85.639348,41.942698]},"n1142":{"id":"n1142","loc":[-85.639377,41.944984]},"n1143":{"id":"n1143","loc":[-85.63937,41.945013]},"n1144":{"id":"n1144","loc":[-85.639357,41.945033]},"n1145":{"id":"n1145","loc":[-85.639353,41.945053]},"n1146":{"id":"n1146","loc":[-85.639352,41.945084]},"n1147":{"id":"n1147","loc":[-85.638278,41.945516]},"n1148":{"id":"n1148","loc":[-85.637505,41.945801]},"n1149":{"id":"n1149","loc":[-85.637327,41.945857]},"n115":{"id":"n115","loc":[-85.637583,41.941943]},"n1150":{"id":"n1150","loc":[-85.637168,41.945899]},"n1151":{"id":"n1151","loc":[-85.637017,41.94593]},"n1152":{"id":"n1152","loc":[-85.637185,41.945938]},"n1153":{"id":"n1153","loc":[-85.63682,41.945963]},"n1154":{"id":"n1154","loc":[-85.636639,41.945984]},"n1155":{"id":"n1155","loc":[-85.636439,41.945999]},"n1156":{"id":"n1156","loc":[-85.635801,41.945999]},"n1157":{"id":"n1157","loc":[-85.635769,41.945908]},"n1158":{"id":"n1158","loc":[-85.635953,41.946154]},"n1159":{"id":"n1159","loc":[-85.635472,41.94598]},"n116":{"id":"n116","loc":[-85.637584,41.941983]},"n1160":{"id":"n1160","loc":[-85.635409,41.945981]},"n1161":{"id":"n1161","loc":[-85.635583,41.945987]},"n1162":{"id":"n1162","loc":[-85.636452,41.945805]},"n1163":{"id":"n1163","loc":[-85.636425,41.94582]},"n1164":{"id":"n1164","loc":[-85.636396,41.945817]},"n1165":{"id":"n1165","loc":[-85.636368,41.945797]},"n1166":{"id":"n1166","loc":[-85.636346,41.945767]},"n1167":{"id":"n1167","loc":[-85.636307,41.945745]},"n1168":{"id":"n1168","loc":[-85.636194,41.94565]},"n1169":{"id":"n1169","loc":[-85.636121,41.945579]},"n117":{"id":"n117","loc":[-85.63751,41.941983]},"n1170":{"id":"n1170","loc":[-85.635995,41.945432]},"n1171":{"id":"n1171","loc":[-85.637564,41.943538]},"n1172":{"id":"n1172","loc":[-85.63756,41.943505]},"n1173":{"id":"n1173","loc":[-85.637435,41.943489]},"n1174":{"id":"n1174","loc":[-85.637093,41.943556]},"n1175":{"id":"n1175","loc":[-85.634836,41.941574]},"n1176":{"id":"n1176","loc":[-85.634692,41.9415]},"n1177":{"id":"n1177","loc":[-85.634261,41.941337]},"n1178":{"id":"n1178","loc":[-85.634208,41.940962]},"n1179":{"id":"n1179","loc":[-85.635247,41.940968]},"n118":{"id":"n118","loc":[-85.637509,41.941944]},"n1180":{"id":"n1180","loc":[-85.63514,41.941205]},"n1181":{"id":"n1181","loc":[-85.634858,41.941511]},"n1182":{"id":"n1182","loc":[-85.630725,41.943465]},"n1183":{"id":"n1183","loc":[-85.632591,41.942826]},"n1184":{"id":"n1184","loc":[-85.634487,41.941928]},"n1185":{"id":"n1185","loc":[-85.634499,41.942056]},"n1186":{"id":"n1186","loc":[-85.63433,41.943102]},"n1187":{"id":"n1187","loc":[-85.634158,41.943151]},"n1188":{"id":"n1188","loc":[-85.634107,41.94305]},"n1189":{"id":"n1189","loc":[-85.634279,41.943002]},"n119":{"id":"n119","loc":[-85.637724,41.941973]},"n1190":{"id":"n1190","loc":[-85.634362,41.943762]},"n1191":{"id":"n1191","loc":[-85.634331,41.943731]},"n1192":{"id":"n1192","loc":[-85.634396,41.943695]},"n1193":{"id":"n1193","loc":[-85.634426,41.943726]},"n1194":{"id":"n1194","loc":[-85.621569,41.956021]},"n1195":{"id":"n1195","loc":[-85.621574,41.956164]},"n1196":{"id":"n1196","loc":[-85.621489,41.956165]},"n1197":{"id":"n1197","loc":[-85.621488,41.956136]},"n1198":{"id":"n1198","loc":[-85.621372,41.956139]},"n1199":{"id":"n1199","loc":[-85.621369,41.956049]},"n12":{"id":"n12","loc":[-85.63359,41.941093]},"n120":{"id":"n120","loc":[-85.637633,41.941973]},"n1200":{"id":"n1200","loc":[-85.621493,41.956047]},"n1201":{"id":"n1201","loc":[-85.621492,41.956022]},"n1202":{"id":"n1202","loc":[-85.619744,41.953192]},"n1203":{"id":"n1203","loc":[-85.619059,41.953902]},"n1204":{"id":"n1204","loc":[-85.623984,41.95469]},"n1205":{"id":"n1205","loc":[-85.630159,41.958208]},"n1206":{"id":"n1206","loc":[-85.63002,41.958208]},"n1207":{"id":"n1207","loc":[-85.630021,41.95814]},"n1208":{"id":"n1208","loc":[-85.63,41.95814]},"n1209":{"id":"n1209","loc":[-85.63,41.958043]},"n121":{"id":"n121","loc":[-85.637633,41.941853]},"n1210":{"id":"n1210","loc":[-85.630159,41.958043]},"n1211":{"id":"n1211","loc":[-85.630304,41.957566]},"n1212":{"id":"n1212","loc":[-85.630303,41.957684]},"n1213":{"id":"n1213","loc":[-85.630073,41.957683]},"n1214":{"id":"n1214","loc":[-85.630072,41.957721]},"n1215":{"id":"n1215","loc":[-85.629993,41.95772]},"n1216":{"id":"n1216","loc":[-85.629993,41.95768]},"n1217":{"id":"n1217","loc":[-85.629968,41.95768]},"n1218":{"id":"n1218","loc":[-85.629969,41.957588]},"n1219":{"id":"n1219","loc":[-85.630219,41.95759]},"n122":{"id":"n122","loc":[-85.637724,41.941853]},"n1220":{"id":"n1220","loc":[-85.630219,41.957566]},"n1221":{"id":"n1221","loc":[-85.630717,41.957744]},"n1222":{"id":"n1222","loc":[-85.630596,41.957745]},"n1223":{"id":"n1223","loc":[-85.630598,41.957553]},"n1224":{"id":"n1224","loc":[-85.630717,41.957555]},"n1225":{"id":"n1225","loc":[-85.630609,41.957745]},"n1226":{"id":"n1226","loc":[-85.63061,41.957789]},"n1227":{"id":"n1227","loc":[-85.630327,41.957791]},"n1228":{"id":"n1228","loc":[-85.630324,41.95752]},"n1229":{"id":"n1229","loc":[-85.630325,41.95756]},"n123":{"id":"n123","loc":[-85.637773,41.941988]},"n1230":{"id":"n1230","loc":[-85.63057,41.95756]},"n1231":{"id":"n1231","loc":[-85.63069,41.958016]},"n1232":{"id":"n1232","loc":[-85.630586,41.958017]},"n1233":{"id":"n1233","loc":[-85.630584,41.957956]},"n1234":{"id":"n1234","loc":[-85.630614,41.957956]},"n1235":{"id":"n1235","loc":[-85.630611,41.957835]},"n1236":{"id":"n1236","loc":[-85.630737,41.957833]},"n1237":{"id":"n1237","loc":[-85.630739,41.957921]},"n1238":{"id":"n1238","loc":[-85.630688,41.957922]},"n1239":{"id":"n1239","loc":[-85.630719,41.958291]},"n124":{"id":"n124","loc":[-85.637773,41.942046]},"n1240":{"id":"n1240","loc":[-85.630592,41.958291]},"n1241":{"id":"n1241","loc":[-85.630593,41.958108]},"n1242":{"id":"n1242","loc":[-85.630701,41.958109]},"n1243":{"id":"n1243","loc":[-85.6307,41.958173]},"n1244":{"id":"n1244","loc":[-85.630711,41.958173]},"n1245":{"id":"n1245","loc":[-85.630711,41.958233]},"n1246":{"id":"n1246","loc":[-85.630719,41.958233]},"n1247":{"id":"n1247","loc":[-85.630523,41.958329]},"n1248":{"id":"n1248","loc":[-85.630388,41.958329]},"n1249":{"id":"n1249","loc":[-85.630387,41.958262]},"n125":{"id":"n125","loc":[-85.637693,41.942047]},"n1250":{"id":"n1250","loc":[-85.630523,41.958261]},"n1251":{"id":"n1251","loc":[-85.63072,41.958636]},"n1252":{"id":"n1252","loc":[-85.630721,41.958709]},"n1253":{"id":"n1253","loc":[-85.630503,41.958712]},"n1254":{"id":"n1254","loc":[-85.630498,41.958511]},"n1255":{"id":"n1255","loc":[-85.630635,41.95851]},"n1256":{"id":"n1256","loc":[-85.630638,41.958636]},"n1257":{"id":"n1257","loc":[-85.630437,41.958822]},"n1258":{"id":"n1258","loc":[-85.630437,41.958849]},"n1259":{"id":"n1259","loc":[-85.630393,41.958849]},"n126":{"id":"n126","loc":[-85.637692,41.941988]},"n1260":{"id":"n1260","loc":[-85.630393,41.958822]},"n1261":{"id":"n1261","loc":[-85.630605,41.959102]},"n1262":{"id":"n1262","loc":[-85.63049,41.959104]},"n1263":{"id":"n1263","loc":[-85.630487,41.958996]},"n1264":{"id":"n1264","loc":[-85.630462,41.958996]},"n1265":{"id":"n1265","loc":[-85.63046,41.958922]},"n1266":{"id":"n1266","loc":[-85.630562,41.958921]},"n1267":{"id":"n1267","loc":[-85.630564,41.958992]},"n1268":{"id":"n1268","loc":[-85.630602,41.958992]},"n1269":{"id":"n1269","loc":[-85.630126,41.957096]},"n127":{"id":"n127","loc":[-85.637604,41.941994]},"n1270":{"id":"n1270","loc":[-85.630129,41.957283]},"n1271":{"id":"n1271","loc":[-85.629993,41.957284]},"n1272":{"id":"n1272","loc":[-85.629992,41.957216]},"n1273":{"id":"n1273","loc":[-85.630015,41.957215]},"n1274":{"id":"n1274","loc":[-85.630013,41.957097]},"n1275":{"id":"n1275","loc":[-85.630211,41.956592]},"n1276":{"id":"n1276","loc":[-85.630211,41.956676]},"n1277":{"id":"n1277","loc":[-85.630162,41.956676]},"n1278":{"id":"n1278","loc":[-85.630162,41.95676]},"n1279":{"id":"n1279","loc":[-85.630037,41.956761]},"n128":{"id":"n128","loc":[-85.637604,41.942057]},"n1280":{"id":"n1280","loc":[-85.630037,41.956592]},"n1281":{"id":"n1281","loc":[-85.630309,41.95653]},"n1282":{"id":"n1282","loc":[-85.630326,41.957065]},"n1283":{"id":"n1283","loc":[-85.630118,41.957065]},"n1284":{"id":"n1284","loc":[-85.630119,41.957096]},"n1285":{"id":"n1285","loc":[-85.63067,41.957307]},"n1286":{"id":"n1286","loc":[-85.630536,41.957308]},"n1287":{"id":"n1287","loc":[-85.630533,41.957111]},"n1288":{"id":"n1288","loc":[-85.630667,41.95711]},"n1289":{"id":"n1289","loc":[-85.630676,41.956808]},"n129":{"id":"n129","loc":[-85.63748,41.942057]},"n1290":{"id":"n1290","loc":[-85.630551,41.956808]},"n1291":{"id":"n1291","loc":[-85.630552,41.956982]},"n1292":{"id":"n1292","loc":[-85.63059,41.956982]},"n1293":{"id":"n1293","loc":[-85.63059,41.957001]},"n1294":{"id":"n1294","loc":[-85.630692,41.957001]},"n1295":{"id":"n1295","loc":[-85.630692,41.956936]},"n1296":{"id":"n1296","loc":[-85.630676,41.956936]},"n1297":{"id":"n1297","loc":[-85.630496,41.956889]},"n1298":{"id":"n1298","loc":[-85.630501,41.956947]},"n1299":{"id":"n1299","loc":[-85.630377,41.956953]},"n13":{"id":"n13","loc":[-85.633643,41.941143]},"n130":{"id":"n130","loc":[-85.63748,41.941994]},"n1300":{"id":"n1300","loc":[-85.630359,41.956938]},"n1301":{"id":"n1301","loc":[-85.630359,41.956912]},"n1302":{"id":"n1302","loc":[-85.63038,41.956894]},"n1303":{"id":"n1303","loc":[-85.630679,41.956747]},"n1304":{"id":"n1304","loc":[-85.630572,41.956748]},"n1305":{"id":"n1305","loc":[-85.63057,41.956668]},"n1306":{"id":"n1306","loc":[-85.630501,41.956669]},"n1307":{"id":"n1307","loc":[-85.630499,41.95659]},"n1308":{"id":"n1308","loc":[-85.630565,41.956589]},"n1309":{"id":"n1309","loc":[-85.630564,41.956541]},"n131":{"id":"n131","loc":[-85.637431,41.941832]},"n1310":{"id":"n1310","loc":[-85.630686,41.956539]},"n1311":{"id":"n1311","loc":[-85.630688,41.956631]},"n1312":{"id":"n1312","loc":[-85.630676,41.956631]},"n1313":{"id":"n1313","loc":[-85.630686,41.956487]},"n1314":{"id":"n1314","loc":[-85.63059,41.956487]},"n1315":{"id":"n1315","loc":[-85.63059,41.956396]},"n1316":{"id":"n1316","loc":[-85.630686,41.956396]},"n1317":{"id":"n1317","loc":[-85.630643,41.9563]},"n1318":{"id":"n1318","loc":[-85.630548,41.956301]},"n1319":{"id":"n1319","loc":[-85.630545,41.956217]},"n132":{"id":"n132","loc":[-85.637432,41.94189]},"n1320":{"id":"n1320","loc":[-85.630529,41.956214]},"n1321":{"id":"n1321","loc":[-85.630521,41.956202]},"n1322":{"id":"n1322","loc":[-85.63052,41.95618]},"n1323":{"id":"n1323","loc":[-85.630527,41.956169]},"n1324":{"id":"n1324","loc":[-85.630544,41.956163]},"n1325":{"id":"n1325","loc":[-85.630543,41.956094]},"n1326":{"id":"n1326","loc":[-85.630641,41.956093]},"n1327":{"id":"n1327","loc":[-85.630642,41.956134]},"n1328":{"id":"n1328","loc":[-85.630656,41.956134]},"n1329":{"id":"n1329","loc":[-85.630657,41.956252]},"n133":{"id":"n133","loc":[-85.637412,41.94189]},"n1330":{"id":"n1330","loc":[-85.630643,41.956252]},"n1331":{"id":"n1331","loc":[-85.630409,41.956044]},"n1332":{"id":"n1332","loc":[-85.630409,41.956075]},"n1333":{"id":"n1333","loc":[-85.630195,41.956078]},"n1334":{"id":"n1334","loc":[-85.630195,41.9561]},"n1335":{"id":"n1335","loc":[-85.630088,41.956101]},"n1336":{"id":"n1336","loc":[-85.630087,41.956048]},"n1337":{"id":"n1337","loc":[-85.630345,41.956114]},"n1338":{"id":"n1338","loc":[-85.630328,41.956113]},"n1339":{"id":"n1339","loc":[-85.63034,41.956189]},"n134":{"id":"n134","loc":[-85.637413,41.941938]},"n1340":{"id":"n1340","loc":[-85.630355,41.956185]},"n1341":{"id":"n1341","loc":[-85.630311,41.956117]},"n1342":{"id":"n1342","loc":[-85.630297,41.956125]},"n1343":{"id":"n1343","loc":[-85.630287,41.956136]},"n1344":{"id":"n1344","loc":[-85.630283,41.956149]},"n1345":{"id":"n1345","loc":[-85.630285,41.956162]},"n1346":{"id":"n1346","loc":[-85.630293,41.956174]},"n1347":{"id":"n1347","loc":[-85.630306,41.956183]},"n1348":{"id":"n1348","loc":[-85.630322,41.956188]},"n1349":{"id":"n1349","loc":[-85.630368,41.956179]},"n135":{"id":"n135","loc":[-85.637342,41.941939]},"n1350":{"id":"n1350","loc":[-85.630378,41.95617]},"n1351":{"id":"n1351","loc":[-85.630384,41.956159]},"n1352":{"id":"n1352","loc":[-85.630385,41.956147]},"n1353":{"id":"n1353","loc":[-85.630381,41.956136]},"n1354":{"id":"n1354","loc":[-85.630372,41.956126]},"n1355":{"id":"n1355","loc":[-85.63036,41.956118]},"n1356":{"id":"n1356","loc":[-85.630776,41.956041]},"n1357":{"id":"n1357","loc":[-85.630195,41.956036]},"n1358":{"id":"n1358","loc":[-85.630137,41.956037]},"n1359":{"id":"n1359","loc":[-85.630136,41.956006]},"n136":{"id":"n136","loc":[-85.637342,41.941914]},"n1360":{"id":"n1360","loc":[-85.630194,41.956005]},"n1361":{"id":"n1361","loc":[-85.629864,41.956039]},"n1362":{"id":"n1362","loc":[-85.629864,41.955862]},"n1363":{"id":"n1363","loc":[-85.629541,41.958291]},"n1364":{"id":"n1364","loc":[-85.629419,41.958292]},"n1365":{"id":"n1365","loc":[-85.629417,41.958168]},"n1366":{"id":"n1366","loc":[-85.629445,41.958168]},"n1367":{"id":"n1367","loc":[-85.629444,41.958109]},"n1368":{"id":"n1368","loc":[-85.629537,41.958108]},"n1369":{"id":"n1369","loc":[-85.629351,41.958136]},"n137":{"id":"n137","loc":[-85.637212,41.941916]},"n1370":{"id":"n1370","loc":[-85.629352,41.958202]},"n1371":{"id":"n1371","loc":[-85.629365,41.958202]},"n1372":{"id":"n1372","loc":[-85.629365,41.958223]},"n1373":{"id":"n1373","loc":[-85.629291,41.958224]},"n1374":{"id":"n1374","loc":[-85.62929,41.958137]},"n1375":{"id":"n1375","loc":[-85.629443,41.958073]},"n1376":{"id":"n1376","loc":[-85.629252,41.958075]},"n1377":{"id":"n1377","loc":[-85.629253,41.95827]},"n1378":{"id":"n1378","loc":[-85.629566,41.957585]},"n1379":{"id":"n1379","loc":[-85.629566,41.957692]},"n138":{"id":"n138","loc":[-85.637211,41.941835]},"n1380":{"id":"n1380","loc":[-85.629281,41.957693]},"n1381":{"id":"n1381","loc":[-85.62928,41.957585]},"n1382":{"id":"n1382","loc":[-85.629004,41.957599]},"n1383":{"id":"n1383","loc":[-85.629004,41.957682]},"n1384":{"id":"n1384","loc":[-85.628902,41.957682]},"n1385":{"id":"n1385","loc":[-85.628902,41.957723]},"n1386":{"id":"n1386","loc":[-85.628731,41.957724]},"n1387":{"id":"n1387","loc":[-85.628731,41.9576]},"n1388":{"id":"n1388","loc":[-85.62836,41.957679]},"n1389":{"id":"n1389","loc":[-85.628359,41.957759]},"n139":{"id":"n139","loc":[-85.637293,41.941834]},"n1390":{"id":"n1390","loc":[-85.628062,41.957757]},"n1391":{"id":"n1391","loc":[-85.628063,41.957657]},"n1392":{"id":"n1392","loc":[-85.628198,41.957657]},"n1393":{"id":"n1393","loc":[-85.628198,41.957678]},"n1394":{"id":"n1394","loc":[-85.627775,41.958095]},"n1395":{"id":"n1395","loc":[-85.627608,41.958095]},"n1396":{"id":"n1396","loc":[-85.627606,41.957829]},"n1397":{"id":"n1397","loc":[-85.627774,41.957829]},"n1398":{"id":"n1398","loc":[-85.626816,41.957636]},"n1399":{"id":"n1399","loc":[-85.626787,41.957681]},"n14":{"id":"n14","loc":[-85.633643,41.940122]},"n140":{"id":"n140","loc":[-85.637293,41.941823]},"n1400":{"id":"n1400","loc":[-85.626673,41.95764]},"n1401":{"id":"n1401","loc":[-85.626703,41.957594]},"n1402":{"id":"n1402","loc":[-85.62694,41.95752]},"n1403":{"id":"n1403","loc":[-85.62688,41.957611]},"n1404":{"id":"n1404","loc":[-85.626798,41.957582]},"n1405":{"id":"n1405","loc":[-85.626793,41.95759]},"n1406":{"id":"n1406","loc":[-85.626657,41.95754]},"n1407":{"id":"n1407","loc":[-85.626666,41.957526]},"n1408":{"id":"n1408","loc":[-85.626584,41.957497]},"n1409":{"id":"n1409","loc":[-85.626638,41.957415]},"n141":{"id":"n141","loc":[-85.637363,41.941822]},"n1410":{"id":"n1410","loc":[-85.626731,41.957449]},"n1411":{"id":"n1411","loc":[-85.626725,41.957457]},"n1412":{"id":"n1412","loc":[-85.626843,41.9575]},"n1413":{"id":"n1413","loc":[-85.626851,41.957487]},"n1414":{"id":"n1414","loc":[-85.626579,41.957521]},"n1415":{"id":"n1415","loc":[-85.626537,41.957587]},"n1416":{"id":"n1416","loc":[-85.626427,41.957551]},"n1417":{"id":"n1417","loc":[-85.626468,41.957483]},"n1418":{"id":"n1418","loc":[-85.626592,41.957639]},"n1419":{"id":"n1419","loc":[-85.626807,41.957713]},"n142":{"id":"n142","loc":[-85.637364,41.941833]},"n1420":{"id":"n1420","loc":[-85.627129,41.957401]},"n1421":{"id":"n1421","loc":[-85.627209,41.95742]},"n1422":{"id":"n1422","loc":[-85.627302,41.957435]},"n1423":{"id":"n1423","loc":[-85.629566,41.957048]},"n1424":{"id":"n1424","loc":[-85.629568,41.957215]},"n1425":{"id":"n1425","loc":[-85.629383,41.957216]},"n1426":{"id":"n1426","loc":[-85.629384,41.95727]},"n1427":{"id":"n1427","loc":[-85.629231,41.957271]},"n1428":{"id":"n1428","loc":[-85.62923,41.957198]},"n1429":{"id":"n1429","loc":[-85.629322,41.957198]},"n143":{"id":"n143","loc":[-85.637559,41.942448]},"n1430":{"id":"n1430","loc":[-85.629321,41.957108]},"n1431":{"id":"n1431","loc":[-85.629441,41.957108]},"n1432":{"id":"n1432","loc":[-85.62944,41.957049]},"n1433":{"id":"n1433","loc":[-85.629337,41.957018]},"n1434":{"id":"n1434","loc":[-85.629366,41.957028]},"n1435":{"id":"n1435","loc":[-85.629375,41.957044]},"n1436":{"id":"n1436","loc":[-85.629354,41.957071]},"n1437":{"id":"n1437","loc":[-85.629317,41.957071]},"n1438":{"id":"n1438","loc":[-85.62929,41.957074]},"n1439":{"id":"n1439","loc":[-85.62927,41.957084]},"n144":{"id":"n144","loc":[-85.637036,41.942454]},"n1440":{"id":"n1440","loc":[-85.629232,41.957081]},"n1441":{"id":"n1441","loc":[-85.629222,41.957057]},"n1442":{"id":"n1442","loc":[-85.629259,41.957025]},"n1443":{"id":"n1443","loc":[-85.629293,41.957017]},"n1444":{"id":"n1444","loc":[-85.629251,41.957085]},"n1445":{"id":"n1445","loc":[-85.629235,41.957041]},"n1446":{"id":"n1446","loc":[-85.62937,41.95706]},"n1447":{"id":"n1447","loc":[-85.629531,41.956909]},"n1448":{"id":"n1448","loc":[-85.629408,41.956909]},"n1449":{"id":"n1449","loc":[-85.629402,41.956681]},"n145":{"id":"n145","loc":[-85.636692,41.942828]},"n1450":{"id":"n1450","loc":[-85.62953,41.956681]},"n1451":{"id":"n1451","loc":[-85.629402,41.956728]},"n1452":{"id":"n1452","loc":[-85.629408,41.956845]},"n1453":{"id":"n1453","loc":[-85.629385,41.956845]},"n1454":{"id":"n1454","loc":[-85.629384,41.956728]},"n1455":{"id":"n1455","loc":[-85.629063,41.956973]},"n1456":{"id":"n1456","loc":[-85.629064,41.957009]},"n1457":{"id":"n1457","loc":[-85.62902,41.957009]},"n1458":{"id":"n1458","loc":[-85.629019,41.956973]},"n1459":{"id":"n1459","loc":[-85.629136,41.956633]},"n146":{"id":"n146","loc":[-85.635929,41.942826]},"n1460":{"id":"n1460","loc":[-85.629084,41.956632]},"n1461":{"id":"n1461","loc":[-85.629084,41.956605]},"n1462":{"id":"n1462","loc":[-85.629136,41.956605]},"n1463":{"id":"n1463","loc":[-85.629153,41.956657]},"n1464":{"id":"n1464","loc":[-85.627914,41.956661]},"n1465":{"id":"n1465","loc":[-85.630096,41.956101]},"n1466":{"id":"n1466","loc":[-85.630097,41.95612]},"n1467":{"id":"n1467","loc":[-85.630011,41.956121]},"n1468":{"id":"n1468","loc":[-85.630015,41.956374]},"n1469":{"id":"n1469","loc":[-85.629148,41.95626]},"n147":{"id":"n147","loc":[-85.636433,41.942828]},"n1470":{"id":"n1470","loc":[-85.629527,41.956591]},"n1471":{"id":"n1471","loc":[-85.629405,41.956591]},"n1472":{"id":"n1472","loc":[-85.629405,41.956459]},"n1473":{"id":"n1473","loc":[-85.629369,41.956459]},"n1474":{"id":"n1474","loc":[-85.629369,41.956424]},"n1475":{"id":"n1475","loc":[-85.629413,41.956424]},"n1476":{"id":"n1476","loc":[-85.629414,41.956326]},"n1477":{"id":"n1477","loc":[-85.629522,41.956326]},"n1478":{"id":"n1478","loc":[-85.629522,41.956487]},"n1479":{"id":"n1479","loc":[-85.629527,41.956487]},"n148":{"id":"n148","loc":[-85.636435,41.942864],"tags":{"entrance":"yes"}},"n1480":{"id":"n1480","loc":[-85.629414,41.95634]},"n1481":{"id":"n1481","loc":[-85.629149,41.956338]},"n1482":{"id":"n1482","loc":[-85.62931,41.956531]},"n1483":{"id":"n1483","loc":[-85.629291,41.95655]},"n1484":{"id":"n1484","loc":[-85.629255,41.95655]},"n1485":{"id":"n1485","loc":[-85.629236,41.956533]},"n1486":{"id":"n1486","loc":[-85.629237,41.956461]},"n1487":{"id":"n1487","loc":[-85.629257,41.956445]},"n1488":{"id":"n1488","loc":[-85.629257,41.956428]},"n1489":{"id":"n1489","loc":[-85.629287,41.956428]},"n149":{"id":"n149","loc":[-85.637235,41.942622]},"n1490":{"id":"n1490","loc":[-85.629287,41.956445]},"n1491":{"id":"n1491","loc":[-85.62931,41.95646]},"n1492":{"id":"n1492","loc":[-85.629049,41.956425]},"n1493":{"id":"n1493","loc":[-85.628907,41.956427]},"n1494":{"id":"n1494","loc":[-85.628907,41.956455]},"n1495":{"id":"n1495","loc":[-85.628841,41.956455]},"n1496":{"id":"n1496","loc":[-85.62884,41.956424]},"n1497":{"id":"n1497","loc":[-85.628764,41.956425]},"n1498":{"id":"n1498","loc":[-85.628762,41.956323]},"n1499":{"id":"n1499","loc":[-85.628808,41.956323]},"n15":{"id":"n15","loc":[-85.633477,41.940187]},"n150":{"id":"n150","loc":[-85.637247,41.943116]},"n1500":{"id":"n1500","loc":[-85.628808,41.956314]},"n1501":{"id":"n1501","loc":[-85.628911,41.956313]},"n1502":{"id":"n1502","loc":[-85.628911,41.956322]},"n1503":{"id":"n1503","loc":[-85.62896,41.956322]},"n1504":{"id":"n1504","loc":[-85.62896,41.956348]},"n1505":{"id":"n1505","loc":[-85.629047,41.956347]},"n1506":{"id":"n1506","loc":[-85.628893,41.957263]},"n1507":{"id":"n1507","loc":[-85.628788,41.957264]},"n1508":{"id":"n1508","loc":[-85.628786,41.95711]},"n1509":{"id":"n1509","loc":[-85.628894,41.957109]},"n151":{"id":"n151","loc":[-85.637564,41.943116]},"n1510":{"id":"n1510","loc":[-85.628893,41.957075]},"n1511":{"id":"n1511","loc":[-85.628965,41.957075]},"n1512":{"id":"n1512","loc":[-85.628965,41.957111]},"n1513":{"id":"n1513","loc":[-85.629035,41.95711]},"n1514":{"id":"n1514","loc":[-85.629036,41.957209]},"n1515":{"id":"n1515","loc":[-85.628893,41.95721]},"n1516":{"id":"n1516","loc":[-85.631348,41.95773]},"n1517":{"id":"n1517","loc":[-85.631101,41.957732]},"n1518":{"id":"n1518","loc":[-85.631099,41.957558]},"n1519":{"id":"n1519","loc":[-85.63123,41.957557]},"n152":{"id":"n152","loc":[-85.637552,41.942619]},"n1520":{"id":"n1520","loc":[-85.631231,41.957618]},"n1521":{"id":"n1521","loc":[-85.63129,41.957618]},"n1522":{"id":"n1522","loc":[-85.63129,41.957651]},"n1523":{"id":"n1523","loc":[-85.631346,41.957651]},"n1524":{"id":"n1524","loc":[-85.631366,41.95802]},"n1525":{"id":"n1525","loc":[-85.631141,41.958021]},"n1526":{"id":"n1526","loc":[-85.63114,41.957943]},"n1527":{"id":"n1527","loc":[-85.631167,41.957943]},"n1528":{"id":"n1528","loc":[-85.631166,41.957808]},"n1529":{"id":"n1529","loc":[-85.631301,41.957807]},"n153":{"id":"n153","loc":[-85.63763,41.942528]},"n1530":{"id":"n1530","loc":[-85.631302,41.95789]},"n1531":{"id":"n1531","loc":[-85.631364,41.95789]},"n1532":{"id":"n1532","loc":[-85.631539,41.957754]},"n1533":{"id":"n1533","loc":[-85.631069,41.957756]},"n1534":{"id":"n1534","loc":[-85.631536,41.957518]},"n1535":{"id":"n1535","loc":[-85.631543,41.957995]},"n1536":{"id":"n1536","loc":[-85.631531,41.957748]},"n1537":{"id":"n1537","loc":[-85.631485,41.957748]},"n1538":{"id":"n1538","loc":[-85.631484,41.957698]},"n1539":{"id":"n1539","loc":[-85.631531,41.957698]},"n154":{"id":"n154","loc":[-85.637151,41.94253]},"n1540":{"id":"n1540","loc":[-85.631586,41.957742]},"n1541":{"id":"n1541","loc":[-85.63155,41.957742]},"n1542":{"id":"n1542","loc":[-85.631551,41.957702]},"n1543":{"id":"n1543","loc":[-85.631587,41.957702]},"n1544":{"id":"n1544","loc":[-85.631534,41.95807]},"n1545":{"id":"n1545","loc":[-85.631534,41.958097]},"n1546":{"id":"n1546","loc":[-85.631491,41.958097]},"n1547":{"id":"n1547","loc":[-85.631491,41.95807]},"n1548":{"id":"n1548","loc":[-85.631304,41.958861]},"n1549":{"id":"n1549","loc":[-85.631186,41.958862]},"n155":{"id":"n155","loc":[-85.63715,41.942424]},"n1550":{"id":"n1550","loc":[-85.631182,41.958653]},"n1551":{"id":"n1551","loc":[-85.6313,41.958651]},"n1552":{"id":"n1552","loc":[-85.631293,41.95854]},"n1553":{"id":"n1553","loc":[-85.631176,41.958539]},"n1554":{"id":"n1554","loc":[-85.631176,41.958377]},"n1555":{"id":"n1555","loc":[-85.631297,41.958377]},"n1556":{"id":"n1556","loc":[-85.631297,41.958422]},"n1557":{"id":"n1557","loc":[-85.631333,41.958422]},"n1558":{"id":"n1558","loc":[-85.631333,41.958479]},"n1559":{"id":"n1559","loc":[-85.631293,41.958479]},"n156":{"id":"n156","loc":[-85.637629,41.942422]},"n1560":{"id":"n1560","loc":[-85.631951,41.958908]},"n1561":{"id":"n1561","loc":[-85.631838,41.958909]},"n1562":{"id":"n1562","loc":[-85.631837,41.958847]},"n1563":{"id":"n1563","loc":[-85.631859,41.958847]},"n1564":{"id":"n1564","loc":[-85.631858,41.958746]},"n1565":{"id":"n1565","loc":[-85.631961,41.958745]},"n1566":{"id":"n1566","loc":[-85.631962,41.958812]},"n1567":{"id":"n1567","loc":[-85.631949,41.958813]},"n1568":{"id":"n1568","loc":[-85.631579,41.958913]},"n1569":{"id":"n1569","loc":[-85.631567,41.95864]},"n157":{"id":"n157","loc":[-85.638232,41.942477]},"n1570":{"id":"n1570","loc":[-85.631942,41.958639]},"n1571":{"id":"n1571","loc":[-85.631543,41.958594]},"n1572":{"id":"n1572","loc":[-85.631543,41.958065]},"n1573":{"id":"n1573","loc":[-85.631888,41.958546]},"n1574":{"id":"n1574","loc":[-85.631804,41.958546]},"n1575":{"id":"n1575","loc":[-85.631803,41.95841]},"n1576":{"id":"n1576","loc":[-85.631886,41.958409]},"n1577":{"id":"n1577","loc":[-85.631897,41.958125]},"n1578":{"id":"n1578","loc":[-85.631755,41.958126]},"n1579":{"id":"n1579","loc":[-85.631756,41.958174]},"n158":{"id":"n158","loc":[-85.637775,41.942483]},"n1580":{"id":"n1580","loc":[-85.63178,41.958174]},"n1581":{"id":"n1581","loc":[-85.631782,41.958272]},"n1582":{"id":"n1582","loc":[-85.631922,41.958271]},"n1583":{"id":"n1583","loc":[-85.631922,41.958244]},"n1584":{"id":"n1584","loc":[-85.631883,41.958245]},"n1585":{"id":"n1585","loc":[-85.631882,41.958175]},"n1586":{"id":"n1586","loc":[-85.631898,41.958175]},"n1587":{"id":"n1587","loc":[-85.631924,41.958032]},"n1588":{"id":"n1588","loc":[-85.631762,41.958032]},"n1589":{"id":"n1589","loc":[-85.63176,41.957827]},"n159":{"id":"n159","loc":[-85.638107,41.942512]},"n1590":{"id":"n1590","loc":[-85.631888,41.957826]},"n1591":{"id":"n1591","loc":[-85.631888,41.957892]},"n1592":{"id":"n1592","loc":[-85.631871,41.957892]},"n1593":{"id":"n1593","loc":[-85.631872,41.957949]},"n1594":{"id":"n1594","loc":[-85.631923,41.957949]},"n1595":{"id":"n1595","loc":[-85.631695,41.95795]},"n1596":{"id":"n1596","loc":[-85.631666,41.957975]},"n1597":{"id":"n1597","loc":[-85.63163,41.957975]},"n1598":{"id":"n1598","loc":[-85.6316,41.957951]},"n1599":{"id":"n1599","loc":[-85.6316,41.95785]},"n16":{"id":"n16","loc":[-85.63341,41.94032]},"n160":{"id":"n160","loc":[-85.637763,41.942514]},"n1600":{"id":"n1600","loc":[-85.63166,41.95785]},"n1601":{"id":"n1601","loc":[-85.631696,41.957873]},"n1602":{"id":"n1602","loc":[-85.631924,41.957762]},"n1603":{"id":"n1603","loc":[-85.631762,41.957762]},"n1604":{"id":"n1604","loc":[-85.631762,41.957708]},"n1605":{"id":"n1605","loc":[-85.631785,41.957708]},"n1606":{"id":"n1606","loc":[-85.631785,41.957606]},"n1607":{"id":"n1607","loc":[-85.631734,41.957606]},"n1608":{"id":"n1608","loc":[-85.631734,41.957538]},"n1609":{"id":"n1609","loc":[-85.631821,41.957538]},"n161":{"id":"n161","loc":[-85.637763,41.942445]},"n1610":{"id":"n1610","loc":[-85.631935,41.957545]},"n1611":{"id":"n1611","loc":[-85.631821,41.957544]},"n1612":{"id":"n1612","loc":[-85.631935,41.957645]},"n1613":{"id":"n1613","loc":[-85.631924,41.957645]},"n1614":{"id":"n1614","loc":[-85.627135,41.953828]},"n1615":{"id":"n1615","loc":[-85.633517,41.941353],"tags":{"man_made":"lighthouse"}},"n1616":{"id":"n1616","loc":[-85.633659,41.942041],"tags":{"amenity":"bbq"}},"n1617":{"id":"n1617","loc":[-85.63662,41.942911],"tags":{"amenity":"toilets"}},"n1618":{"id":"n1618","loc":[-85.637487,41.943876],"tags":{"amenity":"toilets"}},"n1619":{"id":"n1619","loc":[-85.634938,41.941917],"tags":{"amenity":"toilets"}},"n162":{"id":"n162","loc":[-85.638107,41.942443]},"n1620":{"id":"n1620","loc":[-85.632427,41.941678],"tags":{"amenity":"bbq"}},"n1621":{"id":"n1621","loc":[-85.638033,41.944568],"tags":{"amenity":"bbq"}},"n1622":{"id":"n1622","loc":[-85.638052,41.944522],"tags":{"amenity":"bbq"}},"n1623":{"id":"n1623","loc":[-85.635001,41.941965]},"n1624":{"id":"n1624","loc":[-85.634635,41.941884]},"n1625":{"id":"n1625","loc":[-85.634667,41.941894]},"n1626":{"id":"n1626","loc":[-85.634791,41.942011]},"n1627":{"id":"n1627","loc":[-85.634749,41.941938]},"n1628":{"id":"n1628","loc":[-85.627295,41.953946],"tags":{"barrier":"gate"}},"n1629":{"id":"n1629","loc":[-85.629076,41.954689]},"n163":{"id":"n163","loc":[-85.638813,41.942475]},"n1630":{"id":"n1630","loc":[-85.640667,41.942595]},"n1631":{"id":"n1631","loc":[-85.639455,41.94261]},"n1632":{"id":"n1632","loc":[-85.643407,41.942336]},"n1633":{"id":"n1633","loc":[-85.641845,41.941316]},"n1634":{"id":"n1634","loc":[-85.643322,41.942224]},"n1635":{"id":"n1635","loc":[-85.643301,41.942124]},"n1636":{"id":"n1636","loc":[-85.640639,41.941326]},"n1637":{"id":"n1637","loc":[-85.640614,41.940058]},"n1638":{"id":"n1638","loc":[-85.639428,41.941335]},"n1639":{"id":"n1639","loc":[-85.643078,41.941293]},"n164":{"id":"n164","loc":[-85.63883,41.942422]},"n1640":{"id":"n1640","loc":[-85.64371,41.942302]},"n1641":{"id":"n1641","loc":[-85.643056,41.94001]},"n1642":{"id":"n1642","loc":[-85.643097,41.942575],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n1643":{"id":"n1643","loc":[-85.641855,41.942586]},"n1644":{"id":"n1644","loc":[-85.643549,41.942209]},"n1645":{"id":"n1645","loc":[-85.639359,41.94007]},"n1646":{"id":"n1646","loc":[-85.642797,41.940522]},"n1647":{"id":"n1647","loc":[-85.642589,41.940523]},"n1648":{"id":"n1648","loc":[-85.642587,41.940287]},"n1649":{"id":"n1649","loc":[-85.642797,41.940286]},"n165":{"id":"n165","loc":[-85.63883,41.942508]},"n1650":{"id":"n1650","loc":[-85.642571,41.940523]},"n1651":{"id":"n1651","loc":[-85.642568,41.940286]},"n1652":{"id":"n1652","loc":[-85.642316,41.940289]},"n1653":{"id":"n1653","loc":[-85.642321,41.940436]},"n1654":{"id":"n1654","loc":[-85.642292,41.940458]},"n1655":{"id":"n1655","loc":[-85.642287,41.940483]},"n1656":{"id":"n1656","loc":[-85.642323,41.940509]},"n1657":{"id":"n1657","loc":[-85.642385,41.940511]},"n1658":{"id":"n1658","loc":[-85.642408,41.940526]},"n1659":{"id":"n1659","loc":[-85.641962,41.94109]},"n166":{"id":"n166","loc":[-85.638364,41.942508]},"n1660":{"id":"n1660","loc":[-85.642753,41.941084]},"n1661":{"id":"n1661","loc":[-85.642752,41.941004]},"n1662":{"id":"n1662","loc":[-85.642806,41.941003]},"n1663":{"id":"n1663","loc":[-85.642803,41.940731]},"n1664":{"id":"n1664","loc":[-85.642741,41.940732]},"n1665":{"id":"n1665","loc":[-85.64274,41.940645]},"n1666":{"id":"n1666","loc":[-85.641957,41.940651]},"n1667":{"id":"n1667","loc":[-85.642937,41.941241]},"n1668":{"id":"n1668","loc":[-85.641776,41.941253]},"n1669":{"id":"n1669","loc":[-85.641766,41.940598]},"n167":{"id":"n167","loc":[-85.638836,41.942167]},"n1670":{"id":"n1670","loc":[-85.64198,41.940598]},"n1671":{"id":"n1671","loc":[-85.641961,41.940137]},"n1672":{"id":"n1672","loc":[-85.642934,41.94012]},"n1673":{"id":"n1673","loc":[-85.643074,41.941173]},"n1674":{"id":"n1674","loc":[-85.642841,41.940997]},"n1675":{"id":"n1675","loc":[-85.642839,41.940721]},"n1676":{"id":"n1676","loc":[-85.643065,41.940552]},"n1677":{"id":"n1677","loc":[-85.642732,41.94124]},"n1678":{"id":"n1678","loc":[-85.641815,41.941246]},"n1679":{"id":"n1679","loc":[-85.641813,41.941132]},"n168":{"id":"n168","loc":[-85.638836,41.94229]},"n1680":{"id":"n1680","loc":[-85.641839,41.941111]},"n1681":{"id":"n1681","loc":[-85.641884,41.941098]},"n1682":{"id":"n1682","loc":[-85.642732,41.941092]},"n1683":{"id":"n1683","loc":[-85.642776,41.941302]},"n1684":{"id":"n1684","loc":[-85.632788,41.946236]},"n1685":{"id":"n1685","loc":[-85.622342,41.953127]},"n1686":{"id":"n1686","loc":[-85.641848,41.941167]},"n1687":{"id":"n1687","loc":[-85.643753,41.941503]},"n1688":{"id":"n1688","loc":[-85.643762,41.942119]},"n1689":{"id":"n1689","loc":[-85.64238,41.942262]},"n169":{"id":"n169","loc":[-85.638594,41.94229]},"n1690":{"id":"n1690","loc":[-85.642374,41.941944]},"n1691":{"id":"n1691","loc":[-85.642518,41.941943]},"n1692":{"id":"n1692","loc":[-85.642519,41.94198]},"n1693":{"id":"n1693","loc":[-85.642831,41.941977]},"n1694":{"id":"n1694","loc":[-85.642837,41.942312]},"n1695":{"id":"n1695","loc":[-85.642495,41.942315]},"n1696":{"id":"n1696","loc":[-85.642494,41.942261]},"n1697":{"id":"n1697","loc":[-85.641087,41.942433]},"n1698":{"id":"n1698","loc":[-85.641081,41.942006]},"n1699":{"id":"n1699","loc":[-85.641244,41.942005]},"n17":{"id":"n17","loc":[-85.633478,41.94081]},"n170":{"id":"n170","loc":[-85.638594,41.942422]},"n1700":{"id":"n1700","loc":[-85.64125,41.942431]},"n1701":{"id":"n1701","loc":[-85.641331,41.942968]},"n1702":{"id":"n1702","loc":[-85.641328,41.942713]},"n1703":{"id":"n1703","loc":[-85.641521,41.942712]},"n1704":{"id":"n1704","loc":[-85.641523,41.942924]},"n1705":{"id":"n1705","loc":[-85.641504,41.942924]},"n1706":{"id":"n1706","loc":[-85.641505,41.942967]},"n1707":{"id":"n1707","loc":[-85.638612,41.942408]},"n1708":{"id":"n1708","loc":[-85.638612,41.942327]},"n1709":{"id":"n1709","loc":[-85.638775,41.942327]},"n171":{"id":"n171","loc":[-85.638364,41.942356]},"n1710":{"id":"n1710","loc":[-85.638775,41.942299]},"n1711":{"id":"n1711","loc":[-85.638835,41.942298]},"n1712":{"id":"n1712","loc":[-85.638835,41.942407]},"n1713":{"id":"n1713","loc":[-85.639116,41.942444]},"n1714":{"id":"n1714","loc":[-85.639114,41.942362]},"n1715":{"id":"n1715","loc":[-85.639294,41.94236]},"n1716":{"id":"n1716","loc":[-85.639296,41.942442]},"n1717":{"id":"n1717","loc":[-85.639808,41.942385]},"n1718":{"id":"n1718","loc":[-85.639805,41.942285]},"n1719":{"id":"n1719","loc":[-85.639988,41.942283]},"n172":{"id":"n172","loc":[-85.638364,41.942167]},"n1720":{"id":"n1720","loc":[-85.63999,41.942383]},"n1721":{"id":"n1721","loc":[-85.639633,41.943023]},"n1722":{"id":"n1722","loc":[-85.639867,41.943019]},"n1723":{"id":"n1723","loc":[-85.639866,41.942964]},"n1724":{"id":"n1724","loc":[-85.639888,41.942963]},"n1725":{"id":"n1725","loc":[-85.639883,41.942779]},"n1726":{"id":"n1726","loc":[-85.639851,41.94278]},"n1727":{"id":"n1727","loc":[-85.63985,41.94274]},"n1728":{"id":"n1728","loc":[-85.639789,41.942741]},"n1729":{"id":"n1729","loc":[-85.639789,41.942753]},"n173":{"id":"n173","loc":[-85.639038,41.942463]},"n1730":{"id":"n1730","loc":[-85.639698,41.942754]},"n1731":{"id":"n1731","loc":[-85.639699,41.942788]},"n1732":{"id":"n1732","loc":[-85.639675,41.942789]},"n1733":{"id":"n1733","loc":[-85.639676,41.94283]},"n1734":{"id":"n1734","loc":[-85.639701,41.942829]},"n1735":{"id":"n1735","loc":[-85.639702,41.942869]},"n1736":{"id":"n1736","loc":[-85.639629,41.94287]},"n1737":{"id":"n1737","loc":[-85.643568,41.942946]},"n1738":{"id":"n1738","loc":[-85.643568,41.942777]},"n1739":{"id":"n1739","loc":[-85.643401,41.942777]},"n174":{"id":"n174","loc":[-85.638897,41.942464]},"n1740":{"id":"n1740","loc":[-85.643401,41.942863]},"n1741":{"id":"n1741","loc":[-85.643448,41.942863]},"n1742":{"id":"n1742","loc":[-85.643448,41.942946]},"n1743":{"id":"n1743","loc":[-85.642836,41.942981]},"n1744":{"id":"n1744","loc":[-85.642917,41.942979]},"n1745":{"id":"n1745","loc":[-85.642914,41.942904]},"n1746":{"id":"n1746","loc":[-85.642938,41.942903]},"n1747":{"id":"n1747","loc":[-85.642935,41.942813]},"n1748":{"id":"n1748","loc":[-85.642775,41.942816]},"n1749":{"id":"n1749","loc":[-85.642778,41.942906]},"n175":{"id":"n175","loc":[-85.638897,41.942423]},"n1750":{"id":"n1750","loc":[-85.642833,41.942905]},"n1751":{"id":"n1751","loc":[-85.642302,41.942886]},"n1752":{"id":"n1752","loc":[-85.642299,41.942721]},"n1753":{"id":"n1753","loc":[-85.642422,41.94272]},"n1754":{"id":"n1754","loc":[-85.642425,41.942868]},"n1755":{"id":"n1755","loc":[-85.642385,41.942869]},"n1756":{"id":"n1756","loc":[-85.642385,41.942885]},"n1757":{"id":"n1757","loc":[-85.641533,41.942939]},"n1758":{"id":"n1758","loc":[-85.64161,41.942877]},"n1759":{"id":"n1759","loc":[-85.641676,41.942922]},"n176":{"id":"n176","loc":[-85.638853,41.942423]},"n1760":{"id":"n1760","loc":[-85.6416,41.942985]},"n1761":{"id":"n1761","loc":[-85.64206,41.942802]},"n1762":{"id":"n1762","loc":[-85.642059,41.942741]},"n1763":{"id":"n1763","loc":[-85.642196,41.942741]},"n1764":{"id":"n1764","loc":[-85.642196,41.942818]},"n1765":{"id":"n1765","loc":[-85.642128,41.942819]},"n1766":{"id":"n1766","loc":[-85.642128,41.942801]},"n1767":{"id":"n1767","loc":[-85.640943,41.942934]},"n1768":{"id":"n1768","loc":[-85.641035,41.942933]},"n1769":{"id":"n1769","loc":[-85.641032,41.942797]},"n177":{"id":"n177","loc":[-85.638852,41.94237]},"n1770":{"id":"n1770","loc":[-85.640997,41.942798]},"n1771":{"id":"n1771","loc":[-85.640996,41.942764]},"n1772":{"id":"n1772","loc":[-85.640861,41.942766]},"n1773":{"id":"n1773","loc":[-85.640862,41.942848]},"n1774":{"id":"n1774","loc":[-85.640941,41.942847]},"n1775":{"id":"n1775","loc":[-85.643766,41.942226]},"n1776":{"id":"n1776","loc":[-85.643768,41.942407]},"n1777":{"id":"n1777","loc":[-85.643218,41.94177]},"n1778":{"id":"n1778","loc":[-85.64321,41.941327]},"n1779":{"id":"n1779","loc":[-85.643649,41.941323]},"n178":{"id":"n178","loc":[-85.638892,41.94237]},"n1780":{"id":"n1780","loc":[-85.643656,41.941716]},"n1781":{"id":"n1781","loc":[-85.64358,41.941717]},"n1782":{"id":"n1782","loc":[-85.64358,41.941767]},"n1783":{"id":"n1783","loc":[-85.64382,41.941495]},"n1784":{"id":"n1784","loc":[-85.643817,41.941317]},"n1785":{"id":"n1785","loc":[-85.643235,41.941833]},"n1786":{"id":"n1786","loc":[-85.64335,41.941842]},"n1787":{"id":"n1787","loc":[-85.643504,41.941903]},"n1788":{"id":"n1788","loc":[-85.643554,41.941946]},"n1789":{"id":"n1789","loc":[-85.643618,41.942015]},"n179":{"id":"n179","loc":[-85.638891,41.942334]},"n1790":{"id":"n1790","loc":[-85.64346,41.941971]},"n1791":{"id":"n1791","loc":[-85.643528,41.942468]},"n1792":{"id":"n1792","loc":[-85.643621,41.942363]},"n1793":{"id":"n1793","loc":[-85.643496,41.942297]},"n1794":{"id":"n1794","loc":[-85.643446,41.942246]},"n1795":{"id":"n1795","loc":[-85.643398,41.942177]},"n1796":{"id":"n1796","loc":[-85.643398,41.942031]},"n1797":{"id":"n1797","loc":[-85.621531,41.952693]},"n1798":{"id":"n1798","loc":[-85.643221,41.942028]},"n1799":{"id":"n1799","loc":[-85.643225,41.942276]},"n18":{"id":"n18","loc":[-85.63345,41.94071]},"n180":{"id":"n180","loc":[-85.639037,41.942334]},"n1800":{"id":"n1800","loc":[-85.643265,41.942347]},"n1801":{"id":"n1801","loc":[-85.643323,41.942413]},"n1802":{"id":"n1802","loc":[-85.643411,41.94247]},"n1803":{"id":"n1803","loc":[-85.643459,41.942435]},"n1804":{"id":"n1804","loc":[-85.643767,41.942307]},"n1805":{"id":"n1805","loc":[-85.643661,41.942293]},"n1806":{"id":"n1806","loc":[-85.643578,41.942247]},"n1807":{"id":"n1807","loc":[-85.643522,41.942125]},"n1808":{"id":"n1808","loc":[-85.643515,41.942061]},"n1809":{"id":"n1809","loc":[-85.643346,41.941924]},"n181":{"id":"n181","loc":[-85.638074,41.941839]},"n1810":{"id":"n1810","loc":[-85.643086,41.94192]},"n1811":{"id":"n1811","loc":[-85.643529,41.94217]},"n1812":{"id":"n1812","loc":[-85.643489,41.942003]},"n1813":{"id":"n1813","loc":[-85.643295,41.941919]},"n1814":{"id":"n1814","loc":[-85.643305,41.942163]},"n1815":{"id":"n1815","loc":[-85.643354,41.942285]},"n1816":{"id":"n1816","loc":[-85.643472,41.942389]},"n1817":{"id":"n1817","loc":[-85.643608,41.942271]},"n1818":{"id":"n1818","loc":[-85.643876,41.941402]},"n1819":{"id":"n1819","loc":[-85.643818,41.941369]},"n182":{"id":"n182","loc":[-85.638076,41.941942]},"n1820":{"id":"n1820","loc":[-85.643682,41.941304]},"n1821":{"id":"n1821","loc":[-85.64359,41.941286]},"n1822":{"id":"n1822","loc":[-85.643317,41.941727]},"n1823":{"id":"n1823","loc":[-85.643301,41.941286]},"n1824":{"id":"n1824","loc":[-85.643553,41.941698]},"n1825":{"id":"n1825","loc":[-85.643543,41.941286]},"n1826":{"id":"n1826","loc":[-85.636967,41.940118]},"n1827":{"id":"n1827","loc":[-85.63378,41.940114]},"n1828":{"id":"n1828","loc":[-85.637254,41.940075]},"n1829":{"id":"n1829","loc":[-85.637002,41.941355]},"n183":{"id":"n183","loc":[-85.637955,41.941944]},"n1830":{"id":"n1830","loc":[-85.643532,41.94204]},"n1831":{"id":"n1831","loc":[-85.638235,41.942615]},"n1832":{"id":"n1832","loc":[-85.637039,41.942624]},"n1833":{"id":"n1833","loc":[-85.636369,41.94266]},"n1834":{"id":"n1834","loc":[-85.63582,41.942771],"tags":{"highway":"traffic_signals","traffic_signals":"emergency"}},"n1835":{"id":"n1835","loc":[-85.634873,41.943044]},"n1836":{"id":"n1836","loc":[-85.643482,41.941976]},"n1837":{"id":"n1837","loc":[-85.64345,41.941945]},"n1838":{"id":"n1838","loc":[-85.641885,41.943851]},"n1839":{"id":"n1839","loc":[-85.641915,41.945121]},"n184":{"id":"n184","loc":[-85.637953,41.94184]},"n1840":{"id":"n1840","loc":[-85.639454,41.943871]},"n1841":{"id":"n1841","loc":[-85.639491,41.945191]},"n1842":{"id":"n1842","loc":[-85.635768,41.940113]},"n1843":{"id":"n1843","loc":[-85.638206,41.941345]},"n1844":{"id":"n1844","loc":[-85.640721,41.94513]},"n1845":{"id":"n1845","loc":[-85.643137,41.945103]},"n1846":{"id":"n1846","loc":[-85.638199,41.940079]},"n1847":{"id":"n1847","loc":[-85.640688,41.943861]},"n1848":{"id":"n1848","loc":[-85.643397,41.941924]},"n1849":{"id":"n1849","loc":[-85.643117,41.943841]},"n185":{"id":"n185","loc":[-85.637953,41.941866]},"n1850":{"id":"n1850","loc":[-85.636731,41.94263]},"n1851":{"id":"n1851","loc":[-85.63518,41.942955],"tags":{"highway":"crossing"}},"n1852":{"id":"n1852","loc":[-85.636152,41.942695]},"n1853":{"id":"n1853","loc":[-85.644202,41.941499]},"n1854":{"id":"n1854","loc":[-85.644211,41.942116]},"n1855":{"id":"n1855","loc":[-85.644233,41.942404]},"n1856":{"id":"n1856","loc":[-85.644231,41.942223]},"n1857":{"id":"n1857","loc":[-85.644133,41.941315]},"n1858":{"id":"n1858","loc":[-85.644136,41.941493]},"n1859":{"id":"n1859","loc":[-85.644345,41.942307]},"n186":{"id":"n186","loc":[-85.637873,41.941867]},"n1860":{"id":"n1860","loc":[-85.644232,41.942304]},"n1861":{"id":"n1861","loc":[-85.644134,41.941403]},"n1862":{"id":"n1862","loc":[-85.63607,41.943005],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"fire_station","name":"Three Rivers Fire Department"}},"n1863":{"id":"n1863","loc":[-85.637,41.941236]},"n1864":{"id":"n1864","loc":[-85.634476,41.941475]},"n1865":{"id":"n1865","loc":[-85.635036,41.941858]},"n1866":{"id":"n1866","loc":[-85.635362,41.941962]},"n1867":{"id":"n1867","loc":[-85.635796,41.941962]},"n1868":{"id":"n1868","loc":[-85.63295,41.943006]},"n1869":{"id":"n1869","loc":[-85.634692,41.943098]},"n187":{"id":"n187","loc":[-85.637877,41.941975]},"n1870":{"id":"n1870","loc":[-85.633128,41.940484]},"n1871":{"id":"n1871","loc":[-85.633117,41.942798]},"n1872":{"id":"n1872","loc":[-85.633303,41.942412]},"n1873":{"id":"n1873","loc":[-85.633482,41.941912]},"n1874":{"id":"n1874","loc":[-85.633455,41.941359]},"n1875":{"id":"n1875","loc":[-85.633162,41.942679]},"n1876":{"id":"n1876","loc":[-85.634274,41.943479]},"n1877":{"id":"n1877","loc":[-85.634678,41.942909]},"n1878":{"id":"n1878","loc":[-85.6339,41.941453]},"n1879":{"id":"n1879","loc":[-85.634571,41.942774]},"n188":{"id":"n188","loc":[-85.636855,41.942488]},"n1880":{"id":"n1880","loc":[-85.63419,41.941732]},"n1881":{"id":"n1881","loc":[-85.634067,41.941565]},"n1882":{"id":"n1882","loc":[-85.63436,41.942358]},"n1883":{"id":"n1883","loc":[-85.634327,41.942247]},"n1884":{"id":"n1884","loc":[-85.633391,41.941231]},"n1885":{"id":"n1885","loc":[-85.634303,41.941972]},"n1886":{"id":"n1886","loc":[-85.633541,41.940147]},"n1887":{"id":"n1887","loc":[-85.633433,41.940252]},"n1888":{"id":"n1888","loc":[-85.633402,41.940411]},"n1889":{"id":"n1889","loc":[-85.633551,41.941023]},"n189":{"id":"n189","loc":[-85.636702,41.942488]},"n1890":{"id":"n1890","loc":[-85.633719,41.941186]},"n1891":{"id":"n1891","loc":[-85.633067,41.941845]},"n1892":{"id":"n1892","loc":[-85.634902,41.942766]},"n1893":{"id":"n1893","loc":[-85.634603,41.942202]},"n1894":{"id":"n1894","loc":[-85.634858,41.942152]},"n1895":{"id":"n1895","loc":[-85.634842,41.942269]},"n1896":{"id":"n1896","loc":[-85.634907,41.942313]},"n1897":{"id":"n1897","loc":[-85.635049,41.942331]},"n1898":{"id":"n1898","loc":[-85.635101,41.942281]},"n1899":{"id":"n1899","loc":[-85.635129,41.942144]},"n19":{"id":"n19","loc":[-85.633009,41.942229]},"n190":{"id":"n190","loc":[-85.636702,41.942434]},"n1900":{"id":"n1900","loc":[-85.635531,41.942143]},"n1901":{"id":"n1901","loc":[-85.635534,41.942577]},"n1902":{"id":"n1902","loc":[-85.635158,41.942656]},"n1903":{"id":"n1903","loc":[-85.635121,41.942703]},"n1904":{"id":"n1904","loc":[-85.635087,41.941508]},"n1905":{"id":"n1905","loc":[-85.63536,41.941106]},"n1906":{"id":"n1906","loc":[-85.635442,41.941094]},"n1907":{"id":"n1907","loc":[-85.635508,41.941104]},"n1908":{"id":"n1908","loc":[-85.635569,41.941125]},"n1909":{"id":"n1909","loc":[-85.635583,41.941106]},"n191":{"id":"n191","loc":[-85.636761,41.942434]},"n1910":{"id":"n1910","loc":[-85.635555,41.940976]},"n1911":{"id":"n1911","loc":[-85.635501,41.940915]},"n1912":{"id":"n1912","loc":[-85.635392,41.940922]},"n1913":{"id":"n1913","loc":[-85.635276,41.940974]},"n1914":{"id":"n1914","loc":[-85.63517,41.941204]},"n1915":{"id":"n1915","loc":[-85.634888,41.941517]},"n1916":{"id":"n1916","loc":[-85.634897,41.941576]},"n1917":{"id":"n1917","loc":[-85.634961,41.94164]},"n1918":{"id":"n1918","loc":[-85.635028,41.941659]},"n1919":{"id":"n1919","loc":[-85.635118,41.941621]},"n192":{"id":"n192","loc":[-85.636761,41.942369]},"n1920":{"id":"n1920","loc":[-85.635085,41.941558]},"n1921":{"id":"n1921","loc":[-85.63504,41.94136]},"n1922":{"id":"n1922","loc":[-85.635221,41.941077]},"n1923":{"id":"n1923","loc":[-85.634387,41.941559]},"n1924":{"id":"n1924","loc":[-85.634351,41.941587]},"n1925":{"id":"n1925","loc":[-85.634416,41.941756]},"n1926":{"id":"n1926","loc":[-85.634461,41.941797]},"n1927":{"id":"n1927","loc":[-85.634501,41.941819]},"n1928":{"id":"n1928","loc":[-85.634597,41.941816]},"n1929":{"id":"n1929","loc":[-85.634732,41.941724]},"n193":{"id":"n193","loc":[-85.636855,41.942369]},"n1930":{"id":"n1930","loc":[-85.634672,41.941775]},"n1931":{"id":"n1931","loc":[-85.633403,41.939101]},"n1932":{"id":"n1932","loc":[-85.633297,41.939397]},"n1933":{"id":"n1933","loc":[-85.633205,41.939674]},"n1934":{"id":"n1934","loc":[-85.63322,41.939777]},"n1935":{"id":"n1935","loc":[-85.633345,41.939936]},"n1936":{"id":"n1936","loc":[-85.633376,41.940002]},"n1937":{"id":"n1937","loc":[-85.633266,41.940228]},"n1938":{"id":"n1938","loc":[-85.633236,41.940352]},"n1939":{"id":"n1939","loc":[-85.633282,41.94063]},"n194":{"id":"n194","loc":[-85.636645,41.94249]},"n1940":{"id":"n1940","loc":[-85.633364,41.940874]},"n1941":{"id":"n1941","loc":[-85.633439,41.941052]},"n1942":{"id":"n1942","loc":[-85.633582,41.941172]},"n1943":{"id":"n1943","loc":[-85.633748,41.941273]},"n1944":{"id":"n1944","loc":[-85.634317,41.941527]},"n1945":{"id":"n1945","loc":[-85.634389,41.94174]},"n1946":{"id":"n1946","loc":[-85.634441,41.941801]},"n1947":{"id":"n1947","loc":[-85.634514,41.941837]},"n1948":{"id":"n1948","loc":[-85.634485,41.942005]},"n1949":{"id":"n1949","loc":[-85.63457,41.942202]},"n195":{"id":"n195","loc":[-85.636565,41.94249]},"n1950":{"id":"n1950","loc":[-85.634869,41.942769]},"n1951":{"id":"n1951","loc":[-85.634943,41.942792]},"n1952":{"id":"n1952","loc":[-85.635139,41.942882]},"n1953":{"id":"n1953","loc":[-85.634962,41.943161]},"n1954":{"id":"n1954","loc":[-85.635002,41.943131]},"n1955":{"id":"n1955","loc":[-85.635005,41.943091]},"n1956":{"id":"n1956","loc":[-85.635216,41.943033]},"n1957":{"id":"n1957","loc":[-85.634817,41.94267]},"n1958":{"id":"n1958","loc":[-85.634614,41.942599]},"n1959":{"id":"n1959","loc":[-85.634494,41.942381]},"n196":{"id":"n196","loc":[-85.636565,41.942474]},"n1960":{"id":"n1960","loc":[-85.634486,41.9423]},"n1961":{"id":"n1961","loc":[-85.634671,41.941795]},"n1962":{"id":"n1962","loc":[-85.634595,41.941831]},"n1963":{"id":"n1963","loc":[-85.634332,41.941866]},"n1964":{"id":"n1964","loc":[-85.634207,41.941885]},"n1965":{"id":"n1965","loc":[-85.634133,41.941892]},"n1966":{"id":"n1966","loc":[-85.634131,41.942203]},"n1967":{"id":"n1967","loc":[-85.634047,41.942327]},"n1968":{"id":"n1968","loc":[-85.634219,41.942793]},"n1969":{"id":"n1969","loc":[-85.634061,41.942392]},"n197":{"id":"n197","loc":[-85.636514,41.942474]},"n1970":{"id":"n1970","loc":[-85.633989,41.942407]},"n1971":{"id":"n1971","loc":[-85.633971,41.942356]},"n1972":{"id":"n1972","loc":[-85.63361,41.942423]},"n1973":{"id":"n1973","loc":[-85.633714,41.942682]},"n1974":{"id":"n1974","loc":[-85.633698,41.942863]},"n1975":{"id":"n1975","loc":[-85.633882,41.942865]},"n1976":{"id":"n1976","loc":[-85.633941,41.943007]},"n1977":{"id":"n1977","loc":[-85.633887,41.943035]},"n1978":{"id":"n1978","loc":[-85.633768,41.942815]},"n1979":{"id":"n1979","loc":[-85.633682,41.942351]},"n198":{"id":"n198","loc":[-85.636514,41.942326]},"n1980":{"id":"n1980","loc":[-85.634037,41.942273]},"n1981":{"id":"n1981","loc":[-85.634029,41.942252]},"n1982":{"id":"n1982","loc":[-85.633673,41.942331]},"n1983":{"id":"n1983","loc":[-85.634219,41.942571]},"n1984":{"id":"n1984","loc":[-85.634252,41.942565]},"n1985":{"id":"n1985","loc":[-85.634144,41.942299]},"n1986":{"id":"n1986","loc":[-85.634115,41.942306]},"n1987":{"id":"n1987","loc":[-85.634059,41.943094]},"n1988":{"id":"n1988","loc":[-85.633944,41.942903]},"n1989":{"id":"n1989","loc":[-85.634311,41.942821]},"n199":{"id":"n199","loc":[-85.636561,41.942326]},"n1990":{"id":"n1990","loc":[-85.634351,41.94277]},"n1991":{"id":"n1991","loc":[-85.634153,41.942254]},"n1992":{"id":"n1992","loc":[-85.634092,41.94222]},"n1993":{"id":"n1993","loc":[-85.633571,41.942336]},"n1994":{"id":"n1994","loc":[-85.633513,41.942387]},"n1995":{"id":"n1995","loc":[-85.633509,41.942455]},"n1996":{"id":"n1996","loc":[-85.63363,41.942665]},"n1997":{"id":"n1997","loc":[-85.63414,41.94286]},"n1998":{"id":"n1998","loc":[-85.63397,41.942449]},"n1999":{"id":"n1999","loc":[-85.633551,41.942529]},"n2":{"id":"n2","loc":[-85.627421,41.953877]},"n20":{"id":"n20","loc":[-85.633013,41.941438]},"n200":{"id":"n200","loc":[-85.636561,41.942311]},"n2000":{"id":"n2000","loc":[-85.633741,41.942493]},"n2001":{"id":"n2001","loc":[-85.633894,41.942869]},"n2002":{"id":"n2002","loc":[-85.634132,41.941954]},"n2003":{"id":"n2003","loc":[-85.634032,41.942038]},"n2004":{"id":"n2004","loc":[-85.633765,41.942238]},"n2005":{"id":"n2005","loc":[-85.63376,41.942268]},"n2006":{"id":"n2006","loc":[-85.633768,41.942293]},"n2007":{"id":"n2007","loc":[-85.633808,41.942386]},"n2008":{"id":"n2008","loc":[-85.634946,41.941663]},"n2009":{"id":"n2009","loc":[-85.63511,41.941697]},"n201":{"id":"n201","loc":[-85.636621,41.942311]},"n2010":{"id":"n2010","loc":[-85.635337,41.94168]},"n2011":{"id":"n2011","loc":[-85.634997,41.942251]},"n2012":{"id":"n2012","loc":[-85.635013,41.942173]},"n2013":{"id":"n2013","loc":[-85.634876,41.942157]},"n2014":{"id":"n2014","loc":[-85.634859,41.942235]},"n2015":{"id":"n2015","loc":[-85.634992,41.941951]},"n2016":{"id":"n2016","loc":[-85.634952,41.941877]},"n2017":{"id":"n2017","loc":[-85.634844,41.94191]},"n2018":{"id":"n2018","loc":[-85.634884,41.941983]},"n2019":{"id":"n2019","loc":[-85.635189,41.941691]},"n202":{"id":"n202","loc":[-85.636621,41.942351]},"n2020":{"id":"n2020","loc":[-85.635089,41.941896]},"n2021":{"id":"n2021","loc":[-85.635077,41.941964]},"n2022":{"id":"n2022","loc":[-85.635058,41.942147]},"n2023":{"id":"n2023","loc":[-85.635099,41.942161]},"n2024":{"id":"n2024","loc":[-85.635099,41.942213]},"n2025":{"id":"n2025","loc":[-85.635079,41.942285]},"n2026":{"id":"n2026","loc":[-85.635047,41.942316]},"n2027":{"id":"n2027","loc":[-85.634925,41.9423]},"n2028":{"id":"n2028","loc":[-85.634911,41.942276]},"n2029":{"id":"n2029","loc":[-85.634917,41.942242]},"n203":{"id":"n203","loc":[-85.63666,41.942351]},"n2030":{"id":"n2030","loc":[-85.634698,41.941898]},"n2031":{"id":"n2031","loc":[-85.634964,41.941878]},"n2032":{"id":"n2032","loc":[-85.635025,41.941929]},"n2033":{"id":"n2033","loc":[-85.634862,41.941887]},"n2034":{"id":"n2034","loc":[-85.634811,41.94181]},"n2035":{"id":"n2035","loc":[-85.634731,41.941745]},"n2036":{"id":"n2036","loc":[-85.634933,41.94176]},"n2037":{"id":"n2037","loc":[-85.634942,41.942145]},"n2038":{"id":"n2038","loc":[-85.634944,41.942065]},"n2039":{"id":"n2039","loc":[-85.634914,41.941996]},"n204":{"id":"n204","loc":[-85.63666,41.942453]},"n2040":{"id":"n2040","loc":[-85.634981,41.941979]},"n2041":{"id":"n2041","loc":[-85.633419,41.942172]},"n2042":{"id":"n2042","loc":[-85.633509,41.941631]},"n2043":{"id":"n2043","loc":[-85.633686,41.942937]},"n2044":{"id":"n2044","loc":[-85.633371,41.942722]},"n2045":{"id":"n2045","loc":[-85.633291,41.942538]},"n2046":{"id":"n2046","loc":[-85.633902,41.940941]},"n2047":{"id":"n2047","loc":[-85.635254,41.940939]},"n2048":{"id":"n2048","loc":[-85.635686,41.940829]},"n2049":{"id":"n2049","loc":[-85.635712,41.942681]},"n205":{"id":"n205","loc":[-85.636645,41.942453]},"n2050":{"id":"n2050","loc":[-85.633721,41.942118]},"n2051":{"id":"n2051","loc":[-85.633698,41.942057]},"n2052":{"id":"n2052","loc":[-85.633591,41.942079]},"n2053":{"id":"n2053","loc":[-85.633614,41.94214]},"n2054":{"id":"n2054","loc":[-85.633968,41.941099]},"n2055":{"id":"n2055","loc":[-85.633907,41.941138]},"n2056":{"id":"n2056","loc":[-85.633968,41.941197]},"n2057":{"id":"n2057","loc":[-85.63404,41.941162]},"n2058":{"id":"n2058","loc":[-85.634839,41.941665]},"n2059":{"id":"n2059","loc":[-85.635314,41.943035]},"n206":{"id":"n206","loc":[-85.636394,41.942471]},"n2060":{"id":"n2060","loc":[-85.634919,41.943142]},"n2061":{"id":"n2061","loc":[-85.636433,41.942959],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"townhall","name":"Three Rivers City Hall"}},"n2062":{"id":"n2062","loc":[-85.637039,41.942789]},"n2063":{"id":"n2063","loc":[-85.636333,41.94279]},"n2064":{"id":"n2064","loc":[-85.634484,41.940726]},"n2065":{"id":"n2065","loc":[-85.634483,41.940603]},"n2066":{"id":"n2066","loc":[-85.634908,41.940601]},"n2067":{"id":"n2067","loc":[-85.634908,41.94053]},"n2068":{"id":"n2068","loc":[-85.634934,41.94053]},"n2069":{"id":"n2069","loc":[-85.634934,41.940496]},"n207":{"id":"n207","loc":[-85.636262,41.942472]},"n2070":{"id":"n2070","loc":[-85.63504,41.940495]},"n2071":{"id":"n2071","loc":[-85.63504,41.940531]},"n2072":{"id":"n2072","loc":[-85.635068,41.940531]},"n2073":{"id":"n2073","loc":[-85.635071,41.940794]},"n2074":{"id":"n2074","loc":[-85.635183,41.940793]},"n2075":{"id":"n2075","loc":[-85.635185,41.940916]},"n2076":{"id":"n2076","loc":[-85.634799,41.940919]},"n2077":{"id":"n2077","loc":[-85.634798,41.940798]},"n2078":{"id":"n2078","loc":[-85.634925,41.940797]},"n2079":{"id":"n2079","loc":[-85.634924,41.940724]},"n208":{"id":"n208","loc":[-85.636261,41.94233]},"n2080":{"id":"n2080","loc":[-85.637448,41.938233]},"n2081":{"id":"n2081","loc":[-85.634168,41.943279]},"n2082":{"id":"n2082","loc":[-85.635744,41.938248]},"n2083":{"id":"n2083","loc":[-85.638744,41.951211]},"n2084":{"id":"n2084","loc":[-85.636421,41.946392]},"n2085":{"id":"n2085","loc":[-85.635965,41.945809]},"n2086":{"id":"n2086","loc":[-85.635683,41.945449]},"n2087":{"id":"n2087","loc":[-85.635281,41.945025]},"n2088":{"id":"n2088","loc":[-85.632443,41.942574]},"n2089":{"id":"n2089","loc":[-85.638243,41.943674]},"n209":{"id":"n209","loc":[-85.636353,41.942329]},"n2090":{"id":"n2090","loc":[-85.638228,41.943747]},"n2091":{"id":"n2091","loc":[-85.638163,41.943797]},"n2092":{"id":"n2092","loc":[-85.638089,41.943832]},"n2093":{"id":"n2093","loc":[-85.637969,41.943841]},"n2094":{"id":"n2094","loc":[-85.637841,41.943833]},"n2095":{"id":"n2095","loc":[-85.637342,41.943734]},"n2096":{"id":"n2096","loc":[-85.637232,41.943707]},"n2097":{"id":"n2097","loc":[-85.637163,41.943668]},"n2098":{"id":"n2098","loc":[-85.637118,41.943615]},"n2099":{"id":"n2099","loc":[-85.637078,41.943494]},"n21":{"id":"n21","loc":[-85.634126,41.942228]},"n210":{"id":"n210","loc":[-85.636354,41.94239]},"n2100":{"id":"n2100","loc":[-85.632903,41.998429],"tags":{"railway":"level_crossing"}},"n2101":{"id":"n2101","loc":[-85.633616,41.943581],"tags":{"railway":"level_crossing"}},"n2102":{"id":"n2102","loc":[-85.636943,41.947311]},"n2103":{"id":"n2103","loc":[-85.6376,41.94854]},"n2104":{"id":"n2104","loc":[-85.634565,41.93631]},"n2105":{"id":"n2105","loc":[-85.629597,41.942562]},"n2106":{"id":"n2106","loc":[-85.630821,41.943077]},"n2107":{"id":"n2107","loc":[-85.627473,41.940659]},"n2108":{"id":"n2108","loc":[-85.629708,41.942872]},"n2109":{"id":"n2109","loc":[-85.634093,41.935448]},"n211":{"id":"n211","loc":[-85.636393,41.94239]},"n2110":{"id":"n2110","loc":[-85.630413,41.94366]},"n2111":{"id":"n2111","loc":[-85.630488,41.942662]},"n2112":{"id":"n2112","loc":[-85.63361,41.936749]},"n2113":{"id":"n2113","loc":[-85.630038,41.941808]},"n2114":{"id":"n2114","loc":[-85.632016,41.942922]},"n2115":{"id":"n2115","loc":[-85.631525,41.944303]},"n2116":{"id":"n2116","loc":[-85.626862,41.94022]},"n2117":{"id":"n2117","loc":[-85.629673,41.94121]},"n2118":{"id":"n2118","loc":[-85.632752,41.943101]},"n2119":{"id":"n2119","loc":[-85.631147,41.943201]},"n212":{"id":"n212","loc":[-85.63444,41.943176]},"n2120":{"id":"n2120","loc":[-85.624974,41.940579]},"n2121":{"id":"n2121","loc":[-85.629518,41.941783]},"n2122":{"id":"n2122","loc":[-85.632349,41.942699]},"n2123":{"id":"n2123","loc":[-85.628418,41.940356]},"n2124":{"id":"n2124","loc":[-85.629147,41.94129]},"n2125":{"id":"n2125","loc":[-85.631111,41.943979]},"n2126":{"id":"n2126","loc":[-85.632087,41.940013]},"n2127":{"id":"n2127","loc":[-85.634469,41.935057]},"n2128":{"id":"n2128","loc":[-85.630097,41.943449]},"n2129":{"id":"n2129","loc":[-85.6331,41.937878]},"n213":{"id":"n213","loc":[-85.63375,41.942814]},"n2130":{"id":"n2130","loc":[-85.625274,41.941114]},"n2131":{"id":"n2131","loc":[-85.632632,41.941217]},"n2132":{"id":"n2132","loc":[-85.632739,41.941926]},"n2133":{"id":"n2133","loc":[-85.631647,41.94366]},"n2134":{"id":"n2134","loc":[-85.635059,41.935456]},"n2135":{"id":"n2135","loc":[-85.631259,41.944349]},"n2136":{"id":"n2136","loc":[-85.626336,41.940811]},"n2137":{"id":"n2137","loc":[-85.631507,41.943875]},"n2138":{"id":"n2138","loc":[-85.625081,41.940859]},"n2139":{"id":"n2139","loc":[-85.625778,41.940093]},"n214":{"id":"n214","loc":[-85.633674,41.942869]},"n2140":{"id":"n2140","loc":[-85.632641,41.942436]},"n2141":{"id":"n2141","loc":[-85.628825,41.941034]},"n2142":{"id":"n2142","loc":[-85.627913,41.940292]},"n2143":{"id":"n2143","loc":[-85.628943,41.940516]},"n2144":{"id":"n2144","loc":[-85.63139,41.943941]},"n2145":{"id":"n2145","loc":[-85.630081,41.94204]},"n2146":{"id":"n2146","loc":[-85.632194,41.93963]},"n2147":{"id":"n2147","loc":[-85.632913,41.93939]},"n2148":{"id":"n2148","loc":[-85.632001,41.943492]},"n2149":{"id":"n2149","loc":[-85.63149,41.943154]},"n215":{"id":"n215","loc":[-85.633542,41.942768]},"n2150":{"id":"n2150","loc":[-85.625167,41.940117]},"n2151":{"id":"n2151","loc":[-85.63287,41.939941]},"n2152":{"id":"n2152","loc":[-85.630789,41.943732]},"n2153":{"id":"n2153","loc":[-85.632173,41.940348]},"n2154":{"id":"n2154","loc":[-85.626587,41.940113]},"n2155":{"id":"n2155","loc":[-85.62684,41.940667]},"n2156":{"id":"n2156","loc":[-85.632527,41.938904]},"n2157":{"id":"n2157","loc":[-85.624866,41.94018]},"n2158":{"id":"n2158","loc":[-85.633267,41.93872]},"n2159":{"id":"n2159","loc":[-85.62934,41.940843]},"n216":{"id":"n216","loc":[-85.633618,41.942714]},"n2160":{"id":"n2160","loc":[-85.62272,41.953817]},"n2161":{"id":"n2161","loc":[-85.622555,41.954453]},"n2162":{"id":"n2162","loc":[-85.637225,41.944128]},"n2163":{"id":"n2163","loc":[-85.622628,41.953683]},"n2164":{"id":"n2164","loc":[-85.635441,41.943989]},"n2165":{"id":"n2165","loc":[-85.622629,41.953807]},"n2166":{"id":"n2166","loc":[-85.62262,41.953807]},"n2167":{"id":"n2167","loc":[-85.62262,41.953837]},"n2168":{"id":"n2168","loc":[-85.622532,41.953838]},"n2169":{"id":"n2169","loc":[-85.637469,41.944579]},"n217":{"id":"n217","loc":[-85.634001,41.942336]},"n2170":{"id":"n2170","loc":[-85.63688,41.943935]},"n2171":{"id":"n2171","loc":[-85.638263,41.946367]},"n2172":{"id":"n2172","loc":[-85.622532,41.953807]},"n2173":{"id":"n2173","loc":[-85.622353,41.953808]},"n2174":{"id":"n2174","loc":[-85.622352,41.953685]},"n2175":{"id":"n2175","loc":[-85.622464,41.953684]},"n2176":{"id":"n2176","loc":[-85.622464,41.953648]},"n2177":{"id":"n2177","loc":[-85.637136,41.94576]},"n2178":{"id":"n2178","loc":[-85.622521,41.953648]},"n2179":{"id":"n2179","loc":[-85.637129,41.945415]},"n218":{"id":"n218","loc":[-85.633825,41.942376]},"n2180":{"id":"n2180","loc":[-85.637473,41.94607]},"n2181":{"id":"n2181","loc":[-85.622521,41.953683]},"n2182":{"id":"n2182","loc":[-85.622717,41.954104]},"n2183":{"id":"n2183","loc":[-85.637769,41.946095]},"n2184":{"id":"n2184","loc":[-85.623872,41.953515]},"n2185":{"id":"n2185","loc":[-85.623851,41.953588]},"n2186":{"id":"n2186","loc":[-85.631385,41.94433]},"n2187":{"id":"n2187","loc":[-85.623608,41.953543]},"n2188":{"id":"n2188","loc":[-85.637308,41.944882]},"n2189":{"id":"n2189","loc":[-85.634898,41.944041]},"n219":{"id":"n219","loc":[-85.633807,41.942334]},"n2190":{"id":"n2190","loc":[-85.623604,41.953442]},"n2191":{"id":"n2191","loc":[-85.623705,41.953442]},"n2192":{"id":"n2192","loc":[-85.623708,41.953493]},"n2193":{"id":"n2193","loc":[-85.624064,41.952655]},"n2194":{"id":"n2194","loc":[-85.62395,41.952654]},"n2195":{"id":"n2195","loc":[-85.623951,41.952579]},"n2196":{"id":"n2196","loc":[-85.637435,41.944342]},"n2197":{"id":"n2197","loc":[-85.624064,41.952579]},"n2198":{"id":"n2198","loc":[-85.623812,41.952648]},"n2199":{"id":"n2199","loc":[-85.623813,41.952705]},"n22":{"id":"n22","loc":[-85.633531,41.942357]},"n220":{"id":"n220","loc":[-85.633983,41.942294]},"n2200":{"id":"n2200","loc":[-85.637169,41.945098]},"n2201":{"id":"n2201","loc":[-85.623552,41.952707]},"n2202":{"id":"n2202","loc":[-85.623551,41.95263]},"n2203":{"id":"n2203","loc":[-85.623701,41.952629]},"n2204":{"id":"n2204","loc":[-85.635894,41.943719]},"n2205":{"id":"n2205","loc":[-85.637297,41.945992]},"n2206":{"id":"n2206","loc":[-85.623724,41.952648]},"n2207":{"id":"n2207","loc":[-85.623812,41.952438]},"n2208":{"id":"n2208","loc":[-85.625239,41.952197]},"n2209":{"id":"n2209","loc":[-85.625232,41.952257]},"n221":{"id":"n221","loc":[-85.634182,41.942495]},"n2210":{"id":"n2210","loc":[-85.635175,41.94408]},"n2211":{"id":"n2211","loc":[-85.636381,41.943761]},"n2212":{"id":"n2212","loc":[-85.625115,41.952249]},"n2213":{"id":"n2213","loc":[-85.638578,41.946644]},"n2214":{"id":"n2214","loc":[-85.625122,41.952189]},"n2215":{"id":"n2215","loc":[-85.625085,41.952031]},"n2216":{"id":"n2216","loc":[-85.636126,41.943713]},"n2217":{"id":"n2217","loc":[-85.635005,41.944041]},"n2218":{"id":"n2218","loc":[-85.63714,41.945328]},"n2219":{"id":"n2219","loc":[-85.634871,41.943292]},"n222":{"id":"n222","loc":[-85.634149,41.942503]},"n2220":{"id":"n2220","loc":[-85.635705,41.943799]},"n2221":{"id":"n2221","loc":[-85.634995,41.943576]},"n2222":{"id":"n2222","loc":[-85.635026,41.943829]},"n2223":{"id":"n2223","loc":[-85.632874,41.941031]},"n2224":{"id":"n2224","loc":[-85.632531,41.940233]},"n2225":{"id":"n2225","loc":[-85.634247,41.936003]},"n2226":{"id":"n2226","loc":[-85.62929,41.941127]},"n2227":{"id":"n2227","loc":[-85.630428,41.943266]},"n2228":{"id":"n2228","loc":[-85.631608,41.943425]},"n2229":{"id":"n2229","loc":[-85.632316,41.943042]},"n223":{"id":"n223","loc":[-85.634098,41.942373]},"n2230":{"id":"n2230","loc":[-85.628711,41.940744]},"n2231":{"id":"n2231","loc":[-85.627831,41.940536]},"n2232":{"id":"n2232","loc":[-85.625514,41.94052]},"n2233":{"id":"n2233","loc":[-85.631127,41.943545]},"n2234":{"id":"n2234","loc":[-85.632909,41.942531]},"n2235":{"id":"n2235","loc":[-85.632917,41.938796]},"n2236":{"id":"n2236","loc":[-85.626716,41.94044]},"n2237":{"id":"n2237","loc":[-85.630122,41.942852]},"n2238":{"id":"n2238","loc":[-85.632509,41.939674]},"n2239":{"id":"n2239","loc":[-85.634762,41.935237]},"n224":{"id":"n224","loc":[-85.634131,41.942366]},"n2240":{"id":"n2240","loc":[-85.63384,41.937025]},"n2241":{"id":"n2241","loc":[-85.629741,41.941909]},"n2242":{"id":"n2242","loc":[-85.635254,41.945001],"tags":{"railway":"level_crossing"}},"n2243":{"id":"n2243","loc":[-85.634005,41.938168]},"n2244":{"id":"n2244","loc":[-85.63393,41.938335]},"n2245":{"id":"n2245","loc":[-85.633859,41.93846]},"n2246":{"id":"n2246","loc":[-85.633663,41.938776]},"n2247":{"id":"n2247","loc":[-85.633513,41.938936]},"n2248":{"id":"n2248","loc":[-85.635295,41.943225]},"n2249":{"id":"n2249","loc":[-85.635393,41.943293]},"n225":{"id":"n225","loc":[-85.635986,41.94177]},"n2250":{"id":"n2250","loc":[-85.635645,41.94332]},"n2251":{"id":"n2251","loc":[-85.63629,41.943328]},"n2252":{"id":"n2252","loc":[-85.636554,41.943372]},"n2253":{"id":"n2253","loc":[-85.636869,41.943526]},"n2254":{"id":"n2254","loc":[-85.637099,41.943704]},"n2255":{"id":"n2255","loc":[-85.637268,41.943773]},"n2256":{"id":"n2256","loc":[-85.637483,41.943821]},"n2257":{"id":"n2257","loc":[-85.637616,41.943929]},"n2258":{"id":"n2258","loc":[-85.637752,41.944114]},"n2259":{"id":"n2259","loc":[-85.638399,41.944308]},"n226":{"id":"n226","loc":[-85.635982,41.941523]},"n2260":{"id":"n2260","loc":[-85.638573,41.944451]},"n2261":{"id":"n2261","loc":[-85.638702,41.944574]},"n2262":{"id":"n2262","loc":[-85.638718,41.944652]},"n2263":{"id":"n2263","loc":[-85.638715,41.944809]},"n2264":{"id":"n2264","loc":[-85.638766,41.944988]},"n2265":{"id":"n2265","loc":[-85.638773,41.945136]},"n2266":{"id":"n2266","loc":[-85.638705,41.945251]},"n2267":{"id":"n2267","loc":[-85.638335,41.944291]},"n2268":{"id":"n2268","loc":[-85.638474,41.944352]},"n2269":{"id":"n2269","loc":[-85.635408,41.943429]},"n227":{"id":"n227","loc":[-85.636108,41.941521]},"n2270":{"id":"n2270","loc":[-85.635271,41.943654]},"n2271":{"id":"n2271","loc":[-85.635266,41.943744]},"n2272":{"id":"n2272","loc":[-85.635271,41.943819]},"n2273":{"id":"n2273","loc":[-85.635192,41.943876]},"n2274":{"id":"n2274","loc":[-85.635129,41.943857]},"n2275":{"id":"n2275","loc":[-85.635122,41.943764]},"n2276":{"id":"n2276","loc":[-85.635124,41.943664]},"n2277":{"id":"n2277","loc":[-85.63515,41.943611]},"n2278":{"id":"n2278","loc":[-85.635106,41.943534]},"n2279":{"id":"n2279","loc":[-85.634972,41.943197]},"n228":{"id":"n228","loc":[-85.636109,41.941559]},"n2280":{"id":"n2280","loc":[-85.633978,41.938227]},"n2281":{"id":"n2281","loc":[-85.634216,41.943255]},"n2282":{"id":"n2282","loc":[-85.634434,41.943622]},"n2283":{"id":"n2283","loc":[-85.632406,41.940854]},"n2284":{"id":"n2284","loc":[-85.632488,41.941063],"tags":{"leisure":"slipway"}},"n2285":{"id":"n2285","loc":[-85.632726,41.941537]},"n2286":{"id":"n2286","loc":[-85.632639,41.94136]},"n2287":{"id":"n2287","loc":[-85.632704,41.941439]},"n2288":{"id":"n2288","loc":[-85.632289,41.940601]},"n2289":{"id":"n2289","loc":[-85.632541,41.942526]},"n229":{"id":"n229","loc":[-85.636145,41.941559]},"n2290":{"id":"n2290","loc":[-85.634058,41.943173]},"n2291":{"id":"n2291","loc":[-85.636175,41.945974]},"n2292":{"id":"n2292","loc":[-85.636528,41.945975]},"n2293":{"id":"n2293","loc":[-85.637092,41.945893]},"n2294":{"id":"n2294","loc":[-85.637881,41.945647]},"n2295":{"id":"n2295","loc":[-85.639329,41.945162]},"n2296":{"id":"n2296","loc":[-85.639323,41.945026]},"n2297":{"id":"n2297","loc":[-85.638826,41.945032]},"n2298":{"id":"n2298","loc":[-85.638817,41.944174]},"n2299":{"id":"n2299","loc":[-85.638291,41.94418]},"n23":{"id":"n23","loc":[-85.633504,41.942418]},"n230":{"id":"n230","loc":[-85.636145,41.941551]},"n2300":{"id":"n2300","loc":[-85.63828,41.943811]},"n2301":{"id":"n2301","loc":[-85.638195,41.943601]},"n2302":{"id":"n2302","loc":[-85.63719,41.943592]},"n2303":{"id":"n2303","loc":[-85.636697,41.943273]},"n2304":{"id":"n2304","loc":[-85.635375,41.943274]},"n2305":{"id":"n2305","loc":[-85.635091,41.943547]},"n2306":{"id":"n2306","loc":[-85.63442,41.944117]},"n2307":{"id":"n2307","loc":[-85.635117,41.943717]},"n2308":{"id":"n2308","loc":[-85.635601,41.945177]},"n2309":{"id":"n2309","loc":[-85.635819,41.945494]},"n231":{"id":"n231","loc":[-85.636312,41.941549]},"n2310":{"id":"n2310","loc":[-85.635303,41.944891]},"n2311":{"id":"n2311","loc":[-85.637674,41.943802]},"n2312":{"id":"n2312","loc":[-85.638263,41.944272]},"n2313":{"id":"n2313","loc":[-85.634267,41.935266]},"n2314":{"id":"n2314","loc":[-85.639788,41.945152]},"n2315":{"id":"n2315","loc":[-85.639645,41.945167]},"n2316":{"id":"n2316","loc":[-85.639362,41.945233]},"n2317":{"id":"n2317","loc":[-85.638616,41.945163]},"n2318":{"id":"n2318","loc":[-85.638514,41.944936]},"n2319":{"id":"n2319","loc":[-85.638578,41.94503]},"n232":{"id":"n232","loc":[-85.636314,41.941649]},"n2320":{"id":"n2320","loc":[-85.638578,41.945215]},"n2321":{"id":"n2321","loc":[-85.640495,41.947015]},"n2322":{"id":"n2322","loc":[-85.639577,41.946495]},"n2323":{"id":"n2323","loc":[-85.638935,41.946087]},"n2324":{"id":"n2324","loc":[-85.637535,41.94584]},"n2325":{"id":"n2325","loc":[-85.638357,41.945404]},"n2326":{"id":"n2326","loc":[-85.638051,41.94553]},"n2327":{"id":"n2327","loc":[-85.637732,41.945555]},"n2328":{"id":"n2328","loc":[-85.637657,41.945524]},"n2329":{"id":"n2329","loc":[-85.637598,41.945467]},"n233":{"id":"n233","loc":[-85.636152,41.94165]},"n2330":{"id":"n2330","loc":[-85.637669,41.945318]},"n2331":{"id":"n2331","loc":[-85.637894,41.945171]},"n2332":{"id":"n2332","loc":[-85.637923,41.945082]},"n2333":{"id":"n2333","loc":[-85.63793,41.944756]},"n2334":{"id":"n2334","loc":[-85.637976,41.944696]},"n2335":{"id":"n2335","loc":[-85.638044,41.944671]},"n2336":{"id":"n2336","loc":[-85.638129,41.944597]},"n2337":{"id":"n2337","loc":[-85.638252,41.944413]},"n2338":{"id":"n2338","loc":[-85.638092,41.945442]},"n2339":{"id":"n2339","loc":[-85.638409,41.945315]},"n234":{"id":"n234","loc":[-85.636152,41.941628]},"n2340":{"id":"n2340","loc":[-85.638325,41.944771]},"n2341":{"id":"n2341","loc":[-85.638103,41.944744]},"n2342":{"id":"n2342","loc":[-85.637976,41.944781]},"n2343":{"id":"n2343","loc":[-85.637983,41.944865]},"n2344":{"id":"n2344","loc":[-85.638063,41.945074]},"n2345":{"id":"n2345","loc":[-85.638041,41.945206]},"n2346":{"id":"n2346","loc":[-85.637907,41.945309]},"n2347":{"id":"n2347","loc":[-85.637925,41.94539]},"n2348":{"id":"n2348","loc":[-85.637998,41.94545]},"n2349":{"id":"n2349","loc":[-85.637135,41.946254]},"n235":{"id":"n235","loc":[-85.63611,41.941628]},"n2350":{"id":"n2350","loc":[-85.636837,41.946615]},"n2351":{"id":"n2351","loc":[-85.637954,41.948909]},"n2352":{"id":"n2352","loc":[-85.638382,41.949786]},"n2353":{"id":"n2353","loc":[-85.639367,41.951242]},"n2354":{"id":"n2354","loc":[-85.640554,41.951777]},"n2355":{"id":"n2355","loc":[-85.6411,41.952234]},"n2356":{"id":"n2356","loc":[-85.641742,41.952657]},"n2357":{"id":"n2357","loc":[-85.642321,41.952941]},"n2358":{"id":"n2358","loc":[-85.64277,41.953228]},"n2359":{"id":"n2359","loc":[-85.643333,41.953825]},"n236":{"id":"n236","loc":[-85.636113,41.941768]},"n2360":{"id":"n2360","loc":[-85.643579,41.954365]},"n2361":{"id":"n2361","loc":[-85.644439,41.954105]},"n2362":{"id":"n2362","loc":[-85.64506,41.954]},"n2363":{"id":"n2363","loc":[-85.645483,41.953911]},"n2364":{"id":"n2364","loc":[-85.646046,41.953853]},"n2365":{"id":"n2365","loc":[-85.646318,41.953717]},"n2366":{"id":"n2366","loc":[-85.646276,41.953414]},"n2367":{"id":"n2367","loc":[-85.631063,41.957478],"tags":{"emergency":"fire_hydrant"}},"n2368":{"id":"n2368","loc":[-85.630996,41.955857],"tags":{"emergency":"fire_hydrant"}},"n2369":{"id":"n2369","loc":[-85.630976,41.954608],"tags":{"emergency":"fire_hydrant"}},"n237":{"id":"n237","loc":[-85.635983,41.941589],"tags":{"entrance":"yes"}},"n2370":{"id":"n2370","loc":[-85.646,41.953154]},"n2371":{"id":"n2371","loc":[-85.645222,41.953193]},"n2372":{"id":"n2372","loc":[-85.644732,41.953181]},"n2373":{"id":"n2373","loc":[-85.644064,41.953298]},"n2374":{"id":"n2374","loc":[-85.643818,41.953177]},"n2375":{"id":"n2375","loc":[-85.644001,41.95284]},"n2376":{"id":"n2376","loc":[-85.628174,41.95456],"tags":{"emergency":"fire_hydrant"}},"n2377":{"id":"n2377","loc":[-85.644267,41.952591]},"n2378":{"id":"n2378","loc":[-85.644288,41.952328]},"n2379":{"id":"n2379","loc":[-85.627276,41.953987],"tags":{"emergency":"fire_hydrant"}},"n238":{"id":"n238","loc":[-85.635906,41.94159]},"n2380":{"id":"n2380","loc":[-85.644262,41.952153]},"n2381":{"id":"n2381","loc":[-85.644168,41.95204]},"n2382":{"id":"n2382","loc":[-85.64421,41.951749]},"n2383":{"id":"n2383","loc":[-85.64385,41.951586]},"n2384":{"id":"n2384","loc":[-85.62736,41.955964],"tags":{"emergency":"fire_hydrant"}},"n2385":{"id":"n2385","loc":[-85.626307,41.957198],"tags":{"emergency":"fire_hydrant"}},"n2386":{"id":"n2386","loc":[-85.643589,41.951323]},"n2387":{"id":"n2387","loc":[-85.62747,41.957509],"tags":{"emergency":"fire_hydrant"}},"n2388":{"id":"n2388","loc":[-85.628665,41.957492],"tags":{"emergency":"fire_hydrant"}},"n2389":{"id":"n2389","loc":[-85.642535,41.951031]},"n239":{"id":"n239","loc":[-85.635883,41.940182]},"n2390":{"id":"n2390","loc":[-85.642269,41.95088]},"n2391":{"id":"n2391","loc":[-85.641878,41.950814]},"n2392":{"id":"n2392","loc":[-85.641549,41.950806]},"n2393":{"id":"n2393","loc":[-85.641103,41.950549]},"n2394":{"id":"n2394","loc":[-85.630864,41.959046],"tags":{"emergency":"fire_hydrant"}},"n2395":{"id":"n2395","loc":[-85.632249,41.958969],"tags":{"emergency":"fire_hydrant"}},"n2396":{"id":"n2396","loc":[-85.641037,41.949821]},"n2397":{"id":"n2397","loc":[-85.641006,41.949433]},"n2398":{"id":"n2398","loc":[-85.632232,41.95859],"tags":{"emergency":"fire_hydrant"}},"n2399":{"id":"n2399","loc":[-85.632071,41.958345],"tags":{"emergency":"fire_hydrant"}},"n24":{"id":"n24","loc":[-85.634346,41.942792]},"n240":{"id":"n240","loc":[-85.635916,41.94264]},"n2400":{"id":"n2400","loc":[-85.632228,41.9573],"tags":{"emergency":"fire_hydrant"}},"n2401":{"id":"n2401","loc":[-85.641152,41.948257]},"n2402":{"id":"n2402","loc":[-85.641055,41.947304]},"n2403":{"id":"n2403","loc":[-85.638022,41.945897]},"n2404":{"id":"n2404","loc":[-85.638672,41.950778]},"n2405":{"id":"n2405","loc":[-85.63666,41.944492],"tags":{"name":"Memory Isle","place":"island"}},"n2406":{"id":"n2406","loc":[-85.635,41.946389],"tags":{"amenity":"post_office","name":"Three Rivers Post Office"}},"n2407":{"id":"n2407","loc":[-85.633676,41.946036]},"n2408":{"id":"n2408","loc":[-85.633736,41.946078]},"n2409":{"id":"n2409","loc":[-85.633997,41.946185]},"n241":{"id":"n241","loc":[-85.635795,41.941906]},"n2410":{"id":"n2410","loc":[-85.634448,41.945626],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2411":{"id":"n2411","loc":[-85.63456,41.945731],"tags":{"crossing":"zebra","highway":"crossing"}},"n2412":{"id":"n2412","loc":[-85.634592,41.94578]},"n2413":{"id":"n2413","loc":[-85.634607,41.945815]},"n2414":{"id":"n2414","loc":[-85.634614,41.945864]},"n2415":{"id":"n2415","loc":[-85.636066,41.946185]},"n2416":{"id":"n2416","loc":[-85.636128,41.946352]},"n2417":{"id":"n2417","loc":[-85.636142,41.946452]},"n2418":{"id":"n2418","loc":[-85.635327,41.945292]},"n2419":{"id":"n2419","loc":[-85.635648,41.94558]},"n242":{"id":"n242","loc":[-85.635909,41.941906]},"n2420":{"id":"n2420","loc":[-85.635769,41.945729]},"n2421":{"id":"n2421","loc":[-85.637349,41.945897]},"n2422":{"id":"n2422","loc":[-85.632211,41.95596],"tags":{"emergency":"fire_hydrant"}},"n2423":{"id":"n2423","loc":[-85.635942,41.94598]},"n2424":{"id":"n2424","loc":[-85.636443,41.946042]},"n2425":{"id":"n2425","loc":[-85.635819,41.946052]},"n2426":{"id":"n2426","loc":[-85.636669,41.946025]},"n2427":{"id":"n2427","loc":[-85.636832,41.946005]},"n2428":{"id":"n2428","loc":[-85.637039,41.945968]},"n2429":{"id":"n2429","loc":[-85.636291,41.946046]},"n243":{"id":"n243","loc":[-85.636359,41.941904]},"n2430":{"id":"n2430","loc":[-85.634005,41.943367]},"n2431":{"id":"n2431","loc":[-85.633366,41.943724]},"n2432":{"id":"n2432","loc":[-85.634617,41.946057]},"n2433":{"id":"n2433","loc":[-85.636534,41.944793]},"n2434":{"id":"n2434","loc":[-85.637055,41.945188]},"n2435":{"id":"n2435","loc":[-85.636153,41.944618]},"n2436":{"id":"n2436","loc":[-85.636803,41.944944]},"n2437":{"id":"n2437","loc":[-85.633389,41.945735]},"n2438":{"id":"n2438","loc":[-85.633536,41.94585]},"n2439":{"id":"n2439","loc":[-85.63363,41.945993]},"n244":{"id":"n244","loc":[-85.636351,41.941438]},"n2440":{"id":"n2440","loc":[-85.633268,41.94568]},"n2441":{"id":"n2441","loc":[-85.635947,41.94546]},"n2442":{"id":"n2442","loc":[-85.636277,41.945268]},"n2443":{"id":"n2443","loc":[-85.635203,41.944287]},"n2444":{"id":"n2444","loc":[-85.634876,41.944477]},"n2445":{"id":"n2445","loc":[-85.634975,41.944419]},"n2446":{"id":"n2446","loc":[-85.633877,41.943438]},"n2447":{"id":"n2447","loc":[-85.63508,41.945113]},"n2448":{"id":"n2448","loc":[-85.635372,41.944932]},"n2449":{"id":"n2449","loc":[-85.636594,41.945935]},"n245":{"id":"n245","loc":[-85.635903,41.941436]},"n2450":{"id":"n2450","loc":[-85.636901,41.945747]},"n2451":{"id":"n2451","loc":[-85.636329,41.945228]},"n2452":{"id":"n2452","loc":[-85.636025,41.945417]},"n2453":{"id":"n2453","loc":[-85.634002,41.944644]},"n2454":{"id":"n2454","loc":[-85.63407,41.944692]},"n2455":{"id":"n2455","loc":[-85.634114,41.944756]},"n2456":{"id":"n2456","loc":[-85.633762,41.944809]},"n2457":{"id":"n2457","loc":[-85.634184,41.944807]},"n2458":{"id":"n2458","loc":[-85.634291,41.944819]},"n2459":{"id":"n2459","loc":[-85.634639,41.944845]},"n246":{"id":"n246","loc":[-85.635788,41.941436]},"n2460":{"id":"n2460","loc":[-85.633822,41.944861]},"n2461":{"id":"n2461","loc":[-85.63411,41.944855]},"n2462":{"id":"n2462","loc":[-85.63435,41.944872]},"n2463":{"id":"n2463","loc":[-85.63441,41.944903]},"n2464":{"id":"n2464","loc":[-85.633883,41.944913]},"n2465":{"id":"n2465","loc":[-85.634164,41.944896]},"n2466":{"id":"n2466","loc":[-85.633487,41.944926]},"n2467":{"id":"n2467","loc":[-85.634736,41.944929]},"n2468":{"id":"n2468","loc":[-85.633944,41.944965]},"n2469":{"id":"n2469","loc":[-85.633555,41.944983]},"n247":{"id":"n247","loc":[-85.635929,41.941511]},"n2470":{"id":"n2470","loc":[-85.633995,41.945013]},"n2471":{"id":"n2471","loc":[-85.633614,41.945037]},"n2472":{"id":"n2472","loc":[-85.634848,41.945031]},"n2473":{"id":"n2473","loc":[-85.634049,41.945061]},"n2474":{"id":"n2474","loc":[-85.633678,41.945094]},"n2475":{"id":"n2475","loc":[-85.63317,41.945111]},"n2476":{"id":"n2476","loc":[-85.633357,41.945103]},"n2477":{"id":"n2477","loc":[-85.633728,41.945136]},"n2478":{"id":"n2478","loc":[-85.634146,41.945148]},"n2479":{"id":"n2479","loc":[-85.633416,41.945157]},"n248":{"id":"n248","loc":[-85.635929,41.941317]},"n2480":{"id":"n2480","loc":[-85.634625,41.945172]},"n2481":{"id":"n2481","loc":[-85.633239,41.945174]},"n2482":{"id":"n2482","loc":[-85.63469,41.945185]},"n2483":{"id":"n2483","loc":[-85.634661,41.945203]},"n2484":{"id":"n2484","loc":[-85.63348,41.945214]},"n2485":{"id":"n2485","loc":[-85.633578,41.945221]},"n2486":{"id":"n2486","loc":[-85.634742,41.945231]},"n2487":{"id":"n2487","loc":[-85.634251,41.94525]},"n2488":{"id":"n2488","loc":[-85.633524,41.945254]},"n2489":{"id":"n2489","loc":[-85.63468,41.945271]},"n249":{"id":"n249","loc":[-85.636414,41.941316]},"n2490":{"id":"n2490","loc":[-85.633885,41.945272]},"n2491":{"id":"n2491","loc":[-85.634795,41.945288]},"n2492":{"id":"n2492","loc":[-85.634742,41.94532]},"n2493":{"id":"n2493","loc":[-85.633946,41.945327]},"n2494":{"id":"n2494","loc":[-85.634844,41.945331]},"n2495":{"id":"n2495","loc":[-85.63435,41.945349]},"n2496":{"id":"n2496","loc":[-85.633733,41.945357]},"n2497":{"id":"n2497","loc":[-85.633987,41.945375]},"n2498":{"id":"n2498","loc":[-85.634911,41.945419]},"n2499":{"id":"n2499","loc":[-85.634049,41.945431]},"n25":{"id":"n25","loc":[-85.634333,41.942809]},"n250":{"id":"n250","loc":[-85.636414,41.941511]},"n2500":{"id":"n2500","loc":[-85.633705,41.945461]},"n2501":{"id":"n2501","loc":[-85.633642,41.945408]},"n2502":{"id":"n2502","loc":[-85.634493,41.945475]},"n2503":{"id":"n2503","loc":[-85.634106,41.945484]},"n2504":{"id":"n2504","loc":[-85.635008,41.945505]},"n2505":{"id":"n2505","loc":[-85.633757,41.945506]},"n2506":{"id":"n2506","loc":[-85.634542,41.945519]},"n2507":{"id":"n2507","loc":[-85.634162,41.945536]},"n2508":{"id":"n2508","loc":[-85.633843,41.945547]},"n2509":{"id":"n2509","loc":[-85.634919,41.94556]},"n251":{"id":"n251","loc":[-85.636819,41.941617]},"n2510":{"id":"n2510","loc":[-85.633818,41.945561]},"n2511":{"id":"n2511","loc":[-85.634638,41.94559]},"n2512":{"id":"n2512","loc":[-85.633901,41.945598]},"n2513":{"id":"n2513","loc":[-85.634257,41.945626]},"n2514":{"id":"n2514","loc":[-85.633967,41.945652]},"n2515":{"id":"n2515","loc":[-85.634735,41.945676]},"n2516":{"id":"n2516","loc":[-85.635057,41.945683]},"n2517":{"id":"n2517","loc":[-85.635296,41.945703]},"n2518":{"id":"n2518","loc":[-85.635112,41.945703]},"n2519":{"id":"n2519","loc":[-85.634782,41.945729]},"n252":{"id":"n252","loc":[-85.636718,41.941619]},"n2520":{"id":"n2520","loc":[-85.634052,41.945747]},"n2521":{"id":"n2521","loc":[-85.635296,41.945757]},"n2522":{"id":"n2522","loc":[-85.635314,41.945757]},"n2523":{"id":"n2523","loc":[-85.635112,41.945761]},"n2524":{"id":"n2524","loc":[-85.63484,41.945778]},"n2525":{"id":"n2525","loc":[-85.635314,41.945938]},"n2526":{"id":"n2526","loc":[-85.63484,41.945922]},"n2527":{"id":"n2527","loc":[-85.635461,41.944879]},"n2528":{"id":"n2528","loc":[-85.636024,41.945384]},"n2529":{"id":"n2529","loc":[-85.636145,41.945312]},"n253":{"id":"n253","loc":[-85.636716,41.941509]},"n2530":{"id":"n2530","loc":[-85.6356,41.944797]},"n2531":{"id":"n2531","loc":[-85.635135,41.944354]},"n2532":{"id":"n2532","loc":[-85.632988,41.945369]},"n2533":{"id":"n2533","loc":[-85.633376,41.94563]},"n2534":{"id":"n2534","loc":[-85.633539,41.945534]},"n2535":{"id":"n2535","loc":[-85.633238,41.945248]},"n2536":{"id":"n2536","loc":[-85.633166,41.945216]},"n2537":{"id":"n2537","loc":[-85.633114,41.945188]},"n2538":{"id":"n2538","loc":[-85.633078,41.945127]},"n2539":{"id":"n2539","loc":[-85.633066,41.94508]},"n254":{"id":"n254","loc":[-85.636732,41.941509]},"n2540":{"id":"n2540","loc":[-85.633222,41.945358]},"n2541":{"id":"n2541","loc":[-85.633425,41.945541]},"n2542":{"id":"n2542","loc":[-85.63299,41.9455]},"n2543":{"id":"n2543","loc":[-85.634374,41.944327]},"n2544":{"id":"n2544","loc":[-85.633648,41.943697]},"n2545":{"id":"n2545","loc":[-85.633533,41.943764]},"n2546":{"id":"n2546","loc":[-85.634239,41.944417]},"n2547":{"id":"n2547","loc":[-85.634122,41.944395]},"n2548":{"id":"n2548","loc":[-85.634235,41.944326]},"n2549":{"id":"n2549","loc":[-85.633613,41.943787]},"n255":{"id":"n255","loc":[-85.636731,41.941461]},"n2550":{"id":"n2550","loc":[-85.633915,41.943613]},"n2551":{"id":"n2551","loc":[-85.634015,41.943555]},"n2552":{"id":"n2552","loc":[-85.63433,41.943839]},"n2553":{"id":"n2553","loc":[-85.634236,41.943894]},"n2554":{"id":"n2554","loc":[-85.635413,41.946052]},"n2555":{"id":"n2555","loc":[-85.635405,41.94569]},"n2556":{"id":"n2556","loc":[-85.635684,41.945925]},"n2557":{"id":"n2557","loc":[-85.635614,41.945742]},"n2558":{"id":"n2558","loc":[-85.635401,41.945745]},"n2559":{"id":"n2559","loc":[-85.635406,41.945928]},"n256":{"id":"n256","loc":[-85.636799,41.941461]},"n2560":{"id":"n2560","loc":[-85.633478,41.943663]},"n2561":{"id":"n2561","loc":[-85.633291,41.943526]},"n2562":{"id":"n2562","loc":[-85.633094,41.943541]},"n2563":{"id":"n2563","loc":[-85.633302,41.943492]},"n2564":{"id":"n2564","loc":[-85.633047,41.943623]},"n2565":{"id":"n2565","loc":[-85.633275,41.943562]},"n2566":{"id":"n2566","loc":[-85.633351,41.943518]},"n2567":{"id":"n2567","loc":[-85.633224,41.9434]},"n2568":{"id":"n2568","loc":[-85.633235,41.943369]},"n2569":{"id":"n2569","loc":[-85.635179,41.943911]},"n257":{"id":"n257","loc":[-85.6368,41.9415]},"n2570":{"id":"n2570","loc":[-85.635146,41.943918]},"n2571":{"id":"n2571","loc":[-85.634888,41.943905]},"n2572":{"id":"n2572","loc":[-85.634832,41.943911]},"n2573":{"id":"n2573","loc":[-85.634638,41.944007]},"n2574":{"id":"n2574","loc":[-85.634568,41.94405]},"n2575":{"id":"n2575","loc":[-85.635994,41.94501]},"n2576":{"id":"n2576","loc":[-85.636388,41.944608]},"n2577":{"id":"n2577","loc":[-85.636215,41.944787]},"n2578":{"id":"n2578","loc":[-85.637948,41.944587]},"n2579":{"id":"n2579","loc":[-85.637849,41.944567]},"n258":{"id":"n258","loc":[-85.636814,41.9415]},"n2580":{"id":"n2580","loc":[-85.637895,41.944455]},"n2581":{"id":"n2581","loc":[-85.637996,41.944477]},"n2582":{"id":"n2582","loc":[-85.635525,41.94337]},"n2583":{"id":"n2583","loc":[-85.637847,41.943923]},"n2584":{"id":"n2584","loc":[-85.637891,41.944124]},"n2585":{"id":"n2585","loc":[-85.638167,41.944229]},"n2586":{"id":"n2586","loc":[-85.638236,41.944097]},"n2587":{"id":"n2587","loc":[-85.638207,41.944025]},"n2588":{"id":"n2588","loc":[-85.638141,41.943997]},"n2589":{"id":"n2589","loc":[-85.638057,41.944015]},"n259":{"id":"n259","loc":[-85.636815,41.941538]},"n2590":{"id":"n2590","loc":[-85.637902,41.944231]},"n2591":{"id":"n2591","loc":[-85.638134,41.944307]},"n2592":{"id":"n2592","loc":[-85.638242,41.944294]},"n2593":{"id":"n2593","loc":[-85.638274,41.944222]},"n2594":{"id":"n2594","loc":[-85.638236,41.944174]},"n2595":{"id":"n2595","loc":[-85.638207,41.944157]},"n2596":{"id":"n2596","loc":[-85.637818,41.943984]},"n2597":{"id":"n2597","loc":[-85.634996,41.944439]},"n2598":{"id":"n2598","loc":[-85.633946,41.945804]},"n2599":{"id":"n2599","loc":[-85.634102,41.945864]},"n26":{"id":"n26","loc":[-85.634346,41.942744]},"n260":{"id":"n260","loc":[-85.636827,41.941538]},"n2600":{"id":"n2600","loc":[-85.633819,41.945756]},"n2601":{"id":"n2601","loc":[-85.634025,41.945975]},"n2602":{"id":"n2602","loc":[-85.633742,41.945867]},"n2603":{"id":"n2603","loc":[-85.63373,41.946004]},"n2604":{"id":"n2604","loc":[-85.633947,41.946081]},"n2605":{"id":"n2605","loc":[-85.633872,41.945917]},"n2606":{"id":"n2606","loc":[-85.633825,41.945985]},"n2607":{"id":"n2607","loc":[-85.633762,41.94596]},"n2608":{"id":"n2608","loc":[-85.634224,41.946037]},"n2609":{"id":"n2609","loc":[-85.634357,41.945851]},"n261":{"id":"n261","loc":[-85.636828,41.941584]},"n2610":{"id":"n2610","loc":[-85.634398,41.945813]},"n2611":{"id":"n2611","loc":[-85.634461,41.945812]},"n2612":{"id":"n2612","loc":[-85.634501,41.945852]},"n2613":{"id":"n2613","loc":[-85.634503,41.94597]},"n2614":{"id":"n2614","loc":[-85.634462,41.945971]},"n2615":{"id":"n2615","loc":[-85.634465,41.946036]},"n2616":{"id":"n2616","loc":[-85.634235,41.946072]},"n2617":{"id":"n2617","loc":[-85.634447,41.946036]},"n2618":{"id":"n2618","loc":[-85.634448,41.946052]},"n2619":{"id":"n2619","loc":[-85.634494,41.946051]},"n262":{"id":"n262","loc":[-85.636819,41.941585]},"n2620":{"id":"n2620","loc":[-85.634497,41.946144]},"n2621":{"id":"n2621","loc":[-85.634453,41.946144]},"n2622":{"id":"n2622","loc":[-85.634454,41.94616]},"n2623":{"id":"n2623","loc":[-85.634393,41.946161]},"n2624":{"id":"n2624","loc":[-85.634394,41.94618]},"n2625":{"id":"n2625","loc":[-85.634345,41.94618]},"n2626":{"id":"n2626","loc":[-85.634344,41.946162]},"n2627":{"id":"n2627","loc":[-85.63427,41.946163]},"n2628":{"id":"n2628","loc":[-85.634266,41.946071]},"n2629":{"id":"n2629","loc":[-85.634148,41.946163]},"n263":{"id":"n263","loc":[-85.636854,41.941714]},"n2630":{"id":"n2630","loc":[-85.634213,41.946072]},"n2631":{"id":"n2631","loc":[-85.633293,41.946309]},"n2632":{"id":"n2632","loc":[-85.633122,41.946239]},"n2633":{"id":"n2633","loc":[-85.633295,41.946005]},"n2634":{"id":"n2634","loc":[-85.633395,41.946047]},"n2635":{"id":"n2635","loc":[-85.633404,41.946035]},"n2636":{"id":"n2636","loc":[-85.633459,41.946057]},"n2637":{"id":"n2637","loc":[-85.633387,41.946154]},"n2638":{"id":"n2638","loc":[-85.633403,41.946161]},"n2639":{"id":"n2639","loc":[-85.634176,41.946415]},"n264":{"id":"n264","loc":[-85.636855,41.941774]},"n2640":{"id":"n2640","loc":[-85.634179,41.946339]},"n2641":{"id":"n2641","loc":[-85.634455,41.946345]},"n2642":{"id":"n2642","loc":[-85.634452,41.946422]},"n2643":{"id":"n2643","loc":[-85.63437,41.946421]},"n2644":{"id":"n2644","loc":[-85.634367,41.946497]},"n2645":{"id":"n2645","loc":[-85.634289,41.946495]},"n2646":{"id":"n2646","loc":[-85.634291,41.946448]},"n2647":{"id":"n2647","loc":[-85.634269,41.946448]},"n2648":{"id":"n2648","loc":[-85.63427,41.946417]},"n2649":{"id":"n2649","loc":[-85.63484,41.946328]},"n265":{"id":"n265","loc":[-85.636822,41.941774]},"n2650":{"id":"n2650","loc":[-85.634839,41.946187]},"n2651":{"id":"n2651","loc":[-85.635148,41.946186]},"n2652":{"id":"n2652","loc":[-85.635148,41.946216]},"n2653":{"id":"n2653","loc":[-85.63521,41.946216]},"n2654":{"id":"n2654","loc":[-85.63521,41.946348]},"n2655":{"id":"n2655","loc":[-85.635154,41.946348]},"n2656":{"id":"n2656","loc":[-85.635153,41.946327]},"n2657":{"id":"n2657","loc":[-85.634037,41.946957]},"n2658":{"id":"n2658","loc":[-85.634253,41.946953]},"n2659":{"id":"n2659","loc":[-85.63481,41.946543]},"n266":{"id":"n266","loc":[-85.636822,41.941778]},"n2660":{"id":"n2660","loc":[-85.634809,41.946459]},"n2661":{"id":"n2661","loc":[-85.635154,41.946458]},"n2662":{"id":"n2662","loc":[-85.635155,41.946554]},"n2663":{"id":"n2663","loc":[-85.635022,41.946547]},"n2664":{"id":"n2664","loc":[-85.635022,41.946573]},"n2665":{"id":"n2665","loc":[-85.634909,41.946574]},"n2666":{"id":"n2666","loc":[-85.634909,41.946561]},"n2667":{"id":"n2667","loc":[-85.634896,41.947159]},"n2668":{"id":"n2668","loc":[-85.634894,41.947032]},"n2669":{"id":"n2669","loc":[-85.635024,41.947031]},"n267":{"id":"n267","loc":[-85.636756,41.941779]},"n2670":{"id":"n2670","loc":[-85.635026,41.947158]},"n2671":{"id":"n2671","loc":[-85.635233,41.947105]},"n2672":{"id":"n2672","loc":[-85.635236,41.946991]},"n2673":{"id":"n2673","loc":[-85.635369,41.946993]},"n2674":{"id":"n2674","loc":[-85.635366,41.947107]},"n2675":{"id":"n2675","loc":[-85.634824,41.946929]},"n2676":{"id":"n2676","loc":[-85.634825,41.946818]},"n2677":{"id":"n2677","loc":[-85.63512,41.946819]},"n2678":{"id":"n2678","loc":[-85.635119,41.94693]},"n2679":{"id":"n2679","loc":[-85.634796,41.946806]},"n268":{"id":"n268","loc":[-85.636756,41.941774]},"n2680":{"id":"n2680","loc":[-85.634792,41.946604]},"n2681":{"id":"n2681","loc":[-85.634948,41.946602]},"n2682":{"id":"n2682","loc":[-85.634949,41.946645]},"n2683":{"id":"n2683","loc":[-85.634975,41.946644]},"n2684":{"id":"n2684","loc":[-85.634974,41.946599]},"n2685":{"id":"n2685","loc":[-85.635117,41.946598]},"n2686":{"id":"n2686","loc":[-85.635122,41.946801]},"n2687":{"id":"n2687","loc":[-85.634981,41.946803]},"n2688":{"id":"n2688","loc":[-85.634979,41.946752]},"n2689":{"id":"n2689","loc":[-85.634952,41.946752]},"n269":{"id":"n269","loc":[-85.636721,41.941774]},"n2690":{"id":"n2690","loc":[-85.634953,41.946804]},"n2691":{"id":"n2691","loc":[-85.634649,41.946841]},"n2692":{"id":"n2692","loc":[-85.634331,41.94684]},"n2693":{"id":"n2693","loc":[-85.634183,41.946809]},"n2694":{"id":"n2694","loc":[-85.633699,41.946607]},"n2695":{"id":"n2695","loc":[-85.634487,41.946664]},"n2696":{"id":"n2696","loc":[-85.634486,41.946598]},"n2697":{"id":"n2697","loc":[-85.63423,41.946599]},"n2698":{"id":"n2698","loc":[-85.634231,41.946662]},"n2699":{"id":"n2699","loc":[-85.634284,41.946662]},"n27":{"id":"n27","loc":[-85.634136,41.943183]},"n270":{"id":"n270","loc":[-85.63672,41.941714]},"n2700":{"id":"n2700","loc":[-85.634284,41.946679]},"n2701":{"id":"n2701","loc":[-85.634365,41.946679]},"n2702":{"id":"n2702","loc":[-85.634365,41.946664]},"n2703":{"id":"n2703","loc":[-85.635443,41.947015]},"n2704":{"id":"n2704","loc":[-85.635442,41.946801]},"n2705":{"id":"n2705","loc":[-85.63603,41.9468]},"n2706":{"id":"n2706","loc":[-85.636028,41.947016]},"n2707":{"id":"n2707","loc":[-85.635457,41.946582]},"n2708":{"id":"n2708","loc":[-85.635455,41.946211]},"n2709":{"id":"n2709","loc":[-85.635636,41.946579]},"n271":{"id":"n271","loc":[-85.636767,41.941713]},"n2710":{"id":"n2710","loc":[-85.635716,41.9468]},"n2711":{"id":"n2711","loc":[-85.635969,41.9468]},"n2712":{"id":"n2712","loc":[-85.635973,41.946295]},"n2713":{"id":"n2713","loc":[-85.636019,41.946484]},"n2714":{"id":"n2714","loc":[-85.636022,41.946388]},"n2715":{"id":"n2715","loc":[-85.635961,41.946493]},"n2716":{"id":"n2716","loc":[-85.635713,41.94621]},"n2717":{"id":"n2717","loc":[-85.635416,41.946142]},"n2718":{"id":"n2718","loc":[-85.635759,41.946203]},"n2719":{"id":"n2719","loc":[-85.636153,41.946747]},"n272":{"id":"n272","loc":[-85.636767,41.941706]},"n2720":{"id":"n2720","loc":[-85.635417,41.946915]},"n2721":{"id":"n2721","loc":[-85.636154,41.946915]},"n2722":{"id":"n2722","loc":[-85.635866,41.946473]},"n2723":{"id":"n2723","loc":[-85.635717,41.946633]},"n2724":{"id":"n2724","loc":[-85.635556,41.946166]},"n2725":{"id":"n2725","loc":[-85.63556,41.946556]},"n2726":{"id":"n2726","loc":[-85.635731,41.946594]},"n2727":{"id":"n2727","loc":[-85.635866,41.946595]},"n2728":{"id":"n2728","loc":[-85.635456,41.947028]},"n2729":{"id":"n2729","loc":[-85.635796,41.947023]},"n273":{"id":"n273","loc":[-85.636779,41.941698]},"n2730":{"id":"n2730","loc":[-85.635798,41.947091]},"n2731":{"id":"n2731","loc":[-85.63573,41.947092]},"n2732":{"id":"n2732","loc":[-85.635733,41.947233]},"n2733":{"id":"n2733","loc":[-85.636283,41.946863]},"n2734":{"id":"n2734","loc":[-85.63628,41.946706]},"n2735":{"id":"n2735","loc":[-85.636341,41.946705]},"n2736":{"id":"n2736","loc":[-85.636273,41.946584]},"n2737":{"id":"n2737","loc":[-85.636396,41.946545]},"n2738":{"id":"n2738","loc":[-85.636474,41.946684]},"n2739":{"id":"n2739","loc":[-85.636511,41.946861]},"n274":{"id":"n274","loc":[-85.636798,41.941697]},"n2740":{"id":"n2740","loc":[-85.633713,41.947184]},"n2741":{"id":"n2741","loc":[-85.633651,41.94716]},"n2742":{"id":"n2742","loc":[-85.633704,41.947085]},"n2743":{"id":"n2743","loc":[-85.6336,41.947044]},"n2744":{"id":"n2744","loc":[-85.633506,41.947177]},"n2745":{"id":"n2745","loc":[-85.629586,41.952469]},"n2746":{"id":"n2746","loc":[-85.634723,41.953681]},"n2747":{"id":"n2747","loc":[-85.63478,41.959007]},"n2748":{"id":"n2748","loc":[-85.632793,41.94405],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2749":{"id":"n2749","loc":[-85.634648,41.947325]},"n275":{"id":"n275","loc":[-85.63681,41.941705]},"n2750":{"id":"n2750","loc":[-85.625078,41.952097]},"n2751":{"id":"n2751","loc":[-85.633195,41.94734]},"n2752":{"id":"n2752","loc":[-85.626447,41.957168]},"n2753":{"id":"n2753","loc":[-85.632023,41.949012]},"n2754":{"id":"n2754","loc":[-85.630835,41.950656]},"n2755":{"id":"n2755","loc":[-85.634655,41.948612]},"n2756":{"id":"n2756","loc":[-85.636182,41.948605]},"n2757":{"id":"n2757","loc":[-85.634729,41.954667]},"n2758":{"id":"n2758","loc":[-85.634686,41.951159]},"n2759":{"id":"n2759","loc":[-85.636206,41.951146]},"n276":{"id":"n276","loc":[-85.63681,41.941714]},"n2760":{"id":"n2760","loc":[-85.634668,41.949891]},"n2761":{"id":"n2761","loc":[-85.634701,41.952422]},"n2762":{"id":"n2762","loc":[-85.634747,41.955907]},"n2763":{"id":"n2763","loc":[-85.627975,41.954695]},"n2764":{"id":"n2764","loc":[-85.626832,41.954698]},"n2765":{"id":"n2765","loc":[-85.632278,41.948624]},"n2766":{"id":"n2766","loc":[-85.628639,41.953725]},"n2767":{"id":"n2767","loc":[-85.636233,41.95241]},"n2768":{"id":"n2768","loc":[-85.631385,41.949913]},"n2769":{"id":"n2769","loc":[-85.630486,41.951194]},"n277":{"id":"n277","loc":[-85.636861,41.942041]},"n2770":{"id":"n2770","loc":[-85.624937,41.952088]},"n2771":{"id":"n2771","loc":[-85.624945,41.952022]},"n2772":{"id":"n2772","loc":[-85.636162,41.94731]},"n2773":{"id":"n2773","loc":[-85.636188,41.949881]},"n2774":{"id":"n2774","loc":[-85.631422,41.948294]},"n2775":{"id":"n2775","loc":[-85.632844,41.945547]},"n2776":{"id":"n2776","loc":[-85.632484,41.945344]},"n2777":{"id":"n2777","loc":[-85.631775,41.944636]},"n2778":{"id":"n2778","loc":[-85.632656,41.945471]},"n2779":{"id":"n2779","loc":[-85.631959,41.944827]},"n278":{"id":"n278","loc":[-85.636862,41.942099]},"n2780":{"id":"n2780","loc":[-85.631679,41.94438]},"n2781":{"id":"n2781","loc":[-85.625129,41.959272]},"n2782":{"id":"n2782","loc":[-85.632446,41.944861]},"n2783":{"id":"n2783","loc":[-85.632804,41.945477]},"n2784":{"id":"n2784","loc":[-85.632255,41.944962]},"n2785":{"id":"n2785","loc":[-85.632736,41.944757]},"n2786":{"id":"n2786","loc":[-85.632543,41.94486]},"n2787":{"id":"n2787","loc":[-85.632889,41.945561]},"n2788":{"id":"n2788","loc":[-85.632091,41.944949]},"n2789":{"id":"n2789","loc":[-85.632537,41.944713]},"n279":{"id":"n279","loc":[-85.636807,41.942099]},"n2790":{"id":"n2790","loc":[-85.632279,41.94485]},"n2791":{"id":"n2791","loc":[-85.632749,41.943247]},"n2792":{"id":"n2792","loc":[-85.632824,41.943152]},"n2793":{"id":"n2793","loc":[-85.632929,41.94317]},"n2794":{"id":"n2794","loc":[-85.632897,41.943078]},"n2795":{"id":"n2795","loc":[-85.632626,41.943231]},"n2796":{"id":"n2796","loc":[-85.634048,41.947257]},"n2797":{"id":"n2797","loc":[-85.634264,41.947252]},"n2798":{"id":"n2798","loc":[-85.635418,41.947317]},"n2799":{"id":"n2799","loc":[-85.635461,41.947237]},"n28":{"id":"n28","loc":[-85.63821,41.944308]},"n280":{"id":"n280","loc":[-85.636807,41.942126]},"n2800":{"id":"n2800","loc":[-85.632868,41.946229]},"n2801":{"id":"n2801","loc":[-85.633673,41.947242]},"n2802":{"id":"n2802","loc":[-85.623604,41.945881],"tags":{"amenity":"school","name":"Barrows School"}},"n2803":{"id":"n2803","loc":[-85.627401,41.943496]},"n2804":{"id":"n2804","loc":[-85.627403,41.943625]},"n2805":{"id":"n2805","loc":[-85.626409,41.943215]},"n2806":{"id":"n2806","loc":[-85.624884,41.943508]},"n2807":{"id":"n2807","loc":[-85.625191,41.943509]},"n2808":{"id":"n2808","loc":[-85.624882,41.94382]},"n2809":{"id":"n2809","loc":[-85.624893,41.945618]},"n281":{"id":"n281","loc":[-85.636726,41.942126]},"n2810":{"id":"n2810","loc":[-85.624912,41.946524]},"n2811":{"id":"n2811","loc":[-85.622721,41.946535]},"n2812":{"id":"n2812","loc":[-85.627399,41.94469]},"n2813":{"id":"n2813","loc":[-85.622716,41.945622]},"n2814":{"id":"n2814","loc":[-85.624886,41.944724]},"n2815":{"id":"n2815","loc":[-85.622674,41.944737]},"n2816":{"id":"n2816","loc":[-85.625092,41.945063]},"n2817":{"id":"n2817","loc":[-85.625233,41.945064]},"n2818":{"id":"n2818","loc":[-85.625229,41.944871]},"n2819":{"id":"n2819","loc":[-85.625066,41.944871]},"n282":{"id":"n282","loc":[-85.636726,41.942098]},"n2820":{"id":"n2820","loc":[-85.625024,41.944901]},"n2821":{"id":"n2821","loc":[-85.625025,41.944924]},"n2822":{"id":"n2822","loc":[-85.625087,41.944926]},"n2823":{"id":"n2823","loc":[-85.625349,41.944506]},"n2824":{"id":"n2824","loc":[-85.625347,41.944388]},"n2825":{"id":"n2825","loc":[-85.625152,41.94439]},"n2826":{"id":"n2826","loc":[-85.625152,41.944431]},"n2827":{"id":"n2827","loc":[-85.625134,41.944431]},"n2828":{"id":"n2828","loc":[-85.625136,41.944508]},"n2829":{"id":"n2829","loc":[-85.623236,41.946341]},"n283":{"id":"n283","loc":[-85.636708,41.942098]},"n2830":{"id":"n2830","loc":[-85.623241,41.946067]},"n2831":{"id":"n2831","loc":[-85.623207,41.946067]},"n2832":{"id":"n2832","loc":[-85.623212,41.945827]},"n2833":{"id":"n2833","loc":[-85.622981,41.945825]},"n2834":{"id":"n2834","loc":[-85.622976,41.946063]},"n2835":{"id":"n2835","loc":[-85.623006,41.946063]},"n2836":{"id":"n2836","loc":[-85.623002,41.946256]},"n2837":{"id":"n2837","loc":[-85.623075,41.946256]},"n2838":{"id":"n2838","loc":[-85.623074,41.946339]},"n2839":{"id":"n2839","loc":[-85.624574,41.951755]},"n284":{"id":"n284","loc":[-85.636708,41.942041]},"n2840":{"id":"n2840","loc":[-85.62498,41.951844]},"n2841":{"id":"n2841","loc":[-85.625086,41.95188]},"n2842":{"id":"n2842","loc":[-85.625135,41.951922]},"n2843":{"id":"n2843","loc":[-85.615273,41.945637]},"n2844":{"id":"n2844","loc":[-85.620172,41.945627]},"n2845":{"id":"n2845","loc":[-85.625167,41.951985]},"n2846":{"id":"n2846","loc":[-85.622741,41.947437]},"n2847":{"id":"n2847","loc":[-85.624907,41.947428]},"n2848":{"id":"n2848","loc":[-85.627046,41.940995]},"n2849":{"id":"n2849","loc":[-85.627295,41.941304]},"n285":{"id":"n285","loc":[-85.635618,41.941852]},"n2850":{"id":"n2850","loc":[-85.627352,41.94148]},"n2851":{"id":"n2851","loc":[-85.62737,41.942261]},"n2852":{"id":"n2852","loc":[-85.6264,41.942263]},"n2853":{"id":"n2853","loc":[-85.622769,41.949228]},"n2854":{"id":"n2854","loc":[-85.624937,41.949218]},"n2855":{"id":"n2855","loc":[-85.630001,41.944664]},"n2856":{"id":"n2856","loc":[-85.624873,41.942022]},"n2857":{"id":"n2857","loc":[-85.622761,41.948333]},"n2858":{"id":"n2858","loc":[-85.624924,41.948334]},"n2859":{"id":"n2859","loc":[-85.620051,41.94383]},"n286":{"id":"n286","loc":[-85.635621,41.94202]},"n2860":{"id":"n2860","loc":[-85.627629,41.946498]},"n2861":{"id":"n2861","loc":[-85.622757,41.950111]},"n2862":{"id":"n2862","loc":[-85.623685,41.954624]},"n2863":{"id":"n2863","loc":[-85.621459,41.944756]},"n2864":{"id":"n2864","loc":[-85.628637,41.944676]},"n2865":{"id":"n2865","loc":[-85.630125,41.944654]},"n2866":{"id":"n2866","loc":[-85.625196,41.952097]},"n2867":{"id":"n2867","loc":[-85.630257,41.944637]},"n2868":{"id":"n2868","loc":[-85.631247,41.944459]},"n2869":{"id":"n2869","loc":[-85.624867,41.94159]},"n287":{"id":"n287","loc":[-85.63524,41.942023]},"n2870":{"id":"n2870","loc":[-85.624958,41.950343]},"n2871":{"id":"n2871","loc":[-85.624948,41.950484]},"n2872":{"id":"n2872","loc":[-85.624813,41.950983]},"n2873":{"id":"n2873","loc":[-85.624723,41.951789]},"n2874":{"id":"n2874","loc":[-85.624262,41.9512]},"n2875":{"id":"n2875","loc":[-85.62414,41.951201]},"n2876":{"id":"n2876","loc":[-85.624139,41.95112]},"n2877":{"id":"n2877","loc":[-85.628481,41.945611]},"n2878":{"id":"n2878","loc":[-85.620072,41.946538]},"n2879":{"id":"n2879","loc":[-85.622763,41.95099]},"n288":{"id":"n288","loc":[-85.635237,41.941855]},"n2880":{"id":"n2880","loc":[-85.62814,41.946963]},"n2881":{"id":"n2881","loc":[-85.628245,41.947031]},"n2882":{"id":"n2882","loc":[-85.628331,41.947066]},"n2883":{"id":"n2883","loc":[-85.629722,41.944444],"tags":{"leisure":"park","name":"Scouter Park"}},"n2884":{"id":"n2884","loc":[-85.629977,41.943907]},"n2885":{"id":"n2885","loc":[-85.629947,41.943775]},"n2886":{"id":"n2886","loc":[-85.629899,41.943625]},"n2887":{"id":"n2887","loc":[-85.632286,41.944257]},"n2888":{"id":"n2888","loc":[-85.632523,41.944179]},"n2889":{"id":"n2889","loc":[-85.632141,41.944293]},"n289":{"id":"n289","loc":[-85.635568,41.940475]},"n2890":{"id":"n2890","loc":[-85.631571,41.9444]},"n2891":{"id":"n2891","loc":[-85.643236,41.941895]},"n2892":{"id":"n2892","loc":[-85.62865,41.945353]},"n2893":{"id":"n2893","loc":[-85.628594,41.945481]},"n2894":{"id":"n2894","loc":[-85.628581,41.947169]},"n2895":{"id":"n2895","loc":[-85.631843,41.943793]},"n2896":{"id":"n2896","loc":[-85.632299,41.943472]},"n2897":{"id":"n2897","loc":[-85.631519,41.944881]},"n2898":{"id":"n2898","loc":[-85.628429,41.947219]},"n2899":{"id":"n2899","loc":[-85.63145,41.945162]},"n29":{"id":"n29","loc":[-85.637963,41.944263]},"n290":{"id":"n290","loc":[-85.634584,41.940477]},"n2900":{"id":"n2900","loc":[-85.630939,41.945519]},"n2901":{"id":"n2901","loc":[-85.62903,41.945719]},"n2902":{"id":"n2902","loc":[-85.630521,41.945559]},"n2903":{"id":"n2903","loc":[-85.629294,41.945585]},"n2904":{"id":"n2904","loc":[-85.629845,41.945543]},"n2905":{"id":"n2905","loc":[-85.631497,41.944625]},"n2906":{"id":"n2906","loc":[-85.630281,41.945553]},"n2907":{"id":"n2907","loc":[-85.628553,41.946973]},"n2908":{"id":"n2908","loc":[-85.631383,41.945338]},"n2909":{"id":"n2909","loc":[-85.628843,41.946103]},"n291":{"id":"n291","loc":[-85.634583,41.940203]},"n2910":{"id":"n2910","loc":[-85.631193,41.945473]},"n2911":{"id":"n2911","loc":[-85.628897,41.945944]},"n2912":{"id":"n2912","loc":[-85.628789,41.946454]},"n2913":{"id":"n2913","loc":[-85.632548,41.944563]},"n2914":{"id":"n2914","loc":[-85.627527,41.944555]},"n2915":{"id":"n2915","loc":[-85.62752,41.943726]},"n2916":{"id":"n2916","loc":[-85.627894,41.943723]},"n2917":{"id":"n2917","loc":[-85.627897,41.943919]},"n2918":{"id":"n2918","loc":[-85.627991,41.943934]},"n2919":{"id":"n2919","loc":[-85.628082,41.943966]},"n292":{"id":"n292","loc":[-85.635567,41.940201]},"n2920":{"id":"n2920","loc":[-85.628177,41.944015]},"n2921":{"id":"n2921","loc":[-85.628193,41.944048]},"n2922":{"id":"n2922","loc":[-85.628167,41.944054]},"n2923":{"id":"n2923","loc":[-85.628193,41.944094]},"n2924":{"id":"n2924","loc":[-85.628213,41.944144]},"n2925":{"id":"n2925","loc":[-85.628214,41.944199]},"n2926":{"id":"n2926","loc":[-85.62833,41.944196]},"n2927":{"id":"n2927","loc":[-85.628328,41.944262]},"n2928":{"id":"n2928","loc":[-85.628173,41.944262]},"n2929":{"id":"n2929","loc":[-85.628171,41.944293]},"n293":{"id":"n293","loc":[-85.635816,41.942673],"tags":{"crossing":"zebra","highway":"crossing"}},"n2930":{"id":"n2930","loc":[-85.628039,41.944296]},"n2931":{"id":"n2931","loc":[-85.62804,41.944329]},"n2932":{"id":"n2932","loc":[-85.627829,41.944335]},"n2933":{"id":"n2933","loc":[-85.627835,41.94455]},"n2936":{"id":"n2936","loc":[-85.632823,41.945994]},"n294":{"id":"n294","loc":[-85.635696,41.942712]},"n2940":{"id":"n2940","loc":[-85.632192,41.945973]},"n2941":{"id":"n2941","loc":[-85.63226,41.94587]},"n2942":{"id":"n2942","loc":[-85.632721,41.946036]},"n2943":{"id":"n2943","loc":[-85.632641,41.946142]},"n2944":{"id":"n2944","loc":[-85.62937,41.947467]},"n2945":{"id":"n2945","loc":[-85.62959,41.942936]},"n2946":{"id":"n2946","loc":[-85.629551,41.94284]},"n2947":{"id":"n2947","loc":[-85.629501,41.942704]},"n2948":{"id":"n2948","loc":[-85.629472,41.942578]},"n2949":{"id":"n2949","loc":[-85.629361,41.941801]},"n295":{"id":"n295","loc":[-85.635679,41.941962]},"n2950":{"id":"n2950","loc":[-85.629339,41.941716]},"n2951":{"id":"n2951","loc":[-85.629315,41.94166]},"n2952":{"id":"n2952","loc":[-85.629279,41.941602]},"n2953":{"id":"n2953","loc":[-85.629227,41.941556]},"n2954":{"id":"n2954","loc":[-85.624261,41.95112]},"n2955":{"id":"n2955","loc":[-85.629153,41.941524]},"n2956":{"id":"n2956","loc":[-85.626904,41.941098]},"n2957":{"id":"n2957","loc":[-85.624588,41.951294]},"n2958":{"id":"n2958","loc":[-85.631844,41.942945]},"n2959":{"id":"n2959","loc":[-85.625854,41.949222]},"n296":{"id":"n296","loc":[-85.635672,41.941337]},"n2960":{"id":"n2960","loc":[-85.625146,41.955238]},"n2961":{"id":"n2961","loc":[-85.626745,41.948296]},"n2962":{"id":"n2962","loc":[-85.625721,41.95524]},"n2963":{"id":"n2963","loc":[-85.624706,41.952317]},"n2964":{"id":"n2964","loc":[-85.62609,41.956147]},"n2965":{"id":"n2965","loc":[-85.624401,41.954928]},"n2966":{"id":"n2966","loc":[-85.626558,41.955367]},"n2967":{"id":"n2967","loc":[-85.62468,41.955096]},"n2968":{"id":"n2968","loc":[-85.624159,41.953929]},"n2969":{"id":"n2969","loc":[-85.62506,41.951113]},"n297":{"id":"n297","loc":[-85.635658,41.941284]},"n2970":{"id":"n2970","loc":[-85.624942,41.951591]},"n2971":{"id":"n2971","loc":[-85.627399,41.947546]},"n2972":{"id":"n2972","loc":[-85.627695,41.947404]},"n2973":{"id":"n2973","loc":[-85.625925,41.94896]},"n2974":{"id":"n2974","loc":[-85.625725,41.950211]},"n2975":{"id":"n2975","loc":[-85.627008,41.947963]},"n2976":{"id":"n2976","loc":[-85.624373,41.953458]},"n2977":{"id":"n2977","loc":[-85.624137,41.954392]},"n2978":{"id":"n2978","loc":[-85.628257,41.947307]},"n2979":{"id":"n2979","loc":[-85.625281,41.95066]},"n298":{"id":"n298","loc":[-85.635602,41.941166]},"n2980":{"id":"n2980","loc":[-85.625865,41.949804]},"n2981":{"id":"n2981","loc":[-85.626508,41.955932]},"n2982":{"id":"n2982","loc":[-85.626333,41.955216]},"n2983":{"id":"n2983","loc":[-85.626637,41.955676]},"n2984":{"id":"n2984","loc":[-85.624223,41.954599]},"n2985":{"id":"n2985","loc":[-85.626219,41.948671]},"n2986":{"id":"n2986","loc":[-85.624556,41.953043]},"n2987":{"id":"n2987","loc":[-85.625598,41.956302]},"n2988":{"id":"n2988","loc":[-85.624571,41.952971]},"n2989":{"id":"n2989","loc":[-85.627141,41.940727]},"n299":{"id":"n299","loc":[-85.635598,41.941138]},"n2990":{"id":"n2990","loc":[-85.627102,41.939144]},"n2991":{"id":"n2991","loc":[-85.627127,41.940086]},"n2992":{"id":"n2992","loc":[-85.627116,41.940843]},"n2993":{"id":"n2993","loc":[-85.627132,41.9402]},"n2994":{"id":"n2994","loc":[-85.629734,41.940078]},"n2995":{"id":"n2995","loc":[-85.6276,41.937412]},"n2996":{"id":"n2996","loc":[-85.627451,41.937549]},"n2997":{"id":"n2997","loc":[-85.627375,41.937618]},"n2998":{"id":"n2998","loc":[-85.627278,41.937728]},"n2999":{"id":"n2999","loc":[-85.627199,41.937842]},"n3":{"id":"n3","loc":[-85.627345,41.953983]},"n30":{"id":"n30","loc":[-85.637882,41.944205]},"n300":{"id":"n300","loc":[-85.635614,41.941076]},"n3000":{"id":"n3000","loc":[-85.627141,41.937981]},"n3001":{"id":"n3001","loc":[-85.627109,41.938153]},"n3002":{"id":"n3002","loc":[-85.627101,41.938699]},"n3003":{"id":"n3003","loc":[-85.628311,41.942261]},"n3004":{"id":"n3004","loc":[-85.628439,41.940082]},"n3005":{"id":"n3005","loc":[-85.619538,41.942622],"tags":{"leisure":"slipway"}},"n3006":{"id":"n3006","loc":[-85.619872,41.942618]},"n3007":{"id":"n3007","loc":[-85.619755,41.942612]},"n3008":{"id":"n3008","loc":[-85.619647,41.942628]},"n3009":{"id":"n3009","loc":[-85.619415,41.942626]},"n301":{"id":"n301","loc":[-85.635659,41.940956]},"n3010":{"id":"n3010","loc":[-85.619212,41.942623]},"n3011":{"id":"n3011","loc":[-85.631485,41.942472]},"n3012":{"id":"n3012","loc":[-85.630986,41.941786]},"n3013":{"id":"n3013","loc":[-85.631797,41.942006]},"n3014":{"id":"n3014","loc":[-85.630972,41.941162]},"n3015":{"id":"n3015","loc":[-85.631396,41.941611],"tags":{"railway":"level_crossing"}},"n3016":{"id":"n3016","loc":[-85.631878,41.941545]},"n3017":{"id":"n3017","loc":[-85.630461,41.94055]},"n3018":{"id":"n3018","loc":[-85.629751,41.939539],"tags":{"railway":"level_crossing"}},"n3019":{"id":"n3019","loc":[-85.631663,41.941513]},"n302":{"id":"n302","loc":[-85.635666,41.940922]},"n3020":{"id":"n3020","loc":[-85.631328,41.941375]},"n3021":{"id":"n3021","loc":[-85.632554,41.941779]},"n3022":{"id":"n3022","loc":[-85.63245,41.941769]},"n3023":{"id":"n3023","loc":[-85.632475,41.941644]},"n3024":{"id":"n3024","loc":[-85.632581,41.941654]},"n3025":{"id":"n3025","loc":[-85.631957,41.941352]},"n3026":{"id":"n3026","loc":[-85.632293,41.941139]},"n3027":{"id":"n3027","loc":[-85.632315,41.941153]},"n3028":{"id":"n3028","loc":[-85.632302,41.941262]},"n3029":{"id":"n3029","loc":[-85.63237,41.941267]},"n303":{"id":"n303","loc":[-85.635667,41.940877]},"n3030":{"id":"n3030","loc":[-85.632356,41.941538]},"n3031":{"id":"n3031","loc":[-85.632134,41.941678]},"n3032":{"id":"n3032","loc":[-85.631942,41.941687]},"n3033":{"id":"n3033","loc":[-85.63203,41.941694]},"n3034":{"id":"n3034","loc":[-85.632166,41.941555]},"n3035":{"id":"n3035","loc":[-85.632412,41.941416]},"n3036":{"id":"n3036","loc":[-85.63248,41.941342]},"n3037":{"id":"n3037","loc":[-85.632502,41.941259]},"n3038":{"id":"n3038","loc":[-85.632453,41.941161]},"n3039":{"id":"n3039","loc":[-85.63235,41.941103]},"n304":{"id":"n304","loc":[-85.635668,41.940655]},"n3040":{"id":"n3040","loc":[-85.632236,41.941118]},"n3041":{"id":"n3041","loc":[-85.631894,41.941355]},"n3042":{"id":"n3042","loc":[-85.631859,41.941411]},"n3043":{"id":"n3043","loc":[-85.632011,41.941587]},"n3044":{"id":"n3044","loc":[-85.632446,41.941379]},"n3045":{"id":"n3045","loc":[-85.632511,41.941416]},"n3046":{"id":"n3046","loc":[-85.632545,41.941634]},"n3047":{"id":"n3047","loc":[-85.632612,41.94164]},"n3048":{"id":"n3048","loc":[-85.632595,41.942197]},"n3049":{"id":"n3049","loc":[-85.632565,41.942241]},"n305":{"id":"n305","loc":[-85.635628,41.940617]},"n3050":{"id":"n3050","loc":[-85.632515,41.942256]},"n3051":{"id":"n3051","loc":[-85.63245,41.94223]},"n3052":{"id":"n3052","loc":[-85.632401,41.942174]},"n3053":{"id":"n3053","loc":[-85.632391,41.942115]},"n3054":{"id":"n3054","loc":[-85.632029,41.941859]},"n3055":{"id":"n3055","loc":[-85.631828,41.941639]},"n3056":{"id":"n3056","loc":[-85.631829,41.941508]},"n3057":{"id":"n3057","loc":[-85.631281,41.94312]},"n3058":{"id":"n3058","loc":[-85.631421,41.943065]},"n3059":{"id":"n3059","loc":[-85.631339,41.942949]},"n306":{"id":"n306","loc":[-85.635623,41.940272]},"n3060":{"id":"n3060","loc":[-85.631199,41.943004]},"n3061":{"id":"n3061","loc":[-85.631102,41.942931]},"n3062":{"id":"n3062","loc":[-85.631009,41.942809]},"n3063":{"id":"n3063","loc":[-85.631383,41.94265]},"n3064":{"id":"n3064","loc":[-85.631477,41.942773]},"n3065":{"id":"n3065","loc":[-85.630638,41.942809]},"n3066":{"id":"n3066","loc":[-85.630738,41.942943]},"n3067":{"id":"n3067","loc":[-85.630841,41.9429]},"n3068":{"id":"n3068","loc":[-85.630741,41.942766]},"n3069":{"id":"n3069","loc":[-85.63054,41.942603]},"n307":{"id":"n307","loc":[-85.635651,41.940183]},"n3070":{"id":"n3070","loc":[-85.630498,41.942619]},"n3071":{"id":"n3071","loc":[-85.630567,41.942718]},"n3072":{"id":"n3072","loc":[-85.630616,41.942698]},"n3073":{"id":"n3073","loc":[-85.630642,41.94273]},"n3074":{"id":"n3074","loc":[-85.630686,41.942714]},"n3075":{"id":"n3075","loc":[-85.630715,41.942754]},"n3076":{"id":"n3076","loc":[-85.6309,41.942681]},"n3077":{"id":"n3077","loc":[-85.630843,41.942605]},"n3078":{"id":"n3078","loc":[-85.6309,41.942581]},"n3079":{"id":"n3079","loc":[-85.630832,41.942487]},"n308":{"id":"n308","loc":[-85.63577,41.940183],"tags":{"crossing":"zebra","highway":"crossing"}},"n3080":{"id":"n3080","loc":[-85.630773,41.942509]},"n3081":{"id":"n3081","loc":[-85.630718,41.942436]},"n3082":{"id":"n3082","loc":[-85.630485,41.942524]},"n3083":{"id":"n3083","loc":[-85.631468,41.941233]},"n3084":{"id":"n3084","loc":[-85.631334,41.94114]},"n3085":{"id":"n3085","loc":[-85.632052,41.940568]},"n3086":{"id":"n3086","loc":[-85.63219,41.940663]},"n3087":{"id":"n3087","loc":[-85.631323,41.940834]},"n3088":{"id":"n3088","loc":[-85.631122,41.941002]},"n3089":{"id":"n3089","loc":[-85.631321,41.941133]},"n309":{"id":"n309","loc":[-85.636939,41.942544]},"n3090":{"id":"n3090","loc":[-85.631521,41.940966]},"n3091":{"id":"n3091","loc":[-85.631103,41.940253]},"n3092":{"id":"n3092","loc":[-85.631226,41.940211]},"n3093":{"id":"n3093","loc":[-85.631597,41.940805]},"n3094":{"id":"n3094","loc":[-85.631474,41.940847]},"n3095":{"id":"n3095","loc":[-85.631811,41.940534]},"n3096":{"id":"n3096","loc":[-85.631588,41.94061]},"n3097":{"id":"n3097","loc":[-85.631438,41.940366]},"n3098":{"id":"n3098","loc":[-85.631661,41.94029]},"n3099":{"id":"n3099","loc":[-85.630621,41.940041]},"n31":{"id":"n31","loc":[-85.63827,41.944203]},"n310":{"id":"n310","loc":[-85.636323,41.942552]},"n3100":{"id":"n3100","loc":[-85.630436,41.939773]},"n3101":{"id":"n3101","loc":[-85.63059,41.939714]},"n3102":{"id":"n3102","loc":[-85.630775,41.939983]},"n3103":{"id":"n3103","loc":[-85.63047,41.940167]},"n3104":{"id":"n3104","loc":[-85.63013,41.939686]},"n3105":{"id":"n3105","loc":[-85.630302,41.939618]},"n3106":{"id":"n3106","loc":[-85.630641,41.9401]},"n3107":{"id":"n3107","loc":[-85.630966,41.940619]},"n3108":{"id":"n3108","loc":[-85.630874,41.940493]},"n3109":{"id":"n3109","loc":[-85.630933,41.940469]},"n311":{"id":"n311","loc":[-85.636257,41.942555]},"n3110":{"id":"n3110","loc":[-85.630763,41.940236]},"n3111":{"id":"n3111","loc":[-85.63088,41.940189]},"n3112":{"id":"n3112","loc":[-85.631142,41.940548]},"n3113":{"id":"n3113","loc":[-85.630958,41.940871]},"n3114":{"id":"n3114","loc":[-85.630874,41.940778]},"n3115":{"id":"n3115","loc":[-85.631062,41.940684]},"n3116":{"id":"n3116","loc":[-85.631146,41.940777]},"n3117":{"id":"n3117","loc":[-85.632031,41.940575]},"n3118":{"id":"n3118","loc":[-85.631777,41.940186]},"n3119":{"id":"n3119","loc":[-85.631346,41.940179]},"n312":{"id":"n312","loc":[-85.636208,41.942561]},"n3120":{"id":"n3120","loc":[-85.631342,41.94012]},"n3121":{"id":"n3121","loc":[-85.631831,41.940118]},"n3122":{"id":"n3122","loc":[-85.632115,41.940543]},"n3123":{"id":"n3123","loc":[-85.631031,41.941683]},"n3124":{"id":"n3124","loc":[-85.630981,41.941608]},"n3125":{"id":"n3125","loc":[-85.631209,41.941516]},"n3126":{"id":"n3126","loc":[-85.631264,41.941586]},"n3127":{"id":"n3127","loc":[-85.630938,41.94155]},"n3128":{"id":"n3128","loc":[-85.631156,41.941462]},"n3129":{"id":"n3129","loc":[-85.631197,41.94152]},"n313":{"id":"n313","loc":[-85.636159,41.942573]},"n3130":{"id":"n3130","loc":[-85.630895,41.941485]},"n3131":{"id":"n3131","loc":[-85.630824,41.941389]},"n3132":{"id":"n3132","loc":[-85.630986,41.941323]},"n3133":{"id":"n3133","loc":[-85.631057,41.941419]},"n3134":{"id":"n3134","loc":[-85.630777,41.941328]},"n3135":{"id":"n3135","loc":[-85.630907,41.941274]},"n3136":{"id":"n3136","loc":[-85.630953,41.941335]},"n3137":{"id":"n3137","loc":[-85.630797,41.941247]},"n3138":{"id":"n3138","loc":[-85.630701,41.94117]},"n3139":{"id":"n3139","loc":[-85.630829,41.941113]},"n314":{"id":"n314","loc":[-85.635743,41.942881]},"n3140":{"id":"n3140","loc":[-85.6309,41.941201]},"n3141":{"id":"n3141","loc":[-85.630765,41.941206]},"n3142":{"id":"n3142","loc":[-85.630739,41.941218]},"n3143":{"id":"n3143","loc":[-85.630582,41.941039]},"n3144":{"id":"n3144","loc":[-85.630412,41.940818]},"n3145":{"id":"n3145","loc":[-85.630509,41.940777]},"n3146":{"id":"n3146","loc":[-85.630678,41.941004]},"n3147":{"id":"n3147","loc":[-85.630773,41.942166]},"n3148":{"id":"n3148","loc":[-85.630708,41.942074]},"n3149":{"id":"n3149","loc":[-85.630863,41.942013]},"n315":{"id":"n315","loc":[-85.635452,41.942966]},"n3150":{"id":"n3150","loc":[-85.630928,41.942105]},"n3151":{"id":"n3151","loc":[-85.630701,41.942026]},"n3152":{"id":"n3152","loc":[-85.630665,41.941971]},"n3153":{"id":"n3153","loc":[-85.630793,41.941918]},"n3154":{"id":"n3154","loc":[-85.630837,41.94197]},"n3155":{"id":"n3155","loc":[-85.630757,41.941871]},"n3156":{"id":"n3156","loc":[-85.630629,41.941923]},"n3157":{"id":"n3157","loc":[-85.630694,41.941783]},"n3158":{"id":"n3158","loc":[-85.630534,41.941847]},"n3159":{"id":"n3159","loc":[-85.630598,41.941935]},"n316":{"id":"n316","loc":[-85.634911,41.943118]},"n3160":{"id":"n3160","loc":[-85.631548,41.93938]},"n3161":{"id":"n3161","loc":[-85.631525,41.939919]},"n3162":{"id":"n3162","loc":[-85.631648,41.940043]},"n3163":{"id":"n3163","loc":[-85.624586,41.951121]},"n3164":{"id":"n3164","loc":[-85.622139,41.952064]},"n3165":{"id":"n3165","loc":[-85.622141,41.952144]},"n3166":{"id":"n3166","loc":[-85.621977,41.952146]},"n3167":{"id":"n3167","loc":[-85.621978,41.952211]},"n3168":{"id":"n3168","loc":[-85.62191,41.952212]},"n3169":{"id":"n3169","loc":[-85.633628,41.935437]},"n317":{"id":"n317","loc":[-85.634743,41.943167]},"n3170":{"id":"n3170","loc":[-85.632849,41.935518]},"n3171":{"id":"n3171","loc":[-85.632376,41.93574]},"n3172":{"id":"n3172","loc":[-85.631517,41.935897]},"n3173":{"id":"n3173","loc":[-85.630433,41.936124]},"n3174":{"id":"n3174","loc":[-85.630207,41.936427]},"n3175":{"id":"n3175","loc":[-85.630346,41.936795]},"n3176":{"id":"n3176","loc":[-85.62996,41.936974]},"n3177":{"id":"n3177","loc":[-85.629916,41.937488]},"n3178":{"id":"n3178","loc":[-85.629946,41.937802]},"n3179":{"id":"n3179","loc":[-85.629977,41.937905]},"n318":{"id":"n318","loc":[-85.634401,41.94328]},"n3180":{"id":"n3180","loc":[-85.63016,41.937909]},"n3181":{"id":"n3181","loc":[-85.630804,41.937791]},"n3182":{"id":"n3182","loc":[-85.631688,41.937808]},"n3183":{"id":"n3183","loc":[-85.631685,41.938008]},"n3184":{"id":"n3184","loc":[-85.631845,41.938116]},"n3185":{"id":"n3185","loc":[-85.63207,41.938181]},"n3186":{"id":"n3186","loc":[-85.632143,41.938371]},"n3187":{"id":"n3187","loc":[-85.632056,41.938435]},"n3188":{"id":"n3188","loc":[-85.631787,41.938457]},"n3189":{"id":"n3189","loc":[-85.631657,41.938728]},"n319":{"id":"n319","loc":[-85.634345,41.943299]},"n3190":{"id":"n3190","loc":[-85.631595,41.93775]},"n3191":{"id":"n3191","loc":[-85.630264,41.937839]},"n3192":{"id":"n3192","loc":[-85.628591,41.948536]},"n3193":{"id":"n3193","loc":[-85.63205,41.951181]},"n3194":{"id":"n3194","loc":[-85.632034,41.949909]},"n3195":{"id":"n3195","loc":[-85.630841,41.951191]},"n3196":{"id":"n3196","loc":[-85.632083,41.9537]},"n3197":{"id":"n3197","loc":[-85.630929,41.959037]},"n3198":{"id":"n3198","loc":[-85.632151,41.959028]},"n3199":{"id":"n3199","loc":[-85.630911,41.957428]},"n32":{"id":"n32","loc":[-85.638273,41.944246]},"n320":{"id":"n320","loc":[-85.634287,41.943326]},"n3200":{"id":"n3200","loc":[-85.63213,41.957427]},"n3201":{"id":"n3201","loc":[-85.632072,41.952447]},"n3202":{"id":"n3202","loc":[-85.632095,41.954677]},"n3203":{"id":"n3203","loc":[-85.632111,41.955911]},"n3204":{"id":"n3204","loc":[-85.630855,41.952457]},"n3205":{"id":"n3205","loc":[-85.630869,41.953709]},"n3206":{"id":"n3206","loc":[-85.63088,41.954682]},"n3207":{"id":"n3207","loc":[-85.630894,41.955913]},"n3208":{"id":"n3208","loc":[-85.633214,41.948619]},"n3209":{"id":"n3209","loc":[-85.633253,41.951171]},"n321":{"id":"n321","loc":[-85.634233,41.943354]},"n3210":{"id":"n3210","loc":[-85.633234,41.949901]},"n3211":{"id":"n3211","loc":[-85.633922,41.948616]},"n3212":{"id":"n3212","loc":[-85.625188,41.947832]},"n3213":{"id":"n3213","loc":[-85.625208,41.947775]},"n3214":{"id":"n3214","loc":[-85.625229,41.94776]},"n3215":{"id":"n3215","loc":[-85.625201,41.947749]},"n3216":{"id":"n3216","loc":[-85.625168,41.947707]},"n3217":{"id":"n3217","loc":[-85.625171,41.947609]},"n3218":{"id":"n3218","loc":[-85.625213,41.947564]},"n3219":{"id":"n3219","loc":[-85.62529,41.94756]},"n322":{"id":"n322","loc":[-85.634099,41.943429]},"n3220":{"id":"n3220","loc":[-85.625303,41.947533]},"n3221":{"id":"n3221","loc":[-85.625344,41.947482]},"n3222":{"id":"n3222","loc":[-85.625442,41.947468]},"n3223":{"id":"n3223","loc":[-85.62565,41.947494]},"n3224":{"id":"n3224","loc":[-85.625726,41.947613]},"n3225":{"id":"n3225","loc":[-85.625703,41.947728]},"n3226":{"id":"n3226","loc":[-85.625534,41.94781]},"n3227":{"id":"n3227","loc":[-85.625391,41.947822]},"n3228":{"id":"n3228","loc":[-85.625304,41.947859]},"n3229":{"id":"n3229","loc":[-85.625203,41.947885]},"n323":{"id":"n323","loc":[-85.633958,41.943507],"tags":{"highway":"crossing"}},"n3230":{"id":"n3230","loc":[-85.624691,41.948659]},"n3231":{"id":"n3231","loc":[-85.624328,41.948661]},"n3232":{"id":"n3232","loc":[-85.624331,41.949046]},"n3233":{"id":"n3233","loc":[-85.624694,41.949045]},"n3234":{"id":"n3234","loc":[-85.623623,41.949606]},"n3235":{"id":"n3235","loc":[-85.623623,41.9497]},"n3236":{"id":"n3236","loc":[-85.623357,41.9497]},"n3237":{"id":"n3237","loc":[-85.623357,41.949614]},"n3238":{"id":"n3238","loc":[-85.623974,41.949429]},"n3239":{"id":"n3239","loc":[-85.623974,41.949605]},"n324":{"id":"n324","loc":[-85.633698,41.943651],"tags":{"railway":"crossing"}},"n3240":{"id":"n3240","loc":[-85.624501,41.951226]},"n3241":{"id":"n3241","loc":[-85.624501,41.951123]},"n3242":{"id":"n3242","loc":[-85.624319,41.951123]},"n3243":{"id":"n3243","loc":[-85.624319,41.951226]},"n3244":{"id":"n3244","loc":[-85.624121,41.950866]},"n3245":{"id":"n3245","loc":[-85.624115,41.950525]},"n3246":{"id":"n3246","loc":[-85.624315,41.950523]},"n3247":{"id":"n3247","loc":[-85.62432,41.950865]},"n3248":{"id":"n3248","loc":[-85.624393,41.950867]},"n3249":{"id":"n3249","loc":[-85.62439,41.950596]},"n325":{"id":"n325","loc":[-85.633508,41.943757]},"n3250":{"id":"n3250","loc":[-85.624673,41.950594]},"n3251":{"id":"n3251","loc":[-85.624675,41.95082]},"n3252":{"id":"n3252","loc":[-85.62451,41.950821]},"n3253":{"id":"n3253","loc":[-85.62451,41.950866]},"n3254":{"id":"n3254","loc":[-85.624101,41.949346]},"n3255":{"id":"n3255","loc":[-85.624244,41.949346]},"n3256":{"id":"n3256","loc":[-85.624244,41.949368]},"n3257":{"id":"n3257","loc":[-85.62434,41.949368]},"n3258":{"id":"n3258","loc":[-85.624342,41.949351]},"n3259":{"id":"n3259","loc":[-85.624725,41.949348]},"n326":{"id":"n326","loc":[-85.634839,41.942974]},"n3260":{"id":"n3260","loc":[-85.624755,41.950495]},"n3261":{"id":"n3261","loc":[-85.624121,41.950502]},"n3262":{"id":"n3262","loc":[-85.625453,41.950163]},"n3263":{"id":"n3263","loc":[-85.625454,41.949976]},"n3264":{"id":"n3264","loc":[-85.625549,41.949977]},"n3265":{"id":"n3265","loc":[-85.62555,41.949833]},"n3266":{"id":"n3266","loc":[-85.625577,41.949833]},"n3267":{"id":"n3267","loc":[-85.625578,41.949656]},"n3268":{"id":"n3268","loc":[-85.625195,41.949655]},"n3269":{"id":"n3269","loc":[-85.625192,41.950162]},"n327":{"id":"n327","loc":[-85.634657,41.943028]},"n3270":{"id":"n3270","loc":[-85.622992,41.949614]},"n3271":{"id":"n3271","loc":[-85.622991,41.949431]},"n3272":{"id":"n3272","loc":[-85.620103,41.951]},"n3273":{"id":"n3273","loc":[-85.605644,41.947468]},"n3274":{"id":"n3274","loc":[-85.617421,41.947457]},"n3275":{"id":"n3275","loc":[-85.620078,41.947444]},"n3276":{"id":"n3276","loc":[-85.620087,41.94924]},"n3277":{"id":"n3277","loc":[-85.62156,41.948333]},"n3278":{"id":"n3278","loc":[-85.620106,41.950132]},"n3279":{"id":"n3279","loc":[-85.637412,41.951136]},"n328":{"id":"n328","loc":[-85.634222,41.943152]},"n3280":{"id":"n3280","loc":[-85.635429,41.948608]},"n3281":{"id":"n3281","loc":[-85.635047,41.947788]},"n3282":{"id":"n3282","loc":[-85.635048,41.947796]},"n3283":{"id":"n3283","loc":[-85.635002,41.947797]},"n3284":{"id":"n3284","loc":[-85.635002,41.947788]},"n3285":{"id":"n3285","loc":[-85.634914,41.94779]},"n3286":{"id":"n3286","loc":[-85.634913,41.947753]},"n3287":{"id":"n3287","loc":[-85.63494,41.947753]},"n3288":{"id":"n3288","loc":[-85.634938,41.947708]},"n3289":{"id":"n3289","loc":[-85.635124,41.947705]},"n329":{"id":"n329","loc":[-85.634099,41.943202]},"n3290":{"id":"n3290","loc":[-85.635126,41.947787]},"n3291":{"id":"n3291","loc":[-85.634972,41.947599]},"n3292":{"id":"n3292","loc":[-85.634921,41.9476]},"n3293":{"id":"n3293","loc":[-85.63485,41.947546]},"n3294":{"id":"n3294","loc":[-85.63485,41.947508]},"n3295":{"id":"n3295","loc":[-85.634924,41.947457]},"n3296":{"id":"n3296","loc":[-85.634967,41.947456]},"n3297":{"id":"n3297","loc":[-85.635041,41.947512]},"n3298":{"id":"n3298","loc":[-85.635041,41.947542]},"n3299":{"id":"n3299","loc":[-85.634244,41.947839]},"n33":{"id":"n33","loc":[-85.638257,41.944188]},"n330":{"id":"n330","loc":[-85.634093,41.943138]},"n3300":{"id":"n3300","loc":[-85.634243,41.947793]},"n3301":{"id":"n3301","loc":[-85.634244,41.947686]},"n3302":{"id":"n3302","loc":[-85.634243,41.947657]},"n3303":{"id":"n3303","loc":[-85.634462,41.947653]},"n3304":{"id":"n3304","loc":[-85.634468,41.947835]},"n3305":{"id":"n3305","loc":[-85.634416,41.948006]},"n3306":{"id":"n3306","loc":[-85.634415,41.947898]},"n3307":{"id":"n3307","loc":[-85.634275,41.947899]},"n3308":{"id":"n3308","loc":[-85.634275,41.947927]},"n3309":{"id":"n3309","loc":[-85.63425,41.947927]},"n331":{"id":"n331","loc":[-85.633938,41.943291]},"n3310":{"id":"n3310","loc":[-85.63425,41.947976]},"n3311":{"id":"n3311","loc":[-85.634274,41.947976]},"n3312":{"id":"n3312","loc":[-85.634275,41.948007]},"n3313":{"id":"n3313","loc":[-85.634342,41.947635]},"n3314":{"id":"n3314","loc":[-85.634339,41.947497]},"n3315":{"id":"n3315","loc":[-85.634313,41.94748]},"n3316":{"id":"n3316","loc":[-85.634287,41.947474]},"n3317":{"id":"n3317","loc":[-85.63498,41.94815]},"n3318":{"id":"n3318","loc":[-85.634891,41.94815]},"n3319":{"id":"n3319","loc":[-85.634892,41.948169]},"n332":{"id":"n332","loc":[-85.633535,41.943511],"tags":{"railway":"crossing"}},"n3320":{"id":"n3320","loc":[-85.634852,41.948169]},"n3321":{"id":"n3321","loc":[-85.634853,41.948268]},"n3322":{"id":"n3322","loc":[-85.634832,41.948268]},"n3323":{"id":"n3323","loc":[-85.634832,41.948296]},"n3324":{"id":"n3324","loc":[-85.634965,41.948295]},"n3325":{"id":"n3325","loc":[-85.634966,41.948321]},"n3326":{"id":"n3326","loc":[-85.634999,41.948321]},"n3327":{"id":"n3327","loc":[-85.634999,41.948295]},"n3328":{"id":"n3328","loc":[-85.635175,41.948293]},"n3329":{"id":"n3329","loc":[-85.635175,41.948262]},"n333":{"id":"n333","loc":[-85.63339,41.943596]},"n3330":{"id":"n3330","loc":[-85.635159,41.948262]},"n3331":{"id":"n3331","loc":[-85.635158,41.948152]},"n3332":{"id":"n3332","loc":[-85.635067,41.948152]},"n3333":{"id":"n3333","loc":[-85.635065,41.947966]},"n3334":{"id":"n3334","loc":[-85.634979,41.947966]},"n3335":{"id":"n3335","loc":[-85.634307,41.948326]},"n3336":{"id":"n3336","loc":[-85.634305,41.948298]},"n3337":{"id":"n3337","loc":[-85.634331,41.948055]},"n3338":{"id":"n3338","loc":[-85.634331,41.948046]},"n3339":{"id":"n3339","loc":[-85.634435,41.948047]},"n334":{"id":"n334","loc":[-85.632842,41.943895]},"n3340":{"id":"n3340","loc":[-85.634434,41.948375]},"n3341":{"id":"n3341","loc":[-85.634463,41.948373]},"n3342":{"id":"n3342","loc":[-85.634464,41.948456]},"n3343":{"id":"n3343","loc":[-85.63443,41.948457]},"n3344":{"id":"n3344","loc":[-85.634432,41.948505]},"n3345":{"id":"n3345","loc":[-85.637386,41.94906]},"n3346":{"id":"n3346","loc":[-85.637113,41.9486]},"n3347":{"id":"n3347","loc":[-85.635448,41.949424]},"n335":{"id":"n335","loc":[-85.633856,41.943315]},"n3352":{"id":"n3352","loc":[-85.635457,41.949787]},"n3353":{"id":"n3353","loc":[-85.635459,41.949886]},"n336":{"id":"n336","loc":[-85.633697,41.943405]},"n337":{"id":"n337","loc":[-85.63347,41.943181]},"n3372":{"id":"n3372","loc":[-85.634423,41.950964]},"n3373":{"id":"n3373","loc":[-85.634424,41.95074]},"n3374":{"id":"n3374","loc":[-85.634394,41.950284]},"n3375":{"id":"n3375","loc":[-85.634398,41.950626]},"n3376":{"id":"n3376","loc":[-85.63452,41.951063]},"n3377":{"id":"n3377","loc":[-85.634511,41.949977]},"n3378":{"id":"n3378","loc":[-85.637409,41.949873]},"n3379":{"id":"n3379","loc":[-85.634824,41.94996]},"n338":{"id":"n338","loc":[-85.633597,41.943109]},"n3380":{"id":"n3380","loc":[-85.635437,41.949954]},"n3381":{"id":"n3381","loc":[-85.634844,41.951064]},"n3382":{"id":"n3382","loc":[-85.635458,41.951058]},"n3383":{"id":"n3383","loc":[-85.633921,41.947333]},"n3384":{"id":"n3384","loc":[-85.634208,41.947793]},"n3385":{"id":"n3385","loc":[-85.634204,41.947687]},"n3386":{"id":"n3386","loc":[-85.63424,41.947475]},"n3387":{"id":"n3387","loc":[-85.63424,41.947635]},"n3388":{"id":"n3388","loc":[-85.634089,41.948328]},"n3389":{"id":"n3389","loc":[-85.63424,41.948299]},"n339":{"id":"n339","loc":[-85.633673,41.943184]},"n3390":{"id":"n3390","loc":[-85.634239,41.948212]},"n3391":{"id":"n3391","loc":[-85.634086,41.948214]},"n3392":{"id":"n3392","loc":[-85.63408,41.948056]},"n3393":{"id":"n3393","loc":[-85.634093,41.948506]},"n3394":{"id":"n3394","loc":[-85.64344,41.941866]},"n3395":{"id":"n3395","loc":[-85.63378,41.95099]},"n3396":{"id":"n3396","loc":[-85.633779,41.950967]},"n3397":{"id":"n3397","loc":[-85.63375,41.950746]},"n3398":{"id":"n3398","loc":[-85.63375,41.950697]},"n3399":{"id":"n3399","loc":[-85.633903,41.950696]},"n34":{"id":"n34","loc":[-85.638176,41.944312]},"n340":{"id":"n340","loc":[-85.633714,41.94316]},"n3400":{"id":"n3400","loc":[-85.633901,41.950436]},"n3401":{"id":"n3401","loc":[-85.633492,41.950438]},"n3402":{"id":"n3402","loc":[-85.633494,41.950756]},"n3403":{"id":"n3403","loc":[-85.633454,41.950756]},"n3404":{"id":"n3404","loc":[-85.633456,41.950992]},"n3405":{"id":"n3405","loc":[-85.633994,41.950284]},"n3406":{"id":"n3406","loc":[-85.633998,41.950628]},"n3407":{"id":"n3407","loc":[-85.633364,41.951068]},"n3408":{"id":"n3408","loc":[-85.633356,41.949982]},"n3409":{"id":"n3409","loc":[-85.643327,41.941903]},"n341":{"id":"n341","loc":[-85.633811,41.943256]},"n3410":{"id":"n3410","loc":[-85.633292,41.953691]},"n3411":{"id":"n3411","loc":[-85.637432,41.952399]},"n3412":{"id":"n3412","loc":[-85.633349,41.957422]},"n3413":{"id":"n3413","loc":[-85.633326,41.955909]},"n3414":{"id":"n3414","loc":[-85.633307,41.954673]},"n3415":{"id":"n3415","loc":[-85.633273,41.952436]},"n3416":{"id":"n3416","loc":[-85.633361,41.95823],"tags":{"highway":"turning_circle"}},"n3417":{"id":"n3417","loc":[-85.619899,41.945527]},"n3418":{"id":"n3418","loc":[-85.643422,41.941946]},"n3419":{"id":"n3419","loc":[-85.643505,41.942033]},"n342":{"id":"n342","loc":[-85.633801,41.943261]},"n3420":{"id":"n3420","loc":[-85.620088,41.945571]},"n3421":{"id":"n3421","loc":[-85.620051,41.945505]},"n3422":{"id":"n3422","loc":[-85.62001,41.94541]},"n3423":{"id":"n3423","loc":[-85.620982,41.944742]},"n3424":{"id":"n3424","loc":[-85.621305,41.944782]},"n3425":{"id":"n3425","loc":[-85.621174,41.944819]},"n3426":{"id":"n3426","loc":[-85.621029,41.944871]},"n3427":{"id":"n3427","loc":[-85.620741,41.945011]},"n3428":{"id":"n3428","loc":[-85.620616,41.945085]},"n3429":{"id":"n3429","loc":[-85.620506,41.945172]},"n343":{"id":"n343","loc":[-85.63374,41.943514]},"n3430":{"id":"n3430","loc":[-85.620394,41.945273]},"n3431":{"id":"n3431","loc":[-85.620316,41.94536]},"n3432":{"id":"n3432","loc":[-85.620257,41.945452]},"n3433":{"id":"n3433","loc":[-85.620212,41.945535]},"n3434":{"id":"n3434","loc":[-85.620101,41.945811]},"n3435":{"id":"n3435","loc":[-85.620081,41.945937]},"n3436":{"id":"n3436","loc":[-85.619899,41.943718]},"n3437":{"id":"n3437","loc":[-85.619969,41.943211]},"n3438":{"id":"n3438","loc":[-85.619894,41.943292]},"n3439":{"id":"n3439","loc":[-85.620047,41.944738]},"n344":{"id":"n344","loc":[-85.633665,41.943441]},"n3440":{"id":"n3440","loc":[-85.620226,41.946088]},"n3441":{"id":"n3441","loc":[-85.620225,41.945864]},"n3442":{"id":"n3442","loc":[-85.620518,41.945863]},"n3443":{"id":"n3443","loc":[-85.620519,41.945944]},"n3444":{"id":"n3444","loc":[-85.620388,41.945944]},"n3445":{"id":"n3445","loc":[-85.620389,41.946088]},"n3446":{"id":"n3446","loc":[-85.618405,41.946566]},"n3447":{"id":"n3447","loc":[-85.619156,41.946562]},"n3448":{"id":"n3448","loc":[-85.619154,41.946319]},"n3449":{"id":"n3449","loc":[-85.618736,41.946322]},"n345":{"id":"n345","loc":[-85.633162,41.942947]},"n3450":{"id":"n3450","loc":[-85.618733,41.94612]},"n3451":{"id":"n3451","loc":[-85.619317,41.946116]},"n3452":{"id":"n3452","loc":[-85.619316,41.946023]},"n3453":{"id":"n3453","loc":[-85.619622,41.946021]},"n3454":{"id":"n3454","loc":[-85.619624,41.946171]},"n3455":{"id":"n3455","loc":[-85.61977,41.94617]},"n3456":{"id":"n3456","loc":[-85.619769,41.94602]},"n3457":{"id":"n3457","loc":[-85.619732,41.94602]},"n3458":{"id":"n3458","loc":[-85.619731,41.945856]},"n3459":{"id":"n3459","loc":[-85.619617,41.945857]},"n346":{"id":"n346","loc":[-85.633598,41.943083]},"n3460":{"id":"n3460","loc":[-85.619616,41.945776]},"n3461":{"id":"n3461","loc":[-85.619447,41.945777]},"n3462":{"id":"n3462","loc":[-85.619415,41.945778]},"n3463":{"id":"n3463","loc":[-85.618378,41.945788]},"n3464":{"id":"n3464","loc":[-85.618384,41.946132]},"n3465":{"id":"n3465","loc":[-85.618503,41.94613]},"n3466":{"id":"n3466","loc":[-85.618506,41.946319]},"n3467":{"id":"n3467","loc":[-85.6184,41.94632]},"n3468":{"id":"n3468","loc":[-85.618248,41.946416]},"n3469":{"id":"n3469","loc":[-85.618247,41.946319]},"n347":{"id":"n347","loc":[-85.63343,41.943179]},"n3470":{"id":"n3470","loc":[-85.618039,41.946321]},"n3471":{"id":"n3471","loc":[-85.61804,41.946418]},"n3472":{"id":"n3472","loc":[-85.620118,41.951895]},"n3473":{"id":"n3473","loc":[-85.617075,41.95469]},"n3474":{"id":"n3474","loc":[-85.620107,41.952113]},"n3475":{"id":"n3475","loc":[-85.620091,41.95232]},"n3476":{"id":"n3476","loc":[-85.620047,41.952505]},"n3477":{"id":"n3477","loc":[-85.61998,41.952715]},"n3478":{"id":"n3478","loc":[-85.619861,41.952986]},"n3479":{"id":"n3479","loc":[-85.619622,41.953365]},"n348":{"id":"n348","loc":[-85.633669,41.94341]},"n3480":{"id":"n3480","loc":[-85.619441,41.953567]},"n3481":{"id":"n3481","loc":[-85.619259,41.953741]},"n3482":{"id":"n3482","loc":[-85.618835,41.954056]},"n3483":{"id":"n3483","loc":[-85.618602,41.954194]},"n3484":{"id":"n3484","loc":[-85.618305,41.954347]},"n3485":{"id":"n3485","loc":[-85.618006,41.954466]},"n3486":{"id":"n3486","loc":[-85.617611,41.954587]},"n3487":{"id":"n3487","loc":[-85.615094,41.943412]},"n3488":{"id":"n3488","loc":[-85.619337,41.943025]},"n3489":{"id":"n3489","loc":[-85.610477,41.945527]},"n349":{"id":"n349","loc":[-85.633566,41.943466]},"n3490":{"id":"n3490","loc":[-85.610477,41.943718]},"n3491":{"id":"n3491","loc":[-85.619804,41.942976]},"n3492":{"id":"n3492","loc":[-85.61921,41.942672]},"n3493":{"id":"n3493","loc":[-85.619862,41.942836]},"n3494":{"id":"n3494","loc":[-85.616326,41.942769]},"n3495":{"id":"n3495","loc":[-85.617953,41.942917]},"n3496":{"id":"n3496","loc":[-85.61972,41.942728]},"n3497":{"id":"n3497","loc":[-85.61944,41.942784]},"n3498":{"id":"n3498","loc":[-85.615323,41.942841]},"n3499":{"id":"n3499","loc":[-85.612923,41.943718]},"n35":{"id":"n35","loc":[-85.637928,41.944249]},"n350":{"id":"n350","loc":[-85.633031,41.942986]},"n3500":{"id":"n3500","loc":[-85.61958,41.942756]},"n3501":{"id":"n3501","loc":[-85.619643,41.942647],"tags":{"leisure":"fishing"}},"n3502":{"id":"n3502","loc":[-85.619935,41.942962]},"n3503":{"id":"n3503","loc":[-85.629677,41.954687]},"n3504":{"id":"n3504","loc":[-85.629083,41.953722]},"n3505":{"id":"n3505","loc":[-85.621907,41.952067]},"n3506":{"id":"n3506","loc":[-85.621788,41.952058]},"n3507":{"id":"n3507","loc":[-85.629665,41.953718]},"n3508":{"id":"n3508","loc":[-85.624454,41.954707]},"n3509":{"id":"n3509","loc":[-85.634609,41.954585]},"n351":{"id":"n351","loc":[-85.633238,41.94283]},"n3510":{"id":"n3510","loc":[-85.634595,41.953772]},"n3511":{"id":"n3511","loc":[-85.633425,41.953783]},"n3512":{"id":"n3512","loc":[-85.633439,41.954596]},"n3517":{"id":"n3517","loc":[-85.621789,41.952179]},"n3518":{"id":"n3518","loc":[-85.624105,41.954704]},"n3519":{"id":"n3519","loc":[-85.623306,41.954542]},"n352":{"id":"n352","loc":[-85.633173,41.943556]},"n3520":{"id":"n3520","loc":[-85.623123,41.954502]},"n3521":{"id":"n3521","loc":[-85.622965,41.954473]},"n3522":{"id":"n3522","loc":[-85.622822,41.954455]},"n3523":{"id":"n3523","loc":[-85.62269,41.954448]},"n3524":{"id":"n3524","loc":[-85.622388,41.954467]},"n3525":{"id":"n3525","loc":[-85.62403,41.954895]},"n3526":{"id":"n3526","loc":[-85.623579,41.954855]},"n3527":{"id":"n3527","loc":[-85.623836,41.954951]},"n3528":{"id":"n3528","loc":[-85.622473,41.954592]},"n3529":{"id":"n3529","loc":[-85.622753,41.95458]},"n353":{"id":"n353","loc":[-85.633127,41.943552]},"n3530":{"id":"n3530","loc":[-85.62404,41.955078]},"n3531":{"id":"n3531","loc":[-85.624126,41.954999]},"n3532":{"id":"n3532","loc":[-85.623171,41.954687]},"n3533":{"id":"n3533","loc":[-85.624276,41.955206]},"n3534":{"id":"n3534","loc":[-85.62491,41.952801]},"n3535":{"id":"n3535","loc":[-85.625186,41.952756]},"n3536":{"id":"n3536","loc":[-85.625552,41.952792]},"n3537":{"id":"n3537","loc":[-85.626001,41.952948]},"n3538":{"id":"n3538","loc":[-85.626528,41.952984]},"n3539":{"id":"n3539","loc":[-85.626942,41.952886]},"n354":{"id":"n354","loc":[-85.632745,41.943222]},"n3540":{"id":"n3540","loc":[-85.627092,41.952685]},"n3541":{"id":"n3541","loc":[-85.627212,41.95244]},"n3542":{"id":"n3542","loc":[-85.627158,41.952226]},"n3543":{"id":"n3543","loc":[-85.627002,41.951972]},"n3544":{"id":"n3544","loc":[-85.626822,41.951838]},"n3545":{"id":"n3545","loc":[-85.626528,41.951807]},"n3546":{"id":"n3546","loc":[-85.625653,41.951852]},"n3547":{"id":"n3547","loc":[-85.625348,41.951834]},"n3548":{"id":"n3548","loc":[-85.625114,41.951767]},"n3549":{"id":"n3549","loc":[-85.620627,41.954682]},"n355":{"id":"n355","loc":[-85.632756,41.943199]},"n3550":{"id":"n3550","loc":[-85.622758,41.951884]},"n3551":{"id":"n3551","loc":[-85.618135,41.954734]},"n3552":{"id":"n3552","loc":[-85.620229,41.95472]},"n3553":{"id":"n3553","loc":[-85.624491,41.955573]},"n3554":{"id":"n3554","loc":[-85.621792,41.958314]},"n3555":{"id":"n3555","loc":[-85.623395,41.960001]},"n3556":{"id":"n3556","loc":[-85.620461,41.956212]},"n3557":{"id":"n3557","loc":[-85.62109,41.956766]},"n3558":{"id":"n3558","loc":[-85.620246,41.956224]},"n3559":{"id":"n3559","loc":[-85.625017,41.956068]},"n356":{"id":"n356","loc":[-85.632855,41.943147]},"n3560":{"id":"n3560","loc":[-85.622795,41.959702]},"n3561":{"id":"n3561","loc":[-85.621573,41.958457]},"n3562":{"id":"n3562","loc":[-85.619631,41.9573]},"n3563":{"id":"n3563","loc":[-85.62095,41.956311]},"n3564":{"id":"n3564","loc":[-85.619694,41.957408]},"n3565":{"id":"n3565","loc":[-85.621079,41.957751]},"n3566":{"id":"n3566","loc":[-85.622426,41.961142]},"n3567":{"id":"n3567","loc":[-85.623251,41.960484]},"n3568":{"id":"n3568","loc":[-85.619084,41.956291]},"n3569":{"id":"n3569","loc":[-85.622227,41.959303]},"n357":{"id":"n357","loc":[-85.632888,41.94315]},"n3570":{"id":"n3570","loc":[-85.620976,41.959104]},"n3571":{"id":"n3571","loc":[-85.621208,41.95653]},"n3572":{"id":"n3572","loc":[-85.623531,41.95951]},"n3573":{"id":"n3573","loc":[-85.623556,41.957935]},"n3574":{"id":"n3574","loc":[-85.623037,41.95746]},"n3575":{"id":"n3575","loc":[-85.621175,41.956427]},"n3576":{"id":"n3576","loc":[-85.622651,41.960109]},"n3577":{"id":"n3577","loc":[-85.621803,41.960747]},"n3578":{"id":"n3578","loc":[-85.620791,41.961874]},"n3579":{"id":"n3579","loc":[-85.625295,41.956786]},"n358":{"id":"n358","loc":[-85.633232,41.943547]},"n3580":{"id":"n3580","loc":[-85.619662,41.956894]},"n3581":{"id":"n3581","loc":[-85.622442,41.958708]},"n3582":{"id":"n3582","loc":[-85.621744,41.955864]},"n3583":{"id":"n3583","loc":[-85.621336,41.959212]},"n3584":{"id":"n3584","loc":[-85.622801,41.957304]},"n3585":{"id":"n3585","loc":[-85.619973,41.957433]},"n3586":{"id":"n3586","loc":[-85.619556,41.955717]},"n3587":{"id":"n3587","loc":[-85.622978,41.958601]},"n3588":{"id":"n3588","loc":[-85.625396,41.956264]},"n3589":{"id":"n3589","loc":[-85.623525,41.958034]},"n359":{"id":"n359","loc":[-85.633302,41.94351]},"n3590":{"id":"n3590","loc":[-85.623299,41.959631]},"n3591":{"id":"n3591","loc":[-85.622678,41.959873]},"n3592":{"id":"n3592","loc":[-85.625553,41.956179]},"n3593":{"id":"n3593","loc":[-85.623557,41.959231]},"n3594":{"id":"n3594","loc":[-85.622843,41.957373]},"n3595":{"id":"n3595","loc":[-85.619378,41.955677]},"n3596":{"id":"n3596","loc":[-85.620092,41.955425]},"n3597":{"id":"n3597","loc":[-85.622666,41.96044]},"n3598":{"id":"n3598","loc":[-85.621996,41.960256]},"n3599":{"id":"n3599","loc":[-85.623273,41.959997]},"n36":{"id":"n36","loc":[-85.637894,41.945551]},"n360":{"id":"n360","loc":[-85.633442,41.943794],"tags":{"highway":"crossing"}},"n3600":{"id":"n3600","loc":[-85.62477,41.95689]},"n3601":{"id":"n3601","loc":[-85.621641,41.955015]},"n3602":{"id":"n3602","loc":[-85.622495,41.960392]},"n3603":{"id":"n3603","loc":[-85.61918,41.955565]},"n3604":{"id":"n3604","loc":[-85.620017,41.955505]},"n3605":{"id":"n3605","loc":[-85.621739,41.956315]},"n3606":{"id":"n3606","loc":[-85.622957,41.959837]},"n3607":{"id":"n3607","loc":[-85.620912,41.960919]},"n3608":{"id":"n3608","loc":[-85.625231,41.956235]},"n3609":{"id":"n3609","loc":[-85.620976,41.961868]},"n361":{"id":"n361","loc":[-85.633381,41.94383]},"n3610":{"id":"n3610","loc":[-85.620956,41.958908]},"n3611":{"id":"n3611","loc":[-85.619035,41.956139]},"n3612":{"id":"n3612","loc":[-85.623643,41.958669]},"n3613":{"id":"n3613","loc":[-85.61949,41.956539]},"n3614":{"id":"n3614","loc":[-85.621927,41.958242]},"n3615":{"id":"n3615","loc":[-85.620826,41.955721]},"n3616":{"id":"n3616","loc":[-85.621202,41.961321]},"n3617":{"id":"n3617","loc":[-85.624877,41.95594]},"n3618":{"id":"n3618","loc":[-85.62065,41.958369]},"n3619":{"id":"n3619","loc":[-85.621524,41.956279]},"n362":{"id":"n362","loc":[-85.632977,41.944053]},"n3620":{"id":"n3620","loc":[-85.624662,41.955932]},"n3621":{"id":"n3621","loc":[-85.623048,41.958509]},"n3622":{"id":"n3622","loc":[-85.62111,41.95754]},"n3623":{"id":"n3623","loc":[-85.621508,41.954847]},"n3624":{"id":"n3624","loc":[-85.620655,41.958601]},"n3625":{"id":"n3625","loc":[-85.62154,41.954971]},"n3626":{"id":"n3626","loc":[-85.621691,41.955521]},"n3627":{"id":"n3627","loc":[-85.62154,41.954739]},"n3628":{"id":"n3628","loc":[-85.621996,41.959913]},"n3629":{"id":"n3629","loc":[-85.622286,41.960699]},"n363":{"id":"n363","loc":[-85.632915,41.943981],"tags":{"crossing":"zebra","highway":"crossing"}},"n3630":{"id":"n3630","loc":[-85.622844,41.9572]},"n3631":{"id":"n3631","loc":[-85.620252,41.955446]},"n3632":{"id":"n3632","loc":[-85.623434,41.957528]},"n3633":{"id":"n3633","loc":[-85.623429,41.956858]},"n3634":{"id":"n3634","loc":[-85.622957,41.957137]},"n3635":{"id":"n3635","loc":[-85.622554,41.959027]},"n3636":{"id":"n3636","loc":[-85.623289,41.958314]},"n3637":{"id":"n3637","loc":[-85.622977,41.960855]},"n3638":{"id":"n3638","loc":[-85.624008,41.956953]},"n3639":{"id":"n3639","loc":[-85.621278,41.960855]},"n364":{"id":"n364","loc":[-85.632724,41.943969],"tags":{"crossing":"zebra","highway":"crossing"}},"n3640":{"id":"n3640","loc":[-85.623128,41.956993]},"n3641":{"id":"n3641","loc":[-85.622452,41.959183]},"n3642":{"id":"n3642","loc":[-85.621095,41.961082]},"n3643":{"id":"n3643","loc":[-85.622011,41.960544]},"n3644":{"id":"n3644","loc":[-85.621637,41.955385]},"n3645":{"id":"n3645","loc":[-85.620999,41.959271]},"n3646":{"id":"n3646","loc":[-85.620044,41.956347]},"n3647":{"id":"n3647","loc":[-85.621936,41.959682]},"n3648":{"id":"n3648","loc":[-85.623761,41.95685]},"n3649":{"id":"n3649","loc":[-85.621239,41.959343]},"n365":{"id":"n365","loc":[-85.632621,41.944034]},"n3650":{"id":"n3650","loc":[-85.621073,41.956012]},"n3651":{"id":"n3651","loc":[-85.621271,41.956184]},"n3652":{"id":"n3652","loc":[-85.623444,41.95778]},"n3653":{"id":"n3653","loc":[-85.62125,41.96186]},"n3654":{"id":"n3654","loc":[-85.62169,41.961059]},"n3655":{"id":"n3655","loc":[-85.620012,41.955637]},"n3656":{"id":"n3656","loc":[-85.621058,41.9573]},"n3657":{"id":"n3657","loc":[-85.621138,41.957663]},"n3658":{"id":"n3658","loc":[-85.620773,41.957895]},"n3659":{"id":"n3659","loc":[-85.62007,41.957157]},"n366":{"id":"n366","loc":[-85.632684,41.944109],"tags":{"crossing":"zebra","highway":"crossing"}},"n3660":{"id":"n3660","loc":[-85.624534,41.955844]},"n3661":{"id":"n3661","loc":[-85.621932,41.960807]},"n3662":{"id":"n3662","loc":[-85.623358,41.958138]},"n3663":{"id":"n3663","loc":[-85.620456,41.955514]},"n3664":{"id":"n3664","loc":[-85.623504,41.957607]},"n3665":{"id":"n3665","loc":[-85.621444,41.960751]},"n3666":{"id":"n3666","loc":[-85.623492,41.960213]},"n3667":{"id":"n3667","loc":[-85.621669,41.954655]},"n3668":{"id":"n3668","loc":[-85.623106,41.958685]},"n3669":{"id":"n3669","loc":[-85.620922,41.957867]},"n367":{"id":"n367","loc":[-85.632738,41.944172]},"n3670":{"id":"n3670","loc":[-85.620092,41.957296]},"n3671":{"id":"n3671","loc":[-85.621669,41.955222]},"n3672":{"id":"n3672","loc":[-85.621614,41.960967]},"n3673":{"id":"n3673","loc":[-85.621691,41.955732]},"n3674":{"id":"n3674","loc":[-85.619207,41.956419]},"n3675":{"id":"n3675","loc":[-85.621116,41.956603]},"n3676":{"id":"n3676","loc":[-85.623311,41.956929]},"n3677":{"id":"n3677","loc":[-85.625671,41.956499]},"n3678":{"id":"n3678","loc":[-85.623525,41.956738]},"n3679":{"id":"n3679","loc":[-85.625381,41.956634]},"n368":{"id":"n368","loc":[-85.63287,41.944135],"tags":{"crossing":"zebra","highway":"crossing"}},"n3680":{"id":"n3680","loc":[-85.620096,41.95677]},"n3681":{"id":"n3681","loc":[-85.623803,41.958745]},"n3682":{"id":"n3682","loc":[-85.623498,41.958457]},"n3683":{"id":"n3683","loc":[-85.624223,41.957009]},"n3684":{"id":"n3684","loc":[-85.620026,41.956946]},"n3685":{"id":"n3685","loc":[-85.623005,41.960124]},"n3686":{"id":"n3686","loc":[-85.619073,41.955832]},"n3687":{"id":"n3687","loc":[-85.621744,41.95501]},"n3688":{"id":"n3688","loc":[-85.620804,41.958781]},"n3689":{"id":"n3689","loc":[-85.619844,41.957448]},"n369":{"id":"n369","loc":[-85.63298,41.944076]},"n3690":{"id":"n3690","loc":[-85.623713,41.958872]},"n3691":{"id":"n3691","loc":[-85.622329,41.960507]},"n3692":{"id":"n3692","loc":[-85.620804,41.956244]},"n3693":{"id":"n3693","loc":[-85.621818,41.955968]},"n3694":{"id":"n3694","loc":[-85.621405,41.958697]},"n3695":{"id":"n3695","loc":[-85.620998,41.960996]},"n3696":{"id":"n3696","loc":[-85.621621,41.960444]},"n3697":{"id":"n3697","loc":[-85.620941,41.961637]},"n3698":{"id":"n3698","loc":[-85.622195,41.958333]},"n3699":{"id":"n3699","loc":[-85.621668,41.961529]},"n37":{"id":"n37","loc":[-85.637611,41.945383]},"n370":{"id":"n370","loc":[-85.633191,41.944471]},"n3700":{"id":"n3700","loc":[-85.621015,41.957049]},"n3701":{"id":"n3701","loc":[-85.619368,41.955521]},"n3702":{"id":"n3702","loc":[-85.651578,41.942534]},"n3703":{"id":"n3703","loc":[-85.651541,41.943847]},"n3704":{"id":"n3704","loc":[-85.651365,41.944817]},"n3705":{"id":"n3705","loc":[-85.651076,41.945985]},"n3706":{"id":"n3706","loc":[-85.650626,41.947213]},"n3707":{"id":"n3707","loc":[-85.649669,41.949161]},"n3708":{"id":"n3708","loc":[-85.641802,41.961801]},"n3709":{"id":"n3709","loc":[-85.623333,41.961987]},"n371":{"id":"n371","loc":[-85.633132,41.94372]},"n3710":{"id":"n3710","loc":[-85.620621,41.965658]},"n3711":{"id":"n3711","loc":[-85.605673,41.965764]},"n3712":{"id":"n3712","loc":[-85.605664,41.962094]},"n3713":{"id":"n3713","loc":[-85.583774,41.962178]},"n3714":{"id":"n3714","loc":[-85.583774,41.961789]},"n3715":{"id":"n3715","loc":[-85.581303,41.961783]},"n3716":{"id":"n3716","loc":[-85.581245,41.958394]},"n3717":{"id":"n3717","loc":[-85.585299,41.955483]},"n3718":{"id":"n3718","loc":[-85.585588,41.955331]},"n3719":{"id":"n3719","loc":[-85.586053,41.955163]},"n372":{"id":"n372","loc":[-85.633011,41.943788]},"n3720":{"id":"n3720","loc":[-85.58632,41.955076]},"n3721":{"id":"n3721","loc":[-85.586478,41.955025]},"n3722":{"id":"n3722","loc":[-85.58692,41.954947]},"n3723":{"id":"n3723","loc":[-85.587345,41.954913]},"n3724":{"id":"n3724","loc":[-85.605592,41.954766]},"n3725":{"id":"n3725","loc":[-85.605303,41.936236]},"n3726":{"id":"n3726","loc":[-85.606941,41.936117]},"n3727":{"id":"n3727","loc":[-85.60876,41.935856]},"n3728":{"id":"n3728","loc":[-85.610092,41.935451]},"n3729":{"id":"n3729","loc":[-85.610681,41.935247]},"n373":{"id":"n373","loc":[-85.632854,41.943632]},"n3730":{"id":"n3730","loc":[-85.611446,41.934955]},"n3731":{"id":"n3731","loc":[-85.612057,41.934696]},"n3732":{"id":"n3732","loc":[-85.613256,41.934084]},"n3733":{"id":"n3733","loc":[-85.613948,41.933682]},"n3734":{"id":"n3734","loc":[-85.614638,41.933212]},"n3735":{"id":"n3735","loc":[-85.619801,41.929305]},"n3736":{"id":"n3736","loc":[-85.619768,41.925548]},"n3737":{"id":"n3737","loc":[-85.625761,41.925597]},"n3738":{"id":"n3738","loc":[-85.6263,41.927323]},"n3739":{"id":"n3739","loc":[-85.633708,41.927402]},"n374":{"id":"n374","loc":[-85.632974,41.943565]},"n3740":{"id":"n3740","loc":[-85.633927,41.929109]},"n3741":{"id":"n3741","loc":[-85.639213,41.929088]},"n3742":{"id":"n3742","loc":[-85.639204,41.925488]},"n3743":{"id":"n3743","loc":[-85.651425,41.925406]},"n3744":{"id":"n3744","loc":[-85.643386,41.941933]},"n3745":{"id":"n3745","loc":[-85.642776,41.941161]},"n3746":{"id":"n3746","loc":[-85.637277,41.948812]},"n3747":{"id":"n3747","loc":[-85.637366,41.94897]},"n3748":{"id":"n3748","loc":[-85.637329,41.94889]},"n3749":{"id":"n3749","loc":[-85.629649,41.952596]},"n375":{"id":"n375","loc":[-85.632741,41.943351]},"n3750":{"id":"n3750","loc":[-85.630291,41.954684]},"n3751":{"id":"n3751","loc":[-85.630284,41.953713]},"n3752":{"id":"n3752","loc":[-85.630269,41.952463]},"n3753":{"id":"n3753","loc":[-85.633933,41.949896]},"n3754":{"id":"n3754","loc":[-85.629339,41.941467]},"n3755":{"id":"n3755","loc":[-85.629857,41.94316]},"n3756":{"id":"n3756","loc":[-85.629987,41.944025]},"n3757":{"id":"n3757","loc":[-85.628538,41.948604]},"n3758":{"id":"n3758","loc":[-85.627415,41.957442]},"n3759":{"id":"n3759","loc":[-85.627019,41.957369]},"n376":{"id":"n376","loc":[-85.63251,41.943481]},"n3760":{"id":"n3760","loc":[-85.62167,41.952179]},"n3761":{"id":"n3761","loc":[-85.62167,41.952138]},"n3762":{"id":"n3762","loc":[-85.621562,41.952139]},"n3763":{"id":"n3763","loc":[-85.621562,41.952058]},"n3764":{"id":"n3764","loc":[-85.621476,41.952043]},"n3765":{"id":"n3765","loc":[-85.621477,41.952132]},"n3766":{"id":"n3766","loc":[-85.621386,41.952132]},"n3767":{"id":"n3767","loc":[-85.621387,41.95214]},"n3768":{"id":"n3768","loc":[-85.621262,41.95214]},"n3769":{"id":"n3769","loc":[-85.621261,41.952038]},"n377":{"id":"n377","loc":[-85.632706,41.943715]},"n3770":{"id":"n3770","loc":[-85.621389,41.952038]},"n3771":{"id":"n3771","loc":[-85.621389,41.952043]},"n3772":{"id":"n3772","loc":[-85.620898,41.952024]},"n3773":{"id":"n3773","loc":[-85.620898,41.952085]},"n3774":{"id":"n3774","loc":[-85.620774,41.952084]},"n3775":{"id":"n3775","loc":[-85.620774,41.952023]},"n3776":{"id":"n3776","loc":[-85.620749,41.952036]},"n3777":{"id":"n3777","loc":[-85.620723,41.952097]},"n3778":{"id":"n3778","loc":[-85.626158,41.958996]},"n3779":{"id":"n3779","loc":[-85.626319,41.958686]},"n378":{"id":"n378","loc":[-85.638683,41.943295]},"n3780":{"id":"n3780","loc":[-85.626119,41.958629]},"n3781":{"id":"n3781","loc":[-85.626064,41.958733]},"n3782":{"id":"n3782","loc":[-85.626155,41.958759]},"n3783":{"id":"n3783","loc":[-85.626048,41.958965]},"n3784":{"id":"n3784","loc":[-85.620648,41.952079]},"n3785":{"id":"n3785","loc":[-85.63826,41.961213]},"n3786":{"id":"n3786","loc":[-85.638003,41.961614]},"n3787":{"id":"n3787","loc":[-85.638817,41.961902]},"n3788":{"id":"n3788","loc":[-85.639073,41.961501]},"n3789":{"id":"n3789","loc":[-85.620674,41.952018]},"n379":{"id":"n379","loc":[-85.638684,41.94323]},"n3790":{"id":"n3790","loc":[-85.62082,41.952106]},"n3791":{"id":"n3791","loc":[-85.620819,41.952143]},"n3792":{"id":"n3792","loc":[-85.620778,41.952143]},"n3793":{"id":"n3793","loc":[-85.620778,41.952106]},"n3794":{"id":"n3794","loc":[-85.620563,41.952276]},"n3795":{"id":"n3795","loc":[-85.620543,41.95238]},"n3796":{"id":"n3796","loc":[-85.620422,41.952367]},"n3797":{"id":"n3797","loc":[-85.620441,41.952263]},"n3798":{"id":"n3798","loc":[-85.620561,41.952266]},"n3799":{"id":"n3799","loc":[-85.620444,41.952254]},"n38":{"id":"n38","loc":[-85.63879,41.943295]},"n380":{"id":"n380","loc":[-85.638627,41.94322]},"n3800":{"id":"n3800","loc":[-85.620773,41.955585]},"n3801":{"id":"n3801","loc":[-85.621265,41.955989]},"n3802":{"id":"n3802","loc":[-85.620692,41.954969]},"n3803":{"id":"n3803","loc":[-85.620691,41.955367]},"n3804":{"id":"n3804","loc":[-85.620458,41.952178]},"n3805":{"id":"n3805","loc":[-85.620575,41.95219]},"n3806":{"id":"n3806","loc":[-85.617609,41.952712]},"n3807":{"id":"n3807","loc":[-85.617533,41.952801],"tags":{"entrance":"yes"}},"n3808":{"id":"n3808","loc":[-85.616816,41.952911]},"n3809":{"id":"n3809","loc":[-85.616797,41.952901]},"n381":{"id":"n381","loc":[-85.638624,41.943294]},"n3810":{"id":"n3810","loc":[-85.616343,41.952694]},"n3811":{"id":"n3811","loc":[-85.616336,41.952729]},"n3812":{"id":"n3812","loc":[-85.616343,41.952772]},"n3813":{"id":"n3813","loc":[-85.628479,41.948649]},"n3814":{"id":"n3814","loc":[-85.628413,41.948679]},"n3815":{"id":"n3815","loc":[-85.628336,41.948694]},"n3816":{"id":"n3816","loc":[-85.62826,41.948694]},"n3817":{"id":"n3817","loc":[-85.628185,41.948679]},"n3818":{"id":"n3818","loc":[-85.628103,41.948649]},"n3819":{"id":"n3819","loc":[-85.627482,41.948395]},"n382":{"id":"n382","loc":[-85.638437,41.943291]},"n3820":{"id":"n3820","loc":[-85.619957,41.951168]},"n3821":{"id":"n3821","loc":[-85.619955,41.952077]},"n3822":{"id":"n3822","loc":[-85.619843,41.952666]},"n3823":{"id":"n3823","loc":[-85.619513,41.95324]},"n3824":{"id":"n3824","loc":[-85.619163,41.953668]},"n3825":{"id":"n3825","loc":[-85.618813,41.953947]},"n3826":{"id":"n3826","loc":[-85.618265,41.954252]},"n3827":{"id":"n3827","loc":[-85.617691,41.954458]},"n3828":{"id":"n3828","loc":[-85.616978,41.95459]},"n3829":{"id":"n3829","loc":[-85.615408,41.954628]},"n383":{"id":"n383","loc":[-85.63844,41.943209]},"n3830":{"id":"n3830","loc":[-85.615374,41.951076]},"n3831":{"id":"n3831","loc":[-85.61932,41.947564]},"n3832":{"id":"n3832","loc":[-85.610553,41.94755]},"n3833":{"id":"n3833","loc":[-85.610572,41.951065]},"n3834":{"id":"n3834","loc":[-85.617548,41.94757]},"n3835":{"id":"n3835","loc":[-85.619842,41.947939]},"n3836":{"id":"n3836","loc":[-85.619874,41.950905]},"n3837":{"id":"n3837","loc":[-85.619695,41.950911]},"n3838":{"id":"n3838","loc":[-85.617591,41.951078]},"n3839":{"id":"n3839","loc":[-85.619551,41.951065]},"n384":{"id":"n384","loc":[-85.632616,41.944021]},"n3840":{"id":"n3840","loc":[-85.626813,41.947337]},"n3841":{"id":"n3841","loc":[-85.616371,41.952814]},"n3842":{"id":"n3842","loc":[-85.617205,41.951308]},"n3843":{"id":"n3843","loc":[-85.616795,41.950953]},"n3844":{"id":"n3844","loc":[-85.617441,41.950889]},"n3845":{"id":"n3845","loc":[-85.619155,41.949377]},"n3846":{"id":"n3846","loc":[-85.618556,41.949377]},"n3847":{"id":"n3847","loc":[-85.618557,41.948372]},"n3848":{"id":"n3848","loc":[-85.619156,41.948372]},"n3849":{"id":"n3849","loc":[-85.61927,41.949796]},"n385":{"id":"n385","loc":[-85.632319,41.944172]},"n3850":{"id":"n3850","loc":[-85.61926,41.948344]},"n3851":{"id":"n3851","loc":[-85.619219,41.948264]},"n3852":{"id":"n3852","loc":[-85.619147,41.948196]},"n3853":{"id":"n3853","loc":[-85.619049,41.948144]},"n3854":{"id":"n3854","loc":[-85.618942,41.948116]},"n3855":{"id":"n3855","loc":[-85.618822,41.948109]},"n3856":{"id":"n3856","loc":[-85.618699,41.94813]},"n3857":{"id":"n3857","loc":[-85.618937,41.951943]},"n3858":{"id":"n3858","loc":[-85.616755,41.952231]},"n3859":{"id":"n3859","loc":[-85.616799,41.95472]},"n386":{"id":"n386","loc":[-85.63221,41.944066]},"n3860":{"id":"n3860","loc":[-85.616458,41.954735]},"n3861":{"id":"n3861","loc":[-85.61763,41.951515]},"n3862":{"id":"n3862","loc":[-85.617735,41.951572]},"n3863":{"id":"n3863","loc":[-85.61929,41.951573]},"n3864":{"id":"n3864","loc":[-85.617134,41.951348]},"n3865":{"id":"n3865","loc":[-85.616598,41.95192]},"n3866":{"id":"n3866","loc":[-85.616572,41.951992]},"n3867":{"id":"n3867","loc":[-85.616583,41.952076]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616916,41.952279]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617088,41.952254]},"n3871":{"id":"n3871","loc":[-85.61892,41.951467]},"n3872":{"id":"n3872","loc":[-85.618035,41.951473]},"n3873":{"id":"n3873","loc":[-85.618036,41.951572]},"n3874":{"id":"n3874","loc":[-85.61892,41.951573]},"n3875":{"id":"n3875","loc":[-85.618919,41.951957]},"n3876":{"id":"n3876","loc":[-85.619457,41.952237]},"n3877":{"id":"n3877","loc":[-85.618178,41.953618]},"n3878":{"id":"n3878","loc":[-85.617658,41.953366]},"n3879":{"id":"n3879","loc":[-85.617987,41.953024]},"n388":{"id":"n388","loc":[-85.632268,41.943621]},"n3880":{"id":"n3880","loc":[-85.618429,41.953248]},"n3881":{"id":"n3881","loc":[-85.618554,41.953119]},"n3882":{"id":"n3882","loc":[-85.618077,41.952868]},"n3883":{"id":"n3883","loc":[-85.618039,41.952886]},"n3884":{"id":"n3884","loc":[-85.619375,41.952169]},"n3885":{"id":"n3885","loc":[-85.618137,41.953538]},"n3886":{"id":"n3886","loc":[-85.61799,41.953555]},"n3887":{"id":"n3887","loc":[-85.617729,41.953423]},"n3888":{"id":"n3888","loc":[-85.618101,41.953029]},"n3889":{"id":"n3889","loc":[-85.618516,41.953119]},"n389":{"id":"n389","loc":[-85.631951,41.943773]},"n3890":{"id":"n3890","loc":[-85.619132,41.952042]},"n3891":{"id":"n3891","loc":[-85.618235,41.952981]},"n3892":{"id":"n3892","loc":[-85.618485,41.952425]},"n3893":{"id":"n3893","loc":[-85.618676,41.952519]},"n3894":{"id":"n3894","loc":[-85.618942,41.952648]},"n3895":{"id":"n3895","loc":[-85.618287,41.953122]},"n3896":{"id":"n3896","loc":[-85.617914,41.953516]},"n3897":{"id":"n3897","loc":[-85.617836,41.953573]},"n3898":{"id":"n3898","loc":[-85.616477,41.95289]},"n3899":{"id":"n3899","loc":[-85.618441,41.953201]},"n39":{"id":"n39","loc":[-85.619931,41.951013]},"n390":{"id":"n390","loc":[-85.631981,41.943654]},"n3900":{"id":"n3900","loc":[-85.617537,41.953335]},"n3901":{"id":"n3901","loc":[-85.617221,41.953166]},"n3902":{"id":"n3902","loc":[-85.617253,41.953135]},"n3903":{"id":"n3903","loc":[-85.617211,41.953114]},"n3904":{"id":"n3904","loc":[-85.617197,41.95313]},"n3905":{"id":"n3905","loc":[-85.616802,41.952925]},"n3906":{"id":"n3906","loc":[-85.616771,41.952928]},"n3907":{"id":"n3907","loc":[-85.616493,41.952785]},"n3908":{"id":"n3908","loc":[-85.616823,41.952426]},"n3909":{"id":"n3909","loc":[-85.617191,41.952616]},"n391":{"id":"n391","loc":[-85.631886,41.943699]},"n3910":{"id":"n3910","loc":[-85.61724,41.952559]},"n3911":{"id":"n3911","loc":[-85.61721,41.952542]},"n3912":{"id":"n3912","loc":[-85.617395,41.952351]},"n3913":{"id":"n3913","loc":[-85.617426,41.952368]},"n3914":{"id":"n3914","loc":[-85.617483,41.952309]},"n3915":{"id":"n3915","loc":[-85.617332,41.952229]},"n3916":{"id":"n3916","loc":[-85.617451,41.952102]},"n3917":{"id":"n3917","loc":[-85.617477,41.952115]},"n3918":{"id":"n3918","loc":[-85.617658,41.951923]},"n3919":{"id":"n3919","loc":[-85.617634,41.95191]},"n392":{"id":"n392","loc":[-85.631807,41.943606]},"n3920":{"id":"n3920","loc":[-85.617747,41.951786]},"n3921":{"id":"n3921","loc":[-85.618268,41.952056]},"n3922":{"id":"n3922","loc":[-85.618211,41.952122]},"n3923":{"id":"n3923","loc":[-85.618386,41.95222]},"n3924":{"id":"n3924","loc":[-85.618098,41.952527]},"n3925":{"id":"n3925","loc":[-85.617916,41.95243]},"n3926":{"id":"n3926","loc":[-85.617854,41.952498]},"n3927":{"id":"n3927","loc":[-85.617769,41.952453]},"n3928":{"id":"n3928","loc":[-85.617476,41.952773]},"n3929":{"id":"n3929","loc":[-85.617876,41.952973]},"n393":{"id":"n393","loc":[-85.631902,41.943561]},"n3930":{"id":"n3930","loc":[-85.617174,41.953638]},"n3931":{"id":"n3931","loc":[-85.618016,41.953578]},"n3932":{"id":"n3932","loc":[-85.618107,41.953628]},"n3933":{"id":"n3933","loc":[-85.618067,41.954268]},"n3934":{"id":"n3934","loc":[-85.617864,41.954263]},"n3935":{"id":"n3935","loc":[-85.61762,41.954205]},"n3936":{"id":"n3936","loc":[-85.617437,41.954103]},"n3937":{"id":"n3937","loc":[-85.617294,41.953978]},"n3938":{"id":"n3938","loc":[-85.617217,41.95384]},"n3939":{"id":"n3939","loc":[-85.616814,41.954327]},"n394":{"id":"n394","loc":[-85.63236,41.943543]},"n3940":{"id":"n3940","loc":[-85.616778,41.95381]},"n3941":{"id":"n3941","loc":[-85.616585,41.953707]},"n3942":{"id":"n3942","loc":[-85.616458,41.954318]},"n3943":{"id":"n3943","loc":[-85.616643,41.954345]},"n3944":{"id":"n3944","loc":[-85.618133,41.951412]},"n3945":{"id":"n3945","loc":[-85.618326,41.951411]},"n3946":{"id":"n3946","loc":[-85.618503,41.95141]},"n3947":{"id":"n3947","loc":[-85.618681,41.951409]},"n3948":{"id":"n3948","loc":[-85.618868,41.951408]},"n3949":{"id":"n3949","loc":[-85.617047,41.95136]},"n395":{"id":"n395","loc":[-85.633839,41.944082]},"n3950":{"id":"n3950","loc":[-85.616494,41.951959]},"n3951":{"id":"n3951","loc":[-85.616497,41.952072]},"n3952":{"id":"n3952","loc":[-85.616565,41.952165]},"n3953":{"id":"n3953","loc":[-85.616663,41.952218]},"n3954":{"id":"n3954","loc":[-85.616733,41.952255]},"n3955":{"id":"n3955","loc":[-85.617238,41.952512],"tags":{"entrance":"yes"}},"n3956":{"id":"n3956","loc":[-85.617043,41.952406]},"n3957":{"id":"n3957","loc":[-85.617691,41.951711]},"n3958":{"id":"n3958","loc":[-85.617773,41.951679]},"n3959":{"id":"n3959","loc":[-85.619085,41.951681]},"n396":{"id":"n396","loc":[-85.63376,41.944097]},"n3960":{"id":"n3960","loc":[-85.617943,41.952895]},"n3961":{"id":"n3961","loc":[-85.618039,41.952938]},"n3962":{"id":"n3962","loc":[-85.61763,41.95336]},"n3963":{"id":"n3963","loc":[-85.617554,41.95344]},"n3964":{"id":"n3964","loc":[-85.617381,41.952366],"tags":{"entrance":"yes"}},"n3965":{"id":"n3965","loc":[-85.617184,41.952254]},"n3966":{"id":"n3966","loc":[-85.617208,41.952496]},"n3967":{"id":"n3967","loc":[-85.617124,41.952581],"tags":{"entrance":"yes"}},"n3968":{"id":"n3968","loc":[-85.618094,41.952735]},"n3969":{"id":"n3969","loc":[-85.617702,41.952525],"tags":{"entrance":"yes"}},"n397":{"id":"n397","loc":[-85.63361,41.943957]},"n3970":{"id":"n3970","loc":[-85.617554,41.952686],"tags":{"entrance":"yes"}},"n3971":{"id":"n3971","loc":[-85.617959,41.952878]},"n3972":{"id":"n3972","loc":[-85.616367,41.952655]},"n3973":{"id":"n3973","loc":[-85.616416,41.952851]},"n3974":{"id":"n3974","loc":[-85.619777,41.951075]},"n3975":{"id":"n3975","loc":[-85.618611,41.94817]},"n3976":{"id":"n3976","loc":[-85.618538,41.948229]},"n3977":{"id":"n3977","loc":[-85.617421,41.947559]},"n3978":{"id":"n3978","loc":[-85.617395,41.951039]},"n3979":{"id":"n3979","loc":[-85.618488,41.94829]},"n398":{"id":"n398","loc":[-85.633309,41.943886]},"n3980":{"id":"n3980","loc":[-85.610238,41.954774]},"n3981":{"id":"n3981","loc":[-85.617449,41.950756]},"n3982":{"id":"n3982","loc":[-85.617288,41.951286]},"n3983":{"id":"n3983","loc":[-85.61745,41.950197]},"n3984":{"id":"n3984","loc":[-85.617436,41.948908]},"n3985":{"id":"n3985","loc":[-85.615915,41.953804]},"n3986":{"id":"n3986","loc":[-85.615953,41.953968]},"n3987":{"id":"n3987","loc":[-85.616031,41.954085]},"n3988":{"id":"n3988","loc":[-85.616135,41.954181]},"n3989":{"id":"n3989","loc":[-85.616273,41.954263]},"n399":{"id":"n399","loc":[-85.633226,41.943931]},"n3990":{"id":"n3990","loc":[-85.618327,41.951083]},"n3991":{"id":"n3991","loc":[-85.618135,41.951084]},"n3992":{"id":"n3992","loc":[-85.618503,41.951082]},"n3993":{"id":"n3993","loc":[-85.618682,41.951081]},"n3994":{"id":"n3994","loc":[-85.618864,41.951082]},"n3995":{"id":"n3995","loc":[-85.616761,41.950101]},"n3996":{"id":"n3996","loc":[-85.617317,41.947558]},"n3997":{"id":"n3997","loc":[-85.617336,41.948883]},"n3998":{"id":"n3998","loc":[-85.616779,41.949295]},"n3999":{"id":"n3999","loc":[-85.616754,41.949349]},"n4":{"id":"n4","loc":[-85.622764,41.950892],"tags":{"highway":"stop"}},"n40":{"id":"n40","loc":[-85.619841,41.951037]},"n400":{"id":"n400","loc":[-85.63326,41.943966]},"n4000":{"id":"n4000","loc":[-85.616761,41.950865]},"n4001":{"id":"n4001","loc":[-85.616883,41.951041]},"n4002":{"id":"n4002","loc":[-85.617004,41.951142]},"n4003":{"id":"n4003","loc":[-85.617062,41.951248]},"n4004":{"id":"n4004","loc":[-85.616809,41.949273]},"n4005":{"id":"n4005","loc":[-85.616755,41.949489]},"n4006":{"id":"n4006","loc":[-85.616759,41.949971]},"n4007":{"id":"n4007","loc":[-85.616757,41.949702]},"n4008":{"id":"n4008","loc":[-85.618456,41.94836]},"n4009":{"id":"n4009","loc":[-85.618447,41.948428]},"n401":{"id":"n401","loc":[-85.63324,41.943976]},"n4010":{"id":"n4010","loc":[-85.618437,41.949322]},"n4011":{"id":"n4011","loc":[-85.618447,41.949418]},"n4012":{"id":"n4012","loc":[-85.618478,41.949491]},"n4013":{"id":"n4013","loc":[-85.618535,41.949559]},"n4014":{"id":"n4014","loc":[-85.618623,41.94962]},"n4015":{"id":"n4015","loc":[-85.618721,41.94966]},"n4016":{"id":"n4016","loc":[-85.618838,41.949674]},"n4017":{"id":"n4017","loc":[-85.618967,41.949667]},"n4018":{"id":"n4018","loc":[-85.619065,41.949632]},"n4019":{"id":"n4019","loc":[-85.61915,41.949578]},"n402":{"id":"n402","loc":[-85.63327,41.944006]},"n4020":{"id":"n4020","loc":[-85.619216,41.949507]},"n4021":{"id":"n4021","loc":[-85.61927,41.949399]},"n4022":{"id":"n4022","loc":[-85.619074,41.947639]},"n4023":{"id":"n4023","loc":[-85.619073,41.947793]},"n4024":{"id":"n4024","loc":[-85.618912,41.947793]},"n4025":{"id":"n4025","loc":[-85.618911,41.947947]},"n4026":{"id":"n4026","loc":[-85.618752,41.947947]},"n4027":{"id":"n4027","loc":[-85.618754,41.947637]},"n4028":{"id":"n4028","loc":[-85.617896,41.947599]},"n4029":{"id":"n4029","loc":[-85.617898,41.947811]},"n403":{"id":"n403","loc":[-85.633278,41.944002]},"n4030":{"id":"n4030","loc":[-85.617717,41.947812]},"n4031":{"id":"n4031","loc":[-85.617715,41.9476]},"n4032":{"id":"n4032","loc":[-85.619003,41.949828]},"n4033":{"id":"n4033","loc":[-85.619003,41.949882]},"n4034":{"id":"n4034","loc":[-85.618926,41.949882]},"n4035":{"id":"n4035","loc":[-85.618926,41.949828]},"n4036":{"id":"n4036","loc":[-85.618861,41.949809]},"n4037":{"id":"n4037","loc":[-85.618861,41.949898]},"n4038":{"id":"n4038","loc":[-85.618688,41.949898]},"n4039":{"id":"n4039","loc":[-85.618687,41.94981]},"n404":{"id":"n404","loc":[-85.63331,41.944036]},"n4040":{"id":"n4040","loc":[-85.618349,41.949473]},"n4041":{"id":"n4041","loc":[-85.618287,41.949473]},"n4042":{"id":"n4042","loc":[-85.618287,41.94942]},"n4043":{"id":"n4043","loc":[-85.618348,41.949419]},"n4044":{"id":"n4044","loc":[-85.62316,41.951604]},"n4045":{"id":"n4045","loc":[-85.623026,41.951605]},"n4046":{"id":"n4046","loc":[-85.623023,41.951466]},"n4047":{"id":"n4047","loc":[-85.623134,41.951465]},"n4048":{"id":"n4048","loc":[-85.623136,41.951539]},"n4049":{"id":"n4049","loc":[-85.623159,41.951539]},"n405":{"id":"n405","loc":[-85.633348,41.944015]},"n4050":{"id":"n4050","loc":[-85.623025,41.95155]},"n4051":{"id":"n4051","loc":[-85.622955,41.951551]},"n4052":{"id":"n4052","loc":[-85.622953,41.951507]},"n4053":{"id":"n4053","loc":[-85.623024,41.951506]},"n4054":{"id":"n4054","loc":[-85.623318,41.951242]},"n4055":{"id":"n4055","loc":[-85.623175,41.951241]},"n4056":{"id":"n4056","loc":[-85.623176,41.951153]},"n4057":{"id":"n4057","loc":[-85.623319,41.951154]},"n4058":{"id":"n4058","loc":[-85.623077,41.951191]},"n4059":{"id":"n4059","loc":[-85.622973,41.951191]},"n406":{"id":"n406","loc":[-85.63338,41.944048]},"n4060":{"id":"n4060","loc":[-85.622972,41.951349]},"n4061":{"id":"n4061","loc":[-85.623059,41.95135]},"n4062":{"id":"n4062","loc":[-85.62306,41.951301]},"n4063":{"id":"n4063","loc":[-85.623077,41.951301]},"n4064":{"id":"n4064","loc":[-85.623117,41.951405]},"n4065":{"id":"n4065","loc":[-85.62312,41.951087]},"n4066":{"id":"n4066","loc":[-85.623118,41.951274]},"n4067":{"id":"n4067","loc":[-85.62328,41.951275]},"n4068":{"id":"n4068","loc":[-85.62328,41.951242]},"n4069":{"id":"n4069","loc":[-85.623179,41.951392]},"n407":{"id":"n407","loc":[-85.633431,41.94402]},"n4070":{"id":"n4070","loc":[-85.623141,41.951392]},"n4071":{"id":"n4071","loc":[-85.623142,41.95136]},"n4072":{"id":"n4072","loc":[-85.623179,41.951361]},"n4073":{"id":"n4073","loc":[-85.622565,41.951639]},"n4074":{"id":"n4074","loc":[-85.622565,41.951741]},"n4075":{"id":"n4075","loc":[-85.622463,41.95174]},"n4076":{"id":"n4076","loc":[-85.622463,41.95173]},"n4077":{"id":"n4077","loc":[-85.622442,41.95173]},"n4078":{"id":"n4078","loc":[-85.622442,41.951742]},"n4079":{"id":"n4079","loc":[-85.622361,41.951742]},"n408":{"id":"n408","loc":[-85.633425,41.944014]},"n4080":{"id":"n4080","loc":[-85.622362,41.951667]},"n4081":{"id":"n4081","loc":[-85.622441,41.951667]},"n4082":{"id":"n4082","loc":[-85.622441,41.951688]},"n4083":{"id":"n4083","loc":[-85.622461,41.951688]},"n4084":{"id":"n4084","loc":[-85.622461,41.951638]},"n4085":{"id":"n4085","loc":[-85.62255,41.951587]},"n4086":{"id":"n4086","loc":[-85.622449,41.95159]},"n4087":{"id":"n4087","loc":[-85.622441,41.951448]},"n4088":{"id":"n4088","loc":[-85.62253,41.951445]},"n4089":{"id":"n4089","loc":[-85.622532,41.951486]},"n409":{"id":"n409","loc":[-85.633457,41.943997]},"n4090":{"id":"n4090","loc":[-85.622555,41.951485]},"n4091":{"id":"n4091","loc":[-85.622558,41.951531]},"n4092":{"id":"n4092","loc":[-85.622547,41.951531]},"n4093":{"id":"n4093","loc":[-85.622451,41.95159]},"n4094":{"id":"n4094","loc":[-85.622452,41.95161]},"n4095":{"id":"n4095","loc":[-85.622106,41.951617]},"n4096":{"id":"n4096","loc":[-85.622133,41.951443]},"n4097":{"id":"n4097","loc":[-85.622552,41.951379]},"n4098":{"id":"n4098","loc":[-85.622443,41.95138]},"n4099":{"id":"n4099","loc":[-85.622441,41.951281]},"n41":{"id":"n41","loc":[-85.636233,41.942764]},"n410":{"id":"n410","loc":[-85.633429,41.943969]},"n4100":{"id":"n4100","loc":[-85.62255,41.95128]},"n4101":{"id":"n4101","loc":[-85.622541,41.951437]},"n4102":{"id":"n4102","loc":[-85.622441,41.951438]},"n4103":{"id":"n4103","loc":[-85.621561,41.951444]},"n4104":{"id":"n4104","loc":[-85.622302,41.951479]},"n4105":{"id":"n4105","loc":[-85.6223,41.95152]},"n4106":{"id":"n4106","loc":[-85.622169,41.951517]},"n4107":{"id":"n4107","loc":[-85.622171,41.951476]},"n4108":{"id":"n4108","loc":[-85.622543,41.951228]},"n4109":{"id":"n4109","loc":[-85.622433,41.951228]},"n411":{"id":"n411","loc":[-85.633442,41.943962]},"n4110":{"id":"n4110","loc":[-85.622433,41.951133]},"n4111":{"id":"n4111","loc":[-85.622543,41.951133]},"n4112":{"id":"n4112","loc":[-85.622356,41.951256]},"n4113":{"id":"n4113","loc":[-85.622293,41.951256]},"n4114":{"id":"n4114","loc":[-85.622292,41.9512]},"n4115":{"id":"n4115","loc":[-85.622313,41.9512]},"n4116":{"id":"n4116","loc":[-85.622312,41.951173]},"n4117":{"id":"n4117","loc":[-85.622364,41.951173]},"n4118":{"id":"n4118","loc":[-85.622365,41.951231]},"n4119":{"id":"n4119","loc":[-85.622355,41.951231]},"n412":{"id":"n412","loc":[-85.633411,41.943932]},"n4120":{"id":"n4120","loc":[-85.62197,41.951155]},"n4121":{"id":"n4121","loc":[-85.62197,41.951213]},"n4122":{"id":"n4122","loc":[-85.621848,41.951213]},"n4123":{"id":"n4123","loc":[-85.621848,41.951155]},"n4124":{"id":"n4124","loc":[-85.622193,41.951268]},"n4125":{"id":"n4125","loc":[-85.622194,41.951305]},"n4126":{"id":"n4126","loc":[-85.622121,41.951306]},"n4127":{"id":"n4127","loc":[-85.622121,41.951322]},"n4128":{"id":"n4128","loc":[-85.621984,41.951324]},"n4129":{"id":"n4129","loc":[-85.621983,41.951271]},"n413":{"id":"n413","loc":[-85.633421,41.943926]},"n4130":{"id":"n4130","loc":[-85.622171,41.9514]},"n4131":{"id":"n4131","loc":[-85.622148,41.951382]},"n4132":{"id":"n4132","loc":[-85.6221,41.951414]},"n4133":{"id":"n4133","loc":[-85.622122,41.951433]},"n4134":{"id":"n4134","loc":[-85.621782,41.951148]},"n4135":{"id":"n4135","loc":[-85.621783,41.951219]},"n4136":{"id":"n4136","loc":[-85.62164,41.951221]},"n4137":{"id":"n4137","loc":[-85.62164,41.951236]},"n4138":{"id":"n4138","loc":[-85.621556,41.951237]},"n4139":{"id":"n4139","loc":[-85.621555,41.95117]},"n414":{"id":"n414","loc":[-85.633376,41.94388]},"n4140":{"id":"n4140","loc":[-85.621644,41.951169]},"n4141":{"id":"n4141","loc":[-85.621643,41.951139]},"n4142":{"id":"n4142","loc":[-85.621719,41.951138]},"n4143":{"id":"n4143","loc":[-85.621719,41.951148]},"n4144":{"id":"n4144","loc":[-85.621409,41.951322]},"n4145":{"id":"n4145","loc":[-85.621338,41.951322]},"n4146":{"id":"n4146","loc":[-85.621336,41.95115]},"n4147":{"id":"n4147","loc":[-85.621521,41.951149]},"n4148":{"id":"n4148","loc":[-85.621522,41.951228]},"n4149":{"id":"n4149","loc":[-85.621408,41.951228]},"n415":{"id":"n415","loc":[-85.633348,41.943895]},"n4150":{"id":"n4150","loc":[-85.621284,41.951219]},"n4151":{"id":"n4151","loc":[-85.621153,41.951219]},"n4152":{"id":"n4152","loc":[-85.621152,41.951152]},"n4153":{"id":"n4153","loc":[-85.621283,41.951152]},"n4154":{"id":"n4154","loc":[-85.621159,41.951241]},"n4155":{"id":"n4155","loc":[-85.62116,41.951301]},"n4156":{"id":"n4156","loc":[-85.621088,41.951302]},"n4157":{"id":"n4157","loc":[-85.621088,41.951241]},"n4158":{"id":"n4158","loc":[-85.621049,41.951158]},"n4159":{"id":"n4159","loc":[-85.62105,41.951229]},"n416":{"id":"n416","loc":[-85.633341,41.943888]},"n4160":{"id":"n4160","loc":[-85.620976,41.951229]},"n4161":{"id":"n4161","loc":[-85.620977,41.951295]},"n4162":{"id":"n4162","loc":[-85.620887,41.951296]},"n4163":{"id":"n4163","loc":[-85.620886,41.951229]},"n4164":{"id":"n4164","loc":[-85.620862,41.951229]},"n4165":{"id":"n4165","loc":[-85.620861,41.951159]},"n4166":{"id":"n4166","loc":[-85.620626,41.951133]},"n4167":{"id":"n4167","loc":[-85.620626,41.951205]},"n4168":{"id":"n4168","loc":[-85.620412,41.951206]},"n4169":{"id":"n4169","loc":[-85.620411,41.951134]},"n417":{"id":"n417","loc":[-85.633321,41.943898]},"n4170":{"id":"n4170","loc":[-85.621775,41.951443]},"n4171":{"id":"n4171","loc":[-85.621777,41.951264]},"n4172":{"id":"n4172","loc":[-85.621565,41.951654]},"n4173":{"id":"n4173","loc":[-85.621331,41.951439]},"n4174":{"id":"n4174","loc":[-85.621031,41.951443]},"n4175":{"id":"n4175","loc":[-85.621836,41.951724]},"n4176":{"id":"n4176","loc":[-85.621834,41.951621]},"n4177":{"id":"n4177","loc":[-85.62197,41.951619]},"n4178":{"id":"n4178","loc":[-85.621972,41.951722]},"n4179":{"id":"n4179","loc":[-85.621772,41.951638]},"n418":{"id":"n418","loc":[-85.633547,41.943896]},"n4180":{"id":"n4180","loc":[-85.621772,41.951715]},"n4181":{"id":"n4181","loc":[-85.621699,41.951716]},"n4182":{"id":"n4182","loc":[-85.6217,41.951722]},"n4183":{"id":"n4183","loc":[-85.621641,41.951722]},"n4184":{"id":"n4184","loc":[-85.62164,41.951639]},"n4185":{"id":"n4185","loc":[-85.621505,41.951655]},"n4186":{"id":"n4186","loc":[-85.621505,41.951729]},"n4187":{"id":"n4187","loc":[-85.621389,41.951729]},"n4188":{"id":"n4188","loc":[-85.62139,41.951654]},"n4189":{"id":"n4189","loc":[-85.621105,41.951635]},"n419":{"id":"n419","loc":[-85.633467,41.944075]},"n4190":{"id":"n4190","loc":[-85.621104,41.951576]},"n4191":{"id":"n4191","loc":[-85.621168,41.951576]},"n4192":{"id":"n4192","loc":[-85.621168,41.951595]},"n4193":{"id":"n4193","loc":[-85.621261,41.951595]},"n4194":{"id":"n4194","loc":[-85.621261,41.951646]},"n4195":{"id":"n4195","loc":[-85.621294,41.951646]},"n4196":{"id":"n4196","loc":[-85.621294,41.951732]},"n4197":{"id":"n4197","loc":[-85.621251,41.951732]},"n4198":{"id":"n4198","loc":[-85.621251,41.95174]},"n4199":{"id":"n4199","loc":[-85.621175,41.951741]},"n42":{"id":"n42","loc":[-85.635996,41.942727]},"n420":{"id":"n420","loc":[-85.633578,41.944055]},"n4200":{"id":"n4200","loc":[-85.621175,41.951651]},"n4201":{"id":"n4201","loc":[-85.621189,41.951651]},"n4202":{"id":"n4202","loc":[-85.621189,41.951635]},"n4203":{"id":"n4203","loc":[-85.620554,41.951641]},"n4204":{"id":"n4204","loc":[-85.620555,41.951742]},"n4205":{"id":"n4205","loc":[-85.620719,41.951742]},"n4206":{"id":"n4206","loc":[-85.620719,41.951731]},"n4207":{"id":"n4207","loc":[-85.620803,41.95173]},"n4208":{"id":"n4208","loc":[-85.620803,41.951603]},"n4209":{"id":"n4209","loc":[-85.62072,41.951603]},"n421":{"id":"n421","loc":[-85.633462,41.944125]},"n4210":{"id":"n4210","loc":[-85.620721,41.951641]},"n4211":{"id":"n4211","loc":[-85.620269,41.953053]},"n4212":{"id":"n4212","loc":[-85.620229,41.953051]},"n4213":{"id":"n4213","loc":[-85.620231,41.953013]},"n4214":{"id":"n4214","loc":[-85.620271,41.953015]},"n4215":{"id":"n4215","loc":[-85.620215,41.953133]},"n4216":{"id":"n4216","loc":[-85.62013,41.953134]},"n4217":{"id":"n4217","loc":[-85.620129,41.953083]},"n4218":{"id":"n4218","loc":[-85.620214,41.953082]},"n4219":{"id":"n4219","loc":[-85.62016,41.953272]},"n422":{"id":"n422","loc":[-85.633372,41.944061]},"n4220":{"id":"n4220","loc":[-85.620046,41.953273]},"n4221":{"id":"n4221","loc":[-85.620045,41.953171]},"n4222":{"id":"n4222","loc":[-85.620088,41.953171]},"n4223":{"id":"n4223","loc":[-85.620087,41.953162]},"n4224":{"id":"n4224","loc":[-85.620121,41.953162]},"n4225":{"id":"n4225","loc":[-85.620121,41.953173]},"n4226":{"id":"n4226","loc":[-85.620157,41.953173]},"n4227":{"id":"n4227","loc":[-85.620158,41.953196]},"n4228":{"id":"n4228","loc":[-85.620189,41.953196]},"n4229":{"id":"n4229","loc":[-85.620189,41.953246]},"n423":{"id":"n423","loc":[-85.633509,41.943981]},"n4230":{"id":"n4230","loc":[-85.62016,41.953246]},"n4231":{"id":"n4231","loc":[-85.6195,41.954012]},"n4232":{"id":"n4232","loc":[-85.619438,41.954057]},"n4233":{"id":"n4233","loc":[-85.619418,41.954043]},"n4234":{"id":"n4234","loc":[-85.619381,41.954069]},"n4235":{"id":"n4235","loc":[-85.619399,41.954083]},"n4236":{"id":"n4236","loc":[-85.619339,41.954126]},"n4237":{"id":"n4237","loc":[-85.619584,41.954313]},"n4238":{"id":"n4238","loc":[-85.619743,41.954198]},"n4239":{"id":"n4239","loc":[-85.619453,41.954727]},"n424":{"id":"n424","loc":[-85.635421,41.945367]},"n4240":{"id":"n4240","loc":[-85.619503,41.954581]},"n4241":{"id":"n4241","loc":[-85.619597,41.954472]},"n4242":{"id":"n4242","loc":[-85.619862,41.95419]},"n4243":{"id":"n4243","loc":[-85.619506,41.953907]},"n4244":{"id":"n4244","loc":[-85.619261,41.9541]},"n4245":{"id":"n4245","loc":[-85.619246,41.954139]},"n4246":{"id":"n4246","loc":[-85.619244,41.9542]},"n4247":{"id":"n4247","loc":[-85.619259,41.954243]},"n4248":{"id":"n4248","loc":[-85.619285,41.954274]},"n4249":{"id":"n4249","loc":[-85.619123,41.954381]},"n425":{"id":"n425","loc":[-85.634425,41.943552]},"n4250":{"id":"n4250","loc":[-85.619641,41.954607]},"n4251":{"id":"n4251","loc":[-85.619383,41.954615]},"n4252":{"id":"n4252","loc":[-85.61896,41.954391]},"n4253":{"id":"n4253","loc":[-85.619211,41.954178]},"n4254":{"id":"n4254","loc":[-85.619115,41.954102]},"n4255":{"id":"n4255","loc":[-85.619519,41.953821]},"n4256":{"id":"n4256","loc":[-85.619956,41.954156]},"n4257":{"id":"n4257","loc":[-85.619851,41.954266]},"n4258":{"id":"n4258","loc":[-85.619779,41.95436]},"n4259":{"id":"n4259","loc":[-85.620525,41.954364]},"n426":{"id":"n426","loc":[-85.634248,41.943654]},"n4260":{"id":"n4260","loc":[-85.620398,41.954365]},"n4261":{"id":"n4261","loc":[-85.620398,41.954324]},"n4262":{"id":"n4262","loc":[-85.620525,41.954323]},"n4263":{"id":"n4263","loc":[-85.620359,41.954588]},"n4264":{"id":"n4264","loc":[-85.620321,41.954588]},"n4265":{"id":"n4265","loc":[-85.620321,41.954599]},"n4266":{"id":"n4266","loc":[-85.620296,41.954599]},"n4267":{"id":"n4267","loc":[-85.620296,41.954587]},"n4268":{"id":"n4268","loc":[-85.620262,41.954588]},"n4269":{"id":"n4269","loc":[-85.620261,41.954516]},"n427":{"id":"n427","loc":[-85.634177,41.943585]},"n4270":{"id":"n4270","loc":[-85.620282,41.954516]},"n4271":{"id":"n4271","loc":[-85.620282,41.954373]},"n4272":{"id":"n4272","loc":[-85.620378,41.954373]},"n4273":{"id":"n4273","loc":[-85.620379,41.954486]},"n4274":{"id":"n4274","loc":[-85.620348,41.954486]},"n4275":{"id":"n4275","loc":[-85.620348,41.954537]},"n4276":{"id":"n4276","loc":[-85.620359,41.954537]},"n4277":{"id":"n4277","loc":[-85.620463,41.95521]},"n4278":{"id":"n4278","loc":[-85.620409,41.955273]},"n4279":{"id":"n4279","loc":[-85.620205,41.955177]},"n428":{"id":"n428","loc":[-85.634354,41.943484]},"n4280":{"id":"n4280","loc":[-85.620288,41.955079]},"n4281":{"id":"n4281","loc":[-85.620379,41.955121]},"n4282":{"id":"n4282","loc":[-85.620349,41.955157]},"n4283":{"id":"n4283","loc":[-85.620083,41.955101]},"n4284":{"id":"n4284","loc":[-85.620083,41.954986]},"n4285":{"id":"n4285","loc":[-85.620016,41.954986]},"n4286":{"id":"n4286","loc":[-85.620016,41.954999]},"n4287":{"id":"n4287","loc":[-85.619941,41.954999]},"n4288":{"id":"n4288","loc":[-85.619941,41.954988]},"n4289":{"id":"n4289","loc":[-85.619815,41.954988]},"n429":{"id":"n429","loc":[-85.638577,41.943212]},"n4290":{"id":"n4290","loc":[-85.619815,41.955075]},"n4291":{"id":"n4291","loc":[-85.619948,41.955075]},"n4292":{"id":"n4292","loc":[-85.619948,41.955082]},"n4293":{"id":"n4293","loc":[-85.620004,41.955082]},"n4294":{"id":"n4294","loc":[-85.620004,41.955101]},"n4295":{"id":"n4295","loc":[-85.619293,41.955127]},"n4296":{"id":"n4296","loc":[-85.619208,41.955124]},"n4297":{"id":"n4297","loc":[-85.619212,41.955061]},"n4298":{"id":"n4298","loc":[-85.619297,41.955064]},"n4299":{"id":"n4299","loc":[-85.619068,41.954936]},"n43":{"id":"n43","loc":[-85.637047,41.943054]},"n430":{"id":"n430","loc":[-85.638576,41.943219]},"n4300":{"id":"n4300","loc":[-85.619003,41.954936]},"n4301":{"id":"n4301","loc":[-85.619004,41.955003]},"n4302":{"id":"n4302","loc":[-85.618994,41.955003]},"n4303":{"id":"n4303","loc":[-85.618994,41.955016]},"n4304":{"id":"n4304","loc":[-85.618973,41.955016]},"n4305":{"id":"n4305","loc":[-85.618973,41.955071]},"n4306":{"id":"n4306","loc":[-85.619061,41.955071]},"n4307":{"id":"n4307","loc":[-85.61906,41.955024]},"n4308":{"id":"n4308","loc":[-85.619105,41.955024]},"n4309":{"id":"n4309","loc":[-85.619105,41.954956]},"n431":{"id":"n431","loc":[-85.638653,41.943078]},"n4310":{"id":"n4310","loc":[-85.619068,41.954956]},"n4311":{"id":"n4311","loc":[-85.618294,41.954596]},"n4312":{"id":"n4312","loc":[-85.618235,41.954602]},"n4313":{"id":"n4313","loc":[-85.618222,41.954535]},"n4314":{"id":"n4314","loc":[-85.618281,41.954529]},"n4315":{"id":"n4315","loc":[-85.618593,41.954556]},"n4316":{"id":"n4316","loc":[-85.618551,41.954565]},"n4317":{"id":"n4317","loc":[-85.618545,41.954552]},"n4318":{"id":"n4318","loc":[-85.618493,41.954563]},"n4319":{"id":"n4319","loc":[-85.618449,41.954455]},"n432":{"id":"n432","loc":[-85.638654,41.943148]},"n4320":{"id":"n4320","loc":[-85.618544,41.954434]},"n4321":{"id":"n4321","loc":[-85.622545,41.950775]},"n4322":{"id":"n4322","loc":[-85.622546,41.950843]},"n4323":{"id":"n4323","loc":[-85.622503,41.950844]},"n4324":{"id":"n4324","loc":[-85.622503,41.950853]},"n4325":{"id":"n4325","loc":[-85.622479,41.950853]},"n4326":{"id":"n4326","loc":[-85.622478,41.950843]},"n4327":{"id":"n4327","loc":[-85.622425,41.950843]},"n4328":{"id":"n4328","loc":[-85.622425,41.950808]},"n4329":{"id":"n4329","loc":[-85.622366,41.950809]},"n433":{"id":"n433","loc":[-85.638387,41.943151]},"n4330":{"id":"n4330","loc":[-85.622364,41.950673]},"n4331":{"id":"n4331","loc":[-85.622448,41.950673]},"n4332":{"id":"n4332","loc":[-85.622449,41.950732]},"n4333":{"id":"n4333","loc":[-85.622479,41.950731]},"n4334":{"id":"n4334","loc":[-85.622479,41.950775]},"n4335":{"id":"n4335","loc":[-85.621909,41.950641]},"n4336":{"id":"n4336","loc":[-85.621864,41.950641]},"n4337":{"id":"n4337","loc":[-85.621865,41.950567]},"n4338":{"id":"n4338","loc":[-85.62191,41.950567]},"n4339":{"id":"n4339","loc":[-85.621787,41.950829]},"n434":{"id":"n434","loc":[-85.638386,41.94308]},"n4340":{"id":"n4340","loc":[-85.621786,41.950775]},"n4341":{"id":"n4341","loc":[-85.621588,41.950776]},"n4342":{"id":"n4342","loc":[-85.621589,41.950848]},"n4343":{"id":"n4343","loc":[-85.621737,41.950847]},"n4344":{"id":"n4344","loc":[-85.621737,41.950829]},"n4345":{"id":"n4345","loc":[-85.621509,41.950846]},"n4346":{"id":"n4346","loc":[-85.621399,41.950846]},"n4347":{"id":"n4347","loc":[-85.621398,41.95073]},"n4348":{"id":"n4348","loc":[-85.621509,41.95073]},"n4349":{"id":"n4349","loc":[-85.621217,41.950841]},"n435":{"id":"n435","loc":[-85.634427,41.943533]},"n4350":{"id":"n4350","loc":[-85.6211,41.95084]},"n4351":{"id":"n4351","loc":[-85.6211,41.950777]},"n4352":{"id":"n4352","loc":[-85.621218,41.950778]},"n4353":{"id":"n4353","loc":[-85.621055,41.950764]},"n4354":{"id":"n4354","loc":[-85.621054,41.950826]},"n4355":{"id":"n4355","loc":[-85.620988,41.950826]},"n4356":{"id":"n4356","loc":[-85.620988,41.950843]},"n4357":{"id":"n4357","loc":[-85.620842,41.950843]},"n4358":{"id":"n4358","loc":[-85.620842,41.950764]},"n4359":{"id":"n4359","loc":[-85.620825,41.950922]},"n436":{"id":"n436","loc":[-85.63428,41.943229]},"n4360":{"id":"n4360","loc":[-85.620824,41.950553]},"n4361":{"id":"n4361","loc":[-85.620543,41.950771]},"n4362":{"id":"n4362","loc":[-85.620431,41.950772]},"n4363":{"id":"n4363","loc":[-85.62043,41.950585]},"n4364":{"id":"n4364","loc":[-85.620542,41.950585]},"n4365":{"id":"n4365","loc":[-85.62068,41.950505]},"n4366":{"id":"n4366","loc":[-85.620681,41.950552]},"n4367":{"id":"n4367","loc":[-85.620589,41.950553]},"n4368":{"id":"n4368","loc":[-85.620588,41.950506]},"n4369":{"id":"n4369","loc":[-85.620539,41.950407]},"n437":{"id":"n437","loc":[-85.634499,41.943461]},"n4370":{"id":"n4370","loc":[-85.62054,41.950504]},"n4371":{"id":"n4371","loc":[-85.620416,41.950504]},"n4372":{"id":"n4372","loc":[-85.620416,41.950408]},"n4373":{"id":"n4373","loc":[-85.620742,41.95038]},"n4374":{"id":"n4374","loc":[-85.620527,41.95038]},"n4375":{"id":"n4375","loc":[-85.620528,41.950408]},"n4376":{"id":"n4376","loc":[-85.622449,41.950373]},"n4377":{"id":"n4377","loc":[-85.622452,41.950397]},"n4378":{"id":"n4378","loc":[-85.622336,41.950404]},"n4379":{"id":"n4379","loc":[-85.622333,41.950379]},"n438":{"id":"n438","loc":[-85.634514,41.943486]},"n4380":{"id":"n4380","loc":[-85.622263,41.950324]},"n4381":{"id":"n4381","loc":[-85.622261,41.950256]},"n4382":{"id":"n4382","loc":[-85.62236,41.950254]},"n4383":{"id":"n4383","loc":[-85.62236,41.95027]},"n4384":{"id":"n4384","loc":[-85.622402,41.950281]},"n4385":{"id":"n4385","loc":[-85.622403,41.9503]},"n4386":{"id":"n4386","loc":[-85.622439,41.950299]},"n4387":{"id":"n4387","loc":[-85.62244,41.950334]},"n4388":{"id":"n4388","loc":[-85.622414,41.950335]},"n4389":{"id":"n4389","loc":[-85.622414,41.95036]},"n439":{"id":"n439","loc":[-85.63452,41.943511]},"n4390":{"id":"n4390","loc":[-85.62231,41.950362]},"n4391":{"id":"n4391","loc":[-85.622309,41.950323]},"n4392":{"id":"n4392","loc":[-85.622015,41.950539]},"n4393":{"id":"n4393","loc":[-85.621909,41.95054]},"n4394":{"id":"n4394","loc":[-85.621909,41.950472]},"n4395":{"id":"n4395","loc":[-85.622015,41.950471]},"n4396":{"id":"n4396","loc":[-85.62199,41.950439]},"n4397":{"id":"n4397","loc":[-85.621956,41.95044]},"n4398":{"id":"n4398","loc":[-85.621955,41.950405]},"n4399":{"id":"n4399","loc":[-85.621988,41.950404]},"n44":{"id":"n44","loc":[-85.636799,41.943055]},"n440":{"id":"n440","loc":[-85.63451,41.943534]},"n4400":{"id":"n4400","loc":[-85.621668,41.950418]},"n4401":{"id":"n4401","loc":[-85.621667,41.950343]},"n4402":{"id":"n4402","loc":[-85.621745,41.950342]},"n4403":{"id":"n4403","loc":[-85.621744,41.950306]},"n4404":{"id":"n4404","loc":[-85.621764,41.950306]},"n4405":{"id":"n4405","loc":[-85.621763,41.950254]},"n4406":{"id":"n4406","loc":[-85.621861,41.950253]},"n4407":{"id":"n4407","loc":[-85.621861,41.950274]},"n4408":{"id":"n4408","loc":[-85.621896,41.950273]},"n4409":{"id":"n4409","loc":[-85.621898,41.950389]},"n441":{"id":"n441","loc":[-85.634483,41.943556]},"n4410":{"id":"n4410","loc":[-85.621843,41.95039]},"n4411":{"id":"n4411","loc":[-85.621843,41.950425]},"n4412":{"id":"n4412","loc":[-85.621789,41.950425]},"n4413":{"id":"n4413","loc":[-85.621789,41.950386]},"n4414":{"id":"n4414","loc":[-85.621752,41.950387]},"n4415":{"id":"n4415","loc":[-85.621753,41.950417]},"n4416":{"id":"n4416","loc":[-85.621556,41.950562]},"n4417":{"id":"n4417","loc":[-85.621552,41.950217]},"n4418":{"id":"n4418","loc":[-85.621788,41.950562]},"n4419":{"id":"n4419","loc":[-85.621155,41.950562]},"n442":{"id":"n442","loc":[-85.63419,41.943713]},"n4420":{"id":"n4420","loc":[-85.622473,41.950551]},"n4421":{"id":"n4421","loc":[-85.622043,41.950551]},"n4422":{"id":"n4422","loc":[-85.62142,41.950454]},"n4423":{"id":"n4423","loc":[-85.621315,41.950455]},"n4424":{"id":"n4424","loc":[-85.621313,41.950311]},"n4425":{"id":"n4425","loc":[-85.621388,41.950311]},"n4426":{"id":"n4426","loc":[-85.621387,41.950261]},"n4427":{"id":"n4427","loc":[-85.621468,41.95026]},"n4428":{"id":"n4428","loc":[-85.621468,41.950271]},"n4429":{"id":"n4429","loc":[-85.621503,41.95027]},"n443":{"id":"n443","loc":[-85.634462,41.943294]},"n4430":{"id":"n4430","loc":[-85.621505,41.950353]},"n4431":{"id":"n4431","loc":[-85.621483,41.950354]},"n4432":{"id":"n4432","loc":[-85.621483,41.950392]},"n4433":{"id":"n4433","loc":[-85.621419,41.950393]},"n4434":{"id":"n4434","loc":[-85.621213,41.95039]},"n4435":{"id":"n4435","loc":[-85.621127,41.950391]},"n4436":{"id":"n4436","loc":[-85.621126,41.950357]},"n4437":{"id":"n4437","loc":[-85.621094,41.950357]},"n4438":{"id":"n4438","loc":[-85.621094,41.950391]},"n4439":{"id":"n4439","loc":[-85.620977,41.950392]},"n444":{"id":"n444","loc":[-85.634298,41.943389]},"n4440":{"id":"n4440","loc":[-85.620975,41.950278]},"n4441":{"id":"n4441","loc":[-85.621087,41.950277]},"n4442":{"id":"n4442","loc":[-85.621088,41.950331]},"n4443":{"id":"n4443","loc":[-85.621211,41.950312]},"n4444":{"id":"n4444","loc":[-85.621104,41.950313]},"n4445":{"id":"n4445","loc":[-85.621105,41.950331]},"n4446":{"id":"n4446","loc":[-85.620706,41.950328]},"n4447":{"id":"n4447","loc":[-85.620606,41.950327]},"n4448":{"id":"n4448","loc":[-85.620607,41.950261]},"n4449":{"id":"n4449","loc":[-85.620707,41.950262]},"n445":{"id":"n445","loc":[-85.634527,41.943623]},"n4450":{"id":"n4450","loc":[-85.620599,41.950336]},"n4451":{"id":"n4451","loc":[-85.620559,41.950336]},"n4452":{"id":"n4452","loc":[-85.620559,41.950299]},"n4453":{"id":"n4453","loc":[-85.620599,41.950299]},"n4454":{"id":"n4454","loc":[-85.620545,41.950357]},"n4455":{"id":"n4455","loc":[-85.620418,41.950357]},"n4456":{"id":"n4456","loc":[-85.620417,41.950257]},"n4457":{"id":"n4457","loc":[-85.620544,41.950256]},"n4458":{"id":"n4458","loc":[-85.620246,41.950131],"tags":{"highway":"crossing"}},"n4459":{"id":"n4459","loc":[-85.620252,41.950956]},"n446":{"id":"n446","loc":[-85.634608,41.943577]},"n4460":{"id":"n4460","loc":[-85.620245,41.950179]},"n4461":{"id":"n4461","loc":[-85.620246,41.950088]},"n4462":{"id":"n4462","loc":[-85.620251,41.950885]},"n4463":{"id":"n4463","loc":[-85.620103,41.950884],"tags":{"crossing":"zebra","highway":"crossing"}},"n4464":{"id":"n4464","loc":[-85.619992,41.950884]},"n4465":{"id":"n4465","loc":[-85.619704,41.951008]},"n4466":{"id":"n4466","loc":[-85.619599,41.951122]},"n4467":{"id":"n4467","loc":[-85.619264,41.951486]},"n4468":{"id":"n4468","loc":[-85.619179,41.951573],"tags":{"highway":"crossing"}},"n4469":{"id":"n4469","loc":[-85.620251,41.950999],"tags":{"highway":"crossing"}},"n447":{"id":"n447","loc":[-85.634555,41.943531]},"n4470":{"id":"n4470","loc":[-85.620249,41.951066]},"n4471":{"id":"n4471","loc":[-85.620256,41.951374]},"n4472":{"id":"n4472","loc":[-85.620249,41.951389]},"n4473":{"id":"n4473","loc":[-85.620249,41.951407]},"n4474":{"id":"n4474","loc":[-85.620255,41.951423]},"n4475":{"id":"n4475","loc":[-85.62026,41.951853]},"n4476":{"id":"n4476","loc":[-85.620262,41.951894],"tags":{"highway":"crossing"}},"n4477":{"id":"n4477","loc":[-85.620265,41.951957]},"n4478":{"id":"n4478","loc":[-85.620262,41.952135]},"n4479":{"id":"n4479","loc":[-85.620241,41.952424]},"n448":{"id":"n448","loc":[-85.634555,41.943482]},"n4480":{"id":"n4480","loc":[-85.620213,41.952583]},"n4481":{"id":"n4481","loc":[-85.620158,41.952754]},"n4482":{"id":"n4482","loc":[-85.620065,41.952942]},"n4483":{"id":"n4483","loc":[-85.619753,41.953439]},"n4484":{"id":"n4484","loc":[-85.619605,41.953626]},"n4485":{"id":"n4485","loc":[-85.619381,41.953834]},"n4486":{"id":"n4486","loc":[-85.619069,41.954066]},"n4487":{"id":"n4487","loc":[-85.618674,41.95429]},"n4488":{"id":"n4488","loc":[-85.621816,41.952389]},"n4489":{"id":"n4489","loc":[-85.6217,41.952386]},"n449":{"id":"n449","loc":[-85.634509,41.943427]},"n4490":{"id":"n4490","loc":[-85.621705,41.952306]},"n4491":{"id":"n4491","loc":[-85.621821,41.95231]},"n4492":{"id":"n4492","loc":[-85.621819,41.952272]},"n4493":{"id":"n4493","loc":[-85.621778,41.952272]},"n4494":{"id":"n4494","loc":[-85.621778,41.952199]},"n4495":{"id":"n4495","loc":[-85.621818,41.952199]},"n4496":{"id":"n4496","loc":[-85.621754,41.952281]},"n4497":{"id":"n4497","loc":[-85.621701,41.95228]},"n4498":{"id":"n4498","loc":[-85.621702,41.952197]},"n4499":{"id":"n4499","loc":[-85.621755,41.952197]},"n45":{"id":"n45","loc":[-85.636791,41.942792]},"n450":{"id":"n450","loc":[-85.63453,41.943365]},"n4500":{"id":"n4500","loc":[-85.628201,41.954694],"tags":{"highway":"stop","stop":"all"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop"}},"n4508":{"id":"n4508","loc":[-85.629559,41.957343]},"n4509":{"id":"n4509","loc":[-85.628723,41.95735]},"n451":{"id":"n451","loc":[-85.634356,41.943468]},"n4510":{"id":"n4510","loc":[-85.62842,41.957515]},"n4511":{"id":"n4511","loc":[-85.627561,41.957525]},"n4512":{"id":"n4512","loc":[-85.630323,41.957508]},"n4513":{"id":"n4513","loc":[-85.630811,41.957506]},"n4514":{"id":"n4514","loc":[-85.630839,41.960874]},"n4515":{"id":"n4515","loc":[-85.631035,41.957506]},"n4516":{"id":"n4516","loc":[-85.632027,41.9575]},"n4517":{"id":"n4517","loc":[-85.631038,41.958066]},"n4518":{"id":"n4518","loc":[-85.630787,41.954769]},"n4519":{"id":"n4519","loc":[-85.630806,41.957342]},"n452":{"id":"n452","loc":[-85.634123,41.943596]},"n4520":{"id":"n4520","loc":[-85.630809,41.957428],"tags":{"highway":"crossing"}},"n4521":{"id":"n4521","loc":[-85.630912,41.957506],"tags":{"highway":"crossing"}},"n4522":{"id":"n4522","loc":[-85.631033,41.957428],"tags":{"highway":"crossing"}},"n4523":{"id":"n4523","loc":[-85.631032,41.957341]},"n4524":{"id":"n4524","loc":[-85.63091,41.957341],"tags":{"highway":"crossing"}},"n4525":{"id":"n4525","loc":[-85.631027,41.95597]},"n4526":{"id":"n4526","loc":[-85.631027,41.955913],"tags":{"highway":"crossing"}},"n4527":{"id":"n4527","loc":[-85.631025,41.955873]},"n4528":{"id":"n4528","loc":[-85.631073,41.955913],"tags":{"highway":"stop"}},"n4529":{"id":"n4529","loc":[-85.631007,41.954766]},"n453":{"id":"n453","loc":[-85.634709,41.943926]},"n4530":{"id":"n4530","loc":[-85.630881,41.954768],"tags":{"highway":"crossing"}},"n4531":{"id":"n4531","loc":[-85.628022,41.954776]},"n4532":{"id":"n4532","loc":[-85.627385,41.95584]},"n4533":{"id":"n4533","loc":[-85.627329,41.955937]},"n4534":{"id":"n4534","loc":[-85.626583,41.957153]},"n4535":{"id":"n4535","loc":[-85.629675,41.954564],"tags":{"highway":"stop"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop"}},"n4538":{"id":"n4538","loc":[-85.630784,41.954682],"tags":{"highway":"crossing"}},"n4539":{"id":"n4539","loc":[-85.63078,41.954595]},"n454":{"id":"n454","loc":[-85.63525,41.943855]},"n4540":{"id":"n4540","loc":[-85.630879,41.954595],"tags":{"highway":"crossing"}},"n4541":{"id":"n4541","loc":[-85.631004,41.954594]},"n4542":{"id":"n4542","loc":[-85.631006,41.954681],"tags":{"highway":"crossing"}},"n4543":{"id":"n4543","loc":[-85.631045,41.959036],"tags":{"highway":"stop"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop"}},"n4552":{"id":"n4552","loc":[-85.626519,41.957256]},"n4553":{"id":"n4553","loc":[-85.625334,41.959165]},"n4554":{"id":"n4554","loc":[-85.626483,41.95806]},"n4555":{"id":"n4555","loc":[-85.626481,41.958175]},"n4556":{"id":"n4556","loc":[-85.626412,41.958174]},"n4557":{"id":"n4557","loc":[-85.626412,41.958202]},"n4558":{"id":"n4558","loc":[-85.62628,41.958201]},"n4559":{"id":"n4559","loc":[-85.626283,41.958057]},"n456":{"id":"n456","loc":[-85.638854,41.943104]},"n4560":{"id":"n4560","loc":[-85.622763,41.95109],"tags":{"highway":"stop"}},"n4561":{"id":"n4561","loc":[-85.622858,41.950876],"tags":{"emergency":"fire_hydrant"}},"n4562":{"id":"n4562","loc":[-85.624073,41.950393]},"n4563":{"id":"n4563","loc":[-85.624077,41.950924]},"n4564":{"id":"n4564","loc":[-85.624599,41.950984],"tags":{"highway":"stop"}},"n4565":{"id":"n4565","loc":[-85.624831,41.95119],"tags":{"emergency":"fire_hydrant"}},"n4566":{"id":"n4566","loc":[-85.624437,41.952568],"tags":{"emergency":"fire_hydrant"}},"n4567":{"id":"n4567","loc":[-85.624077,41.954606],"tags":{"emergency":"fire_hydrant"}},"n4568":{"id":"n4568","loc":[-85.624263,41.954888]},"n4569":{"id":"n4569","loc":[-85.624206,41.954919]},"n457":{"id":"n457","loc":[-85.635186,41.943901]},"n4570":{"id":"n4570","loc":[-85.624154,41.954865]},"n4571":{"id":"n4571","loc":[-85.624212,41.954835]},"n4572":{"id":"n4572","loc":[-85.622442,41.954401],"tags":{"emergency":"fire_hydrant"}},"n4573":{"id":"n4573","loc":[-85.619751,41.954658],"tags":{"emergency":"fire_hydrant"}},"n4574":{"id":"n4574","loc":[-85.617785,41.954534]},"n4575":{"id":"n4575","loc":[-85.617416,41.954721]},"n4576":{"id":"n4576","loc":[-85.617662,41.95474]},"n4577":{"id":"n4577","loc":[-85.618014,41.954717]},"n4578":{"id":"n4578","loc":[-85.617886,41.954671]},"n4579":{"id":"n4579","loc":[-85.617831,41.954612]},"n458":{"id":"n458","loc":[-85.635162,41.943917]},"n4580":{"id":"n4580","loc":[-85.617968,41.954752]},"n4581":{"id":"n4581","loc":[-85.617815,41.954752]},"n4582":{"id":"n4582","loc":[-85.617938,41.954695]},"n4583":{"id":"n4583","loc":[-85.617856,41.954642],"tags":{"highway":"stop"}},"n4584":{"id":"n4584","loc":[-85.619116,41.954164],"tags":{"man_made":"flagpole"}},"n4585":{"id":"n4585","loc":[-85.619569,41.953255],"tags":{"emergency":"fire_hydrant"}},"n4586":{"id":"n4586","loc":[-85.620352,41.951894],"tags":{"highway":"stop"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop"}},"n459":{"id":"n459","loc":[-85.634856,41.943905]},"n4590":{"id":"n4590","loc":[-85.620374,41.95018],"tags":{"emergency":"fire_hydrant"}},"n4591":{"id":"n4591","loc":[-85.620301,41.949239],"tags":{"highway":"stop"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop"}},"n4594":{"id":"n4594","loc":[-85.620191,41.947352],"tags":{"emergency":"fire_hydrant"}},"n4595":{"id":"n4595","loc":[-85.622819,41.947493],"tags":{"emergency":"fire_hydrant"}},"n4596":{"id":"n4596","loc":[-85.622744,41.947541],"tags":{"highway":"stop"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop"}},"n4598":{"id":"n4598","loc":[-85.622909,41.948333],"tags":{"highway":"give_way"}},"n4599":{"id":"n4599","loc":[-85.622593,41.948333],"tags":{"highway":"give_way"}},"n46":{"id":"n46","loc":[-85.637131,41.94307]},"n460":{"id":"n460","loc":[-85.634811,41.944007]},"n4600":{"id":"n4600","loc":[-85.622835,41.948387],"tags":{"emergency":"fire_hydrant"}},"n4601":{"id":"n4601","loc":[-85.622768,41.949125],"tags":{"highway":"stop"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop"}},"n4606":{"id":"n4606","loc":[-85.624849,41.949106],"tags":{"emergency":"fire_hydrant"}},"n4607":{"id":"n4607","loc":[-85.624858,41.950119],"tags":{"emergency":"fire_hydrant"}},"n4608":{"id":"n4608","loc":[-85.624752,41.948334],"tags":{"highway":"give_way"}},"n4609":{"id":"n4609","loc":[-85.624845,41.948422],"tags":{"emergency":"fire_hydrant"}},"n461":{"id":"n461","loc":[-85.634987,41.943112]},"n4610":{"id":"n4610","loc":[-85.62484,41.947539],"tags":{"emergency":"fire_hydrant"}},"n4611":{"id":"n4611","loc":[-85.62476,41.947428],"tags":{"highway":"stop"}},"n4612":{"id":"n4612","loc":[-85.620286,41.950926]},"n4613":{"id":"n4613","loc":[-85.618237,41.950963]},"n4614":{"id":"n4614","loc":[-85.618107,41.950876]},"n4615":{"id":"n4615","loc":[-85.618131,41.950393]},"n4616":{"id":"n4616","loc":[-85.61823,41.9499]},"n4617":{"id":"n4617","loc":[-85.619138,41.950212]},"n4618":{"id":"n4618","loc":[-85.619299,41.950388]},"n4619":{"id":"n4619","loc":[-85.619306,41.950897]},"n462":{"id":"n462","loc":[-85.634698,41.943194]},"n4620":{"id":"n4620","loc":[-85.619155,41.950958]},"n4621":{"id":"n4621","loc":[-85.620079,41.947715]},"n4622":{"id":"n4622","loc":[-85.619674,41.947728]},"n4623":{"id":"n4623","loc":[-85.619634,41.947735]},"n4624":{"id":"n4624","loc":[-85.619587,41.947756],"tags":{"barrier":"gate"}},"n4625":{"id":"n4625","loc":[-85.61953,41.947796]},"n4626":{"id":"n4626","loc":[-85.619475,41.947847]},"n4627":{"id":"n4627","loc":[-85.619433,41.947903]},"n4628":{"id":"n4628","loc":[-85.619402,41.947982]},"n4629":{"id":"n4629","loc":[-85.619394,41.948043]},"n463":{"id":"n463","loc":[-85.634632,41.943219]},"n4630":{"id":"n4630","loc":[-85.619395,41.948476]},"n4631":{"id":"n4631","loc":[-85.618367,41.947452]},"n4632":{"id":"n4632","loc":[-85.618371,41.947567],"tags":{"barrier":"gate"}},"n4633":{"id":"n4633","loc":[-85.618341,41.947622]},"n4634":{"id":"n4634","loc":[-85.618138,41.94773]},"n4635":{"id":"n4635","loc":[-85.618078,41.947814]},"n4636":{"id":"n4636","loc":[-85.618072,41.948009]},"n4637":{"id":"n4637","loc":[-85.618269,41.947666]},"n4638":{"id":"n4638","loc":[-85.618099,41.947765]},"n4639":{"id":"n4639","loc":[-85.618378,41.954453]},"n464":{"id":"n464","loc":[-85.63459,41.943239]},"n4640":{"id":"n4640","loc":[-85.618198,41.95453]},"n4641":{"id":"n4641","loc":[-85.618212,41.954623]},"n4642":{"id":"n4642","loc":[-85.635211,41.943103],"tags":{"leisure":"picnic_table"}},"n4643":{"id":"n4643","loc":[-85.635345,41.943448],"tags":{"leisure":"picnic_table"}},"n4644":{"id":"n4644","loc":[-85.635901,41.943353],"tags":{"amenity":"bench"}},"n4645":{"id":"n4645","loc":[-85.635815,41.942638],"tags":{"highway":"stop"}},"n4646":{"id":"n4646","loc":[-85.635355,41.942044],"tags":{"leisure":"picnic_table"}},"n4647":{"id":"n4647","loc":[-85.635206,41.942045],"tags":{"leisure":"picnic_table"}},"n4648":{"id":"n4648","loc":[-85.63504,41.941992],"tags":{"leisure":"picnic_table"}},"n4649":{"id":"n4649","loc":[-85.635185,41.942001]},"n465":{"id":"n465","loc":[-85.634555,41.943263]},"n4650":{"id":"n4650","loc":[-85.635176,41.942021]},"n4651":{"id":"n4651","loc":[-85.635127,41.942008]},"n4652":{"id":"n4652","loc":[-85.635136,41.941988]},"n4653":{"id":"n4653","loc":[-85.635,41.941709],"tags":{"emergency":"fire_hydrant"}},"n4654":{"id":"n4654","loc":[-85.634893,41.941801]},"n4655":{"id":"n4655","loc":[-85.634937,41.941843]},"n4656":{"id":"n4656","loc":[-85.634963,41.941859]},"n4657":{"id":"n4657","loc":[-85.635027,41.941904]},"n4658":{"id":"n4658","loc":[-85.63494,41.94187]},"n4659":{"id":"n4659","loc":[-85.634951,41.941871]},"n466":{"id":"n466","loc":[-85.634526,41.943289]},"n4660":{"id":"n4660","loc":[-85.634753,41.941701],"tags":{"amenity":"drinking_water"}},"n4661":{"id":"n4661","loc":[-85.634717,41.941804],"tags":{"amenity":"bench"}},"n4662":{"id":"n4662","loc":[-85.634554,41.941883],"tags":{"amenity":"bench"}},"n4663":{"id":"n4663","loc":[-85.635002,41.941579],"tags":{"amenity":"fountain"}},"n4664":{"id":"n4664","loc":[-85.635258,41.94188],"tags":{"amenity":"waste_basket"}},"n4665":{"id":"n4665","loc":[-85.635262,41.941581],"tags":{"amenity":"bench"}},"n4666":{"id":"n4666","loc":[-85.635319,41.941744],"tags":{"amenity":"bench"}},"n4667":{"id":"n4667","loc":[-85.634702,41.941473],"tags":{"amenity":"waste_basket"}},"n4668":{"id":"n4668","loc":[-85.633981,41.941966],"tags":{"amenity":"bench"}},"n4669":{"id":"n4669","loc":[-85.63388,41.941743]},"n467":{"id":"n467","loc":[-85.635163,41.944985]},"n4670":{"id":"n4670","loc":[-85.633746,41.941741]},"n4671":{"id":"n4671","loc":[-85.633749,41.941664]},"n4672":{"id":"n4672","loc":[-85.633883,41.941667]},"n4673":{"id":"n4673","loc":[-85.634283,41.941183],"tags":{"leisure":"picnic_table"}},"n4674":{"id":"n4674","loc":[-85.634046,41.941102],"tags":{"amenity":"bbq"}},"n4675":{"id":"n4675","loc":[-85.63401,41.941093],"tags":{"amenity":"bbq"}},"n4676":{"id":"n4676","loc":[-85.633408,41.940862],"tags":{"amenity":"bench"}},"n4677":{"id":"n4677","loc":[-85.633359,41.940651],"tags":{"amenity":"bench"}},"n4678":{"id":"n4678","loc":[-85.634109,41.940831]},"n4679":{"id":"n4679","loc":[-85.63396,41.940867]},"n468":{"id":"n468","loc":[-85.635095,41.945035]},"n4680":{"id":"n4680","loc":[-85.633816,41.940913]},"n4681":{"id":"n4681","loc":[-85.633237,41.940455]},"n4682":{"id":"n4682","loc":[-85.634453,41.940025],"tags":{"emergency":"fire_hydrant"}},"n4683":{"id":"n4683","loc":[-85.635692,41.940218],"tags":{"emergency":"fire_hydrant"}},"n4684":{"id":"n4684","loc":[-85.635566,41.940102],"tags":{"highway":"stop"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop"}},"n4686":{"id":"n4686","loc":[-85.635883,41.94012],"tags":{"crossing":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","highway":"crossing"}},"n4689":{"id":"n4689","loc":[-85.635669,41.940043]},"n469":{"id":"n469","loc":[-85.634269,41.944431]},"n4690":{"id":"n4690","loc":[-85.635661,41.940107],"tags":{"crossing":"zebra","highway":"crossing"}},"n4691":{"id":"n4691","loc":[-85.635424,41.941005],"tags":{"amenity":"fountain"}},"n4692":{"id":"n4692","loc":[-85.635542,41.941371],"tags":{"amenity":"bench"}},"n4693":{"id":"n4693","loc":[-85.635709,41.941341],"tags":{"emergency":"fire_hydrant"}},"n4694":{"id":"n4694","loc":[-85.637038,41.942513],"tags":{"highway":"stop"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way"}},"n4699":{"id":"n4699","loc":[-85.638288,41.941236],"tags":{"emergency":"fire_hydrant"}},"n47":{"id":"n47","loc":[-85.636693,41.943073]},"n470":{"id":"n470","loc":[-85.634352,41.944376]},"n4700":{"id":"n4700","loc":[-85.63935,41.94128],"tags":{"emergency":"fire_hydrant"}},"n4701":{"id":"n4701","loc":[-85.639277,41.941337],"tags":{"highway":"give_way"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way"}},"n4703":{"id":"n4703","loc":[-85.642191,41.940039]},"n4704":{"id":"n4704","loc":[-85.640585,41.941263],"tags":{"emergency":"fire_hydrant"}},"n4705":{"id":"n4705","loc":[-85.64049,41.941327],"tags":{"highway":"stop"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop"}},"n4709":{"id":"n4709","loc":[-85.641756,41.941392],"tags":{"emergency":"fire_hydrant"}},"n471":{"id":"n471","loc":[-85.634747,41.944561],"tags":{"railway":"crossing"}},"n4710":{"id":"n4710","loc":[-85.642014,41.941313],"tags":{"highway":"stop"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop"}},"n4719":{"id":"n4719","loc":[-85.639527,41.942505],"tags":{"emergency":"fire_hydrant"}},"n472":{"id":"n472","loc":[-85.634667,41.944613]},"n4720":{"id":"n4720","loc":[-85.638238,41.942745],"tags":{"highway":"stop"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop"}},"n4722":{"id":"n4722","loc":[-85.638018,41.94299],"tags":{"amenity":"waste_disposal"}},"n4723":{"id":"n4723","loc":[-85.637918,41.944152],"tags":{"amenity":"waste_basket"}},"n4724":{"id":"n4724","loc":[-85.635902,41.943291],"tags":{"leisure":"picnic_table"}},"n4725":{"id":"n4725","loc":[-85.63704,41.942741],"tags":{"highway":"stop"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop"}},"n4728":{"id":"n4728","loc":[-85.632154,41.943539],"tags":{"emergency":"fire_hydrant"}},"n4729":{"id":"n4729","loc":[-85.633567,41.944641],"tags":{"amenity":"bench"}},"n473":{"id":"n473","loc":[-85.634161,41.944371]},"n4730":{"id":"n4730","loc":[-85.633127,41.944574],"tags":{"amenity":"bench"}},"n4731":{"id":"n4731","loc":[-85.633439,41.944871],"tags":{"amenity":"bench"}},"n4732":{"id":"n4732","loc":[-85.633676,41.944799],"tags":{"amenity":"waste_basket"}},"n4733":{"id":"n4733","loc":[-85.633466,41.944862],"tags":{"amenity":"waste_basket"}},"n4734":{"id":"n4734","loc":[-85.633451,41.944847],"tags":{"emergency":"fire_hydrant"}},"n4735":{"id":"n4735","loc":[-85.634202,41.945543],"tags":{"amenity":"waste_basket"}},"n4736":{"id":"n4736","loc":[-85.634652,41.945472],"tags":{"leisure":"picnic_table"}},"n4737":{"id":"n4737","loc":[-85.6347,41.945445],"tags":{"leisure":"picnic_table"}},"n4738":{"id":"n4738","loc":[-85.634646,41.945662],"tags":{"emergency":"fire_hydrant"}},"n4739":{"id":"n4739","loc":[-85.634673,41.945687],"tags":{"amenity":"waste_basket"}},"n474":{"id":"n474","loc":[-85.633861,41.944117]},"n4740":{"id":"n4740","loc":[-85.63449,41.945827],"tags":{"amenity":"clock","display":"analog"}},"n4741":{"id":"n4741","loc":[-85.63481,41.946056],"tags":{"highway":"stop"}},"n4742":{"id":"n4742","loc":[-85.634814,41.946176],"tags":{"amenity":"post_box"}},"n4743":{"id":"n4743","loc":[-85.638744,41.945328]},"n4744":{"id":"n4744","loc":[-85.63867,41.945228],"tags":{"amenity":"bench"}},"n4745":{"id":"n4745","loc":[-85.639487,41.945042],"tags":{"highway":"stop"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop"}},"n476":{"id":"n476","loc":[-85.63423,41.943692]},"n4760":{"id":"n4760","loc":[-85.63169,41.947812]},"n4761":{"id":"n4761","loc":[-85.631307,41.947655]},"n4762":{"id":"n4762","loc":[-85.631407,41.947413]},"n4763":{"id":"n4763","loc":[-85.631173,41.947306]},"n4764":{"id":"n4764","loc":[-85.631316,41.947145]},"n4765":{"id":"n4765","loc":[-85.631476,41.947087]},"n4766":{"id":"n4766","loc":[-85.631793,41.946871]},"n4767":{"id":"n4767","loc":[-85.631884,41.946723]},"n4768":{"id":"n4768","loc":[-85.631814,41.946397]},"n4769":{"id":"n4769","loc":[-85.631382,41.947685]},"n477":{"id":"n477","loc":[-85.635096,41.942814]},"n4770":{"id":"n4770","loc":[-85.63109,41.947819]},"n4771":{"id":"n4771","loc":[-85.630921,41.947961]},"n4772":{"id":"n4772","loc":[-85.630249,41.947709]},"n4773":{"id":"n4773","loc":[-85.630149,41.947451]},"n4774":{"id":"n4774","loc":[-85.629733,41.947339]},"n4775":{"id":"n4775","loc":[-85.629755,41.946948]},"n4776":{"id":"n4776","loc":[-85.630457,41.947103]},"n4777":{"id":"n4777","loc":[-85.630934,41.946939]},"n4778":{"id":"n4778","loc":[-85.631277,41.946852]},"n4779":{"id":"n4779","loc":[-85.63142,41.946781]},"n478":{"id":"n478","loc":[-85.635058,41.942795]},"n4780":{"id":"n4780","loc":[-85.631116,41.946474]},"n4781":{"id":"n4781","loc":[-85.63073,41.945965]},"n4782":{"id":"n4782","loc":[-85.631337,41.94571]},"n4783":{"id":"n4783","loc":[-85.631589,41.945487]},"n4784":{"id":"n4784","loc":[-85.632278,41.945784]},"n4785":{"id":"n4785","loc":[-85.632105,41.946034]},"n4786":{"id":"n4786","loc":[-85.632532,41.946198]},"n4787":{"id":"n4787","loc":[-85.632566,41.946151]},"n4788":{"id":"n4788","loc":[-85.632684,41.946196]},"n4789":{"id":"n4789","loc":[-85.628676,41.947106]},"n479":{"id":"n479","loc":[-85.635002,41.94279]},"n4790":{"id":"n4790","loc":[-85.628973,41.946476]},"n4791":{"id":"n4791","loc":[-85.629094,41.946079]},"n4792":{"id":"n4792","loc":[-85.629226,41.94578]},"n4793":{"id":"n4793","loc":[-85.629479,41.945682]},"n4794":{"id":"n4794","loc":[-85.630606,41.94569]},"n4795":{"id":"n4795","loc":[-85.631255,41.945588]},"n4796":{"id":"n4796","loc":[-85.631546,41.945281]},"n4797":{"id":"n4797","loc":[-85.631629,41.944823]},"n4798":{"id":"n4798","loc":[-85.631766,41.944958]},"n4799":{"id":"n4799","loc":[-85.631689,41.945318]},"n48":{"id":"n48","loc":[-85.636689,41.94276]},"n480":{"id":"n480","loc":[-85.634908,41.94279]},"n4800":{"id":"n4800","loc":[-85.615069,41.945527]},"n4801":{"id":"n4801","loc":[-85.615058,41.946677]},"n4802":{"id":"n4802","loc":[-85.613692,41.946689]},"n4803":{"id":"n4803","loc":[-85.613475,41.946531]},"n4804":{"id":"n4804","loc":[-85.611717,41.946252]},"n4805":{"id":"n4805","loc":[-85.611353,41.946385]},"n4806":{"id":"n4806","loc":[-85.611304,41.947397]},"n4807":{"id":"n4807","loc":[-85.610564,41.947401]},"n4808":{"id":"n4808","loc":[-85.610553,41.947122]},"n4809":{"id":"n4809","loc":[-85.610194,41.946992]},"n481":{"id":"n481","loc":[-85.634478,41.942342]},"n4810":{"id":"n4810","loc":[-85.609976,41.946628]},"n4811":{"id":"n4811","loc":[-85.609769,41.946523]},"n4812":{"id":"n4812","loc":[-85.609307,41.946523]},"n4813":{"id":"n4813","loc":[-85.609035,41.946462]},"n4814":{"id":"n4814","loc":[-85.609018,41.943277]},"n4815":{"id":"n4815","loc":[-85.609617,41.943423]},"n4816":{"id":"n4816","loc":[-85.610471,41.943447]},"n4817":{"id":"n4817","loc":[-85.621491,41.949168]},"n4818":{"id":"n4818","loc":[-85.620266,41.94917]},"n4819":{"id":"n4819","loc":[-85.620262,41.947557]},"n482":{"id":"n482","loc":[-85.634521,41.942254]},"n4820":{"id":"n4820","loc":[-85.620825,41.947556]},"n4821":{"id":"n4821","loc":[-85.620827,41.948371]},"n4822":{"id":"n4822","loc":[-85.621489,41.94837]},"n4823":{"id":"n4823","loc":[-85.622865,41.950928]},"n4824":{"id":"n4824","loc":[-85.622858,41.949744]},"n4825":{"id":"n4825","loc":[-85.623696,41.949714]},"n4826":{"id":"n4826","loc":[-85.623696,41.949647]},"n4827":{"id":"n4827","loc":[-85.624019,41.949647]},"n4828":{"id":"n4828","loc":[-85.624024,41.950093]},"n4829":{"id":"n4829","loc":[-85.622885,41.949711]},"n483":{"id":"n483","loc":[-85.63425,41.941819]},"n4830":{"id":"n4830","loc":[-85.624584,41.951049]},"n4831":{"id":"n4831","loc":[-85.624669,41.9511]},"n4832":{"id":"n4832","loc":[-85.624316,41.952218]},"n4833":{"id":"n4833","loc":[-85.623819,41.952094]},"n4834":{"id":"n4834","loc":[-85.623385,41.952101]},"n4835":{"id":"n4835","loc":[-85.623456,41.951238]},"n4836":{"id":"n4836","loc":[-85.623535,41.951051]},"n4837":{"id":"n4837","loc":[-85.624693,41.950921]},"n4838":{"id":"n4838","loc":[-85.624727,41.950897]},"n4839":{"id":"n4839","loc":[-85.624869,41.950341]},"n484":{"id":"n484","loc":[-85.634324,41.942131]},"n4840":{"id":"n4840","loc":[-85.624859,41.949284]},"n4841":{"id":"n4841","loc":[-85.624788,41.949262]},"n4842":{"id":"n4842","loc":[-85.62402,41.949265]},"n4843":{"id":"n4843","loc":[-85.610382,41.954663]},"n4844":{"id":"n4844","loc":[-85.605675,41.954667]},"n4845":{"id":"n4845","loc":[-85.605669,41.949407]},"n4846":{"id":"n4846","loc":[-85.610376,41.949404]},"n4847":{"id":"n4847","loc":[-85.605552,41.958536]},"n4848":{"id":"n4848","loc":[-85.595755,41.958588]},"n4849":{"id":"n4849","loc":[-85.595732,41.956419]},"n485":{"id":"n485","loc":[-85.634211,41.941374]},"n4850":{"id":"n4850","loc":[-85.596908,41.955605]},"n4851":{"id":"n4851","loc":[-85.597723,41.955596]},"n4852":{"id":"n4852","loc":[-85.597715,41.954967]},"n4853":{"id":"n4853","loc":[-85.5874,41.955018]},"n4854":{"id":"n4854","loc":[-85.586615,41.955124]},"n4855":{"id":"n4855","loc":[-85.58613,41.955293]},"n4856":{"id":"n4856","loc":[-85.586166,41.962122]},"n4857":{"id":"n4857","loc":[-85.587008,41.955052]},"n4858":{"id":"n4858","loc":[-85.591685,41.95499]},"n4859":{"id":"n4859","loc":[-85.591718,41.956649]},"n486":{"id":"n486","loc":[-85.634085,41.940704]},"n4860":{"id":"n4860","loc":[-85.591133,41.956649]},"n4861":{"id":"n4861","loc":[-85.591061,41.95582]},"n4862":{"id":"n4862","loc":[-85.590677,41.95613]},"n4863":{"id":"n4863","loc":[-85.590826,41.956369]},"n4864":{"id":"n4864","loc":[-85.591016,41.954991]},"n4865":{"id":"n4865","loc":[-85.587656,41.954855]},"n4866":{"id":"n4866","loc":[-85.5964,41.955274]},"n4867":{"id":"n4867","loc":[-85.58776,41.96178]},"n4868":{"id":"n4868","loc":[-85.601172,41.960448]},"n4869":{"id":"n4869","loc":[-85.589489,41.960478]},"n487":{"id":"n487","loc":[-85.635567,41.940944]},"n4870":{"id":"n4870","loc":[-85.586664,41.960493]},"n4871":{"id":"n4871","loc":[-85.591227,41.95676]},"n4872":{"id":"n4872","loc":[-85.589424,41.958093]},"n4873":{"id":"n4873","loc":[-85.588779,41.957611]},"n4874":{"id":"n4874","loc":[-85.590583,41.956278]},"n4875":{"id":"n4875","loc":[-85.590759,41.957106]},"n4876":{"id":"n4876","loc":[-85.592213,41.958218]},"n4877":{"id":"n4877","loc":[-85.592262,41.958279]},"n4878":{"id":"n4878","loc":[-85.592304,41.958358]},"n4879":{"id":"n4879","loc":[-85.592351,41.95849]},"n488":{"id":"n488","loc":[-85.635542,41.940919]},"n4880":{"id":"n4880","loc":[-85.592363,41.958605]},"n4881":{"id":"n4881","loc":[-85.592383,41.96047]},"n4882":{"id":"n4882","loc":[-85.592376,41.959808]},"n4883":{"id":"n4883","loc":[-85.600825,41.959779]},"n4884":{"id":"n4884","loc":[-85.601084,41.959844]},"n4885":{"id":"n4885","loc":[-85.601144,41.959908]},"n4886":{"id":"n4886","loc":[-85.601164,41.960008]},"n4887":{"id":"n4887","loc":[-85.601162,41.960125]},"n4888":{"id":"n4888","loc":[-85.601134,41.960221]},"n4889":{"id":"n4889","loc":[-85.600993,41.960353]},"n489":{"id":"n489","loc":[-85.635514,41.940906]},"n4890":{"id":"n4890","loc":[-85.600794,41.960449]},"n4891":{"id":"n4891","loc":[-85.60098,41.959792]},"n4892":{"id":"n4892","loc":[-85.601067,41.960294]},"n4893":{"id":"n4893","loc":[-85.596829,41.959793]},"n4894":{"id":"n4894","loc":[-85.596839,41.960459]},"n4895":{"id":"n4895","loc":[-85.589364,41.958048]},"n4896":{"id":"n4896","loc":[-85.587374,41.959511]},"n4897":{"id":"n4897","loc":[-85.587286,41.959564]},"n4898":{"id":"n4898","loc":[-85.587163,41.959632]},"n4899":{"id":"n4899","loc":[-85.586694,41.959865]},"n49":{"id":"n49","loc":[-85.637127,41.942757]},"n490":{"id":"n490","loc":[-85.635469,41.940896]},"n4900":{"id":"n4900","loc":[-85.586634,41.959921]},"n4901":{"id":"n4901","loc":[-85.586607,41.960001]},"n4902":{"id":"n4902","loc":[-85.586599,41.960099]},"n4903":{"id":"n4903","loc":[-85.586602,41.96034]},"n4904":{"id":"n4904","loc":[-85.586669,41.960439]},"n4905":{"id":"n4905","loc":[-85.586758,41.960493]},"n4906":{"id":"n4906","loc":[-85.586618,41.960391]},"n4907":{"id":"n4907","loc":[-85.591201,41.956352]},"n4908":{"id":"n4908","loc":[-85.59112,41.954843]},"n4909":{"id":"n4909","loc":[-85.591536,41.956349]},"n491":{"id":"n491","loc":[-85.635667,41.940826]},"n4910":{"id":"n4910","loc":[-85.590953,41.956354]},"n4911":{"id":"n4911","loc":[-85.591468,41.956406]},"n4912":{"id":"n4912","loc":[-85.591469,41.956478]},"n4913":{"id":"n4913","loc":[-85.591123,41.956481]},"n4914":{"id":"n4914","loc":[-85.591121,41.956409]},"n4915":{"id":"n4915","loc":[-85.590826,41.955954]},"n4916":{"id":"n4916","loc":[-85.590612,41.956115]},"n4917":{"id":"n4917","loc":[-85.590402,41.955962]},"n4918":{"id":"n4918","loc":[-85.590622,41.955804]},"n4919":{"id":"n4919","loc":[-85.59011,41.956502]},"n492":{"id":"n492","loc":[-85.636197,41.940599]},"n4920":{"id":"n4920","loc":[-85.589877,41.956668]},"n4921":{"id":"n4921","loc":[-85.589777,41.95659]},"n4922":{"id":"n4922","loc":[-85.59001,41.956424]},"n4923":{"id":"n4923","loc":[-85.589595,41.956427]},"n4924":{"id":"n4924","loc":[-85.589434,41.956549]},"n4925":{"id":"n4925","loc":[-85.589262,41.956424]},"n4926":{"id":"n4926","loc":[-85.589422,41.956302]},"n4927":{"id":"n4927","loc":[-85.589358,41.956286]},"n4928":{"id":"n4928","loc":[-85.5892,41.956408]},"n4929":{"id":"n4929","loc":[-85.589032,41.956288]},"n493":{"id":"n493","loc":[-85.6362,41.940686]},"n4930":{"id":"n4930","loc":[-85.58919,41.956166]},"n4931":{"id":"n4931","loc":[-85.589165,41.956132]},"n4932":{"id":"n4932","loc":[-85.589002,41.956253]},"n4933":{"id":"n4933","loc":[-85.588826,41.956122]},"n4934":{"id":"n4934","loc":[-85.588989,41.956001]},"n4935":{"id":"n4935","loc":[-85.588673,41.955757]},"n4936":{"id":"n4936","loc":[-85.588502,41.955882]},"n4937":{"id":"n4937","loc":[-85.588339,41.955759]},"n4938":{"id":"n4938","loc":[-85.58851,41.955633]},"n4939":{"id":"n4939","loc":[-85.590382,41.955892]},"n494":{"id":"n494","loc":[-85.635969,41.94069]},"n4940":{"id":"n4940","loc":[-85.589923,41.956231]},"n4941":{"id":"n4941","loc":[-85.58984,41.956168]},"n4942":{"id":"n4942","loc":[-85.5903,41.95583]},"n4943":{"id":"n4943","loc":[-85.589636,41.956038]},"n4944":{"id":"n4944","loc":[-85.589546,41.956105]},"n4945":{"id":"n4945","loc":[-85.589045,41.955729]},"n4946":{"id":"n4946","loc":[-85.589135,41.955662]},"n4947":{"id":"n4947","loc":[-85.590718,41.955293]},"n4948":{"id":"n4948","loc":[-85.590718,41.955374]},"n4949":{"id":"n4949","loc":[-85.589211,41.955369]},"n495":{"id":"n495","loc":[-85.635965,41.940561]},"n4950":{"id":"n4950","loc":[-85.589212,41.955287]},"n4951":{"id":"n4951","loc":[-85.589675,41.956817]},"n4952":{"id":"n4952","loc":[-85.58947,41.95697]},"n4953":{"id":"n4953","loc":[-85.589219,41.956784]},"n4954":{"id":"n4954","loc":[-85.589425,41.95663]},"n4955":{"id":"n4955","loc":[-85.589373,41.95702]},"n4956":{"id":"n4956","loc":[-85.589171,41.957172]},"n4957":{"id":"n4957","loc":[-85.588962,41.957019]},"n4958":{"id":"n4958","loc":[-85.589164,41.956867]},"n4959":{"id":"n4959","loc":[-85.588881,41.955006]},"n496":{"id":"n496","loc":[-85.636031,41.94056]},"n4960":{"id":"n4960","loc":[-85.588804,41.955006]},"n4961":{"id":"n4961","loc":[-85.604773,41.954521]},"n4962":{"id":"n4962","loc":[-85.601603,41.954527]},"n4963":{"id":"n4963","loc":[-85.600823,41.954169]},"n4964":{"id":"n4964","loc":[-85.600828,41.950191]},"n4965":{"id":"n4965","loc":[-85.601673,41.949457]},"n4966":{"id":"n4966","loc":[-85.604464,41.949488]},"n4967":{"id":"n4967","loc":[-85.60538,41.950212]},"n4968":{"id":"n4968","loc":[-85.605395,41.954108]},"n4969":{"id":"n4969","loc":[-85.604771,41.954109]},"n497":{"id":"n497","loc":[-85.636032,41.940602]},"n4970":{"id":"n4970","loc":[-85.600613,41.953916]},"n4971":{"id":"n4971","loc":[-85.599758,41.954649]},"n4972":{"id":"n4972","loc":[-85.591194,41.954663]},"n4973":{"id":"n4973","loc":[-85.591182,41.950465]},"n4974":{"id":"n4974","loc":[-85.591871,41.950464]},"n4975":{"id":"n4975","loc":[-85.591868,41.949209]},"n4976":{"id":"n4976","loc":[-85.592155,41.949209]},"n4977":{"id":"n4977","loc":[-85.592155,41.94848]},"n4978":{"id":"n4978","loc":[-85.600615,41.948482]},"n4979":{"id":"n4979","loc":[-85.605421,41.949378]},"n498":{"id":"n498","loc":[-85.635776,41.940583]},"n4980":{"id":"n4980","loc":[-85.600614,41.949373]},"n4981":{"id":"n4981","loc":[-85.601316,41.94849]},"n4982":{"id":"n4982","loc":[-85.601592,41.947641]},"n4983":{"id":"n4983","loc":[-85.60395,41.947618]},"n4984":{"id":"n4984","loc":[-85.603973,41.948114]},"n4985":{"id":"n4985","loc":[-85.605398,41.948103]},"n4986":{"id":"n4986","loc":[-85.614017,41.965566]},"n4987":{"id":"n4987","loc":[-85.605787,41.965619]},"n4988":{"id":"n4988","loc":[-85.60577,41.963821]},"n4989":{"id":"n4989","loc":[-85.612886,41.963808]},"n499":{"id":"n499","loc":[-85.63589,41.940578]},"n4990":{"id":"n4990","loc":[-85.613207,41.963705]},"n4991":{"id":"n4991","loc":[-85.613511,41.963525]},"n4992":{"id":"n4992","loc":[-85.613667,41.963305]},"n4993":{"id":"n4993","loc":[-85.613779,41.962983]},"n4994":{"id":"n4994","loc":[-85.613797,41.959709]},"n4995":{"id":"n4995","loc":[-85.613663,41.95936]},"n4996":{"id":"n4996","loc":[-85.61339,41.959064]},"n4997":{"id":"n4997","loc":[-85.610503,41.956898]},"n4998":{"id":"n4998","loc":[-85.610485,41.956595]},"n4999":{"id":"n4999","loc":[-85.613892,41.956621]},"n5":{"id":"n5","loc":[-85.622744,41.95268]},"n50":{"id":"n50","loc":[-85.636673,41.943143]},"n500":{"id":"n500","loc":[-85.636198,41.940578]},"n5000":{"id":"n5000","loc":[-85.613866,41.958574]},"n5001":{"id":"n5001","loc":[-85.615262,41.958561]},"n5002":{"id":"n5002","loc":[-85.615279,41.959541]},"n5003":{"id":"n5003","loc":[-85.615314,41.95597]},"n5004":{"id":"n5004","loc":[-85.613887,41.955988]},"n5005":{"id":"n5005","loc":[-85.613074,41.962244]},"n5006":{"id":"n5006","loc":[-85.611678,41.963354]},"n5007":{"id":"n5007","loc":[-85.611678,41.963487]},"n5008":{"id":"n5008","loc":[-85.606906,41.963502]},"n5009":{"id":"n5009","loc":[-85.605777,41.962657]},"n501":{"id":"n501","loc":[-85.636251,41.940584]},"n5010":{"id":"n5010","loc":[-85.605711,41.9599]},"n5011":{"id":"n5011","loc":[-85.608139,41.9585]},"n5012":{"id":"n5012","loc":[-85.60814,41.956306]},"n5013":{"id":"n5013","loc":[-85.608854,41.95581]},"n5014":{"id":"n5014","loc":[-85.610039,41.955883]},"n5015":{"id":"n5015","loc":[-85.610068,41.956754]},"n5016":{"id":"n5016","loc":[-85.613058,41.959411]},"n5017":{"id":"n5017","loc":[-85.610234,41.957068]},"n5018":{"id":"n5018","loc":[-85.609826,41.95581]},"n5019":{"id":"n5019","loc":[-85.606987,41.958505]},"n502":{"id":"n502","loc":[-85.636279,41.940605]},"n5020":{"id":"n5020","loc":[-85.606498,41.958846]},"n5021":{"id":"n5021","loc":[-85.606013,41.959342]},"n5022":{"id":"n5022","loc":[-85.614553,41.961581]},"n5023":{"id":"n5023","loc":[-85.61465,41.96214]},"n5024":{"id":"n5024","loc":[-85.615277,41.962442]},"n5025":{"id":"n5025","loc":[-85.615451,41.962972]},"n5026":{"id":"n5026","loc":[-85.614355,41.964826]},"n5027":{"id":"n5027","loc":[-85.615133,41.964589]},"n5028":{"id":"n5028","loc":[-85.615342,41.963818]},"n5029":{"id":"n5029","loc":[-85.615971,41.963792]},"n503":{"id":"n503","loc":[-85.636285,41.940633]},"n5030":{"id":"n5030","loc":[-85.615751,41.963122]},"n5031":{"id":"n5031","loc":[-85.616575,41.963123]},"n5032":{"id":"n5032","loc":[-85.612527,41.963846]},"n5033":{"id":"n5033","loc":[-85.630653,41.940709]},"n5034":{"id":"n5034","loc":[-85.629858,41.939568]},"n5035":{"id":"n5035","loc":[-85.629847,41.937926]},"n504":{"id":"n504","loc":[-85.636281,41.940662]},"n505":{"id":"n505","loc":[-85.636266,41.940688]},"n506":{"id":"n506","loc":[-85.636236,41.940701]},"n507":{"id":"n507","loc":[-85.63619,41.940706]},"n508":{"id":"n508","loc":[-85.635892,41.940707]},"n509":{"id":"n509","loc":[-85.635777,41.9407]},"n51":{"id":"n51","loc":[-85.636673,41.942864]},"n510":{"id":"n510","loc":[-85.636044,41.940578]},"n511":{"id":"n511","loc":[-85.635946,41.940578]},"n512":{"id":"n512","loc":[-85.636475,41.940732]},"n513":{"id":"n513","loc":[-85.636475,41.940777]},"n514":{"id":"n514","loc":[-85.636405,41.940777]},"n515":{"id":"n515","loc":[-85.636405,41.940732]},"n516":{"id":"n516","loc":[-85.636471,41.940916]},"n517":{"id":"n517","loc":[-85.636471,41.940961]},"n518":{"id":"n518","loc":[-85.636404,41.940961]},"n519":{"id":"n519","loc":[-85.636404,41.940916]},"n52":{"id":"n52","loc":[-85.636227,41.942864]},"n520":{"id":"n520","loc":[-85.636286,41.941127]},"n521":{"id":"n521","loc":[-85.636203,41.941126]},"n522":{"id":"n522","loc":[-85.636204,41.941083]},"n523":{"id":"n523","loc":[-85.636287,41.941083]},"n524":{"id":"n524","loc":[-85.636124,41.941064]},"n525":{"id":"n525","loc":[-85.636,41.941065]},"n526":{"id":"n526","loc":[-85.636,41.940964]},"n527":{"id":"n527","loc":[-85.636045,41.940964]},"n528":{"id":"n528","loc":[-85.636045,41.940928]},"n529":{"id":"n529","loc":[-85.636111,41.940928]},"n53":{"id":"n53","loc":[-85.636227,41.943143]},"n530":{"id":"n530","loc":[-85.636111,41.940961]},"n531":{"id":"n531","loc":[-85.636123,41.940961]},"n532":{"id":"n532","loc":[-85.636124,41.940997]},"n533":{"id":"n533","loc":[-85.636164,41.940997]},"n534":{"id":"n534","loc":[-85.636164,41.941044]},"n535":{"id":"n535","loc":[-85.636124,41.941044]},"n536":{"id":"n536","loc":[-85.636534,41.941256]},"n537":{"id":"n537","loc":[-85.63645,41.941246]},"n538":{"id":"n538","loc":[-85.636462,41.941189]},"n539":{"id":"n539","loc":[-85.636546,41.941199]},"n54":{"id":"n54","loc":[-85.636198,41.943119]},"n540":{"id":"n540","loc":[-85.636802,41.941226]},"n541":{"id":"n541","loc":[-85.636701,41.941215]},"n542":{"id":"n542","loc":[-85.636709,41.941174]},"n543":{"id":"n543","loc":[-85.636656,41.941168]},"n544":{"id":"n544","loc":[-85.636666,41.941122]},"n545":{"id":"n545","loc":[-85.636781,41.941136]},"n546":{"id":"n546","loc":[-85.636774,41.94117]},"n547":{"id":"n547","loc":[-85.636812,41.941175]},"n548":{"id":"n548","loc":[-85.636803,41.941047]},"n549":{"id":"n549","loc":[-85.636785,41.941047]},"n55":{"id":"n55","loc":[-85.635945,41.94312]},"n550":{"id":"n550","loc":[-85.636785,41.941058]},"n551":{"id":"n551","loc":[-85.636644,41.941059]},"n552":{"id":"n552","loc":[-85.636644,41.941038]},"n553":{"id":"n553","loc":[-85.636581,41.941039]},"n554":{"id":"n554","loc":[-85.636581,41.940995]},"n555":{"id":"n555","loc":[-85.636746,41.940995]},"n556":{"id":"n556","loc":[-85.636746,41.940978]},"n557":{"id":"n557","loc":[-85.636803,41.940978]},"n558":{"id":"n558","loc":[-85.636781,41.940768]},"n559":{"id":"n559","loc":[-85.636783,41.940828]},"n56":{"id":"n56","loc":[-85.635943,41.942909]},"n560":{"id":"n560","loc":[-85.636761,41.940828]},"n561":{"id":"n561","loc":[-85.636762,41.940857]},"n562":{"id":"n562","loc":[-85.636641,41.940859]},"n563":{"id":"n563","loc":[-85.63664,41.940805]},"n564":{"id":"n564","loc":[-85.636676,41.940804]},"n565":{"id":"n565","loc":[-85.636675,41.940769]},"n566":{"id":"n566","loc":[-85.636733,41.94033]},"n567":{"id":"n567","loc":[-85.636471,41.940334]},"n568":{"id":"n568","loc":[-85.636469,41.940262]},"n569":{"id":"n569","loc":[-85.636731,41.940257]},"n57":{"id":"n57","loc":[-85.636227,41.942909]},"n570":{"id":"n570","loc":[-85.636798,41.940419]},"n571":{"id":"n571","loc":[-85.6368,41.940524]},"n572":{"id":"n572","loc":[-85.63664,41.940526]},"n573":{"id":"n573","loc":[-85.636638,41.940421]},"n574":{"id":"n574","loc":[-85.636372,41.940551]},"n575":{"id":"n575","loc":[-85.636338,41.94055]},"n576":{"id":"n576","loc":[-85.636339,41.940524]},"n577":{"id":"n577","loc":[-85.636373,41.940525]},"n578":{"id":"n578","loc":[-85.636388,41.940435]},"n579":{"id":"n579","loc":[-85.636222,41.940436]},"n58":{"id":"n58","loc":[-85.63627,41.943175]},"n580":{"id":"n580","loc":[-85.636222,41.940366]},"n581":{"id":"n581","loc":[-85.636387,41.940365]},"n582":{"id":"n582","loc":[-85.636158,41.940482]},"n583":{"id":"n583","loc":[-85.635963,41.940484]},"n584":{"id":"n584","loc":[-85.635961,41.940399]},"n585":{"id":"n585","loc":[-85.636156,41.940397]},"n586":{"id":"n586","loc":[-85.635987,41.940314]},"n587":{"id":"n587","loc":[-85.635987,41.940268]},"n588":{"id":"n588","loc":[-85.635968,41.940268]},"n589":{"id":"n589","loc":[-85.635967,41.940212]},"n59":{"id":"n59","loc":[-85.635531,41.943176]},"n590":{"id":"n590","loc":[-85.636082,41.940211]},"n591":{"id":"n591","loc":[-85.636083,41.94027]},"n592":{"id":"n592","loc":[-85.636064,41.94027]},"n593":{"id":"n593","loc":[-85.636064,41.940313]},"n594":{"id":"n594","loc":[-85.638071,41.941562]},"n595":{"id":"n595","loc":[-85.637953,41.941562]},"n596":{"id":"n596","loc":[-85.637952,41.941522]},"n597":{"id":"n597","loc":[-85.637876,41.941523]},"n598":{"id":"n598","loc":[-85.637876,41.941471]},"n599":{"id":"n599","loc":[-85.638035,41.94147]},"n6":{"id":"n6","loc":[-85.624925,41.950604]},"n60":{"id":"n60","loc":[-85.63542,41.942883]},"n600":{"id":"n600","loc":[-85.638035,41.941513]},"n601":{"id":"n601","loc":[-85.638071,41.941512]},"n602":{"id":"n602","loc":[-85.637038,41.942543],"tags":{"crossing":"zebra","highway":"crossing"}},"n603":{"id":"n603","loc":[-85.637134,41.942542]},"n604":{"id":"n604","loc":[-85.638122,41.942532]},"n605":{"id":"n605","loc":[-85.638121,41.942478]},"n606":{"id":"n606","loc":[-85.638104,41.941424]},"n607":{"id":"n607","loc":[-85.637115,41.941438]},"n608":{"id":"n608","loc":[-85.637133,41.942453]},"n609":{"id":"n609","loc":[-85.637429,41.942004]},"n61":{"id":"n61","loc":[-85.635701,41.942802]},"n610":{"id":"n610","loc":[-85.637125,41.942004]},"n611":{"id":"n611","loc":[-85.637022,41.942004]},"n612":{"id":"n612","loc":[-85.635952,41.943579]},"n613":{"id":"n613","loc":[-85.635872,41.943594]},"n614":{"id":"n614","loc":[-85.635857,41.943551]},"n615":{"id":"n615","loc":[-85.635937,41.943535]},"n616":{"id":"n616","loc":[-85.63671,41.94344]},"n617":{"id":"n617","loc":[-85.636427,41.94334]},"n618":{"id":"n618","loc":[-85.635353,41.943279]},"n619":{"id":"n619","loc":[-85.635319,41.943257]},"n62":{"id":"n62","loc":[-85.6358,41.942997]},"n620":{"id":"n620","loc":[-85.638786,41.943105]},"n621":{"id":"n621","loc":[-85.634957,41.943146]},"n622":{"id":"n622","loc":[-85.635012,41.943119]},"n623":{"id":"n623","loc":[-85.632409,41.944222]},"n624":{"id":"n624","loc":[-85.631863,41.944749]},"n625":{"id":"n625","loc":[-85.631915,41.944722]},"n626":{"id":"n626","loc":[-85.631884,41.94464]},"n627":{"id":"n627","loc":[-85.631792,41.944359]},"n628":{"id":"n628","loc":[-85.631817,41.944703]},"n629":{"id":"n629","loc":[-85.633464,41.945787]},"n63":{"id":"n63","loc":[-85.635808,41.943176]},"n630":{"id":"n630","loc":[-85.633583,41.945919]},"n631":{"id":"n631","loc":[-85.63382,41.945698]},"n632":{"id":"n632","loc":[-85.633681,41.945571]},"n633":{"id":"n633","loc":[-85.634217,41.946824]},"n634":{"id":"n634","loc":[-85.634271,41.946836]},"n635":{"id":"n635","loc":[-85.634319,41.94573]},"n636":{"id":"n636","loc":[-85.634377,41.945672]},"n637":{"id":"n637","loc":[-85.634909,41.945354]},"n638":{"id":"n638","loc":[-85.634726,41.945493],"tags":{"artwork_type":"mural","tourism":"artwork"}},"n639":{"id":"n639","loc":[-85.63546,41.945612]},"n64":{"id":"n64","loc":[-85.63631,41.943253]},"n640":{"id":"n640","loc":[-85.635561,41.945493]},"n641":{"id":"n641","loc":[-85.635417,41.945565]},"n642":{"id":"n642","loc":[-85.635315,41.945583]},"n643":{"id":"n643","loc":[-85.63506,41.945383]},"n644":{"id":"n644","loc":[-85.635198,41.945199]},"n645":{"id":"n645","loc":[-85.635361,41.94558]},"n646":{"id":"n646","loc":[-85.635017,41.945066]},"n647":{"id":"n647","loc":[-85.634779,41.945206]},"n648":{"id":"n648","loc":[-85.63425,41.945655]},"n649":{"id":"n649","loc":[-85.634247,41.945631]},"n65":{"id":"n65","loc":[-85.635398,41.943259]},"n650":{"id":"n650","loc":[-85.634889,41.945921]},"n651":{"id":"n651","loc":[-85.634889,41.945939]},"n652":{"id":"n652","loc":[-85.634889,41.945761]},"n653":{"id":"n653","loc":[-85.634889,41.945778]},"n654":{"id":"n654","loc":[-85.635112,41.945715]},"n655":{"id":"n655","loc":[-85.635025,41.945714]},"n656":{"id":"n656","loc":[-85.635027,41.945761]},"n657":{"id":"n657","loc":[-85.635438,41.945665]},"n658":{"id":"n658","loc":[-85.635416,41.945676]},"n659":{"id":"n659","loc":[-85.635401,41.945709]},"n66":{"id":"n66","loc":[-85.635336,41.943036]},"n660":{"id":"n660","loc":[-85.635271,41.945566]},"n661":{"id":"n661","loc":[-85.636106,41.946268]},"n662":{"id":"n662","loc":[-85.635867,41.946747]},"n663":{"id":"n663","loc":[-85.636476,41.946797]},"n664":{"id":"n664","loc":[-85.63651,41.946796]},"n665":{"id":"n665","loc":[-85.635367,41.946389]},"n666":{"id":"n666","loc":[-85.635367,41.946437]},"n667":{"id":"n667","loc":[-85.634787,41.946441]},"n668":{"id":"n668","loc":[-85.6358,41.946243]},"n669":{"id":"n669","loc":[-85.635784,41.94622]},"n67":{"id":"n67","loc":[-85.635911,41.942899]},"n670":{"id":"n670","loc":[-85.635727,41.946195]},"n671":{"id":"n671","loc":[-85.635708,41.946588]},"n672":{"id":"n672","loc":[-85.635648,41.946561]},"n673":{"id":"n673","loc":[-85.635624,41.946555]},"n674":{"id":"n674","loc":[-85.635417,41.946559]},"n675":{"id":"n675","loc":[-85.634866,41.946561]},"n676":{"id":"n676","loc":[-85.634866,41.946543]},"n677":{"id":"n677","loc":[-85.635085,41.946546]},"n678":{"id":"n678","loc":[-85.635085,41.946554]},"n679":{"id":"n679","loc":[-85.634584,41.94488]},"n68":{"id":"n68","loc":[-85.635915,41.943156]},"n680":{"id":"n680","loc":[-85.634557,41.944882]},"n681":{"id":"n681","loc":[-85.634455,41.944943]},"n682":{"id":"n682","loc":[-85.634305,41.944968]},"n683":{"id":"n683","loc":[-85.634261,41.944927]},"n684":{"id":"n684","loc":[-85.634132,41.944741]},"n685":{"id":"n685","loc":[-85.633705,41.944759]},"n686":{"id":"n686","loc":[-85.633918,41.944616]},"n687":{"id":"n687","loc":[-85.633974,41.944663]},"n688":{"id":"n688","loc":[-85.6336,41.944665]},"n689":{"id":"n689","loc":[-85.633817,41.944528]},"n69":{"id":"n69","loc":[-85.63631,41.943157]},"n690":{"id":"n690","loc":[-85.633889,41.944485]},"n691":{"id":"n691","loc":[-85.633931,41.944525]},"n692":{"id":"n692","loc":[-85.633864,41.944563]},"n693":{"id":"n693","loc":[-85.633456,41.944524]},"n694":{"id":"n694","loc":[-85.633676,41.944399]},"n695":{"id":"n695","loc":[-85.633352,41.944415]},"n696":{"id":"n696","loc":[-85.633655,41.944234]},"n697":{"id":"n697","loc":[-85.633761,41.94435]},"n698":{"id":"n698","loc":[-85.633254,41.944318]},"n699":{"id":"n699","loc":[-85.633472,41.944188]},"n7":{"id":"n7","loc":[-85.638791,41.943231]},"n70":{"id":"n70","loc":[-85.63579,41.942967]},"n700":{"id":"n700","loc":[-85.633524,41.944237]},"n701":{"id":"n701","loc":[-85.633583,41.944202]},"n702":{"id":"n702","loc":[-85.633632,41.944247]},"n703":{"id":"n703","loc":[-85.633165,41.944228]},"n704":{"id":"n704","loc":[-85.633388,41.944105]},"n705":{"id":"n705","loc":[-85.633117,41.944175]},"n706":{"id":"n706","loc":[-85.633302,41.944077]},"n707":{"id":"n707","loc":[-85.633352,41.944126]},"n708":{"id":"n708","loc":[-85.633052,41.944107]},"n709":{"id":"n709","loc":[-85.633237,41.944009]},"n71":{"id":"n71","loc":[-85.637506,41.942824]},"n710":{"id":"n710","loc":[-85.633187,41.943955]},"n711":{"id":"n711","loc":[-85.633,41.944054]},"n712":{"id":"n712","loc":[-85.633155,41.944265]},"n713":{"id":"n713","loc":[-85.633669,41.944765]},"n714":{"id":"n714","loc":[-85.634468,41.945503]},"n715":{"id":"n715","loc":[-85.63455,41.945566]},"n716":{"id":"n716","loc":[-85.634737,41.945729]},"n717":{"id":"n717","loc":[-85.634753,41.945752]},"n718":{"id":"n718","loc":[-85.634756,41.945781]},"n719":{"id":"n719","loc":[-85.634758,41.945978]},"n72":{"id":"n72","loc":[-85.637511,41.943056]},"n720":{"id":"n720","loc":[-85.634363,41.945548],"tags":{"crossing":"zebra","highway":"crossing"}},"n721":{"id":"n721","loc":[-85.634245,41.945599]},"n722":{"id":"n722","loc":[-85.633474,41.944889]},"n723":{"id":"n723","loc":[-85.632997,41.944418]},"n724":{"id":"n724","loc":[-85.63278,41.944183]},"n725":{"id":"n725","loc":[-85.63331,41.944429]},"n726":{"id":"n726","loc":[-85.633568,41.944829],"tags":{"crossing":"zebra","highway":"crossing"}},"n727":{"id":"n727","loc":[-85.634669,41.94567]},"n728":{"id":"n728","loc":[-85.634462,41.945787]},"n729":{"id":"n729","loc":[-85.634272,41.945625]},"n73":{"id":"n73","loc":[-85.637361,41.943058]},"n730":{"id":"n730","loc":[-85.634344,41.945699],"tags":{"crossing":"zebra","highway":"crossing"}},"n731":{"id":"n731","loc":[-85.634426,41.945783]},"n732":{"id":"n732","loc":[-85.632425,41.944137]},"n733":{"id":"n733","loc":[-85.632302,41.944192]},"n734":{"id":"n734","loc":[-85.632762,41.944174]},"n735":{"id":"n735","loc":[-85.632713,41.944179]},"n736":{"id":"n736","loc":[-85.632411,41.944327]},"n737":{"id":"n737","loc":[-85.632362,41.944341]},"n738":{"id":"n738","loc":[-85.632236,41.944204]},"n739":{"id":"n739","loc":[-85.634939,41.942165]},"n74":{"id":"n74","loc":[-85.637356,41.942825]},"n740":{"id":"n740","loc":[-85.635079,41.941535]},"n741":{"id":"n741","loc":[-85.635112,41.941595]},"n742":{"id":"n742","loc":[-85.635113,41.941633]},"n743":{"id":"n743","loc":[-85.635067,41.941652]},"n744":{"id":"n744","loc":[-85.634989,41.941651]},"n745":{"id":"n745","loc":[-85.634921,41.941609]},"n746":{"id":"n746","loc":[-85.634881,41.941544]},"n747":{"id":"n747","loc":[-85.635537,41.940939]},"n748":{"id":"n748","loc":[-85.635573,41.941048]},"n749":{"id":"n749","loc":[-85.635453,41.94091]},"n75":{"id":"n75","loc":[-85.638097,41.942833]},"n750":{"id":"n750","loc":[-85.635319,41.940943]},"n751":{"id":"n751","loc":[-85.637057,41.943224]},"n752":{"id":"n752","loc":[-85.636989,41.943296]},"n753":{"id":"n753","loc":[-85.636851,41.943299]},"n754":{"id":"n754","loc":[-85.636848,41.94322]},"n755":{"id":"n755","loc":[-85.636986,41.943217]},"n756":{"id":"n756","loc":[-85.637569,41.943454]},"n757":{"id":"n757","loc":[-85.637437,41.943458]},"n758":{"id":"n758","loc":[-85.637432,41.943384]},"n759":{"id":"n759","loc":[-85.637564,41.94338]},"n76":{"id":"n76","loc":[-85.638098,41.942912]},"n760":{"id":"n760","loc":[-85.637213,41.943378]},"n761":{"id":"n761","loc":[-85.637217,41.943435]},"n762":{"id":"n762","loc":[-85.637235,41.943434]},"n763":{"id":"n763","loc":[-85.637237,41.943465]},"n764":{"id":"n764","loc":[-85.637424,41.943459]},"n765":{"id":"n765","loc":[-85.637418,41.943371]},"n766":{"id":"n766","loc":[-85.638094,41.943149]},"n767":{"id":"n767","loc":[-85.638096,41.943201]},"n768":{"id":"n768","loc":[-85.638041,41.943202]},"n769":{"id":"n769","loc":[-85.638042,41.943216]},"n77":{"id":"n77","loc":[-85.637705,41.942913]},"n770":{"id":"n770","loc":[-85.637927,41.943218]},"n771":{"id":"n771","loc":[-85.637926,41.943201]},"n772":{"id":"n772","loc":[-85.637897,41.943201]},"n773":{"id":"n773","loc":[-85.637896,41.943155]},"n774":{"id":"n774","loc":[-85.637962,41.943153]},"n775":{"id":"n775","loc":[-85.637962,41.943134]},"n776":{"id":"n776","loc":[-85.638017,41.943132]},"n777":{"id":"n777","loc":[-85.638018,41.943151]},"n778":{"id":"n778","loc":[-85.638045,41.943289]},"n779":{"id":"n779","loc":[-85.638048,41.943363]},"n78":{"id":"n78","loc":[-85.637705,41.942834]},"n780":{"id":"n780","loc":[-85.637842,41.943367]},"n781":{"id":"n781","loc":[-85.637839,41.943296]},"n782":{"id":"n782","loc":[-85.637896,41.943295]},"n783":{"id":"n783","loc":[-85.637897,41.943314]},"n784":{"id":"n784","loc":[-85.637957,41.943312]},"n785":{"id":"n785","loc":[-85.637957,41.943291]},"n786":{"id":"n786","loc":[-85.637816,41.943375]},"n787":{"id":"n787","loc":[-85.637815,41.943416]},"n788":{"id":"n788","loc":[-85.637715,41.943415]},"n789":{"id":"n789","loc":[-85.637716,41.943374]},"n79":{"id":"n79","loc":[-85.638071,41.942298]},"n790":{"id":"n790","loc":[-85.637912,41.943545]},"n791":{"id":"n791","loc":[-85.637909,41.943479]},"n792":{"id":"n792","loc":[-85.637967,41.943477]},"n793":{"id":"n793","loc":[-85.637967,41.94346]},"n794":{"id":"n794","loc":[-85.638077,41.943457]},"n795":{"id":"n795","loc":[-85.638078,41.943473]},"n796":{"id":"n796","loc":[-85.638124,41.943471]},"n797":{"id":"n797","loc":[-85.638126,41.943514]},"n798":{"id":"n798","loc":[-85.638079,41.943515]},"n799":{"id":"n799","loc":[-85.638079,41.943532]},"n8":{"id":"n8","loc":[-85.635241,41.941948]},"n80":{"id":"n80","loc":[-85.638074,41.942431]},"n800":{"id":"n800","loc":[-85.638028,41.943534]},"n801":{"id":"n801","loc":[-85.638028,41.943542]},"n802":{"id":"n802","loc":[-85.638845,41.942983]},"n803":{"id":"n803","loc":[-85.638846,41.94305]},"n804":{"id":"n804","loc":[-85.638661,41.943052]},"n805":{"id":"n805","loc":[-85.63866,41.942984]},"n806":{"id":"n806","loc":[-85.638579,41.942753]},"n807":{"id":"n807","loc":[-85.638445,41.942755]},"n808":{"id":"n808","loc":[-85.638452,41.942978]},"n809":{"id":"n809","loc":[-85.638545,41.942976]},"n81":{"id":"n81","loc":[-85.637836,41.942433]},"n810":{"id":"n810","loc":[-85.638543,41.942935]},"n811":{"id":"n811","loc":[-85.638571,41.942934]},"n812":{"id":"n812","loc":[-85.63857,41.942901]},"n813":{"id":"n813","loc":[-85.638611,41.9429]},"n814":{"id":"n814","loc":[-85.638607,41.942769]},"n815":{"id":"n815","loc":[-85.63858,41.94277]},"n816":{"id":"n816","loc":[-85.638597,41.942614]},"n817":{"id":"n817","loc":[-85.638601,41.94273]},"n818":{"id":"n818","loc":[-85.638686,41.942731]},"n819":{"id":"n819","loc":[-85.638689,41.942917]},"n82":{"id":"n82","loc":[-85.637835,41.94242]},"n820":{"id":"n820","loc":[-85.638558,41.943018]},"n821":{"id":"n821","loc":[-85.638243,41.943019]},"n822":{"id":"n822","loc":[-85.637536,41.943887]},"n823":{"id":"n823","loc":[-85.63749,41.943926]},"n824":{"id":"n824","loc":[-85.63743,41.943886]},"n825":{"id":"n825","loc":[-85.637476,41.943847]},"n826":{"id":"n826","loc":[-85.637527,41.943846]},"n827":{"id":"n827","loc":[-85.637141,41.943728]},"n828":{"id":"n828","loc":[-85.637201,41.943755]},"n829":{"id":"n829","loc":[-85.636987,41.943608]},"n83":{"id":"n83","loc":[-85.63776,41.942421]},"n830":{"id":"n830","loc":[-85.637441,41.943807]},"n831":{"id":"n831","loc":[-85.637673,41.94399]},"n832":{"id":"n832","loc":[-85.637783,41.944137]},"n833":{"id":"n833","loc":[-85.63845,41.944333]},"n834":{"id":"n834","loc":[-85.638159,41.944248]},"n835":{"id":"n835","loc":[-85.637859,41.94416]},"n836":{"id":"n836","loc":[-85.638685,41.944542]},"n837":{"id":"n837","loc":[-85.638714,41.944611]},"n838":{"id":"n838","loc":[-85.638711,41.944757]},"n839":{"id":"n839","loc":[-85.638774,41.945069]},"n84":{"id":"n84","loc":[-85.637758,41.942339]},"n840":{"id":"n840","loc":[-85.638742,41.945205]},"n841":{"id":"n841","loc":[-85.640267,41.942403]},"n842":{"id":"n842","loc":[-85.640154,41.942404]},"n843":{"id":"n843","loc":[-85.640152,41.942249]},"n844":{"id":"n844","loc":[-85.640266,41.942248]},"n845":{"id":"n845","loc":[-85.640366,41.942599]},"n846":{"id":"n846","loc":[-85.640362,41.942192]},"n847":{"id":"n847","loc":[-85.640146,41.942191]},"n848":{"id":"n848","loc":[-85.640122,41.942196]},"n849":{"id":"n849","loc":[-85.640108,41.942211]},"n85":{"id":"n85","loc":[-85.637836,41.942339]},"n850":{"id":"n850","loc":[-85.640101,41.942236]},"n851":{"id":"n851","loc":[-85.640103,41.94241]},"n852":{"id":"n852","loc":[-85.64011,41.942435]},"n853":{"id":"n853","loc":[-85.640126,41.942445]},"n854":{"id":"n854","loc":[-85.640153,41.942451]},"n855":{"id":"n855","loc":[-85.640183,41.942452]},"n856":{"id":"n856","loc":[-85.640364,41.942452]},"n857":{"id":"n857","loc":[-85.640007,41.942452]},"n858":{"id":"n858","loc":[-85.639449,41.942461]},"n859":{"id":"n859","loc":[-85.640049,41.942391]},"n86":{"id":"n86","loc":[-85.637835,41.942301]},"n860":{"id":"n860","loc":[-85.640052,41.942503]},"n861":{"id":"n861","loc":[-85.639575,41.94251]},"n862":{"id":"n862","loc":[-85.639572,41.942398]},"n863":{"id":"n863","loc":[-85.638782,41.942227]},"n864":{"id":"n864","loc":[-85.63843,41.942226]},"n865":{"id":"n865","loc":[-85.63823,41.942183]},"n866":{"id":"n866","loc":[-85.638363,41.942216],"tags":{"barrier":"gate"}},"n867":{"id":"n867","loc":[-85.6384,41.942223]},"n868":{"id":"n868","loc":[-85.636042,41.942797]},"n869":{"id":"n869","loc":[-85.636308,41.942752]},"n87":{"id":"n87","loc":[-85.637566,41.942367]},"n870":{"id":"n870","loc":[-85.636516,41.942729]},"n871":{"id":"n871","loc":[-85.636782,41.942712]},"n872":{"id":"n872","loc":[-85.636944,41.942706]},"n873":{"id":"n873","loc":[-85.63704,41.942706]},"n874":{"id":"n874","loc":[-85.637237,41.942703]},"n875":{"id":"n875","loc":[-85.637553,41.9427]},"n876":{"id":"n876","loc":[-85.638236,41.942697]},"n877":{"id":"n877","loc":[-85.636284,41.942781]},"n878":{"id":"n878","loc":[-85.636551,41.942641]},"n879":{"id":"n879","loc":[-85.633914,41.943693]},"n88":{"id":"n88","loc":[-85.637566,41.94241]},"n880":{"id":"n880","loc":[-85.63389,41.943708]},"n881":{"id":"n881","loc":[-85.633866,41.943686]},"n882":{"id":"n882","loc":[-85.63389,41.943671]},"n883":{"id":"n883","loc":[-85.633857,41.943609]},"n884":{"id":"n884","loc":[-85.634858,41.944474]},"n885":{"id":"n885","loc":[-85.633988,41.943234]},"n886":{"id":"n886","loc":[-85.633999,41.943485]},"n887":{"id":"n887","loc":[-85.634109,41.943449],"tags":{"emergency":"fire_hydrant"}},"n888":{"id":"n888","loc":[-85.635728,41.942655],"tags":{"emergency":"fire_hydrant"}},"n889":{"id":"n889","loc":[-85.636499,41.942845],"tags":{"man_made":"flagpole"}},"n89":{"id":"n89","loc":[-85.637455,41.94241]},"n890":{"id":"n890","loc":[-85.636197,41.943073]},"n891":{"id":"n891","loc":[-85.636227,41.943073]},"n892":{"id":"n892","loc":[-85.637433,41.942933],"tags":{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"restaurant","cuisine":"pizza","name":"Pizza Hut"}},"n893":{"id":"n893","loc":[-85.637907,41.942879],"tags":{"amenity":"car_wash"}},"n894":{"id":"n894","loc":[-85.637661,41.943018]},"n895":{"id":"n895","loc":[-85.636933,41.942733],"tags":{"emergency":"fire_hydrant"}},"n896":{"id":"n896","loc":[-85.637661,41.94304]},"n897":{"id":"n897","loc":[-85.637562,41.943041]},"n898":{"id":"n898","loc":[-85.637556,41.942725]},"n899":{"id":"n899","loc":[-85.637656,41.942724]},"n9":{"id":"n9","loc":[-85.635159,41.941926]},"n90":{"id":"n90","loc":[-85.637454,41.942367]},"n900":{"id":"n900","loc":[-85.637657,41.942779]},"n901":{"id":"n901","loc":[-85.637983,41.942777]},"n902":{"id":"n902","loc":[-85.637982,41.942616]},"n903":{"id":"n903","loc":[-85.637777,41.942778]},"n904":{"id":"n904","loc":[-85.637775,41.942699]},"n905":{"id":"n905","loc":[-85.637772,41.942618]},"n906":{"id":"n906","loc":[-85.637982,41.942698]},"n907":{"id":"n907","loc":[-85.637941,41.942378],"tags":{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Gem Pawnbroker","shop":"pawnbroker"}},"n908":{"id":"n908","loc":[-85.637515,41.942394],"tags":{"second_hand":"only","shop":"car"}},"n909":{"id":"n909","loc":[-85.638743,41.942374],"tags":{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes","shop":"car_repair"}},"n91":{"id":"n91","loc":[-85.637565,41.942341]},"n910":{"id":"n910","loc":[-85.638594,41.942357]},"n911":{"id":"n911","loc":[-85.634312,41.943562],"tags":{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"cafe","cuisine":"coffee_shop","name":"L.A.'s Coffee Cafe","outdoor_seating":"yes"}},"n912":{"id":"n912","loc":[-85.634404,41.943512]},"n913":{"id":"n913","loc":[-85.634391,41.943519],"tags":{"entrance":"yes"}},"n914":{"id":"n914","loc":[-85.634259,41.943538],"tags":{"entrance":"yes"}},"n915":{"id":"n915","loc":[-85.634247,41.943528]},"n916":{"id":"n916","loc":[-85.633747,41.943322],"tags":{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Preferred Insurance Services","office":"insurance"}},"n917":{"id":"n917","loc":[-85.63299,41.943686],"tags":{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lynn's Garage","service:vehicle:tyres":"yes","shop":"car_repair"}},"n918":{"id":"n918","loc":[-85.633438,41.944883]},"n919":{"id":"n919","loc":[-85.633265,41.944983]},"n92":{"id":"n92","loc":[-85.637481,41.942341]},"n920":{"id":"n920","loc":[-85.633315,41.945027]},"n921":{"id":"n921","loc":[-85.633376,41.944827]},"n922":{"id":"n922","loc":[-85.633199,41.944922]},"n923":{"id":"n923","loc":[-85.633316,41.944772]},"n924":{"id":"n924","loc":[-85.633147,41.944867]},"n925":{"id":"n925","loc":[-85.633261,41.944719]},"n926":{"id":"n926","loc":[-85.633096,41.944812]},"n927":{"id":"n927","loc":[-85.633191,41.944645]},"n928":{"id":"n928","loc":[-85.632981,41.94476]},"n929":{"id":"n929","loc":[-85.633062,41.94483]},"n93":{"id":"n93","loc":[-85.637481,41.94226]},"n930":{"id":"n930","loc":[-85.633146,41.944602]},"n931":{"id":"n931","loc":[-85.632969,41.944703]},"n932":{"id":"n932","loc":[-85.633008,41.944745]},"n933":{"id":"n933","loc":[-85.633088,41.944545]},"n934":{"id":"n934","loc":[-85.632868,41.944655]},"n935":{"id":"n935","loc":[-85.632941,41.944718]},"n936":{"id":"n936","loc":[-85.633028,41.944483]},"n937":{"id":"n937","loc":[-85.632817,41.944605]},"n938":{"id":"n938","loc":[-85.632923,41.944373]},"n939":{"id":"n939","loc":[-85.632692,41.944485]},"n94":{"id":"n94","loc":[-85.637565,41.94226]},"n940":{"id":"n940","loc":[-85.632871,41.944316]},"n941":{"id":"n941","loc":[-85.632655,41.944421]},"n942":{"id":"n942","loc":[-85.632711,41.944478]},"n943":{"id":"n943","loc":[-85.632825,41.94426]},"n944":{"id":"n944","loc":[-85.632606,41.944363]},"n945":{"id":"n945","loc":[-85.63275,41.94418]},"n946":{"id":"n946","loc":[-85.632588,41.944256]},"n947":{"id":"n947","loc":[-85.632611,41.944279]},"n948":{"id":"n948","loc":[-85.632548,41.944306]},"n949":{"id":"n949","loc":[-85.632512,41.944406]},"n95":{"id":"n95","loc":[-85.637188,41.942217]},"n950":{"id":"n950","loc":[-85.632565,41.944463]},"n951":{"id":"n951","loc":[-85.632579,41.944456]},"n952":{"id":"n952","loc":[-85.632634,41.944518]},"n953":{"id":"n953","loc":[-85.632686,41.944569]},"n954":{"id":"n954","loc":[-85.632745,41.944537]},"n955":{"id":"n955","loc":[-85.632659,41.944587]},"n956":{"id":"n956","loc":[-85.632778,41.944705]},"n957":{"id":"n957","loc":[-85.632815,41.944301],"tags":{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Access Point Employment","office":"employment_agency"}},"n958":{"id":"n958","loc":[-85.6332,41.944174],"tags":{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paisley Emporium","shop":"second_hand"}},"n959":{"id":"n959","loc":[-85.633578,41.944568],"tags":{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lowry's Books","shop":"books"}},"n96":{"id":"n96","loc":[-85.637189,41.942303]},"n960":{"id":"n960","loc":[-85.63344,41.944443],"tags":{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"restaurant","cuisine":"pizza","name":"Paisano's Bar and Grill"}},"n961":{"id":"n961","loc":[-85.633009,41.944542],"tags":{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"cafe","cuisine":"american","internet_access":"yes","name":"Main Street Cafe"}},"n962":{"id":"n962","loc":[-85.633674,41.944682],"tags":{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Fitness"}},"n963":{"id":"n963","loc":[-85.633376,41.944868],"tags":{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Barbell"}},"n964":{"id":"n964","loc":[-85.633366,41.944783]},"n965":{"id":"n965","loc":[-85.633296,41.94482]},"n966":{"id":"n966","loc":[-85.633214,41.94487]},"n967":{"id":"n967","loc":[-85.633005,41.944988]},"n968":{"id":"n968","loc":[-85.633269,41.944816]},"n969":{"id":"n969","loc":[-85.633215,41.944842]},"n97":{"id":"n97","loc":[-85.637299,41.942302]},"n970":{"id":"n970","loc":[-85.633245,41.944871]},"n971":{"id":"n971","loc":[-85.633296,41.944845]},"n972":{"id":"n972","loc":[-85.633254,41.944845],"tags":{"natural":"tree"}},"n973":{"id":"n973","loc":[-85.633557,41.945515]},"n974":{"id":"n974","loc":[-85.633279,41.945246]},"n975":{"id":"n975","loc":[-85.63324,41.945226]},"n976":{"id":"n976","loc":[-85.6332,41.945213]},"n977":{"id":"n977","loc":[-85.633133,41.945164]},"n978":{"id":"n978","loc":[-85.63312,41.945132]},"n979":{"id":"n979","loc":[-85.633095,41.945081]},"n98":{"id":"n98","loc":[-85.637299,41.942314]},"n980":{"id":"n980","loc":[-85.633064,41.945047]},"n981":{"id":"n981","loc":[-85.632739,41.944742]},"n982":{"id":"n982","loc":[-85.633281,41.945026]},"n983":{"id":"n983","loc":[-85.633155,41.944903]},"n984":{"id":"n984","loc":[-85.633079,41.944829]},"n985":{"id":"n985","loc":[-85.63304,41.944853]},"n986":{"id":"n986","loc":[-85.632949,41.944776]},"n987":{"id":"n987","loc":[-85.632921,41.944725]},"n988":{"id":"n988","loc":[-85.632859,41.944673]},"n989":{"id":"n989","loc":[-85.632895,41.94505]},"n99":{"id":"n99","loc":[-85.637396,41.942313]},"n990":{"id":"n990","loc":[-85.633336,41.945138]},"n991":{"id":"n991","loc":[-85.633466,41.945265]},"n992":{"id":"n992","loc":[-85.633367,41.945327]},"n993":{"id":"n993","loc":[-85.633163,41.945189]},"n994":{"id":"n994","loc":[-85.633678,41.945309]},"n995":{"id":"n995","loc":[-85.633619,41.945261]},"n996":{"id":"n996","loc":[-85.63355,41.945301]},"n997":{"id":"n997","loc":[-85.633607,41.945352]},"n998":{"id":"n998","loc":[-85.633579,41.945327],"tags":{"entrance":"yes"}},"n999":{"id":"n999","loc":[-85.633445,41.945404]},"r2":{"id":"r2","members":[{"id":"w225","role":"outer","type":"way"}],"tags":{"type":"multipolygon","waterway":"riverbank"}},"r5":{"id":"r5","members":[{"id":"w642","role":"outer","type":"way"}],"tags":{"admin_level":"8","border_type":"city","boundary":"administrative","name":"Three Rivers","place":"city","type":"boundary"}},"w1":{"id":"w1","nodes":["n5","n1797"],"tags":{"highway":"residential","name":"12th Avenue"}},"w10":{"id":"w10","nodes":["n54","n55","n56","n57","n891","n890","n54"],"tags":{"building":"yes"}},"w100":{"id":"w100","nodes":["n451","n915","n452"],"tags":{"highway":"footway"}},"w101":{"id":"w101","nodes":["n461","n462","n463","n464","n465","n466"],"tags":{"barrier":"fence"}},"w102":{"id":"w102","nodes":["n467","n468","n469","n470","n472","n467"],"tags":{"amenity":"parking"}},"w103":{"id":"w103","nodes":["n2597","n2444","n471","n472"],"tags":{"highway":"footway"}},"w104":{"id":"w104","nodes":["n473","n474","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w105":{"id":"w105","nodes":["n475","n324","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w106":{"id":"w106","nodes":["n886","n452","n476"],"tags":{"footway":"sidewalk","highway":"footway"}},"w107":{"id":"w107","nodes":["n485","n4678","n486","n18"],"tags":{"highway":"service"}},"w108":{"id":"w108","nodes":["n300","n487","n488","n489","n490"],"tags":{"highway":"footway"}},"w109":{"id":"w109","nodes":["n490","n491"],"tags":{"highway":"footway"}},"w11":{"id":"w11","nodes":["n58","n63","n59","n315","n60"],"tags":{"highway":"service"}},"w110":{"id":"w110","nodes":["n492","n493","n494","n495","n496","n497","n492"],"tags":{"building":"yes"}},"w111":{"id":"w111","nodes":["n498","n499","n511"],"tags":{"highway":"service"}},"w112":{"id":"w112","nodes":["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],"tags":{"highway":"service"}},"w113":{"id":"w113","nodes":["n511","n510"],"tags":{"covered":"yes","highway":"service"}},"w114":{"id":"w114","nodes":["n512","n513","n514","n515","n512"],"tags":{"building":"yes"}},"w115":{"id":"w115","nodes":["n516","n517","n518","n519","n516"],"tags":{"building":"yes"}},"w116":{"id":"w116","nodes":["n520","n521","n522","n523","n520"],"tags":{"building":"yes"}},"w117":{"id":"w117","nodes":["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],"tags":{"building":"yes"}},"w118":{"id":"w118","nodes":["n536","n537","n538","n539","n536"],"tags":{"building":"yes"}},"w119":{"id":"w119","nodes":["n540","n541","n542","n543","n544","n545","n546","n547","n540"],"tags":{"building":"yes"}},"w12":{"id":"w12","nodes":["n61","n314","n70","n62","n63"],"tags":{"highway":"service"}},"w120":{"id":"w120","nodes":["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],"tags":{"building":"yes"}},"w121":{"id":"w121","nodes":["n558","n559","n560","n561","n562","n563","n564","n565","n558"],"tags":{"building":"yes"}},"w122":{"id":"w122","nodes":["n566","n567","n568","n569","n566"],"tags":{"building":"yes"}},"w123":{"id":"w123","nodes":["n570","n571","n572","n573","n570"],"tags":{"building":"yes"}},"w124":{"id":"w124","nodes":["n574","n575","n576","n577","n574"],"tags":{"building":"yes"}},"w125":{"id":"w125","nodes":["n578","n579","n580","n581","n578"],"tags":{"building":"yes"}},"w126":{"id":"w126","nodes":["n582","n583","n584","n585","n582"],"tags":{"building":"yes"}},"w127":{"id":"w127","nodes":["n586","n587","n588","n589","n590","n591","n592","n593","n586"],"tags":{"building":"yes"}},"w128":{"id":"w128","nodes":["n594","n595","n596","n597","n598","n599","n600","n601","n594"],"tags":{"building":"yes"}},"w129":{"id":"w129","nodes":["n309","n602","n603"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w13":{"id":"w13","nodes":["n64","n65","n66","n67","n68","n69","n64"],"tags":{"amenity":"parking"}},"w130":{"id":"w130","nodes":["n603","n604"],"tags":{"footway":"sidewalk","highway":"footway"}},"w131":{"id":"w131","nodes":["n604","n605","n606"],"tags":{"footway":"sidewalk","highway":"footway"}},"w132":{"id":"w132","nodes":["n606","n607"],"tags":{"footway":"sidewalk","highway":"footway"}},"w133":{"id":"w133","nodes":["n607","n610","n608","n603"],"tags":{"footway":"sidewalk","highway":"footway"}},"w134":{"id":"w134","nodes":["n609","n610","n611"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w135":{"id":"w135","nodes":["n244","n245","n246"],"tags":{"highway":"service"}},"w136":{"id":"w136","nodes":["n612","n613","n614","n615","n612"],"tags":{"amenity":"shelter"}},"w137":{"id":"w137","nodes":["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],"tags":{"highway":"residential","name":"Foster Street"}},"w138":{"id":"w138","nodes":["n2779","n625","n626","n627"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w139":{"id":"w139","nodes":["n630","n631","n632","n2437"],"tags":{"highway":"service"}},"w14":{"id":"w14","nodes":["n71","n72","n73","n74","n71"],"tags":{"building":"yes"}},"w140":{"id":"w140","nodes":["n643","n637","n715","n2410"],"tags":{"highway":"footway","name":"Mural Mall"}},"w141":{"id":"w141","nodes":["n639","n2516"],"tags":{"barrier":"wall"}},"w142":{"id":"w142","nodes":["n640","n641","n645","n642","n660","n643","n644"],"tags":{"highway":"service"}},"w143":{"id":"w143","nodes":["n646","n647"],"tags":{"highway":"service"}},"w144":{"id":"w144","nodes":["n654","n655","n656"],"tags":{"barrier":"wall"}},"w145":{"id":"w145","nodes":["n665","n666","n667"],"tags":{"barrier":"wall"}},"w146":{"id":"w146","nodes":["n2727","n662","n2719"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w147":{"id":"w147","nodes":["n2725","n674"],"tags":{"highway":"service","oneway":"yes"}},"w148":{"id":"w148","nodes":["n2464","n2460","n2454","n684","n2455","n2464"],"tags":{"building":"yes"}},"w149":{"id":"w149","nodes":["n2456","n685","n686","n687","n2456"],"tags":{"building":"yes"}},"w15":{"id":"w15","nodes":["n75","n76","n77","n78","n75"],"tags":{"building":"yes"}},"w150":{"id":"w150","nodes":["n685","n688","n689","n690","n691","n692","n686","n685"],"tags":{"building":"yes"}},"w151":{"id":"w151","nodes":["n688","n693","n694","n689","n688"],"tags":{"building":"yes"}},"w152":{"id":"w152","nodes":["n693","n695","n702","n696","n697","n694","n693"],"tags":{"building":"yes"}},"w153":{"id":"w153","nodes":["n695","n698","n699","n700","n701","n702","n695"],"tags":{"building":"yes"}},"w154":{"id":"w154","nodes":["n698","n703","n707","n704","n699","n698"],"tags":{"building":"yes"}},"w155":{"id":"w155","nodes":["n703","n705","n706","n707","n703"],"tags":{"building":"yes"}},"w156":{"id":"w156","nodes":["n705","n708","n709","n706","n705"],"tags":{"building":"yes"}},"w157":{"id":"w157","nodes":["n709","n710","n711","n708","n709"],"tags":{"building":"yes"}},"w158":{"id":"w158","nodes":["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w159":{"id":"w159","nodes":["n714","n720","n721"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w16":{"id":"w16","nodes":["n79","n80","n81","n82","n83","n84","n85","n86","n79"],"tags":{"building":"yes"}},"w160":{"id":"w160","nodes":["n729","n721","n722","n964","n723","n724"],"tags":{"footway":"sidewalk","highway":"footway"}},"w161":{"id":"w161","nodes":["n713","n726","n722"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w164":{"id":"w164","nodes":["n365","n732","n733","n738"],"tags":{"footway":"sidewalk","highway":"footway"}},"w165":{"id":"w165","nodes":["n724","n734","n367","n735","n736","n737"],"tags":{"footway":"sidewalk","highway":"footway"}},"w166":{"id":"w166","nodes":["n739","n2037","n2038","n2039","n2040","n1623","n2032"],"tags":{"highway":"footway"}},"w167":{"id":"w167","nodes":["n150","n751"],"tags":{"highway":"service"}},"w168":{"id":"w168","nodes":["n752","n753","n754","n755","n752"],"tags":{"building":"yes"}},"w169":{"id":"w169","nodes":["n756","n757","n758","n759","n756"],"tags":{"building":"yes"}},"w17":{"id":"w17","nodes":["n87","n88","n89","n90","n87"],"tags":{"building":"yes"}},"w170":{"id":"w170","nodes":["n760","n761","n762","n763","n764","n765","n760"],"tags":{"building":"yes"}},"w171":{"id":"w171","nodes":["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],"tags":{"building":"yes"}},"w172":{"id":"w172","nodes":["n778","n779","n780","n781","n782","n783","n784","n785","n778"],"tags":{"building":"yes"}},"w173":{"id":"w173","nodes":["n786","n787","n788","n789","n786"],"tags":{"building":"yes"}},"w174":{"id":"w174","nodes":["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],"tags":{"building":"yes"}},"w175":{"id":"w175","nodes":["n802","n803","n804","n805","n802"],"tags":{"building":"yes"}},"w176":{"id":"w176","nodes":["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],"tags":{"building":"yes"}},"w177":{"id":"w177","nodes":["n816","n1140","n817","n818","n819","n820","n821"],"tags":{"highway":"service"}},"w178":{"id":"w178","nodes":["n822","n823","n824","n825","n822"],"tags":{"building":"yes"}},"w179":{"id":"w179","nodes":["n841","n842","n843","n844","n841"],"tags":{"building":"yes"}},"w18":{"id":"w18","nodes":["n91","n92","n93","n94","n91"],"tags":{"building":"yes"}},"w180":{"id":"w180","nodes":["n845","n856","n846"],"tags":{"highway":"service"}},"w181":{"id":"w181","nodes":["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],"tags":{"highway":"service","oneway":"yes","service":"drive-through"}},"w182":{"id":"w182","nodes":["n857","n858"],"tags":{"highway":"service"}},"w183":{"id":"w183","nodes":["n859","n860","n861","n862","n859"],"tags":{"amenity":"parking"}},"w184":{"id":"w184","nodes":["n863","n864","n867","n866","n865"],"tags":{"highway":"service"}},"w185":{"id":"w185","nodes":["n883","n884"],"tags":{"barrier":"fence"}},"w186":{"id":"w186","nodes":["n1954","n622","n1955"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w187":{"id":"w187","nodes":["n621","n1954"],"tags":{"highway":"steps","incline":"up","name":"Riverwalk Trail","surface":"wood"}},"w188":{"id":"w188","nodes":["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"wood"}},"w189":{"id":"w189","nodes":["n2273","n2274"],"tags":{"highway":"steps","incline":"down","name":"Riverwalk Trail","surface":"wood"}},"w19":{"id":"w19","nodes":["n95","n96","n97","n98","n99","n100","n101","n102","n95"],"tags":{"building":"yes"}},"w190":{"id":"w190","nodes":["n821","n894","n900","n903","n901"],"tags":{"highway":"service"}},"w191":{"id":"w191","nodes":["n896","n897","n898","n899","n900","n894","n896"],"tags":{"amenity":"parking"}},"w192":{"id":"w192","nodes":["n903","n904","n905"],"tags":{"highway":"service"}},"w193":{"id":"w193","nodes":["n901","n906","n902"],"tags":{"highway":"service"}},"w194":{"id":"w194","nodes":["n912","n913"],"tags":{"highway":"footway"}},"w195":{"id":"w195","nodes":["n914","n915"],"tags":{"highway":"footway"}},"w196":{"id":"w196","nodes":["n2466","n918","n919","n920","n2466"],"tags":{"building":"yes"}},"w197":{"id":"w197","nodes":["n918","n921","n922","n919","n918"],"tags":{"building":"yes"}},"w198":{"id":"w198","nodes":["n923","n925","n926","n924","n923"],"tags":{"building":"yes"}},"w199":{"id":"w199","nodes":["n925","n927","n932","n928","n929","n926","n925"],"tags":{"building":"yes"}},"w2":{"id":"w2","nodes":["n3523","n2182","n2160"],"tags":{"highway":"service"}},"w20":{"id":"w20","nodes":["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],"tags":{"building":"yes"}},"w200":{"id":"w200","nodes":["n927","n930","n931","n932","n927"],"tags":{"building":"yes"}},"w201":{"id":"w201","nodes":["n930","n933","n934","n935","n931","n930"],"tags":{"building":"yes"}},"w202":{"id":"w202","nodes":["n933","n936","n937","n934","n933"],"tags":{"building":"yes"}},"w203":{"id":"w203","nodes":["n936","n938","n942","n939","n954","n937","n936"],"tags":{"building":"yes"}},"w204":{"id":"w204","nodes":["n938","n940","n941","n942","n938"],"tags":{"building":"yes"}},"w205":{"id":"w205","nodes":["n940","n943","n944","n941","n940"],"tags":{"building":"yes"}},"w206":{"id":"w206","nodes":["n943","n945","n946","n947","n948","n944","n943"],"tags":{"building":"yes"}},"w207":{"id":"w207","nodes":["n944","n949","n950","n951","n941","n944"],"tags":{"building":"yes"}},"w208":{"id":"w208","nodes":["n941","n951","n952","n939","n942","n941"],"tags":{"building":"yes"}},"w209":{"id":"w209","nodes":["n952","n953","n954","n939","n952"],"tags":{"building":"yes"}},"w21":{"id":"w21","nodes":["n115","n116","n117","n118","n115"],"tags":{"building":"yes"}},"w210":{"id":"w210","nodes":["n953","n955","n956","n934","n937","n954","n953"],"tags":{"building":"yes"}},"w211":{"id":"w211","nodes":["n964","n965"],"tags":{"highway":"footway"}},"w212":{"id":"w212","nodes":["n966","n983","n967","n989"],"tags":{"highway":"footway"}},"w213":{"id":"w213","nodes":["n965","n968","n969","n966","n970","n971","n965"],"tags":{"highway":"footway"}},"w214":{"id":"w214","nodes":["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],"tags":{"footway":"sidewalk","highway":"footway"}},"w215":{"id":"w215","nodes":["n978","n982","n983","n984","n985","n986","n987","n988","n981"],"tags":{"highway":"footway"}},"w216":{"id":"w216","nodes":["n976","n990","n991","n992"],"tags":{"highway":"footway"}},"w217":{"id":"w217","nodes":["n998","n999"],"tags":{"highway":"footway"}},"w218":{"id":"w218","nodes":["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],"tags":{"footway":"sidewalk","highway":"footway"}},"w219":{"id":"w219","nodes":["n719","n1026","n1027"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w22":{"id":"w22","nodes":["n119","n120","n121","n122","n119"],"tags":{"building":"yes"}},"w220":{"id":"w220","nodes":["n1027","n1028","n1019"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w221":{"id":"w221","nodes":["n2080","n1828","n1863","n1829"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w222":{"id":"w222","nodes":["n1029","n1030","n1031"],"tags":{"highway":"service"}},"w223":{"id":"w223","nodes":["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],"tags":{"name":"Rocky River","waterway":"river"}},"w224":{"id":"w224","nodes":["n3750","n3751","n3752"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w225":{"id":"w225","nodes":["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},"w226":{"id":"w226","nodes":["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w227":{"id":"w227","nodes":["n2994","n3012","n3011","n2958"],"tags":{"highway":"secondary","name":"Main Street"}},"w228":{"id":"w228","nodes":["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],"tags":{"highway":"primary","name":"Main Street"}},"w229":{"id":"w229","nodes":["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w23":{"id":"w23","nodes":["n123","n124","n125","n126","n123"],"tags":{"building":"yes"}},"w230":{"id":"w230","nodes":["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],"tags":{"name":"Saint Joseph River","waterway":"river"}},"w231":{"id":"w231","nodes":["n456","n1036","n1037","n1038"],"tags":{"barrier":"wall"}},"w232":{"id":"w232","nodes":["n1034","n1039","n1040"],"tags":{"barrier":"wall"}},"w233":{"id":"w233","nodes":["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],"tags":{"access":"private","leisure":"swimming_pool"}},"w234":{"id":"w234","nodes":["n1047","n1048"],"tags":{"barrier":"hedge"}},"w235":{"id":"w235","nodes":["n1049","n1050","n1051","n1052","n1049"],"tags":{"building":"yes"}},"w236":{"id":"w236","nodes":["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],"tags":{"building":"yes"}},"w237":{"id":"w237","nodes":["n1061","n1062","n1063","n1064","n1065","n1061"],"tags":{"building":"yes"}},"w238":{"id":"w238","nodes":["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],"tags":{"building":"yes"}},"w239":{"id":"w239","nodes":["n1072","n1073","n1074","n1075","n1072"],"tags":{"building":"yes"}},"w24":{"id":"w24","nodes":["n127","n128","n129","n130","n127"],"tags":{"building":"yes"}},"w240":{"id":"w240","nodes":["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],"tags":{"building":"yes"}},"w241":{"id":"w241","nodes":["n1082","n1083","n1084","n1085","n1082"],"tags":{"building":"yes"}},"w242":{"id":"w242","nodes":["n1086","n1087","n1088","n1089","n1086"],"tags":{"building":"yes"}},"w243":{"id":"w243","nodes":["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],"tags":{"building":"yes"}},"w244":{"id":"w244","nodes":["n1098","n1099","n1100","n1101"],"tags":{"barrier":"fence"}},"w245":{"id":"w245","nodes":["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],"tags":{"highway":"service"}},"w246":{"id":"w246","nodes":["n1103","n1139","n1104"],"tags":{"barrier":"fence"}},"w247":{"id":"w247","nodes":["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],"tags":{"building":"yes"}},"w248":{"id":"w248","nodes":["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],"tags":{"building":"yes"}},"w249":{"id":"w249","nodes":["n1121","n1122","n1123","n1124","n1121"],"tags":{"building":"yes"}},"w25":{"id":"w25","nodes":["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],"tags":{"building":"yes"}},"w250":{"id":"w250","nodes":["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],"tags":{"building":"yes"}},"w251":{"id":"w251","nodes":["n1137","n1138","n1139"],"tags":{"barrier":"fence"}},"w252":{"id":"w252","nodes":["n876","n1140","n1141"],"tags":{"footway":"sidewalk","highway":"footway"}},"w253":{"id":"w253","nodes":["n1141","n1142","n1143","n1144","n1145","n1146"],"tags":{"footway":"sidewalk","highway":"footway"}},"w254":{"id":"w254","nodes":["n1146","n4743","n1147","n1148"],"tags":{"footway":"sidewalk","highway":"footway"}},"w255":{"id":"w255","nodes":["n1148","n1149","n1150","n1151"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w256":{"id":"w256","nodes":["n1151","n1153","n1154","n1155"],"tags":{"footway":"sidewalk","highway":"footway"}},"w257":{"id":"w257","nodes":["n1155","n1156"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w258":{"id":"w258","nodes":["n1157","n1158"],"tags":{"barrier":"retaining_wall"}},"w259":{"id":"w259","nodes":["n1156","n1161","n1159","n1160","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w26":{"id":"w26","nodes":["n143","n608","n144"],"tags":{"highway":"service"}},"w260":{"id":"w260","nodes":["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],"tags":{"highway":"footway"}},"w261":{"id":"w261","nodes":["n1171","n1172","n1173"],"tags":{"barrier":"wall"}},"w262":{"id":"w262","nodes":["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],"tags":{"natural":"wood"}},"w263":{"id":"w263","nodes":["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w264":{"id":"w264","nodes":["n1186","n1187","n1188","n1189","n1186"],"tags":{"building":"yes"}},"w265":{"id":"w265","nodes":["n1190","n1191","n1192","n1193","n1190"],"tags":{"building":"yes"}},"w266":{"id":"w266","nodes":["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],"tags":{"building":"yes"}},"w267":{"id":"w267","nodes":["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],"tags":{"building":"house"}},"w268":{"id":"w268","nodes":["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],"tags":{"building":"house"}},"w269":{"id":"w269","nodes":["n1221","n1225","n1222","n1223","n1224","n1221"],"tags":{"building":"house"}},"w27":{"id":"w27","nodes":["n145","n147","n146"],"tags":{"highway":"footway"}},"w270":{"id":"w270","nodes":["n1225","n1226","n1227","n1229","n1228"],"tags":{"barrier":"fence"}},"w271":{"id":"w271","nodes":["n1229","n1230"],"tags":{"barrier":"fence"}},"w272":{"id":"w272","nodes":["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],"tags":{"building":"house"}},"w273":{"id":"w273","nodes":["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],"tags":{"building":"house"}},"w274":{"id":"w274","nodes":["n1247","n1248","n1249","n1250","n1247"],"tags":{"building":"house"}},"w275":{"id":"w275","nodes":["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],"tags":{"building":"house"}},"w276":{"id":"w276","nodes":["n1257","n1258","n1259","n1260","n1257"],"tags":{"building":"shed"}},"w277":{"id":"w277","nodes":["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],"tags":{"building":"house"}},"w278":{"id":"w278","nodes":["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],"tags":{"building":"house"}},"w279":{"id":"w279","nodes":["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],"tags":{"building":"house"}},"w28":{"id":"w28","nodes":["n147","n148"],"tags":{"highway":"footway"}},"w280":{"id":"w280","nodes":["n1281","n1282","n1283","n1284"],"tags":{"barrier":"fence"}},"w281":{"id":"w281","nodes":["n1285","n1286","n1287","n1288","n1285"],"tags":{"building":"house"}},"w282":{"id":"w282","nodes":["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],"tags":{"building":"house"}},"w283":{"id":"w283","nodes":["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],"tags":{"access":"private","leisure":"swimming_pool"}},"w284":{"id":"w284","nodes":["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],"tags":{"building":"house"}},"w285":{"id":"w285","nodes":["n1313","n1314","n1315","n1316","n1313"],"tags":{"building":"house"}},"w286":{"id":"w286","nodes":["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],"tags":{"building":"house"}},"w287":{"id":"w287","nodes":["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],"tags":{"building":"yes"}},"w288":{"id":"w288","nodes":["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],"tags":{"access":"private","leisure":"swimming_pool"}},"w289":{"id":"w289","nodes":["n1356","n1331"],"tags":{"barrier":"fence"}},"w29":{"id":"w29","nodes":["n149","n874","n150","n151","n897","n898","n875","n152"],"tags":{"highway":"service","oneway":"yes"}},"w290":{"id":"w290","nodes":["n1357","n1358","n1359","n1360","n1357"],"tags":{"building":"shed"}},"w291":{"id":"w291","nodes":["n1358","n1361","n1362"],"tags":{"barrier":"fence"}},"w292":{"id":"w292","nodes":["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],"tags":{"building":"house"}},"w293":{"id":"w293","nodes":["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],"tags":{"leisure":"swimming_pool"}},"w294":{"id":"w294","nodes":["n1367","n1375","n1376","n1377"],"tags":{"barrier":"fence"}},"w295":{"id":"w295","nodes":["n1378","n1379","n1380","n1381","n1378"],"tags":{"building":"house"}},"w296":{"id":"w296","nodes":["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],"tags":{"building":"house"}},"w297":{"id":"w297","nodes":["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],"tags":{"building":"house"}},"w298":{"id":"w298","nodes":["n1394","n1395","n1396","n1397","n1394"],"tags":{"building":"house"}},"w299":{"id":"w299","nodes":["n1398","n1399","n1400","n1401","n1398"],"tags":{"access":"private3","leisure":"swimming_pool"}},"w3":{"id":"w3","nodes":["n1","n2"],"tags":{"highway":"track","name":"Water Street"}},"w30":{"id":"w30","nodes":["n153","n154","n155","n156","n153"],"tags":{"amenity":"parking"}},"w300":{"id":"w300","nodes":["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],"tags":{"building":"house"}},"w301":{"id":"w301","nodes":["n1414","n1415","n1416","n1417","n1414"],"tags":{"building":"garage"}},"w302":{"id":"w302","nodes":["n1406","n1418","n1419","n1403"],"tags":{"barrier":"fence"}},"w303":{"id":"w303","nodes":["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],"tags":{"building":"house"}},"w304":{"id":"w304","nodes":["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],"tags":{"access":"private","leisure":"swimming_pool"}},"w305":{"id":"w305","nodes":["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],"tags":{"building":"house"}},"w306":{"id":"w306","nodes":["n1455","n1456","n1457","n1458","n1455"],"tags":{"building":"shed"}},"w307":{"id":"w307","nodes":["n1459","n1460","n1461","n1462","n1459"],"tags":{"building":"shed"}},"w308":{"id":"w308","nodes":["n1463","n1464"],"tags":{"barrier":"fence"}},"w309":{"id":"w309","nodes":["n1465","n1466","n1467","n1468"],"tags":{"barrier":"fence"}},"w31":{"id":"w31","nodes":["n157","n605","n158"],"tags":{"highway":"service"}},"w310":{"id":"w310","nodes":["n1469","n1481","n1463"],"tags":{"barrier":"hedge"}},"w311":{"id":"w311","nodes":["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],"tags":{"building":"house"}},"w312":{"id":"w312","nodes":["n1480","n1481"],"tags":{"barrier":"wall"}},"w313":{"id":"w313","nodes":["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],"tags":{"access":"private","leisure":"swimming_pool"}},"w314":{"id":"w314","nodes":["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],"tags":{"building":"house"}},"w315":{"id":"w315","nodes":["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],"tags":{"building":"house"}},"w316":{"id":"w316","nodes":["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],"tags":{"building":"house"}},"w317":{"id":"w317","nodes":["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],"tags":{"building":"house"}},"w318":{"id":"w318","nodes":["n1532","n1533"],"tags":{"barrier":"fence"}},"w319":{"id":"w319","nodes":["n1534","n1532","n1535"],"tags":{"barrier":"fence"}},"w32":{"id":"w32","nodes":["n159","n160","n161","n162","n159"],"tags":{"amenity":"parking"}},"w320":{"id":"w320","nodes":["n1536","n1537","n1538","n1539","n1536"],"tags":{"building":"shed"}},"w321":{"id":"w321","nodes":["n1540","n1541","n1542","n1543","n1540"],"tags":{"building":"shed"}},"w322":{"id":"w322","nodes":["n1544","n1545","n1546","n1547","n1544"],"tags":{"building":"shed"}},"w323":{"id":"w323","nodes":["n1548","n1549","n1550","n1551","n1548"],"tags":{"building":"house"}},"w324":{"id":"w324","nodes":["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],"tags":{"building":"house"}},"w325":{"id":"w325","nodes":["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],"tags":{"building":"house"}},"w326":{"id":"w326","nodes":["n1561","n1568","n1569","n1570"],"tags":{"barrier":"wall"}},"w327":{"id":"w327","nodes":["n1571","n1572"],"tags":{"barrier":"fence"}},"w328":{"id":"w328","nodes":["n1573","n1574","n1575","n1576","n1573"],"tags":{"building":"house"}},"w329":{"id":"w329","nodes":["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],"tags":{"building":"house"}},"w33":{"id":"w33","nodes":["n157","n163"],"tags":{"highway":"service"}},"w330":{"id":"w330","nodes":["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],"tags":{"building":"house"}},"w331":{"id":"w331","nodes":["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],"tags":{"access":"private","leisure":"swimming_pool"}},"w332":{"id":"w332","nodes":["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],"tags":{"building":"house"}},"w333":{"id":"w333","nodes":["n2018","n1626","n1627","n2017","n2018"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w334":{"id":"w334","nodes":["n2","n3","n2764"],"tags":{"highway":"service","name":"Water Street"}},"w335":{"id":"w335","nodes":["n3","n1628","n1614"],"tags":{"highway":"service"}},"w336":{"id":"w336","nodes":["n3198","n4545","n2747"],"tags":{"highway":"residential","name":"Morris Avenue"}},"w337":{"id":"w337","nodes":["n1629","n3504"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w338":{"id":"w338","nodes":["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],"tags":{"highway":"service","service":"parking_aisle"}},"w339":{"id":"w339","nodes":["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],"tags":{"highway":"residential","name":"Millard Street"}},"w34":{"id":"w34","nodes":["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],"tags":{"amenity":"parking"}},"w340":{"id":"w340","nodes":["n1824","n1825"],"tags":{"highway":"service","service":"parking_aisle"}},"w341":{"id":"w341","nodes":["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],"tags":{"building":"yes"}},"w342":{"id":"w342","nodes":["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],"tags":{"amenity":"parking","fee":"no"}},"w343":{"id":"w343","nodes":["n1757","n1758","n1759","n1760","n1757"],"tags":{"building":"yes"}},"w344":{"id":"w344","nodes":["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],"tags":{"building":"school"}},"w345":{"id":"w345","nodes":["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],"tags":{"building":"yes"}},"w346":{"id":"w346","nodes":["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],"tags":{"highway":"residential","name":"Douglas Avenue"}},"w347":{"id":"w347","nodes":["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w348":{"id":"w348","nodes":["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],"tags":{"leisure":"playground"}},"w349":{"id":"w349","nodes":["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],"tags":{"highway":"service"}},"w35":{"id":"w35","nodes":["n168","n167","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w350":{"id":"w350","nodes":["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],"tags":{"amenity":"parking"}},"w351":{"id":"w351","nodes":["n1717","n1718","n1719","n1720","n1717"],"tags":{"building":"yes"}},"w352":{"id":"w352","nodes":["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],"tags":{"building":"yes"}},"w353":{"id":"w353","nodes":["n1637","n1636","n1029","n4715","n1630"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w354":{"id":"w354","nodes":["n1713","n1714","n1715","n1716","n1713"],"tags":{"building":"yes"}},"w355":{"id":"w355","nodes":["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],"tags":{"building":"yes"}},"w356":{"id":"w356","nodes":["n1631","n4717","n1840","n4745","n1841"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w357":{"id":"w357","nodes":["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],"tags":{"building":"yes"}},"w358":{"id":"w358","nodes":["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],"tags":{"building":"yes"}},"w359":{"id":"w359","nodes":["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],"tags":{"highway":"residential","name":"South Street"}},"w36":{"id":"w36","nodes":["n910","n171","n866","n172"],"tags":{"barrier":"fence","fence_type":"chain_link"}},"w360":{"id":"w360","nodes":["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],"tags":{"building":"yes"}},"w361":{"id":"w361","nodes":["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],"tags":{"highway":"service"}},"w362":{"id":"w362","nodes":["n1639","n1683","n4710","n1633"],"tags":{"highway":"residential","name":"South Street","oneway":"yes"}},"w363":{"id":"w363","nodes":["n1646","n1647","n1648","n1649","n1646"],"tags":{"leisure":"pitch","pitch":"basketball"}},"w364":{"id":"w364","nodes":["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],"tags":{"amenity":"school","name":"Three Rivers Middle School"}},"w365":{"id":"w365","nodes":["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],"tags":{"building":"yes"}},"w366":{"id":"w366","nodes":["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],"tags":{"amenity":"parking"}},"w367":{"id":"w367","nodes":["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],"tags":{"highway":"residential","name":"Grant Avenue"}},"w368":{"id":"w368","nodes":["n1853","n1687","n1688","n1854","n1853"],"tags":{"amenity":"library","building":"yes","name":"Three Rivers Public Library"}},"w369":{"id":"w369","nodes":["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],"tags":{"amenity":"parking"}},"w37":{"id":"w37","nodes":["n173","n174","n175","n176","n177","n178","n179","n180","n173"],"tags":{"building":"yes"}},"w370":{"id":"w370","nodes":["n1645","n1638","n858","n4718","n1631"],"tags":{"highway":"residential","name":"Hook Avenue"}},"w371":{"id":"w371","nodes":["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],"tags":{"amenity":"school","name":"Three Rivers High School"}},"w372":{"id":"w372","nodes":["n1697","n1698","n1699","n1700","n1697"],"tags":{"building":"yes"}},"w373":{"id":"w373","nodes":["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],"tags":{"amenity":"parking"}},"w374":{"id":"w374","nodes":["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],"tags":{"building":"yes"}},"w375":{"id":"w375","nodes":["n1822","n1823"],"tags":{"highway":"service","service":"parking_aisle"}},"w376":{"id":"w376","nodes":["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],"tags":{"amenity":"parking"}},"w377":{"id":"w377","nodes":["n1676","n1675","n1674","n1673"],"tags":{"highway":"service","oneway":"yes"}},"w378":{"id":"w378","nodes":["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],"tags":{"amenity":"school","name":"Andrews Elementary School"}},"w379":{"id":"w379","nodes":["n1630","n4714","n1847","n4750","n1844"],"tags":{"highway":"residential","name":"Lincoln Avenue"}},"w38":{"id":"w38","nodes":["n181","n182","n183","n185","n184","n181"],"tags":{"building":"yes"}},"w380":{"id":"w380","nodes":["n1683","n3745","n1686","n1633"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w381":{"id":"w381","nodes":["n2022","n2037"],"tags":{"highway":"footway"}},"w382":{"id":"w382","nodes":["n1826","n1863"],"tags":{"highway":"residential"}},"w383":{"id":"w383","nodes":["n2011","n2012","n739","n2013","n2014","n2029","n2011"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w384":{"id":"w384","nodes":["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],"tags":{"building":"yes"}},"w385":{"id":"w385","nodes":["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],"tags":{"natural":"water"}},"w386":{"id":"w386","nodes":["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],"tags":{"highway":"service"}},"w387":{"id":"w387","nodes":["n1846","n1843","n865","n157","n4721","n1831"],"tags":{"highway":"residential","name":"Andrews Street"}},"w388":{"id":"w388","nodes":["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],"tags":{"highway":"footway"}},"w389":{"id":"w389","nodes":["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],"tags":{"name":"Rocky River","waterway":"river"}},"w39":{"id":"w39","nodes":["n185","n186","n187"],"tags":{"barrier":"fence"}},"w390":{"id":"w390","nodes":["n2050","n2051","n2052","n2053","n2050"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w391":{"id":"w391","nodes":["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],"tags":{"highway":"residential","name":"Constantine Street"}},"w392":{"id":"w392","nodes":["n1869","n212","n436","n2281","n2081"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w393":{"id":"w393","nodes":["n1829","n611","n144","n4694","n602","n1832"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w394":{"id":"w394","nodes":["n1997","n1998","n2000","n1999"],"tags":{"highway":"service","service":"parking_aisle"}},"w395":{"id":"w395","nodes":["n1835","n1869"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w396":{"id":"w396","nodes":["n2000","n2001"],"tags":{"highway":"service","service":"parking_aisle"}},"w397":{"id":"w397","nodes":["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],"tags":{"highway":"residential","name":"Spring Street"}},"w398":{"id":"w398","nodes":["n2015","n2016","n2017","n2018","n2015"],"tags":{"building":"yes"}},"w399":{"id":"w399","nodes":["n2062","n45","n2063","n877","n41","n1852"],"tags":{"highway":"service"}},"w4":{"id":"w4","nodes":["n7","n38","n378","n379","n7"],"tags":{"building":"yes"}},"w40":{"id":"w40","nodes":["n188","n189","n190","n191","n192","n193","n188"],"tags":{"building":"house"}},"w400":{"id":"w400","nodes":["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],"tags":{"amenity":"parking"}},"w401":{"id":"w401","nodes":["n1963","n1964"],"tags":{"bridge":"yes","highway":"footway"}},"w402":{"id":"w402","nodes":["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","barrier":"fence","name":"Scidmore Park Petting Zoo","tourism":"zoo","zoo":"petting_zoo"}},"w403":{"id":"w403","nodes":["n1957","n1958","n1959","n481","n1960","n482","n1949"],"tags":{"highway":"path"}},"w404":{"id":"w404","nodes":["n2281","n27","n330","n1987","n1988"],"tags":{"highway":"service"}},"w405":{"id":"w405","nodes":["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w406":{"id":"w406","nodes":["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],"tags":{"highway":"footway"}},"w407":{"id":"w407","nodes":["n2034","n2036","n2009"],"tags":{"highway":"footway"}},"w408":{"id":"w408","nodes":["n1964","n1965","n2002","n1966","n21","n1967","n1969"],"tags":{"highway":"footway"}},"w409":{"id":"w409","nodes":["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],"tags":{"natural":"water"}},"w41":{"id":"w41","nodes":["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],"tags":{"building":"house"}},"w410":{"id":"w410","nodes":["n1868","n2088"],"tags":{"bridge":"yes","name":"Conrail Railroad","railway":"rail"}},"w411":{"id":"w411","nodes":["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],"tags":{"highway":"footway"}},"w412":{"id":"w412","nodes":["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],"tags":{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street","leisure":"park","name":"Scidmore Park"}},"w413":{"id":"w413","nodes":["n1831","n876","n4720","n821","n2089"],"tags":{"highway":"residential","name":"Andrews Street"}},"w414":{"id":"w414","nodes":["n2002","n2003","n2004","n2005","n2006","n2007"],"tags":{"highway":"footway"}},"w415":{"id":"w415","nodes":["n1979","n1980","n1981","n1982","n1979"],"tags":{"amenity":"parking"}},"w416":{"id":"w416","nodes":["n2054","n2055","n2056","n2057","n2054"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w417":{"id":"w417","nodes":["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],"tags":{"leisure":"park","name":"Memory Isle Park"}},"w418":{"id":"w418","nodes":["n2033","n2034","n2035"],"tags":{"highway":"footway"}},"w419":{"id":"w419","nodes":["n1983","n1984","n1985","n1986","n1983"],"tags":{"amenity":"parking"}},"w42":{"id":"w42","nodes":["n206","n207","n208","n209","n210","n211","n206"],"tags":{"building":"house"}},"w420":{"id":"w420","nodes":["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],"tags":{"highway":"residential","name":"French Street"}},"w421":{"id":"w421","nodes":["n2337","n2268"],"tags":{"highway":"path"}},"w422":{"id":"w422","nodes":["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],"tags":{"natural":"water"}},"w423":{"id":"w423","nodes":["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],"tags":{"natural":"wetland"}},"w424":{"id":"w424","nodes":["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],"tags":{"highway":"residential","name":"Pealer Street"}},"w425":{"id":"w425","nodes":["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w426":{"id":"w426","nodes":["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],"tags":{"building":"yes"}},"w427":{"id":"w427","nodes":["n2671","n2672","n2673","n2674","n2671"],"tags":{"building":"yes"}},"w428":{"id":"w428","nodes":["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],"tags":{"building":"yes"}},"w429":{"id":"w429","nodes":["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],"tags":{"amenity":"parking"}},"w43":{"id":"w43","nodes":["n1955","n1956"],"tags":{"footway":"sidewalk","highway":"footway","name":"Riverwalk Trail"}},"w430":{"id":"w430","nodes":["n2471","n2474","n2484","n2479","n2471"],"tags":{"building":"yes"}},"w431":{"id":"w431","nodes":["n2218","n2434","n2436","n2433","n2435","n2210"],"tags":{"name":"Rocky River","waterway":"river"}},"w432":{"id":"w432","nodes":["n2782","n2532","n2783","n2784","n2782"],"tags":{"amenity":"parking"}},"w433":{"id":"w433","nodes":["n2513","n649","n2520","n2514","n2507","n2513"],"tags":{"building":"yes"}},"w434":{"id":"w434","nodes":["n2470","n2468","n2461","n2465","n2470"],"tags":{"building":"yes"}},"w435":{"id":"w435","nodes":["n2598","n2599","n648","n649","n2520","n2598"],"tags":{"building":"yes"}},"w436":{"id":"w436","nodes":["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],"tags":{"building":"yes"}},"w437":{"id":"w437","nodes":["n2503","n2512","n2508","n2499","n2503"],"tags":{"building":"yes"}},"w438":{"id":"w438","nodes":["n2440","n2800","n2774","n1"],"tags":{"highway":"residential","name":"Water Street"}},"w439":{"id":"w439","nodes":["n2675","n2676","n2677","n2678","n2675"],"tags":{"building":"yes"}},"w44":{"id":"w44","nodes":["n213","n214","n215","n216","n213"],"tags":{"building":"yes"}},"w440":{"id":"w440","nodes":["n2512","n2503","n2507","n2514","n2512"],"tags":{"building":"yes"}},"w441":{"id":"w441","nodes":["n2554","n2717","n674","n2720","n2798"],"tags":{"highway":"service","oneway":"yes"}},"w442":{"id":"w442","nodes":["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],"tags":{"amenity":"parking"}},"w443":{"id":"w443","nodes":["n2629","n2627","n2628","n2616","n2630","n2629"],"tags":{"building":"yes"}},"w444":{"id":"w444","nodes":["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w445":{"id":"w445","nodes":["n2572","n2573"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w446":{"id":"w446","nodes":["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],"tags":{"building":"yes"}},"w447":{"id":"w447","nodes":["n2780","n2777","n628","n624","n2779"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w448":{"id":"w448","nodes":["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],"tags":{"building":"yes"}},"w449":{"id":"w449","nodes":["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],"tags":{"amenity":"parking"}},"w45":{"id":"w45","nodes":["n217","n218","n219","n220","n217"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w450":{"id":"w450","nodes":["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],"tags":{"building":"yes"}},"w451":{"id":"w451","nodes":["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],"tags":{"amenity":"parking"}},"w452":{"id":"w452","nodes":["n2273","n457","n2569","n458","n2570"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w453":{"id":"w453","nodes":["n2447","n2242","n2448","n2527","n2530"],"tags":{"highway":"service"}},"w454":{"id":"w454","nodes":["n2560","n333","n2561"],"tags":{"highway":"service","service":"parking_aisle"}},"w455":{"id":"w455","nodes":["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],"tags":{"building":"yes"}},"w456":{"id":"w456","nodes":["n2425","n2429","n2424"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w457":{"id":"w457","nodes":["n2487","n2467","n2472","n2480","n2495","n2487"],"tags":{"building":"yes"}},"w458":{"id":"w458","nodes":["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],"tags":{"building":"yes"}},"w459":{"id":"w459","nodes":["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],"tags":{"building":"yes"}},"w46":{"id":"w46","nodes":["n221","n222","n223","n224","n221"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w460":{"id":"w460","nodes":["n2468","n2464","n2455","n2457","n2461","n2468"],"tags":{"building":"yes"}},"w461":{"id":"w461","nodes":["n2478","n2473","n683","n682","n2463","n681","n2478"],"tags":{"building":"yes"}},"w462":{"id":"w462","nodes":["n2547","n473","n2548","n2549"],"tags":{"highway":"service","service":"parking_aisle"}},"w463":{"id":"w463","nodes":["n2573","n2574"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w464":{"id":"w464","nodes":["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],"tags":{"highway":"service","service":"parking_aisle"}},"w465":{"id":"w465","nodes":["n2571","n459","n2572"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w466":{"id":"w466","nodes":["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],"tags":{"highway":"service"}},"w467":{"id":"w467","nodes":["n2484","n2474","n2477","n2485","n2488","n2484"],"tags":{"building":"yes"}},"w468":{"id":"w468","nodes":["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],"tags":{"building":"yes"}},"w469":{"id":"w469","nodes":["n2469","n2476","n2481","n2475","n920","n2466","n2469"],"tags":{"building":"yes"}},"w47":{"id":"w47","nodes":["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],"tags":{"highway":"service"}},"w470":{"id":"w470","nodes":["n2473","n2470","n2465","n2458","n2462","n683","n2473"],"tags":{"building":"yes"}},"w471":{"id":"w471","nodes":["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],"tags":{"building":"yes"}},"w472":{"id":"w472","nodes":["n2424","n2426","n2427","n2428"],"tags":{"highway":"residential","name":"Moore Street"}},"w473":{"id":"w473","nodes":["n2432","n1026","n4741","n2554","n2425"],"tags":{"highway":"residential","name":"Moore Street"}},"w474":{"id":"w474","nodes":["n2577","n2576"],"tags":{"bridge":"yes","highway":"footway"}},"w475":{"id":"w475","nodes":["n2497","n2505","n2500","n2493","n2497"],"tags":{"building":"yes"}},"w476":{"id":"w476","nodes":["n2493","n2500","n2501","n2496","n2490","n2493"],"tags":{"building":"yes"}},"w477":{"id":"w477","nodes":["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],"tags":{"highway":"residential","name":"Railroad Drive"}},"w478":{"id":"w478","nodes":["n2515","n2511","n2498","n2504","n2509","n2515"],"tags":{"building":"yes"}},"w479":{"id":"w479","nodes":["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],"tags":{"building":"yes"}},"w48":{"id":"w48","nodes":["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],"tags":{"building":"yes"}},"w480":{"id":"w480","nodes":["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],"tags":{"amenity":"parking"}},"w481":{"id":"w481","nodes":["n2796","n2657","n2658","n2797","n2796"],"tags":{"building":"yes"}},"w482":{"id":"w482","nodes":["n2550","n2551","n442","n2552","n2553","n2550"],"tags":{"amenity":"parking"}},"w483":{"id":"w483","nodes":["n2790","n2542"],"tags":{"highway":"service","service":"parking_aisle"}},"w484":{"id":"w484","nodes":["n2311","n1102"],"tags":{"highway":"service"}},"w485":{"id":"w485","nodes":["n2515","n2509","n2516","n2519","n2515"],"tags":{"building":"yes"}},"w486":{"id":"w486","nodes":["n2506","n2502","n2492","n2491","n2494","n2506"],"tags":{"building":"yes"}},"w487":{"id":"w487","nodes":["n2667","n2668","n2669","n2670","n2667"],"tags":{"building":"yes"}},"w488":{"id":"w488","nodes":["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],"tags":{"building":"yes"}},"w489":{"id":"w489","nodes":["n2081","n2430"],"tags":{"bridge":"yes","highway":"primary","name":"Michigan Avenue"}},"w49":{"id":"w49","nodes":["n237","n238"],"tags":{"highway":"footway"}},"w490":{"id":"w490","nodes":["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],"tags":{"highway":"residential","name":"Portage Avenue"}},"w491":{"id":"w491","nodes":["n2578","n2579","n2580","n2581","n2578"],"tags":{"amenity":"shelter","building":"yes","shelter_type":"picnic_shelter"}},"w492":{"id":"w492","nodes":["n2556","n2557","n2558","n2559","n2556"],"tags":{"amenity":"parking"}},"w493":{"id":"w493","nodes":["n2460","n2456","n687","n2453","n2454","n2460"],"tags":{"building":"yes"}},"w494":{"id":"w494","nodes":["n2471","n2479","n2476","n2469","n2471"],"tags":{"building":"yes"}},"w495":{"id":"w495","nodes":["n2724","n2725","n673","n672","n671","n2726","n2727"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w496":{"id":"w496","nodes":["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],"tags":{"building":"yes"}},"w497":{"id":"w497","nodes":["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],"tags":{"highway":"primary","name":"Michigan Avenue"}},"w498":{"id":"w498","nodes":["n2691","n2692","n634","n633","n2693","n2694"],"tags":{"highway":"service"}},"w499":{"id":"w499","nodes":["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],"tags":{"highway":"residential","name":"West Street"}},"w5":{"id":"w5","nodes":["n380","n381","n382","n383","n429","n430","n380"],"tags":{"building":"yes"}},"w50":{"id":"w50","nodes":["n239","n499","n508","n245","n238","n242","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w500":{"id":"w500","nodes":["n2428","n1152","n2421","n2324"],"tags":{"bridge":"yes","highway":"residential","name":"Moore Street"}},"w501":{"id":"w501","nodes":["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],"tags":{"building":"yes"}},"w502":{"id":"w502","nodes":["n2570","n2571"],"tags":{"bridge":"yes","highway":"path","name":"Riverwalk Trail"}},"w503":{"id":"w503","nodes":["n2540","n2542","n2787"],"tags":{"highway":"service"}},"w504":{"id":"w504","nodes":["n2269","n2582","n2250"],"tags":{"highway":"path"}},"w505":{"id":"w505","nodes":["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],"tags":{"building":"yes"}},"w506":{"id":"w506","nodes":["n2543","n2544","n2545","n395","n2546","n2543"],"tags":{"amenity":"parking"}},"w507":{"id":"w507","nodes":["n2449","n2450","n2451","n2452","n1162","n2449"],"tags":{"leisure":"pitch","sport":"tennis"}},"w508":{"id":"w508","nodes":["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],"tags":{"highway":"service"}},"w509":{"id":"w509","nodes":["n2499","n2508","n2510","n2505","n2497","n2499"],"tags":{"building":"yes"}},"w51":{"id":"w51","nodes":["n241","n242","n243","n244"],"tags":{"highway":"service","surface":"unpaved"}},"w510":{"id":"w510","nodes":["n2575","n2577"],"tags":{"highway":"footway"}},"w511":{"id":"w511","nodes":["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],"tags":{"amenity":"parking"}},"w512":{"id":"w512","nodes":["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],"tags":{"building":"yes"}},"w513":{"id":"w513","nodes":["n2720","n2721"],"tags":{"highway":"service","service":"parking_aisle"}},"w514":{"id":"w514","nodes":["n2788","n2790","n2789","n989","n2540","n2541"],"tags":{"highway":"service","service":"parking_aisle"}},"w515":{"id":"w515","nodes":["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],"tags":{"highway":"residential","name":"Middle Street"}},"w516":{"id":"w516","nodes":["n2852","n2805"],"tags":{"access":"private","highway":"service","name":"Battle Street"}},"w517":{"id":"w517","nodes":["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w518":{"id":"w518","nodes":["n2859","n2808"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w519":{"id":"w519","nodes":["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],"tags":{"building":"yes"}},"w52":{"id":"w52","nodes":["n247","n248","n249","n250","n247"],"tags":{"amenity":"parking"}},"w520":{"id":"w520","nodes":["n2806","n2807","n2803"],"tags":{"highway":"residential","name":"2nd Avenue"}},"w521":{"id":"w521","nodes":["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],"tags":{"building":"yes"}},"w522":{"id":"w522","nodes":["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],"tags":{"highway":"residential","name":"Washington Street"}},"w523":{"id":"w523","nodes":["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],"tags":{"highway":"residential","name":"5th Avenue"}},"w524":{"id":"w524","nodes":["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],"tags":{"building":"yes"}},"w525":{"id":"w525","nodes":["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],"tags":{"highway":"residential","name":"Wood Street"}},"w526":{"id":"w526","nodes":["n2877","n2809","n2813","n2844","n2843"],"tags":{"highway":"residential","name":"4th Avenue"}},"w527":{"id":"w527","nodes":["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],"tags":{"amenity":"parking"}},"w528":{"id":"w528","nodes":["n2864","n2892","n2893","n2877","n2860","n3840"],"tags":{"highway":"residential","name":"Garden Street"}},"w529":{"id":"w529","nodes":["n2868","n2890"],"tags":{"bridge":"yes","highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w53":{"id":"w53","nodes":["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],"tags":{"building":"yes"}},"w530":{"id":"w530","nodes":["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],"tags":{"building":"yes"}},"w531":{"id":"w531","nodes":["n2958","n2896"],"tags":{"bridge":"yes","highway":"secondary","name":"Main Street"}},"w532":{"id":"w532","nodes":["n2896","n394","n364","n2748"],"tags":{"highway":"secondary","name":"Main Street"}},"w533":{"id":"w533","nodes":["n2800","n2943","n2940","n2941","n2942","n2943"],"tags":{"highway":"service","service":"parking_aisle"}},"w534":{"id":"w534","nodes":["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],"tags":{"barrier":"fence"}},"w535":{"id":"w535","nodes":["n2894","n2944","n2774","n2765"],"tags":{"highway":"residential","name":"5th Avenue"}},"w536":{"id":"w536","nodes":["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],"tags":{"highway":"secondary","name":"Michigan Avenue","name_1":"State Highway 60","ref":"M 60"}},"w537":{"id":"w537","nodes":["n2895","n738","n2887","n737","n2913"],"tags":{"highway":"residential","name":"Water Street"}},"w538":{"id":"w538","nodes":["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],"tags":{"highway":"residential","name":"River Drive"}},"w539":{"id":"w539","nodes":["n2882","n2894"],"tags":{"bridge":"yes","highway":"residential","name":"5th Avenue"}},"w54":{"id":"w54","nodes":["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],"tags":{"building":"yes"}},"w540":{"id":"w540","nodes":["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],"tags":{"name":"Portage River","waterway":"river"}},"w541":{"id":"w541","nodes":["n2852","n2851","n3003"],"tags":{"highway":"residential","name":"1st Avenue"}},"w542":{"id":"w542","nodes":["n2991","n3004","n2994"],"tags":{"highway":"residential","name":"River Street"}},"w543":{"id":"w543","nodes":["n2993","n2989"],"tags":{"bridge":"yes","highway":"residential","name":"6th Street"}},"w544":{"id":"w544","nodes":["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],"tags":{"highway":"residential","name":"6th Street"}},"w545":{"id":"w545","nodes":["n2989","n2992","n2848"],"tags":{"highway":"residential","name":"6th Street"}},"w546":{"id":"w546","nodes":["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],"tags":{"natural":"wetland"}},"w547":{"id":"w547","nodes":["n2088","n3013","n3015","n3014","n3017","n3018"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w548":{"id":"w548","nodes":["n3083","n3084","n3085","n3086","n3083"],"tags":{"building":"yes"}},"w549":{"id":"w549","nodes":["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],"tags":{"leisure":"park","name":"Conservation Park"}},"w55":{"id":"w55","nodes":["n277","n278","n279","n280","n281","n282","n283","n284","n277"],"tags":{"building":"yes"}},"w550":{"id":"w550","nodes":["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],"tags":{"highway":"service"}},"w551":{"id":"w551","nodes":["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],"tags":{"highway":"footway"}},"w552":{"id":"w552","nodes":["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],"tags":{"building":"yes"}},"w553":{"id":"w553","nodes":["n3123","n3124","n3129","n3125","n3126","n3123"],"tags":{"building":"yes"}},"w554":{"id":"w554","nodes":["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],"tags":{"building":"yes"}},"w555":{"id":"w555","nodes":["n3087","n3088","n3089","n3090","n3087"],"tags":{"building":"yes"}},"w556":{"id":"w556","nodes":["n3113","n3114","n3115","n3116","n3113"],"tags":{"building":"yes"}},"w557":{"id":"w557","nodes":["n3103","n3104","n3105","n3106","n3103"],"tags":{"building":"yes"}},"w558":{"id":"w558","nodes":["n3127","n3128","n3129","n3124","n3127"],"tags":{"building":"yes"}},"w559":{"id":"w559","nodes":["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],"tags":{"building":"yes"}},"w56":{"id":"w56","nodes":["n285","n286","n287","n288","n285"],"tags":{"amenity":"parking"}},"w560":{"id":"w560","nodes":["n3091","n3092","n3093","n3094","n3091"],"tags":{"building":"yes"}},"w561":{"id":"w561","nodes":["n3155","n3157","n3158","n3159","n3156","n3155"],"tags":{"building":"yes"}},"w562":{"id":"w562","nodes":["n3057","n3058","n3059","n3060","n3057"],"tags":{"building":"yes"}},"w563":{"id":"w563","nodes":["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],"tags":{"building":"yes"}},"w564":{"id":"w564","nodes":["n3134","n3135","n3136","n3131","n3134"],"tags":{"building":"yes"}},"w565":{"id":"w565","nodes":["n3143","n3144","n3145","n3146","n3143"],"tags":{"building":"yes"}},"w566":{"id":"w566","nodes":["n3095","n3096","n3097","n3098","n3095"],"tags":{"building":"yes"}},"w567":{"id":"w567","nodes":["n3130","n3131","n3136","n3132","n3133","n3130"],"tags":{"building":"yes"}},"w568":{"id":"w568","nodes":["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],"tags":{"amenity":"parking"}},"w569":{"id":"w569","nodes":["n3061","n3062","n3063","n3064","n3061"],"tags":{"building":"yes"}},"w57":{"id":"w57","nodes":["n289","n290","n291","n292","n289"],"tags":{"amenity":"parking"}},"w570":{"id":"w570","nodes":["n3155","n3156","n3152","n3153","n3155"],"tags":{"building":"yes"}},"w571":{"id":"w571","nodes":["n3099","n3100","n3101","n3102","n3099"],"tags":{"building":"yes"}},"w572":{"id":"w572","nodes":["n3147","n3148","n3149","n3150","n3147"],"tags":{"building":"yes"}},"w573":{"id":"w573","nodes":["n3039","n2284"],"tags":{"highway":"service"}},"w574":{"id":"w574","nodes":["n3151","n3152","n3153","n3154","n3151"],"tags":{"building":"yes"}},"w575":{"id":"w575","nodes":["n3021","n3022","n3023","n3024","n3021"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelter"}},"w576":{"id":"w576","nodes":["n3065","n3066","n3067","n3068","n3065"],"tags":{"building":"yes"}},"w577":{"id":"w577","nodes":["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],"tags":{"highway":"service","name":"Willow Drive","service":"driveway","surface":"unpaved"}},"w578":{"id":"w578","nodes":["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],"tags":{"building":"yes"}},"w579":{"id":"w579","nodes":["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],"tags":{"highway":"residential","name":"Elm Street"}},"w58":{"id":"w58","nodes":["n240","n293","n294"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w580":{"id":"w580","nodes":["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],"tags":{"building":"yes"}},"w581":{"id":"w581","nodes":["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],"tags":{"highway":"residential","name":"Kelsey Street"}},"w582":{"id":"w582","nodes":["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],"tags":{"highway":"residential","name":"Walnut Street"}},"w583":{"id":"w583","nodes":["n3272","n4469","n4588","n2879","n4564","n2872"],"tags":{"highway":"residential","name":"10th Avenue"}},"w584":{"id":"w584","nodes":["n3243","n3242","n3241","n3240","n3243"],"tags":{"building":"industrial"}},"w585":{"id":"w585","nodes":["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],"tags":{"highway":"residential","name":"6th Avenue"}},"w586":{"id":"w586","nodes":["n3276","n4591","n2853","n4605","n2854"],"tags":{"highway":"residential","name":"8th Avenue"}},"w587":{"id":"w587","nodes":["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],"tags":{"building":"industrial"}},"w588":{"id":"w588","nodes":["n3277","n4599","n2857","n4598","n4608","n2858"],"tags":{"highway":"residential","name":"7th Avenue"}},"w589":{"id":"w589","nodes":["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],"tags":{"building":"yes"}},"w59":{"id":"w59","nodes":["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],"tags":{"footway":"sidewalk","highway":"footway"}},"w590":{"id":"w590","nodes":["n3278","n4458","n4589","n4604","n2861"],"tags":{"highway":"residential","name":"9th Avenue"}},"w591":{"id":"w591","nodes":["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],"tags":{"building":"industrial"}},"w592":{"id":"w592","nodes":["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],"tags":{"natural":"water","water":"pond"}},"w593":{"id":"w593","nodes":["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],"tags":{"building":"industrial"}},"w594":{"id":"w594","nodes":["n3233","n3232","n3231","n3230","n3233"],"tags":{"building":"yes"}},"w595":{"id":"w595","nodes":["n3247","n3246","n3245","n3244","n3247"],"tags":{"building":"industrial"}},"w596":{"id":"w596","nodes":["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],"tags":{"highway":"residential","name":"Armitage Street"}},"w597":{"id":"w597","nodes":["n2193","n2194","n2195","n2197","n2193"],"tags":{"building":"yes"}},"w598":{"id":"w598","nodes":["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],"tags":{"building":"school"}},"w6":{"id":"w6","nodes":["n879","n880","n881","n882","n879"],"tags":{"building":"shed"}},"w60":{"id":"w60","nodes":["n239","n308","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w600":{"id":"w600","nodes":["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],"tags":{"building":"yes"}},"w601":{"id":"w601","nodes":["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],"tags":{"building":"yes"}},"w602":{"id":"w602","nodes":["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],"tags":{"building":"yes"}},"w603":{"id":"w603","nodes":["n3353","n3352","n3347","n3280","n2798"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w604":{"id":"w604","nodes":["n3753","n3211","n3383"],"tags":{"highway":"service","service":"alley"}},"w605":{"id":"w605","nodes":["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],"tags":{"building":"yes"}},"w606":{"id":"w606","nodes":["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],"tags":{"building":"yes"}},"w607":{"id":"w607","nodes":["n2198","n2207"],"tags":{"barrier":"wall"}},"w608":{"id":"w608","nodes":["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],"tags":{"highway":"residential","name":"East Street"}},"w609":{"id":"w609","nodes":["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],"tags":{"highway":"residential","name":"Maple Street"}},"w61":{"id":"w61","nodes":["n309","n310","n311","n312","n313","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w610":{"id":"w610","nodes":["n3379","n3380","n3382","n3381","n3379"],"tags":{"leisure":"park","name":"LaFayette Park"}},"w611":{"id":"w611","nodes":["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],"tags":{"highway":"residential","name":"Bennett Street"}},"w612":{"id":"w612","nodes":["n2751","n3383","n2749","n2798","n2772"],"tags":{"highway":"residential","name":"Market Street"}},"w613":{"id":"w613","nodes":["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],"tags":{"building":"yes"}},"w614":{"id":"w614","nodes":["n3375","n3406","n3405","n3374","n3375"],"tags":{"leisure":"playground"}},"w615":{"id":"w615","nodes":["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],"tags":{"building":"yes"}},"w616":{"id":"w616","nodes":["n3376","n3407","n3408","n3377","n3376"],"tags":{"amenity":"school","name":"Three Rivers Elementary School"}},"w617":{"id":"w617","nodes":["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],"tags":{"building":"yes"}},"w619":{"id":"w619","nodes":["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],"tags":{"highway":"secondary","name":"Michigan Avenue","ref":"M 60"}},"w62":{"id":"w62","nodes":["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],"tags":{"footway":"sidewalk","highway":"footway"}},"w620":{"id":"w620","nodes":["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],"tags":{"highway":"residential"}},"w621":{"id":"w621","nodes":["n3468","n3469","n3470","n3471","n3468"],"tags":{"building":"yes"}},"w622":{"id":"w622","nodes":["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],"tags":{"landuse":"cemetery","name":"Riverside Cemetery"}},"w623":{"id":"w623","nodes":["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],"tags":{"building":"yes"}},"w624":{"id":"w624","nodes":["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],"tags":{"building":"yes"}},"w625":{"id":"w625","nodes":["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],"tags":{"highway":"secondary","name":"Jefferson Street","name_1":"State Highway 60","ref":"M 60"}},"w626":{"id":"w626","nodes":["n3439","n3423","n2863"],"tags":{"highway":"unclassified","name":"Michigan Avenue","name_1":"State Highway 60"}},"w627":{"id":"w627","nodes":["n3500","n3005"],"tags":{"highway":"service"}},"w628":{"id":"w628","nodes":["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],"tags":{"leisure":"park","name":"Marina Park"}},"w629":{"id":"w629","nodes":["n2208","n2209","n2212","n2214","n2208"],"tags":{"building":"yes"}},"w63":{"id":"w63","nodes":["n1955","n316"],"tags":{"footway":"sidewalk","highway":"footway"}},"w630":{"id":"w630","nodes":["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w631":{"id":"w631","nodes":["n2215","n2750","n2770","n2771","n2215"],"tags":{"building":"yes"}},"w632":{"id":"w632","nodes":["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],"tags":{"highway":"residential","name":"Cushman Street"}},"w633":{"id":"w633","nodes":["n2745","n3749","n3507","n4535","n3503"],"tags":{"highway":"residential","name":"Pine Street"}},"w634":{"id":"w634","nodes":["n3510","n3511","n3512","n3509","n3510"],"tags":{"leisure":"park","name":"Bowman Park"}},"w636":{"id":"w636","nodes":["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],"tags":{"highway":"residential","name":"Wheeler Street"}},"w637":{"id":"w637","nodes":["n3550","n4586","n4476","n3472"],"tags":{"highway":"residential","name":"11th Avenue"}},"w638":{"id":"w638","nodes":["n3508","n3518"],"tags":{"bridge":"yes","highway":"residential","name":"Hoffman Street"}},"w639":{"id":"w639","nodes":["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w64":{"id":"w64","nodes":["n316","n317"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w640":{"id":"w640","nodes":["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],"tags":{"landuse":"reservoir","name":"Hoffman Pond","natural":"water"}},"w641":{"id":"w641","nodes":["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],"tags":{"waterway":"river"}},"w642":{"id":"w642","nodes":["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],"tags":{"admin_level":"8","boundary":"administrative"}},"w643":{"id":"w643","nodes":["n2839","n2873"],"tags":{"highway":"service","service":"driveway"}},"w644":{"id":"w644","nodes":["n2873","n2840"],"tags":{"bridge":"yes","highway":"service","layer":"1","service":"driveway"}},"w645":{"id":"w645","nodes":["n2840","n2841","n2842","n2845","n2866"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w646":{"id":"w646","nodes":["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],"tags":{"highway":"residential","name":"Flower Street"}},"w647":{"id":"w647","nodes":["n2874","n2875","n2876","n2954","n2874"],"tags":{"building":"industrial"}},"w648":{"id":"w648","nodes":["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],"tags":{"building":"yes"}},"w649":{"id":"w649","nodes":["n3197","n4543","n4544","n3198"],"tags":{"highway":"residential","name":"Morris Avenue","surface":"unpaved"}},"w65":{"id":"w65","nodes":["n317","n318","n319","n320","n321"],"tags":{"footway":"sidewalk","highway":"footway"}},"w650":{"id":"w650","nodes":["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],"tags":{"highway":"residential","name":"Adams Street"}},"w651":{"id":"w651","nodes":["n3788","n3785","n3786","n3787","n3788"],"tags":{"power":"station"}},"w652":{"id":"w652","nodes":["n2957","n3163","n3241"],"tags":{"barrier":"wall"}},"w653":{"id":"w653","nodes":["n3549","n3802","n3803","n3800","n3801"],"tags":{"highway":"service","surface":"unpaved"}},"w654":{"id":"w654","nodes":["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],"tags":{"building":"yes"}},"w655":{"id":"w655","nodes":["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],"tags":{"building":"yes"}},"w656":{"id":"w656","nodes":["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],"tags":{"building":"yes"}},"w657":{"id":"w657","nodes":["n3772","n3773","n3774","n3775","n3772"],"tags":{"building":"yes"}},"w658":{"id":"w658","nodes":["n3776","n3777","n3784","n3789","n3776"],"tags":{"building":"yes"}},"w659":{"id":"w659","nodes":["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],"tags":{"leisure":"pitch","sport":"baseball"}},"w66":{"id":"w66","nodes":["n321","n322"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w660":{"id":"w660","nodes":["n3982","n3842","n3864","n3865","n3866","n3867","n3868","n3858","n3869","n3870","n3862"],"tags":{"highway":"service"}},"w661":{"id":"w661","nodes":["n3968","n3969"],"tags":{"highway":"footway"}},"w662":{"id":"w662","nodes":["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],"tags":{"amenity":"parking"}},"w663":{"id":"w663","nodes":["n3964","n3965"],"tags":{"highway":"footway"}},"w664":{"id":"w664","nodes":["n3966","n3967"],"tags":{"highway":"footway"}},"w665":{"id":"w665","nodes":["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],"tags":{"highway":"service","service":"parking_aisle"}},"w666":{"id":"w666","nodes":["n3895","n3896"],"tags":{"highway":"service","service":"parking_aisle"}},"w667":{"id":"w667","nodes":["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],"tags":{"access":"private","highway":"service","name":"Collins Drive"}},"w668":{"id":"w668","nodes":["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],"tags":{"building":"school"}},"w669":{"id":"w669","nodes":["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],"tags":{"highway":"service"}},"w67":{"id":"w67","nodes":["n322","n886","n323","n475"],"tags":{"footway":"crossing","highway":"footway"}},"w670":{"id":"w670","nodes":["n3473","n3859","n3860","n3980","n4908","n4865"],"tags":{"highway":"secondary","name":"Hoffman Street","ref":"M 60"}},"w671":{"id":"w671","nodes":["n3970","n3806","n3971"],"tags":{"highway":"footway"}},"w672":{"id":"w672","nodes":["n3892","n3893","n3894"],"tags":{"highway":"service","service":"parking_aisle"}},"w673":{"id":"w673","nodes":["n3945","n3946","n3992","n3990","n3945"],"tags":{"leisure":"pitch","sport":"tennis"}},"w674":{"id":"w674","nodes":["n3890","n3893","n3891"],"tags":{"highway":"service","service":"parking_aisle"}},"w675":{"id":"w675","nodes":["n3947","n3948","n3994","n3993","n3947"],"tags":{"leisure":"pitch","sport":"tennis"}},"w676":{"id":"w676","nodes":["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],"tags":{"highway":"service"}},"w677":{"id":"w677","nodes":["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3950","n3951","n3952","n3953","n3954","n3956","n3966","n3955"],"tags":{"highway":"footway"}},"w678":{"id":"w678","nodes":["n3887","n3888","n3895","n3899"],"tags":{"highway":"service","service":"parking_aisle"}},"w679":{"id":"w679","nodes":["n3946","n3947","n3993","n3992","n3946"],"tags":{"leisure":"pitch","sport":"tennis"}},"w68":{"id":"w68","nodes":["n294","n1952","n326"],"tags":{"footway":"sidewalk","highway":"footway"}},"w680":{"id":"w680","nodes":["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],"tags":{"leisure":"pitch","sport":"baseball"}},"w681":{"id":"w681","nodes":["n3990","n3991","n3944","n3945","n3990"],"tags":{"leisure":"pitch","sport":"tennis"}},"w682":{"id":"w682","nodes":["n3871","n3872","n3873","n3874","n3871"],"tags":{"amenity":"parking"}},"w683":{"id":"w683","nodes":["n3956","n3965","n3957","n3958","n3959"],"tags":{"footway":"sidewalk","highway":"footway"}},"w684":{"id":"w684","nodes":["n3790","n3791","n3792","n3793","n3790"],"tags":{"building":"shed"}},"w685":{"id":"w685","nodes":["n3794","n3795","n3796","n3797","n3794"],"tags":{"building":"yes"}},"w686":{"id":"w686","nodes":["n3798","n3799","n3804","n3805","n3798"],"tags":{"building":"yes"}},"w687":{"id":"w687","nodes":["n3806","n3807"],"tags":{"highway":"footway"}},"w688":{"id":"w688","nodes":["n3845","n3846","n3847","n3848","n3845"],"tags":{"leisure":"pitch","sport":"american_football"}},"w689":{"id":"w689","nodes":["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],"tags":{"leisure":"track","sport":"running"}},"w69":{"id":"w69","nodes":["n326","n327"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w690":{"id":"w690","nodes":["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],"tags":{"building":"yes"}},"w691":{"id":"w691","nodes":["n4028","n4029","n4030","n4031","n4028"],"tags":{"building":"yes"}},"w692":{"id":"w692","nodes":["n4032","n4033","n4034","n4035","n4032"],"tags":{"building":"yes"}},"w693":{"id":"w693","nodes":["n4036","n4037","n4038","n4039","n4036"],"tags":{"building":"yes"}},"w694":{"id":"w694","nodes":["n4040","n4041","n4042","n4043","n4040"],"tags":{"building":"yes"}},"w695":{"id":"w695","nodes":["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],"tags":{"building":"yes"}},"w696":{"id":"w696","nodes":["n4050","n4051","n4052","n4053","n4050"],"tags":{"building":"roof"}},"w697":{"id":"w697","nodes":["n4054","n4068","n4055","n4056","n4057","n4054"],"tags":{"building":"yes"}},"w698":{"id":"w698","nodes":["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],"tags":{"building":"yes"}},"w699":{"id":"w699","nodes":["n4064","n4066","n4065"],"tags":{"barrier":"fence"}},"w7":{"id":"w7","nodes":["n43","n44","n45"],"tags":{"highway":"service"}},"w70":{"id":"w70","nodes":["n327","n328","n27","n329"],"tags":{"footway":"sidewalk","highway":"footway"}},"w700":{"id":"w700","nodes":["n4066","n4067","n4068"],"tags":{"barrier":"fence"}},"w701":{"id":"w701","nodes":["n4069","n4070","n4071","n4072","n4069"],"tags":{"building":"shed"}},"w702":{"id":"w702","nodes":["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],"tags":{"building":"yes"}},"w703":{"id":"w703","nodes":["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],"tags":{"building":"yes"}},"w704":{"id":"w704","nodes":["n4093","n4094","n4095","n4096"],"tags":{"barrier":"fence"}},"w705":{"id":"w705","nodes":["n4097","n4098","n4099","n4100","n4097"],"tags":{"building":"yes"}},"w706":{"id":"w706","nodes":["n4098","n4102","n4087"],"tags":{"barrier":"fence"}},"w707":{"id":"w707","nodes":["n4101","n4102","n4096","n4170","n4103"],"tags":{"barrier":"fence"}},"w708":{"id":"w708","nodes":["n4104","n4105","n4106","n4107","n4104"],"tags":{"access":"private","leisure":"swimming_pool"}},"w709":{"id":"w709","nodes":["n4108","n4109","n4110","n4111","n4108"],"tags":{"building":"yes"}},"w71":{"id":"w71","nodes":["n329","n331"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w710":{"id":"w710","nodes":["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],"tags":{"building":"yes"}},"w711":{"id":"w711","nodes":["n4120","n4121","n4122","n4123","n4120"],"tags":{"building":"yes"}},"w712":{"id":"w712","nodes":["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],"tags":{"building":"yes"}},"w713":{"id":"w713","nodes":["n4130","n4131","n4132","n4133","n4130"],"tags":{"building":"shed"}},"w714":{"id":"w714","nodes":["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],"tags":{"building":"yes"}},"w715":{"id":"w715","nodes":["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],"tags":{"building":"yes"}},"w716":{"id":"w716","nodes":["n4150","n4151","n4152","n4153","n4150"],"tags":{"building":"yes"}},"w717":{"id":"w717","nodes":["n4154","n4155","n4156","n4157","n4154"],"tags":{"building":"yes"}},"w718":{"id":"w718","nodes":["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],"tags":{"building":"yes"}},"w719":{"id":"w719","nodes":["n4166","n4167","n4168","n4169","n4166"],"tags":{"building":"yes"}},"w72":{"id":"w72","nodes":["n331","n344","n332","n333","n334"],"tags":{"footway":"sidewalk","highway":"footway"}},"w720":{"id":"w720","nodes":["n4170","n4171"],"tags":{"barrier":"fence"}},"w721":{"id":"w721","nodes":["n4138","n4103"],"tags":{"barrier":"fence"}},"w722":{"id":"w722","nodes":["n4103","n4172"],"tags":{"barrier":"fence"}},"w723":{"id":"w723","nodes":["n4173","n4174"],"tags":{"barrier":"fence"}},"w724":{"id":"w724","nodes":["n4175","n4176","n4177","n4178","n4175"],"tags":{"building":"yes"}},"w725":{"id":"w725","nodes":["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],"tags":{"building":"yes"}},"w726":{"id":"w726","nodes":["n4185","n4186","n4187","n4188","n4185"],"tags":{"building":"yes"}},"w727":{"id":"w727","nodes":["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],"tags":{"building":"yes"}},"w728":{"id":"w728","nodes":["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],"tags":{"building":"yes"}},"w729":{"id":"w729","nodes":["n4211","n4212","n4213","n4214","n4211"],"tags":{"building":"shed"}},"w73":{"id":"w73","nodes":["n335","n336","n337","n338","n339","n340","n341","n342","n335"],"tags":{"building":"yes"}},"w730":{"id":"w730","nodes":["n4215","n4216","n4217","n4218","n4215"],"tags":{"building":"yes"}},"w731":{"id":"w731","nodes":["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],"tags":{"building":"yes"}},"w732":{"id":"w732","nodes":["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],"tags":{"building":"yes"}},"w733":{"id":"w733","nodes":["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],"tags":{"highway":"service"}},"w734":{"id":"w734","nodes":["n4240","n4249","n4248"],"tags":{"highway":"service","service":"parking_aisle"}},"w735":{"id":"w735","nodes":["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],"tags":{"amenity":"parking"}},"w736":{"id":"w736","nodes":["n4259","n4260","n4261","n4262","n4259"],"tags":{"building":"yes"}},"w737":{"id":"w737","nodes":["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],"tags":{"building":"yes"}},"w738":{"id":"w738","nodes":["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],"tags":{"building":"yes"}},"w739":{"id":"w739","nodes":["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],"tags":{"building":"yes"}},"w74":{"id":"w74","nodes":["n343","n344","n345"],"tags":{"highway":"service"}},"w740":{"id":"w740","nodes":["n4295","n4296","n4297","n4298","n4295"],"tags":{"building":"yes"}},"w741":{"id":"w741","nodes":["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],"tags":{"building":"yes"}},"w742":{"id":"w742","nodes":["n4311","n4312","n4313","n4314","n4311"],"tags":{"building":"shed"}},"w743":{"id":"w743","nodes":["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],"tags":{"building":"yes"}},"w744":{"id":"w744","nodes":["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],"tags":{"building":"yes"}},"w745":{"id":"w745","nodes":["n4335","n4336","n4337","n4338","n4335"],"tags":{"building":"shed"}},"w746":{"id":"w746","nodes":["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],"tags":{"building":"yes"}},"w747":{"id":"w747","nodes":["n4345","n4346","n4347","n4348","n4345"],"tags":{"building":"yes"}},"w748":{"id":"w748","nodes":["n4349","n4350","n4351","n4352","n4349"],"tags":{"building":"yes"}},"w749":{"id":"w749","nodes":["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],"tags":{"building":"yes"}},"w75":{"id":"w75","nodes":["n346","n347","n348","n349","n350","n351","n346"],"tags":{"amenity":"parking"}},"w750":{"id":"w750","nodes":["n4612","n4359","n4360"],"tags":{"barrier":"fence"}},"w751":{"id":"w751","nodes":["n4361","n4362","n4363","n4364","n4361"],"tags":{"building":"yes"}},"w752":{"id":"w752","nodes":["n4365","n4366","n4367","n4368","n4365"],"tags":{"building":"yes"}},"w753":{"id":"w753","nodes":["n4369","n4370","n4371","n4372","n4375","n4369"],"tags":{"building":"yes"}},"w754":{"id":"w754","nodes":["n4373","n4374","n4375"],"tags":{"barrier":"fence"}},"w755":{"id":"w755","nodes":["n4376","n4377","n4378","n4379","n4376"],"tags":{"building":"shed"}},"w756":{"id":"w756","nodes":["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],"tags":{"building":"yes"}},"w757":{"id":"w757","nodes":["n4392","n4393","n4394","n4395","n4392"],"tags":{"building":"yes"}},"w758":{"id":"w758","nodes":["n4396","n4397","n4398","n4399","n4396"],"tags":{"building":"shed"}},"w759":{"id":"w759","nodes":["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],"tags":{"building":"yes"}},"w76":{"id":"w76","nodes":["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w760":{"id":"w760","nodes":["n4416","n4417"],"tags":{"barrier":"fence"}},"w761":{"id":"w761","nodes":["n4418","n4416","n4419"],"tags":{"barrier":"fence"}},"w762":{"id":"w762","nodes":["n4420","n4421"],"tags":{"barrier":"fence"}},"w763":{"id":"w763","nodes":["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],"tags":{"building":"yes"}},"w764":{"id":"w764","nodes":["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],"tags":{"building":"yes"}},"w765":{"id":"w765","nodes":["n4446","n4447","n4448","n4449","n4446"],"tags":{"building":"yes"}},"w766":{"id":"w766","nodes":["n4450","n4451","n4452","n4453","n4450"],"tags":{"building":"yes"}},"w767":{"id":"w767","nodes":["n4454","n4455","n4456","n4457","n4454"],"tags":{"building":"yes"}},"w768":{"id":"w768","nodes":["n4461","n4458","n4460"],"tags":{"footway":"crossing","highway":"footway"}},"w769":{"id":"w769","nodes":["n4460","n4462","n4459"],"tags":{"footway":"sidewalk","highway":"footway"}},"w77":{"id":"w77","nodes":["n325","n360","n361"],"tags":{"footway":"crossing","highway":"footway"}},"w770":{"id":"w770","nodes":["n4462","n4463","n4464"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w771":{"id":"w771","nodes":["n4464","n4465","n4466","n4467"],"tags":{"footway":"sidewalk","highway":"footway"}},"w772":{"id":"w772","nodes":["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],"tags":{"footway":"sidewalk","highway":"footway"}},"w773":{"id":"w773","nodes":["n4467","n4468","n3959"],"tags":{"footway":"crossing","highway":"footway"}},"w774":{"id":"w774","nodes":["n4459","n4469","n4470"],"tags":{"footway":"crossing","highway":"footway"}},"w775":{"id":"w775","nodes":["n4470","n4471","n4472","n4473","n4474","n4475"],"tags":{"footway":"sidewalk","highway":"footway"}},"w776":{"id":"w776","nodes":["n4475","n4476","n4477"],"tags":{"footway":"crossing","highway":"footway"}},"w777":{"id":"w777","nodes":["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],"tags":{"footway":"sidewalk","highway":"footway"}},"w778":{"id":"w778","nodes":["n4488","n4489","n4490","n4491","n4488"],"tags":{"building":"yes"}},"w779":{"id":"w779","nodes":["n4492","n4493","n4494","n4495","n4492"],"tags":{"building":"yes"}},"w78":{"id":"w78","nodes":["n361","n362","n369"],"tags":{"footway":"sidewalk","highway":"footway"}},"w780":{"id":"w780","nodes":["n4496","n4497","n4498","n4499","n4496"],"tags":{"access":"private","leisure":"swimming_pool"}},"w781":{"id":"w781","nodes":["n4508","n4509"],"tags":{"footway":"sidewalk","highway":"footway"}},"w782":{"id":"w782","nodes":["n4510","n4511"],"tags":{"footway":"sidewalk","highway":"footway"}},"w783":{"id":"w783","nodes":["n4512","n4513"],"tags":{"footway":"sidewalk","highway":"footway"}},"w784":{"id":"w784","nodes":["n4513","n4514"],"tags":{"footway":"sidewalk","highway":"footway"}},"w785":{"id":"w785","nodes":["n4515","n4516"],"tags":{"footway":"sidewalk","highway":"footway"}},"w786":{"id":"w786","nodes":["n4517","n4515"],"tags":{"footway":"sidewalk","highway":"footway"}},"w787":{"id":"w787","nodes":["n4518","n4519"],"tags":{"footway":"sidewalk","highway":"footway"}},"w788":{"id":"w788","nodes":["n4519","n4520","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w789":{"id":"w789","nodes":["n4515","n4521","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w79":{"id":"w79","nodes":["n362","n363","n334"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w790":{"id":"w790","nodes":["n4515","n4522","n4523"],"tags":{"footway":"crossing","highway":"footway"}},"w791":{"id":"w791","nodes":["n4523","n4524","n4519"],"tags":{"footway":"crossing","highway":"footway"}},"w792":{"id":"w792","nodes":["n4523","n4525"],"tags":{"footway":"sidewalk","highway":"footway"}},"w793":{"id":"w793","nodes":["n4525","n4526","n4527"],"tags":{"footway":"crossing","highway":"footway"}},"w794":{"id":"w794","nodes":["n4527","n4529"],"tags":{"footway":"sidewalk","highway":"footway"}},"w795":{"id":"w795","nodes":["n4529","n4530","n4518"],"tags":{"footway":"crossing","highway":"footway"}},"w796":{"id":"w796","nodes":["n4518","n4531"],"tags":{"footway":"sidewalk","highway":"footway"}},"w797":{"id":"w797","nodes":["n4531","n4532"],"tags":{"footway":"sidewalk","highway":"footway"}},"w798":{"id":"w798","nodes":["n4533","n4534"],"tags":{"footway":"sidewalk","highway":"footway"}},"w799":{"id":"w799","nodes":["n4518","n4538","n4539"],"tags":{"footway":"crossing","highway":"footway"}},"w8":{"id":"w8","nodes":["n46","n47","n145","n48","n49","n46"],"tags":{"amenity":"parking"}},"w80":{"id":"w80","nodes":["n334","n364","n365"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w800":{"id":"w800","nodes":["n4539","n4540","n4541"],"tags":{"footway":"crossing","highway":"footway"}},"w801":{"id":"w801","nodes":["n4541","n4542","n4529"],"tags":{"footway":"crossing","highway":"footway"}},"w802":{"id":"w802","nodes":["n4552","n4553"],"tags":{"footway":"sidewalk","highway":"footway"}},"w803":{"id":"w803","nodes":["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],"tags":{"building":"yes"}},"w804":{"id":"w804","nodes":["n4562","n4563"],"tags":{"barrier":"retaining_wall"}},"w805":{"id":"w805","nodes":["n4568","n4569","n4570","n4571","n4568"],"tags":{"building":"yes"}},"w806":{"id":"w806","nodes":["n3473","n4575","n4576","n4581","n4580","n3551"],"tags":{"highway":"residential","oneway":"yes"}},"w807":{"id":"w807","nodes":["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],"tags":{"leisure":"pitch","sport":"baseball"}},"w808":{"id":"w808","nodes":["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],"tags":{"highway":"service"}},"w809":{"id":"w809","nodes":["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],"tags":{"highway":"service"}},"w81":{"id":"w81","nodes":["n365","n366","n367"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w810":{"id":"w810","nodes":["n4639","n4640","n4641"],"tags":{"barrier":"fence"}},"w811":{"id":"w811","nodes":["n4649","n4650","n4651","n4652","n4649"],"tags":{"building":"yes"}},"w812":{"id":"w812","nodes":["n4654","n4655"],"tags":{"barrier":"fence"}},"w813":{"id":"w813","nodes":["n4656","n4657"],"tags":{"barrier":"fence"}},"w814":{"id":"w814","nodes":["n4669","n4670","n4671","n4672","n4669"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w820":{"id":"w820","nodes":["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],"tags":{"natural":"wood"}},"w821":{"id":"w821","nodes":["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],"tags":{"natural":"scrub"}},"w822":{"id":"w822","nodes":["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],"tags":{"natural":"wood"}},"w823":{"id":"w823","nodes":["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],"tags":{"natural":"wood"}},"w824":{"id":"w824","nodes":["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],"tags":{"landuse":"recreation_ground"}},"w825":{"id":"w825","nodes":["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],"tags":{"landuse":"recreation_ground"}},"w826":{"id":"w826","nodes":["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],"tags":{"landuse":"industrial"}},"w827":{"id":"w827","nodes":["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],"tags":{"landuse":"industrial"}},"w828":{"id":"w828","nodes":["n4843","n4844","n4845","n4846","n4843"],"tags":{"landuse":"farmland"}},"w829":{"id":"w829","nodes":["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],"tags":{"aeroway":"aerodrome","name":"Three Rivers Municipal Airport"}},"w83":{"id":"w83","nodes":["n371","n372","n373","n374","n371"],"tags":{"building":"yes"}},"w830":{"id":"w830","nodes":["n4855","n4854","n4857","n4853","n4960"],"tags":{"barrier":"fence"}},"w831":{"id":"w831","nodes":["n4860","n4859","n4858","n4852","n4851"],"tags":{"barrier":"fence"}},"w832":{"id":"w832","nodes":["n4866","n4878","n4869","n4867"],"tags":{"aeroway":"runway","ref":"5/23"}},"w833":{"id":"w833","nodes":["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],"tags":{"aeroway":"runway","ref":"9/27"}},"w834":{"id":"w834","nodes":["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],"tags":{"aeroway":"apron"}},"w835":{"id":"w835","nodes":["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],"tags":{"aeroway":"taxiway"}},"w836":{"id":"w836","nodes":["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],"tags":{"aeroway":"taxiway"}},"w837":{"id":"w837","nodes":["n4893","n4894"],"tags":{"aeroway":"taxiway"}},"w838":{"id":"w838","nodes":["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],"tags":{"aeroway":"taxiway"}},"w839":{"id":"w839","nodes":["n4907","n4908"],"tags":{"highway":"service"}},"w84":{"id":"w84","nodes":["n374","n375","n376","n377","n373","n374"],"tags":{"building":"yes"}},"w840":{"id":"w840","nodes":["n4909","n4907","n4910"],"tags":{"highway":"service"}},"w841":{"id":"w841","nodes":["n4911","n4912","n4913","n4914","n4911"],"tags":{"building":"yes"}},"w842":{"id":"w842","nodes":["n4915","n4916","n4917","n4918","n4915"],"tags":{"aeroway":"hangar","building":"yes"}},"w843":{"id":"w843","nodes":["n4919","n4920","n4921","n4922","n4919"],"tags":{"building":"yes"}},"w844":{"id":"w844","nodes":["n4923","n4924","n4925","n4926","n4923"],"tags":{"aeroway":"hangar","building":"yes"}},"w845":{"id":"w845","nodes":["n4927","n4928","n4929","n4930","n4927"],"tags":{"aeroway":"hangar","building":"yes"}},"w846":{"id":"w846","nodes":["n4931","n4932","n4933","n4934","n4931"],"tags":{"aeroway":"hangar","building":"yes"}},"w847":{"id":"w847","nodes":["n4935","n4936","n4937","n4938","n4935"],"tags":{"aeroway":"hangar","building":"yes"}},"w848":{"id":"w848","nodes":["n4939","n4940","n4941","n4942","n4939"],"tags":{"aeroway":"hangar","building":"yes"}},"w849":{"id":"w849","nodes":["n4943","n4944","n4945","n4946","n4943"],"tags":{"aeroway":"hangar","building":"yes"}},"w85":{"id":"w85","nodes":["n431","n432","n1038","n433","n434","n1040","n431"],"tags":{"building":"yes"}},"w850":{"id":"w850","nodes":["n4947","n4948","n4949","n4950","n4947"],"tags":{"aeroway":"hangar","building":"yes"}},"w851":{"id":"w851","nodes":["n4951","n4952","n4953","n4954","n4951"],"tags":{"aeroway":"hangar","building":"yes"}},"w852":{"id":"w852","nodes":["n4955","n4956","n4957","n4958","n4955"],"tags":{"aeroway":"hangar","building":"yes"}},"w853":{"id":"w853","nodes":["n4959","n4864","n4861","n4862","n4863"],"tags":{"barrier":"fence"}},"w854":{"id":"w854","nodes":["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],"tags":{"landuse":"farmland"}},"w855":{"id":"w855","nodes":["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],"tags":{"landuse":"farmland"}},"w856":{"id":"w856","nodes":["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],"tags":{"natural":"scrub"}},"w857":{"id":"w857","nodes":["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],"tags":{"landuse":"farmland"}},"w858":{"id":"w858","nodes":["n5001","n5003","n5004","n4999","n5000","n5001"],"tags":{"natural":"scrub"}},"w859":{"id":"w859","nodes":["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],"tags":{"landuse":"farmland"}},"w86":{"id":"w86","nodes":["n384","n385","n386","n387","n384"],"tags":{"building":"yes"}},"w860":{"id":"w860","nodes":["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],"tags":{"landuse":"industrial"}},"w87":{"id":"w87","nodes":["n387","n388","n389","n386","n387"],"tags":{"building":"yes"}},"w88":{"id":"w88","nodes":["n390","n391","n392","n393","n390"],"tags":{"building":"yes"}},"w89":{"id":"w89","nodes":["n394","n2895"],"tags":{"highway":"service"}},"w9":{"id":"w9","nodes":["n50","n51","n148","n52","n57","n891","n53","n50"],"tags":{"building":"yes"}},"w90":{"id":"w90","nodes":["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],"tags":{"building":"yes"}},"w91":{"id":"w91","nodes":["n418","n423","n419"],"tags":{"highway":"service"}},"w92":{"id":"w92","nodes":["n420","n421","n422","n423","n420"],"tags":{"amenity":"parking"}},"w93":{"id":"w93","nodes":["n2282","n1876"],"tags":{"name":"Rocky River","tunnel":"building_passage","waterway":"river"}},"w94":{"id":"w94","nodes":["n1876","n885","n1875","n2234"],"tags":{"name":"Rocky River","waterway":"river"}},"w95":{"id":"w95","nodes":["n425","n426","n427","n914","n428","n913","n425"],"tags":{"building":"yes"}},"w96":{"id":"w96","nodes":["n456","n620","n1034","n1035","n456"],"tags":{"building":"yes"}},"w97":{"id":"w97","nodes":["n435","n912","n451","n321"],"tags":{"highway":"footway"}},"w98":{"id":"w98","nodes":["n436","n319","n437","n438","n439","n440","n441","n476","n442"],"tags":{"highway":"service"}},"w99":{"id":"w99","nodes":["n443","n444","n445","n446","n447","n448","n449","n450","n443"],"tags":{"amenity":"parking"}}};
+            d3_select('.preset-search-input')
+                .on('keydown.intro', null)
+                .on('keyup.intro', checkPresetSearch);
 
-// toggles the visibility of ui elements, using a combination of the
-// hide class, which sets display=none, and a d3 transition for opacity.
-// this will cause blinking when called repeatedly, so check that the
-// value actually changes between calls.
-function uiToggle(show, callback) {
-    return function(selection) {
-        selection
-            .style('opacity', show ? 0 : 1)
-            .classed('hide', false)
-            .transition()
-            .style('opacity', show ? 1 : 0)
-            .on('end', function() {
-                d3_select(this)
-                    .classed('hide', !show)
-                    .style('opacity', null);
-                if (callback) callback.apply(this);
-            });
-    };
-}
+            reveal('.preset-search-input',
+                t('intro.buildings.search_tank', { preset: tankPreset.name() })
+            );
+        }, 400);  // after preset list pane visible..
 
-// Tooltips and svg mask used to highlight certain features
-function uiCurtain() {
+        context.on('enter.intro', function(mode) {
+            if (!tankId || !context.hasEntity(tankId)) {
+                return continueTo(addTank);
+            }
 
-    var surface = d3_select(null),
-        tooltip = d3_select(null),
-        darkness = d3_select(null);
+            var ids = context.selectedIDs();
+            if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
+                // keep the user's area selected..
+                context.enter(modeSelect(context, [tankId]));
 
-    function curtain(selection) {
-        surface = selection
-            .append('svg')
-            .attr('id', 'curtain')
-            .style('z-index', 1000)
-            .style('pointer-events', 'none')
-            .style('position', 'absolute')
-            .style('top', 0)
-            .style('left', 0);
+                // reset pane, in case user somehow happened to change it..
+                d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+                // disallow scrolling
+                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-        darkness = surface.append('path')
-            .attr('x', 0)
-            .attr('y', 0)
-            .attr('class', 'curtain-darkness');
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', null)
+                    .on('keyup.intro', checkPresetSearch);
 
-        d3_select(window).on('resize.curtain', resize);
+                reveal('.preset-search-input',
+                    t('intro.buildings.search_tank', { preset: tankPreset.name() })
+                );
 
-        tooltip = selection.append('div')
-            .attr('class', 'tooltip')
-            .style('z-index', 1002);
+                context.history().on('change.intro', null);
+            }
+        });
 
-        tooltip
-            .append('div')
-            .attr('class', 'tooltip-arrow');
+        function checkPresetSearch() {
+            var first = d3_select('.preset-list-item:first-child');
 
-        tooltip
-            .append('div')
-            .attr('class', 'tooltip-inner');
+            if (first.classed('preset-man_made-storage_tank')) {
+                reveal(first.select('.preset-list-button').node(),
+                    t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
+                    { duration: 300 }
+                );
 
-        resize();
+                d3_select('.preset-search-input')
+                    .on('keydown.intro', eventCancel, true)
+                    .on('keyup.intro', null);
 
+                context.history().on('change.intro', function() {
+                    continueTo(closeEditorTank);
+                });
+            }
+        }
 
-        function resize() {
-            surface
-                .attr('width', window.innerWidth)
-                .attr('height', window.innerHeight);
-            curtain.cut(darkness.datum());
+        function continueTo(nextStep) {
+            d3_select('.inspector-wrap').on('wheel.intro', null);
+            context.on('enter.intro', null);
+            context.history().on('change.intro', null);
+            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+            nextStep();
         }
     }
 
 
-    /**
-     * Reveal cuts the curtain to highlight the given box,
-     * and shows a tooltip with instructions next to the box.
-     *
-     * @param  {String|ClientRect} [box]   box used to cut the curtain
-     * @param  {String}    [text]          text for a tooltip
-     * @param  {Object}    [options]
-     * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
-     * @param  {integer}   [options.duration]        transition time in milliseconds
-     * @param  {string}    [options.buttonText]      if set, create a button with this text label
-     * @param  {function}  [options.buttonCallback]  if set, the callback for the button
-     * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
-     */
-    curtain.reveal = function(box, text, options) {
-        if (typeof box === 'string') {
-            box = d3_select(box).node();
+    function closeEditorTank() {
+        if (!tankId || !context.hasEntity(tankId)) {
+            return addTank();
         }
-        if (box && box.getBoundingClientRect) {
-            box = copyBox(box.getBoundingClientRect());
+        var ids = context.selectedIDs();
+        if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
+            context.enter(modeSelect(context, [tankId]));
         }
 
-        options = options || {};
+        context.history().checkpoint('hasTank');
 
-        var tooltipBox;
-        if (options.tooltipBox) {
-            tooltipBox = options.tooltipBox;
-            if (typeof tooltipBox === 'string') {
-                tooltipBox = d3_select(tooltipBox).node();
-            }
-            if (tooltipBox && tooltipBox.getBoundingClientRect) {
-                tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
-            }
-        } else {
-            tooltipBox = box;
+        context.on('exit.intro', function() {
+            continueTo(rightClickTank);
+        });
+
+        timeout(function() {
+            reveal('.entity-editor-pane',
+                t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
+            );
+        }, 500);
+
+        function continueTo(nextStep) {
+            context.on('exit.intro', null);
+            nextStep();
         }
+    }
 
-        if (tooltipBox && text) {
-            // pseudo markdown bold text for the instruction section..
-            var parts = text.split('**');
-            var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
-            if (parts[1]) {
-                html += '<span class="instruction">' + parts[1] + '</span>';
-            }
 
-            html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
-            html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
+    function rightClickTank() {
+        if (!tankId) return continueTo(addTank);
+
+        context.enter(modeBrowse(context));
+        context.history().reset('hasTank');
+        context.map().centerEase(tank, 500);
+
+        timeout(function() {
+            context.on('enter.intro', function(mode) {
+                if (mode.id !== 'select') return;
+                var ids = context.selectedIDs();
+                if (ids.length !== 1 || ids[0] !== tankId) return;
+
+                timeout(function() {
+                    var node = selectMenuItem('circularize').node();
+                    if (!node) return;
+                    continueTo(clickCircle);
+                }, 300);  // after menu visible
+            });
+
+            revealTank(tank, t('intro.buildings.rightclick_tank'));
+
+            context.map().on('move.intro drawn.intro', function() {
+                revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
+            });
+
+            context.history().on('change.intro', function() {
+                continueTo(rightClickTank);
+            });
+
+        }, 600);
+
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
-            if (options.buttonText && options.buttonCallback) {
-                html += '<div class="button-section">' +
-                    '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
-            }
 
-            var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
-            tooltip
-                .classed(classes, true)
-                .selectAll('.tooltip-inner')
-                .html(html);
+    function clickCircle() {
+        if (!tankId) return chapter.restart();
+        var entity = context.hasEntity(tankId);
+        if (!entity) return continueTo(rightClickTank);
 
-            if (options.buttonText && options.buttonCallback) {
-                var button = tooltip.selectAll('.button-section .button.action');
-                button
-                    .on('click', function() {
-                        event.preventDefault();
-                        options.buttonCallback();
-                    });
-            }
+        var node = selectMenuItem('circularize').node();
+        if (!node) { return continueTo(rightClickTank); }
 
-            var tip = copyBox(tooltip.node().getBoundingClientRect()),
-                w = window.innerWidth,
-                h = window.innerHeight,
-                tooltipWidth = 200,
-                tooltipArrow = 5,
-                side, pos;
+        var wasChanged = false;
+        var menuCoords = context.map().mouseCoordinates();
 
+        revealEditMenu(menuCoords,
+            t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
+        );
 
-            // hack: this will have bottom placement,
-            // so need to reserve extra space for the tooltip illustration.
-            if (options.tooltipClass === 'intro-mouse') {
-                tip.height += 80;
+        context.on('enter.intro', function(mode) {
+            if (mode.id === 'browse') {
+                continueTo(rightClickTank);
+            } else if (mode.id === 'move' || mode.id === 'rotate') {
+                continueTo(retryClickCircle);
             }
+        });
 
-            // trim box dimensions to just the portion that fits in the window..
-            if (tooltipBox.top + tooltipBox.height > h) {
-                tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
-            }
-            if (tooltipBox.left + tooltipBox.width > w) {
-                tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
-            }
+        context.map().on('move.intro drawn.intro', function() {
+            var node = selectMenuItem('circularize').node();
+            if (!wasChanged && !node) { return continueTo(rightClickTank); }
 
-            // determine tooltip placement..
+            revealEditMenu(menuCoords,
+                t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
+                { duration: 0 }
+            );
+        });
 
-            if (tooltipBox.top + tooltipBox.height < 100) {
-                // tooltip below box..
-                side = 'bottom';
-                pos = [
-                    tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
-                    tooltipBox.top + tooltipBox.height
-                ];
+        context.history().on('change.intro', function() {
+            wasChanged = true;
+            context.history().on('change.intro', null);
 
-            } else if (tooltipBox.top > h - 140) {
-                // tooltip above box..
-                side = 'top';
-                pos = [
-                    tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
-                    tooltipBox.top - tip.height
-                ];
+            // Something changed.  Wait for transition to complete and check undo annotation.
+            timeout(function() {
+                if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
+                    continueTo(play);
+                } else {
+                    continueTo(retryClickCircle);
+                }
+            }, 500);  // after transitioned actions
+        });
 
-            } else {
-                // tooltip to the side of the tooltipBox..
-                var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
+        function continueTo(nextStep) {
+            context.on('enter.intro', null);
+            context.map().on('move.intro drawn.intro', null);
+            context.history().on('change.intro', null);
+            nextStep();
+        }
+    }
 
-                if (textDirection === 'rtl') {
-                    if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
-                        side = 'right';
-                        pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
 
-                    } else {
-                        side = 'left';
-                        pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
-                    }
+    function retryClickCircle() {
+        context.enter(modeBrowse(context));
 
-                } else {
-                    if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
-                        side = 'left';
-                        pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
-                    }
-                    else {
-                        side = 'right';
-                        pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
-                    }
-                }
-            }
+        revealTank(tank, t('intro.buildings.retry_circle'), {
+            buttonText: t('intro.ok'),
+            buttonCallback: function() { continueTo(rightClickTank); }
+        });
 
-            if (options.duration !== 0 || !tooltip.classed(side)) {
-                tooltip.call(uiToggle(true));
+        function continueTo(nextStep) {
+            nextStep();
+        }
+    }
+
+
+    function play() {
+        dispatch$$1.call('done');
+        reveal('#id-container',
+            t('intro.buildings.play', { next: t('intro.startediting.title') }), {
+                tooltipBox: '.intro-nav-wrap .chapter-startEditing',
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { reveal('#id-container'); }
             }
+        );
+    }
 
-            tooltip
-                .style('top', pos[1] + 'px')
-                .style('left', pos[0] + 'px')
-                .attr('class', classes + ' ' + side);
 
+    chapter.enter = function() {
+        addHouse();
+    };
 
-            // shift tooltip-inner if it is very close to the top or bottom edge
-            // (doesn't affect the placement of the tooltip-arrow)
-            var shiftY = 0;
-            if (side === 'left' || side === 'right') {
-                if (pos[1] < 60) {
-                    shiftY = 60 - pos[1];
-                }
-                else if (pos[1] + tip.height > h - 100) {
-                    shiftY = h - pos[1] - tip.height - 100;
-                }
-            }
-            tooltip.selectAll('.tooltip-inner')
-                .style('top', shiftY + 'px');
 
-        } else {
-            tooltip
-                .classed('in', false)
-                .call(uiToggle(false));
-        }
+    chapter.exit = function() {
+        timeouts.forEach(window.clearTimeout);
+        context.on('enter.intro exit.intro', null);
+        context.map().on('move.intro drawn.intro', null);
+        context.history().on('change.intro', null);
+        d3_select('.inspector-wrap').on('wheel.intro', null);
+        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
+        d3_select('.more-fields .combobox-input').on('click.intro', null);
+    };
 
-        curtain.cut(box, options.duration);
 
-        return tooltip;
+    chapter.restart = function() {
+        chapter.exit();
+        chapter.enter();
     };
 
 
-    curtain.cut = function(datum, duration) {
-        darkness.datum(datum)
-            .interrupt();
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-        var selection;
-        if (duration === 0) {
-            selection = darkness;
-        } else {
-            selection = darkness
-                .transition()
-                .duration(duration || 600)
-                .ease(linear$1);
-        }
+function uiModal(selection, blocking) {
+    var keybinding = d3keybinding('modal');
+    var previous = selection.select('div.modal');
+    var animate = previous.empty();
 
-        selection
-            .attr('d', function(d) {
-                var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
-                    window.innerWidth + ',' + window.innerHeight + 'L' +
-                    window.innerWidth + ',0 Z';
+    previous.transition()
+        .duration(200)
+        .style('opacity', 0)
+        .remove();
 
-                if (!d) return string;
-                return string + 'M' +
-                    d.left + ',' + d.top + 'L' +
-                    d.left + ',' + (d.top + d.height) + 'L' +
-                    (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
-                    (d.left + d.width) + ',' + (d.top) + 'Z';
+    var shaded = selection
+        .append('div')
+        .attr('class', 'shaded')
+        .style('opacity', 0);
 
-            });
-    };
+    shaded.close = function() {
+        shaded
+            .transition()
+            .duration(200)
+            .style('opacity',0)
+            .remove();
 
+        modal
+            .transition()
+            .duration(200)
+            .style('top','0px');
 
-    curtain.remove = function() {
-        surface.remove();
-        tooltip.remove();
-        d3_select(window).on('resize.curtain', null);
+        keybinding.off();
     };
 
 
-    // ClientRects are immutable, so copy them to an object,
-    // in case we need to trim the height/width.
-    function copyBox(src) {
-        return {
-            top: src.top,
-            right: src.right,
-            bottom: src.bottom,
-            left: src.left,
-            width: src.width,
-            height: src.height
-        };
+    var modal = shaded
+        .append('div')
+        .attr('class', 'modal fillL col6');
+
+    if (!blocking) {
+        shaded.on('click.remove-modal', function() {
+            if (event.target === this) {
+                shaded.close();
+            }
+        });
+
+        modal.append('button')
+            .attr('class', 'close')
+            .on('click', shaded.close)
+            .call(svgIcon('#icon-close'));
+
+        keybinding
+            .on('⌫', shaded.close)
+            .on('⎋', shaded.close);
+
+        d3_select(document)
+            .call(keybinding);
     }
 
+    modal
+        .append('div')
+        .attr('class', 'content');
 
-    return curtain;
+    if (animate) {
+        shaded.transition().style('opacity', 1);
+    } else {
+        shaded.style('opacity', 1);
+    }
+
+
+    return shaded;
 }
 
-function uiIntroWelcome(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        listener = clickListener();
+function uiIntroStartEditing(context, reveal) {
+    var dispatch$$1 = dispatch('done', 'startEditing'),
+        modalSelection = d3_select(null);
+
 
     var chapter = {
-        title: 'intro.welcome.title'
+        title: 'intro.startediting.title'
     };
 
-
-    function welcome() {
-        context.map().centerZoom([-85.63591, 41.94285], 19);
-        reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.welcome'),
-            { buttonText: t('intro.ok'), buttonCallback: practice }
+    function showHelp() {
+        reveal('.map-control.help-control',
+            t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { shortcuts(); }
+            }
         );
     }
 
-    function practice() {
-        reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.practice'),
-            { buttonText: t('intro.ok'), buttonCallback: words }
+    function shortcuts() {
+        reveal('.map-control.help-control',
+            t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { showSave(); }
+            }
         );
     }
 
-    function words() {
-        reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.words'),
-            { buttonText: t('intro.ok'), buttonCallback: mouse }
+    function showSave() {
+        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
+        reveal('#bar button.save',
+            t('intro.startediting.save'), {
+                buttonText: t('intro.ok'),
+                buttonCallback: function() { showStart(); }
+            }
         );
     }
 
+    function showStart() {
+        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
+
+        modalSelection = uiModal(context.container());
 
-    function mouse() {
-        reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.mouse'),
-            { buttonText: t('intro.ok'), buttonCallback: leftClick }
-        );
+        modalSelection.select('.modal')
+            .attr('class', 'modal-splash modal col6');
+
+        modalSelection.selectAll('.close').remove();
+
+        var startbutton = modalSelection.select('.content')
+            .attr('class', 'fillL')
+            .append('button')
+                .attr('class', 'modal-section huge-modal-button')
+                .on('click', function() {
+                    modalSelection.remove();
+                });
+
+            startbutton
+                .append('svg')
+                .attr('class', 'illustration')
+                .append('use')
+                .attr('xlink:href', '#logo-walkthrough');
+
+            startbutton
+                .append('h2')
+                .text(t('intro.startediting.start'));
+
+        dispatch$$1.call('startEditing');
     }
 
 
-    function leftClick() {
-        var counter = 0,
-            times = 5;
+    chapter.enter = function() {
+        showHelp();
+    };
 
-        var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.leftclick', { num: times }),
-            { tooltipClass: 'intro-mouse' }
-        );
 
-        tooltip.selectAll('.tooltip-inner')
-            .insert('svg', 'span')
-            .attr('class', 'tooltip-illustration')
-            .append('use')
-            .attr('xlink:href', '#walkthrough-mouse');
+    chapter.exit = function() {
+        modalSelection.remove();
+        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
+    };
 
-        tooltip
-            .append('div')
-            .attr('class', 'counter');
 
-        tooltip.call(listener);
+    return utilRebind(chapter, dispatch$$1, 'on');
+}
 
-        listener.on('click', function(which) {
-            if (which === 'left') {
-                d3_select('.curtain-tooltip.intro-mouse .counter')
-                    .text(String(++counter));
+var chapterUi = {
+    welcome: uiIntroWelcome,
+    navigation: uiIntroNavigation,
+    point: uiIntroPoint,
+    area: uiIntroArea,
+    line: uiIntroLine,
+    building: uiIntroBuilding,
+    startEditing: uiIntroStartEditing
+};
 
-                if (counter === times) {
-                    window.setTimeout(function() { continueTo(rightClick); }, 1000);
-                }
-            }
-        });
+var chapterFlow = [
+    'welcome',
+    'navigation',
+    'point',
+    'area',
+    'line',
+    'building',
+    'startEditing'
+];
 
-        function continueTo(nextStep) {
-            listener.on('click', null);
-            tooltip.call(listener.off);
-            tooltip.select('.counter').remove();
-            nextStep();
-        }
-    }
 
+function uiIntro(context) {
+    var introGraph = {},
+        currChapter;
 
-    function rightClick() {
-        var counter = 0,
-            times = 5;
 
-        var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
-            t('intro.welcome.rightclick', { num: times }),
-            { tooltipClass: 'intro-mouse' }
-        );
+    // create entities for intro graph and localize names
+    for (var id in dataIntroGraph) {
+        introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
+    }
 
-        tooltip.selectAll('.tooltip-inner')
-            .insert('svg', 'span')
-            .attr('class', 'tooltip-illustration')
-            .append('use')
-            .attr('xlink:href', '#walkthrough-mouse');
 
-        tooltip
-            .append('div')
-            .attr('class', 'counter');
+    function intro(selection) {
+        context.enter(modeBrowse(context));
 
-        tooltip.call(listener);
+        // Save current map state
+        var osm = context.connection(),
+            history = context.history().toJSON(),
+            hash = window.location.hash,
+            center = context.map().center(),
+            zoom = context.map().zoom(),
+            background = context.background().baseLayerSource(),
+            overlays = context.background().overlayLayerSources(),
+            opacity = d3_selectAll('#map .layer-background').style('opacity'),
+            loadedTiles = osm && osm.loadedTiles(),
+            baseEntities = context.history().graph().base().entities,
+            countryCode = services.geocoder.countryCode;
 
-        listener.on('click', function(which) {
-            if (which === 'right') {
-                d3_select('.curtain-tooltip.intro-mouse .counter')
-                    .text(String(++counter));
+        // Block saving
+        context.inIntro(true);
 
-                if (counter === times) {
-                    window.setTimeout(function() { continueTo(chapters); }, 1000);
-                }
-            }
-        });
+        // Load semi-real data used in intro
+        if (osm) { osm.toggle(false).reset(); }
+        context.history().reset();
+        context.history().merge(values$1(coreGraph().load(introGraph).entities));
+        context.history().checkpoint('initial');
 
-        function continueTo(nextStep) {
-            listener.on('click', null);
-            tooltip.call(listener.off);
-            tooltip.select('.counter').remove();
-            nextStep();
+        var esri = context.background().findSource('EsriWorldImagery');
+        if (esri) {
+            context.background().baseLayerSource(esri);
+        } else {
+            context.background().bing();
         }
-    }
+        overlays.forEach(function (d) {
+            context.background().toggleOverlayLayer(d);
+        });
+
+        // Mock geocoder
+        services.geocoder.countryCode = function(location, callback) {
+            callback(null, t('intro.graph.countrycode'));
+        };
 
+        d3_selectAll('#map .layer-background').style('opacity', 1);
 
-    function chapters() {
-        dispatch$$1.call('done');
-        reveal('.intro-nav-wrap .chapter-navigation',
-            t('intro.welcome.chapters', { next: t('intro.navigation.title') })
-        );
-    }
+        var curtain = uiCurtain();
+        selection.call(curtain);
 
+        // store that the user started the walkthrough..
+        context.storage('walkthrough_started', 'yes');
 
-    chapter.enter = function() {
-        welcome();
-    };
+        // restore previous walkthrough progress..
+        var storedProgress = context.storage('walkthrough_progress') || '';
+        var progress = storedProgress.split(';').filter(Boolean);
+
+        var chapters = chapterFlow.map(function(chapter, i) {
+            var s = chapterUi[chapter](context, curtain.reveal)
+                .on('done', function() {
+                    context.presets().init();  // clear away "recent" presets
+
+                    buttons.filter(function(d) {
+                        return d.title === s.title;
+                    }).classed('finished', true);
+
+                    if (i < chapterFlow.length - 1) {
+                        var next = chapterFlow[i + 1];
+                        d3_select('button.chapter-' + next)
+                            .classed('next', true);
+                    }
 
+                    // store walkthrough progress..
+                    progress.push(chapter);
+                    context.storage('walkthrough_progress', uniq(progress).join(';'));
+                });
+            return s;
+        });
 
-    chapter.exit = function() {
-        listener.off();
-    };
+        chapters[chapters.length - 1].on('startEditing', function() {
+            // store walkthrough progress..
+            progress.push('startEditing');
+            context.storage('walkthrough_progress', uniq(progress).join(';'));
 
+            // store if walkthrough is completed..
+            var incomplete = difference(chapterFlow, progress);
+            if (!incomplete.length) {
+                context.storage('walkthrough_completed', 'yes');
+            }
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
-    };
+            curtain.remove();
+            navwrap.remove();
+            d3_selectAll('#map .layer-background').style('opacity', opacity);
+            if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
+            context.history().reset().merge(values$1(baseEntities));
+            context.background().baseLayerSource(background);
+            overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
+            if (history) { context.history().fromJSON(history, false); }
+            context.map().centerZoom(center, zoom);
+            window.location.replace(hash);
+            services.geocoder.countryCode = countryCode;
+            context.inIntro(false);
+        });
 
+        var navwrap = selection
+            .append('div')
+            .attr('class', 'intro-nav-wrap fillD');
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
+        navwrap
+            .append('svg')
+            .attr('class', 'intro-nav-wrap-logo')
+            .append('use')
+            .attr('xlink:href', '#logo-walkthrough');
 
+        var buttonwrap = navwrap
+            .append('div')
+            .attr('class', 'joined')
+            .selectAll('button.chapter');
 
+        var buttons = buttonwrap
+            .data(chapters)
+            .enter()
+            .append('button')
+            .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
+            .on('click', enterChapter);
 
-function clickListener() {
-    var dispatch$$1 = dispatch('click'),
-        minTime = 120,
-        tooltip = d3_select(null),
-        down = {};
+        buttons
+            .append('span')
+            .text(function(d) { return t(d.title); });
 
-    // `down` keeps track of which buttons/keys are down.
-    // Setting a property in `down` happens immediately.
-    // Unsetting a property in `down` is delayed because
-    //   on Windows a contextmenu event happens after keyup/mouseup
+        buttons
+            .append('span')
+            .attr('class', 'status')
+            .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
 
-    function keydown() {
-        if (event.keyCode === 93)  {   // context menu
-            event.preventDefault();
-            event.stopPropagation();
-            down.menu = event.timeStamp;
-            tooltip.classed('rightclick', true);
-        }
-    }
+        enterChapter(chapters[0]);
 
 
-    function keyup() {
-        if (event.keyCode === 93)  {   // context menu
-            event.preventDefault();
-            event.stopPropagation();
-            var endTime = event.timeStamp,
-                startTime = down.menu || endTime,
-                delay = (endTime - startTime < minTime) ? minTime : 0;
+        function enterChapter(newChapter) {
+            if (currChapter) { currChapter.exit(); }
+            context.enter(modeBrowse(context));
 
-            window.setTimeout(function() {
-                tooltip.classed('rightclick', false);
-                down.menu = undefined;  // delayed, for Windows
-            }, delay);
+            currChapter = newChapter;
+            currChapter.enter();
 
-            dispatch$$1.call('click', this, 'right');
+            buttons
+                .classed('next', false)
+                .classed('active', function(d) {
+                    return d.title === currChapter.title;
+                });
         }
     }
 
 
-    function mousedown() {
-        var button = event.button;
-        if (button === 0 && !event.ctrlKey) {
-            tooltip.classed('leftclick', true);
-        } else if (button === 2) {
-            tooltip.classed('rightclick', true);
-        }
-        down[button] = event.timeStamp;
-    }
+    return intro;
+}
 
+function uiTooltipHtml(text, key, heading) {
+    var s = '';
 
-    function mouseup() {
-        var button = event.button,
-            endTime = event.timeStamp,
-            startTime = down[button] || endTime,
-            delay = (endTime - startTime < minTime) ? minTime : 0;
+    if (heading) {
+        s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
+    }
+    if (text) {
+        s += '<div class="tooltip-text"><span>' + text + '</span></div>';
+    }
+    if (key) {
+        s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
+            '<span class="keyhint">' + key + '</span></div>';
+    }
 
-        if (button === 0 && !event.ctrlKey) {
-            window.setTimeout(function() {
-                tooltip.classed('leftclick', false);
-                down[button] = undefined;  // delayed, for Windows
-            }, delay);
+    return s;
+}
 
-            dispatch$$1.call('click', this, 'left');
+function uiMapData(context) {
+    var key = t('map_data.key');
+    var features = context.features().keys();
+    var layers = context.layers();
+    var fills = ['wireframe', 'partial', 'full'];
 
-        } else if (button === 2) {
-            window.setTimeout(function() {
-                tooltip.classed('rightclick', false);
-                down[button] = undefined;  // delayed, for Windows
-            }, delay);
+    var _fillSelected = context.storage('area-fill') || 'partial';
+    var _shown = false;
+    var _dataLayerContainer = d3_select(null);
+    var _fillList = d3_select(null);
+    var _featureList = d3_select(null);
 
-            dispatch$$1.call('click', this, 'right');
 
-        } else {
-            window.setTimeout(function() {
-                down[button] = undefined;  // delayed, for Windows
-            }, delay);
-        }
+    function showsFeature(d) {
+        return context.features().enabled(d);
     }
 
 
-    function contextmenu() {
-        event.preventDefault();
-        event.stopPropagation();
-        if (!down[2] && !down.menu) {
-            tooltip.classed('rightclick', true);
-            window.setTimeout(function() {
-                tooltip.classed('rightclick', false);
-            }, minTime);
-            dispatch$$1.call('click', this, 'right');
-        }
+    function autoHiddenFeature(d) {
+        return context.features().autoHidden(d);
     }
 
 
-    var behavior = function(selection) {
-        tooltip = selection;
-        down = {};
-
-        d3_select(window)
-            .on('keydown.intro', keydown)
-            .on('keyup.intro', keyup)
-            .on('mousedown.intro', mousedown)
-            .on('mouseup.intro', mouseup)
-            .on('contextmenu.intro', contextmenu);
-    };
+    function clickFeature(d) {
+        context.features().toggle(d);
+        update();
+    }
 
 
-    behavior.off = function() {
-        d3_select(window)
-            .on('keydown.intro', null)
-            .on('keyup.intro', null)
-            .on('mousedown.intro', null)
-            .on('mouseup.intro', null)
-            .on('contextmenu.intro', null);
+    function showsFill(d) {
+        return _fillSelected === d;
+    }
 
-        tooltip
-            .classed('leftclick', false)
-            .classed('rightclick', false);
-    };
 
-    return utilRebind(behavior, dispatch$$1, 'on');
-}
+    function setFill(d) {
+        fills.forEach(function(opt) {
+            context.surface().classed('fill-' + opt, Boolean(opt === d));
+        });
 
-function uiIntroNavigation(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        timeouts = [],
-        hallId = 'n2061',
-        townHall = [-85.63591, 41.94285],
-        springStreetId = 'w397',
-        springStreetEndId = 'n1834',
-        springStreet = [-85.63582, 41.94255],
-        onewayField = context.presets().field('oneway'),
-        maxspeedField = context.presets().field('maxspeed');
+        _fillSelected = d;
+        context.storage('area-fill', d);
+        if (d !== 'wireframe') {
+            context.storage('area-fill-toggle', d);
+        }
+        update();
+    }
 
 
-    var chapter = {
-        title: 'intro.navigation.title'
-    };
+    function showsLayer(which) {
+        var layer = layers.layer(which);
+        if (layer) {
+            return layer.enabled();
+        }
+        return false;
+    }
 
 
-    function timeout(f, t$$1) {
-        timeouts.push(window.setTimeout(f, t$$1));
+    function setLayer(which, enabled) {
+        var layer = layers.layer(which);
+        if (layer) {
+            layer.enabled(enabled);
+            update();
+        }
     }
 
 
-    function eventCancel() {
-        event.stopPropagation();
-        event.preventDefault();
+    function toggleLayer(which) {
+        setLayer(which, !showsLayer(which));
     }
 
 
-    function isTownHallSelected() {
-        var ids = context.selectedIDs();
-        return ids.length === 1 && ids[0] === hallId;
-    }
+    function drawPhotoItems(selection) {
+        var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
+        var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
+        var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
 
+        function layerSupported(d) {
+            return d.layer && d.layer.supported();
+        }
+        function layerEnabled(d) {
+            return layerSupported(d) && d.layer.enabled();
+        }
 
-    function dragMap() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
+        var ul = selection
+            .selectAll('.layer-list-photos')
+            .data([0]);
 
-        var msec = transitionTime(townHall, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(townHall, msec);
+        ul = ul.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-list-photos')
+            .merge(ul);
 
-        timeout(function() {
-            var centerStart = context.map().center();
+        var li = ul.selectAll('.list-item-photos')
+            .data(data);
 
-            reveal('#surface', t('intro.navigation.drag'));
-            context.map().on('drawn.intro', function() {
-                reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
-            });
+        li.exit()
+            .remove();
 
-            context.map().on('move.intro', function() {
-                var centerNow = context.map().center();
-                if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
-                    context.map().on('move.intro', null);
-                    timeout(function() { continueTo(zoomMap); }, 3000);
-                }
+        var liEnter = li.enter()
+            .append('li')
+            .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
+
+        var labelEnter = liEnter
+            .append('label')
+            .each(function(d) {
+                d3_select(this)
+                    .call(tooltip()
+                        .title(t(d.id.replace('-', '_') + '.tooltip'))
+                        .placement('top')
+                    );
             });
 
-        }, msec + 100);
+        labelEnter
+            .append('input')
+            .attr('type', 'checkbox')
+            .on('change', function(d) { toggleLayer(d.id); });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
-        }
-    }
+        labelEnter
+            .append('span')
+            .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
 
 
-    function zoomMap() {
-        var zoomStart = context.map().zoom();
+        // Update
+        li = li
+            .merge(liEnter);
 
-        reveal('#surface',
-            t('intro.navigation.zoom', {
-                plus: icon('#icon-plus', 'pre-text'),
-                minus: icon('#icon-minus', 'pre-text')
-            })
-        );
+        li
+            .classed('active', layerEnabled)
+            .selectAll('input')
+            .property('checked', layerEnabled);
+    }
 
-        context.map().on('drawn.intro', function() {
-            reveal('#surface',
-                t('intro.navigation.zoom', {
-                    plus: icon('#icon-plus', 'pre-text'),
-                    minus: icon('#icon-minus', 'pre-text')
-                }), { duration: 0 }
-            );
-        });
 
-        context.map().on('move.intro', function() {
-            if (context.map().zoom() !== zoomStart) {
-                context.map().on('move.intro', null);
-                timeout(function() { continueTo(features); }, 3000);
-            }
-        });
+    function drawOsmItem(selection) {
+        var osm = layers.layer('osm'),
+            showsOsm = osm.enabled();
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
-        }
-    }
+        var ul = selection
+            .selectAll('.layer-list-osm')
+            .data(osm ? [0] : []);
 
+        // Exit
+        ul.exit()
+            .remove();
 
-    function features() {
-        var onClick = function() { continueTo(pointsLinesAreas); };
+        // Enter
+        var ulEnter = ul.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-list-osm');
 
-        reveal('#surface', t('intro.navigation.features'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+        var liEnter = ulEnter
+            .append('li')
+            .attr('class', 'list-item-osm');
 
-        context.map().on('drawn.intro', function() {
-            reveal('#surface', t('intro.navigation.features'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+        var labelEnter = liEnter
+            .append('label')
+            .call(tooltip()
+                .title(t('map_data.layers.osm.tooltip'))
+                .placement('top')
             );
-        });
-
-        function continueTo(nextStep) {
-            context.map().on('drawn.intro', null);
-            nextStep();
-        }
-    }
 
-    function pointsLinesAreas() {
-        var onClick = function() { continueTo(nodesWays); };
+        labelEnter
+            .append('input')
+            .attr('type', 'checkbox')
+            .on('change', function() { toggleLayer('osm'); });
 
-        reveal('#surface', t('intro.navigation.points_lines_areas'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+        labelEnter
+            .append('span')
+            .text(t('map_data.layers.osm.title'));
 
-        context.map().on('drawn.intro', function() {
-            reveal('#surface', t('intro.navigation.points_lines_areas'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
-            );
-        });
+        // Update
+        ul = ul
+            .merge(ulEnter);
 
-        function continueTo(nextStep) {
-            context.map().on('drawn.intro', null);
-            nextStep();
-        }
+        ul.selectAll('.list-item-osm')
+            .classed('active', showsOsm)
+            .selectAll('input')
+            .property('checked', showsOsm);
     }
 
-    function nodesWays() {
-        var onClick = function() { continueTo(clickTownHall); };
-
-        reveal('#surface', t('intro.navigation.nodes_ways'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
 
-        context.map().on('drawn.intro', function() {
-            reveal('#surface', t('intro.navigation.nodes_ways'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
-            );
-        });
+    function drawGpxItem(selection) {
+        var gpx = layers.layer('gpx'),
+            hasGpx = gpx && gpx.hasGpx(),
+            showsGpx = hasGpx && gpx.enabled();
 
-        function continueTo(nextStep) {
-            context.map().on('drawn.intro', null);
-            nextStep();
-        }
-    }
+        var ul = selection
+            .selectAll('.layer-list-gpx')
+            .data(gpx ? [0] : []);
 
-    function clickTownHall() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
+        // Exit
+        ul.exit()
+            .remove();
 
-        reveal(null, null, { duration: 0 });
-        context.map().zoomEase(19, 500);
+        // Enter
+        var ulEnter = ul.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-list-gpx');
 
-        timeout(function() {
-            var entity = context.hasEntity(hallId);
-            if (!entity) return;
-            context.map().centerEase(entity.loc, 500);
+        var liEnter = ulEnter
+            .append('li')
+            .attr('class', 'list-item-gpx');
 
-            timeout(function() {
-                var entity = context.hasEntity(hallId);
-                if (!entity) return;
-                var box = pointBox(entity.loc, context);
-                reveal(box, t('intro.navigation.click_townhall'));
+        liEnter
+            .append('button')
+            .attr('class', 'list-item-gpx-extent')
+            .call(tooltip()
+                .title(t('gpx.zoom'))
+                .placement((textDirection === 'rtl') ? 'right' : 'left')
+            )
+            .on('click', function() {
+                event.preventDefault();
+                event.stopPropagation();
+                gpx.fitZoom();
+            })
+            .call(svgIcon('#icon-search'));
 
-                context.map().on('move.intro drawn.intro', function() {
-                    var entity = context.hasEntity(hallId);
-                    if (!entity) return;
-                    var box = pointBox(entity.loc, context);
-                    reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
-                });
+        liEnter
+            .append('button')
+            .attr('class', 'list-item-gpx-browse')
+            .call(tooltip()
+                .title(t('gpx.browse'))
+                .placement((textDirection === 'rtl') ? 'right' : 'left')
+            )
+            .on('click', function() {
+                d3_select(document.createElement('input'))
+                    .attr('type', 'file')
+                    .on('change', function() {
+                        gpx.files(event.target.files);
+                    })
+                    .node().click();
+            })
+            .call(svgIcon('#icon-geolocate'));
 
-                context.on('enter.intro', function() {
-                    if (isTownHallSelected()) continueTo(selectedTownHall);
-                });
+        var labelEnter = liEnter
+            .append('label')
+            .call(tooltip()
+                .title(t('gpx.drag_drop'))
+                .placement('top')
+            );
 
-            }, 550);  // after centerEase
+        labelEnter
+            .append('input')
+            .attr('type', 'checkbox')
+            .on('change', function() { toggleLayer('gpx'); });
 
-        }, 550); // after zoomEase
+        labelEnter
+            .append('span')
+            .text(t('gpx.local_layer'));
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(hallId)) {
-                continueTo(clickTownHall);
-            }
-        });
+        // Update
+        ul = ul
+            .merge(ulEnter);
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
+        ul.selectAll('.list-item-gpx')
+            .classed('active', showsGpx)
+            .selectAll('label')
+            .classed('deemphasize', !hasGpx)
+            .selectAll('input')
+            .property('disabled', !hasGpx)
+            .property('checked', showsGpx);
     }
 
 
-    function selectedTownHall() {
-        if (!isTownHallSelected()) return clickTownHall();
-
-        var entity = context.hasEntity(hallId);
-        if (!entity) return clickTownHall();
+    function drawListItems(selection, data, type, name, change, active) {
+        var items = selection.selectAll('li')
+            .data(data);
 
-        var box = pointBox(entity.loc, context);
-        var onClick = function() { continueTo(editorTownHall); };
+        // Exit
+        items.exit()
+            .remove();
 
-        reveal(box, t('intro.navigation.selected_townhall'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+        // Enter
+        var enter = items.enter()
+            .append('li')
+            .attr('class', 'layer')
+            .call(tooltip()
+                .html(true)
+                .title(function(d) {
+                    var tip = t(name + '.' + d + '.tooltip'),
+                        key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
 
-        context.map().on('move.intro drawn.intro', function() {
-            var entity = context.hasEntity(hallId);
-            if (!entity) return;
-            var box = pointBox(entity.loc, context);
-            reveal(box, t('intro.navigation.selected_townhall'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
+                    if (name === 'feature' && autoHiddenFeature(d)) {
+                        var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
+                        tip += '<div>' + msg + '</div>';
+                    }
+                    return uiTooltipHtml(tip, key);
+                })
+                .placement('top')
             );
-        });
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(hallId)) {
-                continueTo(clickTownHall);
-            }
-        });
+        var label = enter
+            .append('label');
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        label
+            .append('input')
+            .attr('type', type)
+            .attr('name', name)
+            .on('change', change);
 
+        label
+            .append('span')
+            .text(function(d) { return t(name + '.' + d + '.description'); });
 
-    function editorTownHall() {
-        if (!isTownHallSelected()) return clickTownHall();
+        // Update
+        items = items
+            .merge(enter);
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        items
+            .classed('active', active)
+            .selectAll('input')
+            .property('checked', active)
+            .property('indeterminate', function(d) {
+                return (name === 'feature' && autoHiddenFeature(d));
+            });
+    }
 
-        var onClick = function() { continueTo(presetTownHall); };
 
-        reveal('.entity-editor-pane',
-            t('intro.navigation.editor_townhall'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+    function renderDataLayers(selection) {
+        var container = selection.selectAll('data-layer-container')
+            .data([0]);
 
-        context.on('exit.intro', function() {
-            continueTo(clickTownHall);
-        });
+        _dataLayerContainer = container.enter()
+            .append('div')
+            .attr('class', 'data-layer-container')
+            .merge(container);
+    }
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(hallId)) {
-                continueTo(clickTownHall);
-            }
-        });
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            nextStep();
-        }
+    function renderFillList(selection) {
+        var container = selection.selectAll('layer-fill-list')
+            .data([0]);
+
+        _fillList = container.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-fill-list')
+            .merge(container);
     }
 
 
-    function presetTownHall() {
-        if (!isTownHallSelected()) return clickTownHall();
+    function renderFeatureList(selection) {
+        var container = selection.selectAll('layer-feature-list')
+            .data([0]);
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        _featureList = container.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-feature-list')
+            .merge(container);
+    }
 
-        // preset match, in case the user happened to change it.
-        var entity = context.entity(context.selectedIDs()[0]);
-        var preset = context.presets().match(entity, context.graph());
 
-        var onClick = function() { continueTo(fieldsTownHall); };
+    function update() {
+        _dataLayerContainer
+            .call(drawOsmItem)
+            .call(drawPhotoItems)
+            .call(drawGpxItem);
 
-        context.on('exit.intro', function() {
-            continueTo(clickTownHall);
-        });
+        _fillList
+            .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(hallId)) {
-                continueTo(clickTownHall);
-            }
-        });
+        _featureList
+            .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
+    }
 
-        reveal('.inspector-body .preset-list-item.inspector-inner',
-            t('intro.navigation.preset_townhall', { preset: preset.name() }),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            nextStep();
+    function toggleWireframe() {
+        if (event) {
+            event.preventDefault();
+            event.stopPropagation();
+        }
+
+        if (_fillSelected === 'wireframe') {
+            _fillSelected = context.storage('area-fill-toggle') || 'partial';
+        } else {
+            _fillSelected = 'wireframe';
         }
+
+        setFill(_fillSelected);
+        context.map().pan([0,0]);  // trigger a redraw
     }
 
 
-    function fieldsTownHall() {
-        if (!isTownHallSelected()) return clickTownHall();
+    function mapData(selection) {
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        function hidePane() {
+            setVisible(false);
+        }
 
-        var onClick = function() { continueTo(closeTownHall); };
+        function togglePane() {
+            if (event) event.preventDefault();
+            paneTooltip.hide(button);
+            setVisible(!button.classed('active'));
+        }
 
-        reveal('.inspector-body .preset-editor',
-            t('intro.navigation.fields_townhall'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+        function setVisible(show) {
+            if (show !== _shown) {
+                button.classed('active', show);
+                _shown = show;
 
-        context.on('exit.intro', function() {
-            continueTo(clickTownHall);
-        });
+                if (show) {
+                    uiBackground.hidePane();
+                    uiHelp.hidePane();
+                    update();
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(hallId)) {
-                continueTo(clickTownHall);
-            }
-        });
+                    pane
+                        .style('display', 'block')
+                        .style('right', '-300px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '0px');
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            nextStep();
+                } else {
+                    pane
+                        .style('display', 'block')
+                        .style('right', '0px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '-300px')
+                        .on('end', function() {
+                            d3_select(this).style('display', 'none');
+                        });
+                }
+            }
         }
-    }
 
 
-    function closeTownHall() {
-        if (!isTownHallSelected()) return clickTownHall();
+        var pane = selection
+            .append('div')
+            .attr('class', 'fillL map-overlay col3 content hide');
 
-        var selector = '.entity-editor-pane button.preset-close svg use';
-        var href = d3_select(selector).attr('href') || '#icon-close';
+        var paneTooltip = tooltip()
+            .placement((textDirection === 'rtl') ? 'right' : 'left')
+            .html(true)
+            .title(uiTooltipHtml(t('map_data.description'), key));
 
-        reveal('.entity-editor-pane',
-            t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
-        );
+        var button = selection
+            .append('button')
+            .attr('tabindex', -1)
+            .on('click', togglePane)
+            .call(svgIcon('#icon-data', 'light'))
+            .call(paneTooltip);
 
-        context.on('exit.intro', function() {
-            continueTo(searchStreet);
-        });
 
-        context.history().on('change.intro', function() {
-            // update the close icon in the tooltip if the user edits something.
-            var selector = '.entity-editor-pane button.preset-close svg use';
-            var href = d3_select(selector).attr('href') || '#icon-close';
+        pane
+            .append('h2')
+            .text(t('map_data.title'));
 
-            reveal('.entity-editor-pane',
-                t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
-                { duration: 0 }
+
+        // data layers
+        pane
+            .append('div')
+            .attr('class', 'map-data-data-layers')
+            .call(uiDisclosure(context, 'data_layers', true)
+                .title(t('map_data.data_layers'))
+                .content(renderDataLayers)
             );
-        });
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        // area fills
+        pane
+            .append('div')
+            .attr('class', 'map-data-area-fills')
+            .call(uiDisclosure(context, 'fill_area', false)
+                .title(t('map_data.fill_area'))
+                .content(renderFillList)
+            );
 
+        // feature filters
+        pane
+            .append('div')
+            .attr('class', 'map-data-feature-filters')
+            .call(uiDisclosure(context, 'map_features', false)
+                .title(t('map_data.map_features'))
+                .content(renderFeatureList)
+            );
 
-    function searchStreet() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');  // ensure spring street exists
 
-        var msec = transitionTime(springStreet, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
+        // add listeners
+        context.features()
+            .on('change.map_data-update', update);
 
-        timeout(function() {
-            reveal('.search-header input',
-                t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
-            );
+        update();
+        setFill(_fillSelected);
 
-            d3_select('.search-header input')
-                .on('keyup.intro', checkSearchResult);
-        }, msec + 100);
+        var keybinding = d3keybinding('features')
+            .on(key, togglePane)
+            .on(t('area_fill.wireframe.key'), toggleWireframe)
+            .on([t('background.key'), t('help.key')], hidePane);
+
+        d3_select(document)
+            .call(keybinding);
+
+        uiMapData.hidePane = hidePane;
+        uiMapData.togglePane = togglePane;
+        uiMapData.setVisible = setVisible;
     }
 
+    return mapData;
+}
 
-    function checkSearchResult() {
-        var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
-            firstName = first.select('.entity-name'),
-            name = t('intro.graph.name.spring-street');
+function uiShortcuts() {
+    var detected = utilDetect();
+    var activeTab = 0;
+    var modalSelection;
+    var savedSelection;
 
-        if (!firstName.empty() && firstName.text() === name) {
-            reveal(first.node(),
-                t('intro.navigation.choose_street', { name: name }),
-                { duration: 300 }
-            );
 
-            context.on('exit.intro', function() {
-                continueTo(selectedStreet);
-            });
+    var keybinding = d3keybinding('shortcuts')
+        .on(t('shortcuts.toggle.key'), function () {
+            if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
+                if (modalSelection) {
+                    modalSelection.close();
+                    modalSelection = null;
+                }
+            } else {
+                modalSelection = uiModal(savedSelection);
+                shortcutsModal(modalSelection);
+            }
+        });
 
-            d3_select('.search-header input')
-                .on('keydown.intro', eventCancel, true)
-                .on('keyup.intro', null);
-        }
+    d3_select(document)
+        .call(keybinding);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            d3_select('.search-header input')
-                .on('keydown.intro', null)
-                .on('keyup.intro', null);
-            nextStep();
-        }
-    }
 
 
-    function selectedStreet() {
-        if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
-            return searchStreet();
-        }
+    function shortcutsModal(modalSelection) {
+        modalSelection.select('.modal')
+            .classed('modal-shortcuts', true);
 
-        var onClick = function() { continueTo(editorStreet); };
-        var entity = context.entity(springStreetEndId);
-        var box = pointBox(entity.loc, context);
-        box.height = 500;
+        var shortcutsModal = modalSelection.select('.content');
 
-        reveal(box,
-            t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
-            { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+        shortcutsModal
+            .append('div')
+            .attr('class', 'modal-section')
+            .append('h3')
+            .text(t('shortcuts.title'));
 
-        timeout(function() {
-            context.map().on('move.intro drawn.intro', function() {
-                var entity = context.hasEntity(springStreetEndId);
-                if (!entity) return;
-                var box = pointBox(entity.loc, context);
-                box.height = 500;
-                reveal(box,
-                    t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
-                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
-                );
-            });
-        }, 600);  // after reveal.
+        shortcutsModal
+            .call(render);
+    }
 
-        context.on('enter.intro', function(mode) {
-            if (!context.hasEntity(springStreetId)) {
-                return continueTo(searchStreet);
-            }
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
-                // keep Spring Street selected..
-                context.enter(modeSelect(context, [springStreetId]));
-            }
-        });
 
-        context.history().on('change.intro', function() {
-            if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
-                timeout(function() {
-                    continueTo(searchStreet);
-                }, 300);  // after any transition (e.g. if user deleted intersection)
-            }
-        });
+    function render(selection) {
+        var wrapper = selection
+            .selectAll('.wrapper')
+            .data([0]);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        var wrapperEnter = wrapper
+            .enter()
+            .append('div')
+            .attr('class', 'wrapper modal-section');
 
+        var tabsBar = wrapperEnter
+            .append('div')
+            .attr('class', 'tabs-bar');
 
-    function editorStreet() {
-        var selector = '.entity-editor-pane button.preset-close svg use';
-        var href = d3_select(selector).attr('href') || '#icon-close';
+        var shortcutsList = wrapperEnter
+            .append('div')
+            .attr('class', 'shortcuts-list');
 
-        reveal('.entity-editor-pane',
-            t('intro.navigation.editor_street', {
-                button: icon(href, 'pre-text'),
-                field1: onewayField.label(),
-                field2: maxspeedField.label()
-            })
-        );
+        wrapper = wrapper.merge(wrapperEnter);
 
-        context.on('exit.intro', function() {
-            continueTo(play);
-        });
+        var tabs = tabsBar
+            .selectAll('.tab')
+            .data(dataShortcuts);
 
-        context.history().on('change.intro', function() {
-            // update the close icon in the tooltip if the user edits something.
-            var selector = '.entity-editor-pane button.preset-close svg use';
-            var href = d3_select(selector).attr('href') || '#icon-close';
+        var tabsEnter = tabs
+            .enter()
+            .append('div')
+            .attr('class', 'tab')
+            .on('click', function (d, i) {
+                activeTab = i;
+                render(selection);
+            });
 
-            reveal('.entity-editor-pane',
-                t('intro.navigation.editor_street', {
-                    button: icon(href, 'pre-text'),
-                    field1: onewayField.label().toLowerCase(),
-                    field2: maxspeedField.label().toLowerCase()
-                }), { duration: 0 }
-            );
-        });
+        tabsEnter
+            .append('span')
+            .text(function (d) { return t(d.text); });
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        tabs = tabs
+            .merge(tabsEnter);
 
+        // Update
+        wrapper.selectAll('.tab')
+            .classed('active', function (d, i) {
+                return i === activeTab;
+            });
 
-    function play() {
-        dispatch$$1.call('done');
-        reveal('#id-container',
-            t('intro.navigation.play', { next: t('intro.points.title') }), {
-                tooltipBox: '.intro-nav-wrap .chapter-point',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { reveal('#id-container'); }
-            }
-        );
-    }
 
+        var shortcuts = shortcutsList
+            .selectAll('.shortcut-tab')
+            .data(dataShortcuts);
 
-    chapter.enter = function() {
-        dragMap();
-    };
+        var shortcutsEnter = shortcuts
+            .enter()
+            .append('div')
+            .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
 
+        var columnsEnter = shortcutsEnter
+            .selectAll('.shortcut-column')
+            .data(function (d) { return d.columns; })
+            .enter()
+            .append('table')
+            .attr('class', 'shortcut-column');
 
-    chapter.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        context.on('enter.intro exit.intro', null);
-        context.map().on('move.intro drawn.intro', null);
-        context.history().on('change.intro', null);
-        d3_select('.inspector-wrap').on('wheel.intro', null);
-        d3_select('.search-header input').on('keydown.intro keyup.intro', null);
-    };
+        var rowsEnter = columnsEnter
+            .selectAll('.shortcut-row')
+            .data(function (d) { return d.rows; })
+            .enter()
+            .append('tr')
+            .attr('class', 'shortcut-row');
 
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
-    };
+        var sectionRows = rowsEnter
+            .filter(function (d) { return !d.shortcuts; });
 
+        sectionRows
+            .append('td');
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
+        sectionRows
+            .append('td')
+            .attr('class', 'shortcut-section')
+            .append('h3')
+            .text(function (d) { return t(d.text); });
 
-function uiIntroPoint(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        timeouts = [],
-        intersection = [-85.63279, 41.94394],
-        building = [-85.632422, 41.944045],
-        cafePreset = context.presets().item('amenity/cafe'),
-        pointId = null;
 
+        var shortcutRows = rowsEnter
+            .filter(function (d) { return d.shortcuts; });
 
-    var chapter = {
-        title: 'intro.points.title'
-    };
+        var shortcutKeys = shortcutRows
+            .append('td')
+            .attr('class', 'shortcut-keys');
 
+        var modifierKeys = shortcutKeys
+            .filter(function (d) { return d.modifiers; });
 
-    function timeout(f, t$$1) {
-        timeouts.push(window.setTimeout(f, t$$1));
-    }
+        modifierKeys
+            .selectAll('kbd.modifier')
+            .data(function (d) {
+                if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
+                    return ['⌘'];
+                } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
+                    return [];
+                } else {
+                    return d.modifiers;
+                }
+            })
+            .enter()
+            .each(function () {
+                var selection = d3_select(this);
 
+                selection
+                    .append('kbd')
+                    .attr('class', 'modifier')
+                    .text(function (d) { return uiCmd.display(d); });
 
-    function revealEditMenu(loc, text, options) {
-        var rect = context.surfaceRect();
-        var point = context.curtainProjection(loc);
-        var pad = 40;
-        var width = 250 + (2 * pad);
-        var height = 250;
-        var startX = rect.left + point[0];
-        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
-        var box = {
-            left: left,
-            top: point[1] + rect.top - 60,
-            width: width,
-            height: height
-        };
-        reveal(box, text, options);
-    }
+                selection
+                    .append('span')
+                    .text('+');
+            });
 
 
-    function eventCancel() {
-        event.stopPropagation();
-        event.preventDefault();
-    }
+        shortcutKeys
+            .selectAll('kbd.shortcut')
+            .data(function (d) {
+                var arr = d.shortcuts;
+                if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
+                    arr = ['Y'];
+                } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
+                    arr = ['F11'];
+                }
 
+                return arr.map(function(s) {
+                    return {
+                        shortcut: s,
+                        separator: d.separator
+                    };
+                });
+            })
+            .enter()
+            .each(function (d, i, nodes) {
+                var selection = d3_select(this);
+                var click = d.shortcut.toLowerCase().match(/(.*).click/);
 
-    function addPoint() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
+                if (click && click[1]) {
+                    selection
+                        .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
+                } else {
+                    selection
+                        .append('kbd')
+                        .attr('class', 'shortcut')
+                        .text(function (d) {
+                            var key = d.shortcut;
+                            return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
+                        });
+                }
 
-        var msec = transitionTime(intersection, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(intersection, msec);
+                if (i < nodes.length - 1) {
+                    selection
+                        .append('span')
+                        .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
+                }
+            });
 
-        timeout(function() {
-            var tooltip = reveal('button.add-point',
-                t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
 
-            pointId = null;
+        shortcutKeys
+            .filter(function(d) { return d.gesture; })
+            .each(function () {
+                var selection = d3_select(this);
 
-            tooltip.selectAll('.tooltip-inner')
-                .insert('svg', 'span')
-                .attr('class', 'tooltip-illustration')
-                .append('use')
-                .attr('xlink:href', '#poi-images');
+                selection
+                    .append('span')
+                    .text('+');
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'add-point') return;
-                continueTo(placePoint);
+                selection
+                    .append('span')
+                    .attr('class', 'gesture')
+                    .text(function (d) { return t(d.gesture); });
             });
-        }, msec + 100);
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
-        }
+
+        shortcutRows
+            .append('td')
+            .attr('class', 'shortcut-desc')
+            .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
+
+
+        shortcuts = shortcuts
+            .merge(shortcutsEnter);
+
+        // Update
+        wrapper.selectAll('.shortcut-tab')
+            .style('display', function (d, i) {
+                return i === activeTab ? 'flex' : 'none';
+            });
     }
 
 
-    function placePoint() {
-        if (context.mode().id !== 'add-point') {
-            return chapter.restart();
+    return function(selection, show) {
+        savedSelection = selection;
+        if (show) {
+            modalSelection = uiModal(selection);
+            shortcutsModal(modalSelection);
         }
+    };
+}
 
-        var pointBox$$1 = pad$1(building, 150, context);
-        reveal(pointBox$$1, t('intro.points.place_point'));
+function uiHelp(context) {
+    var key = t('help.key');
 
-        context.map().on('move.intro drawn.intro', function() {
-            pointBox$$1 = pad$1(building, 150, context);
-            reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
-        });
+    var docKeys = [
+        ['help', [
+            'welcome',
+            'open_data_h',
+            'open_data',
+            'before_start_h',
+            'before_start',
+            'open_source_h',
+            'open_source',
+            'open_source_help'
+        ]],
+        ['overview', [
+            'navigation_h',
+            'navigation_drag',
+            'navigation_zoom',
+            'features_h',
+            'features',
+            'nodes_ways'
+        ]],
+        ['editing', [
+            'select_h',
+            'select_left_click',
+            'select_right_click',
+            'multiselect_h',
+            'multiselect_shift_click',
+            'multiselect_lasso',
+            'undo_redo_h',
+            'undo_redo',
+            'save_h',
+            'save',
+            'save_validation',
+            'upload_h',
+            'upload',
+            'backups_h',
+            'backups',
+            'keyboard_h',
+            'keyboard'
+        ]],
+        ['feature_editor', [
+            'intro',
+            'definitions',
+            'type_h',
+            'type',
+            'type_picker',
+            'fields_h',
+            'fields_all_fields',
+            'fields_example',
+            'fields_add_field',
+            'tags_h',
+            'tags_all_tags',
+            'tags_resources'
+        ]],
+        ['points', [
+            'intro',
+            'add_point_h',
+            'add_point',
+            'add_point_finish',
+            'move_point_h',
+            'move_point',
+            'delete_point_h',
+            'delete_point',
+            'delete_point_command'
+        ]],
+        ['lines', [
+            'intro',
+            'add_line_h',
+            'add_line',
+            'add_line_draw',
+            'add_line_finish',
+            'modify_line_h',
+            'modify_line_dragnode',
+            'modify_line_addnode',
+            'connect_line_h',
+            'connect_line',
+            'connect_line_display',
+            'connect_line_drag',
+            'connect_line_tag',
+            'disconnect_line_h',
+            'disconnect_line_command',
+            'move_line_h',
+            'move_line_command',
+            'move_line_connected',
+            'delete_line_h',
+            'delete_line',
+            'delete_line_command'
+        ]],
+        ['areas', [
+            'intro',
+            'point_or_area_h',
+            'point_or_area',
+            'add_area_h',
+            'add_area_command',
+            'add_area_draw',
+            'add_area_finish',
+            'square_area_h',
+            'square_area_command',
+            'modify_area_h',
+            'modify_area_dragnode',
+            'modify_area_addnode',
+            'delete_area_h',
+            'delete_area',
+            'delete_area_command'
+        ]],
+        ['relations', [
+            'intro',
+            'edit_relation_h',
+            'edit_relation',
+            'edit_relation_add',
+            'edit_relation_delete',
+            'maintain_relation_h',
+            'maintain_relation',
+            'relation_types_h',
+            'multipolygon_h',
+            'multipolygon',
+            'multipolygon_create',
+            'multipolygon_merge',
+            'turn_restriction_h',
+            'turn_restriction',
+            'turn_restriction_field',
+            'turn_restriction_editing',
+            'route_h',
+            'route',
+            'route_add',
+            'boundary_h',
+            'boundary',
+            'boundary_add'
+        ]],
+        ['imagery', [
+            'intro',
+            'sources_h',
+            'choosing',
+            'sources',
+            'offsets_h',
+            'offset',
+            'offset_change'
+        ]],
+        ['streetlevel', [
+            'intro',
+            'using_h',
+            'using',
+            'photos',
+            'viewer'
+        ]],
+        ['gps', [
+            'intro',
+            'survey',
+            'using_h',
+            'using',
+            'tracing',
+            'upload'
+        ]]
+    ];
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') return chapter.restart();
-            pointId = context.mode().selectedIDs()[0];
-            continueTo(searchPreset);
-        });
+    var headings = {
+        'help.help.open_data_h': 3,
+        'help.help.before_start_h': 3,
+        'help.help.open_source_h': 3,
+        'help.overview.navigation_h': 3,
+        'help.overview.features_h': 3,
+        'help.editing.select_h': 3,
+        'help.editing.multiselect_h': 3,
+        'help.editing.undo_redo_h': 3,
+        'help.editing.save_h': 3,
+        'help.editing.upload_h': 3,
+        'help.editing.backups_h': 3,
+        'help.editing.keyboard_h': 3,
+        'help.feature_editor.type_h': 3,
+        'help.feature_editor.fields_h': 3,
+        'help.feature_editor.tags_h': 3,
+        'help.points.add_point_h': 3,
+        'help.points.move_point_h': 3,
+        'help.points.delete_point_h': 3,
+        'help.lines.add_line_h': 3,
+        'help.lines.modify_line_h': 3,
+        'help.lines.connect_line_h': 3,
+        'help.lines.disconnect_line_h': 3,
+        'help.lines.move_line_h': 3,
+        'help.lines.delete_line_h': 3,
+        'help.areas.point_or_area_h': 3,
+        'help.areas.add_area_h': 3,
+        'help.areas.square_area_h': 3,
+        'help.areas.modify_area_h': 3,
+        'help.areas.delete_area_h': 3,
+        'help.relations.edit_relation_h': 3,
+        'help.relations.maintain_relation_h': 3,
+        'help.relations.relation_types_h': 2,
+        'help.relations.multipolygon_h': 3,
+        'help.relations.turn_restriction_h': 3,
+        'help.relations.route_h': 3,
+        'help.relations.boundary_h': 3,
+        'help.imagery.sources_h': 3,
+        'help.imagery.offsets_h': 3,
+        'help.streetlevel.using_h': 3,
+        'help.gps.using_h': 3,
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+    var replacements = {
+        point: icon('#icon-point', 'pre-text'),
+        line: icon('#icon-line', 'pre-text'),
+        area: icon('#icon-area', 'pre-text'),
+        plus: icon('#icon-plus', 'pre-text'),
+        minus: icon('#icon-minus', 'pre-text'),
+        orthogonalize: icon('#operation-orthogonalize', 'pre-text'),
+        disconnect: icon('#operation-disconnect', 'pre-text'),
+        layers: icon('#icon-layers', 'pre-text'),
+        data: icon('#icon-data', 'pre-text'),
+        inspect: icon('#icon-inspect', 'pre-text'),
+        move: icon('#operation-move', 'pre-text'),
+        merge: icon('#operation-merge', 'pre-text'),
+        delete: icon('#operation-delete', 'pre-text'),
+        close: icon('#icon-close', 'pre-text'),
+        undo: icon(textDirection === 'rtl' ? '#icon-redo' : '#icon-undo', 'pre-text'),
+        redo: icon(textDirection === 'rtl' ? '#icon-undo' : '#icon-redo', 'pre-text'),
+        save: icon('#icon-save', 'pre-text'),
+        leftclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'left'),
+        rightclick: icon('#walkthrough-mouse', 'pre-text mouseclick', 'right'),
+        shift: uiCmd.display('⇧'),
+        alt: uiCmd.display('⌥'),
+        return: uiCmd.display('↵'),
+        version: context.version
+    };
+
+    // For each section, squash all the texts into a single markdown document
+    var docs = docKeys.map(function(key) {
+        var helpkey = 'help.' + key[0];
+        var text = key[1].reduce(function(all, part) {
+            var subkey = helpkey + '.' + part;
+            var depth = headings[subkey];                              // is this subkey a heading?
+            var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
+            return all + hhh + t(subkey, replacements) + '\n\n';
+        }, '');
+
+        return {
+            title: t(helpkey + '.title'),
+            html: marked(text.trim())
+        };
+    });
+
+
+    function help(selection) {
+
+        function hidePane() {
+            setVisible(false);
         }
-    }
 
 
-    function searchPreset() {
-        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
-            return addPoint();
+        function togglePane() {
+            if (event) event.preventDefault();
+            tooltipBehavior.hide(button);
+            setVisible(!button.classed('active'));
         }
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-        d3_select('.preset-search-input')
-            .on('keydown.intro', null)
-            .on('keyup.intro', checkPresetSearch);
+        function setVisible(show) {
+            if (show !== shown) {
+                button.classed('active', show);
+                shown = show;
 
-        reveal('.preset-search-input',
-            t('intro.points.search_cafe', { preset: cafePreset.name() })
-        );
+                if (show) {
+                    uiBackground.hidePane();
+                    uiMapData.hidePane();
 
-        context.on('enter.intro', function(mode) {
-            if (!pointId || !context.hasEntity(pointId)) {
-                return continueTo(addPoint);
-            }
+                    pane.style('display', 'block')
+                        .style('right', '-500px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '0px');
 
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
-                // keep the user's point selected..
-                context.enter(modeSelect(context, [pointId]));
+                } else {
+                    pane.style('right', '0px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '-500px')
+                        .on('end', function() {
+                            d3_select(this).style('display', 'none');
+                        });
+                }
+            }
+        }
 
-                // disallow scrolling
-                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', null)
-                    .on('keyup.intro', checkPresetSearch);
+        function clickHelp(d, i) {
+            var rtl = (textDirection === 'rtl');
+            pane.property('scrollTop', 0);
+            doctitle.html(d.title);
 
-                reveal('.preset-search-input',
-                    t('intro.points.search_cafe', { preset: cafePreset.name() })
-                );
+            body.html(d.html);
+            body.selectAll('a')
+                .attr('target', '_blank');
+            menuItems.classed('selected', function(m) {
+                return m.title === d.title;
+            });
 
-                context.history().on('change.intro', null);
+            nav.html('');
+            if (rtl) {
+                nav.call(drawNext).call(drawPrevious);
+            } else {
+                nav.call(drawPrevious).call(drawNext);
             }
-        });
 
 
-        function checkPresetSearch() {
-            var first = d3_select('.preset-list-item:first-child');
+            function drawNext(selection) {
+                if (i < docs.length - 1) {
+                    var nextLink = selection
+                        .append('a')
+                        .attr('class', 'next')
+                        .on('click', function() {
+                            clickHelp(docs[i + 1], i + 1);
+                        });
 
-            if (first.classed('preset-amenity-cafe')) {
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', eventCancel, true)
-                    .on('keyup.intro', null);
+                    nextLink
+                        .append('span')
+                        .text(docs[i + 1].title)
+                        .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
+                }
+            }
 
-                reveal(first.select('.preset-list-button').node(),
-                    t('intro.points.choose_cafe', { preset: cafePreset.name() }),
-                    { duration: 300 }
-                );
 
-                context.history().on('change.intro', function() {
-                    continueTo(aboutFeatureEditor);
-                });
+            function drawPrevious(selection) {
+                if (i > 0) {
+                    var prevLink = selection
+                        .append('a')
+                        .attr('class', 'previous')
+                        .on('click', function() {
+                            clickHelp(docs[i - 1], i - 1);
+                        });
+
+                    prevLink
+                        .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
+                        .append('span')
+                        .text(docs[i - 1].title);
+                }
             }
         }
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-            nextStep();
+
+        function clickWalkthrough() {
+            if (context.inIntro()) return;
+            context.container().call(uiIntro(context));
+            setVisible(false);
         }
-    }
 
 
-    function aboutFeatureEditor() {
-        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
-            return addPoint();
+        function clickShortcuts() {
+            context.container().call(uiShortcuts(context), true);
         }
 
-        timeout(function() {
-            reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
-                tooltipClass: 'intro-points-describe',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { continueTo(addName); }
-            });
-        }, 400);
 
-        context.on('exit.intro', function() {
-            // if user leaves select mode here, just continue with the tutorial.
-            continueTo(reselectPoint);
-        });
+        var pane = selection.append('div')
+            .attr('class', 'help-wrap map-overlay fillL col6 content hide');
+        var tooltipBehavior = tooltip()
+            .placement((textDirection === 'rtl') ? 'right' : 'left')
+            .html(true)
+            .title(uiTooltipHtml(t('help.title'), key));
+        var button = selection.append('button')
+            .attr('tabindex', -1)
+            .on('click', togglePane)
+            .call(svgIcon('#icon-help', 'light'))
+            .call(tooltipBehavior);
+        var shown = false;
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
 
+        var toc = pane
+            .append('ul')
+            .attr('class', 'toc');
 
-    function addName() {
-        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
-            return addPoint();
-        }
+        var menuItems = toc.selectAll('li')
+            .data(docs)
+            .enter()
+            .append('li')
+            .append('a')
+            .html(function(d) { return d.title; })
+            .on('click', clickHelp);
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        var shortcuts = toc
+            .append('li')
+            .attr('class', 'shortcuts')
+            .call(tooltip()
+                .html(true)
+                .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
+                .placement('top')
+            )
+            .append('a')
+            .on('click', clickShortcuts);
 
-        timeout(function() {
-            // It's possible for the user to add a name in a previous step..
-            // If so, don't tell them to add the name in this step.
-            // Give them an OK button instead.
-            var entity = context.entity(pointId);
-            if (entity.tags.name) {
-                var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
-                    tooltipClass: 'intro-points-describe',
-                    buttonText: t('intro.ok'),
-                    buttonCallback: function() { continueTo(addCloseEditor); }
-                });
-                tooltip.select('.instruction').style('display', 'none');
+        shortcuts
+            .append('div')
+            .text(t('shortcuts.title'));
 
-            } else {
-                reveal('.entity-editor-pane', t('intro.points.add_name'),
-                    { tooltipClass: 'intro-points-describe' }
-                );
-            }
-        }, 400);
+        var walkthrough = toc
+            .append('li')
+            .attr('class', 'walkthrough')
+            .append('a')
+            .on('click', clickWalkthrough);
 
-        context.history().on('change.intro', function() {
-            continueTo(addCloseEditor);
-        });
+        walkthrough
+            .append('svg')
+            .attr('class', 'logo logo-walkthrough')
+            .append('use')
+            .attr('xlink:href', '#logo-walkthrough');
 
-        context.on('exit.intro', function() {
-            // if user leaves select mode here, just continue with the tutorial.
-            continueTo(reselectPoint);
-        });
+        walkthrough
+            .append('div')
+            .text(t('splash.walkthrough'));
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
 
+        var content = pane
+            .append('div')
+            .attr('class', 'left-content');
 
-    function addCloseEditor() {
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        var doctitle = content
+            .append('h2')
+            .text(t('help.title'));
 
-        var selector = '.entity-editor-pane button.preset-close svg use';
-        var href = d3_select(selector).attr('href') || '#icon-close';
+        var body = content
+            .append('div')
+            .attr('class', 'body');
 
-        context.on('exit.intro', function() {
-            continueTo(reselectPoint);
-        });
+        var nav = content
+            .append('div')
+            .attr('class', 'nav');
 
-        reveal('.entity-editor-pane',
-            t('intro.points.add_close', { button: icon(href, 'pre-text') })
-        );
+        clickHelp(docs[0], 0);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
+        var keybinding = d3keybinding('help')
+            .on(key, togglePane)
+            .on([t('background.key'), t('map_data.key')], hidePane);
+
+        d3_select(document)
+            .call(keybinding);
+
+        uiHelp.hidePane = hidePane;
+        uiHelp.togglePane = togglePane;
+        uiHelp.setVisible = setVisible;
+    }
+
+    return help;
+}
+
+function localeDateString(s) {
+    if (!s) return null;
+    var detected = utilDetect();
+    var options = { day: 'numeric', month: 'short', year: 'numeric' };
+    var d = new Date(s);
+    if (isNaN(d.getTime())) return null;
+    return d.toLocaleDateString(detected.locale, options);
+}
+
+function vintageRange(vintage) {
+    var s;
+    if (vintage.start || vintage.end) {
+        s = (vintage.start || '?');
+        if (vintage.start !== vintage.end) {
+            s += ' - ' + (vintage.end || '?');
         }
     }
+    return s;
+}
 
 
-    function reselectPoint() {
-        if (!pointId) return chapter.restart();
-        var entity = context.hasEntity(pointId);
-        if (!entity) return chapter.restart();
+function rendererBackgroundSource(data) {
+    var source = clone(data);
+    var offset = [0, 0];
+    var name = source.name;
+    var description = source.description;
+    var best = !!source.best;
+    var template = source.template;
 
-        // make sure it's still a cafe, in case user somehow changed it..
-        var oldPreset = context.presets().match(entity, context.graph());
-        context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
+    source.scaleExtent = data.scaleExtent || [0, 22];
+    source.overzoom = data.overzoom !== false;
 
-        context.enter(modeBrowse(context));
 
-        var msec = transitionTime(entity.loc, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().centerEase(entity.loc, msec);
+    source.offset = function(_) {
+        if (!arguments.length) return offset;
+        offset = _;
+        return source;
+    };
 
-        timeout(function() {
-            var box = pointBox(entity.loc, context);
-            reveal(box, t('intro.points.reselect'), { duration: 600 });
 
-            timeout(function() {
-                context.map().on('move.intro drawn.intro', function() {
-                    var entity = context.hasEntity(pointId);
-                    if (!entity) return chapter.restart();
-                    var box = pointBox(entity.loc, context);
-                    reveal(box, t('intro.points.reselect'), { duration: 0 });
-                });
-            }, 600); // after reveal..
+    source.nudge = function(_, zoomlevel) {
+        offset[0] += _[0] / Math.pow(2, zoomlevel);
+        offset[1] += _[1] / Math.pow(2, zoomlevel);
+        return source;
+    };
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'select') return;
-                continueTo(updatePoint);
-            });
 
-        }, msec + 100);
+    source.name = function() {
+        var id_safe = source.id.replace('.', '<TX_DOT>');
+        return t('imagery.' + id_safe + '.name', { default: name });
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
 
+    source.description = function() {
+        var id_safe = source.id.replace('.', '<TX_DOT>');
+        return t('imagery.' + id_safe + '.description', { default: description });
+    };
 
-    function updatePoint() {
-        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
-            return continueTo(reselectPoint);
-        }
 
-        // reset pane, in case user happened to untag the point..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+    source.best = function() {
+        return best;
+    };
 
-        context.on('exit.intro', function() {
-            continueTo(reselectPoint);
-        });
 
-        context.history().on('change.intro', function() {
-            continueTo(updateCloseEditor);
-        });
+    source.area = function() {
+        if (!data.polygon) return Number.MAX_VALUE;  // worldwide
+        var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
+        return isNaN(area) ? 0 : area;
+    };
 
-        timeout(function() {
-            reveal('.entity-editor-pane', t('intro.points.update'),
-                { tooltipClass: 'intro-points-describe' }
-            );
-        }, 400);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+    source.imageryUsed = function() {
+        return name || source.id;
+    };
 
 
-    function updateCloseEditor() {
-        if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
-            return continueTo(reselectPoint);
-        }
+    source.template = function(_) {
+        if (!arguments.length) return template;
+        if (source.id === 'custom') template = _;
+        return source;
+    };
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
 
-        context.on('exit.intro', function() {
-            continueTo(rightClickPoint);
+    source.url = function(coord) {
+        return template
+            .replace('{x}', coord[0])
+            .replace('{y}', coord[1])
+            // TMS-flipped y coordinate
+            .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
+            .replace(/\{z(oom)?\}/, coord[2])
+            .replace(/\{switch:([^}]+)\}/, function(s, r) {
+                var subdomains = r.split(',');
+                return subdomains[(coord[0] + coord[1]) % subdomains.length];
+            })
+            .replace('{u}', function() {
+                var u = '';
+                for (var zoom = coord[2]; zoom > 0; zoom--) {
+                    var b = 0;
+                    var mask = 1 << (zoom - 1);
+                    if ((coord[0] & mask) !== 0) b++;
+                    if ((coord[1] & mask) !== 0) b += 2;
+                    u += b.toString();
+                }
+                return u;
+            });
+    };
+
+
+    source.intersects = function(extent) {
+        extent = extent.polygon();
+        return !data.polygon || data.polygon.some(function(polygon) {
+            return geoPolygonIntersectsPolygon(polygon, extent, true);
         });
+    };
 
-        timeout(function() {
-            reveal('.entity-editor-pane',
-                t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
-            );
-        }, 500);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+    source.validZoom = function(z) {
+        return source.scaleExtent[0] <= z &&
+            (source.overzoom || source.scaleExtent[1] > z);
+    };
 
 
-    function rightClickPoint() {
-        if (!pointId) return chapter.restart();
-        var entity = context.hasEntity(pointId);
-        if (!entity) return chapter.restart();
+    source.isLocatorOverlay = function() {
+        return source.id === 'mapbox_locator_overlay';
+    };
 
-        context.enter(modeBrowse(context));
 
-        var box = pointBox(entity.loc, context);
-        reveal(box, t('intro.points.rightclick'), { duration: 600 });
+    /* hides a source from the list, but leaves it available for use */
+    source.isHidden = function() {
+        return source.id === 'DigitalGlobe-Premium-vintage' ||
+            source.id === 'DigitalGlobe-Standard-vintage';
+    };
 
-        timeout(function() {
-            context.map().on('move.intro drawn.intro', function() {
-                var entity = context.hasEntity(pointId);
-                if (!entity) return chapter.restart();
-                var box = pointBox(entity.loc, context);
-                reveal(box, t('intro.points.rightclick'), { duration: 0 });
-            });
-        }, 600); // after reveal
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') return;
-            var ids = context.selectedIDs();
-            if (ids.length !== 1 || ids[0] !== pointId) return;
+    source.copyrightNotices = function() {};
 
-            timeout(function() {
-                var node = selectMenuItem('delete').node();
-                if (!node) return;
-                continueTo(enterDelete);
-            }, 300);  // after menu visible
-        });
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
-        }
-    }
+    source.getMetadata = function(center, tileCoord, callback) {
+        var vintage = {
+            start: localeDateString(source.startDate),
+            end: localeDateString(source.endDate)
+        };
+        vintage.range = vintageRange(vintage);
+
+        var metadata = { vintage: vintage };
+        callback(null, metadata);
+    };
 
 
-    function enterDelete() {
-        if (!pointId) return chapter.restart();
-        var entity = context.hasEntity(pointId);
-        if (!entity) return chapter.restart();
+    return source;
+}
 
-        var node = selectMenuItem('delete').node();
-        if (!node) { return continueTo(rightClickPoint); }
 
-        revealEditMenu(entity.loc,
-            t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
-        );
+rendererBackgroundSource.Bing = function(data, dispatch) {
+    // http://msdn.microsoft.com/en-us/library/ff701716.aspx
+    // http://msdn.microsoft.com/en-us/library/ff701701.aspx
 
-        timeout(function() {
-            context.map().on('move.intro drawn.intro', function() {
-                revealEditMenu(entity.loc,
-                    t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
-                    { duration: 0}
-                );
-            });
-        }, 300); // after menu visible
+    data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
 
-        context.on('exit.intro', function() {
-            if (!pointId) return chapter.restart();
-            var entity = context.hasEntity(pointId);
-            if (entity) return continueTo(rightClickPoint);  // point still exists
-        });
+    var bing = rendererBackgroundSource(data),
+        key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
+        url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
+            key + '&jsonp={callback}',
+        cache = {},
+        inflight = {},
+        providers = [];
 
-        context.history().on('change.intro', function(changed) {
-            if (changed.deleted().length) {
-                continueTo(undo);
-            }
+    jsonpRequest(url, function(json) {
+        providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
+            return {
+                attribution: provider.attribution,
+                areas: provider.coverageAreas.map(function(area) {
+                    return {
+                        zoom: [area.zoomMin, area.zoomMax],
+                        extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
+                    };
+                })
+            };
         });
+        dispatch.call('change');
+    });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+
+    bing.copyrightNotices = function(zoom, extent) {
+        zoom = Math.min(zoom, 21);
+        return providers.filter(function(provider) {
+            return some(provider.areas, function(area) {
+                return extent.intersects(area.extent) &&
+                    area.zoom[0] <= zoom &&
+                    area.zoom[1] >= zoom;
+            });
+        }).map(function(provider) {
+            return provider.attribution;
+        }).join(', ');
+    };
 
 
-    function undo() {
-        context.history().on('change.intro', function() {
-            continueTo(play);
-        });
+    bing.getMetadata = function(center, tileCoord, callback) {
+        var tileId = tileCoord.slice(0, 3).join('/'),
+            zoom = Math.min(tileCoord[2], 21),
+            centerPoint = center[1] + ',' + center[0],  // lat,lng
+            url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
+                '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
 
-        var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
-        reveal('#bar button.undo-button',
-            t('intro.points.undo', { button: icon(iconName, 'pre-text') })
-        );
+        if (inflight[tileId]) return;
 
-        function continueTo(nextStep) {
-            context.history().on('change.intro', null);
-            nextStep();
+        if (!cache[tileId]) {
+            cache[tileId] = {};
+        }
+        if (cache[tileId] && cache[tileId].metadata) {
+            return callback(null, cache[tileId].metadata);
         }
-    }
-
 
-    function play() {
-        dispatch$$1.call('done');
-        reveal('#id-container',
-            t('intro.points.play', { next: t('intro.areas.title') }), {
-                tooltipBox: '.intro-nav-wrap .chapter-area',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { reveal('#id-container'); }
-            }
-        );
-    }
+        inflight[tileId] = true;
+        jsonpRequest(url, function(result) {
+            delete inflight[tileId];
 
+            var err = (!result && 'Unknown Error') || result.errorDetails;
+            if (err) {
+                return callback(err);
+            } else {
+                var vintage = {
+                    start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
+                    end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
+                };
+                vintage.range = vintageRange(vintage);
 
-    chapter.enter = function() {
-        addPoint();
+                var metadata = { vintage: vintage };
+                cache[tileId].metadata = metadata;
+                return callback(null, metadata);
+            }
+        });
     };
 
 
-    chapter.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        context.on('enter.intro exit.intro', null);
-        context.map().on('move.intro drawn.intro', null);
-        context.history().on('change.intro', null);
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
-        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-    };
+    bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
 
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
-    };
+    return bing;
+};
 
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
 
-function uiIntroArea(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        playground = [-85.63552, 41.94159],
-        playgroundPreset = context.presets().item('leisure/playground'),
-        descriptionField = context.presets().field('description'),
-        timeouts = [],
-        areaId;
+rendererBackgroundSource.Esri = function(data) {
 
+    // don't request blank tiles, instead overzoom real tiles - #4327
+    // deprecated technique, but it works (for now)
+    if (data.template.match(/blankTile/) === null) {
+        data.template = data.template + '?blankTile=false';
+    }
 
-    var chapter = {
-        title: 'intro.areas.title'
-    };
+    var esri = rendererBackgroundSource(data),
+        cache = {},
+        inflight = {};
 
+    esri.getMetadata = function(center, tileCoord, callback) {
+        var tileId = tileCoord.slice(0, 3).join('/'),
+            zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
+            centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
+            unknown = t('info_panels.background.unknown'),
+            metadataLayer,
+            vintage = {},
+            metadata = {};
 
-    function timeout(f, t$$1) {
-        timeouts.push(window.setTimeout(f, t$$1));
-    }
+        if (inflight[tileId]) return;
 
+        switch (true) {
+            case zoom >= 19:
+                metadataLayer = 3;
+                break;
+            case zoom >= 17:
+                metadataLayer = 2;
+                break;
+            case zoom >= 13:
+                metadataLayer = 0;
+                break;
+            default:
+                metadataLayer = 99;
+        }
 
-    function eventCancel() {
-        event.stopPropagation();
-        event.preventDefault();
-    }
+        // build up query using the layer appropriate to the current zoom
+        var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
 
+        if (!cache[tileId]) {
+            cache[tileId] = {};
+        }
+        if (cache[tileId] && cache[tileId].metadata) {
+            return callback(null, cache[tileId].metadata);
+        }
 
-    function revealPlayground(center, text, options) {
-        var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
-        var box = pad$1(center, padding, context);
-        reveal(box, text, options);
-    }
+        // accurate metadata is only available >= 13
+        if (metadataLayer === 99) {
+            vintage = {
+                start: null,
+                end: null,
+                range: null
+            };
+            metadata = {
+                vintage: null,
+                source: unknown,
+                description: unknown,
+                resolution: unknown,
+                accuracy: unknown
+            };
 
+            callback(null, metadata);
 
-    function addArea() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
-        areaId = null;
+        } else {
+            inflight[tileId] = true;
+            jsonpRequest(url, function(result) {
+                delete inflight[tileId];
 
-        var msec = transitionTime(playground, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(playground, msec);
+                var err;
+                if (!result) {
+                    err = 'Unknown Error';
+                } else if (result.features && result.features.length < 1) {
+                    err = 'No Results';
+                } else if (result.error && result.error.message) {
+                    err = result.error.message;
+                }
 
-        timeout(function() {
-            var tooltip = reveal('button.add-area',
-                t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
+                if (err) {
+                    return callback(err);
+                } else {
+                    // pass through the discrete capture date from metadata
+                    var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
+                    vintage = {
+                        start: captureDate,
+                        end: captureDate,
+                        range: captureDate
+                    };
+                    metadata = {
+                        vintage: vintage,
+                        source: clean(result.features[0].attributes.NICE_NAME),
+                        description: clean(result.features[0].attributes.NICE_DESC),
+                        resolution: clean(result.features[0].attributes.SRC_RES),
+                        accuracy: clean(result.features[0].attributes.SRC_ACC)
+                    };
 
-            tooltip.selectAll('.tooltip-inner')
-                .insert('svg', 'span')
-                .attr('class', 'tooltip-illustration')
-                .append('use')
-                .attr('xlink:href', '#landuse-images');
+                    // append units - meters
+                    if (isFinite(metadata.resolution)) {
+                        metadata.resolution += ' m';
+                    }
+                    if (isFinite(metadata.accuracy)) {
+                        metadata.accuracy += ' m';
+                    }
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'add-area') return;
-                continueTo(startPlayground);
+                    cache[tileId].metadata = metadata;
+                    return callback(null, metadata);
+                }
             });
-        }, msec + 100);
-
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
         }
-    }
 
 
-    function startPlayground() {
-        if (context.mode().id !== 'add-area') {
-            return chapter.restart();
+        function clean(val) {
+            return String(val).trim() || unknown;
         }
+    };
 
-        areaId = null;
-        context.map().zoomEase(19.5, 500);
+    return esri;
+};
 
-        timeout(function() {
-            revealPlayground(playground,
-                t('intro.areas.start_playground'), { duration: 250 }
-            );
 
-            timeout(function() {
-                context.map().on('move.intro drawn.intro', function() {
-                    revealPlayground(playground,
-                        t('intro.areas.start_playground'), { duration: 0 }
-                    );
-                });
-                context.on('enter.intro', function(mode) {
-                    if (mode.id !== 'draw-area') return chapter.restart();
-                    continueTo(continuePlayground);
-                });
-            }, 250);  // after reveal
+rendererBackgroundSource.None = function() {
+    var source = rendererBackgroundSource({ id: 'none', template: '' });
 
-        }, 550);  // after easing
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    source.name = function() {
+        return t('background.none');
+    };
 
 
-    function continuePlayground() {
-        if (context.mode().id !== 'draw-area') {
-            return chapter.restart();
-        }
+    source.imageryUsed = function() {
+        return 'None';
+    };
 
-        areaId = null;
-        revealPlayground(playground,
-            t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
-            { duration: 250 }
-        );
 
-        timeout(function() {
-            context.map().on('move.intro drawn.intro', function() {
-                revealPlayground(playground,
-                    t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
-                    { duration: 0 }
-                );
-            });
-        }, 250);  // after reveal
+    source.area = function() {
+        return -1;  // sources in background pane are sorted by area
+    };
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-area') {
-                var entity = context.hasEntity(context.selectedIDs()[0]);
-                if (entity && entity.nodes.length >= 6) {
-                    return continueTo(finishPlayground);
-                } else {
-                    return;
-                }
-            } else if (mode.id === 'select') {
-                areaId = context.selectedIDs()[0];
-                return continueTo(searchPresets);
-            } else {
-                return chapter.restart();
-            }
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    return source;
+};
 
 
-    function finishPlayground() {
-        if (context.mode().id !== 'draw-area') {
-            return chapter.restart();
-        }
+rendererBackgroundSource.Custom = function(template) {
+    var source = rendererBackgroundSource({ id: 'custom', template: template });
 
-        areaId = null;
-        revealPlayground(playground,
-            t('intro.areas.finish_playground'), { duration: 250 }
-        );
 
-        timeout(function() {
-            context.map().on('move.intro drawn.intro', function() {
-                revealPlayground(playground,
-                    t('intro.areas.finish_playground'), { duration: 0 }
-                );
-            });
-        }, 250);  // after reveal
+    source.name = function() {
+        return t('background.custom');
+    };
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-area') {
-                return;
-            } else if (mode.id === 'select') {
-                areaId = context.selectedIDs()[0];
-                return continueTo(searchPresets);
-            } else {
-                return chapter.restart();
-            }
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    source.imageryUsed = function() {
+        return 'Custom (' + source.template() + ')';
+    };
 
 
-    function searchPresets() {
-        if (!areaId || !context.hasEntity(areaId)) {
-            return addArea();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
-            context.enter(modeSelect(context, [areaId]));
-        }
+    source.area = function() {
+        return -2;  // sources in background pane are sorted by area
+    };
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+    return source;
+};
 
-            d3_select('.preset-search-input')
-                .on('keydown.intro', null)
-                .on('keyup.intro', checkPresetSearch);
+function rendererTileLayer(context) {
+    var tileSize = 256;
+    var transformProp = utilPrefixCSSProperty('Transform');
+    var geotile = d3geoTile();
 
-            reveal('.preset-search-input',
-                t('intro.areas.search_playground', { preset: playgroundPreset.name() })
-            );
-        }, 400);  // after preset list pane visible..
+    var _projection;
+    var _cache = {};
+    var _tileOrigin;
+    var _zoom;
+    var _source;
 
-        context.on('enter.intro', function(mode) {
-            if (!areaId || !context.hasEntity(areaId)) {
-                return continueTo(addArea);
-            }
 
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
-                // keep the user's area selected..
-                context.enter(modeSelect(context, [areaId]));
+    // blacklist overlay tiles around Null Island..
+    function nearNullIsland(x, y, z) {
+        if (z >= 7) {
+            var center = Math.pow(2, z - 1);
+            var width = Math.pow(2, z - 6);
+            var min = center - (width / 2);
+            var max = center + (width / 2) - 1;
+            return x >= min && x <= max && y >= min && y <= max;
+        }
+        return false;
+    }
 
-                // reset pane, in case user somehow happened to change it..
-                d3_select('.inspector-wrap .panewrap').style('right', '-100%');
-                // disallow scrolling
-                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', null)
-                    .on('keyup.intro', checkPresetSearch);
+    function tileSizeAtZoom(d, z) {
+        var EPSILON = 0.002;
+        return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
+    }
 
-                reveal('.preset-search-input',
-                    t('intro.areas.search_playground', { preset: playgroundPreset.name() })
-                );
 
-                context.history().on('change.intro', null);
-            }
-        });
+    function atZoom(t$$1, distance) {
+        var power = Math.pow(2, distance);
+        return [
+            Math.floor(t$$1[0] * power),
+            Math.floor(t$$1[1] * power),
+            t$$1[2] + distance
+        ];
+    }
 
-        function checkPresetSearch() {
-            var first = d3_select('.preset-list-item:first-child');
 
-            if (first.classed('preset-leisure-playground')) {
-                reveal(first.select('.preset-list-button').node(),
-                    t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
-                    { duration: 300 }
-                );
+    function lookUp(d) {
+        for (var up = -1; up > -d[2]; up--) {
+            var tile = atZoom(d, up);
+            if (_cache[_source.url(tile)] !== false) {
+                return tile;
+            }
+        }
+    }
 
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', eventCancel, true)
-                    .on('keyup.intro', null);
 
-                context.history().on('change.intro', function() {
-                    continueTo(clickAddField);
-                });
+    function uniqueBy(a, n) {
+        var o = [];
+        var seen = {};
+        for (var i = 0; i < a.length; i++) {
+            if (seen[a[i][n]] === undefined) {
+                o.push(a[i]);
+                seen[a[i][n]] = true;
             }
         }
+        return o;
+    }
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-            nextStep();
-        }
+
+    function addSource(d) {
+        d.push(_source.url(d));
+        return d;
     }
 
 
-    function clickAddField() {
-        if (!areaId || !context.hasEntity(areaId)) {
-            return addArea();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
-            return searchPresets();
-        }
+    // Update tiles based on current state of `projection`.
+    function background(selection) {
+        _zoom = geoScaleToZoom(_projection.scale(), tileSize);
 
-        if (!d3_select('.form-field-description').empty()) {
-            return continueTo(describePlayground);
+        var pixelOffset;
+        if (_source) {
+            pixelOffset = [
+                _source.offset()[0] * Math.pow(2, _zoom),
+                _source.offset()[1] * Math.pow(2, _zoom)
+            ];
+        } else {
+            pixelOffset = [0, 0];
         }
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        var translate = [
+            _projection.translate()[0] + pixelOffset[0],
+            _projection.translate()[1] + pixelOffset[1]
+        ];
 
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        geotile
+            .scale(_projection.scale() * 2 * Math.PI)
+            .translate(translate);
 
-            // It's possible for the user to add a description in a previous step..
-            // If they did this already, just continue to next step.
-            var entity = context.entity(areaId);
-            if (entity.tags.description) {
-                return continueTo(play);
-            }
+        _tileOrigin = [
+            _projection.scale() * Math.PI - translate[0],
+            _projection.scale() * Math.PI - translate[1]
+        ];
 
-            // scroll "Add field" into view
-            var box = d3_select('.more-fields').node().getBoundingClientRect();
-            if (box.top > 300) {
-                var pane = d3_select('.entity-editor-pane .inspector-body');
-                var start = pane.node().scrollTop;
-                var end = start + (box.top - 300);
+        render(selection);
+    }
 
-                pane
-                    .transition()
-                    .duration(250)
-                    .tween('scroll.inspector', function() {
-                        var node = this;
-                        var i = d3_interpolateNumber(start, end);
-                        return function(t$$1) {
-                            node.scrollTop = i(t$$1);
-                        };
-                    });
-            }
 
-            timeout(function() {
-                reveal('.more-fields .combobox-input',
-                    t('intro.areas.add_field'),
-                    { duration: 300 }
-                );
+    // Derive the tiles onscreen, remove those offscreen and position them.
+    // Important that this part not depend on `_projection` because it's
+    // rentered when tiles load/error (see #644).
+    function render(selection) {
+        if (!_source) return;
+        var requests = [];
+        var showDebug = context.getDebug('tile') && !_source.overlay;
 
-                d3_select('.more-fields .combobox-input')
-                    .on('click.intro', function() {
-                        continueTo(chooseDescriptionField);
-                    });
-            }, 300);  // after "Add Field" visible
+        if (_source.validZoom(_zoom)) {
+            geotile().forEach(function(d) {
+                addSource(d);
+                if (d[3] === '') return;
+                if (typeof d[3] !== 'string') return; // Workaround for #2295
+                requests.push(d);
+                if (_cache[d[3]] === false && lookUp(d)) {
+                    requests.push(addSource(lookUp(d)));
+                }
+            });
 
-        }, 400);  // after editor pane visible
+            requests = uniqueBy(requests, 3).filter(function(r) {
+                if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
+                    return false;
+                }
+                // don't re-request tiles which have failed in the past
+                return _cache[r[3]] !== false;
+            });
+        }
 
-        context.on('exit.intro', function() {
-            return continueTo(searchPresets);
-        });
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.more-fields .combobox-input').on('click.intro', null);
-            context.on('exit.intro', null);
-            nextStep();
+        function load(d) {
+            _cache[d[3]] = true;
+            d3_select(this)
+                .on('error', null)
+                .on('load', null)
+                .classed('tile-loaded', true);
+            render(selection);
         }
-    }
-
 
-    function chooseDescriptionField() {
-        if (!areaId || !context.hasEntity(areaId)) {
-            return addArea();
+        function error(d) {
+            _cache[d[3]] = false;
+            d3_select(this)
+                .on('error', null)
+                .on('load', null)
+                .remove();
+            render(selection);
         }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
-            return searchPresets();
+
+        function imageTransform(d) {
+            var ts = tileSize * Math.pow(2, _zoom - d[2]);
+            var scale = tileSizeAtZoom(d, _zoom);
+            return 'translate(' +
+                ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
+                ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
+                'scale(' + scale + ',' + scale + ')';
         }
 
-        if (!d3_select('.form-field-description').empty()) {
-            return continueTo(describePlayground);
+        function tileCenter(d) {
+            var ts = tileSize * Math.pow(2, _zoom - d[2]);
+            return [
+                ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
+                ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
+            ];
         }
 
-        // Make sure combobox is ready..
-        if (d3_select('div.combobox').empty()) {
-            return continueTo(clickAddField);
+        function debugTransform(d) {
+            var coord = tileCenter(d);
+            return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
         }
-        // Watch for the combobox to go away..
-        var watcher;
-        watcher = window.setInterval(function() {
-            if (d3_select('div.combobox').empty()) {
-                window.clearInterval(watcher);
-                timeout(function() {
-                    if (d3_select('.form-field-description').empty()) {
-                        continueTo(retryChooseDescription);
-                    } else {
-                        continueTo(describePlayground);
-                    }
-                }, 300);  // after description field added.
-            }
-        }, 300);
 
-        reveal('div.combobox',
-            t('intro.areas.choose_field', { field: descriptionField.label() }),
-            { duration: 300 }
-        );
 
-        context.on('exit.intro', function() {
-            return continueTo(searchPresets);
+        // Pick a representative tile near the center of the viewport
+        // (This is useful for sampling the imagery vintage)
+        var dims = geotile.size();
+        var mapCenter = [dims[0] / 2, dims[1] / 2];
+        var minDist = Math.max(dims[0], dims[1]);
+        var nearCenter;
+
+        requests.forEach(function(d) {
+            var c = tileCenter(d);
+            var dist = geoVecLength(c, mapCenter);
+            if (dist < minDist) {
+                minDist = dist;
+                nearCenter = d;
+            }
         });
 
-        function continueTo(nextStep) {
-            if (watcher) window.clearInterval(watcher);
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
 
+        var image = selection.selectAll('img')
+            .data(requests, function(d) { return d[3]; });
 
-    function describePlayground() {
-        if (!areaId || !context.hasEntity(areaId)) {
-            return addArea();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
-            return searchPresets();
-        }
+        image.exit()
+            .style(transformProp, imageTransform)
+            .classed('tile-removing', true)
+            .classed('tile-center', false)
+            .each(function() {
+                var tile = d3_select(this);
+                window.setTimeout(function() {
+                    if (tile.classed('tile-removing')) {
+                        tile.remove();
+                    }
+                }, 300);
+            });
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+        image.enter()
+          .append('img')
+            .attr('class', 'tile')
+            .attr('src', function(d) { return d[3]; })
+            .on('error', error)
+            .on('load', load)
+          .merge(image)
+            .style(transformProp, imageTransform)
+            .classed('tile-debug', showDebug)
+            .classed('tile-removing', false)
+            .classed('tile-center', function(d) { return d === nearCenter; });
 
-        if (d3_select('.form-field-description').empty()) {
-            return continueTo(retryChooseDescription);
-        }
 
-        context.on('exit.intro', function() {
-            continueTo(play);
-        });
 
-        reveal('.entity-editor-pane',
-            t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
-            { duration: 300 }
-        );
+        var debug = selection.selectAll('.tile-label-debug')
+            .data(showDebug ? requests : [], function(d) { return d[3]; });
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+        debug.exit()
+            .remove();
 
+        if (showDebug) {
+            var debugEnter = debug.enter()
+                .append('div')
+                .attr('class', 'tile-label-debug');
 
-    function retryChooseDescription() {
-        if (!areaId || !context.hasEntity(areaId)) {
-            return addArea();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
-            return searchPresets();
-        }
+            debugEnter
+                .append('div')
+                .attr('class', 'tile-label-debug-coord');
 
-        // reset pane, in case user happened to change it..
-        d3_select('.inspector-wrap .panewrap').style('right', '0%');
+            debugEnter
+                .append('div')
+                .attr('class', 'tile-label-debug-vintage');
 
-        reveal('.entity-editor-pane',
-            t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
-            buttonText: t('intro.ok'),
-            buttonCallback: function() { continueTo(clickAddField); }
-        });
+            debug = debug.merge(debugEnter);
 
-        context.on('exit.intro', function() {
-            return continueTo(searchPresets);
-        });
+            debug
+                .style(transformProp, debugTransform);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+            debug
+                .selectAll('.tile-label-debug-coord')
+                .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
 
+            debug
+                .selectAll('.tile-label-debug-vintage')
+                .each(function(d) {
+                    var span = d3_select(this);
+                    var center = context.projection.invert(tileCenter(d));
+                    _source.getMetadata(center, d, function(err, result) {
+                        span.text((result && result.vintage && result.vintage.range) ||
+                            t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
+                        );
+                    });
+                });
+        }
 
-    function play() {
-        dispatch$$1.call('done');
-        reveal('#id-container',
-            t('intro.areas.play', { next: t('intro.lines.title') }), {
-                tooltipBox: '.intro-nav-wrap .chapter-line',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { reveal('#id-container'); }
-            }
-        );
     }
 
 
-    chapter.enter = function() {
-        addArea();
+    background.projection = function(_) {
+        if (!arguments.length) return _projection;
+        _projection = _;
+        return background;
     };
 
 
-    chapter.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        context.on('enter.intro exit.intro', null);
-        context.map().on('move.intro drawn.intro', null);
-        context.history().on('change.intro', null);
-        d3_select('.inspector-wrap').on('wheel.intro', null);
-        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-        d3_select('.more-fields .combobox-input').on('click.intro', null);
+    background.dimensions = function(_) {
+        if (!arguments.length) return geotile.size();
+        geotile.size(_);
+        return background;
     };
 
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
+    background.source = function(_) {
+        if (!arguments.length) return _source;
+        _source = _;
+        _cache = {};
+        geotile.scaleExtent(_source.scaleExtent);
+        return background;
     };
 
 
-    return utilRebind(chapter, dispatch$$1, 'on');
+    return background;
 }
 
-function uiIntroLine(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        timeouts = [],
-        tulipRoadId = null,
-        flowerRoadId = 'w646',
-        tulipRoadStart = [-85.6297754121684, 41.95805253325314],
-        tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
-        tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
-        roadCategory = context.presets().item('category-road'),
-        residentialPreset = context.presets().item('highway/residential'),
-        woodRoadId = 'w525',
-        woodRoadEndId = 'n2862',
-        woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
-        woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
-        woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
-        washingtonStreetId = 'w522',
-        twelfthAvenueId = 'w1',
-        eleventhAvenueEndId = 'n3550',
-        twelfthAvenueEndId = 'n5',
-        washingtonSegmentId = null,
-        eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
-        twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
-        deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
-        twelfthAvenue = [-85.62219310052491, 41.952505413152956];
+function rendererBackground(context) {
+    var dispatch$$1 = dispatch('change');
+    var detected = utilDetect();
+    var baseLayer = rendererTileLayer(context).projection(context.projection);
+    var _overlayLayers = [];
+    var _backgroundSources = [];
+    var _brightness = 1;
+    var _contrast = 1;
+    var _saturation = 1;
+    var _sharpness = 1;
 
 
-    var chapter = {
-        title: 'intro.lines.title'
-    };
+    function background(selection) {
 
+        var baseFilter = '';
+        if (detected.cssfilters) {
+            if (_brightness !== 1) {
+                baseFilter += 'brightness(' + _brightness + ')';
+            }
+            if (_contrast !== 1) {
+                baseFilter += 'contrast(' + _contrast + ')';
+            }
+            if (_saturation !== 1) {
+                baseFilter += 'saturate(' + _saturation + ')';
+            }
+            if (_sharpness < 1) {  // gaussian blur
+                var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
+                baseFilter += 'blur(' + blur + 'px)';
+            }
+        }
 
-    function timeout(f, t$$1) {
-        timeouts.push(window.setTimeout(f, t$$1));
-    }
+        var base = selection.selectAll('.layer-background')
+            .data([0]);
 
+        base = base.enter()
+            .insert('div', '.layer-data')
+            .attr('class', 'layer layer-background')
+            .merge(base);
 
-    function eventCancel() {
-        event.stopPropagation();
-        event.preventDefault();
-    }
+        if (detected.cssfilters) {
+            base.style('filter', baseFilter || null);
+        } else {
+            base.style('opacity', _brightness);
+        }
 
 
-    function revealEditMenu(loc, text, options) {
-        var rect = context.surfaceRect();
-        var point = context.curtainProjection(loc);
-        var pad = 40;
-        var width = 250 + (2 * pad);
-        var height = 350;
-        var startX = rect.left + point[0];
-        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
-        var box = {
-            left: left,
-            top: point[1] + rect.top - 60,
-            width: width,
-            height: height
-        };
-        reveal(box, text, options);
-    }
+        var imagery = base.selectAll('.layer-imagery')
+            .data([0]);
 
+        imagery.enter()
+            .append('div')
+            .attr('class', 'layer layer-imagery')
+            .merge(imagery)
+            .call(baseLayer);
 
-    function addLine() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
 
-        var msec = transitionTime(tulipRoadStart, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
+        var maskFilter = '';
+        var mixBlendMode = '';
+        if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
+            mixBlendMode = 'overlay';
+            maskFilter = 'saturate(0) blur(3px) invert(1)';
 
-        timeout(function() {
-            var tooltip = reveal('button.add-line',
-                t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
+            var contrast = _sharpness - 1;
+            maskFilter += ' contrast(' + contrast + ')';
 
-            tooltip.selectAll('.tooltip-inner')
-                .insert('svg', 'span')
-                .attr('class', 'tooltip-illustration')
-                .append('use')
-                .attr('xlink:href', '#feature-images');
+            var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
+            maskFilter += ' brightness(' + brightness + ')';
+        }
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'add-line') return;
-                continueTo(startLine);
-            });
-        }, msec + 100);
+        var mask = base.selectAll('.layer-unsharp-mask')
+            .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+        mask.exit()
+            .remove();
 
+        mask.enter()
+            .append('div')
+            .attr('class', 'layer layer-mask layer-unsharp-mask')
+            .merge(mask)
+            .call(baseLayer)
+            .style('filter', maskFilter || null)
+            .style('mix-blend-mode', mixBlendMode || null);
 
-    function startLine() {
-        if (context.mode().id !== 'add-line') {
-            return chapter.restart();
-        }
 
-        tulipRoadId = null;
+        var overlays = selection.selectAll('.layer-overlay')
+            .data(_overlayLayers, function(d) { return d.source().name(); });
 
-        var padding = 70 * Math.pow(2, context.map().zoom() - 18);
-        var box = pad$1(tulipRoadStart, padding, context);
-        box.height = box.height + 100;
-        reveal(box, t('intro.lines.start_line'));
+        overlays.exit()
+            .remove();
 
-        context.map().on('move.intro drawn.intro', function() {
-            padding = 70 * Math.pow(2, context.map().zoom() - 18);
-            box = pad$1(tulipRoadStart, padding, context);
-            box.height = box.height + 100;
-            reveal(box, t('intro.lines.start_line'), { duration: 0 });
-        });
+        overlays.enter()
+            .insert('div', '.layer-data')
+            .attr('class', 'layer layer-overlay')
+            .merge(overlays)
+            .each(function(layer) { d3_select(this).call(layer); });
+    }
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'draw-line') return chapter.restart();
-            continueTo(drawLine);
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+    background.updateImagery = function() {
+        if (context.inIntro()) return;
+
+        var b = background.baseLayerSource(),
+            o = _overlayLayers
+                .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
+                .map(function (d) { return d.source().id; })
+                .join(','),
+            meters = geoOffsetToMeters(b.offset()),
+            epsilon = 0.01,
+            x = +meters[0].toFixed(2),
+            y = +meters[1].toFixed(2),
+            q = utilStringQs(window.location.hash.substring(1));
+
+        var id = b.id;
+        if (id === 'custom') {
+            id = 'custom:' + b.template();
         }
-    }
 
+        if (id) {
+            q.background = id;
+        } else {
+            delete q.background;
+        }
 
-    function drawLine() {
-        if (context.mode().id !== 'draw-line') {
-            return chapter.restart();
+        if (o) {
+            q.overlays = o;
+        } else {
+            delete q.overlays;
         }
 
-        tulipRoadId = context.mode().selectedIDs()[0];
-        context.map().centerEase(tulipRoadMidpoint, 500);
+        if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
+            q.offset = x + ',' + y;
+        } else {
+            delete q.offset;
+        }
 
-        timeout(function() {
-            var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
-            var box = pad$1(tulipRoadMidpoint, padding, context);
-            box.height = box.height * 2;
-            reveal(box,
-                t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
-            );
+        if (!window.mocha) {
+            window.location.replace('#' + utilQsString(q, true));
+        }
 
-            context.map().on('move.intro drawn.intro', function() {
-                padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
-                box = pad$1(tulipRoadMidpoint, padding, context);
-                box.height = box.height * 2;
-                reveal(box,
-                    t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
-                    { duration: 0 }
-                );
-            });
-        }, 550);  // after easing..
+        var imageryUsed = [b.imageryUsed()];
 
-        context.history().on('change.intro', function() {
-            var entity = tulipRoadId && context.hasEntity(tulipRoadId);
-            if (!entity) return chapter.restart();
+        _overlayLayers
+            .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
+            .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
 
-            if (isLineConnected()) {
-                continueTo(continueLine);
-            }
-        });
+        var gpx = context.layers().layer('gpx');
+        if (gpx && gpx.enabled() && gpx.hasGpx()) {
+            // Include a string like '.gpx data file' or '.geojson data file'
+            var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
+            var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
+            imageryUsed.push(extension + 'data file');
+        }
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-line')
-                return;
-            else if (mode.id === 'select') {
-                continueTo(retryIntersect);
-                return;
-            }
-            else
-                return chapter.restart();
-        });
+        var mapillary_images = context.layers().layer('mapillary-images');
+        if (mapillary_images && mapillary_images.enabled()) {
+            imageryUsed.push('Mapillary Images');
+        }
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+        var mapillary_signs = context.layers().layer('mapillary-signs');
+        if (mapillary_signs && mapillary_signs.enabled()) {
+            imageryUsed.push('Mapillary Signs');
+        }
+
+        var openstreetcam_images = context.layers().layer('openstreetcam-images');
+        if (openstreetcam_images && openstreetcam_images.enabled()) {
+            imageryUsed.push('OpenStreetCam Images');
         }
-    }
 
+        context.history().imageryUsed(imageryUsed);
+    };
 
-    function isLineConnected() {
-        var entity = tulipRoadId && context.hasEntity(tulipRoadId);
-        if (!entity) return false;
 
-        var drawNodes = context.graph().childNodes(entity);
-        return some(drawNodes, function(node) {
-            return some(context.graph().parentWays(node), function(parent) {
-                return parent.id === flowerRoadId;
-            });
+    background.sources = function(extent) {
+        return _backgroundSources.filter(function(source) {
+            return source.intersects(extent);
         });
-    }
+    };
 
 
-    function retryIntersect() {
-        d3_select(window).on('mousedown.intro', eventCancel, true);
+    background.dimensions = function(_) {
+        if (!_) return;
+        baseLayer.dimensions(_);
 
-        var box = pad$1(tulipRoadIntersection, 80, context);
-        reveal(box,
-            t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
-        );
+        _overlayLayers.forEach(function(layer) {
+            layer.dimensions(_);
+        });
+    };
 
-        timeout(chapter.restart, 3000);
-    }
 
+    background.baseLayerSource = function(d) {
+        if (!arguments.length) return baseLayer.source();
 
-    function continueLine() {
-        if (context.mode().id !== 'draw-line') return chapter.restart();
-        var entity = tulipRoadId && context.hasEntity(tulipRoadId);
-        if (!entity) return chapter.restart();
+        // test source against OSM imagery blacklists..
+        var osm = context.connection();
+        if (!osm) return background;
 
-        context.map().centerEase(tulipRoadIntersection, 500);
+        var blacklists = context.connection().imageryBlacklists();
 
-        reveal('#surface', t('intro.lines.continue_line'));
+        var template = d.template(),
+            fail = false,
+            tested = 0,
+            regex, i;
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-line')
-                return;
-            else if (mode.id === 'select')
-                return continueTo(chooseCategoryRoad);
-            else
-                return chapter.restart();
-        });
+        for (i = 0; i < blacklists.length; i++) {
+            try {
+                regex = new RegExp(blacklists[i]);
+                fail = regex.test(template);
+                tested++;
+                if (fail) break;
+            } catch (e) {
+                /* noop */
+            }
+        }
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
+        // ensure at least one test was run.
+        if (!tested) {
+            regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
+            fail = regex.test(template);
         }
-    }
 
+        baseLayer.source(!fail ? d : background.findSource('none'));
+        dispatch$$1.call('change');
+        background.updateImagery();
+        return background;
+    };
 
-    function chooseCategoryRoad() {
-        if (context.mode().id !== 'select') {
-            return chapter.restart();
-        }
 
-        context.on('exit.intro', function() {
-            return chapter.restart();
+    background.findSource = function(id) {
+        return find$1(_backgroundSources, function(d) {
+            return d.id && d.id === id;
         });
+    };
 
-        var button = d3_select('.preset-category-road .preset-list-button');
-        if (button.empty()) return chapter.restart();
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+    background.bing = function() {
+        background.baseLayerSource(background.findSource('Bing'));
+    };
 
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-            reveal(button.node(),
-                t('intro.lines.choose_category_road', { category: roadCategory.name() })
-            );
+    background.showsLayer = function(d) {
+        return d.id === baseLayer.source().id ||
+            _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
+    };
 
-            button.on('click.intro', function() {
-                continueTo(choosePresetResidential);
-            });
 
-        }, 400);  // after editor pane visible
+    background.overlayLayerSources = function() {
+        return _overlayLayers.map(function (l) { return l.source(); });
+    };
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.preset-list-button').on('click.intro', null);
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
 
+    background.toggleOverlayLayer = function(d) {
+        var layer;
 
-    function choosePresetResidential() {
-        if (context.mode().id !== 'select') {
-            return chapter.restart();
+        for (var i = 0; i < _overlayLayers.length; i++) {
+            layer = _overlayLayers[i];
+            if (layer.source() === d) {
+                _overlayLayers.splice(i, 1);
+                dispatch$$1.call('change');
+                background.updateImagery();
+                return;
+            }
         }
 
-        context.on('exit.intro', function() {
-            return chapter.restart();
-        });
+        layer = rendererTileLayer(context)
+            .source(d)
+            .projection(context.projection)
+            .dimensions(baseLayer.dimensions()
+        );
 
-        var subgrid = d3_select('.preset-category-road .subgrid');
-        if (subgrid.empty()) return chapter.restart();
+        _overlayLayers.push(layer);
+        dispatch$$1.call('change');
+        background.updateImagery();
+    };
 
-        subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
-            .on('click.intro', function() {
-                continueTo(retryPresetResidential);
-            });
 
-        subgrid.selectAll('.preset-highway-residential .preset-list-button')
-            .on('click.intro', function() {
-                continueTo(nameRoad);
-            });
+    background.nudge = function(d, zoom) {
+        baseLayer.source().nudge(d, zoom);
+        dispatch$$1.call('change');
+        background.updateImagery();
+        return background;
+    };
 
-        timeout(function() {
-            reveal(subgrid.node(),
-                t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
-                { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
-            );
-        }, 300);
 
-        function continueTo(nextStep) {
-            d3_select('.preset-list-button').on('click.intro', null);
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+    background.offset = function(d) {
+        if (!arguments.length) return baseLayer.source().offset();
+        baseLayer.source().offset(d);
+        dispatch$$1.call('change');
+        background.updateImagery();
+        return background;
+    };
 
 
-    // selected wrong road type
-    function retryPresetResidential() {
-        if (context.mode().id !== 'select') {
-            return chapter.restart();
-        }
+    background.brightness = function(d) {
+        if (!arguments.length) return _brightness;
+        _brightness = d;
+        if (context.mode()) dispatch$$1.call('change');
+        return background;
+    };
 
-        context.on('exit.intro', function() {
-            return chapter.restart();
-        });
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+    background.contrast = function(d) {
+        if (!arguments.length) return _contrast;
+        _contrast = d;
+        if (context.mode()) dispatch$$1.call('change');
+        return background;
+    };
 
-        timeout(function() {
-            var button = d3_select('.entity-editor-pane .preset-list-button');
 
-            reveal(button.node(),
-                t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
-            );
+    background.saturation = function(d) {
+        if (!arguments.length) return _saturation;
+        _saturation = d;
+        if (context.mode()) dispatch$$1.call('change');
+        return background;
+    };
 
-            button.on('click.intro', function() {
-                continueTo(chooseCategoryRoad);
-            });
 
-        }, 500);
+    background.sharpness = function(d) {
+        if (!arguments.length) return _sharpness;
+        _sharpness = d;
+        if (context.mode()) dispatch$$1.call('change');
+        return background;
+    };
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.preset-list-button').on('click.intro', null);
-            context.on('exit.intro', null);
-            nextStep();
+
+    background.init = function() {
+        function parseMap(qmap) {
+            if (!qmap) return false;
+            var args = qmap.split('/').map(Number);
+            if (args.length < 3 || args.some(isNaN)) return false;
+            return geoExtent([args[2], args[1]]);
         }
-    }
 
+        var dataImagery = data.imagery || [],
+            q = utilStringQs(window.location.hash.substring(1)),
+            requested = q.background || q.layer,
+            extent = parseMap(q.map),
+            first,
+            best;
 
-    function nameRoad() {
-        context.on('exit.intro', function() {
-            continueTo(didNameRoad);
+        // Add all the available imagery sources
+        _backgroundSources = dataImagery.map(function(source) {
+            if (source.type === 'bing') {
+                return rendererBackgroundSource.Bing(source, dispatch$$1);
+            } else if (/^EsriWorldImagery/.test(source.id)) {
+                return rendererBackgroundSource.Esri(source);
+            } else {
+                return rendererBackgroundSource(source);
+            }
         });
 
-        timeout(function() {
-            reveal('.entity-editor-pane',
-                t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
-                { tooltipClass: 'intro-lines-name_road' }
+        first = _backgroundSources.length && _backgroundSources[0];
+
+        // Add 'None'
+        _backgroundSources.unshift(rendererBackgroundSource.None());
+
+        // Add 'Custom'
+        var template = context.storage('background-custom-template') || '';
+        var custom = rendererBackgroundSource.Custom(template);
+        _backgroundSources.unshift(custom);
+
+
+        // Decide which background layer to display
+        if (!requested && extent) {
+            best = find$1(this.sources(extent), function(s) { return s.best(); });
+        }
+        if (requested && requested.indexOf('custom:') === 0) {
+            template = requested.replace(/^custom:/, '');
+            background.baseLayerSource(custom.template(template));
+            context.storage('background-custom-template', template);
+        } else {
+            background.baseLayerSource(
+                background.findSource(requested) ||
+                best ||
+                background.findSource(context.storage('background-last-used')) ||
+                background.findSource('Bing') ||
+                first ||
+                background.findSource('none')
             );
-        }, 500);
+        }
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
+        var locator = find$1(_backgroundSources, function(d) {
+            return d.overlay && d.default;
+        });
+
+        if (locator) {
+            background.toggleOverlayLayer(locator);
         }
-    }
 
+        var overlays = (q.overlays || '').split(',');
+        overlays.forEach(function(overlay) {
+            overlay = background.findSource(overlay);
+            if (overlay) {
+                background.toggleOverlayLayer(overlay);
+            }
+        });
 
-    function didNameRoad() {
-        context.history().checkpoint('doneAddLine');
+        if (q.gpx) {
+            var gpx = context.layers().layer('gpx');
+            if (gpx) {
+                gpx.url(q.gpx);
+            }
+        }
 
-        timeout(function() {
-            reveal('#surface', t('intro.lines.did_name_road'), {
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { continueTo(updateLine); }
+        if (q.offset) {
+            var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
+                return !isNaN(n) && n;
             });
-        }, 500);
 
-        function continueTo(nextStep) {
-            nextStep();
+            if (offset.length === 2) {
+                background.offset(geoMetersToOffset(offset));
+            }
         }
-    }
+    };
 
 
-    function updateLine() {
-        context.history().reset('doneAddLine');
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return chapter.restart();
-        }
+    return utilRebind(background, dispatch$$1, 'on');
+}
 
-        var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
+function rendererFeatures(context) {
+    var traffic_roads = {
+        'motorway': true,
+        'motorway_link': true,
+        'trunk': true,
+        'trunk_link': true,
+        'primary': true,
+        'primary_link': true,
+        'secondary': true,
+        'secondary_link': true,
+        'tertiary': true,
+        'tertiary_link': true,
+        'residential': true,
+        'unclassified': true,
+        'living_street': true
+    };
 
-        timeout(function() {
-            var padding = 250 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadDragMidpoint, padding, context);
-            var advance = function() { continueTo(addNode); };
+    var service_roads = {
+        'service': true,
+        'road': true,
+        'track': true
+    };
 
-            reveal(box, t('intro.lines.update_line'),
-                { buttonText: t('intro.ok'), buttonCallback: advance }
-            );
+    var paths = {
+        'path': true,
+        'footway': true,
+        'cycleway': true,
+        'bridleway': true,
+        'steps': true,
+        'pedestrian': true,
+        'corridor': true
+    };
 
-            context.map().on('move.intro drawn.intro', function() {
-                var padding = 250 * Math.pow(2, context.map().zoom() - 19);
-                var box = pad$1(woodRoadDragMidpoint, padding, context);
-                reveal(box, t('intro.lines.update_line'),
-                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
-                );
-            });
-        }, msec + 100);
+    var past_futures = {
+        'proposed': true,
+        'construction': true,
+        'abandoned': true,
+        'dismantled': true,
+        'disused': true,
+        'razed': true,
+        'demolished': true,
+        'obliterated': true
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
+    var dispatch$$1 = dispatch('change', 'redraw'),
+        _cullFactor = 1,
+        _cache = {},
+        _features = {},
+        _stats = {},
+        _keys = [],
+        _hidden = [];
+
+
+    function update() {
+        if (!window.mocha) {
+            var q = utilStringQs(window.location.hash.substring(1));
+            var disabled = features.disabled();
+            if (disabled.length) {
+                q.disable_features = disabled.join(',');
+            } else {
+                delete q.disable_features;
+            }
+            window.location.replace('#' + utilQsString(q, true));
+            context.storage('disabled-features', disabled.join(','));
         }
+        _hidden = features.hidden();
+        dispatch$$1.call('change');
+        dispatch$$1.call('redraw');
     }
 
 
-    function addNode() {
-        context.history().reset('doneAddLine');
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return chapter.restart();
-        }
+    function defineFeature(k, filter, max) {
+        var isEnabled = true;
 
-        var padding = 40 * Math.pow(2, context.map().zoom() - 19);
-        var box = pad$1(woodRoadAddNode, padding, context);
-        reveal(box, t('intro.lines.add_node'));
+        _keys.push(k);
+        _features[k] = {
+            filter: filter,
+            enabled: isEnabled,   // whether the user wants it enabled..
+            count: 0,
+            currentMax: (max || Infinity),
+            defaultMax: (max || Infinity),
+            enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
+            disable: function() { this.enabled = false; this.currentMax = 0; },
+            hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
+            autoHidden: function() { return this.hidden() && this.currentMax > 0; }
+        };
+    }
 
-        context.map().on('move.intro drawn.intro', function() {
-            var padding = 40 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadAddNode, padding, context);
-            reveal(box, t('intro.lines.add_node'), { duration: 0 });
-        });
 
-        context.history().on('change.intro', function(changed) {
-            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-                return continueTo(updateLine);
-            }
-            if (changed.created().length === 1) {
-                timeout(function() { continueTo(startDragEndpoint); }, 500);
-            }
-        });
+    defineFeature('points', function isPoint(entity, resolver, geometry) {
+        return geometry === 'point';
+    }, 200);
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') {
-                continueTo(updateLine);
-            }
-        });
+    defineFeature('traffic_roads', function isTrafficRoad(entity) {
+        return traffic_roads[entity.tags.highway];
+    });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    defineFeature('service_roads', function isServiceRoad(entity) {
+        return service_roads[entity.tags.highway];
+    });
 
+    defineFeature('paths', function isPath(entity) {
+        return paths[entity.tags.highway];
+    });
 
-    function startDragEndpoint() {
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return continueTo(updateLine);
-        }
-        if (context.selectedIDs().indexOf(woodRoadId) === -1) {
-            context.enter(modeSelect(context, [woodRoadId]));
-        }
+    defineFeature('buildings', function isBuilding(entity) {
+        return (
+            !!entity.tags['building:part'] ||
+            (!!entity.tags.building && entity.tags.building !== 'no') ||
+            entity.tags.amenity === 'shelter' ||
+            entity.tags.parking === 'multi-storey' ||
+            entity.tags.parking === 'sheds' ||
+            entity.tags.parking === 'carports' ||
+            entity.tags.parking === 'garage_boxes'
+        );
+    }, 250);
 
-        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-        var box = pad$1(woodRoadDragEndpoint, padding, context);
-        reveal(box, t('intro.lines.start_drag_endpoint'));
+    defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
+        return geometry === 'area' &&
+            !_features.buildings.filter(entity) &&
+            !_features.water.filter(entity);
+    });
 
-        context.map().on('move.intro drawn.intro', function() {
-            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-                return continueTo(updateLine);
-            }
-            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadDragEndpoint, padding, context);
-            reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
+    defineFeature('boundaries', function isBoundary(entity) {
+        return !!entity.tags.boundary;
+    });
 
-            var entity = context.entity(woodRoadEndId);
-            if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
-                continueTo(finishDragEndpoint);
-            }
-        });
+    defineFeature('water', function isWater(entity) {
+        return (
+            !!entity.tags.waterway ||
+            entity.tags.natural === 'water' ||
+            entity.tags.natural === 'coastline' ||
+            entity.tags.natural === 'bay' ||
+            entity.tags.landuse === 'pond' ||
+            entity.tags.landuse === 'basin' ||
+            entity.tags.landuse === 'reservoir' ||
+            entity.tags.landuse === 'salt_pond'
+        );
+    });
+
+    defineFeature('rail', function isRail(entity) {
+        return (
+            !!entity.tags.railway ||
+            entity.tags.landuse === 'railway'
+        ) && !(
+            traffic_roads[entity.tags.highway] ||
+            service_roads[entity.tags.highway] ||
+            paths[entity.tags.highway]
+        );
+    });
+
+    defineFeature('power', function isPower(entity) {
+        return !!entity.tags.power;
+    });
+
+    // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
+    defineFeature('past_future', function isPastFuture(entity) {
+        if (
+            traffic_roads[entity.tags.highway] ||
+            service_roads[entity.tags.highway] ||
+            paths[entity.tags.highway]
+        ) { return false; }
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') {
-                // keep Wood Road selected so endpoint stays draggable..
-                context.enter(modeSelect(context, [woodRoadId]));
-            }
-        });
+        var strings = Object.keys(entity.tags);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+        for (var i = 0; i < strings.length; i++) {
+            var s = strings[i];
+            if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
         }
-    }
+        return false;
+    });
 
+    // Lines or areas that don't match another feature filter.
+    // IMPORTANT: The 'others' feature must be the last one defined,
+    //   so that code in getMatches can skip this test if `hasMatch = true`
+    defineFeature('others', function isOther(entity, resolver, geometry) {
+        return (geometry === 'line' || geometry === 'area');
+    });
 
-    function finishDragEndpoint() {
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return continueTo(updateLine);
-        }
 
-        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-        var box = pad$1(woodRoadDragEndpoint, padding, context);
-        reveal(box, t('intro.lines.finish_drag_endpoint'));
+    function features() {}
 
-        context.map().on('move.intro drawn.intro', function() {
-            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-                return continueTo(updateLine);
-            }
-            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadDragEndpoint, padding, context);
-            reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
 
-            var entity = context.entity(woodRoadEndId);
-            if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
-                continueTo(startDragEndpoint);
-            }
-        });
+    features.features = function() {
+        return _features;
+    };
 
-        context.on('enter.intro', function() {
-            continueTo(startDragMidpoint);
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    features.keys = function() {
+        return _keys;
+    };
 
 
-    function startDragMidpoint() {
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return continueTo(updateLine);
-        }
-        if (context.selectedIDs().indexOf(woodRoadId) === -1) {
-            context.enter(modeSelect(context, [woodRoadId]));
+    features.enabled = function(k) {
+        if (!arguments.length) {
+            return _keys.filter(function(k) { return _features[k].enabled; });
         }
+        return _features[k] && _features[k].enabled;
+    };
 
-        var padding = 80 * Math.pow(2, context.map().zoom() - 19);
-        var box = pad$1(woodRoadDragMidpoint, padding, context);
-        reveal(box, t('intro.lines.start_drag_midpoint'));
 
-        context.map().on('move.intro drawn.intro', function() {
-            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-                return continueTo(updateLine);
-            }
-            var padding = 80 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadDragMidpoint, padding, context);
-            reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
-        });
+    features.disabled = function(k) {
+        if (!arguments.length) {
+            return _keys.filter(function(k) { return !_features[k].enabled; });
+        }
+        return _features[k] && !_features[k].enabled;
+    };
 
-        context.history().on('change.intro', function(changed) {
-            if (changed.created().length === 1) {
-                continueTo(continueDragMidpoint);
-            }
-        });
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') {
-                // keep Wood Road selected so midpoint triangles are drawn..
-                context.enter(modeSelect(context, [woodRoadId]));
-            }
-        });
+    features.hidden = function(k) {
+        if (!arguments.length) {
+            return _keys.filter(function(k) { return _features[k].hidden(); });
+        }
+        return _features[k] && _features[k].hidden();
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+
+    features.autoHidden = function(k) {
+        if (!arguments.length) {
+            return _keys.filter(function(k) { return _features[k].autoHidden(); });
         }
-    }
+        return _features[k] && _features[k].autoHidden();
+    };
 
 
-    function continueDragMidpoint() {
-        if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-            return continueTo(updateLine);
+    features.enable = function(k) {
+        if (_features[k] && !_features[k].enabled) {
+            _features[k].enable();
+            update();
         }
+    };
 
-        var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-        var box = pad$1(woodRoadDragEndpoint, padding, context);
-        box.height += 400;
 
-        var advance = function() {
-            context.history().checkpoint('doneUpdateLine');
-            continueTo(deleteLines);
-        };
+    features.disable = function(k) {
+        if (_features[k] && _features[k].enabled) {
+            _features[k].disable();
+            update();
+        }
+    };
 
-        reveal(box, t('intro.lines.continue_drag_midpoint'),
-            { buttonText: t('intro.ok'), buttonCallback: advance }
-        );
 
-        context.map().on('move.intro drawn.intro', function() {
-            if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
-                return continueTo(updateLine);
-            }
-            var padding = 100 * Math.pow(2, context.map().zoom() - 19);
-            var box = pad$1(woodRoadDragEndpoint, padding, context);
-            box.height += 400;
-            reveal(box, t('intro.lines.continue_drag_midpoint'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
-            );
-        });
+    features.toggle = function(k) {
+        if (_features[k]) {
+            (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
+            update();
+        }
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
+
+    features.resetStats = function() {
+        for (var i = 0; i < _keys.length; i++) {
+            _features[_keys[i]].count = 0;
         }
-    }
+        dispatch$$1.call('change');
+    };
 
 
-    function deleteLines() {
-        context.history().reset('doneUpdateLine');
-        context.enter(modeBrowse(context));
+    features.gatherStats = function(d, resolver, dimensions) {
+        var needsRedraw = false,
+            type = groupBy(d, function(ent) { return ent.type; }),
+            entities = [].concat(type.relation || [], type.way || [], type.node || []),
+            currHidden, geometry, matches, i, j;
 
-        if (!context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return chapter.restart();
+        for (i = 0; i < _keys.length; i++) {
+            _features[_keys[i]].count = 0;
         }
 
-        var msec = transitionTime(deleteLinesLoc, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(18).centerEase(deleteLinesLoc, msec);
-
-        timeout(function() {
-            var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-            var box = pad$1(deleteLinesLoc, padding, context);
-            box.top -= 200;
-            box.height += 400;
-            var advance = function() { continueTo(rightClickIntersection); };
+        // adjust the threshold for point/building culling based on viewport size..
+        // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
+        _cullFactor = dimensions[0] * dimensions[1] / 1000000;
 
-            reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
-                { buttonText: t('intro.ok'), buttonCallback: advance }
-            );
+        for (i = 0; i < entities.length; i++) {
+            geometry = entities[i].geometry(resolver);
+            if (!(geometry === 'vertex' || geometry === 'relation')) {
+                matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
+                for (j = 0; j < matches.length; j++) {
+                    _features[matches[j]].count++;
+                }
+            }
+        }
 
-            context.map().on('move.intro drawn.intro', function() {
-                var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-                var box = pad$1(deleteLinesLoc, padding, context);
-                box.top -= 200;
-                box.height += 400;
-                reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
-                    { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
-                );
-            });
+        currHidden = features.hidden();
+        if (currHidden !== _hidden) {
+            _hidden = currHidden;
+            needsRedraw = true;
+            dispatch$$1.call('change');
+        }
 
-            context.history().on('change.intro', function() {
-                timeout(function() {
-                    continueTo(deleteLines);
-                }, 500);  // after any transition (e.g. if user deleted intersection)
-            });
+        return needsRedraw;
+    };
 
-        }, msec + 100);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
+    features.stats = function() {
+        for (var i = 0; i < _keys.length; i++) {
+            _stats[_keys[i]] = _features[_keys[i]].count;
         }
-    }
 
+        return _stats;
+    };
 
-    function rightClickIntersection() {
-        context.history().reset('doneUpdateLine');
-        context.enter(modeBrowse(context));
 
-        context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
+    features.clear = function(d) {
+        for (var i = 0; i < d.length; i++) {
+            features.clearEntity(d[i]);
+        }
+    };
 
-        timeout(function() {
-            var padding = 60 * Math.pow(2, context.map().zoom() - 18);
-            var box = pad$1(eleventhAvenueEnd, padding, context);
-            reveal(box, t('intro.lines.rightclick_intersection',
-                { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
-            );
 
-            context.map().on('move.intro drawn.intro', function() {
-                var padding = 60 * Math.pow(2, context.map().zoom() - 18);
-                var box = pad$1(eleventhAvenueEnd, padding, context);
-                reveal(box, t('intro.lines.rightclick_intersection',
-                    { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
-                    { duration: 0 }
-                );
-            });
+    features.clearEntity = function(entity) {
+        delete _cache[osmEntity.key(entity)];
+    };
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'select') return;
-                var ids = context.selectedIDs();
-                if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
 
-                timeout(function() {
-                    var node = selectMenuItem('split').node();
-                    if (!node) return;
-                    continueTo(splitIntersection);
-                }, 300);  // after menu visible
-            });
+    features.reset = function() {
+        _cache = {};
+    };
 
-            context.history().on('change.intro', function() {
-                timeout(function() {
-                    continueTo(deleteLines);
-                }, 300);  // after any transition (e.g. if user deleted intersection)
-            });
 
-        }, 600);
+    features.getMatches = function(entity, resolver, geometry) {
+        if (geometry === 'vertex' || geometry === 'relation') return {};
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
+        var ent = osmEntity.key(entity);
+        if (!_cache[ent]) {
+            _cache[ent] = {};
         }
-    }
-
 
-    function splitIntersection() {
-        if (!context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return continueTo(deleteLines);
-        }
+        if (!_cache[ent].matches) {
+            var matches = {},
+                hasMatch = false;
 
-        var node = selectMenuItem('split').node();
-        if (!node) { return continueTo(rightClickIntersection); }
+            for (var i = 0; i < _keys.length; i++) {
+                if (_keys[i] === 'others') {
+                    if (hasMatch) continue;
 
-        var wasChanged = false;
-        var menuCoords = context.map().mouseCoordinates();
-        washingtonSegmentId = null;
+                    // Multipolygon members:
+                    // If an entity...
+                    //   1. is a way that hasn't matched other 'interesting' feature rules,
+                    //   2. and it belongs to a single parent multipolygon relation
+                    // ...then match whatever feature rules the parent multipolygon has matched.
+                    // see #2548, #2887
+                    //
+                    // IMPORTANT:
+                    // For this to work, getMatches must be called on relations before ways.
+                    //
+                    if (entity.type === 'way') {
+                        var parents = features.getParents(entity, resolver, geometry);
+                        if (parents.length === 1 && parents[0].isMultipolygon()) {
+                            var pkey = osmEntity.key(parents[0]);
+                            if (_cache[pkey] && _cache[pkey].matches) {
+                                matches = clone(_cache[pkey].matches);
+                                continue;
+                            }
+                        }
+                    }
+                }
 
-        revealEditMenu(menuCoords, t('intro.lines.split_intersection',
-            { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
-        );
+                if (_features[_keys[i]].filter(entity, resolver, geometry)) {
+                    matches[_keys[i]] = hasMatch = true;
+                }
+            }
+            _cache[ent].matches = matches;
+        }
 
-        context.map().on('move.intro drawn.intro', function() {
-            var node = selectMenuItem('split').node();
-            if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
+        return _cache[ent].matches;
+    };
 
-            revealEditMenu(menuCoords, t('intro.lines.split_intersection',
-                { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
-                { duration: 0 }
-            );
-        });
 
-        context.history().on('change.intro', function(changed) {
-            wasChanged = true;
-            timeout(function() {
-                if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
-                    washingtonSegmentId = changed.created()[0].id;
-                    continueTo(didSplit);
-                } else {
-                    washingtonSegmentId = null;
-                    continueTo(retrySplit);
-                }
-            }, 300);  // after any transition (e.g. if user deleted intersection)
-        });
+    features.getParents = function(entity, resolver, geometry) {
+        if (geometry === 'point') return [];
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
+        var ent = osmEntity.key(entity);
+        if (!_cache[ent]) {
+            _cache[ent] = {};
         }
-    }
 
+        if (!_cache[ent].parents) {
+            var parents = [];
+            if (geometry === 'vertex') {
+                parents = resolver.parentWays(entity);
+            } else {   // 'line', 'area', 'relation'
+                parents = resolver.parentRelations(entity);
+            }
+            _cache[ent].parents = parents;
+        }
+        return _cache[ent].parents;
+    };
 
-    function retrySplit() {
-        context.enter(modeBrowse(context));
-        context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
-        var advance = function() { continueTo(rightClickIntersection); };
 
-        var padding = 60 * Math.pow(2, context.map().zoom() - 18);
-        var box = pad$1(eleventhAvenueEnd, padding, context);
-        reveal(box, t('intro.lines.retry_split'),
-            { buttonText: t('intro.ok'), buttonCallback: advance }
-        );
+    features.isHiddenFeature = function(entity, resolver, geometry) {
+        if (!_hidden.length) return false;
+        if (!entity.version) return false;
 
-        context.map().on('move.intro drawn.intro', function() {
-            var padding = 60 * Math.pow(2, context.map().zoom() - 18);
-            var box = pad$1(eleventhAvenueEnd, padding, context);
-            reveal(box, t('intro.lines.retry_split'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
-            );
-        });
+        var matches = features.getMatches(entity, resolver, geometry);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
+        for (var i = 0; i < _hidden.length; i++) {
+            if (matches[_hidden[i]]) return true;
         }
-    }
+        return false;
+    };
 
 
-    function didSplit() {
-        if (!washingtonSegmentId ||
-            !context.hasEntity(washingtonSegmentId) ||
-            !context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return continueTo(rightClickIntersection);
+    features.isHiddenChild = function(entity, resolver, geometry) {
+        if (!_hidden.length) return false;
+        if (!entity.version || geometry === 'point') return false;
+
+        var parents = features.getParents(entity, resolver, geometry);
+        if (!parents.length) return false;
+
+        for (var i = 0; i < parents.length; i++) {
+            if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
+                return false;
+            }
         }
+        return true;
+    };
 
-        var ids = context.selectedIDs();
-        var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
-        var street = t('intro.graph.name.washington-street');
 
-        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-        var box = pad$1(twelfthAvenue, padding, context);
-        box.width = box.width / 2;
-        reveal(box, t(string, { street1: street, street2: street }),
-            { duration: 500 }
-        );
+    features.hasHiddenConnections = function(entity, resolver) {
+        if (!_hidden.length) return false;
+        var childNodes, connections;
 
-        timeout(function() {
-            context.map().zoom(18).centerEase(twelfthAvenue, 500);
+        if (entity.type === 'midpoint') {
+            childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
+            connections = [];
+        } else {
+            childNodes = entity.nodes ? resolver.childNodes(entity) : [];
+            connections = features.getParents(entity, resolver, entity.geometry(resolver));
+        }
 
-            context.map().on('move.intro drawn.intro', function() {
-                var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-                var box = pad$1(twelfthAvenue, padding, context);
-                box.width = box.width / 2;
-                reveal(box, t(string, { street1: street, street2: street }),
-                    { duration: 0 }
-                );
-            });
-        }, 600);  // after initial reveal and curtain cut
+        // gather ways connected to child nodes..
+        connections = reduce(childNodes, function(result, e) {
+            return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
+        }, connections);
 
-        context.on('enter.intro', function() {
-            var ids = context.selectedIDs();
-            if (ids.length === 1 && ids[0] === washingtonSegmentId) {
-                continueTo(multiSelect);
-            }
-        });
+        return connections.length ? some(connections, function(e) {
+            return features.isHidden(e, resolver, e.geometry(resolver));
+        }) : false;
+    };
 
-        context.history().on('change.intro', function() {
-            if (!washingtonSegmentId ||
-                !context.hasEntity(washingtonSegmentId) ||
-                !context.hasEntity(washingtonStreetId) ||
-                !context.hasEntity(twelfthAvenueId) ||
-                !context.hasEntity(eleventhAvenueEndId)) {
-                return continueTo(rightClickIntersection);
-            }
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+    features.isHidden = function(entity, resolver, geometry) {
+        if (!_hidden.length) return false;
+        if (!entity.version) return false;
 
+        var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
+        return fn(entity, resolver, geometry);
+    };
 
-    function multiSelect() {
-        if (!washingtonSegmentId ||
-            !context.hasEntity(washingtonSegmentId) ||
-            !context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return continueTo(rightClickIntersection);
+
+    features.filter = function(d, resolver) {
+        if (!_hidden.length) return d;
+
+        var result = [];
+        for (var i = 0; i < d.length; i++) {
+            var entity = d[i];
+            if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
+                result.push(entity);
+            }
         }
+        return result;
+    };
 
-        var ids = context.selectedIDs();
-        var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
-        var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
 
-        if (hasWashington && hasTwelfth) {
-            return continueTo(multiRightClick);
-        } else if (!hasWashington && !hasTwelfth) {
-            return continueTo(didSplit);
+    features.init = function() {
+        var storage = context.storage('disabled-features');
+        if (storage) {
+            var storageDisabled = storage.replace(/;/g, ',').split(',');
+            storageDisabled.forEach(features.disable);
+        }
+        
+        var q = utilStringQs(window.location.hash.substring(1));
+        if (q.disable_features) {
+            var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
+            hashDisabled.forEach(features.disable);
         }
+    };
 
-        context.map().zoom(18).centerEase(twelfthAvenue, 500);
+    return utilRebind(features, dispatch$$1, 'on');
+}
 
-        timeout(function() {
-            var selected, other, padding, box;
-            if (hasWashington) {
-                selected = t('intro.graph.name.washington-street');
-                other = t('intro.graph.name.12th-avenue');
-                padding = 60 * Math.pow(2, context.map().zoom() - 18);
-                box = pad$1(twelfthAvenueEnd, padding, context);
-                box.width *= 3;
-            } else {
-                selected = t('intro.graph.name.12th-avenue');
-                other = t('intro.graph.name.washington-street');
-                padding = 200 * Math.pow(2, context.map().zoom() - 18);
-                box = pad$1(twelfthAvenue, padding, context);
-                box.width /= 2;
-            }
+function utilBindOnce(target, type, listener, capture) {
+    var typeOnce = type + '.once';
+    function one() {
+        target.on(typeOnce, null);
+        listener.apply(this, arguments);
+    }
+    target.on(typeOnce, one, capture);
+    return this;
+}
 
-            reveal(box,
-                t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
-            );
+function rendererMap(context) {
 
-            context.map().on('move.intro drawn.intro', function() {
-                if (hasWashington) {
-                    selected = t('intro.graph.name.washington-street');
-                    other = t('intro.graph.name.12th-avenue');
-                    padding = 60 * Math.pow(2, context.map().zoom() - 18);
-                    box = pad$1(twelfthAvenueEnd, padding, context);
-                    box.width *= 3;
-                } else {
-                    selected = t('intro.graph.name.12th-avenue');
-                    other = t('intro.graph.name.washington-street');
-                    padding = 200 * Math.pow(2, context.map().zoom() - 18);
-                    box = pad$1(twelfthAvenue, padding, context);
-                    box.width /= 2;
-                }
+    var dimensions = [1, 1],
+        dispatch$$1 = dispatch('move', 'drawn'),
+        projection = context.projection,
+        curtainProjection = context.curtainProjection,
+        dblclickEnabled = true,
+        redrawEnabled = true,
+        transformStart = projection.transform(),
+        transformLast,
+        transformed = false,
+        minzoom = 0,
+        drawLayers = svgLayers(projection, context),
+        drawPoints = svgPoints(projection, context),
+        drawVertices = svgVertices(projection, context),
+        drawLines = svgLines(projection, context),
+        drawAreas = svgAreas(projection, context),
+        drawMidpoints = svgMidpoints(projection, context),
+        drawLabels = svgLabels(projection, context),
+        supersurface = d3_select(null),
+        wrapper = d3_select(null),
+        surface = d3_select(null),
+        mouse,
+        mousemove;
 
-                reveal(box,
-                    t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
-                    { duration: 0 }
-                );
-            });
+    var zoom$$1 = d3_zoom()
+        .scaleExtent([ztok(2), ztok(24)])
+        .interpolate(d3_interpolate)
+        .filter(zoomEventFilter)
+        .on('zoom', zoomPan);
 
-            context.on('enter.intro', function() {
-                continueTo(multiSelect);
-            });
+    var _selection = d3_select(null);
 
-            context.history().on('change.intro', function() {
-                if (!washingtonSegmentId ||
-                    !context.hasEntity(washingtonSegmentId) ||
-                    !context.hasEntity(washingtonStreetId) ||
-                    !context.hasEntity(twelfthAvenueId) ||
-                    !context.hasEntity(eleventhAvenueEndId)) {
-                    return continueTo(rightClickIntersection);
-                }
-            });
-        }, 600);
+    var scheduleRedraw = throttle(redraw, 750);
+    // var isRedrawScheduled = false;
+    // var pendingRedrawCall;
+    // function scheduleRedraw() {
+    //     // Only schedule the redraw if one has not already been set.
+    //     if (isRedrawScheduled) return;
+    //     isRedrawScheduled = true;
+    //     var that = this;
+    //     var args = arguments;
+    //     pendingRedrawCall = window.requestIdleCallback(function () {
+    //         // Reset the boolean so future redraws can be set.
+    //         isRedrawScheduled = false;
+    //         redraw.apply(that, args);
+    //     }, { timeout: 1400 });
+    // }
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
+    function cancelPendingRedraw() {
+        scheduleRedraw.cancel();
+        // isRedrawScheduled = false;
+        // window.cancelIdleCallback(pendingRedrawCall);
     }
 
+    function map(selection) {
 
-    function multiRightClick() {
-        if (!washingtonSegmentId ||
-            !context.hasEntity(washingtonSegmentId) ||
-            !context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return continueTo(rightClickIntersection);
-        }
+        _selection = selection;
 
-        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-        var box = pad$1(twelfthAvenue, padding, context);
-        reveal(box, t('intro.lines.multi_rightclick'));
+        context
+            .on('change.map', immediateRedraw);
 
-        context.map().on('move.intro drawn.intro', function() {
-            var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-            var box = pad$1(twelfthAvenue, padding, context);
-            reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
-        });
+        var osm = context.connection();
+        if (osm) {
+            osm.on('change.map', immediateRedraw);
+        }
 
-        d3_select(window).on('click.intro contextmenu.intro', function() {
-            timeout(function() {
-                var ids = context.selectedIDs();
-                if (ids.length === 2 &&
-                    ids.indexOf(twelfthAvenueId) !== -1 &&
-                    ids.indexOf(washingtonSegmentId) !== -1) {
-                        var node = selectMenuItem('delete').node();
-                        if (!node) return;
-                        continueTo(multiDelete);
-                } else if (ids.length === 1 &&
-                    ids.indexOf(washingtonSegmentId) !== -1) {
-                    return continueTo(multiSelect);
-                } else {
-                    return continueTo(didSplit);
+        context.history()
+            .on('change.map', immediateRedraw)
+            .on('undone.map redone.map', function(stack) {
+                var mode = context.mode().id;
+                if (mode !== 'browse' && mode !== 'select') return;
+
+                var followSelected = false;
+                if (Array.isArray(stack.selectedIDs)) {
+                    followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
+                    context.enter(
+                        modeSelect(context, stack.selectedIDs).follow(followSelected)
+                    );
                 }
-            }, 300);  // after edit menu visible
-        }, true);
+                if (!followSelected && stack.transform) {
+                    map.transformEase(stack.transform);
+                }
+            });
 
-        context.history().on('change.intro', function() {
-            if (!washingtonSegmentId ||
-                !context.hasEntity(washingtonSegmentId) ||
-                !context.hasEntity(washingtonStreetId) ||
-                !context.hasEntity(twelfthAvenueId) ||
-                !context.hasEntity(eleventhAvenueEndId)) {
-                return continueTo(rightClickIntersection);
-            }
-        });
+        context.background()
+            .on('change.map', immediateRedraw);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            d3_select(window).on('click.intro contextmenu.intro', null, true);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        context.features()
+            .on('redraw.map', immediateRedraw);
 
+        drawLayers
+            .on('change.map', function() {
+                context.background().updateImagery();
+                immediateRedraw();
+            });
 
-    function multiDelete() {
-        if (!washingtonSegmentId ||
-            !context.hasEntity(washingtonSegmentId) ||
-            !context.hasEntity(washingtonStreetId) ||
-            !context.hasEntity(twelfthAvenueId) ||
-            !context.hasEntity(eleventhAvenueEndId)) {
-            return continueTo(rightClickIntersection);
-        }
+        selection
+            .on('dblclick.map', dblClick)
+            .call(zoom$$1)
+            .call(zoom$$1.transform, projection.transform());
 
-        var node = selectMenuItem('delete').node();
-        if (!node) return continueTo(multiRightClick);
+        supersurface = selection.append('div')
+            .attr('id', 'supersurface')
+            .call(utilSetTransform, 0, 0);
 
-        var menuCoords = context.map().mouseCoordinates();
-        revealEditMenu(menuCoords,
-            t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
-        );
+        // Need a wrapper div because Opera can't cope with an absolutely positioned
+        // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
+        wrapper = supersurface
+            .append('div')
+            .attr('class', 'layer layer-data');
 
-        context.map().on('move.intro drawn.intro', function() {
-            revealEditMenu(menuCoords,
-                t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
-                { duration: 0 }
-            );
-        });
+        map.surface = surface = wrapper
+            .call(drawLayers)
+            .selectAll('.surface')
+            .attr('id', 'surface');
 
-        context.on('exit.intro', function() {
-            if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
-                return continueTo(multiSelect);  // left select mode but roads still exist
-            }
-        });
+        surface
+            .call(drawLabels.observe)
+            .on('mousedown.zoom', function() {
+                if (event.button === 2) {
+                    event.stopPropagation();
+                }
+            }, true)
+            .on('mouseup.zoom', function() {
+                if (resetTransform()) immediateRedraw();
+            })
+            .on('mousemove.map', function() {
+                mousemove = event;
+            })
+            .on('mouseover.vertices', function() {
+                if (map.editable() && !transformed) {
+                    var hover = event.target.__data__;
+                    surface.selectAll('.data-layer-osm')
+                        .call(drawVertices.drawHover, context.graph(), hover, map.extent());
+                    dispatch$$1.call('drawn', this, { full: false });
+                }
+            })
+            .on('mouseout.vertices', function() {
+                if (map.editable() && !transformed) {
+                    var hover = event.relatedTarget && event.relatedTarget.__data__;
+                    surface.selectAll('.data-layer-osm')
+                        .call(drawVertices.drawHover, context.graph(), hover, map.extent());
+                    dispatch$$1.call('drawn', this, { full: false });
+                }
+            });
 
-        context.history().on('change.intro', function() {
-            if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
-                continueTo(retryDelete);         // changed something but roads still exist
-            } else {
-                continueTo(play);
-            }
-        });
+        supersurface
+            .call(context.background());
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('exit.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+        context.on('enter.map',  function() {
+            if (map.editable() && !transformed) {
+
+                // redraw immediately any objects affected by a change in selectedIDs.
+                var graph = context.graph();
+                var selectedAndParents = {};
+                context.selectedIDs().forEach(function(id) {
+                    var entity = graph.hasEntity(id);
+                    if (entity) {
+                        selectedAndParents[entity.id] = entity;
+                        if (entity.type === 'node') {
+                            graph.parentWays(entity).forEach(function(parent) {
+                                selectedAndParents[parent.id] = parent;
+                            });
+                        }
+                    }
+                });
+                var data = values$1(selectedAndParents);
+                var filter = function(d) { return d.id in selectedAndParents; };
 
+                data = context.features().filter(data, graph);
 
-    function retryDelete() {
-        context.enter(modeBrowse(context));
+                surface.selectAll('.data-layer-osm')
+                    .call(drawVertices.drawSelected, graph, map.extent())
+                    .call(drawLines, graph, data, filter)
+                    .call(drawAreas, graph, data, filter)
+                    .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
 
-        var padding = 200 * Math.pow(2, context.map().zoom() - 18);
-        var box = pad$1(twelfthAvenue, padding, context);
-        reveal(box, t('intro.lines.retry_delete'), {
-            buttonText: t('intro.ok'),
-            buttonCallback: function() { continueTo(multiSelect); }
+                dispatch$$1.call('drawn', this, { full: false });
+
+
+                // redraw everything else later
+                scheduleRedraw();
+            }
         });
 
-        function continueTo(nextStep) {
-            nextStep();
-        }
+        map.dimensions(utilGetDimensions(selection));
     }
 
 
-    function play() {
-        dispatch$$1.call('done');
-        reveal('#id-container',
-            t('intro.lines.play', { next: t('intro.buildings.title') }), {
-                tooltipBox: '.intro-nav-wrap .chapter-building',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { reveal('#id-container'); }
+    function zoomEventFilter() {
+        // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
+        // Intercept `mousedown` and check if there is an orphaned zoom gesture.
+        // This can happen if a previous `mousedown` occurred without a `mouseup`.
+        // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
+        // so that d3-zoom won't stop propagation of new `mousedown` events.
+        if (event.type === 'mousedown') {
+            var hasOrphan = false;
+            var listeners = window.__on;
+            for (var i = 0; i < listeners.length; i++) {
+                var listener = listeners[i];
+                if (listener.name === 'zoom' && listener.type === 'mouseup') {
+                    hasOrphan = true;
+                    break;
+                }
             }
-        );
-   }
+            if (hasOrphan) {
+                var event$$1 = window.CustomEvent;
+                if (event$$1) {
+                    event$$1 = new event$$1('mouseup');
+                } else {
+                    event$$1 = window.document.createEvent('Event');
+                    event$$1.initEvent('mouseup', false, false);
+                }
+                // Event needs to be dispatched with an event.view property.
+                event$$1.view = window;
+                window.dispatchEvent(event$$1);
+            }
+        }
 
+        return event.button !== 2;   // ignore right clicks
+    }
 
-    chapter.enter = function() {
-        addLine();
-    };
 
+    function ztok(z) {
+        return 256 * Math.pow(2, z);
+    }
 
-    chapter.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        d3_select(window).on('mousedown.intro', null, true);
-        context.on('enter.intro exit.intro', null);
-        context.map().on('move.intro drawn.intro', null);
-        context.history().on('change.intro', null);
-        d3_select('.inspector-wrap').on('wheel.intro', null);
-        d3_select('.preset-list-button').on('click.intro', null);
-    };
+    function ktoz(k) {
+        return Math.max(Math.log(k) / Math.LN2 - 8, 0);
+    }
 
+    function pxCenter() {
+        return [dimensions[0] / 2, dimensions[1] / 2];
+    }
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
-    };
 
+    function drawVector(difference, extent) {
+        var mode = context.mode();
+        var graph = context.graph();
+        var features = context.features();
+        var all = context.intersects(map.extent());
+        var fullRedraw = false;
+        var data;
+        var filter;
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
+        if (difference) {
+            var complete = difference.complete(map.extent());
+            data = compact(values$1(complete));
+            filter = function(d) { return d.id in complete; };
+            features.clear(data);
 
-function uiIntroBuilding(context, reveal) {
-    var dispatch$$1 = dispatch('done'),
-        house = [-85.62815, 41.95638],
-        tank = [-85.62732, 41.95347],
-        buildingCatetory = context.presets().item('category-building'),
-        housePreset = context.presets().item('building/house'),
-        tankPreset = context.presets().item('man_made/storage_tank'),
-        timeouts = [],
-        houseId = null,
-        tankId = null;
+        } else {
+            // force a full redraw if gatherStats detects that a feature
+            // should be auto-hidden (e.g. points or buildings)..
+            if (features.gatherStats(all, graph, dimensions)) {
+                extent = undefined;
+            }
 
+            if (extent) {
+                data = context.intersects(map.extent().intersection(extent));
+                var set$$1 = set$2(map$4(data, 'id'));
+                filter = function(d) { return set$$1.has(d.id); };
 
-    var chapter = {
-        title: 'intro.buildings.title'
-    };
+            } else {
+                data = all;
+                fullRedraw = true;
+                filter = utilFunctor(true);
+            }
+        }
 
+        data = features.filter(data, graph);
 
-    function timeout(f, t$$1) {
-        timeouts.push(window.setTimeout(f, t$$1));
-    }
+        if (mode && mode.id === 'select') {
+            // update selected vertices - the user might have just double-clicked a way,
+            // creating a new vertex, triggering a partial redraw without a mode change
+            surface.selectAll('.data-layer-osm')
+                .call(drawVertices.drawSelected, graph, map.extent());
+        }
 
+        surface.selectAll('.data-layer-osm')
+            .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
+            .call(drawLines, graph, data, filter)
+            .call(drawAreas, graph, data, filter)
+            .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
+            .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
+            .call(drawPoints, graph, data, filter);
 
-    function eventCancel() {
-        event.stopPropagation();
-        event.preventDefault();
+        dispatch$$1.call('drawn', this, {full: true});
     }
 
 
-    function revealHouse(center, text, options) {
-        var padding = 160 * Math.pow(2, context.map().zoom() - 20);
-        var box = pad$1(center, padding, context);
-        reveal(box, text, options);
-    }
+    function editOff() {
+        context.features().resetStats();
+        surface.selectAll('.layer-osm *').remove();
 
+        var mode = context.mode();
+        if (mode && mode.id !== 'save') {
+            context.enter(modeBrowse(context));
+        }
 
-    function revealTank(center, text, options) {
-        var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
-        var box = pad$1(center, padding, context);
-        reveal(box, text, options);
+        dispatch$$1.call('drawn', this, {full: true});
     }
 
 
-    function revealEditMenu(loc, text, options) {
-        var rect = context.surfaceRect();
-        var point = context.curtainProjection(loc);
-        var pad = 40;
-        var width = 250 + (2 * pad);
-        var height = 350;
-        var startX = rect.left + point[0];
-        var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
-        var box = {
-            left: left,
-            top: point[1] + rect.top - 60,
-            width: width,
-            height: height
-        };
-        reveal(box, text, options);
+    function dblClick() {
+        if (!dblclickEnabled) {
+            event.preventDefault();
+            event.stopImmediatePropagation();
+        }
     }
 
 
-    function addHouse() {
-        context.enter(modeBrowse(context));
-        context.history().reset('initial');
-        houseId = null;
-
-        var msec = transitionTime(house, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19).centerEase(house, msec);
-
-        timeout(function() {
-            var tooltip = reveal('button.add-area',
-                t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
-
-            tooltip.selectAll('.tooltip-inner')
-                .insert('svg', 'span')
-                .attr('class', 'tooltip-illustration')
-                .append('use')
-                .attr('xlink:href', '#building-images');
-
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'add-area') return;
-                continueTo(startHouse);
-            });
-        }, msec + 100);
+    function zoomPan(manualEvent) {
+        var event$$1 = (manualEvent || event);
+        var source = event$$1.sourceEvent;
+        var eventTransform = event$$1.transform;
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
+        if (transformStart.x === eventTransform.x &&
+            transformStart.y === eventTransform.y &&
+            transformStart.k === eventTransform.k) {
+            return;  // no change
         }
-    }
 
+        // Normalize mousewheel - #3029
+        // If wheel delta is provided in LINE units, recalculate it in PIXEL units
+        // We are essentially redoing the calculations that occur here:
+        //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
+        // See this for more info:
+        //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
+        if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
+            // pick sensible scroll amount if user scrolling fast or slow..
+            var lines = Math.abs(source.deltaY);
+            var scroll = lines > 2 ? 40 : lines * 10;
+
+            var t0 = transformed ? transformLast : transformStart;
+            var p0 = mouse(source);
+            var p1 = t0.invert(p0);
+            var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
+            var x2 = p0[0] - p1[0] * k2;
+            var y2 = p0[1] - p1[1] * k2;
 
-    function startHouse() {
-        if (context.mode().id !== 'add-area') {
-            return continueTo(addHouse);
+            eventTransform = identity$7.translate(x2,y2).scale(k2);
+            _selection.node().__zoom = eventTransform;
         }
 
-        houseId = null;
-        context.map().zoomEase(20, 500);
+        if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
+            surface.interrupt();
+            uiFlash().text(t('cannot_zoom'))();
+            setZoom(context.minEditableZoom(), true);
+            scheduleRedraw();
+            dispatch$$1.call('move', this, map);
+            return;
+        }
 
-        timeout(function() {
-            revealHouse(house, t('intro.buildings.start_building'));
+        projection.transform(eventTransform);
 
-            context.map().on('move.intro drawn.intro', function() {
-                revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
-            });
+        var scale = eventTransform.k / transformStart.k;
+        var tX = (eventTransform.x / scale - transformStart.x) * scale;
+        var tY = (eventTransform.y / scale - transformStart.y) * scale;
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'draw-area') return chapter.restart();
-                continueTo(continueHouse);
+        if (context.inIntro()) {
+            curtainProjection.transform({
+                x: eventTransform.x - tX,
+                y: eventTransform.y - tY,
+                k: eventTransform.k
             });
+        }
 
-        }, 550);  // after easing
+        if (source) mousemove = event$$1;
+        transformed = true;
+        transformLast = eventTransform;
+        utilSetTransform(supersurface, tX, tY, scale);
+        scheduleRedraw();
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
+        dispatch$$1.call('move', this, map);
     }
 
 
-    function continueHouse() {
-        if (context.mode().id !== 'draw-area') {
-            return continueTo(addHouse);
+    function resetTransform() {
+        if (!transformed) return false;
+
+        // deprecation warning - Radial Menu to be removed in iD v3
+        surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
+        utilSetTransform(supersurface, 0, 0);
+        transformed = false;
+        if (context.inIntro()) {
+            curtainProjection.transform(projection.transform());
         }
+        return true;
+    }
 
-        houseId = null;
 
-        revealHouse(house, t('intro.buildings.continue_building'));
+    function redraw(difference, extent) {
+        if (surface.empty() || !redrawEnabled) return;
 
-        context.map().on('move.intro drawn.intro', function() {
-            revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
-        });
+        // If we are in the middle of a zoom/pan, we can't do differenced redraws.
+        // It would result in artifacts where differenced entities are redrawn with
+        // one transform and unchanged entities with another.
+        if (resetTransform()) {
+            difference = extent = undefined;
+        }
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-area') {
-                return;
-            } else if (mode.id === 'select') {
-                var graph = context.graph(),
-                    way = context.entity(context.selectedIDs()[0]),
-                    nodes = graph.childNodes(way),
-                    points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
+        var z = String(~~map.zoom());
+        if (surface.attr('data-zoom') !== z) {
+            surface.attr('data-zoom', z)
+                .classed('low-zoom', z <= 16);
+        }
 
-                if (isMostlySquare(points)) {
-                    houseId = way.id;
-                    return continueTo(chooseCategoryBuilding);
-                } else {
-                    return continueTo(retryHouse);
-                }
+        if (!difference) {
+            supersurface.call(context.background());
+        }
 
-            } else {
-                return chapter.restart();
-            }
-        });
+        wrapper
+            .call(drawLayers);
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+        // OSM
+        if (map.editable()) {
+            context.loadTiles(projection, dimensions);
+            drawVector(difference, extent);
+        } else {
+            editOff();
         }
+
+        transformStart = projection.transform();
+
+        return map;
     }
 
 
-    function retryHouse() {
-        var onClick = function() { continueTo(addHouse); };
 
-        revealHouse(house, t('intro.buildings.retry_building'),
-            { buttonText: t('intro.ok'), buttonCallback: onClick }
-        );
+    var immediateRedraw = function(difference, extent) {
+        if (!difference && !extent) cancelPendingRedraw();
+        redraw(difference, extent);
+    };
 
-        context.map().on('move.intro drawn.intro', function() {
-            revealHouse(house, t('intro.buildings.retry_building'),
-                { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
-            );
-        });
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            nextStep();
-        }
+    function pointLocation(p) {
+        var translate = projection.translate(),
+            scale = projection.scale() * 2 * Math.PI;
+        return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
     }
 
 
-    function chooseCategoryBuilding() {
-        if (!houseId || !context.hasEntity(houseId)) {
-            return addHouse();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
-            context.enter(modeSelect(context, [houseId]));
+    function locationPoint(l) {
+        var translate = projection.translate(),
+            scale = projection.scale() * 2 * Math.PI;
+        return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
+    }
+
+
+    map.mouse = function() {
+        var event$$1 = mousemove || event;
+        if (event$$1) {
+            var s;
+            while ((s = event$$1.sourceEvent)) { event$$1 = s; }
+            return mouse(event$$1);
         }
+        return null;
+    };
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
 
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+    // returns Lng/Lat
+    map.mouseCoordinates = function() {
+        var coord = map.mouse() || pxCenter();
+        return projection.invert(coord);
+    };
 
-            var button = d3_select('.preset-category-building .preset-list-button');
 
-            reveal(button.node(),
-                t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
-            );
+    map.dblclickEnable = function(_) {
+        if (!arguments.length) return dblclickEnabled;
+        dblclickEnabled = _;
+        return map;
+    };
 
-            button.on('click.intro', function() {
-                button.on('click.intro', null);
-                continueTo(choosePresetHouse);
-            });
 
-        }, 400);  // after preset list pane visible..
+    map.redrawEnable = function(_) {
+        if (!arguments.length) return redrawEnabled;
+        redrawEnabled = _;
+        return map;
+    };
 
 
-        context.on('enter.intro', function(mode) {
-            if (!houseId || !context.hasEntity(houseId)) {
-                return continueTo(addHouse);
-            }
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
-                return continueTo(chooseCategoryBuilding);
-            }
-        });
+    function setTransform(t2, duration, force) {
+        var t$$1 = projection.transform();
+        if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
+            return false;
+        }
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.preset-list-button').on('click.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+        if (duration) {
+            _selection
+                .transition()
+                .duration(duration)
+                .on('start', function() { map.startEase(); })
+                .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
+        } else {
+            projection.transform(t2);
+            transformStart = t2;
+            _selection.call(zoom$$1.transform, transformStart);
         }
     }
 
 
-    function choosePresetHouse() {
-        if (!houseId || !context.hasEntity(houseId)) {
-            return addHouse();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
-            context.enter(modeSelect(context, [houseId]));
+    function setZoom(z2, force, duration) {
+        if (z2 === map.zoom() && !force) {
+            return false;
         }
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
+        var k = projection.scale(),
+            k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
+            center = pxCenter(),
+            l = pointLocation(center);
 
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
+        projection.scale(k2);
 
-            var button = d3_select('.preset-building-house .preset-list-button');
+        var t$$1 = projection.translate();
+        l = locationPoint(l);
 
-            reveal(button.node(),
-                t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
-                { duration: 300 }
-            );
+        t$$1[0] += center[0] - l[0];
+        t$$1[1] += center[1] - l[1];
 
-            button.on('click.intro', function() {
-                button.on('click.intro', null);
-                continueTo(closeEditorHouse);
-            });
+        if (duration) {
+            projection.scale(k);  // reset scale
+            _selection
+                .transition()
+                .duration(duration)
+                .on('start', function() { map.startEase(); })
+                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
+        } else {
+            projection.translate(t$$1);
+            transformStart = projection.transform();
+            _selection.call(zoom$$1.transform, transformStart);
+        }
 
+        return true;
+    }
 
-        }, 400);  // after preset list pane visible..
 
-        context.on('enter.intro', function(mode) {
-            if (!houseId || !context.hasEntity(houseId)) {
-                return continueTo(addHouse);
-            }
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
-                return continueTo(chooseCategoryBuilding);
-            }
-        });
+    function setCenter(loc2, duration) {
+        var c = map.center();
+        if (loc2[0] === c[0] && loc2[1] === c[1]) {
+            return false;
+        }
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            d3_select('.preset-list-button').on('click.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
+        var t$$1 = projection.translate(),
+            k = projection.scale(),
+            pxC = pxCenter(),
+            ll = projection(loc2);
+
+        t$$1[0] = t$$1[0] - ll[0] + pxC[0];
+        t$$1[1] = t$$1[1] - ll[1] + pxC[1];
+
+        if (duration) {
+            _selection
+                .transition()
+                .duration(duration)
+                .on('start', function() { map.startEase(); })
+                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
+        } else {
+            projection.translate(t$$1);
+            transformStart = projection.transform();
+            _selection.call(zoom$$1.transform, transformStart);
         }
+
+        return true;
     }
 
 
-    function closeEditorHouse() {
-        if (!houseId || !context.hasEntity(houseId)) {
-            return addHouse();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
-            context.enter(modeSelect(context, [houseId]));
+    map.pan = function(delta, duration) {
+        var t$$1 = projection.translate(),
+            k = projection.scale();
+
+        t$$1[0] += delta[0];
+        t$$1[1] += delta[1];
+
+        if (duration) {
+            _selection
+                .transition()
+                .duration(duration)
+                .on('start', function() { map.startEase(); })
+                .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
+        } else {
+            projection.translate(t$$1);
+            transformStart = projection.transform();
+            _selection.call(zoom$$1.transform, transformStart);
+            dispatch$$1.call('move', this, map);
+            immediateRedraw();
         }
 
-        context.history().checkpoint('hasHouse');
+        return map;
+    };
 
-        context.on('exit.intro', function() {
-            continueTo(rightClickHouse);
-        });
 
-        timeout(function() {
-            reveal('.entity-editor-pane',
-                t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
-            );
-        }, 500);
+    map.dimensions = function(_) {
+        if (!arguments.length) return dimensions;
+        var center = map.center();
+        dimensions = _;
+        drawLayers.dimensions(dimensions);
+        context.background().dimensions(dimensions);
+        projection.clipExtent([[0, 0], dimensions]);
+        mouse = utilFastMouse(supersurface.node());
+        setCenter(center);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
+        scheduleRedraw();
+        return map;
+    };
+
+
+    function zoomIn(delta) {
+        setZoom(~~map.zoom() + delta, true, 250);
     }
 
+    function zoomOut(delta) {
+        setZoom(~~map.zoom() - delta, true, 250);
+    }
 
-    function rightClickHouse() {
-        if (!houseId) return chapter.restart();
+    map.zoomIn = function() { zoomIn(1); };
+    map.zoomInFurther = function() { zoomIn(4); };
 
-        context.enter(modeBrowse(context));
-        context.history().reset('hasHouse');
-        context.map().centerEase(house, 500);
+    map.zoomOut = function() { zoomOut(1); };
+    map.zoomOutFurther = function() { zoomOut(4); };
 
-        timeout(function() {
-            if (context.map().zoom() < 20) {
-                context.map().zoomEase(20, 500);
-            }
-        }, 520);
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id !== 'select') return;
-            var ids = context.selectedIDs();
-            if (ids.length !== 1 || ids[0] !== houseId) return;
+    map.center = function(loc2) {
+        if (!arguments.length) {
+            return projection.invert(pxCenter());
+        }
 
-            timeout(function() {
-                var node = selectMenuItem('orthogonalize').node();
-                if (!node) return;
-                continueTo(clickSquare);
-            }, 300);  // after menu visible
-        });
+        if (setCenter(loc2)) {
+            dispatch$$1.call('move', this, map);
+        }
 
-        context.map().on('move.intro drawn.intro', function() {
-            revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
-        });
+        scheduleRedraw();
+        return map;
+    };
 
-        context.history().on('change.intro', function() {
-            continueTo(rightClickHouse);
-        });
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
+    map.zoom = function(z2) {
+        if (!arguments.length) {
+            return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
         }
-    }
 
+        if (z2 < minzoom) {
+            surface.interrupt();
+            uiFlash().text(t('cannot_zoom'))();
+            z2 = context.minEditableZoom();
+        }
 
-    function clickSquare() {
-        if (!houseId) return chapter.restart();
-        var entity = context.hasEntity(houseId);
-        if (!entity) return continueTo(rightClickHouse);
+        if (setZoom(z2)) {
+            dispatch$$1.call('move', this, map);
+        }
 
-        var node = selectMenuItem('orthogonalize').node();
-        if (!node) { return continueTo(rightClickHouse); }
+        scheduleRedraw();
+        return map;
+    };
 
-        var wasChanged = false;
-        var menuCoords = context.map().mouseCoordinates();
 
-        revealEditMenu(menuCoords,
-            t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
-        );
+    map.zoomTo = function(entity, zoomLimits) {
+        var extent = entity.extent(context.graph());
+        if (!isFinite(extent.area())) return;
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'browse') {
-                continueTo(rightClickHouse);
-            } else if (mode.id === 'move' || mode.id === 'rotate') {
-                continueTo(retryClickSquare);
-            }
-        });
+        var z2 = map.trimmedExtentZoom(extent);
+        zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
+        map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
+    };
 
-        context.map().on('move.intro drawn.intro', function() {
-            var node = selectMenuItem('orthogonalize').node();
-            if (!wasChanged && !node) { return continueTo(rightClickHouse); }
 
-            revealEditMenu(menuCoords,
-                t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
-                { duration: 0 }
-            );
-        });
+    map.centerZoom = function(loc2, z2) {
+        var centered = setCenter(loc2),
+            zoomed   = setZoom(z2);
 
-        context.history().on('change.intro', function() {
-            wasChanged = true;
-            context.history().on('change.intro', null);
+        if (centered || zoomed) {
+            dispatch$$1.call('move', this, map);
+        }
 
-            // Something changed.  Wait for transition to complete and check undo annotation.
-            timeout(function() {
-                if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
-                    continueTo(doneSquare);
-                } else {
-                    continueTo(retryClickSquare);
-                }
-            }, 500);  // after transitioned actions
-        });
+        scheduleRedraw();
+        return map;
+    };
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+
+    map.centerEase = function(loc2, duration) {
+        duration = duration || 250;
+        setCenter(loc2, duration);
+        return map;
+    };
 
 
-    function retryClickSquare() {
-        context.enter(modeBrowse(context));
+    map.zoomEase = function(z2, duration) {
+        duration = duration || 250;
+        setZoom(z2, false, duration);
+        return map;
+    };
 
-        revealHouse(house, t('intro.buildings.retry_square'), {
-            buttonText: t('intro.ok'),
-            buttonCallback: function() { continueTo(rightClickHouse); }
-        });
 
-        function continueTo(nextStep) {
-            nextStep();
-        }
-    }
+    map.transformEase = function(t2, duration) {
+        duration = duration || 250;
+        setTransform(t2, duration, false);
+        return map;
+    };
+
+
+    map.startEase = function() {
+        utilBindOnce(surface, 'mousedown.ease', function() {
+            map.cancelEase();
+        });
+        return map;
+    };
 
 
-    function doneSquare() {
-        context.history().checkpoint('doneSquare');
+    map.cancelEase = function() {
+        _selection.interrupt();
+        return map;
+    };
 
-        revealHouse(house, t('intro.buildings.done_square'), {
-            buttonText: t('intro.ok'),
-            buttonCallback: function() { continueTo(addTank); }
-        });
 
-        function continueTo(nextStep) {
-            nextStep();
+    map.extent = function(_) {
+        if (!arguments.length) {
+            return new geoExtent(projection.invert([0, dimensions[1]]),
+                                 projection.invert([dimensions[0], 0]));
+        } else {
+            var extent = geoExtent(_);
+            map.centerZoom(extent.center(), map.extentZoom(extent));
         }
-    }
+    };
 
 
-    function addTank() {
-        context.enter(modeBrowse(context));
-        context.history().reset('doneSquare');
-        tankId = null;
+    map.trimmedExtent = function(_) {
+        if (!arguments.length) {
+            var headerY = 60, footerY = 30, pad = 10;
+            return new geoExtent(projection.invert([pad, dimensions[1] - footerY - pad]),
+                                 projection.invert([dimensions[0] - pad, headerY + pad]));
+        } else {
+            var extent = geoExtent(_);
+            map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
+        }
+    };
 
-        var msec = transitionTime(tank, context.map().center());
-        if (msec) { reveal(null, null, { duration: 0 }); }
-        context.map().zoom(19.5).centerEase(tank, msec);
 
-        timeout(function() {
-            reveal('button.add-area',
-                t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
-            );
+    function calcZoom(extent, dim) {
+        var tl = projection([extent[0][0], extent[1][1]]),
+            br = projection([extent[1][0], extent[0][1]]);
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'add-area') return;
-                continueTo(startTank);
-            });
-        }, msec + 100);
+        // Calculate maximum zoom that fits extent
+        var hFactor = (br[0] - tl[0]) / dim[0],
+            vFactor = (br[1] - tl[1]) / dim[1],
+            hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
+            vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
+            newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            nextStep();
-        }
+        return newZoom;
     }
 
 
-    function startTank() {
-        if (context.mode().id !== 'add-area') {
-            return continueTo(addTank);
-        }
+    map.extentZoom = function(_) {
+        return calcZoom(geoExtent(_), dimensions);
+    };
 
-        tankId = null;
 
-        timeout(function() {
-            revealTank(tank, t('intro.buildings.start_tank'));
+    map.trimmedExtentZoom = function(_) {
+        var trimY = 120, trimX = 40,
+            trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
+        return calcZoom(geoExtent(_), trimmed);
+    };
 
-            context.map().on('move.intro drawn.intro', function() {
-                revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
-            });
 
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'draw-area') return chapter.restart();
-                continueTo(continueTank);
-            });
+    map.editable = function() {
+        var osmLayer = surface.selectAll('.data-layer-osm');
+        if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
 
-        }, 550);  // after easing
+        return map.zoom() >= context.minEditableZoom();
+    };
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
 
+    map.minzoom = function(_) {
+        if (!arguments.length) return minzoom;
+        minzoom = _;
+        return map;
+    };
 
-    function continueTank() {
-        if (context.mode().id !== 'draw-area') {
-            return continueTo(addTank);
-        }
 
-        tankId = null;
+    map.layers = drawLayers;
 
-        revealTank(tank, t('intro.buildings.continue_tank'));
 
-        context.map().on('move.intro drawn.intro', function() {
-            revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
-        });
+    return utilRebind(map, dispatch$$1, 'on');
+}
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'draw-area') {
-                return;
-            } else if (mode.id === 'select') {
-                tankId = context.selectedIDs()[0];
-                return continueTo(searchPresetTank);
-            } else {
-                return continueTo(addTank);
-            }
-        });
+function uiMapInMap(context) {
 
-        function continueTo(nextStep) {
-            context.map().on('move.intro drawn.intro', null);
-            context.on('enter.intro', null);
-            nextStep();
-        }
-    }
+    function map_in_map(selection) {
+        var backgroundLayer = rendererTileLayer(context);
+        var overlayLayers = {};
+        var projection = geoRawMercator();
+        var gpxLayer = svgGpx(projection, context).showLabels(false);
+        var debugLayer = svgDebug(projection, context);
+        var zoom$$1 = d3_zoom()
+            .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
+            .on('start', zoomStarted)
+            .on('zoom', zoomed)
+            .on('end', zoomEnded);
+        var isTransformed = false;
+        var isHidden = true;
+        var skipEvents = false;
+        var gesture = null;
+        var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
+        var wrap = d3_select(null);
+        var tiles = d3_select(null);
+        var viewport = d3_select(null);
+        var tStart;    // transform at start of gesture
+        var tCurr;     // transform at most recent event
+        var timeoutId;
 
 
-    function searchPresetTank() {
-        if (!tankId || !context.hasEntity(tankId)) {
-            return addTank();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
-            context.enter(modeSelect(context, [tankId]));
+        function zoomStarted() {
+            if (skipEvents) return;
+            tStart = tCurr = projection.transform();
+            gesture = null;
         }
 
-        // disallow scrolling
-        d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
-
-        timeout(function() {
-            // reset pane, in case user somehow happened to change it..
-            d3_select('.inspector-wrap .panewrap').style('right', '-100%');
 
-            d3_select('.preset-search-input')
-                .on('keydown.intro', null)
-                .on('keyup.intro', checkPresetSearch);
+        function zoomed() {
+            if (skipEvents) return;
 
-            reveal('.preset-search-input',
-                t('intro.buildings.search_tank', { preset: tankPreset.name() })
-            );
-        }, 400);  // after preset list pane visible..
+            var x = event.transform.x;
+            var y = event.transform.y;
+            var k = event.transform.k;
+            var isZooming = (k !== tStart.k);
+            var isPanning = (x !== tStart.x || y !== tStart.y);
 
-        context.on('enter.intro', function(mode) {
-            if (!tankId || !context.hasEntity(tankId)) {
-                return continueTo(addTank);
+            if (!isZooming && !isPanning) {
+                return;  // no change
             }
 
-            var ids = context.selectedIDs();
-            if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
-                // keep the user's area selected..
-                context.enter(modeSelect(context, [tankId]));
-
-                // reset pane, in case user somehow happened to change it..
-                d3_select('.inspector-wrap .panewrap').style('right', '-100%');
-                // disallow scrolling
-                d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
-
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', null)
-                    .on('keyup.intro', checkPresetSearch);
+            // lock in either zooming or panning, don't allow both in minimap.
+            if (!gesture) {
+                gesture = isZooming ? 'zoom' : 'pan';
+            }
 
-                reveal('.preset-search-input',
-                    t('intro.buildings.search_tank', { preset: tankPreset.name() })
-                );
+            var tMini = projection.transform();
+            var tX, tY, scale;
 
-                context.history().on('change.intro', null);
+            if (gesture === 'zoom') {
+                var dMini = utilGetDimensions(wrap);
+                var cMini = geoVecScale(dMini, 0.5);
+                scale = k / tMini.k;
+                tX = (cMini[0] / scale - cMini[0]) * scale;
+                tY = (cMini[1] / scale - cMini[1]) * scale;
+            } else {
+                k = tMini.k;
+                scale = 1;
+                tX = x - tMini.x;
+                tY = y - tMini.y;
             }
-        });
 
-        function checkPresetSearch() {
-            var first = d3_select('.preset-list-item:first-child');
+            utilSetTransform(tiles, tX, tY, scale);
+            utilSetTransform(viewport, 0, 0, scale);
+            isTransformed = true;
+            tCurr = identity$7.translate(x, y).scale(k);
 
-            if (first.classed('preset-man_made-storage_tank')) {
-                reveal(first.select('.preset-list-button').node(),
-                    t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
-                    { duration: 300 }
-                );
+            var zMain = geoScaleToZoom(context.projection.scale());
+            var zMini = geoScaleToZoom(k);
 
-                d3_select('.preset-search-input')
-                    .on('keydown.intro', eventCancel, true)
-                    .on('keyup.intro', null);
+            zDiff = zMain - zMini;
 
-                context.history().on('change.intro', function() {
-                    continueTo(closeEditorTank);
-                });
-            }
+            queueRedraw();
         }
 
-        function continueTo(nextStep) {
-            d3_select('.inspector-wrap').on('wheel.intro', null);
-            context.on('enter.intro', null);
-            context.history().on('change.intro', null);
-            d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-            nextStep();
-        }
-    }
 
+        function zoomEnded() {
+            if (skipEvents) return;
+            if (gesture !== 'pan') return;
 
-    function closeEditorTank() {
-        if (!tankId || !context.hasEntity(tankId)) {
-            return addTank();
-        }
-        var ids = context.selectedIDs();
-        if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
-            context.enter(modeSelect(context, [tankId]));
+            updateProjection();
+            gesture = null;
+            var dMini = utilGetDimensions(wrap);
+            var cMini = geoVecScale(dMini, 0.5);
+            context.map().center(projection.invert(cMini));   // recenter main map..
         }
 
-        context.history().checkpoint('hasTank');
 
-        context.on('exit.intro', function() {
-            continueTo(rightClickTank);
-        });
+        function updateProjection() {
+            var loc = context.map().center();
+            var dMini = utilGetDimensions(wrap);
+            var cMini = geoVecScale(dMini, 0.5);
+            var tMain = context.projection.transform();
+            var zMain = geoScaleToZoom(tMain.k);
+            var zMini = Math.max(zMain - zDiff, 0.5);
+            var kMini = geoZoomToScale(zMini);
 
-        timeout(function() {
-            reveal('.entity-editor-pane',
-                t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
-            );
-        }, 500);
+            projection
+                .translate([tMain.x, tMain.y])
+                .scale(kMini);
 
-        function continueTo(nextStep) {
-            context.on('exit.intro', null);
-            nextStep();
-        }
-    }
+            var point = projection(loc);
+            var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
+            var xMini = cMini[0] - point[0] + tMain.x + mouse[0];
+            var yMini = cMini[1] - point[1] + tMain.y + mouse[1];
 
+            projection
+                .translate([xMini, yMini])
+                .clipExtent([[0, 0], dMini]);
 
-    function rightClickTank() {
-        if (!tankId) return continueTo(addTank);
+            tCurr = projection.transform();
 
-        context.enter(modeBrowse(context));
-        context.history().reset('hasTank');
-        context.map().centerEase(tank, 500);
+            if (isTransformed) {
+                utilSetTransform(tiles, 0, 0);
+                utilSetTransform(viewport, 0, 0);
+                isTransformed = false;
+            }
 
-        timeout(function() {
-            context.on('enter.intro', function(mode) {
-                if (mode.id !== 'select') return;
-                var ids = context.selectedIDs();
-                if (ids.length !== 1 || ids[0] !== tankId) return;
+            zoom$$1
+                .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
 
-                timeout(function() {
-                    var node = selectMenuItem('circularize').node();
-                    if (!node) return;
-                    continueTo(clickCircle);
-                }, 300);  // after menu visible
-            });
+            skipEvents = true;
+            wrap.call(zoom$$1.transform, tCurr);
+            skipEvents = false;
+        }
 
-            revealTank(tank, t('intro.buildings.rightclick_tank'));
 
-            context.map().on('move.intro drawn.intro', function() {
-                revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
-            });
+        function redraw() {
+            clearTimeout(timeoutId);
+            if (isHidden) return;
 
-            context.history().on('change.intro', function() {
-                continueTo(rightClickTank);
-            });
+            updateProjection();
 
-        }, 600);
+            var dMini = utilGetDimensions(wrap);
+            var zMini = geoScaleToZoom(projection.scale());
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+            // setup tile container
+            tiles = wrap
+                .selectAll('.map-in-map-tiles')
+                .data([0]);
 
+            tiles = tiles.enter()
+                .append('div')
+                .attr('class', 'map-in-map-tiles')
+                .merge(tiles);
 
-    function clickCircle() {
-        if (!tankId) return chapter.restart();
-        var entity = context.hasEntity(tankId);
-        if (!entity) return continueTo(rightClickTank);
+            // redraw background
+            backgroundLayer
+                .source(context.background().baseLayerSource())
+                .projection(projection)
+                .dimensions(dMini);
 
-        var node = selectMenuItem('circularize').node();
-        if (!node) { return continueTo(rightClickTank); }
+            var background = tiles
+                .selectAll('.map-in-map-background')
+                .data([0]);
 
-        var wasChanged = false;
-        var menuCoords = context.map().mouseCoordinates();
+            background.enter()
+                .append('div')
+                .attr('class', 'map-in-map-background')
+                .merge(background)
+                .call(backgroundLayer);
 
-        revealEditMenu(menuCoords,
-            t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
-        );
 
-        context.on('enter.intro', function(mode) {
-            if (mode.id === 'browse') {
-                continueTo(rightClickTank);
-            } else if (mode.id === 'move' || mode.id === 'rotate') {
-                continueTo(retryClickCircle);
+            // redraw overlay
+            var overlaySources = context.background().overlayLayerSources();
+            var activeOverlayLayers = [];
+            for (var i = 0; i < overlaySources.length; i++) {
+                if (overlaySources[i].validZoom(zMini)) {
+                    if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
+                    activeOverlayLayers.push(overlayLayers[i]
+                        .source(overlaySources[i])
+                        .projection(projection)
+                        .dimensions(dMini));
+                }
             }
-        });
-
-        context.map().on('move.intro drawn.intro', function() {
-            var node = selectMenuItem('circularize').node();
-            if (!wasChanged && !node) { return continueTo(rightClickTank); }
 
-            revealEditMenu(menuCoords,
-                t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
-                { duration: 0 }
-            );
-        });
+            var overlay = tiles
+                .selectAll('.map-in-map-overlay')
+                .data([0]);
 
-        context.history().on('change.intro', function() {
-            wasChanged = true;
-            context.history().on('change.intro', null);
+            overlay = overlay.enter()
+                .append('div')
+                .attr('class', 'map-in-map-overlay')
+                .merge(overlay);
 
-            // Something changed.  Wait for transition to complete and check undo annotation.
-            timeout(function() {
-                if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
-                    continueTo(play);
-                } else {
-                    continueTo(retryClickCircle);
-                }
-            }, 500);  // after transitioned actions
-        });
 
-        function continueTo(nextStep) {
-            context.on('enter.intro', null);
-            context.map().on('move.intro drawn.intro', null);
-            context.history().on('change.intro', null);
-            nextStep();
-        }
-    }
+            var overlays = overlay
+                .selectAll('div')
+                .data(activeOverlayLayers, function(d) { return d.source().name(); });
 
+            overlays.exit()
+                .remove();
 
-    function retryClickCircle() {
-        context.enter(modeBrowse(context));
+            overlays = overlays.enter()
+                .append('div')
+                .merge(overlays)
+                .each(function(layer) { d3_select(this).call(layer); });
 
-        revealTank(tank, t('intro.buildings.retry_circle'), {
-            buttonText: t('intro.ok'),
-            buttonCallback: function() { continueTo(rightClickTank); }
-        });
 
-        function continueTo(nextStep) {
-            nextStep();
-        }
-    }
+            var dataLayers = tiles
+                .selectAll('.map-in-map-data')
+                .data([0]);
 
+            dataLayers.exit()
+                .remove();
 
-    function play() {
-        dispatch$$1.call('done');
-        reveal('#id-container',
-            t('intro.buildings.play', { next: t('intro.startediting.title') }), {
-                tooltipBox: '.intro-nav-wrap .chapter-startEditing',
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { reveal('#id-container'); }
-            }
-        );
-    }
+            dataLayers = dataLayers.enter()
+                .append('svg')
+                .attr('class', 'map-in-map-data')
+                .merge(dataLayers)
+                .call(gpxLayer)
+                .call(debugLayer);
 
 
-    chapter.enter = function() {
-        addHouse();
-    };
+            // redraw viewport bounding box
+            if (gesture !== 'pan') {
+                var getPath = d3_geoPath(projection);
+                var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
 
+                viewport = wrap.selectAll('.map-in-map-viewport')
+                    .data([0]);
 
-    chapter.exit = function() {
-        timeouts.forEach(window.clearTimeout);
-        context.on('enter.intro exit.intro', null);
-        context.map().on('move.intro drawn.intro', null);
-        context.history().on('change.intro', null);
-        d3_select('.inspector-wrap').on('wheel.intro', null);
-        d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
-        d3_select('.more-fields .combobox-input').on('click.intro', null);
-    };
+                viewport = viewport.enter()
+                    .append('svg')
+                    .attr('class', 'map-in-map-viewport')
+                    .merge(viewport);
 
 
-    chapter.restart = function() {
-        chapter.exit();
-        chapter.enter();
-    };
+                var path = viewport.selectAll('.map-in-map-bbox')
+                    .data([bbox]);
 
+                path.enter()
+                    .append('path')
+                    .attr('class', 'map-in-map-bbox')
+                    .merge(path)
+                    .attr('d', getPath)
+                    .classed('thick', function(d) { return getPath.area(d) < 30; });
+            }
+        }
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
 
-function uiIntroStartEditing(context, reveal) {
-    var dispatch$$1 = dispatch('done', 'startEditing'),
-        modalSelection = d3_select(null);
+        function queueRedraw() {
+            clearTimeout(timeoutId);
+            timeoutId = setTimeout(function() { redraw(); }, 750);
+        }
 
 
-    var chapter = {
-        title: 'intro.startediting.title'
-    };
+        function toggle() {
+            if (event) event.preventDefault();
 
-    function showHelp() {
-        reveal('.map-control.help-control',
-            t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { shortcuts(); }
-            }
-        );
-    }
+            isHidden = !isHidden;
 
-    function shortcuts() {
-        reveal('.map-control.help-control',
-            t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { showSave(); }
-            }
-        );
-    }
+            d3_select('.minimap-toggle-item')
+                .classed('active', !isHidden)
+                .select('input')
+                .property('checked', !isHidden);
 
-    function showSave() {
-        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
-        reveal('#bar button.save',
-            t('intro.startediting.save'), {
-                buttonText: t('intro.ok'),
-                buttonCallback: function() { showStart(); }
+            if (isHidden) {
+                wrap
+                    .style('display', 'block')
+                    .style('opacity', '1')
+                    .transition()
+                    .duration(200)
+                    .style('opacity', '0')
+                    .on('end', function() {
+                        selection.selectAll('.map-in-map')
+                            .style('display', 'none');
+                    });
+            } else {
+                wrap
+                    .style('display', 'block')
+                    .style('opacity', '0')
+                    .transition()
+                    .duration(200)
+                    .style('opacity', '1')
+                    .on('end', function() {
+                        redraw();
+                    });
             }
-        );
-    }
+        }
 
-    function showStart() {
-        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
 
-        modalSelection = uiModal(context.container());
+        uiMapInMap.toggle = toggle;
 
-        modalSelection.select('.modal')
-            .attr('class', 'modal-splash modal col6');
+        wrap = selection.selectAll('.map-in-map')
+            .data([0]);
 
-        modalSelection.selectAll('.close').remove();
+        wrap = wrap.enter()
+            .append('div')
+            .attr('class', 'map-in-map')
+            .style('display', (isHidden ? 'none' : 'block'))
+            .call(zoom$$1)
+            .on('dblclick.zoom', null)
+            .merge(wrap);
 
-        var startbutton = modalSelection.select('.content')
-            .attr('class', 'fillL')
-            .append('button')
-                .attr('class', 'modal-section huge-modal-button')
-                .on('click', function() {
-                    modalSelection.remove();
-                });
+        context.map()
+            .on('drawn.map-in-map', function(drawn) {
+                if (drawn.full === true) {
+                    redraw();
+                }
+            });
 
-            startbutton
-                .append('svg')
-                .attr('class', 'illustration')
-                .append('use')
-                .attr('xlink:href', '#logo-walkthrough');
+        redraw();
 
-            startbutton
-                .append('h2')
-                .text(t('intro.startediting.start'));
+        var keybinding = d3keybinding('map-in-map')
+            .on(t('background.minimap.key'), toggle);
 
-        dispatch$$1.call('startEditing');
+        d3_select(document)
+            .call(keybinding);
     }
 
+    return map_in_map;
+}
 
-    chapter.enter = function() {
-        showHelp();
-    };
-
+function uiBackground(context) {
+    var key = t('background.key');
 
-    chapter.exit = function() {
-        modalSelection.remove();
-        d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
-    };
+    var _customSource = context.background().findSource('custom');
+    var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
+    var _shown = false;
 
+    var _backgroundList = d3_select(null);
+    var _overlayList = d3_select(null);
+    var _displayOptionsContainer = d3_select(null);
+    var _offsetContainer = d3_select(null);
 
-    return utilRebind(chapter, dispatch$$1, 'on');
-}
+    var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
+    var backgroundOffset = uiBackgroundOffset(context);
 
-var chapterUi = {
-    welcome: uiIntroWelcome,
-    navigation: uiIntroNavigation,
-    point: uiIntroPoint,
-    area: uiIntroArea,
-    line: uiIntroLine,
-    building: uiIntroBuilding,
-    startEditing: uiIntroStartEditing
-};
 
-var chapterFlow = [
-    'welcome',
-    'navigation',
-    'point',
-    'area',
-    'line',
-    'building',
-    'startEditing'
-];
+    function setTooltips(selection) {
+        selection.each(function(d, i, nodes) {
+            var item = d3_select(this).select('label');
+            var span = item.select('span');
+            var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
+            var description = d.description();
+            var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
 
+            if (d === _previousBackground) {
+                item.call(tooltip()
+                    .placement(placement)
+                    .html(true)
+                    .title(function() {
+                        var tip = '<div>' + t('background.switch') + '</div>';
+                        return uiTooltipHtml(tip, uiCmd('⌘' + key));
+                    })
+                );
+            } else if (description || isOverflowing) {
+                item.call(tooltip()
+                    .placement(placement)
+                    .title(description || d.name())
+                );
+            } else {
+                item.call(tooltip().destroy);
+            }
+        });
+    }
 
-function uiIntro(context) {
-    var introGraph = {},
-        currChapter;
 
+    function updateLayerSelections(selection) {
+        function active(d) {
+            return context.background().showsLayer(d);
+        }
 
-    // create entities for intro graph and localize names
-    for (var id in dataIntroGraph) {
-        introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
+        selection.selectAll('.layer')
+            .classed('active', active)
+            .classed('switch', function(d) { return d === _previousBackground; })
+            .call(setTooltips)
+            .selectAll('input')
+            .property('checked', active);
     }
 
 
-    function intro(selection) {
-        context.enter(modeBrowse(context));
+    function chooseBackground(d) {
+        if (d.id === 'custom' && !d.template()) {
+            return editCustom();
+        }
 
-        // Save current map state
-        var osm = context.connection(),
-            history = context.history().toJSON(),
-            hash = window.location.hash,
-            center = context.map().center(),
-            zoom = context.map().zoom(),
-            background = context.background().baseLayerSource(),
-            overlays = context.background().overlayLayerSources(),
-            opacity = d3_selectAll('#map .layer-background').style('opacity'),
-            loadedTiles = osm && osm.loadedTiles(),
-            baseEntities = context.history().graph().base().entities,
-            countryCode = services.geocoder.countryCode;
+        event.preventDefault();
+        _previousBackground = context.background().baseLayerSource();
+        context.storage('background-last-used-toggle', _previousBackground.id);
+        context.storage('background-last-used', d.id);
+        context.background().baseLayerSource(d);
+        _backgroundList.call(updateLayerSelections);
+        document.activeElement.blur();
+    }
 
-        // Block saving
-        context.inIntro(true);
 
-        // Load semi-real data used in intro
-        if (osm) { osm.toggle(false).reset(); }
-        context.history().reset();
-        context.history().merge(values$1(coreGraph().load(introGraph).entities));
-        context.history().checkpoint('initial');
+    function editCustom() {
+        event.preventDefault();
+        var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
+        var template = window.prompt(
+            t('background.custom_prompt', { example: example }),
+            _customSource.template() || example
+        );
 
-        var esri = context.background().findSource('EsriWorldImagery');
-        if (esri) {
-            context.background().baseLayerSource(esri);
+        if (template) {
+            context.storage('background-custom-template', template);
+            _customSource.template(template);
+            chooseBackground(_customSource);
         } else {
-            context.background().bing();
+            _backgroundList.call(updateLayerSelections);
         }
-        overlays.forEach(function (d) {
-            context.background().toggleOverlayLayer(d);
-        });
-
-        // Mock geocoder
-        services.geocoder.countryCode = function(location, callback) {
-            callback(null, t('intro.graph.countrycode'));
-        };
-
-        d3_selectAll('#map .layer-background').style('opacity', 1);
-
-        var curtain = uiCurtain();
-        selection.call(curtain);
-
-        // store that the user started the walkthrough..
-        context.storage('walkthrough_started', 'yes');
-
-        // restore previous walkthrough progress..
-        var storedProgress = context.storage('walkthrough_progress') || '';
-        var progress = storedProgress.split(';').filter(Boolean);
-
-        var chapters = chapterFlow.map(function(chapter, i) {
-            var s = chapterUi[chapter](context, curtain.reveal)
-                .on('done', function() {
-                    context.presets().init();  // clear away "recent" presets
+    }
 
-                    buttons.filter(function(d) {
-                        return d.title === s.title;
-                    }).classed('finished', true);
 
-                    if (i < chapterFlow.length - 1) {
-                        var next = chapterFlow[i + 1];
-                        d3_select('button.chapter-' + next)
-                            .classed('next', true);
-                    }
+    function chooseOverlay(d) {
+        event.preventDefault();
+        context.background().toggleOverlayLayer(d);
+        _overlayList.call(updateLayerSelections);
+        document.activeElement.blur();
+    }
 
-                    // store walkthrough progress..
-                    progress.push(chapter);
-                    context.storage('walkthrough_progress', uniq(progress).join(';'));
-                });
-            return s;
-        });
 
-        chapters[chapters.length - 1].on('startEditing', function() {
-            // store walkthrough progress..
-            progress.push('startEditing');
-            context.storage('walkthrough_progress', uniq(progress).join(';'));
+    function drawListItems(layerList, type, change, filter) {
+        var sources = context.background()
+            .sources(context.map().extent())
+            .filter(filter);
 
-            // store if walkthrough is completed..
-            var incomplete = difference(chapterFlow, progress);
-            if (!incomplete.length) {
-                context.storage('walkthrough_completed', 'yes');
-            }
+        var layerLinks = layerList.selectAll('li.layer')
+            .data(sources, function(d) { return d.name(); });
 
-            curtain.remove();
-            navwrap.remove();
-            d3_selectAll('#map .layer-background').style('opacity', opacity);
-            if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
-            context.history().reset().merge(values$1(baseEntities));
-            context.background().baseLayerSource(background);
-            overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
-            if (history) { context.history().fromJSON(history, false); }
-            context.map().centerZoom(center, zoom);
-            window.location.replace(hash);
-            services.geocoder.countryCode = countryCode;
-            context.inIntro(false);
-        });
+        layerLinks.exit()
+            .remove();
 
-        var navwrap = selection
-            .append('div')
-            .attr('class', 'intro-nav-wrap fillD');
+        var enter = layerLinks.enter()
+            .append('li')
+            .attr('class', 'layer')
+            .classed('layer-custom', function(d) { return d.id === 'custom'; })
+            .classed('best', function(d) { return d.best(); });
 
-        navwrap
-            .append('svg')
-            .attr('class', 'intro-nav-wrap-logo')
-            .append('use')
-            .attr('xlink:href', '#logo-walkthrough');
+        enter.filter(function(d) { return d.id === 'custom'; })
+            .append('button')
+            .attr('class', 'layer-browse')
+            .call(tooltip()
+                .title(t('background.custom_button'))
+                .placement((textDirection === 'rtl') ? 'right' : 'left')
+            )
+            .on('click', editCustom)
+            .call(svgIcon('#icon-search'));
 
-        var buttonwrap = navwrap
+        enter.filter(function(d) { return d.best(); })
             .append('div')
-            .attr('class', 'joined')
-            .selectAll('button.chapter');
+            .attr('class', 'best')
+            .call(tooltip()
+                .title(t('background.best_imagery'))
+                .placement((textDirection === 'rtl') ? 'right' : 'left')
+            )
+            .append('span')
+            .html('&#9733;');
 
-        var buttons = buttonwrap
-            .data(chapters)
-            .enter()
-            .append('button')
-            .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
-            .on('click', enterChapter);
+        var label = enter
+            .append('label');
 
-        buttons
-            .append('span')
-            .text(function(d) { return t(d.title); });
+        label
+            .append('input')
+            .attr('type', type)
+            .attr('name', 'layers')
+            .on('change', change);
 
-        buttons
+        label
             .append('span')
-            .attr('class', 'status')
-            .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
+            .text(function(d) { return d.name(); });
 
-        enterChapter(chapters[0]);
 
+        layerList.selectAll('li.layer')
+            .sort(sortSources)
+            .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
 
-        function enterChapter(newChapter) {
-            if (currChapter) { currChapter.exit(); }
-            context.enter(modeBrowse(context));
+        layerList
+            .call(updateLayerSelections);
 
-            currChapter = newChapter;
-            currChapter.enter();
 
-            buttons
-                .classed('next', false)
-                .classed('active', function(d) {
-                    return d.title === currChapter.title;
-                });
+        function sortSources(a, b) {
+            return a.best() && !b.best() ? -1
+                : b.best() && !a.best() ? 1
+                : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
         }
     }
 
 
-    return intro;
-}
+    function renderBackgroundList(selection) {
 
-function uiShortcuts() {
-    var detected = utilDetect();
-    var activeTab = 0;
-    var modalSelection;
-    var savedSelection;
+        // the background list
+        var container = selection.selectAll('.layer-background-list')
+            .data([0]);
 
+        _backgroundList = container.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-background-list')
+            .attr('dir', 'auto')
+            .merge(container);
 
-    var keybinding = d3keybinding('shortcuts')
-        .on(t('shortcuts.toggle.key'), function () {
-            if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
-                if (modalSelection) {
-                    modalSelection.close();
-                    modalSelection = null;
-                }
-            } else {
-                modalSelection = uiModal(savedSelection);
-                shortcutsModal(modalSelection);
-            }
-        });
 
-    d3_select(document)
-        .call(keybinding);
+        // add minimap toggle below list
+        var minimapEnter = selection.selectAll('.minimap-toggle-list')
+            .data([0])
+            .enter()
+            .append('ul')
+            .attr('class', 'layer-list minimap-toggle-list')
+            .append('li')
+            .attr('class', 'layer minimap-toggle-item');
 
+        var minimapLabelEnter = minimapEnter
+            .append('label')
+            .call(tooltip()
+                .html(true)
+                .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
+                .placement('top')
+            );
 
+        minimapLabelEnter
+            .append('input')
+            .attr('type', 'checkbox')
+            .on('change', function() {
+                event.preventDefault();
+                uiMapInMap.toggle();
+            });
 
-    function shortcutsModal(modalSelection) {
-        modalSelection.select('.modal')
-            .classed('modal-shortcuts', true);
+        minimapLabelEnter
+            .append('span')
+            .text(t('background.minimap.description'));
 
-        var shortcutsModal = modalSelection.select('.content');
 
-        shortcutsModal
+        // "Info / Report a Problem" link
+        selection.selectAll('.imagery-faq')
+            .data([0])
+            .enter()
             .append('div')
-            .attr('class', 'modal-section')
-            .append('h3')
-            .text(t('shortcuts.title'));
-
-        shortcutsModal
-            .call(render);
+            .attr('class', 'imagery-faq')
+            .append('a')
+            .attr('target', '_blank')
+            .attr('tabindex', -1)
+            .call(svgIcon('#icon-out-link', 'inline'))
+            .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
+            .append('span')
+            .text(t('background.imagery_source_faq'));
     }
 
 
-    function render(selection) {
-        var wrapper = selection
-            .selectAll('.wrapper')
+    function renderOverlayList(selection) {
+        var container = selection.selectAll('.layer-overlay-list')
             .data([0]);
 
-        var wrapperEnter = wrapper
-            .enter()
-            .append('div')
-            .attr('class', 'wrapper modal-section');
+        _overlayList = container.enter()
+            .append('ul')
+            .attr('class', 'layer-list layer-overlay-list')
+            .attr('dir', 'auto')
+            .merge(container);
+    }
 
-        var tabsBar = wrapperEnter
-            .append('div')
-            .attr('class', 'tabs-bar');
 
-        var shortcutsList = wrapperEnter
-            .append('div')
-            .attr('class', 'shortcuts-list');
+    function update() {
+        _backgroundList
+            .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
 
-        wrapper = wrapper.merge(wrapperEnter);
+        _overlayList
+            .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
 
-        var tabs = tabsBar
-            .selectAll('.tab')
-            .data(dataShortcuts);
+        _displayOptionsContainer
+            .call(backgroundDisplayOptions);
 
-        var tabsEnter = tabs
-            .enter()
-            .append('div')
-            .attr('class', 'tab')
-            .on('click', function (d, i) {
-                activeTab = i;
-                render(selection);
-            });
+        _offsetContainer
+            .call(backgroundOffset);
+    }
 
-        tabsEnter
-            .append('span')
-            .text(function (d) { return t(d.text); });
 
-        tabs = tabs
-            .merge(tabsEnter);
+    function quickSwitch() {
+        if (event) {
+            event.stopImmediatePropagation();
+            event.preventDefault();
+        }
+        if (_previousBackground) {
+            chooseBackground(_previousBackground);
+        }
+    }
 
-        // Update
-        wrapper.selectAll('.tab')
-            .classed('active', function (d, i) {
-                return i === activeTab;
-            });
 
+    function background(selection) {
 
-        var shortcuts = shortcutsList
-            .selectAll('.shortcut-tab')
-            .data(dataShortcuts);
+        function hidePane() {
+            setVisible(false);
+        }
 
-        var shortcutsEnter = shortcuts
-            .enter()
+        function togglePane() {
+            if (event) event.preventDefault();
+            paneTooltip.hide(button);
+            setVisible(!button.classed('active'));
+        }
+
+        function setVisible(show) {
+            if (show !== _shown) {
+                button.classed('active', show);
+                _shown = show;
+
+                if (show) {
+                    uiMapData.hidePane();
+                    uiHelp.hidePane();
+                    update();
+
+                    pane
+                        .style('display', 'block')
+                        .style('right', '-300px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '0px');
+
+                } else {
+                    pane
+                        .style('display', 'block')
+                        .style('right', '0px')
+                        .transition()
+                        .duration(200)
+                        .style('right', '-300px')
+                        .on('end', function() {
+                            d3_select(this).style('display', 'none');
+                        });
+                }
+            }
+        }
+
+
+        var pane = selection
             .append('div')
-            .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
+            .attr('class', 'fillL map-overlay col3 content hide');
 
-        var columnsEnter = shortcutsEnter
-            .selectAll('.shortcut-column')
-            .data(function (d) { return d.columns; })
-            .enter()
-            .append('table')
-            .attr('class', 'shortcut-column');
+        var paneTooltip = tooltip()
+            .placement((textDirection === 'rtl') ? 'right' : 'left')
+            .html(true)
+            .title(uiTooltipHtml(t('background.description'), key));
 
-        var rowsEnter = columnsEnter
-            .selectAll('.shortcut-row')
-            .data(function (d) { return d.rows; })
-            .enter()
-            .append('tr')
-            .attr('class', 'shortcut-row');
+        var button = selection
+            .append('button')
+            .attr('tabindex', -1)
+            .on('click', togglePane)
+            .call(svgIcon('#icon-layers', 'light'))
+            .call(paneTooltip);
 
+        pane
+            .append('h2')
+            .text(t('background.title'));
 
-        var sectionRows = rowsEnter
-            .filter(function (d) { return !d.shortcuts; });
+        // background list
+        pane
+            .append('div')
+            .attr('class', 'background-background-list-container')
+            .call(uiDisclosure(context, 'background_list', true)
+                .title(t('background.backgrounds'))
+                .content(renderBackgroundList)
+            );
 
-        sectionRows
-            .append('td');
+        // overlay list
+        pane
+            .append('div')
+            .attr('class', 'background-overlay-list-container')
+            .call(uiDisclosure(context, 'overlay_list', true)
+                .title(t('background.overlays'))
+                .content(renderOverlayList)
+            );
 
-        sectionRows
-            .append('td')
-            .attr('class', 'shortcut-section')
-            .append('h3')
-            .text(function (d) { return t(d.text); });
+        // display options
+        _displayOptionsContainer = pane
+            .append('div')
+            .attr('class', 'background-display-options');
 
+        // offset controls
+        _offsetContainer = pane
+            .append('div')
+            .attr('class', 'background-offset');
 
-        var shortcutRows = rowsEnter
-            .filter(function (d) { return d.shortcuts; });
 
-        var shortcutKeys = shortcutRows
-            .append('td')
-            .attr('class', 'shortcut-keys');
+        // add listeners
+        context.map()
+            .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
 
-        var modifierKeys = shortcutKeys
-            .filter(function (d) { return d.modifiers; });
+        context.background()
+            .on('change.background-update', update);
 
-        modifierKeys
-            .selectAll('kbd.modifier')
-            .data(function (d) {
-                if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
-                    return ['⌘'];
-                } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
-                    return [];
-                } else {
-                    return d.modifiers;
-                }
-            })
-            .enter()
-            .each(function () {
-                var selection = d3_select(this);
 
-                selection
-                    .append('kbd')
-                    .attr('class', 'modifier')
-                    .text(function (d) { return uiCmd.display(d); });
+        update();
 
-                selection
-                    .append('span')
-                    .text('+');
-            });
+        var keybinding = d3keybinding('background')
+            .on(key, togglePane)
+            .on(uiCmd('⌘' + key), quickSwitch)
+            .on([t('map_data.key'), t('help.key')], hidePane);
 
+        d3_select(document)
+            .call(keybinding);
 
-        shortcutKeys
-            .selectAll('kbd.shortcut')
-            .data(function (d) {
-                var arr = d.shortcuts;
-                if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
-                    arr = ['Y'];
-                } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
-                    arr = ['F11'];
-                }
+        uiBackground.hidePane = hidePane;
+        uiBackground.togglePane = togglePane;
+        uiBackground.setVisible = setVisible;
+    }
 
-                return arr.map(function(s) {
-                    return {
-                        shortcut: s,
-                        separator: d.separator
-                    };
-                });
-            })
-            .enter()
-            .each(function (d, i, nodes) {
-                var selection = d3_select(this);
-                var click = d.shortcut.toLowerCase().match(/(.*).click/);
+    return background;
+}
 
-                if (click && click[1]) {
-                    selection
-                        .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
-                } else {
-                    selection
-                        .append('kbd')
-                        .attr('class', 'shortcut')
-                        .text(function (d) {
-                            var key = d.shortcut;
-                            return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
-                        });
-                }
+function uiContributors(context) {
+    var osm = context.connection(),
+        debouncedUpdate = debounce(function() { update(); }, 1000),
+        limit = 4,
+        hidden = false,
+        wrap = d3_select(null);
+
+
+    function update() {
+        if (!osm) return;
+
+        var users = {},
+            entities = context.intersects(context.map().extent());
 
-                if (i < nodes.length - 1) {
-                    selection
-                        .append('span')
-                        .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
-                }
-            });
+        entities.forEach(function(entity) {
+            if (entity && entity.user) users[entity.user] = true;
+        });
 
+        var u = Object.keys(users),
+            subset = u.slice(0, u.length > limit ? limit - 1 : limit);
 
-        shortcutKeys
-            .filter(function(d) { return d.gesture; })
-            .each(function () {
-                var selection = d3_select(this);
+        wrap.html('')
+            .call(svgIcon('#icon-nearby', 'pre-text light'));
 
-                selection
-                    .append('span')
-                    .text('+');
+        var userList = d3_select(document.createElement('span'));
 
-                selection
-                    .append('span')
-                    .attr('class', 'gesture')
-                    .text(function (d) { return t(d.gesture); });
-            });
+        userList.selectAll()
+            .data(subset)
+            .enter()
+            .append('a')
+            .attr('class', 'user-link')
+            .attr('href', function(d) { return osm.userURL(d); })
+            .attr('target', '_blank')
+            .attr('tabindex', -1)
+            .text(String);
 
+        if (u.length > limit) {
+            var count = d3_select(document.createElement('span'));
 
-        shortcutRows
-            .append('td')
-            .attr('class', 'shortcut-desc')
-            .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
+            count.append('a')
+                .attr('target', '_blank')
+                .attr('tabindex', -1)
+                .attr('href', function() {
+                    return osm.changesetsURL(context.map().center(), context.map().zoom());
+                })
+                .text(u.length - limit + 1);
 
+            wrap.append('span')
+                .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
 
-        shortcuts = shortcuts
-            .merge(shortcutsEnter);
+        } else {
+            wrap.append('span')
+                .html(t('contributors.list', { users: userList.html() }));
+        }
 
-        // Update
-        wrapper.selectAll('.shortcut-tab')
-            .style('display', function (d, i) {
-                return i === activeTab ? 'flex' : 'none';
-            });
+        if (!u.length) {
+            hidden = true;
+            wrap
+                .transition()
+                .style('opacity', 0);
+
+        } else if (hidden) {
+            wrap
+                .transition()
+                .style('opacity', 1);
+        }
     }
 
 
-    return function(selection, show) {
-        savedSelection = selection;
-        if (show) {
-            modalSelection = uiModal(selection);
-            shortcutsModal(modalSelection);
-        }
+    return function(selection) {
+        if (!osm) return;
+        wrap = selection;
+        update();
+
+        osm.on('loaded.contributors', debouncedUpdate);
+        context.map().on('move.contributors', debouncedUpdate);
     };
 }
 
-function uiHelp(context) {
-    var key = t('help.key');
+function uiFeatureInfo(context) {
+    function update(selection) {
+        var features = context.features(),
+            stats = features.stats(),
+            count = 0,
+            hiddenList = compact(map$4(features.hidden(), function(k) {
+                if (stats[k]) {
+                    count += stats[k];
+                    return String(stats[k]) + ' ' + t('feature.' + k + '.description');
+                }
+            }));
 
-    var docKeys = [
-        'help.help',
-        'help.editing_saving',
-        'help.roads',
-        'help.gps',
-        'help.imagery',
-        'help.addresses',
-        'help.inspector',
-        'help.buildings',
-        'help.relations'];
+        selection.html('');
 
-    var docs = docKeys.map(function(key) {
-        var text = t(key);
-        return {
-            title: text.split('\n')[0].replace('#', '').trim(),
-            html: marked(text.split('\n').slice(1).join('\n'))
-        };
-    });
+        if (hiddenList.length) {
+            var tooltipBehavior = tooltip()
+                .placement('top')
+                .html(true)
+                .title(function() {
+                    return uiTooltipHtml(hiddenList.join('<br/>'));
+                });
 
+            var warning = selection.append('a')
+                .attr('href', '#')
+                .attr('tabindex', -1)
+                .html(t('feature_info.hidden_warning', { count: count }))
+                .call(tooltipBehavior)
+                .on('click', function() {
+                    tooltipBehavior.hide(warning);
+                    // open map data panel?
+                    event.preventDefault();
+                });
+        }
 
-    function help(selection) {
+        selection
+            .classed('hide', !hiddenList.length);
+    }
 
-        function hide() {
-            setVisible(false);
+
+    return function(selection) {
+        update(selection);
+
+        context.features().on('change.feature_info', function() {
+            update(selection);
+        });
+    };
+}
+
+function uiFullScreen(context) {
+    var element = context.container().node(),
+        keybinding = d3keybinding('full-screen');
+        // button;
+
+
+    function getFullScreenFn() {
+        if (element.requestFullscreen) {
+            return element.requestFullscreen;
+        } else if (element.msRequestFullscreen) {
+            return element.msRequestFullscreen;
+        } else if (element.mozRequestFullScreen) {
+            return element.mozRequestFullScreen;
+        } else if (element.webkitRequestFullscreen) {
+            return element.webkitRequestFullscreen;
         }
+    }
 
 
-        function toggle() {
-            if (event) event.preventDefault();
-            tooltipBehavior.hide(button);
-            setVisible(!button.classed('active'));
+    function getExitFullScreenFn() {
+        if (document.exitFullscreen) {
+            return document.exitFullscreen;
+        } else if (document.msExitFullscreen) {
+            return document.msExitFullscreen;
+        } else if (document.mozCancelFullScreen) {
+            return document.mozCancelFullScreen;
+        } else if (document.webkitExitFullscreen) {
+            return document.webkitExitFullscreen;
         }
+    }
 
 
-        function setVisible(show) {
-            if (show !== shown) {
-                button.classed('active', show);
-                shown = show;
+    function isFullScreen() {
+        return document.fullscreenElement ||
+            document.mozFullScreenElement ||
+            document.webkitFullscreenElement ||
+            document.msFullscreenElement;
+    }
 
-                if (show) {
-                    selection.on('mousedown.help-inside', function() {
-                        return event.stopPropagation();
-                    });
-                    pane.style('display', 'block')
-                        .style('right', '-500px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '0px');
-                } else {
-                    pane.style('right', '0px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '-500px')
-                        .on('end', function() {
-                            d3_select(this).style('display', 'none');
-                        });
-                    selection.on('mousedown.help-inside', null);
-                }
-            }
+
+    function isSupported() {
+        return !!getFullScreenFn();
+    }
+
+
+    function fullScreen() {
+        event.preventDefault();
+        if (!isFullScreen()) {
+            // button.classed('active', true);
+            getFullScreenFn().apply(element);
+        } else {
+            // button.classed('active', false);
+            getExitFullScreenFn().apply(document);
         }
+    }
 
 
-        function clickHelp(d, i) {
-            var rtl = (textDirection === 'rtl');
-            pane.property('scrollTop', 0);
-            doctitle.html(d.title);
+    return function() { // selection) {
+        if (!isSupported())
+            return;
 
-            body.html(d.html);
-            body.selectAll('a')
-                .attr('target', '_blank');
-            menuItems.classed('selected', function(m) {
-                return m.title === d.title;
-            });
+        // button = selection.append('button')
+        //     .attr('title', t('full_screen'))
+        //     .attr('tabindex', -1)
+        //     .on('click', fullScreen)
+        //     .call(tooltip);
 
-            nav.html('');
-            if (rtl) {
-                nav.call(drawNext).call(drawPrevious);
-            } else {
-                nav.call(drawPrevious).call(drawNext);
-            }
+        // button.append('span')
+        //     .attr('class', 'icon full-screen');
 
+        var detected = utilDetect();
+        var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
+        keybinding.on(keys, fullScreen);
 
-            function drawNext(selection) {
-                if (i < docs.length - 1) {
-                    var nextLink = selection
-                        .append('a')
-                        .attr('class', 'next')
-                        .on('click', function() {
-                            clickHelp(docs[i + 1], i + 1);
-                        });
+        d3_select(document)
+            .call(keybinding);
+    };
+}
 
-                    nextLink
-                        .append('span')
-                        .text(docs[i + 1].title)
-                        .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
-                }
-            }
+function uiLoading(context) {
+    var _modalSelection = d3_select(null);
+    var _message = '';
+    var _blocking = false;
 
 
-            function drawPrevious(selection) {
-                if (i > 0) {
-                    var prevLink = selection
-                        .append('a')
-                        .attr('class', 'previous')
-                        .on('click', function() {
-                            clickHelp(docs[i - 1], i - 1);
-                        });
+    var loading = function(selection) {
+        _modalSelection = uiModal(selection, _blocking);
 
-                    prevLink
-                        .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
-                        .append('span')
-                        .text(docs[i - 1].title);
-                }
-            }
-        }
+        var loadertext = _modalSelection.select('.content')
+            .classed('loading-modal', true)
+            .append('div')
+            .attr('class', 'modal-section fillL');
 
+        loadertext
+            .append('img')
+            .attr('class', 'loader')
+            .attr('src', context.imagePath('loader-white.gif'));
 
-        function clickWalkthrough() {
-            if (context.inIntro()) return;
-            context.container().call(uiIntro(context));
-            setVisible(false);
-        }
+        loadertext
+            .append('h3')
+            .text(_message);
 
+        _modalSelection.select('button.close')
+            .attr('class', 'hide');
 
-        function clickShortcuts() {
-            context.container().call(uiShortcuts(context), true);
-        }
+        return loading;
+    };
 
 
-        var pane = selection.append('div')
-                .attr('class', 'help-wrap map-overlay fillL col5 content hide'),
-            tooltipBehavior = tooltip()
-                .placement((textDirection === 'rtl') ? 'right' : 'left')
-                .html(true)
-                .title(uiTooltipHtml(t('help.title'), key)),
-            button = selection.append('button')
-                .attr('tabindex', -1)
-                .on('click', toggle)
-                .call(svgIcon('#icon-help', 'light'))
-                .call(tooltipBehavior),
-            shown = false;
+    loading.message = function(_) {
+        if (!arguments.length) return _message;
+        _message = _;
+        return loading;
+    };
 
 
-        var toc = pane.append('ul')
-            .attr('class', 'toc');
+    loading.blocking = function(_) {
+        if (!arguments.length) return _blocking;
+        _blocking = _;
+        return loading;
+    };
 
-        var menuItems = toc.selectAll('li')
-            .data(docs)
-            .enter()
-            .append('li')
-            .append('a')
-            .html(function(d) { return d.title; })
-            .on('click', clickHelp);
 
-        var shortcuts = toc
-            .append('li')
-            .attr('class', 'shortcuts')
-            .call(tooltip()
-                .html(true)
-                .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
-                .placement('top')
-            )
-            .append('a')
-            .on('click', clickShortcuts);
+    loading.close = function() {
+        _modalSelection.remove();
+    };
 
-        shortcuts
-            .append('div')
-            .text(t('shortcuts.title'));
 
-        var walkthrough = toc
-            .append('li')
-            .attr('class', 'walkthrough')
-            .append('a')
-            .on('click', clickWalkthrough);
+    return loading;
+}
 
-        walkthrough
-            .append('svg')
-            .attr('class', 'logo logo-walkthrough')
-            .append('use')
-            .attr('xlink:href', '#logo-walkthrough');
+function uiGeolocate(context) {
+    var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
+        locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
+        timeoutId;
 
-        walkthrough
-            .append('div')
-            .text(t('splash.walkthrough'));
 
+    function click() {
+        if (context.inIntro()) return;
+        context.enter(modeBrowse(context));
+        context.container().call(locating);
+        navigator.geolocation.getCurrentPosition(success, error, geoOptions);
 
-        var content = pane.append('div')
-            .attr('class', 'left-content');
+        // This timeout ensures that we still call finish() even if
+        // the user declines to share their location in Firefox
+        timeoutId = setTimeout(finish, 10000 /* 10sec */ );
+    }
 
-        var doctitle = content.append('h2')
-            .text(t('help.title'));
 
-        var body = content.append('div')
-            .attr('class', 'body');
+    function success(position) {
+        var map = context.map(),
+            extent = geoExtent([position.coords.longitude, position.coords.latitude])
+                .padByMeters(position.coords.accuracy);
 
-        var nav = content.append('div')
-            .attr('class', 'nav');
+        map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
+        finish();
+    }
 
-        clickHelp(docs[0], 0);
 
-        var keybinding = d3keybinding('help')
-            .on(key, toggle)
-            .on([t('background.key'), t('map_data.key')], hide);
+    function error() {
+        finish();
+    }
 
-        d3_select(document)
-            .call(keybinding);
 
-        context.surface().on('mousedown.help-outside', hide);
-        context.container().on('mousedown.help-outside', hide);
+    function finish() {
+        locating.close();  // unblock ui
+        if (timeoutId) { clearTimeout(timeoutId); }
+        timeoutId = undefined;
     }
 
-    return help;
+
+    return function(selection) {
+        if (!navigator.geolocation) return;
+
+        selection
+            .append('button')
+            .attr('tabindex', -1)
+            .attr('title', t('geolocate.title'))
+            .on('click', click)
+            .call(svgIcon('#icon-geolocate', 'light'))
+            .call(tooltip()
+                .placement((textDirection === 'rtl') ? 'right' : 'left'));
+    };
 }
 
 function uiPanelBackground(context) {
@@ -55924,7 +58155,7 @@ function uiPanelBackground(context) {
                 .append('li')
                 .attr('class', 'background-info-list-' + k)
                 .classed('hide', !metadata[k])
-                .text(t('info_panels.background.' + k) + ': ')
+                .text(t('info_panels.background.' + k) + ':')
                 .append('span')
                 .attr('class', 'background-info-span-' + k)
                 .text(metadata[k]);
@@ -56052,11 +58283,14 @@ function uiPanelHistory(context) {
 
     function displayTimestamp(entity) {
         if (!entity.timestamp) return t('info_panels.history.unknown');
-
+        var detected = utilDetect();
+        var options = {
+            day: 'numeric', month: 'short', year: 'numeric',
+            hour: 'numeric', minute: 'numeric', second: 'numeric'
+        };
         var d = new Date(entity.timestamp);
         if (isNaN(d.getTime())) return t('info_panels.history.unknown');
-
-        return d.toLocaleString();
+        return d.toLocaleString(detected.locale, options);
     }
 
 
@@ -56156,20 +58390,24 @@ function uiPanelHistory(context) {
 
         list
             .append('li')
-            .text(t('info_panels.history.version') + ': ' + entity.version);
+            .text(t('info_panels.history.version') + ':')
+            .append('span')
+            .text(entity.version);
 
         list
             .append('li')
-            .text(t('info_panels.history.last_edit') + ': ' + displayTimestamp(entity));
+            .text(t('info_panels.history.last_edit') + ':')
+            .append('span')
+            .text(displayTimestamp(entity));
 
         list
             .append('li')
-            .text(t('info_panels.history.edited_by') + ': ')
+            .text(t('info_panels.history.edited_by') + ':')
             .call(displayUser, entity);
 
         list
             .append('li')
-            .text(t('info_panels.history.changeset') + ': ')
+            .text(t('info_panels.history.changeset') + ':')
             .call(displayChangeset, entity);
 
         if (osm) {
@@ -56208,20 +58446,161 @@ function uiPanelHistory(context) {
     return panel;
 }
 
-function uiPanelLocation(context) {
-    var currLocation = '';
-    var OSM_PRECISION = 7;
+var OSM_PRECISION = 7;
+var locale$2 = utilDetect().locale;
+
+/**
+ * Returns a localized representation of the given length measurement.
+ *
+ * @param {Number} m area in meters
+ * @param {Boolean} isImperial true for U.S. customary units; false for metric
+ */
+function displayLength(m, isImperial) {
+       var d = m * (isImperial ? 3.28084 : 1),
+               unit;
+
+       if (isImperial) {
+               if (d >= 5280) {
+                       d /= 5280;
+                       unit = 'miles';
+               } else {
+                       unit = 'feet';
+               }
+       } else {
+               if (d >= 1000) {
+                       d /= 1000;
+                       unit = 'kilometers';
+               } else {
+                       unit = 'meters';
+               }
+       }
 
+       return t('units.' + unit, {
+               quantity: d.toLocaleString(locale$2, { maximumSignificantDigits: 4 })
+       });
+}
 
-    function wrap(x, min, max) {
-        var d = max - min;
-        return ((x - min) % d + d) % d + min;
-    }
+/**
+ * Returns a localized representation of the given area measurement.
+ *
+ * @param {Number} m2 area in square meters
+ * @param {Boolean} isImperial true for U.S. customary units; false for metric
+ */
+function displayArea(m2, isImperial) {
+       var d = m2 * (isImperial ? 10.7639111056 : 1),
+               d1, d2, unit1, unit2, area;
+
+       if (isImperial) {
+               if (d >= 6969600) {     // > 0.25mi² show mi²
+                       d1 = d / 27878400;
+                       unit1 = 'square_miles';
+               } else {
+                       d1 = d;
+                       unit1 = 'square_feet';
+               }
 
+               if (d > 4356 && d < 43560000) {   // 0.1 - 1000 acres
+                       d2 = d / 43560;
+                       unit2 = 'acres';
+               }
 
-    function clamp(x, min, max) {
-        return Math.max(min, Math.min(x, max));
-    }
+       } else {
+               if (d >= 250000) {    // > 0.25km² show km²
+                       d1 = d / 1000000;
+                       unit1 = 'square_kilometers';
+               } else {
+                       d1 = d;
+                       unit1 = 'square_meters';
+               }
+
+               if (d > 1000 && d < 10000000) {   // 0.1 - 1000 hectares
+                       d2 = d / 10000;
+                       unit2 = 'hectares';
+               }
+       }
+
+       area = t('units.' + unit1, {
+               quantity: d1.toLocaleString(locale$2, { maximumSignificantDigits: 4 })
+       });
+
+       if (d2) {
+               return t('units.area_pair', {
+                       area1: area,
+                       area2: t('units.' + unit2, {
+                               quantity: d2.toLocaleString(locale$2, { maximumSignificantDigits: 2 })
+                       })
+               });
+       } else {
+               return area;
+       }
+}
+
+function wrap(x, min, max) {
+       var d = max - min;
+       return ((x - min) % d + d) % d + min;
+}
+
+function clamp(x, min, max) {
+       return Math.max(min, Math.min(x, max));
+}
+
+function displayCoordinate(deg, pos, neg) {
+       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60,
+               sec = (min - Math.floor(min)) * 60,
+               displayDegrees = t('units.arcdegrees', {
+                       quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
+               }),
+               displayCoordinate;
+
+       if (Math.floor(sec) > 0) {
+               displayCoordinate = displayDegrees +
+                       t('units.arcminutes', { quantity: Math.floor(min).toLocaleString(locale$2) }) +
+                       t('units.arcseconds', { quantity: Math.round(sec).toLocaleString(locale$2) });
+       } else if (Math.floor(min) > 0) {
+               displayCoordinate = displayDegrees +
+                       t('units.arcminutes', { quantity: Math.round(min).toLocaleString(locale$2) });
+       } else {
+               displayCoordinate = t('units.arcdegrees', {
+                       quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
+               });
+       }
+
+       if (deg === 0) {
+               return displayCoordinate;
+       } else {
+               return t('units.coordinate', {
+                       coordinate: displayCoordinate,
+                       direction: t('units.' + (deg > 0 ? pos : neg))
+               });
+       }
+}
+
+/**
+ * Returns given coordinate pair in degree-minute-second format.
+ *
+ * @param {Array<Number>} coord longitude and latitude
+ */
+function dmsCoordinatePair(coord) {
+       return t('units.coordinate_pair', {
+               latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
+               longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
+       });
+}
+
+/**
+ * Returns the given coordinate pair in decimal format.
+ *
+ * @param {Array<Number>} coord longitude and latitude
+ */
+function decimalCoordinatePair(coord) {
+       return t('units.coordinate_pair', {
+               latitude: clamp(coord[1], -90, 90).toLocaleString(locale$2, { maximumFractionDigits: OSM_PRECISION }),
+               longitude: wrap(coord[0], -180, 180).toLocaleString(locale$2, { maximumFractionDigits: OSM_PRECISION })
+       });
+}
+
+function uiPanelLocation(context) {
+    var currLocation = '';
 
 
     function redraw(selection) {
@@ -56236,13 +58615,11 @@ function uiPanelLocation(context) {
             coord = context.map().center();
         }
 
-        var coordStr =
-            clamp(coord[1], -90, 90).toFixed(OSM_PRECISION) + ', ' +
-            wrap(coord[0], -180, 180).toFixed(OSM_PRECISION);
-
         list
             .append('li')
-            .text(coordStr);
+            .text(dmsCoordinatePair(coord))
+            .append('li')
+            .text(decimalCoordinatePair(coord));
 
         // Location Info
         selection
@@ -56293,8 +58670,8 @@ function uiPanelLocation(context) {
 }
 
 function uiPanelMeasurement(context) {
-    var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
-    var OSM_PRECISION = 7;
+    var locale = utilDetect().locale,
+        isImperial = (locale.toLowerCase() === 'en-us');
 
 
     function radiansToMeters(r) {
@@ -56321,89 +58698,28 @@ function uiPanelMeasurement(context) {
         return result;
     }
 
+    function nodeCount(feature) {
+      if (feature.type === 'LineString') return feature.coordinates.length;
 
-    function displayLength(m) {
-        var d = m * (isImperial ? 3.28084 : 1),
-            p, unit;
-
-        if (isImperial) {
-            if (d >= 5280) {
-                d /= 5280;
-                unit = 'mi';
-            } else {
-                unit = 'ft';
-            }
-        } else {
-            if (d >= 1000) {
-                d /= 1000;
-                unit = 'km';
-            } else {
-                unit = 'm';
-            }
-        }
-
-        // drop unnecessary precision
-        p = d > 1000 ? 0 : d > 100 ? 1 : 2;
-
-        return String(d.toFixed(p)) + ' ' + unit;
-    }
-
-
-    function displayArea(m2) {
-        var d = m2 * (isImperial ? 10.7639111056 : 1),
-            d1, d2, p1, p2, unit1, unit2;
-
-        if (isImperial) {
-            if (d >= 6969600) {     // > 0.25mi² show mi²
-                d1 = d / 27878400;
-                unit1 = 'mi²';
-            } else {
-                d1 = d;
-                unit1 = 'ft²';
-            }
-
-            if (d > 4356 && d < 43560000) {   // 0.1 - 1000 acres
-                d2 = d / 43560;
-                unit2 = 'ac';
-            }
-
-        } else {
-            if (d >= 250000) {    // > 0.25km² show km²
-                d1 = d / 1000000;
-                unit1 = 'km²';
-            } else {
-                d1 = d;
-                unit1 = 'm²';
-            }
-
-            if (d > 1000 && d < 10000000) {   // 0.1 - 1000 hectares
-                d2 = d / 10000;
-                unit2 = 'ha';
-            }
-        }
-
-        // drop unnecessary precision
-        p1 = d1 > 1000 ? 0 : d1 > 100 ? 1 : 2;
-        p2 = d2 > 1000 ? 0 : d2 > 100 ? 1 : 2;
-
-        return String(d1.toFixed(p1)) + ' ' + unit1 +
-            (d2 ? ' (' + String(d2.toFixed(p2)) + ' ' + unit2 + ')' : '');
+      if (feature.type === 'Polygon') {
+          return feature.coordinates[0].length - 1;
+      }
     }
 
 
     function redraw(selection) {
-        var resolver = context.graph(),
-            selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
-            singular = selected.length === 1 ? selected[0] : null,
-            extent = geoExtent(),
-            entity;
+        var resolver = context.graph();
+        var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
+        var singular = selected.length === 1 ? selected[0] : null;
+        var extent = geoExtent();
+        var entity;
 
         selection.html('');
 
         selection
             .append('h4')
             .attr('class', 'measurement-heading')
-            .text(singular || t('info_panels.measurement.selected', { n: selected.length }));
+            .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
 
         if (!selected.length) return;
 
@@ -56417,14 +58733,17 @@ function uiPanelMeasurement(context) {
 
         var list = selection
             .append('ul');
+        var coordItem;
 
         // multiple features, just display extent center..
         if (!singular) {
-            list
+            coordItem = list
                 .append('li')
-                .text(t('info_panels.measurement.center') + ': ' +
-                    center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
-                );
+                .text(t('info_panels.measurement.center') + ':');
+            coordItem.append('span')
+                .text(dmsCoordinatePair(center));
+            coordItem.append('span')
+                .text(decimalCoordinatePair(center));
             return;
         }
 
@@ -56441,26 +58760,43 @@ function uiPanelMeasurement(context) {
 
             list
                 .append('li')
-                .text(t('info_panels.measurement.geometry') + ': ' +
-                    (closed ? t('info_panels.measurement.closed') + ' ' : '') + t('geometry.' + geometry) );
+                .text(t('info_panels.measurement.geometry') + ':')
+                .append('span')
+                .text(
+                    closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
+                );
+
+            if (entity.type !== 'relation') {
+                list
+                    .append('li')
+                    .text(t('info_panels.measurement.node_count') + ':')
+                    .append('span')
+                    .text(nodeCount(feature).toLocaleString(locale));
+            }
 
             if (closed) {
                 var area = steradiansToSqmeters(entity.area(resolver));
                 list
                     .append('li')
-                    .text(t('info_panels.measurement.area') + ': ' + displayArea(area));
+                    .text(t('info_panels.measurement.area') + ':')
+                    .append('span')
+                    .text(displayArea(area, isImperial));
             }
 
-            list
-                .append('li')
-                .text(lengthLabel + ': ' + displayLength(length));
 
             list
                 .append('li')
-                .text(t('info_panels.measurement.centroid') + ': ' +
-                    centroid[1].toFixed(OSM_PRECISION) + ', ' + centroid[0].toFixed(OSM_PRECISION)
-                );
+                .text(lengthLabel + ':')
+                .append('span')
+                .text(displayLength(length, isImperial));
 
+            coordItem = list
+                .append('li')
+                .text(t('info_panels.measurement.centroid') + ':');
+            coordItem.append('span')
+                .text(dmsCoordinatePair(centroid));
+            coordItem.append('span')
+                .text(decimalCoordinatePair(centroid));
 
             var toggle  = isImperial ? 'imperial' : 'metric';
 
@@ -56480,13 +58816,17 @@ function uiPanelMeasurement(context) {
 
             list
                 .append('li')
-                .text(t('info_panels.measurement.geometry') + ': ' + t('geometry.' + geometry));
+                .text(t('info_panels.measurement.geometry') + ':')
+                .append('span')
+                .text(t('geometry.' + geometry));
 
-            list
+            coordItem = list
                 .append('li')
-                .text(centerLabel + ': ' +
-                    center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
-                );
+                .text(centerLabel + ':');
+            coordItem.append('span')
+                .text(dmsCoordinatePair(center));
+            coordItem.append('span')
+                .text(decimalCoordinatePair(center));
         }
     }
 
@@ -56644,496 +58984,6 @@ function uiInfo(context) {
     return info;
 }
 
-function uiMapData(context) {
-    var key = t('map_data.key'),
-        features = context.features().keys(),
-        layers = context.layers(),
-        fills = ['wireframe', 'partial', 'full'],
-        fillDefault = context.storage('area-fill') || 'partial',
-        fillSelected = fillDefault;
-
-
-    function map_data(selection) {
-
-        function showsFeature(d) {
-            return context.features().enabled(d);
-        }
-
-
-        function autoHiddenFeature(d) {
-            return context.features().autoHidden(d);
-        }
-
-
-        function clickFeature(d) {
-            context.features().toggle(d);
-            update();
-        }
-
-
-        function showsFill(d) {
-            return fillSelected === d;
-        }
-
-
-        function setFill(d) {
-            fills.forEach(function(opt) {
-                context.surface().classed('fill-' + opt, Boolean(opt === d));
-            });
-
-            fillSelected = d;
-            if (d !== 'wireframe') {
-                fillDefault = d;
-                context.storage('area-fill', d);
-            }
-            update();
-        }
-
-
-        function showsLayer(which) {
-            var layer = layers.layer(which);
-            if (layer) {
-                return layer.enabled();
-            }
-            return false;
-        }
-
-
-        function setLayer(which, enabled) {
-            var layer = layers.layer(which);
-            if (layer) {
-                layer.enabled(enabled);
-                update();
-            }
-        }
-
-
-        function toggleLayer(which) {
-            setLayer(which, !showsLayer(which));
-        }
-
-
-        function drawPhotoItems(selection) {
-            var photoKeys = ['mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
-            var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
-            var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
-
-            function layerSupported(d) {
-                return d.layer && d.layer.supported();
-            }
-            function layerEnabled(d) {
-                return layerSupported(d) && d.layer.enabled();
-            }
-
-            var ul = selection
-                .selectAll('.layer-list-photos')
-                .data([0]);
-
-            ul = ul.enter()
-                .append('ul')
-                .attr('class', 'layer-list layer-list-photos')
-                .merge(ul);
-
-            var li = ul.selectAll('.list-item-photos')
-                .data(data);
-
-            li.exit()
-                .remove();
-
-            var liEnter = li.enter()
-                .append('li')
-                .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
-
-            var labelEnter = liEnter
-                .append('label')
-                .each(function(d) {
-                    d3_select(this)
-                        .call(tooltip()
-                            .title(t(d.id.replace('-', '_') + '.tooltip'))
-                            .placement('top')
-                        );
-                });
-
-            labelEnter
-                .append('input')
-                .attr('type', 'checkbox')
-                .on('change', function(d) { toggleLayer(d.id); });
-
-            labelEnter
-                .append('span')
-                .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
-
-
-            // Update
-            li = li
-                .merge(liEnter);
-
-            li
-                .classed('active', layerEnabled)
-                .selectAll('input')
-                .property('checked', layerEnabled);
-        }
-
-
-        function drawOsmItem(selection) {
-            var osm = layers.layer('osm'),
-                showsOsm = osm.enabled();
-
-            var ul = selection
-                .selectAll('.layer-list-osm')
-                .data(osm ? [0] : []);
-
-            // Exit
-            ul.exit()
-                .remove();
-
-            // Enter
-            var ulEnter = ul.enter()
-                .append('ul')
-                .attr('class', 'layer-list layer-list-osm');
-
-            var liEnter = ulEnter
-                .append('li')
-                .attr('class', 'list-item-osm');
-
-            var labelEnter = liEnter
-                .append('label')
-                .call(tooltip()
-                    .title(t('map_data.layers.osm.tooltip'))
-                    .placement('top')
-                );
-
-            labelEnter
-                .append('input')
-                .attr('type', 'checkbox')
-                .on('change', function() { toggleLayer('osm'); });
-
-            labelEnter
-                .append('span')
-                .text(t('map_data.layers.osm.title'));
-
-            // Update
-            ul = ul
-                .merge(ulEnter);
-
-            ul.selectAll('.list-item-osm')
-                .classed('active', showsOsm)
-                .selectAll('input')
-                .property('checked', showsOsm);
-        }
-
-
-        function drawGpxItem(selection) {
-            var gpx = layers.layer('gpx'),
-                hasGpx = gpx && gpx.hasGpx(),
-                showsGpx = hasGpx && gpx.enabled();
-
-            var ul = selection
-                .selectAll('.layer-list-gpx')
-                .data(gpx ? [0] : []);
-
-            // Exit
-            ul.exit()
-                .remove();
-
-            // Enter
-            var ulEnter = ul.enter()
-                .append('ul')
-                .attr('class', 'layer-list layer-list-gpx');
-
-            var liEnter = ulEnter
-                .append('li')
-                .attr('class', 'list-item-gpx');
-
-            liEnter
-                .append('button')
-                .attr('class', 'list-item-gpx-extent')
-                .call(tooltip()
-                    .title(t('gpx.zoom'))
-                    .placement((textDirection === 'rtl') ? 'right' : 'left'))
-                .on('click', function() {
-                    event.preventDefault();
-                    event.stopPropagation();
-                    gpx.fitZoom();
-                })
-                .call(svgIcon('#icon-search'));
-
-            liEnter
-                .append('button')
-                .attr('class', 'list-item-gpx-browse')
-                .call(tooltip()
-                    .title(t('gpx.browse'))
-                    .placement((textDirection === 'rtl') ? 'right' : 'left')
-                )
-                .on('click', function() {
-                    d3_select(document.createElement('input'))
-                        .attr('type', 'file')
-                        .on('change', function() {
-                            gpx.files(event.target.files);
-                        })
-                        .node().click();
-                })
-                .call(svgIcon('#icon-geolocate'));
-
-            var labelEnter = liEnter
-                .append('label')
-                .call(tooltip()
-                    .title(t('gpx.drag_drop'))
-                    .placement('top')
-                );
-
-            labelEnter
-                .append('input')
-                .attr('type', 'checkbox')
-                .on('change', function() { toggleLayer('gpx'); });
-
-            labelEnter
-                .append('span')
-                .text(t('gpx.local_layer'));
-
-            // Update
-            ul = ul
-                .merge(ulEnter);
-
-            ul.selectAll('.list-item-gpx')
-                .classed('active', showsGpx)
-                .selectAll('label')
-                .classed('deemphasize', !hasGpx)
-                .selectAll('input')
-                .property('disabled', !hasGpx)
-                .property('checked', showsGpx);
-        }
-
-
-        function drawList(selection, data, type, name, change, active) {
-            var items = selection.selectAll('li')
-                .data(data);
-
-            // Exit
-            items.exit()
-                .remove();
-
-            // Enter
-            var enter = items.enter()
-                .append('li')
-                .attr('class', 'layer')
-                .call(tooltip()
-                    .html(true)
-                    .title(function(d) {
-                        var tip = t(name + '.' + d + '.tooltip'),
-                            key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
-
-                        if (name === 'feature' && autoHiddenFeature(d)) {
-                            var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
-                            tip += '<div>' + msg + '</div>';
-                        }
-                        return uiTooltipHtml(tip, key);
-                    })
-                    .placement('top')
-                );
-
-            var label = enter
-                .append('label');
-
-            label
-                .append('input')
-                .attr('type', type)
-                .attr('name', name)
-                .on('change', change);
-
-            label
-                .append('span')
-                .text(function(d) { return t(name + '.' + d + '.description'); });
-
-            // Update
-            items = items
-                .merge(enter);
-
-            items
-                .classed('active', active)
-                .selectAll('input')
-                .property('checked', active)
-                .property('indeterminate', function(d) {
-                    return (name === 'feature' && autoHiddenFeature(d));
-                });
-        }
-
-
-        function update() {
-            dataLayerContainer
-                .call(drawOsmItem)
-                .call(drawPhotoItems)
-                .call(drawGpxItem);
-
-            fillList
-                .call(drawList, fills, 'radio', 'area_fill', setFill, showsFill);
-
-            featureList
-                .call(drawList, features, 'checkbox', 'feature', clickFeature, showsFeature);
-        }
-
-
-        function hidePanel() {
-            setVisible(false);
-        }
-
-
-        function togglePanel() {
-            if (event) event.preventDefault();
-            tooltipBehavior.hide(button);
-            setVisible(!button.classed('active'));
-        }
-
-
-        function toggleWireframe() {
-            if (event) {
-                event.preventDefault();
-                event.stopPropagation();
-            }
-            setFill((fillSelected === 'wireframe' ? fillDefault : 'wireframe'));
-            context.map().pan([0,0]);  // trigger a redraw
-        }
-
-
-        function setVisible(show) {
-            if (show !== shown) {
-                button.classed('active', show);
-                shown = show;
-
-                if (show) {
-                    update();
-                    selection.on('mousedown.map_data-inside', function() {
-                        return event.stopPropagation();
-                    });
-                    content.style('display', 'block')
-                        .style('right', '-300px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '0px');
-                } else {
-                    content.style('display', 'block')
-                        .style('right', '0px')
-                        .transition()
-                        .duration(200)
-                        .style('right', '-300px')
-                        .on('end', function() {
-                            d3_select(this).style('display', 'none');
-                        });
-                    selection.on('mousedown.map_data-inside', null);
-                }
-            }
-        }
-
-
-        var content = selection
-                .append('div')
-                .attr('class', 'fillL map-overlay col3 content hide'),
-            tooltipBehavior = tooltip()
-                .placement((textDirection === 'rtl') ? 'right' : 'left')
-                .html(true)
-                .title(uiTooltipHtml(t('map_data.description'), key)),
-            button = selection
-                .append('button')
-                .attr('tabindex', -1)
-                .on('click', togglePanel)
-                .call(svgIcon('#icon-data', 'light'))
-                .call(tooltipBehavior),
-            shown = false;
-
-        content
-            .append('h4')
-            .text(t('map_data.title'));
-
-
-        // data layers
-        content
-            .append('a')
-            .text(t('map_data.data_layers'))
-            .attr('href', '#')
-            .classed('hide-toggle', true)
-            .classed('expanded', true)
-            .on('click', function() {
-                var exp = d3_select(this).classed('expanded');
-                dataLayerContainer.style('display', exp ? 'none' : 'block');
-                d3_select(this).classed('expanded', !exp);
-                event.preventDefault();
-            });
-
-        var dataLayerContainer = content
-            .append('div')
-            .attr('class', 'data-data-layers')
-            .style('display', 'block');
-
-
-        // area fills
-        content
-            .append('a')
-            .text(t('map_data.fill_area'))
-            .attr('href', '#')
-            .classed('hide-toggle', true)
-            .classed('expanded', false)
-            .on('click', function() {
-                var exp = d3_select(this).classed('expanded');
-                fillContainer.style('display', exp ? 'none' : 'block');
-                d3_select(this).classed('expanded', !exp);
-                event.preventDefault();
-            });
-
-        var fillContainer = content
-            .append('div')
-            .attr('class', 'data-area-fills')
-            .style('display', 'none');
-
-        var fillList = fillContainer
-            .append('ul')
-            .attr('class', 'layer-list layer-fill-list');
-
-
-        // feature filters
-        content
-            .append('a')
-            .text(t('map_data.map_features'))
-            .attr('href', '#')
-            .classed('hide-toggle', true)
-            .classed('expanded', false)
-            .on('click', function() {
-                var exp = d3_select(this).classed('expanded');
-                featureContainer.style('display', exp ? 'none' : 'block');
-                d3_select(this).classed('expanded', !exp);
-                event.preventDefault();
-            });
-
-        var featureContainer = content
-            .append('div')
-            .attr('class', 'data-feature-filters')
-            .style('display', 'none');
-
-        var featureList = featureContainer
-            .append('ul')
-            .attr('class', 'layer-list layer-feature-list');
-
-
-        context.features()
-            .on('change.map_data-update', update);
-
-        setFill(fillDefault);
-
-        var keybinding = d3keybinding('features')
-            .on(key, togglePanel)
-            .on(t('area_fill.wireframe.key'), toggleWireframe)
-            .on([t('background.key'), t('help.key')], hidePanel);
-
-        d3_select(document)
-            .call(keybinding);
-
-        context.surface().on('mousedown.map_data-outside', hidePanel);
-        context.container().on('mousedown.map_data-outside', hidePanel);
-    }
-
-
-    return map_data;
-}
-
 function uiModes(context) {
     var modes = [
         modeAddPoint(context),
@@ -57143,7 +58993,8 @@ function uiModes(context) {
 
 
     function editable() {
-        return context.editable() && context.mode().id !== 'save';
+        var mode = context.mode();
+        return context.editable() && mode && mode.id !== 'save';
     }
 
 
@@ -57345,12 +59196,13 @@ function uiRestore(context) {
 }
 
 function uiSave(context) {
-    var history = context.history(),
-        key = uiCmd('⌘S');
+    var history = context.history();
+    var key = uiCmd('⌘S');
 
 
     function saving() {
-        return context.mode().id === 'save';
+        var mode = context.mode();
+        return mode && mode.id === 'save';
     }
 
 
@@ -57429,7 +59281,7 @@ function uiSave(context) {
         updateCount();
 
 
-        var keybinding = d3keybinding('save')
+        var keybinding = d3keybinding('uiSave')
             .on(key, save, true);
 
         d3_select(document)
@@ -57480,21 +59332,7 @@ function uiScale(context) {
         dLon = geoMetersToLon(scale.dist / conversion, lat);
         scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
 
-        if (isImperial) {
-            if (scale.dist >= 5280) {
-                scale.dist /= 5280;
-                scale.text = String(scale.dist) + ' mi';
-            } else {
-                scale.text = String(scale.dist) + ' ft';
-            }
-        } else {
-            if (scale.dist >= 1000) {
-                scale.dist /= 1000;
-                scale.text = String(scale.dist) + ' km';
-            } else {
-                scale.text = String(scale.dist) + ' m';
-            }
-        }
+        scale.text = displayLength(scale.dist / conversion, isImperial);
 
         return scale;
     }
@@ -57593,7 +59431,8 @@ function swapdim(a, b, dim) {
 }
 
 function uiFeatureList(context) {
-    var geocodeResults;
+    var keybinding = d3keybinding('uiFeatureList');
+    var _geocodeResults;
 
 
     function featureList(selection) {
@@ -57601,7 +59440,8 @@ function uiFeatureList(context) {
             .append('div')
             .attr('class', 'header fillL cf');
 
-        header.append('h3')
+        header
+            .append('h3')
             .text(t('inspector.feature_list'));
 
         var searchWrap = selection
@@ -57614,6 +59454,7 @@ function uiFeatureList(context) {
             .attr('type', 'search')
             .call(utilNoAuto)
             .on('keypress', keypress)
+            .on('keydown', keydown)
             .on('input', inputevent);
 
         searchWrap
@@ -57632,18 +59473,40 @@ function uiFeatureList(context) {
         context.map()
             .on('drawn.feature-list', mapDrawn);
 
+        keybinding
+            .on(uiCmd('⌘F'), focusSearch);
+
+        d3_select(document)
+            .call(keybinding);
+
+
+        function focusSearch() {
+            var mode = context.mode() && context.mode().id;
+            if (mode !== 'browse') return;
+
+            event.preventDefault();
+            search.node().focus();
+        }
+
+
+        function keydown() {
+            if (event.keyCode === 27) {  // escape
+                search.node().blur();
+            }
+        }
+
 
         function keypress() {
             var q = search.property('value'),
                 items = list.selectAll('.feature-list-item');
-            if (event.keyCode === 13 && q.length && items.size()) {
+            if (event.keyCode === 13 && q.length && items.size()) {  // return
                 click(items.datum());
             }
         }
 
 
         function inputevent() {
-            geocodeResults = undefined;
+            _geocodeResults = undefined;
             drawList();
         }
 
@@ -57662,10 +59525,10 @@ function uiFeatureList(context) {
 
 
         function features() {
-            var entities = {},
-                result = [],
-                graph = context.graph(),
-                q = search.property('value').toLowerCase();
+            var entities = {};
+            var result = [];
+            var graph = context.graph();
+            var q = search.property('value').toLowerCase();
 
             if (!q) return result;
 
@@ -57688,7 +59551,7 @@ function uiFeatureList(context) {
                     id: -1,
                     geometry: 'point',
                     type: t('inspector.location'),
-                    name: loc[0].toFixed(6) + ', ' + loc[1].toFixed(6),
+                    name: dmsCoordinatePair([loc[1], loc[0]]),
                     location: loc
                 });
             }
@@ -57701,8 +59564,9 @@ function uiFeatureList(context) {
 
                 var name = utilDisplayName(entity) || '';
                 if (name.toLowerCase().indexOf(q) >= 0) {
-                    var matched = context.presets().match(entity, graph),
-                        type = (matched && matched.name()) || utilDisplayType(entity.id);
+                    var matched = context.presets().match(entity, graph);
+                    var type = (matched && matched.name()) || utilDisplayType(entity.id);
+
                     result.push({
                         id: entity.id,
                         entity: entity,
@@ -57719,17 +59583,34 @@ function uiFeatureList(context) {
 
             var visible = context.surface().selectAll('.point, .line, .area').nodes();
             for (var i = 0; i < visible.length && result.length <= 200; i++) {
-                addEntity(visible[i].__data__);
+                var datum = visible[i].__data__;
+                var entity = datum && datum.properties && datum.properties.entity;
+                if (entity) { addEntity(entity); }
             }
 
-            (geocodeResults || []).forEach(function(d) {
-                // https://github.com/openstreetmap/iD/issues/1890
-                if (d.osm_type && d.osm_id) {
+            (_geocodeResults || []).forEach(function(d) {
+                if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
+
+                    // Make a temporary osmEntity so we can preset match
+                    // and better localize the search result - #4725
+                    var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
+                    var tags = {};
+                    tags[d.class] = d.type;
+
+                    var attrs = { id: id, type: d.osm_type, tags: tags };
+                    if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
+                        attrs.nodes = ['a','a'];  // so that geometry area is possible
+                    }
+
+                    var tempEntity = osmEntity(attrs);
+                    var tempGraph = coreGraph([tempEntity]);
+                    var matched = context.presets().match(tempEntity, tempGraph);
+                    var type = (matched && matched.name()) || utilDisplayType(id);
+
                     result.push({
-                        id: osmEntity.id.fromOSM(d.osm_type, d.osm_id),
-                        geometry: d.osm_type === 'relation' ? 'relation' : d.osm_type === 'way' ? 'line' : 'point',
-                        type: d.type !== 'yes' ? (d.type.charAt(0).toUpperCase() + d.type.slice(1)).replace('_', ' ')
-                                               : (d.class.charAt(0).toUpperCase() + d.class.slice(1)).replace('_', ' '),
+                        id: tempEntity.id,
+                        geometry: tempEntity.geometry(tempGraph),
+                        type: type,
                         name: d.display_name,
                         extent: new geoExtent(
                             [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
@@ -57743,16 +59624,17 @@ function uiFeatureList(context) {
 
 
         function drawList() {
-            var value = search.property('value'),
-                results = features();
+            var value = search.property('value');
+            var results = features();
 
             list.classed('filtered', value.length);
 
-            var noResultsWorldwide = geocodeResults && geocodeResults.length === 0;
+            var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
 
             var resultsIndicator = list.selectAll('.no-results-item')
                 .data([0])
-                .enter().append('button')
+                .enter()
+                .append('button')
                 .property('disabled', true)
                 .attr('class', 'no-results-item')
                 .call(svgIcon('#icon-alert', 'pre-text'));
@@ -57766,7 +59648,8 @@ function uiFeatureList(context) {
             if (services.geocoder) {
               list.selectAll('.geocode-item')
                   .data([0])
-                  .enter().append('button')
+                  .enter()
+                  .append('button')
                   .attr('class', 'geocode-item')
                   .on('click', geocoderSearch)
                   .append('div')
@@ -57780,7 +59663,7 @@ function uiFeatureList(context) {
                 .style('display', (value.length && !results.length) ? 'block' : 'none');
 
             list.selectAll('.geocode-item')
-                .style('display', (value && geocodeResults === undefined) ? 'block' : 'none');
+                .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
 
             list.selectAll('.feature-list-item')
                 .data([-1])
@@ -57800,20 +59683,24 @@ function uiFeatureList(context) {
                 .append('div')
                 .attr('class', 'label');
 
-            label.each(function(d) {
-                d3_select(this)
-                    .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
-            });
+            label
+                .each(function(d) {
+                    d3_select(this)
+                        .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
+                });
 
-            label.append('span')
+            label
+                .append('span')
                 .attr('class', 'entity-type')
                 .text(function(d) { return d.type; });
 
-            label.append('span')
+            label
+                .append('span')
                 .attr('class', 'entity-name')
                 .text(function(d) { return d.name; });
 
-            enter.style('opacity', 0)
+            enter
+                .style('opacity', 0)
                 .transition()
                 .style('opacity', 1);
 
@@ -57847,8 +59734,8 @@ function uiFeatureList(context) {
                 if (d.entity.type === 'node') {
                     context.map().center(d.entity.loc);
                 } else if (d.entity.type === 'way') {
-                    var center = context.projection(context.map().center()),
-                        edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
+                    var center = context.projection(context.map().center());
+                    var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
                     context.map().center(edge.loc);
                 }
                 context.enter(modeSelect(context, [d.entity.id]));
@@ -57860,7 +59747,7 @@ function uiFeatureList(context) {
 
         function geocoderSearch() {
             services.geocoder.search(search.property('value'), function (err, resp) {
-                geocodeResults = resp || [];
+                _geocodeResults = resp || [];
                 drawList();
             });
         }
@@ -57979,15 +59866,15 @@ function uiPresetIcon() {
 }
 
 function d3combobox() {
-    var dispatch$$1 = dispatch('accept'),
-        container = d3_select(document.body),
-        data = [],
-        suggestions = [],
-        minItems = 2,
-        caseSensitive = false;
-
-    var fetcher = function(val, cb) {
-        cb(data.filter(function(d) {
+    var dispatch$$1 = dispatch('accept');
+    var _container = d3_select(document.body);
+    var _data = [];
+    var _suggestions = [];
+    var _minItems = 2;
+    var _caseSensitive = false;
+
+    var _fetcher = function(val, cb) {
+        cb(_data.filter(function(d) {
             return d.value
                 .toString()
                 .toLowerCase()
@@ -57996,11 +59883,11 @@ function d3combobox() {
     };
 
     var combobox = function(input, attachTo) {
-        var idx = -1,
-            wrapper = container
-                .selectAll('div.combobox')
-                .filter(function(d) { return d === input.node(); }),
-            shown = !wrapper.empty();
+        var idx = -1;
+        var wrapper = _container
+            .selectAll('div.combobox')
+            .filter(function(d) { return d === input.node(); });
+        var shown = !wrapper.empty();
 
         input
             .classed('combobox-input', true)
@@ -58010,17 +59897,17 @@ function d3combobox() {
             .on('keyup.typeahead', keyup)
             .on('input.typeahead', change)
             .each(function() {
-                var parent = this.parentNode,
-                    sibling = this.nextSibling;
+                var parent = this.parentNode;
+                var sibling = this.nextSibling;
 
                 var caret = d3_select(parent).selectAll('.combobox-caret')
                     .filter(function(d) { return d === input.node(); })
                     .data([input.node()]);
 
                 caret = caret.enter()
-                  .insert('div', function() { return sibling; })
+                    .insert('div', function() { return sibling; })
                     .attr('class', 'combobox-caret')
-                  .merge(caret);
+                    .merge(caret);
 
                 caret
                     .on('mousedown', function () {
@@ -58047,7 +59934,7 @@ function d3combobox() {
 
         function show() {
             if (!shown) {
-                wrapper = container
+                wrapper = _container
                     .insert('div', ':first-child')
                     .datum(input.node())
                     .attr('class', 'combobox')
@@ -58142,17 +60029,17 @@ function d3combobox() {
         }
 
         function nav(dir) {
-            if (!suggestions.length) return;
-            idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0);
-            input.property('value', suggestions[idx].value);
+            if (!_suggestions.length) return;
+            idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
+            input.property('value', _suggestions[idx].value);
             render();
             ensureVisible();
         }
 
         function value() {
-            var value = input.property('value'),
-                start = input.property('selectionStart'),
-                end = input.property('selectionEnd');
+            var value = input.property('value');
+            var start = input.property('selectionStart');
+            var end = input.property('selectionEnd');
 
             if (start && end) {
                 value = value.substring(0, start);
@@ -58162,32 +60049,45 @@ function d3combobox() {
         }
 
         function fetch(v, cb) {
-            fetcher.call(input, v, function(_) {
-                suggestions = _;
+            _fetcher.call(input, v, function(_) {
+                _suggestions = _;
                 cb();
             });
         }
 
         function autocomplete() {
-            var v = caseSensitive ? value() : value().toLowerCase();
+            var v = _caseSensitive ? value() : value().toLowerCase();
             idx = -1;
             if (!v) return;
 
-            for (var i = 0; i < suggestions.length; i++) {
-                var suggestion = suggestions[i].value,
-                    compare = caseSensitive ? suggestion : suggestion.toLowerCase();
+            var best = -1;
+            var suggestion, compare;
 
-                if (compare.indexOf(v) === 0) {
-                    idx = i;
-                    input.property('value', suggestion);
-                    input.node().setSelectionRange(v.length, suggestion.length);
-                    return;
+            for (var i = 0; i < _suggestions.length; i++) {
+                suggestion = _suggestions[i].value;
+                compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
+
+                // if search string matches suggestion exactly, pick it..
+                if (compare === v) {
+                    best = i;
+                    break;
+
+                // otherwise lock in the first result that starts with the search string..
+                } else if (best === -1 && compare.indexOf(v) === 0) {
+                    best = i;
                 }
             }
+
+            if (best !== -1) {
+                idx = best;
+                suggestion = _suggestions[best].value;
+                input.property('value', suggestion);
+                input.node().setSelectionRange(v.length, suggestion.length);
+            }
         }
 
         function render() {
-            if (suggestions.length >= minItems && document.activeElement === input.node()) {
+            if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
                 show();
             } else {
                 hide();
@@ -58196,7 +60096,7 @@ function d3combobox() {
 
             var options = wrapper
                 .selectAll('a.combobox-option')
-                .data(suggestions, function(d) { return d.value; });
+                .data(_suggestions, function(d) { return d.value; });
 
             options.exit()
                 .remove();
@@ -58213,8 +60113,8 @@ function d3combobox() {
                 .order();
 
 
-            var node = attachTo ? attachTo.node() : input.node(),
-                rect = node.getBoundingClientRect();
+            var node = attachTo ? attachTo.node() : input.node();
+            var rect = node.getBoundingClientRect();
 
             wrapper
                 .style('left', rect.left + 'px')
@@ -58242,32 +60142,32 @@ function d3combobox() {
     };
 
     combobox.fetcher = function(_) {
-        if (!arguments.length) return fetcher;
-        fetcher = _;
+        if (!arguments.length) return _fetcher;
+        _fetcher = _;
         return combobox;
     };
 
     combobox.data = function(_) {
-        if (!arguments.length) return data;
-        data = _;
+        if (!arguments.length) return _data;
+        _data = _;
         return combobox;
     };
 
     combobox.minItems = function(_) {
-        if (!arguments.length) return minItems;
-        minItems = _;
+        if (!arguments.length) return _minItems;
+        _minItems = _;
         return combobox;
     };
 
     combobox.caseSensitive = function(_) {
-        if (!arguments.length) return caseSensitive;
-        caseSensitive = _;
+        if (!arguments.length) return _caseSensitive;
+        _caseSensitive = _;
         return combobox;
     };
 
     combobox.container = function(_) {
-        if (!arguments.length) return container;
-        container = _;
+        if (!arguments.length) return _container;
+        _container = _;
         return combobox;
     };
 
@@ -58292,77 +60192,9 @@ d3combobox.off = function(input) {
         .on('scroll.combobox', null);
 };
 
-function uiDisclosure() {
-    var dispatch$$1 = dispatch('toggled'),
-        title,
-        expanded = false,
-        content = function () {};
-
-
-    var disclosure = function(selection) {
-        var hideToggle = selection.selectAll('.hide-toggle')
-            .data([0]);
-
-        hideToggle = hideToggle.enter()
-            .append('a')
-            .attr('href', '#')
-            .attr('class', 'hide-toggle')
-            .merge(hideToggle);
-
-        hideToggle
-            .text(title)
-            .on('click', toggle)
-            .classed('expanded', expanded);
-
-
-        var wrap = selection.selectAll('div')
-            .data([0]);
-
-        wrap = wrap.enter()
-            .append('div')
-            .merge(wrap);
-
-        wrap
-            .classed('hide', !expanded)
-            .call(content);
-
-
-        function toggle() {
-            expanded = !expanded;
-            hideToggle.classed('expanded', expanded);
-            wrap.call(uiToggle(expanded));
-            dispatch$$1.call('toggled', this, expanded);
-        }
-    };
-
-
-    disclosure.title = function(_) {
-        if (!arguments.length) return title;
-        title = _;
-        return disclosure;
-    };
-
-
-    disclosure.expanded = function(_) {
-        if (!arguments.length) return expanded;
-        expanded = _;
-        return disclosure;
-    };
-
-
-    disclosure.content = function(_) {
-        if (!arguments.length) return content;
-        content = _;
-        return disclosure;
-    };
-
-
-    return utilRebind(disclosure, dispatch$$1, 'on');
-}
-
 function uiRawMemberEditor(context) {
-    var id,
-        taginfo = services.taginfo;
+    var taginfo = services.taginfo,
+        _entityID;
 
 
     function selectMember(d) {
@@ -58394,7 +60226,7 @@ function uiRawMemberEditor(context) {
 
 
     function rawMemberEditor(selection) {
-        var entity = context.entity(id),
+        var entity = context.entity(_entityID),
             memberships = [];
 
         entity.members.slice(0, 1000).forEach(function(member, index) {
@@ -58409,21 +60241,17 @@ function uiRawMemberEditor(context) {
         });
 
         var gt = entity.members.length > 1000 ? '>' : '';
-        selection.call(uiDisclosure()
+        selection.call(uiDisclosure(context, 'raw_member_editor', true)
             .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
             .expanded(true)
-            .on('toggled', toggled)
+            .updatePreference(false)
+            .on('toggled', function(expanded) {
+                if (expanded) { selection.node().parentNode.scrollTop += 200; }
+            })
             .content(content)
         );
 
 
-        function toggled(expanded) {
-            if (expanded) {
-                selection.node().parentNode.scrollTop += 200;
-            }
-        }
-
-
         function content(wrap) {
             var list = wrap.selectAll('.member-list')
                 .data([0]);
@@ -58542,8 +60370,8 @@ function uiRawMemberEditor(context) {
 
 
     rawMemberEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
+        if (!arguments.length) return _entityID;
+        _entityID = _;
         return rawMemberEditor;
     };
 
@@ -58553,7 +60381,8 @@ function uiRawMemberEditor(context) {
 
 function uiRawMembershipEditor(context) {
     var taginfo = services.taginfo,
-        id, showBlank;
+        _entityID,
+        _showBlank;
 
 
     function selectRelation(d) {
@@ -58572,11 +60401,13 @@ function uiRawMembershipEditor(context) {
 
 
     function addMembership(d, role) {
-        showBlank = false;
+        _showBlank = false;
+
+        var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
 
         if (d.relation) {
             context.perform(
-                actionAddMember(d.relation.id, { id: id, type: context.entity(id).type, role: role }),
+                actionAddMember(d.relation.id, member),
                 t('operations.add_member.annotation')
             );
 
@@ -58584,7 +60415,7 @@ function uiRawMembershipEditor(context) {
             var relation = osmRelation();
             context.perform(
                 actionAddEntity(relation),
-                actionAddMember(relation.id, { id: id, type: context.entity(id).type, role: role }),
+                actionAddMember(relation.id, member),
                 t('operations.add.annotation.relation')
             );
 
@@ -58602,15 +60433,12 @@ function uiRawMembershipEditor(context) {
 
 
     function relations(q) {
-        var newRelation = {
-                relation: null,
-                value: t('inspector.new_relation')
-            },
-            result = [],
-            graph = context.graph();
+        var newRelation = { relation: null, value: t('inspector.new_relation') };
+        var result = [];
+        var graph = context.graph();
 
         context.intersects(context.extent()).forEach(function(entity) {
-            if (entity.type !== 'relation' || entity.id === id)
+            if (entity.type !== 'relation' || entity.id === _entityID)
                 return;
 
             var matched = context.presets().match(entity, graph),
@@ -58621,10 +60449,7 @@ function uiRawMembershipEditor(context) {
             if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
                 return;
 
-            result.push({
-                relation: entity,
-                value: value
-            });
+            result.push({ relation: entity, value: value });
         });
 
         result.sort(function(a, b) {
@@ -58643,13 +60468,17 @@ function uiRawMembershipEditor(context) {
             });
         });
 
+        forEach(result, function(obj) {
+            obj.title = obj.value;
+        });
+
         result.unshift(newRelation);
         return result;
     }
 
 
     function rawMembershipEditor(selection) {
-        var entity = context.entity(id),
+        var entity = context.entity(_entityID),
             parents = context.graph().parentRelations(entity),
             memberships = [];
 
@@ -58662,21 +60491,17 @@ function uiRawMembershipEditor(context) {
         });
 
         var gt = parents.length > 1000 ? '>' : '';
-        selection.call(uiDisclosure()
+        selection.call(uiDisclosure(context, 'raw_membership_editor', true)
             .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
             .expanded(true)
-            .on('toggled', toggled)
+            .updatePreference(false)
+            .on('toggled', function(expanded) {
+                if (expanded) { selection.node().parentNode.scrollTop += 200; }
+            })
             .content(content)
         );
 
 
-        function toggled(expanded) {
-            if (expanded) {
-                selection.node().parentNode.scrollTop += 200;
-            }
-        }
-
-
         function content(wrap) {
             var list = wrap.selectAll('.member-list')
                 .data([0]);
@@ -58743,7 +60568,7 @@ function uiRawMembershipEditor(context) {
 
 
             var newrow = list.selectAll('.member-row-new')
-                .data(showBlank ? [0] : []);
+                .data(_showBlank ? [0] : []);
 
             newrow.exit()
                 .remove();
@@ -58797,7 +60622,7 @@ function uiRawMembershipEditor(context) {
             addrel
                 .call(svgIcon('#icon-plus', 'light'))
                 .on('click', function() {
-                    showBlank = true;
+                    _showBlank = true;
                     content(wrap);
                     list.selectAll('.member-entity-input').node().focus();
                 });
@@ -58833,7 +60658,7 @@ function uiRawMembershipEditor(context) {
                         taginfo.roles({
                             debounce: true,
                             rtype: rtype || '',
-                            geometry: context.geometry(id),
+                            geometry: context.geometry(_entityID),
                             query: role
                         }, function(err, data) {
                             if (!err) callback(sort(role, data));
@@ -58853,8 +60678,8 @@ function uiRawMembershipEditor(context) {
 
 
     rawMembershipEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
+        if (!arguments.length) return _entityID;
+        _entityID = _;
         return rawMembershipEditor;
     };
 
@@ -59061,34 +60886,36 @@ function uiTagReference(tag) {
 function uiRawTagEditor(context) {
     var taginfo = services.taginfo,
         dispatch$$1 = dispatch('change'),
-        expandedPreference = (context.storage('raw_tag_editor.expanded') === 'true'),
-        expandedCurrent = expandedPreference,
-        updatePreference = true,
-        readOnlyTags = [],
-        showBlank = false,
-        newRow,
-        state,
-        preset,
-        tags,
-        id;
+        _readOnlyTags = [],
+        _showBlank = false,
+        _updatePreference = true,
+        _expanded = false,
+        _newRow,
+        _state,
+        _preset,
+        _tags,
+        _entityID;
 
 
     function rawTagEditor(selection) {
-        var count = Object.keys(tags).filter(function(d) { return d; }).length;
+        var count = Object.keys(_tags).filter(function(d) { return d; }).length;
 
-        selection.call(uiDisclosure()
+        var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
             .title(t('inspector.all_tags') + ' (' + count + ')')
-            .expanded(expandedCurrent)
             .on('toggled', toggled)
-            .content(content)
-        );
+            .updatePreference(_updatePreference)
+            .content(content);
+
+        // Sometimes we want to force the raw_tag_editor to be opened/closed..
+        // When undefined, uiDisclosure will use the user's stored preference.
+        if (_expanded !== undefined) {
+            disclosure.expanded(_expanded);
+        }
+
+        selection.call(disclosure);
 
         function toggled(expanded) {
-            expandedCurrent = expanded;
-            if (updatePreference) {
-                expandedPreference = expanded;
-                context.storage('raw_tag_editor.expanded', expanded);
-            }
+            _expanded = expanded;
             if (expanded) {
                 selection.node().parentNode.scrollTop += 200;
             }
@@ -59097,14 +60924,14 @@ function uiRawTagEditor(context) {
 
 
     function content(wrap) {
-        var entries = map$4(tags, function(v, k) {
+        var entries = map$4(_tags, function(v, k) {
             return { key: k, value: v };
         });
 
-        if (!entries.length || showBlank) {
-            showBlank = false;
+        if (!entries.length || _showBlank) {
+            _showBlank = false;
             entries.push({key: '', value: ''});
-            newRow = '';
+            _newRow = '';
         }
 
         var list = wrap.selectAll('.tag-list')
@@ -59174,8 +61001,8 @@ function uiRawTagEditor(context) {
         items = items
             .merge(enter)
             .sort(function(a, b) {
-                return (a.key === newRow && b.key !== newRow) ? 1
-                    : (a.key !== newRow && b.key === newRow) ? -1
+                return (a.key === _newRow && b.key !== _newRow) ? 1
+                    : (a.key !== _newRow && b.key === _newRow) ? -1
                     : d3_ascending(a.key, b.key);
             });
 
@@ -59185,11 +61012,11 @@ function uiRawTagEditor(context) {
                     key = row.select('input.key'),      // propagate bound data to child
                     value = row.select('input.value');  // propagate bound data to child
 
-                if (id && taginfo) {
+                if (_entityID && taginfo) {
                     bindTypeahead(key, value);
                 }
 
-                var isRelation = (id && context.entity(id).type === 'relation'),
+                var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
                     reference;
 
                 if (isRelation && tag.key === 'type') {
@@ -59198,7 +61025,7 @@ function uiRawTagEditor(context) {
                     reference = uiTagReference({ key: tag.key, value: tag.value }, context);
                 }
 
-                if (state === 'hover') {
+                if (_state === 'hover') {
                     reference.showing(false);
                 }
 
@@ -59223,8 +61050,8 @@ function uiRawTagEditor(context) {
 
 
         function isReadOnly(d) {
-            for (var i = 0; i < readOnlyTags.length; i++) {
-                if (d.key.match(readOnlyTags[i]) !== null) {
+            for (var i = 0; i < _readOnlyTags.length; i++) {
+                if (d.key.match(_readOnlyTags[i]) !== null) {
                     return true;
                 }
             }
@@ -59242,7 +61069,7 @@ function uiRawTagEditor(context) {
 
         function bindTypeahead(key, value) {
             if (isReadOnly({ key: key })) return;
-            var geometry = context.geometry(id);
+            var geometry = context.geometry(_entityID);
 
             key.call(d3combobox()
                 .container(context.container())
@@ -59311,7 +61138,7 @@ function uiRawTagEditor(context) {
                 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
                     base = match[1],
                     suffix = +(match[2] || 1);
-                while (tags[kNew]) {  // rename key if already in use
+                while (_tags[kNew]) {  // rename key if already in use
                     kNew = base + '_' + suffix++;
                 }
             }
@@ -59320,8 +61147,8 @@ function uiRawTagEditor(context) {
 
             d.key = kNew; // Maintain DOM identity through the subsequent update.
 
-            if (newRow === kOld) {  // see if this row is still a new row
-                newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
+            if (_newRow === kOld) {  // see if this row is still a new row
+                _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
             }
 
             this.value = kNew;
@@ -59334,8 +61161,8 @@ function uiRawTagEditor(context) {
             var tag = {};
             tag[d.key] = this.value;
 
-            if (newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
-                newRow = undefined;
+            if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
+                _newRow = undefined;
             }
 
             dispatch$$1.call('change', this, tag);
@@ -59356,7 +61183,7 @@ function uiRawTagEditor(context) {
             // handler. Without the setTimeout, the call to `content` would
             // wipe out the pending value change.
             setTimeout(function() {
-                showBlank = true;
+                _showBlank = true;
                 content(wrap);
                 list.selectAll('li:last-child input.key').node().focus();
             }, 0);
@@ -59365,51 +61192,51 @@ function uiRawTagEditor(context) {
 
 
     rawTagEditor.state = function(_) {
-        if (!arguments.length) return state;
-        state = _;
+        if (!arguments.length) return _state;
+        _state = _;
         return rawTagEditor;
     };
 
 
     rawTagEditor.preset = function(_) {
-        if (!arguments.length) return preset;
-        preset = _;
-        if (preset.isFallback()) {
-            expandedCurrent = true;
-            updatePreference = false;
+        if (!arguments.length) return _preset;
+        _preset = _;
+        if (_preset.isFallback()) {
+            _expanded = true;
+            _updatePreference = false;
         } else {
-            expandedCurrent = expandedPreference;
-            updatePreference = true;
+            _expanded = undefined;
+            _updatePreference = true;
         }
         return rawTagEditor;
     };
 
 
     rawTagEditor.tags = function(_) {
-        if (!arguments.length) return tags;
-        tags = _;
+        if (!arguments.length) return _tags;
+        _tags = _;
         return rawTagEditor;
     };
 
 
     rawTagEditor.entityID = function(_) {
-        if (!arguments.length) return id;
-        id = _;
+        if (!arguments.length) return _entityID;
+        _entityID = _;
         return rawTagEditor;
     };
 
 
     rawTagEditor.expanded = function(_) {
-        if (!arguments.length) return expandedCurrent;
-        expandedCurrent = _;
-        updatePreference = false;
+        if (!arguments.length) return _expanded;
+        _expanded = _;
+        _updatePreference = false;
         return rawTagEditor;
     };
 
 
     rawTagEditor.readOnlyTags = function(_) {
-        if (!arguments.length) return readOnlyTags;
-        readOnlyTags = _;
+        if (!arguments.length) return _readOnlyTags;
+        _readOnlyTags = _;
         return rawTagEditor;
     };
 
@@ -59418,17 +61245,19 @@ function uiRawTagEditor(context) {
 }
 
 function uiFieldCheck(field, context) {
-    var dispatch$$1 = dispatch('change'),
-        options = field.strings && field.strings.options,
-        values = [],
-        texts = [],
-        input = d3_select(null),
-        text = d3_select(null),
-        label = d3_select(null),
-        reverser = d3_select(null),
-        impliedYes,
-        entityId,
-        value;
+    var dispatch$$1 = dispatch('change');
+    var options = field.strings && field.strings.options;
+    var values = [];
+    var texts = [];
+
+    var input = d3_select(null);
+    var text = d3_select(null);
+    var label = d3_select(null);
+    var reverser = d3_select(null);
+
+    var _impliedYes;
+    var _entityID;
+    var _value;
 
 
     if (options) {
@@ -59448,15 +61277,15 @@ function uiFieldCheck(field, context) {
 
     // Checks tags to see whether an undefined value is "Assumed to be Yes"
     function checkImpliedYes() {
-        impliedYes = (field.id === 'oneway_yes');
+        _impliedYes = (field.id === 'oneway_yes');
 
         // hack: pretend `oneway` field is a `oneway_yes` field
         // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
         if (field.id === 'oneway') {
-            var entity = context.entity(entityId);
+            var entity = context.entity(_entityID);
             for (var key in entity.tags) {
                 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
-                    impliedYes = true;
+                    _impliedYes = true;
                     texts[0] = t('presets.fields.oneway_yes.options.undefined');
                     break;
                 }
@@ -59467,18 +61296,18 @@ function uiFieldCheck(field, context) {
 
     function reverserHidden() {
         if (!d3_select('div.inspector-hover').empty()) return true;
-        return !(value === 'yes' || (impliedYes && !value));
+        return !(_value === 'yes' || (_impliedYes && !_value));
     }
 
 
     function reverserSetText(selection) {
-        var entity = context.hasEntity(entityId);
+        var entity = context.hasEntity(_entityID);
         if (reverserHidden() || !entity) return selection;
 
-        var first = entity.first(),
-            last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last(),
-            pseudoDirection = first < last,
-            icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
+        var first = entity.first();
+        var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
+        var pseudoDirection = first < last;
+        var icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
 
         selection.selectAll('.reverser-span')
             .text(t('inspector.check.reverser'))
@@ -59527,7 +61356,7 @@ function uiFieldCheck(field, context) {
         input
             .on('click', function() {
                 var t$$1 = {};
-                t$$1[field.key] = values[(values.indexOf(value) + 1) % values.length];
+                t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
                 dispatch$$1.call('change', this, t$$1);
                 event.stopPropagation();
             });
@@ -59541,7 +61370,7 @@ function uiFieldCheck(field, context) {
                     event.preventDefault();
                     event.stopPropagation();
                     context.perform(
-                        actionReverse(entityId),
+                        actionReverse(_entityID),
                         t('operations.reverse.annotation')
                     );
                     d3_select(this)
@@ -59552,29 +61381,40 @@ function uiFieldCheck(field, context) {
 
 
     check.entity = function(_) {
-        if (!arguments.length) return context.hasEntity(entityId);
-        entityId = _.id;
+        if (!arguments.length) return context.hasEntity(_entityID);
+        _entityID = _.id;
         return check;
     };
 
 
     check.tags = function(tags) {
+
+        function isChecked(val) {
+            return val !== 'no' && val !== '' && val !== undefined && val !== null;
+        }
+
+        function textFor(val) {
+            if (val === '') val = undefined;
+            var index = values.indexOf(val);
+            return (index !== -1 ? texts[index] : ('"' + val + '"'));
+        }
+
         checkImpliedYes();
-        value = tags[field.key] && tags[field.key].toLowerCase();
+        _value = tags[field.key] && tags[field.key].toLowerCase();
 
-        if (field.type === 'onewayCheck' && (value === '1' || value === '-1')) {
-            value = 'yes';
+        if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
+            _value = 'yes';
         }
 
         input
-            .property('indeterminate', field.type !== 'defaultCheck' && !value)
-            .property('checked', value === 'yes');
+            .property('indeterminate', field.type !== 'defaultCheck' && !_value)
+            .property('checked', isChecked(_value));
 
         text
-            .text(texts[values.indexOf(value)]);
+            .text(textFor(_value));
 
         label
-            .classed('set', !!value);
+            .classed('set', !!_value);
 
         if (field.type === 'onewayCheck') {
             reverser
@@ -59683,8 +61523,10 @@ function uiFieldCombo(field, context) {
         optstrings = field.strings && field.strings.options,
         optarray = field.options,
         snake_case = (field.snake_case || (field.snake_case === undefined)),
+        caseSensitive = field.caseSensitive,
         combobox = d3combobox()
             .container(context.container())
+            .caseSensitive(caseSensitive)
             .minItems(isMulti || isSemi ? 1 : 2),
         comboData = [],
         multiData = [],
@@ -60875,7 +62717,7 @@ function uiFieldLanes(field, context) {
 
 function uiFieldLocalized(field, context) {
     var dispatch$$1 = dispatch('change', 'input'),
-        wikipedia$$1 = services.wikipedia,
+        wikipedia = services.wikipedia,
         input = d3_select(null),
         localizedInputs = d3_select(null),
         wikiTitles,
@@ -60967,7 +62809,7 @@ function uiFieldLocalized(field, context) {
     function changeLang(d) {
         var lang = utilGetSetValue(d3_select(this)),
             t$$1 = {},
-            language = find$1(wikipedia, function(d) {
+            language = find$1(wikipedia$2, function(d) {
                 return d[0].toLowerCase() === lang.toLowerCase() ||
                     d[1].toLowerCase() === lang.toLowerCase();
             });
@@ -61003,7 +62845,7 @@ function uiFieldLocalized(field, context) {
     function fetcher(value, cb) {
         var v = value.toLowerCase();
 
-        cb(wikipedia.filter(function(d) {
+        cb(wikipedia$2.filter(function(d) {
             return d[0].toLowerCase().indexOf(v) >= 0 ||
             d[1].toLowerCase().indexOf(v) >= 0 ||
             d[2].toLowerCase().indexOf(v) >= 0;
@@ -61097,7 +62939,7 @@ function uiFieldLocalized(field, context) {
         var entry = selection.selectAll('.entry');
 
         utilGetSetValue(entry.select('.localized-lang'), function(d) {
-                var lang = find$1(wikipedia, function(lang) { return lang[2] === d.lang; });
+                var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
                 return lang ? lang[1] : d.lang;
             });
 
@@ -61112,7 +62954,7 @@ function uiFieldLocalized(field, context) {
             wikiTitles = {};
             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
             if (wm && wm[0] && wm[1]) {
-                wikipedia$$1.translations(wm[1], wm[2], function(d) {
+                wikipedia.translations(wm[1], wm[2], function(d) {
                     wikiTitles = d;
                 });
             }
@@ -61693,12 +63535,12 @@ function uiFieldRadio(field, context) {
 }
 
 function uiFieldRestrictions(field, context) {
-    var dispatch$$1 = dispatch('change'),
-        breathe = behaviorBreathe(context),
-        hover = behaviorHover(context),
-        initialized = false,
-        vertexID,
-        fromNodeID;
+    var dispatch$$1 = dispatch('change');
+    var breathe = behaviorBreathe(context);
+    var hover = behaviorHover(context);
+    var initialized = false;
+    var vertexID;
+    var fromNodeID;
 
 
     function restrictions(selection) {
@@ -61720,19 +63562,18 @@ function uiFieldRestrictions(field, context) {
             .attr('class', 'restriction-help');
 
 
-        var intersection = osmIntersection(context.graph(), vertexID),
-            graph = intersection.graph,
-            vertex = graph.entity(vertexID),
-            filter = utilFunctor(true),
-            extent = geoExtent(),
-            projection = geoRawMercator();
+        var intersection = osmIntersection(context.graph(), vertexID);
+        var graph = intersection.graph;
+        var vertex = graph.entity(vertexID);
+        var filter = utilFunctor(true);
+        var projection = geoRawMercator();
 
-        var d = utilGetDimensions(wrap.merge(enter)),
-            c = [d[0] / 2, d[1] / 2],
-            z = 24;
+        var d = utilGetDimensions(wrap.merge(enter));
+        var c = [d[0] / 2, d[1] / 2];
+        var z = 24;
 
         projection
-            .scale(256 * Math.pow(2, z) / (2 * Math.PI));
+            .scale(geoZoomToScale(z));
 
         var s = projection(vertex.loc);
 
@@ -61740,10 +63581,12 @@ function uiFieldRestrictions(field, context) {
             .translate([c[0] - s[0], c[1] - s[1]])
             .clipExtent([[0, 0], d]);
 
-        var drawLayers = svgLayers(projection, context).only('osm').dimensions(d),
-            drawVertices = svgVertices(projection, context),
-            drawLines = svgLines(projection, context),
-            drawTurns = svgTurns(projection, context);
+        var extent = geoExtent(projection.invert([0, d[1]]), projection.invert([d[0], 0]));
+
+        var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
+        var drawVertices = svgVertices(projection, context);
+        var drawLines = svgLines(projection, context);
+        var drawTurns = svgTurns(projection, context);
 
         enter
             .call(drawLayers);
@@ -61762,7 +63605,7 @@ function uiFieldRestrictions(field, context) {
 
         surface
             .call(utilSetDimensions, d)
-            .call(drawVertices, graph, [vertex], filter, extent, z)
+            .call(drawVertices, graph, [vertex], filter, extent, true)
             .call(drawLines, graph, intersection.ways, filter)
             .call(drawTurns, graph, intersection.turns(fromNodeID));
 
@@ -61799,9 +63642,13 @@ function uiFieldRestrictions(field, context) {
                 .call(breathe);
 
             var datum = event.target.__data__;
+            var entity = datum && datum.properties && datum.properties.entity;
+            if (entity) datum = entity;
+
             if (datum instanceof osmEntity) {
                 fromNodeID = intersection.adjacentNodeId(datum.id);
                 render();
+
             } else if (datum instanceof osmTurn) {
                 if (datum.restriction) {
                     context.perform(
@@ -61821,9 +63668,9 @@ function uiFieldRestrictions(field, context) {
         function mouseover() {
             var datum = event.target.__data__;
             if (datum instanceof osmTurn) {
-                var graph = context.graph(),
-                    presets = context.presets(),
-                    preset;
+                var graph = context.graph();
+                var presets = context.presets();
+                var preset;
 
                 if (datum.restriction) {
                     preset = presets.match(graph.entity(datum.restriction), graph);
@@ -61943,7 +63790,7 @@ function uiFieldTextarea(field) {
 
 function uiFieldWikipedia(field, context) {
     var dispatch$$1 = dispatch('change'),
-        wikipedia$$1 = services.wikipedia,
+        wikipedia = services.wikipedia,
         wikidata = services.wikidata,
         link = d3_select(null),
         lang = d3_select(null),
@@ -61958,7 +63805,7 @@ function uiFieldWikipedia(field, context) {
             .fetcher(function(value, cb) {
                 var v = value.toLowerCase();
 
-                cb(wikipedia.filter(function(d) {
+                cb(wikipedia$2.filter(function(d) {
                     return d[0].toLowerCase().indexOf(v) >= 0 ||
                         d[1].toLowerCase().indexOf(v) >= 0 ||
                         d[2].toLowerCase().indexOf(v) >= 0;
@@ -61974,7 +63821,7 @@ function uiFieldWikipedia(field, context) {
                     value = context.entity(entity.id).tags.name || '';
                 }
 
-                var searchfn = value.length > 7 ? wikipedia$$1.search : wikipedia$$1.suggestions;
+                var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
                 searchfn(language()[2], value, function(query, data$$1) {
                     cb(data$$1.map(function(d) {
                         return { value: d };
@@ -62041,7 +63888,7 @@ function uiFieldWikipedia(field, context) {
         var value = utilGetSetValue(lang).toLowerCase();
         var locale = utilDetect().locale.toLowerCase();
         var localeLanguage;
-        return find$1(wikipedia, function(d) {
+        return find$1(wikipedia$2, function(d) {
             if (d[2] === locale) localeLanguage = d;
             return d[0].toLowerCase() === value ||
                 d[1].toLowerCase() === value ||
@@ -62064,7 +63911,7 @@ function uiFieldWikipedia(field, context) {
     function change(skipWikidata) {
         var value = utilGetSetValue(title),
             m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
-            l = m && find$1(wikipedia, function(d) { return m[1] === d[2]; }),
+            l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
             syncTags = {};
 
         if (l) {
@@ -62128,7 +63975,7 @@ function uiFieldWikipedia(field, context) {
     wiki.tags = function(tags) {
         var value = tags[field.key] || '',
             m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
-            l = m && find$1(wikipedia, function(d) { return m[1] === d[2]; }),
+            l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
             anchor = m && m[3];
 
         // value in correct format
@@ -62512,7 +64359,6 @@ function uiFormFields(context) {
 function uiPresetEditor(context) {
     var dispatch$$1 = dispatch('change'),
         formFields = uiFormFields(context),
-        expandedPreference = (context.storage('preset_fields.expanded') !== 'false'),
         state,
         fieldsArr,
         preset,
@@ -62521,17 +64367,10 @@ function uiPresetEditor(context) {
 
 
     function presetEditor(selection) {
-        selection.call(uiDisclosure()
+        selection.call(uiDisclosure(context, 'preset_fields', true)
             .title(t('inspector.all_fields'))
-            .expanded(expandedPreference)
-            .on('toggled', toggled)
             .content(render)
         );
-
-        function toggled(expanded) {
-            expandedPreference = expanded;
-            context.storage('preset_fields.expanded', expanded);
-        }
     }
 
 
@@ -63634,7 +65473,8 @@ function uiUndoRedo(context) {
 
 
     function editable() {
-        return context.editable() && context.mode().id !== 'save';
+        var mode = context.mode();
+        return context.editable() && mode && mode.id !== 'save';
     }
 
 
@@ -64563,9 +66403,9 @@ function uiCommitWarnings(context) {
     return commitWarnings;
 }
 
-var changeset;
+var _changeset$1;
 var readOnlyTags = [
-    /^changesets_count$/,
+    /^_changesets_count$/,
     /^created_by$/,
     /^ideditor:/,
     /^imagery_used$/,
@@ -64579,9 +66419,9 @@ var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`
 
 
 function uiCommit(context) {
-    var dispatch$$1 = dispatch('cancel', 'save'),
-        userDetails,
-        _selection;
+    var dispatch$$1 = dispatch('cancel', 'save');
+    var _userDetails;
+    var _selection;
 
     var changesetEditor = uiChangesetEditor(context)
         .on('change', changeTags);
@@ -64598,16 +66438,16 @@ function uiCommit(context) {
         if (!osm) return;
 
         // expire stored comment and hashtags after cutoff datetime - #3947
-        var commentDate = +context.storage('commentDate') || 0,
-            currDate = Date.now(),
-            cutoff = 2 * 86400 * 1000;   // 2 days
+        var commentDate = +context.storage('commentDate') || 0;
+        var currDate = Date.now();
+        var cutoff = 2 * 86400 * 1000;   // 2 days
         if (commentDate > currDate || currDate - commentDate > cutoff) {
             context.storage('comment', null);
             context.storage('hashtags', null);
         }
 
         var tags;
-        if (!changeset) {
+        if (!_changeset$1) {
             var detected = utilDetect();
             tags = {
                 comment: context.storage('comment') || '',
@@ -64625,12 +66465,12 @@ function uiCommit(context) {
                 tags.hashtags = hashtags;
             }
 
-            changeset = new osmChangeset({ tags: tags });
+            _changeset$1 = new osmChangeset({ tags: tags });
         }
 
-        tags = clone(changeset.tags);
+        tags = clone(_changeset$1.tags);
         tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
-        changeset = changeset.update({ tags: tags });
+        _changeset$1 = _changeset$1.update({ tags: tags });
 
         var header = selection.selectAll('.header')
             .data([0]);
@@ -64661,7 +66501,7 @@ function uiCommit(context) {
 
         changesetSection
             .call(changesetEditor
-                .changesetID(changeset.id)
+                .changesetID(_changeset$1.id)
                 .tags(tags)
             );
 
@@ -64693,7 +66533,7 @@ function uiCommit(context) {
 
             var userLink = d3_select(document.createElement('div'));
 
-            userDetails = user;
+            _userDetails = user;
 
             if (user.image_url) {
                 userLink
@@ -64742,7 +66582,7 @@ function uiCommit(context) {
             .merge(requestReviewEnter);
 
         var requestReviewInput = requestReview.selectAll('input')
-            .property('checked', isReviewRequested(changeset.tags))
+            .property('checked', isReviewRequested(_changeset$1.tags))
             .on('change', toggleRequestReview);
 
 
@@ -64785,7 +66625,8 @@ function uiCommit(context) {
                 return (n && n.value.length) ? null : true;
             })
             .on('click.save', function() {
-                dispatch$$1.call('save', this, changeset);
+                this.blur();    // avoid keeping focus on the button - #4641
+                dispatch$$1.call('save', this, _changeset$1);
             });
 
 
@@ -64803,7 +66644,7 @@ function uiCommit(context) {
             .call(rawTagEditor
                 .expanded(expanded)
                 .readOnlyTags(readOnlyTags)
-                .tags(clone(changeset.tags))
+                .tags(clone(_changeset$1.tags))
             );
 
 
@@ -64816,12 +66657,11 @@ function uiCommit(context) {
             updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
 
             var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
-
             tagSection
                 .call(rawTagEditor
                     .expanded(expanded)
                     .readOnlyTags(readOnlyTags)
-                    .tags(clone(changeset.tags))
+                    .tags(clone(_changeset$1.tags))
                 );
         }
     }
@@ -64847,8 +66687,8 @@ function uiCommit(context) {
 
 
     function findHashtags(tags, commentOnly) {
-        var inComment = commentTags(),
-            inHashTags = hashTags();
+        var inComment = commentTags();
+        var inHashTags = hashTags();
 
         if (inComment !== null) {                    // when hashtags are detected in comment...
             context.storage('hashtags', null);       // always remove stored hashtags - #4304
@@ -64888,7 +66728,7 @@ function uiCommit(context) {
 
 
     function updateChangeset(changed, onInput) {
-        var tags = clone(changeset.tags);
+        var tags = clone(_changeset$1.tags);
 
         forEach(changed, function(v, k) {
             k = k.trim().substr(0, 255);
@@ -64919,8 +66759,8 @@ function uiCommit(context) {
         }
 
         // always update userdetails, just in case user reauthenticates as someone else
-        if (userDetails && userDetails.changesets_count !== undefined) {
-            var changesetsCount = parseInt(userDetails.changesets_count, 10) + 1;  // #4283
+        if (_userDetails && _userDetails.changesets_count !== undefined) {
+            var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
             tags.changesets_count = String(changesetsCount);
 
             // first 100 edits - new user
@@ -64945,14 +66785,14 @@ function uiCommit(context) {
             delete tags.changesets_count;
         }
 
-        if (!isEqual(changeset.tags, tags)) {
-            changeset = changeset.update({ tags: tags });
+        if (!isEqual(_changeset$1.tags, tags)) {
+            _changeset$1 = _changeset$1.update({ tags: tags });
         }
     }
 
 
     commit.reset = function() {
-        changeset = null;
+        _changeset$1 = null;
     };
 
 
@@ -64984,7 +66824,9 @@ function uiConfirm(selection) {
             .on('click.confirm', function() {
                 modalSelection.remove();
             })
-            .text(t('confirm.okay'));
+            .text(t('confirm.okay'))
+            .node()
+            .focus();
 
         return modalSelection;
     };
@@ -64994,49 +66836,75 @@ function uiConfirm(selection) {
 }
 
 function uiConflicts(context) {
-    var dispatch$$1 = dispatch('cancel', 'save'),
-        origChanges,
-        conflictList;
+    var dispatch$$1 = dispatch('cancel', 'save');
+    var keybinding = d3keybinding('conflicts');
+    var _origChanges;
+    var _conflictList;
+
+
+    function keybindingOn() {
+        d3_select(document)
+            .call(keybinding.on('⎋', cancel, true));
+    }
+
+    function keybindingOff() {
+        d3_select(document)
+            .call(keybinding.off);
+    }
+
+    function tryAgain() {
+        keybindingOff();
+        dispatch$$1.call('save');
+    }
+
+    function cancel() {
+        keybindingOff();
+        dispatch$$1.call('cancel');
+    }
 
 
     function conflicts(selection) {
-        var header = selection
+        keybindingOn();
+
+        var headerEnter = selection.selectAll('.header')
+            .data([0])
+            .enter()
             .append('div')
             .attr('class', 'header fillL');
 
-        header
+        headerEnter
             .append('button')
             .attr('class', 'fr')
-            .on('click', function() { dispatch$$1.call('cancel'); })
+            .on('click', cancel)
             .call(svgIcon('#icon-close'));
 
-        header
+        headerEnter
             .append('h3')
             .text(t('save.conflict.header'));
 
-        var body = selection
+        var bodyEnter = selection.selectAll('.body')
+            .data([0])
+            .enter()
             .append('div')
             .attr('class', 'body fillL');
 
-        var conflictsHelp = body
+        var conflictsHelpEnter = bodyEnter
             .append('div')
             .attr('class', 'conflicts-help')
             .text(t('save.conflict.help'));
 
 
         // Download changes link
-        var detected = utilDetect(),
-            changeset = new osmChangeset();
+        var detected = utilDetect();
+        var changeset = new osmChangeset();
 
-        delete changeset.id;  // Export without chnageset_id
+        delete changeset.id;  // Export without changeset_id
 
-        var data = JXON.stringify(changeset.osmChangeJXON(origChanges)),
-            blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
-            fileName = 'changes.osc';
+        var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
+        var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
+        var fileName = 'changes.osc';
 
-        var linkEnter = conflictsHelp.selectAll('.download-changes')
-            .data([0])
-            .enter()
+        var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
             .append('a')
             .attr('class', 'download-changes');
 
@@ -65059,44 +66927,44 @@ function uiConflicts(context) {
             .text(t('save.conflict.download_changes'));
 
 
-        body
+        bodyEnter
             .append('div')
             .attr('class', 'conflict-container fillL3')
             .call(showConflict, 0);
 
-        body
+        bodyEnter
             .append('div')
             .attr('class', 'conflicts-done')
             .attr('opacity', 0)
             .style('display', 'none')
             .text(t('save.conflict.done'));
 
-        var buttons = body
+        var buttonsEnter = bodyEnter
             .append('div')
             .attr('class','buttons col12 joined conflicts-buttons');
 
-        buttons
+        buttonsEnter
             .append('button')
-            .attr('disabled', conflictList.length > 1)
+            .attr('disabled', _conflictList.length > 1)
             .attr('class', 'action conflicts-button col6')
             .text(t('save.title'))
-            .on('click.try_again', function() { dispatch$$1.call('save'); });
+            .on('click.try_again', tryAgain);
 
-        buttons
+        buttonsEnter
             .append('button')
             .attr('class', 'secondary-action conflicts-button col6')
             .text(t('confirm.cancel'))
-            .on('click.cancel', function() { dispatch$$1.call('cancel'); });
+            .on('click.cancel', cancel);
     }
 
 
     function showConflict(selection, index) {
-        if (index < 0 || index >= conflictList.length) return;
+        index = utilWrap(index, _conflictList.length);
 
         var parent = d3_select(selection.node().parentNode);
 
         // enable save button if this is the last conflict being reviewed..
-        if (index === conflictList.length - 1) {
+        if (index === _conflictList.length - 1) {
             window.setTimeout(function() {
                 parent.select('.conflicts-button')
                     .attr('disabled', null);
@@ -65108,30 +66976,33 @@ function uiConflicts(context) {
             }, 250);
         }
 
-        var item = selection
+        var conflict = selection
             .selectAll('.conflict')
-            .data([conflictList[index]]);
+            .data([_conflictList[index]]);
 
-        var enter = item.enter()
+        conflict.exit()
+            .remove();
+
+        var conflictEnter = conflict.enter()
             .append('div')
             .attr('class', 'conflict');
 
-        enter
+        conflictEnter
             .append('h4')
             .attr('class', 'conflict-count')
-            .text(t('save.conflict.count', { num: index + 1, total: conflictList.length }));
+            .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
 
-        enter
+        conflictEnter
             .append('a')
             .attr('class', 'conflict-description')
             .attr('href', '#')
             .text(function(d) { return d.name; })
             .on('click', function(d) {
-                zoomToEntity(d.id);
                 event.preventDefault();
+                zoomToEntity(d.id);
             });
 
-        var details = enter
+        var details = conflictEnter
             .append('div')
             .attr('class', 'conflict-detail-container');
 
@@ -65161,11 +67032,13 @@ function uiConflicts(context) {
             .attr('class', 'conflict-nav-button action col6')
             .attr('disabled', function(d, i) {
                 return (i === 0 && index === 0) ||
-                    (i === 1 && index === conflictList.length - 1) || null;
+                    (i === 1 && index === _conflictList.length - 1) || null;
             })
             .on('click', function(d, i) {
-                var container = parent.select('.conflict-container'),
-                sign = (i === 0 ? -1 : 1);
+                event.preventDefault();
+
+                var container = parent.selectAll('.conflict-container');
+                var sign = (i === 0 ? -1 : 1);
 
                 container
                     .selectAll('.conflict')
@@ -65173,12 +67046,8 @@ function uiConflicts(context) {
 
                 container
                     .call(showConflict, index + sign);
-
-                event.preventDefault();
             });
 
-        item.exit()
-            .remove();
     }
 
 
@@ -65189,14 +67058,15 @@ function uiConflicts(context) {
             .selectAll('li')
             .data(function(d) { return d.choices || []; });
 
-        var enter = choices.enter()
+        // enter
+        var choicesEnter = choices.enter()
             .append('li')
             .attr('class', 'layer');
 
-        var label = enter
+        var labelEnter = choicesEnter
             .append('label');
 
-        label
+        labelEnter
             .append('input')
             .attr('type', 'radio')
             .attr('name', function(d) { return d.id; })
@@ -65206,14 +67076,18 @@ function uiConflicts(context) {
                 choose(ul, d);
             });
 
-        label
+        labelEnter
             .append('span')
             .text(function(d) { return d.text; });
 
-        choices
+        // update
+        choicesEnter
+            .merge(choices)
             .each(function(d, i) {
                 var ul = this.parentNode;
-                if (ul.__data__.chosen === i) choose(ul, d);
+                if (ul.__data__.chosen === i) {
+                    choose(ul, d);
+                }
             });
     }
 
@@ -65227,8 +67101,8 @@ function uiConflicts(context) {
             .selectAll('input')
             .property('checked', function(d) { return d === datum; });
 
-        var extent = geoExtent(),
-            entity;
+        var extent = geoExtent();
+        var entity;
 
         entity = context.graph().hasEntity(datum.id);
         if (entity) extent._extend(entity.extent(context.graph()));
@@ -65253,8 +67127,7 @@ function uiConflicts(context) {
             } else {
                 context.map().zoomTo(entity);
             }
-            context.surface().selectAll(
-                utilEntityOrMemberSelector([entity.id], context.graph()))
+            context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
                 .classed('hover', true);
         }
     }
@@ -65271,16 +67144,16 @@ function uiConflicts(context) {
     //         choice(id, keepTheirs, forceRemote)
     //     ]
     // }
-    conflicts.list = function(_) {
-        if (!arguments.length) return conflictList;
-        conflictList = _;
+    conflicts.conflictList = function(_) {
+        if (!arguments.length) return _conflictList;
+        _conflictList = _;
         return conflicts;
     };
 
 
     conflicts.origChanges = function(_) {
-        if (!arguments.length) return origChanges;
-        origChanges = _;
+        if (!arguments.length) return _origChanges;
+        _origChanges = _;
         return conflicts;
     };
 
@@ -65361,7 +67234,7 @@ function uiEditMenu(context, operations) {
             .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
             .classed('disabled', function (d) { return d.disabled(); })
             .attr('transform', function (d, i) {
-                return 'translate(' + geoRoundCoords([
+                return 'translate(' + geoVecFloor([
                     0,
                     m + i * buttonHeight
                 ]).join(',') + ')';
@@ -65463,39 +67336,117 @@ function uiEditMenu(context, operations) {
     return editMenu;
 }
 
-var timer$1;
+var _flashTimer;
 
 
-function uiFlash(showDuration) {
-    showDuration = showDuration || 1500;
+function uiFlash() {
+    var _duration = 2000;
+    var _iconName = '#icon-no';
+    var _iconClass = 'disabled';
+    var _text = '';
+    var _textClass;
 
-    if (timer$1) {
-        timer$1.stop();
+
+    function flash() {
+        if (_flashTimer) {
+            _flashTimer.stop();
+        }
+
+        d3_select('#footer-wrap')
+            .attr('class', 'footer-hide');
+        d3_select('#flash-wrap')
+            .attr('class', 'footer-show');
+
+        var content = d3_select('#flash-wrap').selectAll('.flash-content')
+            .data([0]);
+
+        // Enter
+        var contentEnter = content.enter()
+            .append('div')
+            .attr('class', 'flash-content');
+
+        var iconEnter = contentEnter
+            .append('svg')
+            .attr('class', 'flash-icon')
+            .append('g')
+            .attr('transform', 'translate(10,10)');
+
+        iconEnter
+            .append('circle')
+            .attr('r', 9);
+
+        iconEnter
+            .append('use')
+            .attr('transform', 'translate(-7,-7)')
+            .attr('width', '14')
+            .attr('height', '14');
+
+        contentEnter
+            .append('div')
+            .attr('class', 'flash-text');
+
+
+        // Update
+        content = content
+            .merge(contentEnter);
+
+        content
+            .selectAll('.flash-icon')
+            .attr('class', 'flash-icon ' + (_iconClass || ''));
+
+        content
+            .selectAll('.flash-icon use')
+            .attr('xlink:href', _iconName);
+
+        content
+            .selectAll('.flash-text')
+            .attr('class', 'flash-text ' + (_textClass || ''))
+            .text(_text);
+
+
+        _flashTimer = d3_timeout(function() {
+            _flashTimer = null;
+            d3_select('#footer-wrap')
+                .attr('class', 'footer-show');
+            d3_select('#flash-wrap')
+                .attr('class', 'footer-hide');
+        }, _duration);
+
+        return content;
     }
 
-    d3_select('#footer-wrap')
-        .attr('class', 'footer-hide');
-    d3_select('#flash-wrap')
-        .attr('class', 'footer-show');
 
-    var content = d3_select('#flash-wrap').selectAll('.content')
-        .data([0]);
+    flash.duration = function(_) {
+        if (!arguments.length) return _duration;
+        _duration = _;
+        return flash;
+    };
 
-    content = content.enter()
-        .append('div')
-        .attr('class', 'content')
-        .merge(content);
+    flash.text = function(_) {
+        if (!arguments.length) return _text;
+        _text = _;
+        return flash;
+    };
 
-    timer$1 = d3_timeout(function() {
-        timer$1 = null;
-        d3_select('#footer-wrap')
-            .attr('class', 'footer-show');
-        d3_select('#flash-wrap')
-            .attr('class', 'footer-hide');
-    }, showDuration);
+    flash.textClass = function(_) {
+        if (!arguments.length) return _textClass;
+        _textClass = _;
+        return flash;
+    };
+
+    flash.iconName = function(_) {
+        if (!arguments.length) return _iconName;
+        _iconName = _;
+        return flash;
+    };
 
+    flash.iconClass = function(_) {
+        if (!arguments.length) return _iconClass;
+        _iconClass = _;
+        return flash;
+    };
 
-    return content;
+    return flash;
 }
 
 function uiLasso(context) {
@@ -65607,7 +67558,7 @@ function uiRadialMenu(context, operations) {
             .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
             .classed('disabled', function(d) { return d.disabled(); })
             .attr('transform', function(d, i) {
-                return 'translate(' + geoRoundCoords([
+                return 'translate(' + geoVecFloor([
                         r * Math.sin(a0 + i * a),
                         r * Math.cos(a0 + i * a)]).join(',') + ')';
             });
@@ -66561,7 +68512,7 @@ function createCtor(Ctor) {
 }
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$2 = 1;
+var WRAP_BIND_FLAG = 1;
 
 /**
  * Creates a function that wraps `func` to invoke it with the optional `this`
@@ -66574,7 +68525,7 @@ var WRAP_BIND_FLAG$2 = 1;
  * @returns {Function} Returns the new wrapped function.
  */
 function createBind(func, bitmask, thisArg) {
-  var isBind = bitmask & WRAP_BIND_FLAG$2,
+  var isBind = bitmask & WRAP_BIND_FLAG,
       Ctor = createCtor(func);
 
   function wrapper() {
@@ -66585,7 +68536,7 @@ function createBind(func, bitmask, thisArg) {
 }
 
 /* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax$6 = Math.max;
+var nativeMax$5 = Math.max;
 
 /**
  * Creates an array that is the composition of partially applied arguments,
@@ -66604,7 +68555,7 @@ function composeArgs(args, partials, holders, isCurried) {
       holdersLength = holders.length,
       leftIndex = -1,
       leftLength = partials.length,
-      rangeLength = nativeMax$6(argsLength - holdersLength, 0),
+      rangeLength = nativeMax$5(argsLength - holdersLength, 0),
       result = Array(leftLength + rangeLength),
       isUncurried = !isCurried;
 
@@ -66623,7 +68574,7 @@ function composeArgs(args, partials, holders, isCurried) {
 }
 
 /* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax$7 = Math.max;
+var nativeMax$6 = Math.max;
 
 /**
  * This function is like `composeArgs` except that the arguments composition
@@ -66643,7 +68594,7 @@ function composeArgsRight(args, partials, holders, isCurried) {
       holdersLength = holders.length,
       rightIndex = -1,
       rightLength = partials.length,
-      rangeLength = nativeMax$7(argsLength - holdersLength, 0),
+      rangeLength = nativeMax$6(argsLength - holdersLength, 0),
       result = Array(rangeLength + rightLength),
       isUncurried = !isCurried;
 
@@ -67009,26 +68960,26 @@ function insertWrapDetails(source, details) {
 }
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$5 = 1;
-var WRAP_BIND_KEY_FLAG$3 = 2;
-var WRAP_CURRY_FLAG$3 = 8;
-var WRAP_CURRY_RIGHT_FLAG$2 = 16;
-var WRAP_PARTIAL_FLAG$3 = 32;
-var WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
-var WRAP_ARY_FLAG$1 = 128;
+var WRAP_BIND_FLAG$1 = 1;
+var WRAP_BIND_KEY_FLAG = 2;
+var WRAP_CURRY_FLAG = 8;
+var WRAP_CURRY_RIGHT_FLAG = 16;
+var WRAP_PARTIAL_FLAG = 32;
+var WRAP_PARTIAL_RIGHT_FLAG = 64;
+var WRAP_ARY_FLAG = 128;
 var WRAP_REARG_FLAG = 256;
-var WRAP_FLIP_FLAG$1 = 512;
+var WRAP_FLIP_FLAG = 512;
 
 /** Used to associate wrap methods with their bit flags. */
 var wrapFlags = [
-  ['ary', WRAP_ARY_FLAG$1],
-  ['bind', WRAP_BIND_FLAG$5],
-  ['bindKey', WRAP_BIND_KEY_FLAG$3],
-  ['curry', WRAP_CURRY_FLAG$3],
-  ['curryRight', WRAP_CURRY_RIGHT_FLAG$2],
-  ['flip', WRAP_FLIP_FLAG$1],
-  ['partial', WRAP_PARTIAL_FLAG$3],
-  ['partialRight', WRAP_PARTIAL_RIGHT_FLAG$2],
+  ['ary', WRAP_ARY_FLAG],
+  ['bind', WRAP_BIND_FLAG$1],
+  ['bindKey', WRAP_BIND_KEY_FLAG],
+  ['curry', WRAP_CURRY_FLAG],
+  ['curryRight', WRAP_CURRY_RIGHT_FLAG],
+  ['flip', WRAP_FLIP_FLAG],
+  ['partial', WRAP_PARTIAL_FLAG],
+  ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
   ['rearg', WRAP_REARG_FLAG]
 ];
 
@@ -67066,11 +69017,11 @@ function setWrapToString(wrapper, reference, bitmask) {
 }
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$4 = 1;
-var WRAP_BIND_KEY_FLAG$2 = 2;
+var WRAP_BIND_FLAG$2 = 1;
+var WRAP_BIND_KEY_FLAG$1 = 2;
 var WRAP_CURRY_BOUND_FLAG = 4;
-var WRAP_CURRY_FLAG$2 = 8;
-var WRAP_PARTIAL_FLAG$2 = 32;
+var WRAP_CURRY_FLAG$1 = 8;
+var WRAP_PARTIAL_FLAG$1 = 32;
 var WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
 
 /**
@@ -67091,17 +69042,17 @@ var WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
  * @returns {Function} Returns the new wrapped function.
  */
 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
-  var isCurry = bitmask & WRAP_CURRY_FLAG$2,
+  var isCurry = bitmask & WRAP_CURRY_FLAG$1,
       newHolders = isCurry ? holders : undefined,
       newHoldersRight = isCurry ? undefined : holders,
       newPartials = isCurry ? partials : undefined,
       newPartialsRight = isCurry ? undefined : partials;
 
-  bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$2 : WRAP_PARTIAL_RIGHT_FLAG$1);
-  bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$2);
+  bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
+  bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
 
   if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
-    bitmask &= ~(WRAP_BIND_FLAG$4 | WRAP_BIND_KEY_FLAG$2);
+    bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
   }
   var newData = [
     func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
@@ -67183,11 +69134,11 @@ function replaceHolders(array, placeholder) {
 
 /** Used to compose bitmasks for function metadata. */
 var WRAP_BIND_FLAG$3 = 1;
-var WRAP_BIND_KEY_FLAG$1 = 2;
-var WRAP_CURRY_FLAG$1 = 8;
+var WRAP_BIND_KEY_FLAG$2 = 2;
+var WRAP_CURRY_FLAG$2 = 8;
 var WRAP_CURRY_RIGHT_FLAG$1 = 16;
-var WRAP_ARY_FLAG = 128;
-var WRAP_FLIP_FLAG = 512;
+var WRAP_ARY_FLAG$1 = 128;
+var WRAP_FLIP_FLAG$1 = 512;
 
 /**
  * Creates a function that wraps `func` to invoke it with optional `this`
@@ -67209,11 +69160,11 @@ var WRAP_FLIP_FLAG = 512;
  * @returns {Function} Returns the new wrapped function.
  */
 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
-  var isAry = bitmask & WRAP_ARY_FLAG,
+  var isAry = bitmask & WRAP_ARY_FLAG$1,
       isBind = bitmask & WRAP_BIND_FLAG$3,
-      isBindKey = bitmask & WRAP_BIND_KEY_FLAG$1,
-      isCurried = bitmask & (WRAP_CURRY_FLAG$1 | WRAP_CURRY_RIGHT_FLAG$1),
-      isFlip = bitmask & WRAP_FLIP_FLAG,
+      isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
+      isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
+      isFlip = bitmask & WRAP_FLIP_FLAG$1,
       Ctor = isBindKey ? undefined : createCtor(func);
 
   function wrapper() {
@@ -67300,7 +69251,7 @@ function createCurry(func, bitmask, arity) {
 }
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$6 = 1;
+var WRAP_BIND_FLAG$4 = 1;
 
 /**
  * Creates a function that wraps `func` to invoke it with the `this` binding
@@ -67315,7 +69266,7 @@ var WRAP_BIND_FLAG$6 = 1;
  * @returns {Function} Returns the new wrapped function.
  */
 function createPartial(func, bitmask, thisArg, partials) {
-  var isBind = bitmask & WRAP_BIND_FLAG$6,
+  var isBind = bitmask & WRAP_BIND_FLAG$4,
       Ctor = createCtor(func);
 
   function wrapper() {
@@ -67341,10 +69292,10 @@ function createPartial(func, bitmask, thisArg, partials) {
 var PLACEHOLDER$1 = '__lodash_placeholder__';
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$7 = 1;
-var WRAP_BIND_KEY_FLAG$4 = 2;
+var WRAP_BIND_FLAG$5 = 1;
+var WRAP_BIND_KEY_FLAG$3 = 2;
 var WRAP_CURRY_BOUND_FLAG$1 = 4;
-var WRAP_CURRY_FLAG$4 = 8;
+var WRAP_CURRY_FLAG$3 = 8;
 var WRAP_ARY_FLAG$2 = 128;
 var WRAP_REARG_FLAG$1 = 256;
 
@@ -67371,22 +69322,22 @@ function mergeData(data, source) {
   var bitmask = data[1],
       srcBitmask = source[1],
       newBitmask = bitmask | srcBitmask,
-      isCommon = newBitmask < (WRAP_BIND_FLAG$7 | WRAP_BIND_KEY_FLAG$4 | WRAP_ARY_FLAG$2);
+      isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
 
   var isCombo =
-    ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$4)) ||
+    ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
-    ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$4));
+    ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
 
   // Exit early if metadata can't be merged.
   if (!(isCommon || isCombo)) {
     return data;
   }
   // Use source `thisArg` if available.
-  if (srcBitmask & WRAP_BIND_FLAG$7) {
+  if (srcBitmask & WRAP_BIND_FLAG$5) {
     data[2] = source[2];
     // Set when currying a bound function.
-    newBitmask |= bitmask & WRAP_BIND_FLAG$7 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
+    newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
   }
   // Compose partial arguments.
   var value = source[3];
@@ -67426,15 +69377,15 @@ function mergeData(data, source) {
 var FUNC_ERROR_TEXT$4 = 'Expected a function';
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG$1 = 1;
-var WRAP_BIND_KEY_FLAG = 2;
-var WRAP_CURRY_FLAG = 8;
-var WRAP_CURRY_RIGHT_FLAG = 16;
-var WRAP_PARTIAL_FLAG$1 = 32;
-var WRAP_PARTIAL_RIGHT_FLAG = 64;
+var WRAP_BIND_FLAG$6 = 1;
+var WRAP_BIND_KEY_FLAG$4 = 2;
+var WRAP_CURRY_FLAG$4 = 8;
+var WRAP_CURRY_RIGHT_FLAG$2 = 16;
+var WRAP_PARTIAL_FLAG$2 = 32;
+var WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
 
 /* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax$5 = Math.max;
+var nativeMax$7 = Math.max;
 
 /**
  * Creates a function that either curries or invokes `func` with optional
@@ -67462,20 +69413,20 @@ var nativeMax$5 = Math.max;
  * @returns {Function} Returns the new wrapped function.
  */
 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
-  var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+  var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
   if (!isBindKey && typeof func != 'function') {
     throw new TypeError(FUNC_ERROR_TEXT$4);
   }
   var length = partials ? partials.length : 0;
   if (!length) {
-    bitmask &= ~(WRAP_PARTIAL_FLAG$1 | WRAP_PARTIAL_RIGHT_FLAG);
+    bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
     partials = holders = undefined;
   }
-  ary = ary === undefined ? ary : nativeMax$5(toInteger(ary), 0);
+  ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
   arity = arity === undefined ? arity : toInteger(arity);
   length -= holders ? holders.length : 0;
 
-  if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+  if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
     var partialsRight = partials,
         holdersRight = holders;
 
@@ -67498,16 +69449,16 @@ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arit
   holders = newData[4];
   arity = newData[9] = newData[9] === undefined
     ? (isBindKey ? 0 : func.length)
-    : nativeMax$5(newData[9] - length, 0);
+    : nativeMax$7(newData[9] - length, 0);
 
-  if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
-    bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+  if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
+    bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
   }
-  if (!bitmask || bitmask == WRAP_BIND_FLAG$1) {
+  if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
     var result = createBind(func, bitmask, thisArg);
-  } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+  } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
     result = createCurry(func, bitmask, arity);
-  } else if ((bitmask == WRAP_PARTIAL_FLAG$1 || bitmask == (WRAP_BIND_FLAG$1 | WRAP_PARTIAL_FLAG$1)) && !holders.length) {
+  } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
     result = createPartial(func, bitmask, thisArg, partials);
   } else {
     result = createHybrid.apply(undefined, newData);
@@ -67517,8 +69468,8 @@ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arit
 }
 
 /** Used to compose bitmasks for function metadata. */
-var WRAP_BIND_FLAG = 1;
-var WRAP_PARTIAL_FLAG = 32;
+var WRAP_BIND_FLAG$7 = 1;
+var WRAP_PARTIAL_FLAG$3 = 32;
 
 /**
  * Creates a function that invokes `func` with the `this` binding of `thisArg`
@@ -67556,10 +69507,10 @@ var WRAP_PARTIAL_FLAG = 32;
  * // => 'hi fred!'
  */
 var bind$2 = baseRest(function(func, thisArg, partials) {
-  var bitmask = WRAP_BIND_FLAG;
+  var bitmask = WRAP_BIND_FLAG$7;
   if (partials.length) {
     var holders = replaceHolders(partials, getHolder(bind$2));
-    bitmask |= WRAP_PARTIAL_FLAG;
+    bitmask |= WRAP_PARTIAL_FLAG$3;
   }
   return createWrap(func, bitmask, thisArg, partials, holders);
 });
@@ -67937,14 +69888,14 @@ function presetIndex() {
     // a presetCollection with methods for
     // loading new data and returning defaults
 
-    var all = presetCollection([]),
-        defaults = { area: all, line: all, point: all, vertex: all, relation: all },
-        fields = {},
-        universal = [],
-        recent = presetCollection([]);
+    var all = presetCollection([]);
+    var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
+    var _fields = {};
+    var _universal = [];
+    var _recent = presetCollection([]);
 
     // Index of presets by (geometry, tag key).
-    var index = {
+    var _index = {
         point: {},
         vertex: {},
         line: {},
@@ -67961,9 +69912,9 @@ function presetIndex() {
             geometry = 'point';
         }
 
-        var geometryMatches = index[geometry],
-            best = -1,
-            match;
+        var geometryMatches = _index[geometry];
+        var best = -1;
+        var match;
 
         for (var k in entity.tags) {
             // If any part of an address is present,
@@ -68004,9 +69955,9 @@ function presetIndex() {
     // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
     // and the subkeys form the blacklist.
     all.areaKeys = function() {
-        var areaKeys = {},
-            ignore = ['barrier', 'highway', 'footway', 'railway', 'type'],  // probably a line..
-            presets = reject(all.collection, 'suggestion');
+        var areaKeys = {};
+        var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
+        var presets = reject(all.collection, 'suggestion');
 
         // whitelist
         presets.forEach(function(d) {
@@ -68041,21 +69992,23 @@ function presetIndex() {
         var d = data.presets;
 
         all.collection = [];
-        recent.collection = [];
-        fields = {};
-        universal = [];
-        index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
+        _recent.collection = [];
+        _fields = {};
+        _universal = [];
+        _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
 
         if (d.fields) {
             forEach(d.fields, function(d, id) {
-                fields[id] = presetField(id, d);
-                if (d.universal) universal.push(fields[id]);
+                _fields[id] = presetField(id, d);
+                if (d.universal) {
+                    _universal.push(_fields[id]);
+                }
             });
         }
 
         if (d.presets) {
             forEach(d.presets, function(d, id) {
-                all.collection.push(presetPreset(id, d, fields));
+                all.collection.push(presetPreset(id, d, _fields));
             });
         }
 
@@ -68067,7 +70020,7 @@ function presetIndex() {
 
         if (d.defaults) {
             var getItem = bind$2(all.item, all);
-            defaults = {
+            _defaults = {
                 area: presetCollection(d.defaults.area.map(getItem)),
                 line: presetCollection(d.defaults.line.map(getItem)),
                 point: presetCollection(d.defaults.point.map(getItem)),
@@ -68077,11 +70030,11 @@ function presetIndex() {
         }
 
         for (var i = 0; i < all.collection.length; i++) {
-            var preset = all.collection[i],
-                geometry = preset.geometry;
+            var preset = all.collection[i];
+            var geometry = preset.geometry;
 
             for (var j = 0; j < geometry.length; j++) {
-                var g = index[geometry[j]];
+                var g = _index[geometry[j]];
                 for (var k in preset.tags) {
                     (g[k] = g[k] || []).push(preset);
                 }
@@ -68092,23 +70045,21 @@ function presetIndex() {
     };
 
     all.field = function(id) {
-        return fields[id];
+        return _fields[id];
     };
 
     all.universal = function() {
-        return universal;
+        return _universal;
     };
 
     all.defaults = function(geometry, n) {
-        var rec = recent.matchGeometry(geometry).collection.slice(0, 4),
-            def = uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
+        var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
+        var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
         return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
     };
 
     all.choose = function(preset) {
-        if (!preset.isFallback()) {
-            recent = presetCollection(uniq([preset].concat(recent.collection)));
-        }
+        _recent = presetCollection(uniq([preset].concat(_recent.collection)));
         return all;
     };
 
@@ -68124,7 +70075,7 @@ function setAreaKeys(value) {
 
 function coreContext() {
     var context = {};
-    context.version = '2.5.1';
+    context.version = '2.6.1';
 
     // create a special translation that contains the keys in place of the strings
     var tkeys = cloneDeep(en);
@@ -68200,7 +70151,7 @@ function coreContext() {
             if (!err) history.merge(result.data, result.extent);
             if (callback) callback(err, result);
         }
-        if (connection) {
+        if (connection && context.editable()) {
             cid = connection.getConnectionId();
             connection.loadTiles(projection, dimensions, done);
         }
@@ -68326,6 +70277,9 @@ function coreContext() {
             return [];
         }
     };
+    context.activeID = function() {
+        return mode && mode.activeID && mode.activeID();
+    };
 
 
     /* Behaviors */
@@ -68381,11 +70335,12 @@ function coreContext() {
 
     /* Debug */
     var debugFlags = {
-        tile: false,
-        collision: false,
-        imagery: false,
-        imperial: false,
-        driveLeft: false
+        tile: false,        // tile boundaries
+        collision: false,   // label collision bounding boxes
+        imagery: false,     // imagery bounding polygons
+        imperial: false,    // imperial (not metric) bounding polygons
+        driveLeft: false,   // driveLeft bounding polygons
+        target: false       // touch targets
     };
     context.debugFlags = function() {
         return debugFlags;
@@ -68636,6 +70591,7 @@ assignIn(osmWay.prototype, {
         }
 
         // implied layer tag..
+        if (this.tags.covered === 'yes') return -1;
         if (this.tags.location === 'overground') return 1;
         if (this.tags.location === 'underground') return -1;
         if (this.tags.location === 'underwater') return -10;
@@ -68655,8 +70611,18 @@ assignIn(osmWay.prototype, {
 
     isOneWay: function() {
         // explicit oneway tag..
-        if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; }
-        if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; }
+        var values = {
+            'yes': true,
+            '1': true,
+            '-1': true,
+            'reversible': true,
+            'alternating': true,
+            'no': false,
+            '0': false
+        };
+        if (values[this.tags.oneway] !== undefined) {
+            return values[this.tags.oneway];
+        }
 
         // implied oneway tag..
         for (var key in this.tags) {
@@ -68680,15 +70646,16 @@ assignIn(osmWay.prototype, {
     isConvex: function(resolver) {
         if (!this.isClosed() || this.isDegenerate()) return null;
 
-        var nodes = uniq(resolver.childNodes(this)),
-            coords = map$4(nodes, 'loc'),
-            curr = 0, prev = 0;
+        var nodes = uniq(resolver.childNodes(this));
+        var coords = map$4(nodes, 'loc');
+        var curr = 0;
+        var prev = 0;
 
         for (var i = 0; i < coords.length; i++) {
-            var o = coords[(i+1) % coords.length],
-                a = coords[i],
-                b = coords[(i+2) % coords.length],
-                res = geoCross(o, a, b);
+            var o = coords[(i+1) % coords.length];
+            var a = coords[i];
+            var b = coords[(i+2) % coords.length];
+            var res = geoVecCross(a, b, o);
 
             curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
             if (curr === 0) {
@@ -68752,215 +70719,641 @@ assignIn(osmWay.prototype, {
     },
 
 
-    geometry: function(graph) {
-        return graph.transient(this, 'geometry', function() {
-            return this.isArea() ? 'area' : 'line';
-        });
-    },
+    geometry: function(graph) {
+        return graph.transient(this, 'geometry', function() {
+            return this.isArea() ? 'area' : 'line';
+        });
+    },
+
+
+    // If this way is not closed, append the beginning node to the end of the nodelist to close it.
+    close: function() {
+        if (this.isClosed() || !this.nodes.length) return this;
+
+        var nodes = this.nodes.slice();
+        nodes = nodes.filter(noRepeatNodes);
+        nodes.push(nodes[0]);
+        return this.update({ nodes: nodes });
+    },
+
+
+    // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
+    unclose: function() {
+        if (!this.isClosed()) return this;
+
+        var nodes = this.nodes.slice(),
+            connector = this.first(),
+            i = nodes.length - 1;
+
+        // remove trailing connectors..
+        while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+            nodes.splice(i, 1);
+            i = nodes.length - 1;
+        }
+
+        nodes = nodes.filter(noRepeatNodes);
+        return this.update({ nodes: nodes });
+    },
+
+
+    // Adds a node (id) in front of the node which is currently at position index.
+    // If index is undefined, the node will be added to the end of the way for linear ways,
+    //   or just before the final connecting node for circular ways.
+    // Consecutive duplicates are eliminated including existing ones.
+    // Circularity is always preserved when adding a node.
+    addNode: function(id, index) {
+        var nodes = this.nodes.slice(),
+            isClosed = this.isClosed(),
+            max = isClosed ? nodes.length - 1 : nodes.length;
+
+        if (index === undefined) {
+            index = max;
+        }
+
+        if (index < 0 || index > max) {
+            throw new RangeError('index ' + index + ' out of range 0..' + max);
+        }
+
+        // If this is a closed way, remove all connector nodes except the first one
+        // (there may be duplicates) and adjust index if necessary..
+        if (isClosed) {
+            var connector = this.first();
+
+            // leading connectors..
+            var i = 1;
+            while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+                nodes.splice(i, 1);
+                if (index > i) index--;
+            }
+
+            // trailing connectors..
+            i = nodes.length - 1;
+            while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+                nodes.splice(i, 1);
+                if (index > i) index--;
+                i = nodes.length - 1;
+            }
+        }
+
+        nodes.splice(index, 0, id);
+        nodes = nodes.filter(noRepeatNodes);
+
+        // If the way was closed before, append a connector node to keep it closed..
+        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+            nodes.push(nodes[0]);
+        }
+
+        return this.update({ nodes: nodes });
+    },
+
+
+    // Replaces the node which is currently at position index with the given node (id).
+    // Consecutive duplicates are eliminated including existing ones.
+    // Circularity is preserved when updating a node.
+    updateNode: function(id, index) {
+        var nodes = this.nodes.slice(),
+            isClosed = this.isClosed(),
+            max = nodes.length - 1;
+
+        if (index === undefined || index < 0 || index > max) {
+            throw new RangeError('index ' + index + ' out of range 0..' + max);
+        }
+
+        // If this is a closed way, remove all connector nodes except the first one
+        // (there may be duplicates) and adjust index if necessary..
+        if (isClosed) {
+            var connector = this.first();
+
+            // leading connectors..
+            var i = 1;
+            while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
+                nodes.splice(i, 1);
+                if (index > i) index--;
+            }
+
+            // trailing connectors..
+            i = nodes.length - 1;
+            while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
+                nodes.splice(i, 1);
+                if (index === i) index = 0;  // update leading connector instead
+                i = nodes.length - 1;
+            }
+        }
+
+        nodes.splice(index, 1, id);
+        nodes = nodes.filter(noRepeatNodes);
+
+        // If the way was closed before, append a connector node to keep it closed..
+        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+            nodes.push(nodes[0]);
+        }
+
+        return this.update({nodes: nodes});
+    },
+
+
+    // Replaces each occurrence of node id needle with replacement.
+    // Consecutive duplicates are eliminated including existing ones.
+    // Circularity is preserved.
+    replaceNode: function(needle, replacement) {
+        var nodes = this.nodes.slice(),
+            isClosed = this.isClosed();
+
+        for (var i = 0; i < nodes.length; i++) {
+            if (nodes[i] === needle) {
+                nodes[i] = replacement;
+            }
+        }
+
+        nodes = nodes.filter(noRepeatNodes);
+
+        // If the way was closed before, append a connector node to keep it closed..
+        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+            nodes.push(nodes[0]);
+        }
+
+        return this.update({nodes: nodes});
+    },
+
+
+    // Removes each occurrence of node id needle with replacement.
+    // Consecutive duplicates are eliminated including existing ones.
+    // Circularity is preserved.
+    removeNode: function(id) {
+        var nodes = this.nodes.slice(),
+            isClosed = this.isClosed();
+
+        nodes = nodes
+            .filter(function(node) { return node !== id; })
+            .filter(noRepeatNodes);
+
+        // If the way was closed before, append a connector node to keep it closed..
+        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
+            nodes.push(nodes[0]);
+        }
+
+        return this.update({nodes: nodes});
+    },
+
+
+    asJXON: function(changeset_id) {
+        var r = {
+            way: {
+                '@id': this.osmId(),
+                '@version': this.version || 0,
+                nd: map$4(this.nodes, function(id) {
+                    return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
+                }),
+                tag: map$4(this.tags, function(v, k) {
+                    return { keyAttributes: { k: k, v: v } };
+                })
+            }
+        };
+        if (changeset_id) {
+            r.way['@changeset'] = changeset_id;
+        }
+        return r;
+    },
+
+
+    asGeoJSON: function(resolver) {
+        return resolver.transient(this, 'GeoJSON', function() {
+            var coordinates = map$4(resolver.childNodes(this), 'loc');
+            if (this.isArea() && this.isClosed()) {
+                return {
+                    type: 'Polygon',
+                    coordinates: [coordinates]
+                };
+            } else {
+                return {
+                    type: 'LineString',
+                    coordinates: coordinates
+                };
+            }
+        });
+    },
+
+
+    area: function(resolver) {
+        return resolver.transient(this, 'area', function() {
+            var nodes = resolver.childNodes(this);
+
+            var json = {
+                type: 'Polygon',
+                coordinates: [map$4(nodes, 'loc')]
+            };
+
+            if (!this.isClosed() && nodes.length) {
+                json.coordinates[0].push(nodes[0].loc);
+            }
+
+            var area = d3_geoArea(json);
+
+            // Heuristic for detecting counterclockwise winding order. Assumes
+            // that OpenStreetMap polygons are not hemisphere-spanning.
+            if (area > 2 * Math.PI) {
+                json.coordinates[0] = json.coordinates[0].reverse();
+                area = d3_geoArea(json);
+            }
+
+            return isNaN(area) ? 0 : area;
+        });
+    }
+});
+
+
+// Filter function to eliminate consecutive duplicates.
+function noRepeatNodes(node, i, arr) {
+    return i === 0 || node !== arr[i - 1];
+}
+
+// For fixing up rendering of multipolygons with tags on the outer member.
+// https://github.com/openstreetmap/iD/issues/613
+function osmIsSimpleMultipolygonOuterMember(entity, graph) {
+    if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
+        return false;
+
+    var parents = graph.parentRelations(entity);
+    if (parents.length !== 1)
+        return false;
+
+    var parent = parents[0];
+    if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
+        return false;
+
+    var members = parent.members, member;
+    for (var i = 0; i < members.length; i++) {
+        member = members[i];
+        if (member.id === entity.id && member.role && member.role !== 'outer')
+            return false; // Not outer member
+        if (member.id !== entity.id && (!member.role || member.role === 'outer'))
+            return false; // Not a simple multipolygon
+    }
+
+    return parent;
+}
+
+
+function osmSimpleMultipolygonOuterMember(entity, graph) {
+    if (entity.type !== 'way')
+        return false;
+
+    var parents = graph.parentRelations(entity);
+    if (parents.length !== 1)
+        return false;
+
+    var parent = parents[0];
+    if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
+        return false;
+
+    var members = parent.members, member, outerMember;
+    for (var i = 0; i < members.length; i++) {
+        member = members[i];
+        if (!member.role || member.role === 'outer') {
+            if (outerMember)
+                return false; // Not a simple multipolygon
+            outerMember = member;
+        }
+    }
+
+    if (!outerMember)
+        return false;
+
+    var outerEntity = graph.hasEntity(outerMember.id);
+    if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
+        return false;
+
+    return outerEntity;
+}
+
+
+// Join `toJoin` array into sequences of connecting ways.
+
+// Segments which share identical start/end nodes will, as much as possible,
+// be connected with each other.
+//
+// The return value is a nested array. Each constituent array contains elements
+// of `toJoin` which have been determined to connect.
+//
+// Each consitituent array also has a `nodes` property whose value is an
+// ordered array of member nodes, with appropriate order reversal and
+// start/end coordinate de-duplication.
+//
+// Members of `toJoin` must have, at minimum, `type` and `id` properties.
+// Thus either an array of `osmWay`s or a relation member array may be used.
+//
+// If an member is an `osmWay`, its tags and childnodes may be reversed via
+// `actionReverse` in the output.
+//
+// The returned sequences array also has an `actions` array property, containing
+// any reversal actions that should be applied to the graph, should the calling
+// code attempt to actually join the given ways.
+//
+// Incomplete members (those for which `graph.hasEntity(element.id)` returns
+// false) and non-way members are ignored.
+//
+function osmJoinWays(toJoin, graph) {
+    function resolve(member) {
+        return graph.childNodes(graph.entity(member.id));
+    }
+
+    function reverse(item) {
+        var action = actionReverse(item.id, { reverseOneway: true });
+        sequences.actions.push(action);
+        return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
+    }
+
+    // make a copy containing only the items to join
+    toJoin = toJoin.filter(function(member) {
+        return member.type === 'way' && graph.hasEntity(member.id);
+    });
+
+
+    var sequences = [];
+    sequences.actions = [];
+
+    while (toJoin.length) {
+        // start a new sequence
+        var item = toJoin.shift();
+        var currWays = [item];
+        var currNodes = resolve(item).slice();
+        var doneSequence = false;
+
+        // add to it
+        while (toJoin.length && !doneSequence) {
+            var start = currNodes[0];
+            var end = currNodes[currNodes.length - 1];
+            var fn = null;
+            var nodes = null;
+            var i;
+
+            // Find the next way/member to join.
+            for (i = 0; i < toJoin.length; i++) {
+                item = toJoin[i];
+                nodes = resolve(item);
+
+                // Strongly prefer to generate a forward path that preserves the order
+                // of the members array. For multipolygons and most relations, member
+                // order does not matter - but for routes, it does. If we started this
+                // sequence backwards (i.e. next member way attaches to the start node
+                // and not the end node), reverse the initial way before continuing.
+                if (currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
+                    (nodes[nodes.length - 1] === start || nodes[0] === start)
+                ) {
+                    currWays[0] = reverse(currWays[0]);
+                    currNodes.reverse();
+                    start = currNodes[0];
+                    end = currNodes[currNodes.length - 1];
+                }
+
+                if (nodes[0] === end) {
+                    fn = currNodes.push;               // join to end
+                    nodes = nodes.slice(1);
+                    break;
+                } else if (nodes[nodes.length - 1] === end) {
+                    fn = currNodes.push;               // join to end
+                    nodes = nodes.slice(0, -1).reverse();
+                    item = reverse(item);
+                    break;
+                } else if (nodes[nodes.length - 1] === start) {
+                    fn = currNodes.unshift;            // join to beginning
+                    nodes = nodes.slice(0, -1);
+                    break;
+                } else if (nodes[0] === start) {
+                    fn = currNodes.unshift;            // join to beginning
+                    nodes = nodes.slice(1).reverse();
+                    item = reverse(item);
+                    break;
+                } else {
+                    fn = nodes = null;
+                }
+            }
+
+            if (!nodes) {     // couldn't find a joinable way/member
+                doneSequence = true;
+                break;
+            }
+
+            fn.apply(currWays, [item]);
+            fn.apply(currNodes, nodes);
+
+            toJoin.splice(i, 1);
+        }
+
+        currWays.nodes = currNodes;
+        sequences.push(currWays);
+    }
+
+    return sequences;
+}
+
+function osmRelation() {
+    if (!(this instanceof osmRelation)) {
+        return (new osmRelation()).initialize(arguments);
+    } else if (arguments.length) {
+        this.initialize(arguments);
+    }
+}
+
+
+osmEntity.relation = osmRelation;
 
+osmRelation.prototype = Object.create(osmEntity.prototype);
 
-    // If this way is not closed, append the beginning node to the end of the nodelist to close it.
-    close: function() {
-        if (this.isClosed() || !this.nodes.length) return this;
 
-        var nodes = this.nodes.slice();
-        nodes = nodes.filter(noRepeatNodes);
-        nodes.push(nodes[0]);
-        return this.update({ nodes: nodes });
-    },
+osmRelation.creationOrder = function(a, b) {
+    var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
+    var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
 
+    if (aId < 0 || bId < 0) return aId - bId;
+    return bId - aId;
+};
 
-    // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
-    unclose: function() {
-        if (!this.isClosed()) return this;
 
-        var nodes = this.nodes.slice(),
-            connector = this.first(),
-            i = nodes.length - 1;
+assignIn(osmRelation.prototype, {
+    type: 'relation',
+    members: [],
 
-        // remove trailing connectors..
-        while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
-            nodes.splice(i, 1);
-            i = nodes.length - 1;
-        }
 
-        nodes = nodes.filter(noRepeatNodes);
-        return this.update({ nodes: nodes });
-    },
+    copy: function(resolver, copies) {
+        if (copies[this.id])
+            return copies[this.id];
 
+        var copy = osmEntity.prototype.copy.call(this, resolver, copies);
 
-    // Adds a node (id) in front of the node which is currently at position index.
-    // If index is undefined, the node will be added to the end of the way for linear ways,
-    //   or just before the final connecting node for circular ways.
-    // Consecutive duplicates are eliminated including existing ones.
-    // Circularity is always preserved when adding a node.
-    addNode: function(id, index) {
-        var nodes = this.nodes.slice(),
-            isClosed = this.isClosed(),
-            max = isClosed ? nodes.length - 1 : nodes.length;
+        var members = this.members.map(function(member) {
+            return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
+        });
 
-        if (index === undefined) {
-            index = max;
-        }
+        copy = copy.update({members: members});
+        copies[this.id] = copy;
 
-        if (index < 0 || index > max) {
-            throw new RangeError('index ' + index + ' out of range 0..' + max);
-        }
+        return copy;
+    },
 
-        // If this is a closed way, remove all connector nodes except the first one
-        // (there may be duplicates) and adjust index if necessary..
-        if (isClosed) {
-            var connector = this.first();
 
-            // leading connectors..
-            var i = 1;
-            while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
-                nodes.splice(i, 1);
-                if (index > i) index--;
-            }
+    extent: function(resolver, memo) {
+        return resolver.transient(this, 'extent', function() {
+            if (memo && memo[this.id]) return geoExtent();
+            memo = memo || {};
+            memo[this.id] = true;
 
-            // trailing connectors..
-            i = nodes.length - 1;
-            while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
-                nodes.splice(i, 1);
-                if (index > i) index--;
-                i = nodes.length - 1;
+            var extent = geoExtent();
+            for (var i = 0; i < this.members.length; i++) {
+                var member = resolver.hasEntity(this.members[i].id);
+                if (member) {
+                    extent._extend(member.extent(resolver, memo));
+                }
             }
-        }
-
-        nodes.splice(index, 0, id);
-        nodes = nodes.filter(noRepeatNodes);
+            return extent;
+        });
+    },
 
-        // If the way was closed before, append a connector node to keep it closed..
-        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
-            nodes.push(nodes[0]);
-        }
 
-        return this.update({ nodes: nodes });
+    geometry: function(graph) {
+        return graph.transient(this, 'geometry', function() {
+            return this.isMultipolygon() ? 'area' : 'relation';
+        });
     },
 
 
-    // Replaces the node which is currently at position index with the given node (id).
-    // Consecutive duplicates are eliminated including existing ones.
-    // Circularity is preserved when updating a node.
-    updateNode: function(id, index) {
-        var nodes = this.nodes.slice(),
-            isClosed = this.isClosed(),
-            max = nodes.length - 1;
+    isDegenerate: function() {
+        return this.members.length === 0;
+    },
 
-        if (index === undefined || index < 0 || index > max) {
-            throw new RangeError('index ' + index + ' out of range 0..' + max);
+
+    // Return an array of members, each extended with an 'index' property whose value
+    // is the member index.
+    indexedMembers: function() {
+        var result = new Array(this.members.length);
+        for (var i = 0; i < this.members.length; i++) {
+            result[i] = assignIn({}, this.members[i], {index: i});
         }
+        return result;
+    },
 
-        // If this is a closed way, remove all connector nodes except the first one
-        // (there may be duplicates) and adjust index if necessary..
-        if (isClosed) {
-            var connector = this.first();
 
-            // leading connectors..
-            var i = 1;
-            while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
-                nodes.splice(i, 1);
-                if (index > i) index--;
+    // Return the first member with the given role. A copy of the member object
+    // is returned, extended with an 'index' property whose value is the member index.
+    memberByRole: function(role) {
+        for (var i = 0; i < this.members.length; i++) {
+            if (this.members[i].role === role) {
+                return assignIn({}, this.members[i], {index: i});
             }
+        }
+    },
 
-            // trailing connectors..
-            i = nodes.length - 1;
-            while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
-                nodes.splice(i, 1);
-                if (index === i) index = 0;  // update leading connector instead
-                i = nodes.length - 1;
+
+    // Return the first member with the given id. A copy of the member object
+    // is returned, extended with an 'index' property whose value is the member index.
+    memberById: function(id) {
+        for (var i = 0; i < this.members.length; i++) {
+            if (this.members[i].id === id) {
+                return assignIn({}, this.members[i], {index: i});
             }
         }
+    },
 
-        nodes.splice(index, 1, id);
-        nodes = nodes.filter(noRepeatNodes);
 
-        // If the way was closed before, append a connector node to keep it closed..
-        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
-            nodes.push(nodes[0]);
+    // Return the first member with the given id and role. A copy of the member object
+    // is returned, extended with an 'index' property whose value is the member index.
+    memberByIdAndRole: function(id, role) {
+        for (var i = 0; i < this.members.length; i++) {
+            if (this.members[i].id === id && this.members[i].role === role) {
+                return assignIn({}, this.members[i], {index: i});
+            }
         }
+    },
 
-        return this.update({nodes: nodes});
+
+    addMember: function(member, index) {
+        var members = this.members.slice();
+        members.splice(index === undefined ? members.length : index, 0, member);
+        return this.update({members: members});
     },
 
 
-    // Replaces each occurrence of node id needle with replacement.
-    // Consecutive duplicates are eliminated including existing ones.
-    // Circularity is preserved.
-    replaceNode: function(needle, replacement) {
-        var nodes = this.nodes.slice(),
-            isClosed = this.isClosed();
+    updateMember: function(member, index) {
+        var members = this.members.slice();
+        members.splice(index, 1, assignIn({}, members[index], member));
+        return this.update({members: members});
+    },
 
-        for (var i = 0; i < nodes.length; i++) {
-            if (nodes[i] === needle) {
-                nodes[i] = replacement;
-            }
-        }
 
-        nodes = nodes.filter(noRepeatNodes);
+    removeMember: function(index) {
+        var members = this.members.slice();
+        members.splice(index, 1);
+        return this.update({members: members});
+    },
 
-        // If the way was closed before, append a connector node to keep it closed..
-        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
-            nodes.push(nodes[0]);
-        }
 
-        return this.update({nodes: nodes});
+    removeMembersWithID: function(id) {
+        var members = reject(this.members, function(m) { return m.id === id; });
+        return this.update({members: members});
     },
 
 
-    // Removes each occurrence of node id needle with replacement.
-    // Consecutive duplicates are eliminated including existing ones.
-    // Circularity is preserved.
-    removeNode: function(id) {
-        var nodes = this.nodes.slice(),
-            isClosed = this.isClosed();
+    // Wherever a member appears with id `needle.id`, replace it with a member
+    // with id `replacement.id`, type `replacement.type`, and the original role,
+    // By default, adding a duplicate member (by id and role) is prevented.
+    // Return an updated relation.
+    replaceMember: function(needle, replacement, keepDuplicates) {
+        if (!this.memberById(needle.id))
+            return this;
 
-        nodes = nodes
-            .filter(function(node) { return node !== id; })
-            .filter(noRepeatNodes);
+        var members = [];
 
-        // If the way was closed before, append a connector node to keep it closed..
-        if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
-            nodes.push(nodes[0]);
+        for (var i = 0; i < this.members.length; i++) {
+            var member = this.members[i];
+            if (member.id !== needle.id) {
+                members.push(member);
+            } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
+                members.push({id: replacement.id, type: replacement.type, role: member.role});
+            }
         }
 
-        return this.update({nodes: nodes});
+        return this.update({members: members});
     },
 
 
     asJXON: function(changeset_id) {
         var r = {
-            way: {
+            relation: {
                 '@id': this.osmId(),
                 '@version': this.version || 0,
-                nd: map$4(this.nodes, function(id) {
-                    return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
+                member: map$4(this.members, function(member) {
+                    return {
+                        keyAttributes: {
+                            type: member.type,
+                            role: member.role,
+                            ref: osmEntity.id.toOSM(member.id)
+                        }
+                    };
                 }),
                 tag: map$4(this.tags, function(v, k) {
                     return { keyAttributes: { k: k, v: v } };
                 })
             }
         };
-        if (changeset_id) {
-            r.way['@changeset'] = changeset_id;
-        }
+        if (changeset_id) r.relation['@changeset'] = changeset_id;
         return r;
     },
 
 
     asGeoJSON: function(resolver) {
-        return resolver.transient(this, 'GeoJSON', function() {
-            var coordinates = map$4(resolver.childNodes(this), 'loc');
-            if (this.isArea() && this.isClosed()) {
+        return resolver.transient(this, 'GeoJSON', function () {
+            if (this.isMultipolygon()) {
                 return {
-                    type: 'Polygon',
-                    coordinates: [coordinates]
+                    type: 'MultiPolygon',
+                    coordinates: this.multipolygon(resolver)
                 };
             } else {
                 return {
-                    type: 'LineString',
-                    coordinates: coordinates
+                    type: 'FeatureCollection',
+                    properties: this.tags,
+                    features: this.members.map(function (member) {
+                        return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
+                    })
                 };
             }
         });
@@ -68969,36 +71362,90 @@ assignIn(osmWay.prototype, {
 
     area: function(resolver) {
         return resolver.transient(this, 'area', function() {
-            var nodes = resolver.childNodes(this);
+            return d3_geoArea(this.asGeoJSON(resolver));
+        });
+    },
 
-            var json = {
-                type: 'Polygon',
-                coordinates: [map$4(nodes, 'loc')]
-            };
 
-            if (!this.isClosed() && nodes.length) {
-                json.coordinates[0].push(nodes[0].loc);
+    isMultipolygon: function() {
+        return this.tags.type === 'multipolygon';
+    },
+
+
+    isComplete: function(resolver) {
+        for (var i = 0; i < this.members.length; i++) {
+            if (!resolver.hasEntity(this.members[i].id)) {
+                return false;
             }
+        }
+        return true;
+    },
 
-            var area = d3_geoArea(json);
 
+    isRestriction: function() {
+        return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
+    },
+
+
+    // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
+    // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
+    //
+    // This corresponds to the structure needed for rendering a multipolygon path using a
+    // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
+    //
+    // In the case of invalid geometries, this function will still return a result which
+    // includes the nodes of all way members, but some Nds may be unclosed and some inner
+    // rings not matched with the intended outer ring.
+    //
+    multipolygon: function(resolver) {
+        var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
+            inners = this.members.filter(function(m) { return 'inner' === m.role; });
+
+        outers = osmJoinWays(outers, resolver);
+        inners = osmJoinWays(inners, resolver);
+
+        outers = outers.map(function(outer) { return map$4(outer.nodes, 'loc'); });
+        inners = inners.map(function(inner) { return map$4(inner.nodes, 'loc'); });
+
+        var result = outers.map(function(o) {
             // Heuristic for detecting counterclockwise winding order. Assumes
             // that OpenStreetMap polygons are not hemisphere-spanning.
-            if (area > 2 * Math.PI) {
-                json.coordinates[0] = json.coordinates[0].reverse();
-                area = d3_geoArea(json);
+            return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
+        });
+
+        function findOuter(inner) {
+            var o, outer;
+
+            for (o = 0; o < outers.length; o++) {
+                outer = outers[o];
+                if (geoPolygonContainsPolygon(outer, inner))
+                    return o;
             }
 
-            return isNaN(area) ? 0 : area;
-        });
-    }
-});
+            for (o = 0; o < outers.length; o++) {
+                outer = outers[o];
+                if (geoPolygonIntersectsPolygon(outer, inner, false))
+                    return o;
+            }
+        }
 
+        for (var i = 0; i < inners.length; i++) {
+            var inner = inners[i];
 
-// Filter function to eliminate consecutive duplicates.
-function noRepeatNodes(node, i, arr) {
-    return i === 0 || node !== arr[i - 1];
-}
+            if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
+                inner = inner.reverse();
+            }
+
+            var o = findOuter(inners[i]);
+            if (o !== undefined)
+                result[o].push(inners[i]);
+            else
+                result.push([inners[i]]); // Invalid geometry
+        }
+
+        return result;
+    }
+});
 
 /* Built-in method references for those with the same name as other `lodash` methods. */
 var nativeMax$8 = Math.max;
@@ -69237,34 +71684,173 @@ function osmInferRestriction(graph, from, via, to, projection) {
     return 'no_straight_on';
 }
 
-function actionAddMember(relationId, member, memberIndex) {
-    return function(graph) {
+function actionAddMember(relationId, member, memberIndex, insertPair) {
+
+    return function action(graph) {
         var relation = graph.entity(relationId);
 
-        if (isNaN(memberIndex) && member.type === 'way') {
-            var members = relation.indexedMembers();
-            members.push(member);
+        if ((isNaN(memberIndex) || insertPair) && member.type === 'way') {
+            // Try to perform sensible inserts based on how the ways join together
+            graph = addWayMember(relation, graph);
+        } else {
+            graph = graph.replace(relation.addMember(member, memberIndex));
+        }
+
+        return graph;
+    };
 
-            var joined = osmJoinWays(members, graph);
-            for (var i = 0; i < joined.length; i++) {
-                var segment = joined[i];
-                for (var j = 0; j < segment.length && segment.length >= 2; j++) {
-                    if (segment[j] !== member)
-                        continue;
 
-                    if (j === 0) {
-                        memberIndex = segment[j + 1].index;
-                    } else if (j === segment.length - 1) {
-                        memberIndex = segment[j - 1].index + 1;
+    // Add a way member into the relation "wherever it makes sense".
+    // In this situation we were not supplied a memberIndex.
+    function addWayMember(relation, graph) {
+        var groups, tempWay, item, i, j, k;
+
+        if (insertPair) {
+            // We're adding a member that must stay paired with an existing member.
+            // (This feature is used by `actionSplit`)
+            //
+            // This is tricky because the members may exist multiple times in the
+            // member list, and with different A-B/B-A ordering and different roles.
+            // (e.g. a bus route that loops out and back - #4589).
+            //
+            // Replace the existing member with a temporary way,
+            // so that `osmJoinWays` can treat the pair like a single way.
+            tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
+            graph = graph.replace(tempWay);
+            var tempMember = { id: tempWay.id, type: 'way', role: member.role };
+            var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
+            groups = groupBy(tempRelation.members, function(m) { return m.type; });
+            groups.way = groups.way || [];
+
+        } else {
+            // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
+            groups = groupBy(relation.members, function(m) { return m.type; });
+            groups.way = groups.way || [];
+            groups.way.push(member);
+        }
+
+        var members = withIndex(groups.way);
+        var joined = osmJoinWays(members, graph);
+
+        // `joined` might not contain all of the way members,
+        // But will contain only the completed (downloaded) members
+        for (i = 0; i < joined.length; i++) {
+            var segment = joined[i];
+            var nodes = segment.nodes.slice();
+            var startIndex = segment[0].index;
+
+            // j = array index in `members` where this segment starts
+            for (j = 0; j < members.length; j++) {
+                if (members[j].index === startIndex) {
+                    break;
+                }
+            }
+
+            // k = each member in segment
+            for (k = 0; k < segment.length; k++) {
+                item = segment[k];
+                var way = graph.entity(item.id);
+
+                // If this is a paired item, generate members in correct order and role
+                if (tempWay && item.id === tempWay.id) {
+                    if (nodes[0].id === insertPair.nodes[0]) {
+                        item.pair = [
+                            { id: insertPair.originalID, type: 'way', role: item.role },
+                            { id: insertPair.insertedID, type: 'way', role: item.role }
+                        ];
                     } else {
-                        memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
+                        item.pair = [
+                            { id: insertPair.insertedID, type: 'way', role: item.role },
+                            { id: insertPair.originalID, type: 'way', role: item.role }
+                        ];
                     }
                 }
+
+                // reorder `members` if necessary
+                if (k > 0) {
+                    if (j+k >= members.length || item.index !== members[j+k].index) {
+                        moveMember(members, item.index, j+k);
+                    }
+                }
+
+                nodes.splice(0, way.nodes.length - 1);
             }
         }
 
-        return graph.replace(relation.addMember(member, memberIndex));
-    };
+        if (tempWay) {
+            graph = graph.remove(tempWay);
+        }
+
+        // Final pass: skip dead items, split pairs, remove index properties
+        var wayMembers = [];
+        for (i = 0; i < members.length; i++) {
+            item = members[i];
+            if (item.index === -1) continue;
+
+            if (item.pair) {
+                wayMembers.push(item.pair[0]);
+                wayMembers.push(item.pair[1]);
+            } else {
+                wayMembers.push(omit(item, 'index'));
+            }
+        }
+
+        // Write members in the order: nodes, ways, relations
+        // This is reccomended for Public Transport routes:
+        // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
+        var newMembers = (groups.node || []).concat(wayMembers, (groups.relation || []));
+
+        return graph.replace(relation.update({members: newMembers}));
+
+
+        // `moveMember()` changes the `members` array in place by splicing
+        // the item with `.index = findIndex` to where it belongs,
+        // and marking the old position as "dead" with `.index = -1`
+        //
+        // j=5, k=0                jk
+        // segment                 5 4 7 6
+        // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
+        //
+        // j=5, k=1                j k
+        // segment                 5 4 7 6
+        // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
+        // members       0 1 2 3 x 5 4 6 7 8 9      moved
+        //
+        // j=5, k=2                j   k
+        // segment                 5 4 7 6
+        // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
+        // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
+        //
+        // j=5, k=3                j     k
+        // segment                 5 4 7 6
+        // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
+        //
+        function moveMember(arr, findIndex, toIndex) {
+            for (var i = 0; i < arr.length; i++) {
+                if (arr[i].index === findIndex) {
+                    break;
+                }
+            }
+
+            var item = clone(arr[i]);
+            arr[i].index = -1;   // mark as dead
+            item.index = toIndex;
+            arr.splice(toIndex, 0, item);
+        }
+
+
+        // This is the same as `Relation.indexedMembers`,
+        // Except we don't want to index all the members, only the ways
+        function withIndex(arr) {
+            var result = new Array(arr.length);
+            for (var i = 0; i < arr.length; i++) {
+                result[i] = arr[i];
+                result[i].index = i;
+            }
+            return result;
+        }
+    }
+
 }
 
 function actionAddMidpoint(midpoint, node) {
@@ -69347,8 +71933,8 @@ function actionCircularize(wayId, projection, maxAngle) {
             keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
             points = nodes.map(function(n) { return projection(n.loc); }),
             keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
-            centroid = (points.length === 2) ? geoInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
-            radius = d3_median(points, function(p) { return geoEuclideanDistance(centroid, p); }),
+            centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
+            radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
             sign = d3_polygonArea(points) > 0 ? 1 : -1,
             ids;
 
@@ -69388,7 +71974,7 @@ function actionCircularize(wayId, projection, maxAngle) {
             }
 
             // position this key node
-            var distance = geoEuclideanDistance(centroid, keyPoints[i]);
+            var distance = geoVecLength(centroid, keyPoints[i]);
             if (distance === 0) { distance = 1e-4; }
             keyPoints[i] = [
                 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
@@ -69397,7 +71983,7 @@ function actionCircularize(wayId, projection, maxAngle) {
             loc = projection.invert(keyPoints[i]);
             node = keyNodes[i];
             origNode = origNodes[node.id];
-            node = node.move(geoInterp(origNode.loc, loc, t));
+            node = node.move(geoVecInterp(origNode.loc, loc, t));
             graph = graph.replace(node);
 
             // figure out the between delta angle we want to match to
@@ -69428,7 +72014,7 @@ function actionCircularize(wayId, projection, maxAngle) {
                 origNode = origNodes[node.id];
                 nearNodes[node.id] = angle;
 
-                node = node.move(geoInterp(origNode.loc, loc, t));
+                node = node.move(geoVecInterp(origNode.loc, loc, t));
                 graph = graph.replace(node);
             }
 
@@ -69451,7 +72037,7 @@ function actionCircularize(wayId, projection, maxAngle) {
                     }
                 }
 
-                node = osmNode({ loc: geoInterp(origNode.loc, loc, t) });
+                node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
                 graph = graph.replace(node);
 
                 nodes.splice(endNodeIndex + j, 0, node);
@@ -69526,7 +72112,7 @@ function actionCircularize(wayId, projection, maxAngle) {
 
             // move interior nodes to the surface of the convex hull..
             for (var j = 1; j < indexRange; j++) {
-                var point = geoInterp(hull[i], hull[i+1], j / indexRange),
+                var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
                     node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
                 graph = graph.replace(node);
             }
@@ -69948,25 +72534,30 @@ function actionJoin(ids) {
 
 
     var action = function(graph) {
-        var ways = ids.map(graph.entity, graph),
-            survivor = ways[0];
+        var ways = ids.map(graph.entity, graph);
+        var survivorID = ways[0].id;
 
         // Prefer to keep an existing way.
         for (var i = 0; i < ways.length; i++) {
             if (!ways[i].isNew()) {
-                survivor = ways[i];
+                survivorID = ways[i].id;
                 break;
             }
         }
 
-        var joined = osmJoinWays(ways, graph)[0];
+        var sequences = osmJoinWays(ways, graph);
+        var joined = sequences[0];
 
-        survivor = survivor.update({nodes: map$4(joined.nodes, 'id')});
+        // We might need to reverse some of these ways before joining them.  #4688
+        // `joined.actions` property will contain any actions we need to apply.
+        graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
+
+        var survivor = graph.entity(survivorID);
+        survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
         graph = graph.replace(survivor);
 
         joined.forEach(function(way) {
-            if (way.id === survivor.id)
-                return;
+            if (way.id === survivorID) return;
 
             graph.parentRelations(way).forEach(function(parent) {
                 graph = graph.replace(parent.replaceMember(way, survivor));
@@ -69991,10 +72582,10 @@ function actionJoin(ids) {
         if (joined.length > 1)
             return 'not_adjacent';
 
-        var nodeIds = map$4(joined[0].nodes, 'id').slice(1, -1),
-            relation,
-            tags = {},
-            conflicting = false;
+        var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
+        var relation;
+        var tags = {};
+        var conflicting = false;
 
         joined[0].forEach(function(way) {
             var parents = graph.parentRelations(way);
@@ -70723,10 +73314,7 @@ function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
 function actionMove(moveIds, tryDelta, projection, cache) {
-    var delta = tryDelta;
-
-    function vecAdd(a, b) { return [a[0] + b[0], a[1] + b[1]]; }
-    function vecSub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }
+    var _delta = tryDelta;
 
     function setupCache(graph) {
         function canMove(nodeId) {
@@ -70745,12 +73333,13 @@ function actionMove(moveIds, tryDelta, projection, cache) {
         }
 
         function cacheEntities(ids) {
-            ids.forEach(function(id) {
-                if (cache.moving[id]) return;
+            for (var i = 0; i < ids.length; i++) {
+                var id = ids[i];
+                if (cache.moving[id]) continue;
                 cache.moving[id] = true;
 
                 var entity = graph.hasEntity(id);
-                if (!entity) return;
+                if (!entity) continue;
 
                 if (entity.type === 'node') {
                     cache.nodes.push(id);
@@ -70763,37 +73352,48 @@ function actionMove(moveIds, tryDelta, projection, cache) {
                         return member.id;
                     }));
                 }
-            });
+            }
         }
 
         function cacheIntersections(ids) {
-            function isEndpoint(way, id) { return !way.isClosed() && !!way.affix(id); }
+            function isEndpoint(way, id) {
+                return !way.isClosed() && !!way.affix(id);
+            }
+
+            for (var i = 0; i < ids.length; i++) {
+                var id = ids[i];
 
-            ids.forEach(function(id) {
                 // consider only intersections with 1 moved and 1 unmoved way.
                 var childNodes = graph.childNodes(graph.entity(id));
-                childNodes.forEach(function(node) {
+                for (var j = 0; j < childNodes.length; j++) {
+                    var node = childNodes[j];
                     var parents = graph.parentWays(node);
-                    if (parents.length !== 2) return;
-
-                    var moved = graph.entity(id),
-                        unmoved = find$1(parents, function(way) { return !cache.moving[way.id]; });
-                    if (!unmoved) return;
+                    if (parents.length !== 2) continue;
+
+                    var moved = graph.entity(id);
+                    var unmoved = null;
+                    for (var k = 0; k < parents.length; k++) {
+                        var way = parents[k];
+                        if (!cache.moving[way.id]) {
+                            unmoved = way;
+                            break;
+                        }
+                    }
+                    if (!unmoved) continue;
 
                     // exclude ways that are overly connected..
-                    if (intersection(moved.nodes, unmoved.nodes).length > 2) return;
+                    if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
+                    if (moved.isArea() || unmoved.isArea()) continue;
 
-                    if (moved.isArea() || unmoved.isArea()) return;
-
-                    cache.intersection[node.id] = {
+                    cache.intersections.push({
                         nodeId: node.id,
                         movedId: moved.id,
                         unmovedId: unmoved.id,
                         movedIsEP: isEndpoint(moved, node.id),
                         unmovedIsEP: isEndpoint(unmoved, node.id)
-                    };
-                });
-            });
+                    });
+                }
+            }
         }
 
 
@@ -70802,7 +73402,7 @@ function actionMove(moveIds, tryDelta, projection, cache) {
         }
         if (!cache.ok) {
             cache.moving = {};
-            cache.intersection = {};
+            cache.intersections = [];
             cache.replacedVertex = {};
             cache.startLoc = {};
             cache.nodes = [];
@@ -70818,11 +73418,26 @@ function actionMove(moveIds, tryDelta, projection, cache) {
 
 
     // Place a vertex where the moved vertex used to be, to preserve way shape..
+    //
+    //  Start:
+    //      b ---- e
+    //     / \
+    //    /   \
+    //   /     \
+    //  a       c
+    //
+    //      *               node '*' added to preserve shape
+    //     / \
+    //    /   b ---- e      way `b,e` moved here:
+    //   /     \
+    //  a       c
+    //
+    //
     function replaceMovedVertex(nodeId, wayId, graph, delta) {
-        var way = graph.entity(wayId),
-            moved = graph.entity(nodeId),
-            movedIndex = way.nodes.indexOf(nodeId),
-            len, prevIndex, nextIndex;
+        var way = graph.entity(wayId);
+        var moved = graph.entity(nodeId);
+        var movedIndex = way.nodes.indexOf(nodeId);
+        var len, prevIndex, nextIndex;
 
         if (way.isClosed()) {
             len = way.nodes.length - 1;
@@ -70834,14 +73449,14 @@ function actionMove(moveIds, tryDelta, projection, cache) {
             nextIndex = movedIndex + 1;
         }
 
-        var prev = graph.hasEntity(way.nodes[prevIndex]),
-            next = graph.hasEntity(way.nodes[nextIndex]);
+        var prev = graph.hasEntity(way.nodes[prevIndex]);
+        var next = graph.hasEntity(way.nodes[nextIndex]);
 
         // Don't add orig vertex at endpoint..
         if (!prev || !next) return graph;
 
-        var key = wayId + '_' + nodeId,
-            orig = cache.replacedVertex[key];
+        var key = wayId + '_' + nodeId;
+        var orig = cache.replacedVertex[key];
         if (!orig) {
             orig = osmNode();
             cache.replacedVertex[key] = orig;
@@ -70851,7 +73466,7 @@ function actionMove(moveIds, tryDelta, projection, cache) {
         var start, end;
         if (delta) {
             start = projection(cache.startLoc[nodeId]);
-            end = projection.invert(vecAdd(start, delta));
+            end = projection.invert(geoVecAdd(start, delta));
         } else {
             end = cache.startLoc[nodeId];
         }
@@ -70863,16 +73478,12 @@ function actionMove(moveIds, tryDelta, projection, cache) {
         // Don't add orig vertex if it would just make a straight line..
         if (angle > 175 && angle < 185) return graph;
 
-        // Don't add orig vertex if another point is already nearby (within 10m)
-        if (geoSphericalDistance(prev.loc, orig.loc) < 10 ||
-            geoSphericalDistance(orig.loc, next.loc) < 10) return graph;
-
         // moving forward or backward along way?
-        var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection),
-            p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection),
-            d1 = geoPathLength(p1),
-            d2 = geoPathLength(p2),
-            insertAt = (d1 < d2) ? movedIndex : nextIndex;
+        var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
+        var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
+        var d1 = geoPathLength(p1);
+        var d2 = geoPathLength(p2);
+        var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
 
         // moving around closed loop?
         if (way.isClosed() && insertAt === 0) insertAt = len;
@@ -70882,32 +73493,81 @@ function actionMove(moveIds, tryDelta, projection, cache) {
     }
 
 
+    // Remove duplicate vertex that might have been added by
+    // replaceMovedVertex.  This is done after the unzorro checks.
+    function removeDuplicateVertices(wayId, graph) {
+        var way = graph.entity(wayId);
+        var epsilon = 1e-6;
+        var prev, curr;
+
+        function isInteresting(node, graph) {
+            return graph.parentWays(node).length > 1 ||
+                graph.parentRelations(node).length ||
+                node.hasInterestingTags();
+        }
+
+        for (var i = 0; i < way.nodes.length; i++) {
+            curr = graph.entity(way.nodes[i]);
+
+            if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
+                if (!isInteresting(prev, graph)) {
+                    way = way.removeNode(prev.id);
+                    graph = graph.replace(way).remove(prev);
+                } else if (!isInteresting(curr, graph)) {
+                    way = way.removeNode(curr.id);
+                    graph = graph.replace(way).remove(curr);
+                }
+            }
+
+            prev = curr;
+        }
+
+        return graph;
+    }
+
+
     // Reorder nodes around intersections that have moved..
+    //
+    //  Start:                way1.nodes: b,e         (moving)
+    //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
+    //      |                 vertex: b
+    //      e                 isEP1: true,  isEP2, false
+    //
+    //  way1 `b,e` moved here:
+    //  a ----- c = b - d
+    //              |
+    //              e
+    //
+    //  reorder nodes         way1.nodes: b,e
+    //  a ----- c - b - d     way2.nodes: a,c,b,d
+    //              |
+    //              e
+    //
     function unZorroIntersection(intersection$$1, graph) {
-        var vertex = graph.entity(intersection$$1.nodeId),
-            way1 = graph.entity(intersection$$1.movedId),
-            way2 = graph.entity(intersection$$1.unmovedId),
-            isEP1 = intersection$$1.movedIsEP,
-            isEP2 = intersection$$1.unmovedIsEP;
+        var vertex = graph.entity(intersection$$1.nodeId);
+        var way1 = graph.entity(intersection$$1.movedId);
+        var way2 = graph.entity(intersection$$1.unmovedId);
+        var isEP1 = intersection$$1.movedIsEP;
+        var isEP2 = intersection$$1.unmovedIsEP;
 
         // don't move the vertex if it is the endpoint of both ways.
         if (isEP1 && isEP2) return graph;
 
-        var nodes1 = without(graph.childNodes(way1), vertex),
-            nodes2 = without(graph.childNodes(way2), vertex);
+        var nodes1 = without(graph.childNodes(way1), vertex);
+        var nodes2 = without(graph.childNodes(way2), vertex);
 
         if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
         if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
 
-        var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection),
-            edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection),
-            loc;
+        var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
+        var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
+        var loc;
 
         // snap vertex to nearest edge (or some point between them)..
         if (!isEP1 && !isEP2) {
-            var epsilon = 1e-4, maxIter = 10;
+            var epsilon = 1e-6, maxIter = 10;
             for (var i = 0; i < maxIter; i++) {
-                loc = geoInterp(edge1.loc, edge2.loc, 0.5);
+                loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
                 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
                 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
                 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
@@ -70935,11 +73595,14 @@ function actionMove(moveIds, tryDelta, projection, cache) {
 
 
     function cleanupIntersections(graph) {
-        forEach(cache.intersection, function(obj) {
-            graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, delta);
+        for (var i = 0; i < cache.intersections.length; i++) {
+            var obj = cache.intersections[i];
+            graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
             graph = unZorroIntersection(obj, graph);
-        });
+            graph = removeDuplicateVertices(obj.movedId, graph);
+            graph = removeDuplicateVertices(obj.unmovedId, graph);
+        }
 
         return graph;
     }
@@ -70947,48 +73610,53 @@ function actionMove(moveIds, tryDelta, projection, cache) {
 
     // check if moving way endpoint can cross an unmoved way, if so limit delta..
     function limitDelta(graph) {
-        forEach(cache.intersection, function(obj) {
+        function moveNode(loc) {
+            return geoVecAdd(projection(loc), _delta);
+        }
+
+        for (var i = 0; i < cache.intersections.length; i++) {
+            var obj = cache.intersections[i];
+
             // Don't limit movement if this is vertex joins 2 endpoints..
-            if (obj.movedIsEP && obj.unmovedIsEP) return;
+            if (obj.movedIsEP && obj.unmovedIsEP) continue;
             // Don't limit movement if this vertex is not an endpoint anyway..
-            if (!obj.movedIsEP) return;
-
-            var node = graph.entity(obj.nodeId),
-                start = projection(node.loc),
-                end = vecAdd(start, delta),
-                movedNodes = graph.childNodes(graph.entity(obj.movedId)),
-                movedPath = map$4(map$4(movedNodes, 'loc'),
-                    function(loc) { return vecAdd(projection(loc), delta); }),
-                unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)),
-                unmovedPath = map$4(map$4(unmovedNodes, 'loc'), projection),
-                hits = geoPathIntersections(movedPath, unmovedPath);
-
-            for (var i = 0; i < hits.length; i++) {
-                if (isEqual(hits[i], end)) continue;
+            if (!obj.movedIsEP) continue;
+
+            var node = graph.entity(obj.nodeId);
+            var start = projection(node.loc);
+            var end = geoVecAdd(start, _delta);
+            var movedNodes = graph.childNodes(graph.entity(obj.movedId));
+            var movedPath = map$4(map$4(movedNodes, 'loc'), moveNode);
+            var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
+            var unmovedPath = map$4(map$4(unmovedNodes, 'loc'), projection);
+            var hits = geoPathIntersections(movedPath, unmovedPath);
+
+            for (var j = 0; i < hits.length; i++) {
+                if (isEqual(hits[j], end)) continue;
                 var edge = geoChooseEdge(unmovedNodes, end, projection);
-                delta = vecSub(projection(edge.loc), start);
+                _delta = geoVecSubtract(projection(edge.loc), start);
             }
-        });
+        }
     }
 
 
     var action = function(graph) {
-        if (delta[0] === 0 && delta[1] === 0) return graph;
+        if (_delta[0] === 0 && _delta[1] === 0) return graph;
 
         setupCache(graph);
 
-        if (!isEmpty(cache.intersection)) {
+        if (cache.intersections.length) {
             limitDelta(graph);
         }
 
-        forEach(cache.nodes, function(id) {
-            var node = graph.entity(id),
-                start = projection(node.loc),
-                end = vecAdd(start, delta);
+        for (var i = 0; i < cache.nodes.length; i++) {
+            var node = graph.entity(cache.nodes[i]);
+            var start = projection(node.loc);
+            var end = geoVecAdd(start, _delta);
             graph = graph.replace(node.move(projection.invert(end)));
-        });
+        }
 
-        if (!isEmpty(cache.intersection)) {
+        if (cache.intersections.length) {
             graph = cleanupIntersections(graph);
         }
 
@@ -70997,19 +73665,28 @@ function actionMove(moveIds, tryDelta, projection, cache) {
 
 
     action.delta = function() {
-        return delta;
+        return _delta;
     };
 
 
     return action;
 }
 
-// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
-// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
-function actionMoveNode(nodeId, loc) {
-    return function(graph) {
-        return graph.replace(graph.entity(nodeId).move(loc));
+function actionMoveNode(nodeID, toLoc) {
+
+    var action = function(graph, t) {
+        if (t === null || !isFinite(t)) t = 1;
+        t = Math.min(Math.max(+t, 0), 1);
+
+        var node = graph.entity(nodeID);
+        return graph.replace(
+            node.move(geoVecInterp(node.loc, toLoc, t))
+        );
     };
+
+    action.transitionable = true;
+
+    return action;
 }
 
 function actionNoop() {
@@ -71050,7 +73727,7 @@ function actionOrthogonalize(wayId, projection) {
 
             node = graph.entity(nodes[corner.i].id);
             loc = projection.invert(points[corner.i]);
-            graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
+            graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
 
         } else {
             var best,
@@ -71079,7 +73756,7 @@ function actionOrthogonalize(wayId, projection) {
                 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
                     loc = projection.invert(points[i]);
                     node = graph.entity(nodes[i].id);
-                    graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
+                    graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
                 }
             }
 
@@ -71110,7 +73787,7 @@ function actionOrthogonalize(wayId, projection) {
                 q = subtractPoints(c, b),
                 scale, dotp;
 
-            scale = 2 * Math.min(geoEuclideanDistance(p, [0, 0]), geoEuclideanDistance(q, [0, 0]));
+            scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
             p = normalizePoint(p, 1.0);
             q = normalizePoint(q, 1.0);
 
@@ -71223,7 +73900,7 @@ function actionOrthogonalize(wayId, projection) {
 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
 //
 function actionSplit(nodeId, newWayIds) {
-    var wayIds;
+    var _wayIDs;
 
     // if the way is closed, we need to search for a partner node
     // to split the way at.
@@ -71236,11 +73913,11 @@ function actionSplit(nodeId, newWayIds) {
     // For example: bone-shaped areas get split across their waist
     // line, circles across the diameter.
     function splitArea(nodes, idxA, graph) {
-        var lengths = new Array(nodes.length),
-            length,
-            i,
-            best = 0,
-            idxB;
+        var lengths = new Array(nodes.length);
+        var length;
+        var i;
+        var best = 0;
+        var idxB;
 
         function wrap(index) {
             return utilWrap(index, nodes.length);
@@ -71278,16 +73955,17 @@ function actionSplit(nodeId, newWayIds) {
 
 
     function split(graph, wayA, newWayId) {
-        var wayB = osmWay({id: newWayId, tags: wayA.tags}),
-            nodesA,
-            nodesB,
-            isArea = wayA.isArea(),
-            isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
+        var wayB = osmWay({id: newWayId, tags: wayA.tags});
+        var origNodes = wayA.nodes.slice();
+        var nodesA;
+        var nodesB;
+        var isArea = wayA.isArea();
+        var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
 
         if (wayA.isClosed()) {
-            var nodes = wayA.nodes.slice(0, -1),
-                idxA = indexOf(nodes, nodeId),
-                idxB = splitArea(nodes, idxA, graph);
+            var nodes = wayA.nodes.slice(0, -1);
+            var idxA = indexOf(nodes, nodeId);
+            var idxB = splitArea(nodes, idxA, graph);
 
             if (idxB < idxA) {
                 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
@@ -71328,7 +74006,13 @@ function actionSplit(nodeId, newWayIds) {
                     role: relation.memberById(wayA.id).role
                 };
 
-                graph = actionAddMember(relation.id, member)(graph);
+                var insertPair = {
+                    originalID: wayA.id,
+                    insertedID: wayB.id,
+                    nodes: origNodes
+                };
+
+                graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
             }
         });
 
@@ -71338,7 +74022,8 @@ function actionSplit(nodeId, newWayIds) {
                 members: [
                     {id: wayA.id, role: 'outer', type: 'way'},
                     {id: wayB.id, role: 'outer', type: 'way'}
-                ]});
+                ]
+            });
 
             graph = graph.replace(multipolygon);
             graph = graph.replace(wayA.update({tags: {}}));
@@ -71359,15 +74044,15 @@ function actionSplit(nodeId, newWayIds) {
 
 
     action.ways = function(graph) {
-        var node = graph.entity(nodeId),
-            parents = graph.parentWays(node),
-            hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
+        var node = graph.entity(nodeId);
+        var parents = graph.parentWays(node);
+        var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
 
         return parents.filter(function(parent) {
-            if (wayIds && wayIds.indexOf(parent.id) === -1)
+            if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
                 return false;
 
-            if (!wayIds && hasLines && parent.geometry(graph) !== 'line')
+            if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
                 return false;
 
             if (parent.isClosed()) {
@@ -71387,14 +74072,14 @@ function actionSplit(nodeId, newWayIds) {
 
     action.disabled = function(graph) {
         var candidates = action.ways(graph);
-        if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
+        if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
             return 'not_eligible';
     };
 
 
     action.limitWays = function(_) {
-        if (!arguments.length) return wayIds;
-        wayIds = _;
+        if (!arguments.length) return _wayIDs;
+        _wayIDs = _;
         return action;
     };
 
@@ -71579,7 +74264,7 @@ function actionStraighten(wayId, projection) {
                     ],
                     loc2 = projection.invert(p);
 
-                graph = graph.replace(node.move(geoInterp(node.loc, loc2, t)));
+                graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
 
             } else {
                 // safe to delete
@@ -71604,7 +74289,7 @@ function actionStraighten(wayId, projection) {
             points = nodes.map(function(n) { return projection(n.loc); }),
             startPoint = points[0],
             endPoint = points[points.length-1],
-            threshold = 0.2 * geoEuclideanDistance(startPoint, endPoint),
+            threshold = 0.2 * geoVecLength(startPoint, endPoint),
             i;
 
         if (threshold === 0) {
@@ -71712,7 +74397,7 @@ function actionReflect(reflectIds, projection) {
             q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
             p, q;
 
-        var isLong = (geoEuclideanDistance(p1, q1) > geoEuclideanDistance(p2, q2));
+        var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
         if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
             p = p1;
             q = q1;
@@ -71735,7 +74420,7 @@ function actionReflect(reflectIds, projection) {
                 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
             ];
             var loc2 = projection.invert(c2);
-            node = node.move(geoInterp(node.loc, loc2, t));
+            node = node.move(geoVecInterp(node.loc, loc2, t));
             graph = graph.replace(node);
         }
 
@@ -71775,13 +74460,17 @@ var iD = Object.freeze({
        Connection: Connection,
        debug: debug,
        lib: index$4,
-       d3: index,
+       d3: index$3,
        Context: coreContext,
        setAreaKeys: setAreaKeys,
        Difference: coreDifference,
        Graph: coreGraph,
        History: coreHistory,
        Tree: coreTree,
+       geoCross: geoVecCross,
+       geoInterp: geoVecInterp,
+       geoRoundCoordinates: geoVecFloor,
+       geoEuclideanDistance: geoVecLength,
        Entity: osmEntity,
        Node: osmNode,
        Relation: osmRelation,
@@ -71848,7 +74537,7 @@ var iD = Object.freeze({
        coreTree: coreTree,
        dataFeatureIcons: dataFeatureIcons,
        data: data,
-       dataWikipedia: wikipedia,
+       dataWikipedia: wikipedia$2,
        dataSuggestions: dataSuggestions,
        dataAddressFormats: dataAddressFormats,
        dataDeprecated: dataDeprecated,
@@ -71859,29 +74548,41 @@ var iD = Object.freeze({
        dataImperial: dataImperial,
        dataDriveLeft: dataDriveLeft,
        dataEn: en,
-       geoAngle: geoAngle,
-       geoChooseEdge: geoChooseEdge,
-       geoCross: geoCross,
-       geoEdgeEqual: geoEdgeEqual,
-       geoEuclideanDistance: geoEuclideanDistance,
        geoExtent: geoExtent,
-       geoInterp: geoInterp,
-       geoRawMercator: geoRawMercator,
-       geoRoundCoords: geoRoundCoords,
-       geoRotate: geoRotate,
        geoLatToMeters: geoLatToMeters,
-       geoLineIntersection: geoLineIntersection,
        geoLonToMeters: geoLonToMeters,
        geoMetersToLat: geoMetersToLat,
        geoMetersToLon: geoMetersToLon,
        geoMetersToOffset: geoMetersToOffset,
        geoOffsetToMeters: geoOffsetToMeters,
+       geoScaleToZoom: geoScaleToZoom,
+       geoSphericalDistance: geoSphericalDistance,
+       geoZoomToScale: geoZoomToScale,
+       geoAngle: geoAngle,
+       geoChooseEdge: geoChooseEdge,
+       geoEdgeEqual: geoEdgeEqual,
+       geoHasLineIntersections: geoHasLineIntersections,
+       geoHasSelfIntersections: geoHasSelfIntersections,
+       geoRotate: geoRotate,
+       geoLineIntersection: geoLineIntersection,
+       geoPathHasIntersections: geoPathHasIntersections,
        geoPathIntersections: geoPathIntersections,
        geoPathLength: geoPathLength,
        geoPointInPolygon: geoPointInPolygon,
        geoPolygonContainsPolygon: geoPolygonContainsPolygon,
        geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
-       geoSphericalDistance: geoSphericalDistance,
+       geoViewportEdge: geoViewportEdge,
+       geoRawMercator: geoRawMercator,
+       geoVecAdd: geoVecAdd,
+       geoVecAngle: geoVecAngle,
+       geoVecCross: geoVecCross,
+       geoVecDot: geoVecDot,
+       geoVecEqual: geoVecEqual,
+       geoVecFloor: geoVecFloor,
+       geoVecInterp: geoVecInterp,
+       geoVecLength: geoVecLength,
+       geoVecSubtract: geoVecSubtract,
+       geoVecScale: geoVecScale,
        modeAddArea: modeAddArea,
        modeAddLine: modeAddLine,
        modeAddPoint: modeAddPoint,
@@ -71953,10 +74654,12 @@ var iD = Object.freeze({
        svgOneWaySegments: svgOneWaySegments,
        svgOpenstreetcamImages: svgOpenstreetcamImages,
        svgOsm: svgOsm,
+       svgPassiveVertex: svgPassiveVertex,
        svgPath: svgPath,
        svgPointTransform: svgPointTransform,
        svgPoints: svgPoints,
        svgRelationMemberTags: svgRelationMemberTags,
+       svgSegmentWay: svgSegmentWay,
        svgTagClasses: svgTagClasses,
        svgTurns: svgTurns,
        svgVertices: svgVertices,
@@ -71995,6 +74698,8 @@ var iD = Object.freeze({
        uiAccount: uiAccount,
        uiAttribution: uiAttribution,
        uiBackground: uiBackground,
+       uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
+       uiBackgroundOffset: uiBackgroundOffset,
        uiChangesetEditor: uiChangesetEditor,
        uiCmd: uiCmd,
        uiCommit: uiCommit,
index 891492c1b4e72ff6c7baba805f452c2cb8e65eff..f1a7516572d79cb578800df4ba8896eb0e222715 100644 (file)
Binary files a/vendor/assets/iD/iD/img/arrow-icon.png and b/vendor/assets/iD/iD/img/arrow-icon.png differ
diff --git a/vendor/assets/iD/iD/img/background-pattern-1.png b/vendor/assets/iD/iD/img/background-pattern-1.png
deleted file mode 100644 (file)
index d2f2bcb..0000000
Binary files a/vendor/assets/iD/iD/img/background-pattern-1.png and /dev/null differ
diff --git a/vendor/assets/iD/iD/img/background-pattern-opacity.png b/vendor/assets/iD/iD/img/background-pattern-opacity.png
deleted file mode 100644 (file)
index f243762..0000000
Binary files a/vendor/assets/iD/iD/img/background-pattern-opacity.png and /dev/null differ
index 1228707295702c13b7b5468d62947714627f5151..d106a46e5edc99a6cadc3bd0bef488c16354c7d7 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-draw-connect-line.png and b/vendor/assets/iD/iD/img/cursor-draw-connect-line.png differ
index 9e45b4011bec391f79876a6d624f77b1c9b37d53..c884e568bfa04716a6cd26521c8865f95c69b694 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-draw-connect-line2x.png and b/vendor/assets/iD/iD/img/cursor-draw-connect-line2x.png differ
index bd2766bde58ee2b912b9ea6df0c29e6ad5b13d58..409c294dbcf4a676b19574c4180bfc6c2844132e 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-draw-connect-vertex.png and b/vendor/assets/iD/iD/img/cursor-draw-connect-vertex.png differ
index e2c88221b264182b1da2430f190a66e471b120fb..5e5d3ca1c0acb898ab5d21d809f919dd378288f5 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-draw-connect-vertex2x.png and b/vendor/assets/iD/iD/img/cursor-draw-connect-vertex2x.png differ
index 27ccf75e8b348644a01948a33f3d8909b6fa05e1..c03dcfc7de98b8e85228ca122f81ddf608d06c6d 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-draw.png and b/vendor/assets/iD/iD/img/cursor-draw.png differ
index 13ed46442f4e712a34fa66b352ad117f31d28e8d..033c6c4c5b8b19f4ec7d59caacd1eadd11f004b0 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-grab2x.png and b/vendor/assets/iD/iD/img/cursor-grab2x.png differ
index 8875f1a21127a466ce1ccad103355d9727991b8c..a6e8370d242aed60ce1f6a89e39090177e72080c 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-grabbing.png and b/vendor/assets/iD/iD/img/cursor-grabbing.png differ
index 9db25bcc7d390095285b4009aeafef0fbefec36e..e32cb6c9c0716debe15a5ae53302878a2abf4a97 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-grabbing2x.png and b/vendor/assets/iD/iD/img/cursor-grabbing2x.png differ
index 910bc7f19ad356a3d551577b43bfd60989b1958c..935cff02a17259c2b1777599af884bc9bd1c9885 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-pointing.png and b/vendor/assets/iD/iD/img/cursor-pointing.png differ
index dce3793f528d8f3f343b2bbe912271a1fb2578a8..e1dfda2c86428cc11f221b893f0dab373135c710 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-pointing2x.png and b/vendor/assets/iD/iD/img/cursor-pointing2x.png differ
index f0d3756acf25702e3a91bdd902b49a62482f49e4..3b8c5389063632f7a27f4a53212d440153abbee6 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-acting.png and b/vendor/assets/iD/iD/img/cursor-select-acting.png differ
index 7611328eb40795c0d27a788748e925420ea53b8c..bb3e24c40e1a25b7ccdda994b88c206759047f5e 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-acting2x.png and b/vendor/assets/iD/iD/img/cursor-select-acting2x.png differ
index 3dcfe531550591b924c0813cd97f95c3a7c90f59..d9b9d8e6a48e034eb5478f8ba4c7cc2ef9769dce 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-add.png and b/vendor/assets/iD/iD/img/cursor-select-add.png differ
index 07a7a11ab4d09e828a2a587eff9a12ac2823cccb..d17fc22ac4d88d391188c707e850c63e893b247f 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-area.png and b/vendor/assets/iD/iD/img/cursor-select-area.png differ
index 84efbe929efaea31d80acc4559428980c0e9fc38..63d094e28334ede3e16063925c251ccac5f0f28b 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-area2x.png and b/vendor/assets/iD/iD/img/cursor-select-area2x.png differ
index bdd39986ef3da04847fe0da004ddc153c33c6e71..38a0b015fb66d84cf39843c6c3995b9625af7c85 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-line.png and b/vendor/assets/iD/iD/img/cursor-select-line.png differ
index 726ca11c847f70e0fc63f702b8d7289bf1f4ba50..4dbc5e0e5f172133f5fcf5b535c6eb2d159df968 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-line2x.png and b/vendor/assets/iD/iD/img/cursor-select-line2x.png differ
index 5bf5c3feb5cd34d003df66d478690519c0c7f0bb..eeed38d0d0fd1c189a9bf9fb9e8cfabbf9d8b0bd 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-mapillary.png and b/vendor/assets/iD/iD/img/cursor-select-mapillary.png differ
index a21d8688392949969801fc76e2e6faac67b68a4a..d7d388ee1268bc7a28498fabdbfc0ead81650ce8 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-mapillary2x.png and b/vendor/assets/iD/iD/img/cursor-select-mapillary2x.png differ
index bb8873655eb7b37a648199bb5071c8a0d29117d4..d6fee319d866209c85073948472aa347f47e30fa 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-point.png and b/vendor/assets/iD/iD/img/cursor-select-point.png differ
index 99bf39fa4451e561ddf98a916169d9abe8d8d778..020df5b9cfbe3633b5bde1884692a3f98318955e 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-point2x.png and b/vendor/assets/iD/iD/img/cursor-select-point2x.png differ
index f5f012606ee45897fc99ec0da1c1090156cf67c9..f3f03dd1adb990274520db3cef8c50545d33f927 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-remove.png and b/vendor/assets/iD/iD/img/cursor-select-remove.png differ
index 1d2b82ed2a1294629e866ffdd0b1e03dc253183c..2a6120ddb8ea3e3189025cf30ac6ba35072f4783 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-split.png and b/vendor/assets/iD/iD/img/cursor-select-split.png differ
index 44f949bf77666f4b4c8fd9cc07fced2075d90d61..37a3d07e558652c1c0743f7cecfec2ab69dd72ce 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-split2x.png and b/vendor/assets/iD/iD/img/cursor-select-split2x.png differ
index 781d8b4d797087d507f6a93c3f843082f600e340..bf6efeedbcd95486f38762fea2f4acefa98fd9eb 100644 (file)
Binary files a/vendor/assets/iD/iD/img/cursor-select-vertex.png and b/vendor/assets/iD/iD/img/cursor-select-vertex.png differ
index d7b971740f70cbd282e4b2e3822c0e1f62192076..ae7260d9b7bc73c149831dd39b1cba1cddbd1519 100644 (file)
     <symbol id="poi-vertex" viewBox="400 350 15 15">
       <path d="M407.5,354.5 C409.157,354.5 410.5,355.843 410.5,357.5 C410.5,359.157 409.157,360.5 407.5,360.5 C405.843,360.5 404.5,359.157 404.5,357.5 C404.5,355.843 405.843,354.5 407.5,354.5 z" fill="currentColor" id="poi-vertex-shape"/>
     </symbol>
+    <symbol id="poi-bulb" viewBox="685 335 15 15">
+      <path d="M693.5,346.5 C693.25,346.5 691.66,346.5 691.5,346.5 C691,346.5 691,344.5 690,343.5 C688.924,342.424 688,341.016 688,339.5 C688,336.5 690.5,335.5 692.5,335.5 C694.5,335.5 697,336.5 697,339.5 C697,341.024 696.077,342.423 695,343.5 C694,344.5 694,346.5 693.5,346.5 z M693.5,348 L691.5,348 C691.224,348 691,348.224 691,348.5 C691,348.776 691.224,349 691.5,349 L693.5,349 C693.776,349 694,348.776 694,348.5 C694,348.224 693.776,348 693.5,348 z M692.5,349.5 C692.914,349.5 693.25,349.276 693.25,349 C693.25,348.724 692.914,348.5 692.5,348.5 C692.086,348.5 691.75,348.724 691.75,349 C691.75,349.276 692.086,349.5 692.5,349.5 z M693.5,346.75 L691.5,346.75 C691.224,346.75 691,346.974 691,347.25 C691,347.526 691.224,347.75 691.5,347.75 L693.5,347.75 C693.776,347.75 694,347.526 694,347.25 C694,346.974 693.776,346.75 693.5,346.75 z" fill="currentColor" id="poi-bulb-shape"/>
+    </symbol>
     <symbol id="poi-crane" viewBox="670 335 15 15">
       <path d="M684.5,336 L684.5,338 L683.5,338 L683.5,342 C683.5,342.276 683.276,342.5 683,342.5 C682.724,342.5 682.5,342.276 682.5,342 L682.5,338 L677.844,338 L678.685,347.25 L680,347.25 L680,348.75 L672,348.75 L672,347.25 L673.315,347.25 L674.156,338 L672.5,338 L672.5,336 L684.5,336 z M676.997,345.25 L675.003,345.25 L674.821,347.25 L677.179,347.25 L676.997,345.25 z M676.679,341.75 L675.321,341.75 L675.139,343.75 L676.86,343.75 L676.679,341.75 z M676.338,338 L675.662,338 L675.458,340.25 L676.542,340.25 L676.338,338 z" fill="currentColor" id="poi-crane-shape"/>
     </symbol>
     <symbol id="poi-tool" viewBox="505 335 15 15">
       <path d="M510.547,336.671 C510.801,336.986 510.989,337.328 511.109,337.697 C511.23,338.066 511.267,338.811 511.267,338.811 C511.267,338.811 511.173,339.548 511.027,339.9 C510.877,340.251 510.662,340.57 510.377,340.854 C510.191,341.041 509.5,341.5 509,341.5 C509,341.5 509,347 509,348.5 C509,350 507,350 507,348.5 C507,347.5 507,341.5 507,341.5 C506.5,341.5 506.11,340.999 505.932,340.828 C505.629,340.525 505.399,340.178 505.241,339.787 C505.083,339.395 505.002,339.002 505,338.604 C504.998,338.207 505.071,337.817 505.221,337.432 C505.369,337.049 505.593,336.707 505.893,336.406 C506.181,336.119 506.513,335.897 506.893,335.74 C507.274,335.585 507.667,335.504 508.073,335.5 L506.796,338.282 L507.695,339.577 L509.25,339.444 z M520,335.5 L518.5,335.5 C518.5,336 518,336.5 517.5,336.5 C517,336.5 516.077,336.5 515,336.5 C513.5,336.5 512,338.553 512,340 C513,339.053 513.385,339 515,339 L515,348.5 C515,350 517,350 517,348.5 C517,347 517,339 517,339 L517.5,339 C518,339 518.5,339.5 518.5,340 L520,340 C520,340 520,335.5 520,335.5 z" fill="currentColor" id="poi-tool-shape"/>
     </symbol>
-    <symbol id="poi-street-lamp" viewBox="490 335 15 15">
-      <path d="M501.25,339 L501.25,341 L500.75,341 L500.75,339 L501.25,339 z M503.224,338.888 L502.776,339.112 L503.776,341.112 L504.224,340.888 L503.224,338.888 z M498.776,338.888 L497.776,340.888 L498.224,341.112 L499.224,339.112 L498.776,338.888 z M501,335 C500.763,335 500.367,335.014 499.862,335.056 C499.021,335.126 498.179,335.253 497.382,335.452 C496.707,335.621 496.093,335.836 495.553,336.106 C493.179,337.293 492,339.65 492,343 L492,349 C492,349.552 492.448,350 493,350 C493.552,350 494,349.552 494,349 L494,343 C494,340.35 494.821,338.707 496.447,337.894 C496.845,337.696 497.324,337.528 497.867,337.392 C499.04,337.157 498.568,337.222 499.273,337.139 C498.831,337.465 499.039,337.295 498.646,337.646 C498.331,337.961 498.555,338.5 499,338.5 L503,338.5 C503.445,338.5 503.669,337.961 503.354,337.646 C503.207,337.5 502.965,337.292 502.652,337.084 C501.786,336.633 502.134,336.713 501.682,336.628 C502.015,336.296 501.899,336.5 502,336 C502,335.448 501.552,335 501,335 z" fill="currentColor" id="poi-street-lamp-shape"/>
+    <symbol id="poi-shower" viewBox="490 335 15 15">
+      <path d="M501.25,339 L501.25,341 L500.75,341 L500.75,339 L501.25,339 z M503.224,338.888 L502.776,339.112 L503.776,341.112 L504.224,340.888 L503.224,338.888 z M498.776,338.888 L497.776,340.888 L498.224,341.112 L499.224,339.112 L498.776,338.888 z M501,335 C500.763,335 500.367,335.014 499.862,335.056 C499.021,335.126 498.179,335.253 497.382,335.452 C496.707,335.621 496.093,335.836 495.553,336.106 C493.179,337.293 492,339.65 492,343 L492,349 C492,349.552 492.448,350 493,350 C493.552,350 494,349.552 494,349 L494,343 C494,340.35 494.821,338.707 496.447,337.894 C496.845,337.696 497.324,337.528 497.867,337.392 C499.04,337.157 498.568,337.222 499.273,337.139 C498.831,337.465 499.039,337.295 498.646,337.646 C498.331,337.961 498.555,338.5 499,338.5 L503,338.5 C503.445,338.5 503.669,337.961 503.354,337.646 C503.207,337.5 502.965,337.292 502.652,337.084 C501.786,336.633 502.134,336.713 501.682,336.628 C502.015,336.296 501.899,336.5 502,336 C502,335.448 501.552,335 501,335 z" fill="currentColor" id="poi-shower-shape"/>
     </symbol>
     <symbol id="poi-silo" viewBox="475 335 15 15">
       <path d="M480,338.5 C480,339 485,339 485,338.5 C485,338 485,348.625 485,349.125 C485,350.125 480,350.125 480,349.125 C480,348.625 480,338 480,338.5 z M480,337.625 C480,338.125 485,338.125 485,337.625 C485,334.125 480,334.125 480,337.625 z" fill="currentColor" id="poi-silo-shape"/>
     <symbol id="poi-vending-machine" viewBox="400 335 15 15">
       <path d="M412,335 C412.552,335 413,335.448 413,336 L413,349 C413,349.552 412.552,350 412,350 L403,350 C402.448,350 402,349.552 402,349 L402,336 C402,335.448 402.448,335 403,335 L412,335 z M409,346 L406,346 L406,347.5 L409,347.5 L409,346 z M409,341 L408,341 L408,342 L409,342 L409,341 z M405,341 L404,341 L404,342 L405,342 L405,341 z M407,341 L406,341 L406,342 L407,342 L407,341 z M411,341 L410,341 L410,342 L411,342 L411,341 z M411,339 L410,339 L410,340 L411,340 L411,339 z M407,339 L406,339 L406,340 L407,340 L407,339 z M405,339 L404,339 L404,340 L405,340 L405,339 z M409,339 L408,339 L408,340 L409,340 L409,339 z M409,337 L408,337 L408,338 L409,338 L409,337 z M405,337 L404,337 L404,338 L405,338 L405,337 z M407,337 L406,337 L406,338 L407,338 L407,337 z M411,337 L410,337 L410,338 L411,338 L411,337 z" fill="currentColor" id="poi-vending-machine-shape"/>
     </symbol>
+    <symbol id="poi-trolleybus" viewBox="745 320 15 15">
+      <path d="M749.538,322 C748.385,322 747,322.595 747,324.197 L747,328.559 L747,331.6 C747,331.6 747,332.4 747.846,332.4 L747.846,333.2 C747.846,333.2 747.846,334 748.692,334 C749.538,334 749.538,333.2 749.538,333.2 L749.538,332.4 L755.462,332.4 L755.462,333.2 C755.462,333.2 755.462,334 756.308,334 C757.154,334 757.154,333.2 757.154,333.2 L757.154,332.4 C757.154,332.4 758,332.4 758,331.6 L758,324.197 C758,322.56 756.954,322 755.8,322 L749.538,322 z M749.75,323.2 L755.25,323.2 C755.367,323.2 755.462,323.289 755.462,323.4 C755.462,323.511 755.367,323.6 755.25,323.6 L749.75,323.6 C749.633,323.6 749.538,323.511 749.538,323.4 C749.538,323.289 749.633,323.2 749.75,323.2 z M748.692,324.4 L756.308,324.4 C757.154,324.4 757.154,325.173 757.154,325.173 L757.154,327.6 C757.154,327.6 757.154,328.4 756.308,328.4 L748.692,328.4 C747.846,328.4 747.846,327.6 747.846,327.6 L747.846,325.2 C747.846,325.2 747.846,324.4 748.692,324.4 z M748.692,330 C749.16,330 749.538,330.358 749.538,330.8 C749.538,331.242 749.16,331.6 748.692,331.6 C748.225,331.6 747.846,331.242 747.846,330.8 C747.846,330.358 748.225,330 748.692,330 z M756.308,330 C756.775,330 757.154,330.358 757.154,330.8 C757.154,331.242 756.775,331.6 756.308,331.6 C755.84,331.6 755.462,331.242 755.462,330.8 C755.462,330.358 755.84,330 756.308,330 z M755,320 L755,320.5 L753,320.5 L753,321.5 L752,321.5 L752,320.5 L750,320.5 L750,320 z" fill="currentColor" id="poi-trolleybus-shape"/>
+    </symbol>
+    <symbol id="poi-light-rail" viewBox="730 320 15 15">
+      <path d="M734.091,332.449 L735.606,332.449 L735.227,333.132 L739.773,333.132 L739.394,332.449 L740.909,332.449 L742.045,334.5 L740.53,334.5 L740.151,333.816 L734.849,333.816 L734.47,334.5 L732.955,334.5 L734.091,332.449 z M739.722,329.357 L738.611,330.234 L738.611,330.673 L740.833,330.673 L741.389,330.234 L741.389,329.357 L739.722,329.357 z M733.611,329.357 L733.611,330.234 L734.167,330.673 L736.389,330.673 L736.389,330.234 L735.278,329.357 L733.611,329.357 z M734.167,324.97 L733.611,325.409 L733.611,327.164 L735.278,327.164 L739.722,327.164 L741.389,327.164 L741.389,325.409 L740.833,324.97 L739.722,324.97 L735.278,324.97 L734.167,324.97 z M735.278,322.777 L735.278,323.654 L739.722,323.654 L739.722,322.777 L735.278,322.777 z M735.278,322.338 L739.722,322.338 L742.5,324.97 L742.5,331.112 L741.389,331.989 L733.611,331.989 L732.5,331.112 L732.5,324.97 L735.278,322.338 z M739.773,320.5 L739.773,320.96 L737.955,320.96 L737.955,321.879 L737.045,321.879 L737.045,320.96 L735.227,320.96 L735.227,320.5 z" fill="currentColor" id="poi-light-rail-shape"/>
+    </symbol>
+    <symbol id="poi-subway" viewBox="715 320 15 15">
+      <path d="M719.389,332.212 L720.724,332.212 L720.391,332.808 L724.395,332.808 L724.061,332.212 L725.396,332.212 L726.397,334 L725.062,334 L724.729,333.404 L720.057,333.404 L719.723,334 L718.388,334 L719.389,332.212 z M724.795,329.514 L723.995,330.28 L723.995,330.663 L725.596,330.663 L725.997,330.28 L725.997,329.514 L724.795,329.514 z M718.789,329.514 L718.789,330.28 L719.189,330.663 L720.791,330.663 L720.791,330.28 L719.99,329.514 L718.789,329.514 z M719.189,325.3 L718.789,325.683 L718.789,327.216 L719.99,327.982 L724.795,327.982 L725.997,327.216 L725.997,325.683 L725.596,325.3 L724.795,325.3 L719.99,325.3 L719.189,325.3 z M720.791,323.768 L720.791,324.534 L723.995,324.534 L723.995,323.768 L720.791,323.768 z M720.391,323.002 L724.395,323.002 L726.798,325.3 L726.798,331.046 L725.997,331.812 L718.789,331.812 L717.988,331.046 L717.988,325.3 L720.391,323.002 z M721.992,321 L722.793,321 L725.196,321 C727.171,321.329 728.8,322.201 728.8,324.604 L728.8,332.613 L727.599,332.212 L727.599,324.604 C727.599,323.002 726.397,322.201 725.196,322.201 L722.793,322.201 L721.992,322.201 L719.59,322.201 C718.388,322.201 717.187,323.002 717.187,324.604 L717.187,332.212 L715.986,332.613 L715.986,324.604 C715.986,322.201 717.587,321 719.59,321 z" fill="currentColor" id="poi-subway-shape"/>
+    </symbol>
+    <symbol id="poi-tram" viewBox="700 320 15 15">
+      <path d="M709.561,333.065 L710.288,335 L711.5,335 L710.773,333.065 z M704.212,333.065 L703.5,335 L704.712,335 L705.424,333.065 z M709.345,329.677 L708.483,330.645 L708.483,331.129 L710.207,331.129 L710.638,330.645 L710.638,329.677 L709.345,329.677 z M704.604,329.677 L704.604,330.645 L705.035,331.129 L706.759,331.129 L706.759,330.645 L705.897,329.677 L704.604,329.677 z M705.035,324.839 L704.604,325.323 L704.604,327.258 L705.897,327.258 L709.345,327.258 L710.638,327.258 L710.638,325.323 L710.207,324.839 L709.345,324.839 L705.897,324.839 L705.035,324.839 z M705.897,322.419 L705.897,323.387 L709.345,323.387 L709.345,322.419 L705.897,322.419 z M705.897,321.935 L709.345,321.935 L711.5,324.839 L711.5,331.613 L710.638,332.581 L704.604,332.581 L703.742,331.613 L703.742,324.839 L705.897,321.935 z M710.045,320 L710.045,320.484 L708.106,320.484 L708.106,321.452 L707.136,321.452 L707.136,320.484 L705.197,320.484 L705.197,320 z" fill="currentColor" id="poi-tram-shape"/>
+    </symbol>
+    <symbol id="poi-monorail" viewBox="685 320 15 15">
+      <path d="M689,332.014 L688,330.965 L688,324.147 L690.5,321 L694.5,321 L697,324.147 L697,330.965 L696,332.014 L694.5,332.014 L694.5,333.587 L693.5,333.587 L693.5,332.539 L693,332.014 L692,332.014 L691.5,332.539 L691.5,333.587 L690.5,333.587 L690.5,332.014 L689,332.014 z M696,328.343 L694,328.343 L693.5,329.392 L693.5,329.916 L695.5,329.916 L696,329.392 L696,328.343 z M691,328.343 L689,328.343 L689,329.392 L689.5,329.916 L691.5,329.916 L691.5,329.392 L691,328.343 z M695.5,324.147 L689.5,324.147 L689,324.671 L689,326.769 L696,326.769 L696,324.671 L695.5,324.147 z M694.5,321.524 L690.5,321.524 L690.5,322.573 L694.5,322.573 L694.5,321.524 z M693,332.539 L692,332.539 L692,334.112 L691,334.112 L691,334.636 L694,334.636 L694,334.112 L693,334.112 L693,332.539 z" fill="currentColor" id="poi-monorail-shape"/>
+    </symbol>
     <symbol id="poi-railway-signals" viewBox="670 320 15 15">
       <path d="M679.214,321.5 C680.476,321.5 681.5,322.533 681.5,323.808 L681.5,331.192 C681.5,332.466 680.477,333.5 679.214,333.5 L675.786,333.499 C674.523,333.5 673.5,332.466 673.5,331.192 L673.5,323.808 C673.5,322.533 674.523,321.5 675.786,321.5 L679.214,321.5 z M677.5,328.5 C676.672,328.5 676,329.172 676,330 C676,330.828 676.672,331.5 677.5,331.5 C678.328,331.5 679,330.828 679,330 C679,329.172 678.328,328.5 677.5,328.5 z M677.5,323.5 C676.672,323.5 676,324.172 676,325 C676,325.829 676.672,326.5 677.5,326.5 C678.328,326.5 679,325.829 679,325 C679,324.172 678.328,323.5 677.5,323.5 z" fill="currentColor" id="poi-railway-signals-shape"/>
     </symbol>
       <path d="M330,274 C321.163,274 314,281.163 314,290 C314,298.837 321.163,306 330,306 C338.836,306 346,298.837 346,290 C346,281.163 338.836,274 330,274 z M330,278 L339,288 L333,288 L333,300.531 C332.047,300.832 331.051,301 330,301 C328.96,301 327.953,300.863 327,300.594 L327,288 L321,288 L330,278 z" fill="#58A9ED" id="path5016"/>
     </symbol>
     <symbol id="restriction-no-right-turn" viewBox="240 260 60 60">
-      <g id="g4552">
-        <path d="M279,277 L279,283 L269,283 L267.344,283.812 L272.531,289 L279,289 L279,295 L289,286 z M263.25,286.75 L263,287 L261,290 L261,296.312 C262.434,298.355 264.536,299.899 267,300.594 L267,291 L267.25,290.75 z" fill="#989898" id="path4620"/>
-        <path d="M270,275 C261.71,275 255,281.71 255,290 C255,298.29 261.71,305 270,305 C277.973,305 284.482,298.787 284.969,290.938 L281.156,294.375 C280.803,295.268 280.355,296.101 279.812,296.875 L279.469,297.344 L263.062,280.938 L262.625,280.5 L263.125,280.156 C265.072,278.791 267.439,278 270,278 C273.08,278 275.874,279.183 278,281.094 L278,277.344 C275.68,275.874 272.952,275 270,275 z M260.531,282.625 L260.937,283.031 L276.937,299.031 L277.375,299.469 L276.875,299.812 C274.928,301.178 272.561,302 270,302 C263.378,302 258,296.621 258,290 C258,287.439 258.822,285.041 260.187,283.094 z" fill="#E06D5F" id="path4564"/>
-      </g>
+      <path d="M279,277 L279,283 L269,283 L267.344,283.812 L272.531,289 L279,289 L279,295 L289,286 z M263.25,286.75 L263,287 L261,290 L261,296.312 C262.434,298.355 264.536,299.899 267,300.594 L267,291 L267.25,290.75 z" fill="#989898" id="path4620"/>
+      <path d="M270,275 C261.71,275 255,281.71 255,290 C255,298.29 261.71,305 270,305 C277.973,305 284.482,298.787 284.969,290.938 L281.156,294.375 C280.803,295.268 280.355,296.101 279.812,296.875 L279.469,297.344 L263.062,280.938 L262.625,280.5 L263.125,280.156 C265.072,278.791 267.439,278 270,278 C273.08,278 275.874,279.183 278,281.094 L278,277.344 C275.68,275.874 272.952,275 270,275 z M260.531,282.625 L260.937,283.031 L276.937,299.031 L277.375,299.469 L276.875,299.812 C274.928,301.178 272.561,302 270,302 C263.378,302 258,296.621 258,290 C258,287.439 258.822,285.041 260.187,283.094 z" fill="#E06D5F" id="path4564"/>
     </symbol>
     <symbol id="restriction-no-left-turn" viewBox="180 260 60 60">
-      <g id="g4600">
-        <path d="M200,277 L190,286 L200,295 L200,289 L205.5,289 L200,283.5 L200,277 z M206.531,283 L218,294.469 L218,291 L216,287 L214,285 L210,283 L206.531,283 z M212,295.5 L212,300.812 C213.354,300.53 214.611,299.958 215.75,299.25 L212,295.5 z" fill="#989898" id="path4604"/>
-        <path d="M210,275 C206.612,275 203.51,276.14 201,278.031 L201,283.094 L217.375,299.469 L216.875,299.812 C214.928,301.178 212.561,302 210,302 C205.527,302 201.626,299.541 199.562,295.906 L195.125,291.938 C196.076,299.309 202.368,305 210,305 C218.29,305 225,298.29 225,290 C225,281.71 218.29,275 210,275 z M210,278 C216.621,278 222,283.379 222,290 C222,292.561 221.178,294.928 219.812,296.875 L219.469,297.344 L202.625,280.5 L203.125,280.156 C205.072,278.791 207.439,278 210,278 z" fill="#E06D5F" id="path4612"/>
-      </g>
+      <path d="M200,277 L190,286 L200,295 L200,289 L205.5,289 L200,283.5 L200,277 z M206.531,283 L218,294.469 L218,291 L216,287 L214,285 L210,283 L206.531,283 z M212,295.5 L212,300.812 C213.354,300.53 214.611,299.958 215.75,299.25 L212,295.5 z" fill="#989898" id="path4604"/>
+      <path d="M210,275 C206.612,275 203.51,276.14 201,278.031 L201,283.094 L217.375,299.469 L216.875,299.812 C214.928,301.178 212.561,302 210,302 C205.527,302 201.626,299.541 199.562,295.906 L195.125,291.938 C196.076,299.309 202.368,305 210,305 C218.29,305 225,298.29 225,290 C225,281.71 218.29,275 210,275 z M210,278 C216.621,278 222,283.379 222,290 C222,292.561 221.178,294.928 219.812,296.875 L219.469,297.344 L202.625,280.5 L203.125,280.156 C205.072,278.791 207.439,278 210,278 z" fill="#E06D5F" id="path4612"/>
     </symbol>
     <symbol id="restriction-no-u-turn" viewBox="120 260 60 60">
       <path d="M149,282 L146.687,283.156 L151.531,288 L155,288 L157,290 L157,296 L151,296 L160,306 L169,296 L163,296 L163,290 L161.719,287.406 L161,286 L159,284 L155,282 z M142.844,286.344 L141,290 L141,296.312 C142.343,298.225 144.267,299.72 146.531,300.469 L147,300 L147,290.5 z" fill="#989898" id="path4860"/>
       <path d="M150,275 C141.71,275 135,281.71 135,290 C135,298.29 141.71,305 150,305 C152.307,305 154.486,304.46 156.437,303.531 L154.312,301.156 C152.974,301.679 151.522,302 150,302 C143.378,302 138,296.621 138,290 C138,287.439 138.822,285.041 140.187,283.094 L140.531,282.625 L140.937,283.031 L152.906,295 L156,295 L156,293.875 L143.062,280.938 L142.625,280.5 L143.125,280.156 C145.072,278.791 147.439,278 150,278 C154.385,278 158.219,280.359 160.312,283.875 L161.812,285.406 L164,289.75 L164,295 L164.125,295 C164.677,293.436 165,291.754 165,290 C165,281.71 158.29,275 150,275 z" fill="#E06D5F" id="path4852"/>
     </symbol>
     <symbol id="restriction-no-straight-on" viewBox="60 260 60 60">
-      <g id="g4998">
-        <path d="M90,275 L81,285 L88.531,285 L93,289.469 L93,285 L99,285 L90,275 z M87,290.5 L87,300.594 C87.953,300.863 88.96,301 90,301 C91.051,301 92.047,300.832 93,300.531 L93,296.5 L87,290.5 z" fill="#989898" id="path4995"/>
-        <path d="M88.469,275.062 C80.901,275.83 75,282.228 75,290 C75,298.29 81.71,305 90,305 C98.29,305 105,298.29 105,290 C105,282.186 99.034,275.773 91.406,275.062 L95.094,279.156 C99.163,281.078 102,285.206 102,290 C102,292.561 101.178,294.928 99.812,296.875 L99.469,297.344 L99.062,296.938 L88.125,286 L87,286 L83.906,286 L96.938,299.031 L97.375,299.469 L96.875,299.812 C94.928,301.178 92.561,302 90,302 C83.379,302 78,296.621 78,290 C78,287.439 78.822,285.041 80.188,283.094 L80.531,282.625 L80.938,283.031 L81.188,283.281 L83.188,281.062 L83.062,280.938 L82.625,280.5 L83.125,280.156 C83.688,279.762 84.279,279.418 84.906,279.125 L88.594,275.062 C88.553,275.066 88.51,275.058 88.469,275.062 z" fill="#E06D5F" id="path4989"/>
+      <path d="M90,275 L81,285 L88.531,285 L93,289.469 L93,285 L99,285 L90,275 z M87,290.5 L87,300.594 C87.953,300.863 88.96,301 90,301 C91.051,301 92.047,300.832 93,300.531 L93,296.5 L87,290.5 z" fill="#989898" id="path4995"/>
+      <path d="M88.469,275.062 C80.901,275.83 75,282.228 75,290 C75,298.29 81.71,305 90,305 C98.29,305 105,298.29 105,290 C105,282.186 99.034,275.773 91.406,275.062 L95.094,279.156 C99.163,281.078 102,285.206 102,290 C102,292.561 101.178,294.928 99.812,296.875 L99.469,297.344 L99.062,296.938 L88.125,286 L87,286 L83.906,286 L96.938,299.031 L97.375,299.469 L96.875,299.812 C94.928,301.178 92.561,302 90,302 C83.379,302 78,296.621 78,290 C78,287.439 78.822,285.041 80.188,283.094 L80.531,282.625 L80.938,283.031 L81.188,283.281 L83.188,281.062 L83.062,280.938 L82.625,280.5 L83.125,280.156 C83.688,279.762 84.279,279.418 84.906,279.125 L88.594,275.062 C88.553,275.066 88.51,275.058 88.469,275.062 z" fill="#E06D5F" id="path4989"/>
+    </symbol>
+    <symbol id="route-subway" viewBox="780 260 60 60">
+      <g>
+        <path d="M816.969,305.469 L814.031,309.531 L803.031,301.531 L805.969,297.469 z" fill="#46682F"/>
+        <path d="M814.125,305.406 L816.875,309.594 L828.875,301.594 L826.125,297.406 z" fill="#70372F"/>
+        <path d="M791.125,305.419 L793.875,309.575 L805.875,301.575 L803.125,297.419 z" fill="#2C5476"/>
+        <path d="M816.375,306.281 L814.625,308.719 L803.625,300.719 L805.375,298.281 z" fill="#8CD05F"/>
+        <path d="M814.656,306.25 L816.344,308.75 L828.344,300.75 L826.656,298.25 z" fill="#E06D5F"/>
+        <path d="M791.656,306.263 L793.344,308.763 L805.344,300.763 L803.656,298.263 z" fill="#58A9ED"/>
+        <path d="M830,299.5 C830,300.881 828.881,302 827.5,302 C826.119,302 825,300.881 825,299.5 C825,298.119 826.119,297 827.5,297 C828.881,297 830,298.119 830,299.5 z" fill="#70372F"/>
+        <path d="M795,307.5 C795,308.881 793.881,310 792.5,310 C791.119,310 790,308.881 790,307.5 C790,306.119 791.119,305 792.5,305 C793.881,305 795,306.119 795,307.5 z" fill="#2C5476"/>
+        <path d="M807,299.5 C807,300.881 805.881,302 804.5,302 C803.119,302 802,300.881 802,299.5 C802,298.119 803.119,297 804.5,297 C805.881,297 807,298.119 807,299.5 z" fill="#395E53"/>
+        <path d="M818,307.5 C818,308.881 816.881,310 815.5,310 C814.119,310 813,308.881 813,307.5 C813,306.119 814.119,305 815.5,305 C816.881,305 818,306.119 818,307.5 z" fill="#5B502F"/>
+        <path d="M829,299.5 C829,300.328 828.328,301 827.5,301 C826.672,301 826,300.328 826,299.5 C826,298.671 826.672,298 827.5,298 C828.328,298 829,298.671 829,299.5 z" fill="#FFFFFF"/>
+        <path d="M817,307.5 C817,308.328 816.328,309 815.5,309 C814.672,309 814,308.328 814,307.5 C814,306.671 814.672,306 815.5,306 C816.328,306 817,306.671 817,307.5 z" fill="#FFFFFF"/>
+        <path d="M806,299.5 C806,300.328 805.328,301 804.5,301 C803.672,301 803,300.328 803,299.5 C803,298.671 803.672,298 804.5,298 C805.328,298 806,298.671 806,299.5 z" fill="#FFFFFF"/>
+        <path d="M794,307.5 C794,308.328 793.328,309 792.5,309 C791.672,309 791,308.328 791,307.5 C791,306.671 791.672,306 792.5,306 C793.328,306 794,306.671 794,307.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M802.5,291 L805.833,291 L805,292.488 L815,292.488 L814.167,291 L817.5,291 L820,295.464 L816.667,295.464 L815.833,293.976 L804.167,293.976 L803.333,295.464 L800,295.464 L802.5,291 z" fill="#989898"/>
+        <path d="M805,268 L799,273.739 L799,288.087 L801,290 L819,290 L821,288.087 L821,273.739 L815,268 L805,268 z M806,269.913 L814,269.913 L814,271.826 L806,271.826 L806,269.913 z M802,273.739 L804,273.739 L816,273.739 L818,273.739 L819,274.696 L819,278.522 L816,280.435 L804,280.435 L801,278.522 L801,274.696 L802,273.739 z M801,284.261 L804,284.261 L806,286.174 L806,287.13 L802,287.13 L801,286.174 L801,284.261 z M816,284.261 L819,284.261 L819,286.174 L818,287.13 L814,287.13 L814,286.174 L816,284.261 z" fill="#989898"/>
+        <path d="M803,263 C798,263 794,266 794,272 L794,292 L797,291 L797,272 C797,268 800,266 803,266 L809,266 L811,266 L817,266 C820,266 823,268 823,272 L823,291 L826,292 L826,272 C826,266 821.932,263.822 817,263 L811,263 L809,263 z" fill="#B5B5B5"/>
+      </g>
+    </symbol>
+    <symbol id="route-line" viewBox="720 260 60 60">
+      <g>
+        <path d="M756.969,305.469 L754.031,309.531 L743.031,301.531 L745.969,297.469 z" fill="#46682F"/>
+        <path d="M754.125,305.406 L756.875,309.594 L768.875,301.594 L766.125,297.406 z" fill="#70372F"/>
+        <path d="M731.125,305.419 L733.875,309.575 L745.875,301.575 L743.125,297.419 z" fill="#2C5476"/>
+        <path d="M756.375,306.281 L754.625,308.719 L743.625,300.719 L745.375,298.281 z" fill="#8CD05F"/>
+        <path d="M754.656,306.25 L756.344,308.75 L768.344,300.75 L766.656,298.25 z" fill="#E06D5F"/>
+        <path d="M731.656,306.263 L733.344,308.763 L745.344,300.763 L743.656,298.263 z" fill="#58A9ED"/>
+        <path d="M770,299.5 C770,300.881 768.881,302 767.5,302 C766.119,302 765,300.881 765,299.5 C765,298.119 766.119,297 767.5,297 C768.881,297 770,298.119 770,299.5 z" fill="#70372F"/>
+        <path d="M735,307.5 C735,308.881 733.881,310 732.5,310 C731.119,310 730,308.881 730,307.5 C730,306.119 731.119,305 732.5,305 C733.881,305 735,306.119 735,307.5 z" fill="#2C5476"/>
+        <path d="M747,299.5 C747,300.881 745.881,302 744.5,302 C743.119,302 742,300.881 742,299.5 C742,298.119 743.119,297 744.5,297 C745.881,297 747,298.119 747,299.5 z" fill="#395E53"/>
+        <path d="M758,307.5 C758,308.881 756.881,310 755.5,310 C754.119,310 753,308.881 753,307.5 C753,306.119 754.119,305 755.5,305 C756.881,305 758,306.119 758,307.5 z" fill="#5B502F"/>
+        <path d="M769,299.5 C769,300.328 768.328,301 767.5,301 C766.672,301 766,300.328 766,299.5 C766,298.672 766.672,298 767.5,298 C768.328,298 769,298.672 769,299.5 z" fill="#FFFFFF"/>
+        <path d="M757,307.5 C757,308.328 756.328,309 755.5,309 C754.672,309 754,308.328 754,307.5 C754,306.672 754.672,306 755.5,306 C756.328,306 757,306.672 757,307.5 z" fill="#FFFFFF"/>
+        <path d="M746,299.5 C746,300.328 745.328,301 744.5,301 C743.672,301 743,300.328 743,299.5 C743,298.672 743.672,298 744.5,298 C745.328,298 746,298.672 746,299.5 z" fill="#FFFFFF"/>
+        <path d="M734,307.5 C734,308.328 733.328,309 732.5,309 C731.672,309 731,308.328 731,307.5 C731,306.672 731.672,306 732.5,306 C733.328,306 734,306.672 734,307.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M742,291 L745,280 L748,269 L752,269 L755,280 L758,291 z" fill="#989898" id="route-line-stroke"/>
+    </symbol>
+    <symbol id="route-piste" viewBox="660 260 60 60">
+      <g>
+        <path d="M696.969,305.469 L694.031,309.531 L683.031,301.531 L685.969,297.469 z" fill="#46682F"/>
+        <path d="M694.125,305.406 L696.875,309.594 L708.875,301.594 L706.125,297.406 z" fill="#70372F"/>
+        <path d="M671.125,305.419 L673.875,309.575 L685.875,301.575 L683.125,297.419 z" fill="#2C5476"/>
+        <path d="M696.375,306.281 L694.625,308.719 L683.625,300.719 L685.375,298.281 z" fill="#8CD05F"/>
+        <path d="M694.656,306.25 L696.344,308.75 L708.344,300.75 L706.656,298.25 z" fill="#E06D5F"/>
+        <path d="M671.656,306.263 L673.344,308.763 L685.344,300.763 L683.656,298.263 z" fill="#58A9ED"/>
+        <path d="M710,299.5 C710,300.881 708.881,302 707.5,302 C706.119,302 705,300.881 705,299.5 C705,298.119 706.119,297 707.5,297 C708.881,297 710,298.119 710,299.5 z" fill="#70372F"/>
+        <path d="M675,307.5 C675,308.881 673.881,310 672.5,310 C671.119,310 670,308.881 670,307.5 C670,306.119 671.119,305 672.5,305 C673.881,305 675,306.119 675,307.5 z" fill="#2C5476"/>
+        <path d="M687,299.5 C687,300.881 685.881,302 684.5,302 C683.119,302 682,300.881 682,299.5 C682,298.119 683.119,297 684.5,297 C685.881,297 687,298.119 687,299.5 z" fill="#395E53"/>
+        <path d="M698,307.5 C698,308.881 696.881,310 695.5,310 C694.119,310 693,308.881 693,307.5 C693,306.119 694.119,305 695.5,305 C696.881,305 698,306.119 698,307.5 z" fill="#5B502F"/>
+        <path d="M709,299.5 C709,300.328 708.328,301 707.5,301 C706.672,301 706,300.328 706,299.5 C706,298.671 706.672,298 707.5,298 C708.328,298 709,298.671 709,299.5 z" fill="#FFFFFF"/>
+        <path d="M697,307.5 C697,308.328 696.328,309 695.5,309 C694.672,309 694,308.328 694,307.5 C694,306.671 694.672,306 695.5,306 C696.328,306 697,306.671 697,307.5 z" fill="#FFFFFF"/>
+        <path d="M686,299.5 C686,300.328 685.328,301 684.5,301 C683.672,301 683,300.328 683,299.5 C683,298.671 683.672,298 684.5,298 C685.328,298 686,298.671 686,299.5 z" fill="#FFFFFF"/>
+        <path d="M674,307.5 C674,308.328 673.328,309 672.5,309 C671.672,309 671,308.328 671,307.5 C671,306.671 671.672,306 672.5,306 C673.328,306 674,306.671 674,307.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M701.884,278.834 C701.884,280.169 700.802,281.251 699.467,281.251 C698.132,281.251 697.05,280.169 697.05,278.834 C697.05,277.499 698.132,276.417 699.467,276.417 C700.802,276.417 701.884,277.499 701.884,278.834 z M699.821,290.742 C699.721,290.549 699.486,290.47 699.29,290.564 C698.187,291.24 696.839,291.388 695.616,290.967 L685.416,285.859 L689.799,283.668 L689.799,278.834 L692.216,280.042 L692.216,284.876 L694.633,286.085 L697.05,284.876 L694.633,283.668 L694.633,276.417 L689.799,274 L687.382,275.208 L687.382,282.459 L682.999,284.651 L678.697,282.508 C678.497,282.41 678.255,282.493 678.157,282.693 C678.059,282.893 678.142,283.135 678.343,283.233 L695.261,291.692 C695.77,291.91 696.32,292.014 696.873,291.998 C697.839,291.982 698.788,291.739 699.644,291.289 C699.843,291.19 699.925,290.949 699.826,290.749 C699.824,290.747 699.823,290.744 699.821,290.742 z" fill="currentColor" id="route-piste-stroke"/>
+    </symbol>
+    <symbol id="route-light-rail" viewBox="600 260 60 60">
+      <g>
+        <path d="M636.969,305.469 L634.031,309.531 L623.031,301.531 L625.969,297.469 z" fill="#46682F"/>
+        <path d="M634.125,305.406 L636.875,309.594 L648.875,301.594 L646.125,297.406 z" fill="#70372F"/>
+        <path d="M611.125,305.419 L613.875,309.575 L625.875,301.575 L623.125,297.419 z" fill="#2C5476"/>
+        <path d="M636.375,306.281 L634.625,308.719 L623.625,300.719 L625.375,298.281 z" fill="#8CD05F"/>
+        <path d="M634.656,306.25 L636.344,308.75 L648.344,300.75 L646.656,298.25 z" fill="#E06D5F"/>
+        <path d="M611.656,306.263 L613.344,308.763 L625.344,300.763 L623.656,298.263 z" fill="#58A9ED"/>
+        <path d="M650,299.5 C650,300.881 648.881,302 647.5,302 C646.119,302 645,300.881 645,299.5 C645,298.119 646.119,297 647.5,297 C648.881,297 650,298.119 650,299.5 z" fill="#70372F"/>
+        <path d="M615,307.5 C615,308.881 613.881,310 612.5,310 C611.119,310 610,308.881 610,307.5 C610,306.119 611.119,305 612.5,305 C613.881,305 615,306.119 615,307.5 z" fill="#2C5476"/>
+        <path d="M627,299.5 C627,300.881 625.881,302 624.5,302 C623.119,302 622,300.881 622,299.5 C622,298.119 623.119,297 624.5,297 C625.881,297 627,298.119 627,299.5 z" fill="#395E53"/>
+        <path d="M638,307.5 C638,308.881 636.881,310 635.5,310 C634.119,310 633,308.881 633,307.5 C633,306.119 634.119,305 635.5,305 C636.881,305 638,306.119 638,307.5 z" fill="#5B502F"/>
+        <path d="M649,299.5 C649,300.328 648.328,301 647.5,301 C646.672,301 646,300.328 646,299.5 C646,298.672 646.672,298 647.5,298 C648.328,298 649,298.672 649,299.5 z" fill="#FFFFFF"/>
+        <path d="M637,307.5 C637,308.328 636.328,309 635.5,309 C634.672,309 634,308.328 634,307.5 C634,306.672 634.672,306 635.5,306 C636.328,306 637,306.672 637,307.5 z" fill="#FFFFFF"/>
+        <path d="M626,299.5 C626,300.328 625.328,301 624.5,301 C623.672,301 623,300.328 623,299.5 C623,298.672 623.672,298 624.5,298 C625.328,298 626,298.672 626,299.5 z" fill="#FFFFFF"/>
+        <path d="M614,307.5 C614,308.328 613.328,309 612.5,309 C611.672,309 611,308.328 611,307.5 C611,306.672 611.672,306 612.5,306 C613.328,306 614,306.672 614,307.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M622.5,291 L625.833,291 L625,292.488 L635,292.488 L634.167,291 L637.5,291 L640,295.464 L636.667,295.464 L635.833,293.976 L624.167,293.976 L623.333,295.464 L620,295.464 L622.5,291 z" fill="#989898"/>
+        <path d="M625.111,269 L619,274.727 L619,288.091 L621.444,290 L638.556,290 L641,288.091 L641,274.727 L634.889,269 L625.111,269 z M625.111,269.955 L634.889,269.955 L634.889,271.864 L625.111,271.864 L625.111,269.955 z M622.667,274.727 L625.111,274.727 L634.889,274.727 L637.333,274.727 L638.556,275.682 L638.556,279.5 L634.889,279.5 L625.111,279.5 L621.444,279.5 L621.444,275.682 L622.667,274.727 z M621.444,284.273 L625.111,284.273 L627.556,286.182 L627.556,287.136 L622.667,287.136 L621.444,286.182 L621.444,284.273 z M634.889,284.273 L638.556,284.273 L638.556,286.182 L637.333,287.136 L632.444,287.136 L632.444,286.182 L634.889,284.273 z" fill="#989898"/>
+        <path d="M625,265 L625,266 L629,266 L629,268 L631,268 L631,266 L635,266 L635,265 z" fill="#989898"/>
       </g>
     </symbol>
     <symbol id="route-master" viewBox="0 260 60 60">
-      <g id="g3425">
-        <g id="g3427">
-          <path d="M36.969,305.469 L34.031,309.531 L23.031,301.531 L25.969,297.469 z" fill="#46682F" id="path3429"/>
-          <path d="M34.125,305.406 L36.875,309.594 L48.875,301.594 L46.125,297.406 z" fill="#70372F" id="path3431"/>
-          <path d="M11.125,305.419 L13.875,309.575 L25.875,301.575 L23.125,297.419 z" fill="#2C5476" id="path3433"/>
-        </g>
-        <path d="M36.375,306.281 L34.625,308.719 L23.625,300.719 L25.375,298.281 z" fill="#8CD05F" id="path3437"/>
-        <path d="M34.656,306.25 L36.344,308.75 L48.344,300.75 L46.656,298.25 z" fill="#E06D5F" id="path3441"/>
-        <path d="M11.656,306.263 L13.344,308.763 L25.344,300.763 L23.656,298.263 z" fill="#58A9ED" id="path3443"/>
-        <path d="M50,299.5 C50,300.881 48.881,302 47.5,302 C46.119,302 45,300.881 45,299.5 C45,298.119 46.119,297 47.5,297 C48.881,297 50,298.119 50,299.5 z" fill="#70372F" id="path3445"/>
-        <path d="M15,307.5 C15,308.881 13.881,310 12.5,310 C11.119,310 10,308.881 10,307.5 C10,306.119 11.119,305 12.5,305 C13.881,305 15,306.119 15,307.5 z" fill="#2C5476" id="path3447"/>
-        <path d="M27,299.5 C27,300.881 25.881,302 24.5,302 C23.119,302 22,300.881 22,299.5 C22,298.119 23.119,297 24.5,297 C25.881,297 27,298.119 27,299.5 z" fill="#395E53" id="path3449"/>
-        <path d="M38,307.5 C38,308.881 36.881,310 35.5,310 C34.119,310 33,308.881 33,307.5 C33,306.119 34.119,305 35.5,305 C36.881,305 38,306.119 38,307.5 z" fill="#5B502F" id="path3451"/>
-        <path d="M49,299.5 C49,300.328 48.328,301 47.5,301 C46.672,301 46,300.328 46,299.5 C46,298.672 46.672,298 47.5,298 C48.328,298 49,298.672 49,299.5 z" fill="#FFFFFF" id="path3453"/>
-        <path d="M37,307.5 C37,308.328 36.328,309 35.5,309 C34.672,309 34,308.328 34,307.5 C34,306.672 34.672,306 35.5,306 C36.328,306 37,306.672 37,307.5 z" fill="#FFFFFF" id="path3455"/>
-        <path d="M26,299.5 C26,300.328 25.328,301 24.5,301 C23.672,301 23,300.328 23,299.5 C23,298.672 23.672,298 24.5,298 C25.328,298 26,298.672 26,299.5 z" fill="#FFFFFF" id="path3457"/>
-        <path d="M14,307.5 C14,308.328 13.328,309 12.5,309 C11.672,309 11,308.328 11,307.5 C11,306.672 11.672,306 12.5,306 C13.328,306 14,306.672 14,307.5 z" fill="#FFFFFF" id="path3459"/>
-      </g>
-      <g id="g3473">
-        <g id="g3475">
-          <path d="M36.969,305.469 L34.031,309.531 L23.031,301.531 L25.969,297.469 z" fill="#46682F" id="path3477"/>
-          <path d="M34.125,305.406 L36.875,309.594 L48.875,301.594 L46.125,297.406 z" fill="#70372F" id="path3479"/>
-          <path d="M11.125,305.419 L13.875,309.575 L25.875,301.575 L23.125,297.419 z" fill="#2C5476" id="path3481"/>
-        </g>
-        <path d="M36.375,306.281 L34.625,308.719 L23.625,300.719 L25.375,298.281 z" fill="#8CD05F" id="path3485"/>
-        <path d="M34.656,306.25 L36.344,308.75 L48.344,300.75 L46.656,298.25 z" fill="#E06D5F" id="path3489"/>
-        <path d="M11.656,306.263 L13.344,308.763 L25.344,300.763 L23.656,298.263 z" fill="#58A9ED" id="path3491"/>
-        <path d="M50,299.5 C50,300.881 48.881,302 47.5,302 C46.119,302 45,300.881 45,299.5 C45,298.119 46.119,297 47.5,297 C48.881,297 50,298.119 50,299.5 z" fill="#70372F" id="path3493"/>
-        <path d="M15,307.5 C15,308.881 13.881,310 12.5,310 C11.119,310 10,308.881 10,307.5 C10,306.119 11.119,305 12.5,305 C13.881,305 15,306.119 15,307.5 z" fill="#2C5476" id="path3495"/>
-        <path d="M27,299.5 C27,300.881 25.881,302 24.5,302 C23.119,302 22,300.881 22,299.5 C22,298.119 23.119,297 24.5,297 C25.881,297 27,298.119 27,299.5 z" fill="#395E53" id="path3497"/>
-        <path d="M38,307.5 C38,308.881 36.881,310 35.5,310 C34.119,310 33,308.881 33,307.5 C33,306.119 34.119,305 35.5,305 C36.881,305 38,306.119 38,307.5 z" fill="#5B502F" id="path3499"/>
-        <path d="M49,299.5 C49,300.328 48.328,301 47.5,301 C46.672,301 46,300.328 46,299.5 C46,298.672 46.672,298 47.5,298 C48.328,298 49,298.672 49,299.5 z" fill="#FFFFFF" id="path3501"/>
-        <path d="M37,307.5 C37,308.328 36.328,309 35.5,309 C34.672,309 34,308.328 34,307.5 C34,306.672 34.672,306 35.5,306 C36.328,306 37,306.672 37,307.5 z" fill="#FFFFFF" id="path3503"/>
-        <path d="M26,299.5 C26,300.328 25.328,301 24.5,301 C23.672,301 23,300.328 23,299.5 C23,298.672 23.672,298 24.5,298 C25.328,298 26,298.672 26,299.5 z" fill="#FFFFFF" id="path3505"/>
-        <path d="M14,307.5 C14,308.328 13.328,309 12.5,309 C11.672,309 11,308.328 11,307.5 C11,306.672 11.672,306 12.5,306 C13.328,306 14,306.672 14,307.5 z" fill="#FFFFFF" id="path3507"/>
-      </g>
-      <g id="g3545">
-        <g id="g3547">
-          <path d="M36.969,291.469 L34.031,295.531 L23.031,287.531 L25.969,283.469 z" fill="#46682F" id="path3549"/>
-          <path d="M34.125,291.406 L36.875,295.594 L48.875,287.594 L46.125,283.406 z" fill="#70372F" id="path3551"/>
-          <path d="M11.125,291.419 L13.875,295.575 L25.875,287.575 L23.125,283.419 z" fill="#2C5476" id="path3553"/>
-        </g>
-        <path d="M36.375,292.281 L34.625,294.719 L23.625,286.719 L25.375,284.281 z" fill="#8CD05F" id="path3557"/>
-        <path d="M34.656,292.25 L36.344,294.75 L48.344,286.75 L46.656,284.25 z" fill="#E06D5F" id="path3561"/>
-        <path d="M11.656,292.263 L13.344,294.763 L25.344,286.763 L23.656,284.263 z" fill="#58A9ED" id="path3563"/>
-        <path d="M50,285.5 C50,286.881 48.881,288 47.5,288 C46.119,288 45,286.881 45,285.5 C45,284.119 46.119,283 47.5,283 C48.881,283 50,284.119 50,285.5 z" fill="#70372F" id="path3565"/>
-        <path d="M15,293.5 C15,294.881 13.881,296 12.5,296 C11.119,296 10,294.881 10,293.5 C10,292.119 11.119,291 12.5,291 C13.881,291 15,292.119 15,293.5 z" fill="#2C5476" id="path3567"/>
-        <path d="M27,285.5 C27,286.881 25.881,288 24.5,288 C23.119,288 22,286.881 22,285.5 C22,284.119 23.119,283 24.5,283 C25.881,283 27,284.119 27,285.5 z" fill="#395E53" id="path3569"/>
-        <path d="M38,293.5 C38,294.881 36.881,296 35.5,296 C34.119,296 33,294.881 33,293.5 C33,292.119 34.119,291 35.5,291 C36.881,291 38,292.119 38,293.5 z" fill="#5B502F" id="path3571"/>
-        <path d="M49,285.5 C49,286.328 48.328,287 47.5,287 C46.672,287 46,286.328 46,285.5 C46,284.672 46.672,284 47.5,284 C48.328,284 49,284.672 49,285.5 z" fill="#FFFFFF" id="path3573"/>
-        <path d="M37,293.5 C37,294.328 36.328,295 35.5,295 C34.672,295 34,294.328 34,293.5 C34,292.672 34.672,292 35.5,292 C36.328,292 37,292.672 37,293.5 z" fill="#FFFFFF" id="path3575"/>
-        <path d="M26,285.5 C26,286.328 25.328,287 24.5,287 C23.672,287 23,286.328 23,285.5 C23,284.672 23.672,284 24.5,284 C25.328,284 26,284.672 26,285.5 z" fill="#FFFFFF" id="path3577"/>
-        <path d="M14,293.5 C14,294.328 13.328,295 12.5,295 C11.672,295 11,294.328 11,293.5 C11,292.672 11.672,292 12.5,292 C13.328,292 14,292.672 14,293.5 z" fill="#FFFFFF" id="path3579"/>
-      </g>
-      <g id="g3581">
-        <g id="g3583">
-          <path d="M36.969,277.469 L34.031,281.531 L23.031,273.531 L25.969,269.469 z" fill="#46682F" id="path3585"/>
-          <path d="M34.125,277.406 L36.875,281.594 L48.875,273.594 L46.125,269.406 z" fill="#70372F" id="path3587"/>
-          <path d="M11.125,277.419 L13.875,281.575 L25.875,273.575 L23.125,269.419 z" fill="#2C5476" id="path3589"/>
-        </g>
-        <path d="M36.375,278.281 L34.625,280.719 L23.625,272.719 L25.375,270.281 z" fill="#8CD05F" id="path3593"/>
-        <path d="M34.656,278.25 L36.344,280.75 L48.344,272.75 L46.656,270.25 z" fill="#E06D5F" id="path3597"/>
-        <path d="M11.656,278.263 L13.344,280.763 L25.344,272.763 L23.656,270.263 z" fill="#58A9ED" id="path3599"/>
-        <path d="M50,271.5 C50,272.881 48.881,274 47.5,274 C46.119,274 45,272.881 45,271.5 C45,270.119 46.119,269 47.5,269 C48.881,269 50,270.119 50,271.5 z" fill="#70372F" id="path3601"/>
-        <path d="M15,279.5 C15,280.881 13.881,282 12.5,282 C11.119,282 10,280.881 10,279.5 C10,278.119 11.119,277 12.5,277 C13.881,277 15,278.119 15,279.5 z" fill="#2C5476" id="path3603"/>
-        <path d="M27,271.5 C27,272.881 25.881,274 24.5,274 C23.119,274 22,272.881 22,271.5 C22,270.119 23.119,269 24.5,269 C25.881,269 27,270.119 27,271.5 z" fill="#395E53" id="path3605"/>
-        <path d="M38,279.5 C38,280.881 36.881,282 35.5,282 C34.119,282 33,280.881 33,279.5 C33,278.119 34.119,277 35.5,277 C36.881,277 38,278.119 38,279.5 z" fill="#5B502F" id="path3607"/>
-        <path d="M49,271.5 C49,272.328 48.328,273 47.5,273 C46.672,273 46,272.328 46,271.5 C46,270.672 46.672,270 47.5,270 C48.328,270 49,270.672 49,271.5 z" fill="#FFFFFF" id="path3609"/>
-        <path d="M37,279.5 C37,280.328 36.328,281 35.5,281 C34.672,281 34,280.328 34,279.5 C34,278.672 34.672,278 35.5,278 C36.328,278 37,278.672 37,279.5 z" fill="#FFFFFF" id="path3611"/>
-        <path d="M26,271.5 C26,272.328 25.328,273 24.5,273 C23.672,273 23,272.328 23,271.5 C23,270.672 23.672,270 24.5,270 C25.328,270 26,270.672 26,271.5 z" fill="#FFFFFF" id="path3613"/>
-        <path d="M14,279.5 C14,280.328 13.328,281 12.5,281 C11.672,281 11,280.328 11,279.5 C11,278.672 11.672,278 12.5,278 C13.328,278 14,278.672 14,279.5 z" fill="#FFFFFF" id="path3615"/>
+      <g>
+        <path d="M36.969,305.469 L34.031,309.531 L23.031,301.531 L25.969,297.469 z" fill="#46682F"/>
+        <path d="M34.125,305.406 L36.875,309.594 L48.875,301.594 L46.125,297.406 z" fill="#70372F"/>
+        <path d="M11.125,305.419 L13.875,309.575 L25.875,301.575 L23.125,297.419 z" fill="#2C5476"/>
+        <path d="M36.375,306.281 L34.625,308.719 L23.625,300.719 L25.375,298.281 z" fill="#8CD05F"/>
+        <path d="M34.656,306.25 L36.344,308.75 L48.344,300.75 L46.656,298.25 z" fill="#E06D5F"/>
+        <path d="M11.656,306.263 L13.344,308.763 L25.344,300.763 L23.656,298.263 z" fill="#58A9ED"/>
+        <path d="M50,299.5 C50,300.881 48.881,302 47.5,302 C46.119,302 45,300.881 45,299.5 C45,298.119 46.119,297 47.5,297 C48.881,297 50,298.119 50,299.5 z" fill="#70372F"/>
+        <path d="M15,307.5 C15,308.881 13.881,310 12.5,310 C11.119,310 10,308.881 10,307.5 C10,306.119 11.119,305 12.5,305 C13.881,305 15,306.119 15,307.5 z" fill="#2C5476"/>
+        <path d="M27,299.5 C27,300.881 25.881,302 24.5,302 C23.119,302 22,300.881 22,299.5 C22,298.119 23.119,297 24.5,297 C25.881,297 27,298.119 27,299.5 z" fill="#395E53"/>
+        <path d="M38,307.5 C38,308.881 36.881,310 35.5,310 C34.119,310 33,308.881 33,307.5 C33,306.119 34.119,305 35.5,305 C36.881,305 38,306.119 38,307.5 z" fill="#5B502F"/>
+        <path d="M49,299.5 C49,300.328 48.328,301 47.5,301 C46.672,301 46,300.328 46,299.5 C46,298.672 46.672,298 47.5,298 C48.328,298 49,298.672 49,299.5 z" fill="#FFFFFF"/>
+        <path d="M37,307.5 C37,308.328 36.328,309 35.5,309 C34.672,309 34,308.328 34,307.5 C34,306.672 34.672,306 35.5,306 C36.328,306 37,306.672 37,307.5 z" fill="#FFFFFF"/>
+        <path d="M26,299.5 C26,300.328 25.328,301 24.5,301 C23.672,301 23,300.328 23,299.5 C23,298.672 23.672,298 24.5,298 C25.328,298 26,298.672 26,299.5 z" fill="#FFFFFF"/>
+        <path d="M14,307.5 C14,308.328 13.328,309 12.5,309 C11.672,309 11,308.328 11,307.5 C11,306.672 11.672,306 12.5,306 C13.328,306 14,306.672 14,307.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M36.969,291.469 L34.031,295.531 L23.031,287.531 L25.969,283.469 z" fill="#46682F"/>
+        <path d="M34.125,291.406 L36.875,295.594 L48.875,287.594 L46.125,283.406 z" fill="#70372F"/>
+        <path d="M11.125,291.419 L13.875,295.575 L25.875,287.575 L23.125,283.419 z" fill="#2C5476"/>
+        <path d="M36.375,292.281 L34.625,294.719 L23.625,286.719 L25.375,284.281 z" fill="#8CD05F"/>
+        <path d="M34.656,292.25 L36.344,294.75 L48.344,286.75 L46.656,284.25 z" fill="#E06D5F"/>
+        <path d="M11.656,292.263 L13.344,294.763 L25.344,286.763 L23.656,284.263 z" fill="#58A9ED"/>
+        <path d="M50,285.5 C50,286.881 48.881,288 47.5,288 C46.119,288 45,286.881 45,285.5 C45,284.119 46.119,283 47.5,283 C48.881,283 50,284.119 50,285.5 z" fill="#70372F"/>
+        <path d="M15,293.5 C15,294.881 13.881,296 12.5,296 C11.119,296 10,294.881 10,293.5 C10,292.119 11.119,291 12.5,291 C13.881,291 15,292.119 15,293.5 z" fill="#2C5476"/>
+        <path d="M27,285.5 C27,286.881 25.881,288 24.5,288 C23.119,288 22,286.881 22,285.5 C22,284.119 23.119,283 24.5,283 C25.881,283 27,284.119 27,285.5 z" fill="#395E53"/>
+        <path d="M38,293.5 C38,294.881 36.881,296 35.5,296 C34.119,296 33,294.881 33,293.5 C33,292.119 34.119,291 35.5,291 C36.881,291 38,292.119 38,293.5 z" fill="#5B502F"/>
+        <path d="M49,285.5 C49,286.328 48.328,287 47.5,287 C46.672,287 46,286.328 46,285.5 C46,284.672 46.672,284 47.5,284 C48.328,284 49,284.672 49,285.5 z" fill="#FFFFFF"/>
+        <path d="M37,293.5 C37,294.328 36.328,295 35.5,295 C34.672,295 34,294.328 34,293.5 C34,292.672 34.672,292 35.5,292 C36.328,292 37,292.672 37,293.5 z" fill="#FFFFFF"/>
+        <path d="M26,285.5 C26,286.328 25.328,287 24.5,287 C23.672,287 23,286.328 23,285.5 C23,284.672 23.672,284 24.5,284 C25.328,284 26,284.672 26,285.5 z" fill="#FFFFFF"/>
+        <path d="M14,293.5 C14,294.328 13.328,295 12.5,295 C11.672,295 11,294.328 11,293.5 C11,292.672 11.672,292 12.5,292 C13.328,292 14,292.672 14,293.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M36.969,277.469 L34.031,281.531 L23.031,273.531 L25.969,269.469 z" fill="#46682F"/>
+        <path d="M34.125,277.406 L36.875,281.594 L48.875,273.594 L46.125,269.406 z" fill="#70372F"/>
+        <path d="M11.125,277.419 L13.875,281.575 L25.875,273.575 L23.125,269.419 z" fill="#2C5476"/>
+        <path d="M36.375,278.281 L34.625,280.719 L23.625,272.719 L25.375,270.281 z" fill="#8CD05F"/>
+        <path d="M34.656,278.25 L36.344,280.75 L48.344,272.75 L46.656,270.25 z" fill="#E06D5F"/>
+        <path d="M11.656,278.263 L13.344,280.763 L25.344,272.763 L23.656,270.263 z" fill="#58A9ED"/>
+        <path d="M50,271.5 C50,272.881 48.881,274 47.5,274 C46.119,274 45,272.881 45,271.5 C45,270.119 46.119,269 47.5,269 C48.881,269 50,270.119 50,271.5 z" fill="#70372F"/>
+        <path d="M15,279.5 C15,280.881 13.881,282 12.5,282 C11.119,282 10,280.881 10,279.5 C10,278.119 11.119,277 12.5,277 C13.881,277 15,278.119 15,279.5 z" fill="#2C5476"/>
+        <path d="M27,271.5 C27,272.881 25.881,274 24.5,274 C23.119,274 22,272.881 22,271.5 C22,270.119 23.119,269 24.5,269 C25.881,269 27,270.119 27,271.5 z" fill="#395E53"/>
+        <path d="M38,279.5 C38,280.881 36.881,282 35.5,282 C34.119,282 33,280.881 33,279.5 C33,278.119 34.119,277 35.5,277 C36.881,277 38,278.119 38,279.5 z" fill="#5B502F"/>
+        <path d="M49,271.5 C49,272.328 48.328,273 47.5,273 C46.672,273 46,272.328 46,271.5 C46,270.672 46.672,270 47.5,270 C48.328,270 49,270.672 49,271.5 z" fill="#FFFFFF"/>
+        <path d="M37,279.5 C37,280.328 36.328,281 35.5,281 C34.672,281 34,280.328 34,279.5 C34,278.672 34.672,278 35.5,278 C36.328,278 37,278.672 37,279.5 z" fill="#FFFFFF"/>
+        <path d="M26,271.5 C26,272.328 25.328,273 24.5,273 C23.672,273 23,272.328 23,271.5 C23,270.672 23.672,270 24.5,270 C25.328,270 26,270.672 26,271.5 z" fill="#FFFFFF"/>
+        <path d="M14,279.5 C14,280.328 13.328,281 12.5,281 C11.672,281 11,280.328 11,279.5 C11,278.672 11.672,278 12.5,278 C13.328,278 14,278.672 14,279.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="route-water" viewBox="840 200 60 60">
       <g>
-        <g>
-          <path d="M876.969,245.469 L874.031,249.531 L863.031,241.531 L865.969,237.469 z" fill="#46682F"/>
-          <path d="M874.125,245.406 L876.875,249.594 L888.875,241.594 L886.125,237.406 z" fill="#70372F"/>
-          <path d="M851.125,245.419 L853.875,249.575 L865.875,241.575 L863.125,237.419 z" fill="#2C5476"/>
-        </g>
+        <path d="M876.969,245.469 L874.031,249.531 L863.031,241.531 L865.969,237.469 z" fill="#46682F"/>
+        <path d="M874.125,245.406 L876.875,249.594 L888.875,241.594 L886.125,237.406 z" fill="#70372F"/>
+        <path d="M851.125,245.419 L853.875,249.575 L865.875,241.575 L863.125,237.419 z" fill="#2C5476"/>
         <path d="M876.375,246.281 L874.625,248.719 L863.625,240.719 L865.375,238.281 z" fill="#8CD05F"/>
         <path d="M874.656,246.25 L876.344,248.75 L888.344,240.75 L886.656,238.25 z" fill="#E06D5F"/>
         <path d="M851.656,246.263 L853.344,248.763 L865.344,240.763 L863.656,238.263 z" fill="#58A9ED"/>
       <path d="M856.803,232 C856.803,232 856.267,230.154 856.458,229.25 C856.679,228.203 858.113,226.5 858.113,226.5 C858.113,226.5 859.546,224.797 859.767,223.75 C859.959,222.846 859.422,221 859.422,221 C859.422,221 858.886,219.154 859.077,218.25 C859.298,217.203 860.732,215.5 860.732,215.5 C860.732,215.5 862.165,213.797 862.386,212.75 C862.578,211.846 862.041,210 862.041,210 L878.541,210 C878.541,210 879.975,211.703 880.196,212.75 C880.387,213.654 879.851,215.5 879.851,215.5 C879.851,215.5 879.314,217.346 879.506,218.25 C879.727,219.297 881.16,221 881.16,221 C881.16,221 882.594,222.703 882.815,223.75 C883.006,224.654 882.47,226.5 882.47,226.5 C882.47,226.5 881.933,228.346 882.125,229.25 C882.346,230.297 883.779,232 883.779,232 z" fill="currentColor" id="route-water-stroke1"/>
     </symbol>
     <symbol id="route-power" viewBox="780 200 60 60">
-      <g id="#g3890">
-        <path d="M800,208 L800,209 L802,209 L802,208 L800,208 z M804,208 L804,209 L806,209 L806,208 L804,208 z M814,208 L814,209 L816,209 L816,208 L814,208 z M818,208 L818,209 L820,209 L820,208 L818,208 z M800.313,213 C799.647,216.533 797.267,218.5 795,218.5 L794,218.5 L794,219.5 L795,219.5 C796.042,219.5 797.082,219.196 798,218.594 L798,219.5 L799,219.5 C801.879,219.5 804.615,217.022 805.313,213 L804.313,213 C803.647,216.533 801.267,218.5 799,218.5 L798.125,218.5 C799.686,217.42 800.885,215.509 801.313,213 L800.313,213 z M814.688,213 C815.385,217.022 818.121,219.5 821,219.5 L822,219.5 L822,218.594 C822.918,219.196 823.958,219.5 825,219.5 L826,219.5 L826,218.5 L825,218.5 C822.733,218.5 820.353,216.533 819.688,213 L818.688,213 C819.115,215.509 820.314,217.42 821.875,218.5 L821,218.5 C818.733,218.5 816.353,216.533 815.688,213 L814.688,213 z" fill="#989898" id="rect4103-5"/>
-        <path d="M808,208 L808,210 L799,210 L799,212 L808,212 L808,234 L812,234 L812,212 L821,212 L821,210 L812,210 L812,208 L808,208 z" fill="#B5B5B5" id="rect4101-1"/>
-      </g>
-      <g id="g22802">
-        <g id="g22804">
-          <path d="M816.969,245.469 L814.031,249.531 L803.031,241.531 L805.969,237.469 z" fill="#46682F" id="path22806"/>
-          <path d="M814.125,245.406 L816.875,249.594 L828.875,241.594 L826.125,237.406 z" fill="#70372F" id="path22808"/>
-          <path d="M791.125,245.419 L793.875,249.575 L805.875,241.575 L803.125,237.419 z" fill="#2C5476" id="path22810"/>
-        </g>
-        <path d="M816.375,246.281 L814.625,248.719 L803.625,240.719 L805.375,238.281 z" fill="#8CD05F" id="path22814"/>
-        <path d="M814.656,246.25 L816.344,248.75 L828.344,240.75 L826.656,238.25 z" fill="#E06D5F" id="path22818"/>
-        <path d="M791.656,246.263 L793.344,248.763 L805.344,240.763 L803.656,238.263 z" fill="#58A9ED" id="path22820"/>
-        <path d="M830,239.5 C830,240.881 828.881,242 827.5,242 C826.119,242 825,240.881 825,239.5 C825,238.119 826.119,237 827.5,237 C828.881,237 830,238.119 830,239.5 z" fill="#70372F" id="path22822"/>
-        <path d="M795,247.5 C795,248.881 793.881,250 792.5,250 C791.119,250 790,248.881 790,247.5 C790,246.119 791.119,245 792.5,245 C793.881,245 795,246.119 795,247.5 z" fill="#2C5476" id="path22824"/>
-        <path d="M807,239.5 C807,240.881 805.881,242 804.5,242 C803.119,242 802,240.881 802,239.5 C802,238.119 803.119,237 804.5,237 C805.881,237 807,238.119 807,239.5 z" fill="#395E53" id="path22826"/>
-        <path d="M818,247.5 C818,248.881 816.881,250 815.5,250 C814.119,250 813,248.881 813,247.5 C813,246.119 814.119,245 815.5,245 C816.881,245 818,246.119 818,247.5 z" fill="#5B502F" id="path22828"/>
-        <path d="M829,239.5 C829,240.328 828.328,241 827.5,241 C826.672,241 826,240.328 826,239.5 C826,238.672 826.672,238 827.5,238 C828.328,238 829,238.672 829,239.5 z" fill="#FFFFFF" id="path22830"/>
-        <path d="M817,247.5 C817,248.328 816.328,249 815.5,249 C814.672,249 814,248.328 814,247.5 C814,246.672 814.672,246 815.5,246 C816.328,246 817,246.672 817,247.5 z" fill="#FFFFFF" id="path22832"/>
-        <path d="M806,239.5 C806,240.328 805.328,241 804.5,241 C803.672,241 803,240.328 803,239.5 C803,238.672 803.672,238 804.5,238 C805.328,238 806,238.672 806,239.5 z" fill="#FFFFFF" id="path22834"/>
-        <path d="M794,247.5 C794,248.328 793.328,249 792.5,249 C791.672,249 791,248.328 791,247.5 C791,246.672 791.672,246 792.5,246 C793.328,246 794,246.672 794,247.5 z" fill="#FFFFFF" id="path22836"/>
+      <g>
+        <path d="M816.969,245.469 L814.031,249.531 L803.031,241.531 L805.969,237.469 z" fill="#46682F"/>
+        <path d="M814.125,245.406 L816.875,249.594 L828.875,241.594 L826.125,237.406 z" fill="#70372F"/>
+        <path d="M791.125,245.419 L793.875,249.575 L805.875,241.575 L803.125,237.419 z" fill="#2C5476"/>
+        <path d="M816.375,246.281 L814.625,248.719 L803.625,240.719 L805.375,238.281 z" fill="#8CD05F"/>
+        <path d="M814.656,246.25 L816.344,248.75 L828.344,240.75 L826.656,238.25 z" fill="#E06D5F"/>
+        <path d="M791.656,246.263 L793.344,248.763 L805.344,240.763 L803.656,238.263 z" fill="#58A9ED"/>
+        <path d="M830,239.5 C830,240.881 828.881,242 827.5,242 C826.119,242 825,240.881 825,239.5 C825,238.119 826.119,237 827.5,237 C828.881,237 830,238.119 830,239.5 z" fill="#70372F"/>
+        <path d="M795,247.5 C795,248.881 793.881,250 792.5,250 C791.119,250 790,248.881 790,247.5 C790,246.119 791.119,245 792.5,245 C793.881,245 795,246.119 795,247.5 z" fill="#2C5476"/>
+        <path d="M807,239.5 C807,240.881 805.881,242 804.5,242 C803.119,242 802,240.881 802,239.5 C802,238.119 803.119,237 804.5,237 C805.881,237 807,238.119 807,239.5 z" fill="#395E53"/>
+        <path d="M818,247.5 C818,248.881 816.881,250 815.5,250 C814.119,250 813,248.881 813,247.5 C813,246.119 814.119,245 815.5,245 C816.881,245 818,246.119 818,247.5 z" fill="#5B502F"/>
+        <path d="M829,239.5 C829,240.328 828.328,241 827.5,241 C826.672,241 826,240.328 826,239.5 C826,238.672 826.672,238 827.5,238 C828.328,238 829,238.672 829,239.5 z" fill="#FFFFFF"/>
+        <path d="M817,247.5 C817,248.328 816.328,249 815.5,249 C814.672,249 814,248.328 814,247.5 C814,246.672 814.672,246 815.5,246 C816.328,246 817,246.672 817,247.5 z" fill="#FFFFFF"/>
+        <path d="M806,239.5 C806,240.328 805.328,241 804.5,241 C803.672,241 803,240.328 803,239.5 C803,238.672 803.672,238 804.5,238 C805.328,238 806,238.672 806,239.5 z" fill="#FFFFFF"/>
+        <path d="M794,247.5 C794,248.328 793.328,249 792.5,249 C791.672,249 791,248.328 791,247.5 C791,246.672 791.672,246 792.5,246 C793.328,246 794,246.672 794,247.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M800,208 L800,209 L802,209 L802,208 L800,208 z M804,208 L804,209 L806,209 L806,208 L804,208 z M814,208 L814,209 L816,209 L816,208 L814,208 z M818,208 L818,209 L820,209 L820,208 L818,208 z M800.313,213 C799.647,216.533 797.267,218.5 795,218.5 L794,218.5 L794,219.5 L795,219.5 C796.042,219.5 797.082,219.196 798,218.594 L798,219.5 L799,219.5 C801.879,219.5 804.615,217.022 805.313,213 L804.313,213 C803.647,216.533 801.267,218.5 799,218.5 L798.125,218.5 C799.686,217.42 800.885,215.509 801.313,213 L800.313,213 z M814.688,213 C815.385,217.022 818.121,219.5 821,219.5 L822,219.5 L822,218.594 C822.918,219.196 823.958,219.5 825,219.5 L826,219.5 L826,218.5 L825,218.5 C822.733,218.5 820.353,216.533 819.688,213 L818.688,213 C819.115,215.509 820.314,217.42 821.875,218.5 L821,218.5 C818.733,218.5 816.353,216.533 815.688,213 L814.688,213 z" fill="#989898"/>
+      <path d="M808,208 L808,210 L799,210 L799,212 L808,212 L808,234 L812,234 L812,212 L821,212 L821,210 L812,210 L812,208 L808,208 z" fill="#B5B5B5"/>
     </symbol>
     <symbol id="route-pipeline" viewBox="720 200 60 60">
-      <g id="g25089">
-        <g id="g25091">
-          <path d="M756.969,245.469 L754.031,249.531 L743.031,241.531 L745.969,237.469 z" fill="#46682F" id="path25093"/>
-          <path d="M754.125,245.406 L756.875,249.594 L768.875,241.594 L766.125,237.406 z" fill="#70372F" id="path25095"/>
-          <path d="M731.125,245.419 L733.875,249.575 L745.875,241.575 L743.125,237.419 z" fill="#2C5476" id="path25097"/>
-        </g>
-        <path d="M756.375,246.281 L754.625,248.719 L743.625,240.719 L745.375,238.281 z" fill="#8CD05F" id="path25101"/>
-        <path d="M754.656,246.25 L756.344,248.75 L768.344,240.75 L766.656,238.25 z" fill="#E06D5F" id="path25105"/>
-        <path d="M731.656,246.263 L733.344,248.763 L745.344,240.763 L743.656,238.263 z" fill="#58A9ED" id="path25107"/>
-        <path d="M770,239.5 C770,240.881 768.881,242 767.5,242 C766.119,242 765,240.881 765,239.5 C765,238.119 766.119,237 767.5,237 C768.881,237 770,238.119 770,239.5 z" fill="#70372F" id="path25109"/>
-        <path d="M735,247.5 C735,248.881 733.881,250 732.5,250 C731.119,250 730,248.881 730,247.5 C730,246.119 731.119,245 732.5,245 C733.881,245 735,246.119 735,247.5 z" fill="#2C5476" id="path25111"/>
-        <path d="M747,239.5 C747,240.881 745.881,242 744.5,242 C743.119,242 742,240.881 742,239.5 C742,238.119 743.119,237 744.5,237 C745.881,237 747,238.119 747,239.5 z" fill="#395E53" id="path25113"/>
-        <path d="M758,247.5 C758,248.881 756.881,250 755.5,250 C754.119,250 753,248.881 753,247.5 C753,246.119 754.119,245 755.5,245 C756.881,245 758,246.119 758,247.5 z" fill="#5B502F" id="path25115"/>
-        <path d="M769,239.5 C769,240.328 768.328,241 767.5,241 C766.672,241 766,240.328 766,239.5 C766,238.672 766.672,238 767.5,238 C768.328,238 769,238.672 769,239.5 z" fill="#FFFFFF" id="path25117"/>
-        <path d="M757,247.5 C757,248.328 756.328,249 755.5,249 C754.672,249 754,248.328 754,247.5 C754,246.672 754.672,246 755.5,246 C756.328,246 757,246.672 757,247.5 z" fill="#FFFFFF" id="path25119"/>
-        <path d="M746,239.5 C746,240.328 745.328,241 744.5,241 C743.672,241 743,240.328 743,239.5 C743,238.672 743.672,238 744.5,238 C745.328,238 746,238.672 746,239.5 z" fill="#FFFFFF" id="path25121"/>
-        <path d="M734,247.5 C734,248.328 733.328,249 732.5,249 C731.672,249 731,248.328 731,247.5 C731,246.672 731.672,246 732.5,246 C733.328,246 734,246.672 734,247.5 z" fill="#FFFFFF" id="path25123"/>
-      </g>
-      <g id="g26258-9">
-        <path d="M735.5,213 C734.119,213 733,215.239 733,218 C733,220.761 734.119,223 735.5,223 L746,223 L746,213 L735.5,213 z M750,213 L750,223 L764.5,223 L764.5,213 L750,213 z" fill="#B5B5B5" id="rect25143-4"/>
-        <path d="M767,218 C767,220.761 765.881,223 764.5,223 C763.119,223 762,220.761 762,218 C762,215.239 763.119,213 764.5,213 C765.881,213 767,215.239 767,218 z" fill="#989898" id="path25154-8"/>
-        <path d="M747,210 L747,224 L745,234 L747,234 L748.594,226 L753.406,226 L755,234 L757,234 L755,224 L754,224 L749,224 L749,210 L747,210 z M753,210 L753,212 L755,212 L755,210 L753,210 z M741,213 C740,213 738.5,215.239 738.5,218 C738.5,220.761 740,223 741,223 L743,223 C741.619,223 740,220.761 740,218 C740,215.239 741.619,213 743,213 L741,213 z M756,213 C755,213 753.5,215.239 753.5,218 C753.5,220.761 755,223 756,223 L758,223 C756.619,223 755,220.761 755,218 C755,215.239 756.619,213 758,213 L756,213 z M764.5,213 C763.119,213 762,215.239 762,218 C762,220.761 763.119,223 764.5,223 C765.881,223 767,220.761 767,218 C767,215.239 765.881,213 764.5,213 z" fill="#989898" id="path25145-3"/>
+      <g>
+        <path d="M756.969,245.469 L754.031,249.531 L743.031,241.531 L745.969,237.469 z" fill="#46682F"/>
+        <path d="M754.125,245.406 L756.875,249.594 L768.875,241.594 L766.125,237.406 z" fill="#70372F"/>
+        <path d="M731.125,245.419 L733.875,249.575 L745.875,241.575 L743.125,237.419 z" fill="#2C5476"/>
+        <path d="M756.375,246.281 L754.625,248.719 L743.625,240.719 L745.375,238.281 z" fill="#8CD05F"/>
+        <path d="M754.656,246.25 L756.344,248.75 L768.344,240.75 L766.656,238.25 z" fill="#E06D5F"/>
+        <path d="M731.656,246.263 L733.344,248.763 L745.344,240.763 L743.656,238.263 z" fill="#58A9ED"/>
+        <path d="M770,239.5 C770,240.881 768.881,242 767.5,242 C766.119,242 765,240.881 765,239.5 C765,238.119 766.119,237 767.5,237 C768.881,237 770,238.119 770,239.5 z" fill="#70372F"/>
+        <path d="M735,247.5 C735,248.881 733.881,250 732.5,250 C731.119,250 730,248.881 730,247.5 C730,246.119 731.119,245 732.5,245 C733.881,245 735,246.119 735,247.5 z" fill="#2C5476"/>
+        <path d="M747,239.5 C747,240.881 745.881,242 744.5,242 C743.119,242 742,240.881 742,239.5 C742,238.119 743.119,237 744.5,237 C745.881,237 747,238.119 747,239.5 z" fill="#395E53"/>
+        <path d="M758,247.5 C758,248.881 756.881,250 755.5,250 C754.119,250 753,248.881 753,247.5 C753,246.119 754.119,245 755.5,245 C756.881,245 758,246.119 758,247.5 z" fill="#5B502F"/>
+        <path d="M769,239.5 C769,240.328 768.328,241 767.5,241 C766.672,241 766,240.328 766,239.5 C766,238.672 766.672,238 767.5,238 C768.328,238 769,238.672 769,239.5 z" fill="#FFFFFF"/>
+        <path d="M757,247.5 C757,248.328 756.328,249 755.5,249 C754.672,249 754,248.328 754,247.5 C754,246.672 754.672,246 755.5,246 C756.328,246 757,246.672 757,247.5 z" fill="#FFFFFF"/>
+        <path d="M746,239.5 C746,240.328 745.328,241 744.5,241 C743.672,241 743,240.328 743,239.5 C743,238.672 743.672,238 744.5,238 C745.328,238 746,238.672 746,239.5 z" fill="#FFFFFF"/>
+        <path d="M734,247.5 C734,248.328 733.328,249 732.5,249 C731.672,249 731,248.328 731,247.5 C731,246.672 731.672,246 732.5,246 C733.328,246 734,246.672 734,247.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M735.5,213 C734.119,213 733,215.239 733,218 C733,220.761 734.119,223 735.5,223 L746,223 L746,213 L735.5,213 z M750,213 L750,223 L764.5,223 L764.5,213 L750,213 z" fill="#B5B5B5"/>
+        <path d="M767,218 C767,220.761 765.881,223 764.5,223 C763.119,223 762,220.761 762,218 C762,215.239 763.119,213 764.5,213 C765.881,213 767,215.239 767,218 z" fill="#989898"/>
+        <path d="M747,210 L747,224 L745,234 L747,234 L748.594,226 L753.406,226 L755,234 L757,234 L755,224 L754,224 L749,224 L749,210 L747,210 z M753,210 L753,212 L755,212 L755,210 L753,210 z M741,213 C740,213 738.5,215.239 738.5,218 C738.5,220.761 740,223 741,223 L743,223 C741.619,223 740,220.761 740,218 C740,215.239 741.619,213 743,213 L741,213 z M756,213 C755,213 753.5,215.239 753.5,218 C753.5,220.761 755,223 756,223 L758,223 C756.619,223 755,220.761 755,218 C755,215.239 756.619,213 758,213 L756,213 z M764.5,213 C763.119,213 762,215.239 762,218 C762,220.761 763.119,223 764.5,223 C765.881,223 767,220.761 767,218 C767,215.239 765.881,213 764.5,213 z" fill="#989898"/>
       </g>
     </symbol>
     <symbol id="route-ferry" viewBox="660 200 60 60">
-      <g id="g25015">
-        <g id="g25017">
-          <path d="M696.969,245.469 L694.031,249.531 L683.031,241.531 L685.969,237.469 z" fill="#46682F" id="path25019"/>
-          <path d="M694.125,245.406 L696.875,249.594 L708.875,241.594 L706.125,237.406 z" fill="#70372F" id="path25021"/>
-          <path d="M671.125,245.419 L673.875,249.575 L685.875,241.575 L683.125,237.419 z" fill="#2C5476" id="path25023"/>
-        </g>
-        <path d="M696.375,246.281 L694.625,248.719 L683.625,240.719 L685.375,238.281 z" fill="#8CD05F" id="path25027"/>
-        <path d="M694.656,246.25 L696.344,248.75 L708.344,240.75 L706.656,238.25 z" fill="#E06D5F" id="path25031"/>
-        <path d="M671.656,246.263 L673.344,248.763 L685.344,240.763 L683.656,238.263 z" fill="#58A9ED" id="path25033"/>
-        <path d="M710,239.5 C710,240.881 708.881,242 707.5,242 C706.119,242 705,240.881 705,239.5 C705,238.119 706.119,237 707.5,237 C708.881,237 710,238.119 710,239.5 z" fill="#70372F" id="path25035"/>
-        <path d="M675,247.5 C675,248.881 673.881,250 672.5,250 C671.119,250 670,248.881 670,247.5 C670,246.119 671.119,245 672.5,245 C673.881,245 675,246.119 675,247.5 z" fill="#2C5476" id="path25037"/>
-        <path d="M687,239.5 C687,240.881 685.881,242 684.5,242 C683.119,242 682,240.881 682,239.5 C682,238.119 683.119,237 684.5,237 C685.881,237 687,238.119 687,239.5 z" fill="#395E53" id="path25039"/>
-        <path d="M698,247.5 C698,248.881 696.881,250 695.5,250 C694.119,250 693,248.881 693,247.5 C693,246.119 694.119,245 695.5,245 C696.881,245 698,246.119 698,247.5 z" fill="#5B502F" id="path25041"/>
-        <path d="M709,239.5 C709,240.328 708.328,241 707.5,241 C706.672,241 706,240.328 706,239.5 C706,238.672 706.672,238 707.5,238 C708.328,238 709,238.672 709,239.5 z" fill="#FFFFFF" id="path25043"/>
-        <path d="M697,247.5 C697,248.328 696.328,249 695.5,249 C694.672,249 694,248.328 694,247.5 C694,246.672 694.672,246 695.5,246 C696.328,246 697,246.672 697,247.5 z" fill="#FFFFFF" id="path25045"/>
-        <path d="M686,239.5 C686,240.328 685.328,241 684.5,241 C683.672,241 683,240.328 683,239.5 C683,238.672 683.672,238 684.5,238 C685.328,238 686,238.672 686,239.5 z" fill="#FFFFFF" id="path25047"/>
-        <path d="M674,247.5 C674,248.328 673.328,249 672.5,249 C671.672,249 671,248.328 671,247.5 C671,246.672 671.672,246 672.5,246 C673.328,246 674,246.672 674,247.5 z" fill="#FFFFFF" id="path25049"/>
-      </g>
-      <path d="M687,205.969 L686,206.969 L686,208.969 L683,208.969 L682,209.969 L682,216.875 L684,216.156 L684,211.969 L685,210.969 L687,210.969 L687,215.062 L688,214.688 L688,210.969 L692,210.969 L692,214.5 L693,214.781 L693,210.969 L695,210.969 L696,211.969 L696,215.594 L698,216.156 L698,209.969 L697,208.969 L694,208.969 L694,206.969 L693,205.969 L687,205.969 z M690,214.969 L679,218.969 L679,228.031 C678.979,228.024 678.958,228.007 678.938,228 C677.518,227.513 676.407,227.031 676.407,227.031 C676.077,226.883 675.693,226.924 675.401,227.137 C675.109,227.35 674.953,227.703 674.993,228.062 C675.033,228.421 675.263,228.731 675.594,228.875 C675.594,228.875 676.816,229.393 678.313,229.906 C679.81,230.42 681.548,230.969 683,230.969 C684.453,230.969 686.191,230.42 687.688,229.906 C689.185,229.393 690.407,228.875 690.407,228.875 C690.407,228.875 691.518,228.393 692.938,227.906 C694.357,227.42 696.119,226.969 697,226.969 C697.881,226.969 699.643,227.42 701.062,227.906 C702.482,228.393 703.594,228.875 703.594,228.875 C703.924,229.023 704.307,228.983 704.599,228.77 C704.891,228.557 705.047,228.204 705.007,227.844 C704.967,227.485 704.738,227.175 704.406,227.031 C704.406,227.031 703.184,226.513 701.687,226 C701.465,225.924 701.231,225.856 701,225.781 L701,217.969 L690,214.969 z M697,228.969 C695.548,228.969 693.809,229.487 692.312,230 C690.815,230.513 689.594,231.031 689.594,231.031 C689.594,231.031 688.482,231.513 687.062,232 C685.643,232.487 683.881,232.969 683,232.969 C682.119,232.969 680.357,232.487 678.937,232 C677.518,231.513 676.406,231.031 676.406,231.031 C676.076,230.883 675.693,230.924 675.401,231.137 C675.109,231.35 674.953,231.703 674.993,232.062 C675.033,232.421 675.262,232.731 675.594,232.875 C675.594,232.875 676.815,233.393 678.312,233.906 C679.809,234.42 681.548,234.969 683,234.969 C684.452,234.969 686.19,234.42 687.687,233.906 C689.184,233.393 690.406,232.875 690.406,232.875 C690.406,232.875 691.518,232.393 692.937,231.906 C694.357,231.42 696.119,230.969 697,230.969 C697.881,230.969 699.643,231.42 701.062,231.906 C702.482,232.393 703.594,232.875 703.594,232.875 C703.924,233.023 704.307,232.983 704.599,232.77 C704.891,232.557 705.047,232.204 705.007,231.844 C704.967,231.485 704.738,231.175 704.406,231.031 C704.406,231.031 703.184,230.513 701.687,230 C700.19,229.487 698.452,228.969 697,228.969 z" fill="currentColor" id="route-ferry-stroke"/>
+      <g>
+        <path d="M696.969,245.469 L694.031,249.531 L683.031,241.531 L685.969,237.469 z" fill="#46682F"/>
+        <path d="M694.125,245.406 L696.875,249.594 L708.875,241.594 L706.125,237.406 z" fill="#70372F"/>
+        <path d="M671.125,245.419 L673.875,249.575 L685.875,241.575 L683.125,237.419 z" fill="#2C5476"/>
+        <path d="M696.375,246.281 L694.625,248.719 L683.625,240.719 L685.375,238.281 z" fill="#8CD05F"/>
+        <path d="M694.656,246.25 L696.344,248.75 L708.344,240.75 L706.656,238.25 z" fill="#E06D5F"/>
+        <path d="M671.656,246.263 L673.344,248.763 L685.344,240.763 L683.656,238.263 z" fill="#58A9ED"/>
+        <path d="M710,239.5 C710,240.881 708.881,242 707.5,242 C706.119,242 705,240.881 705,239.5 C705,238.119 706.119,237 707.5,237 C708.881,237 710,238.119 710,239.5 z" fill="#70372F"/>
+        <path d="M675,247.5 C675,248.881 673.881,250 672.5,250 C671.119,250 670,248.881 670,247.5 C670,246.119 671.119,245 672.5,245 C673.881,245 675,246.119 675,247.5 z" fill="#2C5476"/>
+        <path d="M687,239.5 C687,240.881 685.881,242 684.5,242 C683.119,242 682,240.881 682,239.5 C682,238.119 683.119,237 684.5,237 C685.881,237 687,238.119 687,239.5 z" fill="#395E53"/>
+        <path d="M698,247.5 C698,248.881 696.881,250 695.5,250 C694.119,250 693,248.881 693,247.5 C693,246.119 694.119,245 695.5,245 C696.881,245 698,246.119 698,247.5 z" fill="#5B502F"/>
+        <path d="M709,239.5 C709,240.328 708.328,241 707.5,241 C706.672,241 706,240.328 706,239.5 C706,238.672 706.672,238 707.5,238 C708.328,238 709,238.672 709,239.5 z" fill="#FFFFFF"/>
+        <path d="M697,247.5 C697,248.328 696.328,249 695.5,249 C694.672,249 694,248.328 694,247.5 C694,246.672 694.672,246 695.5,246 C696.328,246 697,246.672 697,247.5 z" fill="#FFFFFF"/>
+        <path d="M686,239.5 C686,240.328 685.328,241 684.5,241 C683.672,241 683,240.328 683,239.5 C683,238.672 683.672,238 684.5,238 C685.328,238 686,238.672 686,239.5 z" fill="#FFFFFF"/>
+        <path d="M674,247.5 C674,248.328 673.328,249 672.5,249 C671.672,249 671,248.328 671,247.5 C671,246.672 671.672,246 672.5,246 C673.328,246 674,246.672 674,247.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M685.666,226.974 C687.013,226.992 688.315,227.464 689.361,228.313 L689.88,228.772 L689.98,228.772 L690.599,228.213 C692.56,226.592 695.351,226.446 697.47,227.853 L701.984,218.985 L698.988,216.988 L698.988,209.898 C698.895,208.3 697.592,207.04 695.992,207.001 L694.993,207.001 C695.062,205.967 694.278,205.073 693.244,205.004 C693.161,204.999 693.078,204.999 692.996,205.004 L687.004,205.004 C685.969,204.936 685.075,205.719 685.007,206.754 C685.001,206.836 685.001,206.919 685.007,207.001 L684.008,207.001 C682.408,207.04 681.105,208.3 681.012,209.898 L681.012,216.988 L678.016,218.985 L682.51,228.033 C683.437,227.382 684.534,227.014 685.666,226.974 z M683.009,209.898 C683.03,209.379 683.467,208.977 683.985,208.998 C683.993,208.998 684,208.998 684.008,208.999 L695.992,208.999 C696.509,208.965 696.956,209.356 696.991,209.873 C696.993,209.915 696.993,209.956 696.991,209.997 L696.991,215.989 L690,211.995 L683.009,215.889 C683.009,215.889 683.009,209.898 683.009,209.898 z M702.982,230.969 L702.982,232.966 C702.458,233.005 701.97,233.249 701.624,233.645 C701.082,234.221 700.39,234.636 699.627,234.844 C698.399,235.206 697.071,234.929 696.092,234.105 L695.313,233.406 C694.705,232.801 693.724,232.801 693.116,233.406 C692.836,233.645 692.576,233.905 692.277,234.145 C690.813,235.314 688.719,235.255 687.324,234.005 L686.545,233.306 C685.973,232.806 685.119,232.806 684.547,233.306 C684.168,233.605 683.828,233.945 683.449,234.245 C682.042,235.286 680.107,235.237 678.755,234.125 L678.136,233.586 C677.847,233.255 677.451,233.035 677.018,232.966 L677.018,230.969 C677.534,230.905 678.057,231.003 678.516,231.249 C679.071,231.593 679.599,231.98 680.093,232.407 C680.503,232.854 681.121,233.044 681.711,232.906 C681.936,232.84 682.146,232.731 682.33,232.587 C682.65,232.347 682.91,232.068 683.229,231.808 C684.648,230.632 686.703,230.632 688.122,231.808 C688.442,232.068 688.742,232.367 689.061,232.627 C689.633,233.127 690.487,233.127 691.059,232.627 C691.378,232.367 691.678,232.068 691.997,231.808 C693.42,230.621 695.488,230.621 696.911,231.808 C697.21,232.068 697.49,232.347 697.789,232.587 C698.361,233.087 699.215,233.087 699.787,232.587 L700.725,231.768 C701.364,231.25 702.161,230.968 702.982,230.969 z" fill="currentColor" id="route-ferry-stroke"/>
     </symbol>
     <symbol id="route-tram" viewBox="600 200 60 60">
-      <g id="railway-subway-3">
-        <path d="M636.031,232 L637,234 L638,235 L639.5,234 L638.531,232 z" fill="#989898" id="path4893-1"/>
-        <path d="M623.5,232 L622.531,234 L621.531,235 L620.031,234 L621,232 z" fill="#989898" id="path5119-4"/>
-        <path d="M625,208 L619,214 L619,229 L621,231 L639,231 L641,229 L641,214 L635,208 L625,208 z M626,210 L634,210 L634,212 L626,212 L626,210 z M622,214 L624,214 L636,214 L638,214 L639,215 L639,219 L636,221 L624,221 L621,219 L621,215 L622,214 z M621,225 L624,225 L626,227 L626,228 L622,228 L621,227 L621,225 z M636,225 L639,225 L639,227 L638,228 L634,228 L634,227 L636,225 z" fill="#989898" id="rect5077-7"/>
-      </g>
-      <g id="g22976">
-        <g id="g22978">
-          <path d="M636.969,245.469 L634.031,249.531 L623.031,241.531 L625.969,237.469 z" fill="#46682F" id="path22980"/>
-          <path d="M634.125,245.406 L636.875,249.594 L648.875,241.594 L646.125,237.406 z" fill="#70372F" id="path22982"/>
-          <path d="M611.125,245.419 L613.875,249.575 L625.875,241.575 L623.125,237.419 z" fill="#2C5476" id="path22984"/>
-        </g>
-        <path d="M636.375,246.281 L634.625,248.719 L623.625,240.719 L625.375,238.281 z" fill="#8CD05F" id="path22988"/>
-        <path d="M634.656,246.25 L636.344,248.75 L648.344,240.75 L646.656,238.25 z" fill="#E06D5F" id="path22992"/>
-        <path d="M611.656,246.263 L613.344,248.763 L625.344,240.763 L623.656,238.263 z" fill="#58A9ED" id="path22994"/>
-        <path d="M650,239.5 C650,240.881 648.881,242 647.5,242 C646.119,242 645,240.881 645,239.5 C645,238.119 646.119,237 647.5,237 C648.881,237 650,238.119 650,239.5 z" fill="#70372F" id="path22996"/>
-        <path d="M615,247.5 C615,248.881 613.881,250 612.5,250 C611.119,250 610,248.881 610,247.5 C610,246.119 611.119,245 612.5,245 C613.881,245 615,246.119 615,247.5 z" fill="#2C5476" id="path22998"/>
-        <path d="M627,239.5 C627,240.881 625.881,242 624.5,242 C623.119,242 622,240.881 622,239.5 C622,238.119 623.119,237 624.5,237 C625.881,237 627,238.119 627,239.5 z" fill="#395E53" id="path23000"/>
-        <path d="M638,247.5 C638,248.881 636.881,250 635.5,250 C634.119,250 633,248.881 633,247.5 C633,246.119 634.119,245 635.5,245 C636.881,245 638,246.119 638,247.5 z" fill="#5B502F" id="path23002"/>
-        <path d="M649,239.5 C649,240.328 648.328,241 647.5,241 C646.672,241 646,240.328 646,239.5 C646,238.672 646.672,238 647.5,238 C648.328,238 649,238.672 649,239.5 z" fill="#FFFFFF" id="path23004"/>
-        <path d="M637,247.5 C637,248.328 636.328,249 635.5,249 C634.672,249 634,248.328 634,247.5 C634,246.672 634.672,246 635.5,246 C636.328,246 637,246.672 637,247.5 z" fill="#FFFFFF" id="path23006"/>
-        <path d="M626,239.5 C626,240.328 625.328,241 624.5,241 C623.672,241 623,240.328 623,239.5 C623,238.672 623.672,238 624.5,238 C625.328,238 626,238.672 626,239.5 z" fill="#FFFFFF" id="path23008"/>
-        <path d="M614,247.5 C614,248.328 613.328,249 612.5,249 C611.672,249 611,248.328 611,247.5 C611,246.672 611.672,246 612.5,246 C613.328,246 614,246.672 614,247.5 z" fill="#FFFFFF" id="path23010"/>
+      <g>
+        <path d="M636.969,245.469 L634.031,249.531 L623.031,241.531 L625.969,237.469 z" fill="#46682F"/>
+        <path d="M634.125,245.406 L636.875,249.594 L648.875,241.594 L646.125,237.406 z" fill="#70372F"/>
+        <path d="M611.125,245.419 L613.875,249.575 L625.875,241.575 L623.125,237.419 z" fill="#2C5476"/>
+        <path d="M636.375,246.281 L634.625,248.719 L623.625,240.719 L625.375,238.281 z" fill="#8CD05F"/>
+        <path d="M634.656,246.25 L636.344,248.75 L648.344,240.75 L646.656,238.25 z" fill="#E06D5F"/>
+        <path d="M611.656,246.263 L613.344,248.763 L625.344,240.763 L623.656,238.263 z" fill="#58A9ED"/>
+        <path d="M650,239.5 C650,240.881 648.881,242 647.5,242 C646.119,242 645,240.881 645,239.5 C645,238.119 646.119,237 647.5,237 C648.881,237 650,238.119 650,239.5 z" fill="#70372F"/>
+        <path d="M615,247.5 C615,248.881 613.881,250 612.5,250 C611.119,250 610,248.881 610,247.5 C610,246.119 611.119,245 612.5,245 C613.881,245 615,246.119 615,247.5 z" fill="#2C5476"/>
+        <path d="M627,239.5 C627,240.881 625.881,242 624.5,242 C623.119,242 622,240.881 622,239.5 C622,238.119 623.119,237 624.5,237 C625.881,237 627,238.119 627,239.5 z" fill="#395E53"/>
+        <path d="M638,247.5 C638,248.881 636.881,250 635.5,250 C634.119,250 633,248.881 633,247.5 C633,246.119 634.119,245 635.5,245 C636.881,245 638,246.119 638,247.5 z" fill="#5B502F"/>
+        <path d="M649,239.5 C649,240.328 648.328,241 647.5,241 C646.672,241 646,240.328 646,239.5 C646,238.672 646.672,238 647.5,238 C648.328,238 649,238.672 649,239.5 z" fill="#FFFFFF"/>
+        <path d="M637,247.5 C637,248.328 636.328,249 635.5,249 C634.672,249 634,248.328 634,247.5 C634,246.672 634.672,246 635.5,246 C636.328,246 637,246.672 637,247.5 z" fill="#FFFFFF"/>
+        <path d="M626,239.5 C626,240.328 625.328,241 624.5,241 C623.672,241 623,240.328 623,239.5 C623,238.672 623.672,238 624.5,238 C625.328,238 626,238.672 626,239.5 z" fill="#FFFFFF"/>
+        <path d="M614,247.5 C614,248.328 613.328,249 612.5,249 C611.672,249 611,248.328 611,247.5 C611,246.672 611.672,246 612.5,246 C613.328,246 614,246.672 614,247.5 z" fill="#FFFFFF"/>
+      </g>
+      <g>
+        <path d="M635.031,232 L636,234 L637,235 L638.5,234 L637.531,232 z" fill="#989898"/>
+        <path d="M624.5,232 L623.531,234 L622.531,235 L621.031,234 L622,232 z" fill="#989898"/>
+        <path d="M626,209 L621,215 L621,229 L623,231 L637,231 L639,229 L639,215 L634,209 L626,209 z M626,210 L634,210 L634,212 L626,212 L626,210 z M624,215 L626,215 L634,215 L636,215 L637,216 L637,220 L634,220 L626,220 L623,220 L623,216 L624,215 z M623,225 L626,225 L628,227 L628,228 L624,228 L623,227 L623,225 z M634,225 L637,225 L637,227 L636,228 L632,228 L632,227 L634,225 z" fill="#989898"/>
+        <path d="M625,205 L625,206 L629,206 L629,208 L631,208 L631,206 L635,206 L635,205 z" fill="#B5B5B5"/>
       </g>
     </symbol>
     <symbol id="route-detour" viewBox="540 200 60 60">
+      <g>
+        <path d="M576.969,245.469 L574.031,249.531 L563.031,241.531 L565.969,237.469 z" fill="#46682F"/>
+        <path d="M574.125,245.406 L576.875,249.594 L588.875,241.594 L586.125,237.406 z" fill="#70372F"/>
+        <path d="M551.125,245.419 L553.875,249.575 L565.875,241.575 L563.125,237.419 z" fill="#2C5476"/>
+        <path d="M576.375,246.281 L574.625,248.719 L563.625,240.719 L565.375,238.281 z" fill="#8CD05F"/>
+        <path d="M574.656,246.25 L576.344,248.75 L588.344,240.75 L586.656,238.25 z" fill="#E06D5F"/>
+        <path d="M551.656,246.263 L553.344,248.763 L565.344,240.763 L563.656,238.263 z" fill="#58A9ED"/>
+        <path d="M590,239.5 C590,240.881 588.881,242 587.5,242 C586.119,242 585,240.881 585,239.5 C585,238.119 586.119,237 587.5,237 C588.881,237 590,238.119 590,239.5 z" fill="#70372F"/>
+        <path d="M555,247.5 C555,248.881 553.881,250 552.5,250 C551.119,250 550,248.881 550,247.5 C550,246.119 551.119,245 552.5,245 C553.881,245 555,246.119 555,247.5 z" fill="#2C5476"/>
+        <path d="M567,239.5 C567,240.881 565.881,242 564.5,242 C563.119,242 562,240.881 562,239.5 C562,238.119 563.119,237 564.5,237 C565.881,237 567,238.119 567,239.5 z" fill="#395E53"/>
+        <path d="M578,247.5 C578,248.881 576.881,250 575.5,250 C574.119,250 573,248.881 573,247.5 C573,246.119 574.119,245 575.5,245 C576.881,245 578,246.119 578,247.5 z" fill="#5B502F"/>
+        <path d="M589,239.5 C589,240.328 588.328,241 587.5,241 C586.672,241 586,240.328 586,239.5 C586,238.672 586.672,238 587.5,238 C588.328,238 589,238.672 589,239.5 z" fill="#FFFFFF"/>
+        <path d="M577,247.5 C577,248.328 576.328,249 575.5,249 C574.672,249 574,248.328 574,247.5 C574,246.672 574.672,246 575.5,246 C576.328,246 577,246.672 577,247.5 z" fill="#FFFFFF"/>
+        <path d="M566,239.5 C566,240.328 565.328,241 564.5,241 C563.672,241 563,240.328 563,239.5 C563,238.672 563.672,238 564.5,238 C565.328,238 566,238.672 566,239.5 z" fill="#FFFFFF"/>
+        <path d="M554,247.5 C554,248.328 553.328,249 552.5,249 C551.672,249 551,248.328 551,247.5 C551,246.672 551.672,246 552.5,246 C553.328,246 554,246.672 554,247.5 z" fill="#FFFFFF"/>
+      </g>
       <path d="M557,214 L555,216 L555,231 L557,233 L585,233 L587,231 L587,216 L585,214 L557,214" fill="#FC6C14"/>
       <path d="M574,219.5 L579,223.5 L574,227.5 L574,225 L563,225 L563,222 L574,222" fill="#000000"/>
-      <g id="g22876">
-        <g id="g22878">
-          <path d="M576.969,245.469 L574.031,249.531 L563.031,241.531 L565.969,237.469 z" fill="#46682F" id="path22880"/>
-          <path d="M574.125,245.406 L576.875,249.594 L588.875,241.594 L586.125,237.406 z" fill="#70372F" id="path22882"/>
-          <path d="M551.125,245.419 L553.875,249.575 L565.875,241.575 L563.125,237.419 z" fill="#2C5476" id="path22884"/>
-        </g>
-        <path d="M576.375,246.281 L574.625,248.719 L563.625,240.719 L565.375,238.281 z" fill="#8CD05F" id="path22888"/>
-        <path d="M574.656,246.25 L576.344,248.75 L588.344,240.75 L586.656,238.25 z" fill="#E06D5F" id="path22892"/>
-        <path d="M551.656,246.263 L553.344,248.763 L565.344,240.763 L563.656,238.263 z" fill="#58A9ED" id="path22894"/>
-        <path d="M590,239.5 C590,240.881 588.881,242 587.5,242 C586.119,242 585,240.881 585,239.5 C585,238.119 586.119,237 587.5,237 C588.881,237 590,238.119 590,239.5 z" fill="#70372F" id="path22896"/>
-        <path d="M555,247.5 C555,248.881 553.881,250 552.5,250 C551.119,250 550,248.881 550,247.5 C550,246.119 551.119,245 552.5,245 C553.881,245 555,246.119 555,247.5 z" fill="#2C5476" id="path22898"/>
-        <path d="M567,239.5 C567,240.881 565.881,242 564.5,242 C563.119,242 562,240.881 562,239.5 C562,238.119 563.119,237 564.5,237 C565.881,237 567,238.119 567,239.5 z" fill="#395E53" id="path22900"/>
-        <path d="M578,247.5 C578,248.881 576.881,250 575.5,250 C574.119,250 573,248.881 573,247.5 C573,246.119 574.119,245 575.5,245 C576.881,245 578,246.119 578,247.5 z" fill="#5B502F" id="path22902"/>
-        <path d="M589,239.5 C589,240.328 588.328,241 587.5,241 C586.672,241 586,240.328 586,239.5 C586,238.672 586.672,238 587.5,238 C588.328,238 589,238.672 589,239.5 z" fill="#FFFFFF" id="path22904"/>
-        <path d="M577,247.5 C577,248.328 576.328,249 575.5,249 C574.672,249 574,248.328 574,247.5 C574,246.672 574.672,246 575.5,246 C576.328,246 577,246.672 577,247.5 z" fill="#FFFFFF" id="path22906"/>
-        <path d="M566,239.5 C566,240.328 565.328,241 564.5,241 C563.672,241 563,240.328 563,239.5 C563,238.672 563.672,238 564.5,238 C565.328,238 566,238.672 566,239.5 z" fill="#FFFFFF" id="path22908"/>
-        <path d="M554,247.5 C554,248.328 553.328,249 552.5,249 C551.672,249 551,248.328 551,247.5 C551,246.672 551.672,246 552.5,246 C553.328,246 554,246.672 554,247.5 z" fill="#FFFFFF" id="path22910"/>
-      </g>
-      <path d="M557,216.013 L557,216.513 L557,230.513 L557,231.013 L557.5,231.013 L584.5,231.013 L585,231.013 L585,230.513 L585,216.513 L585,216.013 L584.5,216.013 L557.5,216.013 L557,216.013 z M558,217.013 L584,217.013 L584,230.013 L558,230.013 L558,217.013 z" fill="#000000" id="rect22914"/>
+      <path d="M557,216.013 L557,216.513 L557,230.513 L557,231.013 L557.5,231.013 L584.5,231.013 L585,231.013 L585,230.513 L585,216.513 L585,216.013 L584.5,216.013 L557.5,216.013 L557,216.013 z M558,217.013 L584,217.013 L584,230.013 L558,230.013 L558,217.013 z" fill="#000000"/>
     </symbol>
     <symbol id="route-train" viewBox="480 200 60 60">
-      <path d="M503.5,211 L502,212 L501.531,214 L498.25,214 C497.696,214 497.384,214.463 497.25,215 L497,216 C496.866,216.537 497.446,217 498,217 L522,217 C522.554,217 523.134,216.537 523,216 L522.75,215 C522.616,214.463 522.304,214 521.75,214 L518.969,214 L518.5,212 L517,211 L516,212 L516.469,214 L504.031,214 L504.5,212 L503.5,211 z M501.5,215 C501.776,215 502,215.224 502,215.5 C502,215.776 501.776,216 501.5,216 C501.224,216 501,215.776 501,215.5 C501,215.224 501.224,215 501.5,215 z M518.5,215 C518.776,215 519,215.224 519,215.5 C519,215.776 518.776,216 518.5,216 C518.224,216 518,215.776 518,215.5 C518,215.224 518.224,215 518.5,215 z M500.562,218 L500.094,220 L497.25,220 C496.696,220 496.384,220.463 496.25,221 L496,222 C495.866,222.537 496.446,223 497,223 L523,223 C523.554,223 524.134,222.537 524,222 L523.75,221 C523.616,220.463 523.304,220 522.75,220 L520.406,220 L519.938,218 L517.438,218 L517.906,220 L502.594,220 L503.062,218 L500.562,218 z M500.5,221 C500.776,221 501,221.224 501,221.5 C501,221.776 500.776,222 500.5,222 C500.224,222 500,221.776 500,221.5 C500,221.224 500.224,221 500.5,221 z M519.5,221 C519.776,221 520,221.224 520,221.5 C520,221.776 519.776,222 519.5,222 C519.224,222 519,221.776 519,221.5 C519,221.224 519.224,221 519.5,221 z M499.156,224 L498.688,226 L496.25,226 C495.696,226 495.384,226.463 495.25,227 L495,228 C494.866,228.537 495.446,229 496,229 L524,229 C524.554,229 525.134,228.537 525,228 L524.75,227 C524.616,226.463 524.304,226 523.75,226 L521.812,226 L521.344,224 L518.844,224 L519.312,226 L501.188,226 L501.656,224 L499.156,224 z M499.5,227 C499.776,227 500,227.224 500,227.5 C500,227.776 499.776,228 499.5,228 C499.224,228 499,227.776 499,227.5 C499,227.224 499.224,227 499.5,227 z M520.5,227 C520.776,227 521,227.224 521,227.5 C521,227.776 520.776,228 520.5,228 C520.224,228 520,227.776 520,227.5 C520,227.224 520.224,227 520.5,227 z M497.719,230 L497,233 L498.5,234 L499.5,233 L500.219,230 L497.719,230 z M520.281,230 L521,233 L522,234 L523.5,233 L522.781,230 L520.281,230 z" fill="#989898" id="rect17528-7-8"/>
-      <g id="g22838">
-        <g id="g22840">
-          <path d="M516.969,245.469 L514.031,249.531 L503.031,241.531 L505.969,237.469 z" fill="#46682F" id="path22842"/>
-          <path d="M514.125,245.406 L516.875,249.594 L528.875,241.594 L526.125,237.406 z" fill="#70372F" id="path22844"/>
-          <path d="M491.125,245.419 L493.875,249.575 L505.875,241.575 L503.125,237.419 z" fill="#2C5476" id="path22846"/>
-        </g>
-        <path d="M516.375,246.281 L514.625,248.719 L503.625,240.719 L505.375,238.281 z" fill="#8CD05F" id="path22850"/>
-        <path d="M514.656,246.25 L516.344,248.75 L528.344,240.75 L526.656,238.25 z" fill="#E06D5F" id="path22854"/>
-        <path d="M491.656,246.263 L493.344,248.763 L505.344,240.763 L503.656,238.263 z" fill="#58A9ED" id="path22856"/>
-        <path d="M530,239.5 C530,240.881 528.881,242 527.5,242 C526.119,242 525,240.881 525,239.5 C525,238.119 526.119,237 527.5,237 C528.881,237 530,238.119 530,239.5 z" fill="#70372F" id="path22858"/>
-        <path d="M495,247.5 C495,248.881 493.881,250 492.5,250 C491.119,250 490,248.881 490,247.5 C490,246.119 491.119,245 492.5,245 C493.881,245 495,246.119 495,247.5 z" fill="#2C5476" id="path22860"/>
-        <path d="M507,239.5 C507,240.881 505.881,242 504.5,242 C503.119,242 502,240.881 502,239.5 C502,238.119 503.119,237 504.5,237 C505.881,237 507,238.119 507,239.5 z" fill="#395E53" id="path22862"/>
-        <path d="M518,247.5 C518,248.881 516.881,250 515.5,250 C514.119,250 513,248.881 513,247.5 C513,246.119 514.119,245 515.5,245 C516.881,245 518,246.119 518,247.5 z" fill="#5B502F" id="path22864"/>
-        <path d="M529,239.5 C529,240.328 528.328,241 527.5,241 C526.672,241 526,240.328 526,239.5 C526,238.672 526.672,238 527.5,238 C528.328,238 529,238.672 529,239.5 z" fill="#FFFFFF" id="path22866"/>
-        <path d="M517,247.5 C517,248.328 516.328,249 515.5,249 C514.672,249 514,248.328 514,247.5 C514,246.672 514.672,246 515.5,246 C516.328,246 517,246.672 517,247.5 z" fill="#FFFFFF" id="path22868"/>
-        <path d="M506,239.5 C506,240.328 505.328,241 504.5,241 C503.672,241 503,240.328 503,239.5 C503,238.672 503.672,238 504.5,238 C505.328,238 506,238.672 506,239.5 z" fill="#FFFFFF" id="path22870"/>
-        <path d="M494,247.5 C494,248.328 493.328,249 492.5,249 C491.672,249 491,248.328 491,247.5 C491,246.672 491.672,246 492.5,246 C493.328,246 494,246.672 494,247.5 z" fill="#FFFFFF" id="path22872"/>
+      <g>
+        <path d="M516.969,245.469 L514.031,249.531 L503.031,241.531 L505.969,237.469 z" fill="#46682F"/>
+        <path d="M514.125,245.406 L516.875,249.594 L528.875,241.594 L526.125,237.406 z" fill="#70372F"/>
+        <path d="M491.125,245.419 L493.875,249.575 L505.875,241.575 L503.125,237.419 z" fill="#2C5476"/>
+        <path d="M516.375,246.281 L514.625,248.719 L503.625,240.719 L505.375,238.281 z" fill="#8CD05F"/>
+        <path d="M514.656,246.25 L516.344,248.75 L528.344,240.75 L526.656,238.25 z" fill="#E06D5F"/>
+        <path d="M491.656,246.263 L493.344,248.763 L505.344,240.763 L503.656,238.263 z" fill="#58A9ED"/>
+        <path d="M530,239.5 C530,240.881 528.881,242 527.5,242 C526.119,242 525,240.881 525,239.5 C525,238.119 526.119,237 527.5,237 C528.881,237 530,238.119 530,239.5 z" fill="#70372F"/>
+        <path d="M495,247.5 C495,248.881 493.881,250 492.5,250 C491.119,250 490,248.881 490,247.5 C490,246.119 491.119,245 492.5,245 C493.881,245 495,246.119 495,247.5 z" fill="#2C5476"/>
+        <path d="M507,239.5 C507,240.881 505.881,242 504.5,242 C503.119,242 502,240.881 502,239.5 C502,238.119 503.119,237 504.5,237 C505.881,237 507,238.119 507,239.5 z" fill="#395E53"/>
+        <path d="M518,247.5 C518,248.881 516.881,250 515.5,250 C514.119,250 513,248.881 513,247.5 C513,246.119 514.119,245 515.5,245 C516.881,245 518,246.119 518,247.5 z" fill="#5B502F"/>
+        <path d="M529,239.5 C529,240.328 528.328,241 527.5,241 C526.672,241 526,240.328 526,239.5 C526,238.672 526.672,238 527.5,238 C528.328,238 529,238.672 529,239.5 z" fill="#FFFFFF"/>
+        <path d="M517,247.5 C517,248.328 516.328,249 515.5,249 C514.672,249 514,248.328 514,247.5 C514,246.672 514.672,246 515.5,246 C516.328,246 517,246.672 517,247.5 z" fill="#FFFFFF"/>
+        <path d="M506,239.5 C506,240.328 505.328,241 504.5,241 C503.672,241 503,240.328 503,239.5 C503,238.672 503.672,238 504.5,238 C505.328,238 506,238.672 506,239.5 z" fill="#FFFFFF"/>
+        <path d="M494,247.5 C494,248.328 493.328,249 492.5,249 C491.672,249 491,248.328 491,247.5 C491,246.672 491.672,246 492.5,246 C493.328,246 494,246.672 494,247.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M503.5,211 L502,212 L501.531,214 L498.25,214 C497.696,214 497.384,214.463 497.25,215 L497,216 C496.866,216.537 497.446,217 498,217 L522,217 C522.554,217 523.134,216.537 523,216 L522.75,215 C522.616,214.463 522.304,214 521.75,214 L518.969,214 L518.5,212 L517,211 L516,212 L516.469,214 L504.031,214 L504.5,212 L503.5,211 z M501.5,215 C501.776,215 502,215.224 502,215.5 C502,215.776 501.776,216 501.5,216 C501.224,216 501,215.776 501,215.5 C501,215.224 501.224,215 501.5,215 z M518.5,215 C518.776,215 519,215.224 519,215.5 C519,215.776 518.776,216 518.5,216 C518.224,216 518,215.776 518,215.5 C518,215.224 518.224,215 518.5,215 z M500.562,218 L500.094,220 L497.25,220 C496.696,220 496.384,220.463 496.25,221 L496,222 C495.866,222.537 496.446,223 497,223 L523,223 C523.554,223 524.134,222.537 524,222 L523.75,221 C523.616,220.463 523.304,220 522.75,220 L520.406,220 L519.938,218 L517.438,218 L517.906,220 L502.594,220 L503.062,218 L500.562,218 z M500.5,221 C500.776,221 501,221.224 501,221.5 C501,221.776 500.776,222 500.5,222 C500.224,222 500,221.776 500,221.5 C500,221.224 500.224,221 500.5,221 z M519.5,221 C519.776,221 520,221.224 520,221.5 C520,221.776 519.776,222 519.5,222 C519.224,222 519,221.776 519,221.5 C519,221.224 519.224,221 519.5,221 z M499.156,224 L498.688,226 L496.25,226 C495.696,226 495.384,226.463 495.25,227 L495,228 C494.866,228.537 495.446,229 496,229 L524,229 C524.554,229 525.134,228.537 525,228 L524.75,227 C524.616,226.463 524.304,226 523.75,226 L521.812,226 L521.344,224 L518.844,224 L519.312,226 L501.188,226 L501.656,224 L499.156,224 z M499.5,227 C499.776,227 500,227.224 500,227.5 C500,227.776 499.776,228 499.5,228 C499.224,228 499,227.776 499,227.5 C499,227.224 499.224,227 499.5,227 z M520.5,227 C520.776,227 521,227.224 521,227.5 C521,227.776 520.776,228 520.5,228 C520.224,228 520,227.776 520,227.5 C520,227.224 520.224,227 520.5,227 z M497.719,230 L497,233 L498.5,234 L499.5,233 L500.219,230 L497.719,230 z M520.281,230 L521,233 L522,234 L523.5,233 L522.781,230 L520.281,230 z" fill="#989898"/>
     </symbol>
     <symbol id="route-bus" viewBox="420 200 60 60">
-      <path d="M442,208 L440,210 L440,228 L441,229 L461,229 L462,228 L462,210 L460,208 L442,208 z M447,210 L455,210 L455,212 L447,212 L447,210 z M443,214 L445,214 L457,214 L459,214 L460,215 L460,219 L457,221 L445,221 L442,219 L442,215 L443,214 z M442,224 L445,224 L447,226 L447,227 L443,227 L442,226 L442,224 z M457,224 L460,224 L460,226 L459,227 L455,227 L455,226 L457,224 z" fill="#989898" id="rect5077-9"/>
-      <path d="M441,230 L446,230 L446,232 L445,233 L442,233 L441,232 z" fill="#989898" id="path22279"/>
-      <path d="M456,230 L461,230 L461,232 L460,233 L457,233 L456,232 z" fill="#989898" id="path22281"/>
-      <g id="g22697-4">
-        <g id="g22699-6">
-          <path d="M456.969,245.469 L454.031,249.531 L443.031,241.531 L445.969,237.469 z" fill="#46682F" id="path22701-2"/>
-          <path d="M454.125,245.406 L456.875,249.594 L468.875,241.594 L466.125,237.406 z" fill="#70372F" id="path22703-6"/>
-          <path d="M431.125,245.419 L433.875,249.575 L445.875,241.575 L443.125,237.419 z" fill="#2C5476" id="path22705-7"/>
-        </g>
-        <path d="M456.375,246.281 L454.625,248.719 L443.625,240.719 L445.375,238.281 z" fill="#8CD05F" id="path22709-0"/>
-        <path d="M454.656,246.25 L456.344,248.75 L468.344,240.75 L466.656,238.25 z" fill="#E06D5F" id="path22713-1"/>
-        <path d="M431.656,246.263 L433.344,248.763 L445.344,240.763 L443.656,238.263 z" fill="#58A9ED" id="path22715-7"/>
-        <path d="M470,239.5 C470,240.881 468.881,242 467.5,242 C466.119,242 465,240.881 465,239.5 C465,238.119 466.119,237 467.5,237 C468.881,237 470,238.119 470,239.5 z" fill="#70372F" id="path22717-4"/>
-        <path d="M435,247.5 C435,248.881 433.881,250 432.5,250 C431.119,250 430,248.881 430,247.5 C430,246.119 431.119,245 432.5,245 C433.881,245 435,246.119 435,247.5 z" fill="#2C5476" id="path22719-8"/>
-        <path d="M447,239.5 C447,240.881 445.881,242 444.5,242 C443.119,242 442,240.881 442,239.5 C442,238.119 443.119,237 444.5,237 C445.881,237 447,238.119 447,239.5 z" fill="#395E53" id="path22721-0"/>
-        <path d="M458,247.5 C458,248.881 456.881,250 455.5,250 C454.119,250 453,248.881 453,247.5 C453,246.119 454.119,245 455.5,245 C456.881,245 458,246.119 458,247.5 z" fill="#5B502F" id="path22723-7"/>
-        <path d="M469,239.5 C469,240.328 468.328,241 467.5,241 C466.671,241 466,240.328 466,239.5 C466,238.672 466.671,238 467.5,238 C468.328,238 469,238.672 469,239.5 z" fill="#FFFFFF" id="path22725-7"/>
-        <path d="M457,247.5 C457,248.328 456.328,249 455.5,249 C454.671,249 454,248.328 454,247.5 C454,246.672 454.671,246 455.5,246 C456.328,246 457,246.672 457,247.5 z" fill="#FFFFFF" id="path22727-1"/>
-        <path d="M446,239.5 C446,240.328 445.328,241 444.5,241 C443.672,241 443,240.328 443,239.5 C443,238.672 443.672,238 444.5,238 C445.328,238 446,238.672 446,239.5 z" fill="#FFFFFF" id="path22729-7"/>
-        <path d="M434,247.5 C434,248.328 433.328,249 432.5,249 C431.672,249 431,248.328 431,247.5 C431,246.672 431.672,246 432.5,246 C433.328,246 434,246.672 434,247.5 z" fill="#FFFFFF" id="path22731-4"/>
+      <g>
+        <path d="M456.969,245.469 L454.031,249.531 L443.031,241.531 L445.969,237.469 z" fill="#46682F"/>
+        <path d="M454.125,245.406 L456.875,249.594 L468.875,241.594 L466.125,237.406 z" fill="#70372F"/>
+        <path d="M431.125,245.419 L433.875,249.575 L445.875,241.575 L443.125,237.419 z" fill="#2C5476"/>
+        <path d="M456.375,246.281 L454.625,248.719 L443.625,240.719 L445.375,238.281 z" fill="#8CD05F"/>
+        <path d="M454.656,246.25 L456.344,248.75 L468.344,240.75 L466.656,238.25 z" fill="#E06D5F"/>
+        <path d="M431.656,246.263 L433.344,248.763 L445.344,240.763 L443.656,238.263 z" fill="#58A9ED"/>
+        <path d="M470,239.5 C470,240.881 468.881,242 467.5,242 C466.119,242 465,240.881 465,239.5 C465,238.119 466.119,237 467.5,237 C468.881,237 470,238.119 470,239.5 z" fill="#70372F"/>
+        <path d="M435,247.5 C435,248.881 433.881,250 432.5,250 C431.119,250 430,248.881 430,247.5 C430,246.119 431.119,245 432.5,245 C433.881,245 435,246.119 435,247.5 z" fill="#2C5476"/>
+        <path d="M447,239.5 C447,240.881 445.881,242 444.5,242 C443.119,242 442,240.881 442,239.5 C442,238.119 443.119,237 444.5,237 C445.881,237 447,238.119 447,239.5 z" fill="#395E53"/>
+        <path d="M458,247.5 C458,248.881 456.881,250 455.5,250 C454.119,250 453,248.881 453,247.5 C453,246.119 454.119,245 455.5,245 C456.881,245 458,246.119 458,247.5 z" fill="#5B502F"/>
+        <path d="M469,239.5 C469,240.328 468.328,241 467.5,241 C466.671,241 466,240.328 466,239.5 C466,238.672 466.671,238 467.5,238 C468.328,238 469,238.672 469,239.5 z" fill="#FFFFFF"/>
+        <path d="M457,247.5 C457,248.328 456.328,249 455.5,249 C454.671,249 454,248.328 454,247.5 C454,246.672 454.671,246 455.5,246 C456.328,246 457,246.672 457,247.5 z" fill="#FFFFFF"/>
+        <path d="M446,239.5 C446,240.328 445.328,241 444.5,241 C443.672,241 443,240.328 443,239.5 C443,238.672 443.672,238 444.5,238 C445.328,238 446,238.672 446,239.5 z" fill="#FFFFFF"/>
+        <path d="M434,247.5 C434,248.328 433.328,249 432.5,249 C431.672,249 431,248.328 431,247.5 C431,246.672 431.672,246 432.5,246 C433.328,246 434,246.672 434,247.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M444.167,208 C441.894,208 439.167,209.239 439.167,212.577 L439.167,221.665 L439.167,228 C439.167,228 439.167,229.667 440.833,229.667 L440.833,231.333 C440.833,231.333 440.833,233 442.5,233 C444.167,233 444.167,231.333 444.167,231.333 L444.167,229.667 L455.833,229.667 L455.833,231.333 C455.833,231.333 455.833,233 457.5,233 C459.167,233 459.167,231.333 459.167,231.333 L459.167,229.667 C459.167,229.667 460.833,229.667 460.833,228 L460.833,212.577 C460.833,209.168 458.773,208 456.501,208 L444.167,208 z M444.583,210.5 L455.417,210.5 C455.647,210.5 455.833,210.686 455.833,210.917 C455.833,211.148 455.647,211.333 455.417,211.333 L444.583,211.333 C444.352,211.333 444.167,211.148 444.167,210.917 C444.167,210.686 444.352,210.5 444.583,210.5 z M442.5,213 L457.5,213 C459.167,213 459.167,214.611 459.167,214.611 L459.167,219.667 C459.167,219.667 459.167,221.333 457.5,221.333 L442.5,221.333 C440.833,221.333 440.833,219.667 440.833,219.667 L440.833,214.667 C440.833,214.667 440.833,213 442.5,213 z M442.5,224.667 C443.42,224.667 444.167,225.413 444.167,226.333 C444.167,227.254 443.42,228 442.5,228 C441.579,228 440.833,227.254 440.833,226.333 C440.833,225.413 441.579,224.667 442.5,224.667 z M457.5,224.667 C458.42,224.667 459.167,225.413 459.167,226.333 C459.167,227.254 458.42,228 457.5,228 C456.579,228 455.833,227.254 455.833,226.333 C455.833,225.413 456.579,224.667 457.5,224.667 z" fill="#989898"/>
     </symbol>
     <symbol id="route-horse" viewBox="360 200 60 60">
-      <g id="g22697-52">
-        <g id="g22699-662">
-          <path d="M396.969,245.469 L394.031,249.531 L383.031,241.531 L385.969,237.469 z" fill="#46682F" id="path22701-42"/>
-          <path d="M394.125,245.406 L396.875,249.594 L408.875,241.594 L406.125,237.406 z" fill="#70372F" id="path22703-52"/>
-          <path d="M371.125,245.419 L373.875,249.575 L385.875,241.575 L383.125,237.419 z" fill="#2C5476" id="path22705-62"/>
-        </g>
-        <path d="M396.375,246.281 L394.625,248.719 L383.625,240.719 L385.375,238.281 z" fill="#8CD05F" id="path22709-32"/>
-        <path d="M394.656,246.25 L396.344,248.75 L408.344,240.75 L406.656,238.25 z" fill="#E06D5F" id="path22713-92"/>
-        <path d="M371.656,246.263 L373.344,248.763 L385.344,240.763 L383.656,238.263 z" fill="#58A9ED" id="path22715-22"/>
-        <path d="M410,239.5 C410,240.881 408.881,242 407.5,242 C406.119,242 405,240.881 405,239.5 C405,238.119 406.119,237 407.5,237 C408.881,237 410,238.119 410,239.5 z" fill="#70372F" id="path22717-92"/>
-        <path d="M375,247.5 C375,248.881 373.881,250 372.5,250 C371.119,250 370,248.881 370,247.5 C370,246.119 371.119,245 372.5,245 C373.881,245 375,246.119 375,247.5 z" fill="#2C5476" id="path22719-52"/>
-        <path d="M387,239.5 C387,240.881 385.881,242 384.5,242 C383.119,242 382,240.881 382,239.5 C382,238.119 383.119,237 384.5,237 C385.881,237 387,238.119 387,239.5 z" fill="#395E53" id="path22721-82"/>
-        <path d="M398,247.5 C398,248.881 396.881,250 395.5,250 C394.119,250 393,248.881 393,247.5 C393,246.119 394.119,245 395.5,245 C396.881,245 398,246.119 398,247.5 z" fill="#5B502F" id="path22723-12"/>
-        <path d="M409,239.5 C409,240.328 408.328,241 407.5,241 C406.672,241 406,240.328 406,239.5 C406,238.672 406.672,238 407.5,238 C408.328,238 409,238.672 409,239.5 z" fill="#FFFFFF" id="path22725-42"/>
-        <path d="M397,247.5 C397,248.328 396.328,249 395.5,249 C394.672,249 394,248.328 394,247.5 C394,246.672 394.672,246 395.5,246 C396.328,246 397,246.672 397,247.5 z" fill="#FFFFFF" id="path22727-182"/>
-        <path d="M386,239.5 C386,240.328 385.328,241 384.5,241 C383.672,241 383,240.328 383,239.5 C383,238.672 383.672,238 384.5,238 C385.328,238 386,238.672 386,239.5 z" fill="#FFFFFF" id="path22729-22"/>
-        <path d="M374,247.5 C374,248.328 373.328,249 372.5,249 C371.672,249 371,248.328 371,247.5 C371,246.672 371.672,246 372.5,246 C373.328,246 374,246.672 374,247.5 z" fill="#FFFFFF" id="path22731-432"/>
-      </g>
-      <path d="M387.5,204 C386.119,204 385,205.119 385,206.5 C385,207.881 386.119,209 387.5,209 C388.881,209 390,207.881 390,206.5 C390,205.119 388.881,204 387.5,204 z M401,207.156 L398,211 L393.719,216 L393,216 L391,216 L390,215.656 L390,211 C390,210.446 389.554,210 389,210 L386,210 C385.446,210 385,210.446 385,211 L385,215 L383,215 L379,215 L375,219 L374,225 L376,225 L377,223 L378,220 L379,218.656 L379,222.156 L377,226.5 L377,232 C377,233 377,234 378.5,234 C380,234 380,233 380,232 L380,226.5 L381.156,224 L383,224 L383,226.5 L385.5,232.5 C385.751,233.435 386.405,234 387.25,234 C388.059,234 388.346,233.124 388,232 L386,226.5 L386,224.188 L389,225 L393,225 L393,232 C393,232.5 393,234 394.5,234 C396,234 396,232.5 396,232 L396,225 L401,216 L403,216 L405,217 L406,216 L406,214 L402,211 L401,211 z M385,216 L388,216 L391,219 L391,223 L390,224 L389,223 L389,220 L385,217 z" fill="currentColor" id="route-horse-stroke"/>
+      <g>
+        <path d="M396.969,245.469 L394.031,249.531 L383.031,241.531 L385.969,237.469 z" fill="#46682F"/>
+        <path d="M394.125,245.406 L396.875,249.594 L408.875,241.594 L406.125,237.406 z" fill="#70372F"/>
+        <path d="M371.125,245.419 L373.875,249.575 L385.875,241.575 L383.125,237.419 z" fill="#2C5476"/>
+        <path d="M396.375,246.281 L394.625,248.719 L383.625,240.719 L385.375,238.281 z" fill="#8CD05F"/>
+        <path d="M394.656,246.25 L396.344,248.75 L408.344,240.75 L406.656,238.25 z" fill="#E06D5F"/>
+        <path d="M371.656,246.263 L373.344,248.763 L385.344,240.763 L383.656,238.263 z" fill="#58A9ED"/>
+        <path d="M410,239.5 C410,240.881 408.881,242 407.5,242 C406.119,242 405,240.881 405,239.5 C405,238.119 406.119,237 407.5,237 C408.881,237 410,238.119 410,239.5 z" fill="#70372F"/>
+        <path d="M375,247.5 C375,248.881 373.881,250 372.5,250 C371.119,250 370,248.881 370,247.5 C370,246.119 371.119,245 372.5,245 C373.881,245 375,246.119 375,247.5 z" fill="#2C5476"/>
+        <path d="M387,239.5 C387,240.881 385.881,242 384.5,242 C383.119,242 382,240.881 382,239.5 C382,238.119 383.119,237 384.5,237 C385.881,237 387,238.119 387,239.5 z" fill="#395E53"/>
+        <path d="M398,247.5 C398,248.881 396.881,250 395.5,250 C394.119,250 393,248.881 393,247.5 C393,246.119 394.119,245 395.5,245 C396.881,245 398,246.119 398,247.5 z" fill="#5B502F"/>
+        <path d="M409,239.5 C409,240.328 408.328,241 407.5,241 C406.672,241 406,240.328 406,239.5 C406,238.672 406.672,238 407.5,238 C408.328,238 409,238.672 409,239.5 z" fill="#FFFFFF"/>
+        <path d="M397,247.5 C397,248.328 396.328,249 395.5,249 C394.672,249 394,248.328 394,247.5 C394,246.672 394.672,246 395.5,246 C396.328,246 397,246.672 397,247.5 z" fill="#FFFFFF"/>
+        <path d="M386,239.5 C386,240.328 385.328,241 384.5,241 C383.672,241 383,240.328 383,239.5 C383,238.672 383.672,238 384.5,238 C385.328,238 386,238.672 386,239.5 z" fill="#FFFFFF"/>
+        <path d="M374,247.5 C374,248.328 373.328,249 372.5,249 C371.672,249 371,248.328 371,247.5 C371,246.672 371.672,246 372.5,246 C373.328,246 374,246.672 374,247.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M387.5,205 C386.119,205 385,206.119 385,207.5 C385,208.881 386.119,210 387.5,210 C388.881,210 390,208.881 390,207.5 C390,206.119 388.881,205 387.5,205 z M401,208.156 L398,212 L393.719,217 L393,217 L391,217 L390,216.656 L390,212 C390,211.446 389.554,211 389,211 L386,211 C385.446,211 385,211.446 385,212 L385,216 L383,216 L379,216 L375,220 L374,226 L376,226 L377,224 L378,221 L379,219.656 L379,223.156 L377,227.5 L377,233 C377,234 377,235 378.5,235 C380,235 380,234 380,233 L380,227.5 L381.156,225 L383,225 L383,227.5 L385.5,233.5 C385.751,234.435 386.405,235 387.25,235 C388.059,235 388.346,234.124 388,233 L386,227.5 L386,225.188 L389,226 L393,226 L393,233 C393,233.5 393,235 394.5,235 C396,235 396,233.5 396,233 L396,226 L401,217 L403,217 L405,218 L406,217 L406,215 L402,212 L401,212 z M385,217 L388,217 L391,220 L391,224 L390,225 L389,224 L389,221 L385,218 z" fill="currentColor" id="route-horse-stroke"/>
     </symbol>
     <symbol id="route-foot" viewBox="300 200 60 60">
-      <g id="g22697-5">
-        <g id="g22699-66">
-          <path d="M336.969,245.469 L334.031,249.531 L323.031,241.531 L325.969,237.469 z" fill="#46682F" id="path22701-4"/>
-          <path d="M334.125,245.406 L336.875,249.594 L348.875,241.594 L346.125,237.406 z" fill="#70372F" id="path22703-5"/>
-          <path d="M311.125,245.419 L313.875,249.575 L325.875,241.575 L323.125,237.419 z" fill="#2C5476" id="path22705-6"/>
-        </g>
-        <path d="M336.375,246.281 L334.625,248.719 L323.625,240.719 L325.375,238.281 z" fill="#8CD05F" id="path22709-3"/>
-        <path d="M334.656,246.25 L336.344,248.75 L348.344,240.75 L346.656,238.25 z" fill="#E06D5F" id="path22713-9"/>
-        <path d="M311.656,246.263 L313.344,248.763 L325.344,240.763 L323.656,238.263 z" fill="#58A9ED" id="path22715-2"/>
-        <path d="M350,239.5 C350,240.881 348.881,242 347.5,242 C346.119,242 345,240.881 345,239.5 C345,238.119 346.119,237 347.5,237 C348.881,237 350,238.119 350,239.5 z" fill="#70372F" id="path22717-9"/>
-        <path d="M315,247.5 C315,248.881 313.881,250 312.5,250 C311.119,250 310,248.881 310,247.5 C310,246.119 311.119,245 312.5,245 C313.881,245 315,246.119 315,247.5 z" fill="#2C5476" id="path22719-5"/>
-        <path d="M327,239.5 C327,240.881 325.881,242 324.5,242 C323.119,242 322,240.881 322,239.5 C322,238.119 323.119,237 324.5,237 C325.881,237 327,238.119 327,239.5 z" fill="#395E53" id="path22721-8"/>
-        <path d="M338,247.5 C338,248.881 336.881,250 335.5,250 C334.119,250 333,248.881 333,247.5 C333,246.119 334.119,245 335.5,245 C336.881,245 338,246.119 338,247.5 z" fill="#5B502F" id="path22723-1"/>
-        <path d="M349,239.5 C349,240.328 348.328,241 347.5,241 C346.672,241 346,240.328 346,239.5 C346,238.672 346.672,238 347.5,238 C348.328,238 349,238.672 349,239.5 z" fill="#FFFFFF" id="path22725-4"/>
-        <path d="M337,247.5 C337,248.328 336.328,249 335.5,249 C334.672,249 334,248.328 334,247.5 C334,246.672 334.672,246 335.5,246 C336.328,246 337,246.672 337,247.5 z" fill="#FFFFFF" id="path22727-18"/>
-        <path d="M326,239.5 C326,240.328 325.328,241 324.5,241 C323.672,241 323,240.328 323,239.5 C323,238.672 323.672,238 324.5,238 C325.328,238 326,238.672 326,239.5 z" fill="#FFFFFF" id="path22729-2"/>
-        <path d="M314,247.5 C314,248.328 313.328,249 312.5,249 C311.672,249 311,248.328 311,247.5 C311,246.672 311.672,246 312.5,246 C313.328,246 314,246.672 314,247.5 z" fill="#FFFFFF" id="path22731-43"/>
+      <g>
+        <path d="M336.969,245.469 L334.031,249.531 L323.031,241.531 L325.969,237.469 z" fill="#46682F"/>
+        <path d="M334.125,245.406 L336.875,249.594 L348.875,241.594 L346.125,237.406 z" fill="#70372F"/>
+        <path d="M311,245.419 L313.75,249.575 L325.75,241.575 L323,237.419 z" fill="#2C5476"/>
+        <path d="M336.375,246.281 L334.625,248.719 L323.625,240.719 L325.375,238.281 z" fill="#8CD05F"/>
+        <path d="M334.656,246.25 L336.344,248.75 L348.344,240.75 L346.656,238.25 z" fill="#E06D5F"/>
+        <path d="M311.656,246.263 L313.344,248.763 L325.344,240.763 L323.656,238.263 z" fill="#58A9ED"/>
+        <path d="M350,239.5 C350,240.881 348.881,242 347.5,242 C346.119,242 345,240.881 345,239.5 C345,238.119 346.119,237 347.5,237 C348.881,237 350,238.119 350,239.5 z" fill="#70372F"/>
+        <path d="M315,247.5 C315,248.881 313.881,250 312.5,250 C311.119,250 310,248.881 310,247.5 C310,246.119 311.119,245 312.5,245 C313.881,245 315,246.119 315,247.5 z" fill="#2C5476"/>
+        <path d="M327,239.5 C327,240.881 325.881,242 324.5,242 C323.119,242 322,240.881 322,239.5 C322,238.119 323.119,237 324.5,237 C325.881,237 327,238.119 327,239.5 z" fill="#395E53"/>
+        <path d="M338,247.5 C338,248.881 336.881,250 335.5,250 C334.119,250 333,248.881 333,247.5 C333,246.119 334.119,245 335.5,245 C336.881,245 338,246.119 338,247.5 z" fill="#5B502F"/>
+        <path d="M349,239.5 C349,240.328 348.328,241 347.5,241 C346.672,241 346,240.328 346,239.5 C346,238.672 346.672,238 347.5,238 C348.328,238 349,238.672 349,239.5 z" fill="#FFFFFF"/>
+        <path d="M337,247.5 C337,248.328 336.328,249 335.5,249 C334.672,249 334,248.328 334,247.5 C334,246.672 334.672,246 335.5,246 C336.328,246 337,246.672 337,247.5 z" fill="#FFFFFF"/>
+        <path d="M326,239.5 C326,240.328 325.328,241 324.5,241 C323.672,241 323,240.328 323,239.5 C323,238.672 323.672,238 324.5,238 C325.328,238 326,238.672 326,239.5 z" fill="#FFFFFF"/>
+        <path d="M314,247.5 C314,248.328 313.328,249 312.5,249 C311.672,249 311,248.328 311,247.5 C311,246.672 311.672,246 312.5,246 C313.328,246 314,246.672 314,247.5 z" fill="#FFFFFF"/>
       </g>
       <path d="M332,212.5 C332,213.881 330.881,215 329.5,215 C328.119,215 327,213.881 327,212.5 C327,211.119 328.119,210 329.5,210 C330.881,210 332,211.119 332,212.5 z M327,216 L328,216 L328.5,216 L337,222.5 L337,224 L336,224 L331,220.125 L331,224 L333,228 L335,233 L334,234 L333,234 L331,229 L327,223 L327,218.344 L324.5,220.5 L322.5,224 L321,224 L321,223 L322.5,220 L327,216 z M327.844,226.406 L325.531,234 L324.5,234 L323.5,233 L326.312,224.562 z" fill="currentColor" id="route-foot-stroke"/>
     </symbol>
     <symbol id="route-bicycle" viewBox="240 200 60 60">
-      <g id="g22697">
-        <g id="g22699">
-          <path d="M276.974,245.469 L274.036,249.531 L263.036,241.531 L265.974,237.469 z" fill="#46682F" id="path22701"/>
-          <path d="M274.13,245.406 L276.88,249.594 L288.88,241.594 L286.13,237.406 z" fill="#70372F" id="path22703"/>
-          <path d="M251.13,245.419 L253.88,249.575 L265.88,241.575 L263.13,237.419 z" fill="#2C5476" id="path22705"/>
-        </g>
-        <path d="M276.38,246.281 L274.63,248.719 L263.63,240.719 L265.38,238.281 z" fill="#8CD05F" id="path22709"/>
-        <path d="M274.661,246.25 L276.349,248.75 L288.349,240.75 L286.661,238.25 z" fill="#E06D5F" id="path22713"/>
-        <path d="M251.661,246.263 L253.349,248.763 L265.349,240.763 L263.661,238.263 z" fill="#58A9ED" id="path22715"/>
-        <path d="M290.005,239.5 C290.005,240.881 288.886,242 287.505,242 C286.124,242 285.005,240.881 285.005,239.5 C285.005,238.119 286.124,237 287.505,237 C288.886,237 290.005,238.119 290.005,239.5 z" fill="#70372F" id="path22717"/>
-        <path d="M255.005,247.5 C255.005,248.881 253.886,250 252.505,250 C251.124,250 250.005,248.881 250.005,247.5 C250.005,246.119 251.124,245 252.505,245 C253.886,245 255.005,246.119 255.005,247.5 z" fill="#2C5476" id="path22719"/>
-        <path d="M267.005,239.5 C267.005,240.881 265.886,242 264.505,242 C263.124,242 262.005,240.881 262.005,239.5 C262.005,238.119 263.124,237 264.505,237 C265.886,237 267.005,238.119 267.005,239.5 z" fill="#395E53" id="path22721"/>
-        <path d="M278.005,247.5 C278.005,248.881 276.886,250 275.505,250 C274.124,250 273.005,248.881 273.005,247.5 C273.005,246.119 274.124,245 275.505,245 C276.886,245 278.005,246.119 278.005,247.5 z" fill="#5B502F" id="path22723"/>
-        <path d="M289.005,239.5 C289.005,240.328 288.333,241 287.505,241 C286.676,241 286.005,240.328 286.005,239.5 C286.005,238.672 286.676,238 287.505,238 C288.333,238 289.005,238.672 289.005,239.5 z" fill="#FFFFFF" id="path22725"/>
-        <path d="M277.005,247.5 C277.005,248.328 276.333,249 275.505,249 C274.676,249 274.005,248.328 274.005,247.5 C274.005,246.672 274.676,246 275.505,246 C276.333,246 277.005,246.672 277.005,247.5 z" fill="#FFFFFF" id="path22727"/>
-        <path d="M266.005,239.5 C266.005,240.328 265.333,241 264.505,241 C263.677,241 263.005,240.328 263.005,239.5 C263.005,238.672 263.677,238 264.505,238 C265.333,238 266.005,238.672 266.005,239.5 z" fill="#FFFFFF" id="path22729"/>
-        <path d="M254.005,247.5 C254.005,248.328 253.333,249 252.505,249 C251.677,249 251.005,248.328 251.005,247.5 C251.005,246.672 251.677,246 252.505,246 C253.333,246 254.005,246.672 254.005,247.5 z" fill="#FFFFFF" id="path22731"/>
-      </g>
-      <path d="M262.599,211 L262.599,213 L263.443,213 L264.005,216 L261.505,216 L256.005,226 L256.005,227 L257.005,228 L268.005,228 L275.568,218.531 L279.505,227 L280.005,227 L281.005,227 L281.005,226 L275.005,213 L278.005,213 L278.005,212 L277.005,211 L273.005,211 L273.005,213 L274.411,216 L266.068,216 L265.505,213 L267.599,213 L267.599,212 L266.599,211 L262.599,211 z M262.505,218 L264.505,218 L266.505,226 L258.005,226 L262.505,218 z M266.505,218 L273.505,218 L268.005,224.5 L266.505,218 z M257.505,220 C253.915,220 251.005,222.91 251.005,226.5 C251.005,230.09 253.915,233 257.505,233 C260.208,233 262.525,231.347 263.505,229 L261.255,229 C260.449,230.216 259.073,231 257.505,231 C255.02,231 253.005,228.985 253.005,226.5 C253.005,224.176 254.775,222.301 257.036,222.062 L258.161,220.031 C257.943,220.009 257.73,220 257.505,220 z M279.349,220 L280.286,222.094 C282.397,222.466 284.005,224.283 284.005,226.5 C284.005,228.985 281.99,231 279.505,231 C277.02,231 275.005,228.985 275.005,226.5 C275.005,225.126 275.628,223.919 276.599,223.094 L275.724,221.219 C274.082,222.398 273.005,224.324 273.005,226.5 C273.005,230.09 275.915,233 279.505,233 C283.095,233 286.005,230.09 286.005,226.5 C286.005,222.91 283.095,220 279.505,220 C279.452,220 279.402,219.999 279.349,220 z M261.692,221.531 L260.692,223.312 C261.159,223.779 261.497,224.366 261.724,225 L263.817,225 C263.493,223.628 262.733,222.413 261.692,221.531 z" fill="currentColor" id="route-bicycle-stroke"/>
+      <g>
+        <path d="M276.974,245.469 L274.036,249.531 L263.036,241.531 L265.974,237.469 z" fill="#46682F"/>
+        <path d="M274.13,245.406 L276.88,249.594 L288.88,241.594 L286.13,237.406 z" fill="#70372F"/>
+        <path d="M251.13,245.419 L253.88,249.575 L265.88,241.575 L263.13,237.419 z" fill="#2C5476"/>
+        <path d="M276.38,246.281 L274.63,248.719 L263.63,240.719 L265.38,238.281 z" fill="#8CD05F"/>
+        <path d="M274.661,246.25 L276.349,248.75 L288.349,240.75 L286.661,238.25 z" fill="#E06D5F"/>
+        <path d="M251.661,246.263 L253.349,248.763 L265.349,240.763 L263.661,238.263 z" fill="#58A9ED"/>
+        <path d="M290.005,239.5 C290.005,240.881 288.886,242 287.505,242 C286.124,242 285.005,240.881 285.005,239.5 C285.005,238.119 286.124,237 287.505,237 C288.886,237 290.005,238.119 290.005,239.5 z" fill="#70372F"/>
+        <path d="M255.005,247.5 C255.005,248.881 253.886,250 252.505,250 C251.124,250 250.005,248.881 250.005,247.5 C250.005,246.119 251.124,245 252.505,245 C253.886,245 255.005,246.119 255.005,247.5 z" fill="#2C5476"/>
+        <path d="M267.005,239.5 C267.005,240.881 265.886,242 264.505,242 C263.124,242 262.005,240.881 262.005,239.5 C262.005,238.119 263.124,237 264.505,237 C265.886,237 267.005,238.119 267.005,239.5 z" fill="#395E53"/>
+        <path d="M278.005,247.5 C278.005,248.881 276.886,250 275.505,250 C274.124,250 273.005,248.881 273.005,247.5 C273.005,246.119 274.124,245 275.505,245 C276.886,245 278.005,246.119 278.005,247.5 z" fill="#5B502F"/>
+        <path d="M289.005,239.5 C289.005,240.328 288.333,241 287.505,241 C286.676,241 286.005,240.328 286.005,239.5 C286.005,238.672 286.676,238 287.505,238 C288.333,238 289.005,238.672 289.005,239.5 z" fill="#FFFFFF"/>
+        <path d="M277.005,247.5 C277.005,248.328 276.333,249 275.505,249 C274.676,249 274.005,248.328 274.005,247.5 C274.005,246.672 274.676,246 275.505,246 C276.333,246 277.005,246.672 277.005,247.5 z" fill="#FFFFFF"/>
+        <path d="M266.005,239.5 C266.005,240.328 265.333,241 264.505,241 C263.677,241 263.005,240.328 263.005,239.5 C263.005,238.672 263.677,238 264.505,238 C265.333,238 266.005,238.672 266.005,239.5 z" fill="#FFFFFF"/>
+        <path d="M254.005,247.5 C254.005,248.328 253.333,249 252.505,249 C251.677,249 251.005,248.328 251.005,247.5 C251.005,246.672 251.677,246 252.505,246 C253.333,246 254.005,246.672 254.005,247.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M262.594,211 L262.594,213 L263.438,213 L264,216 L261.5,216 L256,226 L256,227 L257,228 L268,228 L275.563,218.531 L279.5,227 L280,227 L281,227 L281,226 L275,213 L278,213 L278,212 L277,211 L273,211 L273,213 L274.406,216 L266.063,216 L265.5,213 L267.594,213 L267.594,212 L266.594,211 L262.594,211 z M262.5,218 L264.5,218 L266.5,226 L258,226 L262.5,218 z M266.5,218 L273.5,218 L268,224.5 L266.5,218 z M257.5,220 C253.91,220 251,222.91 251,226.5 C251,230.09 253.91,233 257.5,233 C260.203,233 262.52,231.347 263.5,229 L261.25,229 C260.444,230.216 259.068,231 257.5,231 C255.015,231 253,228.985 253,226.5 C253,224.176 254.77,222.301 257.031,222.062 L258.156,220.031 C257.938,220.009 257.725,220 257.5,220 z M279.344,220 L280.281,222.094 C282.392,222.466 284,224.283 284,226.5 C284,228.985 281.985,231 279.5,231 C277.015,231 275,228.985 275,226.5 C275,225.126 275.623,223.919 276.594,223.094 L275.719,221.219 C274.077,222.398 273,224.324 273,226.5 C273,230.09 275.91,233 279.5,233 C283.09,233 286,230.09 286,226.5 C286,222.91 283.09,220 279.5,220 C279.447,220 279.397,219.999 279.344,220 z M261.688,221.531 L260.688,223.312 C261.154,223.779 261.492,224.366 261.719,225 L263.812,225 C263.488,223.628 262.728,222.413 261.688,221.531 z" fill="currentColor" id="route-bicycle-stroke"/>
     </symbol>
     <symbol id="route-road" viewBox="180 200 60 60">
-      <path d="M202.5,212 L199.625,218 L198,218 L197,219 L197,221 L198.406,221 L198,222 L198,227 L198,228 L198,228 C198,228 198.608,228.608 199,229 L200,229 L204,229 L206,230 L214,230 L216,229 L220,229 L221,229 L222,228 L222,228 L222,227 L222,222 L221.594,221 L223,221 L223,219 L222,218 L220.375,218 L217.5,212 z M203.5,215 L216.5,215 L218,219 L217,220 L203,220 L202,219 z M201,223 L204,223 L205,225 L205,226 L201,226 L200,225 L200,224 z M216,223 L219,223 L220,224 L220,225 L219,226 L215,226 L215,225 z M199,230 L199,232 L200,233 L203,233 L204,232 L204,230 z M216,230 L216,232 L217,233 L220,233 L221,232 L221,230 z" fill="#989898" id="path21794"/>
-      <g id="g21796">
-        <g id="g21798">
-          <path d="M216.969,245.469 L214.031,249.531 L203.031,241.531 L205.969,237.469 z" fill="#46682F" id="path21800"/>
-          <path d="M214.125,245.406 L216.875,249.594 L228.875,241.594 L226.125,237.406 z" fill="#70372F" id="path21802"/>
-          <path d="M191.125,245.419 L193.875,249.575 L205.875,241.575 L203.125,237.419 z" fill="#2C5476" id="path21804"/>
-        </g>
-        <path d="M216.375,246.281 L214.625,248.719 L203.625,240.719 L205.375,238.281 z" fill="#8CD05F" id="path21808"/>
-        <path d="M214.656,246.25 L216.344,248.75 L228.344,240.75 L226.656,238.25 z" fill="#E06D5F" id="path21812"/>
-        <path d="M191.656,246.263 L193.344,248.763 L205.344,240.763 L203.656,238.263 z" fill="#58A9ED" id="path21814"/>
-        <path d="M230,239.5 C230,240.881 228.881,242 227.5,242 C226.119,242 225,240.881 225,239.5 C225,238.119 226.119,237 227.5,237 C228.881,237 230,238.119 230,239.5 z" fill="#70372F" id="path21816"/>
-        <path d="M195,247.5 C195,248.881 193.881,250 192.5,250 C191.119,250 190,248.881 190,247.5 C190,246.119 191.119,245 192.5,245 C193.881,245 195,246.119 195,247.5 z" fill="#2C5476" id="path21818"/>
-        <path d="M207,239.5 C207,240.881 205.881,242 204.5,242 C203.119,242 202,240.881 202,239.5 C202,238.119 203.119,237 204.5,237 C205.881,237 207,238.119 207,239.5 z" fill="#395E53" id="path21820"/>
-        <path d="M218,247.5 C218,248.881 216.881,250 215.5,250 C214.119,250 213,248.881 213,247.5 C213,246.119 214.119,245 215.5,245 C216.881,245 218,246.119 218,247.5 z" fill="#5B502F" id="path21822"/>
-        <path d="M229,239.5 C229,240.328 228.328,241 227.5,241 C226.672,241 226,240.328 226,239.5 C226,238.672 226.672,238 227.5,238 C228.328,238 229,238.672 229,239.5 z" fill="#FFFFFF" id="path21824"/>
-        <path d="M217,247.5 C217,248.328 216.328,249 215.5,249 C214.672,249 214,248.328 214,247.5 C214,246.672 214.672,246 215.5,246 C216.328,246 217,246.672 217,247.5 z" fill="#FFFFFF" id="path21826"/>
-        <path d="M206,239.5 C206,240.328 205.328,241 204.5,241 C203.672,241 203,240.328 203,239.5 C203,238.672 203.672,238 204.5,238 C205.328,238 206,238.672 206,239.5 z" fill="#FFFFFF" id="path21828"/>
-        <path d="M194,247.5 C194,248.328 193.328,249 192.5,249 C191.672,249 191,248.328 191,247.5 C191,246.672 191.672,246 192.5,246 C193.328,246 194,246.672 194,247.5 z" fill="#FFFFFF" id="path21830"/>
+      <g>
+        <path d="M216.969,245.469 L214.031,249.531 L203.031,241.531 L205.969,237.469 z" fill="#46682F"/>
+        <path d="M214.125,245.406 L216.875,249.594 L228.875,241.594 L226.125,237.406 z" fill="#70372F"/>
+        <path d="M191.125,245.419 L193.875,249.575 L205.875,241.575 L203.125,237.419 z" fill="#2C5476"/>
+        <path d="M216.375,246.281 L214.625,248.719 L203.625,240.719 L205.375,238.281 z" fill="#8CD05F"/>
+        <path d="M214.656,246.25 L216.344,248.75 L228.344,240.75 L226.656,238.25 z" fill="#E06D5F"/>
+        <path d="M191.656,246.263 L193.344,248.763 L205.344,240.763 L203.656,238.263 z" fill="#58A9ED"/>
+        <path d="M230,239.5 C230,240.881 228.881,242 227.5,242 C226.119,242 225,240.881 225,239.5 C225,238.119 226.119,237 227.5,237 C228.881,237 230,238.119 230,239.5 z" fill="#70372F"/>
+        <path d="M195,247.5 C195,248.881 193.881,250 192.5,250 C191.119,250 190,248.881 190,247.5 C190,246.119 191.119,245 192.5,245 C193.881,245 195,246.119 195,247.5 z" fill="#2C5476"/>
+        <path d="M207,239.5 C207,240.881 205.881,242 204.5,242 C203.119,242 202,240.881 202,239.5 C202,238.119 203.119,237 204.5,237 C205.881,237 207,238.119 207,239.5 z" fill="#395E53"/>
+        <path d="M218,247.5 C218,248.881 216.881,250 215.5,250 C214.119,250 213,248.881 213,247.5 C213,246.119 214.119,245 215.5,245 C216.881,245 218,246.119 218,247.5 z" fill="#5B502F"/>
+        <path d="M229,239.5 C229,240.328 228.328,241 227.5,241 C226.672,241 226,240.328 226,239.5 C226,238.672 226.672,238 227.5,238 C228.328,238 229,238.672 229,239.5 z" fill="#FFFFFF"/>
+        <path d="M217,247.5 C217,248.328 216.328,249 215.5,249 C214.672,249 214,248.328 214,247.5 C214,246.672 214.672,246 215.5,246 C216.328,246 217,246.672 217,247.5 z" fill="#FFFFFF"/>
+        <path d="M206,239.5 C206,240.328 205.328,241 204.5,241 C203.672,241 203,240.328 203,239.5 C203,238.672 203.672,238 204.5,238 C205.328,238 206,238.672 206,239.5 z" fill="#FFFFFF"/>
+        <path d="M194,247.5 C194,248.328 193.328,249 192.5,249 C191.672,249 191,248.328 191,247.5 C191,246.672 191.672,246 192.5,246 C193.328,246 194,246.672 194,247.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M202.5,212 L199.625,218 L198,218 L197,219 L197,221 L198.406,221 L198,222 L198,227 L198,228 L198,228 C198,228 198.608,228.608 199,229 L200,229 L204,229 L206,230 L214,230 L216,229 L220,229 L221,229 L222,228 L222,228 L222,227 L222,222 L221.594,221 L223,221 L223,219 L222,218 L220.375,218 L217.5,212 z M203.5,215 L216.5,215 L218,219 L217,220 L203,220 L202,219 z M201,223 L204,223 L205,225 L205,226 L201,226 L200,225 L200,224 z M216,223 L219,223 L220,224 L220,225 L219,226 L215,226 L215,225 z M199,230 L199,232 L200,233 L203,233 L204,232 L204,230 z M216,230 L216,232 L217,233 L220,233 L221,232 L221,230 z" fill="#989898"/>
     </symbol>
     <symbol id="route" viewBox="120 200 60 60">
-      <g id="g21796-6">
-        <g id="g21798-3">
-          <path d="M156.969,232.469 L154.031,236.531 L143.031,228.531 L145.969,224.469 z" fill="#46682F" id="path21800-1"/>
-          <path d="M154.125,232.406 L156.875,236.594 L168.875,228.594 L166.125,224.406 z" fill="#70372F" id="path21802-6"/>
-          <path d="M131.125,232.419 L133.875,236.575 L145.875,228.575 L143.125,224.419 z" fill="#2C5476" id="path21804-1"/>
-        </g>
-        <path d="M156.375,233.281 L154.625,235.719 L143.625,227.719 L145.375,225.281 z" fill="#8CD05F" id="path21808-4"/>
-        <path d="M154.656,233.25 L156.344,235.75 L168.344,227.75 L166.656,225.25 z" fill="#E06D5F" id="path21812-6"/>
-        <path d="M131.656,233.263 L133.344,235.763 L145.344,227.763 L143.656,225.263 z" fill="#58A9ED" id="path21814-3"/>
-        <path d="M170,226.5 C170,227.881 168.881,229 167.5,229 C166.119,229 165,227.881 165,226.5 C165,225.119 166.119,224 167.5,224 C168.881,224 170,225.119 170,226.5 z" fill="#70372F" id="path21816-0"/>
-        <path d="M135,234.5 C135,235.881 133.881,237 132.5,237 C131.119,237 130,235.881 130,234.5 C130,233.119 131.119,232 132.5,232 C133.881,232 135,233.119 135,234.5 z" fill="#2C5476" id="path21818-5"/>
-        <path d="M147,226.5 C147,227.881 145.881,229 144.5,229 C143.119,229 142,227.881 142,226.5 C142,225.119 143.119,224 144.5,224 C145.881,224 147,225.119 147,226.5 z" fill="#395E53" id="path21820-6"/>
-        <path d="M158,234.5 C158,235.881 156.881,237 155.5,237 C154.119,237 153,235.881 153,234.5 C153,233.119 154.119,232 155.5,232 C156.881,232 158,233.119 158,234.5 z" fill="#5B502F" id="path21822-2"/>
-        <path d="M169,226.5 C169,227.328 168.328,228 167.5,228 C166.672,228 166,227.328 166,226.5 C166,225.672 166.672,225 167.5,225 C168.328,225 169,225.672 169,226.5 z" fill="#FFFFFF" id="path21824-7"/>
-        <path d="M157,234.5 C157,235.328 156.328,236 155.5,236 C154.672,236 154,235.328 154,234.5 C154,233.672 154.672,233 155.5,233 C156.328,233 157,233.672 157,234.5 z" fill="#FFFFFF" id="path21826-1"/>
-        <path d="M146,226.5 C146,227.328 145.329,228 144.5,228 C143.672,228 143,227.328 143,226.5 C143,225.672 143.672,225 144.5,225 C145.329,225 146,225.672 146,226.5 z" fill="#FFFFFF" id="path21828-2"/>
-        <path d="M134,234.5 C134,235.328 133.329,236 132.5,236 C131.672,236 131,235.328 131,234.5 C131,233.672 131.672,233 132.5,233 C133.329,233 134,233.672 134,234.5 z" fill="#FFFFFF" id="path21830-4"/>
+      <g>
+        <path d="M156.969,232.469 L154.031,236.531 L143.031,228.531 L145.969,224.469 z" fill="#46682F"/>
+        <path d="M154.125,232.406 L156.875,236.594 L168.875,228.594 L166.125,224.406 z" fill="#70372F"/>
+        <path d="M131.125,232.419 L133.875,236.575 L145.875,228.575 L143.125,224.419 z" fill="#2C5476"/>
+        <path d="M156.375,233.281 L154.625,235.719 L143.625,227.719 L145.375,225.281 z" fill="#8CD05F"/>
+        <path d="M154.656,233.25 L156.344,235.75 L168.344,227.75 L166.656,225.25 z" fill="#E06D5F"/>
+        <path d="M131.656,233.263 L133.344,235.763 L145.344,227.763 L143.656,225.263 z" fill="#58A9ED"/>
+        <path d="M170,226.5 C170,227.881 168.881,229 167.5,229 C166.119,229 165,227.881 165,226.5 C165,225.119 166.119,224 167.5,224 C168.881,224 170,225.119 170,226.5 z" fill="#70372F"/>
+        <path d="M135,234.5 C135,235.881 133.881,237 132.5,237 C131.119,237 130,235.881 130,234.5 C130,233.119 131.119,232 132.5,232 C133.881,232 135,233.119 135,234.5 z" fill="#2C5476"/>
+        <path d="M147,226.5 C147,227.881 145.881,229 144.5,229 C143.119,229 142,227.881 142,226.5 C142,225.119 143.119,224 144.5,224 C145.881,224 147,225.119 147,226.5 z" fill="#395E53"/>
+        <path d="M158,234.5 C158,235.881 156.881,237 155.5,237 C154.119,237 153,235.881 153,234.5 C153,233.119 154.119,232 155.5,232 C156.881,232 158,233.119 158,234.5 z" fill="#5B502F"/>
+        <path d="M169,226.5 C169,227.328 168.328,228 167.5,228 C166.672,228 166,227.328 166,226.5 C166,225.672 166.672,225 167.5,225 C168.328,225 169,225.672 169,226.5 z" fill="#FFFFFF"/>
+        <path d="M157,234.5 C157,235.328 156.328,236 155.5,236 C154.672,236 154,235.328 154,234.5 C154,233.672 154.672,233 155.5,233 C156.328,233 157,233.672 157,234.5 z" fill="#FFFFFF"/>
+        <path d="M146,226.5 C146,227.328 145.329,228 144.5,228 C143.672,228 143,227.328 143,226.5 C143,225.672 143.672,225 144.5,225 C145.329,225 146,225.672 146,226.5 z" fill="#FFFFFF"/>
+        <path d="M134,234.5 C134,235.328 133.329,236 132.5,236 C131.672,236 131,235.328 131,234.5 C131,233.672 131.672,233 132.5,233 C133.329,233 134,233.672 134,234.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="boundary" viewBox="60 200 60 60">
-      <g id="g24949">
-        <path d="M90.5,251.5 L79.5,240.5 L100.5,219.5 L111.5,230.5 z" fill="#58A9ED" id="path24911"/>
-        <path d="M79.5,240.5 L68.5,229.5 L89.5,208.5 L100.5,219.5 z" fill="#8CD05F" id="path24909"/>
-        <g id="path24886">
+      <g>
+        <path d="M90.5,251.5 L79.5,240.5 L100.5,219.5 L111.5,230.5 z" fill="#58A9ED"/>
+        <path d="M79.5,240.5 L68.5,229.5 L89.5,208.5 L100.5,219.5 z" fill="#8CD05F"/>
+        <g>
           <path d="M79.5,240.5 L90,230 L100.5,219.5" fill="#FFFFFF"/>
           <path d="M79.5,240.5 L90,230 L100.5,219.5" fill-opacity="0" stroke="#444444" stroke-width="1" stroke-dasharray="2,1"/>
         </g>
-        <path d="M83,240 C83,241.657 81.657,243 80,243 C78.343,243 77,241.657 77,240 C77,238.343 78.343,237 80,237 C81.657,237 83,238.343 83,240 z" fill="#444444" id="path21818-5-8"/>
-        <path d="M82,240 C82,241.105 81.105,242 80,242 C78.896,242 78,241.105 78,240 C78,238.895 78.896,238 80,238 C81.105,238 82,238.895 82,240 z" fill="#FFFFFF" id="path21830-4-8"/>
-        <path d="M103,220 C103,221.657 101.657,223 100,223 C98.343,223 97,221.657 97,220 C97,218.343 98.343,217 100,217 C101.657,217 103,218.343 103,220 z" fill="#444444" id="path24882"/>
-        <path d="M102,220 C102,221.105 101.105,222 100,222 C98.896,222 98,221.105 98,220 C98,218.895 98.896,218 100,218 C101.105,218 102,218.895 102,220 z" fill="#FFFFFF" id="path24884"/>
-        <path d="M93,230 C93,231.657 91.657,233 90,233 C88.343,233 87,231.657 87,230 C87,228.343 88.343,227 90,227 C91.657,227 93,228.343 93,230 z" fill="#444444" id="path24888"/>
-        <path d="M92,230 C92,231.105 91.105,232 90,232 C88.896,232 88,231.105 88,230 C88,228.895 88.896,228 90,228 C91.105,228 92,228.895 92,230 z" fill="#FFFFFF" id="path24890"/>
+        <path d="M83,240 C83,241.657 81.657,243 80,243 C78.343,243 77,241.657 77,240 C77,238.343 78.343,237 80,237 C81.657,237 83,238.343 83,240 z" fill="#444444"/>
+        <path d="M82,240 C82,241.105 81.105,242 80,242 C78.896,242 78,241.105 78,240 C78,238.895 78.896,238 80,238 C81.105,238 82,238.895 82,240 z" fill="#FFFFFF"/>
+        <path d="M103,220 C103,221.657 101.657,223 100,223 C98.343,223 97,221.657 97,220 C97,218.343 98.343,217 100,217 C101.657,217 103,218.343 103,220 z" fill="#444444"/>
+        <path d="M102,220 C102,221.105 101.105,222 100,222 C98.896,222 98,221.105 98,220 C98,218.895 98.896,218 100,218 C101.105,218 102,218.895 102,220 z" fill="#FFFFFF"/>
+        <path d="M93,230 C93,231.657 91.657,233 90,233 C88.343,233 87,231.657 87,230 C87,228.343 88.343,227 90,227 C91.657,227 93,228.343 93,230 z" fill="#444444"/>
+        <path d="M92,230 C92,231.105 91.105,232 90,232 C88.896,232 88,231.105 88,230 C88,228.895 88.896,228 90,228 C91.105,228 92,228.895 92,230 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="relation" viewBox="0 200 60 60">
-      <g id="g23477">
-        <path d="M26.906,220 C26.96,220.323 27,220.662 27,221 C27,221.338 26.96,221.677 26.906,222 L35.094,222 C35.027,221.674 35,221.345 35,221 C35,220.655 35.027,220.325 35.094,220 L26.906,220 z M25.875,224.438 C25.485,224.988 25.018,225.483 24.469,225.875 L31.844,233.219 C32.211,232.675 32.703,232.175 33.25,231.812 L25.875,224.438 z M20,226.906 L20,235.094 C20.325,235.027 20.655,235 21,235 C21.345,235 21.675,235.027 22,235.094 L22,226.906 C21.677,226.96 21.338,227 21,227 C20.662,227 20.323,226.96 20,226.906 z" fill="#CCCCCC" id="path23097"/>
-        <g id="g23138">
-          <path d="M40,217 C42.209,217 44,218.791 44,221 C44,223.209 42.209,225 40,225 C37.791,225 36,223.209 36,221 C36,218.791 37.791,217 40,217 z" fill="#70372F" id="path23132"/>
-          <path d="M40,218 C41.657,218 43,219.343 43,221 C43,222.657 41.657,224 40,224 C38.343,224 37,222.657 37,221 C37,219.343 38.343,218 40,218 z" fill="#E06D5F" id="path23134"/>
-          <path d="M40,220 C40.552,220 41,220.448 41,221 C41,221.552 40.552,222 40,222 C39.448,222 39,221.552 39,221 C39,220.448 39.448,220 40,220 z" fill="#FFFFFF" id="path23136"/>
+      <g>
+        <path d="M26.906,220 C26.96,220.323 27,220.662 27,221 C27,221.338 26.96,221.677 26.906,222 L35.094,222 C35.027,221.674 35,221.345 35,221 C35,220.655 35.027,220.325 35.094,220 L26.906,220 z M25.875,224.438 C25.485,224.988 25.018,225.483 24.469,225.875 L31.844,233.219 C32.211,232.675 32.703,232.175 33.25,231.812 L25.875,224.438 z M20,226.906 L20,235.094 C20.325,235.027 20.655,235 21,235 C21.345,235 21.675,235.027 22,235.094 L22,226.906 C21.677,226.96 21.338,227 21,227 C20.662,227 20.323,226.96 20,226.906 z" fill="#CCCCCC"/>
+        <g>
+          <path d="M40,217 C42.209,217 44,218.791 44,221 C44,223.209 42.209,225 40,225 C37.791,225 36,223.209 36,221 C36,218.791 37.791,217 40,217 z" fill="#70372F"/>
+          <path d="M40,218 C41.657,218 43,219.343 43,221 C43,222.657 41.657,224 40,224 C38.343,224 37,222.657 37,221 C37,219.343 38.343,218 40,218 z" fill="#E06D5F"/>
+          <path d="M40,220 C40.552,220 41,220.448 41,221 C41,221.552 40.552,222 40,222 C39.448,222 39,221.552 39,221 C39,220.448 39.448,220 40,220 z" fill="#FFFFFF"/>
         </g>
-        <path d="M26,221 C26,223.761 23.761,226 21,226 C18.239,226 16,223.761 16,221 C16,218.239 18.239,216 21,216 C23.761,216 26,218.239 26,221 z" fill="#444444" id="path23083"/>
-        <path d="M25,221 C25,223.209 23.209,225 21,225 C18.791,225 17,223.209 17,221 C17,218.791 18.791,217 21,217 C23.209,217 25,218.791 25,221 z" fill="#CCCCCC" id="path23085"/>
-        <path d="M25,240 C25,242.209 23.209,244 21,244 C18.791,244 17,242.209 17,240 C17,237.791 18.791,236 21,236 C23.209,236 25,237.791 25,240 z" fill="#2C5476" id="path23079"/>
-        <path d="M24,240 C24,241.657 22.657,243 21,243 C19.343,243 18,241.657 18,240 C18,238.343 19.343,237 21,237 C22.657,237 24,238.343 24,240 z" fill="#58A9ED" id="path23081"/>
-        <path d="M22,240 C22,240.552 21.552,241 21,241 C20.448,241 20,240.552 20,240 C20,239.448 20.448,239 21,239 C21.552,239 22,239.448 22,240 z" fill="#FFFFFF" id="path23089"/>
-        <path d="M23,221 C23,222.105 22.105,223 21,223 C19.895,223 19,222.105 19,221 C19,219.895 19.895,219 21,219 C22.105,219 23,219.895 23,221 z" fill="#FFFFFF" id="path23154"/>
-        <g id="g23162">
-          <path d="M40,236 C40,238.209 38.209,240 36,240 C33.791,240 32,238.209 32,236 C32,233.791 33.791,232 36,232 C38.209,232 40,233.791 40,236 z" fill="#46682F" id="path23156"/>
-          <path d="M39,236 C39,237.657 37.657,239 36,239 C34.343,239 33,237.657 33,236 C33,234.343 34.343,233 36,233 C37.657,233 39,234.343 39,236 z" fill="#8CD05F" id="path23158"/>
-          <path d="M37,236 C37,236.552 36.552,237 36,237 C35.448,237 35,236.552 35,236 C35,235.448 35.448,235 36,235 C36.552,235 37,235.448 37,236 z" fill="#FFFFFF" id="path23160"/>
+        <g>
+          <path d="M25,240 C25,242.209 23.209,244 21,244 C18.791,244 17,242.209 17,240 C17,237.791 18.791,236 21,236 C23.209,236 25,237.791 25,240 z" fill="#2C5476"/>
+          <path d="M24,240 C24,241.657 22.657,243 21,243 C19.343,243 18,241.657 18,240 C18,238.343 19.343,237 21,237 C22.657,237 24,238.343 24,240 z" fill="#58A9ED"/>
+          <path d="M22,240 C22,240.552 21.552,241 21,241 C20.448,241 20,240.552 20,240 C20,239.448 20.448,239 21,239 C21.552,239 22,239.448 22,240 z" fill="#FFFFFF"/>
         </g>
-        <g id="g23167">
-          <path d="M40,236 C40,238.209 38.209,240 36,240 C33.791,240 32,238.209 32,236 C32,233.791 33.791,232 36,232 C38.209,232 40,233.791 40,236 z" fill="#46682F" id="path23169"/>
-          <path d="M39,236 C39,237.657 37.657,239 36,239 C34.343,239 33,237.657 33,236 C33,234.343 34.343,233 36,233 C37.657,233 39,234.343 39,236 z" fill="#8CD05F" id="path23171"/>
-          <path d="M37,236 C37,236.552 36.552,237 36,237 C35.448,237 35,236.552 35,236 C35,235.448 35.448,235 36,235 C36.552,235 37,235.448 37,236 z" fill="#FFFFFF" id="path23173"/>
+        <g>
+          <path d="M40,236 C40,238.209 38.209,240 36,240 C33.791,240 32,238.209 32,236 C32,233.791 33.791,232 36,232 C38.209,232 40,233.791 40,236 z" fill="#46682F"/>
+          <path d="M39,236 C39,237.657 37.657,239 36,239 C34.343,239 33,237.657 33,236 C33,234.343 34.343,233 36,233 C37.657,233 39,234.343 39,236 z" fill="#8CD05F"/>
+          <path d="M37,236 C37,236.552 36.552,237 36,237 C35.448,237 35,236.552 35,236 C35,235.448 35.448,235 36,235 C36.552,235 37,235.448 37,236 z" fill="#FFFFFF"/>
+        </g>
+        <g>
+          <path d="M26,221 C26,223.761 23.761,226 21,226 C18.239,226 16,223.761 16,221 C16,218.239 18.239,216 21,216 C23.761,216 26,218.239 26,221 z" fill="#444444"/>
+          <path d="M25,221 C25,223.209 23.209,225 21,225 C18.791,225 17,223.209 17,221 C17,218.791 18.791,217 21,217 C23.209,217 25,218.791 25,221 z" fill="#CCCCCC"/>
+          <path d="M23,221 C23,222.105 22.105,223 21,223 C19.895,223 19,222.105 19,221 C19,219.895 19.895,219 21,219 C22.105,219 23,219.895 23,221 z" fill="#FFFFFF"/>
         </g>
       </g>
     </symbol>
       <path d="M384,323.5 C384,324.881 382.881,326 381.5,326 C380.119,326 379,324.881 379,323.5 C379,322.119 380.119,321 381.5,321 C382.881,321 384,322.119 384,323.5 z" fill="#FFFFFF"/>
       <path d="M363,323.5 L363,323.5 C363,323.776 362.776,324 362.5,324 L362.5,324 C362.224,324 362,323.776 362,323.5 L362,323.5 C362,323.224 362.224,323 362.5,323 L362.5,323 C362.776,323 363,323.224 363,323.5 z" fill="#FFFFFF" opacity="0.5"/>
     </symbol>
+    <symbol id="piste-line" viewBox="780 140 60 60">
+      <path d="M821.768,160.834 C821.768,162.169 820.686,163.251 819.351,163.251 C818.016,163.251 816.934,162.169 816.934,160.834 C816.934,159.499 818.016,158.417 819.351,158.417 C820.686,158.417 821.768,159.499 821.768,160.834 z M819.705,172.742 C819.605,172.549 819.37,172.47 819.174,172.564 C818.07,173.24 816.723,173.388 815.5,172.967 L805.3,167.859 L809.683,165.668 L809.683,160.834 L812.1,162.042 L812.1,166.876 L814.517,168.085 L816.934,166.876 L814.517,165.668 L814.517,158.417 L809.683,156 L807.266,157.208 L807.266,164.459 L802.883,166.651 L798.581,164.508 C798.381,164.41 798.139,164.493 798.041,164.693 C797.943,164.893 798.026,165.135 798.226,165.233 L815.145,173.692 C815.654,173.91 816.204,174.014 816.757,173.998 C817.723,173.982 818.672,173.739 819.528,173.289 C819.727,173.19 819.808,172.949 819.709,172.749 C819.708,172.747 819.707,172.744 819.705,172.742 z" fill="currentColor" id="piste-line-stroke2"/>
+      <path d="M829.5,179 C830.881,179 832,180.119 832,181.5 C832,182.881 830.881,184 829.5,184 C828.593,184.004 828.127,183.598 827.529,183 L792.471,183 C791.978,183.678 791.297,183.92 790.5,184 C789.119,184 788,182.881 788,181.5 C788,180.119 789.119,179 790.5,179 C791.407,178.996 791.873,179.402 792.471,180 L827.529,180 C828.022,179.322 828.703,179.08 829.5,179 z" fill="currentColor" id="piste-line-stroke1"/>
+      <path d="M796,181 L796,182 L792.95,182 L793,181.5 L792.95,181 L796,181 z M807,181 L802,181 L802,182 L807,182 L807,181 z M818,181 L813,181 L813,182 L818,182 L818,181 z M827.05,181 L824,181 L824,182 L827.05,182 L827,181.5 L827.05,181 z" fill="inherit" id="piste-line-dashes"/>
+      <path d="M831,181.5 C831,182.328 830.328,183 829.5,183 C828.672,183 828,182.328 828,181.5 C828,180.672 828.672,180 829.5,180 C830.328,180 831,180.672 831,181.5 z" fill="#FFFFFF"/>
+      <path d="M792,181.5 C792,182.328 791.328,183 790.5,183 C789.672,183 789,182.328 789,181.5 C789,180.672 789.672,180 790.5,180 C791.328,180 792,180.672 792,181.5 z" fill="#FFFFFF"/>
+    </symbol>
     <symbol id="pipeline-line" viewBox="720 140 60 60">
-      <g id="g26258">
-        <path d="M736.5,155 C735.119,155 734,157.239 734,160 C734,162.761 735.119,165 736.5,165 L747,165 L747,155 L736.5,155 z M751,155 L751,165 L765.5,165 L765.5,155 L751,155 z" fill="#B5B5B5" id="rect25143"/>
-        <path d="M768,160 C768,162.761 766.881,165 765.5,165 C764.119,165 763,162.761 763,160 C763,157.239 764.119,155 765.5,155 C766.881,155 768,157.239 768,160 z" fill="#989898" id="path25154"/>
-        <path d="M748,152 L748,166 L746,176 L748,176 L749.594,168 L754.406,168 L756,176 L758,176 L756,166 L755,166 L750,166 L750,152 L748,152 z M754,152 L754,154 L756,154 L756,152 L754,152 z M742,155 C741,155 739.5,157.239 739.5,160 C739.5,162.761 741,165 742,165 L744,165 C742.619,165 741,162.761 741,160 C741,157.239 742.619,155 744,155 L742,155 z M757,155 C756,155 754.5,157.239 754.5,160 C754.5,162.761 756,165 757,165 L759,165 C757.619,165 756,162.761 756,160 C756,157.239 757.619,155 759,155 L757,155 z M765.5,155 C764.119,155 763,157.239 763,160 C763,162.761 764.119,165 765.5,165 C766.881,165 768,162.761 768,160 C768,157.239 766.881,155 765.5,155 z" fill="#989898" id="path25145"/>
+      <g>
+        <path d="M736.5,155 C735.119,155 734,157.239 734,160 C734,162.761 735.119,165 736.5,165 L747,165 L747,155 L736.5,155 z M751,155 L751,165 L765.5,165 L765.5,155 L751,155 z" fill="#B5B5B5"/>
+        <path d="M768,160 C768,162.761 766.881,165 765.5,165 C764.119,165 763,162.761 763,160 C763,157.239 764.119,155 765.5,155 C766.881,155 768,157.239 768,160 z" fill="#989898"/>
+        <path d="M748,152 L748,166 L746,176 L748,176 L749.594,168 L754.406,168 L756,176 L758,176 L756,166 L755,166 L750,166 L750,152 L748,152 z M754,152 L754,154 L756,154 L756,152 L754,152 z M742,155 C741,155 739.5,157.239 739.5,160 C739.5,162.761 741,165 742,165 L744,165 C742.619,165 741,162.761 741,160 C741,157.239 742.619,155 744,155 L742,155 z M757,155 C756,155 754.5,157.239 754.5,160 C754.5,162.761 756,165 757,165 L759,165 C757.619,165 756,162.761 756,160 C756,157.239 757.619,155 759,155 L757,155 z M765.5,155 C764.119,155 763,157.239 763,160 C763,162.761 764.119,165 765.5,165 C766.881,165 768,162.761 768,160 C768,157.239 766.881,155 765.5,155 z" fill="#989898"/>
       </g>
       <path d="M769.5,179 C770.881,179 772,180.119 772,181.5 C772,182.881 770.881,184 769.5,184 C768.076,183.93 767.556,183.207 767.05,182 L732.95,182 C732.591,183.231 731.753,183.874 730.5,184 C729.119,184 728,182.881 728,181.5 C728,180.119 729.119,179 730.5,179 C731.924,179.069 732.443,179.793 732.95,181 L767.05,181 C767.409,179.768 768.247,179.126 769.5,179 z" fill="currentColor" id="pipeline-line-stroke"/>
-      <path d="M771,181.5 C771,182.328 770.328,183 769.5,183 C768.672,183 768,182.328 768,181.5 C768,180.672 768.672,180 769.5,180 C770.328,180 771,180.672 771,181.5 z" fill="#FFFFFF" id="path3936-9"/>
-      <path d="M732,181.5 C732,182.328 731.328,183 730.5,183 C729.672,183 729,182.328 729,181.5 C729,180.672 729.672,180 730.5,180 C731.328,180 732,180.672 732,181.5 z" fill="#FFFFFF" id="path3940-7"/>
+      <path d="M771,181.5 C771,182.328 770.328,183 769.5,183 C768.672,183 768,182.328 768,181.5 C768,180.672 768.672,180 769.5,180 C770.328,180 771,180.672 771,181.5 z" fill="#FFFFFF"/>
+      <path d="M732,181.5 C732,182.328 731.328,183 730.5,183 C729.672,183 729,182.328 729,181.5 C729,180.672 729.672,180 730.5,180 C731.328,180 732,180.672 732,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="ferry-line" viewBox="660 140 60 60">
-      <path d="M687,146 L686,147 L686,149 L683,149 L682,150 L682,156.906 L684,156.188 L684,152 L685,151 L687,151 L687,155.094 L688,154.719 L688,151 L692,151 L692,154.531 L693,154.812 L693,151 L695,151 L696,152 L696,155.625 L698,156.188 L698,150 L697,149 L694,149 L694,147 L693,146 L687,146 z M690,155 L679,159 L679,168.062 C678.979,168.055 678.958,168.038 678.938,168.031 C677.518,167.545 676.407,167.062 676.407,167.062 C676.077,166.915 675.693,166.955 675.401,167.168 C675.109,167.381 674.953,167.734 674.993,168.093 C675.033,168.452 675.263,168.763 675.594,168.906 C675.594,168.906 676.816,169.424 678.313,169.938 C679.81,170.451 681.548,171 683,171 C684.453,171 686.191,170.451 687.688,169.938 C689.185,169.424 690.407,168.906 690.407,168.906 C690.407,168.906 691.518,168.424 692.938,167.938 C694.357,167.451 696.119,167 697,167 C697.881,167 699.643,167.451 701.062,167.938 C702.482,168.424 703.594,168.906 703.594,168.906 C703.924,169.054 704.307,169.014 704.599,168.801 C704.891,168.588 705.047,168.235 705.007,167.876 C704.967,167.516 704.738,167.206 704.406,167.062 C704.406,167.062 703.185,166.545 701.688,166.031 C701.465,165.955 701.231,165.887 701,165.812 L701,158 L690,155 z M697,169 C695.548,169 693.81,169.518 692.312,170.031 C690.815,170.545 689.594,171.062 689.594,171.062 C689.594,171.062 688.482,171.545 687.062,172.031 C685.643,172.518 683.881,173 683,173 C682.119,173 680.357,172.518 678.938,172.031 C677.518,171.545 676.406,171.062 676.406,171.062 C676.076,170.915 675.693,170.955 675.401,171.168 C675.109,171.381 674.953,171.734 674.993,172.093 C675.033,172.452 675.262,172.763 675.594,172.906 C675.594,172.906 676.815,173.424 678.312,173.938 C679.81,174.451 681.548,175 683,175 C684.452,175 686.19,174.451 687.688,173.938 C689.185,173.424 690.406,172.906 690.406,172.906 C690.406,172.906 691.518,172.424 692.938,171.938 C694.357,171.451 696.119,171 697,171 C697.881,171 699.643,171.451 701.062,171.938 C702.482,172.424 703.594,172.906 703.594,172.906 C703.924,173.054 704.307,173.014 704.599,172.801 C704.891,172.588 705.047,172.235 705.007,171.876 C704.967,171.516 704.738,171.206 704.406,171.062 C704.406,171.062 703.185,170.545 701.688,170.031 C700.19,169.518 698.452,169 697,169 z" fill="currentColor" id="ferry-line-stroke2"/>
+      <path d="M685.666,166.974 C687.013,166.992 688.315,167.464 689.361,168.313 L689.88,168.772 L689.98,168.772 L690.599,168.213 C692.56,166.592 695.351,166.446 697.47,167.853 L701.984,158.985 L698.988,156.988 L698.988,149.898 C698.895,148.3 697.592,147.04 695.992,147.001 L694.993,147.001 C695.062,145.967 694.278,145.073 693.244,145.004 C693.161,144.999 693.078,144.999 692.996,145.004 L687.004,145.004 C685.969,144.936 685.075,145.719 685.007,146.754 C685.001,146.836 685.001,146.919 685.007,147.001 L684.008,147.001 C682.408,147.04 681.105,148.3 681.012,149.898 L681.012,156.988 L678.016,158.985 L682.51,168.033 C683.437,167.382 684.534,167.014 685.666,166.974 z M683.009,149.898 C683.03,149.379 683.467,148.977 683.985,148.998 C683.993,148.998 684,148.998 684.008,148.999 L695.992,148.999 C696.509,148.965 696.956,149.356 696.991,149.873 C696.993,149.915 696.993,149.956 696.991,149.997 L696.991,155.989 L690,151.995 L683.009,155.889 C683.009,155.889 683.009,149.898 683.009,149.898 z M702.982,170.969 L702.982,172.966 C702.458,173.005 701.97,173.249 701.624,173.645 C701.082,174.221 700.39,174.636 699.627,174.844 C698.399,175.206 697.071,174.929 696.092,174.105 L695.313,173.406 C694.705,172.801 693.724,172.801 693.116,173.406 C692.836,173.645 692.576,173.905 692.277,174.145 C690.813,175.314 688.719,175.255 687.324,174.005 L686.545,173.306 C685.973,172.806 685.119,172.806 684.547,173.306 C684.168,173.605 683.828,173.945 683.449,174.245 C682.042,175.286 680.107,175.237 678.755,174.125 L678.136,173.586 C677.847,173.255 677.451,173.035 677.018,172.966 L677.018,170.969 C677.534,170.905 678.057,171.003 678.516,171.249 C679.071,171.593 679.599,171.98 680.093,172.407 C680.503,172.854 681.121,173.044 681.711,172.906 C681.936,172.84 682.146,172.731 682.33,172.587 C682.65,172.347 682.91,172.068 683.229,171.808 C684.648,170.632 686.703,170.632 688.122,171.808 C688.442,172.068 688.742,172.367 689.061,172.627 C689.633,173.127 690.487,173.127 691.059,172.627 C691.378,172.367 691.678,172.068 691.997,171.808 C693.42,170.621 695.488,170.621 696.911,171.808 C697.21,172.068 697.49,172.347 697.789,172.587 C698.361,173.087 699.215,173.087 699.787,172.587 L700.725,171.768 C701.364,171.25 702.161,170.968 702.982,170.969 z" fill="currentColor" id="ferry-line-stroke2"/>
       <path d="M709.5,179 C710.881,179 712,180.119 712,181.5 C712,182.881 710.881,184 709.5,184 C708.593,184.004 708.127,183.598 707.529,183 L672.471,183 C671.978,183.678 671.297,183.92 670.5,184 C669.119,184 668,182.881 668,181.5 C668,180.119 669.119,179 670.5,179 C671.407,178.996 671.873,179.402 672.471,180 L707.529,180 C708.022,179.322 708.703,179.08 709.5,179 z" fill="currentColor" id="ferry-line-stroke1"/>
       <path d="M676,181 L676,182 L672.95,182 L673,181.5 L672.95,181 L676,181 z M687,181 L682,181 L682,182 L687,182 L687,181 z M698,181 L693,181 L693,182 L698,182 L698,181 z M707.05,181 L704,181 L704,182 L707.05,182 L707,181.5 L707.05,181 z" fill="inherit" id="ferry-line-dashes"/>
-      <path d="M711,181.5 C711,182.328 710.328,183 709.5,183 C708.672,183 708,182.328 708,181.5 C708,180.672 708.672,180 709.5,180 C710.328,180 711,180.672 711,181.5 z" fill="#FFFFFF" id="path6848-7"/>
-      <path d="M672,181.5 C672,182.328 671.328,183 670.5,183 C669.672,183 669,182.328 669,181.5 C669,180.672 669.672,180 670.5,180 C671.328,180 672,180.672 672,181.5 z" fill="#FFFFFF" id="path6852-2"/>
+      <path d="M711,181.5 C711,182.328 710.328,183 709.5,183 C708.672,183 708,182.328 708,181.5 C708,180.672 708.672,180 709.5,180 C710.328,180 711,180.672 711,181.5 z" fill="#FFFFFF"/>
+      <path d="M672,181.5 C672,182.328 671.328,183 670.5,183 C669.672,183 669,182.328 669,181.5 C669,180.672 669.672,180 670.5,180 C671.328,180 672,180.672 672,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="category-water" viewBox="600 140 60 60">
       <path d="M616.762,181 C616.762,181 616.225,179.154 616.417,178.25 C616.638,177.203 618.071,175.5 618.071,175.5 C618.071,175.5 619.505,173.797 619.726,172.75 C619.917,171.846 619.381,170 619.381,170 C619.381,170 618.844,168.154 619.036,167.25 C619.257,166.203 620.69,164.5 620.69,164.5 C620.69,164.5 622.124,162.797 622.345,161.75 C622.536,160.846 622,159 622,159 L638.5,159 C638.5,159 639.933,160.703 640.155,161.75 C640.346,162.654 639.809,164.5 639.809,164.5 C639.809,164.5 639.273,166.346 639.464,167.25 C639.686,168.297 641.119,170 641.119,170 C641.119,170 642.552,171.703 642.774,172.75 C642.965,173.654 642.428,175.5 642.428,175.5 C642.428,175.5 641.892,177.346 642.083,178.25 C642.305,179.297 643.738,181 643.738,181 z" fill="currentColor" id="category-water-stroke1"/>
       <path d="M562,181 L565,170 L568,159 L572,159 L575,170 L578,181 z" fill="currentColor" id="category-path-stroke"/>
     </symbol>
     <symbol id="category-rail" viewBox="480 140 60 60">
-      <path d="M503.5,158 L502,159 L501.531,161 L498.25,161 C497.696,161 497.384,161.463 497.25,162 L497,163 C496.866,163.537 497.446,164 498,164 L522,164 C522.554,164 523.134,163.537 523,163 L522.75,162 C522.616,161.463 522.304,161 521.75,161 L518.969,161 L518.5,159 L517,158 L516,159 L516.469,161 L504.031,161 L504.5,159 L503.5,158 z M501.5,162 C501.776,162 502,162.224 502,162.5 C502,162.776 501.776,163 501.5,163 C501.224,163 501,162.776 501,162.5 C501,162.224 501.224,162 501.5,162 z M518.5,162 C518.776,162 519,162.224 519,162.5 C519,162.776 518.776,163 518.5,163 C518.224,163 518,162.776 518,162.5 C518,162.224 518.224,162 518.5,162 z M500.562,165 L500.094,167 L497.25,167 C496.696,167 496.384,167.463 496.25,168 L496,169 C495.866,169.537 496.446,170 497,170 L523,170 C523.554,170 524.134,169.537 524,169 L523.75,168 C523.616,167.463 523.304,167 522.75,167 L520.406,167 L519.938,165 L517.438,165 L517.906,167 L502.594,167 L503.062,165 L500.562,165 z M500.5,168 C500.776,168 501,168.224 501,168.5 C501,168.776 500.776,169 500.5,169 C500.224,169 500,168.776 500,168.5 C500,168.224 500.224,168 500.5,168 z M519.5,168 C519.776,168 520,168.224 520,168.5 C520,168.776 519.776,169 519.5,169 C519.224,169 519,168.776 519,168.5 C519,168.224 519.224,168 519.5,168 z M499.156,171 L498.688,173 L496.25,173 C495.696,173 495.384,173.463 495.25,174 L495,175 C494.866,175.537 495.446,176 496,176 L524,176 C524.554,176 525.134,175.537 525,175 L524.75,174 C524.616,173.463 524.304,173 523.75,173 L521.812,173 L521.344,171 L518.844,171 L519.312,173 L501.188,173 L501.656,171 L499.156,171 z M499.5,174 C499.776,174 500,174.224 500,174.5 C500,174.776 499.776,175 499.5,175 C499.224,175 499,174.776 499,174.5 C499,174.224 499.224,174 499.5,174 z M520.5,174 C520.776,174 521,174.224 521,174.5 C521,174.776 520.776,175 520.5,175 C520.224,175 520,174.776 520,174.5 C520,174.224 520.224,174 520.5,174 z M497.719,177 L497,180 L498.5,181 L499.5,180 L500.219,177 L497.719,177 z M520.281,177 L521,180 L522,181 L523.5,180 L522.781,177 L520.281,177 z" fill="#989898" id="rect17528-7-7"/>
+      <path d="M503.5,158 L502,159 L501.531,161 L498.25,161 C497.696,161 497.384,161.463 497.25,162 L497,163 C496.866,163.537 497.446,164 498,164 L522,164 C522.554,164 523.134,163.537 523,163 L522.75,162 C522.616,161.463 522.304,161 521.75,161 L518.969,161 L518.5,159 L517,158 L516,159 L516.469,161 L504.031,161 L504.5,159 L503.5,158 z M501.5,162 C501.776,162 502,162.224 502,162.5 C502,162.776 501.776,163 501.5,163 C501.224,163 501,162.776 501,162.5 C501,162.224 501.224,162 501.5,162 z M518.5,162 C518.776,162 519,162.224 519,162.5 C519,162.776 518.776,163 518.5,163 C518.224,163 518,162.776 518,162.5 C518,162.224 518.224,162 518.5,162 z M500.562,165 L500.094,167 L497.25,167 C496.696,167 496.384,167.463 496.25,168 L496,169 C495.866,169.537 496.446,170 497,170 L523,170 C523.554,170 524.134,169.537 524,169 L523.75,168 C523.616,167.463 523.304,167 522.75,167 L520.406,167 L519.938,165 L517.438,165 L517.906,167 L502.594,167 L503.062,165 L500.562,165 z M500.5,168 C500.776,168 501,168.224 501,168.5 C501,168.776 500.776,169 500.5,169 C500.224,169 500,168.776 500,168.5 C500,168.224 500.224,168 500.5,168 z M519.5,168 C519.776,168 520,168.224 520,168.5 C520,168.776 519.776,169 519.5,169 C519.224,169 519,168.776 519,168.5 C519,168.224 519.224,168 519.5,168 z M499.156,171 L498.688,173 L496.25,173 C495.696,173 495.384,173.463 495.25,174 L495,175 C494.866,175.537 495.446,176 496,176 L524,176 C524.554,176 525.134,175.537 525,175 L524.75,174 C524.616,173.463 524.304,173 523.75,173 L521.812,173 L521.344,171 L518.844,171 L519.312,173 L501.188,173 L501.656,171 L499.156,171 z M499.5,174 C499.776,174 500,174.224 500,174.5 C500,174.776 499.776,175 499.5,175 C499.224,175 499,174.776 499,174.5 C499,174.224 499.224,174 499.5,174 z M520.5,174 C520.776,174 521,174.224 521,174.5 C521,174.776 520.776,175 520.5,175 C520.224,175 520,174.776 520,174.5 C520,174.224 520.224,174 520.5,174 z M497.719,177 L497,180 L498.5,181 L499.5,180 L500.219,177 L497.719,177 z M520.281,177 L521,180 L522,181 L523.5,180 L522.781,177 L520.281,177 z" fill="#989898"/>
     </symbol>
     <symbol id="category-roads" viewBox="420 140 60 60">
-      <path d="M442.5,160 L439.625,166 L438,166 L437,167 L437,169 L438.406,169 L438,170 L438,175 L438,176 L438,176 C438,176 438.608,176.608 439,177 L440,177 L444,177 L446,178 L454,178 L456,177 L460,177 L461,177 L462,176 L462,176 L462,175 L462,170 L461.594,169 L463,169 L463,167 L462,166 L460.375,166 L457.5,160 z M443.5,163 L456.5,163 L458,167 L457,168 L443,168 L442,167 z M441,171 L444,171 L445,173 L445,174 L441,174 L440,173 L440,172 z M456,171 L459,171 L460,172 L460,173 L459,174 L455,174 L455,173 z M439,178 L439,180 L440,181 L443,181 L444,180 L444,178 z M456,178 L456,180 L457,181 L460,181 L461,180 L461,178 z" fill="#989898" id="path4709"/>
+      <path d="M442.5,160 L439.625,166 L438,166 L437,167 L437,169 L438.406,169 L438,170 L438,175 L438,176 L438,176 C438,176 438.608,176.608 439,177 L440,177 L444,177 L446,178 L454,178 L456,177 L460,177 L461,177 L462,176 L462,176 L462,175 L462,170 L461.594,169 L463,169 L463,167 L462,166 L460.375,166 L457.5,160 z M443.5,163 L456.5,163 L458,167 L457,168 L443,168 L442,167 z M441,171 L444,171 L445,173 L445,174 L441,174 L440,173 L440,172 z M456,171 L459,171 L460,172 L460,173 L459,174 L455,174 L455,173 z M439,178 L439,180 L440,181 L443,181 L444,180 L444,178 z M456,178 L456,180 L457,181 L460,181 L461,180 L461,178 z" fill="#989898"/>
     </symbol>
     <symbol id="other-line" viewBox="360 140 60 60">
       <path d="M409.5,179 C410.881,179 412,180.119 412,181.5 C412,182.881 410.881,184 409.5,184 C408.57,184.002 408.113,183.584 407.5,182.971 L407.5,183 L372.5,183 L372.5,182.971 C371.996,183.663 371.316,183.918 370.5,184 C369.119,184 368,182.881 368,181.5 C368,180.119 369.119,179 370.5,179 C371.43,178.998 371.887,179.417 372.5,180.029 L372.5,180 L407.5,180 L407.5,180.029 C408.004,179.336 408.684,179.082 409.5,179 z" fill="inherit" id="other-line-casing1"/>
       <path d="M407.05,181 L407,181.5 L407.05,182 L372.95,182 L373,181.5 L372.95,181 L407.05,181 z" fill="currentColor" id="other-line-stroke1"/>
-      <path d="M411,181.5 C411,182.328 410.328,183 409.5,183 C408.672,183 408,182.328 408,181.5 C408,180.672 408.672,180 409.5,180 C410.328,180 411,180.672 411,181.5 z" fill="#FFFFFF" id="path4657"/>
-      <path d="M372,181.5 C372,182.328 371.328,183 370.5,183 C369.672,183 369,182.328 369,181.5 C369,180.672 369.672,180 370.5,180 C371.328,180 372,180.672 372,181.5 z" fill="#FFFFFF" id="path4661"/>
-      <path d="M382.375,176 L385.375,165 L388.375,154 L392.375,154 L395.375,165 L398.375,176 z" fill="#989898" id="path26176-5-7-8"/>
+      <path d="M411,181.5 C411,182.328 410.328,183 409.5,183 C408.672,183 408,182.328 408,181.5 C408,180.672 408.672,180 409.5,180 C410.328,180 411,180.672 411,181.5 z" fill="#FFFFFF"/>
+      <path d="M372,181.5 C372,182.328 371.328,183 370.5,183 C369.672,183 369,182.328 369,181.5 C369,180.672 369.672,180 370.5,180 C371.328,180 372,180.672 372,181.5 z" fill="#FFFFFF"/>
+      <path d="M382.375,176 L385.375,165 L388.375,154 L392.375,154 L395.375,165 L398.375,176 z" fill="#989898"/>
     </symbol>
     <symbol id="power-line" viewBox="300 140 60 60">
       <path d="M349.5,179 C350.881,179 352,180.119 352,181.5 C352,182.881 350.881,184 349.5,184 C348.075,183.93 347.556,183.207 347.05,182 L312.949,182 C312.591,183.232 311.753,183.874 310.5,184 C309.119,184 308,182.881 308,181.5 C308,180.119 309.119,179 310.5,179 C311.924,179.069 312.443,179.793 312.949,181 L347.05,181 C347.409,179.768 348.247,179.126 349.5,179 z" fill="currentColor" id="power-line-stroke"/>
-      <path d="M351,181.5 C351,182.328 350.328,183 349.5,183 C348.672,183 348,182.328 348,181.5 C348,180.672 348.672,180 349.5,180 C350.328,180 351,180.672 351,181.5 z" fill="#FFFFFF" id="path3936"/>
-      <path d="M312,181.5 C312,182.328 311.328,183 310.5,183 C309.672,183 309,182.328 309,181.5 C309,180.672 309.672,180 310.5,180 C311.328,180 312,180.672 312,181.5 z" fill="#FFFFFF" id="path3940"/>
-      <path d="M320,150 L320,151 L322,151 L322,150 L320,150 z M324,150 L324,151 L326,151 L326,150 L324,150 z M334,150 L334,151 L336,151 L336,150 L334,150 z M338,150 L338,151 L340,151 L340,150 L338,150 z M320.312,155 C319.647,158.533 317.267,160.5 315,160.5 L314,160.5 L314,161.5 L315,161.5 C316.042,161.5 317.082,161.196 318,160.594 L318,161.5 L319,161.5 C321.879,161.5 324.615,159.022 325.312,155 L324.312,155 C323.647,158.533 321.267,160.5 319,160.5 L318.125,160.5 C319.686,159.42 320.885,157.509 321.312,155 L320.312,155 z M334.687,155 C335.385,159.022 338.121,161.5 341,161.5 L342,161.5 L342,160.594 C342.918,161.196 343.958,161.5 345,161.5 L346,161.5 L346,160.5 L345,160.5 C342.733,160.5 340.353,158.533 339.687,155 L338.687,155 C339.115,157.509 340.314,159.42 341.875,160.5 L341,160.5 C338.733,160.5 336.353,158.533 335.687,155 L334.687,155 z" fill="#989898" id="rect4103"/>
-      <path d="M328,150 L328,152 L319,152 L319,154 L328,154 L328,176 L332,176 L332,154 L341,154 L341,152 L332,152 L332,150 L328,150 z" fill="#B5B5B5" id="rect4101"/>
+      <path d="M351,181.5 C351,182.328 350.328,183 349.5,183 C348.672,183 348,182.328 348,181.5 C348,180.672 348.672,180 349.5,180 C350.328,180 351,180.672 351,181.5 z" fill="#FFFFFF"/>
+      <path d="M312,181.5 C312,182.328 311.328,183 310.5,183 C309.672,183 309,182.328 309,181.5 C309,180.672 309.672,180 310.5,180 C311.328,180 312,180.672 312,181.5 z" fill="#FFFFFF"/>
+      <path d="M320,150 L320,151 L322,151 L322,150 L320,150 z M324,150 L324,151 L326,151 L326,150 L324,150 z M334,150 L334,151 L336,151 L336,150 L334,150 z M338,150 L338,151 L340,151 L340,150 L338,150 z M320.312,155 C319.647,158.533 317.267,160.5 315,160.5 L314,160.5 L314,161.5 L315,161.5 C316.042,161.5 317.082,161.196 318,160.594 L318,161.5 L319,161.5 C321.879,161.5 324.615,159.022 325.312,155 L324.312,155 C323.647,158.533 321.267,160.5 319,160.5 L318.125,160.5 C319.686,159.42 320.885,157.509 321.312,155 L320.312,155 z M334.687,155 C335.385,159.022 338.121,161.5 341,161.5 L342,161.5 L342,160.594 C342.918,161.196 343.958,161.5 345,161.5 L346,161.5 L346,160.5 L345,160.5 C342.733,160.5 340.353,158.533 339.687,155 L338.687,155 C339.115,157.509 340.314,159.42 341.875,160.5 L341,160.5 C338.733,160.5 336.353,158.533 335.687,155 L334.687,155 z" fill="#989898"/>
+      <path d="M328,150 L328,152 L319,152 L319,154 L328,154 L328,176 L332,176 L332,154 L341,154 L341,152 L332,152 L332,150 L328,150 z" fill="#B5B5B5"/>
     </symbol>
     <symbol id="waterway-ditch" viewBox="240 140 60 60">
-      <path d="M266,154 L261.75,176 L263.75,176 L268,154 L266,154 z M272.5,154 L276.75,176 L278.75,176 L274.5,154 L272.5,154 z" fill="#B5B5B5" id="path7019"/>
       <path d="M289.5,179 C290.881,179 292,180.119 292,181.5 C292,182.881 290.881,184 289.5,184 C288.259,183.944 287.613,183.339 287.154,182.25 L252.846,182.25 C252.509,183.364 251.607,183.888 250.5,184 C249.119,184 248,182.881 248,181.5 C248,180.119 249.119,179 250.5,179 C251.741,179.056 252.387,179.661 252.846,180.75 L287.154,180.75 C287.491,179.636 288.393,179.111 289.5,179 z" fill="currentColor" id="waterway-ditch-stroke1"/>
       <path d="M264.762,176 L269,154 L271.5,154 L275.738,176 z" fill="currentColor" id="waterway-ditch-stroke2"/>
-      <path d="M291,181.5 C291,182.328 290.328,183 289.5,183 C288.672,183 288,182.328 288,181.5 C288,180.672 288.672,180 289.5,180 C290.328,180 291,180.672 291,181.5 z" fill="#FFFFFF" id="path26188-3"/>
-      <path d="M252,181.5 C252,182.328 251.328,183 250.5,183 C249.672,183 249,182.328 249,181.5 C249,180.672 249.672,180 250.5,180 C251.328,180 252,180.672 252,181.5 z" fill="#FFFFFF" id="path26192-1"/>
+      <path d="M266,154 L261.75,176 L263.75,176 L268,154 L266,154 z M272.5,154 L276.75,176 L278.75,176 L274.5,154 L272.5,154 z" fill="#B5B5B5"/>
+      <path d="M291,181.5 C291,182.328 290.328,183 289.5,183 C288.672,183 288,182.328 288,181.5 C288,180.672 288.672,180 289.5,180 C290.328,180 291,180.672 291,181.5 z" fill="#FFFFFF"/>
+      <path d="M252,181.5 C252,182.328 251.328,183 250.5,183 C249.672,183 249,182.328 249,181.5 C249,180.672 249.672,180 250.5,180 C251.328,180 252,180.672 252,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="waterway-canal" viewBox="180 140 60 60">
       <path d="M229.5,179 C230.881,179 232,180.119 232,181.5 C232,182.881 230.881,184 229.5,184 C228.259,183.944 227.613,183.339 227.154,182.25 L192.846,182.25 C192.509,183.364 191.607,183.888 190.5,184 C189.119,184 188,182.881 188,181.5 C188,180.119 189.119,179 190.5,179 C191.741,179.056 192.387,179.661 192.846,180.75 L227.154,180.75 C227.491,179.636 228.393,179.111 229.5,179 z" fill="currentColor" id="waterway-canal-stroke1"/>
       <path d="M202,154 C202,154 202.535,155.846 202.344,156.75 C202.122,157.797 200.688,159.5 200.688,159.5 C200.688,159.5 199.253,161.203 199.031,162.25 C198.84,163.154 199.375,165 199.375,165 C199.375,165 199.91,166.846 199.719,167.75 C199.497,168.797 198.063,170.5 198.063,170.5 C198.063,170.5 196.628,172.203 196.406,173.25 C196.215,174.154 196.75,176 196.75,176 L223.75,176 C223.75,176 222.315,174.297 222.094,173.25 C221.903,172.346 222.438,170.5 222.438,170.5 C222.438,170.5 222.972,168.654 222.781,167.75 C222.56,166.703 221.125,165 221.125,165 C221.125,165 219.69,163.297 219.469,162.25 C219.278,161.346 219.813,159.5 219.813,159.5 C219.813,159.5 220.347,157.654 220.156,156.75 C219.935,155.703 218.5,154 218.5,154 z M208,156 L212,156 L214,158 L216,170 L212,172 L208,172 L204,170 L206,158 z M212.2,164 L213,168 L207,168 L207.8,164 z M211.6,161 L212,163 L208,163 L208.4,161 z M211,158 L211.4,160 L208.6,160 L209,158 z" fill="currentColor" id="waterway-canal-stroke2"/>
       <path d="M204,170 L216,170 L212,172 L208,172 z" fill="currentColor" id="waterway-canal-stroke3" opacity="0.601"/>
-      <path d="M231,181.5 C231,182.328 230.328,183 229.5,183 C228.672,183 228,182.328 228,181.5 C228,180.672 228.672,180 229.5,180 C230.328,180 231,180.672 231,181.5 z" fill="#FFFFFF" id="path6848"/>
-      <path d="M192,181.5 C192,182.328 191.328,183 190.5,183 C189.672,183 189,182.328 189,181.5 C189,180.672 189.672,180 190.5,180 C191.328,180 192,180.672 192,181.5 z" fill="#FFFFFF" id="path6852"/>
+      <path d="M231,181.5 C231,182.328 230.328,183 229.5,183 C228.672,183 228,182.328 228,181.5 C228,180.672 228.672,180 229.5,180 C230.328,180 231,180.672 231,181.5 z" fill="#FFFFFF"/>
+      <path d="M192,181.5 C192,182.328 191.328,183 190.5,183 C189.672,183 189,182.328 189,181.5 C189,180.672 189.672,180 190.5,180 C191.328,180 192,180.672 192,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="waterway-stream" viewBox="120 140 60 60">
       <path d="M169.5,179 C170.881,179 172,180.119 172,181.5 C172,182.881 170.881,184 169.5,184 C168.259,183.944 167.613,183.339 167.154,182.25 L132.846,182.25 C132.509,183.364 131.607,183.888 130.5,184 C129.119,184 128,182.881 128,181.5 C128,180.119 129.119,179 130.5,179 C131.741,179.056 132.387,179.661 132.846,180.75 L167.154,180.75 C167.491,179.636 168.393,179.111 169.5,179 z" fill="currentColor" id="waterway-stream-stroke1"/>
       <path d="M142.762,176 C142.762,176 142.226,174.154 142.417,173.25 C142.638,172.203 144.071,170.5 144.071,170.5 C144.071,170.5 145.505,168.797 145.726,167.75 C145.917,166.846 145.381,165 145.381,165 C145.381,165 144.845,163.154 145.036,162.25 C145.257,161.203 146.691,159.5 146.691,159.5 C146.691,159.5 148.124,157.797 148.345,156.75 C148.536,155.846 148,154 148,154 L152.5,154 C152.5,154 153.933,155.703 154.155,156.75 C154.346,157.654 153.81,159.5 153.81,159.5 C153.81,159.5 153.273,161.346 153.464,162.25 C153.686,163.297 155.119,165 155.119,165 C155.119,165 156.553,166.703 156.774,167.75 C156.965,168.654 156.429,170.5 156.429,170.5 C156.429,170.5 155.892,172.346 156.083,173.25 C156.305,174.297 157.738,176 157.738,176 z" fill="currentColor" id="waterway-stream-stroke2"/>
       <path d="M143.966,167.759 C143.751,168.559 143.145,169.092 142.612,168.949 C142.078,168.806 141.82,168.041 142.034,167.241 C142.248,166.441 142.855,165.908 143.388,166.051 C143.922,166.194 144.18,166.959 143.966,167.759 z M145.799,157.75 C146.351,156.793 146.217,155.682 145.5,155.268 C144.783,154.854 143.753,155.293 143.201,156.25 C142.649,157.207 142.783,158.318 143.5,158.732 C144.217,159.146 145.247,158.707 145.799,157.75 z M155.422,161.708 C155.208,160.908 155.467,160.143 156,160 C156.534,159.857 157.14,160.39 157.354,161.19 C157.569,161.99 157.31,162.755 156.777,162.898 C156.243,163.041 155.637,162.508 155.422,161.708 z M158.299,172.75 C157.747,171.793 157.881,170.682 158.598,170.268 C159.316,169.854 160.345,170.293 160.897,171.25 C161.449,172.207 161.316,173.318 160.598,173.732 C159.881,174.146 158.851,173.707 158.299,172.75 z" fill="currentColor" id="waterway-stream-stroke3" opacity="0.5"/>
-      <path d="M171,181.5 C171,182.328 170.328,183 169.5,183 C168.672,183 168,182.328 168,181.5 C168,180.672 168.672,180 169.5,180 C170.328,180 171,180.672 171,181.5 z" fill="#FFFFFF" id="path26188"/>
-      <path d="M132,181.5 C132,182.328 131.328,183 130.5,183 C129.672,183 129,182.328 129,181.5 C129,180.672 129.672,180 130.5,180 C131.328,180 132,180.672 132,181.5 z" fill="#FFFFFF" id="path26192"/>
+      <path d="M171,181.5 C171,182.328 170.328,183 169.5,183 C168.672,183 168,182.328 168,181.5 C168,180.672 168.672,180 169.5,180 C170.328,180 171,180.672 171,181.5 z" fill="#FFFFFF"/>
+      <path d="M132,181.5 C132,182.328 131.328,183 130.5,183 C129.672,183 129,182.328 129,181.5 C129,180.672 129.672,180 130.5,180 C131.328,180 132,180.672 132,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="waterway-river" viewBox="60 140 60 60">
       <path d="M109.5,179 C110.881,179 112,180.119 112,181.5 C112,182.881 110.881,184 109.5,184 C108.593,184.004 108.127,183.598 107.529,183 L72.471,183 C71.978,183.678 71.297,183.92 70.5,184 C69.119,184 68,182.881 68,181.5 C68,180.119 69.119,179 70.5,179 C71.407,178.996 71.873,179.402 72.471,180 L107.529,180 C108.022,179.322 108.703,179.08 109.5,179 z" fill="currentColor" id="waterway-river-stroke1"/>
       <path d="M76.762,176 C76.762,176 76.226,174.154 76.417,173.25 C76.638,172.203 78.071,170.5 78.071,170.5 C78.071,170.5 79.505,168.797 79.726,167.75 C79.917,166.846 79.381,165 79.381,165 C79.381,165 78.845,163.154 79.036,162.25 C79.257,161.203 80.691,159.5 80.691,159.5 C80.691,159.5 82.124,157.797 82.345,156.75 C82.536,155.846 82,154 82,154 L98.5,154 C98.5,154 99.933,155.703 100.155,156.75 C100.346,157.654 99.81,159.5 99.81,159.5 C99.81,159.5 99.273,161.346 99.464,162.25 C99.686,163.297 101.119,165 101.119,165 C101.119,165 102.553,166.703 102.774,167.75 C102.965,168.654 102.429,170.5 102.429,170.5 C102.429,170.5 101.892,172.346 102.083,173.25 C102.305,174.297 103.738,176 103.738,176 z" fill="currentColor" id="waterway-river-stroke2"/>
       <path d="M77.966,167.759 C77.752,168.559 77.145,169.092 76.612,168.949 C76.078,168.806 75.82,168.041 76.034,167.241 C76.248,166.441 76.855,165.908 77.388,166.051 C77.922,166.194 78.18,166.959 77.966,167.759 z M79.799,157.75 C80.351,156.793 80.217,155.682 79.5,155.268 C78.783,154.854 77.753,155.293 77.201,156.25 C76.649,157.207 76.783,158.318 77.5,158.732 C78.217,159.146 79.247,158.707 79.799,157.75 z M101.422,161.708 C101.208,160.908 101.467,160.143 102,160 C102.534,159.857 103.14,160.39 103.354,161.19 C103.569,161.99 103.31,162.755 102.777,162.898 C102.243,163.041 101.637,162.508 101.422,161.708 z M104.299,172.75 C103.747,171.793 103.881,170.682 104.598,170.268 C105.316,169.854 106.345,170.293 106.897,171.25 C107.449,172.207 107.316,173.318 106.598,173.732 C105.881,174.146 104.851,173.707 104.299,172.75 z" fill="currentColor" id="waterway-river-stroke3" opacity="0.5"/>
-      <path d="M111,181.5 C111,182.328 110.328,183 109.5,183 C108.672,183 108,182.328 108,181.5 C108,180.672 108.672,180 109.5,180 C110.328,180 111,180.672 111,181.5 z" fill="#FFFFFF" id="path26105"/>
-      <path d="M72,181.5 C72,182.328 71.328,183 70.5,183 C69.672,183 69,182.328 69,181.5 C69,180.672 69.672,180 70.5,180 C71.328,180 72,180.672 72,181.5 z" fill="#FFFFFF" id="path26109"/>
+      <path d="M111,181.5 C111,182.328 110.328,183 109.5,183 C108.672,183 108,182.328 108,181.5 C108,180.672 108.672,180 109.5,180 C110.328,180 111,180.672 111,181.5 z" fill="#FFFFFF"/>
+      <path d="M72,181.5 C72,182.328 71.328,183 70.5,183 C69.672,183 69,182.328 69,181.5 C69,180.672 69.672,180 70.5,180 C71.328,180 72,180.672 72,181.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="railway-monorail" viewBox="0 140 60 60">
       <path d="M49.5,179 C50.881,179 52,180.119 52,181.5 C52,182.881 50.881,184 49.5,184 C48.593,184.004 48.127,183.598 47.529,183 L12.471,183 C11.978,183.678 11.297,183.92 10.5,184 C9.119,184 8,182.881 8,181.5 C8,180.119 9.119,179 10.5,179 C11.407,178.996 11.873,179.402 12.471,180 L47.529,180 C48.022,179.322 48.703,179.08 49.5,179 z" fill="currentColor" id="railway-monorail-stroke"/>
       <path d="M16,181 L16,182 L12.95,182 L13,181.5 L12.95,181 L16,181 z M27,181 L22,181 L22,182 L27,182 L27,181 z M38,181 L33,181 L33,182 L38,182 L38,181 z M47.05,181 L44,181 L44,182 L47.05,182 L47,181.5 L47.05,181 z" fill="inherit" id="railway-monorail-dashes"/>
-      <path d="M50.833,181.5 C50.833,182.328 50.162,183 49.333,183 C48.505,183 47.833,182.328 47.833,181.5 C47.833,180.672 48.505,180 49.333,180 C50.162,180 50.833,180.672 50.833,181.5 z" fill="#FFFFFF" id="path7251"/>
-      <path d="M11.833,181.5 C11.833,182.328 11.162,183 10.333,183 C9.505,183 8.833,182.328 8.833,181.5 C8.833,180.672 9.505,180 10.333,180 C11.162,180 11.833,180.672 11.833,181.5 z" fill="#FFFFFF" id="path7255"/>
-      <path d="M25.833,150 L20.833,156 L20.833,169 L22.833,171 L36.833,171 L38.833,169 L38.833,156 L33.833,150 L25.833,150 z M25.833,151 L33.833,151 L33.833,153 L25.833,153 L25.833,151 z M23.833,156 L25.833,156 L33.833,156 L35.833,156 L36.833,157 L36.833,161 L33.833,161 L25.833,161 L22.833,161 L22.833,157 L23.833,156 z M22.833,164 L26.833,164 L27.833,166 L27.833,167 L23.833,167 L22.833,166 L22.833,164 z M32.833,164 L36.833,164 L36.833,166 L35.833,167 L31.833,167 L31.833,166 L32.833,164 z" fill="#989898" id="path7225"/>
-      <path d="M28.833,172 L30.833,172 L30.833,175 L28.833,175 z" fill="#B5B5B5" id="rect7259"/>
-      <path d="M30.833,171 L31.833,172 L31.833,174 L33.833,174 L33.833,171 z" fill="#989898" id="path7261"/>
-      <path d="M28.833,171 L27.833,172 L27.833,174 L25.833,174 L25.833,171 z" fill="#989898" id="path7263"/>
-      <path d="M26.833,176 L29.833,176 L32.833,176 L32.833,175 L26.833,175 z" fill="#B5B5B5" id="rect7265"/>
-    </symbol>
+      <path d="M50.833,181.5 C50.833,182.328 50.162,183 49.333,183 C48.505,183 47.833,182.328 47.833,181.5 C47.833,180.672 48.505,180 49.333,180 C50.162,180 50.833,180.672 50.833,181.5 z" fill="#FFFFFF"/>
+      <path d="M11.833,181.5 C11.833,182.328 11.162,183 10.333,183 C9.505,183 8.833,182.328 8.833,181.5 C8.833,180.672 9.505,180 10.333,180 C11.162,180 11.833,180.672 11.833,181.5 z" fill="#FFFFFF"/>
+      <path d="M22.833,171 L20.833,169 L20.833,156 L25.833,150 L33.833,150 L38.833,156 L38.833,169 L36.833,171 L33.833,171 L33.833,174 L31.833,174 L31.833,172 L30.833,171 L28.833,171 L27.833,172 L27.833,174 L25.833,174 L25.833,171 L22.833,171 z M36.833,164 L32.833,164 L31.833,166 L31.833,167 L35.833,167 L36.833,166 L36.833,164 z M26.833,164 L22.833,164 L22.833,166 L23.833,167 L27.833,167 L27.833,166 L26.833,164 z M35.833,156 L23.833,156 L22.833,157 L22.833,161 L36.833,161 L36.833,157 L35.833,156 z M33.833,151 L25.833,151 L25.833,153 L33.833,153 L33.833,151 z" fill="#989898"/>
+      <path d="M30.833,172 L30.833,175 L32.833,175 L32.833,176 L26.833,176 L26.833,175 L28.833,175 L28.833,172 L30.833,172 z" fill="#B5B5B5"/>
+    </symbol>
+    <g id="railway-tram">
+      <path d="M829.5,119 C830.881,119 832,120.119 832,121.5 C832,122.881 830.881,124 829.5,124 C828.593,124.004 828.127,123.598 827.529,123 L792.471,123 C791.978,123.678 791.297,123.92 790.5,124 C789.119,124 788,122.881 788,121.5 C788,120.119 789.119,119 790.5,119 C791.407,118.996 791.873,119.402 792.471,120 L827.529,120 C828.021,119.322 828.703,119.08 829.5,119 z" fill="#000000" id="railway-tram-stroke"/>
+      <path d="M796,121 L796,122 L792.95,122 L793,121.5 L792.95,121 L796,121 z M807,121 L802,121 L802,122 L807,122 L807,121 z M818,121 L813,121 L813,122 L818,122 L818,121 z M827.05,121 L824,121 L824,122 L827.05,122 L827,121.5 L827.05,121 z" fill="#AAAAAA" id="railway-tram-dashes"/>
+      <path d="M831,121.5 C831,122.328 830.328,123 829.5,123 C828.672,123 828,122.328 828,121.5 C828,120.672 828.672,120 829.5,120 C830.328,120 831,120.672 831,121.5 z" fill="#FFFFFF"/>
+      <path d="M792,121.5 C792,122.328 791.328,123 790.5,123 C789.672,123 789,122.328 789,121.5 C789,120.672 789.672,120 790.5,120 C791.328,120 792,120.672 792,121.5 z" fill="#FFFFFF"/>
+      <g>
+        <path d="M814,113 L815.5,117 L818,117 L816.5,113 z" fill="#989898"/>
+        <path d="M805.469,113 L804,117 L801.5,117 L802.969,113 z" fill="#989898"/>
+        <path d="M806.444,90 L802,96 L802,110 L803.778,112 L816.222,112 L818,110 L818,96 L813.556,90 L806.444,90 z M806.444,91 L813.556,91 L813.556,93 L806.444,93 L806.444,91 z M804.667,96 L806.444,96 L813.556,96 L815.333,96 L816.222,97 L816.222,101 L813.556,101 L806.444,101 L803.778,101 L803.778,97 L804.667,96 z M803.778,106 L806.444,106 L808.222,108 L808.222,109 L804.667,109 L803.778,108 L803.778,106 z M813.556,106 L816.222,106 L816.222,108 L815.333,109 L811.778,109 L811.778,108 L813.556,106 z" fill="#989898"/>
+        <path d="M805,86 L805,87 L809,87 L809,89 L811,89 L811,87 L815,87 L815,86 z" fill="#989898"/>
+      </g>
+    </g>
     <symbol id="railway-light-rail" viewBox="720 80 60 60">
       <path d="M769.5,119 C770.881,119 772,120.119 772,121.5 C772,122.881 770.881,124 769.5,124 C768.593,124.004 768.127,123.598 767.529,123 L732.471,123 C731.978,123.678 731.297,123.92 730.5,124 C729.119,124 728,122.881 728,121.5 C728,120.119 729.119,119 730.5,119 C731.407,118.996 731.873,119.402 732.471,120 L767.529,120 C768.022,119.322 768.703,119.08 769.5,119 z" fill="currentColor" id="railway-light-rail-stroke"/>
       <path d="M736,121 L736,122 L732.95,122 L733,121.5 L732.95,121 L736,121 z M747,121 L742,121 L742,122 L747,122 L747,121 z M758,121 L753,121 L753,122 L758,122 L758,121 z M767.05,121 L764,121 L764,122 L767.05,122 L767,121.5 L767.05,121 z" fill="inherit" id="railway-light-rail-dashes"/>
-      <path d="M771,121.5 C771,122.328 770.328,123 769.5,123 C768.672,123 768,122.328 768,121.5 C768,120.672 768.672,120 769.5,120 C770.328,120 771,120.672 771,121.5 z" fill="#FFFFFF" id="path26158-5"/>
-      <path d="M732,121.5 C732,122.328 731.328,123 730.5,123 C729.672,123 729,122.328 729,121.5 C729,120.672 729.672,120 730.5,120 C731.328,120 732,120.672 732,121.5 z" fill="#FFFFFF" id="path26162-0"/>
-      <path d="M755.031,113 L756,115 L757,116 L758.5,115 L757.531,113 z" fill="#989898" id="path7074"/>
-      <path d="M744.5,113 L743.531,115 L742.531,116 L741.031,115 L742,113 z" fill="#989898" id="path7096"/>
-      <path d="M746,90 L741,96 L741,110 L743,112 L757,112 L759,110 L759,96 L754,90 L746,90 z M746,91 L754,91 L754,93 L746,93 L746,91 z M744,96 L746,96 L754,96 L756,96 L757,97 L757,101 L754,101 L746,101 L743,101 L743,97 L744,96 z M743,106 L746,106 L748,108 L748,109 L744,109 L743,108 L743,106 z M754,106 L757,106 L757,108 L756,109 L752,109 L752,108 L754,106 z" fill="#989898" id="path7098"/>
-      <path d="M745,86 L745,87 L749,87 L749,89 L751,89 L751,87 L755,87 L755,86 z" fill="#B5B5B5" id="path7167"/>
+      <path d="M771,121.5 C771,122.328 770.328,123 769.5,123 C768.672,123 768,122.328 768,121.5 C768,120.672 768.672,120 769.5,120 C770.328,120 771,120.672 771,121.5 z" fill="#FFFFFF"/>
+      <path d="M732,121.5 C732,122.328 731.328,123 730.5,123 C729.672,123 729,122.328 729,121.5 C729,120.672 729.672,120 730.5,120 C731.328,120 732,120.672 732,121.5 z" fill="#FFFFFF"/>
+      <g>
+        <path d="M742.5,112 L745.833,112 L745,113.488 L755,113.488 L754.167,112 L757.5,112 L760,116.464 L756.667,116.464 L755.833,114.976 L744.167,114.976 L743.333,116.464 L740,116.464 L742.5,112 z" fill="#989898"/>
+        <path d="M745.111,90 L739,95.727 L739,109.091 L741.444,111 L758.556,111 L761,109.091 L761,95.727 L754.889,90 L745.111,90 z M745.111,90.955 L754.889,90.955 L754.889,92.864 L745.111,92.864 L745.111,90.955 z M742.667,95.727 L745.111,95.727 L754.889,95.727 L757.333,95.727 L758.556,96.682 L758.556,100.5 L754.889,100.5 L745.111,100.5 L741.444,100.5 L741.444,96.682 L742.667,95.727 z M741.444,105.273 L745.111,105.273 L747.556,107.182 L747.556,108.136 L742.667,108.136 L741.444,107.182 L741.444,105.273 z M754.889,105.273 L758.556,105.273 L758.556,107.182 L757.333,108.136 L752.444,108.136 L752.444,107.182 L754.889,105.273 z" fill="#989898"/>
+        <path d="M745,86 L745,87 L749,87 L749,89 L751,89 L751,87 L755,87 L755,86 z" fill="#989898"/>
+      </g>
     </symbol>
     <symbol id="railway-subway" viewBox="660 80 60 60">
       <path d="M709.5,119 C710.881,119 712,120.119 712,121.5 C712,122.881 710.881,124 709.5,124 C708.593,124.004 708.127,123.598 707.529,123 L672.471,123 C671.978,123.678 671.297,123.92 670.5,124 C669.119,124 668,122.881 668,121.5 C668,120.119 669.119,119 670.5,119 C671.407,118.996 671.873,119.402 672.471,120 L707.529,120 C708.021,119.322 708.703,119.08 709.5,119 z" fill="currentColor" id="railway-subway-stroke"/>
       <path d="M676,121 L676,122 L672.95,122 L673,121.5 L672.95,121 L676,121 z M687,121 L682,121 L682,122 L687,122 L687,121 z M698,121 L693,121 L693,122 L698,122 L698,121 z M707.05,121 L704,121 L704,122 L707.05,122 L707,121.5 L707.05,121 z" fill="inherit" id="railway-subway-dashes"/>
-      <path d="M696.031,113 L697,115 L698,116 L699.5,115 L698.531,113 z" fill="#989898" id="path4893"/>
-      <path d="M711,121.5 C711,122.328 710.328,123 709.5,123 C708.672,123 708,122.328 708,121.5 C708,120.672 708.672,120 709.5,120 C710.328,120 711,120.672 711,121.5 z" fill="#FFFFFF" id="path4909"/>
-      <path d="M672,121.5 C672,122.328 671.328,123 670.5,123 C669.672,123 669,122.328 669,121.5 C669,120.672 669.672,120 670.5,120 C671.328,120 672,120.672 672,121.5 z" fill="#FFFFFF" id="path4913"/>
-      <path d="M683.5,113 L682.531,115 L681.531,116 L680.031,115 L681,113 z" fill="#989898" id="path5119"/>
-      <path d="M685,89 L679,95 L679,110 L681,112 L699,112 L701,110 L701,95 L695,89 L685,89 z M686,91 L694,91 L694,93 L686,93 L686,91 z M682,95 L684,95 L696,95 L698,95 L699,96 L699,100 L696,102 L684,102 L681,100 L681,96 L682,95 z M681,106 L684,106 L686,108 L686,109 L682,109 L681,108 L681,106 z M696,106 L699,106 L699,108 L698,109 L694,109 L694,108 L696,106 z" fill="#989898" id="rect5077"/>
-      <path d="M683,84 C678,84 674,87 674,93 L674,113 L677,112 L677,93 C677,89 680,87 683,87 L689,87 L691,87 L697,87 C700,87 703,89 703,93 L703,112 L706,113 L706,93 C706,87 701.932,84.822 697,84 L691,84 L689,84 z" fill="#B5B5B5" id="rect5093"/>
+      <path d="M711,121.5 C711,122.328 710.328,123 709.5,123 C708.672,123 708,122.328 708,121.5 C708,120.672 708.672,120 709.5,120 C710.328,120 711,120.672 711,121.5 z" fill="#FFFFFF"/>
+      <path d="M672,121.5 C672,122.328 671.328,123 670.5,123 C669.672,123 669,122.328 669,121.5 C669,120.672 669.672,120 670.5,120 C671.328,120 672,120.672 672,121.5 z" fill="#FFFFFF"/>
+      <g>
+        <path d="M682.5,112 L685.833,112 L685,113.488 L695,113.488 L694.167,112 L697.5,112 L700,116.464 L696.667,116.464 L695.833,114.976 L684.167,114.976 L683.333,116.464 L680,116.464 L682.5,112 z" fill="#989898"/>
+        <path d="M685,89 L679,94.739 L679,109.087 L681,111 L699,111 L701,109.087 L701,94.739 L695,89 L685,89 z M686,90.913 L694,90.913 L694,92.826 L686,92.826 L686,90.913 z M682,94.739 L684,94.739 L696,94.739 L698,94.739 L699,95.696 L699,99.522 L696,101.435 L684,101.435 L681,99.522 L681,95.696 L682,94.739 z M681,105.261 L684,105.261 L686,107.174 L686,108.13 L682,108.13 L681,107.174 L681,105.261 z M696,105.261 L699,105.261 L699,107.174 L698,108.13 L694,108.13 L694,107.174 L696,105.261 z" fill="#989898"/>
+        <path d="M683,84 C678,84 674,87 674,93 L674,113 L677,112 L677,93 C677,89 680,87 683,87 L689,87 L691,87 L697,87 C700,87 703,89 703,93 L703,112 L706,113 L706,93 C706,87 701.932,84.822 697,84 L691,84 L689,84 z" fill="#B5B5B5"/>
+      </g>
     </symbol>
     <symbol id="railway-abandoned" viewBox="600 80 60 60">
       <g id="railway-abandoned-base">
       <path d="M630.803,111.655 L636.446,111.686 L636.083,111 L634.495,108 L633.678,106.457 L634.976,106.351 L634.154,105 L632.898,102.936 L634.198,102.83 L633.6,102 L631.438,99 L631.429,98.988 L632.642,98.881 L631.066,96 L629.959,93.973 L629.933,94.095 L629.933,93.937 L628.806,96 L627.253,98.844 L628.465,98.95 L628.429,99 L626.267,102 L625.696,102.792 L626.993,102.897 L625.716,105 L624.919,106.313 L626.217,106.42 L625.38,108 L623.792,111 L623.448,111.649 L625.721,111.618 L625.718,111.627 L629.188,111.646 L629.188,112.147 L629.188,112.649 L629.188,116.023 L630.813,116.023 L630.805,112.658 L630.804,112.156 z" fill="#555555" id="railway-abandoned-tree"/>
       <path d="M649.5,118.937 C650.881,118.937 652,120.056 652,121.437 C652,122.818 650.881,123.937 649.5,123.937 C648.593,123.941 648.127,123.535 647.529,122.937 L612.471,122.937 C611.978,123.615 611.297,123.857 610.5,123.937 C609.119,123.937 608,122.818 608,121.437 C608,120.056 609.119,118.937 610.5,118.937 C611.407,118.933 611.873,119.339 612.471,119.937 L647.529,119.937 C648.022,119.259 648.703,119.017 649.5,118.937 z" fill="currentColor" id="railway-abandoned-stroke"/>
       <path d="M616,120.937 L616,121.937 L612.95,121.937 L613,121.437 L612.95,120.937 L616,120.937 z M627,120.937 L622,120.937 L622,121.937 L627,121.937 L627,120.937 z M638,120.937 L633,120.937 L633,121.937 L638,121.937 L638,120.937 z M647.05,120.937 L644,120.937 L644,121.937 L647.05,121.937 L647,121.437 L647.05,120.937 z" fill="inherit" id="railway-abandoned-dashes"/>
-      <path d="M651,121.437 C651,122.265 650.328,122.937 649.5,122.937 C648.672,122.937 648,122.265 648,121.437 C648,120.609 648.672,119.937 649.5,119.937 C650.328,119.937 651,120.609 651,121.437 z" fill="#FFFFFF" id="path4201"/>
-      <path d="M612,121.437 C612,122.265 611.328,122.937 610.5,122.937 C609.672,122.937 609,122.265 609,121.437 C609,120.609 609.672,119.937 610.5,119.937 C611.328,119.937 612,120.609 612,121.437 z" fill="#FFFFFF" id="path4205"/>
+      <path d="M651,121.437 C651,122.265 650.328,122.937 649.5,122.937 C648.672,122.937 648,122.265 648,121.437 C648,120.609 648.672,119.937 649.5,119.937 C650.328,119.937 651,120.609 651,121.437 z" fill="#FFFFFF"/>
+      <path d="M612,121.437 C612,122.265 611.328,122.937 610.5,122.937 C609.672,122.937 609,122.265 609,121.437 C609,120.609 609.672,119.937 610.5,119.937 C611.328,119.937 612,120.609 612,121.437 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="railway-disused" viewBox="540 80 60 60">
       <g id="railway-disused-base">
       </g>
       <path d="M589.502,119 C590.883,119 592.002,120.119 592.002,121.5 C592.002,122.881 590.883,124 589.502,124 C588.595,124.004 588.129,123.598 587.531,123 L552.47,123 C551.978,123.678 551.296,123.92 550.499,124 C549.118,124 547.999,122.881 547.999,121.5 C547.999,120.119 549.118,119 550.499,119 C551.406,118.996 551.872,119.402 552.47,120 L587.531,120 C588.023,119.322 588.705,119.08 589.502,119 z" fill="currentColor" id="railway-disused-stroke"/>
       <path d="M556.002,121 L556.002,122 L552.952,122 L553.002,121.5 L552.952,121 L556.002,121 z M567.002,121 L562.002,121 L562.002,122 L567.002,122 L567.002,121 z M578.002,121 L573.002,121 L573.002,122 L578.002,122 L578.002,121 z M587.052,121 L584.002,121 L584.002,122 L587.052,122 L587.002,121.5 L587.052,121 z" fill="inherit" id="railway-disused-dashes"/>
-      <path d="M591.002,121.5 C591.002,122.328 590.33,123 589.502,123 C588.674,123 588.002,122.328 588.002,121.5 C588.002,120.672 588.674,120 589.502,120 C590.33,120 591.002,120.672 591.002,121.5 z" fill="#FFFFFF" id="path7058"/>
-      <path d="M552.002,121.5 C552.002,122.328 551.33,123 550.502,123 C549.674,123 549.002,122.328 549.002,121.5 C549.002,120.672 549.674,120 550.502,120 C551.33,120 552.002,120.672 552.002,121.5 z" fill="#FFFFFF" id="path7062"/>
+      <path d="M591.002,121.5 C591.002,122.328 590.33,123 589.502,123 C588.674,123 588.002,122.328 588.002,121.5 C588.002,120.672 588.674,120 589.502,120 C590.33,120 591.002,120.672 591.002,121.5 z" fill="#FFFFFF"/>
+      <path d="M552.002,121.5 C552.002,122.328 551.33,123 550.502,123 C549.674,123 549.002,122.328 549.002,121.5 C549.002,120.672 549.674,120 550.502,120 C551.33,120 552.002,120.672 552.002,121.5 z" fill="#FFFFFF"/>
       <g id="railway-disused-weed">
         <path d="M564.408,111.625 C567.446,114.703 566.786,116.01 566.786,116.01 C566.786,116.01 566.997,116.049 568.455,116.049 C568.574,112.92 566.162,112.188 564.408,111.625 z" fill="#555555"/>
         <path d="M570.979,116.031 C571.025,114.017 570.715,112.403 570.23,111.109 C569.739,109.8 569.068,108.827 568.397,108.109 C567.121,106.744 565.851,106.309 565.851,106.309 C566.476,106.836 566.979,107.453 567.401,108.109 C568.013,109.061 568.436,110.099 568.722,111.109 C569.454,113.69 569.325,116.044 569.325,116.044 C569.325,116.044 569.897,116.031 570.979,116.031 z" fill="#555555"/>
     <symbol id="railway-rail" viewBox="480 80 60 60">
       <path d="M529.5,119 C530.881,119 532,120.119 532,121.5 C532,122.881 530.881,124 529.5,124 C528.593,124.004 528.127,123.598 527.529,123 L492.471,123 C491.978,123.678 491.297,123.92 490.5,124 C489.119,124 488,122.881 488,121.5 C488,120.119 489.119,119 490.5,119 C491.407,118.996 491.873,119.402 492.471,120 L527.529,120 C528.022,119.322 528.703,119.08 529.5,119 z" fill="currentColor" id="railway-rail-stroke"/>
       <path d="M496,121 L496,122 L492.95,122 L493,121.5 L492.95,121 L496,121 z M507,121 L502,121 L502,122 L507,122 L507,121 z M518,121 L513,121 L513,122 L518,122 L518,121 z M527.05,121 L524,121 L524,122 L527.05,122 L527,121.5 L527.05,121 z" fill="inherit" id="railway-rail-dashes"/>
-      <path d="M531,121.5 C531,122.328 530.328,123 529.5,123 C528.672,123 528,122.328 528,121.5 C528,120.672 528.672,120 529.5,120 C530.328,120 531,120.672 531,121.5 z" fill="#FFFFFF" id="path26158"/>
-      <path d="M492,121.5 C492,122.328 491.328,123 490.5,123 C489.672,123 489,122.328 489,121.5 C489,120.672 489.672,120 490.5,120 C491.328,120 492,120.672 492,121.5 z" fill="#FFFFFF" id="path26162"/>
-      <path d="M503.5,93 L502,94 L501.531,96 L498.25,96 C497.696,96 497.384,96.463 497.25,97 L497,98 C496.866,98.537 497.446,99 498,99 L522,99 C522.554,99 523.134,98.537 523,98 L522.75,97 C522.616,96.463 522.304,96 521.75,96 L518.969,96 L518.5,94 L517,93 L516,94 L516.469,96 L504.031,96 L504.5,94 L503.5,93 z M501.5,97 C501.776,97 502,97.224 502,97.5 C502,97.776 501.776,98 501.5,98 C501.224,98 501,97.776 501,97.5 C501,97.224 501.224,97 501.5,97 z M518.5,97 C518.776,97 519,97.224 519,97.5 C519,97.776 518.776,98 518.5,98 C518.224,98 518,97.776 518,97.5 C518,97.224 518.224,97 518.5,97 z M500.563,100 L500.094,102 L497.25,102 C496.696,102 496.384,102.463 496.25,103 L496,104 C495.866,104.537 496.446,105 497,105 L523,105 C523.554,105 524.134,104.537 524,104 L523.75,103 C523.616,102.463 523.304,102 522.75,102 L520.406,102 L519.938,100 L517.438,100 L517.906,102 L502.594,102 L503.063,100 L500.563,100 z M500.5,103 C500.776,103 501,103.224 501,103.5 C501,103.776 500.776,104 500.5,104 C500.224,104 500,103.776 500,103.5 C500,103.224 500.224,103 500.5,103 z M519.5,103 C519.776,103 520,103.224 520,103.5 C520,103.776 519.776,104 519.5,104 C519.224,104 519,103.776 519,103.5 C519,103.224 519.224,103 519.5,103 z M499.156,106 L498.688,108 L496.25,108 C495.696,108 495.384,108.463 495.25,109 L495,110 C494.866,110.537 495.446,111 496,111 L524,111 C524.554,111 525.134,110.537 525,110 L524.75,109 C524.616,108.463 524.304,108 523.75,108 L521.813,108 L521.344,106 L518.844,106 L519.313,108 L501.188,108 L501.656,106 L499.156,106 z M499.5,109 C499.776,109 500,109.224 500,109.5 C500,109.776 499.776,110 499.5,110 C499.224,110 499,109.776 499,109.5 C499,109.224 499.224,109 499.5,109 z M520.5,109 C520.776,109 521,109.224 521,109.5 C521,109.776 520.776,110 520.5,110 C520.224,110 520,109.776 520,109.5 C520,109.224 520.224,109 520.5,109 z M497.719,112 L497,115 L498.5,116 L499.5,115 L500.219,112 L497.719,112 z M520.281,112 L521,115 L522,116 L523.5,115 L522.781,112 L520.281,112 z" fill="#989898" id="rect17528-7"/>
+      <path d="M531,121.5 C531,122.328 530.328,123 529.5,123 C528.672,123 528,122.328 528,121.5 C528,120.672 528.672,120 529.5,120 C530.328,120 531,120.672 531,121.5 z" fill="#FFFFFF"/>
+      <path d="M492,121.5 C492,122.328 491.328,123 490.5,123 C489.672,123 489,122.328 489,121.5 C489,120.672 489.672,120 490.5,120 C491.328,120 492,120.672 492,121.5 z" fill="#FFFFFF"/>
+      <path d="M503.5,93 L502,94 L501.531,96 L498.25,96 C497.696,96 497.384,96.463 497.25,97 L497,98 C496.866,98.537 497.446,99 498,99 L522,99 C522.554,99 523.134,98.537 523,98 L522.75,97 C522.616,96.463 522.304,96 521.75,96 L518.969,96 L518.5,94 L517,93 L516,94 L516.469,96 L504.031,96 L504.5,94 L503.5,93 z M501.5,97 C501.776,97 502,97.224 502,97.5 C502,97.776 501.776,98 501.5,98 C501.224,98 501,97.776 501,97.5 C501,97.224 501.224,97 501.5,97 z M518.5,97 C518.776,97 519,97.224 519,97.5 C519,97.776 518.776,98 518.5,98 C518.224,98 518,97.776 518,97.5 C518,97.224 518.224,97 518.5,97 z M500.563,100 L500.094,102 L497.25,102 C496.696,102 496.384,102.463 496.25,103 L496,104 C495.866,104.537 496.446,105 497,105 L523,105 C523.554,105 524.134,104.537 524,104 L523.75,103 C523.616,102.463 523.304,102 522.75,102 L520.406,102 L519.938,100 L517.438,100 L517.906,102 L502.594,102 L503.063,100 L500.563,100 z M500.5,103 C500.776,103 501,103.224 501,103.5 C501,103.776 500.776,104 500.5,104 C500.224,104 500,103.776 500,103.5 C500,103.224 500.224,103 500.5,103 z M519.5,103 C519.776,103 520,103.224 520,103.5 C520,103.776 519.776,104 519.5,104 C519.224,104 519,103.776 519,103.5 C519,103.224 519.224,103 519.5,103 z M499.156,106 L498.688,108 L496.25,108 C495.696,108 495.384,108.463 495.25,109 L495,110 C494.866,110.537 495.446,111 496,111 L524,111 C524.554,111 525.134,110.537 525,110 L524.75,109 C524.616,108.463 524.304,108 523.75,108 L521.813,108 L521.344,106 L518.844,106 L519.313,108 L501.188,108 L501.656,106 L499.156,106 z M499.5,109 C499.776,109 500,109.224 500,109.5 C500,109.776 499.776,110 499.5,110 C499.224,110 499,109.776 499,109.5 C499,109.224 499.224,109 499.5,109 z M520.5,109 C520.776,109 521,109.224 521,109.5 C521,109.776 520.776,110 520.5,110 C520.224,110 520,109.776 520,109.5 C520,109.224 520.224,109 520.5,109 z M497.719,112 L497,115 L498.5,116 L499.5,115 L500.219,112 L497.719,112 z M520.281,112 L521,115 L522,116 L523.5,115 L522.781,112 L520.281,112 z" fill="#989898"/>
     </symbol>
     <symbol id="highway-steps" viewBox="420 80 60 60">
       <path d="M447,94 L447,96 L446,98 L446,100 L445,102 L445,104 L444,106 L444,108 L443,110 L443,112 L442,114 L442,116 L450,116 L458,116 L458,114 L457,112 L457,110 L456,108 L456,106 L455,104 L455,102 L454,100 L454,98 L453,96 L453,94 L450,94 L447,94 z" fill="currentColor" id="highway-steps-stroke3" opacity="0.496"/>
       <path d="M443,112 L443,110 L457,110 L457,112 z M458,116 L458,114 L442,114 L442,116 z M456,108 L456,106 L444,106 L444,108 z M455,104 L455,102 L445,102 L445,104 z M454,100 L454,98 L446,98 L446,100 z M453,96 L453,94 L447,94 L447,96 z" fill="currentColor" id="highway-steps-stroke2"/>
       <path d="M469.5,119 C470.881,119 472,120.119 472,121.5 C472,122.881 470.881,124 469.5,124 C468.593,124.004 468.127,123.598 467.529,123 L432.471,123 C431.978,123.678 431.297,123.92 430.5,124 C429.119,124 428,122.881 428,121.5 C428,120.119 429.119,119 430.5,119 C431.407,118.996 431.873,119.402 432.471,120 L467.529,120 C468.022,119.322 468.703,119.08 469.5,119 z" fill="currentColor" id="highway-steps-stroke1"/>
       <path d="M463,121 L466,121 L466,122 L463,122 z M453,122 L456,122 L456,121 L453,121 z M443,122 L446,122 L446,121 L443,121 z M433,122 L436,122 L436,121 L433,121 z M438,122 L441,122 L441,121 L438,121 z M448,122 L451,122 L451,121 L448,121 z M458,122 L461,122 L461,121 L458,121 z" fill="inherit" id="highway-steps-dashes"/>
-      <path d="M471,121.5 C471,122.328 470.328,123 469.5,123 C468.672,123 468,122.328 468,121.5 C468,120.672 468.672,120 469.5,120 C470.328,120 471,120.672 471,121.5 z" fill="#FFFFFF" id="path26138-3"/>
-      <path d="M432,121.5 C432,122.328 431.328,123 430.5,123 C429.672,123 429,122.328 429,121.5 C429,120.672 429.672,120 430.5,120 C431.328,120 432,120.672 432,121.5 z" fill="#FFFFFF" id="path26142-8"/>
+      <path d="M471,121.5 C471,122.328 470.328,123 469.5,123 C468.672,123 468,122.328 468,121.5 C468,120.672 468.672,120 469.5,120 C470.328,120 471,120.672 471,121.5 z" fill="#FFFFFF"/>
+      <path d="M432,121.5 C432,122.328 431.328,123 430.5,123 C429.672,123 429,122.328 429,121.5 C429,120.672 429.672,120 430.5,120 C431.328,120 432,120.672 432,121.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="highway-bridleway" viewBox="360 80 60 60">
       <path d="M389.5,86 C388.119,86 387,87.119 387,88.5 C387,89.881 388.119,91 389.5,91 C390.881,91 392,89.881 392,88.5 C392,87.119 390.881,86 389.5,86 z M403,89.156 L400,93 L395.719,98 L395,98 L393,98 L392,97.656 L392,93 C392,92.446 391.554,92 391,92 L388,92 C387.446,92 387,92.446 387,93 L387,97 L385,97 L381,97 L377,101 L376,107 L378,107 L379,105 L380,102 L381,100.656 L381,104.156 L379,108.5 L379,114 C379,115 379,116 380.5,116 C382,116 382,115 382,114 L382,108.5 L383.156,106 L385,106 L385,108.5 L387.5,114.5 C387.751,115.435 388.405,116 389.25,116 C390.059,116 390.346,115.124 390,114 L388,108.5 L388,106.188 L391,107 L395,107 L395,114 C395,114.5 395,116 396.5,116 C398,116 398,114.5 398,114 L398,107 L403,98 L405,98 L407,99 L408,98 L408,96 L404,93 L403,93 z M387,98 L390,98 L393,101 L393,105 L392,106 L391,105 L391,102 L387,99 z" fill="currentColor" id="highway-bridleway-stroke2"/>
       <path d="M409.5,119 C410.881,119 412,120.119 412,121.5 C412,122.881 410.881,124 409.5,124 C408.593,124.004 408.127,123.598 407.529,123 L372.471,123 C371.978,123.678 371.297,123.92 370.5,124 C369.119,124 368,122.881 368,121.5 C368,120.119 369.119,119 370.5,119 C371.407,118.996 371.873,119.402 372.471,120 L407.529,120 C408.022,119.322 408.703,119.08 409.5,119 z" fill="currentColor" id="highway-bridleway-stroke1"/>
       <path d="M376,121 L376,122 L372.95,122 L373,121.5 L372.95,121 L376,121 z M387,121 L382,121 L382,122 L387,122 L387,121 z M398,121 L393,121 L393,122 L398,122 L398,121 z M407.05,121 L404,121 L404,122 L407.05,122 L407,121.5 L407.05,121 z" fill="inherit" id="highway-bridleway-dashes"/>
-      <path d="M411,121.5 C411,122.328 410.328,123 409.5,123 C408.672,123 408,122.328 408,121.5 C408,120.672 408.672,120 409.5,120 C410.328,120 411,120.672 411,121.5 z" fill="#FFFFFF" id="path5205"/>
-      <path d="M372,121.5 C372,122.328 371.328,123 370.5,123 C369.672,123 369,122.328 369,121.5 C369,120.672 369.672,120 370.5,120 C371.328,120 372,120.672 372,121.5 z" fill="#FFFFFF" id="path5209"/>
+      <path d="M411,121.5 C411,122.328 410.328,123 409.5,123 C408.672,123 408,122.328 408,121.5 C408,120.672 408.672,120 409.5,120 C410.328,120 411,120.672 411,121.5 z" fill="#FFFFFF"/>
+      <path d="M372,121.5 C372,122.328 371.328,123 370.5,123 C369.672,123 369,122.328 369,121.5 C369,120.672 369.672,120 370.5,120 C371.328,120 372,120.672 372,121.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="highway-footway" viewBox="300 80 60 60">
       <path d="M332,94.5 C332,95.881 330.881,97 329.5,97 C328.119,97 327,95.881 327,94.5 C327,93.119 328.119,92 329.5,92 C330.881,92 332,93.119 332,94.5 z M327,98 L328,98 L328.5,98 L337,104.5 L337,106 L336,106 L331,102.125 L331,106 L333,110 L335,115 L334,116 L333,116 L331,111 L327,105 L327,100.344 L324.5,102.5 L322.5,106 L321,106 L321,105 L322.5,102 L327,98 z M327.844,108.406 L325.531,116 L324.5,116 L323.5,115 L326.313,106.562 z" fill="currentColor" id="highway-footway-stroke2"/>
       <path d="M349.5,119 C350.881,119 352,120.119 352,121.5 C352,122.881 350.881,124 349.5,124 C348.593,124.004 348.127,123.598 347.529,123 L312.471,123 C311.978,123.678 311.297,123.92 310.5,124 C309.119,124 308,122.881 308,121.5 C308,120.119 309.119,119 310.5,119 C311.407,118.996 311.873,119.402 312.471,120 L347.529,120 C348.022,119.322 348.703,119.08 349.5,119 z" fill="currentColor" id="highway-footway-stroke1"/>
       <path d="M316,121 L316,122 L312.95,122 L313,121.5 L312.95,121 L316,121 z M327,121 L322,121 L322,122 L327,122 L327,121 z M338,121 L333,121 L333,122 L338,122 L338,121 z M347.05,121 L344,121 L344,122 L347.05,122 L347,121.5 L347.05,121 z" fill="inherit" id="highway-footway-dashes"/>
-      <path d="M351,121.5 C351,122.328 350.328,123 349.5,123 C348.672,123 348,122.328 348,121.5 C348,120.672 348.672,120 349.5,120 C350.328,120 351,120.672 351,121.5 z" fill="#FFFFFF" id="path26138"/>
-      <path d="M312,121.5 C312,122.328 311.328,123 310.5,123 C309.672,123 309,122.328 309,121.5 C309,120.672 309.672,120 310.5,120 C311.328,120 312,120.672 312,121.5 z" fill="#FFFFFF" id="path26142"/>
+      <path d="M351,121.5 C351,122.328 350.328,123 349.5,123 C348.672,123 348,122.328 348,121.5 C348,120.672 348.672,120 349.5,120 C350.328,120 351,120.672 351,121.5 z" fill="#FFFFFF"/>
+      <path d="M312,121.5 C312,122.328 311.328,123 310.5,123 C309.672,123 309,122.328 309,121.5 C309,120.672 309.672,120 310.5,120 C311.328,120 312,120.672 312,121.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="highway-cycleway" viewBox="240 80 60 60">
       <path d="M263.594,94 L263.594,96 L264.438,96 L265,99 L262.5,99 L257,109 L257,110 L258,111 L269,111 L276.563,101.531 L280.5,110 L281,110 L282,110 L282,109 L276,96 L279,96 L279,95 L278,94 L274,94 L274,96 L275.406,99 L267.063,99 L266.5,96 L268.594,96 L268.594,95 L267.594,94 L263.594,94 z M263.5,101 L265.5,101 L267.5,109 L259,109 L263.5,101 z M267.5,101 L274.5,101 L269,107.5 L267.5,101 z M258.5,103 C254.91,103 252,105.91 252,109.5 C252,113.09 254.91,116 258.5,116 C261.203,116 263.52,114.347 264.5,112 L262.25,112 C261.444,113.216 260.068,114 258.5,114 C256.015,114 254,111.985 254,109.5 C254,107.176 255.77,105.301 258.031,105.062 L259.156,103.031 C258.938,103.009 258.724,103 258.5,103 z M280.344,103 L281.281,105.094 C283.392,105.466 285,107.283 285,109.5 C285,111.985 282.985,114 280.5,114 C278.015,114 276,111.985 276,109.5 C276,108.126 276.623,106.919 277.594,106.094 L276.719,104.219 C275.076,105.398 274,107.324 274,109.5 C274,113.09 276.91,116 280.5,116 C284.09,116 287,113.09 287,109.5 C287,105.91 284.09,103 280.5,103 C280.447,103 280.397,102.999 280.344,103 z M262.687,104.531 L261.687,106.312 C262.154,106.779 262.492,107.366 262.719,108 L264.812,108 C264.488,106.628 263.728,105.413 262.687,104.531 z" fill="currentColor" id="highway-cycleway-stroke2"/>
       <path d="M289.5,119 C290.881,119 292,120.119 292,121.5 C292,122.881 290.881,124 289.5,124 C288.593,124.004 288.127,123.598 287.529,123 L252.471,123 C251.978,123.678 251.297,123.92 250.5,124 C249.119,124 248,122.881 248,121.5 C248,120.119 249.119,119 250.5,119 C251.407,118.996 251.873,119.402 252.471,120 L287.529,120 C288.022,119.322 288.703,119.08 289.5,119 z" fill="currentColor" id="highway-cycleway-stroke1"/>
       <path d="M256,121 L256,122 L252.95,122 L253,121.5 L252.95,121 L256,121 z M267,121 L262,121 L262,122 L267,122 L267,121 z M278,121 L273,121 L273,122 L278,122 L278,121 z M287.05,121 L284,121 L284,122 L287.05,122 L287,121.5 L287.05,121 z" fill="inherit" id="highway-cycleway-dashes"/>
-      <path d="M291,121.5 C291,122.328 290.328,123 289.5,123 C288.672,123 288,122.328 288,121.5 C288,120.672 288.672,120 289.5,120 C290.328,120 291,120.672 291,121.5 z" fill="#FFFFFF" id="path26166"/>
-      <path d="M252,121.5 C252,122.328 251.328,123 250.5,123 C249.672,123 249,122.328 249,121.5 C249,120.672 249.672,120 250.5,120 C251.328,120 252,120.672 252,121.5 z" fill="#FFFFFF" id="path26170"/>
+      <path d="M291,121.5 C291,122.328 290.328,123 289.5,123 C288.672,123 288,122.328 288,121.5 C288,120.672 288.672,120 289.5,120 C290.328,120 291,120.672 291,121.5 z" fill="#FFFFFF"/>
+      <path d="M252,121.5 C252,122.328 251.328,123 250.5,123 C249.672,123 249,122.328 249,121.5 C249,120.672 249.672,120 250.5,120 C251.328,120 252,120.672 252,121.5 z" fill="#FFFFFF"/>
     </symbol>
     <symbol id="highway-path" viewBox="180 80 60 60">
       <path d="M229.5,119 C230.881,119 232,120.119 232,121.5 C232,122.881 230.881,124 229.5,124 C228.593,124.004 228.127,123.598 227.529,123 L192.471,123 C191.978,123.678 191.297,123.92 190.5,124 C189.119,124 188,122.881 188,121.5 C188,120.119 189.119,119 190.5,119 C191.407,118.996 191.873,119.402 192.471,120 L227.529,120 C228.022,119.322 228.703,119.08 229.5,119 z" fill="currentColor" id="highway-path-stroke1"/>
       <path d="M196,121 L196,122 L192.95,122 L193,121.5 L192.95,121 L196,121 z M207,121 L202,121 L202,122 L207,122 L207,121 z M218,121 L213,121 L213,122 L218,122 L218,121 z M227.05,121 L224,121 L224,122 L227.05,122 L227,121.5 L227.05,121 z" fill="inherit" id="highway-path-dashes"/>
-      <path d="M231,121.5 C231,122.328 230.328,123 229.5,123 C228.672,123 228,122.328 228,121.5 C228,120.672 228.672,120 229.5,120 C230.328,120 231,120.672 231,121.5 z" fill="#FFFFFF" id="path5032"/>
-      <path d="M192,121.5 C192,122.328 191.328,123 190.5,123 C189.672,123 189,122.328 189,121.5 C189,120.672 189.672,120 190.5,120 C191.328,120 192,120.672 192,121.5 z" fill="#FFFFFF" id="path5036"/>
+      <path d="M231,121.5 C231,122.328 230.328,123 229.5,123 C228.672,123 228,122.328 228,121.5 C228,120.672 228.672,120 229.5,120 C230.328,120 231,120.672 231,121.5 z" fill="#FFFFFF"/>
+      <path d="M192,121.5 C192,122.328 191.328,123 190.5,123 C189.672,123 189,122.328 189,121.5 C189,120.672 189.672,120 190.5,120 C191.328,120 192,120.672 192,121.5 z" fill="#FFFFFF"/>
       <path d="M202,116 L205,105 L208,94 L212,94 L215,105 L218,116 z" fill="currentColor" id="highway-path-stroke2"/>
     </symbol>
     <symbol id="highway-living-street" viewBox="120 80 60 60">
-      <path d="M142.5,95 L139.625,101 L138,101 L137,102 L137,104 L138.406,104 L138,105 L138,110 L138,111 L138,111 C138,111 138.608,111.608 139,112 L140,112 L144,112 L146,113 L154,113 L156,112 L160,112 L161,112 L162,111 L162,111 L162,110 L162,105 L161.594,104 L163,104 L163,102 L162,101 L160.375,101 L157.5,95 z M143.5,98 L156.5,98 L158,102 L157,103 L143,103 L142,102 z M141,106 L144,106 L145,108 L145,109 L141,109 L140,108 L140,107 z M156,106 L159,106 L160,107 L160,108 L159,109 L155,109 L155,108 z M139,113 L139,115 L140,116 L143,116 L144,115 L144,113 z M156,113 L156,115 L157,116 L160,116 L161,115 L161,113 z" fill="#989898" id="path25561"/>
-      <path d="M136,112.625 L136,114.125 L131,116 L127,116 z" fill="#989898" id="path25567"/>
-      <path d="M138,92 L134,93.5 L134,111.375 L127,114 L127,101.625 L130,100.5 L130,96.5 L129,96.875 L127,97.625 L127,96.5 L127,87 z" fill="#B5B5B5" id="path25569"/>
-      <path d="M170,89 L169,90 L169,92 L170,93 L172,93 L173,92 L173,90 L172,89 z M169,94 L168,95 L163,100 L165.5,100 L168,97.5 L168,102 L168,109 L169,109 L170,108 L170,102 L172.188,102 L173,106 L175,106 L177,106 L178,105 L178,104 L174.594,104 L174,101 L174,95 L173,94 z M164.5,105 C163.672,105 163,105.672 163,106.5 C163,107.328 163.672,108 164.5,108 C165.328,108 166,107.328 166,106.5 C166,105.672 165.328,105 164.5,105 z" fill="#989898" id="rect24381-9"/>
-      <path d="M164,112.625 L164,114.125 L169,116 L173,116 z" fill="#989898" id="path25668"/>
-      <g id="g26083">
+      <path d="M142.5,95 L139.625,101 L138,101 L137,102 L137,104 L138.406,104 L138,105 L138,110 L138,111 L138,111 C138,111 138.608,111.608 139,112 L140,112 L144,112 L146,113 L154,113 L156,112 L160,112 L161,112 L162,111 L162,111 L162,110 L162,105 L161.594,104 L163,104 L163,102 L162,101 L160.375,101 L157.5,95 z M143.5,98 L156.5,98 L158,102 L157,103 L143,103 L142,102 z M141,106 L144,106 L145,108 L145,109 L141,109 L140,108 L140,107 z M156,106 L159,106 L160,107 L160,108 L159,109 L155,109 L155,108 z M139,113 L139,115 L140,116 L143,116 L144,115 L144,113 z M156,113 L156,115 L157,116 L160,116 L161,115 L161,113 z" fill="#989898"/>
+      <path d="M136,112.625 L136,114.125 L131,116 L127,116 z" fill="#989898"/>
+      <path d="M138,92 L134,93.5 L134,111.375 L127,114 L127,101.625 L130,100.5 L130,96.5 L129,96.875 L127,97.625 L127,96.5 L127,87 z" fill="#B5B5B5"/>
+      <path d="M170,89 L169,90 L169,92 L170,93 L172,93 L173,92 L173,90 L172,89 z M169,94 L168,95 L163,100 L165.5,100 L168,97.5 L168,102 L168,109 L169,109 L170,108 L170,102 L172.188,102 L173,106 L175,106 L177,106 L178,105 L178,104 L174.594,104 L174,101 L174,95 L173,94 z M164.5,105 C163.672,105 163,105.672 163,106.5 C163,107.328 163.672,108 164.5,108 C165.328,108 166,107.328 166,106.5 C166,105.672 165.328,105 164.5,105 z" fill="#989898"/>
+      <path d="M164,112.625 L164,114.125 L169,116 L173,116 z" fill="#989898"/>
+      <g>
         <path d="M169.5,119 C170.881,119 172,120.119 172,121.5 C172,122.881 170.881,124 169.5,124 C168.57,124.002 168.113,123.584 167.5,122.971 L167.5,123 L132.5,123 L132.5,122.971 C131.996,123.663 131.316,123.918 130.5,124 C129.119,124 128,122.881 128,121.5 C128,120.119 129.119,119 130.5,119 C131.43,118.998 131.887,119.416 132.5,120.029 L132.5,120 L167.5,120 L167.5,120.029 C168.004,119.336 168.684,119.082 169.5,119 z" fill="inherit" id="highway-living-street-casing1"/>
         <path d="M167.05,121 L167,121.5 L167.05,122 L132.95,122 L133,121.5 L132.95,121 L167.05,121 z" fill="currentColor" id="highway-living-street-stroke1"/>
-        <path d="M171,121.5 C171,122.328 170.328,123 169.5,123 C168.672,123 168,122.328 168,121.5 C168,120.672 168.672,120 169.5,120 C170.328,120 171,120.672 171,121.5 z" fill="#FFFFFF" id="path26054"/>
-        <path d="M132,121.5 C132,122.328 131.328,123 130.5,123 C129.672,123 129,122.328 129,121.5 C129,120.672 129.672,120 130.5,120 C131.328,120 132,120.672 132,121.5 z" fill="#FFFFFF" id="path26081"/>
+        <path d="M171,121.5 C171,122.328 170.328,123 169.5,123 C168.672,123 168,122.328 168,121.5 C168,120.672 168.672,120 169.5,120 C170.328,120 171,120.672 171,121.5 z" fill="#FFFFFF"/>
+        <path d="M132,121.5 C132,122.328 131.328,123 130.5,123 C129.672,123 129,122.328 129,121.5 C129,120.672 129.672,120 130.5,120 C131.328,120 132,120.672 132,121.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-track" viewBox="60 80 60 60">
-      <g id="g26083">
-        <g id="g4983"/>
+      <g>
         <path d="M109.5,119 C110.881,119 112,120.119 112,121.5 C112,122.881 110.881,124 109.5,124 C108.57,124.002 108.113,123.584 107.5,122.971 L107.5,123 L72.5,123 L72.5,122.971 C71.996,123.663 71.316,123.918 70.5,124 C69.119,124 68,122.881 68,121.5 C68,120.119 69.119,119 70.5,119 C71.43,118.998 71.887,119.416 72.5,120.029 L72.5,120 L107.5,120 L107.5,120.029 C108.004,119.336 108.684,119.082 109.5,119 z" fill="inherit" id="highway-track-casing1"/>
         <path d="M107.05,121 L107,121.5 L107.05,122 L72.95,122 L73,121.5 L72.95,121 L107.05,121 z" fill="currentColor" id="highway-track-stroke1"/>
         <path d="M73.5,120 L73.5,121 L76,121 L76,120 z M78,120 L78,121 L81,121 L81,120 z M83,120 L83,121 L86,121 L86,120 z M88,120 L88,121 L91,121 L91,120 z M93,120 L93,121 L96,121 L96,120 z M98,120 L98,121 L101,121 L101,120 z M103,120 L103,121 L106,121 L106,120 z M73.5,122 L73.5,123 L76,123 L76,122 z M78,122 L78,123 L81,123 L81,122 z M83,122 L83,123 L86,123 L86,122 z M88,122 L88,123 L91,123 L91,122 z M93,122 L93,123 L96,123 L96,122 z M98,122 L98,123 L101,123 L101,122 z M103,122 L103,123 L106,123 L106,122 z" fill="currentColor" id="highway-track-stroke2" opacity="0.503"/>
-        <path d="M111,121.5 C111,122.328 110.328,123 109.5,123 C108.672,123 108,122.328 108,121.5 C108,120.672 108.672,120 109.5,120 C110.328,120 111,120.672 111,121.5 z" fill="#FFFFFF" id="path26054"/>
-        <path d="M72,121.5 C72,122.328 71.328,123 70.5,123 C69.672,123 69,122.328 69,121.5 C69,120.672 69.672,120 70.5,120 C71.328,120 72,120.672 72,121.5 z" fill="#FFFFFF" id="path26081"/>
+        <path d="M111,121.5 C111,122.328 110.328,123 109.5,123 C108.672,123 108,122.328 108,121.5 C108,120.672 108.672,120 109.5,120 C110.328,120 111,120.672 111,121.5 z" fill="#FFFFFF"/>
+        <path d="M72,121.5 C72,122.328 71.328,123 70.5,123 C69.672,123 69,122.328 69,121.5 C69,120.672 69.672,120 70.5,120 C71.328,120 72,120.672 72,121.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M87,94 L81,116 L87.5,116 L89,94 L87,94 z M91,94 L92.5,116 L99,116 L93,94 L91,94 z" fill="#989898" id="path5001"/>
+      <path d="M87,94 L81,116 L87.5,116 L89,94 L87,94 z M91,94 L92.5,116 L99,116 L93,94 L91,94 z" fill="#989898"/>
+      <path d="M103,109 L103,112.25 L104,112.625 L104,109 L103,109 z M101,110 L101,112.5 L102,112.875 L102,110 L101,110 z M107,110 L107,113.75 L107.656,114 L108,114 L108,110 L107,110 z M105,111 L105,114 L106,114.375 L106,111 L105,111 z M109,112 L109,115.5 L110,115.875 L110,112 L109,112 z" fill="#989898"/>
+      <path d="M77,109 L77,112.25 L76,112.625 L76,109 L77,109 z M79,110 L79,112.5 L78,112.875 L78,110 L79,110 z M73,110 L73,113.75 L72.344,114 L72,114 L72,110 L73,110 z M75,111 L75,114 L74,114.375 L74,111 L75,111 z M71,112 L71,115.5 L70,115.875 L70,112 L71,112 z" fill="#989898"/>
     </symbol>
     <symbol id="highway-road" viewBox="0 80 60 60">
-      <g id="g26083">
+      <g>
         <path d="M49.5,119 C50.881,119 52,120.119 52,121.5 C52,122.881 50.881,124 49.5,124 C48.57,124.002 48.113,123.584 47.5,122.971 L47.5,123 L12.5,123 L12.5,122.971 C11.996,123.663 11.316,123.918 10.5,124 C9.119,124 8,122.881 8,121.5 C8,120.119 9.119,119 10.5,119 C11.43,118.998 11.887,119.416 12.5,120.029 L12.5,120 L47.5,120 L47.5,120.029 C48.004,119.336 48.684,119.082 49.5,119 z" fill="inherit" id="highway-road-casing1"/>
         <path d="M47.05,121 L47,121.5 L47.05,122 L12.95,122 L13,121.5 L12.95,121 L47.05,121 z" fill="currentColor" id="highway-road-stroke1"/>
-        <path d="M51,121.5 C51,122.328 50.328,123 49.5,123 C48.672,123 48,122.328 48,121.5 C48,120.672 48.672,120 49.5,120 C50.328,120 51,120.672 51,121.5 z" fill="#FFFFFF" id="path26054"/>
-        <path d="M12,121.5 C12,122.328 11.328,123 10.5,123 C9.672,123 9,122.328 9,121.5 C9,120.672 9.672,120 10.5,120 C11.328,120 12,120.672 12,121.5 z" fill="#FFFFFF" id="path26081"/>
+        <path d="M51,121.5 C51,122.328 50.328,123 49.5,123 C48.672,123 48,122.328 48,121.5 C48,120.672 48.672,120 49.5,120 C50.328,120 51,120.672 51,121.5 z" fill="#FFFFFF"/>
+        <path d="M12,121.5 C12,122.328 11.328,123 10.5,123 C9.672,123 9,122.328 9,121.5 C9,120.672 9.672,120 10.5,120 C11.328,120 12,120.672 12,121.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M22.375,116 L25.375,105 L28.375,94 L32.375,94 L35.375,105 L38.375,116 z" fill="#989898" id="path26176-5-7"/>
+      <path d="M22.375,116 L25.375,105 L28.375,94 L32.375,94 L35.375,105 L38.375,116 z" fill="#989898"/>
+    </symbol>
+    <symbol id="highway-bus_guideway" viewBox="780 20 60 60">
+      <g>
+        <path d="M829.5,59 C830.881,59 832,60.119 832,61.5 C832,62.881 830.881,64 829.5,64 C828.57,64.002 828.113,63.584 827.5,62.971 L827.5,63 L792.5,63 L792.5,62.971 C791.996,63.663 791.316,63.918 790.5,64 C789.119,64 788,62.881 788,61.5 C788,60.119 789.119,59 790.5,59 C791.43,58.998 791.887,59.416 792.5,60.029 L792.5,60 L827.5,60 L827.5,60.029 C828.004,59.336 828.684,59.082 829.5,59 z" fill="inherit" id="highway-bus_guideway-casing1"/>
+        <path d="M827.05,61 L827,61.5 L827.05,62 L792.95,62 L793,61.5 L792.95,61 L827.05,61 z" fill="currentColor" id="highway-bus_guideway-stroke1"/>
+        <path d="M831,61.5 C831,62.328 830.328,63 829.5,63 C828.672,63 828,62.328 828,61.5 C828,60.672 828.672,60 829.5,60 C830.328,60 831,60.672 831,61.5 z" fill="#FFFFFF"/>
+        <path d="M792,61.5 C792,62.328 791.328,63 790.5,63 C789.672,63 789,62.328 789,61.5 C789,60.672 789.672,60 790.5,60 C791.328,60 792,60.672 792,61.5 z" fill="#FFFFFF"/>
+      </g>
+      <path d="M804,31 C801.727,31 799,32.239 799,35.577 L799,44.665 L799,51 C799,51 799,52.667 800.667,52.667 L800.667,54.333 C800.667,54.333 800.667,56 802.333,56 C804,56 804,54.333 804,54.333 L804,52.667 L815.667,52.667 L815.667,54.333 C815.667,54.333 815.667,56 817.333,56 C819,56 819,54.333 819,54.333 L819,52.667 C819,52.667 820.667,52.667 820.667,51 L820.667,35.577 C820.667,32.168 818.607,31 816.334,31 L804,31 z M804.417,33.5 L815.25,33.5 C815.481,33.5 815.667,33.686 815.667,33.917 C815.667,34.147 815.481,34.333 815.25,34.333 L804.417,34.333 C804.186,34.333 804,34.147 804,33.917 C804,33.686 804.186,33.5 804.417,33.5 z M802.333,36 L817.333,36 C819,36 819,37.611 819,37.611 L819,42.667 C819,42.667 819,44.333 817.333,44.333 L802.333,44.333 C800.667,44.333 800.667,42.667 800.667,42.667 L800.667,37.667 C800.667,37.667 800.667,36 802.333,36 z M802.333,47.667 C803.254,47.667 804,48.413 804,49.333 C804,50.254 803.254,51 802.333,51 C801.413,51 800.667,50.254 800.667,49.333 C800.667,48.413 801.413,47.667 802.333,47.667 z M817.333,47.667 C818.254,47.667 819,48.413 819,49.333 C819,50.254 818.254,51 817.333,51 C816.413,51 815.667,50.254 815.667,49.333 C815.667,48.413 816.413,47.667 817.333,47.667 z" fill="#989898"/>
+      <path d="M824,53 L824,54.5 L829,56.375 L833,56.375 z" fill="#989898"/>
+      <path d="M796,53 L796,54.5 L791,56.375 L787,56.375 z" fill="#989898"/>
     </symbol>
     <symbol id="highway-service" viewBox="720 20 60 60">
-      <path d="M767,47 L767,50.25 L768,50.625 L768,47 L767,47 z M765,48 L765,50.5 L766,50.875 L766,48 L765,48 z M771,48 L771,51.75 L771.656,52 L772,52 L772,48 L771,48 z M769,49 L769,52 L770,52.375 L770,49 L769,49 z M773,50 L773,53.5 L774,53.875 L774,50 L773,50 z" fill="#989898" id="path24215"/>
-      <path d="M742.5,35 L739.625,41 L738,41 L737,42 L737,44 L738.406,44 L738,45 L738,50 L738,51 L738,51 C738,51 738.608,51.608 739,52 L740,52 L744,52 L746,53 L754,53 L756,52 L760,52 L761,52 L762,51 L762,51 L762,50 L762,45 L761.594,44 L763,44 L763,42 L762,41 L760.375,41 L757.5,35 z M743.5,38 L756.5,38 L758,42 L757,43 L743,43 L742,42 z M741,46 L744,46 L745,48 L745,49 L741,49 L740,48 L740,47 z M756,46 L759,46 L760,47 L760,48 L759,49 L755,49 L755,48 z M739,53 L739,55 L740,56 L743,56 L744,55 L744,53 z M756,53 L756,55 L757,56 L760,56 L761,55 L761,53 z" fill="#989898" id="path23925"/>
-      <path d="M764,52.625 L764,54.125 L769,56 L773,56 z" fill="#989898" id="path24231"/>
-      <path d="M736,52.625 L736,54.125 L731,56 L727,56 z" fill="#989898" id="path24233"/>
-      <g id="g26083">
+      <g>
         <path d="M769.5,59 C770.881,59 772,60.119 772,61.5 C772,62.881 770.881,64 769.5,64 C768.57,64.002 768.113,63.584 767.5,62.971 L767.5,63 L732.5,63 L732.5,62.971 C731.996,63.663 731.316,63.918 730.5,64 C729.119,64 728,62.881 728,61.5 C728,60.119 729.119,59 730.5,59 C731.43,58.998 731.887,59.416 732.5,60.029 L732.5,60 L767.5,60 L767.5,60.029 C768.004,59.336 768.684,59.082 769.5,59 z" fill="inherit" id="highway-service-casing1"/>
         <path d="M767.05,61 L767,61.5 L767.05,62 L732.95,62 L733,61.5 L732.95,61 L767.05,61 z" fill="currentColor" id="highway-service-stroke1"/>
-        <path d="M771,61.5 C771,62.328 770.328,63 769.5,63 C768.672,63 768,62.328 768,61.5 C768,60.672 768.672,60 769.5,60 C770.328,60 771,60.672 771,61.5 z" fill="#FFFFFF" id="path26054"/>
-        <path d="M732,61.5 C732,62.328 731.328,63 730.5,63 C729.672,63 729,62.328 729,61.5 C729,60.672 729.672,60 730.5,60 C731.328,60 732,60.672 732,61.5 z" fill="#FFFFFF" id="path26081"/>
+        <path d="M771,61.5 C771,62.328 770.328,63 769.5,63 C768.672,63 768,62.328 768,61.5 C768,60.672 768.672,60 769.5,60 C770.328,60 771,60.672 771,61.5 z" fill="#FFFFFF"/>
+        <path d="M732,61.5 C732,62.328 731.328,63 730.5,63 C729.672,63 729,62.328 729,61.5 C729,60.672 729.672,60 730.5,60 C731.328,60 732,60.672 732,61.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M733,47 L733,50.25 L732,50.625 L732,47 L733,47 z M735,48 L735,50.5 L734,50.875 L734,48 L735,48 z M729,48 L729,51.75 L728.344,52 L728,52 L728,48 L729,48 z M731,49 L731,52 L730,52.375 L730,49 L731,49 z M727,50 L727,53.5 L726,53.875 L726,50 L727,50 z" fill="#989898" id="path7005"/>
+      <path d="M742.5,35 L739.625,41 L738,41 L737,42 L737,44 L738.406,44 L738,45 L738,50 L738,51 L738,51 C738,51 738.608,51.608 739,52 L740,52 L744,52 L746,53 L754,53 L756,52 L760,52 L761,52 L762,51 L762,51 L762,50 L762,45 L761.594,44 L763,44 L763,42 L762,41 L760.375,41 L757.5,35 z M743.5,38 L756.5,38 L758,42 L757,43 L743,43 L742,42 z M741,46 L744,46 L745,48 L745,49 L741,49 L740,48 L740,47 z M756,46 L759,46 L760,47 L760,48 L759,49 L755,49 L755,48 z M739,53 L739,55 L740,56 L743,56 L744,55 L744,53 z M756,53 L756,55 L757,56 L760,56 L761,55 L761,53 z" fill="#989898"/>
+      <path d="M764,52.625 L764,54.125 L769,56 L773,56 z" fill="#989898"/>
+      <path d="M736,52.625 L736,54.125 L731,56 L727,56 z" fill="#989898"/>
     </symbol>
     <symbol id="highway-unclassified" viewBox="660 20 60 60">
-      <path d="M682.5,35 L679.625,41 L678,41 L677,42 L677,44 L678.406,44 L678,45 L678,50 L678,51 L678,51 C678,51 678.608,51.608 679,52 L680,52 L684,52 L686,53 L694,53 L696,52 L700,52 L701,52 L702,51 L702,51 L702,50 L702,45 L701.594,44 L703,44 L703,42 L702,41 L700.375,41 L697.5,35 z M683.5,38 L696.5,38 L698,42 L697,43 L683,43 L682,42 z M681,46 L684,46 L685,48 L685,49 L681,49 L680,48 L680,47 z M696,46 L699,46 L700,47 L700,48 L699,49 L695,49 L695,48 z M679,53 L679,55 L680,56 L683,56 L684,55 L684,53 z M696,53 L696,55 L697,56 L700,56 L701,55 L701,53 z" fill="#989898" id="path7143"/>
       <g>
-        <path d="M670.5,59 C669.119,59 668,60.119 668,61.5 C668,62.881 669.119,64 670.5,64 L709.5,64 C710.881,64 712,62.881 712,61.5 C712,60.119 710.881,59 709.5,59 z" fill="inherit" id="highway-residential-casing1"/>
-        <path d="M672.5,60 C672.81,60.416 673,60.941 673,61.5 C673,62.059 672.81,62.584 672.5,63 L707.5,63 C707.19,62.584 707,62.059 707,61.5 C707,60.941 707.19,60.416 707.5,60 L672.5,60 z" fill="currentColor" id="highway-residential-stroke1"/>
+        <path d="M670.5,59 C669.119,59 668,60.119 668,61.5 C668,62.881 669.119,64 670.5,64 L709.5,64 C710.881,64 712,62.881 712,61.5 C712,60.119 710.881,59 709.5,59 z" fill="inherit" id="highway-unclassified-casing1"/>
+        <path d="M672.5,60 C672.81,60.416 673,60.941 673,61.5 C673,62.059 672.81,62.584 672.5,63 L707.5,63 C707.19,62.584 707,62.059 707,61.5 C707,60.941 707.19,60.416 707.5,60 L672.5,60 z" fill="currentColor" id="highway-unclassified-stroke1"/>
         <path d="M672,61.5 C672,62.328 671.328,63 670.5,63 C669.672,63 669,62.328 669,61.5 C669,60.672 669.672,60 670.5,60 C671.328,60 672,60.672 672,61.5 z" fill="#FFFFFF"/>
         <path d="M711,61.5 C711,62.328 710.328,63 709.5,63 C708.672,63 708,62.328 708,61.5 C708,60.672 708.672,60 709.5,60 C710.328,60 711,60.672 711,61.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M682.5,35 L679.625,41 L678,41 L677,42 L677,44 L678.406,44 L678,45 L678,50 L678,51 L678,51 C678,51 678.608,51.608 679,52 L680,52 L684,52 L686,53 L694,53 L696,52 L700,52 L701,52 L702,51 L702,51 L702,50 L702,45 L701.594,44 L703,44 L703,42 L702,41 L700.375,41 L697.5,35 z M683.5,38 L696.5,38 L698,42 L697,43 L683,43 L682,42 z M681,46 L684,46 L685,48 L685,49 L681,49 L680,48 L680,47 z M696,46 L699,46 L700,47 L700,48 L699,49 L695,49 L695,48 z M679,53 L679,55 L680,56 L683,56 L684,55 L684,53 z M696,53 L696,55 L697,56 L700,56 L701,55 L701,53 z" fill="#989898"/>
     </symbol>
     <symbol id="highway-residential" viewBox="600 20 60 60">
-      <path d="M622.5,35 L619.625,41 L618,41 L617,42 L617,44 L618.406,44 L618,45 L618,50 L618,51 L618,51 C618,51 618.608,51.608 619,52 L620,52 L624,52 L626,53 L634,53 L636,52 L640,52 L641,52 L642,51 L642,51 L642,50 L642,45 L641.594,44 L643,44 L643,42 L642,41 L640.375,41 L637.5,35 z M623.5,38 L636.5,38 L638,42 L637,43 L623,43 L622,42 z M621,46 L624,46 L625,48 L625,49 L621,49 L620,48 L620,47 z M636,46 L639,46 L640,47 L640,48 L639,49 L635,49 L635,48 z M619,53 L619,55 L620,56 L623,56 L624,55 L624,53 z M636,53 L636,55 L637,56 L640,56 L641,55 L641,53 z" fill="#989898" id="path23923"/>
-      <path d="M642,32 L646,33.5 L646,51.375 L653,54 L653,41.625 L650,40.5 L650,36.5 L651,36.875 L653,37.625 L653,36.5 L653,27 z" fill="#B5B5B5" id="path23978"/>
-      <path d="M644,52.625 L644,54.125 L649,56 L653,56 z" fill="#B5B5B5" id="path23689-9"/>
-      <path d="M616,52.625 L616,54.125 L611,56 L607,56 z" fill="#B5B5B5" id="path23985"/>
-      <path d="M618,32 L614,33.5 L614,51.375 L607,54 L607,41.625 L610,40.5 L610,36.5 L609,36.875 L607,37.625 L607,36.5 L607,27 z" fill="#B5B5B5" id="path23989"/>
+      <path d="M622.5,35 L619.625,41 L618,41 L617,42 L617,44 L618.406,44 L618,45 L618,50 L618,51 L618,51 C618,51 618.608,51.608 619,52 L620,52 L624,52 L626,53 L634,53 L636,52 L640,52 L641,52 L642,51 L642,51 L642,50 L642,45 L641.594,44 L643,44 L643,42 L642,41 L640.375,41 L637.5,35 z M623.5,38 L636.5,38 L638,42 L637,43 L623,43 L622,42 z M621,46 L624,46 L625,48 L625,49 L621,49 L620,48 L620,47 z M636,46 L639,46 L640,47 L640,48 L639,49 L635,49 L635,48 z M619,53 L619,55 L620,56 L623,56 L624,55 L624,53 z M636,53 L636,55 L637,56 L640,56 L641,55 L641,53 z" fill="#989898"/>
+      <path d="M642,32 L646,33.5 L646,51.375 L653,54 L653,41.625 L650,40.5 L650,36.5 L651,36.875 L653,37.625 L653,36.5 L653,27 z" fill="#B5B5B5"/>
+      <path d="M644,52.625 L644,54.125 L649,56 L653,56 z" fill="#B5B5B5"/>
+      <path d="M616,52.625 L616,54.125 L611,56 L607,56 z" fill="#B5B5B5"/>
+      <path d="M618,32 L614,33.5 L614,51.375 L607,54 L607,41.625 L610,40.5 L610,36.5 L609,36.875 L607,37.625 L607,36.5 L607,27 z" fill="#B5B5B5"/>
       <g>
         <path d="M610.5,59 C609.119,59 608,60.119 608,61.5 C608,62.881 609.119,64 610.5,64 L649.5,64 C650.881,64 652,62.881 652,61.5 C652,60.119 650.881,59 649.5,59 z" fill="inherit" id="highway-residential-casing1"/>
         <path d="M612.5,60 C612.81,60.416 613,60.941 613,61.5 C613,62.059 612.81,62.584 612.5,63 L647.5,63 C647.19,62.584 647,62.059 647,61.5 C647,60.941 647.19,60.416 647.5,60 L612.5,60 z" fill="currentColor" id="highway-residential-stroke1"/>
       </g>
     </symbol>
     <symbol id="highway-tertiary-link" viewBox="540 20 60 60">
-      <path d="M567,34 L565.781,37 L564.062,37 L563.656,38 L565.375,38 L564.125,41 L562.375,41 L561.938,42 L563.719,42 L562.5,45 L560.688,45 L560.25,46 L562.094,46 L560.875,49 L558.969,49 L558.562,50 L560.469,50 L559.219,53 L557.281,53 L556.844,54 L558.812,54 L558,56 L569,56 L570.156,48.375 C568.72,47.032 567,45.193 567,44 L567,42 L570.906,43.5 L572.344,34 L567,34 z" fill="#B5B5B5" id="path5739"/>
+      <path d="M567,34 L565.781,37 L564.062,37 L563.656,38 L565.375,38 L564.125,41 L562.375,41 L561.938,42 L563.719,42 L562.5,45 L560.688,45 L560.25,46 L562.094,46 L560.875,49 L558.969,49 L558.562,50 L560.469,50 L559.219,53 L557.281,53 L556.844,54 L558.812,54 L558,56 L569,56 L570.156,48.375 C568.72,47.032 567,45.193 567,44 L567,42 L570.906,43.5 L572.344,34 L567,34 z" fill="#B5B5B5"/>
       <path d="M565.5,53 L566.75,49 L563.75,49 L562.5,53 z" fill="currentColor" id="highway-tertiary-link-stroke3"/>
-      <path d="M575,56 L575,52 C575,47.548 567,46.172 567,42 C567,39 567.375,34 567.375,34 L572.375,34 C572.375,34 572,37.996 572,40 C572,42 580.595,44.072 582,48 L584,56 z" fill="url(#Gradient_1)" id="path5745"/>
-      <g id="g6182">
-        <g id="g6186">
+      <path d="M575,56 L575,52 C575,47.548 567,46.172 567,42 C567,39 567.375,34 567.375,34 L572.375,34 C572.375,34 572,37.996 572,40 C572,42 580.595,44.072 582,48 L584,56 z" fill="url(#Gradient_1)"/>
+      <g>
+        <g>
           <path d="M550.5,59 C549.119,59 548,60.119 548,61.5 C548,62.881 549.119,64 550.5,64 L589.5,64 C590.881,64 592,62.881 592,61.5 C592,60.119 590.881,59 589.5,59 L550.5,59 z M552.5,60 L587.5,60 C587.19,60.416 587,60.941 587,61.5 C587,62.059 587.19,62.584 587.5,63 L552.5,63 C552.81,62.584 553,62.059 553,61.5 C553,60.941 552.81,60.416 552.5,60 z" fill="inherit" id="highway-tertiary-link-casing2" opacity="0.5"/>
           <path d="M552.5,60 C552.81,60.416 553,60.941 553,61.5 C553,62.059 552.81,62.584 552.5,63 L587.5,63 C587.19,62.584 587,62.059 587,61.5 C587,60.941 587.19,60.416 587.5,60 L552.5,60 z" fill="currentColor" id="highway-tertiary-link-stroke2" opacity="0.5"/>
-          <path d="M552,61.5 C552,62.328 551.328,63 550.5,63 C549.672,63 549,62.328 549,61.5 C549,60.672 549.672,60 550.5,60 C551.328,60 552,60.672 552,61.5 z" fill="#FFFFFF" id="path6190"/>
-          <path d="M591,61.5 C591,62.328 590.328,63 589.5,63 C588.672,63 588,62.328 588,61.5 C588,60.672 588.672,60 589.5,60 C590.328,60 591,60.672 591,61.5 z" fill="#FFFFFF" id="path6192"/>
+          <path d="M552,61.5 C552,62.328 551.328,63 550.5,63 C549.672,63 549,62.328 549,61.5 C549,60.672 549.672,60 550.5,60 C551.328,60 552,60.672 552,61.5 z" fill="#FFFFFF"/>
+          <path d="M591,61.5 C591,62.328 590.328,63 589.5,63 C588.672,63 588,62.328 588,61.5 C588,60.672 588.672,60 589.5,60 C590.328,60 591,60.672 591,61.5 z" fill="#FFFFFF"/>
         </g>
         <path d="M567,59 C565.631,59 564.5,60.131 564.5,61.5 C564.5,62.869 565.631,64 567,64 C568.485,64.542 570.65,66.959 572.344,69.781 L575.344,74.781 C575.347,74.785 575.372,74.777 575.375,74.781 C575.815,75.509 576.597,76 577.5,76 C578.869,76 580,74.869 580,73.5 C580,73.034 579.852,72.594 579.625,72.219 L579.656,72.188 L576.656,67.188 C574.402,63.422 571.368,60.841 568.011,59.225 C567.703,59.082 567.362,59 567,59 z" fill="inherit" id="highway-tertiary-link-casing1"/>
         <path d="M569.469,61.312 C569.474,61.376 569.5,61.436 569.5,61.5 C569.5,62.434 568.97,63.253 568.199,63.681 C569.981,64.753 572.223,67.633 573.219,69.25 L575.188,72.531 C575.57,71.636 576.473,71 577.5,71 C577.596,71 577.688,71.02 577.781,71.031 L575.781,67.719 C574.066,64.86 571.632,62.315 569.469,61.312 z M577.5,73 C577.212,73 577,73.212 577,73.5 C577,73.597 577.02,73.676 577.062,73.75 L577.906,73.25 C577.82,73.112 577.684,73 577.5,73 z" fill="currentColor" id="highway-tertiary-link-stroke1"/>
-        <path d="M579,73.5 C579,74.328 578.328,75 577.5,75 C576.672,75 576,74.328 576,73.5 C576,72.672 576.672,72 577.5,72 C578.328,72 579,72.672 579,73.5 z" fill="#FFFFFF" id="path6198"/>
-        <path d="M568.5,61.5 C568.5,62.328 567.828,63 567,63 C566.172,63 565.5,62.328 565.5,61.5 C565.5,60.672 566.172,60 567,60 C567.828,60 568.5,60.672 568.5,61.5 z" fill="#FFFFFF" id="path6202"/>
+        <path d="M579,73.5 C579,74.328 578.328,75 577.5,75 C576.672,75 576,74.328 576,73.5 C576,72.672 576.672,72 577.5,72 C578.328,72 579,72.672 579,73.5 z" fill="#FFFFFF"/>
+        <path d="M568.5,61.5 C568.5,62.328 567.828,63 567,63 C566.172,63 565.5,62.328 565.5,61.5 C565.5,60.672 566.172,60 567,60 C567.828,60 568.5,60.672 568.5,61.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-secondary-link" viewBox="480 20 60 60">
-      <g id="g5815">
-        <path d="M507,34 L498,56 L509,56 L510.156,48.375 C508.72,47.032 507,45.193 507,44 L507,42 L510.906,43.5 L512.344,34 L507,34 z" fill="#B5B5B5" id="path5635-2"/>
+      <g>
+        <path d="M507,34 L498,56 L509,56 L510.156,48.375 C508.72,47.032 507,45.193 507,44 L507,42 L510.906,43.5 L512.344,34 L507,34 z" fill="#B5B5B5"/>
         <path d="M505.5,53 L506.75,49 L503.75,49 L502.5,53 z" fill="currentColor" id="highway-secondary-link-stroke3"/>
-        <path d="M515,56 L515,52 C515,47.548 507,46.172 507,42 C507,39 507.375,34 507.375,34 L512.375,34 C512.375,34 512,37.996 512,40 C512,42 520.595,44.072 522,48 L524,56 z" fill="url(#Gradient_2)" id="path5720"/>
+        <path d="M515,56 L515,52 C515,47.548 507,46.172 507,42 C507,39 507.375,34 507.375,34 L512.375,34 C512.375,34 512,37.996 512,40 C512,42 520.595,44.072 522,48 L524,56 z" fill="url(#Gradient_2)"/>
       </g>
-      <g id="g6160">
+      <g>
         <g id="g6164">
           <path d="M490.5,59 C489.119,59 488,60.119 488,61.5 C488,62.881 489.119,64 490.5,64 L529.5,64 C530.881,64 532,62.881 532,61.5 C532,60.119 530.881,59 529.5,59 L490.5,59 z M492.5,60 L527.5,60 C527.19,60.416 527,60.941 527,61.5 C527,62.059 527.19,62.584 527.5,63 L492.5,63 C492.81,62.584 493,62.059 493,61.5 C493,60.941 492.81,60.416 492.5,60 z" fill="inherit" id="highway-secondary-link-casing2" opacity="0.5"/>
           <path d="M492.5,60 C492.81,60.416 493,60.941 493,61.5 C493,62.059 492.81,62.584 492.5,63 L527.5,63 C527.19,62.584 527,62.059 527,61.5 C527,60.941 527.19,60.416 527.5,60 L492.5,60 z" fill="currentColor" id="highway-secondary-link-stroke2" opacity="0.5"/>
         </g>
         <path d="M507,59 C505.631,59 504.5,60.131 504.5,61.5 C504.5,62.869 505.631,64 507,64 C508.485,64.542 510.65,66.959 512.344,69.781 L515.344,74.781 C515.347,74.785 515.372,74.777 515.375,74.781 C515.815,75.509 516.597,76 517.5,76 C518.869,76 520,74.869 520,73.5 C520,73.034 519.852,72.594 519.625,72.219 L519.656,72.188 L516.656,67.188 C514.575,63.719 511.766,61.094 508.812,59.813 C508.354,59.32 507.717,59 507,59 z" fill="inherit" id="highway-secondary-link-casing1"/>
         <path d="M509.469,61.312 C509.474,61.376 509.5,61.436 509.5,61.5 C509.5,62.434 508.97,63.253 508.199,63.681 C509.981,64.753 512.223,67.633 513.219,69.25 L515.188,72.531 C515.57,71.636 516.473,71 517.5,71 C517.596,71 517.688,71.02 517.781,71.031 L515.781,67.719 C514.066,64.86 511.632,62.315 509.469,61.312 z M517.5,73 C517.212,73 517,73.212 517,73.5 C517,73.597 517.02,73.676 517.062,73.75 L517.906,73.25 C517.82,73.112 517.684,73 517.5,73 z" fill="currentColor" id="highway-secondary-link-stroke1"/>
-        <path d="M519,73.5 C519,74.328 518.328,75 517.5,75 C516.672,75 516,74.328 516,73.5 C516,72.672 516.672,72 517.5,72 C518.328,72 519,72.672 519,73.5 z" fill="#FFFFFF" id="path6176"/>
-        <path d="M508.5,61.5 C508.5,62.328 507.828,63 507,63 C506.172,63 505.5,62.328 505.5,61.5 C505.5,60.672 506.172,60 507,60 C507.828,60 508.5,60.672 508.5,61.5 z" fill="#FFFFFF" id="path6180"/>
+        <path d="M519,73.5 C519,74.328 518.328,75 517.5,75 C516.672,75 516,74.328 516,73.5 C516,72.672 516.672,72 517.5,72 C518.328,72 519,72.672 519,73.5 z" fill="#FFFFFF"/>
+        <path d="M508.5,61.5 C508.5,62.328 507.828,63 507,63 C506.172,63 505.5,62.328 505.5,61.5 C505.5,60.672 506.172,60 507,60 C507.828,60 508.5,60.672 508.5,61.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-primary-link" viewBox="420 20 60 60">
-      <g id="g5827">
-        <path d="M446,34 L431,56 L442,56 L442.844,54 L444.812,54 L444,56 L455,56 L456.156,48.375 C454.72,47.032 453,45.193 453,44 L453,42 L456.906,43.5 L458.344,34 L453,34 L451.781,37 L450.062,37 L451.344,34 L446,34 z M449.656,38 L451.375,38 L450.125,41 L448.375,41 L449.656,38 z M447.938,42 L449.719,42 L448.5,45 L446.688,45 L447.938,42 z M446.25,46 L448.094,46 L446.875,49 L444.969,49 L446.25,46 z M444.562,50 L446.469,50 L445.219,53 L443.281,53 L444.562,50 z" fill="#B5B5B5" id="path5525"/>
+      <g>
+        <path d="M446,34 L431,56 L442,56 L442.844,54 L444.812,54 L444,56 L455,56 L456.156,48.375 C454.72,47.032 453,45.193 453,44 L453,42 L456.906,43.5 L458.344,34 L453,34 L451.781,37 L450.062,37 L451.344,34 L446,34 z M449.656,38 L451.375,38 L450.125,41 L448.375,41 L449.656,38 z M447.938,42 L449.719,42 L448.5,45 L446.688,45 L447.938,42 z M446.25,46 L448.094,46 L446.875,49 L444.969,49 L446.25,46 z M444.562,50 L446.469,50 L445.219,53 L443.281,53 L444.562,50 z" fill="#B5B5B5"/>
         <path d="M451.5,53 L452.75,49 L449.75,49 L448.5,53 z M443.5,41 L445.5,37.5 L448.5,37.5 L446.5,41 z" fill="currentColor" id="highway-primary-link-stroke3"/>
-        <path d="M461,56 L461,52 C461,47.548 453,46.172 453,42 C453,39 453.375,34 453.375,34 L458.375,34 C458.375,34 458,37.996 458,40 C458,42 466.595,44.072 468,48 L470,56 z" fill="url(#Gradient_3)" id="path5696"/>
+        <path d="M461,56 L461,52 C461,47.548 453,46.172 453,42 C453,39 453.375,34 453.375,34 L458.375,34 C458.375,34 458,37.996 458,40 C458,42 466.595,44.072 468,48 L470,56 z" fill="url(#Gradient_3)"/>
       </g>
-      <g id="g6072-8">
-        <g id="g5377-1-7">
+      <g>
+        <g>
           <path d="M430.5,59 C429.119,59 428,60.119 428,61.5 C428,62.881 429.119,64 430.5,64 L469.5,64 C470.881,64 472,62.881 472,61.5 C472,60.119 470.881,59 469.5,59 L430.5,59 z M432.5,60 L467.5,60 C467.19,60.416 467,60.941 467,61.5 C467,62.059 467.19,62.584 467.5,63 L432.5,63 C432.81,62.584 433,62.059 433,61.5 C433,60.941 432.81,60.416 432.5,60 z" fill="inherit" id="highway-primary-link-casing2" opacity="0.5"/>
           <path d="M432.5,60 C432.81,60.416 433,60.941 433,61.5 C433,62.059 432.81,62.584 432.5,63 L467.5,63 C467.19,62.584 467,62.059 467,61.5 C467,60.941 467.19,60.416 467.5,60 L432.5,60 z" fill="currentColor" id="highway-primary-link-stroke2" opacity="0.5"/>
-          <path d="M432,61.5 C432,62.328 431.328,63 430.5,63 C429.672,63 429,62.328 429,61.5 C429,60.672 429.672,60 430.5,60 C431.328,60 432,60.672 432,61.5 z" fill="#FFFFFF" id="path5383-3-4"/>
-          <path d="M471,61.5 C471,62.328 470.328,63 469.5,63 C468.672,63 468,62.328 468,61.5 C468,60.672 468.672,60 469.5,60 C470.328,60 471,60.672 471,61.5 z" fill="#FFFFFF" id="path5385-4-7"/>
+          <path d="M432,61.5 C432,62.328 431.328,63 430.5,63 C429.672,63 429,62.328 429,61.5 C429,60.672 429.672,60 430.5,60 C431.328,60 432,60.672 432,61.5 z" fill="#FFFFFF"/>
+          <path d="M471,61.5 C471,62.328 470.328,63 469.5,63 C468.672,63 468,62.328 468,61.5 C468,60.672 468.672,60 469.5,60 C470.328,60 471,60.672 471,61.5 z" fill="#FFFFFF"/>
         </g>
         <path d="M447,59 C445.631,59 444.5,60.131 444.5,61.5 C444.5,62.869 445.631,64 447,64 C448.485,64.542 450.651,66.959 452.344,69.781 L455.344,74.781 C455.347,74.785 455.372,74.777 455.375,74.781 C455.815,75.509 456.597,76 457.5,76 C458.869,76 460,74.869 460,73.5 C460,73.034 459.852,72.594 459.625,72.219 L459.656,72.188 L456.656,67.188 C454.575,63.719 451.766,61.094 448.812,59.813 C448.354,59.32 447.717,59 447,59 z" fill="inherit" id="highway-primary-link-casing1"/>
         <path d="M449.469,61.312 C449.474,61.376 449.5,61.436 449.5,61.5 C449.5,62.434 448.97,63.253 448.199,63.681 C449.981,64.753 452.223,67.633 453.219,69.25 L455.187,72.531 C455.57,71.636 456.473,71 457.5,71 C457.596,71 457.688,71.02 457.781,71.031 L455.781,67.719 C454.066,64.86 451.632,62.315 449.469,61.312 z M457.5,73 C457.212,73 457,73.212 457,73.5 C457,73.597 457.02,73.676 457.062,73.75 L457.906,73.25 C457.82,73.112 457.684,73 457.5,73 z" fill="currentColor" id="highway-primary-link-stroke1"/>
-        <path d="M459,73.5 C459,74.328 458.328,75 457.5,75 C456.672,75 456,74.328 456,73.5 C456,72.672 456.672,72 457.5,72 C458.328,72 459,72.672 459,73.5 z" fill="#FFFFFF" id="path5383-5-05-1"/>
-        <path d="M448.5,61.5 C448.5,62.328 447.828,63 447,63 C446.172,63 445.5,62.328 445.5,61.5 C445.5,60.672 446.172,60 447,60 C447.828,60 448.5,60.672 448.5,61.5 z" fill="#FFFFFF" id="path5383-5-0-8-6"/>
+        <path d="M459,73.5 C459,74.328 458.328,75 457.5,75 C456.672,75 456,74.328 456,73.5 C456,72.672 456.672,72 457.5,72 C458.328,72 459,72.672 459,73.5 z" fill="#FFFFFF"/>
+        <path d="M448.5,61.5 C448.5,62.328 447.828,63 447,63 C446.172,63 445.5,62.328 445.5,61.5 C445.5,60.672 446.172,60 447,60 C447.828,60 448.5,60.672 448.5,61.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-trunk-link" viewBox="360 20 60 60">
-      <g id="g5840">
-        <g id="g5633">
-          <path d="M393,34 L384,56 L395,56 L396.156,48.375 C394.72,47.032 393,45.193 393,44 L393,42 L396.906,43.5 L398.344,34 L393,34 z" fill="#B5B5B5" id="path5635"/>
-          <path d="M382,56 L391.359,34 L386,34 L371,56 z" fill="#B5B5B5" id="path5643"/>
+      <g>
+        <g>
+          <path d="M393,34 L384,56 L395,56 L396.156,48.375 C394.72,47.032 393,45.193 393,44 L393,42 L396.906,43.5 L398.344,34 L393,34 z" fill="#B5B5B5"/>
+          <path d="M382,56 L391.359,34 L386,34 L371,56 z" fill="#B5B5B5"/>
           <path d="M391.5,53 L392.75,49 L389.75,49 L388.5,53 z M383.5,41 L385.5,37.5 L388.5,37.5 L386.5,41 z" fill="currentColor" id="highway-trunk-link-stroke3"/>
         </g>
-        <path d="M401,56 L401,52 C401,47.548 393,46.172 393,42 C393,39 393.375,34 393.375,34 L398.375,34 C398.375,34 398,37.996 398,40 C398,42 406.595,44.072 408,48 L410,56 z" fill="url(#Gradient_4)" id="path5657"/>
+        <path d="M401,56 L401,52 C401,47.548 393,46.172 393,42 C393,39 393.375,34 393.375,34 L398.375,34 C398.375,34 398,37.996 398,40 C398,42 406.595,44.072 408,48 L410,56 z" fill="url(#Gradient_4)"/>
       </g>
-      <g id="g6072">
-        <g id="g5377-1">
+      <g>
+        <g>
           <path d="M370.5,59 C369.119,59 368,60.119 368,61.5 C368,62.881 369.119,64 370.5,64 L409.5,64 C410.881,64 412,62.881 412,61.5 C412,60.119 410.881,59 409.5,59 L370.5,59 z M372.5,60 L407.5,60 C407.19,60.416 407,60.941 407,61.5 C407,62.059 407.19,62.584 407.5,63 L372.5,63 C372.81,62.584 373,62.059 373,61.5 C373,60.941 372.81,60.416 372.5,60 z" fill="inherit" id="highway-trunk-link-casing2" opacity="0.5"/>
           <path d="M372.5,60 C372.81,60.416 373,60.941 373,61.5 C373,62.059 372.81,62.584 372.5,63 L407.5,63 C407.19,62.584 407,62.059 407,61.5 C407,60.941 407.19,60.416 407.5,60 L372.5,60 z" fill="currentColor" id="highway-trunk-link-stroke2" opacity="0.5"/>
-          <path d="M372,61.5 C372,62.328 371.328,63 370.5,63 C369.672,63 369,62.328 369,61.5 C369,60.672 369.672,60 370.5,60 C371.328,60 372,60.672 372,61.5 z" fill="#FFFFFF" id="path5383-3"/>
-          <path d="M411,61.5 C411,62.328 410.328,63 409.5,63 C408.672,63 408,62.328 408,61.5 C408,60.672 408.672,60 409.5,60 C410.328,60 411,60.672 411,61.5 z" fill="#FFFFFF" id="path5385-4"/>
+          <path d="M372,61.5 C372,62.328 371.328,63 370.5,63 C369.672,63 369,62.328 369,61.5 C369,60.672 369.672,60 370.5,60 C371.328,60 372,60.672 372,61.5 z" fill="#FFFFFF"/>
+          <path d="M411,61.5 C411,62.328 410.328,63 409.5,63 C408.672,63 408,62.328 408,61.5 C408,60.672 408.672,60 409.5,60 C410.328,60 411,60.672 411,61.5 z" fill="#FFFFFF"/>
         </g>
         <path d="M387,59 C385.631,59 384.5,60.131 384.5,61.5 C384.5,62.869 385.631,64 387,64 C388.485,64.542 390.651,66.959 392.344,69.781 L395.344,74.781 C395.347,74.785 395.372,74.777 395.375,74.781 C395.815,75.509 396.597,76 397.5,76 C398.869,76 400,74.869 400,73.5 C400,73.034 399.852,72.594 399.625,72.219 L399.656,72.188 L396.656,67.188 C394.575,63.719 391.766,61.094 388.812,59.813 C388.354,59.32 387.717,59 387,59 z" fill="inherit" id="highway-trunk-link-casing1"/>
         <path d="M389.469,61.312 C389.474,61.376 389.5,61.436 389.5,61.5 C389.5,62.434 388.97,63.253 388.199,63.681 C389.981,64.753 392.223,67.633 393.219,69.25 L395.187,72.531 C395.57,71.636 396.473,71 397.5,71 C397.596,71 397.688,71.02 397.781,71.031 L395.781,67.719 C394.066,64.86 391.632,62.315 389.469,61.312 z M397.5,73 C397.212,73 397,73.212 397,73.5 C397,73.597 397.02,73.676 397.062,73.75 L397.906,73.25 C397.82,73.112 397.684,73 397.5,73 z" fill="currentColor" id="highway-trunk-link-stroke1"/>
-        <path d="M399,73.5 C399,74.328 398.328,75 397.5,75 C396.672,75 396,74.328 396,73.5 C396,72.672 396.672,72 397.5,72 C398.328,72 399,72.672 399,73.5 z" fill="#FFFFFF" id="path5383-5-05"/>
-        <path d="M388.5,61.5 C388.5,62.328 387.828,63 387,63 C386.172,63 385.5,62.328 385.5,61.5 C385.5,60.672 386.172,60 387,60 C387.828,60 388.5,60.672 388.5,61.5 z" fill="#FFFFFF" id="path5383-5-0-8"/>
+        <path d="M399,73.5 C399,74.328 398.328,75 397.5,75 C396.672,75 396,74.328 396,73.5 C396,72.672 396.672,72 397.5,72 C398.328,72 399,72.672 399,73.5 z" fill="#FFFFFF"/>
+        <path d="M388.5,61.5 C388.5,62.328 387.828,63 387,63 C386.172,63 385.5,62.328 385.5,61.5 C385.5,60.672 386.172,60 387,60 C387.828,60 388.5,60.672 388.5,61.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-motorway-link" viewBox="300 20 60 60">
-      <g id="g5855">
-        <g id="g5625">
-          <path d="M334,34 L325,56 L336,56 L337.156,48.375 C335.72,47.032 334,45.193 334,44 L334,42 L337.906,43.5 L339.344,34 L334,34 z" fill="#B5B5B5" id="path5425"/>
-          <path d="M342,56 L342,52 C342,47.548 334,46.172 334,42 C334,39 334.375,34 334.375,34 L339.375,34 C339.375,34 339,37.996 339,40 C339,42 347.595,44.072 349,48 L351,56 z" fill="url(#Gradient_5)" id="path26176-5-7-3"/>
-          <path d="M319,56 L330.359,34 L325,34 L308,56 z" fill="#B5B5B5" id="path5450"/>
-          <path d="M332.5,53 L333.75,49 L330.75,49 L329.5,53 z M322.5,41 L324.5,37.5 L327.5,37.5 L325.5,41 z" fill="currentColor" id="highway-motorway-link-stroke3"/>
-        </g>
-        <g id="g6072">
-          <g id="g5377-1">
-            <path d="M310.5,59 C309.119,59 308,60.119 308,61.5 C308,62.881 309.119,64 310.5,64 L349.5,64 C350.881,64 352,62.881 352,61.5 C352,60.119 350.881,59 349.5,59 L310.5,59 z M312.5,60 L347.5,60 C347.19,60.416 347,60.941 347,61.5 C347,62.059 347.19,62.584 347.5,63 L312.5,63 C312.81,62.584 313,62.059 313,61.5 C313,60.941 312.81,60.416 312.5,60 z" fill="inherit" id="highway-motorway-link-casing2" opacity="0.5"/>
-            <path d="M312.5,60 C312.81,60.416 313,60.941 313,61.5 C313,62.059 312.81,62.584 312.5,63 L347.5,63 C347.19,62.584 347,62.059 347,61.5 C347,60.941 347.19,60.416 347.5,60 L312.5,60 z" fill="currentColor" id="highway-motorway-link-stroke2" opacity="0.5"/>
-            <path d="M312,61.5 C312,62.328 311.328,63 310.5,63 C309.672,63 309,62.328 309,61.5 C309,60.672 309.672,60 310.5,60 C311.328,60 312,60.672 312,61.5 z" fill="#FFFFFF" id="path5383-3"/>
-            <path d="M351,61.5 C351,62.328 350.328,63 349.5,63 C348.672,63 348,62.328 348,61.5 C348,60.672 348.672,60 349.5,60 C350.328,60 351,60.672 351,61.5 z" fill="#FFFFFF" id="path5385-4"/>
-          </g>
-          <path d="M327,59 C325.631,59 324.5,60.131 324.5,61.5 C324.5,62.869 325.631,64 327,64 C328.485,64.542 330.651,66.959 332.344,69.781 L335.344,74.781 C335.347,74.785 335.372,74.777 335.375,74.781 C335.815,75.509 336.597,76 337.5,76 C338.869,76 340,74.869 340,73.5 C340,73.034 339.852,72.594 339.625,72.219 L339.656,72.188 L336.656,67.188 C334.575,63.719 331.766,61.094 328.812,59.813 C328.354,59.32 327.717,59 327,59 z" fill="inherit" id="highway-motorway-link-casing1"/>
-          <path d="M329.469,61.312 C329.474,61.376 329.5,61.436 329.5,61.5 C329.5,62.434 328.97,63.253 328.199,63.681 C329.981,64.753 332.223,67.633 333.219,69.25 L335.187,72.531 C335.57,71.636 336.473,71 337.5,71 C337.596,71 337.688,71.02 337.781,71.031 L335.781,67.719 C334.066,64.86 331.632,62.315 329.469,61.312 z M337.5,73 C337.212,73 337,73.212 337,73.5 C337,73.597 337.02,73.676 337.062,73.75 L337.906,73.25 C337.82,73.112 337.684,73 337.5,73 z" fill="currentColor" id="highway-motorway-link-stroke1"/>
-          <path d="M339,73.5 C339,74.328 338.328,75 337.5,75 C336.672,75 336,74.328 336,73.5 C336,72.672 336.672,72 337.5,72 C338.328,72 339,72.672 339,73.5 z" fill="#FFFFFF" id="path5383-5-05"/>
-          <path d="M328.5,61.5 C328.5,62.328 327.828,63 327,63 C326.172,63 325.5,62.328 325.5,61.5 C325.5,60.672 326.172,60 327,60 C327.828,60 328.5,60.672 328.5,61.5 z" fill="#FFFFFF" id="path5383-5-0-8"/>
+      <g>
+        <path d="M334,34 L325,56 L336,56 L337.156,48.375 C335.72,47.032 334,45.193 334,44 L334,42 L337.906,43.5 L339.344,34 L334,34 z" fill="#B5B5B5"/>
+        <path d="M342,56 L342,52 C342,47.548 334,46.172 334,42 C334,39 334.375,34 334.375,34 L339.375,34 C339.375,34 339,37.996 339,40 C339,42 347.595,44.072 349,48 L351,56 z" fill="url(#Gradient_5)"/>
+        <path d="M319,56 L330.359,34 L325,34 L308,56 z" fill="#B5B5B5"/>
+        <path d="M332.5,53 L333.75,49 L330.75,49 L329.5,53 z M322.5,41 L324.5,37.5 L327.5,37.5 L325.5,41 z" fill="currentColor" id="highway-motorway-link-stroke3"/>
+      </g>
+      <g>
+        <g>
+          <path d="M310.5,59 C309.119,59 308,60.119 308,61.5 C308,62.881 309.119,64 310.5,64 L349.5,64 C350.881,64 352,62.881 352,61.5 C352,60.119 350.881,59 349.5,59 L310.5,59 z M312.5,60 L347.5,60 C347.19,60.416 347,60.941 347,61.5 C347,62.059 347.19,62.584 347.5,63 L312.5,63 C312.81,62.584 313,62.059 313,61.5 C313,60.941 312.81,60.416 312.5,60 z" fill="inherit" id="highway-motorway-link-casing2" opacity="0.5"/>
+          <path d="M312.5,60 C312.81,60.416 313,60.941 313,61.5 C313,62.059 312.81,62.584 312.5,63 L347.5,63 C347.19,62.584 347,62.059 347,61.5 C347,60.941 347.19,60.416 347.5,60 L312.5,60 z" fill="currentColor" id="highway-motorway-link-stroke2" opacity="0.5"/>
+          <path d="M312,61.5 C312,62.328 311.328,63 310.5,63 C309.672,63 309,62.328 309,61.5 C309,60.672 309.672,60 310.5,60 C311.328,60 312,60.672 312,61.5 z" fill="#FFFFFF"/>
+          <path d="M351,61.5 C351,62.328 350.328,63 349.5,63 C348.672,63 348,62.328 348,61.5 C348,60.672 348.672,60 349.5,60 C350.328,60 351,60.672 351,61.5 z" fill="#FFFFFF"/>
         </g>
+        <path d="M327,59 C325.631,59 324.5,60.131 324.5,61.5 C324.5,62.869 325.631,64 327,64 C328.485,64.542 330.651,66.959 332.344,69.781 L335.344,74.781 C335.347,74.785 335.372,74.777 335.375,74.781 C335.815,75.509 336.597,76 337.5,76 C338.869,76 340,74.869 340,73.5 C340,73.034 339.852,72.594 339.625,72.219 L339.656,72.188 L336.656,67.188 C334.575,63.719 331.766,61.094 328.812,59.813 C328.354,59.32 327.717,59 327,59 z" fill="inherit" id="highway-motorway-link-casing1"/>
+        <path d="M329.469,61.312 C329.474,61.376 329.5,61.436 329.5,61.5 C329.5,62.434 328.97,63.253 328.199,63.681 C329.981,64.753 332.223,67.633 333.219,69.25 L335.187,72.531 C335.57,71.636 336.473,71 337.5,71 C337.596,71 337.688,71.02 337.781,71.031 L335.781,67.719 C334.066,64.86 331.632,62.315 329.469,61.312 z M337.5,73 C337.212,73 337,73.212 337,73.5 C337,73.597 337.02,73.676 337.062,73.75 L337.906,73.25 C337.82,73.112 337.684,73 337.5,73 z" fill="currentColor" id="highway-motorway-link-stroke1"/>
+        <path d="M339,73.5 C339,74.328 338.328,75 337.5,75 C336.672,75 336,74.328 336,73.5 C336,72.672 336.672,72 337.5,72 C338.328,72 339,72.672 339,73.5 z" fill="#FFFFFF"/>
+        <path d="M328.5,61.5 C328.5,62.328 327.828,63 327,63 C326.172,63 325.5,62.328 325.5,61.5 C325.5,60.672 326.172,60 327,60 C327.828,60 328.5,60.672 328.5,61.5 z" fill="#FFFFFF"/>
       </g>
     </symbol>
     <symbol id="highway-tertiary" viewBox="240 20 60 60">
-      <g id="g26993">
+      <g>
         <path d="M250.5,59 C249.119,59 248,60.119 248,61.5 C248,62.881 249.119,64 250.5,64 L289.5,64 C290.881,64 292,62.881 292,61.5 C292,60.119 290.881,59 289.5,59 z" fill="inherit" id="highway-tertiary-casing1"/>
         <path d="M252.5,60 C252.81,60.416 253,60.941 253,61.5 C253,62.059 252.81,62.584 252.5,63 L287.5,63 C287.19,62.584 287,62.059 287,61.5 C287,60.941 287.19,60.416 287.5,60 L252.5,60 z" fill="currentColor" id="highway-tertiary-stroke1"/>
-        <path d="M252,61.5 C252,62.328 251.328,63 250.5,63 C249.672,63 249,62.328 249,61.5 C249,60.672 249.672,60 250.5,60 C251.328,60 252,60.672 252,61.5 z" fill="#FFFFFF" id="path26999"/>
-        <path d="M291,61.5 C291,62.328 290.328,63 289.5,63 C288.672,63 288,62.328 288,61.5 C288,60.672 288.672,60 289.5,60 C290.328,60 291,60.672 291,61.5 z" fill="#FFFFFF" id="path27001"/>
+        <path d="M252,61.5 C252,62.328 251.328,63 250.5,63 C249.672,63 249,62.328 249,61.5 C249,60.672 249.672,60 250.5,60 C251.328,60 252,60.672 252,61.5 z" fill="#FFFFFF"/>
+        <path d="M291,61.5 C291,62.328 290.328,63 289.5,63 C288.672,63 288,62.328 288,61.5 C288,60.672 288.672,60 289.5,60 C290.328,60 291,60.672 291,61.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M262,34 L258,56 L269,56 L269.031,54 L270.969,54 L271,56 L282,56 L277.5,34 L270.5,34 L270.562,37 L269.437,37 L269.5,34 L262,34 z M269.406,38 L270.594,38 L270.656,41 L269.344,41 L269.406,38 z M269.313,42 L270.688,42 L270.75,45 L269.25,45 L269.313,42 z M269.219,46 L270.781,46 L270.844,49 L269.156,49 L269.219,46 z M269.125,50 L270.875,50 L270.938,53 L269.063,53 L269.125,50 z" fill="#444444" id="path27005"/>
+      <path d="M262,34 L258,56 L269,56 L269.031,54 L270.969,54 L271,56 L282,56 L277.5,34 L270.5,34 L270.562,37 L269.437,37 L269.5,34 L262,34 z M269.406,38 L270.594,38 L270.656,41 L269.344,41 L269.406,38 z M269.313,42 L270.688,42 L270.75,45 L269.25,45 L269.313,42 z M269.219,46 L270.781,46 L270.844,49 L269.156,49 L269.219,46 z M269.125,50 L270.875,50 L270.938,53 L269.063,53 L269.125,50 z" fill="#444444"/>
       <path d="M275,53 L274.5,49 L277.5,49 L278,53 z M263.25,40 L263.562,36 L266.438,36 L266.125,40 z" fill="currentColor" id="highway-tertiary-stroke2"/>
     </symbol>
     <symbol id="highway-secondary" viewBox="180 20 60 60">
-      <g id="g26924">
+      <g>
         <path d="M190.5,59 C189.119,59 188,60.119 188,61.5 C188,62.881 189.119,64 190.5,64 L229.5,64 C230.881,64 232,62.881 232,61.5 C232,60.119 230.881,59 229.5,59 z" fill="inherit" id="highway-secondary-casing1"/>
         <path d="M192.5,60 C192.81,60.416 193,60.941 193,61.5 C193,62.059 192.81,62.584 192.5,63 L227.5,63 C227.19,62.584 227,62.059 227,61.5 C227,60.941 227.19,60.416 227.5,60 L192.5,60 z" fill="currentColor" id="highway-secondary-stroke1"/>
-        <path d="M192,61.5 C192,62.328 191.328,63 190.5,63 C189.672,63 189,62.328 189,61.5 C189,60.672 189.672,60 190.5,60 C191.328,60 192,60.672 192,61.5 z" fill="#FFFFFF" id="path26930"/>
-        <path d="M231,61.5 C231,62.328 230.328,63 229.5,63 C228.672,63 228,62.328 228,61.5 C228,60.672 228.672,60 229.5,60 C230.328,60 231,60.672 231,61.5 z" fill="#FFFFFF" id="path26932"/>
+        <path d="M192,61.5 C192,62.328 191.328,63 190.5,63 C189.672,63 189,62.328 189,61.5 C189,60.672 189.672,60 190.5,60 C191.328,60 192,60.672 192,61.5 z" fill="#FFFFFF"/>
+        <path d="M231,61.5 C231,62.328 230.328,63 229.5,63 C228.672,63 228,62.328 228,61.5 C228,60.672 228.672,60 229.5,60 C230.328,60 231,60.672 231,61.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M202,34 L198,56 L209,56 L209.5,34 L202,34 z M210.5,34 L211,56 L222,56 L217.5,34 L210.5,34 z" fill="#444444" id="path26936"/>
+      <path d="M202,34 L198,56 L209,56 L209.5,34 L202,34 z M210.5,34 L211,56 L222,56 L217.5,34 L210.5,34 z" fill="#444444"/>
       <path d="M215,53 L214.5,49 L217.5,49 L218,53 z M203.25,40 L203.562,36 L206.438,36 L206.125,40 z" fill="currentColor" id="highway-secondary-stroke2"/>
     </symbol>
     <symbol id="highway-primary" viewBox="120 20 60 60">
-      <g id="g26753">
+      <g>
         <path d="M130.5,59 C129.119,59 128,60.119 128,61.5 C128,62.881 129.119,64 130.5,64 L169.5,64 C170.881,64 172,62.881 172,61.5 C172,60.119 170.881,59 169.5,59 z" fill="inherit" id="highway-primary-casing1"/>
         <path d="M132.5,60 C132.81,60.416 133,60.941 133,61.5 C133,62.059 132.81,62.584 132.5,63 L167.5,63 C167.19,62.584 167,62.059 167,61.5 C167,60.941 167.19,60.416 167.5,60 L132.5,60 z" fill="currentColor" id="highway-primary-stroke1"/>
-        <path d="M132,61.5 C132,62.328 131.328,63 130.5,63 C129.672,63 129,62.328 129,61.5 C129,60.672 129.672,60 130.5,60 C131.328,60 132,60.672 132,61.5 z" fill="#FFFFFF" id="path26759"/>
-        <path d="M171,61.5 C171,62.328 170.328,63 169.5,63 C168.672,63 168,62.328 168,61.5 C168,60.672 168.672,60 169.5,60 C170.328,60 171,60.672 171,61.5 z" fill="#FFFFFF" id="path26761"/>
+        <path d="M132,61.5 C132,62.328 131.328,63 130.5,63 C129.672,63 129,62.328 129,61.5 C129,60.672 129.672,60 130.5,60 C131.328,60 132,60.672 132,61.5 z" fill="#FFFFFF"/>
+        <path d="M171,61.5 C171,62.328 170.328,63 169.5,63 C168.672,63 168,62.328 168,61.5 C168,60.672 168.672,60 169.5,60 C170.328,60 171,60.672 171,61.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M137,34 L133,56 L140,56 L140.281,54 L142.219,54 L142,56 L149,56 L149.5,34 L144.5,34 L144.156,37 L142.594,37 L143,34 L137,34 z M150.5,34 L151,56 L158,56 L157.781,54 L159.719,54 L160,56 L167,56 L162.5,34 L157,34 L157.406,37 L155.844,37 L155.5,34 L150.5,34 z M142.469,38 L144.031,38 L143.719,41 L142.031,41 L142.469,38 z M155.969,38 L157.531,38 L157.969,41 L156.281,41 L155.969,38 z M141.906,42 L143.594,42 L143.25,45 L141.5,45 L141.906,42 z M156.406,42 L158.094,42 L158.5,45 L156.75,45 L156.406,42 z M141.375,46 L143.125,46 L142.781,49 L140.969,49 L141.375,46 z M156.875,46 L158.625,46 L159.031,49 L157.219,49 L156.875,46 z M140.812,50 L142.688,50 L142.344,53 L140.406,53 L140.812,50 z M157.312,50 L159.188,50 L159.594,53 L157.656,53 L157.312,50 z" fill="#444444" id="path26765"/>
+      <path d="M137,34 L133,56 L140,56 L140.281,54 L142.219,54 L142,56 L149,56 L149.5,34 L144.5,34 L144.156,37 L142.594,37 L143,34 L137,34 z M150.5,34 L151,56 L158,56 L157.781,54 L159.719,54 L160,56 L167,56 L162.5,34 L157,34 L157.406,37 L155.844,37 L155.5,34 L150.5,34 z M142.469,38 L144.031,38 L143.719,41 L142.031,41 L142.469,38 z M155.969,38 L157.531,38 L157.969,41 L156.281,41 L155.969,38 z M141.906,42 L143.594,42 L143.25,45 L141.5,45 L141.906,42 z M156.406,42 L158.094,42 L158.5,45 L156.75,45 L156.406,42 z M141.375,46 L143.125,46 L142.781,49 L140.969,49 L141.375,46 z M156.875,46 L158.625,46 L159.031,49 L157.219,49 L156.875,46 z M140.812,50 L142.688,50 L142.344,53 L140.406,53 L140.812,50 z M157.312,50 L159.188,50 L159.594,53 L157.656,53 L157.312,50 z" fill="#444444"/>
       <path d="M139,53 L139.5,49 L136.5,49 L136,53 z M162,40 L161.25,36 L158.375,36 L159.125,40 z M156,53 L155.5,49 L152.5,49 L153,53 z M145.25,40 L145.562,36 L148.438,36 L148.125,40 z" fill="currentColor" id="highway-primary-stroke2"/>
     </symbol>
     <symbol id="highway-trunk" viewBox="60 20 60 60">
-      <g id="g25912-3-1">
+      <g>
         <path d="M70.5,59 C69.119,59 68,60.119 68,61.5 C68,62.881 69.119,64 70.5,64 L109.5,64 C110.881,64 112,62.881 112,61.5 C112,60.119 110.881,59 109.5,59 z" fill="inherit" id="highway-trunk-casing1"/>
         <path d="M72.5,60 C72.81,60.416 73,60.941 73,61.5 C73,62.059 72.81,62.584 72.5,63 L107.5,63 C107.19,62.584 107,62.059 107,61.5 C107,60.941 107.19,60.416 107.5,60 L72.5,60 z" fill="currentColor" id="highway-trunk-stroke1"/>
-        <path d="M72,61.5 C72,62.328 71.328,63 70.5,63 C69.672,63 69,62.328 69,61.5 C69,60.672 69.672,60 70.5,60 C71.328,60 72,60.672 72,61.5 z" fill="#FFFFFF" id="path25918-8-49"/>
-        <path d="M111,61.5 C111,62.328 110.328,63 109.5,63 C108.672,63 108,62.328 108,61.5 C108,60.672 108.672,60 109.5,60 C110.328,60 111,60.672 111,61.5 z" fill="#FFFFFF" id="path25920-1-2"/>
+        <path d="M72,61.5 C72,62.328 71.328,63 70.5,63 C69.672,63 69,62.328 69,61.5 C69,60.672 69.672,60 70.5,60 C71.328,60 72,60.672 72,61.5 z" fill="#FFFFFF"/>
+        <path d="M111,61.5 C111,62.328 110.328,63 109.5,63 C108.672,63 108,62.328 108,61.5 C108,60.672 108.672,60 109.5,60 C110.328,60 111,60.672 111,61.5 z" fill="#FFFFFF"/>
       </g>
-      <path d="M75,34 L70,56 L77.5,56 L80.5,34 L75,34 z M82,34 L79.5,56 L89,56 L89.5,34 L82,34 z M90.5,34 L91,56 L100,56 L97.5,34 L90.5,34 z M99,34 L102,56 L110,56 L104.5,34 L99,34 z" fill="#444444" id="path26832"/>
+      <path d="M75,34 L70,56 L77.5,56 L80.5,34 L75,34 z M82,34 L79.5,56 L89,56 L89.5,34 L82,34 z M90.5,34 L91,56 L100,56 L97.5,34 L90.5,34 z M99,34 L102,56 L110,56 L104.5,34 L99,34 z" fill="#444444"/>
       <path d="M101.75,40 L101,36 L103.875,36 L104.625,40 z M97,53 L96.5,49 L93.5,49 L94,53 z M73.5,53 L74,49 L77,49 L76.5,53 z M83.25,40 L83.562,36 L86.438,36 L86.125,40 z" fill="currentColor" id="highway-trunk-stroke2"/>
     </symbol>
     <symbol id="highway-motorway" viewBox="0 20 60 60">
-      <g id="g25912-3-7-6">
+      <g>
         <path d="M10.5,59 C9.119,59 8,60.119 8,61.5 C8,62.881 9.119,64 10.5,64 L49.5,64 C50.881,64 52,62.881 52,61.5 C52,60.119 50.881,59 49.5,59 z" fill="inherit" id="highway-motorway-casing1"/>
         <path d="M12.5,60 C12.81,60.416 13,60.941 13,61.5 C13,62.059 12.81,62.584 12.5,63 L47.5,63 C47.19,62.584 47,62.059 47,61.5 C47,60.941 47.19,60.416 47.5,60 L12.5,60 z" fill="currentColor" id="highway-motorway-stroke1"/>
-        <path d="M12,61.5 C12,62.328 11.328,63 10.5,63 C9.672,63 9,62.328 9,61.5 C9,60.672 9.672,60 10.5,60 C11.328,60 12,60.672 12,61.5 z" fill="#FFFFFF" id="path25918-8-4-5"/>
-        <path d="M51,61.5 C51,62.328 50.328,63 49.5,63 C48.672,63 48,62.328 48,61.5 C48,60.672 48.672,60 49.5,60 C50.328,60 51,60.672 51,61.5 z" fill="#FFFFFF" id="path25920-1-6-2"/>
-      </g>
-      <g id="g26811">
-        <path d="M13,34 L8,56 L16.5,56 L19.5,34 L13,34 z M21,34 L18.5,56 L27,56 L28,34 L21,34 z M32,34 L33,56 L40.5,56 L38,34 L32,34 z M39.5,34 L42.5,56 L52,56 L46.5,34 L39.5,34 z" fill="#444444" id="path24321-8"/>
-        <path d="M42.75,40 L42,36 L44.875,36 L45.625,40 z M38,53 L37.5,49 L34.5,49 L35,53 z M11.5,53 L12,49 L15,49 L14.5,53 z M23.25,40 L23.562,36 L26.438,36 L26.125,40 z" fill="currentColor" id="highway-motorway-stroke2"/>
+        <path d="M12,61.5 C12,62.328 11.328,63 10.5,63 C9.672,63 9,62.328 9,61.5 C9,60.672 9.672,60 10.5,60 C11.328,60 12,60.672 12,61.5 z" fill="#FFFFFF"/>
+        <path d="M51,61.5 C51,62.328 50.328,63 49.5,63 C48.672,63 48,62.328 48,61.5 C48,60.672 48.672,60 49.5,60 C50.328,60 51,60.672 51,61.5 z" fill="#FFFFFF"/>
       </g>
+      <path d="M13,34 L8,56 L16.5,56 L19.5,34 L13,34 z M21,34 L18.5,56 L27,56 L28,34 L21,34 z M32,34 L33,56 L40.5,56 L38,34 L32,34 z M39.5,34 L42.5,56 L52,56 L46.5,34 L39.5,34 z" fill="#444444"/>
+      <path d="M42.75,40 L42,36 L44.875,36 L45.625,40 z M38,53 L37.5,49 L34.5,49 L35,53 z M11.5,53 L12,49 L15,49 L14.5,53 z M23.25,40 L23.562,36 L26.438,36 L26.125,40 z" fill="currentColor" id="highway-motorway-stroke2"/>
     </symbol>
   </g>
   <g id="icons">
+    <symbol id="icon-no" viewBox="640 0 20 20">
+      <path d="M650,2 C645.582,2 642,5.582 642,10 C642,14.418 645.582,18 650,18 C654.418,18 658,14.418 658,10 C658,5.582 654.418,2 650,2 z M650,4.065 C653.278,4.065 655.935,6.722 655.935,10 C655.935,11.267 655.531,12.439 654.855,13.403 L646.597,5.145 C647.561,4.469 648.733,4.065 650,4.065 z M645.145,6.597 L653.403,14.855 C652.439,15.531 651.267,15.935 650,15.935 C646.722,15.935 644.065,13.278 644.065,10 C644.065,8.733 644.469,7.561 645.145,6.597 z" fill="currentColor" id="icon-no-shape"/>
+    </symbol>
     <symbol id="icon-more" viewBox="620 0 20 20">
       <path d="M636,12 C634.895,12 634,11.105 634,10 C634,8.895 634.895,8 636,8 C637.105,8 638,8.895 638,10 C638,11.105 637.105,12 636,12 z M630,12 C631.105,12 632,11.105 632,10 C632,8.895 631.105,8 630,8 C628.895,8 628,8.895 628,10 C628,11.105 628.895,12 630,12 z M624,12 C625.105,12 626,11.105 626,10 C626,8.895 625.105,8 624,8 C622.895,8 622,8.895 622,10 C622,11.105 622.895,12 624,12 z" fill="currentColor" id="icon-more-shape"/>
     </symbol>
       <path d="M590.125,6 L590.762,6.023 L591.199,6.336 C591.949,7.172 591.949,7.172 594.199,9.682 C596.449,12.191 596.449,12.191 597.199,13.027 C597.648,13.528 597.588,14.283 597.063,14.712 C596.539,15.142 595.75,15.084 595.301,14.583 C594.551,13.746 594.551,13.746 592.301,11.237 C591.617,10.474 590.933,9.712 590.25,8.949 C589.566,9.712 588.883,10.474 588.199,11.237 C585.949,13.746 585.949,13.746 585.199,14.583 C584.75,15.084 583.961,15.142 583.437,14.712 C582.912,14.283 582.852,13.528 583.301,13.027 C584.051,12.191 584.051,12.191 586.301,9.682 C588.551,7.172 588.551,7.172 589.301,6.336 C589.657,6.056 589.653,6.017 590.125,6 z" fill="currentColor" id="icon-up-shape"/>
     </symbol>
     <symbol id="icon-forward" viewBox="560 0 20 20">
-      <path d="M566.63,4 C565.527,4.079 565.939,3.887 565.301,4.353 C564.852,4.843 564.912,5.581 565.437,6.001 C566.312,6.702 566.312,6.702 568.937,8.805 C569.734,9.444 570.532,10.083 571.329,10.722 C570.532,11.361 569.734,12.001 568.937,12.64 C566.312,14.743 566.312,14.743 565.437,15.444 C564.912,15.864 564.852,16.602 565.301,17.092 C565.75,17.582 566.539,17.639 567.063,17.219 C567.938,16.518 567.938,16.518 570.563,14.414 C573.188,12.311 573.188,12.311 574.063,11.61 C574.646,11.143 574.646,10.302 574.063,9.835 C573.188,9.134 573.188,9.134 570.563,7.031 C567.938,4.927 567.938,4.927 567.063,4.226 L566.63,4 z" fill="currentColor" id="icon-backward-shape"/>
+      <path d="M566.63,4 C565.527,4.079 565.939,3.887 565.301,4.353 C564.852,4.843 564.912,5.581 565.437,6.001 C566.312,6.702 566.312,6.702 568.937,8.805 C569.734,9.444 570.532,10.083 571.329,10.722 C570.532,11.361 569.734,12.001 568.937,12.64 C566.312,14.743 566.312,14.743 565.437,15.444 C564.912,15.864 564.852,16.602 565.301,17.092 C565.75,17.582 566.539,17.639 567.063,17.219 C567.938,16.518 567.938,16.518 570.563,14.414 C573.188,12.311 573.188,12.311 574.063,11.61 C574.646,11.143 574.646,10.302 574.063,9.835 C573.188,9.134 573.188,9.134 570.563,7.031 C567.938,4.927 567.938,4.927 567.063,4.226 L566.63,4 z" fill="currentColor" id="icon-forward-shape"/>
     </symbol>
     <symbol id="icon-backward" viewBox="540 0 20 20">
       <path d="M552.87,4 C553.973,4.079 553.561,3.887 554.199,4.353 C554.648,4.843 554.588,5.581 554.063,6.001 C553.188,6.702 553.188,6.702 550.563,8.805 C549.766,9.444 548.968,10.083 548.171,10.722 C548.968,11.361 549.766,12.001 550.563,12.64 C553.188,14.743 553.188,14.743 554.063,15.444 C554.588,15.864 554.648,16.602 554.199,17.092 C553.75,17.582 552.961,17.639 552.437,17.219 C551.562,16.518 551.562,16.518 548.937,14.414 C546.312,12.311 546.312,12.311 545.437,11.61 C544.854,11.143 544.854,10.302 545.437,9.835 C546.312,9.134 546.312,9.134 548.937,7.031 C551.562,4.927 551.562,4.927 552.437,4.226 L552.87,4 z" fill="currentColor" id="icon-backward-shape"/>
       <path d="M489,2 L488,3 L488,4.594 L483.594,9 L482,9 L481,10 L481,12 L482,13 L484,13 L485,12 L485,10.406 L489.406,6 L491,6 L492,5 L492,3 L491,2 z M491,13 L491,15 L492,16 L494,16 L495,15 L495,13 L494,12 L492,12 z M491,9 L492,10 L494,10 L495,9 L497,9 L498,10 L498,12 L497,13 L497,15 L498,16 L498,18 L497,19 L495,19 L494,18 L492,18 L491,19 L489,19 L488,18 L488,16 L489,15 L489,13 L488,12 L488,10 L489,9 z" fill="currentColor" id="icon-data-shape"/>
     </symbol>
     <symbol id="icon-help" viewBox="460 0 20 20">
-      <path d="M464,2 L463,3 L463,16 L464,17 L475,17 L476,16 L476,6 L472,6 L472,12 L469.5,10.5 L467,12 L467,6 L465,6 L465,5 L465,4 L476,4 L476,3 L476,2 L464,2 z" fill="currentColor" id="icon-help-shape"/>
+      <path d="M476.5,1 L477.5,2 L477.5,16 L476.5,17 L476.5,2 L465,2 L464.5,3 L475.5,3 L475.5,18 L474.5,19 L463,19 L463,3 L464,1 L476.5,1 z M470.4,13.844 L468.202,13.844 L468.202,16 L470.4,16 L470.4,13.844 z M469.35,5.766 Q468.58,5.766 467.957,6.025 Q467.334,6.284 466.893,6.746 Q466.452,7.208 466.207,7.838 Q465.962,8.468 465.948,9.224 L468.006,9.224 Q468.006,8.846 468.09,8.517 Q468.174,8.188 468.349,7.943 Q468.524,7.698 468.797,7.551 Q469.07,7.404 469.448,7.404 Q470.008,7.404 470.323,7.712 Q470.638,8.02 470.638,8.664 Q470.652,9.042 470.505,9.294 Q470.358,9.546 470.12,9.756 Q469.882,9.966 469.602,10.176 Q469.322,10.386 469.07,10.673 Q468.818,10.96 468.629,11.366 Q468.44,11.772 468.398,12.374 L468.398,13.004 L470.288,13.004 L470.288,12.472 Q470.344,12.052 470.561,11.772 Q470.778,11.492 471.058,11.275 Q471.338,11.058 471.653,10.841 Q471.968,10.624 472.227,10.316 Q472.486,10.008 472.661,9.574 Q472.836,9.14 472.836,8.468 Q472.836,8.062 472.661,7.593 Q472.486,7.124 472.08,6.718 Q471.674,6.312 471.009,6.039 Q470.344,5.766 469.35,5.766 z" fill="currentColor" id="icon-help-shape"/>
     </symbol>
     <symbol id="icon-inspect" viewBox="440 0 20 20">
       <path d="M450.452,3 Q451.015,3 451.415,3.4 Q451.814,3.8 451.814,4.371 Q451.814,4.934 451.415,5.333 Q451.015,5.733 450.443,5.733 Q449.881,5.733 449.481,5.333 Q449.081,4.934 449.081,4.371 Q449.081,3.8 449.481,3.4 Q449.881,3 450.452,3 z M448,15.744 L448,15.015 Q448.993,14.979 449.147,14.892 Q449.301,14.804 449.345,14.399 Q449.415,13.846 449.415,11.956 Q449.415,11.139 449.389,10.444 L449.362,9.416 Q449.362,8.906 449.252,8.788 Q449.143,8.669 448.659,8.651 L448,8.625 L448,7.948 Q450.118,7.79 451.489,7.201 L451.709,7.377 Q451.586,9.056 451.586,12.264 Q451.586,14.118 451.647,14.505 Q451.691,14.777 451.81,14.856 Q451.929,14.936 452.966,15.015 L452.966,15.744 Q451.375,15.691 450.505,15.691 Q450.039,15.691 448,15.744 z" fill="currentColor" id="icon-inspect-shape"/>
     <symbol id="icon-bug" viewBox="400 0 20 20">
       <path d="M406,3 L406,4 L408,6.406 L408,8 L412,8 L412,6.406 L414,4 L414,3 L413,3 L411,5 L409,5 L407,3 L406,3 z M407,9 L406,10 L403,10 L402,11 L403,12 L406,12 L406,13 L404,14 L403,15 L403,16 L404,16 L406,15 L408,17 L412,17 L414,15 L416,16 L417,16 L417,15 L416,14 L414,13 L414,12 L417,12 L418,11 L417,10 L414,10 L413,9 L407,9 z" fill="currentColor" id="icon-bug-shape"/>
     </symbol>
+    <symbol id="icon-out-link" viewBox="380 0 20 20">
+      <path d="M390.13,3.582 L390.041,4.159 C390.032,4.214 390.025,4.262 390.01,4.37 L390.009,4.381 C390.002,4.421 389.999,4.472 389.999,4.534 L389.999,5.233 C389.999,5.311 390.01,5.398 390.033,5.496 L390.179,6.112 L384.932,6.112 C384.819,6.112 384.731,6.148 384.65,6.229 C384.565,6.314 384.53,6.4 384.53,6.516 L384.53,13.824 C384.53,13.94 384.565,14.026 384.648,14.108 C384.732,14.192 384.819,14.228 384.932,14.228 L393.454,14.228 C393.57,14.228 393.658,14.192 393.746,14.105 C393.83,14.023 393.867,13.937 393.866,13.824 L393.866,10.124 L394.668,10.73 C394.845,10.864 395.039,10.97 395.249,11.048 C395.465,11.126 395.684,11.169 395.911,11.175 L396.396,11.189 L396.396,13.824 C396.396,14.226 396.315,14.61 396.153,14.972 C395.995,15.318 395.784,15.626 395.52,15.89 C395.256,16.154 394.949,16.364 394.6,16.522 C394.244,16.679 393.861,16.758 393.454,16.758 L384.932,16.758 C384.533,16.758 384.149,16.68 383.786,16.522 C383.429,16.366 383.118,16.153 382.856,15.886 C382.6,15.623 382.393,15.317 382.236,14.965 C382.079,14.607 382,14.224 382,13.824 L382,6.516 C382,6.116 382.078,5.734 382.235,5.369 C382.391,5.012 382.599,4.704 382.86,4.442 C383.121,4.181 383.432,3.973 383.786,3.82 C384.147,3.661 384.531,3.582 384.932,3.582 L390.13,3.582 z M396.656,3.582 L392.091,3.582 C391.836,3.582 391.604,3.677 391.418,3.853 C391.214,4.054 391.116,4.307 391.142,4.582 L391.139,5.216 C391.14,5.476 391.23,5.712 391.408,5.894 C391.586,6.079 391.826,6.175 392.091,6.175 L393.018,6.175 L387.765,11.443 C387.584,11.611 387.485,11.856 387.489,12.127 C387.495,12.388 387.587,12.617 387.762,12.795 L388.389,13.43 C388.586,13.616 388.82,13.705 389.075,13.705 C389.334,13.705 389.569,13.613 389.749,13.433 L395.015,8.181 L395.015,9.101 C395.016,9.358 395.111,9.593 395.293,9.775 C395.475,9.957 395.712,10.051 395.974,10.051 L396.656,10.051 C396.873,10.075 397.121,9.982 397.316,9.793 C397.509,9.605 397.608,9.367 397.608,9.101 L397.608,4.534 C397.608,4.284 397.509,4.054 397.329,3.871 C397.15,3.685 396.915,3.582 396.656,3.582 z" fill="currentColor" id="icon-out-link-shape"/>
+    </symbol>
     <symbol id="icon-geolocate" viewBox="360 0 20 20">
       <path d="M374.97,3.748 C375.931,3.873 376.382,4.536 376.16,5.464 C375.611,6.839 375.611,6.839 373.961,10.964 C372.311,15.089 372.311,15.089 371.76,16.464 C371.249,17.742 369.35,17.376 369.35,16 L369.35,10 L364,10 C362.587,10 362.259,8.023 363.597,7.567 C364.975,7.097 366.354,6.627 367.732,6.157 C370.02,5.377 372.309,4.597 374.597,3.817 L374.97,3.748 z" fill="currentColor" id="icon-geolocate-shape"/>
     </symbol>
     <symbol id="icon-plus" viewBox="240 0 20 20">
       <path d="M250,3.75 C250.69,3.75 251.25,4.31 251.25,5 L251.25,8.75 L255,8.75 C255.69,8.75 256.25,9.31 256.25,10 C256.25,10.69 255.69,11.25 255,11.25 L251.25,11.25 L251.25,15 C251.25,15.69 250.69,16.25 250,16.25 C249.31,16.25 248.75,15.69 248.75,15 L248.75,11.25 L245,11.25 C244.31,11.25 243.75,10.69 243.75,10 C243.75,9.31 244.31,8.75 245,8.75 L248.75,8.75 L248.75,5 C248.75,4.31 249.31,3.75 250,3.75 z" fill="currentColor" id="icon-plus-shape"/>
     </symbol>
-    <symbol id="icon-out-link" viewBox="380 0 20 20">
-      <path d="M390.13,3.582 L390.041,4.159 C390.032,4.214 390.025,4.262 390.01,4.37 L390.009,4.381 C390.002,4.421 389.999,4.472 389.999,4.534 L389.999,5.233 C389.999,5.311 390.01,5.398 390.033,5.496 L390.179,6.112 L384.932,6.112 C384.819,6.112 384.731,6.148 384.65,6.229 C384.565,6.314 384.53,6.4 384.53,6.516 L384.53,13.824 C384.53,13.94 384.565,14.026 384.648,14.108 C384.732,14.192 384.819,14.228 384.932,14.228 L393.454,14.228 C393.57,14.228 393.658,14.192 393.746,14.105 C393.83,14.023 393.867,13.937 393.866,13.824 L393.866,10.124 L394.668,10.73 C394.845,10.864 395.039,10.97 395.249,11.048 C395.465,11.126 395.684,11.169 395.911,11.175 L396.396,11.189 L396.396,13.824 C396.396,14.226 396.315,14.61 396.153,14.972 C395.995,15.318 395.784,15.626 395.52,15.89 C395.256,16.154 394.949,16.364 394.6,16.522 C394.244,16.679 393.861,16.758 393.454,16.758 L384.932,16.758 C384.533,16.758 384.149,16.68 383.786,16.522 C383.429,16.366 383.118,16.153 382.856,15.886 C382.6,15.623 382.393,15.317 382.236,14.965 C382.079,14.607 382,14.224 382,13.824 L382,6.516 C382,6.116 382.078,5.734 382.235,5.369 C382.391,5.012 382.599,4.704 382.86,4.442 C383.121,4.181 383.432,3.973 383.786,3.82 C384.147,3.661 384.531,3.582 384.932,3.582 L390.13,3.582 z M396.656,3.582 L392.091,3.582 C391.836,3.582 391.604,3.677 391.418,3.853 C391.214,4.054 391.116,4.307 391.142,4.582 L391.139,5.216 C391.14,5.476 391.23,5.712 391.408,5.894 C391.586,6.079 391.826,6.175 392.091,6.175 L393.018,6.175 L387.765,11.443 C387.584,11.611 387.485,11.856 387.489,12.127 C387.495,12.388 387.587,12.617 387.762,12.795 L388.389,13.43 C388.586,13.616 388.82,13.705 389.075,13.705 C389.334,13.705 389.569,13.613 389.749,13.433 L395.015,8.181 L395.015,9.101 C395.016,9.358 395.111,9.593 395.293,9.775 C395.475,9.957 395.712,10.051 395.974,10.051 L396.656,10.051 C396.873,10.075 397.121,9.982 397.316,9.793 C397.509,9.605 397.608,9.367 397.608,9.101 L397.608,4.534 C397.608,4.284 397.509,4.054 397.329,3.871 C397.15,3.685 396.915,3.582 396.656,3.582 z" fill="currentColor" id="icon-out-link-shape"/>
-    </symbol>
     <symbol id="icon-load" viewBox="220 0 20 20">
       <path d="M236.25,8.687 C236.94,8.687 237.5,9.247 237.5,9.937 L237.5,15.937 C237.5,16.628 236.94,17.187 236.25,17.187 L224.25,17.187 C223.56,17.187 223,16.628 223,15.937 L223,9.937 C223,9.247 223.56,8.687 224.25,8.687 C224.94,8.687 225.5,9.247 225.5,9.937 L225.5,14.687 L235,14.687 L235,9.937 C235,9.247 235.56,8.687 236.25,8.687 z" fill="currentColor" id="icon-load-shape2"/>
       <path d="M230.154,12.687 L230.644,12.67 L230.985,12.428 C231.361,12.021 231.737,11.614 232.113,11.207 C232.737,10.531 233.361,9.854 233.985,9.178 C234.359,8.773 234.334,8.14 233.928,7.765 C233.522,7.391 232.89,7.416 232.515,7.822 C232.177,8.188 231.838,8.555 231.5,8.922 L231.5,3.25 C231.5,2.56 230.94,2 230.25,2 C229.56,2 229,2.56 229,3.25 L229,8.922 C228.662,8.555 228.323,8.188 227.985,7.822 C227.61,7.416 226.978,7.391 226.572,7.765 C226.166,8.14 226.141,8.773 226.515,9.178 C226.89,9.585 226.89,9.585 228.015,10.803 C229.14,12.022 229.14,12.022 229.515,12.428 C229.893,12.703 229.681,12.614 230.154,12.687 z" fill="currentColor" id="icon-load-shape1"/>
       <path d="M29.833,3 C26.612,3 24,5.612 24,8.833 C24,12.055 29.833,17 29.833,17 C29.833,17 35.667,12.055 35.667,8.833 C35.667,5.612 33.055,3 29.833,3 z M30.016,6.5 C31.304,6.5 32.349,7.545 32.349,8.833 C32.349,10.122 31.304,11.167 30.016,11.167 C28.727,11.167 27.682,10.122 27.682,8.833 C27.682,7.545 28.727,6.5 30.016,6.5 z" fill="currentColor" id="icon-point-shape"/>
     </symbol>
     <symbol id="icon-alert" viewBox="0 0 20 20">
-      <path d="M11.292,14.388 C11.292,14.3 11.268,14.227 11.217,14.168 C11.169,14.111 11.099,14.081 11.011,14.081 L9.733,14.081 C9.655,14.081 9.587,14.109 9.528,14.165 C9.469,14.22 9.442,14.295 9.442,14.388 L9.442,15.609 C9.442,15.698 9.469,15.769 9.528,15.821 C9.587,15.873 9.655,15.899 9.733,15.899 L11.011,15.899 C11.203,15.899 11.299,15.802 11.292,15.609 z M10.936,13.301 C11.013,13.301 11.08,13.272 11.139,13.215 C11.196,13.156 11.226,13.088 11.226,13.012 L11.351,7.756 C11.351,7.678 11.321,7.61 11.262,7.553 C11.205,7.494 11.137,7.466 11.059,7.466 L9.681,7.466 C9.594,7.466 9.521,7.494 9.469,7.553 C9.417,7.61 9.391,7.678 9.391,7.756 L9.492,13.012 C9.492,13.088 9.521,13.156 9.579,13.215 C9.636,13.272 9.703,13.301 9.782,13.301 z M10.362,3.997 C10.544,3.997 10.7,4.056 10.831,4.174 C10.962,4.295 11.072,4.427 11.16,4.578 L17.55,15.626 C17.607,15.715 17.652,15.809 17.687,15.911 C17.725,16.015 17.742,16.124 17.742,16.239 C17.742,16.511 17.636,16.707 17.427,16.825 C17.217,16.944 16.991,17.003 16.754,17.003 L3.987,17.003 C3.749,17.003 3.525,16.944 3.314,16.825 C3.104,16.707 3,16.511 3,16.239 C3,16.129 3.017,16.02 3.049,15.916 C3.083,15.81 3.13,15.715 3.191,15.626 L9.566,4.578 C9.655,4.427 9.762,4.295 9.892,4.174 C10.024,4.056 10.179,3.997 10.362,3.997" fill="currentColor" id="icon-alert-shape"/>
+      <path d="M11.292,14.383 C11.292,14.295 11.267,14.222 11.217,14.163 C11.169,14.106 11.099,14.077 11.011,14.077 L9.733,14.077 C9.655,14.077 9.587,14.104 9.528,14.16 C9.469,14.215 9.442,14.29 9.442,14.383 L9.442,15.603 C9.442,15.692 9.469,15.763 9.528,15.815 C9.587,15.867 9.655,15.893 9.733,15.893 L11.011,15.893 C11.203,15.893 11.299,15.796 11.292,15.603 z M10.936,13.297 C11.013,13.297 11.08,13.267 11.139,13.21 C11.196,13.151 11.226,13.083 11.226,13.007 L11.351,7.754 C11.351,7.676 11.321,7.609 11.262,7.551 C11.205,7.492 11.137,7.465 11.059,7.465 L9.681,7.465 C9.594,7.465 9.521,7.492 9.469,7.551 C9.417,7.609 9.391,7.676 9.391,7.754 L9.492,13.007 C9.492,13.083 9.521,13.151 9.579,13.21 C9.636,13.267 9.703,13.297 9.781,13.297 z M10.362,3.997 C10.544,3.997 10.7,4.056 10.83,4.174 C10.962,4.295 11.072,4.427 11.16,4.577 L17.55,15.621 C17.607,15.709 17.652,15.803 17.687,15.905 C17.725,16.009 17.742,16.118 17.742,16.233 C17.742,16.505 17.636,16.7 17.426,16.818 C17.217,16.938 16.991,16.997 16.754,16.997 L3.987,16.997 C3.749,16.997 3.525,16.938 3.314,16.818 C3.104,16.7 3,16.505 3,16.233 C3,16.123 3.017,16.014 3.049,15.91 C3.083,15.804 3.13,15.709 3.191,15.621 L9.566,4.577 C9.655,4.427 9.762,4.295 9.892,4.174 C10.024,4.056 10.179,3.997 10.362,3.997" fill="currentColor" id="icon-alert-shape"/>
     </symbol>
   </g>
 </svg>
\ No newline at end of file
index 6afa01f1b68a4bd7558836529d015c69ddd5665a..9c2a2687a2a1115a51d958082fb51ac98b997db2 100644 (file)
Binary files a/vendor/assets/iD/iD/img/logo.png and b/vendor/assets/iD/iD/img/logo.png differ
index 89250511d12b58d31e53e1507df053de3884cb7d..6bd588138b6a9848b86360ce5bcc36679269ac98 100644 (file)
Binary files a/vendor/assets/iD/iD/img/mini-loader.gif and b/vendor/assets/iD/iD/img/mini-loader.gif differ
index 783d1b8be891cf9b6c69d656e16b332cca9cb89a..89ae70bbdca5b341938e96810e3c053a917abc67 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/cemetery.png and b/vendor/assets/iD/iD/img/pattern/cemetery.png differ
index 4f70cdf7aaabfaaa27713f2039f4a702ebbe747e..e2d89f0e728ad7d4e5e32cd95dc57f22085fca8d 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/construction.png and b/vendor/assets/iD/iD/img/pattern/construction.png differ
index e57beaaa66305bed0dbbcf7dd92b4fe593698a5b..c69b99fd68854cddd31456ef8a91cc0d8abd9996 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/dots.png and b/vendor/assets/iD/iD/img/pattern/dots.png differ
index 4e3eb765da4f86050b55edfa4390cb5b30953099..5c0a8804feadb8dfdced3e50688bd76173c68d38 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/farmland.png and b/vendor/assets/iD/iD/img/pattern/farmland.png differ
index d0b751487906bd92946110108065337614c901a5..e45b368414f9bdf031d784e892042b1ecc26ef36 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/orchard.png and b/vendor/assets/iD/iD/img/pattern/orchard.png differ
index f8e17178e4d281c40ebab40829e29edf1e76b188..b1938c9e8990078c0c4273782e57813c6a428daa 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/vineyard.png and b/vendor/assets/iD/iD/img/pattern/vineyard.png differ
index a91767fc584cfc9f152db2942f9108be45acc0fb..c9df1a23de5d8f38fcbb425305c837ac85539bd2 100644 (file)
Binary files a/vendor/assets/iD/iD/img/pattern/wetland.png and b/vendor/assets/iD/iD/img/pattern/wetland.png differ
index 20322183b4a849baba6b1a919185a8cc07d38b28..77f787a6fa874192244c45d48c83823b9c3eafa9 100644 (file)
Binary files a/vendor/assets/iD/iD/img/traffic-signs/traffic-signs.png and b/vendor/assets/iD/iD/img/traffic-signs/traffic-signs.png differ
index d6f9873a3d38177d776ce9ff3263be2b3a8202ec..ec364e86cda75ba384f517f1bd853f85bfc5a514 100644 (file)
         "background": {
             "title": "Agtergrond",
             "description": "Agtergrond stellings",
-            "percent_brightness": "{opacity}% helderheid",
             "reset": "begin van voor"
         },
         "restore": {
                     "label": "Kapasiteit",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Rigting",
-                    "options": {
-                        "E": "Oos",
-                        "N": "Noord",
-                        "NE": "Noordoos",
-                        "NW": "Noordwes",
-                        "S": "Suid",
-                        "SE": "Suidoos",
-                        "SW": "Suidwes",
-                        "W": "Wes"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Rigting",
-                    "options": {
-                        "anticlockwise": "Antikloksgewys",
-                        "clockwise": "Kloksgewys"
-                    }
-                },
                 "collection_times": {
                     "label": "Afhaal tye"
                 },
                 "highway/bridleway": {
                     "name": "Perdepaaidjie"
                 },
-                "highway/bus_stop": {
-                    "name": "Busstop"
-                },
                 "highway/cycleway": {
                     "name": "Fietsrypad"
                 },
                 "railway/monorail": {
                     "name": "Enkelspoorbaan"
                 },
-                "railway/platform": {
-                    "name": "Spoorwegplatform"
-                },
                 "railway/rail": {
                     "name": "Treinspoor"
                 },
-                "railway/station": {
-                    "name": "Treinstasie"
-                },
                 "railway/subway": {
                     "name": "Metro"
                 },
index 2adf4a7f120a5bb0987b6f2b0fd4f7bbbb2e88a9..0095ae3fb314602b4242636bae4c13718e40bde1 100644 (file)
         "background": {
             "title": "الخلفية",
             "description": "إعدادات الخلفية",
-            "percent_brightness": "{opacity}% سطوع",
             "reset": "أعد للوضع السابق"
         },
         "restore": {
index 62bd447aa1712f1eda27842816d7708c95627de0..93c05fb8f504bcf62318042dadbf1f26bdd0126f 100644 (file)
@@ -92,7 +92,7 @@
                 "connected_to_hidden": "لا يمكن جعلها مربعة لأنها مرتبطة بعنصر مخفي."
             },
             "straighten": {
-                "title": "مستقيم",
+                "title": "استقامة",
                 "description": "اجعل هذا الخط مستقيماً.",
                 "key": "س",
                 "annotation": "جعل الخط مستقيما.",
             "created": " تم إنشائها",
             "about_changeset_comments": "حول ملخص التغييرات التي قمت بها",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "ذكرت جوجل في هذا التعليق: تذكر أن النسخ من خرائط جوجل ممنوع منعاً باتاً.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "ذكرت جوجل في هذا التعليق: تذكر أن النسخ من خرائط جوجل ممنوع منعاً باتاً."
         },
         "contributors": {
             "list": "حُرر بواسطة {users}",
             "title": "الخلفية",
             "description": "إعدادات الخلفية",
             "key": "خ",
-            "percent_brightness": "الوضوح {opacity}%",
             "none": "لا شيء",
             "best_imagery": "أفضل مصدر صور معروف لهذه المنطقة",
             "switch": "رجوع إلى هذه الخلفية.",
             "custom": "مخصص",
             "custom_button": "تحرير خلفية مخصصة",
-            "fix_misalignment": "ضبط إزاحة التصوير.",
-            "imagery_source_faq": "من أين أتت هذه الصورة؟",
             "reset": "إعادة الضبط",
-            "offset": "اسحب أي مكان في المنطقة الرمادية أدناه لضبط إزاحة الصورة، أو أدخل قيم الإزاحة بالمتر.",
             "minimap": {
-                "description": "خريطة مصغّرة",
                 "tooltip": "عرض الخريطة من بعيد للمساعدة في تحديد المنطقة المعروضة حاليا.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "ضبط إزاحة التصوير.",
+            "offset": "اسحب أي مكان في المنطقة الرمادية أدناه لضبط إزاحة الصورة، أو أدخل قيم الإزاحة بالمتر."
         },
         "map_data": {
             "title": "بيانات الخريطة",
         "splash": {
             "welcome": "مرحبا بك في محرر iD لخريطة الشارع المفتوحة OpenStreetMap.",
             "text": "محرر الخرائط ID هو محرر سهل وجذاب ولكنه أيضًا أداة قوية جدا وفعالة للمساهمة في أفضل خرائط حُرة ومجانية في العالم. هذا هو الإصدار رقم {version}. لمزيد من المعلومات انظر {website} ، كما يمكنك الإبلاغ عن العلل والمشاكل على {github}.",
-            "walkthrough": "بدء جولة تعليم"
+            "walkthrough": "بدء جولة تعليم",
+            "start": " حرّر الآن "
         },
         "source_switch": {
             "live": "حي",
             "untagged_area_tooltip": "اختر نوع العنصر التي يصف هذه المساحة.",
             "untagged_relation": "علاقة غير موسومة",
             "untagged_relation_tooltip": "اختر نوع العنصر الذي يصف ما هية هذه العلاقة.",
-            "many_deletions": "أنت على وشك حذف {n} من العناصر. هل أنت متأكد من ذلك؟ ستُحذف تلك البيانات من الخريطة التي يمكن للجميع أن يراها على openstreetmap.org.",
             "tag_suggests_area": "الوسم {tag} يقترح بأن الخط يجب أن يكون منطقة، ولكنها حاليا ليست منطقة",
             "deprecated_tags": "وسوم مهجورة: {tags}"
         },
         },
         "help": {
             "title": "المساعدة",
-            "key": "م",
-            "help": "#المساعدة\nهذا محرر خرائط لخدمة الخرائط الحُرة [OpenStreetMap](http://www.openstreetmap.org/)\nالخرائط الحُرة والقابلة للتعديل للعالم، بامكانك استخدامها لإضافة أو تعديل معلومات تتعلق بمنطقتك, لتوفير خدمات مفتوحة المصدر وبيانات مفتوحة المصدر للعالم\n\nالإضافات التي تقوم بها ستكون ظاهرة للعالم لمستخدمي خدمة الخرائط مفتوحة المصدر OpenStreetMap. حتى تبدأ بتحرير الخرائط، يجب عليك [تسجيل الدخول](https://www.openstreetmap.org/login).\nهذا المحرر  [iD editor](http://ideditor.com/) هو عمل مشترك ومفتوح المصدر حيث يمكن الحصول على مصدر الكود عبر موقع [GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "#التحرير والحفظ:\nهذا المُحرر مصمم في الأساس للعمل أثناء الاتصال بالإنترنت، وأنت الآن تعمل عليه من خلال موقع الويب.\n\n###تحديد العناصر على الخريطة:\nلتحديد عنصر على الخريطة كطريق أو نقطة مثلا انقر عليه مباشرة بزر الفأرة الأيسر، سيؤدي ذلك لتحديدها وظهور لون بارز عليها أو على حدودها ويستمر في الوميض أثناء التحديد، ومن ثم ظهور التفاصيل الخاصة بالعنصر المُحدد في اللوحة الجانبية. ويمكنك النقر عليها مجددا بزر الفأرة الأيمن لتظهر قائمة بالعمليات التي يمكن تنفيذها على العنصر المُحدد.\n\nلتحديد عدد من العناصر في نفس الوقت, اضغط مع الاستمرار بالضغط على مفتاح \"Shift\". ثم انقر على العناصر التي ترغب بتحديدها, أو انقر بزر الفأرة الأيسر مع الاستمرار بالنقر والسحب على الخريطة لرسم مساحة حُرّة. سيقوم ذلك بتحديد جميع النقاط الواقعة داخل المساحة المرسومة.\n\n###حفظ التعديلات:\nعند قيامك بالتغييرات في الخرائط كتعديل الطُرق، والمباني، والأماكن، وغير ذلك. يتم تخزين وحفظ هذه التغييرات محليا (على جهازك) حتى تقوم بحفظ ورفع هذه التعديلات على الخادوم عبر الإنترنت. لا تقلق عند قيامك بتعديل أو إجراء خاطيء يمكنك التراجع عن الإجراءات والتغييرات التي قمت بها عن طريق الضغط على زر التراجع, أو العودة عن التراجع عن طريق زر الإعادة بجانب زر التراجع.\n\nانقر على 'حفظ' لإنهاء مجموعة من التعديلات - على سبيل المثال، إذا كنت قد انتهيت من التعديلات في منطقة في مدينة ما وترغب في البدء بتعديل منطقة جديدة. ستكون لديك الفرصة لمراجعة وحفظ ما أتممته، وسيقدم لك المحرر اقتراحات مفيدة وتحذيرات في حال أن هناك شيئا ما لا يبدو سليما حول تغييراتك التي قمت بها.\n\nإذا كان كل شيء يبدو جيدًا، يمكنك إدخال تعليق صغير تشرح فيه التغيير الذي قمت به، ثم أنقر على 'رفع' لنشر التغييرات على OpenStreetMap.org, حيث تصبح مرئية لجميع المستخدمين الآخرين، ومتاحة للآخرين لتعديلها أو تحسينها عند الحاجة.\n\nإذا لم تتمكن من إنهاء تعديلاتك في جلسة واحدة، يمكنك ترك نافذة المحرر والعودة فيما بعد (على نفس المتصفح والحاسوب), وسيعرض عليك تطبيق المحرر استعادة تعديلاتك الأخيرة الغير محفوظة.\n\n###استخدام المحرر:\n\nيمكنك عرض قائمة باختصارات لوحة المفاتيح عن طريق الضغط على مفتاح '؟'.\n",
-            "roads": "# الطرق:\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### التحديد والاختيار:\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### التعديل:\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### الحذف:\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### الإنشاء:\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n"
+            "key": "م"
         },
         "intro": {
             "done": "تم",
             },
             "areas": {
                 "title": "المساحات",
-                "add_playground": "تُستخدم *المساحات* لعرض حدود العناصر مثل البحيرات، والمباني، والمناطق السكنية.{br}ويمكن أيضا أن تستخدم لرسم خرائط أكثر تفصيلا للعديد من العناصر التي يمكن وصفها كنقاط على الخريطة. **انقر زر المساحة {button} لإضافة مساحة جديدة.**",
                 "start_playground": "دعنا نضيف هذا الملعب إلى الخريطة عن طريق رسم مساحة. تُرسم المساحة عن طريق وضع *نقاط تلاقي* على طول الحافة الخارجية للعنصر المراد رسمه. **انقر أو اضغط على مفتاح المسافة لوضع نقطة بدء رسم الملعب.**",
                 "continue_playground": "استمر في رسم المساحة عن طريق وضع مزيد من نقاط التلاقي على طول حافة الملعب. ولا بأس بوصل المساحة المرسومة بمسارات المشي الموجودة من قبل.{br}تلميح: يمكنك الضغط على مفتاح '{alt}' أثناء الرسم لمنع نقاط التلاقي من الاتصال بالعناصر الأخرى. **استمر برسم مساحة الملعب.**",
                 "finish_playground": "يمكنك إنهاء رسم المساحة عن طريق الضغط على مفتاح Enter، أو النقر بالفأرة على أول نقطة أو آخر نقطة في المساحة المرسومة. **قم بإنهاء رسم مساحة الملعب.**",
                 "enter": "Enter",
                 "esc": "Esc",
                 "home": "الرئيسية",
+                "option": "خيارات",
+                "pause": "إلباث",
                 "pgdn": "PgDn",
                 "pgup": "PgUp",
                 "return": "رجوع",
             "gesture": {
                 "drag": "سحب"
             },
+            "or": "-أو-",
             "browsing": {
+                "title": "التصفح",
+                "navigation": {
+                    "title": "التنقل",
+                    "pan": "تحريك الخريطة",
+                    "pan_more": "تحريك الخريطة بمقدار المعروض من الشاشة",
+                    "zoom": "تكبير / تصغير",
+                    "zoom_more": "تكبير وتصغير بمقدار كبير"
+                },
                 "help": {
                     "title": "المساعدة",
+                    "help": "عرض المساعدة",
                     "keyboard": "عرض اختصارات لوحة المفاتيح"
+                },
+                "display_options": {
+                    "title": "عرض الخيارات",
+                    "background": "عرض خيارات الخلفية",
+                    "background_switch": "عودة إلى آخر خلفية",
+                    "map_data": "عرض خيارات بيانات الخريطة",
+                    "fullscreen": "بدء وضع ملء الشاشة",
+                    "wireframe": "نمط الخطوط الرفيعة",
+                    "minimap": "عرض الخريطة المصغّرة"
+                },
+                "selecting": {
+                    "title": "اختيار العناصر",
+                    "select_one": "اختيار عنصر واحد",
+                    "select_multi": "اختيار عناصر متعددة",
+                    "lasso": "رسم مساحة تحديد حول العناصر",
+                    "search": "اعثر على عناصر تطابق نص البحث"
+                },
+                "with_selected": {
+                    "title": "مع العنصر المُختار",
+                    "edit_menu": "فتح قائمة التحرير"
+                },
+                "vertex_selected": {
+                    "title": "مع القعدة المختارة",
+                    "previous": "قفز إلى العقدة السابقة",
+                    "next": "قفز إلى القعدة التالية",
+                    "first": "قفز إلى العقدة الأولى",
+                    "last": "فز إلى العقدة الأخيرة"
                 }
             },
             "editing": {
                     "title": "عمليات",
                     "split": "افصل الخط إلى خطين عند نقطة التلاقي المُختارة",
                     "reverse": "عكس الخط",
+                    "orthogonalize": "جعله خط مستقيما / جعلها مساحة مربعة",
                     "delete": "حذف الميزات المحددة"
                 },
                 "commands": {
                         "block_number": "رقم البلوك",
                         "block_number!jp": "رقم البلوك",
                         "city": "المدينة",
+                        "city!jp": "مدينة/بلدة/قرية/جناح طوكيو الخاص",
                         "city!vn": "المدينة / البلدة",
                         "conscriptionnumber": "123",
                         "country": "دولة",
                         "street": "شارع",
                         "subdistrict": "منطقة فرعية",
                         "suburb": "ضاحية",
-                        "suburb!jp": "جناح"
+                        "suburb!jp": "جناح",
+                        "unit": "وحدة"
                     }
                 },
                 "admin_level": {
                 "aeroway": {
                     "label": "النوع"
                 },
+                "agrarian": {
+                    "label": "المنتجات"
+                },
                 "amenity": {
                     "label": "النوع"
                 },
                     "label": "سلة النفايات"
                 },
                 "blood_components": {
+                    "label": "مكونات الدم",
                     "options": {
                         "plasma": "بلازما",
-                        "platelets": "اÙ\84صÙ\81ائح Ø§Ù\84دÙ\85Ù\88Ù\8aØ©",
+                        "platelets": "صفائح الدموية",
                         "stemcells": "عينات خلايا جذعية",
-                        "whole": "اÙ\84دÙ\85 Ø§Ù\84Ù\83اÙ\85Ù\84"
+                        "whole": "دم الكامل"
                     }
                 },
                 "board_type": {
                     "label": "النوع"
                 },
+                "boules": {
+                    "label": "النوع"
+                },
                 "boundary": {
                     "label": "النوع"
                 },
                 "brand": {
                     "label": "العلامة التجارية"
                 },
+                "bridge": {
+                    "label": "النوع",
+                    "placeholder": "الافتراضي"
+                },
                 "building": {
                     "label": "المبنى"
                 },
                 "bunker_type": {
                     "label": "النوع"
                 },
+                "cables": {
+                    "label": "الكابلات",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "الاتجاه (الدرجات في اتجاه عقارب الساعة)",
                     "placeholder": "45 ، 90 ، 180 ، 270"
                     "label": "السعة",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "الاتجاه",
-                    "options": {
-                        "E": "الشرق",
-                        "ENE": "شرقي - شمال شرقي",
-                        "ESE": "شرقي - جنوب شرقي",
-                        "N": "الشمال",
-                        "NE": "الشمال الشرقي",
-                        "NNE": "شمالي - شمالي شرقي",
-                        "NNW": "شمالي - شمالي غربي",
-                        "NW": "الشمال الغربي",
-                        "S": "الجنوب",
-                        "SE": "الجنوب الشرقي",
-                        "SSE": "جنوبي - جنوبي شرقي",
-                        "SSW": "جنوبي - جنوبي غربي",
-                        "SW": "الجنوب الغربي",
-                        "W": "الغرب",
-                        "WNW": "غربي - شمالي غربي",
-                        "WSW": "غربي - جنوبي غربي"
-                    }
-                },
                 "castle_type": {
                     "label": "النوع"
                 },
-                "clock_direction": {
-                    "label": "الاتجاه",
-                    "options": {
-                        "anticlockwise": "عكس عقارب الساعة",
-                        "clockwise": "باتجاه عقارب الساعة"
-                    }
+                "clothes": {
+                    "label": "ملابس"
                 },
                 "club": {
                     "label": "النوع"
                 "collection_times": {
                     "label": "وقت الاستلام"
                 },
+                "comment": {
+                    "label": "تعليق التغييرات"
+                },
                 "communication_multi": {
                     "label": "أنواع الاتصال"
                 },
                     "label": "رابط كاميرا الويب",
                     "placeholder": "http://example.com"
                 },
+                "content": {
+                    "label": "المحتوى"
+                },
                 "country": {
                     "label": "الدولة"
                 },
                 "craft": {
                     "label": "النوع"
                 },
+                "crane/type": {
+                    "label": "نوع الرافعة",
+                    "options": {
+                        "floor-mounted_crane": "رافعة مثبتة على الأرض"
+                    }
+                },
                 "crop": {
                     "label": "محاصيل"
                 },
                 "currency_multi": {
                     "label": "أنواع العملات"
                 },
+                "cutting": {
+                    "label": "النوع",
+                    "placeholder": "الافتراضي"
+                },
                 "cycle_network": {
                     "label": "الشبكة"
                 },
                     "label": "مسارات الدراجات",
                     "options": {
                         "lane": {
-                            "description": "Ù\85سار Ø¯Ø±Ø§Ø¬Ø§Øª Ù\85Ù\81صÙ\88Ù\84 Ø¹Ù\86 Ø­Ø±Ù\83Ø© Ø§Ù\84سÙ\8aارات Ø¨Ø®Ø· Ù\85طبÙ\88ع",
+                            "description": "مسار دراجات مفصول عن السيارات بخط مطبوع",
                             "title": "مسار دراجات قياسي"
                         },
                         "none": {
                             "title": "مسار دراجات مشترك"
                         },
                         "track": {
+                            "description": "مسار دراجات منفصل عن السيارات بحاجز مادي",
                             "title": "مسار الدراجة"
                         }
                     },
                 "description": {
                     "label": "الوصف"
                 },
+                "devices": {
+                    "label": "الأجهزة",
+                    "placeholder": "1, 2, 3..."
+                },
+                "diaper": {
+                    "label": "تغيير حفاظات الطفل متاح"
+                },
                 "display": {
                     "label": "عرض"
                 },
                 "drive_through": {
                     "label": "يمكن القيادة من خلاله"
                 },
+                "duration": {
+                    "label": " المدة (دقائق) ",
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "الكهربية",
                     "options": {
                     "label": "البريد الإلكتروني",
                     "placeholder": "example@example.com"
                 },
+                "embankment": {
+                    "label": "النوع",
+                    "placeholder": "الافتراضي"
+                },
                 "emergency": {
                     "label": "طوارئ"
                 },
                 "fixme": {
                     "label": "أصلحني"
                 },
+                "ford": {
+                    "label": "النوع",
+                    "placeholder": "الافتراضي"
+                },
                 "fuel": {
                     "label": "وقود"
                 },
                 "generator/method": {
                     "label": "الطريقة"
                 },
+                "generator/output/electricity": {
+                    "label": "الطاقة الناتجة",
+                    "placeholder": "50 ميجا وات، 100 ميجا وات، 200 ميجا وات..."
+                },
                 "generator/source": {
                     "label": "المصدر"
                 },
                 "generator/type": {
                     "label": "النوع"
                 },
+                "government": {
+                    "label": "النوع"
+                },
                 "handicap": {
                     "label": "مُعاق",
                     "placeholder": "1-18"
                 "handrail": {
                     "label": "سياج سلم (درابزين)"
                 },
+                "hashtags": {
+                    "label": "الهاشتاجات المقترحة",
+                    "placeholder": "#مثال"
+                },
                 "height": {
                     "label": "الارتفاع (بالأمتار)"
                 },
                     "label": "حدود السرعة",
                     "placeholder": "40, 50, 60..."
                 },
+                "maxstay": {
+                    "label": "أقصى فترة بقاء"
+                },
                 "maxweight": {
                     "label": "أقصى وزن"
                 },
+                "memorial": {
+                    "label": "النوع"
+                },
                 "mtb/scale": {
                     "placeholder": "0, 1, 2, 3..."
                 },
                     "placeholder": "الاسم شائع (إن وجد)"
                 },
                 "natural": {
-                    "label": "طبيعه"
+                    "label": "طبيعة"
                 },
                 "network": {
                     "label": "الشبكة"
                         "icn": "عالمي",
                         "lcn": "محلية",
                         "ncn": "وطني",
-                        "rcn": "جهوي"
-                    }
+                        "rcn": "إقليمي"
+                    },
+                    "placeholder": "محلي، إقليمي، وطني، عالمي"
                 },
                 "network_foot": {
                     "label": "نوع الشبكة",
                     "options": {
-                        "iwn": "دولي",
-                        "lwn": "محلي",
-                        "nwn": "وطني",
-                        "rwn": "إقليمي"
+                        "iwn": "دولية",
+                        "lwn": "محلية",
+                        "nwn": "وطنية",
+                        "rwn": "إقليمية"
                     },
-                    "placeholder": "Ù\85Ø­Ù\84Ù\8aØ\8c Ø¥Ù\82Ù\84Ù\8aÙ\85Ù\8aØ\8c Ù\88Ø·Ù\86Ù\8aØ\8c Ø¯Ù\88Ù\84Ù\8a"
+                    "placeholder": "Ù\85Ø­Ù\84Ù\8aØ©Ø\8c Ø¥Ù\82Ù\84Ù\8aÙ\85Ù\8aØ©Ø\8c Ù\88Ø·Ù\86Ù\8aØ©Ø\8c Ø¯Ù\88Ù\84Ù\8aØ©"
                 },
                 "network_horse": {
                     "label": "نوع الشبكة",
                 "par": {
                     "placeholder": "3، 4، 5 ..."
                 },
-                "parallel_direction": {
-                    "label": "الاتجاه"
-                },
                 "park_ride": {
                     "label": "اوقف واركب"
                 },
                     "label": "النوع",
                     "options": {
                         "multi-storey": "متعدد الطوابق",
-                        "surface": "اÙ\84سطحÙ\8aØ©",
+                        "surface": "سطحÙ\8a",
                         "underground": "تحت الأرض"
                     }
                 },
                 "place": {
                     "label": "النوع"
                 },
+                "plant": {
+                    "label": "مصنع"
+                },
+                "plant/output/electricity": {
+                    "label": "الطاقة الناتجة",
+                    "placeholder": "500 ميجا وات، 1000 ميجا وات، 2000 ميجا وات..."
+                },
+                "playground/baby": {
+                    "label": "مقعد طفل"
+                },
                 "population": {
                     "label": "السكان"
                 },
                 "power": {
                     "label": "نوع"
                 },
+                "power_supply": {
+                    "label": "مولد طاقة"
+                },
+                "product": {
+                    "label": "المنتجات"
+                },
                 "railway": {
                     "label": "النوع"
                 },
-                "recycling_type": {
-                    "label": "نوع إعادة التدوير"
-                },
                 "ref": {
                     "label": "الرمز المرجعي"
                 },
                     "label": "رقم البوابة"
                 },
                 "ref_golf_hole": {
-                    "label": "رقم الحفرة"
+                    "label": "رقم الحفرة",
+                    "placeholder": "1-18"
+                },
+                "ref_platform": {
+                    "label": "رقم الرصيف"
+                },
+                "ref_road_number": {
+                    "label": "رقم الطريق"
+                },
+                "ref_runway": {
+                    "label": "رقم المدرج"
                 },
                 "relation": {
                     "label": "النوع"
                 },
                 "second_hand": {
                     "options": {
+                        "no": "لا",
+                        "only": "فقط",
                         "yes": "نعم"
-                    }
+                    },
+                    "placeholder": "نعم، لا، فقط"
                 },
                 "service": {
                     "label": "النوع"
                 "social_facility": {
                     "label": "النوع"
                 },
+                "source": {
+                    "label": "المصادر"
+                },
                 "sport": {
                     "label": "الرياضة"
                 },
                 "structure_waterway": {
                     "options": {
                         "tunnel": "نفق"
-                    }
+                    },
+                    "placeholder": "مجهول"
                 },
                 "studio": {
                     "label": "النوع"
                 "surveillance/zone": {
                     "label": "منطقة مراقبة"
                 },
+                "switch": {
+                    "label": "النوع"
+                },
                 "takeaway": {
                     "options": {
                         "no": "لا",
                 "tourism": {
                     "label": "النوع"
                 },
+                "tourism_attraction": {
+                    "label": "سياحة"
+                },
                 "tower/type": {
                     "label": "النوع"
                 },
                 "tracktype": {
                     "label": "صنف الدرب"
                 },
+                "trade": {
+                    "label": "النوع"
+                },
                 "traffic_calming": {
                     "label": "النوع"
                 },
                 },
                 "trail_visibility": {
                     "label": "وضوحية الطريق",
-                    "placeholder": "ممتاز، جيد، رديء ..."
+                    "options": {
+                        "bad": "سيء: لا علامات، المسار غير مرئي أو غير مرصوف",
+                        "excellent": "ممتاز: مسارات واضحة وعلامات في كل مكان",
+                        "good": "جيد: علامات واضحة ، قد تحتاج للبحث في بعض الأحيان",
+                        "horrible": "مخيف: غير مرصوف في الغالب، واتجاهات وصول قد تحتاج للمهارة",
+                        "intermediate": "متوسط: علامات قليلة: والمسار مرئي في الغالب",
+                        "no": "لا: غير مرصوف، والمهارة في معرفة اتجاهات الوصول مطلوبة"
+                    },
+                    "placeholder": "ممتاز، جيد، سيء..."
+                },
+                "transformer": {
+                    "label": "النوع",
+                    "options": {
+                        "yes": "مجهول"
+                    }
                 },
                 "trees": {
                     "label": "أشجار"
                 },
+                "tunnel": {
+                    "label": "النوع",
+                    "placeholder": "الافتراضي"
+                },
                 "vending": {
                     "label": "أنواع البضائع"
                 },
+                "visibility": {
+                    "label": "الرؤية",
+                    "options": {
+                        "area": "أكثر من 20 متر (65 قدم)",
+                        "house": "إلى 5 متر (16 قدم)",
+                        "street": "من 5 إلى 20 متر (16 إلى 65 قدم)"
+                    }
+                },
+                "volcano/status": {
+                    "label": "حالة البركان",
+                    "options": {
+                        "active": "نشط"
+                    }
+                },
+                "volcano/type": {
+                    "label": "نوع البركان"
+                },
                 "wall": {
                     "label": "النوع"
                 },
                     "name": "العنوان",
                     "terms": "عنوان"
                 },
+                "aerialway": {
+                    "name": "محطة النقل بالكابلات "
+                },
                 "aerialway/cable_car": {
                     "name": "تلفريك",
-                    "terms": "تلفريك، معبر هوائي"
+                    "terms": "تلفريك، معبر هوائي، مصعد هوائي"
+                },
+                "aerialway/chair_lift": {
+                    "name": "مصعد تزلج",
+                    "terms": "مصعد تزلج، تلسياج"
+                },
+                "aerialway/goods": {
+                    "name": "نقل البضائع بالكابلات ",
+                    "terms": "نقل البضائع بالكابلات "
+                },
+                "aerialway/station": {
+                    "name": "محطة النقل بالكابلات "
                 },
                 "aeroway": {
                     "name": "جوي"
                     "name": "محل استئجار قوارب",
                     "terms": "تأجير القوارب، ساحة الزوارق، تأجير زوارق"
                 },
-                "amenity/bus_station": {
-                    "name": "محطة أتوبيس",
-                    "terms": "محطة أتوبيس, محطة باص, محطة حافلة"
-                },
                 "amenity/cafe": {
                     "name": "مقهى",
                     "terms": "مقهى, مطعم, ناد ليلي"
                     "name": "محطة الحراسة",
                     "terms": "محطة الحراسة"
                 },
-                "amenity/recycling": {
-                    "name": "إعادة تدوير"
-                },
                 "amenity/recycling_centre": {
                     "name": "مركز إعادة تدوير"
                 },
                     "name": "منطقة",
                     "terms": "المساحة; مساحة; منطقة; المنطقة"
                 },
+                "area/highway": {
+                    "name": "سطح الطريق",
+                    "terms": "<translate with synonyms or related terms for 'Road Surface', separated by commas>"
+                },
                 "barrier": {
                     "name": "حاجز",
                     "terms": "حاجز, عائق, تخم, قلعة محصنة, مدينة محصنة, مزلقان"
                     "name": "طريق الخيول",
                     "terms": "طريق الخيول, ممر للخيول"
                 },
-                "highway/bus_stop": {
-                    "name": "محطة باص",
-                    "terms": "موقف باصات, محطة باصات"
-                },
                 "highway/crossing": {
                     "name": "معبر طريق",
                     "terms": "معبر; عبور; عبور طريق; عبور شارع; معبر شارع; معبر طريق"
                     "name": "غابة",
                     "terms": "غابة"
                 },
-                "landuse/garages": {
-                    "name": "جراجات",
-                    "terms": "جراج; جراج سيارات; موقف; موقف سيارات; ركن; ركنة"
-                },
                 "landuse/grass": {
                     "name": "عشب",
                     "terms": "عشب, غطاء أخضر"
                     "name": "بستان",
                     "terms": " بستان, بيارة, أشجار البستان"
                 },
+                "landuse/plant_nursery": {
+                    "name": "مشتل",
+                    "terms": "مشتل"
+                },
                 "landuse/quarry": {
                     "name": "محجر",
                     "terms": "محجر"
                     "name": "الترفيه",
                     "terms": "الترفيه"
                 },
+                "leisure/bowling_alley": {
+                    "name": "بولينغ",
+                    "terms": "بولينغ، بولينج"
+                },
                 "leisure/common": {
-                    "name": "عاÙ\85",
+                    "name": "أرض Ù\85شترÙ\83 ",
                     "terms": "مشّاع، متعارف عليه، شعبي، شائع"
                 },
+                "leisure/dance": {
+                    "name": "قاعة الرقص",
+                    "terms": "قاعة الرقص"
+                },
                 "leisure/dog_park": {
                     "name": "حديقة كلاب",
                     "terms": "حديقة كلاب"
                     "terms": " المحاسب القانوني، المدقق، الحسابات "
                 },
                 "office/administrative": {
-                    "name": "مكتب الإداري ",
-                    "terms": "إدارة، إدارة عامة، مكتب تنظيمي"
+                    "name": "مكتب الإداري "
                 },
                 "office/advertising_agency": {
                     "name": "وكالة إعلانية",
                     "name": "منظمة خيرية",
                     "terms": "منظمة خيرية"
                 },
-                "office/company": {
-                    "name": "مكتب شركة",
-                    "terms": "إدارة شركة، إدارة مؤسسة، إدارة عامة"
-                },
                 "office/educational_institution": {
                     "name": "مؤسسة تعليمية ",
                     "terms": "مؤسسة تعليمية، جامعة، كلية، مدرسة"
                     "name": "إدارة الغابات",
                     "terms": "إدارة الغابات"
                 },
+                "office/foundation": {
+                    "name": "مؤسسة",
+                    "terms": "مؤسسة"
+                },
                 "office/government": {
                     "name": "مكتب حكومي",
                     "terms": "رئاسة الوزراء، إدارة الدولة، المكتب العام، "
                     "terms": "مكتب محاماة، اﻹدارة القانونية، المحكمة،"
                 },
                 "office/lawyer/notary": {
-                    "name": "كاتب عدل / موثق",
-                    "terms": "كاتب عدل، موثق"
+                    "name": "كاتب عدل / موثق"
                 },
                 "office/newspaper": {
                     "name": "صحيفة",
                     "name": "محول كهربائي",
                     "terms": "محول الكهربائي"
                 },
-                "public_transport/platform": {
-                    "name": "منصة"
-                },
                 "railway": {
                     "name": "سكة حديد"
                 },
                     "name": "قطار جبلي مائل",
                     "terms": "قطار جبلي مائل"
                 },
-                "railway/halt": {
-                    "name": "موقف سكة حديد",
-                    "terms": "موقف إجباري خاص بسكك الحديد، موقف السكة الحديدية"
-                },
                 "railway/level_crossing": {
                     "name": "معبر سكة حديد (طريق)",
                     "terms": "معبر سكة حديد; معبر"
                     "name": "سكة حديدة مفردة",
                     "terms": "سكة حديدة مفردة"
                 },
-                "railway/platform": {
-                    "name": "رصيف سكة حديد",
-                    "terms": "رصيف سكة حديد"
-                },
                 "railway/rail": {
                     "name": "قطار",
                     "terms": "قطار"
                 },
-                "railway/station": {
-                    "name": "محطة سكة حديد",
-                    "terms": "محطة سكة حديد"
-                },
                 "railway/subway": {
                     "name": "مترو الأنفاق",
                     "terms": "مترو الأنفاق"
index 423bb62d143d658561b481078112e99d5f81c4d6..0a56d31b59d0abc0e8d84ad439b6f09014e00713 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Fai click p'amestar más noyos a la llinia. Fai click n'otres llinies pa coneutar con elles, y fai doble clic p'acabar la llinia."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Nun puede editase porque ta coneutao a una carauterística tapecida."
             }
         },
         "operations": {
                 "key": "C",
                 "annotation": "Meciéronse {n} carauterístiques.",
                 "not_eligible": "Eses carauterístiques nun puen amestase",
+                "not_adjacent": "Estos oxetos nun pueden fusionase porque los sos estremos nun tán coneutaos.",
                 "restriction": "Eses carauterístiques nun puen mecese porque una polo menos ye miembru d'una rellación \"{relation}\".",
                 "incomplete_relation": "Estes carauterístiques nun puen entemecese porque polo menos una nun se descargó completamente.",
                 "conflicting_tags": "Eses carauterístiques nun puen mecese porque  dalgún valor de les etiquetes fai conflictu."
                         "single": "Espeyada una carauterística respeuto a la exa curtia",
                         "multiple": "Espeyaes delles carauterístiques respeuto a la exa curtia"
                     }
+                },
+                "incomplete_relation": {
+                    "single": "Esti elementu nun puede espeyase porque nun se descargó completamente.",
+                    "multiple": "Estos elementos nun pueden espeyase porque nun se descargaron completamente."
+                },
+                "too_large": {
+                    "single": "Esti elementu nun puede espeyase porque anguaño nun se ve bastante d'el.",
+                    "multiple": "Estos elementos nun pueden espeyase porque anguaño nun se ve bastante d'ellos."
+                },
+                "connected_to_hidden": {
+                    "single": "Esti elementu nun puede espeyase porque ta conectáu con un elementu tapecíu.",
+                    "multiple": "Estos elementos nun pueden espeyase porque dellos tán conectaos con elementos tapecíos."
                 }
             },
             "rotate": {
                 "title": "Xirar",
+                "description": {
+                    "single": "Xirar esti elementu alredor del so puntu central.",
+                    "multiple": "Xirar estos elementos alredor del so puntu central."
+                },
                 "key": "R",
                 "annotation": {
                     "line": "Xirada una llinia.",
-                    "area": "Xiráu un área."
+                    "area": "Xiráu un área.",
+                    "multiple": "Xiraos dellos elementos."
+                },
+                "incomplete_relation": {
+                    "single": "Esti elementu nun puede xirase porque non se descargó dafechu.",
+                    "multiple": "Estos elementos nun pueden xirase porque nun se descargaron dafechu."
+                },
+                "too_large": {
+                    "single": "Esti elementu nun puede xirase porque nun se ve bastante d'el.",
+                    "multiple": "Estos elementos nun pueden xirase porque nun se ve bastante d'ellos."
+                },
+                "connected_to_hidden": {
+                    "single": "Esti elementu nun puede xirase porque ta conectáu con un elementu tapecíu.",
+                    "multiple": "Estos elementos nun pueden xirase porque dellos tán conectaos con elementos tapecíos."
                 }
             },
             "reverse": {
             "localized_translation_language": "Escoyer idioma",
             "localized_translation_name": "Nome"
         },
+        "zoom_in_edit": "Averar pa editar",
         "login": "aniciu de sesión",
         "logout": "zarrar sesión",
         "loading_auth": "Coneutando con OpenStreetMap...",
             "title": "Xubir a OpenStreetMap",
             "upload_explanation": "Los cambios que xuba tarán visibles en tolos mapes qu'usen los datos d'OpenStreetMap.",
             "upload_explanation_with_user": "Los cambios que xubas como {user} tarán visibles en tolos mapes qu'usen datos d'OpenStreetMap.",
+            "request_review": "Prestaríame que dalguién revise les mios ediciones.",
             "save": "Xubir",
             "cancel": "Encaboxar",
             "changes": "{count} cambios",
+            "download_changes": "Descargar ficheru osmChange",
             "warnings": "Avisos",
             "modified": "Camudáu",
             "deleted": "Desaniciáu",
             "about_changeset_comments": "Tocante a los comentarios del conxuntu de cambios",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Mentasti a Google nesti comentariu: alcuérdate de que copiar de Google Maps ta torgao estrictamente.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Ediciones de {users}",
             "key": "I",
             "background": {
                 "key": "F",
-                "title": "Fondu"
+                "title": "Fondu",
+                "zoom": "Ampliación",
+                "vintage": "Antigüedá",
+                "source": "Fonte",
+                "description": "Descripción",
+                "resolution": "Resolución",
+                "accuracy": "Precisión",
+                "unknown": "Desconocíu",
+                "show_tiles": "Amostrar teseles",
+                "hide_tiles": "Tapecer teseles",
+                "show_vintage": "Ver antigüedá",
+                "hide_vintage": "Despintar antigüedá"
             },
             "history": {
-                "version": "Versión"
+                "key": "H",
+                "title": "Historial",
+                "selected": "{n} seleicionaos",
+                "version": "Versión",
+                "last_edit": "Última edición",
+                "edited_by": "Editao por",
+                "changeset": "Conxuntu de cambios",
+                "unknown": "Desconocíu",
+                "link_text": "Historial en openstreetmap.org"
+            },
+            "location": {
+                "key": "L",
+                "title": "Llocalización",
+                "unknown_location": "Llocalización desconocida"
             },
             "measurement": {
                 "key": "M",
                 "title": "Midíes",
+                "selected": "{n} seleicionaos",
                 "geometry": "Xeometría",
+                "center": "Centru",
+                "perimeter": "Perímetru",
+                "length": "Llonxitú",
+                "area": "Área",
+                "centroid": "Centroide",
+                "location": "Llocalización",
                 "metric": "Métricu",
                 "imperial": "Imperial"
             }
             "back_tooltip": "Camudar carauterística",
             "remove": "Desaniciar",
             "search": "Guetar",
+            "multiselect": "Elementos seleicionaos",
             "unknown": "Desconocíu",
             "incomplete": "<non descargao>",
             "feature_list": "Buscar carauterístiques",
         "background": {
             "title": "Fondu",
             "description": "Configuración del fondu",
-            "percent_brightness": "{opacity}% brillu",
+            "key": "B",
             "none": "Dengún",
             "best_imagery": "La meyor fonte d'imáxenes pa esti lugar",
             "switch": "Volver a esti fondu",
             "custom": "Personalizáu",
             "custom_button": "Editar fondu personalizáu",
-            "fix_misalignment": "Axustar el desplazamientu de les imáxenes",
-            "imagery_source_faq": "¿D'aú vienen estes imáxenes?",
             "reset": "reaniciar",
             "minimap": {
-                "description": "Minimapa",
-                "tooltip": "Amuesa un mapa alloñáu p'ayudar a alcontrar l'área que se ve actualmente."
-            }
+                "tooltip": "Amuesa un mapa alloñáu p'ayudar a alcontrar l'área que se ve actualmente.",
+                "key": "/"
+            },
+            "fix_misalignment": "Axustar el desplazamientu de les imáxenes"
         },
         "map_data": {
             "title": "Datos del mapa",
             "description": "Datos del mapa",
+            "key": "F",
             "data_layers": "Capes de datos",
+            "layers": {
+                "osm": {
+                    "tooltip": "Datos del mapa dende OpenStreetMap",
+                    "title": "Datos d'OpenStreetMap"
+                }
+            },
             "fill_area": "Rellenar árees",
             "map_features": "Elementos del mapa",
-            "autohidden": "Estos elementos tapeciéronse automáticamente porque s'amosaríen demasiaos en pantalla. Puedes averate pa editalos."
+            "autohidden": "Estos elementos tapeciéronse automáticamente porque s'amosaríen demasiaos en pantalla. Puedes averate pa editalos.",
+            "osmhidden": "Estes carauterístiques tapeciéronse automáticamente porque la capa d'OpenStreetMap ta tapecida."
         },
         "feature": {
             "points": {
         "area_fill": {
             "wireframe": {
                 "description": "Sin rellenu (alambre)",
-                "tooltip": "Activar el mou d'alambre facilita ver les imaxes de fondu."
+                "tooltip": "Activar el mou d'alambre facilita ver les imaxes de fondu.",
+                "key": "W"
             },
             "partial": {
                 "description": "Rellenu parcial",
         },
         "restore": {
             "heading": "Tien cambios ensin guardar",
-            "description": "¿Quier recuperar los cambios ensin guardar d'una sesión d'edición anterior?"
+            "description": "¿Quier recuperar los cambios ensin guardar d'una sesión d'edición anterior?",
+            "restore": "Restaurar los mios cambios",
+            "reset": "Descartar los mios cambios"
         },
         "save": {
             "title": "Guardar",
                 "keep_remote": "Usar lo ayeno",
                 "restore": "Restaurar",
                 "delete": "Dexar desaniciao",
+                "download_changes": "O descargar un ficheru osmChange",
                 "done": "¡Iguaos tolos conflictos!"
             }
         },
         "splash": {
             "welcome": "Bienllegáu al editor d'OpenStreetMap iD",
             "text": "iD ye una ferramienta amistosa pero potente pa collaborar col meyor mapamundi llibre del mundu. Esta ye la versión {version}. Pa más información visite {website} ya informe de fallos en {github}.",
-            "walkthrough": "Aniciar la Visita guiada"
+            "walkthrough": "Aniciar la Visita guiada",
+            "start": "Editar agora"
         },
         "source_switch": {
             "live": "en vivo",
         "validations": {
             "disconnected_highway": "Carretera desconeutada",
             "disconnected_highway_tooltip": "Les carreteres habríen tar coneutaes con otres carreteres o entraes d'edificios.",
+            "old_multipolygon": "Etiquetes de multipolígonu na vía esterior",
             "untagged_point": "Puntu ensin etiquetar",
             "untagged_line": "Llinia ensin etiquetar",
             "untagged_area": "Área ensin etiquetar",
             "tag_suggests_area": "La etiqueta {tag} suxer que la llinia tendría de ser un área, pero nun ye un area",
             "deprecated_tags": "Etiquetes anticuaes: {tags}"
         },
+        "zoom": {
+            "in": "Averar",
+            "out": "Alloñar"
+        },
+        "cannot_zoom": "Nun puede alloñase más nel mou actual.",
         "full_screen": "Conmutar pantalla completa",
         "gpx": {
             "local_layer": "Ficheru llocal",
             "drag_drop": "Abasna y suelta un ficheru .gpx, .geojson o .kml na páxina, o prime nel botón de la drecha pa restolar",
-            "zoom": "Averar a capa"
+            "zoom": "Averar a capa",
+            "browse": "Buscar un ficheru"
+        },
+        "mapillary_images": {
+            "tooltip": "Fotos a nivel de rúa de Mapillary",
+            "title": "Capa de fotos (Mapillary)"
+        },
+        "mapillary_signs": {
+            "tooltip": "Señales de tráficu de Mapillary (tienes d'activar la capa de fotos)",
+            "title": "Capa de señales de tráficu (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Ver esta imaxe'n Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Fotos a nivel de rúa d'OpenStreetCam",
+            "title": "Capa de fotos (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Ver esta imaxe n'OpenStreetCam"
+        },
         "help": {
             "title": "Ayuda",
-            "help": "# Ayuda\n\nEsti ye un editor pa [OpenStreetMap](http://www.openstreetmap.org/), el\nmapamundi llibre y editable. Pues usalu p'amestar y anovar los datos\nde la to fastera, pa facer un mapamundi de códigu y datos abiertos\nmeyor pa tol mundu.\n\nLes ediciones que faigas nesti mapa sedrán visibles pa cualquiera qu'use\nOpenStreetMap. Pa facer una edición, necesites\n[aniciar sesión](https://www.openstreetmap.org/login).\n\nEl [editor iD](http://ideditor.com/) ye un proyeutu collaborativu col  [códigu\nfonte disponible'n GitHub](https://github.com/openstreetmap/iD).\n"
+            "key": "A",
+            "help": {
+                "title": "Ayuda",
+                "open_data_h": "Open Data",
+                "open_source_h": "Códigu abiertu"
+            },
+            "overview": {
+                "navigation_h": "Navegación"
+            },
+            "editing": {
+                "save_h": "Guardar"
+            }
         },
         "intro": {
             "done": "fecho",
                 "category-landuse": {
                     "name": "Elementos d'usu del terrén"
                 },
+                "category-natural-area": {
+                    "name": "Elementos naturales"
+                },
+                "category-natural-line": {
+                    "name": "Elementos naturales"
+                },
+                "category-natural-point": {
+                    "name": "Elementos naturales"
+                },
                 "category-path": {
                     "name": "Elementos de camín"
                 },
                 "address": {
                     "label": "Direición",
                     "placeholders": {
+                        "block_number": "Númberu de bloque",
+                        "block_number!jp": "Bloque Núm.",
                         "city": "Ciudá",
+                        "city!jp": "Ciudá/Villa/Pueblu/Barriu Especial de Tokio",
+                        "city!vn": "Ciudá/Villa",
                         "conscriptionnumber": "123",
                         "country": "País",
+                        "county": "Condáu",
+                        "county!jp": "Distritu",
                         "district": "Distritu",
+                        "district!vn": "Comarca/Villa/Distritu",
                         "floor": "Suelu",
                         "hamlet": "Aldea",
                         "housename": "Númberu de casa",
                         "housenumber": "123",
+                        "housenumber!jp": "Edificiu Núm./Mazana Núm.",
+                        "neighbourhood": "Vecinderu",
+                        "neighbourhood!jp": "Chōme/Aza/Koaza",
                         "place": "Llugar",
                         "postcode": "Códigu postal",
                         "province": "Provincia",
+                        "province!jp": "Prefeutura",
+                        "quarter!jp": "Ōaza/Machi",
                         "state": "Estáu",
                         "street": "Cai",
                         "subdistrict": "Subdistritu",
-                        "suburb": "Barriu"
+                        "suburb": "Barriu",
+                        "unit": "Unidá"
                     }
                 },
                 "admin_level": {
                 "aeroway": {
                     "label": "Tipu"
                 },
+                "agrarian": {
+                    "label": "Productos"
+                },
                 "amenity": {
                     "label": "Tipu"
                 },
+                "animal_boarding": {
+                    "label": "P'animales"
+                },
+                "animal_breeding": {
+                    "label": "P'animales"
+                },
+                "animal_shelter": {
+                    "label": "P'animales"
+                },
                 "area/highway": {
                     "label": "Tipu"
                 },
                 "barrier": {
                     "label": "Tipu"
                 },
+                "bath/open_air": {
+                    "label": "Aire llibre"
+                },
+                "bath/sand_bath": {
+                    "label": "Bañu de sable"
+                },
+                "bath/type": {
+                    "label": "Especialidá",
+                    "options": {
+                        "foot_bath": "Bañu de pies",
+                        "hot_spring": "Fonte caliente",
+                        "onsen": "Onsen xaponés"
+                    }
+                },
                 "beauty": {
                     "label": "Tipu de tienda"
                 },
                     "options": {
                         "plasma": "plasma",
                         "platelets": "plaquetes",
-                        "stemcells": "célules madre",
+                        "stemcells": "pruebes de célules madre",
                         "whole": "sangre entera"
                     }
                 },
+                "board_type": {
+                    "label": "Tipu"
+                },
+                "boules": {
+                    "label": "Tipu"
+                },
                 "boundary": {
                     "label": "Tipu"
                 },
                 "brand": {
                     "label": "Marca"
                 },
+                "bridge": {
+                    "label": "Tipu",
+                    "placeholder": "Predeterminao"
+                },
                 "building": {
                     "label": "Edificiu"
                 },
                 "building_area": {
                     "label": "Edificiu"
                 },
+                "bunker_type": {
+                    "label": "Tipu"
+                },
+                "cables": {
+                    "label": "Cables",
+                    "placeholder": "1, 2, 3..."
+                },
+                "camera/direction": {
+                    "label": "Direición (Graos en sentíu horariu)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "camera/mount": {
+                    "label": "Encontu de cámara"
+                },
+                "camera/type": {
+                    "label": "Tipu de cámara",
+                    "options": {
+                        "dome": "Cúpula",
+                        "fixed": "Fixa",
+                        "panning": "Barríu"
+                    }
+                },
                 "capacity": {
                     "label": "Capacidá",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direición",
-                    "options": {
-                        "E": "Este",
-                        "ENE": "Este-nordés",
-                        "ESE": "Este-sureste",
-                        "N": "Norte",
-                        "NE": "Nordés",
-                        "NNE": "Norte-nordés",
-                        "NNW": "Norte-noroeste",
-                        "NW": "Noroeste",
-                        "S": "Sur",
-                        "SE": "Sureste",
-                        "SSE": "Sur-sureste",
-                        "SSW": "Sur-suroeste",
-                        "SW": "Suroeste",
-                        "W": "Oeste",
-                        "WNW": "Oeste-noroeste",
-                        "WSW": "Oeste-suroeste"
-                    }
+                "castle_type": {
+                    "label": "Tipu"
                 },
-                "clock_direction": {
-                    "label": "Direición",
-                    "options": {
-                        "anticlockwise": "Sentíu antihorariu",
-                        "clockwise": "Sentíu horariu"
-                    }
+                "clothes": {
+                    "label": "Ropa"
+                },
+                "club": {
+                    "label": "Tipu"
                 },
                 "collection_times": {
                     "label": "Hores de recoyida"
                 },
+                "comment": {
+                    "label": "Comentariu del conxuntu de cambios",
+                    "placeholder": "Descripción curtia de les collaboraciones (riquío)"
+                },
+                "communication_multi": {
+                    "label": "Tipos de comunicación"
+                },
                 "construction": {
                     "label": "Tipu"
                 },
+                "contact/webcam": {
+                    "label": "URL de la webcam",
+                    "placeholder": "http://example.com/"
+                },
+                "content": {
+                    "label": "Conteníu"
+                },
                 "country": {
                     "label": "País"
                 },
                 "craft": {
                     "label": "Tipu"
                 },
+                "crane/type": {
+                    "label": "Tipu de grúa",
+                    "options": {
+                        "floor-mounted_crane": "Grúa anclada en suelu",
+                        "portal_crane": "Pórticu",
+                        "travel_lift": "Elevador de barcos móvil"
+                    }
+                },
+                "crop": {
+                    "label": "Cultivos"
+                },
                 "crossing": {
                     "label": "Tipu"
                 },
+                "cuisine": {
+                    "label": "Cocina"
+                },
                 "currency_multi": {
                     "label": "Tipos de divisa"
                 },
+                "cutting": {
+                    "label": "Tipu",
+                    "placeholder": "Predeterminao"
+                },
                 "cycle_network": {
                     "label": "Rede"
                 },
                 "description": {
                     "label": "Descripción"
                 },
+                "devices": {
+                    "label": "Preseos",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "Con cambiador de pañales"
                 },
                 "drive_through": {
                     "label": "Carril de compres"
                 },
+                "duration": {
+                    "label": "Duración",
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "Electrificación",
                     "options": {
                 "elevation": {
                     "label": "Altor"
                 },
+                "email": {
+                    "label": "Corréu-e",
+                    "placeholder": "example@example.com"
+                },
+                "embankment": {
+                    "label": "Tipu",
+                    "placeholder": "Predetermináu"
+                },
                 "emergency": {
                     "label": "Emerxencia"
                 },
                 "fee": {
                     "label": "Pagu"
                 },
+                "fence_type": {
+                    "label": "Tipu"
+                },
+                "fire_hydrant/position": {
+                    "label": "Posición",
+                    "options": {
+                        "green": "Yerba",
+                        "lane": "Carril",
+                        "parking_lot": "Aparcamientu",
+                        "sidewalk": "Cera"
+                    }
+                },
                 "fire_hydrant/type": {
                     "label": "Tipu",
                     "options": {
                         "wall": "De parede"
                     }
                 },
+                "fitness_station": {
+                    "label": "Tipos d'equipamientu"
+                },
                 "fixme": {
                     "label": "Arréglame"
                 },
+                "ford": {
+                    "label": "Tipu",
+                    "placeholder": "Predetermináu"
+                },
+                "frequency": {
+                    "label": "Frecuencia d'operación"
+                },
                 "fuel": {
                     "label": "Combustible"
                 },
                 "generator/method": {
                     "label": "Métodu"
                 },
+                "generator/output/electricity": {
+                    "label": "Potencia de salida",
+                    "placeholder": "50 MW, 100 MW, 200 MW..."
+                },
                 "generator/source": {
                     "label": "Fonte"
                 },
                 "generator/type": {
                     "label": "Tipu"
                 },
+                "government": {
+                    "label": "Tipu"
+                },
+                "grape_variety": {
+                    "label": "Variedaes d'uva"
+                },
                 "handicap": {
                     "label": "Handicap",
                     "placeholder": "1-18"
                 "handrail": {
                     "label": "Pasamanes"
                 },
+                "hashtags": {
+                    "label": "Hashtags suxeríos",
+                    "placeholder": "#exemplu"
+                },
+                "healthcare": {
+                    "label": "Tipu"
+                },
+                "healthcare/speciality": {
+                    "label": "Especialidaes"
+                },
+                "height": {
+                    "label": "Altor (metros)"
+                },
                 "highway": {
                     "label": "Tipu"
                 },
                 "historic": {
                     "label": "Tipu"
                 },
+                "historic/civilization": {
+                    "label": "Civilización histórica"
+                },
                 "hoops": {
                     "label": "Númberu d'aros",
                     "placeholder": "1, 2, 4..."
                 "information": {
                     "label": "Tipu"
                 },
+                "inscription": {
+                    "label": "Inscripción"
+                },
+                "intermittent": {
+                    "label": "Intermitente"
+                },
                 "internet_access": {
                     "label": "Accesu a Internet",
                     "options": {
                 "internet_access/fee": {
                     "label": "Accesu a Internet de pagu"
                 },
+                "internet_access/ssid": {
+                    "label": "SSID (Nome de la rede)"
+                },
+                "label": {
+                    "label": "Etiqueta"
+                },
                 "lamp_type": {
                     "label": "Tipu"
                 },
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
-                    "label": "Capa"
+                    "label": "Capa",
+                    "placeholder": "0"
                 },
                 "leaf_cycle": {
                     "label": "Ciclu de fueyes",
                 "man_made": {
                     "label": "Tipu"
                 },
+                "manhole": {
+                    "label": "Tipu"
+                },
+                "map_size": {
+                    "label": "Cobertoria"
+                },
+                "map_type": {
+                    "label": "Tipu"
+                },
+                "maxheight": {
+                    "label": "Altor máximu",
+                    "placeholder": "4, 4.5, 5, 14'0\", 14'6\", 15'0\""
+                },
                 "maxspeed": {
                     "label": "Velocidá máxima",
                     "placeholder": "40, 50, 60..."
                 "maxstay": {
                     "label": "Tiempu máx."
                 },
+                "maxweight": {
+                    "label": "Pesu máximu"
+                },
+                "memorial": {
+                    "label": "Tipu"
+                },
+                "monitoring_multi": {
+                    "label": "Vixilancia"
+                },
                 "mtb/scale": {
                     "label": "Dificultá pa bicis de monte",
                     "options": {
                 "operator": {
                     "label": "Operador"
                 },
+                "outdoor_seating": {
+                    "label": "Terraza"
+                },
                 "par": {
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direición",
-                    "options": {
-                        "backward": "P'atrás",
-                        "forward": "P'alantre"
-                    }
-                },
                 "park_ride": {
                     "label": "Aparcamientu con tresporte públicu"
                 },
                 "payment_multi": {
                     "label": "Tipos de pagu"
                 },
+                "phases": {
+                    "label": "Fases",
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "Teléfonu",
                     "placeholder": "+31 42 123 4567"
                     "options": {
                         "downhill": "Descensu",
                         "hike": "Escursión",
-                        "ice_skate": "Patinaxe sobro xelu",
+                        "ice_skate": "Patinaxe sobre xelu",
                         "nordic": "Nórdica",
                         "playground": "Infantil",
                         "skitour": "Escursión d'esquí",
                 "place": {
                     "label": "Tipu"
                 },
+                "plant": {
+                    "label": "Planta"
+                },
+                "plant/output/electricity": {
+                    "label": "Potencia de salida",
+                    "placeholder": "500 MW, 1000 MW, 2000 MW..."
+                },
+                "playground/max_age": {
+                    "label": "Edá máxima"
+                },
+                "playground/min_age": {
+                    "label": "Edá mínima"
+                },
                 "population": {
                     "label": "Población"
                 },
                 "power_supply": {
                     "label": "Fonte d'enerxía"
                 },
+                "produce": {
+                    "label": "Productu"
+                },
+                "product": {
+                    "label": "Productos"
+                },
                 "railway": {
                     "label": "Tipu"
                 },
+                "rating": {
+                    "label": "Potencia nominal"
+                },
                 "recycling_accepts": {
                     "label": "Aceuta"
                 },
-                "recycling_type": {
-                    "label": "Tipu de reciclax",
-                    "options": {
-                        "centre": "Centru de reciclax",
-                        "container": "Contenedor"
-                    }
+                "ref": {
+                    "label": "Códigu de referencia"
+                },
+                "ref_aeroway_gate": {
+                    "label": "Númberu de puerta"
+                },
+                "ref_golf_hole": {
+                    "label": "Númberu de furacu",
+                    "placeholder": "1-18"
+                },
+                "ref_highway_junction": {
+                    "label": "Númberu de salida"
+                },
+                "ref_platform": {
+                    "label": "Númberu d'andén"
+                },
+                "ref_road_number": {
+                    "label": "Númberu d'estrada"
+                },
+                "ref_route": {
+                    "label": "Númberu de ruta"
+                },
+                "ref_runway": {
+                    "label": "Númberu de pista",
+                    "placeholder": "p. ex. 01L/19R"
+                },
+                "ref_stop_position": {
+                    "label": "Númberu de parada"
+                },
+                "ref_taxiway": {
+                    "label": "Númberu de cai de rodaxe",
+                    "placeholder": "p. ex. A5"
                 },
                 "relation": {
                     "label": "Tipu"
                 "service/bicycle": {
                     "label": "Servicios"
                 },
+                "service/vehicle": {
+                    "label": "Servicios"
+                },
                 "service_rail": {
                     "label": "Tipu de serviciu",
                     "options": {
                         "yard": "Estación de clasificación"
                     }
                 },
+                "service_times": {
+                    "label": "Hores de serviciu"
+                },
                 "shelter": {
                     "label": "Refuxu"
                 },
                     },
                     "placeholder": "Patinos, ruedes, too terrén"
                 },
+                "social_facility": {
+                    "label": "Tipu"
+                },
+                "social_facility_for": {
+                    "label": "Persones atendíes"
+                },
+                "source": {
+                    "label": "Fontes"
+                },
+                "sport": {
+                    "label": "Deportes"
+                },
+                "sport_ice": {
+                    "label": "Deportes"
+                },
+                "sport_racing_motor": {
+                    "label": "Deportes"
+                },
+                "sport_racing_nonmotor": {
+                    "label": "Deportes"
+                },
                 "stars": {
                     "label": "Estrelles"
                 },
+                "start_date": {
+                    "label": "Data d'aniciu"
+                },
+                "step_count": {
+                    "label": "Númberu d'escaleres"
+                },
                 "stop": {
                     "label": "Tipu de parada",
                     "options": {
                     },
                     "placeholder": "Desconocíu"
                 },
+                "structure_waterway": {
+                    "label": "Estructura",
+                    "options": {
+                        "tunnel": "Túnel"
+                    },
+                    "placeholder": "Desconocíu"
+                },
                 "studio": {
                     "label": "Tipu"
                 },
+                "substance": {
+                    "label": "Sustancia"
+                },
                 "substation": {
                     "label": "Tipu"
                 },
                 "surface": {
                     "label": "Superficie"
                 },
+                "surveillance": {
+                    "label": "Clas de vixilancia"
+                },
+                "surveillance/type": {
+                    "label": "Tipu de vixilancia",
+                    "options": {
+                        "ALPR": "Llector automáticu de matrícules",
+                        "camera": "Cámara",
+                        "guard": "Guardia"
+                    }
+                },
+                "surveillance/zone": {
+                    "label": "Zona de vixilancia"
+                },
+                "switch": {
+                    "label": "Tipu",
+                    "options": {
+                        "earthing": "Toma de tierra",
+                        "mechanical": "Mecánicu"
+                    }
+                },
                 "tactile_paving": {
                     "label": "Baldosa táctil"
                 },
                         "pitlatrine": "Pozu/Cucheru"
                     }
                 },
+                "toll": {
+                    "label": "Peaxe"
+                },
+                "tomb": {
+                    "label": "Tipu"
+                },
                 "tourism": {
                     "label": "Tipu"
                 },
+                "tourism_attraction": {
+                    "label": "Turismu"
+                },
+                "tower/construction": {
+                    "label": "Construcción"
+                },
+                "tower/type": {
+                    "label": "Tipu"
+                },
                 "tracktype": {
                     "label": "Tipu de caleya",
                     "options": {
                     },
                     "placeholder": "Sólidu, mayormente sólidu, dondu..."
                 },
+                "trade": {
+                    "label": "Tipu"
+                },
                 "traffic_calming": {
                     "label": "Tipu"
                 },
                     },
                     "placeholder": "Escelente, bonu, malu..."
                 },
+                "transformer": {
+                    "label": "Tipu",
+                    "options": {
+                        "auto": "Autotresformador",
+                        "auxiliary": "Auxiliar",
+                        "converter": "Convertidor",
+                        "distribution": "Distribución",
+                        "generator": "Xenerador",
+                        "phase_angle_regulator": "Regulador d'ángulu de fase",
+                        "traction": "Tracción",
+                        "yes": "Desconocíu"
+                    }
+                },
                 "trees": {
                     "label": "Árboles"
                 },
+                "tunnel": {
+                    "label": "Tipu",
+                    "placeholder": "Predetermináu"
+                },
                 "vending": {
                     "label": "Tipu de mercancía"
                 },
                         "street": "De 5 a 20m (16 to 65ft)"
                     }
                 },
+                "volcano/status": {
+                    "label": "Estau del volcán",
+                    "options": {
+                        "active": "Activu",
+                        "dormant": "Durmiente",
+                        "extinct": "Estinguíu"
+                    }
+                },
+                "volcano/type": {
+                    "label": "Tipu de volcán",
+                    "options": {
+                        "scoria": "Escoria",
+                        "shield": "Escudu",
+                        "stratovolcano": "Estratovolcán"
+                    }
+                },
+                "voltage": {
+                    "label": "Voltaxe"
+                },
+                "voltage/primary": {
+                    "label": "Voltaxe primariu"
+                },
+                "voltage/secondary": {
+                    "label": "Voltaxe secundariu"
+                },
+                "voltage/tertiary": {
+                    "label": "Voltaxe terciariu"
+                },
+                "wall": {
+                    "label": "Tipu"
+                },
                 "water": {
                     "label": "Tipu"
                 },
                     "terms": "Señes,Allugamientu"
                 },
                 "advertising/billboard": {
-                    "name": "Tableru d'anuncios"
+                    "name": "Tableru d'anuncios",
+                    "terms": "anunciu, publicidá, cartelera"
                 },
                 "aerialway": {
                     "name": "Tendíu aéreu"
                 },
                 "aerialway/cable_car": {
-                    "name": "Teleféricu"
+                    "name": "Teleféricu",
+                    "terms": "teleféricu"
                 },
                 "aerialway/chair_lift": {
-                    "name": "Telesiella"
+                    "name": "Telesiella",
+                    "terms": "telesiella"
+                },
+                "aerialway/drag_lift": {
+                    "name": "Telesquí",
+                    "terms": "remonte, arrastre"
                 },
                 "aerialway/gondola": {
-                    "name": "Telecabina"
+                    "name": "Telecabina",
+                    "terms": "cabina"
                 },
                 "aerialway/magic_carpet": {
                     "name": "Alfombra máxica",
-                    "terms": "cinta tresportadora"
+                    "terms": "remonte de cinta rodante"
                 },
                 "aerialway/platter": {
                     "name": "Telesquí de placa"
                 "aeroway/apron": {
                     "name": "Aparcamientu d'aviones"
                 },
+                "aeroway/gate": {
+                    "name": "Puerta de terminal"
+                },
                 "aeroway/hangar": {
                     "name": "Hangar"
                 },
                 "aeroway/taxiway": {
                     "name": "Cai de rodaxe"
                 },
+                "aeroway/terminal": {
+                    "name": "Terminal d'aeropuertu"
+                },
                 "amenity": {
                     "name": "Infraestructures"
                 },
+                "amenity/animal_boarding": {
+                    "name": "Instalación d'embarque d'animales"
+                },
+                "amenity/animal_breeding": {
+                    "name": "Instalación d'alimentación d'animales"
+                },
+                "amenity/animal_shelter": {
+                    "name": "Refuxu d'animales",
+                    "terms": "animales, mascotes, perrera, adopción"
+                },
                 "amenity/arts_centre": {
-                    "name": "Centru d'arte"
+                    "name": "Centru d'arte",
+                    "terms": "arte, pintura, escultura, plástica, ilustración"
                 },
                 "amenity/atm": {
                     "name": "Caxeru automáticu",
                     "terms": "Chigre,Tasca"
                 },
                 "amenity/bbq": {
-                    "name": "Barbacoa/Asador"
+                    "name": "Barbacoa/Asador",
+                    "terms": "llar, fueu, cocina"
                 },
                 "amenity/bench": {
                     "name": "Asientu",
                     "terms": "Divisa, cambiu"
                 },
                 "amenity/bus_station": {
-                    "name": "Estación d'autobúses",
-                    "terms": "Autobuses"
+                    "name": "Estación d'autobuses / Terminal"
                 },
                 "amenity/cafe": {
                     "name": "Café",
                 },
                 "amenity/childcare": {
                     "name": "Preescolar/Guardería",
-                    "terms": "Educación infantil"
+                    "terms": "Educación infantil,escuela infantil"
                 },
                 "amenity/cinema": {
                     "name": "Cine",
                     "terms": "Centru social, atenéu"
                 },
                 "amenity/compressed_air": {
-                    "name": "Aire comprimíu"
+                    "name": "Aire comprimíu",
+                    "terms": "infláu,neumáticos"
                 },
                 "amenity/courthouse": {
-                    "name": "Xulgáu"
+                    "name": "Xulgáu",
+                    "terms": "Tribunal,audiencia,sala"
+                },
+                "amenity/crematorium": {
+                    "name": "Crematoriu"
                 },
                 "amenity/dentist": {
                     "name": "Dentista",
                     "terms": "Ximnasiu"
                 },
                 "amenity/drinking_water": {
-                    "name": "Agua potable"
+                    "name": "Agua potable",
+                    "terms": "fonte,bebederu"
+                },
+                "amenity/driving_school": {
+                    "name": "Autoescuela",
+                    "terms": "carné,permisu,llicencia,conducir,conducción,escuela"
                 },
                 "amenity/embassy": {
                     "name": "Embaxada",
                     "terms": "Comida rápida, Comida basoria"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal de ferry"
+                    "name": "Estación / Terminal de ferry"
                 },
                 "amenity/fire_station": {
                     "name": "Parque de bomberos",
                     "terms": "Parque de bomberos, Bomberos, Centru d'emerxencies"
                 },
                 "amenity/fountain": {
-                    "name": "Fonte"
+                    "name": "Fonte d'adornu"
                 },
                 "amenity/fuel": {
                     "name": "Gasolinera",
                 "amenity/motorcycle_parking": {
                     "name": "Aparcaderu de motos"
                 },
+                "amenity/music_school": {
+                    "name": "Academia de música",
+                    "terms": "conservatoriu, escuela de música"
+                },
                 "amenity/nightclub": {
                     "name": "Discoteca",
                     "terms": "Disco, discobar, baille"
                     "name": "Ilesia",
                     "terms": "Cultu cristianu, templu"
                 },
+                "amenity/place_of_worship/hindu": {
+                    "name": "Templu hindú"
+                },
                 "amenity/place_of_worship/jewish": {
-                    "name": "Synagoga",
+                    "name": "Sinagoga",
                     "terms": "Xudería, xudaísmu"
                 },
                 "amenity/place_of_worship/muslim": {
                     "name": "Mezquita",
                     "terms": "Islam, cultu islámicu"
                 },
+                "amenity/place_of_worship/shinto": {
+                    "name": "Capiella sintoísta"
+                },
+                "amenity/place_of_worship/sikh": {
+                    "name": "Templu sikh",
+                    "terms": "templu sij"
+                },
+                "amenity/place_of_worship/taoist": {
+                    "name": "Templu taoísta",
+                    "terms": "Tao"
+                },
                 "amenity/planetarium": {
                     "name": "Planetariu"
                 },
                     "name": "Pub",
                     "terms": "Pub, Chigre"
                 },
+                "amenity/public_bath": {
+                    "name": "Baños públicos"
+                },
                 "amenity/public_bookcase": {
                     "name": "Biblioteca llibre"
                 },
                     "name": "Guardes forestales",
                     "terms": "guardabosques, seprona"
                 },
-                "amenity/recycling": {
-                    "name": "Reciclaxe",
-                    "terms": "Llimpieza,Reutilización,Escombru"
-                },
                 "amenity/recycling_centre": {
                     "name": "Centru de reciclax"
                 },
                     "name": "Antoxana d'escuela",
                     "terms": "Terrén d'escuela, zona escolar"
                 },
+                "amenity/scrapyard": {
+                    "name": "Chatarrería"
+                },
                 "amenity/shelter": {
                     "name": "Abellugu"
                 },
+                "amenity/shower": {
+                    "name": "Ducha"
+                },
                 "amenity/social_facility": {
                     "name": "Serviciu social",
                     "terms": "servicios sociales, "
                     "name": "Campus universitariu",
                     "terms": "terrén universitariu, "
                 },
+                "amenity/vending_machine": {
+                    "name": "Máquina de venta automática"
+                },
                 "amenity/vending_machine/cigarettes": {
                     "name": "Máquina de venta de tabacu"
                 },
                     "name": "Máquina de venta de preservativos"
                 },
                 "amenity/vending_machine/drinks": {
-                    "name": "Máquina de venta de bebíes"
+                    "name": "Máquina de venta de bébora",
+                    "terms": "máquina,refrescos,agua,café,te,automática"
                 },
                 "amenity/vending_machine/excrement_bags": {
-                    "name": "Máquina de venta de bolses d'escrementos"
+                    "name": "Máquina de venta de bolses d'escrementos",
+                    "terms": "máquina,bolses,perros.gatos"
+                },
+                "amenity/vending_machine/feminine_hygiene": {
+                    "name": "Máquina de venta d'hixénicos femeninos",
+                    "terms": "máquina,compresa,tampón"
                 },
                 "amenity/vending_machine/news_papers": {
                     "name": "Máquina de venta de periódicos"
                 },
+                "amenity/vending_machine/newspapers": {
+                    "name": "Máquina de venta de periódicos",
+                    "terms": "máquina,automática,periódicos.prensa,revistes"
+                },
                 "amenity/vending_machine/parcel_pickup_dropoff": {
                     "name": "Máquina d'entrega/recoyía de paquetes"
                 },
                 "amenity/vending_machine/parking_tickets": {
-                    "name": "Máquina de pagu d'aparcamientu"
+                    "name": "Máquina de pagu d'aparcamientu",
+                    "terms": "máquina,automática,aparcamientu,pagu"
                 },
                 "amenity/vending_machine/public_transport_tickets": {
-                    "name": "Máquina de venta de billetes de tresporte"
+                    "name": "Máquina de venta de billetes de tresporte",
+                    "terms": "máquina,automática,billete,tren,autobús,recarga"
                 },
                 "amenity/vending_machine/sweets": {
                     "name": "Máquina de venta de llambionaes"
                     "name": "Veterinariu",
                     "terms": "Clínica veterinaria"
                 },
+                "amenity/waste/dog_excrement": {
+                    "name": "Papelera pa escrementos de perros",
+                    "terms": "contenedor,escrementos,perros,bolses"
+                },
                 "amenity/waste_basket": {
                     "name": "Papelera",
                     "terms": "Papelera, basoria"
                 "amenity/water_point": {
                     "name": "Agua potable pa caravanes"
                 },
+                "amenity/watering_place": {
+                    "name": "Bebederu p'animales",
+                    "terms": "bebederu,agua"
+                },
                 "area": {
                     "name": "Área"
                 },
                 "area/highway": {
-                    "name": "Superficie de la carretera"
+                    "name": "Superficie de la carretera",
+                    "terms": "firme,pisu,suelu"
+                },
+                "attraction/animal": {
+                    "name": "Animales"
+                },
+                "attraction/big_wheel": {
+                    "name": "Noria",
+                    "terms": "rueda,atracciones"
+                },
+                "attraction/bumper_car": {
+                    "name": "Coches de choque",
+                    "terms": "coche,choque,atracciones,feria"
+                },
+                "attraction/carousel": {
+                    "name": "Caballinos",
+                    "terms": "Carrusel,atracciones,feria"
+                },
+                "attraction/roller_coaster": {
+                    "name": "Montaña rusa",
+                    "terms": "rusa,atracciones,feria"
                 },
                 "barrier": {
                     "name": "Barrera"
                 "barrier/bollard": {
                     "name": "Bolardu"
                 },
+                "barrier/border_control": {
+                    "name": "Aduana",
+                    "terms": "Pasu de frontera,pasaporte"
+                },
                 "barrier/cattle_grid": {
                     "name": "Rexa pa ganáu"
                 },
                     "name": "Muru de contención"
                 },
                 "barrier/stile": {
-                    "name": "Pasera pa reblagu"
+                    "name": "Pasera de reblagu"
                 },
                 "barrier/toll_booth": {
                     "name": "Cabina de peaxe"
                     "name": "Cabaña"
                 },
                 "building/cathedral": {
-                    "name": "Catedral"
+                    "name": "Edificiu de catedral"
                 },
                 "building/chapel": {
-                    "name": "Capiella"
+                    "name": "Edificiu de capiella"
                 },
                 "building/church": {
-                    "name": "Ilesia"
+                    "name": "Edificiu d'ilesia"
                 },
                 "building/college": {
                     "name": "Edificiu de colexu universitariu"
                     "terms": "Cocheres"
                 },
                 "building/greenhouse": {
-                    "name": "Ivernaderu"
+                    "name": "Ivernaderu",
+                    "terms": "cultivu,plásticu"
                 },
                 "building/hospital": {
                     "name": "Edificiu d'hospital"
                     "terms": "Vivienda,Pisos"
                 },
                 "building/retail": {
-                    "name": "Edificiu comercial"
+                    "name": "Edificiu comercial",
+                    "terms": "tiendes,gran superficie"
                 },
                 "building/roof": {
-                    "name": "Cubierta"
+                    "name": "Cubierta",
+                    "terms": "techáu, tenada"
                 },
                 "building/school": {
-                    "name": "Edificiu escolar"
+                    "name": "Edificiu escolar",
+                    "terms": "escueles"
                 },
                 "building/semidetached_house": {
                     "name": "Casa semi-aisllada"
                     "name": "Caseta de xardín"
                 },
                 "building/stable": {
-                    "name": "Establu"
+                    "name": "Establu",
+                    "terms": "corte, cuadra"
                 },
                 "building/static_caravan": {
                     "name": "Casa portátil"
                     "terms": "Ferreru,Ferrador"
                 },
                 "craft/boatbuilder": {
-                    "name": "Carpinteru de ribera"
+                    "name": "Carpinteru de ribera",
+                    "terms": "Astilleru"
                 },
                 "craft/bookbinder": {
                     "name": "Encuadernador",
                     "name": "Reloxería",
                     "terms": "Reloxeru"
                 },
+                "craft/distillery": {
+                    "name": "Destilería"
+                },
                 "craft/dressmaker": {
                     "name": "Modista",
                     "terms": "Xastre, modista"
                 "craft/electrician": {
                     "name": "Electricista"
                 },
+                "craft/electronics_repair": {
+                    "name": "Arreglos electrónicos"
+                },
                 "craft/gardener": {
                     "name": "Xardineru"
                 },
                     "name": "Cerraxería"
                 },
                 "craft/metal_construction": {
-                    "name": "Construcciones metáliques"
+                    "name": "Construcciones metáliques",
+                    "terms": "Forxa,ferreru"
                 },
                 "craft/optician": {
                     "name": "Óptica"
                     "terms": "Reparación de teyaos, Cubiertes"
                 },
                 "craft/saddler": {
-                    "name": "Guarnicioneru"
+                    "name": "Guarnicioneru",
+                    "terms": "Curtidor"
                 },
                 "craft/sailmaker": {
                     "name": "Fabricante de veles"
                 "craft/scaffolder": {
                     "name": "Montaxe d'andamios"
                 },
+                "craft/sculptor": {
+                    "name": "Escultor"
+                },
                 "craft/shoemaker": {
                     "name": "Zapateru"
                 },
                     "terms": "Centru d'emerxencies"
                 },
                 "emergency/defibrillator": {
-                    "name": "Desfibrilador"
+                    "name": "Desfibrilador",
+                    "terms": "emerxencia,corazón,ataque cardiacu"
                 },
                 "emergency/designated": {
                     "name": "Accesu d'emerxencia designáu"
                     "name": "Cruce de cai",
                     "terms": "pasu"
                 },
+                "footway/crossing-raised": {
+                    "name": "Cruce de cai llevantáu"
+                },
                 "footway/crosswalk": {
                     "name": "Pasu de peatones"
                 },
+                "footway/crosswalk-raised": {
+                    "name": "Pasu de peatones llevantáu"
+                },
                 "footway/sidewalk": {
                     "name": "Cera"
                 },
                 "golf/water_hazard_line": {
                     "name": "Llagu de golf"
                 },
+                "healthcare": {
+                    "name": "Instalación sanitaria"
+                },
+                "healthcare/alternative": {
+                    "name": "Medicina alternativa"
+                },
+                "healthcare/alternative/chiropractic": {
+                    "name": "Quiroprácticu"
+                },
+                "healthcare/audiologist": {
+                    "name": "Audiólogu"
+                },
+                "healthcare/birthing_center": {
+                    "name": "Maternidá"
+                },
                 "healthcare/blood_donation": {
                     "name": "Centru de donantes de sangre"
                 },
+                "healthcare/hospice": {
+                    "name": "Hospiciu"
+                },
+                "healthcare/midwife": {
+                    "name": "Matrona"
+                },
+                "healthcare/occupational_therapist": {
+                    "name": "Terapia ocupacional"
+                },
+                "healthcare/optometrist": {
+                    "name": "Ópticu"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "Fisioterapeuta"
+                },
+                "healthcare/podiatrist": {
+                    "name": "Pediatra"
+                },
+                "healthcare/psychotherapist": {
+                    "name": "Sicoterapeuta"
+                },
                 "highway": {
-                    "name": "Carretera"
+                    "name": "Estrada"
                 },
                 "highway/bridleway": {
                     "name": "Camín de caballeríes",
                     "terms": "Camín de ferradura"
                 },
                 "highway/bus_stop": {
-                    "name": "Parada d'autobús"
+                    "name": "Andén / Parada d'autobús"
+                },
+                "highway/corridor": {
+                    "name": "Pasiellu d'edificiu"
                 },
                 "highway/crossing": {
                     "name": "Cruce de cai"
                 },
+                "highway/crossing-raised": {
+                    "name": "Cruce de cai llevantáu"
+                },
                 "highway/crosswalk": {
                     "name": "Pasu de peatones"
                 },
+                "highway/crosswalk-raised": {
+                    "name": "Pasu de peatones llevantáu"
+                },
                 "highway/cycleway": {
                     "name": "Camín ciclista"
                 },
+                "highway/elevator": {
+                    "name": "Ascensor"
+                },
                 "highway/footway": {
                     "name": "Camín peatonal",
                     "terms": "Camín, senderu, sienda"
                     "name": "Señal de dexar pasu"
                 },
                 "highway/living_street": {
-                    "name": "Cai residencial",
+                    "name": "Rúa residencial",
                     "terms": "Semipeatonal,Zona 30"
                 },
                 "highway/mini_roundabout": {
                     "name": "Mini-rotonda"
                 },
                 "highway/motorway": {
-                    "name": "Autopista"
+                    "name": "Autoestrada"
                 },
                 "highway/motorway_junction": {
-                    "name": "Entrada/salida d'autopista"
+                    "name": "Entrada/salida d'autoestrada"
                 },
                 "highway/motorway_link": {
-                    "name": "Enllaz d'autopista",
-                    "terms": "Salida, accesu, enllaz, autopista"
+                    "name": "Enllaz d'autoestrada",
+                    "terms": "Salida, accesu, enllaz, autoestrada"
                 },
                 "highway/path": {
                     "name": "Camín"
                 },
+                "highway/pedestrian_area": {
+                    "name": "Área peatonal"
+                },
+                "highway/pedestrian_line": {
+                    "name": "Rúa peatonal"
+                },
                 "highway/primary": {
-                    "name": "Carretera autonómica"
+                    "name": "Estrada autonómica"
                 },
                 "highway/primary_link": {
                     "name": "Enllaz de carretera autonómica I",
                     "terms": "Salida, accesu, enllaz, autonómica primaria, autonómica naranxa"
                 },
+                "highway/raceway": {
+                    "name": "Circuitu (Deportes de motor)"
+                },
                 "highway/residential": {
-                    "name": "Cai urbana"
+                    "name": "Rúa urbana"
                 },
                 "highway/rest_area": {
                     "name": "Área de descansu"
                 },
                 "highway/road": {
-                    "name": "Carretera desconocida"
+                    "name": "Estrada desconocida"
                 },
                 "highway/secondary": {
-                    "name": "Carretera secundaria"
+                    "name": "Estrada secundaria"
                 },
                 "highway/secondary_link": {
-                    "name": "Enllaz de carretera autonómica II",
+                    "name": "Enllaz d'estrada autonómica II",
                     "terms": "Salida, accesu, enllaz, autonómica secundaria, autonómica verde"
                 },
                 "highway/service": {
                 "highway/service/alley": {
                     "name": "Pasaxe"
                 },
+                "highway/service/drive-through": {
+                    "name": "Carril d'autoventa"
+                },
                 "highway/service/emergency_access": {
                     "name": "Accesu d'emerxencia"
                 },
                 "highway/service/parking_aisle": {
-                    "name": "Pasiellu d'aparcaderu"
+                    "name": "Pasiellu d'aparcamientu"
                 },
                 "highway/services": {
                     "name": "Área de serviciu"
                 },
+                "highway/speed_camera": {
+                    "name": "Cámara de radar"
+                },
                 "highway/steps": {
                     "name": "Escaleres",
                     "terms": "Escalinata,Escalones"
                     "name": "Farola"
                 },
                 "highway/tertiary": {
-                    "name": "Carretera terciaria"
+                    "name": "Estrada terciaria"
                 },
                 "highway/tertiary_link": {
-                    "name": "Enllaz de carretera autonómica III",
+                    "name": "Enllaz d'estrada autonómica III",
                     "terms": "Salida, accesu, enllaz, autonómica terciaria, autonómica mariella"
                 },
                 "highway/track": {
                     "name": "Pista ensin mantenimientu"
                 },
+                "highway/traffic_mirror": {
+                    "name": "Espeyu pal tráficu"
+                },
                 "highway/traffic_signals": {
                     "name": "Semáforu",
                     "terms": "Semáforu, pasu peatonal"
                 },
                 "highway/trunk": {
-                    "name": "Carretera nacional"
+                    "name": "Estrada nacional",
+                    "terms": "rede estatal, nacional, N"
                 },
                 "highway/trunk_link": {
-                    "name": "Enllaz de carretera nacional",
+                    "name": "Enllaz d'estrada nacional",
                     "terms": "Salida, accesu, enllaz, nacional"
                 },
                 "highway/turning_circle": {
-                    "name": "Vuelta en cai ensin salida"
+                    "name": "Círculu de xiru",
+                    "terms": "Vuelta, ensin salida"
+                },
+                "highway/turning_loop": {
+                    "name": "Círculu de xiru (con islla)"
                 },
                 "highway/unclassified": {
-                    "name": "Carretera menor/ensin clasificar"
+                    "name": "Estrada menor/ensin clasificar"
                 },
                 "historic": {
                     "name": "Sitiu históricu"
                     "terms": "Cruz,Cruce"
                 },
                 "historic/wayside_shrine": {
-                    "name": "Capiella"
+                    "name": "Capiella de camín"
                 },
                 "junction": {
                     "name": "Crucie"
                 "landuse/allotments": {
                     "name": "Xardín acomuñáu"
                 },
+                "landuse/aquaculture": {
+                    "name": "Acuacultura"
+                },
                 "landuse/basin": {
                     "name": "Acumulación d'agües"
                 },
+                "landuse/brownfield": {
+                    "name": "Solar"
+                },
                 "landuse/cemetery": {
                     "name": "Cementeriu"
                 },
                 "landuse/forest": {
                     "name": "Forestal"
                 },
-                "landuse/garages": {
-                    "name": "Garaxes"
-                },
                 "landuse/grass": {
-                    "name": "Pación"
+                    "name": "Yerba"
+                },
+                "landuse/greenfield": {
+                    "name": "Terrén urbanizable"
+                },
+                "landuse/harbour": {
+                    "name": "Gran puertu"
                 },
                 "landuse/industrial": {
                     "name": "Área industrial"
                 },
+                "landuse/industrial/scrap_yard": {
+                    "name": "Chatarrería"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Mataderu"
+                },
                 "landuse/landfill": {
                     "name": "Escombrera"
                 },
                 "landuse/military": {
                     "name": "Área militar"
                 },
+                "landuse/military/airfield": {
+                    "name": "Aeródromu militar"
+                },
+                "landuse/military/barracks": {
+                    "name": "Cuartel"
+                },
+                "landuse/military/bunker": {
+                    "name": "Bunquer militar"
+                },
+                "landuse/military/checkpoint": {
+                    "name": "Puntu de control"
+                },
+                "landuse/military/danger_area": {
+                    "name": "Área de peligru"
+                },
+                "landuse/military/naval_base": {
+                    "name": "Base naval",
+                    "terms": "Arsenal"
+                },
+                "landuse/military/nuclear_explosion_site": {
+                    "name": "Llugar d'españíu nuclear"
+                },
+                "landuse/military/obstacle_course": {
+                    "name": "Recorríu d'obstáculos"
+                },
+                "landuse/military/office": {
+                    "name": "Oficina militar"
+                },
+                "landuse/military/range": {
+                    "name": "Campu de tiru"
+                },
+                "landuse/military/training_area": {
+                    "name": "Campu de maniobres"
+                },
                 "landuse/orchard": {
                     "name": "Plantación"
                 },
                 "leisure/common": {
                     "name": "Terrén comunitariu"
                 },
+                "leisure/dance": {
+                    "name": "Salón de baille"
+                },
                 "leisure/dog_park": {
                     "name": "Parque pa perros"
                 },
                 "leisure/firepit": {
-                    "name": "Barbacoa",
-                    "terms": "Parrilla"
+                    "name": "Llar",
+                    "terms": "Parrilla, asador, fueu"
                 },
                 "leisure/fitness_centre": {
                     "name": "Ximnasiu / Centru de fitness"
                 "leisure/golf_course": {
                     "name": "Campu de golf"
                 },
+                "leisure/horse_riding": {
+                    "name": "Instalación pa equitación"
+                },
                 "leisure/ice_rink": {
                     "name": "Pista de xelu"
                 },
                     "terms": "Parque, campu, xardín"
                 },
                 "leisure/picnic_table": {
-                    "name": "Mesa pa escursión"
+                    "name": "Mesa de merenderu"
                 },
                 "leisure/pitch": {
                     "name": "Campu deportivu"
                     "name": "Campu de fútbol americanu"
                 },
                 "leisure/pitch/baseball": {
-                    "name": "Campu de beisbol"
+                    "name": "Campu de béisbol"
                 },
                 "leisure/pitch/basketball": {
                     "name": "Pista de baloncestu"
                 },
+                "leisure/pitch/beachvolleyball": {
+                    "name": "Campu de voleibol  playa"
+                },
+                "leisure/pitch/boules": {
+                    "name": "Pista de petanca"
+                },
                 "leisure/pitch/bowls": {
                     "name": "Bolera"
                 },
+                "leisure/pitch/cricket": {
+                    "name": "Campu de cricket"
+                },
                 "leisure/pitch/rugby_league": {
                     "name": "Campu de rugby a 13"
                 },
                 "leisure/pitch/soccer": {
                     "name": "Campu de fútbol"
                 },
+                "leisure/pitch/table_tennis": {
+                    "name": "Mesa de pimpón"
+                },
                 "leisure/pitch/tennis": {
                     "name": "Pista de tenis"
                 },
                 "leisure/playground": {
                     "name": "Xuegos infantiles"
                 },
+                "leisure/running_track": {
+                    "name": "Pista de carreres (a pie)"
+                },
+                "leisure/sauna": {
+                    "name": "Sauna"
+                },
                 "leisure/slipway": {
                     "name": "Rampla de botadura"
                 },
                 "leisure/sports_centre": {
-                    "name": "Centru deportivu / Complexu"
+                    "name": "Centru / Complexu deportivu"
                 },
                 "leisure/sports_centre/swimming": {
                     "name": "Centru de natación"
                 "leisure/swimming_pool": {
                     "name": "Piscina"
                 },
+                "leisure/track": {
+                    "name": "Circuitu (Deportes sin motor)"
+                },
                 "leisure/water_park": {
                     "name": "Parque acuáticu"
                 },
                 "man_made/chimney": {
                     "name": "Chimenea"
                 },
+                "man_made/crane": {
+                    "name": "Grúa"
+                },
                 "man_made/cutline": {
                     "name": "Cortafuéu"
                 },
                 "man_made/gasometer": {
                     "name": "Gasómetru"
                 },
+                "man_made/groyne": {
+                    "name": "Espigón"
+                },
                 "man_made/lighthouse": {
                     "name": "Faru"
                 },
+                "man_made/mast": {
+                    "name": "Mástil"
+                },
+                "man_made/monitoring_station": {
+                    "name": "Estación de control"
+                },
                 "man_made/observation": {
                     "name": "Torre de vixilancia",
                     "terms": "Observatoriu,Torre d'observación"
                 "man_made/surveillance": {
                     "name": "Vixilancia"
                 },
+                "man_made/surveillance_camera": {
+                    "name": "Cámara de vixilancia"
+                },
                 "man_made/survey_point": {
                     "name": "Vértiz xeodésicu"
                 },
                 "man_made/water_works": {
                     "name": "Captación d'agua"
                 },
+                "man_made/watermill": {
+                    "name": "Molín d'agua"
+                },
+                "man_made/windmill": {
+                    "name": "Molín de vientu"
+                },
+                "man_made/works": {
+                    "name": "Fábrica"
+                },
+                "manhole": {
+                    "name": "Tapa d'alcantariella"
+                },
+                "manhole/telecom": {
+                    "name": "Pozu de telecomunicaciones"
+                },
                 "natural": {
                     "name": "Natural"
                 },
+                "natural/bare_rock": {
+                    "name": "Roca"
+                },
                 "natural/bay": {
                     "name": "Bahía"
                 },
                     "name": "Granda"
                 },
                 "natural/glacier": {
-                    "name": "Glacier"
+                    "name": "Glaciar"
                 },
                 "natural/grassland": {
                     "name": "Pradera"
                 "natural/saddle": {
                     "name": "Colláu"
                 },
+                "natural/sand": {
+                    "name": "Sable"
+                },
                 "natural/scree": {
                     "name": "Llera"
                 },
                 "natural/wood": {
                     "name": "Viesca"
                 },
+                "noexit/yes": {
+                    "name": "Ensin salida"
+                },
                 "office": {
                     "name": "Oficina",
                     "terms": "Despachu"
                 },
+                "office/accountant": {
+                    "name": "Contable"
+                },
                 "office/administrative": {
-                    "name": "Oficina alministrativa",
-                    "terms": "Alministración,Centru municipal"
+                    "name": "Oficina alministrativa"
+                },
+                "office/advertising_agency": {
+                    "name": "Axencia de publicidá"
                 },
-                "office/company": {
-                    "name": "Oficina d'empresa",
-                    "terms": "Delegación,Sucursal"
+                "office/association": {
+                    "name": "Oficina d'ONG"
                 },
                 "office/educational_institution": {
                     "name": "Institución educativa"
                     "name": "Axencia d'emplegu",
                     "terms": "INEM,ETT,Serviciu d'emplegu"
                 },
+                "office/energy_supplier": {
+                    "name": "Oficina de distribuidora d'enerxía"
+                },
                 "office/estate_agent": {
                     "name": "Axencia inmobiliaria"
                 },
                     "name": "Oficina financiera",
                     "terms": "Financiera,Inversión,Créditu"
                 },
+                "office/foundation": {
+                    "name": "Oficina de fundación"
+                },
                 "office/government": {
                     "name": "Oficina gubernamental",
                     "terms": "Gobiernu,Ministeriu,Delegación"
                 "office/lawyer": {
                     "name": "Despachu d'abogaos"
                 },
+                "office/newspaper": {
+                    "name": "Redacción de periódicu"
+                },
                 "office/ngo": {
-                    "name": "ONG",
+                    "name": "Oficina d'ONG",
                     "terms": "Organización nun gubernamental"
                 },
+                "office/notary": {
+                    "name": "Notaría"
+                },
                 "office/physician": {
                     "name": "Médicu"
                 },
                 "place/neighbourhood": {
                     "name": "Barriu"
                 },
+                "place/square": {
+                    "name": "Plaza"
+                },
                 "place/town": {
                     "name": "Villa"
                 },
                     "name": "Xenerador d'enerxía",
                     "terms": "Central eléctrica"
                 },
+                "power/generator/source_nuclear": {
+                    "name": "Reactor nuclear"
+                },
+                "power/generator/source_wind": {
+                    "name": "Turbina de vientu"
+                },
                 "power/line": {
                     "name": "Llinia eléctrica"
                 },
                 "power/transformer": {
                     "name": "Tresformador"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Andén / Parada de tresporte"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Andén / Parada de remonte"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Andén / Parada d'autobús"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Andén / Parada de ferry"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Andén / Parada de tren llixeru"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Andén / Parada de monocarril"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Andén / Parada de metro"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Andén / Parada de tren"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Andén / Parada de tranvía"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Andén / Parada de trolebús"
+                },
                 "public_transport/platform": {
-                    "name": "Andén"
+                    "name": "Andén / Parada de tresporte"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Andén / Parada d'autobús"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Andén / Parada de ferry"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Andén / Parada de tren llixeru"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Andén / Parada de monocarril"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Andén / Parada de metro"
+                },
+                "public_transport/platform_train": {
+                    "name": "Andén / Parada de tren"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Andén / Parada de tranvía"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Andén / Parada de trolebús"
+                },
+                "public_transport/station": {
+                    "name": "Estación d'intercambiu"
+                },
+                "public_transport/station_bus": {
+                    "name": "Estación / Terminal d'autobuses"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Estación / Terminal de ferry"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Estación de tren llixeru"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Estación de monocarril"
                 },
-                "public_transport/stop_position": {
-                    "name": "Puntu de parada"
+                "public_transport/station_subway": {
+                    "name": "Estación de metro"
+                },
+                "public_transport/station_train": {
+                    "name": "Estación de tren"
                 },
                 "railway": {
                     "name": "Ferrocarril"
                 "railway/abandoned": {
                     "name": "Ferrocarril abandonáu"
                 },
+                "railway/buffer_stop": {
+                    "name": "Topera"
+                },
+                "railway/crossing": {
+                    "name": "Pasu a nivel (camín)"
+                },
+                "railway/derail": {
+                    "name": "Descarrilador de ferrocarril"
+                },
                 "railway/disused": {
                     "name": "Ferrocarril ensin usu"
                 },
                     "name": "Funicular",
                     "terms": "Cremallera,Cable"
                 },
-                "railway/halt": {
-                    "name": "Apeaderu de ferrocarril",
-                    "terms": "Parada"
+                "railway/level_crossing": {
+                    "name": "Pasu a nivel (estrada)"
                 },
                 "railway/monorail": {
                     "name": "Monocarril"
                     "terms": "FEVE,Vía estrecha"
                 },
                 "railway/platform": {
-                    "name": "Andén ferroviariu"
+                    "name": "Andén / Parada de tren"
                 },
                 "railway/rail": {
                     "name": "Carril"
                 },
+                "railway/signal": {
+                    "name": "Señal de ferrocarril"
+                },
                 "railway/station": {
-                    "name": "Estación de ferrocarril"
+                    "name": "Estación de tren"
                 },
                 "railway/subway": {
                     "name": "Metro"
                 "shop": {
                     "name": "Tienda"
                 },
+                "shop/agrarian": {
+                    "name": "Tienda d'agricultura"
+                },
                 "shop/alcohol": {
                     "name": "Llicorería",
                     "terms": "Bodega"
                 "shop/car_repair": {
                     "name": "Taller d'automóviles"
                 },
+                "shop/carpet": {
+                    "name": "Alfombres"
+                },
                 "shop/cheese": {
                     "name": "Quesería"
                 },
                 "shop/cosmetics": {
                     "name": "Perfumería"
                 },
+                "shop/craft": {
+                    "name": "Tienda de manualidaes"
+                },
+                "shop/curtain": {
+                    "name": "Tienda de cortines"
+                },
+                "shop/dairy": {
+                    "name": "Llechería"
+                },
                 "shop/deli": {
                     "name": "Gourmet"
                 },
                 "shop/garden_centre": {
                     "name": "Xardinería"
                 },
+                "shop/gas": {
+                    "name": "Gas embotelláu"
+                },
                 "shop/gift": {
                     "name": "Regalos"
                 },
                     "name": "Xoyería"
                 },
                 "shop/kiosk": {
-                    "name": "Puestu de periódicos"
+                    "name": "Quioscu"
                 },
                 "shop/kitchen": {
                     "name": "Diseñu de cocines"
                     "name": "Casa d'empeños",
                     "terms": "Monte de piedá"
                 },
+                "shop/perfumery": {
+                    "name": "Perfumería"
+                },
                 "shop/pet": {
                     "name": "Tienda de mascotes",
                     "terms": "paxarería"
                     "name": "Venta d'entraes",
                     "terms": "taquilla, venta anticipada"
                 },
+                "shop/tiles": {
+                    "name": "Tienda d'azulexos"
+                },
                 "shop/tobacco": {
                     "name": "Estancu",
                     "terms": "tabacos, fumador"
                 "shop/video_games": {
                     "name": "Tienda de videuxuegos"
                 },
+                "shop/watches": {
+                    "name": "Reloxería"
+                },
                 "shop/water_sports": {
                     "name": "Tienda de natación/deportes acuáticos"
                 },
                 "tourism/alpine_hut": {
                     "name": "Refuxu d'alpinismu"
                 },
+                "tourism/aquarium": {
+                    "name": "Acuariu"
+                },
                 "tourism/artwork": {
                     "name": "Obra d'arte"
                 },
                 "tourism/information": {
                     "name": "Información"
                 },
+                "tourism/information/board": {
+                    "name": "Panel informativu"
+                },
+                "tourism/information/map": {
+                    "name": "Mapa"
+                },
+                "tourism/information/office": {
+                    "name": "Oficina d'información turística"
+                },
                 "tourism/motel": {
                     "name": "Motel"
                 },
                     "name": "Xiru a la drecha torgáu"
                 },
                 "type/restriction/no_straight_on": {
-                    "name": "Nun sigue de frente"
+                    "name": "Nun siguir de frente"
                 },
                 "type/restriction/no_u_turn": {
                     "name": "Sin cambiu de sentíu"
                     "name": "Ruta a caballu",
                     "terms": "Ruta ecuestre"
                 },
+                "type/route/light_rail": {
+                    "name": "Ruta de tren llixeru"
+                },
                 "type/route/pipeline": {
                     "name": "Ruta de tubería",
                     "terms": "ruta de tubería"
                 },
+                "type/route/piste": {
+                    "name": "Pista/Ruta d'esquí"
+                },
                 "type/route/power": {
                     "name": "Ruta d'enerxía",
                     "terms": "Ruta de llinia d'enerxía"
                     "name": "Ruta per carretera",
                     "terms": "Ruta de carretera"
                 },
+                "type/route/subway": {
+                    "name": "Ruta de metro"
+                },
                 "type/route/train": {
                     "name": "Ruta de tren",
                     "terms": "Ruta ferroviaria"
                     "name": "Llugar",
                     "terms": "Puntu, Allugamientu"
                 },
+                "type/waterway": {
+                    "name": "Vía acuática"
+                },
                 "vertex": {
                     "name": "Otru"
                 },
                 "waterway": {
-                    "name": "Vía d'agua"
+                    "name": "Vía acuática"
                 },
                 "waterway/boatyard": {
                     "name": "Astilleru",
                     "name": "Regueru",
                     "terms": "Regatu, regueru"
                 },
+                "waterway/stream_intermittent": {
+                    "name": "Cursu intermitente"
+                },
                 "waterway/water_point": {
                     "name": "Agua potable pa barcos"
                 },
+                "waterway/waterfall": {
+                    "name": "Tabayón",
+                    "terms": "cascada, semeira"
+                },
                 "waterway/weir": {
                     "name": "Ñora",
                     "terms": "ñora, presa, banzáu"
                 }
             }
+        },
+        "imagery": {
+            "Bing": {
+                "description": "Imáxenes aerees y de satélite.",
+                "name": "Imáxenes aerees de Bing."
+            },
+            "DigitalGlobe-Premium": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Imáxenes de satélite DigitalGlobe Premium.",
+                "name": "Imáxenes DigitalGlobe Premium"
+            },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Llendes de les imáxenes y dates de la toma. Les etiquetes apaecen col nivel d'ampliación 14 y mayor.",
+                "name": "Imáxenes antigües de DigitalGlobe Premium"
+            },
+            "DigitalGlobe-Standard": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Imáxenes de satélite DigitalGlobe Standard.",
+                "name": "Imáxenes DigitalGlobe Standard"
+            },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Llendes de les imáxenes y dates de la toma. Les etiquetes apaecen col nivel d'ampliación 14 y mayor.",
+                "name": "Imáxenes antigües de DigitalGlobe Standard"
+            },
+            "EsriWorldImagery": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Imáxenes mundiales Esri.",
+                "name": "Imáxenes mundiales Esri"
+            },
+            "MAPNIK": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "description": "La capa predeterminada d'OpenStreetMap.",
+                "name": "OpenStreetMap (Estándar)"
+            },
+            "Mapbox": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Imáxenes aerees y de satélite.",
+                "name": "Mapbox Satélite"
+            },
+            "OSM_Inspector-Addresses": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Direiciones"
+            },
+            "OSM_Inspector-Geometry": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Xeometría"
+            },
+            "OSM_Inspector-Highways": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Estraes"
+            },
+            "OSM_Inspector-Multipolygon": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Área"
+            },
+            "OSM_Inspector-Places": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Llugares"
+            },
+            "OSM_Inspector-Routing": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Rutes"
+            },
+            "OSM_Inspector-Tagging": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OSM Inspector: Etiquetáu"
+            },
+            "US-TIGER-Roads-2012": {
+                "name": "Estraes TIGER 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "A nivel d'ampliación 16+, datos del mapa de dominiu públicu dende US Census. A nivel d'ampliación menor, sólo los cambios dende 2006 menos los cambios yá incorporaos a OpenStreetMap",
+                "name": "Estraes TIGER 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Mariellu = Datos del mapa de dominiu públicu dende US Census. Bermeyu = Datos que nun s'alcuentren n'OpenStreetMap",
+                "name": "Estraes TIGER 2017"
+            },
+            "Waymarked_Trails-Cycling": {
+                "name": "Rutes marcaes: Ciclismu"
+            },
+            "Waymarked_Trails-Hiking": {
+                "name": "Rutes marcaes: Escursionismu"
+            },
+            "Waymarked_Trails-MTB": {
+                "name": "Rutes marcaes: BTT"
+            },
+            "Waymarked_Trails-Skating": {
+                "name": "Rutes marcaes: Patinaxe"
+            },
+            "Waymarked_Trails-Winter_Sports": {
+                "name": "Rutes marcaes: Deportes d'iviernu"
+            },
+            "basemap.at": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "Mapa base d'Austria, basáu en datos del gobiernu.",
+                "name": "basemap.at"
+            },
+            "basemap.at-orthofoto": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "Capa d'ortofotos proporcionada por basemap.at «Socesor» de les imáxenes de geoimage.at.",
+                "name": "Ortofoto de basemap.at"
+            },
+            "hike_n_bike": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap"
+                },
+                "name": "Hike & Bike"
+            },
+            "mapbox_locator_overlay": {
+                "attribution": {
+                    "text": "Términos y comentarios "
+                },
+                "description": "Amosar los elementos importantes p'ayudate a orientate.",
+                "name": "Superponer el Llocalizador"
+            },
+            "openpt_map": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OpenPT Map (superposición)"
+            },
+            "osm-gps": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap"
+                },
+                "description": "Traces GPS públiques xubíes a OpenStreetMap.",
+                "name": "Traces GPS d'OpenStreetMap"
+            },
+            "osm-mapnik-black_and_white": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OpenStreetMap (Estándar Blancu y Negru)"
+            },
+            "osm-mapnik-german_style": {
+                "attribution": {
+                    "text": "© collaboradores d'OpenStreetMap, CC-BY-SA"
+                },
+                "name": "OpenStreetMap (Estilu alemán)"
+            },
+            "qa_no_address": {
+                "attribution": {
+                    "text": "Simon Poole, datos ©collaboradores d'OpenStreetMap"
+                },
+                "name": "QA Sin direición"
+            },
+            "skobbler": {
+                "attribution": {
+                    "text": "© Mosicu: skobbler Información del mapa: collaboradores d'OpenStreetMap"
+                },
+                "name": "skobbler"
+            },
+            "stamen-terrain-background": {
+                "attribution": {
+                    "text": "Mosaicu del mapa por Stamen Design, baxo CC BY 3.0"
+                },
+                "name": "Terrén Stamen"
+            },
+            "tf-cycle": {
+                "attribution": {
+                    "text": "Mapes © Thunderforest, Datos © collaboradores d'OpenStreetMap"
+                },
+                "name": "OpenCycleMap de Thunderforest"
+            },
+            "tf-landscape": {
+                "attribution": {
+                    "text": "Mapes © Thunderforest, Datos © collaboradores d'OpenStreetMap"
+                },
+                "name": "Paisaxe de Thunderforest"
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/vendor/assets/iD/iD/locales/be.json b/vendor/assets/iD/iD/locales/be.json
new file mode 100644 (file)
index 0000000..015e7c2
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "be": {
+        "operations": {
+            "merge": {
+                "title": "Аб'яднаць"
+            }
+        }
+    }
+}
\ No newline at end of file
index f750867a0c9dccac44ac3c0ff6d1a5001f11edc8..935d0b7450066423aca672cce0d08fe80c9a8a35 100644 (file)
         "background": {
             "title": "Изображения",
             "description": "Изображения настройки",
-            "percent_brightness": "{opacity}% яркост",
             "none": "Никакъв",
             "best_imagery": "Най-известен източник на изображения за това местоположение",
             "custom": "Обичаен",
-            "imagery_source_faq": "От къде идва това изображение?",
             "reset": "презареждане"
         },
         "map_data": {
             "view_on_mapillary": "Вижте тази снимка на Mapillary"
         },
         "help": {
-            "title": "Помощ",
-            "help": "# Помощ\n\nТова е редактор за [OpenStreetMap](http://www.openstreetmap.org/),\nбезплатен и с възможност да прави редакции в карти от света. Можете да го изплзвате, за да добавяте и обновявате данни за вашата площ, работейки с отворен код и  свободни данни от карти от света по-добре от всеки друг.\n\nРедакциите, които правите в тази карта ще са видими за всеки, който използва\nOpenStreetMap. За да извършите редакция ще ви е необходимо\n[log in](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) е съвместен проект със [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n",
-            "addresses": "# Адреси\n\nАдресите са една от най-полезните информации на картата.\n\nВъпреки че, адресите често са представяни като части от улици, в\nOpenStreetMap те се записват като атрибути на сгради и места\nпокрай улици.\n\nМожете да добавяте адресна информация към места изобразени като\nконтури на сграда, също и към тези изобразени като кочка. Оптималния\nизточник на адресна информация е от измерване на терен или\nлични познания - както и с всички останали обекти, копирането от\nкомерсиални източници като Google Maps е стриктно забранено.\n"
+            "title": "Помощ"
         },
         "intro": {
             "graph": {
                     "label": "Капацитет",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Посока"
-                },
-                "clock_direction": {
-                    "label": "Посока",
-                    "options": {
-                        "anticlockwise": "Обратно на часовниковата стрелка",
-                        "clockwise": "По часовниковата стрелка"
-                    }
-                },
                 "collection_times": {
                     "label": "График на събиране"
                 },
                 "highway/bridleway": {
                     "name": "Конска пътека"
                 },
-                "highway/bus_stop": {
-                    "name": "Автобусна спирка"
-                },
                 "highway/cycleway": {
                     "name": "Велоалея"
                 },
                 "railway/monorail": {
                     "name": "Монорелсов път"
                 },
-                "railway/platform": {
-                    "name": "Коловоз"
-                },
                 "railway/rail": {
                     "name": "ЖП линия"
                 },
-                "railway/station": {
-                    "name": "ЖП гара"
-                },
                 "railway/subway": {
                     "name": "Метро"
                 },
index 09def562c8c9fa3ecd439994351c27575c504156..57042c608b3ca215e88e7588fa70e37b2b354c17 100644 (file)
         "background": {
             "title": "পটভূমি",
             "description": "পটভূমি নির্ধারণ",
-            "percent_brightness": "{opacity}% উজ্জ্বলতা",
             "none": "কিছুনা",
             "reset": "রিসেট",
             "minimap": {
                     "label": "ধারণক্ষমতা",
                     "placeholder": "৫০, ১০০, ২০০..."
                 },
-                "cardinal_direction": {
-                    "label": "দিক",
-                    "options": {
-                        "E": "পূর্ব",
-                        "N": "উত্তর",
-                        "NE": "উত্তরপূর্ব",
-                        "S": "দক্ষিণ",
-                        "W": "পশ্চিম"
-                    }
-                },
-                "clock_direction": {
-                    "label": "দিক",
-                    "options": {
-                        "anticlockwise": "ঘড়ির কাটার উল্টো দিকে",
-                        "clockwise": "ঘড়ির কাটার দিকে"
-                    }
-                },
                 "collection_times": {
                     "label": "সংগ্রহের সময়"
                 },
                 "highway": {
                     "name": "রাজপথ"
                 },
-                "highway/bus_stop": {
-                    "name": "বাস স্টপ"
-                },
                 "highway/cycleway": {
                     "name": "সাইকেলের রাস্তা"
                 },
                 "railway/monorail": {
                     "name": "মনোরেল"
                 },
-                "railway/platform": {
-                    "name": "রেল প্লাটফর্ম"
-                },
                 "railway/rail": {
                     "name": "রেল"
                 },
-                "railway/station": {
-                    "name": "রেল স্টেশন"
-                },
                 "railway/subway": {
                     "name": "ভূতলপথ"
                 },
index 22cb579f5abb2b96252f4e6f6bbc7873c35a281b..5b925cc0576790197c5b6bb316717313a1bff3e1 100644 (file)
         "background": {
             "title": "Pozadina",
             "description": "Podešavanja pozadine",
-            "percent_brightness": "prozirnost {opacity}% ",
             "none": "Ništa",
             "custom": "Prilagođena pozadina",
             "reset": "ponovo postavite"
         },
         "cannot_zoom": "Ne može se umanjiti više u trenutnom načinu.",
         "help": {
-            "title": "Pomoć",
-            "imagery": "# Satelitske slike\n\nSatelitske slike su važan resurs za mapiranje. Kombinacija\npreleta avionom, satelitski pogledi i slobodno sastavljeni izvorisu dostupni\nu uređivaču pod menijem 'Podešavanja pozadine' na desnoj strani.\n\nU početnik postavkama satelitski sloj [Bing Maps] (http://www.bing.com/maps/) je\nprezentiran u uređivaču, ali kako pomičete i uvećavate kartu na nova geografska\npodručja, novi će izvori postati dostupni. Neke zemlje, poput Sjedinjenih\nDržava, Francuske i Danske imaju slike vrlo visoke kvalitete na raspolaganju za neka područja.\n\nSatelitske slike ponekad odstupaju od podataka karte, zbog greške na\nstrani davatelja satelitskih slika. Ako vidite puno cesta pomjerenih u pozadini.\nnemojte ih odmah sve premještati kako bi se slagale sa pozadinom. Umjesto toga možete podesiti\nsatelitske slike tako da odgovaraju postojećim podacima klikom na 'Popravljanje poravnanja', na\ndnu interfejsa Podešavanja pozadine.\n",
-            "addresses": "# Addrese\n\nAddrese su neke od najkorisnijih informacija na karti.\n\nIako su adrese često predstavljene kao dijelovi ulica, na karti OpenStreetMap\nsu one spremljene kao atributi građevina i mjesta uz ulice.\n\nMožete dodati informaciju o adresama mjesta koja su ucrtana kao i vanjske linije građevina takođe\nkao i onih koja su ucrtana kao obične tačke. Optimalni izvor podataka adresa\nse dobija iz istraživanja na licu mjesta ili ličnim znanjem- kao što je slučaj sam bilo kojom drugom značajkom,\nkopiranje iz komercijalnih izvora kao što je Google Maps je striktno\nzabranjeno.\n"
+            "title": "Pomoć"
         },
         "intro": {
             "graph": {
                     "label": "Kapacitet",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Pravac"
-                },
-                "clock_direction": {
-                    "label": "Pravac",
-                    "options": {
-                        "anticlockwise": "U smjeru suprotnom od kazaljke na satu",
-                        "clockwise": "U smjeru kazaljke na satu"
-                    }
-                },
                 "collection_times": {
                     "label": "Vremena skupljanja"
                 },
                     "name": "Stanica rendžerske službe",
                     "terms": "rendžerska služba,stanica rendžerske službe,rendžerska stanica"
                 },
-                "amenity/recycling": {
-                    "name": "Recikliranje",
-                    "terms": "recikliranje,ponovna obrada,reciklaža"
-                },
                 "amenity/restaurant": {
                     "name": "Restoran",
                     "terms": "restoran,gostionica"
                     "name": "Konjska staza",
                     "terms": "konjska staza,konjička staza,konjski trag"
                 },
-                "highway/bus_stop": {
-                    "name": "Bus stanica",
-                    "terms": "autobuska stanica,autobusko stajalište"
-                },
                 "highway/cycleway": {
                     "name": "Biciklistička staza",
                     "terms": "biciklistička staza,staza za bicikle"
                     "terms": "ured,uslužni ured"
                 },
                 "office/administrative": {
-                    "name": "Administrativni ured",
-                    "terms": "administracija,administrativni ured,ured upravljanja"
-                },
-                "office/company": {
-                    "name": "Ured kompanije",
-                    "terms": "ured kompanije,ured firme,korporativni ured"
+                    "name": "Administrativni ured"
                 },
                 "office/educational_institution": {
                     "name": "Obrazovna institucija",
                     "name": "Transformator",
                     "terms": "transformator,transformator el. energije"
                 },
-                "public_transport/platform": {
-                    "name": "Platforma",
-                    "terms": "platforma"
-                },
-                "public_transport/stop_position": {
-                    "name": "Stop pozicija",
-                    "terms": "pozicija zaustavljanja,stop,stop pozicija"
-                },
                 "railway": {
                     "name": "Željeznička pruga"
                 },
                     "name": "Nekorištena željeznica",
                     "terms": "nekorištena željeznička pruga,nekorištena željeznica"
                 },
-                "railway/halt": {
-                    "name": "Željeznička ustava",
-                    "terms": "željeznička ustava,željezničko zaustavljanje,željeznički zastoj"
-                },
                 "railway/monorail": {
                     "name": "Pruga sa jednim kolosijekom",
                     "terms": "pruga sa jednim kolosijekom,jednošinska pruga"
                 },
-                "railway/platform": {
-                    "name": "Željeznička platforma",
-                    "terms": "željeznička platforma,željezničko stajalište"
-                },
                 "railway/rail": {
                     "name": "Šina",
                     "terms": "šine,šinski put"
                 },
-                "railway/station": {
-                    "name": "Željeznička stanica",
-                    "terms": "željeznička stanica,željeznička postaja"
-                },
                 "railway/subway": {
                     "name": "Podzemna željeznica",
                     "terms": "podzemna željeznica,metro"
index a2cfa83c0b96aaf505700948732419d939cc1e6b..d21582face09c2a1c2fec016396d7b4e983ec83c 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Feu clic per afegir més nodes a la línia. Feu clic a altres línies per connectar amb elles, i feu doble clic per acabar la línia."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Això no pot ser editat perquè és connectat a una característica amagada."
             }
         },
         "operations": {
             "localized_translation_language": "Trieu una llengua",
             "localized_translation_name": "Nom"
         },
+        "zoom_in_edit": "Apropeu-vos més per editar",
         "login": "inicia sessió",
         "logout": "Tancar la sessió",
         "loading_auth": "Connectant a OpenStreetMap...",
             "about_changeset_comments": "Quant als comentaris del conjunt de canvis",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Has mencionat Google en aquest comentari: recorda que la còpia de Google Maps està estrictament prohibida.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edicions fetes per {users}",
                 "accuracy": "Precisió",
                 "unknown": "Desconegut",
                 "show_tiles": "Mostrar rajoles",
-                "hide_tiles": "Ocultar rajoles"
+                "hide_tiles": "Ocultar rajoles",
+                "show_vintage": "Mostra l'antic",
+                "hide_vintage": "Oculta l'antic"
             },
             "history": {
                 "key": "H",
                 "title": "Mesurament",
                 "selected": "{n} seleccionat",
                 "geometry": "Geometria",
-                "closed": "tancat",
                 "center": "Center",
                 "perimeter": "Perímetre",
                 "length": "Longitud",
                 "centroid": "Centroide",
                 "location": "Ubicació",
                 "metric": "Mètric",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Nombre de nodes"
             }
         },
         "geometry": {
             "title": "Fons",
             "description": "Paràmetres de configuració del fons",
             "key": "B",
-            "percent_brightness": "{opacity}% brillantor",
             "none": "Cap",
             "best_imagery": "Font d'imatgeria millor coneguda per a aquesta ubicació",
             "switch": "Senyals de trànsit ",
             "custom": "Personalitzar",
             "custom_button": "Editar el fons personalitzat",
-            "fix_misalignment": "Ajusta la alineació de la imatgeria",
-            "imagery_source_faq": "D'on prové aquesta imatgeria?",
             "reset": "reiniciar",
-            "offset": "Arrosega cap a qualsevol lloc de la zona gris de sota per ajustar la alineació de la imatgeria, o entra els valors de la alineació en metres.",
             "minimap": {
-                "description": "Miniatura del mapa",
                 "tooltip": "Mostra un mapa amb menys zoom per ajudar a localitzar l'àrea que es mostra actualment.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ajusta la alineació de la imatgeria",
+            "offset": "Arrosega cap a qualsevol lloc de la zona gris de sota per ajustar la alineació de la imatgeria, o entra els valors de la alineació en metres."
         },
         "map_data": {
             "title": "Dades del mapa",
         "splash": {
             "welcome": "Benvinguts a l'editor iD per a l'OpenStreetMap",
             "text": "L'editor iD és una eina fàcil i potent per contribuir al millor mapa lliure del món. Aquesta és la versió {version}. Per obtenir més informació visiteu {website} i si voleu comunicar l'existència d'algun error feu-ho a {github}.",
-            "walkthrough": "Comenceu la visita guiada"
+            "walkthrough": "Comenceu la visita guiada",
+            "start": "Editeu-lo ara"
         },
         "source_switch": {
             "live": "directe",
         "validations": {
             "disconnected_highway": "Via desconnectada",
             "disconnected_highway_tooltip": "Les vies haurien de connectar altres vies o entrades d'edificis.",
+            "old_multipolygon": "Etiqueta Multipoligon en ",
             "untagged_point": "Punt sense etiquetar",
             "untagged_point_tooltip": "Seleccioneu un tipus d'objecte que descrigui el que és aquest punt.",
             "untagged_line": "Línia sense etiquetar",
             "untagged_area_tooltip": "Seleccioneu un tipus d'objecte que descrigui el que és aquesta àrea.",
             "untagged_relation": "Relació sense etiquetar",
             "untagged_relation_tooltip": "Seleccioneu un tipus d'objecte que descrigui com és aquesta relació.",
-            "many_deletions": "Esteu eliminant  {n} objectes. Segur que ho voleu fer? Això els eliminarà del mapa que tothom veu a openstreetmap.org",
             "tag_suggests_area": "L'etiqueta {tag} suggereix que la línia hauria de ser una àrea, però no és una àrea",
             "deprecated_tags": "Etiquetes obsoletes : {tags}"
         },
+        "zoom": {
+            "in": "Apropa't",
+            "out": "Allunya't"
+        },
         "cannot_zoom": "No es pot allunyar més la vista al mode actual.",
         "full_screen": "Passar a pantalla completa",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Visualitzeu la imatge a Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Fotografies a peu de carrer de OpenStreetCam",
+            "title": "Capa de fotografia (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Visualitzeu la imatge a OpenStreetCam"
+        },
         "help": {
             "title": "Ajuda",
             "key": "H",
-            "help": "# Ajuda\n\nAixò és un editor per al [OpenStreetMap](http://www.openstreetmap.org/), el mapa lliure i editable del món. Podeu utilitzar-lo per afegir i actualitzar\nles dades a la vostra àrea, contibuint així a fer un mapa de codi obert i amb dades lliures del món\nmillor per a tothom.\n\nLes edicions que feu en aquest mapa seran visibles per tothom que faci servir OpenStreetMap. Per tal de començar a editar, necessitareu\n[iniciar sessió](https://www.openstreetmap.org/login).\n\nL'[Editor iD](http://ideditor.com/) és un projecte cooperatiu que té el [codi font\ndisponible a GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nLes traces enregistrades amb GPS són una font fiable de dades per a l'OpenStreetMap. Aquest editor accepta les traces locals - fitxers `.gpx` del vostre ordinador. Podeu generar aquest tipus de traça GPS amb aplicacions per a mòbils o per dispositius personals de GPS.\n\nPer a més informació de com recollir dades amb GPS, llegiu [Recollir dades amb GPS](http://learnosm.org/en/mobile-mapping/).\n\nPer utilitzar una traça GPX en la edició del mapa arrossegueu el fitxer GPX i deixeu-lo a l'editor. En detectar-se, s'afegirà en el mapa com una línia lila llampant. Cliqueu al menú 'Dades del mapa', al cantó dret, per activar, desactivar, o ajustar la visió d'aquesta capa GPX.\n\nLa traça GPX no pujarà directament a OpenStreetMap - la millor manera d'utilitzar-la és que dibuixeu en el mapa els nous objectes, fent-la servir com a guia. De tota manera, també la podeu [pujar a l'OpenStreetMap] (http://www.openstreetmap.org/trace/create) perquè d'altres persones l'aprofitin.\n",
-            "imagery": "# Imatgeria\n\nLa imatgeria aèria és un recurs important per a l'edició de mapes. Una combinació de\nvols d'aeronaus, fotografies de satèl·lit, i d'altres fonts compilades gratuïtament\nestan disponibles a l'editor dins del menú de l'esquerra 'Paràmetres de configuració del fons'.\n\nPer defecte, l'editor mostra la capa de satèl·lit de [Bing Maps](http://www.bing.com/maps/), però a mesura que us moveu i ajusteu la vista del mapa a noves àrees geogràfiques, noves fonts estaran disponibles. En alguns països, com ara els Estats Units, França, i Dinamarca tenen\nuna imatgeria d'alta qualitat disponible per a determinades àrees.\n\nLa imatgeria a vegades no es correspon amb les dades del mapa, això és degut a un error\nper part del proveïdor de la imatge. Si observeu moltes carreteres mogudes del seu lloc a la imatge,\nno les mogueu per tal que encaixin amb aquesta. Ja que podeu ajustar la imatgeria per tal de que quadri amb les dades existents clicant a 'Corregeix la desalineació' al capdevall de la pestanya dels\n'Paràmetres de configuració del fons'.\n",
-            "addresses": "# Adreçes\n\nLes adreçes són una de les informacions més útils per al mapa.\n\nTot i que les adreces sovint es representen com a part del carrer, a l'OpenStreetMap\nes desen com a atributs dels edificis i llocs al llarg dels carrers\n\nPodeu afegir la informació de l'adreça a llocs cartografiats com a edificis com també\na aquells llocs cartografiats com a simples punts. La forma òptima d'obtenir dades\nde les adreces és a partir d'un estudi al carrer o bé el coneixement propi - com a qualsevol altre element, la còpia de fonts comercials com ara el Google Maps és estrictament prohibida.\n",
-            "inspector": "# Utilitzant l'inspector\n\nL'inspector és la secció de la interfície d'usuari que es troba al cantó esquerra de la pàgina i que us permet editar els detalls del objecte seleccionat.\n\n### Selecció del tipus d'objecte\n\nDesprés d'afegir un punt, línia, o àrea, podreu seleccionar el tipus d'objecte que es tracti, tant si és una autopista com un carrer residencial, un supermercat o un cafè. L'inspector mostrarà botons per els tipus d'objecte més comuns, i en podreu trobar d'altres escrivint el que estigueu buscant al quadre de cerca.\n\nCliqueu la 'i' al cantó inferior dret del botó del tipus d'objecte per saber-ne més. Cliqueu un botó per seleccionar el tipus.\n\n### Utilitzant formularis i etiquetes d'edició\n\nDesprés de seleccionar el tipus d'objecte, o quan en seleccioneu un que ja el tingui assignat, l'inspector mostrarà uns camps amb detalls de l'objecte, com el seu nom o la seva adreça.\n\nSota dels camps que es mostrin, podeu clicar el desplegable  'Afegir camp' per afegir altres detalls, com ara un enllaç a la Viquipèdia, si té accés per a cadires de rodes i altres camps.\n\nA la part inferior de l'inspector, cliqueu 'Etiquetes addicionals' per afegir altres etiquetes arbitràries a l'element. [Taginfo](http://taginfo.openstreetmap.org/) és una gran eina per aprendre'n més sobre les combinacions d'etiquetes més populars.\n\nEls canvis que feu a l'inspector s'aplicaran automàticament al mapa. Els podreu desfer en qualsevol moment clicant al botó 'Desfer'.\n"
+            "help": {
+                "title": "Ajuda",
+                "open_data_h": "Dades Obertes",
+                "before_start_h": "Abans de començar",
+                "open_source_h": "Font Oberta"
+            },
+            "overview": {
+                "title": "Visió general",
+                "navigation_h": "Navegació",
+                "features_h": "Característiques del mapa"
+            },
+            "editing": {
+                "title": "Editant i Salvant",
+                "select_h": "Selecciona",
+                "multiselect_h": "Selecció múltiple",
+                "undo_redo_h": "Desfer i Refer",
+                "save_h": "Desar",
+                "upload_h": "Puja",
+                "backups_h": "Copia de seguretat automàtica",
+                "keyboard_h": "Dreceres de teclat"
+            },
+            "feature_editor": {
+                "title": "Editor de característiques",
+                "type_h": "Tipus de característiques",
+                "fields_h": "Camps",
+                "tags_h": "Etiquetes"
+            },
+            "points": {
+                "title": "Punts",
+                "add_point_h": "Afegint punts",
+                "move_point_h": "Movent punts",
+                "delete_point_h": "Eliminant punts"
+            },
+            "lines": {
+                "title": "Línies",
+                "add_line_h": "Afegint línies",
+                "modify_line_h": "Modificant línies",
+                "connect_line_h": "Connectant línies",
+                "disconnect_line_h": "Desconnectant línies",
+                "move_line_h": "Movent línies",
+                "delete_line_h": "Eliminant línies"
+            },
+            "areas": {
+                "title": "Àrees",
+                "point_or_area_h": "Punts o àrees?",
+                "add_area_h": "Afegint àrees",
+                "square_area_h": "Quadra les cantonades",
+                "modify_area_h": "Modificant àrees",
+                "delete_area_h": "Eliminant àrees"
+            },
+            "relations": {
+                "title": "Relacions",
+                "edit_relation_h": "Editant relacions",
+                "maintain_relation_h": "Mantenint  les relacions",
+                "relation_types_h": "Tipus de relacions",
+                "multipolygon_h": "Multipolígon",
+                "turn_restriction_h": "Restriccions de gir",
+                "route_h": "Rutes",
+                "boundary_h": "Límits"
+            },
+            "imagery": {
+                "title": "Imatges de fons",
+                "sources_h": "Fonts d'imatges",
+                "offsets_h": "Ajusta la alineació de la imatgeria"
+            },
+            "streetlevel": {
+                "title": "Fotografies a peu de carrer",
+                "using_h": "Fent servir fotografies a peu de carrer"
+            },
+            "gps": {
+                "title": "Traces GPS",
+                "using_h": "Fent servir Traces GPS"
+            }
         },
         "intro": {
             "done": "Fet",
                     "adams-street": "Carrer Adams",
                     "andrews-elementary-school": "Escola de primària Andrews",
                     "andrews-street": "Carrer Andrews",
-                    "pizza-hut": "Pizza Hut"
+                    "armitage-street": "Carrer Armitage",
+                    "barrows-school": "Escola Barrows",
+                    "pizza-hut": "Pizza Hut",
+                    "river-drive": "Carrer del riu",
+                    "river-road": "Carretera del riu",
+                    "water-street": "Carrer de l'Aigua"
                 }
             },
             "welcome": {
             },
             "areas": {
                 "title": "Àrees",
-                "add_playground": "*Àrees* s'utilitza per definir els límits d'objectes com llacs, edificis o àrees residencials.{br}També es poden utilitzar per incloure més detalls al mapa de molts objectes que altrament deixaríeu com un punt. **Cliqueu el botó {button} Àrea per afegir una nova àrea.**",
                 "start_playground": "Afegim aquesta zona de joc al mapa dibuixant una àrea. Les àrees es dibuixen situant *nodes* seguint el límit extern de l'objecte. **Cliqueu o premeu la barra espaiadora per situar el primer node a una de les cantonades de la zona de joc.**",
                 "finish_playground": "Acabeu l'àrea prement la tecla de retorn o clicant altre cop el primer o el darrer node. **Acabeu de dibuixar una àrea per al parc.**",
                 "search_playground": "**Cerqueu «{preset}».**",
                 "enter": "Entrar",
                 "esc": "Esc",
                 "home": "Inicio",
+                "option": "Opció",
+                "pause": "Pausa",
                 "pgdn": "Av Pág",
-                "pgup": "Re Pág"
+                "pgup": "Re Pág",
+                "return": "Tornar",
+                "shift": "Majuscula",
+                "space": "Espai"
+            },
+            "gesture": {
+                "drag": "Arrossega"
             },
             "or": "-o-",
             "browsing": {
                 "title": "Cercant",
                 "navigation": {
-                    "title": "Navegació"
+                    "title": "Navegació",
+                    "pan": "Mapa panoràmic",
+                    "zoom": "Apropa't / Allunya't"
                 },
                 "help": {
                     "title": "Ajuda"
+                },
+                "display_options": {
+                    "title": "Opcions de pantalla",
+                    "fullscreen": "Introduïu mode de pantalla sencera",
+                    "minimap": "Canvia al minimap"
+                },
+                "with_selected": {
+                    "edit_menu": "Canvia al menú d'edició"
+                },
+                "vertex_selected": {
+                    "previous": "Salta al node anterior",
+                    "next": "Salta al següent node",
+                    "first": "Salta al primer node",
+                    "last": "Salta al node final"
                 }
             },
             "editing": {
                     "title": "Dibuixant",
                     "add_point": "Mode \"Afegir punt\"",
                     "add_line": "Mode \"Afegir línia\"",
-                    "add_area": "Mode \"Afegir Àrea\""
+                    "add_area": "Mode \"Afegir Àrea\"",
+                    "place_point": "Seleccioneu un punt"
+                },
+                "operations": {
+                    "title": "Operaccions",
+                    "reverse": "Reverteix una línia.",
+                    "move": "Mou característiques seleccionades",
+                    "rotate": "Gira característiques seleccionades",
+                    "delete": " Esborra característiques seleccionades"
+                },
+                "commands": {
+                    "title": "Ordres",
+                    "copy": "Copia característiques seleccionades",
+                    "paste": "Pega característiques seleccionades",
+                    "undo": "Desfeu l'ultima acció",
+                    "redo": "Refeu l'ultima acció",
+                    "save": "Salveu el canvis"
                 }
             },
             "tools": {
                 "title": "Ferramentes",
                 "info": {
-                    "title": "Informació"
+                    "title": "Informació",
+                    "all": "Canvia tots els panells d'informació",
+                    "background": "Canvia al panell de fons",
+                    "history": "Canvia al panell d'historial",
+                    "location": "Canvia al panell d'ubicació",
+                    "measurement": "Canvia al panell de mesura"
                 }
             }
         },
                 "aeroway": {
                     "label": "Tipus"
                 },
+                "agrarian": {
+                    "label": "Productes"
+                },
                 "amenity": {
                     "label": "Tipus"
                 },
                     "label": "Tipus"
                 },
                 "cables": {
+                    "label": "Cables",
                     "placeholder": "1, 2, 3..."
                 },
                 "camera/direction": {
                     "label": "Capacitat",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direcció",
-                    "options": {
-                        "E": "Est",
-                        "ENE": "Est-nord-est",
-                        "ESE": "Est-sud-est",
-                        "N": "Nord",
-                        "NE": "Nord-est",
-                        "NNE": "Nord-nord-est",
-                        "NNW": "Nord-nord-oest",
-                        "NW": "Nord-oest",
-                        "S": "Sud",
-                        "SE": "Sud-est",
-                        "SSE": "Sud-sud-est",
-                        "SSW": "Sud-sud-oest",
-                        "SW": "Sud-oest",
-                        "W": "Oest",
-                        "WNW": "Oest-nord-oest",
-                        "WSW": "Oest-sud-oest"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipus"
                 },
-                "clock_direction": {
-                    "label": "Direcció",
-                    "options": {
-                        "anticlockwise": "en sentit contrari al de les agulles del rellotge",
-                        "clockwise": "en sentit de les agulles del rellotge"
-                    }
-                },
                 "clothes": {
                     "label": "Roba"
                 },
                 "generator/type": {
                     "label": "Tipus"
                 },
+                "government": {
+                    "label": "Tipus"
+                },
                 "grape_variety": {
                     "label": "Varietats de raïm"
                 },
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direcció",
-                    "options": {
-                        "backward": "Enrere",
-                        "forward": "Endavant"
-                    }
-                },
                 "park_ride": {
                     "label": "Aparca i viatja "
                 },
                 "recycling_accepts": {
                     "label": "N'accepta"
                 },
-                "recycling_type": {
-                    "label": "Tipus de reciclatge",
-                    "options": {
-                        "centre": "Centre de reciclatge",
-                        "container": "Contenidor"
-                    }
-                },
                 "ref": {
                     "label": "Codi de referència"
                 },
                 "amenity/bureau_de_change": {
                     "name": "Canvi de divisa"
                 },
-                "amenity/bus_station": {
-                    "name": "Estació d'autobusos"
-                },
                 "amenity/cafe": {
                     "name": "Cafè",
                     "terms": "Cafè, bar, cafeteria"
                     "name": "Local de menjar ràpid",
                     "terms": "Menjar ràpid, servei de menjar ràpid, restaurant de menjar ràpid, Local de menjar ràpid"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Terminal de Ferry"
-                },
                 "amenity/fire_station": {
                     "name": "Parc de bombers",
                     "terms": "Caserna de bombers, Base de Bombers, Estació de Bombers"
                 "amenity/ranger_station": {
                     "name": "Base d'Agents Rurals"
                 },
-                "amenity/recycling": {
-                    "name": "Reciclatge"
-                },
                 "amenity/recycling_centre": {
                     "name": "Centre de Reciclatge"
                 },
                 "area/highway": {
                     "name": "Superfície de la carretera"
                 },
+                "attraction/pirate_ship": {
+                    "name": "Vaixell pirata"
+                },
                 "barrier": {
                     "name": "Barrera",
                     "terms": "Tanca, Valla, Paret, Seto, Tancament, Filferrada, Reixat, Reixa"
                 "craft/clockmaker": {
                     "name": "Rellotger"
                 },
+                "craft/distillery": {
+                    "name": "Destil·leria"
+                },
                 "craft/dressmaker": {
                     "name": "Sastreria"
                 },
                 "craft/scaffolder": {
                     "name": "Muntador de bastides"
                 },
+                "craft/sculptor": {
+                    "name": "Escultor"
+                },
                 "craft/shoemaker": {
                     "name": "Sabater"
                 },
                     "name": "Terraplè "
                 },
                 "emergency/ambulance_station": {
-                    "name": "Parada d'ambulàncies"
+                    "name": "Parada d'ambulàncies",
+                    "terms": "Estació d'ambulàncies"
                 },
                 "emergency/defibrillator": {
                     "name": "Desfibril·lador"
                 "golf/water_hazard_line": {
                     "name": "Obstacle d'aigua"
                 },
+                "healthcare/alternative/chiropractic": {
+                    "name": "Quiropràctic"
+                },
                 "healthcare/blood_donation": {
                     "name": "Centre de donació de sang"
                 },
                     "name": "Camí de ferradura",
                     "terms": "Camí de ferradura, cavall, camí eqüestre, via eqüestre, ferradura, via de ferradura"
                 },
-                "highway/bus_stop": {
-                    "name": "Parada d'autobús",
-                    "terms": "Parada de bus, Parada"
-                },
                 "highway/corridor": {
                     "name": "Corredor interior"
                 },
                     "name": "Bosc",
                     "terms": "Massa forestal,Bosc,Arbreda"
                 },
-                "landuse/garages": {
-                    "name": "Garatges"
-                },
                 "landuse/grass": {
                     "name": "Herba",
                     "terms": "Herba,Gespa"
                     "terms": "Oficina, Oficines"
                 },
                 "office/administrative": {
-                    "name": "Oficina de tràmits locals",
-                    "terms": "Oficina administrativa"
-                },
-                "office/company": {
-                    "name": "Oficines de companyia"
+                    "name": "Oficina de tràmits locals"
                 },
                 "office/coworking": {
                     "name": "Espai de coworking"
                     "name": "Bufet d'advocats"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notaria",
-                    "terms": "Oficina del notari"
+                    "name": "Notaria"
                 },
                 "office/ngo": {
                     "name": "Oficina d'ONG"
                     "name": "Transformador",
                     "terms": "Transformador"
                 },
-                "public_transport/platform": {
-                    "name": "Plataforma"
-                },
-                "public_transport/stop_position": {
-                    "name": "Posició d'aturada"
-                },
                 "railway": {
                     "name": "Ferrocarril"
                 },
                 "railway/funicular": {
                     "name": "Funicular"
                 },
-                "railway/halt": {
-                    "name": "Parada de Ferrocarril"
-                },
                 "railway/level_crossing": {
                     "name": "Pas a nivell (carretera)"
                 },
                 "railway/narrow_gauge": {
                     "name": "Ferrocarril de via estreta"
                 },
-                "railway/platform": {
-                    "name": "Andana "
-                },
                 "railway/rail": {
                     "name": "Via fèrria"
                 },
-                "railway/station": {
-                    "name": "Estació de tren"
-                },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "Metro, Transport metropolità"
                     "name": "Tramvia ",
                     "terms": "Tranvia, Tram"
                 },
-                "railway/tram_stop": {
-                    "name": "Parada de tramvia"
-                },
                 "relation": {
                     "name": "Relació",
                     "terms": "Relació"
                 "shop/jewelry": {
                     "name": "Joieria"
                 },
-                "shop/kiosk": {
-                    "name": "Quiosc de diaris"
-                },
                 "shop/kitchen": {
                     "name": "Botiga de disseny de cuines"
                 },
                 "attribution": {
                     "text": "Termes i comentaris"
                 },
-                "description": "Imatges aèries i de satèl·lit."
+                "description": "Imatges aèries i de satèl·lit.",
+                "name": "Satèl·lit Mapbox "
             },
             "OSM_Inspector-Addresses": {
                 "attribution": {
             "OSM_Inspector-Tagging": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA"
-                }
+                },
+                "name": "Inspector OSM: Etiquetatge"
+            },
+            "US-TIGER-Roads-2012": {
+                "name": "Carreteres TIGER 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "Al nivell de zoom 16+, les dades del mapa són del domini públic del US Census. A zooms més baixos, només canvis d'ençà de 2006, els canvis menors incorporats a OpenStreetMap",
+                "name": "Carreteres TIGER 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Groc = Dades de mapa del domini públic del US Census. Vermell = No es troben dades a OpenStreetMap",
+                "name": "Carreteres TIGER 2017"
+            },
+            "Waymarked_Trails-Cycling": {
+                "name": "Waymarked Trails: Ciclisme"
+            },
+            "Waymarked_Trails-Hiking": {
+                "name": "Waymarked Trails: Senderisme"
+            },
+            "Waymarked_Trails-MTB": {
+                "name": "Waymarked Trails: Ciclisme de Muntanya"
+            },
+            "Waymarked_Trails-Skating": {
+                "name": "Waymarked Trails: Patinatge"
+            },
+            "Waymarked_Trails-Winter_Sports": {
+                "name": "Waymarked Trails: Esports d'hivern"
             },
             "basemap.at": {
                 "attribution": {
                     "text": "basemap.at"
                 },
+                "description": "Mapa Base d'Austria, basat en dades governamentals.",
                 "name": "basemap.at"
             },
             "basemap.at-orthofoto": {
                 "attribution": {
                     "text": "basemap.at"
-                }
+                },
+                "description": "Capa d'ortofoto proveïda per basemap.at. \"Successora\" de geoimage.at imagery.",
+                "name": "Ortofoto basemap.at "
             },
             "hike_n_bike": {
+                "attribution": {
+                    "text": "© OpenStreetMap col·laboradors"
+                },
                 "name": "Excursió i bicicleta"
             },
             "mapbox_locator_overlay": {
                 "attribution": {
                     "text": "Termes i comentaris"
-                }
+                },
+                "description": "Visualitza característiques importants per ajudar a orientar-te.",
+                "name": "Localitzador superposat"
             },
             "openpt_map": {
                 "attribution": {
                     "text": "© OpenStreetMap col·laboradors, CC-BY-SA"
-                }
+                },
+                "name": "OpenPT Map (superposat)"
             },
             "osm-gps": {
                 "attribution": {
                     "text": "© OpenStreetMap col·laboradors, CC-BY-SA"
                 },
                 "name": "OpenStreetMap (Estil alemany)"
+            },
+            "qa_no_address": {
+                "attribution": {
+                    "text": "Simon Poole, Dades ©OpenStreetMap col·laboradors"
+                },
+                "name": "QA Sense adreça"
+            },
+            "skobbler": {
+                "attribution": {
+                    "text": "© Quadrícules: skobbler Dades del mapa: OpenStreetMap col·laboradors"
+                },
+                "name": "skobbler"
+            },
+            "stamen-terrain-background": {
+                "attribution": {
+                    "text": "Quadricula de mapes de Stamen Design, sota CC BY 3.0"
+                },
+                "name": "Stamen Terrain"
+            },
+            "tf-cycle": {
+                "attribution": {
+                    "text": "Mapes © Thunderforest, Dades © OpenStreetMap col·laboradors"
+                },
+                "name": "Thunderforest OpenCycleMap"
+            },
+            "tf-landscape": {
+                "attribution": {
+                    "text": "Mapes © Thunderforest, Dades © OpenStreetMap col·laboradors"
+                },
+                "name": "Thunderforest Landscape"
             }
         }
     }
index e0e7aa8f5c08df6f3c04aad4a2d27f06670623b5..ae938f51cb8590d1530acebcae777f4b3d9096c8 100644 (file)
             "localized_translation_language": "Zvolte jazyk",
             "localized_translation_name": "Název"
         },
+        "zoom_in_edit": "Pro editaci přibližte",
         "login": "přihlášení",
         "logout": "odhlásit",
         "loading_auth": "Připojování na OpenStreetMap…",
             "about_changeset_comments": "Více o komentářích ke změnám (anglicky)",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "V komentáře jste zmínil/a Google. Důrazně upozorňujeme, že kopírování z map Googlu je zakázáno.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Přispěli {users}",
                 "title": "Měřítko",
                 "selected": "{n} vybráno",
                 "geometry": "Geometrie",
-                "closed": "zavřeno",
                 "center": "Střed",
                 "perimeter": "Perimetr",
                 "length": "Délka",
                 "area": "Plocha",
+                "centroid": "Centroid",
                 "location": "Umístění",
                 "metric": "Metrické",
                 "imperial": "Imperiální"
             "title": "Pozadí",
             "description": "Nastavení pozadí",
             "key": "B",
-            "percent_brightness": "{opacity}% viditelnost",
             "none": "Žádné",
             "best_imagery": "Nejlepší známý zdroj podkladů pro toto místo",
             "switch": "Přepnout zpět na toto pozadí",
             "custom": "Vlastní",
             "custom_button": "Editovat vlastní pozadí",
-            "fix_misalignment": "Zarovnat podklad",
-            "imagery_source_faq": "Odkud jsou tyto podklady?",
             "reset": "vrátit na začátek",
-            "offset": "Vizuálně vyrovnejte posunutí podkladů v šedé oblasti tak, aby lícovaly s mapou. Nebo zadejte hodnotu posunu v metrech.",
             "minimap": {
-                "description": "Mapka",
                 "tooltip": "Zobrazit přehledovou mapku zobrazující aktuální výřez v širším okolí",
                 "key": "I"
-            }
+            },
+            "fix_misalignment": "Zarovnat podklad",
+            "offset": "Vizuálně vyrovnejte posunutí podkladů v šedé oblasti tak, aby lícovaly s mapou. Nebo zadejte hodnotu posunu v metrech."
         },
         "map_data": {
             "title": "Mapová data",
             },
             "fill_area": "Vyplnění ploch",
             "map_features": "Mapové prvky",
-            "autohidden": "Tyto prvky jsou nyní skryté, protože jinak by jich na mapě bylo zobrazeno příliš mnoho. Když mapu zvětšíte, můžete je zobrazit a editovat."
+            "autohidden": "Tyto prvky jsou nyní skryté, protože jinak by jich na mapě bylo zobrazeno příliš mnoho. Když mapu zvětšíte, můžete je zobrazit a editovat.",
+            "osmhidden": "Tyto objekty byly automaticky skryté, protože je skrytá vrstva OpenStreetMap."
         },
         "feature": {
             "points": {
             "untagged_area_tooltip": "Zvolte typ vlastnosti popisující, co je tato plocha zač.",
             "untagged_relation": "Neoznačená relace",
             "untagged_relation_tooltip": "Vyber typ prvku, který popisuje, čím je tato relace",
-            "many_deletions": "Snažíte se smazat {n} objektů. Jste si jisti, že to opravdu chcete udělat? Tím je smažete z mapy, která je pro každého zobrazena na stránce openstreetmap.org.",
             "tag_suggests_area": "Vlastnost {tag} obvykle označuje plochu, ale zvolený objekt není plocha",
             "deprecated_tags": "Zastaralé vlastnosti: {tag}"
         },
+        "zoom": {
+            "in": "Přibližte",
+            "out": "Oddalte"
+        },
         "cannot_zoom": "Aktuální nastavení nedovoluje větší zvětšení.",
         "full_screen": "Na celou obrazovku",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Zobrazit tento obrázek na Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Fotografie z úrovně ulice z OpenStreetCam",
+            "title": "Vrstva fotografií (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Zobrazit tento obrázek na OpenStreetCam"
+        },
         "help": {
             "title": "Nápověda",
             "key": "H",
-            "help": "# Pomoc\n\nToto je editor [OpenStreetMap](http://www.openstreetmap.org/), svobodné a otevřené mapy světa, vytvářené jako open-source a open-data. S pomocí editoru můžete přidávat a upravovat data v mapě třeba ve svém okolí, a zlepšovat tak celou mapu pro každého.\n\nVaše úpravy mapy budou viditelné pro každého uživatele OpenStreetMap. Před editací se ovšem musíte [přihlásit](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) je projekt vytvářený spoluprací mnoha lidí, se [zdrojovým kódem na GitHubu](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nData z GPS jsou jedním z důvěryhodných zdrojů informací pro OpenStreetMap. Tento editor podporuje zobrazení tras ve formátu `.gpx` nahraných z vašeho počítače. Takovou trasu můžete nasbírat s pomocí nejrůznějších aplikací pro mobily nebo s pomocí specializované navigace.\n\nPro více informací, jak provést takový sběr dat z GPS, viz např. návod anglicky: [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nPokud už máte záznam ve formátu GPX, přetáhněte soubor myší či prstem nad editor. Rozpozná-li editor formát souboru, zobrazí se trasa v mapě jako světle růžová čára. Pokud chcete tuto novou vrstvu zapnout, vypnout nebo zvětšit na velikost pracovní plochy, klikněte na menu 'Mapová data' na pravé straně.\n\nTrasa GPX nebude přímo nahrána na OpenStreetMap - pouze slouží jako vodítko, podle kterého se můžete orientovat, a podle kterého můžete kreslit nové objekty do mapy. Pokud chcete přímo trasu GPX poskytnout i ostatním, můžete ji [nahrát do samostatné databáze OpenStreetMap](http://www.openstreetmap.org/trace/create).\n",
-            "imagery": "# Podkladové snímky\n\nSatelitní a letecké snímky jsou důležitým zdrojem mapových dat. V menu 'Nastavení pozadí' na levé straně editoru je k dispozici kombinace leteckých snímků, satelitních snímků a dalších volně dostupných podkladů.\n\nImplicitní vrstvou jsou satelitní snímky [Bing](http://www.bing.com/maps/), ale jakmile se přesunete do konkrétní geografické oblasti a nastavíte dostatečné zvětšení, nabídnou se vám další mapové podklady. V některých státech, jako jsou Spojené státy, Francie či Dánskou, jsou k dispozici snímky ve vysoké kvalitě. Pro velkou část České republiky jsou také dostupné velmi detailní satelitní snímky. **Data z katastru nemovitostí a letecké mapy ÚHUL** je možné zobrazit dle [návodu zde](https://wiki.openstreetmap.org/wiki/WikiProject_Czech_Republic/freemap#WMS_UHUL_-_ortofotomapa).\n\nPodklady jsou někdy posunuté vůči mapě, kvůli chybám na straně poskytovatele snímků. Pokud uvidíte, že je mnoho cest v mapě posunuto vůči pozadí, nesnažte se je hned přesunout - posun obvykle znamená chybu v podkladu a ne chybu v mapě. V menu 'Nastavení pozadí' klikněte na 'Zarovnat pozadí' - to vám dovolí posunout podklad, aby lícoval s mapou.\n",
-            "addresses": "# Adresy\n\nJednou z nejužitečnějších součástí mapy jsou adresy.\n\nAdresy jsou sice někdy chápány jako označení kousku ulice, ale v OpenStreetMap jsou uloženy v budovách či objektech podél ulice. V České republice jsou adresy většinou samostatným uzlem uvnitř budovy.\n\nMůžete tedy data o adrese vkládat jak k samostatnému bodu, tak k ploše označující budovu.\nNejlepším zdrojem informací o adresách je průzkum přímo v terénu či jeho dobrá znalost - stejně jako u celého projektu OpenStreetMap je přebírání dat z komerčních zdrojů typu Google Maps přísně zakázáno.\n",
-            "inspector": "# Používání Inspektoru\n\nInspektor je prvek uživatelského rozhraní na levé straně, který umožňuje editovat vlastnosti zvoleného objektu.\n\n### Výběr typu objektu\n\nJakmile vytvoříte uzel, čáru nebo plochu, můžete zvolit typ vytvořeného objektu. Např. jestli jde o silnici nebo pěšinu, obchod nebo hospodu. Inspektor zobrazí tlačítka pro nejčastější typy objektů; další můžete najít prostřednictvím pole pro vyhledávání.\n\nKdyž u tlačítka typu objektu kliknete na 'i' vpravo dole, zobrazí se vám o něm více informací. Když kliknete na samotné tlačítko, vyberete příslušný typ.\n\n### Formuláře a editace vlastností\n\nPoté, co vyberete typ objektu nebo když vyberete objekt s už přiřazeným typem, v inspektoru se zobrazí pole s bližšími informacemi o objektu - jako třeba název nebo adresa.\n\nPod těmito poli jsou další ikony. Když na ně kliknete, tak můžete přidávat další detaily, jako vazbu na Wikipedii, přístup pro vozíčkáře atd.\n\nPokud chcete přidat k objektu ještě nějaké jiné vlastnosti, klikněte na 'Další vlastnosti' úplně dole. Jedním z informačních zdrojů pak může být [Taginfo](http://taginfo.openstreetmap.org/), kde se dozvíte o nejčastějších kombinacích tagů.\n\nZměny provedené v inspektoru jsou ihned vidět na mapě zobrazené ve vašem prohlížeči a po potvrzení je lze uložit na server. Pokud je chcete vrátit zpět, klikněte na tlačítko 'Undo'.\n"
+            "help": {
+                "title": "Nápověda",
+                "before_start_h": "Než začnete"
+            },
+            "overview": {
+                "title": "Přehled",
+                "navigation_h": "Navigace",
+                "features_h": "Mapové objekty"
+            },
+            "editing": {
+                "title": "Úpravy & ukládání",
+                "select_h": "Výběr",
+                "save_h": "Uložit",
+                "save": "Stiskněte{save} **Uložit** pro ukončení svých úprav a jejich nahrání na OpenStreetMap. Pamatujte na časté ukládání své práce!",
+                "save_validation": "Na obrazovce ukládání budete mít šanci prohlédnout si své úpravy. iD také provede některé základní kontroly ohledně chybějících informací a případně Vám může pomoci návrhy a varováními, pokud se něco nebude zdát v pořádku.",
+                "upload_h": "Nahrát"
+            }
         },
         "intro": {
             "done": "hotovo",
             },
             "areas": {
                 "title": "Plochy",
-                "add_playground": "*Plochy* používáme pro hranice budov, lesů, jezer apod.{br}\nOvšem také jimi můžeme detailně zakreslit prvky, které by normálně byly body.\n**Přidejte plochu tlačítkem {button} Plocha**",
                 "start_playground": "Pojďme přidat toto dětské hřiště. Plochu vytvoříte naklikáním bodů okolo.\n**Začněte kliknutím do rohu**",
                 "finish_playground": "Dokončete plochu kliknutím na první či poslední bod (též lze klávesou Enter).\n**Dokončete obrys hřšitě.**",
                 "search_playground": "**Vyhledejte '{preset}'.**",
                     "label": "Kapacita",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Směr",
-                    "options": {
-                        "E": "Východ",
-                        "ENE": "Východo-severovýchod",
-                        "ESE": "Východo-jihovýchod",
-                        "N": "Sever",
-                        "NE": "Severovýchod",
-                        "NNE": "Severo-severovýchod",
-                        "NNW": "Severo-severozápad",
-                        "NW": "Severozápad",
-                        "S": "Jih",
-                        "SE": "Jihovýchod",
-                        "SSE": "Jiho-jihovýchod",
-                        "SSW": "Jiho-jihozápad",
-                        "SW": "Jihozápad",
-                        "W": "Západ",
-                        "WNW": "Západo-severozápad",
-                        "WSW": "Západo-jihozápad"
-                    }
-                },
                 "castle_type": {
                     "label": "Typ"
                 },
-                "clock_direction": {
-                    "label": "Směr",
-                    "options": {
-                        "anticlockwise": "Proti směru hod. ručiček",
-                        "clockwise": "Po směru hod. ručiček"
-                    }
-                },
                 "clothes": {
                     "label": "Oblečení"
                 },
                 "memorial": {
                     "label": "Typ"
                 },
-                "milestone_position": {
-                    "label": "Pozice milníku",
-                    "placeholder": "Vzdálenost na jedno desetinné místo (123.4)"
-                },
                 "mtb/scale": {
                     "label": "Klasifikace obtížnosti pro MTB",
                     "options": {
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Směr",
-                    "options": {
-                        "backward": "Zpátky",
-                        "forward": "Dopředu"
-                    }
-                },
                 "park_ride": {
                     "label": "Parkoviště P+R"
                 },
                 "recycling_accepts": {
                     "label": "Určení"
                 },
-                "recycling_type": {
-                    "label": "Druh recyklace",
-                    "options": {
-                        "centre": "Recyklační centrum",
-                        "container": "Kontejner"
-                    }
-                },
                 "ref_road_number": {
                     "label": "Číslo silnice"
                 },
                     "terms": "lyžařský vlek,vlek,kotva,kotvička,lanový vlek"
                 },
                 "aerialway/station": {
-                    "name": "Stanice lanovky",
-                    "terms": "stanice lanovky,stanice lanové dráhy,zastávka lanovky,zastávka lanové dráhy"
+                    "name": "Stanice lanovky"
                 },
                 "aerialway/t-bar": {
                     "name": "Vlek - dvojmístná kotva",
                     "name": "Směnárna",
                     "terms": "směnárna,směna peněz,výměna peněz,exchange,valuty,valuta"
                 },
-                "amenity/bus_station": {
-                    "name": "Autobusové nádraží",
-                    "terms": "autobusové nádraží,autobusová stanice,autobusák,autobusové stanoviště,terminál"
-                },
                 "amenity/cafe": {
                     "name": "Kavárna",
                     "terms": "káva,kafe,kavárna,čaj,čajovna"
                     "name": "Rychlé občerstvení",
                     "terms": "rychlé občerstvení"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Přístaviště trajektu či přívozu",
-                    "terms": "trajekt,přívoz,ferry,terminál,přístav,přístaviště,kotviště,stanice"
-                },
                 "amenity/fire_station": {
                     "name": "Hasiči",
                     "terms": "požární stanice,hasičská stanice"
                     "name": "Návštěvnické centrum",
                     "terms": "návštěvnické centrum, návštěvní centrum"
                 },
-                "amenity/recycling": {
-                    "name": "Recyklační místo",
-                    "terms": "recyklace,kontejner,recyklační centrum,sběr,sběrna,sběrné suroviny,sběrna odpadu,sběr odpadu,odpad,odpadky,popelnice"
-                },
                 "amenity/recycling_centre": {
                     "name": "Recyklační centrum",
                     "terms": "recyklace,centrum,kontejner,láhev,plechovka,skládka,odpad,smetí,šrot"
                     "name": "Jezdecká stezka",
                     "terms": "jezdecká stezka,jezdecká trasa,stezka pro jezdce,stezka pro koně,koňská stezka"
                 },
-                "highway/bus_stop": {
-                    "name": "Autobusová zastávka",
-                    "terms": "zastávka autobusu"
-                },
                 "highway/corridor": {
                     "name": "Chodba",
                     "terms": "chodba,koridor"
                     "name": "Hospodářský les",
                     "terms": "les,hospodářský les"
                 },
-                "landuse/garages": {
-                    "name": "Plocha garáží",
-                    "terms": "garáže,garáž,parkování,parkoviště"
-                },
                 "landuse/grass": {
                     "name": "Tráva",
                     "terms": "tráva"
                     "terms": "kancelář,kancelářský,úřad,úřadovna,administrativa,office,sídlo"
                 },
                 "office/administrative": {
-                    "name": "Místní úřad",
-                    "terms": "místní úřad,městský úřad,krajský úřad,kancelář,administrativa,samospráva"
-                },
-                "office/company": {
-                    "name": "Kancelář",
-                    "terms": "kancelář,firma,společnost,soukromá firma,soukromá společnost,sídlo,s.r.o."
+                    "name": "Místní úřad"
                 },
                 "office/coworking": {
                     "name": "Místo pro spolupráci",
                     "terms": "právní kancelář,právník,právní zástupce,advokátní kancelář,advokát"
                 },
                 "office/lawyer/notary": {
-                    "name": "Kancelář notáře",
-                    "terms": "koncipient,podpis,závěť,listina,pozemek,pozemky"
+                    "name": "Kancelář notáře"
                 },
                 "office/ngo": {
                     "name": "Nezisková organizace",
                     "name": "Transformátor",
                     "terms": "transformátor,transformátorová stanice,elektrická stanice,adaptér"
                 },
-                "public_transport/platform": {
-                    "name": "Nástupiště",
-                    "terms": "nástupiště,nástupní plocha,platforma,nástupní ostrůvek,zastávkový mys,molo"
-                },
-                "public_transport/stop_position": {
-                    "name": "Místo zastavení",
-                    "terms": "stání,zastávka,stanice,pozice,pozice stání,poloha,poloha stání"
-                },
                 "railway": {
                     "name": "Železnice"
                 },
                     "name": "Lanová dráha",
                     "terms": "lanovka"
                 },
-                "railway/halt": {
-                    "name": "Železniční zastávka",
-                    "terms": "železniční zastávka, železniční stanice, vlaková zastávka, vlaková stanice, nádraží, železniční nástupiště, vlakové nástupiště"
-                },
                 "railway/level_crossing": {
                     "name": "Železniční přejezd (přes silnici)",
                     "terms": "přejezd,přechod,železnice,železniční přejezd,železniční přechod"
                     "name": "Úzkorozchodná dráha",
                     "terms": "úzkorozchodná dráha,úzkokolejná dráha,úzkokolejka"
                 },
-                "railway/platform": {
-                    "name": "Železniční nástupiště",
-                    "terms": "železniční nástupiště, nástupiště"
-                },
                 "railway/rail": {
                     "name": "Kolej",
                     "terms": "koleje,železnice,vlak,trať"
                 },
-                "railway/station": {
-                    "name": "Železniční stanice",
-                    "terms": "stanice,železniční stanice,zastávka,železniční zastávka,nádraží,vlak"
-                },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "metro"
                     "name": "Tramvaj",
                     "terms": "tramvaj,tranvaj,šalina,šmirgl,tramvajka,elektrika,električka,tram"
                 },
-                "railway/tram_stop": {
-                    "name": "Tramvajová zastávka",
-                    "terms": "rychlodráha,tramvaj,trolej"
-                },
                 "relation": {
                     "name": "Relace",
                     "terms": "relace,vztah,seznam,objekt"
                     "name": "Klenotnictví",
                     "terms": "zlatnictví,šperky,klenotník,klenoty,klenotnictví,bižutérie,náramky,náušnice,prsteny"
                 },
-                "shop/kiosk": {
-                    "name": "Kiosek",
-                    "terms": "kiosek,stánek,smíšené zboží,tabák,noviny"
-                },
                 "shop/kitchen": {
                     "name": "Kuchyňské studio",
                     "terms": "kuchyně,kuchyňský,kuchyňské linky,kuchyně na míru"
                 },
                 "name": "OSM Inspektor: Štítkování"
             },
-            "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmannová, CC by-SA 3.0, mapová data přispěvatelé OpenStreetMap, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmannová, CC by-SA 3.0, mapová data přispěvatelé OpenStreetMap, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmannová, CC by-SA 3.0, mapová data přispěvatelé OpenStreetMap, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmannová, CC by-SA 3.0, mapová data přispěvatelé OpenStreetMap, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, mapová data přispěvatelé OpenStreetMap, ODbL 1.0"
-                }
-            },
             "basemap.at": {
                 "attribution": {
                     "text": "basemap.at"
diff --git a/vendor/assets/iD/iD/locales/cy.json b/vendor/assets/iD/iD/locales/cy.json
new file mode 100644 (file)
index 0000000..037275e
--- /dev/null
@@ -0,0 +1,151 @@
+{
+    "cy": {
+        "modes": {
+            "add_area": {
+                "title": "Ardal",
+                "description": "Ychwanegu parciau, adeiladau, llynnoedd neu ardaloedd eraill i'r map.",
+                "tail": "Cliciwch ar y map i ddechrau llunio ardal, fel parc, llyn, neu adeilad."
+            },
+            "add_line": {
+                "title": "Llinell",
+                "description": "Ychwanegu prif-ffyrdd, strydoedd, llwybrau troed, camlas, neu llinelloedd eraill i'r map.",
+                "tail": "Cliciwch ar y map i ddechrau llunio ffordd neu llwybr."
+            },
+            "add_point": {
+                "title": "Pwynt",
+                "description": "Ychwanegu bwytai, henebion, blychau post neu pwyntiau eraill i'r map.",
+                "tail": "Cliciwch ar y map i ychwanegu pwynt."
+            },
+            "browse": {
+                "title": "Pori"
+            }
+        },
+        "operations": {
+            "add": {
+                "annotation": {
+                    "point": "Wedi ychwanegu pwynt."
+                }
+            },
+            "start": {
+                "annotation": {
+                    "line": "Wedi dechrau llinell.",
+                    "area": "Wedi dechrau ardal."
+                }
+            },
+            "straighten": {
+                "title": "Sythu",
+                "description": "Sythu'r llinell yma",
+                "annotation": "Wedi sythu llinell."
+            },
+            "delete": {
+                "title": "Dileu",
+                "annotation": {
+                    "point": "Wedi dileu pwynt.",
+                    "line": "Wedi dileu llinell.",
+                    "area": "Wedi dileu ardal."
+                }
+            },
+            "disconnect": {
+                "title": "Dad-gysylltu",
+                "description": "Dad-gysylltu'r llinelloedd/ardaloedd yma o'u gilydd.",
+                "annotation": "Llinelloedd/ardaloedd wedi'u ddad-gysylltu."
+            },
+            "move": {
+                "title": "Symyd",
+                "annotation": {
+                    "point": "Wedi symyd pwynt.",
+                    "line": "Wedi symyd llinell.",
+                    "area": "Wedi symyd ardal."
+                }
+            }
+        },
+        "success": {
+            "help_link_text": "Manylion"
+        },
+        "tag_reference": {
+            "description": "Disgrifiad"
+        },
+        "shortcuts": {
+            "editing": {
+                "commands": {
+                    "undo": "Dad-wneud gweithred diwethaf",
+                    "redo": "Ail-wneud gweithred diwethaf",
+                    "save": "Cadw newidiadau"
+                }
+            },
+            "tools": {
+                "title": "Teclynnau",
+                "info": {
+                    "title": "Gwybodaeth"
+                }
+            }
+        },
+        "units": {
+            "north": "G",
+            "south": "D",
+            "east": "Dw",
+            "west": "Gr"
+        },
+        "presets": {
+            "categories": {
+                "category-barrier": {
+                    "name": "Nodweddion Rhwystr"
+                },
+                "category-building": {
+                    "name": "Nodweddion Adeilad"
+                },
+                "category-golf": {
+                    "name": "Nodweddion Golff"
+                },
+                "category-landuse": {
+                    "name": "Nodweddion Defnydd Tir"
+                },
+                "category-natural-area": {
+                    "name": "Nodweddion Naturiol"
+                },
+                "category-natural-line": {
+                    "name": "Nodweddion Naturiol"
+                },
+                "category-natural-point": {
+                    "name": "Nodweddion Naturiol"
+                },
+                "category-path": {
+                    "name": "Nodweddion Llwybr"
+                },
+                "category-rail": {
+                    "name": "Nodweddion Rheilffordd"
+                },
+                "category-restriction": {
+                    "name": "Nodweddion Cyfyngiad"
+                },
+                "category-road": {
+                    "name": "Nodweddion Ffordd"
+                },
+                "category-water-area": {
+                    "name": "Nodweddion Dŵr"
+                },
+                "category-water-line": {
+                    "name": "Nodweddion Dŵr"
+                }
+            },
+            "fields": {
+                "access": {
+                    "label": "Yn Caniatau Mynediad",
+                    "options": {
+                        "designated": {
+                            "description": "Yn caniatau mynediad yn ôl arwyddion neu is-ddeddfau lleol",
+                            "title": "Dynodedig"
+                        },
+                        "destination": {
+                            "description": "Yn caniatau mynediad ond i gyrraedd cyrchfan",
+                            "title": "Cyrchfan"
+                        },
+                        "no": {
+                            "description": "Dim caniatad mynediad i'r cyhoedd"
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index 267df5857ea49402727d0bfadaff2dc3b52079ca..e444b3a4144685f3d94c31fadd4bedfc9c4626ff 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Klik for at tilføje flere punkter til linjen. Klik på andre linjer for at forbinde til dem og dobbeltklik for at afslutte linjen."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Kan ikke redigeres da den er forbundet til et skjult kortobjekt."
             }
         },
         "operations": {
             "about_changeset_comments": "Vedr. ændringssætkommentarer",
             "about_changeset_comments_link": "http://wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Du nævnte Google i denne kommentar: husk at kopiering fra Google Maps er strengt forbudt.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Redigeringer af {users}",
                 "title": "Målinger",
                 "selected": "{n} markeret",
                 "geometry": "Geometri",
-                "closed": "lukket",
+                "closed_line": "lukket linje",
+                "closed_area": "lukket område",
                 "center": "Centrum",
                 "perimeter": "Omkreds",
                 "length": "Længde",
                 "centroid": "Geometrisk centrum",
                 "location": "Lokation",
                 "metric": "Metrisk",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Antal noder"
             }
         },
         "geometry": {
             "title": "Baggrund",
             "description": "Baggrundsindstillinger",
             "key": "B",
-            "percent_brightness": "{opacity} % lysstyrke",
+            "backgrounds": "Baggrunde",
             "none": "Ingen",
             "best_imagery": "Bedst kendte luftfotokilde for denne her lokalitet",
             "switch": "Skift tilbage til denne baggrund",
             "custom": "Brugerdefineret",
             "custom_button": "Rediger brugerdefineret baggrund",
-            "custom_prompt": "Indtast en URL-skabelon for kort-fliser. Gyldige formater er:\n   - {zoom}/{z}, {x}, {y} til Z/X/Y flise-skemaer\n   - {ty} til omvendte Y-koordinater i TMS-stil\n   - {u} til quad-flise-skemaer\n   - {switch:a,b,c} til multipleksning af DNS-server\n\nEksempel:\n{example}",
-            "fix_misalignment": "Juster billedets offset",
-            "imagery_source_faq": "Hvem er ophavsmand til luftfotoet?",
+            "custom_prompt": "Indtast en URL-skabelon for kort-fliser. Gyldige formater er:\n   - {zoom} eller {z}, {x}, {y} for Z/X/Y flise-skemaer\n   - {-y} eller {ty} for omvendte Y-koordinater i TMS-stil\n   - {u} for quad-flise-skemaer\n   - {switch:a,b,c} for multipleksning af DNS-opslag\n\nEksempel:\n{example}",
+            "overlays": "Overlægninger",
+            "imagery_source_faq": "Information / rapportér problem angående luftfoto",
             "reset": "nulstil",
-            "offset": "Træk et hvert sted i det grå område nedenfor for at justere billedets offset eller indtast offset-værdien i meter.",
+            "display_options": "Visningsindstillinger",
+            "brightness": "Lysstyrke",
+            "contrast": "Kontrast",
+            "saturation": "Mætning",
+            "sharpness": "Skarphed",
             "minimap": {
-                "description": "Minikort",
+                "description": "Vis minikort",
                 "tooltip": "Vis et udzommet kort for at hjælpe med at lokalisere det viste område.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Juster luftfoto-offset",
+            "offset": "Træk et vilkårligt i det grå område nedenfor for at justere luftfotoets offset eller indtast offset-værdien i meter."
         },
         "map_data": {
             "title": "Kortdata",
         "area_fill": {
             "wireframe": {
                 "description": "Ingen fyld (trådnet)",
-                "tooltip": "At slå visning med trådnet til gør det let at se baggrundsbilledet.",
+                "tooltip": "Aktivering af trådnetsvisning tydeliggør luftfotoet i baggrunden.",
                 "key": "W"
             },
             "partial": {
             "status_code": "Serveren returnerede følgende statuskode {code}",
             "unknown_error_details": "Kontrollér om du har forbindelse til internettet.",
             "uploading": "Uploader ændringer til OpenStreetMap...",
+            "conflict_progress": "Kontrollerer konflikter: {num} ud af {total}",
             "unsaved_changes": "Du har ændringer, der endnu ikke er gemt",
             "conflict": {
                 "header": "Løs konfliktredigeringer",
             "untagged_area_tooltip": "Vælg en objekttype der beskriver hvad slags område dette er.",
             "untagged_relation": "Ej tagget relation",
             "untagged_relation_tooltip": "Vælg en objekttype der beskriver hvad slags relation dette er.",
-            "many_deletions": "Du er ved at slette {n} objekter. Er du sikker på du vil dette? Dette vil slette dem fra kortet som alle andre ser på openstreetmap.org.",
             "tag_suggests_area": "Tagget {tag} antyder at linjen skulle være et område, men den er ikke et område",
             "deprecated_tags": "Frarådede tags: {tags}"
         },
             "browse": "Gennemse efter en fil"
         },
         "mapillary_images": {
-            "tooltip": "Gadeniveau billeder fra Mapillary",
-            "title": "Billedelag (Mapillary)"
+            "tooltip": "Gadeniveau-billeder fra Mapillary",
+            "title": "Fotooverlægning (Mapillary)"
         },
         "mapillary_signs": {
-            "tooltip": "Trafikskilte fra Mapillary (fotolag skal være slået til)",
-            "title": "Trafikskiltelag (Mapillary)"
+            "tooltip": "Trafikskilte fra Mapillary (fotooverlægning skal være slået til)",
+            "title": "Trafikskilteoverlægning (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Vis dette billede på Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Gadeniveau-billeder fra OpenStreetCam",
+            "title": "Fotooverlægning (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Vis dette billede på OpenStreetCam"
+        },
         "help": {
             "title": "Hjælp",
             "key": "H",
-            "help": "# Hjælp\n\nDette er et redigeringsværktøj til [OpenStreetMap](http://www.openstreetmap.org/), det åbne og redigerbare verdenskort. Du kan bruge dette værktøj til at opdatere geodata i dit lokalområde. Derved skaber du et bedre verdenskort med open source og frie geodata til gavn for alle.\n\nDine ændringer på kortet vil blive synligt for alle og enhver der benytter OpenStreetMap. For at lave redigeringer skal du være [logget ind](https://www.openstreetmap.org/login).\n\nDette værktøj, kaldet [iD-editoren](http://ideditor.com/), er et kollaborativt projekt og dets [kildekode er tilgængelig på GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Redigering & gemning\n\nDette redigeringsværktøj er primært beregnet til online brug, ligesom\ndu bruger det lige nu gennem en webside.\n\n### Markering af objekter\n\nFor at markere et kortobjekt f.eks. en vej eller et interessepunkt, klik\npå dette på kortet. Dette vil tydeligt markere objektet, og åbne et panel\nmed flere oplysninger om det. Højreklikker du på det, vil en menu vises med handlinger der kan foretages på objektet.\n\nFor at markere flere objekter på en gang, skal 'Skift\"-knappen holdes nede. Dernæst enten klik direkte\npå objekterne du vil markere, eller venstre-klik og træk med musen på kortet, hvilket markerer\nalle objekter indenfor rammen du tegner.\n\n### Gem redigeringer\n\nNår du laver ændringer f.eks. redigering af veje, bygninger og steder, så\ngemmes disse lokalt i din browser indtil du gemmer dem på serveren. Vær ikke bange for\nat lave en fejl - du kan fortryde ved at klikke på fortryd-knappen, og\nfå fortrudte ændringer tilbage med gendan-knappen.\n\nKlik på 'Gem' for at afslutte en serie af redigeringer - f.eks. hvis du har afsluttet\net område af en by og vil starte på et nyt område. Du vil få lejlighed\ntil at gennemse hvad du har lavet, og redigeringsværktøjet vil give forslag\nog advarsler hvis noget ikke ser korrekt ud.\n\nHvis alting ser fint ud, kan du tilføje en kort kommentar der forklarer\nændringerne du har lavet, og dernæst klikker du 'Upload' for at afsende ændringerne\ntil [OpenStreetMap.org](http://www.openstreetmap.org/), hvor de vil blive synlige\nfor alle andre brugere og tilgængelige for andre at bygge videre på.\n\nHvis du ikke kan nå at afslutte dine redigeringer, så kan du forlade redigeringsværktøjet\nog komme tilbage (på samme browser og computer) og redigeringsværktøjet\nvil tilbyde at gendanne dit arbejde.\n\n### Brug af redigeringsværktøjet\n\nDu kan hurtigt få vist en liste over genvejstaster ved at trykke på `?`-tasten.\n",
-            "roads": "# Veje\n\nDu kan oprette, tilrette og slette veje med dette tegneværktøj. Veje kan være af\nmange forskellige typer: stier, landeveje, spor, cykelstier m.v. Enhver\nofte benyttet rute kan kortlægges.\n\n### Markering\n\nKlik på en vej for at markere den. Et omrids vises\nsammen med et sidepanel der viser flere oplysninger om vejen. Hvis du højreklikker\npå den, får du vist en værktøjsmenu med handlinger du kan udføre på vejen.\n\n### Ændring\n\nOfte ses veje der ikke er justeret i forhold til luftfotoet bag dem\neller i forhold til et GPS-spor. Du kan justere disse veje så de er placeret rigtigt.\nKlik først på vejen du vil ændre. Dette fremhæver den og viser\nkontrolpunkter langs med den som kan trækkes det rigtige sted hen. Hvis\ndu har brug for flere kontrolpunkter for at gøre vejen mere detaljeret, kan du dobbeltklikke\npå en del af vejen, så tilføjes et nyt punkt her.\n\nHvis vejen er forbundet til andre veje, men ikke er korrekt forbundet\npå kortet, så træk et af kontrolpunkterne hen på den anden vej\nfor at koble dem sammen. Det er vigtigt for kortet, faktisk vitalt for rutevejledninger,\nat veje er forbundet.\n\nDu kan også højreklikke og vælge flytteværktøjet eller bare trykke\npå tastegenvejen \"M\" for at flytte hele vejen på en gang, og så klikke\nigen for at gemme flytningen.\n\n### Sletning\n\nHvis en vej er helt forkert - du kan ikke se den på et luftfoto\nog du har ideelt set fået bekræftet at vejen reelt ikke findes - så kan du slette\nvejen. Men pas på med at slette hvad andre har lavet - som med andre ændringer\ner resultatet synligt for alle, og luftfotos kan være forældede så vejen kunne\nvære bygget i mellemtiden.\n\nDu kan slette en vej ved at klikke på den for at vælge den og trykke på 'Slet'-tasten på dit tastatur, eller højreklikke og vælge skraldespands-ikonet.\n\n### Oprettelse\n\nHar du fundet et sted hvor der skulle være en vej, men den er ikke på kortet? Klik på 'Linje'-ikonet\ni øverste venstre hjørne af redigeringsværktøjet, eller klik på tastegenvejen '2' for at starte ned at tegne en linje.\n\nKlik hvor vejen begynder på luftfotoet for at påbegynde den. Hvis vejen\nforgrener sig fra en eksisterende vej, så begynd vejen der hvor de er forbundet.\n\nKlik derefter på punkter langs vejens forløb så det passer med\nluftfoto eller GPS-spor. Hvis vejen du tegner krydser en anden vej, så kobl\ndem sammen ved at klikke på punktet hvor de skærer hinanden. Når du er færdig med at tegne,\nså dobbeltklik eller tryk på 'Retur' eller 'Enter'-tasten på tastaturet.\n",
-            "gps": "# GPS\n\nIndsamlede GPS-spor er en værdifuld kilde til data for OpenStreetMap. Denne editor understøtter lokale spor – '.gpx'-filer på din lokale computer. Du kan indsamle denne form for GPS-spor med en række smartphone-applikationer såvel som personlige GPS-enheder.\n\nLæs artiklen [Mapping with a Smartphone, GPS or Paper](http://learnosm.org/en/mobile-mapping/) (på engelsk) for nærmere information om, hvordan du optager et GPS-spor.\n\nFor at bruge et GPX-spor til kortlægning, skal du trække og slippe  GPX-filen over på kort-editoren. Hvis sporet bliver accepteret, vil det blive tilføjet kortet som en lys lilla linje. Klik på \"Kortdata\"-menuen til højre for at aktivere, deaktivere eller zoome til dette nye GPX-drevne lag.\n\nGPX-sporet bliver ikke direkte uploadet til OpenStreetMap, men vises kun i den nuværende redigeringssession i iD. Den bedste måde at bruge sporet på, er at tegne på kortet mens du bruger sporet som en rettesnor til de nye objekter,\ndu tilføjer. {Upload det også gerne til OpenStreetMap](http://www.openstreetmap.org/trace/create), så andre brugere kan bruge det.\n",
-            "imagery": "# Billeder\n\nLuftfotos er en vigtig ressource til kortlægning. En kombination af luftfotos taget fra fly, satellitbilleder og andre frit tilgængelige kilder er tilgængelige i redigeringsværktøjet i indstillingsmenuen 'Baggrund' i højre side.\n\n[Bing Maps](http://www.bing.com/maps/) satellitbilledelaget er standardopsætning i redigeringsværktøjet. Når du zoomer og kommer til nye geografiske områder, så vil andre kilder være tilgængelige. I nogle lande som f.eks. USA, Frankrig og Danmark vil der ofte være luftfotos i høj kvalitet i nogle egne.\n\nBillederne er af og til forskudt i forhold til de geografiske data, dette skyldes en fejl fra billedleverandørens side. Hvis du ser at en masse objekter er forskudt i forhold til billederne, så skal du ikke begynde at flytte disse objekter for at matche billedlaget. Du kan i stedet for i indstillingerne for 'Baggrund', nederst finde \"Juster billedets offset\" hvor billedets generelle placering i forhold til de geografisk objekter kan tilpasses.\n",
-            "addresses": "#Adresser\n\nAdresser er noget af det mest brugbare information på kortet.\n\nSelvom adresser ofte repræsenteres som et specifikt udsnit af veje, er de i OpenStreetMap registreret som attributter på bygninger eller andre objekter langs med veje.\n\nDu kan tilføje adresseinformation til steder som er kortlagt som bygninger\neller som enkeltpunkter. Den optimale kilde til adressedata stammer fra\nindsamling på selve stedet eller fra personligt kendskab. Som med mange\nandre objekter, så er det strengt forbudt at kopiere fra kommercielle kilder\nsom f.eks. fra Google Maps.\n",
-            "inspector": "# Brug af inspektøren\n\nInspektøren er området til venstre på siden, hvor du kan redigere detaljerne for det markerede objekt.\n\n### Valg af objekttype\n\nNår du har tilføjet et punkt, en linje eller område, kan du vælge, hvilken type objekt det er, f.eks. om det er en motorvej eller villavej, supermarked eller café. Inspektøren vil vise knapper for gængse objekttyper, og du kan finde andre ved at skrive, hvad du leder efter, i søgefeltet.\n\nKlik på i'et i nederste højre hjørne af en objekttypeknap for at lære mere om den pågældende objekttype. Klik på selve knappen for at vælge denne type.\n\n### Formularer og redigering af tags\n\nNår du vælger en objekttype, eller når du vælger et objekt, der allerede har en type tilknyttet, vil inspektøren vise felter med detaljer om objektet, såsom dets navn og adresse.\n\nNedenfor de felter, du kan se, kan du klikke på \"Tilføj felt\" for at tilføje andre detaljer, såsom et Wikipedia-link, oplysninger om adgang for kørestole og meget mere.\n\nI bunden af ​​inspektøren kan du klikke på 'Alle tags' for at tilføje vilkårlige andre tags til elementet. [Taginfo](http://taginfo.openstreetmap.org/) er et godt sted at lære mere om populære kombinationer af tags.\n\nÆndringer, du foretager i inspektøren, bliver automatisk anvendt på kortet. Du kan fortryde dem når som helst ved at klikke på knappen 'Fortryd'.\n"
+            "help": {
+                "title": "Hjælp",
+                "welcome": "Velkommen til iD - et redigeringsværktøj til [OpenStreetMap](https://www.openstreetmap.org/). Med dette værktøj kan du opdatere OpenStreetMap direkte fra din web-browser.",
+                "open_data_h": "Open Data",
+                "open_data": "Ændringer du laver i dette kort vil være synlige for alle der anvender OpenStreetMap. Dine redigeringer kan basere sig på personligt kendskab, opmåling og udforskning på stedet eller fotos fra luften eller gadeniveau. Kopiering fra enhver kommerciel kilde, såsom Google Maps, er [strengt forbudt](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Før du starter",
+                "before_start": "Du bør gøre dig bekendt med OpenStreetMap og dette redigeringsværktøj før du begynder med egentlig redigering af kortet. iD indeholder en såkaldt Gennemgang som lærer dig de basale ting omkring redigering af OpenStreetMap. Klik på \"Start Gennemgang\" på denne side for at starte vejledningen - det tager kun omkring et kvarter.",
+                "open_source_h": "Open Source - Åben kildekode",
+                "open_source": "Dette iD-redigeringsværktøj udvikles i et fællesskabsdrevet open source-projekt og du anvender lige nu version {version}. Kildekoden er tilgængelig [på GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Du kan hjælpe iD ved at [oversætte](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) eller [rapportere fejl](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Overblik",
+                "navigation_h": "Navigation",
+                "features_h": "Kortobjekter",
+                "features": "Vi bruger ordet *kortobjekt* til at beskrive ting der optræder på kortet såsom veje, bygninger, eller interessepunkter. Enhver fysisk ting i den virkelige verden kan indtegnes som et kortobjekt på OpenStreetMap. Kortobjekter repræsenteres på kortet som *punkter*, *linjer* eller *områder*.",
+                "nodes_ways": "I OpenStreetMap kaldes punkter sommetider *noder*, og linjer og områder sommetider *veje*."
+            },
+            "editing": {
+                "title": "Rediger & gem",
+                "select_h": "Vælg",
+                "save_h": "Gem"
+            },
+            "imagery": {
+                "title": "Luftfoto i baggrunden",
+                "intro": "Luftfotoet der vises i baggrunden bagved kortet er en vigtig ressource under redigering af kortet. Dette kan bestå af ortografiske fotos opsamlet fra satellitter, fly eller droner, eller det kan være indskannede historiske kort eller andre frit tilgængelige kildedata.",
+                "sources_h": "Luftfoto-kilder",
+                "choosing": "For at se hvilke kilder til luftfoto der er tilgængelige i området, skal du klikke på knappen {layers} **Baggrundsindstillinger** i kortets side.",
+                "sources": "Som standard vises et satellit-lag fra [Bing Maps](https://www.bing.com/maps/) som baggrundsbillede. Afhængigt af hvor i verden du redigerer, kan der være andre luftfoto-kilder tilgængelige. Nogle kan være af nyere dato eller have højere opløsning end Bing, så det er altid smart at se efter hvilket lag der er bedst at bruge til at redigere kortet ud fra.",
+                "offsets_h": "Justering af luftfoto-offset",
+                "offset": "Den registrerede position for et luftfoto er nogle gange ikke helt korrekt i forhold til kortet. Hvis du ser at bygninger og veje generelt er forskudt mellem kort og luftfoto, kan det være luftfotoet der er unøjagtigt, så i stedet for at flytte alle kortobjekter kan du justere baggrunden så den er samstemmende med kortets data ved at åbne \"Juster luftfoto-offset\" i bunden af Baggrundsindstillinger-fanen.",
+                "offset_change": "Klik på de små trekanter for at justere offset i små intervaller, eller hold venstre musetast nede og træk indenfor den grå firkant for at trække luftfotoet på plads."
+            }
         },
         "intro": {
             "done": "færdig",
             },
             "areas": {
                 "title": "Områder",
-                "add_playground": "*Områder* bruges til at vise omridset af objekter som søer, bygninger og boligområder. {br}De kan også bruges til mere detaljeret kortlægning af mange af de objekter som man ellers normalt ville bruge punkter til. **Tilføj et ny område ved at klikke på {button} Område-knappen.**",
                 "start_playground": "Lad os tilføje denne legeplads til kortet ved at optegne et område. Områder tegnes ved at placere *noder* langs objektets ydre kant. **Klik eller tast mellemrum for at placere den første node i et at legepladsens hjørner.**",
                 "continue_playground": "Fortsæt med at optegne området ved at placere flere noder langs legepladsens kant. Det er fint at forbinde området til de eksisterende stier.{br}Tip: Hvis du holder '{alt}'-knappen ned forbindes noden ikke til andre objekter. **Fortsæt med at optegne legepladsens område.**",
                 "finish_playground": "Afslut området ved at taste retur, eller klikke igen på enten den første eller den sidste node. **Afslut optegningen af legepladsens område.**",
                     "title": "Markering af kortobjekter",
                     "select_one": "Marker et enkelt kortobjekt",
                     "select_multi": "Marker flere kortobjekter",
-                    "lasso": "Tegn en markerings-lasso om kortobjekter"
+                    "lasso": "Tegn en markerings-lasso om kortobjekter",
+                    "search": "Find kortobjekter der indeholder tekst"
                 },
                 "with_selected": {
                     "title": "Ved markeret kortobjekt",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} fod",
+            "miles": "{quantity} mil",
+            "square_feet": "{quantity} kvadratfod",
+            "square_miles": "{quantity} kvadratmil",
+            "acres": "{quantity} ager",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "Ø",
+            "west": "V",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                         "subdistrict": "Kvarter",
                         "subdistrict!vn": "Afdeling/Kommune/Townlet",
                         "suburb": "Forstad",
-                        "suburb!jp": "Afdeling"
+                        "suburb!jp": "Afdeling",
+                        "unit": "Enhed"
                     }
                 },
                 "admin_level": {
                 "bunker_type": {
                     "label": "Type"
                 },
+                "cables": {
+                    "label": "Kabler",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "Retning (grader i urets retning)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "Kapacitet",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "E": "Øst",
-                        "ENE": "Øst-nordøst",
-                        "ESE": "Øst-sydøst",
-                        "N": "Nord",
-                        "NE": "Nordøst",
-                        "NNE": "Nord-nordøst",
-                        "NNW": "Nord-nordvest",
-                        "NW": "Nordvest",
-                        "S": "Syd",
-                        "SE": "Sydøst",
-                        "SSE": "Syd-sydøst",
-                        "SSW": "Syd-sydvest",
-                        "SW": "Sydvest",
-                        "W": "Vest",
-                        "WNW": "Vest-nordvest",
-                        "WSW": "Vest-sydvest"
-                    }
-                },
                 "castle_type": {
                     "label": "Type"
                 },
-                "clock_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "anticlockwise": "Mod uret",
-                        "clockwise": "Med uret"
-                    }
-                },
                 "clothes": {
                     "label": "Beklædning"
                 },
                 "craft": {
                     "label": "Type"
                 },
+                "crane/type": {
+                    "label": "Krantype",
+                    "options": {
+                        "floor-mounted_crane": "Gulvmonteret kran",
+                        "portal_crane": "Portalkran"
+                    }
+                },
                 "crop": {
                     "label": "Afgrøder"
                 },
                 "description": {
                     "label": "Beskrivelse"
                 },
+                "devices": {
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "Babybleskifte"
                 },
+                "direction_cardinal": {
+                    "label": "Retning",
+                    "options": {
+                        "E": "Øst",
+                        "ENE": "Øst-nordøst",
+                        "ESE": "Øst-sydøst",
+                        "N": "Nord",
+                        "NE": "Nordøst",
+                        "NNE": "Nord-nordøst",
+                        "NNW": "Nord-nordvest",
+                        "NW": "Nordvest",
+                        "S": "Syd",
+                        "SE": "Sydøst",
+                        "SSE": "Syd-sydøst",
+                        "SSW": "Syd-sydvest",
+                        "SW": "Sydvest",
+                        "W": "Vest",
+                        "WNW": "Vest-nordvest",
+                        "WSW": "Vest-sydvest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Retning",
+                    "options": {
+                        "anticlockwise": "Mod uret",
+                        "clockwise": "Med uret"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Retning",
+                    "options": {
+                        "backward": "Baglæns",
+                        "forward": "Forlæns"
+                    }
+                },
                 "display": {
                     "label": "Display"
                 },
                         "wall": "Mur"
                     }
                 },
+                "fitness_station": {
+                    "label": "Udstyrstype"
+                },
                 "fixme": {
                     "label": "Ret mig"
                 },
                     "label": "Type",
                     "placeholder": "Standard"
                 },
+                "frequency": {
+                    "label": "Operationel frekvens"
+                },
                 "fuel": {
                     "label": "Brændstof"
                 },
                 "generator/type": {
                     "label": "Type"
                 },
+                "government": {
+                    "label": "Type"
+                },
                 "grape_variety": {
                     "label": "Vinsorteliste"
                 },
                     "label": "Gelænder"
                 },
                 "hashtags": {
+                    "label": "Foreslåede hashtags",
                     "placeholder": "#eksempel"
                 },
+                "healthcare": {
+                    "label": "Type"
+                },
+                "healthcare/speciality": {
+                    "label": "Specialer"
+                },
                 "height": {
                     "label": "Højde (meter)"
                 },
                 "inscription": {
                     "label": "Inskription"
                 },
+                "intermittent": {
+                    "label": "Sporadisk"
+                },
                 "internet_access": {
                     "label": "Internetadgang",
                     "options": {
                 "maxweight": {
                     "label": "Maksimalvægt"
                 },
-                "milestone_position": {
-                    "label": "Milepæl",
-                    "placeholder": "Distance med en decimal (123.4)"
+                "memorial": {
+                    "label": "Type"
                 },
                 "mtb/scale": {
                     "label": "Sværhedsgrad for mountainbike",
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "backward": "Tilbage",
-                        "forward": "Forlæns"
-                    }
-                },
                 "park_ride": {
                     "label": "Park and ride-anlæg"
                 },
                 "recycling_accepts": {
                     "label": "Accepterer"
                 },
-                "recycling_type": {
-                    "label": "Genbrugstype",
-                    "options": {
-                        "centre": "Genbrugsplads",
-                        "container": "Container"
-                    }
-                },
                 "ref": {
                     "label": "Referencekode"
                 },
                     "terms": "Tovlift"
                 },
                 "aerialway/station": {
-                    "name": "Skiliftstation",
-                    "terms": "Skiliftstation"
+                    "name": "Skiliftstation"
                 },
                 "aerialway/t-bar": {
                     "name": "Træklift",
                     "name": "Valutaveksling",
                     "terms": "Valutaveksling"
                 },
-                "amenity/bus_station": {
-                    "name": "Busstation",
-                    "terms": "Busstation, Rutebilstation"
-                },
                 "amenity/cafe": {
                     "name": "Cafe",
                     "terms": "Cafe, Café"
                     "name": "Fast food",
                     "terms": "Fastfood, Grillbar, Pølsevogn"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Færgeterminal",
-                    "terms": "Færgeterminal, Færgekaj"
-                },
                 "amenity/fire_station": {
                     "name": "Brandstation",
                     "terms": "<oversæt med synonymer eller beslægtet termer for 'Brandstation', adskilt med kommaer>"
                     "name": "Motorcykelparkering",
                     "terms": "Motorcykelparkering"
                 },
+                "amenity/music_school": {
+                    "name": "Musikskole"
+                },
                 "amenity/nightclub": {
                     "name": "Natklub",
                     "terms": "Natklub, Natclub"
                     "terms": "Rangerstation"
                 },
                 "amenity/recycling": {
-                    "name": "Genbrug",
-                    "terms": "Genbrug"
+                    "name": "Genbrugscontainer"
                 },
                 "amenity/recycling_centre": {
                     "name": "Genbrugsplads",
                     "terms": "Lager, Lagerhotel, Varelager"
                 },
                 "camp_site/camp_pitch": {
-                    "name": "Campingplads",
+                    "name": "Plads på Campingplads",
                     "terms": "Campingplads"
                 },
                 "club": {
                     "name": "Catering",
                     "terms": "Catering"
                 },
+                "craft/chimney_sweeper": {
+                    "name": "Skorstensfejer"
+                },
                 "craft/clockmaker": {
                     "name": "Urmager",
                     "terms": "Urmager"
                     "name": "Stilladsfirma",
                     "terms": "Stilladsfirma"
                 },
+                "craft/sculptor": {
+                    "name": "Billedhugger",
+                    "terms": "Skulptør, Kunstner"
+                },
                 "craft/shoemaker": {
                     "name": "Skomager",
                     "terms": "Skomager"
                     "name": "Golfvandbunker",
                     "terms": "Golfvandbunker"
                 },
+                "healthcare/alternative/chiropractic": {
+                    "name": "Kiropraktor"
+                },
                 "healthcare/blood_donation": {
                     "name": "Blodbank",
                     "terms": "Blodbank, Donorblodbank"
                 },
+                "healthcare/midwife": {
+                    "name": "Jordemoder"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "Fysioterapeut"
+                },
                 "highway": {
                     "name": "Vej"
                 },
                     "name": "Ridesti",
                     "terms": "Ridesti, Hestesti"
                 },
-                "highway/bus_stop": {
-                    "name": "Busstoppested",
-                    "terms": "Bustoppested, Rutebilstoppested"
-                },
                 "highway/corridor": {
                     "name": "Indendørskorridor",
                     "terms": "Indendørskorridor, Indendørspassage"
                     "name": "Sti",
                     "terms": "Sti"
                 },
+                "highway/pedestrian_area": {
+                    "name": "Gågade areal"
+                },
+                "highway/pedestrian_line": {
+                    "name": "Gågade"
+                },
                 "highway/primary": {
                     "name": "Primærvej",
                     "terms": "Primærvej"
                     "name": "Skov",
                     "terms": "Skov, Plantageskov"
                 },
-                "landuse/garages": {
-                    "name": "Garager",
-                    "terms": "Garager"
-                },
                 "landuse/grass": {
                     "name": "Græs",
                     "terms": "Græs"
                     "name": "Industriområde",
                     "terms": "Industriområde"
                 },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Slagteri"
+                },
                 "landuse/landfill": {
                     "name": "Losseplads",
                     "terms": "Losseplads, Affaldsplads"
                     "terms": "Kontor"
                 },
                 "office/administrative": {
-                    "name": "Administrativt kontor",
-                    "terms": "Administrativt kontor"
-                },
-                "office/company": {
-                    "name": "Firmakontor",
-                    "terms": "Firmakontor, Selskabskonto"
+                    "name": "Administrativt kontor"
                 },
                 "office/coworking": {
                     "name": "Kontorfællesskab",
                     "terms": "Advokatkontor, Advokatfirma"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notarkontor",
-                    "terms": "Notarkontor, Notar"
+                    "name": "Notarkontor"
                 },
                 "office/ngo": {
                     "name": "NGO kontor",
                     "name": "Transformer",
                     "terms": "Transformer"
                 },
-                "public_transport/platform": {
-                    "name": "Platform",
-                    "terms": "Platform"
-                },
-                "public_transport/stop_position": {
-                    "name": "Stopposition",
-                    "terms": "Stopposition"
-                },
                 "railway": {
                     "name": "Jernbane"
                 },
                     "name": "Kabelsporvej",
                     "terms": "Kabelsporvej"
                 },
-                "railway/halt": {
-                    "name": "Togstation lille ubemandet",
-                    "terms": "Togstation lille ubemandet, Trinbræt"
-                },
                 "railway/level_crossing": {
                     "name": "Jernbaneoverskæring (vej)",
                     "terms": "Jernbaneoverskæring (vej)"
                     "name": "Smalspor",
                     "terms": "Smalspor, Smalsporbane, Smalsportogbane"
                 },
-                "railway/platform": {
-                    "name": "Jernbaneperron",
-                    "terms": "Jernbaneperron, Perron"
-                },
                 "railway/rail": {
                     "name": "Jernbanespor",
                     "terms": "Jernbanespor"
                 "railway/signal": {
                     "name": "Jernbanesignal"
                 },
-                "railway/station": {
-                    "name": "Togstation",
-                    "terms": "Togstation"
-                },
                 "railway/subway": {
                     "name": "S-togspor",
                     "terms": "S-togspor"
                     "name": "Sporvogn",
                     "terms": "Sporvogn"
                 },
-                "railway/tram_stop": {
-                    "name": "Sporvognsstop",
-                    "terms": "Sporvognsstop"
-                },
                 "relation": {
                     "name": "Relation",
                     "terms": "Relation"
                     "terms": "Køkkenudstyr"
                 },
                 "shop/interior_decoration": {
-                    "name": "Indendørsudsmykningsbutik",
-                    "terms": "Indendørsudsmykningsbutik"
+                    "name": "Brugskunstbutik",
+                    "terms": "Indendørsudsmykningsbutik, Indendørsudsmykning,brugskunst,kunst,indendørs,bolig"
                 },
                 "shop/jewelry": {
                     "name": "Juvelér",
-                    "terms": "Juvelér, Smykkeforretning"
-                },
-                "shop/kiosk": {
-                    "name": "Aviskiosk",
-                    "terms": "Aviskiosk"
+                    "terms": "Juvelér, Smykkeforretning,smykke,guldsmed"
                 },
                 "shop/kitchen": {
                     "name": "Køkkenudstyrsbutik",
                 },
                 "tourism/artwork": {
                     "name": "Kunstværk",
-                    "terms": "Kunstværk"
+                    "terms": "Skulptur, Statue, Vægmaleri"
                 },
                 "tourism/attraction": {
                     "name": "Turistattraktion",
                     "terms": "Turistattraktion, Seværdighed"
                 },
                 "tourism/camp_site": {
-                    "name": "Campinggrund",
-                    "terms": "Campinggrund"
+                    "name": "Campingplads",
+                    "terms": "Campingplads, Lejrplads, Teltplads"
                 },
                 "tourism/caravan_site": {
                     "name": "Autocamperplads",
                     "text": "Betingelser & tilbagemelding"
                 },
                 "description": "Premium DigitalGlobe satellitfoto.",
-                "name": "DigitalGlobe Premium fotos."
+                "name": "DigitalGlobe Premium fotos"
+            },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Vilkår & Tilbagemelding"
+                },
+                "description": "Luftfoto grænser og optagelsesdatoer. Tekstmærkater optræder ved zoom-niveau 14 og højere.",
+                "name": "DigitalGlobe Premium ældre fotos"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Betingelser & tilbagemelding"
                 },
                 "description": "Standard DigitalGlobe satellitfotos.",
-                "name": "DigitalGlobe Standard fotos."
+                "name": "DigitalGlobe Standard fotos"
+            },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Vilkår & Tilbagemelding"
+                },
+                "description": "Luftfoto grænser og optagelsesdatoer. Tekstmærkater optræder ved zoom-niveau 14 og højere.",
+                "name": "DigitalGlobe Standard ældre fotos"
             },
             "EsriWorldImagery": {
                 "attribution": {
                 },
                 "name": "OSM Inspector: Tagging"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "Ved zoom-niveau 16+ offentligt tilgængelige public domain kort-data fra US Census. Ved lavere niveauer kun ændringer siden 2006, eksklusiv ændringer allerede indarbejdet i OpenStreetMap.",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Gul = Public domain kort-data fra US Census. Rød = Ingen data i OpenStreetMap",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap bidragsydere, ODbL 1.0"
-                },
                 "name": "Afmærkede spor: Cykling"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap bidragsydere, ODbL 1.0"
-                },
                 "name": "Afmærkede spor: Vandring"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap bidragsydere, ODbL 1.0"
-                },
                 "name": "Afmærkede spor: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap bidragsydere, ODbL 1.0"
-                },
                 "name": "Afmærkede spor: Skøjtning"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap bidragsydere, ODbL 1.0"
-                },
                 "name": "Afmærkede spor: Vintersport"
             },
             "basemap.at": {
index cb28c400eae4e2ca699a45eebceb31f4cd4ea03f..5100b22c5c9d792cb5a104d868c3b364ef1ff9c7 100644 (file)
@@ -13,7 +13,7 @@
             },
             "add_point": {
                 "title": "Punkt",
-                "description": "Restaurants, Denkmäler, Briefkästen oder andere Punkte der Karte hinzufügen.",
+                "description": "Restaurants, Denkmäler, Briefkästen oder andere Punkte zur Karte hinzufügen.",
                 "tail": "Klicke in die Karte, um einen Punkt hinzuzufügen."
             },
             "browse": {
                 "description": "Verschiebe und zoome die Karte."
             },
             "draw_area": {
-                "tail": "Klicke, um Knoten zur Fläche hinzuzufügen. Klicke auf den ersten Knoten, um die Fläche abzuschließen."
+                "tail": "Klicke, um weiter Knoten zur Fläche hinzuzufügen. Klicke auf den ersten Knoten, um die Fläche fertigzustellen."
             },
             "draw_line": {
-                "tail": "Klicke, um weitere Knoten zur Linie hinzuzufügen. Klicke auf eine andere Linie, um die Linien zu verbinden und klicke doppelt, um die Linie zu beenden."
+                "tail": "Klicke, um weitere Knoten zur Linie hinzuzufügen. Klicke auf eine andere Linie, um die Linien zu verbinden und klicke doppelt, um die Linie fertigzustellen."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Dieses Objekt kann nicht bearbeitet werden, da es mit einem versteckten Objekt verbunden ist."
             }
         },
         "operations": {
@@ -56,7 +59,7 @@
                 "annotation": "Zeichnen abgebrochen."
             },
             "change_role": {
-                "annotation": "Rolle eines Relationsmitgliedes geändert."
+                "annotation": "Rolle eines Mitglieds der Relation geändert."
             },
             "change_tags": {
                 "annotation": "Eigenschaften geändert."
@@ -72,7 +75,7 @@
                     "line": "Eine Linie kreisförmig gemacht.",
                     "area": "Eine Fläche kreisförmig gemacht."
                 },
-                "not_closed": "Dieses Objekt kann nicht kreisförmig gemacht werden, da es keine Schleife ist.",
+                "not_closed": "Dieses Objekt kann nicht kreisförmig gemacht werden, da es nicht geschlossen ist.",
                 "too_large": "Dieses Objekt kann nicht kreisförmig gemacht werden, da zu wenig davon sichtbar ist.",
                 "connected_to_hidden": "Dieses Objekt kann nicht kreisförmig gemacht werden, da es mit einem versteckten Objekt verbunden ist."
             },
                 },
                 "not_squarish": "Dieses Objekt kann nicht rechtwinklig gemacht werden, da es nicht annähernd rechtwinklig ist.",
                 "too_large": "Dieses Objekt kann nicht quadratisch werden, da zu wenig davon sichtbar ist.",
-                "connected_to_hidden": "Dieses Objekt kann nicht quadratisch gemacht werden, weil es mit einem versteckten Objekt verbunden ist."
+                "connected_to_hidden": "Dieses Objekt kann nicht rechtwinklig gemacht werden, weil es mit einem versteckten Objekt verbunden ist."
             },
             "straighten": {
-                "title": "Gerade ausrichten",
-                "description": "Diese Linie gerade ausrichten.",
+                "title": "Begradigen",
+                "description": "Diese Linie begradigen.",
                 "key": "S",
-                "annotation": "Linie gerade ausgerichtet.",
+                "annotation": "Linie begradigt.",
                 "too_bendy": "Dieses Objekt kann nicht begradigt werden, da es zu kurvig ist.",
                 "connected_to_hidden": "Dieses Objekt kann nicht begradigt werden, da es mit einem versteckten Objekt verbunden ist."
             },
                 "annotation": {
                     "point": "Weg mit einem Punkt verbunden.",
                     "vertex": "Weg mit einem anderem Weg verbunden.",
-                    "line": "Weg mit einer Linie verbunden.",
+                    "line": "Weg mit einer Linie / einer Fläche verbunden.",
                     "area": "Weg mit einer Fläche verbunden."
                 }
             },
             "disconnect": {
                 "title": "Trennen",
                 "description": "Trenne diese Wege/Flächen voneinander.",
-                "key": "T",
+                "key": "D",
                 "annotation": "Linien/Flächen getrennt.",
                 "not_connected": "Es gibt hier nicht genug Linien/Flächen, um diese zu trennen.",
                 "connected_to_hidden": "Dieses Objekt kann nicht getrennt werden, da es mit einem versteckten Objekt verbunden ist.",
                 "annotation": "{n} Objekte wurden vereinigt.",
                 "not_eligible": "Diese Objekte können nicht vereinigt werden.",
                 "not_adjacent": "Diese Objekte können nicht vereinigt werden, da ihre Endpunkte nicht verbunden sind.",
-                "restriction": "Diese Objekte können nicht vereinigt werden, weil zumindest ein Objekt Teil der '{relation}' Relation ist.",
+                "restriction": "Diese Objekte können nicht vereinigt werden, weil zumindest ein Objekt Mitglied der '{relation}' Relation ist.",
                 "incomplete_relation": "Diese Objekte können nicht zusammengefügt werden, da mindestens eines noch nicht vollständig heruntergeladen wurde.",
                 "conflicting_tags": "Diese Objekte können nicht vereinigt werden, weil es Eigenschaften mit widersprechenden Werten gibt."
             },
                 }
             },
             "reverse": {
-                "title": "Umkehren",
+                "title": "Richtung umdrehen",
                 "description": "Richtung dieser Linie umkehren.",
                 "key": "V",
-                "annotation": "Linienrichtung umgekehrt."
+                "annotation": "Richtung der Linie umgedreht."
             },
             "split": {
                 "title": "Teilen",
             "restriction": {
                 "help": {
                     "select": "Klicke, um ein Wegsegment auszuwählen.",
-                    "toggle": "Klicke, um die Abbiegeeinschränkung umzudrehen.",
+                    "toggle": "Klicke, um die Abbiegebeschränkung umzudrehen.",
                     "toggle_on": "Klicke, um eine „{restriction}“-Einschränkung hinzuzufügen.",
                     "toggle_off": "Klicke, um die „{restriction}“-Einschränkung zu löschen."
                 },
                 "annotation": {
-                    "create": "Abbiegeeinschränkung hinzugefügt",
-                    "delete": "Abbiegeeinschränkung gelöscht"
+                    "create": "Abbiegebeschränkung hinzugefügt",
+                    "delete": "Abbiegebeschränkung gelöscht"
                 }
             }
         },
             "nothing": "Nichts zum Wiederherstellen."
         },
         "tooltip_keyhint": "Tastenkürzel:",
-        "browser_notice": "Dieser Editor unterstützt Firefox, Chrome, Safari, Opera und Internet Explorer 11 und höher. Bitte deinen Browser upgraden oder die Karte mit Potlatch 2 bearbeiten.",
+        "browser_notice": "Dieser Editor unterstützt Firefox, Chrome, Safari, Opera und Internet Explorer 11 und höher. Bitte aktualisiere deinen Browser oder bearbeite die Karte mit Potlatch 2.",
         "translate": {
             "translate": "Übersetzen",
             "localized_translation_label": "Mehrsprachiger Name",
             "localized_translation_language": "Sprache wählen",
             "localized_translation_name": "Name"
         },
-        "zoom_in_edit": "Zum Bearbeiten hinein zoomen",
+        "zoom_in_edit": "Hinein zoomen zum Bearbeiten ",
         "login": "Login",
         "logout": "Abmelden",
         "loading_auth": "Mit OpenStreetMap verbinden …",
         "status": {
             "error": "Verbindungsaufbau zur API nicht möglich.",
             "offline": "Der Server ist offline. Bitte versuche es später noch einmal.",
-            "readonly": "Die API ist im „Nur-Lese“-Modus. Änderungen können zur Zeit nicht gespeichert werden.",
+            "readonly": "Die API erlaubt nur lesen. Änderungen können zur Zeit nicht gespeichert werden.",
             "rateLimit": "Die API beschränkt den Zugriff durch nicht angemeldete Benutzer. Du kannst das Limit durch Anmelden umgehen."
         },
         "commit": {
             "about_changeset_comments": "Über Änderungssatz-Kommentare",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/DE:Good_changeset_comments",
             "google_warning": "Du hast Google in diesem Kommentar erwähnt: Vergiss bitte nicht, dass das Kopieren von Google Maps streng verboten ist.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Bearbeitet von {users}",
                 "title": "Maße",
                 "selected": "{n} ausgewählt",
                 "geometry": "Geometrie",
-                "closed": "geschlossene",
+                "closed_line": "geschlossene Linie",
+                "closed_area": "geschlossene Fläche",
                 "center": "Zentrum",
                 "perimeter": "Umfang",
                 "length": "Länge",
                 "centroid": "Schwerpunkt",
                 "location": "Lage",
                 "metric": "metrische Maße",
-                "imperial": "imperiale Maße"
+                "imperial": "imperiale Maße",
+                "node_count": "Anzahl der Knoten"
             }
         },
         "geometry": {
         "inspector": {
             "no_documentation_combination": "Für diese Eigenschaftenkombination ist keine Dokumentation verfügbar.",
             "no_documentation_key": "Für dieses Schlüsselwort ist keine Dokumentation verfügbar.",
-            "documentation_redirect": "Diese Dokumentation wurde auf eine neue Webpage weitergeleitet.",
+            "documentation_redirect": "Diese Dokumentation wurde auf eine neue Webseite weitergeleitet.",
             "show_more": "Mehr zeigen",
             "view_on_osm": "Auf openstreetmap.org ansehen",
             "all_fields": "Alle Felder",
             "title": "Hintergrund",
             "description": "Hintergrundeinstellungen",
             "key": "B",
-            "percent_brightness": "{opacity}% Helligkeit",
-            "none": "Kein Hintergrund",
-            "best_imagery": "Beste bekannte Bildmaterialquelle für diese Lage",
+            "backgrounds": "Bildmaterial-Quelle",
+            "none": "Leer",
+            "best_imagery": "Beste bekannte Bildmaterial-Quelle für diese Lage",
             "switch": "Zu diesem Hintergrund zurückschalten",
             "custom": "Benutzerdefiniert",
             "custom_button": "Benutzerdefinierten Hintergrund bearbeiten",
-            "custom_prompt": "Gib eine Kachel-URL-Vorlage ein. Gültige Variablen sind:\n   - {zoom}/{z}, {x}, {y} für das Z/X/Y Kachel-Schema\n   - {ty} für umgedrehte TMS-Stil Y-Koordinaten\n   - {u} für das Quadtile Schema\n   - {switch:a,b,c} für DNS-Server Multiplexing\n\nBeispiel:\n{example}",
-            "fix_misalignment": "Bildmaterial-Versatz anpassen",
-            "imagery_source_faq": "Woher kommt dieses Bildmaterial?",
+            "custom_prompt": "Gib eine Kachel-URL-Vorlage ein. Gültige Variablen sind:\n - {zoom} oder {z}, {x}, {y} für das Z/X/Y Kachel-Schema\n - {-y} oder {ty} für umgedrehte TMS-Stil Y-Koordinaten\n - {u} für das Quadtile Schema\n - {switch:a,b,c} für DNS-Server Multiplexing\n\nBeispiel:\n{example}",
+            "overlays": "Überlagerungen",
+            "imagery_source_faq": "Bildmaterialinformation / Problem melden",
             "reset": "Zurücksetzen",
-            "offset": "Ziehe irgendwo im grauen Bereich um den Versatz des Bildmaterials anzupassen oder gib die Versatz-Werte in Metern ein.",
+            "display_options": "Bildmaterial-Optionen",
+            "brightness": "Helligkeit",
+            "contrast": "Kontrast",
+            "saturation": "Sättigung",
+            "sharpness": "Schärfe",
             "minimap": {
-                "description": "Minikarte",
-                "tooltip": "Zeige kleine Überblicks-Karte zum Auffinden des angezeigten Kartenausschnitts.",
+                "description": "Minimap anzeigen",
+                "tooltip": "Zeige eine herausgezoomte Karte zum Auffinden des angezeigten Kartenausschnitts.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Bildmaterial-Versatz anpassen",
+            "offset": "Ziehe irgendwo im grauen Bereich um den Versatz des Bildmaterials anzupassen oder gib die Versatz-Werte in Metern ein."
         },
         "map_data": {
             "title": "Kartendaten",
                     "title": "OpenStreetMap Daten"
                 }
             },
-            "fill_area": "Füllflächen",
+            "fill_area": "Flächenfüllung",
             "map_features": "Karten-Objekte",
             "autohidden": "Diese Objekte wurden automatisch versteckt, da zu viele auf dem Bildschirm angezeigt würden. Du kannst zum Bearbeiten hinein zoomen.",
             "osmhidden": "Diese Objekte wurden automatisch versteckt, weil die OpenStreetMap Ebene versteckt ist."
             },
             "traffic_roads": {
                 "description": "Hauptstraßen",
-                "tooltip": "Autobahnen, Straßen, etc."
+                "tooltip": "Autobahnen, Straßen usw."
             },
             "service_roads": {
                 "description": "Erschließungsstraßen",
-                "tooltip": "Erschließungsstraßen, Zufahrtsstraßen, Parkplatzstraßen, Waldwege, Feldwege, etc."
+                "tooltip": "Erschließungsstraßen, Zufahrtsstraßen, Parkplatzstraßen, Waldwege, Feldwege usw."
             },
             "paths": {
                 "description": "Wege",
-                "tooltip": "Bürgersteige, Gehsteige, Fußwege, Radwege, etc."
+                "tooltip": "Bürgersteige, Gehsteige, Fußwege, Radwege usw."
             },
             "buildings": {
                 "description": "Gebäude",
-                "tooltip": "Gebäude, Unterstände, Garagen, etc."
+                "tooltip": "Gebäude, Unterstände, Garagen usw."
             },
             "landuse": {
                 "description": "Flächennutzungen",
-                "tooltip": "Wälder, Äcker, Parks, Wohngebiete, Industriegebiete, etc."
+                "tooltip": "Wälder, Äcker, Parks, Wohngebiete, Industriegebiete usw."
             },
             "boundaries": {
                 "description": "Grenzen",
             },
             "water": {
                 "description": "Gewässer",
-                "tooltip": "Flüsse, Seen, Teiche, Weiher, Flussbecken etc."
+                "tooltip": "Flüsse, Seen, Teiche, Weiher, Flussbecken usw."
             },
             "rail": {
                 "description": "Eisenbahnen",
             },
             "power": {
                 "description": "Stromleitungen",
-                "tooltip": "Stromleitungen, Kraftwerke, Umspannwerke, etc."
+                "tooltip": "Stromleitungen, Kraftwerke, Umspannwerke usw."
             },
             "past_future": {
                 "description": "Vergangen/Zukünftig",
-                "tooltip": "Geplant, in Bau, aufgegeben, abgerissen, etc."
+                "tooltip": "Geplant, in Bau, aufgegeben, abgerissen usw."
             },
             "others": {
                 "description": "Andere",
         },
         "area_fill": {
             "wireframe": {
-                "description": "Keine Füllung (Gitter)",
-                "tooltip": "Gittermodus aktivierenm verbessert die Sichtbarkeit des Hintergrund-Bildmaterials",
+                "description": "Keine Füllung (Gittermodus)",
+                "tooltip": "Der Gittermodus verbessert die Sichtbarkeit des Hintergrund-Bildmaterials",
                 "key": "G"
             },
             "partial": {
                 "description": "Teilweise Füllung",
-                "tooltip": "Flächen werden nur mit Füllung in den Innenecken angezeigt. (Empfohlen für Anfänger)"
+                "tooltip": "Flächen werden nur am Rand innen gefüllt (Empfohlen für Anfänger)"
             },
             "full": {
-                "description": "Vollständige Füllung",
-                "tooltip": "Flächen werden vollständig gefüllt angezeigt"
+                "description": "Volle Füllung",
+                "tooltip": "Flächen werden voll gefüllt angezeigt"
             }
         },
         "restore": {
             "heading": "Ungesicherte Änderungen vorhanden",
-            "description": "Willst Du die ungesicherten Änderungen aus einer früheren Bearbeitungs-Sitzung wiederherstellen?",
+            "description": "Willst du die ungesicherten Änderungen aus einer früheren Bearbeitungs-Sitzung wiederherstellen?",
             "restore": "Wiederherstellen meiner Änderungen",
             "reset": "Verwerfen meiner Änderungen"
         },
             "status_code": "Server hat folgenden Status zurückgegeben: {code}",
             "unknown_error_details": "Bitte stelle sicher, dass dein Gerät mit dem Internet verbunden ist.",
             "uploading": "Änderungen werden auf OpenStreetMap hochgeladen...",
+            "conflict_progress": "Konflikte prüfen: {num} von {total}",
             "unsaved_changes": "Ungesicherte Änderungen vorhanden",
             "conflict": {
                 "header": "Bearbeitungskonflikte auflösen",
                 "count": "Konflikt {num} von {total}",
-                "previous": "< Voriger",
+                "previous": "< Vorheriger",
                 "next": "Nächster >",
                 "keep_local": "Eigene behalten",
                 "keep_remote": "Andere Version verwenden",
                 "delete": "Gelöscht lassen",
                 "download_changes": "oder osmChange File herunterladen",
                 "done": "Alle Konflikte aufgelöst!",
-                "help": "Ein anderer Benutzer hat einige der gleichen Objekte geändert, die Du geändert hast.\nKlicke unten auf jedes Objekt für weitere Details über den Konflikt und wähle aus,\nob Deine Änderungen oder die Änderungen des anderen Benutzers behalten werden sollen.\n"
+                "help": "Ein anderer Benutzer hat einige der gleichen Objekte geändert, die du geändert hast.\nKlicke unten auf jedes Objekt für weitere Details über den Konflikt und wähle aus,\nob deine Änderungen oder die Änderungen des anderen Benutzers behalten werden sollen.\n"
             }
         },
         "merge_remote_changes": {
                 "deleted": "Dieses Objekt wurde von {user} gelöscht.",
                 "location": "Dieses Objekt wurde sowohl von Dir als auch von {user} verschoben.",
                 "nodelist": "Knoten wurden von {user} und dir geändert.",
-                "memberlist": "Relationsmitglieder wurden von {user} und dir geändert.",
+                "memberlist": "Mitglieder der Relation wurden von {user} und dir geändert.",
                 "tags": "Du hast die Eigenschaft <b>{tag}</b> in „{local}“ geändert und {user} hat es in „{remote}“ geändert."
             }
         },
             "untagged_area_tooltip": "Wähle einen Objekttyp aus, der diese Fläche beschreibt.",
             "untagged_relation": "Relation ohne Eigenschaft",
             "untagged_relation_tooltip": "Wähle einen Objekttyp aus, der diese Relation beschreibt.",
-            "many_deletions": "Du willst {n} Objekte löschen. Bist du sicher, dass du das möchtest? Dies wird die Objekte aus der Karte löschen, die jeder andere auf openstreetmap.org sieht.",
+            "many_deletions": "Du willst {n} Objekte löschen: {p} Knoten, {l} Linien, {a} Fächen und {r} Relationen. Bist du sicher, dass du das möchtest? Damit werden alle diese Objekte aus der Karte entfernt, die alle anderen auf openstreetmap.org sehen.",
             "tag_suggests_area": "Die Eigenschaft {tag} legt nahe, dass die Linie eine Fläche sein sollte, es ist aber keine Fläche",
             "deprecated_tags": "Veraltete Eigenschaften: {tags}"
         },
             "in": "Hinein zoomen",
             "out": "Heraus zoomen"
         },
-        "cannot_zoom": "Es kann im aktuellen Modus nicht weiter heraus gezoomt werden.",
+        "cannot_zoom": "Du kannst im aktuellen Modus nicht weiter heraus zoomen.",
         "full_screen": "Vollbildmodus ein-/ausschalten",
         "gpx": {
             "local_layer": "Lokale Datei",
             "drag_drop": "Zieh eine .gpx, .geojson, oder .kml Datei per Drag & Drop auf die Seite oder klicke den Knopf rechts, um nach Dateien zu suchen",
-            "zoom": "Zur GPX-Spur zoomen",
+            "zoom": "GPS-Track anzeigen",
             "browse": "Eine Datei laden"
         },
         "mapillary_images": {
             "tooltip": "Straßenfotos von Mapillary",
-            "title": "Fotoüberlagerung (Mapillary)"
+            "title": "Straßenfotos (Mapillary)"
         },
         "mapillary_signs": {
-            "tooltip": "Verkehrsschilder von Mapillary (bei aktivierter Fotoebene)",
-            "title": "Verkehrszeichen-Überlagerung (Mapillary)"
+            "tooltip": "Verkehrszeichen von Mapillary (bei aktivierten Straßenfotos)",
+            "title": "Verkehrszeichen (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Dieses Bild auf Mapillary ansehen"
         },
         "openstreetcam_images": {
             "tooltip": "Straßenfotos von OpenStreetCam",
-            "title": "Fotoüberlagerung (OpenStreetCam)"
+            "title": "Straßenfotos (OpenStreetCam)"
         },
         "openstreetcam": {
             "view_on_openstreetcam": "Dieses Bild auf OpenStreetCam ansehen"
         "help": {
             "title": "Hilfe",
             "key": "H",
-            "help": "#Hilfe\n\nDies ist der iD Editor für [OpenStreetMap](http://www.openstreetmap.org/), der freien und bearbeitbaren Weltkarte. Du kannst ihn verwenden, um Daten in deiner Umgebung hinzuzufügen oder zu verbessern und so diese Karte mit freien Quellen und freien Daten für jeden verbessern.\n\nDeine Bearbeitungen werden für alle Nutzer von OpenStreetMap sichtbar. Um Bearbeitungen vornehmen zu können, musst du [einloggen](https://www.openstreetmap.org/login).\n\nDer [iD Editor](http://ideditor.com/) ist ein Gemeinschaftsprojekt, dessen [Quellcode auf GitHub](https://github.com/openstreetmap/iD) verfügbar ist.\n",
-            "editing_saving": "# Bearbeiten & Speichern\n\nDieser Editor ist gedacht um hauptsächlich online zu arbeiten und du verwendest ihn gerade auf einer Webseite.\n\n### Objekte auswählen\n\nUm ein Objekt wie eine Straße oder eine Sehenswürdigkeit auszuwählen, klicke dieses auf der Karte an. Dadurch wird das Objekt hervorgehoben und es werden links in der Seitenleiste die Objektdetails angezeigt. Durch Rechtsklicken auf das Objekt bekommst du das Bearbeitungsmenu für das Objekt.\n\nMehrere Objekte kannst du auswählen, indem du die Shift-Taste gedrückt hältst. Dann klicke entweder einzeln auf die gewünschten Objekte oder ziehe mit der Maus einen Rahmen auf, damit die Punkte im Rahmen ausgewählt werden.\n\n### Speichern der Änderungen\n\nWenn du Straßen, Gebäude, oder Plätze bearbeitet hast, dann sind deine Änderungen nur lokal gespeichert, bis du sie zum Server hochlädst. Mach dir keine Sorge wegen Fehler: Du kannst Änderungen jederzeit mit dem Rückgängig-Knopf rückgängig machen oder über den Wiederherstellen-Knopf wiederherstellen.\n\nKlicke auf „Speichern“, um eine Gruppe von Änderungen abzuschließen, beispielsweise wenn du in einem Gebiet fertig bist und woanders weiter arbeiten willst. Du bekommst dann die Liste der Änderungen und manchmal auch nützliche Warnungen angezeigt, wenn etwas falsch sein könnte. Du kannst dann überprüfen, was du gerade geändert hast.\n\nWenn alles gut aussieht, solltest du einen kurzen Kommentar schreiben, der deine Änderungen erklärt. Klicke dann auf \"Hochladen“, um die Änderungen auf [OpenStreetMap.org](http://www.openstreetmap.org/) zu speichern, dort werden sie für alle anderen Benutzer sichtbar und diese können darauf aufbauen.\n\nWenn du deine Änderungen in einer Sitzung nicht fertigstellen kannst, schließe einfach den Browser-Tab. Wenn du die Seite wieder öffnest (mit dem gleichen Rechner und Browser) wird dir angeboten, deine Änderungen wiederherzustellen.\n\n### Benutzung des Editors\n\nDu kannst die Liste der Tastenkürzel mit dem '?'-Knopf ansehen.\n",
-            "roads": "# Wege\n\nMit diesem Editor kannst du Wege erstellen, verbessern und löschen. Es gibt alle Arten von Wegen: Wanderwege, Straßen, Bürgersteige, Autobahnen, Eisenbahnschienen oder Fahrradwege; jeder oft benutzte Abschnitt sollte abbildbar sein.\n\n### Auswählen\n\nKlicke auf einen Weg um ihn auszuwählen. Er wird dann hervorgehoben und und es werden links in der Seitenleiste die Wegdetails angezeigt. Durch Rechtsklicken auf den Weg bekommst du das Bearbeitungsmenu für den Weg.\n\n### Verbessern\n\nOft sieht man, dass Wege nicht mit dem Bildmaterial oder einer GPS-Spur übereinstimmen. Du kannst den Weg so anpassen, dass er an der richtigen Stelle ist.\n\nZuerst klickst du auf den Weg den du ändern willst. Dieser wird nun hervorgehoben und es werden die Knoten und Kontrollpunkte des Weges angezeigt. Diese kannst du an die richtigen Stelle verschieben. Wenn du neue Knoten hinzufügen möchtest, klicke doppelt zwischen den Knoten auf die Linie und es wird ein neuer Knoten erzeugt. Du kannst auch einen Dreiecks-Pfeil auf der Linie anklicken und verschieben.\n\nWenn zwei Wege in Wirklichkeit mit einander verbunden sind, aber auf der Karte nicht, kannst du sie verbinden, indem du einen Knoten des einen Weges auf den anderen Weg ziehst. Dass Wege verbunden sind, ist wichtig für die Karte und erforderlich für die Nutzung von Straßenroutern.\n\nDu kannst den Weg auch Rechtsklicken und das „Bewegen“-Werkzeug nutzen oder „M“ drücken, um den kompletten Weg zu verschieben. Beende die Aktion mit einem Klick.\n\n### Löschen\n\nWenn du weißt, dass ein Weg nicht existiert, kannst du ihn löschen, um ihn von der Karte zu entfernen. Sei beim Löschen von Objekten - wie immer beim Bearbeiten - vorsichtig, da die Ergebnisse von jedem gesehen werden können und die Satellitenbilder oft veraltet sind; der Weg wurde vielleicht einfach neu gebaut.\n\nDu kannst Wege löschen, indem du sie rechtsklickst und das Papierkorbsymbol auswählst oder die „Entfernen“-Taste drückst.\n\n### Erstellen\n\nDu kennst einen Weg, der nicht eingezeichnet ist? Dann klicke auf das „Linien“-Symbol oben links im Editor oder drücke die Taste „2“ und beginne mit dem Zeichnen einer Linie.\n\nKlicke dort hin, wo der Weg anfängt. Sollte er von einer bereits existierenden Straße abzweigen, klicke an der entsprechenden Stelle auf diese Straße.\n\nZeichne nun den Weg, indem du Knoten anhand des Bildmaterials oder der GPS-Spur entlang des Weges setzt. Sollte der Weg einen anderen kreuzen, klicke auf den Kreuzungspunkt, um beide Wege zu verbinden. Wenn du mit dem Zeichnen fertig bist, klicke doppelt oder drücke „Enter“ auf der Tastatur, um den Weg abzuschließen.\n",
-            "gps": "# GPS\n\nGesammelte GPS-Tracks sind eine wertvolle Datenquelle für OpenStreetMap. Dieser Editor unterstützt lokale GPS-Tracks - `.gpx`-Dateien auf deinem Computer. Du kannst GPS-Tracks mit Hilfe von  zahlreichen Smartphone-Apps oder mit GPS-Geräten aufnehmen.\n\nFür Informationen über das Aufzeichnen von GPS-Daten kannst du dir folgende Anleitung durchlesen: [Kartierung mit Smartphone, GPS oder Papier](http://learnosm.org/de/mobile-mapping/)\n\nUm einen GPS-Track fürs Mapping zu verwenden, ziehe ihn einfach auf die Karte. Wenn er erkannt wurde, wird der Track als hell-lila Linie auf der Karte dargestellt.\nKlicke auf das Kartendaten-Menü rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder zoome zum Gebiet des Tracks.\n\nDer GPS-Track wird nicht automatisch direkt zu OpenStreetMap hochgeladen. Am besten verwendest du ihn als Orientierung um neue Objekte zu zeichnen. Möchtest du den GPS-Track jedem zugänglich machen, kannst du ihn [nach OpenStreetMap hochladen](http://www.openstreetmap.org/trace/create)\n",
-            "imagery": "# Bildmaterial\n\nHintergrundbilder sind eine wichtige Quelle für das Kartografieren. Eine Kombination aus Luftbildern von Flugzeugen, Satellitenbilder und freien Quellen sind im Editor über das Hintergrundeinstellungs-Menü auf der rechten Seite verfügbar.\n\nAls Standard sind die [Bing](http://www.bing.com/maps/)-Satellitenbilder ausgewählt. Je nach angezeigter Gegend werden dir verschiedene andere Quellen angezeigt. In einigen Länder wie Deutschland, Österreich, Schweiz oder den USA steht zum Teil sehr hochauflösendes Bildmaterial zur Verfügung.\n\nBildmaterial ist manchmal durch Fehler der Anbieter gegenüber den Kartendaten versetzt. Wenn du feststellst, dass viele Wege gegenüber dem Hintergrund versetzt sind, dann verschiebe nicht die Wege damit sie zum Hintergrund passen. Du kannst das Hintergrund-Bildmaterial verschieben, bis es zu den bestehenden Objekten passt. Um das Bildmaterial anzupassen, klicke auf „Bildmaterial-Versatz anpassen“ unten in den Hintergrundeinstellungen.\n",
-            "addresses": "# Adressen\n\nAdressen sind eine der nützlichsten Informationen der Karte.\n\nObwohl Adressen oft als Teile der Straße dargestellt sind werden sie in OpenStreetMap als Eigenschaften von Punkten neben der Straße, von Gebäude-Eingängen oder von Gebäuden eingetragen.\n\nDu kannst Adressinformationen zu Orten hinzufügen, die als Gebäude-Umrisse oder als Punkte erfasst sind. Die beste Quelle für Adressen ist eigenes Wissen oder eine Erhebung vor Ort - wie bei allen anderen Objekten ist das Kopieren von kommerziellen Quellen wie Google Maps strikt verboten.\n",
-            "inspector": "# Objekteditor\n\nDer Objekteditor ist der Bereich links auf der Seite und erlaubt dir die Details des ausgewählten Objekts zu bearbeiten.\n\n### Einen Objekttyp auswählen\n\nNachdem du einen Punkt, eine Linie oder eine Fläche hinzugefügt hast, kannst du auswählen, welchen Typ das Objekt hat – ob es eine Autobahn oder eine Anliegerstraße, ein Supermarkt oder ein Café ist. Der Objekteditor zeigt Knöpfe für die am häufigsten Objekttypen an und du kannst andere finden indem du im Suchfeld eingibst, wonach du suchst.\n\nKlicke auf den Knopf „i“ auf der rechten Seite bei einem Objekttyp, um mehr darüber zu erfahren. Klicke auf den Objekttyp um ihn auszuwählen.\n\n### Objekttypen verwenden und Eigenschaften bearbeiten\n\nNachdem du einen Objekttyp oder ein Objekt mit zugeordnetem Objekttyp ausgewählt hast, zeigt der Objekteditor Felder mit Eigenschaften des Objekts wie Name oder Adresse an.\n\nUnter diesen Feldern kannst du das \"Feld hinzufügen\"-Dropdown anklicken, um weitere Details hinzuzufügen wie zum Beispiel einen Wikipedia-Link, die Zugänglichkeit für Rollstühle und anderes.\n\nUnten im Objekteditor kannst du auf „Alle Eigenschaften“ klicken, um das Objekt mit beliebigen anderen Eigenschaften zu versehen. [Taginfo](http://taginfo.openstreetmap.org/) ist eine gute Quelle, um oft genutzte Kombinationen von Eigenschaften zu finden.\n\nÄnderungen die du im Objekteditor vornimmst, werden automatisch auf die ausgewählten Objekte angewendet. Durch Klicken auf den Knopf „Rückgängig“ kannst du sie rückgängig machen.\n",
-            "buildings": "# Gebäude\n\nOpenStreetMap ist die größte Gebäude-Datenbank der Welt und du kannst helfen, sie weiter zu verbessern.\n\n### Auswahl\n\nDu kannst ein Gebäude auswählen, indem du auf dessen Umriss klickst. Das Gebäude wird dann hervorgehoben und es werden links in der Seitenleiste die Gebäudedetails angezeigt.\n\n### Bearbeitung\n\nManchmal sind Gebäude falsch platziert oder haben falsche Eigenschaften.\n\nUm ein Gebäude komplett zu verschieben kannst du es auswählen und mit dem Tastenkürzel 'M' verschieben oder rechtsklicken und mit dem „Bewegen“-Werkzeug verschieben. Bewege die Maus um das Gebäude zu verschieben und klicke, wenn es an der richtigen Stelle ist.\n\nUm den Gebäudeumriss zu korrigieren, klicke und ziehe die Knoten des Umriss, bis sie an der richtigen Stelle sind.\n\n### Erstellen\n\nEine Hauptfrage beim Gebäude erstellen ist dasss OpenStreetMap Gebäude sowohl Flächen und als Punkt speichert. Die Faustregel ist _Gebäude wenn möglich als Flächen zu zeichnen_ und Firmen, Geschäfte und ähnliches zusätzlich als Punkte innerhalb des Gebäudes anzulegen.\n\nUm ein Gebäude als Fläche zu zeichnen, klicke auf den Knopf „Fläche“ oben links und vollende das Gebäude, indem du entweder die „Enter“-Taste drückst, oder auf den ersten Knoten klickst.\n\n### Löschen\n\nWenn ein Gebäude nicht existiert – es ist auf den Satellitenbilder nicht vorhanden und du warst idealerweise vor Ort – kannst du es löschen und es wird von der Karte entfernt. Sei vorsichtig beim Löschen von Objekten, das Ergebnis kann, wie bei jeder anderen Änderung, von allen gesehen werden. Außerdem sind Satellitenbilder oft veraltet und ein Gebäude könnte einfach neu gebaut sein.\n\nDu kannst ein Gebäude löschen, indem du es auswählst und die Entf-Taste drückst oder es rechtsklickt und auf das Papierkorbsymbol klickst.\n",
-            "relations": "# Relationen\n\nEine Relation ist ein besonderes Objekt in OpenStreetMap, welches andere Objekte zusammenfasst. Es gibt zwei gängige Arten von Relationen: Wegrelationen fassen Abschnitte eines Weges zu einer Autobahn oder zu einem Wanderweg zusammen. Multipolygone fassen mehrere Linien/Flächen zu einer komplexen Fläche (bestehend aus mehreren Flächen oder Löchern wie ein Gebäude-Innenhof oder eine Lichtung im Wald) zusammen.\n\nDie Objekte in einer Relation werden Mitglieder genannt. Im Objekteditor kannst du links in der Seitenleiste ganz unten unter \"Alle Relationen\" sehen, in welchen Relationen das Objekt enthalten ist. Durch Klick auf eine Relation werden alle Elemente der Relation in der Seitenleiste angezeigt und auf der Karte markiert.\n\nNormalerweise kümmert sich iD während der Bearbeitung automatisch um die Pflege der Relationen. Wenn du einen Abschnitt eines Weges löschst, um ihn genauer neu zu zeichnen, solltest du sicherstellen, dass der neuen Abschnitt Mitglied in den gleichen Relationen wie das Original wird.\n\n### Bearbeiten von Relationen\n\nUm ein Objekt einer Relation hinzuzufügen, wähle das zukünftige Mitglied aus und klicke im Objekteditor auf die Schaltfläche „+“ im Abschnitt „Alle Relationen“. Du kannst dann die Relation auswählen oder den Namen der Relation eintippen.\n\nUm eine neue Relation erstellen, wähle das erste zukünftige Mitglied aus und klicke im Objekteditor auf die Schaltfläche „+“ im Abschnitt „Alle Relationen“ und wähle „Neue Relation …“.\n\nUm ein Element aus einer Relation zu entfernen, wähle das Mitglied aus und klicke auf den Papierkorb neben der Relation, aus der du es entfernen willst.\n\nDu kannst Multipolygone mit Löchern mit dem „Vereinigen“-Werkzeug erstellen. Zeichne zwei Bereiche (den äußeren und den inneren Bereich) und klicke auf den äußeren Bereich. Dann halte die Umschalttaste gedrückt und klicke auf den inneren Bereich und klicke dann auf „Vereinigen“ (+).\n"
+            "help": {
+                "title": "Hilfe",
+                "welcome": "Willkommen beim iD Editor für [OpenStreetMap](https://www.openstreetmap.org/). Mit diesem Editor kannst du OpenStreetMap gleich mit deinem Browser verbessern.",
+                "open_data_h": "Open Data",
+                "open_data": "Deine Änderungen auf dieser Karte werden für alle Nutzer von OpenStreetMap sichtbar. Du kannst Ortskenntnis, Vor-Ort-Erhebung oder Bildmaterial von Luftaufnahmen und Straßenfotos als Grundlage für deine Bearbeitungen verwenden. Kopieren von kommerziellen Quellen wie Google [ist streng verboten](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Bevor du anfängst",
+                "before_start": "Du solltest mit OpenStreetMap und diesem Editor vertraut sein, bevor du mit dem Bearbeiten anfängst. iD hat einen Rundgang mit dem du die Grundlagen des OpenStreetMap-Bearbeiten lernen kannst. Klicke \"Rundgang starten\" um das Lernprogramm zu starten - es dauert nur etwa 15 Minuten.",
+                "open_source_h": "Open Source",
+                "open_source": "Der iD Editor ist ein quelloffenes Gemeinschaftsprojekt und du benutzt gerade Version {version}. Der Quellcode ist [auf GitHub](https://github.com/openstreetmap/iD) verfügbar.",
+                "open_source_help": "Du kannst iD durch [Übersetzungen](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) oder [Fehlermeldungen](https://github.com/openstreetmap/iD/issues) unterstützen."
+            },
+            "overview": {
+                "title": "Überblick",
+                "navigation_h": "Navigation",
+                "navigation_drag": "Du kannst die Karte durch Drücken und Halten der {leftclick} linken Maustaste und Bewegen der Maus verschieben. Du kannst auch die  `↓`, `↑`, `←`, `→` Pfeiltasten auf deiner Tastatur benutzen.",
+                "navigation_zoom": "Du kannst durch Drehen am Mausrad oder am Trackpad oder durch Klicken der  {plus} / {minus} Knöpfe rechts oben neben der Karte hinein oder heraus zoomen. Du kannst auch die `+`, `-` Tasten auf der Tastatur benutzen.",
+                "features_h": "Karten-Objekte",
+                "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte erscheinen, beispielsweise Straßen, Gebäude oder Sehenswürdigkeiten. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet  werden. Objekte werden auf der Karte als *Punkte*, *Linien* oder *Flächen* dargestellt.",
+                "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt."
+            },
+            "editing": {
+                "title": "Bearbeiten & Speichern",
+                "select_h": "Auswählen",
+                "select_left_click": "{leftclick} Linksklicke ein Objekt um es auszuwählen. Dadurch wird es mit einem pulsierenden Schimmer hervorgehoben und links im *Objekteditor* werden Details des Objekts wie Name oder Adresse angezeigt.",
+                "select_right_click": "{rightclick} Rechtsklicke ein Objekt um das *Bearbeitungs-Menü* zu sehen, welches dir die verfügbaren Befehle wie Drehen, Bewegen oder Löschen zeigt.",
+                "multiselect_h": "Mehrfachauswahl",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Linksklick kann mehrere Objekte gemeinsam auswählen. Damit können diese leicht gemeinsam verschoben, gefreht oder gelöscht werden.",
+                "multiselect_lasso": "Eine andere Möglichkeit mehrere Objekte gemeinsam auszuwählen ist die `{shift}` Taste zu halten, dann den {leftclick} linken Mausknopf festzuhalten und mit der Maus ein Auswahl-Lasso um die Objekte zu ziehen. Alle Punkte innerhalb des Auswahl-Lasso werden ausgewählt.",
+                "undo_redo_h": "Rückgängig & Wiederherstellen",
+                "undo_redo": "Deine Bearbeitungen werden lokal in deinem Web Browser gespeichert bis du diese auf dem OpenStreetMap Server speicherst. Du kannst Bearbeitungen durch Klicken des {undo} **Rückgängig** Knopf rückgängig machen und durch Klicken des {redo} **Wiederherstellen** Knopf wiederherstellen.",
+                "save_h": "Speichern",
+                "save": "Klicke {save} **Speichern** um deine Bearbeitungen zu beenden und auf dem OpenStreetMap Server zu speichern. Bitte denk daran, deine Arbeit häufig zu speichern!",
+                "save_validation": "Beim Speichern kannst du überprüfen, was du gerade bearbeitet hast. iD macht einfache Prüfungen auf fehlende Daten und kann hilfreiche Vorschäge und Warnungen anzeigen, wenn etwas nicht richtig erscheint.",
+                "upload_h": "Hochladen",
+                "upload": "Vor dem Hochladen deiner Änderungen musst du einen [Änderungssatz-Kommentar](https://wiki.openstreetmap.org/wiki/DE:Good_changeset_comments) eingeben. Dann klickst du **Upload** um deine Änderungen an OpenStreetMap zu schicken, wo sie in die Karte aufgenommen und öffentlich für alle sichtbar werden.",
+                "backups_h": "Automatische Sicherungen",
+                "backups": "Wenn du deine Änderungen nicht beenden kannst, beispielsweise weil dein Computer abstürzt oder du den Browser Tag schließt, sind deine Änderungen lokal in deinem Browser gespeichert. Wenn du die Seite wieder öffnest (mit dem gleichen Rechner und Browser) wird dir iD anbieten, deine Änderungen wiederherzustellen.",
+                "keyboard_h": "Tastenkürzel",
+                "keyboard": "Du kannst eine Liste der Tastenkürzel durch Drücken der `?` Taste ansehen."
+            },
+            "feature_editor": {
+                "title": "Objekteditor",
+                "intro": "Der *Objekteditor* erscheint links neben der Karte und ermöglicht dir alle Informationen des ausgewählten Objekts zu sehen und zu bearbeiten.",
+                "definitions": "Im oberen Bereich wird der Objekttyp angezeigt. Der mittlere Bereich enthält die *Felder* mit den Merkmalen des Objektes wie Name oder Adresse.",
+                "type_h": "Objekttyp",
+                "type": "Du kannst auf den Objekttyp klicken um dem Objekt einem anderen Typ zu geben. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet werden, daher kannst du aus tausenden Objekttypen wählen.",
+                "type_picker": "Die Typauswahl zeigt die am häufigsten genutzten Objekttypen wie Park, Spital, Restaurant, Straße oder Gebäude. Du kannst durch Tippen in dem Suchfeld nach dem gewünschten Objekttyp suchen oder das {inspect} **Info** Symbol neben dem Objekttyp anklicken um nähere Informationen zu bekommen.",
+                "fields_h": "Felder",
+                "fields_all_fields": "Der Bereich \"Alle Felder\" enthält alle Objektdetails die du bearbeiten kannst. In OpenStreetMap sind alle Felder optional und es ist okay ein Feld leer zu lassen, wenn du unsicher bist.",
+                "fields_example": "Für jeden Objekttyp werden unterschiedliche Felder angezeigt. So können für eine Straße Felder für Oberfläche und Geschwindigkeitsbeschränkung und für ein Restaurant Felder für die angebotene Küche und die Öffnungszeiten angezeigt werden.",
+                "fields_add_field": "Du kannst auch \"Feld hinzufügen\" anklicken und weitere Felder aus der Dropdown-Liste hinzufügen, beispielsweise Beschreibung, Wikipedia Link, Rollstuhlzugänglichkeit und viele mehr.",
+                "tags_h": "Eigenschaften",
+                "tags_all_tags": "Unter den Feldern kannst du den Bereich \"Alle Eigenschaften\" aufklappen und alle OpenStreetMap *Eigenschaften* des ausgewählten Objekts bearbeiten. Jede Eigenschaft besteht aus einem *Schlüssel* und einem *Wert*, damit werden alle in OpenStreetMap gespeicherten Objekte beschrieben.",
+                "tags_resources": "Das Bearbeiten der Eigenschaften von Objekten erfordert detailliertes Wissen über OpenStreetMap. Um mehr über akzeptierte Eigenschaften zu erfahren solltest du dich im [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) oder bei [Taginfo](https://taginfo.openstreetmap.org/) informieren."
+            },
+            "points": {
+                "title": "Punkte",
+                "intro": "*Punkte* können zum Darstellen von Objekten wie Geschäften, Restaurants oder Denkmälern benutzt werden. Sie kennzeichnen eine konkrete Lage und beschreiben was sich dort befindet.",
+                "add_point_h": "Punkte hinzufügen",
+                "add_point": "Um einen Punkt hinzuzufügen klicke den {point} **Punkt** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `1`. Dadurch wird der Mauszeiger zu einem Kreuz.",
+                "add_point_finish": "Um den Ort des neuen Punktes auf der Karte festzulegen bewegst du den Mauszeiger an die gewünschte Stelle und drückst die {leftclick} linke Maustaste oder die  `Leertaste`.",
+                "move_point_h": "Punkte verschieben",
+                "move_point": "Um einen Punkt zu verschieben bewegst du den Mauszeiger über den Punkt und drückst und hältst die {leftclick} linke Maustaste, während du den Punkt zu der neuen Lage bewegst.",
+                "delete_point_h": "Punkte entfernen",
+                "delete_point": "Du kannst Objekte löschen, die es in der echten Welt nicht gibt. Das Löschen eines Objektes aus OpenStreetMap entfernt es von der Karte die alle benutzen, daher solltest du sicher sein, dass es ein Objekt wirklich nicht gibt, bevor du es löscht.",
+                "delete_point_command": "Um einen Punkt zu löschen, {rightclick} rechtsklicke auf den Punkt um ihn auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {delete} **Löschen** Befehl."
+            },
+            "lines": {
+                "title": "Linien",
+                "intro": "*Linien* werden benutzt um Objekte wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. Linien sollen in der Mitte des dargestellten Objekts gezeichnet werden.",
+                "add_line_h": "Linien hinzufügen",
+                "add_line": "Um eine Linie hinzuzufügen klicke den {line} **Linie** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `2`. Dadurch wird der Mauszeiger zu einem Kreuz.",
+                "add_line_draw": "Dann bewege den Mauszeiger dorthin, wo die Linie beginnen soll und {leftclick} linksklicke oder drücke die `Leertaste` um den ersten Knoten der Linie zu platzieren. Zeichne weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichnens kannst du die Karte verschieben oder hinein zoomen, um mehr Details hinzuzufügen.",
+                "add_line_finish": "Um eine Linie zu beenden drücke `{return}` oder klicke nochmals auf den letzten Knoten.",
+                "modify_line_h": "Linien verändern",
+                "modify_line_dragnode": "Häufig siehst du Linien die nicht genau gezeichnet sind, beispielweise eine Straße, die nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Linie azupassen wählst du sie mit {leftclick} linksklick aus. Alle Knoten der Linie werden als kleine Kreise gezeichnet. Du kannst die Knoten an die richtigen Stellen verschieben.",
+                "modify_line_addnode": "Du kannst neue Knoten in einer Linie auch durch {leftclick}**x2** Doppelklicken auf die Linie oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.",
+                "connect_line_h": "Linien verbinden",
+                "connect_line": "Die Verbindung von Straßen ist wichtig für die Karte und notwendig für die Navigation.",
+                "connect_line_display": "Die Verbindungen von Straßen werden mit kleinen grauen Kreisen gezeichnet. Die Endpunkte von Linien werden mit größeren weisen Kreise gezeichnet, wenn sie nicht mit anderen Objekten verbunden sind.",
+                "connect_line_drag": "Um eine Linie mit einem anderen Objekt zu verbinden, ziehe einen Knoten der Linie auf das andere Objekt bis beide Objekte verbunden sind. Tip: Du kannst verhindern, dass Knoten mit anderen Objekten verbunden werden, indem du die `{alt}` Taste beim Verschieben gedrückt hältst.",
+                "connect_line_tag": "Wenn du weißt, dass die Kreuzung eine Ampel oder einen Zebrastreifen hat, kannst du diese erfassen, indem du den Knoten an der Kreuzung auswählst und dann im Objekteditor den richtigen Objekttyp auswählst.",
+                "disconnect_line_h": "Linien trennen",
+                "disconnect_line_command": "Um eine Straße von einem anderen Objekt zu trennen {rightclick} rechtsklicke auf den Verbindungsknoten und benutze den {disconnect} **Trennen** Befehl aus dem Bearbeitungsmenü.",
+                "move_line_h": "Linien verschieben",
+                "move_line_command": "Um eine ganze Linie zu verschieben {rightclick} rechtsklicke auf die Linie und benutze den {move} **Verschieben** Befehl aus dem Bearbeitungsmenü. Dann bewege die Maus und {leftclick} linksklicke um die Linie an der neuen Position zu platzieren.",
+                "move_line_connected": "Linien die mit anderen Objekten verbunden sind bleiben verbunden während du die Linie verschiebst. iD kann verhindern, dass du eine Linie über eine verbundene Linie hinweg schiebst.",
+                "delete_line_h": "Linien entfernen",
+                "delete_line": "Wenn eine Linie als Ganzes unrichtig ist, beispielsweise eine Straße in der echten Welt nicht existiert, kannst du sie löschen. Sei beim Löschen von Objekten vorsichtig: Das von dir benutzte Hintergrund-Bildmaterial kann veraltet sein und die Straße, die falsch aussieht, könnte einfach neu gebaut sein.",
+                "delete_line_command": "Um eine Linie zu löschen, {rightclick} rechtsklicke auf die Linie um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {delete} **Löschen** Befehl."
+            },
+            "areas": {
+                "title": "Flächen",
+                "intro": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden oder Wohngebieten darzustellen. Flächen sollen um die Ränder des Objekts herum gezeichnet werden, beispielsweise um den Grundriss eines Gebäudes.",
+                "point_or_area_h": "Punkte oder Flächen?",
+                "point_or_area": "Viele Objekte können als Punkte oder Flächen dargestellt werden. Du solltest Gebäude und Wohngebiete wenn möglich als Flächen einzeichnen. Platziere Punkte innerhalb eines Gebäudes um Geschäfte, Einrichtungen und andere Objekte im Gebäude darzustellen.",
+                "add_area_h": "Flächen hinzufügen",
+                "add_area_command": "Um eine Fläche hinzuzufügen klicke den {area} **Fläche** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `3`. Dadurch wird der Mauszeiger zu einem Kreuz.",
+                "add_area_draw": "Dann positioniere den Mauszeiger auf eine Ecke des Objekts und {leftclick} linksklicke oder drücke die `Leertaste` um den ersten Knoten am äußeren Rand der Fläche zu platzieren. Platziere weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichens kannst du die Karte zoomen oder schieben um mehr Details zu zeichnen.",
+                "add_area_finish": "Um eine Fläche zu beenden drücke `{return}` oder klicke nochmals auf den ersten oder letzten Knoten.",
+                "square_area_h": "Ecken rechtwinklig machen",
+                "square_area_command": "Viele Gebäude und andere Flächen haben rechtwinklige Ecken. Um die Ecken rechtwinklig zu machen, {rightclick} rechtsklicke auf den Rand der Fläche um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {orthogonalize} **Rechtwinklig machen** Befehl.",
+                "modify_area_h": "Flächen verändern",
+                "modify_area_dragnode": "Häufig siehst du Flächen die nicht genau gezeichnet sind, beispielweise ein Gebäude, das nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Fläche azupassen wählst du sie mit {leftclick} linksklick aus. Alle Knoten der Fläche werden als kleine Kreise gezeichnet. Du kannst die Knoten an die richtigen Stellen verschieben.",
+                "modify_area_addnode": "Du kannst neue Knoten in einer Fläche auch durch {leftclick}**x2** Doppelklicken am Rand der Fläche oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.",
+                "delete_area_h": "Flächen löschen",
+                "delete_area": "Wenn eine Fläche als Ganzes unrichtig ist, beispielsweise ein Gebäude in der echten Welt nicht existiert, kannst du es löschen. Sei beim Löschen von Objekten vorsichtig: Das von dir benutzte Hintergrund-Bildmaterial kann veraltet sein und das Gebäude, welches falsch aussieht, könnte einfach neu gebaut sein.",
+                "delete_area_command": "Um eine Fläche zu löschen, {rightclick} rechtsklicke am Rand der Fläche um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {delete} **Löschen** Befehl."
+            },
+            "relations": {
+                "title": "Relationen",
+                "intro": "Eine *Relation* ist ein spezieller Objekttyp in OpenStreetMap, der andere Objekte zusammenfasst. Die Objekte, die zu einer Relation gehören werden *Mitglieder* genannt und jedes Mitglied kann eine *Rolle* in der Relation haben.",
+                "edit_relation_h": "Relationen bearbeiten",
+                "edit_relation": "Unten im Objekteditor kannst du den Bereich \"Alle Relationen\" aufklappen und sehen, ob das ausgewählte Objekt Mitglied in einer oder mehrere Relationen ist. Du kannst auf eine Relation klicken, um sie auszuwählen und zu bearbeiten.",
+                "edit_relation_add": "Um ein Objekt zu einer Relation hinzuzufügen wählst du das Objekt aus, dann klickst du den {plus} Knopf im Bereich \"Alle Relationen\" im Objekteditor. Du kannst in der Liste eine Relation in der Nähe oder \"Neue Relation ...\" auswählen.",
+                "edit_relation_delete": "Du kannst auch den {delete} **Löschen** Knopf klicken, um das ausgewählte Objekt aus der Relationen zu entfernen. Wenn du alle Mitglieder einer Relation entfernst, wird die Relation automatisch gelöscht.",
+                "maintain_relation_h": "Relationen erhalten",
+                "maintain_relation": "Normalerweise kümmert sich iD während der Bearbeitung automatisch um die Pflege der Relationen. Du solltest aufpassen, wenn du Objekte austauscht, die Mitglieder von Relationen sein können. Wenn du beispielsweise einen Straßenabschnitt löschst und einen neuen Straßenabschnitt zeichnest, um ihn zu ersetzen, solltest du den neuen Straßenabschnitt denselben Relationen (Routen, Abbiegebeschränkungen usw.) zuweisen, in denen der gelöschte Straßenabschnitt war.",
+                "relation_types_h": "Typen von Relationen",
+                "multipolygon_h": "Multipolygone",
+                "multipolygon": "Eine Relation vom Typ *Multipolygon* ist eine Gruppe von einem oder mehreren *äußeren* Objekten und einem oder mehreren *inneren* Objekten. Die äußeren Objekte beschreiben den äußeren Rand des Multipolygons, die inneren Objekte beschreiben Teilflächen oder Löcher, die aus dem Multipolygon herausgeschnitten sind.",
+                "multipolygon_create": "Um ein Multipolygon zu erzeugen, beispielweise ein Gebäude mit einem Innenhof, zeichne sowohl das äußere als auch das innere Objekt entlang dem Rand als Fläche. Dann wähle mit `{shift}`+{leftclick} Linksklick beide Objekte aus und {rightclick} rechtsklicke und benutze den {merge} **Verbinden** Befehl aus dem Bearbeitungsmenü.",
+                "multipolygon_merge": "Verbinden von mehreren Linien oder Flächen erzeugt ein neues Multipolygon mit allen ausgewählten Objekten als Mitglieder. iD erkennt, welche Objekte in anderen enthalten sind und weist die Rollen innen und außen automatisch zu.",
+                "turn_restriction_h": "Abbiegebeschränkungen",
+                "turn_restriction": "Eine Relation vom Typ *Abbiegebeschränkung* ist eine Gruppe von Straßenabschnitten an einer Kreuzung. Abbiegebeschränkungen bestehen aus einer *von* Straße, einem *via* Knoten und einer *nach* Straße.",
+                "turn_restriction_field": "Um Abbiegebeschränkungen zu bearbeiten, wähle einen Kreuzungsknoten aus wo sich zwei oder mehr Straßen treffen. Der Objekteditor zeigt das spezielle Feld \"Abbiegebeschränkung\" mit einem Modell der Kreuzung.",
+                "turn_restriction_editing": "Im Feld \"Abbiegebeschränkungen\" wähle eine \"von\" Straße durch Klicken aus, dann siehst du ob Abbiegen zu allen \"nach\" Straßen erlaubt oder verboten ist. Du kannst das Abbiege-Symbol anklicken um zwischen erlaubt und verboten umzuschalten. iD wird die Relationen automatisch erzeugen und die Rollen \"von\", \"via\" und \"nach\" entsprechend deiner Auswahl vergeben.",
+                "route_h": "Routen",
+                "route": "Eine Relation des Typ *Route* fasst eine oder mehrere Linien zusammen, die gemeinsam ein Streckennetz wie eine Busstrecke, eine Zugstrecke oder eine Autobahnstrecke bilden.",
+                "route_add": "Um ein Objekt zu einer Route hinzuzufügen, wähle das Objekt aus und gehe im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer nahe gelegenen Relation oder einer neuen Relation hinzuzufügen.",
+                "boundary_h": "Grenzen",
+                "boundary": "Eine Relation vom Typ *Grenze* fasst eine oder mehrere Linien zusammen, die gemeinsam eine Verwaltungsgrenze bilden.",
+                "boundary_add": "Um ein Objekt zu einer Grenze hinzuzufügen, wähle das Objekt aus und gehe im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer nahe gelegenen Relation oder einer neuen Relation hinzuzufügen."
+            },
+            "imagery": {
+                "title": "Hintergrund-Bildmaterial",
+                "intro": "Das Hintergrund-Bildmaterial welches unter den Kartendaten erscheint ist eine wichtige Quelle zum Bearbeiten. Dieses Bildmaterial kann aus Luftbildern bestehen, die von Satelliten, Flugzeugen oder Drohnen gesammelt wurde, oder es können eingescannte historische Karten oder andere frei erhältliche Quelldaten sein.",
+                "sources_h": "Bildmaterial-Quellen",
+                "choosing": "Um zu sehen, welche Bildmaterial-Quellen zum Bearbeiten verfügbar sind klicke den {layers} **Hintergrundeinstellungen** Knopf auf der rechten Seite der Karte. ",
+                "sources": "Als Standard sind die [Bing](https://www.bing.com/maps/) Satellitenbilder als Hintergrundbild ausgewählt. Abhängig von der Gegend sind auch andere Bildmaterial-Quellen verfügbar. Sie können neuer sein oder eine höhere Auflösung haben, daher ist es immer sinnvoll zu prüfen, welches Bildmaterial die beste Referenz zum Bearbeiten ist.",
+                "offsets_h": "Bildmaterial-Versatz anpassen",
+                "offset": "Bildmaterial ist manchmal geringfügig zu genauen Kartendaten versetzt. Wenn du feststellst, dass viele Wege oder Gebäude gegenüber dem Hintergrund-Bildmaterial versetzt sind, dann kann es sein, dass das Bildmaterial versetzt ist, also verschiebe nicht alle Objekte damit sie zum Hintergrund passen. Stattdessen kannst du den Hintergrund anpassen, damit es zu den bestehenden Daten passt indem du den Bereich „Bildmaterial-Versatz anpassen“ unten in den Hintergrundeinstellungen aufklappst.",
+                "offset_change": "Klicke auf die kleinen Dreiecke um den Bildmaterial-Versatz in kleinen Schritten anzupassen oder halte den linken Mausknopf gedrückt und ziehe innerhalb des grauen Rechtecks um das Bildmaterial zurechtzurücken."
+            },
+            "streetlevel": {
+                "title": "Straßenfotos",
+                "intro": "Straßenfotos sind nützlich um Verkehrszeichen, Geschäfte oder andere Details die auf Satellitenbilder und Luftbildern nicht sichtbar sind zu bearbeiten. Der iD Editor unterstützt Straßenfotos von [Mapillary](https://www.mapillary.com) und [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Straßenfotos benutzen",
+                "using": "Um Straßenfotos beim Bearbeiten zu benutzen klicke den {data} **Kartendaten** Knopf auf der rechten Seite der Karte zum Einschalten oder Ausschalten der verfügbaren Bildquellen.",
+                "photos": "Wenn die Straßenfotos eingeschaltet sind, wird eine Linie entlang der Fotosequenz angezeigt. Bei höheren Zoomstufen zeigt ein Kreis jede Fotoposition an und bei noch höheren Zoomstufen zeigt ein Kegel die Richtung der Kamera während der Aufnahme an.",
+                "viewer": "Wenn du auf eine Fotoposition klickst erscheint die Fotoanzeige in der linken unteren Ecke der Karte. Die Fotoanzeige enthalt Kontroll-Knöpfe um vorwärts und rückwärts springen zu können. Es zeigt auch den Benutzernanen der Person, die das Foto erstellt hat, wann das Foto erstellt wurde und einen Link, um das Foto auf der Originalseite zu sehen."
+            },
+            "gps": {
+                "title": "GPS Tracks",
+                "intro": "GPS Tracks sind eine wertvolle Datenquelle für OpenStreetMap. Dieser Editor unterstützt lokale *.gpx*, *.geojson*, and *.kml* Dateien auf deinem Computer. Du kannst GPS Tracks mit einem Smartphone, einer Sportuhr oder mit anderen GPS-Geräten aufnehmen.",
+                "survey": "Für Informationen über das Aufzeichnen von GPS-Daten kannst du dir folgende Anleitung zur [Kartierung mit Smartphone, GPS oder Field Paper](http://learnosm.org/de/mobile-mapping/) durchlesen.",
+                "using_h": "GPS Tracks verwenden",
+                "using": "Um einen GPS Track zum Bearbeiten zu verwenden, ziehe ihn einfach auf die Karte. Wenn er erkannt wurde, wird er als helle lila Linie auf der Karte dargestellt. Klicke auf den {data} **Kartendaten** Knopf rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder den GPS-Track auf der Karte anzuzeigen.",
+                "tracing": "Der GPS Track wird nicht zu OpenStreetMap hochgeladen. Am besten verwendest du ihn als Orientierung um neue Objekte zu zeichnen.",
+                "upload": "Du kannst auch [deine GPS Tracks zu OpenStreetMap hochladen](https://www.openstreetmap.org/trace/create) damit sie von anderen Benutzern verwendet werden können."
+            }
         },
         "intro": {
             "done": "Fertig",
                     "8th-avenue": "Achte Allee",
                     "9th-avenue": "Neunte Allee",
                     "10th-avenue": "Zehnte Allee",
-                    "11th-avenue": "Elfte Straße",
-                    "12th-avenue": "Zwölfte Straße",
+                    "11th-avenue": "Elfte Allee",
+                    "12th-avenue": "Zwölfte Allee",
                     "access-point-employment": "Arbeitsmarktservice",
                     "adams-street": "Amselweg",
                     "andrews-elementary-school": "Grundschule St. Anon",
                     "armitage-street": "Am Sportplatz",
                     "barrows-school": "Bischöfliches Gymnasium",
                     "battle-street": "Birkenweg",
-                    "bennett-street": "Bergstraße",
+                    "bennett-street": "Brunngasse",
                     "bowman-park": "Bayernpark",
                     "collins-drive": "Kiefernweg",
                     "conrail-railroad": "Chiemseebahn",
                     "cushman-street": "Kiefernweg",
                     "dollar-tree": "Vintys Second Hand",
                     "douglas-avenue": "Dorfallee",
-                    "east-street": "Oststraße",
+                    "east-street": "Osserweg",
                     "elm-street": "Eichenweg",
                     "flower-street": "Blumenstraße",
-                    "foster-street": "Forststraße",
-                    "french-street": "Frankenstraße",
+                    "foster-street": "Forchheimerstraße",
+                    "french-street": "Frauengasse",
                     "garden-street": "Gartenstraße",
                     "gem-pawnbroker": "Dorotheum",
                     "golden-finch-framing": "Preiner",
-                    "grant-avenue": "Göthestraße",
+                    "grant-avenue": "Glockenstraße",
                     "hoffman-pond": "Hilmteich",
                     "hoffman-street": "Heideweg",
                     "hook-avenue": "Hollunderweg",
                     "main-street-barbell": "Bodyfit",
                     "main-street-cafe": "Café Simon",
                     "main-street-fitness": "fitinn",
-                    "main-street": "Lufwigstraße",
+                    "main-street": "Neuburger Straße",
                     "maple-street": "Mühlenweg",
                     "marina-park": "Marina Park",
-                    "market-street": "Markstraße",
+                    "market-street": "Marktgasse",
                     "memory-isle-park": "Donauinsel Park",
                     "memory-isle": "Donauinsel",
-                    "michigan-avenue": "Regenbuerger Straße",
-                    "middle-street": "Mittelstraße",
+                    "michigan-avenue": "Regensburger Straße",
+                    "middle-street": "Milchgasse",
                     "millard-street": "Meisenweg",
-                    "moore-street": "Mühlenstraße",
+                    "moore-street": "Mozartstraße",
                     "morris-avenue": "Meisenweg",
                     "mural-mall": "Franziskanergasse",
                     "paisanos-bar-and-grill": "Altes Bräuhaus",
                     "paisley-emporium": "Stadtgalerie",
                     "paparazzi-tattoo": "Ink of Hell Tattoo",
-                    "pealer-street": "Parkstraße",
+                    "pealer-street": "Pionierstraße",
                     "pine-street": "Pappelweg",
                     "pizza-hut": "Pizzeria Gallo Nero",
-                    "portage-avenue": "Alte Poststraße",
+                    "portage-avenue": "Donaustraße",
                     "portage-river": "Inn",
                     "preferred-insurance-services": "Zürich Versicherungs-AG",
                     "railroad-drive": "Bahnhofstraße",
-                    "river-city-appliance": "Haushaltswaren Rauch",
-                    "river-drive": "Flussstraße",
+                    "river-city-appliance": "Himmel",
+                    "river-drive": "Innbrückgasse",
                     "river-road": "Flussweg",
-                    "river-street": "Ringstraße",
+                    "river-street": "Innkai",
                     "riverside-cemetery": "Innstadt Friedhof",
                     "riverwalk-trail": "Bachweg",
                     "riviera-theatre": "Schauspielhaus",
                     "rocky-river": "Ilz",
                     "saint-joseph-river": "Inn",
-                    "scidmore-park-petting-zoo": "Klostergarten Streichelzoo",
-                    "scidmore-park": "Klostergarten",
+                    "scidmore-park-petting-zoo": "Bschuettpark Streichelzoo",
+                    "scidmore-park": "Bschuettpark",
                     "scouter-park": "Skatepar",
-                    "sherwin-williams": "Kaspar Harnisch",
-                    "south-street": "Südstraße",
+                    "sherwin-williams": "PROSOL Lacke+Farben",
+                    "south-street": "Südtirolerstraße",
                     "southern-michigan-bank": "Stadtsparkasse",
-                    "spring-street": "Gartenstraße",
+                    "spring-street": "Frühlingstraße",
                     "sturgeon-river-road": "Ilzbachweg",
                     "three-rivers-city-hall": "Rathaus",
                     "three-rivers-elementary-school": "Volksschule",
                     "three-rivers-post-office": "Hauptpost",
                     "three-rivers-public-library": "Stadtbibliothek",
                     "three-rivers": "Drei-Flüsse-Stadt",
-                    "unique-jewelry": "Juwelie",
-                    "walnut-street": "Waldstraße",
+                    "unique-jewelry": "CHRIST Juweliere",
+                    "walnut-street": "Volgerweiderstraße",
                     "washington-street": "Schillerstraße",
-                    "water-street": "Bachstraße",
-                    "west-street": "Weststraße",
-                    "wheeler-street": "Wilhelmstraße",
+                    "water-street": "Badhausgasse",
+                    "west-street": "Westraße",
+                    "wheeler-street": "Wolf-Huber-Straße",
                     "william-towing": "Autowerkstatt",
-                    "willow-drive": "Wilhelmstraße",
+                    "willow-drive": "Innpromenade",
                     "wood-street": "Weidenweg",
                     "world-fare": "Orange and Green"
                 }
             },
             "navigation": {
                 "title": "Navigation",
-                "drag": "Der Kartenbereich zeigt die OpenStreetMap Daten über einem Hintergrund.{br}Du kannst die Karte verschieben, drücke und halte dazu die linke Maustaste während du die Maus verschiebst. Du kannst auch die Pfeiltasten auf der Tastatur benutzen. **Verschiebe die Karte!**",
+                "drag": "Der Kartenbereich zeigt die OpenStreetMap Daten über einem Hintergrund.{br}Du kannst die Karte verschieben, drücke und halte dazu die linke Maustaste, während du die Maus verschiebst. Du kannst auch die Pfeiltasten auf der Tastatur benutzen. **Verschiebe die Karte!**",
                 "zoom": "Du kannst durch Drehen am Mausrad oder am Trackpad hinein oder heraus zoomen, du kannst dazu auch die {plus} / {minus} Knöpfe klicken. **Zoome die Karte!**",
-                "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden. Alles in der echten Welt kann als ein Objekt in OpenStreetMap gezeichnet werden.",
+                "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet werden.",
                 "points_lines_areas": "Objekte werden auf der Karte als Punkte, Linien oder Flächen dargestellt.",
                 "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt.",
                 "click_townhall": "Alle Objekte auf der Karte können durch Klicken ausgewählt werden. **Klicke auf den Punkt um ihn zu auszuwählen.**",
                 "selected_townhall": "Super! Der Punkt ist jetzt ausgewählt. Ausgewählte Objekte werden mit einem pulsierenden Schimmer gezeichnet.",
                 "editor_townhall": "Wenn ein Objekt ausgewählt ist wird der *Objekteditor* neben der Karte angezeigt.",
                 "preset_townhall": "Der obere Teil des Objekteditors zeigt den Typ des Objekts. Dieser Punkt ist ein {preset}.",
-                "fields_townhall": "Der mittlere Teil des Objekteditors enthält *Felder* mit den Eigenschaften des Objektes wie Name oder Adresse",
+                "fields_townhall": "Der mittlere Bereich des Objekteditors enthält *Felder* mit den Merkmalen des Objektes wie Name oder Adresse",
                 "close_townhall": "**Schließe den Objekteditor durch Drücken von Escape oder durch Klicken auf {button} Knopf in der oberen Ecke.**",
                 "search_street": "Du kannst Objekte in der aktuellen Kartenansicht oder weltweit suchen. **Suche nach '{name}'.**",
                 "choose_street": "**Wähle {name} aus der Liste.**",
                 "selected_street": "Super! Die {name} ist jetzt ausgewählt.",
-                "editor_street": "Die angezeigten Felder für die Straße unterscheiden sich von denen für das Rathaus.{br}Für diese Straße zeigt der Objekteditor Felder wie {field1} oder {field2}. **Schließe den Objekteditor durch Drücken von Escape oder Klicken auf {button} Knopf.**",
-                "play": "Versuche die Karte zu verschieben und auf andere Objekte zu klicken, damit du siehst welche Dinge zu OpenStreetMap hinzugefügt werden können. **Wenn du zum nächsten Kapitel willst klicke '{next}'.**"
+                "editor_street": "Für die Straße werden andere Felder als für das Rathaus angezeigt.{br}Für diese ausgewählte Straße zeigt der Objekteditor Felder wie {field1} oder {field2}. **Schließe den Objekteditor durch Drücken von Escape oder Klicken auf {button} Knopf.**",
+                "play": "Versuche die Karte zu verschieben und auf andere Objekte zu klicken, damit du siehst welche Dinge zu OpenStreetMap hinzugefügt werden können. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**"
             },
             "points": {
                 "title": "Punkte",
-                "add_point": "Mit *Punkten* können Objekte wie Geschäfte, Restaurants und Denkmäler erfasst werden.{br}Sie markieren eine genaue Lage und beschreiben was dort ist. **Klicke auf {button} Punkt um einen neuen Punkt hinzuzufügen.**",
+                "add_point": "*Punkte* können benutzt werden um Objekte wie Geschäfte, Restaurants oder Denkmäler darzustellen.{br}Sie kennzeichnen eine konkrete Lage und beschreiben was dort ist. **Klicke auf {button} Punkt um einen neuen Punkt zu zeichnen.**",
                 "place_point": "Um den neuen Punkt auf der Karte zu positionieren bewege den Mauszeiger auf die gewünschte Position des Punktes und klicke oder drücke die Leertaste. **Bewege den Mauszeiger über dieses Gebäude und klicke oder drücke die Leertaste.**",
-                "search_cafe": "Es gibt viele verschiedene Objekte die als Punkte gezeichnet werden können. Der gerade gezeichnete Punkt ist ein Café. **Suche nach '{preset}'.**",
+                "search_cafe": "Es gibt viele verschiedene Objekte die als Punkte dargestellt werden können. Der gerade hinzugefügte Punkt ist ein Café. **Suche nach '{preset}'.**",
                 "choose_cafe": "**Wähle {preset} aus der Liste.**",
                 "feature_editor": "Der Punkt ist nun ein Café. Mit dem Objekteditor kannst du mehr Information über das Café eingeben.",
-                "add_name": "In OpenStreetMap sind alle Felder optional und es ist okay Felder frei zu lassen wenn du unsicher bist.{br}Nehmen wir an du hättest lokales Wissen und kennst den Namen dieses Cafés. **Gib einen Namen für das Café ein.**",
+                "add_name": "In OpenStreetMap sind alle Felder optional und es ist okay Felder frei zu lassen, wenn du unsicher bist.{br}Nehmen wir an du hättest lokales Wissen und kennst den Namen dieses Cafés. **Gib einen Namen für das Café ein.**",
                 "add_close": "Der Objekteditor merkt sich alle deine Änderungen automatisch. **Wenn du den Namen fertig eingegeben hast, drücke Escape oder Enter oder klicke den {button} Knopf um den Objekteditor zu schließen.**",
-                "reselect": "Oft gibt es Punkte die unvollständig oder fehlerhaft sind. Du kannst bestehende Punkte bearbeiten. **Klicke auf das gerade erzeugte Café um es auszuwählen.**",
+                "reselect": "Oft gibt es Punkte die fehlerhaft oder unvollständig sind. Du kannst bestehende Punkte bearbeiten. **Klicke auf das gerade erzeugte Café um es auszuwählen.**",
                 "update": "Gib mehr Details über dieses Café ein. Du kannst seinen Namen ändern, angeben welche Küche dort angeboten wird oder die Adresse eingeben. **Ändere die Details des Café.**",
                 "update_close": "Wenn du das Café fertig geändet hast, drücke Escape oder oder klicke den {button} Knopf um den Objekteditor zu schließen.**",
-                "rightclick": "Du kannst jedes Objekt rechtsklicken um das *Bearbeitungs-Menü* zu sehen, welches dir die Bearbeitungs-Möglichkeiten zeigt. **Wähle des erzeugten Punkt durch Rechts-Klicken aus und zeige das Bearbeitungs-Menü.**",
-                "delete": "Du kannst Objekte löschen, die es in der echten Welt nicht gibt.{br}Löschen eines Objekts aus OpenStreetMap entfernt es von der Karte, die alle benutzen. Daher solltest du dir sicher sein, dass es das Objekt nicht mehr gibt, bevor du es löschst. **Klicke auf {button}-Knopf um den Punkt zu löschen.**",
+                "rightclick": "Du kannst jedes Objekt rechtsklicken um das *Bearbeitungs-Menü* zu sehen, welches dir die Bearbeitungs-Möglichkeiten zeigt. **Wähle den erzeugten Punkt durch Rechtsklicken aus und zeige das Bearbeitungs-Menü.**",
+                "delete": "Du kannst Objekte löschen, die es in der echten Welt nicht gibt.{br}Löschen eines Objekts aus OpenStreetMap entfernt es von der Karte, die alle benutzen. Daher solltest du dir sicher sein, dass es das Objekt wirklich nicht gibt, bevor du es löschst. **Klicke auf {button} Knopf um den Punkt zu löschen.**",
                 "undo": "Du kannst alle Änderungen rückgängig machen, bis du deine Bearbeitungen zu OpenStreetMap hochgeladen hast. **Klicke auf  {button} Knopf um das Löschen rückgängig zu machen und den Punkt wiederherzustellen.**",
-                "play": "Nachdem du jetzt Punkte erzeugen und bearbeiten kannst, versuche zur Übung ein paar Punkte zu erzeugen! **Wenn du zum nächsten Kapitel willst klicke '{next}'.**"
+                "play": "Nachdem du jetzt Punkte erzeugen und bearbeiten kannst, versuche zur Übung ein paar Punkte zu erzeugen! **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**"
             },
             "areas": {
                 "title": "Flächen",
-                "add_playground": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden und Wohngebieten zu zeigen.{br}Sie können benutzt werden, um Objekte die normalerweise als Punkte gezeichnet werden, genauer darzustellen. **Klicke auf {button} Fläche um einen neue Fläche zu zeichnen.**",
-                "start_playground": "Zeichne diesen Spielplatz als Fläche auf der Karte ein. Flächen werden gezeichnet indem *Knoten* entlang der Außengrenze des Objekte gezeichnet werden. **Klicke oder drücke die Leertaste um den ersten Knoten an einer Ecke des Spielplatzes zu zeichnen.**",
-                "continue_playground": "Setze das Zeichnen der Fläche fort, indem du Knoten entlang der Ecken des Spielplatzes setzt. Es ist okay, wenn du die Fläche mit bestehenden Fußwegen verbindest.{br}Tip: Wenn du die '{alt}' Taste gedrückt hältst, kannst du verhindern, dass die Knoten sich mit anderen Objekten verbinden. **Setze das Zeichnen der Fläche für den Spielplatz fort.**",
+                "add_playground": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden oder Wohngebieten darzustellen.{br}Sie können auch benutzt werden um Objekte, die normalerweise als Punkte gezeichnet werden, genauer darzustellen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**",
+                "start_playground": "Zeichne diesen Spielplatz als Fläche auf der Karte ein. Flächen werden gezeichnet indem *Knoten* entlang des äußeren Randes des Objekte gezeichnet werden. **Klicke oder drücke die Leertaste um den ersten Knoten an einer Ecke des Spielplatzes zu zeichnen.**",
+                "continue_playground": "Setze das Zeichnen der Fläche fort, indem du Knoten entlang des Randes des Spielplatzes setzt. Es ist okay, wenn du die Fläche mit bestehenden Fußwegen verbindest.{br}Tip: Wenn du die '{alt}' Taste gedrückt hältst, kannst du verhindern, dass die Knoten sich mit anderen Objekten verbinden. **Setze das Zeichnen der Fläche für den Spielplatz fort.**",
                 "finish_playground": "Beende die Fläche durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten. **Beende das Zeichnen der Fläche für den Spielplatz.**",
                 "search_playground": "**Suche nach '{preset}'.**",
                 "choose_playground": "**Wähle {preset} aus der Liste.**",
                 "choose_field": "**Wähle {field} aus der Liste.**",
                 "retry_add_field": "Du hast das Feld {field} nicht ausgewählt. Versuche es nochmals.",
                 "describe_playground": "**Füge eine Beschreibung ein, dann klicke auf {button} Knopf um den Objekteditor zu schließen.**",
-                "play": "Gut gemacht! Versuche einige weitere Flächen zu zeichnen und schaue welche anderen Flächentypen du zu OpenStreetMap hinzufügen kannst. **Wenn du zum nächsten Kapitel willst klicke '{next}'.**"
+                "play": "Gut gemacht! Versuche mehr Flächen zu zeichnen und suche nach anderen Flächentypen du zu OpenStreetMap hinzufügen kannst. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**"
             },
             "lines": {
                 "title": "Linien",
-                "add_line": "*Linien* werden benutzt um Objekt wie Straßen, Eisenbahnschienen und Flüsse zu zeichnen. **Klicke auf {button} Linie um eine neue Linie zu zeichnen.**",
+                "add_line": "*Linien* werden benutzt um Objekt wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. **Klicke auf {button} Linie um eine neue Linie zu zeichnen.**",
                 "start_line": "Hier gibt es eine Straße die in OpenStreetMap fehlt.{br}Zeichne sie ein! In OpenStreetMap soll die Linie in der Mitte der Straße gezeichnet werden. Du kannst die Karte während des Zeichnen verschieben, wenn das notwendig ist. **Beginne die neue Linie durch Klicken auf das obere Ende der fehlenden Straße.**",
-                "intersect": "Du kannst neue Knoten durch Klicken oder Drücken der Leertaste erzeugen.{br} Straßen und viele andere Arten von Linien sind Teil eines größeren Netzwerks. Es ist wichtig dass diese Linien verbunden sind, damit Routing-Anwendungen funktionieren. **Klicke auf {name} um eine Verbindung zwischen den beiden Linien zu erzeugen.**",
+                "intersect": "Du kannst neue Knoten durch Klicken oder Drücken der Leertaste erzeugen.{br} Straßen und viele andere Typen von Linien sind Teil eines größeren Netzwerks. Es ist wichtig dass diese Linien verbunden sind, damit Routing-Anwendungen funktionieren. **Klicke auf {name} um eine Verbindung zwischen den beiden Linien zu erzeugen.**",
                 "retry_intersect": "Diese Straße soll {name} kreuzen. Versuch es nochmals!",
                 "continue_line": "Setze das Zeichnen der Linie für die neue Straße fort. Du kannst die Karte verschieben, wenn das notwendig ist.{br}Wenn du fertig gezeichnet hast klicke nochmals auf den letzten Knoten. **Beende das Zeichnen der Straße.**",
                 "choose_category_road": "**Wähle {category} aus der Liste.**",
-                "choose_preset_residential": "Es gibt viele verschiedene Arten von Straßen, diese ist eine Anliegerstraße. **Wähle {preset}.**",
-                "retry_preset_residential": "Du hast nicht {preset} gewählt. **Klicke hier um erneut zu wählen.**",
+                "choose_preset_residential": "Es gibt viele verschiedene Typen von Straßen, diese ist eine Anliegerstraße. **Wähle {preset}.**",
+                "retry_preset_residential": "Du hast nicht {preset} ausgewählt. **Klicke hier um erneut zu wählen.**",
                 "name_road": "**Gib dieser Straße einen Namen, dann drücke Escape oder Enter oder klicke den {button} Knopf um den Objekteditor zu schließen.**",
-                "did_name_road": "Schaut gut aus! Jetzt wirst du lernen, wie die den Zustand einer Linie verbessern kannst.",
-                "update_line": "Manchmal musst du den Zustand einer bestehenden Linie ändern. Hier ist eine Straße die nicht ganz richtig ausschaut.",
+                "did_name_road": "Sieht gut aus! Jetzt wirst du lernen, wie die den Zustand einer Linie verbessern kannst.",
+                "update_line": "Manchmal musst du den Zustand einer bestehenden Linie ändern. Hier ist eine Straße die nicht ganz richtig aussieht.",
                 "add_node": "Du kannst weitere Knoten zu einer Linie hinzufügen, um den Zustand einer Linie zu verbessern. Eine Möglichkeit um neue Knoten zu zeichnen ist ein Doppelklick auf die Stelle der Linie, wo der neue Knoten entstehen soll. **Doppelklicke auf die Linie um einen neuen Knoten zu erzeugen.**",
-                "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie verschieben, indem du den Knoten anklickst, den Mausknopf gedrückt hältst und den Knoten verschiebst. **Schiebe den letzen Knoten der Linie dorthin wo sich diese Straßen kreuzen sollen.**",
-                "finish_drag_endpoint": "Hier schaut es gut aus. **Lass den Mausknopf aus um das Verschieben zu beenden.**",
+                "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie durch Klicken und Festhalten des linken Mausknopfs verschieben. **Schieb den letzen Knoten der Linie dorthinm wo sich diese Straßen kreuzen sollen.**",
+                "finish_drag_endpoint": "Hier sieht es gut aus. **Lass den Mausknopf aus um das Verschieben zu beenden.**",
                 "start_drag_midpoint": "Kleine Dreiecke werden am *Mittelpunkt* zwischen zwei Knoten angezeigt. Eine weitere Möglichkeit um einen neuen Knoten zu erzeugen ist das Verschieben dieses Mittelpunkts zu einer neuen Lage. **Schiebe den Mittelpunkt und erzeuge damit einen neuen Knoten in der Straßenkurve.**",
-                "continue_drag_midpoint": "Diese Linie schaut viel besser aus! Setze das Anpassen der Linie durch Doppelklicken oder Verschieben von Mittelpunkten fort, bis die Kurve dem Straßenverlauf folgt. **Wenn Dir die Linie gefällt, klicke OK.**",
+                "continue_drag_midpoint": "Diese Linie sieht viel besser aus! Setze das Anpassen der Linie durch Doppelklicken oder Verschieben von Mittelpunkten fort, bis die Kurve dem Straßenverlauf folgt. **Wenn Dir die Linie gefällt, klicke OK.**",
                 "delete_lines": "Wenn es Straßen in der echten Welt nicht gibt, kannst du die zugehörigen Linien löschen.{br}Hier hat die Stadt eine {street} geplant, aber nie gebaut. Du kannst diesen Teil der Karte verbessern, wenn du die zusätzlichen Linien löschst.",
-                "rightclick_intersection": "Die letzte bestehende Straße ist {street1}, daher wirst du die {street2} an dieser Kreuzung teilen und alle darüber löschen. **Rechtsklicke auf den Kreuzungs-Knoten:**",
+                "rightclick_intersection": "Die letzte bestehende Straße ist {street1}, daher wirst du die {street2} an dieser Kreuzung teilen und alles darüber löschen. **Rechtsklicke auf den Kreuzungs-Knoten:**",
                 "split_intersection": "**Klicke auf {button} Knopf um die {street} zu teilen.**",
                 "retry_split": "Du hast den Teilen-Knopf nicht gedrückt. Versuch es nochmals.",
-                "did_split_multi": "Gut gemacht! Die {street1} ist jetzt in zwei Teile geteilt, der obere Teil kann gelöscht werden. **Klicke den oberen Teil der {street2} an.**",
+                "did_split_multi": "Gut gemacht! Die {street1} ist jetzt in zwei Teile geteilt, der obere Teil kann gelöscht werden. **Klicke den oberen Teil der {street2} zum Auswählen an.**",
                 "did_split_single": "**Klicke den oberen Teil von {street2} zum auswählen.**",
-                "multi_select": "Die {selected} ist jetzt gewählt. Wähle zusätzlich die {other1}. Du kannst Shift-Klicken, also Shift festhalten und klicken um mehrere Objekte zu wählen. **Shift-Klicke auf die {other2}.**",
+                "multi_select": "Die {selected} ist jetzt ausgewählt. Wähle zusätzlich die {other1} aus. Du kannst Shift-Klicken um mehrere Objekte zu wählen. **Shift-Klicke auf die {other2}.**",
                 "multi_rightclick": "Gut! Beide zu löschenden Linien sind jetzt ausgewählt. **Rechtsklicke auf eine der beiden Linien um das Bearbeitungs-Menü zu zeigen.**",
                 "multi_delete": "**Klicke auf {button} Knopf um die zusätzlichen Linien zu löschen.**",
                 "retry_delete": "Du hast den Löschen-Knopf nicht geklickt. Versuche es nochmals.",
-                "play": "Großartig! Du kannst jetzt das Gelernte verwenden und das Bearbeiten von Linien üben. **Wenn du zum nächsten Kapitel willst klicke '{next}'.**"
+                "play": "Großartig! Verwende das Gelernte um das Bearbeiten von Linien zu üben. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**"
             },
             "buildings": {
                 "title": "Gebäude",
-                "add_building": "OpenStreetMap ist die größte Gebäude-Datenbank der Welt.{br}Du kannst helfen diese Datenbank zu verbessern indem du Gebäude einzeichnest, die in der Karte noch fehlen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**",
-                "start_building": "Zeichne dieses Gebäude in der Karte ein, indem du seine Umrisse zeichnest.{br}Gebäude sollten entlang ihrer Grundfläche so genau wie möglich gezeichnet werden. **Klick oder drücke die Leertaste um den Startknoten auf einer Ecke des Gebäudes zu zeichnen.**",
-                "continue_building": "Erstelle weitere Knoten um den Umriss des Gebäudes zu zeichnen. Du kannst hinein zoomen wenn du genauer zeichnen willst.{br}Beende das Gebäude durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten.**Beende den Umriss des Gebäudes.**",
-                "retry_building": "Es schaut so aus als hättest du die Knoten nicht auf die Ecken des Gebäudes gesetzt. Versuche es noch einmal!",
+                "add_building": "OpenStreetMap ist die größte Gebäude-Datenbank der Welt.{br}Du kannst helfen diese Datenbank zu verbessern, indem du Gebäude einzeichnest, die in der Karte noch fehlen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**",
+                "start_building": "Zeichne dieses Gebäude in der Karte ein, indem du seinen Umriss nachzeichnest.{br}Gebäude sollten entlang ihrer Grundfläche so genau wie möglich gezeichnet werden. **Klick oder drücke die Leertaste um den Startknoten auf einer Ecke des Gebäudes zu zeichnen.**",
+                "continue_building": "Erstelle weitere Knoten um den Umriss des Gebäudes nachzuzeichnen. Du kannst hinein zoomen, wenn du mehr Details zeichnen willst.{br}Beende das Gebäude durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten.**Beende den Umriss des Gebäudes.**",
+                "retry_building": "Es sieht so aus als hättest du die Knoten nicht auf die Ecken des Gebäudes gesetzt. Versuche es noch einmal!",
                 "choose_category_building": "**Wähle {category} aus der Liste.**",
-                "choose_preset_house": "Es gibt viele verschiedene Arten von Gebäuden, dieses ist eindeutig ein Einfamilienhaus.{br}Wenn du beim Gebäudetyp unsicher bist, wähle einfach Gebäude. **Wähle {preset}.**",
+                "choose_preset_house": "Es gibt viele verschiedene Typen von Gebäuden, dieses ist eindeutig ein Einfamilienhaus.{br}Wenn du beim Gebäudetyp unsicher bist, wähle einfach Gebäude. **Wähle {preset}.**",
                 "close": "**Drücke Escape oder klicke auf {button} Knopf um dem Objekteditor zu schließen.**",
                 "rightclick_building": "**Rechtsklicke das gerade erzeugte Gebäude um es auszuwählen und zeige das Bearbeitungs-Menü.**",
-                "square_building": "Das gerade gezeichnete Haus schaut besser aus, wenn es perfekt rechtwinklige Ecken hat. **Klicke auf {button} Knopf um die Gebäudeecken rechtwinklig zu machen.**",
+                "square_building": "Das gerade gezeichnete Haus sieht besser aus, wenn es perfekt rechtwinklige Ecken hat. **Klicke auf {button} Knopf um die Gebäudeecken rechtwinklig zu machen.**",
                 "retry_square": "Du hast nicht den Rechtwinklig-Machen-Knopf geklickt. Versuch es noch einmal.",
-                "done_square": "Siehst du wie die Ecken des Gebäude auf die richtige Stelle rücken? Schaut Dir noch einen anderen nützlichen Trick an.",
+                "done_square": "Siehst du wie die Ecken des Gebäude auf die richtige Stelle rücken? Lass uns einen weiteren nützlichen Trick lernen.",
                 "add_tank": "Als Nächstes wirst du einen kreisrunden Tank zeichnen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**",
-                "start_tank": "Du musst keinen perfekten Kreis zeichnen. Zeichne einfach eine Fläche innerhalb des Tanks die seinen Rand berührt. **Klicke oder drücke die Leertaste um den ersten Knoten an Rand des Lagertanks zu zeichnen.**",
+                "start_tank": "Du musst keinen perfekten Kreis zeichnen. Zeichne einfach eine Fläche innerhalb des Tanks die seinen Rand berührt. **Klicke oder drücke die Leertaste um den ersten Knoten an Rand des Tanks zu zeichnen.**",
                 "continue_tank": "Zeichne noch zwei weitere Knoten am Rand. Der Kreis wird außerhalb der gezeichneten Knoten erzeugt.{br}Beende die Fläche durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten.**Zeichne den Tank fertig.**",
                 "search_tank": "**Suche nach '{preset}'.**",
                 "choose_tank": "**Wähle {preset} von der Liste.**",
                 "rightclick_tank": "**Wähle den gezeichneten Tank durch Rechtsklicken aus und zeige das Bearbeitungs-Menü.**",
                 "circle_tank": "**Klicke auf {button} Knopf um den Tank kreisförmig zu machen.**",
                 "retry_circle": "**Du hast nicht den Kreisförmig-machen Knopf gedrückt. Versuche es noch einmal.",
-                "play": "Super Arbeit! Zeichne zur Übung weitere Gebäude und probiere dabei andere Möglichkeiten im Bearbeitungs-Menü. **Wenn du zum nächsten Kapitel willst klicke '{next}'.**"
+                "play": "Gut gemacht! Zeichne zur Übung weitere Gebäude und probiere dabei andere Befehle im Bearbeitungs-Menü aus. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**"
             },
             "startediting": {
                 "title": "Bearbeiten beginnen",
-                "help": "Du bist nun bereit OpenStreetMap zu bearbeiten!{br}Du kannst mit dem {button} Hilfe-Knopf oder der '{key}'-Taste diesen Rundgang wieder aufrufen oder mehr Dokumentation ansehen.",
-                "shortcuts": "Du kannst eine Liste der Kommandos mit ihren Tastenkürzeln mit der '{key}'-Taste ansehen.",
+                "help": "Du bist nun bereit OpenStreetMap zu bearbeiten!{br}Du kannst mit dem {button} Hilfe-Knopf oder der '{key}'-Taste mehr Dokumentation ansehen und diesen Rundgang wieder aufrufen.",
+                "shortcuts": "Du kannst eine Liste der Befehle zusammen mit ihren Tastenkürzeln durch Drücken der '{key}'-Taste ansehen.",
                 "save": "Vergiss nicht, regelmäßig zu speichern, um die Änderungen zu OpenStreetMap hochzuladen!",
                 "start": "Beginne mit dem Bearbeiten!"
             }
                     "background_switch": "Auf letzten Hintergrund zurückschalten",
                     "map_data": "Kartendaten-Optionen ein-/ausblenden",
                     "fullscreen": "Vollbildmodus ein-/ausschalten",
-                    "wireframe": "Gitter-Modus ein-/ausschalten",
+                    "wireframe": "Gittermodus ein-/ausschalten",
                     "minimap": "Minimap ein-/ausblenden"
                 },
                 "selecting": {
                     "title": "Objekte auswählen",
                     "select_one": "Einzelnes Objekt auswählen",
                     "select_multi": "Mehrere Objekte auswählen",
-                    "lasso": "Ziehe ein Lasso um die Objekte herum"
+                    "lasso": "Ziehe ein Auswahl-Lasso um die Objekte herum",
+                    "search": "Finde Objekte die zum Suchtext passen"
                 },
                 "with_selected": {
                     "title": "Mit gewähltem Objekt",
                 },
                 "vertex_selected": {
                     "title": "Mit gewähltem Knoten",
-                    "previous": "Voriger Knoten ",
+                    "previous": "Vorheriger Knoten ",
                     "next": "Nächster Knoten",
                     "first": "Erster Knoten",
                     "last": "Letzter Knoten",
                     "add_area": "'Neue Fläche hinzufügen' (Modus)",
                     "place_point": "Punkt platzieren",
                     "disable_snap": "Festhalten um Punkt beim Platzieren nicht zu vereinigen",
-                    "stop_line": "Zeichnen einer Linie oder Fläche abschließen"
+                    "stop_line": "Zeichnen einer Linie oder Fläche beenden"
                 },
                 "operations": {
                     "title": "Tätigkeiten",
-                    "continue_line": "Linie am gewählten Knoten fortsetzen",
-                    "merge": "Vereinige die gewählten Objekte",
-                    "disconnect": "Objekte am gewählten Knoten trennen",
-                    "split": "Linie am gewählten Knoten in zwei Linien teilen",
-                    "reverse": "Richtung der Linie umkehren",
-                    "move": "Gewählte Objekte verschieben",
-                    "rotate": "Gewählte Objekte drehen",
-                    "orthogonalize": "Linie gerade biegen / Ecken rechtwinklig machen",
+                    "continue_line": "Linie am ausgewählten Knoten fortsetzen",
+                    "merge": "Vereinige die ausgewählten Objekte",
+                    "disconnect": "Objekte am ausgewählten Knoten trennen",
+                    "split": "Linie am ausgewählten Knoten in zwei Linien teilen",
+                    "reverse": "Richtung der Linie umdrehen",
+                    "move": "Ausgewählte Objekte verschieben",
+                    "rotate": "Ausgewählte Objekte drehen",
+                    "orthogonalize": "Linie begradigen / Ecken rechtwinklig machen",
                     "circularize": "Geschlossene Linie/Fläche kreisförmig machen",
                     "reflect_long": "Objekte an der lange Achse spiegeln",
                     "reflect_short": "Objekte an der kurzen Achse spiegeln",
-                    "delete": "Gewählte Objekte löschen"
+                    "delete": "Ausgewählte Objekte löschen"
                 },
                 "commands": {
                     "title": "Befehle",
-                    "copy": "Gewählte Objekte kopieren",
+                    "copy": "Ausgewählte Objekte kopieren",
                     "paste": "Kopierte Objekte einfügen",
                     "undo": "Letzte Bearbeitung rückgängig machen",
                     "redo": "Letzte Bearbeitung wiederherstellen",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} sq ft",
+            "square_miles": "{quantity} sq mi",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "O",
+            "west": "W",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Marke"
                 },
+                "brewery": {
+                    "label": "Fassbiere"
+                },
                 "bridge": {
                     "label": "Typ",
                     "placeholder": "Standard"
                     "label": "Kapazität",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Richtung",
-                    "options": {
-                        "E": "Ost",
-                        "ENE": "Ost-Nordost",
-                        "ESE": "Ost-Südost",
-                        "N": "Nord",
-                        "NE": "Nordost",
-                        "NNE": "Nord-Nordost",
-                        "NNW": "Nord-Nordwest",
-                        "NW": "Nordwest",
-                        "S": "Süd",
-                        "SE": "Südost",
-                        "SSE": "Süd-Südost",
-                        "SSW": "Süd-Südwest",
-                        "SW": "Südwest",
-                        "W": "West",
-                        "WNW": "West-Nordwest",
-                        "WSW": "West-Südwest"
-                    }
-                },
                 "castle_type": {
                     "label": "Typ"
                 },
-                "clock_direction": {
-                    "label": "Richtung",
-                    "options": {
-                        "anticlockwise": "gegen den Uhrzeigersinn",
-                        "clockwise": "im Uhrzeigersinn"
-                    }
-                },
                 "clothes": {
                     "label": "Kleidung"
                 },
                 "diaper": {
                     "label": "Windelwechseln möglich"
                 },
+                "direction": {
+                    "label": "Drehrichtung (Grad im Uhrzeigersinn)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Drehrichtung",
+                    "options": {
+                        "E": "Ost",
+                        "ENE": "Ostnordost",
+                        "ESE": "Ostsüdost",
+                        "N": "Nord",
+                        "NE": "Nordost",
+                        "NNE": "Nordnordost",
+                        "NNW": "Nordnordwest",
+                        "NW": "Nordwest",
+                        "S": "Süd",
+                        "SE": "Südost",
+                        "SSE": "Südsüdost",
+                        "SSW": "Südsüdwest",
+                        "SW": "Südwest",
+                        "W": "West",
+                        "WNW": "Westnordwest",
+                        "WSW": "Westsüdwest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Drehrichtung",
+                    "options": {
+                        "anticlockwise": "gegen den Uhrzeigersinn",
+                        "clockwise": "im Uhrzeigersinn"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Drehrichtung",
+                    "options": {
+                        "backward": "Rückwärts",
+                        "both": "Beide / Alle",
+                        "forward": "Vorwärts"
+                    }
+                },
                 "display": {
                     "label": "Anzeige"
                 },
                     "label": "Geländer"
                 },
                 "hashtags": {
-                    "label": "vorgeschlagene Hashtags",
+                    "label": "Vorgeschlagene Hashtags",
                     "placeholder": "#Beispiel"
                 },
                 "healthcare": {
                 "memorial": {
                     "label": "Typ"
                 },
-                "milestone_position": {
-                    "label": "Kilometersteinposition entlang einer Strecke",
-                    "placeholder": "Position auf eine Dezimalstelle (123,4)"
+                "monitoring_multi": {
+                    "label": "Messung"
                 },
                 "mtb/scale": {
                     "label": "Mountainbike-Schwierigkeitsgrad",
                 "oneway": {
                     "label": "Einbahnstraße",
                     "options": {
+                        "alternating": "Abwechselnd",
                         "no": "Nein",
+                        "reversible": "Umdrehbar",
                         "undefined": "Standardwert Nein",
                         "yes": "Ja"
                     }
                 "oneway_yes": {
                     "label": "Einbahnstraße",
                     "options": {
+                        "alternating": "Abwechselnd",
                         "no": "Nein",
+                        "reversible": "Umdrehbar",
                         "undefined": "Standardwert Ja",
                         "yes": "Ja"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5, 6"
                 },
-                "parallel_direction": {
-                    "label": "Richtung",
-                    "options": {
-                        "backward": "Rückwärts",
-                        "forward": "Vorwärts"
-                    }
-                },
                 "park_ride": {
                     "label": "Parken und Reisen"
                 },
                 "railway": {
                     "label": "Typ"
                 },
+                "railway/position": {
+                    "label": "Eisenbahn-Kilometerstein",
+                    "placeholder": "Entfernung in Kilometer mit einer Nachkommastelle (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Drehrichtung",
+                    "options": {
+                        "backward": "Rückwärts",
+                        "both": "Beide / Alle",
+                        "forward": "Vorwärts"
+                    }
+                },
                 "rating": {
                     "label": "Anschlussleistung"
                 },
                 "recycling_accepts": {
                     "label": "Akzeptiert"
                 },
-                "recycling_type": {
-                    "label": "Recycling Typ",
-                    "options": {
-                        "centre": "Wertstoffhof",
-                        "container": "Container"
-                    }
-                },
                 "ref": {
                     "label": "Referenzcode"
                 },
+                "ref/isil": {
+                    "label": "ISIL-Code"
+                },
                 "ref_aeroway_gate": {
                     "label": "Gatenummer"
                 },
                     "label": "Verkehrsknotennummer"
                 },
                 "ref_platform": {
-                    "label": "Wartestellennummer"
+                    "label": "Steignummer"
                 },
                 "ref_road_number": {
                     "label": "Straßennummer"
                 "traffic_signals": {
                     "label": "Typ"
                 },
+                "traffic_signals/direction": {
+                    "label": "Drehrichtung",
+                    "options": {
+                        "backward": "Rückwärts",
+                        "both": "Beide / Alle",
+                        "forward": "Vorwärts"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Erkennbarkeit des Weges",
                     "options": {
                     "terms": "Schlepplift, Seilschlepplift, Übungslift"
                 },
                 "aerialway/station": {
-                    "name": "Seilbahnstation",
-                    "terms": "Seilbahnstation, Liftstation"
+                    "name": "Seilbahnstation"
                 },
                 "aerialway/t-bar": {
                     "name": "Bügelschlepplift",
                     "terms": "Geldautomat, Bankautomat, Bankomat, Bancomat, Geldausgabeautomat, ATM"
                 },
                 "amenity/bank": {
-                    "name": "Bank-Fiiale",
+                    "name": "Bank-Filiale",
                     "terms": "Kasse, Kontor, Kreditgenossenschaft, Lagerstelle, Fiskus, Fonds, Vermögen, Investmentfirma, Register, Rücklage, Vorrat, Tresor, Rücklagen, Grundkapital, Vorrat, Lager, Lagerhaus, Sparkasse, Schatz, Treuhandgesellschaft, Tresorraum"
                 },
                 "amenity/bar": {
                     "terms": "Wechselstube, Geldwechselgeschäft, Währungsumtauschgeschäft, Bargeldumtauschgeschäft"
                 },
                 "amenity/bus_station": {
-                    "name": "Busbahnhof",
-                    "terms": "Omnibusbahnhof, ZOB, Busbahnhof"
+                    "name": "Busbahnhof"
                 },
                 "amenity/cafe": {
                     "name": "Café",
                     "terms": "Kaffee, Café, Kaffeehaus, Cafébar"
                 },
+                "amenity/car_pooling": {
+                    "name": "Car Pooling",
+                    "terms": "Car Pooling"
+                },
                 "amenity/car_rental": {
                     "name": "Autovermietung",
                     "terms": "Autovermietung, Kfz-Verleih"
                     "terms": "Fast Food, Imbiss"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Fährhafen",
-                    "terms": "Fährhafen"
+                    "name": "Schiffsanleger"
                 },
                 "amenity/fire_station": {
                     "name": "Feuerwehrhaus",
                     "name": "Bibliothek",
                     "terms": "Bibliothek, Bücherei"
                 },
+                "amenity/love_hotel": {
+                    "name": "Stundenhotel",
+                    "terms": "Stundenhotel, Liebeshotel"
+                },
                 "amenity/marketplace": {
                     "name": "Wochenmarkt",
                     "terms": "Wochenmarkt, Marktverkauf, Markt"
                     "terms": "Ranger-Station"
                 },
                 "amenity/recycling": {
-                    "name": "Recycling",
-                    "terms": "Recyclingcontainer, Abfallwiederverwertung, Container, Abfall, Müll"
+                    "name": "Recyclingcontainer",
+                    "terms": "Recyclingcontainer, Wertstoffhof"
                 },
                 "amenity/recycling_centre": {
                     "name": "Wertstoffhof",
                     "name": "Dusche",
                     "terms": "Dusche"
                 },
+                "amenity/smoking_area": {
+                    "name": "Raucherbereich",
+                    "terms": "Raucherbereich"
+                },
                 "amenity/social_facility": {
                     "name": "Sozialeinrichtung",
                     "terms": "Sozialeinrichtung, Sozialhilfeeinrichtung"
                     "name": "Hecke",
                     "terms": "Hecke"
                 },
+                "barrier/kerb": {
+                    "name": "Bordstein",
+                    "terms": "Bordstein, Randstein"
+                },
                 "barrier/kissing_gate": {
                     "name": "Schwinggatter",
                     "terms": "Tor, Gatter"
                     "name": "Scheune",
                     "terms": "Scheune, Stadl"
                 },
+                "building/boathouse": {
+                    "name": "Bootshaus",
+                    "terms": "Bootshaus, Bootsschuppen"
+                },
+                "building/bungalow": {
+                    "name": "Bungalow",
+                    "terms": "Bungalow"
+                },
                 "building/bunker": {
                     "name": "Bunker"
                 },
                     "name": "Kirchengebäude",
                     "terms": "Kirchengebäude, Gotteshaus, Kirche"
                 },
+                "building/civic": {
+                    "name": "Öffentliches Gebäude",
+                    "terms": "Öffentliches Gebäude"
+                },
                 "building/college": {
                     "name": "Hochschulgebäude",
                     "terms": "Schulgebäude"
                     "terms": "Gebäude im Bau"
                 },
                 "building/detached": {
-                    "name": "Freistehendes Einfamiliehaus",
+                    "name": "Freistehendes Einfamilienhaus",
                     "terms": "alleinstehendes Haus, freistehendes Haus, Einfamilienhaus"
                 },
                 "building/dormitory": {
                 "building/entrance": {
                     "name": "Eingang/Ausgang"
                 },
+                "building/farm": {
+                    "name": "Bauernhaus",
+                    "terms": "Bauernhaus"
+                },
                 "building/garage": {
                     "name": "Einzelgarage",
-                    "terms": "Einzelgarage"
+                    "terms": "Einzelgarage, Einzelgaragen"
                 },
                 "building/garages": {
-                    "name": "Mehrfachgaragen",
-                    "terms": "Mehrfachgaragen"
+                    "name": "Mehrfach-/Blockgaragen",
+                    "terms": "Mehrfachgaragen, Garagenblock"
                 },
                 "building/greenhouse": {
                     "name": "Gewächshaus",
                     "name": "Vorschul-/Kindergartengebäude",
                     "terms": "Kindergartengebäude,Kinderkrippengebäude"
                 },
+                "building/mosque": {
+                    "name": "Moschee",
+                    "terms": "Moschee, Moscheegebäude"
+                },
                 "building/public": {
                     "name": "Öffentliches Gebäude",
                     "terms": "Öffentliches Gebäude"
                     "name": "Dach",
                     "terms": "Dach"
                 },
+                "building/ruins": {
+                    "name": "Verlassenes Gebäude",
+                    "terms": "Verlassenes Gebäude"
+                },
                 "building/school": {
                     "name": "Schulgebäude",
                     "terms": "Schulgebäude, Schulhaus"
                     "name": "Doppelhaushälfte",
                     "terms": "Doppelhaushälfte"
                 },
+                "building/service": {
+                    "name": "Maschinenhaus",
+                    "terms": "Maschinenhaus, Dienstleistungsgebäude"
+                },
                 "building/shed": {
                     "name": "Schuppen",
                     "terms": "Hütte, Baracke"
                     "name": "Stall",
                     "terms": "Stallungen, Stallgebäude"
                 },
+                "building/stadium": {
+                    "name": "Stadium",
+                    "terms": "Stadiumgebäude"
+                },
                 "building/static_caravan": {
                     "name": "Feststehender Wohnwagen",
                     "terms": "Abgestellter Wohnwagen"
                 },
+                "building/temple": {
+                    "name": "Tempelgebäude",
+                    "terms": "Tempelgebäude"
+                },
                 "building/terrace": {
                     "name": "Reihenhäuser",
                     "terms": "Reihenhäuser"
                 "building/train_station": {
                     "name": "Bahnhofsgebäude"
                 },
+                "building/transportation": {
+                    "name": "Gebäude für den öffentlichen Verkehr",
+                    "terms": "Gebäude für den öffentlichen Verkehr, Busbahnhof, Bahnhof, U-Bahnhof"
+                },
                 "building/university": {
                     "name": "Universitätsgebäude",
                     "terms": "Universitätsgebäude, Campusgebäude"
                     "name": "Camping Stellplatz",
                     "terms": "Campingplatz, Zeltplatz, Stellplatz"
                 },
+                "circular": {
+                    "name": "Kreisverkehr"
+                },
                 "club": {
                     "name": "Verein",
                     "terms": "Verein, Klub"
                 "emergency/private": {
                     "name": "private Notzufahrt"
                 },
+                "emergency/water_tank": {
+                    "name": "Löschwasser",
+                    "terms": "Löschwasser, Löschteich, Löschreservoir"
+                },
                 "emergency/yes": {
                     "name": "Notzufahrt erlaubt"
                 },
                 },
                 "footway/sidewalk": {
                     "name": "Bürgersteig",
-                    "terms": "Gehsteig, Fußgängerweg, Gehweg, Gangsteig, Trottoir"
+                    "terms": "Bürgersteig,Gehsteig,Fußgängerweg,Gehweg,Gangsteig,Trottoir"
                 },
                 "ford": {
                     "name": "Furt",
                     "terms": "Optiker, Brillenoptiker"
                 },
                 "healthcare/physiotherapist": {
-                    "name": "Physiotherapeutin",
+                    "name": "Physiotherapeut/in",
                     "terms": "Physiotherapeutin, Krankengymnast, Physiotherapeut, Krankengymnastin"
                 },
                 "healthcare/podiatrist": {
                     "terms": "Reha-Klinik, Rehabilitationsklinik"
                 },
                 "healthcare/speech_therapist": {
-                    "name": "Logopäge",
-                    "terms": "Logopäge, Sprachtherapeutin"
+                    "name": "Logopäde",
+                    "terms": "Logopäde, Sprachtherapeutin"
                 },
                 "highway": {
                     "name": "Straße/Weg"
                     "name": "Reitweg",
                     "terms": "Reitweg, Reiterweg, Pferdeweg, Reitpfad"
                 },
+                "highway/bus_guideway": {
+                    "name": "Spurbusstraße",
+                    "terms": "Spurbusstraße"
+                },
                 "highway/bus_stop": {
-                    "name": "Bushaltestelle",
-                    "terms": "Bushaltestelle, Verkehrshalt, Halt, Haltestelle, Endhaltestelle, Endstelle"
+                    "name": "Bushaltestelle"
                 },
                 "highway/corridor": {
                     "name": "Gang/Korridor im Innenraum",
                 },
                 "highway/residential": {
                     "name": "Anliegerstraße",
-                    "terms": "Anliegerstraße,Wohngebietsstraße, Siedlungsstraße, Ortsstraße"
+                    "terms": "Anliegerstraße,Wohngebietsstraße,Siedlungsstraße,Ortsstraße"
                 },
                 "highway/rest_area": {
                     "name": "Rastplatz ohne Tankstelle/Restaurant",
                     "terms": "Rettungsweg, Zufahrtsstraße für Rettungskräfte, Rettungszufahrt, Feuerwehrzufahrt"
                 },
                 "highway/service/parking_aisle": {
-                    "name": "Parkplatzweg",
+                    "name": "Parkplatz-Nebenfahrweg",
                     "terms": "Parkplatzweg, Fahrweg auf Parkplatzflächen"
                 },
                 "highway/services": {
                 },
                 "highway/steps": {
                     "name": "Treppe",
-                    "terms": "Treppe, Treppen, Stufen"
+                    "terms": "Treppe,Treppen,Stiege,Stufen"
                 },
                 "highway/stop": {
                     "name": "Stoppschild",
                     "terms": "Flächennutzung, Raumnutzung, Bodennutzung, Landnutzung"
                 },
                 "landuse/allotments": {
-                    "name": "Gemeinschaftsgarten",
-                    "terms": "Gemeinsamer Garten"
+                    "name": "Kleingartenanlage",
+                    "terms": "Kleingärten, Schrebergärten, Schrebergarten, Gartensparte"
                 },
                 "landuse/aquaculture": {
                     "name": "Aquakultur",
                     "terms": "Bauernhof, landwirtschaftliche Hofstelle"
                 },
                 "landuse/forest": {
-                    "name": "bewirtschafteter Wald",
+                    "name": "Bewirtschafteter Wald",
                     "terms": "Forst, Forstwald, bewirtschafteter Wald, Wald"
                 },
                 "landuse/garages": {
-                    "name": "Garagengebiet",
-                    "terms": "Garagengebiet, Vielfahcgaragen, große Garagenflächen"
+                    "name": "Garagenhof",
+                    "terms": "Garagenhof, Garagenfläche, Garagennutzung, Garagenwidmung"
                 },
                 "landuse/grass": {
                     "name": "Gras",
                     "name": "Freifläche",
                     "terms": "Freifläche, unbebaute Fläche, Bauland, Rohbauland"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Gewächshäuser-Nutzung",
+                    "terms": "Gewächshäuser-Nutzung"
+                },
                 "landuse/harbour": {
                     "name": "Hafen",
                     "terms": "Hafenanlage, Seehafen"
                 },
                 "landuse/residential": {
                     "name": "Wohngebiet",
-                    "terms": "Wohngebiet, Wohnanlage, Wohngegend, Wohnregion, Wohnhäuser, Siedlungsfläche"
+                    "terms": "Wohngebiet,Wohnanlage,Wohngegend,Wohnregion,Wohnhäuser,Siedlungsfläche"
                 },
                 "landuse/retail": {
                     "name": "Geschäftsgebiet",
                     "name": "Mast",
                     "terms": "Mobilfunkmast, Sendemast, Flutlichtmast, Handymast"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Messstation",
+                    "terms": "Messstation"
+                },
                 "man_made/observation": {
                     "name": "Aussichtsturm",
                     "terms": "Ausguck, Ausblick, Beobachtungsstand"
                     "terms": "Steuerberatungskanzlei"
                 },
                 "office/administrative": {
-                    "name": "Verwaltungsamt",
-                    "terms": "Verwaltungsstelle, Öffentliche Verwaltung"
+                    "name": "Verwaltungsamt"
                 },
                 "office/adoption_agency": {
                     "name": "Adoptionsagentur",
                     "terms": "Wohlfahrtseinrichtung"
                 },
                 "office/company": {
-                    "name": "Firma",
-                    "terms": "Büro, Gesellschaft"
+                    "name": "Firmenbüro",
+                    "terms": "Firmenbüro"
                 },
                 "office/coworking": {
                     "name": "Co-Working-Räumlichkeiten",
                     "terms": "Jurist, Advokat, Rechtsanwalt, Notar"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notariat",
-                    "terms": "Notariat, Notariatskanzlei, Notarbüro"
+                    "name": "Notariat"
                 },
                 "office/moving_company": {
                     "name": "Umzugsfirma",
                     "name": "Transformator",
                     "terms": "Transformator, Umspannwerk"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Haltestelle",
+                    "terms": "Haltestelle"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Seilbahn-Haltestelle",
+                    "terms": "Seilbahn-Haltestelle"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Bus-Haltestelle",
+                    "terms": "Bus-Haltestelle"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Fähren-Haltestelle",
+                    "terms": "Fähren-Haltestelle"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Stadtbahnhaltestelle",
+                    "terms": "Stadtbahnhaltestelle"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Einschienenbahnhaltestelle",
+                    "terms": "Einschienenbahnhaltestelle"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "U-Bahnhaltestelle",
+                    "terms": "U-Bahnhaltestelle"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Eisenbahnhaltestelle",
+                    "terms": "Eisenbahnhaltestelle"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Straßenbahnhaltestelle",
+                    "terms": "Straßenbahnhaltestelle"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Oberleitungsbus-Haltestelle",
+                    "terms": "Oberleitungsbus-Haltestelle"
+                },
                 "public_transport/platform": {
-                    "name": "Bahn-/Bussteig ",
-                    "terms": "Halte-Plattform, Bussteig"
+                    "name": "Haltestelle",
+                    "terms": "Haltestelle"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Seilbahn-Haltestelle",
+                    "terms": "Seilbahn-Haltestelle"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Bushaltestelle",
+                    "terms": "Bushaltestelle"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Fähranleger",
+                    "terms": "Fähranleger"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Stadtbahnhaltestelle",
+                    "terms": "Stadtbahnhaltestelle"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Einschienenbahnhaltestelle",
+                    "terms": "Einschienenbahnhaltestelle"
+                },
+                "public_transport/platform_subway": {
+                    "name": "U-Bahnhaltestelle",
+                    "terms": "U-Bahnhaltestelle"
+                },
+                "public_transport/platform_train": {
+                    "name": "Eisenbahnhaltestelle",
+                    "terms": "Eisenbahnhaltestelle"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Straßenbahnhaltestelle",
+                    "terms": "Straßenbahnhaltestelle"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Oberleitungsbus-Haltestelle",
+                    "terms": "Oberleitungsbus-Haltestelle"
+                },
+                "public_transport/station": {
+                    "name": "Haltestelle",
+                    "terms": "Haltestelle"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Lift-/Seilbahn-Haltestelle",
+                    "terms": "Lift-/Seilbahn-Haltestelle"
+                },
+                "public_transport/station_bus": {
+                    "name": "Busbahnhof",
+                    "terms": "Busbahnhof, Busterminal, Bushaltestelle"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Fähranleger",
+                    "terms": "Fähranleger"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Stadtbahnhaltestelle",
+                    "terms": "Stadtbahnhaltestelle"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Einschienenbahnhaltestelle",
+                    "terms": "Einschienenbahnhaltestelle"
+                },
+                "public_transport/station_subway": {
+                    "name": "U-Bahnhaltestelle",
+                    "terms": "U-Bahnhaltestelle"
+                },
+                "public_transport/station_train": {
+                    "name": "Eisenbahnhaltestelle",
+                    "terms": "Eisenbahnhaltestelle"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Eisenbahn-Bedarfshaltestelle",
+                    "terms": "Eisenbahn-Bedarfshaltestelle"
+                },
+                "public_transport/station_tram": {
+                    "name": "Straßenbahnhaltestelle",
+                    "terms": "Straßenbahnhaltestelle"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Oberleitungsbus-Haltestelle",
+                    "terms": "Oberleitungsbus-Haltestelle"
+                },
+                "public_transport/stop_area": {
+                    "name": "Haltestellen-Relation",
+                    "terms": "Haltestellen-Relation"
                 },
                 "public_transport/stop_position": {
-                    "name": "Halteposition",
-                    "terms": "Verkehrshalt, Halt"
+                    "name": "Halteplatz",
+                    "terms": "Halteplatz"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Lift-/Seilbahn-Halteplatz",
+                    "terms": "Lift-/Seilbahn-Halteplatz"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Bus-Halteplatz",
+                    "terms": "Bus-Halteplatz"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Fähranlegeplatz",
+                    "terms": "Fähranlegeplatz"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Stadtbahn-Halteplatz",
+                    "terms": "Stadtbahn-Halteplatz"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Einschienenbahn-Halteplatz",
+                    "terms": "Einschienenbahn-Halteplatz"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "U-Bahn-Halteplatz",
+                    "terms": "U-Bahn-Halteplatz"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Eisenbahn-Halteplatz",
+                    "terms": "Eisenbahn-Halteplatz"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Straßenbahn-Halteplatz",
+                    "terms": "Straßenbahn-Halteplatz"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Oberleitungsbus-Halteplatz",
+                    "terms": "Oberleitungsbus-Halteplatz"
                 },
                 "railway": {
                     "name": "Eisenbahn"
                 },
                 "railway/abandoned": {
-                    "name": "Ehemalige Eisenbahnstrecke",
+                    "name": " Abgebaute Eisenbahnstrecke ",
                     "terms": "Abgebaute Eisenbahnstrecke, Verfallene Eisenbahn, Aufgegebene Bahnstrecke"
                 },
                 "railway/buffer_stop": {
                     "terms": "Standseilbahn, Seilbahn, Drahtseilbahn, Kettenbahn"
                 },
                 "railway/halt": {
-                    "name": "Eisenbahn-Haltepunkt",
-                    "terms": "Bahn-Haltestelle, Zug-Haltestelle, Haltestelle, Haltepunkt"
+                    "name": "Eisenbahn-Bedarfshaltestelle"
                 },
                 "railway/level_crossing": {
                     "name": "Bahnübergang (Straße)",
                     "terms": "Eisenbagnkreuzung (Straße), Eisenbahnstraßenkreuzung"
                 },
                 "railway/light_rail": {
-                    "name": "Stadtbahngleise",
+                    "name": "Stadtbahngleis",
                     "terms": "Stadtbahngleise"
                 },
                 "railway/milestone": {
-                    "name": "Eisenbahn Meilenstein",
+                    "name": "Eisenbahn-Kilometerstein",
                     "terms": "Eisenbahnmeilenstein entlang einer Strecke"
                 },
+                "railway/miniature": {
+                    "name": "Miniatureisenbahn",
+                    "terms": "Miniatureisenbahn"
+                },
                 "railway/monorail": {
                     "name": "Einschienenbahn",
                     "terms": "Einschienenbahn"
                     "terms": "Schmalspureisenbahn, Schmalspurbahn, schmalspurige Eisenbahn"
                 },
                 "railway/platform": {
-                    "name": "Bahnsteig",
-                    "terms": "Bahnsteig"
+                    "name": "Eisenbahnhaltestelle"
                 },
                 "railway/rail": {
                     "name": "Eisenbahnschienen",
                     "terms": "<translate with synonyms or related terms for 'Railway Signal', separated by commas>"
                 },
                 "railway/station": {
-                    "name": "Bahnhof",
-                    "terms": "Bahnhof, Haltestelle"
+                    "name": "Eisenbahnhaltestelle"
                 },
                 "railway/subway": {
                     "name": "U-Bahn-Gleise",
                     "terms": "Straßenbahngleise, Straßenbahn, Bim, Tramway, Stadtbahn, Trambahn"
                 },
                 "railway/tram_stop": {
-                    "name": "Straßenbahnhaltestelle",
-                    "terms": "Trambahnhaltestelle"
+                    "name": "Straßenbahn-Halteplatz"
                 },
                 "relation": {
                     "name": "Relation",
                     "terms": "Juwelier, Schmuckgeschäft"
                 },
                 "shop/kiosk": {
-                    "name": "Zeitungskiosk",
-                    "terms": "Zeitschriftenkiosk,Zeitungskiosk"
+                    "name": "Kiosk",
+                    "terms": "Kiosk,Zeitungsstand,Zeitungskiosk"
                 },
                 "shop/kitchen": {
                     "name": "Kücheneinrichtungsgeschäft",
                     "name": "Reitroute",
                     "terms": "Reitwanderroute, Wanderreitroute"
                 },
+                "type/route/light_rail": {
+                    "name": "Stadtbahnlinie",
+                    "terms": "Stadtbahnlinie"
+                },
                 "type/route/pipeline": {
                     "name": "Pipelinenetz",
                     "terms": "Pipelinenetz"
                 },
+                "type/route/piste": {
+                    "name": "Wintersportroute",
+                    "terms": "Wintersportroute, Schipiste, Langlaufloipe, Schhiroute, Piste"
+                },
                 "type/route/power": {
                     "name": "Stromnetz",
                     "terms": "Stromleitung"
                     "name": "Straßennetz",
                     "terms": "Straßenroute, Straße"
                 },
+                "type/route/subway": {
+                    "name": "U-Bahnlinie",
+                    "terms": "U-Bahnlinie"
+                },
                 "type/route/train": {
                     "name": "Bahnlinie",
                     "terms": "Eisenbahn-Linie"
         "imagery": {
             "Bing": {
                 "description": "Satellitenbilder und Luftbilder",
-                "name": "Bing-Bildmaterial"
+                "name": "Bing Luftbildmaterial"
             },
             "DigitalGlobe-Premium": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
-                "description": "Premium-DigitalGlobe-Satellitenbilder",
-                "name": "DigitalGlobe Premium"
+                "description": "Premium DigitalGlobe Satellitenbilder",
+                "name": "DigitalGlobe Premium Bildmaterial"
             },
             "DigitalGlobe-Premium-vintage": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
                 "description": "Lufbildgrenzen und Aufnahmedaten. Die Beschriftung erscheint auf Zoom Level 14 und höher.",
-                "name": "DigitalGlobe Premium Luftbildaufnahmedatum"
+                "name": "DigitalGlobe Premium Bildmaterial Klassisch"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
-                "description": "Standard-DigitalGlobe-Satellitenbilder",
-                "name": "DigitalGlobe Standard"
+                "description": "Standard DigitalGlobe Satellitenbilder",
+                "name": "DigitalGlobe Standard Bildmaterial"
             },
             "DigitalGlobe-Standard-vintage": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
                 "description": "Lufbildgrenzen und Aufnahmedaten. Die Beschriftung erscheint auf Zoom Level 14 und höher.",
-                "name": "DigitalGlobe Standard Luftbildaufnahmedatum"
+                "name": "DigitalGlobe Standard Bildmaterial Klassisch"
             },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
-                "description": "Esri world imagery.",
-                "name": "Esri World Imagery"
+                "description": "Esri World Bildmaterial.",
+                "name": "Esri World Bildmaterial"
+            },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "Bedingungen & Feedback"
+                },
+                "description": "Esri Archiv-Bildmaterial (kann klarer und genauer sein)",
+                "name": "Esri World Bildmaterial (Clarity) Beta"
             },
             "MAPNIK": {
                 "attribution": {
                     "text": "© OpenStreetMap-Mitwirkende, CC BY-SA"
                 },
-                "description": "Standard-OpenStreetMap-Karten-Layer",
+                "description": "Standard OpenStreetMap Kartenansicht",
                 "name": "OpenStreetMap (Standard)"
             },
             "Mapbox": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap-Mitwirkende, CC-BY-SA"
                 },
-                "name": "OSM-Objekteditor: Kennzeichnung"
+                "name": "OSM-Objekteditor: Attribute"
             },
             "US-TIGER-Roads-2012": {
                 "name": "TIGER Straßen 2012"
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC-BY-SA 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-Mitwirkende, CC BY-SA 3.0"
                 },
-                "name": "Waymarked Trails: Radfahren"
+                "name": "Markierte Wege: Radfahren"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC-BY-SA 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-Mitwirkende, CC BY-SA 3.0"
                 },
-                "name": "Waymarked Trails: Wandern"
+                "name": "Markierte Wege: Wandern"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC-BY-SA 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-Mitwirkende, CC BY-SA 3.0"
                 },
-                "name": "Waymarked Trails: Mountainbiking"
+                "name": "Markierte Wege: Mountainbiking"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC-BY-SA 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-Mitwirkende, CC BY-SA 3.0"
                 },
-                "name": "Waymarked Trails: Skating"
+                "name": "Markierte Wege: Skating"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC-BY-SA 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-Mitwirkende, CC BY-SA 3.0"
                 },
-                "name": "Waymarked Trails: Wintersport"
+                "name": "Markierte Wege: Wintersport"
             },
             "basemap.at": {
                 "attribution": {
                     "text": "Bedingungen & Feedback"
                 },
                 "description": "Länder/Städte/Orte/Straßen zum Orientieren",
-                "name": "Orientierungs-Overlay"
+                "name": "Orientierungs-Informationen"
             },
             "openpt_map": {
                 "attribution": {
                 "attribution": {
                     "text": "© OpenStreetMap-Mitwirkende"
                 },
-                "description": "Öffentliche GPS-Tracks von OpenStreetMap-Mitwirkenden",
-                "name": "GPS-Tracks von OpenStreetMap"
+                "description": "Öffentliche GPS Tracks hochgeladen von OpenStreetMap-Mitwirkenden",
+                "name": "OpenStreetMap GPS Tracks"
             },
             "osm-mapnik-black_and_white": {
                 "attribution": {
index f988c7b1cd9284113f29b3f0069e59cab14f1fe5..d9ded427f9d2b49b80652d20b57bd8faf1e68163 100644 (file)
             "no_changes": "އެއްވެސް ބަދަލެއް އަދި ނުގެނޭ"
         },
         "help": {
-            "title": "އެހީ ހޯއްދަވާ",
-            "help": "# އެހީ ހޯއްދަވާ\n\nމިއީ އޯޕަން ސްޓްރީޓް މެޕްގެ އެޑިޓަރެއް. އޯޕަން ސްޓްރީޓް މެޕަކީ ހިލޭ އަދި އެޑިޓްކުރެވޭ ދުނިޔޭގެ ޗާޓެއް\n\nތިސަރަޙައްދުގެ ހުރިހާ މައުލޫމާތެއް އޯޕަން ސްޓްރީޓް މެޕްގައި ހިމެނޭނެ، މިއީ، ހުރިހާ އެންމެނަށް ފަސޭހަވާނެހެން މުޅި ދުނިޔޭގެ ހުރިހާ ހިސާބެއްގައި ބޭނުންކުރަމުންދާ ޗާޓެއް\n\nމިޗާޓަށް ގެންނަވާ ބަދަލުތައް އޯޕަން ސްޓްރީޓް މެޕް ބޭނުންކުރާ ހުރިހާ ފަރާތްތަކަށް ފެންނާނެ\n\nIn order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [sourcecode available on GitHub](https://github.com/openstreetmap/iD).\n"
+            "title": "އެހީ ހޯއްދަވާ"
         },
         "shortcuts": {
             "browsing": {
                 "highway": {
                     "name": "ހައިވޭ"
                 },
-                "highway/bus_stop": {
-                    "name": "ބަސް ހުއްޓި"
-                },
                 "highway/crosswalk": {
                     "name": "ކަަފިހި ހުރަސް"
                 },
index b9e407b6b822143cb506b76cefb57e070031f709..91f7458a1c4b1112911e9a6c734715a34a305bbb 100644 (file)
             "created": "Δημιουργήθηκε",
             "about_changeset_comments": "Σχετικά με τα σχόλια αλλαγών",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/El:Good_changeset_comments",
-            "google_warning": "Αναφέρατε την Google σε αυτό το σχόλιο: θυμηθείτε πως η αντιγραφή από τους Χάρτες Google απαγορεύεται αυστηρά.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright/el"
+            "google_warning": "Αναφέρατε την Google σε αυτό το σχόλιο: θυμηθείτε πως η αντιγραφή από τους Χάρτες Google απαγορεύεται αυστηρά."
         },
         "contributors": {
             "list": "Επεξεργασίες από {users}",
         "background": {
             "title": "Παρασκήνιο",
             "description": "Ρυθμίσεις παρασκηνίου",
-            "percent_brightness": "{opacity}% φωτεινότητα",
             "none": "Κανένα",
             "best_imagery": "Η καλύτερη γνωστή πηγή εικόνας για αυτήν την τοποθεσία",
             "switch": "Επέστρεψε σε αυτό το παρασκήνιο",
             "custom": "Εξατομικευμένο",
             "custom_button": "Επεξεργασία εξατομικευμένου παρασκηνίου",
-            "fix_misalignment": "Προσαρμόστε την απόκλιση της εικόνας",
-            "imagery_source_faq": "Από πού προέρχεται αυτή η εικόνα;",
             "reset": "Μηδενισμός",
-            "offset": "Σύρετε οπουδήποτε στην γκρίζα περιοχή παρακάτω για να προσαρμόσετε την απόκλιση της εικόνας ή εισαγάγετε τις τιμές της απόκλισης σε μέτρα.",
             "minimap": {
-                "description": "Μικροχάρτης",
                 "tooltip": "Προβολή ενός χάρτη σε σμίκρυνση, για να σας βοηθήσει να εντοπίσετε την περιοχή που εμφανίζεται αυτή τη στιγμή.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Προσαρμόστε την απόκλιση της εικόνας",
+            "offset": "Σύρετε οπουδήποτε στην γκρίζα περιοχή παρακάτω για να προσαρμόσετε την απόκλιση της εικόνας ή εισαγάγετε τις τιμές της απόκλισης σε μέτρα."
         },
         "map_data": {
             "title": "Δεδομένα Χάρτη",
                     "label": "Χωρητικότητα",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Κατεύθυνση",
-                    "options": {
-                        "E": "Ανατολικά",
-                        "ENE": "Ανατολικά-βορειοανατολικά",
-                        "ESE": "Ανατολικά-νοτιοανατολικά",
-                        "N": "Βόρεια",
-                        "NE": "Βορειοανατολικά",
-                        "NNE": "Βόρεια-βορειοανατολικά",
-                        "NNW": "Βόρεια-βορειοδυτικά",
-                        "NW": "Βορειοδυτικά",
-                        "S": "Νότια",
-                        "SE": "Νοτιοανατολικά",
-                        "SSE": "Νότια-νοτιοανατολικά",
-                        "SSW": "Νότια-νοτιοδυτικά",
-                        "SW": "Νοτιοδυτικά",
-                        "W": "Δυτικά",
-                        "WNW": "Δυτικά-βορειοδυτικά",
-                        "WSW": "Δυτικά-νοτιοδυτικά"
-                    }
-                },
                 "castle_type": {
                     "label": "Είδος"
                 },
-                "clock_direction": {
-                    "label": "Κατεύθυνση",
-                    "options": {
-                        "anticlockwise": "Αριστερόστροφα",
-                        "clockwise": "Δεξιόστροφα"
-                    }
-                },
                 "club": {
                     "label": "Είδος"
                 },
                 "par": {
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Κατεύθυνση"
-                },
                 "park_ride": {
                     "label": "Σταθμός Μετεπιβίβασης"
                 },
                 "railway": {
                     "label": "Είδος"
                 },
-                "recycling_type": {
-                    "label": "Είδος Ανακύκλωσης",
-                    "options": {
-                        "centre": "Κέντρο Ανακύκλωσης"
-                    }
-                },
                 "ref_aeroway_gate": {
                     "label": "Αριθμός Πύλης"
                 },
                 "amenity/bureau_de_change": {
                     "name": "Ανταλλακτήριο Συναλλάγματος"
                 },
-                "amenity/bus_station": {
-                    "name": "Σταθμός Λεωφορείων",
-                    "terms": "Σταθμός Λεωφορείων"
-                },
                 "amenity/cafe": {
                     "name": "Καφετέρια",
                     "terms": "Καφετέρια, Καφενείο, Μπιστρό, Καφέ"
                     "name": "Ταχυφαγείο",
                     "terms": "Γρήγορο φαγητό, Πρόχειρο φαγητό, Φαστφουντάδικο"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Τερματικό Φέρυ Μποτ"
-                },
                 "amenity/fire_station": {
                     "name": "Πυροσβεστικός Σταθμός",
                     "terms": "Πυροσβεστική, 199"
                     "name": "Δημόσια Ανταλλακτική Βιβλιοθήκη",
                     "terms": "Δημόσια βιβλιοθήκη"
                 },
-                "amenity/recycling": {
-                    "name": "Ανακύκλωση"
-                },
                 "amenity/recycling_centre": {
                     "name": "Κέντρο Ανακύκλωσης",
                     "terms": "Κέντρο Ανακύκλωσης, Ανακύκλωση Σκουπιδιών"
                     "name": "Μονοπάτι Αλόγων",
                     "terms": "Μονοπάτι για άλογα"
                 },
-                "highway/bus_stop": {
-                    "name": "Στάση Λεωφορείων",
-                    "terms": "Στάση Λεωφορείου"
-                },
                 "highway/crossing": {
                     "name": "Διάβαση"
                 },
                     "name": "Δάσος",
                     "terms": "Δάσος, δασική έκταση"
                 },
-                "landuse/garages": {
-                    "name": "Γκαράζ",
-                    "terms": "Γκαράζ"
-                },
                 "landuse/grass": {
                     "name": "Γρασίδι",
                     "terms": "Γρασίδι, Χορτάρι, γκαζόν"
                     "terms": "Γραφείο"
                 },
                 "office/administrative": {
-                    "name": "Διοικητικό γραφείο",
-                    "terms": "Γραφείο διοίκησης"
-                },
-                "office/company": {
-                    "name": "Εταιρικό Γραφείο",
-                    "terms": "Γραφείο Εταιρείας"
+                    "name": "Διοικητικό γραφείο"
                 },
                 "office/educational_institution": {
                     "name": "Εκπαιδευτικό Ίδρυμα"
                     "name": "Μετασχηματιστής",
                     "terms": "Μετασχηματιστής"
                 },
-                "public_transport/stop_position": {
-                    "name": "Σημείο Στάσης"
-                },
                 "railway": {
                     "name": "Σιδηροδρομικός Διάδρομος"
                 },
                 "railway/narrow_gauge": {
                     "name": "Σιδηροτροχιά Στενού Εύρους"
                 },
-                "railway/platform": {
-                    "name": "Σιδηροδρομική Αποβάθρα",
-                    "terms": "Σιδηροδρομική αποβάθρα"
-                },
                 "railway/rail": {
                     "name": "Σιδηροδρομική Γραμμή",
                     "terms": "Σιδηροτροχιά, Ράγα"
                 },
-                "railway/station": {
-                    "name": "Σιδηροδρομικός Σταθμός",
-                    "terms": "Σιδηροδρομικός σταθμός"
-                },
                 "railway/subway": {
                     "name": "Μετρό",
                     "terms": "Μετρό, Υπόγειος Σιδηρόδρομος"
                     "name": "Κοσμηματοπωλείο",
                     "terms": "Χρυσοχοείο, Κοσμηματοπώλης, Κοσμηματοπωλείο"
                 },
-                "shop/kiosk": {
-                    "name": "Περίπτερο"
-                },
                 "shop/laundry": {
                     "name": "Καθαριστήριο",
                     "terms": "Πλυντήριο"
                     "text": "© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"
                 }
             },
-            "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, δεδομένα χάρτη OpenStreetMap contributors, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, δεδομένα χάρτη OpenStreetMap contributors, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, δεδομένα χάρτη OpenStreetMap contributors, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, δεδομένα χάρτη OpenStreetMap contributors, ODbL 1.0"
-                }
-            },
-            "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, δεδομένα χάρτη OpenStreetMap contributors, ODbL 1.0"
-                }
-            },
             "basemap.at": {
                 "attribution": {
                     "text": "basemap.at"
index 2b8370eb7e596322c9b93de24339ecce8785e4cc..0a5dc286f058c8bff3e3cd1f98b7cf37a19e5258 100644 (file)
             "rotate": {
                 "title": "Rotate",
                 "description": {
-                    "single": "Rotate this feature around its center point.",
-                    "multiple": "Rotate these features around their center point."
+                    "single": "Rotate this feature around its centre point.",
+                    "multiple": "Rotate these features around their centre point."
                 },
                 "key": "R",
                 "annotation": {
             "about_changeset_comments": "About changeset comments",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edits by {users}",
                 "title": "Measurement",
                 "selected": "{n} selected",
                 "geometry": "Geometry",
-                "closed": "closed",
                 "center": "Centre",
                 "perimeter": "Perimeter",
                 "length": "Length",
             "title": "Background",
             "description": "Background settings",
             "key": "B",
-            "percent_brightness": "{opacity}% brightness",
             "none": "None",
             "best_imagery": "Best known imagery source for this location",
             "switch": "Switch back to this background",
             "custom": "Custom",
             "custom_button": "Edit custom background",
-            "custom_prompt": "Enter a tile URL template. Valid tokens are:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",
-            "fix_misalignment": "Adjust imagery offset",
-            "imagery_source_faq": "Where does this imagery come from?",
             "reset": "reset",
-            "offset": "Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.",
             "minimap": {
-                "description": "Minimap",
                 "tooltip": "Show a zoomed out map to help locate the area currently displayed.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Adjust imagery offset",
+            "offset": "Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."
         },
         "map_data": {
             "title": "Map Data",
             "untagged_area_tooltip": "Select a feature type that describes what this area is.",
             "untagged_relation": "Untagged relation",
             "untagged_relation_tooltip": "Select a feature type that describes what this relation is.",
-            "many_deletions": "You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",
             "tag_suggests_area": "The tag {tag} suggests line should be area, but it is not an area",
             "deprecated_tags": "Deprecated tags: {tags}"
         },
         "help": {
             "title": "Help",
             "key": "H",
-            "help": "# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the World. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n",
-            "roads": "# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n",
-            "gps": "# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognised, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n",
-            "imagery": "# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\naeroplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United Kingdom, United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n",
-            "addresses": "# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n",
-            "inspector": "# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n",
-            "buildings": "# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n",
-            "relations": "# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"
+            "help": {
+                "title": "Help",
+                "welcome": "Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",
+                "open_data_h": "Open Data",
+                "open_data": "Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Before you start",
+                "before_start": "You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",
+                "open_source_h": "Open Source",
+                "open_source": "The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Overview",
+                "navigation_h": "Navigation",
+                "navigation_drag": "You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",
+                "navigation_zoom": "You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",
+                "features_h": "Map Features",
+                "features": "We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",
+                "nodes_ways": "In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."
+            },
+            "editing": {
+                "title": "Editing & Saving",
+                "select_h": "Select",
+                "select_left_click": "{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",
+                "select_right_click": "{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",
+                "multiselect_h": "Multiselect",
+                "multiselect_shift_click": "`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",
+                "multiselect_lasso": "Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",
+                "undo_redo_h": "Undo & Redo",
+                "undo_redo": "Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",
+                "save_h": "Save",
+                "save": "Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",
+                "save_validation": "On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",
+                "upload_h": "Upload",
+                "upload": "Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",
+                "backups_h": "Automatic Backups",
+                "backups": "If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",
+                "keyboard_h": "Keyboard Shortcuts",
+                "keyboard": "You can view a list of keyboard shortcuts by pressing the `?` key."
+            },
+            "feature_editor": {
+                "title": "Feature Editor",
+                "intro": "The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",
+                "definitions": "The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",
+                "type_h": "Feature Type",
+                "type": "You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",
+                "type_picker": "The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",
+                "fields_h": "Fields",
+                "fields_all_fields": "The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",
+                "fields_example": "Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",
+                "fields_add_field": "You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",
+                "tags_h": "Tags",
+                "tags_all_tags": "Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",
+                "tags_resources": "Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."
+            },
+            "points": {
+                "title": "Points",
+                "intro": "*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",
+                "add_point_h": "Adding Points",
+                "add_point": "To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",
+                "add_point_finish": "To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",
+                "move_point_h": "Moving Points",
+                "move_point": "To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",
+                "delete_point_h": "Deleting Points",
+                "delete_point": "It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",
+                "delete_point_command": "To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "lines": {
+                "title": "Lines",
+                "intro": "*Lines* are used to represent features such as roads, railways, and rivers. Lines should be drawn down the centre of the feature that they represent.",
+                "add_line_h": "Adding Lines",
+                "add_line": "To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",
+                "add_line_draw": "Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",
+                "add_line_finish": "To finish a line, press `{return}` or click again on the last node.",
+                "modify_line_h": "Modifying Lines",
+                "modify_line_dragnode": "Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",
+                "modify_line_addnode": "You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",
+                "connect_line_h": "Connecting Lines",
+                "connect_line": "Having roads connected properly is important for the map and essential for providing driving directions.",
+                "connect_line_display": "The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",
+                "connect_line_drag": "To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",
+                "connect_line_tag": "If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",
+                "disconnect_line_h": "Disconnecting Lines",
+                "disconnect_line_command": "To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",
+                "move_line_h": "Moving Lines",
+                "move_line_command": "To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",
+                "move_line_connected": "Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",
+                "delete_line_h": "Deleting Lines",
+                "delete_line": "If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",
+                "delete_line_command": "To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "areas": {
+                "title": "Areas",
+                "intro": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",
+                "point_or_area_h": "Points or Areas?",
+                "point_or_area": "Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",
+                "add_area_h": "Adding Areas",
+                "add_area_command": "To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",
+                "add_area_draw": "Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",
+                "add_area_finish": "To finish an area, press `{return}` or click again on either the first or last node.",
+                "square_area_h": "Square Corners",
+                "square_area_command": "Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",
+                "modify_area_h": "Modifying Areas",
+                "modify_area_dragnode": "Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",
+                "modify_area_addnode": "You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",
+                "delete_area_h": "Deleting Areas",
+                "delete_area": "If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",
+                "delete_area_command": "To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "relations": {
+                "title": "Relations",
+                "intro": "A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",
+                "edit_relation_h": "Editing Relations",
+                "edit_relation": "At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",
+                "edit_relation_add": "To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",
+                "edit_relation_delete": "You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",
+                "maintain_relation_h": "Maintaining Relations",
+                "maintain_relation": "For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",
+                "relation_types_h": "Relation Types",
+                "multipolygon_h": "Multipolygons",
+                "multipolygon": "A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",
+                "multipolygon_create": "To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",
+                "multipolygon_merge": "Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",
+                "turn_restriction_h": "Turn restrictions",
+                "turn_restriction": "A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",
+                "turn_restriction_field": "To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",
+                "turn_restriction_editing": "In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",
+                "route_h": "Routes",
+                "route": "A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",
+                "route_add": "To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",
+                "boundary_h": "Boundaries",
+                "boundary": "A *boundary* relation is a group of one or more line features that together form an administrative boundary.",
+                "boundary_add": "To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."
+            },
+            "imagery": {
+                "title": "Background Imagery",
+                "intro": "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",
+                "sources_h": "Imagery Sources",
+                "choosing": "To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",
+                "sources": "By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",
+                "offsets_h": "Adjusting Imagery Offset",
+                "offset": "Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",
+                "offset_change": "Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."
+            },
+            "streetlevel": {
+                "title": "Street Level Photos",
+                "intro": "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Using Street Level Photos",
+                "using": "To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",
+                "photos": "When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",
+                "viewer": "When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."
+            },
+            "gps": {
+                "title": "GPS Traces",
+                "intro": "Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",
+                "survey": "For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "Using GPS Traces",
+                "using": "To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",
+                "tracing": "The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",
+                "upload": "You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."
+            }
         },
         "intro": {
             "done": "done",
             "welcome": {
                 "title": "Welcome",
                 "welcome": "Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",
-                "practice": "All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",
+                "practice": "All of the data in this walkthrough is just for practising, and any edits that you make in the walkthrough will not be saved.",
                 "words": "This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",
                 "mouse": "You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",
                 "leftclick": "When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",
             },
             "areas": {
                 "title": "Areas",
-                "add_playground": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",
+                "add_playground": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",
                 "start_playground": "Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",
                 "continue_playground": "Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",
                 "finish_playground": "Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",
             },
             "lines": {
                 "title": "Lines",
-                "add_line": "*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",
+                "add_line": "*Lines* are used to represent features such as roads, railways, and rivers. **Click the {button} Line button to add a new line.**",
                 "start_line": "Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the centre of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",
                 "intersect": "Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",
                 "retry_intersect": "The road needs to intersect {name}. Let's try again!",
                 "choose_tank": "**Choose {preset} from the list.**",
                 "rightclick_tank": "**Right-click to select the storage tank you created and show the edit menu.**",
                 "circle_tank": "**Click on the {button} button to make the tank a circle.**",
-                "retry_circle": "You didn't click the Circularize button. Try again.",
+                "retry_circle": "You didn't click the Circularise button. Try again.",
                 "play": "Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"
             },
             "startediting": {
                     "move": "Move selected features",
                     "rotate": "Rotate selected features",
                     "orthogonalize": "Straighten line / Square area corners",
-                    "circularize": "Circularize a closed line or area",
+                    "circularize": "Circularise a closed line or area",
                     "reflect_long": "Reflect features across the longer axis",
                     "reflect_short": "Reflect features across the shorter axis",
                     "delete": "Delete selected features"
                     "label": "Capacity",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "E": "East",
-                        "ENE": "East-northeast",
-                        "ESE": "East-southeast",
-                        "N": "North",
-                        "NE": "Northeast",
-                        "NNE": "North-northeast",
-                        "NNW": "North-northwest",
-                        "NW": "Northwest",
-                        "S": "South",
-                        "SE": "Southeast",
-                        "SSE": "South-southeast",
-                        "SSW": "South-southwest",
-                        "SW": "Southwest",
-                        "W": "West",
-                        "WNW": "West-northwest",
-                        "WSW": "West-southwest"
-                    }
-                },
                 "castle_type": {
                     "label": "Type"
                 },
-                "clock_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "anticlockwise": "Anticlockwise",
-                        "clockwise": "Clockwise"
-                    }
-                },
                 "clothes": {
                     "label": "Clothes"
                 },
                 },
                 "fax": {
                     "label": "Fax",
-                    "placeholder": "+44 207 123456"
+                    "placeholder": "+44 1632 961234"
                 },
                 "fee": {
                     "label": "Fee"
                     "options": {
                         "green": "Green",
                         "lane": "Lane",
-                        "parking_lot": "Parking Lot",
-                        "sidewalk": "Sidewalk"
+                        "parking_lot": "Car Park",
+                        "sidewalk": "Pavement"
                     }
                 },
                 "fire_hydrant/type": {
                     "label": "Specialities"
                 },
                 "height": {
-                    "label": "Height (Meters)"
+                    "label": "Height (Metres)"
                 },
                 "highway": {
                     "label": "Type"
                 "memorial": {
                     "label": "Type"
                 },
-                "milestone_position": {
-                    "label": "Milestone Position",
-                    "placeholder": "Distance to one decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Monitoring"
                 },
                 "mtb/scale": {
                     "label": "Mountain Biking Difficulty",
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "backward": "Backward",
-                        "forward": "Forward"
-                    }
-                },
                 "park_ride": {
                     "label": "Park and Ride"
                 },
                 },
                 "phone": {
                     "label": "Telephone",
-                    "placeholder": "+44 207 123456"
+                    "placeholder": "+44 1632 961234"
                 },
                 "piste/difficulty": {
                     "label": "Difficulty",
                 "recycling_accepts": {
                     "label": "Accepts"
                 },
-                "recycling_type": {
-                    "label": "Recycling Type",
-                    "options": {
-                        "centre": "Recycling Centre",
-                        "container": "Container"
-                    }
-                },
                 "ref": {
                     "label": "Reference Code"
                 },
                 "surveillance/type": {
                     "label": "Surveillance Type",
                     "options": {
-                        "ALPR": "Automatic License Plate Reader",
+                        "ALPR": "Automatic Licence Plate Reader",
                         "camera": "Camera",
                         "guard": "Guard"
                     }
                     "label": "Wheelchair Access"
                 },
                 "width": {
-                    "label": "Width (Meters)"
+                    "label": "Width (Metres)"
                 },
                 "wikipedia": {
                     "label": "Wikipedia"
                 "amenity/bureau_de_change": {
                     "name": "Currency Exchange"
                 },
-                "amenity/bus_station": {
-                    "name": "Bus Station"
-                },
                 "amenity/cafe": {
                     "name": "Cafe"
                 },
                 "amenity/fast_food": {
                     "name": "Fast Food"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Ferry Terminal"
-                },
                 "amenity/fire_station": {
                     "name": "Fire Station"
                 },
                 "amenity/ranger_station": {
                     "name": "Warden Station"
                 },
-                "amenity/recycling": {
-                    "name": "Recycling"
-                },
                 "amenity/recycling_centre": {
                     "name": "Recycling Centre"
                 },
                     "name": "Raised Street Crossing"
                 },
                 "footway/crosswalk": {
-                    "name": "Pedestrian Crosswalk"
+                    "name": "Zebra Crossing"
                 },
                 "footway/crosswalk-raised": {
-                    "name": "Raised Pedestrian Crosswalk"
+                    "name": "Raised Zebra Crossing"
                 },
                 "footway/sidewalk": {
                     "name": "Pavement",
                     "name": "Ford"
                 },
                 "golf/bunker": {
-                    "name": "Sand Trap"
+                    "name": "Bunker"
                 },
                 "golf/fairway": {
                     "name": "Fairway"
                     "name": "Audiologist"
                 },
                 "healthcare/birthing_center": {
-                    "name": "Birthing Center"
+                    "name": "Birthing Centre"
                 },
                 "healthcare/blood_donation": {
                     "name": "Blood Donor Centre"
                 "highway/bridleway": {
                     "name": "Bridleway"
                 },
-                "highway/bus_stop": {
-                    "name": "Bus Stop"
-                },
                 "highway/corridor": {
                     "name": "Indoor Corridor"
                 },
                     "name": "Raised Street Crossing"
                 },
                 "highway/crosswalk": {
-                    "name": "Pedestrian Crosswalk"
+                    "name": "Zebra Crossing"
                 },
                 "highway/crosswalk-raised": {
-                    "name": "Raised Pedestrian Crosswalk"
+                    "name": "Raised Zebra Crossing"
                 },
                 "highway/cycleway": {
                     "name": "Cycle Path"
                 "landuse/forest": {
                     "name": "Forest"
                 },
-                "landuse/garages": {
-                    "name": "Garages"
-                },
                 "landuse/grass": {
                     "name": "Grass"
                 },
                 "office/charity": {
                     "name": "Charity Office"
                 },
-                "office/company": {
-                    "name": "Company Office"
-                },
                 "office/coworking": {
                     "name": "Coworking Space"
                 },
                 "power/transformer": {
                     "name": "Transformer"
                 },
-                "public_transport/platform": {
-                    "name": "Platform"
-                },
-                "public_transport/stop_position": {
-                    "name": "Stop Position"
-                },
                 "railway": {
                     "name": "Railway"
                 },
                     "name": "Buffer Stop"
                 },
                 "railway/crossing": {
-                    "name": "Railway Crossing (Path)"
+                    "name": "Level Crossing (Path)"
                 },
                 "railway/derail": {
                     "name": "Railway Derailer"
                 "railway/funicular": {
                     "name": "Funicular"
                 },
-                "railway/halt": {
-                    "name": "Railway Halt"
-                },
                 "railway/level_crossing": {
-                    "name": "Railway Crossing (Road)"
+                    "name": "Level Crossing (Road)"
                 },
                 "railway/milestone": {
                     "name": "Railway Milestone"
                 "railway/narrow_gauge": {
                     "name": "Narrow Gauge Rail"
                 },
-                "railway/platform": {
-                    "name": "Railway Platform"
-                },
                 "railway/rail": {
                     "name": "Rail"
                 },
                 "railway/signal": {
                     "name": "Railway Signal"
                 },
-                "railway/station": {
-                    "name": "Railway Station"
-                },
                 "railway/subway": {
                     "name": "Subway"
                 },
                 "railway/tram": {
                     "name": "Tram"
                 },
-                "railway/tram_stop": {
-                    "name": "Tram Stop"
-                },
                 "relation": {
                     "name": "Relation"
                 },
                 "shop/jewelry": {
                     "name": "Jeweller"
                 },
-                "shop/kiosk": {
-                    "name": "News Kiosk"
-                },
                 "shop/kitchen": {
                     "name": "Kitchen Design Store"
                 },
                 "name": "TIGER Roads 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Cycling"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Hiking"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Skating"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Winter Sports"
             },
             "basemap.at": {
index ff15951fd54dc1e8a6b12be66a7538c845a6343e..7b23142594e813e74c431db299a95c17357d2d2a 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."
+            },
+            "drag_node": {
+                "connected_to_hidden": "This can't be edited because it is connected to a hidden feature."
             }
         },
         "operations": {
             "about_changeset_comments": "About changeset comments",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edits by {users}",
                 "title": "Measurement",
                 "selected": "{n} selected",
                 "geometry": "Geometry",
-                "closed": "closed",
+                "closed_line": "closed line",
+                "closed_area": "closed area",
                 "center": "Center",
                 "perimeter": "Perimeter",
                 "length": "Length",
                 "centroid": "Centroid",
                 "location": "Location",
                 "metric": "Metric",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Number of nodes"
             }
         },
         "geometry": {
             "title": "Background",
             "description": "Background settings",
             "key": "B",
-            "percent_brightness": "{opacity}% brightness",
+            "backgrounds": "Backgrounds",
             "none": "None",
             "best_imagery": "Best known imagery source for this location",
             "switch": "Switch back to this background",
             "custom": "Custom",
             "custom_button": "Edit custom background",
-            "custom_prompt": "Enter a tile URL template. Valid tokens are:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",
-            "fix_misalignment": "Adjust imagery offset",
-            "imagery_source_faq": "Where does this imagery come from?",
+            "custom_prompt": "Enter a tile URL template. Valid tokens are:\n   - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   - {-y} or {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",
+            "overlays": "Overlays",
+            "imagery_source_faq": "Imagery Info / Report a Problem",
             "reset": "reset",
-            "offset": "Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.",
+            "display_options": "Display Options",
+            "brightness": "Brightness",
+            "contrast": "Contrast",
+            "saturation": "Saturation",
+            "sharpness": "Sharpness",
             "minimap": {
-                "description": "Minimap",
+                "description": "Show Minimap",
                 "tooltip": "Show a zoomed out map to help locate the area currently displayed.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Adjust imagery offset",
+            "offset": "Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."
         },
         "map_data": {
             "title": "Map Data",
             "status_code": "Server returned status code {code}",
             "unknown_error_details": "Please ensure you are connected to the internet.",
             "uploading": "Uploading changes to OpenStreetMap...",
+            "conflict_progress": "Checking for conflicts: {num} of {total}",
             "unsaved_changes": "You have unsaved changes",
             "conflict": {
                 "header": "Resolve conflicting edits",
             "untagged_area_tooltip": "Select a feature type that describes what this area is.",
             "untagged_relation": "Untagged relation",
             "untagged_relation_tooltip": "Select a feature type that describes what this relation is.",
-            "many_deletions": "You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",
+            "many_deletions": "You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",
             "tag_suggests_area": "The tag {tag} suggests line should be area, but it is not an area",
             "deprecated_tags": "Deprecated tags: {tags}"
         },
         "help": {
             "title": "Help",
             "key": "H",
-            "help": "# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n",
-            "roads": "# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n",
-            "gps": "# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n",
-            "imagery": "# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n",
-            "addresses": "# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n",
-            "inspector": "# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n",
-            "buildings": "# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n",
-            "relations": "# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"
+            "help": {
+                "title": "Help",
+                "welcome": "Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",
+                "open_data_h": "Open Data",
+                "open_data": "Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Before you start",
+                "before_start": "You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",
+                "open_source_h": "Open Source",
+                "open_source": "The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Overview",
+                "navigation_h": "Navigation",
+                "navigation_drag": "You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",
+                "navigation_zoom": "You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",
+                "features_h": "Map Features",
+                "features": "We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",
+                "nodes_ways": "In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."
+            },
+            "editing": {
+                "title": "Editing & Saving",
+                "select_h": "Select",
+                "select_left_click": "{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",
+                "select_right_click": "{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",
+                "multiselect_h": "Multiselect",
+                "multiselect_shift_click": "`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",
+                "multiselect_lasso": "Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",
+                "undo_redo_h": "Undo & Redo",
+                "undo_redo": "Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",
+                "save_h": "Save",
+                "save": "Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",
+                "save_validation": "On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",
+                "upload_h": "Upload",
+                "upload": "Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",
+                "backups_h": "Automatic Backups",
+                "backups": "If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",
+                "keyboard_h": "Keyboard Shortcuts",
+                "keyboard": "You can view a list of keyboard shortcuts by pressing the `?` key."
+            },
+            "feature_editor": {
+                "title": "Feature Editor",
+                "intro": "The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",
+                "definitions": "The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",
+                "type_h": "Feature Type",
+                "type": "You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",
+                "type_picker": "The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",
+                "fields_h": "Fields",
+                "fields_all_fields": "The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",
+                "fields_example": "Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",
+                "fields_add_field": "You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",
+                "tags_h": "Tags",
+                "tags_all_tags": "Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",
+                "tags_resources": "Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."
+            },
+            "points": {
+                "title": "Points",
+                "intro": "*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",
+                "add_point_h": "Adding Points",
+                "add_point": "To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",
+                "add_point_finish": "To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",
+                "move_point_h": "Moving Points",
+                "move_point": "To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",
+                "delete_point_h": "Deleting Points",
+                "delete_point": "It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",
+                "delete_point_command": "To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "lines": {
+                "title": "Lines",
+                "intro": "*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",
+                "add_line_h": "Adding Lines",
+                "add_line": "To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",
+                "add_line_draw": "Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",
+                "add_line_finish": "To finish a line, press `{return}` or click again on the last node.",
+                "modify_line_h": "Modifying Lines",
+                "modify_line_dragnode": "Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",
+                "modify_line_addnode": "You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",
+                "connect_line_h": "Connecting Lines",
+                "connect_line": "Having roads connected properly is important for the map and essential for providing driving directions.",
+                "connect_line_display": "The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",
+                "connect_line_drag": "To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",
+                "connect_line_tag": "If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",
+                "disconnect_line_h": "Disconnecting Lines",
+                "disconnect_line_command": "To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",
+                "move_line_h": "Moving Lines",
+                "move_line_command": "To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",
+                "move_line_connected": "Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",
+                "delete_line_h": "Deleting Lines",
+                "delete_line": "If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",
+                "delete_line_command": "To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "areas": {
+                "title": "Areas",
+                "intro": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",
+                "point_or_area_h": "Points or Areas?",
+                "point_or_area": "Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",
+                "add_area_h": "Adding Areas",
+                "add_area_command": "To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",
+                "add_area_draw": "Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",
+                "add_area_finish": "To finish an area, press `{return}` or click again on either the first or last node.",
+                "square_area_h": "Square Corners",
+                "square_area_command": "Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",
+                "modify_area_h": "Modifying Areas",
+                "modify_area_dragnode": "Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",
+                "modify_area_addnode": "You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",
+                "delete_area_h": "Deleting Areas",
+                "delete_area": "If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",
+                "delete_area_command": "To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."
+            },
+            "relations": {
+                "title": "Relations",
+                "intro": "A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",
+                "edit_relation_h": "Editing Relations",
+                "edit_relation": "At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",
+                "edit_relation_add": "To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",
+                "edit_relation_delete": "You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",
+                "maintain_relation_h": "Maintaining Relations",
+                "maintain_relation": "For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",
+                "relation_types_h": "Relation Types",
+                "multipolygon_h": "Multipolygons",
+                "multipolygon": "A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",
+                "multipolygon_create": "To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",
+                "multipolygon_merge": "Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",
+                "turn_restriction_h": "Turn restrictions",
+                "turn_restriction": "A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",
+                "turn_restriction_field": "To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",
+                "turn_restriction_editing": "In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",
+                "route_h": "Routes",
+                "route": "A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",
+                "route_add": "To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",
+                "boundary_h": "Boundaries",
+                "boundary": "A *boundary* relation is a group of one or more line features that together form an administrative boundary.",
+                "boundary_add": "To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."
+            },
+            "imagery": {
+                "title": "Background Imagery",
+                "intro": "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",
+                "sources_h": "Imagery Sources",
+                "choosing": "To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",
+                "sources": "By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",
+                "offsets_h": "Adjusting Imagery Offset",
+                "offset": "Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",
+                "offset_change": "Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."
+            },
+            "streetlevel": {
+                "title": "Street Level Photos",
+                "intro": "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Using Street Level Photos",
+                "using": "To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",
+                "photos": "When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",
+                "viewer": "When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."
+            },
+            "gps": {
+                "title": "GPS Traces",
+                "intro": "Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",
+                "survey": "For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "Using GPS Traces",
+                "using": "To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",
+                "tracing": "The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",
+                "upload": "You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."
+            }
         },
         "intro": {
             "done": "done",
             },
             "areas": {
                 "title": "Areas",
-                "add_playground": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",
+                "add_playground": "*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",
                 "start_playground": "Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",
                 "continue_playground": "Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",
                 "finish_playground": "Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",
                     "title": "Selecting features",
                     "select_one": "Select a single feature",
                     "select_multi": "Select multiple features",
-                    "lasso": "Draw a selection lasso around features"
+                    "lasso": "Draw a selection lasso around features",
+                    "search": "Find features matching search text"
                 },
                 "with_selected": {
                     "title": "With feature selected",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} sq ft",
+            "square_miles": "{quantity} sq mi",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "E",
+            "west": "W",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Brand"
                 },
+                "brewery": {
+                    "label": "Draft Beers"
+                },
                 "bridge": {
                     "label": "Type",
                     "placeholder": "Default"
                     "label": "Capacity",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "N": "North",
-                        "E": "East",
-                        "S": "South",
-                        "W": "West",
-                        "NE": "Northeast",
-                        "SE": "Southeast",
-                        "SW": "Southwest",
-                        "NW": "Northwest",
-                        "NNE": "North-northeast",
-                        "ENE": "East-northeast",
-                        "ESE": "East-southeast",
-                        "SSE": "South-southeast",
-                        "SSW": "South-southwest",
-                        "WSW": "West-southwest",
-                        "WNW": "West-northwest",
-                        "NNW": "North-northwest"
-                    }
-                },
                 "castle_type": {
                     "label": "Type"
                 },
-                "clock_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "clockwise": "Clockwise",
-                        "anticlockwise": "Counterclockwise"
-                    }
-                },
                 "clothes": {
                     "label": "Clothes"
                 },
                 "diaper": {
                     "label": "Diaper Changing Available"
                 },
+                "direction_cardinal": {
+                    "label": "Direction",
+                    "options": {
+                        "N": "North",
+                        "E": "East",
+                        "S": "South",
+                        "W": "West",
+                        "NE": "Northeast",
+                        "SE": "Southeast",
+                        "SW": "Southwest",
+                        "NW": "Northwest",
+                        "NNE": "North-northeast",
+                        "ENE": "East-northeast",
+                        "ESE": "East-southeast",
+                        "SSE": "South-southeast",
+                        "SSW": "South-southwest",
+                        "WSW": "West-southwest",
+                        "WNW": "West-northwest",
+                        "NNW": "North-northwest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direction",
+                    "options": {
+                        "clockwise": "Clockwise",
+                        "anticlockwise": "Counterclockwise"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direction",
+                    "options": {
+                        "forward": "Forward",
+                        "backward": "Backward",
+                        "both": "Both / All"
+                    }
+                },
+                "direction": {
+                    "label": "Direction (Degrees Clockwise)",
+                    "placeholder": "45, 90, 180, 270"
+                },
                 "display": {
                     "label": "Display"
                 },
                 "memorial": {
                     "label": "Type"
                 },
-                "milestone_position": {
-                    "label": "Milestone Position",
-                    "placeholder": "Distance to one decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Monitoring"
                 },
                 "mtb/scale": {
                     "label": "Mountain Biking Difficulty",
                     "options": {
                         "undefined": "Assumed to be Yes",
                         "yes": "Yes",
-                        "no": "No"
+                        "no": "No",
+                        "reversible": "Reversible",
+                        "alternating": "Alternating"
                     }
                 },
                 "oneway": {
                     "options": {
                         "undefined": "Assumed to be No",
                         "yes": "Yes",
-                        "no": "No"
+                        "no": "No",
+                        "reversible": "Reversible",
+                        "alternating": "Alternating"
                     }
                 },
                 "opening_hours": {
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "forward": "Forward",
-                        "backward": "Backward"
-                    }
-                },
                 "park_ride": {
                     "label": "Park and Ride"
                 },
                 "railway": {
                     "label": "Type"
                 },
+                "railway/position": {
+                    "label": "Milestone Position",
+                    "placeholder": "Distance to one decimal (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Direction",
+                    "options": {
+                        "forward": "Forward",
+                        "backward": "Backward",
+                        "both": "Both / All"
+                    }
+                },
                 "rating": {
                     "label": "Power Rating"
                 },
                 "recycling_accepts": {
                     "label": "Accepts"
                 },
-                "recycling_type": {
-                    "label": "Recycling Type",
-                    "options": {
-                        "container": "Container",
-                        "centre": "Recycling Center"
-                    }
-                },
                 "ref_aeroway_gate": {
                     "label": "Gate Number"
                 },
                 "ref": {
                     "label": "Reference Code"
                 },
+                "ref/isil": {
+                    "label": "ISIL Code"
+                },
                 "relation": {
                     "label": "Type"
                 },
                 "traffic_signals": {
                     "label": "Type"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direction",
+                    "options": {
+                        "forward": "Forward",
+                        "backward": "Backward",
+                        "both": "Both / All"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Trail Visibility",
                     "placeholder": "Excellent, Good, Bad...",
                     "name": "Amenity",
                     "terms": ""
                 },
+                "circular": {
+                    "name": "Traffic Circle",
+                    "terms": ""
+                },
                 "highway": {
                     "name": "Highway",
                     "terms": ""
                     "name": "Billboard",
                     "terms": ""
                 },
+                "aerialway/station": {
+                    "name": "Aerialway Station",
+                    "terms": ""
+                },
                 "aerialway/cable_car": {
                     "name": "Cable Car",
                     "terms": "tramway,ropeway"
                     "name": "Rope Tow Lift",
                     "terms": "handle tow,bugel lift"
                 },
-                "aerialway/station": {
-                    "name": "Aerialway Station",
-                    "terms": ""
-                },
                 "aerialway/t-bar": {
                     "name": "T-bar Lift",
                     "terms": "tbar"
                     "name": "Airport Terminal",
                     "terms": "airport,aerodrome"
                 },
+                "amenity/bus_station": {
+                    "name": "Bus Station / Terminal",
+                    "terms": ""
+                },
                 "amenity/coworking_space": {
                     "name": "Coworking Space",
                     "terms": ""
                 },
+                "amenity/ferry_terminal": {
+                    "name": "Ferry Station / Terminal",
+                    "terms": ""
+                },
                 "amenity/nursing_home": {
                     "name": "Nursing Home",
                     "terms": ""
                 },
                 "amenity/animal_boarding": {
                     "name": "Animal Boarding Facility",
-                    "terms": "boarding,cat,dog,horse,kitten,pet boarding,pet care,pet hotel,puppy,reptile"
+                    "terms": "boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"
                 },
                 "amenity/animal_breeding": {
                     "name": "Animal Breeding Facility",
                     "name": "Currency Exchange",
                     "terms": "bureau de change,money changer"
                 },
-                "amenity/bus_station": {
-                    "name": "Bus Station",
-                    "terms": ""
-                },
                 "amenity/cafe": {
                     "name": "Cafe",
                     "terms": "bistro,coffee,tea"
                 },
+                "amenity/car_pooling": {
+                    "name": "Car Pooling",
+                    "terms": ""
+                },
                 "amenity/car_rental": {
                     "name": "Car Rental",
                     "terms": ""
                     "name": "Fast Food",
                     "terms": "restaurant,takeaway"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Ferry Terminal",
-                    "terms": ""
-                },
                 "amenity/fire_station": {
                     "name": "Fire Station",
                     "terms": ""
                     "name": "Library",
                     "terms": "book"
                 },
+                "amenity/love_hotel": {
+                    "name": "Love Hotel",
+                    "terms": ""
+                },
                 "amenity/marketplace": {
                     "name": "Marketplace",
                     "terms": ""
                 },
                 "amenity/place_of_worship/hindu": {
                     "name": "Hindu Temple",
-                    "terms": "garbhargriha,mandu,puja,shrine,temple"
+                    "terms": "kovil,devasthana,mandir,kshetram,alayam,shrine,temple"
                 },
                 "amenity/place_of_worship/jewish": {
                     "name": "Synagogue",
                     "terms": "bottle,can,dump,glass,garbage,rubbish,scrap,trash"
                 },
                 "amenity/recycling": {
-                    "name": "Recycling",
+                    "name": "Recycling Container",
                     "terms": "bin,can,bottle,glass,garbage,rubbish,scrap,trash"
                 },
                 "amenity/restaurant": {
                     "name": "Shower",
                     "terms": "rain closet"
                 },
+                "amenity/smoking_area": {
+                    "name": "Smoking Area",
+                    "terms": ""
+                },
                 "amenity/social_facility": {
                     "name": "Social Facility",
                     "terms": ""
                     "name": "Hedge",
                     "terms": ""
                 },
+                "barrier/kerb": {
+                    "name": "Kerb",
+                    "terms": ""
+                },
                 "barrier/kissing_gate": {
                     "name": "Kissing Gate",
                     "terms": ""
                     "name": "Barn",
                     "terms": ""
                 },
+                "building/boathouse": {
+                    "name": "Boathouse",
+                    "terms": ""
+                },
+                "building/bungalow": {
+                    "name": "Bungalow",
+                    "terms": "home,detached"
+                },
                 "building/cabin": {
                     "name": "Cabin",
                     "terms": ""
                     "name": "Church Building",
                     "terms": ""
                 },
+                "building/civic": {
+                    "name": "Civic Building",
+                    "terms": ""
+                },
                 "building/college": {
                     "name": "College Building",
                     "terms": "university"
                     "name": "Dormitory",
                     "terms": ""
                 },
+                "building/farm": {
+                    "name": "Farm Building",
+                    "terms": ""
+                },
                 "building/garage": {
                     "name": "Garage",
                     "terms": ""
                     "name": "Preschool/Kindergarten Building",
                     "terms": "kindergarden,pre-school"
                 },
+                "building/mosque": {
+                    "name": "Mosque Building",
+                    "terms": ""
+                },
                 "building/public": {
                     "name": "Public Building",
                     "terms": ""
                     "name": "Roof",
                     "terms": ""
                 },
+                "building/ruins": {
+                    "name": "Building Ruins",
+                    "terms": ""
+                },
                 "building/school": {
                     "name": "School Building",
                     "terms": "academy,elementary school,middle school,high school"
                     "name": "Semi-Detached House",
                     "terms": "home,double,duplex,twin,family,residence,dwelling"
                 },
+                "building/service": {
+                    "name": "Service Building",
+                    "terms": ""
+                },
                 "building/shed": {
                     "name": "Shed",
                     "terms": ""
                     "name": "Stable",
                     "terms": ""
                 },
+                "building/stadium": {
+                    "name": "Stadium Building",
+                    "terms": ""
+                },
                 "building/static_caravan": {
                     "name": "Static Mobile Home",
                     "terms": ""
                 },
+                "building/temple": {
+                    "name": "Temple Building",
+                    "terms": ""
+                },
                 "building/terrace": {
                     "name": "Row Houses",
                     "terms": "home,terrace,brownstone,family,residence,dwelling"
                 },
+                "building/transportation": {
+                    "name": "Transportation Building",
+                    "terms": ""
+                },
                 "building/university": {
                     "name": "University Building",
                     "terms": "college"
                     "name": "Emergency Phone",
                     "terms": ""
                 },
+                "emergency/water_tank": {
+                    "name": "Emergency Water Tank",
+                    "terms": "water tank,cistern,reservoir"
+                },
                 "entrance": {
                     "name": "Entrance/Exit",
                     "terms": ""
                     "name": "Speech Therapist",
                     "terms": "speech,therapist,therapy,voice"
                 },
+                "highway/bus_stop": {
+                    "name": "Bus Stop / Platform",
+                    "terms": ""
+                },
                 "highway/bridleway": {
                     "name": "Bridle Path",
                     "terms": "bridleway,equestrian,horse"
                 },
-                "highway/bus_stop": {
-                    "name": "Bus Stop",
+                "highway/bus_guideway": {
+                    "name": "Bus Guideway",
                     "terms": ""
                 },
                 "highway/corridor": {
                     "terms": "tree"
                 },
                 "landuse/garages": {
-                    "name": "Garages",
+                    "name": "Garage Landuse",
                     "terms": ""
                 },
                 "landuse/grass": {
                     "name": "Greenfield",
                     "terms": ""
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Greenhouse Horticulture",
+                    "terms": "flower,greenhouse,horticulture,grow,vivero"
+                },
                 "landuse/harbour": {
                     "name": "Harbor",
                     "terms": "boat"
                     "name": "Mast",
                     "terms": "antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Monitoring Station",
+                    "terms": "weather,earthquake,seismology,air,gps"
+                },
                 "man_made/observation": {
                     "name": "Observation Tower",
                     "terms": "lookout tower,fire tower"
                     "name": "Office",
                     "terms": ""
                 },
+                "office/administrative": {
+                    "name": "Administrative Office",
+                    "terms": ""
+                },
                 "office/physician": {
                     "name": "Physician",
                     "terms": ""
                     "name": "Accountant Office",
                     "terms": ""
                 },
-                "office/administrative": {
-                    "name": "Administrative Office",
-                    "terms": ""
-                },
                 "office/adoption_agency": {
                     "name": "Adoption Agency",
                     "terms": ""
                     "terms": "charitable organization"
                 },
                 "office/company": {
-                    "name": "Company Office",
+                    "name": "Corporate Office",
                     "terms": ""
                 },
                 "office/coworking": {
                 },
                 "office/lawyer/notary": {
                     "name": "Notary Office",
-                    "terms": "clerk,signature,wills,deeds,estate"
+                    "terms": ""
                 },
                 "office/moving_company": {
                     "name": "Moving Company Office",
                 },
                 "office/notary": {
                     "name": "Notary Office",
-                    "terms": ""
+                    "terms": "clerk,deeds,estate,signature,wills"
                 },
                 "office/political_party": {
                     "name": "Political Party",
                 },
                 "office/telecommunication": {
                     "name": "Telecom Office",
-                    "terms": ""
+                    "terms": "communication,internet,phone,voice"
                 },
                 "office/therapist": {
                     "name": "Therapist Office",
                     "name": "Transformer",
                     "terms": ""
                 },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Aerialway Stop / Platform",
+                    "terms": "aerialway,cable car,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Bus Stop / Platform",
+                    "terms": "bus,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Ferry Stop / Platform",
+                    "terms": "boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Light Rail Stop / Platform",
+                    "terms": "electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Monorail Stop / Platform",
+                    "terms": "monorail,platform,public transit,public transportation,rail,transit,transportation"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Subway Stop / Platform",
+                    "terms": "metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Train Stop / Platform",
+                    "terms": "platform,public transit,public transportation,rail,track,train,transit,transportation"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Tram Stop / Platform",
+                    "terms": "electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Trolleybus Stop / Platform",
+                    "terms": "bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"
+                },
+                "public_transport/linear_platform": {
+                    "name": "Transit Stop / Platform",
+                    "terms": "platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Aerialway Stop / Platform",
+                    "terms": "aerialway,cable car,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Bus Stop / Platform",
+                    "terms": "bus,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Ferry Stop / Platform",
+                    "terms": "boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Light Rail Stop / Platform",
+                    "terms": "electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Monorail Stop / Platform",
+                    "terms": "monorail,platform,public transit,public transportation,rail,transit,transportation"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Subway Stop / Platform",
+                    "terms": "metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"
+                },
+                "public_transport/platform_train": {
+                    "name": "Train Stop / Platform",
+                    "terms": "platform,public transit,public transportation,rail,track,train,transit,transportation"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Tram Stop / Platform",
+                    "terms": "electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Trolleybus Stop / Platform",
+                    "terms": "bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"
+                },
                 "public_transport/platform": {
-                    "name": "Platform",
+                    "name": "Transit Stop / Platform",
+                    "terms": "platform,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Aerialway Station",
+                    "terms": "aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"
+                },
+                "public_transport/station_bus": {
+                    "name": "Bus Station / Terminal",
+                    "terms": "bus,public transit,public transportation,station,terminal,transit,transportation"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Ferry Station / Terminal",
+                    "terms": "boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Light Rail Station",
+                    "terms": "electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Monorail Station",
+                    "terms": "monorail,public transit,public transportation,rail,station,terminal,transit,transportation"
+                },
+                "public_transport/station_subway": {
+                    "name": "Subway Station",
+                    "terms": "metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Train Station (Halt / Request)",
+                    "terms": "halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"
+                },
+                "public_transport/station_train": {
+                    "name": "Train Station",
+                    "terms": "public transit,public transportation,rail,station,terminal,track,train,transit,transportation"
+                },
+                "public_transport/station_tram": {
+                    "name": "Tram Station",
+                    "terms": "electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Trolleybus Station / Terminal",
+                    "terms": "bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"
+                },
+                "public_transport/station": {
+                    "name": "Transit Station",
+                    "terms": "public transit,public transportation,station,terminal,transit,transportation"
+                },
+                "public_transport/stop_area": {
+                    "name": "Transit Stop Area",
                     "terms": ""
                 },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Aerialway Stopping Location",
+                    "terms": "aerialway,cable car,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Bus Stopping Location",
+                    "terms": "bus,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Ferry Stopping Location",
+                    "terms": "boat,dock,ferry,pier,public transit,public transportation,transit,transportation"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Light Rail Stopping Location",
+                    "terms": "electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Monorail Stopping Location",
+                    "terms": "monorail,public transit,public transportation,rail,transit,transportation"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Subway Stopping Location",
+                    "terms": "metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Train Stopping Location",
+                    "terms": "public transit,public transportation,rail,track,train,transit,transportation"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Tram Stopping Location",
+                    "terms": "electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Trolleybus Stopping Location",
+                    "terms": "bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"
+                },
                 "public_transport/stop_position": {
-                    "name": "Stop Position",
+                    "name": "Transit Stopping Location",
+                    "terms": "public transit,public transportation,transit,transportation"
+                },
+                "railway/halt": {
+                    "name": "Train Station (Halt / Request)",
+                    "terms": "break,interrupt,rest,wait,interruption"
+                },
+                "railway/platform": {
+                    "name": "Train Stop / Platform",
                     "terms": ""
                 },
+                "railway/station": {
+                    "name": "Train Station",
+                    "terms": "train station,station"
+                },
+                "railway/tram_stop": {
+                    "name": "Tram Stopping Position",
+                    "terms": "light rail,streetcar,tram,trolley"
+                },
                 "railway/abandoned": {
                     "name": "Abandoned Railway",
                     "terms": ""
                     "name": "Funicular",
                     "terms": "venicular,cliff railway,cable car,cable railway,funicular railway"
                 },
-                "railway/halt": {
-                    "name": "Railway Halt",
-                    "terms": "break,interrupt,rest,wait,interruption"
-                },
                 "railway/level_crossing": {
                     "name": "Railway Crossing (Road)",
                     "terms": "crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"
                     "name": "Railway Milestone",
                     "terms": "milestone,marker"
                 },
+                "railway/miniature": {
+                    "name": "Miniature Railway",
+                    "terms": "rideable miniature railway,narrow gauge railway,minimum gauge railway"
+                },
                 "railway/monorail": {
                     "name": "Monorail",
                     "terms": ""
                     "name": "Narrow Gauge Rail",
                     "terms": "narrow gauge railway,narrow gauge railroad"
                 },
-                "railway/platform": {
-                    "name": "Railway Platform",
-                    "terms": ""
-                },
                 "railway/rail": {
                     "name": "Rail",
                     "terms": ""
                     "name": "Railway Signal",
                     "terms": "signal,lights"
                 },
-                "railway/station": {
-                    "name": "Railway Station",
-                    "terms": "train station,station"
-                },
                 "railway/subway_entrance": {
                     "name": "Subway Entrance",
                     "terms": "metro,transit"
                     "name": "Train Wash",
                     "terms": "wash,clean"
                 },
-                "railway/tram_stop": {
-                    "name": "Tram Stop",
-                    "terms": "light rail,streetcar,tram,trolley"
-                },
                 "railway/tram": {
                     "name": "Tram",
                     "terms": "light rail,streetcar,tram,trolley"
                     "terms": "diamond,gem,ring"
                 },
                 "shop/kiosk": {
-                    "name": "News Kiosk",
+                    "name": "Kiosk",
                     "terms": ""
                 },
                 "shop/kitchen": {
                     "name": "Riding Route",
                     "terms": ""
                 },
+                "type/route/light_rail": {
+                    "name": "Light Rail Route",
+                    "terms": ""
+                },
                 "type/route/pipeline": {
                     "name": "Pipeline Route",
                     "terms": ""
                 },
+                "type/route/piste": {
+                    "name": "Piste/Ski Route",
+                    "terms": ""
+                },
                 "type/route/power": {
                     "name": "Power Route",
                     "terms": ""
                     "name": "Road Route",
                     "terms": ""
                 },
+                "type/route/subway": {
+                    "name": "Subway Route",
+                    "terms": ""
+                },
                 "type/route/train": {
                     "name": "Train Route",
                     "terms": ""
                 "description": "Esri world imagery.",
                 "name": "Esri World Imagery"
             },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "Terms & Feedback"
+                },
+                "description": "Esri archive imagery that may be clearer and more accurate than the default layer.",
+                "name": "Esri World Imagery (Clarity) Beta"
+            },
             "MAPNIK": {
                 "attribution": {
                     "text": "© OpenStreetMap contributors, CC-BY-SA"
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Cycling"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Hiking"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Skating"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Winter Sports"
             },
index c7d749f9dd5a25e619c2cb214f8e88b238544973..53a605605fe47bb7cf9c6849e186963a74c03185 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Klaku por aldoni pliajn nodojn al la linio. Klaku sur aliaj linioj por konekti al ili, kaj duoble klaku por finigi la linion."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Ĉi tiu ne povas esti redaktita, ĉar ĝi estas kunigita al kaŝita elemento."
             }
         },
         "operations": {
             "created": "Kreita",
             "about_changeset_comments": "Pri ŝanĝaraj komentoj",
             "google_warning": "Vi menciis Google en ĉi tiu komento: memoru ke kopiado de datumoj el Google Maps estas absolute malpermesata.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright/eo"
+            "google_warning_link": "https://www.openstreetmap.org/copyright/eo"
         },
         "contributors": {
             "list": "Redaktita de {users}",
                 "title": "Mezuro",
                 "selected": "{n} elektitaj",
                 "geometry": "Geometrio",
-                "closed": "fermita",
+                "closed_line": "fermita linio",
+                "closed_area": "fermita areo",
                 "center": "Centro",
                 "perimeter": "Ĉirkaŭmezuro",
                 "length": "Longo",
                 "centroid": "Pezcentro",
                 "location": "Pozicio",
                 "metric": "Metraj",
-                "imperial": "Imperiaj"
+                "imperial": "Imperiaj",
+                "node_count": "Nombro da nodoj"
             }
         },
         "geometry": {
         },
         "background": {
             "title": "Fono",
-            "description": "Fonaj agordoj",
+            "description": "Agordoj de fono",
             "key": "B",
-            "percent_brightness": "Heleco {opacity}%",
+            "backgrounds": "Fonoj",
             "none": "Neniu",
             "best_imagery": "Plej bona fonto de fotaro por ĉi tiu loko",
             "switch": "Baskuli reen al ĉi tiu fono",
             "custom": "Propra",
             "custom_button": "Redakti propran fonon",
-            "custom_prompt": "Entajpu URL-skemon de kaheloj. Ĝustaj ĵetonoj estas:\n - {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n - {ty} por renversaj TMS-stilaj Y-koordinatoj\n - {u} por kvarkahela (quadtile) skemo\n - {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}",
-            "fix_misalignment": "Ĝustigi fotaran deŝovon",
-            "imagery_source_faq": "De kie ĉi tiu fotaro devenas?",
+            "custom_prompt": "Entajpu URL-skemon de kaheloj. Ĝustaj ĵetonoj estas:\n - {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n - {-y} aŭ {ty} por renversaj TMS-stilaj Y-koordinatoj\n - {u} por kvarkahela (quadtile) skemo\n - {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}",
+            "overlays": "Surtavoloj",
+            "imagery_source_faq": "Pri fotaro / Raporti problemon",
             "reset": "restarigi",
-            "offset": "Trenu ie ajn ene griza kampo sube por korekti fotaran deŝovon aŭ entajpu valorojn de deŝovo en metroj.",
+            "display_options": "Agordoj de vido",
+            "brightness": "Heleco",
+            "contrast": "Kontrasto",
+            "saturation": "Satureco",
+            "sharpness": "Akreco",
             "minimap": {
-                "description": "Mapeto",
+                "description": "Montri mapeton",
                 "tooltip": "Montri malgrandigitan mapon por helpi trovi nune montratan areon.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ĝustigi fotaran deŝovon",
+            "offset": "Trenu ie ajn ene griza kampo sube por korekti fotaran deŝovon aŭ entajpu valorojn de deŝovo en metroj."
         },
         "map_data": {
             "title": "Map-datumoj",
             "status_code": "Servilo revenigis statan kodon {code}",
             "unknown_error_details": "Bonvolu certiĝi, ke vi estas konektita al la Interreto.",
             "uploading": "Alŝutado de ŝanĝoj al OpenStreetMap…",
+            "conflict_progress": "Kontrolado pri konfliktoj: {num} el {total}",
             "unsaved_changes": "Vi havas nekonservitajn ŝanĝojn",
             "conflict": {
                 "header": "Solvi konfliktajn redaktojn",
             "untagged_area_tooltip": "Elektu specon de objekto, kiu priskribas ĉi tiun areon.",
             "untagged_relation": "Senetikeda rilato",
             "untagged_relation_tooltip": "Elektu specon de objekto, kiu priskribas ĉi tiun rilaton.",
-            "many_deletions": "Vi forigas {n} elementojn. Ĉu vi certe volas fari ĉi tion? Ĉi tio forigos ilin el la mapo, kiun ĉiuj vidas je openstreetmap.org.",
+            "many_deletions": "Vi forigas {n} elementojn: {p} nodo(j)n, {l} linio(j)n, {a} areo(j)n kaj {r} rilato(j)n.  Ĉu vi certe volas fari tion. Tio ĉi forigos ilin el la mapo, kiun ĉiuj vidas ĉe openstreetmap.org.",
             "tag_suggests_area": "La etikedo {tag} indikas, ke linio estu areo, sed ĝi ne estas areo",
             "deprecated_tags": "Evitindaj etikedoj: {tags}"
         },
         "full_screen": "Baskuligi plenekranon",
         "gpx": {
             "local_layer": "Loka dosiero",
-            "drag_drop": "Ŝovu kaj demetu .gpx, geojson aŭ .kml dosieron sur la paĝon, aŭ klaku la butonon dekstre por foliumi",
+            "drag_drop": "Ŝovu kaj demetu .gpx, geojson aŭ .kml dosieron sur la paĝon, aŭ klaku la butonon ĉe dekstre por foliumi",
             "zoom": "Pligrandigi tavolon",
             "browse": "Esplori por dosieron"
         },
             "view_on_mapillary": "Montri ĉi tiun bildon en Mapillary"
         },
         "openstreetcam_images": {
-            "tooltip": "Strat-niveloj fotoj de OpenStreetCam",
+            "tooltip": "Strat-nivelaj fotoj de OpenStreetCam",
             "title": "Fotara surtavolo (OpenStreetCam)"
         },
         "openstreetcam": {
         "help": {
             "title": "Helpo",
             "key": "H",
-            "help": "# Helpo\n\nĈi tiu estas redaktilo por [OpenStreetMap](http://www.openstreetmap.org/) - la libera kaj redaktebla mondmapo. Vi povas ĝin uzi por aldoni kaj ĝisdatigi datumojn pri via ĉirkaŭaĵo, farante malfermkodan kaj malferm-datuman mapon de la mondo pli bona por ĉiuj.\n\nRedaktoj, kiujn vi faras sur ĉi tiu mapo estos videblaj por ĉiu, kiu uzas OpenStreetMap. Por fari redakton, vi devos [ensaluti](https://www.openstreetmap.org/login).\n\nLa [redaktilo 'iD'](http://ideditor.com/) estas kunlabora projekto, kies [fontkodo estas disponebla en GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Redaktado kaj konservado\n\nĈi tiu redaktilo estas destinita por labori ĝenerale enrete, kaj vi nun uzas ĝin per retejo.\n\n### Elektado de objektoj\n\nPor elekti map-objekton - kiel vojon aŭ interesejon - klaku ĝin sur la mapo. Tio ĉi markos elektitan objekton kaj malfermos panelon kun detaloj pri ĝi. Se vi dekstre-klakas ĝin, tio ĉi montros menuon de agoj pri objekto.\n\nPor elekti kelkajn objektojn, premtenu la ‘majusklan’ klavon. Tiam aŭ klaku objektojn, kiujn vi volas elekti, aŭ trenu sur mapo por desegni konturon ĉirkaŭ tiuj objektoj. Ĉiuj punktoj ene de kaptoŝnura areo estos elektitaj.\n\n### Konservado de redaktoj\n\nKiam vi estas ŝanĝanta ion, kiel redakti vojojn, konstruaĵojn kaj lokoj, tiuj ŝanĝoj estas konservataj loke antaŭ vi konservos ilin en la servilon. Ne ĉagreniĝu, se vi eraras - vi povas malfari ŝanĝojn klakante butonon ‘malfari’ kaj refari klakante butonon ‘refari’.\n\nKlaku ‘Konservi’ por fini grupon da redaktoj, ekzemple vi fine mapigis terenon de urbo kaj vi volas komenci novan terenon. Vi havos ŝancon por kontroli kion vi estos farinta kaj la redaktilo montros uzeblajn konsilojn kaj avertojn se io povus esti malĝusta.\n\nSe ĉio ŝajnos ĝuste, vi povos entajpi etan komenton klarigantajn faritajn ŝanĝojn, klaku ‘Konservi’ por publikigi viajn redaktojn al [OpenStreetMap.org](http://www.openstreetmap.org/), kie ili estos videblaj por ĉiuj aliaj uzantoj kaj pretaj por plia plibonigo.\n\nSe vi ne povas fini viajn redaktojn dum unufoje, vi povas fermi fenestron kun redaktilo, kaj reveni poste (ĉe sama foliumilo kaj komputilo) kaj la redaktilo restarigos vian laboron.\n\n### Uzado de redaktilo\n\nVi povas vidi liston de disponeblaj fulmoklavoj per premi la klavon ‘?’\n",
-            "roads": "# Vojoj\n\nVi povas krei, korekti kaj forigi vojojn per ĉi tiu redaktilo. Vojo povas esti de iu ajn speco: piediradaj vojetoj, aŭtovojoj, biciklvojoj, kaj pli - ĉiu regule uzata vojo estas mapiginda.\n\n### Elektado\n\nKlaku vojon por ĝin elekti. Ĝia konturo ekvidebliĝos, kune kun flanka breto montranta pli da informoj pri la vojo. Se vi dekstre-klakas ĝin, tio ĉi vidigos menuon de agoj pri la vojo.\n\n### Redaktado\n\nOfte vi vidos vojojn, kiuj ne estos alĝustigitaj al la malantaŭa fotaro aŭ al GPS-spuro. Vi povas korekti tiujn vojojn, do ili troviĝos en ĝusta loko.\n\nUnue klaku vojon, kiun vi volas ŝanĝi. Tio ĉi markos ĝin kaj montros kontrolpunktojn laŭlonge de ĝi, kiujn vi povas treni al pli bonaj lokoj. Se vi volas aldoni novan kontrolpunkton por plidetaligi, duoble klaku parton de vojo sen nodo kaj ĝi estos aldonita.\n\nSe vojo estas konektita al alia vojo, sed ili ne ĝuste kunigitaj sur la mapo, vi povas treni unu el iliaj kontrolpunktoj sur alian vojon por kunigi ilin. Konektado de vojoj estas grava por la mapo kaj necesa por liveri navigadon.\n\nVi ankaŭ povas dekstre-klaki ĝin kaj elekti la ilon ‘Movi’ aŭ premi fulmoklavon ‘M’ por movi la tutan vojon per unu fojo kaj klaki denove por konservi ĉi tiun agon.\n\n### Forigado\n\nSe vojo estas tute erara - vi vidas, ke ĝi ne ekzistas sur satelita fotaro kaj eĉ vi konfirmis enloke, ke ĝi ne ekzistas - vi povas ĝin forigi el la mapo. Estu singarda dum forigado de objektoj - kiel ĉiu alia redakto, rezultoj estos videblaj al ĉiuj kaj satelita fotaro estas ofte neĝisdata, do vojo simple povus esti ĵus konstruita.\n\nVi povas forigi vojon per klaki ĝin por ĝin elekti kaj premi la forigan klavon, aŭ per dekstre-klaki ĝin kaj klaki piktogramon de rubujo.\n\n### Kreado\n\nEble vi trovis, ke ie povas esti vojon, tamen ĝi ne troviĝas sur la mapo? Klaku piktogramon de linio ĉe supra maldekstra angulo aŭ premu fulmoklavon ‘2’ por komenci desegni linion.\n\nKlaku komencon de la vojo sur mapo por komenci desegni. Se vojo disiĝas el ekzistanta vojo, komencu per klaki lokon, kie ili konektiĝas.\n\nSekve klaku punktojn laŭlonge de vojo tiel, kiel ili formiĝas ĝusta kurso laŭ satelita fotaro aŭ GPS. Se desegnata vojo interkruciĝas kun alia vojo, konektu ilin per klaki sekcopunkton. Kiam vi finos desegni, duoble klaku aŭ premu enen-klavon.\n",
-            "gps": "# GPS\n\nKolektitaj GPS-spuroj estas valoraj fontoj de datumoj por OpenStreetMap. Ĉi tiu redaktilo subtenas lokajn spurojn - .gpx dosierojn en via loka komputilo. Vi povas kolekti tiajn GPS-spurojn per multe da poŝtelefonaj aplikaĵoj aŭ per persona GPS-a aparato.\n\nPor pli da informoj kiel fari GPS-an esploron, legu pri [mapigado per poŝtelefono, GPS aŭ papero](http://learnosm.org/en/mobile-mapping/) (malesperante).\n\nPor uzi GPX-spuron por mapigado, ŝovu kaj demetu GPX-dosieron sur la map-redaktilon. Se ĝi estos rekonita, ĝi estos aldonita al la mapo kiel helpurpura linio. Klaku menuon 'Map-datumoj' ĉe dekstre  por aktivigi, malaktivigi aŭ pligrandigi al ĉi tiu nova GPX-a tavolo.\n\nGPX-spuro ne estas rekte alŝutita al OpenStreetMap - la plej bona maniero por uzi ĝin estas vidigi ĝin sur la mapo por desegni iujn objektojn kaj ankaŭ [alŝuti ĝin al OpenStreetMap](http://www.openstreetmap.org/trace/create) por ke aliaj uzantoj povos uzi ĝin.\n",
-            "imagery": "# Fotaro\n\nAerfotaro estas grava fonto por mapigado. Kombino de aerfotoj, satelitaj fotoj kaj libere kreeblaj fontoj estas disponebla en la redaktilo per menuo 'Fonaj agordoj' ĉe dekstre.\n\nImplicite satelita tavolo de [Bing Mapoj](http://www.bing.com/maps/) estas montrata en la redaktilo, tamen kiam vi aldirektas kaj pligrandigas al aliaj lokoj, novaj fontoj iĝos disponeblaj. Por kelkaj landoj - kiel Usono, Francujo aŭ Danujo - tre altkvalita fotaro estas disponebla por iuj areoj.\n\nFotaro estas iam deŝovita de map-datumoj pro eraro rilatanta al retejo de liveranto. Se vi vidas multe da vojoj deŝovitaj de fono, ne abrupte movi ilin laŭ la fono. Anstataŭ vi povas alĝustigi fotaron tiel, ke ĝi kongruos kun ekzistaj datumoj per klaki 'Ĝustigi fotaran deŝovon' ĉe malsupro de menuo de fonaj agordoj.\n",
-            "addresses": "# Adresoj\n\nAdresoj estas ĝenerale la plej utilaj informoj sur la mapo.\n\nKvankam adresoj ofte figuras kiel partoj de stratoj, en OpenStreetMap ili figuras kiel atribuoj de konstruaĵoj kaj ejoj laŭlonge de stratoj.\n\nVi povas aldoni informojn pri adresoj al mapigitaj ejoj, kiel konstruaĵaj konturoj kaj ankaŭ kiel apartaj punktoj. La plej bona fonto de adresaj datumoj estas loka esploro aŭ persona scio - simile kiel pri aliaj objektoj, kopiado de komercaj fontoj kiel 'Google Mapoj' estas absolute malpermesata.\n",
-            "inspector": "# Uzado de kontrolilo\n\nLa kontrolilo troviĝas ĉe maldekstra flanko de paĝo kaj ebligas al vi redakti detalojn pri elektita objekto.\n\n### Elektado de objekta speco\n\nKiam vi aldonos punkton, linion aŭ areon, vi povas elekti specon de objekto, kiel ĉu ĝi estas ŝoseo aŭ loka vojo, superbazaro aŭ kafejo. La kontrolilo montros butonojn por kutimaj specoj de objektoj kaj vi povas serĉi aliajn per tajpi kiun vi serĉas en serĉkampo.\n\nKlaku 'i' ĉe malsupra dekstra angulo de butono de objekta speco por pli da informoj. Klaku butonon por ŝanĝi tiun specon.\n\n### Uzado de formularoj kaj redaktado de etikedoj\n\nKiam vi elektos objektan specon aŭ kiam vi elektos objekton, kiu jam havas atribuitan specon, la kontrolilo montros kampojn kun detaloj pri la objekto kiel ĝian nomon kaj adreson.\n\nSube videblaj kampoj, vi povas klaki menuon 'Aldoni kampon' por aldoni aliajn detalojn, kiel vikipedian ligilon, rulseĝan alireblon, kaj pli.\n\nĈe malsupro de kontrolilo, klaku 'Ekstraj etikedoj' por aldoni aliajn malneprajn etikedojn al la objekto. [Taginfo](http://taginfo.openstreetmap.org/) estas bonega ejo por lerni pli pri popularaj kombinoj de etikedoj.\n\nŜanĝoj faritaj per la kontrolilo estas aŭtomate aplikitaj al la mapo. Vi povas malfari ilin ĉiam per klaki la butonon 'Malfari'.\n",
-            "buildings": "# Konstruaĵoj\n\nOpenStreetMap estas la plej ampleksa tutmonda datumbazo de konstruaĵoj. Vi povas kontribui al ĉi tiu datumbazo.\n\n### Elektado\n\nVi povas elekti konstruaĵon per klaki ĝian konturon. Ĉi tio markos la konstruaĵon kaj malfermos flankan breton montrantan pli da informoj pri la konstruaĵo. Se vi dekstre-klakas ĝin, menuo de agoj fareblaj pri la konstruaĵo estos montrata.\n\n### Redaktado\n\nIam konstruaĵoj estas malĝuste lokigita aŭ havas malĝustajn etikedojn.\n\nPor movi tutan konstruaĵon, elektu ĝin, sekve klaku ilon ‘Movi’. Trenu vian muson por movi la konstruaĵon kaj klaku kiam ĝi estos en ĝusta loko.\n\nPor ripari konstruaĵan figuron, klaku kaj trenu nodojn, kiuj formas ĝian konturon al pli ĝustaj pozicioj.\n\n### Kreado\n\nIu el fundamentaj demandoj pri aldonado de konstruaĵoj al la mapo estas ke OpenStreetMap registras ilin ambaŭ kiel figurojn kaj punktojn. Oni konsilas _mapigi konstruaĵojn kiel figurojn ĉiam, kiam tio eblas_ kaj mapigi firmaojn, domojn, servojn kaj aliajn aĵojn kiuj funkcias sendepende de konstruaĵoj kiel punktojn en konstruaĵa figuro.\n\nKomenci desegni konstruaĵon kiel figuron per klaki butonon ‘Areo’ supre maldekstre de fasado kaj finigi ĝin aŭ premante enen-klavon aŭ klakante komencan nodon por finigi ĝian konturon.\n\n### Forigado\n\nSe konstruaĵo estas sendube erara - vi vidas, ke ĝi ne ekzistas en satelita fotara kaj vi eĉ konfirmis loke, ke ĝi ne ekzistas - vi povas forigi ĝin el la mapo. Estu singarda dum forigado de objektoj - kiel iu ajn redakto, rezultoj estos videblaj por ĉiuj kaj satelita fotaro estas ofte neĝisdata, do simple konstruaĵo povus esti ĵus konstruita.\n\nVi povas forigi konstruaĵon per klaki ĝin por ĝin elekti, kaj sekve premi la forigan klavon aŭ dekstre-klaku ĝin kaj klaki piktogramon de rubujo.\n",
-            "relations": "# Rilatoj\n\nRilato estas speciala tipo de OpenStreetMap-a objekto, kiu grupigas aliajn objektojn. Ekzemplo: du komunajn specoj de rilatoj estas *kursaj rilatoj*, kiuj grupigas segmentojn de vojo kiuj apartenas al specifa kurso kaj *plurangularoj*, kiuj grupigas kelkajn liniojn por difini kompleksan areon (konsistanta el kelkaj pecoj aŭ enhavanta truojn).\n\nGrupo da objektoj en rilato nomiĝas *anoj*. Ĉe malsupro de flanka breto vi povas vidi de kiu rilato ano apartenas al, kaj klaku rilaton tie por elekti ĝin. Kiam la rilato estas elektita, vi povas vidi ĉiujn ĝiajn anojn listigitajn en flanka breto kaj markitajn sur la mapo.\n\nPlejofte la redaktilo aŭtomate zorgos pri rilatoj dum redaktado. La plej grava afero pri kiu vi devus konscia estas, ke se vi forigos segmenton de redesegni ĝin pli akurate, vi devos certiĝi, ke nova segmento estos ano de sama rilato kiel la originala.\n\n## Redaktado de rilatoj\n\nSe vi volas redakti rilatojn, jen komencoj.\n\nPor aldoni objekton al rilato, elektu objekton, klaku la butonon '+' en sekcio 'Ĉiuj rilatoj' de flanka breto, kaj elektu/entajpu nomon por la rilato.\n\nPor krei novan rilaton, unue elektu objekton, kiu iĝos ano, klaku la butonon '+' en sekcio 'Ĉiuj rilatoj' kaj elektu 'Nova rilato…'.\n\nPor forigi objekton el rilato, elektu la objekton kaj klaku rubujan butonon ĉe rilato, el kiu vi volas ĝin forigi.\n\nVi povas krei plurangularojn kun truojn per la ilo ‘Kunfandi’. Desegnu du areojn (enan kaj eksteran), premtenu majusklan klavon kaj klaku ĉiun por elekti ilin ambaŭ kaj sekve premu la klavon ‘C’. Vi ankaŭ povas elekti ilin ambaŭ kaj dekstre-klaki unu kaj klaki la butonon ‘Kunfandi’ (+).\n"
+            "help": {
+                "title": "Helpo",
+                "welcome": "Bonvenon al la redaktilo iD por [OpenStreetMap](https://www.openstreetmap.org/). Per tiu ĉi redaktilo vi povas aktualigi OpenStreetMap senpere en via foliumilo.",
+                "open_data_h": "Malfermaj datumoj",
+                "open_data": "Redaktoj faritaj en tiu ĉi mapo estos videblaj por ĉiu, kiu uzas OpenStreetMap. Viaj redaktoj povas baziĝi sur via propra scio, loka pristudo aŭ sur fotaro aera aŭ strat-nivela. Kopiado el komercaj fontoj ekz. Google Maps [estas absolute malpermesata](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Antaŭkomenco",
+                "before_start": "Vi devus ekkoni kun OpenStreetMap kaj kun tiu ĉi redaktilo antaŭ vi komencos redakti. iD enhavas gvidilon por instrui al vi fundamenton de redakti OpenStreetMap. Klaku “malfermi gvidilon” sur tiu ĉi ekrano por legi la gvidilon – tio ĉi okupiĝos apenaŭ proksimume 15 minutoj.",
+                "open_source_h": "Malferma kodo",
+                "open_source": "La redaktilo iD estas kunlabora malfermkoda projekto kaj vi nun uzas version {version}. La fontkodo estas disponebla [ĉe GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Vi povas helpi al iD per [traduki](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) aŭ [raporti problemojn](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Sumigo",
+                "navigation_h": "Navigi",
+                "navigation_drag": "Vi povas treni la mapon per premteni la {leftclick} maldekstran mus-butonon kaj movi la muson ĉirkaŭe. Vi ankaŭ povas uzi la `↓`, `↑`, `←`, `→` saget-klavojn sur via klavaro.",
+                "navigation_zoom": "Vi povas pligrandigi aŭ malgrandigi per musa rado aŭ tuŝplato aŭ per klaki la butonojn {plus} / {minus} flanke de la mapo. Vi ankaŭ povas uzi la `+`, `-` klavojn sur via klavaro.",
+                "features_h": "Map-objektoj",
+                "features": "Ni uzas la vorton “objekto” por priskribi ĉiujn aĵojn troviĝantajn sur la mapo, kiel vojojn, konstruaĵojn, aŭ punktojn de intereso. Ĉio en la reala mondo povas esti mapigita kiel objekto en OpenStreetMap. Map-objektoj estas reprezentataj kiel “punktoj”, “linioj” aŭ “areoj”.",
+                "nodes_ways": "En OpenStreetMap punktoj estas iam nomataj kiel “nodoj” kaj linioj kaj areoj kiel “linioj”."
+            },
+            "editing": {
+                "title": "Redakti kaj konservi",
+                "select_h": "Elekto",
+                "select_left_click": "{leftclick} Maldekstre-klaku objekton por ĝin elekti. Tiel ĝi estos markita per pulsanta lumo kaj sur la flankbreto vidiĝos detaloj pri tiu objekto, kiel ĝia nomo aŭ adreso.",
+                "select_right_click": "{rightclick} Dekstre-klaku objekton por vidigi redakt-menuon, kiu montras eblajn agojn kiel rotacii, movi aŭ forigi.",
+                "multiselect_h": "Plurelekto",
+                "multiselect_shift_click": "`{shift}`+{leftclick} maldekstre-klaku por elekti kelkajn objektojn kune. Tiel estas facile movi aŭ forigi plurajn objektojn.",
+                "multiselect_lasso": "Alia maniero por elekti plurajn objektojn estas premi la klavon `{shift}` kaj sekve premtenu la {leftclick} maldekstran mus-butonon kaj ŝovu la muson por elekti per kaptoŝnuro. Ĉiuj punktoj ene la kaptoŝnuro estos elektitaj.",
+                "undo_redo_h": "Malfari kaj refari",
+                "undo_redo": "Viaj redaktoj estas konservataj loke ne via foliumilo ĝis vi decidiĝos konservi ilin al la OpenStreetMap-servilo. Vi povas malfari redaktojn per klaki la butonon {undo} **malfari**  kaj malmalfari ilin per klaki la butonon {redo} **refari**.",
+                "save_h": "Konservi",
+                "save": "Klaku {save} **konservi** por fini viajn redaktojn kaj sendi ilin al OpenStreetMap. Memoru pri ofte konservi vian laboron!",
+                "save_validation": "Ĉe la konserva ekrano, vi havos ŝancon por revizii kion vi faris. iD ankaŭ supraĵe kontrolos pri mankaj datumoj kaj eble proponos helpajn sugestojn kaj avertojn se io estos malĝusta.",
+                "upload_h": "Alŝuti",
+                "upload": "Antaŭ alŝuti ŝanĝojn vi devas entajpu [ŝanĝaran komenton](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Poste klaku **alŝuti** por sendi viajn ŝanĝojn al OpenStreetMap, kie ili estos kunigitaj en la mapon kaj publike videblaj por ĉiuj.",
+                "backups_h": "Aŭtomataj sekurkopioj",
+                "backups": "Se vi ne povas fini viajn redaktojn dum unufoje, ekzemple kiam via komputilo paneas aŭ vi fermas langeton de via foliumilo, viaj redaktoj plue estas konservitaj en foliumila konservejo. Vi povas reveni poste (ĉe la sama foliumilo kaj komputilo) kaj iD proponos al vi pluigi vian laboron.",
+                "keyboard_h": "Fulmoklavoj",
+                "keyboard": "Vi povas vidigi liston de fulmoklavoj per premi la klavon `?`."
+            },
+            "feature_editor": {
+                "title": "Objekt-redaktilo",
+                "intro": "La objekt-redaktilo montriĝas flanke de la mapo kaj ebligas al vi vidi kaj redakti ĉiujn informojn pri elektita objekto.",
+                "definitions": "Supre vidiĝas speco de objekto. Meze troviĝas *kampoj* montrantaj ecojn de la objekto kiel ĝia nomo aŭ adreso.",
+                "type_h": "Speco de objekto",
+                "type": "Vi povas klaki specon de objekto por ŝanĝi ĝin al alia. Ĉio, kio ekzistas en la reala mondo povas esti aldonita al OpenStreetMap, do estas miloj da specoj de elekteblaj objektoj.",
+                "type_picker": "La spec-elektilo montras la plej popularajn specojn de objektoj, kiel parkojn, malsanulejojn, restoraciojn, vojojn kaj konstruaĵojn. Vi povas serĉi ion ajn per entajpi ĝin en serĉujon. Vi ankaŭ povas klaki la piktogramon {inspect} **informojn** ĉe speco de objekto por sciigi pli pri ĝi.",
+                "fields_h": "Kampoj",
+                "fields_all_fields": "La sekcio “ĉiuj kampoj“ enhavas ĉiujn redakteblajn detalojn pri la objekto. En OpenStreetMap ĉiuj kampoj estas malnepraj, do estas ĝuste lasi ilin malplenaj se vi malcertas.",
+                "fields_example": "Ĉe ĉiu objekto vidiĝos diversaj kampoj. Ekzemple, ĉe vojo vidiĝos kampoj pri ĝia pavimo kaj rapidlimo, tamen ĉe restoracio vidiĝos kampoj pri manĝospeco kaj horoj de malfermado.",
+                "fields_add_field": "Vi povas klaki rapid-aldonan menuon “aldoni kampojn” por aldoni pliajn kampojn, kiel priskribon, Vikipedian ligilon, rulseĝan alireblecon kaj pli.",
+                "tags_h": "Etikedoj",
+                "tags_all_tags": "Malsupre de kampa sekcio vi povas etendi la sekcion “ĉiuj kampoj” por redakti ĉiujn OpenStreetMap-ajn etikedojn por la elektita objekto. Ĉiu etikedo konsistas el “ŝlosilo” kaj “valoro”, datumoj difinantaj ĉiujn objektojn konservitajn en OpenStreetMap.",
+                "tags_resources": "Redakti etikedojn de objekto bezonas iom da scio pri OpenStreetMap. Vi devus konatiĝi kun informaroj kiel [OpenStreetMap-vikio](https://wiki.openstreetmap.org/wiki/Eo:Main_Page) aŭ [Taginfo](https://taginfo.openstreetmap.org/) por sciigi pli pri akceptataj manieroj de etikedado en OpenStreetMap."
+            },
+            "points": {
+                "title": "Punktoj",
+                "intro": "“Punktoj” estas uzataj por reprezenti objektojn kiel vendejojn, restoraciojn aŭ monumentojn. Ili indikas difinan lokon kaj priskribas kion estas tie.",
+                "add_point_h": "Aldoni punktojn",
+                "add_point": "Por aldoni punkton, klaku la butonon {point} **punkto** sur la ilobreto supre de mapo aŭ premu la fulmoklavon `1`. Tiel la mus-kursoro ŝanĝiĝos al kruc-simbolo.",
+                "add_point_finish": "Por enmeti la novan punkton sur la mapon, direktu la mus-kursoron tien, kien la punkto estu, kaj {leftclick} maldekstre-klaku aŭ premu la `spacostangon`.",
+                "move_point_h": "Movi punktojn",
+                "move_point": "Por movi punkton, direktu la mus-kursoron al la punkto, kaj premtenu la {leftclick} maldekstran mus-butonon ŝovante la punkton al nova loko.",
+                "delete_point_h": "Forigi punktojn",
+                "delete_point": "Estas ĝuste forigi objektojn, kiuj ne ekzistas en la reala mondo. Forigado de objekto el OpenStreetMap forigas ĝin el la mapo uzataj de multe da homoj, do certiĝu, ke objekto vere ne ekzistas antaŭ vi ĝin forigas.",
+                "delete_point_command": "Por forigi punkton, {rightclick} dekstre-klaku la punkton por ĝin elekti kaj vidigi redaktan menuon, kaj sekve klaku {delete} **forigi**."
+            },
+            "lines": {
+                "title": "Linioj",
+                "intro": "*Linioj* estas uzataj por reprezenti objektojn kiel vojojn, fervojojn aŭ riverojn. Linioj devas esti desegnitaj meze de reprezentata objekto.",
+                "add_line_h": "Aldoni liniojn",
+                "add_line": "Por aldoni linion, klaku la butonon {line} **linio** sur la ilobreto supre de mapo aŭ premu la fulmoklavon `2`. Tiel la mus-kursoro ŝanĝiĝos al kruc-simbolo.",
+                "add_line_draw": "Sekve movu la mus-kursoron tien, kien la linio komencu kaj {leftclick} maldekstre-klaku aŭ premu la `spacostangon` por komenci loki nodojn laŭlonge de linio. Pluigu enmeti pliajn nodojn per klaki aŭ per premi la `spacostangon`. Dum desegnado vi povas pligrandigi aŭ ŝovi la mapon por aldoni pli da detaloj.",
+                "add_line_finish": "Por fini linion, premu `enen-klavon` aŭ klaku denove la lastan nodon.",
+                "modify_line_h": "Modifi liniojn",
+                "modify_line_dragnode": "Ofte vi rimarkos ke linioj formiĝas malĝuste, ekzemple vojo ne kongruas kun fona fotaro. Por alĝustigi linion, unue {leftclick} maldekstre-klaku por ĝin elekti. Ĉiuj nodoj de la linio estos markitaj per cirkletoj. Tiam vi povas ŝovi nodojn al pli ĝustaj pozicioj.",
+                "modify_line_addnode": "Vi ankaŭ povas krei novajn nodojn laŭlonge de linio aŭ per {leftclick}**x2** duoble klaki la linion aŭ per treni trianguletojn al mezpunktoj inter nodoj.",
+                "connect_line_h": "Konekti liniojn",
+                "connect_line": "Ĝuste konektitaj linioj estas gravaj por la mapo kaj necesega por provizi navigadon.",
+                "connect_line_display": "Konektoj inter vojoj estas reprezentataj per grizaj cirkletoj. Finpunktoj de linioj, kiuj ne estas konektitaj kun io ajn estas reprezentataj per pli grandaj blankaj cirkletoj.",
+                "connect_line_drag": "Por konekti linion kun alia objekto, trenu unu nodon de la linio al alia objekto ĝis ambaŭ kuniĝos. Konsilo: vi povas premi la `{alt}`-klavon por ke nodoj ne konektu kun aliaj objektoj.",
+                "connect_line_tag": "Se vi scias ke tiu vojkruciĝo havas trafiklumojn aŭ pasejon zebrostrian, vi povas aldoni ilin per elekti la interkruciĝan nodon kaj uzi la objekt-redaktilon por elekti ĝustan specon de la objekto.",
+                "disconnect_line_h": "Malkonekti liniojn",
+                "disconnect_line_command": "Por malkonekti liniojn de alia objekto, {rightclick} dekstre-klaku la kunigantan nodon kaj elektu la ordonon {disconnect} **malkonekti** el la redakt-menuo.",
+                "move_line_h": "Movi liniojn",
+                "move_line_command": "Por movi tutan linion, {rightclick} dekstre-klaku ĝin kaj elekti la ordonon {move} **movi** el la redakt-menuo. Sekve movu la muson kaj {leftclick} maldekstre-klaku por enmeti linion al nova loko.",
+                "move_line_connected": "Linioj konektitaj kun aliaj objektoj restos konektitaj kiam vi movos la linion al la nova loko. iD povas preventi vin de movi linion trans alia konektita linio.",
+                "delete_line_h": "Forigi liniojn",
+                "delete_line": "Se linio estas sendube erara, ekzemple estas vojo, kiu ne ekzistas en la reala mondo, estas ĝuste forigi ĝin. Estu singarda kiam forigi objektojn: la fona fotaro povas esti neĝisdata, do malĝuste aspektanta vojo povas esti konstruita antaŭ nelonga tempo.",
+                "delete_line_command": "Por forigi linion, {rightclick} dekstre-klaku la linion por ĝin elekti kaj vidigi redaktan menuon, kaj sekve klaku {delete} **forigi**."
+            },
+            "areas": {
+                "title": "Areoj",
+                "intro": "*Areoj* estas uzataj por reprezenti konturojn de objektoj kiel lagoj, konstruaĵoj kaj privatdomaj terenoj. Areoj devas esti desegnitaj ĉirkaŭ reprezentata objekto, ekzemple laŭlonge muroj de konstruaĵo.",
+                "point_or_area_h": "Punktoj aŭ areoj?",
+                "point_or_area": "Multaj objektoj povas esti reprezentitaj kiel punktoj aŭ areoj. Vi devas mapigi konstruaĵojn kaj limojn de terenoj kiel areojn ĉiam, kio tio eblas. Enmetu punktojn ene konstruaĵa areo por reprezenti firmaojn, servojn kaj aliajn objektojn troviĝantajn ene la konstruaĵo.",
+                "add_area_h": "Aldoni areojn",
+                "add_area_command": "Por aldoni areon, klaku la butonon {area} **areo** sur la ilobreto supre de mapo aŭ premu la fulmoklavon `3`. Tiel la mus-kursoro ŝanĝiĝos al kruc-simbolo.",
+                "add_area_draw": "Sekve loku la mus-kursoron en iu angulo de la objekto kaj {leftclick} maldekstre-klaku aŭ premu la `spacostangon` por komenci enmeti nodojn ĉirkaŭ ekstera limo de la areo. Pluigu enmeti pliajn nodojn per klaki aŭ premi la `spacostangon`. Dum desegnado vi povas pligrandigi aŭ ŝovi la mapon por aldoni pli da detaloj.",
+                "add_area_finish": "Por fini areon, premu la `enen-klavon` aŭ klaku ree aŭ la unuan aŭ lastan nodon.",
+                "square_area_h": "Ortaj anguloj",
+                "square_area_command": "Multaj areaj objektoj kiel konstruaĵoj havas ortajn angulojn. Por kvadratigi angulojn de areo, {rightclick} dekstre-klaku la angulon kaj elektu la ordon {orthogonalize} **kvadratigi** el la redakt-menuo.",
+                "modify_area_h": "Modifi areojn",
+                "modify_area_dragnode": "Ofte vi rimarkos ke areoj formiĝas malĝuste, ekzemple konstruaĵo ne kongruas kun fona fotaro. Por alĝustigi areon unue {leftclick} maldekstre-klaku por ĝin elekti. Ĉiuj nodoj de la areo estos markitaj per cirkletoj. Tiam vi povas ŝovi nodojn al pli ĝustaj pozicioj.",
+                "modify_area_addnode": "Vi ankaŭ povas krei novajn nodojn surlime de areo aŭ per {leftclick}**x2** duoble klaki la angulon de la areo aŭ per treni trianguletojn al mezpunktoj inter nodoj.",
+                "delete_area_h": "Forigi areojn",
+                "delete_area": "Se areo estas sendube erara, ekzemple estas konstruaĵo, kiu ne ekzistas en la reala mondo, estas ĝuste forigi ĝin. Estu singarda kiam forigi objektojn: la fona fotaro povas esti neĝisdata, do malĝuste aspektanta konstruaĵo povas esti konstruita antaŭ nelonga tempo.",
+                "delete_area_command": "Por forigi areon, {rightclick} dekstre-klaku la areon por ĝin elekti kaj vidigi redaktan menuon, kaj sekve klaku {delete} **forigi**."
+            },
+            "relations": {
+                "title": "Rilatoj",
+                "intro": "*Rilato* estas speciala speco de objekto en OpenStreetMap, kiu grupigas aliajn objektojn. Objektojn apartenantajn al rilato oni nomas kiel *anojn* kaj ĉiu ano povas havi *rolon* en la rilato.",
+                "edit_relation_h": "Redakti rilatojn",
+                "edit_relation": "Malsupre de la objekt-redaktilo vi povas etendi la sekcion *ĉiuj rilatoj* por vidi ĉu la elektita objekto estas ano de iu rilato. Vi ankaŭ povas klaki la rilaton por elekti kaj redakti ĝin.",
+                "edit_relation_add": "Por aldoni objekton al rilato, elektu ĝin, sekve klaku la butonon {plus} aldoni rilaton en la sekcio “ĉiuj rilatoj” de la objekt-redaktilo. Vi povas elekti el listo de proksimaj rilatoj aŭ krei la novan rilaton.",
+                "edit_relation_delete": "Vi ankaŭ povas klaki la butonon {delete} **forigi** por forigi la elektitan objekton el la rilato. Se vi forigos ĉiuj anoj de la rilato, la rilato aŭtomate foriĝos.",
+                "maintain_relation_h": "Administri rilatojn",
+                "maintain_relation": "Pri plejparto da rilatoj iD administros aŭtomate dum kiam vi redaktos. Vi devus esti singarda dum anstataŭigi objektojn kiujn povas esti anoj de rilatoj. Ekzemple se vi forigos fragmenton de vojo kaj desegnos novan fragmenton por anstataŭigi ĝin, vi devus aldoni novan fragmenton al la samaj rilatoj (kursoj, turnaj limigoj, ktp) kiel la eksa.",
+                "relation_types_h": "Tipoj de rilatoj",
+                "multipolygon_h": "Plurangularoj",
+                "multipolygon": "Rilato *plurangularo* (ang. multipolygon) estas grupo da unu aŭ pli *eksteraj* objektoj kaj unu aŭ pli *enaj* objektoj. La ekstera objekto difinas eksterajn limojn de la plurangularo kaj la ena difinas subareojn aŭ truojn eltranĉitajn el la plurangularo.",
+                "multipolygon_create": "Por krei plurangularon – ekzemple konstruaĵon kun truo ene – desegnu la eksteran limon kiel areon kaj enan limon kiel alia areo. Sekve `{shift}`+{leftclick} maldekstre-klaku por elekti ambaŭ objektoj, {rightclick} dekstre-klaku por vidigi la redakt-menuon kaj elekti la ordon **kunfandi**.",
+                "multipolygon_merge": "Kunfandi kelkajn liniojn aŭ areojn kreos novan plurangularan rilaton kun ĉiuj elektitaj areoj kiel anoj. iD aŭtomate elektos enan kaj eksteran rolojn surbaze de kiu elemento troviĝas interne de alia objekto.",
+                "turn_restriction_h": "Turnaj limigoj",
+                "turn_restriction": "Rilato *turna limigo* (ang. turn restriction) estas grupo da kelkaj voj-segmentoj proksime de vojkruciĝo. Turna limigo konsistas el nodoj aŭ vojoj: “el”, “tra” kaj “al”.",
+                "turn_restriction_field": "Por redakti turnan limigon, elektu nodon kie du aŭ pli vojoj interkruciĝas. La objekt-redaktilo vidigos specialan kampon “turnaj limigoj” enhavantan skizon de vojkruciĝo.",
+                "turn_restriction_editing": "Ĉe la kampo “turnaj limigoj”, klaku por elekti vojon “el” kaj rigardu ĉu turnoj estas permesataj aŭ malpermesataj al vojoj “al”. Vi povas klaki piktogramojn de turnoj por baskuli ilin inter permesata kaj malpermesata. iD aŭtomate kreos rilatojn kaj agordos rolojn “el”, “tra” kaj “al” depende de via elektoj.",
+                "route_h": "Kursoj",
+                "route": "Rilato “kurso” estas grupo da unu aŭ pli liniaj objektoj kiuj kune formas kursan reton, kiel linion aŭtobusan, fervojan aŭ aŭtovojon.",
+                "route_add": "Por aldoni objekton al kursan rilaton, elektu ĝin kaj ŝovumu suben ĝis la sekcio “ĉiuj rilatoj”  de la odjekt-redaktilo, sekve klaku la butonon {plus} aldoni por aldoni tiun ĉi objekton al proksima ekzistanta rilato aŭ al nova rilato.",
+                "boundary_h": "Limoj",
+                "boundary": "Rilato “limo” estas grupo da unu aŭ pli liniaj objektoj kiuj kune formas administran limon.",
+                "boundary_add": "Por aldoni objekton al liman rilaton, elektu ĝin kaj ŝovumu suben ĝis la sekcio “ĉiuj rilatoj”  de la odjekt-redaktilo, sekve klaku la butonon {plus} aldoni por aldoni tiun ĉi objekton al proksima ekzistanta rilato aŭ al nova rilato."
+            },
+            "imagery": {
+                "title": "Fona fotaro",
+                "intro": "Fona fotaro videbla malantaŭ map-datumoj estas grava fonto por mapigi. Tiu ĉi fotaro povas esti kolektita per satelitoj, aviadiloj aŭ flugrobotoj, aŭ ĝi povas esti skanita historia mapo aŭ aliaj libere disponeblaj datumoj.",
+                "sources_h": "Fontoj de fotaro",
+                "choosing": "Por vidigi disponeblajn fontojn de fotaro por mapigi, klaku la butonon {layers} **agordoj de fono** flanke de la mapo.",
+                "sources": "Implicite satelita fotaro de [Bing Mapoj](https://www.bing.com/maps/) estas elektita kiel fono. Depende de kie vi mapigas, aliaj fontoj de fotaro povas esti elekteblaj. Iuj povas esti pli aktualaj aŭ pli akurataj, do ĉiam indas kontroli kiu tavolo estas plej taŭga por uzi kiel map-referencon.",
+                "offsets_h": "Ĝustigi fotaran deŝovon",
+                "offset": "Fotaro estas iomete deŝovita rilate al akurataj map-datumoj. Se vi vidas multe da vojoj kaj konstruaĵoj deŝovitaj rilate al la fona fotaro, probable la fotaro estas malĝusta, do ne movu ilin por kongrui al la fono. Anstataŭ tio, vi povas ĝustigi la fonon tiel, kiel ĝi kongruos kun ekzistantaj datumoj per etendi la sekcion “ĝustigi fotaran deŝovon” sube ĉe la panelo “agordoj de fono”.",
+                "offset_change": "Klaku trianguletojn por ĝustigi fotaran deŝovon je etaj paŝoj, aŭ premu la maldekstran mus-butonon kaj trenu ene griza kvadrato por ŝovi la fotaron al datumoj."
+            },
+            "streetlevel": {
+                "title": "Strat-nivelaj fotoj",
+                "intro": "Strat-nivelaj fotoj estas uzeblaj por mapigi trafiksignojn, firmaojn kaj aliajn detalojn nevideblajn sur satelita fotaro. La redaktilo iD subtenas strat-nivelaj fotoj de [Mapillary](https://www.mapillary.com) kaj [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Uzi strat-nivelajn fotojn",
+                "using": "Por uzi strat-nivelajn fotojn por mapigi, klaku la panelon {data} **map-datumoj** flanke de la mapo por aktivigi aŭ malaktivigi disponeblajn fotajn tavolojn.",
+                "photos": "Kiam aktiva la fota tavolo vidigas linion laŭlonge de serio de fotoj. Ĉe pligrandigo cirkleto markos  pozicion de ĉiu foto kaj ĉe eĉ pli granda pligrandigo konuso markos direkton de objektivo de fotilo je kiam foto estis farita.",
+                "viewer": "Kiam vi klakas iun lokon de foto, fot-foliumilo aperos ĉe malsupra angulo de la mapo. La fot-foliumilo enhavas stirilojn por baskuli al antaŭa aŭ sekva foto de la serio. Ĝi ankaŭ montros uzantnomon de persono kiu faris la foton, daton kaj ligilon al la originala retpaĝo."
+            },
+            "gps": {
+                "title": "GPS-spuroj",
+                "intro": "Kolektitaj GPS-spuroj estas utila fonto de datumoj por OpenStreetMap. Tiu ĉi redaktilo subtenas dosierojn *.gpx*, *.geojson*, kaj *.kml* de via komputilo. Vi povas registri GPS-spurojn per poŝtelefono, sporta horloĝeto aŭ alia GPS-aparato.",
+                "survey": "Por sciigi pli kiel kontribui per GPS, legu [Mapigi per poŝtelefono, GPS aŭ papero](http://learnosm.org/en/mobile-mapping/) (malesperante).",
+                "using_h": "Uzi GPS-spurojn",
+                "using": "Por uzi GPS-spuron por mapigi, ŝovu kaj demetu dosieron en la map-redaktilo. Se ĝi estos legita, ĝi montriĝos sur la mapo kiel hela violkolora linio. Klaku la panelon {data} **map-datumoj** flanke de la mapo por montri, kaŝi aŭ pligrandigi al viaj GPS-datumoj.",
+                "tracing": "La GPS-spuro ne estas sendata al OpenStreetMap – la plej bona maniero por uzi ĝin estas desegni sur la mapo uzante ĝin kiel gvidilon por novaj objektoj por aldoni.",
+                "upload": "Vi ankaŭ povas [alŝuti viajn GPS-datumoj al OpenStreetMap](https://www.openstreetmap.org/trace/create) por ke aliaj uzantoj povu uzi ilin."
+            }
         },
         "intro": {
             "done": "farita",
                 "title": "Navigado",
                 "drag": "Ĉefa areo de la mapo montras OpenStreetMap-ajn datumojn sur fono.{br}Vi povas navigadi per treni kaj rulumi, simile kiel ian interretan mapon. **Trenu la mapon!**",
                 "zoom": "Vi povas pligrandigi aŭ malgrandigi per musa rado aŭ tuŝplato aŭ per klaki la butonojn  {plus}/ {minus}. **Pligrandigu la mapon!**",
-                "features": "Ni uzas la vorton *objekto* por priskribi ĉiujn aĵojn troviĝantajn sur la mapo. Ĉio en la reala mondo povas esti mapigita kiel objekton sur OpenStreetMap.",
+                "features": "Ni uzas la vorton *objekto* por priskribi ĉiujn aĵojn troviĝantajn sur la mapo. Ĉio en la reala mondo povas esti mapigita kiel objekto en OpenStreetMap.",
                 "points_lines_areas": "Map-objektoj estas reprezentataj kiel *punktoj, linioj aŭ areoj.*",
                 "nodes_ways": "En OpenStreetMap punktojn oni iam nomas kiel *nodoj*, kaj liniojn kaj areojn oni nomas kiel *linioj*.",
                 "click_townhall": "Ĉiun objekton sur la mapo oni povas elekti per klaki ĝin. **Klaku la punkton por ĝin elekti.**",
             },
             "areas": {
                 "title": "Areoj",
-                "add_playground": "*Areoj* estas uzataj por reprezenti konturojn de objektoj kiel lagoj, konstruaĵoj kaj privatdomaj terenoj.{br}Oni povas ilin uzi por pli detale mapigi multe da objektoj, kiujn oni kutime mapigas kiel punktojn. **Klaku la butonon '{button} Areo' por aldoni novan areon.**",
-                "start_playground": "Ni aldonu ĉi tiun infanan ludejon al la mapo per desegni areon. Areojn oni desegnas per enmeti *nodojn* laŭ eksteraj randoj de objekto. **Klaku aŭ premu spacostangon por enmeti komencan nodon al iu el anguloj de la infana ludejo.**",
+                "add_playground": "Areoj estas uzataj por reprezenti konturojn de objektoj kiel lagojn, konstruaĵojn kaj privatdomajn terenojn.{br}Oni povas ilin uzi por pli detale mapigi multe da objektoj, kiujn oni kutime mapigas kiel punktojn. **Klaku la butonon {button} Areo por aldoni novan areon.**",
+                "start_playground": "Ni aldonu ĉi tiun infanan ludejon al la mapo per desegni areon. Areojn oni desegnas per enmeti *nodojn* laŭ eksteraj randoj de objekto. **Klaku aŭ premu la spacostangon por enmeti komencan nodon al iu el anguloj de la infana ludejo.**",
                 "continue_playground": "Pluigi desegni la areon per enmeti pliajn nodojn laŭ rando de infana ludejo. Estas ĝuste kunigi la areon kun ekzistaj irejoj.{br}Konsilo: vi povas premteni la ‘{alt}’-klavon por ke nodoj ne konektu kun aliaj objektoj. **Pluigu desegni areon por la infana ludejo.**",
                 "finish_playground": "Finu la areon per premi enen-klavon aŭ klaku denove aŭ unuan aŭ finan nodon. **Finu desegni areon por la infana ludejo.**",
                 "search_playground": "**Serĉu '{preset}'-n.**",
                 "title": "Linioj",
                 "add_line": "*Linioj* estas uzataj por reprezenti objektojn kiel vojojn, fervojojn kaj riverojn. **Klaku la butonon '{button} Linio' por aldoni novan linion.**",
                 "start_line": "Ĉi tie vojo mankas. Ni aldonu ĝin!{br}En OpenStreetMap, liniojn oni devas desegni laŭlonge de mezo de vojo. Vi povas treni kaj pligrandigi la mapon dum desegnado laŭbezone. **Komencu novan linion per klaki la nordan finon de manka vojo.**",
-                "intersect": "Klaku aŭ premu spacostangon por aldoni pliajn nodojn al la linio.{br}Vojoj kaj multe da aliaj linioj estas partoj de pli grandaj retoj. Estas grave por ke tiuj linioj estu ĝuste kunigitaj por navigadaj aplikaĵoj funkcii. **Klaku '{name}'-n por aldoni sekcopunkton kunigantan la ambaŭ liniojn.**",
+                "intersect": "Klaku aŭ premu la spacostangon por aldoni pliajn nodojn al la linio.{br}Vojoj kaj multe da aliaj linioj estas partoj de pli grandaj retoj. Estas grave por ke tiuj linioj estu ĝuste kunigitaj por navigadaj aplikaĵoj funkcii. **Klaku '{name}'-n por aldoni sekcopunkton kunigantan la ambaŭ liniojn.**",
                 "retry_intersect": "La vojo devas intersekci '{name}'-n. Provu denove!",
                 "continue_line": "Pluigu desegni la linion por la nova vojo. Memoru, ke vi povas treni kaj pligrandigi la mapon laŭbezone.{br}Kiam vi finos desegni, klaku denove la finan nodon. **Finu desegni la vojon.**",
                 "choose_category_road": "**Elektu {category}-n el la listo.**",
                 "did_name_road": "Ŝajnas bone! Sekve ni lernos kiel aktualigi formon de linio.",
                 "update_line": "Iafoje vi bezonas ŝanĝi formon de ekzistanta linio. Ĉi tie troviĝas vojo, kiu ne aspektas tute ĝuste.",
                 "add_node": "Vi povas aldoni kelkajn nodojn al ĉi tiu linio por plibonigi ĝian formon. Iu maniero por aldoni nodon estas klaki dufoje tie, kie volas aldoni nodon. **Klaku dufoje sur la linio por krei novan nodon.**",
-                "start_drag_endpoint": "Kiam linio estas elektita, vi povas treni ĉiun el ĝiaj nodoj per klaki kaj premteni maldekstran musbutonon dum trenado. **Trenu la finpunkton por enmeti ĝin tie, kie tiuj vojoj devas kruciĝi.**",
-                "finish_drag_endpoint": "Ĉi tiu punkto aspektas ĝuste. **Lasu la maldekstran musbutonon por ĉesi trenadon.**",
+                "start_drag_endpoint": "Kiam linio estas elektita, vi povas treni ĉiun el ĝiaj nodoj per klaki kaj premteni maldekstran mus-butonon dum trenado. **Trenu la finpunkton por enmeti ĝin tie, kie tiuj vojoj devas kruciĝi.**",
+                "finish_drag_endpoint": "Ĉi tiu punkto aspektas ĝuste. **Lasu la maldekstran mus-butonon por ĉesi trenadon.**",
                 "start_drag_midpoint": "Etaj trianguloj estas desegnitaj ĉe *mezpunktoj* inter nodoj. Alia maniero por krei novan nodon esti treni mezpunkton al nova loko. **Trenu la mezpunktan triangulon por krei novan nodon laŭlonge de voja kurbiĝo.**",
                 "continue_drag_midpoint": "Ĉi tiu linio aspektas pli bone! Pluigu alĝustigi ĉi tiun linion per klaki dufoje aŭ per treni mezpunktojn ĝis la kurbiĝo kongruos kun voja formo. **Kiam vi estos kontenta pro aspekto de linio, klaku 'Bone'.**",
                 "delete_lines": "Estas prave forigi liniojn de vojoj, kiuj ne ekzistas en la reala mondo.{br}Ĉi tie estas ekzemplo, kie la urbo planis '{street}'-n sed neniam ĝin konstruis. Ni povas plibonigi ĉi tiun parton de mapo per forigi malnecesajn liniojn.",
             "buildings": {
                 "title": "Konstruaĵoj",
                 "add_building": "OpenStreetMap estas la plej granda monda datumbazo de konstruaĵoj.{br}Vi povas helpi plibonigi ĉi tiun datumbazon per skizi konstruaĵojn, kiuj ne estas ankoraŭ mapigitaj. **Klaku la butonon '{button} Areo' por aldoni novan areon.**",
-                "start_building": "Ni aldonu ĉi tiun domon al la mapo per desegni ĝian konturon.{br}Konstruaĵojn oni devas skizi laŭ iliajn konturojn kiel eble plej akurate. **Klaku aŭ premu spacostangon por enmeti komencan nodon al unu el anguloj de la konstruaĵo.**",
+                "start_building": "Ni aldonu ĉi tiun domon al la mapo per desegni ĝian konturon.{br}Konstruaĵojn oni devas skizi laŭ iliajn konturojn kiel eble plej akurate. **Klaku aŭ premu la spacostangon por enmeti komencan nodon al unu el anguloj de la konstruaĵo.**",
                 "continue_building": "Pluigu aldoni pliajn nodojn por skizi konturon de la konstruaĵo. Memoru, ke vi povas pligrandigi, se vi volas aldoni pliajn detalojn.{br}Finu la konstruaĵon per premi enen-klavon aŭ klaku denove aŭ unuan aŭ lastan nodon. **Finu skizi la konstruaĵon.**",
                 "retry_building": "Ŝajnas, ke desegnado de nodoj al anguloj de konstruaĵo estas ete malfacila por vi. Provu denove!",
                 "choose_category_building": "**Elektu {category}-n el la listo.**",
                 "retry_square": "Vi ne klakis la butonon 'Kvadratigi'. Provu denove.",
                 "done_square": "Ĉu vi rigardis kiel angulojn de la konstruaĵo moviĝis? Ni lernu alian utilan operacion.",
                 "add_tank": "Sekve ni skizos ĉi tiun rondan rezervujon. **Klaku la butonon '{button} Areo' por aldoni novan areon.**",
-                "start_tank": "Ne klopodu, vi ne devas desegni perfektan cirklon. Simple desegnu areon ene la rezervujo, kiu tuŝas ĝian randon. **Klaku aŭ premu spacostangon por enmeti komencan nodon al rando de la rezervujo.**",
+                "start_tank": "Ne klopodu, vi ne devas desegni perfektan cirklon. Simple desegnu areon ene la rezervujo, kiu tuŝas ĝian randon. **Klaku aŭ premu la spacostangon por enmeti komencan nodon al rando de la rezervujo.**",
                 "continue_tank": "Aldonu pliajn nodojn ĉirkaŭ la rando. La cirklo estos kreita ekstere de desegnitaj nodoj.{br}Finu la areon per premi enen-klavon aŭ klaku denove aŭ unuan aŭ lastan nodon. **Finu skizi la rezervujon.**",
                 "search_tank": "**Serĉu '{preset}'-n.**",
                 "choose_tank": "**Elektu {preset}-n el la listo.**",
             "browsing": {
                 "title": "Foliumado",
                 "navigation": {
-                    "title": "Navigado",
+                    "title": "Navigi",
                     "pan": "Rulumi mapon",
                     "pan_more": "Rulumi mapon je unu ekrano",
                     "zoom": "Pligrandigi / malgrandigi",
                     "keyboard": "Montri fulmoklavojn"
                 },
                 "display_options": {
-                    "title": "Vidaj agordoj",
+                    "title": "Agordoj de vido",
                     "background": "Montri agordojn pri fono",
                     "background_switch": "Baskuli reen al antaŭa fono",
                     "map_data": "Montri agordojn pri map-datumoj",
                     "minimap": "Baskuli mapeton"
                 },
                 "selecting": {
-                    "title": "Elektado de objektoj",
+                    "title": "Elekti objektojn",
                     "select_one": "Elekti unuopan objekton",
                     "select_multi": "Elekti kelkajn objektojn",
-                    "lasso": "Elekti per kaptoŝnuro"
+                    "lasso": "Elekti per kaptoŝnuro",
+                    "search": "Trovi objektojn kun serĉata teksto"
                 },
                 "with_selected": {
                     "title": "Kun elektita objekto",
             "editing": {
                 "title": "Redaktado",
                 "drawing": {
-                    "title": "Desegnado",
+                    "title": "Desegni",
                     "add_point": "'Aldoni punkton'-reĝimo",
                     "add_line": "'Aldoni linion'-reĝimo",
                     "add_area": "'Aldoni areo'-reĝimo",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} ft²",
+            "square_miles": "{quantity} mi²",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "E",
+            "west": "W",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Marko"
                 },
+                "brewery": {
+                    "label": "Verŝataj bieroj"
+                },
                 "bridge": {
                     "label": "Speco",
                     "placeholder": "Norma"
                     "label": "Enhaveco",
                     "placeholder": "50, 100, 200…"
                 },
-                "cardinal_direction": {
-                    "label": "Direkto",
-                    "options": {
-                        "E": "Orienta",
-                        "ENE": "Orient-nord-orienta",
-                        "ESE": "Orient-sud-orienta",
-                        "N": "Norda",
-                        "NE": "Nord-orienta",
-                        "NNE": "Nord-nord-orienta",
-                        "NNW": "Nord-nord-okcidenta",
-                        "NW": "Nord-okcidenta",
-                        "S": "Suda",
-                        "SE": "Sud-orienta",
-                        "SSE": "Sud-sud-orienta",
-                        "SSW": "Sud-sud-okcidenta",
-                        "SW": "Sud-okcidenta",
-                        "W": "Okcidenta",
-                        "WNW": "Okcident-nord-okcidenta",
-                        "WSW": "Okcident-sud-okcidenta"
-                    }
-                },
                 "castle_type": {
                     "label": "Speco"
                 },
-                "clock_direction": {
-                    "label": "Direkto",
-                    "options": {
-                        "anticlockwise": "Malhorloĝdirekte",
-                        "clockwise": "Horloĝdirekte"
-                    }
-                },
                 "clothes": {
                     "label": "Vestaĵoj"
                 },
                 "diaper": {
                     "label": "Tablo por travindotukado"
                 },
+                "direction": {
+                    "label": "Direkto (horloĝdirekte en gradoj)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Direkto",
+                    "options": {
+                        "E": "Orienta",
+                        "ENE": "Orient-nord-orienta",
+                        "ESE": "Orient-sud-orienta",
+                        "N": "Norda",
+                        "NE": "Nord-orienta",
+                        "NNE": "Nord-nord-orienta",
+                        "NNW": "Nord-nord-okcidenta",
+                        "NW": "Nord-okcidenta",
+                        "S": "Suda",
+                        "SE": "Sud-orienta",
+                        "SSE": "Sud-sud-orienta",
+                        "SSW": "Sud-sud-okcidenta",
+                        "SW": "Sud-okcidenta",
+                        "W": "Okcidenta",
+                        "WNW": "Okcident-nord-okcidenta",
+                        "WSW": "Okcident-sud-okcidenta"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direkto",
+                    "options": {
+                        "anticlockwise": "Malhorloĝdirekte",
+                        "clockwise": "Horloĝdirekte"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direkto",
+                    "options": {
+                        "backward": "Malantaŭen",
+                        "both": "Ambaŭ / ĉiuj",
+                        "forward": "Antaŭen"
+                    }
+                },
                 "display": {
                     "label": "Vidigilo"
                 },
                 "memorial": {
                     "label": "Speco"
                 },
-                "milestone_position": {
-                    "label": "Pozicio de mejloŝtono",
-                    "placeholder": "Distanco kun unu dekum-precizo (123.4)"
+                "monitoring_multi": {
+                    "label": "Observado"
                 },
                 "mtb/scale": {
                     "label": "Montbicikla malfacileco",
                 "oneway": {
                     "label": "Unudirekta",
                     "options": {
+                        "alternating": "Ofte ŝanĝata",
                         "no": "Ne",
+                        "reversible": "Malofte ŝanĝata",
                         "undefined": "Implicite ne",
                         "yes": "Jes"
                     }
                 "oneway_yes": {
                     "label": "Unudirekta",
                     "options": {
+                        "alternating": "Ofte ŝanĝata",
                         "no": "Ne",
+                        "reversible": "Malofte ŝanĝata",
                         "undefined": "Implicite jes",
                         "yes": "Jes"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5…"
                 },
-                "parallel_direction": {
-                    "label": "Direkto",
-                    "options": {
-                        "backward": "Malantaŭen",
-                        "forward": "Antaŭen"
-                    }
-                },
                 "park_ride": {
                     "label": "Parkumu kaj veturu (P+R)"
                 },
                 "railway": {
                     "label": "Tipo"
                 },
+                "railway/position": {
+                    "label": "Pozicio de mejloŝtono",
+                    "placeholder": "Distanco (kun precizo de unu dekono 123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Direkto",
+                    "options": {
+                        "backward": "Malantaŭen",
+                        "both": "Ambaŭ / ĉiuj",
+                        "forward": "Antaŭen"
+                    }
+                },
                 "rating": {
                     "label": "Eliga povo"
                 },
                 "recycling_accepts": {
                     "label": "Akceptanta"
                 },
-                "recycling_type": {
-                    "label": "Speco de recikligo",
-                    "options": {
-                        "centre": "Centro de recikligo",
-                        "container": "Rubujego"
-                    }
-                },
                 "ref": {
                     "label": "Referenco"
                 },
+                "ref/isil": {
+                    "label": "ISIL-kodo"
+                },
                 "ref_aeroway_gate": {
                     "label": "Enireja numero"
                 },
                 "traffic_signals": {
                     "label": "Speco"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direkto",
+                    "options": {
+                        "backward": "Malantaŭen",
+                        "both": "Ambaŭ / ĉiuj",
+                        "forward": "Antaŭen"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Kursa videbleco",
                     "options": {
                 },
                 "aerialway/pylon": {
                     "name": "Kablovoja fosto",
-                    "terms": "apogilo,apogstango,fosto,paliso,stango"
+                    "terms": "apogilo,apogstango,fosto,paliso,stango,kolono"
                 },
                 "aerialway/rope_tow": {
                     "name": "Skitelfero ŝnur-tira",
                     "terms": "shnurtira skitelfero,sxnurtira skitelfero,skilifto ŝnur-tira"
                 },
                 "aerialway/station": {
-                    "name": "Kablovoja stacio",
-                    "terms": "telferstacio,telfera stacio"
+                    "name": "Kablovoja stacio"
                 },
                 "aerialway/t-bar": {
                     "name": "Skitelfero du-persona (T-forma)",
                     "terms": "monshanghejo,monsxangxejo,valuto,interŝanĝejo"
                 },
                 "amenity/bus_station": {
-                    "name": "Aŭtobus-stacio",
-                    "terms": "autobusostacio,auxtobusostacio,busstacio,stacio aŭtobusa,stacio busa,haltejo aŭtobusa"
+                    "name": "Aŭtobus-stacio"
                 },
                 "amenity/cafe": {
                     "name": "Kafejo",
                     "terms": "kafo,teo,trinkejo,cafe"
                 },
+                "amenity/car_pooling": {
+                    "name": "Kunvetura haltejo (carpooling)",
+                    "terms": "carpooling,petveturado,kunveturado"
+                },
                 "amenity/car_rental": {
                     "name": "Aŭtomobil-pruntejo",
                     "terms": "automobilpruntejo,auxtomobilpruntejo,aŭtopruntejo,autopruntejo,auxtopruntejo,aŭtoluigadejo,autoluigadejo,auxtoluigadejo"
                     "terms": "rapimanghejo,rapidmangxejo,manĝetejo,sandviĉejo,makdonaldo,fritbudo,fastfood,kebabo,hotdogo,hamburgero,picejo"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Pramstacio",
-                    "terms": "pramo,pramŝipo,pramterminalo,terminalo"
+                    "name": "Pram-stacio"
                 },
                 "amenity/fire_station": {
                     "name": "Fajrobrigadejo",
                     "name": "Biblioteko",
                     "terms": "libropruntejo,librejo,librarejo"
                 },
+                "amenity/love_hotel": {
+                    "name": "Amor-hotelo",
+                    "terms": "amorhotelo,amhotelo"
+                },
                 "amenity/marketplace": {
                     "name": "Bazaro",
                     "terms": "foirejo,foiro,komercejo"
                     "terms": "naturrezervejo,naturprotektejo,impostbudo,konservejo,arbaristejo,nacia parko,gardistejo"
                 },
                 "amenity/recycling": {
-                    "name": "Recikligejo",
+                    "name": "Recikligujo",
                     "terms": "recikligo,rubujo,rubujego"
                 },
                 "amenity/recycling_centre": {
                     "name": "Duŝejo",
                     "terms": "duŝo,dushejo,dusxejo,banado"
                 },
+                "amenity/smoking_area": {
+                    "name": "Fumejo",
+                    "terms": "cigaredfumejo"
+                },
                 "amenity/social_facility": {
                     "name": "Socia servejo",
                     "terms": "socia servo,socia helpo"
                     "name": "Kreskaĵbarilo",
                     "terms": "kreskajhbarilo,kreskajxbarilo,heĝo,hegho,hegxo,plektobarilo"
                 },
+                "barrier/kerb": {
+                    "name": "Trotuar-randaĵo",
+                    "terms": "trotuarrandaĵo,randaĵo,randŝtono"
+                },
                 "barrier/kissing_gate": {
                     "name": "Nurhoma pordego",
                     "terms": "kontraŭbruta,kontraubruta,kontrauxbruta"
                     "name": "Garbejo",
                     "terms": "bestejo,grenejo,farmobieno,farmbieno"
                 },
+                "building/boathouse": {
+                    "name": "Boat-garaĝo",
+                    "terms": "boatejo,boaatgaraĝo,haveneto"
+                },
+                "building/bungalow": {
+                    "name": "Bangalo (unuetaĝa somerdomo)",
+                    "terms": "feridomo,somerdomo,dometo,vilao"
+                },
                 "building/bunker": {
                     "name": "Bunkro"
                 },
                     "name": "Kirko",
                     "terms": "preĝejo,preghejo,pregxejo"
                 },
+                "building/civic": {
+                    "name": "Publika konstruaĵo (ĝenerala)",
+                    "terms": "biblioteko,komunuma centro,civila konstruaĵo,civitana konstruaĵo"
+                },
                 "building/college": {
                     "name": "Kolegia konstruaĵo",
                     "terms": "kolegio,universitato,politeĥniko,politekniko"
                 "building/entrance": {
                     "name": "Enirejo/elirejo"
                 },
+                "building/farm": {
+                    "name": "Ĉefarma domo",
+                    "terms": "kampodomo,kampara domo,somerdomo,farmo,farmodomo"
+                },
                 "building/garage": {
                     "name": "Garaĝo",
                     "terms": "garagho,garagxo,aŭtejo,autejo,auxtejo,aŭtomobilejo"
                     "name": "Infanĝardena konstruaĵo",
                     "terms": "infanghardeno,infangxardeno,infanoĝardeno,antaŭlernejo,kindergarteno"
                 },
+                "building/mosque": {
+                    "name": "Moskea konstruaĵo",
+                    "terms": "moskeo,islamo,minareto"
+                },
                 "building/public": {
-                    "name": "Publika konstruaĵo",
+                    "name": "Publika konstruaĵo (ofica)",
                     "terms": "administrejo"
                 },
                 "building/residential": {
                     "name": "tegmento",
                     "terms": "tegmento"
                 },
+                "building/ruins": {
+                    "name": "Ruinoj de konstruaĵo (ne-historie-signifa)",
+                    "terms": "ruinoj,konstruaĵaĉo,domaĉo"
+                },
                 "building/school": {
                     "name": "Lerneja konstruaĵo",
                     "terms": "lernejo,edukejo,instruejo"
                     "name": "Ĝemela domo",
                     "terms": "ĝemeldomo,ghemela domo,gxemela domo,familia domo"
                 },
+                "building/service": {
+                    "name": "Serva konstruaĵeto",
+                    "terms": "transformilo,transformatoro,pumpejo,akvopumpejo"
+                },
                 "building/shed": {
                     "name": "Budo",
                     "terms": "barako,kabano,ŝedo"
                     "name": "Ĉevalejo",
                     "terms": "chevalejo,cxevalejo,ĉevaldomo,stalo"
                 },
+                "building/stadium": {
+                    "name": "Stadiona konstruaĵo",
+                    "terms": "stadiono,sportejo"
+                },
                 "building/static_caravan": {
                     "name": "Movdomo",
                     "terms": "movebla domo,kampadveturilo statika,kampveturilo statika"
                 },
+                "building/temple": {
+                    "name": "Templa konstruaĵo",
+                    "terms": "templo,sanktejo"
+                },
                 "building/terrace": {
                     "name": "Envicaj domoj",
                     "terms": "envica domo,ŝtondomo,brikdomo,envicdomo,vica domo,sekvenca domo"
                 "building/train_station": {
                     "name": "Stacio fervoja"
                 },
+                "building/transportation": {
+                    "name": "Transporta konstruaĵo",
+                    "terms": "aŭtobusstacio,stacio,stacidomo,busstacio,flughaveno.haveno"
+                },
                 "building/university": {
                     "name": "Universitata konstruaĵo",
                     "terms": "universitato,kolegio,politeĥniko,politekniko,altlernejo,alta lernejo"
                     "name": "Kampadeja loko",
                     "terms": "kampadejo,tendo"
                 },
+                "circular": {
+                    "name": "Trafikcirklo"
+                },
                 "club": {
                     "name": "Klubejo",
                     "terms": "klubo,asocio,kulturdomo"
                 "emergency/private": {
                     "name": "Vivsav-serva aliro: privata"
                 },
+                "emergency/water_tank": {
+                    "name": "Kontraŭbrulega akvujo",
+                    "terms": "akvujo,rezervujo,kriokaza akvujo,fajrobrigada akvujo"
+                },
                 "emergency/yes": {
                     "name": "Vivsav-serva aliro: jes"
                 },
                     "name": "Ĉeval-vojo",
                     "terms": "chevalvojo,cxevalvojo,ĉevalo,rajdado"
                 },
+                "highway/bus_guideway": {
+                    "name": "Trak-aŭtobuso",
+                    "terms": "trakbuso,gvidata aŭtobuso"
+                },
                 "highway/bus_stop": {
-                    "name": "Haltejo aŭtobusa",
-                    "terms": "aŭtobushaltejo"
+                    "name": "Haltejo aŭtobusa"
                 },
                 "highway/corridor": {
                     "name": "Koridoro endoma",
                     "terms": "kultivarbaro,forsto,arbaro"
                 },
                 "landuse/garages": {
-                    "name": "Garaĝaro",
-                    "terms": "garagharo,garagxaro,garaĝo,garaĝoj,aŭtejo"
+                    "name": "Garaĝa tereno",
+                    "terms": "garaĝejo,garaĝaro,garagharo,garagxaro"
                 },
                 "landuse/grass": {
                     "name": "Herbotapiŝo",
                     "name": "Konstruejo (virga tereno)",
                     "terms": "verda kampo,kampo"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Kultivdoma tereno",
+                    "terms": "forcejo,plantodomo"
+                },
                 "landuse/harbour": {
                     "name": "Haveno",
                     "terms": "marhaveno,ŝipejo"
                     "name": "Masto",
                     "terms": "signalmasto,anteno"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Observada stacio",
+                    "terms": "veterstacio,meteorologia stacio,meteostacio,monitorado,akvonivelmezurilo,medikvalit-mezuro,aerkvalit-mezuro"
+                },
                 "man_made/observation": {
                     "name": "Vidturo",
                     "terms": "observturo,turo"
                     "terms": "kontisto,librotenisto,librotenanto"
                 },
                 "office/administrative": {
-                    "name": "Administra oficejo",
-                    "terms": "administrado"
+                    "name": "Administra oficejo"
                 },
                 "office/adoption_agency": {
                     "name": "Oficejo de adopto",
                     "terms": "leĝisto,leghisto,legxisto,advokato,juristo,kancelario"
                 },
                 "office/lawyer/notary": {
-                    "name": "Oficejo de notario",
-                    "terms": "notario,aktisto,registristo"
+                    "name": "Oficejo de notario"
                 },
                 "office/moving_company": {
                     "name": "Oficejo de transloĝiĝ-helpa firmao",
                     "name": "Transformilo",
                     "terms": "transformatoro,elektrotransformilo"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Haltejo publik-transporta (atendejo)",
+                    "terms": "perono,haltejo,stacio,kajo,atendejo"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Haltejo kablovoja (atendejo)",
+                    "terms": "kablovoja stacio,telfero"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Haltejo aŭtobusa (atendejo)",
+                    "terms": "aŭtobushaltejo,stacio,pereno,atendejo"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Haltejo prama (atendejo)",
+                    "terms": "pramstacio,haveno"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Haltejo de malpeza fervojo (atendejo)",
+                    "terms": "malpeza fervojo,trajno malpeza,stacio,perono"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Haltejo de unurela fervojo (atendejo)",
+                    "terms": "perono,kajo,unurela fervojo"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Haltejo metroa (atendejo)",
+                    "terms": "metroa haltejo,metrostacio,subtera vagonaro"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Haltejo fervoja (atendejo)",
+                    "terms": "fervoja stacio,perono,fervoja haltejo"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Haltejo trama (atendejo)",
+                    "terms": "tramhaltejo"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Haltejo trolebusa (atendejo)",
+                    "terms": "trolebushaltejo,troleo"
+                },
                 "public_transport/platform": {
-                    "name": "Kajo (atendejo)",
-                    "terms": "perono,haltejo,stacio"
+                    "name": "Haltejo publik-transporta (atendejo)",
+                    "terms": "perono,haltejo,stacio,kajo,atendejo"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Haltejo kablovoja (atendejo)",
+                    "terms": "kablovoja stacio,telfero"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Haltejo aŭtobusa (atendejo)",
+                    "terms": "aŭtobushaltejo,stacio,pereno,atendejo"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Haltejo prama (atendejo)",
+                    "terms": "pramstacio,haveno"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Haltejo de malpeza fervojo (atendejo)",
+                    "terms": "malpeza fervojo,trajno malpeza,stacio,perono"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Haltejo de unurela fervojo (atendejo)",
+                    "terms": "perono,kajo,unurela fervojo"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Haltejo metroa (atendejo)",
+                    "terms": "metroa haltejo,metrostacio,subtera vagonaro"
+                },
+                "public_transport/platform_train": {
+                    "name": "Haltejo fervoja (atendejo)",
+                    "terms": "fervoja stacio,perono,fervoja haltejo"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Haltejo trama (atendejo)",
+                    "terms": "tramhaltejo"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Haltejo trolebusa (atendejo)",
+                    "terms": "trolebushaltejo,troleo"
+                },
+                "public_transport/station": {
+                    "name": "Stacio publik-transporta",
+                    "terms": "stacidomo"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Stacio koblovoja",
+                    "terms": "telferstacio,telfera stacio"
+                },
+                "public_transport/station_bus": {
+                    "name": "Stacio aŭtobusa",
+                    "terms": "autobusostacio,auxtobusostacio,busstacio,stacio aŭtobusa,stacio busa,haltejo aŭtobusa"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Stacio prama",
+                    "terms": "pramŝipo,pramterminalo,terminalo,pramstacio"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Stacio de malpeza fervojo",
+                    "terms": "malpeza fervojo,malpeza trajno,suburba fervojo,tramo"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Stacio de unurela fervojo",
+                    "terms": "unurela fervojo,unurelvojo"
+                },
+                "public_transport/station_subway": {
+                    "name": "Stacio metroa",
+                    "terms": "metroo,subtera fervojo"
+                },
+                "public_transport/station_train": {
+                    "name": "Stacio fervoja",
+                    "terms": "stacidomo fervoja"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Stacio fervoja (laŭpete)",
+                    "terms": "haltejo fervoja"
+                },
+                "public_transport/station_tram": {
+                    "name": "Stacio trama",
+                    "terms": "trama haltejo,tramhaltejo"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Stacio trolebusa",
+                    "terms": "trolebushaltejo,troleo"
+                },
+                "public_transport/stop_area": {
+                    "name": "Haltejo publik-transporta (rilato)",
+                    "terms": "haltejo"
                 },
                 "public_transport/stop_position": {
-                    "name": "Haltejo (veturil-haltejo)",
-                    "terms": "haltejo,kajo,perono"
+                    "name": "Haltejo publik-transporta (haltloko)",
+                    "terms": "haltejo,haltloko"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Haltejo kablovoja (haltloko)",
+                    "terms": "telfero"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Haltejo aŭtobusa (haltloko - ŝoseo)",
+                    "terms": "aŭtobusa haltejo"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Haltejo prama (haltloko - akvo)",
+                    "terms": "pramo,śnurfiksejo"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Haltejo de malpeza fervojo (haltloko - trako)",
+                    "terms": "malpeza fervojo,malpeza trajno"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Haltejo de unurela fervojo (haltloko - trako)",
+                    "terms": "haltejo,unurela trajno"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Haltejo metroa (haltloko - trako)",
+                    "terms": "metroo,subtera fervojo"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Haltejo fervoja (haltloko - trako)",
+                    "terms": "haltejo,fervojo,trajno"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Haltejo trama (haltloko - trako)",
+                    "terms": "haltejo,tramo"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Haltejo trolebusa (haltloko - ŝoseo)",
+                    "terms": "troleo"
                 },
                 "railway": {
                     "name": "Fervojo"
                     "terms": "kablovojo,fervojeto,trajneto,kablotramo,telfero"
                 },
                 "railway/halt": {
-                    "name": "Haltejeto fervoja",
-                    "terms": "haltejo,stacio,kajo"
+                    "name": "Stacio fervoja (laŭpete)"
                 },
                 "railway/level_crossing": {
                     "name": "Traknivela pasejo (por aŭtoj)",
                     "name": "Mejloŝtono fervoja",
                     "terms": "fervoja mejloŝtono"
                 },
+                "railway/miniature": {
+                    "name": "Miniatura fervojo",
+                    "terms": "fervojeto,maketo,trajneto,vagonareto"
+                },
                 "railway/monorail": {
                     "name": "Relvojo unurela",
                     "terms": "unurela fervojo,unurelvojo,fervojo"
                     "terms": "etŝpura fervojo,etshpura fervojo,etsxpura fervojo,mallarĝŝpura fervojo,erlvojo,relparo,trako"
                 },
                 "railway/platform": {
-                    "name": "Kajo fervoja",
-                    "terms": "stacio,haltejo,perono"
+                    "name": "Haltejo fervoja (atendejo)"
                 },
                 "railway/rail": {
                     "name": "Relvojo normalŝpura",
                     "terms": "semaforo,signalilo,haltmontrilo"
                 },
                 "railway/station": {
-                    "name": "Stacidomo fervoja",
-                    "terms": "fervoja stacidomo"
+                    "name": "Stacio fervoja"
                 },
                 "railway/subway": {
                     "name": "Metroo",
                     "terms": "tramo,tramvojo,urbofervojo"
                 },
                 "railway/tram_stop": {
-                    "name": "Haltejo trama",
-                    "terms": "trama haltejo,tramhaltejo"
+                    "name": "Haltejo trama (haltloko - trako)"
                 },
                 "relation": {
                     "name": "Rilato",
                     "name": "Ĉevala kurso",
                     "terms": "chevala kurso,cxevala kurso,ĉevalvojo"
                 },
+                "type/route/light_rail": {
+                    "name": "Kurso de fervojo malpeza",
+                    "terms": "malpeza fervojo,malpeza trajno,suburba fervojo,tramo"
+                },
                 "type/route/pipeline": {
                     "name": "Tubokondukilo",
                     "terms": "dukto,tubaro,tubolinio,tubkondukilo,naftodukto,gasoduto,akvodukto"
                 },
+                "type/route/piste": {
+                    "name": "Skiada kurso",
+                    "terms": "skivojo,skitrako"
+                },
                 "type/route/power": {
                     "name": "Elektra kondukilo",
                     "terms": "lineo forkurenta,kablo"
                     "name": "Trafikvojo",
                     "terms": "vojo,ŝoseo"
                 },
+                "type/route/subway": {
+                    "name": "Metroa kurso",
+                    "terms": "metroo,subtera fervojo"
+                },
                 "type/route/train": {
                     "name": "Fervoja kurso",
                     "terms": "fervojlinio,trako,trajno,vagonaro"
                 "description": "Tutmonda fotaro de Esri.",
                 "name": "Tutmonda fotaro de Esri"
             },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "Kondiĉoj kaj rimarkoj"
+                },
+                "description": "Arĥivita fotaro de Esri, kiu povas esti pli klara kaj akurata ol la norma tavolo.",
+                "name": "Tutmonda fotaro de Esri (pli klara) Beta"
+            },
             "MAPNIK": {
                 "attribution": {
-                    "text": "© OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "description": "Norma map-tavolo de OpenStreetMap.",
                 "name": "OpenStreetMap (norma mapo)"
             },
             "OSM_Inspector-Addresses": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: adresoj"
             },
             "OSM_Inspector-Geometry": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: geometrio"
             },
             "OSM_Inspector-Highways": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: vojoj"
             },
             "OSM_Inspector-Multipolygon": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: areoj"
             },
             "OSM_Inspector-Places": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: lokoj"
             },
             "OSM_Inspector-Routing": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: voj-difinado"
             },
             "OSM_Inspector-Tagging": {
                 "attribution": {
-                    "text": "© Geofabrik GmbH, OpenStreetMap kontribuintoj, CC-BY-SA"
+                    "text": "© Geofabrik GmbH, kontribuintoj de OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: etikedado"
             },
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah HOFFMANN, CC by-SA 3.0, map-datumoj de OpenStreetMap kontribuintoj, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, kontribuintoj de OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: biciklado"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah HOFFMANN, CC by-SA 3.0, map-datumoj de OpenStreetMap kontribuintoj, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, kontribuintoj de OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: marŝado"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah HOFFMANN, CC by-SA 3.0, map-datumoj de OpenStreetMap kontribuintoj, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, kontribuintoj de OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: mont-biciklado"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah HOFFMANN, CC by-SA 3.0, map-datumoj de OpenStreetMap kontribuintoj, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, kontribuintoj de OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: rulglitado"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael SPRENG, CC by-SA 3.0, map-datumoj de OpenStreetMap kontribuintoj, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, kontribuintoj de OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: vintraj sportoj"
             },
             },
             "qa_no_address": {
                 "attribution": {
-                    "text": "Simon POOLE, Datumoj ©OpenStreetMap kontribuintoj"
+                    "text": "Simon POOLE, Datumoj © kontribuintoj de OpenStreetMap"
                 },
                 "name": "QA No Address"
             },
             "skobbler": {
                 "attribution": {
-                    "text": "© Kaheloj: skobbler map-datumoj: OpenStreetMap kontribuintoj"
+                    "text": "© Kaheloj: skobbler map-datumoj: kontribuintoj de OpenStreetMap"
                 },
                 "name": "skobbler"
             },
             },
             "tf-cycle": {
                 "attribution": {
-                    "text": "Mapoj: © Thunderforest, datumoj: © OpenStreetMap kontribuintoj"
+                    "text": "Mapoj: © Thunderforest, datumoj: © kontribuintoj de OpenStreetMap"
                 },
                 "name": "Thunderforest OpenCycleMap"
             },
             "tf-landscape": {
                 "attribution": {
-                    "text": "Mapoj: © Thunderforest, datumoj: © OpenStreetMap kontribuintoj"
+                    "text": "Mapoj: © Thunderforest, datumoj: © kontribuintoj de OpenStreetMap"
                 },
                 "name": "Thunderforest Landscape"
             }
index e73efae41474b8c7ecc5ecee98ba05ae41b1779d..21f5dfbb9d85b715271851cce7d165dcdee8e981 100644 (file)
                 "description": "Desplazar y acercar el mapa."
             },
             "draw_area": {
-                "tail": "Haga clic para añadir nodos a su área. Haga clic en el primer nodo para terminar el área."
+                "tail": "Haga clic para añadir nodos al área. Haga clic en el primer nodo para terminar el área."
             },
             "draw_line": {
                 "tail": "Haga clic para añadir más nodos a la línea. Haga clic en otras líneas para conectarse a ellas y haga doble clic para terminar la línea."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Esto no puede ser editado porque está conectado a un elemento oculto."
             }
         },
         "operations": {
             "add": {
                 "annotation": {
                     "point": "Punto añadido.",
-                    "vertex": "Nodo añadido a la vía.",
+                    "vertex": "Nodo añadido a una vía.",
                     "relation": "Relación añadida."
                 }
             },
@@ -46,7 +49,7 @@
                 "title": "Continuar",
                 "description": "Continuar esta línea.",
                 "not_eligible": "Aquí no se pueden continuar líneas.",
-                "multiple": "Varias líneas pueden continuar aquí. Para seleccionar una línea, presione la tecla \"Shift\" y haga clic en una línea para seleccionarla.",
+                "multiple": "Varias líneas pueden continuar aquí. Para seleccionar una línea, presione la tecla «Shift» y haga clic en una línea para seleccionarla.",
                 "annotation": {
                     "line": "Línea continuada.",
                     "area": "Área continuada."
                 "annotation": "Etiquetas modificadas."
             },
             "circularize": {
-                "title": "Redondear",
+                "title": "Circularizar",
                 "description": {
-                    "line": "Hacer esta línea circular.",
-                    "area": "Hacer este área circular."
+                    "line": "Hace esta línea circular.",
+                    "area": "Hace este área circular."
                 },
                 "key": "O",
                 "annotation": {
-                    "line": "Línea hecha circular.",
-                    "area": "Área hecha circular."
+                    "line": "Hizo una línea circular.",
+                    "area": "Hizo un área circular."
                 },
-                "not_closed": "Esto no se puede redondear porque no está cerrado.",
-                "too_large": "Esto no se puede redondear porque no está completamente visible.",
+                "not_closed": "Esto no se puede hacer circular porque no está cerrado.",
+                "too_large": "Esto no se puede hacer circular porque no está completamente visible.",
                 "connected_to_hidden": "Esto no se puede hacer circular porque está conectado a un elemento oculto."
             },
             "orthogonalize": {
                 "title": "Escuadrar",
                 "description": {
                     "line": "Escuadra las esquinas de esta línea.",
-                    "area": "Escuadrar las esquinas de esta área."
+                    "area": "Escuadra las esquinas de esta área."
                 },
                 "key": "S",
                 "annotation": {
-                    "line": "Escuadrar las esquinas de una línea.",
-                    "area": "Escuadrar las esquinas de un área."
+                    "line": "Escuadrado las esquinas de una línea.",
+                    "area": "Escuadrado las esquinas de un área."
                 },
-                "not_squarish": "Esto no puede escuadrarse porque no es escuadrable.",
-                "too_large": "Esto no puede escuadrarse porque no está completamente visible.",
+                "not_squarish": "Esto no se puede escuadrar porque no es escuadrable.",
+                "too_large": "Esto no se puede escuadrar porque no está completamente visible.",
                 "connected_to_hidden": "Esto no se puede escuadrar porque está conectado a un elemento oculto."
             },
             "straighten": {
                 "title": "Enderezar",
-                "description": "Enderezar esta línea",
+                "description": "Endereza esta línea.",
                 "key": "S",
                 "annotation": "Línea enderezada.",
-                "too_bendy": "Esto no puede ser enderezado porque es demasiado sinuoso.",
-                "connected_to_hidden": "Esta línea no puede ser enderezada porque está conectada a un elemento oculto."
+                "too_bendy": "Esto no se puede enderezar porque es demasiado sinuoso.",
+                "connected_to_hidden": "Esta línea no se puede ser enderezar porque está conectado a un elemento oculto."
             },
             "delete": {
                 "title": "Eliminar",
                 "description": {
-                    "single": "Eliminar este elemento permanentemente.",
-                    "multiple": "Eliminar estos elementos permanentemente."
+                    "single": "Elimina este elemento permanentemente.",
+                    "multiple": "Elimina estos elementos permanentemente."
                 },
                 "annotation": {
                     "point": "Punto eliminado.",
-                    "vertex": "Nodo eliminado de la vía.",
+                    "vertex": "Nodo eliminado de una vía.",
                     "line": "Línea eliminada.",
                     "area": "Área eliminada.",
                     "relation": "Relación eliminada.",
                     "multiple": "{n} elementos eliminados."
                 },
                 "too_large": {
-                    "single": "Este elemento no se puede eliminar porque actualmente no está visible en su integridad.",
-                    "multiple": "Estos elementos no pueden ser eliminados porque actualmente no están visibles en su integridad."
+                    "single": "Este elemento no se puede eliminar porque actualmente no está completamente visible.",
+                    "multiple": "Estos elementos no pueden ser eliminados porque actualmente no están completamente visibles."
                 },
                 "incomplete_relation": {
                     "single": "Este elemento no se puede eliminar porque no se ha descargado completamente.",
                     "multiple": "Estos elementos no se pueden eliminar porque no se han descargado completamente."
                 },
                 "part_of_relation": {
-                    "single": "Este elemento no se puede eliminar porque es parte de una relación más grande. Debe eliminarlo de la relación primero.",
-                    "multiple": "Estos elementos no se pueden eliminar porque forman parte de relaciones más grandes. Debe eliminarlos de las relaciones primero."
+                    "single": "Este elemento no se puede eliminar porque es parte de una relación más grande. Primero debe eliminarlo de la relación.",
+                    "multiple": "Estos elementos no se pueden eliminar porque forman parte de relaciones más grandes. Primero debe eliminarlos de las relaciones."
                 },
                 "connected_to_hidden": {
                     "single": "Este elemento no se puede eliminar porque está conectado a un elemento oculto.",
                 }
             },
             "add_member": {
-                "annotation": "Se ha añadido un miembro a una relación."
+                "annotation": "Miembro añadido a una relación."
             },
             "delete_member": {
-                "annotation": "Se ha quitado un miembro de una relación."
+                "annotation": "Miembro quitado de una relación."
             },
             "connect": {
                 "annotation": {
                     "point": "Vía conectada a un punto.",
                     "vertex": "Vía conectada a otra.",
                     "line": "Vía conectada a una línea.",
-                    "area": "Vía conectada al área."
+                    "area": "Vía conectada a un área."
                 }
             },
             "disconnect": {
                 "key": "D",
                 "annotation": "Líneas/áreas desconectadas.",
                 "not_connected": "No hay suficientes líneas/áreas aquí para desconectar.",
-                "connected_to_hidden": "Esto no puede ser desconectado porque está conectado a un elemento oculto.",
-                "relation": "Esto no puede ser desconectado, ya que conecta a los miembros de una relación."
+                "connected_to_hidden": "Esto no se puede desconectar porque está conectado a un elemento oculto.",
+                "relation": "Esto no se puede desconectar porque conecta a los miembros de una relación."
             },
             "merge": {
                 "title": "Combinar",
-                "description": "Combinar estos elementos.",
+                "description": "Combina estos elementos.",
                 "key": "C",
                 "annotation": "{n} elementos combinados.",
-                "not_eligible": "Estos elementos no pueden ser combinados.",
-                "not_adjacent": "Estos elementos no pueden ser combinados porque sus extremos no están conectados.",
-                "restriction": "Estos elementos no se pueden combinar porque al menos uno es miembro de una relación de \"{relation}\".",
-                "incomplete_relation": "Estos elementos no pueden ser combinados porque al menos uno no ha sido descargado por completo.",
-                "conflicting_tags": "Estos elementos no pueden ser combinados porque algunas de sus etiquetas tienen conflictos en sus valores."
+                "not_eligible": "Estos elementos no se pueden combinar.",
+                "not_adjacent": "Estos elementos no se pueden combinar porque sus extremos no están conectados.",
+                "restriction": "Estos elementos no se pueden combinar porque al menos uno es miembro de una relación de «{relation}».",
+                "incomplete_relation": "Estos elementos no se pueden combinar porque al menos uno no ha sido descargado por completo.",
+                "conflicting_tags": "Estos elementos no se pueden combinar porque algunas de sus etiquetas tienen conflictos en sus valores."
             },
             "move": {
                 "title": "Mover",
                 "key": "M",
                 "annotation": {
                     "point": "Punto movido.",
-                    "vertex": "Vértice movido.",
+                    "vertex": "Nodo movido en una vía.",
                     "line": "Línea movida.",
-                    "area": "Área movida",
+                    "area": "Área movida.",
                     "multiple": "Múltiples elementos movidos."
                 },
                 "incomplete_relation": {
                 },
                 "description": {
                     "long": {
-                        "single": "Reflejar este elemento a través de su eje largo.",
-                        "multiple": "Reflejar estos elementos a través de su eje largo."
+                        "single": "Refleja este elemento a través de su eje largo.",
+                        "multiple": "Refleja estos elementos a través de su eje largo."
                     },
                     "short": {
-                        "single": "Reflejar este elemento a través de su eje corto.",
-                        "multiple": "Reflejar estos elementos a través de su eje corto."
+                        "single": "Refleja este elemento a través de su eje corto.",
+                        "multiple": "Refleja estos elementos a través de su eje corto."
                     }
                 },
                 "key": {
                 },
                 "annotation": {
                     "long": {
-                        "single": "Se reflejó un elemento a través de su eje largo.",
-                        "multiple": "Varios elementos reflejados a través de su eje largo."
+                        "single": "Elemento reflejado a través de su eje largo.",
+                        "multiple": "Múltiples elementos reflejados a través de su eje largo."
                     },
                     "short": {
-                        "single": "Se reflejó un elemento a través de su eje corto.",
-                        "multiple": "Varios elementos reflejados a través de su eje corto."
+                        "single": "Un elemento reflejado a través de su eje corto.",
+                        "multiple": "Múltiples elementos reflejados a través de su eje corto."
                     }
                 },
                 "incomplete_relation": {
             "rotate": {
                 "title": "Rotar",
                 "description": {
-                    "single": "Rotar este elemento alrededor de su punto central.",
-                    "multiple": "Rotar estos elementos alrededor de su punto central."
+                    "single": "Rota este elemento alrededor de su punto central.",
+                    "multiple": "Rota estos elementos alrededor de su punto central."
                 },
                 "key": "R",
                 "annotation": {
                 },
                 "connected_to_hidden": {
                     "single": "Este elemento no se puede rotar porque está conectado a un elemento oculto.",
-                    "multiple": "Estos elementos no se pueden girar porque algunos están conectados a elementos ocultos."
+                    "multiple": "Estos elementos no se pueden rotar porque algunos están conectados a elementos ocultos."
                 }
             },
             "reverse": {
                 "title": "Invertir",
                 "description": "Hace que esta línea vaya en dirección opuesta.",
                 "key": "I",
-                "annotation": "Sentido de la línea invertido."
+                "annotation": "Línea invertida."
             },
             "split": {
                 "title": "Dividir",
                 "description": {
-                    "line": "Divide esta línea en dos en este nodo.",
-                    "area": "Divide el límite de esta área en dos.",
-                    "multiple": "Divide las líneas/límites de área en este nodo."
+                    "line": "Divida esta línea en dos en este nodo.",
+                    "area": "Divida el límite de esta área en dos.",
+                    "multiple": "Divida las líneas/límites de área en este nodo."
                 },
                 "key": "D",
                 "annotation": {
-                    "line": "Dividir línea.",
-                    "area": "Divide el límite de un área.",
-                    "multiple": "Divide límites de {n} líneas/áreas."
+                    "line": "Línea dividida.",
+                    "area": "Límite de un área dividido.",
+                    "multiple": "Límites de {n} líneas/áreas divididas."
                 },
-                "not_eligible": "Las líneas no pueden ser divididas en su inicio o termino.",
+                "not_eligible": "Las líneas no se pueden dividir en su inicio o termino.",
                 "multiple_ways": "Hay demasiadas líneas para dividir.",
-                "connected_to_hidden": "Esto no puede ser dividir porque está conectado a un elemento oculto."
+                "connected_to_hidden": "Esto no se puede dividir porque está conectado a un elemento oculto."
             },
             "restriction": {
                 "help": {
             "about_changeset_comments": "Acerca de los comentarios del conjuntos de cambios",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/ES:Good_changeset_comments",
             "google_warning": "Usted mencionó Google en este comentario: recuerde que copiar desde Google Maps está estrictamente prohibido.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Ediciones de {users}",
                 "title": "Medición",
                 "selected": "{n} seleccionado",
                 "geometry": "Geometría",
-                "closed": "cerrada",
                 "center": "Centro",
                 "perimeter": "Perímetro",
                 "length": "Longitud",
                 "centroid": "Centroide",
                 "location": "Ubicación",
                 "metric": "Métrico",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Número de nodos"
             }
         },
         "geometry": {
             "title": "Fondo",
             "description": "Ajustes del fondo",
             "key": "B",
-            "percent_brightness": "{opacity}% brillo",
+            "backgrounds": "Fondos",
             "none": "Ninguno",
             "best_imagery": "La mejor fuente de imágenes para esta ubicación",
             "switch": "Volver a este fondo",
             "custom": "Personalizado",
             "custom_button": "Editar fondo personalizado",
-            "custom_prompt": "Introduzca una plantilla URL de tesela. Los tokens válidos son:\n  - {zoom}/{z}, {x}, {y} para el esquema de tesela Z/X/Y\n  - {ty} para coordenadas Y invertidas del estilo TMS\n  - {u} para el esquema quadtile\n  - {switch:a,b,c} para la multiplexación del servidor DNS\n\nEjemplo:\n{example}",
-            "fix_misalignment": "Ajustar desplazamiento de imágenes",
-            "imagery_source_faq": "¿De dónde vienen estas imágenes?",
+            "overlays": "Superposiciones",
+            "imagery_source_faq": "Información de imágenes / Informar un problema",
             "reset": "reiniciar",
-            "offset": "Arrastre en cualquier lugar del área gris de abajo para ajustar el desplazamiento de imágenes, o introduzca los valores de desplazamiento en metros.",
+            "display_options": "Opciones de pantalla",
+            "brightness": "Brillo",
+            "contrast": "Contraste",
+            "saturation": "Saturación",
+            "sharpness": "Nitidez",
             "minimap": {
-                "description": "Minimapa",
-                "tooltip": "Mostrar una vista alejada del mapa para ayudar a ubicar el área que se muestra actualmente.",
+                "description": "Mostrar Minimapa",
+                "tooltip": "Muestra un mapa ampliado para ayudar a ubicar el área que se muestra actualmente.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ajustar desplazamiento de imágenes",
+            "offset": "Arrastre en cualquier lugar del área gris de abajo para ajustar el desplazamiento de imágenes, o introduzca los valores de desplazamiento en metros."
         },
         "map_data": {
             "title": "Datos del mapa",
             "status_code": "El servidor devolvió el código de estado {code}",
             "unknown_error_details": "Asegúrese de que está conectado a Internet.",
             "uploading": "Subiendo cambios a OpenStreetMap…",
+            "conflict_progress": "Comprobación de conflictos: {num} de {total}",
             "unsaved_changes": "Tiene cambios sin guardar",
             "conflict": {
                 "header": "Resolver las ediciones conflictivas",
             "untagged_area_tooltip": "Seleccione un tipo de elemento que describa lo que es esta área.",
             "untagged_relation": "Relación no etiquetada",
             "untagged_relation_tooltip": "Seleccione un tipo de elemento que describa qué es esta relación.",
-            "many_deletions": "Está eliminando {n} elementos. ¿Está seguro que quiere hacer esto? Esto los eliminará del mapa que todo el mundo ve en openstreetmap.org.",
             "tag_suggests_area": "La etiqueta {tag} sugiere que esta línea debería ser una área, pero no es un área",
             "deprecated_tags": "Etiquetas obsoletas: {tags}"
         },
         "help": {
             "title": "Ayuda",
             "key": "H",
-            "help": "# Ayuda\n\nEste es un editor para [OpenStreetMap](http://www.openstreetmap.org/), el\nmapa libre y editable del mundo. Se puede utilizar para añadir y actualizar\ndatos en su área, haciendo que el mapa del mundo de fuente y datos abiertos\nsea mejor para todos.\n\nLas ediciones que realice en este mapa serán visible a todos los que usen\nOpenStreetMap. Para poder hacer una edición tendrá que\n[Iniciar sesión](https://www.openstreetmap.org/login).\n\nEl [editor iD](http://ideditor.com/) es un proyecto colaborativo con [código\nfuente disponible en GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editando & Guardando\n\nEste editor está diseñado para trabajar principalmente en línea, y usted está accediendo\na él mediante una página web ahora mismo.\n\n### Seleccionando elementos\n\nPara seleccionar un elemento de mapa, como una carretera o un punto de interés, click sobre\nel mapa. Esto resaltará la función seleccionada\ny cargará una barra lateral con\ndetalles sobre él. Si hace click derecho sobre él, mostrará un menú de cosas\nque puede hacer con el elemento.\n\nPara seleccionar múltiples elementos, mantenga pulsada la «Tecla Shift». Luego haga click\nen los elementos que quiere seleccionar, o arrastre sobre el mapa para dibujar un contorno\nalrededor de esos elementos. Se seleccionarán todos los puntos dentro del área de lazo.\n\n### Guardando Ediciones\n\nCuando realiza cambios como editar carreteras, edificios y lugares, estos son\nalmacenados localmente hasta que los guarde en el servidor. No se preocupe si comete\nun error- puede deshacer los cambios haciendo click en el botón deshacer, y rehacer\ncambios haciendo click en el boton rehacer.\n\nHaga click en «Guardar» para finalizar un grupo de ediciones- por ejemplo, si ha completado\nun área de ciudad y le gustaría empezar un nuevo área. Tendrá una oportunidad\nde revisar lo que ha hecho, y el editor proporciona sugerencias útiles\ny advertencias si algo no parece estar correcto sobre los cambios.\n\nSi todo parece estar bien, puede introducir un breve comentario explicando el cambio\nque hizo, y hacer click en «Subir» para publicar los cambios en\n[OpenStreetMap.org](http://www.openstreetmap.org/), donde estarán visibles\npara los demás usuarios y disponibles para otros para construir y mejorar.\n\nSi no puede terminar sus ediciones de una vez, puede dejar la ventana del editor y volver (en el mismo navegador y computadora), y la aplicación del editor ofrecerá restaurar su trabajo.\n\n### Usando el editor\n\nPuede ver una lista de atajos de teclado presionando la tecla «?».\n",
-            "roads": "# Carreteras\n\nUsted puede crear, reparar y eliminar carreteras con este editor. Las carreteras pueden ser de todos los\ntipos: rutas, autovías, senderos, carriles bici y más - cualquier segmento cruzado a menudo\nel segmento debe ser mapeable.\n\n### Seleccionando\n\nClick en una carretera para seleccionar. Un esquema debe ser visible, junto\ncon una barra lateral mostrando más información sobre la carretera. Si hace click derecho\nen él, tendrá un menú de acciones que puede aplicar a la carretera.\n\n### Modificando\n\nA menudo verá carreteras que no están alineados con las imágenes detrás de ellos\no a un rastro GPS. Puede ajustar esas carreteras para que estén en el lugar\ncorrecto.\n\nPrimero clickee en la carretera que quiere cambiar. Esto la resaltará y mostrará\npuntos de control a lo largo de ella que puede arrastrar a mejores ubicaciones. Si\nquiere añadir nuevos puntos de control para más detalle, doble click en una parte\nde la carretera que no tenga nodo, y se añadido uno.\n\nSi la carretera conecta a otra carretera, pero no conecta apropiadamente con\nel mapa, puede arrastrar uno de sus puntos de control a la otra carretera para\nunirlas. Tener carreteras conectadas es importante para el mapa\ny esencial para proporcionar instrucciones de conducción.\n\nTambién puede hacer click derecho en ella y seleccionar la herramienta «Mover», o simplemente presionar\nla tecla de atajo «M», para mover toda la carretera al mismo tiempo, y luego hacer click\nde nuevo para guardar el movimiento.\n\n### Eliminando\n\nSi una carretera está completamente incorrecta - puede ver que no existe en las imágenes\nde satélitee y han confirmado localmente que no está presente - puede eliminarla\nlo que la borra del mapa. Tenga cuidado al eliminar elementos-\ncomo cualquier otra editar, los resultados son vistos por todos y las imágenes de satélite\na menudo están desactualizadas, por lo que la carretera podría simplemente ser de nueva construcción.\n\nPuede eliminar una carretera clickeando sobre ella para seleccionar, después presionar la tecla «Eliminar»\no haciendo click derecho sobre ella y luego hacer clic en el icono de la papelera.\n\n### Creando\n\n¿Ha encontrado en algún lugar en el que debería haber una carretera pero no hay? Clickee en el icono «Línea»\nen la esquina superior izquierda del editor o presione la tecla de acceso directo «2» para empezar a dibujar\nuna línea.\n\nClick al principio de la carretera en el mapa para empezar a dibujar. Si la carretera\nse ramifica desde una carretera existente, comience haciendo clic en el lugar donde se conectan.\n\nLuego haga clic en los puntos a lo largo de la carretera para que siga el camino correcto, de acuerdo\na la imagen de satélite o de GPS. Si la carretera que está atravesando atraviesa otra carretera, conéctela\nhaciendo clic en el punto de intersección. Cuando haya terminado de dibujar, doble click\no presione «Retorno» o «Intro» en su teclado.\n",
-            "gps": "# GPS\n\nLas trazas de GPS recogidas son una valiosa fuente de datos para OpenStreetMap. Este\neditor soporta trazas locales - archivos `.gpx` en su equipo local. Usted puede obtener\neste tipo de traza GPS con una serie de aplicaciones de smartphone, como también con\nhardware GPS personal.\n\nPara más información sobre cómo realizar un relevamiento GPS, lea\n[Mapear con un smartphone, GPS, o papel](http://learnosm.org/es/mobile-mapping/).\n\nPara utilizar una traza GPX para mapear, arrastre y suelte el archivo GPX en el editor\nde mapa. Si este es reconocido, se añadirá al mapa como una línea púrpura brillante.\nHaga clic en el menú 'Datos del mapa' en el lado derecho para activar,\ndesactivar o acercar a esta nueva capa alimentada por GPX.\n\nLa traza GPX no se carga directamente a OpenStreetMap - la mejor manera de\nutilizarlo es dibujar en el mapa, usándolo como guía para las nuevos elementos que\nagregue, y también [subirlo a OpenStreetMap](http://www.openstreetmap.org/trace/create)\npara que otros usuarios lo utilicen.\n",
-            "imagery": "# Imágenes\n\nLas imágenes aéreas son un importante recurso para mapear. Una combinación\nde vuelos aéreos, vistas de satélite, y compilaciones de fuentes libres están disponibles\nen el editor bajo el menú 'Ajustes del fondo' a la derecha.\n\nDe forma predeterminada se presenta la capa de satélite de [Bing Maps](http://www.bing.com/maps/) en el editor, pero mientras se mueva y acerque el mapa a nuevas áreas\ngeográficas, nuevas fuentes estarán disponibles. Algunos países, como los Estados\nUnidos, Francia, y Dinamarca poseen imágenes de muy alta calidad disponible\npara algunas áreas.\n\nLas imágenes a veces están desplazadas de los datos del mapa debido a un error en el\nlado del proveedor de imágenes. Si observa muchos caminos desplazados del fondo,\nno los mueva inmediatamente para emparejarlos con el fondo. En su lugar puede ajustar\nlas imágenes para que coincidan con los datos existentes haciendo clic\nen 'Corregir alineación' en la opción 'Ajustes del fondo' de la interfaz.\n",
-            "addresses": "# Direcciones\n\nLas direcciones son parte de la información más útil que se puede añadir al mapa.\n\nAunque las direcciones se representan a menudo como parte de las calles, en OpenStreetMap esta información es guardada como atributos de los edificios y lugares presentes a lo largo de los viales.\n\nPuede agregar información sobre direcciones a lugares dibujados en el mapa como contornos de edificios, así como aquellos localizados únicamente con un punto. La fuente óptima para obtener datos de direcciones es la consulta sobre el terreno o el conocimiento personal. El uso de fuentes comerciales, como Google Maps, para obtener estos datos está estrictamente prohibido.\n",
-            "inspector": "# Usando el inspector\n\nEl inspector es la sección en la parte izquierda de la página que le permite\neditar los detalles del elemento seleccionado.\n\n## Selección de un tipo de elemento\n\nDespués de agregar un punto, línea o área, puede elegir qué tipo de elemento\nes, como si se trata de una carretera o camino residencial, supermercado o una cafetería.\nEl inspector mostrará botones para tipos de elementos comunes, y usted puede\nencontrar otros escribiendo lo que  está buscando en el cuadro de búsqueda.\n\nHaga clic en la 'i' de la esquina inferior derecha de un botón de tipo de elemento\npara aprender más sobre él. Haga clic en un botón para elegir ese tipo.\n\n\n### Uso de formularios y edición de etiquetas\n\nDespués de elegir un tipo de elemento, o cuando se selecciona un elemento\nque ya tiene un tipo asignado, el inspector mostrará campos con detalles sobre\nel elemento como su nombre y dirección.\n\nDebajo de los campos que ve, puede hacer clic en el desplegable 'Añadir campo'\npara agregar otros detalles, como un enlace de Wikipedia,  acceso en silla de ruedas, y más.\n\nEn la parte inferior del inspector, haga clic en 'Etiquetas adicionales' para agregar otras\netiquetas arbitrarias al elemento. [Taginfo](http://taginfo.openstreetmap.org/) es un\ngran recurso para aprender más acerca de las combinaciones de etiquetas populares.\n\nLos cambios que realice en el inspector se aplican automáticamente al mapa.\nPuede deshacerlos en cualquier momento haciendo clic en el botón 'Deshacer'.\n",
-            "buildings": "# Edificios\n\nOpenStreetMap es la base de datos de edificios más grande del mundo. Usted puede crear\ny mejorar esta base de datos.\n\n### Seleccionando\n\nPuede seleccionar un edificio haciendo clic en su borde. Esto resaltará el\nedificio y cargará una barra lateral que muestra más información sobre el edificio.\nSi hace clic derecho en él, se mostrará un menú de acciones que puede ejecutar\nen el edificio.\n\n### Modificando\n\nA veces los edificios se colocan incorrectamente o tienen etiquetas incorrectas.\n\nPara mover un edificio entero, seleccionar y presione la tecla de acceso directo «M»,\no haga click derecho en él y seleccionar la herramienta «Mover». Mueva su\nratón para cambiar el edificio, y haga click cuando esté colocado correctamente.\n\nPara arreglar la forma específica de un edificio, haga clic y arrastre los nodos que forman\nsu borde enlugares mejores.\n\n### Creando\n\nUna de las preguntas principales sobre añadir edificios al mapa es que\nOpenStreetMap guarda edificios como formas y puntos. La regla de oro\nes _mapear un edificio como una forma cuando sea posible_, y mapear empresas, casas,\nservicios, y otras cosas que operan fuera de los edificios como puntos colocados\nen el interior de la forma del edificio.\n\nEmpiece dibujando un edificio como una forma pulsando el botón «Área» arriba\na la izquierda de la interfaz, y termínelo pulsando «Retorno» en su teclado\no haciendo clic en el primer nodo dibujado para cerrar la forma.\n\n### Eliminando\n\nSi un edificio está completamente incorrecto - puede ver que no existe en la imagen de satélite\ne idealmente han confirmado localmente que no está presente - puede eliminarlo\nlo que lo borra del mapa. Tenga cuidado al eliminar elementos-\ncomo cualquier otra editar, los resultados son vistos por todos y la imagen de satélite\na menudo está desactualizado, por lo que el edificio podría simplemente ser de nueva construcción.\n\nPuede eliminar un edificio haciendo click en él para seleccionar, después presionar la tecla «Suprimir»,\no haciendo clic derecho sobre él y luego haciendo clic en el ícono de papelera.\n",
-            "relations": "# Relaciones\n\nUna relación es un tipo de elemento especial de OpenStreetMap que agrupa\na otros elementos. Por ejemplo, dos tipos comunes de relaciones son *relaciones de ruta*,\nque agrupan secciones de la carretera que pertenecen a una autopista específica o\nautovía , y *multipolígonos*, que agrupan varias líneas que definen\nun área compleja (uno con varias piezas o agujeros como una rosquilla).\n\nEl grupo de elementos en una relación se llaman *miembros*. En la parte inferior de la\nbarra lateral, puede ver a qué relaciones es miembro un elemento y hacer clic en una\nrelación allí lo seleccionará. Cuando la relación está seleccionar, puede ver a todos\nsus miembros enumerados en la barra lateral y resaltados en el mapa.\n\nEn la mayor parte, la iD se ocupará de mantener las relaciones automáticamente\nmientras usted editar. Lo principal que debe tener en cuenta es que si elimina una\nsección de carretera para volver a dibujarla con mayor precisión, debería asegurarse de que la\nnueva sección es un miembro de las mismas relaciones que el original.\n\n## Editando Relaciones\n\nSi quiere editar relaciones, aquí están los básicos.\n\nPara añadir un elemento a una relación, seleccionar el elemento, click en el botón «+» en la\nsección «Todas las relaciones» de la barra lateral, y seleccionar o tipo el nombre de la relación.\n\nPara crear una nueva relación, seleccionar el primer elemento que debería ser un miembro,\nclick en el botón «+» en la sección «Todas las relaciones», y seleccionar «Nueva relación...».\n\nPara eliminar un elemento de una relación, seleccionar el elemento y haga click en el botón papelera\njunto a la relación de la que quiere eliminarlo.\n\nPuede crear multipolígonos con agujeros usando la herramienta «Mezclar». Dibuje dos áreas (interior\ny exterior), mantenga la tecla Shift y click en cada uno de ellas para seleccionar ambas, y luego\npresione la tecla de acceso directo «C». Otra opción es seleccionar ambas, y luego hacer click derecho en una\nde ellas y hacer click en el botón «Mezclar» (+).\n"
+            "help": {
+                "title": "Ayuda",
+                "welcome": "Bienvenido al editor de iD para [OpenStreetMap](https://www.openstreetmap.org/). Con este editor puede actualizar OpenStreetMap directamente desde su navegador web.",
+                "open_data_h": "Datos abiertos",
+                "open_data": "Las ediciones que realice en este mapa serán visibles para todos los que usen OpenStreetMap. Las ediciones pueden basarse en conocimiento personal, relevamiento en el terreno o imágenes recogidas de fotografías aéreas o de la calle. Copiar de fuentes comerciales, como Google Maps, [está estrictamente prohibido](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Antes de empezar",
+                "before_start": "Debería estar familiarizado con OpenStreetMap y este editor antes de comenzar a editar. iD tiene un tutorial para enseñarle los conceptos básicos de la edición de OpenStreetMap. Haga clic en \"Iniciar el tutorial\" en esta pantalla para realizar el tutorial - Solo le tomará unos 15 minutos.",
+                "open_source_h": "Código abierto",
+                "open_source": "El editor de iD es un proyecto colaborativo de código abierto y ahora está utilizando la versión {version}. El código fuente está disponible [en GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Puede ayudar a iD [traduciendo](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) o [reportando errores](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Resumen",
+                "navigation_h": "Navegación",
+                "navigation_drag": "Puede arrastrar el mapa presionando y manteniendo presionado el {leftclick} botón izquierdo del ratón y moviendo el ratón. También se puede usar las teclas de flecha `↓`, `↑`, `←`, `→` del teclado.",
+                "navigation_zoom": "Puede acercar o alejar girando la rueda del ratón o el panel táctil, o haciendo clic en los botones {plus} / {minus} al costado del mapa. También se puede usar las teclas `+`, `-` del teclado.",
+                "features_h": "Elementos del mapa",
+                "features": "Usamos la palabra *elementos* para describir las cosas que aparecen en el mapa, como carreteras, edificios o puntos de interés. Cualquier cosa en el mundo real se puede mapear como un elemento en OpenStreetMap. Los elementos del mapa están representadas en el mapa usando *puntos*, *líneas* o *áreas*.",
+                "nodes_ways": "En OpenStreetMap, los puntos a veces se llaman *nodos*, y las líneas y áreas a veces se llaman *vías*. "
+            },
+            "editing": {
+                "title": "Editar y guardar",
+                "select_h": "Seleccionar",
+                "select_left_click": "{leftclick} Haga clic con el botón izquierdo en un elemento para seleccionarlo. Esto lo resaltará con un brillo pulsante, y la barra lateral mostrará detalles sobre ese elemento, como su nombre o dirección.",
+                "select_right_click": "{rightclick} Haga clic con el botón derecho en un elemento para mostrar el menú de edición que muestra los comandos disponibles, como rotar, mover y eliminar.",
+                "multiselect_h": "Multiselección",
+                "multiselect_shift_click": "`{shift}`+{leftclick} clic izquierdo para seleccionar varios elementos juntos. Esto hace que sea más fácil mover o eliminar varios elementos.",
+                "multiselect_lasso": "Otra forma de seleccionar varios elementos es mantener presionada la tecla `{shift}`, luego mantener presionado el {leftclick} botón izquierdo del ratón y arrastrar el ratón para dibujar un lazo de selección. Se seleccionarán todos los puntos dentro del área del lazo.",
+                "undo_redo_h": "Deshacer y rehacer",
+                "undo_redo": "Las ediciones se almacenan localmente en el navegador hasta que elija guardarlas en el servidor de OpenStreetMap. Para deshacer ediciones, haga clic en el botón {undo} **Deshacer** y vuelva a hacerlas con clic en el botón {redo} **Rehacer**.",
+                "save_h": "Guardar",
+                "save": "Haga clic en {save} **Guardar** para finalizar los cambios y enviarlos a OpenStreetMap. ¡Debe recordar guardar el trabajo frecuentemente!",
+                "save_validation": "En la pantalla de guardar se tiene la oportunidad de revisar lo realizado. iD también realizará algunas verificaciones básicas de datos faltantes y puede ofrecer sugerencias y advertencias útiles si algo no parece correcto.",
+                "upload_h": "Subir",
+                "upload": "Antes de cargar los cambios, debe ingresar un [comentario del conjunto de cambios](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). A continuación, haga clic en **Subir** para enviar sus cambios a OpenStreetMap, donde se fusionarán en el mapa y serán públicamente visibles para todos.",
+                "backups_h": "Copias de respaldo automáticas",
+                "backups": "Si no logra finalizar las ediciones de una sola vez, por ejemplo si su computadora falla o cierra el navegador, sus ediciones aun se mantendrán en la memoria del navegador. Podrá regresar luego (utilizando el mismo navegador en la misma computadora) y iD le dará la opción de restaurar su trabajo.",
+                "keyboard_h": "Atajos de teclado",
+                "keyboard": "Puedes ver una lista de atajos de teclado presionando la tecla `?`."
+            },
+            "feature_editor": {
+                "title": "Editor de elemento",
+                "intro": "El *editor de elemento* aparece junto al mapa, y le permite ver y editar toda la información del elemento seleccionado.",
+                "definitions": "La sección superior muestra el tipo de elemento. La sección central contiene *campos* que muestran los atributos del elemento, como su nombre o dirección.",
+                "type_h": "Tipo de elemento",
+                "type": "Puede hacer clic en el tipo de elemento para cambiar el elemento a un tipo diferente. Todo lo que existe en el mundo real se puede agregar a OpenStreetMap, por lo que hay miles de tipos de elementos para elegir.",
+                "type_picker": "El selector de tipos muestra los tipos de elementos más comunes, como parques, hospitales, restaurantes, carreteras y edificios. Puede buscar cualquier cosa escribiendo lo que está buscando en el cuadro de búsqueda. También puede hacer clic en el ícono {inspect} **Información** junto al tipo de elemento para obtener más información al respecto.",
+                "fields_h": "Campos",
+                "fields_all_fields": "La sección \"Todos los campos\" contiene todos los detalles del elemento que puede editar. En OpenStreetMap, todos los campos son opcionales, y está bien dejar un campo en blanco si no está seguro.",
+                "fields_example": "Cada tipo de elemento mostrará diferentes campos. Por ejemplo, una carretera puede mostrar campos para su superficie y límite de velocidad, pero un restaurante puede mostrar campos para el tipo de comida que sirve y los horarios que está abierto.",
+                "fields_add_field": "También puede hacer clic en el menú desplegable \"Agregar campo\" para agregar más campos, como una descripción, enlace de Wikipedia, acceso para sillas de ruedas y más.",
+                "tags_h": "Etiquetas",
+                "tags_all_tags": "Debajo de la sección de campos, puede expandir la sección \"Todas las etiquetas\" para editar cualquiera de las *etiquetas* de OpenStreetMap para el elemento seleccionado. Cada etiqueta consta de una *clave* y *valor*, elementos de datos que definen todos los elementos almacenados en OpenStreetMap.",
+                "tags_resources": "Editar las etiquetas de un elemento requiere conocimiento intermedio sobre OpenStreetMap. Debería consultar recursos como la [Wiki de OpenStreetMap] (https://wiki.openstreetmap.org/wiki/Main_Page) o [Taginfo] (https://taginfo.openstreetmap.org/) para obtener más información sobre las prácticas aceptadas de etiquetado de OpenStreetMap."
+            },
+            "points": {
+                "title": "Puntos",
+                "intro": "Los *puntos* se pueden usar para representar elementos como tiendas, restaurantes y monumentos. Marcan una ubicación específica y describen lo que hay allí.",
+                "add_point_h": "Creando puntos",
+                "add_point": "Para agregar un punto, haga clic en el botón {point} **Punto** en la barra de herramientas sobre el mapa, o presione la tecla de método abreviado `1`. Esto cambiará el cursor del ratón a un símbolo de cruz.",
+                "add_point_finish": "Para colocar el nuevo punto en el mapa, coloque el cursor del mouse donde debe ir el punto, luego haga clic con el botón izquierdo del ratón o presione `Espacio`.",
+                "move_point_h": "Moviendo puntos",
+                "move_point": "Para mover un punto, coloque el cursor del mouse sobre el punto y luego mantenga presionado el botón izquierdo del ratón mientras arrastra el punto a su nueva ubicación.",
+                "delete_point_h": "Borrando puntos",
+                "delete_point": "Está bien eliminar los elementos que no existen en el mundo real. Al eliminar un elemento de OpenStreetMap, se elimina del mapa que todos utilizan, por lo que debe asegurarse de que el elemento realmente no exista antes de eliminarlo.",
+                "delete_point_command": "Para eliminar un punto, haga clic con el botón derecho en el punto para seleccionarlo y mostrar el menú de edición, luego use el comando {delete} **Borrar*."
+            },
+            "lines": {
+                "title": "Líneas",
+                "intro": "*Las líneas* se utilizan para representar características tales como carreteras, ferrocarriles y ríos. Las líneas deben dibujarse en el centro del elemento que representan.",
+                "add_line_h": "Creando líneas",
+                "add_line": "Para agregar una línea, haga clic en el botón {line} **Línea** en la barra de herramientas sobre el mapa, o presione la tecla de método abreviado `2`. Esto cambiará el cursor del ratón a un símbolo de cruz.",
+                "add_line_draw": "A continuación, coloque el cursor del ratón donde debe comenzar la línea y haga clic con el botón izquierdo del mouse o presione `Espacio` para comenzar a colocar nodos a lo largo de la línea. Continúa colocando más nodos haciendo clic o presionando `Espacio`. Mientras dibuja, puede acercar o arrastrar el mapa para agregar más detalles.",
+                "add_line_finish": "Para terminar una línea, presione `{return}` o haga clic de nuevo en el último nodo.",
+                "modify_line_h": "Cambiando líneas",
+                "modify_line_dragnode": "A menudo verá líneas que no tienen la forma correcta, por ejemplo, una carretera que no coincide con las imágenes de fondo. Para ajustar la forma de una línea, primero haga clic con el {leftclick} botón izquierdo para seleccionarla. Todos los nodos de la línea se dibujarán como pequeños círculos. A continuación, puede arrastrar los nodos a ubicaciones mejores.",
+                "modify_line_addnode": "También puede crear nuevos nodos a lo largo de una línea mediante {leftclick}**x2** haciendo doble clic en la línea o arrastrando los triángulos pequeños en los puntos medios entre nodos.",
+                "connect_line_h": "Conectando líneas",
+                "connect_line": "Tener las carreteras conectadas correctamente es importante para el mapa y esencial para proporcionar indicaciones de manejo.",
+                "connect_line_display": "Las conexiones entre carreteras están dibujadas con círculos grises. Los puntos finales de una línea se dibujan con círculos blancos más grandes si no se conectan a nada.",
+                "connect_line_drag": "Para conectar una línea a otro elemento, arrastre uno de los nodos de la línea al otro elemento hasta que ambos se junten. Consejo: Puede mantener presionada la tecla `{alt}` para evitar que los nodos se conecten a otros elementos.",
+                "connect_line_tag": "Si sabe que la conexión tiene semáforos o cruces peatonales, puede agregarlos seleccionando el nodo de conexión y utilizando el editor de elementos para seleccionar el tipo de elemento correcto.",
+                "disconnect_line_h": "Desconectando líneas",
+                "disconnect_line_command": "Para desconectar una carretera de otro elemento, haga clic con el botón derecho en el nodo de conexión y seleccione el comando {disconnect} **Desconectar** del menú de edición.",
+                "move_line_h": "Moviendo líneas",
+                "move_line_command": "Para mover una línea completa, haga clic con el botón derecho en la línea y seleccione el comando {move} **Mover** del menú de edición. A continuación, mueva el ratón y haga clic con el {leftclic} botón izquierdo para colocar la línea en una nueva ubicación.",
+                "move_line_connected": "Las líneas que están conectadas a otros elementos permanecerán conectadas a mientras mueva la línea a una nueva ubicación. iD puede evitar que mueva una línea a través de otra línea conectada.",
+                "delete_line_h": "Borrando líneas",
+                "delete_line": "Si una línea esta completamente incorrecta, por ejemplo, una ruta que no existe en el mundo real, está bien borrarla. Tenga cuidado al eliminar elementos: las imágenes de fondo que está utilizando podrían estar desactualizadas, y una carretera que parece estar mal podría simplemente estar recién construida.",
+                "delete_line_command": "Para eliminar una línea, haga clic con el botón derecho en la línea para seleccionarla y mostrar el menú de edición, luego use el comando {delete} **Borrar**."
+            },
+            "areas": {
+                "title": "Areas",
+                "intro": "Las **Areas** se utilizan para mostrar los límites de elementos como lagos, edificios y áreas residenciales. Las áreas deben dibujarse alrededor del borde del elemento que representan, por ejemplo, alrededor de la base de un edificio.",
+                "point_or_area_h": "¿Puntos o áreas?",
+                "point_or_area": "Muchos elementos se pueden representar como puntos o áreas. Debe mapear los edificios y los contornos de la propiedad como áreas siempre que sea posible. Coloque puntos dentro del área del edificio para representar negocios, comodidades y otros elementos ubicados dentro del edificio.",
+                "add_area_h": "Agregar áreas",
+                "add_area_command": "Para agregar un área, haga clic en el botón {area} **Área** en la barra de herramientas sobre el mapa, o presione la tecla de método abreviado `3`. Esto cambiará el cursor del ratón a un símbolo de cruz.",
+                "add_area_draw": "A continuación, coloque el cursor del ratón en una de las esquinas del elemento y haga clic con el botón izquierdo o presione `Espacio` para comenzar a colocar nodos alrededor del borde exterior del área. Continúe colocando más nodos haciendo clic o presionando `Espacio`. Mientras dibuja, puede acercar o arrastrar el mapa para agregar más detalles.",
+                "add_area_finish": "Para terminar un área, presione `{return}` o haga clic nuevamente en el primer o último nodo.",
+                "square_area_h": "Escuadrar esquinas",
+                "square_area_command": "Muchos elementos de área como edificios tienen esquinas cuadradas. Para escuadrar las esquinas de un área, haga clic con el botón derecho en el borde del área y seleccione el comando {orthogonalize} **Escuadrar** en el menú de edición.",
+                "modify_area_h": "Modificación de áreas",
+                "modify_area_dragnode": "A menudo, verá áreas que no tienen la forma correcta, por ejemplo, un edificio que no coincide con las imágenes de fondo. Para ajustar la forma de un área, primero, haga clic en el {leftclick} botón izquierdo del ratón para seleccionarla. Todos los nodos del área se dibujarán como pequeños círculos. A continuación, puede arrastrar los nodos a ubicaciones mejores.",
+                "modify_area_addnode": "También puede crear nuevos nodos a lo largo de un área mediante {leftclick} **x2** haciendo doble clic en el borde del área o arrastrando los triángulos pequeños en los puntos medios entre los nodos.",
+                "delete_area_h": "Eliminado de áreas",
+                "delete_area": "Si un área es completamente incorrecta, por ejemplo, un edificio que no existe en el mundo real, está bien que se elimine. Tenga cuidado al eliminar elementos: las imágenes de fondo que está utilizando pueden estar desactualizadas, y un edificio que parece incorrecto podría simplemente estar recién construido.",
+                "delete_area_command": "Para eliminar un área, haga clic con el  {rightclick} botón derecho en el área para seleccionarla y mostrar el menú de edición, luego use el comando {delete} **Eliminar**."
+            },
+            "relations": {
+                "title": "Relaciones",
+                "intro": "Una *relación* es un tipo especial de elemento en OpenStreetMap que agrupa otros elementos. Los elementos que pertenecen a una relación se llaman *miembros*, y cada miembro puede tener un *rol* en la relación.",
+                "edit_relation_h": "Edición de relaciones",
+                "edit_relation": "En la parte inferior del editor de elementos, puede expandir la sección \"Todas las relaciones\" para ver si el elemento seleccionado es miembro de alguna relación. A continuación, puede hacer clic en la relación para seleccionarla y editarla.",
+                "edit_relation_add": "Para agregar un elemento a una relación, seleccione la función y luego haga clic en el botón {plus} agregar en la sección \"Todas las relaciones\" del editor de funciones. Puede elegir de una lista de relaciones cercanas, o elegir la opción \"Nueva relación...\".",
+                "edit_relation_delete": "También puede hacer clic en el botón {delete} **Eliminar** para eliminar el elemento seleccionado de la relación. Si elimina todos los miembros de una relación, la relación se eliminará automáticamente.",
+                "maintain_relation_h": "Mantener relaciones",
+                "maintain_relation": "En su mayor parte, iD mantendrá relaciones automáticamente mientras edita. Debe tener cuidado al reemplazar los elementos que podrían ser miembros de las relaciones. Por ejemplo, si elimina una sección de la carretera y dibuja una nueva sección de la carretera para reemplazarla, debe agregar la nueva sección a las mismas relaciones (rutas, restricciones de giro, etc.) que la original.",
+                "relation_types_h": "Tipos de relación",
+                "multipolygon_h": "Multipolígonos",
+                "multipolygon": "Una relación *multipolígono* es un grupo de uno o más elementos *externos* y uno o más elementos internos. Los elementos externos definen los bordes exteriores del multipolígono, y los elementos internos definen subáreas o agujeros recortados desde el interior del multipolígono.",
+                "multipolygon_create": "Para crear un multipolígono, por ejemplo, un edificio con un agujero, dibuje el borde externo como un área y el borde interior como una línea o un tipo diferente de área. Luego `{shift}`+{leftclick} haga clic con el botón izquierdo para seleccionar ambas funciones, haga clic con el botón derecho en el menú para mostrar el menú de edición y seleccione el comando {merge} **Combinar**.",
+                "multipolygon_merge": "Combinar varias líneas o áreas creará una nueva relación multipolígono con todas las áreas seleccionadas como miembros. iD elegirá los roles internos y externos de forma automática, en función de los elementos que se encuentran dentro de otros elementos.",
+                "turn_restriction_h": "Restricciones de giro",
+                "turn_restriction": "Una relación de *restricción de giro* es un grupo de varios segmentos de camino en una intersección. Las restricciones de giro constan de un camino *desde*, nodo o carreteras *vía*, y un camino *hasta*.",
+                "turn_restriction_field": "Para editar restricciones de giro, seleccione un nodo de unión donde dos o más caminos se crucen. El editor de elementos mostrará un campo especial \"Restricciones de giro\" que contiene un modelo de intersección.",
+                "turn_restriction_editing": "En el campo \"Restricciones de giro\", haga clic para seleccionar un camino \"desde\", y vea si los giros están permitidos o restringidos a cualquiera de las carreteras \"hasta\". Puede hacer clic en los iconos de giro para alternar entre permitido y restringido. iD creará relaciones automáticamente y establecerá los desde, vía y roles según sus elecciones.",
+                "route_h": "Rutas",
+                "route": "Una relación *Ruta* es un grupo de una o más elementos de línea que juntas forman una red de rutas, como una ruta de autobús, una ruta de tren o una ruta de carretera.",
+                "route_add": "Para agregar un elemento a una relación de ruta, seleccione el elemento y desplácese hacia abajo a la sección \"Todas las relaciones\" del editor de elementos, luego haga clic en el botón {plus} agregar para agregar este elemento a una relación cercana existente o a una nueva relación.",
+                "boundary_h": "Límites",
+                "boundary": "Una relación *límite* es un grupo de uno o más elementos de línea que juntas forman un límite administrativo.",
+                "boundary_add": "Para agregar un elemento a una relación de límite, seleccione el elemento y desplácese hacia abajo a la sección \"Todas las relaciones\" del editor de elemento, luego haga clic en el botón {plus} agregar para agregar este elemento a una relación cercana existente o a una nueva relación."
+            },
+            "imagery": {
+                "title": "Imágenes de fondo",
+                "intro": "Las imágenes de fondo que aparecen debajo de los datos del mapa son un recurso importante para el mapeo. Estas imágenes pueden ser fotografías aéreas recopiladas de satélites, aviones y aviones no tripulados, o pueden escanearse mapas históricos u otros datos de origen disponibles libremente.",
+                "sources_h": "Fuentes de imágenes",
+                "choosing": "Para ver qué fuentes de imágenes están disponibles para editar, haga clic en el botón {layers} **Configuración de fondo** en el lateral del mapa.",
+                "sources": "De forma predeterminada, se elige la capa de satélite [Bing Maps](https://www.bing.com/maps/) como imagen de fondo. Dependiendo de dónde esté editando, otras fuentes de imágenes estarán disponibles. Algunas pueden ser más recientes o tener una resolución más alta, por lo que siempre es útil verificar qué capa es la mejor para usar como referencia de mapeo.",
+                "offsets_h": "Ajuste de desplazamiento de imágenes",
+                "offset": "Las imágenes a veces están ligeramente desplazadas con respecto a los datos precisos del mapa. Si ve una gran cantidad de carreteras o edificios desplazados de las imágenes de fondo, puede ser que las imágenes sean incorrectas, por lo que no las mueva todos para que coincidan con el fondo. En su lugar, puede ajustar el fondo para que coincida con los datos existentes al expandir la sección \"Ajustar desplazamiento de imágenes\" en la parte inferior del panel de Configuración de fondo.",
+                "offset_change": "Haga clic en los triángulos pequeños para ajustar el desplazamiento de imágenes en pequeños pasos, o mantenga presionado el botón izquierdo del ratón y arrastre dentro del cuadrado gris para deslizar las imágenes hacia la alineación."
+            },
+            "streetlevel": {
+                "title": "Fotos a nivel de calle",
+                "intro": "Las fotos a nivel de calle son útiles para mapear señales de tráfico, negocios y otros detalles que no se pueden ver desde imágenes satelitales y aéreas. El editor iD admite fotos a nivel de calle de [Mapillary](https://www.mapillary.com) y [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Usar fotos a nivel de calle",
+                "using": "Para usar fotos a nivel de calle para mapear, haga clic en el panel {data} **Datos de mapa** en el lateral del mapa para habilitar o deshabilitar las capas de fotos disponibles.",
+                "photos": "Cuando está habilitada, la capa de la foto muestra una línea a lo largo de la secuencia de fotos. En niveles de zoom más altos, se indica con un círculo en cada foto la ubicación, y en niveles de zoom aún más altos, se indica con un cono la dirección que estaba mirando la cámara cuando se tomó la foto.",
+                "viewer": "Cuando hace clic en una de las ubicaciones de las fotos, aparece un visor de fotografías en la esquina inferior del mapa. El visor de fotos contiene controles para avanzar y retroceder en la secuencia de imágenes. También muestra el nombre de usuario de la persona que capturó la imagen, la fecha en que fue capturada y un enlace para ver la imagen en el sitio original."
+            },
+            "gps": {
+                "title": "Trazados GPS",
+                "intro": "os rastros de GPS recopilados son una valiosa fuente de datos para OpenStreetMap. Este editor admite archivos * .gpx *, * .geojson * y * .kml* en su computadora local. Puede recopilar rastros de GPS con un teléfono inteligente, reloj deportivo u otro dispositivo GPS.",
+                "survey": "Para obtener información sobre cómo realizar un relevamiento con GPS, lea [Mapeo con un teléfono inteligente, GPS o papel](http://learnosm.org/es/mobile-mapping/).",
+                "using_h": "Utilizando trazados GPS",
+                "using": "Para usar una traza de GPS para el mapeo, arrastre y suelte el archivo de datos en el editor de mapas. Si lo reconoce, lo dibujará en el mapa como una línea violeta brillante. Haga clic en el panel {data} **Datos del mapa** en el lateral del mapa para habilitar, deshabilitar o ampliar sus datos de GPS.",
+                "tracing": "La traza de GPS no se envía a OpenStreetMap; la mejor manera de usarla es dibujar en el mapa usándola como una guía para los nuevos elementos que agregue.",
+                "upload": "También puede [cargar los datos del GPS a OpenStreetMap](https://www.openstreetmap.org/trace/create) para que los usen otros usuarios."
+            }
         },
         "intro": {
             "done": "listo",
                     "access-point-employment": "Talento Recursos Humanos",
                     "adams-street": "Calle Adolfo Alsina",
                     "andrews-elementary-school": "Escuela primaria Alberdi",
-                    "andrews-street": "Calle Andalucia",
+                    "andrews-street": "Calle Andalucía",
                     "armitage-street": "Calle Armenia",
                     "barrows-school": "Escuela Belgrano",
                     "battle-street": "Calle Batalla de Maipú",
             },
             "navigation": {
                 "title": "Navegación",
-                "drag": "El área del mapa principal muestra los datos de OpenStreetMap encima de un fondo.{br}Puede arrastrar el mapa manteniendo presionado el botón izquierdo del ratón mientras mueve el ratón alrededor. También puede utilizar las teclas de flechas de su teclado. **¡Arrastre el mapa!**",
+                "drag": "El área del mapa principal muestra los datos de OpenStreetMap encima de un fondo.{br}Puede arrastrar el mapa manteniendo presionado el botón izquierdo del ratón mientras mueve el ratón alrededor. También puede utilizar las teclas de flechas del teclado. **¡Arrastre el mapa!**",
                 "zoom": "Puede acercar o alejar desplazándose con la rueda del ratón o el trackpad, o haciendo clic en los botones {plus} / {minus}. **¡Acercar el mapa!**",
                 "features": "Utilizamos la palabra *elementos* para describir las cosas que aparecen en el mapa. Cualquier cosa en el mundo real puede ser mapeada como un elemento en OpenStreetMap.",
                 "points_lines_areas": "Las elementos del mapa se representan usando *puntos, líneas o áreas.*",
                 "update_close": "**Cuando haya terminado de actualizar la cafetería, presione la tecla escape, retorno o haga clic en el botón {button} para cerrar el editor de elementos.**",
                 "rightclick": "Puede hacer clic derecho del ratón en cualquier elemento para ver el *menú de edición*, el cual muestra la lista de operaciones de edición que se pueden realizar. **Haga clic con el botón derecho para seleccionar el punto que creó y mostrar el menú de edición.**",
                 "delete": "Está bien eliminar los elementos que no existen en el mundo real.{br}Eliminando un elemento de OpenStreetMap, quita del mapa que todos utilizan, por lo que debe asegurarse que el elemento ya no está físicamente antes de eliminarlo. **Haga clic en el botón {button} para eliminar el punto.**",
-                "undo": "Siempre puede deshacer cualquier cambio hasta que guarde sus ediciones en OpenStreetMap. **Haga clic en el botón {button} para deshacer la eliminación y recuperar el punto.**",
+                "undo": "Siempre puede deshacer cualquier cambio hasta que guarde las ediciones en OpenStreetMap. **Haga clic en el botón {button} para deshacer la eliminación y recuperar el punto.**",
                 "play": "¡Ahora que conoce cómo crear y editar puntos, trate de crear algunos puntos más para practicar! **Cuando quiera continuar con el siguiente capítulo, haga clic en '{next}'.**"
             },
             "areas": {
                 "title": "Áreas",
-                "add_playground": "Las *áreas* son utilizadas para mostrar los límites de elementos como lagos, edificios y Ã¡reas residenciales.{br}Estos pueden ser utilizados para mapear con más detalle muchos elementos que normalmente podría mapear como puntos. **Haga clic en el botón Ã¡rea {button} para añadir una nueva Ã¡rea.**",
+                "add_playground": "Las *Ã\81reas* se utilizan para mostrar los límites de elementos como lagos, edificios y Ã¡reas residenciales. {br}También se pueden usar para mapeo más detallado de muchos elementos que normalmente se pueden asignar como puntos. **Haga clic en el botón {botton} Ã\81rea para agregar un Ã¡rea nueva.**",
                 "start_playground": "Vamos a añadir esta zona de juegos al mapa dibujando un área.  Las áreas se dibujan colocando *nodos* a lo largo del borde exterior del elemento. **Haga clic o presione la barra espaciadora para colocar un nodo inicial en una de las esquinas de la zona de juegos.**",
                 "continue_playground": "Continúe dibujando el área colocando más nodos a lo largo del borde del patio. Está bien conectar el área a los caminos existentes.{br}Consejo: Puede mantener pulsada la tecla '{alt}' para evitar que los nodos se conecten a otros elementos. **Continuar dibujando un área para el patio de recreo.**",
                 "finish_playground": "Termine el área presionando la tecla retorno, o haciendo clic nuevamente en el primer o último nodo. **Termine de dibujar un área para la zona de juegos.**",
                     "title": "Seleccionando elementos",
                     "select_one": "Selecciona un solo elemento",
                     "select_multi": "Selecciona múltiples elementos",
-                    "lasso": "Dibuja un lazo de selección alrededor de los elementos"
+                    "lasso": "Dibuja un lazo de selección alrededor de los elementos",
+                    "search": "Encontrar elementos que coincidan con el texto de búsqueda"
                 },
                 "with_selected": {
                     "title": "Con elemento seleccionado",
                     "continue_line": "Continua una línea en el nodo seleccionado",
                     "merge": "Combina (fusiona) los elementos seleccionados",
                     "disconnect": "Desconecta los elementos en el nodo seleccionado",
-                    "split": "Divide una línea en dos en el nodo seleccionado",
+                    "split": "Divida una línea en dos en el nodo seleccionado",
                     "reverse": "Invierte una línea",
                     "move": "Mueve los elementos seleccionados",
                     "rotate": "Rota los elementos seleccionados",
                         },
                         "dismount": {
                             "description": "Acceso permitido pero el ciclista debe bajarse",
-                            "title": "Desmontar"
+                            "title": "Desmontado"
                         },
                         "no": {
                             "description": "Acceso no permitido al público en general",
                 "brand": {
                     "label": "Marca"
                 },
+                "brewery": {
+                    "label": "Cerveza de barril / tirada"
+                },
                 "bridge": {
                     "label": "Tipo",
                     "placeholder": "Predeterminado"
                     "label": "Capacidad",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Dirección",
-                    "options": {
-                        "E": "Este",
-                        "ENE": "Este-Noreste",
-                        "ESE": "Este-Sureste",
-                        "N": "Norte",
-                        "NE": "Noreste",
-                        "NNE": "Norte-Noreste",
-                        "NNW": "Norte-Noroeste",
-                        "NW": "Noroeste",
-                        "S": "Sur",
-                        "SE": "Sureste",
-                        "SSE": "Sur-Sureste",
-                        "SSW": "Sur-Suroeste",
-                        "SW": "Suroeste",
-                        "W": "Oeste",
-                        "WNW": "Oeste-Noroeste",
-                        "WSW": "Oeste-Sureste"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipo"
                 },
-                "clock_direction": {
-                    "label": "Dirección",
-                    "options": {
-                        "anticlockwise": "En sentido antihorario",
-                        "clockwise": "En sentido horario"
-                    }
-                },
                 "clothes": {
                     "label": "Ropa"
                 },
                     }
                 },
                 "crop": {
-                    "label": "Cultivo"
+                    "label": "Cultivos"
                 },
                 "crossing": {
                     "label": "Tipo"
                 },
                 "cuisine": {
-                    "label": "Cocina"
+                    "label": "Cocinas"
                 },
                 "currency_multi": {
                     "label": "Tipos de moneda"
                 "diaper": {
                     "label": "Cambiador de pañales disponible"
                 },
+                "direction": {
+                    "label": "Dirección (grados en el sentido horario)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Dirección",
+                    "options": {
+                        "E": "Este",
+                        "ENE": "Este-noreste",
+                        "ESE": "Este-sureste",
+                        "N": "Norte",
+                        "NE": "Noreste",
+                        "NNE": "Norte-noreste",
+                        "NNW": "Norte-noroeste",
+                        "NW": "Noroeste",
+                        "S": "Sur",
+                        "SE": "Sureste",
+                        "SSE": "Sur-sureste",
+                        "SSW": "Sur-suroeste",
+                        "SW": "Suroeste",
+                        "W": "Oeste",
+                        "WNW": "Oeste-noroeste",
+                        "WSW": "Oeste-suroeste"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Dirección",
+                    "options": {
+                        "anticlockwise": "Antihorario",
+                        "clockwise": "Horario"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Dirección",
+                    "options": {
+                        "backward": "Hacia atrás",
+                        "both": "Ambos / Todos",
+                        "forward": "Adelante"
+                    }
+                },
                 "display": {
                     "label": "Monitor"
                 },
                 "memorial": {
                     "label": "Tipo"
                 },
-                "milestone_position": {
-                    "label": "Posición del hito kilométrico",
-                    "placeholder": "Distancia a un decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Supervisando"
                 },
                 "mtb/scale": {
                     "label": "Dificultad de bicicleta de montaña",
                 "oneway": {
                     "label": "Sentido único",
                     "options": {
+                        "alternating": "Alternante",
                         "no": "No",
+                        "reversible": "Reversible",
                         "undefined": "Se asume que es No",
                         "yes": "Sí"
                     }
                 "oneway_yes": {
                     "label": "Sentido único",
                     "options": {
+                        "alternating": "Alternante",
                         "no": "No",
+                        "reversible": "Reversible",
                         "undefined": "Se asume que es Sí",
                         "yes": "Sí"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Dirección",
-                    "options": {
-                        "backward": "Hacia atrás",
-                        "forward": "Hacia adelante"
-                    }
-                },
                 "park_ride": {
                     "label": "Aparcamiento / Estacionamiento disuasorio"
                 },
                 "railway": {
                     "label": "Tipo"
                 },
+                "railway/position": {
+                    "label": "Posición de hito",
+                    "placeholder": "Distancia a un decimal (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Dirección",
+                    "options": {
+                        "backward": "Hacia atrás",
+                        "both": "Ambos / Todos",
+                        "forward": "Adelante"
+                    }
+                },
                 "rating": {
                     "label": "Potencia nominal"
                 },
                 "recycling_accepts": {
                     "label": "Acepta"
                 },
-                "recycling_type": {
-                    "label": "Tipo de reciclaje",
-                    "options": {
-                        "centre": "Centro de reciclaje",
-                        "container": "Contenedor"
-                    }
-                },
                 "ref": {
                     "label": "Código de referencia"
                 },
                         "horrible": "Todo terreno: vehículo todo terreno de trabajo pesado",
                         "impassable": "Impasable / Ningún vehículo con ruedas",
                         "intermediate": "Ruedas: bicicleta urbana, silla de ruedas, ciclomotor",
-                        "very_bad": "Gran despeje: vehículo todo terreno de trabajo livianos",
+                        "very_bad": "Gran despeje: vehículo todo terreno de trabajo liviano",
                         "very_horrible": "Todo terreno especializado: tractor, vehículo todo terreno"
                     },
                     "placeholder": "Ruedas delgadas, ruedas, todo terreno..."
                     "label": "Deportes"
                 },
                 "sport_ice": {
-                    "label": "Deporte"
+                    "label": "Deportes"
                 },
                 "sport_racing_motor": {
-                    "label": "Deporte"
+                    "label": "Deportes"
                 },
                 "sport_racing_nonmotor": {
-                    "label": "Deporte"
+                    "label": "Deportes"
                 },
                 "stars": {
                     "label": "Estrellas"
                 "traffic_signals": {
                     "label": "Tipo"
                 },
+                "traffic_signals/direction": {
+                    "label": "Dirección",
+                    "options": {
+                        "backward": "Hacia atrás",
+                        "both": "Ambos / Todos",
+                        "forward": "Adelante"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Visibilidad de la senda",
                     "options": {
                     "terms": "ascensor de remolque de cuerda, cable de remolque, cuerda de remolque"
                 },
                 "aerialway/station": {
-                    "name": "Estación de remonte",
-                    "terms": "estación, estación de transporte por cable, estación de remonte"
+                    "name": "Estación de remonte"
                 },
                 "aerialway/t-bar": {
                     "name": "Ascensor T-bar",
                 },
                 "aeroway/apron": {
                     "name": "Plataforma de estacionamiento",
-                    "terms": "plataforma, pista de estacionamiento"
+                    "terms": "plataforma, a de estacionamiento"
                 },
                 "aeroway/gate": {
                     "name": "Puerta de embarque",
                     "terms": "cambio de divisas, dinero, divisas, banco, monedas, billetes, dolares, euros, libras, yenes, casa de cambio, moneda extranjera"
                 },
                 "amenity/bus_station": {
-                    "name": "Estación de autobuses",
-                    "terms": "estación,terminal,autobus,autobús,bus,buses,colectivo,micro,guagua"
+                    "name": "Estación / Terminal de bus"
                 },
                 "amenity/cafe": {
                     "name": "Cafetería",
                     "terms": "café, cafetería, té, salón de té, casa de té, bar, restaurante"
                 },
+                "amenity/car_pooling": {
+                    "name": "Automóvil compartido",
+                    "terms": "car pool, car pooling, transporte, automóvil, vehículo, auto, carro, coche, compartido, "
+                },
                 "amenity/car_rental": {
                     "name": "Alquiler de automóviles",
                     "terms": "alquiler de automóviles, rent a car, alquiler de coches, alquiler de autos, arrendamiento de autos, renta de coches, renta de carros"
                     "terms": "cronómetro"
                 },
                 "amenity/college": {
-                    "name": "Terreno de instituto",
-                    "terms": "terreno, área, suelo, instituto, univerisdad"
+                    "name": "Instituto / Escuela profesional",
+                    "terms": "instituto, universidad, escuela profesional, educación terceria"
                 },
                 "amenity/community_centre": {
                     "name": "Centro Comunitario",
                     "terms": "comida rápida, comida chatarra, comida basura, comida preparada, platos preparados, comida en la calle, comida de paso, hamburguesa, hotdog, pancho, pollos fritos, tacos, papas fritas, pizza, choripán, sandwitch, bocadillos, salchipapas, burrito, sopaipillas, quesadilla, nachos, arepa"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal de ferry",
-                    "terms": "ferry, ferri, transbordador, chalana, catamarán, lancha, pontón, terminal, estación"
+                    "name": "Estación / Terminal de ferry"
                 },
                 "amenity/fire_station": {
                     "name": "Estación de bomberos",
                     "terms": "depósito, contenedor, grava, gravilla, arena, arenilla, sal"
                 },
                 "amenity/hospital": {
-                    "name": "Terreno de hospital",
-                    "terms": "terreno, área, suelo, hospitalario, hospital, clínica, sanatorio, consultorio"
+                    "name": "Hospital",
+                    "terms": "clínica, médico, doctor, sala de urgencias, sala de emergencias, salud, enfermería, hospital, institución, sanatorio, sanatorio, enfermería, quirófano, sala de espera, posta de salud, consultorio"
                 },
                 "amenity/hunting_stand": {
                     "name": "Puesto de caza",
                     "terms": "internet, terminales, cafe, cyber, cyber cafe, cybercafe, ciber, ciber café, cibercafé, juegos, juegos en red"
                 },
                 "amenity/kindergarten": {
-                    "name": "Terreno de preescolar o jardín de infancia",
-                    "terms": "terreno, área, suelo, preescolar, preprimaria, jardín de infancia, jardín de niños, kinder, parvulario, párvulos"
+                    "name": "Preescolar o jardín de infancia",
+                    "terms": "preescolar, pre primaria, jardín de infancia, jardín de niños, kinder, parvulario, párvulos, educación inicial, jardín de infantes, jardín maternal"
                 },
                 "amenity/library": {
                     "name": "Biblioteca",
                     "terms": "biblioteca,archivo,filmoteca,hemeroteca"
                 },
+                "amenity/love_hotel": {
+                    "name": "Hotel para parejas",
+                    "terms": "hotel para parejas, parejas, telo, albergue transitorio, hotel alojamiento, motel"
+                },
                 "amenity/marketplace": {
                     "name": "Mercado",
                     "terms": "mercado, mercadillo, mercado público, plaza de mercado, feria"
                     "terms": "correo, oficina de correos, casa de correos, estafeta de correos"
                 },
                 "amenity/prison": {
-                    "name": "Terreno de prisión",
-                    "terms": "terreno, área, suelo, prisión, cárcel, carceleta, celda, penal, penitenciaria, presidio, reclusión, encierro, correccional, detención"
+                    "name": "Prisión / Cárcel",
+                    "terms": "prisión, cárcel, carceleta, celda, penal, penitenciaria, presidio, reclusión, encierro, correccional, detención"
                 },
                 "amenity/pub": {
                     "name": "Pub",
                     "terms": "Estación de guardaparques, estación de guardabosques, guarda forestal, guardaparque, guardaparques, guardabosque, puesto de guardaparque"
                 },
                 "amenity/recycling": {
-                    "name": "Contenedor de reciclado",
-                    "terms": "reciclaje, reciclado"
+                    "name": "Contenedor de reciclaje",
+                    "terms": "contenedor, tacho, reciclado, reciclaje, basura, lata, botella, vidrio, metal, papel"
                 },
                 "amenity/recycling_centre": {
                     "name": "Centro de reciclaje",
                     "terms": "desecho, inodoro, taza, letrina, baño, aseo, lavabo, casa rodante, autocaravana, motorhome"
                 },
                 "amenity/school": {
-                    "name": "Terreno escolar",
-                    "terms": "terreno, área, suelo, recinto escolar, escolar, escuela, colegio, centro educativo, unidad educativa, primaria, secundaria, secundario, instituto, institución educativa"
+                    "name": "Escuela / Colegio",
+                    "terms": "recinto escolar, escolar, escuela, colegio, centro educativo, unidad educativa, primaria, secundaria, secundario, instituto, institución educativa, academia, escuela elemental, preparatorio, liceo"
                 },
                 "amenity/scrapyard": {
                     "name": "Depósito de chatarra"
                     "terms": "ayuntamiento, alcaldía, municipio, municipalidad, municipal, concejo, consistorio, cabildo, gobierno local, gobierno municipal, alcalde, intendente, concejales, ediles, comuna, casa consistorial"
                 },
                 "amenity/university": {
-                    "name": "Terreno universitario",
-                    "terms": "terreno, área, suelo, universidad, campus, colegio mayor, facultad, universitario, claustro"
+                    "name": "Universidad",
+                    "terms": "universidad, campus, colegio mayor, facultad, universitario, universitaria, claustro, postgrado, pregrado, educación profesional, educación superior"
                 },
                 "amenity/vending_machine": {
                     "name": "Máquina expendedora",
                     "name": "Granero",
                     "terms": "Granero, hórreo, silo, depósito de cereal, troj"
                 },
+                "building/bungalow": {
+                    "name": "Bungalow",
+                    "terms": "bungalow, bungaló, búngalo, cabaña"
+                },
                 "building/bunker": {
                     "name": "Búnker"
                 },
                     "name": "Edificio iglesia",
                     "terms": "iglesia, templo"
                 },
+                "building/civic": {
+                    "name": "Edificio cívico",
+                    "terms": "Edificio cívico, edificio civico, cívico, civico, centro cívico, centro civico, ayuntamiento, biblioteca, piscina"
+                },
                 "building/college": {
                     "name": "Edificio instituto",
                     "terms": "edificio del instituto, edificio instituto, facultad"
                 "building/entrance": {
                     "name": "Entrada/Salida"
                 },
+                "building/farm": {
+                    "name": "Edificio agrícola",
+                    "terms": "edificio agrícola, edificio agricola, agrícola, agricola, granja"
+                },
                 "building/garage": {
                     "name": "Garaje privado",
                     "terms": "garaje,cochera"
                 },
                 "building/kindergarten": {
                     "name": "Edificio de Preescolar / Jardín de infantes ",
-                    "terms": "preescolar, parvulario, párvulos, jardín, jardín de infancia, jardín infantil, edificio"
+                    "terms": "preescolar, parvulario, párvulos, jardín, jardín de infancia, jardín infantil, edificio, kinder"
+                },
+                "building/mosque": {
+                    "name": "Edificio de la mezquita",
+                    "terms": "Edificio de la mezquita, mezquita"
                 },
                 "building/public": {
                     "name": "Edificio público",
                     "name": "Techo",
                     "terms": "tejado, techumbre, cubierta, techo"
                 },
+                "building/ruins": {
+                    "name": "Edificio en ruinas",
+                    "terms": "ruina, ruinas, restos"
+                },
                 "building/school": {
                     "name": "Edificio de escuela",
                     "terms": "Edificio colegio, edificio colegio, escuela, colegio"
                     "name": "Casa adosada o duplex",
                     "terms": "casa adosada, casa pareada, duplex"
                 },
+                "building/service": {
+                    "name": "Edificio de servicio",
+                    "terms": "edificio de servicio, servicio, maquinaria, bombas, transformadores"
+                },
                 "building/shed": {
                     "name": "Cobertizo",
                     "terms": "cobertizo, establo, tinglado, barraca"
                     "name": "Establo para caballos",
                     "terms": "cuadra, caballeriza, establo, caballo, yegua"
                 },
+                "building/stadium": {
+                    "name": "Edificio del estadio",
+                    "terms": "Edificio del estadio, estadio"
+                },
                 "building/static_caravan": {
                     "name": "Caravana estática",
                     "terms": "caravana, remolque, autocaravana, trailer, roulotte"
                 },
+                "building/temple": {
+                    "name": "Edificio del templo",
+                    "terms": "Edificio del templo, templo"
+                },
                 "building/terrace": {
                     "name": "Casas adosadas",
                     "terms": "Casas adosadas, casa pareada, viviendas en hilera, Bloques de casas"
                 "building/train_station": {
                     "name": "Estación de ferrocarril"
                 },
+                "building/transportation": {
+                    "name": "Edificio de transporte público",
+                    "terms": "Edificio de transporte público, transporte público, transporte publico, terminal"
+                },
                 "building/university": {
                     "name": "Edificio de universidad",
                     "terms": "universidad, facultad, escuela universitaria, colegio mayor"
                     "name": "Cancha de acampar",
                     "terms": "lugar, patio, cancha, terreno, camping, cámping, campamento, acampe, tienda, carpa, rv, motorhome, motor home, caravana, autocaravana, "
                 },
+                "circular": {
+                    "name": "Glorieta / Círculo de tráfico"
+                },
                 "club": {
-                    "name": "Club",
+                    "name": "Clubs",
                     "terms": "asociación, logia, social, voluntariado, servicio, religioso, político, intercambio, cultural, deportivo, caridad, radio, arte, astronomía, juegos, ajedrez, bicicleta, cine, cocina, gastronomía, fan, anime, música, pesca, linux, caza, motocicletas, nudismo, veteranos"
                 },
                 "craft": {
                 },
                 "craft/tiler": {
                     "name": "Solador",
-                    "terms": "Solador, alicatador, solar, alicatar, embaldosar, baldosas, azulejos"
+                    "terms": "solador, alicatador, solar, alicatar, embaldosar, baldosas, azulejos, albañil, azulejista"
                 },
                 "craft/tinsmith": {
                     "name": "Hojalatero",
                 },
                 "emergency/life_ring": {
                     "name": "Salvavidas",
-                    "terms": "aro salvavidas, flotador"
+                    "terms": "boya, boya salvavidas, anillo kisby, anillo kisby, boya perry"
                 },
                 "emergency/no": {
                     "name": "Acceso de emergencia no permitido"
                     "terms": "camino de herradura, senda ecuestre, camino para caballos, pista ecuestre, ruta a caballo, caballo"
                 },
                 "highway/bus_stop": {
-                    "name": "Parada de autobús",
-                    "terms": "parada, marquesina, autobús, bus, colectivo, micro, guagua"
+                    "name": "Parada / Plataforma de bus"
                 },
                 "highway/corridor": {
                     "name": "Pasillo interior",
                 },
                 "highway/traffic_signals": {
                     "name": "Semáforos",
-                    "terms": "semáforo, señal de tráfico, luces de tráfico, luces de señalización, luces de parado, señal, tráfico, tránsito, control"
+                    "terms": "semáforo, semaforo, señal de tráfico, luces de tráfico, luces de señalización, luces de parado, señal, tráfico, tránsito, control"
                 },
                 "highway/trunk": {
                     "name": "Carretera principal",
                     "name": "Plantación forestal",
                     "terms": "bosque, plantación, pinar, cultivo, plantío, sembrado, eucaliptal, explotación, árbol"
                 },
-                "landuse/garages": {
-                    "name": "Garajes particulares",
-                    "terms": "automóvil, vehículo, carro, garaje, cochera"
-                },
                 "landuse/grass": {
                     "name": "Césped",
                     "terms": "pasto, hierba, césped, grama, zacate, franjas de separación, césped de parque"
                     "name": "Terreno en campo sin edificar",
                     "terms": "terreno, campo, urbanizable, construir, construcción"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Horticultura de invernadero",
+                    "terms": "Horticultura de invernadero, flor, invernadero, horticultura, cultivar, vivero"
+                },
                 "landuse/harbour": {
                     "name": "Puerto",
                     "terms": "puerto, portuario, barco, embarcaciones"
                     "name": "Mástil",
                     "terms": "mástil, palo, poste, asta, antena, difusión, telefonía celular, mástil de comunicación, guyed, torre de teléfono móvil, mástil de radio, televisión, mástil de transmisión"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Estación de monitoreo",
+                    "terms": "Estación de monitoreo, monitoreo, clima, terremoto, sismología, aire, gps"
+                },
                 "man_made/observation": {
                     "name": "Torre de Observación",
                     "terms": "Torre de observación, torre de vigilancia"
                     "terms": "contador, contadora, contable"
                 },
                 "office/administrative": {
-                    "name": "Oficina administrativa",
-                    "terms": "oficina administrativa, oficina de administración, administrativo, gestoría, asesoría"
+                    "name": "Oficina administrativa"
                 },
                 "office/adoption_agency": {
                     "name": "Agencia de adopción",
                     "terms": "caridad, beneficencia"
                 },
                 "office/company": {
-                    "name": "Oficina de empresa",
-                    "terms": "oficina, empresa, compañía, sucursal"
+                    "name": "Oficina corporativa",
+                    "terms": "Oficina corporativa, empresa privada"
                 },
                 "office/coworking": {
                     "name": "Espacio de trabajo compartido",
                     "terms": "despacho, bufete, abogado, procurador, letrado, jurisconsulto, jurisperito, jurista, legista, oficina jurídica, bufete jurídico, despacho de abogados, oficina de abogados, estudio jurídico"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notaría",
-                    "terms": "notaría pública, notario público, asistente de notario, escribano, notariado, notarial, testamento, firma, escritura, inmueble, protocolo notario"
+                    "name": "Notaría"
                 },
                 "office/moving_company": {
                     "name": "Oficina de mudanzas",
                     "name": "Transformador de energía",
                     "terms": "Transformador, transformador de potencia, transformador eléctrico, transformador de energía"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Parada / Plataforma de transporte público",
+                    "terms": "plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Parada / Plataforma aérea",
+                    "terms": "vía aérea, teleférico, plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Parada / Plataforma de bus",
+                    "terms": "bus, autobús, autobus, plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Parada / Plataforma de ferry",
+                    "terms": "barco, muelle, ferry, buque, transbordador, plataforma, tránsito, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Parada / Plataforma de tren ligero",
+                    "terms": "tren ligero, eléctrico, plataforma, transporte público, transporte publico, ferrocarril, vía, tranvía, trole, tránsito, transporte"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Parada / Plataforma de monorraíl",
+                    "terms": "monorriel, plataforma, transporte público, transporte publico, ferrocarril, tránsito, transporte"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Parada / Plataforma de metro",
+                    "terms": "metro, plataforma, transporte público, transporte publico, ferrocarril, subte, vía, tránsito, transporte, subterráneo, subterraneo"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Parada / Plataforma de tren",
+                    "terms": "plataforma, transporte público, transporte publico, ferrocarril, vía, tren, tránsito, transporte"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Parada / Plataforma de tranvía",
+                    "terms": "eléctrico, ligero, plataforma, transporte público, transporte publico, ferrocarril, tranvía, vía, tranvia, trole, tránsito, transporte"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Parada / Plataforma de trolebús",
+                    "terms": "autobús, bus, eléctrico, plataforma, transporte público, transporte publico, tranvía,tranvia, trolebús, trolebus, tránsito, transporte"
+                },
                 "public_transport/platform": {
-                    "name": "Plataforma",
-                    "terms": "Plataforma, Andén"
+                    "name": "Parada / Plataforma de transporte público",
+                    "terms": "plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Parada / Plataforma aérea",
+                    "terms": "vía aérea, teleférico, plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Parada / Plataforma de bus",
+                    "terms": "autobús, bus, colectivo, plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Parada / Plataforma de ferry",
+                    "terms": "barco, muelle, ferry, transbordador, buque, plataforma, tránsito, transporte público, transporte publico transporte"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Parada / Plataforma de tren ligero",
+                    "terms": "tren ligero, eléctrico, plataforma, transporte público, transporte publico, ferrocarril, vía, tranvía, trole, tránsito, transporte"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Parada / Plataforma de monorraíl",
+                    "terms": "monorriel, plataforma, transporte público, transporte publico, ferrocarril, tránsito, transporte"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Parada / Plataforma de metro",
+                    "terms": "metro, plataforma, transporte público, transporte publico, ferrocarril, subte, vía, tránsito, transporte, subterráneo, subterraneo"
+                },
+                "public_transport/platform_train": {
+                    "name": "Parada / Plataforma de tren",
+                    "terms": "plataforma, transporte público, transporte publico, ferrocarril, vía, tren, tránsito, transporte"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Parada / Plataforma de tranvía",
+                    "terms": "eléctrico, ligero, plataforma, transporte público, transporte publico, ferrocarril, tranvía, vía, tranvia, tránsito, transporte"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Parada / Plataforma de trolebús",
+                    "terms": "for 'Trolleybus Stop / Platform', separated by commas> autobús, bus, eléctrico, plataforma, transporte público, transporte publico, tranvía,tranvia, trolebús, trolebus, tránsito, transporte"
+                },
+                "public_transport/station": {
+                    "name": "Parada de transporte público / Plataforma",
+                    "terms": "plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Parada aérea / Plataforma",
+                    "terms": "vía aérea, teleférico, plataforma, transporte público, transporte publico, tránsito, transporte"
+                },
+                "public_transport/station_bus": {
+                    "name": "Estación / Terminal de bus",
+                    "terms": "autobús, bus, transporte público, transporte publico, estación, estacion, terminal, tránsito, transporte"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Estación / Terminal de ferry",
+                    "terms": "barco, muelle, transbordador, ferry, buque, transporte público, transporte publico, estación, terminal, tránsito, transporte"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Estación de tren ligero",
+                    "terms": "tren ligero, eléctrico, transporte público, transporte publico, ferrocarril, vía, tranvía, trole, tránsito, transporte"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Estación de de monorraíl",
+                    "terms": "monorriel, transporte público, transporte publico, ferrocarril, tránsito, transporte"
+                },
+                "public_transport/station_subway": {
+                    "name": "Estación de metro",
+                    "terms": "metro, transporte público, transporte publico, ferrocarril, subte, vía, tránsito, transporte, subterráneo, subterraneo"
+                },
+                "public_transport/station_train": {
+                    "name": "Estación de tren",
+                    "terms": "transporte público, transporte publico, ferrocarril, vía, tren, tránsito, transporte"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Estación de tren (Alto / A pedido)",
+                    "terms": "alto, a pedido, transporte público, transporte publico, ferrocarril, estación, vía, tren, tránsito, transporte, parada a silbato, silbato"
+                },
+                "public_transport/station_tram": {
+                    "name": "Estación de tranvía",
+                    "terms": "eléctrico, ligero, transporte público, transporte publico, ferrocarril, tranvía, vía, tranvia,  tránsito, transporte"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Estación / Terminal de trolebús",
+                    "terms": "transporte público, estación, terminal, parada, transporte, autobús, bus, trolebús"
+                },
+                "public_transport/stop_area": {
+                    "name": "Área de parada de transporte",
+                    "terms": "transporte público, parada, punto de detención"
                 },
                 "public_transport/stop_position": {
-                    "name": "Punto de detención",
-                    "terms": "punto de detención, stop, parada, posición de parada"
+                    "name": "Ubicación de parada de transporte",
+                    "terms": "punto detención, transporte público, tránsito, transporte, aéreo, autobús, ferry, tren ligero, tranvía, tren, monorraíl, metro, trolebús"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Ubicación de parada aérea",
+                    "terms": "punto detención, transporte público, tránsito, transporte, teleférico, telecabina, góndola, transportador"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Ubicación de parada de autobús",
+                    "terms": "punto detención, transporte público, tránsito, transporte, autobús, bus, minibús"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Ubicación de parada de ferry",
+                    "terms": "punto detención, transporte público, tránsito, transporte, naval, marítimo, bote, barco, ferry, buque, lancha, muelle, dársena"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Ubicación de parada de tren ligero",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril, tren ligero"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Ubicación de parada monorraíl",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril, monorraíl, monocarril"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Ubicación de parada del metro",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril, metro, subterráneo"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Ubicación de parada del tren",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Ubicación de parada del tranvía",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril, tranvía"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Ubicación de parada del trolebús",
+                    "terms": "punto detención, transporte público, tránsito, transporte, tren, ferrocarril, bus, autobús, trolebús"
                 },
                 "railway": {
                     "name": "Ferrocarril"
                     "terms": "Funicular"
                 },
                 "railway/halt": {
-                    "name": "Apeadero de ferrocarril",
-                    "terms": "alto, apeadero, detención, interrupción"
+                    "name": "Estación / Aparadero de tren (parada / a pedido)"
                 },
                 "railway/level_crossing": {
                     "name": "Cruce de ferrocarril (carretera)",
                     "name": "Hito kilométrico ferroviario",
                     "terms": "hito, señal, marcador, kilométrico, mojón, vía, via, férrea, ferroviaria, ferroviario, ferrocarril, tren"
                 },
+                "railway/miniature": {
+                    "name": "Vía ferrea en miniatura",
+                    "terms": "ferrocarril, tren miniatura, tren en miniatura, tren de ancho estrecho, tren de ancho mínimo, trocha angosta, trocha mínima"
+                },
                 "railway/monorail": {
                     "name": "Monorraíl",
                     "terms": "monorraíl, monorriel, monocarril"
                     "terms": "Ferrocarril de vía estrecha, vía angosta, gálibo estrecho"
                 },
                 "railway/platform": {
-                    "name": "Andén de ferrocarril",
-                    "terms": "Andén de ferrocarril, plataforma ferroviaria"
+                    "name": "Parada / Plataforma de tren"
                 },
                 "railway/rail": {
                     "name": "Vía de ferrocarril",
                     "terms": "señal, señalización, luces, vía, via, férrea, ferroviaria, ferroviario, ferrocarril, tren"
                 },
                 "railway/station": {
-                    "name": "Estación de ferrocarril",
-                    "terms": "Estación de Ferrocarril, estaciones de ferrocarril, estación de tren"
+                    "name": "Estación de tren"
                 },
                 "railway/subway": {
                     "name": "Metro",
-                    "terms": "metro, subte"
+                    "terms": "metro, subte, subterráneo, subterraneo, transporte publico, transporte público"
                 },
                 "railway/subway_entrance": {
-                    "name": "Boca de metro",
-                    "terms": "entrada de metro, entrada de subte,  entrada, ingreso, acceso"
+                    "name": "Entrada del metro",
+                    "terms": "boca, entrada de metro, entrada de subte,  entrada, ingreso, acceso, subte, subterráneo, subterraneo"
                 },
                 "railway/switch": {
                     "name": "Desvío ferroviario",
                 },
                 "railway/tram": {
                     "name": "Tranvía",
-                    "terms": "Tranvía"
+                    "terms": "tren ligero, tranvía, tranvia"
                 },
                 "railway/tram_stop": {
-                    "name": "Parada de tranvía",
-                    "terms": "parada, estación, tranvía, tren ligero, metro ligero, tren tram"
+                    "name": "Parada de tranvía"
                 },
                 "relation": {
                     "name": "Relación",
                 },
                 "route/ferry": {
                     "name": "Ruta de ferry",
-                    "terms": "ruta, ferry, transbordador, lancha, embarcación, trasbordador"
+                    "terms": "ruta, ferry, buque, transbordador, lancha, embarcación, trasbordador"
                 },
                 "shop": {
                     "name": "Tienda",
                 },
                 "shop/kiosk": {
                     "name": "Quiosco",
-                    "terms": "kiosco, periódico, diario, semanario, revista, cigarrillo, snack, bocadillo, dulce, pastilla, bebida, jugo"
+                    "terms": "kiosko, puesto, negocio, periódico, revista, encendedor, mapas, cigarrillo, dulces, golosinas, refrescos, jugos, flores"
                 },
                 "shop/kitchen": {
                     "name": "Tienda de diseño de cocinas",
                 },
                 "type/route/ferry": {
                     "name": "Ruta de ferry",
-                    "terms": "ruta, itinerario, rumbo, dirección, trayecto, ferry, transbordador"
+                    "terms": "ruta, itinerario, rumbo, dirección, trayecto, ferry, transbordador, buque"
                 },
                 "type/route/foot": {
                     "name": "Ruta a pie",
                     "name": "Ruta a caballo",
                     "terms": "caballo, ruta, ecuestre, equitación, cabalgar, cabalgata"
                 },
+                "type/route/light_rail": {
+                    "name": "Ruta de tren ligero",
+                    "terms": "lrt, tren, tranvía, tren urbano, tranvía urbano, tren eléctrico, tren rápido, tren ligero, tren tranvía, metro ligero"
+                },
                 "type/route/pipeline": {
                     "name": "Ruta de tubería",
                     "terms": "ruta, tubería, gasoducto, oleoducto, conducto, cañería, ducto"
                 },
+                "type/route/piste": {
+                    "name": "Ruta de pista / esquí",
+                    "terms": "pista, ruta, esquí, esqui, ski, esquiar"
+                },
                 "type/route/power": {
                     "name": "Ruta de red elécrica",
                     "terms": "línea de alta tensión, cable, electricidad, energía, red elećtrica, línea electrica"
                     "name": "Ruta de carretera",
                     "terms": "carretera, camino, ruta, vía, calle, calzada, firme"
                 },
+                "type/route/subway": {
+                    "name": "Ruta de metro",
+                    "terms": "ruta, línea, linea, recorrido, metro, subte, subterráneo, subterraneo"
+                },
                 "type/route/train": {
                     "name": "Ruta del tren",
                     "terms": "ruta de tren, línea de tren, tren, ferrocarril, vía"
                 },
                 "type/route/tram": {
                     "name": "Ruta del tranvía",
-                    "terms": "ruta de tranvía, línea de tranvía, tranvía"
+                    "terms": "ruta de tranvía, línea de tranvía, tranvía, tranvia"
                 },
                 "type/route_master": {
                     "name": "Ruta maestra",
                     "terms": "catarata, caída de agua, salto de agua, torrente"
                 },
                 "waterway/weir": {
-                    "name": "Vertedero",
-                    "terms": "vertedero, vertedero hidráulico, aliviadero"
+                    "name": "Dique / Aliviadero",
+                    "terms": "vertedero, desagüe, hidráulico, vertedero hidráulico, aliviadero hidráulico, dique, pequeña represa"
                 }
             }
         },
                 "attribution": {
                     "text": "Términos y comentarios"
                 },
-                "description": "Imagen de satélite DigitalGlobe Standard.",
+                "description": "Imágenes de satélite DigitalGlobe Standard.",
                 "name": "Imágenes DigitalGlobe Standard"
             },
             "DigitalGlobe-Standard-vintage": {
                 "attribution": {
                     "text": "© contribuidores OpenStreetMap, CC-BY-SA"
                 },
-                "description": "La capa predeterminada de OpenStreetMap",
+                "description": "Capa predeterminada de OpenStreetMap",
                 "name": "OpenStreetMap (Estándar)"
             },
             "Mapbox": {
                 "name": "Carreteras TIGER 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos del mapa contribuidores OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Ciclismo"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos del mapa contribuidores OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Senderismo"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos del mapa contribuidores OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: BTT"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos del mapa contribuidores OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Patinaje"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos del mapa contribuidores OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Deportes de invierno"
             },
             "basemap.at": {
index e82eaaa72fb6875467eb438129c40e1f650b03ef..138909328810ee36b1023e8ad062b319601520c5 100644 (file)
         "background": {
             "title": "Taust",
             "description": "Tausta seaded",
-            "percent_brightness": "heledus {opacity}%",
             "none": "Puudub",
             "custom": "Kohandatud",
             "custom_button": "Muuda kohandatud tausta",
-            "fix_misalignment": "Korrigeeri kattekaardi nihet",
             "reset": "lähtesta",
-            "offset": "Lohista alumist halli kasti, et sättida kattekaardi nihet või siseta nihe meetrites.",
             "minimap": {
-                "description": "Pisikaart",
                 "tooltip": "Näita väljasuumitud kaarti, et aidata tuvastada kuvatud ala."
-            }
+            },
+            "fix_misalignment": "Korrigeeri kattekaardi nihet",
+            "offset": "Lohista alumist halli kasti, et sättida kattekaardi nihet või siseta nihe meetrites."
         },
         "map_data": {
             "title": "Kaardi andmed",
             "untagged_line": "Sildistamata joon",
             "untagged_area": "Sildistamata ala",
             "untagged_relation": "Sildistamata relatsioon",
-            "many_deletions": "Oled kustutamas {n} objekti. Kas oled sa kindel, et soovid seda teha? See kustutab need kaardilt, mida kõik näevad aadressil openstreetmap.org.",
             "tag_suggests_area": "Silt {tag} viitab, et joon peaks olema ala, kuid see pole ala.",
             "deprecated_tags": "Iganenud sildid: {tags}"
         },
             "view_on_mapillary": "Vaata seda fotot Mapillary's"
         },
         "help": {
-            "title": "Abi",
-            "imagery": "# Aerofoto\n\nAerofotod on kaardistamisel oluliseks algallikaks. Valik aerofotosid on kättesaadavad paremal asuva redaktori taustaseadete menüü kaudu, vaikimisi on taustaks [Bing Maps](http://www.bing.com/maps/) satelliitfoto.\n\nEesti puhul on reeglina kõige täpsemaks ning ajakohasemaks aerofotoks Maa-ameti ortokaart. Selleks, et avada OSM ID-redaktor vaikimisi Maa-ameti ortofoto taustaga, kasuta veebibrauseris aadressi http://www.openstreetmap.org/edit#background=custom:http://kaart.maakaart.ee/orto/{z}/{x}/{y}.jpeg&map=@zoom/@lon/@lat, milles @zoom/@lon/@lat asenda reaalsete väärtustega (näit. 15/59.3438/24.5892).\n\nMõnikord on aerofoto kaardiandmete suhtes nihkes. Kui märkad, et massiliselt objekte on nihkes siis ära asu kohe nende asukohti muutma vaid võrdle erinevaid aerofotosid ja vajadusel kohanda vastavalt aerofoto asendit taustaseadete menüü valiku 'Korrigeeri nihet' abil.\n"
+            "title": "Abi"
         },
         "intro": {
             "graph": {
                 "capacity": {
                     "label": "Mahtutavus"
                 },
-                "cardinal_direction": {
-                    "label": "Suund"
-                },
                 "castle_type": {
                     "label": "Tüüp"
                 },
-                "clock_direction": {
-                    "label": "Suund",
-                    "options": {
-                        "anticlockwise": "Vastupäeva",
-                        "clockwise": "Päripäeva"
-                    }
-                },
                 "club": {
                     "label": "Tüüp"
                 },
                 "operator": {
                     "label": "Operaator"
                 },
-                "parallel_direction": {
-                    "label": "Suund",
-                    "options": {
-                        "backward": "Taha",
-                        "forward": "Ette"
-                    }
-                },
                 "park_ride": {
                     "label": "Pargi ja Reisi"
                 },
                 "recycling_accepts": {
                     "label": "Võtab vastu"
                 },
-                "recycling_type": {
-                    "label": "Ümbertöötluse tüüp",
-                    "options": {
-                        "centre": "Ümbertöötluskeskus",
-                        "container": "Konteiner"
-                    }
-                },
                 "relation": {
                     "label": "Tüüp"
                 },
                     "name": "Valuutavahetus",
                     "terms": "rahavahetus"
                 },
-                "amenity/bus_station": {
-                    "name": "Bussijaam"
-                },
                 "amenity/cafe": {
                     "name": "Kohvik"
                 },
                 "amenity/fast_food": {
                     "name": "Kiirtoitlustus"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Praamiterminal",
-                    "terms": "Praamisadam, sadam"
-                },
                 "amenity/fire_station": {
                     "name": "Tuletõrjedepoo",
                     "terms": "tuletõrjujad"
                     "name": "Looduskeskus",
                     "terms": "külastuskeskus"
                 },
-                "amenity/recycling": {
-                    "name": "Taaskasutus",
-                    "terms": "Taara,taaraautomaat,jäätmed,prügi,pudelid,klaas,purgid,praht,konteiner"
-                },
                 "amenity/recycling_centre": {
                     "name": "Jäätmejaam",
                     "terms": "Taaskasutuskeskus"
                 "highway/bridleway": {
                     "name": "Ratsutamisrada"
                 },
-                "highway/bus_stop": {
-                    "name": "Bussipeatus"
-                },
                 "highway/corridor": {
                     "name": "Sisekoridor",
                     "terms": "koridor"
                 "landuse/forest": {
                     "name": "Metsamaa"
                 },
-                "landuse/garages": {
-                    "name": "Garaažid",
-                    "terms": "Garaazid"
-                },
                 "landuse/grass": {
                     "name": "Muru"
                 },
                     "name": "Trafo",
                     "terms": "Transformaator"
                 },
-                "public_transport/platform": {
-                    "name": "Platvorm"
-                },
-                "public_transport/stop_position": {
-                    "name": "Peatuskoht"
-                },
                 "railway": {
                     "name": "Raudtee"
                 },
                 "railway/funicular": {
                     "name": "Köisraudtee"
                 },
-                "railway/halt": {
-                    "name": "Peatuskoht",
-                    "terms": "pooljaam"
-                },
                 "railway/level_crossing": {
                     "name": "Raudtee-ülesõidukoht",
                     "terms": "ülesõit,ristumine,rongi"
                 "railway/narrow_gauge": {
                     "name": "Kitsarööpaline raudtee"
                 },
-                "railway/platform": {
-                    "name": "Raudteeplatvorm",
-                    "terms": "platvorm,perroon,raudteeperroon"
-                },
                 "railway/rail": {
                     "name": "Raudtee",
                     "terms": "rongitee"
                 },
-                "railway/station": {
-                    "name": "Raudteejaam",
-                    "terms": "jaam,rongijaam"
-                },
                 "railway/subway": {
                     "name": "Metroo"
                 },
                 "railway/tram": {
                     "name": "Tramm"
                 },
-                "railway/tram_stop": {
-                    "name": "Trammipeatus"
-                },
                 "relation": {
                     "name": "Seos",
                     "terms": "relatsioon"
                     "name": "Ehtepood",
                     "terms": "ehted,kalliskivid"
                 },
-                "shop/kiosk": {
-                    "name": "Kiosk",
-                    "terms": "putka,ajalehekiosk"
-                },
                 "shop/kitchen": {
                     "name": "Köögimööblikauplus",
                     "terms": "köögimööblistuudio,köögistuudio"
index f5b2955f376503243d1709c71db9ea8dba9ea956..c538a7b84c46fd983f272df119f06155426cd090 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "برای افزودن گره های بیشتر به خط کلیک کنید. برای اتصال به سایر خطوط روی آنها کلیک کنید، و برای پایان دادن به خط دو بار کلیک کنید."
+            },
+            "drag_node": {
+                "connected_to_hidden": "این عنصر به دلیل متصل بودن به یک عنصر مخفی قابل تغییر نیست. "
             }
         },
         "operations": {
                     "relation": "رابطه حذف شد.",
                     "multiple": "{n} عنصر از نقشه حذف شد."
                 },
+                "too_large": {
+                    "single": "امکان حذف این عناصر وجود ندارد زیرا در حال حاضر مقدار کاقی از آن‌ها وجود ندارد.",
+                    "multiple": "امکان حذف این عناصر به دلیل متعلق بودن به یک رابطه بزرگتر وجود ندارد. لطفا ابتدا آن‌ها را از رابطه حذف کنید"
+                },
                 "incomplete_relation": {
                     "single": "این عنصر قابل حذف نیست زیرا کاملا دانلود نشده.",
                     "multiple": "این عناصر قابل حذف نیستند چون به صورت کامل دانلود نشده‌اند."
                 "key": "C",
                 "annotation": "{n} عنصر ادغام شده.",
                 "not_eligible": "این عناصر قابل ترکیب نیستند.",
+                "not_adjacent": "امکان ادغام این وبژگی‌ها وجود ندارد زیرا کانکشن آنها قطع است.",
                 "restriction": "امکان ادغام این عناصر وجود ندارد زیرا حداقل یکی از آن‌ها جزو رابطه \"{relation}\" می‌باشد.",
                 "incomplete_relation": "امکان ادغام این عناصر وجود ندارد زیرا حداقل یکی از آن‌ها کامل دانلود نشده است.",
                 "conflicting_tags": "امکان ادغام این عناصر وجود ندارد زیرا بعضی از آن‌ها دارای برچسب‌هایی با مقادیر مخالف یکدیگر هستند."
                 }
             },
             "reflect": {
+                "title": {
+                    "long": "بازتاب طولانی",
+                    "short": " بازتاب کوتاه"
+                },
                 "description": {
                     "long": {
                         "single": "بازتاب این عنصر حول قطر بزرگش.",
             "created": "ساخته شد",
             "about_changeset_comments": "درباره توضیحات تغییرات",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "شما در توضیحات خود از گوگل نام بردید. لطفا توجه داشته باشید که کپی کردن از نقشه‌های گوگل، ممنوع است.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "شما در توضیحات خود از گوگل نام بردید. لطفا توجه داشته باشید که کپی کردن از نقشه‌های گوگل، ممنوع است."
         },
         "contributors": {
             "list": "ویرایش توسط {users}",
             "truncated_list": "ویرایش توسط  {users} و {count}  نفر دیگر"
         },
         "info_panels": {
+            "key": "I",
             "background": {
+                "key": "B",
                 "title": "پس زمینه",
                 "zoom": "بزرگنمایی",
+                "vintage": "حالت تاریک",
+                "source": "سورس",
                 "description": "توضیح",
                 "resolution": "وضوح",
                 "accuracy": "دقت",
-                "unknown": "نامعلوم"
+                "unknown": "نامعلوم",
+                "show_tiles": "نمایش قسمتها",
+                "hide_tiles": "پنهان کردن قسمتها"
             },
             "history": {
+                "key": "H",
                 "title": "تاریخچه",
+                "version": "ورژن",
                 "last_edit": "آخرین ویرایش",
+                "edited_by": "ویرایش شده توسط:",
                 "unknown": "نامعلوم",
                 "link_text": "سابقه در openstreetmap.org"
             },
             "location": {
-                "title": "مکان"
+                "key": "L",
+                "title": "مکان",
+                "unknown_location": "مکان ناشناخته"
             },
             "measurement": {
+                "key": "M",
                 "title": "اندازه",
+                "geometry": "هندسه",
+                "center": "مرکز",
+                "perimeter": "محیط",
                 "length": "درازا",
                 "area": "ناحیه",
-                "location": "مکان"
+                "centroid": "مرکز",
+                "location": "مکان",
+                "metric": "متریک",
+                "imperial": "امپراتوری",
+                "node_count": "تعداد گره ­ها"
             }
         },
         "geometry": {
             "edit": "ویرایش عنصر",
             "check": {
                 "yes": "بله",
-                "no": "خیر"
+                "no": "خیر",
+                "reverser": "تغییر مسیر"
             },
             "radio": {
                 "structure": {
+                    "type": "نوع",
                     "default": "پیش‌فرض",
                     "layer": "لایه"
                 }
         "background": {
             "title": "پس زمینه",
             "description": "تنظیمات پس زمینه",
-            "percent_brightness": "{opacity}% روشنایی",
+            "key": "B",
+            "backgrounds": "پس زمینه",
             "none": "هیچ",
             "best_imagery": "بهترین منبع تصویری شناخته شده برای این مکان",
             "switch": "بازگشت به این پس‌زمینه",
             "custom": "سفارشی",
             "custom_button": "ویرایش پشت زمینه سفارشی",
-            "fix_misalignment": "تنظیم فاصله تصویری",
-            "imagery_source_faq": "منبع این تصویر کجاست؟",
+            "overlays": "پوشش ها",
+            "imagery_source_faq": "اطلاعات تصویر / گزارش یک مشکل",
             "reset": "باز نشاندن",
-            "offset": "برای تنظیم افست تصاویر، محدوده خاکستری زیر را بکشید یا مقادیر را به متر در کادر زیر وارد کنید.",
+            "brightness": "روشنایی",
             "minimap": {
-                "description": "نقشه کوچک",
-                "tooltip": "برای پیدا کردن محل منطقه نشان داده شده، یک نقشه کوچک نمایی نشان بده"
-            }
+                "tooltip": "برای پیدا کردن محل منطقه نشان داده شده، یک نقشه کوچک نمایی نشان بده",
+                "key": "/"
+            },
+            "fix_misalignment": "تنظیم فاصله تصویری",
+            "offset": "برای تنظیم افست تصاویر، محدوده خاکستری زیر را بکشید یا مقادیر را به متر در کادر زیر وارد کنید."
         },
         "map_data": {
             "title": "نقشه داده",
             "description": "نقشه داده",
+            "key": "F",
             "data_layers": "لایها داده ها",
             "fill_area": "محدوده‌ها را پر کنید",
             "map_features": "عناصر نقشه",
         "area_fill": {
             "wireframe": {
                 "description": "بدون پر کردن (قاب سیمی)",
-                "tooltip": "فعال کردن قاب سیمی، مشاهده تصاویر پس‌زمینه را آسان می‌کند."
+                "tooltip": "فعال کردن قاب سیمی، مشاهده تصاویر پس‌زمینه را آسان می‌کند.",
+                "key": "W"
             },
             "partial": {
                 "description": "پر کردن جزئی",
         "restore": {
             "heading": "شما تغییرات ذخیره نشده دارید",
             "description": "آیا مایلید تغییرات ذخیره نشده جلسه قبل را بازیابی کنید؟",
-            "restore": " بازگردانی تغییرات من"
+            "restore": " بازگردانی تغییرات من",
+            "reset": "لغو تغییرات من"
         },
         "save": {
             "title": "ذخیره",
             "help_link_url": "https://wiki.openstreetmap.org/wiki/Fa:FAQ#.D9.85.D9.86_.D8.AA.D8.BA.DB.8C.DB.8C.D8.B1.D8.A7.D8.AA.DB.8C_.D8.AF.D8.B1_.D9.86.D9.82.D8.B4.D9.87_.D8.A7.DB.8C.D8.AC.D8.A7.D8.AF_.DA.A9.D8.B1.D8.AF.D9.85.D8.8C_.DA.86.D8.B7.D9.88.D8.B1_.D9.85.DB.8C_.D8.AA.D9.88.D8.A7.D9.86.D9.85_.D9.88.DB.8C.D8.B1.D8.A7.DB.8C.D8.B4_.D9.87.D8.A7.DB.8C_.D8.AE.D9.88.D8.AF_.D8.B1.D8.A7_.D8.A8.D8.A8.DB.8C.D9.86.D9.85.D8.9F"
         },
         "confirm": {
+            "okay": "ok",
             "cancel": "لغو"
         },
         "splash": {
             "untagged_line_tooltip": "یک نوع عنصر را برای توصیف موجودیت این خط انتخاب کنید.",
             "untagged_area": "فضای برچسب گذاری نشده",
             "untagged_area_tooltip": "یک نوع عنصر را برای توصیف موجودیت این محدوده انتخاب کنید.",
-            "many_deletions": "شما در حال حذف {n} شئ هستید. مطمئنید میخواهید این کار را انجام دهید؟ این کار آنها را از نقشه ای که دیگران در openstreetmap.org میبینند حذف می کند.",
             "tag_suggests_area": "برچسب  {tag} پیشنهاد میکند خط باید یک فضا باشد، اما این یک فضا نیست",
             "deprecated_tags": "برچسب های توصیه شده: {tags}"
         },
         },
         "cannot_zoom": "در حالت فعلی بیش از این نمیتوان کوچک نمایی کرد.",
         "full_screen": "تعویض صفحه‌نمایش کامل",
+        "gpx": {
+            "browse": "جستجو برای فایل"
+        },
         "mapillary_images": {
             "tooltip": "عکس‌های خیابانی از Mapillary",
             "title": "لایه پوشش عکس (Mapillary)"
         },
         "help": {
             "title": "راهنمایی",
-            "help": "#راهنمایی\n\nاین یک ویرایشگر برای  [OpenStreetMap](http://www.openstreetmap.org/) است،\nنقشه ای رایگان و قابل ویرایش از جهان. شما میتوانید از آن برای افزودن و بروزرسانی\nداده ها در ناحیه‌تان استفاده کنید، ساختن نقشه ی منبع‌باز و داده‌باز از جهان\nبرای همه بهتر است.\n\nویرایش هایی که شما در این نقشه می سازید برای هر کسی که از OpenStreetMap استفاده میکند قابل استفاده است. برای ایجاد یک ویرایش، شما نیاز دارید که یک\n[حساب رایگان OpenStreetMap](https://www.openstreetmap.org/user/new) داشته باشید.\n\n[ویرایشگر ID](http://ideditor.com/) یک پروژه مشترک است که [منبع کد در GitHub\nموجود است](https://github.com/systemed/iD).\n",
-            "gps": "# جی‌پی‌اس\n\nردیابی‌های جی‌پی‌اس جمع‌آوری شده یکی از منابع ارزشمند برای اوپن‌استریت‌مپ هستند.\nاین ویرایشگر از ردیابی‌های محلی (پرونده‌های `.gpx`) پشتیبانی می‌کند.\nشما می‌توانید این نوع ردیابی‌ها را با بعضی از نرم‌افزارهای تلفن‌های هوشمند یا سخت‌افزارهای GPS ضبط کنید.\n\nبرای اطلاعات بیشتر در این موارد و چگونگی اجرای این کار میتوانید آموزش [نقشه‌کشی با گوشی هوشمند، دستگاه GPS و یا نقشه کاغذی](http://learnosm.org/fa/mobile-mapping/) را بخوانید.\n\nبرای استفاده از یک ردیابی GPX، فایل را به داخل ویرایشگر بکشید.\nاگر فایل GPX شناسایی بشود، مسیرهای آن به شکل خطوط بنفشی روشن در نقشه نشان داده می‌شوند. در منوی سمت راست صفحه بر روی گذینه‌ی 'Map Data' کلیک کنید تا تنظیمات این لایه GPX را مشاهده کنید.\n\nردیابی‌های جی‌پی‌اکس مستقیما به او‌اس‌ام بارگذاری نمیشوند. بهترین راه برای تبدیل آن‌ها، استفاد از آن‌ها به عنوان راهنمایی برای ایجاد مسیر دستی است. همچنین میتوانید صفحه [بارگزاری به او‌اس‌ام](http://www.openstreetmap.org/trace/create) را مطالعه کنید.\n",
-            "imagery": "# تصاویر هوایی\n\nتصاویر هوایی یک منبع مهمبرای نقشه‌کشی هستند. یک مجموعه از تصاویر و نقشه‌های هوایی و ماهواره‌ای رایگان در منوی سمت راست و بخش the 'Background Settings'  وجود دارند.\n\nبه طور پیشفرض تصاویر ماهواره‌ای  [نقشه بینگ](http://www.bing.com/maps/) در پس‌زمینه قرار دارند، اما به محض زوم کردن و جابجایی در نقشه منابع دیگر نیز در دسترس خواهند بود. بعضی کشورها مانند ایالات متحده، فرانسه و دانمارک در بعضی ناحیه‌ها دارای تصاویر بسیار باکیفیت هوایی هستند.\n\nتصاویر گاهی اوقات  به علت خطا در سرور ارائه دهنده با موقعیت واقعی اختلاف دارند. اگر شما مسیر‌های بسیاری می‌بینید که با تصویر پس‌زمینه فاصله دارند، به هیچ عنوان بدون تحقیق آنها را با توجه به پس‌زمینه انتقال ندهید! به جای این کار می‌توانید پس از مطلع شدن از اختلاف تصاویر، آن‌ها را با کلیک بر روی دکمه‌ی 'Fix alignment' تنظیم کنید.\n",
-            "addresses": "# آدرس ها\n\nآدرس ها مقداری از اطلاعات بسیار سودمند برای نقشه هستند.\n\nاگرچه آدرس ها اغلب بعنوان بخش هایی از جاده نمایان میشوند، در OpenStreetMap\nآنها بعنوان ویژگی هایی از ساختمان ها و مکان ها در امتداد خیابان ها ثبت میشوند.\n\nشما میتوانید اطلاعات آدرس را به مکان های نقشه شده بعنوان خطوط اضافه ساخته شده و\nهمچنین آنهایی که بعنوان یک نقطه نقشه شده اند اضافه کنید. منبع مناسب برای داده های آدرس\nبررسی بر روی زمین و دانش شخصی است -مثل هر ویژگی دیگری،\nکپی برداری از منابع تجاری مثل نقشه های گوگل به شدت\nممنوع است.\n",
-            "inspector": "# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n"
+            "key": "H",
+            "help": {
+                "title": "کمک",
+                "before_start_h": "قبل از شروع",
+                "open_source_h": "سورس باز"
+            },
+            "overview": {
+                "navigation_h": "مسیریابی",
+                "features_h": "ویژگی\9d‌های نقشه"
+            },
+            "editing": {
+                "select_h": "انتخاب",
+                "multiselect_h": "انتخاب چندتایی",
+                "save_h": "ذخیره کن",
+                "upload_h": "آپلود",
+                "backups_h": "بکآپ اتوماتیک",
+                "keyboard_h": "کلید میانبر"
+            },
+            "points": {
+                "title": "نقاط",
+                "add_point_h": "اضافه کردن نقاط",
+                "move_point_h": "جابجایی نقاط",
+                "delete_point_h": "حذف نقاط"
+            },
+            "lines": {
+                "title": "خطوط",
+                "add_line_h": "اصافه کردن خطوط",
+                "move_line_h": "جابجایی خطوط",
+                "delete_line_h": "پاک کردن خطوط"
+            },
+            "areas": {
+                "point_or_area_h": "نقاط یا نواحی ؟",
+                "add_area_h": "افزودن نواحی",
+                "square_area_h": "گوشه "
+            },
+            "relations": {
+                "edit_relation_h": "ویرایش روابط",
+                "multipolygon_h": "چند ضلعی"
+            }
         },
         "intro": {
             "done": "انجام شده",
+            "ok": "OK",
             "graph": {
                 "block_number": "<value for addr:block_number>",
                 "city": "سه رودخانه",
                 "state": "<value for addr:state>",
                 "subdistrict": "<value for addr:subdistrict>",
                 "suburb": "<value for addr:suburb>",
-                "countrycode": "ir"
+                "countrycode": "ir",
+                "name": {
+                    "east-street": "خیابان شرقی",
+                    "main-street": "خیابان اصلی",
+                    "south-street": "خیابان جنوبی",
+                    "washington-street": "خیابان واشینگتون",
+                    "water-street": "خیابان سازمان آب",
+                    "west-street": "خیابان غربی",
+                    "world-fare": "کرایه جهانی"
+                }
+            },
+            "welcome": {
+                "title": "خوش آمدید"
             },
             "navigation": {
                 "title": "ناوبری"
             "lines": {
                 "title": "خطوط"
             },
+            "buildings": {
+                "title": "ساختمانها"
+            },
             "startediting": {
                 "title": "شروع ویرایش",
                 "save": "فراموش نکنید که به طور منظم تغییرات را ذخیره کنید!",
                 "start": "نقشه‌کشی را شروع کنید!"
             }
         },
+        "shortcuts": {
+            "title": "کلیدهای میانبر",
+            "tooltip": "نمایش کلیدهای میانبر",
+            "toggle": {
+                "key": "?"
+            },
+            "key": {
+                "alt": "Alt",
+                "backspace": "Backspace",
+                "cmd": "Cmd",
+                "ctrl": "Ctrl",
+                "delete": "Delete",
+                "del": "Del",
+                "end": "End",
+                "enter": "Enter",
+                "esc": "Esc",
+                "home": "Home",
+                "pause": "Pause",
+                "pgdn": "PgDn",
+                "pgup": "PgUp",
+                "return": "Return",
+                "shift": "Shift",
+                "space": "Space"
+            },
+            "gesture": {
+                "drag": "بکش"
+            },
+            "or": "-یا-",
+            "browsing": {
+                "navigation": {
+                    "title": "مسیریابی"
+                },
+                "help": {
+                    "title": "کمک"
+                }
+            },
+            "editing": {
+                "title": "ویرایش",
+                "drawing": {
+                    "title": "نقشه برداری",
+                    "place_point": "ایجاد نقطه"
+                },
+                "operations": {
+                    "title": "عملیات",
+                    "move": "انتقال انتخاب شده ها",
+                    "delete": "حذف انتخاب شده ها"
+                },
+                "commands": {
+                    "title": "دستورات",
+                    "save": "ذخیره تغییرات"
+                }
+            },
+            "tools": {
+                "title": "ابزارها",
+                "info": {
+                    "title": "اطلاعات"
+                }
+            }
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                         "hamlet": "دهکده",
                         "housename": "نام خانه",
                         "housenumber": "123",
+                        "housenumber!jp": "شماره/بلوک ساختمان",
                         "neighbourhood": "محله",
+                        "neighbourhood!jp": "Chōme/Aza/Koaza",
                         "place": "مکان",
                         "postcode": "کدپستی",
                         "province": "استان",
                         "province!jp": "ساختمان ریاست جمهوری",
                         "quarter": "ربع",
+                        "quarter!jp": "Ōaza/Machi",
                         "state": "ایالت",
                         "street": "خيابان",
                         "subdistrict": "زیر منطقه",
-                        "suburb": "حومه شهر"
+                        "subdistrict!vn": "Ward/Commune/Townlet",
+                        "suburb": "حومه شهر",
+                        "suburb!jp": "نگهبانی",
+                        "unit": "واحد"
                     }
                 },
                 "admin_level": {
                 "aeroway": {
                     "label": "نوع"
                 },
+                "agrarian": {
+                    "label": "محصولات"
+                },
                 "amenity": {
                     "label": "نوع"
                 },
+                "animal_boarding": {
+                    "label": "برای حیوانات"
+                },
+                "animal_breeding": {
+                    "label": "برای حیوانات"
+                },
                 "animal_shelter": {
                     "label": "پناهگاه حیوانات"
                 },
                 "board_type": {
                     "label": "نوع"
                 },
+                "boules": {
+                    "label": "نوع"
+                },
                 "boundary": {
                     "label": "نوع"
                 },
                 "brand": {
                     "label": "نام تجاری"
                 },
+                "brewery": {
+                    "label": "محل آماده سازی آبجو"
+                },
+                "bridge": {
+                    "label": "نوع",
+                    "placeholder": "پیش فرض"
+                },
                 "building": {
                     "label": "ساختمان"
                 },
                 "bunker_type": {
                     "label": "نوع"
                 },
+                "cables": {
+                    "label": "کابل ها",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "جهت (درجه راستگرد)",
                     "placeholder": "۴۵، ۹۰، ۱۸۰، ۲۷۰"
                     "label": "ظرفيت",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "جهت",
-                    "options": {
-                        "E": "شرق",
-                        "ENE": "شرق-شمال‌شرق",
-                        "ESE": "شرق-جنوب‌شرق",
-                        "N": "شمال",
-                        "NE": "شمال‌شرق",
-                        "NNE": "شمال-شمال‌شرق",
-                        "NNW": "شمال-شمال‌غرب",
-                        "NW": "شمال‌غرب",
-                        "S": "جنوب",
-                        "SE": "جنوب‌شرق",
-                        "SSE": "جنوب-جنوب‌شرق",
-                        "SSW": "جنوب-جنوب‌غربی",
-                        "SW": "جنوب‌غربی",
-                        "W": "غرب",
-                        "WNW": "غرب-شمال‌غرب",
-                        "WSW": "غرب-جنوب‌غربی"
-                    }
-                },
                 "castle_type": {
                     "label": "نوع"
                 },
-                "clock_direction": {
-                    "label": "جهت",
-                    "options": {
-                        "anticlockwise": "پاد ساعتگرد",
-                        "clockwise": "ساعتگرد"
-                    }
+                "clothes": {
+                    "label": "لباس ها"
+                },
+                "club": {
+                    "label": "نوع"
                 },
                 "collection_times": {
                     "label": "مجموع دفعات"
                 },
+                "comment": {
+                    "label": "توضیح تغییرات",
+                    "placeholder": "شرح مختصری از مشارکت شما (لازم)"
+                },
+                "communication_multi": {
+                    "label": "انواع ارتباطات"
+                },
                 "construction": {
                     "label": "نوع"
                 },
                     "label": "URL دوربین",
                     "placeholder": "http://example.com/"
                 },
+                "content": {
+                    "label": "محتوا"
+                },
                 "country": {
                     "label": "کشور"
                 },
                 "craft": {
                     "label": "نوع"
                 },
+                "crane/type": {
+                    "label": "نوع جرثقیل",
+                    "options": {
+                        "floor-mounted_crane": "جرثقیل نصب شده در کف",
+                        "portal_crane": "جرثقیل دروازه ای",
+                        "travel_lift": "Travel Lift"
+                    }
+                },
+                "crop": {
+                    "label": "محصولات زراعی"
+                },
                 "crossing": {
                     "label": "نوع"
                 },
+                "cuisine": {
+                    "label": "آشپزی ها"
+                },
                 "currency_multi": {
                     "label": "انواع ارز"
                 },
+                "cutting": {
+                    "label": "نوع",
+                    "placeholder": "پیش فرض"
+                },
                 "cycle_network": {
                     "label": "شبکه"
                 },
                 "description": {
                     "label": "توضیحات"
                 },
+                "devices": {
+                    "label": "دستگاه ها",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "امکان تعویض پوشک"
                 },
                 "drive_through": {
                     "label": "رانندگی-از طریق"
                 },
+                "duration": {
+                    "label": "مدت زمان",
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "برق رسانی",
                     "options": {
                     "label": "ایمیل",
                     "placeholder": "example@example.com"
                 },
+                "embankment": {
+                    "label": "نوع",
+                    "placeholder": "پیش فرض"
+                },
                 "emergency": {
                     "label": "اورژانس"
                 },
                         "wall": "دیوار"
                     }
                 },
+                "fitness_station": {
+                    "label": "نوع تجهیزات"
+                },
                 "fixme": {
                     "label": "من رو درست کن"
                 },
+                "ford": {
+                    "label": "نوع",
+                    "placeholder": "پیش فرض"
+                },
+                "frequency": {
+                    "label": "تناوب کار"
+                },
                 "fuel": {
                     "label": "سوخت"
                 },
                 "generator/method": {
                     "label": "شیوه"
                 },
+                "generator/output/electricity": {
+                    "label": "توان خروجی",
+                    "placeholder": "50مگاوات، 100مگاوات، 200مگاوات..."
+                },
                 "generator/source": {
                     "label": "منبع"
                 },
                 "generator/type": {
                     "label": "نوع"
                 },
+                "government": {
+                    "label": "نوع"
+                },
+                "grape_variety": {
+                    "label": "انواع انگور"
+                },
                 "handicap": {
                     "label": "مانع",
                     "placeholder": "1-18"
                 "handrail": {
                     "label": "نرده راه پله"
                 },
+                "hashtags": {
+                    "label": "هشتگهای پیشنهادی",
+                    "placeholder": "#مثال"
+                },
+                "healthcare": {
+                    "label": "نوع"
+                },
+                "healthcare/speciality": {
+                    "label": "تخصصها"
+                },
                 "height": {
                     "label": "ارتفاع(متر)"
                 },
                 "historic": {
                     "label": "نوع"
                 },
+                "historic/civilization": {
+                    "label": "تمدن تاریخی"
+                },
                 "hoops": {
                     "label": "حلقه ها",
                     "placeholder": "1, 2, 4..."
                 "information": {
                     "label": "نوع"
                 },
+                "inscription": {
+                    "label": "کتیبه"
+                },
+                "intermittent": {
+                    "label": "تناوب"
+                },
                 "internet_access": {
                     "label": "دسترسی اینترنت",
                     "options": {
                 "internet_access/ssid": {
                     "label": "SSID (نام شبکه)"
                 },
+                "kerb": {
+                    "label": "حاشیه پیاده رو"
+                },
+                "label": {
+                    "label": "برچسب"
+                },
                 "lamp_type": {
                     "label": "نوع"
                 },
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
-                    "label": "لايه"
+                    "label": "لايه",
+                    "placeholder": "0"
                 },
                 "leaf_cycle": {
                     "label": "چرخه برگ",
                 "man_made": {
                     "label": "نوع"
                 },
+                "manhole": {
+                    "label": "نوع"
+                },
                 "map_size": {
                     "label": "پوشش"
                 },
                 "maxstay": {
                     "label": "حداکثر توقف"
                 },
+                "maxweight": {
+                    "label": "حداکثر وزن"
+                },
+                "memorial": {
+                    "label": "نوع"
+                },
+                "monitoring_multi": {
+                    "label": "دیده بانی"
+                },
                 "mtb/scale": {
                     "label": "دشواری دوچرخه‌سواری کوهستانی",
                     "options": {
                     "label": "برابری",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "جهت",
-                    "options": {
-                        "backward": "به عقب",
-                        "forward": "به جلو"
-                    }
-                },
                 "park_ride": {
                     "label": "پارک و سوار شدن"
                 },
                 "payment_multi": {
                     "label": "روش‌های پرداخت"
                 },
+                "phases": {
+                    "label": "فازها",
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "تلفن",
                     "placeholder": "+31 42 123 4567"
                 "plant": {
                     "label": "گیاه"
                 },
+                "plant/output/electricity": {
+                    "label": "توان خروجی",
+                    "placeholder": "500مگاوات، 1000مگاوات، 2000مگاوات..."
+                },
+                "playground/baby": {
+                    "label": "جایگاه کودک"
+                },
+                "playground/max_age": {
+                    "label": "حداکثر سن"
+                },
+                "playground/min_age": {
+                    "label": "حداقل سن"
+                },
                 "population": {
                     "label": "جمعیت"
                 },
                 "power_supply": {
                     "label": "منبع تأمین توان"
                 },
+                "produce": {
+                    "label": "محصول"
+                },
+                "product": {
+                    "label": "محصولات"
+                },
                 "railway": {
                     "label": "نوع"
                 },
+                "rating": {
+                    "label": "درجه قدرت"
+                },
                 "recycling_accepts": {
                     "label": "قبول"
                 },
-                "recycling_type": {
-                    "label": "نوع بازیافت",
-                    "options": {
-                        "centre": "مرکز بازیافت",
-                        "container": "ظرف بازیافت"
-                    }
+                "ref": {
+                    "label": "کد مرجع"
+                },
+                "ref_aeroway_gate": {
+                    "label": "شماره ورودی"
+                },
+                "ref_golf_hole": {
+                    "label": "شماره سوراخ",
+                    "placeholder": "1-18"
+                },
+                "ref_highway_junction": {
+                    "label": "شماره اتصال"
+                },
+                "ref_platform": {
+                    "label": "شماره سکو"
+                },
+                "ref_road_number": {
+                    "label": "شماره جاده"
+                },
+                "ref_route": {
+                    "label": "شماره مسیر"
+                },
+                "ref_runway": {
+                    "label": "شماره باند",
+                    "placeholder": "مثلا 01L/19R"
+                },
+                "ref_stop_position": {
+                    "label": "شماره توقفگاه"
+                },
+                "ref_taxiway": {
+                    "label": "نام مسیر تاکسی رو",
+                    "placeholder": "مثلا A5"
                 },
                 "relation": {
                     "label": "نوع"
                 "service/bicycle": {
                     "label": "خدمات"
                 },
+                "service/vehicle": {
+                    "label": "خدمات"
+                },
                 "service_rail": {
                     "label": "نوع خدمات",
                     "options": {
                         "yard": "حیاط"
                     }
                 },
+                "service_times": {
+                    "label": "زمان های خدمت"
+                },
                 "shelter": {
                     "label": "پناه گاه"
                 },
                 "social_facility_for": {
                     "label": "ظرفیت"
                 },
+                "source": {
+                    "label": "منابع"
+                },
+                "sport": {
+                    "label": "ورزش ها"
+                },
+                "sport_ice": {
+                    "label": "ورزش ها"
+                },
+                "sport_racing_motor": {
+                    "label": "ورزش ها"
+                },
+                "sport_racing_nonmotor": {
+                    "label": "ورزش ها"
+                },
                 "stars": {
                     "label": "ستاره ها"
                 },
+                "start_date": {
+                    "label": "تاریخ شروع"
+                },
                 "step_count": {
                     "label": "تعداد قدم"
                 },
                     },
                     "placeholder": "ناشناخته"
                 },
+                "structure_waterway": {
+                    "label": "ساختار",
+                    "options": {
+                        "tunnel": "تونل"
+                    },
+                    "placeholder": "نامعلوم"
+                },
                 "studio": {
                     "label": "نوع"
                 },
+                "substance": {
+                    "label": "مواد"
+                },
                 "substation": {
                     "label": "نوع"
                 },
                 "surveillance/zone": {
                     "label": "بخش زیرنظر"
                 },
+                "switch": {
+                    "label": "نوع",
+                    "options": {
+                        "circuit_breaker": "فیوز",
+                        "disconnector": "قطع کننده",
+                        "earthing": "اتصال به زمین",
+                        "mechanical": "مکانیکی"
+                    }
+                },
                 "tactile_paving": {
                     "label": "سنگفرش لمسی -برای نابینایان"
                 },
                 "toll": {
                     "label": "باجه پرداخت"
                 },
+                "tomb": {
+                    "label": "نوع"
+                },
                 "tourism": {
                     "label": "نوع"
                 },
+                "tourism_attraction": {
+                    "label": "توریستی"
+                },
                 "tower/construction": {
                     "label": "ساخت و ساز",
                     "placeholder": "دکل مهاری، مشبک، مخفی..."
                     },
                     "placeholder": "سخت، عمدتا سخت، نرم ..."
                 },
+                "trade": {
+                    "label": "نوع"
+                },
                 "traffic_calming": {
                     "label": "نوع"
                 },
                     },
                     "placeholder": "عالی، خوب، بد ..."
                 },
+                "transformer": {
+                    "label": "نوع",
+                    "options": {
+                        "auto": "مبدل خودکار",
+                        "auxiliary": "کمکی",
+                        "converter": "مبدل",
+                        "distribution": "توزیع",
+                        "generator": "ژنراتور",
+                        "phase_angle_regulator": "تنظیم کننده زاویه فاز",
+                        "traction": "انقباظی",
+                        "yes": "نامعلوم"
+                    }
+                },
                 "trees": {
                     "label": "درخت‌ها"
                 },
+                "tunnel": {
+                    "label": "نوع",
+                    "placeholder": "پیش فرض"
+                },
                 "vending": {
                     "label": "نوع محموله"
                 },
                         "street": "از 5 تا 20 متر دیده می‌شود (16 تا 65 فوت)"
                     }
                 },
+                "volcano/status": {
+                    "label": "وضعیت آتشفشان",
+                    "options": {
+                        "active": "فعال",
+                        "dormant": "خاموش",
+                        "extinct": "از بین رفته"
+                    }
+                },
+                "volcano/type": {
+                    "label": "نوع آتشفشان",
+                    "options": {
+                        "scoria": "تفاله معدنی",
+                        "shield": "سپر",
+                        "stratovolcano": "آتشفشان چینه ای"
+                    }
+                },
+                "voltage": {
+                    "label": "ولتاژ"
+                },
+                "voltage/primary": {
+                    "label": "ولتاژ اصلی"
+                },
+                "voltage/secondary": {
+                    "label": "ولتاژ ثانویه"
+                },
+                "voltage/tertiary": {
+                    "label": "ولتاژ سوم"
+                },
                 "wall": {
                     "label": "نوع"
                 },
                 },
                 "wikipedia": {
                     "label": "ويکي پديا"
+                },
+                "windings": {
+                    "label": "سیم پیچ",
+                    "placeholder": "1, 2, 3..."
+                },
+                "windings/configuration": {
+                    "label": "پیکربندی سیم پیچ",
+                    "options": {
+                        "delta": "دلتا",
+                        "leblanc": "Leblanc",
+                        "open": "باز",
+                        "open-delta": "دلتا باز",
+                        "scott": "Scott",
+                        "star": "Star / Wye",
+                        "zigzag": "زیگزاگ"
+                    }
                 }
             },
             "presets": {
                     "name": "تله کابین",
                     "terms": "بلم, قایق"
                 },
+                "aerialway/goods": {
+                    "name": "محموله هوایی"
+                },
                 "aerialway/magic_carpet": {
                     "name": "آسانسور اسکی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'سطح شیب‌دار بالابر'، با کاما جدا می‌شوند>"
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'بالابر بکسری'، با کاما جدا می‌شوند>"
                 },
                 "aerialway/station": {
-                    "name": "ایستگاه بالابر",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه مسیر هوایی'، با کاما جدا می‌شوند>"
+                    "name": "ایستگاه بالابر"
                 },
                 "aerialway/t-bar": {
                     "name": "بالابر نوار T",
                     "name": "تبدیل ارز / صرافی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'تبدیل ارز / صرافی'، با کاما جدا می‌شوند>"
                 },
-                "amenity/bus_station": {
-                    "name": "ایستگاه پایانه اتوبوس",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه پایانه اتوبوس'، با کاما جدا می‌شوند>"
-                },
                 "amenity/cafe": {
                     "name": "کافه",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'کافه'، با کاما جدا می‌شوند>"
                     "name": "غذای آماده",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'غذای آماده'، با کاما جدا می‌شوند>"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "پایانه کشتی",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'پایانه کشتی'، با کاما جدا می‌شوند>"
-                },
                 "amenity/fire_station": {
                     "name": "ایستگاه آتش نشانی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه آتش نشانی'، با کاما جدا می‌شوند>"
                     "name": "ایستگاه جنگلبانی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه جنگلبانی'، با کاما جدا می‌شوند>"
                 },
-                "amenity/recycling": {
-                    "name": "بازیافت مواد",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'بازیافت'، با کاما جدا می‌شوند>"
-                },
                 "amenity/recycling_centre": {
                     "name": "مرکز بازیافت",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'مرکز بازیافت'، با کاما جدا می‌شوند>"
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'سرویس بهداشتی'، با کاما جدا می‌شوند>"
                 },
                 "amenity/townhall": {
-                    "name": "تاÙ\84ار Ø´Ù\87ر",
+                    "name": "Ø´Ù\87ردارÛ\8c",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'تالار شهر'، با کاما جدا می‌شوند>"
                 },
                 "amenity/university": {
                     "name": "مسیر حیوانات اهلی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای   'Bridle Path'، با کاما جدا می‌شوند>"
                 },
-                "highway/bus_stop": {
-                    "name": "ایستگاه اتوبوس",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه اتوبوس'، با کاما جدا می‌شوند>"
-                },
                 "highway/corridor": {
                     "name": "راهروی داخلی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'راهرو داخلی'، با کاما جدا می‌شوند>"
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'جاده خدماتی'، با کاما جدا می‌شوند>"
                 },
                 "highway/service/alley": {
-                    "name": "کوچه",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'کوچه'، با کاما جدا می‌شوند>"
+                    "name": "پس کوچه",
+                    "terms": "<translate with synonyms or related terms for 'Alley', separated by commas><ترجمه با مترادف یا اصطلاحات مشابه برای 'پس کوچه'، با کاما جدا می‌شوند>"
                 },
                 "highway/service/drive-through": {
                     "name": "پرداخت سواره",
                     "name": "جنگل",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'جنگل'، با کاما جدا می‌شوند>"
                 },
-                "landuse/garages": {
-                    "name": "گاراژها",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'گاراژ'، با کاما جدا می‌شوند>"
-                },
                 "landuse/grass": {
                     "name": "علف زار",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'چمن'، با کاما جدا می‌شوند>"
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'اداره'، با کاما جدا می‌شوند>"
                 },
                 "office/administrative": {
-                    "name": "دفتر اداری",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'دفتر اداری'، با کاما جدا می‌شوند>"
-                },
-                "office/company": {
-                    "name": "دفتر شرکت",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'دفتر شرکت'، با کاما جدا می‌شوند>"
+                    "name": "دفتر اداری"
                 },
                 "office/coworking": {
                     "name": "فضای کاری مشارکتی"
                     "name": "میدان"
                 },
                 "place/town": {
-                    "name": "شهر کوچک",
+                    "name": "شهرک",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'شهرک'، با کاما جدا می‌شوند>"
                 },
                 "place/village": {
                     "name": "مبدل برق",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'کاهنده جریان برق'، با کاما جدا می‌شوند>"
                 },
-                "public_transport/platform": {
-                    "name": "پلتفورم",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'سامانه حمل و نقل'، با کاما جدا می‌شوند>"
-                },
-                "public_transport/stop_position": {
-                    "name": "موقعیت توقف",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'توقفگاه'، با کاما جدا می‌شوند>"
-                },
                 "railway": {
                     "name": "راه آهن"
                 },
                     "name": "کابلی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'واگن کابلی'، با کاما جدا می‌شوند>"
                 },
-                "railway/halt": {
-                    "name": "توقف گاه راه آهن",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'توقفگاه راه آهن'، با کاما جدا می‌شوند>"
-                },
                 "railway/level_crossing": {
                     "name": "جاده گذرنده از راه‌آهن",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'جاده گذرنده از راه‌آهن'، با کاما جدا می‌شوند>"
                     "name": "راه آهن باریک کابلی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'راه آهن باریک'، با کاما جدا می‌شوند>"
                 },
-                "railway/platform": {
-                    "name": "بستر راه آهن",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'سامانه راه آهن'، با کاما جدا می‌شوند>"
-                },
                 "railway/rail": {
                     "name": "ریل قطار",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'خط اهن'، با کاما جدا می‌شوند>"
                 },
-                "railway/station": {
-                    "name": "ایستگاه راه آهن",
-                    "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'ایستگاه راه آهن'، با کاما جدا می‌شوند>"
-                },
                 "railway/subway": {
                     "name": "مترو",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'مترو'، با کاما جدا می‌شوند>"
                     "name": "جواهر فروشی",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'جواهرساز'، با کاما جدا می‌شوند>"
                 },
-                "shop/kiosk": {
-                    "name": "باجه روزنامه فروشی",
-                    "terms": "کیوسک روزنامه"
-                },
                 "shop/kitchen": {
                     "name": "فروشگاه تزئینات آشپزخانه",
                     "terms": "<ترجمه با مترادف یا اصطلاحات مشابه برای 'فروشگاه تزئینات آشپزخانه'، با کاما جدا می‌شوند>"
                 "name": "جاده های TIGER 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "مسیرهای مشخص شده: دوچرخه سواری"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "مسیرهای مشخص شده: پیاده روی"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "مسیرهای مشخص شده: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "مسیرهای مشخص شده: اسکیت"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
-                },
                 "name": "مسیرهای مشخص شده: ورزشهای زمستانی"
             },
             "basemap.at": {
index a1bc72393bdae0501f6c9ec59befba8236bb85c8..eff72a35ecd9580956a4647e7880e38a5ae596ab 100644 (file)
             "created": "Luotu",
             "about_changeset_comments": "Tietoja muutoskokoelman kommenteista",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Huomaathan, että karttatietojen kopioiminen Google-kartoista on ehdottomasti kielletty.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Huomaathan, että karttatietojen kopioiminen Google-kartoista on ehdottomasti kielletty."
         },
         "contributors": {
             "list": "Muokkaajat {users}",
                 "title": "Mittaus",
                 "selected": "{n} valittu",
                 "geometry": "Muoto",
-                "closed": "umpinainen",
                 "perimeter": "Piiri",
                 "length": "Pituus",
                 "area": "Pinta-ala",
         "background": {
             "title": "Tausta",
             "description": "Taustan asetukset",
-            "percent_brightness": "{opacity}% kirkkaus",
             "none": "Ei taustaa",
             "best_imagery": "Paras ilmakuvalähde tälle sijainnille",
             "switch": "Vaihda takaisin tähän taustaan",
             "custom": "Mukautettu",
             "custom_button": "Muokkaa omaa taustaa",
-            "fix_misalignment": "Korjaa ilmakuvavirhe",
-            "imagery_source_faq": "Mikä tämän ilmakuvan lähde on?",
             "reset": "palauta",
-            "offset": "Korjaa ilmakuvan asemointivirhettä vetämällä hiiren osoitinta harmaan laatikon sisällä tai syöttämällä korjausluvut metreinä",
             "minimap": {
-                "description": "Pienoiskartta",
                 "tooltip": "Näytä pienoiskartta laajemmalta alueelta nykyisen muokkausnäkymän sijainnin havainnollistamiseksi."
-            }
+            },
+            "fix_misalignment": "Korjaa ilmakuvavirhe",
+            "offset": "Korjaa ilmakuvan asemointivirhettä vetämällä hiiren osoitinta harmaan laatikon sisällä tai syöttämällä korjausluvut metreinä"
         },
         "map_data": {
             "title": "Karttatiedot",
             "untagged_area": "Ominaisuustiedoton alue",
             "untagged_area_tooltip": "Valitse ominaisuustyyppi, joka kuvaa tämän alueen tarkoitusta.",
             "untagged_relation": "Ominaisuustiedoton relaatio",
-            "many_deletions": "Olet poistamassa {n} karttakohdetta. Haluatko varmasti poistaa ne kaikkien julkisesti käyttämältä OpenStreetMap.org-kartalta?",
             "tag_suggests_area": "Ominaisuustiedon {tag} mukaan viiva on alue, vaikka se ei sitä ole.",
             "deprecated_tags": "Vanhentuneet ominaisuustiedot: {tags}"
         },
             "view_on_mapillary": "Näytä tämä kuva Mapillary-palvelussa"
         },
         "help": {
-            "title": "Ohje",
-            "help": "# Ohje\n\nTämä on ohjelma vapaasti muokattavan\n[OpenStreetMap](http://www.openstreetmap.org/)-kartan\nmuokkaamiseen. Voit käyttää sitä vapaasti alueesi muokkaamiseen ja osallistua ihmisten tekemän\nmaailmankartan luomiseen.\n\nKarttaan tehtävät muutokset ovat näkyvillä kaikille OpenStreetMapin käyttäjille.\nKartan muokkaaminen edellyttää ilmaista [OpenStreetMap-käyttäjätiliä](https://www.openstreetmap.org/login).\n\n[iD-muokkausohjelma](http://ideditor.com/) on yhteistyöprojekti, jonka\n[lähdekoodi on saatavilla GitHubista](https://github.com/openstreetmap/iD).\n\n\n",
-            "gps": "# GPS\n\nGPS-mittaukset ovat tärkein OpenStreetMapin aineiston lähde.\nTämä muokkausohjelma tukee omalta tietokoneeltasi ladattavia `.gpx`-tiedostoja.\nGPS-mittauksia voi tehdä useilla älypuhelinsovelluksilla ja tietysti myös erillisillä\nGPS-mittalaitteilla.\n\nLisätietoja GPS-mittausten tekemisestä on sivuilla [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/) (Karttatietojen kerääminen älypuhelimella, GPS-laitteella tai paperille) ja [Aloittelijan opas](http://wiki.openstreetmap.org/wiki/Fi:Beginners_Guide_1.1).\n\nKäytä GPX-tiedostoa kartoittamisen apuna vetämällä ja pudottamalla tiedosto kartanmuokkausohjelmaan. Jos se toimii, GPS-jälki ilmestyy karttapohjalle kirkkaanviolettina viivana. Piilota, näytä uudelleen tai muuta tämän GPX-tason lähennystasoa Karttatiedot-valikosta oikeasta reunasta.\n\nTällä tavalla kartoittamisen apuna käytettyä GPX-tiedostoa ei tallenneta OpenStreetMapiin - tiedosto tulee hyödynnettyä parhaiten tallentamalla tiedosto myös muiden [karttakehittäjien käyttöön](http://www.openstreetmap.org/trace/create).\n",
-            "imagery": "# Ilmakuvat\n\nIlmakuvat ovat tärkeä kartoittamisen apuväline. Lentokuvien,\nsatelliittikuvien ja vapaasti koottujen materiaalien kokoelma on\nkäytettävissä Taustan asetukset -valikosta oikean reunan sivupalkista.\n\nOletuksena taustalla näytetään [Bing-karttojen](http://www.bing.com/maps/) satelliittikuvat,\nmutta karttaa lähentämällä vaihtoehtoja tulee lisää.\nJoissakin maissa, kuten Suomessa, Ranskassa ja Tanskassa\non saatavilla korkealaatuisia lentokoneesta kuvattuja ilmakuvia.\n\nIlmakuva voi näyttää virheelliseltä palveluntarjoajan sivuston\nvirheen vuoksi. Jos tiestön sijainti heittää ilmakuvasta, älä ala heti\nsiirtämään niitä vastaamaan taustakuvaa, vaan siirrä ilmakuvataustaa\nvastaamaan tiestöä asetuksella \"Korjaa ilmakuvavirhe\"\nTaustan asetusten alaosassa.\n",
-            "addresses": "# Osoitteet\n\nOsoitteet ovat yksi tärkeimmistä kartalla olevasta tiedosta.\n\nSen lisäksi että osoitetiedot ovat myös katujen nimiä,\nOpenStreetMapissa ne ovat olennaisia myös rakennusten\nja muiden kadunvarsikohteiden tiedoissa.\n\nOsoitetietoja voi katujen lisäksi lisätä rakennuksien ulkoreunoille\nja paikkapisteille. Paras osoitetietojen lähde on jalkautuminen tai\noma paikallistuntemus. Kuten kaikessa muussakin muokkaamisessa,\ntietojen kopioiminen kaupallisista lähteistä kuten Google Kartoista\non ehdottomasti kielletty.\n",
-            "inspector": "# Kohdemuokkaimen käyttö\n\nKohdemuokkain on näytön vasemmassa reunassa oleva osio, jolla muutetaan valitun kohteen ominaisuuksia.\n\n### Kohteen tyypin valitseminen\n\nPisteen, viivan tai alueen lisäämisen jälkeen valitaan, millainen kohde on kyseessä - kuten kahvila, moottoritie, joki tai leikkipuisto. Kohdemuokkain näyttää heti pikapainikkeet suosituimmille kohteille. Jos kohde ei näy listalla, hae paikkaa hakusanalla ja valitse se sitten luettelosta. Haku ymmärtää myös synonyymit ja paikkaan liittyviä sanoja, joten kokeile sitä rohkeasti.\n\nTarkastele kohdetyypin lisätietoja tarkemmin napsauttamalla i-kirjainta sen oikeassa reunassa. Valitse kohdetyyppi muokattavalle kohteelle napsauttamalla sitä hakutuloslistassa.\n\n### Kohteen ominaisuustietojen muokkaaminen\n\nKun kohdetyyppi on valittu, kohdemuokkain näyttää tietokenttiä, joilla voidaan kuvailla kohteen ominaisuuksia, kuten nimi ja osoite.\n\nKenttäjoukon alapuolella pudotusvalikko, josta löytyy lisätietokenttiä, kuten [Wikipedia-sivu](http://fi.wikipedia.org/), esteettömyystiedot ja paljon muuta.\n\nKohdemuokkaimen alaosassa on Kaikki ominaisuustiedot -kohta, jossa voi lisätä kohteelle mitä tahansa tageja eli ominaisuustietoja. [Taginfosta](http://taginfo.openstreetmap.org/) löytää lisätietoja erilaisista tageista ja niiden käyttömahdollisuuksista.\n\nKohdemuokkaimella tehtävät muutokset päivittyvät muokkauskartalle automaattisesti. Muutoksen voi kuitenkin aina perua napsauttamalla Kumoa-painiketta.\n"
+            "title": "Ohje"
         },
         "intro": {
             "done": "valmis",
             },
             "areas": {
                 "title": "Alueet",
-                "add_playground": "*Alueilla* merkitään esimerkiksi järvien, rakennusten ja asuinalueiden rajoja.{br}Lisäksi paikkapisteet voi yleensä merkitä myös tarkemmin alueina. **Luo uusi alue napsauttamalla {button}-painiketta.**",
                 "start_playground": "Lisää tämä leikkipuisto kartalle piirtämällä alue. Alueet koostuvat alueen ulkoreunaa rajaavista *viivapisteistä*. **Osoita aloituspisteen paikka napsauttamalla kartalla tai painamalla välilyöntiä jossakin leikkipuiston nurkassa.**",
                 "search_playground": "**Etsi hakusanalla \"{preset}\".**",
                 "choose_playground": "**Valitse {preset} listalta.**",
                     "label": "Paikkamäärä",
                     "placeholder": "5, 10, 20, 100..."
                 },
-                "cardinal_direction": {
-                    "label": "Suunta",
-                    "options": {
-                        "E": "Itä",
-                        "ENE": "Itä-koillinen",
-                        "ESE": "Itä-kaakko",
-                        "N": "Pohjoinen",
-                        "NE": "Koillinen",
-                        "NNE": "Pohjois-koillinen",
-                        "NNW": "Pohjois-luode",
-                        "NW": "Luode",
-                        "S": "Etelä",
-                        "SE": "Kaakko",
-                        "SSE": "Etelä-kaakko",
-                        "SSW": "Etelä-lounas",
-                        "SW": "Lounas",
-                        "W": "Länsi",
-                        "WNW": "Länsiluode",
-                        "WSW": "Länsilounas"
-                    }
-                },
                 "castle_type": {
                     "label": "Tyyppi"
                 },
-                "clock_direction": {
-                    "label": "Suunta",
-                    "options": {
-                        "anticlockwise": "Vastapäivään",
-                        "clockwise": "Myötäpäivään"
-                    }
-                },
                 "club": {
                     "label": "Tyyppi"
                 },
                     "label": "Lyöntimääräsuositus",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Vaikuttaa kulkusuunnassa",
-                    "options": {
-                        "backward": "Taaksepäin",
-                        "forward": "Eteenpäin"
-                    }
-                },
                 "park_ride": {
                     "label": "Autoparkki"
                 },
                 "recycling_accepts": {
                     "label": "Keräys"
                 },
-                "recycling_type": {
-                    "label": "Kierrätyksen tyyppi",
-                    "options": {
-                        "centre": "Kierrätyskeskus",
-                        "container": "Säiliö"
-                    }
-                },
                 "ref_road_number": {
                     "label": "Tienumero"
                 },
                     "name": "Valuutanvaihtopiste",
                     "terms": "valuutta, raha, vaihto, vaihtaminen, valuutanvaihto, valuutanvaihtaminen, rahanvaihto, rahanvaihtaminen, Forex"
                 },
-                "amenity/bus_station": {
-                    "name": "Linja-autoasema",
-                    "terms": "linja, linja-auto, asema, pysäkki, keskus, matkakeskus, bussiasema, bussi, bussit, nysse, dösä, terminaali, linja-autoterminaali, bussiterminaali"
-                },
                 "amenity/cafe": {
                     "name": "Kahvila",
                     "terms": "Kahvila, Kahvitupa, Teehuone"
                     "name": "Pikaruokaravintola",
                     "terms": "Hesburger, mäkkäri, McDonald's, McDonalds, subi, subway, hamppari, hampurilainen, hampurilais, hampurilaisravintola, roska, roskaruoka, ruoka, ravintola, mättö, ranskalaiset, ranskikset"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Laivaterminaali"
-                },
                 "amenity/fire_station": {
                     "name": "Paloasema",
                     "terms": "paloasema, palokeskus, vpk, vapaapalokunta"
                 "amenity/ranger_station": {
                     "name": "Metsävartiosto"
                 },
-                "amenity/recycling": {
-                    "name": "Kierrätyspiste",
-                    "terms": "kierrättäminen, kierrätys, lajittelu, uudelleenkäyttö, uudelleenkäyttäminen, ympäristö, lajittelupiste, lajitteluasema, jäte, jätteet, roskat, roska, roskikset, roskis, säiliö, roskasäiliö"
-                },
                 "amenity/recycling_centre": {
                     "name": "Kierrätyskeskus"
                 },
                 "highway/bridleway": {
                     "name": "Ratsastuspolku"
                 },
-                "highway/bus_stop": {
-                    "name": "Linja-autopysäkki",
-                    "terms": "bussipysäkki, linja-autopysäkki, bussikatos, pysähtymispaikka, bussin pysähtymispaikka, linja-auton pysähtymispaikka, pysäkki, pysäkkisyvänne"
-                },
                 "highway/corridor": {
                     "name": "Sisäkäytävä",
                     "terms": "katettu, katos, käytävä, sisällä, sisätila, sisätiloissa"
                 "landuse/forest": {
                     "name": "Metsä"
                 },
-                "landuse/garages": {
-                    "name": "Iso autotalli"
-                },
                 "landuse/grass": {
                     "name": "Ruohokenttä"
                 },
                     "name": "Toimisto"
                 },
                 "office/administrative": {
-                    "name": "Kunnallishallinnon toimisto",
-                    "terms": "kunta, paikkakunta, paikallinen, paikallis, seutu, seudullinen, kaupunki, kaupungin, kunnan, kunnallinen, toimisto, hallinto, hallitus"
-                },
-                "office/company": {
-                    "name": "Yritystoimisto"
+                    "name": "Kunnallishallinnon toimisto"
                 },
                 "office/coworking": {
                     "name": "Yhteistyöskentelytila"
                     "terms": "asianajotoimisto, asianajajatoimisto, asianajo, asianajaja, lakimies, juristi, toimisto, lakiasia, lakiasiaintoimisto"
                 },
                 "office/lawyer/notary": {
-                    "name": "Asianajotoimisto",
-                    "terms": "asianajaja, juristi, laki, lakimies, toimisto, konttori, yritys, firma, oikeus"
+                    "name": "Asianajotoimisto"
                 },
                 "office/ngo": {
                     "name": "Kansalaisjärjestö",
                 "power/transformer": {
                     "name": "Muuntaja"
                 },
-                "public_transport/platform": {
-                    "name": "Laiturialue",
-                    "terms": "pysäkki, asema, pysäkkilaituri, laituri, odotus, odotusalue, odotuslaituri, odottaminen, katos, asemalaituri, asema"
-                },
-                "public_transport/stop_position": {
-                    "name": "Pysätyspaikka"
-                },
                 "railway": {
                     "name": "Rautatie"
                 },
                     "name": "Kiskoköysirata",
                     "terms": "funikulaari, köysihissi, gondoli, gondolihissi, hissi, rata, hissirata, köysirata"
                 },
-                "railway/halt": {
-                    "name": "Seisake",
-                    "terms": "rautatie, juna, junarata, pysäkki, asema, rautatieasema, VR"
-                },
                 "railway/level_crossing": {
                     "name": "Moottoriajoneuvoliikenteen tasoristeys",
                     "terms": "tasoristeys, ylityspaikka, rautatie, radanylitys, ajoneuvo, tie, katu, moottoriajoneuvo, ajoneuvo, auto"
                 "railway/narrow_gauge": {
                     "name": "Kapearaiteinen rautatie"
                 },
-                "railway/platform": {
-                    "name": "Rautatielaituri",
-                    "terms": "junalaituri, juna, rautatie, VR, asemalaituri, odotusalue, odotuslaituri"
-                },
                 "railway/rail": {
                     "name": "Rata"
                 },
                     "name": "Rautatieopastin",
                     "terms": "rautatie, juna, opastin, liikennevalo, signaali"
                 },
-                "railway/station": {
-                    "name": "Rautatieasema"
-                },
                 "railway/subway": {
                     "name": "Metrorata"
                 },
                 "railway/tram": {
                     "name": "Raitiotie"
                 },
-                "railway/tram_stop": {
-                    "name": "Raitiotiepysäkki",
-                    "terms": "raitiotie, raitiovaunu, ratikka, pysäkki, asema, laituri, raide, katos"
-                },
                 "relation": {
                     "name": "Relaatio"
                 },
                 "shop/jewelry": {
                     "name": "Jalokiviliike"
                 },
-                "shop/kiosk": {
-                    "name": "Lehtikioski"
-                },
                 "shop/kitchen": {
                     "name": "Keittiöliike"
                 },
index a7f232467534a96888acaebe594ebd9fda2697f8..7e702e6136ee30fa26c368f5e1b5cc8acb73b498 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": " Cliquez pour ajouter des nœuds à la ligne. Cliquez sur d'autres lignes pour y connecter la ligne, et double-cliquez pour terminer la ligne."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Ceci ne peut être édité parce que c'est connecté à un élément caché."
             }
         },
         "operations": {
                 },
                 "key": "X",
                 "annotation": {
-                    "line": "ligne coupée.",
+                    "line": "Couper une ligne.",
                     "area": "contour d'un polygone coupé.",
                     "multiple": "{n} lignes/contours de polygone coupés."
                 },
             "about_changeset_comments": "À propos des commentaires de groupe de modifications",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/FR:Bons_commentaires_de_groupe_de_modifications",
             "google_warning": "Vous avez mentionné Google dans ce commentaire : rappelez-vous que copier depuis Google Maps est strictement interdit.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Modifications de {users}",
                 "accuracy": "Précision",
                 "unknown": "Inconnu",
                 "show_tiles": "Afficher la couche",
-                "hide_tiles": "Masquer le couche"
+                "hide_tiles": "Masquer le couche",
+                "show_vintage": "Afficher Vintage",
+                "hide_vintage": "Masquer Vintage"
             },
             "history": {
                 "key": "H",
                 "title": "Mesures",
                 "selected": "{n} dans la sélection",
                 "geometry": "Geométrie",
-                "closed": "fermé",
                 "center": "Centre",
                 "perimeter": "Périmètre",
                 "length": "Longueur",
                 "centroid": "Centroïde",
                 "location": "Emplacement",
                 "metric": "Métrique",
-                "imperial": "Anglo-saxon"
+                "imperial": "Anglo-saxon",
+                "node_count": "Nombre de points"
             }
         },
         "geometry": {
             "title": "Fond de carte",
             "description": "Paramètres du fond de carte",
             "key": "B",
-            "percent_brightness": "{opacity}% luminosité",
+            "backgrounds": "Fond de carte",
             "none": "Aucun",
             "best_imagery": "Meilleur fond de carte connu pour cet endroit",
             "switch": "Revenir à cet arrière-plan",
             "custom": "Personnalisé",
             "custom_button": "Modifier le fond personnalisé",
-            "custom_prompt": "Entrez un modèle URL de tuile. Les symboles valide sont : \n - {zoom}/{z}, {x}, {y} pour schéma de tuile Z/X/Y\n- {ty} pour basculer vers le style de coordonées TMS Y\n- {u} pour le schéma quadri-tuiles\n- {switch:a,b,c} pour le multiplexage de serveur DNS\n\nExemple:\n{example}",
-            "fix_misalignment": "Ajuster le décalage du fond de carte",
-            "imagery_source_faq": "D'où provient ce fond de carte ?",
+            "overlays": "Calques",
+            "imagery_source_faq": "Info imagerie / Signaler un problème",
             "reset": "réinitialiser",
-            "offset": "«Glissez» partout dans la zone grise ci-dessous pour ajuster le décalage d'image, ou entrez les valeurs de décalage en mètres.",
+            "display_options": "Options d'affichage",
+            "brightness": "Luminosité",
+            "contrast": "Contraste",
+            "saturation": "Saturation",
+            "sharpness": "Finesse",
             "minimap": {
-                "description": "Minicarte",
+                "description": "Afficher la petite carte",
                 "tooltip": "Montre une carte de vue d'ensemble pour aider à localiser la zone actuellement affichée.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ajuster le décalage du fond de carte",
+            "offset": "«Glissez» partout dans la zone grise ci-dessous pour ajuster le décalage d'image, ou entrez les valeurs de décalage en mètres."
         },
         "map_data": {
             "title": "Données cartographiques",
             "status_code": "Le serveur a renvoyé le code de statut {code}",
             "unknown_error_details": "Veuillez vérifier que votre ordinateur est connecté au réseau.",
             "uploading": "Envoi des modifications vers OpenStreetMap...",
+            "conflict_progress": "Détection des conflits: {num} de {total}",
             "unsaved_changes": "Vous avez des modifications non enregistrées",
             "conflict": {
                 "header": "Résoudre les modifications conflictuelles",
             "untagged_area_tooltip": "Sélectionnez un type d'élément pour décrire cette surface.",
             "untagged_relation": "Relation sans attributs",
             "untagged_relation_tooltip": "Sélectionnez un type d’entité décrivant ce qu’est cette relation.",
-            "many_deletions": "Vous êtes en train de supprimer {n} éléments. En êtes-vous sûr ? Ils seront supprimés de la carte que tout le monde voit sur openstreetmap.org.",
             "tag_suggests_area": "Cet attribut {tag} suppose que cette ligne devrait être un polygone, or ce n'est pas le cas",
             "deprecated_tags": "Attributs obsolètes : {tags}"
         },
         "mapillary": {
             "view_on_mapillary": "Voir cette image sur Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Photos de la rue issues d'OpenStreetCam",
+            "title": "Surcouche photo (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Voir cette image sur OpenStreetCam"
+        },
         "help": {
             "title": "Aide",
             "key": "H",
-            "help": "# Aide\n\nCeci est un éditeur pour [OpenStreetMap](http://www.openstreetmap.org/), la\ncarte du monde libre et éditable. Vous pouvez l'utiliser pour ajouter ou mettre à jour\nles données dans votre zone, et participer ainsi à la réalisation d'une carte du monde libre et à données ouvertes\nmeilleure pour tout le monde.\n\nLes modifications que vous réaliserez sur cette carte seront visibles par tous les utilisateurs d'OpenStreetMap. Pour commencer à modifier, vous devez vous [connecter](https://www.openstreetmap.org/login).\n\nL'[éditeur iD](http://ideditor.com/) est un projet collaboratif dont le [code\nsource est disponible sur GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Modification et sauvegarde\n\nCet éditeur est conçu pour fonctionner essentiellement en ligne, et vous êtes en train d'y accéder depuis un site Web.\n\n### Sélection des éléments\n\nPour sélectionner un élément de la carte, comme une route ou un point\nd'intérêt, cliquez sur cet élément sur la carte. L'élément sélectionné\nest mis en surbrillance, et un panneau apparaît sur le côté avec des\ndétails sur l'élément. Si vous cliquez droit sur l'élément, un menu apparaît,\navec des actions que vous pouvez faire avec l'élément.\n\nPour sélectionner plusieurs éléments, maintenez la touche « Maj » enfoncée.\nPuis vous pouvez soit cliquer sur chaque élément que vous voulez sélectionner,\nsoit dessiner sur la carte un contour autour de ces éléments. Tous les\npoints dans le « lasso » dessiné seront sélectionnés.\n\n### Sauvegarde des modifications\n\nQuand vous faites des modifications comme changer des routes, des bâtiments,\net des places, ces modifications sont stockées localement jusqu'à ce que\nvous les sauvegardiez sur le serveur. Ne vous inquiétez pas si vous faites\nune erreur : vous pouvez annuler vos modifications en cliquant sur\nle bouton « Annuler », et les refaire en cliquant sur le bouton « Rétablir ».\n\nCliquez sur « Sauvegarder » pour terminer un groupe de modifications\n(par exemple, si vous avez complété une partie de la ville et si vous voulez\ncommencer une nouvelle zone). Vous aurez la possibilité de passer en revue\nce que vous avez fait, et l'éditeur fournit quelques suggestions utiles\nainsi que des avertissements si quelque chose semble être incorrect parmi\nvos modifications.\n\nSi tout semble correct, vous pouvez saisir un petit commentaire pour\nexpliquer vos modifications, et cliquer sur « Envoyer » pour envoyer les modifications\nà [OpenStreetMap.org](http://www.openstreetmap.org/), où elles seront\nvisibles par tous les utilisateurs, et disponibles pour que d'autres viennent\nles enrichir et les améliorer.\n\nSi vous ne pouvez pas terminer vos modifications en une fois, vous pouvez\nquitter la fenêtre de votre éditeur et revenir plus tard (sur le même ordinateur et\nle même navigateur) : l'éditeur vous proposera de restaurer votre travail.\n\n### Utilisation de l'éditeur\n\nVous pouvez afficher une liste des raccourcis clavier en appuyant sur la touche « ? ».\n",
-            "roads": "# Routes\n\nVous pouvez créer, mettre à jour et supprimer des routes à l'aide de l'éditeur. Il peut s'agir de tous types de routes : chemins, autoroutes, pistes cyclables, et plus encore : toute voie régulièrement fréquentée peut être cartographiée.\n\n### Sélection\n\nCliquez sur une route pour la sélectionner. Elle sera alors surlignée et un menu 'outils' apparaîtra sur la carte, ainsi qu'une barre d'état affichant des informations supplémentaires.\n\n### Modification\n\nIl est fréquent que les routes ne soient pas bien alignées avec l'imagerie satellite ou avec les traces GPS. Vous pouvez ajuster et corriger la position des routes.Cliquez d'abord sur la route à modifier. Elle est alors surlignée et des points de contrôle apparaissent qui permettent de corriger sa position. Pour ajouter des points de contrôle, double-cliquez sur un segment de la route sans nœuds.Si la route est connectée à une autre, mais que la connexion est incorrecte, vous pouvez déplacer un de ses points de contrôle sur la seconde route pour corriger la connexion. Des routes bien connectées sont essentielles pour la carte et pour fournir de bonnes informations d'itinéraire.Vous pouvez également cliquer sur l'outil 'Déplacer' ou appuyer sur le raccourci `M` pour déplacer l'ensemble de la route en une fois, puis cliquer de nouveau une fois pour sauvegarder le déplacement\n\n### Suppression\n\nSi une route est complètement fausse - c'est-à-dire qu'elle n'apparaît pas sur l'image satellite, et que dans l'idéal, vous avez confirmé qu'elle n'existe pas sur le terrain - vous pouvez la supprimer, ce qui l'enlèvera de la carte. Faites attention lorsque vous supprimez des éléments : comme n'importe quelle autre modification, le résultat sera visible par tout le monde sur la carte. Les photos aériennes sont souvent dépassées et la route est peut-être tout simplement récente.Pour supprimer une route, sélectionnez-la en cliquant dessus, puis cliquez sur l'icône 'Poubelle' ou appuyez sur la touche 'Suppr'.\n\n### Création\n\nVous avez constaté qu'une route de votre connaissance manque à la carte ? Cliquez sur l'icône 'Ligne' en haut à gauche de l'éditeur ou appuyez sur le raccourci `2` pour dessiner une route. Pour commencer le dessin, cliquez sur l'endroit où commence la route. Si elle commence à l'embranchement d'une autre route, commencez le dessin en cliquant à l'endroit de la connexion.Cliquez ensuite régulièrement le long de la route pour ajouter des points, en utilisant l'imagerie satellite comme référence. Si la route que vous dessinez croise une autre route, connectez les deux en cliquant à l'endroit de l'intersection. Lorsque vous avez terminé le dessin, double-cliquez ou appuyez sur 'Entrée'.\n",
-            "gps": "# GPS\n\nLe GPS est la source la plus fiable de données pour OpenStreetMap. Cet éditeur\nsupporte les traces en local - fichiers `.gpx` sur votre ordinateur. Vous pouvez collecter\nce genre de trace GPS à l'aide de nombreuses applications pour smartphones ainsi\nqu'avec du matériel GPS personnel.\n\nPour savoir comment effectuer un relevé GPS, lisez\n[Sur le terrain avec un GPS](http://learnosm.org/fr/beginner/using-gps/).\n\nPour utiliser un tracé GPX pour cartographier, effectuer un \"glissé-déposé\" du\nfichier GPX dans l'éditeur de cartes. S'il est reconnu, une ligne violette en\nsurbrillance apparaîtra sur la carte. Cliquez dans le menu \"Données de la carte\"\nsur le côté droit pour activer, désactiver, ou zoomer dans ce nouveau calque GPX.\n\nLe tracé GPX n'est pas directement envoyé sur OpenStreetMap - le meilleur moyen de\nl'utiliser est de dessiner sur la carte, en l'utilisant comme guide pour les\nnouveaux éléments que vous ajoutez, et aussi de le\n[charger dans OpenStreetMap](http://www.openstreetmap.org/trace/create) pour que\nles autres utilisateurs puissent s'en servir.\n",
-            "imagery": "# Fond de carte\n\nLes photos aériennes sont une source importante pour cartographier. Une\ncompilation de photos prises d'avion, imageries satellites, et autres sources\nlibre d'utilisation sont disponibles dans l'éditeur dans le menu \"Configuration\ndu fond de carte\" à gauche.\n\nPar défaut, l'imagerie aérienne de [Bing Maps](http://www.bing.com/maps/)\nest utilisée dans l'éditeur, mais lorsque vous zoomez sur la carte, d'autres sources sont parfois disponibles dans certaines zones. Certains pays tels que la France, les États-Unis ou le Danemark disposent d'images de très haute qualité sur certaines zones.\n\nCertaines images sont parfois décalées par rapport aux données, notamment\nà cause d'un mauvais calibrage. Si vous voyez de nombreux éléments tous décalés par rapport au fond de carte, ne déplacez pas immédiatement ces éléments. À la place, vous pouvez ajuster le fond de carte afin qu'il soit aligné aux données en cliquant sur \"Ajuster le décalage du fond de carte\" en bas de l'interface de configuration du fond de carte.\n",
-            "addresses": "# Adresses\n\nLes adresses sont parmis les informations les plus utiles pour la carte.\n\nAlors que les adresses sont souvent représentées comme faisant partie des rues, dans OpenStreetMap, les adresses sont enregistrées comme attributs des bâtiments le long des rues.\n\nVous pouvez ajouter une adresse sur les éléments modélisés avec un polygone\net sur ceux modélisés avec des points. La meilleure source de données afin\nde cartographier les adresses reste le relevé sur le terrain ou les connaissances personnelles, car comme pour tous les autres éléments, la copie de données à partir de contenu non libre de droits comme Google Maps est strictement interdite.\n",
-            "inspector": "# Utilisation de l'inspecteur\n\nL'inspecteur est l'élément de l'interface utilisateur qui apparaît à droite de\nla page quand un élément est sélectionné.\n\nIl permet de mettre à jour les détails concernant l'élément sélectionné.\n\n### Sélectionner un type d'élément\n\nAprès ajout d'un point, d'une ligne ou d'un polygone, vous pouvez indiquer de\nquel type d'élément il s'agit : une route principale ou résidentielle, un\nsupermarché, un café... L'inspecteur affiche des boutons pour les éléments les\nplus communs, et vous pouvez trouver les autres à l'aide du formulaire de recherche.\n\nCliquez sur 'i' dans le coin en bas à droite des boutons pour en savoir plus sur\nl'élément dont il s'agit. Cliquez sur le bouton pour choisir cet élément.\n\n### Utiliser les formulaires et les tags\n\nAprès avoir choisi le type d'élément, ou lorsque vous sélectionnez un élément\ndont la nature est déjà indiquée, l'inspecteur affiche des champs comprenant des\ndétails sur l'élément concerné - adresse, nom, etc.\n\nEn-dessous des champs, vous pouvez cliquer sur les icônes pour ajouter des\ndétails supplémentaires, comme des informations issues de [Wikipedia](http://www.wikipedia.org/),\ndes renseignements sur l'accès handicapé, ou plus encore.\n\nEn bas de l'inspecteur, cliquez sur 'Attributs Supplémentaires' pour ajouter des\nattributs arbitraires à l'élément. [Taginfo](http://taginfo.openstreetmap.org/) est\nune excellente ressource pour en savoir plus sur les combinaisons d'attributs les\nplus fréquentes.\n\nLes changements que vous effectuez dans l'inspecteur sont immédiatement visibles\nsur la carte. Vous pouvez les annulez dès que vous le souhaitez en cliquant sur 'annuler'.\n"
+            "help": {
+                "title": "Aide",
+                "welcome": "Bienvenue dans l'iD editor de [OpenStreetMap](https://www.openstreetmap.org/). Avec cet éditeur, vous pouvez mettre à jour OpenStreetMap directement depuis votre navigateur internet.",
+                "open_data_h": "Données libres",
+                "open_data": "Les modifications que vous faites sur cette carte seront visibles par tous les utilisateurs d'OpenStreetMap. Vos modification peuvent se baser sur vos connaissances personnelles, des enquêtes de terrain, des images aériennes ou des photos prises dans la rue. Copier des informations de sources commerciales telles que Google Maps [is strictly forbidden] (https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Avant de commencer",
+                "before_start": "Vous devez maîtriser OpenStreetMap et cet éditeur avant de commencer à modifier. iD comprend un guide pour vous apprendre les bases de la modification d'OpenStreetMap. Cliquez sur « Commencer le tutoriel » sur cet écran pour suivre le guide - cela ne prend que 15 minutes environ.",
+                "open_source_h": "Open source",
+                "open_source": "L'éditeur iD est un projet collaboratif open source, et vous êtes en train d'utiliser la version {version}. Le code source est disponible [sur GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Vous pouvez contribuer à iD en [traduisant](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) ou en [déclarant des bugs](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Présentation",
+                "navigation_h": "Navigation",
+                "navigation_drag": "Vous pouvez vous déplacer sur la carte en laissant appuyé le {leftclick} bouton gauche de la souris et en la déplaçant. Vous pouvez aussi utiliser les flèches `↓`, `↑`, `←`, `→` de votre clavier.",
+                "navigation_zoom": "Vous pouvez zoomer et dézoomer en tournant la molette de la souris, ou en cliquant sur les boutons {plus} / {minus} sur le côté de la carte. Vous pouvez aussi utiliser les touches `+`, `-` de votre clavier.",
+                "features_h": "Éléments de la carte.",
+                "features": "Nous utilisons le mot *élément* pour décrire les objets qui apparaissent sur la carte, telles que les routes, batiments ou points d'intérêts. Quoi que ce soit dans le monde réel peut être représenté par un élément dans OpenStreetMap. Les éléments de la carte y sont représentés par des *point*, *lignes* ou *polygones*.",
+                "nodes_ways": "Dans OpenStreetMap, les points sont parfois appelés des *nœuds*, et les lignes et polygones des *chemins*."
+            },
+            "editing": {
+                "title": "Modifier et sauvegarder",
+                "select_h": "Selectionner",
+                "select_left_click": "{clic gauche} Cliquez avec le bouton gauche de la souris sur une fonctionnalité pour la sélectionner. Ceci le mettra en surbrillance, et la barre latérale affichera des détails de cette fonctionnalité, tels que son nom ou son adresse.",
+                "select_right_click": "{rightclick} Le click droit sur un élément affiche le menu d'édition, qui permet d'effectuer certaines opérations sur cet élément comme le tourner, le déplacer ou le supprimer.",
+                "multiselect_h": "Sélection multiple",
+                "multiselect_shift_click": "`{shift}`+{leftclick} permet de sélectionner plusieurs éléments en même temps. Cela permet de déplacer ou de supprimer plusieurs objets d'un coup.",
+                "undo_redo_h": "Annuler & Rétablir",
+                "undo_redo": "Vos modifications sont enregistrées localement dans votre navigateur tant que vous ne les envoyez pas sur les serveurs d'OpenStreetMap. Vous pouvez annuler vos action en appuyant sur le bouton {undo} **Annuler** et les refaire en appuyant sur le bouton {redo} **Refaire**.",
+                "save_h": "Sauvegarder",
+                "save": "Cliquez sur {save} **Enregistrer** pour envoyer vos modifications à OpenStreetMap. Enregistrez fréquemment !",
+                "upload_h": "Téléverser",
+                "backups_h": "Sauvegarde automatique",
+                "backups": "Si vous ne pouvez pas terminer vos modifications tout de suite, par exemple si votre ordinateur s’éteint ou si vous fermez votre navigateur, votre travail est enregistré. Vous pouvez revenir plus tard (avec le même navigateur, sur la même ordinateur) et iD vous proposera de reprendre là où vous vous étiez arrêté.",
+                "keyboard_h": "Raccourcis clavier",
+                "keyboard": "Vous pouvez voir une liste de raccourcis clavier en pressant la touche '?'."
+            },
+            "feature_editor": {
+                "title": "Éditeur d'élément",
+                "intro": "*L'éditeur d'élément* apparaît à coté de la carte et permet de voir et d'éditer les informations relatives à l'élément sélectionne",
+                "definitions": "La première section indique le type d'élément. La seconde contient les *champs* qui indiquent les attributs de l'élément, comme son nom ou son adresse.",
+                "type_h": "Type d'élément",
+                "type": "Vous pouvez cliquer sur le type d'un élément pour le changer pour un autre type. Tout ce qui exist dans le monde réel peut être ajouter dans OpenStreetMap, Il y a donc de milliers de types possibles",
+                "type_picker": "Le sélectionneur de type affiche les types d'éléments les plus fréquents, tels que les parcs, hôpitaux, restaurants, routes et bâtiments. Vous pouvez tout cherchez en tapant ce que vous voulez dans le champs de recherche. Vous pouvez aussi cliquer sur l'icône {inspect} **Info** à côté du type de l'élément pour en apprendre plus.",
+                "fields_h": "Champs",
+                "fields_all_fields": "La section *Tous les champs* contient toutes les informations qui peuvent être éditées. Dans OpenStreetMap, tous les champs sont facultatifs. Vous pouvez toujours les laisser vides en cas de doute.",
+                "fields_add_field": "Vous pouvez aussi cliquer sur le menu déroulant \"Ajouter un champ\" pour ajouter plus d'informations, comme une description, un lien Wikipédia, un accès handicapé, et cetera...",
+                "tags_h": "Tags"
+            },
+            "points": {
+                "title": "Points",
+                "add_point_h": "Ajouter des Points",
+                "move_point_h": "Déplacer des Points",
+                "delete_point_h": "Supprimer des Points "
+            },
+            "lines": {
+                "title": "Lignes",
+                "add_line_h": "Ajouter des Lignes",
+                "modify_line_h": "Modifier des Lignes",
+                "move_line_h": "Déplacer des Lignes",
+                "delete_line_h": "Supprimer des lignes"
+            },
+            "areas": {
+                "add_area_h": "Ajouter des polygones",
+                "square_area_h": "Donner une forme orthogonale.",
+                "modify_area_h": "Modifier des polyognes",
+                "delete_area_h": "Supprimer des polygones"
+            },
+            "relations": {
+                "title": "Relations",
+                "edit_relation_h": "Éditer des Relations",
+                "relation_types_h": "Types de Relation",
+                "turn_restriction_h": "Interdictions de tourner",
+                "route_h": "Chemins",
+                "boundary_h": "Frontières"
+            },
+            "imagery": {
+                "title": "Fond de carte",
+                "sources_h": "Sources des images",
+                "offsets_h": "Ajustement du fond de carte"
+            },
+            "streetlevel": {
+                "title": "Photos de la rue",
+                "using_h": "Utiliser des photos de la rue."
+            },
+            "gps": {
+                "title": "Traces GPS",
+                "using_h": "Utilisation des traces GPS",
+                "using": "Pour utiliser une trace GPS, faites la glisser dans l'éditeur. Si elle est reconnue, elle apparaîtra en violet sur la carte. Cliquez sur {data} **Données Carte** pour montrer, cacher ou zoomer sur la trace GPS.",
+                "tracing": "La trace GPS n'est pas envoyée à OpenStreetMap. Le meilleur moyen de l'utiliser est de dessiner sur la carte en s'en servant de modèle.",
+                "upload": "Vous pouvez aussi [uploader vos données GPS sur OpenStreetMap](https://www.openstreetmap.org/trace/create) pour que d'autres utilisateurs puissent les utiliser."
+            }
         },
         "intro": {
             "done": "fait",
             },
             "areas": {
                 "title": "Polygones",
-                "add_playground": "Les *polygones* sont utilisés pour afficher les limites d’éléments comme les lacs, bâtiments et zones résidentielles.{br}Ils peuvent aussi servir à cartographier des éléments de façon plus détaillée qu'avec des points. **Cliquez sur le bouton {button} Polygone pour en ajouter un.**",
                 "start_playground": "Ajoutons une aire de jeu pour enfant sur la carte en dessinant un polygone. Les polygones sont dessinés en plaçant des *nœuds* pour définir les bords de l'élément. **Cliquez ou appuyez sur la barre d'espace pour placer le premier nœud sur l'un des angles de l'aire de jeu.**",
                 "continue_playground": "Continuez à dessiner le polygone en plaçant d'autres nœuds le long de l'aire de jeu. Vous pouvez connecter le polygone au chemin piéton existant. {br} Astuce : Vous pouvez maintenir la touche  {Alt} pour éviter aux nœuds de se connecter à d'autres éléments. ** continuez à dessiner le polygone de l'aire de jeux **",
                 "finish_playground": "Terminez le polygone avec la touche Entrée ou en cliquant une nouvelle fois sur son premier ou son dernier nœud. **Terminez le polygone d'aire de jeu.**",
                     "title": "Sélection",
                     "select_one": "Sélectionner un seul élément",
                     "select_multi": "Sélectionner plusieurs éléments",
-                    "lasso": "Dessiner une sélection englobante autour des éléments"
+                    "lasso": "Dessiner une sélection englobante autour des éléments",
+                    "search": "Trouver des éléments correspondant à la recherche."
                 },
                 "with_selected": {
                     "title": "Avec l'élément sélectionné",
                 "brand": {
                     "label": "Marque"
                 },
+                "brewery": {
+                    "label": "Bières à la pression"
+                },
                 "bridge": {
                     "label": "Type",
                     "placeholder": "Défaut"
                     "label": "Capacité",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Sens",
-                    "options": {
-                        "E": "Est",
-                        "ENE": "Est-Nord-Est",
-                        "ESE": "Est-Sud-Est",
-                        "N": "Nord",
-                        "NE": "Nord-Est",
-                        "NNE": "Nord-Nord-Est",
-                        "NNW": "Nord-Nord-Ouest",
-                        "NW": "Nord-Ouest",
-                        "S": "Sud",
-                        "SE": "Sud-Est",
-                        "SSE": "Sud-Sud-Est",
-                        "SSW": "Sud-Sud-Ouest",
-                        "SW": "Sud-Ouest",
-                        "W": "Ouest",
-                        "WNW": "Ouest-Nord-Ouest",
-                        "WSW": "Ouest-Sud-Ouest"
-                    }
-                },
                 "castle_type": {
                     "label": "Type"
                 },
-                "clock_direction": {
-                    "label": "Sens",
-                    "options": {
-                        "anticlockwise": "Sens anti-horaire",
-                        "clockwise": "Sens horaire"
-                    }
-                },
                 "clothes": {
                     "label": "Vêtements"
                 },
                 "diaper": {
                     "label": "Table à langer"
                 },
+                "direction_cardinal": {
+                    "label": "Direction",
+                    "options": {
+                        "E": "Est",
+                        "ENE": "Est-Nord-Est",
+                        "ESE": "Est-Sud-Est",
+                        "N": "Nord",
+                        "NE": "Nord-Est",
+                        "NNE": "Nord-Nord-Est",
+                        "NNW": "Nord-Nord-Ouest",
+                        "NW": "Nord-Ouest",
+                        "S": "Sud",
+                        "SE": "Sud-Est",
+                        "SSE": "Sud-Sud-Est",
+                        "SSW": "Sud-Sud-Ouest",
+                        "SW": "Sud-Ouest",
+                        "W": "Ouest",
+                        "WNW": "Ouest-Nord-Ouest",
+                        "WSW": "Ouest-Sud-Ouest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direction",
+                    "options": {
+                        "anticlockwise": "Sens anti-horaire",
+                        "clockwise": "Sens horaire"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direction",
+                    "options": {
+                        "backward": "Vers l'arrière",
+                        "both": "Les deux / Tous",
+                        "forward": "Vers l'avant"
+                    }
+                },
                 "display": {
                     "label": "Affichage"
                 },
                     "label": "Niveau"
                 },
                 "levels": {
-                    "label": "Étages",
+                    "label": "Nombre de niveaux",
                     "placeholder": "2, 4, 6..."
                 },
                 "lit": {
                 "memorial": {
                     "label": "Type"
                 },
-                "milestone_position": {
-                    "label": "Position de la borne",
-                    "placeholder": "Distance à une décimale (123,4)"
+                "monitoring_multi": {
+                    "label": "Surveillance"
                 },
                 "mtb/scale": {
                     "label": "Difficulté VTT",
                 "oneway": {
                     "label": "Sens unique",
                     "options": {
+                        "alternating": "En alternance",
                         "no": "Non",
+                        "reversible": "Réversible",
                         "undefined": "Par défaut : Non",
                         "yes": "Oui"
                     }
                 "oneway_yes": {
                     "label": "Sens unique",
                     "options": {
+                        "alternating": "En alternance",
                         "no": "Non",
+                        "reversible": "Réversible",
                         "undefined": "Par défaut : Oui",
                         "yes": "Oui"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direction",
-                    "options": {
-                        "backward": "Vers l'arrière",
-                        "forward": "Vers l'avant"
-                    }
-                },
                 "park_ride": {
                     "label": "Parking-relais"
                 },
                 "railway": {
                     "label": "Type"
                 },
+                "railway/position": {
+                    "label": "Position de la borne",
+                    "placeholder": "Distance à une décimale (123,4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Direction",
+                    "options": {
+                        "backward": "Vers l'arrière",
+                        "both": "Les deux / Tous",
+                        "forward": "Vers l'avant"
+                    }
+                },
                 "rating": {
                     "label": "Puissance"
                 },
                 "recycling_accepts": {
                     "label": "Accepte"
                 },
-                "recycling_type": {
-                    "label": "Type de recyclage",
-                    "options": {
-                        "centre": "Déchèterie",
-                        "container": "Conteneur de recyclage"
-                    }
-                },
                 "ref": {
                     "label": "Code d'identification"
                 },
+                "ref/isil": {
+                    "label": "Code ISIL"
+                },
                 "ref_aeroway_gate": {
                     "label": "Numéro de porte"
                 },
                 "traffic_signals": {
                     "label": "Feu de signalisation spécifique"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direction",
+                    "options": {
+                        "backward": "Vers l'arrière",
+                        "both": "Les deux / Tous",
+                        "forward": "Vers l'avant"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Visibilité du sentier",
                     "options": {
                     "terms": "télécorde, telecorde, téléski à câble bas, fil neige, téléski, tire-fesse, rope tow lift"
                 },
                 "aerialway/station": {
-                    "name": "Gare de remontée mécanique",
-                    "terms": "départ, arrivée, station, remontée mécanique, remontee mecanique, aerialway"
+                    "name": "Gare de remontée mécanique"
                 },
                 "aerialway/t-bar": {
                     "name": "Téléski bi-place",
                     "terms": "change, bureau de change, échange, devises, échange de devises, intermédiaire financier de change, banque de devises"
                 },
                 "amenity/bus_station": {
-                    "name": "Gare routière",
-                    "terms": "gare de bus, gare de cars, Gare, Arrêt, Arrêt de bus, bus station, bus, cars"
+                    "name": "Gare routière"
                 },
                 "amenity/cafe": {
                     "name": "Café",
                     "terms": "Café, bar, salon de thé, pub, brasserie, restaurant, cafe"
                 },
+                "amenity/car_pooling": {
+                    "name": "Covoiturage"
+                },
                 "amenity/car_rental": {
                     "name": "Location de voiture",
                     "terms": "Location de voitures, loueur de voiture, loueur de véhicule, car rental"
                     "terms": "fast food, restauration rapide, service au comptoir, vente à emporter, à emporter, a emporter, burger, sandwich, kebab"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal ferry",
-                    "terms": "terminal des ferries, gare maritime, ferry, embarquement, traversée, transport maritime, transport en mer, port"
+                    "name": "Terminal ferry"
                 },
                 "amenity/fire_station": {
                     "name": "Caserne de pompiers",
                     "name": "Bibliothèque",
                     "terms": "Bibliothèque, Médiathèque"
                 },
+                "amenity/love_hotel": {
+                    "name": "Love hôtel"
+                },
                 "amenity/marketplace": {
                     "name": "Marché",
                     "terms": "Marché, Place de marché"
                     "terms": "Services publics des parcs nationaux"
                 },
                 "amenity/recycling": {
-                    "name": "Recyclage",
-                    "terms": "déchèterie,déchetterie"
+                    "name": "Conteneur de recyclage",
+                    "terms": "bulle à verre,bulles à verre,container de recyclage,benne de recyclage,point de collecte"
                 },
                 "amenity/recycling_centre": {
                     "name": "Déchetterie",
-                    "terms": "centre de recyclage"
+                    "terms": "centre de recyclage,déchèterie,déchetterie,recyparc,parc à conteneurs,écocentre"
                 },
                 "amenity/register_office": {
                     "name": "Bureau d'état-civil"
                     "name": "Grange",
                     "terms": "grange, hangar agricole, bâtiment agricole, stockage, grenier, abri, remise, étable, ferme, barn"
                 },
+                "building/boathouse": {
+                    "name": "Hangar à bateaux"
+                },
+                "building/bungalow": {
+                    "name": "Bungalow"
+                },
                 "building/bunker": {
                     "name": "Bunker"
                 },
                 },
                 "building/detached": {
                     "name": "Maison individuelle",
-                    "terms": "maison individuelle, pavillon, maison indépendante, maison, building detached, detached house, villa"
+                    "terms": "maison individuelle, pavillon, maison indépendante, maison, building detached, detached house, villa, maison quatre façades"
                 },
                 "building/dormitory": {
                     "name": "Résidence étudiante",
                 "building/entrance": {
                     "name": "Entrée/Sortie"
                 },
+                "building/farm": {
+                    "name": "Corps de ferme"
+                },
                 "building/garage": {
                     "name": "Garage privé",
                     "terms": "garage, box, abri, hangar, parcage, parking, voiture"
                     "name": "Bâtiment pré-scolaire - école maternelle, jardin d'enfants",
                     "terms": "école maternelle, école enfantine, jardin d'enfants, école primaire, école, écoliers,  petite section, moyenne section, grande section, PS-MS-GS, kindergarten, crèche, halte-garderie"
                 },
+                "building/mosque": {
+                    "name": "Mosquée"
+                },
                 "building/public": {
                     "name": "Bâtiment public",
                     "terms": "Bâtiment public"
                     "name": "Toit",
                     "terms": "Voûte, Toit ouvert, Marché couvert"
                 },
+                "building/ruins": {
+                    "name": "Ruines"
+                },
                 "building/school": {
                     "name": "Bâtiment scolaire - élémentaire ou secondaire",
                     "terms": "école élémentaire, école primaire, collège, lycée, \ncycles primaires et secondaires, enseignements élémentaire et secondaire, \nenseignement élémentaire, enseignement secondaire, \nétablissement d'enseignement élémentaire, établissement d'enseignement secondaire, \nécole, écoliers, CP-CE1-CE2-CM1-CM2, college, lycee, school"
                     "name": "Étable",
                     "terms": "Étable"
                 },
+                "building/stadium": {
+                    "name": "Stade"
+                },
                 "building/static_caravan": {
                     "name": "Mobil home fixe",
                     "terms": "Mobil home statique"
                 },
+                "building/temple": {
+                    "name": "Temple"
+                },
                 "building/terrace": {
                     "name": "Rangée de maisons",
                     "terms": "maisons mitoyennes, maisons en bandes, logements en bandes, rangée de bâtiments, rangée d'habitations, building terrace, terraced houses, terrace"
                     "name": "Terrain de camping",
                     "terms": "Emplacement de camping"
                 },
+                "circular": {
+                    "name": "Rond-point"
+                },
                 "club": {
                     "name": "Club",
                     "terms": "Club"
                     "terms": "Piste cavalière, Sentier à chevaux, Sentier pour chevaux"
                 },
                 "highway/bus_stop": {
-                    "name": "Arrêt de bus",
-                    "terms": "Arrêt de bus, Gare, Gare routière"
+                    "name": "Arrêt de bus"
                 },
                 "highway/corridor": {
                     "name": "Couloir intérieur",
                     "name": "Forêt",
                     "terms": "Forêt"
                 },
-                "landuse/garages": {
-                    "name": "Garages",
-                    "terms": "Garages privés, boxes"
-                },
                 "landuse/grass": {
                     "name": "Herbe",
                     "terms": "Herbe"
                     "name": "Terrain vierge",
                     "terms": "Terrain vierge"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Serre d'horticulture"
+                },
                 "landuse/harbour": {
                     "name": "Havre",
                     "terms": "beateau,navire,port,baie"
                     "name": "Mât",
                     "terms": "communication,antenne,radio,télécommunication,téléphonie"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Station de surveillance",
+                    "terms": "Station de surveillance, météorologie, sismologie, séisme, climat, pression, atmosphère."
+                },
                 "man_made/observation": {
                     "name": "Tour d'observation",
                     "terms": "Tour d'observation, Mirador"
                     "terms": "Comptable, Expert-comptable."
                 },
                 "office/administrative": {
-                    "name": "Bureau administratif",
-                    "terms": "Bureau administratif"
+                    "name": "Bureau administratif"
                 },
                 "office/adoption_agency": {
                     "name": "Agence d'adoption",
                 },
                 "office/advertising_agency": {
                     "name": "Agence de publicité",
-                    "terms": "Agence de publicité, Agence publicitaire"
+                    "terms": "Agence de publicité, Agence publicitaire, Agence de communication."
                 },
                 "office/architect": {
                     "name": "Architecte",
                     "name": "Organisation de bienfaisance/charité",
                     "terms": "Organisation de bienfaisance, Organisation de charité"
                 },
-                "office/company": {
-                    "name": "Bureau d'entreprise",
-                    "terms": "Bureau d'entreprise, Siège social"
-                },
                 "office/coworking": {
                     "name": "Espace de coworking",
                     "terms": "Espace de bureau partagé, Espace de coworking."
                     "terms": "Cabinet d'avocats"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notaire",
-                    "terms": "Notaire"
+                    "name": "Notaire"
                 },
                 "office/moving_company": {
                     "name": "Entreprise de déménagement",
                 },
                 "office/quango": {
                     "name": "Autorité administrative indépendante ",
-                    "terms": "Autorité administrative indépendante, ONG quasi-autonome, QUANGO."
+                    "terms": "Autorité administrative indépendante, ONG quasi-autonome, AAI, QUANGO."
                 },
                 "office/research": {
                     "name": "Organisme de recherche",
                     "name": "Transformateur",
                     "terms": "Transformateur"
                 },
-                "public_transport/platform": {
-                    "name": "Plateforme d'attente",
-                    "terms": "Quai"
+                "public_transport/linear_platform_bus": {
+                    "name": "Arrêt de bus"
                 },
-                "public_transport/stop_position": {
-                    "name": "Position exacte d’arrêt du véhicule sur le « way » d’une route de transport en commun",
-                    "terms": "Arrêt"
+                "public_transport/linear_platform_ferry": {
+                    "name": "Quai pour ferry"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Station de tramway"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Station de monorail"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Station de métro"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Gare ferroviaire"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Station de tramway"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Arrêt de bus"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Quai pour ferry"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Station de tramway"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Station de monorail"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Station de métro"
+                },
+                "public_transport/platform_train": {
+                    "name": "Gare ferroviaire"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Station de tramway"
+                },
+                "public_transport/station_bus": {
+                    "name": "Gare routière"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Terminal ferry"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Station de tramway"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Station de monorail"
+                },
+                "public_transport/station_subway": {
+                    "name": "Station de métro"
+                },
+                "public_transport/station_train": {
+                    "name": "Gare ferroviaire"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Gare ferroviaire (arrêt à la demande)"
+                },
+                "public_transport/station_tram": {
+                    "name": "Station de tramway"
                 },
                 "railway": {
                     "name": "Ferroviaire"
                     "terms": "Funiculaire"
                 },
                 "railway/halt": {
-                    "name": "Halte ferroviaire",
-                    "terms": "Arrêt ferroviaire, Arrêt"
+                    "name": "Gare ferroviaire (arrêt à la demande)"
                 },
                 "railway/level_crossing": {
                     "name": "Passage à niveau (route)",
                     "terms": "Voie ferrée étroite"
                 },
                 "railway/platform": {
-                    "name": "Quai de gare ferroviaire",
-                    "terms": "Quai de gare, Quai"
+                    "name": "Gare ferroviaire"
                 },
                 "railway/rail": {
                     "name": "Voie ferrée",
                     "terms": "<translate with synonyms or related terms for 'Railway Signal', separated by commas>"
                 },
                 "railway/station": {
-                    "name": "Gare ferroviaire",
-                    "terms": "Gare ferroviaire, Gare, Arrêt"
+                    "name": "Gare ferroviaire"
                 },
                 "railway/subway": {
                     "name": "Métropolitain",
                     "name": "Tramway",
                     "terms": "Tram, Tramway"
                 },
-                "railway/tram_stop": {
-                    "name": "Arrêt de tramway",
-                    "terms": "tram,tramway,station de tramway"
-                },
                 "relation": {
                     "name": "Relation",
                     "terms": "Relation"
                     "terms": "Bijoutier"
                 },
                 "shop/kiosk": {
-                    "name": "Kiosque à journaux",
-                    "terms": "Kiosque à journaux"
+                    "name": "Kiosque",
+                    "terms": "Kiosque"
                 },
                 "shop/kitchen": {
                     "name": "Cuisiniste",
                     "name": "Itinéraire équestre",
                     "terms": "Trajet équestre"
                 },
+                "type/route/light_rail": {
+                    "name": "Itinéraire de métro léger",
+                    "terms": "Itinéraire de métro léger"
+                },
                 "type/route/pipeline": {
                     "name": "Itinéraire de pipeline",
                     "terms": "Pipeline, gazoduc, oléoduc"
                 },
+                "type/route/piste": {
+                    "name": "Itinéraire de Ski",
+                    "terms": "Itinéraire de Ski"
+                },
                 "type/route/power": {
                     "name": "Itinéraire électrique",
                     "terms": "Ligne électrique"
                     "name": "Itinéraire routier",
                     "terms": "Route, rue, chemin, sentier"
                 },
+                "type/route/subway": {
+                    "name": "Itinéraire de Métro",
+                    "terms": "Itinéraire de Métro"
+                },
                 "type/route/train": {
                     "name": "Itinéraire ferroviaire",
                     "terms": "Voie ferrée, chemin de fer"
                 "description": "Images satellite DigitalGlobe premium",
                 "name": "Images DigitalGlobe premium"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Termes & commentaires"
+                },
+                "description": "Limites et dates des images. Les textes sont visibles à partir du niveau de zoom 14",
+                "name": "Images DigitalGlobe Premium Vintage"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Termes & commentaires"
                 "description": "Images satellite DigitalGlobe standard",
                 "name": "Images DigitalGlobe standard"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Termes & commentaires"
+                },
+                "description": "Limites et dates des images. Les textes sont visibles à partir du niveau de zoom 14",
+                "name": "Images DigitalGlobe Standard Vintage"
+            },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "Termes & commentaires"
                 "name": "Données géographiques et topologiques intégrées et encodées 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, données cartographiques des contributeurs OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Vélo"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, données cartographiques des contributeurs OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Randonnée"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, données cartographiques des contributeurs OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, données cartographiques des contributeurs OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Patinage"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, données cartographiques des contributeurs OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Sports d'hiver"
             },
             "basemap.at": {
index 1b1806b3b77926664afa62a9db4ca9784de54c56..6d78ff8943cdb06528f9fb26dc39645d60a033f7 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Fai clic para engadir máis vértices á liña. Fai clic noutras liñas para conectalas, e fai dobre clic para rematar a liña."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Isto non se pode editar xa que está conectado cun elemento oculto."
             }
         },
         "operations": {
                     "line": "Liña borrada",
                     "area": "Área borrada.",
                     "relation": "Relación borrada.",
-                    "multiple": "Borrados {n} recursos."
+                    "multiple": "Borrados {n} elementos."
                 },
                 "too_large": {
                     "single": "Este elemento non pode ser borrado porque non é totalmente visible.",
                 },
                 "incomplete_relation": {
                     "single": "Este elemento non pode ser eliminado porque aínda non foi completamente baixado.",
-                    "multiple": "Estes recursos non poden ser eliminados por non estar totalmente baixados."
+                    "multiple": "Estes elementos non poden ser eliminados por non estar totalmente baixados."
                 },
                 "part_of_relation": {
-                    "single": "Este recurso non pode ser eliminado porque é parte dunha relación maior. Debe primeiro eliminarlo da relación.",
-                    "multiple": "Estes recursos non poden ser eliminados porque son parte de relacións maiores. Debe en primeiro lugar eliminalos das relacións."
+                    "single": "Este elemento non pode ser eliminado porque é parte dunha relación maior. Debes primeiro eliminalo da relación.",
+                    "multiple": "Estes elementos non poden ser eliminados porque son parte de relacións maiores. Debes en primeiro lugar eliminalos das relacións."
                 },
                 "connected_to_hidden": {
-                    "single": "Este recurso non poden ser borrado porque conecta cun recurso agochado.",
-                    "multiple": "Estes recursos non poden ser borrados porque conectan con recursos agochados."
+                    "single": "Este elemento non poden ser borrado porque está conectado cun elemento agochado.",
+                    "multiple": "Estes elementos non poden ser borrados porque conectan con elementos agochados."
                 }
             },
             "add_member": {
                 "annotation": "Unidos {n} elementos.",
                 "not_eligible": "Estes elementos non se poden unir.",
                 "not_adjacent": "Estos elementos non se poden fusionar porque os seus extremos non están ligados.",
-                "restriction": "Estos elementos non ponden ser unidos porque polo menos un é membro dunha \"{relation}\" relación.",
+                "restriction": "Estes elementos non se poden unir porque polo menos un delees é un membro dunha relación \"{relation}\".",
                 "incomplete_relation": "Estes elementos non se poden unir porque cando menos un deles non se descargou completamente.",
                 "conflicting_tags": "Estes elementos non se poden unir porque algunhas das súas etiquetas teñen valores contraditorios."
             },
                 },
                 "too_large": {
                     "single": "Este elemento non pode ser movido porque actualmente non é completamente visible.",
-                    "multiple": "Estes elementos non ponden ser movidos porque actualmente non son completamente visibles."
+                    "multiple": "Estes elementos non poden ser movidos porque actualmente non son completamente visibles."
                 },
                 "connected_to_hidden": {
                     "single": "Este elemento non pode ser movido proque está ligado a un elemento agochado.",
             },
             "reflect": {
                 "title": {
-                    "long": "Reflexar ao Longo",
-                    "short": "Reflexar ao Curto"
+                    "long": "Reflexar ao longo",
+                    "short": "Reflexar ao curto"
                 },
                 "description": {
                     "long": {
             "localized_translation_language": "Escoller idioma",
             "localized_translation_name": "Nome"
         },
+        "zoom_in_edit": "Fai zoom para editar",
         "login": "loguear",
         "logout": "saír",
         "loading_auth": "Conectando con OpenStreetMap...",
             "about_changeset_comments": "Acerca dos comentarios dos conxuntos de cambios",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Mencionaches Google neste comentario: lembra que a copia de Google Maps está estrictamente prohibida.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edicións de {users}",
                 "accuracy": "Precisión",
                 "unknown": "Descoñecido",
                 "show_tiles": "Amosar teselas",
-                "hide_tiles": "Ocultar teselas"
+                "hide_tiles": "Ocultar teselas",
+                "show_vintage": "Mostrar antigüidade",
+                "hide_vintage": "Ocultar antigüidade"
             },
             "history": {
                 "key": "H",
                 "title": "Medidas",
                 "selected": "{n} seleccionados",
                 "geometry": "Xeometría",
-                "closed": "pechado",
+                "closed_line": "liña pechada",
+                "closed_area": "área pechada",
                 "center": "Centro",
                 "perimeter": "Perímetro",
                 "length": "Lonxitude",
                 "centroid": "Centroide",
                 "location": "Localización",
                 "metric": "Métrico",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Número de nodos"
             }
         },
         "geometry": {
             "title": "Fondo",
             "description": "Axustes do fondo",
             "key": "B",
-            "percent_brightness": "{opacity}% brillo",
+            "backgrounds": "Fondos",
             "none": "Ningún",
             "best_imagery": "Mellor fonte de imaxes coñecida deste sitio",
             "switch": "Voltar a este fondo",
             "custom": "Personalizado",
             "custom_button": "Editar fondo personalizado",
-            "custom_prompt": "Introducir unha plantilla URL de mosaico. Os tokens válidos son:\n   - {zoom}/{z}, {x}, {y} para o esquema de mosaico Z/X/Y\n   - {ty} para coordenadas Y invertidas estilo TMS\n   - {u} para o esquema quadtile\n   - {switch:a,b,c} para multiplexado de servidores DNS\n\nExemplo:\n{example}",
-            "fix_misalignment": "Axustar offset da imaxe",
-            "imagery_source_faq": "De onde ven esta imaxe?",
+            "overlays": "Superposicións",
+            "imagery_source_faq": "Información das imaxes/Informar dun problema",
             "reset": "reiniciar",
-            "offset": "Arrastre en calquera parte da área gris de embaixo para axustar o desplazamento de imaxes ou ingrese os valores de desplazamento en metros.",
+            "display_options": "Opcións de visualización",
+            "brightness": "Brillo",
+            "contrast": "Contraste",
+            "saturation": "Saturación",
+            "sharpness": "Enfoque",
             "minimap": {
-                "description": "Mapa pequeno",
+                "description": "Mostrar minimapa",
                 "tooltip": "Mostrar un mapa reducido para facilitar a localización da área que se estea a mostrar. ",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Axustar offset da imaxe",
+            "offset": "Arrastre en calquera parte da área gris de embaixo para axustar o desplazamento de imaxes ou ingrese os valores de desplazamento en metros."
         },
         "map_data": {
             "title": "Datos de mapa",
             "status_code": "O servidor devolveu a referencia de estado {code}",
             "unknown_error_details": "Asegúrate de que estás conectado a internet.",
             "uploading": "Subindo trocos a OpenStreetMap...",
+            "conflict_progress": "Comprobando conflitos: {num} de {total}",
             "unsaved_changes": "Tes cambios sen gardar",
             "conflict": {
                 "header": "Resolvendo os conflitos de edición",
             "facebook": "Compartir no Facebook",
             "twitter": "Compartir no Twitter",
             "google": "Compartir no Google+",
-            "help_html": "Os cambios deben aparecer na capa \"Standard\" en poucos minutos. Outras capas, e certas características, pode levar máis tempo.",
+            "help_html": "Os teus cambios deberían aparecer na capa \"Estándar\" nuns minutos. Outras capas, e determinados elementos, poden tardar máis tempo.",
             "help_link_text": "Detalles",
             "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"
         },
         "splash": {
             "welcome": "Benvido ao editor de OpenStreetMap iD",
             "text": "iD é unha amigable pero potente ferramenta para contribuir ao mellor mapa libre do mundo. Esta é a versión {version}. Para obter máis información visita {website} e informa de erros en {github}.",
-            "walkthrough": "Comezar o titorial"
+            "walkthrough": "Comezar o titorial",
+            "start": "Editar agora"
         },
         "source_switch": {
             "live": "en liña",
             "untagged_area_tooltip": "Escolle un tipo de elemento que describa o que é esta área.",
             "untagged_relation": "Relación sen etiquetar",
             "untagged_relation_tooltip": "Escolle un tipo de elemento que describa o que é esta relación.",
-            "many_deletions": "Ti estás a borrar {n} elementos. Estás seguro de que queres facer isto? Isto o borrará do mapa e ninguén o verá en openstreetmap.org.",
             "tag_suggests_area": "A etiqueta {tag} suxire que a liña debería ser unha área, pero non é unha área.",
             "deprecated_tags": "Etiquetas obsoletas: {tags}"
         },
         "mapillary": {
             "view_on_mapillary": "Ver esta imaxe en Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Fotos ao nivel da rúa de OpenStreetCam",
+            "title": "Superposición de fotos (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Ver esta imaxe en OpenStreetCam"
+        },
         "help": {
             "title": "Axuda",
             "key": "H",
-            "help": "# Axuda\n\nEste é un editor para [OpenStreetMap](http://www.openstreetmap.org/), o mapa\nlibre e editable do mundo. Podes usalo para engadir e actualizar\ninformación da túa zona, facendo dun mapa mundial de código aberto e\ndatos abertos mellor para todos.\n\nAs edicións que podes facer neste mapa serán visibes para calquera que use\nOpenStreetMap. Para facer unha edición debes\n[iniciar sesión](https://www.openstreetmap.org/login).\n\nO [iD editor](http://ideditor.com/) é un proxecto colaborativo con\n[código fonte dispoñible en GitHub] (https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "#  Editar e gardar\n\nEste editor foi deseñado para traballar principalmente online, e agora estás accedendo a el a través dun sitio web.\n\n### Seleccionar elementos\n\nSelecciona elementos do mapa, coma unha estrada ou punto de interese, facendo clic sobre el no mapa. Isto resaltará a función seleccionada e abrirá un panel con detalles sobre el. Se fas clic co botón dereito, amosarase un menú con cousas que podes facer co elemento.\n\nPra escoller múltiplos elementos manten pulsada a tecla 'Shift' (Maiúsculas). Logo fai clic nos elementos que queiras seleccionar, ou arrastra sobre o mapa para debuxar un lazo que selecionará tódolos puntos que queden dentro da súa área\n\n### Gardar edicións\n\nCando fagas trocos como edicións de rúas, edificios ou lugares, son almacenados localmente ata que os subas ao servidor. Non te preocupes se tes un erro; podes desfacer os trocos facendo clic no botón desfacer, e refacer trocos no botón refacer.\n\nFai clic en 'Gardar' ao rematar un grupo de edicións: por exemplo, se remataches unha zona da cidade e queiras iniciar unha nova zona. Terás oportunidade de revisar o que fixeches, e o editor fará suxestións útiles e dará avisos se algo non está correcto nos trocos.\n\nSe che parece todo correcto, podes poñer un breve resumo explicando os cambios que fixeches, e logo fai clic en 'Subir' para que se publiquen os trocos en [OpenStreetMap.org](http://www.openstreetmap.org/), onde serán visibles a tódolos usuarios para que os empreguen e actualicen.\n\nSe non es quen de facer as edicións dunha sentada podes deixalo, e cando volvas (no mesmo navegador e ordenador), a aplicación do editor darache a oportunidade de restaurar e gardar o traballo feito\n\n###  Usar o editor\n\nPodes ver unha lista de atallos do teclado premendo a tecla `?`.\n",
-            "roads": "# Estradas\n\nPodes crear, corrixir, e borrar estradas con este editor. As estradas poden ser de todo tipo:\npistas, autoestradas, camiños, ciclopistas, e máis; calquer tipo de segmento polo que se acostume a pasar debería ser mapeado.\n\n### Seleccionar\n\nPincha sobre unha estrada para seleccionala. Mostrarase un esbozo, xunto\ncunha barra lateral que mostra máis información sobre a estrada. Se fas clic dereito sobre ela, terás un menú de accións que podes aplicar á estrada\n\n### Modificar\n\nMoitas veces vas ver que as estradas non están aliñadas coas imaxes por tras delas\nou cunha pista GPS. Podes axustar estradas para que estean no lugar axeitado.\n\nPrimeiro fai clic na estrada que queiras modificar. Iluminarase e amosará\nos puntos de control ao longo dela que podes arrastrar para mellorar a súa localización. Se queres engadir novos puntos de control para máis precisión, fai doble clic na parte da estrada na que queiras o novo nodo, e un punto engadirase.\n\nSe a estrada conecta con outra estrada, pero non se conecta correctamente sobre\no mapa, podes arrastrar un dos seus puntos de control sobre o outro punto na estrada\nco fin de unilas. Ter as estradas conectardas é importante para o mapa e esencial para proporcionar instrucións de conducción.\n\nTamén podes facer clic dereito sobre a estrada e escoller a ferramenta 'Mover', ou simplemente premer a tecla de acceso rápido `M`, para mover toda a estrada\nde vez, e logo premer de novo para gardar ese movemento.\n\n### Borrar\n\nSe unha estrada é totalmente incorrecta —se podes ver que non existe nas imaxes de satélite e, idealmente, ter confirmado localmente que non está presente— podes eliminala, o cal o quita do mapa. Sé cauteloso ao eliminar características;\ncomo calquera outra edición, os resultados son vistos por todos, e ten en conta que as imaxes de satélite moitas veces están desactualizadas, de xeito que a estrada pode estar simplemente recén construída.\n\nPodes eliminar unha estrada facendo clic nela e pulsando a tecla \"Suprimir\", ou facendo clic dereito nela e logo facendo clic na icona do lixo.\n\n### Crear\n\nAtopaches algún lugar no que debería haber un camiño, pero non o hai? Preme na icona \"liña\"\nna esquina superior esquerda do editor ou prema a tecla de acceso rápido `2` para comezar a debuxar.\n\nPreme no inicio da estrada no mapa para comezar a deseñar. Se a estrada\nramifica dende unha estrada existente, comeza premendo sobre o lugar onde elas se conectan.\n\nDespois, prema en puntos ao longo do camiño que sigan o camiño correcto, segundo imaxes de satélite ou GPS. Se a estrada que está deseñando cruza outra estrada, conéctaa\npremendo sobre o punto de intersección. Cando acabes co deseño, fai clic dúas veces ou preme \"Enter\" ou \"Intro\" no teclado.\n\n",
-            "gps": "# GPS\n\nAs trazas GPS gardadas son unha valiosa fonte de información para OpenStreetMap. Este editor\nsoporta trazas locais —arquivos `.gpx` no teu computador local—. Podes obter\neste tipo de trazas GPS cun varias apliacións de smartphone e tamén con\nhardware GPS persoal.\n\nPara obter información sobre como realizar trazados GPS, le\n[Mapeando con un SmartPhone, GPS o papel](http://learnosm.org/es/mobile-mapping/).\n\nPara utilizar unha traza GPX para o mapeado, arrastra e solta o arquivo GPX sobre o editor do mapa.\nDe ser recoñecido, será engadido ao mapa cunha liña en púrpura brillante. Fai clic no menú \"Datos do mapa\" no lado dereito para activar,\ndesactivar ou facer zoom nesta nova capa GPX.\n\nAs trazas GPX non se suben directamente a OpenStreetMap. O mellor xeito de\nusalas é deseñar no mapa usándoas como unha guía para as novas características a\nengadir, e ademáis [subilas a OpenStreetMap](http://www.openstreetmap.org/trace/create)\npara que outros usuarios as empreguen.\n",
-            "imagery": "# Imaxes\n\nAs imaxes aéreas son un recurso importante para o mapeado. Unha combinación de\nvoos aéreos, imaxes de satélite, e fontes compilados de forma libre están dispoñibles\nno editor baixo o menú 'Axustes do fondo' á dereita.\n\nPor omisión preséntase no editor unha capa de satélite de [Bing Maps](http://www.bing.com/maps/), pero a medida que vas movendo o mapa e facendo zoom a novas áreas xeográficas,\nnovas fontes estarán disponíbles. Nalgúns países, como Estados\nUnidos, Francia e Dinamarca teñen dispoñibles imaxes de moi alta calidade para algunhas áreas.\n\nAs imaxes ás veces están descentradas do mapa por mor dun erro\npor parte do provedor de imaxes. Se ves unha morea de camiños desprazadas con respecto ao fondo,\nnon as movas todas para coincidir co fondo. Pola contra, podes axustar\nas imaxes de xeito que coincidan cos datos existentes premendo en 'Axustar offset da imaxe' na\nparte inferior da interface de usuario da configuración de fondo.\n",
-            "addresses": "# Enderezos\n\nOs enderezos son algunhas das informacións máis útiles para o mapa.\n\nAínda que os enderezos son moitas veces representados como partes de rúas, en OpenStreetMap\nestán rexistrados como atributos de edificios e lugares ao longo das rúas.\n\nPodes engadir información de enderezos para lugares mapeados como contornos de construción\nasí como os mapeados como puntos individuais. A fonte ideal de datos de direccións\né unha investigación sobre o terreo ou coñecemento persoal. Como ocorre con calquera\noutra característica, a copia de fontes comerciais como Google Maps está estrictamente\nprohibida.\n",
-            "inspector": "# Usando o Inspector\n\nO inspector é a sección na parte esquerda da páxina que permite\nmodificar os detalles do elemento seleccionado.\n\n### Seleccionar un Tipo de Elemento\n\nDespois de engadir un punto, liña ou área, podes escoller o tipo de elemento que\né, como se é unha autoestrada ou rúa residencial, supermercado ou café.\nO inspector pode amosar botóns para os tipos de recursos comúns, e pode\natopar outros tipos escribindo o que estás a procurar no cadro de busca.\n\nPreme o 'i' na parte inferior dereita dun botón do tipo de elemento para\nsaber máis sobre el. Preme nun botón para escoller o tipo.\n\n### Usando formularios e edición de etiquetas\n\nDespois de seleccionar un tipo de elemento, ou cando se selecciona un elemento que xa\nten un tipo asignado, o inspector pode amosar campos con detalles sobre\no elemento como o seu nome e enderezo.\n\nPor baixo dos campos que ve, podes facer clic no menú desplegable  'Engadir campo' para engadir\noutros detalles, como unha ligazón a Wikipedia, o acceso de cadeiras de rodas, e moito máis.\n\nNa parte inferior do inspector, preme en 'etiquetas adicionais' para engadir arbitrariamente\noutras etiquetas ao elemento. [Taginfo](http://taginfo.openstreetmap.org/) é un\nexcelente recurso para aprender máis sobre as combinacións de etiquetas máis populares.\n\nOs cambios feitos no inspector aparecen aplicados ao mapa.\nPodes desfacelo en calquera momento premendo o botón 'Desfacer'.\n",
-            "buildings": "# Edificios\n\nOpenStreetMap é a base de datos de edificios máis grande do mundo. Podes crear\ne incrementar esta base de datos.\n\n### Seleccionar\n\nPodes seleccionar un edificio premendo no seu bordo. Isto destacará o edificio e abrirá unha barra lateral que mostra máis información\nsobre o edificio. Se fas clic co botón dereito, amosarase un menú de accións que podes executar no edificio.\n\n### Modificar\n\nAlgúns edificios está incorrectamente ubicados ou teñen etiquetas incorrectas.\n\nPara mover un edificio enteiro, seleciónao e preme o atallo de teclado `M`, ou fai clic dereito sobre el e escolle a ferramenta 'Mover'. Move\nco teu rato o edificio, e fai clic cando estea correctamente ubicado.\n\nPara corrixir a forma específica dun edificio, fai clic e arrastra os nós que forman\no bordo a lugares mellores.\n\n### Crear\n\nUnha das principais cuestións en torno ao engadindo de edificios ao mapa é que\nOpenStreetMap rexistra edificios tanto como formas e coma puntos. A regra de ouro\né _mapear un edificio como unha forma sempre que sexa posible_, e mapear empresas, casas,\ninstalacións, e outras cousas que operan fóra dos edificios como puntos situados\ndentro da forma do edificio.\n\nPara comezar a deseñar un edificio como unha forma preme no botón 'Área' na parte superior\nesquerda da interface, e para rematalo preme o boton 'Enter' no seu teclado\nou no primeiro nó deseñado para pechar a forma.\n\n### Borrar\n\nSe un edificio é totalmente incorrecto —se podes ver que non existe nas imaxes de satélite e, idealmente, ter confirmado localmente que non está presente— podes eliminalo, o cal o quita do mapa. Sé cauteloso ao eliminar características;\ncomo calquera outra edición, os resultados son vistos por todos, e ten en conta que as imaxes de satélite moitas veces están desactualizadas, de xeito que o edificio podería estar simplemente recén construído.\n\nPodes eliminar un edificio premendo sobre el para seleccionalo e logo premendo a tecla 'Suprimir', ou facendo clic dereito sobre el e logo facendo clic na icona do lixo.\n\n",
-            "relations": "# Relacións\n\nA relación é un tipo especial de recurso no OpenStreetMap que agrupa\noutros elementos. Por exemplo, dous tipos comúns de relacións son *relacións de ruta*,\nque agrupan tramos de estrada que pertencen a unha autoestrada ou autovía específica, e *multipolígonos*, que agrupan varias liñas que definen\nunha área complexa (unha con varias zonas ou buratos, como un donut).\n\nO conxunto de recursos nunha relación chámanse *membros*. Na barra lateral, podes\nver de que relacións un recurso é membro, e premer nunha relación\npara seleccionala. Cando se selecciona a relación, podes ver os seus\nmembros da lista na barra lateral, e tamén destacados no mapa.\n\nPara a maior parte, ID vai coidar de manter relacións automaticamente\nmentres edita. A principal cousa da que tes que ser consciente, é que se eliminas un\ntramo de estrada para redeseñalo con máis precisión, tes que asegurarse de que a\nnova sección é membro das mesmas relacións que o orixinal.\n\n## Editar Relacións\n\nSe desexa editar relacións, aquí está o básico.\n\nPara engadir un elemento a unha relación, selecciona o elemento, fai clic no botón \"+\" na sección \"Tódalas relacións\" da barra lateral, e escolle ou escribe o nome do elemento.\n\nPara crear unha nova relación, selecciona o primeiro elemento que deba ter a relación,\npreme no botón \"+\" na sección \"Tódalas relacións\", e seleccione \"Nova relación ...\".\n\nPara quitar un recurso dunha relación, selecciona o elemento e preme o botón lixo\nao lado da relación da que o queiras eliminar.\n\nPodes crear multipolígonos con furados usando a ferramenta \"Unir\". Debuxa dúas áreas (interior\ne exterior), mantén pulsada a tecla maiúsculas e preme en cada unha delas para seleccionar as dúas, e despois\npreme na tecla `C`. Outra opción é selecionar ambas, facer clic dereito sobre unha delas e\nlogo facer clic sobre o botón \"Unir\" (+).\n"
+            "help": {
+                "title": "Axuda"
+            }
         },
         "intro": {
             "done": "feito",
             },
             "areas": {
                 "title": "Áreas",
-                "add_playground": "As *áreas* son usadas para amosar límites de elementos tales como lagoas, edificios e zonas residenciais.{br}Poden ser empregadas para cartografar con maior detalle moitos dos elementos que normalmente cartografarías como puntos. **Fai clic no botón {button} Área para engadir a nova área.**",
+                "add_playground": "As *áreas* son usadas para amosar límites de elementos tales como lagoas, edificios e zonas residenciais.{br}Tamén poden ser empregadas para cartografar con maior detalle moitos dos elementos que normalmente cartografarías como puntos. **Fai clic no botón {button} Área para engadir unha nova área.**",
                 "start_playground": "Engadamos este parque infantil ao mapa debuxando unha área. As áreas debúxanse colocando *nodos* ao longo do bordo exterior do elemento. **Fai clic ou preme a barra espaciadora para poñer un nodo inicial nunha das esquinas do parque infantil.**",
                 "continue_playground": "Continúa debuxando a área colocando máis nodos ao longo do bordo do parque infantil. Está ben conectar a área cos camiños peonís existentes.{br}Consello: podes manter presa a tecla '{alt}' para evitar que os nodos se conecten nos elemetos próximos. **Continúa a debuxar a área do parque infantil.**",
                 "finish_playground": "Remata a área premendo enter, ou facendo clic outra vez no último ou no primeiro nodo. **Remata de debuxar a área para o parque infantil.**",
                     "label": "Capacidade",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Sentido",
-                    "options": {
-                        "E": "Leste",
-                        "ENE": "Les-nordeste",
-                        "ESE": "Les-sueste",
-                        "N": "Norte",
-                        "NE": "Nordeste",
-                        "NNE": "Nor-nordeste",
-                        "NNW": "Nor-noroeste",
-                        "NW": "Noroeste",
-                        "S": "Sur",
-                        "SE": "Sueste",
-                        "SSE": "Sur-sueste",
-                        "SSW": "Sur-suroeste",
-                        "SW": "Suroeste",
-                        "W": "Oeste",
-                        "WNW": "Oés-noroeste",
-                        "WSW": "Oés-suroeste"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipo"
                 },
-                "clock_direction": {
-                    "label": "Sentido",
-                    "options": {
-                        "anticlockwise": "Sentido antihorario",
-                        "clockwise": "Sentido horario"
-                    }
-                },
                 "clothes": {
                     "label": "Roupa"
                 },
                 "memorial": {
                     "label": "Tipo"
                 },
-                "milestone_position": {
-                    "label": "Fito de Posición",
-                    "placeholder": "Distancia cun decimal (123.4)"
-                },
                 "mtb/scale": {
                     "label": "Dificultade en bicicleta de montaña",
                     "options": {
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Dirección",
-                    "options": {
-                        "backward": "Atrás",
-                        "forward": "Adiante"
-                    }
-                },
                 "park_ride": {
                     "label": "Intermodal"
                 },
                 "recycling_accepts": {
                     "label": "Acepta"
                 },
-                "recycling_type": {
-                    "label": "Tipo de reciclaxe",
-                    "options": {
-                        "centre": "Centro de Reciclaxe",
-                        "container": "Contedor"
-                    }
-                },
                 "ref": {
                     "label": "Código de Referencia"
                 },
                     "name": "Troco de divisas",
                     "terms": "troco, cambio, divisa, moeda"
                 },
-                "amenity/bus_station": {
-                    "name": "Estación de autobuses",
-                    "terms": "bus, autobús, estación"
-                },
                 "amenity/cafe": {
                     "name": "Cafetería",
                     "terms": "cafetería, café, bar, tetería"
                 "amenity/fast_food": {
                     "name": "Comida rápida"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Terminal de ferry"
-                },
                 "amenity/fire_station": {
                     "name": "Parque de bombeiros"
                 },
                 "amenity/ranger_station": {
                     "name": "Estación de gardabosques"
                 },
-                "amenity/recycling": {
-                    "name": "Reciclaxe",
-                    "terms": "reciclaxe, contenedor, lixo, basura, orgánico, plásticos, vidrio, punto limpo"
-                },
                 "amenity/recycling_centre": {
                     "name": "Centro de Reciclaxe",
                     "terms": "centro de reciclaxe, punto limpo"
                     "name": "Camiño de ferradura",
                     "terms": "camiño, ferradura, cabalo"
                 },
-                "highway/bus_stop": {
-                    "name": "Parada de autobús",
-                    "terms": "parada, autobús, bus"
-                },
                 "highway/corridor": {
                     "name": "Corredor interior",
                     "terms": "corredor, pasillo"
                 "landuse/forest": {
                     "name": "Forestal"
                 },
-                "landuse/garages": {
-                    "name": "Garaxes"
-                },
                 "landuse/grass": {
                     "name": "Céspede",
                     "terms": "céspede, herba"
                 "office/administrative": {
                     "name": "Administración local"
                 },
-                "office/company": {
-                    "name": "Oficina de empresa"
-                },
                 "office/coworking": {
                     "name": "Espacio de cotraballo"
                 },
                     "terms": "bufete, avogados, legal"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notaría",
-                    "terms": "notaría, notario"
+                    "name": "Notaría"
                 },
                 "office/ngo": {
                     "name": "Oficina ONG"
                 "power/transformer": {
                     "name": "Transformador"
                 },
-                "public_transport/platform": {
-                    "name": "Plataforma"
-                },
-                "public_transport/stop_position": {
-                    "name": "Parada de transporte público"
-                },
                 "railway": {
                     "name": "Ferrocarril"
                 },
                 "railway/funicular": {
                     "name": "Funicular"
                 },
-                "railway/halt": {
-                    "name": "Halt Ferroviario"
-                },
                 "railway/level_crossing": {
                     "name": "Paso a nivel (estrada)",
                     "terms": "paso a nivel, cruce ferroviario, paso ferroviario, cruce a nivel"
                 "railway/narrow_gauge": {
                     "name": "Tren de Vía Estreita"
                 },
-                "railway/platform": {
-                    "name": "Plataforma"
-                },
                 "railway/rail": {
                     "name": "Vía de tren"
                 },
                 "railway/signal": {
                     "name": "Sinal Tren"
                 },
-                "railway/station": {
-                    "name": "Estación de ferrocarril"
-                },
                 "railway/subway": {
                     "name": "Metro"
                 },
                 "railway/tram": {
                     "name": "Tranvía"
                 },
-                "railway/tram_stop": {
-                    "name": "Parada de tranvía"
-                },
                 "relation": {
                     "name": "Relación"
                 },
                 "shop/jewelry": {
                     "name": "Xoiería"
                 },
-                "shop/kiosk": {
-                    "name": "Quiosco"
-                },
                 "shop/kitchen": {
                     "name": "Tenda de cociñas"
                 },
                 "name": "OSM Inspector: Lapelas"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos do mapa contribuidores do OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Marcador de Pistas: Ciclismo"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos do mapa contribuidores do OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Marcador de Pistas: Excursionismo"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos do mapa contribuidores do OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Marcador de Pistas: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, datos do mapa contribuidores do OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Marcador de Pistas: Skate"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, datos do mapa contribuidores do OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Marcadores de Pistas: Deportes de inverno"
             },
             "basemap.at": {
index 906e9b318bf09ab6b6ae9ffa90fc12ca0f027462..8bc964b1a9a70fa8db34af5a63801c99d0e764d9 100644 (file)
             "add": "ઉમેરો",
             "location": "સ્થાન"
         },
-        "background": {
-            "imagery_source_faq": "આ ચિત્રો ક્યાંથી આવે છે?"
-        },
         "map_data": {
             "title": "નકશાની માહિતી",
             "description": "નકશાની માહિતી",
index a30f46cbdf53a124206d1597c3247d43adc1fc12..35a7df336f81283fb426e684e7ebfe76e016b23c 100644 (file)
@@ -2,7 +2,7 @@
     "he": {
         "modes": {
             "add_area": {
-                "title": "×\90×\99×\96×\95ר",
+                "title": "ש×\98×\97",
                 "description": "ניתן להוסיף פארקים, בניינים, נהרות ואזורים נוספים למפה.",
                 "tail": "יש ללחוץ על המפה כדי להתחיל לצייר איזור כמו פארק, אגם או בניין."
             },
@@ -24,6 +24,9 @@
             },
             "draw_line": {
                 "tail": "יש ללחוץ כדי להוסיף קודקודים נוספים לקו. יש ללחוץ על קווים אחרים כדי להתחבר אליהם, ולחיצה כפולה כדי לסיים את ציור הקו."
+            },
+            "drag_node": {
+                "connected_to_hidden": "לא ניתן לערוך זאת עקב החיבור לתכונה נסתרת."
             }
         },
         "operations": {
                     "multiple": "נמחקו {n} תכונות."
                 },
                 "too_large": {
-                    "single": "אי אפשרות למחוק תכונה זו כי הפריט לא מופיע במלואו."
+                    "single": "אי אפשרות למחוק תכונה זו כי הפריט לא מופיע במלואו.",
+                    "multiple": "אי אפשר למחוק את התכונות האלה כיוון שלא מספיק מהן גלויות כרגע."
+                },
+                "incomplete_relation": {
+                    "single": "אי אפשר למחוק את התכונה הזאת כיוון שלא התקבלה לחלוטין.",
+                    "multiple": "אי אפשר למחוק את התכונות האלו כיוון שלא התקבלו לחלוטין."
+                },
+                "part_of_relation": {
+                    "single": "אי אפשר למחוק את התכונה הזאת כיוון שהיא חלק מיחס גדול יותר. עליך להסיר אותה מהיחס תחילה.",
+                    "multiple": "אי אפשר למחוק את התכונות האלו כיוון שהן חלק מיחס גדול יותר. עליך להסיר אותן מהיחס תחילה."
+                },
+                "connected_to_hidden": {
+                    "single": "אי אפשר למחוק את התכונה הזאת כיוון שהיא מחוברת לתכונה נסתרת.",
+                    "multiple": "אי אפשר למחוק את התכונות האלה כיוון שהן מחוברות לתכונות נסתרות."
                 }
             },
             "add_member": {
                 "title": "ניתוק",
                 "description": "ניתוק הקווים/השטחים האלה זה מזה.",
                 "key": "נ",
-                "annotation": "קווים/שטחים מנותקים."
+                "annotation": "קווים/שטחים מנותקים.",
+                "not_connected": "אין כאן מספיק קווים/שטחים לניתוק.",
+                "connected_to_hidden": "אי אפשר לנתק את זה עקב החיבור לתכונה נסתרת.",
+                "relation": "אי אפשר לנתק את זה עקב החיבור לחבר ביחס."
             },
             "merge": {
                 "title": "מיזוג",
                 "description": "מיזוג התכונות האלה.",
                 "key": "ז",
                 "annotation": "{n} תכונות מוזגו.",
-                "not_eligible": "אי אפשר למזג תכונות אלו."
+                "not_eligible": "אי אפשר למזג תכונות אלו.",
+                "not_adjacent": "אי אפשר למזג את התכונות האלו כיוון שנקודות הקצה שלהן אינן מחוברות.",
+                "restriction": "אי אפשר למזג את התכונות האלה כיוון שלפחות אחת מהן חברה ביחס „{relation}”.",
+                "incomplete_relation": "אי אפשר למזג את התכונות האלו כיוון שלפחות אחת מהן לא התקבלה לחלוטין.",
+                "conflicting_tags": "אי אפשר למזג את התכונות האלה כיוון שלחלק מהתגיות שלהן יש ערכים סותרים."
             },
             "move": {
                 "title": "העברה",
                     "line": "העברת קו.",
                     "area": "העברת שטח.",
                     "multiple": "העברת מספר תכונות."
+                },
+                "incomplete_relation": {
+                    "single": "אי אפשר להעביר את התכונה הזאת כיוון שהיא לא התקבלה לחלוטין.",
+                    "multiple": "אי אפשר להעביר את התכונות האלה כיוון שהן לא התקבלו לחלוטין."
+                },
+                "too_large": {
+                    "single": "לא ניתן להזיז את התכונה הזאת כיוון שאינה גלויה מספיק.",
+                    "multiple": "לא ניתן להזיז את התכונות הללו כיוון שאינן גלויות מספיק."
+                },
+                "connected_to_hidden": {
+                    "single": "לא ניתן להזיז את התכונה הזאת כיוון שהיא מחוברת לתכונה נסתרת.",
+                    "multiple": "אי אפשר להזיז את התכונות האלה כיוון שחלקן מחוברות לתכונות נסתרות."
                 }
             },
             "rotate": {
             "created": "נוצר",
             "about_changeset_comments": "על הערות לערכות שינויים",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "ציינת את Google בהערה הזאת: כדאי לזכור כי העתקה ממפות Google אסורה בתכלית האיסור.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "ציינת את Google בהערה הזאת: כדאי לזכור כי העתקה ממפות Google אסורה בתכלית האיסור."
         },
         "contributors": {
             "list": "עריכות מאת {users}",
                 "title": "מדידה",
                 "selected": "{n} נבחרו",
                 "geometry": "צורה",
-                "closed": "סגורה",
                 "center": "מרכז",
                 "perimeter": "היקף",
                 "length": "אורך",
                 "area": "שטח",
+                "centroid": "נקודת המרכז",
                 "location": "מיקום",
                 "metric": "מטרי",
-                "imperial": "אימפריאלית"
+                "imperial": "אימפריאלית",
+                "node_count": "מספר המפרקים"
             }
         },
         "geometry": {
             "title": "רקע",
             "description": "הגדרות רקע",
             "key": "ר",
-            "percent_brightness": "{opacity}% בהירות",
+            "backgrounds": "רקעים",
             "none": "אין",
             "best_imagery": "מקור התמונה המוכר והטוב ביותר למיקום זה",
             "switch": "חזרה לרקע זה",
             "custom": "התאמה אישית",
             "custom_button": "עריכת רקע בהתאמה אישית",
-            "fix_misalignment": "התאמת הזחה של תמונת רקע",
-            "imagery_source_faq": "מאיפה מגיעה התמונה הזאת?",
+            "overlays": "שכבות על",
             "reset": "איפוס",
-            "offset": "ניתן לגרור כל מקום באזור האפור להלן כדי להתאים את הזחת תמונות הרקע או להקליד את ערכי ההזחה במטרים.",
+            "display_options": "אפשרויות תצוגה",
+            "brightness": "בהירות",
+            "contrast": "ניגוד",
+            "saturation": "רוויה",
+            "sharpness": "חדות",
             "minimap": {
-                "description": "×\9eפ×\94 ×\9e×\95ק×\98× ת",
+                "description": "×\94צ×\92ת ×\9eפ×\94 ×\9e×\9e×\95×\96ערת",
                 "tooltip": "הצגת מפה מרוחקת כדי לסייע באיתור האיזור שמוצג כרגע.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "התאמת הזחה של תמונת רקע",
+            "offset": "ניתן לגרור כל מקום באזור האפור להלן כדי להתאים את הזחת תמונות הרקע או להקליד את ערכי ההזחה במטרים."
         },
         "map_data": {
             "title": "נתוני מפה",
             "status_code": "השרת החזיר קוד מצב {code}",
             "unknown_error_details": "נא לוודא שיש לך חיבור לאינטרנט",
             "uploading": "השינויים נשלחים אל OpenStreetMap…",
+            "conflict_progress": "בדיקת סתירות: {num} מתוך {total}",
             "unsaved_changes": "יש לך שינויים שלא נשמרו",
             "conflict": {
                 "header": "פתרון עריכות סותרות",
                 "restore": "שחזור",
                 "delete": "להשאיר מחוק",
                 "download_changes": "או להוריד קובץ osmChange",
-                "done": "כל הסתירות נפתרו!"
+                "done": "כל הסתירות נפתרו!",
+                "help": "משתמש אחר שינה חלק מתכונות המפה ששינית.\nניתן ללחוץ על כל אחת מהתכונות להלן לקבלת פרטים על הסתירה ולבחור האם להשאיר את השינויים שלך\nאו את השינויים של המשתמש האחר.\n"
             }
         },
         "merge_remote_changes": {
                 "deleted": "תכונה זו נמחקה על ידי {user}.",
                 "location": "תכונה זו הועברה גם על ידיך וגם על ידי {user}.",
                 "nodelist": "המפרקים עברו שינוי על ידיך וגם על ידי {user}.",
-                "memberlist": "החברים ביחס עברו שינוי גם על ידיך וגם על ידי {user}."
+                "memberlist": "החברים ביחס עברו שינוי גם על ידיך וגם על ידי {user}.",
+                "tags": "החלפת את התגית <b>{tag}</b> בתגית „{local}” והיא השתנה בחזרה על ידי {user} לתגית „{remote}”."
             }
         },
         "success": {
+            "edited_osm": "בוצעה עריכה ב־OSM!",
             "just_edited": "הרגע ערכת את OpenStreetMap!",
             "view_on_osm": "צפייה ב־OSM",
             "facebook": "שיתוף בפייסבוק",
             "twitter": "שיתוף בטוויטר",
             "google": "שיתוף ב־Google+‎",
+            "help_html": "השינויים שלך אמורים להופיע בשכבה ה„תקנית” בעוד מספר דקות. שכבות אחרות ותכונות מסוימות עשויות לארוך זמן רב יותר.",
             "help_link_text": "פרטים"
         },
         "confirm": {
         },
         "splash": {
             "welcome": "ברוך בואך לעורך המפות iD של OpenStreetMap",
+            "text": "iD הוא כלי ידידותי אך רב עצמה לתרומה למפה החופשית הטובה בעולם. זוהי גרסה {version}. למידע נוסף יש לבקר באתר {website} ולדווח על תקלות תחת {github}.",
             "walkthrough": "להתחיל במדריך",
             "start": "לערוך כעת"
         },
         "validations": {
             "disconnected_highway": "דרך ראשית מנותקת",
             "disconnected_highway_tooltip": "דרכים אמורות להיות מחוברות לדרכים אחרות או לכניסות לבניינים.",
+            "old_multipolygon_tooltip": "השימוש בסגנון רב־מצולע זה הופסק. נא להקצות את התג לרב־מצולע ההורה במקום לדרך החיצונית.",
             "untagged_point": "נקודה ללא תיוג",
             "untagged_point_tooltip": "נא לבחור בסוג תכונה שמתאר מה הנקודה הזו.",
             "untagged_line": "קו ללא תיוג",
             "untagged_area_tooltip": "נא לבחור בסוג תכונה שמתאר מה השטח הזה.",
             "untagged_relation": "יחס בלתי מתויג",
             "untagged_relation_tooltip": "נא לבחור סוג תכונה שמתארת מה היחס הזה.",
-            "many_deletions": "×\91×\97×\99רת×\9a ×ª×\9e×\97ק {n} ×ª×\9b×\95× ×\95ת. ×\9c×\94×\9eש×\99×\9a ×\91פע×\95×\9c×\94? ×\90×\9d ×\9b×\9f, ×\94ת×\9b×\95× ×\95ת ×ª×\99×\9e×\97קנ×\94 ×\9e×\94×\9eפ×\94 ×\9c×\9b×\9c ×\9e×\99 ×©×¨×\95×\90×\94 ×\90ת openstreetmap.org.",
+            "many_deletions": "פע×\95×\9c×\94 ×\96×\95 ×ª×\95×\91×\99×\9c ×\9c×\9e×\97×\99קת {n} ×ª×\9b×\95× ×\95ת: {p} ×\9eפרק×\99×\9d, {l} ×§×\95×\95×\99×\9d, {a} ×©×\98×\97×\99×\9d, {r} ×§×©×¨×\99×\9d. ×\9c×\94×\9eש×\99×\9a ×\91פע×\95×\9c×\94? ×\9b×\9e×\95 ×\9b×\9f, ×\94×\9d ×\99×\99×\9e×\97ק×\95 ×\9e×\94×\9eפ×\94 ×©×\9b×\95×\9c×\9d ×¨×\95×\90×\99×\9d ×\91×\9bת×\95×\91ת openstreetmap.org.",
             "tag_suggests_area": "התגית {tag} רומזת שהקו אמור להיות שטח, אך זה לא שטח",
             "deprecated_tags": "תגיות שנזנחו: {tags}"
         },
         "help": {
             "title": "עזרה",
             "key": "ע",
-            "help": "# עזרה\n\nזהו עורך של [OpenStreetMap](http://www.openstreetmap.org/), המפה\nהעולמית החופשית והזמינה לעריכה. ניתן להשתמש בו כדי להוסיף ולעדכן\nנתונים באזור שלך, למטרת יצירת מפה עולמית בקוד פתוח ונתונים פתוחים\nשתטיב עם כולם.\n\nהעריכות שלך במפה הזאת יהיו חשופים בפני כל המשתמשים\nב־OpenStreetMap. כדי לערוך, עליך\n[להיכנס](https://www.openstreetmap.org/login).\n\n[העורך iD](http://ideditor.com/) הוא מיזם שיתופי ש[קוד\nהמקור שלו זמין ב־GitHub](https://github.com/openstreetmap/iD).\n"
+            "help": {
+                "title": "עזרה",
+                "welcome": "ברוך בואך לעורך iD עבור [OpenStreetMap](https://www.openstreetmap.org/). עם העורך הזה ניתן לעדכן את OpenStreetMap ישירות מהדפדפן שלך.",
+                "open_data_h": "מידע פתוח",
+                "open_data": "עריכות למפה זו תופענה בפני כל משתמשי OpenStreetMap. ניתן לבסס את העריכות שלך על ידע אישי, מחקר פני השטח או תמונות שנאספות בצילומי אוויר או ברחוב. העתקה ממקורות מסחריים כגון מפות Google, [אסורה בתכלית האיסור](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "לפני שנתחיל",
+                "before_start": "נדרשת היכרות עם OpenStreetMap ועם העורך הזה בטרם התחלת העריכה. ב־iD יש מדריך צעד אחר צעד שילמד אותך את יסודות העריכה ב־OpenStreetMap. יש ללחוץ על „התחלת ההדרכה” במסך הזה כדי להמשיך להדרכה - תהליך של כרבע שעה.",
+                "open_source_h": "קוד פתוח",
+                "open_source": "העורך iD הוא מיזם קוד פתוח שיתופי והגרסה הנוכחית היא {version}. קוד המקור זמין [ב־GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "ניתן לסייע ל־iD על באמצעות [תרגום](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) או [דיווח על תקלות](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "סקירה",
+                "navigation_h": "ניווט",
+                "navigation_drag": "ניתן לגרור את המפה על ידי לחיצה והחזקה של {leftclick} כפתור העכבר השמאלי והזזת העכבר. ניתן גם להשתמש במקשי החצים `↑`, `↓`,  `→` , `←` במקלדת שלך.",
+                "navigation_zoom": "ניתן להתקרב או להתרחק על ידי גלילת העכבר או משטח המעקב, לחלופין, על ידי לחיצה על הכפתורים {plus} / {minus} שבצד המפה. ניתן גם להשתמש במקשים ‚+’ או ‚-’ שבמקלדת שלך.",
+                "features_h": "תכונות המפה",
+                "nodes_ways": "ב־OpenStreetmap, נקודות נקראות לעתים *מפרקים* וקווים ושטחים נקראים לפעמים *דרכים*."
+            },
+            "editing": {
+                "title": "עריכה ושמירה",
+                "select_h": "בחירה",
+                "multiselect_h": "בחירה במגוון",
+                "multiselect_shift_click": "`{shift}`+{leftclick} לחיצה שמאלית כדי לבחור כמה תכונות יחדיו.  אפשרות זו מקלה על העברה או מחיקה של מגוון פריטים.",
+                "undo_redo_h": "ביטול ושחזור ביטול",
+                "save_h": "שמירה",
+                "save": "יש ללחוץ על {save} **שמירה** כדי לסיים את העריכות שלך ולשלוח אותן ל־OpenStreetMap. מומלץ לזכור לשמור את עבודתך לעתים תכופות!",
+                "upload_h": "העלאה",
+                "backups_h": "גיבויים אוטומטיים",
+                "keyboard_h": "קיצורי מקלדת",
+                "keyboard": "ניתן לצפות ברשימה של קיצורי המקלדת על ידי לחיצה על המקש ‚?’."
+            },
+            "feature_editor": {
+                "title": "עורך התכונות",
+                "intro": "*עורך התכונות* מופיע לצד המפה ומאפשר לך לצפות ולערוך את כל המידע על התכונה הנבחרת.",
+                "definitions": "האגף העליון מציג את סוג התכונה. האמצעי מכיל *שדות* שמציגים את מאפייני התכונה כגון השם או הכתובת.",
+                "type_h": "סוג התכונה",
+                "type": "ניתן ללחוץ על סוג התכונה כדי לשנות את התכונה לסוג אחר. כל מה שקיים בעולם האמתי ניתן להוסיף גם ל־OpenStreetMap, לכן ישנם אלפי סוגי תכונות לבחור מביניהם.",
+                "type_picker": "בוחר הסוגים מציג את סוגי התכונות הנפוצים ביותר כגון: פארקים, בתי חולים, מסעדות, דרכים ובניינים. ניתן לחפש אחר סוגים אחרים על ידי הקלדת מבוקשך בתיבת החיפוש. ניתן גם ללחוץ על הסמל {inspect} **מידע** שליד סוג התכונה כדי לקבל עליו יותר מידע.",
+                "fields_h": "שדות",
+                "fields_all_fields": "האגף „כל השדות” מכיל את כל פרטי התכונה שבאפשרותך לערוך. ב־OpenStreetMap כל השדות הם בגדר רשות וזה בסדר להשאיר שדה ריק במקרה של ספק.",
+                "fields_example": "כל סוג תכונה מייצג שדה אחר. למשל, דרך יכולה להציג שדות על פני השטח והגבלת המהירות אך במסעדה עשויים להופיע שדות על סוג האוכל המוגש ושעות הפתיחה.",
+                "fields_add_field": "ניתן גם ללחוץ על התיבה הנגללת „הוספת שדה” כדי להוסיף שדות נוספים כגון: תיאור, קישור ויקיפדיה, גישה לכסאות גלגלים ועוד.",
+                "tags_h": "תגיות"
+            },
+            "points": {
+                "title": "נקודות",
+                "intro": "ניתן להשתמש ב*נקודות* לייצוג תכונות כגון חנויות, מסעדות ואתרי מורשת. אלה מסמנות מיקום מסוים ומתארות מה יש באותו המיקום.",
+                "add_point_h": "הוספת נקודות",
+                "add_point": "כדי להוסיף נקודה, יש ללחוץ על הכפתור {point} **נקודה** בסרגל הכלים שמעל למפה או ללחוץ על מקש הקיצור ‚1’, פעולה זו תחליף את סמן העכבר בצלב. ",
+                "move_point_h": "העברת נקודות",
+                "delete_point_h": "מחיקת נקודות"
+            },
+            "lines": {
+                "title": "קווים",
+                "add_line_h": "הוספת קווים",
+                "add_line_draw": "עכשיו, עליך להציב את סמן העכבר על מיקום תחילת הקו המיועד {leftclick} וללחוץ עם המקש השמאלי או ללחוץ על המקש ‚רווח’ כדי להתחיל להציב מפרקים לאורך הקו. ניתן להמשיך ולהוסיף עוד מפרקים על ידי לחיצה עם העכבר או על מקש ה‚רווח’. בעת הציור, ניתן להתקרב או לגרור את המפה כדי להוסיף עוד פרטים.",
+                "add_line_finish": "כדי לסיים ציור קו, יש ללחוץ על `{return}` או ללחוץ שוב על המפרק האחרון.",
+                "modify_line_h": "עריכת קווים",
+                "connect_line_h": "חיבור קווים",
+                "disconnect_line_h": "ניתוק קווים",
+                "move_line_h": "הזזת קווים",
+                "delete_line_h": "מחיקת קווים"
+            },
+            "areas": {
+                "title": "שטחים",
+                "point_or_area_h": "נקודות או שטחים?",
+                "add_area_h": "הוספת שטחים",
+                "add_area_command": "כדי להוסיף שטח, יש ללחוץ על הכפתור {area} **שטח** בסרגל הכלים שמעל למפה או ללחוץ על מקש הקיצור ‚3’, פעולה זו תחליף את סמן העכבר בצלב.",
+                "add_area_draw": "עכשיו, עליך להציב את סמן העכבר על אחת מהפינות של התכונה {leftclick} וללחוץ עם המקש השמאלי או ללחוץ על המקש ‚רווח’ כדי להתחיל להציב מפרקים מסביב למסגרת החיצונית של האזור. ניתן להמשיך ולהוסיף עוד מפרקים על ידי לחיצה עם העכבר או על מקש ה‚רווח’. בעת הציור, ניתן להתקרב או לגרור את המפה כדי להוסיף עוד פרטים.",
+                "add_area_finish": "כדי לסיים ציור שטח, יש ללחוץ על `{return}` או ללחוץ שוב על המפרק הראשון או האחרון.",
+                "square_area_h": "ריבוע פינות"
+            },
+            "relations": {
+                "relation_types_h": "סוגי יחסים",
+                "turn_restriction_h": "הגבלות פנייה",
+                "route_h": "נתיבים",
+                "boundary_h": "גבולות"
+            },
+            "imagery": {
+                "title": "תמונות רקע",
+                "sources_h": "מקורות תמונה",
+                "offsets_h": "שינוי היסט תמונה",
+                "offset_change": "יש ללחוץ על המשולשים הקטנים כדי להתאים את היסט תמונת הרקע בצעדים קטנים, לחלופין להחזיק את סמן העכבר השמאלי ולגרור עם הריבוע האפור כדי לגלול להתאמת תמונת הרקע."
+            },
+            "streetlevel": {
+                "title": "תמונות ברמת רחוב",
+                "using_h": "שימוש בתמונות ברמת רחוב",
+                "using": "כדי להשתמש בתמונות ברמת רחוב לטובת מיפוי, יש ללחוץ על הלוח {data} **נתוני מפה**  לצד המפה כדי להפעיל או להשבית את שכבות התמונות הזמינות."
+            },
+            "gps": {
+                "title": "עקבות GPS",
+                "using_h": "שימוש בעקבות GPS",
+                "tracing": "מסלול ה־GPS לא נשלח אל OpenStreetMap - הדרך הטובה ביותר להשתמש בו היא לצייר על המפה, תוך שימוש במסלול כהנחיה להוספת תכונות חדשות.",
+                "upload": "באפשרותך [להעלות את נתוני ה־GPS שלך ל־OpenStreetMap](https://www.openstreetmap.org/trace/create) לטובת משתמשים אחרים."
+            }
         },
         "intro": {
+            "done": "סיום",
             "ok": "אישור",
             "graph": {
                 "block_number": "<value for addr:block_number>",
                     "2nd-avenue": "שדרת הדודאים",
                     "4th-avenue": "שדרות הארבעה",
                     "5th-avenue": "שדרת החמישה",
+                    "6th-avenue": "שד׳ שש",
+                    "6th-street": "רח׳ שש",
+                    "7th-avenue": "שד׳ בת שבע",
                     "8th-avenue": "שמיני עצרת",
+                    "9th-avenue": "שד׳ חטיבה תשע",
+                    "10th-avenue": "שד׳ מבצע עשר המכות",
+                    "11th-avenue": "שד׳ אחד עשר הנקודות",
+                    "12th-avenue": "שד׳ תרי עשר",
+                    "access-point-employment": "מעוף משאבי אנוש",
+                    "adams-street": "רח׳ המלך ג׳ורג׳",
+                    "andrews-elementary-school": "בית ספר יסודי קינג ג׳ורג׳",
+                    "andrews-street": "רח׳ יהודה המכבי",
+                    "battle-street": "רח׳ הקרב",
+                    "conservation-park": "פארק שימור",
+                    "dollar-tree": "הכול בחמישה שקלים",
                     "elm-street": "רח׳ אלם",
+                    "flower-street": "רח׳ הפרח",
                     "french-street": "רח׳ צרפת",
                     "garden-street": "רח׳ גן השקמים",
+                    "gem-pawnbroker": "מינרלה",
+                    "golden-finch-framing": "יש מסגרת",
+                    "hoffman-pond": "מעיין אלרואי",
+                    "hoffman-street": "רח׳ בר הופמן",
+                    "hook-avenue": "רח׳ גובר רבקה",
+                    "jefferson-street": "רח׳ גולדה מאיר",
+                    "lafayette-park": "פארק רוטשילד",
+                    "las-coffee-cafe": "קפה אילת",
                     "lincoln-avenue": "סמטת אשכול",
                     "lowrys-books": "סטימצקי",
                     "lynns-garage": "המוסך של ניסים",
                     "main-street-barbell": "אימון משה ברחוב העצמאות",
                     "main-street-cafe": "קפה רחוב העצמאות",
                     "main-street-fitness": "חיטוב רחוב העצמאות",
-                    "main-street": "ר×\97×\95×\91 העצמאות",
-                    "maple-street": "ר×\97×\95×\91 דבש",
-                    "marina-park": "ר×\97×\95×\91 הנמל",
-                    "market-street": "ר×\97×\95×\91 השוק",
+                    "main-street": "ר×\97׳ העצמאות",
+                    "maple-street": "ר×\97׳ דבש",
+                    "marina-park": "פ×\90רק הנמל",
+                    "market-street": "ר×\97׳ השוק",
                     "memory-isle-park": "פארק אבני זכרון",
                     "memory-isle": "אבני זכרון",
+                    "michigan-avenue": "שדרות ירושלים",
+                    "middle-street": "סמטה אלמונית",
                     "millard-street": "רח׳ הרב פנחס מילר",
                     "moore-street": "רח׳ מור",
                     "morris-avenue": "שד׳ פישר מוריס",
                     "mural-mall": "קניון איילון",
                     "paisanos-bar-and-grill": "השווארמה של הרצל",
-                    "pine-street": "רחוב האורן",
+                    "paisley-emporium": "אוצרות המזרח",
+                    "paparazzi-tattoo": "אבי קעקועים",
+                    "pealer-street": "רח׳ מקלף",
+                    "pine-street": "רח׳ האורן",
                     "pizza-hut": "פיצה פדאל",
+                    "portage-avenue": "שדרות הירקון",
+                    "portage-river": "נחל הירקון",
+                    "preferred-insurance-services": "שירותי ביטוח מועדפים",
+                    "railroad-drive": "דרך הרכבת",
+                    "river-city-appliance": "מרתפי אלקטרוניקה",
                     "river-drive": "כביש הנחל",
                     "river-road": "דרך הנחל",
-                    "river-street": "ר×\97×\95×\91 הנחל",
+                    "river-street": "ר×\97׳ הנחל",
                     "riverside-cemetery": "בית העלמין שליד הנחל",
                     "riverwalk-trail": "מסלול הליכה לצד הנחל",
                     "riviera-theatre": "תאטרון עידה",
                     "three-rivers-post-office": "משרד הדואר של קריית שלושה",
                     "three-rivers-public-library": "הספרייה הציבורית של קריית שלושה",
                     "three-rivers": "קריית שלושה",
-                    "washington-street": "רחוב בן גוריון",
-                    "water-street": "רחוב הנחל",
+                    "unique-jewelry": "תכשיטים ייחודיים",
+                    "walnut-street": "רח׳ אגוז",
+                    "washington-street": "רח׳ בן גוריון",
+                    "water-street": "רח׳ הנחל",
+                    "west-street": "רח׳ מערב",
+                    "wheeler-street": "רח׳ כישור",
+                    "william-towing": "הפנתר שליחויות",
+                    "willow-drive": "דרך הערבה",
+                    "wood-street": "רח׳ עץ השדה",
                     "world-fare": "יריד עולם"
                 }
             },
                 "welcome": "ברוך בואך! המדריך האינטראקטיבי הזה ילמד אותך את יסודות העריכה ב־OpenStreetMap.",
                 "practice": "כל המידע במדריך הזה מיועד לתרגול בלבד וכל העריכות שתתבצענה במדריך לא תישמרנה.",
                 "words": "המדריך הזה יציג מספר מילים ורעיונות חדשים. בעת הצגת מילה חדשה נשתמש בכתב *נטוי*.",
-                "mouse": "ניתן להשתמש בכל התקן קלט כדי לערוך את המפה אך מדריך זה יוצא מנקודת הנחה שיש לך עכבר עם שני כפתורים. **אם ברצונך לחבר עכבר כדאי לעשות זאת ואז ללחוץ על אישור.**"
+                "mouse": "ניתן להשתמש בכל התקן קלט כדי לערוך את המפה אך מדריך זה יוצא מנקודת הנחה שיש לך עכבר עם שני כפתורים. **אם ברצונך לחבר עכבר כדאי לעשות זאת ואז ללחוץ על אישור.**",
+                "chapters": "צלחנו את זה! ניתן להשתמש בכפתורים שלהלן כדי לדלג על פרקים בכל עת או כדי להתחיל פרק מחדש אם נתקעת. בואו נתחיל! **יש ללחוץ על ‚{next}’ כדי להמשיך.**"
             },
             "navigation": {
                 "title": "ניווט",
+                "drag": "האזור הראשי במפה מציג נתונים מ־OpenStreetMap על גבי רקע.{br}ניתן לגרור את המפה על ידי לחיצה והחזקה של כפתור העכבר הימני יחד עם הזזת העכבר. בנוסף אפשר להשתמש במקשי החצים במקלדת שלך. **נא לגרור את המפה!**",
+                "zoom": "ניתן להתקרב או להתרחק על ידי גלילת העכבר או משטח המעקב, לחלופין, על ידי לחיצה על הכפתורים {plus} / {minus} שבצד המפה. **הגיע הזמן להתקרב!**",
+                "features": "אנו משתמשים במילה *תכונות* כדי לתאר דברים שמופיעים על המפה. כל דבר בעולם האמתי ניתן למפות כתכונה ב־OpenStreetMap.",
+                "points_lines_areas": "תכונות המפה מיוצגות על ידי *נקודות, קווים או שטחים.*",
                 "nodes_ways": "ב־OpenStreetMap, נקודות לעתים נקראות *מפרקים* וקווים או שטחים נעתים נקראים *דרכים*.",
                 "click_townhall": "ניתן לבחור את כל התכונות במפה על ידי לחיצה עליהם. **ניתן ללחוץ על הנקודה כדי לבחור אותה**",
                 "selected_townhall": "נהדר! הנקודה נבחרה. התכונות הנבחרות מופיעות עם זריחה מהבהבת.",
+                "editor_townhall": "בעת בחירת תכונה, מופיע *עורך תכונות* לצד המפה.",
+                "preset_townhall": "החלק העליון של עורך התכונות מציג את סוג התכונה. הנקודה הזאת היא {preset}.",
+                "fields_townhall": "החלק האמצעי של עורך התכונות מכיל *שדות* שמציגים את מאפייני התכונה כגון שם וכתובת.",
                 "close_townhall": "**יש לסגור את עורך התכונות על ידי לחיצה על escape או על הכפתור {button} בפינה העליונה.**",
                 "search_street": "ניתן גם לחפש תכונות בתצוגה הנוכחית או בכל רחבי העולם. **חיפוש אחר ‚{name}’.**",
-                "choose_street": "**יש לבחור {name} מהרשימה כדי לבחור אותו.**"
+                "choose_street": "**יש לבחור {name} מהרשימה כדי לבחור אותו.**",
+                "selected_street": "מצוין! בחרת את {name}.",
+                "editor_street": "השדות שמופיעים לייצוג רחוב הם שונים מאלו שמופיעים על בניין העירייה.{br}לרחוב הנבחר הזה, עורך התכונות מציג שדות כמו ‏‚{field1}’ ו־‏‚{field2}’. **ניתן לסגור את עורך התכונות בלחיצה על escape או על הכפתור {button}.**"
             },
             "points": {
                 "title": "נקודות",
                 "search_cafe": "ישנן מגוון תכונות שניתן לייצג בנקודות. הנקודה שהרגע הוספת היא בית קפה. **חיפוש אחר ‚{preset}’.**",
-                "choose_cafe": "**יש לבחור {preset} מהרשימה.**"
+                "choose_cafe": "**יש לבחור {preset} מהרשימה.**",
+                "add_close": "עורך התכונות יזכור את כל השינויים שלך אוטומטית. **בעת סיום הוספת השם, יש ללחוץ על escape או על הכפתור {button} כדי לסגור את עורך התכונות.**",
+                "update": "הבה נמלא פרטים נוספים על בית הקפה הזה. ניתן לשנות את השם, להוסיף סוג מטבח או להוסיף כתובת. **נא לשנות את פרטי בית הקפה.**",
+                "update_close": "**לאחר סיום עדכון בית הקפה, יש ללחוץ על escape,‏ enter או ללחוץ על הכפתור {button} כדי לסגור את עורך התמונות.**",
+                "play": "כעת שידוע לך איך להוסיף ולערוך נקודות, ניתן לנסות ליצור כמה נקודות נוספות לתרגול! **כשסיימת ואפשר להמשיך לפרק הבא, יש ללחוץ על ‚{next}’.**"
             },
             "areas": {
                 "title": "אזורים",
+                "finish_playground": "יש לסיים את ציור השטח על ידי לחיצה על enter, או על ידי לחיצה על המפרק הראשון או האחרון. **יש לסיים ציור שטח למגרש המשחקים.**",
                 "search_playground": "**חיפוש אחר ‚{preset}’.**",
                 "choose_playground": "**יש לבחור {preset} מהרשימה.**",
+                "add_field": "למגרש משחקים זה אין שם רשמי, אז אין מה להוסיף לשדה שם.{br}במקום, אפשר להוסיף פרטים נוספים על גן המשחקים בשדה תיאור. **יש לפתוח את רשימת הוספת השדות.**",
                 "choose_field": "**יש לבחור {field} מהרשימה.**",
-                "retry_add_field": "לא בחרת את השדה {field}. נא לנסות שוב."
+                "retry_add_field": "לא בחרת את השדה {field}. נא לנסות שוב.",
+                "describe_playground": "**יש להוסיף תיאור ולאחר מכן ללחוץ על הכפתור {button} כדי לסגור את עורך התכונות.**",
+                "play": "כל הכבוד! כעת יש לנסות לצייר עוד מספר אזורים ולראות איך נראות תכונות שטח אחרות שניתן להוסיף ל־OpenStreetMap. **כשסיימת וברצונך להמשיך לפרק הבא, יש ללחוץ על ‚{next}’.**"
             },
             "lines": {
                 "title": "קווים",
+                "add_line": "*קווים* משמשים לייצוג תכונות כגון דרכים, מסילות רכבת ונהרות. **יש ללחוץ על כפתור הקו {button} כדי לצייר קו חדש.**",
+                "start_line": "כאן יש דרך חסרה. קדימה, להוסיף אותה!{br}ב־OpenStreetMap, יש לצייר קווים במרכז הדרך. ניתן לגרור ולהתקרב למפה בזמן הציור אם יש בכך צורך. **יש להתחיל ציור של קו חדש על ידי לחיצה על הקצה העליון של הדרך החסרה הזאת.**",
                 "retry_intersect": "הדרך צריכה להשתלב עם {name}. נא לנסות שוב!",
+                "continue_line": "יש להמשיך לצייר את הקו לדרך החדשה. לתשומת לבך: ניתן לגרור ולהתקרב למפה במקרה הצורך.{br}לאחר סיום הציור, יש ללחוץ שוב על המפרק האחרון. **יש לסיים את ציור הדרך.**",
                 "choose_category_road": "**יש לבחור {category} מהרשימה.**",
                 "choose_preset_residential": "ישנן מגוון סוגים של דרכים אך הדרך הזאת היא דרך עירונית. **יש לבחור בסוג {preset}.**",
                 "retry_preset_residential": "לא בחרת את הסוג {preset}. **יש ללחוץ כאן כדי לבחור שוב.**",
+                "name_road": "**יש להעניק לדרך זו שם ואז ללחוץ על escape,‏ enter או ללחוץ על הכפתור {button} כדי לסגור את עורך התכונות.**",
                 "did_name_road": "נראה מעולה! עכשיו נלמד איך לעדכן צורה של קו.",
                 "update_line": "לפעמים יש צורך לשנות צורה של קו קיים. להלן דרך שלא נראית כמו שצריך.",
                 "add_node": "נוכל להוסיף עוד מפרקים לקו זה כדי לשפר את הצורה שלו. אחת הדרכים להוסיף מפרק היא ללחוץ לחיצה כפולה על הקו במקום בו ברצונך להוסיף מפרק. **יש ללחוץ לחיצה כפולה על הקו כדי ליצור מפרק חדש.**",
+                "start_drag_endpoint": "עם בחירת קו, ניתן לגרור כל אחד מהמפרקים שלו על ידי לחיצה והחזקה של כפתור העכבר השמאלי בעת הגרירה. **יש לגרור את נקודת הסיום למיקום בו הדרכים האלו מצטלבות.**",
                 "finish_drag_endpoint": "המיקום הזה נראה נהדר. **יש לשחרר את הכפתור השמאלי בעכבר כדי לסיים את הגרירה.**",
+                "continue_drag_midpoint": "הקו הזה נראה הרבה יותר טוב! ניתן להמשיך ולהתאים את הקו הזה על ידי לחיצה כפולה או גרירת נקודות האמצע עד שהעיקול תואם לצורת הכביש. **כשהקו נראה לטעמך, עליך פשוט ללחוץ על אישור.**",
+                "delete_lines": "זה בסדר למחוק קווים של דרכים שאינן קיימות במציאות.{br}להלן דוגמה בה העיר תכננה לבנות {street} אך מעולם לא עשתה זאת. נוכל לשפר את החלק הזה במפה על ידי מחיקת הקווים המיותרים.",
                 "rightclick_intersection": "הרחוב האמתי האחרון הוא {street1}, כך שאנחנו *נפצל* את {street2} בצומת הזה ונסיר את כל מה שמעליו. **יש ללחוץ עם הכפתור הימני בעכבר על מפרק הצומת.**",
                 "split_intersection": "**יש ללחוץ על הלחצן {button} כדי לפצל {street}.**",
                 "retry_split": "לא לחצת על לחצן הפיצול. נא לנסות שוב.",
+                "did_split_multi": "טוב מאוד! {street1} מפוצל כעת לשני חלקים. ניתן להסיר את החלק העליון. **נא ללחוץ על החלק העליון של {street2} כדי לבחור אותו.**",
+                "did_split_single": "**יש ללחוץ על החלק העליון של {street2} כדי לבחור אותו.**",
+                "multi_select": "{selected} נבחר. יש לבחור גם את {other1}. ניתן להשתמש ב־Shift עם לחיצה כדי לבחור מגוון פריטים. **יש ללחוץ עם Shift על {other2}.**",
+                "multi_rightclick": "מעולה! שני הקווים המיועדים למחיקה נבחרו. **יש ללחוץ עם הכפתור הימני בעכבר על אחד מהקווים כדי להציג את תפריט העריכה**",
                 "multi_delete": "**יש ללחוץ על הכפתור {button} כדי למחוק את הקווים העודפים.**",
-                "retry_delete": "לא לחצת על כפתור המחיקה. נא לנסות שוב."
+                "retry_delete": "לא לחצת על כפתור המחיקה. נא לנסות שוב.",
+                "play": "נהדר! המיומנויות שרכשת בפרק הזה יכולות לשמש אותך לתרגול עריכה על עוד כמה קווים. **עם סיום התרגול ניתן לעבור לפרק הבא בלחיצה על ‚{next}’**"
             },
             "buildings": {
                 "title": "בניינים",
                 "add_building": "OpenStreetMap הוא מסד הנתונים הגדול ביותר של בניינים.{br}ניתן לסייע בשיפור מסד הנתונים הזה על ידי תיעוד בניינים שאינם ממופים עדיין. **יש ללחוץ על כפתור השטח {button} כדי להוסיף שטח חדש.**",
                 "start_building": "בואו נוסיף את הבית הזה למפה על ידי מעקב אחר קו מתאר החיצוני שלו.{br}יש לעקוב אחר קו המתאר החיצוני של הבניין בצורה המדויקת ביותר ככל הניתן. **יש ללחוץ על רווח כדי להציב מפרק התחלה באחת מפינות הבניין.**",
+                "continue_building": "יש להמשיך ולהוסיף מפרקים נוספים כדי לעקוב אחר קו המתאר של הבניין. מוטב לזכור כי ניתן להתקרב אם יש צורך בהוספת פרטים נוספים.{br}ניתן לסיים את ציור הבניין על ידי לחיצה על enter, או בלחיצה על המפרק הראשון או האחרון בשנית. **יש לסיים לעקוב אחר המתאר של הבניין.**",
                 "retry_building": "נראה כי נתקלת בבעיה בהצבת המפרקים בפינות הבניין. נא לנסות שוב!",
                 "choose_category_building": "**יש לבחור ב{category} מהרשימה.**",
                 "choose_preset_house": "ישנו מגוון רחב של סוגי סניינים, אך הסוג הזה הוא בוודאות בית.{br}במקרה של ספק בנוגע לסוג, זה בסדר גמור פשוט לבחור בסוג מגנה גנרי. **יש לבחור את הסוג {preset}.**",
                 "done_square": "ראית איך שפינות הבניין התגבשו לכדי צורה? יש עוד טריקים שימושיים כאלה.",
                 "add_tank": "בשלב הבא אנו נסמן את מיכל האחסון עגול הזה. **יש ללחוץ על כפתור השטח {button} כדי להוסיף שטח חדש.**",
                 "start_tank": "אל דאגה, לא חובה לצייר עיגול מושלם. עליך פשוט לצייר שטח בתוך המיכל שנוגע בקצוות שלו. **יש ללחוץ עם העכבר או עם מקש הרווח כדי להציב נקודת התחלה על קצה המיכל.**",
+                "continue_tank": "ניתן להוסיף עוד מפרקים בקצוות. העיגול ייווצר מחוץ למפרקים שציירת.{br}ניתן לסיים את השטח על ידי לחיצה על enter, או בלחיצה על המפרק הראשון או האחרון בשנית. **יש לסיים לצייר את המיכל.**",
                 "search_tank": "**חיפוש אחר ‚{preset}’.**",
                 "choose_tank": "**יש לבחור {preset} מהרשימה.**",
                 "rightclick_tank": "**ניתן לבחור את מיכל האחסון שיצרת ולהציג את תפריט העריכה בלחיצה ימנית.**",
                     "title": "בחירת תכונות",
                     "select_one": "בחירת תכונה בודדה",
                     "select_multi": "בחירת מגוון תכונות",
-                    "lasso": "ציור פלצור בחירה מסביב לתכונות"
+                    "lasso": "ציור פלצור בחירה מסביב לתכונות",
+                    "search": "חיפוש תכונות שתואמות את טקסט החיפוש"
                 },
                 "with_selected": {
                     "edit_menu": "החלפת תצוגה של תפריט עריכה"
                     "stop_line": "סיום ציור קו או שטח"
                 },
                 "operations": {
+                    "title": "פעולות",
                     "continue_line": "להמשיך את הקו במפרק הנבחר",
                     "merge": "שילוב (מיזוג) התכונות הנבחרות",
                     "disconnect": "ניתוק תכונות במפרק הנבחר",
                     "move": "העברת התכונות הנבחרות",
                     "rotate": "הטיית התכונות הנבחרות",
                     "orthogonalize": "יישור קו / פינות של איזור ריבועי",
+                    "circularize": "עיגול פינות של קו סגור או שטח",
                     "delete": "מחיקת התכונות הנבחרות"
                 },
                 "commands": {
                     "measurement": "החלפת מצב תצוגת חלונית מדידה"
                 }
             }
+        },
+        "units": {
+            "feet": "{quantity} רגל",
+            "miles": "{quantity} מיל",
+            "meters": "{quantity} מ׳",
+            "kilometers": "{quantity} ק״מ",
+            "square_meters": "{quantity} מ׳²",
+            "square_kilometers": "{quantity} ק״מ²",
+            "arcdegrees": "{quantity}°",
+            "north": "צפ׳",
+            "south": "דר׳",
+            "east": "מז׳",
+            "west": "מע׳",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
+        "presets": {
+            "categories": {
+                "category-barrier": {
+                    "name": "מאפייני גבולות"
+                },
+                "category-building": {
+                    "name": "מאפייני בניינים"
+                },
+                "category-golf": {
+                    "name": "מאפייני גולף"
+                },
+                "category-landuse": {
+                    "name": "מאפייני קרקע"
+                },
+                "category-natural-area": {
+                    "name": "מאפייני טבע"
+                },
+                "category-natural-line": {
+                    "name": "מאפייני טבע"
+                },
+                "category-natural-point": {
+                    "name": "מאפייני טבע"
+                },
+                "category-path": {
+                    "name": "מאפייני דרך"
+                },
+                "category-rail": {
+                    "name": "מאפייני מסילות"
+                }
+            },
+            "fields": {
+                "access": {
+                    "options": {
+                        "destination": {
+                            "title": "יעד"
+                        }
+                    },
+                    "types": {
+                        "access": "הכול",
+                        "bicycle": "אופניים",
+                        "foot": "רגלית",
+                        "horse": "סוסים",
+                        "motor_vehicle": "כלי רכב ממונעים"
+                    }
+                },
+                "address": {
+                    "label": "כתובת",
+                    "placeholders": {
+                        "city": "עיר",
+                        "country": "מדינה",
+                        "county": "נפה",
+                        "county!jp": "מחוז",
+                        "district": "מחוז",
+                        "floor": "קומה",
+                        "housename": "שם הבית",
+                        "neighbourhood": "שכונה",
+                        "place": "מקום",
+                        "postcode": "מיקוד",
+                        "quarter": "רובע",
+                        "street": "רחוב",
+                        "unit": "יחידה"
+                    }
+                },
+                "aerialway": {
+                    "label": "סוג"
+                },
+                "aerialway/access": {
+                    "label": "גישה",
+                    "options": {
+                        "entry": "כניסה",
+                        "exit": "יציאה"
+                    }
+                },
+                "aerialway/capacity": {
+                    "label": "קיבולת (לשעה)"
+                },
+                "aerialway/duration": {
+                    "label": "משך (דקות)",
+                    "placeholder": "1, 2, 3..."
+                },
+                "aerialway/heating": {
+                    "label": "מחומם"
+                },
+                "aerialway/summer/access": {
+                    "label": "גישה (קיץ)",
+                    "options": {
+                        "exit": "יציאה"
+                    }
+                },
+                "aeroway": {
+                    "label": "סוג"
+                },
+                "agrarian": {
+                    "label": "מוצרים"
+                },
+                "amenity": {
+                    "label": "סוג"
+                },
+                "animal_boarding": {
+                    "label": "לחיות"
+                },
+                "animal_breeding": {
+                    "label": "לחיות"
+                },
+                "animal_shelter": {
+                    "label": "לחיות"
+                },
+                "area/highway": {
+                    "label": "סוג"
+                },
+                "artist": {
+                    "label": "אמן"
+                },
+                "artwork_type": {
+                    "label": "סוג"
+                },
+                "atm": {
+                    "label": "כספומט"
+                },
+                "barrier": {
+                    "label": "סוג"
+                },
+                "bath/open_air": {
+                    "label": "באוויר הפתוח"
+                },
+                "bath/sand_bath": {
+                    "label": "אמבטיית חול"
+                },
+                "bath/type": {
+                    "label": "מומחיות",
+                    "options": {
+                        "foot_bath": "אמבטיה לרגליים",
+                        "hot_spring": "מעיינות חמים",
+                        "onsen": "אונסן יפני"
+                    }
+                },
+                "beauty": {
+                    "label": "סוג החנות"
+                },
+                "bench": {
+                    "label": "ספסל"
+                },
+                "bicycle_parking": {
+                    "label": "סוג"
+                },
+                "bin": {
+                    "label": "פח אשפה"
+                },
+                "blood_components": {
+                    "label": "רכיבי דם",
+                    "options": {
+                        "plasma": "פלסמה",
+                        "platelets": "טסיות",
+                        "stemcells": "דגימות תאי גזע",
+                        "whole": "דם מלא"
+                    }
+                },
+                "board_type": {
+                    "label": "סוג"
+                },
+                "boules": {
+                    "label": "סוג"
+                },
+                "boundary": {
+                    "label": "סוג"
+                },
+                "bridge": {
+                    "label": "סוג",
+                    "placeholder": "בררת מחדל"
+                },
+                "building": {
+                    "label": "בניין"
+                },
+                "building_area": {
+                    "label": "בניין"
+                },
+                "bunker_type": {
+                    "label": "סוג"
+                },
+                "cables": {
+                    "label": "כבלים"
+                },
+                "camera/direction": {
+                    "label": "כיוון (מעלות עם כיוון השעון)"
+                },
+                "camera/mount": {
+                    "label": "חצובה"
+                },
+                "camera/type": {
+                    "label": "סוג המצלמה",
+                    "options": {
+                        "dome": "כיפה"
+                    }
+                },
+                "capacity": {
+                    "label": "קיבולת"
+                },
+                "castle_type": {
+                    "label": "סוג"
+                },
+                "clothes": {
+                    "label": "ביגוד"
+                },
+                "club": {
+                    "label": "סוג"
+                },
+                "collection_times": {
+                    "label": "זמני איסוף"
+                },
+                "comment": {
+                    "label": "הערה על ערכת שינויים"
+                },
+                "communication_multi": {
+                    "label": "סוגי התקשורת"
+                },
+                "construction": {
+                    "label": "סוג"
+                },
+                "contact/webcam": {
+                    "label": "כתובת המצלמה",
+                    "placeholder": "http://example.com/"
+                },
+                "content": {
+                    "label": "תוכן"
+                },
+                "country": {
+                    "label": "מדינה"
+                },
+                "craft": {
+                    "label": "סוג"
+                },
+                "crane/type": {
+                    "label": "סוג עגורן"
+                },
+                "crossing": {
+                    "label": "סוג"
+                },
+                "cuisine": {
+                    "label": "מטבחים"
+                },
+                "currency_multi": {
+                    "label": "סוגי מטבעות"
+                },
+                "cutting": {
+                    "label": "סוג",
+                    "placeholder": "בררת מחדל"
+                },
+                "cycle_network": {
+                    "label": "רשת"
+                },
+                "cycleway": {
+                    "label": "שבילי אופניים",
+                    "options": {
+                        "lane": {
+                            "description": "שביל אופניים מופרד מתנועת המכוניות בפס צבע",
+                            "title": "שביל אופניים תקני"
+                        },
+                        "none": {
+                            "description": "אין שביל אופניים",
+                            "title": "אין"
+                        }
+                    },
+                    "types": {
+                        "cycleway:left": "צד שמאל",
+                        "cycleway:right": "צד ימין"
+                    }
+                },
+                "date": {
+                    "label": "תאריך"
+                },
+                "delivery": {
+                    "label": "משלוח"
+                },
+                "description": {
+                    "label": "תיאור"
+                },
+                "devices": {
+                    "label": "התקנים"
+                },
+                "diaper": {
+                    "label": "יש החלפת חיתולים"
+                },
+                "display": {
+                    "label": "הצגה"
+                },
+                "dock": {
+                    "label": "סוג"
+                },
+                "duration": {
+                    "label": "משך"
+                },
+                "electrified": {
+                    "label": "חישמול",
+                    "options": {
+                        "contact_line": "קו ליצירת קשר",
+                        "no": "אין",
+                        "rail": "מסילה מחושמלת",
+                        "yes": "יש (לא צוין)"
+                    }
+                },
+                "email": {
+                    "label": "דוא״ל"
+                },
+                "embankment": {
+                    "label": "סוג",
+                    "placeholder": "בררת מחדל"
+                },
+                "emergency": {
+                    "label": "חירום"
+                },
+                "entrance": {
+                    "label": "סוג"
+                },
+                "except": {
+                    "label": "חריגות"
+                },
+                "fax": {
+                    "label": "פקס",
+                    "placeholder": "‎+972 3 777 777"
+                },
+                "fee": {
+                    "label": "עמלה"
+                },
+                "fence_type": {
+                    "label": "סוג"
+                },
+                "fire_hydrant/position": {
+                    "label": "מיקום",
+                    "options": {
+                        "green": "ירוק",
+                        "lane": "נתיב",
+                        "parking_lot": "מגרש חנייה",
+                        "sidewalk": "מדרכה"
+                    }
+                },
+                "fire_hydrant/type": {
+                    "label": "סוג",
+                    "options": {
+                        "underground": "תת־קרקעי",
+                        "wall": "קיר"
+                    }
+                },
+                "fitness_station": {
+                    "label": "סוג הציוד"
+                },
+                "fixme": {
+                    "label": "לתיקון"
+                },
+                "ford": {
+                    "label": "סוג",
+                    "placeholder": "בררת מחדל"
+                },
+                "frequency": {
+                    "label": "תדירות הפעלה"
+                },
+                "fuel": {
+                    "label": "דלק"
+                },
+                "fuel_multi": {
+                    "label": "סוגי דלק"
+                },
+                "gender": {
+                    "label": "מגדר",
+                    "options": {
+                        "female": "נקבה",
+                        "male": "זכר",
+                        "unisex": "יוניסקס"
+                    },
+                    "placeholder": "לא ידוע"
+                },
+                "generator/method": {
+                    "label": "שיטה"
+                },
+                "generator/source": {
+                    "label": "מקור"
+                },
+                "generator/type": {
+                    "label": "סוג"
+                },
+                "government": {
+                    "label": "סוג"
+                },
+                "handicap": {
+                    "label": "נכות"
+                },
+                "healthcare": {
+                    "label": "סוג"
+                },
+                "healthcare/speciality": {
+                    "label": "תחומי מומחיות"
+                },
+                "height": {
+                    "label": "גובה (מטרים)"
+                },
+                "highway": {
+                    "label": "סוג"
+                },
+                "historic": {
+                    "label": "סוג"
+                },
+                "iata": {
+                    "label": "IATA"
+                },
+                "icao": {
+                    "label": "ICAO"
+                },
+                "information": {
+                    "label": "סוג"
+                },
+                "internet_access": {
+                    "label": "גישה לאינטרנט",
+                    "options": {
+                        "no": "אין",
+                        "terminal": "מסוף",
+                        "wired": "קווי",
+                        "wlan": "אלחוטי",
+                        "yes": "יש"
+                    }
+                },
+                "internet_access/fee": {
+                    "label": "עמלת גישה לאינטרנט"
+                },
+                "internet_access/ssid": {
+                    "label": "SSID (שם הרשת)"
+                },
+                "label": {
+                    "label": "תווית"
+                },
+                "lamp_type": {
+                    "label": "סוג"
+                },
+                "landuse": {
+                    "label": "סוג"
+                },
+                "lanes": {
+                    "label": "נתיבים"
+                },
+                "layer": {
+                    "label": "שכבה"
+                },
+                "leaf_type_singular": {
+                    "label": "סוג עלה",
+                    "options": {
+                        "leafless": "ללא עלה"
+                    }
+                },
+                "leisure": {
+                    "label": "סוג"
+                },
+                "length": {
+                    "label": "אורך (מטרים)"
+                },
+                "location": {
+                    "label": "מיקום"
+                },
+                "man_made": {
+                    "label": "סוג"
+                },
+                "manhole": {
+                    "label": "סוג"
+                },
+                "map_size": {
+                    "label": "כיסוי"
+                },
+                "map_type": {
+                    "label": "סוג"
+                },
+                "maxheight": {
+                    "label": "גובה מרבי"
+                },
+                "maxspeed": {
+                    "label": "מגבלת מהירות"
+                },
+                "memorial": {
+                    "label": "סוג"
+                },
+                "name": {
+                    "label": "שם",
+                    "placeholder": "שם נפוץ (אם בכלל)"
+                },
+                "network": {
+                    "label": "רשת"
+                },
+                "network_bicycle": {
+                    "label": "סוג רשת",
+                    "options": {
+                        "icn": "בינלאומי",
+                        "lcn": "מקומי",
+                        "ncn": "לאומי",
+                        "rcn": "אזורי"
+                    }
+                },
+                "network_foot": {
+                    "label": "סוג רשת",
+                    "options": {
+                        "iwn": "בינלאומי",
+                        "lwn": "מקומי",
+                        "nwn": "לאומי",
+                        "rwn": "אזורי"
+                    }
+                },
+                "network_horse": {
+                    "label": "סוג רשת",
+                    "options": {
+                        "ihn": "בינלאומי",
+                        "lhn": "מקומי",
+                        "nhn": "לאומי",
+                        "rhn": "אזורי"
+                    }
+                },
+                "network_road": {
+                    "label": "רשת"
+                },
+                "office": {
+                    "label": "סוג"
+                },
+                "oneway": {
+                    "options": {
+                        "no": "אין",
+                        "yes": "יש"
+                    }
+                },
+                "oneway_yes": {
+                    "label": "חד־סטרי",
+                    "options": {
+                        "no": "אין",
+                        "yes": "יש"
+                    }
+                },
+                "opening_hours": {
+                    "label": "שעות"
+                },
+                "operator": {
+                    "label": "מפעיל"
+                },
+                "outdoor_seating": {
+                    "label": "ישיבה בחוץ"
+                },
+                "park_ride": {
+                    "label": "חנה וסע"
+                },
+                "parking": {
+                    "label": "סוג"
+                },
+                "payment_multi": {
+                    "label": "צורות תשלום"
+                },
+                "phone": {
+                    "label": "טלפון",
+                    "placeholder": "‎+972 3 777 777"
+                },
+                "piste/difficulty": {
+                    "label": "דרגת קושי"
+                },
+                "piste/type": {
+                    "label": "סוג"
+                },
+                "place": {
+                    "label": "סוג"
+                },
+                "power": {
+                    "label": "סוג"
+                },
+                "railway": {
+                    "label": "סוג"
+                },
+                "ref_highway_junction": {
+                    "label": "מספר צומת"
+                },
+                "ref_platform": {
+                    "label": "מספר רציף"
+                },
+                "ref_road_number": {
+                    "label": "מספר כביש"
+                },
+                "ref_stop_position": {
+                    "label": "מספר תחנה"
+                },
+                "ref_taxiway": {
+                    "label": "שם דרך מוניות"
+                },
+                "relation": {
+                    "label": "סוג"
+                },
+                "religion": {
+                    "label": "דת"
+                },
+                "restriction": {
+                    "label": "סוג"
+                },
+                "restrictions": {
+                    "label": "הגבלות פנייה"
+                },
+                "rooms": {
+                    "label": "חדרים"
+                },
+                "route": {
+                    "label": "סוג"
+                },
+                "route_master": {
+                    "label": "סוג"
+                },
+                "second_hand": {
+                    "options": {
+                        "no": "אין",
+                        "only": "בלבד",
+                        "yes": "יש"
+                    },
+                    "placeholder": "יש, אין, בלבד"
+                },
+                "service": {
+                    "label": "סוג"
+                },
+                "service/bicycle": {
+                    "label": "שירותים"
+                },
+                "service/vehicle": {
+                    "label": "שירותים"
+                },
+                "service_rail": {
+                    "label": "סוג שירות"
+                },
+                "service_times": {
+                    "label": "שעות השירות"
+                },
+                "shelter_type": {
+                    "label": "סוג"
+                },
+                "shop": {
+                    "label": "סוג"
+                },
+                "site": {
+                    "label": "סוג"
+                },
+                "smoking": {
+                    "placeholder": "אין, הפרדה, יש…"
+                },
+                "social_facility": {
+                    "label": "סוג"
+                },
+                "source": {
+                    "label": "מקורות"
+                },
+                "sport": {
+                    "label": "ספורט"
+                },
+                "sport_ice": {
+                    "label": "ספורט"
+                },
+                "sport_racing_motor": {
+                    "label": "ספורט"
+                },
+                "sport_racing_nonmotor": {
+                    "label": "ספורט"
+                },
+                "stars": {
+                    "label": "כוכבים"
+                },
+                "start_date": {
+                    "label": "מועד ההתחלה"
+                },
+                "step_count": {
+                    "label": "מספר הצעדים"
+                },
+                "stop": {
+                    "label": "סוג התחנה",
+                    "options": {
+                        "all": "כל הדרכים",
+                        "minor": "דרך משנית"
+                    }
+                },
+                "structure": {
+                    "label": "מבנה",
+                    "options": {
+                        "bridge": "גשר",
+                        "tunnel": "מנהרה"
+                    },
+                    "placeholder": "לא ידוע"
+                },
+                "structure_waterway": {
+                    "label": "מבנה",
+                    "options": {
+                        "tunnel": "מנהרה"
+                    },
+                    "placeholder": "לא ידוע"
+                },
+                "studio": {
+                    "label": "סוג"
+                },
+                "substance": {
+                    "label": "חומר"
+                },
+                "substation": {
+                    "label": "סוג"
+                },
+                "supervised": {
+                    "label": "פיקוח"
+                },
+                "support": {
+                    "label": "תמיכה"
+                },
+                "surface": {
+                    "label": "משטח"
+                },
+                "surveillance": {
+                    "label": "אופן המעקב"
+                },
+                "surveillance/type": {
+                    "label": "סוג המעקב",
+                    "options": {
+                        "ALPR": "קריאת לוחית רעשוי אוטומטית",
+                        "camera": "מצלמה",
+                        "guard": "שמירה"
+                    }
+                },
+                "surveillance/zone": {
+                    "label": "אזור מעקב"
+                },
+                "switch": {
+                    "label": "סוג"
+                },
+                "takeaway": {
+                    "label": "איסוף עצמי",
+                    "options": {
+                        "no": "אין",
+                        "only": "איסוף עצמי בלבד",
+                        "yes": "יש"
+                    },
+                    "placeholder": "יש, אין, איסוף עצמי בלבד…"
+                },
+                "toilets/disposal": {
+                    "options": {
+                        "chemical": "כימיים",
+                        "flush": "הדחה"
+                    }
+                },
+                "tomb": {
+                    "label": "סוג"
+                },
+                "tourism": {
+                    "label": "סוג"
+                },
+                "tourism_attraction": {
+                    "label": "תיירות"
+                },
+                "tower/construction": {
+                    "label": "בנייה"
+                },
+                "tower/type": {
+                    "label": "סוג"
+                },
+                "tracktype": {
+                    "label": "סוג המסלול"
+                },
+                "trade": {
+                    "label": "סוג"
+                },
+                "traffic_calming": {
+                    "label": "סוג"
+                },
+                "traffic_signals": {
+                    "label": "סוג"
+                },
+                "transformer": {
+                    "label": "סוג"
+                },
+                "trees": {
+                    "label": "עצים"
+                },
+                "tunnel": {
+                    "label": "סוג",
+                    "placeholder": "בררת מחדל"
+                },
+                "vending": {
+                    "label": "סוגי הטובין"
+                },
+                "volcano/status": {
+                    "label": "מצב הר געש",
+                    "options": {
+                        "active": "פעיל"
+                    }
+                },
+                "volcano/type": {
+                    "label": "סוג הר הגעש"
+                },
+                "wall": {
+                    "label": "סוג"
+                },
+                "water": {
+                    "label": "סוג"
+                },
+                "waterway": {
+                    "label": "סוג"
+                },
+                "website": {
+                    "label": "אתר"
+                },
+                "wetland": {
+                    "label": "סוג"
+                },
+                "wheelchair": {
+                    "label": "גישה לכסא גלגלים"
+                },
+                "width": {
+                    "label": "רוחב (מטרים)"
+                },
+                "wikipedia": {
+                    "label": "ויקיפדיה"
+                }
+            },
+            "presets": {
+                "address": {
+                    "name": "כתובת"
+                },
+                "advertising/billboard": {
+                    "name": "שלט חוצות"
+                },
+                "aerialway/cable_car": {
+                    "name": "רכבל"
+                },
+                "aerialway/gondola": {
+                    "name": "גונדולה"
+                },
+                "aeroway/aerodrome": {
+                    "name": "נמל תעופה",
+                    "terms": "שדה תעופה, נתב״ג, נתב\"ג"
+                },
+                "aeroway/gate": {
+                    "name": "שער נמל תעופה",
+                    "terms": "שער שדה תעופה, שער טיסה"
+                },
+                "amenity/animal_shelter": {
+                    "name": "בית מחסה לחיות מחמד",
+                    "terms": "תנו לחיות לחיות, צער בעלי חיים, מקלט לחיות"
+                },
+                "amenity/arts_centre": {
+                    "name": "מרכז אומנויות",
+                    "terms": "מתנ״ס, מתנ\"ס, מתנס, אשכול פיס"
+                },
+                "amenity/atm": {
+                    "name": "כספומט"
+                },
+                "amenity/bench": {
+                    "name": "ספסל"
+                },
+                "amenity/bicycle_parking": {
+                    "name": "חניית אופניים"
+                },
+                "amenity/bicycle_rental": {
+                    "name": "השכרת אופניים"
+                },
+                "amenity/bicycle_repair_station": {
+                    "name": "עמדת תיקון אופניים"
+                },
+                "amenity/bureau_de_change": {
+                    "name": "המרת מט״ח",
+                    "terms": "חלפן כספים, צ׳יינג׳, צ'יינג', המרת כסף זר, המרת מט\"ח"
+                },
+                "amenity/cafe": {
+                    "name": "בית קפה"
+                },
+                "amenity/car_rental": {
+                    "name": "השכרת רכב"
+                },
+                "amenity/car_wash": {
+                    "name": "שטיפת רכב"
+                },
+                "amenity/casino": {
+                    "name": "קזינו"
+                },
+                "amenity/charging_station": {
+                    "name": "תחנת טעינה"
+                },
+                "amenity/cinema": {
+                    "name": "קולנוע",
+                    "terms": "בית קולנוע, אקרן, סינמה"
+                },
+                "amenity/clinic": {
+                    "name": "מרפאה",
+                    "terms": "קליניקה"
+                },
+                "amenity/clinic/abortion": {
+                    "name": "מרפאת הפלות"
+                },
+                "amenity/clinic/fertility": {
+                    "name": "מרפאת פוריות"
+                },
+                "amenity/clock": {
+                    "name": "שעון"
+                },
+                "amenity/community_centre": {
+                    "name": "מרכז קהילתי"
+                },
+                "amenity/compressed_air": {
+                    "name": "אוויר דחוס"
+                },
+                "amenity/coworking_space": {
+                    "name": "מתחם עבודה שיתופי"
+                },
+                "amenity/dentist": {
+                    "name": "מרפאת שיניים",
+                    "terms": "רופא שיניים, רופאת שיניים"
+                },
+                "amenity/doctors": {
+                    "name": "רופא",
+                    "terms": "רופאה"
+                },
+                "amenity/drinking_water": {
+                    "name": "מי שתייה"
+                },
+                "amenity/driving_school": {
+                    "name": "בית ספר לנהיגה"
+                },
+                "amenity/embassy": {
+                    "name": "שגרירות"
+                },
+                "amenity/fast_food": {
+                    "name": "מזון מהיר",
+                    "terms": "פאסט פוד"
+                },
+                "amenity/fire_station": {
+                    "name": "תחנת כיבוי אש",
+                    "terms": "תחנת מכבי אש"
+                },
+                "amenity/food_court": {
+                    "name": "מתחם מזון"
+                },
+                "amenity/fountain": {
+                    "name": "מזרקה"
+                },
+                "amenity/fuel": {
+                    "name": "תחנת דלק"
+                },
+                "amenity/grave_yard": {
+                    "name": "בית עלמין",
+                    "terms": "בית קברות"
+                },
+                "amenity/hunting_stand": {
+                    "name": "עמדת ציד"
+                },
+                "amenity/ice_cream": {
+                    "name": "חנות גלידה"
+                },
+                "amenity/library": {
+                    "name": "ספרייה"
+                },
+                "amenity/marketplace": {
+                    "name": "שוק"
+                },
+                "amenity/motorcycle_parking": {
+                    "name": "חניית אופנועים"
+                },
+                "amenity/music_school": {
+                    "name": "בית ספר למוזיקה",
+                    "terms": "בית ספר למוסיקה, ביצפר למוזיקה, ביצפר למוסיקה, קונסרבטוריון"
+                },
+                "amenity/nightclub": {
+                    "name": "מועדון לילה"
+                },
+                "amenity/nursing_home": {
+                    "name": "בית אבות"
+                },
+                "amenity/parking": {
+                    "name": "חניית מכוניות",
+                    "terms": "מגרש חנייה, חנייה"
+                },
+                "amenity/pharmacy": {
+                    "name": "בית מרקחת",
+                    "terms": "סופר פארם, פארמה, ניופארם"
+                },
+                "amenity/place_of_worship/buddhist": {
+                    "name": "מקדש בודהיסטי"
+                },
+                "amenity/place_of_worship/christian": {
+                    "name": "כנסייה"
+                },
+                "amenity/place_of_worship/jewish": {
+                    "name": "בית כנסת"
+                },
+                "amenity/place_of_worship/muslim": {
+                    "name": "מסגד"
+                },
+                "amenity/police": {
+                    "name": "משטרה"
+                },
+                "amenity/post_box": {
+                    "name": "תיבת דואר",
+                    "terms": "תיבת חלוקת דואר"
+                },
+                "amenity/post_office": {
+                    "name": "סניף דואר",
+                    "terms": "משרד דואר, רשות הדואר"
+                },
+                "amenity/pub": {
+                    "name": "פאב",
+                    "terms": "מסבאה, בר"
+                },
+                "amenity/public_bath": {
+                    "name": "מרחצאות ציבוריות"
+                },
+                "amenity/recycling_centre": {
+                    "name": "מרכז מיחזור"
+                },
+                "amenity/scrapyard": {
+                    "name": "מגרש גרוטאות"
+                },
+                "amenity/shower": {
+                    "name": "מקלחת"
+                },
+                "amenity/social_facility/food_bank": {
+                    "name": "בנק אוכל"
+                },
+                "amenity/social_facility/homeless_shelter": {
+                    "name": "בית מחסה למחוסרי דיור",
+                    "terms": "מקלט להומלסים, בית מחסה להומלסים, מקלט למחוסרי דיור"
+                },
+                "amenity/social_facility/nursing_home": {
+                    "name": "בית אבות"
+                },
+                "amenity/studio": {
+                    "name": "סטודיו"
+                },
+                "amenity/swimming_pool": {
+                    "name": "בריכת שחייה"
+                },
+                "amenity/taxi": {
+                    "name": "עמדת מוניות"
+                },
+                "amenity/telephone": {
+                    "name": "טלפון"
+                },
+                "amenity/theatre": {
+                    "name": "תאטרון"
+                },
+                "amenity/toilets": {
+                    "name": "בתי שימוש"
+                },
+                "area": {
+                    "name": "שטח"
+                },
+                "attraction/big_wheel": {
+                    "name": "גלגל ענק"
+                },
+                "attraction/bumper_car": {
+                    "name": "מכוניות מתנגשות"
+                },
+                "attraction/bungee_jumping": {
+                    "name": "באנג׳י"
+                },
+                "attraction/carousel": {
+                    "name": "קרוסלה"
+                },
+                "attraction/pirate_ship": {
+                    "name": "ספינת פיראטים"
+                },
+                "attraction/river_rafting": {
+                    "name": "חתירה בנהר"
+                },
+                "attraction/roller_coaster": {
+                    "name": "רכבת הרים"
+                },
+                "attraction/train": {
+                    "name": "רכבת תיירים"
+                },
+                "attraction/water_slide": {
+                    "name": "מגלשת מים"
+                },
+                "barrier": {
+                    "name": "מחסום"
+                },
+                "barrier/border_control": {
+                    "name": "משמר הגבול",
+                    "terms": "משטרת הגבולות"
+                },
+                "barrier/cattle_grid": {
+                    "name": "מעבר בקר",
+                    "terms": "מעבר פרות"
+                },
+                "barrier/entrance": {
+                    "name": "כניסה"
+                },
+                "barrier/fence": {
+                    "name": "גדר"
+                },
+                "barrier/gate": {
+                    "name": "שער"
+                },
+                "building/garage": {
+                    "name": "מוסך"
+                },
+                "building/garages": {
+                    "name": "מוסכים"
+                },
+                "building/greenhouse": {
+                    "name": "חממה"
+                },
+                "building/house": {
+                    "name": "בית"
+                },
+                "building/hut": {
+                    "name": "בקתה"
+                },
+                "building/industrial": {
+                    "name": "בניין תעשייתי"
+                },
+                "building/public": {
+                    "name": "מבנה ציבור",
+                    "terms": "בניין ציבורי"
+                },
+                "building/roof": {
+                    "name": "גג"
+                },
+                "building/school": {
+                    "name": "בניין בית ספר",
+                    "terms": "מבנה בית ספר, בניין ביצפר, מבנה ביצפר"
+                },
+                "building/stable": {
+                    "name": "אורווה"
+                },
+                "building/train_station": {
+                    "name": "תחנת רכבת"
+                },
+                "club": {
+                    "name": "מועדון"
+                },
+                "landuse/allotments": {
+                    "name": "גינה קהילתית"
+                },
+                "type/restriction/no_left_turn": {
+                    "name": "אין פנייה שמאלה"
+                },
+                "type/restriction/no_right_turn": {
+                    "name": "אין פנייה ימינה"
+                },
+                "type/restriction/no_straight_on": {
+                    "name": "אי אפשר להמשיך ישר"
+                },
+                "type/restriction/no_u_turn": {
+                    "name": "אין פניית פרסה"
+                },
+                "type/restriction/only_left_turn": {
+                    "name": "פנייה שמאלה בלבד"
+                },
+                "type/restriction/only_right_turn": {
+                    "name": "פנייה ימינה בלבד"
+                },
+                "type/restriction/only_straight_on": {
+                    "name": "אין פניות"
+                },
+                "type/route": {
+                    "name": "נתיב"
+                },
+                "type/route/bicycle": {
+                    "name": "מסלול אופניים"
+                },
+                "type/route/bus": {
+                    "name": "נתיב אוטובוסים"
+                },
+                "type/route/detour": {
+                    "name": "נתיב עקיפה"
+                },
+                "vertex": {
+                    "name": "אחר"
+                },
+                "waterway/boatyard": {
+                    "name": "מרינה"
+                },
+                "waterway/canal": {
+                    "name": "תעלה"
+                },
+                "waterway/dam": {
+                    "name": "סכר"
+                },
+                "waterway/fuel": {
+                    "name": "תחנת תדלוק ימית"
+                },
+                "waterway/river": {
+                    "name": "נחל"
+                },
+                "waterway/waterfall": {
+                    "name": "מפל"
+                }
+            }
+        },
+        "imagery": {
+            "Bing": {
+                "description": "צילומי אוויר ולוויין.",
+                "name": "צילומי אוויר של Bing"
+            },
+            "DigitalGlobe-Premium": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                },
+                "description": "צילומי לוויין של Premium DigitalGlobe.",
+                "name": "צילומי DigitalGlobe Premium"
+            },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                }
+            },
+            "DigitalGlobe-Standard": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                },
+                "description": "צילומי לוויין תקניים של DigitalGlobe.",
+                "name": "צילומים תקניים של DigitalGlobe"
+            },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                },
+                "description": "גבולות ומועדי צילום. תוויות מופיעות ברמות תקריב של 14 ומעלה."
+            },
+            "EsriWorldImagery": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                }
+            },
+            "MAPNIK": {
+                "attribution": {
+                    "text": "מתנדבי © OpenStreetMap,‏ CC-BY-SA"
+                },
+                "description": "שכבת בררת המחדל של OpenStreetMap.",
+                "name": "OpenStreetMap (תקני)"
+            },
+            "Mapbox": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                },
+                "description": "צילומי אוויר ולוויין.",
+                "name": "Mapbox לווייני"
+            },
+            "OSM_Inspector-Addresses": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‮ CC-BY-SA"
+                },
+                "name": "חוקר OSM: כתובות"
+            },
+            "OSM_Inspector-Geometry": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "חוקר OSM: גאומטריה"
+            },
+            "OSM_Inspector-Highways": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "חוקר OSM: כבישים מהירים"
+            },
+            "OSM_Inspector-Multipolygon": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "חוקר OSM: שטח"
+            },
+            "OSM_Inspector-Places": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "חוקר OSM: מיקומים"
+            },
+            "OSM_Inspector-Routing": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, מתנדבי OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "חוקר OSM: ניתוב"
+            },
+            "OSM_Inspector-Tagging": {
+                "attribution": {
+                    "text": "© Geofabrik GmbH, תורמי OpenStreetMap,‮ CC-BY-SA"
+                },
+                "name": "חוקר OSM: תיוג"
+            },
+            "hike_n_bike": {
+                "attribution": {
+                    "text": "מתנדבי © OpenStreetMap"
+                },
+                "name": "טיולים ואופניים"
+            },
+            "mapbox_locator_overlay": {
+                "attribution": {
+                    "text": "תנאים ומשוב"
+                }
+            },
+            "openpt_map": {
+                "attribution": {
+                    "text": "תורמי ‎© OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "מפת OpenPT (שכבת על)"
+            },
+            "osm-gps": {
+                "attribution": {
+                    "text": "תורמי ‎© OpenStreetMap"
+                },
+                "description": "עקבות GPS ציבוריות שהועלו ל־OpenStreetMap.",
+                "name": "עקבות GPS של OpenStreetMap"
+            },
+            "osm-mapnik-black_and_white": {
+                "attribution": {
+                    "text": "תורמי ‎© OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "OpenStreetMap (שחור ולבן תקני)"
+            },
+            "osm-mapnik-german_style": {
+                "attribution": {
+                    "text": "מתנדבי ‎© OpenStreetMap,‏ CC-BY-SA"
+                },
+                "name": "OpenStreetMap (סגנון גרמני)"
+            },
+            "qa_no_address": {
+                "attribution": {
+                    "text": "Simon Poole, נתונים באדיבות מתנדבי ©OpenStreetMap"
+                }
+            },
+            "skobbler": {
+                "attribution": {
+                    "text": "© אריחים: skobbler נתוני מפה: מתנדבי OpenStreetMap"
+                },
+                "name": "skobbler"
+            },
+            "stamen-terrain-background": {
+                "attribution": {
+                    "text": "אריחי מפה מאת Stamen Design, תחת הרשיון CC BY 3.0"
+                }
+            },
+            "tf-cycle": {
+                "name": "Thunderforest OpenCycleMap"
+            },
+            "tf-landscape": {
+                "attribution": {
+                    "text": "מפות © Thunderforest, נתונים באדיבות מתנדבי © OpenStreetMap"
+                }
+            }
         }
     }
 }
\ No newline at end of file
index 8180f8a705a05060352aeed3b23aa88d87ce1526..c7519ecf1a896fcaf6f5b93209b37b57f1ddefbd 100644 (file)
                 "building_area": {
                     "label": "इमारत"
                 },
-                "cardinal_direction": {
-                    "options": {
-                        "E": "पूर्व",
-                        "N": "उत्तर",
-                        "S": "दक्षिण",
-                        "W": "पश्चिम"
-                    }
-                },
                 "date": {
                     "label": "दिनॉंक"
                 },
                 "name": {
                     "label": "नाम"
                 },
-                "parallel_direction": {
-                    "label": "दिशा"
-                },
                 "plant": {
                     "label": "पौधा"
                 },
index 783d180089ce55b359fdde4bfe5be8dd1c2b3a27..74394a50fd3424518141e2861f19d4acad84e3cc 100644 (file)
             "created": "Stvoreno",
             "about_changeset_comments": "O komentarima promjena",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Spomenuo/la si Google u ovom komentaru: molim te zapamti da je kopiranje s Google karata strogo zabranjeno.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Spomenuo/la si Google u ovom komentaru: molim te zapamti da je kopiranje s Google karata strogo zabranjeno."
         },
         "contributors": {
             "list": "Uređivali {users}",
         "background": {
             "title": "Podloga",
             "description": "Postavke podloge",
-            "percent_brightness": "{opacity}% svjetline",
             "none": "Nijedna",
             "best_imagery": "Najpoznatiji izvornik snimaka za ovo područje",
             "switch": "Vrati nazad na ovu podlogu",
             "custom": "Podesivo",
             "custom_button": "Uredi prilagođenu podlogu",
-            "fix_misalignment": "Popravi odstupanje snimaka",
-            "imagery_source_faq": "Koji su izvornici ovih snimaka?",
             "reset": "resetiraj",
-            "offset": "Pomakni bilo gdje na donjem sivom području za usklađivanje snimaka, ili unesi iznose odstupanja u metrima.",
             "minimap": {
-                "description": "Mini karta",
                 "tooltip": "Prikaži udaljeni prikaz karte za lakše lociranje trenutno prikazanog područja."
-            }
+            },
+            "fix_misalignment": "Popravi odstupanje snimaka",
+            "offset": "Pomakni bilo gdje na donjem sivom području za usklađivanje snimaka, ili unesi iznose odstupanja u metrima."
         },
         "map_data": {
             "title": "Podaci karte",
             "untagged_area_tooltip": "Odaberi element karte koji opisuje što ovo područje predstavlja.",
             "untagged_relation": "Neoznačena relacija",
             "untagged_relation_tooltip": "Odaberi element karte koji opisuje što ova relacija predstavlja.",
-            "many_deletions": "Brišeš {n} elemenata. Jesi li siguran/na da to želiš učiniti? Ovo će ih obrisati sa karte koju svi vide na openstreetmap.org.",
             "tag_suggests_area": "Oznaka {tag} ukazuje da bi linija trebala biti područje, ali nije područje",
             "deprecated_tags": "Zastarjele oznake: {tags}"
         },
             "view_on_mapillary": "Pogledaj ovu sliku na Mapillary"
         },
         "help": {
-            "title": "Pomoć",
-            "help": "# Pomoć\n\niD je mrežna aplikacija za uređivanje [OpenStreetMapa](http://www.openstreetmap.org/),\nbesplatne karte svijeta. Možeš ju koristiti za dodavanje\ni obnavljanje podataka u svojoj okolini, čime stvaraš bolju otvorenu kartu svijeta dostupnu svima, uključujući izvorne podatke karte.\n\nIspravke i sadržaj koji napraviš na karti biti će vidljive svakome tko koristi\nOpenStreetMap. Da bi mogao/la uređivati kartu, trebaš se\n[prijaviti](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) je suradnički projekt sa [izvornim kôdom\ndostupnim na GitHubu](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GNSS\n\nGNSS podaci su najpouzdaniji izvor podataka za OpenStreetMap. Ovaj uređivač\npodržava lokalne tragove - `.gpx` datoteteke s tvog računala. Takav oblik GNSS\ntraga možeš prikupiti s raznim aplikacijama za pametne telefone kao i s drugim\nGNSS/GPS uređajima.\n\nZa više informacija o postupku izmjere pomoću GNSS satelita, pročitaj članak\n[\"Kartiranje s pametnim telefonom, GPS-om ili papirom\"](http://learnosm.org/en/mobile-mapping/).\n\nKako bi koristio/la GPX tragove za kartiranje, povuci i ispusti GPX datoteku na uređivač\nkarte. Ako se datoteka ispravno učita, biti će dodana na kartu kao linija svjetlo ljubičaste\nboje. Klikni na izbornik \"Podaci karte\" s desne strane za uključivanje, isključivanje\nili približenje na taj novi GPX sloj.\n\nGPX trag nije direktno postavljen na OpenStreetMap, samo je prikazan na karti. Da bi ga\niskoristio/la na najbolji način, preko njega crtaj na karti koristeći ga kao vodilju za\ndodavanje novih elemenata. Trag možeš također [postaviti na OpenStreetMap](http://www.openstreetmap.org/trace/create)\nkako bi ga i drugi korisnici mogli koristiti.\n",
-            "imagery": "# Fotografski snimci\n\nZračni snimci su važan izvor za kartiranje. Kombinacija snimaka iz aviona,\nsatelitskih snimaka i drugih besplatno prikupljenih izvornika je dostupna s\ndesne strane u izborniku \"Postavke podloge\".\n\nPočetno je u pozadini kao podloga prikazan sloj satelitskih snimaka [karte Bing Maps](http://www.bing.com/maps/). Novi izvornici postaju dostupni pomicanjem\ni približenjem karte na novo geografsko područje. Neke države, poput SAD-a,\nFrancuske i Danske imaju dostupne vrlo kvalitetne snimke za određena\npodručja.\n\nSnimke su ponekad pomaknute u odnosu na podatke karte zbog pogreške\nna koordinatama izvornih snimaka. Ako vidiš puno cesta izmaknutih u\nodnosu na pozadinu, nemoj ih odmah pomicati da se poklope sa pozadinom.\nUmjesto toga, možeš podesiti snimke da odgovaraju postojećim podacima\ntako da klikneš \"Popravi odstupanje\" na dnu izbornika \"Postavke pozadine\".\n",
-            "addresses": "# Adrese\n\nAdrese spadaju u najkorisnije informacije na karti.\n\nIako su adrese često prikazane kao dio ulica, na OpenStreetMap karti su zapisane\nkao svojstva građevina i mjesta uzduž ulica.\n\nMožeš dodati informacije o adresi na mjesta kartirana kao rub građevine, ali i na\ngrađevine koje su kartirane kao točkasti objekt. Najbolji izvor podataka o adresama\nje prikupljanje podataka na terenu ili iz osobnog znanja - kao i svakog drugog\nelementa, kopiranje sa komercijalnih izvora poput Google Maps servisa je strogo\nzabranjeno.\n",
-            "inspector": "# Uređivač elemenata\n\nUređivač elemenata je dio korisničkog sučelja na lijevoj strani stranice koji se\npojavljuje nakon što se neki element karte odabere i on omogućava uređivanje detalja elementa.\n\n### Odabir vrste elementa karte\n\nNakon što dodaš točku, liniju ili područje, možeš odabrati koje je vrste taj element,\nnpr. je li to državna cesta ili ulica, veletrgovina ili kafić. Uređivač elemenata će prikazati\ntipke za često korištene vrste elemenata, a ostale možeš pronaći upisivanjem naziva vrste\nkoju tražiš u okvir za pretraživanje.\n\nKlikni na \"i\" na desnoj strani vrste elementa da saznaš više o tom elementu karte.\nKlikni na tipku sa imenom vrste da odabereš tu vrstu.\n\n### Korištenje obrazaca i oznaka\n\nNakon što odabereš vrstu elementa ili kada odabereš element koji već ima defeniranu\nvrstu, uređivač elemenata će ti prikazati polja sa detaljima o elementu, npr. njegovo ime i adresu.\n\nIspod polja možeš kliknuti na ikone za dodavanje drugih detalja, npr. poveznicu na\nWikipediju, pristup invalidskim kolicima i drugo.\n\nNa dnu uređivača elemenata, klikni na \"Sve oznake\" za dodavanje proizvoljnih drugih oznaka za\nelemente. [Taginfo](http://taginfo.openstreetmap.org/) je izvrstan izvornik za učenje\no popularnim kombinacijama oznaka koje se koriste.\n\nPromjene koje napraviš u uređivaču elemenata su automatski primijenjene na kartu.\nMožeš poništiti promjene u bilo kojem trenutku pritiskom na tipku \"Poništi\".\n"
+            "title": "Pomoć"
         },
         "intro": {
             "done": "gotovo",
             },
             "areas": {
                 "title": "Područja",
-                "add_playground": "*Područja* se koriste za prikaz granica elemenata karte kao što su npr.: jezera, zgrade i naseljena područja.{br}Također se mogu koristiti za detaljnije kartiranje mnogih elemenata karte koje bi inače kartirali kao točke. **Klikni na gumb {button} Područje za dodavanje novog područja.**",
                 "start_playground": "Idemo dodati ovo igralište na kartu crtajući područje. Područja se crtaju postavljanjem *čvorova* uzduž vanjske granice elementa. **Klikni ili pritisni razmaknicu za postavljanje početnog čvora na jedan od uglova igrališta.**",
                 "finish_playground": "Završi crtanje područja pritiskom tipke enter, ili tako da ponovno klikneš na početni ili posljednji čvor. **Završi crtanje područja igrališta.**",
                 "search_playground": "**Nađi '{preset}' pomoću tražilice.**",
                     "label": "Kapacitet",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Smijer",
-                    "options": {
-                        "E": "Istok",
-                        "ENE": "Istok-sjeveroistok",
-                        "ESE": "Istok-jugoistok",
-                        "N": "Sjever",
-                        "NE": "Sjeveroistok",
-                        "NNE": "Sjever-sjeveroistok",
-                        "NNW": "Sjever-sjeverozapad",
-                        "NW": "Sjeverozapad",
-                        "S": "Jug",
-                        "SE": "Jugoistok",
-                        "SSE": "Jug-jugoistok",
-                        "SSW": "Jug-jugozapad",
-                        "SW": "Jugozapad",
-                        "W": "Zapad",
-                        "WNW": "Zapad-sjeverozapad",
-                        "WSW": "Zapad-jugozapad"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Smjer",
-                    "options": {
-                        "anticlockwise": "U suprotnom smijeru od kazaljke na satu",
-                        "clockwise": "U smijeru kazaljke za satu"
-                    }
-                },
                 "collection_times": {
                     "label": "Vrijeme preuzimanja"
                 },
                 "amenity/bureau_de_change": {
                     "name": "Mjenjačnica"
                 },
-                "amenity/bus_station": {
-                    "name": "Autobusni kolodvor"
-                },
                 "amenity/cafe": {
                     "name": "Kafić",
                     "terms": "kafić,cafe,caffee,kafeterija,caffe bar,kavana"
                     "name": "Brza hrana",
                     "terms": "brza hrana,restoran brze hrane,jela s roštilja,hamburger,pommes frites"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Trajektni terminal"
-                },
                 "amenity/fire_station": {
                     "name": "Vatrogasna postaja",
                     "terms": "vatrogasci,protupožarna stanica,vatrogasna stanica,protupožarna postaja"
                     "name": "Rendžerska postaja",
                     "terms": "rendžerska postaja,rendžerska služba,stanica rendžerske službe,rendžerska stanica,rendžer"
                 },
-                "amenity/recycling": {
-                    "name": "Recikliranje"
-                },
                 "amenity/register_office": {
                     "name": "Matični ured"
                 },
                 "highway/bridleway": {
                     "name": "Staza za konje"
                 },
-                "highway/bus_stop": {
-                    "name": "Autobusna stanica",
-                    "terms": "bus stanica,stanica za bus,autobusna stanica,busna stanica"
-                },
                 "highway/corridor": {
                     "name": "Hodnik"
                 },
                     "name": "Šuma",
                     "terms": "šuma,održavana šuma,šuma nasada,upravljana šuma"
                 },
-                "landuse/garages": {
-                    "name": "Garaže"
-                },
                 "landuse/grass": {
                     "name": "Travnjak"
                 },
                     "name": "Transformator",
                     "terms": "transformator, transformator el. energije,transformator struje"
                 },
-                "public_transport/platform": {
-                    "name": "Stajalište",
-                    "terms": "platforma"
-                },
-                "public_transport/stop_position": {
-                    "name": "Stop pozicija"
-                },
                 "railway": {
                     "name": "Željeznica"
                 },
                 "railway/funicular": {
                     "name": "Uspinjača"
                 },
-                "railway/halt": {
-                    "name": "Željeznička stanica",
-                    "terms": "željeznička stanica,željeznička postaja,stanica za vlak"
-                },
                 "railway/monorail": {
                     "name": "Jednotračna željeznička pruga",
                     "terms": "monorail željeznička pruga,pruga sa jednim kolosjekom"
                 "railway/narrow_gauge": {
                     "name": "Uskotračna željeznica"
                 },
-                "railway/platform": {
-                    "name": "Željeznički peron",
-                    "terms": "željeznički peron,peron,platforma,željeznička platforma"
-                },
                 "railway/rail": {
                     "name": "Željeznička pruga",
                     "terms": "željeznička pruga,pruga pune širine,željeznica pune veličine"
                 },
-                "railway/station": {
-                    "name": "Željeznički kolodvor",
-                    "terms": "željeznička stanica,stanica za vlak,željeznička postaja,kolodvor,željeznički kolodvor"
-                },
                 "railway/subway": {
                     "name": "Podzemna željeznica",
                     "terms": "podzemna željeznica,željeznica ispod zemlje,metro,gradska željeznica,gradska podzemna željeznica"
                     "name": "Zlatarnica",
                     "terms": "zlatarna,zlatara,zlatar"
                 },
-                "shop/kiosk": {
-                    "name": "Kiosk za novine"
-                },
                 "shop/kitchen": {
                     "name": "Trgovina kuhinjskog namještaja",
                     "terms": "kuhinje, pećnice, hladnjak"
                 "name": "OSM Inspector: Označavanje"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, podaci karte OpenStreetMap doprinositelji, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Biciklizam"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, podaci karte OpenStreetMap doprinositelji, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Planinarenje"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, podaci karte OpenStreetMap doprinositelji, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, podaci karte OpenStreetMap doprinositelji, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Rolanje"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, podaci karte OpenStreetMap doprinositelji, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Zimski sportovi"
             },
             "basemap.at": {
index 91b06d9b652333a1484fc4b49740b5fc2336ff24..396364939fe074a4c9fb11e7e6bbdb7dccefde6f 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Kattints, hogy új pontokat adj a vonalhoz. Kattints egy másik vonalra, hogy összekösd őket, dupla kattintással pedig be tudod fejezni a vonalat."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Nem szerkeszthető, mert egy rejtett elemhez csatlakozik."
             }
         },
         "operations": {
             "about_changeset_comments": "A módosításcsomag megjegyzésekről",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Hu:Good_changeset_comments",
             "google_warning": "Megemlítetted a Google-t a megjegyzésben: ne felejtsd, hogy a Google Mapsből történő másolás szigorúan tilos.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Szerkesztette {users}",
                 "title": "Mérés",
                 "selected": "{n} kiválasztott",
                 "geometry": "Geometria",
-                "closed": "zárt",
                 "center": "Középpont",
                 "perimeter": "Kerület",
                 "length": "Hossz",
                 "centroid": "Súlypont",
                 "location": "Helyszín",
                 "metric": "Metrikus",
-                "imperial": "Angolszász"
+                "imperial": "Angolszász",
+                "node_count": "Csomópontok száma"
             }
         },
         "geometry": {
             "title": "Háttér",
             "description": "Háttérbeállítások",
             "key": "B",
-            "percent_brightness": "{opacity}% fényerő",
+            "backgrounds": "Háttérek",
             "none": "Nincs",
             "best_imagery": "Legjobb ismert légifeltétel ehhez a helyszínhez",
             "switch": "Visszaváltás erre a háttérre",
             "custom": "Egyéni",
             "custom_button": "Egyedi háttér szerkesztése",
-            "custom_prompt": "Adj meg egy csempe URL sablont. Érvényes tokenek:\n   - {zoom}/{z}, {x}, {y}  a Z/X/Y csempe sémához\n   - {ty} a tükrözött TMS stílusú Y koordinátákhoz\n   - {u} a quadtile sémához\n   - {switch:a,b,c} a DNS szerver multiplexeléshez\n\nPéldául:\n{example}",
-            "fix_misalignment": "Légifelvétel elcsúszásának korrigálása",
-            "imagery_source_faq": "Honnan jön ez a légifelvétel?",
+            "overlays": "Előterek",
+            "imagery_source_faq": "Információ a légiképről / Probléma jelentése",
             "reset": "visszavonás",
-            "offset": "Húzz bárhol a lenti szürke területen a légifelvétel elcsúszásának korrigálásához, vagy add meg az elcsúszást méterben.",
+            "display_options": "Megjelenítési beállítások",
+            "brightness": "Világosság",
+            "contrast": "Kontraszt",
+            "saturation": "Telítettség",
+            "sharpness": "Élesség",
             "minimap": {
-                "description": "Minitérkép",
+                "description": "Minitérkép bekapcsolása",
                 "tooltip": "Áttekintő térkép mutatása a megjelenített terület meghatározásához.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Légifelvétel elcsúszásának korrigálása",
+            "offset": "Húzz bárhol a lenti szürke területen a légifelvétel elcsúszásának korrigálásához, vagy add meg az elcsúszást méterben."
         },
         "map_data": {
             "title": "Térképadatok",
             "status_code": "A kiszolgáló a(z) {code} státuszkóddal válaszolt",
             "unknown_error_details": "Győződj meg arról, hogy csatlakozol-e az internethez.",
             "uploading": "Változtatások feltöltése az OpenStreetMapre…",
+            "conflict_progress": "Ütközések ellenőrzése: {num}. a {total}-ból",
             "unsaved_changes": "Elmentetlen változtatásaid vannak",
             "conflict": {
                 "header": "Ütköző módosítások feloldása",
             "untagged_area_tooltip": "Jelöld ki azt az elemtípust, amely leírja, hogy mi ez a terület.",
             "untagged_relation": "Címkézetlen kapcsolat",
             "untagged_relation_tooltip": "Jelölj ki egy elemtípust, amely leírja, hogy mi ez a kapcsolat.",
-            "many_deletions": "{n} elem törlésére készülsz. Biztosan ezt szeretnéd? Ez törli őket arról a térképről, amelyet mindenki más is lát az openstreetmap.org oldalon.",
             "tag_suggests_area": "A(z) {tag} címke alapján a vonal terület kéne legyen, de ez nem terület",
             "deprecated_tags": "Elavult címkék: {tags}"
         },
         "help": {
             "title": "Súgó",
             "key": "H",
-            "help": "# Súgó\n\nEz egy szerkesztő az [OpenStreetMap](http://www.openstreetmap.org/)hez, a szabadon szerkeszthető és felhasználható világtérképhez. A környezetedről tölthetsz fel, vagy frissíthetsz adatokat, ezáltal mindenki számára jobbá téve egy ingyenes térképet.\n\nAmit ezen a térképen alkotsz, mindenki számára látható lesz, aki használja az OpenStreetMapet. A szerkesztéshez [be kell jelentkezned]\n(https://www.openstreetmap.org/login)\n\nAz [iD szerkesztő](http://ideditor.com/) egy együttműködésen alapuló projekt, a [GitHub-on elérhető forráskóddal](https://github.com/openstreetmap/iD). Fordításába és fejlesztésébe te is besegíthetsz.\n",
-            "gps": "#GPS\n\nAz összegyűjtött GPS nyomvonalak hasznos adatok az OpenStreetMap számára. Ez a szerkesztő\ntámogatja a helyi nyomvonalakat - `.gpx` fájlok a saját gépeden. Ezeket a\nGPS nyomvonalakat begyűjtheted jó pár okostelefon alkalmazással, vagy\nszemélyi GPS eszközökkel.\n\nTovábbi információkért, hogy hogy kell GPS felmérést végezni, olvasd el a\n[Térképezés okostelefonnal, GPS-szel, vagy papíron](http://learnosm.org/en/mobile-mapping/) cikket.\n\nHogy egy GPX sávot térképezéshez használj, fogd és vidd a GPX fájlt a térképszerkesztőre. Ha felismeri a program, akkor hozzáadásra kerül a térképre, mint egy fényes lila\nvonal. Kattints a „Térképadatok” menüre jobb oldalt a bekapcsoláshoz, kikapcsoláshoz vagy közelítéshez a GPX-vezérelt rétegen.\n\nA GPX sáv nem kerül közvetlen feltöltésre az OpenStreetMapbe - a legjobb módszer a használatára az,\nhogy rajzolsz a térképre, és az új elemek felviteléhez segítségként használod,\nmajd [feltöltöd az OpenStreetMapbe](http://www.openstreetmap.org/trace/create),\nhogy mások is használni tudják.\n",
-            "imagery": "# Légifelvétel\n\nA légifelvétel a térképezés egyik fontos forrása. A repülőgépes ortofotók, műholdképek és szabadon összeállított források kombinációja rendelkezésre áll a szerkesztőben a bal oldali menü „Háttérbeállítások” gombjára kattintva.\n\nAlapértelmezésként a [Bing Maps](http://www.bing.com/maps/) műholdkép réteg jelenik meg a szerkesztőben, de ahogy új helyekre görgeted a térképet, új források jelennek meg. Néhány országban, mint az Egyesül Államok, Franciaország, vagy Dánia nagyon jó minőségű légifelvételek érhetőek el egyes területeken.\n\nA légifelvételek gyakran el vannak csúszva a valósághoz képest, a légifelvétel szolgáltatók hibájából. Ha látsz egy csomó utat eltolódva a háttértől, ne húzd őket rögtön a háttérképhez. Ehelyett igazítsd úgy a háttérképet, hogy a meglévő adatok illeszkedjenek rá. Ehhez kattints a Háttérbeállítások menü „Elcsúszás korrigálása” gombjára.\n",
-            "addresses": "# Lakcímek\n\nA lakcímek a térkép egyik leghasznosabb információi.\n\nHabár a címeket gyakran az utca részeként ábrázolják, az OpenStreetMap\naz utca mentén levő házak és helyek tulajdonságaiként tárolja őket.\n\nCím információkat adhatsz épület körvonalként felrajzolt helyekhez, vagy\nönálló pontokhoz. A címadatok javasolt forrása a helyszíni felmérés, vagy\nszemélyes ismeretek. Mint minden más adatnál, a kereskedelmi források\n(mint Google Maps) másolása szigorúan tilos.\n",
-            "inspector": "#A címkeszerkesztő használata\n\nA címkeszerkesztő az oldal bal oldalán a kiválasztott\nelemek szerkesztésére szolgál.\n\n### Elemtípus kijelölése\n\nMiután hozzáadsz egy pontot, vonalat vagy területet, kijelölheted a típusát, hogy\negy autópálya, városi út, szupermarket vagy kávézó.\nA címkeszerkesztő megjeleníti a gyakori elemtípusokat, valamint\nkikereshetsz másokat is a keresőmezőbe gépeléssel.\n\nKattints az „i” gombra a jobb alsó sarokban, hogy\ntöbbet tudj meg az elemtípusról. Kattints rá a kijelöléséhez.\n\n### Űrlapok használata és címkék szerkesztése\n\nMiután kiválasztottad az elemtípust, vagy kiválasztottad a már meglévő típust,\nakkor a címkeszerkesztő megjeleníti a részleteit, mint\na neve és a címe.\n\nA látható mezők alatt megnyomhatod a „Mező hozzáadása” legördülőt a további\nrészletek hozzáadásához, mint például egy Wikipedia link, kerekesszékes elérés és így tovább.\n\nA címkeszerkesztő alján kattints a „További címkék”-re hogy tetszőleges\nmás címkéket adj az elemhez. A [Taginfo](http://taginfo.openstreetmap.org/) egy nagyszerű forrás a népszerű címkekombinációk megismerésére.\n\nA változtatások, amiket a címkeszesztőben végzel, automatikusan végrehajtódnak a térképen.\nEzeket bármikor visszavonhatod a „Visszavonás” gombbal.\n"
+            "help": {
+                "title": "Súgó",
+                "welcome": "Isten hozott az [OpenStreetMap](https://www.openstreetmap.org/) iD szerkesztőjében. Ezzel a szerkesztővel közvetlenül a webböngésződből frissítheted a térképet.",
+                "open_data_h": "Nyílt hozzáférésű adatok",
+                "open_data": "A térképen elvégzett szerkesztéseidet mindenki látni fogja, aki az OpenStreetMapet használja. Szerkesztéseid alapja lehet személyes helyismereted, helyszíni felmérés vagy légi, illetve utcaszintű fényképek. A kereskedelmi forrásokból (pl. Google Maps) történő másolás [szigorúan tilos] (https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Mielőtt nekikezdenél",
+                "open_source_h": "Nyílt forrású"
+            },
+            "overview": {
+                "title": "Áttekintő",
+                "navigation_h": "Navigáció",
+                "features_h": "Térképszolgáltatások",
+                "nodes_ways": "Az OpenStreetMapben a pontokat angolul *node*-nak („csomópont”), a vonalakat *way*-nek („út”) mondjuk."
+            },
+            "editing": {
+                "title": "Szerkesztés és mentés",
+                "select_h": "Kijelölés",
+                "multiselect_h": "Többszörös kijelölés",
+                "undo_redo_h": "Visszavonás és helyrehozás",
+                "save_h": "Mentés",
+                "upload_h": "Feltöltés",
+                "backups_h": "Autómatikus bisztonsági mentés",
+                "keyboard_h": "Gyorsbillentyűk"
+            },
+            "feature_editor": {
+                "title": "Elemszerkesztő",
+                "type_h": "Elemtípus",
+                "fields_h": "Mezők",
+                "tags_h": "Címkék"
+            },
+            "points": {
+                "title": "Pontok",
+                "add_point_h": "Pontok hozzáadása",
+                "move_point_h": "Pontok mozgatása",
+                "delete_point_h": "Pontok törlése"
+            },
+            "lines": {
+                "title": "Vonalok",
+                "add_line_h": "Vonalok hozzáadása",
+                "modify_line_h": "Vonalok módosítása",
+                "connect_line_h": "Vonalok összekötése",
+                "disconnect_line_h": "Vonalok szétkapcsolása",
+                "move_line_h": "Vonalok mozgatása",
+                "delete_line_h": "Vonalok törlése"
+            },
+            "areas": {
+                "title": "Területek",
+                "point_or_area_h": "Pontok vagy Területek?",
+                "add_area_h": "Területek hozzáadása",
+                "square_area_h": "Derékszöges sarkok",
+                "modify_area_h": "Területek módosítása",
+                "delete_area_h": "Területek törlése"
+            },
+            "relations": {
+                "title": "Kapcsolatok",
+                "edit_relation_h": "Kapcsolatok szerkesztése",
+                "maintain_relation_h": "Kapcsolatok fenntartása",
+                "relation_types_h": "Kapcsolattípusok",
+                "multipolygon_h": "Multipoligonok",
+                "turn_restriction_h": "Kanyarodási korlátozások",
+                "route_h": "Útvonalak",
+                "boundary_h": "Határok"
+            },
+            "imagery": {
+                "title": "Légifelvétel-háttér",
+                "sources_h": "Légifelvételforrások",
+                "offsets_h": "Légifelvétel elcsúszásának korrigálása"
+            },
+            "streetlevel": {
+                "title": "Utcafotók",
+                "using_h": "Utcafotók használata"
+            },
+            "gps": {
+                "title": "GPS nyomvonalok",
+                "using_h": "GPS nyomvonal használata"
+            }
         },
         "intro": {
             "done": "kész",
             },
             "areas": {
                 "title": "Területek",
-                "add_playground": "A *területeket* különféle elemek – pl. tavak, épületek vagy lakóterüetek – határainak megjelölésére használjuk.{br}Arra is használhatók, hogy részletesebben jelenítsünk meg olyan elemeket, amelyeket rendesen esetleg csak pontként rajzolnánk föl. **Egy új terület fölrajzolásához kattints a {button} Terület gombra.**",
                 "start_playground": "Adjuk hozzá ezt a játszóteret a térképhez úgy, hogy rajzolunk belőle egy területet. Területeket úgy rajzolunk, hogy *pontokat* helyezünk el az elem külső pereme mentén. **A kezdő pont elhelyezéséhez kattints vagy üsd le a szóközt a játszótér valamelyik sarkánál.**",
                 "continue_playground": "A terület rajzolását úgy folytathatod, hogy további pontokat teszel a játszótér szélére. Helyes dolog összekapcsolni a területet a meglévő gyalogutakkal.{br}Tipp: Az '{alt}' billentyű lenyomva tartásával megakadályozható, hogy a pontok más elemekhez kapcsolódjanak. **Folytasd a játszótér területének megrajzolását!**",
                 "finish_playground": "Fejezd be a területet az Enter megnyomásával, vagy újra az első vagy utolsó elemre kattintással. **Fejezd be a játszótér területének megrajzolását.**",
                     "title": "Elemek kiválasztása",
                     "select_one": "Egyetlen elem kiválasztása",
                     "select_multi": "Több elem kiválasztása",
-                    "lasso": "Kiválasztási lasszó rajzolása az elemek köré"
+                    "lasso": "Kiválasztási lasszó rajzolása az elemek köré",
+                    "search": "Szolgáltatások keresése"
                 },
                 "with_selected": {
                     "title": "A kiválasztott elemmel",
                     "label": "Kapacitás",
                     "placeholder": "50, 100, 200…"
                 },
-                "cardinal_direction": {
-                    "label": "Irány",
-                    "options": {
-                        "E": "Kelet",
-                        "ENE": "Kelet-északkelet",
-                        "ESE": "Kelet-délkelet",
-                        "N": "Észak",
-                        "NE": "Északkelet",
-                        "NNE": "Észak-északkelet",
-                        "NNW": "Észak-északnyugat",
-                        "NW": "Északnyugat",
-                        "S": "Dél",
-                        "SE": "Délkelet",
-                        "SSE": "Dél-délkelet",
-                        "SSW": "Dél-délnyugat",
-                        "SW": "Délnyugat",
-                        "W": "Nyugat",
-                        "WNW": "Nyugat-északnyugat",
-                        "WSW": "Nyugat-délnyugat"
-                    }
-                },
                 "castle_type": {
                     "label": "Típus"
                 },
-                "clock_direction": {
-                    "label": "Irány",
-                    "options": {
-                        "anticlockwise": "Óramutató járásával ellentétesen",
-                        "clockwise": "Óramutató járása szerint"
-                    }
-                },
                 "clothes": {
                     "label": "Ruha"
                 },
                     "label": "Leírás"
                 },
                 "devices": {
+                    "label": "Eszközök",
                     "placeholder": "1, 2, 3..."
                 },
                 "diaper": {
                     "label": "Pelenkázó van"
                 },
+                "direction": {
+                    "label": "Irány (fok, az óra járása szerint)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Irány",
+                    "options": {
+                        "E": "Kelet",
+                        "ENE": "Kelet-északkelet",
+                        "ESE": "Kelet-délkelet",
+                        "N": "Észak",
+                        "NE": "Északkelet",
+                        "NNE": "Észak-északkelet",
+                        "NNW": "Észak-északnyugat",
+                        "NW": "Északnyugat",
+                        "S": "Dél",
+                        "SE": "Délkelet",
+                        "SSE": "Dél-délkelet",
+                        "SSW": "Dél-délnyugat",
+                        "SW": "Délnyugat",
+                        "W": "Nyugat",
+                        "WNW": "Nyugat-északnyugat",
+                        "WSW": "Nyugat-délnyugat"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Irány",
+                    "options": {
+                        "anticlockwise": "Óramutatóval ellentétesen",
+                        "clockwise": "Óramutató szerint"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Irány",
+                    "options": {
+                        "backward": "Hátra",
+                        "forward": "Előre"
+                    }
+                },
                 "display": {
                     "label": "Kijelző"
                 },
                     "label": "Típus",
                     "placeholder": "Alapértelmezett"
                 },
+                "frequency": {
+                    "label": "Működési frekvencia"
+                },
                 "fuel": {
                     "label": "Üzemanyag"
                 },
                     "label": "Korlát"
                 },
                 "hashtags": {
+                    "label": "Javasolt hashtagok",
                     "placeholder": "#példa"
                 },
                 "healthcare": {
                 "memorial": {
                     "label": "Típus"
                 },
-                "milestone_position": {
-                    "label": "Mérföldkő pozíció",
-                    "placeholder": "Távolság egy tizedesig (123.4)"
+                "monitoring_multi": {
+                    "label": "Figyelés"
                 },
                 "mtb/scale": {
                     "label": "Mountainbike nehézség",
                 "oneway": {
                     "label": "Egyirányú",
                     "options": {
+                        "alternating": "Váltakozó",
                         "no": "Nem",
+                        "reversible": "Fordítható",
                         "undefined": "Feltehetően nem egyirányú",
                         "yes": "Igen"
                     }
                 "oneway_yes": {
                     "label": "Egyirányú",
                     "options": {
+                        "alternating": "Váltakozó",
                         "no": "Nem",
+                        "reversible": "Fordítható",
                         "undefined": "Feltehetően egyirányú",
                         "yes": "Igen"
                     }
                     "label": "Golfpálya par száma",
                     "placeholder": "3, 4, 5…"
                 },
-                "parallel_direction": {
-                    "label": "Irány",
-                    "options": {
-                        "backward": "Hátra",
-                        "forward": "Előre"
-                    }
-                },
                 "park_ride": {
                     "label": "P+R"
                 },
                 "railway": {
                     "label": "Típus"
                 },
+                "railway/position": {
+                    "label": "Mérföldkő pozíció",
+                    "placeholder": "Távolság egy tizedesig (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Irány",
+                    "options": {
+                        "backward": "Hátra"
+                    }
+                },
                 "rating": {
                     "label": "Generátorteljesítmény"
                 },
                 "recycling_accepts": {
                     "label": "Elfogad"
                 },
-                "recycling_type": {
-                    "label": "Újrahasznosítás típusa",
-                    "options": {
-                        "centre": "Hulladékudvar",
-                        "container": "Konténer"
-                    }
-                },
                 "ref": {
                     "label": "Referencia kód"
                 },
+                "ref/isil": {
+                    "label": "ISIL kód"
+                },
                 "ref_aeroway_gate": {
                     "label": "Kapu szám"
                 },
                 "traffic_signals": {
                     "label": "Típus"
                 },
+                "traffic_signals/direction": {
+                    "label": "Irány",
+                    "options": {
+                        "backward": "Hátra",
+                        "forward": "Előre"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Ösvény láthatósága",
                     "options": {
                 "transformer": {
                     "label": "Típus",
                     "options": {
+                        "auto": "Automatikus transzformátor",
+                        "auxiliary": "Segédtranszformátor",
                         "converter": "Átalakító",
+                        "distribution": "Elosztó transzformátor",
                         "generator": "Áramfejlesztő",
+                        "phase_angle_regulator": "Fázisszög szabályozó",
                         "yes": "Ismeretlen"
                     }
                 },
                 "voltage": {
                     "label": "Feszültség"
                 },
+                "voltage/primary": {
+                    "label": "Primer feszültség"
+                },
+                "voltage/secondary": {
+                    "label": "Szekunder feszültség"
+                },
+                "voltage/tertiary": {
+                    "label": "Tertiár Feszültség"
+                },
                 "wall": {
                     "label": "Típus"
                 },
                     "label": "Wikipédia"
                 },
                 "windings": {
+                    "label": "Tekercsek",
                     "placeholder": "1, 2, 3..."
                 }
             },
                     "terms": "kötéllift, húzólift, vontatólift"
                 },
                 "aerialway/station": {
-                    "name": "Felvonóállomás",
-                    "terms": "kötélpálya-állomás, síliftállomás"
+                    "name": "Felvonóállomás"
                 },
                 "aerialway/t-bar": {
                     "name": "Csákányos felvonó",
                     "terms": "Valutaváltás, valuta váltó, pénzváltás, exchange"
                 },
                 "amenity/bus_station": {
-                    "name": "Buszállomás",
-                    "terms": "buszpályaudvar, autóbuszpályaudvar"
+                    "name": "Buszpályaudvar"
                 },
                 "amenity/cafe": {
                     "name": "Kávézó",
                     "name": "Gyorsétterem",
                     "terms": "pizza, gyros, gyorskajálda, lángos , büfé, hamburger, hot dog"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Kompterminál",
-                    "terms": "komp,terminál,átkelő, kompkikötő, rév"
-                },
                 "amenity/fire_station": {
                     "name": "Tűzoltóság",
                     "terms": "Tűzoltóállomás, tűzoltólaktanya"
                     "terms": "látogatóközpont, vadőr, vadászat, természetjárás, táborozás"
                 },
                 "amenity/recycling": {
-                    "name": "Szelektív hulladékgyűjtő",
-                    "terms": "hulladék, szelektív hulladék, szeméttelep, szemétlerakó, veszélyes hulladék"
+                    "name": "Szelektív hulladékgyűjtő konténer"
                 },
                 "amenity/recycling_centre": {
                     "name": "Hulladékudvar",
                     "name": "Pajta",
                     "terms": "csűr, melléképület, mezőgazdasági épület"
                 },
+                "building/boathouse": {
+                    "name": "Csónakház"
+                },
+                "building/bungalow": {
+                    "name": "Bungaló"
+                },
                 "building/bunker": {
                     "name": "Bunker"
                 },
                     "name": "Templom",
                     "terms": "templomépület"
                 },
+                "building/civic": {
+                    "name": "Polgári Épület"
+                },
                 "building/college": {
                     "name": "Főiskolai épület",
                     "terms": "felsőoktatási intézmény, egyetem"
                     "name": "Tető",
                     "terms": "Tető, fedél, esőbeállló"
                 },
+                "building/ruins": {
+                    "name": "Épület romjai",
+                    "terms": "romok,rom"
+                },
                 "building/school": {
                     "name": "Iskolaépület",
                     "terms": "Iskolaépület, általános iskola, szakközépiskola, gimnázium"
                     "name": "Ikerház",
                     "terms": "ikerház"
                 },
+                "building/service": {
+                    "name": "Szolgáltató épület"
+                },
                 "building/shed": {
                     "name": "Fészer",
                     "terms": "Kunyhó, Fészer, Pajta,csűr,raktár,viskó, sufni"
                     "name": "Lóistálló",
                     "terms": "Istálló"
                 },
+                "building/stadium": {
+                    "name": "Stadion épület"
+                },
                 "building/static_caravan": {
                     "name": "Telepített lakókocsi",
                     "terms": "Rögzített lakókocsi, telepített lakókocsi"
                 },
+                "building/temple": {
+                    "name": "Templomépület"
+                },
                 "building/terrace": {
                     "name": "Sorház",
                     "terms": "házsor"
                 "building/train_station": {
                     "name": "Vasútállomás-épület"
                 },
+                "building/transportation": {
+                    "name": "Közlekedési épület"
+                },
                 "building/university": {
                     "name": "Egyetemi épület",
                     "terms": "egyetem, főiskola, felsőoktatás"
                     "name": "Sátor- vagy lakókocsihely",
                     "terms": "sátorhely, táborhely, kempinghely"
                 },
+                "circular": {
+                    "name": "Körforgalom"
+                },
                 "club": {
                     "name": "Klub",
                     "terms": "Club"
                     "name": "Partyszerviz",
                     "terms": "Catering, Partyszerviz, Rendezvényszervező "
                 },
+                "craft/chimney_sweeper": {
+                    "name": "Kéményseprő"
+                },
                 "craft/clockmaker": {
                     "name": "Órás (falióra)",
                     "terms": "Órás"
                     "name": "Lovaglóút",
                     "terms": "Lovas út"
                 },
+                "highway/bus_guideway": {
+                    "name": "Buszsín"
+                },
                 "highway/bus_stop": {
-                    "name": "Buszmegálló",
-                    "terms": "Buszmegálló"
+                    "name": "Buszmegálló peron"
                 },
                 "highway/corridor": {
                     "name": "Beltéri folyosó",
                     "name": "Erdő",
                     "terms": "erdő, vadon, rengeteg, dzsungel"
                 },
-                "landuse/garages": {
-                    "name": "Garázsok",
-                    "terms": "Garázsterület, autótárolók"
-                },
                 "landuse/grass": {
                     "name": "Fű",
                     "terms": "gyep"
                     "name": "Zöldmezős terület",
                     "terms": "mező, szántó, zöld"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Üvegházi kertészet"
+                },
                 "landuse/harbour": {
                     "name": "Kikötő",
                     "terms": "kikötő, hajó"
                     "terms": "fitnesz,sport, edzőhely"
                 },
                 "leisure/fitness_station/balance_beam": {
+                    "name": "Gyakorlati egyensúlyozó gerenda",
                     "terms": "<translate with synonyms or related terms for 'Exercise Balance Beam', separated by commas>"
                 },
                 "leisure/fitness_station/box": {
+                    "name": "Gyakorlai doboz",
                     "terms": "<translate with synonyms or related terms for 'Exercise Box', separated by commas>"
                 },
                 "leisure/fitness_station/horizontal_bar": {
+                    "name": "Gyakorlati nyújtó",
                     "terms": "<translate with synonyms or related terms for 'Exercise Horizontal Bar', separated by commas>"
                 },
                 "leisure/fitness_station/horizontal_ladder": {
                     "terms": "<translate with synonyms or related terms for 'Sit-Up Station', separated by commas>"
                 },
                 "leisure/fitness_station/stairs": {
+                    "name": "Gyakorlati lépcső",
                     "terms": "<translate with synonyms or related terms for 'Exercise Stairs', separated by commas>"
                 },
                 "leisure/garden": {
                     "name": "Pózna",
                     "terms": "pózna, mobiltorony, mobilcella, rádióadó"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Megfigyelőállomás"
+                },
                 "man_made/observation": {
                     "name": "Kilátótorony",
                     "terms": "kilátó, megfigyelőtorony"
                     "terms": "Iroda"
                 },
                 "office/accountant": {
+                    "name": "Könyvelő iroda",
                     "terms": "<translate with synonyms or related terms for 'Accountant Office', separated by commas>"
                 },
                 "office/administrative": {
-                    "name": "Közigazgatási hivatal",
-                    "terms": "hivatal, önkormányzat, hatóság"
+                    "name": "Közigazgatási hivatal"
                 },
                 "office/adoption_agency": {
+                    "name": "Örökbefogadási ügynökség",
                     "terms": "<translate with synonyms or related terms for 'Adoption Agency', separated by commas>"
                 },
                 "office/advertising_agency": {
+                    "name": "Reklámügynökség",
                     "terms": "<translate with synonyms or related terms for 'Advertising Agency', separated by commas>"
                 },
                 "office/architect": {
+                    "name": "Építészi iroda",
                     "terms": "<translate with synonyms or related terms for 'Architect Office', separated by commas>"
                 },
                 "office/association": {
+                    "name": "Nonprofit szervezet iroda",
                     "terms": "<translate with synonyms or related terms for 'Nonprofit Organization Office', separated by commas>"
                 },
                 "office/charity": {
+                    "name": "Jótékonysági iroda",
                     "terms": "<translate with synonyms or related terms for 'Charity Office', separated by commas>"
                 },
                 "office/company": {
-                    "name": "Vállalati iroda",
-                    "terms": "vállalkozás, iroda, magánvállalkozás, vállalat, cég"
+                    "name": "Vállalati iroda"
                 },
                 "office/coworking": {
                     "name": "Közösségi iroda",
                     "terms": "munkaügyi hivatal"
                 },
                 "office/energy_supplier": {
+                    "name": "Energiaszolgáltató hivatal",
                     "terms": "<translate with synonyms or related terms for 'Energy Supplier Office', separated by commas>"
                 },
                 "office/estate_agent": {
                     "terms": "pénzügy, hitelezés, kölcsön, befektetés, biztosítás"
                 },
                 "office/forestry": {
+                    "name": "Erdészeti hivatal",
                     "terms": "<translate with synonyms or related terms for 'Forestry Office', separated by commas>"
                 },
                 "office/foundation": {
                     "terms": "Biztosító"
                 },
                 "office/it": {
+                    "name": "Informatikai iroda",
                     "terms": "<translate with synonyms or related terms for 'Information Technology Office', separated by commas>"
                 },
                 "office/lawyer": {
                     "terms": "ügyvéd, bíróság, közjegyző, ügyész"
                 },
                 "office/lawyer/notary": {
-                    "name": "Közjegyzői iroda",
-                    "terms": "közjegyző"
+                    "name": "Közjegyzői iroda"
                 },
                 "office/moving_company": {
+                    "name": "Költözőcég iroda",
                     "terms": "<translate with synonyms or related terms for 'Moving Company Office', separated by commas>"
                 },
                 "office/newspaper": {
+                    "name": "Újságírói iroda",
                     "terms": "<translate with synonyms or related terms for 'Newspaper Office', separated by commas>"
                 },
                 "office/ngo": {
                     "name": "Transzformátor",
                     "terms": "transzformátor, trafó, áramátalakító"
                 },
-                "public_transport/platform": {
-                    "name": "Peron",
-                    "terms": "Peron"
+                "public_transport/linear_platform_bus": {
+                    "name": "Buszmegálló peron"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Kompmegállo peron"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "HÉV-megállo peron"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Egysínű vasúti megállo peron"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Metrómegálló peron"
+                },
+                "public_transport/platform_train": {
+                    "name": "Vasútmegálló peron"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Villamosmegálló peron"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Trolibusz megálló peron"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Felvonóállomás"
+                },
+                "public_transport/station_bus": {
+                    "name": "Buszállomás / pályaudvar"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Kompállomás / pályaudvar"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "HÉV állomás"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Egysínű vasúti állomás"
                 },
-                "public_transport/stop_position": {
-                    "name": "Megállási pont",
-                    "terms": "Megállóhely"
+                "public_transport/station_subway": {
+                    "name": "Metróállomás"
+                },
+                "public_transport/station_train": {
+                    "name": "Vasútállomás"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Vasútállomás (kérésre megáll)"
+                },
+                "public_transport/station_tram": {
+                    "name": "Villamosállomás"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Trolibuszpályaudvar"
+                },
+                "public_transport/stop_area": {
+                    "name": "Tranzitmegállási terület"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Felvonó megállási pont"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Vasút megállási hely"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Villamos megállási hely"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Trolibusz megállási hely"
                 },
                 "railway": {
                     "name": "Vasút"
                     "terms": "Siklóvasút, kötélvasút"
                 },
                 "railway/halt": {
-                    "name": "Vasúti megállóhely",
-                    "terms": "Vasúti megállóhely, Vasúti megálló, megálló, vasútállomás"
+                    "name": "Vasútállomás (kérésre megáll)"
                 },
                 "railway/level_crossing": {
                     "name": "Vasúti átjáró (közút)",
                     "terms": "vasúti kereszteződés,átkelő,átjáró"
                 },
+                "railway/light_rail": {
+                    "name": "HÉV"
+                },
                 "railway/milestone": {
                     "name": "Vasúti mérföldkő",
                     "terms": "mérföldkő, vasút, kilométerkő"
                 },
+                "railway/miniature": {
+                    "name": "Miniatűrvasút"
+                },
                 "railway/monorail": {
                     "name": "Egysínű vasút",
                     "terms": " nyeregvasút, mágnesvasút "
                     "terms": "Keskeny nyomtávú vasút"
                 },
                 "railway/platform": {
-                    "name": "Vasúti peron",
-                    "terms": "vasúti fel- és leszállóhely, vasútmenti járda"
+                    "name": "Vasútmegálló peron"
                 },
                 "railway/rail": {
                     "name": "Vasúti pálya",
                     "terms": "jelző, jelzés, vasút"
                 },
                 "railway/station": {
-                    "name": "Vasútállomás",
-                    "terms": "pályaudvar"
+                    "name": "Vasútállomás"
                 },
                 "railway/subway": {
                     "name": "Metró",
                     "terms": "Villamos"
                 },
                 "railway/tram_stop": {
-                    "name": "Villamosmegálló",
-                    "terms": "villamosmegálló"
+                    "name": "Villamosmegállási pont"
                 },
                 "relation": {
                     "name": "Kapcsolat",
                     "name": "Üzlet",
                     "terms": "bolt, kereskedés, kiskereskedés"
                 },
+                "shop/agrarian": {
+                    "name": "Mezőgazdasági bolt"
+                },
                 "shop/alcohol": {
                     "name": "Alkoholüzlet",
                     "terms": "unikum,pálinka,baileys,konyak,tokaji,vodka,wiszki,whiskey,kosher szilvapálinka,zwack"
                     "terms": "ékszerüzlet,arany, ezüst, gyémánt, briliáns,  ékszer,bijou,bizsu,fülbevaló, nyakék,karkötő,divatékszer,jegygyűrű, gyűrű, ékszerész, ötvös, aranyműves"
                 },
                 "shop/kiosk": {
-                    "name": "Trafik",
-                    "terms": "újságos, trafik, dohány, dohánybolt"
+                    "name": "Trafik"
                 },
                 "shop/kitchen": {
                     "name": "Konyhabútorbolt",
                     "terms": "Kilátópont"
                 },
                 "tourism/wilderness_hut": {
+                    "name": "Menedékház (személyzet nélkül)",
                     "terms": "<translate with synonyms or related terms for 'Wilderness Hut', separated by commas>"
                 },
                 "tourism/zoo": {
                     "name": "Lovaglóút",
                     "terms": "lovagló út, lovagló útvonal, lovas út, lovas útvonal"
                 },
+                "type/route/light_rail": {
+                    "name": "HÉV-vonal"
+                },
                 "type/route/pipeline": {
                     "name": "Csővezeték nyomvonala",
                     "terms": "Csővezeték, gázvezeték, kőolajvezeték"
                 },
+                "type/route/piste": {
+                    "name": "Sípálya/Síútvonal"
+                },
                 "type/route/power": {
                     "name": "Távvezeték nyomvonala",
                     "terms": "Elektromos vezeték útvonala, távvezeték, nagyfeszültségű vezeték"
                     "name": "Közút",
                     "terms": "út, főút, közút, autóút, autópálya"
                 },
+                "type/route/subway": {
+                    "name": "Metróvonal"
+                },
                 "type/route/train": {
                     "name": "Vasútvonal",
                     "terms": "Vonat útvonal"
             "DigitalGlobe-Premium-vintage": {
                 "attribution": {
                     "text": "Feltételek és visszajelzés"
-                }
+                },
+                "name": "DigitalGlobe Premium hiszórikus felvételek"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
             "DigitalGlobe-Standard-vintage": {
                 "attribution": {
                     "text": "Feltételek és visszajelzés"
-                }
+                },
+                "name": "DigitalGlobe Standard hiszórikus felvételek"
             },
             "EsriWorldImagery": {
                 "attribution": {
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, térképadatok: OpenStreetMap-közreműködők, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-közreműködők, CC by-SA 3.0"
                 },
                 "name": "Jelzett turistautak: kerékpározás"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, térképadatok: OpenStreetMap-közreműködők, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-közreműködők, CC by-SA 3.0"
                 },
                 "name": "Jelzett turistautak: túrázás"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, térképadatok: OpenStreetMap-közreműködők, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-közreműködők, CC by-SA 3.0"
                 },
                 "name": "Jelzett turistautak: moutain bike"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, térképadatok: OpenStreetMap-közreműködők, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-közreműködők, CC by-SA 3.0"
                 },
                 "name": "Jelzett turistautak: korcsolya"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, térképadatok: OpenStreetMap-közreműködők, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap-közreműködők, CC by-SA 3.0"
                 },
                 "name": "Jelzett turistautak: téli sportok"
             },
index 426cf0b832812a2c2d6e81503d1781d82ec2ef47..c6f58dea93839b4d91cc6157d1ba57f71d1ca3ce 100644 (file)
         "background": {
             "title": "Ետնանկար",
             "description": "Ետնանկարի կարգաւորումներ",
-            "percent_brightness": "{opacity}% պայծառութիւն",
             "none": "Ոչ մի",
             "custom": "Յատուկ",
             "custom_button": "Խմբագրել յատուկ ետնանկարը",
             "reset": "վերամեկնարկել",
             "minimap": {
-                "description": "Մինիքարտէզ",
                 "tooltip": "Ցուցադրել փոքրացուած քարտէզը՝ որպէզսի աւելի հեշտ լինի գտնել ներկայումս պատկերուած տեղանքը։"
             }
         },
             "view_on_mapillary": "Դիտել այս նկարը Mapillary ֊ում"
         },
         "help": {
-            "title": "Օգնութիւն",
-            "help": "# Ձեռնարկ\n\nՍա [ՕփենՍթրիթՄէփ](http://www.openstreetmap.org/)֊ի խմբագրիչ է՝ ազատ եւ խմբարուող աշխարհի քարտէզ։ Կարող ես օգտագործել այն քո տեղանքում փոփոխութիւններ եւ աւելացումներ կատարելու համար, դարձնելով աշխարհի բաց քարտէզը բոլորի համար աւելի կիրառելի։\n\nՔո արած փոփոխութիւնները տեսանելի են լինելու բոլորին, ով օգտագորթում է ՕփենՍթրիթՄէփ քարտէզը։ Խմբարելու համար, պէտք է\n[մուտք գործել](https://www.openstreetmap.org/login).\n\n[iD խմբագրիչը](http://ideditor.com/) միասնական նախագիծ է, որի [ելատեքստը հասանելի է Գիտհաբում](https://github.com/openstreetmap/iD).\n"
+            "title": "Օգնութիւն"
         },
         "intro": {
             "graph": {
                     "label": "Կարողութիւն",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Ուղղութիւն",
-                    "options": {
-                        "E": "Արեւելք",
-                        "ENE": "Արեւելք֊հիւսիս֊արեւելք",
-                        "ESE": "Արեւելք֊հարաւ֊արեւելք",
-                        "N": "Հիւսիս",
-                        "NE": "Հիւսիս֊արեւելք",
-                        "NNE": "Հիւսիս֊հիւսիս֊արեւելք",
-                        "NNW": "Հիւսիս֊հիւսիս֊արեւմուտք ",
-                        "NW": "Հիւսիս֊արեւմուտք",
-                        "S": "Հարաւ",
-                        "SE": "Հարաւ֊արեւելք",
-                        "SSE": "Հարաւ֊հարաւ֊արեւելք",
-                        "SSW": "Հարաւ֊հարաւ֊արեւմուտք",
-                        "SW": "Հարաւ֊արեւմուտք",
-                        "W": "Արեւմուտք",
-                        "WNW": "Արեւմուտք֊հարաւ֊արեւմուտք",
-                        "WSW": "Արեւմուտք֊հարաւ֊արեւմուտք"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Ուղղութիւն",
-                    "options": {
-                        "anticlockwise": "Ժամասլաքի հակառակ ",
-                        "clockwise": "Ժամասլաքի ուղղութեամբ"
-                    }
-                },
                 "collection_times": {
                     "label": "Հաւաքելու ժամանակները"
                 },
                 "barrier/wall": {
                     "name": "Պատ"
                 },
-                "highway/bus_stop": {
-                    "name": "Ավտոբուսի կանգառ"
-                },
                 "highway/steps": {
                     "name": "Աստիճաններ"
                 },
index 8cf91ddef0d6abb17ae01df0c330d09f5fb4a05c..fc1f5bc739dcfd89c9f64e0e3cb901457863f225 100644 (file)
         "background": {
             "title": "Latar",
             "description": "Pengaturan Latar",
-            "percent_brightness": "{opacity}% kecerahan",
             "none": "Tidak ada",
             "best_imagery": "Sumber citra terbaik yang diketahui untuk lokasi ini",
             "switch": "Beralih ke latar belakang ini",
             "custom": "Custom",
             "custom_button": "Ubah tampilan latar kustom",
-            "fix_misalignment": "Setel offset citra",
-            "imagery_source_faq": "Dari mana citra ini diperoleh?",
             "reset": "ulang",
-            "offset": "Seret di mana pun dalam area abu-abu untuk menyetel offset citra, atau masukkan nilai offset dalam meter.",
             "minimap": {
-                "description": "Peta mini",
                 "tooltip": "Menampilkan peta diperkecil untuk membantu penentuan letak area yang sedang dilihat."
-            }
+            },
+            "fix_misalignment": "Setel offset citra",
+            "offset": "Seret di mana pun dalam area abu-abu untuk menyetel offset citra, atau masukkan nilai offset dalam meter."
         },
         "map_data": {
             "title": "Data Peta",
             "view_on_mapillary": "Lihat gambar ini di Mapillary"
         },
         "help": {
-            "title": "Bantuan",
-            "help": "# Bantuan\n\nIni adalah penyunting untuk [OpenStreetMap](http://www.openstreetmap.org/),\npeta dunia yang gratis dan dapat disunting. Anda dapat menggunakannya\nuntuk menambah dan memperbarui data di area Anda, membuat peta dunia\nbersumber dan berdata terbuka lebih baik untuk semua orang.\n\nSuntingan yang Anda buat di peta ini akan terlihat oleh semua pengguna\nOpenStreetMap. Untuk membuat suntingan, Anda perlu\n[log in](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) adalah proyek kerja sama dengan [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n",
-            "imagery": "# Citra\n\nCitra foto udara merupakan sumber penting untuk pemetaan. Gabungan dari\npemotretan pesawat, pandangan satelit, dan sumber terhimpun lain tersedia\ndi penyunting pada menu 'Pengaturan Latar' di sebelah kanan.\n\nBiasanya lapisan satelit [Bing Maps](http://www.bing.com/maps/) ditampilkan\ndi penyunting ini, tetapi ketika Anda geser atau perbesar tampilan di suatu wilayah baru,\nsumber baru lain akan tersedia. Di beberapa negara, seperti Amerika Serikat,\nPerancis, dan Denmark memiliki citra berkualitas tinggi yang tersedia di beberapa area.\n\nCitra kadang melenceng dari data peta karena ada kesalahan pada\npenyedia data citra. Jika Anda melihat banyak jalan yang bergeser dari latarnya,\njangan serta-merta memindahkan semuanya untuk mencocokkan latar. Justru Anda bisa menyesuaikan\ncitranya agar pas dengan data yang ada dengan mengeklik 'Perbaiki perataan' pada\nbagian bawah Pengaturan Latar.\n",
-            "addresses": "# Alamat\n\nAlamat adalah informasi yang paling penting dalam suatu peta.\n\nMeski alamat sering ditampilkan sebagai bagian dari jalan, OpenStreetMap menampilkan alamat sebagai bagian dari bangunan dan tempat-tempat di pinggir jalan.\n\nAnda dapat menambahkan alamat ke tempat-tempat berbentuk garis bangunan atau titik. Data alamat yang tepercaya diperoleh dari survei lapangan atau pengetahuan sendiri - seperti fitur lainnya, Anda tidak diperbolehkan menyalin alamat dari sumber-sumber komersial seperti Google Maps.\n"
+            "title": "Bantuan"
         },
         "intro": {
             "done": "selesai",
                     "label": "Kapasitas",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Arah",
-                    "options": {
-                        "E": "Timur",
-                        "ENE": "Timur-timur laut",
-                        "ESE": "Timur-tenggara",
-                        "N": "Utara",
-                        "NE": "Timur Laut",
-                        "NNE": "Utara-timur laut",
-                        "NNW": "Timur-barat laut",
-                        "NW": "Barat Laut",
-                        "S": "Selatan",
-                        "SE": "Tenggara",
-                        "SSE": "Selatan-tenggara",
-                        "SSW": "Selatan-barat daya",
-                        "SW": "Barat Daya",
-                        "W": "Barat",
-                        "WNW": "Barat-barat laut",
-                        "WSW": "Barat-barat daya"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Arah",
-                    "options": {
-                        "anticlockwise": "Berlawanan Jarum Jam",
-                        "clockwise": "Searah Jarum Jam"
-                    }
-                },
                 "collection_times": {
                     "label": "Waktu Pengumpulan"
                 },
                 "amenity/bureau_de_change": {
                     "name": "Penukaran Mata Uang"
                 },
-                "amenity/bus_station": {
-                    "name": "Terminal Bus"
-                },
                 "amenity/cafe": {
                     "name": "Kafe",
                     "terms": "Warung Kopi"
                 "amenity/pub": {
                     "name": "Pub"
                 },
-                "amenity/recycling": {
-                    "name": "Daur Ulang"
-                },
                 "amenity/register_office": {
                     "name": "Dinas Catatan Sipil"
                 },
                 "highway": {
                     "name": "Jalan Raya"
                 },
-                "highway/bus_stop": {
-                    "name": "Pemberhentian Bus"
-                },
                 "highway/corridor": {
                     "name": "Lorong dalam"
                 },
                     "name": "Hutan",
                     "terms": "Hutan Produksi"
                 },
-                "landuse/garages": {
-                    "name": "Garasi",
-                    "terms": "Garasi"
-                },
                 "landuse/grass": {
                     "name": "Rumput",
                     "terms": "Rerumputan"
                 "office/administrative": {
                     "name": "Kantor Administrasi"
                 },
-                "office/company": {
-                    "name": "Kantor Perusahaan"
-                },
                 "office/educational_institution": {
                     "name": "Institusi Pendidikan"
                 },
                 "power/transformer": {
                     "name": "Trafo"
                 },
-                "public_transport/stop_position": {
-                    "name": "Hentikan petisi"
-                },
                 "railway": {
                     "name": "Jalur Rel"
                 },
                     "name": "Sepur Sempit",
                     "terms": "Narrow Gauge Rail, Trek, Trak, Lebar Jalur Kereta Api"
                 },
-                "railway/platform": {
-                    "name": "Peron Kereta Api"
-                },
                 "railway/rail": {
                     "name": "Rel Kereta"
                 },
-                "railway/station": {
-                    "name": "Stasiun Kereta"
-                },
                 "railway/subway": {
                     "name": "Jalur Bawah Tanah"
                 },
                 "shop/jewelry": {
                     "name": "Toko Perhiasan"
                 },
-                "shop/kiosk": {
-                    "name": "Kios Berita"
-                },
                 "shop/kitchen": {
                     "name": "Toko Desain Interior Dapur"
                 },
index 6ffb52a6e5141e5982f206ed1ee9b9abc8974f87..7d3209bca5dda13f7bd434af84fd34bff206b2e7 100644 (file)
             "localized_translation_language": "Veldu tungumál",
             "localized_translation_name": "Nafn"
         },
+        "login": "innskrá",
         "logout": "útskrá",
         "loading_auth": "Tengist við OpenStreetMap...",
         "status": {
         "background": {
             "title": "Bakgrunnur",
             "description": "Bakgrunnsstillingar",
-            "percent_brightness": "{opacity}% birta",
             "none": "Ekkert",
             "reset": "endurstilla"
         },
             "view_on_mapillary": "Skoða þessa mynd á Mapillary"
         },
         "help": {
-            "title": "Hjálp",
-            "addresses": "# Heimilisföng\n\nHeimilisföng eru einhverjar nytsömustu upplýsingarnar sem hægt er að setja á kort.\n\nÞó að heimilisföng tilheyri yfirleitt götum, þá tilheyra þau húsunum sjálfum í\nOpenStreetMap, merkt inn á byggingar og staði meðfram götum.\n\nÞú getur bætt heimimlisföngum við bæði byggingar sem eru merktar inn sem svæði\nsem og byggingar sem eru merktar inn sem punktar. Best er að heimilisföngin\nséu sett inn af þeim sem þekkja staðhætti vel - eins og með annað þá er ekki\nleyfilegt að afrita heimilisföng af öðrum vefjum, til að mynda er bannað að\nafrita af Google Maps.\n"
+            "title": "Hjálp"
         },
         "intro": {
             "graph": {
                     "label": "Áhorfendafjöldi/Rýmd",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Átt",
-                    "options": {
-                        "NW": "Norðvestur"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Átt",
-                    "options": {
-                        "anticlockwise": "Rangsælis",
-                        "clockwise": "Réttsælis"
-                    }
-                },
                 "collection_times": {
                     "label": "Losunartímar"
                 },
                 "highway/bridleway": {
                     "name": "Reiðleið"
                 },
-                "highway/bus_stop": {
-                    "name": "Stoppistöð"
-                },
                 "highway/cycleway": {
                     "name": "Hjólastígur"
                 },
                 "railway/monorail": {
                     "name": "Monorail"
                 },
-                "railway/platform": {
-                    "name": "Lestarpallur"
-                },
                 "railway/rail": {
                     "name": "Lestarteinar"
                 },
-                "railway/station": {
-                    "name": "Lestarstöð"
-                },
                 "railway/subway": {
                     "name": "Neðanjarðarlest"
                 },
index 5c1c2d3db826e170e5bcf300668c0b8ebda78af4..3fc862e5cc327999d79c0d43223424d59aa33e8d 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Clicca per aggiungere più nodi alla linea. Clicca su altre linee per connetterle, e clicca due volte per terminare la linea."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Non può essere modificato perché è connesso ad un elemento nascosto."
             }
         },
         "operations": {
             "about_changeset_comments": "Info sui Commenti al gruppo di modifiche",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "In questo commento hai nominato Google: ricorda sempre che copiare da Google Maps è severamente proibito.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Modifiche di {users}",
             "truncated_list": "Modifiche di {users} e {count} altri"
         },
         "info_panels": {
+            "key": "I",
             "background": {
+                "key": "B",
                 "title": "Sfondo",
+                "zoom": "Zoom",
+                "vintage": "Data dell'immagine",
+                "source": "Fonte",
                 "description": "Descrizione",
                 "resolution": "Risoluzione",
                 "accuracy": "Accuratezza",
-                "unknown": "Sconosciuto"
+                "unknown": "Sconosciuto",
+                "show_tiles": "Mostra Mattonelle",
+                "hide_tiles": "Nascondi Mattonelle",
+                "show_vintage": "Mostra data",
+                "hide_vintage": "Nascondi data"
             },
             "history": {
+                "key": "H",
+                "title": "Storico",
                 "selected": "{n} selezionato/i",
                 "version": "Versione",
                 "last_edit": "Ultima modifica",
                 "unknown": "Sconosciuto",
                 "link_text": "Cronologia su openstreetmap.org"
             },
+            "location": {
+                "key": "L",
+                "title": "Posizione",
+                "unknown_location": "Posizione Sconosciuta"
+            },
             "measurement": {
+                "key": "M",
                 "title": "Misurazione",
                 "selected": "{n} selezionato/i",
                 "geometry": "Geometria",
-                "closed": "chiuso",
+                "closed_line": "Linea chiusa",
+                "closed_area": "Area chiusa",
                 "center": "Centro",
                 "perimeter": "Perimetro",
                 "length": "Lunghezza",
                 "area": "Area",
                 "centroid": "Centroide",
+                "location": "Posizione",
                 "metric": "Metrico",
-                "imperial": "Imperiale"
+                "imperial": "Imperiale",
+                "node_count": "Numero di nodi"
             }
         },
         "geometry": {
         "background": {
             "title": "Sfondo",
             "description": "Impostazioni dello sfondo",
-            "percent_brightness": "{opacity}% luminosità",
+            "key": "B",
+            "backgrounds": "Sfondi",
             "none": "Nessuno",
             "best_imagery": "Migliore sorgente di immagini per questo luogo",
             "switch": "Ritorna a questo sfondo",
             "custom": "Personalizzato",
             "custom_button": "Modifica sfondo personalizzato",
-            "fix_misalignment": "Correggi spostamento immagini",
-            "imagery_source_faq": "Da dove vengono queste immagini?",
+            "overlays": "Livelli sovrapposti",
+            "imagery_source_faq": "Informazioni sulle immagini satellitari / Segnala un problema",
             "reset": "reset",
-            "offset": "Per correggere lo spostamento delle immagini trascina dove preferisci all'interno dell'area grigia sottostante o inserisci i valori correttivi in metri.",
+            "display_options": "Mostra opzioni",
+            "brightness": "Luminosità",
+            "contrast": "Contrasto",
+            "saturation": "Saturazione",
+            "sharpness": "Nitidezza",
             "minimap": {
-                "description": "Minimappa",
-                "tooltip": "Mostra una mappa più vasta per localizzare meglio l'area corrente."
-            }
+                "description": "Mostra miniatura",
+                "tooltip": "Mostra una mappa più vasta per localizzare meglio l'area corrente.",
+                "key": "/"
+            },
+            "fix_misalignment": "Correggi spostamento immagini",
+            "offset": "Per correggere lo spostamento delle immagini trascina dove preferisci all'interno dell'area grigia sottostante o inserisci i valori correttivi in metri."
         },
         "map_data": {
             "title": "Dati mappa",
             "description": "Dati della mappa",
+            "key": "F",
             "data_layers": "Livelli di dati",
             "layers": {
                 "osm": {
         "area_fill": {
             "wireframe": {
                 "description": "Nessun riempimento (reticolo)",
-                "tooltip": "Abilitando la modalità reticolo è più facile vedere l'immagine di sfondo."
+                "tooltip": "Abilitando la modalità reticolo è più facile vedere l'immagine di sfondo.",
+                "key": "W"
             },
             "partial": {
                 "description": "Riempimento parziale",
         },
         "restore": {
             "heading": "Hai modifiche non salvate",
-            "description": "Hai modifiche non salvate da una sessione precedente. Vuoi ripristinare questi cambiamenti?"
+            "description": "Hai modifiche non salvate da una sessione precedente. Vuoi ripristinare questi cambiamenti?",
+            "restore": "Ripristina le mie modifiche",
+            "reset": "Elimina le modifiche"
         },
         "save": {
             "title": "Salva",
             "status_code": "Il server ha risposto con codice {code}",
             "unknown_error_details": "Assicurati di essere connesso ad internet.",
             "uploading": "Caricamento delle modifiche su OpenStreetMap...",
+            "conflict_progress": "Sto controllando i conflitti: {num} di {total}",
             "unsaved_changes": "Hai modifiche non salvate",
             "conflict": {
                 "header": "Risolvi conflitti di modifica",
                 "keep_remote": "Usa il loro",
                 "restore": "Ripristina",
                 "delete": "Lascia Cancellato",
+                "download_changes": "Oppure scarica il file con le modifiche (osmChange)",
                 "done": "Risolti tutti i conflitti!",
                 "help": "Un altro utente ha modificato qualcuno degli elementi che hai modificato tu.\nClicca su ogni elemento sottostante per avere più dettagli sul conflitto e scegliere se mantenere la tua versione o quella dell'altro utente.\n"
             }
         "splash": {
             "welcome": "Benvenuti nell'editor OpenStreetMap iD",
             "text": "iD è un intuitivo ma potente strumento per contribuire alla migliore mappa gratuita del mondo. Questa è la versione {version}. Per ulteriori informazioni vai su {website} o segnala gli errori su {github}",
-            "walkthrough": "Inizia il Tutorial"
+            "walkthrough": "Inizia il Tutorial",
+            "start": "Modifica"
         },
         "source_switch": {
             "live": "live",
             "untagged_area_tooltip": "Seleziona un tipo di elemento che descriva cos'è quest'area.",
             "untagged_relation": "Relazione senza tag",
             "untagged_relation_tooltip": "Seleziona un tipo di elemento che descriva di che relazione si tratta.",
-            "many_deletions": "Stai per cancellare {n} elementi. Sei sicuro di volerlo fare? Questo li cancellerà dalla mappa che chiunque altro vede su openstreetmap.org.",
+            "many_deletions": "Stai cancellando {n} elementi: {p} nodi, {l} linee, {a} aree, {r} relazioni. Sei sicuro di volerlo fare? Questo cancellerà gli elementi dalla mappa che può vedere chiunque su openstreetmap.org.",
             "tag_suggests_area": "Il tag {tag} fa pensare che la linea sia un'area, ma non rappresenta un'area",
             "deprecated_tags": "Tag deprecati: {tags}"
         },
+        "zoom": {
+            "in": "Ingrandisci",
+            "out": "Rimpicciolisci"
+        },
         "cannot_zoom": "Impossibile fare zooCannot zoom out further in current mode.",
         "full_screen": "Passa a schermo intero",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Guarda questa immagine su Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Foto stradali da OpenStreetCam",
+            "title": "Foto in sovrimpressione (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Visualizza questa immagine con OpenStreetCam"
+        },
         "help": {
             "title": "Aiuto",
-            "help": "# Aiuto\n\nQuesto è un editor per [OpenStreetMap](http://www.openstreetmap.org/), la\nmappa del mondo gratuita e modificabile. Puoi usarlo per aggiungere ed aggiornare\ndati nella tua area, creando una mappa del mondo open-source e open-data\nmigliore per tutti.\n\nLe modifiche che fai a questa mappa saranno visibili a chiunque usa\nOpenStreetMap. Per fare una modifica, avrai bisogno di [accedere](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) è un progetto collaborativo il cui [codice\nsorgente è disponibile su GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nLe tracce provenienti dal GPS sono una sorgente dati fidata per OpenStreetMap. Questo editor\nsupporta i tracciati locali - i file `.gpx` che si trovano sul tuo computer. È possibile raccogliere\nquesto tipo di tracciati GPS con un gran numero di applicazioni per smartphone\no tramite dispositivi GPS personali.\n\nPer informazioni su come effettuare un rilevamento GPS è possibile\nleggere [Mappare con uno smartphone, un GPS o una cartina](http://learnosm.org/en/mobile-mapping/).\n\nPer utilizzare un tracciato GPX al fine di effettuare una mappatura,\ntrascina il file GPX sull'editor di mappe. Se viene riconosciuto verrà\naggiunto alla mappa ed evidenziato tramite una linea violetta. Clicca\nsul menu 'Dati mappa' che si trova sulla sinistra per abilitare,\ndisabilitare o zoomare il livello creato dal file GPX.\n\nIl tracciato GPX non viene caricato direttamente su OpenStreetMap - il\nmodo migliore di utilizzarlo è quello di disegnare sulla mappa usando il\ntracciato come guida per i nuovi elementi che vuoi aggiungere e\n[caricarlo comunque su OpenStreetMap](http://www.openstreetmap.org/trace/create) per renderlo poi\ndisponibile agli altri utenti.\n",
-            "imagery": "# Immagini\n\nLe immagini aeree sono un'importante risorsa per la mappatura. Una\ncombinazione di foto aeree, immagini satellitari e risorse liberamente\ncompilate sono disponibili nell'editor nel menu 'Impostazioni dello sfondo'\nsulla destra.\n\nLe immagini predefinite presentate nell'editor sono quelle satellitari di\n[Bing Maps](http://www.bing.com/maps/), ma spostando o ingrandendo\nla mappa in specifiche aree geografiche potranno essere disponibili più\nrisorse. Alcune nazioni, come Stati Uniti, Francia e Danimarca, hanno a\ndisposizione, per alcune aree, immagini ad alta definizione.\n\nLe immagini sono a volte disallineate rispetto ai dati della mappa a causa\ndi errori da parte di chi le fornisce. Se vedi numerose strade spostate\nrispetto alle immagini di sfondo non correggerle tutte subito per farle\nnuovamente combaciare. Puoi invece aggiustare l'allineamento delle immagini\nsullo sfondo in modo da ri-allinearle con i dati esistenti cliccando su\n'Allinea' in fondo al menu.\n",
-            "addresses": "# Indirizzi stradali\n\nGli indirizzi sono tra le informazioni più utili per una mappa.\n\nNonostante gli indirizzi siano spesso rappresentati come parte delle strade, in OpenStreetMap\nvengono memorizzati come attributi degli edifici e dei luoghi lungo le strade.\n\nPotrai aggiungere informazioni sull'indirizzo a dei luoghi mappati come contorni di edificio\ncosì come a quelli mappati come singoli punti. La sorgente ottimale dei dati degli indirizzi\nè un rilevamento per strada o la conoscenza personale dato che copiare da sorgenti\ncommerciali come ad es. Google Maps è severamente vietato.\n",
-            "inspector": "# Utilizzo dell'inspector\n\nL'inspector è quell'elemento dell'interfaccia utente sulla parte sinistra\ndella pagina che consente di modificare i dettagli dell'elemento\nselezionato.\n\n### Selezione di un tipo di elemento\n\nDopo che è stato aggiunto un punto, una linea o un'area, è possibile\nscegliere quale tipo di caratteristica abbia, come ad esempio se si\ntratta di una strada principale o una strada residenziale, di un\nsupermarket o di un caffè. L'inspector visualizzerà i pulsanti per le\ncaratteristiche più comuni e sarà possibile trovarne altre\nsemplicemente digitando la caratteristica voluta nella casella di ricerca.\n\nFai clic sulla 'i' che si trova nell'angolo in basso a destra del pulsante\nper saperne di più. Fai clic su un pulsante per scegliere quel tipo.\n\n### Utilizzo di Form e di Tag di modifica\n\nDopo aver scelto un tipo di elemento o quando si è selezionato un\nelemento per il quale è già stato assegnato un tipo, l'inspector\nmostrerà i campi con i dettagli come ad esempio il nome e l'indirizzo.\n\nAl di sotto dei campi è possibile fare clic sulle icone per aggiungere\nulteriori dettagli come ad es. link a Wikipedia, accesso\nconsentito alle carrozzine, e altro.\n\nSotto l'inspector è possibile fare clic su 'Tag aggiuntivi' per aggiungere\narbitrariamente altri tag all'elemento. [Taginfo](http://taginfo.openstreetmap.org/) è una buona risorsa\nper imparare qualcosa sulle combinazioni di tag più comuni.\n\nLe modifiche effettuate nell'inspector vengono applicate\nautomaticamente alla mappa. E' possibile annullarle in ogni momento\ncliccando semplicemente sul pulsante 'Ripristina'.\n"
+            "key": "H",
+            "help": {
+                "title": "Aiuto",
+                "welcome": "Benvenuto nell'editor iD. Con questo software puoi aggiornare OpenstreetMap direttamente dal tuo browser.",
+                "open_data_h": "Open Data",
+                "open_data": "Le modifiche che apporti alla mappa saranno visibili a tutti gli utilizzatori di Openstreetmap. Le tue modifiche possono essere basate su conoscenze personali, sopralluoghi, foto aeree oppure foto a livello stradale. La copia di informazioni da altri servizi commerciali, quali Google Maps [è vietata] (https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Prima di iniziare",
+                "before_start": "Prima di iniziare ad effettuare modifiche dovresti essere a conoscenza delle funzioni principali di questo editor e di come funziona OpenstreetMap. In iD è stata integrata una guida interattiva, con lo scopo di insegnare le funzioni indispensabili per la mappatura. Clicca \"Avvia il tutorial\" su questa schermata per iniziare - richiede circa 15 minuti.",
+                "open_source_h": "Open Source",
+                "open_source": "L'editor iD è un progetto collaborativo open source, tu ora stai usando la versione [versione]. Il codice sorgente è disponibile [su GitHub] (https://github.com/openstreetmap/iD).",
+                "open_source_help": "Puoi contribuire nella traduzione di iD (https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) oppure [segnalare problemi](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Vista generale",
+                "navigation_h": "Navigazione",
+                "navigation_drag": "Puoi trascinare la mappa tenendo premuto il tasto sx del mouse e spostandolo. Puoi inoltre utilizzare le frecce della tua tastiera.",
+                "navigation_zoom": "Puoi ingrandire o diminuire il livello di zoom utilizzando la rotella del mouse, oppure utilizzando i bottoni [più/meno] nella parte destra della schermata. Puoi inoltre utilizzare i tasti '+' ,'-' della tastiera.",
+                "features_h": "Elementi della mappa",
+                "features": "Utilizziamo la parola \"caratteristiche\" per descrivere gli oggetti che compaiono sulla mappa, ne sono esempi: strade, edifici o punti di interesse vari. Tutti gli elementi presenti nel mondo reale possono essere mappati in OpenStreetMap, sotto forma di punti, linee o aree.",
+                "nodes_ways": "In OpenstreetMap i punti sono spesso chiamati \"nodi\", le linee invece \"ways\""
+            },
+            "editing": {
+                "title": "Modifica e salvataggio",
+                "select_h": "Seleziona",
+                "select_left_click": "[leftclick] Il clic con il taso sx del mouse seleziona un elemento. L'elemento selezionato si evidenzierà e la barra laterale mostrerà le informazioni di quell'elemento, ad esempio il nome e l'indirizzo.",
+                "select_right_click": "[rightclick] Il clic con il tasto dx del mouse su un elemento, farà apparire alcuni comandi aggiuntivi, quali: ruota, sposta, cancella, taglia e dividi.",
+                "multiselect_h": "Selezione multipla",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Il clic con il tasto sx del mouse consente di selezionare più elementi della mappa. La funzione è utile per spostare e cancellare contemporaneamente più elementi.",
+                "multiselect_lasso": "Un altro modo per selezionare più elementi contemporaneamente è quello di tenere premuto il tasto `{shift}` sulla tastiera e quindi premere e tenere premuto il {leftclick} tasto sinistro del mouse e trascinare il mouse per disegnare una selezione. Saranno così selezionati tutti i punti presenti nell'area della selezione.",
+                "undo_redo_h": "Annulla e avanza",
+                "undo_redo": "Finché non decidi di salvare, le tue modifiche sono salvate temporaneamente nel tuo browser. Puoi annullare ogni modifica con il tasto [annulla] oppure ripristinare la modifica annullata con il tasto [avanti]",
+                "save_h": "Salva",
+                "save": "Clicca [salva] per terminare la tua modifica e inviare i nuovi dati a OpenstreetMap. Ricordati di salvare spesso il tuo lavoro!",
+                "save_validation": "Nella schermata di salvataggio avrai la possibilità di visualizzare le tue modifiche. iD farà inoltre un controllo sulle tue modifiche, con lo scopo di individuare informazioni mancanti o  segnalare suggerimenti, in caso qualcosa non risulti corretto.",
+                "upload_h": "Carica",
+                "upload": "Prima di caricare le tue modifiche devi inserire un [commento al gruppo di modifiche](https://wiki.openstreetmap.org/wiki/IT:Good_changeset_comments). Fatto ciò clicca su **Carica** per inviare le tue modifiche ad OpenStreetMap, dove saranno unite alla mappa e rese visibili pubblicamente a chiunque.",
+                "backups_h": "Backup automatico",
+                "backups": "Nel caso tu non possa completare le modifiche in una singola sessione, ad esempio in caso di crash del browser, le tue modifiche saranno conservate nella cache del browser, in modo da consentire di riprendere le modifiche da dove si era stati interrotti.",
+                "keyboard_h": "Comando da tastiera",
+                "keyboard": "Premendo '?' puoi visualizzare la lista dei comandi da tastiera"
+            },
+            "feature_editor": {
+                "title": "Editor degli Elementi",
+                "intro": "L'*editor degli elementi* si trova a lato della mappa e ti permette di modificare tutte le informazioni dell'elemento selezionato.",
+                "definitions": "La sezione più in alto mostra la tipologia dell'elemento. La sezione in mezzo contiene i *campi* che mostrano gli attributi dell'elemento, come il suo nome o l'indirizzo.",
+                "type_h": "Tipo di oggetto",
+                "type": "Puoi cliccare sul tipo dell'elemento per cambiarlo in un tipo differente. Tutto ciò che esiste nel mondo reale può essere aggiunto ad OpenStreetMap, pertanto ci sono migliaia di tipologie tra le quali scegliere.",
+                "type_picker": "Il raccoglitore dei tipi mostra i tipi di elementi più comuni, come ad esempio i parchi pubblici, gli ospedali, i ristoranti, le strade e gli edifici. Cerca qualsiasi oggetto scrivendo nel riquadro di ricerca. Per conoscere i dettagli del tipo di elemento clicca l'icona {inspect} **Informazioni** a fianco.",
+                "fields_h": "Campi",
+                "fields_all_fields": "La sezione \"Tutti i campi\" contiene i dettagli dell'elemento che puoi modificare. In OpenStreetMap, tutti i campi sono opzionali, puoi lasciarne uno vuoto se non sei sicuro.",
+                "fields_example": "Ogni elemento mostrerà campi differenti. Per esempio, per una una strada sarà possibile impostare la sua superficie e il limite di velocità, mentre per un ristorante saranno mostrati campi del cibo servito e degli orari di apertura.",
+                "fields_add_field": "Per aggiungere delle informazioni puoi cliccare \"Aggiungi campo\"",
+                "tags_h": "Etichette",
+                "tags_all_tags": "Sotto la sezione dei campi, puoi espandere la sezione \"Tutti i tag\" per modificare un qualsiasi *tag* di OpenStreetMap per l'elemento selezionato. Ogni tag è formato da una *chiave* ed un *valore* che definiscono ciascuno degli elementi presenti in OpenStreetMap.",
+                "tags_resources": "La modifica dei tag di un elemento richiede una conoscenza intermedia di OpenStreetMap. Dovresti consultare la [wiki di OpenStreetMap](https://wiki.openstreetmap.org/wiki/Main_Page) o [Taginfo](https://taginfo.openstreetmap.org/) per imparare quali usare di volta in volta."
+            },
+            "points": {
+                "title": "Punti",
+                "intro": "I punti sono utilizzati per indicare oggetti come negozi, ristoranti, monumenti,... Indicano la posizione precisa e descrivono cosa c'è lì.",
+                "add_point_h": "Aggiungere punti",
+                "add_point": "Per aggiungere un punto, clicca il pulsante {point} **Punto** sulla barra degli strumenti sopra la mappa, oppure premi la scorciatoia da tastiera `1`. Il cursore del mouse diverrà a forma di croce.",
+                "add_point_finish": "Per aggiungere un nuovo punto sulla mappa, posiziona il cursore del mouse dove vorresti metterlo, quindi clicca il {leftclick} pulsante sinistro del mouse oppure premi `spazio`.",
+                "move_point_h": "Spostare punti",
+                "move_point": "Per spostare un punto, posiziona il cursore del mouse sul punto, quindi tieni premuto il {leftclick} pulsante sinistro del mouse mentre sposti il punto verso la sua nuova posizione.",
+                "delete_point_h": "Cancellare punti",
+                "delete_point": "Non è errato rimuovere un elemento che non esiste nel mondo reale. Quando cancelli qualcosa da OpenStreetMap nessun potrà più vedere quell'oggetto sulla mappa, quindi prima di rimuoverlo verifica accuratamente che quell'elemento non sia più presente nella realtà.",
+                "delete_point_command": "Per eliminare un punto, clicca col {rightclick} tasto destro del mouse su di esso per selezionarlo e mostrare il menù di modifica, quindi usa il comando {delete} **Cancella**."
+            },
+            "lines": {
+                "title": "Linee",
+                "intro": "Le *linee* sono utilizzate per rappresentare elementi quali strade, ferrovie e fiumi. Le linee dovrebbero essere tracciate lungo il centro dell'elemento che vogliono rappresentare.",
+                "add_line_h": "Aggiungere linee",
+                "add_line": "Per aggiungere una linea, clicca il pulsante {line} **Linea** sulla barra degli strumenti sopra la mappa oppure premi la scorciatoia da tastiera `2`. Il cursore del mouse diverrà una croce.",
+                "add_line_draw": "Adesso posiziona il cursore del mouse dove vuoi che linea inizi e clicca con il {leftclick} pulsante sinistro del mouse o premi `spazio` per iniziare a disegnare i nodi lungo la linea. Continua a disegnare i nodi cliccando con il mouse o premendo `spazio`. Mentre disegni, puoi ingrandire o spostare la mappa così da poter avere maggiori dettagli.",
+                "add_line_finish": "Per completare una linea, premi `{return}` oppure clicca nuovamente sull'ultimo punto",
+                "modify_line_h": "Modificare linee",
+                "modify_line_dragnode": "Spesso vedrai delle linee che non sono disegnate correttamente, per esempio una strada che non corrisponde granché alle immagini di sfondo. Per migliorare l'aspetto di una linea, per prima cosa clicca col {leftclick} tasto sinistro del mouse per selezionarla. Tutti i nodi della linea diverranno dei piccoli cerchi. Adesso puoi spostare ogni nodo in una posizione più corretta.",
+                "modify_line_addnode": "Puoi anche aggiungere dei nodi ad una linea sia cliccando due volte col {lefclick}**x2** tasto sinistro del mouse sulla linea oppure trascinando i piccoli triangoli situati a metà strada tra i vari nodi già presenti.",
+                "connect_line_h": "Connettere linee",
+                "connect_line": "È importante per la mappa ed essenziale per fornire le indicazioni che le strade sia collegate tra loro nel modo giusto.",
+                "connect_line_display": "Le connessioni tra le strade sono mostrate mediante dei piccoli cerchi grigi. Se non sono collegati a nient'altro, gli estremi di una linea sono disegnati con dei cerchi bianchi più grandi.",
+                "connect_line_drag": "Per collegare una linea ad un altro elemento, sposta uno dei suoi nodi sull'altro fino a che entrambi gli elementi non si attaccano fra loro. Suggerimento: puoi tenere premuto il tasto `{alt}` per evitare che un nodo venga collegato ad altri elementi.",
+                "connect_line_tag": "Se sai che ad un incrocio è presente un semaforo o degli attraversamenti pedonali, puoi aggiungerlo selezionando il nodo di collegamento delle strade e utilizzando l'editor dell'elemento per impostare il valore corretto.",
+                "disconnect_line_h": "Disconnettere linee",
+                "disconnect_line_command": "Per separare una strada da un altro elemento, clicca col {rightclick} tasto destro del mouse sul nodo di connessione e seleziona il comando {disconnect} **Disconnetti** dal menù di modifica.",
+                "move_line_h": "Spostare linee",
+                "move_line_command": "Per spostare tutta la linea, clicca col {rightclick} tasto destro del mouse e seleziona il comando {move} **Muovi* dal menù di modifica. Adesso sposta il mouse e clicca col tasto sinistro per posizionare la linea nel punto prescelto.",
+                "move_line_connected": "Se sposti la linea in un altro punto, i collegamenti con gli altri elementi non verranno intaccati. In certi casi iD potrebbe impedirti di spostare una linea oltre un'altra con la quale è connessa.",
+                "delete_line_h": "Cancellare linee",
+                "delete_line": "Se una linea è completamente sbagliata, per esempio una strada che non esiste in realtà, è corretto eliminarla. Fai attenzione quando rimuovi un elemento: le immagini di sfondo che vedi potrebbero essere vecchie e la strada che sembra sbagliata potrebbe in realtà essere stata costruita più recentemente.",
+                "delete_line_command": "Per eliminare una linea, clicca col {rightclick} tasto destro del mouse per mostrare il menù di modifica, poi usa il comando {delete} **Cancella**."
+            },
+            "areas": {
+                "title": "Aree",
+                "intro": "Le *aree* sono utilizzate per mostrare i confini di elementi quali laghi, edifici e aree residenziali. Le aree dovrebbero essere tracciate lungo i bordi degli elementi che esse rappresentano, per esempio la base di un edificio.",
+                "point_or_area_h": "Punti o aree?",
+                "point_or_area": "Molti oggetti possono essere rappresentati come punti o aree. Se possibile, dovresti sempre mappare gli edifici e i contorni di una proprietà come aree. Inserisci punti dentro l'area di un edificio per rappresentare attività commerciali, servizi e altri elementi presenti al suo interno.",
+                "add_area_h": "Aggiungere aree",
+                "add_area_command": "Per aggiungere un'area, clicca il pulsante {area} **Area** sulla barra degli strumenti sopra la mappa, oppure premi la scorciatoia da tastiera `3`. Il cursore del mouse diverrà una croce.",
+                "add_area_draw": "Adesso, posiziona il cursore del mouse su di un angolo dell'elemento e clicca col {leftclick} tasto sinistro del mouse oppure premi `spazio` per iniziare a posizionare i nodi attorno al bordo esterno dell'area. Continua ad aggiungere i nodi cliccando o premendo `spazio`. Mentre disegni, puoi ingrandire o trascinare la mappa così da poter avere maggiori dettagli.",
+                "add_area_finish": "Per completare un'area, premi `{return}` o clicca nuovamente sul primo oppure sull'ultimo nodo.",
+                "square_area_h": "Rendere retti gli angoli",
+                "square_area_command": "Molti oggetti di tipo area come gli edifici hanno solo angoli interni retti. Per ortogonalizzare un'area, clicca col {rightclick} tasto destro del mouse un'area e seleziona il comando *{orthogonalize} **Ortogonalizza** dal menù di modifica.",
+                "modify_area_h": "Modificare aree",
+                "modify_area_dragnode": "Spesso vedrai aree che non sono disegnate correttamente, per esempio un edificio che non corrisponde alle immagini di sfondo. Per migliorare l'aspetto di un'area, per prima cosa clicca col {leftclick} tasto sinistro del mouse per selezionarla. Tutti i nodi dell'area appariranno come piccoli cerchi. Adesso puoi trascinare i nodi nelle posizioni più opportune.",
+                "modify_area_addnode": "Puoi anche aggiungere nuovi nodi ad un'area cliccando due volte col {leftclick}**x2** tasto sinistro del mouse sul bordo dell'area oppure trascinando i piccoli triangoli a metà strada tra i nodi già presenti",
+                "delete_area_h": "Cancellare aree",
+                "delete_area": "Non è sbagliato rimuovere un'area se questa è completamente errata, come per esempio nel caso di un edificio che non esiste in realtà. Fai però attenzione quando elimini degli elementi: le immagini di sfondo che vedi potrebbero essere vecchie mentre l'edificio che sembra sbagliato potrebbe in realtà essere stato costruito più di recente.",
+                "delete_area_command": "Per eliminare un'area, clicca col {rightclick} tasto destro del mouse su di essa per selezionarla e mostrare il menù di modifica, quindi usa il comando {delete} **Cancella**."
+            },
+            "relations": {
+                "title": "Relazioni",
+                "intro": "Una *relazione* è un tipo speciale di elemento di OpenStreetMap che serve a raggruppare insieme altri elementi. Gli elementi appartenenti ad una relazione sono chiamati *membri* e ogni membro può avere un *ruolo* nella relazione.",
+                "edit_relation_h": "Modificare le relazioni",
+                "edit_relation": "In fondo all'editor dell'elemento è presente la sezione \"Tutte le relazioni\" che puoi espandere per verificare se l'elemento selezionato è membro di qualche relazione. Puoi cliccare sulla relazione per selezionarla e quindi modificarla.",
+                "edit_relation_add": "Per aggiungere un elemento ad una relazione, seleziona prima l'elemento, quindi premi il pulsante {plus} aggiungi nella sezione \"Tutte le relazioni\" dell'editor dell'elemento. Puoi scegliere tra una lista di relazioni vicine oppure selezionare l'opzione \"Nuova relazione...\".",
+                "edit_relation_delete": "Puoi anche cliccare il pulsante {delete} **Cancella** per rimuovere l'elemento selezionato dalla relazione. Se rimuovi tutti i membri di una relazione, questa verrà eliminata a sua volta.",
+                "maintain_relation_h": "Manutenere le relazioni",
+                "maintain_relation": "Nella maggior parte dei casi, iD si occuperà automaticamente delle relazioni mentre fai le tue modifiche. Dovresti comunque prestare attenzione quando rimpiazzi elementi che potrebbero essere membri di una relazione. Per esempio, se elimini una parte di strada e tracci un altro pezzo al suo posto, dovresti poi aggiungere anche la nuova strada alle stesse relazioni (percorsi, divieti di svolta, etc.) dell'originale.",
+                "relation_types_h": "Tipi di relazione",
+                "multipolygon_h": "Multipoligoni",
+                "multipolygon": "Una relazione *multipoligono* consiste in un gruppo di uno o più elementi esterni e di uno o più elementi interni. Quelli esterni definiscono i bordi di confine del multipoligono mentre quelli interni tracciano le sub-aree o buchi presenti all'interno del multipoligono.",
+                "multipolygon_create": "Per creare un multipoligono, come per esempio un edificio con un cortile interno, traccia il bordo esterno come area e quello interno come una linea o come un'altra area. A questo punto seleziona i due elementi creati premendo `{shift}`+{leftclick} tasto sinistro del mouse su entrambi, poi clicca sul {rightclick} tasto destro del mouse per mostrare il menù di modifica, quindi seleziona il comando {merge} **Unisci**.",
+                "multipolygon_merge": "Quando si uniscono più linee o aree, viene creata una nuova relazione multipoligono avente come membri gli elementi selezionati. iD aggiungerà automaticamente i ruoli outer e inner, determinando quali elementi sono contenuti all'interno degli altri.",
+                "turn_restriction_h": "Restrizione di svolta",
+                "turn_restriction": "Una relazione *Obbligo di svolta* è formata da un gruppo di segmenti di strade ad una intersezione. Gli obblighi di svolta contengono una strada *da*, un nodo *via* e una strada *verso*.",
+                "turn_restriction_field": "Per modificare un obbligo di svolta, seleziona il nodo di giunzione dove due o più strade s'incontrano. L'editor dell'elemento mostrerà un campo speciale \"Obblighi di svolta' contenente un modello dell'intersezione.",
+                "turn_restriction_editing": "Nel campo \"Obblighi di svolta\", clicca per selezionare una strada \"da\" e decidi se le svolte sono consentite oppure vietate per ogni strada \"verso\". Clicca nelle icone di svolta per alternare lo stato tra consentito e vietato. iD creerà automaticamente le relazione e imposterà i ruoli \"da\", \"via\" e \"verso\" basandosi sulle tue scelte.",
+                "route_h": "Percorsi",
+                "route": "Una relazione *percorso* consiste in un gruppo di uno o più elementi linea che formano insieme una rete di percorsi, come per esempio la linea di un autobus, quella di un treno oppure un percorso stradale.",
+                "route_add": "Per aggiungere un elemento ad una relazione percorso, seleziona l'elemento e scorri verso il basso fino alla sezione \"Tutte le relazioni\" dell'editor dell'elemento, poi clicca il pulsante {plus} aggiungi per aggiungere questo elemento ad una relazione vicina già esistente oppure per crearne una nuova.",
+                "boundary_h": "Confini",
+                "boundary": "Una relazione *Confine\" consiste in un gruppo di uno o più elementi linea che insieme formano un confine amministrativo.",
+                "boundary_add": "Per aggiungere un elemento ad una relazione confine, seleziona l'elemento e scorri verso il basso fino alla sezione \"Tutte le relazioni\" dell'editor dell'elemento, poi clicca sul pulsante {plus} aggiungi per aggiungere l'elemento ad una relazione vicina già esistente o per crearne una nuova."
+            },
+            "imagery": {
+                "title": "Immagini di sfondo",
+                "intro": "Le immagini di sfondo che appaiono dietro i dati della mappa sono una risorsa importante per il mappatore. Queste immagini possono essere foto aeree scattate da satelliti, aeroplani o droni oppure ancora mappe antiche digitalizzate o dati fruibili liberamente.",
+                "sources_h": "Provenienza delle immagini",
+                "choosing": "Per vedere quali fonti per le immagini sono disponibili durante la modifica, clicca il pulsante {layers} **Impostazioni dello sfondo** a lato della mappa.",
+                "sources": "Inizialmente, vengono mostrate come sfondo le immagini satellitari di [Bing Maps](https://www.bing.com/maps/). A seconda di dove stai modificando, saranno disponibili altre fonti per le immagini di sfondo. Alcune potrebbero essere più nuove oppure avere una risoluzione maggiore, quindi è sempre utile dare un'occhiata agli strati disponibili e verificare qual è il migliore da usare come riferimento.",
+                "offsets_h": "Aggiustare l'allineamento delle immagini",
+                "offset": "Le immagini di sfondo sono talvolta leggermente fuori asse rispetto agli accurati dati della mappa. Se ti capita di vedere molte strade ed edifici che sono disallineati rispetto alle immagini di sfondo, è probabile che siano quest'ultime ad essere sbagliate, quindi sarebbe sbagliato spostare tutti gli oggetti per farlo corrispondere allo sfondo. Al contrario, puoi allineare lo sfondo ai dati della mappa andando nella sezione \"Correggi spostamento immagini\" in fondo al pannello \"Impostazioni dello sfondo\".",
+                "offset_change": "Clicca sui piccoli triangoli per correggere l'allineamento delle immagini a piccoli passi, oppure tieni premuto il pulsante sinistro del mouse e trascina all'interno del quadrato grigio per allineare più finemente le immagini di sfondo."
+            },
+            "streetlevel": {
+                "title": "Foto a livello stradale",
+                "intro": "Le foto a livello stradale sono utile per mappare segnali stradali, attività commerciali e altri dettagli che non si possono vedere da foto satellitari o aeree. L'editor iD è compatibile con le foto a livello stradale di [Mapillary](https://www.mapillary.com) e [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Utilizzo delle foto a livello stradale",
+                "using": "Per usare le foto a livello stradale, clicca sul pannello {data} **Dati mappa** a lato della mappa per abilitare o disabilitare i livelli di foto disponibili.",
+                "photos": "Quando abilitato, il livello delle foto mostra una linea lungo la sequenza di foto. A livelli di ingrandimento maggiori, un cerchio indica il punto in cui ogni foto è stata scattata, mentre a livelli di ingrandimento ancora più grandi, un cono mostra la direzione della fotocamera al momento dello scatto.",
+                "viewer": "Se clicchi sulla posizione di una foto, essa viene mostrata in un angolo della mappa. Il visualizzatore contiene i controlli per andare avanti e indietro nella sequenza delle immagini. Sono mostrati inoltre il nome utente della persona che ha scattato la foto, la data di scatto e il link per vedere la foto nel sito originale."
+            },
+            "gps": {
+                "title": "Tracce GPS",
+                "intro": "Le tracce GPS degli utenti sono un'importante risorsa dati per OpenStreetMap. Questo editor è compatibile con i file *.gpx*, *.geojson*, and *.kml* presenti nel tuo computer locale. Puoi raccogliere tracce GPS con uno smartphone, un orologio sportivo o con altri dispositivi GPS.",
+                "survey": "Per ulteriori informazioni su come effettuare una ricognizione con un GPS, leggi [Creare una mappa con smartphone, GPS o carte stampate](http://learnosm.org/it/mobile-mapping/).",
+                "using_h": "Utilizzare tracce GPS",
+                "using": "Per usare una traccia GPS durante la mappatura, trascina e rilascia il file dei dati sull'editor della mappa. Se riconosciuto, il file verrà automaticamente mostrato sulla mappa con un linea viola. Clicca il pannello {data} **Dati mappa** a lato della mappa per abilitare, disabilitare o ingrandire i tuoi dati GPS.",
+                "tracing": "La traccia GPS non viene inviata ad OpenStreetMap: il modo migliore di procedere è di disegnare sulla mappa, usandola come riferimento per i nuovi elementi da aggiungere.",
+                "upload": "Puoi anche [caricare i tuoi dati GPS su OpenStreetMap](https://www.openstreetmap.org/trace/create) affinché anche gli altri utenti possano usarli."
+            }
         },
         "intro": {
             "done": "fatto",
                     "paparazzi-tattoo": "Lauro Tattoo",
                     "pealer-street": "Via Francesco Petrarca",
                     "pine-street": "Via dei pini",
-                    "pizza-hut": "Pizzeria Vesuvio",
+                    "pizza-hut": "Pizzeria Hut",
                     "portage-avenue": "Viale Maiella",
                     "portage-river": "Fiume Medonte",
                     "preferred-insurance-services": "Assicurazioni",
             },
             "areas": {
                 "title": "Aree",
-                "add_playground": "*Le aree* sono utilizzate per indicare i contorni degli elementi come ad esempio laghi, edifici e aree residenziali.{br}Possono anche essere utilizzate per rappresentare in modo più dettagliato elementi che normalmente vengono mappati come punti. **Clicca il pulsante Area {button} per aggiungere una nuova area.**",
+                "add_playground": "Le *aree* sono utilizzate per indicare i contorni degli elementi come ad esempio i laghi, gli edifici e le aree residenziali.{br}Possono anche essere utilizzate per rappresentare in modo più dettagliato elementi che normalmente vengono mappati come punti. **Clicca il pulsante Area {button} per aggiungere una nuova area.**",
                 "start_playground": "Aggiungiamo questo parco giochi alla mappa disegnandone l'area. Le aree sono disegnate posizionando dei *punti* lungo il bordo esterno dell'elemento. **Clicca o premi la barra spaziatrice per posizionare il punto iniziale su uno dei vertici del parco giochi.**",
+                "continue_playground": "Continua a disegnare l'area sistemando più punti lungo il bordo del parco giochi. Si può connettere l'area ai percorsi pedonali esistenti.{br}Suggerimento: Puoi tenere premuto il tasto Alt per impedire ai punti che stai creando di connettersi ad altri elementi. **Continua a disegnare l'area del parco giochi.**",
                 "finish_playground": "Termina l'area premendo Invio, o cliccando nuovamente sul primo o ultimo nodo. **Finisci di disegnare un'area per il parco giochi.**",
                 "search_playground": "**Cerca '{preset}'.**",
                 "choose_playground": "**Scegli {preset} dalla lista.**",
             },
             "startediting": {
                 "title": "Inizia a Modificare",
+                "help": "Ora dovresti essere in grado di fare modifiche su OpenstreetMap! [br] Puoi ripetere questo tutorial ogni volta che lo desideri, oppure puoi visualizzare della documentazione aggiuntiva cliccando [bottone] il tasto Aiuto oppure premendo [key].",
+                "shortcuts": "Puoi visualizzare una lista dei comandi, compresi quelli da tastiera, premendo il tasto '[key]'.",
                 "save": "Non dimenticare di salvare periodicamente le tue modifiche!",
                 "start": "Inizia a mappare!"
             }
         "shortcuts": {
             "title": "Scorciatoie da tastiera",
             "tooltip": "Mostra le scorciatoie da tastiera",
+            "toggle": {
+                "key": "?"
+            },
             "key": {
                 "alt": "Alt",
                 "backspace": "Backspace",
                     "title": "Selezione elementi",
                     "select_one": "Seleziona un solo elemento",
                     "select_multi": "Seleziona più elementi",
-                    "lasso": "Disegna un lazo intorno agli elementi da selezionare"
+                    "lasso": "Disegna un lazo intorno agli elementi da selezionare",
+                    "search": "Trova gli elementi che corrispondono al testo della ricerca"
                 },
                 "with_selected": {
                     "title": "Con l'elemento selezionato",
             "tools": {
                 "title": "Strumenti",
                 "info": {
-                    "title": "Informazioni"
+                    "title": "Informazioni",
+                    "all": "Commuta tutti i pannelli informazioni",
+                    "background": "Commuta pannello di sfondo",
+                    "history": "Commuta pannello cronologia",
+                    "location": "Commuta pannello posizione",
+                    "measurement": "Commuta pannello misurazione"
                 }
             }
         },
+        "units": {
+            "feet": "{quantità} piedi",
+            "miles": "{quantità} miglia",
+            "square_feet": "{quantità} piedi quadrati",
+            "square_miles": "{quantità} miglia quadrate",
+            "acres": "{quantità} acri",
+            "meters": "{quantità} metri",
+            "kilometers": "{quantità} chilometri",
+            "square_meters": "{quantità} m²",
+            "square_kilometers": "{quantità} km²",
+            "hectares": "{quantity} acri",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantità}°",
+            "arcminutes": "{quantità}′",
+            "arcseconds": "{quantità}″",
+            "north": "Nord",
+            "south": "Sud",
+            "east": "Est",
+            "west": "Ovest",
+            "coordinate": "{coordinata}{direzione}",
+            "coordinate_pair": "{latitudine}, {longitudine}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                         "subdistrict": "Sottodistretto",
                         "subdistrict!vn": "Rione/Comune/Cittadina",
                         "suburb": "Circoscrizione",
-                        "suburb!jp": "Rione"
+                        "suburb!jp": "Rione",
+                        "unit": "Unità"
                     }
                 },
                 "admin_level": {
                 "aeroway": {
                     "label": "Tipo"
                 },
+                "agrarian": {
+                    "label": "Prodotti"
+                },
                 "amenity": {
                     "label": "Tipo"
                 },
                 "board_type": {
                     "label": "Tipo"
                 },
+                "boules": {
+                    "label": "Tipo"
+                },
                 "boundary": {
                     "label": "Tipo"
                 },
                 "brand": {
                     "label": "Brand"
                 },
+                "brewery": {
+                    "label": "Birre alla spina"
+                },
+                "bridge": {
+                    "label": "Tipo",
+                    "placeholder": "Default"
+                },
                 "building": {
                     "label": "Edificio"
                 },
                 "bunker_type": {
                     "label": "Tipo"
                 },
+                "cables": {
+                    "label": "Cavi",
+                    "placeholder": "1, 2, 3,..."
+                },
                 "camera/direction": {
                     "label": "Direzione (gradi in senso orario)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "Capienza",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direzione",
-                    "options": {
-                        "E": "Est",
-                        "ENE": "Est-nordest",
-                        "ESE": "Est-sudest",
-                        "N": "Nord",
-                        "NE": "Nordest",
-                        "NNE": "Nord-nordest",
-                        "NNW": "Nord-nordovest",
-                        "NW": "Nordovest",
-                        "S": "Sud",
-                        "SE": "Sudest",
-                        "SSE": "Sud-sudest",
-                        "SSW": "Sud-sudovest",
-                        "SW": "Sudovest",
-                        "W": "Ovest",
-                        "WNW": "Ovest-nordovest",
-                        "WSW": "Ovest-sudovest"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipo"
                 },
-                "clock_direction": {
-                    "label": "Direzione",
-                    "options": {
-                        "anticlockwise": "Senso antiorario",
-                        "clockwise": "Senso orario"
-                    }
+                "clothes": {
+                    "label": "Abbigliamento"
                 },
                 "club": {
                     "label": "Tipo"
                     "label": "Orari di raccolta"
                 },
                 "comment": {
-                    "label": "Commento del gruppo di modifiche"
+                    "label": "Commento del gruppo di modifiche",
+                    "placeholder": "Breve descrizione delle modifiche che stai per salvare"
                 },
                 "communication_multi": {
                     "label": "Tipi di comunicazione"
                     "label": "URL webcam",
                     "placeholder": "http://example.com/"
                 },
+                "content": {
+                    "label": "Contenuto"
+                },
                 "country": {
                     "label": "Stato"
                 },
                 "craft": {
                     "label": "Tipo"
                 },
+                "crane/type": {
+                    "label": "Tipo di gru",
+                    "options": {
+                        "floor-mounted_crane": "Gru ancorata a terra",
+                        "portal_crane": "Gru portuale"
+                    }
+                },
                 "crop": {
                     "label": "Colture"
                 },
                 "currency_multi": {
                     "label": "Valute"
                 },
+                "cutting": {
+                    "label": "Tipo",
+                    "placeholder": "Default"
+                },
                 "cycle_network": {
                     "label": "Rete"
                 },
                 "description": {
                     "label": "Descrizione"
                 },
+                "devices": {
+                    "label": "Dispositivi",
+                    "placeholder": "1, 2, 3,..."
+                },
                 "diaper": {
                     "label": "Fasciatoio"
                 },
+                "direction": {
+                    "label": "Direzione (gradi in senso orario)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Direzione",
+                    "options": {
+                        "E": "Est",
+                        "ENE": "Est-nordest",
+                        "ESE": "Est-sudest",
+                        "N": "Nord",
+                        "NE": "Nordest",
+                        "NNE": "Nord-nordest",
+                        "NNW": "Nord-nordovest",
+                        "NW": "Nordovest",
+                        "S": "Sud",
+                        "SE": "Sudest",
+                        "SSE": "Sud-sudest",
+                        "SSW": "Sud-sudovest",
+                        "SW": "Sudovest",
+                        "W": "Ovest",
+                        "WNW": "Ovest-nordovest",
+                        "WSW": "Ovest-sudovest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direzione",
+                    "options": {
+                        "anticlockwise": "Senso antiorario",
+                        "clockwise": "Senso orario"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direzione",
+                    "options": {
+                        "backward": "A ritroso",
+                        "both": "Entrambi / Tutti",
+                        "forward": "In avanti"
+                    }
+                },
                 "display": {
                     "label": "Display"
                 },
                 "drive_through": {
                     "label": "Drive-through"
                 },
+                "duration": {
+                    "label": "Durata",
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "Elettrificata",
                     "options": {
                     "label": "Email",
                     "placeholder": "esempio@esempio.com"
                 },
+                "embankment": {
+                    "label": "Tipo",
+                    "placeholder": "Default"
+                },
                 "emergency": {
                     "label": "Emergenza"
                 },
                         "wall": "A muro"
                     }
                 },
+                "fitness_station": {
+                    "label": "Tipo di equipaggiamento"
+                },
                 "fixme": {
-                    "label": "Sistemare"
+                    "label": "Da correggere"
+                },
+                "ford": {
+                    "label": "Tipo",
+                    "placeholder": "Default"
+                },
+                "frequency": {
+                    "label": "Frequenza operativa"
                 },
                 "fuel": {
                     "label": "Carburante"
                 "generator/method": {
                     "label": "Metodo"
                 },
+                "generator/output/electricity": {
+                    "label": "Potenza in uscita",
+                    "placeholder": "50 MW, 100 MW, 200 MW..."
+                },
                 "generator/source": {
                     "label": "Fonte"
                 },
                 "generator/type": {
                     "label": "Tipo"
                 },
+                "government": {
+                    "label": "Tipo"
+                },
                 "grape_variety": {
                     "label": "Varietà"
                 },
                 "handrail": {
                     "label": "Corrimano"
                 },
+                "hashtags": {
+                    "label": "Hashtag suggeriti",
+                    "placeholder": "#esempio"
+                },
+                "healthcare": {
+                    "label": "Tipo"
+                },
+                "healthcare/speciality": {
+                    "label": "Specialità"
+                },
                 "height": {
                     "label": "Altezza (Metri)"
                 },
                 "inscription": {
                     "label": "Iscrizione"
                 },
+                "intermittent": {
+                    "label": "Intermittente"
+                },
                 "internet_access": {
                     "label": "Accesso ad Internet",
                     "options": {
                 "kerb": {
                     "label": "Cordolo"
                 },
+                "label": {
+                    "label": "Etichetta"
+                },
                 "lamp_type": {
                     "label": "Tipo"
                 },
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
-                    "label": "Livello"
+                    "label": "Livello",
+                    "placeholder": "0"
                 },
                 "leaf_cycle": {
                     "label": "Fogliame",
                 "man_made": {
                     "label": "Tipo"
                 },
+                "manhole": {
+                    "label": "Tipo"
+                },
                 "map_size": {
                     "label": "Copertura"
                 },
                 "maxweight": {
                     "label": "Peso massimo"
                 },
+                "memorial": {
+                    "label": "Tipo"
+                },
+                "monitoring_multi": {
+                    "label": "Controllo"
+                },
                 "mtb/scale": {
                     "label": "Difficoltà Mountain Bike",
                     "options": {
                 "oneway": {
                     "label": "Senso unico",
                     "options": {
+                        "alternating": "Senso unico alternato",
                         "no": "No",
+                        "reversible": "Invertibile",
                         "undefined": "No (ipotesi)",
                         "yes": "Sì"
                     }
                 "oneway_yes": {
                     "label": "Senso unico",
                     "options": {
+                        "alternating": "Senso unico alternato",
                         "no": "No",
                         "undefined": "Si (ipotesi)",
                         "yes": "Sì"
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direzione",
-                    "options": {
-                        "backward": "A ritroso",
-                        "forward": "In avanti"
-                    }
-                },
                 "park_ride": {
                     "label": "Parcheggio di Interscambio"
                 },
                 "payment_multi": {
                     "label": "Tipologie di pagamento"
                 },
+                "phases": {
+                    "label": "Fasi",
+                    "placeholder": "1, 2, 3,..."
+                },
                 "phone": {
                     "label": "Telefono",
                     "placeholder": "+39 01 123 456"
                 "plant": {
                     "label": "Pianta"
                 },
+                "plant/output/electricity": {
+                    "label": "Potenza in uscita",
+                    "placeholder": "500 MW, 1000 MW, 2000 MW..."
+                },
+                "playground/baby": {
+                    "label": "Seggiolino"
+                },
+                "playground/max_age": {
+                    "label": "Età massima"
+                },
+                "playground/min_age": {
+                    "label": "Età minima"
+                },
                 "population": {
                     "label": "Popolazione"
                 },
                 "railway": {
                     "label": "Tipo"
                 },
-                "recycling_accepts": {
-                    "label": "Accetta"
+                "railway/position": {
+                    "placeholder": "Distanza ad una cifra decimale (123.4)"
                 },
-                "recycling_type": {
-                    "label": "Tipologia di riciclaggio",
+                "railway/signal/direction": {
+                    "label": "Direzione",
                     "options": {
-                        "centre": "Centro di riciclaggio",
-                        "container": "Contenitore"
+                        "backward": "A ritroso",
+                        "both": "Entrambe / Tutte",
+                        "forward": "In avanti"
                     }
                 },
+                "rating": {
+                    "label": "Valutazione della potenza"
+                },
+                "recycling_accepts": {
+                    "label": "Accetta"
+                },
+                "ref": {
+                    "label": "Numero di matricola"
+                },
+                "ref/isil": {
+                    "label": "Codice ISIL"
+                },
+                "ref_aeroway_gate": {
+                    "label": "Numero del cancello"
+                },
+                "ref_golf_hole": {
+                    "label": "Numero di buca",
+                    "placeholder": "1-18"
+                },
+                "ref_highway_junction": {
+                    "label": "Numero Svincolo"
+                },
+                "ref_platform": {
+                    "label": "Numero di banchina"
+                },
+                "ref_road_number": {
+                    "label": "Numero della strada"
+                },
+                "ref_route": {
+                    "label": "Numero linea"
+                },
+                "ref_runway": {
+                    "label": "Numero pista",
+                    "placeholder": "es. 01L/19R"
+                },
+                "ref_stop_position": {
+                    "label": "Numero di fermata"
+                },
+                "ref_taxiway": {
+                    "label": "Codice pista di rullaggio",
+                    "placeholder": "Esempio A5"
+                },
                 "relation": {
                     "label": "Tipo"
                 },
                 "social_facility_for": {
                     "label": "Tipo di utenza"
                 },
+                "source": {
+                    "label": "Fonti"
+                },
                 "sport": {
                     "label": "Sport"
                 },
                     },
                     "placeholder": "Sconosciuto"
                 },
+                "structure_waterway": {
+                    "label": "Struttura",
+                    "options": {
+                        "tunnel": "Galleria"
+                    },
+                    "placeholder": "Sconosciuto"
+                },
                 "studio": {
                     "label": "Settore"
                 },
+                "substance": {
+                    "label": "Sostanza"
+                },
                 "substation": {
                     "label": "Tipo"
                 },
                 "surveillance/zone": {
                     "label": "Zona sorvegliata"
                 },
+                "switch": {
+                    "label": "Tipo",
+                    "options": {
+                        "mechanical": "Meccanico"
+                    }
+                },
                 "tactile_paving": {
                     "label": "Pavimento tattile"
                 },
                 "tourism": {
                     "label": "Tipo"
                 },
+                "tourism_attraction": {
+                    "label": "Turismo"
+                },
                 "tower/construction": {
                     "label": "Tipo di costruzione",
                     "placeholder": "Con tiranti, traliccio, camuffata, ..."
                     },
                     "placeholder": "Solido, Soprattutto Solido, Morbido..."
                 },
+                "trade": {
+                    "label": "Tipo"
+                },
                 "traffic_calming": {
                     "label": "Tipo"
                 },
                 "traffic_signals": {
                     "label": "Tipo"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direzione",
+                    "options": {
+                        "backward": "A ritroso",
+                        "both": "Entrambe / Tutte",
+                        "forward": "In avanti"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Visibilità del Tracciato",
                     "options": {
                     },
                     "placeholder": "Eccellente, Buona, Cattiva..."
                 },
+                "transformer": {
+                    "label": "Tipo",
+                    "options": {
+                        "auxiliary": "Ausiliario",
+                        "converter": "Convertitore",
+                        "distribution": "Distribuzione",
+                        "generator": "Generatore",
+                        "traction": "Trazione",
+                        "yes": "Sconosciuto"
+                    }
+                },
                 "trees": {
                     "label": "Alberi"
                 },
+                "tunnel": {
+                    "label": "Tipo",
+                    "placeholder": "Default"
+                },
                 "vending": {
                     "label": "Beni venduti"
                 },
                         "street": "Da 5 a 20 m (da 16 a 65 ft)"
                     }
                 },
+                "volcano/status": {
+                    "label": "Stato del vulcano",
+                    "options": {
+                        "active": "Attivo",
+                        "dormant": "Dormiente",
+                        "extinct": "Spento"
+                    }
+                },
+                "volcano/type": {
+                    "label": "Tipo di vulcano",
+                    "options": {
+                        "scoria": "Cono di scorie",
+                        "shield": "Scudo",
+                        "stratovolcano": "Stratovulcano"
+                    }
+                },
+                "voltage": {
+                    "label": "Tensione"
+                },
+                "voltage/primary": {
+                    "label": "Voltaggio primario"
+                },
+                "voltage/secondary": {
+                    "label": "Voltaggio sencondario"
+                },
+                "voltage/tertiary": {
+                    "label": "Voltaggio terziario"
+                },
                 "wall": {
                     "label": "Tipo"
                 },
                 },
                 "wikipedia": {
                     "label": "Wikipedia"
+                },
+                "windings": {
+                    "placeholder": "1, 2, 3,..."
+                },
+                "windings/configuration": {
+                    "options": {
+                        "zigzag": "Zig Zag"
+                    }
                 }
             },
             "presets": {
                     "terms": "manovia"
                 },
                 "aerialway/station": {
-                    "name": "Stazione trasporto a fune",
-                    "terms": "seggiovia,funivia,funicolare,cabinovia,slittovia,rotovia,funivia aerea,cestovia,seggiovia navale,sciovia,teleferica,manovia,palorcio"
+                    "name": "Stazione trasporto a fune"
                 },
                 "aerialway/t-bar": {
                     "name": "Skilift ad ancora",
                     "terms": "cambi,ufficio cambi,cambio,valuta,cambiovaluta"
                 },
                 "amenity/bus_station": {
-                    "name": "Stazione degli autobus",
-                    "terms": "autobus,bus,tram,stazione,fermata,capolinea"
+                    "name": "Stazione autobus"
                 },
                 "amenity/cafe": {
                     "name": "Caffè",
                     "terms": "caffè,te,bar"
                 },
+                "amenity/car_pooling": {
+                    "name": "Condivisione automobile",
+                    "terms": "<translate with synonyms or related terms for 'Car Pooling', separated by commas>"
+                },
                 "amenity/car_rental": {
                     "name": "Noleggio auto",
                     "terms": "Noleggio automobili"
                     "name": "Clinica medica",
                     "terms": "clinica,poliambulatori,policlinica"
                 },
+                "amenity/clinic/abortion": {
+                    "name": "Clinica per aborti",
+                    "terms": "<translate with synonyms or related terms for 'Abortion Clinic', separated by commas>"
+                },
+                "amenity/clinic/fertility": {
+                    "name": "Centro fecondazione assistita",
+                    "terms": "<translate with synonyms or related terms for 'Fertility Clinic', separated by commas>"
+                },
                 "amenity/clock": {
                     "name": "Orologio",
                     "terms": "ora,orario,orologio"
                     "terms": "Fast Food"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal traghetti",
-                    "terms": "traghetto,traghetti,imbarco,stazione marittima"
+                    "name": "Stazione battelli"
                 },
                 "amenity/fire_station": {
                     "name": "Caserma dei pompieri",
                     "name": "Biblioteca",
                     "terms": "Libreria"
                 },
+                "amenity/love_hotel": {
+                    "name": "Love Hotel",
+                    "terms": "<translate with synonyms or related terms for 'Love Hotel', separated by commas>"
+                },
                 "amenity/marketplace": {
                     "name": "Mercato",
                     "terms": "Mercato"
                     "name": "Parcheggio moto",
                     "terms": "parcheggio scooter,moto,scooter"
                 },
+                "amenity/music_school": {
+                    "name": "Scuola di musica",
+                    "terms": "<translate with synonyms or related terms for 'Music School', separated by commas>"
+                },
                 "amenity/nightclub": {
                     "name": "Discoteca",
                     "terms": "discoteca,night,locale notturno,balera"
                     "name": "Chiesa",
                     "terms": "cristiano,abbazia,basilica,cattedrale,presbiterio,cappella,chiesa,casa di Dio,luogo di preghiera,luogo di culto,missione,oratorio,parrocchia,sacello,edicola votiva,tabernacolo,tempio"
                 },
+                "amenity/place_of_worship/hindu": {
+                    "name": "Tempio Hindu",
+                    "terms": "<translate with synonyms or related terms for 'Hindu Temple', separated by commas>"
+                },
                 "amenity/place_of_worship/jewish": {
                     "name": "Sinagoga",
                     "terms": "ebreo,ebrea,sinagoga,ebraismo,sionismo"
                     "name": "Moschea",
                     "terms": "musulmana,islamismo,moschea,islam"
                 },
+                "amenity/place_of_worship/shinto": {
+                    "name": "Tempio Shintoista",
+                    "terms": "<translate with synonyms or related terms for 'Shinto Shrine', separated by commas>"
+                },
+                "amenity/place_of_worship/sikh": {
+                    "name": "Tempio Sikh",
+                    "terms": "<translate with synonyms or related terms for 'Sikh Temple', separated by commas>"
+                },
+                "amenity/place_of_worship/taoist": {
+                    "name": "Tempio Taoista",
+                    "terms": "<translate with synonyms or related terms for 'Taoist Temple', separated by commas>"
+                },
                 "amenity/planetarium": {
                     "name": "Planetario",
                     "terms": "museo,astronomia,osservatorio"
                     "terms": "Stazione guardia forestale"
                 },
                 "amenity/recycling": {
-                    "name": "Isola ecologica",
-                    "terms": "riciclo,raccolta differenziata,cestino,pattume,riciclaggio"
+                    "name": "Cassonetto per raccolta differenziata",
+                    "terms": "<translate with synonyms or related terms for 'Recycling Container', separated by commas>"
                 },
                 "amenity/recycling_centre": {
                     "name": "Centro di riciclaggio",
                     "name": "Area Scolastica",
                     "terms": "scuola,accademia,alma mater,lavagna,collegio,dipartimento,disciplina,classe,facoltà,aula,istituto,istituzione,riformatorio,scuola,edificio scolastico,seminario,università"
                 },
+                "amenity/scrapyard": {
+                    "name": "Sfasciacarrozze"
+                },
                 "amenity/shelter": {
                     "name": "Riparo",
                     "terms": "ricovero,rifugio,tettoia,pensilina,bivacco,grotta"
                 },
+                "amenity/shower": {
+                    "name": "Doccia",
+                    "terms": "<translate with synonyms or related terms for 'Shower', separated by commas>"
+                },
+                "amenity/smoking_area": {
+                    "name": "Area fumatori",
+                    "terms": "<translate with synonyms or related terms for 'Smoking Area', separated by commas>"
+                },
                 "amenity/social_facility": {
                     "name": "Centro socio-assistenziale",
                     "terms": "centro sociale,comunità,cooperativa sociale,centro assistenziale,rsa,casa di riposo,ospizio,servizi sociali,casa famiglia,comunità di recupero"
                     "name": "Distributore automatico di sacchetti per escrementi",
                     "terms": "distributore automatico,macchinetta,cacca,cane"
                 },
+                "amenity/vending_machine/feminine_hygiene": {
+                    "name": "Distributore automatico di prodotti per l'igiene femminile",
+                    "terms": "<translate with synonyms or related terms for 'Feminine Hygiene Vending Machine', separated by commas>"
+                },
                 "amenity/vending_machine/news_papers": {
                     "name": "Distributore automatico di giornali"
                 },
                     "name": "Veterinario",
                     "terms": "animali,dottore,medicina,farmacia"
                 },
+                "amenity/waste/dog_excrement": {
+                    "name": "Cestino per escrementi animali",
+                    "terms": "<translate with synonyms or related terms for 'Dog Excrement Bin', separated by commas>"
+                },
                 "amenity/waste_basket": {
                     "name": "Cestino della spazzatura",
                     "terms": "sacchetto della spazzatura,cestino della spazzatura,cassonetto della spazzatura,cassonetto,cestino"
                     "name": "Superificie stradale",
                     "terms": "superficie,manto stradale,materiale"
                 },
+                "attraction/amusement_ride": {
+                    "name": "Parco divertimenti",
+                    "terms": "<translate with synonyms or related terms for 'Amusement Ride', separated by commas>"
+                },
+                "attraction/animal": {
+                    "name": "Animale",
+                    "terms": "<translate with synonyms or related terms for 'Animal', separated by commas>"
+                },
+                "attraction/big_wheel": {
+                    "name": "Ruota panoramica",
+                    "terms": "<translate with synonyms or related terms for 'Big Wheel', separated by commas>"
+                },
+                "attraction/bumper_car": {
+                    "name": "Autoscontro",
+                    "terms": "<translate with synonyms or related terms for 'Bumper Car', separated by commas>"
+                },
+                "attraction/bungee_jumping": {
+                    "name": "Bungee Jumping",
+                    "terms": "<translate with synonyms or related terms for 'Bungee Jumping', separated by commas>"
+                },
+                "attraction/carousel": {
+                    "name": "Carosello",
+                    "terms": "<translate with synonyms or related terms for 'Carousel', separated by commas>"
+                },
+                "attraction/dark_ride": {
+                    "name": "Percorso al buio",
+                    "terms": "<translate with synonyms or related terms for 'Dark Ride', separated by commas>"
+                },
+                "attraction/drop_tower": {
+                    "terms": "<translate with synonyms or related terms for 'Drop Tower', separated by commas>"
+                },
+                "attraction/pirate_ship": {
+                    "name": "Nave dei pirati",
+                    "terms": "<translate with synonyms or related terms for 'Pirate Ship', separated by commas>"
+                },
+                "attraction/river_rafting": {
+                    "name": "Rafting",
+                    "terms": "<translate with synonyms or related terms for 'River Rafting', separated by commas>"
+                },
                 "attraction/roller_coaster": {
-                    "name": "Montagne russe"
+                    "name": "Montagne russe",
+                    "terms": "<translate with synonyms or related terms for 'Roller Coaster', separated by commas>"
+                },
+                "attraction/train": {
+                    "name": "Trenino turistico",
+                    "terms": "<translate with synonyms or related terms for 'Tourist Train', separated by commas>"
+                },
+                "attraction/water_slide": {
+                    "name": "Scivolo",
+                    "terms": "<translate with synonyms or related terms for 'Water Slide', separated by commas>"
                 },
                 "barrier": {
                     "name": "Barriera",
                     "name": "Siepe",
                     "terms": "Siepe"
                 },
+                "barrier/kerb": {
+                    "name": "Cordolo",
+                    "terms": "<translate with synonyms or related terms for 'Kerb', separated by commas>"
+                },
                 "barrier/kissing_gate": {
                     "name": "Cancello che non fa passare il bestiame",
                     "terms": "Kissing Gate"
                     "name": "Fienile",
                     "terms": "granaio,basso servizio,tesa"
                 },
+                "building/boathouse": {
+                    "name": "Rimessa per barche",
+                    "terms": "<translate with synonyms or related terms for 'Boathouse', separated by commas>"
+                },
+                "building/bungalow": {
+                    "name": "Bungalow",
+                    "terms": "<translate with synonyms or related terms for 'Bungalow', separated by commas>"
+                },
                 "building/bunker": {
                     "name": "Bunker"
                 },
                     "name": "Chiesa (edificio)",
                     "terms": "cristiano,abbazia,basilica,cattedrale,presbiterio,cappella,chiesa,casa di Dio,luogo di preghiera,luogo di culto,missione,oratorio,parrocchia,sacello,edicola votiva,tabernacolo,tempio"
                 },
+                "building/civic": {
+                    "name": "Edificio comunale",
+                    "terms": "<translate with synonyms or related terms for 'Civic Building', separated by commas>"
+                },
                 "building/college": {
                     "name": "Edificio di un College",
                     "terms": "università"
                 "building/entrance": {
                     "name": "Entrata/Uscita"
                 },
+                "building/farm": {
+                    "name": "Cascina (residenza)",
+                    "terms": "<translate with synonyms or related terms for 'Farm Building', separated by commas>"
+                },
                 "building/garage": {
                     "name": "Garage",
                     "terms": "Garage"
                     "name": "Edificio di una Scuola d'Infanzia",
                     "terms": "asilo nido,primavera"
                 },
+                "building/mosque": {
+                    "name": "Moschea (edificio)",
+                    "terms": "<translate with synonyms or related terms for 'Mosque Building', separated by commas>"
+                },
                 "building/public": {
                     "name": "Edificio pubblico",
                     "terms": "comunita,edificio comunitario,comunità"
                     "name": "Tettoia",
                     "terms": "tetto,pensilina"
                 },
+                "building/ruins": {
+                    "name": "Edificio in rovina",
+                    "terms": "<translate with synonyms or related terms for 'Building Ruins', separated by commas>"
+                },
                 "building/school": {
                     "name": "Edificio scolastico",
                     "terms": "accademia,alma mater,lavagna,collegio,dipartimento,disciplina,classe,facoltà,aula,istituto,istituzione,riformatorio,scuola,edificio scolastico,seminario,università"
                     "name": "Casa semi indipendente",
                     "terms": "semi-indipendente,semiindipendente,semindipendente, abitazione semi indipendente"
                 },
+                "building/service": {
+                    "name": "Edificio di servizio",
+                    "terms": "<translate with synonyms or related terms for 'Service Building', separated by commas>"
+                },
                 "building/shed": {
                     "name": "Capanno",
                     "terms": "capanno degli attrezzi,capanna,rimessa,capannone"
                     "name": "Stalla",
                     "terms": "stalla,ricovero,scuderia"
                 },
+                "building/stadium": {
+                    "name": "Stadio",
+                    "terms": "<translate with synonyms or related terms for 'Stadium Building', separated by commas>"
+                },
                 "building/static_caravan": {
                     "name": "Roulotte stazionaria",
                     "terms": "Casa mobile,container,casa prefabbricata"
                 },
+                "building/temple": {
+                    "name": "Tempio",
+                    "terms": "<translate with synonyms or related terms for 'Temple Building', separated by commas>"
+                },
                 "building/terrace": {
                     "name": "Villette a schiera",
                     "terms": "villette,fila di case"
                 "building/train_station": {
                     "name": "Stazione ferroviaria"
                 },
+                "building/transportation": {
+                    "name": "Stazione (mezzi di trasporto)",
+                    "terms": "<translate with synonyms or related terms for 'Transportation Building', separated by commas>"
+                },
                 "building/university": {
                     "name": "Edificio universitario",
                     "terms": "college,alma"
                     "name": "Fornitore di catering",
                     "terms": "Addetto al catering,Azienda di catering"
                 },
+                "craft/chimney_sweeper": {
+                    "name": "Spazzacamino",
+                    "terms": "<translate with synonyms or related terms for 'Chimney Sweeper', separated by commas>"
+                },
                 "craft/clockmaker": {
                     "name": "Costruttore di orologi",
                     "terms": "orologi"
                 },
+                "craft/confectionery": {
+                    "name": "Mercato delle caramelle",
+                    "terms": "<translate with synonyms or related terms for 'Candy Maker', separated by commas>"
+                },
                 "craft/distillery": {
                     "name": "Distilleria",
                     "terms": "<translate with synonyms or related terms for 'Distillery', separated by commas>"
                     "name": "Impalcature",
                     "terms": "Costruttore di impalcature"
                 },
+                "craft/sculptor": {
+                    "name": "Scultore",
+                    "terms": "<translate with synonyms or related terms for 'Sculptor', separated by commas>"
+                },
                 "craft/shoemaker": {
                     "name": "Calzolaio",
                     "terms": "scarpe,scarpino,calzature"
                     "name": "Idrante",
                     "terms": " Pompa antincendio "
                 },
+                "emergency/life_ring": {
+                    "name": "Salvagente",
+                    "terms": "<translate with synonyms or related terms for 'Life Ring', separated by commas>"
+                },
                 "emergency/no": {
                     "name": "Nessun accesso di emergenza"
                 },
                 "emergency/private": {
                     "name": "Accesso di emergenza privato"
                 },
+                "emergency/water_tank": {
+                    "name": "Serbatoio d'emergenza per l'acqua",
+                    "terms": "<translate with synonyms or related terms for 'Emergency Water Tank', separated by commas>"
+                },
                 "emergency/yes": {
                     "name": "Accesso di emergenza"
                 },
                     "name": "Attraversamento pedonale",
                     "terms": "attraversamento pedonale,strisce pedonali,attraversamento,dosso"
                 },
+                "footway/crossing-raised": {
+                    "name": "Incrocio rialzato",
+                    "terms": "<translate with synonyms or related terms for 'Raised Street Crossing', separated by commas>"
+                },
                 "footway/crosswalk": {
                     "name": "Strisce pedonali",
                     "terms": "strisce pedonali,attraversamento"
                 },
+                "footway/crosswalk-raised": {
+                    "name": "Attraversamento pedonale rialzato",
+                    "terms": "<translate with synonyms or related terms for 'Raised Pedestrian Crosswalk', separated by commas>"
+                },
                 "footway/sidewalk": {
                     "name": "Marciapiede",
                     "terms": "marciapiedi,passeggio,salvagente,banchina"
                     "name": "Laghetto",
                     "terms": "Laghetto"
                 },
+                "healthcare": {
+                    "name": "Clinica",
+                    "terms": "<translate with synonyms or related terms for 'Healthcare Facility', separated by commas>"
+                },
+                "healthcare/alternative": {
+                    "name": "Medicina alternativa",
+                    "terms": "<translate with synonyms or related terms for 'Alternative Medicine', separated by commas>"
+                },
+                "healthcare/alternative/chiropractic": {
+                    "name": "Chiropratico",
+                    "terms": "<translate with synonyms or related terms for 'Chiropractor', separated by commas>"
+                },
+                "healthcare/audiologist": {
+                    "name": "Audiologo",
+                    "terms": "<translate with synonyms or related terms for 'Audiologist', separated by commas>"
+                },
+                "healthcare/birthing_center": {
+                    "name": "Centro nascita",
+                    "terms": "<translate with synonyms or related terms for 'Birthing Center', separated by commas>"
+                },
                 "healthcare/blood_donation": {
                     "name": "Centro trasfusionale",
                     "terms": "donatori,sangue,banca dl sangue,trasfusioni,plasmaferesi,piastrinoaferesi,donazione"
                 },
+                "healthcare/hospice": {
+                    "name": "Ospizio",
+                    "terms": "<translate with synonyms or related terms for 'Hospice', separated by commas>"
+                },
+                "healthcare/midwife": {
+                    "name": "Clinica prenatale",
+                    "terms": "<translate with synonyms or related terms for 'Midwife', separated by commas>"
+                },
+                "healthcare/occupational_therapist": {
+                    "terms": "<translate with synonyms or related terms for 'Occupational Therapist', separated by commas>"
+                },
+                "healthcare/optometrist": {
+                    "name": "Oculista",
+                    "terms": "<translate with synonyms or related terms for 'Optometrist', separated by commas>"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "Fisioterapista",
+                    "terms": "<translate with synonyms or related terms for 'Physiotherapist', separated by commas>"
+                },
+                "healthcare/podiatrist": {
+                    "name": "Podologo",
+                    "terms": "<translate with synonyms or related terms for 'Podiatrist', separated by commas>"
+                },
+                "healthcare/psychotherapist": {
+                    "name": "Psicoterapista",
+                    "terms": "ansia,consultorio,counselor,depressione,salute mentale,igiene mentale,mente,suicidio,terapista,terapia"
+                },
+                "healthcare/rehabilitation": {
+                    "name": "Centro riabilitativo",
+                    "terms": "riabilitazione,terapia,terapista"
+                },
+                "healthcare/speech_therapist": {
+                    "name": "Logopedista",
+                    "terms": "<translate with synonyms or related terms for 'Speech Therapist', separated by commas>"
+                },
                 "highway": {
                     "name": "Strada"
                 },
                     "name": "Ippovia",
                     "terms": "ippovia, percorso per cavalli, percorso equestre"
                 },
+                "highway/bus_guideway": {
+                    "name": "Binario per autobus",
+                    "terms": "<translate with synonyms or related terms for 'Bus Guideway', separated by commas>"
+                },
                 "highway/bus_stop": {
-                    "name": "Fermata dell'autobus",
-                    "terms": "Fermata Autobus"
+                    "name": "Fermata autobus / banchina"
                 },
                 "highway/corridor": {
                     "name": "Corridoio interno",
                     "name": "Attraversamento stradale",
                     "terms": "attraversamento pedonale,strisce pedonali,attraversamento,dosso"
                 },
+                "highway/crossing-raised": {
+                    "name": "Attraversamento Stradale Sopraelevato",
+                    "terms": "attraversamento pedonale,strisce pedonali,attraversamento,dosso"
+                },
                 "highway/crosswalk": {
                     "name": "Strisce pedonali",
                     "terms": "strisce pedonali,attraversamento"
                 },
+                "highway/crosswalk-raised": {
+                    "name": "Attraversamento pedonale rialzato",
+                    "terms": "<translate with synonyms or related terms for 'Raised Pedestrian Crosswalk', separated by commas>"
+                },
                 "highway/cycleway": {
                     "name": "Percorso ciclabile",
                     "terms": "Percorso ciclabile"
                     "name": "Sentiero",
                     "terms": "Sentiero"
                 },
+                "highway/pedestrian_area": {
+                    "name": "Area pedonale",
+                    "terms": "<translate with synonyms or related terms for 'Pedestrian Area', separated by commas>"
+                },
+                "highway/pedestrian_line": {
+                    "name": "Strada pedonale",
+                    "terms": "<translate with synonyms or related terms for 'Pedestrian Street', separated by commas>"
+                },
                 "highway/primary": {
                     "name": "Primaria",
                     "terms": "Primaria"
                     "name": "Bacino",
                     "terms": "Bacino"
                 },
+                "landuse/brownfield": {
+                    "name": "Area industriale dismessa",
+                    "terms": "<translate with synonyms or related terms for 'Brownfield', separated by commas>"
+                },
                 "landuse/cemetery": {
                     "name": "Cimitero",
                     "terms": "Cimitero"
                     "terms": "Foresta"
                 },
                 "landuse/garages": {
-                    "name": "Garage",
-                    "terms": "garage,rimessa,autorimessa"
+                    "name": "Area garage",
+                    "terms": "<translate with synonyms or related terms for 'Garage Landuse', separated by commas>"
                 },
                 "landuse/grass": {
                     "name": "Erba",
                     "terms": "Erba"
                 },
+                "landuse/greenfield": {
+                    "name": "Terreno edificabile",
+                    "terms": "<translate with synonyms or related terms for 'Greenfield', separated by commas>"
+                },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Serra",
+                    "terms": "serra,coltivazione,piante,orto,coltivazione,vegetali"
+                },
                 "landuse/harbour": {
                     "name": "Porto",
                     "terms": "porto,insenatura,riparo,rifugio,marittimo,fluviale"
                     "name": "Area industriale",
                     "terms": "zona industriale,zona artigianale,industria,artigianato"
                 },
+                "landuse/industrial/scrap_yard": {
+                    "name": "Sfasciacarrozze",
+                    "terms": "<translate with synonyms or related terms for 'Scrap Yard', separated by commas>"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Macello",
+                    "terms": "macello,mattatoio,abbattimento,macelleria,macellaio,gallin*,mucc*,carne,suin*,maial*,animali"
+                },
                 "landuse/landfill": {
                     "name": "Discarica",
                     "terms": "pattume,isola ecologica"
                     "name": "Campo da gioco",
                     "terms": "Campo da gioco,Campo giochi,Campo da giochi"
                 },
+                "landuse/religious": {
+                    "name": "Area religiosa",
+                    "terms": "<translate with synonyms or related terms for 'Religious Area', separated by commas>"
+                },
                 "landuse/residential": {
                     "name": "Area residenziale",
                     "terms": "residenziale,zona residenziale,case,abitazioni,alloggi"
                     "name": "Palestra a cielo aperto",
                     "terms": "Palestra a cielo aperto,Attrezzatura ginnica all'aperto"
                 },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "Trave (attrezzo ginnico)",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Balance Beam', separated by commas>"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "Scatola per salti",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Box', separated by commas>"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "Sbarra per trazioni",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Horizontal Bar', separated by commas>"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "terms": "<translate with synonyms or related terms for 'Exercise Monkey Bars', separated by commas>"
+                },
+                "leisure/fitness_station/hyperextension": {
+                    "name": "Stazione per lombari",
+                    "terms": "<translate with synonyms or related terms for 'Hyperextension Station', separated by commas>"
+                },
+                "leisure/fitness_station/parallel_bars": {
+                    "name": "Barre Parallele",
+                    "terms": "barr*,esercizi,fitness,palestra,percorso"
+                },
+                "leisure/fitness_station/push-up": {
+                    "name": "Stazione per piegamenti sulle braccia",
+                    "terms": "<translate with synonyms or related terms for 'Push-Up Station', separated by commas>"
+                },
+                "leisure/fitness_station/rings": {
+                    "name": "Anelli (attrezzo ginnico)",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Rings', separated by commas>"
+                },
+                "leisure/fitness_station/sign": {
+                    "name": "Cartello illustrativo per esercizi",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Instruction Sign', separated by commas>"
+                },
+                "leisure/fitness_station/sit-up": {
+                    "name": "Stazione per addominali",
+                    "terms": "<translate with synonyms or related terms for 'Sit-Up Station', separated by commas>"
+                },
+                "leisure/fitness_station/stairs": {
+                    "name": "Scala per esercizi",
+                    "terms": "<translate with synonyms or related terms for 'Exercise Stairs', separated by commas>"
+                },
                 "leisure/garden": {
                     "name": "Giardino",
                     "terms": "Giardino"
                     "name": "Campo da Golf",
                     "terms": "Campo da golf"
                 },
+                "leisure/hackerspace": {
+                    "terms": "<translate with synonyms or related terms for 'Hackerspace', separated by commas>"
+                },
                 "leisure/horse_riding": {
                     "name": "Centro equestre",
                     "terms": "cavall*,equestre,circolo,ippica,club"
                     "name": "Campo di beach volley",
                     "terms": "pallavolo,pista,palla,volley,campetto"
                 },
+                "leisure/pitch/boules": {
+                    "name": "Campo da bocce",
+                    "terms": "<translate with synonyms or related terms for 'Boules/Bocce Court', separated by commas>"
+                },
                 "leisure/pitch/bowls": {
                     "name": "Campo da bocce",
                     "terms": "Campo da bocce"
                     "name": "Pista (Atletica)",
                     "terms": "atletica,tartan,pista"
                 },
+                "leisure/sauna": {
+                    "name": "Sauna",
+                    "terms": "<translate with synonyms or related terms for 'Sauna', separated by commas>"
+                },
                 "leisure/slipway": {
                     "name": "Scivolo per barche",
                     "terms": "Rampa per la messa in acqua di imbarcazioni"
                     "name": "Ciminiera",
                     "terms": "torre,camino"
                 },
+                "man_made/crane": {
+                    "name": "Gru",
+                    "terms": "<translate with synonyms or related terms for 'Crane', separated by commas>"
+                },
                 "man_made/cutline": {
                     "name": "Linea di demarcazione",
                     "terms": "Linea di taglio"
                     "name": "Palo",
                     "terms": "albero,torre,comunicazione,radio,cellulari,antenna,trasmissioni,tv,televisione,telefoni"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Stazione di controllo",
+                    "terms": "<translate with synonyms or related terms for 'Monitoring Station', separated by commas>"
+                },
                 "man_made/observation": {
                     "name": "Torre di osservazione",
                     "terms": "torre,osservazione,osservatorio,piattaforma,osservativa,antincendio,panorama"
                     "name": "Impianto Idrico",
                     "terms": " Impianto idrico "
                 },
+                "man_made/watermill": {
+                    "name": "Mulino ad acqua",
+                    "terms": "<translate with synonyms or related terms for 'Watermill', separated by commas>"
+                },
+                "man_made/windmill": {
+                    "name": "Mulino a vento",
+                    "terms": "<translate with synonyms or related terms for 'Windmill', separated by commas>"
+                },
                 "man_made/works": {
                     "name": "Fabbrica",
                     "terms": "industria,manifattura,officina,opificio,stabilimento,laboratorio"
                 },
+                "manhole": {
+                    "name": "Tombino",
+                    "terms": "<translate with synonyms or related terms for 'Manhole', separated by commas>"
+                },
+                "manhole/drain": {
+                    "name": "Tombino",
+                    "terms": "<translate with synonyms or related terms for 'Storm Drain', separated by commas>"
+                },
+                "manhole/telecom": {
+                    "name": "Tombino per telecominicazioni",
+                    "terms": "<translate with synonyms or related terms for 'Telecom Manhole', separated by commas>"
+                },
                 "natural": {
                     "name": "Naturale",
                     "terms": "Elemento naturale"
                     "name": "Uffici",
                     "terms": "Ufficio"
                 },
+                "office/accountant": {
+                    "name": "Commercialista",
+                    "terms": "<translate with synonyms or related terms for 'Accountant Office', separated by commas>"
+                },
                 "office/administrative": {
-                    "name": "Autorità locale",
-                    "terms": "Ufficio amministrativo,amministrazione,autorità locale,supervisione,comune"
+                    "name": "Autorità locale"
+                },
+                "office/adoption_agency": {
+                    "name": "Agenzia per adozioni",
+                    "terms": "<translate with synonyms or related terms for 'Adoption Agency', separated by commas>"
+                },
+                "office/advertising_agency": {
+                    "name": "Agenzia pubblicitaria",
+                    "terms": "<translate with synonyms or related terms for 'Advertising Agency', separated by commas>"
+                },
+                "office/architect": {
+                    "name": "Studio di architettura",
+                    "terms": "<translate with synonyms or related terms for 'Architect Office', separated by commas>"
+                },
+                "office/association": {
+                    "name": "Ufficio associazione senza scopo di lucro",
+                    "terms": "<translate with synonyms or related terms for 'Nonprofit Organization Office', separated by commas>"
+                },
+                "office/charity": {
+                    "name": "Organizzazione benefica",
+                    "terms": "<translate with synonyms or related terms for 'Charity Office', separated by commas>"
                 },
                 "office/company": {
                     "name": "Ufficio aziendale",
-                    "terms": "Ufficio"
+                    "terms": "<translate with synonyms or related terms for 'Corporate Office', separated by commas>"
                 },
                 "office/coworking": {
                     "name": "Ufficio in Coworking",
                     "name": "Agenzia per l'impiego",
                     "terms": "interinale,impiego,lavoro,ufficio per l'impiego,ufficio interinale"
                 },
+                "office/energy_supplier": {
+                    "name": "Ufficio azienda fornitrice di energia",
+                    "terms": "<translate with synonyms or related terms for 'Energy Supplier Office', separated by commas>"
+                },
                 "office/estate_agent": {
                     "name": "Agente Immobiliare",
                     "terms": "agenzia immobiliare,immobiliare"
                     "name": "Ufficio Finanziario",
                     "terms": "finanza,finanziaria,fiduciaria,mag"
                 },
+                "office/forestry": {
+                    "terms": "<translate with synonyms or related terms for 'Forestry Office', separated by commas>"
+                },
+                "office/foundation": {
+                    "name": "Fondazione",
+                    "terms": "<translate with synonyms or related terms for 'Foundation Office', separated by commas>"
+                },
                 "office/government": {
                     "name": "Ufficio governativo",
                     "terms": "sede,dipartimento,governo,comune,provincia,regione,procura,provveditorato,pretura"
                     "name": "Anagrafe",
                     "terms": "anagrafe,comune,archivio di stato"
                 },
+                "office/government/tax": {
+                    "name": "Agenzia delle entrate",
+                    "terms": "<translate with synonyms or related terms for 'Tax and Revenue Office', separated by commas>"
+                },
+                "office/guide": {
+                    "name": "Ufficio guide turistiche",
+                    "terms": "<translate with synonyms or related terms for 'Tour Guide Office', separated by commas>"
+                },
                 "office/insurance": {
                     "name": "Assicurazione",
                     "terms": "assicurativo,sinistri,polizza assicurativa"
                 },
+                "office/it": {
+                    "name": "Ufficio società IT",
+                    "terms": "<translate with synonyms or related terms for 'Information Technology Office', separated by commas>"
+                },
                 "office/lawyer": {
                     "name": "Studio legale",
                     "terms": "ufficio legale,legale,avvocato,avvocatura,magistrato,difensore,azzeccagarbugli"
                 },
                 "office/lawyer/notary": {
-                    "name": "Ufficio notarile",
-                    "terms": "firma,notaio,stato,burocrazia"
+                    "name": "Ufficio notarile"
+                },
+                "office/moving_company": {
+                    "name": "Ufficio compagnia di traslochi",
+                    "terms": "<translate with synonyms or related terms for 'Moving Company Office', separated by commas>"
+                },
+                "office/newspaper": {
+                    "name": "Ufficio giornalistico",
+                    "terms": "<translate with synonyms or related terms for 'Newspaper Office', separated by commas>"
                 },
                 "office/ngo": {
                     "name": "Organizzazione non governativa",
                     "terms": "ong,ngo,onu,associazione,non profit,nonprofit,no profit,onlus,non lucrativa,senza fini di lucro,cooperativa,cooperazione"
                 },
+                "office/notary": {
+                    "name": "Ufficio notarile",
+                    "terms": "<translate with synonyms or related terms for 'Notary Office', separated by commas>"
+                },
                 "office/physician": {
                     "name": "Medico"
                 },
                     "name": "Sede di partito",
                     "terms": "circolo,partito,politica,sezione"
                 },
+                "office/private_investigator": {
+                    "name": "Ufficio agenzia investigativa privata",
+                    "terms": "<translate with synonyms or related terms for 'Private Investigator Office', separated by commas>"
+                },
+                "office/quango": {
+                    "terms": "<translate with synonyms or related terms for 'Quasi-NGO Office', separated by commas>"
+                },
                 "office/research": {
                     "name": "Istituto di Ricerca",
                     "terms": "Ufficio ricerca,Ufficio di ricerca"
                 },
+                "office/surveyor": {
+                    "name": "Ufficio di supervisione",
+                    "terms": "<translate with synonyms or related terms for 'Surveyor Office', separated by commas>"
+                },
+                "office/tax_advisor": {
+                    "name": "Centro assistenza fiscale",
+                    "terms": "<translate with synonyms or related terms for 'Tax Advisor Office', separated by commas>"
+                },
                 "office/telecommunication": {
                     "name": "Ufficio di telecomunicazioni",
                     "terms": "telecomunicazioni,telefonia"
                 },
+                "office/therapist": {
+                    "name": "Studio psichiatrico",
+                    "terms": "<translate with synonyms or related terms for 'Therapist Office', separated by commas>"
+                },
                 "office/travel_agent": {
                     "name": "Agenzia di viaggi"
                 },
+                "office/water_utility": {
+                    "name": "Ufficio azienda di fornitura dell'acqua",
+                    "terms": "<translate with synonyms or related terms for 'Water Utility Office', separated by commas>"
+                },
                 "piste": {
                     "name": "Piste da sci",
                     "terms": "pista da sci,sci,impianto sciistico,impianto"
                     "name": "Isola",
                     "terms": "arcipelago,atollo,banco,isola,isolotto,scoglio"
                 },
+                "place/islet": {
+                    "name": "Isoletta",
+                    "terms": "<translate with synonyms or related terms for 'Islet', separated by commas>"
+                },
                 "place/isolated_dwelling": {
                     "name": "Case Sparse",
                     "terms": " Insediamento rurale isolato "
                     "name": "Vicinanze",
                     "terms": "Quartiere,Zona"
                 },
+                "place/plot": {
+                    "terms": "<translate with synonyms or related terms for 'Plot', separated by commas>"
+                },
                 "place/quarter": {
                     "name": "Sotto-distretto / Quartiere",
                     "terms": "<translate with synonyms or related terms for 'Sub-Borough / Quarter', separated by commas>"
                     "name": "Villaggio",
                     "terms": "Frazione"
                 },
+                "playground/balance_beam": {
+                    "name": "Trave",
+                    "terms": "<translate with synonyms or related terms for 'Play Balance Beam', separated by commas>"
+                },
+                "playground/basket_spinner": {
+                    "terms": "<translate with synonyms or related terms for 'Basket Spinner', separated by commas>"
+                },
+                "playground/basket_swing": {
+                    "name": "Altalena a cesto",
+                    "terms": "<translate with synonyms or related terms for 'Basket Swing', separated by commas>"
+                },
+                "playground/climbing_frame": {
+                    "name": "Struttura da arrampicata",
+                    "terms": "<translate with synonyms or related terms for 'Climbing Frame', separated by commas>"
+                },
+                "playground/cushion": {
+                    "name": "Materasso gonfiato",
+                    "terms": "<translate with synonyms or related terms for 'Bouncy Cushion', separated by commas>"
+                },
+                "playground/horizontal_bar": {
+                    "terms": "<translate with synonyms or related terms for 'Play Horizontal Bar', separated by commas>"
+                },
+                "playground/rocker": {
+                    "name": "Gioco a molla",
+                    "terms": "<translate with synonyms or related terms for 'Spring Rider', separated by commas>"
+                },
+                "playground/roundabout": {
+                    "name": "Girello",
+                    "terms": "<translate with synonyms or related terms for 'Play Roundabout', separated by commas>"
+                },
+                "playground/sandpit": {
+                    "name": "Buca di sabbia",
+                    "terms": "<translate with synonyms or related terms for 'Sandpit', separated by commas>"
+                },
+                "playground/seesaw": {
+                    "name": "Altalena a dondolo",
+                    "terms": "<translate with synonyms or related terms for 'Seesaw', separated by commas>"
+                },
+                "playground/slide": {
+                    "name": "Scivolo",
+                    "terms": "<translate with synonyms or related terms for 'Slide', separated by commas>"
+                },
+                "playground/structure": {
+                    "name": "Struttura da gioco",
+                    "terms": "<translate with synonyms or related terms for 'Play Structure', separated by commas>"
+                },
+                "playground/swing": {
+                    "name": "Altalena",
+                    "terms": "<translate with synonyms or related terms for 'Swing', separated by commas>"
+                },
+                "playground/zipwire": {
+                    "name": "Teleferica",
+                    "terms": "<translate with synonyms or related terms for 'Zip Wire', separated by commas>"
+                },
                 "point": {
                     "name": "Punto",
                     "terms": "Punto"
                     "name": "Generatore di energia",
                     "terms": " Centrale elettrica "
                 },
+                "power/generator/source_nuclear": {
+                    "name": "Reattore nucleare",
+                    "terms": "<translate with synonyms or related terms for 'Nuclear Reactor', separated by commas>"
+                },
+                "power/generator/source_wind": {
+                    "name": "Turbina eolica",
+                    "terms": "<translate with synonyms or related terms for 'Wind Turbine', separated by commas>"
+                },
                 "power/line": {
                     "name": "Linea elettrica",
                     "terms": "Elettrodotto"
                     "name": "Sottostazione",
                     "terms": "Sottostazione"
                 },
+                "power/switch": {
+                    "terms": "<translate with synonyms or related terms for 'Power Switch', separated by commas>"
+                },
                 "power/tower": {
                     "name": "Traliccio ad alta tensione",
                     "terms": "Torre ad alta tensione"
                     "name": "Trasformatore",
                     "terms": "Trasformatore"
                 },
+                "public_transport/linear_platform": {
+                    "terms": "<translate with synonyms or related terms for 'Transit Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Fermata / banchina del trasporto a fune",
+                    "terms": "<translate with synonyms or related terms for 'Aerialway Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Fermata / banchina dell'autobus",
+                    "terms": "<translate with synonyms or related terms for 'Bus Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Fermata / banchina del traghetto",
+                    "terms": "<translate with synonyms or related terms for 'Ferry Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Fermata / banchina della metropolitana di superficie",
+                    "terms": "<translate with synonyms or related terms for 'Light Rail Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Fermata / banchina della monorotaia",
+                    "terms": "<translate with synonyms or related terms for 'Monorail Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Fermata / banchina della metropolitana",
+                    "terms": "<translate with synonyms or related terms for 'Subway Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Fermata / banchina del treno",
+                    "terms": "<translate with synonyms or related terms for 'Train Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Fermata / banchina del tram",
+                    "terms": "<translate with synonyms or related terms for 'Tram Stop / Platform', separated by commas>"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "terms": "<translate with synonyms or related terms for 'Trolleybus Stop / Platform', separated by commas>"
+                },
                 "public_transport/platform": {
-                    "name": "Banchina",
-                    "terms": "binario,fermata,stazione,pensilina,platform"
+                    "terms": "<translate with synonyms or related terms for 'Transit Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Fermata / banchina del trasporto a fune",
+                    "terms": "<translate with synonyms or related terms for 'Aerialway Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Fermata / banchina dell'autobus",
+                    "terms": "<translate with synonyms or related terms for 'Bus Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Fermata / banchina del traghetto",
+                    "terms": "<translate with synonyms or related terms for 'Ferry Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Fermata / banchina della metropolitana di superficie",
+                    "terms": "<translate with synonyms or related terms for 'Light Rail Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Fermata / banchina della monorotaia",
+                    "terms": "<translate with synonyms or related terms for 'Monorail Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Fermata / banchina della metropolitana",
+                    "terms": "<translate with synonyms or related terms for 'Subway Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_train": {
+                    "name": "Fermata / banchina del treno",
+                    "terms": "<translate with synonyms or related terms for 'Train Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Fermata / banchina del tram",
+                    "terms": "<translate with synonyms or related terms for 'Tram Stop / Platform', separated by commas>"
+                },
+                "public_transport/platform_trolleybus": {
+                    "terms": "<translate with synonyms or related terms for 'Trolleybus Stop / Platform', separated by commas>"
+                },
+                "public_transport/station": {
+                    "terms": "<translate with synonyms or related terms for 'Transit Station', separated by commas>"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Stazione di trasporto a fune",
+                    "terms": "<translate with synonyms or related terms for 'Aerialway Station', separated by commas>"
+                },
+                "public_transport/station_bus": {
+                    "name": "Stazione /Terminal degli autobus",
+                    "terms": "<translate with synonyms or related terms for 'Bus Station / Terminal', separated by commas>"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Stazione / Terminal dei traghetti",
+                    "terms": "<translate with synonyms or related terms for 'Ferry Station / Terminal', separated by commas>"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Stazione del tram",
+                    "terms": "<translate with synonyms or related terms for 'Light Rail Station', separated by commas>"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Stazione della monorotaia",
+                    "terms": "<translate with synonyms or related terms for 'Monorail Station', separated by commas>"
+                },
+                "public_transport/station_subway": {
+                    "name": "Stazione metropolitana",
+                    "terms": "<translate with synonyms or related terms for 'Subway Station', separated by commas>"
+                },
+                "public_transport/station_train": {
+                    "name": "Stazione treno",
+                    "terms": "<translate with synonyms or related terms for 'Train Station', separated by commas>"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Fermata del treno a richiesta",
+                    "terms": "<translate with synonyms or related terms for 'Train Station (Halt / Request)', separated by commas>"
+                },
+                "public_transport/station_tram": {
+                    "name": "Stazione tram",
+                    "terms": "<translate with synonyms or related terms for 'Tram Station', separated by commas>"
+                },
+                "public_transport/station_trolleybus": {
+                    "terms": "<translate with synonyms or related terms for 'Trolleybus Station / Terminal', separated by commas>"
+                },
+                "public_transport/stop_area": {
+                    "terms": "<translate with synonyms or related terms for 'Transit Stop Area', separated by commas>"
                 },
                 "public_transport/stop_position": {
-                    "name": "Fermata",
-                    "terms": "stop,stazione,pensilina"
+                    "terms": "<translate with synonyms or related terms for 'Transit Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "terms": "<translate with synonyms or related terms for 'Aerialway Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Fermata autobus",
+                    "terms": "<translate with synonyms or related terms for 'Bus Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Fermata battello",
+                    "terms": "<translate with synonyms or related terms for 'Ferry Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "terms": "<translate with synonyms or related terms for 'Light Rail Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_monorail": {
+                    "terms": "<translate with synonyms or related terms for 'Monorail Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_subway": {
+                    "terms": "<translate with synonyms or related terms for 'Subway Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Posizione fermata del treno ",
+                    "terms": "<translate with synonyms or related terms for 'Train Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_tram": {
+                    "terms": "<translate with synonyms or related terms for 'Tram Stopping Location', separated by commas>"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "terms": "<translate with synonyms or related terms for 'Trolleybus Stopping Location', separated by commas>"
                 },
                 "railway": {
                     "name": "Ferrovia"
                     "name": "Ferrovia abbandonata",
                     "terms": "Ferrovia abbandonata"
                 },
+                "railway/buffer_stop": {
+                    "terms": "<translate with synonyms or related terms for 'Buffer Stop', separated by commas>"
+                },
                 "railway/crossing": {
                     "name": "Passaggio a livello (sentiero)",
                     "terms": "passaggio a livello,incrocio ferroviario,attraversamento pedonale"
                 },
+                "railway/derail": {
+                    "name": "Deragliatore ferroviario",
+                    "terms": "deragliatore,scambio,aghi a terra"
+                },
                 "railway/disused": {
                     "name": "Ferrovia in disuso",
                     "terms": "Ferrovia di disuso"
                     "terms": "funicolare,treno,trenino"
                 },
                 "railway/halt": {
-                    "name": "Fermata ferroviaria",
-                    "terms": "Fermata ferroviaria,fermata,stazione,stazione non custodita,fermata a richiesta"
+                    "name": "Fermata a richiesta"
                 },
                 "railway/level_crossing": {
                     "name": "Passaggio a livello (strada)",
                     "terms": "passaggio a livello,incrocio ferroviario,attraversamento"
                 },
+                "railway/light_rail": {
+                    "name": "Tram",
+                    "terms": "<translate with synonyms or related terms for 'Light Rail', separated by commas>"
+                },
+                "railway/milestone": {
+                    "name": "Pietra miliare ferroviaria",
+                    "terms": "pietra,miliare,marcatore"
+                },
+                "railway/miniature": {
+                    "name": "Ferrovia in miniatura",
+                    "terms": "<translate with synonyms or related terms for 'Miniature Railway', separated by commas>"
+                },
                 "railway/monorail": {
                     "name": "Monorotaia",
                     "terms": "Monorotaia"
                     "terms": "scartamento ridotto"
                 },
                 "railway/platform": {
-                    "name": "Piattaforma della stazione ferroviaria",
-                    "terms": "Piattafirna ferroviaria"
+                    "name": "Banchina"
                 },
                 "railway/rail": {
                     "name": "Ferrovia",
                     "terms": "Ferrovia"
                 },
+                "railway/signal": {
+                    "name": "Segnale ferroviario",
+                    "terms": "segnale,semaforo,luci"
+                },
                 "railway/station": {
-                    "name": "Stazione ferroviaria",
-                    "terms": "Stazione ferroviaria"
+                    "name": "Stazione"
                 },
                 "railway/subway": {
                     "name": "Metropolitana",
                     "name": "Entrata di metropolitana",
                     "terms": "Entrata metropolitana"
                 },
+                "railway/switch": {
+                    "name": "Scambio ferroviario",
+                    "terms": "scambio,cambio,ferrovia"
+                },
+                "railway/train_wash": {
+                    "name": "Lavaggio treni",
+                    "terms": "<translate with synonyms or related terms for 'Train Wash', separated by commas>"
+                },
                 "railway/tram": {
                     "name": "Tram",
                     "terms": "tram,rotaia,trasporto pubblico"
                 },
                 "railway/tram_stop": {
-                    "name": "Fermata del tram",
-                    "terms": "tram,metropolitana,superficie"
+                    "name": "Fermata del tram"
                 },
                 "relation": {
                     "name": "Relazione",
                     "name": "Negozio",
                     "terms": "Negozio"
                 },
+                "shop/agrarian": {
+                    "name": "Negozio di articoli agricoli",
+                    "terms": "<translate with synonyms or related terms for 'Agriculture Shop', separated by commas>"
+                },
                 "shop/alcohol": {
                     "name": "Negozio di liquori",
                     "terms": "alcool,liquori,grappa,rum,vodka"
                     "terms": "Gioielleria"
                 },
                 "shop/kiosk": {
-                    "name": "Edicola",
-                    "terms": "chiosco,edicola"
+                    "name": "Chiosco",
+                    "terms": "<translate with synonyms or related terms for 'Kiosk', separated by commas>"
                 },
                 "shop/kitchen": {
                     "name": "Negozio di cucine",
                     "name": "Rivenditore di Biglietti",
                     "terms": "bilglietti,biglietteria"
                 },
+                "shop/tiles": {
+                    "name": "Negozio di piastrelle",
+                    "terms": "<translate with synonyms or related terms for 'Tile Shop', separated by commas>"
+                },
                 "shop/tobacco": {
                     "name": "Tabacchino",
                     "terms": "Tabaccheria"
                     "name": "Negozio di giocattoli",
                     "terms": "Negozio giocattoli"
                 },
+                "shop/trade": {
+                    "terms": "<translate with synonyms or related terms for 'Trade Shop', separated by commas>"
+                },
                 "shop/travel_agency": {
                     "name": "Agenzia di viaggi",
                     "terms": "Agenzia di viaggi"
                     "name": "Sosta per camper",
                     "terms": "Parco camper"
                 },
+                "tourism/chalet": {
+                    "name": "Chalet",
+                    "terms": " Casetta (chalet),cottage,vacanze"
+                },
                 "tourism/gallery": {
                     "name": "Galleria d'arte",
                     "terms": "opere d'arte,quadri,sculture,galleria,fotografie,dipinti,art*"
                     "name": "Punto panoramico",
                     "terms": " Punto panoramico "
                 },
+                "tourism/wilderness_hut": {
+                    "name": "Bivacco",
+                    "terms": "<translate with synonyms or related terms for 'Wilderness Hut', separated by commas>"
+                },
                 "tourism/zoo": {
                     "name": "Zoo",
                     "terms": "Zoo"
                     "name": "Rallentatore acustico",
                     "terms": "dosso acustico,bande acustiche,bande rumorose"
                 },
+                "traffic_calming/table": {
+                    "name": "Dosso",
+                    "terms": "<translate with synonyms or related terms for 'Speed Table', separated by commas>"
+                },
                 "type/boundary": {
                     "name": "Confine",
                     "terms": "Confine"
                     "name": "Ippovia",
                     "terms": "cavallo,strada,ippica,sentiero,equitazione"
                 },
+                "type/route/light_rail": {
+                    "name": "Linea tramviaria",
+                    "terms": "<translate with synonyms or related terms for 'Light Rail Route', separated by commas>"
+                },
                 "type/route/pipeline": {
                     "name": "Condotta",
                     "terms": "Itinerario conduttura"
                 },
+                "type/route/piste": {
+                    "name": "Pista da sci",
+                    "terms": "<translate with synonyms or related terms for 'Piste/Ski Route', separated by commas>"
+                },
                 "type/route/power": {
                     "name": "Linea elettrica",
                     "terms": "Ininerario elettricità"
                     "name": "Percorso stradale",
                     "terms": "Itinerario stradale"
                 },
+                "type/route/subway": {
+                    "name": "Linea metropolitana",
+                    "terms": "<translate with synonyms or related terms for 'Subway Route', separated by commas>"
+                },
                 "type/route/train": {
                     "name": "Linea ferroviaria",
                     "terms": "Itinerario treno"
                     "name": "Luogo",
                     "terms": "area,zona,sito,posto"
                 },
+                "type/waterway": {
+                    "name": "Corso d'acqua",
+                    "terms": " Corso d’acqua,via d'acqua,canale,fiume"
+                },
                 "vertex": {
                     "name": "Altro",
                     "terms": "Altro"
                     "name": "Torrente",
                     "terms": "fiumiciattolo,ramo,ruscello,corso,torrente,corrente,deriva,flusso,rivolo,rigagnolo"
                 },
+                "waterway/stream_intermittent": {
+                    "name": "Torrente intermittente",
+                    "terms": "fiumiciattolo,ramo,ruscello,corso,torrente,corrente,deriva,flusso,rivolo,rigagnolo,intermittente,stagionale"
+                },
                 "waterway/water_point": {
                     "name": "Acqua potabile per barche",
                     "terms": "colonnina,acqua,barca,nave"
                 "description": "Immagini satellitari Premium DigitalGlobe.",
                 "name": "Immagini DigitalGlobe Premium"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Termini & Feedback"
+                },
+                "description": "Immagini dei confini e data di riferimento. Le etichette vengono mostrate a livelli di zoom maggiori o uguali a 14.",
+                "name": "DigitalGlobe Premium Imagery Vintage"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Termini & Feedback"
                 "description": "Immagini satellitari Standard DigitalGlobe.",
                 "name": "Immagini DigitalGlobe Standard"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Termini & Feedback"
+                },
+                "description": "Immagini dei confini e data di riferimento. Le etichette vengono mostrate a livelli di zoom maggiori o uguali a 14.",
+                "name": "DigitalGlobe Standard Imagery Vintage"
+            },
+            "EsriWorldImagery": {
+                "attribution": {
+                    "text": "Termini & Feedback"
+                },
+                "description": "Esri world imagery.",
+                "name": "Esri world imagery"
+            },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "Termini & Feedback"
+                },
+                "description": "Le immagini ESRI potrebbero essere migliori e più precise di quelle impostate di default.",
+                "name": "Esri World Imagery (Clarity) Beta"
+            },
             "MAPNIK": {
                 "attribution": {
                     "text": "© OpenStreetMap contributors, CC-BY-SA"
                 },
                 "name": "OSM Inspector: Etichette"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "A livelli di zoom maggiori di 16, dati in pubblico dominio di US Census. A zoom minori solo cambiamenti a partire dal 2006 meno le modifiche già incorporate in OpenStreetMap",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Giallo = Dati pubblici forniti da enti statali Statunitensi.",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, collaboratori OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Ciclismo"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, collaboratori OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Escursioni a piedi"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, collaboratori OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Mountain bike"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, collaboratori OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Pattinaggio in linea"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, collaboratori OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Piste per sport invernali"
             },
+            "basemap.at": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "Basemap of Austria, basati su dati governativi.",
+                "name": "basemap.at"
+            },
+            "basemap.at-orthofoto": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "Immagini satellitari fornite da basemap.at, successore di geoimage.at",
+                "name": "Immagini satellitari basemap.at"
+            },
             "hike_n_bike": {
                 "attribution": {
                     "text": "© OpenStreetMap contributors"
index ffadcfdd7d79721c10ea729abee41cd47441af88..f6f78a2a6621297a63ce5fe87f744f409d4075c9 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "クリックすると、ラインへノードを追加することが可能です。別のラインをクリックすることで、ライン同士を接続することができます。ラインの描画を完了させるには、描画を終了させたい地点でダブルクリックしてください。"
+            },
+            "drag_node": {
+                "connected_to_hidden": "表示されていない地物に接続しているので編集できません。"
             }
         },
         "operations": {
             "connect": {
                 "annotation": {
                     "point": "ウェイをポイントに接続",
-                    "vertex": "ã\82¦ã\82§ã\82¤ã\82\92ä»\96ã\81®ã\82¦ã\82§ã\82¤ã\83\88接続",
+                    "vertex": "ã\82¦ã\82§ã\82¤ã\82\92ä»\96ã\81®ã\82¦ã\82§ã\82¤ã\81¨接続",
                     "line": "ウェイとラインを接続",
                     "area": "ウェイとエリアを接続"
                 }
             "localized_translation_language": "言語選択",
             "localized_translation_name": "名称"
         },
+        "zoom_in_edit": "ズームして編集",
         "login": "ログイン",
         "logout": "ログアウト",
         "loading_auth": "OpenStreetMapへ接続中...",
             "modified": "変更した地物",
             "deleted": "削除した地物",
             "created": "作成した地物",
-            "about_changeset_comments": "変更セットのコメントについて",
+            "about_changeset_comments": "変更セットの良いコメントについて",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "コメントの中で Google に触れていますが、 Google マップからのコピーは絶対に禁止です。",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "{users} による編集",
                 "key": "B",
                 "title": "背景",
                 "zoom": "ズーム",
+                "vintage": "撮影日",
+                "source": "情報源",
+                "description": "説明",
+                "resolution": "解像度",
+                "accuracy": "精度",
+                "unknown": "不明",
                 "show_tiles": "タイルを表示",
-                "hide_tiles": "タイルを非表示"
+                "hide_tiles": "タイルを非表示",
+                "show_vintage": "撮影日を表示",
+                "hide_vintage": "撮影日を非表示"
             },
             "history": {
                 "key": "H",
                 "title": "編集履歴",
                 "selected": "{n} 個を選択中",
                 "version": "バージョン",
-                "changeset": "変更セット"
+                "last_edit": "最新の編集",
+                "edited_by": "編集者",
+                "changeset": "変更セット",
+                "unknown": "不明",
+                "link_text": "openstreetmap.org上の履歴"
             },
             "location": {
-                "key": "L"
+                "key": "L",
+                "title": "位置",
+                "unknown_location": "不明な位置"
             },
             "measurement": {
                 "key": "M",
+                "title": "計測",
                 "selected": "{n} 個を選択中",
+                "geometry": "ジオメトリ",
+                "closed_line": "クローズドライン",
+                "closed_area": "クローズドエリア",
+                "center": "中心",
+                "perimeter": "周囲",
                 "length": "長さ",
-                "area": "エリア"
+                "area": "エリア",
+                "centroid": "重心",
+                "location": "位置",
+                "metric": "メートル法",
+                "imperial": "ヤード・ポンド法",
+                "node_count": "ノード数"
             }
         },
         "geometry": {
             "add_fields": "項目追加: "
         },
         "background": {
-            "title": "背景画像",
-            "description": "背景画像設定",
-            "percent_brightness": "明度 {opacity}%",
+            "title": "背景設定",
+            "description": "背景設定",
+            "key": "B",
+            "backgrounds": "背景画像の切替",
             "none": "なし",
             "best_imagery": "表示中の場所に最適な航空写真",
             "switch": "背景に切り替え",
             "custom": "カスタム",
-            "custom_button": "カスタム背景の編集",
-            "fix_misalignment": "画像の位置を調整",
-            "imagery_source_faq": "この写真の出典元",
+            "custom_button": "カスタム背景の設定",
+            "custom_prompt": "URLテンプレートを入力。正しい形式:\n   - {zoom} または {z}, {x}, {y} (Z/X/Y タイルスキーム)\n   - {-y} または {ty} (flipped TMS-style Y coordinates)\n   - {u} (quadtileスキーム)\n   - {switch:a,b,c} (DNS server multiplexing)\n\nサンプル:\n{example}",
+            "overlays": "オーバーレイの選択",
+            "imagery_source_faq": "画像の情報 / 問題を報告",
             "reset": "設定リセット",
-            "offset": "画像の位置を調整するには、灰色のエリアのどこかをドラッグするか、ずれ幅をメートル単位で入力するかしてください。",
+            "display_options": "背景画質の調整",
+            "brightness": "明るさ",
+            "contrast": "コントラスト",
+            "saturation": "色合い",
+            "sharpness": "シャープさ",
             "minimap": {
-                "description": "ミニマップ",
-                "tooltip": "現在表示中の周辺をズームアウトして表示"
-            }
+                "description": "ミニマップを表示",
+                "tooltip": "現在表示中の周辺をズームアウトして表示",
+                "key": "/"
+            },
+            "fix_misalignment": "背景位置の調整",
+            "offset": "画像の位置を調整するには、灰色のエリアのどこかをドラッグするか、ずれ幅をメートル単位で入力するかしてください。"
         },
         "map_data": {
-            "title": "地図データ",
-            "description": "地図データ",
-            "data_layers": "データレイヤ",
-            "fill_area": "エリアを塗りつぶし",
-            "map_features": "タグ定義一覧",
-            "autohidden": "表示対象となっている地物の数が多すぎます。ズームインしてから編集を行ってください。"
+            "title": "地図データ設定",
+            "description": "地図データ設定",
+            "key": "F",
+            "data_layers": "データレイヤの選択",
+            "layers": {
+                "osm": {
+                    "tooltip": "Map data from OpenStreetMap",
+                    "title": "OpenStreetMap data"
+                }
+            },
+            "fill_area": "エリアの塗りつぶし有無",
+            "map_features": "表示対象地物の選択",
+            "autohidden": "表示対象となっている地物の数が多すぎます。ズームインしてから編集を行ってください。",
+            "osmhidden": "OpenStreetMapレイヤが非表示のため、これらの地物は自動的に非表示となっています。"
         },
         "feature": {
             "points": {
         "area_fill": {
             "wireframe": {
                 "description": "塗りつぶしなし (ワイヤフレーム)",
-                "tooltip": "ワイヤフレームモードを有効化することで、背景画像の視認性が高まります"
+                "tooltip": "ワイヤフレームモードを有効化することで、背景画像の視認性が高まります",
+                "key": "W"
             },
             "partial": {
                 "description": "部分的に塗りつぶし",
         },
         "restore": {
             "heading": "OSMにアップロードされていない編集内容があります",
-            "description": "前回作業した編集内容がアップロードされていません。編集内容を復元しますか?"
+            "description": "前回作業した編集内容がアップロードされていません。編集内容を復元しますか?",
+            "restore": "変更を復元",
+            "reset": "変更を破棄"
         },
         "save": {
             "title": "保存",
             "status_code": "サーバが状態コード{code}を返しました",
             "unknown_error_details": "インターネットに接続されているか、確認してください。",
             "uploading": "OpenStreetMapへ変更をアップロード中...",
+            "conflict_progress": "競合チェック中: {num} / {total}",
             "unsaved_changes": "編集内容が保存されていません",
             "conflict": {
                 "header": "競合している編集を解決",
                 "keep_remote": "他の変更を採用",
                 "restore": "復元",
                 "delete": "削除したままにする",
+                "download_changes": "またはosmChangeファイルをダウンロード",
                 "done": "すべての競合が解決されました。",
                 "help": "あなたが変更した地物を他のユーザーも変更しました。\n競合についての詳細は、以下のそれぞれの地物をクリックし、あなたの変更と\n他のユーザーの変更のどちらを残したいか選択して下さい。\n"
             }
         "splash": {
             "welcome": "iD 起動中",
             "text": "iDは、世界でもっとも優れた自由な世界地図を編集するためのツールで、馴染みやすく、かつ高機能です。現在のバージョンは {version} です。詳細は {website} で公開中です。バグ報告は {github} で受け付けています。",
-            "walkthrough": "チュートリアルを開始"
+            "walkthrough": "チュートリアルを開始",
+            "start": "直ちに編集"
         },
         "source_switch": {
             "live": "本番サーバ",
             "untagged_area_tooltip": "このエリアが表す地物の種類を選択してください。",
             "untagged_relation": "タグの無いリレーション",
             "untagged_relation_tooltip": "このリレーションを表す地物の種別を選んでください。",
-            "many_deletions": "あなたは{n}件の地物を削除しようとしています。本当に実行して宜しいですか?他の人からも見える地図から削除することになります。",
+            "many_deletions": "あなたは計{n}件の地物を削除しようとしています:{p}ノード, {l}ライン, {a}エリア, {r}リレーション。本当に削除しますか?この操作でみんながopenstreetmap.org上で見ているマップから削除されます。",
             "tag_suggests_area": "ラインに {tag} タグが付与されています。エリアで描かれるべきです",
             "deprecated_tags": "タグの重複: {tags}"
         },
+        "zoom": {
+            "in": "ズームイン",
+            "out": "ズームアウト"
+        },
         "cannot_zoom": "現在のモードでは、これ以上ズームアウトできません。",
         "full_screen": "フルスクリーンにする",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "この画像をMapillaryで表示"
         },
+        "openstreetcam_images": {
+            "tooltip": "OpenStreetCamの街路写真",
+            "title": "写真の重ね合わせ(OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "この画像をOpenStreetCamで見る"
+        },
         "help": {
             "title": "ヘルプ",
-            "help": "# ヘルプ\n\nこのアプリケーションは、自由に編集できる世界地図 [OpenStreetMap](http://www.openstreetmap.org/)編集用のエディタです。あなたが知っている地域についての情報を追加したり、編集したりして、誰もが使いやすい情報としてデータをオープンに広めましょう。\n\nあなたが編集した結果は、OpenStreetMapを利用するすべての人が閲覧することができます。編集するためには[ログイン](https://www.openstreetmap.org/login) する必要があります。\n\nこの [iD エディタ](http://ideditor.com/) の[ソースコードはGitHubで管理](https://github.com/openstreetmap/iD)されており、誰もが参加できるプロジェクトとして公開されています。\n",
-            "gps": "# GPS\n\nOpenStreetMapにおいて、GPSデータは最も価値の高い情報源のひとつです。iDエディタはあなたのPC上にある `.gpx` ファイルのトレース機能をサポートしています。GPSログは、スマートフォンのアプリケーションやGPSロガーを使用することで収集することができます。\n\nGPSを使用した現地調査の詳細な進め方については、[GPSによる調査](http://learnosm.org/ja/mobile-mapping/using-gps/)を参照してください。\n\nGPXログファイルをエディタの上にドラッグ&ドロップすることで、ファイルの内容をエディタ上に表示させることができます。ファイル形式の読み込みが正常に完了すると、ログは明るい紫色の線としてエディタ上に表示されます。エディタの右側に配置されている '地図データ' メニューをクリックすると、ログの表示/非表示、GPXが配置されたレイヤーへのズームを設定することができます。\n\nこのGPXログファイルはOpenStreetMapへ直接アップロードされたものではありません。このログを参考情報として地図を描いたり、あなたが追加する地物の配置場所の参考情報とするのがよいでしょう。また、あなた以外のユーザにもGPSログを使ってもらうためには[OpenStreetMapへのアップロード機能](http://www.openstreetmap.org/trace/create)を利用してください。\n",
-            "imagery": "# 背景画像\n\n地図を作成するにあたって、航空写真は重要なリソースのひとつです。上空からの撮影、衛星写真、自由な利用が認められた情報源などは、画面左側の'背景画像設定'メニューから表示させることが可能です。\n\nデフォルト設定では[Bing Maps](http://www.bing.com/maps/)の衛星写真レイヤーが表示されていますが、地図のズームレベル変更などで新しい場所を表示する際に別のリソースを表示させることが可能です。英国やフランス、デンマークでは、特定の地域に限り非常に細密な画像が利用可能です。\n\n画像提供側の間違いが原因で、背景画像と地図データの位置がずれていることがあります。既存道路の多くが一方向にずれている場合、すべての地物の位置を一度に移動させてしまう前に、背景画像の表示位置を調整してみて、オフセットがされていないか確認を行なってください。位置の調整は、背景画像設定の一番下に表示されている'背景画像をずらす'という項目から行うことができます。\n",
-            "addresses": "# 住所\n\n住所情報は地図において最も有用な情報のひとつです。\n\n住所情報は街路の付帯情報として扱われることがほとんどですが、OpenStreetMapにおける住所情報は、街路にそって配置されている建物の属性として記録されます。\n\n住所情報は建物を表す輪郭に付与しても構いませんし、独立したポイントとして配置してもかまいません。また、住所データの最適な情報源は現地調査、あるいは個人の記憶によるものです。GoogleMapsなど、他の地図からの転載は特別な許諾がない限り固く禁止されています。\n\n注: 日本では住所システムの体系が異なるため、街路を基とする上記の方法を適用することはできません。\n",
-            "inspector": "# 地物情報表示ウィンドウ\n\n地図上の地物を選択すると、画面左側に入力ウィンドウが表示されます。地物に関する詳細情報の編集はこのウィンドウから行います。\n\n### 地物種別の選択\n\nポイントやライン、エリアを描画する際には、描いた地物の種別を選択することが可能です。これによって、ラインが高速道路なのか住宅道路なのか、ポイントがスーパーマーケットなのか喫茶店なのか、などを表現します。地物情報表示ウィンドウには、よく利用される地物が表示されています。その他の地物を表示させたい場合は、検索ボックスから検索を行なってください。\n\n地物種別情報の右下に表示されている 'i' ボタンをクリックすると、その種別に関する詳細情報を表示させることができます。アイコンをクリックすると、その地物の種別が確定されます。\n\n### フォームを利用したタグ編集\n\n地物の種別を選択した後、あるいは既に種別が割り当てられた地物を選択すると、その地物に関する名称や住所などの詳細情報がウィンドウ内に表示されます。\n\n入力ウィンドウの一番下に配置されている 'タグ項目を追加'をクリックすると、Wikipediaのリンクや車椅子の利用可否などの要素に対する自由記入フォームが表示されます。\n\n情報表示ウィンドウの下の方に表示されている 'その他のタグ' をクリックすると、地物に対してその他のタグを付与することができます。 利用されることが多いタグの組み合わせは[Taginfo](http://taginfo.openstreetmap.org/)から検索が可能です。\n\n入力ウィンドウに記入した内容は、エディタ上の地図に即座に反映されます。'やり直し'ボタンをクリックすることで、いつでも入力内容を取り消すことが可能です。\n"
+            "key": "H",
+            "help": {
+                "title": "ヘルプ",
+                "welcome": "[OpenStreetMap](https://www.openstreetmap.org/)用のiDエディタへようこそ。このエディタを使うと自分のブラウザから直接OpenStreetMapを更新できます。",
+                "open_data_h": "オープンデータ",
+                "open_data": "あなたがこのマップ上で編集した内容はOpenStreetMapの全ての利用者が見ているものに反映されます。あなたは個人的な知識、現地調査、(利用を許可された)航空写真や街路写真などを元に編集することができますが、グーグルマップなどのような商業ベースの情報源からのコピーは [厳しく制限されています](https://www.openstreetmap.org/copyright)。",
+                "before_start_h": "始める前に",
+                "before_start": "編集を始める前に、少しOpenStreetMapとこのエディタに慣れたほうが良いでしょう。iDにはウォークスルーがあり、OpenStreetMap編集の基礎を教えてくれます。この画面にある「チュートリアルを開始」をクリックしてチュートリアルで学んでください - 15分ほどで終わります。",
+                "open_source_h": "オープンソース",
+                "open_source": "iDエディタは共同作業のオープンソースプロジェクトであり、現在のバージョンは{version} です。ソースコードは[GitHub上](https://github.com/openstreetmap/iD)にあります。",
+                "open_source_help": "あなたも[翻訳](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating)したり[バグ報告](https://github.com/openstreetmap/iD/issues)したりすることでiDを支援できます。"
+            },
+            "overview": {
+                "title": "概要",
+                "navigation_h": "ナビゲーション",
+                "navigation_drag": "{leftclick}左マウスボタンを押したままマウスを動かすことで、マップをドラッグすることができます。キーボードの`↓`, `↑`, `←`, `→` 矢印キーも使えます。",
+                "navigation_zoom": "マウスホイールやトラックパッドでスクロールしたり、マップの脇にある{plus} / {minus}ボタンをクリックするとズームインしたりズームアウトしたりすることができます。キーボードの`+`, `-` キーも使えます。",
+                "features_h": "マップの地物",
+                "features": "私たちは道路、建物、興味深い地点(POI)といったマップ上に現れる物事を表現するのに*地物*という言葉を使います。実世界のあらゆるものを地物としてOpenStreetMap上にマッピングすることができます。マップの地物は*ポイント*、*ライン*、あるいは*エリア*を使って表現されます。",
+                "nodes_ways": "OpenStreetMapでは、ポイントは*ノード*、ラインとエリアは*ウェイ*とよく呼ばれます。"
+            },
+            "editing": {
+                "title": "編集 & 保存",
+                "select_h": "選択",
+                "select_left_click": "地物の上で{leftclick}左クリックして選択します。そうすると周囲が点滅しつつハイライトされ、サイドバーに名前や住所といったその地物の詳細が表示されます。",
+                "select_right_click": "地物の上で{rightclick}右クリックして編集メニューを表示します。そこには回転、移動、削除といった利用可能なコマンドが示されています。 ",
+                "multiselect_h": "複数選択",
+                "multiselect_shift_click": "`{shift}`+{leftclick}左クリックで複数の地物を同時に選択します。複数項目の移動や削除が簡単にできます。",
+                "multiselect_lasso": "複数選択のもうひとつのやり方は`{shift}` キーを押しながら、{leftclick}左マウスボタンをクリックし、マウスをドラッグして対象エリアを囲みます。囲まれたエリア内のポイントは全て選択されます。",
+                "undo_redo_h": "元に戻す & 再実行",
+                "undo_redo": "あなたが編集した内容はOpenStreetMapサーバーへの保存を選ぶまではブラウザ内のローカルに蓄えられています。{undo} **元に戻す**ボタンをクリックして編集を元に戻したり、{redo} **再実行**ボタンをクリックして再実行したりすることができます。",
+                "save_h": "保存",
+                "save": "{save} **保存**をクリックして編集を終了し、OpenStreetMapに送信します。作業内容はこまめに保存するよう気をつけてください!",
+                "save_validation": "保存画面には、作業内容のレビュー結果が表示される場合があります。iDは不足データに対する基本的なチェックを実行し、何か間違ったものがあれば手助けとなる提案や警告が提示されるかもしれません。",
+                "upload_h": "アップロード",
+                "upload": "変更内容をアップロードする前に、[変更セットのコメント](https://wiki.openstreetmap.org/wiki/Good_changeset_comments)を入力しなければなりません。それから**アップロード**をクリックして変更をOpenStreetMapに送信します。するとそれらがマップにマージされ、(サーバーの状態により異なりますが、5分後から数時間後くらいの間に)誰にでも見えるようになります。",
+                "backups_h": "自動バックアップ",
+                "backups": "コンピュータのクラッシュやブラウザのタブを綴じたりして編集を一気に終了できなかったような場合には、あなたの編集はブラウザの領域にまだ残っています。(同じコンピュータのブラウザで)後からもう一度続けることができ、iDはあなたの作業を復元するかどうか提案します。",
+                "keyboard_h": "キーボード・ショートカット",
+                "keyboard": "`?` キーを押すと、キーボード・ショートカットの一覧を見ることができます。"
+            },
+            "feature_editor": {
+                "title": "地物エディタ",
+                "intro": "*地物エディタ*はマップの側面に現れ、選択した地物に関する全ての情報を見たり編集したりすることができます。",
+                "definitions": "トップのセクションでは地物の種別が表示されます。中央のセクションには、名前や住所といった地物の属性を示す*項目*が含まれます。",
+                "type_h": "地物の種別",
+                "type": "地物の種別をクリックすると別の種別の地物に変更できます。実世界にあるもの(位置を持つ事実情報で、主観が入らずある程度固定的なもの)は何でもOpenStreetMapに追加することができます。このため選べる地物が何千件もあります。",
+                "type_picker": "種別の選択肢には公園、病院、レストラン、道路、建物といったよくある地物が表示されます。見つけたいものを検索ボックスに入力して何でも探すことができます。地物の種別の隣にある{inspect}**情報**アイコンをクリックしてその詳細を調べることもできます。",
+                "fields_h": "項目",
+                "fields_all_fields": "「すべての項目」セクションにはあなたが編集するであろう地物の詳細項目が含まれています。 OpenStreetMapでは全ての項目は任意であり、わからないところは空欄のままで構いません。",
+                "fields_example": "地物の種別ごとにそれぞれ異なる項目が表示されます。例えば、道路には路面、制限速度といった項目が表示されますが、レストランには提供される食事の種別や営業時間が表示されます。",
+                "fields_add_field": "「項目追加」欄でドロップダウンをクリックすると、説明、Wikipedia(記事へのリンク)、車椅子の利用可否などの項目をさらに追加することができます。",
+                "tags_h": "タグ",
+                "tags_all_tags": "項目セクションの下のほうに「すべてのタグ」セクションがあり、選択した地物のためのOpenStreetMap*タグ*をどれでも編集することができます。各タグは*キー*と*値*から成っており、これはOpenStreetMapに蓄積されている全ての地物を定義するデータ要素です。(項目セクションではOpenStreetMapタグを直接憶えていなくても日本語のインタフェースで探して入力できるようになっていますが、ここではタグを直接編集できます。いちばん下の「+」をクリックすると、項目セクションに表示されていないタグを手入力で追加することもできます。)",
+                "tags_resources": "地物のタグを手入力で編集するにはOpenStreetMapについてある程度の知識が必要です。[OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/JA:Main_Page) や [Taginfo](https://taginfo.openstreetmap.org/)などのリソースを活用したり相談したりして広く受け入れられているOpenStreetMapのタグ付け方法を学んでください。"
+            },
+            "points": {
+                "title": "ポイント",
+                "intro": "*ポイント*は店舗、レストラン、記念碑といった地物を表現するのに使います。 特定の位置にマークし、そこに何があるかを記述します。",
+                "add_point_h": "ポイントの追加",
+                "add_point": "ポイントを追加するには、マップ上部のツールバーにある{point}**ポイント**ボタンをクリックするか、ショートカットキー `1`を押してください。そうするとマウスカーソルが十字型に変化します。",
+                "add_point_finish": "マップ上に新しいポイントを置くには、マウスカーソルをポイントを置きたい場所に移動させ、{leftclick}左クリックもしくはスペースキーを押してください。",
+                "move_point_h": "ポイントの移動",
+                "move_point": "ポイントを動かすには、マウスカーソルをポイントの上に置いて、{leftclick} 左マウスボタンを押したまま新しい位置までドラッグします。",
+                "delete_point_h": "ポイントの削除",
+                "delete_point": "実世界に存在しない地物は削除しても構いません。OpenStreetMapから地物を削除するとみんなが見ているマップから削除されるので、削除する前にその地物が本当に存在しないかよく確認してください。",
+                "delete_point_command": "ポイントを削除するには、その上で{rightclick}右クリックして選択して編集メニューを表示させ、{delete}**削除**コマンドを使用します。"
+            },
+            "lines": {
+                "title": "ライン",
+                "intro": "*ライン*は道路、鉄道、河川といった地物を表現するのに使われます。 ラインはその地物の中心付近に引きます。",
+                "add_line_h": "ラインの追加",
+                "add_line": "ラインを追加する際には、マップ上部にあるツールバーの{line}**ライン**ボタンをクリックするか、ショートカットキー`2`を押してください。マウスカーソルが十字型に変わります。",
+                "add_line_draw": "次にラインの始点にマウスカーソルを置いて{leftclick}左クリックするかスペースキーを押して、ラインに沿ってノードを置き始めます。引き続きクリックまたはスペースキーを押しながらノードを置いて行きます。ラインを引いている間でも、ズームインしたりマップをドラッグして細部を追加することができます。(交差の無い直線部分の中間にノードを置く必要はありません。曲線部分を滑らかに表現する、最低限のノードがあれば充分です。)",
+                "add_line_finish": "ラインを引き終わったときには、`{return}`キーまたは`ESC`キーを押すか最後のノード上でもう一度クリックします。",
+                "modify_line_h": "ラインの変更",
+                "modify_line_dragnode": "背景画像と一致しない道路など、形状が正確でないラインを目にする機会は多いと思います。ラインの形状を調整する場合には、まずそのラインを{leftclick}左クリックして選択します。そのライン上の全てのノードは小さな円として表示されます。その後、ノードをより適切な位置にドラッグします。",
+                "modify_line_addnode": "ライン上で{leftclick}**x2**ダブルクリックするか、ノードどうしの中間にある小さな三角をドラッグすることで、新しいノードを作成することもできます。",
+                "connect_line_h": "ラインの接続",
+                "connect_line": "道路間の接続を適切に表現することはマップにとって重要であり、運転する方向を提供するのに不可欠です。",
+                "connect_line_display": "道路間の接続はグレイの小さな円で表示されます。ラインの終点がどこにも接続されていない場合には、少し大きな白い円で表示されます。",
+                "connect_line_drag": "ラインを別の地物に接続するには、そのライン上のノードのひとつを別の地物上に、両方の地物が吸い付くように重なる(接続先の地物が選択状態になる)までドラッグします。ヒント: 他の地物と接続させたくない時は、`{alt}`キーを押しながらドラッグします。",
+                "connect_line_tag": "接続部分に信号機や横断歩道があることが分かっている場合には、接続点のノードを選択して、地物エディタで正しい地物の種別を選んで追加することもできます。(背景画像で横断歩道が見える場合にはノードでなくラインを引いて横断歩道のタグを付けることもできます。)",
+                "disconnect_line_h": "ラインの接続解除",
+                "disconnect_line_command": "道路を別の地物から切り離すには、接続しているノードを{rightclick}右クリックして、編集メニューから{disconnect}**接続解除**コマンドを選びます。",
+                "move_line_h": "ラインの移動",
+                "move_line_command": "ライン全体を移動させる場合は、そのラインを右{rightclick}クリックして、編集メニューから{move}**移動**コマンドを選びます。そしてマウスを動かしてそのラインを新しい場所に置いて{leftclick}左クリックします。",
+                "move_line_connected": "他の地物に接続しているラインは、(接続解除を行わない限り)そのラインを新しい位置に動かしても接続したままです。iDはあるラインを別の接続されたラインから勝手に切り離されて移動することを防ぎます。",
+                "delete_line_h": "ラインの削除",
+                "delete_line": "例えば実世界に存在しない道路などライン全体が正しくない場合には、削除しても構いません。でも地物を削除する時にはくれぐれも注意してください。あなたが見ている背景画像は古いものかもしれず、間違っているように見える道路は単に新しく建設されたものかもしれません。",
+                "delete_line_command": "ラインを削除する場合は、そのライン上で{rightclick}右クリックして選択して編集メニューを表示させ、それから{delete}**削除**コマンドを使用してください。"
+            },
+            "areas": {
+                "title": "エリア",
+                "intro": "*エリア*は湖、建物、住宅地といった地物の境界を表示するのに使われます。エリアは例えば建物の基礎部分の周囲などのように、その地物の外縁をトレースします。",
+                "point_or_area_h": "ポイントかエリアか?",
+                "point_or_area": "多くの地物はポイントでもエリアでも表現することができますが、建物や敷地は極力エリアでマッピングすべきです。建物の中にあるのがビジネス施設なのかアメニティ施設なのか、あるいは別の地物なのかを表現するために、建物の中にポイントを置きます。",
+                "add_area_h": "エリアの追加",
+                "add_area_command": "エリアを追加する場合は、マップ上部のツールバー上の{area}**エリア**ボタンをクリックするか、ショートカットキー`3`を押します。するとマウスカーソルが十字形に変わります。",
+                "add_area_draw": "次にマウスカーソルを対象となる地物の角のひとつに置いて、{leftclick}左クリックまたはスペースキーを押してアリアの外周にノードを置き始めます。クリックまたはスペースキーを押してノードを追加します。外周を描いている間も、ズームインしたりマップをドラッグして詳細を描き加えることができます。",
+                "add_area_finish": "エリアを描き終わったら、`{return}`キーまたは`ESC`キーを押すか、最初または最後のノードを再度クリックして終了します。",
+                "square_area_h": "角を直角化",
+                "square_area_command": "建物などエリアの地物の多くには直角な角があります。エリアの角を直角にするには、エリアの境界を{rightclick}右クリックして選択し、編集メニューから{orthogonalize} **直交化**を選びます。",
+                "modify_area_h": "エリアを変更",
+                "modify_area_dragnode": "例えば背景画像と一致しない建物など、形状が正しくないエリア見かけることは多いでしょう。エリアの形状を調整するにはまず{leftclick}左クリックして対象を選びます。エリアの全ノードが小さな円として表示されます。そしてノードをより正確な位置にドラッグすることができます。",
+                "modify_area_addnode": "そのエリアの外周上で{leftclick}**x2**ダブルクリックしたり、2つのノード間の中間にある小さな三角形をドラッグすると、エリアに沿って新しいノードを作成することができます。",
+                "delete_area_h": "エリアの削除",
+                "delete_area": "例えば実世界に存在しない建物などエリア全体が正しくない場合には、それを削除しても構いませんが、地物を削除する際にはくれぐれも気をつけてください。あなたが見ている背景画像が古く、間違っているように見える建物は単に新しく建てられたものかもしれません。",
+                "delete_area_command": "エリアを削除する場合は、エリア上で{rightclick}右クリックして選択して編集メニューを表示させ、{delete} **削除**コマンドを使います。"
+            },
+            "relations": {
+                "title": "リレーション",
+                "intro": "*リレーション*とは、OpenStreetMapにおける地物の特別な種別で、他の地物をまとめてグループ化するものです。リレーションが持つ地物は*メンバー*と呼ばれ、各メンバーはリレーション内での*ロール*を持つことができます。",
+                "edit_relation_h": "リレーションの編集",
+                "edit_relation": "地物エディタのいちばん下に「すべてのリレーション」セクションがあり、選ばれた地物が何らかのリレーションのメンバーかどうか見ることができます。そしてそのリレーションをクリックすると選択して編集することができます。",
+                "edit_relation_add": "ある地物をリレーションに追加するには、地物を選択し、地物エディタの「すべてのリレーション」セクションにある {plus} 追加ボタンをクリックします。すると近くにあるリレーションの一覧から選んだり、「新しいリレーション...」オプションを選んだりすることができます。",
+                "edit_relation_delete": "{delete} **削除**ボタンをクリックして選択した地物をリレーションから削除することもできます。リレーションから全ての地物を削除すると、リレーション自体も自動的に削除されます。",
+                "maintain_relation_h": "リレーションの維持管理",
+                "maintain_relation": "たいていの場合、iDはあなたの編集に合わせてリレーションを自動的に維持管理していますが、リレーションのメンバーとなっていそうな地物を置き換える際には注意が必要です。例えば道路のある区間を削除して新しく区間を引き直した場合、その新しい区間を元の区間と同様に同じリレーション(ルート、進行方向制限など)に追加する必要があります。",
+                "relation_types_h": "リレーションの種別",
+                "multipolygon_h": "マルチポリゴン(多角形)",
+                "multipolygon": "*マルチポリゴン*リレーションはひとつ以上の*outer*(外側)の 地物とひとつ以上の*inner*(内側)の地物のグループです。outerの地物はマルチポリゴンの外周を定義し、 innerの地物はマルチポリゴン内部にあるサブエリアや切り抜かれた穴を定義します。",
+                "multipolygon_create": "例えばその中に穴がある建物のようなマルチポリゴンを作成するには、外周をエリアとして描き、内周をラインまたは別のエリアとして描きます。そして`{shift}`+{leftclick}左クリックで両方の地物を選択し、{rightclick}右クリックで編集メニューを表示させ、{merge}**結合**コマンドを選びます。",
+                "multipolygon_merge": "複数のラインやエリアを結合(マージ)すると、選択された全てのエリアをメンバーとする新しいマルチポリゴン・リレーションが作成されます。iDはどの地物が内側にあるかを自動的に判別して、innerとouterのロールを自動的に選びます。",
+                "turn_restriction_h": "進行方向制限",
+                "turn_restriction": "*進行方向制限*リレーションは交差点における複数の道路セグメントのグループです。進行方向制限は*from*(開始地点)の道路、*via*(経由地点)のノードまたは道路、そして*to*(終了地点)の道路から成っています。",
+                "turn_restriction_field": "進行方向制限を編集するには、まず2つ以上の道路が出会う合流点ノードを選択します。すると地物エディタが交差点のモデルを含む特別な「進行方向制限」項目を表示します。",
+                "turn_restriction_editing": "「進行方向制限」項目では、まず\"from\"側の道路をクリックして選び、そして\"to\"側の道路の方向に向けて進行が許可されているか禁止されているかを確認します。進行方向アイコンをクリックすると許可と禁止を切替えられます。iDはあなたの選択に従ってリレーションを自動的に作成し、from、via、toの各ロールをセットします。",
+                "route_h": "ルート(経路)",
+                "route": "*ルート*リレーションはバスルート、鉄道ルート、道路ルートなどのように経路のネットワークを形成するひとつ以上のラインの地物のグループです。",
+                "route_add": "ある地物をルート・リレーションに追加するには、その地物を選んで地物エディタの「すべてのリレーション」セクションまで下にスクロールし、{plus}追加ボタンをクリックしてこの地物を近くにある既存のリレーションまたは新しいリレーションに追加します。",
+                "boundary_h": "境界(バウンダリー)",
+                "boundary": "*境界*リレーションは、行政界を形成するひとつ以上のラインの地物のグループです。",
+                "boundary_add": "ある地物を境界リレーションに追加するには、その地物を選んで地物エディタの「すべてのリレーション」セクションまで下にスクロールして、{plus}追加ボタンをクリックして近くにある既存のリレーションまたは新しいリレーションに追加します。 "
+            },
+            "imagery": {
+                "title": "背景画像",
+                "intro": "マップデータの下に表示される背景画像はマッピングの重要な情報源です。この画像は宇宙衛星、航空機、ドローンによって収集された写真の場合や、歴史的な地図をスキャンしたものであったりその他のフリーに利用できる情報源のデータであったりします。",
+                "sources_h": "画像の情報源",
+                "choosing": "どのような画像情報源が編集に利用できるか調べるには、マップの脇にある{layers}**背景設定**ボタンをクリックしてください。",
+                "sources": "デフォルトでは[Bing Maps](https://www.bing.com/maps/)衛星レイヤが背景画像として選ばれています。編集している地域に応じて、別の画像情報源も利用できます。より新しいものや高解像度のものもあるので、マッピング時の参照先としてどのレイヤがベストかこまめにチェックすると良いでしょう。(日本でも複数の背景画像が選択できますが、iDエディタ上に初期表示されていない「基盤地図情報」は写真ではなく建物や道路の形状が画像化されているのでトレースには便利です。背景画像としての設定方法は[iDでの基盤地図設定方法](https://wiki.openstreetmap.org/wiki/JA:GSI_KIBAN/Using_GSI_KIBAN_WMS#iD.E3.81.A7.E3.81.AE.E8.A8.AD.E5.AE.9A.E6.96.B9.E6.B3.95)参照。なお、情報がやや古い場合がありますので最新の状況はBingなど他と見比べながら確認してください。)",
+                "offsets_h": "背景画像オフセットの調整",
+                "offset": "背景画像は正確なマップデータの位置から多少ズレている場合があります。多くの道路や建物が背景画像とズレている場合は、ズレているのは背景画像の方である可能性がありますので、背景画像に合わせて全ての地物をズラすのはやめてください。その代わりに背景設定パネルのいちばん下「背景位置の調整」セクションで背景画像の方をズラして、既存のデータに一致するように調整することができます。(日本での位置精度は概して地理院オルソ画像(Japan GSI ortho Imagery)または基盤地図情報2500(上述)が最も高いようです。ただし両者ともやや古い場合があるので他の画像と見比べながら判断してください。)",
+                "offset_change": "上下左右の小さな三角形をクリックして少しずつ画像オフセット(ズラす量)を調整するか、中央の正方形の灰色部分を左クリックしたままドラッグしてして画像をスライドさせながら合わせてください。(オフセット値は場所により変わります。複数エリアを編集する際には値をどこかにメモしておくと良いでしょう。)"
+            },
+            "streetlevel": {
+                "title": "街路写真",
+                "intro": "衛星/航空写真では見えない交通標識、ビジネスの種類、その他の詳細情報などをマッピングするのには街路写真が役立ちます。iDエディタは[Mapillary](https://www.mapillary.com)や[OpenStreetCam](https://www.openstreetcam.org)の街路写真をサポートしています。",
+                "using_h": "街路写真の利用",
+                "using": "街路写真をマッピングに利用するには、マップ脇にある{data}**地図データ設定**パネルをクリックして利用可能な写真レイヤを有効化/無効化してください。",
+                "photos": "有効化すると、写真レイヤには写真の撮影順に沿ったラインが表示されます。高ズームレベルでは、各写真の位置に円形のマークがあり、より高ズームレベルでは撮影時のカメラの向きが円錐形で示されます。",
+                "viewer": "写真の位置をどれかひとつクリックすると、マップの下隅に写真ビューアが表示されます。写真ビューアには画像順の前進/後退コントロールが含まれています。さらに画像撮影者のユーザー名、撮影日付、オリジナルサイトでの閲覧用URLなども表示されています。"
+            },
+            "gps": {
+                "title": "GPSトレース",
+                "intro": "集められたGPSトレースはOpenStreetMapで使える貴重な情報源です。このエディタはあなたのローカルコンピュータ上の*.gpx*、*.geojson*及び*.kml*ファイルをサポートしています。GPSトレースはスマートフォン、スポーツ時計、その他のGPS装置などで集められます。",
+                "survey": "GPSでのサーベイ実施方法に関する情報は [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/)を読んでみてください。",
+                "using_h": "GPSトレースの利用",
+                "using": "GPSトレースをマッピングに使うには、そのデータファイルをマップエディタにドラッグ&ドロップしてください。正しく認識されると、マップ上に明るい紫のラインとして表示されます。マップ脇の{data}**地図データ設定**パネルをクリックしてあなたのGPSデータ(ローカル・ファイル)を有効化したり、無効化したり、あるいはズームしてみてください。",
+                "tracing": "GPSトラックはOpenStreetMapへは送信されません。そのいちばん良い使い方は、自分が追加する新しい地物のためのガイドとして使いながらマッピングすることです。 ",
+                "upload": "あなたは他の利用者が使えるように[自分のGPSデータをOpenStreetMapにアップロード](https://www.openstreetmap.org/trace/create)することもできます。"
+            }
         },
         "intro": {
             "done": "完了",
                     "4th-avenue": "四条通り",
                     "5th-avenue": "五条通り",
                     "6th-avenue": "六条通り",
+                    "6th-street": "6th Street",
                     "7th-avenue": "七条通り",
                     "8th-avenue": "八条通り",
                     "9th-avenue": "九条通り",
                     "10th-avenue": "十条通り",
                     "11th-avenue": "十一条通り",
                     "12th-avenue": "十二条通り",
+                    "access-point-employment": "Access Point Employment",
                     "adams-street": "アダムス通り",
                     "andrews-elementary-school": "アンドリュー小学校",
                     "andrews-street": "アンドリュー通り",
                     "armitage-street": "アーミテージ通り",
+                    "barrows-school": "Barrows School",
+                    "battle-street": "Battle Street",
+                    "bennett-street": "Bennett Street",
+                    "bowman-park": "Bowman Park",
+                    "collins-drive": "Collins Drive",
+                    "conrail-railroad": "Conrail Railroad",
+                    "conservation-park": "Conservation Park",
+                    "constantine-street": "Constantine Street",
+                    "cushman-street": "Cushman Street",
+                    "dollar-tree": "Dollar Tree",
+                    "douglas-avenue": "Douglas Avenue",
+                    "east-street": "East Street",
+                    "elm-street": "Elm Street",
+                    "flower-street": "Flower Street",
+                    "foster-street": "Foster Street",
+                    "french-street": "French Street",
+                    "garden-street": "Garden Street",
+                    "gem-pawnbroker": "Gem Pawnbroker",
+                    "golden-finch-framing": "Golden Finch Framing",
+                    "grant-avenue": "Grant Avenue",
+                    "hoffman-pond": "Hoffman Pond",
+                    "hoffman-street": "Hoffman Street",
+                    "hook-avenue": "Hook Avenue",
+                    "jefferson-street": "Jefferson Street",
+                    "kelsey-street": "Kelsey Street",
+                    "lafayette-park": "LaFayette Park",
+                    "las-coffee-cafe": "L.A.'s Coffee Cafe",
+                    "lincoln-avenue": "Lincoln Avenue",
+                    "lowrys-books": "Lowry's Books",
+                    "lynns-garage": "Lynn's Garage",
+                    "main-street-barbell": "Main Street Barbell",
+                    "main-street-cafe": "Main Street Cafe",
+                    "main-street-fitness": "Main Street Fitness",
+                    "main-street": "Main Street",
+                    "maple-street": "Maple Street",
+                    "marina-park": "Marina Park",
+                    "market-street": "Market Street",
+                    "memory-isle-park": "Memory Isle Park",
+                    "memory-isle": "Memory Isle",
+                    "michigan-avenue": "Michigan Avenue",
+                    "middle-street": "Middle Street",
+                    "millard-street": "Millard Street",
+                    "moore-street": "Moore Street",
+                    "morris-avenue": "Morris Avenue",
+                    "mural-mall": "Mural Mall",
+                    "paisanos-bar-and-grill": "Paisano's Bar and Grill",
+                    "paisley-emporium": "Paisley Emporium",
+                    "paparazzi-tattoo": "Paparazzi Tattoo",
+                    "pealer-street": "Pealer Street",
+                    "pine-street": "Pine Street",
                     "pizza-hut": "ピザハット",
+                    "portage-avenue": "Portage Avenue",
+                    "portage-river": "Portage River",
+                    "preferred-insurance-services": "Preferred Insurance Services",
+                    "railroad-drive": "Railroad Drive",
+                    "river-city-appliance": "River City Appliance",
+                    "river-drive": "River Drive",
+                    "river-road": "River Road",
+                    "river-street": "River Street",
+                    "riverside-cemetery": "Riverside Cemetery",
+                    "riverwalk-trail": "Riverwalk Trail",
+                    "riviera-theatre": "Riviera Theatre",
+                    "rocky-river": "Rocky River",
+                    "saint-joseph-river": "Saint Joseph River",
+                    "scidmore-park-petting-zoo": "Scidmore Park Petting Zoo",
+                    "scidmore-park": "Scidmore Park",
+                    "scouter-park": "Scouter Park",
+                    "sherwin-williams": "Sherwin-Williams",
+                    "south-street": "South Street",
+                    "southern-michigan-bank": "Southern Michigan Bank",
+                    "spring-street": "Spring Street",
+                    "sturgeon-river-road": "Sturgeon River Road",
                     "three-rivers-city-hall": "三川市役所",
                     "three-rivers-elementary-school": "三川小学校",
                     "three-rivers-fire-department": "三川消防署",
                     "three-rivers-high-school": "三川高等学校",
                     "three-rivers-middle-school": "三川中学校",
+                    "three-rivers-municipal-airport": "Three Rivers Municipal Airport",
                     "three-rivers-post-office": "三川郵便局",
                     "three-rivers-public-library": "三川図書館",
-                    "three-rivers": "三川"
+                    "three-rivers": "三川",
+                    "unique-jewelry": "Unique Jewelry",
+                    "walnut-street": "Walnut Street",
+                    "washington-street": "Washington Street",
+                    "water-street": "Water Street",
+                    "west-street": "West Street",
+                    "wheeler-street": "Wheeler Street",
+                    "william-towing": "William Towing",
+                    "willow-drive": "Willow Drive",
+                    "wood-street": "Wood Street",
+                    "world-fare": "World Fare"
                 }
             },
             "welcome": {
             },
             "areas": {
                 "title": "エリア",
-                "add_playground": "*エリア*は、湖や建物、居住区域など、境界線のある地物を描くために使われます。{br}また、ポイントで表現される地物をより詳細に描く目的でも使われます。**{button}エリアボタンをクリックすると新しいエリアを描くことができます。**",
+                "add_playground": "*エリア*は湖、建物、住宅街といった地物の境界を表すために使用されます。{br}これらは通常はポイントとしてマッピングされるかもしれない多くの地物をより詳細にマッピングする時に使用することもできます。**{button}エリアボタンをクリックして新しいエリアを追加してください。**",
                 "start_playground": "この公園をエリアとしてマップしてみましょう。エリアは、地物の外周の形に*ノード*を配置することで描くことができます。**クリックするかスペースキーを押して、公園の角のどこかを配置してみましょう。**",
+                "continue_playground": "子どもの遊び場の外周に沿って続けてノードを置きながらエリアを描き続けてください。このエリアを既存の歩道に接続しても構いません。{br}ヒント: ノードが他の地物と接続されないように'{alt}'キーを押しながら描くこともできます。**遊び場のエリアを描き続ける。**",
                 "finish_playground": "エリアの描画を終了する際は、エンターキーを押すか、あるいは描き始めや描き終わりのノードで連続して二回同じ場所でクリックしてください。**公園をエリアとして描いてみましょう。**",
                 "search_playground": "**'{preset}'を検索**",
                 "choose_playground": "**一覧から{preset}を選択**",
             },
             "startediting": {
                 "title": "編集開始",
+                "help": "これでOpenStreetMapを編集する準備ができました!{br}{button}ヘルプボタンをクリックするか'{key}'キーを押すと、いつでもこのウォークスルーをやり直したり、ドキュメントをより詳細に見たりすることができます。",
+                "shortcuts": "'{key}' キーを押すと、コマンドの一覧を、そのキーボードショートカットとともに見ることができます。",
                 "save": "変更内容はこまめに保存するよう気をつけてください!",
                 "start": "マッピング開始!(これ以降は練習ではなく実際にデータが登録されますので注意してください)"
             }
             "key": {
                 "alt": "Alt",
                 "backspace": "Backspace",
+                "cmd": "コマンド",
                 "ctrl": "Ctrl",
                 "delete": "Delete",
                 "del": "Del",
                 "title": "閲覧",
                 "navigation": {
                     "title": "ナビゲーション",
-                    "zoom": "拡大/縮小"
+                    "pan": "マップを動かす",
+                    "pan_more": "マップを1画面分動かす",
+                    "zoom": "拡大/縮小",
+                    "zoom_more": "ロット単位でズームイン/ズームアウト"
                 },
                 "help": {
                     "title": "ヘルプ",
                     "keyboard": "ショートカットキーを表示"
                 },
                 "display_options": {
-                    "title": "オプション表示",
-                    "background": "背景オプションを表示",
-                    "background_switch": "前の背景に切り替え",
-                    "map_data": "地図データオプションを表示",
+                    "title": "オプション画面表示",
+                    "background": "背景設定を表示",
+                    "background_switch": "前の背景に切り替え",
+                    "map_data": "地図データ設定を表示",
                     "fullscreen": "全画面モードに入る",
                     "wireframe": "ワイヤーフレームモード切替",
                     "minimap": "ミニマップの表示/非表示"
                 },
                 "selecting": {
                     "title": "地物の選択",
-                    "select_one": "地物を1つ選択してください",
-                    "select_multi": "地物を複数選択してください"
+                    "select_one": "地物を1つ選ぶ",
+                    "select_multi": "地物を複数選ぶ",
+                    "lasso": "地物を囲み線(投げ縄)で選ぶ",
+                    "search": "地物のテキスト検索欄に移動"
                 },
                 "with_selected": {
                     "title": "選択された地物に対して",
                     "add_line": "「ラインの追加」モード",
                     "add_area": "「エリアの追加」モード",
                     "place_point": "ポイントを配置",
-                    "disable_snap": "長押しでポイントの位置合わせを無効化",
+                    "disable_snap": "押下中はポイント接近時の自動接続(SNAP)を無効化",
                     "stop_line": "ラインやエリアの描画を終了"
                 },
                 "operations": {
                     "title": "操作",
                     "continue_line": "選択モードでラインを継続",
-                    "merge": "選択した地物を連結",
+                    "merge": "選択した地物を連結(マージ)",
                     "disconnect": "選択したノードで地物を切り離し",
                     "split": "選択したノードでラインを2つに分割",
                     "reverse": "ラインを反転",
                     "redo": "最後の操作を再実行",
                     "save": "編集結果を保存"
                 }
+            },
+            "tools": {
+                "title": "ツール",
+                "info": {
+                    "title": "補助情報パネル表示切替え",
+                    "all": "表示中の全補助情報パネルを一括表示/非表示",
+                    "background": "背景パネルを表示/非表示",
+                    "history": "編集履歴パネルを表示/非表示",
+                    "location": "位置パネルを表示/非表示",
+                    "measurement": "計測パネルを表示/非表示"
+                }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} sq ft",
+            "square_miles": "{quantity} sq mi",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "北緯",
+            "south": "南緯",
+            "east": "東経",
+            "west": "西経",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                     }
                 },
                 "access_simple": {
-                    "label": "通行可能な手段"
+                    "label": "アクセス制限"
                 },
                 "address": {
                     "label": "住所",
                         "subdistrict": "Subdistrict",
                         "subdistrict!vn": "Ward/Commune/Townlet",
                         "suburb": "区",
-                        "suburb!jp": "区"
+                        "suburb!jp": "区",
+                        "unit": "単位"
                     }
                 },
                 "admin_level": {
                     "label": "Admin Level"
                 },
                 "aerialway": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "aerialway/access": {
                     "label": "乗降場所",
                     }
                 },
                 "aeroway": {
-                    "label": "形態"
+                    "label": "種類"
+                },
+                "agrarian": {
+                    "label": "製品"
                 },
                 "amenity": {
                     "label": "種類"
                     "label": "アーティスト"
                 },
                 "artwork_type": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "atm": {
                     "label": "ATM"
                     "label": "背もたれ"
                 },
                 "barrier": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "bath/open_air": {
                     "label": "露天風呂"
                     "label": "種類"
                 },
                 "bin": {
-                    "label": "ゴミ箱"
+                    "label": "ゴミ箱有無"
                 },
                 "blood_components": {
                     "label": "献血種類",
                     }
                 },
                 "board_type": {
-                    "label": "タイプ"
+                    "label": "種類"
+                },
+                "boules": {
+                    "label": "種類"
                 },
                 "boundary": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "brand": {
                     "label": "ブランド"
                 },
+                "brewery": {
+                    "label": "ドラフトビール"
+                },
+                "bridge": {
+                    "label": "種類",
+                    "placeholder": "デフォルト"
+                },
                 "building": {
                     "label": "建物"
                 },
                 "bunker_type": {
                     "label": "種類"
                 },
+                "cables": {
+                    "label": "ケーブル",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "監視カメラの向き(時計回りの角度)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "収容数",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向",
-                    "options": {
-                        "E": "東",
-                        "ENE": "東北東",
-                        "ESE": "東南東",
-                        "N": "北",
-                        "NE": "北東",
-                        "NNE": "北北東",
-                        "NNW": "北北西",
-                        "NW": "北西",
-                        "S": "南",
-                        "SE": "南東",
-                        "SSE": "南南東",
-                        "SSW": "南南西",
-                        "SW": "南西",
-                        "W": "西",
-                        "WNW": "西北西",
-                        "WSW": "西南西"
-                    }
-                },
                 "castle_type": {
                     "label": "種類"
                 },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "左回り",
-                        "clockwise": "右回り"
-                    }
+                "clothes": {
+                    "label": "服"
                 },
                 "club": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "collection_times": {
                     "label": "収集時刻"
                 },
+                "comment": {
+                    "label": "変更セットのコメント",
+                    "placeholder": "投稿内容の短い説明(必須)"
+                },
                 "communication_multi": {
-                    "label": "é\80\9aä¿¡å\9b\9eç·\9aã\81®ç\94¨é\80\94"
+                    "label": "é\80\9aä¿¡å\9b\9eç·\9aã\81®ç¨®é¡\9e"
                 },
                 "construction": {
                     "label": "種類"
                     "label": "ウェブカメラのURL",
                     "placeholder": "http://example.com/"
                 },
+                "content": {
+                    "label": "内容"
+                },
                 "country": {
                     "label": "国"
                 },
                     "label": "屋根"
                 },
                 "craft": {
-                    "label": "タイプ"
+                    "label": "種類"
+                },
+                "crane/type": {
+                    "label": "クレーンの種類",
+                    "options": {
+                        "floor-mounted_crane": "据付型クレーン",
+                        "portal_crane": "門形クレーン",
+                        "travel_lift": "走行リフト"
+                    }
                 },
                 "crop": {
                     "label": "収穫物"
                 "currency_multi": {
                     "label": "通貨の種類"
                 },
+                "cutting": {
+                    "label": "種類",
+                    "placeholder": "デフォルト"
+                },
                 "cycle_network": {
                     "label": "ネットワーク"
                 },
                 "description": {
                     "label": "説明"
                 },
+                "devices": {
+                    "label": "装置",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "おむつ交換台の利用可否"
                 },
+                "direction": {
+                    "label": "方向(度、時計回り)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "方角",
+                    "options": {
+                        "E": "東",
+                        "ENE": "東北東",
+                        "ESE": "東南東",
+                        "N": "北",
+                        "NE": "北東",
+                        "NNE": "北北東",
+                        "NNW": "北北西",
+                        "NW": "北西",
+                        "S": "南",
+                        "SE": "南東",
+                        "SSE": "南南東",
+                        "SSW": "南南西",
+                        "SW": "南西",
+                        "W": "西",
+                        "WNW": "西北西",
+                        "WSW": "西南西"
+                    }
+                },
+                "direction_clock": {
+                    "label": "方向",
+                    "options": {
+                        "anticlockwise": "反時計回り",
+                        "clockwise": "時計回り"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "逆方向",
+                        "both": "両方 / 全て",
+                        "forward": "順方向"
+                    }
+                },
                 "display": {
                     "label": "表示盤の種類"
                 },
                 "dock": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "drive_through": {
                     "label": "ドライブスルー"
                 },
+                "duration": {
+                    "label": "所要時間",
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "電化状態",
                     "options": {
                     "label": "メールアドレス",
                     "placeholder": "example@example.com"
                 },
+                "embankment": {
+                    "label": "種別",
+                    "placeholder": "デフォルト"
+                },
                 "emergency": {
                     "label": "緊急設備"
                 },
                 "entrance": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "except": {
                     "label": "例外"
                     }
                 },
                 "fire_hydrant/type": {
-                    "label": "タイプ",
+                    "label": "種類",
                     "options": {
                         "pillar": "柱/地上",
                         "pond": "池",
                         "wall": "壁"
                     }
                 },
+                "fitness_station": {
+                    "label": "設備の種類"
+                },
                 "fixme": {
                     "label": "要修正"
                 },
+                "ford": {
+                    "label": "種類",
+                    "placeholder": "デフォルト"
+                },
+                "frequency": {
+                    "label": "動作周波数"
+                },
                 "fuel": {
                     "label": "ガソリンスタンド"
                 },
                 "generator/method": {
                     "label": "方式"
                 },
+                "generator/output/electricity": {
+                    "label": "発電機出力形態:電気",
+                    "placeholder": "50 MW, 100 MW, 200 MW..."
+                },
                 "generator/source": {
                     "label": "エネルギー源"
                 },
                 "generator/type": {
-                    "label": "タイプ"
+                    "label": "種類"
+                },
+                "government": {
+                    "label": "種類"
                 },
                 "grape_variety": {
                     "label": "ブドウの品種"
                 "handrail": {
                     "label": "手すり"
                 },
+                "hashtags": {
+                    "label": "提案されたハッシュタグ",
+                    "placeholder": "#example"
+                },
+                "healthcare": {
+                    "label": "種類"
+                },
                 "healthcare/speciality": {
                     "label": "専門科"
                 },
                     "label": "高さ (メートル)"
                 },
                 "highway": {
-                    "label": "道路区分"
+                    "label": "道路の種類"
                 },
                 "historic": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "historic/civilization": {
                     "label": "文明"
                     "label": "室内"
                 },
                 "information": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "inscription": {
                     "label": "碑文の文面"
                 },
+                "intermittent": {
+                    "label": "間欠性"
+                },
                 "internet_access": {
                     "label": "インターネット環境",
                     "options": {
                     "label": "SSID (ネットワーク名)"
                 },
                 "kerb": {
-                    "label": "縁石"
+                    "label": "縁石の詳細"
+                },
+                "label": {
+                    "label": "ラベル"
                 },
                 "lamp_type": {
-                    "label": "種"
+                    "label": "種"
                 },
                 "landuse": {
-                    "label": "土地区分"
+                    "label": "土地の種類"
                 },
                 "lanes": {
                     "label": "車線数",
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
-                    "label": "レイヤー"
+                    "label": "レイヤー",
+                    "placeholder": "0"
                 },
                 "leaf_cycle": {
                     "label": "葉の季節変化",
                     }
                 },
                 "leisure": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "length": {
                     "label": "長さ (m)"
                 "man_made": {
                     "label": "種類"
                 },
+                "manhole": {
+                    "label": "種類"
+                },
                 "map_size": {
                     "label": "地図の範囲"
                 },
                 "map_type": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "maxheight": {
                     "label": "高さ制限",
                 "maxweight": {
                     "label": "最大重量"
                 },
+                "memorial": {
+                    "label": "種類"
+                },
+                "monitoring_multi": {
+                    "label": "監視"
+                },
                 "mtb/scale": {
                     "label": "マウンテンバイク難易度",
                     "options": {
                     "label": "ネットワーク"
                 },
                 "network_bicycle": {
-                    "label": "ネットワーク種別",
+                    "label": "ネットワークの種類",
                     "options": {
                         "icn": "国際",
                         "lcn": "地域",
                     "placeholder": "地域、地方、国、国際"
                 },
                 "network_foot": {
-                    "label": "ネットワーク種別",
+                    "label": "ネットワークの種類",
                     "options": {
                         "iwn": "国際",
                         "lwn": "地域",
                     "placeholder": "地域、地方、国、国際"
                 },
                 "network_horse": {
-                    "label": "ネットワーク種別",
+                    "label": "ネットワークの種類",
                     "options": {
                         "ihn": "国際",
                         "lhn": "地域",
                     "label": "メモ"
                 },
                 "office": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "oneway": {
                     "label": "一方通行",
                     "options": {
+                        "alternating": "交互通行",
                         "no": "いいえ",
+                        "reversible": "切替通行",
                         "undefined": "おそらくいいえ",
                         "yes": "はい"
                     }
                 "oneway_yes": {
                     "label": "一方通行",
                     "options": {
+                        "alternating": "交互通行",
                         "no": "いいえ",
+                        "reversible": "切替通行",
                         "undefined": "おそらくはい",
                         "yes": "はい"
                     }
                     "label": "パー",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "方向",
-                    "options": {
-                        "backward": "ウェイの逆方向",
-                        "forward": "ウェイの順方向"
-                    }
-                },
                 "park_ride": {
                     "label": "パーク&ライド"
                 },
                 "parking": {
-                    "label": "タイプ",
+                    "label": "種類",
                     "options": {
                         "carports": "カーポート",
                         "garage_boxes": "箱型ガレージ",
                     }
                 },
                 "payment_multi": {
-                    "label": "支払い方法"
+                    "label": "支払の種類"
+                },
+                "phases": {
+                    "label": "相の数",
+                    "placeholder": "1, 2, 3..."
                 },
                 "phone": {
                     "label": "電話番号",
                     }
                 },
                 "piste/type": {
-                    "label": "種",
+                    "label": "種",
                     "options": {
                         "downhill": "ダウンヒル",
                         "hike": "ハイキング",
                     }
                 },
                 "place": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "plant": {
                     "label": "植物"
                 },
+                "plant/output/electricity": {
+                    "label": "発電所出力形態:電気",
+                    "placeholder": "500 MW, 1000 MW, 2000 MW..."
+                },
+                "playground/baby": {
+                    "label": "ベビーシート"
+                },
                 "playground/max_age": {
                     "label": "最高年齢"
                 },
                     "label": "人口"
                 },
                 "power": {
-                    "label": "区分"
+                    "label": "種類"
                 },
                 "power_supply": {
                     "label": "電源"
                     "label": "製品"
                 },
                 "railway": {
-                    "label": "路線種別"
+                    "label": "路線の種類"
                 },
-                "recycling_accepts": {
-                    "label": "リサイクル可能な素材"
+                "railway/position": {
+                    "label": "鉄道距離標",
+                    "placeholder": "小数点第一位までの距離 (123.4)"
                 },
-                "recycling_type": {
-                    "label": "リサイクル設備の種類",
+                "railway/signal/direction": {
+                    "label": "方向(鉄道信号機)",
                     "options": {
-                        "centre": "リサイクルセンター",
-                        "container": "コンテナ"
+                        "backward": "逆方向",
+                        "both": "両方向 / 全て",
+                        "forward": "順方向"
                     }
                 },
+                "rating": {
+                    "label": "定格"
+                },
+                "recycling_accepts": {
+                    "label": "リサイクル可能な素材"
+                },
+                "ref": {
+                    "label": "参照コード"
+                },
+                "ref/isil": {
+                    "label": "ISILコード"
+                },
+                "ref_aeroway_gate": {
+                    "label": "ゲート番号"
+                },
+                "ref_golf_hole": {
+                    "label": "ホール番号",
+                    "placeholder": "1-18"
+                },
                 "ref_highway_junction": {
                     "label": "ジャンクション番号"
                 },
                 "ref_road_number": {
                     "label": "道路番号"
                 },
+                "ref_route": {
+                    "label": "ルート番号"
+                },
+                "ref_runway": {
+                    "label": "滑走路番号",
+                    "placeholder": "例 01L/19R"
+                },
+                "ref_stop_position": {
+                    "label": "停車場番号"
+                },
+                "ref_taxiway": {
+                    "label": "誘導路名",
+                    "placeholder": "例: A5"
+                },
                 "relation": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "religion": {
                     "label": "宗教"
                 },
                 "restriction": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "restrictions": {
                     "label": "進行方向制限"
                     "label": "部屋数"
                 },
                 "route": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "route_master": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "sac_scale": {
                     "label": "ハイキングの難易度",
                     "label": "待合所"
                 },
                 "shelter_type": {
-                    "label": "ã\82¿ã\82¤ã\83\97"
+                    "label": "ã\82·ã\82§ã\83«ã\82¿ã\83¼ã\81®ç¨®é¡\9e"
                 },
                 "shop": {
-                    "label": "店舗種別"
+                    "label": "店舗の種類"
                 },
                 "site": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "smoking": {
                     "label": "喫煙の可否",
                     "label": "一時停止の種類",
                     "options": {
                         "all": "すべての道路",
-                        "minor": "優先ではない道路"
+                        "minor": "非優先道路"
                     }
                 },
                 "structure": {
                     },
                     "placeholder": "不明"
                 },
+                "structure_waterway": {
+                    "label": "トンネルの種別",
+                    "options": {
+                        "tunnel": "トンネル"
+                    },
+                    "placeholder": "不明"
+                },
                 "studio": {
                     "label": "スタジオの種類"
                 },
+                "substance": {
+                    "label": "物質"
+                },
                 "substation": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "supervised": {
                     "label": "監視"
                     "label": "監視の種類"
                 },
                 "surveillance/type": {
-                    "label": "監視方法",
+                    "label": "監視の種類",
                     "options": {
                         "ALPR": "自動ナンバープレート読み取り機",
                         "camera": "監視カメラ",
                 "surveillance/zone": {
                     "label": "監視ゾーン"
                 },
+                "switch": {
+                    "label": "種類",
+                    "options": {
+                        "circuit_breaker": "サーキット・ブレーカー",
+                        "disconnector": "断路器",
+                        "earthing": "アース",
+                        "mechanical": "機械式"
+                    }
+                },
                 "tactile_paving": {
                     "label": "点字ブロック"
                 },
                 "tourism": {
                     "label": "種類"
                 },
+                "tourism_attraction": {
+                    "label": "観光"
+                },
                 "tower/construction": {
                     "label": "建築様式",
                     "placeholder": "支線塔、格子塔、擬態させた塔、etc"
                 },
                 "tower/type": {
-                    "label": "タイプ"
+                    "label": "塔の種類"
                 },
                 "tracktype": {
-                    "label": "トラック種別",
+                    "label": "トラックの種類",
                     "options": {
                         "grade1": "硬質: 舗装もしくは煉瓦・砕石の締固め路盤",
                         "grade2": "大部分が硬質: 砂利・岩と柔らかい物質の混合",
                     },
                     "placeholder": "硬質, 大部分が硬質, 軟質…"
                 },
+                "trade": {
+                    "label": "種類"
+                },
                 "traffic_calming": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "traffic_signals": {
-                    "label": "タイプ"
+                    "label": "特別な信号機の種類"
+                },
+                "traffic_signals/direction": {
+                    "label": "方向(信号機)",
+                    "options": {
+                        "backward": "逆方向",
+                        "both": "両方 / 全て",
+                        "forward": "順方向"
+                    }
                 },
                 "trail_visibility": {
                     "label": "道の可視度",
                     },
                     "placeholder": "優・良・悪…"
                 },
+                "transformer": {
+                    "label": "種類",
+                    "options": {
+                        "auto": "自動変圧器",
+                        "auxiliary": "補助変圧器",
+                        "converter": "整流器用変圧器",
+                        "distribution": "柱上変圧器",
+                        "generator": "発電機連結変圧器",
+                        "phase_angle_regulator": "位相角調節器",
+                        "traction": "主変圧器",
+                        "yes": "不明"
+                    }
+                },
                 "trees": {
                     "label": "木の数"
                 },
+                "tunnel": {
+                    "label": "種類",
+                    "placeholder": "デフォルト"
+                },
                 "vending": {
-                    "label": "販売商品の種"
+                    "label": "販売商品の種"
                 },
                 "visibility": {
                     "label": "見える範囲",
                         "street": "5~20m(16~65フィート)"
                     }
                 },
+                "volcano/status": {
+                    "label": "火山の状態",
+                    "options": {
+                        "active": "活火山",
+                        "dormant": "休火山",
+                        "extinct": "死火山"
+                    }
+                },
                 "volcano/type": {
                     "label": "火山地形の種類",
                     "options": {
                         "stratovolcano": "成層火山"
                     }
                 },
+                "voltage": {
+                    "label": "電圧"
+                },
+                "voltage/primary": {
+                    "label": "主電圧"
+                },
+                "voltage/secondary": {
+                    "label": "第二電圧"
+                },
+                "voltage/tertiary": {
+                    "label": "第三電圧"
+                },
                 "wall": {
                     "label": "種類"
                 },
                     "label": "給水所の場所"
                 },
                 "waterway": {
-                    "label": "水路区分"
+                    "label": "水路の種類"
                 },
                 "website": {
                     "label": "ウェブサイト",
                     "placeholder": "http://example.com/"
                 },
                 "wetland": {
-                    "label": "タイプ"
+                    "label": "種類"
                 },
                 "wheelchair": {
                     "label": "車椅子の利用可否"
                 },
                 "wikipedia": {
                     "label": "Wikipedia"
+                },
+                "windings": {
+                    "label": "コイル数",
+                    "placeholder": "1, 2, 3..."
+                },
+                "windings/configuration": {
+                    "label": "コイルの構成",
+                    "options": {
+                        "delta": "Delta",
+                        "leblanc": "Leblanc",
+                        "open": "Open",
+                        "open-delta": "Open Delta",
+                        "scott": "Scott",
+                        "star": "Star / Wye",
+                        "zigzag": "Zig Zag"
+                    }
                 }
             },
             "presets": {
                 },
                 "advertising/billboard": {
                     "name": "広告用看板",
-                    "terms": "掲示板"
+                    "terms": "掲示板, 看板"
                 },
                 "aerialway": {
                     "name": "索道"
                     "terms": "ロープタウリフト"
                 },
                 "aerialway/station": {
-                    "name": "索道駅",
-                    "terms": "索道駅, ロープウェイ駅, リフト駅, 駅"
+                    "name": "索道駅"
                 },
                 "aerialway/t-bar": {
                     "name": "Tバーリフト",
                 },
                 "amenity/animal_boarding": {
                     "name": "ペットホテル",
-                    "terms": "ペットホテル"
+                    "terms": "ペットホテル, 動物, ホテル"
                 },
                 "amenity/animal_breeding": {
                     "name": "動物繁殖施設",
                 },
                 "amenity/arts_centre": {
                     "name": "アートセンター",
-                    "terms": "アートセンター"
+                    "terms": "アートセンター, 芸術, 美術"
                 },
                 "amenity/atm": {
                     "name": "ATM",
-                    "terms": "ATM, CD, 現金自動預払機"
+                    "terms": "ATM, CD, 現金自動預払機, お金, 金融"
                 },
                 "amenity/bank": {
                     "name": "銀行",
-                    "terms": "銀行, 信用金庫, 信用組合"
+                    "terms": "銀行, 信用金庫, 信用組合, お金, 金融"
                 },
                 "amenity/bar": {
                     "name": "バー",
-                    "terms": "バー, 飲み屋, 呑み屋, ばー, スナック"
+                    "terms": "バー, 飲み屋, 呑み屋, ばー, スナック, 酒, アルコール, ウィスキー, ブランデー, ワイン, 軽食, カラオケスナック, フィリピンパブ, 飲食店, 呑む, 飲む, ショットバー"
                 },
                 "amenity/bbq": {
-                    "name": "バーベキュー/グリル",
-                    "terms": "バーベキュー, グリル, BBQ, 飯盒炊爨"
+                    "name": "バーベキュー/グリル",
+                    "terms": "バーベキュー, グリル, BBQ, 飯盒炊爨, アウトドア, 娯楽, レジャー"
                 },
                 "amenity/bench": {
                     "name": "ベンチ",
-                    "terms": "ベンチ, 椅子, いす, 腰掛け"
+                    "terms": "ベンチ, 椅子, いす, 腰掛け, 公園"
                 },
                 "amenity/bicycle_parking": {
                     "name": "駐輪場",
-                    "terms": "駐輪場, 自転車駐車場"
+                    "terms": "駐輪場, 自転車駐車場"
                 },
                 "amenity/bicycle_rental": {
                     "name": "レンタサイクル",
-                    "terms": "レンタサイクル"
+                    "terms": "レンタサイクル, 自転車"
                 },
                 "amenity/bicycle_repair_station": {
                     "name": "自転車修理店",
                 },
                 "amenity/biergarten": {
                     "name": "ビアガーデン",
-                    "terms": "ビアガーデン"
+                    "terms": "ビアガーデン, ビール, 酒, アルコール, 軽食, 呑む, 飲む, 飲食店, 食べる, 食事, 料理, 飲み屋"
                 },
                 "amenity/boat_rental": {
                     "name": "貸しボート",
-                    "terms": "貸しボート"
+                    "terms": "貸しボート, ボート, 公園, 娯楽, レジャー"
                 },
                 "amenity/bureau_de_change": {
-                    "name": "両替",
-                    "terms": "両替商"
+                    "name": "両替",
+                    "terms": "両替商, お金, 金融, 両替"
                 },
                 "amenity/bus_station": {
-                    "name": "バスターミナル",
-                    "terms": "バスターミナル, バス停, バスステーション"
+                    "name": "バスターミナル(旧:単独)"
                 },
                 "amenity/cafe": {
                     "name": "喫茶店",
-                    "terms": "喫茶店, カフェ"
+                    "terms": "喫茶店, カフェ, コーヒー, 珈琲, 紅茶, ジュース, 軽食, 飲み物, 食事, 食べる, 休憩, 飲食店"
+                },
+                "amenity/car_pooling": {
+                    "name": "カープール",
+                    "terms": "相乗り, カープール, 自動車"
                 },
                 "amenity/car_rental": {
                     "name": "レンタカー",
-                    "terms": "レンタカー, 貸自動車, カーレンタル"
+                    "terms": "レンタカー, 貸自動車, カーレンタル, 自動車"
                 },
                 "amenity/car_sharing": {
                     "name": "カーシェアリング",
-                    "terms": "カーシェアリング, レンタカー"
+                    "terms": "カーシェアリング, レンタカー, 自動車"
                 },
                 "amenity/car_wash": {
-                    "name": "車の洗浄",
-                    "terms": "洗車機, 洗車, 車洗浄, カーウォッシュ"
+                    "name": "洗車場",
+                    "terms": "洗車機, 洗車, 車洗浄, カーウォッシュ, 自動車"
                 },
                 "amenity/casino": {
                     "name": "カジノ",
-                    "terms": "カジノ, 賭博場"
+                    "terms": "カジノ, 賭博場, ギャンブル, 娯楽, アダルト"
                 },
                 "amenity/charging_station": {
                     "name": "充電スタンド",
-                    "terms": "充電ステーション, 急速充電システム, 充電スタンド, 給電スタンド"
+                    "terms": "充電ステーション, 急速充電システム, 充電スタンド, 給電スタンド, 自動車"
                 },
                 "amenity/childcare": {
-                    "name": "保育園/幼稚園",
-                    "terms": "保育園, 幼稚園, チャイルドケア, ナーセリー"
+                    "name": "保育",
+                    "terms": "保育園, 幼稚園, チャイルドケア, ナーセリー, 育児"
                 },
                 "amenity/cinema": {
                     "name": "映画館",
-                    "terms": "映画館, 上映施設, スクリーン, 銀幕"
+                    "terms": "映画館, 上映施設, スクリーン, 銀幕, シネマ, 芸術, 娯楽, カルチャー"
                 },
                 "amenity/clinic": {
-                    "name": "クリニック",
-                    "terms": "クリニック"
+                    "name": "クリニック(中規模病院)",
+                    "terms": "クリニック, 病院, 医療"
+                },
+                "amenity/clinic/abortion": {
+                    "name": "中絶クリニック",
+                    "terms": "中絶クリニック, 病院, 医療"
+                },
+                "amenity/clinic/fertility": {
+                    "name": "不妊クリニック",
+                    "terms": "不妊クリニック, 病院, 医療"
                 },
                 "amenity/clock": {
                     "name": "時計",
-                    "terms": "時計"
+                    "terms": "時計, クロック, 公園, 駅"
                 },
                 "amenity/college": {
-                    "name": "短大・高専・専門学校の敷地",
-                    "terms": "キャンパス"
+                    "name": "短大・高専・専門学校(代表点または敷地)",
+                    "terms": "キャンパス, 短大, 高専, 専門学校, , 教育, 学校"
                 },
                 "amenity/community_centre": {
                     "name": "コミュニティセンター",
-                    "terms": "公民館"
+                    "terms": "公民館, 市民センター, 市民活動"
                 },
                 "amenity/compressed_air": {
                     "name": "空気入れ",
-                    "terms": "空気入れ, エアー調整"
+                    "terms": "空気入れ, エアー調整, 自転車"
                 },
                 "amenity/courthouse": {
                     "name": "裁判所",
-                    "terms": "裁判所"
+                    "terms": "裁判所, 法廷"
                 },
                 "amenity/coworking_space": {
                     "name": "コワーキングスペース"
                 },
                 "amenity/crematorium": {
                     "name": "火葬場",
-                    "terms": "火葬場"
+                    "terms": "火葬場, 葬儀"
                 },
                 "amenity/dentist": {
                     "name": "歯医者",
-                    "terms": "歯科, 歯医者, 歯科医"
+                    "terms": "歯科, 歯医者, 歯科医, 病院, 医療"
                 },
                 "amenity/doctors": {
-                    "name": "医院",
-                    "terms": "医院, 町医者, 診療所, 医者"
+                    "name": "医院(小規模病院)",
+                    "terms": "医院, 町医者, 診療所, 医者, 病院, 医療"
                 },
                 "amenity/dojo": {
                     "name": "道場",
-                    "terms": "道場"
+                    "terms": "道場, スポーツ"
                 },
                 "amenity/drinking_water": {
                     "name": "水飲み場",
-                    "terms": "水飲み場, 水道, 飲用水, 飲料水, 飲み水, 蛇口"
+                    "terms": "水飲み場, 水道, 飲用水, 飲料水, 飲み水, 蛇口, 公園"
                 },
                 "amenity/driving_school": {
                     "name": "自動車教習所",
-                    "terms": "Driving School, ドライビングスクール, 教習所, 自動車, 自動車教習所, 車, 学校"
+                    "terms": "Driving School, ドライビングスクール, 教習所, 自動車, 自動車教習所, 車, 学校, 教育"
                 },
                 "amenity/embassy": {
                     "name": "大使館",
                 },
                 "amenity/fast_food": {
                     "name": "ファストフード",
-                    "terms": "ファストフード店, ファストフード, ジャンクフード, ジャンク, ファーストフード"
+                    "terms": "ファストフード店, ファストフード, ジャンクフード, ジャンク, ファーストフード, 飲食店, 軽食, 食事, 料理, 食べる. ハンバーガー, フライドチキン, 立ち食い"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "フェリー乗り場",
-                    "terms": "フェリーターミナル, 渡船, 船着場"
+                    "name": "フェリー乗り場 / ターミナル"
                 },
                 "amenity/fire_station": {
                     "name": "消防署",
-                    "terms": "消防署, 消防団, 火消し"
+                    "terms": "消防署, 消防団, 火消し, 消防局, 救命"
                 },
                 "amenity/food_court": {
                     "name": "フードコート",
-                    "terms": "フードコート"
+                    "terms": "フードコート, 飲食店, 食べる, 料理, 食事"
                 },
                 "amenity/fountain": {
                     "name": "噴水",
-                    "terms": "泉,噴水"
+                    "terms": "泉,噴水, 公園"
                 },
                 "amenity/fuel": {
                     "name": "ガソリンスタンド",
-                    "terms": "ガソリンスタンド, ガス, ガスステーション"
+                    "terms": "ガソリンスタンド, ガス, ガスステーション, 自動車, バイク, 燃料"
                 },
                 "amenity/grave_yard": {
-                    "name": "(教会・寺院にある)墓所",
-                    "terms": "墓地, 霊園, 墓場, お墓, 墓苑"
+                    "name": "墓地(宗教施設内など、小)",
+                    "terms": "墓地, 霊園, 墓場, お墓, 墓苑, 墓所"
                 },
                 "amenity/grit_bin": {
-                    "name": "砂箱",
-                    "terms": "砂箱, 氷結防止"
+                    "name": "砂箱(降雪対策)",
+                    "terms": "砂箱, 氷結防止, 道路設備"
                 },
                 "amenity/hospital": {
-                    "name": "大規模病院の敷地",
-                    "terms": "病院の敷地"
+                    "name": "大規模病院(代表点または敷地)",
+                    "terms": "病院の敷地, 病院, 医療"
                 },
                 "amenity/hunting_stand": {
                     "name": "狩猟スタンド",
-                    "terms": "狩猟スタンド"
+                    "terms": "狩猟スタンド, 娯楽, スポーツ, 小屋"
                 },
                 "amenity/ice_cream": {
                     "name": "アイスクリーム店",
-                    "terms": "アイスクリームパーラー"
+                    "terms": "アイスクリームパーラー, 飲食店, 食べる, 軽食"
                 },
                 "amenity/internet_cafe": {
                     "name": "インターネットカフェ",
-                    "terms": "ネカフェ"
+                    "terms": "ネカフェ, ネットカフェ, 漫画喫茶, 漫喫, 休憩, カフェ"
                 },
                 "amenity/kindergarten": {
-                    "name": "保育園/幼稚園の敷地",
-                    "terms": "幼稚園の敷地, 保育園の敷地"
+                    "name": "幼稚園/保育園(代表点または敷地)",
+                    "terms": "幼稚園の敷地, 保育園の敷地, 保育園, 幼稚園, 教育, 学校, 育児"
                 },
                 "amenity/library": {
                     "name": "図書館",
-                    "terms": "図書館, ライブラリ, ライブラリー"
+                    "terms": "図書館, ライブラリ, ライブラリー, 教育, 本"
+                },
+                "amenity/love_hotel": {
+                    "name": "ラブホテル",
+                    "terms": "ラブホテル, 宿, ホテル, 休憩, アダルト"
                 },
                 "amenity/marketplace": {
                     "name": "市場",
-                    "terms": "市場, マーケット, 朝市, マルシェ"
+                    "terms": "市場, マーケット, 朝市, マルシェ, 食品, 雑貨, 買い物, ショッピング"
                 },
                 "amenity/motorcycle_parking": {
                     "name": "オートバイの駐車場",
                     "terms": "バイクの駐車場, 二輪駐車場, 二輪駐輪場, 駐車場, 駐輪場"
                 },
+                "amenity/music_school": {
+                    "name": "音楽学校",
+                    "terms": "音楽学校, ミュージック・スクール, 教習所, カラオケ教室, 音楽教室, 学校, 教育"
+                },
                 "amenity/nightclub": {
                     "name": "ナイトクラブ",
-                    "terms": "ナイトクラブ"
+                    "terms": "ナイトクラブ, アルコール, 酒, 軽食, ショー, ショーパブ, ダンス, キャバレー, ディスコ, クラブ, ライブハウス, 音楽, 娯楽, アダルト, レジャー"
                 },
                 "amenity/nursing_home": {
                     "name": "介護施設"
                 },
                 "amenity/parking": {
                     "name": "駐車場",
-                    "terms": "駐車場, パーキング"
+                    "terms": "駐車場, パーキング, 自動車"
                 },
                 "amenity/parking_entrance": {
                     "name": "駐車場の出入口",
-                    "terms": "駐車場の出入口"
+                    "terms": "駐車場の出入口, 自動車"
                 },
                 "amenity/parking_space": {
-                    "name": "駐車区画",
-                    "terms": "駐車区画, 駐車スペース"
+                    "name": "駐車区画(1台ごとの)",
+                    "terms": "駐車区画, 駐車スペース, 自動車, 駐車場"
                 },
                 "amenity/pavilion": {
                     "name": "東屋",
-                    "terms": "東屋"
+                    "terms": "東屋, あずまや"
                 },
                 "amenity/pharmacy": {
-                    "name": "薬局",
-                    "terms": "調剤, 調剤薬局, 薬局, 薬店, ドラッグストア, 処方箋"
+                    "name": "薬局・ドラッグストア",
+                    "terms": "調剤, 調剤薬局, 薬局, 薬店, ドラッグストア, 処方箋, 医療, 健康, 化粧品, コスメ"
                 },
                 "amenity/place_of_worship": {
                     "name": "宗教施設",
-                    "terms": "礼拝所, 祈りの場所, 参拝所, 寺社, 神社"
+                    "terms": "礼拝所, 祈りの場所, 参拝所, 寺社, 神社, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/buddhist": {
                     "name": "仏教寺院",
-                    "terms": "寺院, 仏閣, 寺, 寺社, 院, 堂, お寺, 寺"
+                    "terms": "寺院, 仏閣, 寺, 寺社, 院, 堂, お寺, 寺, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/christian": {
                     "name": "教会",
-                    "terms": "教会, 礼拝堂, 礼拝所, チャーチ"
+                    "terms": "教会, 礼拝堂, 礼拝所, チャーチ, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/hindu": {
                     "name": "ヒンドゥー教寺院",
-                    "terms": "ヒンズー教寺院"
+                    "terms": "ヒンズー教寺院, 寺院, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/jewish": {
                     "name": "シナゴーグ",
-                    "terms": "シナゴーグ"
+                    "terms": "シナゴーグ, 寺院, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/muslim": {
                     "name": "モスク",
-                    "terms": "モスク"
+                    "terms": "モスク, 寺院, 信仰, 宗教"
                 },
                 "amenity/place_of_worship/shinto": {
                     "name": "神社",
-                    "terms": "神社, 大社, 神宮, 天満宮, 稲荷, 八幡, 天神, 社"
+                    "terms": "神社, 大社, 神宮, 天満宮, 稲荷, 八幡, 天神, 社, 信仰, 宗教"
+                },
+                "amenity/place_of_worship/sikh": {
+                    "name": "シク教寺院",
+                    "terms": "シク教寺院, シーク教寺院, 寺院, 信仰, 宗教"
+                },
+                "amenity/place_of_worship/taoist": {
+                    "name": "道教寺院",
+                    "terms": "道教, 寺院, 信仰, 宗教"
                 },
                 "amenity/planetarium": {
                     "name": "プラネタリウム",
-                    "terms": "プラネターリアム"
+                    "terms": "プラネターリアム, カルチャー, 娯楽, レジャー"
                 },
                 "amenity/police": {
                     "name": "警察",
                     "terms": "郵便局"
                 },
                 "amenity/prison": {
-                    "name": "刑務所の敷地",
-                    "terms": "刑務所, 刑務所の敷地, 監獄, 拘置所, 少年院"
+                    "name": "刑務所(代表点または敷地)",
+                    "terms": "刑務所, 刑務所の敷地, 監獄, 少年院"
                 },
                 "amenity/pub": {
                     "name": "居酒屋",
-                    "terms": "パブ, 居酒屋, 焼き鳥屋"
+                    "terms": "パブ, 居酒屋, 焼き鳥屋, 酒, 飲む, 呑む, 酒場, 立ち飲み, アルコール, 料理, 焼酎, ホルモン焼き, 食事, 料理, ワイン, ビール, 飲食店, 飲み屋, 小料理屋, 宴会, 炉端焼き, 焼とん"
                 },
                 "amenity/public_bath": {
                     "name": "公衆浴場",
-                    "terms": "銭湯, 大衆浴場, 温泉"
+                    "terms": "銭湯, 大衆浴場, 温泉, 休憩, 娯楽, お風呂, 風呂, レジャー"
                 },
                 "amenity/public_bookcase": {
                     "name": "公共の本棚",
-                    "terms": "公共の本棚"
+                    "terms": "公共の本棚, 図書, 本"
                 },
                 "amenity/ranger_station": {
                     "name": "レンジャーの詰所",
-                    "terms": "レンジャーの詰所, レンジャーステーション"
+                    "terms": "レンジャーの詰所, レンジャーステーション, 救命"
                 },
                 "amenity/recycling": {
-                    "name": "リサイクルボックス",
-                    "terms": "リサイクルボックス, 回収箱, リサイクル"
+                    "name": "リサイクル容器",
+                    "terms": "リサイクル容器"
                 },
                 "amenity/recycling_centre": {
                     "name": "リサイクルセンター",
                 },
                 "amenity/restaurant": {
                     "name": "レストラン",
-                    "terms": "レストラン, 食堂"
+                    "terms": "レストラン, 食堂, 飲食店, 食事, 食べる, 料理, アルコール, 酒, ワイン, 料亭, 割烹"
                 },
                 "amenity/sanitary_dump_station": {
                     "name": "キャンピングカー用汚物廃棄所",
                     "terms": "汚物廃棄所"
                 },
                 "amenity/school": {
-                    "name": "学校の敷地",
-                    "terms": "学校の敷地, 校庭"
+                    "name": "学校(代表点または敷地)",
+                    "terms": "学校の敷地, 学校, 小学校, 中学校, 高校, 教育"
                 },
                 "amenity/scrapyard": {
                     "name": "自動車解体場"
                 },
                 "amenity/shelter": {
                     "name": "(風雨をしのぐための)休憩所",
-                    "terms": "避難所, シェルター, 逃げ場, 雨宿り, 東屋, あずまや, 四阿, しあ, 休憩所, 屋根"
+                    "terms": "避難所, シェルター, 逃げ場, 雨宿り, 東屋, あずまや, 四阿, しあ, 休憩所, 屋根, アウトドア, 小屋"
                 },
                 "amenity/shower": {
                     "name": "シャワー室",
                     "terms": "シャワールーム"
                 },
+                "amenity/smoking_area": {
+                    "name": "喫煙所",
+                    "terms": "喫煙所, 喫煙エリア, たばこ, タバコ"
+                },
                 "amenity/social_facility": {
                     "name": "福祉施設",
                     "terms": "福祉施設, 支援施設"
                 },
                 "amenity/social_facility/food_bank": {
                     "name": "フードバンク",
-                    "terms": "フードバンク"
+                    "terms": "フードバンク, 食べ物, 福祉"
                 },
                 "amenity/social_facility/group_home": {
                     "name": "老人ホーム",
-                    "terms": "老人ホーム, グループホーム"
+                    "terms": "老人ホーム, グループホーム, 福祉"
                 },
                 "amenity/social_facility/homeless_shelter": {
                     "name": "ホームレス緊急一時宿泊施設",
-                    "terms": "ホームレス緊急一時宿泊施設, ホームレスシェルター, 簡易宿泊所"
+                    "terms": "ホームレス緊急一時宿泊施設, ホームレスシェルター, 簡易宿泊所, 福祉, 保護施設"
                 },
                 "amenity/social_facility/nursing_home": {
                     "name": "介護施設",
-                    "terms": "介護施設, 老人ホーム"
+                    "terms": "介護施設, 老人ホーム, 福祉"
                 },
                 "amenity/studio": {
                     "name": "スタジオ",
-                    "terms": "スタジオ"
+                    "terms": "スタジオ, 番組製作, 音楽"
                 },
                 "amenity/swimming_pool": {
                     "name": "遊泳プール"
                 },
                 "amenity/theatre": {
                     "name": "劇場",
-                    "terms": "劇場, ホール, 映画館"
+                    "terms": "劇場, ホール, 映画館, 娯楽, カルチャー"
                 },
                 "amenity/toilets": {
                     "name": "トイレ",
-                    "terms": "トイレ,便所"
+                    "terms": "トイレ,便所, 公園, 公衆トイレ"
                 },
                 "amenity/townhall": {
                     "name": "役場",
                     "terms": "市役所, 区役所, 町役場, 村役場, 市庁, 役所"
                 },
                 "amenity/university": {
-                    "name": "大学の敷地",
-                    "terms": "大学の敷地, キャンパス"
+                    "name": "大学(代表点または敷地)",
+                    "terms": "大学の敷地, キャンパス, 大学, 教育, 学校"
                 },
                 "amenity/vending_machine": {
                     "name": "自動販売機",
                 },
                 "amenity/vending_machine/cigarettes": {
                     "name": "たばこ自動販売機",
-                    "terms": "たばこ, 自動販売機, 自販機"
+                    "terms": "たばこ, 自動販売機, 自販機, 嗜好品, タバコ"
                 },
                 "amenity/vending_machine/condoms": {
                     "name": "コンドーム自動販売機",
                     "name": "犬の糞入れ自動販売機",
                     "terms": "犬の糞入れ, 自動販売機, 自販機"
                 },
+                "amenity/vending_machine/feminine_hygiene": {
+                    "name": "生理用品自動販売機",
+                    "terms": "生理用品自動販売機, 自販機, 自動販売機"
+                },
                 "amenity/vending_machine/news_papers": {
                     "name": "新聞自動販売機"
                 },
                 },
                 "amenity/vending_machine/parking_tickets": {
                     "name": "パーキングチケット発給機",
-                    "terms": "パーキングチケット, パーキングメーター, 駐車券, 券売機, 自動券売機, 自動販売機, 自販機, 自動発券機, 発券機"
+                    "terms": "パーキングチケット, パーキングメーター, 駐車券, 券売機, 自動券売機, 自動販売機, 自販機, 自動発券機, 発券機, 駐車場"
                 },
                 "amenity/vending_machine/public_transport_tickets": {
                     "name": "切符販売機",
                 },
                 "amenity/veterinary": {
                     "name": "獣医",
-                    "terms": "獣医, ペット医"
+                    "terms": "獣医, ペット医, 病院, 医療"
+                },
+                "amenity/waste/dog_excrement": {
+                    "name": "犬の便入れ",
+                    "terms": "犬の便入れ, 動物"
                 },
                 "amenity/waste_basket": {
                     "name": "ゴミ箱",
-                    "terms": "ゴミ箱, ごみ箱, "
+                    "terms": "ゴミ箱, ごみ箱, 公園"
                 },
                 "amenity/waste_disposal": {
                     "name": "ゴミ収集ボックス",
-                    "terms": "ゴミステーション, ゴミ集積所, ゴミ捨て場, ゴミ置き場, ゴミ, ゴミ箱, ゴミコンテナ, ゴミ回収, ダストボックス"
+                    "terms": "ゴミステーション, ゴミ集積所, ゴミ捨て場, ゴミ置き場, ゴミ, ゴミ箱, ゴミコンテナ, ゴミ回収, ダストボックス, ごみ, 公園"
                 },
                 "amenity/waste_transfer_station": {
                     "name": "ゴミ集積場",
                 },
                 "amenity/water_point": {
                     "name": "キャンピングカー用の給水施設",
-                    "terms": "給水, 補給, 給水所, キャンピングカー, 給水塔, 飲料水, 飲水, 飲み水, キャンプ場, オートキャンプ場"
+                    "terms": "給水, 補給, 給水所, キャンピングカー, 給水塔, 飲料水, 飲水, 飲み水, キャンプ場, オートキャンプ場, アウトドア"
                 },
                 "amenity/watering_place": {
                     "name": "動物の水飲み場",
                     "name": "道路の種類",
                     "terms": "道路の種類"
                 },
+                "attraction/amusement_ride": {
+                    "name": "遊園地の乗り物",
+                    "terms": "遊園地の乗り物, 乗り物, アトラクション, 娯楽"
+                },
+                "attraction/animal": {
+                    "name": "動物",
+                    "terms": "動物"
+                },
+                "attraction/big_wheel": {
+                    "name": "大観覧車",
+                    "terms": "大観覧車, アトラクション"
+                },
+                "attraction/bumper_car": {
+                    "name": "バンパーカー",
+                    "terms": "バンパーカー, アトラクション"
+                },
+                "attraction/bungee_jumping": {
+                    "name": "バンジー・ジャンプ",
+                    "terms": "バンジー・ジャンプ, アトラクション"
+                },
                 "attraction/carousel": {
                     "name": "メリーゴーラウンド",
-                    "terms": "回転木馬, メリーゴーランド"
+                    "terms": "回転木馬, メリーゴーランド, アトラクション"
+                },
+                "attraction/dark_ride": {
+                    "name": "ダークライド",
+                    "terms": "ダークライド, アトラクション"
+                },
+                "attraction/drop_tower": {
+                    "name": "落下塔",
+                    "terms": "落下塔, アトラクション"
+                },
+                "attraction/pirate_ship": {
+                    "name": "海賊船",
+                    "terms": "海賊船, アトラクション"
+                },
+                "attraction/river_rafting": {
+                    "name": "急流下り",
+                    "terms": "急流下り, 川下り, ラフティング, アトラクション"
                 },
                 "attraction/roller_coaster": {
                     "name": "ローラーコースター",
-                    "terms": "ジェットコースター"
+                    "terms": "ジェットコースター, アトラクション"
+                },
+                "attraction/train": {
+                    "name": "観光列車",
+                    "terms": "観光列車, アトラクション"
                 },
                 "attraction/water_slide": {
                     "name": "ウォータースライダー",
-                    "terms": "ウォータースライダー, 滑り台, ウォータースライド"
+                    "terms": "ウォータースライダー, 滑り台, ウォータースライド, アトラクション"
                 },
                 "barrier": {
                     "name": "障害物",
                 },
                 "barrier/block": {
                     "name": "車止めブロック",
-                    "terms": "ブロック, 車止め"
+                    "terms": "ブロック, 車止め, 障害物, バリア"
                 },
                 "barrier/bollard": {
                     "name": "車止め杭",
-                    "terms": "車止め杭"
+                    "terms": "車止め杭, 障害物, バリア, ボラード, 杭"
                 },
                 "barrier/border_control": {
                     "name": "国境検問所",
-                    "terms": "国境検問所, 検問所"
+                    "terms": "国境検問所, 検問所, 障害物, バリア"
                 },
                 "barrier/cattle_grid": {
                     "name": "家畜脱出防止溝",
-                    "terms": "家畜脱出防止溝"
+                    "terms": "家畜脱出防止溝, 障害物, バリア"
                 },
                 "barrier/city_wall": {
                     "name": "市壁",
-                    "terms": "市壁"
+                    "terms": "市壁, 障害物, バリア"
                 },
                 "barrier/cycle_barrier": {
                     "name": "自転車止め",
-                    "terms": "自転車止め"
+                    "terms": "自転車止め, 障害物, バリア"
                 },
                 "barrier/ditch": {
                     "name": "塹壕・空堀",
-                    "terms": "塹壕, 空堀, 堀, 溝, 谷"
+                    "terms": "塹壕, 空堀, 堀, 溝, 谷, 障害物, バリア"
                 },
                 "barrier/entrance": {
                     "name": "出入口"
                 },
                 "barrier/fence": {
                     "name": "フェンス",
-                    "terms": "フェンス, 柵"
+                    "terms": "フェンス, 柵, 障害物, バリア"
                 },
                 "barrier/gate": {
                     "name": "門",
-                    "terms": "門, ゲート, 鳥居"
+                    "terms": "門, ゲート, 鳥居, 障害物, バリア"
                 },
                 "barrier/hedge": {
                     "name": "生垣",
-                    "terms": "生垣"
+                    "terms": "生垣, 障害物, バリア"
+                },
+                "barrier/kerb": {
+                    "name": "縁石",
+                    "terms": "縁石, 段差, 障害物, バリア"
                 },
                 "barrier/kissing_gate": {
                     "name": "キッシングゲート",
-                    "terms": "キッシングゲート, V字形自在門, U字形自在門"
+                    "terms": "キッシングゲート, V字形自在門, U字形自在門, 障害物, バリア"
                 },
                 "barrier/lift_gate": {
                     "name": "遮断機",
-                    "terms": "遮断機, 門"
+                    "terms": "遮断機, 門, 障害物, バリア"
                 },
                 "barrier/retaining_wall": {
                     "name": "擁壁",
-                    "terms": "擁壁"
+                    "terms": "擁壁, 障害物, バリア"
                 },
                 "barrier/stile": {
                     "name": "通路",
-                    "terms": "通路, 踏み越し段"
+                    "terms": "通路, 踏み越し段, 障害物, バリア"
                 },
                 "barrier/toll_booth": {
-                    "name": "料金所",
-                    "terms": "料金所"
+                    "name": "料金所(道路、橋)",
+                    "terms": "料金所, 障害物, バリア"
                 },
                 "barrier/wall": {
                     "name": "壁",
-                    "terms": "壁"
+                    "terms": "壁, 障害物, バリア"
                 },
                 "boundary/administrative": {
                     "name": "行政境界",
                     "terms": "行政境界, 都道府県境, 都境, 道境, 府境, 県境, 市区町村境, 市境, 区境, 町境, 村境"
                 },
                 "building": {
-                    "name": "建物",
+                    "name": "建物全般",
                     "terms": "建物, ビル"
                 },
                 "building/apartments": {
                     "name": "集合住宅",
-                    "terms": "アパート, マンション"
+                    "terms": "アパート, マンション, 集合住宅, 住宅, 住居"
                 },
                 "building/barn": {
                     "name": "納屋",
-                    "terms": "納屋"
+                    "terms": "納屋, 小屋"
+                },
+                "building/boathouse": {
+                    "name": "ボートハウス",
+                    "terms": "ボートハウス, ボート小屋"
+                },
+                "building/bungalow": {
+                    "name": "バンガロー(建物)",
+                    "terms": "バンガロー, コテージ, ダーチャ"
                 },
                 "building/bunker": {
                     "name": "掩体壕"
                 },
                 "building/cabin": {
-                    "name": "ログハウス",
-                    "terms": "ログハウス"
+                    "name": "ログハウス(建物)",
+                    "terms": "ログハウス, キャビン, 丸太小屋"
                 },
                 "building/cathedral": {
-                    "name": "聖堂の建物",
-                    "terms": "聖堂"
+                    "name": "聖堂(建物)",
+                    "terms": "聖堂, カテドラル, 宗教"
                 },
                 "building/chapel": {
-                    "name": "教会の建物",
-                    "terms": "教会"
+                    "name": "礼拝堂(建物)",
+                    "terms": "礼拝堂, チャペル, 宗教"
                 },
                 "building/church": {
-                    "name": "教会の建物",
-                    "terms": "教会"
+                    "name": "教会(建物)",
+                    "terms": "教会, チャーチ, 宗教"
+                },
+                "building/civic": {
+                    "name": "市民向け施設(建物)",
+                    "terms": "市民向け施設, 市民施設"
                 },
                 "building/college": {
-                    "name": "短大・高専・専門学校の建物",
-                    "terms": "短大, 高専, 高等専門学校, 短期大学, 専門, 専門学校"
+                    "name": "短大・高専・専門学校(建物)",
+                    "terms": "短大, 高専, 高等専門学校, 短期大学, 専門, 専門学校, 教育, 学校"
                 },
                 "building/commercial": {
                     "name": "オフィスビル",
-                    "terms": "オフィスビル"
+                    "terms": "オフィスビル, ビジネスビル"
                 },
                 "building/construction": {
                     "name": "建設中の建物",
-                    "terms": "建設中の建物"
+                    "terms": "建設中の建物, 工事中の建物"
                 },
                 "building/detached": {
                     "name": "一戸建て住宅",
-                    "terms": "æ»\9eå\9c¨æ\99\82é\96\93"
+                    "terms": "æ\88¸å»ºã\81¦ä½\8få®\85, ä½\8få®\85, ä½\8få±\85"
                 },
                 "building/dormitory": {
                     "name": "寮",
-                    "terms": "寮"
+                    "terms": "寮, 独身寮, 住宅, 住居"
                 },
                 "building/entrance": {
                     "name": "出入口"
                 },
+                "building/farm": {
+                    "name": "農家(建物)",
+                    "terms": "農家, 住宅, 住居, 農業"
+                },
                 "building/garage": {
-                    "name": "車庫",
-                    "terms": "車庫, ガレージ"
+                    "name": "車庫(建物、小)",
+                    "terms": "車庫, ガレージ, 自動車"
                 },
                 "building/garages": {
-                    "name": "集合車庫",
-                    "terms": "集合車庫"
+                    "name": "集合車庫(建物、大)",
+                    "terms": "集合車庫, 車庫, ガレージ"
                 },
                 "building/greenhouse": {
-                    "name": "温室",
-                    "terms": "温室"
+                    "name": "温室(建物)",
+                    "terms": "温室, ビニールハウス, 農業, 野菜"
                 },
                 "building/hospital": {
-                    "name": "病院の建物",
-                    "terms": "病院の建物, 病棟"
+                    "name": "病院(建物)",
+                    "terms": "病院の建物, 病棟, 病院"
                 },
                 "building/hotel": {
-                    "name": "ホテルの建物",
-                    "terms": "ホテルの建物, 宿泊棟"
+                    "name": "ホテル(建物)",
+                    "terms": "ホテルの建物, 宿泊棟, ホテル"
                 },
                 "building/house": {
-                    "name": "ä¸\80æ\88¸å»ºã\81¦ä½\8få®\85",
-                    "terms": "ä¸\80æ\88¸å»ºã\81¦ä½\8få®\85"
+                    "name": "住宅",
+                    "terms": "ä½\8få®\85, æ°\91家, ä½\8få±\85"
                 },
                 "building/hut": {
                     "name": "小屋",
-                    "terms": "小屋, 休憩小屋, 漁師小屋, 狩猟小屋"
+                    "terms": "小屋, 休憩小屋, 漁師小屋, 狩猟小屋, 掘っ立て小屋"
                 },
                 "building/industrial": {
-                    "name": "工場",
+                    "name": "工場(建物)",
                     "terms": "工場"
                 },
                 "building/kindergarten": {
-                    "name": "保育園/幼稚園の建物",
-                    "terms": "保育園/幼稚園の建物"
+                    "name": "幼稚園/保育園(建物)",
+                    "terms": "幼稚園/保育園の建物, 保育園, 幼稚園, 教育, 学校"
+                },
+                "building/mosque": {
+                    "name": "モスク(建物)",
+                    "terms": "モスク, 宗教"
                 },
                 "building/public": {
-                    "name": "公共施設",
+                    "name": "公共施設(建物)",
                     "terms": "公共施設"
                 },
                 "building/residential": {
-                    "name": "ä½\8få®\85",
-                    "terms": "住宅, アパート, マンション"
+                    "name": "ä½\8få±\85å\85¨è\88¬ï¼\88建ç\89©ï¼\89",
+                    "terms": "住宅, アパート, マンション, 住居"
                 },
                 "building/retail": {
-                    "name": "å\95\86業æ\96½è¨­",
+                    "name": "åº\97è\88\97ç\94¨ã\81®å»ºç\89©",
                     "terms": "商業施設, 店舗, 商業ビル, 店"
                 },
                 "building/roof": {
                     "name": "屋根",
                     "terms": "屋根, 屋根付きテラス"
                 },
+                "building/ruins": {
+                    "name": "廃墟(建物)",
+                    "terms": "廃墟, 廃屋, あばら家, 空き家"
+                },
                 "building/school": {
-                    "name": "校舎",
-                    "terms": "校舎, 学校の建物"
+                    "name": "学校(建物)",
+                    "terms": "校舎, 学校の建物, 学校"
                 },
                 "building/semidetached_house": {
                     "name": "二世帯住宅",
-                    "terms": "セミデタッチドハウス, 二世帯住宅"
+                    "terms": "セミデタッチドハウス, 二世帯住宅, 住居, 住宅"
+                },
+                "building/service": {
+                    "name": "機械室(建物)",
+                    "terms": "機械室, 機械小屋, 小屋"
                 },
                 "building/shed": {
                     "name": "格納庫",
                 },
                 "building/stable": {
                     "name": "厩",
-                    "terms": "厩, 馬小屋"
+                    "terms": "厩, 馬小屋, 小屋"
+                },
+                "building/stadium": {
+                    "name": "スタジアム(建物)",
+                    "terms": "スタジアム, スポーツ"
                 },
                 "building/static_caravan": {
                     "name": "トレーラーハウス",
-                    "terms": "トレーラーハウス"
+                    "terms": "トレーラーハウス, アウトドア, レジャー"
+                },
+                "building/temple": {
+                    "name": "寺院(建物)",
+                    "terms": "寺院, 宗教, 信仰"
                 },
                 "building/terrace": {
                     "name": "テラスハウス",
-                    "terms": "テラスハウス, 長屋"
+                    "terms": "テラスハウス, 長屋, 住居, 住宅"
                 },
                 "building/train_station": {
                     "name": "駅舎"
                 },
+                "building/transportation": {
+                    "name": "公共交通機関(建物)",
+                    "terms": "公共交通機関"
+                },
                 "building/university": {
-                    "name": "大学",
-                    "terms": "大学, 大学の建物"
+                    "name": "大学(建物)",
+                    "terms": "大学, 大学の建物, 校舎, 教育, 学校"
                 },
                 "building/warehouse": {
                     "name": "倉庫",
                 },
                 "camp_site/camp_pitch": {
                     "name": "キャンプサイト",
-                    "terms": "キャンプサイト"
+                    "terms": "キャンプサイト, 娯楽, アウトドア, レジャー"
+                },
+                "circular": {
+                    "name": "円形サークル"
                 },
                 "club": {
                     "name": "クラブ",
                 },
                 "craft": {
                     "name": "工房",
-                    "terms": "工房"
+                    "terms": "工房, 職人"
                 },
                 "craft/basket_maker": {
                     "name": "かご製造所",
-                    "terms": "かご, 籠"
+                    "terms": "かご, 籠, 職人, 工房"
                 },
                 "craft/beekeeper": {
                     "name": "養蜂所",
-                    "terms": "養蜂所"
+                    "terms": "養蜂所, 職人, 工房"
                 },
                 "craft/blacksmith": {
                     "name": "鍛冶屋",
-                    "terms": "鍛冶屋"
+                    "terms": "鍛冶屋, 職人, 工房"
                 },
                 "craft/boatbuilder": {
                     "name": "ボート製造所",
-                    "terms": "ボート製造所"
+                    "terms": "ボート製造所, 職人, 工房"
                 },
                 "craft/bookbinder": {
                     "name": "製本所",
-                    "terms": "製本所"
+                    "terms": "製本所, 職人, 工房"
                 },
                 "craft/brewery": {
                     "name": "ビール醸造所",
-                    "terms": "ビール醸造所"
+                    "terms": "ビール醸造所, 職人, 工房"
                 },
                 "craft/carpenter": {
                     "name": "工務店",
-                    "terms": "工務店"
+                    "terms": "工務店, 職人, 工房, 大工, リフォーム"
                 },
                 "craft/carpet_layer": {
                     "name": "畳・カーペット工事店",
-                    "terms": "畳・カーペット工事店"
+                    "terms": "畳・カーペット工事店, 職人, 工房"
                 },
                 "craft/caterer": {
                     "name": "仕出し料理店",
-                    "terms": "仕出し料理店"
+                    "terms": "仕出し料理店, ケータリング"
+                },
+                "craft/chimney_sweeper": {
+                    "name": "煙突掃除人",
+                    "terms": "煙突掃除人, 職人, 工房"
                 },
                 "craft/clockmaker": {
                     "name": "時計製造所",
-                    "terms": "時計製造所"
+                    "terms": "時計製造所, 職人, 工房"
+                },
+                "craft/confectionery": {
+                    "name": "菓子屋(製造・販売)",
+                    "terms": "菓子製造所, 菓子製造直売所, 饅頭屋, まんじゅう屋, 煎餅屋, せんべい屋, 飴屋, 和菓子屋, 和菓子店, 職人, 工房, 食品, お菓子"
                 },
                 "craft/distillery": {
                     "name": "蒸留所",
-                    "terms": "<translate with synonyms or related terms for 'Distillery', separated by commas>"
+                    "terms": "<translate with synonyms or related terms for 'Distillery', separated by commas>, 職人, 工房"
                 },
                 "craft/dressmaker": {
                     "name": "衣服製造所",
-                    "terms": "衣服製造所"
+                    "terms": "衣服製造所, 職人, 工房"
                 },
                 "craft/electrician": {
                     "name": "電気工事店",
-                    "terms": "電気工事店"
+                    "terms": "電気工事店, 職人, 工房"
                 },
                 "craft/electronics_repair": {
                     "name": "電化製品修理店",
-                    "terms": "家電修理店, 電気機器修理店, 修理店, リペアショップ"
+                    "terms": "家電修理店, 電気機器修理店, 修理店, リペアショップ, 職人, 工房"
                 },
                 "craft/gardener": {
                     "name": "庭師",
-                    "terms": "庭師"
+                    "terms": "庭師, 職人, 工房"
                 },
                 "craft/glaziery": {
                     "name": "ガラス細工師",
-                    "terms": "ガラス細工師"
+                    "terms": "ガラス細工師, 職人, 工房"
                 },
                 "craft/handicraft": {
                     "name": "手工芸品",
-                    "terms": "手工芸品"
+                    "terms": "手工芸品, 職人, 工房, 雑貨"
                 },
                 "craft/hvac": {
                     "name": "空調設計",
-                    "terms": "空調設計"
+                    "terms": "空調設計, 職人"
                 },
                 "craft/insulator": {
                     "name": "断熱材",
-                    "terms": "断熱材"
+                    "terms": "断熱材, 職人"
                 },
                 "craft/jeweler": {
                     "name": "宝石加工"
                 },
                 "craft/key_cutter": {
-                    "name": "合鍵作成",
-                    "terms": "合鍵作成"
+                    "name": "合鍵作成(小店舗)",
+                    "terms": "合鍵作成, 職人, 錠前, カギ, 鍵"
                 },
                 "craft/locksmith": {
                     "name": "錠前師"
                 },
                 "craft/metal_construction": {
                     "name": "金属加工",
-                    "terms": "金属加工, 鋳造"
+                    "terms": "金属加工, 鋳造, 職人, 工房"
                 },
                 "craft/optician": {
                     "name": "眼鏡士"
                 },
                 "craft/painter": {
                     "name": "塗装業",
-                    "terms": "塗装業, 外装業, ペンキ屋"
+                    "terms": "塗装業, 外装業, ペンキ屋, 職人"
                 },
                 "craft/photographer": {
-                    "name": "写真",
-                    "terms": "カメラマン, 写真屋"
+                    "name": "写真",
+                    "terms": "カメラマン, 写真屋, 職人, 工房, 写真館"
                 },
                 "craft/photographic_laboratory": {
                     "name": "現像所",
-                    "terms": "現像所"
+                    "terms": "現像所, 職人, 工房"
                 },
                 "craft/plasterer": {
                     "name": "左官",
-                    "terms": "左官"
+                    "terms": "左官, 職人,"
                 },
                 "craft/plumber": {
                     "name": "配管工",
-                    "terms": "配管工"
+                    "terms": "配管工, 職人"
                 },
                 "craft/pottery": {
                     "name": "窯元",
-                    "terms": "窯元, 陶器製造業"
+                    "terms": "窯元, 陶器製造業, 職人, 工房"
                 },
                 "craft/rigger": {
                     "name": "艤装者",
-                    "terms": "艤装者"
+                    "terms": "艤装者, 職人, 工房"
                 },
                 "craft/roofer": {
                     "name": "屋根ふき職人",
-                    "terms": "屋根ふき職人"
+                    "terms": "屋根ふき職人, 職人"
                 },
                 "craft/saddler": {
                     "name": "馬具製造人",
-                    "terms": "馬具製造人"
+                    "terms": "馬具製造人, 職人"
                 },
                 "craft/sailmaker": {
                     "name": "製帆職人",
-                    "terms": "製帆職人"
+                    "terms": "製帆職人, 職人"
                 },
                 "craft/sawmill": {
                     "name": "製材",
-                    "terms": "製材"
+                    "terms": "製材, 職人"
                 },
                 "craft/scaffolder": {
                     "name": "足場職人",
-                    "terms": "足場職人, とび職"
+                    "terms": "足場職人, とび職, 職人"
+                },
+                "craft/sculptor": {
+                    "name": "彫刻製作所",
+                    "terms": "彫刻製作所, 職人, 工房"
                 },
                 "craft/shoemaker": {
                     "name": "製靴",
-                    "terms": "製靴, 靴製造"
+                    "terms": "製靴, 靴製造, 職人"
                 },
                 "craft/stonemason": {
                     "name": "石工",
-                    "terms": "石工, 石材加工"
+                    "terms": "石工, 石材加工, 職人, 工房"
                 },
                 "craft/tailor": {
                     "name": "仕立て屋"
                 },
                 "craft/tiler": {
                     "name": "タイル職人",
-                    "terms": "タイル職人"
+                    "terms": "タイル職人, 職人"
                 },
                 "craft/tinsmith": {
                     "name": "すず細工職人",
-                    "terms": "ブリキ屋, すず細工職人"
+                    "terms": "ブリキ屋, すず細工職人, 職人, 工房"
                 },
                 "craft/upholsterer": {
                     "name": "椅子張り職人",
-                    "terms": "椅子張り職人"
+                    "terms": "椅子張り職人, 職人"
                 },
                 "craft/watchmaker": {
                     "name": "時計製造業",
-                    "terms": "時計製造業"
+                    "terms": "時計製造業, 職人"
                 },
                 "craft/window_construction": {
                     "name": "窓職人",
-                    "terms": "窓職人"
+                    "terms": "窓職人, 職人"
                 },
                 "craft/winery": {
                     "name": "ワイナリー",
-                    "terms": "ワイナリー"
+                    "terms": "ワイナリー, 職人"
                 },
                 "embankment": {
                     "name": "土手",
-                    "terms": "土手, 築堤"
+                    "terms": "土手, 築堤, 堤防"
                 },
                 "emergency/ambulance_station": {
                     "name": "救急車の基地",
-                    "terms": "救急車の基地"
+                    "terms": "救急車の基地, 救命"
                 },
                 "emergency/defibrillator": {
                     "name": "AED",
-                    "terms": "自動体外式除細動器"
+                    "terms": "自動体外式除細動器, 救命"
                 },
                 "emergency/designated": {
                     "name": "緊急車両の通行指定"
                 },
                 "emergency/destination": {
-                    "name": "行き先に用事がある緊急車両"
+                    "name": "行き先に用事がある緊急車両, 救命"
                 },
                 "emergency/fire_hydrant": {
                     "name": "消火栓/消防水利",
-                    "terms": "消火栓, 消防, 防火水槽, 消防水利"
+                    "terms": "消火栓, 消防, 消防水利, 救命, 緊急, 火災"
+                },
+                "emergency/life_ring": {
+                    "name": "救命浮き輪",
+                    "terms": "救命浮き輪, ライフブイ, 救命浮環, 救命浮標"
                 },
                 "emergency/no": {
                     "name": "緊急車両の利用不可"
                 },
                 "emergency/phone": {
                     "name": "緊急電話",
-                    "terms": "緊急電話"
+                    "terms": "緊急電話, 救命"
                 },
                 "emergency/private": {
                     "name": "私有の緊急車両"
                 },
+                "emergency/water_tank": {
+                    "name": "防火水槽",
+                    "terms": "貯水槽, 貯水タンク, 緊急, 火災, 防火槽"
+                },
                 "emergency/yes": {
                     "name": "緊急時の利用可"
                 },
                     "name": "横断歩道",
                     "terms": "横断歩道"
                 },
+                "footway/crossing-raised": {
+                    "name": "隆起横断歩道",
+                    "terms": "隆起横断歩道, 横断歩道, 交通安全"
+                },
                 "footway/crosswalk": {
-                    "name": "横断歩道",
-                    "terms": "横断歩道"
+                    "name": "横断歩道(ゼブラあり)",
+                    "terms": "横断歩道, ゼブラ"
+                },
+                "footway/crosswalk-raised": {
+                    "name": "隆起横断歩道(ゼブラあり)",
+                    "terms": "隆起横断歩道, 横断歩道, 交通安全, ゼブラ"
                 },
                 "footway/sidewalk": {
-                    "name": "車道の脇にある歩道",
+                    "name": "歩道(車道の脇)",
                     "terms": "歩道"
                 },
                 "ford": {
                 },
                 "golf/bunker": {
                     "name": "サンドトラップ",
-                    "terms": "サンドトラップ, バンカー"
+                    "terms": "サンドトラップ, バンカー, ゴルフ"
                 },
                 "golf/fairway": {
                     "name": "フェアウェイ",
-                    "terms": "フェアウェー, フェアウェイ"
+                    "terms": "フェアウェー, フェアウェイ, ゴルフ"
                 },
                 "golf/green": {
                     "name": "グリーン",
-                    "terms": "グリーン"
+                    "terms": "グリーン, ゴルフ"
                 },
                 "golf/hole": {
                     "name": "ゴルフホール",
-                    "terms": "ホール"
+                    "terms": "ホール, ゴルフ"
                 },
                 "golf/lateral_water_hazard_area": {
                     "name": "ラテラルウォーターハザード",
-                    "terms": "池ポチャ, ウォーターハザード"
+                    "terms": "池ポチャ, ウォーターハザード, ゴルフ"
                 },
                 "golf/lateral_water_hazard_line": {
                     "name": "ラテラルウォーターハザード",
-                    "terms": "池ポチャ, ウォーターハザード"
+                    "terms": "池ポチャ, ウォーターハザード, ゴルフ"
                 },
                 "golf/rough": {
                     "name": "ラフ",
-                    "terms": "ラフ"
+                    "terms": "ラフ, ゴルフ"
                 },
                 "golf/tee": {
                     "name": "ティー",
-                    "terms": "ティー"
+                    "terms": "ティー, ゴルフ"
                 },
                 "golf/water_hazard_area": {
                     "name": "ウォーターハザード",
-                    "terms": "池ポチャ, ウォーターハザード"
+                    "terms": "池ポチャ, ウォーターハザード, ゴルフ"
                 },
                 "golf/water_hazard_line": {
                     "name": "ウォーターハザード",
-                    "terms": "池ポチャ, ウォーターハザード"
+                    "terms": "池ポチャ, ウォーターハザード, ゴルフ"
+                },
+                "healthcare": {
+                    "name": "医療",
+                    "terms": "医療, 健康管理, ヘルスケア, 保健医療"
+                },
+                "healthcare/alternative": {
+                    "name": "代替医療",
+                    "terms": "代替医療, 補完医療, オルタナティヴ医療, 代替療法, 自然療法"
+                },
+                "healthcare/alternative/chiropractic": {
+                    "name": "カイロプラクター",
+                    "terms": "カイロプラクター, カイロプラクティック, 医療"
+                },
+                "healthcare/audiologist": {
+                    "name": "聴覚訓練士",
+                    "terms": "聴覚訓練士, 聴覚機能訓練士, オージオロジスト, 医療"
+                },
+                "healthcare/birthing_center": {
+                    "name": "バースセンター",
+                    "terms": "バースセンター, 医療"
                 },
                 "healthcare/blood_donation": {
                     "name": "献血ルーム",
-                    "terms": "血液センター"
+                    "terms": "血液センター, 健康, 医療"
+                },
+                "healthcare/hospice": {
+                    "name": "ホスピス",
+                    "terms": "ホスピス, 医療, 福祉"
+                },
+                "healthcare/midwife": {
+                    "name": "助産婦",
+                    "terms": "助産婦, 産婆, 医療"
+                },
+                "healthcare/occupational_therapist": {
+                    "name": "作業療法士",
+                    "terms": "作業療法士, 医療, 福祉"
+                },
+                "healthcare/optometrist": {
+                    "name": "検眼医",
+                    "terms": "検眼医, 視力測定医, 医療"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "理学療法士",
+                    "terms": "理学療法士, 医療, 福祉"
+                },
+                "healthcare/podiatrist": {
+                    "name": "足病医",
+                    "terms": "足病医, 医療"
+                },
+                "healthcare/psychotherapist": {
+                    "name": "心理療法士",
+                    "terms": "心理療法士, サイコセラピスト, 医療"
                 },
                 "healthcare/rehabilitation": {
                     "name": "リハビリ施設",
-                    "terms": "リハビリ, リハビリテーション"
+                    "terms": "リハビリ, リハビリテーション, 医療, 福祉"
+                },
+                "healthcare/speech_therapist": {
+                    "name": "スピーチセラピスト",
+                    "terms": "スピーチセラピスト, 福祉"
                 },
                 "highway": {
                     "name": "道路"
                     "name": "乗馬道",
                     "terms": "乗馬道"
                 },
+                "highway/bus_guideway": {
+                    "name": "バスガイドウェイ",
+                    "terms": "バスガイドウェイ, ガイドウェイ"
+                },
                 "highway/bus_stop": {
-                    "name": "バス停",
-                    "terms": "バス停, バス停留所, 停留所, バス乗り場, BS, バスストップ"
+                    "name": "バス停(旧:単独)"
                 },
                 "highway/corridor": {
                     "name": "建物内の通り抜け道路",
                     "terms": "建物内の通り抜け道路"
                 },
                 "highway/crossing": {
-                    "name": "横断歩道",
+                    "name": "横断歩道(ノード用)",
                     "terms": "横断歩道"
                 },
+                "highway/crossing-raised": {
+                    "name": "隆起横断歩道",
+                    "terms": "隆起横断歩道, 横断歩道, 交通安全"
+                },
                 "highway/crosswalk": {
-                    "name": "横断歩道",
+                    "name": "横断歩道(ノード用、ゼブラあり)",
                     "terms": "横断歩道"
                 },
+                "highway/crosswalk-raised": {
+                    "name": "隆起横断歩道(ゼブラあり)",
+                    "terms": "隆起横断歩道, 横断歩道, 交通安全"
+                },
                 "highway/cycleway": {
                     "name": "自転車道",
                     "terms": "自転車道, サイクリング道路"
                 },
                 "highway/footway": {
                     "name": "歩道",
-                    "terms": "歩道, 歩行者用道路"
+                    "terms": "歩道, 歩行者用道路, 遊歩道, 緑道, 自然歩道, プロムナード"
                 },
                 "highway/give_way": {
                     "name": "ゆずれ標識",
                 },
                 "highway/mini_roundabout": {
                     "name": "小さな環状交差点",
-                    "terms": "小さな環状交差点, ラウンドアバウト, ロータリー"
+                    "terms": "小さな環状交差点, ラウンドアバウト, ロータリー, 交差点"
                 },
                 "highway/motorway": {
                     "name": "自動車専用道路",
-                    "terms": "自動車専用道路, 高速道路"
+                    "terms": "自動車専用道路, 高速道路, 車道, 幹線, 公道"
                 },
                 "highway/motorway_junction": {
                     "name": "自動車道のIC/JCT",
                 },
                 "highway/motorway_link": {
                     "name": "自動車専用道路の接続路",
-                    "terms": "自動車専用道路の連絡路"
+                    "terms": "自動車専用道路, 接続路, 車道, 幹線, 公道"
                 },
                 "highway/path": {
-                    "name": "小道",
-                    "terms": "小道"
+                    "name": "小道(自動車通行不可)",
+                    "terms": "小道, 歩道, 自転車道, バイク"
+                },
+                "highway/pedestrian_area": {
+                    "name": "ペデストリアンデッキ",
+                    "terms": "ペデストリアンデッキ, 歩道"
+                },
+                "highway/pedestrian_line": {
+                    "name": "歩行者専用道路",
+                    "terms": "歩行者専用道路, 歩行者天国, 歩道, ペデストリアン"
                 },
                 "highway/primary": {
                     "name": "主要地方道",
-                    "terms": "主要地方道"
+                    "terms": "主要地方道, 車道, 幹線, 公道"
                 },
                 "highway/primary_link": {
                     "name": "主要地方道の接続路",
-                    "terms": "主要地方道の連絡路"
+                    "terms": "主要地方道, 接続路, 車道, 幹線, 公道"
                 },
                 "highway/raceway": {
                     "name": "レーストラック(モータースポーツ)",
-                    "terms": "レーストラック"
+                    "terms": "レーストラック, 車道, 私道"
                 },
                 "highway/residential": {
-                    "name": "居住区域内道路",
-                    "terms": "居住区域内道路"
+                    "name": "住宅地区の道路",
+                    "terms": "住宅地区の道路, 車道, 生活道路, 住宅街道路"
                 },
                 "highway/rest_area": {
-                    "name": "パーキングエリア",
-                    "terms": "パーキングエリア, PA, チェーンベース"
+                    "name": "パーキングエリア(休憩所)",
+                    "terms": "パーキングエリア, PA, チェーンベース, 休憩所"
                 },
                 "highway/road": {
                     "name": "道路(区分不明)",
-                    "terms": "道路(区分不明), その他道路"
+                    "terms": "道路(区分不明), その他道路, 車道, 区分不明"
                 },
                 "highway/secondary": {
                     "name": "一般都道府県道",
-                    "terms": "一般都道府県道, 都道, 道道, 府道, 県道"
+                    "terms": "一般都道府県道, 都道, 道道, 府道, 県道, 車道, 公道"
                 },
                 "highway/secondary_link": {
                     "name": "一般都道府県道の接続路",
-                    "terms": "一般都道府県道の連絡路"
+                    "terms": "一般都道府県道, 接続路, 車道, 公道"
                 },
                 "highway/service": {
-                    "name": "敷地内道路",
-                    "terms": "敷地内道路"
+                    "name": "敷地内道路(全般)",
+                    "terms": "敷地内道路, 私道, 路地, 裏路地, 駐車場通路, 車道, 通路"
                 },
                 "highway/service/alley": {
                     "name": "路地",
-                    "terms": "路地"
+                    "terms": "路地, 裏路地, 車道, 生活道路, 私道"
                 },
                 "highway/service/drive-through": {
                     "name": "ドライブスルー",
-                    "terms": "ドライブスルー"
+                    "terms": "ドライブスルー, 通路, 車道, 私道"
                 },
                 "highway/service/driveway": {
-                    "name": "私道",
-                    "terms": "私道"
+                    "name": "民地内通路・ドライブウェイ",
+                    "terms": "私道, 車道, 生活道路, 民地内通路, 通路, 路地"
                 },
                 "highway/service/emergency_access": {
                     "name": "緊急通用路",
-                    "terms": "緊急通用路, 消防車専用口, 非常用道路"
+                    "terms": "緊急通用路, 消防車専用口, 非常用道路, 車道"
                 },
                 "highway/service/parking_aisle": {
                     "name": "駐車場内通路",
-                    "terms": "駐車場内通路"
+                    "terms": "駐車場内通路, 駐車場通路, 通路, 車道"
                 },
                 "highway/services": {
                     "name": "サービスエリア",
                 },
                 "highway/speed_camera": {
                     "name": "スピードカメラ",
-                    "terms": "スピードカメラ, オービス, 自動速度違反取締装置"
+                    "terms": "スピードカメラ, オービス, 自動速度違反取締装置, 道路設備"
                 },
                 "highway/steps": {
                     "name": "階段",
-                    "terms": "階段"
+                    "terms": "階段, 歩道"
                 },
                 "highway/stop": {
                     "name": "一時停止標識",
-                    "terms": "一時停止標識, 一旦停止"
+                    "terms": "一時停止標識, 一旦停止, 止まれ, とまれ, 道路標識"
                 },
                 "highway/street_lamp": {
                     "name": "街路灯",
-                    "terms": "街灯, 街路灯"
+                    "terms": "街灯, 街路灯, 道路設備"
                 },
                 "highway/tertiary": {
                     "name": "一般道(2車線以上)",
-                    "terms": "一般道(2車線以上)"
+                    "terms": "一般道, 2車線以上, 車道, 2車線, 3車線, 4車線, 公道"
                 },
                 "highway/tertiary_link": {
                     "name": "一般道(2車線以上)の接続路",
-                    "terms": "一般道(2車線以上)の接続路"
+                    "terms": "一般道, 2車線以上, 車道, 公道, 接続路"
                 },
                 "highway/track": {
-                    "name": "農道・林道",
-                    "terms": "未舗装農道, 農道, 未舗装林道, 林道, 獣道, けもの道, 酷道, 腐道, 険道, 死道, 損道, 道路"
+                    "name": "農道・林道(自動車通行可)",
+                    "terms": "未舗装農道, 農道, 未舗装林道, 林道, 獣道, けもの道, 酷道, 腐道, 険道, 死道, 損道, 道路, わだち, 轍, 車道, トラック, 生活道路"
                 },
                 "highway/traffic_mirror": {
                     "name": "カーブミラー",
-                    "terms": "カーブミラー, ミラー, 道路反射鏡"
+                    "terms": "カーブミラー, ミラー, 道路反射鏡, 道路設備"
                 },
                 "highway/traffic_signals": {
                     "name": "信号機",
-                    "terms": "信号機, 交通信号, 道路信号"
+                    "terms": "信号機, 交通信号, 道路信号, 道路設備"
                 },
                 "highway/trunk": {
                     "name": "国道",
-                    "terms": "国道, 一般国道"
+                    "terms": "国道, 一般国道, 車道, 幹線, 公道"
                 },
                 "highway/trunk_link": {
                     "name": "国道の接続路",
-                    "terms": "国道の接続路"
+                    "terms": "国道, 接続路, 車道, 幹線, 公道"
                 },
                 "highway/turning_circle": {
                     "name": "転回場",
                 },
                 "highway/unclassified": {
                     "name": "一般道(2車線未満)",
-                    "terms": "道路(区分不明), その他道路"
+                    "terms": "2車線未満, 1.5車線, 1車線, 車道, 公道, 一般道"
                 },
                 "historic": {
                     "name": "史跡",
-                    "terms": "史跡, 歴史的建造物"
+                    "terms": "史跡, 歴史的建造物, 歴史"
                 },
                 "historic/archaeological_site": {
                     "name": "遺跡",
-                    "terms": "遺跡, 貝塚, 古墳, 史跡"
+                    "terms": "遺跡, 貝塚, 古墳, 史跡, 歴史"
                 },
                 "historic/boundary_stone": {
                     "name": "境界石",
-                    "terms": "境界石, 境界杭"
+                    "terms": "境界石, 境界杭, 歴史"
                 },
                 "historic/castle": {
                     "name": "城",
-                    "terms": "城, 城郭"
+                    "terms": "城, 城郭, 歴史, 城址, 城跡, お城"
                 },
                 "historic/memorial": {
                     "name": "記念碑",
-                    "terms": "記念碑, 石碑, 石仏, 像"
+                    "terms": "記念碑, 石碑, 石仏, 像, 歴史, 銅像, 彫刻"
                 },
                 "historic/monument": {
                     "name": "記念堂",
-                    "terms": "記念堂, 記念建造物"
+                    "terms": "記念堂, 記念建造物, 歴史"
                 },
                 "historic/ruins": {
                     "name": "廃墟",
-                    "terms": "廃墟"
+                    "terms": "廃墟, 歴史"
                 },
                 "historic/tomb": {
                     "name": "墓",
-                    "terms": "墓, 古墳"
+                    "terms": "墓, 古墳, 歴史, 墳墓"
                 },
                 "historic/wayside_cross": {
                     "name": "道路際の十字架",
-                    "terms": "道路際の十字架"
+                    "terms": "道路際の十字架, 歴史"
                 },
                 "historic/wayside_shrine": {
-                    "name": "道祖神",
-                    "terms": "道祖神, 地蔵, お地蔵さん"
+                    "name": "路傍の神仏",
+                    "terms": "道祖神, 地蔵, お地蔵さん, 歴史, 神仏, 祠, 庚申塔, 石仏, 宗教, 信仰"
                 },
                 "junction": {
                     "name": "交差点",
                     "terms": "土地利用"
                 },
                 "landuse/allotments": {
-                    "name": "市民園",
-                    "terms": "庭å\9c\92, å¸\82æ°\91庭å\9c\92, ã\82³ã\83\9fã\83¥ã\83\8bã\83\86ã\82£ã\82¬ã\83¼ã\83\87ã\83³, ã\82¬ã\83¼ã\83\87ã\83³"
+                    "name": "市民園",
+                    "terms": "å¸\82æ°\91è\8f\9cå\9c\92, å¸\82æ°\91è¾²å\9c\92, ã\82³ã\83\9fã\83¥ã\83\8bã\83\86ã\82£ã\82¬ã\83¼ã\83\87ã\83³, ã\82¬ã\83¼ã\83\87ã\83³, è¾²æ¥­, ç\95\91, è¾²å\9c\92"
                 },
                 "landuse/aquaculture": {
-                    "name": "養殖場",
-                    "terms": "養殖場"
+                    "name": "養殖場(水域)",
+                    "terms": "養殖場, 養魚場"
                 },
                 "landuse/basin": {
                     "name": "遊水地",
-                    "terms": "遊水地"
+                    "terms": "遊水地, 遊水池, 貯水池"
+                },
+                "landuse/brownfield": {
+                    "name": "再開発予定区画(整備済)",
+                    "terms": "再開発用地, 更地, 空き地, ブラウンフィールド, 資材置き場, 開発用地, 広場, 用地"
                 },
                 "landuse/cemetery": {
-                    "name": "霊園",
-                    "terms": "霊園, 墓地"
+                    "name": "霊園(土地区画、大)",
+                    "terms": "墓地, 霊園, 墓場, お墓, 墓苑, 墓所"
                 },
                 "landuse/churchyard": {
-                    "name": "教会の敷地",
+                    "name": "教会(土地区画)",
                     "terms": "教会, 教会の敷地"
                 },
                 "landuse/commercial": {
                     "terms": "工事中用地, 建設用地, 工事現場"
                 },
                 "landuse/farm": {
-                    "name": "農地"
+                    "name": "農地(非推奨)"
                 },
                 "landuse/farmland": {
                     "name": "農地",
-                    "terms": "農地, 畑, 田, 茶畑"
+                    "terms": "農地, 畑, 田, 茶畑, 田んぼ, 田畑, 耕作地"
                 },
                 "landuse/farmyard": {
-                    "name": "農業施設用地",
-                    "terms": "農業施設用地"
+                    "name": "農家(敷地)",
+                    "terms": "農業施設用地, 農家"
                 },
                 "landuse/forest": {
                     "name": "人工林",
                     "terms": "人工林, 二次林, 営林, 保安林, 鉄道林, 防風林, 森林(人工)"
                 },
                 "landuse/garages": {
-                    "name": "車庫",
-                    "terms": "ガレージ"
+                    "name": "車庫(土地区画)",
+                    "terms": "ガレージ, 車庫"
                 },
                 "landuse/grass": {
                     "name": "草地",
                     "terms": "草地, 芝生"
                 },
+                "landuse/greenfield": {
+                    "name": "開発予定区画(未整備)",
+                    "terms": "緑野, 草原, グリーンフィールド, 野原, 原っぱ, 原, 広場, 野, 空き地, 開発用地, 用地"
+                },
+                "landuse/greenhouse_horticulture": {
+                    "name": "温室(土地区画)",
+                    "terms": "温室, ビニールハウス, 農業, 野菜"
+                },
                 "landuse/harbour": {
-                    "name": "港湾地域",
-                    "terms": "港湾地域"
+                    "name": "港湾地域(土地区画)",
+                    "terms": "港湾地域, 湾岸, 波止場"
                 },
                 "landuse/industrial": {
                     "name": "工業用地",
-                    "terms": "工業用地, 工業団地, 工業地"
+                    "terms": "工業用地, 工業団地, 工業地, 工業地帯"
+                },
+                "landuse/industrial/scrap_yard": {
+                    "name": "自動車解体場",
+                    "terms": "自動車解体場, スクラップ場"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "と畜場",
+                    "terms": "と畜場, 畜殺場, 屠殺場"
                 },
                 "landuse/landfill": {
                     "name": "最終処分場",
-                    "terms": "最終処分場"
+                    "terms": "最終処分場, 廃棄物, ゴミ"
                 },
                 "landuse/meadow": {
                     "name": "牧草地",
                 },
                 "landuse/railway": {
                     "name": "鉄道用地",
-                    "terms": "鉄道用地"
+                    "terms": "鉄道用地, 鉄道敷地"
                 },
                 "landuse/recreation_ground": {
                     "name": "レクリエーション用のグラウンド",
                     "terms": "レクリエーション場"
                 },
+                "landuse/religious": {
+                    "name": "宗教施設(敷地)",
+                    "terms": "宗教施設の敷地, 宗教施設, 神社, 寺院, 神社仏閣, 寺社"
+                },
                 "landuse/residential": {
                     "name": "住宅地",
-                    "terms": "住宅地, 住宅街"
+                    "terms": "住宅地, 住宅街, 宅地"
                 },
                 "landuse/retail": {
-                    "name": "商業地",
+                    "name": "商業地",
                     "terms": "商業地, ショッピング地区, ショッピング街, 商店街"
                 },
                 "landuse/vineyard": {
                     "name": "ぶどう畑",
-                    "terms": "ぶどう畑, 果樹園"
+                    "terms": "ぶどう畑, 果樹園, 森林"
                 },
                 "leisure": {
-                    "name": "レジャー",
+                    "name": "レジャー施設全般",
                     "terms": "レジャー, 娯楽"
                 },
                 "leisure/adult_gaming_centre": {
-                    "name": "遊技場",
-                    "terms": "遊技場, パチンコ, パチスロ, スロット"
+                    "name": "遊技場(成人向け)",
+                    "terms": "遊技場, パチンコ, パチスロ, スロット, 娯楽, アダルト, レジャー"
                 },
                 "leisure/bird_hide": {
                     "name": "野鳥観察舎",
-                    "terms": "ハイド, 野鳥観察小屋"
+                    "terms": "ハイド, 野鳥観察小屋, アウトドア"
                 },
                 "leisure/bowling_alley": {
                     "name": "ボウリング場",
-                    "terms": "ボウリング場, ボウリング, ボーリング"
+                    "terms": "ボウリング場, ボウリング, ボーリング, スポーツ, 娯楽"
                 },
                 "leisure/common": {
                     "name": "共有地",
                 },
                 "leisure/dance": {
                     "name": "ダンスホール",
-                    "terms": "ダンスホール"
+                    "terms": "ダンスホール, 娯楽"
                 },
                 "leisure/dog_park": {
                     "name": "ドッグパーク",
-                    "terms": "ドッグパーク, ドッグラン"
+                    "terms": "ドッグパーク, ドッグラン, 犬, 動物, ペット"
                 },
                 "leisure/firepit": {
                     "name": "焚火",
-                    "terms": "焚火,キャンプファイヤー"
+                    "terms": "焚火,キャンプファイヤー, アウトドア"
                 },
                 "leisure/fitness_centre": {
                     "name": "ジム/フィットネスセンター",
-                    "terms": "フィットネスクラブ, フィットネスセンター, ジム"
+                    "terms": "フィットネスクラブ, フィットネスセンター, ジム, スポーツ"
                 },
                 "leisure/fitness_centre/yoga": {
                     "name": "ヨガスタジオ",
-                    "terms": "ヨガスタジオ"
+                    "terms": "ヨガスタジオ, スポーツ"
                 },
                 "leisure/fitness_station": {
                     "name": "屋外運動器具",
-                    "terms": "屋外運動器具"
+                    "terms": "屋外運動器具, スポーツ"
+                },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "平均台",
+                    "terms": "平均台, 運動器具"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "トレーニング台",
+                    "terms": "トレーニング台, 運動台, 運動器具"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "鉄棒",
+                    "terms": "鉄棒, 運動器具"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "name": "うんてい",
+                    "terms": "うんてい, 雲梯, 運動器具"
+                },
+                "leisure/fitness_station/hyperextension": {
+                    "name": "トレーニングベンチ",
+                    "terms": "トレーニングベンチ, 背筋台, 運動器具"
+                },
+                "leisure/fitness_station/parallel_bars": {
+                    "name": "平行棒",
+                    "terms": "平行棒, 運動器具"
+                },
+                "leisure/fitness_station/push-up": {
+                    "name": "腕立て伏せ",
+                    "terms": "腕立て伏せ, プッシュアップ, 運動器具"
+                },
+                "leisure/fitness_station/rings": {
+                    "name": "吊り輪",
+                    "terms": "吊り輪, 運動器具"
+                },
+                "leisure/fitness_station/sign": {
+                    "name": "運動の説明標識",
+                    "terms": "運動の説明標識, 運動器具"
+                },
+                "leisure/fitness_station/sit-up": {
+                    "name": "腹筋台",
+                    "terms": "腹筋台, シットアップ, 運動器具"
+                },
+                "leisure/fitness_station/stairs": {
+                    "name": "階段(トレーニング用)",
+                    "terms": "階段, 運動器具"
                 },
                 "leisure/garden": {
                     "name": "庭園",
-                    "terms": "庭園"
+                    "terms": "庭園, 日本庭園, 植物園, 公園, 枯山水"
                 },
                 "leisure/golf_course": {
                     "name": "ゴルフコース",
                     "terms": "ゴルフコース, ゴルフ場"
                 },
+                "leisure/hackerspace": {
+                    "name": "ハッカースペース",
+                    "terms": "ハッカースペース, ハックラボ, ハックスペース, メーカースペース, ファブラボ, FabLab"
+                },
                 "leisure/horse_riding": {
                     "name": "乗馬施設",
-                    "terms": "乗馬施設, 馬事公苑, 乗馬クラブ"
+                    "terms": "乗馬施設, 馬事公苑, 乗馬クラブ, スポーツ"
                 },
                 "leisure/ice_rink": {
                     "name": "アイススケート場",
-                    "terms": "アイススケート, アイススケート場, アイススケートリンク, スケートリンク"
+                    "terms": "アイススケート, アイススケート場, アイススケートリンク, スケートリンク, スポーツ"
                 },
                 "leisure/marina": {
                     "name": "マリーナ",
-                    "terms": "マリーナ, ヨットハーバー"
+                    "terms": "マリーナ, ヨットハーバー, スポーツ"
                 },
                 "leisure/miniature_golf": {
                     "name": "ミニゴルフ",
-                    "terms": "パターゴルフ"
+                    "terms": "パターゴルフ, スポーツ, 娯楽"
                 },
                 "leisure/nature_reserve": {
                     "name": "自然保護区",
                 },
                 "leisure/park": {
                     "name": "公園",
-                    "terms": "公園"
+                    "terms": "公園, アウトドア, 広場, 運動公園"
                 },
                 "leisure/picnic_table": {
                     "name": "ピクニックテーブル",
-                    "terms": "ピクニックテーブル"
+                    "terms": "ピクニックテーブル, アウトドア"
                 },
                 "leisure/pitch": {
                     "name": "スポーツ競技場",
-                    "terms": "スポーツ競技場, 運動場, 競技場, グラウンド"
+                    "terms": "スポーツ競技場, 運動場, 競技場, グラウンド, 校庭"
                 },
                 "leisure/pitch/american_football": {
                     "name": "アメリカンフットボール場",
-                    "terms": "アメリカンフットボール場, アメフト競技場"
+                    "terms": "アメリカンフットボール場, アメフト競技場, スポーツ"
                 },
                 "leisure/pitch/baseball": {
                     "name": "野球場",
-                    "terms": "野球場, 球場"
+                    "terms": "野球場, 球場, スポーツ"
                 },
                 "leisure/pitch/basketball": {
                     "name": "バスケットボール場",
-                    "terms": "バスケットボール場"
+                    "terms": "バスケットボール場, スポーツ"
                 },
                 "leisure/pitch/beachvolleyball": {
                     "name": "ビーチバレーコート",
-                    "terms": "ビーチバレーコート"
+                    "terms": "ビーチバレーコート, スポーツ"
+                },
+                "leisure/pitch/boules": {
+                    "name": "ブールスポーツ",
+                    "terms": "ブールスポーツ, ボッチ, ボッチボール, スポーツ"
                 },
                 "leisure/pitch/bowls": {
                     "name": "ローンボウルズ",
-                    "terms": "ローンボウルズ"
+                    "terms": "ローンボウルズ, スポーツ"
                 },
                 "leisure/pitch/cricket": {
                     "name": "クリケット場",
-                    "terms": "クリケット場"
+                    "terms": "クリケット場, スポーツ"
                 },
                 "leisure/pitch/equestrian": {
                     "name": "乗馬場",
-                    "terms": "乗馬場"
+                    "terms": "乗馬場, スポーツ"
                 },
                 "leisure/pitch/rugby_league": {
                     "name": "ラグビーリーグ場",
-                    "terms": "ラグビー場, ラグビー, リーグ"
+                    "terms": "ラグビー場, ラグビー, リーグ, スポーツ"
                 },
                 "leisure/pitch/rugby_union": {
                     "name": "ラグビー場",
-                    "terms": "ラグビーユニオン場"
+                    "terms": "ラグビーユニオン場, スポーツ"
                 },
                 "leisure/pitch/skateboard": {
                     "name": "スケートパーク",
-                    "terms": "スケートパーク"
+                    "terms": "スケートパーク, スポーツ"
                 },
                 "leisure/pitch/soccer": {
                     "name": "サッカー場",
-                    "terms": "サッカー場"
+                    "terms": "サッカー場, スポーツ"
                 },
                 "leisure/pitch/table_tennis": {
                     "name": "卓球台",
-                    "terms": "卓球台"
+                    "terms": "卓球台, スポーツ"
                 },
                 "leisure/pitch/tennis": {
                     "name": "テニスコート",
-                    "terms": "テニスコート, テニス場, 庭球場"
+                    "terms": "テニスコート, テニス場, 庭球場, スポーツ"
                 },
                 "leisure/pitch/volleyball": {
                     "name": "バレーボールコート",
-                    "terms": "バレーボールコート"
+                    "terms": "バレーボールコート, スポーツ"
                 },
                 "leisure/playground": {
                     "name": "児童公園",
                     "terms": "児童公園, 遊び場, 児童遊園, 公園"
                 },
                 "leisure/resort": {
-                    "name": "リゾート",
-                    "terms": "リゾート"
+                    "name": "リゾート",
+                    "terms": "リゾート, 行楽地, 観光, 保養, レジャー, 娯楽"
                 },
                 "leisure/running_track": {
                     "name": "競技トラック (徒競走)",
-                    "terms": "競技トラック (徒競走)"
+                    "terms": "競技トラック (徒競走), スポーツ"
+                },
+                "leisure/sauna": {
+                    "name": "サウナ",
+                    "terms": "サウナ, 娯楽, 風呂, お風呂"
                 },
                 "leisure/slipway": {
                     "name": "進水路",
                 },
                 "leisure/sports_centre/swimming": {
                     "name": "スイミングプール施設",
-                    "terms": "遊泳プール, プール, 水泳場"
+                    "terms": "遊泳プール, プール, 水泳場, スポーツ"
                 },
                 "leisure/stadium": {
                     "name": "スタジアム",
-                    "terms": "スタジアム, 競技場"
+                    "terms": "スタジアム, 競技場, 娯楽"
                 },
                 "leisure/swimming_pool": {
                     "name": "遊泳プール",
-                    "terms": "遊泳プール, プール, 水泳場"
+                    "terms": "遊泳プール, プール, 水泳場, 娯楽"
                 },
                 "leisure/track": {
                     "name": "競技トラック(モータースポーツ以外)",
-                    "terms": "競技トラック"
+                    "terms": "競技トラック, スポーツ"
                 },
                 "leisure/water_park": {
                     "name": "ウォーターパーク",
-                    "terms": "テーマパーク, 遊園地, プール, ウォーターパーク"
+                    "terms": "テーマパーク, 遊園地, プール, ウォーターパーク, 娯楽"
                 },
                 "line": {
                     "name": "線",
                     "name": "煙突",
                     "terms": "煙突"
                 },
+                "man_made/crane": {
+                    "name": "クレーン",
+                    "terms": "クレーン"
+                },
                 "man_made/cutline": {
                     "name": "森林の切れ目",
                     "terms": "森林の切れ目, カットライン"
                     "name": "柱",
                     "terms": "柱"
                 },
+                "man_made/monitoring_station": {
+                    "name": "監視ステーション",
+                    "terms": "監視ステーション"
+                },
                 "man_made/observation": {
                     "name": "監視塔",
                     "terms": "監視塔"
                     "name": "浄水場",
                     "terms": "浄水場"
                 },
+                "man_made/watermill": {
+                    "name": "水車",
+                    "terms": "水車"
+                },
+                "man_made/windmill": {
+                    "name": "風車",
+                    "terms": "風車"
+                },
                 "man_made/works": {
                     "name": "工場",
                     "terms": "工場"
                     "name": "マンホール",
                     "terms": "マンホール, 潜孔, 人孔"
                 },
+                "manhole/drain": {
+                    "name": "雨水用マンホール",
+                    "terms": "雨水用マンホール"
+                },
+                "manhole/telecom": {
+                    "name": "電話線用マンホール",
+                    "terms": "電話線用マンホール"
+                },
                 "natural": {
                     "name": "自然",
                     "terms": "自然"
                     "name": "オフィス",
                     "terms": "オフィス"
                 },
+                "office/accountant": {
+                    "name": "会計事務所",
+                    "terms": "会計事務所"
+                },
                 "office/administrative": {
-                    "name": "地方行政事務所",
-                    "terms": "地方行政事務所"
+                    "name": "地方行政事務所"
+                },
+                "office/adoption_agency": {
+                    "name": "養子縁組み機関",
+                    "terms": "養子縁組み機関"
+                },
+                "office/advertising_agency": {
+                    "name": "広告代理店",
+                    "terms": "広告代理店"
+                },
+                "office/architect": {
+                    "name": "設計事務所",
+                    "terms": "設計事務所, 建築事務所"
+                },
+                "office/association": {
+                    "name": "非営利組織",
+                    "terms": "非営利組織, NPO, 非営利団体"
+                },
+                "office/charity": {
+                    "name": "慈善団体",
+                    "terms": "慈善団体"
                 },
                 "office/company": {
-                    "name": "会社事務所",
-                    "terms": "会社事務所, 営業所"
+                    "name": "会社",
+                    "terms": "会社, 企業"
                 },
                 "office/coworking": {
                     "name": "コワーキングスペース",
-                    "terms": "コワーキングスペース,共同オフィス"
+                    "terms": "コワーキングスペース, 共同オフィス, シェアオフィス, ドロップイン"
                 },
                 "office/educational_institution": {
                     "name": "教育機関事務所",
                     "name": "職業安定所",
                     "terms": "職業安定所, ハローワーク"
                 },
+                "office/energy_supplier": {
+                    "name": "エネルギー供給者",
+                    "terms": "エネルギー供給者, 石油会社, 電力会社, ガス会社"
+                },
                 "office/estate_agent": {
                     "name": "不動産代理店",
                     "terms": "不動産代理店"
                     "name": "会計事務所",
                     "terms": "会計事務所"
                 },
+                "office/forestry": {
+                    "name": "林業事務所",
+                    "terms": "林業, 森林"
+                },
+                "office/foundation": {
+                    "name": "財団",
+                    "terms": "財団, ファウンデーション"
+                },
                 "office/government": {
                     "name": "行政機関事務所",
                     "terms": "行政機関事務所"
                     "name": "イギリス等の出生、結婚、死亡などの登録所",
                     "terms": "登記所, 法人登記, 登録所, 法務局"
                 },
+                "office/government/tax": {
+                    "name": "税理士事務所",
+                    "terms": "税理士事務所, 税理士"
+                },
+                "office/guide": {
+                    "name": "ツアーガイド",
+                    "terms": "ツアーガイド, 旅行ガイド"
+                },
                 "office/insurance": {
-                    "name": "保険代理店",
-                    "terms": "保険代理店"
+                    "name": "保険会社・代理店",
+                    "terms": "保険代理店, 生命保険, 損害保険, 生保, 損保"
+                },
+                "office/it": {
+                    "name": "IT企業",
+                    "terms": "IT企業"
                 },
                 "office/lawyer": {
                     "name": "法律事務所",
                     "terms": "法律事務所"
                 },
                 "office/lawyer/notary": {
-                    "name": "公証人役場",
-                    "terms": "公証人役場"
+                    "name": "公証人役場"
+                },
+                "office/moving_company": {
+                    "name": "引っ越し業者",
+                    "terms": "引っ越し業者"
+                },
+                "office/newspaper": {
+                    "name": "新聞社",
+                    "terms": "新聞社"
                 },
                 "office/ngo": {
                     "name": "NGO事務所",
                     "terms": "NGO事務所"
                 },
+                "office/notary": {
+                    "name": "公証役場",
+                    "terms": "公証役場"
+                },
                 "office/physician": {
                     "name": "医者"
                 },
                     "name": "政党事務所",
                     "terms": "政党事務所"
                 },
+                "office/private_investigator": {
+                    "name": "私立探偵社",
+                    "terms": "私立探偵社, 探偵"
+                },
+                "office/quango": {
+                    "name": "準非政府機関",
+                    "terms": "準非政府機関"
+                },
                 "office/research": {
-                    "name": "研究所棟",
-                    "terms": "研究所"
+                    "name": "研究所",
+                    "terms": "研究所, ラボ"
+                },
+                "office/surveyor": {
+                    "name": "測量会社",
+                    "terms": "測量会社"
+                },
+                "office/tax_advisor": {
+                    "name": "税金アドバイザー",
+                    "terms": "税金アドバイザー, 節税アドバイザー"
                 },
                 "office/telecommunication": {
                     "name": "通信会社事務所",
                     "terms": "通信会社事務所"
                 },
+                "office/therapist": {
+                    "name": "セラピスト(オフィス)",
+                    "terms": "セラピスト"
+                },
                 "office/travel_agent": {
                     "name": "旅行代理店"
                 },
+                "office/water_utility": {
+                    "name": "水道工事店",
+                    "terms": "水道工事店, 工務店, 設備管理, 浴槽, トイレ"
+                },
                 "piste": {
                     "name": "ゲレンデ/スキー路",
                     "terms": "ゲレンデ, スキーコース"
                     "name": "農場"
                 },
                 "place/hamlet": {
-                    "name": "集落",
+                    "name": "Hamlet",
                     "terms": "集落, 地名"
                 },
                 "place/island": {
                     "name": "島",
                     "terms": "島"
                 },
+                "place/islet": {
+                    "name": "小島",
+                    "terms": "小島"
+                },
                 "place/isolated_dwelling": {
                     "name": "孤立した(2世帯以下の)居住区",
                     "terms": "一軒家, 住宅地, 地名"
                     "name": "小字",
                     "terms": "小字, 地名"
                 },
+                "place/plot": {
+                    "name": "小区画",
+                    "terms": " 小区画, プロット"
+                },
                 "place/quarter": {
                     "name": "Sub-Borough / Quarter",
                     "terms": "Sub-Borough / Quarter"
                 },
                 "place/square": {
-                    "name": "広場",
-                    "terms": "広場"
+                    "name": "広場(都心部)",
+                    "terms": "広場, スクエア"
                 },
                 "place/suburb": {
                     "name": "区",
                     "name": "村",
                     "terms": "村, 地名"
                 },
+                "playground/balance_beam": {
+                    "name": "子供用平均台",
+                    "terms": "平均台, 子供用平均台, 遊具"
+                },
+                "playground/basket_spinner": {
+                    "name": "回転かご",
+                    "terms": "回転かご, 遊具"
+                },
+                "playground/basket_swing": {
+                    "name": "かごブランコ",
+                    "terms": "かごブランコ, 遊具"
+                },
+                "playground/climbing_frame": {
+                    "name": "ジャングルジム",
+                    "terms": "ジャングルジム, 遊具"
+                },
+                "playground/cushion": {
+                    "name": "クッション",
+                    "terms": "クッション, 遊具"
+                },
+                "playground/horizontal_bar": {
+                    "name": "鉄棒(子供用)",
+                    "terms": "子供用鉄棒, 鉄棒, 遊具"
+                },
+                "playground/rocker": {
+                    "name": "スプリング遊具",
+                    "terms": "スプリング遊具, 遊具"
+                },
+                "playground/roundabout": {
+                    "name": "メリーゴーランド(小)",
+                    "terms": "メリーゴーランド, メリーゴーラウンド, 遊具"
+                },
+                "playground/sandpit": {
+                    "name": "砂場",
+                    "terms": "砂場, 遊具"
+                },
+                "playground/seesaw": {
+                    "name": "シーソー",
+                    "terms": "シーソー, 遊具"
+                },
+                "playground/slide": {
+                    "name": "滑り台",
+                    "terms": "滑り台, 遊具"
+                },
+                "playground/structure": {
+                    "name": "コンビネーション遊具",
+                    "terms": "コンビネーション遊具, 遊具"
+                },
+                "playground/swing": {
+                    "name": "ブランコ",
+                    "terms": "ブランコ, ぶらんこ, 遊具"
+                },
+                "playground/zipwire": {
+                    "name": "ジップライン",
+                    "terms": "ジップライン, 遊具"
+                },
                 "point": {
                     "name": "ポイント",
                     "terms": "ポイント"
                     "name": "発電機",
                     "terms": "発電機, 発電所"
                 },
+                "power/generator/source_nuclear": {
+                    "name": "原子炉",
+                    "terms": "原子炉"
+                },
                 "power/generator/source_wind": {
                     "name": "風力発電機",
                     "terms": "風力発電機, 風力発電, 風車, 風力原動機, 風力タービン"
                     "name": "変電所",
                     "terms": "変電所, 変圧所"
                 },
+                "power/switch": {
+                    "name": "電源スイッチ",
+                    "terms": "電源スイッチ"
+                },
                 "power/tower": {
                     "name": "送電塔",
                     "terms": "送電塔, 鉄塔"
                     "name": "変圧器",
                     "terms": "変圧器"
                 },
+                "public_transport/linear_platform": {
+                    "name": "交通機関の乗り場",
+                    "terms": "プラットホーム, 待合所, 乗り場"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "ロープウェイ(乗り場)",
+                    "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "バス(乗り場)",
+                    "terms": "バス停, バス乗り場, バスのりば, バス"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "フェリー(乗り場)",
+                    "terms": "フェリー乗り場, フェリー"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "ライトレール(乗り場)",
+                    "terms": "ライトレール乗り場, ライトレール"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "モノレール(乗り場)",
+                    "terms": "モノレール乗り場, モノレール"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "地下鉄(乗り場)",
+                    "terms": "地下鉄乗り場, 地下鉄"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "鉄道(乗り場)",
+                    "terms": "鉄道乗り場, 鉄道, 列車, 電車"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "トラム(乗り場)",
+                    "terms": "トラム乗り場, トラム"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "トロリーバス(乗り場)",
+                    "terms": "トロリーバス乗り場, トロリーバス"
+                },
                 "public_transport/platform": {
-                    "name": "プラットホーム",
-                    "terms": "プラットホーム, ホーム"
+                    "name": "交通機関の乗り場(全般)",
+                    "terms": "交通機関の乗り場, 乗り場, プラットホーム"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "ロープウェイ(乗り場)",
+                    "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト"
+                },
+                "public_transport/platform_bus": {
+                    "name": "バス停(乗り場)",
+                    "terms": "バス停, バス, バス停留所, バス乗り場"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "フェリー(乗り場)",
+                    "terms": "フェリー乗り場, フェリー"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "ライトレール(乗り場)",
+                    "terms": "ライトレール乗り場, ライトレール"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "モノレール(乗り場)",
+                    "terms": "モノレール乗り場, モノレール"
+                },
+                "public_transport/platform_subway": {
+                    "name": "地下鉄(乗り場)",
+                    "terms": "地下鉄乗り場, 地下鉄, プラットホーム"
+                },
+                "public_transport/platform_train": {
+                    "name": "鉄道(乗り場)",
+                    "terms": "鉄道乗り場, 鉄道, 電車, 列車, プラットホーム"
+                },
+                "public_transport/platform_tram": {
+                    "name": "トラム(乗り場)",
+                    "terms": "トラム乗り場, トラム"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "トロリーバス(乗り場)",
+                    "terms": "トロリーバス乗り場, トロリーバス"
+                },
+                "public_transport/station": {
+                    "name": "駅(全般)",
+                    "terms": "駅"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "ロープウェイ(駅)",
+                    "terms": "ロープウェイ駅, ロープウェイ, リフト, スキーリフト, チェアリフト, 牽引リフト"
+                },
+                "public_transport/station_bus": {
+                    "name": "バス(駅/ターミナル)",
+                    "terms": "バス, バスターミナル, バスステーション"
+                },
+                "public_transport/station_ferry": {
+                    "name": "フェリー(駅/ターミナル)",
+                    "terms": "フェリーターミナル, フェリー"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "ライトレール(駅)",
+                    "terms": "ライトレール駅, ライトレール"
+                },
+                "public_transport/station_monorail": {
+                    "name": "モノレール(駅)",
+                    "terms": "モノレール駅, モノレール"
+                },
+                "public_transport/station_subway": {
+                    "name": "地下鉄(駅)",
+                    "terms": "地下鉄駅, 地下鉄, サブウェイ"
+                },
+                "public_transport/station_train": {
+                    "name": "鉄道(駅)",
+                    "terms": "鉄道駅, 鉄道, 駅, 電車, 列車"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "小駅(英国用)",
+                    "terms": "小さな駅, 小駅, 駅, 鉄道"
+                },
+                "public_transport/station_tram": {
+                    "name": "トラム(駅)",
+                    "terms": "トラム駅, トラム"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "トロリーバス(駅/ターミナル)",
+                    "terms": "トロリーバス, トロリーバスターミナル"
+                },
+                "public_transport/stop_area": {
+                    "name": "公共交通の停車エリア(全般)",
+                    "terms": "停車エリア"
                 },
                 "public_transport/stop_position": {
-                    "name": "停車位置",
-                    "terms": "停車位置"
+                    "name": "公共交通の停止位置(全般)",
+                    "terms": "停止位置, 停車位置, 停船位置"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "ロープウェイ(停止位置)",
+                    "terms": "ロープウェイ停止位置, ロープウェイ, リフト, スキーリフト, チェアリフト, 牽引リフト"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "バス(停止位置)",
+                    "terms": "バス停止位置, バス"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "フェリー(停止位置)",
+                    "terms": "フェリー停止位置, フェリー"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "ライトレール(停止位置)",
+                    "terms": "ライトレール停止位置, ライトレール"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "モノレール(停止位置)",
+                    "terms": "モノレール停止位置, モノレール"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "地下鉄(停止位置)",
+                    "terms": "地下鉄停止位置, 地下鉄"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "鉄道(停止位置)",
+                    "terms": "鉄道停止位置, 電車, 列車, 鉄道"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "トラム(停止位置)",
+                    "terms": "トラム停止位置, トラム"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "トロリーバス(停止位置)",
+                    "terms": "トロリーバス停止位置, トロリーバス"
                 },
                 "railway": {
                     "name": "鉄道"
                     "terms": "ケーブルカー"
                 },
                 "railway/halt": {
-                    "name": "鉄道駅(停留場)",
-                    "terms": "停留所, 停留場, 駅, 鉄道駅"
+                    "name": "小駅(英国用)"
                 },
                 "railway/level_crossing": {
                     "name": "踏切 (車道)",
                     "terms": "踏切 (車道), 踏切"
                 },
+                "railway/light_rail": {
+                    "name": "ライトレール",
+                    "terms": "ライトレール, 軽便鉄道"
+                },
                 "railway/milestone": {
                     "name": "鉄道距離標",
                     "terms": "距離標, 距離, キロポスト"
                 },
+                "railway/miniature": {
+                    "name": "ミニチュア鉄道",
+                    "terms": "ミニチュア鉄道"
+                },
                 "railway/monorail": {
                     "name": "モノレール",
                     "terms": "モノレール"
                     "terms": "軽便鉄道, ナローゲージ, 線路"
                 },
                 "railway/platform": {
-                    "name": "プラットホーム(旧)",
-                    "terms": "プラットホーム(旧), ホーム(旧)"
+                    "name": "鉄道停車場 / プラットホーム"
                 },
                 "railway/rail": {
                     "name": "線路",
                     "terms": "鉄道信号機, 信号機, 信号"
                 },
                 "railway/station": {
-                    "name": "鉄道駅(停車場)",
-                    "terms": "鉄道駅, 駅, 停車場"
+                    "name": "鉄道駅"
                 },
                 "railway/subway": {
                     "name": "地下鉄",
                     "terms": "路面電車, トラム, LRT"
                 },
                 "railway/tram_stop": {
-                    "name": "路面電車停留所",
-                    "terms": "電停, 停留所, 駅, 停車場, 路面電車, 路面電車停留所, のりば"
+                    "name": "トラム停車位置"
                 },
                 "relation": {
                     "name": "リレーション",
                 },
                 "shop": {
                     "name": "店舗",
-                    "terms": "店舗"
+                    "terms": "店舗全般"
+                },
+                "shop/agrarian": {
+                    "name": "農業用品店",
+                    "terms": "農業用品店, 種苗店, 農協"
                 },
                 "shop/alcohol": {
                     "name": "酒店",
-                    "terms": "酒店, 酒屋"
+                    "terms": "酒店, 酒屋, アルコール, 嗜好品"
                 },
                 "shop/anime": {
                     "name": "アニメショップ",
-                    "terms": "アニメショップ"
+                    "terms": "アニメショップ, 娯楽"
                 },
                 "shop/antiques": {
                     "name": "古美術品店",
-                    "terms": "古美術品店, アンティークショップ"
+                    "terms": "古美術品店, アンティークショップ, 美術, アート"
                 },
                 "shop/appliance": {
                     "name": "家電販売店",
-                    "terms": "家電販売店,家電量販店,電器屋"
+                    "terms": "家電販売店,家電量販店,電器屋, 買い物, ショッピング"
                 },
                 "shop/art": {
                     "name": "美術品販売店",
-                    "terms": "現代美術の商店"
+                    "terms": "現代美術の商店, アート"
                 },
                 "shop/baby_goods": {
                     "name": "赤ちゃん用品店",
                 },
                 "shop/bakery": {
                     "name": "パン屋",
-                    "terms": "パン屋, ベーカリー"
+                    "terms": "パン屋, ベーカリー, 食品"
                 },
                 "shop/bathroom_furnishing": {
                     "name": "浴室用品店",
-                    "terms": "浴室用品店"
+                    "terms": "浴室用品店, バス用品"
                 },
                 "shop/beauty": {
                     "name": "美容サービス",
                 },
                 "shop/beauty/nails": {
                     "name": "ネイルサロン",
-                    "terms": "ネイルサロン"
+                    "terms": "ネイルサロン, 美容"
                 },
                 "shop/beauty/tanning": {
                     "name": "日焼けサロン",
-                    "terms": "日焼けサロン"
+                    "terms": "日焼けサロン, 美容"
                 },
                 "shop/bed": {
                     "name": "寝具店",
-                    "terms": "ベッド店, マットレス店, 寝具店"
+                    "terms": "ベッド店, マットレス店, 寝具店, 家具, 枕"
                 },
                 "shop/beverages": {
                     "name": "飲料店",
-                    "terms": "飲料店"
+                    "terms": "飲料店, 食品"
                 },
                 "shop/bicycle": {
                     "name": "自転車店",
                 },
                 "shop/bookmaker": {
                     "name": "公営競技投票券売り場",
-                    "terms": "公営競技投票券売り場, 馬券売り場, 車券売り場, 舟券売り場"
+                    "terms": "公営競技投票券売り場, 馬券売り場, 車券売り場, 舟券売り場, ギャンブル, アダルト"
                 },
                 "shop/books": {
                     "name": "本屋",
-                    "terms": "本屋, ブックストア, 古書店, 古書, 書籍販売, 書店"
+                    "terms": "本屋, ブックストア, 古書店, 古書, 書籍販売, 書店, 本"
                 },
                 "shop/boutique": {
                     "name": "ブティック",
-                    "terms": "ブティック, 婦人服店"
+                    "terms": "ブティック, 婦人服店, 衣類, 衣料, 小物, ファッション, 服"
                 },
                 "shop/butcher": {
                     "name": "精肉店",
-                    "terms": "精肉店, 肉屋"
+                    "terms": "精肉店, 肉屋, 食品"
                 },
                 "shop/candles": {
                     "name": "キャンドル専門店",
-                    "terms": "キャンドル, ロウソク, 蝋燭, 蠟燭"
+                    "terms": "キャンドル, ロウソク, 蝋燭, 蠟燭, インテリア"
                 },
                 "shop/car": {
-                    "name": "自動車販売店",
-                    "terms": "自動車販売店, カーディーラー"
+                    "name": "カーディーラー",
+                    "terms": "自動車販売店, カーディーラー, 中古車販売店"
                 },
                 "shop/car_parts": {
-                    "name": "è\87ªå\8b\95è»\8aé\83¨å\93\81åº\97",
-                    "terms": "自動車部品店, カーパーツショップ"
+                    "name": "ã\82«ã\83¼ç\94¨å\93\81åº\97",
+                    "terms": "自動車部品店, カーパーツショップ, カー用品, 自動車用品"
                 },
                 "shop/car_repair": {
                     "name": "自動車修理工場",
                 },
                 "shop/carpet": {
                     "name": "カーペット専門店",
-                    "terms": "カーペット, 敷物, 表具店, 表具"
+                    "terms": "カーペット, 敷物, 表具店, 表具, インテリア"
                 },
                 "shop/charity": {
                     "name": "チャリティーショップ",
                 },
                 "shop/cheese": {
                     "name": "チーズ店",
-                    "terms": "チーズ店"
+                    "terms": "チーズ店,食品"
                 },
                 "shop/chemist": {
-                    "name": "薬品・化粧品店",
-                    "terms": "薬品・化粧品店, ドラッグストア, 薬局, 薬屋"
+                    "name": "化粧品・薬品店(英国)",
+                    "terms": "薬品, 化粧品店, 薬局, 薬屋"
                 },
                 "shop/chocolate": {
                     "name": "チョコレート店",
-                    "terms": "チョコレート店"
+                    "terms": "チョコレート店, 食品"
                 },
                 "shop/clothes": {
                     "name": "衣料品店",
-                    "terms": "衣料品店, 洋服店, 呉服店"
+                    "terms": "衣料品店, 洋服店, 呉服店, 衣類, 服, スーツ, 和服, 着物, 古着"
                 },
                 "shop/coffee": {
                     "name": "コーヒー豆販売店",
-                    "terms": "コーヒー豆専門店"
+                    "terms": "コーヒー豆専門店, 嗜好品, 食品, 珈琲"
                 },
                 "shop/computer": {
                     "name": "コンピューター店",
                     "terms": "コンピューター店, パソコン店"
                 },
                 "shop/confectionery": {
-                    "name": "菓子屋",
-                    "terms": "菓子店, 駄菓子屋"
+                    "name": "菓子屋(販売)",
+                    "terms": "菓子店, 駄菓子屋, 食品, お菓子, スナック, チョコレート, 飴, キャンディ"
                 },
                 "shop/convenience": {
                     "name": "コンビニエンスストア",
-                    "terms": "コンビニエンスストア, コンビニ"
+                    "terms": "コンビニエンスストア, コンビニ, 買い物"
                 },
                 "shop/copyshop": {
                     "name": "コピー店",
                 },
                 "shop/cosmetics": {
                     "name": "化粧品店",
-                    "terms": "化粧品"
+                    "terms": "化粧品, 美容, コスメ"
                 },
                 "shop/craft": {
-                    "name": "ã\82¢ã\83¼ã\83\88ã\82·ã\83§ã\83\83ã\83\97",
-                    "terms": "アートショップ, 工芸"
+                    "name": "ç¾\8eè¡\93ã\83»å·¥è\8a¸ç\94¨å\93\81åº\97",
+                    "terms": "アートショップ, 工芸用品, 画材, 絵の具, 美術用品, クラフト"
                 },
                 "shop/curtain": {
                     "name": "カーテン店",
-                    "terms": "カーテン店"
+                    "terms": "カーテン店, 家具"
                 },
                 "shop/dairy": {
                     "name": "日配品店",
-                    "terms": "日配品店"
+                    "terms": "日配品店, 食品"
                 },
                 "shop/deli": {
                     "name": "惣菜屋",
-                    "terms": "惣菜屋, 弁当屋, デリカ"
+                    "terms": "惣菜屋, 弁当屋, デリカ, 食品"
                 },
                 "shop/department_store": {
                     "name": "百貨店",
-                    "terms": "百貨店, デパート"
+                    "terms": "百貨店, デパート, 買い物, ショッピング"
                 },
                 "shop/doityourself": {
                     "name": "ホームセンター",
-                    "terms": "日曜大工用品店, 工具店, DIYショップ, ホームセンター"
+                    "terms": "日曜大工用品店, 工具店, DIY, ホームセンター, 雑貨, 買い物, ショッピング, 園芸, 工芸用品, 家庭菜園, 植木"
                 },
                 "shop/dry_cleaning": {
                     "name": "クリーニング店",
                 },
                 "shop/e-cigarette": {
                     "name": "電子タバコ店",
-                    "terms": "電子タバコ店"
+                    "terms": "電子タバコ店, 嗜好品, タバコ, たばこ"
                 },
                 "shop/electronics": {
                     "name": "家電販売店",
-                    "terms": "家電販売店, 家電量販店"
+                    "terms": "家電販売店, 家電量販店, 買い物, ショッピング"
                 },
                 "shop/erotic": {
                     "name": "アダルトショップ",
                 },
                 "shop/fabric": {
                     "name": "生地屋",
-                    "terms": "布地, 織物, 反物, ファブリック店"
+                    "terms": "布地, 織物, 反物, ファブリック店, 生地, 裏地, 衣料, 服, 裁縫, 衣類"
                 },
                 "shop/farm": {
                     "name": "農産物直売所",
-                    "terms": "農産物直売所"
+                    "terms": "農産物直売所, 直販, 食品"
                 },
                 "shop/fashion": {
                     "name": "ファッション店",
-                    "terms": "洋品店, ファッション, 衣類, 衣服, 服, 店"
+                    "terms": "洋品店, ファッション, 衣類, 衣服, 服, 店, 衣料, 小物"
                 },
                 "shop/fishmonger": {
-                    "name": "魚屋"
+                    "name": "魚屋(非推奨)"
                 },
                 "shop/florist": {
                     "name": "生花店",
                 },
                 "shop/garden_centre": {
                     "name": "園芸用品店",
-                    "terms": "園芸用品店, ガーデンセンター"
+                    "terms": "園芸用品店, ガーデンセンター, DIY, 家庭菜園, 植木"
                 },
                 "shop/gas": {
                     "name": "ガスボンベ店",
                 },
                 "shop/greengrocer": {
                     "name": "八百屋",
-                    "terms": "八百屋, 青果店"
+                    "terms": "八百屋, 青果店, 食品"
                 },
                 "shop/hairdresser": {
                     "name": "理美容店",
-                    "terms": "理容店, 床屋, 美容室, 美容院, 散髪屋"
+                    "terms": "理容店, 床屋, 美容室, 美容院, 散髪屋, ヘアー, ヘアーサロン, カット, パーマ"
                 },
                 "shop/hardware": {
                     "name": "金物屋",
                 },
                 "shop/hifi": {
                     "name": "音響機器店",
-                    "terms": "音響機器店, オーディオ店"
+                    "terms": "音響機器店, オーディオ店, 音楽"
                 },
                 "shop/houseware": {
                     "name": "生活雑貨店",
-                    "terms": "雑貨屋"
+                    "terms": "雑貨屋, 家庭用品, 日用雑貨, バス用品, 寝具, ベッド, お風呂用品"
                 },
                 "shop/interior_decoration": {
                     "name": "室内装飾店",
-                    "terms": "インテリアショップ"
+                    "terms": "インテリアショップ, 家具"
                 },
                 "shop/jewelry": {
                     "name": "宝石店",
-                    "terms": "宝石店"
+                    "terms": "宝石店, 装飾品"
                 },
                 "shop/kiosk": {
-                    "name": "ã\83\8bã\83¥ã\83¼ã\82¹ã\82­ã\82ªã\82¹ã\82¯",
-                    "terms": "キオスク, ニューススタンド"
+                    "name": "キオスク",
+                    "terms": "キオスク, 売店"
                 },
                 "shop/kitchen": {
                     "name": "キッチンデザイン店",
-                    "terms": "台所, キッチン, デザイン, design, Kitchen"
+                    "terms": "台所, キッチン, デザイン, design, Kitchen, 台所用品, 水回り"
                 },
                 "shop/laundry": {
                     "name": "洗濯屋・コインランドリー",
                     "terms": "皮革洋品店, レザーショップ, 皮革, レザー"
                 },
                 "shop/locksmith": {
-                    "name": "é\8c å\89\8då±\8b",
-                    "terms": "錠前屋, 鍵屋"
+                    "name": "é\8dµå±\8bï¼\88å°\82é\96\80åº\97ï¼\89",
+                    "terms": "錠前屋, 鍵屋, カギ, 合鍵"
                 },
                 "shop/lottery": {
                     "name": "宝くじ売り場",
-                    "terms": "宝くじ売り場, くじ"
+                    "terms": "宝くじ売り場, くじ, ギャンブル"
                 },
                 "shop/mall": {
                     "name": "ショッピングセンター",
-                    "terms": "ショッピングセンター, ショッピングモール, 複合商業施設"
+                    "terms": "ショッピングセンター, ショッピングモール, 複合商業施設, 買い物, ショッピング"
                 },
                 "shop/massage": {
                     "name": "マッサージ店",
-                    "terms": "マッサージ店, マッサージ, あんま, 指圧"
+                    "terms": "マッサージ店, マッサージ, あんま, 指圧, 健康"
                 },
                 "shop/medical_supply": {
                     "name": "医療器具店",
                 },
                 "shop/money_lender": {
                     "name": "消費者金融",
-                    "terms": "消費者金融, サラ金, 貸金"
+                    "terms": "消費者金融, サラ金, 貸金, お金, 金融"
                 },
                 "shop/motorcycle": {
                     "name": "バイク店",
                 },
                 "shop/music": {
                     "name": "CD/レコード店",
-                    "terms": "CD店, レコード店"
+                    "terms": "CD店, レコード店, 音楽"
                 },
                 "shop/musical_instrument": {
                     "name": "楽器店",
-                    "terms": "楽器店"
+                    "terms": "楽器店, 音楽"
                 },
                 "shop/newsagent": {
                     "name": "新聞・雑誌店",
                 },
                 "shop/nutrition_supplements": {
                     "name": "栄養サプリ販売店",
-                    "terms": "栄養サプリメント販売店, サプリ専門店, サプリメント専門店"
+                    "terms": "栄養サプリメント販売店, サプリ専門店, サプリメント専門店, 健康"
                 },
                 "shop/optician": {
-                    "name": "メガネ",
-                    "terms": "メガネ, 眼鏡, メガネ屋, 眼鏡屋"
+                    "name": "メガネ",
+                    "terms": "メガネ, 眼鏡, メガネ屋, 眼鏡屋, めがね"
                 },
                 "shop/organic": {
                     "name": "オーガニック商品店",
-                    "terms": "オーガニック商品店, 有機野菜, オーガニック, 有機"
+                    "terms": "オーガニック商品店, 有機野菜, オーガニック, 有機, 食品"
                 },
                 "shop/outdoor": {
                     "name": "アウトドアショップ",
                     "terms": "塗料店"
                 },
                 "shop/pastry": {
-                    "name": "焼菓子店",
-                    "terms": "焼菓子店, ケーキ屋"
+                    "name": "焼菓子(ペイストリー)店",
+                    "terms": "焼菓子店, ケーキ屋, 食品, パイ, ビスケット, 洋菓子, ペイストリー, ペストリー, お菓子"
                 },
                 "shop/pawnbroker": {
                     "name": "質店",
-                    "terms": "質屋, 質店"
+                    "terms": "質屋, 質店, お金, 金融"
                 },
                 "shop/perfumery": {
                     "name": "香水店",
-                    "terms": "香水店"
+                    "terms": "香水店, 美容"
                 },
                 "shop/pet": {
                     "name": "ペットショップ",
-                    "terms": "ペット売り場, ペット, 家禽, ペットショップ"
+                    "terms": "ペット売り場, ペット, 家禽, ペットショップ, 動物"
                 },
                 "shop/photo": {
-                    "name": "å\86\99ç\9c\9få±\8b",
-                    "terms": "写真屋"
+                    "name": "å\86\99ç\9c\9fåº\97",
+                    "terms": "写真屋, 写真店, 現像, ビデオ, デジカメ"
                 },
                 "shop/pyrotechnics": {
                     "name": "花火店",
                 },
                 "shop/religion": {
                     "name": "宗教用品店",
-                    "terms": "宗教用品店, 仏壇, 仏具, 祭祀用品"
+                    "terms": "宗教用品店, 仏壇, 仏具, 祭祀用品, 信仰"
                 },
                 "shop/scuba_diving": {
                     "name": "スキューバダイビングショップ",
-                    "terms": "スキューバダイビングショップ, スキューバダイビング"
+                    "terms": "スキューバダイビングショップ, スキューバダイビング, スポーツ"
                 },
                 "shop/seafood": {
                     "name": "魚屋",
-                    "terms": "海鮮食品店, 魚屋, 魚市場"
+                    "terms": "海鮮食品店, 魚屋, 魚市場, 食品, 魚介"
                 },
                 "shop/second_hand": {
                     "name": "リサイクルショップ",
-                    "terms": "古物商, リユースショップ"
+                    "terms": "古物商, リユースショップ, 中古"
                 },
                 "shop/shoes": {
                     "name": "靴店",
                 },
                 "shop/supermarket": {
                     "name": "スーパーマーケット",
-                    "terms": "スーパーマーケット, スーパー"
+                    "terms": "スーパーマーケット, スーパー, 買い物, ショッピング"
                 },
                 "shop/tailor": {
                     "name": "仕立屋",
-                    "terms": "仕立屋, テイラー, 洋裁店"
+                    "terms": "仕立屋, テイラー, 洋裁店, 衣類, 衣料, 仕立て屋, 縫製, 服, スーツ"
                 },
                 "shop/tattoo": {
                     "name": "タトゥースタジオ",
-                    "terms": "刺青屋"
+                    "terms": "刺青屋, 美容"
                 },
                 "shop/tea": {
                     "name": "茶舗",
-                    "terms": "茶舗, 茶店(販売)"
+                    "terms": "茶舗, 茶店, 食品, お茶, 緑茶"
                 },
                 "shop/ticket": {
                     "name": "チケット店",
                     "terms": "チケット店, 金券ショップ, チケット"
                 },
+                "shop/tiles": {
+                    "name": "タイル店",
+                    "terms": "タイル店, タイルショップ"
+                },
                 "shop/tobacco": {
-                    "name": "煙草屋",
-                    "terms": "たばこ店, たばこ屋, タバコ, たばこ"
+                    "name": "たばこ店",
+                    "terms": "たばこ店, たばこ屋, タバコ, たばこ, 嗜好品"
                 },
                 "shop/toys": {
                     "name": "玩具店",
                     "terms": "玩具店, おもちゃ屋"
                 },
+                "shop/trade": {
+                    "name": "建築資材店",
+                    "terms": "建築資材店, 工務店, 建材店, 配管工"
+                },
                 "shop/travel_agency": {
                     "name": "旅行代理店",
                     "terms": "旅行代理店, トラベル,ツアー"
                 },
                 "shop/tyres": {
                     "name": "タイヤ店",
-                    "terms": "タイヤ店, タイヤ販売店"
+                    "terms": "タイヤ店, タイヤ販売店, 自動車"
                 },
                 "shop/vacant": {
-                    "name": "空き店舗"
+                    "name": "空き店舗, シャッター店舗"
                 },
                 "shop/vacuum_cleaner": {
                     "name": "掃除機店",
                     "terms": "掃除機店"
                 },
                 "shop/variety_store": {
-                    "name": "雑貨店",
-                    "terms": "雑貨店"
+                    "name": "雑貨店(低価格)",
+                    "terms": "雑貨店, 100円ショップ, バラエティストア, 百均, 日用雑貨, 買い物, ショッピング, ディスカウント, 100均"
                 },
                 "shop/video": {
                     "name": "ビデオソフト店",
-                    "terms": "ビデオソフト店, DVD店"
+                    "terms": "ビデオソフト店, DVD店, 娯楽"
                 },
                 "shop/video_games": {
                     "name": "テレビゲーム店",
-                    "terms": "テレビゲーム店"
+                    "terms": "テレビゲーム店, ビデオゲーム, 娯楽"
                 },
                 "shop/watches": {
                     "name": "腕時計店",
-                    "terms": "腕時計店"
+                    "terms": "腕時計店, 時計"
                 },
                 "shop/water_sports": {
                     "name": "ウォータースポーツ用品店",
-                    "terms": "マリンスポーツ専門店, ウォータースポーツ専門店, 水着屋"
+                    "terms": "マリンスポーツ専門店, ウォータースポーツ専門店, 水着屋, スポーツ"
                 },
                 "shop/weapons": {
                     "name": "武器屋",
                 },
                 "shop/window_blind": {
                     "name": "ブラインドカーテン専門店",
-                    "terms": "ブラインド販売店"
+                    "terms": "ブラインド販売店, 家具"
                 },
                 "shop/wine": {
                     "name": "ワイン店",
-                    "terms": "ワイン店, 酒屋"
+                    "terms": "ワイン店, 酒屋, 食品, アルコール, 嗜好品"
                 },
                 "tourism": {
                     "name": "観光",
                 },
                 "tourism/apartment": {
                     "name": "リゾートマンション",
-                    "terms": "リゾートマンション"
+                    "terms": "リゾートマンション, リゾート, 別荘, 保養"
                 },
                 "tourism/aquarium": {
                     "name": "水族館",
                     "terms": "水族館"
                 },
                 "tourism/artwork": {
-                    "name": "芸術作品",
-                    "terms": "芸術作品"
+                    "name": "パブリックアート",
+                    "terms": "芸術作品, 銅像, 屋外アート, 彫刻, 壁画, アート, 絵画, オブジェ"
                 },
                 "tourism/attraction": {
                     "name": "観光名所",
                 },
                 "tourism/camp_site": {
                     "name": "キャンプ場",
-                    "terms": "キャンプ場"
+                    "terms": "キャンプ場, アウトドア"
                 },
                 "tourism/caravan_site": {
                     "name": "オートキャンプ場",
-                    "terms": "オートキャンプ場"
+                    "terms": "オートキャンプ場, アウトドア, 自動車"
+                },
+                "tourism/chalet": {
+                    "name": "貸別荘(戸建て)",
+                    "terms": "別荘, リゾートマンション, リゾート, 保養"
                 },
                 "tourism/gallery": {
                     "name": "アートギャラリー",
-                    "terms": "画廊"
+                    "terms": "画廊, アート"
                 },
                 "tourism/guest_house": {
                     "name": "民宿",
-                    "terms": "民宿, ゲストハウス"
+                    "terms": "民宿, ゲストハウス, 宿, ホテル, 民泊"
                 },
                 "tourism/hostel": {
                     "name": "簡易宿泊所",
-                    "terms": "簡易宿泊所, ホステル"
+                    "terms": "簡易宿泊所, ホステル, 宿, ホテル, ユースホステル, ホステル, カプセルホテル"
                 },
                 "tourism/hotel": {
                     "name": "ホテル",
-                    "terms": "ホテル, 旅館"
+                    "terms": "ホテル, 旅館, 宿"
                 },
                 "tourism/information": {
                     "name": "観光案内",
                 },
                 "tourism/information/board": {
                     "name": "情報掲示板",
-                    "terms": "情報掲示板"
+                    "terms": "情報掲示板, 案内"
                 },
                 "tourism/information/guidepost": {
                     "name": "道標",
-                    "terms": "道標, ガイドポスト"
+                    "terms": "道標, ガイドポスト, 案内"
                 },
                 "tourism/information/map": {
                     "name": "地図板",
-                    "terms": "地図板"
+                    "terms": "地図板, 案内地図"
                 },
                 "tourism/information/office": {
                     "name": "観光案内所",
-                    "terms": "観光案内所"
+                    "terms": "観光案内所, 案内"
                 },
                 "tourism/motel": {
                     "name": "モーテル",
-                    "terms": "モーテル"
+                    "terms": "モーテル, 宿, ホテル"
                 },
                 "tourism/museum": {
                     "name": "博物館・美術館",
-                    "terms": "博物館, 美術館, 資料館"
+                    "terms": "博物館, 美術館, 資料館, アート, 歴史"
                 },
                 "tourism/picnic_site": {
                     "name": "ピクニック場",
-                    "terms": "ピクニック場, バーベキュー場"
+                    "terms": "ピクニック場, バーベキュー場, アウトドア"
                 },
                 "tourism/theme_park": {
                     "name": "テーマパーク",
-                    "terms": "テーマパーク, 遊園地"
+                    "terms": "テーマパーク, 遊園地, 娯楽"
                 },
                 "tourism/viewpoint": {
                     "name": "展望台",
-                    "terms": "展望台"
+                    "terms": "展望台, 観光"
+                },
+                "tourism/wilderness_hut": {
+                    "name": "避難小屋",
+                    "terms": "避難小屋, 山小屋"
                 },
                 "tourism/zoo": {
                     "name": "動物園",
-                    "terms": "動物園"
+                    "terms": "動物園, 娯楽"
                 },
                 "traffic_calming": {
-                    "name": "交通静穏化",
-                    "terms": "交通静穏化"
+                    "name": "交通静穏化設備(全般)",
+                    "terms": "交通静穏化, 交通安全"
                 },
                 "traffic_calming/bump": {
                     "name": "スピードバンプ",
-                    "terms": "スピードバンプ"
+                    "terms": "スピードバンプ, 交通安全"
                 },
                 "traffic_calming/chicane": {
                     "name": "シケイン",
-                    "terms": "シケイン"
+                    "terms": "シケイン, 交通安全"
                 },
                 "traffic_calming/choker": {
                     "name": "チョーカー",
-                    "terms": "チョーカー"
+                    "terms": "チョーカー, 交通安全"
                 },
                 "traffic_calming/cushion": {
                     "name": "スピードクッション",
-                    "terms": "スピードクッション"
+                    "terms": "スピードクッション, 交通安全"
                 },
                 "traffic_calming/dip": {
                     "name": "ディップ",
-                    "terms": "ディップ"
+                    "terms": "ディップ, 交通安全"
                 },
                 "traffic_calming/hump": {
                     "name": "スピードハンプ",
-                    "terms": "スピードハンプ"
+                    "terms": "スピードハンプ, 交通安全"
                 },
                 "traffic_calming/island": {
                     "name": "交通島",
-                    "terms": "交通島"
+                    "terms": "交通島, 交通安全"
                 },
                 "traffic_calming/rumble_strip": {
                     "name": "ランブルストリップ",
-                    "terms": "ランブルストリップ"
+                    "terms": "ランブルストリップ, 交通安全"
+                },
+                "traffic_calming/table": {
+                    "name": "隆起台(減速用)",
+                    "terms": "隆起台, スピードテーブル, 減速テーブル, 交通安全"
                 },
                 "type/boundary": {
                     "name": "境界",
                     "name": "乗馬ルート",
                     "terms": "乗馬"
                 },
+                "type/route/light_rail": {
+                    "name": "ライトレール・ルート",
+                    "terms": "ライトレール・ルート, 軽便鉄道ルート"
+                },
                 "type/route/pipeline": {
                     "name": "パイプラインルート",
                     "terms": "パイプラインルート"
                 },
+                "type/route/piste": {
+                    "name": "スキールート",
+                    "terms": "スキールート"
+                },
                 "type/route/power": {
                     "name": "電力線ルート",
                     "terms": "電力線ルート"
                     "name": "道路ルート",
                     "terms": "道路ルート"
                 },
+                "type/route/subway": {
+                    "name": "地下鉄路線",
+                    "terms": "地下鉄路線, 地下鉄経路, 地下鉄ルート"
+                },
                 "type/route/train": {
                     "name": "列車ルート",
                     "terms": "列車ルート, 運行系統"
                 },
                 "waterway/ditch": {
                     "name": "排水路",
-                    "terms": "排水路"
+                    "terms": "排水路, 用水路, 側溝, 溝, 灌漑用水, 水路"
                 },
                 "waterway/dock": {
                     "name": "ドック",
                 },
                 "waterway/drain": {
                     "name": "放水路",
-                    "terms": "放水路"
+                    "terms": "放水路, 工業排水, 水路"
                 },
                 "waterway/fuel": {
                     "name": "マリンスタンド",
                     "name": "小川",
                     "terms": "小川, せせらぎ, 川"
                 },
+                "waterway/stream_intermittent": {
+                    "name": "間欠河川",
+                    "terms": "間欠河川, 季節涸川"
+                },
                 "waterway/water_point": {
                     "name": "船舶用飲料水給水所",
                     "terms": "船舶用飲料水給水所"
                 "description": "DigitalGlobeのプレミアム衛星画像です。",
                 "name": "DigitalGlobeプレミアム画像"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "規約&フィードバック"
+                },
+                "description": "画像の境界と取得日付。ラベルはズームレベル14以上で表示。",
+                "name": "DigitalGlobeプレミアム画像撮影日"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "規約&フィードバック"
                 "description": "DigitalGlobeの標準衛星画像です。",
                 "name": "DigitalGlobe標準画像"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "規約&フィードバック"
+                },
+                "description": "画像の境界と取得日付。ラベルはズームレベル14以上で表示。",
+                "name": "DigitalGlobe標準画像撮影日"
+            },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "規約 & フィードバック"
-                }
+                },
+                "description": "Esri world imagery.",
+                "name": "Esri World Imagery"
+            },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "規約 & フィードバック"
+                },
+                "description": "おそらくデフォルトのレイヤより明瞭で正確、しかしやや古いEsriアーカイブ画像。(日本での違いは不明)",
+                "name": "Esri World Imagery(鮮明版)ベータ"
             },
             "MAPNIK": {
                 "attribution": {
                 },
                 "name": "OSM Inspector: タグ付け"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "ズームレベル16+ではUS Censusのパブリックドメインの地図データ。それ以下では2006年以降のOpenStreetmapに未投入の変更分のみ。",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "黄 = US Censusからのパブリックドメインの地図データ。赤 = penStreetMapに無いデータ。",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: サイクリング"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: ハイキング"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: スケート"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: 冬季スポーツ"
             },
+            "basemap.at": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "Basemap of Austria, based on goverment data.",
+                "name": "basemap.at"
+            },
+            "basemap.at-orthofoto": {
+                "attribution": {
+                    "text": "basemap.at"
+                },
+                "description": "basemap.at が提供するオルソ写真レイヤ。geoimage.at 画像の「後継」。",
+                "name": "basemap.at Orthofoto"
+            },
             "hike_n_bike": {
                 "attribution": {
                     "text": "© OpenStreetMap contributors"
             "mapbox_locator_overlay": {
                 "attribution": {
                     "text": "規約 & フィードバック"
-                }
+                },
+                "description": "背景画像上に低ズームでも主要な地物を表示します。",
+                "name": "地物簡略表示(低ズーム時)"
             },
             "openpt_map": {
                 "attribution": {
             "qa_no_address": {
                 "attribution": {
                     "text": "Simon Poole, Data ©OpenStreetMap contributors"
-                }
+                },
+                "name": "QA No Address"
             },
             "skobbler": {
                 "attribution": {
index dd73e032950e5d6aaf65a58afa4bc1e2ccdb4db2..259fe83ef021a3e8be3591f19a64bf80f568974e 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "ಗೆರೆಗಳಿಗೆ ಚುಕ್ಕೆಗಳನ್ನು ಸೇರಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅವುಗಳನ್ನು ಬೇರೆ ಗೆರೆಗಳಿಗೆ ಸೇರಿಸಲು ಅವುಗಳ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ. ಗೆರೆಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಅದರ ಮೇಲೆ ಎರಡು ಸಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ. "
+            },
+            "drag_node": {
+                "connected_to_hidden": "ಅಗೋಚರ ಮೂಲಕ್ಕೆ ಸಂಬಂಧಿಸಿದ್ದರಿಂದ ಪರಿಷ್ಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"
             }
         },
         "operations": {
             "localized_translation_language": "ಭಾಷೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ",
             "localized_translation_name": "ಹೆಸರು"
         },
+        "zoom_in_edit": "ಪರಿಷ್ಕರಿಸಲು zoom ಮಾಡಿ",
         "login": "ಲಾಗಿನ್",
+        "logout": "ಹೊರನಡೆ",
         "loading_auth": "ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ.....",
         "report_a_bug": "ದೋಷವನ್ನು ವಿವರಿಸಿ. ",
         "help_translate": "ಅನುವಾದಕ್ಕೆ ನೀವು ಸಹಾಯಮಾಡಿ. ",
             "title": "ಓಪೆನ್‌ಸ್ಟ್ರೀಟ್ಮ್ಯಾಪ್ ಜಾಲಕ್ಕೆ ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ರವಾನಿಸಿ.   ",
             "upload_explanation": "ನೀವು ಉಪ್ಲೋಡ್ ಮಾಡುವ ಎಲ್ಲ ಮಾಹಿತಿ ಆಥಾವ ಬದಲಾವಣೆಗಳು ಓಪನ್ಸ್ಟ್ರೀಟ್ಮ್ಯಾಪ್ ಮಾಹಿತಿ ಉಪಯೋಗಿಸುವ ಎಲ್ಲ ನಕ್ಷೆಗಲ್ಲಿ ವ್ಯಕ್ತವಾಗುತ್ತದೆ. ",
             "upload_explanation_with_user": "{user} ಉಪ್ಲೋಡ್ ಮಾಡುವ ಎಲ್ಲ ಮಾಹಿತಿ ಆಥಾವ ಬದಲಾವಣೆಗಳು ಓಪನ್ಸ್ಟ್ರೀಟ್ಮ್ಯಾಪ್ ಮಾಹಿತಿ ಉಪಯೋಗಿಸುವ ಎಲ್ಲ ನಕ್ಷೆಗಲ್ಲಿ ವ್ಯಕ್ತವಾಗುತ್ತದೆ. ",
+            "request_review": "ಬೇರೆ ಯಾರಾದರೂ ನನ್ನ ಪರಿಷ್ಕರಣೆಯನ್ನು ಪುನರವಲೋಕಿಸಲು ಇಚ್ಛಿಸುತ್ತೇನೆ",
             "save": "ಅಂತರಜಾಲಕ್ಕೆ ರವಾನೆ ಮಾಡು ",
             "cancel": "ರದ್ದು ಮಾಡು",
             "changes": "{count} ಬದಲಾವಣೆಗಳು",
+            "download_changes": "osmChange ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿರಿ",
             "warnings": "ಎಚ್ಚರಿಕೆಗಳು",
             "modified": "ಮಾರ್ಪಡಿಸು",
             "deleted": "ಅಳಿಸಲಾಯಿತು",
             "about_changeset_comments": "ಬದಲಾವಣೆಗಳ ಸಾರಾಂಶದ ಬಗ್ಗೆ",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments\n\nಯಾವುದಾದರೂ ಬದಲಾದ ಗುಂಪಿಗೆ ನಿಮ್ಮ ಅಭಿಪ್ರಾಯ ತಿಳಿಸಬೇಕಾದಲ್ಲಿ ಈ ದಾಖಲೆ ನಿಮ್ಮ ಸಹಾಯಕ್ಕಿದೆ.  ",
             "google_warning": "ನೀವು ಈ ಹೇಳಿಕೆಯಲ್ಲಿ ಗೂಗಲ್ ಅನ್ನು ಉಲ್ಲೇಖಿಸಿದ್ದೀರ. ಗೂಗಲ್ ಮಾಪ್ಸ್ ನಿಂದ ಮಾಹಿತಿ ಪಡೆಯುವುದು ನಿಷೇಧಿಸಿದೆ. ",
-            "google_warning_link": "http://www.openstreetmap.org/copyright\n\nಓಪನ್ಸ್ಟ್ರೀಟ್ಮ್ಯಾಪ್ ಕೃತಿಸ್ವಾಮ್ಯ ವಿವರಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿ ಇಲ್ಲಿ ದೊರೆಯುತ್ತದೆ.  "
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "ಸಂಪಾದನೆಗಳು {ಬಳಕೆದಾರ ಮೂಲಕ}",
                 "title": "ಹಿನ್ನೆಲೆ",
                 "zoom": "ಜೂಮ್",
                 "vintage": "ವಿಂಟೇಜ್",
+                "source": "ಮೂಲ",
+                "description": "ವಿವರಣೆ",
+                "accuracy": "ನಿಖರತೆ",
                 "unknown": "ಅಜ್ಞಾತ"
             },
             "history": {
             "title": "ಹಿನ್ನೆಲೆ",
             "description": "ಹಿನ್ನಲೆ ವ್ಯವಸ್ತೆಗಳು",
             "key": "B",
-            "percent_brightness": "{opacity} % ಉಜ್ಜ್ವಲತೆ",
             "none": "‍‍ಯಾವುದೂ ಇಲ್ಲ",
             "best_imagery": "ಈ ಪ್ರದೇಶಕ್ಕೆ ಅಪ್ರತಿಮ ಉಪಗ್ರಹ ಚಿತ್ರಣ  ",
             "switch": "ಈ ಹಿನ್ನಲೆಗೆ ಹಿಂತಿರುಗಿ ",
             "custom": "ಅನುಸರಣ",
             "custom_button": "ಅನುಸರಣ ಹಿನ್ನಲೆಯನ್ನು ಸಂಪಾದಿಸಿ",
-            "fix_misalignment": "ಉಪಗ್ರಹ ಚಿತ್ರಣ ಸರಿಹೊಂದಿಸುವುದು.",
-            "imagery_source_faq": "‍ಈ ಉಪಗ್ರಹ ಚಿತ್ರಣ ಎಲ್ಲಿಂದ ದೊರೆತಿರುವುದು?",
             "reset": "ಮರುಹೊಂದಿಸು",
             "minimap": {
-                "description": "ಚಿಕ್ಕ ನಕ್ಷೆ"
-            }
+                "key": "/"
+            },
+            "fix_misalignment": "ಉಪಗ್ರಹ ಚಿತ್ರಣ ಸರಿಹೊಂದಿಸುವುದು."
         },
         "map_data": {
             "title": "ನಕ್ಷೆ ಮಾಹಿತಿ.",
         },
         "help": {
             "title": "ಸಹಾಯ",
-            "key": "H"
+            "key": "H",
+            "lines": {
+                "title": "ರೇಖೆಗಳು",
+                "modify_line_h": "ರೇಖೆಗಳನ್ನು ಬದಲಿಸಲಾಗುತ್ತಿದೆ",
+                "connect_line_h": "ರೇಖೆಗಳನ್ನು ಜೋಡಿಸಲಾಗುತ್ತಿದೆ",
+                "disconnect_line_h": "ರೇಖೆಗಳನ್ನು ಬೇರ್ಪಡಿಸಲಾಗುತ್ತಿದೆ",
+                "move_line_h": "ರೇಖೆಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗುತ್ತಿದೆ",
+                "delete_line_h": "ರೇಖೆಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ"
+            },
+            "areas": {
+                "title": "ಪ್ರದೇಶ",
+                "point_or_area_h": "ಪ್ರದೇಶ ಅಥವಾ ಬಿಂದು?",
+                "add_area_h": "ಪ್ರದೇಶಗಳನ್ನು ಸೇರಿಸಲಾಗುತ್ತಿದೆ",
+                "square_area_h": "ಚೌಕ ಮೂಲೆಗಳು",
+                "modify_area_h": "ಪ್ರದೇಶಗಳನ್ನು ಮಾರ್ಪಡಿಸಲಾಗುತ್ತಿದೆ",
+                "delete_area_h": "ಪ್ರದೇಶಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ"
+            },
+            "relations": {
+                "title": "ಸಂಬಂಧ"
+            }
         },
         "intro": {
             "done": "‍ಮುಗಿಯಿತು",
                     "label": "ಸಾಮರ್ಥ್ಯ",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "ದಿಕ್ಕು",
-                    "options": {
-                        "E": "ಪೂರ್ವ",
-                        "ENE": "ಪೂರ್ವ - ಈಶಾನ್ಯ",
-                        "ESE": "ಪೂರ್ವ - ಆಗ್ನೇಯ",
-                        "N": "ಉತ್ತರ",
-                        "NE": "ಈಶಾನ್ಯ",
-                        "NNE": "ಉತ್ತರ - ಈಶಾನ್ಯ",
-                        "NNW": "ಉತ್ತರ - ವಾಯುವ್ಯ",
-                        "NW": "ವಾಯವ್ಯ",
-                        "S": "ದಕ್ಷಿಣ",
-                        "SE": "ಆಗ್ನೇಯ",
-                        "SSE": "ದಕ್ಷಿಣ - ಆಗ್ನೇಯ",
-                        "SSW": "ದಕ್ಷಿಣ - ನೈಋತ್ಯ",
-                        "SW": "ನೈಋತ್ಯ",
-                        "W": "ಪಶ್ಚಿಮ",
-                        "WNW": "ಪಶ್ಚಿಮ - ವಾಯುವ್ಯ",
-                        "WSW": "ಪಶ್ಚಿಮ - ನೈಋತ್ಯ"
-                    }
-                },
-                "clock_direction": {
-                    "label": "ದಿಕ್ಕು",
-                    "options": {
-                        "anticlockwise": "ಅಪ್ರದಕ್ಷಿಣವಾಗಿ",
-                        "clockwise": "ಪ್ರದಕ್ಷಿಣವಾಗಿ"
-                    }
-                },
                 "collection_times": {
                     "label": "ಸಂಗ್ರಹ ವೇಳೆ"
                 },
                     "label": "Par",
                     "placeholder": "೩, ೪, ೫..."
                 },
-                "parallel_direction": {
-                    "label": "ದಿಕ್ಕು"
-                },
                 "park_ride": {
                     "label": "ನಿಲ್ಲಿಸು ಮತ್ತು ಸವಾರಿ ಮಾಡು"
                 },
                 "amenity/bicycle_parking": {
                     "terms": "<translate with synonyms or related terms for 'Bicycle Parking', separated by commas>"
                 },
-                "amenity/bus_station": {
-                    "name": "ಬಸ್ ನಿಲ್ದಾಣ"
-                },
                 "amenity/cinema": {
                     "name": "ಸಿನಿಮಾ"
                 },
                 "ford": {
                     "name": "‍ಕಾಲ್ಗಡ"
                 },
-                "highway/bus_stop": {
-                    "name": "ಬಸ್ ನಿಲ್ದಾಣ"
-                },
                 "highway/steps": {
                     "name": "ಮೆಟ್ಟಿಲು"
                 },
                 "landuse/forest": {
                     "name": "ಅರಣ್ಯ"
                 },
-                "landuse/garages": {
-                    "name": "ಮೋಟಾರುಖಾನೆ‍ಗಳ್"
-                },
                 "landuse/grass": {
                     "name": "ಹುಲ್ಲು"
                 },
                 "place/village": {
                     "name": "ಹಳ್ಳಿ"
                 },
-                "railway/station": {
-                    "name": "ರೈಲು ನಿಲ್ದಾಣ"
-                },
                 "shop": {
                     "name": "ಅಂಗಡಿ"
                 },
index 9808ded183c57ac5f8aa5f2d688920d8dc15fc59..ad7eb60fbe7fb7758c5474da046f0b4cc8027642 100644 (file)
             "localized_translation_language": "언어 선택",
             "localized_translation_name": "이름"
         },
+        "zoom_in_edit": "편집하려면 확대하세요",
         "login": "로그인",
         "logout": "로그아웃",
         "loading_auth": "오픈스트리트맵에 연결 중...",
             "created": "만듦",
             "about_changeset_comments": "바뀜집합 덧글에 대해",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "덧글에서 구글을 언급했습니다: 구글 지도로부터 복사하는 것은 엄격히 금지됨을 유의하세요.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "덧글에서 구글을 언급했습니다: 구글 지도로부터 복사하는 것은 엄격히 금지됨을 유의하세요."
         },
         "contributors": {
             "list": "{users} 사용자의 편집",
                 "key": "B",
                 "title": "배경",
                 "zoom": "확대",
+                "vintage": "시점",
                 "source": "출처",
                 "description": "설명",
-                "resolution": "해",
+                "resolution": "해상도",
                 "accuracy": "정확도",
                 "unknown": "알 수 없음",
                 "show_tiles": "타일 보이기",
-                "hide_tiles": "타일 숨기기"
+                "hide_tiles": "타일 숨기기",
+                "show_vintage": "시점 보이기",
+                "hide_vintage": "시점 숨기기"
             },
             "history": {
                 "key": "H",
-                "title": "기록들",
+                "title": "역사",
                 "selected": "{n}개 선택함",
                 "version": "버전",
                 "last_edit": "최근 편집",
-                "edited_by": "편집:",
+                "edited_by": "편집",
                 "changeset": "바뀜집합",
                 "unknown": "알 수 없음",
                 "link_text": "openstreetmap.org에서의 기록"
                 "key": "M",
                 "title": "측정",
                 "selected": "{n}개 선택함",
-                "geometry": "기하적",
-                "closed": "닫음",
+                "geometry": "기하",
+                "closed_line": "닫힌 선",
+                "closed_area": "닫힌 공간",
                 "center": "가운데",
                 "perimeter": "둘레",
                 "length": "길이",
                 "centroid": "중심",
                 "location": "위치",
                 "metric": "미터법",
-                "imperial": "임페리얼"
+                "imperial": "야드파운드법",
+                "node_count": "노드 수"
             }
         },
         "geometry": {
             "point": "점",
-            "vertex": "ê¼­ì§\80점",
+            "vertex": "ê¼­ì§\93점",
             "line": "선",
             "area": "공간",
             "relation": "관계"
             "title": "배경",
             "description": "배경 설정",
             "key": "B",
-            "percent_brightness": "명도 {opacity}%",
+            "backgrounds": "배경",
             "none": "없음",
             "best_imagery": "이 위치의 가장 잘 알려진 사진 자료",
             "switch": "이 배경으로 복귀합니다",
             "custom": "사용자 지정",
             "custom_button": "사용자 지정 배경 편집",
-            "fix_misalignment": "사진 오프셋 조절",
-            "imagery_source_faq": "이 사진의 출처는 어디인가요?",
+            "overlays": "오버레이",
+            "imagery_source_faq": "이미지 정보 / 버그 신고",
             "reset": "재설정",
-            "offset": "아래의 회색 영역을 드래그하여 사진 오프셋을 조절하거나, 오프셋 값을 미터 단위로 입력하세요.",
+            "display_options": "디스플레이 옵션",
+            "brightness": "명도",
+            "contrast": "대비",
+            "saturation": "채도",
+            "sharpness": "선명도",
             "minimap": {
-                "description": "미니맵",
+                "description": "미니맵 보이기",
                 "tooltip": "현재 보여지는 지역을 찾을 수 있도록 지도를 축소하여 보여줍니다.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "사진 오프셋 조절",
+            "offset": "아래의 회색 영역을 드래그하여 사진 오프셋을 조절하거나, 오프셋 값을 미터 단위로 입력하세요."
         },
         "map_data": {
             "title": "지도 자료",
             "google": "Google+에 공유",
             "help_html": "변경사항은 몇 분 후에 \"표준\" 레이어에서 보여집니다. 다른 레이어와 특정 지물은 더 오래 걸릴 수 있습니다.",
             "help_link_text": "자세한 정보",
-            "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"
+            "help_link_url": "https://wiki.openstreetmap.org/wiki/Ko:FAQ#.EB.82.98.EB.8A.94_.EC.A7.80.EB.8F.84.EC.97.90_.EC.95.BD.EA.B0.84.EC.9D.98_.EB.B3.80.EA.B2.BD.EC.9D.84_.EA.B0.80.ED.96.88.EB.8B.A4._.EB.82.B4.EA.B0.80_.EC.96.B4.EB.96.BB.EA.B2.8C_.EB.82.98.EC.9D.98_.EB.B3.80.EA.B2.BD.EC.82.AC.ED.95.AD.EC.9D.84_.EB.B3.BC_.EC.88.98_.EC.9E.88.EB.82.98.EC.9A.94.3F"
         },
         "confirm": {
             "okay": "확인",
         "splash": {
             "welcome": "iD 오픈스트리트맵 편집기에 오신 것을 환영합니다",
             "text": "iD는 세계 최고의 자유 세계 지도에 기여하기 위한 친절하지만 강력한 도구입니다. 버전은 {version}입니다. 자세한 정보에 대해서는 {website}을 참조하고 {github}에서 버그를 보고하세요.",
-            "walkthrough": "연습 시작"
+            "walkthrough": "연습 시작하기",
+            "start": "지금 편집하기"
         },
         "source_switch": {
             "live": "실시간",
         },
         "validations": {
             "disconnected_highway": "도로가 연결되어 있지 않음",
-            "disconnected_highway_tooltip": "도로는 다른 도로나 건물 입구와 연결되어야합니다.",
+            "disconnected_highway_tooltip": "도로는 다른 도로나 건물 입구와 연결되어야 합니다.",
             "old_multipolygon": "바깥 쪽의 다중 다각형 태그",
             "old_multipolygon_tooltip": "이 스타일의 다중면은 더이상 사용되지 않습니다. 바깥쪽 대신에 부모 다중면을 배치해 주세요 ",
             "untagged_point": "태그되지 않은 점",
             "untagged_area_tooltip": "이 공간을 설명하는 지물 유형을 선택하세요.",
             "untagged_relation": "태그되지 않은 관계",
             "untagged_relation_tooltip": "이 관계가 무엇인지 설명하는 지물 유형을 선택하세요.",
-            "many_deletions": "개체 {n}개를 삭제하고 있습니다. 이를 수행하겠습니까? 다른 사람이 openstreetmap.org에서 보는 지도에서 삭제됩니다.",
             "tag_suggests_area": "{tag} 태그의 제안 선은 공간이여야 하지만 태그는 공간이 아닙니다",
             "deprecated_tags": "사용되지 않는 태그: {tags}"
         },
+        "zoom": {
+            "in": "확대",
+            "out": "축소"
+        },
         "cannot_zoom": "현재 모드에서 더 축소할 수 없습니다.",
         "full_screen": "전체 화면 전환",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Mapillary에서 이 그림 보기"
         },
+        "openstreetcam_images": {
+            "tooltip": "OpenStreetCam의 거리수준 사진"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "OpenStreetCam에서 이 사진 보기"
+        },
         "help": {
             "title": "도움말",
             "key": "H",
-            "help": "# 도움말\n\n이것은 세계의 자유롭고 편집할 수 있는 지도인,\n[OpenStreetMap](http://www.openstreetmap.org/)을 위한 편집기입니다.\n모두를 위한 더 나은 세계의 오픈 소스 및 오픈 데이터 지도를 만들기 위해,\n당신의 지역에서 데이터를 추가하고 업데이트하려면 이를 사용할 수 있습니다.\n\n이 지도에서 만든 편집은 OpenStreetMap을 사용하는 모두에게 보여집니다.\n편집하려면 [로그인](https://www.openstreetmap.org/login) 해야 합니다.\n\n[iD 편집기](http://ideditor.com/)는 [GitHub에서 사용할 수 있는 소스\n코드](https://github.com/openstreetmap/iD)로 된 협업 프로젝트입니다.\n",
-            "gps": "# GPS\n\n수집된 GPS 추적은 OpenStreetMap을 위한 하나의 가치 있는 데이터 자료입니다. 이\n편집기는 로컬 컴퓨터에 있는 `.gpx` 파일로 로컬 추적을 지원합니다. 여러 스마트폰\n애플리케이션은 물론 개인 GPS 하드웨어로 GPS 추적을 모을 수 있습니다.\n\nGPS 측량을 수행하는 방법에 대한 자세한 정보는\n[스마트폰, GPS, 또는 종이로 매핑하기](http://learnosm.org/en/mobile-mapping/)을 읽으세요.\n\n매핑을 위해 GPX 트랙을 사용하려면, 지도 편집기 위에 GPX을 끌어 놓으세요.\n그것이 인식되면, 밝은 보라 선으로 지도에 추가됩니다. 새 GPX로 공급되는 레이어로\n활성화, 비활성화, 또는 확대하려면 오른쪽에 있는 '지도 데이터' 메뉴를 클릭하세요.\n\nGPX 트랙은 OpenStreetMap에 직접 올려지지 않습니다 - 그것을 사용하는 최상의 방법은\n추가하는 새로운 지물을 위한 가이드로 사용하여, 지도를 그리는 것이며, 또한 다른 사용자가\n사용하기 위해 [OpenStreetMap에 그것을 올리는](http://www.openstreetmap.org/trace/create) 것입니다.\n",
-            "imagery": "# 사진\n\n항공 사진은 매핑에 있어서 중요한 자료입니다. 비행기 플라이오버, 위성 뷰와\n자유롭게 컴파일된 자료의 조합은 편집기에서 오른쪽에 있는 '배경 설정' 메뉴에서\n사용할 수 있습니다.\n\n기본적으로 [Bing 지도](http://www.bing.com/maps/) 위성 레이어가 편집기에\n표현되지만, 기존대로 새 지리적 지역으로 지도를 이동하고 확대할 수 있고, 새 자료는\n사용할 수 있게 될 것입니다. 미국, 프랑스와 덴마크와 같은 일부 국가는 일부 지역에서\n매우 높은 품질의 사진을 사용할 수 있습니다.\n\n사진은 때때로 사진 제공자 측이 실수하기 때문에 지도 데이터에 오프셋이 있습니다.\n만약 배경에서 도로가 옮겨진 것이 많이 보인다면, 즉시 배경에 맞게 그들 모두를 이동하지\n마십시오. 대신 사진을 조정할 수 있으며 배경 설정 UI의 아래에 있는 '정렬 고치기'를\n클릭하여 기존 데이터에 맞추면 됩니다.\n",
-            "addresses": "# 주소\n\n주소는 지도를 위한 가장 유용한 정보의 일부입니다.\n\n주소가 주로 거리의 부분으로 표현되어 있더라도, OpenStreetMap에서 주소는\n거리를 따라 건물과 장소의 특성으로 기록하고 있습니다.\n\n건물 외곽선으로 매핑된 장소뿐만 아니라 단일 점으로 매핑된 장소에 주소\n정보를 추가할 수 있습니다. 최적의 주소 데이터 자료는 지상에서의 측량이나\n개인 지식에서 있습니다 - 다른 지물과 마찬가지로, Google 지도와 같은 상용 자료에서 복사하는 행위는 엄격히 금지됩니다.\n",
-            "inspector": "# 특성 편집기 사용하기\n\n특성 편집기는 선택된 지물의 자세한 내용을 편집할 수 있도록 하는 페이지의 왼쪽에\n있는 부분입니다.\n\n### 지물 유형 선택하기\n\n점, 선, 또는 지역을 추가하고 나서, 고속도로나 주거 도로, 수퍼마켓 또는 카페와\n같은 그 지물의 유형을 선택할 수 있습니다. 특성 편집기는 일반적인 지물 유형에\n대해 버튼을 표시하며, 당신은 검색 상자에 찾으려는 지물을 입력해서 다른 것을\n찾을 수 있습니다.\n\n지물 유형에 대한 자세히 알아보려면 그 버튼의 아래 오른쪽 모서리의 'i'를 클릭하세요.\n해당 유형을 선택하려면 버튼을 클릭하세요.\n\n### 양식 사용하기 및 태그 편집하기\n\n지물 유형을 선택하고 나서, 또는 이미 유형이 할당된 지물을 선택할 때, 특성\n편집기는 이름 및 주소와 같은 지물에 대해 자세한 사항으로 된 필드를 표시합니다.\n\n보이는 필드 아래에, '필드 추가' 드롭다운을 클릭하여 위키백과 링크, 휠체어 접근과\n같은 다른 자세한 사항을 추가할 수 있습니다.\n\n특성 편집기 아래에, 요소에 임의의 다른 태그를 추가하려면 '추가적인 태그'를\n클릭하세요. [Taginfo](http://taginfo.openstreetmap.org/)는 인기 있는 태그\n조합에 대해 자세히 알아보기 위한 훌륭한 자료입니다.\n\n특성 편집기에서 바꾼 내용은 자동으로 지도에 적용됩니다. '실행 취소' 버튼을\n클릭하여 언제든지 되돌릴 수 있습니다.\n"
+            "help": {
+                "title": "도움말",
+                "welcome": "[OpenStreetMap] (https://www.openstreetmap.org/)의 iD 편집기에 오신 것을 환영합니다. 이 편집기를 사용하면 웹 브라우저에서 바로 OpenStreetMap을 업데이트 할 수 있습니다.",
+                "open_data_h": "데이터 개방",
+                "open_data": "이 맵에서 편집 한 내용은 OpenStreetMap을 사용하는 모든 사용자가 볼 수 있습니다. 귀하의 편집 내용은 개인 지식, 지상 설문 조사 또는 공중 또는 거리 사진에서 수집한 이미지를 기반으로 할 수 있습니다. Google 지도와 같은 상업적인 출처에서 복사하는 행위는 [엄격히 금지되어 있습니다](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "시작하기 전에",
+                "before_start": "편집을 시작하기 전에 OpenStreetMap과 이 편집기에 익숙해야 합니다. iD에는 OpenStreetMap 편집의 기본 사항을 알려주는 연습이 있습니다. 튜토리얼을 보려면 이 화면에서 \"연습 시작하기\"를 클릭하세요 - 약 15 분이 소요됩니다.",
+                "open_source_h": "오픈소스",
+                "open_source": "iD 편집기는 공동 작업 방식의 오픈 소스 프로젝트이며, 버전 {version}을 사용 중입니다. 소스 코드는 [GitHub에서] 이용할 수 있습니다 (https://github.com/openstreetmap/iD).",
+                "open_source_help": "iD에 [번역] (https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) 또는 [버그 신고] (https://github.com/openstreetmap/iD/issues)를 통해 도움을 줄 수 있습니다."
+            },
+            "overview": {
+                "title": "개요",
+                "navigation_h": "둘러보기",
+                "navigation_drag": "마우스 왼쪽 버튼 {leftclick}을 누른 상태에서 마우스를 움직여 지도를 드래그 할 수 있습니다. 키보드의 `↓`,`↑`,`←`,`→`화살표 키를 사용할 수도 있습니다.",
+                "navigation_zoom": "마우스 휠이나 트랙 패드로 스크롤하거나 지도 측면의 {plus} / {minus} 버튼을 클릭하여 확대하거나 축소 할 수 있습니다. 키보드의 `+`,`-` 키를 사용할 수도 있습니다.",
+                "features_h": "지도 기능",
+                "features": "우리는 *지물*이라는 단어를 사용하여 도로, 건물, 또는 지도에 나타나는 것을 설명합니다. 현실 세계의 모든 것을 OpenStreetMap을 이용하여 매핑할 수 있습니다. 지도 기능은 *점*, *선*, 또는 *공간*을 사용하여 지도에 표기합니다.",
+                "nodes_ways": "OpenStreetmap에서, 점은 때떄로 *노드*라고 불리며, 선과 공간은 때때로 *길*이라고 불립니다."
+            },
+            "editing": {
+                "title": "편집 & 저장하기",
+                "select_h": "선택",
+                "multiselect_h": "여러 선택",
+                "undo_redo_h": "되돌리기 & 복구하기",
+                "save_h": "저장",
+                "upload_h": "업로드",
+                "backups_h": "자동 백업",
+                "keyboard_h": "키보드 단축키"
+            },
+            "feature_editor": {
+                "title": "지물 편집기"
+            },
+            "points": {
+                "title": "점"
+            },
+            "lines": {
+                "title": "선"
+            },
+            "areas": {
+                "title": "공간"
+            },
+            "relations": {
+                "title": "관계",
+                "multipolygon_h": "다중 다각형",
+                "turn_restriction_h": "회전 제한",
+                "route_h": "노선",
+                "boundary_h": "경계"
+            }
         },
         "intro": {
             "done": "완료",
                     "10th-avenue": "10번가",
                     "11th-avenue": "11번가",
                     "12th-avenue": "12번가",
-                    "east-street": "동쪽 길",
+                    "east-street": "동쪽길",
+                    "flower-street": "꽃길",
                     "lafayette-park": "LaFayette 공원",
                     "las-coffee-cafe": "L.A.의 카페",
+                    "main-street-cafe": "중앙로 카페",
+                    "main-street-fitness": "중앙로 헬스장",
                     "main-street": "중앙로",
-                    "maple-street": "단풍나무 길",
+                    "maple-street": "단풍나무길",
                     "pizza-hut": "피자헛",
+                    "river-drive": "강변로",
                     "river-road": "하천 도로",
                     "river-street": "강가",
-                    "south-street": "남쪽 길",
+                    "riverwalk-trail": "강변 보행로",
+                    "south-street": "남쪽길",
                     "three-rivers-city-hall": "삼천시청",
                     "three-rivers-elementary-school": "삼천초등학교",
                     "three-rivers-fire-department": "삼천소방서",
                     "three-rivers-post-office": "삼천우체국",
                     "three-rivers-public-library": "삼천도서관",
                     "three-rivers": "삼천",
-                    "west-street": "서쪽 길"
+                    "west-street": "서쪽길"
                 }
             },
             "welcome": {
             },
             "areas": {
                 "title": "공간",
-                "add_playground": "*공간*은 호수, 건물, 주거 지역같은 지형지물의 경계를 표시하는 데 사용됩니다. {br} 일반적으로 점으로 매핑 할 수 있는 많은 기능에 대한 자세한 매핑에 사용할 수도 있습니다. **{button} 공간 버튼을 클릭하여 새 영역을 추가하세요.**",
+                "add_playground": "*ê³µê°\84\9d\80 í\98¸ì\88\98, ê±´ë¬¼, ì£¼ê±° ì§\80ì\97­ê³¼ ê°\99ì\9d\80 ì§\80í\98\95ì§\80물ì\9d\98 ê²½ê³\84를 í\91\9cì\8b\9cí\95\98ë\8a\94 ë\8d° ì\82¬ì\9a©ë\90©ë\8b\88ë\8b¤. {br} ì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ì \90ì\9c¼ë¡\9c ë§¤í\95\91 í\95  ì\88\98 ì\9e\88ë\8a\94 ë§\8eì\9d\80 ê¸°ë\8a¥ì\97\90 ë\8c\80í\95\9c ì\9e\90ì\84¸í\95\9c ë§¤í\95\91ì\97\90 ì\82¬ì\9a©í\95  ì\88\98ë\8f\84 ì\9e\88ì\8aµë\8b\88ë\8b¤. **{button} ê³µê°\84 ë²\84í\8a¼ì\9d\84 í\81´ë¦­í\95\98ì\97¬ ì\83\88 ì\98\81ì\97­ì\9d\84 ì¶\94ê°\80í\95\98ì\84¸ì\9a\94.**",
                 "start_playground": "공간을 그려서 이 놀이터를 지도에 추가해 봅시다. 영역은 지형지물의 바깥쪽 가장자리를 따라 *노드*를 배치하여 그립니다. **클릭하거나 스페이스 바를 눌러 운동장 모서리 중 하나에 시작 노드를 놓으세요.**",
                 "continue_playground": "놀이터의 가장자리를 따라 더 많은 노드를 배치하여 영역 그리기를 계속하십시오. 해당 영역을 기존 경로에 연결할 수 있습니다. {br}도움말 : '{alt}'키를 누르고 있으면 노드가 다른 점에 연결되지 않습니다. **놀이터의 공간을 계속 그리세요.**",
                 "finish_playground": "Enter 키를 누르거나 첫 번째 노드 또는 마지막 노드를 다시 클릭하여 영역 그리기를 마칩니다. **놀이터 영역 그리기를 마치세요.**",
                 "operations": {
                     "title": "수정",
                     "continue_line": "선택된 노드에서 선 계속 그리기",
+                    "merge": "선택된 지물 병합",
                     "disconnect": "선택한 노드에서 지물 연결 해제",
                     "split": "선택한 노드에서 선을 두개로 분할합니다.",
                     "reverse": "길을 반대로 하기",
                 }
             }
         },
+        "units": {
+            "north": "북",
+            "south": "남",
+            "east": "동",
+            "west": "서"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "상표"
                 },
+                "brewery": {
+                    "label": "생맥주"
+                },
                 "bridge": {
                     "label": "유형",
                     "placeholder": "보통"
                     "label": "수용량",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "방향",
-                    "options": {
-                        "E": "동",
-                        "ENE": "동북동",
-                        "ESE": "동남동",
-                        "N": "북",
-                        "NE": "북동",
-                        "NNE": "북북동",
-                        "NNW": "북북서",
-                        "NW": "북서",
-                        "S": "남",
-                        "SE": "남동",
-                        "SSE": "남남동",
-                        "SSW": "남남서",
-                        "SW": "남서",
-                        "W": "서",
-                        "WNW": "서북서",
-                        "WSW": "서남서"
-                    }
-                },
                 "castle_type": {
                     "label": "유형"
                 },
-                "clock_direction": {
-                    "label": "방향",
-                    "options": {
-                        "anticlockwise": "시계 반대 방향",
-                        "clockwise": "시계 방향"
-                    }
-                },
                 "clothes": {
                     "label": "옷"
                 },
                 "diaper": {
                     "label": "기저귀 교환대 이용 가능"
                 },
+                "direction": {
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "방향",
+                    "options": {
+                        "E": "동",
+                        "ENE": "동북동",
+                        "ESE": "동남동",
+                        "N": "북",
+                        "NE": "북동",
+                        "NNE": "북북동",
+                        "NNW": "북북서",
+                        "NW": "북서",
+                        "S": "남",
+                        "SE": "남동",
+                        "SSE": "남남동",
+                        "SSW": "남남서",
+                        "SW": "남서",
+                        "W": "서",
+                        "WNW": "서북서",
+                        "WSW": "서남서"
+                    }
+                },
+                "direction_clock": {
+                    "label": "방향",
+                    "options": {
+                        "anticlockwise": "시계 반대 방향",
+                        "clockwise": "시계 방향"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "방향",
+                    "options": {
+                        "backward": "역방향",
+                        "both": "둘 다 / 모두",
+                        "forward": "정방향"
+                    }
+                },
                 "display": {
                     "label": "표시"
                 },
                 "memorial": {
                     "label": "유형"
                 },
-                "milestone_position": {
-                    "placeholder": "소수점 한 자리로 거리 (123.4)"
+                "monitoring_multi": {
+                    "label": "관측 대상"
                 },
                 "mtb/scale": {
                     "label": "산악 자전거 난이도",
                     "label": "일방통행",
                     "options": {
                         "no": "아니오",
+                        "reversible": "도로 진행 방향과 역방향",
                         "undefined": "아니오로 간주",
                         "yes": "예"
                     }
                     "label": "당",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "방향",
-                    "options": {
-                        "backward": "역방향",
-                        "forward": "정방향"
-                    }
-                },
                 "park_ride": {
                     "label": "파크 앤드 라이드"
                 },
                 "railway": {
                     "label": "유형"
                 },
+                "railway/position": {
+                    "label": "거리표 위치",
+                    "placeholder": "소수점 한 자리로 거리 (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "방향",
+                    "options": {
+                        "backward": "역방향",
+                        "both": "둘 다 / 모두",
+                        "forward": "정방향"
+                    }
+                },
                 "rating": {
                     "label": "정격 용량"
                 },
                 "recycling_accepts": {
                     "label": "수락"
                 },
-                "recycling_type": {
-                    "label": "재활용 종류",
-                    "options": {
-                        "centre": "재활용 센터",
-                        "container": "컨테이너"
-                    }
-                },
                 "ref": {
                     "label": "참조"
                 },
+                "ref/isil": {
+                    "label": "ISIL 코드"
+                },
                 "ref_aeroway_gate": {
                     "label": "탑승구 번호"
                 },
                 "traffic_signals": {
                     "label": "유형"
                 },
+                "traffic_signals/direction": {
+                    "options": {
+                        "backward": "역방향",
+                        "both": "둘 다 / 모두",
+                        "forward": "정방향"
+                    }
+                },
                 "trail_visibility": {
                     "label": "경로 가시성",
                     "options": {
                     "terms": "로프 견인 리프트"
                 },
                 "aerialway/station": {
-                    "name": "공중 이동로 승강장",
-                    "terms": "공중 이동로 승강장, 리프트 승강장"
+                    "name": "공중 이동로 승강장"
                 },
                 "aerialway/t-bar": {
                     "name": "T-바 리프트",
                     "terms": "환전소"
                 },
                 "amenity/bus_station": {
-                    "name": "버스환승센터",
-                    "terms": "버스환승센터, 버스 터미널"
+                    "name": "버스 터미널"
                 },
                 "amenity/cafe": {
                     "name": "카페",
                     "terms": "패스트푸드"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "항구, 선착장",
-                    "terms": "항구, 선착장"
+                    "name": "페리 터미널"
                 },
                 "amenity/fire_station": {
                     "name": "소방서",
                     "name": "도서관",
                     "terms": "도서관, 문고"
                 },
+                "amenity/love_hotel": {
+                    "name": "러브 호텔"
+                },
                 "amenity/marketplace": {
                     "name": "시장",
                     "terms": "시장"
                     "terms": "관리소, 레인저 스테이션"
                 },
                 "amenity/recycling": {
-                    "name": "재활용",
-                    "terms": "재활용"
+                    "name": "재활용 용기"
                 },
                 "amenity/recycling_centre": {
                     "name": "재활용 센터",
                 "amenity/shower": {
                     "name": "샤워실"
                 },
+                "amenity/smoking_area": {
+                    "name": "흡연 구역"
+                },
                 "amenity/social_facility": {
                     "name": "사회시설",
                     "terms": "사회시설"
                     "name": "산 울타리",
                     "terms": "산울타리"
                 },
+                "barrier/kerb": {
+                    "name": "갓돌"
+                },
                 "barrier/kissing_gate": {
                     "name": "목장 문",
                     "terms": "좁게 열리는 문"
                     "name": "외양간",
                     "terms": "헛간"
                 },
+                "building/bungalow": {
+                    "name": "방갈로"
+                },
                 "building/bunker": {
                     "name": "벙커"
                 },
                     "name": "유치원 건물",
                     "terms": "어린이집/유치원 건물"
                 },
+                "building/mosque": {
+                    "name": "모스크 건물"
+                },
                 "building/public": {
                     "name": "공공 건물",
                     "terms": "공공 건물"
                     "name": "지붕",
                     "terms": "지붕"
                 },
+                "building/ruins": {
+                    "name": "건물 폐허"
+                },
                 "building/school": {
                     "name": "학교 건물",
                     "terms": "초등학교,중학교,고등학교"
                     "name": "반분리된 주택",
                     "terms": "반분리된 주택"
                 },
+                "building/service": {
+                    "name": "서비스 건물"
+                },
                 "building/shed": {
                     "name": "오두막",
                     "terms": "헛간"
                     "name": "마구간",
                     "terms": "마구간"
                 },
+                "building/stadium": {
+                    "name": "경기장 건물"
+                },
                 "building/static_caravan": {
                     "name": "고정형 이동식 주택",
                     "terms": "이동 주택"
                 },
+                "building/temple": {
+                    "name": "사원 건물"
+                },
                 "building/terrace": {
                     "name": "연립주택",
                     "terms": "테라스 하우스"
                 "building/train_station": {
                     "name": "기차역"
                 },
+                "building/transportation": {
+                    "name": "대중교통 건물"
+                },
                 "building/university": {
                     "name": "대학 건물",
                     "terms": "대학교 건물"
                     "name": "캠핑장",
                     "terms": "캠핑장"
                 },
+                "circular": {
+                    "name": "로터리"
+                },
                 "club": {
                     "name": "클럽",
                     "terms": "클럽"
                     "name": "승마로",
                     "terms": "승마도"
                 },
+                "highway/bus_guideway": {
+                    "name": "독립된 버스전용차로",
+                    "terms": "BRT"
+                },
                 "highway/bus_stop": {
-                    "name": "버스 정류소",
-                    "terms": "버스정류소"
+                    "name": "버스 정류장"
                 },
                 "highway/corridor": {
                     "name": "실내 복도",
                     "name": "숲",
                     "terms": "삼림,산림,나무"
                 },
-                "landuse/garages": {
-                    "name": "차고",
-                    "terms": "차고"
-                },
                 "landuse/grass": {
                     "name": "잔디",
                     "terms": "잔디"
                 "landuse/greenfield": {
                     "name": "그린필드"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "온실 원예",
+                    "terms": "꽃,화초,온실,비닐하우스,원예"
+                },
                 "landuse/harbour": {
                     "name": "항구",
                     "terms": "항구"
                     "name": "안테나 기둥",
                     "terms": "안테나,방송탑,송신탑,기지국"
                 },
+                "man_made/monitoring_station": {
+                    "name": "관측소",
+                    "terms": "날씨,기상,지진,대기,미세먼지,GPS"
+                },
                 "man_made/observation": {
                     "name": "전망대",
                     "terms": "관찰탑, 감시탑"
                     "name": "우수관",
                     "terms": "빗물 배수관"
                 },
+                "manhole/telecom": {
+                    "name": "전기 통신 맨홀",
+                    "terms": "뚜껑,전화,구멍,텔레콤"
+                },
                 "natural": {
                     "name": "자연",
                     "terms": "자연"
                     "name": "회계사 사무소"
                 },
                 "office/administrative": {
-                    "name": "관리 사무소",
-                    "terms": "관리 사무소"
+                    "name": "관리 사무소"
                 },
                 "office/adoption_agency": {
                     "name": "입양기관"
                     "name": "자선 단체 사무소"
                 },
                 "office/company": {
-                    "name": "회사 사무실",
-                    "terms": "회사 사무소"
+                    "name": "기업 사무소"
                 },
                 "office/coworking": {
                     "name": "공동 작업 공간",
                     "name": "금융 사무소",
                     "terms": "금융 사무실"
                 },
+                "office/forestry": {
+                    "name": "삼림 관리 사무소",
+                    "terms": "숲,레인저"
+                },
                 "office/foundation": {
                     "name": "재단 사무소"
                 },
                     "terms": "법률 사무실"
                 },
                 "office/lawyer/notary": {
-                    "name": "공증인 사무소",
-                    "terms": "공증인 사무소"
+                    "name": "공증인 사무소"
                 },
                 "office/moving_company": {
                     "name": "이삿짐센터",
                     "terms": "연구 사무소"
                 },
                 "office/tax_advisor": {
-                    "name": "세무사 사무소"
+                    "name": "세무사 사무소",
+                    "terms": "세금,조세"
                 },
                 "office/telecommunication": {
                     "name": "통신 사무실",
                     "name": "변압 시설",
                     "terms": "변압 시설"
                 },
+                "public_transport/linear_platform": {
+                    "name": "대중교통 정거장 / 승강장",
+                    "terms": "플랫폼,대중교통"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "삭도 정거장 / 승강장",
+                    "terms": "가공삭도,공중삭도,로프웨이,케이블카,플랫폼,대중교통"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "버스 정류장",
+                    "terms": "버스,정류소,정거장,대중교통"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "페리 정거장 / 승강장",
+                    "terms": "배,보트,부두,페리,잔교,플랫폼,대중교통"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "경전철 정거장 / 승강장",
+                    "terms": "전기,경전철,라이트 레일,플랫폼,대중교통,철도,선로,트롤리"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "모노레일 정거장 / 승강장",
+                    "terms": "모노레일,플랫폼,대중교통,철도"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "지하철 정거장 / 승강장",
+                    "terms": "지하철,플랫폼,대중교통,철도,선로,지하"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "기차 정거장 / 승강장",
+                    "terms": "플랫폼,대중교통,철도,선로,기차"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "전차 정거장 / 승강장",
+                    "terms": "전기,플랫폼,대중교통,철도,선로,전차,트롤리"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "트롤리버스 정류장",
+                    "terms": "버스,전기,정류소,정거장,대중교통,무궤도,전차,트롤리"
+                },
                 "public_transport/platform": {
-                    "name": "승강장",
-                    "terms": "플랫폼"
+                    "name": "대중교통 정거장 / 승강장",
+                    "terms": "플랫폼,대중교통"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "삭도 정거장 / 승강장",
+                    "terms": "가공삭도,공중삭도,로프웨이,케이블카,플랫폼,대중교통"
+                },
+                "public_transport/platform_bus": {
+                    "name": "버스 정류장",
+                    "terms": "버스,정류소,정거장,대중교통"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "페리 정거장 / 승강장",
+                    "terms": "배,보트,부두,페리,잔교,플랫폼,대중교통"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "경전철 정거장 / 승강장",
+                    "terms": "전기,경전철,라이트 레일,플랫폼,대중교통,철도,선로,트롤리"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "모노레일 정거장 / 승강장",
+                    "terms": "모노레일,플랫폼,대중교통,철도"
+                },
+                "public_transport/platform_subway": {
+                    "name": "지하철 정거장 / 승강장",
+                    "terms": "지하철,플랫폼,대중교통,철도,선로,지하"
+                },
+                "public_transport/platform_train": {
+                    "name": "기차 정거장 / 승강장",
+                    "terms": "플랫폼,대중교통,철도,선로,기차"
+                },
+                "public_transport/platform_tram": {
+                    "name": "전차 정거장 / 승강장",
+                    "terms": "전기,플랫폼,대중교통,철도,선로,전차,트롤리"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "트롤리버스 정류장",
+                    "terms": "버스,전기,정류소,정거장,대중교통,무궤도,전차,트롤리"
+                },
+                "public_transport/station": {
+                    "name": "대중교통 역 / 터미널",
+                    "terms": "대중교통,역,터미널"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "삭도 역",
+                    "terms": "가공삭도,공중삭도,로프웨이,케이블카,대중교통,역,터미널"
+                },
+                "public_transport/station_bus": {
+                    "name": "버스 터미널",
+                    "terms": "버스,대중교통,정거장,터미널"
+                },
+                "public_transport/station_ferry": {
+                    "name": "페리 터미널",
+                    "terms": "배,보트,부두,페리,잔교,대중교통,역,터미널"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "경전철 역",
+                    "terms": "전기,경전철,라이트 레일,대중교통,철도,선로,역,터미널,트롤리"
+                },
+                "public_transport/station_monorail": {
+                    "name": "모노레일 역",
+                    "terms": "모노레일,대중교통,철도,역,터미널"
+                },
+                "public_transport/station_subway": {
+                    "name": "지하철역",
+                    "terms": "지하철,대중교통,철도,선로,역,터미널,지하"
+                },
+                "public_transport/station_train": {
+                    "name": "기차역",
+                    "terms": "대중교통,철도,선로,역,터미널,기차"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "기차역 (간이역)"
+                },
+                "public_transport/station_tram": {
+                    "name": "전차 역",
+                    "terms": "전기,대중교통,철도,선로,역,터미널,전차,트롤리"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "트롤리버스 터미널",
+                    "terms": "버스,전기,대중교통,정거장,터미널,무궤도,전차,트롤리"
                 },
                 "public_transport/stop_position": {
-                    "name": "정차 위치",
-                    "terms": "정차 위치"
+                    "name": "대중교통 정차 위치",
+                    "terms": "대중교통"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "삭도 정차 위치",
+                    "terms": "가공삭도,공중삭도,로프웨이,케이블카,대중교통"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "버스 정차 위치",
+                    "terms": "버스,대중교통"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "페리 정차 위치",
+                    "terms": "배,보트,부두,페리,잔교,대중교통"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "경전철 정차 위치",
+                    "terms": "전기,경전철,라이트 레일,대중교통,철도,선로,트롤리"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "모노레일 정차 위치",
+                    "terms": "모노레일,대중교통,철도"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "지하철 정차 위치",
+                    "terms": "지하철,대중교통,철도,선로,지하"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "기차 정차 위치",
+                    "terms": "대중교통,철도,선로,기차"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "전차 정차 위치",
+                    "terms": "전기,대중교통,철도,선로,전차,트롤리"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "트롤리버스 정차 위치",
+                    "terms": "버스,전기,대중교통,무궤도,전차,트롤리"
                 },
                 "railway": {
                     "name": "철도"
                     "terms": "강삭 철도"
                 },
                 "railway/halt": {
-                    "name": "철도 정거장",
-                    "terms": "철도 정거장"
+                    "name": "기차역 (간이역)"
                 },
                 "railway/level_crossing": {
                     "name": "철도 건널목 (도로)",
                     "terms": "철도 건널목 (도로)"
                 },
+                "railway/light_rail": {
+                    "name": "경전철",
+                    "terms": "경전철,라이트 레일,트롤리"
+                },
+                "railway/milestone": {
+                    "name": "철도 거리표"
+                },
                 "railway/monorail": {
                     "name": "모노레일",
                     "terms": "모노레일"
                     "terms": "협궤 철로"
                 },
                 "railway/platform": {
-                    "name": "철도 플랫폼",
-                    "terms": "철도 승강장"
+                    "name": "기차 정거장 / 승강장"
                 },
                 "railway/rail": {
                     "name": "철로",
                     "name": "철도신호"
                 },
                 "railway/station": {
-                    "name": "철도역",
-                    "terms": "역"
+                    "name": "기차역"
                 },
                 "railway/subway": {
                     "name": "지하철",
                     "name": "노면전차",
                     "terms": "트램"
                 },
-                "railway/tram_stop": {
-                    "name": "노면전차 정류소",
-                    "terms": "노면전차 정류소"
-                },
                 "relation": {
                     "name": "관계",
                     "terms": "관계"
                 },
                 "shop/bag": {
                     "name": "가방/여행가방 가게",
-                    "terms": "가방/여행가방 가게"
+                    "terms": "핸드백,손가방"
                 },
                 "shop/bakery": {
                     "name": "제과점",
                 },
                 "shop/deli": {
                     "name": "델리",
-                    "terms": "델리"
+                    "terms": "점심,고기,샌드위치"
                 },
                 "shop/department_store": {
                     "name": "백화점",
                     "name": "보석 상점",
                     "terms": "다이아몬드,보석,귀금속,반지"
                 },
-                "shop/kiosk": {
-                    "name": "신문 판매대"
-                },
                 "shop/kitchen": {
                     "name": "주방 디자인 가게",
                     "terms": "주방 인테리어 가게"
                     "name": "잡화점"
                 },
                 "shop/video": {
-                    "name": "비디오 가게"
+                    "name": "비디오 가게",
+                    "terms": "DVD"
                 },
                 "shop/video_games": {
                     "name": "비디오 게임 가게"
                     "name": "관광 명소"
                 },
                 "tourism/camp_site": {
-                    "name": "캠핑장"
+                    "name": "캠핑장",
+                    "terms": "텐트,천막,RV"
                 },
                 "tourism/caravan_site": {
                     "name": "RV 공원"
                     "terms": "예술,전시,그림,회화,사진,조각"
                 },
                 "tourism/guest_house": {
-                    "name": "민박"
+                    "name": "민박",
+                    "terms": "B&B"
                 },
                 "tourism/hostel": {
                     "name": "호스텔"
                     "name": "도로 노선",
                     "terms": "길 경로"
                 },
+                "type/route/subway": {
+                    "name": "지하철 노선"
+                },
                 "type/route/train": {
                     "name": "철도 노선",
                     "terms": "열차 노선"
                 "description": "프리미엄 DigitalGlobe 위성 이미지",
                 "name": "DigitalGlobe 프리미엄 이미지"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "조건 & 피드백"
+                }
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "이용 약관"
                 "name": "TIGER Roads 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 맵 데이터 OpenStreetMap 기여자, ODbL 1.0"
-                },
                 "name": "도로 표지가 달린 길: 자전거"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 맵 데이터 OpenStreetMap 기여자, ODbL 1.0"
-                },
                 "name": "도로 표지가 달린 길: 걷기"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 맵 데이터 OpenStreetMap 기여자, ODbL 1.0"
-                },
                 "name": "도로 표지가 달린 길: 산악 자전거"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 맵 데이터 OpenStreetMap 기여자, ODbL 1.0"
-                },
                 "name": "도로 표지가 달린 길: 스케이트"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, 맵 데이터 OpenStreetMap 기여자, ODbL 1.0"
-                },
                 "name": "도로 표지가 달린 길: 겨울 스포츠"
             },
             "basemap.at": {
index 17877110d3b5ee777c53d34fa3a2187a4f940de5..b76f9a790d04938d9370338972af8ac7a0ad9cef 100644 (file)
             "created": "Sukurta",
             "about_changeset_comments": "Apie pokyčių komentarus",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Šiame komentare paminėjote Google: atsiminkite, kad kopijuoti iš Google Maps yra griežtai draudžiama.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Šiame komentare paminėjote Google: atsiminkite, kad kopijuoti iš Google Maps yra griežtai draudžiama."
         },
         "contributors": {
             "list": "Keitėjai {users}",
         "background": {
             "title": "Fonas",
             "description": "Fono nustatymai",
-            "percent_brightness": "{opacity}% ryškumas",
             "none": "Jokio",
             "best_imagery": "Geriausia žinoma ortofotografija šiai vietai",
             "switch": "Persijungti atgal į šį foną",
             "custom": "Savas",
             "custom_button": "Redaguoti pasirinktiną foną",
-            "fix_misalignment": "Keisti fono poslinkį",
-            "imagery_source_faq": "Iš kur ši ortofotografija?",
             "reset": "iš naujo",
-            "offset": "Tempkite bet kur pilkoje zonoje, kad keistumėte orotofotografijos poslinkį, arba įvesktie poslinkių reikšmes metrais.",
             "minimap": {
-                "description": "Minižemėlapis",
                 "tooltip": "Rodyti atitolintą žemėlapį, kad būtų lengviau rasti šiuo metu rodomą vietą."
-            }
+            },
+            "fix_misalignment": "Keisti fono poslinkį",
+            "offset": "Tempkite bet kur pilkoje zonoje, kad keistumėte orotofotografijos poslinkį, arba įvesktie poslinkių reikšmes metrais."
         },
         "map_data": {
             "title": "Žemėlapio duomenys",
             "untagged_area_tooltip": "Pasirinkite objekto tipą, kuris apibūdina, koks tai plotas yra.",
             "untagged_relation": "Ryšys be žymų",
             "untagged_relation_tooltip": "Parinkite objekto tipą, aprašantį kas yra šis ryšys.",
-            "many_deletions": "Jūs trinate {n} objektus. Ar tikrai norite tai padaryti? Tai ištrins juos iš žemėlapio, kurį visi kiti mato svetainėje openstreetmap.org.",
             "tag_suggests_area": "Žyma {tag} rodo, kad linija turėtų būti plotas, bet ji nėra plotas",
             "deprecated_tags": "Pasenusios žymos: {tags}"
         },
             "view_on_mapillary": "Žiūrėti šią nuotrauką per Mapillary"
         },
         "help": {
-            "title": "Pagalba",
-            "help": "# Help\n\nTai [OpenStreetMap](http://www.openstreetmap.org/), laisvo ir keičiamo pasaulio žemėlapio redaktorius. Šiuo redaktoriumi galite pridėti ir keisti duomenis savo vietovėje, taip visiems pagerindami atviro kodo ir atvirų duomenų pasaulio žemėlapį.\n\nPakeitimai, kuriuos darote šiame žemėlapyje bus matomi visiems, kas naudoja OpenStreetMap. Kad padarytumėte pakeitimą, jums reikia [prisijungti](https://www.openstreetmap.org/login).\n\n[iD redaktorius](http://ideditor.com/) - tai bendruomenės projektas, kurio [kodas atvirai prieinamas GitHub](https://github.com/openstreetmap/iD).\n",
-            "imagery": "# Nuotraukos\n\nIš oro ar palydovo darytos nuotraukos - svarbus žemėlapio paišymo pagalbininkas.\nDešinėje esančiame meniu rasite įvairių nuotraukų, darytų iš lėktuvų, palydovų ar\nkombinuotų šaltinių.\n\nTik įjungus redaktorių bus automatiškai įjungtas [Bing Maps](http://www.bing.com/maps/)\npalydovinis sluoksnis, bet priklausomai nuo to, kurioje geografinėje vietoje\nredaguojate - bus rodomi ir kiti nuotraukų šaltiniai. Kai kurios šalys, tokios kaip\nJAV, Prancūzija, Danija ir Lietuva turi labai aukštos kokybės ir tikslumo\nortofotonuotraukas. Pavyzdžiui Lietuvoje reikėtų naudoti NŽT ORT10LT.\n\nNuotraukos kartais būna pasislinkusios nuo realios pozicijos dėl nuotraukų\ntiekėjo klaidų. Jei matote, kad daug kelių ar kitų objektų yra pasislinkę nuo\nnuotraukos, nepulkite jų tempti į „teisingas“ vietas. Vietoje to geriau pataisykite\nnuotraukos poziciją pagal esamus duomenis, paspaudę fono parinkčių apačioje\n„Taisyti lygiavimą“. NŽT ORT10LT lygiavimas yra teisingas visoje Lietuvos\nteritorijoje, taigi jo taisyti nereikia.\n",
-            "addresses": "# Adresai\n\nAdresų informacija - viena naudingiausių žemėlapyje.\n\nOpenStreetMap adresai dažniausiai įrašomi kaip pastatų arba lankytinų vietų\natributai.\n\nJūs galite pridėti adreso informaciją vietoms, pažymėtoms kaip pastatų\nkontūrai bei pavieniams taškams. Geriausias adreso informacijos šaltinis\nyra vietinė apžiūra arba asmeninės žinios - kaip ir su bet kuriais kitais\nobjektais, naudoti šaltinius, tokius kaip Google Maps, maps.lt, Registrų Centras\nir pan. yra griežtai draudžiama.\n",
-            "inspector": "# Inspektoriaus naudojimas\n\nInspektorius - tai kairėje puslapio pusėje esanti skiltis, leidžianti jums keisti pažymėto objekto savybes.\n\n### Objekto tipo parinkimas\n\nPridėję tašką, liniją ar plotą, jūs galite parinkti, kokio tipo tai objektas. Pavyzdžiui ar tai greitkelis ar gyvenamasis kelias, parduotuvė ar kavinė. Inspektorius rodys mygtukus populiariausiems objektų tipams, o kitus tipus rasite rašydami paieškos lauke tai, ko norite.\n\nSpauskite objekto tipo mygtuko dešinėje apačioje esantį mygtuką „i“, kad sužinotumėte daugiau. Spauskite patį mygtuką, kad parinktumėte tipą.\n\n### Formų naudojimas ir žymų keitimas\n\nParinkus objekto tipą arba pažymėjus objektą, kurio tipas jau parinktas, inspektorius rodys objekto tipo laukus, tokius kaip pavadinimas ir adresas.\n\nPo šių laukų galite spausti iškrentantį sąrašą „Pridėti lauką“, kad pridėtumėte kitą informaciją, tokia kaip nuorodą į wikipediją, prieigą neįgaliesiems ir pan.\n\nInspektoriaus apačioje galite spausti „Papildomos žhmos“, kad pridėtumėte bet kokias norimas kitas žymas. [Taginfo](http://taginfo.openstreetmap.org/) yra puiki vieta, kur galima sužinoti apie populiarias žymų kombinacijas.\n\nInspektoriuje padaryti pakeitimai automatiškai pritaikomi žemėlapiui. Pakeitimus galite atstatyti bet kokiu metu paspaudę mygtuką „Atšaukti“.\n"
+            "title": "Pagalba"
         },
         "intro": {
             "done": "baigta",
                     "label": "Talpumas",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Kryptis",
-                    "options": {
-                        "E": "Rytai",
-                        "ENE": "Rytų-šiaurės rytų",
-                        "ESE": "Rytų-pietryčių",
-                        "N": "Šiaurė",
-                        "NE": "Šiaurės rytai",
-                        "NNE": "Šiaurės-šiaurės rytų",
-                        "NNW": "Šiaurės-šiaurės vakarų",
-                        "NW": "Šiaurės vakarai",
-                        "S": "Pietūs",
-                        "SE": "Pietryčiai",
-                        "SSE": "Pietų-pietryčių",
-                        "SSW": "Pietų-pietvakarių",
-                        "SW": "Pietvakariai",
-                        "W": "Vakarai",
-                        "WNW": "Vakarų-šiaurės vakarų",
-                        "WSW": "Vakarų-pietvakarių"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipas"
                 },
-                "clock_direction": {
-                    "label": "Kryptis",
-                    "options": {
-                        "anticlockwise": "Prieš laikrodžio rodyklę",
-                        "clockwise": "Pagal laikrodžio rodyklę"
-                    }
-                },
                 "collection_times": {
                     "label": "Surinkimo laikas"
                 },
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Kryptis",
-                    "options": {
-                        "backward": "Atgal",
-                        "forward": "Pirmyn"
-                    }
-                },
                 "park_ride": {
                     "label": "Palik automobilį ir važiuok"
                 },
                 "recycling_accepts": {
                     "label": "Priima"
                 },
-                "recycling_type": {
-                    "label": "Rūšiavimo tipas",
-                    "options": {
-                        "centre": "Rūšiavimo Centras",
-                        "container": "Konteineris"
-                    }
-                },
                 "relation": {
                     "label": "Tipas"
                 },
                     "name": "Valiutos keitykla",
                     "terms": "keitykla,valiutos keitykla"
                 },
-                "amenity/bus_station": {
-                    "name": "Autobusų stotis",
-                    "terms": "stotis,autobusų stotis"
-                },
                 "amenity/cafe": {
                     "name": "Kavinė",
                     "terms": "Kavinė"
                 "amenity/ranger_station": {
                     "name": "Girininkų stotis"
                 },
-                "amenity/recycling": {
-                    "name": "Rūšiavimas"
-                },
                 "amenity/restaurant": {
                     "name": "Restoranas",
                     "terms": "rastoranas"
                     "name": "Žirgų kelias",
                     "terms": "jodinėjimo takas,arklių takas"
                 },
-                "highway/bus_stop": {
-                    "name": "Autobuso stotelė",
-                    "terms": "stotelė,autobusų stotelė,troleibusų stotelė"
-                },
                 "highway/crosswalk": {
                     "name": "Pėsčiųjų perėja"
                 },
                     "name": "Miškas",
                     "terms": "miškas"
                 },
-                "landuse/garages": {
-                    "name": "Garažai",
-                    "terms": "garažai"
-                },
                 "landuse/grass": {
                     "name": "Ganykla",
                     "terms": "žolė"
                 "office/administrative": {
                     "name": "Administracinis biuras"
                 },
-                "office/company": {
-                    "name": "Kompanijos kontora"
-                },
                 "office/educational_institution": {
                     "name": "Edukacinis institutas",
                     "terms": "Mokslo institutas,Mokslo įstaiga"
                     "name": "Transformatorius",
                     "terms": "transformatorius"
                 },
-                "public_transport/platform": {
-                    "name": "Platforma",
-                    "terms": "platforma"
-                },
-                "public_transport/stop_position": {
-                    "name": "Stop pozicija"
-                },
                 "railway": {
                     "name": "Geležinkelis"
                 },
                     "name": "Keltuvas",
                     "terms": "Funikulierius"
                 },
-                "railway/halt": {
-                    "name": "Geležinkelio stotelė",
-                    "terms": "geležinkelio stotelė"
-                },
                 "railway/monorail": {
                     "name": "Vienbėgis geležinkelis"
                 },
                     "name": "Siaurukas",
                     "terms": "siaurukas"
                 },
-                "railway/platform": {
-                    "name": "Geležinkelio platforma",
-                    "terms": "platforma,geležinkelio platforma"
-                },
                 "railway/rail": {
                     "name": "Gelžkelis",
                     "terms": "geležinkelis,gelžkelis"
                 },
-                "railway/station": {
-                    "name": "Geležinkelio stotis",
-                    "terms": "stotis,geležinkelio stotis"
-                },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "metro"
                     "name": "Juvelyrikos parduotuvė",
                     "terms": "juvelyras"
                 },
-                "shop/kiosk": {
-                    "name": "Naujienų kioskas"
-                },
                 "shop/kitchen": {
                     "name": "Virtuvės dizaino parduotuvė"
                 },
index 982804cf15c83abd03821d390073181f374ec38f..8cb5b56f6b9f843ce4da4c9dded2934a54cd00a7 100644 (file)
         "background": {
             "title": "Fons",
             "description": "Fona iestatījumi",
-            "percent_brightness": "{opacity}% caurspīdīgums",
             "reset": "Atiestatīt"
         },
         "feature": {
                 "capacity": {
                     "label": "Ietilpība"
                 },
-                "cardinal_direction": {
-                    "label": "Virziens"
-                },
                 "construction": {
                     "label": "Tips"
                 },
                 "highway": {
                     "name": "Šoseja"
                 },
-                "highway/bus_stop": {
-                    "name": "Autobusa pietura"
-                },
                 "highway/cycleway": {
                     "name": "Veloceliņš"
                 },
                 "railway/rail": {
                     "name": "Sliedes"
                 },
-                "railway/station": {
-                    "name": "Dzelzceļa stacija"
-                },
                 "railway/subway": {
                     "name": "Metro"
                 },
index 00c33f84b846d20c8d883a18e5aac486a988f7de..106a82ffda8c11d01fd5bbb6bcd66754d8cb170a 100644 (file)
@@ -1,5 +1,209 @@
 {
     "mg": {
+        "modes": {
+            "add_area": {
+                "title": "Faritra",
+                "description": "Hampiditra faritra maitso, trano, farihy na faritra hafa amin'ny sarintany.",
+                "tail": "Tsindrio eo amin'ny sarintany raha hanomboka hanoritra faritra, ohatra hoe faritra maitso, farihy, na trano."
+            },
+            "add_line": {
+                "title": "Tsipika",
+                "description": "Hampiditra làlana, arabe, làlan-tongotra, lakan-drano na endri-tsipika hafa amin'ny sarintany.",
+                "tail": "Tsindrio eo amin'ny sarintany raha hanomboka hanoritra làlana, làla-masaka na arabe."
+            },
+            "add_point": {
+                "title": "Teboka",
+                "tail": "Tsindrio eo amin'ny sarintany raha hanampy teboka."
+            },
+            "browse": {
+                "title": "Hisava.",
+                "description": "Akisaho ary hangezao ny sarintany."
+            },
+            "draw_area": {
+                "tail": "Tsindrio raha hampiditra vona eo faritra misy anao. Tsindrio ilay teboka voalohany raha hamarana ny fanoritana faritra."
+            },
+            "draw_line": {
+                "tail": "Tsindrio raha hanampy vona amin'ny tsipika. Manindria eo amin'ny tsipika hafa raha hampitohy amin'izy ireo, manaova tsindry in-droa raha hamarana ny tsipika."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Tsy mety ovaina ity satria mifandray amina zavatra izay tsy miseho."
+            }
+        },
+        "operations": {
+            "add": {
+                "annotation": {
+                    "point": "Nanampy teboka.",
+                    "vertex": "Nanampy vona.",
+                    "relation": "Nanampy fifandraisana."
+                }
+            },
+            "start": {
+                "annotation": {
+                    "line": "Nanomboka tsipika.",
+                    "area": "Nanomboka nanoritra faritra."
+                }
+            },
+            "continue": {
+                "title": "Hanohy",
+                "description": "Hanohy ity tsipika ity.",
+                "not_eligible": "Tsy misy tsipika azo tohizana eto.",
+                "multiple": "Misy tsipika maromaro azo tohizana eto. Raha hisafidy tsipika iray dia tsindrio ny Shift ary tsindrio eo amin'ilay tsipika hofantenina.",
+                "annotation": {
+                    "line": "Nanohy tsipika.",
+                    "area": "Nanohy nanoritra faritra."
+                }
+            },
+            "cancel_draw": {
+                "annotation": "Nanafoana ny fanoritana."
+            },
+            "circularize": {
+                "title": "Hanaboribory.",
+                "description": {
+                    "line": "Hanaboribory ity tsipika ity.",
+                    "area": "Hanaboribory ity faritra ity."
+                },
+                "annotation": {
+                    "line": "Nanaboribory an'ilay tsipika.",
+                    "area": "Nanaboribory an'ilay faritra."
+                },
+                "not_closed": "Tsy mety atao boribory ity satria tsy mihodina tanteraka.",
+                "too_large": "Tsy mety atao boribory ity satria tsy ampy ny faritra miseho aminy.",
+                "connected_to_hidden": "Tsy mety atao boribory ity satria mifampitohy amina zavatra tsy miseho."
+            },
+            "orthogonalize": {
+                "title": "Efajoro",
+                "description": {
+                    "line": "Hampahitsy ny zoron'ito tsipika ito.",
+                    "area": "Hampahitsy ireo zoron'ito faritra ito."
+                },
+                "annotation": {
+                    "line": "Nampahitsy ny zoron'ilay tsipika.",
+                    "area": "Nampahitsy ireo zoron'ilay faritra."
+                },
+                "not_squarish": "Tsy mety atao efajoro mahitsy ito satria tsy manakaiky ny endrika efajoro.",
+                "too_large": "Tsy mety atao efajoro mahitsy ito satria tsy ampy ny faritra miseho aminy.",
+                "connected_to_hidden": "Tsy mety atao efajoro mahitsy ito satria mifampitohy amina zavatra tsy miseho."
+            },
+            "straighten": {
+                "title": "Hampahitsy",
+                "description": "Hampahitsy ito tsipika ito.",
+                "annotation": "Nampahitsy an'ilay tsipika.",
+                "too_bendy": "Tsy mety ampahitsiana ito satria miolaka loatra.",
+                "connected_to_hidden": "Tsy mety ampahitsiana ito tsipika ito satria mifampitohy amina zavatra tsy miseho."
+            },
+            "delete": {
+                "title": "Hamafa",
+                "description": {
+                    "single": "Hamafa tanteraka an'ito singa ito.",
+                    "multiple": "Hamafa tanteraka an'ireto singa ireto."
+                },
+                "annotation": {
+                    "point": "Namafa an'ilay teboka.",
+                    "vertex": "Namafa an'ilay vona tamin'ilay tsipika.",
+                    "line": "Namafa an'ilay tsipika.",
+                    "area": "Namafa an'ilay faritra.",
+                    "relation": "Namafa an'ilay fifandraisana.",
+                    "multiple": "Namafa singa {n}."
+                },
+                "too_large": {
+                    "single": "Tsy mety fafàna ito singa ito satria tsy ampy ny faritra miseho aminy.",
+                    "multiple": "Tsy mety fafàna ireo singa ireo satria tsy ampy ny faritra miseho aminy."
+                },
+                "incomplete_relation": {
+                    "single": "Tsy mety fafàna ito singa ito satria tsy azo manontolo tamin'ny nakàna azy.",
+                    "multiple": "Tsy mety fafàna ireo singa ireo satria tsy azo manontolo tamin'ny nakàna azy."
+                },
+                "connected_to_hidden": {
+                    "single": "Tsy mety fafàna ito singa ito satria mifampitohy amina zavatra tsy miseho.",
+                    "multiple": "Tsy mety fafàna ireo singa ireo satria mifampitohy amina zavatra tsy miseho ny sasany aminy."
+                }
+            },
+            "connect": {
+                "annotation": {
+                    "point": "Nampifandray an'ilay soritra tamin'ilay teboka.",
+                    "vertex": "Nampifandray an'ilay soritra tamin'ny anankiray hafa.",
+                    "line": "Nampifandray an'ilay soritra tamin'ilay tsipika.",
+                    "area": "Nampifandray an'ilay soritra tamin'ilay faritra."
+                }
+            },
+            "disconnect": {
+                "title": "Hanatsoaka",
+                "description": "Hanasaraka an'ireto tsipika/faritra ireto.",
+                "annotation": "Nanasaraka an'ireo tsipika/faritra.",
+                "not_connected": "Tsy ampy mba hosarahina ny tsipika/faritra misy.",
+                "connected_to_hidden": "Tsy mety tsoahina ito satria mifampitohy amina zavatra tsy miseho."
+            },
+            "merge": {
+                "title": "Hanambatra",
+                "description": "Hanambatra an'ireto singa ireto.",
+                "annotation": "Nanambatra singa {n}.",
+                "not_eligible": "Tsy mety atambatra ireto singa ireto.",
+                "not_adjacent": "Tsy mety atambatra ireto singa ireto satria tsy mifampitohy ny faran'izy ireo.",
+                "incomplete_relation": "Tsy mety atambatra ireto singa ireto satria misy tsy azo manontolo tamin'ny nakàna azy."
+            },
+            "move": {
+                "title": "Hamindra",
+                "description": {
+                    "single": "Hamindra an'ito singa ito amin'ny toerana hafa.",
+                    "multiple": "Hamindra an'ireto singa ireto amin'ny toerana hafa."
+                },
+                "annotation": {
+                    "point": "Namindra an'ilay teboka.",
+                    "vertex": "Namindra an'ilay vona tamin'ilay soritra.",
+                    "line": "Namindra an'ilay tsipika.",
+                    "area": "Namindra an'ilay faritra.",
+                    "multiple": "Namindra singa maromaro."
+                },
+                "incomplete_relation": {
+                    "single": "Tsy mety afindra ito singa ito satria tsy azo manontolo tamin'ny nakàna azy.",
+                    "multiple": "Tsy mety afindra ireo singa ireo satria tsy azo manontolo tamin'ny nakàna azy."
+                },
+                "too_large": {
+                    "single": "Tsy mety afindra ito singa ito satria tsy ampy ny faritra miseho aminy.",
+                    "multiple": "Tsy mety afindra ireo singa ireo satria tsy ampy ny faritra miseho aminy."
+                },
+                "connected_to_hidden": {
+                    "single": "Tsy mety afindra ito singa ito satria mifampitohy amina zavatra tsy miseho.",
+                    "multiple": "Tsy mety afindra ireo singa ireo satria mifampitohy amina zavatra tsy miseho ny sasany aminy."
+                }
+            },
+            "rotate": {
+                "title": "Hanodina",
+                "description": {
+                    "single": "Hanodina an'ito singa ito manodidina ny ivony.",
+                    "multiple": "Hanodina an'ireto singa ireto manodidina ny ivony."
+                },
+                "annotation": {
+                    "line": "Nanodina an'ilay tsipika.",
+                    "area": "Nanodina an'ilay faritra.",
+                    "multiple": "Nanodina singa maromaro."
+                },
+                "incomplete_relation": {
+                    "single": "Tsy mety ahodina ito singa ito satria tsy azo manontolo tamin'ny nakàna azy.",
+                    "multiple": "Tsy mety ahodina ireo singa ireo satria tsy azo manontolo tamin'ny nakàna azy."
+                },
+                "too_large": {
+                    "single": "Tsy mety ahodina ito singa ito satria tsy ampy ny faritra miseho aminy.",
+                    "multiple": "Tsy mety ahodina ireto singa ireto satria misy tsy miseho ny sasany aminy."
+                },
+                "connected_to_hidden": {
+                    "single": "Tsy mety ahodina ito singa ito satria mifampitohy amina zavatra tsy miseho.",
+                    "multiple": "Tsy mety ahodina ireo singa ireo satria mifampitohy amina zavatra tsy miseho ny sasany aminy."
+                }
+            },
+            "reverse": {
+                "title": "Hamototra",
+                "description": "Hamototra ny fizotran'ito tsipika ito.",
+                "annotation": "Namototra an'ilay tsipika."
+            },
+            "split": {
+                "title": "Hizara",
+                "description": {
+                    "line": "Hizara an'ito tsipika ito ho roa eto amin'ito vona ito.",
+                    "area": "Hizara ny sisin'ito faritra ito ho roa."
+                }
+            }
+        },
         "intro": {
             "graph": {
                 "block_number": "<value for addr:block_number>",
index 79631b091c3bb32014c43e2148548780e83633da..2459c5aaa6b53ad9214dbd85ae7b485a3c4bf3fc 100644 (file)
             "created": "Создадени",
             "about_changeset_comments": "За прибелешките кон промените",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Го спомнавте Гугл во прибелешката: имајте на ум дека копирањето од Гугл Карти е строго забрането.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Го спомнавте Гугл во прибелешката: имајте на ум дека копирањето од Гугл Карти е строго забрането."
         },
         "contributors": {
             "list": "Уредувања на {users}",
         "background": {
             "title": "Заднина",
             "description": "Поставки за заднината",
-            "percent_brightness": "{opacity}% светлост",
             "none": "ништо",
             "best_imagery": "Најдобра позната заднина за ова место",
             "switch": "Префрли назад на заднинава",
             "custom": "Прилагодено",
             "custom_button": "Измени прилагодена позадина",
-            "fix_misalignment": "Прилагоди отстап на заднината",
-            "imagery_source_faq": "Од каде е заднинава?",
             "reset": "одново",
-            "offset": "Довлечете некаде во сивото подрачје подолу за да го прилагодите отстапот на заднината, или пак внесете ги отстапните вредности во метри.",
             "minimap": {
-                "description": "Миникарта",
                 "tooltip": "Прикажи оддалечена карта за пронаоѓање на тековно прикажаното подрачје."
-            }
+            },
+            "fix_misalignment": "Прилагоди отстап на заднината",
+            "offset": "Довлечете некаде во сивото подрачје подолу за да го прилагодите отстапот на заднината, или пак внесете ги отстапните вредности во метри."
         },
         "map_data": {
             "title": "Картографски податоци",
             "view_on_mapillary": "Погледајте ја сликава на Mapillary"
         },
         "help": {
-            "title": "Помош",
-            "help": "# Помош\n\nОва е уредник за [OpenStreetMap](http://www.openstreetmap.org/) — слободната и уредлива карта на светот. Служи за додавање и менување на податоци во вашето подрачје, со што ја подобрувате оваа светска карта со отворен код и отворени податоци за сите.\n\nУредувањата што ќе ги направите на картава ќе бидат видливи за секого на OpenStreetMap. За да направите уредување, ќе треба да\n[се најавите](https://www.openstreetmap.org/login).\n\n[Уредникот iD](http://ideditor.com/) е соработен проект чиј [изворен код е достапен на GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# ГПС\n\nСобраните ГПС-траги се мошне корисен извор на податоци за  OpenStreetMap. Уредников\nподдржува месни траги во облик на .gpx-податотеки од вашиот сметач. Ваквите ГПС-траги\nможете да ги собирате со разни прилози за паметен телефон, како и со лични ГПС-уреди.\n\nПовеќе информации за тоа како да вршите ГПС-извидување ќе прочитате на\n[Картографија со паметен телефон, ГПС или хартија](http://learnosm.org/en/mobile-mapping/).\n\nЗа да користите GPX-трага за исцртување, повлечете и пуштете ја GPX-податотеката во уредникот на картата\nАко ја препознае, истата ќе биде ставена на картата како светла виолетова линија. Стиснете на изборникот „Податоци за картата“ десно а да го овозможите.\nоневозможите или приближите овој нов слој од GPX.\n\nGPX-трагата не се подига право на OpenStreetMap — најдобро се користи ако се црта на кратата, користејќи ја како водилка за нови елементи\nшто ги додавате, и да [се подига на OpenStreetMap](http://www.openstreetmap.org/trace/create)\nза да им служи на другите.\n",
-            "imagery": "# Снимки\n\nВоздушните снимки се важен извор во картографијата. Во изборникот „Поставки за заднината“ десно ќе најдете\nсателитски снимки, авионски прелети и слободно составени ресурси.\n\nПо основно, во уредникот се прикажува сателитски слој од [Bing Карти](http://www.bing.com/maps/),\nно како што шетате по картата и доближувате нови географски\nподрачја, стануваат достапни други извори. Некои земји, како САД, Франција и Данска имаат снимки со многу висок квалитет за некои подрачја.\n\nЗаднината понекогаш отстапува од картата поради грешка\nод страна на на заднината. Ако видите доста патишта поместени од  заднината,\nнемојте веднаш да ги поместувате за да се поклопат со неа. Прилагодете ја заднината, за да одговара на постоечките податоци стискајќи на „Поправи го порамнувањето“ на дното од поставките за заднината.\n",
-            "addresses": "# Адреси\n\nАдресите се едни од најкорисните податоци на картата.\n\nИако адресите се претставуваат во рамките на улиците  во OpenStreetMap,\nтие се заведуваат како атрибути на градбите и местата долж улиците.\n\nАдресни информации можете да ставате на исцртани градби и места означени со една точка. По желба, се додава извор на адресните податоци, кој може да биде од лична проверка на терен или лични сознанија. Како и за сето\nостанато, копирањето од комерцијални извори како Гугл Карти е строго забрането.\n",
-            "inspector": "# Употреба на Инспекторот\n\nИнспекторот е одделот лево кој ви овозможува\nда ги уредувате поединостите за избраниот елемент.\n\n### Избор на вид елемент\n\nОткако ќе додадете точка, линија или подрачје, можете да изберете каков вид на елемент се работи, т.е.\nдали е автопат или станбена улица, супермаркет или кафетерија.\nИнспекторот ќе даде копчиња за позастапените видови елементи, но можете да\nнајдете и други внесувајќи го бараното во полето за пребарување.\n\nСтиснете на „i“ во долниот десен агол на копче за\nвид елемент за да дознаете повеќе за него. Стиснете на самото копче за да го одберете тој вид.\n\n### Употреба на обрасци и ознаки за уредување\n\nОткако ќе одберете вид елемент, или кога ќе одберете елемент што веќе има\nукажан вид, инспекторот ќе ги прикаже полињата со поединости за\nелементот како име и адреса.\n\nПод полињата можете да стиснете на расклопното „Додај поле“\nза додавање на други поединости како врска до статија на Википедија, да укажете дали има инвалидски пристап и тн.\n\nНа дното од инспекторот стиснете на „Дополнителни ознаки“ за да додадете други\nпроизволни ознаки во елементот. [Taginfo](http://taginfo.openstreetmap.org/) е\nодлично место кајшто ќе дознаете повеќе за позастапените сплетови од ознаки.\n\nНаправените промени во инспекторот автоматски се применуваат врз картата.\nМожете да ги отповикате во секое време стискајќи на копчето „Отповикај“.\n"
+            "title": "Помош"
         },
         "intro": {
             "done": "готово",
                     "label": "Приемност",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Насока",
-                    "options": {
-                        "E": "исток",
-                        "ENE": "исток-североисток",
-                        "ESE": "исток-југоисток",
-                        "N": "север",
-                        "NE": "североисток",
-                        "NNE": "север-североисток",
-                        "NNW": "север-северозапад",
-                        "NW": "северозапад",
-                        "S": "југ",
-                        "SE": "југоисток",
-                        "SSE": "југ-југоисток",
-                        "SSW": "југ-југозапад",
-                        "SW": "југозапад",
-                        "W": "запад",
-                        "WNW": "запад-северозапад",
-                        "WSW": "запад-југозапад"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Насока",
-                    "options": {
-                        "anticlockwise": "Влево",
-                        "clockwise": "Вдесно"
-                    }
-                },
                 "collection_times": {
                     "label": "Распоред на собирање"
                 },
                     "label": "Норма",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Насока",
-                    "options": {
-                        "backward": "Наназад",
-                        "forward": "Нанапред"
-                    }
-                },
                 "park_ride": {
                     "label": "Преодно паркиралиште"
                 },
                 "recycling_accepts": {
                     "label": "Прима"
                 },
-                "recycling_type": {
-                    "label": "Вид рециклажа",
-                    "options": {
-                        "centre": "Рецикларница",
-                        "container": "Контејнер"
-                    }
-                },
                 "relation": {
                     "label": "Вид"
                 },
                     "terms": "<преведете со истозначници или сродни поими на „Влекач со појас“, одделени со запирки>"
                 },
                 "aerialway/station": {
-                    "name": "Жичничка станица",
-                    "terms": "<преведете со истозначници или сродни поими на „Жичничка станица“, одделени со запирки>"
+                    "name": "Жичничка станица"
                 },
                 "aerialway/t-bar": {
                     "name": "Влекач „Т“",
                     "name": "Менувачница",
                     "terms": "<преведете со истозначници или сродни поими на „Менувачница“, одделени со запирки>"
                 },
-                "amenity/bus_station": {
-                    "name": "Автобуска станица",
-                    "terms": "<преведете со истозначници или сродни поими на „Автобуска станица“, одделени со запирки>"
-                },
                 "amenity/cafe": {
                     "name": "Кафетерија",
                     "terms": "<преведете со истозначници или сродни поими на „Кафетерија“, одделени со запирки>"
                     "name": "Брза храна",
                     "terms": "<преведете со истозначници или сродни поими на „Брза храна“, одделени со запирки>"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Траектен терминал",
-                    "terms": "<преведете со истозначници или сродни поими на „Траектен терминал“, одделени со запирки>"
-                },
                 "amenity/fire_station": {
                     "name": "Противпожарна станица",
                     "terms": "<преведете со истозначници или сродни поими на „Противпожарна станица“, одделени со запирки>"
                     "name": "Шумарска куќарка",
                     "terms": "<преведете со истозначници или сродни поими на „Шумарска куќарка“, одделени со запирки>"
                 },
-                "amenity/recycling": {
-                    "name": "Рециклажа",
-                    "terms": "<преведете со истозначници или сродни поими на „Рециклажа“, одделени со запирки>"
-                },
                 "amenity/recycling_centre": {
                     "name": "Рецикларница",
                     "terms": "<преведете со истозначници или сродни поими на „Рецикларница“, одделени со запирки>"
                     "name": "Јавачка патека",
                     "terms": "<преведете со истозначници или сродни поими на „Јавачка патека“, одделени со запирки>"
                 },
-                "highway/bus_stop": {
-                    "name": "Автобуска постојка",
-                    "terms": "<преведете со истозначници или сродни поими на „Автобуска постојка“, одделени со запирки>"
-                },
                 "highway/corridor": {
                     "name": "Покриен премин",
                     "terms": "<преведете со истозначници или сродни поими на „Покриен премин“, одделени со запирки>"
                     "name": "Шума",
                     "terms": "<преведете со истозначници или сродни поими на „Шума“, одделени со запирки>"
                 },
-                "landuse/garages": {
-                    "name": "<преведете со истозначници или сродни поими на „Гаражи“, одделени со запирки>",
-                    "terms": "<преведете со истозначници или сродни поими на „Гаражи“, одделени со запирки>"
-                },
                 "landuse/grass": {
                     "name": "Трева",
                     "terms": "<преведете со истозначници или сродни поими на „Трева“, одделени со запирки>"
                     "terms": "<преведете со истозначници или сродни поими на „Канцеларија“, одделени со запирки>"
                 },
                 "office/administrative": {
-                    "name": "Администрација",
-                    "terms": "<преведете со истозначници или сродни поими на „Администрација“, одделени со запирки>"
-                },
-                "office/company": {
-                    "name": "Претпријатие",
-                    "terms": "<преведете со истозначници или сродни поими на „Претпријатие“, одделени со запирки>"
+                    "name": "Администрација"
                 },
                 "office/educational_institution": {
                     "name": "Образовна установа",
                     "name": "Трансформатор",
                     "terms": "<преведете со истозначници или сродни поими на „Трансформатор“, одделени со запирки>"
                 },
-                "public_transport/platform": {
-                    "name": "Перон",
-                    "terms": "<преведете со истозначници или сродни поими на „Перон“, одделени со запирки>"
-                },
-                "public_transport/stop_position": {
-                    "name": "Постојка",
-                    "terms": "<преведете со истозначници или сродни поими на „Постојка“, одделени со запирки>"
-                },
                 "railway": {
                     "name": "Пруга"
                 },
                     "name": "Искачница",
                     "terms": "<преведете со истозначници или сродни поими на „Искачница“, одделени со запирки>"
                 },
-                "railway/halt": {
-                    "name": "Железничка постојка",
-                    "terms": "<преведете со истозначници или сродни поими на „Железничка постојка“, одделени со запирки>"
-                },
                 "railway/level_crossing": {
                     "name": "Премин преку пруга (пат)",
                     "terms": "<преведете со истозначници или сродни поими на „Премин преку пруга (пат)“, одделени со запирки>"
                     "name": "Теснолинејка",
                     "terms": "<преведете со истозначници или сродни поими на „Теснолинејка“, одделени со запирки>"
                 },
-                "railway/platform": {
-                    "name": "Железнички перон",
-                    "terms": "<преведете со истозначници или сродни поими на „Железнички перон“, одделени со запирки>"
-                },
                 "railway/rail": {
                     "name": "Шини",
                     "terms": "<преведете со истозначници или сродни поими на „Шини“, одделени со запирки>"
                 },
-                "railway/station": {
-                    "name": "Железничка станица",
-                    "terms": "<преведете со истозначници или сродни поими на „Железничка станица“, одделени со запирки>"
-                },
                 "railway/subway": {
                     "name": "Подземна железница",
                     "terms": "<преведете со истозначници или сродни поими на „Подземна железница“, одделени со запирки>"
                     "name": "Златарница",
                     "terms": "<преведете со истозначници или сродни поими на „Златарница“, одделени со запирки>"
                 },
-                "shop/kiosk": {
-                    "name": "Весникара",
-                    "terms": "<преведете со истозначници или сродни поими на „Весникара“, одделени со запирки>"
-                },
                 "shop/kitchen": {
                     "name": "Кујни и елементи",
                     "terms": "<преведете со истозначници или сродни поими на „Кујни и елементи“, одделени со запирки>"
index 7b1883db063a3a8b739c8c3852ae65b797976a76..ee3bf56dba135c6d84b94d6f4cd0c4ae0f6a458e 100644 (file)
                     "point": "Titik telah dihapuskan.",
                     "vertex": "Suatu nod dalam jalan telah dihapus.",
                     "line": "Suatu garis telah dihapuskan.",
-                    "area": "Kawasan telah dipadam.",
+                    "area": "Kawasan telah dihapuskan.",
                     "relation": "Suatu hubungan telah dihapuskan.",
                     "multiple": "{n} gambaran telah dihapuskan."
                 },
             "localized_translation_language": "Pilih bahasa",
             "localized_translation_name": "Nama"
         },
+        "zoom_in_edit": "Zum lebih dekat untuk menyunting",
         "login": "log masuk",
         "logout": "log keluar",
         "loading_auth": "Berhubung ke OpenStreetMap...",
             "about_changeset_comments": "Tentang komen set ubah",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Komen anda menyebut tentang Google: anda diingatkan bahawa dilarang sama sekali untuk meniru Google Maps",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Suntingan-suntingan oleh {users}",
                 "title": "Ukuran",
                 "selected": "{n} dipilih",
                 "geometry": "Geometri",
-                "closed": "Tutup",
                 "center": "Tengah",
                 "perimeter": "Perimeter",
                 "length": "Panjang",
             "documentation_redirect": "Dokumentasi ini telah diarahkan semula ke halaman baru.",
             "show_more": "Tunjukkan Lagi",
             "view_on_osm": "Lihat pada openstreetmap.org",
-            "all_fields": "Semua bidang",
+            "all_fields": "Semua tempat kosong",
             "all_tags": "Semua tag",
             "all_members": "Semua ahli",
             "all_relations": "Semua hubungan",
             "way": "Cara",
             "relation": "Hubungan",
             "location": "Lokasi",
-            "add_fields": "Tambah bidang:"
+            "add_fields": "Tambah tempat kosong:"
         },
         "background": {
             "title": "Latar belakang",
             "description": "Tetapan latar belakang",
             "key": "B",
-            "percent_brightness": "{opacity}% kecerahan",
             "none": "Tiada",
             "best_imagery": "Sumber imejan terbaik yang diketahui bagi lokasi ini",
             "switch": "Tukar balik ke latar belakang ini",
-            "custom": "Lazim",
-            "custom_button": "Edit latar belakang lazim",
-            "custom_prompt": "Masukkan templat URL jubin. Token yang sah adalah:\n   - {zoom}/{z}, {x}, {y} untuk skim jubin Z/X/Y\n   - {ty} untuk koordinat Y gaya-TMS yang dibalikkan\n   - {u} untuk skim jubin kuad\n   - {switch:a,b,c} untuk pemultipleks pelayan DNS\n\nContoh:\n{example}",
-            "fix_misalignment": "Laraskan ofset imejan",
-            "imagery_source_faq": "Dari mana datangnya imejan ini?",
+            "custom": "Penyuai",
+            "custom_button": "Tukar latar belakang tersuai",
             "reset": "set semula",
-            "offset": "Seret di mana-mana dalam kawasan kelabu di bawah untuk melaraskan ofset imejan, atau masukkan nilai-nilai ofset dalam meter.",
             "minimap": {
-                "description": "Peta Mini",
                 "tooltip": "Tunjukkan peta yang dizum keluar untuk membantu mencari kawasan yang dipaparkan saat ini.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Laraskan ofset imejan",
+            "offset": "Seret di mana-mana dalam kawasan kelabu di bawah untuk melaraskan ofset imejan, atau masukkan nilai-nilai ofset dalam meter."
         },
         "map_data": {
             "title": "Data Peta",
             "description": "Data Peta",
             "key": "F",
             "data_layers": "Lapisan-lapisan Data",
+            "layers": {
+                "osm": {
+                    "tooltip": "Data peta dari OpenStreetMap",
+                    "title": "Data OpenStreetMap"
+                }
+            },
             "fill_area": "Kawasan Pengisian",
             "map_features": "Ciri-ciri Peta",
             "autohidden": "Ciri-ciri ini telah disembunyikan secara automatik kerana terlalu banyak akan dipaparkan di skrin. Anda boleh mengezum masuk untuk mengedit mereka."
                 "keep_remote": "Gunakan kepunyaan mereka",
                 "restore": "Kembalikan",
                 "delete": "Tinggalkan yang Dipadam",
+                "download_changes": "Atau muat turun fail osmChange",
                 "done": "Kesemua pertikaian telah diselesaikan!",
                 "help": "Pengguna lain mengubah beberapa ciri peta yang sama yang anda ubah.\nKlik pada setiap ciri di bawah untuk maklumat lanjut tentang pertikaian, dan pilih sama ada untuk menyimpan\nperubahan anda atau perubahan pengguna lain.\n"
             }
         "splash": {
             "welcome": "Selamat datang! Ini ialah penyunting iD OpenStreetMap",
             "text": "Penyunting iD ialah suatu alat yang berkuasa tinggi tetapi sangat mudah digunakan untuk membuat sumbangan terhadap peta percuma yang terunggul di dunia. Ini ialah versi {version}. Untuk maklumat lanjut sila layari {website} dan laporkan pepijat di {github}.",
-            "walkthrough": "Mulakan Panduan"
+            "walkthrough": "Mulakan Panduan",
+            "start": "Sunting sekarang"
         },
         "source_switch": {
             "live": "live",
             "untagged_area_tooltip": "Pilih jenis ciri yang menggambarkan kawasan ini.",
             "untagged_relation": "Hubungan tanpa tag",
             "untagged_relation_tooltip": "Pilih jenis ciri yang menggambarkan hubungan ini.",
-            "many_deletions": "Anda memadamkan {n} ciri. Adakah anda pasti mahu melakukan ini? Ini akan memadam mereka dari peta yang dilihat oleh orang lain di openstreetmap.org.",
             "tag_suggests_area": "Tanda {tag} mencadangkan garis sepatutnya menjadi kawasan, tetapi ianya bukan kawasan",
             "deprecated_tags": "Tag-tag yang telah lapuk: {tags}"
         },
+        "zoom": {
+            "in": "Zum dekat",
+            "out": "Zum jauh"
+        },
         "cannot_zoom": "Had zum jauh telah dicapai dalam mod yang sedang dipakai.",
         "full_screen": "Togol Skrin Penuh",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Paparkan imej ini dalam Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Gambar jalan dari OpenStreetCam",
+            "title": "Tindihan Gambar (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Paparkan imej ini dalam OpenStreetCam"
+        },
         "help": {
             "title": "Bantuan",
-            "key": "H"
+            "key": "H",
+            "help": {
+                "title": "Bantuan",
+                "welcome": "Selamat datang ke penyunting iD [OpenStreetMap](https://www.openstreetmap.org/). Penyunting ini membolehkan anda mengemaskini OpenStreetMap secara terus melalui pelayar web anda.",
+                "open_data_h": "Data Terbuka",
+                "open_data": "Perubahan yang anda buat dalam peta ini boleh dilihat oleh semua pengguna OpenStreetMap. Suntingan-suntingan anda boleh dibuat berdasarkan pengetahuan anda sendiri, survei secara jalanan, imejan dari udara atau gambar-gambar di permukaan jalan. [Dilarang meniru](https://www.openstreetmap.org/copyright) sama sekali dari sumber-sumber komersil seperti Google Maps.",
+                "before_start_h": "Sebelum anda bermula",
+                "before_start": "Anda seharusnya mengetahui tentang OpenStreetMap dan selok-belok penyunting Ini sebelum anda mula membuat perubahan. Penyunting iD ini mengandungi raptai berpandu untuk menerangkan kaedah asas menyunting OpenStreetMap. Klik \"Mulakan Panduan\" dalam paparan ini untuk memulakan tutorial yang hanya mengambil masa kira-kira 15 minit.",
+                "open_source_h": "Sumber Terbuka"
+            },
+            "overview": {
+                "title": "Tinjauan Keseluruhan",
+                "navigation_h": "Pengemudian"
+            },
+            "editing": {
+                "title": "Menyunting & Menyimpan",
+                "keyboard_h": "Jalan Pintas Papan Kekunci"
+            },
+            "feature_editor": {
+                "fields_h": "Tempat-tempat Kosong",
+                "tags_h": "Tag-tag"
+            },
+            "points": {
+                "title": "Titik-titik",
+                "delete_point": "Amatlah molek untuk menghapuskan ciri-ciri yang sudah tidak wujud di alam nyata. Ciri-ciri yang telah dihapuskan dalam OpenStreetMap juga bermakna membuang ciri tersebut daripada peta yang digunakan semua orang. Maka, anda hendaklah memastikan ciri-ciri alam nyata tersebut benar-benar tiada sebelum membuat penghapusan."
+            },
+            "lines": {
+                "title": "Garis-garis"
+            },
+            "areas": {
+                "title": "Kawasan-kawasan",
+                "add_area_h": "Menambah Kawasan-kawasan",
+                "modify_area_h": "Mengubah Kawasan-kawasan",
+                "delete_area_h": "Menghapus Kawasan-kawasan"
+            },
+            "gps": {
+                "title": "Jejak-jejak GPS",
+                "intro": "Jejak-jejak GPS yang dirakam ialah salah satu datang yang paling berguna untuk OpenStreetMap. Penyunting ini menyokong fail-fail berformat *.gpx*, *.geojson*, dan *.kml* yang ada dalam komputer anda. Anda boleh merakamkan jejak GPS dengan menggunakan sebuah telefon pintar, jam bersukan, atau pelbagai jenis peranti GPS yang lain.",
+                "using_h": "Menggunakan Jejak-jejak GPS"
+            }
         },
         "intro": {
             "ok": "OK",
             "graph": {
                 "block_number": "<value for addr:block_number>",
+                "city": "Kota Perdana",
                 "county": "<value for addr:county>",
                 "district": "<value for addr:district>",
                 "hamlet": "<value for addr:hamlet>",
                     "9th-avenue": "Lebuh Sembilan",
                     "10th-avenue": "Lebuh Sepuluh",
                     "11th-avenue": "Lebuh Sebelas",
-                    "12th-avenue": "Lebuh Dua Belas"
+                    "12th-avenue": "Lebuh Dua Belas",
+                    "access-point-employment": "Agensi Pekerjaan Access Point",
+                    "adams-street": "Jalan Adam",
+                    "andrews-street": "Jalan Anggerik",
+                    "armitage-street": "Jalan Angsana",
+                    "battle-street": "Jalan Beringin",
+                    "bennett-street": "Jalan Budi",
+                    "constantine-street": "Jalan Cahaya",
+                    "cushman-street": "Jalan Cempaka",
+                    "dollar-tree": "Kedai RM5",
+                    "east-street": "Jalan Timur",
+                    "elm-street": "Jalan Engku",
+                    "flower-street": "Jalan Fajar",
+                    "foster-street": "Jalan Firus",
+                    "french-street": "Jalan Forest",
+                    "garden-street": "Jalan Kebun",
+                    "hoffman-street": "Jalan Hilir",
+                    "jefferson-street": "Jalan Juwita",
+                    "kelsey-street": "Jalan Kemajuan",
+                    "las-coffee-cafe": "L.A.'s Coffee Cafe",
+                    "lynns-garage": "YY Auto & Accessories",
+                    "main-street-barbell": "Gim Jalan Besar",
+                    "main-street-cafe": "Kafe Jalan Besar",
+                    "main-street-fitness": "Fitness First & Foremost",
+                    "main-street": "Jalan Besar",
+                    "maple-street": "Jalan Mayang",
+                    "market-street": "Jalan Pasar",
+                    "michigan-avenue": "Lebuh Maju",
+                    "middle-street": "Jalan Tengah",
+                    "millard-street": "Jalan Mahkota",
+                    "moore-street": "Jalan Mega",
+                    "paisanos-bar-and-grill": "Paisano's Bar",
+                    "paisley-emporium": "Mat Bundle Jepun",
+                    "pealer-street": "Jalan Padu",
+                    "pine-street": "Jalan Pipit",
+                    "portage-river": "Sungai Pandan",
+                    "railroad-drive": "Lorong Stesen",
+                    "river-drive": "Persiaran Sungai",
+                    "river-road": "Jalan Sungai",
+                    "river-street": "Lebuh Sungai",
+                    "riverwalk-trail": "Denai Tepi Sungai",
+                    "rocky-river": "Sungai Rasa",
+                    "saint-joseph-river": "Sungai Siantan",
+                    "scidmore-park-petting-zoo": "Zoo Sentuh Taman Bandar Kota Perdana",
+                    "scidmore-park": "Taman Bandar Kota Perdana",
+                    "south-street": "Jalan Selatan",
+                    "southern-michigan-bank": "Bank Simpanan",
+                    "spring-street": "Jalan Semarak",
+                    "three-rivers-city-hall": "Dewan Bandaraya Kota Perdana",
+                    "three-rivers-elementary-school": "Sekolah Kebangsaan Kota Perdana",
+                    "three-rivers-fire-department": "Balai Bomba dan Penyelamat Kota Perdana",
+                    "three-rivers-high-school": "Kolej Tingkatan Enam Kota Perdana",
+                    "three-rivers-middle-school": "Sekolah Menengah Kebangsaan Kota Perdana",
+                    "three-rivers-municipal-airport": "Lapangan Terbang Kota Perdana",
+                    "three-rivers-post-office": "Pejabat Pos Kota Perdana",
+                    "three-rivers-public-library": "Perpustakaan Awam Kota Perdana",
+                    "three-rivers": "Kota Perdana",
+                    "walnut-street": "Jalan Warna",
+                    "washington-street": "Jalan Widuri",
+                    "water-street": "Jalan Warta",
+                    "west-street": "Jalan Barat",
+                    "wheeler-street": "Jalan Wangsa",
+                    "wood-street": "Jalan Wangsa"
                 }
             },
             "welcome": {
                 "zoom": "Anda boleh zum masuk atau zum keluar dengan mentatal roda tetikus atau pad sentuh laptop, atau dengan mengklik pada butang {plus}/{minus}. **Zumkan peta!**",
                 "features": "Perkataan *gambaran-gambaran* digunakan untuk memperincikan objek-objek dalam peta. Setiap butiran dalam alam nyata boleh dipetakan sebagai suatu gambaran dalam OpenStreetMap.",
                 "points_lines_areas": "Gambaran-gambaran peta diwakilkan dengan *titik-titik*, *garis-garis*, atau *kawasan-kawasan*.",
-                "nodes_ways": "Dalam OpenStreetMap, titik-titik kadangkala dirujuk sebagai *nod-nod*, manakala garis-garis dan kawasan-kawasan pula kadangkala dirujuk sebagai *cara-cara*.",
+                "nodes_ways": "Dalam OpenStreetMap, titik-titik ini kadang kala dirujuk sebagai nod-nod, manakala garis-garis dan kawasan-kawasan pula mungkin dirujuk sebagai *jalan-jalan*.",
                 "click_townhall": "Semua gambaran dalam peta boleh dipilih dengan satu klik terhadapnya. **Klik titik ini untuk memilihnya.**",
                 "selected_townhall": "Bagus! Titik ini telah dipilih. Gambaran yang telah dipilih akan berkunang-kunang.",
                 "editor_townhall": "Setelah suatu gambaran telah dipilih, *penyunting gambaran* akan dipaparkan di sisi peta.",
-                "preset_townhall": "Bahagian paling atas pada penyunting gambaran menunjukkan ciri-ciri gambaran. Titik ini ialah sebuah{preset}.",
+                "preset_townhall": "Bahagian paling atas pada penyunting gambaran menunjukkan ciri-ciri gambaran. Titik ini ialah sebuah {preset}.",
                 "fields_townhall": "Bahagian tengah penyunting gambaran mempunyai medan-medan yang menunjukkan sifat-sifat gambaran, seperti nama dan alamatnya.",
                 "close_townhall": "**Tutup penyunting gambaran dengan menekan butang Escape atau mengklik butang {button} di bucu atas sekali.**",
                 "search_street": "Anda boleh menggelintar gambaran-gambaran yang sedang dipaparkan di peta, atau di seluruh dunia. **Gelintar '{name}'.**",
                 "selected_street": "Bagus! {name} telah dipilih."
             },
             "points": {
-                "title": "Titik-titik"
+                "title": "Titik-titik",
+                "delete": "Amatlah molek untuk menghapuskan ciri-ciri yang sudah tidak wujud di alam nyata.{br}Ciri-ciri yang telah dihapuskan dalam OpenStreetMap juga bermakna membuang ciri tersebut daripada peta yang digunakan semua orang. Maka, anda hendaklah memastikan ciri-ciri alam nyata tersebut benar-benar tiada sebelum membuat penghapusan. **Klik butang {button} to menghapuskan titik.**"
             },
             "areas": {
                 "title": "Kawasan-kawasan",
             }
         },
         "shortcuts": {
+            "title": "Jalan pintas papan kekunci",
+            "tooltip": "Tunjukkan paparan jalan pintas papan kekunci.",
             "browsing": {
                 "navigation": {
-                    "title": "Pengemudian"
+                    "title": "Pengemudian",
+                    "zoom": "Zum dekat / Zum jauh",
+                    "zoom_more": "Zum dekat / Zum jauh dengan lebih banyak"
                 },
                 "help": {
-                    "title": "Bantuan"
+                    "title": "Bantuan",
+                    "keyboard": "Tunjukkan kaedah jalan pintas papan kekunci"
                 },
                 "display_options": {
                     "map_data": "Tunjukkan pilihan data peta"
                             "description": "Capaian dibenarkan hanya untuk sampai ke destinasi sahaja",
                             "title": "Destinasi"
                         },
+                        "dismount": {
+                            "description": "Capaian dibenarkan tetapi pengayuh basikal diwajibkan turun dari basikal",
+                            "title": "Turun Dari Basikal"
+                        },
                         "no": {
+                            "description": "Capaian tidak dibenarkan untuk orang awam",
                             "title": "Dilarang"
                         },
                         "private": {
                             "title": "Dibenarkan"
                         }
                     },
+                    "placeholder": "Tidak Dinyatakan",
                     "types": {
+                        "access": "Semua jenis kenderaan",
                         "bicycle": "Basikal",
+                        "foot": "Jalan Kaki",
                         "horse": "Kuda",
-                        "motor_vehicle": "Kenderaan bermotor"
+                        "motor_vehicle": "Kenderaan Bermotor"
                     }
                 },
                 "access_simple": {
                         "country": "Negara",
                         "county!jp": "Daerah",
                         "district": "Daerah",
+                        "district!vn": "Arrondissement/Pekan/Daerah",
                         "housename": "Nama rumah",
                         "housenumber": "123",
                         "housenumber!jp": "No. Bangunan/No. Lot",
                         "neighbourhood": "Kejiranan",
+                        "neighbourhood!jp": "Chōme/Aza/Koaza",
                         "place": "Tempat",
                         "postcode": "Poskod",
                         "province": "Wilayah",
+                        "province!jp": "Wilayah",
+                        "quarter!jp": "Ōaza/Machi",
                         "state": "Negeri",
                         "street": "Jalan",
+                        "subdistrict": "Mukim",
+                        "subdistrict!vn": "Mukim/Komun/Townlet",
                         "suburb": "Pinggir bandar",
                         "suburb!jp": "Wad"
                     }
                 "bunker_type": {
                     "label": "Jenis"
                 },
+                "cables": {
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "Arah (Darjah Ikut Jam)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "Kapasiti",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Arah",
-                    "options": {
-                        "E": "Timur",
-                        "ENE": "Timur-timur laut",
-                        "ESE": "Timur-tenggara",
-                        "N": "Utara",
-                        "NE": "Timur Laut",
-                        "NNE": "Utara-timur laut",
-                        "NNW": "Utara-barat laut",
-                        "NW": "Barat Laut",
-                        "S": "Selatan",
-                        "SE": "Tenggara",
-                        "SSE": "Selatan-tenggara",
-                        "SSW": "Selatan-barat daya",
-                        "SW": "Barat Daya",
-                        "W": "Barat",
-                        "WNW": "Barat-barat laut",
-                        "WSW": "Barat-barat daya"
-                    }
-                },
                 "castle_type": {
                     "label": "Jenis"
                 },
-                "clock_direction": {
-                    "label": "Arah",
-                    "options": {
-                        "anticlockwise": "Lawan arah jam",
-                        "clockwise": "Ikut arah jam"
-                    }
-                },
                 "clothes": {
                     "label": "Pakaian"
                 },
                     "label": "Jenis"
                 },
                 "contact/webcam": {
-                    "label": "Webcam URL"
+                    "label": "Webcam URL",
+                    "placeholder": "http://contoh.com/"
                 },
                 "content": {
                     "label": "Kandungan"
                 "description": {
                     "label": "Keterangan"
                 },
+                "devices": {
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "Menukar Lampin Tersedia"
                 },
                 "drive_through": {
                     "label": "Pandu-Lalu"
                 },
+                "duration": {
+                    "placeholder": "00:00"
+                },
                 "electrified": {
                     "label": "Elektrifikasi",
                     "options": {
                     "label": "Ketinggian"
                 },
                 "email": {
-                    "label": "Emel"
+                    "label": "Emel",
+                    "placeholder": "contoh@contoh.com"
                 },
                 "emergency": {
                     "label": "Kecemasan"
                     "label": "Pengecualian"
                 },
                 "fax": {
-                    "label": "Faks"
+                    "label": "Faks",
+                    "placeholder": "+31 42 123 4567"
                 },
                 "fee": {
                     "label": "Bayaran, Yuran"
                 "inscription": {
                     "label": "Inskripsi"
                 },
+                "intermittent": {
+                    "label": "Berjeda"
+                },
                 "internet_access": {
                     "label": "Akses Internet",
                     "options": {
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
-                    "label": "Lapisan"
+                    "label": "Lapisan",
+                    "placeholder": "0"
                 },
                 "leaf_cycle": {
                     "label": "Kitaran Daun",
                     "label": "Jenis"
                 },
                 "oneway": {
-                    "label": "Sehala",
+                    "label": "Jalan Sehala",
                     "options": {
                         "no": "Tidak",
                         "undefined": "Diandaikan Tidak",
                     }
                 },
                 "oneway_yes": {
-                    "label": "Sehala",
+                    "label": "Jalan Sehala",
                     "options": {
                         "no": "Tidak",
                         "undefined": "Diandaikan Ya",
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Arah",
-                    "options": {
-                        "backward": "Ke belakang",
-                        "forward": "Ke hadapan"
-                    }
-                },
                 "park_ride": {
                     "label": "Taman dan Tunggangan"
                 },
                 "payment_multi": {
                     "label": "Jenis Pembayaran"
                 },
+                "phases": {
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "Telefon",
                     "placeholder": "+31 42 123 4567"
                     "label": "Output Kuasa",
                     "placeholder": "500, MW, 1000 MW, 2000 MW..."
                 },
+                "playground/max_age": {
+                    "label": "Had Umur Maksimum"
+                },
+                "playground/min_age": {
+                    "label": "Had Umur Minimum"
+                },
                 "population": {
                     "label": "Penduduk"
                 },
                 "railway": {
                     "label": "Jenis"
                 },
+                "rating": {
+                    "label": "Pengadaran Kuasa"
+                },
                 "recycling_accepts": {
                     "label": "Menerima"
                 },
-                "recycling_type": {
-                    "label": "Jenis Kitar Semula",
-                    "options": {
-                        "centre": "Pusat Kitar Semula",
-                        "container": "Kontena, Bekas"
-                    }
-                },
                 "ref": {
                     "label": "Kod Rujukan"
                 },
                 "ref_route": {
                     "label": "Nombor Laluan"
                 },
+                "ref_runway": {
+                    "placeholder": "cth. 01L/19R"
+                },
                 "ref_stop_position": {
                     "label": "Nombor Perhentian"
                 },
+                "ref_taxiway": {
+                    "placeholder": "cth. A5"
+                },
                 "relation": {
                     "label": "Jenis"
                 },
                 "service_rail": {
                     "label": "Jenis Perkhidmatan",
                     "options": {
+                        "siding": "Landasan Sisi",
                         "spur": "Pemacu",
                         "yard": "Perkarangan"
                     }
                 "social_facility_for": {
                     "label": "Orang Dilayan"
                 },
+                "source": {
+                    "label": "Sumber-sumber"
+                },
                 "sport": {
                     "label": "Sukan"
                 },
                     },
                     "placeholder": "Tidak Diketahui"
                 },
+                "structure_waterway": {
+                    "label": "Struktur",
+                    "options": {
+                        "tunnel": "Terowong"
+                    },
+                    "placeholder": "Tidak Diketahui"
+                },
                 "studio": {
                     "label": "Jenis"
                 },
+                "substance": {
+                    "label": "Jenis Bahan"
+                },
                 "substation": {
                     "label": "Jenis"
                 },
                 "tourism": {
                     "label": "Jenis"
                 },
+                "tourism_attraction": {
+                    "label": "Pelancongan"
+                },
                 "tower/construction": {
                     "label": "Pembinaan",
                     "placeholder": "Lelaki, Kekisi, Tersembunyi, ..."
                         "grade1": "Pepejal: berturap atau permukaan tegar yang sangat padat",
                         "grade2": "Kebanyakannya Pepejal: kerikil/batu dengan beberapa bahan yang dicampur"
                     }
+                },
+                "trade": {
+                    "label": "Jenis"
+                },
+                "traffic_calming": {
+                    "label": "Jenis"
+                },
+                "traffic_signals": {
+                    "label": "Jenis"
+                },
+                "transformer": {
+                    "label": "Jenis",
+                    "options": {
+                        "yes": "Tidak diketahui"
+                    }
+                },
+                "volcano/status": {
+                    "label": "Status Gunung Berapi",
+                    "options": {
+                        "active": "Aktif",
+                        "dormant": "Pendam",
+                        "extinct": "Mati"
+                    }
+                },
+                "volcano/type": {
+                    "label": "Jenis Gunung Berapi",
+                    "options": {
+                        "scoria": "Skoria",
+                        "shield": "Perisai",
+                        "stratovolcano": "Strato-gunung berapi"
+                    }
+                },
+                "voltage": {
+                    "label": "Voltan"
+                },
+                "voltage/primary": {
+                    "label": "Voltan Primer"
+                },
+                "voltage/secondary": {
+                    "label": "Voltan Sekunder"
+                },
+                "voltage/tertiary": {
+                    "label": "Voltan Tertier"
+                },
+                "wall": {
+                    "label": "Jenis"
+                },
+                "water": {
+                    "label": "Jenis"
+                },
+                "waterway": {
+                    "label": "Jenis"
+                },
+                "website": {
+                    "label": "Tapak Web",
+                    "placeholder": "http://contoh.com/"
+                },
+                "wetland": {
+                    "label": "Jenis"
+                },
+                "wheelchair": {
+                    "label": "Capaian Kerusi Roda"
+                },
+                "width": {
+                    "label": "Lebar (Meter)"
+                },
+                "wikipedia": {
+                    "label": "Wikipedia"
+                },
+                "windings": {
+                    "placeholder": "1, 2, 3..."
+                },
+                "windings/configuration": {
+                    "options": {
+                        "delta": "Delta",
+                        "leblanc": "Leblanc"
+                    }
                 }
             },
             "presets": {
+                "address": {
+                    "name": "Alamat"
+                },
+                "advertising/billboard": {
+                    "name": "Papan Iklan",
+                    "terms": "<translate with synonyms or related terms for 'Billboard', separated by commas>"
+                },
+                "aerialway": {
+                    "name": "Jalan Udara"
+                },
+                "aerialway/cable_car": {
+                    "name": "Kereta Kabel"
+                },
+                "aerialway/gondola": {
+                    "name": "Gondola"
+                },
+                "amenity/cafe": {
+                    "name": "Kafe"
+                },
+                "amenity/driving_school": {
+                    "name": "Sekolah Memandu"
+                },
+                "amenity/embassy": {
+                    "name": "Kedutaan"
+                },
+                "amenity/fast_food": {
+                    "name": "Makanan Segera"
+                },
+                "amenity/fire_station": {
+                    "name": "Balai Bomba"
+                },
+                "amenity/food_court": {
+                    "name": "Medan Selera"
+                },
+                "amenity/fuel": {
+                    "name": "Stesen Minyak"
+                },
+                "amenity/ice_cream": {
+                    "name": "Kedai Ais Krim"
+                },
+                "amenity/internet_cafe": {
+                    "name": "Kafe Internet"
+                },
+                "amenity/library": {
+                    "name": "Perpustakaan"
+                },
+                "amenity/motorcycle_parking": {
+                    "name": "Tempat Letak Motosikal",
+                    "terms": "Parkir Motosikal"
+                },
+                "amenity/music_school": {
+                    "name": "Sekolah Muzik"
+                },
+                "amenity/nightclub": {
+                    "name": "Kelab Malam"
+                },
+                "amenity/parking": {
+                    "name": "Tempat Letak Kereta"
+                },
+                "amenity/parking_space": {
+                    "name": "Ruang Letak Kenderaan"
+                },
+                "amenity/pharmacy": {
+                    "name": "Farmasi"
+                },
+                "amenity/place_of_worship": {
+                    "name": "Tempat Ibadat"
+                },
+                "amenity/place_of_worship/buddhist": {
+                    "name": "Tokong Buddha"
+                },
+                "amenity/place_of_worship/christian": {
+                    "name": "Gereja"
+                },
+                "amenity/place_of_worship/hindu": {
+                    "name": "Kuil Hindu"
+                },
+                "amenity/place_of_worship/jewish": {
+                    "name": "Saumaah",
+                    "terms": "Sinagoga"
+                },
+                "amenity/place_of_worship/muslim": {
+                    "name": "Masjid",
+                    "terms": "Surau, Musolla, Solat"
+                },
+                "amenity/place_of_worship/shinto": {
+                    "name": "Tokong Shinto"
+                },
+                "amenity/place_of_worship/sikh": {
+                    "name": "Kuil Sikh"
+                },
+                "amenity/place_of_worship/taoist": {
+                    "name": "Tokong Tao"
+                },
+                "amenity/planetarium": {
+                    "name": "Planetarium"
+                },
+                "amenity/police": {
+                    "name": "Polis"
+                },
+                "amenity/post_box": {
+                    "name": "Peti Surat"
+                },
+                "amenity/post_office": {
+                    "name": "Pejabat Pos"
+                },
+                "amenity/prison": {
+                    "name": "Kawasan Penjara"
+                },
+                "amenity/pub": {
+                    "name": "Pub"
+                },
+                "amenity/ranger_station": {
+                    "name": "Stesen Renjer"
+                },
+                "amenity/recycling": {
+                    "name": "Bekas Kitar Semula"
+                },
+                "amenity/recycling_centre": {
+                    "name": "Pusat Kitar Semula"
+                },
+                "amenity/register_office": {
+                    "name": "Pejabat Pendaftar"
+                },
+                "amenity/restaurant": {
+                    "name": "Restoran"
+                },
+                "amenity/school": {
+                    "name": "Kawasan Sekolah"
+                },
+                "amenity/studio": {
+                    "name": "Studio"
+                },
+                "amenity/swimming_pool": {
+                    "name": "Kolam Renang"
+                },
+                "amenity/taxi": {
+                    "name": "Tempat Menunggu Teksi"
+                },
+                "amenity/telephone": {
+                    "name": "Telefon"
+                },
+                "amenity/theatre": {
+                    "name": "Teater"
+                },
+                "amenity/toilets": {
+                    "name": "Tandas"
+                },
+                "amenity/townhall": {
+                    "name": "Dewan Perbandaran"
+                },
+                "amenity/university": {
+                    "name": "Kawasan Universiti"
+                },
+                "amenity/vending_machine": {
+                    "name": "Mesin Layan Diri"
+                },
+                "amenity/veterinary": {
+                    "name": "Veterinar",
+                    "terms": "Klinik Haiwan"
+                },
+                "area": {
+                    "name": "Kawasan"
+                },
                 "area/highway": {
                     "name": "Permukaaan Jalan",
                     "terms": "<translate with synonyms or related terms for 'Road Surface', separated by commas>"
                 },
+                "barrier/gate": {
+                    "name": "Pintu"
+                },
+                "barrier/toll_booth": {
+                    "name": "Pondok Tol",
+                    "terms": "Plaza Tol"
+                },
+                "barrier/wall": {
+                    "name": "Tembok"
+                },
+                "boundary/administrative": {
+                    "name": "Sempadan Pentadbiran"
+                },
                 "building": {
                     "name": "Bangunan",
                     "terms": "<translate with synonyms or related terms for 'Building', separated by commas>"
                 },
+                "building/apartments": {
+                    "name": "Rumah-rumah Pangsa"
+                },
+                "building/cabin": {
+                    "name": "Kabin"
+                },
                 "building/cathedral": {
                     "name": "Bangunan Katedral",
                     "terms": "<translate with synonyms or related terms for 'Cathedral Building', separated by commas>"
                     "name": "Bangunan Dalam Pembinaan",
                     "terms": "<translate with synonyms or related terms for 'Building Under Construction', separated by commas>"
                 },
+                "building/garage": {
+                    "name": "Garaj"
+                },
+                "building/garages": {
+                    "name": "Garaj-garaj"
+                },
+                "building/greenhouse": {
+                    "name": "Rumah Tanaman"
+                },
                 "building/hospital": {
                     "name": "Bangunan Hospital",
                     "terms": "<translate with synonyms or related terms for 'Hospital Building', separated by commas>"
                     "name": "Bangunan Hotel",
                     "terms": "<translate with synonyms or related terms for 'Hotel Building', separated by commas>"
                 },
+                "building/house": {
+                    "name": "Rumah"
+                },
+                "building/hut": {
+                    "name": "Pondok",
+                    "terms": "Dangau"
+                },
                 "building/industrial": {
                     "name": "Bangunan Perindustrian",
                     "terms": "<translate with synonyms or related terms for 'Industrial Building', separated by commas>"
                     "name": "Bangunan Prasekolah/Tadika",
                     "terms": "<translate with synonyms or related terms for 'Preschool/Kindergarten Building', separated by commas>"
                 },
+                "building/mosque": {
+                    "name": "Bangunan Masjid",
+                    "terms": "Bangunan Surau, Musolla"
+                },
                 "building/public": {
                     "name": "Bangunan Awam",
                     "terms": "<translate with synonyms or related terms for 'Public Building', separated by commas>"
                     "name": "Bangunan Kedai",
                     "terms": "<translate with synonyms or related terms for 'Retail Building', separated by commas>"
                 },
+                "building/roof": {
+                    "name": "Atap",
+                    "terms": "Bumbung"
+                },
                 "building/school": {
                     "name": "Bangunan Sekolah",
                     "terms": "<translate with synonyms or related terms for 'School Building', separated by commas>"
                 },
+                "building/stable": {
+                    "name": "Kandang Kuda"
+                },
+                "building/train_station": {
+                    "name": "Stesen Kereta Api"
+                },
                 "building/university": {
                     "name": "Bangunan Universiti",
                     "terms": "<translate with synonyms or related terms for 'University Building', separated by commas>"
                 },
+                "building/warehouse": {
+                    "name": "Gudang"
+                },
+                "club": {
+                    "name": "Kelab"
+                },
                 "highway/primary": {
                     "name": "Jalan Utama",
                     "terms": "<translate with synonyms or related terms for 'Primary Road', separated by commas>"
                     "name": "Jalan Kecil/Tidak Dikelaskan",
                     "terms": "<translate with synonyms or related terms for 'Minor/Unclassified Road', separated by commas>"
                 },
+                "leisure/pitch/cricket": {
+                    "name": "Padang Kriket"
+                },
+                "leisure/pitch/soccer": {
+                    "name": "Padang Bola Sepak"
+                },
+                "office": {
+                    "name": "Pejabat"
+                },
+                "office/accountant": {
+                    "name": "Pejabat Akauntan"
+                },
+                "office/administrative": {
+                    "name": "Pejabat Pentadbiran"
+                },
+                "office/adoption_agency": {
+                    "name": "Agensi Pengambilan Anak Angkat"
+                },
+                "office/advertising_agency": {
+                    "name": "Agensi Pengiklanan"
+                },
+                "office/architect": {
+                    "name": "Pejabat Arkitek"
+                },
+                "office/association": {
+                    "name": "Pejabat Pertubuhan Bukan Untung"
+                },
+                "office/charity": {
+                    "name": "Pejabat Kebajikan"
+                },
+                "office/educational_institution": {
+                    "name": "Institusi Pendidikan"
+                },
+                "office/employment_agency": {
+                    "name": "Agensi Pekerjaan"
+                },
+                "office/energy_supplier": {
+                    "name": "Pejabat Pembekal Tenaga"
+                },
+                "office/estate_agent": {
+                    "name": "Pejabat Hartanah"
+                },
+                "office/financial": {
+                    "name": "Pejabat Kewangan"
+                },
+                "office/forestry": {
+                    "name": "Pejabat Perhutanan"
+                },
+                "office/foundation": {
+                    "name": "Pejabat Yayasan"
+                },
+                "office/government": {
+                    "name": "Pejabat Kerajaan"
+                },
+                "office/government/register_office": {
+                    "name": "Pejabat Pendaftar"
+                },
+                "office/government/tax": {
+                    "name": "Pejabat Cukai dan Hasil"
+                },
+                "office/guide": {
+                    "name": "Pejabat Pemandu Pelancong"
+                },
+                "office/insurance": {
+                    "name": "Pejabat Insurans"
+                },
+                "office/it": {
+                    "name": "Pejabat Teknologi Maklumat"
+                },
+                "office/lawyer": {
+                    "name": "Pejabat Undang-undang"
+                },
+                "office/lawyer/notary": {
+                    "name": "Pejabat Penyaksi Awam"
+                },
+                "office/moving_company": {
+                    "name": "Pejabat Syarikat Pemindahan"
+                },
+                "office/newspaper": {
+                    "name": "Pejabat Akhbar"
+                },
+                "office/ngo": {
+                    "name": "Pejabat Pertubuhan Bukan Kerajaan"
+                },
+                "office/notary": {
+                    "name": "Pejabat Penyaksi Awam"
+                },
+                "office/physician": {
+                    "name": "Pakar Perubatan"
+                },
+                "office/political_party": {
+                    "name": "Parti Politik"
+                },
+                "office/private_investigator": {
+                    "name": "Pejabat Penyiasat Peribadi"
+                },
+                "office/quango": {
+                    "name": "Pejabat Separa NGO"
+                },
+                "office/research": {
+                    "name": "Pejabat Penyelidikan"
+                },
+                "office/surveyor": {
+                    "name": "Pejabat Juruukur"
+                },
+                "office/tax_advisor": {
+                    "name": "Pejabat Penasihat Cukai"
+                },
+                "office/telecommunication": {
+                    "name": "Pejabat Telekom"
+                },
+                "office/therapist": {
+                    "name": "Pejabat Ahli Terapi"
+                },
+                "office/travel_agent": {
+                    "name": "Agensi Pelancongan"
+                },
+                "office/water_utility": {
+                    "name": "Pejabat Pembekal Air"
+                },
+                "piste": {
+                    "name": "Piste/Denai Ski"
+                },
+                "place": {
+                    "name": "Tempat"
+                },
+                "place/city": {
+                    "name": "Bandar"
+                },
+                "place/farm": {
+                    "name": "Ladang"
+                },
+                "place/hamlet": {
+                    "name": "Dukuh"
+                },
+                "place/island": {
+                    "name": "Pulau"
+                },
+                "place/islet": {
+                    "name": "Anak Pulau"
+                },
+                "place/isolated_dwelling": {
+                    "name": "Tempat Tinggal Terpencil"
+                },
+                "place/locality": {
+                    "name": "Lokaliti"
+                },
+                "place/neighbourhood": {
+                    "name": "Kejiranan"
+                },
+                "place/plot": {
+                    "name": "Plot"
+                },
+                "place/town": {
+                    "name": "Bandar"
+                },
+                "place/village": {
+                    "name": "Kampung"
+                },
+                "playground/seesaw": {
+                    "name": "Jongkang-jongket"
+                },
+                "playground/slide": {
+                    "name": "Gelongsor"
+                },
+                "power": {
+                    "name": "Tenaga Elektrik"
+                },
+                "power/generator": {
+                    "name": "Penjana Tenaga Elektrik"
+                },
+                "power/generator/source_nuclear": {
+                    "name": "Reaktor Nuklear"
+                },
+                "power/generator/source_wind": {
+                    "name": "Turbin Angin"
+                },
+                "power/line": {
+                    "name": "Talian Elektrik"
+                },
+                "power/minor_line": {
+                    "name": "Talian Elektrik Kecil"
+                },
+                "power/pole": {
+                    "name": "Tiang Elektrik"
+                },
+                "power/sub_station": {
+                    "name": "Pencawang"
+                },
+                "power/substation": {
+                    "name": "Pencawang"
+                },
+                "power/transformer": {
+                    "name": "Transformer"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Hentian Bas / Platform"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Hentian Feri / Platform"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Hentian Rel Ringan / Platform"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Hentian Monorel / Platform"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Hentian Laluan Bawah Tanah / Platform"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Hentian Kereta Api / Platform"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Hentian Tram / Platform"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Hentian Bas Troli / Platform"
+                },
+                "public_transport/platform": {
+                    "name": "Hentian Transit"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Hentian Bas / Platform"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Hentian Feri / Platform"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Hentian Rel Ringan / Platform"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Hentian Monorel / Platform"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Hentian Laluan Bawah Tanah / Platform"
+                },
+                "public_transport/platform_train": {
+                    "name": "Hentian Kereta Api / Platform"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Hentian Tram / Platform"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Hentian Bas Troli / Platform"
+                },
+                "public_transport/station": {
+                    "name": "Stesen Transit"
+                },
+                "railway": {
+                    "name": "Jalan Kereta Api"
+                },
+                "railway/abandoned": {
+                    "name": "Jalan Kereta Api Terbiar"
+                },
+                "railway/disused": {
+                    "name": "Jalan Kereta Api yang Tidak Diguna"
+                },
+                "railway/funicular": {
+                    "name": "Funikulus"
+                },
                 "railway/level_crossing": {
-                    "name": "Lintasan Keretapi (Jalan)",
+                    "name": "Lintasan Kereta Api (Jalan)",
                     "terms": "<translate with synonyms or related terms for 'Railway Crossing (Road)', separated by commas>"
                 },
+                "railway/light_rail": {
+                    "name": "Rel Ringan"
+                },
+                "railway/monorail": {
+                    "name": "Monorel"
+                },
+                "railway/narrow_gauge": {
+                    "name": "Rel Landasan Sempit"
+                },
+                "railway/platform": {
+                    "name": "Hentian Kereta Api / Platform"
+                },
+                "railway/rail": {
+                    "name": "Kereta Api"
+                },
+                "railway/signal": {
+                    "name": "Isyarat Kereta Api"
+                },
+                "railway/station": {
+                    "name": "Stesen Kereta Api"
+                },
+                "railway/subway": {
+                    "name": "Kereta Api Bawah Tanah"
+                },
+                "railway/tram": {
+                    "name": "Tram"
+                },
+                "roundabout": {
+                    "name": "Bulatan"
+                },
+                "shop": {
+                    "name": "Kedai"
+                },
+                "shop/bicycle": {
+                    "name": "Kedai Basikal"
+                },
+                "shop/chocolate": {
+                    "name": "Kedai Coklat"
+                },
+                "shop/clothes": {
+                    "name": "Kedai Pakaian"
+                },
+                "shop/computer": {
+                    "name": "Kedai Komputer"
+                },
+                "shop/convenience": {
+                    "name": "Kedai Kecil",
+                    "terms": "Kedai mudah beli"
+                },
+                "shop/doityourself": {
+                    "name": "Kedai DIY",
+                    "terms": "Kedai Dibuat Individu dengan Yakin, Kedai Buat Sendiri"
+                },
+                "shop/dry_cleaning": {
+                    "name": "Kedai Cucian Kering"
+                },
+                "shop/e-cigarette": {
+                    "name": "Kedai Rokok Elektronik",
+                    "terms": "Kedai E-Rokok, Vape"
+                },
+                "shop/electronics": {
+                    "name": "Kedai Elektronik"
+                },
+                "shop/fabric": {
+                    "name": "Kedai Fabrik"
+                },
+                "shop/florist": {
+                    "name": "Kedai Bunga"
+                },
+                "shop/greengrocer": {
+                    "name": "Kedai Menjual Sayur"
+                },
+                "shop/mobile_phone": {
+                    "name": "Kedai Telefon Bimbit",
+                    "terms": "Topup, Kredit, Tambah Nilai, Bil Telefon"
+                },
+                "shop/money_lender": {
+                    "name": "Ceti",
+                    "terms": "Along, Peminjam Wang"
+                },
+                "shop/music": {
+                    "name": "Kedai Muzik"
+                },
+                "shop/musical_instrument": {
+                    "name": "Kedai Alatan Muzik"
+                },
+                "shop/paint": {
+                    "name": "Kedai Cat"
+                },
+                "shop/tailor": {
+                    "name": "Kedai Tukang Jahit"
+                },
+                "shop/toys": {
+                    "name": "Kedai Permainan"
+                },
+                "shop/tyres": {
+                    "name": "Kedai Tayar"
+                },
+                "tourism": {
+                    "name": "Pelancongan"
+                },
                 "type/route/road": {
                     "name": "Laluan Jalan",
                     "terms": "<translate with synonyms or related terms for 'Road Route', separated by commas>"
+                },
+                "waterway/river": {
+                    "name": "Sungai"
+                },
+                "waterway/riverbank": {
+                    "name": "Tebing sungai"
                 }
             }
         },
                 "description": "Imejan satelit Premium DigitalGlobe.",
                 "name": "Imejan DigitalGlobe Premium"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Terma & Maklum Balas"
+                },
+                "description": "Had-had imejan dan tarikh rakaman dibuat. Label hanya kelihatan pada paras zum 14 dan lebih tinggi.",
+                "name": "Vintaj Imejan Satelit Premium DigitalGlobe"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Terma & Maklum Balas"
                 "description": "Imejan satelit Standard DigitalGlobe.",
                 "name": "Imejan DigitalGlobe Standard"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Terma & Maklum Balas"
+                },
+                "description": "Had-had imejan dan tarikh rakaman dibuat. Label hanya kelihatan pada paras zum 14 dan lebih tinggi.",
+                "name": "Vintaj Imejan Satelit Standard DigitalGlobe"
+            },
+            "EsriWorldImagery": {
+                "attribution": {
+                    "text": "Terma & Maklum Balas"
+                },
+                "description": "Imejan sejagat Esri.",
+                "name": "Esri World Imagery"
+            },
             "MAPNIK": {
                 "attribution": {
                     "text": "© Penyumbang-penyumbang OpenStreetMap, CC-BY-SA"
                 },
                 "name": "OSM Inspector: Penandaan"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "Pada tahap zum 16+, data peta domain awam dari Banci AS. Pada tahap zum yang lebih rendah, hanya perubahan sejak 2006 tanpa perubahan yang telah dimasukkan ke dalam OpenStreetMap",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Kuning = Data peta domain awam daripada Banci AS. Merah = Data tidak ditemui dalam OpenStreetMap",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, data peta penyumbang-penyumbang OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Berbasikal"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, data peta penyumbang-penyumbang OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Mendaki"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, data peta penyumbang-penyumbang OpenStreetMap, ODbL 1.0"
-                },
-                "name": "Waymarked Trails: MTB"
+                "name": "Waymarked Trails: Basikal bukit (MTB)"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, data peta penyumbang-penyumbang OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Luncur"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, data peta penyumbang-penyumbang OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Sukan Musim Sejuk"
             },
             "basemap.at": {
                 "attribution": {
                     "text": "basemap.at"
                 },
-                "description": "Lapisan Orthofoto disediakan oleh basemap.at. \"Pengganti\" imejan geoimage.at.",
+                "description": "Lapisan Ortofoto disediakan oleh basemap.at. \"Pengganti\" imejan geoimage.at.",
                 "name": "Orthofoto basemap.at"
             },
             "hike_n_bike": {
index 90e902f55fed3f5ea8d55a4d2e499da663d1f8e4..63df55c3c0c1adf8adea254f578506ed451f6002 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Klik om meer knooppunten aan de lijn toe te voegen. Klik op een andere lijn om er een verbinding te maken en dubbelklik om de lijn af te sluiten."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Dit kan niet bewerkt worden, omdat het verbonden is met een verborgen object."
             }
         },
         "operations": {
                 },
                 "description": {
                     "long": {
-                        "single": "Spiegel dit object langs zijn lange as.",
-                        "multiple": "Spiegel deze objecten langs hun lange as."
+                        "single": "Spiegel dit object om zijn lange as.",
+                        "multiple": "Spiegel deze objecten om hun lange as."
                     },
                     "short": {
-                        "single": "Spiegel dit object langs zijn lange as.",
-                        "multiple": "Spiegel deze objecten langs hun korte as."
+                        "single": "Spiegel dit object om zijn lange as.",
+                        "multiple": "Spiegel deze objecten om hun korte as."
                     }
                 },
                 "key": {
                 },
                 "annotation": {
                     "long": {
-                        "single": "Object gespiegeld langs zijn lange as.",
-                        "multiple": "Meerdere objecten gespiegeld langs hun lange as."
+                        "single": "Object gespiegeld om zijn lange as.",
+                        "multiple": "Meerdere objecten gespiegeld om hun lange as."
                     },
                     "short": {
-                        "single": "Object gespiegeld langs zijn korte as.",
-                        "multiple": "Meerdere objecten gespiegeld langs hun korte as."
+                        "single": "Object gespiegeld om zijn korte as.",
+                        "multiple": "Meerdere objecten gespiegeld om hun korte as."
                     }
                 },
                 "incomplete_relation": {
                     "area": "Grens van een vlak gesplitst.",
                     "multiple": "{n} lijnen/grenzen van vlakken gesplitst."
                 },
-                "not_eligible": "Lijnen kunnen niet op hun begin- of eindknooppunt worden gesplitst.",
-                "multiple_ways": "Er zijn hier teveel lijnen om op te splitsen.",
+                "not_eligible": "Lijnen kunnen niet op hun begin- of eindknooppunt gesplitst worden.",
+                "multiple_ways": "Er zijn hier te veel lijnen om te splitsen.",
                 "connected_to_hidden": "Dit kan niet gesplitst worden omdat het verbonden is met een verborgen object."
             },
             "restriction": {
             "nothing": "Niets om opnieuw te doen."
         },
         "tooltip_keyhint": "Sneltoets:",
-        "browser_notice": "Deze editor werkt in Firefox, Chrome, Safari, Opera en Internet Explorer 11 en hoger. Download een nieuwere versie van je browser of gebruik Potlatch 2 om de kaart aan te passen.",
+        "browser_notice": "Deze editor werkt in Firefox, Chrome, Safari, Opera, en Internet Explorer 11 en hoger. Download een nieuwere versie van je browser of gebruik Potlatch 2 om de kaart aan te passen.",
         "translate": {
             "translate": "Vertaal",
             "localized_translation_label": "Naam in meerdere talen",
             "localized_translation_language": "Selecteer taal",
             "localized_translation_name": "Naam"
         },
-        "login": "login",
+        "zoom_in_edit": "Zoom in om te bewerken",
+        "login": "Log in",
         "logout": "Afmelden",
         "loading_auth": "Aan het verbinden met OpenStreetMap …",
         "report_a_bug": "Meld een bug",
         },
         "commit": {
             "title": "Uploaden naar OpenStreetMap",
-            "upload_explanation": "De aanpassingen die je uploadt worden zichtbaar op alle kaarten die de gegevens van OpenStreetMap gebruiken.",
-            "upload_explanation_with_user": "De aanpassingen die je als {user} uploadt worden zichtbaar op alle kaarten die de gegevens van OpenStreetMap gebruiken.",
+            "upload_explanation": "De aanpassingen die je uploadt, worden zichtbaar op alle kaarten die de gegevens van OpenStreetMap gebruiken.",
+            "upload_explanation_with_user": "De aanpassingen die je uploadt als {user} worden zichtbaar op alle kaarten die de gegevens van OpenStreetMap gebruiken.",
             "request_review": "Ik zou graag hebben dat iemand mijn bewerkingen nakijkt.",
             "save": "Upload",
             "cancel": "Annuleren",
             "created": "Aangemaakt:",
             "about_changeset_comments": "Over opmerking bij wijzigingen",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/NL:Good_changeset_comments",
-            "google_warning": "Je vermeldt Google in deze beschrijving. Onthoud dat kopiëren van Google Maps ten strengste verboden is.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Je vermeldt Google in deze beschrijving. Onthoud dat kopiëren van Google Maps illegaal en ten strengste verboden is.",
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Aanpassingen door {users}",
                 "key": "B",
                 "title": "Achtergrond",
                 "zoom": "In-/uitzoomen",
-                "vintage": "Klassiek",
+                "vintage": "Opnamedatum",
                 "source": "Bron",
                 "description": "Omschrijving",
                 "resolution": "Resolutie",
                 "accuracy": "Nauwkeurigheid",
                 "unknown": "Onbekend",
-                "show_tiles": "Tegels tonen",
-                "hide_tiles": "Tegels verbergen"
+                "show_tiles": "Toon tegels",
+                "hide_tiles": "Verberg tegels",
+                "show_vintage": "Toon oude foto's",
+                "hide_vintage": "Verberg oude foto's"
             },
             "history": {
                 "key": "H",
                 "version": "Versie",
                 "last_edit": "Laatste aanpassing",
                 "edited_by": "Aangepast door",
-                "changeset": "Wijzigingen",
+                "changeset": "Wijzigingenset",
                 "unknown": "Onbekend",
-                "link_text": "Geschiedenis van openstreetmap.org"
+                "link_text": "Geschiedenis op openstreetmap.org"
             },
             "location": {
                 "key": "L",
                 "title": "Meting",
                 "selected": "{n} geselecteerd",
                 "geometry": "Geometrie",
-                "closed": "gesloten",
                 "center": "Midden",
                 "perimeter": "Omtrek",
                 "length": "Lengte",
-                "area": "Gebied",
+                "area": "Oppervlakte",
                 "centroid": "Zwaartepunt",
                 "location": "Locatie",
                 "metric": "Metrisch",
-                "imperial": "Brits"
+                "imperial": "Brits",
+                "node_count": "Aantal knooppunten"
             }
         },
         "geometry": {
             "relation": "relatie"
         },
         "geocoder": {
-            "search": "Zoek wereldwijd ...",
+            "search": "Zoek wereldwijd ",
             "no_results_visible": "Geen resultaten in dit gebied",
             "no_results_worldwide": "Geen resultaten gevonden"
         },
         "geolocate": {
-            "title": "Toon Mijn Locatie",
-            "locating": "Bezig met localiseren, even geduld ..."
+            "title": "Toon mijn locatie",
+            "locating": "Bezig met lokaliseren, even geduld …"
         },
         "inspector": {
             "no_documentation_combination": "Er is geen documentatie beschikbaar voor deze tag",
             "no_documentation_key": "Er is geen documentatie beschikbaar voor deze sleutel",
             "documentation_redirect": "Deze documentatie is verplaatst naar een nieuwe pagina",
-            "show_more": "Toon Meer",
+            "show_more": "Toon meer",
             "view_on_osm": "Toon op openstreetmap.org",
-            "all_fields": "Alle velden",
+            "all_fields": "Alle eigenschappen",
             "all_tags": "Alle tags",
             "all_members": "Alle leden",
             "all_relations": "Alle relaties",
-            "new_relation": "Nieuwe relatie ...",
+            "new_relation": "Nieuwe relatie ",
             "role": "Rol",
             "choose": "Selecteer objecttype",
             "results": "{n} resultaten voor {search}",
             "title": "Achtergrond",
             "description": "Achtergrondinstellingen",
             "key": "B",
-            "percent_brightness": "Helderheid: {opacity}%",
+            "backgrounds": "Achtergronden",
             "none": "Geen",
             "best_imagery": "Beste bekende afbeeldingsbron voor deze locatie",
             "switch": "Selecteer terug deze achtergrond",
             "custom": "Aangepast",
-            "custom_button": "Aangepaste achtergrond aanpassen",
-            "custom_prompt": "Geef een tegel-URL-sjabloon op. Geldige placeholders zijn:\n   - {zoom}/{z}, {x}, {y} voor het Z/X/Y-schema\n   - {ty} voor omgekeerde Y-coördinaten in TMS-stijl\n   - {u} voor het quadtile-schema\n   - {switch:a,b,c} voor DNS-server-multiplexing\n\nVoorbeeld:\n{example}\n    \n    ",
-            "fix_misalignment": "Verplaatsing van luchtfoto aanpassen",
-            "imagery_source_faq": "Waar komen deze afbeeldingen vandaan? (Engels)",
+            "custom_button": "Tegel-URL-sjabloon aanpassen",
+            "overlays": "Lagen",
+            "imagery_source_faq": "Beeldopnameinfo / Rapporteer een probleem",
             "reset": "Standaard herstellen",
-            "offset": "Sleep ergens in de grijze zone hieronder om de verplaatsing van de luchtfoto aan te passen, of voer de waarden in in meter.",
+            "display_options": "Weergaveopties",
+            "brightness": "Helderheid",
+            "contrast": "Contrast",
+            "saturation": "Verzadiging",
+            "sharpness": "Scherpte",
             "minimap": {
-                "description": "Minikaart",
+                "description": "Toon minikaart",
                 "tooltip": "Toon een kleine, uitgezoomde kaart om je te helpen oriënteren.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Verplaatsing van luchtfoto aanpassen",
+            "offset": "Sleep ergens in de grijze zone hieronder om de verplaatsing van de luchtfoto aan te passen, of voer de waarden in in meter."
         },
         "map_data": {
             "title": "Kaartgegevens",
                     "title": "OpenStreetMap-gegevens"
                 }
             },
-            "fill_area": "Vlakken Inkleuren",
-            "map_features": "Objecttypes Tonen/Verbergen",
+            "fill_area": "Vlakken inkleuren",
+            "map_features": "Objecttypes tonen/verbergen",
             "autohidden": "Deze objecten zijn automatisch verborgen omdat er anders te veel op het scherm zouden staan. Je kan inzoomen om ze te bewerken.",
             "osmhidden": "Deze objecten zijn automatisch verborgen omdat de OpenStreetMap-laag verborgen is."
         },
             },
             "landuse": {
                 "description": "Landindeling",
-                "tooltip": "Wouden, llandbouwgronden, parken, woongebieden,winkelzones …"
+                "tooltip": "Bossen, landbouwgronden, parken, woongebieden, winkelzones …"
             },
             "boundaries": {
                 "description": "Grenzen",
         },
         "restore": {
             "heading": "Je hebt niet-opgeslagen aanpassingen",
-            "description": "Er zijn niet-opgeslagen aanpassingen uit een vorige sessie. Wil je deze aanpassingen herstellen?",
+            "description": "Er zijn niet-opgeslagen aanpassingen uit een vorige sessie. Wil je die herstellen?",
             "restore": "Herstel mijn wijzigingen",
             "reset": "Verwerp mijn wijzigingen"
         },
             "status_code": "Server gaf volgende statuscode terug: {code}",
             "unknown_error_details": "Controleer of je bent verbonden met het internet.",
             "uploading": "Bezig met uploaden naar OpenStreetMap …",
+            "conflict_progress": "Controleren op conflicten: {num} van {total}",
             "unsaved_changes": "Je hebt niet-opgeslagen aanpassingen",
             "conflict": {
                 "header": "Los bewerkingsconflicten op",
         },
         "splash": {
             "welcome": "Welkom bij iD, een bewerkingsprogramma voor OpenStreetMap",
-            "text": "iD biedt een gebruiksvriendelijke en krachtige manier om bij te dragen aan de beste, open wereldkaart ter wereld. Dit is versie {version}. Voor meer informatie, zie {website} en meld softwarefouten op {github}.",
-            "walkthrough": "Start de rondleiding"
+            "text": "iD biedt een gebruiksvriendelijke manier om bij te dragen aan de beste, open wereldkaart ter wereld. Dit is versie {version}. Voor meer informatie, zie {website}. Meld softwarefouten op {github}.",
+            "walkthrough": "Start de rondleiding",
+            "start": "Bewerk nu"
         },
         "source_switch": {
             "live": "live",
             "untagged_area_tooltip": "Selecteer een objecttype dat beschrijft wat dit vlak is.",
             "untagged_relation": "Relatie zonder tags",
             "untagged_relation_tooltip": "Selecteer een objecttype dat beschrijft wat deze relatie is.",
-            "many_deletions": "Je verwijdert {n} objecten. Weet je zeker dat je dit wil doen? Dit zal ze verwijderen van de kaart die iedereen ziet op openstreetmap.org.",
             "tag_suggests_area": "De tag {tag} suggereert dat de lijn een vlak is, maar het is geen vlak",
             "deprecated_tags": "Afgeschafte tags: {tags}"
         },
+        "zoom": {
+            "in": "Zoom in",
+            "out": "Zoom uit"
+        },
         "cannot_zoom": "Kan niet verder uitzoomen in huidige modus",
         "full_screen": "Volledig scherm aan/uit",
         "gpx": {
         },
         "mapillary_images": {
             "tooltip": "Foto's op straatniveau van Mapillary",
-            "title": "Foto-laag (Mapillary)"
+            "title": "Fotolaag (Mapillary)"
         },
         "mapillary_signs": {
-            "tooltip": "Verkeerslichten uit Mapillary (foto-laag moet geactiveerd zijn)",
-            "title": "Herkende-verkeersborden-laag (Mapillary)"
+            "tooltip": "Verkeerborden uit Mapillary (Mapillary-fotolaag moet geactiveerd zijn)",
+            "title": "Herkende verkeersborden (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Bekijk deze afbeelding op Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Foto's op straatniveau van OpenStreetCam",
+            "title": "Fotolaag (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Bekijk deze afbeelding op OpenStreetCam"
+        },
         "help": {
             "title": "Hulp",
             "key": "H",
-            "help": "# Hulp\n\nDit is een bewerkingsprogramma voor\n[OpenStreetMap](http://www.openstreetmap.org/), de vrije en bewerkbare kaart van de wereld. Je kan\nhet gebruiken om data in je regio toe te voegen en bij te werken.\nZo maak je de open-source- en open-data-kaart van de wereld\nbeter voor iedereen.\n\nWijzingen die je maakt aan deze kaart worden zichtbaar voor iedereen\ndie OpenStreetMap gebruikt. Om te kunnen bewerken, zal je moeten\n[inloggen](https://www.openstreetmap.org/login).\n\nDe [iD-bewerker](http://ideditor.com/) is een samenwerkingsproject\nwaarvan de [broncode beschikbaar is op GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nGPS-data is een waardevolle databron voor OpenStreetMap. Dit bewerkingsprogramma ondersteunt lokale GPS-paden – '.gpx'-bestanden op je eigen computer. Je kan dit soort paden opnemen met een aantal smartphone-apps of met aparte GPS-toestellen.\n\nVoor meer informatie over hoe je onderzoek kan doen met GPS, kan je terecht op [Mapping with a smartphone, GPS, or paper (Engels)](http://learnosm.org/en/mobile-mapping/) of [Sur le terrain avec un GPS (Frans)](http://learnosm.org/fr/beginner/using-gps/).\n\nOm een GPX-pad te gebruiken bij het karteren, sleep je het GPX-bestand op het kaartbewerkingsprogramma. Als het wordt herkend, zal het op de kaart worden getoond als een helderpaarse lijn. Open het menu 'Kaartgegevens' aan de rechterkant om deze nieuwe GPX-laag aan of uit te zetten of hem volledig in beeld te brengen.\n\nHet GPX-pad wordt niet rechtstreeks als een weg geüpload naar OpenStreetMap. De beste manier om het te gebruiken is als een hulpmiddel om op de kaart tekenen. Je wordt aangemoedigd het ook te [uploaden naar OpenStreetMap](http://www.openstreetmap.org/trace/create), zodat anderen het op dezelfde manier kunnen gebruiken.\n",
-            "imagery": "# Beeldmateriaal\n\nLuchtfoto's vormen een belangrijke bron bij het maken van de kaart. Een combinatie van luchtfoto's, satellietbeelden en vrij beschikbare bronnen is beschikbaar in de editor onder het menu 'Achtergrondinstellingen' aan de linkerzijde.\n\nOp veel plaatsen wordt standaard een [Bing Maps](http://www.bing.com/maps/)-satellietbeeld in de editor getoond, maar als je de kaart verschaalt of verplaatst naar andere gebieden, worden nieuwe bronnen getoond. Bepaalde gebieden, zoals Vlaanderen en sommige plaatsen in de Verenigde Staten, Frankrijk en Denemarken hebben beeldmateriaal van zeer hoge kwaliteit.\n\nSoms is het beeldmateriaal ten opzichte van de kaart verschoven door een fout van de leverancier van het beeldmateriaal. Als je ziet dat een heleboel wegen verschoven zijn ten opzichte van de achtergrond, ga deze dan niet meteen allemaal verplaatsen zodat de ligging overeenkomt met de achtergrond. In plaats daarvan kan je het beeldmateriaal aanpassen, zodat de ligging overeenkomt met de bestaande gegevens door op de knop 'Verbeter de ligging' te klikken onderaan de 'Achtergrondinstellingen'.\n",
-            "addresses": "# Adressen\n\nAdressen zijn één van de meest nuttige informatie-elementen voor de kaart.\n\nHoewel adressen vaak als deel van een straat worden weergegeven, worden zij\nin OpenStreetMap vastgelegd als eigenschap van gebouwen en plaatsen langs\nde straten.\n\nJe kan adresgegevens toevoegen aan plaatsen die als gebouwcontouren\nzijn gekarteerd, maar ook aan plaatsen die als een enkel punt zijn gekarteerd.\nDe meest betrouwbare bron voor adresgegevens is een veldonderzoek ter\nplaatse of eigen bekendheid  zoals met ieder ander object is kopiëren uit\ncommerciële bronnen zoals Google Maps strikt verboden.\n",
-            "inspector": "# Inspectie&shy;gereedschap\n\nHet inspectie­gereedschap is het schermelement links op de pagina waarin je de eigenschappen van het geselecteerde element aan kan passen.\n\n### Een objecttype selecteren\n\nNadat je een punt, lijn of vlak hebt toegevoegd, kan je kiezen wat voor soort object het is, bijvoorbeeld een snelweg of woonerf, een supermarkt of een café. Het inspectiegereedschap toont knoppen voor veelvoorkomende objecttypen en je kan andere vinden door een term in het zoekscherm in te vullen.\n\nKlik op de 'i' in de rechterbenedenhoek van een objecttypeknop om meer te weten te komen. Klik op een knop om dat type te selecteren.\n\n### Formulieren gebruiken en tags bewerken\n\nNadat je een objecttype hebt gekozen, of wanneer je een object selecteert dat al een type toegekend heeft gekregen door iemand anders, toont het inspectiegereedschap allerlei eigenschappen van het object, zoals naam en adres.\n\nOnder de getoonde eigenschappen kan je op icoontjes klikken om meer eigenschappen toe te voegen, zoals een link naar het bijhorende Wikipedia-artikel, toegankelijkheid voor rolstoelgebruikers, etc.\n\nOnderaan het inspectiegereedschap klik je op 'Extra tags' om andere tags toe te voegen. [Taginfo](http://taginfo.openstreetmap.org/) biedt een prachtig overzicht om meer te weten te komen over veelgebruikte combinaties van tags.\n\nAanpassingen die je in het inspectiegereedschap maakt, zijn meteen zichtbaar in de kaart. Je kan ze op ieder moment ongedaan maken door op de knop 'Ongedaan maken' te klikken.\n"
+            "help": {
+                "title": "Help",
+                "welcome": "Welkom bij iD, een bewerkingsprogramma voor [OpenStreetMap](https://www.openstreetmap.org/). Met deze applicatie kan je OpenStreetMap updaten vanuit je browser.",
+                "open_data_h": "Open data",
+                "open_data": "Bewerkingen die je op deze kaart maakt, zullen zichtbaar zijn voor iedereen die OpenStreetMap gebruikt. Je bewerkingen kunnen gebaseerd zijn op persoonlijke kennis, waarnemingen ter plaatse, luchtbeelden of foto's op straatniveau. Het kopiëren van informatie van commerciële bronnen, zoals Google Maps, [is ten strengste verboden](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Voor je begint",
+                "before_start": "Je moet vertrouwd zijn met OpenStreetMap en dit bewerkingsprogramma voor je begint met bewerken. iD bevat een rondleiding om je de beginselen van het bewerken van OpenStreetMap te leren. Klik op \"Start de rondleiding\" op het beginscherm om deze handleiding te starten. Het duurt maar een kwartiertje.",
+                "open_source_h": "Open source",
+                "open_source": "iD is een collaboratief opensourceproject. Je gebruikt momenteel versie {version}. De broncode is beschikbaar [op GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Je kunt iD helpen door te [vertalen](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) of door [bugs te rapporteren](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Overzicht",
+                "navigation_h": "Navigatie",
+                "navigation_drag": "Je kan de kaart verslepen door er met de muisaanwijzer over te gaan staan, de {leftclick} linkermuisknop in te drukken, de muis te verschuiven, en de knop pas dan los te laten. Je kan ook de `↓`, `↑`, `←`, `→`  pijltjestoetsen gebruiken op je toetsenbord.",
+                "navigation_zoom": "Je kan in- en uitzoomen door te scrollen met het muiswiel of de touchpad, of met de knoppen {plus} en {minus} naast de kaart. Je kunt ook de toetsen `+` en `-` op je toetsenbord gebruiken. ",
+                "features_h": "Kaartobjecten",
+                "features": "We gebruiken het woord *objecten* als we het over dingen op de kaart hebben, zoals wegen, gebouwen en bezienswaardigheden. Alles wat je in de echte wereld ziet, kan gemapt gemapt worden als object in OpenStreetMap. Objecten op de kaart worden gerepresenteerd als *punten*, *lijnen* of *vlakken*.",
+                "nodes_ways": "In de OpenStreetMap-wereld worden punten normaal *nodes* of knopen genoemd. Lijnen en vlakken worden doorgaans *ways* genoemd. In iD wijken we hier van af."
+            },
+            "editing": {
+                "title": "Bewerken & opslaan",
+                "select_h": "Selecteren",
+                "select_left_click": "Klik met de {leftclick} linkermuisknop op een object om het te selecteren. Het object zal uitgelicht worden met een pulserende gloed en de zijbalk zal details over het object tonen, zoals de naam of het adres.",
+                "select_right_click": "Klik met de {rightclick} rechtermuisknop op een object om het bewerkingsmenu te tonen. Daarin zie je de beschikbare bewerkingen, zoals draaien, verplaatsen en verwijderen. ",
+                "multiselect_h": "Meerdere objecten selecteren",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Houd Shift ingedrukt en klik met de linkermuisknop om meerdere objecten gezamenlijk te selecteren. Dit maakt het gemakkelijker om meerdere objecten te verplaatsen of te verwijderen.",
+                "multiselect_lasso": "Een andere manier om meerdere objecten te selecteren is door de `{shift}`-toets ingedrukt te houden, dan ook de {leftclick} linkermuisknop ingedrukt te houden, en dan een selectielasso te tekenen. Alle punten binnen de lasso worden geselecteerd.",
+                "undo_redo_h": "Ongedaan maken en opnieuw uitvoeren",
+                "undo_redo": "Je aanpassingen worden lokaal opgeslagen in je browser totdat je besluit ze op te slaan op de OpenStreetMap-server. Als je ze nog niet geüpload hebt, kan je bewerkingen ongedaan maken door te klikken op de knop {undo} **Ongedaan maken** en bewerkingen opnieuw uitvoeren met de knop {redo} **Opnieuw uitvoeren**.",
+                "save_h": "Opslaan",
+                "save": "Klik op {save} **Opslaan** om je bewerkingen af te ronden en ze naar de OpenStreetMap-server te sturen. Vergeet niet je werk af en toe op te slaan. Je groepeert je aanpassingen best wat per gebied. Sla niet op elke keer je een object hebt aangepast, dit maakt nakijken vervelend!",
+                "save_validation": "Je krijgt de mogelijkheid om je aanpassingen te herzien. iD zal ook een paar basiscontroles uitvoeren op missende gegevens en kan enkele suggesties en waarschuwingen geven als iets niet in orde lijkt.",
+                "upload_h": "Uploaden",
+                "upload": "Voor je je bewerkingen kan uploaden, moet je een commentaar bij je wijzigingen opgeven, een *[changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments?uselang=nl)*. Klik daarna op **Upload** om je bewerkingen naar OpenStreetMap te sturen. Deze wijzigingen zullen toegevoegd worden aan de kaart en zichtbaar zijn voor iedereen.",
+                "backups_h": "Automatisch lokaal bijhouden",
+                "backups": "Als je niet al je aanpassingen in één keer kunt doen, bijvoorbeeld als je computer crasht of je het tabblad in de browser sluit, zijn je bewerkingen nog steeds opgeslagen in de opslag van je browser. Je kan later terugkomen (met dezelfde browser en computer) en iD zal je aanbieden je aanpassingen te herstellen.",
+                "keyboard_h": "Sneltoetsen",
+                "keyboard": "Je kan een lijst met opdrachten samen met hun toetsenbordkoppelingen bekijken door op de toets `?` te drukken."
+            },
+            "feature_editor": {
+                "title": "Objectbewerker",
+                "intro": "De *objectbewerker* verschijnt naast de kaart en laat je alle informatie over het geselecteerde object zien en bewerken.",
+                "definitions": "Het bovenste gedeelte laat het type van het object zien. Het midden toont *velden* die de eigenschappen van het object tonen, zoals zijn naam en adres.",
+                "type_h": "Objecttype",
+                "type": "Je kunt op het objecttype klikken om het object te wijzigen in een ander type. Alles dat bestaat in de echte wereld kan aan OpenStreetMap toegevoegd worden. Er zijn dus duizenden objecttypes om uit te kiezen.",
+                "type_picker": "De typezoeker toont de meest voorkomende objecttypes, zoals parken, ziekenhuizen, restaurants, wegen en gebouwen. Je kan naar types zoeken door in de zoekbalk te typen. Klik op het \"{inspect} **Info**\"-icoontje naast het objecttype om meer uitleg te krijgen over het type.",
+                "fields_h": "Velden",
+                "fields_all_fields": "Het gedeelte \"Alle velden\" bevat alle details over een object die je zou kunnen bewerken. Alle velden zijn optioneel in OpenStreetMap, het is dus oké om een veld leeg te laten als je twijfelt of als het niet van toepassing lijkt.",
+                "fields_example": "Elk objecttype zal andere velden tonen. Een weg zal bijvoorbeeld velden laten zien over het type wegdek en de snelheidslimiet, maar een restaurant zal velden laten zien over de openingstijden en het type eten dat er geserveerd wordt.",
+                "fields_add_field": "Je kunt ook in het \"Voeg eigenschap toe\"-veld klikken om meer velden toe te voegen, zoals een beschrijving, Wikipedia-link en rolstoeltoegankelijkheidsinfo.",
+                "tags_h": "Tags",
+                "tags_all_tags": "Onder het velden gedeelte kun je het \"Alle tags\"-gedeelte uitklappen om de OpenStreetMap-*tags* voor het geselecteerde object te bekijken en bewerken. Elke tag bestaat uit een *sleutel* (Engels: *key*) en een *waarde*, die de echte waarden zijn die opgeslagen in OpenStreetMap. Een punt dat je in iD aanduidt als \"Restaurant\" met naam \"De Gouden Lepel\" is slechts een abstractie voor een node met de tags `amenity`=`restaurant` en `name`=`De Gouden Lepel`.",
+                "tags_resources": "Voor het bewerken van de tags van een object heb je wat meer kennis nodig van OpenStreetMap. Je moet de [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) raadplegen om te leren over tagging in OpenStreetMap. Op [Taginfo](https://taginfo.openstreetmap.org/) kan je statistieken zien over hoeveel keer elke tag momenteel in OpenStreetMap gebruikt wordt."
+            },
+            "points": {
+                "title": "Punten",
+                "intro": "Punten kunnen gebruikt worden om objecten zoals winkels, restaurants en monumenten weer te geven. Ze geven een specifieke locatie aan en beschrijven wat daar is.",
+                "add_point_h": "Punten toevoegen",
+                "add_point": "Om een punt toe te voegen, klik je op de \"{point} **Punt**\"-knop in de werkbalk boven de kaart, of gebruik je de sneltoets `1`. De muisaanwijzer verandert in een kruissymbool.",
+                "add_point_finish": "Zet de muisaanwijzer op de plaats waar het punt moet komen, en klik met de {leftclick} linkermuisknop, of druk op `Space`.",
+                "move_point_h": "Punten verplaatsen",
+                "move_point": "Om een punt te verplaatsen, plaats je de cursor van de muis op het punt, druk je de {leftclick} linkermuisknop in, verschuif je de muis om het punt naar de nieuwe locatie te slepen, en laat je de knop vervolgens los.",
+                "delete_point_h": "Punten verwijderen",
+                "delete_point": "Objecten die niet in het echt bestaan, kan je verwijderen. Een object in OpenStreetMap verwijderen haalt het van de kaart voor iedereen ter wereld. Let dus goed op dat een object echt weg is voor je het verwijdert.",
+                "delete_point_command": "Om een punt te verwijderen, klik je met de {rightclick} rechtermuisknop op het punt om het te selecteren en het bewerkmenu te tonen. Gebruik dan het \"{delete} **Verwijder**\"-commando."
+            },
+            "lines": {
+                "title": "Lijnen",
+                "intro": "*Lijnen* worden gebruikt om objecten zoals wegen, spoorwegen en rivieren voor te stellen. Lijnen worden getekend in het midden van het object dat ze representeren.",
+                "add_line_h": "Lijnen toevoegen",
+                "add_line": "Om een lijn toe te voegen, klik je op de \"{line} **Lijn**\"-knop in de werkbalk boven de kaart, of gebruik je de sneltoets `2`. De muisaanwijzer verandert in een kruissymbool.",
+                "add_line_draw": "Positioneer daarna de muisaanwijzer op de plaats waar de lijn moet beginnen en klik met de {leftclick} linkermuisknop of gebruik `Space` om te beginnen met het plaatsen van knooppunten langs de lijn. Plaats meer knooppunten op dezelfde manier. Tijdens het tekenen kan je inzoomen of de kaart verschuiven om gedetailleerder te kunnen werken.",
+                "add_line_finish": "Om een lijn af te ronden, klik je nogmaals op het laatste knooppunt of druk je op de toets `{return}`.",
+                "modify_line_h": "Lijnen aanpassen",
+                "modify_line_dragnode": "Je zal vaak lijnen zien die niet correct gevormd zijn, bijvoorbeeld een weg die niet overeenkomt met de achterliggende luchtfoto's. Om de vorm van de lijn aan te passen selecteer je eerst de lijn met de {leftclick} linkermuisknop. Alle knooppunten van de lijn worden nu getoond als kleine cirkels. Je kunt de knooppunten verslepen naar betere locaties.",
+                "modify_line_addnode": "Je kan ook nieuwe knooppunten toevoegen door {leftclick}**x2** te dubbelklikken op de lijn of door de kleine driehoekjes tussen de knooppunten te verslepen.",
+                "connect_line_h": "Lijnen verbinden",
+                "connect_line": "Correcte verbindingen tussen wegen is belangrijk voor de kaart en essentieel voor routebeschrijvingen.",
+                "connect_line_display": "De verbindingen tussen wegen zijn getekend als grijze cirkels. De eindpunten van een lijn zijn getekend als grotere, witte cirkels als ze nergens mee verbonden zijn.",
+                "connect_line_drag": "Om een lijn te verbinden met een ander object, sleep je een van de knooppunten van de lijn op het andere object totdat beide objecten samenklitten. Tip: je kan de `{alt}`-toets ingedrukt houden om te voorkomen dat knooppunten verbinden met andere objecten.",
+                "connect_line_tag": "Verkeerslichten of oversteekplaatsen markeer je bij voorkeur op een knooppunt op hun echte plaats in de weg, door eerst een knooppunt toe te voegen, het te selecteren en vervolgens in de objectbewerker het juiste type te kiezen. Als je de echte positie niet kan bepalen, kan je in de plaats daarvan het toevoegen op knooppunt dat de twee lijnen verbindt.",
+                "disconnect_line_h": "Lijnen losmaken",
+                "disconnect_line_command": "Om een lijn van een ander object los te maken, klik je met de {rightclick} rechtermuisknop op het verbindende knooppunt en selecteer je {disconnect} **Maak los**.",
+                "move_line_h": "Lijnen verplaatsen",
+                "move_line_command": "Om een lijn in zijn geheel te verplaatsen, klik je er met de {rightclick} rechtermuisknop op en selecteer je {move} **Verschuif**. Verplaats vervolgens de muis en klik met de {leftclick} linkermuisknop om de lijn op de nieuwe locatie te plaatsen.",
+                "move_line_connected": "Lijnen die verbonden zijn met andere objecten zullen verbonden blijven wanneer je de lijn verplaatst naar een nieuwe locatie. iD kan voorkomen dat je een lijn verplaatst over een andere verbonden lijn.",
+                "delete_line_h": "Lijnen verwijderen",
+                "delete_line": "Als een lijn volledig incorrect is, bijvoorbeeld een weg die niet bestaat in de echte wereld, dan kan je haar verwijderen. Wees voorzichtig wanneer je objecten verwijdert: de luchtbeelden die je gebruikt zijn enkele maanden of jaren oud en een weg die onjuist lijkt, kan later aangelegd zijn.",
+                "delete_line_command": "Lijnen verwijderen werkt identiek als punten verwijderen."
+            },
+            "areas": {
+                "title": "Vlakken",
+                "intro": "*Vlakken* worden gebruikt om de grenzen van objecten als meren, gebouwen en woonwijken aan te duiden. Vlakken worden getekend langs de rand van het object dat ze representeren, bijvoorbeeld rond de basis van een gebouw.",
+                "point_or_area_h": "Punten of vlakken?",
+                "point_or_area": "Veel objecten kunnen worden gerepresenteerd worden als punt of vlak. Je voegt gebouwen en gebieden toe als vlakken wanneer dit mogelijk is.\n\nEr is geen internationale consensus over hoe bedrijven, voorzieningen en andere objecten binnen een gebouw gerepresenteerd moeten worden: op het vlak dat het gebouw voorsteld of als apart punt. Als je zoiets nieuw toevoegt, teken het dan als een punt binnen het gebouw. Als het object al in OpenStreetMap op het gebouw stond, verander het dan niet zomaar naar een apart punt.",
+                "add_area_h": "Vlakken toevoegen",
+                "add_area_command": "Om een punt toe te voegen, klik je op de \"{area} **Vlak**\"-knop in de \nwerkbalk boven de kaart, of gebruik je de sneltoets `3`. De \nmuisaanwijzer verandert in een kruissymbool.",
+                "add_area_draw": "Teken vervolgens de knooppunten van het vlak net zoals bij een lijn.",
+                "add_area_finish": "Om een vlak te voltooien, klik je nogmaals op de laatste node of druk je op `{return}`.",
+                "square_area_h": "Hoeken haaks maken",
+                "square_area_command": "Veel vlakken, zoals gebouwen, hebben in het echt zo goed als loodrechte hoeken. Om de hoeken van een vlak haaks te maken, klik je er met de {rightclick} rechtermuisknop op en selecteer je {orthogonalize} **Maak hoeken recht**.",
+                "modify_area_h": "Vlakken aanpassen",
+                "modify_area_dragnode": "Je zult vaak vlakken zien die niet correct gevormd zijn, bijvoorbeeld een gebouw dat niet overeenkomt met de achterliggende luchtbeelden.",
+                "modify_area_addnode": "De vorm van een vlak aanpassen werkt identiek zoals de vorm van een lijn aanpassen.",
+                "delete_area_h": "Vlakken verwijderen",
+                "delete_area": "Als een vlak volledig incorrect is, bijvoorbeeld een gebouw dat niet bestaat in de echte wereld, dan is het OK om het vlak te verwijderen. Wees voorzichtig wanneer je objecten verwijdert: de luchtbeelden die je gebruikt zijn enkele maanden of jaren oud, en een gebouw dat onjuist lijkt, kan later gebouwd zijn.",
+                "delete_area_command": "Vlakken verwijderen werkt identiek als punten verwijderen."
+            },
+            "relations": {
+                "title": "Relaties",
+                "intro": "Een *relatie* is een speciaal soort object in OpenStreetMap dat andere objecten groepeert. De objecten die tot een relatie behoren worden haar *leden* genoemd (Engels: *members*) en elk lid kan een *rol* hebben in de relatie.",
+                "edit_relation_h": "Relaties bewerken",
+                "edit_relation": "Onderaan de objectbewerker kan je het \"Alle relaties\"-gedeelte uitklappen om te zien of het geselecteerde object lid is van een relatie. Je kunt vervolgens op de relatie klikken om de relatie te selecteren en te bewerken.",
+                "edit_relation_add": "Om een object aan een relatie toe te voegen, selecteer je het object en klik je op de {plus}-knop in het \"Alle relaties\"-gedeelte van de objectbewerker. Je kan nu kiezen uit een lijst van relaties in de buurt of een nieuwe maken met de optie \"Nieuwe relatie …\"",
+                "edit_relation_delete": "Met de \"{delete} **Verwijder**\"-knop verwijder je het geselecteerde object uit een relatie. Wanneer je alle leden van een relatie verwijdert, zal de relatie automatisch ook verwijderd worden.",
+                "maintain_relation_h": "Relaties onderhouden",
+                "maintain_relation": "Over het algemeen zal iD automatisch relaties onderhouden wanneer je bewerkingen uitvoert. Wees voorzichtig wanneer je objecten vervangt die onderdeel kunnen zijn van een relatie. Bijvoorbeeld als je een deel van een weg verwijdert en een nieuw deel tekent om het te vervangen, zal je het nieuwe deel moeten toevoegen aan dezelfde relaties (routes, afslagbeperkingen, enz.) als het origineel.",
+                "relation_types_h": "Relatietypes",
+                "multipolygon_h": "Multipolygonen",
+                "multipolygon": "Een *multipolygoon*-relatie is een groep van een of meer buitenrandvlakken (rol *outer*) en nul of meer binnenrandvlakken (rol *inner*). De buitenranden definiëren de buitenste contouren van de multipolygoon. De binnenranden definiëren gaten binnen de multipolygoon.",
+                "multipolygon_create": "Om een multipolygoon aan te maken, bijvoorbeeld een gebouw met een binnenplaats, teken je de buitenste contouren en de binnenste contouren als aparte vlakken. `{shift}`+{leftclick} Klik daarna met de linkermuisknop om beide objecten te selecteren, klik met de {rightclick} rechtermuisknop op een van hen, en klik op {merge} **Voeg samen**.",
+                "multipolygon_merge": "Het samenvoegen van meerdere lijnen of vlakken creëert een nieuwe multipolygoonrelatie met alle geselecteerde objecten als leden. iD zal automatisch de inner- en outer-rollen kiezen, gebaseerd op het al dan niet binnen een ander object liggen.",
+                "turn_restriction_h": "Afslagbeperkingen",
+                "turn_restriction": "Een *afslagbeperkings*relatie is een groep van verschillende wegsegmenten op een kruispunt. Aflsagbeperkingen bestaan uit een *van*-weg, *via*-knooppunten of -wegen en een *naar*-weg.",
+                "turn_restriction_field": "Om afslagbeperkingen te bewerken, selecteer je een kruispunt-knooppunt waar twee of meer wegen bij elkaar komen. De objectbewerker zal een speciaal veld \"afslagbeperkingen\" tonen met een model van de kruising.",
+                "turn_restriction_editing": "In dat veld kan je een \"van\"-weg selecteren door erop te klikken. Vervolgens kan je zien of afslaan toegestaan is tot elke mogelijke \"naar\"-weg. Je kan op de icoontjes klikken om te kiezen tussen toegestaan en verboden. iD zal automatisch de nodige relaties aanmaken of verwijderen en de *from*-, *via*- en *to*-rollen instellen op basis van jouw keuzes.",
+                "route_h": "Routes",
+                "route": "Een *route*-relatie is een groep van een of meerdere lijnen die samen een routenetwerk vormen, zoals een bus- of treintraject of een snelweg.",
+                "route_add": "Om een object aan een routerelatie toe te voegen, selecteer je het object en klik je op de {plus}-knop in het \"Alle relaties\"-gedeelte van de objectbewerker. Je kan nu kiezen uit een lijst van relaties in de buurt of een nieuwe aanmaken met \"Nieuwe relatie …\"",
+                "boundary_h": "Grenzen",
+                "boundary": "Een of *grens*-relatie (Engels: *boundary*) is een groep van een of meerdere lijnen die samen een administratieve grens vormen.",
+                "boundary_add": "Om een object aan een grensrelatie toe te voegen, selecteer je het \nobject en klik je op de {plus}-knop in het \"Alle relaties\"-gedeelte van \nde objectbewerker. Je kan nu kiezen uit een lijst van relaties in de \nbuurt of een nieuwe aanmaken met \"Nieuwe relatie …\""
+            },
+            "imagery": {
+                "title": "Achtergrondbeelden",
+                "intro": "Het achtergrondbeeld dat onder de kaartdata verschijnt, is een belangrijke bron voor het karteren. Deze beelden kunnen luchtfoto's zijn van satellieten, vliegtuigen en drones, het kunnen ingescande historische kaarten zijn of andere vrij beschikbare brondata.",
+                "sources_h": "Achtergrondbronnen",
+                "choosing": "Om te zien welke bronnen beschikbaar zijn voor het bewerken, klik je op de knop {layers} **Achtergrondinstellingen** naast de kaart.",
+                "sources": "Standaard wordt een luchtfotolaag gekozen afhankelijk van de locatie op de kaart waar iD opgestart werd. De Bing Maps-satellietfotolaag is wereldwijd de terugvalkeuze. Het is vaak nuttig te kijken welke achtergrond de beste is voor het gebied dat je bewerkt: sommige bronnen kunnen recenter of van hogere resolutie zijn.",
+                "offsets_h": "Verplaatsing van luchtfoto aanpassen",
+                "offset": "Achtergrondbeelden kunnen soms vrij zwaar in positie afwijken van de correcte locatie. Als je veel gebouwen of wegen ziet die verschoven liggen ten opzichte van de achtergrond, kan het zijn dat de achtergrond incorrect is, en niet de kaart. Verplaats dus niet alle objecten om ze te overeen te laten komen met de achtergrond. Verplaats in plaats daarvan de achtergrond, zodat deze overeenkomt met de kaartgegevens. Dit doe je door het gedeelte \"Verplaatsing van luchtfoto aanpassen\" onderin het achtergrondinstellingenpaneel uit te klappen.",
+                "offset_change": "Klik op de kleine driehoeken om de verplaatsing van de achtergrond in kleine stappen aan te passen. Je kan ook de linkermuisknop ingedrukt houden en de achtergrond verslepen in het grijze vlak."
+            },
+            "streetlevel": {
+                "title": "Foto's op straatniveau",
+                "intro": "Foto's op straatniveau zijn nuttig voor het in kaart brengen van verkeersborden, bedrijven en andere details die niet zichtbaar zijn op luchtfoto's. iD ondersteunt dergelijke foto's van [Mapillary](https://www.mapillary.com) en [OpenStreetCam](https://www.openstreetcam.org). Gebruik nooit Google Streetview, de wettelijke consequenties daarvan zijn namelijk niet duidelijk.",
+                "using_h": "Foto's op straatniveau gebruiken",
+                "using": "Om foto's op straatniveau te gebruiken, klik je op {data} **Kaartgegevens** naast de kaart om het betreffende paneel te openen. Daar kan je beschikbare foto lagen aan of uit te zetten.",
+                "photos": "Als je de fotolaag aanzet, worden lijnen langs fotoreeksen getoond. Wanneer je meer inzoomt, wordt op elke fotolocatie een cirkel getoond. Na nog meer inzoomen wordt een kegel zichtbaar die de richting van de camera aangeeft op het moment dat de foto gemaakt werd (maar die is vaak onnauwkeurig).",
+                "viewer": "Wanneer je op een fotolocatie klikt, verschijnt er een fotopaneel in een benedenhoek van de kaart. Dat paneel bevat bedieningselementen om vooruit en achteruit te gaan in de reeks van foto's. Het toont ook de gebruikersnaam van de maker van de foto, de datum van vastlegging, en een link naar de originele foto op de website."
+            },
+            "gps": {
+                "title": "GPS-tracks",
+                "intro": "Verzamelde GPS-tracks zijn een waardevolle bron voor OpenStreetMap. In iD kan je *.gpx*-, *.geojson*-, and *.kml*-bestanden openen die lokaal op je computer staan. Je kan GPS-tracks verzamelen met een smartphone, sporthorloge of een ander GPS-apparaat.",
+                "survey": "Voor informatie over het uitvoeren van een GPS-meting, kan je dit Engelstalige artikel lezen: [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "GPS-tracks gebruiken",
+                "using": "Om een GPS-track te gebruiken voor het bewerken, sleep je een bestand naar dit kaartbewerkingsprogramma. Als het herkend wordt, zal het getekend worden als een heldere paarse lijn. Open het \"{data} **Kaartgegevens**\"-paneel naast de kaart om je GPS-data aan of uit te zetten of er op in te zoomen.",
+                "tracing": "De GPS-track wordt niet automatisch verzonden naar OpenStreetMap. De beste manier om het te gebruiken is als referentie voor nieuwe objecten die je toevoegt.",
+                "upload": "Je kan ook [je GPS-data uploaden naar OpenStreetMap](https://www.openstreetmap.org/trace/create) zodat andere gebruikers hen ook kunnen gebruiken."
+            }
         },
         "intro": {
-            "done": "klaar",
+            "done": "Klaar",
             "ok": "Oké",
             "graph": {
                 "block_number": "<value for addr:block_number>",
                     "marina-park": "Jachthavenpark",
                     "market-street": "Marktstraat",
                     "memory-isle-park": "Achtmeipark",
-                    "memory-isle": "Achtmeistraat",
+                    "memory-isle": "Achtmei-land",
                     "michigan-avenue": "Muntstraat",
                     "middle-street": "Arenbergstraat",
                     "millard-street": "Begijnenstraat",
                 "drag": "De grote kaart toont de OpenStreetMap-gegevens bovenop een achtergrond.{br}Net zoals bij elke online kaart kan je navigeren door met de linkermuisknop in de kaart te klikken en de muis te verschuiven terwijl je die knop ingedrukt houdt. **Versleep de kaart!**",
                 "zoom": "Je kan in- en uitzoomen door te scrollen met het muiswiel of de touchpad, of met de knoppen {plus} en {minus}. **Zoom in of uit!**",
                 "features": "We gebruiken het woord *objecten* als we het over dingen op de kaart hebben. Alles wat je in de echte wereld ziet, kan gemapt gemapt worden als object in OpenStreetMap.",
-                "points_lines_areas": "Kaartobjecten worden voorgesteld door *punten, lijnen of vlakken*.",
+                "points_lines_areas": "Kaartobjecten worden voorgesteld door *punten*, *lijnen* of *vlakken*.",
                 "nodes_ways": "In OpenStreetMap worden punten ook wel *nodes* genoemd, en lijnen en vlakken worden ook wel *ways* genoemd.",
                 "click_townhall": "Elk object op de kaart kan je selecteren door er op te klikken. **Klik op het punt om het te selecteren.**",
                 "selected_townhall": "Fantastisch! Het punt is nu geselecteerd. Rond geselecteerde objecten komt een pulserende gloed.",
             },
             "points": {
                 "title": "Punten",
-                "add_point": "*Punten* kunnen gebruikt worden om objecten zoals winkels, restaurants en monumenten voor te stellen.{br}Ze markeren een bepaalde locatie aan en beschrijven wat daar is. **Klik op de knop \"{button} Punt\" om een nieuw punt toe te voegen.**",
-                "place_point": "Als je een nieuw punt op de kaart wil zetten, zet dan je muisaanwijzer op de plaats waar het moet komen, en klik of druk op de spatiebalk. **Verplaats de muisaanwijzer tot boven dit gebouw, en klik of druk op de spatiebalk.**",
+                "add_point": "*Punten* kunnen gebruikt worden om objecten zoals winkels, restaurants en monumenten voor te stellen.{br}Ze duiden een bepaalde locatie aan en beschrijven wat daar is. **Klik op de knop \"{button} Punt\" om een nieuw punt toe te voegen.**",
+                "place_point": "Als je een nieuw punt op de kaart wil zetten, zet dan je muisaanwijzer op de plaats waar het moet komen, en klik of druk op de spatiebalk. **Verplaats de muisaanwijzer tot boven dit gebouw, en klik, of druk op de spatiebalk.**",
                 "search_cafe": "Er zijn veel soorten objecten die voorgesteld kunnen worden door punten. Het punt dat je net toegevoegd hebt, is een cafetaria. **Zoek naar '{preset}'.**",
                 "choose_cafe": "**Kies {preset} uit de lijst.**",
                 "feature_editor": "Het punt wordt nu aangeduid als een cafetaria. Gebruik de objectbewerker om meer informatie toe te voegen over de cafetaria.",
             "areas": {
                 "title": "Vlakken",
                 "add_playground": "*Vlakken* worden gebruikt om de grenzen van objecten als meren, gebouwen en woonwijken te tonen.{br}Ze kunnen ook gebruikt worden voor het meer gedetailleerd in kaart brengen van veel objecten die je anders als punten zou toevoegen. **Klik op de knop \"{button} Vlak\" om een nieuw vlak toe te voegen.**",
-                "start_playground": "Laten we deze speeltuin intekenen als een vlak. Vlakken worden gemaakt door *knooppunten* aan hun omtrek te zetten. **Klik of druk op de spatiebalk om het eerste knooppunt in een van de hoeken van het speelplein te zetten.**",
+                "start_playground": "Laten we deze speeltuin intekenen als een vlak. Vlakken worden gemaakt door *knooppunten* aan hun omtrek te zetten. **Klik, of druk op de spatiebalk, om het eerste knooppunt in een van de hoeken van het speelplein te zetten.**",
                 "continue_playground": "Teken het vlak verder door meer knooppunten op de omtrek van de \nspeeltuin te zetten.{br}Tip: Je kan de {alt}-toets indrukken terwijl je \neen knooppunt zet om te vermijden dat ze verbinden met andere objecten. **Ga door met het tekenen van het vlak voor de speeltuin.**",
                 "finish_playground": "Sluit het vlak door op enter te drukken, of opnieuw te klikken op het eerste of het laatste knooppunt. **Sluit het vlak voor de speeltuin.**",
                 "search_playground": "**Zoek naar '{preset}'.**",
                 "choose_preset_residential": "Er zijn veel soorten wegen, maar dit is een straat. **Kies {preset}.**",
                 "retry_preset_residential": "Je hebt niet het {preset}-type geselecteerd. **Klik hier om opnieuw te kiezen.**",
                 "name_road": "**Geef deze weg een naam, en sluit dan de objectbewerker met escape, enter, of de {button}-knop.**",
-                "did_name_road": "Ziet er goed uit! Nu zullen de vorm van een lijn leren veranderen.",
+                "did_name_road": "Ziet er goed uit! Nu zullen we de vorm van een lijn leren veranderen.",
                 "update_line": "Soms moet je de vorm van een bestaande lijn veranderen. Hier heb je een straat die niet helemaal goed ingetekend is.",
                 "add_node": "We kunnen wat knooppunten toevoegen om de vorm te verbeteren. Een manier om dat te doen is door te dubbelklikken op de lijn op de plaats waar je een knooppunt wil toevoegen. **Dubbelklik op de lijn om een nieuw knooppunt toe te voegen.**",
                 "start_drag_endpoint": "Als een lijn geselecteerd is, kan je haar knooppunten verslepen. **Versleep het eindpunt van de lijn naar het kruispunt op de achtergrondafbeelding.**",
             },
             "startediting": {
                 "title": "Begin met aanpassen",
-                "help": "Je bent nu klaar om OpenStreetMap te bewerken!{br}Je kan deze rondleiding steeds opnieuw volgen en meer documentatie bekijken door op de knop \"{button} Hulp\" te klikken of de toets '{toets}' te drukken.",
-                "shortcuts": "U kunt een lijst met opdrachten samen met hun toetsenbordkoppelingen bekijken door op de toets '{toets}' te drukken.",
-                "save": "Vergeet niet om je aanpassingen regelmatig op te slaan!",
+                "help": "Je bent nu klaar om OpenStreetMap te bewerken!{br}Je kan deze rondleiding steeds opnieuw volgen en meer documentatie bekijken door op de knop \"{button} Hulp\" te klikken of op de toets '{toets}' te drukken.",
+                "shortcuts": "Je kan een lijst met opdrachten samen met hun toetsenbordkoppelingen bekijken door op de toets '{toets}' te drukken.",
+                "save": "Sla je aanpassingen regelmatig op, bijvoorbeeld als je klaar bent in een bepaald gebied!",
                 "start": "Karteer de wereld!"
             }
         },
                 },
                 "help": {
                     "title": "Hulp",
-                    "help": "Toon hulp/documentatie",
+                    "help": "Hulp/documentatie tonen",
                     "keyboard": "Sneltoetsen tonen"
                 },
                 "display_options": {
                     "background": "Achtergrondopties tonen",
                     "background_switch": "Naar laatstgebruikte achtergrond wisselen",
                     "map_data": "Opties voor kaartgegevens tonen",
-                    "fullscreen": "Gebruik volledig scherm",
+                    "fullscreen": "Volledig scherm gebruiken",
                     "wireframe": "Wireframemodus aan/uit",
                     "minimap": "Minikaartje aan/uit"
                 },
                     "title": "Objecten selecteren",
                     "select_one": "Eén object selecteren",
                     "select_multi": "Meerdere objecten selecteren",
-                    "lasso": "Objecten selecteren met lasso"
+                    "lasso": "Objecten selecteren met lasso",
+                    "search": "Objecten zoeken"
                 },
                 "with_selected": {
                     "title": "Met object geselecteerd",
                 "title": "Gereedschappen",
                 "info": {
                     "title": "Informatie",
-                    "all": "Schakel alle informatiepanelen in of uit",
-                    "background": "Schakel het achtergrondpaneel in of uit",
-                    "history": "Schakel het geschiedenispaneel in of uit",
-                    "location": "Schakel het locatiepaneel in of uit",
-                    "measurement": "Schakel het meetpaneel in of uit"
+                    "all": "Alle informatiepanelen open/dicht",
+                    "background": "Achtergrondpaneel open/dicht",
+                    "history": "Geschiedenispaneel open/dicht",
+                    "location": "Locatiepaneel open/dicht",
+                    "measurement": "Meetpaneel open/dicht"
                 }
             }
         },
                         "hamlet": "Gehucht",
                         "housename": "Huisnaam",
                         "housenumber": "123",
-                        "housenumber!jp": "Gebouwnummer/Lotnummer",
+                        "housenumber!jp": "Gebouwnummer/Perceelnummer",
                         "neighbourhood": "Buurt",
                         "neighbourhood!jp": "Chōme/Aza/Koaza",
                         "place": "Plaats",
                 "aeroway": {
                     "label": "Type"
                 },
+                "agrarian": {
+                    "label": "Producten"
+                },
                 "amenity": {
                     "label": "Type"
                 },
                 "board_type": {
                     "label": "Type"
                 },
+                "boules": {
+                    "label": "Type"
+                },
                 "boundary": {
                     "label": "Type"
                 },
                 "brand": {
                     "label": "Merk"
                 },
+                "brewery": {
+                    "label": "Brouwerijen waarvan bier beschikbaar"
+                },
                 "bridge": {
                     "label": "Type",
                     "placeholder": "Standaard"
                 "bunker_type": {
                     "label": "Type"
                 },
+                "cables": {
+                    "label": "Kabels onder elektrische spanning",
+                    "placeholder": "1, 2, 3 …"
+                },
                 "camera/direction": {
                     "label": "Richting (in graden met de klok mee)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "Capaciteit",
                     "placeholder": "50, 100, 200 …"
                 },
-                "cardinal_direction": {
-                    "label": "Richting",
-                    "options": {
-                        "E": "Oost",
-                        "ENE": "Oostnoordoost",
-                        "ESE": "Oostzuidoost",
-                        "N": "Noord",
-                        "NE": "Noordoost",
-                        "NNE": "Noordnoordoost",
-                        "NNW": "Noordnoordwest",
-                        "NW": "Noordwest",
-                        "S": "Zuid",
-                        "SE": "Zuidoost",
-                        "SSE": "Zuidzuidoost",
-                        "SSW": "Zuidzuidwest",
-                        "SW": "Zuidwest",
-                        "W": "West",
-                        "WNW": "Westnoordwest",
-                        "WSW": "Westzuidwest"
-                    }
-                },
                 "castle_type": {
                     "label": "Type"
                 },
-                "clock_direction": {
-                    "label": "Richting",
-                    "options": {
-                        "anticlockwise": "Tegenwijzerzin",
-                        "clockwise": "Wijzerzin"
-                    }
-                },
                 "clothes": {
                     "label": "Kleren"
                 },
                 "craft": {
                     "label": "type"
                 },
+                "crane/type": {
+                    "label": "Kraantype",
+                    "options": {
+                        "floor-mounted_crane": "Vaste kraan",
+                        "portal_crane": "Portaalkraan",
+                        "travel_lift": "Schepenlift"
+                    }
+                },
                 "crop": {
                     "label": "Gewassen"
                 },
                 "description": {
                     "label": "Omschrijving"
                 },
+                "devices": {
+                    "label": "Aantal apparaten",
+                    "placeholder": "1, 2, 3 …"
+                },
                 "diaper": {
                     "label": "Luierverschoning mogelijk"
                 },
+                "direction": {
+                    "label": "Richting (graden met de klok mee)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Richting",
+                    "options": {
+                        "E": "Oost",
+                        "ENE": "Oostnoordoost",
+                        "ESE": "Oostzuidoost",
+                        "N": "Noord",
+                        "NE": "Noordoost",
+                        "NNE": "Noordnoordoost",
+                        "NNW": "Noordnoordwest",
+                        "NW": "Noordwest",
+                        "S": "Zuid",
+                        "SE": "Zuidoost",
+                        "SSE": "Zuidzuidoost",
+                        "SSW": "Zuidzuidwest",
+                        "SW": "Zuidwest",
+                        "W": "West",
+                        "WNW": "Westnoordwest",
+                        "WSW": "Westzuidwest"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Richting",
+                    "options": {
+                        "anticlockwise": "Tegen de klok in",
+                        "clockwise": "Met de klok mee"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Richting",
+                    "options": {
+                        "backward": "Achterwaarts",
+                        "both": "Beide / Alle",
+                        "forward": "Voorwaarts"
+                    }
+                },
                 "display": {
                     "label": "Weergave"
                 },
                         "green": "Tussen het groen",
                         "lane": "Op straat",
                         "parking_lot": "Parkeerplaats",
-                        "sidewalk": "Stoep"
+                        "sidewalk": "Trottoir"
                     }
                 },
                 "fire_hydrant/type": {
                         "wall": "Muur"
                     }
                 },
+                "fitness_station": {
+                    "label": "Toesteltype"
+                },
                 "fixme": {
                     "label": "Repareer me"
                 },
                     "label": "Type",
                     "placeholder": "Standaard"
                 },
+                "frequency": {
+                    "label": "Frequentie"
+                },
                 "fuel": {
                     "label": "Brandstof"
                 },
                 "generator/type": {
                     "label": "Type"
                 },
+                "government": {
+                    "label": "Type"
+                },
                 "grape_variety": {
                     "label": "Druivensoorten"
                 },
                     "label": "Trapleuning"
                 },
                 "hashtags": {
+                    "label": "Voorgestelde hashtags",
                     "placeholder": "#voorbeeld"
                 },
                 "healthcare": {
                 "memorial": {
                     "label": "Type"
                 },
-                "milestone_position": {
-                    "label": "Mijlpaalpositie",
-                    "placeholder": "Afstand tot op één cijfer na de komma (123.4)"
+                "monitoring_multi": {
+                    "label": "Gemeten waarden"
                 },
                 "mtb/scale": {
                     "label": "Mountainbike-moeilijkheidsgraad",
                 "oneway": {
                     "label": "Eenrichtingsverkeer",
                     "options": {
+                        "alternating": "Afwisselend",
                         "no": "Nee",
+                        "reversible": "Omkeerbaar",
                         "undefined": "Aangenomen dat het Nee is",
                         "yes": "Ja"
                     }
                 "oneway_yes": {
                     "label": "Eenrichtingsverkeer",
                     "options": {
+                        "alternating": "Afwisselend",
                         "no": "Nee",
+                        "reversible": "Omkeerbaar",
                         "undefined": "Aangenomen dat het Ja is",
                         "yes": "Ja"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5 …"
                 },
-                "parallel_direction": {
-                    "label": "Richting",
-                    "options": {
-                        "backward": "Achteruit t.o.v. richting in OSM",
-                        "forward": "Vooruit t.o.v. richting in OSM"
-                    }
-                },
                 "park_ride": {
-                    "label": "Parkeren en Reizen"
+                    "label": "Park & Ride (parkeren en ander vervoersmiddel nemen)"
                 },
                 "parking": {
                     "label": "Type",
                 "payment_multi": {
                     "label": "Betalingsmiddelen"
                 },
+                "phases": {
+                    "label": "Fasen",
+                    "placeholder": "1, 2, 3 …"
+                },
                 "phone": {
                     "label": "Telefoonnummer",
                     "placeholder": "+31 42 123 4567"
                 "railway": {
                     "label": "Type"
                 },
-                "recycling_accepts": {
-                    "label": "Aanvaardt"
+                "railway/position": {
+                    "label": "Afstand op hectometerpaaltje",
+                    "placeholder": "Tot op één decimaal (123.4)"
                 },
-                "recycling_type": {
-                    "label": "Recyclage-infrastructuur",
+                "railway/signal/direction": {
+                    "label": "Richting",
                     "options": {
-                        "centre": "Milieupark/Containerpark",
-                        "container": "Container"
+                        "backward": "Achterwaarts",
+                        "both": "Beide / Alle",
+                        "forward": "Voorwaarts"
                     }
                 },
+                "rating": {
+                    "label": "Maximaal vermogen in VA"
+                },
+                "recycling_accepts": {
+                    "label": "Aanvaardt"
+                },
                 "ref": {
                     "label": "Referentiecode"
                 },
+                "ref/isil": {
+                    "label": "ISIL-referentiecode"
+                },
                 "ref_aeroway_gate": {
                     "label": "Poortnummer"
                 },
                     },
                     "placeholder": "Onbekend"
                 },
+                "structure_waterway": {
+                    "label": "Constructie",
+                    "options": {
+                        "tunnel": "Tunnel"
+                    },
+                    "placeholder": "Onbekend"
+                },
                 "studio": {
                     "label": "Type"
                 },
+                "substance": {
+                    "label": "Substantie"
+                },
                 "substation": {
                     "label": "Type"
                 },
                 "surveillance/zone": {
                     "label": "Bewaakte zone"
                 },
+                "switch": {
+                    "label": "Type",
+                    "options": {
+                        "circuit_breaker": "Vermogensschakelaar",
+                        "disconnector": "Scheidingsschakelaar",
+                        "earthing": "Aarding",
+                        "mechanical": "Mechanisch"
+                    }
+                },
                 "tactile_paving": {
                     "label": "Voetpad met Aanraakbare Aanwijzingen voor Blinden"
                 },
                     },
                     "placeholder": "Vast, voornamelijk vast, los …"
                 },
+                "trade": {
+                    "label": "Type"
+                },
                 "traffic_calming": {
                     "label": "Type"
                 },
                 "traffic_signals": {
                     "label": "Type"
                 },
+                "traffic_signals/direction": {
+                    "label": "Richting",
+                    "options": {
+                        "backward": "Achterwaarts",
+                        "both": "Beide / Alle",
+                        "forward": "Voorwaarts"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Zichtbaarheid van de weg",
                     "options": {
                     },
                     "placeholder": "Uitmuntend, Goed, Slecht …"
                 },
+                "transformer": {
+                    "label": "Type",
+                    "options": {
+                        "auto": "Auto-/Spaartransformator",
+                        "auxiliary": "Hulptransformator",
+                        "converter": "HVDC-converter",
+                        "distribution": "Distributie",
+                        "generator": "Generator",
+                        "phase_angle_regulator": "Dwarsregeltransformator",
+                        "traction": "Tractie",
+                        "yes": "Onbekend"
+                    }
+                },
                 "trees": {
                     "label": "Bomen"
                 },
                     }
                 },
                 "volcano/status": {
-                    "label": "Vulkaan Status",
+                    "label": "Vulkaanstatus",
                     "options": {
                         "active": "Actief",
-                        "dormant": "Inactief",
-                        "extinct": "Uitgestorven"
+                        "dormant": "Slapend",
+                        "extinct": "Uitgedoofd"
                     }
                 },
                 "volcano/type": {
-                    "label": "Vulkaan type",
+                    "label": "Vulkaantype",
                     "options": {
-                        "scoria": "Scoria"
+                        "scoria": "Scoria",
+                        "shield": "Schildvulkaan",
+                        "stratovolcano": "Stratovulkaan"
                     }
                 },
+                "voltage": {
+                    "label": "Spanning"
+                },
+                "voltage/primary": {
+                    "label": "Primaire spanning"
+                },
+                "voltage/secondary": {
+                    "label": "Secundaire spanning"
+                },
+                "voltage/tertiary": {
+                    "label": "Tertiaire spanning"
+                },
                 "wall": {
                     "label": "Type"
                 },
                 },
                 "wikipedia": {
                     "label": "Wikipedia"
+                },
+                "windings": {
+                    "label": "Wikkelingen",
+                    "placeholder": "1, 2, 3 …"
+                },
+                "windings/configuration": {
+                    "label": "Wikkelingconfiguratie",
+                    "options": {
+                        "delta": "Delta",
+                        "leblanc": "Leblanc",
+                        "open": "Open",
+                        "open-delta": "Open-delta",
+                        "scott": "Scott",
+                        "star": "Ster / Y",
+                        "zigzag": "Zigzag"
+                    }
                 }
             },
             "presets": {
                     "terms": "skilift,bugellift,handvat"
                 },
                 "aerialway/station": {
-                    "name": "Kabelbaanstation",
-                    "terms": "skiliftstation"
+                    "name": "Kabelbaanstation"
                 },
                 "aerialway/t-bar": {
                     "name": "Skilift met handvaten",
                     "terms": "wisselen,geld,bank,munteenheid"
                 },
                 "amenity/bus_station": {
-                    "name": "Busstation",
-                    "terms": "bushalte,station,bus,openbaar vervoer,OV"
+                    "name": "Busstation"
                 },
                 "amenity/cafe": {
                     "name": "Cafetaria",
                     "terms": "cafetaria,tea-room,tearoom,tea room,koffiehuis,koffie,thee,vieruurtje,cake,taart"
                 },
+                "amenity/car_pooling": {
+                    "name": "Oppikplaats voor carpooling",
+                    "terms": "carpooling,samenrijden,afzetplaats voor samenrijden,oppikplaats voor carpooling,carpoolparking,carpoolstopplaats"
+                },
                 "amenity/car_rental": {
                     "name": "Autoverhuur",
                     "terms": "huurauto,huren"
                     "terms": "hamburgers,frieten,pizza"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Veerbootterminal",
-                    "terms": "ferryterminal,veerpontterminal,pontterminal,aanmeren,dok"
+                    "name": "Veerbootterminal"
                 },
                 "amenity/fire_station": {
                     "name": "Brandweerkazerne",
                     "name": "Bibliotheek",
                     "terms": "boeken,lenen,lezen,literatuuur"
                 },
+                "amenity/love_hotel": {
+                    "name": "Love hotel",
+                    "terms": "liefdeshotel,discreet hotel,discrete kamers,sekshotel,privacyhotel,privacykamers"
+                },
                 "amenity/marketplace": {
                     "name": "Marktplaats",
                     "terms": "groenten,vis,groentemarkt"
                     "name": "Motorfietsparking",
                     "terms": "motorparking,motoparking,motostalling,motorstalling,motorfietsparking,motoren,moto's,parking voor motoren,parking voor moto's,parking voor motorfietsen"
                 },
+                "amenity/music_school": {
+                    "name": "Muziekschool",
+                    "terms": "muziekacademie,conservatorium"
+                },
                 "amenity/nightclub": {
                     "name": "Nachtclub",
                     "terms": "dancing,bar,uitgaan,disco"
                     "name": "Boswachtershut"
                 },
                 "amenity/recycling": {
-                    "name": "Recyclage",
-                    "terms": "milieustraat,milieupark,glasbol,containerpark,recycling,recyclage,stort"
+                    "name": "Recyclagecontainer",
+                    "terms": "milieustraat,glasbol,recycling"
                 },
                 "amenity/recycling_centre": {
                     "name": "Milieupark/Containerpark",
                     "terms": "roetsjbaan,rollercoaster"
                 },
                 "attraction/train": {
-                    "name": "Toeristentrein"
+                    "name": "Toeristentrein",
+                    "terms": "treintje"
                 },
                 "attraction/water_slide": {
-                    "name": "Waterglijbaan"
+                    "name": "Waterglijbaan",
+                    "terms": "glijbaan,wildwaterglijbaan,waterbaan"
                 },
                 "barrier": {
                     "name": "Barrière",
                     "terms": "heg,haag"
                 },
                 "barrier/kissing_gate": {
-                    "name": "Voetgangershek"
+                    "name": "Voetgangershek",
+                    "terms": "veehek,kushek,kusjeshek,kissing gate"
                 },
                 "barrier/lift_gate": {
                     "name": "Slagboom",
                     "name": "Schuur",
                     "terms": "stal,loods"
                 },
+                "building/boathouse": {
+                    "name": "Boothuis",
+                    "terms": "botenhuis,bootligplaats"
+                },
+                "building/bungalow": {
+                    "name": "Bungalow"
+                },
                 "building/bunker": {
                     "name": "Bunker"
                 },
                     "terms": "hut,blokhut,cabine,hout,balken,boomstammen"
                 },
                 "building/cathedral": {
-                    "name": "Kathedraalgebouw"
+                    "name": "Kathedraalgebouw",
+                    "terms": "kerkgebouw"
                 },
                 "building/chapel": {
                     "name": "Kapelgebouw"
                 "building/church": {
                     "name": "Kerkgebouw"
                 },
+                "building/civic": {
+                    "name": "Niet gebruiken – niet-gestandardiseerde tag"
+                },
                 "building/college": {
-                    "name": "Gebouw van Beroepsschool",
+                    "name": "Gebouw van beroepsschool",
                     "terms": "bso,buo,buso,vmbo,speciaal onderwijs,bijzonder onderwijs,onderwijs,middelbaar,secundair onderwijs"
                 },
                 "building/commercial": {
                 "building/entrance": {
                     "name": "Ingang/Uitgang"
                 },
+                "building/farm": {
+                    "name": "Gebouw van boerderij"
+                },
                 "building/garage": {
                     "name": "Garage (privéstalling voor voertuigen)",
                     "terms": "autogarage"
                     "terms": "hutje"
                 },
                 "building/industrial": {
-                    "name": "Industrieel gebouw"
+                    "name": "Industrieel gebouw",
+                    "terms": "industriegebouw,bedrijfsgebouw"
                 },
                 "building/kindergarten": {
-                    "name": "Gebouw van Crèche/Kleuterschool",
+                    "name": "Kleuterschool/Gebouw van crèche",
                     "terms": "kleuterschool,kinderdagverblijf,peuterspeelzaal"
                 },
+                "building/mosque": {
+                    "name": "Moskeegebouw",
+                    "terms": "masjid,pleinmoskee"
+                },
                 "building/public": {
                     "name": "Openbaar gebouw",
                     "terms": "publiek gebouw"
                     "name": "Dak",
                     "terms": "afdak"
                 },
+                "building/ruins": {
+                    "name": "Gebouwruïnes"
+                },
                 "building/school": {
                     "name": "Schoolgebouw",
                     "terms": "school,onderwijs,secundair onderwijs,lager onderwijs,basisschool,middelbaar,voortgezet onderwijs"
                 },
                 "building/semidetached_house": {
-                    "name": "Verworpen tag, gebruik dit niet"
+                    "name": "Niet gebruiken – niet-gestandardiseerde tag"
+                },
+                "building/service": {
+                    "name": "Klein machinegebouw (pomp, onderstation …)"
                 },
                 "building/shed": {
                     "name": "Schuurtje",
                     "name": "Stal",
                     "terms": "dieren,paarden,vee,stalling"
                 },
+                "building/stadium": {
+                    "name": "Stadiongebouw"
+                },
                 "building/static_caravan": {
-                    "name": "Stacaravan"
+                    "name": "Stacaravan",
+                    "terms": "woonwagen,chalet"
+                },
+                "building/temple": {
+                    "name": "Tempelgebouw"
                 },
                 "building/terrace": {
                     "name": "Rijhuizen",
                 "building/train_station": {
                     "name": "Treinstation"
                 },
+                "building/transportation": {
+                    "name": "Openbaarvervoersgebouw"
+                },
                 "building/university": {
                     "name": "Gebouw van universiteit of hogeschool",
                     "terms": "universiteit,hogeschool,onderwijs,hoger onderwijs"
                     "name": "Individueel kampeerveld of sta-plaats op camping",
                     "terms": "kampeerveldje,sta-plaats,staplaats"
                 },
+                "circular": {
+                    "name": "Rotonde, verkeer erop niet steeds voorrang"
+                },
                 "club": {
                     "name": "Club",
                     "terms": "vereniging"
                     "terms": "houtwerk,planken"
                 },
                 "craft/carpet_layer": {
-                    "name": "Tapijtlegger"
+                    "name": "Tapijtlegger",
+                    "terms": "vloerbekleder,tapis plain"
                 },
                 "craft/caterer": {
                     "name": "Catering",
                     "terms": "cateraar,traiteur"
                 },
+                "craft/chimney_sweeper": {
+                    "name": "Schoorsteenveger",
+                    "terms": "schouwveger"
+                },
                 "craft/clockmaker": {
                     "name": "Klokmaker",
                     "terms": "klok,uurwerk"
                 },
+                "craft/confectionery": {
+                    "name": "Snoepmaker",
+                    "terms": "artisanale snoepmaker,snoepwinkel"
+                },
                 "craft/distillery": {
                     "name": "Destilleerderij",
                     "terms": "stokerij,distillerij,distilleerderij,destillerij,destillatie,whisky,gin,alcohol,jenever,brandewijn"
                     "name": "Opticien"
                 },
                 "craft/painter": {
-                    "name": "Schilder"
+                    "name": "Schilder",
+                    "terms": "schildersbedrijf"
                 },
                 "craft/photographer": {
                     "name": "Fotograaf",
                     "name": "Stellingenmaker",
                     "terms": "stellagemaker"
                 },
+                "craft/sculptor": {
+                    "name": "Beeldhouwer",
+                    "terms": "beeldenaar,kunstenaar"
+                },
                 "craft/shoemaker": {
                     "name": "Schoenmaker",
                     "terms": "schoenenmaker"
                 },
                 "emergency/defibrillator": {
                     "name": "Defibrillator",
-                    "terms": "AED,hart,groene doos"
+                    "terms": "AED,hartritme,groene doos,externe defibrillator,schok,elektrische schok,reanimeren"
                 },
                 "emergency/designated": {
                     "name": "Toegang voor hulpdiensten: geadviseerd"
                     "terms": "Britse oversteekplaats op verhoogde inrichting"
                 },
                 "footway/sidewalk": {
-                    "name": "Stoep",
-                    "terms": "trottoir"
+                    "name": "Trottoir",
+                    "terms": "stoep,voetpad"
                 },
                 "ford": {
                     "name": "Voorde (doorwaadbare plaats)",
                     "terms": "bloedbank,bloeddonatie,bloedtransfusie,aferese,plasmaferese,stamceldonatie"
                 },
                 "healthcare/hospice": {
-                    "name": "Hospice",
-                    "terms": "hospitium,terminale zorg,terminaal,ongeneeslijk ziek,terminaal ziek,hospicezorg,palliatieve zorg,palliatieve-zorgeenheid,palliatieve-zorgcentrum"
+                    "name": "Palliatievezorgcentrum",
+                    "terms": "hospice,hospitium,terminale zorg,terminaal,ongeneeslijk ziek,terminaal ziek,hospicezorg,palliatieve zorg,palliatievezorgeenheid"
                 },
                 "healthcare/midwife": {
                     "name": "Verloskundige",
                     "name": "Ruiterpad",
                     "terms": "paardenspoor"
                 },
+                "highway/bus_guideway": {
+                    "name": "Geleidebusweg",
+                    "terms": "spoorbus,geleide bus"
+                },
                 "highway/bus_stop": {
-                    "name": "Bushalte",
-                    "terms": "busstation,openbaar vervoer,OV"
+                    "name": "Bushalte"
                 },
                 "highway/corridor": {
                     "name": "Gang in gebouw",
                 },
                 "highway/living_street": {
                     "name": "Woonerf",
-                    "terms": "erf"
+                    "terms": "erf,woonzone"
                 },
                 "highway/mini_roundabout": {
                     "name": "Rotonde zonder middeneiland",
-                    "terms": "rond-punt,rondpunt,rotonde waarvan door het midden kan worden gereden"
+                    "terms": "rondpunt,rotonde waarvan door het midden kan worden gereden"
                 },
                 "highway/motorway": {
                     "name": "Autosnelweg",
                     "name": "Pad",
                     "terms": "wandelpad,fietspad,gemengd wandelpad en fietspad,hikepad,fietsoversteekplaats"
                 },
+                "highway/pedestrian_area": {
+                    "name": "Voetgangersplein",
+                    "terms": "voetgangerszone,voetgangersgebied,autovrij plein,autovrije zone,autovrij gebied"
+                },
+                "highway/pedestrian_line": {
+                    "name": "Voetgangersstraat",
+                    "terms": "voetgangersgebied,voetgangerszone,autovrij gebied,autovrije zone,autovrije straat"
+                },
                 "highway/primary": {
                     "name": "Hoofdweg",
                     "terms": "provinciale weg,primaire weg,gewestweg,provincieweg"
                     "name": "Waterbekken",
                     "terms": "bekken"
                 },
+                "landuse/brownfield": {
+                    "name": "Braakliggend terrein (voorheen bebouwd)",
+                    "terms": "braakliggend terrein,afgebroken gebouw,ontwikkelingsgrond,braakliggende bouwgrond"
+                },
                 "landuse/cemetery": {
                     "name": "Begraafplaats",
                     "terms": "begraafplaats,kerkhof"
                     "terms": "bos,woud,bomen,boom"
                 },
                 "landuse/garages": {
-                    "name": "Garages (privéstalling voor voertuigen)",
-                    "terms": "autogarage"
+                    "name": "Garages (privéstalling voor voertuigen)"
                 },
                 "landuse/grass": {
                     "name": "Grasland",
                     "terms": "gras,gazon"
                 },
+                "landuse/greenfield": {
+                    "name": "Braakliggende bouwgrond (nooit bebouwd)",
+                    "terms": "verkaveling,nieuwe verkaveling,bouwgrond,braakliggend terrein,ontwikkelingsgrond"
+                },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Glastuinbouw",
+                    "terms": "kassenbouw,kassencomplex,tuinbouwcomplex,groeikasbouw,kasbouw,serrebouw"
+                },
                 "landuse/harbour": {
                     "name": "Natuurlijke haven",
                     "terms": "haven,harbour"
                     "name": "Industriegebied",
                     "terms": "industriepark,industriezone,industrieel gebied,industriële zone"
                 },
+                "landuse/industrial/scrap_yard": {
+                    "name": "Sloperij",
+                    "terms": "autokerkhof,oud ijzer,wrakken,schroothoop,metaal"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Slachthuis",
+                    "terms": "slachterij,abattoir,veeslachterij"
+                },
                 "landuse/landfill": {
                     "name": "Stort",
                     "terms": "stortplaats,vuilnisbelt"
                     "name": "Recreatiegebied",
                     "terms": "park,speelveld"
                 },
+                "landuse/religious": {
+                    "name": "Religieus gebied"
+                },
                 "landuse/residential": {
                     "name": "Woongebied",
                     "terms": "huizen,residentieel,wonen,woonwijk"
                 },
                 "leisure/fitness_centre": {
                     "name": "Fitnesscentrum",
-                    "terms": "conditie,gym,sportschool"
+                    "terms": "conditie,gym,sportschool,krachttraining,bodybuilding"
                 },
                 "leisure/fitness_centre/yoga": {
                     "name": "Yoga-studio",
                     "name": "Buitenshuis fitness-station",
                     "terms": "fitness,speeltuin"
                 },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "Evenwichtsbalk als fitnesstoestel",
+                    "terms": "balk,balanceerbalk"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "Opstapje als fitnesstoestel",
+                    "terms": "doos,stepdoos,stepkubus,fitnesskubus,fitnessdoos,verhoogje,fitness box,springen,calf raises"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "Rekstok als fitnesstoestel",
+                    "terms": "optrekstang,pullupstang,stang"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "name": "Apenrek",
+                    "terms": "horizontale ladder"
+                },
+                "leisure/fitness_station/hyperextension": {
+                    "name": "Hyperextensiebank"
+                },
+                "leisure/fitness_station/parallel_bars": {
+                    "name": "Gymnastische brug",
+                    "terms": "brug met gelijke leggers,brug met ongelijke leggers,damesbrug,herenbrug,dipstangen,fitness"
+                },
+                "leisure/fitness_station/push-up": {
+                    "name": "Push-upstation",
+                    "terms": "push-upstang,push-upbalk,push-upstang,fitness"
+                },
+                "leisure/fitness_station/rings": {
+                    "name": "Gymnastiekringen",
+                    "terms": "ringen"
+                },
+                "leisure/fitness_station/sign": {
+                    "name": "Instructiebord voor fitnessoefeningen",
+                    "terms": "fitnessoefeningeninstructiebord,fitnessbord,oefeningenbord"
+                },
+                "leisure/fitness_station/sit-up": {
+                    "name": "Sit-upstation",
+                    "terms": "crunchstation,fitness,sit-upbank,crunchbank"
+                },
+                "leisure/fitness_station/stairs": {
+                    "name": "Fitnesstrappen",
+                    "terms": "oefentrappen,trappen,fitnesstreden"
+                },
                 "leisure/garden": {
                     "name": "Tuin",
                     "terms": "openbare tuin,kruidentuin"
                     "name": "Beachvolleybalveld",
                     "terms": "strandvolleybalveld,volleybalveld,zandveld"
                 },
+                "leisure/pitch/boules": {
+                    "name": "Jeu-de-boules-veld",
+                    "terms": "petanqueveld,petanquebaan,jeu de boules,bocce,lyonnaise,pétanque"
+                },
                 "leisure/pitch/bowls": {
                     "name": "Bowls-baan",
                     "terms": "koersbal,bowls"
                     "name": "Racepiste (rennen)",
                     "terms": "lopen,looppiste,renpiste,atletiekbaan,stadion,stadium,hardlopen,hordenloop"
                 },
+                "leisure/sauna": {
+                    "name": "Sauna"
+                },
                 "leisure/slipway": {
                     "name": "Botenhelling",
                     "terms": "trailerhelling,tewaterlating,te water laten,boot,helling,boothelling"
                     "name": "Industriële schoorsteen",
                     "terms": "schoorsteen,schouw"
                 },
+                "man_made/crane": {
+                    "name": "Permanente kraan",
+                    "terms": "kraan,containerkraan,havenkraan"
+                },
                 "man_made/cutline": {
                     "name": "Gerooide lijn",
                     "terms": "scheidingslijn"
                     "name": "Dijk"
                 },
                 "man_made/flagpole": {
-                    "name": "Vlaggemast",
-                    "terms": "vlaggemast"
+                    "name": "Vlaggenmast",
+                    "terms": "vlaggenstok,vlaggenpaal"
                 },
                 "man_made/gasometer": {
                     "name": "Gashouder",
                     "name": "Mast",
                     "terms": "zendmast,antenne,zendtoren,gsm-mast,toren,communicatiemast,radiomast,tv-mast"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Meetstation",
+                    "terms": "observatiestation,meetapparatuur,observatieapparatuur,weerstation,seismische sensor,luchtkwaliteitmeetstation,luchtmeetstation,gps-meetstation,gps-grondstation,gnss-station,gnss-grondstation"
+                },
                 "man_made/observation": {
                     "name": "Uitkijktoren"
                 },
                     "name": "Kantoor",
                     "terms": "bureau"
                 },
+                "office/accountant": {
+                    "name": "Boekhouder",
+                    "terms": "accountant,bedrijfsadministratie"
+                },
                 "office/administrative": {
-                    "name": "Bestuurlijke instantie",
-                    "terms": "administratief kantoor"
+                    "name": "Bestuurlijke instantie"
+                },
+                "office/adoption_agency": {
+                    "name": "Adoptiebureau",
+                    "terms": "adoptieagentschap,adoptieorganisatie,adopteren,pleeggezin"
+                },
+                "office/advertising_agency": {
+                    "name": "Reclamebureau",
+                    "terms": "advertentiebureau,reclameagentschap,reclamebureau"
+                },
+                "office/architect": {
+                    "name": "Architectenbureau",
+                    "terms": "gebouwenontwerper,tekenaar,bouwmeester,architectenkantoor"
+                },
+                "office/association": {
+                    "name": "Kantoor van non-profitorganisatie",
+                    "terms": "non-profitorganisatiekantoor,ngo-kantoor,vzw-kantoor,verenigingskantoor,kantoor van vereniging zonder winstoogmerk,vereniging zonder winstoogmerk,kantoor van vzw,kantoor van ngo"
+                },
+                "office/charity": {
+                    "name": "Kantoor van liefdadigheidsinstelling",
+                    "terms": "liefdadigheidsinstellingskantoor"
                 },
                 "office/company": {
-                    "name": "Bedrijfskantoor",
-                    "terms": "bedrijfsbureau,hoofdkwartier,bedrijfsvestiging,bureau,kantoor"
+                    "name": "Kantoor van bedrijf",
+                    "terms": "bedrijfskantoor,hoofdkwartier"
                 },
                 "office/coworking": {
                     "name": "Coworking-kantoor",
                     "name": "Uitzendbureau",
                     "terms": "uitzendkantoor,interimkantoor,werkloos,werk zoeken,werkwinkel"
                 },
+                "office/energy_supplier": {
+                    "name": "Kantoor van energiemaatschappij",
+                    "terms": "energiemaatschappijkantoor,energieleverancierskantoor,kantoor van energieleverancier"
+                },
                 "office/estate_agent": {
                     "name": "Immobiliënkantoor",
-                    "terms": "vastgoedkantoor"
+                    "terms": "vastgoedkantoor,vastgoedmakelaarskantoor"
                 },
                 "office/financial": {
-                    "name": "Financieel kantoor"
+                    "name": "Privékantoor van financiële instelling",
+                    "terms": "financieel kantoor"
+                },
+                "office/forestry": {
+                    "name": "Bosbeheerkantoor",
+                    "terms": "boswachtkantoor,kantoor van boswachters"
+                },
+                "office/foundation": {
+                    "name": "Kantoor van stichting",
+                    "terms": "stichtingskantoor"
                 },
                 "office/government": {
                     "name": "Overheidskantoor",
                     "terms": "overheidsdienst"
                 },
                 "office/government/register_office": {
-                    "name": "Burgerlijke Stand",
+                    "name": "Burgerlijke stand",
                     "terms": "dienst bevolking,bevolking,identiteitskaart,geboorte,trouwakte,trouw,huwelijk,burgerlijk,overlijdens,sterfte,scheiding,echtscheiding"
                 },
+                "office/government/tax": {
+                    "name": "Belastingskantoor",
+                    "terms": "fiscaal kantoor,kantoor van belastingen"
+                },
+                "office/guide": {
+                    "name": "Gidsenkantoor",
+                    "terms": "gidskantoor,kantoor van gidsen,berggidskantoor,duikbegeleiderskantoor"
+                },
                 "office/insurance": {
                     "name": "Verzekeringskantoor",
                     "terms": "verzekeringsmakelaarkantoor,makelaarkantoor"
                 },
+                "office/it": {
+                    "name": "IT-kantoor",
+                    "terms": "computerkantoor,elektronicakantoor,hardware,software,IT-specialist,ICT-kantoor,ICT-specialist"
+                },
                 "office/lawyer": {
                     "name": "Advocatenkantoor",
                     "terms": "advocatenbureau,wetsgeleerden"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notariaat",
-                    "terms": "notaris,akte,testament"
+                    "name": "Notariaat"
+                },
+                "office/moving_company": {
+                    "name": "Kantoor van verhuisbedrijf",
+                    "terms": "verhuizers,verhuisbedrijfkantoor"
+                },
+                "office/newspaper": {
+                    "name": "Krantredactie",
+                    "terms": "redactie,nieuwsredactie,krantenredactie"
                 },
                 "office/ngo": {
                     "name": "Kantoor van NGO",
-                    "terms": "niet-gouvernementele organisatie,vzw,ngo,kantoor van vzw,bureau van vzw,kantoor van ngo,kantoor van vzw,vereniging zonder winstoogmerk"
+                    "terms": "niet-gouvernementele organisatie,vzw,ngo,kantoor van ngo,ngo-kantoor"
+                },
+                "office/notary": {
+                    "name": "Notariskantoor",
+                    "terms": "notariaat, notaris, kantoor van notaris"
                 },
                 "office/physician": {
                     "name": "Arts"
                     "name": "Politieke partij",
                     "terms": "partijhoofdzetel,partijbureau"
                 },
+                "office/private_investigator": {
+                    "name": "Kantoor van privédetective",
+                    "terms": "privédetectivekantoor,rechercheurskantoor,onderzoekerskantoor"
+                },
+                "office/quango": {
+                    "name": "Kantoor van quango",
+                    "terms": "quangokantoor,quasi-NGO-kantoor,quasi-autonome-non-gouvernementele-organisatiekantoor"
+                },
                 "office/research": {
                     "name": "Onderzoekskantoor",
                     "terms": "researchkantoor,laboratorium,R&D"
                 },
+                "office/surveyor": {
+                    "name": "Kantoor van landmeter/expert/risicoschatter/schademeter/opiniepeilers/statisticus",
+                    "terms": "kantoor van landmeter,landmeterskantoor,kantoor van expert,exertisekantoor,kantoor van risicoschatter,risicoschatterskantoor,opiniepeilersbureau,kantoor van opiniepeilers,statisticikantoor,kantoor van statistici"
+                },
+                "office/tax_advisor": {
+                    "name": "Kantoor van belastingsadviseur",
+                    "terms": "belastingsontwijking*,belastingsontduiking*,belastingsminimalisatie*,belastingen,belastingsreductie*"
+                },
                 "office/telecommunication": {
                     "name": "Telecomkantoor",
                     "terms": "belwinkel,gsm-winkel,telcokantoor"
                 },
+                "office/therapist": {
+                    "name": "Kantoor van therapeut",
+                    "terms": "therapiekantoor,therapeutenkantoor"
+                },
                 "office/travel_agent": {
                     "name": "Reisbureau"
                 },
+                "office/water_utility": {
+                    "name": "Kantoor van watermaatschappij",
+                    "terms": "watermaatschappij*,waterleidingsmaatschappij*"
+                },
                 "piste": {
                     "name": "Skipiste"
                 },
                     "name": "Eiland",
                     "terms": "eiland"
                 },
+                "place/islet": {
+                    "name": "Eilandje <1km²",
+                    "terms": "archipel,atol,islet,rif"
+                },
                 "place/isolated_dwelling": {
                     "name": "Alleenstaande woning"
                 },
                     "name": "Buurt",
                     "terms": "kwartier,wijk"
                 },
+                "place/plot": {
+                    "name": "Perceel",
+                    "terms": "plot,lot"
+                },
                 "place/quarter": {
                     "name": "Kwartier",
                     "terms": "wijk,buurt,stadsdeel"
                     "name": "Dorp",
                     "terms": "gehucht,woonkern,kern,buurt,buurtschap,vlek,kerkdorp,oort,gemeente"
                 },
+                "playground/balance_beam": {
+                    "name": "Evenwichtsbalk als speeltuig",
+                    "terms": "balk,balanceerbalk"
+                },
+                "playground/basket_spinner": {
+                    "name": "Manddraaimolentje",
+                    "terms": "mandmolentje"
+                },
+                "playground/basket_swing": {
+                    "name": "Mandschommel",
+                    "terms": "schommel"
+                },
                 "playground/climbing_frame": {
                     "name": "Klimrek"
                 },
+                "playground/cushion": {
+                    "name": "Springkussen"
+                },
+                "playground/horizontal_bar": {
+                    "name": "Rekstok als speeltuig"
+                },
+                "playground/rocker": {
+                    "name": "Veerwip",
+                    "terms": "veerpaardje,paardje,wipje"
+                },
                 "playground/roundabout": {
-                    "name": "Speel rotonde"
+                    "name": "Speelplein-draaimolen",
+                    "terms": "draaimolentje,zwierder,molentje,ronddraaiend platform"
                 },
                 "playground/sandpit": {
                     "name": "Zandbak"
                     "name": "Glijbaan"
                 },
                 "playground/structure": {
-                    "name": "Speelconstructie"
+                    "name": "Speeltuig",
+                    "terms": "speelconstructie"
                 },
                 "playground/swing": {
                     "name": "Schommel"
                 },
                 "playground/zipwire": {
-                    "name": "Ritsdraad"
+                    "name": "Tokkelbaan"
                 },
                 "point": {
                     "name": "Punt",
                     "name": "Transformatiestation",
                     "terms": "stroom,elektriciteit,energievoorzieningen,transformator,distributie,transformatiecabine,laagspanning,hoogspanning,voltage,spanning,onderstation,klein onderstation,distributiecabine,ondercentrale"
                 },
+                "power/switch": {
+                    "name": "Stroomschakelaar",
+                    "terms": "schakelaar,hoogspanningsschakelaar,onderbreker,circuitbreker,elektrische schakelaar,elektriciteitsschakelaar"
+                },
                 "power/tower": {
                     "name": "Hoogspanningsmast",
                     "terms": "hoogspanningstoren,elektriciteitsmast"
                     "name": "Transformator",
                     "terms": "trafo,omvormer"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Perron voor openbaar vervoer"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Kabelbaanperron"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Busperron"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Kaai voor veerboot",
+                    "terms": "ferrykaai,ferryperron,veerbootkaai,veerbootperron,kaai voor ferry"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Lightrailperron",
+                    "terms": "lichtspoorperron,tramtreinperron,sneltramperron,lichtgewichttreinperron,spoorwegperron"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Monorailperron",
+                    "terms": "spoorwegperron,monorailplatform"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Metroperron",
+                    "terms": "spoorwegperron,tramplatform"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Treinperron",
+                    "terms": "spoorwegperron,treinplatform"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Tramperron",
+                    "terms": "spoorwegperron,tramplatform"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Trolleybusperron"
+                },
                 "public_transport/platform": {
-                    "name": "Perron",
-                    "terms": "spoorwegperron,spoorwegplatform,treinperron,treinplatform,tramperron,tramhalte,tramplatform,metroperron,metrohalte,metroplatform,busperron,bushalte,busplatform,platform"
+                    "name": "Openbaarvervoershalte"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Kabelbaanhalte"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Bushalte",
+                    "terms": "halte"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Veerboothalte",
+                    "terms": "ferryhalte"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Lightrailhalte",
+                    "terms": "lichtspoorhalte,tramtreinhalte,sneltramhalte,lichtgewichttreinhalte,spoorweghalte"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Monorailhalte"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Metrohalte"
+                },
+                "public_transport/platform_train": {
+                    "name": "Treinhalte"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Tramhalte",
+                    "terms": "halte"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Trolleybushalte"
+                },
+                "public_transport/station": {
+                    "name": "Openbaarvervoershalte"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Kabelbaanstation"
+                },
+                "public_transport/station_bus": {
+                    "name": "Busstation"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Veerbootstation",
+                    "terms": "ferrystation"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Lightrailstation",
+                    "terms": "lichtspoorstation,tramtreinstation,sneltramstation,lichtgewichttreinstation,spoorwegstation"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Monorailstation",
+                    "terms": "spoorwegstation"
+                },
+                "public_transport/station_subway": {
+                    "name": "Metrostation",
+                    "terms": "spoorwegstation"
+                },
+                "public_transport/station_train": {
+                    "name": "Treinstation",
+                    "terms": "spoorwegstation"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Treinstation op aanvraag",
+                    "terms": "spoorwegstation,treinhalte,spoorweghalte,halte"
+                },
+                "public_transport/station_tram": {
+                    "name": "Tramstation",
+                    "terms": "spoorwegstation"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Trolleybusstation"
+                },
+                "public_transport/stop_area": {
+                    "name": "Haltecomplex",
+                    "terms": "stopplaats,haltecomplex,openbaar vervoer,openbaarvervoershaltecomplex,haltes,haltegroep,station"
                 },
                 "public_transport/stop_position": {
-                    "name": "Stopplaats",
-                    "terms": "stoppositie"
+                    "name": "Stopplaats voor openbaarvervoersvoertuig"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Kabelbaanstopplaats"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Busstopplaats"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Veerbootstopplaats",
+                    "terms": "ferrystopplaats,veerbootaanmeerplaats,ferryaanmeerplaats,aanmeerplaats"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Lightrailstopplaats",
+                    "terms": "lichtspoorstopplaats,tramtreinstopplaats,sneltramstopplaats,lichtgewichttreinstopplaats"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Monorailstopplaats"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Metrostopplaats"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Treinstopplaats"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Tramstopplaats"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Trolleybusstopplaats"
                 },
                 "railway": {
                     "name": "Spoorweg"
                     "terms": "kabelbaan,teleferiek,funiculaire"
                 },
                 "railway/halt": {
-                    "name": "Treinhalte",
-                    "terms": "treinstation,treinstop,stop,halte,station"
+                    "name": "Treinstation op aanvraag"
                 },
                 "railway/level_crossing": {
                     "name": "Spoorwegovergang (weg)",
                     "terms": "gelijkvloerse overgang,gelijkgrondse overgang,overweg,spooroverweg,treinkruising,treinsporen"
                 },
+                "railway/light_rail": {
+                    "name": "Lightrail",
+                    "terms": "lichtspoor,lichte spoorweg"
+                },
                 "railway/milestone": {
                     "name": "Hectometer- of kilometerpaal aan spoorweg",
                     "terms": "hectometerpaaltje,kilometerpaaltje,mijlpaal,spoorwegmijlpaal"
                 },
+                "railway/miniature": {
+                    "name": "Berijdbare minispoorweg",
+                    "terms": "miniatuurspoorweg,minispoorweg,smalspoor"
+                },
                 "railway/monorail": {
                     "name": "Monorail",
                     "terms": "magneetzweefbaan,enkelspoor,spoor"
                     "terms": "smal spoor,normaalspoor,spoor"
                 },
                 "railway/platform": {
-                    "name": "Spoorperron",
-                    "terms": "spoorwegperron,spoorwegplatform,treinperron,treinplatform,tramperron,tramplatform,metroperron,metroplatform"
+                    "name": "Spoorperron"
                 },
                 "railway/rail": {
                     "name": "Spoorweg",
                     "terms": "sein,treinsein"
                 },
                 "railway/station": {
-                    "name": "Treinstation",
-                    "terms": "treinhalte,station,NS-station,NMBS-station"
+                    "name": "Treinstation"
                 },
                 "railway/subway": {
                     "name": "Metrospoor",
                     "name": "Winkel",
                     "terms": "handelszaak"
                 },
+                "shop/agrarian": {
+                    "name": "Landbouwwinkel (om aan landbouw te doen)",
+                    "terms": "landbouwzaak,landbouwerswinkel,landbouwerszaak,pesticidenwinkel,meststoffenwinkel,zadenwinkel,tractorwinkel,voerwinkel,veevoerwinkel,landbouwgereedschapswinkel,landbouwwerktuigenwinkel"
+                },
                 "shop/alcohol": {
                     "name": "Slijterij",
                     "terms": "alcoholwinkel"
                     "terms": "juwelier"
                 },
                 "shop/kiosk": {
-                    "name": "Krantenkiosk",
+                    "name": "Winkelkiosk",
                     "terms": "kiosk,nieuwskiosk,krantenwinkel,krantenkiosk"
                 },
                 "shop/kitchen": {
                     "name": "Ticketverkoop",
                     "terms": "toegangskaartjes,ticketjes"
                 },
+                "shop/tiles": {
+                    "name": "Tegelwinkel",
+                    "terms": "betegeling,vloertegelwinkel,muurtegelwinkel"
+                },
                 "shop/tobacco": {
-                    "name": "tabak winkel",
-                    "terms": "sigaret winkel"
+                    "name": "Tabakwinkel",
+                    "terms": "sigarettenwinkel"
                 },
                 "shop/toys": {
                     "name": "Speelgoedwinkel",
                     "terms": "speelgoedwinkel"
                 },
+                "shop/trade": {
+                    "name": "Bouwmaterialenhandel",
+                    "terms": "bouwmaterialenwinkel,bouwmaterialenzaak,bouwmaterialengroothandel,vensterhandel,ruitenhandel,glashandel,ramenhandel,tegelhandel,tegelgroothandel,loodgieterswinkel,houthandel,houtgroothandel,plankenhandel"
+                },
                 "shop/travel_agency": {
                     "name": "Reisbureau",
                     "terms": "reisbureau"
                 },
                 "tourism/artwork": {
                     "name": "Kunstwerk",
-                    "terms": "kunst,object,kunstobject"
+                    "terms": "kunst,object,kunstobject,sculptuur,beeldhouwwerk,schilderij"
                 },
                 "tourism/attraction": {
                     "name": "Toeristische attractie",
                     "name": "Caravan-/kampeerwagenterrein",
                     "terms": "caravans,kampeerwagens,campers,motorhomes,mobilehomes,terrein voor kampeerwagens"
                 },
+                "tourism/chalet": {
+                    "name": "Vakantiehuisje",
+                    "terms": "chalet,huisje,bungalow"
+                },
                 "tourism/gallery": {
                     "name": "Kunstgallerij",
-                    "terms": "tentoonstelling,exposé,gallerij,kunstgallerie,gallerie"
+                    "terms": "tentoonstelling,exposé,gallerij,kunstgallerie,gallerie,schilderijen,beeldhouwwerken,sculpturen"
                 },
                 "tourism/guest_house": {
                     "name": "Pension",
                     "terms": "bed and breakfast,bed & breakfast,hotel,B&B"
                 },
                 "tourism/hostel": {
-                    "name": "Jeugdherberg"
+                    "name": "Jeugdherberg",
+                    "terms": "hostel"
                 },
                 "tourism/hotel": {
                     "name": "Hotel",
                     "name": "Uitzichtpunt",
                     "terms": "zicht,uitkijkpunt"
                 },
+                "tourism/wilderness_hut": {
+                    "name": "Onbemande hut in wildernis",
+                    "terms": "wildernishut,berghut,berghuis,berghostel,bergschuilhuis"
+                },
                 "tourism/zoo": {
                     "name": "Dierentuin",
                     "terms": "zoo"
                 "type/route/horse": {
                     "name": "Ruiterroute"
                 },
+                "type/route/light_rail": {
+                    "name": "Lightrailroute",
+                    "terms": "lichtspoorroute,lichtespoorwegroute"
+                },
                 "type/route/pipeline": {
                     "name": "Pijpleidingstraject",
                     "terms": "pijplijnroute,pijplijntraject,pijpleidingsroute"
                 },
+                "type/route/piste": {
+                    "name": "Skipiste/Skiroute",
+                    "terms": "piste,skiroute"
+                },
                 "type/route/power": {
                     "name": "Elektriciteitsleidingstraject",
                     "terms": "elektriciteitslijnroute,elektriciteitslijntraject,elektriciteitsleidingsroute"
                     "name": "Autoroute",
                     "terms": "autotraject,sightseeingroute"
                 },
+                "type/route/subway": {
+                    "name": "Metroroute",
+                    "terms": "metrolijn,route,lijn,metrotraject"
+                },
                 "type/route/train": {
                     "name": "Treintraject",
                     "terms": "spoor,NMBS,NS,treinroute"
                     "terms": "lijn,buslijn,tramlijn,metrolijn,treintraject,treinlijn"
                 },
                 "type/site": {
-                    "name": "Site"
+                    "name": "Site",
+                    "terms": "terrein"
                 },
                 "type/waterway": {
                     "name": "Waterloop",
                 "description": "DigitalGlobe premium satellietbeelden",
                 "name": "DigitalGlobe-premiumbeelden"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Gebruiksvoorwaarden & feedback"
+                },
+                "description": "Luchtfoto grenzen en opnamedatum. Labels verschijnen bij zoomniveau 14 en hoger.",
+                "name": "DigitalGlobe-premiumbeelden Vintage"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Gebruiksvoorwaarden & feedback"
                 "description": "DigitalGlobe standaard satellietbeelden",
                 "name": "DigitalGlobe-standaardbeelden"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Gebruiksvoorwaarden & feedback"
+                },
+                "description": "Luchtfoto grenzen en opnamedatum. Labels verschijnen bij zoomniveau 14 en hoger.",
+                "name": "DigitalGlobe-premiumbeelden Vintage"
+            },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "Voorwaarden & Terugkoppeling"
                 },
                 "name": "OSM Inspecteur: Tagging"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "Bij zoomniveau 16+, kaartgegevens in publiek domein van de VS Census. Bij lagere zoomniveaus, enkel wijzigingen sinds 2006 behalve wijzigingen die al in OpenStreetMap zitten",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Geel = Publiek domein kaartgegevens van de US Census. Rood = data niet gevonden in OpenStreetMap",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kaartgegevens OpenStreetMap-bijdragers, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Fietsen"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kaartgegevens OpenStreetMap-bijdragers, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Wandelen"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kaartgegevens OpenStreetMap-bijdragers, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Mountainbiken"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kaartgegevens OpenStreetMap-bijdragers, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Inline skaten"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kaartgegevens OpenStreetMap-bijdragers, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Wintersportpistes"
             },
             "basemap.at": {
index 3b92aba77b5122d5a637dbf99c6743de539e2729..f50e31088e857bcdcd4ace092eaf4373dbc405f3 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Klikk for å legge til flere noder på linjen. Klikk på andre linjer for å sammenkoble dem, og dobbeltklikk for å avslutte linjen."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Denne kan ikke redigeres fordi den er koblet til en skjult kartegenskap."
             }
         },
         "operations": {
             "localized_translation_language": "Velg språk",
             "localized_translation_name": "Navn"
         },
+        "zoom_in_edit": "Zoom inn for å redigere",
         "login": "logg inn",
         "logout": "logg ut",
         "loading_auth": "Kobler til OpenStreetMap...",
             "created": "Opprettet",
             "about_changeset_comments": "Angående kommentarer til endringssett",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Du nevnte Google i kommentaren: husk at det er strengt forbudt å kopiere fra Google Maps.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Du nevnte Google i kommentaren: husk at det er strengt forbudt å kopiere fra Google Maps."
         },
         "contributors": {
             "list": "Redigeringer utført av {users}",
                 "title": "Måling",
                 "selected": "{n} valgt",
                 "geometry": "Geometri",
-                "closed": "lukket",
                 "length": "Lengde",
                 "area": "Område"
             }
             "title": "Bakgrunn",
             "description": "Bakgrunnsinnstillinger",
             "key": "B",
-            "percent_brightness": "{opacity}% lysstyrke",
             "none": "Ingen",
             "best_imagery": "Den beste ortofotokilden til denne plasseringen",
             "switch": "Bytt tilbake til denne bakgrunnen",
             "custom": "Egendefinert",
             "custom_button": "Endre egendefinert bakgrunn",
-            "custom_prompt": "Skriv inn en URL-mal. Gyldige symboler er:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y flisordning\n   - {ty} for snudde Y-koordinater med TMS-stil\n   - {u} for quadtile-ordning\n   - {switch:a,b,c} for DNS server multiplexing\n\nEksempel:\n{example}",
-            "fix_misalignment": "Finjuster ortofotoet",
-            "imagery_source_faq": "Hvor kommer dette ortofotoet fra?",
             "reset": "tilbakestill",
-            "offset": "Dra hvor som helst i det grå feltet under for justere ortofotoet. Du kan også angi justeringsverdiene i meter.",
             "minimap": {
-                "description": "Mini-kart",
                 "tooltip": "Vis et kart som er zoomet ut for å hjelpe med å lokalisere området som vises.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Finjuster ortofotoet",
+            "offset": "Dra hvor som helst i det grå feltet under for justere ortofotoet. Du kan også angi justeringsverdiene i meter."
         },
         "map_data": {
             "title": "Kartdata",
             "description": "Kartdata",
             "key": "F",
             "data_layers": "Datalag",
+            "layers": {
+                "osm": {
+                    "tooltip": "Kartdata fra OpenStreetMap",
+                    "title": "OpenStreetMap-data"
+                }
+            },
             "fill_area": "Fyll områder",
             "map_features": "Kartegenskaper",
             "autohidden": "Disse kartegenskapene har blitt automatisk skjult fordi for mange ville blitt vist på skjermen. Du kan zoome inn for å redigere dem."
         "splash": {
             "welcome": "Velkommen til iD OpenStreetMap editor",
             "text": "iD er et brukervennlig, men kraftig verktøy for å bidra til verdens beste frie kart. Dette er versjon {version}. For mer informasjon, se {website} og meld om feil på {github}.",
-            "walkthrough": "Begynn Gjennomgangen"
+            "walkthrough": "Begynn Gjennomgangen",
+            "start": "Rediger nå"
         },
         "source_switch": {
             "live": "direkte",
             "untagged_area_tooltip": "Velg en kartegenskaptype som beskriver hva dette område er.",
             "untagged_relation": "Utagget relasjon",
             "untagged_relation_tooltip": "Velg en kartegenskaptype som beskriver hva denne relasjonen er.",
-            "many_deletions": "Du sletter {n} kartegenskaper. Er du sikker på at du vil gjøre dette? Det vil slette dem fra kartet som alle andre ser på openstreetmap.org.",
             "tag_suggests_area": "Taggen {tag} anbefaler at linje bør være et areal, men dette er ikke et areal",
             "deprecated_tags": "Utgående tagger: {tags}"
         },
+        "zoom": {
+            "in": "Zoom inn",
+            "out": "Zoom ut"
+        },
         "cannot_zoom": "Kan ikke zoome ut lenger i gjeldende modus.",
         "full_screen": "Skru av/på fullskjerm.",
         "gpx": {
         "help": {
             "title": "Hjelp",
             "key": "H",
-            "help": "# Hjelp\n\nDette er et redigeringsverktøy for [OpenStreetMap](http://www.openstreetmap.org/),\ndet frie og redigerbare verdenskartet. Du kan bruke det til å legge til og oppdatere\ndata i ditt område, og gjøre et verdensomspennende kart med åpen kildekode og frie data\nbedre for alle.\n\nEndringer du gjør i dette kartet vil bli synlig for alle som bruker\nOpenStreetMap. For å gjøre en endring, må du\n[logge inn](https://www.openstreetmap.org/login).\n\n[Redigeringsverktøyet iD](http://ideditor.com/) er et samarbeidsprosjekt med [kildekode\ntilgjengelig på GitHub](https://github.com/openstreetmap/iD).\n"
+            "help": {
+                "title": "Hjelp"
+            },
+            "overview": {
+                "title": "Oversikt",
+                "navigation_h": "Navigasjon"
+            }
         },
         "intro": {
             "done": "ferdig",
             },
             "areas": {
                 "title": "Områder",
-                "add_playground": "*Områder* brukes for å avgrense kartegenskaper som innsjøer, bygninger og boligfelt.{br}De kan også brukes for detaljert kartlegging av kartegenskaper du vanligvis ville kartlagt som punkter. **Trykk på {button} Område-knappen for å lage et nytt område.**",
                 "start_playground": "La oss legge til denne lekeplassen i kartet ved å tegne et område. Områder tegnes ved å plassere *noder* langs ytterkanten av kartegenskapen. **Klikk eller trykk mellomromtasten for å plassere en startnode på et av hjørnene til lekeplassen.**",
                 "continue_playground": "Fortsett å tegne område ved å plassere flere noder langs lekeplassens ytterkant. Det er greit å koble området til eksisterende gangveier.{br}Tips: Du kan holde inne '{alt}'-tasten for å forhindre noder fra å kobles sammen med andre kartegenskaper. **Fortsett med å tegne et område for lekeplassen.**",
                 "finish_playground": "Avslutt området ved å trykke enter, eller å klikke igjen på den første eller siste noden. **Fullfør tegningen av området for lekeplassen.**",
                     "label": "Kapasitet",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "E": "Øst",
-                        "ENE": "Øst-nordøst",
-                        "ESE": "Øst-sørøst",
-                        "N": "Nord",
-                        "NE": "Nordøst",
-                        "NNE": "Nord-nordøst",
-                        "NNW": "Nord-nordvest",
-                        "NW": "Nordvest",
-                        "S": "Sør",
-                        "SE": "Sørøst",
-                        "SSE": "Sør-sørøst",
-                        "SSW": "Sør-sørvest",
-                        "SW": "Sørvest",
-                        "W": "Vest",
-                        "WNW": "Vest-nordvest",
-                        "WSW": "Vest-sørvest"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "anticlockwise": "Mot klokken",
-                        "clockwise": "Med klokken"
-                    }
-                },
                 "collection_times": {
                     "label": "Hentetider"
                 },
                 "par": {
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Retning",
-                    "options": {
-                        "backward": "Bakover",
-                        "forward": "Fremover"
-                    }
-                },
                 "park_ride": {
                     "label": "Park & Ride"
                 },
                 "amenity/fast_food": {
                     "name": "Hurtigmat"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Fergeterminal"
-                },
                 "amenity/fire_station": {
                     "name": "Brannstasjon"
                 },
                 "amenity/pub": {
                     "name": "Pub"
                 },
-                "amenity/recycling": {
-                    "name": "Resirkulering"
-                },
                 "amenity/restaurant": {
                     "name": "Restaurant"
                 },
                 "highway/bridleway": {
                     "name": "Ridevei"
                 },
-                "highway/bus_stop": {
-                    "name": "Busstopp"
-                },
                 "highway/crossing": {
                     "name": "Fotgjengerovergang"
                 },
                 "landuse/forest": {
                     "name": "Skog"
                 },
-                "landuse/garages": {
-                    "name": "Garasjer"
-                },
                 "landuse/grass": {
                     "name": "Gress"
                 },
                 "power/transformer": {
                     "name": "Transformator"
                 },
-                "public_transport/platform": {
-                    "name": "Plattform"
-                },
                 "railway": {
                     "name": "Jernbane"
                 },
                 "railway/funicular": {
                     "name": "Kabelbane"
                 },
-                "railway/halt": {
-                    "name": "Jernbanestasjon"
-                },
                 "railway/monorail": {
                     "name": "Monorail"
                 },
                 "railway/narrow_gauge": {
                     "name": "Smalsporet jernbane"
                 },
-                "railway/platform": {
-                    "name": "Jernbaneplattform"
-                },
                 "railway/rail": {
                     "name": "Skinne"
                 },
-                "railway/station": {
-                    "name": "Jernbanestasjon"
-                },
                 "railway/subway": {
                     "name": "T-bane"
                 },
                 "shop/jewelry": {
                     "name": "Smykkeforhandler"
                 },
-                "shop/kiosk": {
-                    "name": "Aviskiosk"
-                },
                 "shop/kitchen": {
                     "name": "Kjøkkenbutikk"
                 },
index 6bd00448d6b72ddd63e65e95dcbe8362d3d71f1c..99e70ccca839a19bc8880d4d53121fc8c46672fb 100644 (file)
@@ -3,7 +3,7 @@
         "modes": {
             "add_area": {
                 "title": "Obszar",
-                "description": "Dodaje do mapy parki, budynki, jeziora i inne obszary.",
+                "description": "Dodaje do mapy parki, budynki, jeziora albo inne obszary mapy.",
                 "tail": "Kliknij mapę, aby zacząć rysować obszar taki jak park, jezioro czy budynek."
             },
             "add_line": {
             "about_changeset_comments": "Jak dobrze opisywać zmiany.",
             "about_changeset_comments_link": "http://wiki.openstreetmap.org/wiki/Pl:Good_changeset_comments",
             "google_warning": "W tym komentarzu wspomniałeś o Google: pamiętaj że kopiowanie informacji z Google Maps jest surowo zabronione. ",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edycje użytkowników {users}",
                 "title": "Pomiary",
                 "selected": "{n} wybrano",
                 "geometry": "Geometria",
-                "closed": "zamknięty",
                 "center": "Środek",
                 "perimeter": "Obwód",
                 "length": "Długość",
                 "centroid": "Centroida",
                 "location": "Lokalizacja",
                 "metric": "Metryczne",
-                "imperial": "Imperialne"
+                "imperial": "Imperialne",
+                "node_count": "Liczba węzłów"
             }
         },
         "geometry": {
             "title": "Warstwa tła",
             "description": "Ustawienia tła",
             "key": "B",
-            "percent_brightness": "Jasność {opacity}%",
+            "backgrounds": "Tła",
             "none": "Brak",
             "best_imagery": "Najlepsza znana warstwa podkładu dla tego obszaru",
             "switch": "Wróć do tego podkładu",
             "custom": "Własne",
             "custom_button": "Edycja własnego podkładu",
-            "custom_prompt": "Wprowadź szablon dla URL kafla mapy. Obsługiwane symbole:\n   - {zoom}/{z}, {x}, {y} dla schematu adresowania kafla Z/X/Y\n   - {ty} dla odwróconej współrzędnej Y w adresowaniu TMS\n   - {u} dla QuadTiles\n   - {switch:a,b,c} dla multipleksacji serwerów na poziomie DNS\n\nPrzykład:\n{example}",
-            "fix_misalignment": "Przesunięcie warstwy tła",
-            "imagery_source_faq": "Skąd pochodzi ta warstwa?",
+            "overlays": "Nakładki",
             "reset": "Przywraca ustawienia",
-            "offset": "Przeciągnij na szare pole poniżej, aby dostosować obrazek, lub wprowadź wartości przesunięcia w metrach.",
+            "display_options": "Wyświetl opcje",
+            "brightness": "Jasnosć",
+            "contrast": "Kontrast",
+            "saturation": "Nasycenie",
+            "sharpness": "Ostrość",
             "minimap": {
-                "description": "Minimapa",
+                "description": "Pokaz minimapę",
                 "tooltip": "Pokaż oddaloną mapę, aby pomóc zlokalizować wyświetlany obszar.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Przesunięcie warstwy tła",
+            "offset": "Przeciągnij na szare pole poniżej, aby dostosować obrazek, lub wprowadź wartości przesunięcia w metrach."
         },
         "map_data": {
             "title": "Dane mapy",
             "status_code": "Serwer zwrócił kod {code}",
             "unknown_error_details": "Proszę upewnić się, że połączono z Internetem.",
             "uploading": "Wysyłanie zmian do OpenStreetMap...",
+            "conflict_progress": "Sprawdzanie konfliktów: {num} z {total}",
             "unsaved_changes": "Istnieją niezapisane zmiany.",
             "conflict": {
                 "header": "Rozwiąż konflikt edycji",
             "untagged_area_tooltip": "Wybierz typ obiektu, który opisuje czym jest ten obszar.",
             "untagged_relation": "Pusta relacja - brak znaczników",
             "untagged_relation_tooltip": "Wybierz typ obiektu, który opisuje czym jest ta relacja.",
-            "many_deletions": "Usuwasz aż {n} obiektów! Czy na pewno chcesz to zrobić? Tym sposobem trwale usuniesz je z mapy, który wszyscy mogą zobaczyć na openstreetmap.org.",
             "tag_suggests_area": "Znacznik {tag} sugeruje, że linia powinna być obszarem, ale nim nie jest.",
             "deprecated_tags": "Przestarzałe znaczniki: {tags}"
         },
         "help": {
             "title": "Pomoc",
             "key": "H",
-            "help": "# Pomoc\n\nTo jest edytor [OpenStreetMap](http://www.openstreetmap.org/),\nwolnej i edytowalnej mapy świata. Możesz go używać do dodawania i\naktualizacji danych w twoim rejonie, czyniąc otwartą mapę świata lepszą\ndla każdego.\n\nModyfikacje wprowadzone na tej mapie będą widoczne dla wszystkich\nkorzystających z OpenStreetMap. Aby wprowadzić modyfikacje,\nmusisz się [zalogować](https://www.openstreetmap.org/login).\n\n[Edytor iD](http://ideditor.com/) jest projektem społecznościowym z\n[kodem dostępnym na GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Edytowanie i zapisywanie\n\nTen edytor został zaprojektowany do pracy online i korzystasz z niego teraz poprzez stronę internetową.\n\n### Wybieranie obiektów\n\nAby wybrać obiekt na mapie, taki jak droga czy POI, kliknij na nim. Spowoduje to podświetlenie wybranego obiektu, otwarcie panelu z informacjami o nim i wyświetlenie menu z działaniami, jakie możesz wykonać na obiekcie.\n\nAby wybrać wiele obiektów na raz, naciśnij i trzymaj klawisz 'Shift'. Następnie klikaj na obiektach, które chcesz wybrać, lub trzymając wciśnięty lewy przycisk myszy z jednoczesnym przeciągnięciem zaznacz prostokątem interesujący cię obszar na mapie. Spowoduje to wybranie wszystkich obiektów wewnątrz niego.\n\n### Zapisywanie edycji\n\nGdy wprowadzisz zmiany poprzez edycję dróg, budynków, miejsc itp., są one zapisane lokalnie aż do czasu przesłania ich na serwer. Nie przejmuj się, gdy popełnisz błąd - zmiany możesz wycofać poprzez kliknięcie na przycisku 'Cofnij', i przywrócić cofnięte zmiany poprzez kliknięcie na przycisku 'Ponów'.\n\nKliknij 'Zapisz' by zapisać grupę edycji - na przykład gdy skończyłeś jeden obszar miejscowości i chcesz przejść do edytowania kolejnego. Przed zapisem będzie jeszcze możliwość przejrzenia twoich edycji - edytor w tym zakresie dostarcza pomocnych podpowiedzi oraz ostrzeżeń w sytuacji, gdy coś w zmianach nie wygląda poprawnie.\n\nJeśli wszystko jest dobrze, to po wpisaniu komentarza wyjaśniającego wykonane zmiany, kliknij ponownie 'Zapisz' by wysłać zmiany do [OpenStreetMap.org](http://www.openstreetmap.org/), gdzie staną się one widoczne dla innych użytkowników oraz dostępne dla nich w celach edycji i dalszego uzupełniania mapy.\n\nJeśli nie masz czasu by skończyć rozpoczęte edytowanie, możesz w dowolnej chwili je przerwać poprzez zamknięcie Edytora. Nie musisz przy tym zapisywać zmian, Edytor zapamięta wszystko lokalnie i po powrocie do edytowania (w tej samej przeglądarce i na tym samym komputerze)  zaoferuje przywrócenie twojej pracy.\n\n### Korzystanie z edytora\n\nMożesz zobaczyć listę skrótów klawiaturowych po naciśnięciu klawisza `?`.\n",
-            "roads": "# Drogi\n\nMożesz tworzyć, poprawiać i usuwać drogi używając tego edytora. Drogi mogą różnorodne:\nścieżki, chodniki, ulice, drogi rowerowe i tak dalej - każdy często uczęszczany odcinek drogi powinien dać się prawidłowo przedstawić na mapie.\n\n### Zaznaczanie/wybieranie\n\nKliknij drogę, aby ją wybrać. Obrys powinien stać się widoczny, wraz z małym menu\nnarzędziowym na mapie oraz panelem bocznym pokazującym więcej informacji o drodze.\n\n### Edytowanie\n\nCzęsto zobaczysz drogi, które nie są wyrównane ze zdjęciami satelitarnymi lub śladami GPS.\nMożesz poprawić te drogi tak, aby były we właściwym miejscu.\n\nNajpierw kliknij na drodze, którą chcesz zmienić. Podświetli ją to oraz pokaże punkty kontrolne, które możesz przesunąć w prawidłowe miejsce. Jeżeli chcesz dodać nowe punkty kontrolne, aby droga była bardziej dokładnie pokazana, dwukrotnie kliknij na częśi drogi bez punktu, a dodany zostanie w tym miejscu nowy punkt.\n\nJeżeli droga łączy się z inną drogą, ale na mapie nie jest prawidłowo połączona z nią, możesz\nprzeciągnąć jeden z puntów kontrolnych na drugą drogę w celu ich połączenia. Prawidłowe połączenia dróg są ważne dla mapy i kluczowe dla wyznaczania tras w nawigacji.\n\nMożesz też kliknąć narzędzie 'Przesuń' lub nacisnąć klawisz `M` aby przesunąć jednocześnie całą\ndrogę, a następnie kliknąć ponownie, aby zatwierdzić to przesunięcie.\n\n### Usuwanie\n\nGdy droga jest całkiem błędna - widzisz, że nie istnieje na zdjęciach satelitarnych, a najlepiej gdy wiesz to po sprawdzeniu w terenie, możesz ją usunąć. Uważaj, gdy usuwasz obiekty - jak w przypadku każdej edycji, usunięcie to będzie widoczne dla wszystkich - a wykorzystane zdjęcie satelitarne może nie być aktualne, więc droga mogła zostać po prostu dopiero niedawno zbudowana i dlatego nie widać jej na zdjęciu.\n\nMożesz usunąć drogę wybierając ją kliknięciem, a następnie klikając na ikonie kosza na śmieci lub wciskając klawisz 'Delete'.\n\n### Tworzenie\n\nOkazało się, że gdzieś powinna być droga, ale jej nie ma? Kliknij przycisk 'Linia' w górnym lewym rogu edytora lub naciśnij klawisz '2' na klawiaturze, aby zacząć rysować linię.\n\nKliknij w miejscu, w którym zaczyna się droga, aby zacząć rysować. Jeżeli droga odchodzi od już istniejącej, zacznij rysowanie poprzez kliknięcie w miejscu, w którym się łączą.\n\nNastępnie klikaj wzdłuż drogi tworząc nowe punkty, tak, aby przebieg rysowanej drogi odpowiadał temu widocznemu na zdjęciach satelitarnych lub ścieżce GPS. Jeżeli droga, którą rysujesz, krzyżuje się z inną, połącz je, klikając na punkcie ich przecięcia. Gdy skończysz rysować, dwukrotnie kliknij ostatni punkt lub naciśnij klawisz 'Enter' na klawiaturze.\n",
-            "gps": "# GPS\n\nZebrane ślady GPS są ważnym źródłem danych dla OpenStreetMap. Ten edytor pozwala na użycie lokalnych śladów - plików \".gpx\" z twojego komputera. Możesz je zbierać za pomocą aplikacji na smartfony, jak również dedykowanych odbiorników GPS.\n\nBy uzyskać więcej informacji jak wykonać pomiar GPS, przeczytaj [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nBy użyć śladu GPX do mapowania, przeciągnij i upuść plik GPX na mapę edytora. Jeśli zostanie on rozpoznany, pojawi się na niej jako jasno-purpurowa linia. Kliknij na \"Dane mapy\" po prawej stronie by włączyć, wyłączyć lub przybliżyć widok mapy do miejsca w którym pojawił się ślad.\n\nSam ślad nie jest bezpośrednio zapisywany na serwerach OpenStreetMap - najlepszym sposobem na wykorzystanie go jest rysowanie mapy na jego podstawie; możesz także [wysłać go na serwery OpenStreetMap](http://www.openstreetmap.org/trace/create)\npozwalając tym samym innym użytkownikom na korzystanie z niego.\n",
-            "imagery": "# Zdjęcia\n\nZdjęcia lotnicze/satelitarne są ważną pomocą w rysowaniu map. Kolekcja zdjęć lotniczych,\nsatelitarnych i innych z wolnodostępnych źródeł jest dostępna w edytorze w menu po prawej stronie jako przycisk 'Ustawienia tła'.\n\nDomyślnie dla Polski wyświetlana jest ortofotomapa 'Geoportal.gov.pl' wykonana ze zdjęć lotniczych. Poza krajem domyślną mapą są zdjęcia satelitarne [Bing Maps](http://www.bing.com/maps/), jednak w zależności od kraju mogą być też dostępne inne, lepsze zdjęcia. Niektóre kraje, np. Stany Zjednoczone, Francja czy Dania mają w pewnych miejscach dostępne zdjęcia bardzo wysokiej jakości.\n\nZdjęcia są czasem przesunięte względem danych na mapie z powodu braku ich kalibracji przez dostawcę zdjęć. Jeżeli widzisz dużo dróg przesuniętych względem tła, nie przesuwaj ich od razu w prawidłowe miejsce. Zamiast tego skoryguj przesunięcie zdjęć tak, aby zgadzały się z istniejącymi danymi, przez kliknięcie na 'Przesunięcie warstwy tła' na dole Ustawień tła.\n",
-            "addresses": "# Adresy\n\nAdresy są jedną z najbardziej użytecznych informacji na mapie.\n\nChociaż adresy są często reprezentowane jako części ulic, w OpenStreetMap są one\nzapisywane jako atrybuty budynków i miejsc wzdłuż ulicy.\n\nMożesz dodać nową informację adresową do obrysów budynków oraz do pojedynczych punktów. Pożądanym źródłem danych adresowych jest zwykle zwiedzanie okolicy\nlub własna wiedza. Tak jak w przypadku każdego innego obiektu, kopiowanie danych z komercyjnych źródeł takich jak Google Maps jest zabronione.\n",
-            "inspector": "#Korzystanie z Edytora Obiektu\n\nEdytor Obiektu jest to panel po lewej stronie, który umożliwa edycję szczegółów wybranego obiektu.\n\n### Wybór rodzaju obiektu\n\nGdy dodasz punkt, linię lub obszar, możesz wybrać jakim rodzajem obiektu on jest. Na przykład czy jest to autostrada czy droga osiedlowa, supermarket czy kafejka. Edytor Obiektu pokaże propozycje najczęściej występujących rodzajów obiektów, ale możesz też wyszukać inne poprzez wpisanie w polu wyszukiwania nazwy tego, czego szukasz.\n\nKliknij \"i\" w prawej części przycisku z nazwą danego rodzaju obiektu by dowiedzieć się więcej. Kliknij przycisk by oznaczyć wybrany obiekt jako obiekt danego rodzaju.\n\n\n### Korzystanie z formularzy oraz edycja znaczników\n\nPo tym jak wybierzesz rodzaj obiektu lub gdy zaznaczysz obiekt, który już ma określony rodzaj, Edytor Obiektu wyświetli zestaw pól z informacjami o obiekcie, takimi jak nazwa czy adres.\n\nPoniżej tych pól możesz kliknąć na listę rozwijalną \"Dodaj pole\" i użyć jej do dodania innych informacji, takich jak link do Wikipedii, dostęp dla wózków inwalidzkich i kilku innych.\n\nNa samym dole Edytora Obiektu możesz dodać dowolne znaczniki do wybranego obiektu poprzez kliknięcie na \"Wszystkie znaczniki\". [Taginfo](http://taginfo.openstreetmap.org/) jest wspaniałym narzędziem do poznania popularnych zestawów znaczników.\n\nZmiany, które zrobisz przy użyciu Edytora Obiektu, są automatycznie pokazywane na mapie.\nMożesz cofnąć każdą zmianę klikając przycisk \"Cofnij\".\n",
-            "buildings": "# Budynki\n\nOpenStreetMap jest największą na świecie bazą budynków. Możesz przyczynić się do rozwoju tej bazy.\n\n### Zaznaczanie/wybieranie\n\nMożesz wybrać budynek poprzez kliknięcie na jego obwodzie. Podświetli\nto obiekt i wyświetli panel boczny zawierający informacje o budynku.\nKlikając prawym klawiszem myszy dodatkowo otworzysz małe menu narzędziowe.\n\n### Edytowanie\n\nZdarza się, że budynki są umieszczone w nieprawidłowych miejscach lub mają nieodpowiednie znaczniki.\n\nAby przesunąć cały budynek, wybierz go i naciśnij klawisz 'M' lub wybierz go klikając prawym klawiszem myszy i kliknij na narzędzie \"Przesuń\". Przesuwając myszą zmieniasz pozycję budynku. Gdy będzie już w odpowiednim miejscu  i będzie miał odpowiedni kształt, kliknij dla zatwierdzenia zmiany.\n\nAby poprawić kształt budynku, kliknij i przeciągnij węzły, które tworzą obwód\nobiektu, w prawidłowe miejsce.\n\n### Tworzenie\n\nJednym z głównych problemów związanych z budynkami jest to,\nże OpenStreetMap pozwala na zapisywanie budynki zarówno w postaci punktów jak i obszarów.\nPodstawową zasadą jest rysowanie budynków w postaci obszarów, a rysowanie\nPOI, firm, sklepów czy innej infrastruktury w postaci punktów wewnątrz budynku.\n\nZacznij rysować budynek w postaci obszaru przez kliknięcie przycisku 'Obszar'\nna górze edytora i zakończ rysowanie przez naciśnięcie klawisza 'Enter'\nna klawiaturze lub przez kliknięcie na pierwszym narysowanym punkcie.\n\n### Usuwanie\n\nJeżeli budynek jest całkiem błędny - widzisz, że nie istnieje na zdjęciach satelitarnych, a najlepiej gdy wiesz to po sprawdzeniu w terenie, możesz go usunąć. Uważaj, gdy usuwasz obiekty - jak w przypadku każdej edycji, usunięcie to będzie widoczne dla wszystkich - a wykorzystane zdjęcie satelitarne może nie być aktualne, więc budynek mógł zostać po prostu dopiero niedawno zbudowany i dlatego nie widać go na zdjęciu.\n\nUsuń budynek poprzez wybranie go kliknięciem,  a następnie kliknij na ikonie\nkosza na śmieci lub naciśnij klawisz 'Delete'.\n",
-            "relations": "# Relacje\n\nRelacja to specjalny rodzaj obiektu w OpenStreetMap, który grupuje razem\ninne obiekty. Na przykład dwa powszechne rodzaje relacji to *relacje trasy*\nktóre grupują odcinki drogi należące do konkretnej autostrady lub drogi oraz\n*wielokąty* łączące razem kilka linii, które definiują bardziej złożony obszar\n(na przykład las z polaną w środku).\n\nKażdy obiekt w relacji nazywany jest *członkiem*. W panelu bocznym możesz\nzobaczyć do jakich relacji należy obiekt, i kliknąć na relacji by ją wybrać. Gdy relacja\njest wybrana, listę jej wszystkich członków zobaczysz w panelu bocznym, zostanę oni jednocześnie podświetlone na mapie.\n\nPrzeważnie edytor iD automatycznie pilnuje relacji podczas twoich edycji.\nMusisz jednak pamiętać, że jeśli usuwasz jakiś fragment linii,  np. aby\ndokładniej go narysować, sprawdź wcześniej do jakich relacji należy oraz\njakie pełni w nich role. Po narysowaniu nowej linii dodaj ją do tych relacji w tych samych rolach.\n\n## Edycja relacji\n\nJeśli chcesz edytować relacje, oto podstawy wiedzy.\n\nBy dodać obiekt do relacji, wybierz obiekt i kliknij przycisk \"+\" w sekcji \"Wszystkie relacje\" na panelu bocznym, i wybierz relację lub wpisz jej nazwę.\n\nBy utworzyć nową relację, zaznacz pierwszy obiekt, który ma być członkiem\nrelacji i kliknij przycisk \"+\" w sekcji \"Wszystkie relacje\" i wybierz \"Nowa relacja...\"\n\nBy usunąć obiekt z relacji, zaznacz obiekt i kliknij ikonkę kosza na śmieci obok\nrelacji, z której chcesz go usunąć.\n\nMożesz stworzyć wielokąt złożony z otworami używając narzędzia \"Scalanie\".\nNarysuj dwa obszary, jeden znajdujący się wewnątrz drugiego. Wybierz oba przytrzymując klawisz Shift i klikając na nich. Naciśnij klawisz skrótu 'C' lub kliknij prawym klawiszem myszy na którymś z tych obiektów by wyświetlić menu narzędziowe. Wybierz w nim przycisk \"+\" (\"Scalanie\").\n\n"
+            "help": {
+                "title": "Pomoc",
+                "welcome": "Witaj w edytorze iD dla [OpenStreetMap](https://www.openstreetmap.org/). Dzięki temu edytorowi możesz aktualizować OpenStreetMap wprost ze swojej przeglądarki internetowej.",
+                "open_data_h": "Otwarte dane",
+                "open_data": "Modyfikacje wprowadzone na tej mapie będą widoczne dla wszystkich korzystających z OpenStreetMap. Twoje edycje mogą wynikać z posiadanej wiedzy, oględzin terenu lub ze zdjęć, w tym lotniczych bądź satelitarnych. Kopiowanie ze źródeł komercyjnych takich jak Google Maps [jest zabronione](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Zanim zaczniesz",
+                "before_start": "Zapoznaj się z OpenStreetMap i tym edytorem zanim zaczniesz edytowanie. iD zawiera samouczek uczący podstaw edytowania OpenStreetMap. Kliknij na \"Rozpocznij samouczek\" na tym ekranie by rozpocząć naukę - trwa ona tylko 15 minut.",
+                "open_source_h": "Otwarte oprogramowanie",
+                "open_source": "Edytor iD to projekt społecznościowy o otwartym oprogramowaniu i korzystasz teraz z wersji {version}. Kod źródłowy jest dostępny  [na GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Możesz pomóc w rozwoju iD poprzez [tłumaczenie](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) lub poprzez [zgłaszanie błędów](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Przegląd",
+                "navigation_h": "Nawigacja",
+                "navigation_drag": "Możesz przeciągnąć mapę, naciskając i przytrzymując {leftclick} lewym przyciskiem myszy i poruszając myszą. Możesz także użyć klawiszy strzałek `↓ ',` ↑ `,` ← `,` → `na klawiaturze.",
+                "navigation_zoom": "Możesz powiększać i pomniejszać obraz, przewijając kółkiem myszy lub trackpadem, albo klikając przyciski {plus} / {minus} wzdłuż boku mapy. Możesz także użyć klawiszy `+`, `-` na klawiaturze.",
+                "features_h": "Właściwości mapy",
+                "nodes_ways": "W OpenStreetmap punkty są czasami nazywane * węzłami *, a linie i obszary są czasami nazywane * drogami *."
+            },
+            "editing": {
+                "title": "Edytowanie i zapisywanie",
+                "select_h": "Wybierz",
+                "multiselect_h": "wielokrotny wybór",
+                "undo_redo_h": "Cofnij & Wykonaj ponowniep",
+                "save_h": "Zapisz",
+                "upload_h": "Wyślij",
+                "backups_h": "Automatyczne kopie zapasowe",
+                "keyboard_h": "Skróty klawiszowe"
+            },
+            "feature_editor": {
+                "fields_h": "Pola",
+                "tags_h": "Znaczniki"
+            },
+            "points": {
+                "title": "Punkty",
+                "add_point_h": "Dodawanie punktów",
+                "move_point_h": "Przesuwanie punktów",
+                "delete_point_h": "Usuwanie punktów"
+            },
+            "lines": {
+                "title": "Linie",
+                "add_line_h": "Dodawanie linii",
+                "modify_line_h": "Modyfikowanie linii",
+                "connect_line_h": "Łączenie linii",
+                "disconnect_line_h": "Odłączanie linii",
+                "move_line_h": "Przesuwanie linii",
+                "delete_line_h": "Usuwanie linii"
+            },
+            "areas": {
+                "title": "Obszary"
+            },
+            "relations": {
+                "title": "Relacje",
+                "route_h": "Trasy",
+                "boundary_h": "Granice"
+            },
+            "imagery": {
+                "title": "Zdjęcia podkładów tła",
+                "sources_h": "Żródła zdjęć"
+            },
+            "streetlevel": {
+                "title": "Zdjęcia uliczne"
+            },
+            "gps": {
+                "title": "Ślady GPS",
+                "intro": "Zebrane ślady GPS są ważnym źródłem danych dla OpenStreetMap. Ten edytor pozwala na użycie lokalnych śladów - plików *.gpx*, *.geojson* oraz *.kml* z twojego komputera. Możesz je zbierać za pomocą smartfona, zegarka sportowego lub innych odbiorników GPS.",
+                "survey": "By uzyskać więcej informacji jak wykonać pomiar GPS, przeczytaj [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "Korzystanie ze śladu GPS",
+                "using": "By użyć śladu GPS do mapowania, przeciągnij i upuść plik GPX na mapę edytora. Jeśli zostanie on rozpoznany, pojawi się na niej jako jasno-purpurowa linia. Kliknij na {data} **Dane mapy** po prawej stronie by włączyć, wyłączyć lub przybliżyć widok twojego śladu GPS.",
+                "tracing": "Ślad GPS nie jest bezpośrednio zapisywany na serwerach OpenStreetMap - najlepszym sposobem na wykorzystanie go jest rysowanie mapy na jego podstawie.",
+                "upload": "Możesz także wysłać [swój ślad GPS na serwery OpenStreetMap](https://www.openstreetmap.org/trace/create), pozwalając tym samym innym użytkownikom na korzystanie z niego."
+            }
         },
         "intro": {
             "done": "gotowe",
             },
             "areas": {
                 "title": "Obszary",
-                "add_playground": "*Obszary* służą do wyznaczania granic dla takich obiektów jak jeziora, budynki czy osiedla mieszkaniowe.{br}Mogą również zostać użyte do mapowania wielu obiektów, które zwykle przedstawiane są za pomocą punktów. **Kliknij na {button} Obszar, by dodać nowy obszar.**",
                 "start_playground": "Umieść plac zabaw na mapie poprzez narysowanie go jako obszaru. Obszary są rysowane poprzez umieszczanie \"węzłów\" wzdłuż zewnętrznego brzegu obiektu. **Kliknij lub naciśnij Spację i umieść punkt początkowy w jednym z rogów placu zabaw..**",
                 "continue_playground": "Dalej rysuj obszar, umieszczając więcej punktów wzdłuż brzegu placu zabaw. Możesz przy tym łączyć obszar z już istniejącymi ścieżkami. {br}Podpowiedź: jeśli będziesz trzymać wciśnięty klawisz 'Alt', tworzone węzły nie zostaną połączone do już istniejących obiektów. **Narysuj cały obszar placu zabaw.**",
                 "finish_playground": "Zakończ rysowanie obszaru poprzez naciśnięcie Enter lub poprzez ponowne kliknięcie na pierwszym lub ostatnim punkcie. **Zakończ rysowanie obszaru placu zabaw.**",
                     "title": "Wybieranie obiektów",
                     "select_one": "Wybierz jeden obiekt",
                     "select_multi": "Wybierz wiele obiektów",
-                    "lasso": "Wybierz obiekty lassem"
+                    "lasso": "Wybierz obiekty lassem",
+                    "search": "Znajdź funkcje pasujące do wyszukanego tekstu"
                 },
                 "with_selected": {
                     "title": "Z wybranym obiektem",
                         },
                         "dismount": {
                             "description": "Dostęp dozwolony tylko, gdy kierujący/jeździec zsiądzie z pojazdu/zwierzęcia",
-                            "title": "Zsiądź z konia/pojazdu"
+                            "title": "Zejdź z roweru i go poprowadź"
                         },
                         "no": {
                             "description": "Niedostępne dla ogólnego ruchu",
                     "label": "Typ"
                 },
                 "cables": {
+                    "label": "Kable",
                     "placeholder": "1, 2, 3..."
                 },
                 "camera/direction": {
                     "label": "Pojemność",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Kierunek",
-                    "options": {
-                        "E": "Wschód",
-                        "ENE": "Wschodni północny wschód",
-                        "ESE": "Wschodni południowy wschód",
-                        "N": "Północ",
-                        "NE": "Północny wschód",
-                        "NNE": "Północny północny wschód",
-                        "NNW": "Północny północny zachód",
-                        "NW": "Północny zachód",
-                        "S": "Południe",
-                        "SE": "Południowy wschód",
-                        "SSE": "Południowy południowy wschód",
-                        "SSW": "Południowy południowy zachód",
-                        "SW": "Południowy zachód",
-                        "W": "Zachód",
-                        "WNW": "Zachodni północny zachód",
-                        "WSW": "Zachodni południowy zachód"
-                    }
-                },
                 "castle_type": {
                     "label": "Typ"
                 },
-                "clock_direction": {
-                    "label": "Kierunek",
-                    "options": {
-                        "anticlockwise": "Przeciwnie do wskazówek zegara",
-                        "clockwise": "Zgodnie ze wskazówkami zegara"
-                    }
-                },
                 "clothes": {
                     "label": "Ubrania"
                 },
                 "diaper": {
                     "label": "Dostępny przewijak dla dzieci"
                 },
+                "direction": {
+                    "label": "Kierunek (Stopnie)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Kierunek świata",
+                    "options": {
+                        "E": "Wschód",
+                        "ENE": "Wschodni północny wschód",
+                        "ESE": " wschodni południowy wschód",
+                        "N": "Północ",
+                        "NE": "Północny wschód",
+                        "NNE": "Północny północny wschód",
+                        "NNW": "Północny północny zachód",
+                        "NW": "Północny zachód",
+                        "S": "Południe",
+                        "SE": "Południowy wschód",
+                        "SSE": "Południowy południowy wschód",
+                        "SSW": "Południowy południowy zachód",
+                        "SW": "Południowy zachód",
+                        "W": "Zachód",
+                        "WNW": "Zachodni północny zachód",
+                        "WSW": "Zachodni południowy zachód"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Kierunek",
+                    "options": {
+                        "anticlockwise": "Przeciwnie do wskazówek zegara",
+                        "clockwise": "Zgodnie ze wskazówkami zegara"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Kierunek",
+                    "options": {
+                        "backward": "Wstecz",
+                        "both": "W obu/wszystkich kierunkach",
+                        "forward": "Na przód"
+                    }
+                },
                 "display": {
                     "label": "Typ wyświetlacza"
                 },
                 "memorial": {
                     "label": "Rodzaj"
                 },
-                "milestone_position": {
-                    "label": "Pozycja słupka pikietażowego",
-                    "placeholder": "Odległość do jednego miejsca po przecinku (123,4)"
+                "monitoring_multi": {
+                    "label": "Monitoring"
                 },
                 "mtb/scale": {
                     "label": "Skala trudności dla rowerów górskich",
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Kierunek",
-                    "options": {
-                        "backward": "Do tyłu",
-                        "forward": "Do przodu"
-                    }
-                },
                 "park_ride": {
                     "label": "Parkuj i jedź"
                 },
                 "railway": {
                     "label": "Typ"
                 },
+                "railway/position": {
+                    "label": "Słupek pikietażu kolejowego",
+                    "placeholder": "Odległość do jednego miejsca po przecinku (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Kierunek",
+                    "options": {
+                        "backward": "Do tyłu",
+                        "forward": "Do przodu"
+                    }
+                },
                 "rating": {
                     "label": "Moc"
                 },
                 "recycling_accepts": {
                     "label": "Przyjmuje"
                 },
-                "recycling_type": {
-                    "label": "Rodzaj recyklingu",
-                    "options": {
-                        "centre": "Miejsce recyklingu",
-                        "container": "Kontener"
-                    }
-                },
                 "ref": {
                     "label": "Kod referencyjny"
                 },
+                "ref/isil": {
+                    "label": "Kod ISIL"
+                },
                 "ref_aeroway_gate": {
                     "label": "Numer bramki"
                 },
                 "traffic_signals": {
                     "label": "Rodzaj"
                 },
+                "traffic_signals/direction": {
+                    "label": "Kierunek",
+                    "options": {
+                        "backward": "Do tyłu",
+                        "forward": "Do przodu"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Widoczność szlaku",
                     "options": {
                         "auto": "Autotransformator",
                         "auxiliary": "Potrzeb własnych",
                         "converter": "Przekształtnik",
+                        "distribution": "Dystrybutor",
+                        "generator": "Generator",
+                        "phase_angle_regulator": "Regulator przesunięcia fazowego",
                         "traction": "Trakcyjny",
                         "yes": "Nieznany"
                     }
                     "terms": "Wyrwirączka"
                 },
                 "aerialway/station": {
-                    "name": "Stacja wyciagu narciarskiego",
-                    "terms": "Stacja wyciągu"
+                    "name": "Stacja wyciagu narciarskiego"
                 },
                 "aerialway/t-bar": {
                     "name": "Wyciag orczykowy podwójny",
                     "terms": "wymiana walut"
                 },
                 "amenity/bus_station": {
-                    "name": "Dworzec autobusowy",
-                    "terms": "Przystanek autobusowy"
+                    "name": "Dworzec autobusowy"
                 },
                 "amenity/cafe": {
                     "name": "Kawiarnia",
                     "terms": "kawa,herbata,kawiarnia"
                 },
+                "amenity/car_pooling": {
+                    "name": "Carpooling"
+                },
                 "amenity/car_rental": {
                     "name": "Wypożyczalnia samochodów",
                     "terms": "wypożyczalnia samochodów"
                     "terms": "kebab, hot dog, fast food, McDonald's, McDonald, bar"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal promowy",
-                    "terms": "prom"
+                    "name": "Terminal promowy"
                 },
                 "amenity/fire_station": {
                     "name": "Remiza strażacka",
                     "terms": "straż rezerwatu, straż parku narodowego"
                 },
                 "amenity/recycling": {
-                    "name": "Recykling",
-                    "terms": "Przetwarzanie odpadów, utylizacja, recyklizacja"
+                    "name": "Kontener do recyclingu",
+                    "terms": "utylizacja, recyklizacja, recycling"
                 },
                 "amenity/recycling_centre": {
                     "name": "Centrum przetwarzania odpadów (recycling)",
                 "building/entrance": {
                     "name": "Wejście/wyjście"
                 },
+                "building/farm": {
+                    "name": "Budynek wiejski"
+                },
                 "building/garage": {
                     "name": "Garaż",
                     "terms": "garaż"
                     "name": "Budynek przedszkola",
                     "terms": "budynek przedzkolny"
                 },
+                "building/mosque": {
+                    "name": "Budynek meczetu",
+                    "terms": "meczet"
+                },
                 "building/public": {
                     "name": "Budynek publiczny",
                     "terms": "budynek użyteczności publicznej"
                     "name": "Zadaszenie",
                     "terms": "dach,zadaszenia,wiata"
                 },
+                "building/ruins": {
+                    "name": "Ruiny budynku"
+                },
                 "building/school": {
                     "name": "Budynek szkolny",
                     "terms": "budynek szkoły, szkoła"
                     "name": "Bliźniak",
                     "terms": "Dom bliźniaczy"
                 },
+                "building/service": {
+                    "name": "Budynek techniczny"
+                },
                 "building/shed": {
                     "name": "Szopa",
                     "terms": "wiata"
                     "name": "Stajnia",
                     "terms": "stajnie"
                 },
+                "building/stadium": {
+                    "name": "Budynek stadionu"
+                },
                 "building/static_caravan": {
                     "name": "Przyczepa/wóz kempingowy ustawiony na stałe",
                     "terms": "mieszkalny wóz kempingowy"
                 },
+                "building/temple": {
+                    "name": "Budynek świątyni"
+                },
                 "building/terrace": {
                     "name": "Domki szeregowe",
                     "terms": "szeregówki"
                 "building/train_station": {
                     "name": "Budynek dworca kolejowego"
                 },
+                "building/transportation": {
+                    "name": "Budynek stacji"
+                },
                 "building/university": {
                     "name": "Budynek uczelni wyższej",
                     "terms": "uniwersytet, szkoła wyższa, wydział, uczelnia"
                     "name": "Miejsce na Kempingu",
                     "terms": "miejsce na namiot"
                 },
+                "circular": {
+                    "name": "Rondo"
+                },
                 "club": {
                     "name": "Klub",
                     "terms": "klub,imprezownia"
                     "terms": "jazda konna,szlak jeździecki,szlak konny"
                 },
                 "highway/bus_stop": {
-                    "name": "Przystanek autobusowy",
-                    "terms": "przystanek,stacja,postój"
+                    "name": "Przystanek autobusowy / platforma"
                 },
                 "highway/corridor": {
                     "name": "Korytarz (w budynku)",
                 },
                 "landuse/construction": {
                     "name": "Obszar budowy",
-                    "terms": "terern budowy"
+                    "terms": "teren budowy,budowa"
                 },
                 "landuse/farm": {
                     "name": "Użytki rolne"
                     "terms": "las,drzewa"
                 },
                 "landuse/garages": {
-                    "name": "Garaże",
-                    "terms": "garaże"
+                    "name": "Obszar z garażami"
                 },
                 "landuse/grass": {
                     "name": "Trawa",
                     "name": "Teren niezabudowany",
                     "terms": "teren niezabudowany"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Obszar zajęty przez szklarnie/tunele"
+                },
                 "landuse/harbour": {
                     "name": "Port morski",
                     "terms": "port morski,port"
                     "name": "Obszar przemysłowy",
                     "terms": "Teren przemysłowy"
                 },
+                "landuse/industrial/scrap_yard": {
+                    "name": "Stacja demontażu pojazdów"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Rzeźnia",
+                    "terms": "rzeźnia, ubojnia"
+                },
                 "landuse/landfill": {
                     "name": "Wysypisko",
                     "terms": "składowisko odpadów,śmieci"
                     "name": "Przyrządy do ćwiczeń",
                     "terms": "siłownia zewnętrzna"
                 },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "Równoważnia"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "Step"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "Drążek do podciągania"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "name": "Drabinka gimnastyczna pozioma"
+                },
+                "leisure/fitness_station/hyperextension": {
+                    "name": "Stanowisko ćwiczeń mięśni pleców"
+                },
+                "leisure/fitness_station/parallel_bars": {
+                    "name": "Poręcze do dipów"
+                },
+                "leisure/fitness_station/push-up": {
+                    "name": "Stanowisko do pompek"
+                },
+                "leisure/fitness_station/rings": {
+                    "name": "Kółka gimnastyczne"
+                },
+                "leisure/fitness_station/sign": {
+                    "name": "Instrukcja stanowiska do ćwiczeń"
+                },
+                "leisure/fitness_station/sit-up": {
+                    "name": "Stanowisko do brzuszków"
+                },
                 "leisure/garden": {
                     "name": "Ogród",
                     "terms": "ogród"
                     "name": "Maszt",
                     "terms": "Wieża radiowa, maszt"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Stacja monitoringu",
+                    "terms": "stacja monitoringu, pomiary"
+                },
                 "man_made/observation": {
                     "name": "Wieża obserwacyjna",
                     "terms": "wieża obserwacyjna"
                     "terms": "biuro rachunkowe, księgowy"
                 },
                 "office/administrative": {
-                    "name": "Biuro samorządowe",
-                    "terms": "Urząd"
+                    "name": "Biuro samorządowe"
                 },
                 "office/adoption_agency": {
                     "name": "Ośrodek adopcyjny",
                     "name": "Architekt",
                     "terms": "studio architektoniczne, biuro architektoniczne, pracownia architektoniczna"
                 },
+                "office/association": {
+                    "name": "Biuro Organizacji non-profit"
+                },
+                "office/charity": {
+                    "name": "Organizacja Charytatywna"
+                },
                 "office/company": {
-                    "name": "Biuro prywatnego przedsiębiorstwa",
-                    "terms": "biuro firmy, biuro zakładu, biuro fabryki"
+                    "name": "Biuro firmy"
                 },
                 "office/coworking": {
                     "name": "Centrum coworkingowe",
                     "name": "Agencja zatrudnienia",
                     "terms": "Agencja pracy, pośredniak, pośredniak, biuro pośrednictwa pracy, praca tymczasowa, pośrednictwo pracy"
                 },
+                "office/energy_supplier": {
+                    "name": "Biuro dostawcy energii."
+                },
                 "office/estate_agent": {
                     "name": "Biuro nieruchomości",
                     "terms": "biuro nieruchomości, agent nieruchomości"
                     "name": "Biuro finansowe",
                     "terms": "agent finansowy"
                 },
+                "office/forestry": {
+                    "name": "Leśnictwo"
+                },
+                "office/foundation": {
+                    "name": "Biuro fundacji"
+                },
                 "office/government": {
                     "name": "Biuro rządowe lub samorządowe",
                     "terms": "urząd, urzędnik"
                     "terms": "prawnik, kancelaria, adwokat, radca"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notariusz",
-                    "terms": "sekretarz,akt,majątek"
+                    "name": "Notariusz"
                 },
                 "office/moving_company": {
                     "name": "Biuro firmy przeprowadzkowej",
                     "name": "Prywatny detektyw",
                     "terms": "prywatny detektyw"
                 },
+                "office/quango": {
+                    "name": "Biuro organizacji prawie pozarządowej"
+                },
                 "office/research": {
                     "name": "Biuro badawcze",
                     "terms": "instytut badawczy"
                     "name": "Podstacja",
                     "terms": "podstacja energetyczna"
                 },
+                "power/switch": {
+                    "name": "Przełącznik wysokiego napięcia"
+                },
                 "power/tower": {
                     "name": "Wieża wysokiego napięcia",
                     "terms": "wieża HV"
                     "name": "Transformator",
                     "terms": "transformator"
                 },
-                "public_transport/platform": {
-                    "name": "Miejsce oczekiwania",
-                    "terms": "peron, przystanek"
+                "public_transport/station_subway": {
+                    "name": "Stacja metra"
+                },
+                "public_transport/station_train": {
+                    "name": "Stacja kolejowa pasażerska",
+                    "terms": "stacja kolejowa pasażerska"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Przystanek kolejowy",
+                    "terms": "przystanek kolejowy"
+                },
+                "public_transport/station_tram": {
+                    "name": "Stacja tramowajowa",
+                    "terms": "stacja tramwajowa, dworzec tramwajowy"
                 },
-                "public_transport/stop_position": {
-                    "name": "Miejsce zatrzymania",
-                    "terms": "linia zatrzymania"
+                "public_transport/stop_position_subway": {
+                    "name": "Miejsce zatrzymania się metra",
+                    "terms": "miejsce zatrzymania się metra"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Miejsce zatrzymania się pociągu",
+                    "terms": "miejsce zatrzymania się pociągu"
                 },
                 "railway": {
                     "name": "Kolej"
                     "terms": "funikular, kolejka"
                 },
                 "railway/halt": {
-                    "name": "Przystanek kolejowy",
-                    "terms": "stacja,przystanek,kolej,kolejowa"
+                    "name": "Przystanek kolejowy"
                 },
                 "railway/level_crossing": {
                     "name": "przejazd kolejowy (jezdnia)",
                     "name": "Słupek kilometrowy",
                     "terms": "słupek kilometrowy, pikietaż"
                 },
+                "railway/miniature": {
+                    "name": "Minikolejka",
+                    "terms": "minikolejka"
+                },
                 "railway/monorail": {
                     "name": "Kolej jednoszynowa",
                     "terms": "Kolej jednoszynowa"
                     "terms": "kolej wąskotorowa"
                 },
                 "railway/platform": {
-                    "name": "Peron kolejowy",
-                    "terms": "peron kolejowy"
+                    "name": "Peron kolejowy"
                 },
                 "railway/rail": {
                     "name": "Tor",
                     "terms": "semafor"
                 },
                 "railway/station": {
-                    "name": "Stacja kolejowa, osobowa lub osobowo-towarowa",
-                    "terms": "stacja kolejowa"
+                    "name": "Stacja kolejowa, osobowa lub osobowo-towarowa"
                 },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "Tory tramwajowe"
                 },
                 "railway/tram_stop": {
-                    "name": "Przystanek tramwajowy",
-                    "terms": "przystanek tramwajowy,bana,tramwaj,tram,przystanek,stop"
+                    "name": "Przystanek tramwajowy - miejsce zatrzymania tramwaju"
                 },
                 "relation": {
                     "name": "Relacja",
                     "terms": "biżuteria"
                 },
                 "shop/kiosk": {
-                    "name": "Kiosk z prasą",
-                    "terms": "Kiosk"
+                    "name": "Kiosk",
+                    "terms": "kiosk, gazety"
                 },
                 "shop/kitchen": {
                     "name": "Sklep z wyposażeniem i meblami kuchennymi",
                     "name": "Trasa drogowa",
                     "terms": "trasa drogowa"
                 },
+                "type/route/subway": {
+                    "name": "Trasa metra",
+                    "terms": "trasa metra"
+                },
                 "type/route/train": {
                     "name": "Linia kolejowa",
                     "terms": "trasa pociągów,linia kolejowa"
                 "name": "TIGER Roads 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dane mapy autorzy OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Szlaki rowerowe"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dane mapy autorzy OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Szlaki piesze"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dane mapy autorzy OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Trasy MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dane mapy autorzy OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Szlaki skaterskie"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, dane mapy autorzy OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Szlaki sportów zimowych"
             },
             "basemap.at": {
index 0c7bd93f68da7f852ba5d1e0b6bb184b4e1d1fb7..156746849b444ef7e6c29ff4342b2c2e7e72722d 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Clique para adicionar mais pontos à linha. Clique em outras linhas para conectá-la a elas. Dê um duplo clique para finalizar a linha."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Não pode ser editado pois está conectado a um elemento oculto."
             }
         },
         "operations": {
             "about_changeset_comments": "Sobre comentários do conjunto de alterações",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Você mencionou o Google  neste comentário: lembre-se que a cópia do Google Maps é estritamente proibida.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright/pt"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edições de {users}",
                 "title": "Medição",
                 "selected": "{n} selecionado",
                 "geometry": "Geometria",
-                "closed": "fechado",
+                "closed_line": "linha fechada",
+                "closed_area": "área fechada",
                 "center": "Centro",
                 "perimeter": "Perímetro",
                 "length": "Comprimento",
                 "centroid": "Centróide",
                 "location": "Localização",
                 "metric": "Métrico",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Número de nós"
             }
         },
         "geometry": {
             "title": "Imagem de Fundo",
             "description": "Configurações da imagem de fundo",
             "key": "B",
-            "percent_brightness": "Brilho de {opacity}%",
+            "backgrounds": "Planos de fundo",
             "none": "Nenhum",
             "best_imagery": "Melhor imagem de satélite conhecida para esta localização",
             "switch": "Voltar para este fundo de tela",
             "custom": "Customizado",
             "custom_button": "Editar fundo de tela personalizado",
-            "custom_prompt": "Digite um template de URL de tiles. Tokens válidos são\n- {zoom}/{z}, {x}, {y} para esquema de tiles Z/X/Y\n- {ty} para esquema flipped TMS-style Y coordenada\n - {u} para esquema quadtile\n - {switch:a,b,c} para multiplexação de servidor DNS\n\nExemplo:\n{example}",
-            "fix_misalignment": "Ajustar o deslocamento da imagem de fundo",
-            "imagery_source_faq": "De onde essa imagem de satélite vem?",
+            "overlays": "Sobreposições",
+            "imagery_source_faq": "Informações sobre imagens / Relatar um problema",
             "reset": "redefinir",
-            "offset": "Arraste em qualquer ponto da área cinza abaixo para ajustar o deslocamento da imagem, ou entre com o valor do deslocamento em metros.",
+            "display_options": "Opções de exibição",
+            "brightness": "Brilho",
+            "contrast": "Constraste",
+            "saturation": "Saturação",
+            "sharpness": "Nitidez",
             "minimap": {
-                "description": "Minimapa",
+                "description": "Mostrar minimapa",
                 "tooltip": "Afastar a visualização do mapa para facilitar a localização da área atualmente mostrada.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ajustar o deslocamento da imagem de fundo",
+            "offset": "Arraste em qualquer ponto da área cinza abaixo para ajustar o deslocamento da imagem, ou entre com o valor do deslocamento em metros."
         },
         "map_data": {
             "title": "Dados do Mapa",
             },
             "partial": {
                 "description": "Preenchimento Parcial",
-                "tooltip": "Áreas são desenhas com preenchimento somente dentro de seus limites. (recomendado para mapeadores iniciantes)"
+                "tooltip": "Áreas são desenhadas com preenchimento somente dentro de seus limites. (Recomendado para mapeadores iniciantes)"
             },
             "full": {
                 "description": "Preenchimento Completo",
             "status_code": "O servidor retornou o status {code}",
             "unknown_error_details": "Por favor, verifique sua conexão com a internet.",
             "uploading": "Enviando alterações para o OpenStreetMap...",
+            "conflict_progress": "Verificando conflitos: {num} de {total}",
             "unsaved_changes": "Você tem alterações não salvas.",
             "conflict": {
                 "header": "Resolver edições conflitantes",
             "untagged_area_tooltip": "Selecionar um tipo de elemento que descreva o que esta área é.",
             "untagged_relation": "Relação sem etiquetas",
             "untagged_relation_tooltip": "Selecionar um tipo de elemento que descreva o que esta relação é.",
-            "many_deletions": "Você está excluindo {n} elementos.  Você tem certeza de que quer fazer isso?  Isso irá excluí-los do mapa que todo mundo vê no openstreetmap.org.",
             "tag_suggests_area": "A etiqueta {tag} sugere que seja utilizada numa área, mas essa linha não é uma área",
             "deprecated_tags": "Etiquetas obsoletas: {tags}"
         },
         "help": {
             "title": "Ajuda",
             "key": "H",
-            "help": "# Ajuda\n\nEste é um editor para [OpenStreetMap](http://www.openstreetmap.org/), o mapa mundial livre e editável. Você pode usá-lo para adicionar e atualizar de dados em sua área,  tornando um mapa mundi de código aberto melhor para todos.\n\nAs edições que você fizer nesse mapa serão visíveis para todos que usam OpenStreetMap. Para fazer uma edição você precisará se [identificar](https://www.openstreetmap.org/login).\n\nO [editor iD](http://ideditor.com/) é um projeto colaborativo com o [código fonte disponível no GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editando & Salvando\n\nEste editor foi criado para funcionar primariamente online, e, neste momento, você o está\nacessando através de um website.\n\n### Selecionando Elementos\n\nPara selecionar um elemento do mapa, como uma via ou um ponto de interesse, clique\nclique sobre o elemento no mapa. Isto irá destacar o elemento selecionado, abrir um painel\ncom detalhes sobre ele e exibir um menu de ações que você pode executar no elemento.\n\nPara selecionar múltiplos elementos, segure a tecla 'Shift'. Então clique nos elementos\nque você deseja selecionar, ou arraste o mouse sobre o mapa para desenhar um contorno\nem volta destes elementos. Todos os pontos dentro da área que você desenhou serão\nselecionados.\n\n### Salvando Edições\n\nQuando você faz alterações como editar ruas, prédios e locais, elas são\nguardadas localmente até que você as envie para o servidor. Não se preocupe\nse você cometer algum deslize - você pode desfazer alterações clicando no\nbotão de desfazer e também refazer as alterações clicando no botão de refazer.\nClique em \"Salvar\" para finalizar um conjunto de alterações. Por exemplo, você\ncompletou uma área de uma cidade e gostaria de começar a editar uma outra\nárea. Você terá a chance de revisar o que foi feito até o momento e o editor\nmostrará sugestões e dicas se alguma coisa parecer estar errada com as suas\nalterações.Se tudo parecer estar OK, você pode inserir um breve comentário\nexplicando as mudanças que você fez e clicar em \"Salvar\" de novo para enviar as\nmudanças para o [OpenStreetMap](http://www.openstreetmap.org/), onde elas estarão\nvisíveis para todos os outros usuários. Se você não conseguir concluir uma sessão de\nedição, você pode fechar a janela do editor e voltar mais tarde (no mesmo navegador e\ncomputador) que o editor irá oferecer a possibilidade de restaurar o seu trabalho.\n\n### Usando o editor\n\nVocê pode ver uma lista de atalhos de teclado pressionando a tecla `?`.\n",
-            "roads": "# Vias\n\nVocê pode criar, corrigir e excluir vias com este editor. As vias podem ser de vários tipos:\ncaminhos, estradas, ruas, trilhas, ciclovias e muito mais - qualquer segmento onde pessoas\ncostumam transitar pode ser mapeado.\n\n### Selecionando\n\nClique em uma via para selecioná-la. Um contorno deve tornar-se visível junto ao elemento,\nbem como uma barra lateral mostrando mais informações sobre a estrada. Se você clicar com\no botão direito do mouse, um pequeno menu de ações se abrirá e você poderá aplicá-las na\nvia.\n\n### Modificando\n\nMuitas vezes você vai encontrar vias que não estão alinhadas com as imagens por trás\ndelas ou com uma faixa de GPS. Você pode ajustar estas vias para que elas fiquem no\nlugar certo.\n\nPrimeiro clique no caminho que você deseja alterar. Isso irá destacá-lo e mostrar pontos\nde controle ao longo dela, os quais você pode arrastar para melhorar o desenho da mesma.\nSe o que você deseja é adicionar novos pontos de controle para obter mais detalhes,\nclique duas vezes em uma parte da estrada que necessite de um ponto adicional.\n\nSe a via se conecta a uma outra, mas não está corretamente conectada no\nmapa, você pode arrastar um de seus pontos de controle para a outra estrada a fim de\nconectá-las. Ter vias que se conectam é importante para o mapa e essencial para\npodermos calcular rotas.\n\nVocê também pode clicar com o botão direito e escolher a ferramenta 'Mover' ou\npressionar a tecla 'M' para mover o caminho inteiro de uma vez. Mova o objeto com o\nmouse e, em seguida, clique com o botão esquerdo para salvar o deslocamento.\n\n### Apagando\n\nSe uma via está completamente errada - você pode ver que ela não existe nas imagens\nde satélite e, além disso, ter confirmado localmente que ela não existe - você pode\napagá-la do mapa. Seja cauteloso ao excluir objetos - como em qualquer outra edição,\nos resultados serão vistos por todos, e como as imagens de satélite podem estar\ndesatualizadas, a via pode ter sido construída recentemente.\n\nVocê pode excluir um caminho clicando sobre ele para selecioná-lo e, em seguida,\npressionando a tecla 'Delete'. Ou clicar com o botão direito na via e, em seguida,\nno ícone da lixeira.\n\n### Criando\n\nEncontrou um lugar onde deveria ter uma via, mas não tem? Clique no botão 'Linha' no\ncanto superior esquerdo do editor ou pressione a tecla de atalho '2' para começar a\ndesenhar uma linha.\n\nClique no início da via no mapa para começar a desenhar. Se a via se ramifica de uma\noutra já mapeada, comece clicando sobre o lugar onde elas se conectam.\n\nEm seguida, clique em pontos ao longo da via para que ela siga o caminho certo, de\nacordo com imagens de satélite ou GPS. Se a via que você está desenhando atravessa\numa outra via, conecte-as clicando sobre o ponto de intersecção. Quando você terminar\nde desenhá-la, dê um duplo clique ou pressione 'Return' ou 'Enter' no seu teclado.\n",
-            "gps": "# GPS\n\nOs dados de GPS são as fontes mais confiáveis do OpenStreetMap. Este editor suporta trilhas locais - arquivos '.gpx'. Você pode utilizar aplicativos de celular ou aparelhos de GPS para coletar esse tipo de trilha. Para informações sobre como realizar levantamento com GPS, leia [Mapeando com smartphone, GPS ou papel](http://learnosm.org/pt/mobile-mapping/).\n\nPara usar uma trilha GPX para mapeamento, arraste e solte o arquivo GPX no editor de mapa iD. Caso seja reconhecida, será adicionada ao mapa como linhas roxo-claras. Clique no menu 'Dados do Mapa', no lado direito, para ativar, desativar ou focar o zoom nesta nova camada alimentada pelo GPX.\n\nA trilha GPX não é diretamente enviada ao OpenStreetMap - a melhor maneira para usá-la é desenhar no mapa, usando-a como um guia para os novos elementos que você adicionar, e também [enviá-lo ao OpenStreetMap](http://www.openstreetmap.org/trace/create) para que outros usuários possam usá-la.\n",
-            "imagery": "# Imagens aéreas\n\nAs imagens aéreas são um recurso muito importante para o mapeamento.\nFotos de avião, de satélite e de outras fontes livre estão disponíveis no editor,\nno menu \"Configurações da Imagem de Fundo\" à direita.\n\nPor padrão, as imagens de satélite do [Bing Maps](http://www.bing.com/maps/)\nestão habilitadas no editor, mas ao mover e aproximar o mapa para certas áreas,\nnovas fontes de imagens estarão disponíveis. Alguns países, tais como os EUA, a\nFrança e a Dinamarca, têm imagens aéreas de alta qualidade disponíveis em algumas áreas.\n\nAtenção: as imagens aéreas algumas vezes não batem exatamente com o\nque há em terra, isto é, têm algum deslocamento por causa de algum erro por\nparte de quem as gerou. Se você notar que muitas ruas estão deslocadas\nem comparação com a imagem de fundo, não as alinhe imediatamente com\na imagem. Em vez disso ajuste a imagem para que ela se alinhe com as ruas\natravés da opção \"Ajustar o deslocamento da imagem de fundo\" no final do painel de Configurações da Imagem de Fundo.\n",
-            "addresses": "# Endereços\n\nOs endereços são uma das informações mais úteis do mapa.\n\nApesar de os endereços serem representados como parte de uma rua,\nno OpenStreetMap eles também são gravados como atributos de prédios\ne outros lugares ao longo das ruas.\n\nVocê pode adicionar informações de endereço nos locais mapeados como\nárea de edifícios ou mapeados como pontos. A melhor fonte de informações\nsobre endereços é a que vem de pesquisas de campo ou conhecimento\npessoal do local - assim como qualquer outra informação, copiar de fontes\ncomerciais como o Google Maps é estritamente proibido.\n",
-            "inspector": "# Usando o editor de elementos\n\nO editor de elementos é a seção no lado esquerdo da página que aparece quando um elemento é selecionado e permite que você edite seus detalhes.\n\n### Selecionando um tipo de elemento\n\nDepois de adicionar um ponto, linha ou área, você pode escolher que tipo de elemento ele é, como, por exemplo, se é uma autoestrada ou via residencial, supermercado ou cafeteria. O editor de elementos mostrará sugestões para os tipos de elementos mais comuns, mas você pode encontrar outros digitando o que você procura na caixa de pesquisa.\n\nClique no botão \"i\" no canto direito de um botão de recurso para aprender mais sobre ele. Clique em um botão para alterar o tipo.\n\n### Utilizando formulários e editando etiquetas\n\nDepois de escolher um tipo de elemento, ou quando você seleciona um elemento que já tem um tipo atribuído, o editor de elementos exibe campos com detalhes sobre o elemento, como seu nome e endereço.\n\nAbaixo dos campos que você vê, você pode clicar no menu de \"Adicionar campo:\" para adicionar outras informações, como um link da Wikipédia, acessibilidade para cadeirantes, entre outros.\n\nNa parte inferior do editor de elementos, você pode clicar em 'Etiquetas adicionais' para adicionar outras etiquetas específicas. O [Taginfo](http://taginfo.openstreetmap.org/) é uma excelente ferramenta para aprender mais sobre as combinações de etiquetas mais usadas.\n\nAs alterações feitas no editor de elementos são automaticamente aplicadas ao mapa. Você pode desfazê-las a qualquer momento, clicando no botão 'Desfazer'.\n",
-            "buildings": "# Edifícios\n\nO OpenStreetMap é a maior base de dados de edifícios do mundo. Você pode criar e\nmelhorar esta base de dados.\n\n### Selecionando\n\nVocê pode selecionar um edifício clicando em sua borda. Isto irá destacar\no edifício e abrir uma barra lateral com informações sobre ele. Se você clicar com o\nbotão direito do mouse, será exibido um menu de ações que você poderá executar no\nedifício.\n\n### Modificando\n\nÀs vezes um edifício está no lugar errado ou tem etiquetas erradas.\n\nPara mover um edifício inteiro, selecione-o e pressione o atalho de teclado 'M',\nou clique com botão direito do mouse no mesmo e escolha a ferramenta 'Mover'.\nMova o mouse para deslocar o edifício e clique novamente quando ele\nestiver no local certo.\n\nPara corrigir o formato de um edifício, clique e arraste os pontos que\nformam suas bordas para o lugar apropriado.\n\n### Criando\n\nUma das principais questões sobre adicionar edifícios ao mapa é que o\nOpenStreetMap registra-os tanto como polígonos quanto como pontos. A\nregra geral é _mapeie um edifício como polígono sempre que possível_,\ne mapeie empresas, lojas, serviços, e outros locais que funcionam no\nedifício como pontos dentro do contorno dele.\n\nComece desenhando um edifício como polígono clicando no botão 'Área', no\ncanto superior esquerdo da interface, e finalize pressionando 'Enter' no\nteclado ou clicando no primeiro ponto que você desenhou para fechar o polígono.\n\n### Excluindo\n\nSe um edifício estiver totalmente errado - você vê que ele não está na\nimagem de satélite e também confirmou pessoalmente que ele não existe\n- você pode excluí-lo, removendo-o do mapa. Seja cuidadoso ao remover\ncoisas - assim como em qualquer outra edição, os resultados serão vistos por\ntodos, e as imagens de satélite podem estar desatualizadas, ou seja,\npode ser que o edifício tenha sido construído recentemente.\n\nVocê pode remover um edifício clicando nele para selecioná-lo, e depois\npressionando a tecla 'Delete', ou clicando com o botão direito do mouse no mesmo e,\nem seguida, na ferramenta com o ícone de lixeira.\n"
+            "help": {
+                "title": "Ajuda",
+                "welcome": "Bem-vindo ao editor iD para o [OpenStreetMap](https://www.openstreetmap.org/). Com este editor você pode atualizar o OpenStreetMap diretamente do seu navegador.",
+                "open_data_h": "Dados Abertos",
+                "open_data": "As edições que você fizer neste mapa ficarão visíveis para todos que usam o OpenStreetMap. Suas edições podem ser baseadas em conhecimento pessoa, pesquisa de campo, ou imagens aéreas ou capturadas no solo. Copiar de fontes comerciais, como Google Maps, [é estritamente proibido](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Antes de você começar",
+                "before_start": "Esteja familiarizado com o OpenStreetMap e este editor antes de começar a editar. O iD contém um tutorial para ensinar a você o básico da edição no OpenStreetMap. Clique em \"Comece o tutorial\" nesta tela para aprender - só leva cerca de 15 minutos.",
+                "open_source_h": "Código aberto",
+                "open_source": "O editor iD é um projeto colaborativo com código aberto, e você está usando a versão {version} . O código fonte está disponível [no GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Você pode ajudar [traduzindo](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) o ID ou [reportando erros](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Visão Geral",
+                "navigation_h": "Navegação",
+                "navigation_drag": "Você pode arrastar o mapa movendo o mouse enquanto segura o {leftclick} botão esquerdo. Você também pode usar as setas `↓`, `↑`, `←`, `→` no seu teclado.",
+                "navigation_zoom": "Você pode aproximar ou afastar o zoom rolando a roda do mouse ou touchpad, ou clicando nos botões {plus} / {minus} na lateral do mapa. Você também pode usar as teclas `+` e `-` no seu teclado.",
+                "features_h": "Elementos do Mapa",
+                "features": "Usamos o termo *elementos* para descrever as coisas que aparecem no mapa, como ruas, prédios, ou pontos de interesse. Qualquer coisa na vida real pode ser mapeado como um elemento no OpenStreetMap. Elementos são representados no mapa usando *pontos*, *linhas*, ou *áreas*.",
+                "nodes_ways": "No OpenStreetmap, pontos às vezes são chamados de *nós*, e linhas e áreas às vezes são chamadas de *caminhos*."
+            },
+            "editing": {
+                "title": "Editando e Salvando",
+                "select_h": "Seleção",
+                "select_left_click": "{leftclick} Clique em um elemento para selecioná-lo. Isto vai destacá-lo com um brilho pulsante, e a barra lateral exibirá detalhes sobre o item, como seu nome ou endereço.",
+                "select_right_click": "{rightclick} Clique com o botão direito em um elemento para mostrar o menu de edição, que mostra os comandos disponíveis, como girar, mover e excluir.",
+                "multiselect_h": "Multi-Seleção",
+                "multiselect_shift_click": "Segure `{shift}` e então {leftclick} clique com o botão esquerdo para selecionar vários elementos de uma vez. Isto torna mais fácil mover ou excluir mais de um item.",
+                "multiselect_lasso": "Outra forma de selecionar vários elementos é segurar a tecla `{shift}`, e então pressionar e segurar o {leftclick} botão esquerdo do mouse para desenhar um laço de seleção. Todos os pontos dentro do laço serão selecionados.",
+                "undo_redo_h": "Desfazer e Refazer",
+                "undo_redo": "Suas edições são guardadas localmente no seu navegador até que você decida salvá-las no servidor do OpenStreetMap. Você pode desfazer suas edições clicando no botão {undo} **Desfazer**, e refazê-las clicando no botão {redo} **Refazer**.",
+                "save_h": "Salvar",
+                "save": "Clique em {save} **Salvar** para finalizar suas edições e as enviar ao OpenStreetMap. Lembre-se de salvar seu trabalho com frequência!",
+                "save_validation": "Na tela de Salvar, você terá a chance de revisar o que você editou. O iD realizará também algumas verificações nos dados e poderá oferecer algumas sugestões e avisos, caso alguma coisa não pareça correta.",
+                "upload_h": "Enviar",
+                "upload": "Antes de enviar suas alterações você deve digitar um  [comentário no changeset](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Então clique em **Enviar** para subir sua edição ao OpenStreetMap, onde elas serão mescladas no mapa e estarão visíveis a todos os usuários.",
+                "backups_h": "Backups Automáticos",
+                "backups": "Se você não conseguir finalizar suas edições de uma só vez -- por exemplo, caso seu computador trave ou você feche a aba do navegador --, suas edições ficarão salvas no armazenamento do navegador. Você pode voltar mais tarde (no mesmo navegador e computador) e o iD perguntará se quer continuar de onde parou.",
+                "keyboard_h": "Atalhos de Teclado",
+                "keyboard": "Para ver uma lista de atalhos de teclado, pressione a tecla `?`."
+            },
+            "feature_editor": {
+                "title": "Editor de Elementos",
+                "intro": "O *editor de elementos* aparece junto ao mapa, e permite que você veja e edite todas as informações do elemento selecionado.",
+                "definitions": "A seção no topo mostra o tipo do elemento. A seção no centro mostra os *campos*, que representam atributos de um elemento como seu nome ou endereço.",
+                "type_h": "Tipo de Elemento",
+                "type": "Você pode clicar no tipo do elemento para alterar para um tipo diferente. Tudo que existe no mundo real pode ser adicionado ao OpenStreetMap, então existem milhares de tipos de elementos para escolher.",
+                "type_picker": "O selecionador de tipo mostrará sugestões para os tipos de elementos mais comuns, como parques, hospitais, restaurantes, ruas e edifícios. Você pode pesquisar por qualquer outro elemento, digitando o que você procura na caixa de pesquisa. Clique no botão {inspect} **Informação** próximo ao tipo de elemento para aprender mais sobre ele.",
+                "fields_h": "Campos",
+                "fields_all_fields": "A seção \"Todos os campos\" contém todos os detalhes do elemento que você pode editar. No OpenStreetMap, todos os campos são opcionais, e não tem problema deixar em branco se você não souber.",
+                "fields_example": "Cada tipo de elemento mostrará diferentes campos no formulário. Por exemplo, uma via deve mostrar os campos para superfície e limite de velocidade, mas um restaurante terá campos para tipo de comida que é servida e os horários em que está aberto.",
+                "fields_add_field": "Você também pode clicar no menu de \"Adicionar campo\" para adicionar outras informações, como um link da Wikipédia, acessibilidade para cadeirantes, entre outros.",
+                "tags_h": "Etiquetas",
+                "tags_all_tags": "Abaixo da seção dos campos, você pode expandir a seção \"Todas as etiquetas\" para editar qualquer das *etiquetas* do OpenStreetMap para o elemento selecionado. Cada etiqueta consiste numa *chave* e um *valor*, dados que definem todos os elementos guardados no OpenStreetMap.",
+                "tags_resources": "Editar as etiquetas dos elementos requer conhecimento intermediário sobre o OpenStreetMap. Você deve consultar recursos como a [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) ou [Taginfo](https://taginfo.openstreetmap.org/) para aprender sobre as práticas de etiquetagem aceitas no OpenStreetMap."
+            },
+            "points": {
+                "title": "Pontos",
+                "intro": "*Pontos* podem ser usados para representar elementos como lojas, restaurantes e monumentos. Eles marcam um local específico, e descrevem o que há ali.",
+                "add_point_h": "Adicionando Pontos",
+                "add_point": "Para adicionar um ponto, clique no botão {point} **Ponto** na barra de ferramentas acima do mapa, ou pressione o atalho de teclado `1`. Isto alterará o cursor do mouse para um símbolo de cruz.",
+                "add_point_finish": "Para inserir o novo ponto no mapa, posicione o cursor onde o ponto deverá ficar e então clique com o {leftclick} botão esquerdo do mouse ou pressione a `barra de espaço`.",
+                "move_point_h": "Movendo Pontos",
+                "move_point": "Para mover um ponto, posicione o cursor do mouse sobre o ponto, então pressione e segure o {leftclick} botão esquerdo do mouse enquanto arrasta o ponto para sua nova localização.",
+                "delete_point_h": "Removendo Pontos",
+                "delete_point": "Não há nenhum problema em excluir elementos que não existam no mundo real. Deletar um elemento do OpenStreetMap, remove isso do mapa que todos utilizam. Assim, certifique-se que o elemento realmente não existe mais antes de excluí-lo.",
+                "delete_point_command": "Para deletar um ponto, {rightclick} clique com o botão direito do mouse no mesmo para selecioná-lo e mostrar o menu de edição, então utilize o botão {delete} **Excluir**."
+            },
+            "lines": {
+                "title": "Linhas",
+                "intro": "*Linhas* são utilizadas para representar elementos como ruas, ferrovias e rios. Elas devem ser desenhadas no centro do elemento que elas representam.",
+                "add_line_h": "Adicionando Linhas",
+                "add_line": "Para adicionar uma linha, clique no botão {line} **Linha** na barra de ferramentas acima do mapa ou utilize o atalho de teclado `2`. Isto alterará o cursor do mouse para o símbolo de uma cruz.",
+                "add_line_draw": "Em seguida, posicione o cursor do mouse onde a linha deve começar e clique com o {leftclick} botão esquerdo do mouse ou pressione a tecla `Espaço` para começar a adicionar nós ao longo da linha. Continue a adicionar mais nós clicando ou pressionando `Espaço`. Enquanto desenha, você pode alterar o zoom ou arrastar o mapa de forma a adicionar mais detalhes.",
+                "add_line_finish": "Para terminar uma linha, pressione `{return}` ou clique novamente no último nó.",
+                "modify_line_h": "Modificando Linhas",
+                "modify_line_dragnode": "Frequentemente você verá linhas que não foram desenhadas corretamente, por exemplo uma via que não está de acordo com a imagem de satélite. Para ajustar o desenho da linha, primeiro clique com o {leftclick} botão esquerdo do mouse para selecioná-lo. Todos os nós da linha serão desenhados como pequenos círculos. Você pode então arrastar os nós para locais mais corretos.",
+                "modify_line_addnode": "Você também pode adicionar novos nós ao longo da linha tanto dando um {leftclick}**x2** duplo clique com o botão esquerdo do mouse sobre a linha ou arrastando os pequenos triângulos que aparecem entre os nós já existentes.",
+                "connect_line_h": "Conectando Linhas",
+                "connect_line": "Ter vias conectadas corretamente é imprescindível para que o mapa esteja correto e para que os aplicativos de roteamento funcionem corretamente.",
+                "connect_line_display": "As conexões entre vias aparecem no editor como círculos cinzas. Os pontos finais de uma linha são exibidos como círculos brancos maiores se eles não se conectam a nada.",
+                "connect_line_drag": "Para conectar uma linha a algum outro elemento, arraste um dos nós das linhas a outro elemento até que ambos os elementos estejam unidos. Dica: você pode segurar a tecla `{alt}` caso não deseje que um nó se conecte a outros elementos enquanto o arrasta.",
+                "connect_line_tag": "Se você sabe que um cruzamento tem semáforos ou faixas de pedestre, você pode adicioná-los selecionando o nó do cruzamento e utilizando o editor de elementos para selecionar o tipo correto de elemento.",
+                "disconnect_line_h": "Desconectando Linhas",
+                "move_line_h": "Movendo Linhas",
+                "delete_line_h": "Removendo Linhas"
+            },
+            "areas": {
+                "title": "Áreas",
+                "point_or_area_h": "Pontos ou Áreas",
+                "add_area_h": "Adicionando Áreas",
+                "square_area_h": "Alinhar Cantos",
+                "modify_area_h": "Modificando Áreas",
+                "delete_area_h": "Removendo Áreas"
+            },
+            "relations": {
+                "title": "Relações",
+                "edit_relation_h": "Editando Relações",
+                "maintain_relation_h": "Mantendo Relações",
+                "relation_types_h": "Tipos de Relações",
+                "multipolygon_h": "Multipolígonos",
+                "turn_restriction_h": "Restrições de Manobra",
+                "route_h": "Rotas",
+                "boundary_h": "Fronteiras"
+            },
+            "imagery": {
+                "title": "Imagens de Fundo",
+                "sources_h": "Fontes de Imagens",
+                "offsets_h": "Ajustando o Deslocamento das Imagens de Fundo"
+            },
+            "streetlevel": {
+                "title": "Fotos de Rua",
+                "using_h": "Usando Fotos de Rua"
+            },
+            "gps": {
+                "title": "Traçados de GPS",
+                "survey": "Para informações sobre como coletar dados com GPS, leia [Mapeando com um smartphone, GPS, ou papel](http://learnosm.org/pt/mobile-mapping/).",
+                "using_h": "Usando Traçados de GPS",
+                "tracing": "A trilha GPX não está sendo enviada ao OpenStreetMap - a melhor maneira de usá-la é desenhar no mapa, usando-a como um guia para os novos elementos que você adicionar.",
+                "upload": "Você também pode [enviá-la ao OpenStreetMap](https://www.openstreetmap.org/trace/create) para que outros usuários possam utilizá-la."
+            }
         },
         "intro": {
             "done": "feito",
                 "close_townhall": "**Feche o editor de elementos apertando a tecla Esc ou clicando no botão {button} acima.**",
                 "search_street": "Você também pode procurar por elementos na visualização atual, ou mesmo no mundo todo. **Procure por '{name}'.**",
                 "choose_street": "**Escolha {name} da lista para selecioná-la.**",
-                "selected_street": "Ótimo! Agora o objeto {name} está selecionado.",
+                "selected_street": "Ótimo! Agora o elemento {name} está selecionado.",
                 "editor_street": "Os campos exibidos para uma rua são diferentes daqueles exibidos para a prefeitura.{br}Para esta rua selecionada, o editor de elementos exibe campos como '{field1}' e '{field2}'. **Feche o editor de elementos apertando a tecla Esc ou clicando no botão {button} acima.**",
                 "play": "Experimente mover o mapa e clicar em outros elementos para ver que tipo de coisas podem ser adicionadas ao OpenStreetMap. **Quando você estiver pronto(a) para seguir para o próximo capítulo, clique em '{next}'.**"
             },
             },
             "areas": {
                 "title": "Áreas",
-                "add_playground": "*Áreas* são usadas para representar os limites de elementos como lagos, edifícios, e áreas residenciais.{br}Elas também podem ser usadas para um mapeamento mais detalhado de muitos elementos que você normalmente mapearia com pontos. **Clique no botão {button} Área para adicionar uma nova área.**",
                 "start_playground": "Vamos adicionar este parquinho ao mapa desenhando uma área. Áreas podem ser traçadas colocando *nós* ao longo do limite exterior do elemento. **Clique com o mouse ou pressione a barra de espaço para posicionar um nó inicial em um dos cantos do parquinho.**",
                 "continue_playground": "Continue desenhando a área colocando mais nós ao longo da borda do campo de recreação. É bom conectar a área as vias de caminhada existentes.{br} Dica: você pode pressionar a tecla '{alt}' para evitar que os nós se conectem a outros recursos. **Continue a desenhar uma área para o campo de recreação.**",
                 "finish_playground": "Termine a área pressionando Enter, ou clicando novamente no primeiro ou último nó. **Termine de desenhar a área do parquinho.**",
             },
             "startediting": {
                 "title": "Começar a editar",
-                "help": "Agora você está pronto para editar NO OpenStreetMap!{br.} Você pode reproduzir este passo a passo a qualquer momento ou ver mais documentações clicando no botão Ajuda {button} ou pressionando a tecla '{key}'.",
+                "help": "Agora você está pronto para editar o OpenStreetMap!{br}Você pode repetir este tutorial a qualquer momento ou aprender mais clicando no botão {button} Ajuda ou pressionando a tecla '{key}'.",
                 "shortcuts": "Você pode ver uma lista de comandos juntamente com seus atalhos de teclado pressionando a tecla '{key}'.",
                 "save": "Não esqueça de salvar suas alterações regularmente!",
                 "start": "Começar a mapear!"
                     "title": "Selecione um recurso",
                     "select_one": "Selecione apenas um recurso",
                     "select_multi": "Selecione multiplos recursos",
-                    "lasso": "Desenhar um laço de seleção em torno de elementos"
+                    "lasso": "Desenhar um laço de seleção em torno de elementos",
+                    "search": "Encontre elementos correspondentes ao texto de busca"
                 },
                 "with_selected": {
                     "title": "Com o recurso selecionado",
                     "move": "Mover elementos selecionados",
                     "rotate": "Girar elementos selecionados",
                     "orthogonalize": "Endireitar linha / Ortogonalizar ângulos",
-                    "circularize": "Circularizar uma linha fechada ou área",
+                    "circularize": "Circularizar uma linha fechada ou uma área",
                     "reflect_long": "Refletir elementos ao longo do eixo mais longo",
                     "reflect_short": "Refletir elementos ao longo do eixo mais curto",
                     "delete": "Excluir elementos selecionados"
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} ft² ",
+            "square_miles": "{quantity} mi² ",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "E",
+            "west": "W",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Marca"
                 },
+                "brewery": {
+                    "label": "Chopes"
+                },
                 "bridge": {
                     "label": "Tipo",
                     "placeholder": "Padrão"
                     "label": "Capacidade",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "E": "Leste",
-                        "ENE": "Leste-nordeste",
-                        "ESE": "Leste-sudeste",
-                        "N": "Norte",
-                        "NE": "Nordeste",
-                        "NNE": "Norte-nordeste",
-                        "NNW": "Norte-noroeste",
-                        "NW": "Noroeste",
-                        "S": "Sul",
-                        "SE": "Sudeste",
-                        "SSE": "Sul-sudeste",
-                        "SSW": "Sul-sudoeste",
-                        "SW": "Sudoeste",
-                        "W": "Oeste",
-                        "WNW": "Oeste-noroeste",
-                        "WSW": "Oeste-sudoeste"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipo"
                 },
-                "clock_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "anticlockwise": "Sentido Anti-horário",
-                        "clockwise": "Sentido Horário"
-                    }
-                },
                 "clothes": {
                     "label": "Roupas"
                 },
                     "label": "Tipo de Grua",
                     "options": {
                         "floor-mounted_crane": "Guindaste montado no chão",
-                        "portal_crane": "Guindaste Pórtico"
+                        "portal_crane": "Guindaste Pórtico",
+                        "travel_lift": "Pórtico"
                     }
                 },
                 "crop": {
                 "diaper": {
                     "label": "Troca de Fraldas Disponível"
                 },
+                "direction": {
+                    "label": "Direção (graus em sentido horário)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Direção",
+                    "options": {
+                        "E": "Leste",
+                        "ENE": "Lés-nordeste",
+                        "ESE": "Lés-sudeste",
+                        "N": "Norte",
+                        "NE": "Nordeste",
+                        "NNE": "Nor-nordeste",
+                        "NNW": "Nor-noroeste",
+                        "NW": "Noroeste",
+                        "S": "Sul",
+                        "SE": "Sudeste",
+                        "SSE": "Sul-sudeste",
+                        "SSW": "Sul-sudoeste",
+                        "SW": "Sudoeste",
+                        "W": "Oeste",
+                        "WNW": "Oés-noroeste",
+                        "WSW": "Oés-sudoeste"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direção",
+                    "options": {
+                        "anticlockwise": "Anti-horário",
+                        "clockwise": "Sentido horário"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Contrária à direção da linha",
+                        "both": "Ambas / Todas",
+                        "forward": "Igual à direção da linha"
+                    }
+                },
                 "display": {
                     "label": "Mostrador"
                 },
                 "memorial": {
                     "label": "Tipo"
                 },
-                "milestone_position": {
-                    "label": "Posição do Marco",
-                    "placeholder": "Distância com uma casa decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Tipo de Monitoramento"
                 },
                 "mtb/scale": {
                     "label": "Dificuldade para Mountain Biking",
                 "oneway": {
                     "label": "Mão Única",
                     "options": {
+                        "alternating": "Alternada",
                         "no": "Não",
+                        "reversible": "Reversível",
                         "undefined": "Presume-se que não",
                         "yes": "Sim"
                     }
                 "oneway_yes": {
                     "label": "Mão Única",
                     "options": {
+                        "alternating": "Alternada",
                         "no": "Não",
+                        "reversible": "Reversível",
                         "undefined": "Presume-se que sim",
                         "yes": "Sim"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "backward": "Contrária à direção da linha",
-                        "forward": "Igual à direção da linha"
-                    }
-                },
                 "park_ride": {
                     "label": "Estacionamento de Intercâmbio"
                 },
                 "railway": {
                     "label": "Tipo"
                 },
+                "railway/position": {
+                    "label": "Placa de Quilometragem de Ferrovia",
+                    "placeholder": "Distância com uma casa decimal (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Contrária à direção da linha",
+                        "both": "Ambas / Todas",
+                        "forward": "Igual à direção da linha"
+                    }
+                },
                 "rating": {
                     "label": "Potência Nominal"
                 },
                 "recycling_accepts": {
                     "label": "Aceita"
                 },
-                "recycling_type": {
-                    "label": "Tipo de Reciclagem",
-                    "options": {
-                        "centre": "Centro de Reciclagem",
-                        "container": "Container"
-                    }
-                },
                 "ref": {
                     "label": "Código de Referência"
                 },
+                "ref/isil": {
+                    "label": "Código ISIL"
+                },
                 "ref_aeroway_gate": {
                     "label": "Número do Portão"
                 },
                     "label": "Número da Plataforma"
                 },
                 "ref_road_number": {
-                    "label": "Número da Estrada"
+                    "label": "Código da Rodovia"
                 },
                 "ref_route": {
                     "label": "Número da Rota"
                     "options": {
                         "circuit_breaker": "Disjuntor",
                         "disconnector": "Interruptor",
+                        "earthing": "Aterramento",
                         "mechanical": "Mecânico"
                     }
                 },
                 "traffic_signals": {
                     "label": "Tipo"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Contrária à direção da linha",
+                        "both": "Ambas / Todas",
+                        "forward": "Igual à direção da linha"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Visibilidade da Trilha",
                     "options": {
                     "terms": "Telecorda"
                 },
                 "aerialway/station": {
-                    "name": "Estação Teleférica",
-                    "terms": "Estação de Teleférico, Estação de Bondinho"
+                    "name": "Estação Teleférica"
                 },
                 "aerialway/t-bar": {
                     "name": "Telesquis T-bar",
                     "terms": "Moedas, Câmbio, Troca de valores,"
                 },
                 "amenity/bus_station": {
-                    "name": "Estação Rodoviária",
-                    "terms": "Estação Rodoviária, Terminal Rodoviário, Terminal de Ônibus"
+                    "name": "Terminal / Estação de Ônibus"
                 },
                 "amenity/cafe": {
                     "name": "Cafeteria",
                     "terms": "Cafeteria, Café"
                 },
+                "amenity/car_pooling": {
+                    "name": "Ponto de Carona Solidária",
+                    "terms": "carona"
+                },
                 "amenity/car_rental": {
                     "name": "Locadora de veículos",
                     "terms": "Aluguel de Veículos, locadora, locadora de carros, carros, veículos, automóveis"
                     "terms": "fast food, lanchonete, lanches, Lancheria, comida rápida"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal de balsa",
-                    "terms": "Terminal de Ferry Boat, Ferry Boat, Balsa, Barco, transporte marítimo"
+                    "name": "Terminal de Ferry Boat / Balsa"
                 },
                 "amenity/fire_station": {
                     "name": "Posto de Bombeiros",
-                    "terms": "Posto de Bombeiros, Bombeiros, Central de Bombeiros"
+                    "terms": "Posto de Bombeiros, Bombeiros, Central de Bombeiros, corpo de bombeiros"
                 },
                 "amenity/food_court": {
                     "name": "Praça de Alimentação",
                     "name": "Biblioteca",
                     "terms": "Livros"
                 },
+                "amenity/love_hotel": {
+                    "name": "Motel",
+                    "terms": "hotel de beira de estrada, hotel, pousada, romântico, amor, love hotel"
+                },
                 "amenity/marketplace": {
                     "name": "Mercado ou feira",
                     "terms": "Feira, mercado, mercado municipal, feirinha"
                     "terms": "Estacionamento de motocicletas, estacionamento de motos, estacionamento"
                 },
                 "amenity/music_school": {
-                    "name": "Escola de Música"
+                    "name": "Escola de Música",
+                    "terms": "escola musical, ensino de música, aulas de música, escola de instrumentos musicais, escola de canto"
                 },
                 "amenity/nightclub": {
                     "name": "Boate",
-                    "terms": "Discoteca, Boate, Casa Noturna, boite, "
+                    "terms": "Discoteca, Boate, Casa Noturna, boite, balada"
                 },
                 "amenity/nursing_home": {
                     "name": "Casa de Repouso"
                 },
                 "amenity/parking_space": {
                     "name": "Vaga de Estacionamento",
-                    "terms": "Estacionamento, Vaga, Carro"
+                    "terms": "Estacionamento, Vaga, Carro, espaço de estacionamento"
                 },
                 "amenity/pavilion": {
                     "name": "Pavilhão",
                 },
                 "amenity/place_of_worship/christian": {
                     "name": "Igreja",
-                    "terms": "Igreja, Capela"
+                    "terms": "Igreja, templo, deus, capela, catedral, paróquia, cristão"
                 },
                 "amenity/place_of_worship/hindu": {
                     "name": "Templo Hindu",
-                    "terms": "garbhargriha,mandir,mandu,puja,santuário,hinduísmo"
+                    "terms": "garbhargriha,mandir,mandu,puja,santuário,hinduísmo, templo"
                 },
                 "amenity/place_of_worship/jewish": {
                     "name": "Sinagoga",
-                    "terms": "Sinagoga"
+                    "terms": "templo, sinagoga, esnoga, judaísmo, judeu, judaico"
                 },
                 "amenity/place_of_worship/muslim": {
                     "name": "Mesquita",
-                    "terms": "Mesquita"
+                    "terms": "templo, mesquita, masjid, islamismo, islã, muçulmano"
                 },
                 "amenity/place_of_worship/shinto": {
                     "name": "Santuário Xintoísta",
                 },
                 "amenity/police": {
                     "name": "Polícia",
-                    "terms": "Polícia"
+                    "terms": "polícia, segurança, lei, proteção, patrulha"
                 },
                 "amenity/post_box": {
                     "name": "Caixa de Correio",
                 },
                 "amenity/prison": {
                     "name": "Presídio",
-                    "terms": "Cela, Cadeia"
+                    "terms": "cela, cadeia, prisão, crime"
                 },
                 "amenity/pub": {
                     "name": "Bar / Boteco",
                     "terms": "Patrulha"
                 },
                 "amenity/recycling": {
-                    "name": "Reciclagem",
-                    "terms": "Reciclagem, Reaproveitamento, Recuperação, Reutilização"
+                    "name": "Contêiner de Reciclagem",
+                    "terms": "reciclagem, lixo, lixeira, lata de reciclagem, lata de lixo, dejetos, resíduos, material reciclável"
                 },
                 "amenity/recycling_centre": {
                     "name": "Centro de Reciclagem",
-                    "terms": "Material Reciclável, Dejetos, Material sólido, Reciclagem, Resíduos"
+                    "terms": "Material Reciclável, Dejetos, Material sólido, Reciclagem, Resíduos, lixo, vidro, garrafa, lata"
                 },
                 "amenity/register_office": {
                     "name": "Cartório"
                 },
                 "amenity/sanitary_dump_station": {
                     "name": "Ponto de Descarga de Dejetos (para trailers)",
-                    "terms": "Depósito de Toaletes de Trailers"
+                    "terms": "Depósito de Toaletes de Trailers, depósito de banheiro de trailers, depósito sanitário, trailer, despejo de banheiro, despejo sanitário"
                 },
                 "amenity/school": {
                     "name": "Escola",
-                    "terms": "Ã\81rea Escolar, Terreno Escolar, Pátio Escolar"
+                    "terms": "área escolar, terreno escolar, pátio escolar, colégio, ensino fundamental, ensino médio, educação, instituição de ensino"
                 },
                 "amenity/scrapyard": {
                     "name": "Ferro Velho"
                 },
                 "amenity/shelter": {
                     "name": "Abrigo contra Intempéries",
-                    "terms": "Abrigo contra Intempéries"
+                    "terms": "abrigo contra intempéries, abrigo, proteção da chuva"
                 },
                 "amenity/shower": {
                     "name": "Ducha",
-                    "terms": "ducha, chuveiro, banheiro, banho público"
+                    "terms": "ducha, chuveiro, banheiro, banho público, banho"
                 },
                 "amenity/social_facility": {
                     "name": "Unidade de Assistência Social",
-                    "terms": "Assistência Social, Serviço Social"
+                    "terms": "Assistência Social, assistente social, Serviço Social"
                 },
                 "amenity/social_facility/food_bank": {
                     "name": "Banco de Alimentos",
                 },
                 "amenity/social_facility/group_home": {
                     "name": "Asilo",
-                    "terms": "Albergue, casa de repouso, Casa de idosos, asilo, ancionato, clínica geriátrica,"
+                    "terms": "Albergue, casa de repouso, Casa de idosos, asilo, ancionato, clínica geriátrica"
                 },
                 "amenity/social_facility/homeless_shelter": {
                     "name": "Abrigo para moradores de rua",
-                    "terms": "Refúgio para Desabrigados, albergue, abrigo, mendigo, sopão"
+                    "terms": "refúgio para desabrigados, abrigo para sem-teto, albergue, abrigo, mendigo, sopão, sem-teto"
                 },
                 "amenity/social_facility/nursing_home": {
                     "name": "Casa de Repouso",
                     "terms": "Enfermagem, casa de saúde, lar de repouso, lar de idosos, asilo, lar de vida assistida, lar de saúde, casa de velhinhos,"
                 },
                 "amenity/studio": {
-                    "name": "Estúdio de rádio/tv ou de gravação",
+                    "name": "Estúdio de rádio/TV ou de gravação",
                     "terms": "Estúdio, rádio, ensaio, música, banda, gravação, TV, cinema, produtora,"
                 },
                 "amenity/swimming_pool": {
                 },
                 "amenity/taxi": {
                     "name": "Ponto de Táxi",
-                    "terms": "Táxi"
+                    "terms": "táxi, cooperativa"
                 },
                 "amenity/telephone": {
                     "name": "Telefone Público",
                 },
                 "amenity/theatre": {
                     "name": "Teatro",
-                    "terms": "Auditório, Show, Eventos"
+                    "terms": "auditório, show, eventos, peça, musical"
                 },
                 "amenity/toilets": {
                     "name": "Banheiros Públicos",
                 },
                 "amenity/vending_machine/cigarettes": {
                     "name": "Máquina de Venda de Cigarros",
-                    "terms": "Vendas de máquinas de Cigarro"
+                    "terms": "cigarro, venda de cigarro"
                 },
                 "amenity/vending_machine/condoms": {
                     "name": "Máquina de Venda de Preservativos",
-                    "terms": "Máquinas de venda de preservativos, camisinha"
+                    "terms": "máquina de venda de camisinhas, preservativos, camisinha"
                 },
                 "amenity/vending_machine/drinks": {
                     "name": "Máquina de Venda de Bebidas",
-                    "terms": "Máquina de Venda de Bebidas, refrigerante, lata, latinha"
+                    "terms": "Máquina de Venda de Bebidas, máquina de refrigerante, refrigerante, lata, latinha"
                 },
                 "amenity/vending_machine/excrement_bags": {
                     "name": "Máquina de Vendas de Sacola de Excrementos",
-                    "terms": "Totem de vendas, Máquina de Venda Automática, Embalagem, Sacola, Animal de Estimação, Pet"
+                    "terms": "sacos de excremento, cocô, fezes, dejetos, animal, cachorro, animal de estimação, pet, sacola"
                 },
                 "amenity/vending_machine/feminine_hygiene": {
                     "name": "Máquina de Vendas - Higiene Feminina",
-                    "terms": "produtos de higiene feminina, camisinha, preservativo, absorvente, cuidados pessoais, higiene, mulher"
+                    "terms": "produtos de higiene feminina, camisinha, preservativo, absorvente, tampão, cuidados pessoais, higiene, mulher"
                 },
                 "amenity/vending_machine/news_papers": {
-                    "name": "Máquina de Venda de Jornal"
+                    "name": "Máquina de Venda de Jornais"
                 },
                 "amenity/vending_machine/newspapers": {
                     "name": "Máquina de Venda de Jornais",
-                    "terms": "jornais, revistas, venda de jornal, Totem de vendas, Máquina de Venda Automática, notícia, banca de jornal"
+                    "terms": "jornais, revistas, venda de jornal, notícia, banca de jornal, periódicos, tabloides"
                 },
                 "amenity/vending_machine/parcel_pickup_dropoff": {
                     "name": "Máquina de Envio e Recebimento de Encomendas",
                 },
                 "amenity/vending_machine/parking_tickets": {
                     "name": "Máquina de Vendas de Ticket de Estacionamento",
-                    "terms": "Totem de vendas, Máquina de Venda Automática, Estacionamento, Carro"
+                    "terms": "máquina de vendas de bilhete de estacionamento, carro, bilhete de estacionamento"
                 },
                 "amenity/vending_machine/public_transport_tickets": {
                     "name": "Máquina de Vendas de Bilhete de Transporte",
                 },
                 "amenity/vending_machine/sweets": {
                     "name": "Máquina de Venda de Lanches",
-                    "terms": "Salgados, Doces, Petiscos, salgadinho"
+                    "terms": "salgados, doces, petiscos, salgadinhos, snacks, chicletes, biscoitos, balas"
                 },
                 "amenity/veterinary": {
                     "name": "Veterinário",
-                    "terms": "Veterinário, Médico veterinário, pet, animal de estimação, animais"
+                    "terms": "veterinário, médico veterinário, pet, animal de estimação, animais, hospital veterinário, hospital de animais, clínica de animais, cachorros, gatos"
                 },
                 "amenity/waste/dog_excrement": {
                     "name": "Lixeira para excrementos de cães",
-                    "terms": "cocô de cachorro, fezes de cachorro, cão, pet, cachorro"
+                    "terms": "cocô de cachorro, fezes de cachorro, cão, pet, cachorro, lixo"
                 },
                 "amenity/waste_basket": {
                     "name": "Lixeira",
-                    "terms": "Cesto de Lixo, Lixeira, Balde de Lixo"
+                    "terms": "lixo, cesto de lixo, lixeira, balde de lixo"
                 },
                 "amenity/waste_disposal": {
                     "name": "Contêiner de lixo não reciclável",
-                    "terms": "lixo, resíduos, container"
+                    "terms": "lixo, resíduos, container de lixo"
                 },
                 "amenity/waste_transfer_station": {
                     "name": "Estação de Transferência de Resíduos",
                 },
                 "area": {
                     "name": "Área",
-                    "terms": "Ã\81rea"
+                    "terms": "área, região, espaço, limite"
                 },
                 "area/highway": {
                     "name": "Superfície da estrada",
-                    "terms": "Superfície rodoviária, pavimentação"
+                    "terms": "superfície rodoviária, pavimentação, asfalto, estrada, rodovia, rua, avenida"
                 },
                 "attraction/amusement_ride": {
                     "name": "Brinquedo de parque de diversões",
-                    "terms": "atração, parque de diversões, montanha russa, camicase, ranger, kamikase, navio pirata"
+                    "terms": "atração, parque de diversões, montanha russa, roda gigante, camicase, ranger, kamikaze, navio pirata"
                 },
                 "attraction/animal": {
                     "name": "Animal",
-                    "terms": "Animal de zoológico, animal de demonstração, jaula, zoológico, macaco, parque de diversões"
+                    "terms": "animal de zoológico, animal de demonstração, jaula, zoológico, macaco, parque de diversões, parque temático, leão, tigre, onça"
                 },
                 "attraction/big_wheel": {
                     "name": "Roda Gigante",
-                    "terms": "roda panorâmica, parque de diversões, brinquedo"
+                    "terms": "roda panorâmica, parque de diversões, brinquedo, parque temático"
                 },
                 "attraction/bumper_car": {
                     "name": "Carrinhos de bate-bate",
                 },
                 "attraction/bungee_jumping": {
                     "name": "Ponto de Bungee Jumping",
-                    "terms": "bungue, bangue, bung, bang, jump, salto, parque de diversões, aventura, esporte de aventura"
+                    "terms": "bungue, bangue, bung, bang, jump, salto, parque de diversões, aventura, esporte de aventura, radical"
                 },
                 "attraction/carousel": {
                     "name": "Carrossel",
-                    "terms": "maxambomba, trivoli, parque de diversões,"
+                    "terms": "maxambomba, trivoli, parque de diversões, cavalos"
                 },
                 "attraction/dark_ride": {
                     "name": "Trem Fantasma",
-                    "terms": "brinquedo, parque de diversões, terror"
+                    "terms": "brinquedo, parque de diversões, terror, medo"
                 },
                 "attraction/drop_tower": {
                     "name": "Torre de Queda Livre",
                 },
                 "attraction/river_rafting": {
                     "name": "Rafting",
-                    "terms": "parque aquático, parque temático, rafting, rio, simulador, esportes radicais, esportes de aventura, água, canoagem, kayak, caiaque"
+                    "terms": "canoagem, parque aquático, parque temático, rafting, rio, simulador, esportes radicais, esportes de aventura, água, kayak, caiaque"
                 },
                 "attraction/roller_coaster": {
                     "name": "Montanha Russa",
-                    "terms": "brinquedo, parque de diversão, parque de diversões, parque temático, aventura"
+                    "terms": "brinquedo, trem, trilhos, parque de diversão, parque de diversões, parque temático, aventura"
                 },
                 "attraction/train": {
                     "name": "Trem Turístico",
                 },
                 "attraction/water_slide": {
                     "name": "Toboágua",
-                    "terms": "tobogã, tobogan, escorregador, parque aquático, piscina"
+                    "terms": "tobogã, tobogan, tobogam, escorregador, parque aquático, piscina"
                 },
                 "barrier": {
                     "name": "Barreira",
-                    "terms": "Barreira"
+                    "terms": "barreira, bloqueio, obstáculo, cone, via bloqueada, rua bloqueada, avenida bloqueada, estrada bloqueada"
                 },
                 "barrier/block": {
                     "name": "Bloco",
-                    "terms": "Bloco"
+                    "terms": "bloco, bloco de concreto, gelo baiano"
                 },
                 "barrier/bollard": {
                     "name": "Pilarete",
                 },
                 "barrier/city_wall": {
                     "name": "Muralha",
-                    "terms": "Muralha"
+                    "terms": "muralha, muro, parede"
                 },
                 "barrier/cycle_barrier": {
                     "name": "Barreira para Bicicletas",
-                    "terms": "Barreira para Bicicletas"
+                    "terms": "barreira para bicicletas, bloqueio para bicicletas"
                 },
                 "barrier/ditch": {
                     "name": "Vala",
-                    "terms": "Fosso, trincheira"
+                    "terms": "fosso, trincheira, buraco, valão"
                 },
                 "barrier/entrance": {
                     "name": "Entrada"
                 },
                 "barrier/fence": {
                     "name": "Cerca ou Grade",
-                    "terms": "Cerca ou Grade"
+                    "terms": "cerca, grade"
                 },
                 "barrier/gate": {
                     "name": "Portão",
                 },
                 "barrier/lift_gate": {
                     "name": "Cancela Elevatória",
-                    "terms": "Cancela"
+                    "terms": "cancela, barreira elevatória"
                 },
                 "barrier/retaining_wall": {
                     "name": "Muro de Contenção",
-                    "terms": "Barreira de Retenção"
+                    "terms": "parede de retenção, barreira de retenção"
                 },
                 "barrier/stile": {
                     "name": "Travessia em Cerca/Muro",
                     "name": "Celeiro",
                     "terms": "Celeiro"
                 },
+                "building/bungalow": {
+                    "name": "Bangalô",
+                    "terms": "bangaló, casa de um andar"
+                },
                 "building/bunker": {
                     "name": "Casamata"
                 },
                 "building/cabin": {
                     "name": "Cabine",
-                    "terms": "Cabine"
+                    "terms": "cabana, cabine"
                 },
                 "building/cathedral": {
                     "name": "Catedral",
-                    "terms": "Edifício Catedral"
+                    "terms": "Catedral, Edifício Catedral, Prédio Catedral"
                 },
                 "building/chapel": {
                     "name": "Capela",
-                    "terms": "Igreja, Edificação, Prédio, Capela, Lugar de Adoração, Religião"
+                    "terms": "Igreja, Edificação de Capela, Prédio de Capela, Capela, Lugar de Adoração, Religião, templo"
                 },
                 "building/church": {
-                    "name": "Igreja",
-                    "terms": "Edifício de Igreja"
+                    "name": "Edifício de Igreja",
+                    "terms": "Edifício de Igreja, igreja, paróquia, lugar de adoração, templo, capela, catedral, prédio de igreja"
+                },
+                "building/civic": {
+                    "name": "Edifício de uso público",
+                    "terms": "edifício cívico"
                 },
                 "building/college": {
                     "name": "Edifício de Escola Técnica",
-                    "terms": "Colégio técnico, Ensino profissionalizante, Educação profissional"
+                    "terms": "Colégio técnico, Ensino profissionalizante, Educação profissional, prédio de escola técnica"
                 },
                 "building/commercial": {
                     "name": "Edifício de escritórios",
-                    "terms": "Edifício de Negócios, Edifício Comercial, Prédio Comercial, edifício de escritórios, prédio de escritórios"
+                    "terms": "Edifício de Negócios, Edifício Comercial, Prédio Comercial, edifício de escritórios, prédio de escritórios, prédio de negócios"
                 },
                 "building/construction": {
                     "name": "Edifício em construção",
-                    "terms": "Edificação em Construção, Construção, Obras"
+                    "terms": "Edificação em Construção, Construção, Obras, prédio em construção"
                 },
                 "building/detached": {
                     "name": "Casa Separada",
                 "building/entrance": {
                     "name": "Entrada/Saída"
                 },
+                "building/farm": {
+                    "name": "Edifício de Fazenda",
+                    "terms": "fazenda, roça, zona rural, edifício, casa de fazenda, casa de campo"
+                },
                 "building/garage": {
                     "name": "Garagem",
                     "terms": "Garagem"
                 },
                 "building/hospital": {
                     "name": "Edifício do Hospital",
-                    "terms": "Edifício hospitalar"
+                    "terms": "Edifício hospitalar, hospital, prédio hospitalar, prédio de hospital"
                 },
                 "building/hotel": {
                     "name": "Edifício de Hotel",
-                    "terms": "Hotel"
+                    "terms": "Hotel, prédio de hotel"
                 },
                 "building/house": {
                     "name": "Casa",
                 },
                 "building/industrial": {
                     "name": "Edifício Industrial",
-                    "terms": "Edifício Industrial"
+                    "terms": "Edifício Industrial, prédio industrial"
                 },
                 "building/kindergarten": {
                     "name": "Edifício de pré-escola",
-                    "terms": "Pré-escola, Centro de educação infantil, CEI, Jardim de infância"
+                    "terms": "Pré-escola, Centro de educação infantil, CEI, Jardim de infância, prédio de pré-escola"
+                },
+                "building/mosque": {
+                    "name": "Edifício de Mesquita",
+                    "terms": "prédio de mesquita, mesquita"
                 },
                 "building/public": {
                     "name": "Edifício Público",
-                    "terms": "Edifício Público"
+                    "terms": "Edifício Público, prédio público"
                 },
                 "building/residential": {
                     "name": "Edifício Residencial",
-                    "terms": "Edifício Residencial"
+                    "terms": "Edifício Residencial, prédio residencial, apartamentos, condomínio"
                 },
                 "building/retail": {
                     "name": "Edifício de varejo ou loja",
-                    "terms": "Edifício de Atividade de Vendas, Edifício de Varejo, loja"
+                    "terms": "Edifício de Atividade de Vendas, Edifício de Varejo, loja, varejista, prédio de varejo"
                 },
                 "building/roof": {
                     "name": "Telhado ou cobertura",
                     "terms": "Telhado, Cobertura, teto"
                 },
+                "building/ruins": {
+                    "name": "Edifício em Ruínas",
+                    "terms": "ruínas, edifício abandonado"
+                },
                 "building/school": {
                     "name": "Edifício escolar",
-                    "terms": "Edifício Escolar, escola"
+                    "terms": "Edifício Escolar, escola, prédio escolar, colégio"
                 },
                 "building/semidetached_house": {
                     "name": "Casa Geminada",
                     "terms": "Casa irmanada"
                 },
+                "building/service": {
+                    "name": "Casa de máquinas",
+                    "terms": "edifício de serviços, máquinas"
+                },
                 "building/shed": {
-                    "name": "Cabana",
+                    "name": "Barraco",
                     "terms": "Cabana, Barraco, Galpão, Choupana"
                 },
                 "building/stable": {
                     "name": "Estábulo",
                     "terms": "Estábulo"
                 },
+                "building/stadium": {
+                    "name": "Edifício de Estádio",
+                    "terms": "estádio, esportes, ginásio de esportes"
+                },
                 "building/static_caravan": {
                     "name": "Casa Transportável",
                     "terms": "Casa Transportável"
                 },
+                "building/temple": {
+                    "name": "Edifício de Templo",
+                    "terms": "Templo, igreja, lugar de adoração, capela, local sagrado"
+                },
                 "building/terrace": {
                     "name": "Fileira de Casas",
                     "terms": "Fileira de Casas"
                 },
                 "building/university": {
                     "name": "Edifício Universitário",
-                    "terms": "Edifício Universitário, Faculdade, Edifício de Faculdade"
+                    "terms": "Edifício Universitário, Faculdade, Edifício de Faculdade, prédio universitário, bloco universitário, prédio de faculdade, prédio de universidade, edifício de universidade"
                 },
                 "building/warehouse": {
                     "name": "Armazém",
                     "name": "Vaga de Acampamento",
                     "terms": "Local de acampamento, Acampamento, motor home, Tenda, Caravana, Barraca de acampamento"
                 },
+                "circular": {
+                    "name": "Junção Circular"
+                },
                 "club": {
                     "name": "Clube de interesses ou hobby",
                     "terms": "aeromodelismo, radioamador, filatelia, xadrez, astronomia, automobilismo, associação, fã-clube, fã, templo maçônico, maçonaria, maçom, caça, motociclismo, moto clube,nudismo, fotografia, escoteiro, escotismo, hobby, sociedade,"
                     "terms": "Fornecedor de Mantimentos, Aprovisionador, cozinheiro, encomenda, marmita, PF, refeição,"
                 },
                 "craft/chimney_sweeper": {
-                    "name": "Limpador de Chaminé"
+                    "name": "Limpador de Chaminé",
+                    "terms": "limpador de chaminés, limpeza de chaminés, chaminés"
                 },
                 "craft/clockmaker": {
                     "name": "Relojoeiro",
                     "terms": "Relógios, relojoaria, Conserto de relógios, Reparos de relógios"
                 },
                 "craft/confectionery": {
-                    "name": "Doceria"
+                    "name": "Doceria",
+                    "terms": "Confeitaria, doceria"
                 },
                 "craft/distillery": {
                     "name": "Destilaria",
                     "terms": "Montador de Andaimes"
                 },
                 "craft/sculptor": {
-                    "name": "Escultor"
+                    "name": "Escultor",
+                    "terms": "Escultor, artista plástico, escultura"
                 },
                 "craft/shoemaker": {
                     "name": "Sapateiro",
                     "terms": "Travessia de Pedestres"
                 },
                 "footway/crosswalk-raised": {
-                    "name": "Faixa de Pedestres Elevada "
+                    "name": "Faixa de Pedestres Elevada ",
+                    "terms": "faixa elevada, quebra-molas, faixa de pedestres, pedestres"
                 },
                 "footway/sidewalk": {
                     "name": "Calçada",
                 },
                 "healthcare": {
                     "name": "Assistência Médica",
-                    "terms": "Posto de Saúde, Unidade de Pronto Atendimento, Unidade Básica de Saúde, clínica, doutor, consultório médico, hospital, dentista, fisioterapia"
+                    "terms": "posto de saúde, Unidade de Pronto Atendimento, Unidade Básica de Saúde, enfermaria, clínica, doutor, consultório médico, serviços médicos, serviço médico, serviço de saúde, atendimento médico, médico, médica, saúde, hospital, dentista, fisioterapia"
                 },
                 "healthcare/alternative": {
                     "name": "Medicina Alternativa",
                     "terms": "acupuntura, antroposofia, cinesiologia aplicada, aromaterapia, ayurveda, homeopatia, hidroterapia, hipnose, naturopatia, osteopatia, reflexologia, reiki, shiatsu, tradicional, tuiná, unani"
                 },
                 "healthcare/alternative/chiropractic": {
-                    "name": "Quiroprata"
+                    "name": "Quiroprata",
+                    "terms": "quiropraxia, massagem, massoterapia"
                 },
                 "healthcare/audiologist": {
-                    "name": "Fonoaudiologista"
+                    "name": "Audiologista",
+                    "terms": "audiólogo, fonoaudiólogo, ouvido, audição"
                 },
                 "healthcare/birthing_center": {
                     "name": "Casa de Parto",
                     "terms": "Hemocentro, Doação de Sangue, Banco de sangue, transfusão de sangue, sangue,"
                 },
                 "healthcare/hospice": {
-                    "name": "Unidades de Cuidados Paliativos"
+                    "name": "Unidades de Cuidados Paliativos",
+                    "terms": "doença, terminal, tratamento"
                 },
                 "healthcare/midwife": {
                     "name": "Parteira",
-                    "terms": "Obstetra, obstetrícia, clínica de obstetrícia, gravidez"
+                    "terms": "obstetra, obstetrícia, parteira, parto, clínica de obstetrícia, gravidez, gestante, gestação"
                 },
                 "healthcare/occupational_therapist": {
                     "name": "Terapeuta Ocupacional",
-                    "terms": "Terapia Ocupacional, clínica de Terapia Ocupacional, Terapeuta Ocupacional"
+                    "terms": "terapia ocupacional, clínica de terapia ocupacional, terapeuta, terapia"
                 },
                 "healthcare/optometrist": {
-                    "name": "Optometrista"
+                    "name": "Optometrista",
+                    "terms": "lentes, visão, óculos, oculista, optometrista"
                 },
                 "healthcare/physiotherapist": {
-                    "name": "Fisioterapia"
+                    "name": "Fisioterapia",
+                    "terms": "fisioterapeuta, terapia, terapeuta, físico"
                 },
                 "healthcare/podiatrist": {
-                    "name": "Pediatria"
+                    "name": "Podólogo",
+                    "terms": "podóloga, podologia, podiatria, podiatra, podopediatria, podogeriatria, pés, unhas"
                 },
                 "healthcare/psychotherapist": {
-                    "name": "Psicoterapia"
+                    "name": "Psicoterapia",
+                    "terms": "psicólogo, psicologia"
                 },
                 "healthcare/rehabilitation": {
-                    "name": "Clínica de Reabilitação"
+                    "name": "Clínica de Reabilitação",
+                    "terms": "terapia, reabilitação"
                 },
                 "healthcare/speech_therapist": {
                     "name": "Fonoaudiólogo",
-                    "terms": "fonoaudiologia, clínica de fonoaudiologia, Terapia da fala, Audiologia, logopedia,"
+                    "terms": "fonoaudióloga, fonoaudiologista, fonoaudiologia, clínica de fonoaudiologia, terapia da fala, audiologia, logopedia, voz, fala, terapeuta"
                 },
                 "highway": {
                     "name": "Via Terrestre"
                     "terms": "Hipovia, Picadeiro, Caminho para Cavalgada, calvagada, Trilha de Equitação, cavalo, hipismo"
                 },
                 "highway/bus_stop": {
-                    "name": "Ponto de Ônibus",
-                    "terms": "Ponto de Ônibus, Parada de Ônibus"
+                    "name": "Parada de ônibus / Plataforma"
                 },
                 "highway/corridor": {
                     "name": "Corredor Interno",
                     "terms": "Faixa de cruzamento"
                 },
                 "highway/crossing-raised": {
-                    "name": "Cruzamento de Ruas Elevada"
+                    "name": "Cruzamento de Ruas Elevada",
+                    "terms": "faixa elevada, quebra-molas, faixa de pedestres, pedestres"
                 },
                 "highway/crosswalk": {
                     "name": "Faixa de Pedestres",
                     "terms": "Travessia de Pedestres"
                 },
                 "highway/crosswalk-raised": {
-                    "name": "Faixa de Pedestres Elevada"
+                    "name": "Faixa de Pedestres Elevada",
+                    "terms": "faixa de pedestres, lombada de pedestres, quebra-molas de pedestres"
                 },
                 "highway/cycleway": {
                     "name": "Ciclovia",
-                    "terms": "Ciclovia"
+                    "terms": "ciclovia, ciclofaixa, bicicletas, ciclismo, ciclista"
                 },
                 "highway/elevator": {
                     "name": "Elevador",
-                    "terms": "<translate with synonyms or related terms for 'Elevator', separated by commas>"
+                    "terms": "elevador"
                 },
                 "highway/footway": {
                     "name": "Caminho de Pedestre",
-                    "terms": "Via de Pedestre, Caminho de Pedestre, Passeio, Calçada"
+                    "terms": "via de pedestre, caminho de pedestre, passeio, calçada, trilha, caminhada"
                 },
                 "highway/give_way": {
                     "name": "Sinalização “dê a preferência”",
-                    "terms": "dê a preferência, dar a preferência, preferencial"
+                    "terms": "dê a preferência, dar a preferência, preferência, preferencial"
                 },
                 "highway/living_street": {
                     "name": "Via Compartilhada",
                 },
                 "highway/motorway_junction": {
                     "name": "Entroncamento / Saída de Autoestrada",
-                    "terms": "Acesso / Saída de Autoestrada, Junção / Saída de Autoestrada"
+                    "terms": "acesso de autoestrada, saída de autoestrada, junção de autoestrada, acesso de via expressa, junção de via expressa, saída de via expressa"
                 },
                 "highway/motorway_link": {
                     "name": "Ligação de Autoestrada",
-                    "terms": "Acesso a Autoestrada"
+                    "terms": "acesso a autoestrada, acesso a via expressa, ligação de via expressa"
                 },
                 "highway/path": {
                     "name": "Caminho Informal",
-                    "terms": "Caminho Informal"
+                    "terms": "trilha, caminho, caminhada"
                 },
                 "highway/pedestrian_area": {
-                    "name": "Calçadão"
+                    "name": "Calçadão",
+                    "terms": "área de pedestres, praça, passeio, calçada"
                 },
                 "highway/pedestrian_line": {
-                    "name": "Calçadão"
+                    "name": "Calçadão",
+                    "terms": "rua de pedestres, centro, calçada, passeio, praça"
                 },
                 "highway/primary": {
                     "name": "Via Primária",
                 },
                 "highway/service/drive-through": {
                     "name": "Drive-Thru",
-                    "terms": "Drive-Thru"
+                    "terms": "drive-thru, drive thru, drive-tru, drive tru, drive-through, drive through"
                 },
                 "highway/service/driveway": {
                     "name": "Via de acesso",
-                    "terms": "Via de Garagem"
+                    "terms": "via de garagem, entrada da garagem, entrada do portão"
                 },
                 "highway/service/emergency_access": {
                     "name": "Acesso de Emergência",
-                    "terms": "Entrada de Emergência, Corredor de Emergência"
+                    "terms": "emergência, entrada de emergência, corredor de emergência"
                 },
                 "highway/service/parking_aisle": {
                     "name": "Corredor de Estacionamento",
-                    "terms": "Corredor de Estacionamento"
+                    "terms": "estacionamento, via de estacionamento, corredor de estacionamento"
                 },
                 "highway/services": {
                     "name": "Posto de Serviços",
                 },
                 "highway/speed_camera": {
                     "name": "Sensor de Velocidade",
-                    "terms": "Câmera de velocidade, pardal, sinal de trânsito, fiscalização eletrônica de velocidade"
+                    "terms": "câmera de velocidade, radar, pardal, foto-sensor, foto sensor, fotossensor, sinal de trânsito, fiscalização eletrônica de velocidade"
                 },
                 "highway/steps": {
                     "name": "Escada",
                 },
                 "highway/street_lamp": {
                     "name": "Poste de Luz",
-                    "terms": "Lampião, Lampião de rua, Revérbero, Poste de luz"
+                    "terms": "lampião, lampião de rua, revérbero, poste de luz, iluminação pública"
                 },
                 "highway/tertiary": {
                     "name": "Via Terciária",
                 },
                 "historic": {
                     "name": "Local Histórico",
-                    "terms": "Lugar Histórico"
+                    "terms": "lugar histórico, local histórico, patrimônio, monumento, turismo, ponto turístico"
                 },
                 "historic/archaeological_site": {
                     "name": "Sítio Arqueológico",
-                    "terms": "Sítio Arqueológico"
+                    "terms": "Sítio Arqueológico, arqueologia"
                 },
                 "historic/boundary_stone": {
                     "name": "Marco de Fronteira",
                 },
                 "historic/castle": {
                     "name": "Castelo",
-                    "terms": "Castelo"
+                    "terms": "castelo, fortaleza, forte, fortificação"
                 },
                 "historic/memorial": {
                     "name": "Memorial",
                 },
                 "historic/tomb": {
                     "name": "Túmulo",
-                    "terms": "Sepultura, Cemitério, "
+                    "terms": "sepulcro, sepultura, cemitério"
                 },
                 "historic/wayside_cross": {
                     "name": "Cruz de Beira de Estrada",
                 },
                 "landuse": {
                     "name": "Uso da terra",
-                    "terms": "Uso do Solo, Ocupação da Terra, Ordenamento Territorial, Exploração da Terra, Utilização da Terra"
+                    "terms": "Uso do Solo, Ocupação da Terra, Ordenamento Territorial, Exploração da Terra, Utilização da Terra, uso de terreno"
                 },
                 "landuse/allotments": {
                     "name": "Horta Urbana",
                     "name": "Bacia",
                     "terms": "Bacia"
                 },
+                "landuse/brownfield": {
+                    "terms": "Terreno industrial abandonado, área em revitalização, área abandonada, terreno em revitalização, zona industrial abandonada, desenvolvimento"
+                },
                 "landuse/cemetery": {
                     "name": "Cemitério Secular",
                     "terms": "Sepulcrário, Cemitério"
                     "name": "Floresta manejada",
                     "terms": "Floresta plantada, Silvicultura, Reflorestamento, Área reflorestada"
                 },
-                "landuse/garages": {
-                    "name": "Garagens",
-                    "terms": "Garagem, estacionamento, estacionamentos"
-                },
                 "landuse/grass": {
                     "name": "Gramado",
                     "terms": "Gramado"
                 },
+                "landuse/greenfield": {
+                    "terms": "área projetada, área em desenvolvimento, terreno projetado"
+                },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Cultivo de plantas em estufa",
+                    "terms": "estufa, viveiro, plantação, agricultura, horticultura, horta, jardinagem, fazenda"
+                },
                 "landuse/harbour": {
                     "name": "Ancoradouro",
                     "terms": "porto, ancoradouro, enseada"
                     "name": "Ferro-Velho"
                 },
                 "landuse/industrial/slaughterhouse": {
-                    "name": "Matadouro"
+                    "name": "Matadouro",
+                    "terms": "matadouro, abatedouro, abate de animais, casa de abate, abate"
                 },
                 "landuse/landfill": {
                     "name": "Aterro Sanitário",
-                    "terms": "Aterro Sanitário, Depósito de Lixo"
+                    "terms": "lixão, aterro sanitário, depósito de lixo"
                 },
                 "landuse/meadow": {
                     "name": "Pasto / Prado",
                 },
                 "landuse/military": {
                     "name": "Área militar",
-                    "terms": "Zona militar, militar"
+                    "terms": "zona militar, militar, aeronáutica, força aérea, exército, marinha"
                 },
                 "landuse/military/airfield": {
                     "name": "Aeródromo Militar",
-                    "terms": "Aeroporto Militar, Campo de Pouso Militar"
+                    "terms": "aeroporto militar, campo de pouso militar, base aérea, aeronáutica, força aérea, exército, caças, guerra"
                 },
                 "landuse/military/barracks": {
                     "name": "Quartel",
-                    "terms": "Quartel, Caserna"
+                    "terms": "quartel, caserna, força aérea, base, aeronáutica, exército, marinha, forças armadas, tropa, guerra"
                 },
                 "landuse/military/bunker": {
                     "name": "Bunker Militar",
                 },
                 "landuse/military/training_area": {
                     "name": "Área de Treinamento",
-                    "terms": "Ã\81rea de Treino, CT, Campo de Treinamento"
+                    "terms": "área de treino, CT, campo de treinamento, treinamento militar, armas, tiro, guerra, aeronáutica, força aérea, exército, marinha"
                 },
                 "landuse/orchard": {
                     "name": "Pomar",
                 },
                 "landuse/retail": {
                     "name": "Área de comércio e varejo",
-                    "terms": "Área de Vendas, Área de Varejo, Comércio, Varejista, Comercial, Vendas, lojas"
+                    "terms": "Área de Vendas, Área de Varejo, Comércio, Varejista, área comercial, Comercial, Vendas, lojas"
                 },
                 "landuse/vineyard": {
                     "name": "Vinha",
                 },
                 "leisure/common": {
                     "name": "Área Comunitária",
-                    "terms": "Comum, Habitual, Frequente"
+                    "terms": "Comum, Habitual, Frequente, compartilhada"
                 },
                 "leisure/dance": {
                     "name": "Danceteria",
-                    "terms": "Balada, boate"
+                    "terms": "salão de dança, balada, boate, clube de dança, salsa, tango"
                 },
                 "leisure/dog_park": {
                     "name": "Cachorródromo",
-                    "terms": "Canódromo, Cachorródromo, Parque Canino, Parque de Cachorros"
+                    "terms": "Canódromo, Cachorródromo, Parque Canino, Parque de Cachorros, cães, cão, cachorros"
                 },
                 "leisure/firepit": {
                     "name": "Fogueira",
-                    "terms": "Fogueira"
+                    "terms": "Fogueira, pira, fogo"
                 },
                 "leisure/fitness_centre": {
                     "name": "Academia",
                     "terms": "Academia de Musculação, Academia de Ginástica"
                 },
                 "leisure/fitness_centre/yoga": {
-                    "name": "Estúdio de ga",
-                    "terms": "Estúdio de Yoga, Academia de Ioga, Academia de Yoga, Yôga, Ioga"
+                    "name": "Estúdio de Ioga",
+                    "terms": "Estúdio de Yoga, Academia de Ioga, Academia de Yoga, Yôga, Ioga, Yoga"
                 },
                 "leisure/fitness_station": {
                     "name": "Equipamento de Exercícios ao Ar Livre",
-                    "terms": "Máquina de execício, Equipamento de exercício, Equipamento de ginástica"
+                    "terms": "academia aberta, academia ao ar livre, máquina de execício, equipamento de exercício, equipamento de ginástica"
                 },
                 "leisure/fitness_station/balance_beam": {
                     "name": "Trave de Equilíbrio"
                 },
                 "leisure/golf_course": {
                     "name": "Campo de Golfe",
-                    "terms": "Campo de Golfe"
+                    "terms": "Campo de Golfe, golfe"
                 },
                 "leisure/hackerspace": {
                     "name": "Hackerspace",
-                    "terms": "hacklab, makerspace, hackspace clube de programação, clube de hackers,"
+                    "terms": "hacklab, makerspace, hackspace, clube de programação, clube de hackers,"
                 },
                 "leisure/horse_riding": {
                     "name": "Centro de Hipismo",
                 },
                 "leisure/ice_rink": {
                     "name": "Pista de Patinação no Gelo",
-                    "terms": "Rinque de Patinação no Gelo"
+                    "terms": "Ringue de Patinação no Gelo, patinação, hóquei, patins"
                 },
                 "leisure/marina": {
                     "name": "Marina",
                 },
                 "leisure/nature_reserve": {
                     "name": "Reserva natural",
-                    "terms": "Reserva florestal, floresta"
+                    "terms": "Reserva florestal, floresta,  natureza, vida selvagem"
                 },
                 "leisure/park": {
                     "name": "Parque ou Praça",
-                    "terms": "Parque, praça"
+                    "terms": "parque, park, verde, jardim, jardins, gramado, árvores, esplanada, praça, pracinha"
                 },
                 "leisure/picnic_table": {
                     "name": "Mesa de piquenique",
-                    "terms": "Mesa de piquenique, Picnic"
+                    "terms": "mesa de piquenique, picnic, pique-nique"
                 },
                 "leisure/pitch": {
-                    "name": "Quadra Esportiva",
-                    "terms": "Campo de Esportes, Campo Esportivo, Quadra Esportiva"
+                    "name": "Quadra ou Campo Esportivo",
+                    "terms": "Campo de Esportes, Campo Esportivo, Quadra Esportiva, ginásio, estádio"
                 },
                 "leisure/pitch/american_football": {
                     "name": "Campo de Futebol Americano",
-                    "terms": "Futebol Americano"
+                    "terms": "Futebol Americano, football"
                 },
                 "leisure/pitch/baseball": {
                     "name": "Campo de Beisebol",
-                    "terms": "Campo de Beisebol"
+                    "terms": "campo de beisebol, campo de baseball"
                 },
                 "leisure/pitch/basketball": {
                     "name": "Quadra de Basquetebol",
                     "name": "Quadra de Voleibol de Praia",
                     "terms": "vôlei, voleibol, praia, arena, areia"
                 },
+                "leisure/pitch/boules": {
+                    "name": "Quadra de Boules/Bocha",
+                    "terms": "cancha de bocha, pista de bocha, boules, bocha, bocce, boccia, boule lyonnaise, pètanque, petanca, raffa, bowls"
+                },
                 "leisure/pitch/bowls": {
-                    "name": "Campo de Bocha",
-                    "terms": "Cancha de Bocha, Pista de Bocha"
+                    "name": "Campo de Lawn Bowls",
+                    "terms": "bowls, gramado, bocha, boules"
                 },
                 "leisure/pitch/cricket": {
-                    "name": "Campo de Cricket",
-                    "terms": "campo de críquete, críquete, cricket"
+                    "name": "Campo de Críquete",
+                    "terms": "campo de cricket, críquete, cricket"
                 },
                 "leisure/pitch/equestrian": {
                     "name": "Pista de Hipismo",
                     "terms": "equitação, picadeiro, hipismo, cavalos, equinos"
                 },
                 "leisure/pitch/rugby_league": {
-                    "name": "Campo de rugby league",
-                    "terms": "Rugby, Esporte, Campo, "
+                    "name": "Campo de Rugby League",
+                    "terms": "rugby, gramado, campo"
                 },
                 "leisure/pitch/rugby_union": {
-                    "name": "Campo de rugby union",
-                    "terms": "Rugby, Campo, Esporte"
+                    "name": "Campo de Rugby Union",
+                    "terms": "rugby, union, campo"
                 },
                 "leisure/pitch/skateboard": {
                     "name": "Pista de Skate",
-                    "terms": "Parque de Skate, Área para prática de Skate"
+                    "terms": "parque de skate, área para prática de skate, skateboard"
                 },
                 "leisure/pitch/soccer": {
                     "name": "Campo de Futebol",
-                    "terms": "Campo de Futebol"
+                    "terms": "campo de futebol, gramado de futebol, football, gramado, estádio, campinho"
                 },
                 "leisure/pitch/table_tennis": {
                     "name": "Mesa de Pingue-Pongue",
-                    "terms": "Mesa de Ping-Pong, Mesa de Tênis de Mesa"
+                    "terms": "pingue pongue, ping pong, tênis de mesa"
                 },
                 "leisure/pitch/tennis": {
                     "name": "Quadra de Tênis",
                     "terms": "Quadra de Tênis"
                 },
                 "leisure/pitch/volleyball": {
-                    "name": "Quadra de Vôlei",
-                    "terms": "Quadra de Vôlei"
+                    "name": "Quadra de Voleibol",
+                    "terms": "quadra de vôlei"
                 },
                 "leisure/playground": {
                     "name": "Parquinho",
-                    "terms": "playground,parquinho,parque,brinquedo,gangorra,escorrego, escorrega,balanço, parque infantil, crianças"
+                    "terms": "playground,parquinho,parque,brinquedo,gangorra,escorrego, escorrega,balanço, parque infantil, crianças, pracinha"
                 },
                 "leisure/resort": {
                     "name": "Resort",
                     "terms": "corrida, correr, olímpico, olímpica, atletismo, esportes,"
                 },
                 "leisure/sauna": {
-                    "name": "Sauna"
+                    "name": "Sauna",
+                    "terms": "casa de vapor"
                 },
                 "leisure/slipway": {
                     "name": "Rampa Náutica",
                 },
                 "leisure/sports_centre": {
                     "name": "Centro Esportivo / Clube",
-                    "terms": "Centro de esportes"
+                    "terms": "centro de esportes, complexo esportivo, centro desportivo, complexo desportivo"
                 },
                 "leisure/sports_centre/swimming": {
                     "name": "Academia de Natação",
-                    "terms": "Natação, Desportos Aquáticos, Piscina, Centro de Natação"
+                    "terms": "natação, nado, esportes aquáticos, desportos aquáticos, piscina, centro de natação"
                 },
                 "leisure/stadium": {
                     "name": "Estádio",
                 },
                 "leisure/swimming_pool": {
                     "name": "Piscina",
-                    "terms": "Piscina"
+                    "terms": "piscina, natação, nado, esportes aquáticos, esporte aquático"
                 },
                 "leisure/track": {
                     "name": "Pista para esportes não-motorizados",
-                    "terms": "pista de ciclismo, pista de atletismo, hipismo, ciclismo, atletismo, pista de corrida, cooper"
+                    "terms": "pista de ciclismo, pista de atletismo, hipismo, ciclismo, atletismo, pista de corrida, cooper, cão, cães, cachorros, cavalos, corrida, pista"
                 },
                 "leisure/water_park": {
                     "name": "Parque Aquático",
                 },
                 "man_made": {
                     "name": "Construção Humana",
-                    "terms": "Construção Humana"
+                    "terms": "construção humana, artificial"
                 },
                 "man_made/adit": {
                     "name": "Ádito de Mineração",
                     "terms": "Lareira, Forno, Fábrica, Indústria, Gás"
                 },
                 "man_made/crane": {
-                    "name": "Grua"
+                    "name": "Grua",
+                    "terms": "guindaste"
                 },
                 "man_made/cutline": {
                     "name": "Linha de Corte em Floresta",
                 },
                 "man_made/mast": {
                     "name": "Torre estaiada ou monopolo",
-                    "terms": "Torre de comunicação estaiada, Torre de comunicação monopolo, Torre monopolo, torre, torre de comunicação, antena, rádio, celular, comunicação,"
+                    "terms": "Torre de comunicação estaiada, Torre de comunicação monopolo, Torre monopolo, torre, torre de comunicação, antena, torre, rádio, celular, comunicação,"
+                },
+                "man_made/monitoring_station": {
+                    "name": "Estação de Monitoramento"
                 },
                 "man_made/observation": {
                     "name": "Torre de Observação",
-                    "terms": "Torre de observação"
+                    "terms": "torre de observação, observação, ponto de observação, torre de incêndio, incêndio florestal"
                 },
                 "man_made/petroleum_well": {
                     "name": "Poço de Petróleo",
                 },
                 "man_made/pier": {
                     "name": "Píer",
-                    "terms": "Píer"
+                    "terms": "píer, ponte-cais, pontão, "
                 },
                 "man_made/pipeline": {
                     "name": "Tubulação",
                 },
                 "man_made/surveillance": {
                     "name": "Câmera de Segurança",
-                    "terms": "Câmera de Monitoramento, Segurança, Policiamento, Supervisão"
+                    "terms": "câmera, vigilância, monitoramento, policiamento, supervisão, vídeo, webcam, circuito interno"
                 },
                 "man_made/surveillance_camera": {
                     "name": "Câmera de vigilância",
-                    "terms": "câmera de segurança"
+                    "terms": "câmera, vigilância, monitoramento, policiamento, supervisão, vídeo, webcam, circuito interno"
                 },
                 "man_made/survey_point": {
                     "name": "Ponto de Levantamento Geográfico",
                 },
                 "man_made/water_tower": {
                     "name": "Caixa d'Água",
-                    "terms": "Reservatório de Água Elevado, caixa d'água, torre, abastecimento de água"
+                    "terms": "castelo d'água, castelo de água, reservatório de água elevado, caixa d'água, torre, castelo, água, abastecimento de água"
                 },
                 "man_made/water_well": {
                     "name": "Poço de água",
                 },
                 "natural/bay": {
                     "name": "Baía",
-                    "terms": "Baía"
+                    "terms": "baía, enseada"
                 },
                 "natural/beach": {
                     "name": "Praia",
-                    "terms": "Praia"
+                    "terms": "praia, areia"
                 },
                 "natural/cave_entrance": {
                     "name": "Entrada de caverna",
                 },
                 "natural/saddle": {
                     "name": "Passo de Montanha",
-                    "terms": "<translate with synonyms or related terms for 'Saddle', separated by commas>"
+                    "terms": "passo, passo de montanha, topo"
                 },
                 "natural/sand": {
                     "name": "Areia",
-                    "terms": "areia, dunas, duna, deserto"
+                    "terms": "areia, dunas, duna, deserto, praia"
                 },
                 "natural/scree": {
                     "name": "Pedregulhos",
                 },
                 "natural/wetland": {
                     "name": "Zona Úmida",
-                    "terms": "Zona Úmida"
+                    "terms": "zona úmida, pântano, charco, paul, sapal, turfa"
                 },
                 "natural/wood": {
                     "name": "Mata Nativa",
-                    "terms": "Floresta, Bosque"
+                    "terms": "floresta, bosque, selva"
                 },
                 "noexit/yes": {
                     "name": "Rua sem Saída",
-                    "terms": "sem saída, rua fechada, beco sem saída, bloqueio"
+                    "terms": "sem saída, rua fechada, beco sem saída, beco, bloqueio"
                 },
                 "office": {
                     "name": "Escritório",
                     "terms": "Escritório"
                 },
                 "office/accountant": {
-                    "name": "Escritório de Contabilidade"
+                    "name": "Escritório de Contabilidade",
+                    "terms": "escritório contábil"
                 },
                 "office/administrative": {
-                    "name": "Escritório Administrativo",
-                    "terms": "Sala Administrativa, Administração, Sala do Administrativo"
+                    "name": "Escritório Administrativo"
                 },
                 "office/adoption_agency": {
                     "name": "Agência de Adoção"
                 },
                 "office/advertising_agency": {
-                    "name": "Agência de Publicidade"
+                    "name": "Agência de Publicidade",
+                    "terms": "publicidade, propaganda, agência de propaganda, marketing"
                 },
                 "office/architect": {
-                    "name": "Escritório de Arquitetura"
+                    "name": "Escritório de Arquitetura",
+                    "terms": "arquiteto, arquiteta, urbanismo"
                 },
                 "office/association": {
-                    "name": "Escritório de ONG"
+                    "name": "Escritório de organização sem fins lucrativos",
+                    "terms": "entidade sem fins lucrativos, escritório de associação, associação de profissionais, associação de moradores, instituição beneficente, sem lucro"
                 },
                 "office/charity": {
-                    "name": "Escritório de Caridade"
+                    "name": "Escritório de Caridade",
+                    "terms": "beneficência, instituição beneficente"
                 },
                 "office/company": {
-                    "name": "Escritório",
-                    "terms": "Escritório da Empresa"
+                    "name": "Escritório de Empresa",
+                    "terms": "Escritório empresarial, escritório corporativo"
                 },
                 "office/coworking": {
                     "name": "Espaço de Coworking",
                 },
                 "office/educational_institution": {
                     "name": "Instituição Educacional",
-                    "terms": "escola, colégio, universidade, faculdade, curso, instituto, educação, educacional"
+                    "terms": "escola, colégio, universidade, faculdade, curso, instituto, educação, educacional, instituição de ensino, cursinho, ensino"
                 },
                 "office/employment_agency": {
                     "name": "Agência de Empregos",
                     "terms": "agência, SINE, emprego, empregos, desempregado"
                 },
                 "office/energy_supplier": {
-                    "name": "Escritório de Fornecedor de Energia"
+                    "name": "Escritório de Fornecedor de Energia",
+                    "terms": "eletricidade, empresa de energia, gás"
                 },
                 "office/estate_agent": {
                     "name": "Imobiliária",
                     "terms": "Escritório Financeiro, Financeiro"
                 },
                 "office/forestry": {
-                    "name": "Escritório da Administração Florestal"
+                    "name": "Escritório da Administração Florestal",
+                    "terms": "guarda florestal, floresta, reserva"
                 },
                 "office/foundation": {
                     "name": "Escritório de Fundação"
                 },
                 "office/government": {
                     "name": "Órgão governamental",
-                    "terms": "Gabinete, escritório, governo, secretaria, organização, departamento"
+                    "terms": "gabinete, escritório, governo, secretaria, organização, departamento, prefeitura, federal, municipal, estadual"
                 },
                 "office/government/register_office": {
                     "name": "Cartório",
                     "terms": "tabelionato, registro civil, registro de imóveis"
                 },
                 "office/government/tax": {
-                    "name": "Escritório de Receita e Fisco"
+                    "name": "Escritório de Receita e Fisco",
+                    "terms": "autoridade fiscal, receita, fazenda, taxas, impostos"
                 },
                 "office/guide": {
-                    "name": "Escritório de Guia Turístico"
+                    "name": "Escritório de Guia Turístico",
+                    "terms": "turismo, tour"
                 },
                 "office/insurance": {
                     "name": "Seguradora",
-                    "terms": "seguro, seguradora, apólice, corretor"
+                    "terms": "seguro, seguradora, apólice, corretora"
                 },
                 "office/it": {
-                    "name": "Escritório de Empresa de Tecnologia da Informação"
+                    "name": "Escritório de Empresa de Tecnologia da Informação",
+                    "terms": "informática, computadores, software, tecnologia"
                 },
                 "office/lawyer": {
                     "name": "Escritório de Advocacia",
-                    "terms": "advocacia, advogado, justiça, Direito"
+                    "terms": "advocacia, advogado, advogada, justiça, direito, lei"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notário",
-                    "terms": "Notário, Cartório"
+                    "name": "Tabelião"
                 },
                 "office/moving_company": {
-                    "name": "Escritório de Companhia de Mudanças"
+                    "name": "Escritório de Companhia de Mudanças",
+                    "terms": "empresa de mudanças, relocação, mudança"
                 },
                 "office/newspaper": {
                     "name": "Escritório de Jornal"
                     "terms": "ONG Escritório, Departamento de ONG, Organização não governamental"
                 },
                 "office/notary": {
-                    "name": "Tabelionato"
+                    "name": "Tabelionato",
+                    "terms": "notário, escritório notarial, tabelião, cartório"
                 },
                 "office/physician": {
                     "name": "Médico"
                     "terms": "política, político, partido, gabinete"
                 },
                 "office/private_investigator": {
-                    "name": "Escritório de Detetive"
+                    "name": "Escritório de Detetive Particular",
+                    "terms": "detetive particular, investigador privado"
                 },
                 "office/quango": {
-                    "name": "Escritório de Organização Não Governamental Quase Autônoma"
+                    "name": "Escritório de Organização Não Governamental Quase Autônoma",
+                    "terms": "ong, não governamental, quase-autônoma, organização"
                 },
                 "office/research": {
                     "name": "Escritório de Pesquisa",
                     "terms": "pesquisa, pesquisas, pesquisador, escritório"
                 },
+                "office/surveyor": {
+                    "name": "Escritório de Pesquisas ou Inspeções",
+                    "terms": "agrimensura, análise de riscos, ibge, estatística, opinião"
+                },
                 "office/tax_advisor": {
                     "name": "Escritório de Assessoria Fiscal"
                 },
                     "name": "Agência de Viagens"
                 },
                 "office/water_utility": {
-                    "name": "Escritório de Companhia de Água"
+                    "name": "Escritório de Companhia de Água",
+                    "terms": "águas e esgoto"
                 },
                 "piste": {
                     "name": "Pista de Ski",
                 },
                 "place/hamlet": {
                     "name": "Lugarejo",
-                    "terms": "Lugarejo"
+                    "terms": "Lugarejo, vilarejo, vila, aldeia"
                 },
                 "place/island": {
                     "name": "Ilha",
-                    "terms": "Ilhota"
+                    "terms": "Ilhota, arquipélago, coral, corais"
                 },
                 "place/islet": {
-                    "name": "Ilhota"
+                    "name": "Ilhota",
+                    "terms": "ilha, arquipélago, coral, corais"
                 },
                 "place/isolated_dwelling": {
                     "name": "Moradia Isolada",
-                    "terms": "Moradia Isolada"
+                    "terms": "moradia isolada, casa isolada, habitação isolada"
                 },
                 "place/locality": {
                     "name": "Localidade",
                     "terms": "Vizinhança, Bairro"
                 },
                 "place/plot": {
-                    "name": "Lote"
+                    "name": "Lote",
+                    "terms": "terreno, terra, demarcação"
                 },
                 "place/quarter": {
                     "name": "Sub-bairro",
                     "terms": "loteamento, conjunto habitacional, residencial,"
                 },
                 "place/square": {
-                    "name": "Praça",
-                    "terms": "Quadra"
+                    "name": "Praça Pavimentada",
+                    "terms": "quadra, praça, pracinha"
                 },
                 "place/suburb": {
                     "name": "Bairro",
-                    "terms": "distrito"
+                    "terms": "distrito, vizinhança"
                 },
                 "place/town": {
                     "name": "Cidade Menor",
                 },
                 "place/village": {
                     "name": "Povoado",
-                    "terms": "Vila, Povoado, Distrito"
+                    "terms": "vila, povoado, distrito, aldeia"
                 },
                 "playground/cushion": {
-                    "name": "Colchão Inflável"
+                    "name": "Pula-Pula Inflável",
+                    "terms": "castelo inflável, colchão infável"
                 },
                 "playground/rocker": {
                     "name": "Balanço de Mola"
                     "terms": "Carrossel,  Gira-Gira"
                 },
                 "playground/sandpit": {
-                    "name": "Caixa de Areia"
+                    "name": "Caixa de Areia",
+                    "terms": "tabuleiro de areia"
                 },
                 "playground/seesaw": {
                     "name": "Gangorra"
                 },
                 "power/generator/source_wind": {
                     "name": "Turbina Eólica",
-                    "terms": "gerador, turbina, moinho de vento, vento, energia eólica, eólico,"
+                    "terms": "gerador, turbina, moinho de vento, vento, energia eólica, eólico, catavento"
                 },
                 "power/line": {
                     "name": "Linha de Transmissão",
-                    "terms": "Fio Elétrico, Condutor Elétrico, Linha de Transmissão"
+                    "terms": "Fio Elétrico, Condutor Elétrico, Linha de Transmissão, fio de alta tensão, eletricidade"
                 },
                 "power/minor_line": {
                     "name": "Linha de Distribuição",
-                    "terms": "Linha de Subtransmissão, Linha de Transmissão Secundária"
+                    "terms": "Linha de Subtransmissão, Linha de Transmissão Secundária, fio de alta tensão, fio elétrico, linha de transmissão, eletricidade"
                 },
                 "power/plant": {
                     "name": "Área de Usina Elétrica",
-                    "terms": "Hidrelétrica, fazenda eólica, eletricidade, energia solar, usina nuclear, termoelétrica, usina de produção de energia, energia elétrica,"
+                    "terms": "usina de produção de energia, energia elétrica, eletricidade, hidrelétrica, fazenda eólica, eletricidade, energia solar, usina nuclear, termoelétrica, termelétrica"
                 },
                 "power/pole": {
                     "name": "Poste de Transmissão",
-                    "terms": "Poste Elétrico"
+                    "terms": "poste elétrico, post de energia, energia elétrica, eletricidade"
                 },
                 "power/sub_station": {
                     "name": "Subestação Elétrica"
                 },
                 "power/substation": {
-                    "name": "Subestação",
-                    "terms": "subestação"
+                    "name": "Subestação Elétrica",
+                    "terms": "subestação de energia elétrica, eletricidade"
+                },
+                "power/switch": {
+                    "name": "Interruptor de energia",
+                    "terms": "disjuntor, eletricidade"
                 },
                 "power/tower": {
                     "name": "Torre de Alta Tensão",
-                    "terms": "Torre de Alta Tensão"
+                    "terms": "alta tensão"
                 },
                 "power/transformer": {
                     "name": "Transformador",
-                    "terms": "Transformador"
+                    "terms": "transformador, energia elétrica, eletricidade"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Parada de Ônibus / Plataforma",
+                    "terms": "ônibus, ponto de ônibus, transporte público, plataforma, trânsito"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Parada de VLT / Plataforma",
+                    "terms": "veículo leve sobre trilhos, VLT, bonde, transporte público, trânsito, transporte, coletivo"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Parada de Monotrilho / Plataforma",
+                    "terms": "monotrilho, monocarrilho, trilho, trem, transporte público, trânsito, transporte"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Parada de metrô / Plataforma",
+                    "terms": "metrô, plataforma, transporte público, trânsito, trilhos"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Parada de trem / Plataforma",
+                    "terms": "trem, estação, trilhos, transporte público, trânsito, transporte"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Parada de Bonde / Plataforma",
+                    "terms": "ponto de bonde, eléctrico, tram, vlt, veículo sobre trilhos, transporte público, transporte coletivo, trânsito, trólebus, trolleybus"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Parada de Trólebus / Plataforma",
+                    "terms": "parada de trolleybus, ponto de trólebus, trólei, tróleibus, trolleybus, bonde, tram, elétrico, trânsito, transporte público, transporte, coletivo"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Parada de ônibus / Plataforma",
+                    "terms": "ônibus, ponto de ônibus, transporte público, plataforma, trânsito"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Parada de VLT / Plataforma",
+                    "terms": "veículo leve sobre trilhos, VLT, bonde, transporte público, trânsito, transporte, coletivo"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Parada de Monotrilho / Plataforma",
+                    "terms": "monotrilho, monocarrilho, trilho, trem, transporte público, trânsito, transporte"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Parada de metrô / Plataforma",
+                    "terms": "metrô, plataforma, transporte público, trânsito, trilhos"
+                },
+                "public_transport/platform_train": {
+                    "name": "Parada de trem / Plataforma",
+                    "terms": "trem, estação, trilhos, transporte público, trânsito, transporte"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Parada de Bonde / Plataforma",
+                    "terms": "ponto de bonde, eléctrico, tram, vlt, veículo sobre trilhos, transporte público, transporte coletivo, trânsito, trólebus, trolleybus"
                 },
-                "public_transport/platform": {
-                    "name": "Plataforma",
-                    "terms": "plataforma, embarque, desembarque, espera, transporte público"
+                "public_transport/platform_trolleybus": {
+                    "name": "Parada de Trólebus / Plataforma",
+                    "terms": "parada de trolleybus, ponto de trólebus, trólei, tróleibus, trolleybus, bonde, tram, elétrico, trânsito, transporte público, transporte, coletivo"
                 },
-                "public_transport/stop_position": {
-                    "name": "Posição de Parada",
-                    "terms": "ponto, parada, ônibus, metrô, trem"
+                "public_transport/station": {
+                    "name": "Estação de trânsito"
+                },
+                "public_transport/station_bus": {
+                    "name": "Rodoviária / Terminal de Ônibus",
+                    "terms": "ônibus, estação de ônibus, estação rodoviária, terminal rodoviário, estação, transporte público, trânsito"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Estação de Balsa / Terminal",
+                    "terms": "balsa, barco, ferry boat, ferribote, ferry, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Estação de VLT",
+                    "terms": "estação de veículo leve sobre trilhos, veículo leve sobre trilhos, trem ligeiro, metrô de superfície, bonde, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Estação de Monotrilho",
+                    "terms": "monotrilho, trem, metrô, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_subway": {
+                    "name": "Estação de Metrô",
+                    "terms": "subsolo, trem, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_train": {
+                    "name": "Estação de Trem",
+                    "terms": "estação ferroviária, trem, trilhos, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_train_halt": {
+                    "terms": "estação de trem, estação ferroviária, ferrovia, trilhos, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_tram": {
+                    "name": "Estação de Bonde",
+                    "terms": "bonde, elétrico, VLT, trem leve, bondinho, ferrovia parada de bonde, estação, terminal, transporte público, transporte, trânsito"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Estação de Trólebus / Terminal"
                 },
                 "railway": {
                     "name": "Ferrovia"
                     "name": "Funicular",
                     "terms": "Funicular, Plano Inclinado"
                 },
-                "railway/halt": {
-                    "name": "Parada de Ferrovia",
-                    "terms": "Estação de Parada na Ferrovia, Estação Simples, Estação Sem Facilidades"
-                },
                 "railway/level_crossing": {
                     "name": "Cruzamento de Ferrovia (Estrada)",
                     "terms": "Passagem de Nível (Estrada)"
                 },
+                "railway/light_rail": {
+                    "name": "Veículo Leve sobre Trilhos (VLT)",
+                    "terms": "VLT, trem ligeiro, comboio ligeiro, metrô de superfície, trem, tram, "
+                },
                 "railway/milestone": {
                     "name": "Marco de Ferrovia",
                     "terms": "marco de quilometragem, quilômetro, kilometro, ferrovia, marco quilométrico"
                 },
+                "railway/miniature": {
+                    "name": "Ferrovia em Miniatura",
+                    "terms": "miniferrovia, mini-ferrovia, mini ferrovia, miniatura, brinquedo, tremzinho"
+                },
                 "railway/monorail": {
                     "name": "Monotrilho",
                     "terms": "Monotrilho"
                     "terms": "Ferrovia de Bitola Estreita"
                 },
                 "railway/platform": {
-                    "name": "Plataforma de Trem",
-                    "terms": "Plataforma de Trem"
+                    "name": "Parada Ferroviária / Plataforma"
                 },
                 "railway/rail": {
                     "name": "Trilho de trem",
                     "terms": "sinal de ferrovia, sinaleira de ferrovia, ferrovia, farol, trânsito, sinal luminoso"
                 },
                 "railway/station": {
-                    "name": "Estação Ferroviária",
-                    "terms": "Estação Ferroviária"
+                    "name": "Estação Ferroviária"
                 },
                 "railway/subway": {
                     "name": "Trilho de metrô",
                     "name": "Trilho de bonde",
                     "terms": "Bonde, VLT, Veículo leve sobre trilhos"
                 },
-                "railway/tram_stop": {
-                    "name": "Parada de VLT",
-                    "terms": "VLT, trem leve, estação de trem, trilho, estação, ponto de VLT, Estação de VLT, bondinho, parada de bondinho, estação de bondinho, ferrovia, parada de trem"
-                },
                 "relation": {
                     "name": "Relação",
                     "terms": "Relação"
                     "terms": "Loja, Comércio"
                 },
                 "shop/agrarian": {
-                    "name": "Loja de Produtos Agrícolas"
+                    "name": "Loja de Produtos Agrícolas",
+                    "terms": "loja de produtos agropecuários, sementes, fertilizantes, ferramentas agrícolas, loja agrícola, máquinas agrícolas, pesticidas"
                 },
                 "shop/alcohol": {
                     "name": "Loja de alcoólicos licenciada",
                 },
                 "shop/kiosk": {
                     "name": "Quiosque",
-                    "terms": "Kiosk, kioske"
+                    "terms": "kiosk, kioske, banca"
                 },
                 "shop/kitchen": {
                     "name": "Loja de Cozinhas",
                     "terms": "Loja de Tickets, Bilhetes, Entradas"
                 },
                 "shop/tiles": {
-                    "name": "Loja de Azulejos"
+                    "name": "Loja de Azulejos",
+                    "terms": "loja de pisos, cerâmicas, azulejos, asulejos"
                 },
                 "shop/tobacco": {
                     "name": "Tabacaria",
                     "terms": "Loja de Brinquedos"
                 },
                 "shop/trade": {
-                    "name": "Distribuidor"
+                    "name": "Distribuidor",
+                    "terms": "distribuidora, destribuidora"
                 },
                 "shop/travel_agency": {
                     "name": "Agência de Viagens",
                 },
                 "shop/video_games": {
                     "name": "Loja de Vídeogames",
-                    "terms": "Loja de Jogos, Vídeogames, Jogos Eletrônicos"
+                    "terms": "Loja de Jogos, Vídeogames, Jogos Eletrônicos, video games"
                 },
                 "shop/watches": {
                     "name": "Relojoaria",
                     "name": "Estacionamento de Trailers",
                     "terms": "Estacionamento de Trailers"
                 },
+                "tourism/chalet": {
+                    "name": "Chalé"
+                },
                 "tourism/gallery": {
                     "name": "Galeria de Arte",
                     "terms": "Arte, Galeria, Exposição, Artes Plásticas, Cultura, museu"
                     "name": "Rota de Equitação",
                     "terms": "Rota de Montaria, Trilha de Equitação"
                 },
+                "type/route/light_rail": {
+                    "name": "Rota de VLT",
+                    "terms": "Rota de veículo leve sobre trilhos, rota de trem ligeiro"
+                },
                 "type/route/pipeline": {
                     "name": "Rota de Tubulação",
                     "terms": "Rota de Tubulação, Faixa de Dutos"
                 },
+                "type/route/piste": {
+                    "name": "Rota de Ski",
+                    "terms": "ski, pista de esqui, esqui, snowboarding"
+                },
                 "type/route/power": {
                     "name": "Rota de Energia Elétrica",
                     "terms": "Rota de Energia Elétrica"
                     "name": "Rota Rodoviária",
                     "terms": "Rota Rodoviária"
                 },
+                "type/route/subway": {
+                    "name": "Rota de Metrô",
+                    "terms": "Rota de Metrô, rota de trem, rota de transporte público, transporte público"
+                },
                 "type/route/train": {
                     "name": "Rota Ferroviária",
                     "terms": "Rota Ferroviária, Trem, Linha Ferroviária"
                     "terms": "Rota Mestre"
                 },
                 "type/site": {
-                    "name": "Local",
-                    "terms": "Site"
+                    "name": "Grupo de Elementos",
+                    "terms": "Grupo de prédios, cadeia de lojas, elementos"
                 },
                 "type/waterway": {
                     "name": "Hidrovia",
         },
         "imagery": {
             "Bing": {
-                "description": "Imagem aérea e de satélite.",
-                "name": "Imagem aérea do Bing"
+                "description": "Imagens aéreas e de satélite.",
+                "name": "Imagens aéreas do Bing"
             },
             "DigitalGlobe-Premium": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
-                "description": "Imagem de satélite premium da DigitalGlobe.",
-                "name": "Imagem premium da DigitalGlobe"
+                "description": "Imagens de satélite premium da DigitalGlobe.",
+                "name": "Imagens premium da DigitalGlobe"
             },
             "DigitalGlobe-Premium-vintage": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
                 "description": "Limites de imagens de satélite e datas de captura. Etiquetas aparecerão no nível de zoom 14 ou acima.",
                 "name": "Bordas das Imagens de Satélite DigitalGlobe Premium"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
-                "description": "Imagem de satélite padrão da DigitalGlobe.",
-                "name": "Imagem padrão da DigitalGlobe"
+                "description": "Imagens de satélite padrão da DigitalGlobe.",
+                "name": "Imagens padrão da DigitalGlobe"
             },
             "DigitalGlobe-Standard-vintage": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
                 "description": "Limites de imagens de satélite e datas de captura. Etiquetas aparecerão no nível de zoom 14 ou acima.",
                 "name": "Boradas das Imagens de Satélite DigitalGlobe Standard"
             },
             "EsriWorldImagery": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
-                "description": "Imagem mundial da ESRI.",
-                "name": "Imagem mundial da ESRI"
+                "description": "Imagens globais da ESRI.",
+                "name": "Imagens globais da ESRI"
             },
             "MAPNIK": {
                 "attribution": {
             },
             "Mapbox": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
-                "description": "Imagem aérea e de satélite.",
-                "name": "Imagem de satélite Mapbox"
+                "description": "Imagens aéreas e de satélite.",
+                "name": "Imagens de satélite Mapbox"
             },
             "OSM_Inspector-Addresses": {
                 "attribution": {
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dados do mapa Colaboradores do OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, colaboradores do OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Trilhas marcadas: ciclismo"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dados do mapa Colaboradores do OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, colaboradores do OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Trilhas marcadas: caminhada"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dados do mapa Colaboradores do OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, colaboradores do OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Trilhas marcadas: MTB"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, dados do mapa Colaboradores do OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, colaboradores do OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Trilhas marcadas: patinação"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, dados do mapa Colaboradores do OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, colaboradores do OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Trilhas marcadas: esportes de inverno"
             },
                 "attribution": {
                     "text": "basemap.at"
                 },
-                "description": "Ortofotomapa fornecido por basemap.at. Sucessor de geoimage.at imagery.",
-                "name": "Ortofotomapa geoimage.at"
+                "description": "Ortofotomapa fornecido por basemap.at, \"sucessor\" das imagens de geoimage.at.",
+                "name": "Ortofotomapa basemap.at"
             },
             "hike_n_bike": {
                 "attribution": {
                     "text": "© Colaboradores do OpenStreetMap"
                 },
-                "name": "Caminhada & Ciclismo"
+                "name": "Caminhada e Ciclismo"
             },
             "mapbox_locator_overlay": {
                 "attribution": {
-                    "text": "Termos & Comentários"
+                    "text": "Termos e Comentários"
                 },
                 "description": "Mostra as principais funcionalidades para orientar você.",
-                "name": "Sobreposição do Mapbox Locator"
+                "name": "Sobreposição do Locator"
             },
             "openpt_map": {
                 "attribution": {
index d83336cd6d1862306bd4d98dbe2389556a48c497..6647f47bd502c91e9b4afc562e48ee99fe37a33d 100644 (file)
@@ -8,7 +8,7 @@
             },
             "add_line": {
                 "title": "Linha",
-                "description": "Adicionar estradas, caminhos, ciclovias, pontes, túneis, rios, ribeiros, etc.",
+                "description": "Adicionar estradas, caminhos, trilhos, ribeiros ou outros elementos de linha no mapa",
                 "tail": "Clique no mapa para começar a desenhar uma estrada, caminho, ciclovia, ponte, túnel, rio, ribeiro, etc."
             },
             "add_point": {
             },
             "browse": {
                 "title": "Navegar",
-                "description": "Faça zoom e mova o mapa"
+                "description": "Aproximar e mover o mapa."
             },
             "draw_area": {
-                "tail": "Clique para adicionar pontos na área. Clique no ponto inicial para terminar de criar a área."
+                "tail": "Clique para adicionar nós na área. Clique no nó inicial para terminar de criar a área."
             },
             "draw_line": {
-                "tail": "Clique para adicionar mais pontos à estrada. Clique em outras linhas para ligar esta estrada a outras. Pode terminar a estrada clicando 2 vezes seguidas."
+                "tail": "Clique para adicionar mais nós à estrada. Clique em outras linhas para ligar esta estrada a outras. Pode terminar a estrada clicando 2 vezes seguidas."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Isto não pode ser editado porque está conectado a um elemento oculto."
             }
         },
         "operations": {
             "add": {
                 "annotation": {
                     "point": "Ponto adicionado.",
-                    "vertex": "Ponto adicionado a uma linha.",
+                    "vertex": " adicionado a uma linha.",
                     "relation": "Relação adicionada."
                 }
             },
@@ -48,8 +51,8 @@
                 "not_eligible": "Não há nesta zona nenhuma linha que possa ser continuada.",
                 "multiple": "Podem ser continuadas várias linhas aqui. Para escolher uma linha, pressione a tecla Shift e clique na linha para a selecionar.",
                 "annotation": {
-                    "line": "Continuação da linha.",
-                    "area": "Continuação da área."
+                    "line": "Continuar uma linha.",
+                    "area": "Continuar uma área."
                 }
             },
             "cancel_draw": {
                 },
                 "key": "O",
                 "annotation": {
-                    "line": "Linha tornada num círculo.",
-                    "area": "Área tornada num círculo."
+                    "line": "Linha transformada num círculo.",
+                    "area": "Área transformada num círculo."
                 },
-                "not_closed": "Isto não pode ser tornado circular porque não é uma linha fechada.",
-                "too_large": "Não é possível fazer um círculo porque o elemento não está completamente visível no mapa.",
-                "connected_to_hidden": "Não é possível fazer um círculo pois este elemento está ligado a outro elemento oculto."
+                "not_closed": "Isto não pode ser transformado num círculo porque não é uma linha fechada.",
+                "too_large": "Isto não pode ser transformado num círculo porque o elemento não está completamente visível no mapa.",
+                "connected_to_hidden": "Isto não pode ser transformado num círculo, pois este elemento está conectado a outro elemento oculto."
             },
             "orthogonalize": {
                 "title": "Esquadrar",
                 "description": {
-                    "line": "Pôr em esquadria os cantos desta linha.",
-                    "area": "Pôr em esquadria os cantos desta área."
+                    "line": "Esquadrar os cantos desta linha.",
+                    "area": "Esquadrar os cantos desta área."
                 },
                 "key": "S",
                 "annotation": {
-                    "line": "Cantos da linha em esquadria.",
-                    "area": "Cantos da área em esquadria."
+                    "line": "Esquadrar os cantos da linha.",
+                    "area": "Esquadrar os cantos da área."
                 },
-                "not_squarish": "Isto não pode ser tornado quadrado porque não tem um formato quadrangular.",
-                "too_large": "Não é possível pôr em esquadria porque o objeto não está completamente visível no mapa.",
-                "connected_to_hidden": "Não é possível pôr em esquadria pois este elemento está ligado a outro elemento oculto."
+                "not_squarish": "Não é possível esquadrar, porque não tem um formato quadrangular.",
+                "too_large": "Não é possível esquadrar porque o objeto não está completamente visível no mapa.",
+                "connected_to_hidden": "Não é possível esquadrado, pois este elemento está conectado a outro elemento oculto."
             },
             "straighten": {
                 "title": "Endireitar",
                 "key": "S",
                 "annotation": "Linha endireitada.",
                 "too_bendy": "Isto não pode ser endireitado porque é demasiado curvo.",
-                "connected_to_hidden": "Não é possível endireitar pois este elemento está ligado a outro elemento oculto."
+                "connected_to_hidden": "Não é possível endireitar pois este elemento está conectado a outro elemento oculto."
             },
             "delete": {
                 "title": "Eliminar",
                 },
                 "annotation": {
                     "point": "Ponto eliminado.",
-                    "vertex": "Ponto eliminado de uma linha.",
+                    "vertex": " eliminado de uma linha.",
                     "line": "Linha eliminada.",
                     "area": "Área eliminada.",
                     "relation": "Relação eliminada.",
                     "multiple": "Estes elementos não podem ser eliminados porque fazem parte de relações maiores. Tem de os remover primeiro das relações."
                 },
                 "connected_to_hidden": {
-                    "single": "Não é possível eliminar este elemento porque está ligado a outro elemento oculto.",
-                    "multiple": "Não é possível eliminar estes elementos porque alguns estão ligados a elementos ocultos."
+                    "single": "Não é possível eliminar este elemento porque está conectado a outro elemento oculto.",
+                    "multiple": "Não é possível eliminar estes elementos porque alguns estão conectados a elementos ocultos."
                 }
             },
             "add_member": {
             },
             "connect": {
                 "annotation": {
-                    "point": "Linha ligada a um ponto.",
-                    "vertex": "Linha ligada a outra.",
-                    "line": "Linha ligada a outra linha.",
-                    "area": "Linha ligada a uma área."
+                    "point": "Linha conectado a um ponto.",
+                    "vertex": "Linha conectada a outra.",
+                    "line": "Linha ou área conectada a outra linha.",
+                    "area": "Linha conectada a uma área."
                 }
             },
             "disconnect": {
-                "title": "Desligar",
-                "description": "Desligar estas linhas/áreas entre elas.",
+                "title": "Desconectar",
+                "description": "Desconectar estas linhas/áreas entre elas.",
                 "key": "D",
-                "annotation": "Linhas/áreas desligadas.",
-                "not_connected": "Para desligar é necessário selecionar 1 ponto comum a pelo menos 2 linhas ou áreas.",
-                "connected_to_hidden": "Não é possível desligar pois este elemento está ligado a outro elemento oculto.",
+                "annotation": "Linhas/áreas desconectadas.",
+                "not_connected": "Não existem linhas ou áreas suficientes para serem desconectadas.",
+                "connected_to_hidden": "Não é possível desconectar este elemento, já que está conectado a outro elemento oculto.",
                 "relation": "Isto não pode ser desconectado porque conecta membros de uma relação."
             },
             "merge": {
                 "key": "C",
                 "annotation": "{n} elementos combinados.",
                 "not_eligible": "Estes elementos não podem ser combinados.",
-                "not_adjacent": "Estas linhas não podem ser unidas porque as suas extremidades não estão ligadas.",
+                "not_adjacent": "Estes elementos não podem ser unidos porque as suas extremidades não estão conectadas.",
                 "restriction": "Estes elementos não podem ser combinados porque pelo menos um deles é membro da relação \"{relation}\".",
                 "incomplete_relation": "Estes elementos não podem ser combinados porque pelo menos um deles não está completamente descarregado no mapa.",
                 "conflicting_tags": "Estes elementos não podem ser combinados porque algumas das suas etiquetas entram em conflito."
                 "key": "M",
                 "annotation": {
                     "point": "Ponto movido.",
-                    "vertex": "Ponto de uma linha movido.",
+                    "vertex": " de uma linha movido.",
                     "line": "Linha movida.",
                     "area": "Área movida.",
                     "multiple": "Vários elementos movidos."
                     "multiple": "Estes elementos não podem ser movidos porque não estão completamente visíveis."
                 },
                 "connected_to_hidden": {
-                    "single": "Este elemento não pode ser movido porque está ligado a outro elemento oculto.",
-                    "multiple": "Estes elementos não podem ser movidos porque alguns estão ligados a outros elementos ocultos."
+                    "single": "Este elemento não pode ser movido porque está conectado a outro elemento oculto.",
+                    "multiple": "Estes elementos não podem ser movidos porque alguns estão conectados a outros elementos ocultos."
                 }
             },
             "reflect": {
                     "multiple": "Estes elementos não podem ser refletidos porque não estão completamente visíveis."
                 },
                 "connected_to_hidden": {
-                    "single": "Este elemento não pode ser refletido porque está ligado a um elemento oculto.",
-                    "multiple": "Estes elementos não podem ser refletidos porque alguns estão ligados elementos ocultos."
+                    "single": "Este elemento não pode ser refletido porque está conectado a um elemento oculto.",
+                    "multiple": "Estes elementos não podem ser refletidos porque alguns estão conectados a elementos ocultos."
                 }
             },
             "rotate": {
                     "multiple": "Estes elementos não podem ser rodados porque não estão completamente visíveis."
                 },
                 "connected_to_hidden": {
-                    "single": "Este elemento não pode ser rodado porque está ligado a outro elemento oculto.",
-                    "multiple": "Estes elementos não podem ser rodados porque alguns estão ligados a outros elementos ocultos."
+                    "single": "Este elemento não pode ser rodado porque está conectado a outro elemento oculto.",
+                    "multiple": "Estes elementos não podem ser rodados porque alguns estão conectados a outros elementos ocultos."
                 }
             },
             "reverse": {
             "split": {
                 "title": "Dividir",
                 "description": {
-                    "line": "Dividir esta linha em duas neste ponto.",
+                    "line": "Dividir esta linha em duas neste .",
                     "area": "Dividir o contorno desta área em dois.",
-                    "multiple": "Dividir os contornos das linhas/área neste ponto em duas."
+                    "multiple": "Dividir os contornos das linhas/área neste  em duas."
                 },
                 "key": "X",
                 "annotation": {
                 },
                 "not_eligible": "As linhas não podem ser divididas no seu início ou fim.",
                 "multiple_ways": "Existem aqui demasiadas linhas para dividir.",
-                "connected_to_hidden": "Não é possível dividir porque este elemento está ligado a outro elemento oculto."
+                "connected_to_hidden": "Não é possível dividir porque este elemento está conectado a outro elemento oculto."
             },
             "restriction": {
                 "help": {
             "nothing": "Nada a refazer."
         },
         "tooltip_keyhint": "Atalho:",
-        "browser_notice": "Este editor funciona em Firefox, Chrome, Safari, Opera e Internet Explorer 11 ou superior. Por favor atualize o seu navegador de internet ou utilize o editor Potlatch 2 para editar o mapa.",
+        "browser_notice": "Este editor funciona no Firefox, Chrome, Safari, Opera e Internet Explorer 11 ou superior. Por favor atualize o seu navegador de internet ou utilize o editor Potlatch 2 para editar o mapa.",
         "translate": {
             "translate": "Traduzir",
             "localized_translation_label": "Nome noutras línguas",
             "created": "Criado",
             "about_changeset_comments": "Sobre comentários de alterações",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Mencionou o Google no seu comentário: lembre-se que copiar do Google Mapas é estritamente proibido.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright/pt"
+            "google_warning": "Mencionou o Google no seu comentário: lembre-se que copiar do Google Mapas é expressamente proibido.",
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Edições de {users}",
                 "resolution": "Resolução",
                 "accuracy": "Precisão",
                 "unknown": "Desconhecido",
-                "show_tiles": "Mostrar Telas",
-                "hide_tiles": "Ocultar Telas",
+                "show_tiles": "Mostrar moisaco",
+                "hide_tiles": "Ocultar moisaco",
                 "show_vintage": "Mostrar data de captura",
                 "hide_vintage": "Ocultar data de captura"
             },
                 "title": "Medição",
                 "selected": "{n} selecionado",
                 "geometry": "Geometria",
-                "closed": "fechado",
+                "closed_line": "Linha fechada",
+                "closed_area": "Área fechada",
                 "center": "Centro",
                 "perimeter": "Perímetro ",
                 "length": "Comprimento",
                 "centroid": "Centróide",
                 "location": "Localização",
                 "metric": "Métrico",
-                "imperial": "Imperial"
+                "imperial": "Imperial",
+                "node_count": "Número de nós"
             }
         },
         "geometry": {
             "all_relations": "Todas as relações",
             "new_relation": "Nova relação...",
             "role": "Função",
-            "choose": "Editar tipo de elemento",
+            "choose": "Selecionar tipo de elemento",
             "results": "{n} resultados para {search}",
             "reference": "Ver na Wiki do OpenStreetMap",
             "back_tooltip": "Alterar elemento",
             },
             "add": "Adicionar",
             "none": "Nenhum",
-            "node": "Ponto",
+            "node": "",
             "way": "Linha",
             "relation": "Relação",
             "location": "Localização",
             "title": "Imagem de Fundo",
             "description": "Configurar imagem de fundo",
             "key": "B",
-            "percent_brightness": "{opacity}% brilho",
+            "backgrounds": "Camada de fundo",
             "none": "Nenhum",
             "best_imagery": "Melhor fonte de imagem para esse lugar",
             "switch": "Mudar para este fundo",
             "custom": "Personalizado",
             "custom_button": "Editar fundo personalizando",
-            "custom_prompt": "Introduza um modelo de URL de telas. Tokens válidos:\n   - {zoom}/{z}, {x}, {y} para o esquema de telas Z/X/Y\n   - {ty} para coordenadas Y invertidas do estilo TMS\n   - {u} para o esquema quadtile\n   - {switch:a,b,c} para servidor DNS multiplexing\n\nExemplo:\n{example}",
-            "fix_misalignment": "Corrigir o alinhamento da imagem",
-            "imagery_source_faq": "Qual é a origem desta imagem?",
+            "custom_prompt": "Indique um URL para modelo de mosaicos. Os tokens válidos são:\n   - {zoom} ou {z}, {x}, {y} para Z/X/Y esquema de mosaico\n   - {-y} ou {ty} para estilo TMS invertido, coordenadas Y\n   - {u} para esquemas de mosaicos divididos em quatro\n   - {switch:a,b,c} para servidores DNS\n\nExamplo:\n{example}",
+            "overlays": "Camadas superiores",
+            "imagery_source_faq": "Informação da imagem / Reportar um problema",
             "reset": "reiniciar",
-            "offset": "Arraste a área cinzenta abaixo para corrigir o alinhamento da imagem ou introduza os valores de deslocamento em metros. ",
+            "display_options": "Opções de visualização",
+            "brightness": "Brilho",
+            "contrast": "Contraste",
+            "saturation": "Saturação",
+            "sharpness": "Nitidez",
             "minimap": {
-                "description": "Mini-mapa",
+                "description": "Mostrar mini mapa",
                 "tooltip": "Mostra um pequeno mapa com uma área mais abrangente que ajuda a localizar a área que está a editar.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Corrigir o alinhamento da imagem",
+            "offset": "Arraste a área cinzenta abaixo para corrigir o deslocamento da imagem ou introduza os valores de deslocamento em metros. "
         },
         "map_data": {
             "title": "Dados do Mapa",
             },
             "fill_area": "Preenchimento de Áreas",
             "map_features": "Elementos do Mapa",
-            "autohidden": "Estes elementos foram automaticamente ocultados porque senão haveriam demasiados elementos no ecrã. Pode fazer zoom e editá-los.",
-            "osmhidden": "Estes elementos foram automaticamente ocultados porque a camada OpenStreetMap está oculta"
+            "autohidden": "Estes elementos foram automaticamente ocultados, caso contrário haveriam demasiados elementos no ecrã. Pode aproximar e editá-los.",
+            "osmhidden": "Estes elementos foram automaticamente ocultados porque a camada OpenStreetMap está oculta."
         },
         "feature": {
             "points": {
             "status_code": "O servidor devolveu o seguinte código {code}",
             "unknown_error_details": "Por favor certifique-se que está ligado à Internet.",
             "uploading": "A enviar as alterações para o OpenStreetMap...",
+            "conflict_progress": "Confirmando conflitos: {num} de {total}",
             "unsaved_changes": "Tem alterações por gravar",
             "conflict": {
                 "header": "Resolver alterações em conflito",
             "facebook": "Partilhar no Facebook",
             "twitter": "Partilhar no Twitter",
             "google": "Partilhar no Google+",
-            "help_html": "As suas alterações devem aparecer na \"Camada Padrão\" em poucos minutos. As outras camadas e determinados recursos podem demorar mais tempo.",
+            "help_html": "As suas alterações devem aparecer na \"Camada Padrão\" em poucos minutos. Outras camadas e determinados elementos podem demorar mais tempo.",
             "help_link_text": "Detalhes",
-            "help_link_url": "https://wiki.openstreetmap.org/wiki/Pt:Perguntas_frequentes#Eu_acabei_de_alterar_o_mapa._Como_eu_fa.C3.A7o_para_visualizar_minhas_altera.C3.A7.C3.B5es.3F"
+            "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"
         },
         "confirm": {
             "okay": "Ok",
         "splash": {
             "welcome": "Bem-vindo ao editor iD do OpenStreetMap",
             "text": "Com o editor iD é fácil contribuir para o melhor mapa livre do mundo. Esta é a versão {version}. Para mais informações ver o site {website} e para reportar problemas com o editor aceda a {github}.",
-            "walkthrough": "Iniciar o Guia passo-a-passo",
+            "walkthrough": "Iniciar Guia Inicial",
             "start": "Editar agora"
         },
         "source_switch": {
             "used_with": "usado com {type}"
         },
         "validations": {
-            "disconnected_highway": "Estrada desligada",
-            "disconnected_highway_tooltip": "As estradas devem estar ligadas a outras estradas ou entradas de edifícios.",
+            "disconnected_highway": "Estrada desconectada.",
+            "disconnected_highway_tooltip": "As estradas devem estar conectadas a outras estradas ou entradas de edifícios.",
             "old_multipolygon": "Etiquetas de multi-polígono na linha exterior",
             "old_multipolygon_tooltip": "Este tipo de multi-polígono está em desuso. Por favor mude as etiquetas da linha exterior para o multi-polígono.",
             "untagged_point": "Ponto sem etiquetas",
             "untagged_area_tooltip": "Escolha um elemento que indique o que esta área representa.",
             "untagged_relation": "Relação sem etiquetas",
             "untagged_relation_tooltip": "Selecione um tipo de elemento que descreva o que é esta relação.",
-            "many_deletions": "Está a eliminar {n} elementos. Tem a certeza que quer fazer isso? Isto irá eliminá-los do mapa que todas as pessoas visualizam em openstreetmap.org.",
             "tag_suggests_area": "A etiqueta {tag} é normalmente usada em áreas e não linhas.",
             "deprecated_tags": "Etiquetas obsoletas: {tags}"
         },
             "browse": "Encontrar ficheiro"
         },
         "mapillary_images": {
-            "tooltip": "Fotos ao nível da rua do Mapillary",
-            "title": "Camada de Fotos (Mapillary)"
+            "tooltip": "Fotos ao nível de rua do Mapillary",
+            "title": "Camada superior com imagens do Mapillary"
         },
         "mapillary_signs": {
-            "tooltip": "Sinais de trânsito do Mapillary (tem de estar ativada a \"Camada de Fotos\")",
-            "title": "Camada de Placas de Trânsito (Mapillary)"
+            "tooltip": "Sinais de trânsito do Mapillary (tem de estar ativada a \"Camada superior com imagens do Mapillary\")",
+            "title": "Camada de sinalização de trânsito (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Ver esta imagem no Mapillary"
         },
         "openstreetcam_images": {
             "tooltip": "Fotos ao nível da rua de OpenStreetCam",
-            "title": "Sobreposição de Fotos (OpenStreetCam)"
+            "title": "Camada superior com imagens (OpenStreetCam)"
         },
         "openstreetcam": {
             "view_on_openstreetcam": "Ver esta imagem no OpenStreetCam"
         "help": {
             "title": "Ajuda",
             "key": "H",
-            "help": "#Ajuda\n\nEstá a usar um editor do [OpenStreetMap](http://www.openstreetmap.org/), o mapa mundial livre e editável.\nPode usá-lo para adicionar e atualizar dados da sua área, tornando-o num mapa de código e dados abertos mundial melhor para todos.\n\nAs alterações que fizer neste mapa serão visíveis para qualquer pessoa que\ndecida usar o OpenStreetMap. Para fazer uma edição, basta\n[iniciar sessão](https://www.openstreetmap.org/login).\n\nO [editor iD](http://ideditor.com/) é um projeto colaborativo com o [código-fonte disponível no GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Editar e Gravar\n\nEste editor está concebido para funcionar ligado à Internet e está a utilizá-lo\nneste momento através de um site.\n\n### Selecionar Elementos\n\nPara selecionar um elemento do mapa, como uma estrada ou um ponto de interesse, clique\nnele no mapa. Isto irá destacar o elemento selecionado e abrir um painel com\ndetalhes sobre ele. Se clicar com o botão direito do rato nele, irá aparecer um menu\ncom ações que pode fazer no elemento.\n\nPara selecionar vários elementos, mantenha premida a tecla 'Shift'. Depois clique\nnos elementos que quer selecionar ou clique e arraste no mapa para selecionar com um laço\nà volta desses elementos. Todos os pontos dentro da área de laço serão selecionados..\n\n### Gravar Edições\n\nQuando faz alterações como editar estradas, edifícios e locais, estas alterações são\nguardadas no seu computador ou dispositivo até que as grave no servidor. Não se preocupe se cometer\num erro - pode desfazer as alterações clicando no botão Desfazer e refazer\nas alterações clicando no botão Refazer.\n\nClique em 'Gravar' para terminar um conjunto de alterações - por exemplo, se terminou\na área de um local e gostaria de fazer alterações noutro local. Posteriormente poderá\nrever as alterações que fez e o editor fornece sugestões úteis\ne avisos se algo não parecer certo nas alterações que fez.\n\nSe tudo parecer bem, pode introduzir um breve comentário a descrever as alterações\nque fez, e clicar em 'Gravar' de novo para publicar as alterações\nno [OpenStreetMap.org](http://www.openstreetmap.org/), onde estas ficarão visíveis\na todos os outros utilizadores e disponíveis a serem melhoradas por eles.\n\nSe não puder terminar as suas alterações de uma só vez, pode fechar a janela do editor\ne voltar mais tarde (no mesmo computador e no mesmo navegador de Internet),\nquando editar de novo ser-lhe-á perguntado se quer recuperar as alterações por gravar.\n\n### Usar o editor\n\nPode ver uma lista de atalhos pressionando a tecla `?`.\n",
-            "roads": "# Estradas\n\nPode criar, corrigir e eliminar estradas com este editor. As estradas podem ser\nde qualquer tipo: caminhos, autoestradas, carreiros agrícolas, ruas pedonais, ciclovias...\nQualquer via deve deve ser normalmente colocada no mapa.\n\n### Selecionar\n\nClique numa estrada para a selecionar.  Irá aparecer um contorno à volta da estrada, assim como\no painel lateral direito a mostrar mais informações sobre a estrada. Se clicar com o botão esquerdo\ndo rato nela, aparecerá um menu com várias ações que poderá fazer.\n\n### Alterar\n\nMuitas vezes verá estradas que não estão alinhadas com o fundo de imagens de satélite\nou com um trilho de GPS. Pode ajustar estas estradas para que fiquem alinhadas\ncom o fundo.\n\nPrimeiro clique na estrada que quer alterar. Isto irá destacá-la e mostrar\npontos ao longo dela, os quais poderá deslocar para outras posições.\nSe quiser adicionar mais pontos para mais precisão, clique 2 vezes numa parte da estrada\nque não tenha um ponto (entre 2 pontos) e será adicionado outro ponto.\n\nSe a estrada estiver ligada a outra, mas no mapa não estiver ligada,\npode arrastar um dos pontos para a outra estrada por forma a uni-los.\nÉ importante ter as estradas corretamente ligadas por forma a ter um mapa\nmais completo e fornecer direções de navegação corretas.\n\nTambém pode clicar com o botão direito do rato no ponto e selecionar 'Mover'\nou usar a tecla `M`, para mover toda a estrada de uma só vez e então\nclicar de novo para terminar o deslocamento.\n\n### Eliminar\n\nSe a estrada estiver errada - pode-se confirmar se não existe nas imagens de satélite\ne idealmente confirmar no terreno que não existe - pode eliminá-la, removendo-a do mapa.\nTenha cuidado ao eliminar elementos do mapa - como qualquer outra edição,\nas alterações estarão visíveis a outros utilizadores e as imagens de satélite\nestão muitas vezes desatualizadas, por isso a estrada pode ter sido construída recentemente.\n\nPode eliminar uma estrada clicando nela para a selecionar e depois pressionar a tecla 'Delete'\nou então clicar com o botão direito do rato e clicar no botão do caixote do lixo.\n\n### Criar\n\nEncontrou alguma estrada que não existe no mapa? Clique no botão 'Linha' que\nestá na parte superior esquerda ou pressione a tecla `2` para começar a desenhar\na linha.\n\nClique no ponto inicial da estrada para começar a desenhá-la. Se a estrada\nbifurcar de uma estrada existente, comece a clicar no local onde elas se ligam.\n\nEntão clique para adicionar outros pontos ao longo da estrada para que siga o caminho correto,\nconforme as imagens de satélite ou o GPS. Se a estrada que está a desenhar cruzar com outra,\nligue-as clicando no ponto onde se cruzam. Quando terminar clique 2 vezes\nou pressione a tecla 'Return' ou 'Enter' no teclado.\n",
-            "gps": "# GPS\n\nOs dados de GPS são a fonte mais fidedigna de dados no OpenStreetMap. Este editor suporta trilhos GPS locais - ficheiros `.gpx` que estejam no seu computador. Pode obter este tipo de trilhos GPS através de várias aplicações existentes para telemóveis assim como dispositivos GPS.\n\nPara mais informações sobre a obtenção de trilhos GPS, ver [Surveying with a GPS](http://learnosm.org/en/mobile-mapping/).\n\nPara usar um trilho GPX no editor para mapear, arraste o ficheiro GPX do seu computador para a janela do editor com o mapa. Se o ficheiro for reconhecido com sucesso, o trilho será adicionado ao mapa, aparecendo como uma linha de cor roxa. Clique no botão 'Dados do Mapa' à direita para ativar, desativar ou enquadrar nesta nova camada onde se situa o trilho GPX.\n\nO trilho GPX não é enviado diretamente para o OpenStreetMap - apenas pode servir de referência para si, por forma a desenhar com mais precisão elementos no mapa.\n\nTambém pode [enviar os seus trilhos GPS](http://www.openstreetmap.org/trace/create) para o OpenStreetMap para que possam ser úteis a outros utilizadores que editem o mapa.\n",
-            "imagery": "# Imagens aéreas\n\nAs imagens aéreas são um recurso importante na criação e alteração\ndos mapas. Existem várias fontes de informações totalmente\ngratuitas no lado direito\ndo editor em 'Configurar imagem de fundo'.\n\nPor padrão são usadas as imagens aéreas do [Bing](http://www.bing.com/maps/), que\npodem variar no nível de qualidade. Em geral as capitais e os centros\nurbanos têm imagens de melhor qualidade. À medida que visualiza outras zonas do mapa podem aparecer novas fontes de imagens aéreas.\n\nPor vezes as imagens aéreas podem estar desalinhadas. Se notar que existe\numa grande quantidade de estradas 'fora do lugar'  pode ser um sinal que as imagens aéreas estão desalinhadas. Para as alinhar clique no botão do lado direito 'Configuração da imagem de fundo', de seguida clique em 'Corrigir alinhamento' e depois nas setas que aparecem para alinhar.\n",
-            "addresses": "# Endereços\n\nOs endereços são uma das informações mais úteis no mapa.\n\nApesar dos endereços serem frequentemente representados em muitos mapas como parte de ruas, no OpenStreetMap eles são armazenados como elementos de edifícios e locais ao longo das ruas.\nOs endereços podem ser adicionados a edifícios representados por uma área, assim como a um único ponto. A obtenção ideal dos endereços é através de um reconhecimento no local — note que não é permitido copiar de fontes comerciais como o Google Maps por estar protegido por direitos de autor.\n",
-            "inspector": "# Utilizar o painel lateral\n\nO painel lateral do lado esquerdo do ecrã permite editar os detalhes de um determinado elemento.\n\n### Selecionar um elemento\n\nDepois de adicionar um nó, linha ou área ao mapa, é possível indicar o tipo de elemento, como por exemplo, uma autoestrada ou uma rua residencial, um supermercado ou um café, etc. O painel lateral mostra os tipos de elementos mais comuns, sendo possível procurar por outros através da ferramenta de pesquisa situada no início do painel. Pode-se clicar no ícone 'i' situado no lado direito de cada etiqueta para obter uma descrição dessa etiqueta.\n\n### Usar campos e editar etiquetas\n\nApós escolher uma característica ou quando se seleciona uma característica que já tem um tipo atribuído, o painel lateral irá apresentar um conjunto de campos úteis, como por exemplo o nome e a morada caso se trate de uma casa.\n\nAbaixo dos campos encontrará ícones nos quais pode clicar para adicionar outras características pertinentes, como uma ligação para uma página na Wikipédia, se existe acesso para cadeira de rodas, notas, entre outros.\n\nNo fim do painel lateral clique em 'Todas as etiquetas' para adicionar outros tipos de etiquetas, mesmo as incomuns. Pode recorrer ao sítio [Taginfo](http://taginfo.openstreetmap.org/) para saber que tipo de combinações de etiquetas são mais utilizadas.\n\nAs alterações feitas no painel lateral serão automaticamente aplicadas ao mapa.\nPode sempre reverter uma alteração clicando no botão 'Desfazer'.\n",
-            "buildings": "# Edifícios\n\nO OpenStreetMap é a maior base de dados mundial de edifícios que existe. Pode criar\ne melhorar esta base de dados.\n\n### Selecionar\n\nPode selecionar um edifício clicando no seu contorno. Isto irá destacar o edifício\ne abrir o painel lateral com mais informações sobre o edifício.\nSe clicar com o botão direito do rato no edifício, aparece um menu com ações que pode\nfazer no edifício.\n\n### Alterar\n\nPor vezes os edifícios estão colocados no local errado ou ter etiquetas incorretas.\n\nPara mover um edifício, selecione-o e carregue na tecla 'M' ou clique com o botão\ndireito do rato e escolha a opção 'Mover'. Mova o rato para deslocar o edifício\ne clique novamente com o botão esquerdo do rato para terminar o posicionamento.\n\nPara corrigir a forma geométrica de um edifício, clique e arraste os pontos\ndo edifício para os locais corretos.\n\n### Criar\n\nUma das principais questões sobre adicionar edifícios ao mapa é que o OpenStreetMap\narmazena os edifícios como formas geométricas e pontos. Regra geral deve-se adicionar\num edifício com uma forma geométrica sempre que possível e adicionar empresas, casas,\ninfra-estruturas e as outras coisas que operem fora de edifícios são mapeadas como pontos\nno edifício.\n\nComece a desenhar um edifício clicando no botão 'Área' na parte superior\ne terminar o edifício com a tecla 'Return' ou clicar no primeiro ponto que se desenhou\npara terminar a forma geométrica.\n\n### Eliminar\n\nSe um edifício estiver incorreto - pode-se confirmar se exiet na imagem de satélite e idealmente\nconfirmar no terreno que este não existe mesmo - pode eliminá-lo removendo-o do mapa.\nTenha cuidado ao eliminar elementos do mapa - como qualquer outra alteração, os resultados\nsão vistos por todos os outros utilizadores e as imagens de satélite estão muitas vezes\ndesatualizadas, por isso o edifício pode ter sido construído recentemente.\n\nPode eliminar um edifício clicando nele para o selecionar e de seguida usar a tecla 'Delete'\ndo teclado ou usar o botão direito do rato e clicar no ícone do caixote do lixo.\n",
-            "relations": "# Relações\n\nUma relação é um elemento especial no OpenStreetMap que agrupa num conjunto\noutros elementos. Por exemplo, 2 tipos comuns de relações são *relações de rotas*,\nque agrupa secções de estradas que pertencem a uma autoestrada ou via específicas\ne *multi-polígonos* que agrupam várias linhas que definem uma área complexa\n(uma área com várias áreas ou áreas no seu interior como um donut).\n\nO grupo de elementos numa relação chama-se *membros da relação*. No fundo do painel\nlateral esquerdo pode ver a que relações o elemento selecionado pertence\ne clicar aí numa relação irá selecionar a relação. Quando uma relação é selecionada\npode-se ver todos os membros desta no painel lateral assim como estes estarão destacados no mapa.\n\nNa maioria dos casos, o iD irá gerir as relações automaticamente ao editar o mapa.\nNo entanto deve ter em conta que, quando por algum motivo elimina um elemento\nde uma relação, como uma estrada, para substituir por outra deve adicionar\nessa estrada à relação.\n\n## Editar Relações\n\nSe quiser editar relações, aqui estão as informações básicas.\n\nPara adicionar um elemento a uma relação, selecione o elemento, clique no botão \"+\"\nna secção \"Todas as relações\" no fundo do painel lateral esquerdo e selecione ou digite o nome da relação.\n\nPara criar uma nova relação, selecione o primeiro elemento que deve fazer parte da relação,\nclique no botão \"+\" na secção \"Todas as relações\" e selecione \"Nova relação...\".\n\nPara remover um elemento de uma relação, selecione o elemento e clique\nno botão do caixote do lixo ao lado da relação da qual quer remover.\n\nPode criar multi-polígonos com buracos utilizando a ferramenta \"Combinar\". Desenhe as 2 áreas\n(de dentro e a de fora), mantenha premida a tecla Shift e clique em cada um deles para os selecionar\ne carregue na tecla 'C'. Também pode fazer doutra forma: selecionar ambos e clicar\ncom o botão direito do rato sobre um dos elementos e escolher a opção \"Combinar\" (+).\n"
+            "help": {
+                "title": "Ajuda",
+                "welcome": "Bem vindo ao editor ID para  o [OpenStreetMap](https://www.openstreetmap.org/). Com este editor pode atualizar o OpenStreetMap diretamente do seu navegador.",
+                "open_data_h": "Abrir dados",
+                "open_data": "As edições que fizer neste mapa estarão visíveis a todos os que utilizam o OpenStreetMap. As suas edições podem ser baseada no seu conhecimento, em levantamentos no terreno, em imagens aéreas ou em imagens ao nível de rua. Copiar material de fontes comerciais, como Google Maps [é totalmente proibido](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Antes de começar",
+                "before_start": "Deverá estar familiarizado com o OpenStreetMap e com este editor antes de começar a editar. O iD contém um guia inicial para ensinar o básico da edição no OpenStreetMap. Clique em \"Iniciar Guia Inicial\" neste ecrã para levá-lo ao tutorial - dura apenas 15 minutos.",
+                "open_source_h": "Código Aberto",
+                "open_source": "O editor ID é um projeto colaborativo em código aberto e está agora a utilizar a versão {version} . O código fonte está disponível no [GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Pode ajudar a [traduzir](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) o ID ou [reportar erros](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Visão Geral",
+                "navigation_h": "Navegação",
+                "navigation_drag": " Pode arrastar o mapa ao clicar e manter pressionado o botão do {leftclick} lado direito do rato e mover o rato. Pode também utilizar as teclas `↓`, `↑`, `←`, `→` do seu teclado.",
+                "navigation_zoom": "Pode aproximar ou afastar ao utilizar a roda do seu rato ou do touchpad e ou utilizando os botões {plus} / {minus}  que estão ao lado do mapa. Pode também utilizar as teclas `+`, `-` do seu teclado.",
+                "features_h": "Elementos do mapa",
+                "features": "Utilizamos a palavra *elementos* para descrever as coisas que aparecem no mapa, como estradas, edifícios ou pontos de interesse. Qualquer coisa do mundo real, pode ser mapeada como um elemento no OpenStreetMap. Os elementos do mapa são representados no mapa utilizando *pontos*, * linhas* ou *áreas*.",
+                "nodes_ways": "No OpenStreetMap, os pontos podem por vezes serem chamados de *nós* e as linhas e áreas são por vezes chamadas de *linhas*."
+            },
+            "editing": {
+                "title": "Editar e guardar",
+                "select_h": "Selecionar",
+                "select_left_click": "{leftclick} Clique com o lado esquerdo do rato para selecioná-la. Isto irá destacar o visualmente o elemento selecionado e a painel lateral surgirá com os detalhes sobre o elemento, como o nome ou morada.",
+                "select_right_click": "{rightclick} Clique com o lado direito do rato num elemento para que o menu de edição surja, este mostrará os comandos disponíveis, como a rotação, mover ou eliminar.",
+                "multiselect_h": "Múltipla seleção",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Clique com o botão esquerdo do rato para selecionar vários elementos. Isto facilitará a movimentação ou eliminar múltiplos elementos.",
+                "multiselect_lasso": "Outra maneira de selecionar múltiplos elementos é manter a tecla `{shift}` premida e manter o botão {leftclick} do rato premido e arrastar o rato para desenhar uma seleção lasso. Todos os pontos dentro desta área lasso será selecionada.",
+                "undo_redo_h": "Desfazer e refazer",
+                "undo_redo": "As suas edições são guardadas localmente no seu browser até que escolha guardar no servidor OpenStreetMap. Pode desfazer as edições ao clicar no botão {undo} **Desfazer** e refazer ao clicar no botão {redo} **Refazer**.",
+                "save_h": "Guardar",
+                "save": "Clique em {save} **Guardar** para terminar as suas edições e enviá-las para o OpenStreetMap. Deve guardar frequentemente as suas alterações!",
+                "save_validation": "No meu guardar, terá a oportunidade de rever as alterações que fez. iD irá também efetuar algumas verificações básicas para informação em falta e poderão surgir sugestões ou avisos caso algo não esteja correto.",
+                "upload_h": "Enviar",
+                "upload": "Antes de enviar as suas alterações, deve descrever um [comentário ao conjunto de alterações](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). E depois clicar em **Upload** para enviar as suas alterações para o OpenStreetMap, onde serão submetidas ao mapa e ficarão disponíveis e visíveis para todos.",
+                "backups_h": "Backup automático",
+                "backups": "Se não conseguir concluir as suas edições numa sessão, por exemplo se o seu computador se desligar ou fechar a aba do seu browser, as suas edições serão guardadas nos dados do seu browser. Pode regressar mais tarde (no mesmo mesmo computador e browser) e o iD irá advertir se pretende restaurar as edições que não submeteu.",
+                "keyboard_h": "Atalhos do teclado",
+                "keyboard": "Pode ver uma lista dos atalhos do teclado ao pressionar a tecla `?`."
+            },
+            "feature_editor": {
+                "title": "Editor de elementos",
+                "intro": "O *editor de elementos* surge ao longo do mapa e permite-lhe ver e editar toda a informação do objeto selecionado.",
+                "definitions": "A secção do topo, mostra o tipo de elementos. A secção intermédia contém os *campos* que mostram os atributos dos elementos, como o seu nome ou endereço. ",
+                "type_h": "Tipo de elemento",
+                "type": "Pode clicar num tipo de elemento e alterar o elemento para outro tipo diferente. Tudo o que existe no mundo real é passível de ser adicionado ao OpenStreetMap, daí existirem centenas de tipos de elementos para escolha.",
+                "type_picker": "O seletor do tipo, mostra os tipos de elementos mais comuns, como parques, hospitais, restaurantes, estradas ou edifícios. Pode procurar por qualquer outro tipo, ao escrever o que procura na caixa de pesquisa. Pode também clicar no ícone  {inspect} **Info** ao lado do tipo de elemento para aprender mais sobre o mesmo.",
+                "fields_h": "Campos",
+                "fields_all_fields": "A secção \"todos os campos\" contém todos os detalhes sobre o elemento que pretende editar. No OpenStreetMap, todos os campos são opcionais e é razoável deixar alguns dos campos em branco, quando não tem a certeza do que introduzir.",
+                "fields_example": "Cada tipo de elemento mostrará diferentes campos. Por exemplo, uma estrada pode conter campos como o tipo de pavimento ou o limite de velocidade, já os campos de um restaurante conterá o tipo de comida e o horário de funcionamento.",
+                "fields_add_field": "Pode também clicar em \"Adicionar campo\" para adicionar mais campos, como uma descrição, um link para a Wikipedia, acessibilidade a cadeira de rodas, entre outros.",
+                "tags_h": "Etiquetas",
+                "tags_all_tags": "Abaixo da secção dos campos, pode expandir a secção \"Todas as etiquetas\" para editar alguma das *etiquetas* do OpenStreetMap para o elemento selecionado. Cada etiqueta consiste numa *chave* e um *valor*, dados do elemento que definem todos os elementos guardados no OpenStreetMap.",
+                "tags_resources": "Editar as etiquetas dos elementos, requer algum conhecimento sobre o OpenStreetMap. Deve consultar documentação como a [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) ou [Taginfo](https://taginfo.openstreetmap.org/) para aprender sobre as práticas de etiquetação no OpenStreetMap."
+            },
+            "points": {
+                "title": "Pontos",
+                "intro": "*Pontos* podem ser utilizados para representar elementos como lojas, restaurantes e monumentos. Representam uma localização especifica e descrevem o que nela existe.",
+                "add_point_h": "Adicionar pontos",
+                "add_point": "Para adicionar um ponto, clique no botão {point} **Ponto** na barra de ferramentas acima do mapa ou utilize o atalho do teclado com a tecla `1`. Isto alterará o cursor do rato para um símbolo com uma cruz.",
+                "add_point_finish": "Para colocar um novo ponto no mapa, posicione o cursor do rato no local onde quer colocar o ponto e depois clique com o lado esquerdo do rato {leftclick} ou utilize a tecla de `espaço`.",
+                "move_point_h": "Movendo pontos",
+                "move_point": "Para mover um ponto, coloque o cursor do rato sobre um ponto e clique e mantenha o botão esquerdo {leftclick} do rato premido e arraste o ponto para a nova localização.",
+                "delete_point_h": "Eliminar pontos",
+                "delete_point": "É aceitável que elimine elementos que não existam no mundo real. Eliminar  elementos do OpenStreetMap elimina-os do mapa que todos utilizam, pelo que deverá ter a certeza que o elemento tenha deixado de existir antes de apagá-lo.",
+                "delete_point_command": "Para eliminar um ponto, clique no lado direito do rato {rightclick} no ponto para selecioná-lo e surgirá o menu de edição, utilize o comando {delete} **eliminar**."
+            },
+            "lines": {
+                "title": "Linhas",
+                "intro": "As *Linhas* são utilizadas para representar elementos como estradas, caminhos de ferro ou rios. as linhas devem ser desenhadas no eixo dos elementos que representam.",
+                "add_line_h": "Adicionar linhas",
+                "add_line": "Para adicionar uma linha, clique no botão {line} **Linha** na barra de ferramentas acima do mapa ou utilize o atalho do teclado através da tecla `2`. Isto alterará o cursor do rato para um símbolo com uma cruz.",
+                "add_line_draw": "De seguida, posicione o cursor do rato onde a linha deve começar e clique com o botão esquerdo do rato {leftclick} ou toque na tecla `Espaço` para começar a colocar os nós ao longo da linha. Continue a colocar mais nós ao clicar ou tocar na tecla `Espaço`. Enquanto desenha, pode aproximar ou arrastar o mapa para adicionar mais detalhe e rigor.",
+                "add_line_finish": "Para concluir uma linha, pressione em `{return}`  ou clique sobre o último nó.",
+                "modify_line_h": "Modificar linhas",
+                "modify_line_dragnode": "Frequentemente as linhas que vê não possuem a forma correta, por exemplo uma estrada não está alinhada com a imagem de fundo. Para ajustar a forma da linha, primeiro clique no botão esquerdo do rato {leftclick} para selecioná-la. Todos os nós da linha serão desenhados como pequenos círculos. Pode mover os nós para a localização correta.",
+                "modify_line_addnode": "Pode também criar nós ao longo da linha ao {leftclick}**x2** clicar duas vezes na linha ou ao arrastar os pequenos triângulos nos pontos intermédios ao longo dos nós.",
+                "connect_line_h": "Conectar linhas",
+                "connect_line": "Haver conectividade entre estradas é crucial para o mapa e para fornecer direções de navegação. ",
+                "connect_line_display": "A conexões entre as estradas são representadas por círculos cinza. Os nós das extremidades da linha são representados por círculos brancos, se estes não estiverem conectados a nada.",
+                "connect_line_drag": "Para conectar uma linha a outro elemento, arraste um dos nós da linha para o outro elemento até que ambos os elementos se interliguem. Dica: Pode utilizar a tecla `{alt}` para evitar que os nós sejam conectados a outros elementos.",
+                "connect_line_tag": "Se sabe que uma conexão possui semáforos ou passadeiras, pode adicioná-las ao selecionar o nó de conexão e utilizar o editor de elementos para selecionar o correto tipo de elemento.",
+                "disconnect_line_h": "Desconectar linhas",
+                "disconnect_line_command": "Para desconectar uma estrada de outro elemento, clique com o botão direito do rato  {rightclick}  no nó de conexão e selecione o comando {disconnect} **Desconectar** do menu de edição.",
+                "move_line_h": "Mover linhas",
+                "move_line_command": "Para mover uma linha na sua totalidade, clique com o lado direito do rato {rightclick} na linha e selecione o comando {move} **Mover** no menu de edição. Depois mova o rato e clique com o botão esquerdo do rato {leftclick} para colocar a linha na nova localização.",
+                "move_line_connected": "As linhas que estão conectadas a outros elementos, ficarão conectadas conforme mova as linhas para uma nova localização. O iD poderá prevenir que mova uma linha que intersecte outra linha conectada.",
+                "delete_line_h": "Eliminar linhas",
+                "delete_line": "Se uma linha está totalmente incorreta, por exemplo uma estrada que não existe no mundo real, é aceitável que a apague. Tenha cuidado ao eliminar elementos, a imagem de fundo que está a utilizar pode estar desatualizada e a estrada pode ser uma construção recente.",
+                "delete_line_command": "Para eliminar uma linha, clique no lado direito do rato {rightclick} na linha para selecioná-la e mostrar o menu de edição, utilize o comando {delete} **Eliminar**."
+            },
+            "areas": {
+                "title": "Áreas",
+                "intro": "As *Áreas* são utilizadas para representar fronteiras ou elementos como lagos, edifícios ou áreas residenciais. As áreas devem ser desenhadas ao longo do limite dos elementos que representam, por exemplo ao longo da base de um edifício.",
+                "point_or_area_h": "Pontos ou linhas?",
+                "point_or_area": "Vários elementos podem ser representados por pontos ou áreas. Deve representar os edifícios e limites de propriedade como áreas, sempre que possível. Coloque pontos dentro de edifícios para representar negócios, entidades ou outros elementos que estejam localizados dentro do edifício. ",
+                "add_area_h": "Adicionar áreas",
+                "add_area_command": "Para adicionar uma área, clique no botão de {area} **Área** na barra de ferramentas acima do mapa ou utilize o atalho do teclado através da tecla `3`. Isto alterará o cursor do rato para um símbolo com uma cruz.",
+                "add_area_draw": "De seguida, posicione o cursor do rato num dos cantos do elemento e clique com o botão esquerdo {leftclick} do rato or toque na tecla `Espaço` para iniciar a colocação dos nós ao longo do limite exterior da área. Continue a colocar mais nós, clicando ou tocando na tecla `Espaço`. Enquanto desenha, pode aproximar ou arrastar o mapa para obter mais detalhes. ",
+                "add_area_finish": "Para concluir uma área, pressione `{return}` ou clique novamente no primeiro ou último nó da área.",
+                "square_area_h": "Cantos esquadrados",
+                "square_area_command": "Muitos elementos em área, como edifícios, possuem cantos esquadrados. Para esquadrar a área, clique no botão direito do rato {right-click} no limite da área e selecione o comando {orthogonalize} **Esquadrar** no menu de edição. ",
+                "modify_area_h": "Modificar áreas",
+                "modify_area_dragnode": "Frequentemente verá áreas que não possuem a forma correta, por exemplo um edifício que não está alinhado com a imagem de fundo. Para ajustar a forma da área, primeiro selecione-a clicando com o lado esquerdo {leftclick} do rato. Todos os nós da área serão representados por pequenos círculos. Pode arrastar os nós para melhorar a localização.",
+                "modify_area_addnode": "Pode também criar nós ao longo da área ao cliclar duas vezes {leftclick}**x2** ja extremidade da área ou arrastar os pequenos triângulos nos pontos intermédios entre os nós.",
+                "delete_area_h": "Eliminar áreas",
+                "delete_area": "Se uma área está completamente incorreta, por exemplo se o edifício não existir no mundo real, deverá apagá-lo. Contudo tenha cuidado ao eliminar elementos, a imagem de fundo pode estar desatualizada e o edifício que pode achar que não existe, pode ser uma construção recente.",
+                "delete_area_command": "Para eliminar uma área,  {rightclick} use o lado direito do rato na área para selecioná-la e mostrar o menu de edição, utilize o comando {delete} **Eliminar**."
+            },
+            "relations": {
+                "title": "Relações",
+                "intro": "Uma *relação* é um tipo de elemento especial no OpenStreetMap que agrupa um conjunto de elementos. Os elementos que pertencem a uma relação, são chamados de *membros* e cada membro tem uma *função* na relação.",
+                "edit_relation_h": "Editar relações",
+                "edit_relation": "No fundo do editor do elemento, pode expandir a secção \"Todas as relações\" para ver se o elemento seleccionado é membro de alguma relação. Pode clicar na relação para selecioná-la e editá-la. ",
+                "edit_relation_add": "Para adicionar uma relação, selecione o elemento e clique no botão {plus} em \"Todas as relações\" na secção do editor de elemetos. Pode escolher de uma lista de relações na proximidade ou escolher a opção \"Nova relação...\".",
+                "edit_relation_delete": "Pode também clicar no botão  {delete} **Eliminar** para remover o elemento selecionado da relação. Se remover todos os elementos de uma relação, a relação será eliminada automaticamente. ",
+                "maintain_relation_h": "Manutenção de relações",
+                "maintain_relation": "Para a maior parte, o iD manterá as relações automaticamente conforme edite. Deve ter cuidado ao substituir elementos que possam ser membros de relações. Por exemplo, se eliminar um segmento de estrada e desenhar uma nova secção de estrada para o substituir, deverá etiquetar o novo segmento com as mesmas relações (de rota, restrições de viragem, etc...) conforme a original.",
+                "relation_types_h": "Tipos de relações",
+                "multipolygon_h": "Multipoligonos",
+                "multipolygon": "Uma relação multi-polígono, é um grupo de um ou mais elementos exteriores e um ou mais elementos interiores. Os elementos exteriores definem as extremidades externas de um multi-polígono e os elementos interiores as sub-áreas ou espaços ocos do interior de um multi-polígono. ",
+                "multipolygon_create": "Para criar um multi-polígono, por exemplo um edifício com um logradouro (espaço oco), desenhe as extremidades externas como uma área e as internas como uma linha ou como uma outra área. Depois clique no lado esquerdo {leftclick} para selecionar ambos os elementos, clique no lado direito {rightclick} para mostrar o menu de edição e selecione o comando {merge} **Unir**.",
+                "multipolygon_merge": "Juntar várias linhas ou áreas de interesse criará uma nova relação multi-poligono com todas as áreas seleccionadas como membros. O iD irá escolher os elementos interiores e exteriores automaticamente, com base nos elementos que estão contidos dentro de outros elementos. ",
+                "turn_restriction_h": "Restrições de viragem",
+                "turn_restriction": "Uma relação de *restrição de viragem* é um grupo de vários segmentos de estradas numa intersecção. As restrições de viragem consistem em *de*, nó da *via* e *para* das estradas que a compõem.",
+                "turn_restriction_field": "Para editar as restrições de viragem, selecione o nó de junção onde as duas ou mais estradas confluem. O editor de elementos irá mostrar um campo especial chamado \"Restrições de viragem\" que contem o modelo da interseção.",
+                "turn_restriction_editing": "No campo \"Restrições de viragem\" clique para selecionar a estrada \"desde\" e verá quais as viragens que são permitidas ou restritas para qualquer uma das estradas \"para\". Pode clicar no ícone de viragem para alterar as restrições ou as permissões de viragem. O iD irá criar as relações automaticamente e definirá as funções \"desde\", \"via\" e \"para\" baseando-se nas suas escolhas.",
+                "route_h": "Rotas",
+                "route": "Uma relação de *rota* é um grupo de uma ou mais elementos linha que juntos formam uma rede de rota, como uma carreira de autocarro, percursos de um comboio ou uma autoestrada.",
+                "route_add": "Para adicionar um elemento a uma relação de rota, selecione o elemento e vá até ao fundo em \"todas as relações\" na secção do editor de elementos, depois clique no botão {plus} para adicionar este elemento a uma relação próxima ou criar uma nova relação.",
+                "boundary_h": "Fronteiras",
+                "boundary": "Uma relação de *fronteira* consiste num grupo de um ou mais elementos de linha que juntos formam um limite administrativo.",
+                "boundary_add": "Para adicionar um elemento a uma relação de fronteira, selecione o elemento e desça até à secção \"Todas as relações\" do editor de elementos e clique no botão adicionar {plus} para adicionar os elementos próximos que existam na relação ou numa nova relação."
+            },
+            "imagery": {
+                "title": "Imagem de fundo",
+                "intro": "A imagem de fundo que aparece no fundo dos dados do mapa é uma importante fonte para mapear. Esta imagem pode ser fotografias aéreas recolhidas em satélite, em aviões, de drones ou podem ser mapas históricos que foram digitalizados ou outras fontes de informação que estão disponíveis gratuitamente. ",
+                "sources_h": "Fonte de imagens",
+                "choosing": "Para ver quais as fontes de imagens que estão disponíveis para editar, clique no botão  {camadas} **Definições de fundo** ao lado do mapa.",
+                "sources": "Por pré-definição, a camada satélite do [Bing Maps](https://www.bing.com/maps/) é escolhida como imagem de fundo. Dependendo de onde está a editar, poderá haver disponibilidade de outras fontes de imagens. Algumas poderão ser mais recentes ou possuírem maior resolução, pelo que é sempre pertinente verificar qual a melhor camada para utilizar como referência para o mapeamento.",
+                "offsets_h": "Ajustar a deslocamento da imagem",
+                "offset": "A imagem por vezes apresenta um deslocamento relativamente aos dados do mapa. Se verificar que existem muitas estradas ou edifícios que estão deslocados em relação à imagem de fundo, pode ser possível que a imagem esteja incorreta. Não as movas para ficarem alinhadas com o fundo. Para solucionar isto, deve ajustar o fundo para que fique alinhado com os dados existente ao expandir a secção \"Ajustar deslocamento da imagem\" no fundo do painel Definições de Fundo.",
+                "offset_change": "Clique nos pequenos triângulos para ajustar o deslocamento da imagem em pequenos passos, ou mantenha o botão esquerdo do rato pressionado e arraste dentro do quadrado cinza para mover a imagem para o alinhamento."
+            },
+            "streetlevel": {
+                "title": "Imagens ao nível de rua",
+                "intro": "As imagens ao nível de rua são bastante úteis para mapear sinais de trânsito, negócios e outros detalhes que não são visíveis em imagens aéreas ou de satélite. O editor iD suporta imagens ao nível de rua do [Mapillary](https://www.mapillary.com) e do [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Utilizar imagens ao nível de rua",
+                "using": "Para utilizar imagens ao nível de rua para mapear, clique no painel {data} **Dados do mapa** ao lado do mapa para ativar ou desativar a camada de imagens de rua que estão disponíveis.",
+                "photos": "Quando ativada, a camada de imagens de rua mostrará uma linha com uma sequência de imagens. Em níveis de aproximação mais elevados, surgirá um marcador com a forma dum circulo que mostrará a localização de cada fotografia, quanto maior a aproximação, surgirá um cone que mostra a direção que a câmara estava apontada quando a imagem foi capturada. ",
+                "viewer": "Quando clica em uma das localizações da imagem, surgirá uma janela com a imagem no canto inferior do mapa. A janela contém os controlos para avançar ou retroceder na sequência das imagens. Também mostra o nome de utilizador da pessoa que capturou a imagem, a data de captura e o link onde pode ver a imagem no site que a forneceu."
+            },
+            "gps": {
+                "title": "Rastos de GPS",
+                "intro": "Os rastos de GPS são informação importante para o OpenStreetMap. Este editor suporta ficheiros *.gpx*, *.geojson* e *.kml* que estejam no seu computador. Pode criar rastos GPS utilizando o seu telemóvel, relógios desportivos ou outros aparelhos GPS.",
+                "survey": "Para mais informações de como deve efetuar um levantamento no terreno, leia [Como mapear com um telemóvel, GPS ou papéis](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "Utilizando rastos de GPS",
+                "using": "Para utilizar um rasto GPS para mapear, arraste-o e coloque o ficheiro no editor do mapa do seu browser. Se for reconhecido, será desenhado no mapa como uma linha com uma cor de roxo claro. Clique em {data} **Dados do mapa** no painel lateral ao mapa para ativar, desativar ou aproximar para a sua informação GPS.",
+                "tracing": "O rasto GPS não é enviado para o OpenStreetMap, a melhor maneira para utilizá-lo é desenhar no mapa e utilizando-o como guia para os novos elementos que adicionar.",
+                "upload": "Pode também [enviar os seus dados GPS para o OpenStreetMap](https://www.openstreetmap.org/trace/create) para que outros possam utilizá-los para mapear."
+            }
         },
         "intro": {
             "done": "feito",
                 "postcode": "4909-508",
                 "province": "<valor para addr:province>",
                 "quarter": "<valor para addr:quarter>",
-                "state": "<valor para addr:state>",
+                "state": "<valor para addr:state>PT",
                 "subdistrict": "<valor para addr:subdistrict>",
                 "suburb": "<valor para addr:suburb>",
                 "countrycode": "pt",
                     "10th-avenue": "Avenida 10",
                     "11th-avenue": "Avenida 11",
                     "12th-avenue": "Avenida 12",
-                    "access-point-employment": "Agência de Emprego Televi",
+                    "access-point-employment": "Agência de Emprego",
                     "adams-street": "Rua Adão",
                     "andrews-elementary-school": "Escola Primária de Lucerne",
                     "andrews-street": "Rua André",
             },
             "welcome": {
                 "title": "Bem-vindo ",
-                "welcome": "Bem-vindo! Este guia passo-a-passo irá ensiná-lo o básico de como editar no OpenStreetMap ",
-                "practice": "Toda a informação neste guia é a apenas para praticar e as alterações que fizer durante este guia não serão gravadas.",
-                "words": "Este guia passo-a-passo mostra algumas palavras e conceitos novos. Quando for mostrada uma palavra nova, irá aparecer em *itálico*.",
-                "mouse": "Pode utilizar qualquer dispositivo de entrada de dados para editar o mapa, mas este guia passo-a-passo pressupõe que tem um rato com os botões esquerdo e direito. **Se quiser ligar um rato, faça-o agora e clique depois em OK.**",
+                "welcome": "Bem-vindo! Este guia inicial irá ensiná-lo o básico de como editar no OpenStreetMap ",
+                "practice": "Toda a informação neste guia inicial é apenas para praticar e as alterações que fizer durante este guia inicial não serão gravadas.",
+                "words": "Este guia inicial mostra algumas palavras e conceitos novos. Quando for mostrada uma palavra nova, irá aparecer em *itálico*.",
+                "mouse": "Pode utilizar qualquer dispositivo de entrada de dados para editar o mapa, mas este guia inicial pressupõe que tem um rato com os botões esquerdo e direito. **Se quiser ligar um rato, faça-o agora e clique depois em OK.**",
                 "leftclick": "Quando este guia pedir para clicar ou clicar 2 vezes, quer dizer com o botão esquerdo do rato. Num ecrã tátil pode ser um clique simples ou um toque com o dedo. **Clique com o botão esquerdo {num} vezes.**",
                 "rightclick": "Por vezes também vamos pedir para clicar com o botão direito do rato. Isto pode ser o mesmo que Control-clique ou toque com 2 dedos num ecrã tátil. O seu teclado também pode ter uma tecla 'menu' que funcione como o botão direito do rato. **Clique com o botão direito {num} vezes.**",
                 "chapters": "Até agora tudo bem! Pode usar os botões abaixo para saltar capítulos em qualquer altura ou para voltar a ver um capítulo anterior. Vamos começar! **Clique em '{next}' para continuar.**"
             "navigation": {
                 "title": "Navegação",
                 "drag": "A área principal do mapa mostra dados do OpenStreetMap por cima de um fundo.{br}Pode arrastar o mapa pressionado e mantendo premido o botão esquerdo do rato. Também pode usar as teclas de setas do teclado. **Arraste o mapa agora!**",
-                "zoom": "Pode aproximar ou afastar com a roda do rato, painel tátil ou clicando no botões {plus} / {minus}. **Experimente agora!**",
+                "zoom": "Pode aproximar ou afastar com a roda do rato, painel tátil ou clicando no botões {plus} / {minus}. **Aproxime agora!**",
                 "features": "Usamos a palavra *elementos* para descrever as coisas que aparecem no mapa. Qualquer coisa no mundo real pode ser mapeada como um elemento no OpenStreetMap.",
                 "points_lines_areas": "Os elementos do mapa são representados com *pontos, linhas ou áreas.*",
                 "nodes_ways": "No OpenStreetMap, os pontos são por vezes chamados *nós* e as linhas e áreas são chamadas por vezes *vias*.",
                 "preset_townhall": "A parte de cima do editor de elementos mostra o tipo de elemento. Este ponto é do tipo \"{preset}\".",
                 "fields_townhall": "A parte central do editor de elementos contém  *campos* que mostram os atributos do elemento, como o nome e endereço.",
                 "close_townhall": "**Feche o editor de elementos com a tecla Esc ou pressionando o botão {button} no canto superior.**",
-                "search_street": "Também pode pesquisar por elementos na vista atual, ou no mapa mundial. **Pesquise agora por '{name}'.**",
-                "choose_street": "**Escolha \"{name}\" da lista para selecioná-la.**",
-                "selected_street": "Fantástico! A \"{name}\" está agora selecionada.",
+                "search_street": "Também pode pesquisar por elementos na vista atual, ou no mapa mundial. **Pesquise por '{name}'.**",
+                "choose_street": "**Escolha {name} da lista para selecioná-la.**",
+                "selected_street": "Fantástico! A {name} está agora selecionada.",
                 "editor_street": "Os campos mostrados para uma rua são diferentes dos campos mostrados para uma câmara municipal/junta de freguesia.{br}Para esta rua selecionada, o editor de elementos mostra campos como '{field1}' e '{field2}'. **Feche o editor de elementos com a tecla Esc ou clique no botão {button}.**",
                 "play": "Tente mover o mapa e clicar em outros elementos para ver que tipos de coisas podem ser adicionadas ao OpenStreetMap. **Quanto estiver pronto para ver o próximo capítulo clique em '{next}'.**"
             },
             },
             "areas": {
                 "title": "Áreas",
-                "add_playground": "As *áreas* são usadas para mostrar os limites de elementos como lagos, edifícios,  áreas residenciais, etc.{br}Também se usam áreas para mapear com mais detalhe certos elementos que possa mapear normalmente com pontos. **Clique no botão de Área {button} para adicionar uma nova área.**",
-                "start_playground": "Vamos adicionar este parque infantil ao mapa desenhando a área dele. As áreas são desenhadas colocando *pontos* ao longo das bordas do elemento. **Clique ou use a tecla Espaço para colocar um ponto inicial num dos cantos do parque infantil.**",
-                "continue_playground": "Continue a desenhar a área colocando mais pontos ao longo das bordas do parque infantil. Pode-se ligar a área a vias pedonais existentes.{br}Dica: pode manter premida a tecla '{alt}' para impedir que os pontos sejam ligados automaticamente a outros elementos. **Continue a desenhar a área do parque infantil.**",
-                "finish_playground": "Termine a área carregando na tecla Enter. **Termine agora a área do parque infantil.**",
+                "add_playground": "*Áreas* são utilizadas para representar  fronteiras de elementos como lagos, edifícios ou áreas residenciais.{br}Podem ser utilizadas para o mapeamento detalhado de muitos elementos que normalmente seriam representados por pontos. **Clique em {button} Área para adicionar uma nova área.**",
+                "start_playground": "Vamos adicionar este parque infantil ao mapa desenhando a área. As áreas são desenhadas colocando *nós* ao longo das bordas do elemento. **Clique ou use a tecla Espaço para colocar um nó inicial num dos cantos do parque infantil.**",
+                "continue_playground": "Continue a desenhar a área colocando mais nós ao longo das bordas do parque infantil. Pode-se ligar a área a vias pedonais existentes.{br}Dica: pode manter premida a tecla '{alt}' para impedir que os nós sejam conectados automaticamente a outros elementos. **Continue a desenhar a área do parque infantil.**",
+                "finish_playground": "Termine a área carregando na tecla Enter ou clique novamente no primeiro nó. **Termine agora a área do parque infantil.**",
                 "search_playground": "**Pesquise por '{preset}'.**",
                 "choose_playground": "**Escolha \"{preset}\" na lista.**",
                 "add_field": "Este parque infantil não tem um nome oficial, por isso não iremos adicionar nada no campo Nome.{br}Em vez disso vamos adicionar mais algumas informações sobre o parque infantil no campo Descrição. **Clique na lista em Adicionar Campo.**",
             "lines": {
                 "title": "Linhas",
                 "add_line": "As *linhas* são usadas para representar elementos como estradas, ferrovias, rios, etc. **Clique no botão {button} para adicionar uma nova linha.**",
-                "start_line": "Aqui está uma rua que não está mapeada. Vamos adicioná-la!{br}No OpenStreetMap as linhas devem ser desenhadas pelo centro da estrada. Pode arrastar e aproximar a vista (zoom) do mapa se  for necessário. **Comece uma nova linha clicando na parte superior da rua que falta mapear.**",
-                "intersect": "Clique ou pressione a tecla Espaço para adicionar mais pontos à linha.{br}As estradas e outros tipos de linhas fazem normalmente parte de redes maiores. É importante que estas linhas estejam ligadas corretamente a outras para que programas de roteamento funcionem bem. **Clique em \"{name}\" para criar um cruzamento que ligue as 2 ruas.**",
-                "retry_intersect": "A estrada tem de cruzar com a \"{name}\". Tente de novo!",
-                "continue_line": "Continue a desenhar a linha para a nova rua. Lembre-se que pode arrastar e aproximar o mapa se for necessário.{br}Quando terminar de desenhar, clique no último ponto de novo. **Termine de desenhar a rua.**",
-                "choose_category_road": "**Selecione \"{category}\" na lista.**",
-                "choose_preset_residential": "Existem muitos tipos diferentes de estradas, mas esta é uma rua residencial. **Escolha o tipo \"{preset}\".**",
-                "retry_preset_residential": "Não selecionou o tipo \"{preset}\". **Clique aqui para selecionar novamente.**",
+                "start_line": "Aqui está uma rua que não está mapeada. Vamos adicioná-la!{br}No OpenStreetMap as linhas devem ser desenhadas pelo centro da estrada. Pode arrastar e aproximar a vista do mapa se  for necessário. **Comece uma nova linha clicando na parte superior da rua que falta mapear.**",
+                "intersect": "Clique ou pressione a tecla Espaço para adicionar mais nós à linha.{br}As estradas e outros tipos de linhas fazem normalmente parte de redes maiores. É importante que estas linhas estejam conectadas corretamente a outras para que programas de roteamento funcionem bem. **Clique em {name} para criar um cruzamento que ligue as 2 ruas.**",
+                "retry_intersect": "A estrada tem de cruzar com a {name}. Tente de novo!",
+                "continue_line": "Continue a desenhar a linha para a nova rua. Lembre-se que pode arrastar e aproximar o mapa se for necessário.{br}Quando terminar de desenhar, clique no último  de novo. **Termine de desenhar a rua.**",
+                "choose_category_road": "**Selecione {category} na lista.**",
+                "choose_preset_residential": "Existem muitos tipos diferentes de estradas, mas esta é uma rua residencial. **Escolha o tipo {preset}.**",
+                "retry_preset_residential": "Não selecionou o tipo {preset}. **Clique aqui para selecionar novamente.**",
                 "name_road": "**Atribua um nome à rua e carregue depois na tecla Esc, Enter ou clique no botão {button} para fechar o editor de elementos.**",
                 "did_name_road": "Parece que está bom! A seguir iremos aprender como corrigir a forma geométrica de uma linha.",
                 "update_line": "Por vezes é necessário alterar a forma geométrica de uma linha existente. Aqui está uma rua que não parece bem desenhada.",
-                "add_node": "Podemos adicionar alguns pontos a esta linha para melhorar a sua forma geométrica. Uma forma de adicionar um ponto é com um clique duplo na linha onde se quer adicionar o ponto. **Faça agora um clique duplo na linha para criar um ponto.**",
-                "start_drag_endpoint": "Quando está selecionada uma linha, pode pode deslocar os pontos desta clicando e mantendo premido o botão do rato enquanto arrasta um dos pontos. **Arraste o ponto do cruzamento para o local correto onde estas estradas se devem cruzar.**",
+                "add_node": "Podemos adicionar alguns nós a esta linha para melhorar a sua forma geométrica. Uma forma de adicionar um nó é com um clique duplo na linha onde se quer adicionar o ní. **Faça agora um clique duplo na linha para criar um nó.**",
+                "start_drag_endpoint": "Quando está selecionada uma linha, pode pode deslocar os s desta clicando e mantendo premido o botão do rato enquanto arrasta um dos pontos. **Arraste o ponto do cruzamento para o local correto onde estas estradas se devem cruzar.**",
                 "finish_drag_endpoint": "Este sítio parece bom. **Liberte o botão esquerdo do rato para terminar o arrastar.**",
-                "start_drag_midpoint": "Aparecem pequenos triângulos/setas no centro de cada segmento entre 2 pontos. Outra forma de criar um novo ponto é arrastar um desses triângulos centrais para uma nova localização. **Arraste um triângulo central para criar um novo ponto ao longo da curva da estrada.**",
+                "start_drag_midpoint": "Aparecem pequenos triângulos/setas no centro de cada segmento entre nós. Outra forma de criar um novo nó é arrastar um desses triângulos centrais para uma nova localização. **Arraste um triângulo central para criar um novo nó ao longo da curva da estrada.**",
                 "continue_drag_midpoint": "Esta linha está muito melhor! Continue a corrigir a linha com clique duplo ou arrastando os triângulos centrais até que a curva esteja de acordo com a estrada. **Quando achar que a estrada está bem desenhada clique em OK.**",
                 "delete_lines": "Não há problema eliminar linhas de estradas que não existam ou tenham deixado de existir na realidade.{br}Aqui está um exemplo de uma estrada projetada com o nome \"{street}\" mas que nunca chegou a ser construída. Podemos melhorar este mapa eliminando as linhas a mais.",
-                "rightclick_intersection": "A última estrada existente é a \"{street1}\", por isso teremos de *dividir* a rua \"{street2}\" neste cruzamento e eliminar o que está acima do cruzamento. **Clique com o botão direito do rato no ponto do cruzamento.**",
-                "split_intersection": "**Clique no botão {button} para dividir a \"{street}\".**",
+                "rightclick_intersection": "A última estrada existente é a \"{street1}\", por isso teremos de *dividir* a rua \"{street2}\" neste cruzamento e eliminar o que está acima do cruzamento. **Clique com o botão direito do rato no  do cruzamento.**",
+                "split_intersection": "**Clique no botão {button} para dividir a {street}.**",
                 "retry_split": "Não clicou no botão de dividir. Tente de novo.",
-                "did_split_multi": "Bom trabalho! A \"{street1}\" está agora dividida em 2 linhas. A linha de cima pode ser agora eliminada. **Clique na linha de cima da \"{street2}\" para a selecionar.**",
-                "did_split_single": "**Clique na linha de cima da \"{street2}\" para a selecionar.**",
+                "did_split_multi": "Bom trabalho! A \"{street1}\" está agora dividida em 2 linhas. A linha de cima pode ser agora eliminada. **Clique na linha de cima da {street2} para a selecionar.**",
+                "did_split_single": "**Clique na linha de cima da {street2} para a selecionar.**",
                 "multi_select": "A \"{selected}\" está agora selecionada. Vamos selecionar também a \"{other1}\". Pode usar a tecla Shift (mantendo premida) e clicar para selecionar vários elementos. **Use a tecla Shift e clique em \"{other2}\".**",
                 "multi_rightclick": "Boa! Estão selecionadas ambas as linhas a eliminar. **Clique com o botão direito do rato numa das linhas para mostrar o menu de edição.**",
                 "multi_delete": "**Clique no botão {button} para eliminar estas linhas a mais.**",
             "buildings": {
                 "title": "Edifícios",
                 "add_building": "O OpenStreetMap é a maior base de dados de edifícios do mundo.{br}Pode ajudar a melhorar este mapa desenhando novos edifícios que ainda não estejam mapeados. **Clique no botão da área {button} para adicionar uma nova área.**",
-                "start_building": "Vamos adicionar esta casa ao mapa desenhando o seu contorno.{br}Os edifícios devem ser desenhados em redor da área destes da forma mais rigorosa possível. **Clique ou pressione a tecla Espaço para adicionar um ponto inicial num dos cantos do edifício.**",
-                "continue_building": "Continue a adicionar mais pontos para desenhar o contorno do edifício. Lembre-se que pode aproximar se quiser ver melhor a área.{br}Termine o edifício com a tecla Espaço ou clicando de novo no primeiro ou no último ponto desenhado. **Termine agora o desenho do edifício.**",
-                "retry_building": "Parece que teve alguns problemas em colocar os pontos nos cantos do edifício. Tende de novo!",
-                "choose_category_building": "**Escolha \"{category}\" na lista.**",
-                "choose_preset_house": "Existem muitos tipos diferentes de edifícios, mas este é uma casa.{br}Se não tiver a certeza do tipo de edifício escolha o tipo genérico \"Edifício\". **Escolha agora o tipo \"{preset}\".**",
+                "start_building": "Vamos adicionar esta casa ao mapa desenhando o seu contorno.{br}Os edifícios devem ser desenhados em redor da área destes da forma mais rigorosa possível. **Clique ou pressione a tecla Espaço para adicionar um  inicial num dos cantos do edifício.**",
+                "continue_building": "Continue a adicionar mais nós para desenhar o contorno do edifício. Lembre-se que pode aproximar se quiser ver melhor a área.{br}Termine o edifício com a tecla Espaço ou clicando de novo no primeiro ou no último nó desenhado. **Termine agora o desenho do edifício.**",
+                "retry_building": "Parece que teve alguns problemas em colocar os s nos cantos do edifício. Tende de novo!",
+                "choose_category_building": "**Escolha {category} na lista.**",
+                "choose_preset_house": "Existem muitos tipos diferentes de edifícios, mas este é uma casa.{br}Se não tiver a certeza do tipo de edifício escolha o tipo genérico Edifício. **Escolha agora o tipo {preset}.**",
                 "close": "**Carregue na tecla Esc ou clique no botão {button} para fechar o editor de elementos.**",
                 "rightclick_building": "**Clique com o botão direito do rato no edifício para selecionar o edifício que criou e mostrar o menu de edição.**",
                 "square_building": "A casa que acabou de desenhar irá ficar melhor com cantos retangulares perfeitos. **Clique no botão {button} para pôr em esquadria os cantos do edifício.**",
                 "retry_square": "Não clicou no botão de Esquadrar. Tente de novo.",
                 "done_square": "Reparou que os cantos do edifício se moveram para ficar em esquadria? Vamos aprender outro truque a seguir.",
                 "add_tank": "Vamos desenhar este depósito de água circular. **Clique no botão de área {button} para adicionar uma nova área.**",
-                "start_tank": "Não se preocupe. Não é preciso desenhar um círculo perfeito. Apenas desenhe o contorno do edifício circular com alguns pontos. **Clique ou pressione a tecla Espaço para colocar um ponto inicial numa das bordas do depósito.**",
-                "continue_tank": "Adicione mais alguns pontos à volta do contorno.{br}Termine a área pressionando a tecla Enter ou clicando de novo no último ou primeiro ponto. **Termine de desenhar o depósito.**",
+                "start_tank": "Não se preocupe. Não é preciso desenhar um círculo perfeito. Apenas desenhe o contorno do edifício circular com alguns nós. **Clique ou pressione a tecla Espaço para colocar um nó inicial numa das bordas do depósito.**",
+                "continue_tank": "Adicione mais alguns nós à volta do contorno. O circulo será criado no exterior os nós que desenhou.{br}Termine a área pressionando a tecla Enter ou clicando de novo no último ou primeiro nó **Termine de desenhar o depósito.**",
                 "search_tank": "**Pesquise por '{preset}'.**",
-                "choose_tank": "**Escolha \"{preset}\" na lista.**",
+                "choose_tank": "**Escolha {preset} na lista.**",
                 "rightclick_tank": "**Clique com o botão direito do rato no depósito de armazenamento que criou para aceder ao menu de edição.**",
                 "circle_tank": "**Clique no botão {button} para tornar a área do edifício num círculo perfeito.**",
                 "retry_circle": "Não clicou no botão Circularizar. Tente de novo.",
             },
             "startediting": {
                 "title": "Começar a editar",
-                "help": "Está agora preparado para editar no OpenStreetMap!{br}Pode retornar a este guia passo-a-passo a qualquer altura ou ver mais informações clicando no botão de Ajuda {button} ou pressionando a tecla '{key}'.",
+                "help": "Está agora preparado para editar no OpenStreetMap!{br}Pode retornar a este guia inicial a qualquer altura ou ver mais informações clicando no botão de Ajuda {button} ou pressionando a tecla '{key}'.",
                 "shortcuts": "Pode ver uma lista de comandos e respetivos atalhos de teclado pressionando a tecla '{key}'.",
                 "save": "Não se esqueça de gravar as suas alterações regularmente clicando neste botão!",
                 "start": "Começar a editar o mapa!"
                     "pan": "Arrastar mapa",
                     "pan_more": "Arrastar mapa por um ecrã",
                     "zoom": "Aproximar / Afastar",
-                    "zoom_more": "Aproximar / Afastar grande"
+                    "zoom_more": "Aproximar / Afastar bastante"
                 },
                 "help": {
                     "title": "Ajuda",
                     "title": "Selecionar elementos",
                     "select_one": "Selecionar apenas um elemento",
                     "select_multi": "Selecionar vários elementos",
-                    "lasso": "Desenhar um laço de seleção à volta de elementos"
+                    "lasso": "Desenhar um laço de seleção à volta de elementos",
+                    "search": "Procurar elementos que correspondam ao texto a pesquisar"
                 },
                 "with_selected": {
                     "title": "Com elemento selecionado",
                     "edit_menu": "Mostrar/esconder menu de edição"
                 },
                 "vertex_selected": {
-                    "title": "Com ponto selecionado",
-                    "previous": "Ir para o ponto anterior",
-                    "next": "Ir para o ponto seguinte",
-                    "first": "Ir para o primeiro ponto",
-                    "last": "Ir para o último ponto",
+                    "title": "Com  selecionado",
+                    "previous": "Ir para o  anterior",
+                    "next": "Ir para o  seguinte",
+                    "first": "Ir para o primeiro nó ",
+                    "last": "Ir para o último nó ",
                     "change_parent": "Mudar linha ligada"
                 }
             },
                 },
                 "operations": {
                     "title": "Operações",
-                    "continue_line": "Continuar uma linha no ponto selecionado",
+                    "continue_line": "Continuar uma linha no  selecionado",
                     "merge": "Combinar (fundir) elementos selecionados",
-                    "disconnect": "Desligar elementos no ponto selecionado",
-                    "split": "Separar uma linha em duas no ponto selecionado",
+                    "disconnect": "Desligar elementos no  selecionado",
+                    "split": "Separar uma linha em duas no  selecionado",
                     "reverse": "Inverter uma linha",
                     "move": "Mover elementos selecionados",
                     "rotate": "Rodar elementos selecionados",
                 }
             }
         },
+        "units": {
+            "feet": "{quantidade} ft",
+            "miles": "{quantidade} mi",
+            "square_feet": "{quantidade} sq ft",
+            "square_miles": "{quantidade} sq mi",
+            "acres": "{quantidade} ac",
+            "meters": "{quantidade} m",
+            "kilometers": "{quantidade} km",
+            "square_meters": "{quantidade} m²",
+            "square_kilometers": "{quantidade} km²",
+            "hectares": "{quantidade} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantidade}°",
+            "arcminutes": "{quantidade}′",
+            "arcseconds": "{quantidade}″",
+            "north": "N",
+            "south": "S",
+            "east": "E",
+            "west": "W",
+            "coordinate": "{coordenada}{direção}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
-                    "name": "Tipos de barreira"
+                    "name": "Elementos de barreiras"
                 },
                 "category-building": {
-                    "name": "Tipos de edifícios"
+                    "name": "Elementos de edifícios"
                 },
                 "category-golf": {
-                    "name": "Recursos de Golfe"
+                    "name": "Elementos de Golfe"
                 },
                 "category-landuse": {
-                    "name": "Tipos de uso do solo"
+                    "name": "Elementos de uso do solo"
                 },
                 "category-natural-area": {
                     "name": "Elementos Naturais"
                     "name": "Elementos Naturais"
                 },
                 "category-path": {
-                    "name": "Tipos de caminho"
+                    "name": "Elementos de caminhos"
                 },
                 "category-rail": {
-                    "name": "Tipos de ferrovia"
+                    "name": "Elementos de ferroviários"
                 },
                 "category-restriction": {
-                    "name": "Tipos de restrição"
+                    "name": "Elementos de restrição"
                 },
                 "category-road": {
-                    "name": "Tipos de rodovia"
+                    "name": "Elementos de rodoviários"
                 },
                 "category-route": {
-                    "name": "Tipos de rota"
+                    "name": "Elementos de rota"
                 },
                 "category-water-area": {
                     "name": "Elementos de água"
                 },
                 "category-water-line": {
-                    "name": "Tipos de cursos de água"
+                    "name": "Elementos de cursos de água"
                 }
             },
             "fields": {
                     "label": "Acesso autorizado",
                     "options": {
                         "designated": {
-                            "description": "Acesso permitido de acordo com a sinalética e/ou com leis locais específicas; como p. ex. o Código da Estrada",
+                            "description": "Acesso permitido de acordo com a sinalética e/ou legislação local específica; como p. ex. o Código da Estrada",
                             "title": "Indicado"
                         },
                         "destination": {
                         "access": "A todos",
                         "bicycle": "Bicicletas",
                         "foot": "Peões",
-                        "horse": "Cavaleiros",
+                        "horse": "Cavalos",
                         "motor_vehicle": "Veículos Motorizados"
                     }
                 },
                         "floor": "Chão",
                         "hamlet": "Aldeia",
                         "housename": "Nome da habitação",
-                        "housenumber": "Nº Porta",
+                        "housenumber": "123",
                         "housenumber!jp": "Nº Edifício / Loteamento",
                         "neighbourhood": "Bairro",
                         "neighbourhood!jp": "Chōme/Aza/Koaza",
                     "placeholder": "1, 2, 3..."
                 },
                 "aerialway/heating": {
-                    "label": "Aquecido"
+                    "label": "Aquecimento"
                 },
                 "aerialway/occupancy": {
-                    "label": "Ocupação Máxima",
+                    "label": "Lotação Máxima",
                     "placeholder": "2, 4, 8...."
                 },
                 "aerialway/summer/access": {
                     "label": "Tipo de loja"
                 },
                 "bench": {
-                    "label": "Banco de Sentar"
+                    "label": "Banco (objeto de sentar)"
                 },
                 "bicycle_parking": {
                     "label": "Tipo"
                         "plasma": "plasma",
                         "platelets": "plaquetas",
                         "stemcells": "amostras de células estaminais",
-                        "whole": "sangue todo"
+                        "whole": "sangue como um todo"
                     }
                 },
                 "board_type": {
                 "brand": {
                     "label": "Marca"
                 },
+                "brewery": {
+                    "label": "Imperial/fino (cerveja)"
+                },
                 "bridge": {
                     "label": "Tipo",
                     "placeholder": "Padrão"
                     "label": "Capacidade",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "E": "Este",
-                        "ENE": " Lés-nordeste",
-                        "ESE": "Lés-sudeste",
-                        "N": "Norte",
-                        "NE": "Nordeste",
-                        "NNE": "Nor-nordeste",
-                        "NNW": "Nor-noroeste",
-                        "NW": "Noroeste",
-                        "S": "Sul",
-                        "SE": "Sudeste",
-                        "SSE": "Su-sudeste",
-                        "SSW": "Su-sudoeste",
-                        "SW": "Sudoeste",
-                        "W": "Oeste",
-                        "WNW": "Oés-noroeste",
-                        "WSW": "Oés-sudoeste"
-                    }
-                },
                 "castle_type": {
                     "label": "Tipo"
                 },
-                "clock_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "anticlockwise": "Sentido contrário aos ponteiros do relógio.",
-                        "clockwise": "Sentido dos ponteiros do relógio"
-                    }
-                },
                 "clothes": {
                     "label": "Roupas"
                 },
                     "label": "Horário de recolha"
                 },
                 "comment": {
-                    "label": "Comentário das Alterações",
+                    "label": "Comentário do conjunto de alterações",
                     "placeholder": "Breve descrição das suas alterações (obrigatório)"
                 },
                 "communication_multi": {
                             "title": "Nenhuma"
                         },
                         "opposite": {
-                            "description": "Uma faixa onde se percorre em ambas as direções numa rua de um só sentido",
+                            "description": "Uma ciclovia onde se percorre em bicicleta ambas as direções numa rua de um só sentido rodoviário",
                             "title": "Faixa mista"
                         },
                         "opposite_lane": {
-                            "description": "Uma faixa onde se percorre no sentido oposto ao do trânsito",
-                            "title": "Faixa oposta"
+                            "description": "Uma ciclovia onde se percorre em bicicleta no sentido oposto ao tráfego rodoviário",
+                            "title": "Ciclovia em sentido oposto"
                         },
                         "share_busway": {
-                            "description": "Uma faixa reservada a bicicletas e autocarros",
-                            "title": "Faixa partilhada por bicicletas e autocarros"
+                            "description": "Uma ciclovia partilhada com uma faixa para autocarros",
+                            "title": "Ciclovia partilhada com autocarros"
                         },
                         "shared_lane": {
-                            "description": "Uma faixa partilhada com o trânsito em geral",
-                            "title": "Faixa partilhada"
+                            "description": "Uma ciclovia partilhada com o trânsito rodoviário",
+                            "title": "Ciclovia partilhada"
                         },
                         "track": {
-                            "description": "Uma faixa separada do trânsito por uma barreira física",
-                            "title": "Faixa de bicicletas separada"
+                            "description": "Uma ciclovia separada do restante trânsito por uma barreira física",
+                            "title": "Trilho de bicicleta"
                         }
                     },
                     "placeholder": "nenhum",
                 "diaper": {
                     "label": "Fraldário "
                 },
+                "direction": {
+                    "label": " Direção (em graus no sentido dos ponteiros do relógio)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Direção",
+                    "options": {
+                        "E": "Este",
+                        "ENE": "Este-Nordeste",
+                        "ESE": "Este-sudeste",
+                        "N": "Norte",
+                        "NE": "Nordeste",
+                        "NNE": "No-nordeste",
+                        "NNW": "No-nordoeste",
+                        "NW": "Noroeste",
+                        "S": "Sul",
+                        "SE": "Sudoeste",
+                        "SSE": "Su-sueste",
+                        "SSW": "Su-sudoeste",
+                        "SW": "Sudoeste",
+                        "W": "Oeste",
+                        "WNW": "Oeste-Nordeste",
+                        "WSW": "Oeste-Sudoeste"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Direção",
+                    "options": {
+                        "anticlockwise": "No sentido oposto dos ponteiros do relógio",
+                        "clockwise": "No sentido dos ponteiros do relógio"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Para trás",
+                        "both": "Ambos / Todos",
+                        "forward": "Para a frente"
+                    }
+                },
                 "display": {
                     "label": "Mostrador"
                 },
                     "label": "Tipo"
                 },
                 "drive_through": {
-                    "label": "serviço ao volante (sem sair do carro)"
+                    "label": "serviço ao volante (sem sair do veiculo)"
                 },
                 "duration": {
                     "label": "Duração",
                     "options": {
                         "contact_line": "Catenária (linha aérea)",
                         "no": "Não",
-                        "rail": "Terceiro Carril Eletrificado",
+                        "rail": "Carril Eletrificado",
                         "yes": "Sim (não especificado)"
                     },
-                    "placeholder": "Catenária, Terceiro Carril Eletrificado..."
+                    "placeholder": "Catenária, Carril Eletrificado..."
                 },
                 "elevation": {
                     "label": "Altitude (metros)"
                     "label": "Posição",
                     "options": {
                         "green": "Relvado",
-                        "lane": "Faixa de rodagem",
+                        "lane": "Via de trânsito",
                         "parking_lot": "Estacionamento",
                         "sidewalk": "Passeio"
                     }
                     "label": "Tipo"
                 },
                 "lanes": {
-                    "label": "Nº Vias de Trânsito",
+                    "label": "Número de vias de trânsito",
                     "placeholder": "1, 2, 3..."
                 },
                 "layer": {
                     "label": "Tipo"
                 },
                 "map_size": {
-                    "label": "CObertura"
+                    "label": "Cobertura"
                 },
                 "map_type": {
                     "label": "Tipo"
                 },
                 "maxheight": {
                     "label": "Altura máxima",
-                    "placeholder": "4, 4.5, 5, 14'0\", 14'6\", 15'0\""
+                    "placeholder": "4, 4.5, 5, 6, 8"
                 },
                 "maxspeed": {
                     "label": "Limite de velocidade",
                 "memorial": {
                     "label": "Tipo"
                 },
-                "milestone_position": {
-                    "label": "Posição do Marco Quilométrico",
-                    "placeholder": "Distância a um decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Monitorização"
                 },
                 "mtb/scale": {
                     "label": "Dificuldade para bicicletas de montanha",
                     "placeholder": "0, 1, 2, 3..."
                 },
                 "mtb/scale/imba": {
-                    "label": "Dificuldade de caminhar definido pela IMBA",
+                    "label": "Dificuldade da caminhada definido pela IMBA",
                     "options": {
                         "0": "Muito fácil (círculo branco)",
                         "1": "Fácil (círculo verde)",
                 "oneway": {
                     "label": "Sentido único?",
                     "options": {
+                        "alternating": "Alternado",
                         "no": "Não",
+                        "reversible": "Reversível",
                         "undefined": "Assumido que seja \"Não\"",
                         "yes": "Sim"
                     }
                 "oneway_yes": {
                     "label": "Sentido único?",
                     "options": {
+                        "alternating": "Alternado",
                         "no": "Não",
+                        "reversible": "Reversível",
                         "undefined": "Assumido que seja \"Sim\"",
                         "yes": "Sim"
                     }
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direção",
-                    "options": {
-                        "backward": "Para trás",
-                        "forward": "Para à frente"
-                    }
-                },
                 "park_ride": {
-                    "label": "Estacionamento de intercâmbio"
+                    "label": "Estacionamento de intercâmbio (park & ride)"
                 },
                 "parking": {
                     "label": "Tipo",
                 "railway": {
                     "label": "Tipo"
                 },
+                "railway/position": {
+                    "label": "Marco quilométrico",
+                    "placeholder": "Distância para uma décima (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Para trás",
+                        "both": "Ambos / Todos",
+                        "forward": "Para a frente"
+                    }
+                },
                 "rating": {
                     "label": "Potência Nominal"
                 },
                 "recycling_accepts": {
                     "label": "Aceita"
                 },
-                "recycling_type": {
-                    "label": "Tipo de Reciclagem",
-                    "options": {
-                        "centre": "Centro de Reciclagem",
-                        "container": "Contentor"
-                    }
-                },
                 "ref": {
                     "label": "Código de Referência"
                 },
                 },
                 "ref_taxiway": {
                     "label": "Nome da Pista de Circulação",
-                    "placeholder": "por ex. A5"
+                    "placeholder": "por exemplo: A5"
                 },
                 "relation": {
                     "label": "Tipo"
                 "traffic_signals": {
                     "label": "Tipo"
                 },
+                "traffic_signals/direction": {
+                    "label": "Direção",
+                    "options": {
+                        "backward": "Para trás",
+                        "both": "Ambos / Todos",
+                        "forward": "Para a frente"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Visibilidade",
                     "options": {
                     "label": "Tipo"
                 },
                 "website": {
-                    "label": "Site oficial",
+                    "label": "Sítio oficial",
                     "placeholder": "http://www.exemplo.org/"
                 },
                 "wetland": {
                     "terms": "Rope Tow Lift"
                 },
                 "aerialway/station": {
-                    "name": "Estação de teleféricos",
-                    "terms": "Aerialway Station, Entrada de Teleféricos, Paragem de Teleféricos"
+                    "name": "Estação de teleféricos"
                 },
                 "aerialway/t-bar": {
                     "name": "Teleférico de neve",
                     "name": "Via área"
                 },
                 "aeroway/aerodrome": {
-                    "name": "Aeroporto / Aeródromo",
+                    "name": "Aeroporto / Aeródromo ",
                     "terms": "Avião, aeródromo"
                 },
                 "aeroway/apron": {
                 },
                 "amenity/arts_centre": {
                     "name": "Centro artístico",
-                    "terms": "Arts Center, Centro de Artes"
+                    "terms": "Galeria, atelier, Centro de Artes"
                 },
                 "amenity/atm": {
                     "name": "Multibanco",
                     "terms": "Currency Exchange, Troca de Dinheiro, Câmbio"
                 },
                 "amenity/bus_station": {
-                    "name": "Estação de autocarros",
-                    "terms": "Bus Station, Autocarros, Rodoviária, Carreira, Autocarro, ônibus, machimbombo, toca-toca, otocarro, microlete"
+                    "name": "Estação autocarro / Terminal"
                 },
                 "amenity/cafe": {
                     "name": "Café",
                     "terms": "Comida Instantânea, Comida de plástico, Fast Food"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Terminal de ferries",
-                    "terms": "Ferry Terminal, Balsa, ferryboat, ferry-boat, ferribout, ferry, ferribote, batelão"
+                    "name": "Estação de ferry / Terminal"
                 },
                 "amenity/fire_station": {
                     "name": "Quartel de bombeiros",
-                    "terms": "Bombeiros, Quartel, Quartel dos Bombeiros, Quartel de Bombeiros, Bombeiros, Bombeiros Voluntários, BV"
+                    "terms": "Bombeiros, Quartel, Quartel dos Bombeiros, Quartel de Bombeiros, Bombeiros, Bombeiros Voluntários, BV, Sapadores"
                 },
                 "amenity/food_court": {
                     "name": "Praça de alimentação",
                     "terms": "Fonte, Fonte de Água, Jacto de Água"
                 },
                 "amenity/fuel": {
-                    "name": "Gasolineira / Posto de combustível",
-                    "terms": "Bombas de Abastecimento, Bombas de Gasolina, Bombas de Combustível"
+                    "name": "Posto de combustível",
+                    "terms": "Bombas de Abastecimento, Bombas de Gasolina, Bombas de Combustível, gasolineira"
                 },
                 "amenity/grave_yard": {
                     "name": "Sepultura (fora de cemitérios)",
                 },
                 "amenity/motorcycle_parking": {
                     "name": "Parque de motas",
-                    "terms": "Motorcycle Parking, Motas, Estacionamento"
+                    "terms": "Estacionamento para motas, estacionamento para motociclos, estacionamento mota"
                 },
                 "amenity/music_school": {
                     "name": "Escola de Música",
-                    "terms": "conservatório,música,escola"
+                    "terms": "conservatório, música, escola"
                 },
                 "amenity/nightclub": {
-                    "name": "Discoteca (dança)",
-                    "terms": "Nightclub, Salão de Dança"
+                    "name": "Discoteca",
+                    "terms": "Nightclub, Salão de Dança, disco, clube noturno, "
                 },
                 "amenity/nursing_home": {
                     "name": "Lar de idosos"
                 },
                 "amenity/parking": {
-                    "name": "Parque de estacionamento",
-                    "terms": "Estacionamento, Lugar de Estacionamento, Estacionar"
+                    "name": "Parque de estacionamento para carros",
+                    "terms": "Estacionamento, Lugar de Estacionamento, Estacionar, estacionamento carro"
                 },
                 "amenity/parking_entrance": {
                     "name": "Entrada / Saída de estacionamento",
-                    "terms": "Parking Garage Entrance/Exit, Entrada, Saída, Estacionamento, Estacionar"
+                    "terms": "Entrada para estacionamento em garagem/Saída, Entrada, Saída, Estacionamento, Estacionar"
                 },
                 "amenity/parking_space": {
                     "name": "Lugar de estacionamento",
-                    "terms": "Parking Space, Estacionamento, Estacionar"
+                    "terms": "Lugar de estacionamento, Estacionamento, Estacionar"
                 },
                 "amenity/pavilion": {
                     "name": "Pavilhão",
                     "terms": "Planetarium"
                 },
                 "amenity/police": {
-                    "name": "Esquadra / Posto de polícia",
-                    "terms": "Polícia, GNR, G.N.R., PSP, P.S.P., Polícia de Segurança Pública, Guarda Nacional Republicana, Judiciária"
+                    "name": "Esquadra",
+                    "terms": "Polícia, GNR, G.N.R., PSP, P.S.P., Polícia de Segurança Pública, Guarda Nacional Republicana, Judiciária, Polícia Marítima, posto de polícia, "
                 },
                 "amenity/post_box": {
-                    "name": "Caixa / Marco de correio",
-                    "terms": "Marco de Correio, Caixa Postal, Posto de Correio"
+                    "name": "Marco de correio",
+                    "terms": "Marco de Correio, Caixa Postal, Posto de Correio, caixa de correio, ctt,"
                 },
                 "amenity/post_office": {
                     "name": "Estação de correios",
                     "terms": "Ranger Station, Guarda Florestal"
                 },
                 "amenity/recycling": {
-                    "name": "Reciclagem",
-                    "terms": "Recycling, Reutilizar, Reciclar, Ecoponto, Vidrão, Papelão, Embalão, Pilhão, Oleão"
+                    "name": "Contentor reciclagem",
+                    "terms": "<translate with synonyms or related terms for 'Recycling Container', separated by commas>"
                 },
                 "amenity/recycling_centre": {
                     "name": "Centro de Reciclagem",
                 },
                 "amenity/sanitary_dump_station": {
                     "name": "Escoamento sanitário de autocaravana",
-                    "terms": "RV Toilet Disposal"
+                    "terms": "Escoamento de águas residuais de autocaravanas, dejetos, Estação de Serviço para Autocaravanas, águas residuais caravana, residuais autocaravana,"
                 },
                 "amenity/school": {
                     "name": "Escola",
                     "terms": "Higiene Feminina"
                 },
                 "amenity/vending_machine/news_papers": {
-                    "name": "Máquina de venda de jornais"
+                    "name": "Máquina de venda automática de jornais"
                 },
                 "amenity/vending_machine/newspapers": {
                     "name": "Máquina de venda automática de jornais ",
                 },
                 "amenity/vending_machine/parking_tickets": {
                     "name": "Máquina de bilhetes de estacionamento",
-                    "terms": "Parking Ticket Vending Machine"
+                    "terms": "Máquina ticket de estacionamento"
                 },
                 "amenity/vending_machine/public_transport_tickets": {
                     "name": "Máquina de bilhetes de transporte",
                     "terms": "Waste Transfer Station"
                 },
                 "amenity/water_point": {
-                    "name": "Água potável para veículos recreativos",
+                    "name": "Água potável para autocaravanas",
                     "terms": "RV Drinking Water, Água, Caravana, Autocaravana"
                 },
                 "amenity/watering_place": {
                     "terms": "Espaço, Extensão, Zona"
                 },
                 "area/highway": {
-                    "name": "Área de estrada",
-                    "terms": "Road Surface"
+                    "name": "Superfície da Estrada",
+                    "terms": "tipo de piso, piso, superfície estrada, tipo superfície, "
                 },
                 "attraction/amusement_ride": {
                     "name": "Atração de Parque de Diversões",
                 },
                 "attraction/drop_tower": {
                     "name": "Torre de Queda Livre",
-                    "terms": "Drop Towe, torre de caída, cair, caída"
+                    "terms": "Drop Towe, torre de caída, cair, caída, base jump, "
                 },
                 "attraction/pirate_ship": {
                     "name": "Barco Pirata",
-                    "terms": "Pirate Ship, barco, pirata"
+                    "terms": "Pirate Ship, barco, pirata, corsário"
                 },
                 "attraction/river_rafting": {
                     "name": "Rafting",
-                    "terms": "River Rafting"
+                    "terms": "canoagem águas bravas, águas bravas,"
                 },
                 "attraction/roller_coaster": {
-                    "name": "Montanha Russa",
-                    "terms": "Roller Coaster, montanhas-russas, montanhas russas, montanha russa"
+                    "name": "Montanha Russa ",
+                    "terms": "montanhas-russas, montanhas russas, montanha russa"
                 },
                 "attraction/train": {
                     "name": "Comboio Turístico",
-                    "terms": "Tourist Train, combóios turísticos, turístico, comboio"
+                    "terms": "locomotiva turística, comboios turísticos, turístico, comboio"
                 },
                 "attraction/water_slide": {
                     "name": "Escorrega de Água",
-                    "terms": "Water Slide, toboágua, escorregador, escorrega"
+                    "terms": "tobogan, toboágua, escorregador, escorrega"
                 },
                 "barrier": {
                     "name": "Barreira",
                     "terms": "Bloqueio, Obstáculo"
                 },
                 "barrier/bollard": {
-                    "name": "Pilar",
-                    "terms": "Bolardo, Poste de Amarração"
+                    "name": "Pilarete",
+                    "terms": "Bolardo, Poste de Amarração, pilar"
                 },
                 "barrier/border_control": {
                     "name": "Controlo de fronteira",
-                    "terms": "Border Control"
+                    "terms": "controlo fronteiriço"
                 },
                 "barrier/cattle_grid": {
                     "name": "Grelha anti-gado",
                     "terms": "College Building, Colégio"
                 },
                 "building/commercial": {
-                    "name": "Edifício de Escritórios",
+                    "name": "Edifício de comercial",
                     "terms": "Prédio Comercial, Edifício Comercial"
                 },
                 "building/construction": {
                     "name": "Edifício de jardim infantil / infantário",
                     "terms": "Preschool/Kindergarten Building"
                 },
+                "building/mosque": {
+                    "name": "Edifício Mesquita",
+                    "terms": "<translate with synonyms or related terms for 'Mosque Building', separated by commas>"
+                },
                 "building/public": {
                     "name": "Edifício público",
                     "terms": "Public Building"
                     "terms": "Warehouse, Arrecadação"
                 },
                 "camp_site/camp_pitch": {
-                    "name": "Sítio de acampamento",
-                    "terms": "Camp Pitch"
+                    "name": "Sítio para acampar",
+                    "terms": "acampar, acampar ao ar livre,"
                 },
                 "club": {
                     "name": "Clube",
                 },
                 "craft/brewery": {
                     "name": "Cervejaria artesanal",
-                    "terms": "Brewery, Mestre Cervejeiro, Cerveja, Cervejaria, artesanal"
+                    "terms": "Brewery, Mestre Cervejeiro, Cerveja, Cervejaria, cerveja artesanal"
                 },
                 "craft/carpenter": {
                     "name": "Carpinteiro",
                 },
                 "craft/caterer": {
                     "name": "Catering",
-                    "terms": "Caterer, Catering, Cattering, Comida"
+                    "terms": "Caterer, Catering, Cattering, Comida, comida ao domicílio"
                 },
                 "craft/chimney_sweeper": {
                     "name": "Limpa-Chaminés",
                 },
                 "craft/metal_construction": {
                     "name": "Construção metálica",
-                    "terms": "Metal Construction"
+                    "terms": "construção em metal"
                 },
                 "craft/optician": {
                     "name": "Oculista"
                 },
                 "craft/rigger": {
                     "name": "Armador",
-                    "terms": "Rigger"
+                    "terms": "construtor de barcos, construtor de navios"
                 },
                 "craft/roofer": {
                     "name": "Telhador",
                     "terms": "Entrance/Exit, Entrada, Acesso, Abertura, Porta, Pórtico, Portão"
                 },
                 "footway/crossing": {
-                    "name": "Passadeira pedestre",
-                    "terms": "Street Crossing"
+                    "name": "Passadeira de peões",
+                    "terms": "passadeira, zebra, atravessamento de peões, passadeira zebra, "
                 },
                 "footway/crossing-raised": {
-                    "name": "Lomba Comprida (+3m) com Passagem de Peões em Rua Pedonal",
-                    "terms": "lomba, table, mesa"
+                    "name": "Sobreelevação superfície de atravessamento (+3m de comprimento)",
+                    "terms": "lomba, table, mesa,  Lomba Comprida, Passagem de Peões, Medidas de Acalmia de Tráfego"
                 },
                 "footway/crosswalk": {
-                    "name": "Passadeira pedestre com faixas",
-                    "terms": "Pedestrian Crosswalk"
+                    "name": "Passadeira de peões",
+                    "terms": "passadeira pedonal, faixa de segurança, zebra, zebra cross, marcas transversais, passadeira com marcas transversais, "
                 },
                 "footway/crosswalk-raised": {
-                    "name": "Lomba Comprida (+3m) com Passadeira em Rua Pedonal",
-                    "terms": "lomba, table, mesa, passadeira"
+                    "name": "Passadeira de peões elevada (+3m de comprimento)",
+                    "terms": "lomba, table, mesa, passadeira, Medidas de Acalmia de Tráfego, passadeira elevada"
                 },
                 "footway/sidewalk": {
                     "name": "Passeio",
-                    "terms": "Sidewalk, Calçada"
+                    "terms": "Calçada"
                 },
                 "ford": {
                     "name": "Vau (ponto de passagem num curso de água baixo)",
                 },
                 "healthcare": {
                     "name": "Instalações de Saúde",
-                    "terms": "saúde, cuidados médicos, medicina"
+                    "terms": "saúde, cuidados médicos, medicina, cuidados de saúde, clínica, "
                 },
                 "healthcare/alternative": {
                     "name": "Medicina Alternativa",
                     "terms": "Trilho para Cavalos, Trilho para Cavaleiros, Trilho Equestre, Caminho Equestre, Caminho para Cavalos, Caminho para Cavaleiros"
                 },
                 "highway/bus_stop": {
-                    "name": "Paragem de autocarro",
-                    "terms": "Paragem de Autocarro, Terminal de Autocarros, Carreira, Autocarro, ônibus, machimbombo, toca-toca, otocarro, microlete"
+                    "name": "Paragem de autocarro / Plataforma"
                 },
                 "highway/corridor": {
                     "name": "Corredor interior",
                     "terms": "Indoor Corridor"
                 },
                 "highway/crossing": {
-                    "name": "Passadeira geral",
-                    "terms": "Street Crossing"
+                    "name": "Passadeira de peões genérica",
+                    "terms": "Passadeira de peões"
                 },
                 "highway/crossing-raised": {
                     "name": "Lomba Comprida com Passagem de Peões (+3m)",
                 },
                 "highway/crosswalk": {
                     "name": "Passadeira geral com faixas",
-                    "terms": "Pedestrian Crosswalk"
+                    "terms": "passadeira pedonal, passadeira de peões, atravessamento de peões"
                 },
                 "highway/crosswalk-raised": {
                     "name": "Lomba Comprida com Passadeira (+3m)",
                 },
                 "highway/footway": {
                     "name": "Caminho pedonal",
-                    "terms": "Andar, Caminho, Estrada, Pé, Pedestre, Percurso, Rua, Ruela, Trajectória, Trilha, Trilho, Via, Viela, Caminho Pedonal"
+                    "terms": "Andar, Caminho, Estrada, Pé, Pedestre, Percurso, Rua, Ruela, Trajectória, Trilha, Trilho, Via, Viela, Caminho Pedonal, beco, vereda, "
                 },
                 "highway/give_way": {
-                    "name": "Sinal de cedência",
-                    "terms": "Tield Sign"
+                    "name": "Sinal de cedência de passagem",
+                    "terms": "perda de prioridade, cedencia, cedência, prioridade"
                 },
                 "highway/living_street": {
                     "name": "Zona de coexistência",
-                    "terms": "Living Street, Zona de Peões"
+                    "terms": "Zona de Peões"
                 },
                 "highway/mini_roundabout": {
                     "name": "Mini-rotunda",
                 },
                 "highway/motorway_junction": {
                     "name": "Interseção / Saída de autoestradas",
-                    "terms": "Motorway Junction / Exit, Junção de Autoestradas, Saída de Autoestradas"
+                    "terms": "Junção de Autoestradas, Saída de Autoestradas, nó autoestrada, nó auto-estrada, entrada, entrada autoestrada, entrada auto-estrada, saída auto-estrada, entrada auto-estrada,"
                 },
                 "highway/motorway_link": {
                     "name": "Ligação a uma autoestrada",
                 },
                 "highway/path": {
                     "name": "Trilho",
-                    "terms": "Trilha, Caminho"
+                    "terms": "Trilha, Caminho, vereda (com pavimento em terra), vereda"
                 },
                 "highway/pedestrian_area": {
-                    "name": "Área Pedestre",
-                    "terms": "praça, largo"
+                    "name": "Área Pedonal",
+                    "terms": "praça, largo, alameda"
                 },
                 "highway/pedestrian_line": {
                     "name": "Estrada Pedonal",
                 },
                 "highway/service/alley": {
                     "name": "Viela / Traseiras",
-                    "terms": "Traseiras"
+                    "terms": "Traseiras, beco (com acesso para carros), estrada estreita, caminho estreito, beco estreito, viela, "
                 },
                 "highway/service/drive-through": {
                     "name": "Serviço ao volante (sem sair do carro)",
                 },
                 "highway/street_lamp": {
                     "name": "Poste de iluminação",
-                    "terms": "Street Lamp, Poste de Luz, Lâmpada, Luz, Iluminação, Candeeiro"
+                    "terms": "Poste de Luz, Lâmpada, Luz, Iluminação, Candeeiro, luz da rua, iluminação publica"
                 },
                 "highway/tertiary": {
                     "name": "Estrada terciária",
                     "terms": "Estrada de terra, estrada agrícola, Track, Estrada Rural, Carreiro, Carreiro Florestal "
                 },
                 "highway/traffic_mirror": {
-                    "name": "Espelho convexo de estrada",
-                    "terms": "Traffic Mirror"
+                    "name": "Espelho rodoviário",
+                    "terms": "espelho, espelho vertical,"
                 },
                 "highway/traffic_signals": {
                     "name": "Semáforos",
-                    "terms": "Semáforo, Vermelho, Verde, Amarelo, Sinal, Sinal de Trânsito"
+                    "terms": "Semáforo, Vermelho, Verde, Amarelo, Sinal, Sinal de Trânsito, sinal luminoso, sinalização vertical, "
                 },
                 "highway/trunk": {
                     "name": "Via rápida",
                     "terms": "Inversão de Marcha"
                 },
                 "highway/turning_loop": {
-                    "name": "Anel",
-                    "terms": "Turning Loop (Island)'"
+                    "name": "Anel de viragem",
+                    "terms": "inversão de marcha numa ilha,"
                 },
                 "highway/unclassified": {
                     "name": "Estrada menor / sem classificação",
                     "name": "Floresta",
                     "terms": "Floresta, Área Verde"
                 },
-                "landuse/garages": {
-                    "name": "Garagens",
-                    "terms": "Garages"
-                },
                 "landuse/grass": {
                     "name": "Relva",
                     "terms": "Relva, Grama"
                     "name": "Terreno com loteamento planeado",
                     "terms": "loteamento"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Estufa Horticultura",
+                    "terms": "<translate with synonyms or related terms for 'Greenhouse Horticulture', separated by commas>"
+                },
                 "landuse/harbour": {
                     "name": "Porto Marítimo",
                     "terms": "porto, abra, refúgio, abrigo, porto seguro, porto-seguro, porto abrigado, ancoradouro"
                     "terms": "Dance Hall"
                 },
                 "leisure/dog_park": {
-                    "name": "Parque de cães",
+                    "name": "Parque para cães",
                     "terms": "Parque para Cães, Dog Park"
                 },
                 "leisure/firepit": {
                 },
                 "leisure/park": {
                     "name": "Parque",
-                    "terms": "Bosque, Floresta, Jardim, Relva, Relvado"
+                    "terms": "Bosque, Floresta, Jardim, Relva, Relvado, Jardim Público, Parque Público"
                 },
                 "leisure/picnic_table": {
                     "name": "Mesa de piquenique",
                     "name": "Poste",
                     "terms": "mastro, poste, torre"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Estação de monitorização",
+                    "terms": "estação, medição, monitorizar, "
+                },
                 "man_made/observation": {
                     "name": "Torre de observação",
                     "terms": "Observatório Tower, Miradouro"
                     "terms": "Accountant, Contas, Contabilidade, IRS, I.R.S., Contabilista, Contabilistas"
                 },
                 "office/administrative": {
-                    "name": "Escritório da administração local",
-                    "terms": "Administrative Office, Administrativo"
+                    "name": "Escritório da administração local"
                 },
                 "office/adoption_agency": {
                     "name": "Agência de Adoção",
                     "name": "Instituição de Caridade",
                     "terms": "Caridade, Filantropia"
                 },
-                "office/company": {
-                    "name": "Escritório de empresa",
-                    "terms": "Company Office, Sede, Empresa"
-                },
                 "office/coworking": {
                     "name": "Escritórios Cooperativos",
                     "terms": "Escritórios Partilhados, Trabalho Cooperativo, Coworking, Co-working, Espaço de Trabalho Compartilhado"
                     "terms": "Law Office, Agência de Advocacia, Advogados, Advogado, Advogadas, Advogada, Advocacia"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notário",
-                    "terms": "Notary Office, Notariado"
+                    "name": "Notário"
                 },
                 "office/moving_company": {
                     "name": "Empresa de Mudanças",
                     "terms": "jornal"
                 },
                 "office/ngo": {
-                    "name": "Escritório de ONG",
-                    "terms": "NGO Office, Organização, Organização Não Governamental, NGO, ONG"
+                    "name": "Sede de ONG",
+                    "terms": "NGO Office, Organização, Organização Não Governamental, NGO, ONG, escritório ONG"
                 },
                 "office/notary": {
                     "name": "Notário",
                 },
                 "office/political_party": {
                     "name": "Sede/filial de partido político",
-                    "terms": "Political Party, Partido, Partidos"
+                    "terms": "Political Party, Partido, Partidos, sede partido, sede partidária, política, sede política, "
                 },
                 "office/private_investigator": {
                     "name": "Detetive Privado",
                     "terms": "Detetive, Detetive Particular"
                 },
                 "office/quango": {
-                    "name": "Escritório de NGO Governamental",
-                    "terms": "<translate with synonyms or related terms for 'Quasi-NGO Office', separated by commas>"
+                    "name": "Sede de ONG subsidiada",
+                    "terms": "organização não governamental, ONG, NGO, sede ONG, sede organização não governamental, ISPP, ONG subsidiada, ONG subsidiada governo, ONG subsidiada estado,"
                 },
                 "office/research": {
                     "name": "Centro de investigação",
                     "name": "Transformador de distribuição",
                     "terms": "Transformador"
                 },
-                "public_transport/platform": {
-                    "name": "Plataforma de transporte público",
-                    "terms": "Platform, Plataforma, Paragem de autocarro"
-                },
-                "public_transport/stop_position": {
-                    "name": "Paragem de transporte público",
-                    "terms": "Stop Position, Paragem"
+                "public_transport/linear_platform_bus": {
+                    "name": "Paragem de autocarro / plataforma",
+                    "terms": "Paragem, terminal, autocarro, bus stop, bus, abrigo paragem"
                 },
                 "railway": {
                     "name": "Ferrovia"
                     "name": "Funicular",
                     "terms": "Funicular, Plano Inclinado"
                 },
-                "railway/halt": {
-                    "name": "Apeadeiro",
-                    "terms": "Railway Halt, Paragem"
-                },
                 "railway/level_crossing": {
                     "name": "Passagem de nível (estrada)",
                     "terms": "Railway Crossing (Road)"
                     "name": "Marco Quilométrico Ferroviário",
                     "terms": "Railway Milestone, marco quilométrico"
                 },
+                "railway/miniature": {
+                    "name": "Caminho de ferro em miniatura",
+                    "terms": "<translate with synonyms or related terms for 'Miniature Railway', separated by commas>"
+                },
                 "railway/monorail": {
                     "name": "Monocarril",
                     "terms": "Monorail"
                     "name": "Via estreita",
                     "terms": "Narrow Gauge Rail, Bitola Estreita, Via Métrica, Bitola Métrica"
                 },
-                "railway/platform": {
-                    "name": "Plataforma ferroviária",
-                    "terms": "Railway Platform, Plataforma"
-                },
                 "railway/rail": {
                     "name": "Ferrovia",
                     "terms": "Rail, Linha Férrea, Caminho de ferro, Caminhos de ferro, Carril, Carris, via férrea, estrada-de-ferro, ferrovia"
                     "terms": "Railway Signal, semáforo ferroviário, semáforo, sinalização, sinal"
                 },
                 "railway/station": {
-                    "name": "Estação ferroviária",
-                    "terms": "Railway Station, Estação de Comboios"
+                    "name": "Estação de comboio"
                 },
                 "railway/subway": {
                     "name": "Metro",
                     "name": "Elétrico",
                     "terms": "Elétrico, Eléctrico"
                 },
-                "railway/tram_stop": {
-                    "name": "Paragem de Elétrico",
-                    "terms": "Paragem de Elétrico, Estação de Elétrico"
-                },
                 "relation": {
                     "name": "Relação",
                     "terms": "Relação"
                     "terms": "Jeweler, Jóias, Jóia"
                 },
                 "shop/kiosk": {
-                    "name": "Quiosque de jornais e revistas",
-                    "terms": "News Kiosk, Kiosque, Quiosque, Qiosque, Jornais, Jornal, Revistas, Revista"
+                    "name": "Quiosque",
+                    "terms": "<translate with synonyms or related terms for 'Kiosk', separated by commas>"
                 },
                 "shop/kitchen": {
                     "name": "Loja de cozinhas",
                     "terms": "Locksmith, Fechaduras, Fechadura, Chaves, Chave"
                 },
                 "shop/lottery": {
-                    "name": "Lotaria",
+                    "name": "Loja de lotaria",
                     "terms": "Lottery Shop, Jogos Santa Casa, Euromilhões, Totoloto, Totobola, Joker, Raspadinha, Pé-de-Meia, Loja da Sorte"
                 },
                 "shop/mall": {
                 },
                 "shop/video": {
                     "name": "Videoclube",
-                    "terms": "Video Store, Clube de Vídeo"
+                    "terms": "aluguer de vídeo, Clube de Vídeo"
                 },
                 "shop/video_games": {
                     "name": "Loja de videojogos",
-                    "terms": "Video Game Store, Jogos de Computador, Consola"
+                    "terms": "Jogos de Computador, Consola"
                 },
                 "shop/watches": {
                     "name": "Loja de relógios",
-                    "terms": "Watches Shop, Relojoeiro "
+                    "terms": "relojoaria, Relojoeiro "
                 },
                 "shop/water_sports": {
                     "name": "Loja de material de natação",
-                    "terms": "Watersport/Swim Shop, Material de Banho"
+                    "terms": "Material de Banho, tocas natação, material natação, modalidade natação"
                 },
                 "shop/weapons": {
                     "name": "Loja de armas",
-                    "terms": "Weapon Shop, Loja de Armas, Caça"
+                    "terms": "espingardaria, Loja de Armas, Caça"
                 },
                 "shop/window_blind": {
                     "name": "Loja de estores",
-                    "terms": "Window Blind Store, Estores, Estor"
+                    "terms": "Estores, Estor"
                 },
                 "shop/wine": {
                     "name": "Loja de vinhos",
                 },
                 "tourism": {
                     "name": "Turismo",
-                    "terms": "Turismo"
+                    "terms": "hotelaria"
                 },
                 "tourism/alpine_hut": {
                     "name": "Albergue de montanha",
-                    "terms": "Alpine Hut"
+                    "terms": "cabana de montanha"
                 },
                 "tourism/apartment": {
                     "name": "Apartamento de hóspedes",
-                    "terms": "Guest Apartment / Condo"
+                    "terms": "airbnb, alojamento local, time-share"
                 },
                 "tourism/aquarium": {
                     "name": "Aquário público",
                 },
                 "tourism/attraction": {
                     "name": "Atração turística",
-                    "terms": "Atração Turística"
+                    "terms": "ponto turístico"
                 },
                 "tourism/camp_site": {
                     "name": "Parque de Campismo",
                 },
                 "tourism/hotel": {
                     "name": "Hotel",
-                    "terms": "Hotel"
+                    "terms": "Alojamento, hoteleiro, instalação hoteleira"
                 },
                 "tourism/information": {
                     "name": "Informação turística",
                 },
                 "tourism/information/board": {
                     "name": "Placar de Informação",
-                    "terms": "painel de informação, placa de informação, informação, informações, painel, placar, placard, placa"
+                    "terms": "painel de informação, placa de informação, informação, informações, painel, placar, placard, placa, painel informativo"
                 },
                 "tourism/information/guidepost": {
-                    "name": "Poste de direções",
-                    "terms": "poste de direcções, poste com direções, poste com direcções, direção, direcção, direções, direcções"
+                    "name": "Poste com direções",
+                    "terms": "poste de direções, poste com direções, poste com direções, direção, direção, direções, direções, sinalética, sinalética direções, "
                 },
                 "tourism/information/map": {
                     "name": "Mapa",
-                    "terms": "Mapa"
+                    "terms": "Esquema, planta, carta"
                 },
                 "tourism/information/office": {
                     "name": "Posto de Turismo",
                 },
                 "tourism/motel": {
                     "name": "Motel",
-                    "terms": "Motel"
+                    "terms": "Albergaria "
                 },
                 "tourism/museum": {
                     "name": "Museu",
                 },
                 "tourism/viewpoint": {
                     "name": "Miradouro",
-                    "terms": "Viewpoint, Vista"
+                    "terms": "Vista, ponto de vista, mirante, paisagem,"
                 },
                 "tourism/wilderness_hut": {
                     "name": "Abrigo Remoto",
                     "terms": "Zoológico, Zoo, Zológico, Animais"
                 },
                 "traffic_calming": {
-                    "name": "Redutor de Velocidade",
-                    "terms": "reductor de velocidade, redução de velocidade, reducção de velocidade"
+                    "name": "Acalmia de tráfego",
+                    "terms": "redutor de velocidade, redução de velocidade, redução de velocidade, acalmia, baixa velocidade, diminuir velocidade,"
                 },
                 "traffic_calming/bump": {
                     "name": "Lomba pequena",
-                    "terms": "Speed Bump, Lombada, Policia Deitado, Lomba"
+                    "terms": "pequena lomba"
                 },
                 "traffic_calming/chicane": {
                     "name": "Gincana de Tráfego",
-                    "terms": "gincana"
+                    "terms": "gincana, medidas acalmia de tráfego, acalmia de tráfego"
                 },
                 "traffic_calming/choker": {
                     "name": "Estreitamento da Via",
-                    "terms": "choker, estreitamento"
+                    "terms": "estreita, estreitamento"
                 },
                 "traffic_calming/cushion": {
                     "name": "Lomba de Almofada",
                 },
                 "traffic_calming/hump": {
                     "name": "Lomba grande",
-                    "terms": "Speed Hump, Lomba"
+                    "terms": "Lomba, grande lomba"
                 },
                 "traffic_calming/island": {
                     "name": "Ilha Rodoviária",
                 },
                 "type/boundary": {
                     "name": "Fronteira",
-                    "terms": "Fronteira"
+                    "terms": "limite"
                 },
                 "type/boundary/administrative": {
                     "name": "Fronteira administrativa",
-                    "terms": "Fronteira Admistrativa"
+                    "terms": "Fronteira legal, limite país, fronteira, concelho, freguesia, distrito, limite administrativo, fronteira administrativa,"
                 },
                 "type/multipolygon": {
                     "name": "Multipolígono"
                 },
                 "type/restriction/no_left_turn": {
                     "name": "Proibição de virar à esquerda",
-                    "terms": "No Left Turn, Não Virar à Esquerda"
+                    "terms": "Não Virar à Esquerda"
                 },
                 "type/restriction/no_right_turn": {
                     "name": "Proibição de virar à direita",
-                    "terms": "No Right Turn, Não Virar à Direita"
+                    "terms": "Não Virar à Direita"
                 },
                 "type/restriction/no_straight_on": {
-                    "name": "Sentido proibido",
-                    "terms": "No Straight On, Proibido Seguir em Frente, Proibição de Seguir em Frente"
+                    "name": "Proibido seguir em frente",
+                    "terms": "Proibição de Seguir em Frente, Virar para a esquerda ou direita,"
                 },
                 "type/restriction/no_u_turn": {
-                    "name": "Proibição de inversão do sentido de marcha",
-                    "terms": "No U-turn, Não Inverter o Sentido"
+                    "name": "Proibição de inversão de marcha",
+                    "terms": "Não Inverter o Sentido, inversão de marcha proibida,  proibida a inversão de marcha, não fazer inversão de marcha"
                 },
                 "type/restriction/only_left_turn": {
                     "name": "Sentido obrigatório para a esquerda",
-                    "terms": "Left Turn Only, Proibido Virar para a Direita"
+                    "terms": "obrigatoriedade de virar à esquerda, virar para a esquerda,"
                 },
                 "type/restriction/only_right_turn": {
                     "name": "Sentido obrigatório para a direita",
-                    "terms": "Right Turn Only, Proibido Virar para a Esquerda"
+                    "terms": "obrigatoriedade de virar à direita, virar para a direita,"
                 },
                 "type/restriction/only_straight_on": {
                     "name": "Sentido obrigatório para a frente",
-                    "terms": "No Turns, Proibido Virar"
+                    "terms": "Proibido Virar, seguir em frente"
                 },
                 "type/route": {
                     "name": "Rota",
-                    "terms": "Rota, Linha"
+                    "terms": "Rota, Linha, circuito, percursos, percurso, circuitos"
                 },
                 "type/route/bicycle": {
                     "name": "Rota de bicicleta",
                 },
                 "type/route/foot": {
                     "name": "Rota pedestre",
-                    "terms": "Foot Route"
+                    "terms": "rota pedonal, percurso pedestre, percurso pedonal, circuito pedonal, "
                 },
                 "type/route/hiking": {
                     "name": "Rota de caminhada",
-                    "terms": "Hiking Route, Rota de Escalagem"
+                    "terms": "Hiking rota, hiking, trekking, Rota de caminhada, circuito pedestre, percurso recomendado, pequena rota, grande rota, rota levada, rota trail, percurso trail, percurso levada, "
                 },
                 "type/route/horse": {
                     "name": "Rota de equitação",
-                    "terms": "Riding Route"
+                    "terms": "Rota equestre, rota a cavalo,"
+                },
+                "type/route/light_rail": {
+                    "name": "Metro de superficie",
+                    "terms": "electrico, metro porto, metro almada,"
                 },
                 "type/route/pipeline": {
                     "name": "Rota de gasoduto / oleoduto",
-                    "terms": "Pipeline Route"
+                    "terms": "Rota de gasoduto"
+                },
+                "type/route/piste": {
+                    "name": "Rota de Esqui ou de outro desporto de inverno",
+                    "terms": "esqui, sky, rota sky, trilhos sky, rota esqui, trilhos esqui"
                 },
                 "type/route/power": {
                     "name": "Rota de transmissão de energia",
                     "name": "Rota rodoviária",
                     "terms": "Percurso Rodoviário, Trajecto Rodoviário"
                 },
+                "type/route/subway": {
+                    "name": "Rota de metro subterrâneo",
+                    "terms": "linha metro, rota metro, rede metro, metro de lisboa, estações de metro, linha do metro,"
+                },
                 "type/route/train": {
                     "name": "Rota ferroviária",
                     "terms": "Train Route, Rota de Comboio, Rota de Metro, Rota de Elétrico, Rota de Caminhos de Ferro"
                 },
                 "type/waterway": {
                     "name": "Curso de Água",
-                    "terms": "Hidrovia, Curso, Rio, Canal"
+                    "terms": "Hidrovia, Curso, Rio, Canal, levada, ribeiro, ribeira, córrego, área inundável, inundável, inundada, bacia, hidrologia, hídrica, "
                 },
                 "vertex": {
                     "name": "Outro",
-                    "terms": "Outro"
+                    "terms": "Outra opção, outra"
                 },
                 "waterway": {
                     "name": "Curso de água"
                 },
                 "waterway/boatyard": {
                     "name": "Estaleiro",
-                    "terms": "Boatyard, Barcos, Barco, Embarcações, Embarcação, Reparação, Construção"
+                    "terms": "Boatyard, Barcos, Barco, Embarcações, Embarcação, Reparação, Construção, varadouro, "
                 },
                 "waterway/canal": {
                     "name": "Canal",
                     "terms": "Drain"
                 },
                 "waterway/fuel": {
-                    "name": "Posto de combustível marinho",
-                    "terms": "Marine Fuel Station"
+                    "name": "Posto de combustível marítimo",
+                    "terms": "combustível para barcos, combustível marítimo, bomba de gasolina barcos, gasóleo embarcações, combustível embarcações, gasolineira barco,"
                 },
                 "waterway/river": {
                     "name": "Rio",
                     "terms": "Riverbank"
                 },
                 "waterway/sanitary_dump_station": {
-                    "name": "Escoamento sanitário marinho",
-                    "terms": "Marine Toilet Disposal"
+                    "name": "Escoamento sanitário para embarcações",
+                    "terms": "resíduos barcos, águas residuais embarcações, águas residuais barcos, escoamento águas residuais embarcações, escoamento águas residuais barcos, "
                 },
                 "waterway/stream": {
                     "name": "Ribeiro",
                     "terms": "Corga, Corgo, Córrego, Curso de Água, Fio de Água, Grota, Regato, Rego, Riacho, Riachinho, Ribeira, Ribeiro, intermitente, sazonal"
                 },
                 "waterway/water_point": {
-                    "name": "Água potável para veículos marinhos",
-                    "terms": "Marine Drinking Water"
+                    "name": "Água potável para embarcações",
+                    "terms": "água potável barcos, água embarcação, água potável marina,"
                 },
                 "waterway/waterfall": {
                     "name": "Queda de Água",
                     "text": "Termos e Opinião"
                 },
                 "description": "Limites das imagens e datas de captura. As etiquetas aparecem no nível de aproximação 14 ou superior.",
-                "name": "DigitalGlobe Premium Vintage"
+                "name": "Imagens DigitalGlobe Premium antigas"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Termos e Opinião"
                 },
                 "description": "Limites das imagens e datas de captura. As etiquetas aparecem no nível de aproximação 14 ou superior.",
-                "name": "DigitalGlobe Standard Vintage"
+                "name": "Imagens DigitalGlobe Standard antigaas"
             },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "Termos e Opinião"
                 },
                 "description": "Imagens aéreas Esri.",
-                "name": "Esri"
+                "name": "Imagens globais da Esri"
             },
             "MAPNIK": {
                 "attribution": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, contribuidores OpenStreetMap, CC-BY-SA"
                 },
-                "name": "Inspector OSM: Moradas"
+                "name": "Inspector OSM: Endereços"
             },
             "OSM_Inspector-Geometry": {
                 "attribution": {
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, conteúdo do mapa contribuidores OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, contribuidores OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Ciclismo"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, conteúdo do mapa contribuidores OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, contribuidores OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Pedestrianismo"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, conteúdo do mapa contribuidores OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, contribuidores OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Ciclismo de montanha"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, conteúdo do mapa contribuidores OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, contribuidores OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Skate"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, conteúdo do mapa contribuidores OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, contribuidores OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Waymarked Trails: Desportos de Inverno"
             },
                 "attribution": {
                     "text": "basemap.at"
                 },
-                "description": "Ortofotomapa fornecido por basemap.at. Sucessor de geoimage.at imagery.",
+                "description": "Ortofotomapa fornecido por basemap.at. Sucessor de imagens da geoimage.at .",
                 "name": "Ortofotomapa geoimage.at"
             },
             "hike_n_bike": {
                 "attribution": {
                     "text": "© contribuidores OpenStreetMap"
                 },
-                "description": "Registos de GPS públicos enviados para o OpenStreetMap.",
-                "name": "Trilhos GPS do OpenStreetMap"
+                "description": "Registos de rastos de GPS públicos enviados para o OpenStreetMap.",
+                "name": "Rastos GPS do OpenStreetMap"
             },
             "osm-mapnik-black_and_white": {
                 "attribution": {
index d71b0735c2da5c307709e4c0a39b9157f799436f..e1db10896d1965aff907ecda4d50b03492522ada 100644 (file)
             "warnings": "Atenționări",
             "modified": "Modificat",
             "deleted": "Șters",
-            "created": "Creat",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "created": "Creat"
         },
         "contributors": {
             "list": "Editări făcute de {user}",
                 "title": "Măsurare",
                 "selected": "{n} selectate",
                 "geometry": "Geometrie",
-                "closed": "închis",
                 "center": "Centru",
                 "perimeter": "Perimetru",
                 "length": "Lungime",
             "title": "Fundal",
             "description": "Setări fundal",
             "key": "B",
-            "percent_brightness": "{opacity}% luminozitate",
             "none": "Niciunul",
             "best_imagery": "Cea mai cunoscută sursă de imagine pentru această locație",
             "switch": "Schimbă înapoi la acest fundal",
             "custom": "Personalizat",
             "custom_button": "Editează fundalul customizat",
-            "fix_misalignment": "Ajustează ofset de imagine",
-            "imagery_source_faq": "De unde vine imaginea?",
             "reset": "resetează",
             "minimap": {
-                "description": "Minimap",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Ajustează ofset de imagine"
         },
         "map_data": {
             "title": "Date de Hartă",
                     "label": "Capacitate",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Direcție",
-                    "options": {
-                        "E": "Est",
-                        "ENE": "Est-nordest",
-                        "ESE": "Est-sudest",
-                        "N": "Nord",
-                        "NE": "Nordest",
-                        "NNE": "Nord-nordest",
-                        "NNW": "Nord-nordvest",
-                        "NW": "Nordvest",
-                        "S": "Sud",
-                        "SE": "Sudest",
-                        "SSE": "Sud-sudest",
-                        "SSW": "Sud-sudvest",
-                        "SW": "Sudvest",
-                        "W": "Vest",
-                        "WNW": "Vest-nordvest",
-                        "WSW": "Vest-sudvest"
-                    }
-                },
                 "castle_type": {
                     "label": "Tip"
                 },
-                "clock_direction": {
-                    "label": "Direcție",
-                    "options": {
-                        "anticlockwise": "În contra direcției ceasornicului",
-                        "clockwise": "În direcția ceasornicului"
-                    }
-                },
                 "clothes": {
                     "label": "Haine"
                 },
                 "par": {
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Direcție",
-                    "options": {
-                        "backward": "Înapoi",
-                        "forward": "Înainte"
-                    }
-                },
                 "parking": {
                     "label": "Tip"
                 },
                 "railway": {
                     "label": "Tip"
                 },
-                "recycling_type": {
-                    "options": {
-                        "container": "Container"
-                    }
-                },
                 "ref_aeroway_gate": {
                     "label": "Număr de Poartă"
                 },
                 "aerialway/rope_tow": {
                     "terms": "<translate with synonyms or related terms for 'Rope Tow Lift', separated by commas>"
                 },
-                "aerialway/station": {
-                    "terms": "<translate with synonyms or related terms for 'Aerialway Station', separated by commas>"
-                },
                 "aerialway/t-bar": {
                     "terms": "<translate with synonyms or related terms for 'T-bar Lift', separated by commas>"
                 },
                     "name": "Schimbare Valută",
                     "terms": "<translate with synonyms or related terms for 'Currency Exchange', separated by commas>"
                 },
-                "amenity/bus_station": {
-                    "name": "Stație de autobuz",
-                    "terms": "<translate with synonyms or related terms for 'Bus Station', separated by commas>"
-                },
                 "amenity/cafe": {
                     "name": "Cafenea",
                     "terms": "<translate with synonyms or related terms for 'Cafe', separated by commas>"
                     "name": "Fast Food",
                     "terms": "<translate with synonyms or related terms for 'Fast Food', separated by commas>"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Terminal de Bac",
-                    "terms": "<translate with synonyms or related terms for 'Ferry Terminal', separated by commas>"
-                },
                 "amenity/fire_station": {
                     "name": "Pompieri",
                     "terms": "<translate with synonyms or related terms for 'Fire Station', separated by commas>"
                 "amenity/ranger_station": {
                     "terms": "<translate with synonyms or related terms for 'Ranger Station', separated by commas>"
                 },
-                "amenity/recycling": {
-                    "name": "Reciclare",
-                    "terms": "<translate with synonyms or related terms for 'Recycling', separated by commas>"
-                },
                 "amenity/recycling_centre": {
                     "name": "Centru de Reciclare",
                     "terms": "<translate with synonyms or related terms for 'Recycling Center', separated by commas>"
                 "highway/bridleway": {
                     "terms": "<translate with synonyms or related terms for 'Bridle Path', separated by commas>"
                 },
-                "highway/bus_stop": {
-                    "name": "Stație de autobuz",
-                    "terms": "<translate with synonyms or related terms for 'Bus Stop', separated by commas>"
-                },
                 "highway/corridor": {
                     "name": "Coridor Interior",
                     "terms": "<translate with synonyms or related terms for 'Indoor Corridor', separated by commas>"
                     "name": "Pădure",
                     "terms": "<translate with synonyms or related terms for 'Forest', separated by commas>"
                 },
-                "landuse/garages": {
-                    "name": "Garaje",
-                    "terms": "<translate with synonyms or related terms for 'Garages', separated by commas>"
-                },
                 "landuse/grass": {
                     "name": "Iarbă",
                     "terms": "<translate with synonyms or related terms for 'Grass', separated by commas>"
                     "terms": "<translate with synonyms or related terms for 'Office', separated by commas>"
                 },
                 "office/administrative": {
-                    "name": "Oficiu Administrativ",
-                    "terms": "<translate with synonyms or related terms for 'Administrative Office', separated by commas>"
-                },
-                "office/company": {
-                    "name": "Oficiu de Companie",
-                    "terms": "<translate with synonyms or related terms for 'Company Office', separated by commas>"
+                    "name": "Oficiu Administrativ"
                 },
                 "office/coworking": {
                     "terms": "<translate with synonyms or related terms for 'Coworking Space', separated by commas>"
                     "terms": "<translate with synonyms or related terms for 'Law Office', separated by commas>"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notar",
-                    "terms": "<translate with synonyms or related terms for 'Notary Office', separated by commas>"
+                    "name": "Notar"
                 },
                 "office/ngo": {
                     "name": "Oficiu NGO",
                     "name": "Transformator",
                     "terms": "<translate with synonyms or related terms for 'Transformer', separated by commas>"
                 },
-                "public_transport/platform": {
-                    "name": "Platformă",
-                    "terms": "<translate with synonyms or related terms for 'Platform', separated by commas>"
-                },
-                "public_transport/stop_position": {
-                    "name": "Poziție Stop",
-                    "terms": "<translate with synonyms or related terms for 'Stop Position', separated by commas>"
-                },
                 "railway": {
                     "name": "Cale Ferată"
                 },
                     "name": "Frânghie",
                     "terms": "<translate with synonyms or related terms for 'Funicular', separated by commas>"
                 },
-                "railway/halt": {
-                    "name": "Stație de Cale Ferată",
-                    "terms": "<translate with synonyms or related terms for 'Railway Halt', separated by commas>"
-                },
                 "railway/level_crossing": {
                     "name": "Traversare de Cale Ferată (Stradă)",
                     "terms": "<translate with synonyms or related terms for 'Railway Crossing (Road)', separated by commas>"
                     "name": "Cale Ferată Îngustă",
                     "terms": "<translate with synonyms or related terms for 'Narrow Gauge Rail', separated by commas>"
                 },
-                "railway/platform": {
-                    "name": "Platformă de Cale Ferată",
-                    "terms": "<translate with synonyms or related terms for 'Railway Platform', separated by commas>"
-                },
                 "railway/rail": {
                     "name": "Șină",
                     "terms": "<translate with synonyms or related terms for 'Rail', separated by commas>"
                 },
-                "railway/station": {
-                    "name": "Stație de Cale Ferată",
-                    "terms": "<translate with synonyms or related terms for 'Railway Station', separated by commas>"
-                },
                 "railway/subway": {
                     "name": "Metrou",
                     "terms": "<translate with synonyms or related terms for 'Subway', separated by commas>"
                     "name": "Tranvai",
                     "terms": "<translate with synonyms or related terms for 'Tram', separated by commas>"
                 },
-                "railway/tram_stop": {
-                    "name": "Oprire de Tranvai",
-                    "terms": "<translate with synonyms or related terms for 'Tram Stop', separated by commas>"
-                },
                 "relation": {
                     "name": "Relație",
                     "terms": "<translate with synonyms or related terms for 'Relation', separated by commas>"
                     "name": "Giuvaer",
                     "terms": "<translate with synonyms or related terms for 'Jeweler', separated by commas>"
                 },
-                "shop/kiosk": {
-                    "name": "Chioșc de Ziare",
-                    "terms": "<translate with synonyms or related terms for 'News Kiosk', separated by commas>"
-                },
                 "shop/kitchen": {
                     "name": "Magazin de Bucătărie",
                     "terms": "<translate with synonyms or related terms for 'Kitchen Design Store', separated by commas>"
                 "name": "Inspector OSM: Adăugare de taguri"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, date de hartă contribuitori OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Trasee Marcate: Bicicletă"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, date de hartă contribuitori OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Trasee Marcate: Drumeție"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, date de hartă contribuitori OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Trasee Marcate: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, date de hartă contribuitori OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Trasee Marcate: Skating"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, date de hartă contribuitori OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Trasee Marcate: Sporturi de iarnă"
             },
             "basemap.at": {
index a165ccf71d363732a38526f85808f0368c663782..2817a419b9b74189b59a55f08863b3a82a09b60e 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Щёлкните по линии, чтобы добавить в неё точки. Щелчок по другой линии соединит их, а двойной щелчок завершит рисование."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Невозможно отредактировать, имеется соединение со скрытым объектом."
             }
         },
         "operations": {
             "localized_translation_language": "Выберите язык",
             "localized_translation_name": "Название"
         },
+        "zoom_in_edit": "Приблизьте для редактирования",
         "login": "войти",
         "logout": "выйти",
         "loading_auth": "Подключение к OpenStreetMap…",
             "about_changeset_comments": "О комментариях к пакетам правок",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/RU:Good_changeset_comments",
             "google_warning": "Вы упомянули Google в этом комментарии. Не забывайте, что копирование из Google Карт строго запрещено.",
-            "google_warning_link": "https://www.openstreetmap.org/copyright/ru"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Отредактировано {users}",
                 "title": "Измерение",
                 "selected": "выбрано {n}",
                 "geometry": "Геометрия",
-                "closed": "закрыто",
                 "center": "Центр",
                 "perimeter": "Периметр",
                 "length": "Длина",
             "title": "Слой",
             "description": "Настройка слоёв",
             "key": "B",
-            "percent_brightness": "яркость {opacity}%",
             "none": "Отключить",
             "best_imagery": "Наилучший источник космоснимков из известных для этой территории",
             "switch": "Переключить обратно на эту подложку",
             "custom": "Настраиваемый",
             "custom_button": "Указать собственный слой",
-            "custom_prompt": "Введите URL шаблона плитки. Допустимые токены:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {ty} для перевернутых Y координат в стиле TMS\n   - {u} для схемы quadtile\n   - {switch:a,b,c} для мультиплексирования DNS-серверов\n\nПример:\n{example}",
-            "fix_misalignment": "Установка смещения слоя",
-            "imagery_source_faq": "Кто предоставляет этот космоснимок?",
             "reset": "сброс",
-            "offset": "Перетащите серую область ниже, чтобы отрегулировать смещение слоя, или введите значения смещения в метрах.",
+            "display_options": "Настройки отображения",
+            "contrast": "Контраст",
             "minimap": {
-                "description": "Мини-карта",
                 "tooltip": "Показать уменьшенную карту, чтобы помочь найти отображаемую в данный момент область.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Установка смещения слоя",
+            "offset": "Перетащите серую область ниже, чтобы отрегулировать смещение слоя, или введите значения смещения в метрах."
         },
         "map_data": {
             "title": "Данные карты",
             "untagged_area_tooltip": "Выберите тип объекта, который описывает, чем является эта область.",
             "untagged_relation": "Отношение без тегов",
             "untagged_relation_tooltip": "Выберите тип объекта, который описывает, чем является это отношение.",
-            "many_deletions": "Вы удаляете {n} объектов. В результате они пропадут с карты, которую весь мир может видеть на openstreetmap.org. Уверены в своём решении?",
             "tag_suggests_area": "Тег {tag} обычно ставится на полигоны, но это не полигон",
             "deprecated_tags": "Теги устарели: {tags}"
         },
         "help": {
             "title": "Справка",
             "key": "H",
-            "help": "# Справка\n\nЭто редактор [OpenStreetMap](http://www.openstreetmap.org/): общедоступной,\nсвободноредактируемой карты мира. Вы можете использовать этот редактор для добавления\nи обновления карты вашей местности, улучшая открытую и свободную карту мира и помогая, таким образом, всем.\n\nВаши правки увидит каждый пользователь карты OpenStreetMap. Для\nредактирования вам потребуется [войти в OpenStreetMap](https://www.openstreetmap.org/login).\n\n[Редактор iD](http://ideditor.com/) — открытый совместный проект\nс [исходным кодом на GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Редактирование и сохранение\n\nЭтот редактор создан в основном для онлайн-редактирования, и\nсейчас вы работаете с ним именно через сайт.\n\n### Выбор объектов\n\nЧтобы выбрать объект карты, например дорогу или точку\nинтереса, щёлкните по нему на карте. Выбранный объект будет\nпомечен выделением, откроется панель его свойств, а рядом с ним\nпоявится меню с действиями, которые вы можете над ним совершить.\n\nМожно выделить несколько объектов сразу, удерживая при щелчке\nклавишу Shift, или растягивая рамку выделения с нажатой кнопкой\nмыши. При этом, все точки внутри рамки будут выделены.\n\n### Сохранение правок\n\nКогда вы редактируете карту, например изменяете дороги, здания и\nместа, эти изменения хранятся на вашем компьютере, пока вы не\nсохраните их на сервере. Не бойтесь ошибиться — изменения\nможно откатить кнопкой «Отмена», а также снова повторить их\nкнопкой «Повтор».\n\nНажмите «Сохранить» для сохранения группы изменений — например,\nвы закончили редактировать один район города и хотите продолжить\nс другим. У вас будет возможность просмотреть ваши изменения, а\nредактор покажет предложения и предупреждения, если\nв изменённых данных что-то не так.\n\nЕсли всё верно, введите краткое описание ваших изменений и ещё\nраз нажмите «Сохранить» для отправки данных на [OpenStreetMap.org](http://www.openstreetmap.org/),\nгде они станут видны другим участникам для просмотра и\nдальнейшего улучшения карты.\n\nЕсли у вас не получается закончить с правками за один раз,\nокно редактора можно закрыть, и тогда при следующем запуске\nредактора (на том же компьютере и в том же браузере) программа\nпредложит восстановить вашу работу.\n\n### Использование редактора\n\nСписок доступных горячих клавиш можно получить нажатием `?`.\n",
-            "roads": "# Дороги\n\nВ этом редакторе вы можете создавать, изменять и удалять дороги.\nДороги бывают самых разных типов: тропы, шоссе, грунтовки, велодорожки\nи другие — любой участок местности, по которому есть какое-либо движение.\n\n### Выбор\n\nЩёлкните по дороге, чтобы выбрать её. Дорога подсветится контуром выделения,\nслева появится редактор свойств дороги. Щелчок правой кнопкой мыши на\nлинии дороги покажет меню действий.\n\n### Изменение\n\nИногда вам могут встретиться дороги, не совпадающие со слоем снимка или\nGPS-трека. Такие дороги можно отредактировать.\n\nЩёлкните по дороге, которую надо изменить. Линия дороги подсветится, и\nна ней появятся контрольные точки, которые можно перетащить на правильные\nместа. Если вы захотите сделать дорогу более детализированной, дважды\nщёлкните по линии для добавления в этом месте новой контрольной точки.\n\nЕсли в реальности дороги соединяются на перекрестке, а на карте не\nсоединены — перетащите одну из контрольных точек дороги на линию другой.\nПравильное соединение дорог очень важно для карты и навигаторов,\nпрокладывающих по ним маршрут.\n\nЧтобы передвинуть линию дороги целиком, выберите инструмент «Перемещение»\nили нажмите клавишу «M». Повторный щелчок мышью зафиксирует дорогу\nна новом месте.\n\n### Удаление\n\nЕсли дорога нарисована совсем неправильно — её не видно на спутниковом снимке,\nа в идеальном случае вы были сами на месте и убедились в её отсутствии — вы\nможете удалить дорогу с карты. Будьте очень осторожны, удаляя что-либо: как и\nдругие ваши правки, это затрагивает всех пользователей карты. Спутниковые снимки\nчасто бывают устаревшими, так что дорога может быть просто построена недавно.\n\nЧтобы удалить дорогу, выберите её щелчком мыши, затем щелкните\nпо значку мусорного ведра или нажмите клавишу Delete.\n\n### Создание\n\nНашли место, где в действительности есть дорога, а на карте её нет?\nНажмите кнопку «Линия» слева вверху окна редактора или клавишу `2`,\nчтобы начать рисовать линию.\n\nЩёлкните на карте в месте, где должна начинаться дорога. Если она ответвляется\nот уже нарисованной, можно начать рисование щелчком мыши в месте\nих пересечения.\n\nЗатем щёлкайте на карте вдоль траектории дороги согласно спутниковому снимку\nили GPS-треку. Если новая дорога пересекается с другой, обязательно щёлкните\nпо уже существующей, чтобы создать точку перекрёстка.\nЧтобы закончить рисование, сделайте двойной щелчок мышью или\nнажмите Enter на клавиатуре.\n",
-            "gps": "# GPS\n\nДанные GPS — наиболее достоверный источник данных для OpenStreetMap. Этот редактор\nподдерживает загрузку локальных файлов треков в формате .gpx с вашего компьютера.\nВы можете записывать такие треки с помощью приложений для смартфонов и GPS-устройств.\n\nБолее подробно о сборе данных GPS можно прочесть\nна странице [Mapping with a Smartphone, GPS or Paper](http://learnosm.org/en/mobile-mapping/).\n\nЧтобы воспользоваться GPX-треками при рисовании карты,\nперетащите файл трека прямо в окно редактора. Если трек\nуспешно загрузится, то он отобразится на карте в виде светло-фиолетовой\nлинии. В меню «Данные карты» можно выключить, включить или\nмасштабировать слой с треками.\n\nТрек при этом не будет загружен в базу OpenStreetMap, лучший\nспособ его использования — нарисовать новые объекты карты,\nосновываясь на данных трека; вы также можете [загрузить его на\nOpenStreetMap](http://www.openstreetmap.org/trace/create), чтобы\nим смогли воспользоваться другие.\n",
-            "imagery": "# Спутниковые снимки\n\nСнимки земной поверхности с воздуха — важный источник данных для картирования. В меню «Настройка слоёв» с левой стороны окна редактора доступно подключение слоёв спутниковых снимков, аэрофотосъёмки и других открытых источников изображений.\n\nПо умолчанию в редакторе подключён слой спутниковых снимков  [Bing Maps](http://www.bing.com/maps/), но в разных местах земного шара могут быть доступны и другие источники слоёв. Для ряда районов некоторых стран, к примеру США, Франции и Дании, доступны изображения очень высокого качества.\n\nИногда спутниковые снимки сдвинуты относительно данных карты по вине поставщика снимков. Если вы видите множество дорог, не совпадающих со снимком, не начинайте передвигать их под снимок. Вместо этого нужно сдвинуть снимок для совпадения с существующими данными — для этого в меню «Настройка слоёв» есть кнопка «Исправить смещение».\n",
-            "addresses": "# Адреса\n\nАдреса — одна из самых важных составляющих карты.\n\nВ OpenStreetMap адреса хранятся в свойствах зданий и мест, расположенных вдоль улиц.\n\nАдресную информацию можно добавлять к полигонам зданий, а также к отдельным точкам. Лучший источник адресов — ваши собственные знания или данные, полученные после обхода местности. Как и в случае с другими данными, копирование адресов из коммерческих источников вроде Yandex, 2GIS, Google строго запрещено.\n",
-            "inspector": "# Использование редактора свойств\n\nРедактор свойств — это элемент интерфейса программы,\nнаходящийся в левой части окна, который позволяет отредактировать\nсвойства выбранного объекта.\n\n### Выбор типа объекта\n\nПосле того как вы добавили точку, линию или область, вы можете\nвыбрать, какой именно это тип объекта: шоссе, обычная дорога,\nсупермаркет или кафе. Редактор свойств показывает кнопки для\nвыбора наиболее часто используемых типов объектов, и можно\nвоспользоваться строкой поиска, чтобы найти другие типы.\n\nЩёлкните по значку «i» в нижнем правом углу кнопки типа\nобъекта, чтобы узнать о нём больше. Щёлкните по самой кнопке,\nчтобы выбрать этот тип.\n\n### Использование полей и редактирование тегов\n\nПосле того как вы выберете тип объекта или выделите объект, у\nкоторого тип уже проставлен, редактор свойств покажет поля\nописывающие его свойства, например название или адрес.\n\nНиже этих полей находится выпадающий список «Добавить поле»,\nс помощью которого можно добавить дополнительные свойства,\nнапример ссылку на статью в Википедии, информацию о\nдоступности для инвалидов и др.\n\nВ самом низу окна редактора свойств находится кнопка\n«Дополнительные теги», позволяющая добавить объекту произвольные\nтеги. О наиболее популярных комбинациях тегов можно узнать на странице [Taginfo](http://taginfo.openstreetmap.org/).\n\nИзменения в редакторе свойств применяются к объекту\nавтоматически. Как и другие изменения, их можно откатить кнопкой «Отмена».\n",
-            "buildings": "# Здания\n\nOpenStreetMap — крупнейшая в мире база данных о зданиях. Вы можете добавлять и изменять эти данные.\n\n### Выбор\n\nЧтобы выбрать здание, нужно щёлкнуть по его полигону. При этом здание\nбудет подсвечено, слева откроется редактор его свойств.\nЩелчок правой кнопкой мыши на линии полигона здания покажет меню действий.\n\n### Редактирование\n\nИногда здания неправильно размещены или имеют неверные свойства.\n\nЧтобы переместить здание целиком, выберите его и нажмите клавишу 'M'\nили щёлкните на инструменте «Перемещение» в меню действий.\nПеретащите здание мышью в нужное место и щёлкните, чтобы зафиксировать\nего на новом месте.\n\nЧтобы изменить форму здания, перетаскивайте точки его полигона на нужные места.\n\n### Создание\n\nОдно из основных противоречий в добавлении новых зданий\nв OpenStreetMap заключается в том, что их можно задавать как\nполигонами, так и точками. Стоит взять за правило такой подход:\nсамо здание по возможности рисуется полигоном, а находящиеся\nв этом здании компании, магазины и другие подобные объекты,\nпривязанные к зданиям, рисуются точками, находящимися внутри\nполигона здания.\n\nНарисуйте полигон здания с помощью кнопки «Область», находящейся\nслева вверху окна, затем закончите рисование либо нажатием клавиши\nEnter на клавиатуре, либо щёлкнув мышью на первой нарисованной\nточке здания.\n\n### Удаление\n\nЕсли здание нарисовано совсем неправильно — его нет на спутниковом\nснимке или вы лично, на месте убедились, что оно отсутствует — вы\nможете удалить его с карты. Будьте очень осторожны при удалении\nобъектов: ваши правки затрагивают всех пользователей OSM, а\nснимки часто бывают устаревшими. Возможно,\nэто здание построили недавно.\n\nЧтобы удалить здание, выделите его щелчком мыши, а затем нажмите на значок мусорного ведра в меню действий или клавишу Delete.\n",
-            "relations": "# Отношения\n\nОтношение — это специальный тип объекта в OpenStreetMap,\nкоторый объединяет другие объекты вместе. Например,\nдва распространённых типа отношений — *отношения маршрутов*, которые\nобъединяют вместе участки дорог, принадлежащих одной автостраде или шоссе,\nи *мультиполигоны*, которые группируют несколько линий в сложный полигон,\nописывающий область (например из нескольких островов или с дырами внутри).\n\nОбъекты, объединённые в отношение, называются участниками отношения.\nНа боковой панели вы можете увидеть, участником каких отношений является\nвыбранный объект; нажмите на отношение в этом списке,\nчтобы выделить его. Когда отношение выделено, вы можете увидеть всех\nего участников в списке на боковой панели и подсвеченными на карте.\n\nВ основном, редактор iD заботится о поддержке отношений сам,\nпока вы редактируете. Основной момент, на который стоит обратить внимание:\nесли вы удаляете отрезок дороги, чтобы перерисовать его с\nбольшей точностью, следует убедиться, что новый отрезок будет участником\nтех же отношений, что и начальный.\n\n## Редактирование отношений\n\nВот некоторые основы, если вы хотите редактировать отношения.\n\nЧтобы добавить объект в отношение, выделите объект, нажмите кнопку «+»\nв разделе «Все отношения» на боковой панели и выберите или напечатайте\nназвание отношения.\n\nЧтобы создать новое отношение, выберите первый объект, который будет\nучастником отношения, нажмите кнопку «+» в разделе «Все отношения» и\nвыберите «Новое отношение…».\n\nЧтобы удалить объект из отношения, выберите объект и нажмите кнопку\nс мусорной корзиной рядом с отношением, из которого вы хотите его удалить.\n\nИспользуя инструмент «Объединить», можно создать мультиполигон с отверстиями.\nНарисуйте две границы (внутреннюю и внешнюю) и, удерживая клавишу\nShift, щёлкните по каждой, чтобы они обе были выделены, после чего нажмите\nкнопку «Объединить эти линии» (+).\n"
+            "help": {
+                "title": "Справка"
+            }
         },
         "intro": {
             "done": "выполнено",
             },
             "areas": {
                 "title": "Области",
-                "add_playground": "*Области* используются для обозначения таких объектов, как реки, здания и жилые сектора.{br}Их также можно применять для более детального отображения объектов, которые обычно указываются точками. **Нажмите кнопку полигона {button} для создания новой области.**",
                 "start_playground": "Давайте добавим игровую площадку на карту в виде области. Область рисуется размещением точек по периметру объекта. **Щелкните мышью или нажмите пробел для размещения первой точки на одном из углов площадки.**",
                 "continue_playground": "Продолжайте обводить область, размещая узлы вдоль краёв детской площадки. Будет отлично, если вы присоедините область к уже нарисованным дорожкам.{br}Совет: вы можете держать клавишу '{alt}', чтобы предотвратить привязку к другим элементам. **Продолжайте обводить область детской площадки.**",
                 "finish_playground": "Завершите обводку, нажав enter или щёлкнув на первом или последнем узле. **Завершите обводку области детской площадки.**",
                 "continue_tank": "Добавьте еще несколько точек на контуре. Нарисованные точки образуют круглую область.{br}Нажмите Enter или щёлкните ещё раз на первой или последней точке, чтобы закончить рисование. **Завершите обведение резервуара.**",
                 "search_tank": "**Искать '{preset}'.**",
                 "choose_tank": "**Выберите {preset} из списка**",
+                "rightclick_tank": "**Нажмите правой кнопкой мыши на добавленном резервуаре, чтобы перейти к меню редактирования объекта.**",
                 "circle_tank": "**Нажмите кнопку {button}, чтобы сделать резервуар круглым.**",
                 "retry_circle": "Вы не щелкнули кнопку «Скруглить». Попробуйте снова.",
                 "play": "Замечательно! Потренируйтесь обводить ещё несколько зданий, и попробуйте другие команды в меню редактирования. **Нажмите '{next}' когда будете готовы перейти к следующей главе.**"
                     "label": "Тип"
                 },
                 "cables": {
+                    "label": "Кабели",
                     "placeholder": "1, 2, 3…"
                 },
                 "camera/direction": {
                     "label": "Вместимость",
                     "placeholder": "50, 100, 200…"
                 },
-                "cardinal_direction": {
-                    "label": "Направление",
-                    "options": {
-                        "E": "Восток",
-                        "ENE": "Восток-северо-восток",
-                        "ESE": "Восток-юго-восток",
-                        "N": "Север",
-                        "NE": "Северо-восток",
-                        "NNE": "Северо-северо-восток",
-                        "NNW": "Северо-северо-запад",
-                        "NW": "Северо-запад",
-                        "S": "Юг",
-                        "SE": "Юго-восток",
-                        "SSE": "Юго-юго-восток",
-                        "SSW": "Юго-юго-запад",
-                        "SW": "Юго-запад",
-                        "W": "Запад",
-                        "WNW": "Запад-северо-запад",
-                        "WSW": "Запад-юго-запад"
-                    }
-                },
                 "castle_type": {
                     "label": "Тип"
                 },
-                "clock_direction": {
-                    "label": "Направление",
-                    "options": {
-                        "anticlockwise": "Против часовой стрелки",
-                        "clockwise": "По часовой стрелке"
-                    }
-                },
                 "clothes": {
                     "label": "Одежда"
                 },
                     "label": "Надпись"
                 },
                 "intermittent": {
-                    "label": "Прерывистый"
+                    "label": "Пересыхающий"
                 },
                 "internet_access": {
                     "label": "Доступ в Интернет",
                 "memorial": {
                     "label": "Тип памятника"
                 },
-                "milestone_position": {
-                    "label": "Положение километрового столба",
-                    "placeholder": "Расстояние с точностью до одного знака (123.4)"
-                },
                 "mtb/scale": {
                     "label": "Сложность трассы для горного велосипеда",
                     "options": {
                     "label": "Паровое поле",
                     "placeholder": "3, 4, 5…"
                 },
-                "parallel_direction": {
-                    "label": "Направление",
-                    "options": {
-                        "backward": "Обратное",
-                        "forward": "Прямое"
-                    }
-                },
                 "park_ride": {
                     "label": "Перехватывающая парковка"
                 },
                     "label": "Выходная электрическая мощность",
                     "placeholder": "500 МВт, 1000 МВт, 2000 МВт ..."
                 },
+                "playground/max_age": {
+                    "label": "Максимальный возраст"
+                },
+                "playground/min_age": {
+                    "label": "Минимальный возраст"
+                },
                 "population": {
                     "label": "Население"
                 },
                 "recycling_accepts": {
                     "label": "Принимает"
                 },
-                "recycling_type": {
-                    "label": "Тип приёма отходов на переработку",
-                    "options": {
-                        "centre": "Пункт приёма отходов для переработки",
-                        "container": "Контейнер для приема отходов на переработку"
-                    }
-                },
                 "ref_aeroway_gate": {
                     "label": "Номер ворот"
                 },
                     "label": "Тип подъездной дороги",
                     "options": {
                         "crossover": "Стрелочный съезд",
-                        "siding": "Ð\97апаÑ\81ной путь",
-                        "spur": "Ð\9eÑ\82веÑ\82вление Ð¿Ñ\83Ñ\82и",
+                        "siding": "Ð\91оковой путь",
+                        "spur": "Ð\9fодÑ\8aездной Ð¿Ñ\83Ñ\82Ñ\8c",
                         "yard": "Ж/Д пути на сортировочной станции"
                     }
                 },
                 "switch": {
                     "label": "Тип",
                     "options": {
+                        "circuit_breaker": "Автоматический выключатель",
+                        "disconnector": "Разъединитель",
                         "earthing": "Заземление"
                     }
                 },
                     "terms": "бугельный подъёмник"
                 },
                 "aerialway/station": {
-                    "name": "Терминал канатной дороги",
-                    "terms": "канат, дорога, станция, транспорт, общественный"
+                    "name": "Терминал канатной дороги"
                 },
                 "aerialway/t-bar": {
                     "name": "Анкерный подъёмник",
                     "name": "Пункт обмена валюты",
                     "terms": "валюта, обмен, деньги, курс, банк, пункт, доллар, евро, рубль, меняла. кантор"
                 },
-                "amenity/bus_station": {
-                    "name": "Автобусная станция (вокзал)",
-                    "terms": "автобусная станция, автовокзал, вокзал"
-                },
                 "amenity/cafe": {
                     "name": "Кафе",
                     "terms": "Кафе"
                     "name": "Фаст-фуд",
                     "terms": "фастфуд, фаст-фуд, быстрое питание, ресторан быстрого питания, столовая"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Паромный терминал",
-                    "terms": "паром, пристань"
-                },
                 "amenity/fire_station": {
                     "name": "Пожарная часть",
                     "terms": "Пожарное депо, Пожарная станция, Пожарная часть"
                     "name": "Стоянка для мотоциклов",
                     "terms": "мотопарковка, мотопаркинг, парковка для мотоциклов, паркинг для мотоциклов, мотостоянка"
                 },
+                "amenity/music_school": {
+                    "name": "Музыкальная школа",
+                    "terms": "Музыкальная школа, школа музыки"
+                },
                 "amenity/nightclub": {
                     "name": "Ночной клуб",
                     "terms": "дискотека, клубешник, гадюшник, клуб"
                     "name": "Лесничество",
                     "terms": "лес, лесник, лесничество"
                 },
-                "amenity/recycling": {
-                    "name": "Приём на переработку мусора",
-                    "terms": "Переработка мусора, Мусоропереработка, Утилизация мусора, Переработка отходов, Утилизация отходов, вторсырье, вторичное сырье"
-                },
                 "amenity/recycling_centre": {
                     "name": "Пункт приёма отходов для переработки",
                     "terms": "пункт приёма вторсырья, переработка, вторичное сырьё"
                     "terms": "вход, выход"
                 },
                 "footway/crossing": {
-                    "name": "Ð\9fеÑ\88еÑ\85однÑ\8bй Ð¿ÐµÑ\80еÑ\85од",
+                    "name": "Ð\9fеÑ\80еÑ\81еÑ\87ение Ñ\83лиÑ\86",
                     "terms": "перекресток, переезд, пересечение, скрещение"
                 },
                 "footway/crosswalk": {
                     "name": "Конная тропа",
                     "terms": "Конная тропа, Дорога для верховой езды, Дорога для конной езды"
                 },
-                "highway/bus_stop": {
-                    "name": "Автобусная остановка",
-                    "terms": "остановка, остановка общественного транспорта, автобусная остановка"
-                },
                 "highway/corridor": {
                     "name": "Внутренний коридор",
                     "terms": "проход, коридор"
                 },
                 "highway/crossing": {
-                    "name": "Ð\9fеÑ\88еÑ\85однÑ\8bй Ð¿ÐµÑ\80еÑ\85од",
+                    "name": "Ð\9fеÑ\80еÑ\81еÑ\87ение Ñ\83лиÑ\86",
                     "terms": "перекресток, переезд, пересечение, скрещение"
                 },
                 "highway/crosswalk": {
-                    "name": "Пешеходный переход (зебра)",
+                    "name": "Пешеходный переход",
                     "terms": "переход, пешеходный переход, зебра, светофор"
                 },
                 "highway/cycleway": {
                     "name": "Знак \"Уступи дорогу\""
                 },
                 "highway/living_street": {
-                    "name": "Ð\96илаÑ\8f Ñ\83лиÑ\86а (Ñ\82олÑ\8cко Ñ\81о Ð·Ð½Ð°ÐºÐ¾Ð¼ 5.21 Ð¸Ð»Ð¸ 5.22)",
+                    "name": "Жилая улица (со знаком 5.21 или 5.22)",
                     "terms": "Жилая улица, Улица в жилой застройке, Жилая зона"
                 },
                 "highway/mini_roundabout": {
                     "terms": "привал, стоянка"
                 },
                 "highway/road": {
-                    "name": "Неизвестный тип дороги. Тропа? Дорога? Ступеньки? Ворота есть? Шлагбаумы? Частная дорога?",
+                    "name": "Неизвестный тип дороги.",
                     "terms": "неизвестная, Неизвестный тип дороги"
                 },
                 "highway/secondary": {
                     "terms": "лестница, ступени, ступеньки"
                 },
                 "highway/stop": {
-                    "name": "Знак Стоп",
+                    "name": "Знак \"Стоп\"",
                     "terms": "Движение без остановки запрещено, знак стоп"
                 },
                 "highway/street_lamp": {
                     "name": "Обслуживаемый лес / деревья.",
                     "terms": "лес, лесной массив"
                 },
-                "landuse/garages": {
-                    "name": "Территория гаражей",
-                    "terms": "ГСК"
-                },
                 "landuse/grass": {
                     "name": "Газон",
                     "terms": "Газон, Искусственный газон, Земля используемая под газон"
                     "terms": "Офисы, Офис, Контора, Канцелярия"
                 },
                 "office/administrative": {
-                    "name": "Местная администрация и надзирающие органы",
-                    "terms": "канцелярия, офис"
+                    "name": "Местная администрация и надзирающие органы"
                 },
                 "office/advertising_agency": {
                     "name": "Рекламное агенство"
                 },
-                "office/company": {
-                    "name": "Офис компании или организации",
-                    "terms": "Частная компания, Фирма, Организация"
-                },
                 "office/coworking": {
                     "name": "Коворкинг"
                 },
                 },
                 "place/island": {
                     "name": "Остров",
-                    "terms": "остров"
+                    "terms": "Остров"
+                },
+                "place/islet": {
+                    "name": "Островок",
+                    "terms": "Островок"
                 },
                 "place/isolated_dwelling": {
-                    "name": "Ð\98золиÑ\80ованное Ð¶Ð¸Ð»Ñ\8cÑ\91",
+                    "name": "Ð¥Ñ\83Ñ\82оÑ\80",
                     "terms": "Хутор, Заимка"
                 },
                 "place/locality": {
-                    "name": "Ð\9cестность",
+                    "name": "УÑ\80оÑ\87иÑ\89е, Ð¼естность",
                     "terms": "Урочище, Заброшенное поселение"
                 },
                 "place/neighbourhood": {
                     "name": "Отдельный трансформатор",
                     "terms": "трансформатор"
                 },
-                "public_transport/platform": {
-                    "name": "Платформа / место ожидания",
-                    "terms": "Платформа, Остановка, Посадочная платформа, Место посадки и высадки пассажиров, очередь"
-                },
-                "public_transport/stop_position": {
-                    "name": "Место остановки транспорта",
-                    "terms": "остановка"
-                },
                 "railway": {
                     "name": "Железная дорога"
                 },
                     "name": "Фуникулёр",
                     "terms": "фуникулёр, канатная дорога"
                 },
-                "railway/halt": {
-                    "name": "Железнодорожный остановочный пункт",
-                    "terms": "Железнодорожная станция, ЖД станция"
-                },
                 "railway/level_crossing": {
                     "name": "Железнодорожный переезд"
                 },
                     "name": "Узкоколейная железная дорога",
                     "terms": "узкоколейная железная дорога, узкоколейка, узкоколейная ЖД"
                 },
-                "railway/platform": {
-                    "name": "Железнодорожная платформа",
-                    "terms": "железнодорожная платформа, ж/д платформа"
-                },
                 "railway/rail": {
                     "name": "Рельсовый путь",
                     "terms": "рельсы, вокзал, железнодорожный"
                 "railway/signal": {
                     "name": "Железнодорожная сигнализация"
                 },
-                "railway/station": {
-                    "name": "Железнодорожная станция",
-                    "terms": "железнодорожная станция, ж/д станция, вокзал"
-                },
                 "railway/subway": {
                     "name": "Метро",
                     "terms": "Метро, Подземка, "
                     "name": "Трамвайные пути",
                     "terms": "трамвай"
                 },
-                "railway/tram_stop": {
-                    "name": "Остановка трамвая",
-                    "terms": "трамвай,остановка,маршрут,транспорт,общественный,рельсы"
-                },
                 "relation": {
                     "name": "Отношение",
                     "terms": "отношение"
                     "name": "Ювелирный магазин",
                     "terms": "ювелир"
                 },
-                "shop/kiosk": {
-                    "name": "Киоск (устаревший тег)",
-                    "terms": "Ларек, магазин"
-                },
                 "shop/kitchen": {
                     "name": "Кухонная студия",
                     "terms": "кухонная фурнитура, установка кухонь, кухни на заказ, планировка кухни, кухни"
                     "name": "Место",
                     "terms": "место, местность"
                 },
+                "type/waterway": {
+                    "name": "Водный путь"
+                },
                 "vertex": {
                     "name": "Другой объект",
                     "terms": "точка"
                 "name": "OSM Inspector: Теги"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, данные карты: участники  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Путевые маршруты: Велосипед"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, данные карты: участники  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Путевые маршруты: Пеший туризм"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, данные карты: участники  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Путевые маршруты: Горный велосипед"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, данные карты: участники  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Путевые маршруты: Коньки"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, данные карты: участники  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Путевые маршруты: Зимние виды спорта"
             },
             "basemap.at": {
index 055821d47e2245e441472db0d89b4ae77788b059..7d48e8a7183504bdd1adeb284cd7a00a079f08a0 100644 (file)
         "background": {
             "title": "පසුබිම",
             "description": "පසුබිම් සැකසුම්",
-            "percent_brightness": "දීප්තිමත් බාවය {opacity} % ",
             "none": "කිසිවක් නැත",
             "custom": "රිසි පරදී සැකසු",
             "custom_button": "පසුතලය රිසි පරිදි සැකසීම සදහා",
index 13dec2a77f9c073b19891fabf315bb0ed7b4a746..0673475f4c7076b989e02565f5228e23325eaab0 100644 (file)
             "created": "Vytvorené",
             "about_changeset_comments": "O popisoch súborov zmien",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "V popise ste spomenuli Google: nezabúdajte, že kopírovanie z Google máp je prísne zakázané.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "V popise ste spomenuli Google: nezabúdajte, že kopírovanie z Google máp je prísne zakázané."
         },
         "contributors": {
             "list": "Úpravy od {users}",
                 "title": "Merania",
                 "selected": "{n} vybraných",
                 "geometry": "Geometria",
-                "closed": "uzavretá",
                 "center": "Stred",
                 "perimeter": "Obvod",
                 "length": "Dĺžka",
             "title": "Pozadie",
             "description": "Nastavenia pozadia",
             "key": "B",
-            "percent_brightness": "{opacity}% jas",
             "none": "Žiadne",
             "best_imagery": "Najviac známy zdroj obrázkov pre túto polohu",
             "switch": "Prepnúť späť na toto pozadie",
             "custom": "Voliteľné",
             "custom_button": "Upraviť volitelné pozadie",
-            "custom_prompt": "Vyplňte vzorovú URL pre mapové dlaždice. Platné polia sú: \n    - {zoom}/{z}, {x}, {y} pre Z/X/Y dlaždicovú schému \n    - {ty} pre TMS štýl s prevrátenými Y súradnicami\n    - {u} pre quadtile schému \n    - {switch:a,b,c} pre DNS server multiplexing\n\nPríklad:\n{example}",
-            "fix_misalignment": "Upraviť posun obrázkov",
-            "imagery_source_faq": "Odkiaľ pochádzajú tieto obrázky?",
             "reset": "vynulovať",
-            "offset": "Potiahnutím kdekoľvek v šedej ploche nižšie upravíte posun obrázkov, alebo zadajte hodnotu posunu v metroch.",
             "minimap": {
-                "description": "Náhľad mapy",
                 "tooltip": "Zobraziť oddialenú mapu pre ľahšie lokalizovanie práve zobrazenej oblasti.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Upraviť posun obrázkov",
+            "offset": "Potiahnutím kdekoľvek v šedej ploche nižšie upravíte posun obrázkov, alebo zadajte hodnotu posunu v metroch."
         },
         "map_data": {
             "title": "Mapové údaje",
             "untagged_area_tooltip": "Vyberte typ objektu, ktorý popisuje, čo je táto plocha.",
             "untagged_relation": "Neoznačená relácia",
             "untagged_relation_tooltip": "Vyberte typ objektu, ktorý popisuje, čo je táto relácia.",
-            "many_deletions": "Chystáte sa vymazať {n} objektov. Ste si naozaj istý, že to chcete urobiť? Týmto ich vymažete z mapy na openstreetmap.org, ktorú používajú ďalší používatelia.",
             "tag_suggests_area": "Označenie {tag} predpokladá, že objekt by mal byť plochou a nie čiarou.",
             "deprecated_tags": "Neschválené označenie: {tags}"
         },
         },
         "help": {
             "title": "Nápoveda",
-            "key": "H",
-            "help": "# Nápoveda\n\nToto je editor pre [OpenStreetMap](http://www.openstreetmap.org/), slobodnú a upravovateľnú mapu sveta. Môžete ho používať na pridávanie a aktualizovanie údajov vo vašom okolí a vylepšiť tak mapu sveta s otvoreným kódom a dátami pre všetkých.\n\nÚpravy, ktoré v tejto mape spravíte, budú viditeľné pre každého, kto používa OpenStreetMap. Na to, aby ste mohli upravovať, sa budete musieť prihlásiť [prihlásiť](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) je kolaboratívny projekt so [zdrojovým kódom dostupným na GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nzozbierané GPS údaje sú najcennejší zdroj dát pre OpenStreetMap. Tento editor\npodporuje stopy z lokálnych \".gpx\" súborov na vašom počítači. Tento typ GPS stôp\nmôžete zachytiť pomocou rôznych aplikácií pre smartfóny ako aj GPS\nprístrojmi.\n\nPre informácie, ako robiť GPS prieskum, si prečítajte\n[Mapovanie so smartfónom, GPS alebo papierom](http://learnosm.org/en/mobile-mapping/).\n\nPre použitie GPX stopy pre mapovanie, pretiahnite a pustite GPX súbor na mapový\neditor. Po rozpoznaní, bude pridaná na mapu ako jasná fialová\nčiara. Kliknite na ponuku \"Mapové údaje\" na pravej strane pre zapnutie,\nvypnutie alebo priblíženie na túto novú GPX vrstvu.\n\nGPX stopa nie je priamo nahraná na OpenStreetMap. Najlepší spôsob ako\nju využiť je, použiť ju ako predlohu pre zakreslovanie nových objektov\na potom ju [nahrať na OpenStreetMap](http://www.openstreetmap.org/trace/create)\npre ďalších uživateľov.\n",
-            "imagery": "# Snímky povrchu\n\nLetecké snímky sú dôležitým zdrojom pre mapovanie. Kombinácia leteckých fotografií, satelitných snímok a voľne skompilovaných zdrojov je v editore dostupná vpravo pod ponukou \"Nastavenia pozadia\".\n\nŠtandardne je v editore predvolená satelitná vrstva z [Bing Maps](http://www.bing.com/maps/), ale ako posuniete a priblížite mapu na nové geografické miesta, dostupnými sa stanú nové zdroje. Niektoré krajiny ako Spojené Štáty, Francúzsko, a Dánsko majú pre niektoré oblasti dostupné veľmi kvalitné snímky.\n\nSnímky môžu byť niekedy posunuté voči mapovým dátam, kvôli chybe na strane poskytovateľa snímkov. Ak uvidíte veľa ciest posunutých voči pozadiu, neposúvajte ich hneď všetky, aby ste ich zarovnali s pozadím. Namiesto toho môžete upraviť snímky, aby odpovedali existujúcim dátam tým, že kliknete na \"Oprav zarovnanie\" naspodku Nastavenia pozadia.\n",
-            "addresses": "# Adresy\n\nAdresy sú jedny z najužitočnejších informácií na mape.\n\nHoci sú adresy často znázorňované ako časti ulíc, v OpenStreetMap sú zaznamenávané ako atribúty budov a miest pozdĺž ulíc.\n\nInformáciu o adrese môžete pridať ku miestam znázornených ako obrysy budov, ale aj ku tým, ktoré boli zmapované ako jediný bod. Najvhodnejším zdrojom adresných údajov je miestny prieskum alebo znalosť lokality. Tak ako pri iných objektoch, kopírovanie z komerčných zdrojov ako Google Mapy je prísne zakázané.\n",
-            "inspector": "# Používanie Inšpektora\n\nInšpektor je sekcia na ľavej strane stránky, ktorá vám umožní\nupravovať detaily vybraného objektu.\n\n### Voľba typu objektu\n\nPo tom ako pridáte bod, čiaru alebo plochu, môžete vybrať aký je to typ objektu.\nNapríklad či je to diaľnica alebo obytná ulica, či supermarket alebo kaviareň.\nInšpektor zobrazí tlačítka pre bežné typy objektov a ďalšie môžete nájsť zadaním\ntoho, čo hľadáte do vyhľadávacieho poľa.\n\nKliknite na \"i\" v pravom dolnom rohu tlačítka pre výber typu objektu, ak sa chcete o ňom dozvedieť viac. Kliknutím na tlačítko vyberiete tento typ objektu.\n\n### Používanie formulárov a upravovanie označenia\n\nPo tom ako zvolíte typ objektu, alebo keď vyberiete objekt, ktorý už má\npridelený typ, inšpektor zobrazí polia s detailmi o objekte ako jeho\nmeno a adresa.\n\nPod poliami, ktoré vidíte, môžete kliknúť na \"Pridať pole\" a pridať ďalšie detaily\nako odkaz na Wikipédiu, prístup pre vozičkárov a ďalšie.\n\nNaspodku inšpektora kliknite na \"Dodatočné označenia\" pre pridanie ľubovoľných\noznačení pre daný element. [Taginfo](http://taginfo.openstreetmap.org/) je\nvýborný zdroj pre zistenie populárnych kombinácií označení.\n\nZmeny, ktoré spravíte v inšpektorovi, sú automaticky aplikované na mapu.\nVrátiť späť ich môžete kedykoľvek kliknutím na tlačítko \"Vrátiť\".\n"
+            "key": "H"
         },
         "intro": {
             "done": "hotovo",
             },
             "areas": {
                 "title": "Plochy",
-                "add_playground": "*Plochy* sa používajú na zobrazovanie hraníc objektov ako jazerá, budovy alebo rezidenčné zóny.{br}Môžu byť tiež použité na detailnejšie mapovanie objektov, ktoré by ste nomálne označili iba bodom. **Kliknite na {button} Plocha a pridajte novú plochu.** ",
                 "start_playground": "Poďme pridať do mapy ihrisko tým, že nakreslíme plochu. Plochy sa kreslia tak, že pridávate *uzly* pozdĺž vonkajšej hrany objektu. **Kliknite alebo stlačte medzerník pre umiestnenie počiatočného uzla na jeden z rohov ihriska.**",
                 "continue_playground": "Pokračujte v kreslení plochy pridávaním ďalších uzlov pozdĺž hrany ihriska. Je poriadku ak spojíte plochu s existujúcimi chodníkmi.{br}Tip: Podržaním klávesu \"{alt}\" zabránite uzlom v spájaní s ďalšími objektami. **Pokračujte v kreslní plochy inhriska.**",
                 "finish_playground": "Dokončite plochu tým, že stlačíte enter alebo kliknete na prvý alebo posledný uzol. **Dokončite kreslenie plochy ihriska.**",
                     "label": "Kapacita",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "E": "Východ",
-                        "ENE": "Východo-severovýchod",
-                        "ESE": "Východo-juhovýchod",
-                        "N": "Sever",
-                        "NE": "Severtovýchod",
-                        "NNE": "Severo-severovýchod",
-                        "NNW": "Severo-severozápad",
-                        "NW": "Severozápad",
-                        "S": "Juh",
-                        "SE": "Juhovýchod",
-                        "SSE": "Juho-juhovýchod",
-                        "SSW": "Juho-juhozápad",
-                        "SW": "Juhozápad",
-                        "W": "Západ",
-                        "WNW": "Západo-severozápad",
-                        "WSW": "Západo-juhozápad"
-                    }
-                },
                 "castle_type": {
                     "label": "Typ"
                 },
-                "clock_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "anticlockwise": "Proti smeru hodinových ručičiek",
-                        "clockwise": "V smere hodinových ručičiek"
-                    }
-                },
                 "clothes": {
                     "label": "Typ oblečenia"
                 },
                 "maxweight": {
                     "label": "Maximálna hmotnosť"
                 },
-                "milestone_position": {
-                    "label": "Pozícia mílnika",
-                    "placeholder": "Vzdialenosť na jedno desatinné miesto (123.4)"
-                },
                 "mtb/scale": {
                     "label": "Obtiažnosť pre horské bicykle",
                     "options": {
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "backward": "Dozadu",
-                        "forward": "Dopredu"
-                    }
-                },
                 "park_ride": {
                     "label": "Odstavné parkovisko"
                 },
                 "recycling_accepts": {
                     "label": "Prijíma"
                 },
-                "recycling_type": {
-                    "label": "Typ recyklácie",
-                    "options": {
-                        "centre": "Recyklačné centrum",
-                        "container": "Kontajner"
-                    }
-                },
                 "ref": {
                     "label": "Referenčný kód"
                 },
                     }
                 },
                 "structure": {
-                    "label": "Štruktúra",
+                    "label": "Cestná stavba",
                     "options": {
                         "bridge": "Most",
                         "cutting": "Výkop",
                     "terms": "lanovy vlek"
                 },
                 "aerialway/station": {
-                    "name": "Stanica lanovky",
-                    "terms": "lanovkova stanica,lanovková stanica"
+                    "name": "Stanica lanovky"
                 },
                 "aerialway/t-bar": {
                     "name": "Vlek s dvojmiestnou kotvou",
                     "name": "Zmenáreň",
                     "terms": "zmenaren,valuty,cudzia mena, výmena peňazí,vymena penazi"
                 },
-                "amenity/bus_station": {
-                    "name": "Autobusová zastávka",
-                    "terms": "autobusova zastavka,zastávka,zastavka,stanica,autobus,mhd"
-                },
                 "amenity/cafe": {
                     "name": "Kaviareň",
                     "terms": "kaviareň,kaviaren"
                     "name": "Rýchle občerstvenie",
                     "terms": "rychle obcerstvenie,rýchle občerstvenie,fastfood, fast food"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Stanica trajektu",
-                    "terms": "trajekt,kompa,lod,autotrajekt"
-                },
                 "amenity/fire_station": {
                     "name": "Požiarna stanica",
                     "terms": "hasici,poziarnici,hasicska zbrojnica,hasiči,požiarnici,hasičská zbrojnica"
                     "name": "Stanica horskej služby",
                     "terms": "stanica horskej sluzby,sprava narodneho parku, správa národného parku,narodny park,národný park"
                 },
-                "amenity/recycling": {
-                    "name": "Recyklácia",
-                    "terms": "recyklacia, zber, recyklovanie"
-                },
                 "amenity/recycling_centre": {
                     "name": "Recyklačné centrum",
                     "terms": "recyklacne centrum"
                     "name": "Jazdecká trať",
                     "terms": "jazdecká cesta, chodník pre kone,jazdecká trasa,jazdecka cesta,chodnik pre kone,jazdecka trasa,jazdecka trat"
                 },
-                "highway/bus_stop": {
-                    "name": "Autobusová zastávka",
-                    "terms": "Autobusova zastavka,nástupište,nastupiste,stanica"
-                },
                 "highway/corridor": {
                     "name": "Chodba v budove",
                     "terms": "chodba,hala"
                     "name": "Les",
                     "terms": "hora,stromy"
                 },
-                "landuse/garages": {
-                    "name": "Garáže",
-                    "terms": "garaze,parkovanie,kryte parkovanie,kryté parkovanie"
-                },
                 "landuse/grass": {
                     "name": "Tráva",
                     "terms": "trava,trávnik,travnik,trávnata plocha,travnata plocha,park"
                     "terms": "urad"
                 },
                 "office/administrative": {
-                    "name": "Administratívny úrad",
-                    "terms": "administrativny urad"
-                },
-                "office/company": {
-                    "name": "Firma",
-                    "terms": "firmy,spoločnosť,spolocnost"
+                    "name": "Administratívny úrad"
                 },
                 "office/educational_institution": {
                     "name": "Vzdelávací inštitút",
                     "name": "Transformátor",
                     "terms": "Rozvodna stanica,Rozvodná stanica,transformator,trasformátor"
                 },
-                "public_transport/platform": {
-                    "name": "Nástupište",
-                    "terms": "nastupiste,zastávka,zastavka"
-                },
-                "public_transport/stop_position": {
-                    "name": "Miesto zastavenia",
-                    "terms": "zastávka,zastavka"
-                },
                 "railway": {
                     "name": "Železnica"
                 },
                     "name": "Lanová dráha",
                     "terms": "lanova zeleznica,lanova draha"
                 },
-                "railway/halt": {
-                    "name": "Železničná zastávka",
-                    "terms": "zeleznicna zastavka,zastavka,zástavka,vlak,vlaková zástavka,vlakova zastavka,stanica"
-                },
                 "railway/monorail": {
                     "name": "Jednokoľajnicová dráha",
                     "terms": "jednokolajnicova draha,jednokolajka,monorail"
                     "name": "Úzkorozchodná železnica",
                     "terms": "uzkorozchodna zeleznica,uzkokolajka,úzkoľajka"
                 },
-                "railway/platform": {
-                    "name": "Železničné nástupište",
-                    "terms": "zeleznicne nastupiste,nástupište,nastupiste,perón,peron"
-                },
                 "railway/rail": {
                     "name": "Železničná trať",
                     "terms": "zeleznicna trat,trat,trať,železnica,zeleznica"
                 },
-                "railway/station": {
-                    "name": "Železničná stanica",
-                    "terms": "zeleznicna stanica,stanica,zástavka,zastavka"
-                },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "metro,podzemna draha,podzemná dráha"
                     "name": "Zlatníctvo",
                     "terms": "zlatnictvo,šperky,sperky,zlato,striebro"
                 },
-                "shop/kiosk": {
-                    "name": "Novinový stánok",
-                    "terms": "novinovy stanok,noviny,casopisy,časopisy"
-                },
                 "shop/kitchen": {
                     "name": "Kuchynské štúdio",
                     "terms": "kuchynske studio,kuchyna,uchyňa,kuchyne,kuchyňe,kuchynský kút,kuchynsky kut,kuchynské kúty,kuchynske kuty"
                 "name": "OSM Inspector: Označenia"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, mapové údaje OpenStreetMap prispievatelia, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Cyklistika"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, mapové údaje OpenStreetMap prispievatelia, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Turistika"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, mapové údaje OpenStreetMap prispievatelia, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Horské bicykle"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, mapové údaje OpenStreetMap prispievatelia, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Skating"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, mapové údaje OpenStreetMap prispievatelia, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Zimné športy"
             },
             "basemap.at": {
index 4ed6dd954d21df1a2825d0a0b11aade4d6888d37..70d0a8074bf266a0e3122530af716cbd1dd3ee41 100644 (file)
             "about_changeset_comments": "O povzetkih sprememb",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "V opombi je omenjeno podjetje Google: kopiranje podatkov iz zemljevida Google je strogo prepovedano!",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Spremembe uporabnikov {users}",
                 "title": "Merilo",
                 "selected": "{n} izbranih",
                 "geometry": "Geometrija",
-                "closed": "zaprto",
                 "center": "Središče",
                 "perimeter": "Obseg",
                 "length": "Dolžina",
                 "centroid": "Središčna točka",
                 "location": "Mesto",
                 "metric": "Metrične enote",
-                "imperial": "Imperialne enote"
+                "imperial": "Imperialne enote",
+                "node_count": "Število vozlišč"
             }
         },
         "geometry": {
             "title": "Ozadje",
             "description": "Nastavitve ozadja",
             "key": "B",
-            "percent_brightness": "{opacity}% svetlost",
+            "backgrounds": "Ozadja",
             "none": "Brez",
             "best_imagery": "Najbolj znan slikovni vir ozadja za to območje",
             "switch": "Preklopi nazaj na to ozadje.",
             "custom": "Po meri",
             "custom_button": "Uredi ozadje po meri",
-            "custom_prompt": "Vpišite naslov url predloge sličic. Veljavni žetoni so:\n   - {zoom}/{z}, {x}, {y} za Z/X/Y sheme sličic\n   - {ty} za koordinate v zapisu TMS\n   - {u} za shemo četverjenja – quadtile\n   - {switch:a,b,c} za zvijanje pretoka prek strežnika DNS\n\nPrimer:\n{example}",
-            "fix_misalignment": "Popravi zamik ozadja",
-            "imagery_source_faq": "Od kod so ozadja zemljevida?",
             "reset": "ponastavi",
-            "offset": "Povlecite spodnje temnejše sivo področju za prilagoditev zamika ali pa vnesite zamik številčno v metrih.",
+            "display_options": "Možnosti prikaza",
+            "brightness": "Svetlost",
+            "contrast": "Kontrast",
+            "saturation": "Nasičenost",
+            "sharpness": "Ostrina",
             "minimap": {
-                "description": "Mini zemljevid",
+                "description": "Pokaži mini-zemljevid",
                 "tooltip": "Pokaži oddaljen zemljevid za pomoč pri določanju trenutno prikazanega mesta.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Popravi zamik ozadja",
+            "offset": "Povlecite spodnje temnejše sivo področju za prilagoditev zamika ali pa vnesite zamik številčno v metrih."
         },
         "map_data": {
             "title": "Prikaz zemljevida",
             },
             "fill_area": "Zapolnjevanje polj",
             "map_features": "Predmeti zemljevida",
-            "autohidden": "Nekateri predmeti so samodejno skriti, da jih na zaslonu ni prikazanih preveč. Za urejanje je treba zemljevid približati."
+            "autohidden": "Nekateri predmeti so samodejno skriti, da jih na zaslonu ni prikazanih preveč. Za urejanje je treba zemljevid približati.",
+            "osmhidden": "Nekateri predmeti so samodejno skriti, ker je plast OpenStreetMap skrita."
         },
         "feature": {
             "points": {
             "untagged_area_tooltip": "Izberite vrsto predmeta, ki ga ponazarja polje na zemljevidu.",
             "untagged_relation": "Neoznačena zveza",
             "untagged_relation_tooltip": "Izberite vrsto predmeta, ki opisuje zvezo.",
-            "many_deletions": "Izbrisati nameravate predmete ({n}). Ali ste prepričani, da želite nadaljevati? Predmeti bodo izbrisani iz zemljevida openstreetmap.org, ki ga vidijo vsi uporabniki.",
             "tag_suggests_area": "Oznaka {tag} nakazuje, da črta opisovati območje, vendar pa ni sklenjena",
             "deprecated_tags": "Zastarele oznake: {tags}"
         },
         "mapillary": {
             "view_on_mapillary": "Pokaži sliko na spletišču Mapillary"
         },
+        "openstreetcam_images": {
+            "tooltip": "Ulične fotografije z OpenStreetCama",
+            "title": "Plast s fotografijami (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Pokaži sliko na spletišču OpenStreetCam"
+        },
         "help": {
             "title": "Pomoč",
             "key": "H",
-            "help": "# Pomoč\n\nUrejevalnik ID je orodje za urejanje [OpenStreetMap](http://www.openstreetmap.org/), brezplačnih in prostih zemljevidov sveta. Uporabljate ga lahko za posodabljanje podatkov in s tem izboljševanje odprto-kodnega in odprto-podatkovnega zemljevida za vse uporabnike.\n\nSpremembe, ki jih naredite na zemljevidu, bodo na voljo vsem uporabnikom, ki uporabljajo OpenStreetMap. Za urejanje se je treba najprej [prijaviti](https://www.openstreetmap.org/login).\n\nUrejevalnik [iD editor](http://ideditor.com/) je zasnovan kot odprt projekt s prosto dostopno kodo na [GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nSledi GPS so pomemben vir podatkov za zemljevide OpenStreetMap. Urejevalnik podpira datoteke sledi *.gpx*. Sledi je mogoče zbirati s pomočjo posebnih programov na pametnih telefonih ali pa s posebnimi navigacijskimi napravami.\n\nZa večč podrobnosti o sledeh GPS si oglejte dokumentacijo o [Kartografiji s pametnimi telefoni, z napravami GPS in zdrugimi načini](http://learnosm.org/en/mobile-mapping/).\n\nZa uporabo sledi GPX, datoteko s podatki enostavno povlecite v okno urejevalnika. Če so podatki v datoteki ustrezni in brez napak, bo sled kot svetla rožnata črta dodana na zemljevid. S klikom na meni »Podatki zemljevida« omogočite oziroma skrijete plast s potjo.\n\nSled GPX ni samodejno poslana na strežnik OpenStreetMap. Najboljši način je podatke vrisati na zemljevid, dodati predmete in urediti obstoječe, to pa nato objaviti na [OpenStreetMap](http://www.openstreetmap.org/trace/create)\nza druge uporabnike.\n",
-            "imagery": "# Slikovni posnetki\n\nSatelitski posnetki in fotografije iz zraka so pomemben vir za kartiranje. Različne slike letalskih in satelitskih posnetkov ter drugi slikovni viri so v urejevalniku na voljo prek »Nastavitev ozadja« v meniju.\nPrivzeto so uporabljeni satelitski posnetki prek iskalnika [Bing Maps](http://www.bing.com/maps/), pri približevanju zemljevida pa so prikazani tudi drugi razpoložljivi viri.\nV nekaterih državah, kot so ZDA, Francija ali Danska, so za posamezna območja na voljo tudi posnetki z zelo visoko ločljivostjo.\nSlikovni posnetki so zaradi napak na strani ponudnika včasih zamaknjeni glede na zemljevid.\nČe opazite, da je več cest zamaknjenih glede na posnetek v ozadju, cest ne premikajte. V tem primeru lahko premaknete sliko v ozadju tako, da se prekriva z že narisanimi predmeti zemljevidu. To storite s klikom na »Premakni podlogo zemljevida« na dnu uporabniškega vmesnika »Nastavitev ozadja«.\n\n",
-            "addresses": "# Naslovi\n\nNaslovi so **najbolj uporabna** podrobnost zemljevida!\n\nČeprav so naslovi pogosto opredeljeni kot deli ulic, so na zemljevidu OpenStreetMap zabeležni kot lastnost stavb in točk ob ulicah.\n\nNaslove je mogoče dodeliti točkovnim predmetom in obrisom stavb.\nNajustreznejši vir naslova je seveda poznavanje mesta oziroma lastno zbiranje podatkov. Tako kot za vse podatke, tudi za naslove velja, da je kopiranje iz različnih tržno orientiranih virov, kot je na primer Googlov zemljevid, **strogo prepovedano**.\n\n",
-            "inspector": "# Uporaba urejevalnika predmetov\n\nUrejevalnik predmetov je polje na levem delu zaslona, ki omogoča urejanje podrobnosti – oznak – izbranega predmeta.\n\n### Izbira vrste predmeta\n\nKo na zemljevid dodate točko, črto ali mnogokotnik, je treba najprej izbrati vrsto predmeta, ki ga ti opredeljujejo; na primer, ali je črta avtocesta oziroma stanovanjska ulica, ali je polje veleblagovnica oziroma točka gostilna v njej. V urejevalniku predmetov so najprej pokazane možnosti za najpogosteje uporabljene predmete, vse ostale pa je mogoče odbrati prek iskalnega polja.\n\nZa več podrobnosti o posameznem predmetu, kliknite na črko »*i*« na desnem robu opisa. S klikom na izbran gumb, se potrdi vrsta predmeta.\n\n### Uporaba vnosnih polj in urejanje oznak\n\nKo je predmet, katerega vrsta je že določena, izbran, se pokažejo vpisna polja z oznakami o predmetu, kot so naziv, naslov, položaj in druga.\n\nOznake lahko dodate s klikom na spustni meni »Dodaj polje«, na primer povezavo na Wikipedijo, dostopnost za invalidske vozičke in podobno.\n\nNa dnu urejevalnika predmetov lahko s klikom na gumb »Dodatne oznake« opredelite tudi številne druge oznake. Spletišče [Taginfo](http://taginfo.openstreetmap.org/) je odličen vir podrobnosti o najpogosteje uporabljanih oznakah in njihova raba.\n\nSpremembe, ki jih ustvarite, se krajevno shranjujejo samodejno in jih lahko kadarkoli razveljavite s klikom na gumb »Razveljavi«.\n\nVse spremembe se objavijo na zemljevid skupaj s podatki zemljevida.\n"
+            "help": {
+                "title": "Pomoč",
+                "welcome": "Dobrodošli v urejevalniku iD za [OpenStreetMap](https://www.openstreetmap.org/). S tem urejevalnikom lahko OpenStreetMap posodobite neposredno iz svojega brskalnika."
+            }
         },
         "intro": {
             "done": "končano",
             },
             "areas": {
                 "title": "Mnogokotniki",
-                "add_playground": "Z *mnogokotniki* so opredeljeni predmeti z natančno določenimi mejami, kot so zgradbe, parki, jezera ali stanovanjske soseske.{br}Uporabiti jih je mogoče tudi za bolj natančno izrisovanje predmetov, ki bi jih sicer določili s točko. **Kliknite na gumb {button} za dodajanje območja.**",
                 "start_playground": "Z mnogokotnikom lahko izrišemo na primer otroško igrišče. Mnogokotniki se izrisujejo z *vozlišči* po zunanjem robu predmeta. **Kliknite na rob igrišča za dodajanje prve točke.**",
                 "continue_playground": "Nadaljujte z risanjem mnogokotnika z dodajanjem vozlišč po robu otroškega igrišča. Seveda lahko povežete polje z obstoječo pohodno potjo.{br}Namig: če pritisnete tipko »{alt}« se onemogoči samodejno povezovanje vozlišč z drugimi točkami na zemljevidu. **Nadaljujte z risanjem igrišča.**",
                 "finish_playground": "Mnogokotnik se *zaključi* kot ponovno kliknete na prvo ali zadnje narisano vozlišče. **Končajte z risanjem igrišča.**",
                 "board_type": {
                     "label": "Vrsta"
                 },
+                "boules": {
+                    "label": "Vrsta"
+                },
                 "boundary": {
                     "label": "Vrsta"
                 },
                     "label": "Kapaciteta",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "E": "Vzhod",
-                        "ENE": "Vzhod-severovzhod",
-                        "ESE": "Vzhod-jugovzhod",
-                        "N": "Sever",
-                        "NE": "Severovzhod",
-                        "NNE": "Sever-severovzhod",
-                        "NNW": "Sever-severozahod",
-                        "NW": "Severozahod",
-                        "S": "Jug",
-                        "SE": "Jugovzhod",
-                        "SSE": "Jug-jugovzhod",
-                        "SSW": "Jug-jugozahod",
-                        "SW": "Jugozahod",
-                        "W": "Zahod",
-                        "WNW": "Zahod-severozahod",
-                        "WSW": "Zahod-jugozahod"
-                    }
-                },
                 "castle_type": {
                     "label": "Vrsta"
                 },
-                "clock_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "anticlockwise": "Proti smeri urinega kazalca",
-                        "clockwise": "V smeri urinega kazalca"
-                    }
-                },
                 "clothes": {
                     "label": "Oblačila"
                 },
                 "collection_times": {
                     "label": "Ure zbiranja"
                 },
+                "comment": {
+                    "label": "Povzetek sprememb",
+                    "placeholder": "Kratek opis sprememb (zahtevan vpis)"
+                },
                 "communication_multi": {
                     "label": "Vrste komunikacij"
                 },
                 "craft": {
                     "label": "Vrsta"
                 },
+                "crane/type": {
+                    "label": "Vrsta žerjava",
+                    "options": {
+                        "floor-mounted_crane": "Nepremični žerjav",
+                        "portal_crane": "Tirni žerjav",
+                        "travel_lift": "Premični žerjav"
+                    }
+                },
                 "crop": {
                     "label": "Poljščine"
                 },
                 "currency_multi": {
                     "label": "Vrste valut"
                 },
+                "cutting": {
+                    "label": "Vrsta",
+                    "placeholder": "Privzeto"
+                },
                 "cycle_network": {
                     "label": "Omrežje"
                 },
                     "label": "Par",
                     "placeholder": "3, 4, 5 ..."
                 },
-                "parallel_direction": {
-                    "label": "Smer",
-                    "options": {
-                        "backward": "Nazaj",
-                        "forward": "Naprej"
-                    }
-                },
                 "park_ride": {
                     "label": "Parkiraj in se odpelji"
                 },
                 "recycling_accepts": {
                     "label": "Sprejme"
                 },
-                "recycling_type": {
-                    "label": "Vrsta recikliranja",
-                    "options": {
-                        "centre": "Središče za predelavo odpadkov",
-                        "container": "Vrsta zabojnika"
-                    }
-                },
                 "ref": {
                     "label": "Sklicna številka"
                 },
                     "terms": "vlečnica"
                 },
                 "aerialway/station": {
-                    "name": "Postaja žičnice",
-                    "terms": "Žičniška postaja,postaja gondole"
+                    "name": "Postaja žičnice"
                 },
                 "aerialway/t-bar": {
                     "name": "Sidra",
                     "name": "Menjalnica",
                     "terms": "menjalnica,menjava,devize"
                 },
-                "amenity/bus_station": {
-                    "name": "Avtobusna postaja",
-                    "terms": "AP,bus,štacjon,postajališče"
-                },
                 "amenity/cafe": {
                     "name": "Kavarna",
                     "terms": "bife,kava,bar,kavarna"
                     "name": "Hitra prehrana",
                     "terms": "hitra hrana"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Pristanišče za trajekt"
-                },
                 "amenity/fire_station": {
                     "name": "Gasilska postaja",
                     "terms": "gasilci"
                     "name": "Čuvaj parka",
                     "terms": "center za obiskovalce,nadzornik parka,uprava parka,čuvaj parka"
                 },
-                "amenity/recycling": {
-                    "name": "Reciklaža",
-                    "terms": "recikliranje,ekološki otok"
-                },
                 "amenity/recycling_centre": {
                     "name": "Center za recikliranje"
                 },
                     "name": "Mulatjera",
                     "terms": "jahalna pot,mulatiera"
                 },
-                "highway/bus_stop": {
-                    "name": "Avtobusno postajališče",
-                    "terms": "avtobusna postaja"
-                },
                 "highway/corridor": {
                     "name": "Notranji hodnik"
                 },
                     "name": "Gozd",
                     "terms": "gozdne površine,gozdič,gozdiček"
                 },
-                "landuse/garages": {
-                    "name": "Garaže"
-                },
                 "landuse/grass": {
                     "name": "Travnata površina",
                     "terms": "zelenica,vrt,park,javna zelena površina,trava"
                     "terms": "pisarna"
                 },
                 "office/administrative": {
-                    "name": "Upravna enota",
-                    "terms": "Upravni urad,upravna pisarna"
-                },
-                "office/company": {
-                    "name": "Podjetje",
-                    "terms": "firma,sedež podjetja,podjetnik"
+                    "name": "Upravna enota"
                 },
                 "office/coworking": {
                     "name": "Prostor za sodelo"
                     "name": "Transformator",
                     "terms": "pretvornik,trafo postaja"
                 },
-                "public_transport/platform": {
-                    "name": "Peron",
-                    "terms": "ploščad"
-                },
-                "public_transport/stop_position": {
-                    "name": "Postajališče",
-                    "terms": "avtobusna postaja,postaja"
-                },
                 "railway": {
                     "name": "Železnica"
                 },
                     "name": "Vzpenjača",
                     "terms": "tirna vzpenjača"
                 },
-                "railway/halt": {
-                    "name": "Železniško postajališče",
-                    "terms": "postaja brez perona in objektov"
-                },
                 "railway/level_crossing": {
                     "name": "Železniški prehod (cesta)"
                 },
                     "name": "Ozkotirna železnica",
                     "terms": "železnica z ozkimi tiri"
                 },
-                "railway/platform": {
-                    "name": "Železniški peron",
-                    "terms": "ploščad"
-                },
                 "railway/rail": {
                     "name": "Železniški tir",
                     "terms": "železnica,železniški tir,tirnica"
                 },
-                "railway/station": {
-                    "name": "Železniška postaja",
-                    "terms": "kolodvor"
-                },
                 "railway/subway": {
                     "name": "Podzemna železnica",
                     "terms": "metro"
                     "name": "Tramvaj",
                     "terms": "tramvaj"
                 },
-                "railway/tram_stop": {
-                    "name": "Postajališče tramvaja"
-                },
                 "relation": {
                     "name": "Zveza",
                     "terms": "relacija,povezava,odnos"
                     "name": "Draguljarna",
                     "terms": "bižuterija,nakit,zlatarna"
                 },
-                "shop/kiosk": {
-                    "name": "Kiosk prodajalna"
-                },
                 "shop/laundry": {
                     "name": "Pralnica",
                     "terms": "samopostrežna pralnica perila"
                 "description": "Satelitski posnetki DigitalGlobe Premium",
                 "name": "Posnetki DigitalGlobe Premium"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Pogoji uporabe in odziv"
+                },
+                "description": "Meje posnetkov in datumi zajema. Oznake se pojavijo na ravni povečave 14 in višjih."
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Pogoji uporabe in odziv"
                 "description": "Satelitski posnetki DigitalGlobe Standard",
                 "name": "Posnetki DigitalGlobe Standard"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Pogoji uporabe in odziv"
+                },
+                "description": "Meje posnetkov in datumi zajema. Oznake se pojavijo na ravni povečave 14 in višjih."
+            },
+            "EsriWorldImagery": {
+                "attribution": {
+                    "text": "Pogoji uporabe in odziv"
+                },
+                "description": "Posnetki sveta Esri",
+                "name": "Posnetki sveta Esri"
+            },
             "MAPNIK": {
                 "attribution": {
                     "text": "Skupnost © OpenStreetMap z dovoljenjem CC-BY-SA"
                 "name": "OSM Inspector: oznake"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann z dovoljenjem CC BY-SA 3.0, podatki zemljevida skupnost © OpenStreetMap  z dovoljenjem ODbL 1.0"
-                },
                 "name": "Waymarked Trails: kolesarjenje"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann z dovoljenjem CC BY-SA 3.0, podatki zemljevida skupnost © OpenStreetMap z dovoljenjem ODbL 1.0"
-                },
                 "name": "Waymarked Trails: pohodništvo"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann z dovoljenjem CC BY-SA 3.0, podatki zemljevida skupnost © OpenStreetMap z dovoljenjem ODbL 1.0"
-                },
                 "name": "Waymarked Trails: MTB"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann z dovoljenjem CC BY-SA 3.0, podatki zemljevida skupnost © OpenStreetMap z dovoljenjem ODbL 1.0"
-                },
                 "name": "Waymarked Trails: rolkanje in rolanje"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng z dovoljenjem CC BY-SA 3.0, podatki zemljevida skupnost © OpenStreetMap z dovoljenjem ODbL 1.0"
-                },
                 "name": "Waymarked Trails: zimski športi"
             },
             "basemap.at": {
index 6f6225e13f1b536d3fb77f480e9a30ded64afbae..3619e139b401987a8cfe8bb9c533d8c62ba2d9f5 100644 (file)
         "background": {
             "title": "Sfond",
             "description": "Parametrat e sfondit",
-            "percent_brightness": "{opacity}% duksmëri",
             "none": "Asnjë",
             "custom": "E personalizuar",
             "custom_button": "Redakto sfondin të personalizuar",
             "reset": "Rikthe vlerat",
             "minimap": {
-                "description": "Minihartë",
                 "tooltip": "Shfaq një hartë të zvogluar për të treguar vendosjen e zonës të dukshme."
             }
         },
                     "label": "Kapaciteti",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Drejtimi",
-                    "options": {
-                        "E": "Lindje",
-                        "ENE": "Lindje-verilindje",
-                        "ESE": "Lindje-juglindje",
-                        "N": "Veri",
-                        "NE": "Verilindje",
-                        "NNE": "Veri-verilindje",
-                        "NNW": "Veri-veriperëndim",
-                        "NW": "Variperëndim",
-                        "S": "Jug",
-                        "SE": "Juglindje",
-                        "SSE": "Jug-juglindje",
-                        "SSW": "Jug-jugperëndim",
-                        "SW": "Jugperëndim",
-                        "W": "Perëndim",
-                        "WNW": "Perëndim-veriperëndim",
-                        "WSW": "Perëndim-jugperëndim"
-                    }
-                },
-                "clock_direction": {
-                    "label": "Drejtimi",
-                    "options": {
-                        "anticlockwise": "Rotullimi antiorar",
-                        "clockwise": "Rotullimi orar"
-                    }
-                },
                 "country": {
                     "label": "Vendi"
                 },
index baae233e7b78e3d0ee6da2fd170106f2244dcae8..fb91222e42466b871b7daa1d555b25b964cd2308 100644 (file)
             "deleted": "Обрисано",
             "created": "Направљено",
             "about_changeset_comments": "О коментарима скупа измена",
-            "google_warning": "Споменули сте Гугл у овом коментару: имајте на уму да је копирање са Гугл мапа строго забрањено.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Споменули сте Гугл у овом коментару: имајте на уму да је копирање са Гугл мапа строго забрањено."
         },
         "contributors": {
             "list": "Измене од стране {users}",
                 "title": "Мера",
                 "selected": "{n} изабрано",
                 "geometry": "Геометрија",
-                "closed": "затворено",
                 "center": "Центар",
                 "perimeter": "Опсег",
                 "length": "Дужина",
             "title": "Позадина",
             "description": "Подешавања позадине",
             "key": "B",
-            "percent_brightness": "{opacity}% прозирно",
             "none": "Ниједна",
             "best_imagery": "Најбољи познати извор слика за овај положај",
             "switch": "Пребаци се на ову позадину",
             "custom": "Прилагођена",
             "custom_button": "Измени прилагођену позадину",
-            "fix_misalignment": "Подеси померај позадинске слике",
-            "imagery_source_faq": "Ко обезбеђује ове позадинске слике?",
             "reset": "ресет",
-            "offset": "Повуците било где у сивој области испод да бисте подесили поравнање слика или унели вредности помераја у метрима.",
             "minimap": {
-                "description": "Минимапа",
                 "tooltip": "Покажи умањену мапу како би вам помогло да пронађете тренутно приказано подручје.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Подеси померај позадинске слике",
+            "offset": "Повуците било где у сивој области испод да бисте подесили поравнање слика или унели вредности помераја у метрима."
         },
         "map_data": {
             "title": "Подаци мапе",
             "untagged_area_tooltip": "Изаберите врсту обележја која описује шта ова област представља.",
             "untagged_relation": "Неозначени однос",
             "untagged_relation_tooltip": "Изаберите врсту обележја која описује шта овај однос представља.",
-            "many_deletions": "Бришете {n} обележја. Да ли сте сигурни да желите то да урадите? Ово ће их избрисати са мапе коју сви виде на openstreetmap.org.",
             "tag_suggests_area": "Ознака {ознака} указује да би линија требало да буде област, али није област",
             "deprecated_tags": "Застареле ознаке: {tags}"
         },
         },
         "help": {
             "title": "Помоћ",
-            "key": "H",
-            "help": "# Помоћ\n\nОво је уређивач за [Опенстритмап](http://www.openstreetmap.org/), бесплатну\nи уредиву мапу света. Можете га користити за додавање и ажурирање\nподатака у вашој области, чинећи мапу света отвореног кода и\nотворених података бољим за свакога.\n\nИзмене које направите на овој мапи ће бити видљиве свима који користе\nОпенстритмап. Да бисте направили измене, мораћете се\n[пријавити](https://www.openstreetmap.org/login).\n\n[iD изређивач](http://ideditor.com/) је заједнички пројекат са [изворним\nкодом доступним на Гитхабу](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Уређивање и чување\n\nОвај уређивач је дизајниран првенствено за рад на мрежи, а приступате\nму непосредно преко сајта.\n\n### Избор обележја\n\nДа бисте изабрали обележје мапе, као што су пут или тачка од интереса,\nкликните на обележје на карти. Овим ће се означити изабрано обележје и\nучитати бочну траку са детаљима. Ако кликнете десним тастером миша на\nобележје, приказаће се мени са радњама које можете применити на дато\nобележје.\n\nДа бисте изабрали већи број обележја, држите притиснут тастер \"Shift\".\nЗатим или кликните на обележја која желите да изаберете, или превуците на\nмапи да бисте нацртали контуру око тих обележја. Све тачке унутар превученог\nподручја ће бити изабране.\n\n### Чување измена\n\nКада правите измене попут уређивања путева, зграда и места, оне се\nлокално чувају на рачунару док их не сачувате на серверу. Не брините ако\nнаправите грешку - можете поништити измене кликом на дугме за отказивање\nи поновити измене кликом на дугме Поново.\n\nКликните на 'Сачувај' да бисте довршили групу измена - на пример, ако сте\nзавршили подручје града и волели бисте да започне на новом подручју.\nИмате прилику да прегледате шта сте урадили, а уређивач вам даје корисне\nпредлоге и упозорења ако нешто од измена не изгледа исправно.\n\nАко све изгледа добро, можете додати кратак коментар који објашњава измену\nкоју сте направили и кликните на 'Учитај' да бисте објавили измене на\n[OpenStreetMap.org](http://www.openstreetmap.org/), где ће бити видљиве\nсвим осталим корисницима и доступне другима за надоградњу и побољшање.\n\nАко не можете завршити своје измене током једној сесији, можете оставити\nпрозор уређивача и вратити се (на истом претраживачу и рачунару),\nа уређивачка апликација ће вам понудити да повратите свој рад.\n\n### Коришћење уређивача\n\nМожете прегледати списак пречица на тастатури притиском на тастер `?`.\n",
-            "roads": "# Путеви\n\nМожете додавати, поправљати и брисати путеве помоћу овог уређивача.\nПутеви могу бити различитих врста: улице, ауто-путеви, стазе, бициклистичке\nстазе и друго - било који често коришћена саобраћајна путања би требало да\nбуде уцртана.\n\n### Избор\n\nКликните на пут да бисте га изабрали. Требало би да постане видљиво\nуоквирен са бочном траком која приказује више информација о путу.\nАко кликнете десним тастером миша на њега, појавиће се мени са\nоперацијама које можете применити на пут.\n\n### Измена\n\nЧесто ћете видети путеве који нису усклађени са сликама иза њих\nили са ГПС путањама. Ове путеве можете прилагодити тако да су у\nисправном положају.\n\nПрво кликните на пут који желите да промените. Овим ћете га обележити\nи приказаће се контролне тачке дуж пута, које можете превући на боље\nположаје. Ако желите додати нове контролне тачке за више детаља, кликните\nдвапут на део пута без чвора, и један ће бити додат.\n\nАко је пут повезан са другим путем, али није правилно повезан на\nмапи, можете превући једну од његових контролних тачака на други пут\nкако би се спојили. Повезивање путева је важно за мапу и суштински за\nдавање упутстава приликом вожње.\n\nТакође можете кликнути десним тастером миша и одабрати алат 'Премести'\nили једноставно притиснути тастер `M`, да бисте од једном померили цео пут,\nа затим кликните поново да бисте сачували померање.\n\n### Брисање\n\nАко је пут у потпуности нетачан - можете видети да не постоји на сателитској\nслици и у најбољем случају локално можете потврдити да није присутан - можете\nга избрисати, чиме се уклања са мапе. Будите опрезни приликом брисања обележја -\nкао и код сваке друге измене, резултате може видети свако, а сателитски снимци\nсу често застарели, тако да пут може једноставно бити новоизграђен.\n\nМожете избрисати пут кликом на њега да бисте га изабрали, а затим притисните\n'Избриши' тастер, или десним тастером миша, а затим кликните на икону за смеће.\n\n### Додавање\n\nПронашли сте место на коме би требало да постоји пут, али није уцртан?\nКликните на дугме 'Путања' у горњем левом углу уређивача, или притисните тастер\n`2`  као пречицу, да бисте започели цртање путање.\n\nКликните на почетак пута на мапи да бисте започели цртање. Ако се пут\nграна са постојећег пута, почните цртање кликом на место где се повезују.\n\nЗатим кликните на тачке дуж пута тако да следи праву путању, према сателитском\nснимку или ГПС путањи. Ако пут који нацртате пресеца други пут, повежите их\nкликом на тачку пресека. Када завршите са цртањем, кликните двапут или\nпритисните \"Return\" или \"Enter\" на вашој тастатури.\n",
-            "imagery": "# Снимци\n\nСнимци из ваздуха су важан ресурс за мапирање. Комбинација\nавионских прелета, сателитских приказа и слободно састављених извора су на\nрасполагању у уређивачу испод менија 'Подешавања позадине' са десне стране.\n\nПодразумевано је представљен [Bing Maps](http://www.bing.com/maps/) слој\nсателитских снимака у уређивачу, али као померате и увећавате мапу на нова географска\nподручја, нови извори ће постати доступни. Неке земље, попут Сједињених\nДржава, Француске и Данске имају веома квалитетне снимке доступна за неке области.\n\nСнимак је некада померен у односу на податке на мапи због грешке од страни\nдобављача снимака. Ако видите много путева померених у односу на позадину,\nнемојте их одмах преместити све да одговарају позадини. Уместо тога можете подесити\nслике тако да одговарају постојећим подацима кликом на 'Поправи поравнање' на\nдну интерфејса Подешавање позадине.\n",
-            "addresses": "# Адресе\n\nАдресе су једне од најкориснијих информација на мапи.\n\nИако су адресе често представљене као делови улица, у Опенстреетмап\nсу забележене као атрибути објеката и места дуж улица.\n\nМожете да додате информације о адреси на местима мапираним као основе зграде\nкао и оних мапираних као појединачне тачке. Оптимални извор података  адреса\nје од премеравања на терену или лично знање - као и са било којим\nдругим објектом, копирање са комерцијалних извора, као што су Гугл мапе је строго\nзабрањено.\n",
-            "buildings": "# Грађевине\n\nОпенстритмап је највећа светска база података о грађевинама. Можете\nдодавати и побољшати ову базу података.\n\n### Избор\n\nМожете изабрати грађевину кликом на њене оквире. Овим ће се обележити\nграђевина и приказати бочна трака са додатним информацијама о објекту.\nАко кликнете десним тастером миша на грађевину, приказаће се мени операција\nкоје можете извршити над објектом.\n\n### Измена\n\nПонекад су грађевине неправилно постављене или имају нетачне ознаке.\n\nДа бисте преместили целу грађевину, изаберите је и притисните тастер 'M',\nили кликните десним тастером миша и изаберите алат 'Премести'. Померите\nпоказивач миша за премештање зграде и кликните када је исправно постављена.\n\nДа бисте поправили специфичан облик грађевине, кликните и превуците\nчворове који формирају границу објекта на боље место.\n\n### Додавање\n\nЈедно од главних недоумица око додавања грађевина на мапу је то што их\nОпенстритмап чува, и као облике, и као чворове. Правило је да  се _дода\nграђевина као облик кад год је то могуће_, и да се мапирају предузећа, куће,\nпогодности и друга обележја као чворове у оквиру грађевине.\n\nПочните да цртате грађевину као облик кликом на дугме 'Област' у горњем левом\nделу уређивача и завршите га притиском на 'Return' на вашој тастатури,\nили кликом на први нацртан чвор, за затварање облика.\n\n### Брисање\n\nАко је грађевина у потпуности нетачна - видећете да не постоји на сателитском\nснимку, и у најбољем случају, потврдили сте локално да није присутна - можете\nје избрисати, чиме се уклања са мапе. Будите опрезни приликом брисања обележја -\nкао и било које друго уређивање, резултате може видети свако, а сателитски снимци\nсу често застарели, па би грађевина могла једноставно бити новоизграђена.\n\nМожете обрисати грађевину кликом на њу да бисте је изабрали, а затим притисните\nтастер 'Delete', или кликните десним тастером миша, а затим на икону за смеће.\n"
+            "key": "H"
         },
         "intro": {
             "done": "готово",
                     "label": "Капацитет",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Правац",
-                    "options": {
-                        "E": "исток",
-                        "ENE": "исток-североисток",
-                        "ESE": "исток-југоисток",
-                        "N": "север",
-                        "NE": "североисток",
-                        "NNE": "север-северозапад",
-                        "NNW": "север-северозапад",
-                        "NW": "северозапад",
-                        "S": "југ",
-                        "SE": "југоисток",
-                        "SSE": "југ-југоисток",
-                        "SSW": "југ-југозапад",
-                        "SW": "југозапад",
-                        "W": "Запад",
-                        "WNW": "Запад-северозапад",
-                        "WSW": "Запад-југозапад"
-                    }
-                },
                 "castle_type": {
                     "label": "Врста"
                 },
-                "clock_direction": {
-                    "label": "Правац",
-                    "options": {
-                        "anticlockwise": "супротно смеру казаљке на сату",
-                        "clockwise": "у смеру казаљке на сату"
-                    }
-                },
                 "clothes": {
                     "label": "Одећа"
                 },
                 "par": {
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Смер",
-                    "options": {
-                        "backward": "Уназад",
-                        "forward": "Напред"
-                    }
-                },
                 "park_ride": {
                     "label": "Подстицај паркирања"
                 },
                 "recycling_accepts": {
                     "label": "Пријем"
                 },
-                "recycling_type": {
-                    "label": "Врста рециклаже",
-                    "options": {
-                        "centre": "Рециклажни центар",
-                        "container": "Контејнер"
-                    }
-                },
                 "ref": {
                     "label": "Референтни код"
                 },
                 "amenity/bureau_de_change": {
                     "name": "Мењачница"
                 },
-                "amenity/bus_station": {
-                    "name": "Аутобуска станица"
-                },
                 "amenity/cafe": {
                     "name": "Кафе"
                 },
                 "amenity/fast_food": {
                     "name": "Брза храна"
                 },
-                "amenity/ferry_terminal": {
-                    "name": "Терминал трајекта"
-                },
                 "amenity/fire_station": {
                     "name": "Ватрогасна станица"
                 },
                 "amenity/ranger_station": {
                     "name": "Шумарска станица"
                 },
-                "amenity/recycling": {
-                    "name": "Рециклажа"
-                },
                 "amenity/recycling_centre": {
                     "name": "Рециклажни центар"
                 },
                     "name": "Коњичка стаза",
                     "terms": "коњичка стаза,коњска стаза,јахачка стаза"
                 },
-                "highway/bus_stop": {
-                    "name": "Аутобуско стајалиште"
-                },
                 "highway/crossing": {
                     "name": "Прелаз преко улице"
                 },
                 "landuse/forest": {
                     "name": "Шума"
                 },
-                "landuse/garages": {
-                    "name": "Гараже"
-                },
                 "landuse/grass": {
                     "name": "Трава"
                 },
                 "power/transformer": {
                     "name": "Трансформатор"
                 },
-                "public_transport/platform": {
-                    "name": "Платформа"
-                },
                 "railway": {
                     "name": "Железничка пруга"
                 },
                 "railway/narrow_gauge": {
                     "name": "Уски колосек"
                 },
-                "railway/platform": {
-                    "name": "Железничка платформа"
-                },
                 "railway/rail": {
                     "name": "Шина"
                 },
-                "railway/station": {
-                    "name": "Железничка станица"
-                },
                 "railway/subway": {
                     "name": "Подземна железница"
                 },
                 "shop/jewelry": {
                     "name": "Златар"
                 },
-                "shop/kiosk": {
-                    "name": "Трафика"
-                },
                 "shop/kitchen": {
                     "name": "Кухињски дизајн"
                 },
index 9d9295a6820a3a1ed815b5700a090bc9d285f271..f6447301cd71dc21f1bfd1b3b0c5c13ff0d9e132 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Klicka för att lägga till fler punkter till linje. Klicka på andra linjer för att förbinda dem och dubbelklicka för att avsluta linjen."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Detta kan inte redigeras då det är anslutet till ett dolt objekt."
             }
         },
         "operations": {
                 "title": "Mätning",
                 "selected": "{n} markerad(e)",
                 "geometry": "Geometri",
-                "closed": "slutet",
                 "center": "Centrum",
                 "perimeter": "Omkrets",
                 "length": "Längd",
                 "centroid": "Centrumpunkt",
                 "location": "Placering",
                 "metric": "Metriskt",
-                "imperial": "Brittiskt"
+                "imperial": "Brittiskt",
+                "node_count": "Antal noder"
             }
         },
         "geometry": {
             "title": "Bakgrund",
             "description": "Bakgrundsinställningar",
             "key": "B",
-            "percent_brightness": "{opacity}% ljusstyrka",
+            "backgrounds": "Bakgrunder",
             "none": "Ingen",
             "best_imagery": "Populäraste källan till flygfoton för den här platsen",
             "switch": "Växla tillbaka till denna bakgrund",
             "custom": "Anpassa",
             "custom_button": "Ändra anpassad bakgrund",
-            "custom_prompt": "Ange en URL-mall för plattor. Giltiga nycklar är:\n  - {zoom}/{z}, {x}, {y} enligt Z/X/Y-schema\n  - {ty} för Y-koordinat enligt omvänd TMS-stil\n  - {u} för QuadTile-scheman\n  - {switch:a,b,c} för multiplex mot DNS-server\n\nExempel:\n{example}",
-            "fix_misalignment": "Justera bildplacering",
-            "imagery_source_faq": "Var kommer dessa flygfoton från?",
+            "overlays": "Bildlager",
+            "imagery_source_faq": "Info om flygfotot / Rapportera ett problem",
             "reset": "ta bort",
-            "offset": "Dra i den grå ytan nedan för att justera bildplaceringen, eller ange hur mycket det ska justeras i meter.",
+            "display_options": "Visningsinställningar",
+            "brightness": "Ljusstyrka",
+            "contrast": "Kontrast",
+            "saturation": "Mättnad",
+            "sharpness": "Skärpa",
             "minimap": {
-                "description": "Minikarta",
+                "description": "Visa minikarta",
                 "tooltip": "Visar en utzoomad karta för att hjälpa dig att hitta i området som visas för tillfället.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Justera bildplacering",
+            "offset": "Dra i den grå ytan nedan för att justera bildplaceringen, eller ange hur mycket det ska justeras i meter."
         },
         "map_data": {
             "title": "Kartdata",
             "untagged_area_tooltip": "Välj en typ som beskriver vad detta område är.",
             "untagged_relation": "Otaggad relation",
             "untagged_relation_tooltip": "Välj en typ som beskriver vad denna relation är.",
-            "many_deletions": "Du håller på att radera {n} objekt. Är du helt säker att du vill göra detta? Detta tar bort dem från kartan som alla andra ser på openstreetmap.org.",
             "tag_suggests_area": "Taggen {tag} indikerar att detta borde vara ett område istället för en linje",
             "deprecated_tags": "Föråldrade taggar: {tags}"
         },
         "help": {
             "title": "Hjälp",
             "key": "H",
-            "help": "# Hjälp\n\nDetta är en redigerare för [OpenStreetMap](http://www.openstreetmap.org/),\nen gratis och redigerbar karta över världen. Du kan använda den för att lägga till och ändra\ndata i ditt område, allt för att göra en världsomspännande karta baserad på\nöppen källkod och öppen data bättre för alla.\n\nRedigeringar du gör på kartan kommer att visas för alla som använder\nOpenStreetMap. För att göra en redigering måste du\n[logga in](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) är ett gemensamt projekt med [källkod\ntillgänglig på GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Redigera & spara\n\nDenna redigerare är främst gjord för att fungera online, och du använder den via en webbsida just nu.\n\n### Markera objekt\n\nFör att välja ett kartobjekt, t.ex. en väg eller en punkt, klicka på det på kartan. Detta markerar det valda objektet och laddar en sidopanel med detaljer om det. Om du högerklickar på det visas en meny med saker du kan göra med objektet.\n\nFör att markera flera objekt, håll ned Shift-tangenten. Klicka sedan på objekten du vill markera eller dra på kartan för att rita en kontur runt objekten. Alla punkter inuti ritat område kommer att markeras .\n\n### Spara redigeringar\n\nNär du gör ändringar såsom att ändra på en väg, byggnad eller plats är detta lagrat lokalt fram till att du sparar det på servern. Oroa dig inte om du gör ett misstag, du kan alltid ångra en ändring genom att klicka på Ångra-knappen och göra om din förändring genom att klicka på Gör om-knappen.\n\nKlicka på Spara för att slutföra en samling förändringar, t.ex. om du har gjort färdigt ett område i en stad och vill börja ändra i ett annat område. Du får möjlighet att granska vad du har gjort och redigeraren ger dig hjälpsamma förslag och varningar om någon ändring inte verkar korrekt.\n\nOm allt ser bra ut kan du ange en kort kommentar som förklarar vad du har gjort, och sedan klicka på 'Ladda upp' för att skicka ändringarna till [OpenStreetMap.org](http://www.openstreetmap.org/) där de blir synliga för alla andra användare och tillgängliga för andra att jobba vidare med.\n\nOm du inte kan slutföra din ändring på en gång kan du lämna redigeringsfönstret öppet och komma tillbaka (i samma webbläsare på samma dator) och redigeringsprogrammet kommer att ge dig möjlighet att återuppta ditt arbete.\n\n### Använda redigeraren\n\nDu kan se en lista med kortkommandon genom att trycka på tangenten `?`\n",
-            "roads": "# Vägar\n\nDu kan skapa, fixa och ta bort vägar med denna redigerare. Vägar kan vara alla typer av: stigar, bilvägar, spår, cykelvägar m.m. - alla välanvända segment ska kartläggas.\n\n### Markering\n\nKlicka på en väg för att välja den. En markering blir då synlig tillsammans med en sidopanel som visar mer information om vägen. Om du högerklickar på den får du en meny med åtgärder du kan utföra på vägen.\n\n### Modifiering\n\nOfta ser du vägar som inte är justerade till bakgrundsbilden eller till ett GPS-spår. Du kan justera dessa vägar så att de hamnar på rätt plats.\n\nKlicka först på vägen du vill ändra. Detta kommer att markera den och visa kontrollpunkter längs den som du kan dra i för att justera den. Om du vill lägga till en ny kontrollpunkt för högre detaljrikedom, dubbelklicka på en del av vägen utan en punkt så kommer en kontrollpunkt att läggas till.\n\nOm vägen är ansluten till en annan väg, men inte är det på kartan, kan du dra en av dess kontrollpunkter till den andra vägen för att koppla ihop dem. Att vägarna är kopplade till varandra är viktigt för kartan och avgörande för att kunna ge korrekta körinstruktioner.\n\nDu kan också högerklicka på den och välja 'Flytta', eller helt enkelt trycka på tangenten 'M' på tangentbordet, för att flytta en hel väg på en gång, och sedan klicka igen för att spara flytten.\n\n### Radering\n\nOm hela vägen är helt fel - du kan se att den inte existerar på satellitbilderna och har helst bekräftat i verkligheten att den inte finns - kan du radera den, vilket tar bort den från kartan. Var försiktigt när du raderar objekt - precis som vid all redigering kan alla se resultatet och satellitbilderna är ofta gamla, så vägen kan helt enkelt vara nybyggd.\n\nDu kan radera en väg genom att klicka på den för att markera den, och sedan trycka på tangenten 'Delete' eller högerklicka på den och klicka på soptunnan.\n\n### Skapa\n\nHar du hittat någonstans att det borde finnas en väg där det inte finns en? Klicka på ikonen 'Linje' högst upp till vänster i redigeringsfönstret eller klicka på knappen '2' på tangentbordet för att börja rita en linje.\n\nKlicka på början av vägen på kartan för att påbörja ritningen. Om vägen viker av från en existerande väg, starta genom att klicka där de ansluter till varandra.\n\nKlicka sedan på punkter längs vägen så att den följer vägens sträckning enligt satellitbilder eller GPS-spår. Om vägen du ritar korsar en annan väg, anslut dem genom att klicka där de korsar varandra. När du är klar med att rita in vägen, dubbelklicka eller tryck 'Enter' på tangentbordet.\n",
-            "gps": "# GPS\n\nInsamlade GPS-spår är en värdefull källa för data till OpenStreetMap. Den här redigeraren\nstöder lokala spår - .gpx-filer på din lokala dator. Du kan samla\nin denna typ av GPS-spår med ett antal olika appar till din smartphone eller en GPS-enhet.\n\nFör information om hur du gör en GPS-uppmätning, läs\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nFör att använda ett GPX-spår för att kartlägga, dra och släpp GPX-filen på kartredigeraren.\nOm den accepteras kommer det att läggas till på kartan som en ljuslila\nlinje. Klicka på menyn Kartdata till höger för att aktivera,\navaktivera eller zooma in till detta nya GPX-skapade lager.\n\nGPX-spåret laddas inte direkt upp till OpenStreetMap - bästa sättet att använda\ndet är att rita på kartan och använda det som en guide för att lägga till ny information,\nmen också för att [ladda upp det till OpenStreetMap] (http://www.openstreetmap.org/trace/create)\nså att andra kan använda det.\n",
-            "imagery": "# Flygfoton\n\nFlygfoton är en viktig källa vid kartläggning. En kombination av bilder från flygplan, satelliter och andra fria källor finns tillgängliga i redigeraren i menyn 'Bakgrundsinställningar' till höger.\n\nNormalt visas ett satellitlager från [Bing Maps](http://www.bing.com/maps/) i redigeraren, men när du förflyttar dig runt och zoomar till nya geografiska områden kommer nya källor att bli tillgängliga. Vissa länder, som t.ex. USA, Frankrike och Danmark har bilder av väldigt hög kvalitet tillgängliga för vissa områden.\n\nFlygfotona är ibland förskjutna jämfört med kartan på grund av misstag från leverantören av flygfoton. Om du ser att många vägar är förskjutna i förhållande till flygfotot, flytta dem inte direkt för att matcha bakgrunden. Istället kan du justera flygfotot så att det matchar med existerande data genom att klicka 'Justera bildplacering' längst ned i menyn för Bakgrundsinställningar.\n",
-            "addresses": "# Adresser\n\nAdresser är bland den mest användbara informationen på kartan.\n\nÄven om adresser normalt är relaterade till segment av gatan är de i OpenStreetMap hanterade som attribut på byggnader och platser längs gatan.\n\nDu kan lägga till adressinformation både på platser kartlagda som byggnadskonturer och på platser kartlagda som enskilda punkter.\nDen bästa källan för adressinformation är från egen kunskap eller genom att besöka platsen - precis som för allt annat; att kopiera från kommersiella källor som Google Maps är strikt förbjudet.\n",
-            "inspector": "# Använda objektredigeraren\n\nObjektredigeraren är området till vänster på sidan som låter dig\nändra detaljerna för valt objekt.\n\n### Välj objekttyp\n\nEfter att du har lagt till en punkt, linje eller ett område kan du välja vad för typ av objekt det\när, t.ex. om det är en huvudväg eller bostadsgata, shoppingcenter eller café.\nObjektredigeraren visar knappar för vanliga objekttyper, och du kan\nsöka efter andra typer i sökfönstret.\n\nKlicka på 'i' i nedre högra hörnet för en objekttyp för\natt läsa mer om det. Klicka på en knapp för att välja typ.\n\n### Använda formulär och ändra taggar\n\nEfter att du har valt en objekttyp, eller om du väljer ett objekt som redan\nhar en typ associerad, kommer objektredigeraren att visa fält med detaljer om objekttypen såsom namn och adress.\n\nUnder fälten du ser kan du klicka på menyn 'Lägg till fält\" för att lägga till\nandra detaljer, som t.ex. Wikipedia-länk, handikappanpassning m.m.\n\nLängst ned i objektredigeraren, klicka på 'Alla taggar' för att lägga till ytterligare godtyckliga\ntaggar till objektet. [Taginfo](http://taginfo.openstreetmap.org/) är en\nbra resurs för att lära dig mer om populära tagg-kombinationer.\n\nÄndringar du gör i objektredigeraren visas automatiskt på kartan.\nDu kan ångra dem när du vill genom att klicka på 'Ångra'-knappen.\n",
-            "buildings": "# Byggnader\n\nOpenStreetMap är världens största databas över byggnader. Du kan skapa\noch förbättra denna databas.\n\n### Markering\n\nDu kan markera en byggnad genom att klicka på dess kant. Detta kommer att markera byggnaden och ladda en sidopanel som visar mer information om byggnaden. Om du högerklickar på den, kommer det att visas en meny med åtgärder du kan utföra på byggnaden.\n\n### Modifiering\n\nIbland är byggnader felaktigt placerade eller har felaktiga taggar.\n\nFör att flytta en hel byggnad, markera den och tryck på tangenten 'M', eller högerklicka och välj alternativet 'Flytta'. Rör på musen för att flytta byggnaden, och klicka när den är korrekt placerad.\n\nFör att fixa den specifika formen av en byggnad, klicka och dra noderna som bildar\nramen till bättre platser.\n\n### Skapa\n\nEn av de viktigaste frågorna att tänka på vid tilläggning av byggnader till kartan är att\nOpenStreetMap registrerar byggnader både som form och punkt. Tumregeln\när att _kartlägga en byggnad som en form när möjligt_ och kartlägg företag, bostäder,\nfaciliteter, och andra saker finns i byggnaderna som punkter placerade\ninuti byggnadernas ram.\n\nBörja rita en byggnad som en ram genom att klicka på knappen \"område\" högst upp till vänster\ngränssnittet, och avsluta det antingen genom att trycka på \"Enter\" på tangentbordet\neller genom att klicka på den först ritade noden för att sluta formen.\n\n### Radering\n\nOm en byggnad är helt fel – du kan se att den inte finns med i någon satellitbild\noch har helst bekräftat lokalt att den inte finns – kan du ta bort\nden, vilket tar bort den från kartan. Var försiktig när du tar bort objekt –\nlikt alla ändringar kommer resultatet ses av alla och satellitbilder\när ofta föråldrade, så byggnaden kan helt enkelt vara nybyggd.\n\nDu kan ta bort en byggnad genom att klicka på den för att markera den och sedan klicka på tangenten 'Delete', eller högerklicka och på den och sedan klicka på soptunnan.\n",
-            "relations": "# Relationer\n\nEn relation är en speciell typ av egenskap i OpenStreetMap som grupperar objekt. Två vanliga relationstyper är t.ex. *ruttrelation* som grupperar vägsträckor som tillhör en specifik riksväg eller motorväg, och *multipolygoner* som grupperar linjer som definierar ett komplext område (som t.ex. har flera delar eller hål i sig)\n\nObjekten i en relation kallas *medlemmar*. Längst ned i sidopanelen kan du se vilka relationer ett objekt är medlem i, och ett klick på en relation kommer att markera den. När relationen är markerad kan du se alla medlemmar listade i sidopanelen och markerade på kartan.\n\nFör det mesta kommer iD att ta hand om relationerna automatiskt när du redigerar. Det viktigaste du måste veta om är att om du tar bort en vägsträcka för att rita om den mer exakt, måste du se till att den nya sträckan är medlem i samma relation som originalet.\n\n## Redigera relationer\n\nOm du vill redigera relationer är här grunderna.\n\nFör att lägga till ett objekt i en relation, markera objektet och klicka på \"+\"-knappen i sektionen \"Alla relationer\" i sidopanelen, och välj sedan eller skriv namnet på relationen.\n\nFör att skapa en ny relation, markera det första objektet som ska vara medlem i relationen, klicka på \"+\"-knappen i sektionen \"Alla relationer\" och välj \"Ny relation...\"\n\nFör att ta bort ett objekt från en relation, markera objektet och klicka på soptunnan bredvid relationen du vill ta bort den från.\n\nDu kan skapa multipolygoner med hål i sig med verktyget \"sammanfoga\". Rita två områden (inre och yttre), håll ned shift-tangenten och klicka på var och en av dem för att markera båda, tryck sedan på tangenten 'C'. Ett annat alternativ är att markera båda, och sedan högerklicka på en av dem och sedan klicka på knappen 'Sammanfoga' (+).\n"
+            "help": {
+                "title": "Hjälp",
+                "welcome": "Välkommen till iD, kartredigeraren för  [OpenStreetMap](https://www.openstreetmap.org/). Men denna kan du uppdatera OpenStreetMap direkt från webbläsaren. ",
+                "open_data_h": "Öppen data",
+                "open_data": "Ändringar du gör på kartan kommer att vara synliga för alla som använder OpenStreetMap. Dina ändringar kan vara baserade på egen kunskap, undersökningar på plats eller bilder  som samlats in från flyg eller på gatunivå. Kopiering från kommersiella källor, till exempel Google Maps, är [strängt förbjudet](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Innan du börjar",
+                "before_start": "Du bör vara bekant med OpenStreetMap och denna redigerare innan du börja redigera. iD har en genomgång för att lära dig grunderna i att redigera på OpenStreetMap. Klicka på \"Starta genomgången\" på skärmen för att komma till genomgången - det tat bara omkring 15 minuter. ",
+                "open_source_h": "Öppen källkod",
+                "open_source": "iD-redigeraren är ett open source-projekt gemensamt framtaget av dess användare, och du använder nu version {version}. Källkoden finns tillgänglig [på GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Du kan hjälpa iD genom att [översätta text](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) och [rapportera buggar](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Översikt",
+                "navigation_h": "Navigation",
+                "navigation_drag": "Du kan dra kartan genom att hålla ned {leftclick} vänster musknapp och flytta runt musen. Du kan också använda `↓`, `↑`, `←`, `→` piltangenterna på ditt tangentbord.",
+                "navigation_zoom": "Du kan zooma in eller ut genom att rulla med mushjulet eller styrplattan eller genom att klicka på knapparna {plus} / {minus} vid sidan av kartan. Du kan också använda knapparna `+`, `-` på ditt tangentbord.",
+                "features_h": "Kartobjekt",
+                "features": "Vi använder ordet *objekt* för att beskriva saker som förekommer på kartan, så som vägar, byggnader eller intressanta platser. Allt i den verkliga världen kan karteras som ett objekt på OpenStreetMap. Kartobjekt representeras på kartan av *punkter*, *linjer* och *områden*.",
+                "nodes_ways": "I OpenStreetMap kallas ibland punkter för *noder*, och linjer och områden kallas ibland för *vägar*."
+            },
+            "editing": {
+                "title": "Redigera & spara",
+                "select_h": "Markera",
+                "select_left_click": "{leftclick} Vänsterklicka på ett objekt för att markera det. Markeringen kommer att synas med ett pulserande glöd, och sidopanelen kommer att visa detaljer om objektet, så som namn och adress.",
+                "select_right_click": "{rightclick} Högerklicka på ett objekt för att visa redigerarmenyn vilken innehåller kommandon som är tillgängliga, så som rotera, flytta och ta bort. ",
+                "multiselect_h": "Markera flera",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Vänsterklicka för att markera flera objekt tillsammans. Detta gör det enkelt att flytta och ta bort flera objekt samtidigt.",
+                "multiselect_lasso": "Ett annat sätt att markera flera objekt är att hålla ned `{shift}`-tangenten, trycka och hålla ned {leftclick} vänster musknapp och sedan dra med musen för att rita ett markeringslasso. Alla punkter inuti lassot kommer att markeras.",
+                "undo_redo_h": "Ångra & gör om"
+            }
         },
         "intro": {
             "done": "klar",
             },
             "areas": {
                 "title": "Områden",
-                "add_playground": "*Områden* används för att visa avgränsningar för objekt så som sjöar, byggnader och bostadsområden.{br}De kan också användas för mer detaljerad kartläggning av många objekt som du kanske normalt skulle kartlägga som punkter. **Klicka på knappen {button} Område för att skapa ett nytt område.**",
                 "start_playground": "Låt oss lägga till denna lekplats på kartan genom att rita ett område. Områden ritas genom att placera *noder* längs yttre kanten av objektet. **Klicka eller tryck mellanslag för att placera en startnod på ett av hörnen av lekplatsen.**",
                 "continue_playground": "Fortsätt rita området genom att placera noder längs kanten på lekplatsen. Det är ok att ansluta området till existerande gångvägar.{br}Tips: Du kan hålla ned '{alt}'-tangenten för att förhindra att noder kopplas ihop med andra objekt. **Fortsätt att rita ett område runt lekplatsen.**",
                 "finish_playground": "Slutför området genom att trycka Enter eller genom att trycka igen på antingen första eller sista noden. **Rita färdigt området för lekplatsen.**",
                 "brand": {
                     "label": "Varumärke"
                 },
+                "brewery": {
+                    "label": "Ölmärken"
+                },
                 "bridge": {
                     "label": "Typ",
                     "placeholder": "Standard"
                     "label": "Kapacitet",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Riktning",
-                    "options": {
-                        "E": "Öster",
-                        "ENE": "Ostnordost",
-                        "ESE": "Ostsydost",
-                        "N": "Norr",
-                        "NE": "Nordost",
-                        "NNE": "Nordnordost",
-                        "NNW": "Nordnordväst",
-                        "NW": "Nordväst",
-                        "S": "Söder",
-                        "SE": "Sydost",
-                        "SSE": "Sydsydost",
-                        "SSW": "Sydsydväst",
-                        "SW": "Sydväst",
-                        "W": "Väster",
-                        "WNW": "Västnordväst",
-                        "WSW": "Västsydväst"
-                    }
-                },
                 "castle_type": {
                     "label": "Typ"
                 },
-                "clock_direction": {
-                    "label": "Riktning",
-                    "options": {
-                        "anticlockwise": "Motsols",
-                        "clockwise": "Medsols"
-                    }
-                },
                 "clothes": {
                     "label": "Kläder"
                 },
                 "diaper": {
                     "label": "Skötbord tillgängligt"
                 },
+                "direction": {
+                    "label": "Riktning (grader medurs)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Riktning",
+                    "options": {
+                        "E": "Öster",
+                        "ENE": "Ostnordost",
+                        "ESE": "Ostsydost",
+                        "N": "Norr",
+                        "NE": "Nordost",
+                        "NNE": "Nordnordost",
+                        "NNW": "Nordnordväst",
+                        "NW": "Nordväst",
+                        "S": "Söder",
+                        "SE": "Sydöst",
+                        "SSE": "Sydsydost",
+                        "SSW": "Sydsydväst",
+                        "SW": "Sydväst",
+                        "W": "Väster",
+                        "WNW": "Västnordväst",
+                        "WSW": "Västsydväst"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Riktning",
+                    "options": {
+                        "anticlockwise": "Moturs",
+                        "clockwise": "Medurs"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Riktning",
+                    "options": {
+                        "backward": "Bakåt",
+                        "both": "Båda / Alla",
+                        "forward": "Framåt"
+                    }
+                },
                 "display": {
                     "label": "Visning"
                 },
                 "memorial": {
                     "label": "Typ"
                 },
-                "milestone_position": {
-                    "label": "Position förhållande till kilometerstolpe",
-                    "placeholder": "Distans med en decimal (123.4)"
+                "monitoring_multi": {
+                    "label": "Mäter"
                 },
                 "mtb/scale": {
                     "label": "Mountainbike-svårighet",
                     "label": "Par",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Riktning",
-                    "options": {
-                        "backward": "Bakåt",
-                        "forward": "Framåt"
-                    }
-                },
                 "park_ride": {
                     "label": "Pendelparkering"
                 },
                 "railway": {
                     "label": "Typ"
                 },
+                "railway/position": {
+                    "label": "Position förhållande till kilometerstolpe",
+                    "placeholder": "Distans med en decimal (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Riktning",
+                    "options": {
+                        "backward": "Bakåt",
+                        "both": "Båda / Alla",
+                        "forward": "Framåt"
+                    }
+                },
                 "rating": {
                     "label": "Märkeffekt"
                 },
                 "recycling_accepts": {
                     "label": "Accepterar"
                 },
-                "recycling_type": {
-                    "label": "Återvinningstyp",
-                    "options": {
-                        "centre": "Återvinningscentral",
-                        "container": "Container"
-                    }
-                },
                 "ref": {
                     "label": "Referenskod"
                 },
+                "ref/isil": {
+                    "label": "ISIL-kod"
+                },
                 "ref_aeroway_gate": {
                     "label": "Gatenummer"
                 },
                 "traffic_signals": {
                     "label": "Typ"
                 },
+                "traffic_signals/direction": {
+                    "label": "Riktning",
+                    "options": {
+                        "backward": "Bakåt",
+                        "both": "Båda / Alla",
+                        "forward": "Framåt"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Synlighet",
                     "options": {
                     "terms": "Replift, släplift, skidlift, linbana, lift"
                 },
                 "aerialway/station": {
-                    "name": "Linbanestation",
-                    "terms": "Linbanestation, station, linbana"
+                    "name": "Linbanestation"
                 },
                 "aerialway/t-bar": {
                     "name": "Ankarlift",
                     "terms": "Växlingskontor, växling, valuta, pengar, pengaväxling, resecheckar, pengaväxlare"
                 },
                 "amenity/bus_station": {
-                    "name": "Busstation",
-                    "terms": "Busstation, bussterminal, terminal, Busshållplats, resecenter, buss"
+                    "name": "Busstation / Bussterminal"
                 },
                 "amenity/cafe": {
                     "name": "Café",
                     "terms": "Snabbmat, skräpmat, gatuköksmat, bukfylla, junk-food, gatukök, restaurang, takeaway, hämtmat"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Färjeterminal",
-                    "terms": "Färjeterminal, terminal, färja, båtterminal, båthållplats"
+                    "name": "Färjeterminal / Färjehållplats / Färjestation"
                 },
                 "amenity/fire_station": {
                     "name": "Brandstation",
                     "terms": "Friluftsanläggningen, friluftsområde, park, friluftsliv, infocenter, informationscenter, besökscenter"
                 },
                 "amenity/recycling": {
-                    "name": "Återvinning",
-                    "terms": "återvinning, återbruk, återvinningsstation, sopstation, burkar, flaskor, skrot, skräp"
+                    "name": "Återvinningscontainer ",
+                    "terms": "återvinning, återbruk, återvinningsstation, sopstation, burkar, flaskor, skrot, skräp, sopor, återvinningscontainer, container, metall, glas"
                 },
                 "amenity/recycling_centre": {
                     "name": "Återvinningscentral",
                     "name": "Förskolebyggnad",
                     "terms": "Förskola, dagis, daghem, lekskola, kindergarten, lekis,  förskolebyggnad, dagisbyggnad, dagishus, förskolehus, barnomsorg"
                 },
+                "building/mosque": {
+                    "name": "Moskébyggnad",
+                    "terms": "Moskébyggnad, moské, islam, minaret, muhammedansk helgedom, muhammedanism, muslim"
+                },
                 "building/public": {
                     "name": "Publik byggnad",
                     "terms": "Publik byggnad, allmän byggnad, offentlig byggnad"
                     "name": "Catering",
                     "terms": "catering, cateringfirma, matleverantör, matleverans, , "
                 },
+                "craft/chimney_sweeper": {
+                    "name": "Sotare",
+                    "terms": "Sotare, skorstensfejare, skorsten, rökgång, sotarmurre"
+                },
                 "craft/clockmaker": {
                     "name": "Urmakare (väggur)",
                     "terms": "Urmakare, klockmakare"
                     "terms": "Ridväg, ridstig, häst, rida, ridning, ryttare, "
                 },
                 "highway/bus_stop": {
-                    "name": "Busshållplats",
-                    "terms": "Busstopp, busshållplats, buss, hållplats, anhalt, station, busstation, "
+                    "name": "Busshållplats / Bussplattform"
                 },
                 "highway/corridor": {
                     "name": "Korridor inomhus",
                     "name": "Skog (brukad)",
                     "terms": "Skog, skogsvård, skogsområde, skogstrakt, träd, skogsdunge, dunge, lund, skogsplantering"
                 },
-                "landuse/garages": {
-                    "name": "garage",
-                    "terms": "garage, bilstall, bilskjul, carport, varmgarage, kallgarage, bilplatser"
-                },
                 "landuse/grass": {
                     "name": "Gräs",
                     "terms": "Gräs, klippt gräs, refug, rondell, mittremsa"
                     "name": "Planerad byggnation",
                     "terms": "Greenfield, planerad byggnation, framtid, urbanisering"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Växthus för trädgårdsväxter",
+                    "terms": "Växthus för trädgårdsväxter, växthus, blomma, trädgårdsodling, drivhus, orangeri, driveri, vinterträdgård, växtodling, blomsterhus, odlingshus"
+                },
                 "landuse/harbour": {
                     "name": "Hamn",
                     "terms": "Hamn, kaj, marin, båt, båtplats, båtterminal"
                 },
                 "leisure/fitness_station": {
                     "name": "Utomhusgym",
-                    "terms": "Utomhusgym, utegym, gym, fitness, träning"
+                    "terms": "Utomhusgym, utegym, gym, fitness, träning, träningsbana, träningsspår, motion, naturgym "
                 },
                 "leisure/fitness_station/balance_beam": {
                     "name": "Balansbom (träning)",
-                    "terms": "Balansbom, balans, träning, fitness, gym, träningsspår"
+                    "terms": "Balansbom, balans, träning, fitness, gym, Utomhusgym, utegym, naturgym, motion"
                 },
                 "leisure/fitness_station/box": {
-                    "name": "Träningsplattform",
-                    "terms": "låda, hoppövning, plattform, hopp, träning, fitness, gym, träningsbana"
+                    "name": "Träningsplattform/trapsteg",
+                    "terms": "låda, hoppövning, plattform, hopp, träning, fitness, gym, utomhusgym, utegym, naturgym, motion"
                 },
                 "leisure/fitness_station/horizontal_bar": {
                     "name": "Räck (träning)",
-                    "terms": "räck, bar, träning, fitness, gym, pullup, träningsbana"
+                    "terms": "räck, bar, träning, fitness, gym, pullup, pull up, pull-up, utomhusgym, utegym, naturgym, motion, Räckhäv, hävräcke "
                 },
                 "leisure/fitness_station/horizontal_ladder": {
-                    "name": "Armgång"
+                    "name": "Armgång",
+                    "terms": "Armgång, Monkey Bars, träning, träna, fitness, gym, stege, pullup, pull up, utomhusgym, utegym, naturgym, räck, bar, motion"
                 },
                 "leisure/fitness_station/hyperextension": {
-                    "name": "Ryggsträckare"
+                    "name": "Ryggsträckare",
+                    "terms": "Ryggsträckare, rygg, träning, träna, fitness, gym, utomhusgym, utegym, naturgym, Roman Chair, Hyperextension, motion, rygglyft"
                 },
                 "leisure/fitness_station/parallel_bars": {
                     "name": "Barrpress",
-                    "terms": "Dips, Barrpress, barr, motion, fitness, gym"
+                    "terms": "Dips, Barrpress, barr, motion, träning, träna, fitness, gym, utomhusgym, utegym, naturgym"
                 },
                 "leisure/fitness_station/push-up": {
-                    "name": "Armhävningsstation"
+                    "name": "Armhävningsstation",
+                    "terms": "Armhävningsstation, armhävning, träning, träna, fitness, gym, utomhusgym, utegym, naturgym, pushup, push up, motion"
                 },
                 "leisure/fitness_station/rings": {
-                    "name": "Ringar"
+                    "name": "Ringar",
+                    "terms": "träning, träna, fitness, gym, utomhusgym, utegym, naturgym, motion, ringar, pullup, pull up, pull-up"
                 },
                 "leisure/fitness_station/sign": {
-                    "name": "Instruktionsskylt"
+                    "name": "Träningsinstruktioner",
+                    "terms": "träning, träna, fitness, gym, utomhusgym, utegym, naturgym, motion,Träningsinstruktioner, instruktionsskylt, skylt"
                 },
                 "leisure/fitness_station/sit-up": {
-                    "name": "Situps-station"
+                    "name": "Situp-ramp",
+                    "terms": "träning, träna, fitness, gym, utomhusgym, utegym, naturgym, motion, situp, sit up, sit-up, crunch, Sit-up-ramp. situp-ramp"
                 },
                 "leisure/fitness_station/stairs": {
-                    "name": "Träningstrappa"
+                    "name": "Träningstrappa",
+                    "terms": "träning, träna, fitness, gym, utomhusgym, utegym, naturgym, motion, trappa, trappor, trapp, steg, step up, hoppövning, plattform, hopp"
                 },
                 "leisure/garden": {
                     "name": "Trädgård",
                     "name": "Mast",
                     "terms": "Mast, antenn, sändarmast, mobiltelefonmast, mobilmast, kommunikationsmast, kommunikationstorn, stagas torn, mobiltelefon torn, radiomast, tv-torn, tv-mast, överföringsmast, överföringstorn, antennbärare, sändarstation, slavsändare"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Mätstation",
+                    "terms": "Mätstation, mätning, observation, väderstation, väder, jordbävning, seismologi, Seismolog, luftmätning, luftkvalité , luftkvalitet, gps, övervakningsstation, vattennivå, observationsrör, radon, ljud, trafik, trafikmätning"
+                },
                 "man_made/observation": {
                     "name": "Utkikstorn",
                     "terms": "Utkikstorn, utsiktstorn, observationstorn, utsiktspost, observationspost, brandtorn"
                     "terms": "bokhållare, Redovisningsekonom, bokföring, kontorist, räkenskap, tjänsteman"
                 },
                 "office/administrative": {
-                    "name": "Lokal myndighet",
-                    "terms": "Lokal myndighet, myndighet, kommun, kommunkontor, kommunbyggnad"
+                    "name": "Lokal myndighet"
                 },
                 "office/adoption_agency": {
                     "name": "Adoptionsbyrå"
                 "office/charity": {
                     "name": "Välgörenhetsorganisation"
                 },
-                "office/company": {
-                    "name": "Företagskontor",
-                    "terms": "Företagskontor, kontor, företag, expedition, kundmottagning"
-                },
                 "office/coworking": {
                     "name": "Dagkontor",
                     "terms": "Dagkontor, lånekontor, fjärrarbetsplats, distansarbete, Coworking, Kontorsplats, kontorsarbetsplats, konferensrum, mötesrum, affärslounger, tillfällig arbetsplats, tillfälligt kontor, kontor"
                     "terms": "Försäkringskontor, försäkringar, försäkringsförmedling"
                 },
                 "office/it": {
-                    "name": "IT-kontor"
+                    "name": "IT-kontor",
+                    "terms": "IT-kontor, it, dator, datorer, mjukvara, program, hårdvara, programmering, mjukvaruutveckling, systemutveckling, datorkonsult, datakonsult, konsult, konsultkontor,  it-specialist, datorspecialist"
                 },
                 "office/lawyer": {
                     "name": "Advokatkontor",
                     "terms": "Advokatkontor, advokat, jurist, juridiskt ombud, rättsombud, ombud, jurist, försvarare, lagman"
                 },
                 "office/lawyer/notary": {
-                    "name": "Notariekontor",
-                    "terms": "Notariekontor, Notarie, Notarius, Notarius publicus, signatur, fullmakt, namnteckning, påskrift, underskrift, bevittna, testamente, arv, handlingar, kontrakt, avtal, egendom, dödsbo, värdehandlningar"
+                    "name": "Notariekontor"
                 },
                 "office/moving_company": {
-                    "name": "Flyttfirma"
+                    "name": "Flyttfirma",
+                    "terms": "Flyttfirma, flyttning, transport, flytt, flyttlass,flyttkarl,bärare, "
                 },
                 "office/newspaper": {
-                    "name": "Tidningsredaktion"
+                    "name": "Tidningsredaktion",
+                    "terms": "Tidningsredaktion, tidning, nyhetsredaktion, redaktion, tidningslokal, utgivare, tidskrift, magasin"
                 },
                 "office/ngo": {
                     "name": "Icke-statlig organisation",
                     "terms": "Icke-statlig organisation, organisation, hjälporganisation, fackförening, ideell förening, ideell, förening, icke-kommersiell, frivilligorganisation, frivillig, intresseorganisation"
                 },
                 "office/notary": {
-                    "name": "Notarie"
+                    "name": "Notarie",
+                    "terms": "Notariekontor, Notarie, Notarius, Notarius publicus, signatur, fullmakt, namnteckning, påskrift, underskrift, bevittna, testamente, arv, handlingar, kontrakt, avtal, egendom, dödsbo, värdehandlningar"
                 },
                 "office/physician": {
                     "name": "Läkare"
                     "terms": "Politiskt parti, politik, parti"
                 },
                 "office/private_investigator": {
-                    "name": "Privatdetektiv"
+                    "name": "Privatdetektiv",
+                    "terms": "Privatdetektiv, detektiv, deckare"
                 },
                 "office/quango": {
                     "name": "Kvasiautonom icke-statlig organisation",
                     "terms": "Forskning och utveckling, forskning, utveckling, vetenskapligt studium, vetenskapligt arbete, undersökning, efterforskning, research"
                 },
                 "office/surveyor": {
-                    "name": "Lantmätare"
+                    "name": "Undersökning/inspektion",
+                    "terms": "Undersökning, inspektion, mätning, lantmätare, lantmäteri, riskbedömning, riskbedömare, skadebedömning, skadebedömare, opinionsundersökning, statistik, stickprovsundersökning, enkät"
                 },
                 "office/tax_advisor": {
-                    "name": "Skatterådgivning"
+                    "name": "Skatterådgivning",
+                    "terms": "Skatterådgivning, skatt, moms, ekonomi, ekonomirådgivning, skatteplanering, konsultation, skattekonsultation"
                 },
                 "office/telecommunication": {
                     "name": "Telekom",
                     "terms": "Telekom, telefoni, telefoner, telefon, internet, internetcafé, surfning, surfcafé mobil, mobiltelefon, mobiltelefoni"
                 },
                 "office/therapist": {
-                    "name": "Terapeut"
+                    "name": "Terapeut",
+                    "terms": "Terapeut, behandling, behandlare, psykolog, psykoterapeut, psykologi, terapi, Arbetsterapi, arbetsterapeut, Fysioterapi,sjukgymnast, logoped, Språkterapi, Talterapi, Röstterapi, Kemoterapi, cellgiftsbehandling, Radioterapi, Farmakoterapi, Samtalsterapi, Psykoterapi, Kognitiv beteendeterapi, beteendeterapi, kbt, Kognitiv terapi, Beteendeterapi, Psykoanalys, Sexterapi, Familjeterapi"
                 },
                 "office/travel_agent": {
                     "name": "Resebyrå "
                 },
                 "office/water_utility": {
-                    "name": "Vattenleverantör"
+                    "name": "Vattenleverantör",
+                    "terms": "Vattenleverantör, Dricksvatten, vattenbolag"
                 },
                 "piste": {
                     "name": "Pist/skidspår",
                     "name": "Transformator",
                     "terms": "Transformator, nätstation, elomvandling"
                 },
-                "public_transport/platform": {
-                    "name": "Plattform",
-                    "terms": "Plattform, väntplats, påstigningsplats, avsats, perrong"
+                "public_transport/linear_platform": {
+                    "name": "Hållplats / Plattform för kollektivtrafik",
+                    "terms": "Hållplats, Plattform, kollektivtrafik, linjetrafik, transport"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Hållplats / Plattform för linbana"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Tunnelbanestopp / -plattform",
+                    "terms": "Tunnelbanestopp, Tunnelbaneplattform, tunnelbana, metro, plattform, kollektivtrafik, järnväg, spår, transport, tunnelbana, underjordisk"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Tunnelbanestopp / -plattform",
+                    "terms": "Tunnelbanestopp, Tunnelbaneplattform, tunnelbana, metro, plattform, kollektivtrafik, järnväg, spår, transport, tunnelbana, underjordisk"
+                },
+                "public_transport/station_subway": {
+                    "name": "Tunnelbanestation",
+                    "terms": "Tunnelbanestation,  tunnelbana, metro, , kollektivtrafik, järnväg, spår, transport, tunnelbana, underjordisk, station, terminal"
                 },
                 "public_transport/stop_position": {
-                    "name": "Stopposition",
-                    "terms": "Stopposition, busshållplats, hållplats"
+                    "name": "Stopposition för kollektivtrafik",
+                    "terms": "Stopposition för kollektivtrafik, stopposition, kollektivtrafik, linjetrafik, transport, hållplats"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Stopposition för linbana",
+                    "terms": "Stopposition för linbana, stopposition, linbana, linbanestation, kollektivtrafik, linjetrafik, transport, hållplats, linbanehållplats, linbanestopp, linbaneterminal"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Stopposition för buss",
+                    "terms": "Stopposition för buss, stopposition, buss, kollektivtrafik, linjetrafik, transport, hållplats, busshållplats, busstopp, bussterminal"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Stopposition för färja",
+                    "terms": "Stopposition för färja, stopposition, färja, båt, linjetrafik, kollektivtrafik, transport, hållplats, busshållplats, busstopp, bussterminal"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Stopposition för snabbspårväg / light rail",
+                    "terms": "Stopposition för snabbspårväg, snabbspårväg, light rail, lättbana, spårväg, kollektivtrafik, järnväg, spår, spårvagn, transport, stopposition, spårvagn, linjetrafik, hållplats, spårvagnshållplats, spårvagnstopp, spårvagnsterminal"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Stopposition för monorail",
+                    "terms": "Stopposition för monorail, stopposition, monorail, enskensbana, balkbana, kollektivtrafik, linjetrafik, transport, hållplats"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Stopposition för tunnelbana",
+                    "terms": "Stopposition för tunnelbana, stopposition, tunnelbana, tunnelbanetåg, kollektivtrafik, linjetrafik, transport, hållplats, tunnelbanehållplats, tunnelbanestopp, tunnelbanestation"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Stopposition för tåg",
+                    "terms": "Stopposition för tåg, stopposition, tåg, kollektivtrafik, linjetrafik, transport, hållplats, tågstopp, tågterminal, tågstation, järnvägsstopp, järnvägsterminal, järnvägsstation, järnvägshållplats"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Stopposition för spårvagn",
+                    "terms": "Stopposition för spårvagn, stopposition, spårvagn, kollektivtrafik, linjetrafik, transport, hållplats, spårvagnshållplats, spårvagnstopp, spårvagnsterminal"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Stopposition för trådbuss",
+                    "terms": "Stopposition för trådbuss, stopposition, trådbuss, buss, kollektivtrafik, linjetrafik, transport, hållplats, trådbusshållplats, trådbusstopp, trådbussterminal, busshållplats, busstopp, bussterminal"
                 },
                 "railway": {
                     "name": "Järnväg"
                     "name": "Bergbana ",
                     "terms": "Bergbana, linbana"
                 },
-                "railway/halt": {
-                    "name": "Mindre järnvägshållplats",
-                    "terms": "Mindre järnvägshållplats, hållplats, järnvägshållplats, avstigningsplats, påstigningsplats, tågstopp"
-                },
                 "railway/level_crossing": {
                     "name": "Järnvägskorsning (väg)",
                     "terms": "korsning, järnvägskorsning, järnvägsövergång, järnvägspassage, plankorsning, spårpassage, tågövergång, tågkorsning, tågpassage"
                     "name": "Smalspårbana",
                     "terms": "Smalspårbana, smalspår"
                 },
-                "railway/platform": {
-                    "name": "Perrong",
-                    "terms": "perrong, plattform, väntplan, väntplats"
-                },
                 "railway/rail": {
                     "name": "Räls",
                     "terms": "Räls, järnvägsspår, spår, bana"
                     "name": "Järnvägssignal",
                     "terms": "järnvägssignal, signal, ljus, järnvägsljus, semafor, försignal,  huvudsignal, dvärgsignal"
                 },
-                "railway/station": {
-                    "name": "Järnvägsstation",
-                    "terms": "Järnvägsstation, station, central, centralstation, tåg, tågstation"
-                },
                 "railway/subway": {
                     "name": "Tunnelbana",
                     "terms": "Tunnelbana, T-bana, metro"
                     "name": "Spårvagn",
                     "terms": "Spårvagn, spårväg, motorvagn"
                 },
-                "railway/tram_stop": {
-                    "name": "Spårvagnshållplats",
-                    "terms": "Spårvagnshållplats, spårvagn, spårväg, spårvägshållplats, spårvagnsterminal"
-                },
                 "relation": {
                     "name": "Relation",
                     "terms": "Relation, relaterat, förbindelse, förhållande, samband, anknytning, koppling, kontext"
                     "name": "Juvelerare",
                     "terms": "Juvelerare, smycken, halsband, ring, ringar, örhänge, örhängen, klocka, klockor, guld, silver, diamant, pärla, pärlor"
                 },
-                "shop/kiosk": {
-                    "name": "Kiosk",
-                    "terms": "Kiosk, gatukök, tidningar, godis, cigaretter, tobak, snus, dryck, läsk, butik, snabbmat, glass, korv"
-                },
                 "shop/kitchen": {
                     "name": "Köksinredning",
                     "terms": "Köksinredning, kök, bänkskivor, köksskåp, skåpluckor"
                     "name": "Vägrutt",
                     "terms": "Vägrutt, vägnät, vägförbindelse"
                 },
+                "type/route/subway": {
+                    "name": "Tunnelbanerutt",
+                    "terms": "Tunnelbanerutt, tunnelbana, "
+                },
                 "type/route/train": {
                     "name": "Tågrutt",
                     "terms": "Tågrutt, tågnät, järnvägsrutt, järnväg, järnvägsförbindelse"
                 "name": "TIGER Roads 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kartdata OpenStreetMaps bidragsgivare, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Cykel"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kartdata OpenStreetMaps bidragsgivare, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Vandring"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kartdata OpenStreetMaps bidragsgivare, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Mountainbike"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kartdata OpenStreetMaps bidragsgivare, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Inline skating"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, kartdata OpenStreetMaps bidragsgivare, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Vintersport"
             },
             "basemap.at": {
index d7ceada3bb6fee47e471a08bf48ad430185d09f7..fd21159b4911f52e3021ff44b37d4d36b7caa116 100644 (file)
         "background": {
             "title": "பின்னணி",
             "description": "பின்னணி அமைப்புகள்",
-            "percent_brightness": "{opacity}% ஒளிர்வு",
             "none": "எதுவுமில்லை",
             "custom": "தனிப்பயன்",
             "reset": "மீட்டமைக்க"
                     "label": "கொள்ளளவு",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "திசை",
-                    "options": {
-                        "E": "கிழக்கு",
-                        "ENE": "கிழக்கு-வடகிழக்கு",
-                        "ESE": "கிழக்கு-தென்கிழக்கு",
-                        "N": "வடக்கு",
-                        "NE": "வடகிழக்கு",
-                        "NNE": "வடக்கு-வடகிழக்கு",
-                        "NNW": "வடக்கு-வடமேற்கு",
-                        "NW": "வடமேற்கு",
-                        "S": "தெற்கு",
-                        "SE": "தென்கிழக்கு",
-                        "SSE": "தெற்கு-தென்கிழக்கு",
-                        "SSW": "தெற்கு-தென்மேற்கு",
-                        "SW": "தென்மேற்கு",
-                        "W": "மேற்கு",
-                        "WNW": "மேற்கு-வடமேற்கு",
-                        "WSW": "மேற்கு-தென்மேற்கு"
-                    }
-                },
-                "clock_direction": {
-                    "label": "திசை",
-                    "options": {
-                        "anticlockwise": "எதிர் கடிகாரத் திசையில்",
-                        "clockwise": "வலம் சுற்றுகிற"
-                    }
-                },
                 "collection_times": {
                     "label": "சேகரிப்பு காலம்"
                 },
                     "label": "சமநிலை",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "திசை",
-                    "options": {
-                        "backward": "பின்னோக்கி",
-                        "forward": "முன்னோக்கி"
-                    }
-                },
                 "parking": {
                     "label": "வகை",
                     "options": {
                 "amenity/bicycle_rental": {
                     "name": "சைக்கிள் வாடகை"
                 },
-                "amenity/bus_station": {
-                    "name": "பேருந்து நிலையம் "
-                },
                 "amenity/cafe": {
                     "name": "டீக்கடை"
                 },
                 "entrance": {
                     "name": "நுழைவு / வெளியேறு"
                 },
-                "highway/bus_stop": {
-                    "name": "பேருந்து நிலையம்"
-                },
                 "highway/footway": {
                     "name": "நடைபாதை"
                 },
                 "railway/monorail": {
                     "name": "மோனோ இரயில்"
                 },
-                "railway/platform": {
-                    "name": "இரயில்வே நடைமேடை"
-                },
                 "railway/rail": {
                     "name": "இரயில்"
                 },
-                "railway/station": {
-                    "name": "இரயில் நிலையம்"
-                },
                 "railway/subway": {
                     "name": "சுரங்கப்பாதை"
                 },
index c86f360afbdca6b252eba01e9cb0bf0c53a38838..5b0149cb873dfd67042926ab9c46c301634e5f16 100644 (file)
             },
             "delete": {
                 "title": "తొలగించు",
+                "description": {
+                    "single": "ఈ లక్షణమును తొలగించు ",
+                    "multiple": "ఈ లక్షణాలను తొలగించండి "
+                },
                 "annotation": {
                     "point": "ఒక బిందువును తొలగించారు.",
                     "vertex": "దారిలో నుండి ఒక నోడ్‌ను తొలగించండి.",
                     "line": "గీత తొలగించబడింది",
                     "area": "స్థలం తొలగించబడింది",
-                    "relation": "సంబంధం తొలగించబడింది"
+                    "relation": "సంబంధం తొలగించబడింది",
+                    "multiple": "తొలగించిన లక్షణాలు {n}"
+                },
+                "too_large": {
+                    "single": "ఈ లక్షణం మొత్తం కనిపించక మూలాన దీనిని తొలగించుట కుదరదు ",
+                    "multiple": "ఈ లక్షణాలు మొత్తం కనిపించక మూలాన వీటిని తొలగించుట కుదరదు"
                 }
             },
             "add_member": {
             },
             "move": {
                 "title": "తరలించు",
+                "description": {
+                    "single": "ఈ లక్షణమును మరొక చోటకు తరలించు",
+                    "multiple": "ఈ లక్షణాలను మరొక చోటకు తరలించు "
+                },
                 "key": "ఎమ్",
                 "annotation": {
                     "point": "ఒక బిందువు తరలించబడింది",
                 }
             },
             "reverse": {
+                "title": "వెనక్కి తిప్పు ",
                 "description": "ఈ గీతను వ్యతిరేక దిశగా పంపు",
                 "key": "వీ"
             },
                 },
                 "not_eligible": "గీత మొదలు లేదా ఆఖరిన విడగొట్టడానికి వీలు లేదు.",
                 "multiple_ways": "చాలా గీతాలు ఉన్నందు వల్ల విడగొట్టడం కుదరదు."
+            },
+            "restriction": {
+                "help": {
+                    "select": "రోడ్డు ఎంచుకొనుటకు క్లిక్ చేయండి "
+                }
             }
         },
+        "undo": {
+            "tooltip": "చెరిపివేయు: {action}",
+            "nothing": "చెరిపివేయుటకు ఏమిలేదు "
+        },
+        "redo": {
+            "tooltip": "మరల చేయు: {action}",
+            "nothing": "మరల చేయుటకు ఏమిలేదు "
+        },
         "tooltip_keyhint": "సత్వరమార్గం:",
         "browser_notice": "ఈ సవరికకు Firefox, Chrome, Safari, Opera మరియు Internet Explorer 11 ఆపై మాత్రమే మద్దుతు ఇస్తాయి. పటాన్ని సవరించడానికి మీ బ్రౌజరును నవీకరించండి లేదా Potlatch 2 వాడండి.",
         "translate": {
             "hidden_warning": "{count} దాగివున్న లక్షణాలు"
         },
         "commit": {
+            "title": "OpenStreetMapలో మార్పులను భద్రపరచండి ",
             "upload_explanation": "మీరు ఎక్కించే మార్పులు ఓపెన్‌స్ట్రీట్‌మ్యాప్ డేటాను వాడే పటాలన్నింటిలోనూ కనిపిస్తాయి.",
             "cancel": "రద్దుచేయి",
             "changes": "{count} మార్పులు",
                     "label": "సామర్థ్యం",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "దిశ"
-                },
-                "clock_direction": {
-                    "label": "దిశ"
-                },
                 "construction": {
                     "label": "రకం"
                 },
index 98fe5f105f6b4cad774b45bcc7bf0eca4a43202c..48d63c733cb86a263e9984f73059ca35982a9175 100644 (file)
                         "whole": "เลือดล้วนๆ"
                     }
                 },
-                "cardinal_direction": {
-                    "label": "ทิศ",
-                    "options": {
-                        "E": "ตะวันออก",
-                        "ENE": "ตะวันออกเฉียงเหนือเฉียงตะวันออก",
-                        "ESE": "ตะวันออกเฉียงใต้เฉียงตะวันออก",
-                        "N": "เหนือ",
-                        "NE": "ตะวันออกเฉียงเหนือ",
-                        "NNE": "ตะวันออกเฉียงเหนือเฉียงเหนือ",
-                        "NNW": "ตะวันตกเฉียงเหนือเฉียงเหนือ",
-                        "NW": "ตะวันตกเฉียงเหนือ",
-                        "S": "ใต้",
-                        "SE": "ตะวันออกเฉียงใต้",
-                        "SSE": "ตะวันออกเฉียงใต้เฉียงใต้",
-                        "SSW": "ตะวันตกเฉียงใต้เฉียงใต้",
-                        "SW": "ตะวันตกเฉียงใต้",
-                        "W": "ตะวันตก",
-                        "WNW": "ตะวันตกเฉียงเหนือเฉียงตะวันตก",
-                        "WSW": "ตะวันตกเฉียงใต้เฉียงตะวันตก"
-                    }
-                },
-                "clock_direction": {
-                    "label": "ทิศทางนาฬิกา",
-                    "options": {
-                        "anticlockwise": "ทวนเข็มนาฬิกา",
-                        "clockwise": "ตามเข็มนาฬิกา"
-                    }
-                },
                 "contact/webcam": {
                     "placeholder": "http://example.com/"
                 },
index c53dfdfa7898e07727daca1e669946e3c5c644a6..4132cbdc8c3881dcaf636ac4f3116f86de712b28 100644 (file)
             "created": "Nilikha",
             "about_changeset_comments": "Tungkol changeset comments",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "Nabanggit mo ang Google sa komentong ito: tandaan na pagkopya mula sa Google Maps ay mahigpit na ipinagbabawal.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "Nabanggit mo ang Google sa komentong ito: tandaan na pagkopya mula sa Google Maps ay mahigpit na ipinagbabawal."
         },
         "contributors": {
             "list": "Edits nina {users}",
         "background": {
             "title": "\"Background\" o \"imagery\"",
             "description": "Mga setting ng \"background\" o \"imagery\"",
-            "percent_brightness": "{opacity}% Pagkalinaw",
             "none": "Wala",
             "best_imagery": "Pinakakilalang pinagmulan ng imaheng ito para sa lokasyon na ito",
             "custom": "Custom",
             "custom_button": "I-edit ang custom na background",
-            "fix_misalignment": "Baguhin ang imagery offset",
-            "imagery_source_faq": "Saan nangagaling ang imaheng ito?",
             "reset": "I-reset",
             "minimap": {
-                "description": "minimap",
                 "tooltip": "Ipakita ang naka-zoom out na mapa upang makatulong na mahanap ang mga lugar na kasalukuyang ipinapakita."
-            }
+            },
+            "fix_misalignment": "Baguhin ang imagery offset"
         },
         "map_data": {
             "title": "Data ng mapa",
                     "label": "Kapasidad",
                     "placeholder": "50, 100, 200"
                 },
-                "cardinal_direction": {
-                    "label": "Direksyon",
-                    "options": {
-                        "E": "silangan",
-                        "ENE": "silangang-hilagang-silangan",
-                        "ESE": "silangang-timog-silangan",
-                        "N": "Hilaga",
-                        "NE": "Hilagang-silangan",
-                        "NNE": "hilagang-hiliagang-silangan",
-                        "NNW": "hilagang-hiliagang-kanluran",
-                        "NW": "Hilagang-kanluran",
-                        "S": "Timog",
-                        "SE": "Timog-silangan",
-                        "SSE": "timog-timog-silangan",
-                        "SSW": "Timog-timog-kanluran",
-                        "SW": "Timog-kanluran",
-                        "W": "Kanluran",
-                        "WNW": "Kanlurang-hilagang-kanluran",
-                        "WSW": "Kanlurang-timog-kanluran"
-                    }
-                },
                 "castle_type": {
                     "label": "uri"
                 },
-                "clock_direction": {
-                    "label": "direksyon",
-                    "options": {
-                        "anticlockwise": "paikot sa kaliwa",
-                        "clockwise": "paikot sa kanan"
-                    }
-                },
                 "collection_times": {
                     "label": "Mga oras ng koleksyon"
                 },
index 2f2db3b6ad6b9851dfc4a853f611addf771c66cd..21b53f47e022df2f1ba618eada1466eb2f7c07da 100644 (file)
             "localized_translation_language": "Dil seç",
             "localized_translation_name": "İsim"
         },
+        "zoom_in_edit": "Düzenlemek için yakınlaştırın",
         "login": "giriş yap",
         "logout": "çıkış yap",
         "loading_auth": "OpenStreetMap'e bağlanıyor...",
             "title": "OpenStreetMap'e Yükle",
             "upload_explanation": "Yüklediğin değişiklikler OpenStreetMap verilerini kullanan bütün haritalarda görülebilecek. ",
             "upload_explanation_with_user": "{user} olarak yüklediğin değişiklikler OpenStreetMap verilerini kullanan bütün haritalarda görülebilecek. ",
+            "request_review": "Birisinin yaptığım düzenlemeleri gözden geçirmesini isterim.",
             "save": "Yükle",
             "cancel": "İptal",
             "changes": "{count} Değişiklik",
+            "download_changes": "osmChange dosyasını indirin",
             "warnings": "Uyarılar",
             "modified": "Değiştirildi",
             "deleted": "Silindi",
             "about_changeset_comments": "Değişiklikler hakkındaki yorumlar",
             "about_changeset_comments_link": "Yapılan değişikliklere eklenen yorumlara dair detaylı bilgiyi şu adreste bulabilirsin - İngilizce: //wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "Yorumunda Google kelimesini kullanmışsın. Unutma Google Maps'ten veri kopyalamak kesinlikle yasaktır.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "{users} tarafından yapılmış değişiklikler",
         },
         "info_panels": {
             "background": {
+                "title": "Arkaplan",
                 "zoom": "Yakınlaştırma",
+                "vintage": "Görüntü Yılı",
                 "source": "Kaynak",
                 "description": "Açıklama",
                 "resolution": "Çözüm",
                 "accuracy": "Doğruluk",
-                "unknown": "Bilinmeyen"
+                "unknown": "Bilinmeyen",
+                "show_tiles": "Kılavuz Çizgilerini Göster",
+                "hide_tiles": "Kılavuz Çizgilerini Gizle",
+                "show_vintage": "Görüntü Yılını Göster",
+                "hide_vintage": "Görüntü Yılını Gizle"
             },
             "history": {
+                "title": "Geçmiş",
+                "selected": "{n} seçildi",
                 "version": "Versiyon",
-                "changeset": "Değişiklik Kümesi"
+                "last_edit": "Son Düzenleme",
+                "edited_by": "Düzenleyen",
+                "changeset": "Değişiklik Kümesi",
+                "unknown": "Bilinmeyen",
+                "link_text": "openstreetmap.org üzerindeki geçmiş"
+            },
+            "location": {
+                "title": "Konum",
+                "unknown_location": "Bilinmeyen Konum"
             },
             "measurement": {
                 "title": "Ölçüm",
-                "length": "Uzunluk"
+                "selected": "{n} seçildi",
+                "geometry": "Geometri",
+                "center": "Merkez",
+                "perimeter": "Çevre",
+                "length": "Uzunluk",
+                "area": "Alan",
+                "centroid": "Ağırlık merkezi",
+                "location": "Konum",
+                "metric": "Metrik",
+                "imperial": "Emperyal",
+                "node_count": "Düğüm sayısı"
             }
         },
         "geometry": {
             "title": "Arka Plan",
             "description": "Arka plan ayarları",
             "key": "B",
-            "percent_brightness": "{opacity}% parlaklık",
+            "backgrounds": "Arkaplanlar",
             "none": "Yok",
             "best_imagery": "Bu yer için bilinen en iyi uydu görüntüsü",
             "switch": "Bu arka plana geçiş yap",
             "custom": "Özel",
             "custom_button": "Özel arka planı düzenle",
-            "fix_misalignment": "Uydu görüntüsünü ayarla",
-            "imagery_source_faq": "Bu uydu görüntüsünün kaynağı ne?",
+            "overlays": "Katmanlar",
             "reset": "sıfırla",
-            "offset": "Uydu görüntüsünü ayarlamak için gri kısımda herhangi bir yere taşı ya da göreceli konum değerlerini metre cinsinden gir.",
+            "brightness": "Parlaklık",
+            "contrast": "Karşıtlık",
+            "saturation": "Doygunluk",
+            "sharpness": "Keskinlik",
             "minimap": {
-                "description": "Küçük Harita",
                 "tooltip": "Şu an ekrandaki bölgeden uzaklaşarak üzerinde çalıştığın alanı haritada bul.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Uydu görüntüsünü ayarla",
+            "offset": "Uydu görüntüsünü ayarlamak için gri kısımda herhangi bir yere taşı ya da göreceli konum değerlerini metre cinsinden gir."
         },
         "map_data": {
             "title": "Harita Verileri",
             "description": "Harita Verileri",
             "key": "F",
             "data_layers": "Veri Katmanları",
+            "layers": {
+                "osm": {
+                    "tooltip": "OpenStreetMap'ten harita verisi",
+                    "title": "OpenStreetMap verisi"
+                }
+            },
             "fill_area": "Alanları Doldur",
             "map_features": "Nesneler",
-            "autohidden": "Bu nesnelerin tamamını ekranda göstermek zor olacağı için nesneler otomatik olarak gizlendi. Düzenlemek için haritanın belli bir bölgesine yakınlaşabilirsin."
+            "autohidden": "Bu nesnelerin tamamını ekranda göstermek zor olacağı için nesneler otomatik olarak gizlendi. Düzenlemek için haritanın belli bir bölgesine yakınlaşabilirsin.",
+            "osmhidden": "Bu nesneler OpenStreetMap katmanı gizli olduğu için otomatik olarak gizlenmiştir"
         },
         "feature": {
             "points": {
         },
         "restore": {
             "heading": "Kaydedilmemiş değişikliklerin var",
-            "description": "Daha önceki oturumdan kaydedilmemiş değişiklikleri geri getirmek ister misin?"
+            "description": "Daha önceki oturumdan kaydedilmemiş değişiklikleri geri getirmek ister misin?",
+            "restore": "Değişikliklerimi geri yükle",
+            "reset": "Değişiklikleri iptal et"
         },
         "save": {
             "title": "Kaydet",
                 "keep_remote": "Diğerini kullan",
                 "restore": "Geri Getir",
                 "delete": "Silinmiş Kalsın",
+                "download_changes": "Ya da osmChange dosyasını indir",
                 "done": "Bütün çelişkili değişiklikler düzeltildi!",
                 "help": "Bir başka kullanıcı senin düzenlediğin nesneleri değiştirmiş.\nAşağıdaki her nesneye tıklayarak detaylara gözat ve\nsenin ya da diğer kullanıcının yaptığı değişiklikleri seç.\n"
             }
         "splash": {
             "welcome": "OpenStreetMap Editörü iD'ye Hoşgeldin",
             "text": "iD, dünyanın en iyi ve bedava haritasına katkıda bulunmak için, kullanılması kolay ve güçlü bir araç. Bu sürüm {version}. Daha çok bilgi için {website} sayfasına git ve hataları {github} aracılığıyla bildir.",
-            "walkthrough": "Eğitime Başla"
+            "walkthrough": "Eğitime Başla",
+            "start": "Şimdi düzenle"
         },
         "source_switch": {
             "live": "canlı",
         "validations": {
             "disconnected_highway": "Kopuk yol",
             "disconnected_highway_tooltip": "Yollar, başka yollara veya bina girişlerine bağlı olmalıdır.",
+            "old_multipolygon": "Dış yolda çoklu poligon etiketleri",
+            "old_multipolygon_tooltip": "Bu çoklu poligon stili yenisiyle değiştirilecektir. Lütfen etiketleri dış taraf yerine ana çoklu poligonla ilişkilendiriniz. ",
             "untagged_point": "Etiketlenmemiş nokta",
             "untagged_point_tooltip": "Bu noktanın ne olduğunu belirten bir tür seç.",
             "untagged_line": "Etiketlenmemiş çizgi",
             "untagged_area_tooltip": "Bu alanın ne olduğunu belirten bir tür seç.",
             "untagged_relation": "Etiketlenmemiş Küme",
             "untagged_relation_tooltip": "Bu kümeyi tanımlayan bir tür seç",
-            "many_deletions": "Şu an {n} adet nesneyi siliyorsun. Bunu yapmak istediğinden emin misin? Bu, ilgili tüm nesneleri openstreetmap.org haritasından silecektir.",
             "tag_suggests_area": "{tag} etiketi buranın alan olmasını ima ediyor, ama burası alan değil.",
             "deprecated_tags": "Kullanımdan kaldırılmış etiketler: {tags}"
         },
+        "zoom": {
+            "in": "Yakınlaştır",
+            "out": "Uzaklaştır"
+        },
         "cannot_zoom": "Bu modda daha fazla uzaklaşılamaz.",
         "full_screen": "Tam Ekran",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "Bu resmi Mapillary'de görüntüle"
         },
+        "openstreetcam_images": {
+            "tooltip": "OpenStreetCam'den sokak düzeyinde fotoğraflar",
+            "title": "Fotoğraf katmanı (OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "Bu imajı OpenStreetCam'de görüntüleyin"
+        },
         "help": {
             "title": "Yardım",
             "key": "H",
-            "help": "# Yardım\n\n[OpenStreetMap](http://www.openstreetmap.org/) bedava ve düzenlenebilir\nbir dünya haritasıdır. Bu, bir harita düzenleme aracıdır. Bu aracı kullanarak\nharitaya yeni veriler ekleyebilir, mevcut verileri düzenleyebilirsin.\n\nYaptığın değişiklikler OpenStreetMap kullanan herkesin erişimine açık olacak\nve herkes tarafından görülebilecektir. Haritada\ndeğişiklikler, iyileştirmeler yapmak için [giriş yap](https://www.openstreetmap.org/login)\nman gerekmektedi.\n\n[iD editor](http://ideditor.com/) ortak bir çalışma ürünü olup [kaynak kodu\nGitHub'da yer almaktadır](https://github.com/openstreetmap/iD).\n",
-            "gps": "# GPS\n\nKullanıcılar tarafından toplanan GPS (küresel konumlandırma sistemi) verileri\nOpenStreetMap için en önemli veri kaynaklarından biridir. Bu düzenleyici makinanda\nyer alan `.gpx` formatındaki dosyaları destekler. GPS verilerini kişisel GPS aleti\nile ya da akıllı telefon uygulamalarını kullanarak toplayabilirsin.\n\nGPS verileri toplama konusunda daha fazla bilgi almak için,\n[Mapping with a smartphone, GPS başlığındaki İngilizce](http://learnosm.org/en/mobile-mapping/) dokümana gözatabilirsin.\n\nGPX verilerini kullanarak haritayı düzenlemek için, GPX dosyasını haritaya\nsürükle ve bırak. Eğer veriler sistem tarafından tanınabilirse, haritaya parlak mor\nrenkte çizgi şeklinde eklenecektir. Sağ tarafta yer alan 'Harita Verileri' menüsünü\nkullanarak verilerini gizleyebilir, tekrar aktif hale getirebilir ya da verilere yakınlaşabilirsin.\n\nGPX verileri OpenStreetMap'e yüklenerek sunucuya kaydedilmeyecektir. Bu\nverileri kullanmanın en iyi yolu haritada göstermektir. Bu sayede yeni nesneler\noluşturulabilir, mevcut nesneler güncellenebilir. Sana ait GPX verilerini başkalarının\nda kullanabilmesini istiyorsan, [şuradan](http://www.openstreetmap.org/trace/create)\nOpenStreetMap'e yükleyebilirsin.\n",
-            "imagery": "# Uygu Görüntüsü\n\nUydu görüntüsü harita düzenleme işlemi için en önemli kaynaklardan biridir. Sağda\ngösterilen 'Arka Plan Ayaları' menüsü altında birçok kaynaktan toplanan uydu görüntüleri\nyer almaktadır.\n\n[Bing Maps](http://www.bing.com/maps/) katmanı varsayılan uydu\ngörüntü katmanıdır. Haritanın belli bölgelerine yakınlaştığında diğer uydu görüntüleri\nde kullanılabilir olacaktır. ABD, Fransa ve Danimarka gibi ülkelerin bazı bölgeleri için\nyüksek kalitede uydu görüntüleri mevcuttur.\n\nUydu görüntüleri, görüntüyü sağlayanların hataları sebebiyle, bazen haritaya göre\nkısmen kaymış olabilir. Eğer harita üzerindeki yolların birçoğu, arka plandaki uydu\ngörüntüsü üzerindeki yollara göre kısmen kaymış olduğunu fark edersen, hemen\nharitadaki yolları arka plandaki yollarla eşleştirmek için uğraşma. Onun yerine\nuydu görüntüsünü 'Hizalamayı Düzelt' buttonuna tıklayarak harita ile uydu görüntüsünü\nhizala.\n",
-            "addresses": "# Adresler\n\nAdresler haritadaki en önemli bilgilerden biridir.\n\nAdresler genelde cadde ve sokakların, yani yolların, bir parçası olarak\ngösterilmektedir. Fakat, OpenStreetMap'te adresler yolların yanı sıra mekanlara\nda eklenebilir.\n\nAdres nokta ya da alan olarak eklenmiş binalara da eklenebilir. Adres bilgisinin\nen uygun ve en iyi kaynağı kişisel bilgi ya da bizzat toplanmış verilerdir.\nDiğer harita bilgilerinde olduğu gibi adresler için de Google Maps gibi ticari kaynakların kullanılması kesinlikle yasaktır.\n",
-            "inspector": "# Detay Düzenleyicisini Kullanmak\n\nDetay Düzenleyicisi seçilen bir nesnenin detaylarını düzenlemeye yarar ve\nsol tarafta yer alır.\n\n### Tür Seçmek\n\nBir nokta, çizgi veya alan ekledikten sonra bu nesnenin otoyol,\nsüpermarket ya da kafe gibi ne tür olduğunu seçebilirsin. Düzenleyici ilk başta\nyaygın nesne türlerini gösterecektir. Dilersen kullanacağın türü arama yaparak\nbulman da mümkün.\n\nEğer bir tür hakkında daha fazla bilgi almak istiyorsan, nesne adı yazan\ntuşun sağındaki 'i' yazısına basabilirsin. Tür seçmek için türün adının yazılı\nolduğu tuşa tıklaman yeterli.\n\n### Etiketleri Düzenleme\n\nBir nesne türünü seçtikten sonra ya da türü belli olan bir nesne seçildiğinde,\ndüzenleyici nesnenin adı, adresi gibi detayları gösterecektir.\n\nDetayların altında yer alan 'Detay Ekle' kısmında nesne hakkında şu gibi yeni detaylar\nekleyebilirsin: Wikipedia adresi, tekerlekli sandalye erişimi vb.\n\nDüzenleyicinin en altında 'İlave Etiketler' kısmına dilediğin etiketleri\nekleyebilirsin. [Taginfo](http://taginfo.openstreetmap.org/) sitesi bu konuda iyi bir kaynaktır.\n\nDetaylar üzerinde yaptığın değişiklikler haritada otomatik olarak güncellenir. Dilersen\nbu değişiklikleri 'Geri Al' tuşu ile geri alabilirsin.\n"
+            "help": {
+                "title": "Yardım",
+                "welcome": "[OpenStreetMap](https://www.openstreetmap.org/) için iD düzenleyicisine hoşgeldiniz. Bu düzenleyici ile OpenStreetMap'i web tarayıcınızdan güncelleyebilirsiniz.",
+                "open_data_h": "Açık Veri",
+                "open_data": "Bu haritada yapacağınız düzenelemeler OpenStreetMap'i kullanan herkese görünür olacaktır. Düzenlemeleriniz kişisel bilgi, saha taraması veya havadan ya da sokak düzeyindeki fotoğraflardan elde edilen görüntülere dayalı olabilir. Google Maps gibi ticari kaynaklardan kopyalamak [is strictly forbidden](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Başlamadan önce",
+                "before_start": "Düzenlemeye başlamadan önce OpenStreetMap ve bu düzenleyiciye aşina olmanız gerekir. iD, OpenStreetMap'i düzenlemenin temellerini size öğretmej için bir gezinti içerir. Bu ekrandaki \"Gezintiyi Başlatınız\" tuşuna basarak öğreticiyi başlatabilirsiniz, sadece 15 dakika sürmektedir.",
+                "open_source_h": "Açık Kaynak",
+                "open_source": "iD düzenleyicisi işbirliğine dayalı bir açık kaynak projesidir ve şu anda  versiyon {version} kullanmaktasınız. Kaynak kodlar [on GitHub](https://github.com/openstreetmap/iD) erişime açıktır.",
+                "open_source_help": "iD'ye [translating] ile yardımcı olabilirsiniz (https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Genel Bakış",
+                "navigation_h": "Gezinti",
+                "navigation_drag": "Haritayı farenin sol tuşuna {leftclick} basılı tutarak ve fareyi etrafında hareket ettirerek çekebiliriniz.  Ayrıca  klavyenizdeki `↓`, `↑`, `←`, `→` yön tuşlarını kullanabilirsiniz.",
+                "navigation_zoom": "Farenin tekeri veya trackpad aracılığıyla ya da haritanın kenarındaki {plus} / {minus} tuşlarına basarak yakınlaştırma ya da uzaklaştırma yapabilirsiniz. Ayrıca klavyenizdeki `+`, `-` tuşlarını kullanabilirsiniz.",
+                "features_h": "Harita Nesneleri",
+                "features": "Biz \"nesneler\" kelimesini haritada görünen yol, bina veya görülecek yerler gibi şeyler için kullanıyoruz. Gerçek dünyadaki her şey OpenStreetMap'te bir nesne olarak haritalanabilir. Harita nesneleri haritada *points*, *lines*, veya *areas* kullanılarak temsil edilir.",
+                "nodes_ways": "OpenStreetmap'te noktalar bazen *nodes* olarak, çizgi ve alanlar ise bazen  *ways* olarak kullanılır."
+            },
+            "editing": {
+                "title": "Düzenleme ve Kaydetme",
+                "select_h": "Seçiniz",
+                "select_left_click": "Bir nesneyi seçmek için sol tuşa {leftclick} tıklayınız. Bu durumda özellik çarpıcı bir parlaklıkla vurgulanacaktır ve yan menü çubuğunda adı veya adresi gibi özellik hakkındaki ayrıntılar görüntülenecektir.",
+                "select_right_click": "Düzenleme menüsünü görüntülemek için bir özelliğin üzerinde sağ tuşa {rightclick} basınız. Bu durumda döndürme, hareket ettirme veya silme gibi kullanılabilir komutlar görüntülenecektir.",
+                "multiselect_h": "Çoklu seçim",
+                "multiselect_shift_click": "Farklı nesneleri birlikte seçmek için `{shift}`+{leftclick}. Bu, çoklu öğeleri seçerek hareket ettirmeyi ya da silmeyi daha kolay hale getirir.",
+                "multiselect_lasso": "Çoklu nesneleri seçmek için bir başka yol da {shift}` tuşuna ve farenizin sol tuşuna {leftclick} basılı tutarak fareyi bir serbest şekil seçimi çizmek için çekmektir.",
+                "undo_redo_h": "Geri al ve Yinele",
+                "undo_redo": "Düzenlemeleriniz siz onları OpenStreetMap sunucusuna kaydetmeyi tercih edene kadar yerel olarak tarayıcınızda saklanmaktadır.  Düzenlemeleri **geri al** {undo} tuşuna basarak geri alabilir ve **yinele** {redo}  tuşuna basarak yineleyebilirsiniz.",
+                "save_h": "Kaydet",
+                "save": "**Kaydet** {save}  tuşuna basıp düzenlemelerinizi kaydedin ve OpenStreetMap'e gönderin. Çalışmanızı sık sık kaydetmeyi unutmamalısınız! ",
+                "save_validation": "Kaydet ekranında yapmış olduklarınızı gözden geçirmek için bir şansınız olacak. Ayrıca iD kayıp veriler için bazı temel kontroller yapacaktır ve bazı şeyler doğru görünmüyorsa size yardımcı olacak öneriler ve uyarılar sunacaktır.",
+                "upload_h": "Yükle",
+                "backups_h": "Otomatik yedekleme",
+                "keyboard_h": "Klavye Kısayolları",
+                "keyboard": "`?` tuşuna basarak klavye kısayollarının bir listesini görüntüleyebilirsiniz."
+            },
+            "feature_editor": {
+                "title": "Nesne Düzenleyicisi",
+                "intro": "\"Nesne düzenleyicisi\" haritanın yanında görünür ve seçilen nesne ile ilgili tüm bilgiyi görüntülemenizi ve düzenlemenizi sağlar.",
+                "definitions": "Üst kısım nesnenin tipini gösterir. Orta kısım nesnenin isim veya adres gibi öznitelikleri gösteren \"bilgi alanlarını\" içerir.",
+                "type_h": "Özellik Tipi",
+                "fields_h": "Bilgi alanları",
+                "tags_h": "Etiketler"
+            },
+            "points": {
+                "title": "Noktalar",
+                "add_point_h": "Noktaların eklenmesi",
+                "move_point_h": "Noktaların hareket ettirilmesi",
+                "delete_point_h": "Noktaların silinmesi"
+            },
+            "lines": {
+                "title": "Çizgiler",
+                "add_line_h": "Çizgilerin eklenmesi",
+                "add_line_finish": "Bir çizgiyi bitirmek için `{return}` tuşuna tıklayınız veya en son düğüme tekrar tıklayınız.",
+                "modify_line_h": "Çizgilerin değiştirilmesi",
+                "connect_line_h": "Çizgilerin birleştirilmesi",
+                "connect_line": "Yolların düzgün bir şekilde birbirine bağlanmış olması harita için önemlidir ve sürüş güzergahları oluşturmak için gereklidir.",
+                "connect_line_display": "Yollar arasındaki bağlantılar gri çemberlerle gösterilir. Eğer hiçbir şeye bağlanmıyorsa bir çizginin bitiş noktası daha büyük beyaz çemberlerle gösterilir.",
+                "disconnect_line_h": "Çizgilerin birbirinden ayrılması",
+                "move_line_h": "Çizgilerin hareket ettirilmesi",
+                "delete_line_h": "Çizgilerin silinmesi"
+            },
+            "areas": {
+                "title": "Alanlar",
+                "point_or_area_h": "Noktalar mı yoksa Alanlar mı?",
+                "add_area_h": "Alanların Eklenmesi",
+                "add_area_finish": "Bir alanı tamamlamak için `{return}` tuşuna basınız veya ilk ya da son düğüme tekrar tıklayınız.",
+                "square_area_h": "Kare Köşeler",
+                "modify_area_h": "Alanların Değiştirilmesi",
+                "delete_area_h": "Alanların Silinmesi"
+            },
+            "relations": {
+                "title": "İlişkiler",
+                "edit_relation_h": "İlişkilerin Düzenlenmesi",
+                "maintain_relation_h": "İlişkilerin Bakımı",
+                "relation_types_h": "İlişki Tipleri",
+                "multipolygon_h": "Çoklu poligonlar",
+                "turn_restriction_h": "Dönüş kısıtlaması",
+                "route_h": "Güzergah",
+                "boundary_h": "Sınırlar"
+            },
+            "imagery": {
+                "title": "Arkaplan görüntüsü",
+                "sources_h": "Görüntü kaynakları",
+                "offsets_h": "Uydu görüntüsünü ayarla"
+            },
+            "streetlevel": {
+                "title": "Sokak fotoğrafları",
+                "using_h": "Sokak fotoğraflarını kullanmak"
+            },
+            "gps": {
+                "title": "GPS İzleri",
+                "using_h": "GPS İzlerini Kullanmak",
+                "upload": "Diğer kullanıcıların kullanması için ayrıca şunu yapabilirsiniz: [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create)"
+            }
         },
         "intro": {
             "done": "tamamlandı",
                 "title": "Merhaba",
                 "welcome": "Merhaba! Bu eğitim sana OpenStreetMap'i düzenleme konusunda temel bilgileri öğretecek.",
                 "practice": "Eğitimde yer alan bütün veriler alıştırma yapmak içindir. Yaptığın herhangi bir değişiklik kaydedilmeyecektir.",
-                "words": "Bu eğitimde yeni kavramlar tanıtılacaktır. Bu kavramlar *italik* yazı biçimi ile gösterilecektir."
+                "words": "Bu eğitimde yeni kavramlar tanıtılacaktır. Bu kavramlar *italik* yazı biçimi ile gösterilecektir.",
+                "chapters": "Buraya kadar gayet iyi! Konuları geçmek ya da tıkanırsanız bir konuya yeniden başlamak için her zaman aşağıdaki tuşları kullanabilirsiniz. Haydi başlayalım! ** devam etmek için '{next}' tuşuna basın.**"
             },
             "navigation": {
                 "title": "Navigasyon",
                 "zoom": "Farenin tekerleğini veya izleme dörtgenini kullanarak yada {plus} / {minus} tuşlarını kullanarak yakınlaştırabilir veya uzaklaştırabilirsiniz. ** Haritayı yakınlaştırın ! **",
                 "points_lines_areas": "Haritadaki nesneler *nokta, çizgi veya alan* ile gösterilir.",
                 "nodes_ways": "OpenStreetMap'te noktalar bazen *bağlantı noktası* olarak ifade edilir. Benzer şekilde çizgi ve alanlar da *yol* şeklinde ifade edilebilir.",
+                "click_townhall": "Haritadaki tüm nesneler üzerine tıklanarak seçilebilir. **Seçmek için noktaya basınız**",
                 "selected_townhall": "Harika! Nokta seçildi. Seçilen özellikler parlayan bir parıltı ile çizilir.",
                 "editor_townhall": "Bir özellik seçildiğinde, harita yanında * özellik editörü * görüntülenir.",
                 "choose_street": "**{name} ismini listeden seç.**",
             },
             "startediting": {
                 "title": "Düzenlemeye Başla",
+                "help": "OpenStreetMap'i düzenlemek için şimdi hazırsınız.!{br}Bu gezintiyi yeniden oynatmak ya da daha fazla belge görüntülemek için {button} tuşuna basabilirsiniz. Yardım tuşu veya '{key}' tuşuna basınız. ",
+                "shortcuts": "'{key}' tuşuna basarak klavye kısayollarıyla birlikte bir komutlar listesi görüntüleyebilirsiniz",
                 "save": "Belli aralıklarla değişikliklerini kaydetmeyi unutma!",
                 "start": "Haritayı düzenlemeye başla!"
             }
         "shortcuts": {
             "title": "Klavye kısayolları",
             "tooltip": "Klavye kısayolları ekranını gösterin.",
+            "toggle": {
+                "key": "?"
+            },
             "key": {
                 "alt": "Alt",
                 "backspace": "Backspace",
                 "pgdn": "PgDn",
                 "pgup": "PgUp",
                 "return": "Enter",
-                "shift": "Shift"
+                "shift": "Shift",
+                "space": "Boşluk"
             },
             "gesture": {
                 "drag": "sürükle"
                     "background_switch": "Önceki arka plana geç",
                     "map_data": "Harita veri ayarları",
                     "fullscreen": "Tam ekran moduna gir",
+                    "wireframe": "Tel örgü moduna geçiniz",
                     "minimap": "Küçük haritayı aç/kapa"
                 },
                 "selecting": {
                     "add_line": "'Çizgi ekle' modu",
                     "add_area": "'Alan ekle' modu",
                     "place_point": "Bir nokta yerleştir",
+                    "disable_snap": "Nokta bitiştirmeyi iptal etmek için basılı tutun",
                     "stop_line": "Çizgi ya da alan çizimini tamamla"
                 },
                 "operations": {
                     "redo": "Son işlemi tekrar uygula",
                     "save": "Değişiklikleri Kaydet"
                 }
+            },
+            "tools": {
+                "title": "Araçlar",
+                "info": {
+                    "title": "Bilgi",
+                    "all": "Tüm bilgi panellerini açın",
+                    "background": "Arkaplan panelini açın",
+                    "history": "Geçmiş panelini açın",
+                    "location": "Konum panelini açın",
+                    "measurement": "Ölçüm panelini açın"
+                }
             }
         },
         "presets": {
                 "aeroway": {
                     "label": "Tür"
                 },
+                "agrarian": {
+                    "label": "Ürünler"
+                },
                 "amenity": {
                     "label": "Tür"
                 },
                 "board_type": {
                     "label": "Tür"
                 },
+                "boules": {
+                    "label": "Tür"
+                },
                 "boundary": {
                     "label": "Tür"
                 },
                 "brand": {
                     "label": "Marka"
                 },
+                "brewery": {
+                    "label": "Fıçı Bira"
+                },
                 "bridge": {
                     "label": "Tür",
                     "placeholder": "Varsayılan"
                 "bunker_type": {
                     "label": "Tür"
                 },
+                "cables": {
+                    "label": "Kablo",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "Yön (saat yönünde derece cinsinden)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "Kapasite",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "Yön",
-                    "options": {
-                        "E": "Doğu",
-                        "ENE": "Doğu-kuzeydoğu",
-                        "ESE": "Doğu-güneydoğu",
-                        "N": "Kuzey",
-                        "NE": "Kuzeydoğu",
-                        "NNE": "Kuzey-kuzeydoğu",
-                        "NNW": "Kuzey-kuzeybatı",
-                        "NW": "Kuzeybatı",
-                        "S": "Güney",
-                        "SE": "Güneydoğu",
-                        "SSE": "Güney-güneydoğu",
-                        "SSW": "Güney-güneybatı",
-                        "SW": "Güneybatı",
-                        "W": "Batı",
-                        "WNW": "Batı-kuzeybatı",
-                        "WSW": "Batı-güneybatı"
-                    }
-                },
                 "castle_type": {
                     "label": "Tür"
                 },
-                "clock_direction": {
-                    "label": "Yön",
-                    "options": {
-                        "anticlockwise": "Saat Yönünün Tersine",
-                        "clockwise": "Saat Yönünde"
-                    }
-                },
                 "clothes": {
                     "label": "Çamaşırlar"
                 },
                 "craft": {
                     "label": "Tür"
                 },
+                "crane/type": {
+                    "label": "Vinç Türü"
+                },
                 "crop": {
                     "label": "Tahıl"
                 },
                 "description": {
                     "label": "Açıklama"
                 },
+                "devices": {
+                    "label": "Aygıtlar",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "Bebek Bezi Değiştirmek Mümkün"
                 },
+                "direction": {
+                    "label": "Yön (Saat Yönünde Derece)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Yön",
+                    "options": {
+                        "E": "Doğu",
+                        "ENE": "Doğu-kuzeydoğu",
+                        "ESE": "Doğu-güneydoğu",
+                        "N": "Kuzey",
+                        "NE": "Kuzeydoğu",
+                        "NNE": "Kuzey-kuzeydoğu",
+                        "NNW": "Kuzey-kuzeybatı",
+                        "NW": "Kuzeybatı",
+                        "S": "Güney",
+                        "SE": "Güneydoğu",
+                        "SSE": "Güney-güneydoğu",
+                        "SSW": "Güney-güneybatı",
+                        "SW": "Güneybatı",
+                        "W": "Batı",
+                        "WNW": "Batı-kuzeybatı",
+                        "WSW": "Batı-güneybatı"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Yön",
+                    "options": {
+                        "anticlockwise": "Saat Yönünün Tersine",
+                        "clockwise": "Saat Yönünde"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Yön",
+                    "options": {
+                        "backward": "Geri",
+                        "both": "İleri ve Geri",
+                        "forward": "İleri"
+                    }
+                },
                 "display": {
                     "label": "Görüntü"
                 },
                         "wall": "Duvar"
                     }
                 },
+                "fitness_station": {
+                    "label": "Ekipman Türü"
+                },
                 "fixme": {
                     "label": "Düzeltme Notu"
                 },
                     "label": "Tür",
                     "placeholder": "Varsayılan"
                 },
+                "frequency": {
+                    "label": "Çalışma Sıklığı"
+                },
                 "fuel": {
                     "label": "Benzin İstasyonu"
                 },
                 "generator/type": {
                     "label": "Tür"
                 },
+                "government": {
+                    "label": "Hükümet"
+                },
                 "grape_variety": {
                     "label": "Meyve Çeşitleri"
                 },
                     "label": "Merdiven Korkuluğu"
                 },
                 "hashtags": {
+                    "label": "Önerilen Etiketler",
                     "placeholder": "#örnek"
                 },
                 "healthcare": {
                     "label": "İtibar",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "Yön",
-                    "options": {
-                        "backward": "Geri",
-                        "forward": "İleri"
-                    }
-                },
                 "park_ride": {
                     "label": "Park ve Devam Et"
                 },
                 "payment_multi": {
                     "label": "Ödeme Türleri"
                 },
+                "phases": {
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "Telefon",
                     "placeholder": "+31 42 123 4567"
                 "railway": {
                     "label": "Tür"
                 },
-                "recycling_accepts": {
-                    "label": "Kabul Ediyor"
-                },
-                "recycling_type": {
-                    "label": "Geri Dönüşüm Türleri",
+                "railway/signal/direction": {
+                    "label": "Yön",
                     "options": {
-                        "centre": "Geri Dönüşüm Merkezi",
-                        "container": "Konteyner"
+                        "backward": "Geri",
+                        "both": "İleri ve Geri",
+                        "forward": "İleri"
                     }
                 },
+                "recycling_accepts": {
+                    "label": "Kabul Ediyor"
+                },
                 "ref": {
                     "label": "Referans Kodu"
                 },
                 "structure_waterway": {
                     "options": {
                         "tunnel": "Tünel"
-                    }
+                    },
+                    "placeholder": "Bilinmiyor"
                 },
                 "studio": {
                     "label": "Tür"
                     },
                     "placeholder": "Sağlam, Yarı Sağlam, Yumuşak..."
                 },
+                "trade": {
+                    "label": "Tür"
+                },
                 "traffic_calming": {
                     "label": "Tür"
                 },
                 "traffic_signals": {
                     "label": "Tür"
                 },
+                "traffic_signals/direction": {
+                    "label": "Yön",
+                    "options": {
+                        "backward": "Geri",
+                        "both": "İkisi / Hepsi",
+                        "forward": "İleri"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Görüş Durumu",
                     "options": {
                     },
                     "placeholder": "Çok iyi, İyi, Kötü"
                 },
+                "transformer": {
+                    "label": "Tür",
+                    "options": {
+                        "auto": "Otomatik dönüştürücü",
+                        "auxiliary": "Yardımcı",
+                        "converter": "Dönüştürücü",
+                        "distribution": "Dağıtım",
+                        "yes": "Bilinmeyen"
+                    }
+                },
                 "trees": {
                     "label": "Ağaçlar"
                 },
                         "street": "5m ile 20m (16 - 65ft) arası"
                     }
                 },
+                "volcano/status": {
+                    "label": "Yanardağ Durumu",
+                    "options": {
+                        "active": "Etkin",
+                        "dormant": "Sönmüş",
+                        "extinct": "Sönük"
+                    }
+                },
+                "volcano/type": {
+                    "label": "Yanardağ Türü",
+                    "options": {
+                        "scoria": "Lav külü"
+                    }
+                },
+                "voltage": {
+                    "label": "Gerilim"
+                },
                 "wall": {
                     "label": "Tür"
                 },
                 },
                 "wikipedia": {
                     "label": "Vikipedi"
+                },
+                "windings": {
+                    "placeholder": "1, 2, 3..."
+                },
+                "windings/configuration": {
+                    "options": {
+                        "zigzag": "Zikzak"
+                    }
                 }
             },
             "presets": {
                     "terms": "Çekme Halat Teleferik"
                 },
                 "aerialway/station": {
-                    "name": "Teleferik İstasyonu",
-                    "terms": "Teleferik İstasyonu"
+                    "name": "Teleferik İstasyonu"
                 },
                 "aerialway/t-bar": {
                     "name": "Çubuklu Teleferik",
                     "terms": "Döviz Bürosu"
                 },
                 "amenity/bus_station": {
-                    "name": "Otogar",
-                    "terms": "Otogar, Otobüs Durağı"
+                    "name": "Otobüs Durağı / Terminali"
                 },
                 "amenity/cafe": {
                     "name": "Kafe",
                     "terms": "Kafe, Kafeterya"
                 },
+                "amenity/car_pooling": {
+                    "name": "Araba Paylaşım Yeri",
+                    "terms": "Araç İmece Yeri"
+                },
                 "amenity/car_rental": {
                     "name": "Araç Kiralama",
                     "terms": "Araç Kiralama, Oto Kiralama"
                     "terms": "Fast Food, Hazır Yiyecek"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Vapur İskelesi",
-                    "terms": "Vapur İskelesi, Feribot İskelesi, Feribot Terminali"
+                    "name": "Feribot Terminali"
                 },
                 "amenity/fire_station": {
                     "name": "İtfaiye",
                     "name": "Kütüphane",
                     "terms": "Kütüphane"
                 },
+                "amenity/love_hotel": {
+                    "name": "Aşk Oteli",
+                    "terms": "Cinsel İlişki Oteli, Sevişme Oteli"
+                },
                 "amenity/marketplace": {
                     "name": "Çarşı",
                     "terms": "Çarşı, Pazar Yeri"
                     "name": "Motosiklet Parkı",
                     "terms": "Motosiklet Parkı, Motosiklet Park Yeri"
                 },
+                "amenity/music_school": {
+                    "name": "Müzik Okulu",
+                    "terms": "Müzik Merkezi"
+                },
                 "amenity/nightclub": {
                     "name": "Gece Kulübü",
                     "terms": "Gece Kulübü"
                     "terms": "Korucu İstasyonu, Korucu Evi"
                 },
                 "amenity/recycling": {
-                    "name": "Geri Dönüşüm",
-                    "terms": "Geri Dönüşüm, Geri Dönüşüm Kutusu"
+                    "name": "Geri Dönüşüm Kutusu",
+                    "terms": "Geri Dönüşüm Konteyneri"
                 },
                 "amenity/recycling_centre": {
                     "name": "Geri Dönüşüm Merkezi",
                     "name": "Dışkı Toplama Poşet Otomatı",
                     "terms": "Dışkı Toplama Poşet Otomatı"
                 },
+                "amenity/vending_machine/feminine_hygiene": {
+                    "name": "Kadın Sağlık Otomatı",
+                    "terms": "Kadın Sağlık Otomatik Satış Makinası"
+                },
                 "amenity/vending_machine/news_papers": {
                     "name": "Gazete Otomatı"
                 },
                     "name": "Veteriner",
                     "terms": "Veteriner"
                 },
+                "amenity/waste/dog_excrement": {
+                    "name": "Köpek Dışkı Çöpü",
+                    "terms": "Köpek Dışkı Kutusu"
+                },
                 "amenity/waste_basket": {
                     "name": "Çöp Kutusu",
                     "terms": "Çöp Kutusu"
                     "name": "Yol Durumu",
                     "terms": "Yol Durumu"
                 },
+                "attraction/amusement_ride": {
+                    "name": "Eğlence Yolculuğu",
+                    "terms": "<translate with synonyms or related terms for 'Amusement Ride', separated by commas>"
+                },
                 "attraction/animal": {
                     "name": "Hayvan",
                     "terms": "Hayvan"
                 },
                 "building": {
                     "name": "Bina",
-                    "terms": "Bina"
+                    "terms": "Yapı"
                 },
                 "building/apartments": {
-                    "name": "Apartmanlar",
-                    "terms": "Apartmanlar"
+                    "name": "Apartman",
+                    "terms": "Apartman"
                 },
                 "building/barn": {
                     "name": "Samanlık",
                     "terms": "Samanlık"
                 },
+                "building/bungalow": {
+                    "name": "Tek Katlı Müstakil Ev",
+                    "terms": "Tek Katlı Müstakil Ev"
+                },
                 "building/bunker": {
                     "name": "Depo"
                 },
                 },
                 "building/cathedral": {
                     "name": "Katedral",
-                    "terms": "Katedral, Büyük Kilisi, Başkilise, İbadet Yeri"
+                    "terms": "Büyük Kilisi, Başkilise, İbadet Yeri"
                 },
                 "building/chapel": {
                     "name": "Şapel",
-                    "terms": "Şapel, Küçük Kilise, İbadet Yeri"
+                    "terms": "Küçük Kilise, İbadet Yeri"
                 },
                 "building/church": {
                     "name": "Kilise",
                     "terms": "Kilise"
                 },
+                "building/civic": {
+                    "name": "Kamu Binası",
+                    "terms": "Kamu Binası"
+                },
                 "building/college": {
-                    "name": "Üniversite",
-                    "terms": "Üniversite, Yüksekokul"
+                    "name": "Yüksekokul",
+                    "terms": "Yüksekokul"
                 },
                 "building/commercial": {
                     "name": "Ticari Bina",
-                    "terms": "Ticari Bina, Alışveriş Yeri"
+                    "terms": "Alışveriş Yeri"
                 },
                 "building/construction": {
                     "name": "Bina İnşaatı",
-                    "terms": "Bina İnşaatı"
+                    "terms": "İnşaat"
                 },
                 "building/detached": {
-                    "name": "Müstakil",
-                    "terms": "Müstakil"
+                    "name": "Müstakil Ev",
+                    "terms": "Müstakil Ev"
                 },
                 "building/dormitory": {
                     "name": "Yurt",
-                    "terms": "Yurt, Öğrenci Yurdu"
+                    "terms": "Öğrenci Yurdu"
                 },
                 "building/entrance": {
                     "name": "Giriş/Çıkış"
                 },
+                "building/farm": {
+                    "name": "Çiftlik",
+                    "terms": "Çiftlik"
+                },
                 "building/garage": {
                     "name": "Garaj",
                     "terms": "Garaj"
                 },
                 "building/garages": {
-                    "name": "Garaj",
-                    "terms": "Garaj"
+                    "name": "Garajlar",
+                    "terms": "Garajlar"
                 },
                 "building/greenhouse": {
                     "name": "Sera",
                 },
                 "building/hut": {
                     "name": "Kulübe",
-                    "terms": "Kulübe, Baraka"
+                    "terms": "Baraka"
                 },
                 "building/industrial": {
-                    "name": "Endüstriyel Bina",
-                    "terms": "Endüstriyel Bina, Sanayi"
+                    "name": "Sanayi",
+                    "terms": "Endüstriyel Bina"
                 },
                 "building/kindergarten": {
                     "name": "Anaokulu",
-                    "terms": "Anaokulu, Kreş"
+                    "terms": "Kreş"
+                },
+                "building/mosque": {
+                    "name": "Camii",
+                    "terms": "Camii"
                 },
                 "building/public": {
                     "name": "Devlet Binası",
                     "terms": "Devlet Binası"
                 },
                 "building/residential": {
-                    "name": "Yerleşim Yeri",
-                    "terms": "Yerleşim Yeri, Yaşam Kompleksi"
+                    "name": "Konut",
+                    "terms": "Konut"
                 },
                 "building/retail": {
-                    "name": "Alışveriş Merkezi",
-                    "terms": "Alışveriş Merkezi, Çarşı"
+                    "name": "Satış Mağazası",
+                    "terms": "Satış Mağazası"
                 },
                 "building/roof": {
                     "name": "Çatı",
                     "terms": "Çatı"
                 },
+                "building/ruins": {
+                    "name": "Bina Kalıntısı",
+                    "terms": "Bina Kalıntısı"
+                },
                 "building/school": {
                     "name": "Okul",
                     "terms": "Okul"
                     "name": "Bitişik Nizam Ev",
                     "terms": "Bitişik Nizam Ev"
                 },
+                "building/service": {
+                    "name": "Servis Binası",
+                    "terms": "Servis Binası"
+                },
                 "building/shed": {
                     "name": "Kulübe",
-                    "terms": "Kulübe, Küçük Kulübe, Baraka"
+                    "terms": "Küçük Kulübe, Baraka"
                 },
                 "building/stable": {
                     "name": "Ahır",
                     "terms": "Ahır"
                 },
+                "building/stadium": {
+                    "name": "Stadyum",
+                    "terms": "Stadyum"
+                },
                 "building/static_caravan": {
                     "name": "Karavan",
                     "terms": "Karavan"
                 },
+                "building/temple": {
+                    "name": "Tapınak",
+                    "terms": "Tapınak"
+                },
                 "building/terrace": {
                     "name": "Sıra Evler",
                     "terms": "Sıra Evler"
                 "building/train_station": {
                     "name": "Tren İstasyonu"
                 },
+                "building/transportation": {
+                    "name": "Terminal",
+                    "terms": "Terminal"
+                },
                 "building/university": {
                     "name": "Üniversite",
                     "terms": "Üniversite"
                 },
                 "building/warehouse": {
                     "name": "Depo",
-                    "terms": "Depo, Ambar"
+                    "terms": "Ambar"
                 },
                 "camp_site/camp_pitch": {
                     "name": "Kamp Ateş Alanı",
                     "name": "Alternatif Tıp",
                     "terms": "Alternatif Tıp"
                 },
+                "healthcare/alternative/chiropractic": {
+                    "name": "Masör",
+                    "terms": "Masaj Uzmanı"
+                },
+                "healthcare/audiologist": {
+                    "name": "Ses Uzmanı",
+                    "terms": "Odyolog"
+                },
+                "healthcare/birthing_center": {
+                    "name": "Doğum Merkezi",
+                    "terms": "Bebek Merkezi"
+                },
                 "healthcare/blood_donation": {
                     "name": "Kan Bağış Merkezi",
                     "terms": "Kan Bağış Merkezi"
                 },
+                "healthcare/hospice": {
+                    "name": "Darülaceze",
+                    "terms": "Düşkünlerevi"
+                },
+                "healthcare/midwife": {
+                    "name": "Ebe",
+                    "terms": "Hemşire"
+                },
+                "healthcare/occupational_therapist": {
+                    "name": "Tedavi Uzmanı",
+                    "terms": "Tedavi Sorumlusu"
+                },
+                "healthcare/optometrist": {
+                    "name": "Göz Doktoru",
+                    "terms": "Optometri Uzmanı"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "Fizik Tedavi Uzmanı",
+                    "terms": "Fizyoterapist"
+                },
+                "healthcare/podiatrist": {
+                    "name": "Ayak Hastalıkları Uzmanı",
+                    "terms": "Podiyatri Uzmanı"
+                },
+                "healthcare/psychotherapist": {
+                    "name": "Ruh Sağlıkları Uzmanı",
+                    "terms": "Psikoterapist"
+                },
+                "healthcare/rehabilitation": {
+                    "name": "Rehabilitasyon Merkezi, İyileştirme Merkezi",
+                    "terms": "Rehabilitasyon Tesisi"
+                },
+                "healthcare/speech_therapist": {
+                    "name": "Konuşma Terapisti",
+                    "terms": "Konuşma Uzmanı"
+                },
                 "highway": {
                     "name": "Yol"
                 },
                     "name": "At Yolu",
                     "terms": "At Yolu, At Yürüyüş Yolu"
                 },
-                "highway/bus_stop": {
-                    "name": "Otobüs Durağı",
-                    "terms": "Otobüs Durağı, Durak"
-                },
                 "highway/corridor": {
                     "name": "Koridor",
                     "terms": "Koridor, Geçit"
                     "name": "Patika",
                     "terms": "Patika, Yol"
                 },
+                "highway/pedestrian_line": {
+                    "name": "Yaya Yolu"
+                },
                 "highway/primary": {
                     "name": "Anayol",
                     "terms": "Anayol"
                     "name": "Orman",
                     "terms": "Orman"
                 },
-                "landuse/garages": {
-                    "name": "Park Yeri",
-                    "terms": "Park Yeri, Garaj "
-                },
                 "landuse/grass": {
                     "name": "Çimenlik",
                     "terms": "Çimenlik, Yeşil Alan"
                     "name": "Sanayi Bölgesi",
                     "terms": "Sanayi Bölgesi, Sanayi Alanı"
                 },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "Kesimevi"
+                },
                 "landuse/landfill": {
                     "name": "Çöp Sahası",
                     "terms": "Çöp Sahası, Çöplük"
                 },
                 "office": {
                     "name": "Ofis",
-                    "terms": "Ofis, Büro"
+                    "terms": "Büro"
+                },
+                "office/accountant": {
+                    "name": "Muhasebeci",
+                    "terms": "Muhasebe Ofisi"
                 },
                 "office/administrative": {
-                    "name": "İdari Ofis",
-                    "terms": "İdari Ofis"
+                    "name": "İdari Ofis"
+                },
+                "office/adoption_agency": {
+                    "name": "Evlat Edinme Ajansı",
+                    "terms": "Evlat Edinme Ofisi"
+                },
+                "office/advertising_agency": {
+                    "name": "Reklam Ajansı",
+                    "terms": "Reklam Ofisi"
+                },
+                "office/architect": {
+                    "name": "Mimarlık Ofisi",
+                    "terms": "Mimar"
+                },
+                "office/association": {
+                    "name": "Yardım Kuruluşu",
+                    "terms": "Yardım Kuruluşu Merkezi"
+                },
+                "office/charity": {
+                    "name": "Hayır Kurumu",
+                    "terms": "Hayır Kurumu Şubesi"
                 },
                 "office/company": {
                     "name": "Şirket",
-                    "terms": "Şirket"
+                    "terms": "Şirket Ofisi, Şirket Şubesi"
                 },
                 "office/coworking": {
                     "name": "Ortak Çalışma Alanı",
-                    "terms": "Ortak Çalışma Alanı"
+                    "terms": "Ortak Çalışma Yeri"
                 },
                 "office/educational_institution": {
                     "name": "Eğitim Kurumu",
-                    "terms": "Eğitim Kurumu, Okul"
+                    "terms": "Okul"
                 },
                 "office/employment_agency": {
                     "name": "İş ve İşçi Bulma Kurumu",
-                    "terms": "İş ve İşçi Bulma Kurumu"
+                    "terms": "İş ve İşçi Bulma Şubesi"
+                },
+                "office/energy_supplier": {
+                    "name": "Enerji Kurumu Şubesi",
+                    "terms": "Enerji Kurumu Ofisi"
                 },
                 "office/estate_agent": {
                     "name": "Gayrimenkul Ofisi",
-                    "terms": "Gayrimenkul Ofisi, Emlak Ofisi"
+                    "terms": "Emlak Ofisi"
                 },
                 "office/financial": {
                     "name": "Finans Ofisi",
-                    "terms": "Finans Ofisi"
+                    "terms": "Finans Şubesi"
+                },
+                "office/forestry": {
+                    "name": "Ormancılık Şubesi",
+                    "terms": "Ormancılık Merkezi"
+                },
+                "office/foundation": {
+                    "name": "Vakıf",
+                    "terms": "Vakıf Şubesi"
                 },
                 "office/government": {
                     "name": "Devlet Dairesi",
-                    "terms": "Devlet Dairesi"
+                    "terms": "Devlet Kurumu"
                 },
                 "office/government/register_office": {
                     "name": "Nüfus Dairesi",
-                    "terms": "Nüfus Dairesi"
+                    "terms": "Nüfus İdaresi"
+                },
+                "office/government/tax": {
+                    "name": "Vergi Dairesi",
+                    "terms": "Vergi İdaresi"
+                },
+                "office/guide": {
+                    "name": "Tur Rehberi",
+                    "terms": "Tur Rehber Merkezi"
                 },
                 "office/insurance": {
                     "name": "Sigorta Acentesi",
-                    "terms": "Sigorta Acentesi"
+                    "terms": "Sigorta Şirket Şubesi"
+                },
+                "office/it": {
+                    "name": "Bilişim Teknoloji Ofisi",
+                    "terms": "Bilişim Teknoloji Merkezi"
                 },
                 "office/lawyer": {
                     "name": "Hukuk Bürosu",
-                    "terms": "Hukuk Bürosu"
+                    "terms": "Hukuk Şirketi Şubesi"
                 },
                 "office/lawyer/notary": {
-                    "name": "Noter",
-                    "terms": "Noter"
+                    "name": "Noter"
+                },
+                "office/moving_company": {
+                    "name": "Taşıma Şirketi Ofisi",
+                    "terms": "Nakliye Şubesi"
+                },
+                "office/newspaper": {
+                    "name": "Gazete Şubesi",
+                    "terms": "Gazete Ofisi"
                 },
                 "office/ngo": {
                     "name": "Sivil Toplum Örgütü",
-                    "terms": "Sivil Toplum Örgütü"
+                    "terms": "Sivil Toplum Kuruluşu"
+                },
+                "office/notary": {
+                    "name": "Noter",
+                    "terms": "Noter Şubesi"
                 },
                 "office/physician": {
                     "name": "Hekim"
                 },
                 "office/political_party": {
                     "name": "Siyasi Parti",
-                    "terms": "Siyasi Parti"
+                    "terms": "Parti Şubesi"
+                },
+                "office/private_investigator": {
+                    "name": "Dedektif",
+                    "terms": "Dedektif Şubesi"
+                },
+                "office/quango": {
+                    "name": "Yarı Özel Sivil Toplum Örgütü",
+                    "terms": "Yarı Özel Sivil Toplum Kuruluşu"
                 },
                 "office/research": {
-                    "name": "Araştırma Ofisi",
-                    "terms": "Araştırma Ofisi"
+                    "name": "Araştırma Kurumu",
+                    "terms": "Araştırma Şubesi"
+                },
+                "office/surveyor": {
+                    "name": "Harita Mühendisliği",
+                    "terms": "Harita Etüt Mühendisliği"
+                },
+                "office/tax_advisor": {
+                    "name": "Vergi Danışmanlığı",
+                    "terms": "Vergi Danışmanlığı Şubesi"
                 },
                 "office/telecommunication": {
                     "name": "Haberleşme Bürosu",
-                    "terms": "Haberleşme Bürosu, Telekomünikasyon Bürosu, Telekom Bürosu"
+                    "terms": "Telekomünikasyon Bürosu, Telekom Bürosu"
+                },
+                "office/therapist": {
+                    "name": "Terapist",
+                    "terms": "Terapi Uzmanı"
                 },
                 "office/travel_agent": {
                     "name": "Seyahat Acentesi"
                 },
+                "office/water_utility": {
+                    "name": "Su Müdürlüğü",
+                    "terms": "Su ve Kanalizasyon Müdürlüğü"
+                },
                 "piste": {
                     "name": "Kayak Pisti",
                     "terms": "Kayak Pisti"
                     "name": "Transformatör",
                     "terms": "Transformatör"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Toplu Taşıma Durağı",
+                    "terms": "Toplu Taşıma Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Havayolu Durağı",
+                    "terms": "Havayolu ile Taşıma Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Otobüs Durağı",
+                    "terms": "Durak, Otobüs Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Feribot Terminali",
+                    "terms": "Feribot Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Raybüs Durağı",
+                    "terms": "Raybüs, Hafif Raylı Taşıt Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Tek Raylı Tren İstasyonu",
+                    "terms": "Tek Raylı Tren Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Metro Durağı",
+                    "terms": "Metro Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Tren Durağı",
+                    "terms": "Tren Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Tramvay Durağı",
+                    "terms": "Tramvay Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Troleybüs Durağı",
+                    "terms": "Troleybüs, Raysız Tramvay Yolcu İndirme/Bindirme Platformu"
+                },
                 "public_transport/platform": {
-                    "name": "Peron",
-                    "terms": "Peron"
+                    "name": "Toplu Taşıma Durağı",
+                    "terms": "Toplu Taşıma Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Havayolu Durağı",
+                    "terms": "Havayolu ile Taşıma Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Otobüs Durağı",
+                    "terms": "Durak, Otobüs Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Feribot Terminali",
+                    "terms": "Feribot Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Raybüs Durağı",
+                    "terms": "Raybüs, Hafif Raylı Taşıt Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Tek Raylı Tren İstasyonu",
+                    "terms": "Tek Raylı Tren Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Metro Durağı",
+                    "terms": "Metro Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_train": {
+                    "name": "Tren Durağı",
+                    "terms": "Tren Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Tramvay Durağı",
+                    "terms": "Tramvay Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Troleybüs Durağı",
+                    "terms": "Troleybüs, Raysız Tramvay Yolcu İndirme/Bindirme Platformu"
+                },
+                "public_transport/station": {
+                    "name": "Toplu Taşıma Terminali",
+                    "terms": "Toplu Taşıma İstasyonu"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Havayolu İstasyonu",
+                    "terms": "Havayolu ile Taşıma İstasyonu, Havayolu ile Taşıma Terminali"
+                },
+                "public_transport/station_bus": {
+                    "name": "Otobüs Terminali",
+                    "terms": "Otobüs İstasyonu"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Feribot Terminali",
+                    "terms": "Feribot İstasyonu"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Raybüs İstasyonu",
+                    "terms": "Raybüs Terminali, Hafif Raylı Taşıma İstasyonu"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Tek Raylı Tren İstasyonu",
+                    "terms": "Tek Raylı Tren Terminali"
+                },
+                "public_transport/station_subway": {
+                    "name": "Metro İstasyonu",
+                    "terms": "Metro Terminali"
+                },
+                "public_transport/station_train": {
+                    "name": "Gar",
+                    "terms": "Tren İstasyonu"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Tren Durma Yeri (Dur/Kalk)",
+                    "terms": "Tren Yolcu İndirme/Birdirme Yeri (Dur/Kalk)"
+                },
+                "public_transport/station_tram": {
+                    "name": "Tramvay İstasyonu",
+                    "terms": "Tramvay Terminali"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Troleybüs Terminali",
+                    "terms": "Raysız Tramvay Terminali"
+                },
+                "public_transport/stop_area": {
+                    "name": "Toplu Taşıma Yolcu İndirme/Bindirme Yeri",
+                    "terms": "Toplu Taşıma Yolcu İndirme/Bindirme Alanı"
                 },
                 "public_transport/stop_position": {
-                    "name": "Otobüs Durma Yeri",
-                    "terms": "Otobüs Durma Yeri"
+                    "name": "Toplu Taşıma Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Toplu Taşıma Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Havayolu Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Havayolu Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Otobüs Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Otobüs Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Feribot Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Vapur Yolcu İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Raybüs Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Raybüs, Hafif Raylı Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Tek Raylı Tren Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Tek Raylı Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Metro Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Metro Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Tren Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Tren Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Tramvay Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Tramvay Yol Üstü İndirme/Bindirme Noktası"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Troleybüs Yolcu İndirme/Bindirme Noktası",
+                    "terms": "Raysız Tramvay Yol Üstü İndirme/Bindirme Noktası"
                 },
                 "railway": {
                     "name": "Demiryolu"
                     "name": "Kablolu Tren",
                     "terms": "Kablolu Tren, Füniküler"
                 },
-                "railway/halt": {
-                    "name": "Demiryolu Durağı",
-                    "terms": "Demiryolu Durağı"
-                },
                 "railway/level_crossing": {
                     "name": "Hemzemin Geçit (Yol ile Kesişim)",
                     "terms": "Hemzemin Geçit (Yol ile Kesişim)"
                     "name": "Dar Demiryolu Geçidi",
                     "terms": "Dar Demiryolu Geçidi"
                 },
-                "railway/platform": {
-                    "name": "Demiryolu Platformu",
-                    "terms": "Demiryolu Platformu"
-                },
                 "railway/rail": {
                     "name": "Demiryolu",
                     "terms": "Demiryolu"
                 },
-                "railway/station": {
-                    "name": "Tren İstasyonu",
-                    "terms": "Tren İstasyonu"
-                },
                 "railway/subway": {
                     "name": "Metro",
                     "terms": "Metro"
                     "name": "Tramvay",
                     "terms": "Tramvay"
                 },
-                "railway/tram_stop": {
-                    "name": "Tramvay Durağı",
-                    "terms": "Tramvay Durağı"
-                },
                 "relation": {
                     "name": "İlişki",
                     "terms": "İlişki, Bağlantı"
                     "name": "Kuyumcu",
                     "terms": "Kuyumcu"
                 },
-                "shop/kiosk": {
-                    "name": "Büfe",
-                    "terms": "Büfe"
-                },
                 "shop/kitchen": {
                     "name": "Mutfak Eşyaları Mağazası",
                     "terms": "Mutfak Eşyaları Mağazası"
                 "description": "DigitalGlobe Uydu Görüntüleri",
                 "name": "DigitalGlobe Uydu Görüntüleri"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "Şartlar ve Geri Bildirim"
+                },
+                "description": "Görüntü sınırları ve çekilme tarihleri. Etiketler yakınlaştırma düzeyi 14 veya daha üstünde gösterilir.",
+                "name": "DigitalGlobe Özel Görüntü Dönemi Ürünü"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
-                    "text": "Şartlar & Geri Bildirim"
+                    "text": "Şartlar ve Geri Bildirim"
                 },
                 "description": "Standart DigitalGlobe Uydu Görüntüleri",
                 "name": "Standart DigitalGlobe Uydu Görüntüleri"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "Şartlar ve Geri Bildirim"
+                },
+                "description": "Görüntü sınırları ve çekilme tarihleri. Etiketler yakınlaştırma düzeyi 14 veya daha üstünde gösterilir.",
+                "name": "DigitalGlobe Standard Görüntü Dönemi Ürünü"
+            },
             "EsriWorldImagery": {
                 "attribution": {
-                    "text": "Şartlar & Geri Bildirim"
+                    "text": "Şartlar ve Geri Bildirim"
                 },
                 "description": "Esri Uydu Görüntüleri",
                 "name": "Esri Uydu Görüntüleri"
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap destekçileri, CC-BY-SA"
                 },
-                "name": "OSM Müfettiş: Alan"
+                "name": "OSM Müfettişi: Alan"
             },
             "OSM_Inspector-Places": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap destekçileri, CC-BY-SA"
-                }
+                },
+                "name": "OSM Müfettişi: Yerler"
             },
             "OSM_Inspector-Routing": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap destekçileri, CC-BY-SA"
-                }
+                },
+                "name": "OSM Müfettişi: Rota"
             },
             "OSM_Inspector-Tagging": {
                 "attribution": {
                     "text": "© Geofabrik GmbH, OpenStreetMap destekçileri, CC-BY-SA"
-                }
+                },
+                "name": "OSM Müfettişi: Etiketleme"
+            },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "16'dan büyük ölçekte, US Census verileri. Daha küçük ölçeklerde, 2006'dan bu yana yapılmış güncellemeler - OpenStreetMap güncellemeleri hariç",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "Sarı = US Census harita verileri. Kırmızı = OpenStreetMap'te yer almayan veriler.",
+                "name": "TIGER Roads 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, harita verileri OpenStreetMap destekçileri, ODbL 1.0"
-                }
+                "name": "Waymarked Trails: Bisiklet"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, harita verileri OpenStreetMap destekçileri, ODbL 1.0"
-                }
+                "name": "Waymarked Trails: Yürüyüş"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, harita verileri OpenStreetMap destekçileri, ODbL 1.0"
-                }
+                "name": "Waymarked Trails: Dağ Bisikleti"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, harita verileri OpenStreetMap destekçileri, ODbL 1.0"
-                }
+                "name": "Waymarked Trails: Kaykay"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, harita verileri OpenStreetMap destekçileri, ODbL 1.0"
-                }
+                "name": "Waymarked Trails: Kış Sporları"
             },
             "basemap.at": {
                 "attribution": {
                     "text": "basemap.at"
                 },
+                "description": "Hükümet verilerinden oluşturulmuş Avusturya haritası",
                 "name": "basemap.at"
             },
             "basemap.at-orthofoto": {
                 "attribution": {
                     "text": "basemap.at"
                 },
+                "description": "basemap.at - daha önce geoimage.at - tarafından sağlanan Orthofoto katmanı.",
                 "name": "basemap.at Orthofoto"
             },
             "hike_n_bike": {
                 "attribution": {
                     "text": "© OpenStreetMap destekçileri"
-                }
+                },
+                "name": "Yürüyüş & Bisiklet"
             },
             "mapbox_locator_overlay": {
                 "attribution": {
                     "text": "Şartlar & Geri Bildirim"
                 },
+                "description": "Sadece önemli özellikler gösteriliyor.",
                 "name": "Yer Belirleyici Yerleşimi"
             },
             "openpt_map": {
                 "attribution": {
                     "text": "© OpenStreetMap katkıda bulunan kullanıcılar, CC-BY-SA"
-                }
+                },
+                "name": "OpenPT Map (katman)"
             },
             "osm-gps": {
                 "attribution": {
                     "text": "© OpenStreetMap destekçileri"
-                }
+                },
+                "description": "OpenStreetMap'e yüklenmiş GPS rotaları",
+                "name": "OpenStreetMap GPS rotaları"
             },
             "osm-mapnik-black_and_white": {
                 "attribution": {
             "osm-mapnik-german_style": {
                 "attribution": {
                     "text": "© OpenStreetMap destekçileri, CC-BY-SA"
-                }
+                },
+                "name": "OpenStreetMap (Alman Stil)"
+            },
+            "qa_no_address": {
+                "attribution": {
+                    "text": "Simon Poole, Veriler © OpenStreetMap destekçileri"
+                },
+                "name": "Adres Yok"
+            },
+            "skobbler": {
+                "attribution": {
+                    "text": "Harita © skobbler, Veriler © OpenStreetMap destekçileri"
+                },
+                "name": "skobbler"
+            },
+            "stamen-terrain-background": {
+                "attribution": {
+                    "text": "Harita Stamen Design, CC BY 3.0"
+                },
+                "name": "Stamen Arazi"
+            },
+            "tf-cycle": {
+                "attribution": {
+                    "text": "Harita © Thunderforest, Veriler © OpenStreetMap destekçileri"
+                },
+                "name": "Thunderforest OpenCycleMap"
+            },
+            "tf-landscape": {
+                "attribution": {
+                    "text": "Harita © Thunderforest, Veriler © OpenStreetMap destekçileri"
+                },
+                "name": "Thunderforest Arazi"
             }
         }
     }
index 568d49da3bf323ddcd003329cab601bab8b8014c..f4395772ec9d674ecdbdd6f1c1b9a604b4fb5678 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Клацніть, щоб додати ще точку до лінії. Клацніть на іншу лінію, щоб з’єднатись з нею, подвійне клацання — завершення креслення лінії."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Об’єкт неможливо вилучити, оскільки він з’єднаний з прихованим об’єктом."
             }
         },
         "operations": {
             "restriction": {
                 "help": {
                     "select": "Клацніть для вибору відрізку дороги",
-                    "toggle": "Ð\9aлаÑ\86нÑ\96Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ð²Ð¸Ð±Ð¾Ñ\80Ñ\83 Ð·Ð°Ð±Ð¾Ñ\80они Ð¿Ð¾Ð²Ð¾Ñ\80оÑ\82Ñ\83",
+                    "toggle": "Ð\9aлаÑ\86нÑ\96Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ð²Ð¸Ð±Ð¾Ñ\80Ñ\83 Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f Ð¼Ð°Ð½ÐµÐ²Ñ\80а",
                     "toggle_on": "Клацніть для додавання заборони \"{restriction}\".",
                     "toggle_off": "Клацніть для видалення заборони \"{restriction}\"."
                 },
             "about_changeset_comments": "Про опис наборів змін",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Uk:Good_changeset_comments",
             "google_warning": "Ви загадали Google в цьому коментарі; запамʼятайте, що використовувати Google Maps забороняється!",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "Редагували: {users}",
                 "key": "И",
                 "title": "Фон",
                 "zoom": "Масштаб",
-                "vintage": "Ð\9aлаÑ\81иÑ\87ний",
+                "vintage": "Ð\9fеÑ\80Ñ\96од",
                 "source": "Джерело",
                 "description": "Опис",
                 "resolution": "Роздільна здатність",
                 "unknown": "Невідомо",
                 "show_tiles": "Показати тайли",
                 "hide_tiles": "Сховати тайли",
-                "show_vintage": "Показати Vintage",
-                "hide_vintage": "Приховати Vintage"
+                "show_vintage": "Показати період",
+                "hide_vintage": "Приховати період"
             },
             "history": {
                 "key": "Р",
                 "title": "Вимірювання",
                 "selected": "{n} виділено",
                 "geometry": "Геометрія",
-                "closed": "замкнена",
+                "closed_line": "замкнена лінія",
+                "closed_area": "полігон",
                 "center": "Центр",
                 "perimeter": "Периметр",
                 "length": "Довжина",
                 "centroid": "Центроїд",
                 "location": "Місце",
                 "metric": "Метрична",
-                "imperial": "Імперська"
+                "imperial": "Імперська",
+                "node_count": "Кількість точок"
             }
         },
         "geometry": {
             "title": "Тло",
             "description": "Налаштування тла",
             "key": "B",
-            "percent_brightness": "прозорість {opacity}%",
-            "none": "Ð\9fÑ\83Ñ\81Ñ\82е",
+            "backgrounds": "Фони",
+            "none": "Ð\9dÑ\96Ñ\87ого",
             "best_imagery": "Найкращі супутникові знімки для цього місця",
             "switch": "Ввімкнути цей шар",
             "custom": "Власний фон",
             "custom_button": "Параметри власного фону",
-            "custom_prompt": "Введіть шаблон URL для квадратів мапи. Використовуйте:\n   - {zoom}/{z}, {x}, {y} для Z/X/Y схеми\n   - {ty} для оберненної  Y-координати в TMS-стилі\n   - {u} для схеми QuadTiles\n   - {switch:a,b,c} у разі використання DNS мультиплексування на сервері\n\nПриклад:\n{example}",
-            "fix_misalignment": "Налаштування зсуву тла",
-            "imagery_source_faq": "Ð\97вÑ\96дки Ñ\86Ñ\96 Ð·Ð½Ñ\96мки?",
+            "custom_prompt": "Введіть шаблон URL для квадратів мапи. Використовуйте:\n   - {zoom} обо {z}, {x}, {y} для Z/X/Y схеми\n   - {-y} або {ty} для оберненної Y-координати в TMS-стилі\n   - {u} для схеми QuadTiles\n   - {switch:a,b,c} у разі використання DNS мультиплексування на сервері\n\nПриклад:\n{example}",
+            "overlays": "Шари",
+            "imagery_source_faq": "Ð\9fÑ\80о Ñ\84онове Ð·Ð¾Ð±Ñ\80аженнÑ\8f\9fовÑ\96домиÑ\82и Ð¿Ñ\80о Ð¿Ñ\80облемÑ\83",
             "reset": "скинути",
-            "offset": "Перетягніть сіре поле в потрібному напрямку для підлаштування зміщення фону, або введіть значення зміщення в метрах.",
+            "display_options": "Параметри відображення",
+            "brightness": "Яскравість",
+            "contrast": "Контрастність",
+            "saturation": "Насиченість",
+            "sharpness": "Різкість",
             "minimap": {
-                "description": "Ð\9cÑ\96нÑ\96мапа",
+                "description": "Ð\9fоказаÑ\82и Ð¼Ñ\96нÑ\96мапÑ\83",
                 "tooltip": "Показує зменшену мапу, щоб допомогти з’ясувати місцезнаходження поточної ділянки.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Налаштування зсуву тла",
+            "offset": "Перетягніть сіре поле в потрібному напрямку для підлаштування зміщення фону, або введіть значення зміщення в метрах."
         },
         "map_data": {
             "title": "Дані мапи",
             "status_code": "Сервер повернув код стану {code}",
             "unknown_error_details": "Переконайтесь, що ви під’єднані до Інтернету.",
             "uploading": "Надсилання змін до OpenStreetMap.",
+            "conflict_progress": "Перевірка  на наявність конфліктів: {num} з {total}",
             "unsaved_changes": "Ви маєте незбережені правки",
             "conflict": {
                 "header": "Розв’язання конфліктуючих правок",
             "untagged_area_tooltip": "Виберіть тип об’єкта, що відповідає цьому полігону.",
             "untagged_relation": "Звʼязок без теґів",
             "untagged_relation_tooltip": "Оберіть тип об’єкту, що описує чим є звʼязок.",
-            "many_deletions": "Ви збираєтесь вилучити {n} об’єктів. Ви дійсно бажаєте це зробити? Таке вилучення призведе до їх зникнення з мапи openstreetmap.org.",
+            "many_deletions": "Ви збираєтесь вилучити {n} об’єкт(ів): {p} точок, {l} ліній, {a} полігонів, {r} зв'язків.  Ви дійсно бажаєте це зробити? Таке вилучення призведе до їх зникнення з мапи openstreetmap.org.",
             "tag_suggests_area": "Теґ {tag} зазвичай ставиться на полігони, але об’єкт не є полігоном",
             "deprecated_tags": "Застарілі теґи: {tags}"
         },
         },
         "mapillary_images": {
             "tooltip": "Знімки з вулиць від Mapillary",
-            "title": "Фото-шар (Mapillary)"
+            "title": "Фотознімки (Mapillary)"
         },
         "mapillary_signs": {
-            "tooltip": "Дорожні знаки з Mapillary (потрібно увімкнути Фото-шар)",
-            "title": "ШаÑ\80 Ð´Ð¾Ñ\80ожнÑ\96Ñ\85 Ð·Ð½Ð°ÐºÑ\96в (Mapillary)"
+            "tooltip": "Дорожні знаки з Mapillary (потрібно увімкнути Фотознімки)",
+            "title": "Ð\94оÑ\80ожнÑ\96 Ð·Ð½Ð°ÐºÐ¸ (Mapillary)"
         },
         "mapillary": {
             "view_on_mapillary": "Переглянути цей знімок на Mapillary"
         },
         "openstreetcam_images": {
             "tooltip": "Знімки з вулиць від OpenStreetCam",
-            "title": "Фото-шар (OpenStreetCam)"
+            "title": "Фотознімки (OpenStreetCam)"
         },
         "openstreetcam": {
             "view_on_openstreetcam": "Переглянути цей знімок на OpenStreetCam"
         "help": {
             "title": "Довідка",
             "key": "H",
-            "help": "# Довідка\n\nЦе редактор [OpenStreetMap](http://www.openstreetmap.org/) —\nвільної мапи світу, правити яку може кожен. Ви можете використовувати\nйого для додавання та виправлення даних, створюючи найкращу\nвідкриту мапу світу з вільними, доступними всім, картографічними даними.\n\nЗміни, які ви вносите до цієї мапи, будуть доступні всім\nіншим, хто використовує OpenStreetMap. Для того, щоб вносити\nзміни вам потрібно\n[Ввійти](https://www.openstreetmap.org/login).\n\n[Редактор iD](http://ideditor.com/) — є суспільним проектом з [сирцями\nдоступними на GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Редагування та збереження\n\nЦей редактор створений переважно для роботи онлайн, і зараз ви\nпрацюєте з ним на веб-сайті.\n\n### Виділення об’єктів\n\nДля виділення об’єктів на мапі, таких як дороги чи пам’ятки, треба клацнути\nпо них на мапі. Виділені об’єкти будуть підсвічені, з’явиться панель з\nподробицями про них. Клацнувши по ним правою кнопкою миші, ви побачите меню\nіз переліком того, що можна з ними зробити.\n\nДля виділення кількох об’єктів натисніть 'Shift'. Потім клацайте на потрібні\nоб'єкти або клацніть та потягніть мишею по мапі, малюючи контур навколо них.\nБудуть виділені всі об’єкти, що потрапили у контур виділення.\n\n### Збереження правок\n\nПісля того як ви зробили зміни, виправивши дорогу, чи будинок, вони\nзалишаються на вашому компʼютері, доки ви не збережете їх на сервері.\nНе хвилюйтесь, якщо ви припустились помилки, ви можете відкинути\nзміни натиснувши на кнопку 'Скасувати', а також повернути зміни назад —\nнатиснувши 'Повернути'\n\nНатисніть 'Зберегти', щоб зафіксувати групу правок, наприклад, якщо ви\nзакінчили роботу над одним районом міста і бажаєте перейти до іншого. Ви\nбудете мати можливість переглянути те, що ви зробили, а редактор\nзапропонує вам корисні поради та видасть попередження, якщо ваші\nправки не виглядають правильними.\n\nЯкщо все виглядає добре, ви можете додати коротке пояснення того, що ви\nзробили та натиснути кнопку 'Зберегти' ще раз, щоб надіслати зміни до\n[OpenStreetMap.org](http://www.openstreetmap.org/), де вони стануть\nдоступні для всіх інших користувачів для перегляду та вдосконалення.\n\nЯкщо ви не можете закінчити ваші правки за один раз, ви можете лишити\nвікно з редактором відкритим і повернутись (на тому самому комп’ютері та\nоглядачі) до роботи потім — редактор запропонує вам відновити вашу\nроботу.\n\n### Користування редактором\n\nПерелік доступних клавішних комбінацій можна подивитись натиснувши на\nклавіатурі кнопку `?`.\n",
-            "roads": "# Дороги\n\nВи можете створювати, виправляти та вилучати дороги з допомогою\nцього редактора. Дороги можуть бути будь-якого типу: автомагістралі,\nстежки, велодоріжки та багато інших — все що частіше за все має\nперетин між собою, повинне бути нанесено на мапу.\n\n### Виділення\n\nКлацніть по дорозі для того щоб її вибрати. Вона стані підсвіченою\nпо всій довжині, а на бічній панелі буде показано додаткову інформацію про\nдорогу. Якщо ви клацнете на неї правою кнопкою миші – ви побачити меню з\nдіями, що можуть бути застосовані до дороги.\n\n### Зміна\n\nДоволі часто вам будуть траплятись дороги, що не збігаються із дорогами\nна супутниковому знімку чи з треками GPS. Ви можете виправити їхнє\nположення. Але спочатку вирівняйте положення знімка за треками GPS.\n\nКлацніть на дорогу, яку ви маєте намір змінити. Вона стане підсвіченою і на\nній з’являться контрольні точки, які можна рухати, підлаштовуючи положення\nта форму дороги. Якщо вам потрібно додати нову точку, для підвищення\nдеталізації, додайте її подвійним клацанням на відрізку дороги.\n\nЯкщо дорога повинна з’єднуватись з іншою дорогою, але на мапі лінії не\nз’єднані, підтягніть одну із контрольних точок однієї дороги до іншої, для\nїх з’єднання. Мати з’єднані дороги — дуже важливо для мапи, а особливо\nдля отримання можливості прокладання маршрутів.\n\nВи також можете клацнути правою кнопкою миші та обрати інструмент\n'Перемістити' або натиснути `M` для переміщення всієї дороги, повторне\nклацання зберігає нове положення дороги.\n\n### Вилучення\n\nЯкщо дороги накреслені зовсім неправильно і по супутникових знімках видно,\nщо їх немає, а в ідеалі, ви точно знаєте що вони точно відсутні на місцевості —\nможете їх вилучити, це призведе до їх вилучення з мапи. Проте, будьте\nуважними, вилучення, як і інші виправлення, призведуть до змін на мапі,\nщо доступна для всіх; також зауважте, що супутникові знімки з часом\nзастарівають, отже новозбудована дорога може бути на них відсутня.\n\nВи можете вилучити дорогу клацнувши на неї для виділення, потім натисніть\nна значок зі смітником чи клавішу 'Delete'.\n\n### Створення\n\nЩо робити — знайшли місце де повинна бути дорога, але її там немає? Оберіть\nінструмент 'Лінія' зверху ліворуч або натисніть клавішу '2' для того, щоб\nрозпочати креслення ліній.\n\nКлацніть на початку дороги на мапі для того, щоб розпочати креслення. Якщо\nдорога відгалужується від наявної дороги, розпочніть з місця їх з’єднання.\n\nПотім клацайте вздовж дороги так щоб утворився правильний шлях, відповідно\nдо супутникових знімків та/чи треків GPS. Якщо дорога, яку ви креслите,\nперетинає іншу дорогу, з’єднуйте їх клацаючи в точці їх перехрещення. Для\nзакінчення креслення виконайте подвійне клацання мишею чи натисніть 'Enter'\nна клавіатурі.\n",
-            "gps": "# GPS\n\nДані GPS є найнадійнішим джерелом даних для OpenStreetMap. Редактор\nпідтримує локальні треки – файли `.gpx` на вашому комп’ютері. Ви можете\nотримати GPS треки за допомогою численних застосунків для смартфонів\nтак само, як і з допомогою спеціального GPS-обладнання.\n\nДля того, щоб дізнатись як проводити збір GPS-даних прочитайте\n[Збір інформації за допомогою смртфону, GPS, або аркушу паперу](http://learnosm.org/en/mobile-mapping/).\n\nЩоб використати записаний трек для мапінгу, перетягніть GPX-файл з\nтреком на мапу в редакторі. Після того, як його буде розпізнано, він буде\nдоданий на мапу у вигляді світло-фіолетової лінії. Клацніть на меню 'Дані\nмапи' праворуч, щоб показати, приховати або масштабуватись до нового\nшару з GPX-треком.\n\nGPX трек не буде завантажений безпосередньо до OpenStreetMap, кращий\nспосіб його використання — креслити об’єкти на мапі, використовуючи його\nяк орієнтир для додавання об’єктів; трек також можна [завантажити на OpenStreetMap](http://www.openstreetmap.org/trace/create),\nдля використання іншими учасниками.\n",
-            "imagery": "# Тло\n\nВикористання аерофотознімків є важливим засобом картографування.\nЗнімки, зроблені з літака, супутника, а також отримані з відкритих джерел\nдоступні в редакторі у меню 'Налаштування тла' праворуч.\n\nТипово вибраним шаром з супутниковими знімками є [Bing Maps](http://www.bing.com/maps/),\nале у різних місцях та на різних масштабах будуть доступні й інші джерела.\nДеякі країни, як, наприклад, Сполучені Штати, Франція, Данія,\nмають дуже високоякісні знімки певних територій.\n\nЗображення тла іноді є зміщеним відносно даних мапи через помилки\nпостачальників знімків. Якщо ви помітили, що дороги є зміщеними\nвідносно знімків, не кидайтесь пересувати їх так, щоб вони збіглися\nз дорогами на знімку. Спробуйте спочатку підлаштувати положення тла так,\nщоб воно збігалося з даними за допомогою підменю 'Виправити зсув'\nнаприкінці меню 'Налаштування тла'.\n",
-            "addresses": "# Адреси\n\nАдреси є однією з найважливіших видів інформації на мапі.\n\nХоча адреси часто представляються як частини вулиць, в OpenStreetMap\nвони записані як атрибути будівель і місць вздовж вулиць.\n\nВи можете додавати інформацію з адресою до будівель, що позначені\nполігонами, так само як і до будівель позначених точками. Найкращим\nджерелом інформації про адреси є проведення досліджень на місцевості,\nабо ваші особисті знання про об’єкти, що перебувають поруч з вами,\nадже як і вся інша інформація в проекті, вона не повинна бути скопійована\nз комерційних/закритих джерел. Копіювання, наприклад з Google Maps,\nє суворо забороненим.\n",
-            "inspector": "# Використання Інспектора\n\nІнспектор — частина інтерфейсу ліворуч, що дозволяє змінювати деталі виділеного об’єкта.\n\n### Вибір типу об’єкта\n\nПісля додавання точки, лінії чи полігону, ви можете вибрати тип об’єкта.\nНаприклад, це може бути автомагістраль, вулиця, супермаркет або кафе.\nІнспектор запропонує вам обрати серед найпопулярніших типів, а також ви\nможете пошукати потрібний тип об’єкта, увівши його назву у пошуковий\nрядок.\n\nНатисніть на кнопку \"i\" праворуч від типу, щоб дізнатися більше про нього.\nНатисніть на тип, щоб застосувати його до об’єкта.\n\n### Використання форм та редагування теґів\n\nПісля вибору типу нового об’єкта чи виділення вже наявного об’єкта певного\nтипу інспектор покаже поля властивостей, наприклад, назву та адресу.\n\nНижче ви побачите рядок значків для додавання інших деталей: посилання на Вікіпедію, вказання на можливість пересування інвалідним візком, та інші.\n\nЩоб додати до об’єкта довільні теґи, потрібно розкрити пункт 'Всі теґи'\nвнизу інспектора. [Taginfo](http://taginfo.openstreetmap.org/) є хорошим джерелом інформації про поширені комбінації застосування теґів.\n\nЗміни, які ви здійснюєте у інспекторі, автоматично застосовуються до мапи.\nВи можете скасувати їх, натиснувши кнопку 'Скасувати'.\n",
-            "buildings": "# Будівлі\n\nOpenStreetMap — є найбільшою в світі базою даних будівель. Ви можете\nпримати участь у її створенні та покращенні.\n\n### Виділення\n\nДля того, щоб виділити будівлю, потрібно клацнути на її контурі. Вона\nстане підсвіченою, а на боковій панелі зʼявиться докладна інформація про\nбудівлю. Якщо ви клацнете правою кнопкою миші – ви побачите меню з\nдіями, які ви можете виконувати працюючи з будівлями.\n\n### Змінення\n\nІноді будівлі неточно розміщенні або мають неправильні теґи.\n\nДля того, щоб пересунути всю будівлю, виділіть її, натисніть 'M' або клацніть\nна інструмент 'Переміщення'. Рухайте мишею, щоб пересунути будівлю на нове\nмісце, після чого клацніть мишею ще раз.\n\nДля того щоб надати будівлі певної форми, перетягуйте точки її контуру\nдо досягнення бажаного результату.\n\n\n### Створення\n\nОдне із питань є в тому, що OpenStreetMap підтримує обидва варіанти\nбудівель: у вигляді полігонів та точок. Основне правило полягає в тому,\nщо _наносити будівлі потрібно у вигляді полігонів, якщо це можливо_, а\nкомпанії, помешкання, зручності та інші речі, які розташовані в будинках —\nточками в межах полігону будівлі.\n\nДля того, щоб розпочати креслення будівлі, оберіть інструмент 'Полігон'\nзверху ліворуч, для закінчення креслення натисніть або 'Return' на\nклавіатурі чи клацнувши на першій точці для замкнення полігону.\n\n### Вилучення\n\nЯкщо будівля є зовсім неправильною — її немає на супутниковому знімку\nта, в ідеалі, це підтверджено дослідженнями на місцевості — ви можете\nїї вилучити, що призведе до її зникнення з мапи. Будьте обережні,\nвилучаючи об’єкти, ці дії, так само як і інші зміни вони будуть видимі\nвсім іншим; до того ж супутникові знімки можуть бути застарілими, отже\nновозбудовані будівлі будуть на них відсутні.\n\nДля того, щоб вилучити будівлі, виділіть її, потім натисніть на значок із\nзображенням смітника чи натисніть клавішу 'Delete'.\n",
-            "relations": "# Зв’язки\n\nЗв’язки є особливим типом об’єктів в OpenStreetMap, які складаються з інших\nоб’єктів. Наприклад, двома найпоширенішими типами зв’язків є *маршрути*,\nдо складу яких входять частини доріг, по яких проходить певна автомагістраль,\nта *мультиполігони*, які об’єднують кілька різних ліній для утворення об’єкта\nскладної форми (наприклад, такий що складається із кількох частин, або\nмає дірку, як бублик).\n\nОб’єкти в зв’язку називаються *членами*. На боковій панелі ви можете\nбачити членом якого зв’язку є об’єкт, та клацнувши на зв’язок, маєте\nможливість виділити його. Коли зв’язок виділено, ви можете побачити всіх\nйого членів на боковій панелі, зв’язок також буде підсвічений на мапі.\n\nЗдебільшого iD піклується про автоматичну обробку зв’язків під час\nредагування. Головне, про що потрібно пам’ятати, коли ви вилучаєте лінію, для\nтого, щоб нанести її точніше, це те, що вам треба переконатись\nв тому, що нова лінія буде включена до складу всіх зв’язків, що й\nоригінальна.\n\n## Редагування зв’язків\n\nТут ви можете ознайомитись з основами редагування зв’язків.\n\nДля того, щоб додати об’єкт до зв’язку, натисніть на кнопку «+» в розділі\n«Всі зв’язки» на боковій панелі та оберіть зв’язок з переліку, або почніть\nвводити його назву, щоб прискорити вибір.\n\nЩоб створити новий зв’язок, виділіть об’єкт, який повинен входити до його\nскладу, натисніть «+» в розділі «Всі зв’язки» та оберіть «Новий зв’язок…».\n\nДля вилучення об’єкта зі зв’язку — виділіть об’єкт та натисніть на значок\nсмітника поруч зі зв’язком, з якого ви бажаєте вилучити об’єкт.\n\nВи можете створити мультиполігон із дірками інструментом «Об’єднати».\nНакресліть два контури (зовнішній та внутрішній), виділіть їх, утримуючи\nнатиснутим Shift, потім натисніть на клавішу 'C'. Або виділіть обидва контури та\nклацніть правою кнопкою миші на одному з них та клацніть на кнопку\n«Об’єднати» (+).\n"
+            "help": {
+                "title": "Довідка",
+                "welcome": "Вітаємо в редакторі для [OpenStreetMap](https://www.openstreetmap.org/) iD. Користуючись ним ви можете робити свій внесок в розвиток OpenStreetMap використовуючи ваш веб-оглядач прямо зараз.",
+                "open_data_h": "Відкриті дані",
+                "open_data": "Внесені вами зміни будуть доступні всім хто використовує OpenStreetMap. Ви можете використовувати ваші власні знання про ту чи іншу місцевість, результати польових досліджень, аерофотознімки або знімки з вулиць. Копіювання з комерційних джерел, таких як наприклад Google Maps, [суворо заборонене](https://www.openstreetmap.org/copyright).",
+                "before_start_h": "Перш ніж почати",
+                "before_start": "Ви потрібно ознайомитись з OpenStreetMap та цим редактором, перш ніж почати вносити зміни. iD має покрокове керівництво, яке допоможе вам навчитись основ редагування в OpenStreetMap. Клацніть кнопку \"Покрокове керівництво\", щоб перейти до навчання, яке триватиме близько 15 хвилин.",
+                "open_source_h": "Відкриті сирці",
+                "open_source": "Редактор iD є суспільним проектом з відкритими сирцями. На поточний момент ви користуєтесь версією {version}. Сирці знаходяться [на GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Ви можете зробити свій внесок в iD взявши участь у [перекладі](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) або [сповіщаючи про помилки](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Огляд",
+                "navigation_h": "Навігація",
+                "navigation_drag": "Ви можете рухати мапу натиснувши {leftclick} ліву кнопку миші. Також ви можете скористатись стрілками  `↓`, `↑`, `←`, `→` на вашій клавіатурі.",
+                "navigation_zoom": "Ви можете наближати та віддаляти мапу за допомоги коліщатка миші або трекапда, або клацаючи на {plus} / {minus} кнопки збоку на мапі. Ви також можете натискати клавіші `+`, `-` на клавіатурі.",
+                "features_h": "Об'єкти мапи",
+                "features": "Ми використовуємо слово *об'єкт*, коли говоримо про речі, що з'являються на мапі, наприклад, дороги, будівлі або визначні місця. Будь-що, що є в реальному світі може бути додане як об'єкт в OpenStreetMap. Об'єкти можуть бути представлені *точками*, *лініями* або *полігонами*.",
+                "nodes_ways": "В термінології OpenStreetmap точки називають – *node*, а лінії та полігони – *way*."
+            },
+            "editing": {
+                "title": "Редагування та Збереження",
+                "select_h": "Виділення",
+                "select_left_click": "{leftclick} Клацніть лівою кнопкою миші на об'єкті, для його виділення. Навколо виділеного об'єкта з'явиться пульсуюче сяйво, а на бічній панелі буде показано інформацію про об'єкт, наприклад, назва та адреса.",
+                "select_right_click": "{rightclick} Клацання правою кнопкою миші призведе до появи меню редагування, в якому будуть показані доступні дії, наприклад, обертання, пересування та вилучення.",
+                "multiselect_h": "Мультивиділення",
+                "multiselect_shift_click": "`{shift}`+{leftclick} Клацайте лівою кнопкою миші, щоб виділити кілька об'єктів разом. Це дозволить пересунути або вилучити кілька об'єктів за один раз.",
+                "multiselect_lasso": "Інший спосіб, щоб виділити кілька об'єктів одночасно – натисніть та утримуйте клавішу `{shift}`, натисніть {leftclick} ліву кнопку миші та окресліть за допомогою ласо потрібні об'єкти. Всі об'єкти в середині ласо будуть виділені.",
+                "undo_redo_h": "Скасування та Відновлення",
+                "undo_redo": "Всі ваші правки зберігаються локально у вашому веб-оглядачі доки ви не збережете їх на сервері OpenStreetMap. Ви можете скасувати ваші зміни клацаючи на кнопку {undo} **Скасувати** або повернути їх клацнувши на кнопку {redo} **Повернути**.",
+                "save_h": "Збереження",
+                "save": "Клацніть {save} **Зберегти** для того щоб завершити вашу роботу та надіслати її до OpenStreetMap. Час від часу не забувайте зберігати результати своєї діяльності!",
+                "save_validation": "На етапі збереження ви зможете переглянути перелік ваших правок. iD виконує ряд базових перевірок даних та може запропонувати корисні поради або попередить, якщо щось виглядає не вірно.",
+                "upload_h": "Надсилання",
+                "upload": "Перед тим, як надіслати ваші зміни, вам потрібно додати [короткий опис](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Потім натисніть **Зберегти** для надсилання ваших змін до OpenStreetMap, де вони будуть об'єднані з іншими даними та стануть доступні всім.",
+                "backups_h": "Автоматичні резервні копії",
+                "backups": "Якщо у вас немає можливості закінчити вашу роботу за один раз, наприклад, якщо ваш комп'ютер зазнав збій або ви закрили вкладку у веб-оглядачі, ваші зміни будуть збережені в сховищі вашого веб-оглядача. Ви можете повернутись пізніше (на тому ж комп'ютері та веб-оглядачі) і iD запропонує вам відновити вашу роботу.",
+                "keyboard_h": "Клавішні комбінації",
+                "keyboard": "Ви можете переглянути перелік команд разом з комбінаціями клавіш натиснувши на кнопку `?`."
+            },
+            "feature_editor": {
+                "title": "Редактор об'єктів",
+                "intro": "*Редактор об'єктів* знаходиться поруч з мапою і дозволяє вам бачити та змінювати всю інформацію у виділеного об'єкта.",
+                "definitions": "У верхній частині показується тип об'єкта. У середній – знаходяться *поля*, які містять всі атрибути об'єкта, такі як його назва та адреса.",
+                "type_h": "Тип об'єкта",
+                "type": "Ви можете клацнути на тип об'єкта для його зміни на інший. Все що існує в реальному світі може бути додане до OpenStreetMap, ми маємо тисячі різних типів об'єктів серед яких можна обрати потрібний.",
+                "type_picker": "На панелі вибору типів об'єктів знаходяться найпоширеніші типи, такі як парки, лікарні, ресторани, дороги та будівлі. Ви можете шукати будь-які типи друкуючи в полі пошуку те що ви шукаєте. Ви можете також клацнути на кнопку {inspect} **Інформація** поруч із назвою типу, щоб дізнатись про нього більше.",
+                "fields_h": "Поля",
+                "fields_all_fields": "В розділі \"Всі поля\" знаходиться докладна інформація про всі властивості об'єкта, які можна змінювати. В OpenStreetMap будь-яке поле не є обов'язковим, тож ви можете залишити поля порожніми, якщо у вас є вагання що до їх значення.",
+                "fields_example": "Для кожного типу об'єктів показується різний набір полів. Наприклад, для дороги будуть показані поля для зазначення типу покриття та обмеження швидкості, для ресторану – розклад роботи та тип страв, що подаються.",
+                "fields_add_field": "Ви також можете обрати у списку \"Додати поле\" інше потрібне поле, таке як Опис, Вікіпедія, можливості доступу людей на інвалідних візках та таке інше.",
+                "tags_h": "Теґи",
+                "tags_all_tags": "Під розділом з полями, ви можете розгорнути розділ \"Всі теґи\", щоб мати можливість змінювати *теґи* OpenStreetMap у виділеного об'єкта. Кожен теґ складається з пари *ключ* та *значення*. Теґи визначають чим є елемент даних. В OpenStreetMap кожен об'єкт описується за допомогою наборів теґів.",
+                "tags_resources": "Безпосереднє редагування теґів вимагає наявності досвіду роботи з OpenStreetMap вище середнього. Ви можете отримати додаткову інформацію з таких джерел як [OpenStreetMap Вікі](https://wiki.openstreetmap.org/wiki/Main_Page) або [Taginfo](https://taginfo.openstreetmap.org/), для того щоб дізнатися про усталені підходи щодо теґування об'єктів в OpenStreetMap."
+            },
+            "points": {
+                "title": "Точки",
+                "intro": "*Точки* можуть використовуватись для позначення таких об'єктів, як ресторани, монументи, крамниці. Вони позначають певне місце та мають опис того, чим вони є.",
+                "add_point_h": "Додавання точок",
+                "add_point": "Для додавання точки, клацніть на кнопку {point} **Точка** на панелі інструментів вгорі над мапою або натисніть клавішу `1`. Вигляд вказівника миші зміниться і він стане символом перехрестя.",
+                "add_point_finish": "Наведіть вказівник в потрібне місце на мапі та клацніть {leftclick} лівою кнопкою миші або натисніть `Пробіл`.",
+                "move_point_h": "Пересування точок",
+                "move_point": "Наведіть вказівник на точку, натисніть {leftclick} ліву кнопку миші та перетягніть точку на нове місце.",
+                "delete_point_h": "Вилучення точок",
+                "delete_point": "Якщо об'єкта не існує в реальному світі, його можна вилучити. Вилучення об'єктів в OpenStreetMap призводить до їх вилучення для всіх користувачів мапи, тож переконайтесь, що об'єкта немає або він насправді припинив своє існування,  перед тим як його вилучити. ",
+                "delete_point_command": "Для вилучення точки, {rightclick} клацніть правою кнопкою миші для виділення об'єкта та показу меню редагування, потім скористуйтесь командою  {delete} **Вилучити**"
+            },
+            "lines": {
+                "title": "Лінії",
+                "intro": " *Лінії* використовуються для показу таких об'єктів, як: дороги, залізничні колії та річки. Лінії кресляться, переважно, по центру об'єкта, що його представляє лінія.",
+                "add_line_h": "Додавання ліній",
+                "add_line": "Для додавання лінії, клацніть на кнопку {line} **Лінія** на панелі інструментів вгорі над мапою або натисніть клавішу `2`. Вигляд вказівника миші зміниться і він стане символом перехрестя.",
+                "add_line_draw": "Далі, наведіть вказівник миші на місце звідки лінія повинна починатись та клацніть {leftclick} лівою кнопкою миші або натисніть `Пробіл`, щоб розпочати додавання точок вздовж лінії. Продовжуйте додавання точок, клацаючи мишею або натискаючи `Пробіл`. Під час креслення ви можете змінювати масштаб та пересувати мапу для того щоб додати лінію детальніше.",
+                "add_line_finish": "Для завершення креслення лінії натисніть `{return}` або клацніть на останню точку.",
+                "modify_line_h": "Виправлення форми ліній",
+                "modify_line_dragnode": "Доволі часто вам будуть траплятись лінії форма яких не є досконалою, наприклад, дороги, що не збігаються із дорогами на супутниковому знімку. Для того щоб виправити форму лінії, спочатку {leftclick} клацніть лівою кнопкою миші для її виділення. Всі точки лінії будуть показані у вигляді невеличких кіл. Після цього ви можете перетягнути їх у потрібне місце.",
+                "modify_line_addnode": "Ви можете додати нову точку вздовж лінії або {leftclick}**x2** подвійним клацанням лівою кнопкою миші, або перетягуванням невеличкого трикутника між сусідніми точками.",
+                "connect_line_h": "З'єднання ліній",
+                "connect_line": "З'єднані належним чином дороги є важливою частиною мапи, це також важливо для забезпечення правильного прокладання маршрутів.",
+                "connect_line_display": "Точки з'єднання ліній показуються сірим кольором. Кінцеві точки ліній показуються у вигляді більший білих кіл, якщо вони не приєднані до інших об'єктів.",
+                "connect_line_drag": "Для приєднання лінії до іншого об'єкта підтягніть одну з її точок до потрібного об'єкта доки вони не прилипнуть одне до одного. Порада: утримуючи натиснутою кнопку `{alt}` можна уникнути притягування точок до інших об'єктів.",
+                "connect_line_tag": "Якщо в місці з'єднання доріг є світлофор або пішохідний перехід, ви можете додати інформацію про це, виділивши спільну точку, в редакторі об'єктів обравши потрібний тип об'єкта.",
+                "disconnect_line_h": "Роз'єднування ліній",
+                "disconnect_line_command": "Для від'єднання дороги від інших об'єктів, {rightclick} клацніть правою кнопкою миші на спільній точці та оберіть в меню редагування команду {disconnect} **Від'єднати**.",
+                "move_line_h": "Пересування ліній",
+                "move_line_command": "Для пересування всієї лінії, {rightclick} клацніть правою кнопкою миші та оберіть команду {move} **Пересунути** в меню редагування. Потім посуньте вказівник в потрібне місце та клацніть {leftclick} лівою кнопкою, щоб залишити лінію на новому місці.",
+                "move_line_connected": "Лінії, які з'єднані з іншими об'єктами залишаться приєднаними до них, під час пересування лінії на нове місце. iD може завадити руху лінії в поперечному напрямку до під'єднаної до неї іншої лінії.",
+                "delete_line_h": "Вилучення ліній",
+                "delete_line": "Якщо лінії накреслені зовсім неправильно і, наприклад,  по супутникових знімках видно, що дороги немає, а в ідеалі, ви точно знаєте що вона точно відсутня на місцевості — можете її вилучити. Будьте обережні під час вилучення об'єктів: супутникові знімки, які ви використовуєте можуть бути застарілими, а дороги, що здаються \"зайвими\", можуть бути новозбудованими та відсутніми на знімках.",
+                "delete_line_command": "Для вилучення лінії, {rightclick} клацніть правою кнопкою миші на лінію для її виділення та показу меню редагування, потім скористайтесь командою {delete} **Вилучити**"
+            },
+            "areas": {
+                "title": "Полігони",
+                "intro": "*Полігони* використовуються для показу меж об'єктів таких як озера, будівлі або житлові квартали. Полігони потрібно креслити по зовнішньому краю об'єкта, яких вони представляють, наприклад, навколо фундаменту будівлі.",
+                "point_or_area_h": "Точка чи Полігон?",
+                "point_or_area": "Багато об'єктів можуть бути нанесені на мапу як у вигляді точок, так і у вигляді полігонів. Треба надавати перевагу кресленню будівель у вигляді полігонів, якщо таке можливо. Ставте точки в середині контурів будівель для позначення об'єктів, які знаходяться в них – офісів, магазинів та таке інше.",
+                "add_area_h": "Додавання полігонів",
+                "add_area_command": "Для додавання полігона, клацніть на кнопку {area} **Полігон** на панелі інструментів вгорі над мапою або натисніть клавішу `3`. Вигляд вказівника миші зміниться і він стане символом перехрестя.",
+                "add_area_draw": "Далі, наведіть вказівник миші на один з кутів полігона та клацніть {leftclick} лівою кнопкою миші або натисніть `Пробіл`, щоб розпочати додавання точок навколо зовнішнього краю полігона. Продовжуйте додавання точок, клацаючи мишею або натискаючи `Пробіл`. Під час креслення ви можете змінювати масштаб та пересувати мапу для того щоб додати полігон детальніше.",
+                "add_area_finish": "Для завершення креслення полігона натисніть `{return}` або клацніть на першу чи на останню точку.",
+                "square_area_h": "Вирівнювання кутів",
+                "square_area_command": "Більшість полігонів, таких як будівлі, мають прямі кути. Для вирівнювання кутів полігона, клацніть {rightclick} правою кнопкою миші для виділення полігона та скористайтесь командою {orthogonalize} **Випрямити кути** в меню редагування.",
+                "modify_area_h": "Змінення полігонів",
+                "modify_area_dragnode": "Іноді ви можете бачити полігони, які мають неправильні форми, наприклад, будинок, контури якого не збігаються з супутниковим знімком. Для виправлення форми полігона, спочатку {leftclick} клацніть лівою кнопкою миші для її виділення. Всі точки полігона будуть показані у вигляді невеличких кіл. Після цього ви можете перетягнути їх у потрібне місце.",
+                "modify_area_addnode": "Ви можете додати нову точку до полігона або {leftclick}**x2** подвійним клацанням лівою кнопкою миші, або перетягуванням невеличкого трикутника між сусідніми точками контуру полігона.",
+                "delete_area_h": "Вилучення полігонів",
+                "delete_area": "Якщо полігони накреслені зовсім неправильно і, наприклад, по супутникових знімках видно, що будинку немає, а в ідеалі, ви точно знаєте що він точно відсутній на місцевості — можете його вилучити. Будьте обережні під час вилучення об'єктів: супутникові знімки, які ви використовуєте можуть бути застарілими, а будинки, що здаються \"зайвими\", можуть бути новозбудованими та відсутніми на знімках.",
+                "delete_area_command": "Для вилучення полігона, {rightclick} клацніть правою кнопкою миші на полігон для його виділення та показу меню редагування, потім скористайтесь командою {delete} **Вилучити**"
+            },
+            "relations": {
+                "title": "Зв'язки",
+                "intro": "*Зв'язки* є особливим типом об'єктів в OpenStreetMap, які складаються з інших об'єктів. Об'єкти з яких складається  зв'язок називаються *членами*, кожен з членів зв'зку може мати певну *роль*.",
+                "edit_relation_h": "Редагування зв'язків",
+                "edit_relation": "В нижній частині редактора об'єктів знаходиться розділ \"Всі зв'язки\", де можна побачити чи є виділений об'єкт членом одного зі зв'язків. Ви можете клацнути на зв'язок для його виділення та редагування.",
+                "edit_relation_add": "Для додавання об'єкта до зв'язку, виділіть об'єкт, потім клацніть кнопку {plus} в розділі \"Всі зв'язки\" редактора об'єктів. Ви можете вибрати в переліку один зі зв'язків, що знаходяться поруч, або створити \"Новий зв'язок\".",
+                "edit_relation_delete": "Ви можете клацнути кнопку {delete} **Вилучити** для вилучення виділеного об'єкта зі зв'язку. Якщо ви вилучите всіх членів зі зв'язку, його буде вилучено автоматично.",
+                "maintain_relation_h": "Робота зі зв'язками",
+                "maintain_relation": "У більшості випадків, iD сам опікується зв'язками поки ви працюєте. Але ви повинні бути обережними під час заміни об'єктів, що є членами зв'язків. Наприклад, якщо ви вилучите відрізок дороги та намалюєте його знов, вам потрібно буде додати новий відрізок до всіх зв'язків (маршрутів, заборон й т.д.), членом яких був оригінальний відрізок.",
+                "relation_types_h": "Типи зв'язків",
+                "multipolygon_h": "Мультиполігони",
+                "multipolygon": "*Мультиполігон* – зв'язок, що має один чи більше елемент, з роллю *outer* та один чи більше елементів з роллю *inner*. З елементів з роллю *outer* складається зовнішній контур мультиполігона, елемент внутрішнього контуру визначають вкладені ділянки або дірки, вирізані в середині мультиполігону.",
+                "multipolygon_create": "Для створення мультиполігона, наприклад, будинка з внутрішнім двором, накресліть зовнішній контур та внутрішній контур у вигляді полігонів. Потім `{shift}`+{leftclick} клацніть лівою кнопкою миші на обох об'єктах, {rightclick} клацніть правою кнопкою для показу меню редагування та скористайтесь командою {merge} **Об'єднати**",
+                "multipolygon_merge": "Об'єднання кількох ліній та полігонів призведе до створення мультиполігона зі всіма виділеними об'єктами у вигляді членів зв'язку. iD визначає зовнішній та внутрішній контури автоматично, ґрунтуючись на тому, який з об'єктів знаходиться в середині іншого.",
+                "turn_restriction_h": "Обмеження маневрів",
+                "turn_restriction": "Зв'язки *turn restriction* для зазначення обмежень маневрів мають у своєму складі відрізки різних доріг, що з'єднуються на перехресті. Обмеження складається з дороги, що має роль *from*, звідки відбувається рух, точки або одного чи більше відрізків, з роллю *via*, та відрізка дороги, з роллю *to*, куди рух дозволено або заборонено.",
+                "turn_restriction_field": "Для редагування обмеження маневрів, виділіть точку на перехресті доріг. В редактор об'єктів з'явиться вікно з вбудованим редактором \"Обмеження маневрів\", в якому буде модель перехрестя.",
+                "turn_restriction_editing": "В редакторі \"Обмеження маневрів\" виділіть дорогу `from`, ви побачите дозволені або заборонені напрямки руху до доріг, що матимуть роль `to`. Ви можете клацати на стрілки для перемикання їх з дозволеного на заборонений напрямок руху. iD створить зв'язки обмеження маневрів автоматично та призначить ролі їх членам, відповідно до ваших дій.",
+                "route_h": "Маршрути",
+                "route": "Зв'язок *route* гуртує лінійні об'єкти, з яких складається певний маршрут. Це може бути маршрут автобуса чи трамваю, або потягу, або маршрут в мережі автомобільних доріг.",
+                "route_add": "Для додавання об'єкта до зв'язку маршруту, виділіть потрібний об'єкт, прогорніть редактор до розділу \"Всі зв'язки\", клацніть кнопку {plus} щоб додати об'єкт до одного зі зв'язків поруч або створити новий зв'язок.",
+                "boundary_h": "Адміністративні кордони",
+                "boundary": "До складу в'язка *boundary*  входить один чи більше лінійних об'єктів, що разом утворюють адміністративний кордон.",
+                "boundary_add": "Для додавання об'єкта до зв'язку адміністративного кордону, виділіть потрібний об'єкт, прогорніть редактор до розділу \"Всі зв'язки\", клацніть кнопку {plus} щоб додати об'єкт до одного зі зв'язків поруч або створити новий зв'язок."
+            },
+            "imagery": {
+                "title": "Фонове зображення",
+                "intro": "Фонове зображення, що показується під даними – є важливим ресурсом для мапінгу. Це можуть бути аерофотознімки зі супутників, літаків та дронів; або ж це скановані історичні мапи чи інші вільно доступні джерела даних.",
+                "sources_h": "Джерела фонових зображень",
+                "choosing": "Щоб дізнатись які фонові зображення навні для редагування, клацніть кнопку {layers} **Налаштування тла** збоку на мапі.",
+                "sources": "Типово, як фоновий шар використовуються супутникові знімки від [Bing Maps](https://www.bing.com/maps/). В залежності від місцевості де ви вносите зміни, можуть бути наявні інші фонові зображення. Деякі з них можуть мати кращу роздільну здатність та бути новішими ніж інші, тож завжди корисно перевірити який з шарів є найбільш актуальним та краще підходить для мапінгу.",
+                "offsets_h": "Налаштування зсуву тла",
+                "offset": "Фонові зображення можуть іноді не збігатись з точно доданими даними. Якщо ви бачите що дороги, будівлі зміщені щодо їх положення на фоновому зображенні, це може означати, що щось не так з зображенням, тож їх не треба пересувати на нове місце. Замість цього ви можете підлаштувати положення тла, так щоб воно збігалось із даними. Для цього розгорніть розділ \"Налаштування зсуву тла\" в нижній частині панелі Налаштування тла.",
+                "offset_change": "Клацайте на маленькі стрілки для поступового налаштування зсуву тла, або натисніть ліву кнопку миші та потягніть сірий прямокутник для налаштування положення тла."
+            },
+            "streetlevel": {
+                "title": "Знімки з вулиць",
+                "intro": "Знімки з вулиць дуже корисні для додавання інформації про дорожні знаки, об'єкти інфраструктури, магазини та інших деталей, які не можна побачити на аерофотознімках. iD підтримує роботу зі знімками [Mapillary](https://www.mapillary.com) та [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Використання знімків з вулиць",
+                "using": "Для використання знімків з вулиць для мапінгу, поставте на панелі {data} **Дані мапи** позначку навпроти потрібного шару.",
+                "photos": "Після активації відповідного шару, ви побачите на мапі лінію вздовж якої була зроблена послідовність знімків. На докладних рівнях масштабу, кола покажуть місця в яких знімки були зроблені, наблизившись ще, ви побачите конуси, що вкажуть в якому напрямку була розташована камера під час знімання.",
+                "viewer": "Якщо ви клацнете на одне з кіл, де були зроблені знімки, в нижній частині мапи з'явиться вікно зі знімком. Воно має елементи керування для пересування вперед та назад між знімками в одній послідовності. Також там буде зазначено хто і коли зробив цей знімок, а також посилання для перегляду оригінального знімка."
+            },
+            "gps": {
+                "title": "GPS треки",
+                "intro": "Зібрані учасниками GPS треки є дуже важливим джерелом даних для OpenStreetMap. Реактор підтримує показ локальних *.gpx*, *.geojson*, та *.kml* файлів. Ви можете записувати GPS треки за допомогою смартфона, фітнес-трекерів та інших GSP-приладів.",
+                "survey": "Щоб дізнатись, як використовувати GPS під час дослідження місцевості, прочитайте [Збір даних за допомогою смартфона, GPS та аркуша паперу](http://learnosm.org/en/mobile-mapping/).",
+                "using_h": "Використання GPS треків",
+                "using": "Для використання GPS треку для мапінгу, перетягніть файл у вікно з мапою. Якщо все добре, ваш трек буде показано у вигляді світло-фіолетової лінії. Клацніть на кнопку {data} **Дані мапи** збоку мапи, щоб відкрити панель де ви зможете показати або приховати трек, а також мати можливість змінити масштаб для перегляду всього треку на мапі.",
+                "tracing": "У цім випадку GPS трек не надсилається до OpenStreetMap. Ви можете використовувати його як напрямну лінію для додавання нових та уточнення наявних об'єктів.",
+                "upload": "Також ви можете [завантажити ваші GPS треки на сервер OpenStreetMap](https://www.openstreetmap.org/trace/create) для того, щоб й інші могли скористатись ними для уточнення даних."
+            }
         },
         "intro": {
             "done": "Кінець",
                     "title": "Виділення обʼєктів",
                     "select_one": "ВІділення одного обʼєкта",
                     "select_multi": "Виділення кількох обʼєктів",
-                    "lasso": "Виділення обʼєктів - \"Лассо\""
+                    "lasso": "Виділення обʼєктів - \"Лассо\"",
+                    "search": "Пошук об'єктів, що збігаються із зазначеним текстом"
                 },
                 "with_selected": {
                     "title": "Операції з виділеними обʼєктами",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} фт",
+            "miles": "{quantity} мл",
+            "square_feet": "{quantity} фт²",
+            "square_miles": "{quantity} мл²",
+            "acres": "{quantity} акр",
+            "meters": "{quantity} м",
+            "kilometers": "{quantity} км",
+            "square_meters": "{quantity} м²",
+            "square_kilometers": "{quantity} км²",
+            "hectares": "{quantity} га",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "Пн",
+            "south": "Пд",
+            "east": "Сх",
+            "west": "Зх",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Марка"
                 },
+                "brewery": {
+                    "label": "Розливне пиво"
+                },
                 "bridge": {
                     "label": "Тип",
                     "placeholder": "Типово"
                     "label": "Міськість",
                     "placeholder": "50, 100, 200…"
                 },
-                "cardinal_direction": {
-                    "label": "Напрямок",
-                    "options": {
-                        "E": "Схід",
-                        "ENE": "Східно-північний схід",
-                        "ESE": "Східно-південний схід",
-                        "N": "Північ",
-                        "NE": "Північний схід",
-                        "NNE": "Північно-північний схід",
-                        "NNW": "Північно-північний захід",
-                        "NW": "Північний захід",
-                        "S": "Південь",
-                        "SE": "Південний схід",
-                        "SSE": "Південно-південний схід",
-                        "SSW": "Південно-південний захід",
-                        "SW": "Південний захід",
-                        "W": "Захід",
-                        "WNW": "Західно-північний захід",
-                        "WSW": "Західно-південний захід"
-                    }
-                },
                 "castle_type": {
                     "label": "Тип"
                 },
-                "clock_direction": {
-                    "label": "Напрямок",
-                    "options": {
-                        "anticlockwise": "Проти годинникової стрілки",
-                        "clockwise": "За годинниковою стрілкою"
-                    }
-                },
                 "clothes": {
                     "label": "Одяг"
                 },
                             "title": "Рух веолодоріжкою в протилежному напрямку"
                         },
                         "opposite_lane": {
-                            "description": "Рух велодоріжкою відбувається в протилежному напрямку до основного напрямку руху траспорта ",
+                            "description": "Рух велодоріжкою відбувається в протилежному напрямку до основного напрямку руху транспорта ",
                             "title": "Велодріжка в зворотньому напрямку"
                         },
                         "share_busway": {
                             "title": "Велодоріжка сумісна зі смугою громадського транспорту"
                         },
                         "shared_lane": {
-                            "description": "Велодоріжка не відокремлена від руху автомобільного траспорту ",
+                            "description": "Велодоріжка не відокремлена від руху автомобільного транспорту ",
                             "title": "Велодоріжка спільно з іншим рухом"
                         },
                         "track": {
                 "diaper": {
                     "label": "Сповивальний стіл"
                 },
+                "direction": {
+                    "label": "Напрямок (градуси за ходом годинника)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Напрямок",
+                    "options": {
+                        "E": "Схід",
+                        "ENE": "Східно-північний схід",
+                        "ESE": "Східно-південний схід",
+                        "N": "Північ",
+                        "NE": "Північний схід",
+                        "NNE": "Північно-північний схід",
+                        "NNW": "Північно-північний захід",
+                        "NW": "Північний захід",
+                        "S": "Південь",
+                        "SE": "Південний схід",
+                        "SSE": "Південно-південний схід",
+                        "SSW": "Південно-південний захід",
+                        "SW": "Південний захід",
+                        "W": "Захід",
+                        "WNW": "Західно-північний захід",
+                        "WSW": "Західно-південний захід"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Напрямок",
+                    "options": {
+                        "anticlockwise": "Проти годинникової стрілки",
+                        "clockwise": "За годинниковою стрілкою"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Напрямок",
+                    "options": {
+                        "backward": "Проти напрямку лінії",
+                        "both": "В обидва боки/Всі",
+                        "forward": "За напрямком лінії"
+                    }
+                },
                 "display": {
                     "label": "Циферблат"
                 },
                     "label": "Напис"
                 },
                 "intermittent": {
-                    "label": "Ð\9fеÑ\80еÑ\80ивÑ\87аÑ\81Ñ\82ий"
+                    "label": "Ð\9fеÑ\80еÑ\81иÑ\85аÑ\94"
                 },
                 "internet_access": {
                     "label": "Доступ до Інтеренету",
                 "memorial": {
                     "label": "Тип"
                 },
-                "milestone_position": {
-                    "label": "Кілометрова позначка",
-                    "placeholder": "Відстань з точністю 1/10 (123.4)"
+                "monitoring_multi": {
+                    "label": "Відстежується"
                 },
                 "mtb/scale": {
                     "label": "Рівень складності для гірських велосипедів",
                 "oneway": {
                     "label": "Односторонній рух",
                     "options": {
+                        "alternating": "Змінюваний",
                         "no": "Ні",
+                        "reversible": "Реверсивний рух",
                         "undefined": "Передбачається, Ні",
                         "yes": "Так"
                     }
                 "oneway_yes": {
                     "label": "Односторонній рух",
                     "options": {
+                        "alternating": "Змінюваний",
                         "no": "Ні",
+                        "reversible": "Реверсивний рух",
                         "undefined": "Передбачається, Так",
                         "yes": "Так"
                     }
                     "label": "Пар",
                     "placeholder": "3, 4, 5…"
                 },
-                "parallel_direction": {
-                    "label": "Напрямок",
-                    "options": {
-                        "backward": "Проти напрямку лінії",
-                        "forward": "За напрямком лінії"
-                    }
-                },
                 "park_ride": {
                     "label": "Перехоплююча стоянка"
                 },
                 "railway": {
                     "label": "Тип"
                 },
+                "railway/position": {
+                    "label": "Кілометрова позначка",
+                    "placeholder": "Відстань з точністю 1/10 (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Напрямок",
+                    "options": {
+                        "backward": "Проти напрямку лінії",
+                        "both": "В обидва боки/Всі",
+                        "forward": "За напрямком лінії"
+                    }
+                },
                 "rating": {
                     "label": "Потужність"
                 },
                 "recycling_accepts": {
                     "label": "Приймається"
                 },
-                "recycling_type": {
-                    "label": " Тип об'єкта",
-                    "options": {
-                        "centre": "Центру збору відходів для вторинної переробки",
-                        "container": "Контейнер"
-                    }
-                },
                 "ref": {
                     "label": "Номер"
                 },
+                "ref/isil": {
+                    "label": "Код ISIL"
+                },
                 "ref_aeroway_gate": {
                     "label": "Номер виходу на посадку"
                 },
                     "label": "Тип"
                 },
                 "restrictions": {
-                    "label": "Ð\97абоÑ\80они Ð¿Ð¾Ð²Ð¾Ñ\80оÑ\82Ñ\83"
+                    "label": "Ð\9eбмеженнÑ\8f Ð¼Ð°Ð½ÐµÐ²Ñ\80Ñ\96в"
                 },
                 "rooms": {
                     "label": "Кількість номерів"
                 "traffic_signals": {
                     "label": "Тип"
                 },
+                "traffic_signals/direction": {
+                    "label": "Напрямок",
+                    "options": {
+                        "backward": "Проти напрямку лінії",
+                        "both": "В обидва боки/Всі",
+                        "forward": "За напрямком лінії"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Видимість маршруту",
                     "options": {
                 },
                 "aerialway/pylon": {
                     "name": "Опора канатної дороги",
-                    "terms": "Ð\9eпора,канатна,дорога,витяг"
+                    "terms": "опора,канатна,дорога,витяг"
                 },
                 "aerialway/rope_tow": {
                     "name": "Бугельний підйомник",
                     "terms": "бугель,підйомник,лижі,витяг"
                 },
                 "aerialway/station": {
-                    "name": "Станція канатної дороги",
-                    "terms": "канатна,підвісна,дорога,станція,витяг"
+                    "name": "Станція канатної дороги"
                 },
                 "aerialway/t-bar": {
                     "name": "Анкерний підйомник",
                     "terms": "валюта,долар,євро,курс,біржа,банк,обміник,міняло,пункт"
                 },
                 "amenity/bus_station": {
-                    "name": "Автобусна станція",
-                    "terms": "Bus Station,fdnjecyf cnfywsz,автобус,станція,вокзал"
+                    "name": "Автостанція/Термінал"
                 },
                 "amenity/cafe": {
                     "name": "Кафе",
                     "terms": "cafe,кафе,кава,чай,бістро"
                 },
+                "amenity/car_pooling": {
+                    "name": "Райдшеринг",
+                    "terms": "райдшеринг,карпулінг"
+                },
                 "amenity/car_rental": {
                     "name": "Прокат автомобілів",
                     "terms": "Car Rental,ghjrfn fdnjvjsksd,прокат,оренда,машина,автівка"
                     "terms": "Fast Food, afcn-ael, проста їжа, швидкі страви, фаст-фуд"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Паром",
-                    "terms": "паром,причал,переправа,термінал"
+                    "name": "Поромна станція/Термінал"
                 },
                 "amenity/fire_station": {
                     "name": "Пожежна станція",
                     "name": "Бібліотека",
                     "terms": "Library, sksjntrf, бібліотека, книги, книжка, читач"
                 },
+                "amenity/love_hotel": {
+                    "name": "Готель кохання",
+                    "terms": "love,готель,секс,стосунки,зустріч,пари"
+                },
                 "amenity/marketplace": {
                     "name": "Ринок",
                     "terms": "Marketplace, hbyjr, базар, базарна площа"
                     "terms": "Ranger Station, rjynjhf kscybwndf, лісник, лісництво"
                 },
                 "amenity/recycling": {
-                    "name": "Ð\9fеÑ\80еÑ\80обка Ð²Ñ\82оÑ\80Ñ\81иÑ\80овини",
-                    "terms": "Recycling, Gththjrf dnjhcbhjdbyb, пункт прийому вторсировини, вторсировина"
+                    "name": "Ð\9aонÑ\82ейнеÑ\80 Ð´Ð»Ñ\8f Ñ\81мÑ\96Ñ\82Ñ\82Ñ\8f ",
+                    "terms": "бляшанки,банки,пляшки,сміття,лахміття,лахи,вторинні ресурси,відходи"
                 },
                 "amenity/recycling_centre": {
                     "name": "Центру збору відходів для вторинної переробки",
                     "name": "Душ",
                     "terms": "душ,лазня,гігієна"
                 },
+                "amenity/smoking_area": {
+                    "name": "Місце для куріння",
+                    "terms": "паління,куріння,дим,цигарки,сірники,запальничка,місце,майданчик,кімната"
+                },
                 "amenity/social_facility": {
                     "name": "Соціальний центр",
                     "terms": "Social facility, cjwsfkmybq wtynh, соціальний центр"
                 },
                 "amenity/vending_machine/public_transport_tickets": {
                     "name": "Автомат продажу проїзних квитків",
-                    "terms": "автобус,трамвай,тролейбус,паром,електричка,квиток,траспорт,громадський,проїзд"
+                    "terms": "автобус,трамвай,тролейбус,паром,електричка,квиток,транспорт,громадський,проїзд"
                 },
                 "amenity/vending_machine/sweets": {
                     "name": "Автомат продажу солодощів",
                     "name": "Жива огорожа",
                     "terms": "Hedge, bdf jujhjf, живопліт, запліт, запуст"
                 },
+                "barrier/kerb": {
+                    "name": "Бордюр",
+                    "terms": "перешкода,бордюр"
+                },
                 "barrier/kissing_gate": {
                     "name": "Вузька хвіртка",
                     "terms": "Kissing Gate, depmrf dshnrf,вузка хвіртка"
                     "name": "Комора",
                     "terms": "амбар, запаси, комора"
                 },
+                "building/boathouse": {
+                    "name": "Елінг",
+                    "terms": "човновець,човен,будинок,споруда,ангар,збереження"
+                },
+                "building/bungalow": {
+                    "name": "Бунгало",
+                    "terms": "дім,веранда,дача,маєток"
+                },
                 "building/bunker": {
                     "name": "Бункер"
                 },
                     "name": "Церква",
                     "terms": "церква,молитва"
                 },
+                "building/civic": {
+                    "name": "Громадська будівля",
+                    "terms": "муніципальний центр,бібліотека,громадський туалет,спортивний центр,басейн,ратуша"
+                },
                 "building/college": {
                     "name": "Коледж",
                     "terms": "коледж, технікум, будівля"
                 "building/entrance": {
                     "name": "Вхід/Вихід"
                 },
+                "building/farm": {
+                    "name": "Ферма",
+                    "terms": "будинок,ферма"
+                },
                 "building/garage": {
                     "name": "Гараж",
                     "terms": "Garage,ufhf, гарж"
                     "name": "Дитячий сад",
                     "terms": "дитячий сад, будівля, початкова школа, будинок"
                 },
+                "building/mosque": {
+                    "name": "Будівля мечеті",
+                    "terms": "мечеть,будівля,храм,іслам"
+                },
                 "building/public": {
                     "name": "Громадська будівля",
                     "terms": "суспільний центр, будівля, клуб, громада"
                     "name": "Дах",
                     "terms": "Roof, lf, накриття, дах"
                 },
+                "building/ruins": {
+                    "name": "Руїни",
+                    "terms": "будинок,руїни"
+                },
                 "building/school": {
                     "name": "Школа",
                     "terms": "School, irjkf, школа"
                     "name": "Двоквартирний будинок",
                     "terms": "будинок,квартира,два,дві,володар"
                 },
+                "building/service": {
+                    "name": "Службова споруда",
+                    "terms": "трасформатор,насос,машини,обладнання"
+                },
                 "building/shed": {
                     "name": "Сарай",
                     "terms": "сарай, гараж"
                     "name": "Стайні",
                     "terms": "Stable, cnfqys, стайня"
                 },
+                "building/stadium": {
+                    "name": "Стадіон",
+                    "terms": "Стадіон,споруда,арена,будівля"
+                },
                 "building/static_caravan": {
                     "name": "Пересувний будинок",
                     "terms": "Пересувний будинок, кемпер, трейлер"
                 },
+                "building/temple": {
+                    "name": "Храм",
+                    "terms": "будівля,храм,церква,собор,кірха,сінагога"
+                },
                 "building/terrace": {
                     "name": "Рядний будинок",
                     "terms": "ряд, будинок, таунхаус, будинки в ряд"
                 "building/train_station": {
                     "name": "Залізнична станція"
                 },
+                "building/transportation": {
+                    "name": "Транспорт",
+                    "terms": "вокзал,станція,зупинка,траспорт"
+                },
                 "building/university": {
                     "name": "Університет",
                     "terms": "University, eysdthcbntn, університет"
                     "name": "Місце стоянки",
                     "terms": "платка,фургон,мотодім,автодім,караван,місце,ділянка"
                 },
+                "circular": {
+                    "name": "Коло"
+                },
                 "club": {
                     "name": "Клуб",
                     "terms": "радіо,електроника,кіно,шахи,спорт,фанклуб,організація,дозвілля,авто,політика,клуб"
                 "emergency/private": {
                     "name": "Для приватних аварійно-рятувальних служб"
                 },
+                "emergency/water_tank": {
+                    "name": "Пожежний резервуар",
+                    "terms": "вода,пожежа,цистерна,резервуар,небезпека"
+                },
                 "emergency/yes": {
                     "name": "Доступ для аварійно-рятувальних служб дозволено"
                 },
                     "name": "Доріжка для вершників ",
                     "terms": "Bridle Path, ljhsrf lkz dthiybrsd, доріжка для кінних прогулянок, доріжка для верхової їзди"
                 },
+                "highway/bus_guideway": {
+                    "name": "Шпурбус",
+                    "terms": "автобус,рельс,напрямний"
+                },
                 "highway/bus_stop": {
-                    "name": "Автобусна зупинка",
-                    "terms": "Bus Stop, fdnjecyf pegbyrf, автобусна зупинка"
+                    "name": "Автобусна зупинка/платформа"
                 },
                 "highway/corridor": {
                     "name": "Коридор",
                     "terms": "Forest, kscjdbq vfcbd, ліс, лісовий масив"
                 },
                 "landuse/garages": {
-                    "name": "Гаражі",
-                    "terms": "гараж, парковка, стоянка, автомобіль"
+                    "name": "Гаражний комплекс",
+                    "terms": "гараж,кооператив,машина,ділянка"
                 },
                 "landuse/grass": {
                     "name": "Трава",
                     "name": "Ділянка під нову забудову",
                     "terms": "будівництво,ділянка,місце,план"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Тепличне господарство",
+                    "terms": "квіти,овочі,фрукти,рослини,сільске,господарство,парник"
+                },
                 "landuse/harbour": {
                     "name": "Гавань",
                     "terms": "гавань,затока,порт,притулок"
                 },
                 "landuse/railway": {
                     "name": "Територія залізниці",
-                    "terms": "залізниця,територія,траспорт,коридор"
+                    "terms": "залізниця,територія,транспорт,коридор"
                 },
                 "landuse/recreation_ground": {
                     "name": "Зона відпочинку",
                     "name": "Мачта",
                     "terms": "мачта,антена,вежа,радіо,телебачення,зв'язок,мобільний,стільниковий"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Станція спостереження",
+                    "terms": "погода,землетрус,повітря,вода,сейсмологія,землетрус,gps,опади,повіні,рівень"
+                },
                 "man_made/observation": {
                     "name": "Оглядова вежа",
                     "terms": "Observation tower, jukzljdf dtf, пожежна вежа, вежа спостереження"
                     "terms": "облік,фінанси,аудит,послуги,бухгалтерія"
                 },
                 "office/administrative": {
-                    "name": "Канцелярія",
-                    "terms": "канцелярія, офіс"
+                    "name": "Канцелярія"
                 },
                 "office/adoption_agency": {
                     "name": "Агенція з усиновлення",
                 },
                 "office/company": {
                     "name": "Офіс компанії",
-                    "terms": "фірма, підприємство, контора, бюро, юридична особа, Офіс компанії, jasc rjvgfys, Company Office"
+                    "terms": "фірма,підприємство,контора,бюро,юридична особа,офіс компанії,"
                 },
                 "office/coworking": {
                     "name": "Коворкінг",
                     "terms": "адвокатура, адвокат "
                 },
                 "office/lawyer/notary": {
-                    "name": "Нотаріус",
-                    "terms": "нотаріус,контора,офіс"
+                    "name": "Нотаріус"
                 },
                 "office/moving_company": {
                     "name": "Перевезення речей",
                 },
                 "office/surveyor": {
                     "name": "Експет-оцінщик",
-                    "terms": "експертна,оцінка,будівлі,споруди,траспорт,автомобіль,земельна,ділянка"
+                    "terms": "експертна,оцінка,будівлі,споруди,транспорт,автомобіль,земельна,ділянка"
                 },
                 "office/tax_advisor": {
                     "name": "Податкова консультація",
                     "name": "Трансформатор",
                     "terms": "Transformer, nhfycajhvfnjh, трансформтор"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Громадський транспорт, зупинка/платформа",
+                    "terms": "платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Канатна дорога, зупника/платформа",
+                    "terms": "підвісна дорога,кабіна,вагон,перевезення,громадський,транспорт,канатна дорога"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Автобусна зупинка/платформа",
+                    "terms": "автобус,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Поромна зупинка/платформа",
+                    "terms": "пором,док,човен,пірс,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Швидкісний трамвай, зупинка/платформа",
+                    "terms": "електричка,трамвай,рейки,дроти,перевезення,громадський,транспорт"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Монорейка, зупинка/платформа",
+                    "terms": "монорейка,монорельс,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Метро, зупинка/платформа",
+                    "terms": "метро,підземка,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Залізнична зупинка/платформа",
+                    "terms": "залізниця,потяг,вагон,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Трамвайна зупинка/платформа",
+                    "terms": "трамвай,вагон,електротранспорт,рейки,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Тролейбусна зупинка/платформа",
+                    "terms": "тролейбус,вагон,електротранспорт,електробус,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення,рогатий"
+                },
                 "public_transport/platform": {
-                    "name": "Платформа",
-                    "terms": "Платформа"
+                    "name": "Громадський транспорт, зупинка/платформа",
+                    "terms": "платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Канатна дорога, зупника/платформа",
+                    "terms": "підвісна дорога,кабіна,вагон,перевезення,громадський,транспорт,канатна дорога"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Автобусна зупинка/платформа",
+                    "terms": "автобус,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Поромна зупинка/платформа",
+                    "terms": "пором,док,човен,пірс,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Швидкісний трамвай, зупинка/платформа",
+                    "terms": "електричка,трамвай,рейки,дроти,електротранспорт,перевезення,громадський,транспорт"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Монорейка, зупинка/платформа",
+                    "terms": "монорейка,монорельс,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Метро, зупинка/платформа",
+                    "terms": "метро,підземка,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_train": {
+                    "name": "Залізнична зупинка/платформа",
+                    "terms": "залізниця,потяг,вагон,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Трамвайна зупинка/платформа",
+                    "terms": "трамвай,вагон,електротранспорт,рейки,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Тролейбусна зупинка/платформа",
+                    "terms": "тролейбус,вагон,електротранспорт,електробус,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення,рогатий"
+                },
+                "public_transport/station": {
+                    "name": "Громадський транспорт, зупинка/платформа",
+                    "terms": "платформа,зупинка,транзит,громадський,транспорт,перевезення,термінал"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Станція канатної дороги",
+                    "terms": "канатна,підвісна,дорога,станція,витяг"
+                },
+                "public_transport/station_bus": {
+                    "name": "Автостанція/Термінал",
+                    "terms": "автобус,платформа,зупинка,вокзал,станція,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Поромна станція/Термінал",
+                    "terms": "пором,причал,переправа,термінал,станція"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Станція швидкісного трамвая",
+                    "terms": "електричка,трамвай,рейки,дроти,електротранспорт,перевезення,громадський,транспорт"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Станція монорейки",
+                    "terms": "монорейка,монорельс,платформа,зупинка,станція,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/station_subway": {
+                    "name": "Станція метро",
+                    "terms": "метро,підземка,платформа,станція,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/station_train": {
+                    "name": "Залізнична станція",
+                    "terms": "залізнична,платформа,зупинка,вокзал,станція,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Полустанок (на вимогу)",
+                    "terms": "залізнична,платформа,зупинка,вокзал,станція,транзит,громадський,транспорт,перевезення,(на вимогу)"
+                },
+                "public_transport/station_tram": {
+                    "name": "Трамвайна станція",
+                    "terms": "трамвай,вагон,електротранспорт,рейки,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Тролейбусна станція/Термінал",
+                    "terms": "тролейбус,вагон,електротранспорт,електробус,дроти,платформа,зупинка,станція,вокзал,платформа,транзит,громадський,транспорт,перевезення,рогатий"
+                },
+                "public_transport/stop_area": {
+                    "name": "Територія зупинки",
+                    "terms": "платформа,зупинка,транзит,громадський,транспорт,перевезення,термінал"
                 },
                 "public_transport/stop_position": {
                     "name": "Місце зупинки",
-                    "terms": "зупинка, транспорт, автобус, трамвай, тролейбус"
+                    "terms": "зупинка,транзит,громадський,транспорт,перевезення,термінал"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Місце зупинки канатної дороги",
+                    "terms": "підвісна дорога,кабіна,вагон,перевезення,громадський,транспорт,канатна дорога,зупинка"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Місце зупинки автобуса",
+                    "terms": "автобус,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Місце зупинки порома",
+                    "terms": "пором,док,човен,пірс,платформа,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Місце зупинки швидкісного трамваю",
+                    "terms": "електричка,трамвай,рейки,дроти,електротранспорт,перевезення,громадський,транспорт,зупинка"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Місце зупинки монорейки",
+                    "terms": "монорейка,монорельс,зупинка,станція,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Місце зупинки потяга метро",
+                    "terms": "метро,підземка,платформа,станція,зупинка,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Місце зупинки потяга",
+                    "terms": "залізнична,платформа,зупинка,вокзал,станція,транзит,громадський,транспорт,перевезення"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Місце зупинки трамвая",
+                    "terms": "електричка,трамвай,рейки,дроти,електротранспорт,перевезення,громадський,транспорт,зупинка"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Місце зупинки тролейбуса",
+                    "terms": "тролейбус,вагон,електротранспорт,електробус,дроти,платформа,зупинка,транзит,громадський,транспорт,перевезення,рогатий"
                 },
                 "railway": {
                     "name": "Залізниця"
                     "terms": "фунікулер, канат, трос "
                 },
                 "railway/halt": {
-                    "name": "Залізнична зупинка",
-                    "terms": "Railway Halt, pfkspybxyf pegbyrf, залізнична зупинка"
+                    "name": "Полустанок (на вимогу)"
                 },
                 "railway/level_crossing": {
                     "name": "Залізничний переїзд (автомобілний)",
                     "terms": "залізниця,потяг,рейки,автомобіль,перехід,шлагбаум,світлофор,поїзд,(автомобільний),дорога,шлях"
                 },
+                "railway/light_rail": {
+                    "name": "Швидкісний трамвай",
+                    "terms": "легкорейковий,транспорт,електричка,міська,трамвай"
+                },
                 "railway/milestone": {
                     "name": "Кілометровий знак",
                     "terms": "знак,залізниця,кілометр"
                 },
+                "railway/miniature": {
+                    "name": "Міні-залізниця",
+                    "terms": "залізниця,розваги,парк,атракціон"
+                },
                 "railway/monorail": {
                     "name": "Монорейка",
                     "terms": "Monorail, vjyjhtqrf, монорейка"
                     "terms": "залізниця, колія, вокзал"
                 },
                 "railway/platform": {
-                    "name": "Залізнична платформа",
-                    "terms": "Railway Platform, pfkspybxyf gkfanajhvf, залізнична платформа"
+                    "name": "Залізнична зупинка/платформа"
                 },
                 "railway/rail": {
                     "name": "Рейки",
                     "terms": "залізниця,сигнал,семафор,світлофор"
                 },
                 "railway/station": {
-                    "name": "Залізнична станція",
-                    "terms": "Railway Station, pfkspybxyf cnfywsz, залізнична станція"
+                    "name": "Залізнична станція"
                 },
                 "railway/subway": {
                     "name": "Метрополітен",
                     "terms": "Tram, nhfvdfq, трамвай"
                 },
                 "railway/tram_stop": {
-                    "name": "Зупинка трамвая",
-                    "terms": "зупинка,трамвай,транспорт,громадський,вагон,рейки"
+                    "name": "Місце зупинки трамвая"
                 },
                 "relation": {
                     "name": "Зв’язок",
                     "terms": "Jeweler, dtkshys ghbrhfcb, ювелір, ювелірний, прикраси"
                 },
                 "shop/kiosk": {
-                    "name": "Ð\93азеÑ\82ний ÐºÐ¸оск",
-                    "terms": "газеÑ\82а, Ð½Ð¾Ð²Ð¸Ð½Ð¸"
+                    "name": "Ð\9aÑ\96оск",
+                    "terms": "жÑ\83Ñ\80нали,газеÑ\82и,Ñ\86игаÑ\80ки,напоÑ\97,кава,Ñ\87ай,лоÑ\82еÑ\80еÑ\8f"
                 },
                 "shop/kitchen": {
                     "name": "Меблі для кухні",
                     "name": "Маршрут для верхової їзди",
                     "terms": "кінь,верхи,шлях,маршрут"
                 },
+                "type/route/light_rail": {
+                    "name": "Маршрут швидкісного трамвая",
+                    "terms": "легкорейковий,транспорт,електричка,міська,колії,трамвай"
+                },
                 "type/route/pipeline": {
                     "name": "Трубопровід",
                     "terms": "Pipeline Route, nhejghjdsl, трубопровід"
                 },
+                "type/route/piste": {
+                    "name": "Трек / Лижний маршрут",
+                    "terms": "лижі,снігоступи,гірські,крос"
+                },
                 "type/route/power": {
                     "name": "Лінія електропередач",
                     "terms": "Power Route, ksysz tktrnhjgthtlfx, лінія електромережі"
                     "name": "Автомобільний маршрут",
                     "terms": "Road Route, fdnjvjskmybq vfhihen, автомобільний маршрут"
                 },
+                "type/route/subway": {
+                    "name": "Лінія метро",
+                    "terms": "метро,маршрут,громадський,транспорт,підземка"
+                },
                 "type/route/train": {
                     "name": "Залізничний маршрут",
                     "terms": "Train Route, pfkspybxybq vfhihen, залізничний маршрут"
                     "terms": "Drain, lhtyfybq rfyfk, стічна канава, дренаж"
                 },
                 "waterway/fuel": {
-                    "name": "Ð\90Ð\97С для човнів",
+                    "name": "Ð\97апÑ\80авка для човнів",
                     "terms": "petrol,gas,diesel,boat,пальне,бензин,дизпаливо,човен,лодка,газ"
                 },
                 "waterway/river": {
                     "text": "Умови використання та Відгуки"
                 },
                 "description": "Межі та дати знімків. Підписи з'являються з 14 рівня масштабування. ",
-                "name": "Ð\97нÑ\96мки DigitalGlobe Premium Vintage"
+                "name": "Ð\9fеÑ\80Ñ\96од Ð·Ð½Ñ\96мкÑ\96в DigitalGlobe Premium"
             },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "Умови використання та Відгуки"
                 },
                 "description": "Межі та дати знімків. Підписи з'являються з 14 рівня масштабування. ",
-                "name": "Ð\97нÑ\96мки DigitalGlobe Standard Vintage"
+                "name": "Ð\9fеÑ\80Ñ\96од Ð·Ð½Ñ\96мкÑ\96в DigitalGlobe Standard"
             },
             "EsriWorldImagery": {
                 "attribution": {
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, дані мап Учасники OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, Учасники OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Позначені маршрути: Велосипедні"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, дані мап Учасники OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, Учасники OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Позначені маршрути: Туристичні"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, дані мап Учасники OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, Учасники OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Позначені маршрути: MTB"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, дані мап Учасники OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, Учасники OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Позначені маршрути: Ковзани"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, дані мап Учасники OpenStreetMap, ODbL 1.0"
+                    "text": "© waymarkedtrails.org, Учасники OpenStreetMap, CC by-SA 3.0"
                 },
                 "name": "Позначені маршрути: Зимові вид спорту"
             },
index 82a20347b249a693fc97394f2cadf63635c8e1bb..bcbbb504ecf78ae7ed98e8b87aed474ea0b27ba0 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "Nhấn chuột để đặt thêm nốt vào đường kẻ. Nhấn vào đường khác để nối đường lại. Nhấn đúp để hoàn thành đường."
+            },
+            "drag_node": {
+                "connected_to_hidden": "Không thể sửa đổi đối tượng này vì nó nối liền với một đối tượng ẩn."
             }
         },
         "operations": {
             "about_changeset_comments": "Nên tóm lược sửa đổi như thế nào?",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments?setlang=vi",
             "google_warning": "Bạn đã đề cập đến Google trong lời tóm lược này. Chú ý cấm sao chép từ Google Maps.",
-            "google_warning_link": "http://www.openstreetmap.org/copyright/vi"
+            "google_warning_link": "https://www.openstreetmap.org/copyright/vi"
         },
         "contributors": {
             "list": "Đóng góp bởi {users}",
                 "title": "Đo lường",
                 "selected": "{n} được chọn",
                 "geometry": "Hình",
-                "closed": "đóng",
+                "closed_line": "đường kẻ đóng",
+                "closed_area": "vùng đóng",
                 "center": "Tâm",
                 "perimeter": "Chu vi",
                 "length": "Chiều dài",
                 "centroid": "Trọng tâm",
                 "location": "Vị trí",
                 "metric": "Hệ mét",
-                "imperial": "Hệ Anh"
+                "imperial": "Hệ Anh",
+                "node_count": "Số nốt"
             }
         },
         "geometry": {
             "documentation_redirect": "Tài liệu này đã được di chuyển đến trang mới.",
             "show_more": "Xem thêm",
             "view_on_osm": "Xem tại openstreetmap.org",
-            "all_fields": "Các chi tiết thường gặp",
+            "all_fields": "Các thuộc tính thường gặp",
             "all_tags": "Tất cả các thẻ",
             "all_members": "Tất cả các thành viên",
             "all_relations": "Tất cả các quan hệ",
             "way": "Lối",
             "relation": "Quan hệ",
             "location": "Vị trí",
-            "add_fields": "Thêm chi tiết:"
+            "add_fields": "Thêm thuộc tính:"
         },
         "background": {
             "title": "Hình nền",
             "description": "Tùy chọn Hình nền",
             "key": "B",
-            "percent_brightness": "Độ sáng {opacity}%",
+            "backgrounds": "Hình nền",
             "none": "Không có",
             "best_imagery": "Nguồn hình ảnh hữu ích nhất đối với nơi này",
             "switch": "Quay về hình nền này",
             "custom": "Tùy biến",
             "custom_button": "Sửa hình nền tùy biến",
-            "custom_prompt": "Nhập định dạng URL của các mảnh bản đồ. Bạn có thể sử dụng các dấu hiệu:\n   - {zoom}/{z}, {x}, {y} cho định dạng mảnh Z/X/Y\n   - {ty} cho tọa độ Y kiểu TMS phản chiếu\n   - {u} cho định dạng quadtile\n   - {switch:a,b,c} để luân phiên các máy chủ DNS\n\nVí dụ:\n{example}",
-            "fix_misalignment": "Chỉnh độ lệch hình ảnh",
-            "imagery_source_faq": "Hình ảnh này được lấy từ đâu?",
+            "custom_prompt": "Nhập định dạng URL của các mảnh bản đồ. Bạn có thể sử dụng các dấu hiệu:\n   - {zoom} hoặc {z}, {x}, {y} cho định dạng mảnh Z/X/Y\n   - {-y} hoặc {ty} cho tọa độ Y kiểu TMS phản chiếu\n   - {u} cho định dạng quadtile\n   - {switch:a,b,c} để luân phiên các máy chủ DNS\n\nVí dụ:\n{example}",
+            "overlays": "Lớp phủ",
+            "imagery_source_faq": "Chi tiết Hình ảnh / Báo cáo Vấn đề",
             "reset": "đặt lại",
-            "offset": "Kéo thả chuột ở vùng màu xám bên dưới để chỉnh độ lệch hình ảnh, hoặc nhập độ lệch được đo bằng mét.",
+            "display_options": "Tùy chọn Hiển thị",
+            "brightness": "Độ sáng",
+            "contrast": "Độ tương phản",
+            "saturation": "Độ bão hòa",
+            "sharpness": "Độ nét",
             "minimap": {
-                "description": "Bản đồ nhỏ",
+                "description": "Hiện Bản đồ Nhỏ",
                 "tooltip": "Mở một bản đồ thu nhỏ định vị trí đang được sửa đổi.",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "Chỉnh độ lệch hình ảnh",
+            "offset": "Kéo thả chuột ở vùng màu xám bên dưới để chỉnh độ lệch hình ảnh, hoặc nhập độ lệch được đo bằng mét."
         },
         "map_data": {
             "title": "Dữ liệu Bản đồ",
             "status_code": "Máy chủ phản hồi với mã lỗi {code}",
             "unknown_error_details": "Xin vui lòng chắc chắn rằng bạn được kết nối với Internet.",
             "uploading": "Đang đăng các thay đổi lên OpenStreetMap…",
+            "conflict_progress": "Đang kiểm tra mâu thuẫn: {num} trên {total}",
             "unsaved_changes": "Bạn có Thay đổi Chưa lưu",
             "conflict": {
                 "header": "Giải quyết sửa đổi mâu thuẫn",
             "untagged_area_tooltip": "Chọn loại vùng.",
             "untagged_relation": "Quan hệ không có thẻ",
             "untagged_relation_tooltip": "Chọn loại quan hệ.",
-            "many_deletions": "Bạn có chắc chắn muốn xóa {n} đối tượng? Các đối tượng này sẽ bị xóa khỏi bản đồ công cộng tại openstreetmap.org.",
             "tag_suggests_area": "Thẻ {tag} có lẽ dành cho vùng nhưng được gắn vào đường kẻ",
             "deprecated_tags": "Không khuyến khích sử dụng các thẻ: {tags}"
         },
             "browse": "Duyệt tập tin"
         },
         "mapillary_images": {
-            "tooltip": "Hình ảnh từ con đường do Mapillary cung cấp",
+            "tooltip": "Hình ảnh cấp phố do Mapillary cung cấp",
             "title": "Lớp phủ Hình ảnh (Mapillary)"
         },
         "mapillary_signs": {
             "view_on_mapillary": "Xem hình này trên Mapillary"
         },
         "openstreetcam_images": {
-            "tooltip": "Hình ảnh từ con đường do OpenStreetCam cung cấp",
+            "tooltip": "Hình ảnh cấp phố do OpenStreetCam cung cấp",
             "title": "Lớp phủ Hình ảnh (OpenStreetCam)"
         },
         "openstreetcam": {
         "help": {
             "title": "Trợ giúp",
             "key": "H",
-            "help": "# Trợ giúp\n\nĐây là trình vẽ của [OpenStreetMap](http://www.openstreetmap.org/), bản đồ có mã nguồn mở và dữ liệu mở cho phép mọi người cùng sửa đổi. Bạn có thể sử dụng chương trình này để bổ sung và cập nhật dữ liệu bản đồ tại khu vực của bạn. Bạn có thể cải tiến bản đồ thế giới mở để cho mọi người sử dụng.\n\nCác sửa đổi của bạn trên bản đồ này sẽ xuất hiện cho mọi người dùng OpenStreetMap. Để sửa bản đồ, bạn cần phải [đăng nhập](https://www.openstreetmap.org/login).\n\n[Trình vẽ iD](http://ideditor.com/) là một dự án cộng tác và xuất bản [tất cả mã nguồn tại GitHub](https://github.com/openstreetmap/iD).\n",
-            "editing_saving": "# Sửa đổi & Lưu giữ\n\nĐây là một chương trình vẽ trực tuyến, hiện tại bạn đang truy cập nó qua một trang Web.\n\n### Lựa chọn Đối tượng\n\nĐể lựa chọn một đối tượng, thí dụ con đường hay một điểm, nhấn chuột vào nó trên bản đồ. Khi đối tượng được chọn, bạn sẽ thấy một biểu mẫu ở bên phải chứa các chi tiết về đối tượng. Nhấn chuột phải để xem trình đơn chứa các tác vụ để thực hiện với đối tượng.\n\nĐể lựa chọn nhiều đối tượng cùng lúc, nhấn giữ phím Shift và nhấn chuột vào từng đối tượng một. Thay thế, nhấn giữ Shift và kéo chuột trên bản đồ để vẽ hộp bao. Các đối tượng nằm vào hộp này sẽ được chọn.\n\n### Lưu giữ Sửa đổi\n\nKhi bạn sửa đổi các tuyến đường, tòa nhà, và địa điểm, các thay đổi này được lưu giữ trên máy cho đến khi bạn đăng nó lên máy chủ. Đừng lo nhầm lẫn: chỉ việc nhấn vào các nút “Hoàn tác” và “Làm lại”.\n\nNhấn “Lưu” để hoàn thành các sửa đổi, thí dụ bạn vừa vẽ xong một khu và muốn bắt đầu vẽ khu mới. Trình vẽ sẽ trình bày các thay đổi để bạn xem lại, cũng như các gợi ý và cảnh báo nếu bạn đã sửa nhầm lẫn.\n\nSau khi vẽ xong, bạn sẽ nhập lời tóm lược các thay đổi và nhấn “Tải lên” để đăng các thay đổi lên [OpenStreetMap.org](http://www.openstreetmap.org/). Các thay đổi sẽ xuất hiện tại trang web này để mọi người xem và cập nhật nếu có sai sót.\n\nNếu bạn chưa xong mà cần rời khỏi máy tính, bạn có thể đóng trình vẽ này. Lần sau trở lại, trình vẽ này sẽ cho phép khôi phục các thay đổi chưa lưu của bạn (miễn là bạn sử dụng cùng máy tính và trình duyệt).\n\n### Sử dụng Chương trình\n\nBấm phím `?` để xem bảng phím tắt đầy đủ.\n\n",
-            "roads": "# Đường sá\n\nTrình vẽ này cho phép tạo, sửa, và xóa các con đường. Con đường không nhất thiết phải là đường phố: có thể vẽ đường cao tốc, đường mòn, đường đi bộ, đường xe đạp…\n\n### Lựa chọn\n\nNhấn vào con đường để lựa chọn nó. Con đường sẽ được tô sáng, và thanh bên sẽ trình bày các chi tiết của con đường. Nhấn chuột phải để xem trình đơn chứa các tác vụ để thực hiện với con đường.\n\n### Sửa đổi\n\nNhiều khi bạn sẽ gặp những con đường bị chệch đối với hình nền hoặc tuyến đường GPS. Bạn có thể chỉnh lại các con đường này để chính xác hơn.\n\nTrước tiên, nhấn vào con đường cần chỉnh lại. Đường sẽ được tô sáng và các nốt sẽ xuất hiện để bạn kéo sang vị trí đúng hơn. Để thêm chi tiết, nhấn đúp vào một khúc đường chưa có nốt, và một nốt mới sẽ xuất hiện để bạn kéo.\n\nNếu con đường nối với đường khác trên thực tiếp, nhưng trên bản đồ thì chưa nối liền, hãy kéo một nốt của một con đường sang đường kia để nối liền hai con đường. Nối liền các đường tại giao lộ là một điều rất quan trọng tăng khả năng chỉ đường.\n\nĐể di chuyển toàn bộ con đường cùng lúc, nhấn chuột phải vào nó và nhấn vào công cụ “Di chuyển” hoặc nhấn phím tắt `D`, chuyển chuột sang vị trí mới, rồi nhấn chuột để hoàn thành việc di chuyển.\n\n### Xóa\n\nHãy tưởng tượng bạn gặp một con đường hoàn toàn sai: bạn không thấy được con đường trong hình ảnh trên không và, theo lý tưởng, cũng đã ghé vào chỗ đó để xác nhận rằng nó không tồn tại. Nếu trường hợp này, bạn có thể xóa con đường hoàn toàn khỏi bản đồ. Xin cẩn thận khi xóa đối tượng: giống như mọi sửa đổi khác, mọi người sẽ thấy được kết quả. Ngoài ra, hình ảnh trên không nhiều khi lỗi thời – con đường có thể mới xây – thành thử tốt nhất là ghé vào chỗ đó để quan sát chắc chắn, nếu có thể.\n\nĐể xóa một con đường, lựa chọn nó bằng cách nhấn phím Delete hoặc bằng cách nhấn chuột phải vào nó rồi nhấn vào hình thùng rác.\n\n### Tạo mới\n\nBạn có tìm ra một con đường chưa được vẽ trên bản đồ? Hãy bắt đầu vẽ đường kẻ mới bằng cách nhấn vào nút “Đường” ở phía trên bên trái của trình vẽ, hoặc nhấn phím tắt `2`.\n\nNhấn vào bản đồ tại điểm bắt đầu của con đường. Hoặc nếu con đường chia ra từ đường khác đã tồn tại, trước tiên nhấn chuột tại giao lộ giữa hai con đường này.\n\nSau đó, nhấn chuột lần lượt theo lối đường dùng hình ảnh trên không hoặc tuyến đường GPS. Khi nào con đường giao với đường khác, nhấn chuột tại giao lộ để nối liền hai con đường này. Sau khi vẽ xong, nhấn đúp vào nốt cuối dùng hoặc nhấn phím Return hay Enter.\n\n\n",
-            "gps": "# GPS\n\nHệ thống định vị toàn cầu, còn gọi GPS, là nguồn dữ liệu tin tưởng nhất trong dự án OpenStreetMap. Trình vẽ này hỗ trợ các tuyến đường thu thập được từ máy GPS, tức tập tin `.gpx` trên máy tính của bạn. Bạn có thể thu loại tuyến đường GPS này bằng một ứng dụng cài đặt trên điện thoại thông minh hoặc máy thu GPS.\n\nĐọc thêm về cách thu thập dữ liệu bằng GPS tại “[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/)”.\n\nĐể sử dụng một tuyến đường GPX trong việc vẽ bản đồ, kéo thả tập tin GPX vào trình vẽ bản đồ này. Nếu trình vẽ nhận ra tuyến đường, tuyến đường sẽ được tô màu hồng sẫm trên bản đồ. Mở hộp “Dữ liệu Bản đồ” ở thanh công cụ bên phải để bật tắt hoặc thu phóng lớp GPX này.\n\nTuyến đường GPX không được tải trực tiếp lên OpenStreetMap. Cách tốt nhất để sử dụng nó là vạch đường theo nó trên bản đồ, cũng như [tải nó lên OpenStreetMap](http://www.openstreetmap.org/trace/create) để cho người khác sử dụng.\n",
-            "imagery": "# Hình ảnh\n\nẢnh hàng không là tài nguyên quan trọng trong việc vẽ bản đồ. Có sẵn một số nguồn hình ảnh chụp từ máy bay và vệ tinh, cũng như một số nguồn thông tin mở, trong trình đơn “Tùy chọn Hình nền” ở bên phải của trình vẽ này.\n\nTheo mặc định, trình vẽ hiển thị lớp trên không của [Bản đồ Bing](http://www.bing.com/maps/), nhưng có sẵn nguồn khác tùy theo vị trí đang xem trong trình duyệt. Ngoài ra có hình ảnh rất rõ tại nhiều vùng ở một số quốc gia như Hoa Kỳ, Pháp, và Đan Mạch.\n\nHình ảnh đôi khi bị chệch đối với dữ liệu bản đồ vì dịch vụ hình ảnh có lỗi. Nếu bạn nhận thấy nhiều con đường bị chệch đối với hình nền, xin đừng di chuyển các đường này để trùng hợp với hình ảnh. Thay vì di chuyển các con đường, hãy chỉnh lại hình ảnh để phù hợp với dữ liệu tồn tại bằng cách nhấn “Chỉnh lại hình nền bị chệch” ở cuối hộp Tùy chọn Hình nền.\n",
-            "addresses": "# Địa chỉ\n\nĐịa chỉ là những thông tin rất cần thiết trên bản đồ.\n\nTuy bản đồ thường trình bày các địa chỉ như một thuộc tính của đường sá, nhưng OpenStreetMap liên kết các địa chỉ với các tòa nhà hoặc miếng đất dọc đường.\n\nBạn có thể thêm thông tin địa chỉ vào các hình dạng tòa nhà hoặc các địa điểm quan tâm. Tốt nhất là lấy thông tin địa chỉ từ kinh nghiệm cá nhân, thí dụ đi dạo trên phố và ghi chép các địa chỉ hoặc nhớ lại những chi tiết từ hoạt động hàng ngày của bạn. Cũng như bất cứ chi tiết nào, dự án này hoàn toàn cấm sao chép từ các nguồn thương mại như Bản đồ Google.\n",
-            "inspector": "# Trình kiểm tra\n\nTrình kiểm tra là hộp ở bên trái của trang cho phép sửa đổi các chi tiết của các đối tượng được chọn.\n\n### Chọn một Thể loại Đối tượng\n\nSau khi thêm địa điểm, đường kẻ, hoặc vùng vào bản đồ, bạn có thể cho biết đối tượng này tượng trưng cho gì, chẳng hạn con đường, siêu thị, hoặc quán cà phê. Trình kiểm tra trình bày các nút tiện để chọn các thể loại đối tượng thường gặp, hoặc bạn có thể gõ một vài chữ mô tả vào hộp tìm kiếm để tìm ra các thể loại khác.\n\nNhấn vào hình “i” ở góc phía dưới bên phải của một nút thể loại để tìm hiểu thêm về thể loại đó. Nhấn vào nút để chọn thể loại đó.\n\n### Điền đơn và Gắn thẻ\n\nSau khi bạn chọn thể loại, hoặc nếu chọn một đối tượng đã có thể loại, trình kiểm tra trình bày các trường văn bản và điều khiển để xem và sửa các thuộc tính của đối tượng như tên và địa chỉ.\n\nỞ dưới các điều khiển có một trình đơn “Thêm chi tiết” cho phép bổ sung thêm chi tiết, chẳng hạn tên bài [Wikipedia](http://www.wikipedia.org/) và mức hỗ trợ xe lăn.\n\nNhấn vào “Tất cả các thẻ” ở cuối trình kiểm tra để gắn bất cứ thẻ nào vào đối tượng. [Taginfo](http://taginfo.openstreetmap.org/) là một công cụ rất hữu ích để tìm ra những phối hợp thẻ phổ biến.\n\nCác thay đổi trong trình kiểm tra được tự động áp dụng vào bản đồ. Bạn có thể nhấn vào nút “Hoàn tác” vào bất cứ lúc nào để hoàn tác các thay đổi.\n",
-            "buildings": "# Tòa nhà\n\nOpenStreetMap là cơ sở dữ liệu tòa nhà lớn nhất trên thế giới. Mời bạn cùng xây dựng và cải tiến cơ sở dữ liệu này.\n\n### Lựa chọn\n\nNhấn vào một vùng tòa nhà để lựa chọn nó. Đường biên của vùng sẽ được tô sáng, và thanh bên sẽ trình bày các chi tiết về tòa nhà. Nhấn chuột phải để xem trình đơn chứa các tác vụ để thực hiện với tòa nhà.\n\n### Sửa đổi\n\nĐôi khi vị trí hoặc các thẻ của một tòa nhà không chính xác.\n\nĐể di chuyển toàn bộ tòa nhà cùng lúc, lựa chọn vùng và bấm phím tắt `D`, hoặc nhấn chuột phải vào nó và nhấn công cụ “Di chuyển”. Chuyển con trỏ sang vị trí mới và nhấn chuột để hoàn thành việc di chuyển.\n\nĐể sửa hình dạng của một tòa nhà, kéo các nốt của đường biên sang các vị trí chính xác.\n\n### Vẽ mới\n\nMột trong những điều gây nhầm lẫn là một tòa nhà có thể là vùng hoặc có thể là địa điểm. Nói chung, khuyên bạn _vẽ tòa nhà là vùng nếu có thể_. Nếu tòa nhà chứa hơn một công ty, chỗ ở, hoặc gì đó có địa chỉ, hãy đặt một địa điểm riêng cho mỗi địa chỉ đó và đưa mỗi địa điểm vào trong vùng của tòa nhà.\n\nĐể bắt đầu vẽ tòa nhà, nhấn vào nút “Vùng” ở phía trên bên trái của trình vẽ. Nhấn chuột tại các góc tường, rồi “đóng” vùng bằng cách nhấn phím Return hay Enter hoặc nhấn vào nốt đầu tiên.\n\n### Xóa\n\nHãy tưởng tượng bạn gặp một tòa nhà hoàn toàn sai: bạn không thấy được tòa nhà trong hình ảnh trên không và, theo lý tưởng, cũng đã ghé vào chỗ đó để xác nhận rằng nó không tồn tại. Nếu trường hợp này, bạn có thể xóa tòa nhà hoàn toàn khỏi bản đồ. Xin cẩn thận khi xóa đối tượng: giống như mọi sửa đổi khác, mọi người sẽ thấy được kết quả. Ngoài ra, hình ảnh trên không nhiều khi lỗi thời – có thể mới xây tòa nhà – thành thử tốt nhất là ghé vào chỗ đó để quan sát chắc chắn, nếu có thể.\n\nĐể xóa một tòa nhà, lựa chọn nó bằng cách nhấn vào nó và nhấn phím Delete, hoặc bằng cách nhấn chuột phải vào nó và nhấn vào hình thùng rác.\n\n\n",
-            "relations": "# Quan hệ\n\nQuan hệ là loại dữ liệu đặc biệt trong OpenStreetMap có khả năng nhóm lại nhiều đối tượng. Có hai loại quan hệ phổ biến nhất: các *quan hệ tuyến đường* nhóm lại các khúc đường trên một xa lộ, còn các *tổ hợp đa giác* (multipolygon) ghép lại một vài đường kẻ định rõ hình dạng của một khu vực có nhiều đa giác riêng hoặc một khu vực có lỗ.\n\nCác đối tượng trực thuộc quan hệ là các *thành viên*. Ở cuối thanh bên, bạn có thể xem đối tượng trực thuộc những quan hệ nào. Nhấn chuột vào một quan hệ ở đấy để chọn nó. Khi nào quan hệ được chọn, các thành viên sẽ được liệt kê trong thanh bên và tô đậm trên bản đồ.\n\nNói chung, iD sẽ tự động quản lý các quan hệ trong lúc sửa đổi. Bạn chỉ cần chú ý rằng, khi nào bạn xóa một khúc đường để vẽ chính xác hơn, bạn phải chắc chắn rằng khúc đường mới cũng trực thuộc cùng quan hệ với khúc đường cũ.\n\n## Sửa đổi Quan hệ\n\niD cho phép sửa đổi các chi tiết cơ bản của quan hệ.\n\nĐể đưa một đối tượng vào quan hệ, chọn đối tượng, bấm nút “+” trong phần “Tất cả các quan hệ” của thanh bên, và chọn quan hệ từ trình đơn hoặc nhập tên của quan hệ.\n\nĐể tạo một quan hệ mới, chọn đối tượng đầu tiên để đưa vào quan hệ, bấm nút “+” trong phần “Tất cả các quan hệ” của thanh bên, và chọn “Quan hệ mới…”.\n\nĐể tháo gỡ một đối tượng khỏi quan hệ, chọn đối tượng và nhấn chuột vào hình thùng rác bên cạnh quan hệ mà bạn không muốn bao gồm đối tượng.\n\nDùng công cụ “Gộp” để vẽ tổ hợp đa giác, tức thủng lỗ vào một vùng. Vẽ hai vùng (ứng với cạnh bên trong và bên ngoài), giữ phím Shift trong khi nhấn chuột vào các vùng để chọn chúng, và nhấn phím tắt `G`. Thay thế, nhấn chuột phải vào một trong những vùng và bấm nút “Gộp” (hình +).\n\n"
+            "help": {
+                "title": "Trợ giúp",
+                "welcome": "Đây là iD, chương trình vẽ bản đồ [OpenStreetMap](https://www.openstreetmap.org/). Dùng chương trình này, bạn có thể bổ sung vào OpenStreetMap ngay trực tiếp từ trình duyệt của bạn.",
+                "open_data_h": "Dữ liệu Mở",
+                "open_data": "Các sửa đổi của bạn trên bản đồ này sẽ xuất hiện cho mọi người dùng OpenStreetMap. Bạn có thể vẽ những gì mình nhớ lại, nhìn thấy trực tiếp ngoài đường, hoặc nhìn thấy trong hình chụp từ không trung hay hình ảnh cấp phố. Chú ý [cấm sao chép](https://www.openstreetmap.org/copyright) từ các nguồn thương mại, chẳng hạn như Google Maps.",
+                "before_start_h": "Trước khi bắt đầu",
+                "before_start": "Bạn nên quen với OpenStreetMap và chương trình này trước khi bắt đầu sửa đổi bản đồ. iD có chế độ hướng dẫn những căn bản sửa đổi OpenStreetMap. Nhấn chuột vào “Mở trình hướng dẫn” trong cửa sổ này để bắt đầu tìm hiểu thêm – điều này chỉ mất vào khoảng 15 phút.",
+                "open_source_h": "Mã nguồn mở",
+                "open_source": "Chương trình iD nhờ dự án mã nguồn mở cộng tác xây dựng. Bạn đang sử dụng phiên bản {version}. Mã nguồn có sẵn [tại GitHub](https://github.com/openstreetmap/iD).",
+                "open_source_help": "Mời bạn góp sức [biên dịch](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) hoặc [báo cáo lỗi](https://github.com/openstreetmap/iD/issues)."
+            },
+            "overview": {
+                "title": "Giới thiệu",
+                "navigation_h": "Điều hướng",
+                "navigation_drag": "Để đi tới đi lui, kéo thả và cuộn bản đồ dùng {leftclick} nút chuột trái, hoặc bấm các phím mũi tên `↓`, `↑`, `←`, `→` trên bàn phím.",
+                "navigation_zoom": "Cuộn để thu phóng bản đồ. Chuột thường có bánh xe ở giữa để cuộn lên xuống. Tùy bàn di chuột, bạn có thể phải vuốt hai ngón tay lên xuống hoặc vuốt cạnh bên phải. Thay thế, bạn có thể bấm các nút {plus} và {minus} hoặc các phím `+` và `-`.",
+                "features_h": "Các Thể loại Đối tượng",
+                "features": "Từ *đối tượng* chỉ những gì xuất hiện trên bản đồ, chẳng hạn con đường, tòa nhà, và địa điểm. Bạn có thể vẽ tất cả những vật tĩnh và cụ thể là một đối tượng trong OpenStreetMap. Mỗi đối tượng thực tế ứng với một *địa điểm*, *đường kẻ*, hoặc *vùng* trên bản đồ.",
+                "nodes_ways": "Trong OpenStreetMap, các địa điểm đôi khi được gọi *nốt* (node), và các đường kẻ và vùng đôi khi được gọi *lối* (way)."
+            },
+            "editing": {
+                "title": "Sửa & Lưu",
+                "select_h": "Lựa chọn",
+                "select_left_click": "{leftclick} Nhấn chuột trái vào một đối tượng để chọn nó. Đối tượng sẽ chớp chớp, và thanh bên sẽ có các chi tiết về đối tượng như tên và địa chỉ.",
+                "select_right_click": "{rightclick} Nhấn chuột phải vào một đối tượng để mở trình đơn có các tác vụ ảnh hưởng đến đối tượng như xoay, di chuyển, và xóa.",
+                "multiselect_h": "Chọn nhiều",
+                "multiselect_shift_click": "Nhấn giữ phím `{shift}` và {leftclick} nhấn chuột trái để chọn nhiều đối tượng. Như vầy dễ di chuyển hoặc xóa nhiều đối tượng cùng lúc.",
+                "multiselect_lasso": "Để chọn nhiều đối tượng nằm gần nhau, bạn cũng có thể nhấn giữ phím `{shift}` và kéo {leftclick} nút chuột trái để bôi đen một vùng chung quanh các đối tượng. Tất cả các nốt ở trong vùng này sẽ được chọn.",
+                "undo_redo_h": "Hoàn tác & Làm lại",
+                "undo_redo": "Các sửa đổi của bạn được lưu trữ tạm thời trên máy của bạn cho đến lúc tải nó lên máy chủ OpenStreetMap. Hoàn tác các thay đổi không muốn dùng nút {undo} **Hoàn tác**, và làm lại các thay đổi đã được hoàn tác dùng nút {redo} **Làm lại**.",
+                "save_h": "Lưu",
+                "save": "Bấm {save} **Lưu** để hoàn thành bộ thay đổi của bạn và tải nó lên OpenStreetMap. Hãy nhớ lưu các thay đổi thường xuyên!",
+                "save_validation": "Trong cửa sổ lưu giữ, bạn có cơ hội xem lại các thay đổi do bạn thực hiện. iD cũng kiểm tra các thay đổi một cách sơ qua và sẽ thông báo về dữ liệu có vẻ sai.",
+                "upload_h": "Tải lên",
+                "upload": "Nhập [lời tóm lược sửa đổi](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Sau đó, bấm **Tải lên** để đăng các thay đổi vào OpenStreetMap. Các thay đổi sẽ xuất hiện ngay trên bản đồ chính để cho mọi người xem.",
+                "backups_h": "Sao lưu Tự động",
+                "backups": "Nếu bạn chưa xong mà cần rời đóng thẻ, hoặc nếu trình duyệt gặp sự cố, các sửa đổi của bạn vẫn được lưu trữ tạm thời trong trình duyệt. Lần sau quay về chương trình vẽ trên máy tính và trình duyệt này, bạn sẽ có cơ hội khôi phục các thay đổi chưa lưu của bạn.",
+                "keyboard_h": "Phím tắt",
+                "keyboard": "Bấm phím `?` để xem danh sách các phím tắt."
+            },
+            "feature_editor": {
+                "title": "Trình kiểm tra Đối tượng",
+                "intro": "*Trình kiểm tra đối tượng* xuất hiện bên cạnh bản đồ, bảng này cho phép xem và sửa đổi tất cả các thông tin về đối tượng được chọn.",
+                "definitions": "Cờ ngang ở đầu thanh bên cho biết loại đối tượng. Phần giữa của biểu mẫu có các *thuộc tính* của đối tượng, chẳng hạn như tên và địa chỉ.",
+                "type_h": "Thể loại Đối tượng",
+                "type": "Nhấn chuột vào một thể loại để định rõ loại đối tượng. Tất cả những gì cụ thể có thể được thêm vào OpenStreetMap, nên bạn có thể chọn từ hàng ngàn thể loại.",
+                "type_picker": "Danh sách thể loại liệt kê các thể loại thông dụng như công viên, bệnh viện, nhà hàng, đường giao thông, và tòa nhà. Tìm kiếm thể loại, kể cả những thể loại hiếm hơn, trong hộp tìm kiếm ở đầu thanh bên. Bấm nút {inspect} **Thông tin** bên cạnh một thể loại để tìm hiểu thêm về nó.",
+                "fields_h": "Thuộc tính",
+                "fields_all_fields": "Phần “Tất cả các thuộc tính” chứa tất cả các thuộc tính thường gặp của đối tượng. Trong OpenStreetMap, tất cả các thẻ là tùy chọn, nên có thể để trống thuộc tính nào không chắc chắn.",
+                "fields_example": "Mỗi thể loại đối tượng có các thuộc tính riêng của nó. Thí dụ đường giao thông có thuộc tính về mặt đường và tốc độ tối đa, trong khi nhà hàng có thuộc tính về ẩm thực và giờ mở cửa.",
+                "fields_add_field": "Mở trình đơn “Thêm thuộc tính” để bổ sung thêm thuộc tính, chẳng hạn lời miêu tả, tên bài Wikipedia, và khả năng truy cập bằng xe lăn.",
+                "tags_h": "Thẻ",
+                "tags_all_tags": "Mở rộng phần “Tất cả các thẻ” ở cuối trình kiểm tra để sửa đổi bất cứ *thẻ* nào của đối tượng được chọn. Thẻ là đôi *chìa khóa* và *giá trị*. Mỗi thuộc tính ứng của đối tượng với ít nhất một thẻ.",
+                "tags_resources": "Sửa đổi thẻ của đối tượng là một tác vụ hơi nâng cao. Trước khi sửa đổi thẻ, tra cứu các tài nguyên như [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Vi:Main_Page?uselang=vi) hoặc [Taginfo](https://taginfo.openstreetmap.org/) để biết về các chìa khóa và giá trị thông dụng."
+            },
+            "points": {
+                "title": "Địa điểm",
+                "intro": "*Địa điểm* tương ứng với các nơi như cửa hàng, nhà hàng, đài tưởng niệm. Địa điểm chỉ ra một vị trí cụ thể và mô tả những gì thấy được tại vị trí đó.",
+                "add_point_h": "Đặt Địa điểm",
+                "add_point": "Để đặt một địa điểm, bấm nút {point} **Điểm** trên thanh công cụ bên trên bản đồ, hoặc bấm phím tắt `1`. Con trỏ sẽ trở thành chữ thập.",
+                "add_point_finish": "Để đặt địa điểm mới trên bản đồ, đưa con trỏ lên vị trí chính xác, rồi {leftclick} nhấn chuột trái hoặc bấm phím cách.",
+                "move_point_h": "Di chuyển Địa điểm",
+                "move_point": "Để di chuyển một địa điểm, đưa con trỏ lên điểm, rồi nhấn giữ {leftclick} nút chuột trái và kéo điểm đến vị trí mới.",
+                "delete_point_h": "Xóa Địa điểm",
+                "delete_point": "Đôi khi cần xóa các đối tượng không tồn tại trên thực tế. Khi xóa đối tượng khỏi OpenStreetMap, nó được loại bỏ khỏi bản đồ công cộng, nên bạn phải chắc chắn rằng nó không còn tồn tại trước khi xóa nó khỏi bản đồ.",
+                "delete_point_command": "Để xóa một địa điểm, {rightclick} nhấn chuột phải vào điểm để chọn nó và hiển thị trình đơn, rồi chọn mục {delete} **Xóa**."
+            },
+            "lines": {
+                "title": "Đường kẻ",
+                "intro": "*Đường kẻ* tương ứng với đường tâm của chẳng hạn các đường sá, đường sắt, dòng sông.",
+                "add_line_h": "Vẽ Đường kẻ",
+                "add_line": "Để vẽ một đường kẻ, bấm nút {point} **Đường** trên thanh công cụ bên trên bản đồ, hoặc bấm phím tắt `2`. Con trỏ sẽ trở thành chữ thập.",
+                "add_line_draw": "Sau đó, đưa con trỏ vào đầu đường và {leftclick} nhấn chuột trái hoặc bấm phím cách để bắt đầu đặt nốt trên đường. Tiếp tục đặt nốt bằng cách nhấn chuột hoặc bấm phím cách. Trong lúc vẽ đường, bạn vẫn có thể phóng to hoặc cuộn bản đồ để bổ sung thêm chi tiết.",
+                "add_line_finish": "Để kết thúc đường kẻ, bấm `{return}` hoặc nhấn chuột lần nữa vào nốt cuối cùng.",
+                "modify_line_h": "Điều chỉnh Đường kẻ",
+                "modify_line_dragnode": "Nhiều khi bạn sẽ gặp đường kẻ không chính xác, thí dụ một con đường không hợp với hình nền. Để điều chỉnh một đường kẻ, trước tiên {leftclick} nhấn chuột trái để chọn nó. Tất cả các nốt trên đường sẽ được đánh dấu với hình chấm nhỏ. Kéo các nốt đến các vị trí đúng.",
+                "modify_line_addnode": "Để tạo nốt mới dọc đường, {leftclick}**x2** nhấn đúp vào đường hoặc kéo mũi tên nhỏ ở giữa hai nốt đã tồn tại.",
+                "connect_line_h": "Nối liền Đường kẻ",
+                "connect_line": "Để bảo đảm sự chính xác của bản đồ, và để cho các ứng dụng có thể chỉ đường, xin chú ý nối liền các đường ở những giao lộ trên thực tế.",
+                "connect_line_display": "Các giao lộ được đánh dấu trên bản đồ với hình chấm màu xám. Nếu điểm đầu hoặc cuối đường chưa được nối liền với đối tượng nào, nó được đánh dấu với hình tròn màu trắng lớn hơn.",
+                "connect_line_drag": "Để nối liền đường với một đối tượng khác, kéo một nốt của đường về phía đối tượng kia, cho đến khi nốt nhảy đến đối tượng kia, và thả nốt. Mẹo vặt: Để tránh việc nối liền nốt trong việc điều chỉnh một đường kẻ, bấm giữ phím `{alt}` trong khi kéo nốt.",
+                "connect_line_tag": "Nếu bạn biết rằng giao lộ có đèn giao thông, chọn nốt giao lộ và chọn thể loại “Đèn giao thông” trong trình kiểm tra. Nếu có vạch qua đường, cộng thêm nốt trên đường gần giao lộ và chọn thể loại “Vạch qua đường”.",
+                "disconnect_line_h": "Tháo gỡ Đường kẻ",
+                "disconnect_line_command": "Để tháo gỡ một con đường khỏi một đối tượng khác, {rightclick} nhấn chuột phải nốt nối liền và chọn mục {disconnect} **Tháo gỡ** trong trình đơn.",
+                "move_line_h": "Di chuyển Đường kẻ",
+                "move_line_command": "Để di chuyển toàn bộ một đường kẻ, {rightclick} nhấn chuột phải vào đường kẻ và chọn mục {move} **Di chuyển** trong trình đơn. Sau đó, di chuyển con trỏ và {leftclick} nhấn chuột trái để đặt đường kẻ tại vị trí mới.",
+                "move_line_connected": "Nếu đường kẻ đã nối liền với đối tượng khác, nó sẽ tiếp tục nối liền với chúng sau khi bạn di chuyển đường kẻ đến vị trí khác. iD có thể ngăn chặn bạn không được di chuyển đường kẻ sang một đường kẻ đã nối liền với nó.",
+                "delete_line_h": "Xóa Đường kẻ",
+                "delete_line": "Bạn có thể xóa một đường kẻ hoàn toàn không chính xác, thí dụ một con đường không ứng với con đường thật. Xin vui lòng cẩn thận khi xóa đối tượng: bạn có thể đang xem hình nền lỗi thời. Mặc dù một con đường hình như giả tưởng, nó có thể tồn tại trên thực tế nhưng được xây sau khi hình ảnh được chụp.",
+                "delete_line_command": "Để xóa một đường kẻ, {rightclick} nhấn chuột phải vào đường để chọn nó và hiển thị trình đơn, rồi chọn mục {delete} **Xóa**."
+            },
+            "areas": {
+                "title": "Vùng",
+                "intro": "*Vùng* cho biết hình dạng của các đa giác như hồ nước, tòa nhà, và khu vực dân cư. Vẽ đường viền của vùng theo đường viền trên thực tế, thí dụ theo các tường ngoài của một tòa nhà.",
+                "point_or_area_h": "Địa điểm hoặc Vùng?",
+                "point_or_area": "Nhiều thể loại đối tượng có thể là địa điểm hoặc vùng. Bạn nên vẽ tòa nhà hoặc cơ ngơi là vùng nếu có thể. Đặt một địa điểm ở trong vùng tòa nhà để tượng trưng cho một kinh doanh chỉ chiếm một phần của tòa nhà.",
+                "add_area_h": "Vẽ Vùng",
+                "add_area_command": "Để vẽ một vùng, bấm nút {point} **Vùng** trên thanh công cụ bên trên bản đồ, hoặc bấm phím tắt `3`. Con trỏ sẽ trở thành chữ thập.",
+                "add_area_draw": "Sau đó, đưa con trỏ vào một góc vùng và {leftclick} nhấn chuột trái hoặc bấm phím cách để bắt đầu đặt nốt tại các góc vùng kia. Tiếp tục đặt nốt bằng cách nhấn chuột hoặc bấm phím cách. Trong lúc vẽ vùng, bạn vẫn có thể phóng to hoặc cuộn bản đồ để bổ sung thêm chi tiết.",
+                "add_area_finish": "Để kết thúc vùng, bấm `{return}` hoặc nhấn chuột lần nữa vào nốt đầu tiên hoặc cuối cùng.",
+                "square_area_h": "Góc vuông",
+                "square_area_command": "Nhiều vùng như tòa nhà có góc vuông. Để làm vuông các góc của một vùng, {rightclick} nhấn chuột phải vào đường viền của vùng, rồi chọn mục {orthogonalize} **Làm Vuông góc** trong trình đơn.",
+                "modify_area_h": "Điều chỉnh Vùng",
+                "modify_area_dragnode": "Nhiều khi bạn sẽ gặp vùng không chính xác, thí dụ một tòa nhà không hợp với hình nền. Để điều chỉnh một vùng, trước tiên {leftclick} nhấn chuột trái vào đường viền để chọn nó. Tất cả các nốt trên vùng sẽ được đánh dấu với hình chấm nhỏ. Kéo các nốt đến các vị trí đúng.",
+                "modify_area_addnode": "Để tạo nốt mới trên đường viền của vùng, {leftclick}**x2** nhấn đúp vào đường viền hoặc kéo mũi tên nhỏ ở giữa hai nốt đã tồn tại.",
+                "delete_area_h": "Xóa Vùng",
+                "delete_area": "Bạn có thể xóa một vùng hoàn toàn không chính xác, thí dụ một tòa nhà không ứng với tòa nhà thật. Xin vui lòng cẩn thận khi xóa đối tượng: bạn có thể đang xem hình nền lỗi thời. Mặc dù một tòa nhà hình như giả tưởng, nó có thể tồn tại trên thực tế nhưng được xây sau khi hình ảnh được chụp.",
+                "delete_area_command": "Để xóa một vùng, {rightclick} nhấn chuột phải vào vùng để chọn nó và hiển thị trình đơn, rồi chọn mục {delete} **Xóa**."
+            },
+            "relations": {
+                "title": "Quan hệ",
+                "intro": "*Quan hệ* là một kiểu đối tượng đặc biệt trong OpenStreetMap nhằm mục đích nhóm lại nhiều đối tượng khác. Các đối tượng thuộc về một quan hệ là các *thành viên* của quan hệ, và mỗi thành viên có thể có một *vai trò* trong quan hệ.",
+                "edit_relation_h": "Sửa đổi Quan hệ",
+                "edit_relation": "Bạn có thể mở rộng phần “Tất cả các quan hệ” ở cuối thanh bên để xem đối tượng được chọn có trực thuộc quan hệ nào hay không. Nếu có, bạn có thể nhấn chuột vào quan hệ để chọn và sửa đổi nó. Khi chọn một quan hệ, các thành viên được liệt kê trong phần “Tất cả các thành viên” ở cuối thanh bên.",
+                "edit_relation_add": "Để xếp một đối tượng vào một quan hệ, chọn đối tượng rồi bấm nút {plus} **Thêm** trong phần “Tất cả các quan hệ” của thanh bên. Bạn có thể chọn quan hệ từ một danh sách quan hệ lân cận hoặc tạo một quan hệ mới dùng mục “Quan hệ mới…”.",
+                "edit_relation_delete": "Để tháo gỡ đối tượng được chọn khỏi một quan hệ, bấm nút {delete} **Xóa** trong phần “Tất cả các quan hệ” hoặc “Tất cả các thành viên”. Nếu bạn gỡ tất cả các thành viên khỏi một quan hệ, quan hệ đó sẽ được xóa tự động.",
+                "maintain_relation_h": "Bảo quản Quan hệ",
+                "maintain_relation": "Nói chung, iD sẽ tự động quản lý các quan hệ khi bạn sửa đổi các đối tượng khác. Tuy nhiên, hãy cẩn thận khi thay thế các đối tượng có thể trực thuộc quan hệ. Thí dụ nếu xóa một quãng đường và thay thế nó bằng một quãng đường mới, hãy nhớ xếp quãng mới vào cùng các quan hệ (các tuyến đường, hạn chế rẽ, v.v.) như quãng ban đầu.",
+                "relation_types_h": "Các Thể loại Quan hệ",
+                "multipolygon_h": "Tổ hợp Đa giác",
+                "multipolygon": "Quan hệ *tổ hợp đa giác* là nhóm một hay nhiều vùng *bên ngoài* và một hay nhiều vùng bên trong. Các vùng bên ngoài định rõ đường viền ngoài của đa giác, còn các vùng bên trong định rõ các vùng con hoặc lỗ thủng bên trong đa giác.",
+                "multipolygon_create": "Để tạo một tổ hợp đa giác, thí dụ để vẽ tòa nhà có sân trong, vẽ vùng bên ngoài theo các tường bên ngoài, và vẽ đường kẻ hoặc vùng theo các tường chung quanh sân trong. Sau đó, bấm giữ phím `{shift}` và {leftclick} nhấn chuột trái để chọn cả hai đối tượng, {rightclick} nhấn chuột phải để mở trình đơn, và chọn mục {merge} **Hợp nhất**.",
+                "multipolygon_merge": "Việc hợp nhất nhiều đường kẻ hoặc vùng sẽ tạo ra một quan hệ tổ hợp đa giác mới chứa tất cả các đối tượng được chọn. iD sẽ tự động chọn các vai trò `inner` (bên trong) và `outer` (bên ngoài) tùy theo đối tượng nào nằm trong đối tượng nào.",
+                "turn_restriction_h": "Hạn chế Rẽ",
+                "turn_restriction": "Quan hệ *hạn chế rẽ* nhóm lại các quãng đường chịu ảnh hưởng của một hạn chế rẽ, các quãng đường này nối liền tại một giao lộ. Một hạn chế rẽ có một đường `from` (**từ**), một nốt hoặc đường `via` (**qua**), và một đường `to` (**đến**).",
+                "turn_restriction_field": "Để sửa đổi một hạn chế rẽ, chọn giao lộ giữa hai con đường trở lên. Trình kiểm tra sẽ hiển thị bản đồ nhỏ của giao lộ cho thuộc tính “Hạn chế rẽ”.",
+                "turn_restriction_editing": "Trong bản đồ nhỏ của thuộc tính “Hạn chế rẽ”, nhấn chuột để chọn một con đường “từ” và xem các đường “đến” kia có được đi vào hay không. Nhấn chuột vào mũi tên trên các con đường để đánh dấu cho phép hoặc hạn chế. iD tự động tạo các quan hệ với các vai trò `from`, `via`, và `to` tùy theo các mũi tên.",
+                "route_h": "Tuyến đường",
+                "route": "Quan hệ *tuyến đường* nhóm lại một hay nhiều đường kẻ thành một tuyến đường trong mạng lưới, chẳng hạn tuyến buýt, tuyến đường sắt, hoặc tuyến đường xe hơi.",
+                "route_add": "Để xếp một đối tượng vào một quan hệ tuyến đường, chọn đối tượng và bấm nút {plus} **Thêm** trong phần “Tất cả các quan hệ” của thanh bên. Bạn có thể chọn quan hệ từ một danh sách quan hệ lân cận hoặc tạo một quan hệ mới dùng mục “Quan hệ mới…”. ",
+                "boundary_h": "Biên giới",
+                "boundary": "Quan hệ *biên giới* nhóm lại một hay nhiều đường kẻ thành biên giới của một đơn vị hành chính.",
+                "boundary_add": "Để xếp một đối tượng vào một quan hệ biên giới, chọn đối tượng và bấm nút {plus} **Thêm** trong phần “Tất cả các quan hệ” của thanh bên. Bạn có thể chọn quan hệ từ một danh sách quan hệ lân cận hoặc tạo một quan hệ mới dùng mục “Quan hệ mới…”. "
+            },
+            "imagery": {
+                "title": "Hình nền",
+                "intro": "Hình nền đằng sau bản đồ là tài nguyên quan trọng trong việc vẽ bản đồ. Hình nền có thể chụp từ vệ tinh, máy bay, và máy bay không người lái, hoặc quét từ sách bản đồ lịch sử, hoặc lấy từ cơ sở dữ liệu mở.",
+                "sources_h": "Nguồn Hình ảnh",
+                "choosing": "Để chọn nguồn hình ảnh để vẽ theo, bấm nút {layers} **Tùy chọn Hình nền** ở bên phải của bản đồ.",
+                "sources": "Theo mặc định, chương trình này hiển thị lớp hình trên không của [Bản đồ Bing](http://www.bing.com/maps/). Tùy theo vị trí đang xem, một số nguồn hình ảnh cũng có sẵn. Vì nhiều khi một trong số nguồn này có thể mới hoặc rõ hơn, bạn nên thử mọi nguồn hình ảnh trước khi sửa đổi.",
+                "offsets_h": "Điều chỉnh Độ lệch của Hình ảnh",
+                "offset": "Hình ảnh đôi khi bị chệch đối với dữ liệu bản đồ vì dịch vụ hình ảnh có lỗi. Nếu bạn nhận thấy nhiều con đường bị chệch đối với hình nền, bạn không nhất thiết phải di chuyển các đường này để trùng hợp với hình ảnh. Thay vì di chuyển các con đường, hãy chỉnh lại hình ảnh để phù hợp với dữ liệu tồn tại bằng cách mở rộng “Chỉnh độ lệch hình ảnh” ở cuối hộp Tùy chọn Hình nền.",
+                "offset_change": "Nhấn chuột vào các mũi tên nhỏ để điều chỉnh hình nền từng tí một, hoặc nhấn chuột trái vào khung màu xám và kéo tới lui cho đến khi hình ảnh phù hợp với các đối tượng."
+            },
+            "streetlevel": {
+                "title": "Hình ảnh Cấp phố",
+                "intro": "Hình ảnh cấp phố giúp bạn bổ sung bảng giao thông, kinh doanh, và nhiều chi tiết không nhìn được từ hình ảnh chụp từ không trung hoặc vệ tinh. Chương trình iD lấy hình ảnh cấp phố nguồn mở từ [Mapillary](https://www.mapillary.com) và [OpenStreetCam](https://www.openstreetcam.org).",
+                "using_h": "Sử dụng Hình ảnh Cấp phố",
+                "using": "Để sử dụng hình ảnh cấp phố trong việc vẽ bản đồ, bấm nút {data} **Dữ liệu Bản đồ** ở bên phải của bản đồ và bật các lớp dữ liệu có sẵn.",
+                "photos": "Khi lớp hình ảnh được kích hoạt, bản đồ hiển thị đường kẻ theo đường đi của các máy chụp hình. Nếu phóng to đủ mức, mỗi vị trí chụp hình được đánh dấu bằng hình tròn. Nếu phóng to hơn, một hình nón cho biết hương nhìn vào lúc chụp hình.",
+                "viewer": "Khi bạn nhấn chuột vào một vị trí hình, khung hình chụp xuất hiện ở góc dưới bên trái của bản đồ. Khung này có nút để bước tới lui trong chuỗi hình ảnh. Nó cũng cho biết tên người chụp hình, ngày giờ chụp hình, liên kết xem hình gốc tại trang dịch vụ hình ảnh cấp phố."
+            },
+            "gps": {
+                "title": "Tuyến GPS",
+                "intro": "Các tuyến GPS (Hệ thống định vị toàn cầu) là nguồn dữ liệu tin tưởng nhất trong dự án OpenStreetMap. Chương trình này hỗ trợ các tập tin *.gpx*, *.geojson*, và *.kml* trên máy của bạn. Bạn có thể thu tuyến GPS dùng điện thoại thông minh, đồng hồ thể thao, hoặc thiết bị GPS khác.",
+                "survey": "Để biết cách khảo sát dùng thiết bị GPS, xem “[Lập bản đồ dùng điện thoại thông minh, thiết bị GPS, hoặc tờ giấy](http://learnosm.org/en/mobile-mapping/)”.",
+                "using_h": "Sử dụng Tuyến GPS",
+                "using": "Để sử dụng một tuyến GPS trong việc vẽ bản đồ, kéo thả tập tin GPS vào chương trình vẽ bản đồ này. Nếu chương trình nhận ra tuyến đường, tuyến đường sẽ được tô màu hồng sẫm trên bản đồ. Bấm nút {data} **Dữ liệu Bản đồ** ở bên phải của bản đồ để bật, tắt, hoặc thu phóng vừa dữ liệu GPS do bạn thu thập.",
+                "tracing": "Tuyến đường GPX không được tải trực tiếp lên OpenStreetMap. Cách tốt nhất để sử dụng nó là vạch đường mới theo nó trên bản đồ.",
+                "upload": "Bạn cũng có thể [tải dữ liệu GPS của bạn lên OpenStreetMap](https://www.openstreetmap.org/trace/create) để cho người khác sử dụng."
+            }
         },
         "intro": {
             "done": "xong",
                 "nodes_ways": "Trong OpenStreetMap, các địa điểm đôi khi được gọi *nốt*, và các đường kẻ và vùng đôi khi được gọi *lối*.",
                 "click_townhall": "Nhấn chuột để chọn bất cứ đối tượng trên bản đồ. **Nhấn chuột vào địa điểm để chọn nó.**",
                 "selected_townhall": "Được rồi, địa điểm đã được chọn. Các đối tượng chớp chớp khi được chọn.",
-                "editor_townhall": "Khi nào đối tượng được chọn, *biểu mẫu* “Sửa đối tượng” xuất hiện ở thanh bên.",
-                "preset_townhall": "Cờ ngang ở trên biểu mẫu cho biết loại đối tượng. Địa điểm này là một {preset}.",
-                "fields_townhall": "Phần giữa của biểu mẫu có các *chi tiết* của đối tượng, chẳng hạn như tên và địa chỉ.",
-                "close_townhall": "**Bấm phím Esc hoặc bấm nút {button} ở góc phải bên trên để đóng biểu mẫu.**",
+                "editor_townhall": "Khi nào đối tượng được chọn, *trình kiểm tra* “Sửa đối tượng” xuất hiện ở thanh bên.",
+                "preset_townhall": "Cờ ngang ở đầu thanh bên cho biết loại đối tượng. Địa điểm này là một {preset}.",
+                "fields_townhall": "Phần giữa của trình kiểm tra có các *thuộc tính* của đối tượng, chẳng hạn tên và địa chỉ.",
+                "close_townhall": "**Bấm phím Esc hoặc bấm nút {button} ở góc phải bên trên để đóng trình kiểm tra.**",
                 "search_street": "Bạn có thể tìm kiếm các đối tượng theo tên trong khu vực đang xem hoặc toàn thế giới. **Tìm “{name}”.**",
                 "choose_street": "**Chọn {name} trong danh sách để chọn nó.**",
                 "selected_street": "Được rồi, {name} được chọn.",
-                "editor_street": "Các chi tiết của con đường khác với các chi tiết của tòa thị chính.{br}Khi con đường này được chọn, biểu mẫu chứa các chi tiết như “{field1}” và “{field2}”. **Bấm phím Esc hoặc bấm nút {button} để đóng biểu mẫu.**",
+                "editor_street": "Các thuộc tính của con đường khác với các thuộc tính của tòa thị chính.{br}Khi con đường này được chọn, trình kiểm tra chứa các thuộc tính như “{field1}” và “{field2}”. **Bấm phím Esc hoặc bấm nút {button} để đóng trình kiểm tra.**",
                 "play": "Thử di chuyển bản đồ và chọn những đối tượng khác để biết thêm về các loại đối tượng thường được đóng góp vào OpenStreetMap. **Khi nào sẵn sàng đi tiếp đến phần sau, bấm “{next}”.**"
             },
             "points": {
                 "place_point": "Để đặt địa điểm mới trên bản đồ, đưa con trỏ lên vị trí chính xác, rồi nhấn chuột trái hoặc bấm phím cách. **Đưa con trỏ lên tòa nhà này, rồi nhấn chuột trái hoặc bấm phím cách.**",
                 "search_cafe": "Có đủ thứ địa điểm. Bạn vừa đặt địa điểm ứng với một quán cà phê. **Tìm “{preset}”.**",
                 "choose_cafe": "**Chọn {preset} từ danh sách.**",
-                "feature_editor": "Địa điểm hiện là một quán cà phê. Bây giờ bạn có thể cung cấp thêm chi tiết về địa điểm này trong biểu mẫu.",
-                "add_name": "Trong OpenStreetMap, tất cả các trường văn bản là tùy chọn. Để trống trường nào mà bạn không biết rõ giá trị.{br}Hãy giả bộ quen với quán này và biết tên của nó. **Định rõ tên của quán cà phê.**",
-                "add_close": "Biểu mẫu sẽ tự động ghi nhớ các thay đổi của bạn. **Sau khi định rõ tên, bấm Esc, Enter, hoặc Return, hoặc bấm nút {button} để đóng biểu mẫu.**",
+                "feature_editor": "Địa điểm hiện là một quán cà phê. Bây giờ bạn có thể cung cấp thêm chi tiết về địa điểm này trong trình kiểm tra.",
+                "add_name": "Trong OpenStreetMap, tất cả các thuộc tính là tùy chọn. Để trống thuộc tính nào mà bạn không biết rõ giá trị.{br}Hãy giả bộ quen với quán này và biết tên của nó. **Định rõ tên của quán cà phê.**",
+                "add_close": "Trình kiểm tra sẽ tự động ghi nhớ các thay đổi của bạn. **Sau khi định rõ tên, bấm Esc, Enter, hoặc Return, hoặc bấm nút {button} để đóng trình kiểm tra.**",
                 "reselect": "Nhiều khi một địa điểm đã tồn tại nhưng không chính xác hoặc không tròn vẹn. Bạn có thể sửa đổi địa điểm đã tồn tại. **Nhấn chuột để chọn quán cà phê mà bạn vừa tạo ra.**",
                 "update": "Hãy bổ sung thêm chi tiết về quán này. Bạn có thể thay đổi tên của nó, định rõ nền ẩm thực, hoặc định rõ địa chỉ. **Thay đổi chi tiết của quán cà phê.**",
-                "update_close": "**Sau khi cập nhật quán cà phê xong, bấm Esc, Enter, hoặc Return, hoặc bấm nút {button} để đóng biểu mẫu.**",
+                "update_close": "**Sau khi cập nhật quán cà phê xong, bấm Esc, Enter, hoặc Return, hoặc bấm nút {button} để đóng trình kiểm tra.**",
                 "rightclick": "Nhấn chuột phải vào đối tượng để xem *trình đơn sửa đổi* có các tác vụ có thể áp dụng vào đối tượng. **Nhấn chuột phải để chọn điểm mà bạn vừa tạo ra và hiển thị trình đơn sửa đổi.**",
                 "delete": "Đôi khi cần xóa các đối tượng không tồn tại trên thực tế.{br}Khi xóa đối tượng khỏi OpenStreetMap, nó được loại bỏ khỏi bản đồ công cộng, nên bạn phải chắc chắn rằng nó không còn tồn tại trước khi xóa nó khỏi bản đồ. **Bấm nút {button} để xóa địa điểm này.**",
                 "undo": "Bạn có thể lúc nào hoàn tác thay đổi nào cho tới khi lưu các thay đổi vào OpenStreetMap. **Bấm nút {button} để hoàn tác vụ xóa để cho địa điểm trở lại.**",
             },
             "areas": {
                 "title": "Vùng",
-                "add_playground": "*Vùng* cho biết hình dạng của các đa giác như hồ nước, tòa nhà, và khu vực dân cư.{br}Bạn có thể cung cấp nhiều chi tiết hơn dùng vùng so với địa điểm. **Bấm nút {button} Vùng để bắt đầu vẽ vùng mới.**",
+                "add_playground": "Các vùng cho biết hình dạng của hồ nước, tòa nhà, và khu vực dân cư.{br}Bạn có thể cung cấp nhiều chi tiết hơn dùng vùng so với địa điểm. **Nhấn vào nút {button} Vùng để bắt đầu vẽ vùng mới.**",
                 "start_playground": "Hãy vẽ một vùng để thêm sân chơi này vào bản đồ. Để vẽ vùng, đặt các *nốt* theo đường biên của vùng. **Nhấn chuột hoặc bấm phím cách để đặt nốt đầu tiên vào một góc của sân chơi.**",
                 "continue_playground": "Để tiếp tục vẽ vùng này, đặt thêm nốt theo đường biên của sân chơi. Bạn có thể nối liền vùng với các đường dạo đã tồn tại.{br}Mẹo vặt: Bạn có thể giữ xuống phím “{alt}” để tránh việc nối liền nốt với các đối tượng khác. **Tiếp tục vẽ vùng ứng với sân chơi này.**",
                 "finish_playground": "Để hoàn tất vùng, bấm Enter hoặc Return, hoặc nhấn chuột lần nữa vào nốt đầu tiên hoặc cuối dùng. **Vẽ xong vùng ứng với sân chơi.**",
                 "search_playground": "**Tìm “{preset}”.**",
                 "choose_playground": "**Chọn {preset} từ danh sách.**",
-                "add_field": "Sân chơi này không có tên chính thức, nên bạn sẽ để trống trường Tên.{br}Thay thế, hãy bổ sung chi tiết về sân chơi trong trường Miêu tả. **Mở trình đơn “Thêm chi tiết”.**",
+                "add_field": "Sân chơi này không có tên chính thức, nên bạn sẽ để trống hộp Tên.{br}Thay thế, hãy bổ sung chi tiết về sân chơi trong hộp Miêu tả. **Mở trình đơn “Thêm thuộc tính”.**",
                 "choose_field": "**Chọn {field} từ danh sách.**",
-                "retry_add_field": "Bạn không chọn trường {field}. Hãy thử lại.",
-                "describe_playground": "**Thêm lời miêu tả rồi bấm nút {button} để đóng biểu mẫu.**",
+                "retry_add_field": "Bạn không chọn thuộc tính {field}. Hãy thử lại.",
+                "describe_playground": "**Thêm lời miêu tả rồi bấm nút {button} để đóng trình kiểm tra.**",
                 "play": "Tuyệt vời! Hãy thử vẽ vài vùng nữa và thử những loại vùng khác để thêm vào OpenStreetMap. **Khi nào sẵn sàng đi tiếp đến phần sau, bấm “{next}”.**"
             },
             "lines": {
                 "choose_category_road": "**Chọn {category} từ danh sách.**",
                 "choose_preset_residential": "Có nhiều kiểu con đường; kiểu phổ biến nhất là ngõ dân cư. **Chọn kiểu con đường là {preset}.**",
                 "retry_preset_residential": "Bạn không chọn kiểu {preset}. **Nhấn chuột vào đây để thử lần nữa.**",
-                "name_road": "**Đặt tên cho con đường rồi bấm Esc, Enter, hay Return, hoặc bấm nút {button} để đóng biểu mẫu.**",
+                "name_road": "**Đặt tên cho con đường rồi bấm Esc, Enter, hay Return, hoặc bấm nút {button} để đóng trình kiểm tra.**",
                 "did_name_road": "Được rồi, hãy tập thay đổi hình dạng đường kẻ.",
                 "update_line": "Đôi khi cần thay đổi hình dạng của một đường kẻ đã tồn tại. Đây có con đường không chính xác.",
                 "add_node": "Bạn có thể đặt thêm nốt vào đường kẻ này để làm cho nó chính xác hơn. Một cách đặt nốt là nhấn đúp vào đường kẻ tại vị trí muốn đặt nốt. **Nhấn đúp vào đường kẻ để đặt nốt mới.**",
                 "retry_building": "Hình như bạn vướng mắc khi đặt nốt vào các góc tòa nhà. Hãy thử lại.",
                 "choose_category_building": "**Chọn {category} từ danh sách.**",
                 "choose_preset_house": "Có nhiều kiểu tòa nhà; tòa nhà này rõ ràng là nhà ở.{br}Nếu bạn không chắc chắn nó là kiểu nào, bạn có thể chọn kiểu Tòa nhà bình thường không sao. **Chọn kiểu {preset}.**",
-                "close": "**Bấm Esc hoặc nút {button} để đóng biểu mẫu.**",
+                "close": "**Bấm Esc hoặc nút {button} để đóng trình kiểm tra.**",
                 "rightclick_building": "**Nhấn chuột phải để chọn tòa nhà vừa vẽ và hiển thị trình đơn sửa đổi.**",
                 "square_building": "Hãy làm căn nhà này đẹp đẽ hơn. **Bấm nút {button} để làm gọn các góc của tòa nhà.**",
                 "retry_square": "Bạn không bấm nút Làm Vuông góc. Hãy thử lại.",
                     "title": "Chọn đối tượng",
                     "select_one": "Chọn một đối tượng",
                     "select_multi": "Chọn nhiều đối tượng cùng lúc",
-                    "lasso": "Vẽ vùng chọn chung quanh các đối tượng"
+                    "lasso": "Vẽ vùng chọn chung quanh các đối tượng",
+                    "search": "Tìm kiếm đối tượng theo tên"
                 },
                 "with_selected": {
                     "title": "Trong khi đối tượng được chọn",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} foot",
+            "miles": "{quantity} dặm",
+            "square_feet": "{quantity} foot vuông",
+            "square_miles": "{quantity} dặm vuông",
+            "acres": "{quantity} mẫu Anh",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "B",
+            "south": "N",
+            "east": "Đ",
+            "west": "T",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "Nhãn hiệu"
                 },
+                "brewery": {
+                    "label": "Bia Tươi"
+                },
                 "bridge": {
                     "label": "Kiểu",
                     "placeholder": "Bình thường"
                     "label": "Sức chứa",
                     "placeholder": "50, 100, 200…"
                 },
-                "cardinal_direction": {
-                    "label": "Chiều",
-                    "options": {
-                        "E": "Đông",
-                        "ENE": "Đông Đông Bắc",
-                        "ESE": "Đông Đông Nam",
-                        "N": "Bắc",
-                        "NE": "Đông Bắc",
-                        "NNE": "Bắc Đông Bắc",
-                        "NNW": "Bắc Tây Bắc",
-                        "NW": "Tây Bắc",
-                        "S": "Nam",
-                        "SE": "Đông Nam",
-                        "SSE": "Nam Đông Nam",
-                        "SSW": "Nam Tây Nam",
-                        "SW": "Tây Nam",
-                        "W": "Tây",
-                        "WNW": "Tây Tây Bắc",
-                        "WSW": "Tây Tây Nam"
-                    }
-                },
                 "castle_type": {
                     "label": "Kiểu"
                 },
-                "clock_direction": {
-                    "label": "Chiều",
-                    "options": {
-                        "anticlockwise": "Ngược Chiều kim Đồng hồ",
-                        "clockwise": "Theo Chiều kim Đồng hồ"
-                    }
-                },
                 "clothes": {
                     "label": "Quần áo"
                 },
                 "diaper": {
                     "label": "Có Bàn Thay Tã"
                 },
+                "direction": {
+                    "label": "Hướng (Độ theo Chiều Kim Đồng hồ)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "Hướng",
+                    "options": {
+                        "E": "Đông",
+                        "ENE": "Đông Đông Bắc",
+                        "ESE": "Đông Đông Nam",
+                        "N": "Bắc",
+                        "NE": "Đông Bắc",
+                        "NNE": "Bắc Đông Bắc",
+                        "NNW": "Bắc Tây Bắc",
+                        "NW": "Tây Bắc",
+                        "S": "Nam",
+                        "SE": "Đông Nam",
+                        "SSE": "Nam Đông Nam",
+                        "SSW": "Nam Tây Nam",
+                        "SW": "Tây Nam",
+                        "W": "Tây",
+                        "WNW": "Tây Tây Bắc",
+                        "WSW": "Tây Tây Nam"
+                    }
+                },
+                "direction_clock": {
+                    "label": "Hướng",
+                    "options": {
+                        "anticlockwise": "Ngược Chiều kim Đồng hồ",
+                        "clockwise": "Theo Chiều kim Đồng hồ"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "Chiều",
+                    "options": {
+                        "backward": "Ngược",
+                        "both": "2 Chiều / Mọi Hướng",
+                        "forward": "Tiến"
+                    }
+                },
                 "display": {
                     "label": "Kiểu Hiển thị"
                 },
                 "memorial": {
                     "label": "Kiểu"
                 },
-                "milestone_position": {
-                    "label": "Vị trí theo Cột mốc",
-                    "placeholder": "Tầm xa đến một chữ số thập phân (123.4)"
+                "monitoring_multi": {
+                    "label": "Giám sát"
                 },
                 "mtb/scale": {
                     "label": "Độ hiểm trở Đạp xe Leo núi",
                 "oneway": {
                     "label": "Chiều",
                     "options": {
+                        "alternating": "Thay phiên",
                         "no": "2 Chiều",
+                        "reversible": "Có thể Đảo ngược",
                         "undefined": "2 Chiều theo Mặc định",
                         "yes": "1 Chiều"
                     }
                 "oneway_yes": {
                     "label": "Chiều",
                     "options": {
+                        "alternating": "Thay phiên",
                         "no": "2 Chiều",
+                        "reversible": "Có thể Đảo ngược",
                         "undefined": "1 Chiều theo Mặc định",
                         "yes": "1 Chiều"
                     }
                     "label": "Điểm chuẩn",
                     "placeholder": "3, 4, 5…"
                 },
-                "parallel_direction": {
-                    "label": "Hướng",
-                    "options": {
-                        "backward": "Ngược",
-                        "forward": "Thẳng"
-                    }
-                },
                 "park_ride": {
                     "label": "Trung chuyển"
                 },
                 "railway": {
                     "label": "Kiểu"
                 },
+                "railway/position": {
+                    "label": "Vị trí theo Cột mốc",
+                    "placeholder": "Tầm xa đến một chữ số thập phân (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "Chiều",
+                    "options": {
+                        "backward": "Ngược",
+                        "both": "2 Chiều / Mọi Hướng",
+                        "forward": "Tiến"
+                    }
+                },
                 "rating": {
                     "label": "Công suất"
                 },
                 "recycling_accepts": {
                     "label": "Nhận"
                 },
-                "recycling_type": {
-                    "label": "Kiểu Tái chế",
-                    "options": {
-                        "centre": "Nhà máy Tái chế",
-                        "container": "Thùng"
-                    }
-                },
                 "ref": {
                     "label": "Mã số Tham chiếu"
                 },
+                "ref/isil": {
+                    "label": "Mã Nhận dạng ISIL"
+                },
                 "ref_aeroway_gate": {
                     "label": "Số Cổng"
                 },
                 "traffic_signals": {
                     "label": "Kiểu"
                 },
+                "traffic_signals/direction": {
+                    "label": "Chiều",
+                    "options": {
+                        "backward": "Ngược",
+                        "both": "2 Chiều / Mọi Hướng",
+                        "forward": "Tiến"
+                    }
+                },
                 "trail_visibility": {
                     "label": "Tầm nhìn trên Đường mòn",
                     "options": {
                     "terms": "cáp kéo, cap keo"
                 },
                 "aerialway/station": {
-                    "name": "Trạm Cáp treo",
-                    "terms": "trạm cáp treo, trạm thang kéo, tram cap treo, tram thang keo"
+                    "name": "Trạm Cáp treo"
                 },
                 "aerialway/t-bar": {
                     "name": "T-bar",
                     "terms": "đổi tiền, chuyển đổi tiền tệ, nơi đổi tiền, quán đổi tiền, máy đổi tiền, trạm đổi tiền, doi tien, chuyen doi tien te, noi doi tien, quan doi tien, may doi tien, tram doi tien"
                 },
                 "amenity/bus_station": {
-                    "name": "Ga Xe buýt",
-                    "terms": "ga xe buýt, nhà ga xe buýt, nhà ga buýt, ga buýt, ga xe buyt, nha ga xe buyt, nha ga buyt, ga buyt"
+                    "name": "Ga Xe buýt"
                 },
                 "amenity/cafe": {
                     "name": "Quán Cà phê",
                     "terms": "cà phê, quán cà phê, trà, quán trà, ca phe, quan ca phe, tra, quan tra"
                 },
+                "amenity/car_pooling": {
+                    "name": "Chỗ Đón để Đi Cùng Xe",
+                    "terms": "chỗ đón để đi cùng xe, nơi đón để đi cùng xe, chia sẻ xe, chia sẻ chi phí dịch chuyển bằng xe hơi, chia sẻ chi phí dịch chuyển bằng ô tô, chia sẻ chi phí dịch chuyển bằng ô-tô, cho don de di cung xe, noi don de di cung xe, chia se xe, chia se chi phi dich chuyen bang xe hoi, chia se chi phi dich chuyen bang o to, chia se chi phi dich chuyen bang o-to"
+                },
                 "amenity/car_rental": {
                     "name": "Cho thuê Xe",
                     "terms": "dịch vụ cho thuê xe, chỗ thuê xe, tiệm thuê xe, thuê xe, dịch vụ cho mướn xe, chỗ mướn xe, tiệm mướn xe, mướn xe, dich vu cho thue xe, cho thue xe, tiem thue xe, thue xe, dich vu cho muon xe, cho muon xe, tiem muon xe, muon xe"
                     "terms": "nhà hàng ăn nhanh, quán ăn nhanh, tiệm ăn nhanh, cửa hàng ăn nhanh, food-to-go, food 2 go, nha hang an nhanh, quan an nhanh, tiem an nhanh, cua hang an nhanh"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "Bến Phà",
-                    "terms": "bến phà, nhà ga phà, ben pha, nha ga pha"
+                    "name": "Ga Phà"
                 },
                 "amenity/fire_station": {
                     "name": "Trạm Cứu hỏa",
                     "name": "Thư viện",
                     "terms": "thư viện, phòng đọc sách, thu vien, phong doc sach"
                 },
+                "amenity/love_hotel": {
+                    "name": "Khách sạn Tình yêu",
+                    "terms": "khách sạn tình yêu, khach san tinh yeu"
+                },
                 "amenity/marketplace": {
                     "name": "Chợ phiên",
                     "terms": "chợ phiên, chợ trời, chợ xổm, chợ, cho phien, cho troi, cho xom, cho"
                 },
                 "amenity/place_of_worship/muslim": {
                     "name": "Nhà thờ Hồi giáo",
-                    "terms": "hồi giáo, nhà thờ, hoi giao, nha tho"
+                    "terms": "nhà thờ hồi giáo, thánh đường hồi giáo, giáo đường hồi giáo, nha tho hoi giao, thanh duong hoi giao, giao duong hoi giao"
                 },
                 "amenity/place_of_worship/shinto": {
                     "name": "Đền thờ Thần đạo",
                     "terms": "trạm kiểm lâm, trạm lâm nghiệp, tram kiem lam, tram lam nghiep"
                 },
                 "amenity/recycling": {
-                    "name": "Tái chế",
-                    "terms": "tái chế, thu hồi, rác rưởi, rác thải, sọt rác, tai che, thu hoi, rac ruoi, rac thai, sot rac"
+                    "name": "Thùng Tái chế",
+                    "terms": "thùng tái chế, thùng thu hồi, thung tai che, thung thu hoi"
                 },
                 "amenity/recycling_centre": {
                     "name": "Nhà máy Tái chế",
                     "name": "Tắm đứng",
                     "terms": "phòng tắm đứng, buồng tắm đứng, khay tắm đứng, cabin tắm, phong tam dung, buong tam dung, khay tam dung, cabin tam"
                 },
+                "amenity/smoking_area": {
+                    "name": "Khu vực Hút thuốc",
+                    "terms": "khu vực hút thuốc, khu vực hút thuốc lá, phòng hút thuốc, phòng hút thuốc lá, khu vuc hut thuoc, khu vuc hut thuoc la, phong hut thuoc, phong hut thuoc la"
+                },
                 "amenity/social_facility": {
                     "name": "Dịch vụ Xã hội",
                     "terms": "dịch vụ xã hội, người vô gia cư, người khuyết tật, trẻ em, trung tâm điều trị nghiện ma túy, trung tâm điều trị nghiện rượu, dich vu xa hoi, nguoi vo gia cu, nguoi khuyet tat, tre em, trung tam dieu tri nghien ma tuy, trung tam dieu tri nghien ruou"
                     "name": "Hàng rào Cây",
                     "terms": "hàng rào cây, hàng cây, hang rao cay, hang cay"
                 },
+                "barrier/kerb": {
+                    "name": "Bờ đường",
+                    "terms": "bờ đường, bờ đường nâng cao, lề đường, bo duong, bo duong nang cao, le duong"
+                },
                 "barrier/kissing_gate": {
                     "name": "Cửa Hàng rào Chắn Trâu bò",
                     "terms": "cửa hàng rào chắn trâu bò, cua hang rao chan trau bo"
                     "name": "Chuồng",
                     "terms": "chuồng, chuồng trâu bò, chuồng ngựa, kho thóc, chuong, chuong trau bo, chuong ngua, kho thoc"
                 },
+                "building/boathouse": {
+                    "name": "Nhà thuyền",
+                    "terms": "nhà thuyền, nha thuyen"
+                },
+                "building/bungalow": {
+                    "name": "Boongalô",
+                    "terms": "boongalô, boong-ga-lô, boong ga lô, nhà nhỏ một tầng, boongalo, boong-ga-lo, boong ga lo, nha nho mot tang"
+                },
                 "building/bunker": {
                     "name": "Boong ke"
                 },
                     "name": "Nhà thờ",
                     "terms": "nhà thờ, ki-tô giáo, kitô giáo, thiên chúa giáo, đạo thiên chúa, công giáo, tin lành, giáo xứ, thánh đường, nha tho, ki-to giao, kito giao, thien chua giao, dao thien chua, cong giao, tin lanh, giao xu, thanh duong"
                 },
+                "building/civic": {
+                    "name": "Tòa nhà Tiện nghi Công cộng",
+                    "terms": "tòa nhà tiện nghi công cộng, toà nhà tiện nghi công cộng, trung tâm công cộng, toa nha tien nghi cong cong, trung tam cong cong"
+                },
                 "building/college": {
                     "name": "Tòa nhà Trường Cao đẳng",
                     "terms": "tòa nhà trường cao đẳng, toà nhà trường cao đẳng, toa nha truong cao dang"
                 "building/entrance": {
                     "name": "Cửa Ra vào"
                 },
+                "building/farm": {
+                    "name": "Nhà ở Nông trại",
+                    "terms": "nhà ở nông trại, căn nhà nông trại, nha o nong trai, can nha nong trai"
+                },
                 "building/garage": {
                     "name": "Ga ra",
                     "terms": "ga ra, ga-ra"
                     "name": "Nhà trẻ",
                     "terms": "nhà trẻ, nhà giữ trẻ, trường mẫu giáo, trường mầm non, nha tre, nha giu tre, truong mau giao, truong mam non"
                 },
+                "building/mosque": {
+                    "name": "Nhà thờ Hồi giáo",
+                    "terms": "nhà thờ hồi giáo, thánh đường hồi giáo, giáo đường hồi giáo, nha tho hoi giao, thanh duong hoi giao, giao duong hoi giao"
+                },
                 "building/public": {
                     "name": "Tòa nhà Công cộng",
                     "terms": "tòa nhà công cộng, toà nhà công cộng"
                     "name": "Mái Che",
                     "terms": "mái che, mái, mái nhà, nóc, mai che, mai, mai nha, noc"
                 },
+                "building/ruins": {
+                    "name": "Tàn tích Tòa nhà",
+                    "terms": "tàn tích tòa nhà, tàn tích toà nhà, tan tich toa nha"
+                },
                 "building/school": {
                     "name": "Nhà Trường",
                     "terms": "nhà trường, trường học, học viện, trường sở, nha truong, truong học, hoc vien, truong so"
                     "name": "Nhà Bán tách biệt",
                     "terms": "nhà bán tách biệt, nhà bán biệt lập, nha ban tach biet, nha ban biet lap"
                 },
+                "building/service": {
+                    "name": "Nhà Máy móc",
+                    "terms": "nhà máy móc, nha may moc"
+                },
                 "building/shed": {
                     "name": "Lán",
                     "terms": "lán, lán trại, lều lán, túp lều, chuồng, lan, lan trai, leu lan, tup leu, chuong"
                     "name": "Chuồng Ngựa",
                     "terms": "chuồng ngựa, chuong ngua"
                 },
+                "building/stadium": {
+                    "name": "Kiến trúc Sân vận động",
+                    "terms": "kiến trúc sân vận động, tòa nhà sân vận động, toà nhà sân vận động, kiến trúc svđ, tòa nhà svđ, toà nhà svđ, kien truc san van dong, toa nha san van dong, kien truc svd, toa nha svd"
+                },
                 "building/static_caravan": {
                     "name": "Nhà Lưu động để Một Chỗ",
                     "terms": "nhà lưu động để một chỗ, nhà di động để một chỗ, nha luu dong de mot cho, nha di dong de mot cho"
                 },
+                "building/temple": {
+                    "name": "Kiến trúc Đền thờ",
+                    "terms": "kiến trúc đền thờ, kiến trúc chùa, kiến trúc đạo quán, kiến trúc chùa chiền, kiến trúc cung quán, kien truc den tho, kien truc chua, kien truc dao quan, kien truc chua chien, kien truc cung quan"
+                },
                 "building/terrace": {
                     "name": "Dãy Nhà",
                     "terms": "dãy nhà, day nha"
                 "building/train_station": {
                     "name": "Nhà ga"
                 },
+                "building/transportation": {
+                    "name": "Tòa nhà Phương tiện Công cộng",
+                    "terms": "tòa nhà phương tiện công cộng, toà nhà phương tiện công cộng, tòa nhà ptcc, toà nhà ptcc, kiến trúc phương tiện công cộng, kiến trúc ptcc, toa nha phuong tien cong cong, toa nha ptcc, kien truc phuong tien cong cong, kien truc ptcc"
+                },
                 "building/university": {
                     "name": "Tòa nhà Đại học",
                     "terms": "tòa nhà đại học, toà nhà đại học, tòa nhà trường đại học, toà nhà trường đại học, toa nha dai hoc, toa nha truong dai hoc"
                     "name": "Lều Cắm trại",
                     "terms": "lều, lều cắm trại, leu, leu cam trai"
                 },
+                "circular": {
+                    "name": "Bùng binh Cổ điển"
+                },
                 "club": {
                     "name": "Câu lạc bộ",
                     "terms": "câu lạc bộ, clb, club, cau lac bo"
                 "emergency/private": {
                     "name": "Chỉ Dịch vụ Khẩn cấp được Chủ Cho phép"
                 },
+                "emergency/water_tank": {
+                    "name": "Bể nước Cứu hỏa",
+                    "terms": "bể nước cứu hỏa, thùng nước cứu hỏa, bể nước cứu hoả, thùng nước cứu hoả, bể nước chữa cháy, thùng nước chữa cháy, be nuoc cuu hoa, thung nuoc cuu hoa, be nuoc chua chay, thung nuoc chua chay"
+                },
                 "emergency/yes": {
                     "name": "Dành cho Dịch vụ Khẩn cấp"
                 },
                 },
                 "healthcare": {
                     "name": "Trung tâm Y tế",
-                    "terms": "trung tâm y tế, trạm y tế, bác sĩ, thầy thuốc, bệnh viện, khỏe mạnh, khoẻ mạnh, trung tam y te, tram y te, bac si, thay thuoc, benh vien, khoe manh"
+                    "terms": "trung tâm y tế, trạm y tế, bác sĩ, bác sỹ, thầy thuốc, bệnh viện, khỏe mạnh, khoẻ mạnh, trung tam y te, tram y te, bac si, bac sy, thay thuoc, benh vien, khoe manh"
                 },
                 "healthcare/alternative": {
                     "name": "Y học Thay thế",
                 },
                 "healthcare/optometrist": {
                     "name": "Đo mắt",
-                    "terms": "người đo mắt, nhân viên đo thị lực, nhà nhãn khoa, bác sĩ nhãn khoa, nguoi do mat, nhan vien do thi luc, nha nhan khoa, bac si nhan khoa"
+                    "terms": "người đo mắt, nhân viên đo thị lực, nhà nhãn khoa, bác sĩ nhãn khoa, bác sỹ nhãn khoa, nguoi do mat, nhan vien do thi luc, nha nhan khoa, bac si nhan khoa, bac sy nhan khoa"
                 },
                 "healthcare/physiotherapist": {
                     "name": "Vật lý Trị liệu",
                 },
                 "healthcare/podiatrist": {
                     "name": "Chữa Chân",
-                    "terms": "bác sĩ chữa chân, bac si chua chan"
+                    "terms": "bác sĩ chữa chân, bác sỹ chữa chân, thầy thuốc chữa chân, bac si chua chan, bac sy chua chan, thay thuoc chua chan"
                 },
                 "healthcare/psychotherapist": {
                     "name": "Tâm lý Trị liệu",
                     "name": "Đường mòn Ngựa",
                     "terms": "đường mòn ngựa, đường cưỡi ngựa, đường đi ngựa, duong mon ngua, duong cuoi ngua, duong di ngua"
                 },
+                "highway/bus_guideway": {
+                    "name": "Đường dẫn Xe buýt",
+                    "terms": "đường dẫn xe buýt, duong dan xe buyt"
+                },
                 "highway/bus_stop": {
-                    "name": "Trạm Xe buýt",
-                    "terms": "trạm xe buýt, trạm xe bus, tram xe buyt, tram xe bus"
+                    "name": "Trạm/Bến Xe buýt"
                 },
                 "highway/corridor": {
                     "name": "Hành lang trong Nhà",
                     "terms": "rừng trồng cây, rừng lâm nghiệp, lâm học, rung trong cay, rung lam nghiep, lam hoc"
                 },
                 "landuse/garages": {
-                    "name": "Ga ra",
-                    "terms": "ga ra, ga-ra, dãy ga ra, dãy ga-ra, dãy nhà để xe, day ga ra, day ga-ra, day nha de xe"
+                    "name": "Đất Ga ra",
+                    "terms": "đất ga ra, đất ga-ra, đất nhà để xe, dat ga ra, dat ga-ra, dat nha de xe"
                 },
                 "landuse/grass": {
                     "name": "Cỏ",
                     "name": "Đất Chưa Khai khẩn",
                     "terms": "đất chưa khai khẩn, đất không khai khẩn, đất chưa phát triển, đất không phát triển, dat chua khai khan, dat khong khai khan, dat chua phat trien, dat khong phat trien"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "Đất Nhà kính",
+                    "terms": "đất nhà kính, đất nhà kiếng, nhà trồng rau, nhà trồng hoa, dat nha kinh, dat nha kieng, nha trong rau, nha trong hoa"
+                },
                 "landuse/harbour": {
                     "name": "Cảng",
                     "terms": "cảng, bến tàu, cang, ben tau"
                     "name": "Trạm Thể dục",
                     "terms": "trạm thể dục, trạm thể hình, tram the duc, tram the hinh"
                 },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "Cầu thăng Bằng Thể dục",
+                    "terms": "cầu thăng bằng, đòn cân bằng, đòn cân, cau thang bang, don can bang, don can"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "Hộp Nhảy",
+                    "terms": "hộp nhảy, hop nhay"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "Xà Đơn Thể dục",
+                    "terms": "xà đơn, xà cao, ba-rơ-phích, xa don, xa cao, ba-ro-phich"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "name": "Khung Leo trèo Thể dục",
+                    "terms": "khung leo trèo, khung leo treo"
+                },
+                "leisure/fitness_station/hyperextension": {
+                    "name": "Ghế Dốc",
+                    "terms": "ghế dốc, ghe hyperextension, ghe doc, ghe hyperextension"
+                },
+                "leisure/fitness_station/parallel_bars": {
+                    "name": "Xà Kép",
+                    "terms": "xà kép, xa kep"
+                },
+                "leisure/fitness_station/push-up": {
+                    "name": "Ghế Hít đất",
+                    "terms": "ghế hít đất, ghế chống đẩy, ghe hit dat, ghe chong day"
+                },
+                "leisure/fitness_station/rings": {
+                    "name": "Vòng treo Thể dục",
+                    "terms": "vòng treo thể dục, vong treo the duc"
+                },
+                "leisure/fitness_station/sign": {
+                    "name": "Bảng Hướng dẫn Thể dục",
+                    "terms": "bảng hướng dẫn tập thể dục, biển hướng dẫn tập thể dục, bang huong dan tap the duc, bien huong dan tap the duc"
+                },
+                "leisure/fitness_station/sit-up": {
+                    "name": "Ghế Ngồi lên",
+                    "terms": "ghế ngồi lên, ghe ngoi len"
+                },
+                "leisure/fitness_station/stairs": {
+                    "name": "Cầu thang Thể dục",
+                    "terms": "cầu thang thể dục, cau thang the duc"
+                },
                 "leisure/garden": {
                     "name": "Vườn",
                     "terms": "vườn, làm vườn, vuon, lam vuon"
                     "name": "Sân Bóng chuyền Bãi biển",
                     "terms": "sân bóng chuyền bãi biển, san bong chuyen bai bien"
                 },
+                "leisure/pitch/boules": {
+                    "name": "Sân Bi sắt",
+                    "terms": "sân bi sắt, san bi sat"
+                },
                 "leisure/pitch/bowls": {
                     "name": "Sân cỏ Bowling",
                     "terms": "sân cỏ bowling, sân cỏ bóng gỗ, san co bowling, san co bong go"
                     "name": "Cột Ăngten",
                     "terms": "cột ăngten, cột ăng-ten, cột ăng ten, cột anten, cột an-ten, cột radio, cột rađiô, cột ra-đi-ô, cột vô tuyến, tháp radio, tháp rađiô, tháp ra-đi-ô, tháp vô tuyến, anten radio, anten rađiô, an-ten ra-đi-ô, cột tv, cột tivi, tháp tv, tháp tivi, anten tv, anten tivi, cot angten, cot ang-ten, cot ang ten, cot anten, cot an-ten, cot radio, cot ra-di-o, cot vo tuyen, thap radio, thap ra-di-o, thap vo tuyen, anten radio, anten ra-di-o, cot tv, cot vivi, thap tv, thap tivi, anten tv, anten tivi"
                 },
+                "man_made/monitoring_station": {
+                    "name": "Trạm Giám sát",
+                    "terms": "trạm giám sát, trạm giám sát môi trường, trạm giám sát chất lượng không khí, trạm giám sát chất lượng nước, trạm giám sát ô nhiễm, trạm thời tiết, trạm đo thời tiết, trạm khí tượng học, trạm thủy văn, trạm thuỷ văn, tram giam sat, tram giam sat moi truong, tram giam sat chat luong khong khi, tram giam sat chat luong nuoc, tram giam sat o nhiem, tram thoi tiet, tram do thoi tiet, tram khi tuong hoc, tram thuy van"
+                },
                 "man_made/observation": {
                     "name": "Tháp Quan sát",
                     "terms": "tháp quan sát, trạm quan sát, tầng quan sát, thap quan sat, tram quan sat, tang quan sat"
                     "terms": "tư vấn kế toán, kế toán viên, văn phòng kế toán, nhân viên kế toán, dịch vụ khai thuế, văn phòng khai thuế, tài chính, tài chánh, tu van ke toan, ke toan vien, van phong ke toan, nhan vien ke toan, dich vu khai thue, van phong khai thue, tai chinh, tai chanh"
                 },
                 "office/administrative": {
-                    "name": "Cơ quan Địa phương",
-                    "terms": "cơ quan địa phương, hội đồng địa phương, công sở địa phương, sở hành chính địa phương, co quan dia phuong, hoi dong dia phuong, cong so dia phuong, so hanh chinh dia phuong"
+                    "name": "Cơ quan Địa phương"
                 },
                 "office/adoption_agency": {
                     "name": "Cơ quan Nhận Con nuoi",
                     "name": "Cơ quan Giới thiệu Việc làm",
                     "terms": "cơ quan giới thiệu việc làm, cơ quan việc làm, văn phòng giới thiệu việc làm, co quan gioi thieu viec lam, co quan viec lam, van phong gioi thieu viec lam"
                 },
+                "office/energy_supplier": {
+                    "name": "Văn phòng Công ty Điện lực",
+                    "terms": "văn phòng công ty điện lực, văn phòng công ti điện lực, văn phòng nhà cung cấp điện lực, văn phòng công ty năng lượng, văn phòng công ti năng lượng, văn phòng nhà cung cấp năng lượng, van phong cong ty dien luc, van phong cong ti dien luc, van phong nha cung cap dien luc, van phong cong ty nang luong, van phong cong ti nang luong, van phong nha cung cap nang luong"
+                },
                 "office/estate_agent": {
                     "name": "Văn phòng Bất động sản",
                     "terms": "văn phòng bất động sản, địa ốc viên, chuyên viên địa ốc, chuyên viên bất động sản, van phong bat dong san, dia oc vien, chuyen vien dia oc, chuyen vien bat dong san"
                     "name": "Văn phòng Lâm nghiệp",
                     "terms": "văn phòng lâm nghiệp, van phong lam nghiep"
                 },
+                "office/foundation": {
+                    "name": "Quỹ Từ thiện",
+                    "terms": "văn phòng quỹ từ thiện, văn phòng quĩ từ thiện, trụ sở quỹ từ thiện, trụ sở quĩ từ thiện, van phong quy tu thien, van phong qui tu thien, tru so quy tu thien, tru so qui tu thien"
+                },
                 "office/government": {
                     "name": "Công sở",
                     "terms": "công sở, cơ quan chính phủ, cơ quan chính quyền, cong so, co quan chinh phu, co quan chinh quyen"
                     "name": "Sở Thuế vụ",
                     "terms": "sở thuế vụ, văn phòng thuế vụ, văn phòng khai thuế, so thue vu, van phong thue vu, van phong khai thue"
                 },
+                "office/guide": {
+                    "name": "Văn phòng Hướng dẫn Du lịch",
+                    "terms": "văn phòng hướng dẫn du lịch, hướng dẫn viên du lịch, hướng dẫn viên leo núi, hướng dẫn viên lặn biển, van phong huong dan du lich, huong dan vien du lich, huong dan vien leo nui, huong dan vien lan bien"
+                },
                 "office/insurance": {
                     "name": "Văn phòng Bảo hiểm",
                     "terms": "văn phòng bảo hiểm, van phong bao hiem"
                     "terms": "văn phòng luật sư, van phong luat su"
                 },
                 "office/lawyer/notary": {
-                    "name": "Văn phòng Công chứng",
-                    "terms": "văn phòng công chứng, công chứng viên, di chúc, chứng thư, van phong cong chung, cong chung vien, di chuc, chung thu"
+                    "name": "Văn phòng Công chứng"
+                },
+                "office/moving_company": {
+                    "name": "Văn phòng Công ty Chuyển nhà",
+                    "terms": "văn phòng công ty chuyển nhà, văn phòng công ti chuyển nhà, văn phòng công ty dọn nhà, văn phòng công ti dọn nhà, văn phòng dịch vụ chuyển nhà, văn phòng dịch vụ dọn nhà, van phong cong ty chuyen nha, van phong cong ti chuyen nha, van phong cong ty don nha, van phong cong ti don nha, van phong dich vu chuyen nha, van phong dich vu don nha"
                 },
                 "office/newspaper": {
                     "name": "Văn phòng Tờ báo",
                     "name": "Văn phòng Thám tử Tư",
                     "terms": "văn phòng thám tử tư, van phong tham tu tu"
                 },
+                "office/quango": {
+                    "name": "Tổ chức Bán độc lập Phi chính phủ",
+                    "terms": "văn phòng tổ chức bán độc lập phi chính phủ, văn phòng tổ chức bán phi chính phủ, văn phòng tổ chức phi chính phủ gần như tự quản, van phong to chuc ban doc lap phi chinh phu, van phong to chuc ban phi chinh phu, van phong to chuc phi chinh phu gan nhu tu quan"
+                },
                 "office/research": {
                     "name": "Văn phòng Nghiên cứu",
                     "terms": "văn phòng nghiên cứu, van phong nghien cuu"
                     "name": "Văn phòng Khảo sát",
                     "terms": "văn phòng khảo sát, văn phòng kiểm sát, văn phòng thanh tra, van phong khao sat, van phong kiem sat, van phong thanh tra"
                 },
+                "office/tax_advisor": {
+                    "name": "Dich vụ Khai thuế",
+                    "terms": "văn phòng dịch vụ khai thuế, văn phòng cố vấn thuế vụ, van phong dich vu khai thue, van phong co van thue vu"
+                },
                 "office/telecommunication": {
                     "name": "Văn phòng Viễn thông",
                     "terms": "văn phòng viễn thông, tiệm viễn thông, cửa hàng viễn thông, trụ sở công ty viễn thông, trụ sở công ti viễn thông, trụ sở cty viễn thông, van phong vien thong, tiem vien thong, cua hang vien thong, tru so cong ty vien thong, tru so cong ti vien thong, tru so cty vien thong"
                 },
+                "office/therapist": {
+                    "name": "Văn phòng Trị liệu",
+                    "terms": "văn phòng trị liệu, nhà trị liệu, bác sĩ chuyên khoa, bác sỹ chuyên khoa, thầy thuốc chuyên khoa, van phong tri lieu, nha tri lieu, bac si chuyen khoa, bac sy chuyen khoa, thay thuoc chuyen khoa"
+                },
                 "office/travel_agent": {
                     "name": "Văn phòng Du lịch"
                 },
+                "office/water_utility": {
+                    "name": "Văn phòng Nhà cung cấp Nước uống",
+                    "terms": "văn phòng nhà cung cấp nước uống, văn phòng hãng cung cấp nước uống, văn phòng hội đồng thủy cục, văn phòng hội đồng thuỷ cục, van phong nha cung cap nuoc uong, van phong hang cung cap nuoc uong, van phong hoi dong thuy cuc"
+                },
                 "piste": {
                     "name": "Đường Trượt tuyết",
                     "terms": "đường trượt tuyết, đường mòn trượt tuyết, duong truot tuyet, duong mon truot tuyet"
                     "name": "Làng",
                     "terms": "làng, thôn, ấp, lang, thon, ap"
                 },
+                "playground/balance_beam": {
+                    "name": "Trò chơi Cầu thăng Bằng",
+                    "terms": "cầu thăng bằng, đòn cân bằng, đòn cân, cau thang bang, don can bang, don can"
+                },
                 "playground/basket_spinner": {
                     "name": "Rổ Quay",
                     "terms": "rổ quay, ro quay"
                     "name": "Đệm Hơi",
                     "terms": "đệm hơi, nệm hơi, dem hoi, nem hoi"
                 },
+                "playground/horizontal_bar": {
+                    "name": "Trò chơi Xà Đơn",
+                    "terms": "xà đơn, xà cao, ba-rơ-phích, xa don, xa cao, ba-ro-phich"
+                },
                 "playground/rocker": {
                     "name": "Thú Nhún Lò xo",
                     "terms": "thú nhún lò xo, thú nhún, thu nhun lo xo, thu nhun"
                     "name": "Máy biến áp",
                     "terms": "máy biến áp, may bien ap"
                 },
+                "public_transport/linear_platform": {
+                    "name": "Trạm/Bến Phương tiện Công cộng",
+                    "terms": "trạm, bến, ke, ke ga, phương tiện công cộng, ptcc, giao thông công cộng, gtcc, tram, ben, phuong tien cong cong, giao thong cong cong"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "Trạm/Bến Cáp treo",
+                    "terms": "trạm cáp treo, trạm thang kéo, bến cáp treo, bến thang kéo, tram cap treo, tram thang keo, ben cap treo, ben thang keo"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "Trạm/Bến Xe buýt",
+                    "terms": "trạm xe buýt, trạm xe bus, bến xe buýt, bến xe bus, ke buýt, ke bus, tram xe buyt, tram xe bus, ben xe buyt, ben xe bus, ke buyt"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "Bến Phà",
+                    "terms": "bến phà, ke phà, ben pha, ke pha"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "Trạm/Bến Đường sắt Nhẹ",
+                    "terms": "trạm đường sắt nhẹ, trạm đường ray nhẹ, trạm tàu điện, bến đường sắt nhẹ, bến đường ray nhẹ, bến tàu điện, ke đường sắt nhẹ, ke đường ray nhẹ, ke tàu điện, tram duong sat nhe, tram duong ray nhe, tram tau dien, ben duong sat nhe, ben duong ray nhe, ben tau dien, ke duong sat nhe, ke duong ray nhe, ke tau dien"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "Trạm/Bến Tàu một ray",
+                    "terms": "trạm tàu một ray, trạm monorail, bến tàu một ray, bến monorail, ke tàu một ray, ke monorail, tram tau mot ray, tram monorail, ben tau mot ray, ben monorail, ke tau mot ray"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "Trạm/Bến Tàu điện ngầm",
+                    "terms": "trạm tàu điện ngầm, bến tàu điện ngầm, tram tau dien ngam, ben tau dien ngam"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "Trạm/Bến Xe lửa",
+                    "terms": "trạm xe lửa, trạm tàu hỏa, trạm tau hoả, bến xe lửa, bến tàu hỏa, bến tàu hoả, tram xe lua, tram tau hoa, ben xe lua, ben tau hoa"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "Trạm/Bến Tàu điện",
+                    "terms": "trạm tàu điện, trạm xe điện, bến tàu điện, bến xe điện, ke tàu điện, ke xe điện, tram tau dien, tram xe dien, ben tau dien, ben xe dien, ke tau dien, ke xe dien"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "Trạm/Bến Xe điện Bánh hơi",
+                    "terms": "trạm xe điện bánh hơi, trạm xe buýt điện, trạm xe bus điện, bến xe điện bánh hơi, bến xe buýt điện, bến xe bus điện, ke xe điện bánh hơi, ke xe buýt điện, ke xe bus điện, tram xe dien banh hoi, tram xe buyt dien, tram xe bus dien, ben xe dien banh hoi, ben xe buyt dien, ben xe bus dien, ke xe dien banh hoi, ke xe buyt dien, ke xe bus dien"
+                },
                 "public_transport/platform": {
-                    "name": "Bến",
-                    "terms": "bến, ke, ke ga, ben"
+                    "name": "Trạm/Bến Phương tiện Công cộng",
+                    "terms": "trạm, bến, ke, ke ga, phương tiện công cộng, ptcc, giao thông công cộng, gtcc, tram, ben, phuong tien cong cong, giao thong cong cong"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "Trạm/Bến Cáp treo",
+                    "terms": "trạm cáp treo, trạm thang kéo, bến cáp treo, bến thang kéo, tram cap treo, tram thang keo, ben cap treo, ben thang keo"
+                },
+                "public_transport/platform_bus": {
+                    "name": "Trạm/Bến Xe buýt",
+                    "terms": "trạm xe buýt, trạm xe bus, bến xe buýt, bến xe bus, ke buýt, ke bus, tram xe buyt, tram xe bus, ben xe buyt, ben xe bus, ke buyt"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "Bến Phà",
+                    "terms": "bến phà, ke phà, ben pha, ke pha"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "Trạm/Bến Đường sắt Nhẹ",
+                    "terms": "trạm đường sắt nhẹ, trạm đường ray nhẹ, trạm tàu điện, bến đường sắt nhẹ, bến đường ray nhẹ, bến tàu điện, ke đường sắt nhẹ, ke đường ray nhẹ, ke tàu điện, tram duong sat nhe, tram duong ray nhe, tram tau dien, ben duong sat nhe, ben duong ray nhe, ben tau dien, ke duong sat nhe, ke duong ray nhe, ke tau dien"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "Trạm/Bến Tàu một ray",
+                    "terms": "trạm tàu một ray, trạm monorail, bến tàu một ray, bến monorail, ke tàu một ray, ke monorail, tram tau mot ray, tram monorail, ben tau mot ray, ben monorail, ke tau mot ray"
+                },
+                "public_transport/platform_subway": {
+                    "name": "Trạm/Bến Tàu điện ngầm",
+                    "terms": "trạm tàu điện ngầm, bến tàu điện ngầm, tram tau dien ngam, ben tau dien ngam"
+                },
+                "public_transport/platform_train": {
+                    "name": "Trạm/Bến Xe lửa",
+                    "terms": "trạm xe lửa, trạm tàu hỏa, trạm tau hoả, bến xe lửa, bến tàu hỏa, bến tàu hoả, tram xe lua, tram tau hoa, ben xe lua, ben tau hoa"
+                },
+                "public_transport/platform_tram": {
+                    "name": "Trạm/Bến Tàu điện",
+                    "terms": "trạm tàu điện, trạm xe điện, bến tàu điện, bến xe điện, ke tàu điện, ke xe điện, tram tau dien, tram xe dien, ben tau dien, ben xe dien, ke tau dien, ke xe dien"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "Trạm/Bến Xe điện Bánh hơi",
+                    "terms": "trạm xe điện bánh hơi, trạm xe buýt điện, trạm xe bus điện, bến xe điện bánh hơi, bến xe buýt điện, bến xe bus điện, ke xe điện bánh hơi, ke xe buýt điện, ke xe bus điện, tram xe dien banh hoi, tram xe buyt dien, tram xe bus dien, ben xe dien banh hoi, ben xe buyt dien, ben xe bus dien, ke xe dien banh hoi, ke xe buyt dien, ke xe bus dien"
+                },
+                "public_transport/station": {
+                    "name": "Nhà ga Phương tiện Công cộng",
+                    "terms": "nhà ga phương tiện công cộng, nhà ga ptcc, nhà ga giao thông công cộng, nhà ga gtcc, nha ga phuong tien cong cong, nha ga ptcc, nha ga giao thong cong cong, nha ga gtcc"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "Trạm Cáp treo",
+                    "terms": "trạm cáp treo, trạm thang kéo, trạm cáp treo, trạm thang kéo"
+                },
+                "public_transport/station_bus": {
+                    "name": "Ga Xe buýt",
+                    "terms": "nhà ga xe buýt, nhà ga xe bus, nhà ga buýt, nha ga xe buyt, nha ga xe bus, nha ga buyt"
+                },
+                "public_transport/station_ferry": {
+                    "name": "Ga Phà",
+                    "terms": "bến phà, nhà ga phà, ben pha, nha ga pha"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "Ga Đường sắt Nhẹ",
+                    "terms": "nhà ga đường sắt nhẹ, nhà ga đường ray nhẹ, nhà ga tàu điện, nha ga duong sat nhe, nha ga duong ray nhe, nha ga tau dien"
+                },
+                "public_transport/station_monorail": {
+                    "name": "Ga Tàu một ray",
+                    "terms": "nhà ga tàu một ray, nhà ga monorail, nha ga tau mot ray, nha ga monorail"
+                },
+                "public_transport/station_subway": {
+                    "name": "Ga Tàu điện ngầm",
+                    "terms": "nhà ga tàu điện ngầm, nha ga tau dien ngam"
+                },
+                "public_transport/station_train": {
+                    "name": "Nhà ga",
+                    "terms": "nhà ga, nhà ga xe lửa, nha ga, nha ga xe lua"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "Gà xép",
+                    "terms": "ga xép, nhà ga xép, ga xep, nha ga xep"
+                },
+                "public_transport/station_tram": {
+                    "name": "Gà Tàu điện",
+                    "terms": "nhà ga tàu điện, nhà ga xe điện, nha ga tau dien, nha ga xe dien"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "Gà Xe điện Bánh hơi",
+                    "terms": "nhà ga xe điện bánh hơi, nhà ga xe buýt điện, nhà ga xe bus điện, nha ga xe dien banh hoi, nha ga xe buyt dien, nha ga xe bus dien"
+                },
+                "public_transport/stop_area": {
+                    "name": "Khu vực Đón khách Phương tiện Công cộng",
+                    "terms": "khu vực đón khách phương tiện công cộng, khu vực đón khách ptcc, khu vực đón khách giao thông công cộng, khu vực đón khách gtcc, khu vuc don khach phuong tien cong cong, khu vuc don khach ptcc, khu vuc don khach giao thong cong cong, khu vuc don khach gtcc"
                 },
                 "public_transport/stop_position": {
-                    "name": "Chỗ Dừng lại",
-                    "terms": "chỗ dừng lại, nơi dừng lại, bến xép, bến xe xép, cho dung lai, noi dung lai, ben xep, ben xe xep"
+                    "name": "Nơi Đón khách Phương tiện Công cộng",
+                    "terms": "nơi đón khách phương tiện công cộng, nơi đón khách ptcc, nơi đón khách giao thông công cộng, nơi đón khách gtcc, nơi dừng lại, chỗ đón khách phương tiện công cộng, chỗ đón khách ptcc, chỗ đón khách giao thông công cộng, chỗ đón khách gtcc, chỗ dừng lại, noi don khach phuong tien cong cong, noi don khach ptcc, noi don khach giao thong cong cong, noi don khach gtcc, noi dung lai, cho don khach phuong tien cong cong, cho don khach ptcc, cho don khach giao thong cong cong, cho don khach gtcc, cho dung lai"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "Nơi Đón khách Cáp treo",
+                    "terms": "nơi đón khách cáp treo, nơi đón khách thang kéo, chỗ đón khách cáp treo, chỗ đón khách thang kéo, noi don khach cap treo, noi don khach thang keo, cho don khach cap treo, cho don khach thang keo"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "Nơi Đón khách Xe buýt",
+                    "terms": "nơi đón khách xe buýt, nơi đón khách xe bus, chỗ đón khách xe buýt, chỗ đón khách xe bus, noi don khach xe buyt, noi don khach xe bus, cho don khach xe buyt, cho don khach xe bus"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "Nơi Đón khách Phà",
+                    "terms": "nơi đón khách phà, chỗ đón khách phà, noi don khach pha, cho don khach pha"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "Nơi Đón khách Đường sắt Nhẹ",
+                    "terms": "nơi đón khách đường sắt nhẹ, nơi đón khách đường ray nhẹ, nơi đón khách tàu điện, chỗ đón khách đường sắt nhẹ, chỗ đón khách đường ray nhẹ, chỗ đón khách tàu điện, noi don khach duong sat nhe, noi don khach duong ray nhe, noi don khach tau dien, cho don khach duong sat nhe, cho don khach duong ray nhe, cho don khach tau dien"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "Nơi Đón khách Tàu một ray",
+                    "terms": "nơi đón khách tàu một ray, nơi đón khách monorail, chỗ đón khách tàu một ray, chỗ đón khách monorail, noi don khach tau mot ray, noi don khach monorail, cho don khach tau mot ray, cho don khach monorail"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "Nơi Đón khách Tàu điện ngầm",
+                    "terms": "nơi đón khách tàu điện ngầm, chỗ đón khách tàu điện ngầm, noi don khach tau dien ngam, cho don khach tau dien ngam"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "Nơi Đón khách Xe lửa",
+                    "terms": "nơi đón khách xe lửa, nơi đón khách tàu hỏa, nơi đón khách tàu hoả, chỗ đón khách xe lửa, chỗ đón khách tàu hỏa, chỗ đón khách tàu hoả, noi don khach xe lua, noi don khach tau hoa, noi don khach tau hoa, cho don khach xe lua, cho don khach tau hoa, cho don khach tau hoa"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "Nơi Đón khách Tàu điện",
+                    "terms": "nơi đón khách tàu điện, nơi đón khách xe điện, chỗ đón khách tàu điện, chỗ đón khách xe điện, noi don khach tau dien, noi don khach xe dien, cho don khach tau dien, cho don khach xe dien"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "Nơi Đón khách Xe điện Bánh hơi",
+                    "terms": "nơi đón khách xe điện bánh hơi, nơi đón khách xe buýt điện, nơi đón khách xe bus điện, chỗ đón khách xe điện bánh hơi, chỗ đón khách xe buýt điện, chỗ đón khách xe bus điện, noi don khach xe dien banh hoi, noi don khach xe buyt dien, noi don khach xe bus dien, cho don khach xe dien banh hoi, cho don khach xe buyt dien, cho don khach xe bus dien"
                 },
                 "railway": {
                     "name": "Đường sắt"
                     "terms": "đường sắt leo núi, đường ray leo núi, duong sat leo nui, duong ray leo nui"
                 },
                 "railway/halt": {
-                    "name": "Ga xép",
-                    "terms": "ga xép, ga nhỏ, ga xep, ga nho"
+                    "name": "Gà xép"
                 },
                 "railway/level_crossing": {
                     "name": "Điểm giao Đường sắt",
                     "terms": "giao lộ đường sắt, giao lộ đường ray, nút giao đường sắt, giao lo duong sat, giao lo duong ray, nut giao duong sat"
                 },
+                "railway/light_rail": {
+                    "name": "Đường sắt Nhẹ",
+                    "terms": "đường sắt nhẹ, đường ray nhẹ, tàu điện, duong sat nhe, duong ray nhe, tau dien"
+                },
                 "railway/milestone": {
                     "name": "Cột mốc Đường sắt",
                     "terms": "cột mốc đường sắt, cot moc duong sat"
                 },
+                "railway/miniature": {
+                    "name": "Đường sắt Nhỏ",
+                    "terms": "đường sắt nhỏ, đường ray nhỏ, duong sat nho, duong ray nho"
+                },
                 "railway/monorail": {
                     "name": "Đường sắt Một ray",
                     "terms": "đường sắt một ray, duong sat mot ray"
                     "terms": "đường sắt khổ hẹp, đường ray khổ hẹp, đường sắt hẹp, đường ray hẹp, duong sat kho hep, duong ray kho hep, duong sat hep, duong ray hep"
                 },
                 "railway/platform": {
-                    "name": "Ke ga",
-                    "terms": "ke ga, sân ga, san ga"
+                    "name": "Trạm/Bến Xe lửa"
                 },
                 "railway/rail": {
                     "name": "Đường sắt",
                     "terms": "đèn đường sắt, den duong sat"
                 },
                 "railway/station": {
-                    "name": "Nhà ga",
-                    "terms": "nhà ga, nha ga"
+                    "name": "Nhà ga"
                 },
                 "railway/subway": {
                     "name": "Đường Tàu điện ngầm",
                     "terms": "đường tàu điện, tàu điện, đường xe điện, xe điện, duong tau dien, tau dien, duong xe dien, xe dien "
                 },
                 "railway/tram_stop": {
-                    "name": "Trạm Tàu điện",
-                    "terms": "trạm tàu điện, trạm xe điện, tram tau dien, tram xe dien"
+                    "name": "Vị trí Đón khách Tàu điện"
                 },
                 "relation": {
                     "name": "Quan hệ",
                     "name": "Tiệm",
                     "terms": "cửa hàng, tiệm, cửa hiệu, cửa buôn bán, nhà bán hàng, nhà buôn bán, nơi bán hàng, cua hang, tiem, cua hieu, cua buon ban, nha ban hang, nha buon ban, noi ban hang"
                 },
+                "shop/agrarian": {
+                    "name": "Tiệm Nông thôn",
+                    "terms": "tiệm nông nghiệp, cửa hàng nông nghiệp, quán nông nghiệp, hạt, thuốc trừ dịch hại, dụng cụ nông nghiệp, tiem nong nghiep, cua hang nong nghiep, quan nong nghiep, hat, thuoc tru dich hai, dung cu nong nghiep"
+                },
                 "shop/alcohol": {
                     "name": "Tiệm Rượu",
                     "terms": "tiệm rượu, nơi bán rượu, chỗ bán rượu, quầy bán rượu, cửa hàng rượu, cửa hàng bán rượu, tiệm bán rượu, tiem ruou, noi ban ruou, cho ban ruou, quay ban ruou, cua hang ruou, cua hang ban ruou, tiem ban ruou"
                     "terms": "khu vực bán kim hoàn, chỗ bán kim hoàn, tiệm bán kim hoàn, nơi bán kim hoàn, cửa hàng bán kim hoàn, cửa hiệu bán kim hoàn, quầy bán kim hoàn, cửa tiệm kim hoàn, đồ trang sức, vàng, ngọc, khu vuc ban kim hoan, cho ban kim hoan, tiem ban kim hoan, noi ban kim hoan, cua hang ban kim hoan, cua hieu ban kim hoan, quay ban kim hoan, cua tiem kim hoan, do trang suc, vang, ngoc"
                 },
                 "shop/kiosk": {
-                    "name": "Quầy Báo",
-                    "terms": "quầy báo, gian hàng, tạp chí, tin tức, quay bao, gian hang, tap chi, tin tuc"
+                    "name": "Gian hàng",
+                    "terms": "gian hàng, quầy hàng, quầy báo, tờ báo, tạp chí, tin tức, thuốc lá, gian hang, quay hang, quay bao, to bao, tap chi, tin tuc, thuoc la"
                 },
                 "shop/kitchen": {
                     "name": "Tiệm Trang trí Nội thất",
                 },
                 "shop/newsagent": {
                     "name": "Tiệm Báo",
-                    "terms": "tiệm báo, cửa hàng báo, cửa hiệu báo, quán báo, tiệm tạp chí, cửa hàng tạp chí, cửa hiệu tạp chí, quán tạp chí, tiem bao, cua hang bao, cua hieu bao, quan bao, tiem tap chi, cua hang tap chi, cua hieu tap chi, quan tap chi"
+                    "terms": "tiệm báo, cửa hàng báo, cửa hiệu báo, quầy báo, tiệm tạp chí, cửa hàng tạp chí, cửa hiệu tạp chí, quầy tạp chí, tiem bao, cua hang bao, cua hieu bao, quay bao, quan bao, tiem tap chi, cua hang tap chi, cua hieu tap chi, quay tap chi"
                 },
                 "shop/nutrition_supplements": {
                     "name": "Tiệm Thuốc bổ",
                 },
                 "shop/optician": {
                     "name": "Tiệm Kính mắt",
-                    "terms": "tiệm kính đeo mắt, tiệm kiếng đeo mắt, chỗ đo mắt, bác sĩ mắt, văn phòng đo mắt, cửa hàng kính đeo mắt, cửa hiệu kính đeo mắt, chỗ làm kính đeo mắt, tiem kinh deo mat, tiem kieng deo mat, cho do mat, bac si mat, van phong do mat, cua hang kinh deo mat, cua hieu kinh deo mat, cho lam kinh deo mat"
+                    "terms": "tiệm kính đeo mắt, tiệm kiếng đeo mắt, chỗ đo mắt, bác sĩ mắt, bác sỹ mắt, văn phòng đo mắt, cửa hàng kính đeo mắt, cửa hiệu kính đeo mắt, chỗ làm kính đeo mắt, tiem kinh deo mat, tiem kieng deo mat, cho do mat, bac si mat, bac sy mat, van phong do mat, cua hang kinh deo mat, cua hieu kinh deo mat, cho lam kinh deo mat"
                 },
                 "shop/organic": {
                     "name": "Tiệm Thực phẩm Hữu cơ",
                     "terms": "tiệm bán phim, tiệm bán video, tiệm mướn phim, tiệm mướn video, chỗ bán phim, chỗ mướn phim, cửa hàng phim, cửa hiệu phim, quầy bán phim, tiem ban phim, tiem ban video, tiem muon phim, tiem muon video, cho ban phim, cho muon phim, cua hang phim, cua hieu phim, quay ban phim"
                 },
                 "shop/video_games": {
-                    "name": "Tiệm Video Game",
-                    "terms": "tiệm video game, tiệm trò chơi video, tiệm trò chơi điện tử, tiệm game, cửa hàng video game, cửa hàng trò chơi video, cửa hàng trò chơi điện tử, cửa hàng game, cửa hiệu video game, cửa hiệu trò chơi video, cửa hiệu trò chơi điện tử, cửa hiệu game, tiem video game, tiem tro choi video, tiem tro choi dien tu, tiem game, cua hang video game, cua hang tro choi video, cua hang tro choi dien tu, cua hang game, cua hieu video game, cua hieu tro choi video, cua hieu tro choi dien tu, cua hieu game"
+                    "name": "Tiệm Trò chơi Điện tử",
+                    "terms": "tiệm trò chơi điện tử, tiệm video game, tiệm trò chơi video, tiệm game, cửa hàng trò chơi điện tử, cửa hàng video game, cửa hàng trò chơi video, cửa hàng game, cửa hiệu trò chơi điện tử, cửa hiệu video game, cửa hiệu trò chơi video, cửa hiệu game, tiem tro choi dien tu, tiem video game, tiem tro choi video, tiem game, cua hang tro choi dien tu, cua hang video game, cua hang tro choi video, cua hang game, cua hieu tro choi dien tu, cua hieu video game, cua hieu tro choi video, cua hieu game"
                 },
                 "shop/watches": {
                     "name": "Tiệm Đồng hồ Đeo tay",
                     "name": "Bãi Đậu Nhà lưu động",
                     "terms": "bãi đậu nhà lưu động, sân đậu nhà lưu động, chỗ đậu nhà lưu động, nơi đậu nhà lưu động, khu nhà lưu động, bai dau nha luu dong, san dau nha luu dong, cho dau nha luu dong, noi dau nha luu dong, khu nha luu dong"
                 },
+                "tourism/chalet": {
+                    "name": "Nhà nghỉ Riêng biệt",
+                    "terms": "nhà nghỉ riêng biệt, nhà ván gỗ kiểu thụy sĩ, nhà ván gỗ kiểu thụy sỹ, nhà ván gỗ kiểu thuỵ sĩ, nhà ván gỗ kiểu thuỵ sỹ, nhà nghỉ trên núi tuyết, nha nghi rieng biet, nha van go kieu thuy si, nha van go kieu thuy sy, nha nghi tren nui tuyet"
+                },
                 "tourism/gallery": {
                     "name": "Phòng tranh",
                     "terms": "phòng tranh, phòng triển lãm nghệ thuật, phòng triển lãm nghệ phẩm, phong tranh, phong trien lam nghe thuat, phong trien lam nghe pham"
                     "name": "Điểm Ngắm cảnh",
                     "terms": "điểm ngắm cảnh, nơi ngắm cảnh, kính viễn vọng, kiếng viễn vọng, kính nhìn từ xa, kiếng nhìn từ xa, thắng cảnh, diem ngam canh, noi ngam canh, kinh vien vong, kieng vien vong, kinh nhin tu xa, kieng nhin tu xa, thang canh"
                 },
+                "tourism/wilderness_hut": {
+                    "name": "Lều trú",
+                    "terms": "lều trú, túp lều, nhà trú, leu tru, tup leu, nha tru"
+                },
                 "tourism/zoo": {
                     "name": "Vườn thú",
                     "terms": "vườn thú, vườn bách thú, vuon thu, vuon bach thu"
                     "name": "Tuyến đường Cưỡi ngựa",
                     "terms": "tuyến đường cưỡi ngựa, tuyen duong cuoi ngua"
                 },
+                "type/route/light_rail": {
+                    "name": "Tuyến Đường sắt Nhẹ",
+                    "terms": "tuyến đường sắt nhẹ, tuyến đường ray nhẹ, tuyến đường tàu điện, tuyen duong sat nhe, tuyen duong ray nhe, tuyen duong tau dien"
+                },
                 "type/route/pipeline": {
                     "name": "Tuyến Đường ống",
                     "terms": "tuyến đường ống, tuyến ống dẫn, tuyen duong ong, tuyen ong dan"
                 },
+                "type/route/piste": {
+                    "name": "Tuyến đường Trượt tuyết",
+                    "terms": "tuyến đường trượt tuyết, tuyến đường mòn trượt tuyết, tuyen duong truot tuyet, tuyen duong mon truot tuyet"
+                },
                 "type/route/power": {
                     "name": "Tuyến đường Dây điện",
                     "terms": "tuyến đường dây điện, tuyen duong day dien"
                     "name": "Tuyến đường Xe hơi",
                     "terms": "tuyến đường xe hơi, tuyến đường giao thông, lộ trình giao thông, tuyen duong xe hoi, tuyen duong giao thong, lo trinh giao thong"
                 },
+                "type/route/subway": {
+                    "name": "Tuyến Tàu điện ngầm",
+                    "terms": "tuyến tàu điện ngầm, tuyen tau dien ngam"
+                },
                 "type/route/train": {
                     "name": "Tuyến Đường sắt",
                     "terms": "tuyến đường sắt, tuyến xe lửa, tuyến tàu hỏa, tuyến tàu hoả, tuyến xe điện ngầm, tuyen duong sat, tuyen xe lua, tuyen tau hoa, tuyen xe dien ngam"
                 "name": "Đường sá TIGER 2017"
             },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC BY-SA 3.0, dữ liệu bản đồ do những người đóng góp vào  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Xe đạp"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC BY-SA 3.0, dữ liệu bản đồ do những người đóng góp vào  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Đường Đi bộ Dài"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC BY-SA 3.0, dữ liệu bản đồ do những người đóng góp vào  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Xe đạp Leo núi"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC BY-SA 3.0, dữ liệu bản đồ do những người đóng góp vào  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Trượt băng"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC BY-SA 3.0, dữ liệu bản đồ do những người đóng góp vào  OpenStreetMap, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: Thể thao Mùa đông"
             },
             "basemap.at": {
index 841c3aa32fa5d2a40ecf3c329a5fa55c7e080baa..a9763f7da4697e8709410baac75173b2ca75ee0c 100644 (file)
             "created": "開咗",
             "about_changeset_comments": "相關變更留言",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
-            "google_warning": "留言提及谷歌(Google):留意,不得抄谷哥地圖(Google Maps)。",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning": "留言提及谷歌(Google):留意,不得抄谷哥地圖(Google Maps)。"
         },
         "contributors": {
             "list": "有{users}修改",
         "background": {
             "title": "背景",
             "description": "背景設定",
-            "percent_brightness": "{opacity}% 光",
             "none": "無",
             "best_imagery": "此地至出名相源",
             "switch": "轉返去爾個背景",
             "custom": "自訂",
             "custom_button": "改自訂背景",
-            "fix_misalignment": "校正背圖對位誤差",
-            "imagery_source_faq": "相邊度來?",
             "reset": "重設",
-            "offset": "下面灰帶內,拖到任何位,去校正背圖對位誤差,又或者,以米為單位,入返啲差額。",
             "minimap": {
-                "description": "細地圖",
                 "tooltip": "開個縮圖,幫手搵返家下睇到嘅範圍。"
-            }
+            },
+            "fix_misalignment": "校正背圖對位誤差",
+            "offset": "下面灰帶內,拖到任何位,去校正背圖對位誤差,又或者,以米為單位,入返啲差額。"
         },
         "map_data": {
             "title": "地圖資料",
             "view_on_mapillary": "去輿兵度睇張相"
         },
         "help": {
-            "title": "指南",
-            "help": "# 指南\n\n爾個程式,係爲 [公家街圖](http://www.openstreetmap.org/)而做。 有世界地圖,任用亦改得。你可以用佢,喺你處加嘢改嘢。如此一來,裏面嘅料,人人可以公開任用,人人得益。\n\n邊個用公家街圖,都見得到你整嘅地圖。要改得到,就要開定個\n[簽入戶口](https://www.openstreetmap.org/login).\n\n[iD editor](http://ideditor.com/) 係合作而成, [程式碼放喺 GitHub](https://github.com/openstreetmap/iD).\n",
-            "gps": "# 全球定位系統\n\n數據取自全球定位系統,係公家街圖至可靠來源。爾個造圖程式,用到本機行蹤,卽放你電腦嘅【.gpx】檔案。你收集全球定位系統行蹤,取自智能電話程式,或者個人全球定位系統儀。\n\n點去用全球定位系統測量,睇下 [製圖,用電話、用全球定位系統、用紙](http://learnosm.org/en/mobile-mapping/)。\n\n用GPX途徑製圖,拖GPX檔案落造圖程式。若然讀得明,佢會加入地圖,用鮮紫綫顯現。喺右邊,撳落【背景設定】選單。咁就開得,閂得,放大縮細新嘅GPX層。\n\n爾個GPX途徑,唔會直上公家街圖,最好用法,就係用佢製圖。按此加新地貌,亦可[傳上公家街圖](http://www.openstreetmap.org/trace/create)以作其他用途。\n",
-            "imagery": "# 相\n\n航空相係地圖要源。佢哋飛機飛過,衞星望落等組合。網上有任用來源,可供使用。就喺右邊,【背景設定】之內。\n\n程式預先已有 [兵地圖](http://www.bing.com/maps/) 䘙星相層。你放大縮細去某啲地方,就有其他可用。某幾國,如美國、法國、丹麥等,國內某啲地方,有極精細嘅相。\n\n相有時同地圖資料有差距,爾個係供相者出錯。若你睇到多多路與背景移咗位,就唔好郁住。將啲相校好個位,同地圖資料吻合。要咁做,就去背景設定,撳【校正對位誤差】校好咗先。\n",
-            "addresses": "# 地埗\n\n地埗,對地圖好有用嘅資料。\n\n雖則地埗通常係街嘅一部份,不過喺公家街圖入面,會記爲沿街屋宇及地方屬性。\n\n你可以加地埗落地方,畫成屋宇界圖,亦可以畫成單處。最好來源,就係視身街一轉,或者靠個人知識。之但係,同其他地貌一樣,禁止抄其他商用來源,包括谷歌地圖。\n",
-            "inspector": "# 用明細一覽\n\n明細一覽係全版左邊嘅部份,畀你改個地貌嘅詳細資料。\n\n### 揀地貌\n\n無論你加處、綫或者範圍,你要揀係乜地貌,如公路定住宅路,超級市場定茶座。明細一覽上面有掣,揀你要嘅地貌,同埋你亦可以格中,一邊打一邊搵。\n\n個個地貌製,右邊【i】字,撳落有細解。撳落個掣度就揀到地貌。\n\n### 用表及改籤\n\n你㨂完地貌,或者你㨂嘅,早已入咗地貌,咁明細一覽,就有一欄欄,講地貌詳細資料,例如名同地埗咁。\n\n欄下面,你會見到啲細公仔,係用來加其他明細,好似連去維基百科資料、行唔行到輪輢等等。\n\n明細一覽個底,撳【所有籤】,就可以隨意加其他籤落去。\n[籤料](http://taginfo.openstreetmap.org/) 係極有用嘅地方知道唔通籤嘅配搭。\n\n你喺明細一覽改嘅,都會自動送上地圖。你亦可以還原修改,只要咁下【還原】掣。\n"
+            "title": "指南"
         },
         "intro": {
             "done": "搞掂",
                     "label": "容納",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向",
-                    "options": {
-                        "E": "東",
-                        "ENE": "東北偏東",
-                        "ESE": "東南偏東",
-                        "N": "北",
-                        "NE": "東北",
-                        "NNE": "東北偏北",
-                        "NNW": "西北偏北",
-                        "NW": "西北",
-                        "S": "南",
-                        "SE": "東南",
-                        "SSE": "東南偏南",
-                        "SSW": "西南偏南",
-                        "SW": "西南",
-                        "W": "西",
-                        "WNW": "西北偏西",
-                        "WSW": "西南偏西"
-                    }
-                },
                 "castle_type": {
                     "label": "類"
                 },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "逆時針",
-                        "clockwise": "順時針"
-                    }
-                },
                 "club": {
                     "label": "類"
                 },
                     "label": "標準桿",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "方向",
-                    "options": {
-                        "backward": "向後",
-                        "forward": "向前"
-                    }
-                },
                 "park_ride": {
                     "label": "泊車轉乖"
                 },
                     "name": "郊野訪客處",
                     "terms": "Ranger Station,郊野訪客處,野郊訪客處"
                 },
-                "amenity/recycling": {
-                    "name": "囘收桶",
-                    "terms": "Recycling,囘收桶,囘收箱,回收桶,回收箱"
-                },
                 "amenity/restaurant": {
                     "name": "餐廳",
                     "terms": "Restaurant,茶樓,酒家,酒樓,飯店,飯館,餐廳,餐館"
                     "name": "馬徑",
                     "terms": "Bridle Path,馬徑,馬道"
                 },
-                "highway/bus_stop": {
-                    "name": "巴士站",
-                    "terms": "Bus Stop,公交車站,公共汽車站,巴士站"
-                },
                 "highway/cycleway": {
                     "name": "單車徑",
                     "terms": "Cycle Path,單車徑,自行車道"
                     "terms": "Office,寫字樓,辦公室"
                 },
                 "office/administrative": {
-                    "name": "行政樓",
-                    "terms": "Administrative Office,行政樓"
-                },
-                "office/company": {
-                    "name": "公司寫字樓",
-                    "terms": "Company Office,公司,公司寫字樓"
+                    "name": "行政樓"
                 },
                 "office/educational_institution": {
                     "name": "敎育機構",
                     "name": "火牛房",
                     "terms": "Transformer,火牛房,變電所"
                 },
-                "public_transport/platform": {
-                    "name": "站頭",
-                    "terms": "Platform,平臺,站頭"
-                },
-                "public_transport/stop_position": {
-                    "name": "街中站",
-                    "terms": "Stop Position,停止位置,街中站"
-                },
                 "railway": {
                     "name": "鐵路"
                 },
                     "name": "停用鐵路",
                     "terms": "Disused Railway,停用鐵路,廢棄的鐵路"
                 },
-                "railway/halt": {
-                    "name": "火車細站",
-                    "terms": "Railway Halt,小火車站,火車站仔,火車細站"
-                },
                 "railway/monorail": {
                     "name": "單軌",
                     "terms": "Monorail,單軌,單軌鐵路,單軌電車"
                     "name": "窄軌火車",
                     "terms": "Narrow Gauge Rails,窄軌火車,窄軌,窄軌鐵路"
                 },
-                "railway/platform": {
-                    "name": "月臺",
-                    "terms": "Railway Platform,月臺,站臺,鐵道月台"
-                },
                 "railway/rail": {
                     "name": "路軌",
                     "terms": "Rail,火車軌,路軌,軌,鐵軌"
                 },
-                "railway/station": {
-                    "name": "火車站",
-                    "terms": "Railway Station,火車站,鐵路站"
-                },
                 "railway/subway": {
                     "name": "地下鐵路",
                     "terms": "MTR,Mass Transit Railway,Subway,地下鐵,地下鐵路,地鐵"
index e125367758c1677de98338cc0ee58a8df6b40e8b..db3a17479f40d79cd89cc4da856ebb6306311d2e 100644 (file)
@@ -4,17 +4,17 @@
             "add_area": {
                 "title": "区域",
                 "description": "在地图上添加公园、建筑物、湖泊或其他区域。",
-                "tail": "在地图上单击开始绘制面状要素,如公园、湖泊或建筑物。"
+                "tail": "在地图上单击,开始绘制一个区域,如公园、湖泊或建筑物。"
             },
             "add_line": {
                 "title": "线",
                 "description": "添加公路、街道、人行道、河渠或其他线到地图上。",
-                "tail": "å\8d\95å\87»å\9c°å\9b¾å¼\80å§\8bç»\98å\88¶é\81\93è·¯ã\80\81å°\8få¾\84或路线。"
+                "tail": "å\9c¨å\9c°å\9b¾ä¸\8aå\8d\95å\87»ï¼\8cå¼\80å§\8bç»\98å\88¶ä¸\80æ\9d¡é\81\93è·¯ï¼\8cå°\8fé\81\93或路线。"
             },
             "add_point": {
                 "title": "点",
                 "description": "添加餐馆、纪念碑、邮筒或其他点到地图上。",
-                "tail": "点击地图添加一个点。"
+                "tail": "在地图上单击,添加一个点。"
             },
             "browse": {
                 "title": "浏览",
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "点击以为这线段添加更多节点。点击其他线段以连接它们,点击两下以完成绘制线段。"
+            },
+            "drag_node": {
+                "connected_to_hidden": "无法编辑,因为其与一隐藏要素相连。"
             }
         },
         "operations": {
                 }
             },
             "disconnect": {
-                "title": "断开连接",
-                "description": "断开这些线/区域之间的连接。",
+                "title": "分离",
+                "description": "将这些线/区域相互分离。",
                 "key": "D",
-                "annotation": "断开线/区域连接。",
-                "not_connected": "没有足够的线/面来断开。",
-                "connected_to_hidden": "无法断开连接,因为其与一隐藏要素相连。",
-                "relation": "无法断开连接,因为其构成关系成员间的连接。"
+                "annotation": "将线或区域分离。",
+                "not_connected": "没有足够的线/面来分离。",
+                "connected_to_hidden": "无法分离,因为其与一隐藏要素相连。",
+                "relation": "无法分离,因为它与一个关系的成员间相连。"
             },
             "merge": {
                 "title": "合并",
             "about_changeset_comments": "关于编辑变动",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "您在该评论中提及 Google : 请注意从 Google Maps 中复制信息是被严格禁止的。",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "由 {users} 编辑",
                 "title": "测量",
                 "selected": "已选择 {n} 个",
                 "geometry": "几何",
-                "closed": "闭合",
+                "closed_line": "闭合路径",
+                "closed_area": "闭合区域",
                 "center": "中心",
                 "perimeter": "周长",
                 "length": "长度",
                 "centroid": "质心",
                 "location": "位置",
                 "metric": "公制",
-                "imperial": "英制"
+                "imperial": "英制",
+                "node_count": "节点数"
             }
         },
         "geometry": {
             "title": "背景",
             "description": "背景设置",
             "key": "B",
-            "percent_brightness": "{opacity}%亮度",
+            "backgrounds": "背景影像",
             "none": "无",
             "best_imagery": "此地最知名的影像数据源",
             "switch": "切换回该底图",
             "custom": "自定义",
             "custom_button": "编辑自定义背景",
-            "custom_prompt": "输入地图瓦片URL地址。有效的参数有:\n   - {zoom}/{z}, {x}, {y} 作为 Z/X/Y 坐标系\n   - {ty} 作为翻转的 TMS 算法 Y 坐标\n   - {u} 作为四叉树坐标编码\n   - {switch:a,b,c} 作为 DNS 服务器解析的并行连接子域\n\n示例:\n{example}",
-            "fix_misalignment": "调整影像偏移",
-            "imagery_source_faq": "该影像是从哪里来的呢?",
+            "custom_prompt": "输入地图瓦片URL地址。有效的参数有:\n   - {zoom} 或 {z}, {x}, {y} 作为 Z/X/Y 坐标系\n   - {-y} 或 {ty} 作为翻转的 TMS 算法 Y 坐标\n   - {u} 作为四叉树坐标编码\n   - {switch:a,b,c} 作为 DNS 服务器解析的并行连接子域\n\n示例:\n{example}",
+            "overlays": "叠加图层",
+            "imagery_source_faq": "影像信息 / 报告问题",
             "reset": "重置",
-            "offset": "在下面的灰色区域拖动来调整影像偏移,或输入以米为单位的偏移量。",
+            "display_options": "显示设定",
+            "brightness": "亮度",
+            "contrast": "对比度",
+            "saturation": "饱和度",
+            "sharpness": "锐化",
             "minimap": {
-                "description": "小地图",
+                "description": "显示小地图",
                 "tooltip": "显示一个大范围的地图来帮助定位当前显示的区域",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "调整影像偏移",
+            "offset": "在下面的灰色区域拖动来调整影像偏移,或输入以米为单位的偏移量。"
         },
         "map_data": {
             "title": "地图数据",
             "status_code": "服务器返回的状态代码{code}",
             "unknown_error_details": "请确保您已连接到互联网。",
             "uploading": "正在向 OpenStreetMap 上传更改……",
+            "conflict_progress": "正在检查冲突:第 {num} / {total} 处",
             "unsaved_changes": "您有未保存的修改",
             "conflict": {
                 "header": "调解编辑冲突",
             "untagged_area_tooltip": "选择描述这块区域的要素类型。",
             "untagged_relation": "未标记的关系",
             "untagged_relation_tooltip": "选择描述这个关系的要素类型。",
-            "many_deletions": "您正在删除 {n} 个要素。您确定要这么做吗?这些要素将会在任何人所见的 openstreetmap.org 地图上被删除。",
+            "many_deletions": "您正在删除 {n} 个要素:{p} 个节点、{l} 条路径、{a} 片区域、{r} 个关系。您确定要这么做吗?这些要素将会在任何人所见的 openstreetmap.org 地图上被删除。",
             "tag_suggests_area": "{tag}的标签所建议的线段应为区域,但这个不是一区域",
             "deprecated_tags": "弃用标签:{tags}"
         },
         "mapillary": {
             "view_on_mapillary": "在Mapillary上查看这张图片"
         },
+        "openstreetcam_images": {
+            "tooltip": "来自 OpenStreetCam 的街道等级照片",
+            "title": "照片覆盖(OpenStreetCam)"
+        },
+        "openstreetcam": {
+            "view_on_openstreetcam": "在 OpenStreetCam 上查看该图像"
+        },
         "help": {
             "title": "帮助",
             "key": "H",
-            "help": "#帮助\n\n这是 [OpenStreetMap](http://www.openstreetmap.org/) 的编辑器,OpenStreetMap 是一个免费且可编辑的世界地图。你可以用这个编辑器来增加和更新你所在地区的地图资料,令这个开源和开放数据的世界地图变得更好。\n\n你在这张地图上的编辑将会被所有使用 OpenStreetMap 的人看到。\n你需要 [登录](https://www.openstreetmap.org/login) 才能编辑。\n\n本编辑器名为 [iD](http://ideditor.com/) ,是一个 [源码在GitHub上共享](https://github.com/openstreetmap/iD) 的协作项目。\n",
-            "editing_saving": "# 编辑和保存\n\n本编辑器为在线编辑设计,您现在正经由本网站使用它。\n\n### 选择要素\n\n您可以在地图上单击以选中一个要素,如道路或一个兴趣点。被选中的要素将被高亮显示,同时开启有其详细信息的侧边面板。如果您右键点击它,将会显示一个菜单,列出可对该要素进行的操作。\n\n如需同时选中多个要素,您首先需要按住 Shift 键,然后要么依次点击选择需要的要素,或者在地图上拖一个长方形以圈出需要选则的要素,长方形中所有的点都会被选中。\n\n### 保存编辑内容\n\n当您做了比如编辑道路、建筑物或地点的更改后,这些更改在您将它们保存到服务器之前都只会保存在本地。无需担心犯错:您随时可以点击撤销按钮或重做按钮以撤销或重做更改。\n\n点击“保存”按钮以结束一组编辑内容,例如,在您刚完成了城镇的一个区域,正打算开始下一个区域的工作时。这时您有机会重新检查之前完成的工作,同时编辑器会自动给出有用的建议。如果您的更改有一些问题,编辑器也会给出警告。\n\n如果一切正常,您可以写入一小段注释来解释你做的变动,接着点击“上传”按钮提交更改到  [OpenStreetMap.org](http://www.openstreetmap.org/)。在此之后,您的更改将被所有其它用户可见,其它用户也会以此为基础继续改进地图。\n\n如果您一时无法完成编辑内容,您可以关闭编辑器窗口。待稍后您返回 (至同一台计算机的同一个浏览器) 时,重新打开编辑器将会恢复您的工作进度。\n\n## 使用编辑器\n\n您可以按下 `?` 键来查看键盘快捷键列表。\n",
-            "roads": "# 道路\n\n您可以利用这个编辑器创建,修复,及删除道路。道路可以有很多种:路径,公路,郊游径,单车径,和更多- 任何经常使用的路段都可制图。\n\n### 选择道路\n\n点击图上的道路以选择该道路。道路的轮廓会以高亮度显示,同时侧边面板会显示有关该道路的信息。如果您右键点击它,将会显示可对该道路进行之操作的菜单。\n\n### 编辑道路\n\n您或会经常注意到,道路并非对齐在背景中显示的卫星图像或GPS轨迹。您可以调整这些道路,让他们位于正确的位置。\n\n首先,点击您想编辑的道路。这会将道路以高亮度显示,并显示沿着这道路的节点,你可以拖曳这些节点到更好的位置。如果您想增加细节,可以为道路添加新的节点,点击两下道路上没有节点的部分,便可在该处増加节点。\n\n如果道路连接到另一条道路,但在地图上并未妥善连接,你可以拖曳道路的其中一个节点到另一条道路上,以连接两条道路。连接好道路,对地图非常重要,特别是对提供驾驶指示的应用程序而言,是必要的。\n\n您也可以右键该道路并点击'移动'工具或按`M`快捷键,来移动整条道路,然后再次点击以完成移动的动作。\n\n### 删除道路\n\n如果一条道路完全不正确- 您看到它在卫星图像上不存在,并最好实地证实它根本不存在- 您可以将道路删除,这会从地图中将之移除。删除物件时务必要小心- 像任何其他的编辑,结果会被大家看见,而卫星图像往往会过时,因此该道路或许只是新建的。\n\n要删除道路,您可以点击它以选中,然后按下 '删除' 快捷键,或者右键点击后再点击垃圾桶图标。\n\n### 绘制新道路\n\n发现某处应有一条道路,但地图上没有?点击编辑器左上方的'线'图标,或按下`2`快速键,以开始绘制线段。\n\n在地图上点击道路的开端,以开始绘制道路。如果道路从一条现有的道路分支出来,应点击两者连接的地方,以开始绘制。\n\n然后点击沿着道路的点,以根据卫星影像或GPS轨迹,正确地绘制道路。如果您绘制的道路如果与另一条道路交汇,请点击相交点以将它们连接起来。当您完成绘制后,可点击两下或按键盘上的'Return' 或'Enter' 键。\n",
-            "gps": "# GPS\n\n户外采集的GPS轨迹是OpenStreetMap的重要数据源之一。本编辑器\n支持本地轨迹——即你的电脑上的.gpx文件。你可以用众多智能手机\n应用或者个人GPS硬件采集这种GPS轨迹。\n\n有关如何使用GPS测量的信息,请参见\n[用智能手机、GPS或纸质图测图](http://learnosm.org/en/mobile-mapping/)。\n\n要使用GPX轨迹制图,将GPX文件拖曳到编辑器上即可。\n如果可以识别,将以亮紫色线条在地图上显示。\n点击右侧“地图数据”菜单可以打开、关闭或者\n缩放到新添加的GPX图层。\n\nGPX轨迹不会被直接上传到OpenStreetMap——最佳的使用方法是\n将其展绘到地图上作为辅助来绘制新增的地图要素,\n或者将其[上传到OpenStreetMap](http://www.openstreetmap.org/trace/create)\n供他人使用。\n",
-            "imagery": "# 影像\n\n航拍影像是绘制地图的一个重要资源。编辑器右侧「背景设置」菜单里有一组飞机航拍、卫星影像及自定义的来源可供选择。\n\n默认情况下编辑器显示的是[必应地图](http://www.bing.com/maps/)的卫星图层,但当您移动或缩放地图到一个新的地理区域,可能会有新的图源。一些国家,比如美国、法国和丹麦,会在一些区域提供非常高质量的影像。\n\n有时候由于影像提供商的错误,影像可能会与地图数据存在偏移。如果您看到许多道路偏离背景,请不要立刻移动它们来匹配背景,您可以点击背景设置界面底部的「修复对齐」来调整影像位置,以使它和已有数据吻合。\n",
-            "addresses": "# 地址\n\n地址是地图上的最有用的一些信息。\n\nOpenStreetMap通过沿街位置记录建筑和场所的地址,地址通常表示为街道的一部分。\n\n您可以添加地址信息映射为建筑轮廓的地方以及那些映射为单个点。地址的最佳来源数据是来自于实地调查或个人的知识与任何其他功能,从谷歌地图商业来源的复制是严格禁止的。\n",
-            "inspector": "# 使用查看器\n\n查看器是在页面左侧窗格的栏目,供你查看和编辑所选要素的详细信息。\n\n### 选择要素类型\n\n当添加完一个点、线或区域之后,你可以选择这个要素是什么类型,比如是高速公路还是居民区街道、超市还是咖啡厅。查看器会列出一些常见要素类型,你也可以通过搜索框查找其他类型。\n\n点击要素类型按钮右方的“i”可以显示该类型的介绍。点击类型按钮即可选择该类型。\n\n### 使用表格编辑标签\n\n选择要素类型后,或者某要素本来已有类型时,查看器会显示要素的字段详情,比如名称和地址。\n\n在已有的字段下方,你可以点击“添加字段”下拉菜单来添加其他详情,比如维基百科链接、轮椅通行情况等。\n\n在查看器底部,可以点击“附加标签”按钮来给要素添加任意其他标签。[Taginfo](http://taginfo.openstreetmap.org/) 是相当好用的工具,你可以了解常见的标签组合。\n\n你在查看器里所做的变更会自动应用到地图上。你可以随时点击“撤销”按钮撤销这些变更。\n",
-            "buildings": "# 建筑物\n\nOpenStreetMap 是世界上最大的建筑物的数据库。您可以建立和改善这个数据库。\n\n### 选择建筑物\n\n您可以点击建筑物的边界选择该建筑物。该建筑物将以高亮显示,同时在侧边面板中加载出此建筑物的更多信息。如果您右键点击它,它将会显示可对该建筑物进行之操作的菜单。\n\n### 修改建筑物\n\n有时候,建筑物的位置或其标签或许会不正确。\n\n要移动整个建筑物的位置,先选择该建筑物,然后按 'M' 移动快捷键,或者右键点击后再选择 '移动' 工具。移动您的鼠标以移动筑物,在移到正确位置上点击一下。\n\n要更正建筑物的形状,点击并拖曳建筑物轮廓的节点,以移到更佳的位置。\n\n### 绘制新建筑物\n\n在 OpenStreetMap 上既可以用形状也可以用点来标记建筑,很多人常常困惑到底应该使用那种方式。一般来说,应_尽可能用区域来标记建筑物的轮廓_,用置于建筑轮廓内的点来标记建筑物中的公司、住宅、设施及其他东西。\n\n要开始绘制建筑物,先单击左上方的'区域'按钮,最后按键盘上的回车键或点击所绘的第一个节点,完成轮廓的绘制。\n\n### 删除建筑物\n\n如果一个建筑物完全不正确:您看到它在卫星图像上不存在,并最好实地证实它根本不存在,您可以将建筑物删除,这会从地图中将之移除。删除要素时务必要小心:像任何其他的编辑一样,结果会公之于众。该建筑物或许是新建的,而卫星图像往往会过时。\n\n要删除建筑物,您可以点击它以选中,然后按下 '删除' 快捷键,或者右键点击后再点击垃圾桶图标。\n",
-            "relations": "# 关系\n\n关系是 OpenStreetMap 中用于组合其它要素的特殊要素类型。比如,两个基本关系类型*路径关系*和*复合多边形*,它们分别用于组合同一条公路或高速公路的不同部分和一个复杂区域(分成多块或像油炸圈饼一样中间有个洞)的多条线条。\n\n关系中包含的要素称为*成员*。在侧边栏的底部,您可以看到成员所属的关系,并点击以选中它。选中某个关系后,您就能看到它的所有成员在侧边栏被全部列出并在地图上被高亮显示。\n\n在大多数时候,iD 会在您编辑的时候自动处理关系。您主要注意的是当您删除道路的某个部分并重绘它时,请确保新的部分还是原来的关系中的一员。\n\n## 编辑关系\n\n如果您想要编辑关系,这里是一些基本技巧。\n\n要向关系中添加要素,选择该要素,点击侧边栏「所有关系」中的「+」按钮,并选择或输入关系的名称。\n\n要创建一个新的关系,选中要作为成员的第一个要素,点击「所有关系」中的「+」按钮,并选择「新建关系...」。\n\n要从一个关系中移除要素,选择要素并点击您要从中移除的关系旁边的垃圾箱按钮。\n\n您可以使用「合并」工具创建有洞的复合多边形。绘制两个区域(内部和外部),按住 Shift 键并点击各个多边形来选中它们,然后按 'C' 快捷键。另一种方法是同时选中它们,右键点击其中一个,然后点击「合并」(+) 按钮。\n"
+            "help": {
+                "title": "帮助",
+                "welcome": "欢迎使用 [OpenStreetMap](https://www.openstreetmap.org/) 的 iD 编辑器。您可以使用这个编辑器在网页浏览器内直接编辑 OpenStreetMap 地图。",
+                "open_data_h": "开放数据",
+                "open_data": "您在这个地图上做出的编辑会对所有使用 OpenStreetMap 的用户可见。您的编辑可以基于个人知识、实地调查、航空拍摄图片或者街景照片。从商业来源,例如谷歌地图这样的来源复制信息是被 [严格禁止](https://www.openstreetmap.org/copyright) 的。",
+                "before_start_h": "在您开始之前",
+                "before_start": "您在开始编辑之前应当先了解熟悉 OpenStreetMap 和本编辑器。iD 包含了一个导览教程,可以帮助您了解编辑 OpenStreetMap 的基本知识。请点击屏幕上的“开始演练”按钮以开始教程——这只会占用您大概 15 分钟。",
+                "open_source_h": "开放源代码",
+                "open_source": "iD 编辑器是一个合作开放源代码项目,您正在使用的版本是 {version}。其源代码 [在 GitHub](https://github.com/openstreetmap/iD) 上可找到。",
+                "open_source_help": "您可以帮助 iD [翻译文本](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) 或者 [报告问题](https://github.com/openstreetmap/iD/issues)。"
+            },
+            "overview": {
+                "title": "概览",
+                "navigation_h": "导航",
+                "navigation_drag": "您可以按下并按住{leftclick}主鼠标键并移动鼠标来拖动地图。您还可以使用键盘上`↓`、 `↑`、 `←`、`→` 的光标键。",
+                "navigation_zoom": "您可以滚动鼠标滚轮或触摸板来放大或缩小地图,也可以按下地图侧面的{plus}/{minus}按键。您也可以使用键盘上的`+`、`-`按键。",
+                "features_h": "地图要素",
+                "features": "我们使用*要素*(*feature*)这个词来描述出现在地图上的事物,例如道路、建筑或兴趣点。任何真实世界的实物均可在 OpenStreetMap 上被映射为一个要素。地图要素在地图上使用*点*、*线*或*区域*进行表示。",
+                "nodes_ways": "在 OpenStreetmap 中,点又被称为*节点*,而线和区域又被称为*路径*。"
+            },
+            "editing": {
+                "title": "编辑和保存",
+                "select_h": "选择",
+                "select_left_click": "{leftclick}使用主鼠标键(常见为左键)点击一个要素可以选中它。被选中的要素的边缘会高亮闪烁,同时侧边栏会显示该要素的详细信息,如它的名字或地址等等。",
+                "select_right_click": "{rightclick}使用次鼠标键(常见为右键)点击一个要素可以显示编辑菜单,其中给出了可用的指令,如旋转、移动和删除等等。",
+                "multiselect_h": "多选",
+                "multiselect_shift_click": "`{shift}`+{leftclick} 左键以选中多个要素。这样能使移动或删除多个要素变得更为方便。",
+                "save_h": "保存"
+            },
+            "feature_editor": {
+                "title": "要素编辑器"
+            },
+            "points": {
+                "title": "点"
+            },
+            "lines": {
+                "title": "线"
+            },
+            "areas": {
+                "title": "区域"
+            },
+            "relations": {
+                "title": "关系"
+            },
+            "imagery": {
+                "title": "背景影像"
+            },
+            "streetlevel": {
+                "title": "街景照片"
+            },
+            "gps": {
+                "title": "GPS 轨迹",
+                "upload": "您也可以[将您的 GPS 数据上传至 OpenStreetMap](https://www.openstreetmap.org/trace/create) 以供他人使用。"
+            }
         },
         "intro": {
             "done": "完成",
             },
             "areas": {
                 "title": "区域",
-                "add_playground": "*区域* 用来显示诸如湖泊、建筑物或居民区等要素的边界。{br}他们亦可作为一种更细致的绘制方式,以替代普通地用点来标记的方式。 **点击 {button} 区域按钮来添加一个新的区域。**",
                 "start_playground": "让我们用描绘一个区域的方式来添加这个游乐场吧。区域是通过在要素的外部轮廓上放置若干 *节点* 来描绘。 **点击或按空格键,在游乐场的其中一角放置一个起始节点。**",
                 "continue_playground": "继续在游乐场的轮廓上放置更多的节点来绘制该区域。如果遇到既有的人行道,你也可以将区域连接到人行道上。{br}提示:您可以按下{alt}键以防止节点连接到其他要素上。 **继续绘制游乐场区域。**",
                 "finish_playground": "按回车键、或再次点击起始/结束节点来结束绘制该区域。 **完成勾画该游乐场的轮廓。**",
                     "title": "选择要素",
                     "select_one": "选择单个要素",
                     "select_multi": "选择多个要素",
-                    "lasso": "在要素周围绘制套索"
+                    "lasso": "在要素周围绘制套索",
+                    "search": "关键字搜寻要素"
                 },
                 "with_selected": {
                     "title": "对选中的要素",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} ft",
+            "miles": "{quantity} mi",
+            "square_feet": "{quantity} sq ft",
+            "square_miles": "{quantity} sq mi",
+            "acres": "{quantity} ac",
+            "meters": "{quantity} m",
+            "kilometers": "{quantity} km",
+            "square_meters": "{quantity} m²",
+            "square_kilometers": "{quantity} km²",
+            "hectares": "{quantity} ha",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "N",
+            "south": "S",
+            "east": "E",
+            "west": "W",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "aeroway": {
                     "label": "类型"
                 },
+                "agrarian": {
+                    "label": "产品"
+                },
                 "amenity": {
                     "label": "类型"
                 },
                 "brand": {
                     "label": "品牌"
                 },
+                "brewery": {
+                    "label": "生啤酒"
+                },
                 "bridge": {
                     "label": "类型",
                     "placeholder": "默认"
                 "bunker_type": {
                     "label": "类型"
                 },
+                "cables": {
+                    "label": "电缆数量",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "方向 (顺时针度)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "容量",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向",
-                    "options": {
-                        "E": "东",
-                        "ENE": "东北偏东",
-                        "ESE": "东南偏东",
-                        "N": "北",
-                        "NE": "东北",
-                        "NNE": "东北偏北",
-                        "NNW": "西北偏北",
-                        "NW": "西北",
-                        "S": "南",
-                        "SE": "东南",
-                        "SSE": "东南偏南",
-                        "SSW": "西南偏南",
-                        "SW": "西南",
-                        "W": "西",
-                        "WNW": "西北偏西",
-                        "WSW": "西南偏西"
-                    }
-                },
                 "castle_type": {
                     "label": "类型"
                 },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "逆时针",
-                        "clockwise": "顺时针"
-                    }
-                },
                 "clothes": {
                     "label": "服饰"
                 },
                 "description": {
                     "label": "描述"
                 },
+                "devices": {
+                    "label": "设备数量",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "有尿布台"
                 },
+                "direction": {
+                    "label": "方向 (度顺时针)",
+                    "placeholder": "45, 90, 180, 270"
+                },
+                "direction_cardinal": {
+                    "label": "方向",
+                    "options": {
+                        "E": "东",
+                        "ENE": "东东北",
+                        "ESE": "东东南",
+                        "N": "北",
+                        "NE": "东北",
+                        "NNE": "北东北",
+                        "NNW": "北西北",
+                        "NW": "西北",
+                        "S": "南",
+                        "SE": "东南",
+                        "SSE": "南东南",
+                        "SSW": "南西南",
+                        "SW": "西南",
+                        "W": "西",
+                        "WNW": "西西北",
+                        "WSW": "西西南"
+                    }
+                },
+                "direction_clock": {
+                    "label": "方向",
+                    "options": {
+                        "anticlockwise": "逆时针",
+                        "clockwise": "顺时针"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "向后",
+                        "both": "双向 / 全部",
+                        "forward": "向前"
+                    }
+                },
                 "display": {
                     "label": "表盘显示类型"
                 },
                     "label": "类型",
                     "placeholder": "默认"
                 },
+                "frequency": {
+                    "label": "工作频率"
+                },
                 "fuel": {
                     "label": "油站"
                 },
                 "generator/type": {
                     "label": "类型"
                 },
+                "government": {
+                    "label": "类型"
+                },
                 "grape_variety": {
                     "label": "葡萄品种"
                 },
                 "memorial": {
                     "label": "类型"
                 },
-                "milestone_position": {
-                    "label": "里程碑位置",
-                    "placeholder": "距离,精确到一位小数 (123.4)"
-                },
                 "mtb/scale": {
                     "label": "山地自行车骑行难度",
                     "options": {
                     "label": "标准杆",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "方向",
-                    "options": {
-                        "backward": "向后",
-                        "forward": "向前"
-                    }
-                },
                 "park_ride": {
                     "label": "停车换乘"
                 },
                 "payment_multi": {
                     "label": "支付类型"
                 },
+                "phases": {
+                    "label": "相数",
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "电话",
                     "placeholder": "+31 42 123 4567"
                 "railway": {
                     "label": "类型"
                 },
-                "recycling_accepts": {
-                    "label": "接受"
+                "railway/position": {
+                    "label": "里程碑位置",
+                    "placeholder": "距离,精确到一位小数 (123.4)"
                 },
-                "recycling_type": {
-                    "label": "回收类型",
+                "railway/signal/direction": {
+                    "label": "方向",
                     "options": {
-                        "centre": "回收站",
-                        "container": "回收容器"
+                        "backward": "向后",
+                        "both": "双向 / 全部",
+                        "forward": "向前"
                     }
                 },
+                "recycling_accepts": {
+                    "label": "接受"
+                },
                 "ref": {
                     "label": "编号"
                 },
+                "ref/isil": {
+                    "label": "ISIL 编码"
+                },
                 "ref_aeroway_gate": {
                     "label": "登机口编号"
                 },
                 "surveillance/zone": {
                     "label": "监控区"
                 },
+                "switch": {
+                    "label": "开关类型"
+                },
                 "tactile_paving": {
                     "label": "人行道视障引导设施"
                 },
                 "traffic_signals": {
                     "label": "类型"
                 },
+                "traffic_signals/direction": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "向后",
+                        "both": "双向 / 全部",
+                        "forward": "向前"
+                    }
+                },
                 "trail_visibility": {
                     "label": "路径可见度",
                     "options": {
                     "placeholder": "良好,尚可,稍差..."
                 },
                 "transformer": {
+                    "label": "变压器类型",
                     "options": {
+                        "auto": "自耦变压器",
+                        "auxiliary": "辅助变压器",
                         "converter": "变流器",
                         "distribution": "配电变压器",
                         "generator": "发电机变压器",
                         "stratovolcano": "复合锥"
                     }
                 },
+                "voltage": {
+                    "label": "电压"
+                },
                 "voltage/primary": {
                     "label": "一次电压"
                 },
                 "wikipedia": {
                     "label": "维基百科"
                 },
+                "windings": {
+                    "label": "绕组数",
+                    "placeholder": "1, 2, 3..."
+                },
                 "windings/configuration": {
                     "label": "绕组配置",
                     "options": {
                     "terms": "牵绳"
                 },
                 "aerialway/station": {
-                    "name": "缆车站",
-                    "terms": "缆车站"
+                    "name": "缆车站"
                 },
                 "aerialway/t-bar": {
                     "name": "滑雪缆车",
                     "terms": "货币兑换"
                 },
                 "amenity/bus_station": {
-                    "name": "公交枢纽站",
-                    "terms": "公交车起止站,公交枢纽,公交场站,公交车站"
+                    "name": "公交车站 / 枢纽站"
                 },
                 "amenity/cafe": {
                     "name": "咖啡馆",
                     "terms": "快餐店"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "渡轮码头",
-                    "terms": "渡轮码头,轮船码头,码头"
+                    "name": "轮船渡口 / 码头"
                 },
                 "amenity/fire_station": {
                     "name": "消防站",
                     "name": "摩托车停车场",
                     "terms": "摩托车场"
                 },
+                "amenity/music_school": {
+                    "name": "音乐学校",
+                    "terms": "音乐学校,艺术学校"
+                },
                 "amenity/nightclub": {
                     "name": "夜总会",
                     "terms": "夜店,夜总会,舞厅,迪厅,酒吧"
                     "name": "野郊访客处",
                     "terms": "野郊访客处"
                 },
-                "amenity/recycling": {
-                    "name": "资源回收设施",
-                    "terms": "回收,循环利用,再造"
-                },
                 "amenity/recycling_centre": {
                     "name": "回收站",
                     "terms": "回收站,回收中心,循环中心,资源回收中心"
                     "name": "淋浴间",
                     "terms": "公共,浴室,淋浴,浴池,澡堂,洗澡,冲澡,冲凉,洗浴,搓澡,清洁,搓背,修脚,温泉,足浴,雨"
                 },
+                "amenity/smoking_area": {
+                    "name": "吸烟区域",
+                    "terms": "吸烟,抽烟,烟,香烟,烟草"
+                },
                 "amenity/social_facility": {
                     "name": "社会服务设施",
                     "terms": "社会服务设施,社会保障设施"
                     "terms": "住宅建筑物,住宅建筑"
                 },
                 "building/retail": {
-                    "name": "业建筑",
-                    "terms": "商业建筑"
+                    "name": "零售业建筑",
+                    "terms": "零售业建筑,百货"
                 },
                 "building/roof": {
                     "name": "开放式建筑",
                     "terms": "大棚,屋顶,上盖,开放式建筑"
                 },
+                "building/ruins": {
+                    "name": "建筑物遗迹",
+                    "terms": "遗迹,废墟,遗址,毁坏,考古,建筑,建筑物"
+                },
                 "building/school": {
                     "name": "学校建筑",
                     "terms": "学校,高中,初中,中学,小学,中专,建筑,教学楼,实验室,校舍,宿舍,学院,院校,校园,学习"
                     "terms": "俱乐部,社团,夜总会,会所,可乐部,社交,组织,娱乐,社区,会议,驿站,平台,会,汇,社会,文化,团体,会员"
                 },
                 "craft": {
-                    "name": "工艺",
-                    "terms": "工艺"
+                    "name": "工艺作坊",
+                    "terms": "工艺作坊,工场"
                 },
                 "craft/basket_maker": {
                     "name": "织篮人",
                     "name": "马道",
                     "terms": "马道"
                 },
+                "highway/bus_guideway": {
+                    "name": "导向巴士轨道",
+                    "terms": "导向,巴士,导轨,导轮,胶轮,公交,公交车,轨道"
+                },
                 "highway/bus_stop": {
-                    "name": "公交站",
-                    "terms": "公交车站,巴士站,公交停靠站"
+                    "name": "公交车站 / 站台"
                 },
                 "highway/corridor": {
                     "name": "室内走廊",
                     "terms": "路径"
                 },
                 "highway/pedestrian_area": {
-                    "name": "行人区域(广场)"
+                    "name": "行人区域(广场)",
+                    "terms": "公交,公交站,公交车,巴士,大巴,客车,车站,站台"
                 },
                 "highway/pedestrian_line": {
                     "name": "步行街"
                     "terms": "辅助道路"
                 },
                 "highway/service/alley": {
-                    "name": "胡同/弄堂",
+                    "name": "窄路 (机动车通行)",
                     "terms": "胡同,巷,弄堂,里弄,小巷,巷,弄,巷弄(可通行机动车)"
                 },
                 "highway/service/drive-through": {
                 },
                 "landuse/brownfield": {
                     "name": "棕土",
-                    "terms": "工商业使用过但被弃置的土地"
+                    "terms": "棕土,棕地,工商业使用过但被弃置的土地"
                 },
                 "landuse/cemetery": {
                     "name": "墓地",
                     "name": "森林",
                     "terms": "森林"
                 },
-                "landuse/garages": {
-                    "name": "车库",
-                    "terms": "车库, 停车间"
-                },
                 "landuse/grass": {
                     "name": "草坪",
                     "terms": "草地"
                     "terms": "矿场"
                 },
                 "landuse/railway": {
-                    "name": "铁路走廊",
+                    "name": "铁路用地",
                     "terms": "铁路用地"
                 },
                 "landuse/recreation_ground": {
                     "name": "会计师事务所"
                 },
                 "office/administrative": {
-                    "name": "行政楼",
-                    "terms": "行政楼"
+                    "name": "行政楼"
                 },
                 "office/adoption_agency": {
                     "name": "领养中介"
                 "office/charity": {
                     "name": "慈善机构"
                 },
-                "office/company": {
-                    "name": "公司",
-                    "terms": "公司"
-                },
                 "office/coworking": {
                     "name": "共享办公空间",
                     "terms": "共享办公空间"
                     "terms": "律师事务所"
                 },
                 "office/lawyer/notary": {
-                    "name": "公证处",
-                    "terms": "公证处,Notary Office"
+                    "name": "公证处"
                 },
                 "office/moving_company": {
                     "name": "搬家公司"
                 },
                 "office/newspaper": {
-                    "name": "报社"
+                    "name": "报社",
+                    "terms": "报社,通讯社"
                 },
                 "office/ngo": {
                     "name": "非政府组织",
                     "terms": "电信公司"
                 },
                 "office/therapist": {
-                    "name": "治疗师工作室"
+                    "name": "治疗师工作室",
+                    "terms": "理疗,医生,中医,推拿,整骨,医疗,治疗,医疗,医师,护士,医护,办公室,技师,医院"
                 },
                 "office/travel_agent": {
                     "name": "旅行社"
                     "terms": "村庄"
                 },
                 "playground/balance_beam": {
-                    "name": "跷跷板"
+                    "name": "跷跷板",
+                    "terms": "平衡木,独木桥,木桩,勇敢者道路,儿童,小孩,游乐,游乐设施,游乐园,游乐场,乐园,儿童乐园"
                 },
                 "playground/basket_spinner": {
                     "name": "网兜旋转器 (儿童游乐)",
                     "terms": "气垫,弹簧垫,弹簧,弹力,弹性,垫子,弹跳,蹦跳,跳,充气,充气城堡"
                 },
                 "playground/horizontal_bar": {
-                    "name": "平衡木"
+                    "name": "平衡木",
+                    "terms": "单杠,高低杠,杠子,横杠,铁棒,竞技,运动,体操,操场,回环,转体,摆荡,儿童,小孩,游乐,游乐设施,游乐园,游乐场,乐园,儿童乐园"
                 },
                 "playground/rocker": {
                     "name": "弹簧木马 (儿童游乐)",
                     "name": "变电站"
                 },
                 "power/substation": {
-                    "name": "变电",
+                    "name": "变电",
                     "terms": "变电站,配电所"
                 },
                 "power/tower": {
                     "terms": "高压电塔"
                 },
                 "power/transformer": {
-                    "name": "变电站",
+                    "name": "变压器",
                     "terms": "变电所"
                 },
+                "public_transport/linear_platform": {
+                    "name": "公共交通站 / 站台",
+                    "terms": "公共交通,车站,站台"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "缆车站 / 站台",
+                    "terms": "缆车,空中列车,车站,站台"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "公交车站 / 站台",
+                    "terms": "公交,公交站,公交车,巴士,大巴,客车,车站,站台"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "轮船渡口 / 站台",
+                    "terms": "轮船,渡轮,渡口,车站,站台"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "轻轨站 / 站台",
+                    "terms": "轻轨,地铁,捷运,铁路,车站,站台,月台"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "单轨列车站 / 站台",
+                    "terms": "单轨,列车,车站,站台,月台"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "地铁站 / 站台",
+                    "terms": "地铁,轻轨,捷运,铁路,车站,站台,月台"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "列车站 / 站台",
+                    "terms": "列车,火车,动车,高铁,铁路,车站,站台,月台"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "有轨电车站 / 站台",
+                    "terms": "电车,有轨电车,车站,站台"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "无轨电车站 / 站台",
+                    "terms": "电车,无轨电车,车站,站台"
+                },
                 "public_transport/platform": {
-                    "name": "公交站台",
-                    "terms": "平台,月台"
+                    "name": "公共交通站 / 站台",
+                    "terms": "公共交通,车站,站台"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "缆车站 / 站台",
+                    "terms": "缆车,空中列车,车站,站台"
+                },
+                "public_transport/platform_bus": {
+                    "name": "公交车站 / 站台",
+                    "terms": "公交,公交站,公交车,巴士,大巴,客车,车站,站台"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "轮船渡口 / 站台",
+                    "terms": "轮船,渡轮,渡口,车站,站台"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "轻轨站 / 站台",
+                    "terms": "轻轨,地铁,捷运,铁路,车站,站台,月台"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "单轨列车站 / 站台",
+                    "terms": "单轨,列车,车站,站台,月台"
+                },
+                "public_transport/platform_subway": {
+                    "name": "地铁站 / 站台",
+                    "terms": "地铁,轻轨,捷运,铁路,车站,站台,月台"
+                },
+                "public_transport/platform_train": {
+                    "name": "列车站 / 站台",
+                    "terms": "列车,火车,动车,高铁,铁路,车站,站台,月台"
+                },
+                "public_transport/platform_tram": {
+                    "name": "有轨电车站 / 站台",
+                    "terms": "电车,有轨电车,车站,站台"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "无轨电车站 / 站台",
+                    "terms": "电车,无轨电车,车站,站台"
+                },
+                "public_transport/station": {
+                    "name": "公共交通车站",
+                    "terms": "公共交通,车站"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "缆车站",
+                    "terms": "缆车,空中列车,车站"
+                },
+                "public_transport/station_bus": {
+                    "name": "公交车站 / 枢纽站",
+                    "terms": "公交,公交站,公交车,巴士,大巴,客车,车站,枢纽,枢纽站,终点站,站台"
+                },
+                "public_transport/station_ferry": {
+                    "name": "轮船渡口 / 码头",
+                    "terms": "轮船,渡轮,渡口,码头,车站"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "轻轨站",
+                    "terms": "轻轨,地铁,捷运,铁路,车站"
+                },
+                "public_transport/station_monorail": {
+                    "name": "单轨列车站",
+                    "terms": "单轨,列车,车站"
+                },
+                "public_transport/station_subway": {
+                    "name": "地铁站",
+                    "terms": "地铁,轻轨,捷运,铁路,车站"
+                },
+                "public_transport/station_train": {
+                    "name": "列车站",
+                    "terms": "列车,火车,火车站,动车,高铁,铁路,车站"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "列车站 (小站 / 招呼)",
+                    "terms": "列车,动车,铁路,车站"
+                },
+                "public_transport/station_tram": {
+                    "name": "有轨电车站",
+                    "terms": "电车,有轨电车,车站"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "无轨电车站 / 枢纽站",
+                    "terms": "电车,无轨电车,车站,枢纽,枢纽站,终点站,站台"
+                },
+                "public_transport/stop_area": {
+                    "name": "公共交通站点",
+                    "terms": "公共交通,站点,车站"
                 },
                 "public_transport/stop_position": {
-                    "name": "停车处",
-                    "terms": "停止位置"
+                    "name": "公共交通停泊点",
+                    "terms": "公共交通,停车点,泊位,停泊点,停车处"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "缆车停车点",
+                    "terms": "缆车,空中列车,停车点,停车处"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "公交停车点",
+                    "terms": "公交,公交站,巴士,停车处,停车点"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "轮船泊位",
+                    "terms": "轮船,泊位,停泊点,停车处,停车点"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "轻轨停车点",
+                    "terms": "轻轨,地铁,捷运,铁路,停车处,停车点"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "单轨列车停车点",
+                    "terms": "单轨,列车,停车处,停车点"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "地铁停车点",
+                    "terms": "地铁,轻轨,捷运,铁路,停车处,停车点"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "列车停车点",
+                    "terms": "列车,火车,动车,高铁,停车处,停车点"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "有轨电车停车点",
+                    "terms": "电车,有轨电车,停车处,停车点"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "无轨电车停车点",
+                    "terms": "电车,无轨电车,停车处,停车点"
                 },
                 "railway": {
                     "name": "铁路"
                     "terms": "缆车"
                 },
                 "railway/halt": {
-                    "name": "小火车站",
-                    "terms": "小火车站"
+                    "name": "列车站 (小站 / 招呼)"
                 },
                 "railway/level_crossing": {
                     "name": "铁路道口 (道路)",
                     "terms": "铁路道口,平交道口,铁路道口(道路)"
                 },
+                "railway/light_rail": {
+                    "name": "轻轨",
+                    "terms": "轻轨,地铁,地下铁,有轨,电车"
+                },
                 "railway/milestone": {
                     "name": "铁路里程碑",
                     "terms": "轨道,股道,铁轨,铁路,路轨,里程碑,里程,百米桩,桩,碑,界碑,火车,列车"
                 },
+                "railway/miniature": {
+                    "name": "微型铁路",
+                    "terms": "微型铁路,铁路,模型,小火车,玩具"
+                },
                 "railway/monorail": {
                     "name": "单轨铁路",
                     "terms": "单轨铁路"
                     "terms": "窄轨铁路,铁路"
                 },
                 "railway/platform": {
-                    "name": "月台",
-                    "terms": "站台,月台"
+                    "name": "火车站 / 站台"
                 },
                 "railway/rail": {
                     "name": "标准铁路",
                     "terms": "色灯,信号机,信号,灯,信号灯,红绿灯,表示器,轨道,股道,铁轨,铁路,路轨,火车,列车,调车,进站,出站"
                 },
                 "railway/station": {
-                    "name": "火车站",
-                    "terms": "火车站"
+                    "name": "火车站"
                 },
                 "railway/subway": {
                     "name": "地铁",
                     "terms": "电车"
                 },
                 "railway/tram_stop": {
-                    "name": "电车站",
-                    "terms": "电车,车站,有轨,无轨,站台,轨,辫子,交通,公共,轻铁,月台,站"
+                    "name": "有轨电车停车处"
                 },
                 "relation": {
                     "name": "关系",
                     "terms": "珠宝店"
                 },
                 "shop/kiosk": {
-                    "name": "报刊亭",
-                    "terms": "书报亭"
+                    "name": "售货亭",
+                    "terms": "售货亭,报刊亭,书报亭,售卖"
                 },
                 "shop/kitchen": {
                     "name": "厨房用品店",
                     "name": "骑行线路",
                     "terms": "骑行线路"
                 },
+                "type/route/light_rail": {
+                    "name": "轻轨线路",
+                    "terms": "轻轨,地铁,捷运,地下铁,火车,电车,列车,铁路,线路,路线"
+                },
                 "type/route/pipeline": {
                     "name": "管道线路",
                     "terms": "管道路线,管线,路线,线路"
                 },
+                "type/route/piste": {
+                    "name": "滑雪线路",
+                    "terms": "滑雪,雪橇,雪,滑降,滑冰,溜冰,线路,路线"
+                },
                 "type/route/power": {
                     "name": "电力线路",
                     "terms": "供电路线,电力路线,供电线路,路线,线路"
                     "name": "驾驶线路",
                     "terms": "行车路线,行车线路,驾驶路线,路线,线路"
                 },
+                "type/route/subway": {
+                    "name": "地铁线路",
+                    "terms": "地铁,地下铁,轻轨,重轨,快铁,捷运,火车,列车,铁路,线路,路线"
+                },
                 "type/route/train": {
                     "name": "列车线路",
                     "terms": "列车路线,火车,铁路,路线,线路"
                 "description": "Esri 世界影像",
                 "name": "Esri 世界影像"
             },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "条款与反馈"
+                },
+                "description": "比默认图层或许更为清晰准确的 Esri 归档影像。",
+                "name": "Esri 世界影像 (清晰) Beta"
+            },
             "MAPNIK": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "description": "OpenStreetMap 默认图层",
                 "name": "OpenStreetMap (标准)"
             },
             "OSM_Inspector-Addresses": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:地址"
             },
             "OSM_Inspector-Geometry": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:几何"
             },
             "OSM_Inspector-Highways": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:道路"
             },
             "OSM_Inspector-Multipolygon": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:区域(面)"
             },
             "OSM_Inspector-Places": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:地名"
             },
             "OSM_Inspector-Routing": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:路线"
             },
             "OSM_Inspector-Tagging": {
                 "attribution": {
-                    "text": "© Geofabrik有限公司, OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© Geofabrik 有限公司, OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OSM查看器:标签"
             },
                 "name": "TIGER 道路 2012"
             },
             "US-TIGER-Roads-2014": {
-                "description": "在缩放等级16级以上是来自美国人口调查局的公共领域地图数据。低缩放等级下仅包含自2006年以来的变更,不含已纳入OpenStreetMap的变更。",
+                "description": "在缩放等级16级以上是来自美国人口调查局的公共领域地图数据。低缩放等级下仅包含自2006年以来的变更,不含已纳入 OpenStreetMap 的变更。",
                 "name": "TIGER 道路 2014"
             },
             "US-TIGER-Roads-2017": {
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, 署名-相同方式共享3.0, 地图数据版权OpenStreetMap贡献者, 开放数据库授权1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap 贡献者, 署名-相同方式共享 3.0"
                 },
                 "name": "以路径表示的小路:自行车道"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, 署名-相同方式共享3.0, 地图数据版权OpenStreetMap贡献者, 开放数据库授权1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap 贡献者, 署名-相同方式共享 3.0"
                 },
                 "name": "以路径表示的小路:徒步"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, 署名-相同方式共享3.0, 地图数据版权OpenStreetMap贡献者, 开放数据库授权1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap 贡献者, 署名-相同方式共享 3.0"
                 },
                 "name": "以路径表示的小路:山地自行车"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, 署名-相同方式共享3.0, 地图数据版权OpenStreetMap贡献者, 开放数据库授权1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap 贡献者, 署名-相同方式共享 3.0"
                 },
                 "name": "以路径表示的小路:滑冰"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, 署名-相同方式共享3.0, 地图数据版权OpenStreetMap贡献者, 开放数据库授权1.0"
+                    "text": "© waymarkedtrails.org, OpenStreetMap 贡献者, 署名-相同方式共享 3.0"
                 },
                 "name": "以路径表示的小路:冬季运动"
             },
                 "attribution": {
                     "text": "basemap.at"
                 },
-                "description": "由basemap.at提供的正射影像图层,接替geoimage.at影像图层。",
-                "name": "basemap.at正射影像"
+                "description": "由 basemap.at 提供的正射影像图层,接替 geoimage.at 影像图层。",
+                "name": "basemap.at 正射影像"
             },
             "hike_n_bike": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者"
+                    "text": "© OpenStreetMap 贡献者"
                 },
                 "name": "徒步与自行车"
             },
             },
             "openpt_map": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OpenPT Map (叠加层)"
             },
             "osm-gps": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者"
+                    "text": "© OpenStreetMap 贡献者"
                 },
                 "description": "上传至 OpenStreetMap 的公开 GPS 轨迹",
                 "name": "OpenStreetMap GPS 轨迹"
             },
             "osm-mapnik-black_and_white": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OpenStreetMap(黑白标准)"
             },
             "osm-mapnik-german_style": {
                 "attribution": {
-                    "text": "© OpenStreetMap贡献者, 署名-相同方式共享"
+                    "text": "© OpenStreetMap 贡献者, 署名-相同方式共享"
                 },
                 "name": "OpenStreetMap(德国样式)"
             },
             "qa_no_address": {
                 "attribution": {
-                    "text": "© Simon Poole, 数据© OpenStreetMap贡献者"
+                    "text": "© Simon Poole, 数据 © OpenStreetMap 贡献者"
                 },
                 "name": "地址缺失质检"
             },
             "skobbler": {
                 "attribution": {
-                    "text": "© 瓦片 skobbler, 地图数据 OpenStreetMap贡献者"
+                    "text": "© 瓦片:skobbler 地图数据:OpenStreetMap 贡献者"
                 },
                 "name": "skobbler"
             },
             "stamen-terrain-background": {
                 "attribution": {
-                    "text": "地图瓦片由Stamen Design设计并以知识共享署名3.0协议授权"
+                    "text": "地图瓦片由 Stamen 设计,并以 署名 3.0 协议授权"
                 },
                 "name": "Stamen 地形"
             },
             "tf-cycle": {
                 "attribution": {
-                    "text": "地图© Thunderforest, 数据© OpenStreetMap贡献者"
+                    "text": "地图 © Thunderforest,数据 © OpenStreetMap 贡献者"
                 },
                 "name": "Thunderforest OpenCycleMap"
             },
             "tf-landscape": {
                 "attribution": {
-                    "text": "地图© Thunderforest, 数据© OpenStreetMap贡献者"
+                    "text": "地图 © Thunderforest,数据 © OpenStreetMap 贡献者"
                 },
                 "name": "Thunderforest 地貌"
             }
index 1814d6120e29e46f5c8ef8cf3ebfed8e629e89f9..3d746fd32cdd3c0dc2617bf905549d61ed8d3e29 100644 (file)
             "localized_translation_language": "選擇語言",
             "localized_translation_name": "名稱"
         },
+        "zoom_in_edit": "放大以編輯",
         "login": "登入",
         "logout": "登出",
         "loading_auth": "正在連接 OpenStreetMap...",
             "save": "上載",
             "cancel": "取消",
             "changes": "{count} 項變更",
+            "download_changes": "下載 osmChange 檔案",
             "warnings": "警告",
             "modified": "已修改",
             "deleted": "已刪除",
             "about_changeset_comments": "有關變動留言",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "你在這個留言內提及過Google:緊記絕對不可複製Google地圖的資料。",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "由{users}編輯",
                 "title": "測量",
                 "selected": "已選 {n} 項",
                 "geometry": "幾何",
-                "closed": "已關閉",
                 "center": "中心點",
                 "perimeter": "周界",
                 "length": "長度",
             "title": "背景",
             "description": "背景設定",
             "key": "B",
-            "percent_brightness": "{opacity}% 亮度",
             "none": "無",
             "best_imagery": "這地點最為人所知的背景影像",
             "switch": "切換回這個背景",
             "custom": "自訂",
             "custom_button": "編輯自訂背景",
-            "custom_prompt": "輸入區塊範本的網址。有效的標記是:\n- {zoom}/{z}, {x}, {y} 為 Z/X/Y 標記系統 Z/X/Y scheme\n- {ty} 為已翻轉的 TMS 形式Y座標 TMS-style Y coordinates\n- {u} 為四分位數標記系統 quadtile scheme\n- {switch:a,b,c} 為多工DNS伺服器\n\n例如 :\n{example}",
-            "fix_misalignment": "校正對位誤差",
-            "imagery_source_faq": "這個背景影像來自何處?",
             "reset": "重設",
-            "offset": "於以下灰色範圍內平移或者輸入以米量度的誤差值就可校正對位誤差。",
             "minimap": {
-                "description": "小地圖",
                 "tooltip": "顯示縮小地圖以確定現在被顯示範圍的位置",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "校正對位誤差",
+            "offset": "於以下灰色範圍內平移或者輸入以米量度的誤差值就可校正對位誤差。"
         },
         "map_data": {
             "title": "地圖資料",
             "description": "地圖資料",
             "key": "F",
             "data_layers": "資料圖層",
+            "layers": {
+                "osm": {
+                    "tooltip": "來自 OpenStreetMap 的地圖數據",
+                    "title": "OpenStreetMap 數據"
+                }
+            },
             "fill_area": "填滿範圍",
             "map_features": "地圖特徵",
             "autohidden": "由於太多東西出現在螢幕上,這些特徵已被自動隱藏。你可以放大來編輯它們。"
         "splash": {
             "welcome": "歡迎使用iD OpenStreetMap編輯器",
             "text": "iD是一個易用但功能強大的工具以便你可在世界上最好的免費地圖中作出貢獻。這個是版本{version}。你可在{website}得到更多資料和在{github}報告錯誤。",
-            "walkthrough": "開始新手教學"
+            "walkthrough": "開始新手教學",
+            "start": "立即編輯"
         },
         "source_switch": {
             "live": "實況模式",
             "untagged_area_tooltip": "選擇一個特徵種類來形容這個範圍是甚麼。",
             "untagged_relation": "未有標籤的關係",
             "untagged_relation_tooltip": "選擇一個特徵種類來形容這個關係是甚麼。",
-            "many_deletions": "你正在刪除 {n} 個特徵。你確定要這樣做嗎?這樣就會將人人在 openstreetmap.org 地圖內看到的物件刪除了。",
             "tag_suggests_area": "{tag}標籤建議綫應為範圍,但這不是一個範圍。",
             "deprecated_tags": "已棄用的標籤: {tags}"
         },
+        "zoom": {
+            "in": "放大",
+            "out": "縮小"
+        },
         "cannot_zoom": "在這個模式下不能再縮小。",
         "full_screen": "切換全螢幕",
         "gpx": {
         "mapillary": {
             "view_on_mapillary": "在Mapillary上觀看這影像"
         },
+        "openstreetcam": {
+            "view_on_openstreetcam": "在 OpenStreetCam 上觀看這影像"
+        },
         "help": {
             "title": "說明",
             "key": "H",
-            "help": "# 說明\n\n這是[OpenStreetMap]的編輯器 (http://www.openstreetmap.org/),\n免費而且可以編輯的世界地圖。你可以用來新增和更新\n在你附近的資料,令這個開放源碼和開放資料的地圖\n變得更好。\n你在這地圖裡所作的變更會令其他使用OpenStreetMap的人看得到。\n如要編輯,你需要[登入] (https://www.openstreetmap.org/login)。\n\n[iD 編輯器](http://ideditor.com/)是一個共同合作計劃,[原始碼可在GitHub找到](https://github.com/openstreetmap/iD)。\n",
-            "gps": "# GPS\n\nGPS 追蹤是OpenStreetMap 的寶貴資料來源。這個編輯器\n支援你電腦內的 `.gpx` 檔案。使用智能電話的\n一些應用程式或個人GPS更體就可以搜集得到\n這類的GPS軌跡。\n\n要知道如何運用GPS測量,\n請參閱[用智能電話、GPS或紙繪地圖](http://learnosm.org/en/mobile-mapping/)。\n\n要使用GPX的軌跡繪畫地圖,拖放GPX檔案到編輯器上。\n如辨認得到,它就會於地圖上新增為鮮紫色的綫。\n按'地圖資料'選單右側就可顯示、\n隱藏或縮放這個新的GPX圖層。\n\nGPX軌跡不會直接上載至 OpenStreetMap - 最好的用法\n就要用來繪畫新的地圖、協助你新增特徵、\n或者用來[上載至OpenStreetMap](http://www.openstreetmap.org/trace/create)\n供其他使用者使用。\n",
-            "imagery": "# 圖像\n\n航攝圖像是繪製地圖的重要資源。一系列的\n航攝圖像、衛星圖像和自由編輯的圖像資源\n可以從編輯器右方的'背景設定'選單中選擇。\n\n編輯器預設的衛星圖層是 [Bing Map](http://www.bing.com/maps/),\n但當你平移和縮放至一個新的地域,\n新的來源就可以使用。有一些國家,例如:\n美國、法國和丹麥當中的一些地方,會有高品質圖像。\n\n圖像有時與地圖資料有所偏差,這是由於圖像\n供應商的誤差。如果你看到很多的道路與圖像有平移錯位,\n不用立即移動它們以符合背景。你可以按背景設定底部的'校準'\n來調整圖像,讓它符合現有資料。\n",
-            "addresses": "# 地址\n\n地址是地圖中最有用的資訊之一。\n\n雖然地址常被用來表示為街道的一部分,但在OpenStreetMap中,它們亦會紀錄為街中建築物或地點的屬性。\n\n你可以增加地址至在地圖上的建築物輪廓\n或者是一個點。最合適的地址來源\n就是實地考察或者個人認知 —\n與其他特徵一樣,複製自其他商業來源,例如Google地圖,\n都是禁止的。\n",
-            "inspector": "# 使用檢視面版\n\n檢視面版位於畫面左側,\n你可用它編輯你選擇的特徵的詳細資料。\n\n### 選擇一個特徵種類\n\n當你新增了一個點、綫或範圍,你可以揀選它所屬的特徵,\n例如它是公路或住宅道路、起級市場或咖啡室。\n檢視面版會顯示常用的特徵種類按鈕,而你亦可\n利用尋找列搜尋其他的特徵。\n\n按一下在特徵種類按鈕右下角的 'i' ,\n就可知更多有關資訊。按一下按鈕就可選擇那個種類。\n\n### 使用表格和編輯標籤\n\n在你選擇了特徵種類後或者該特徵已有預設種類,\n檢視面版就會顯示一些相應的欄位,\n例如名稱和地址。\n\n在欄位下,你可以按一下 '新增欄位' 選單去新增\n其他資料,例如維基百科全書的連結、輪椅通道等等。\n\n於檢視面版的下方,按 '附加標籤' 就可以新增\n任意的標籤到那個物件。[Taginfo](http://taginfo.openstreetmap.org/) 可以\n提供大量有關常用標籤的組合。\n\n你在檢視面版所作的變更都會自動套用到地圖。\n你可以按 '復原' 按鈕在復原它們。\n"
+            "help": {
+                "title": "說明",
+                "open_data_h": "開放數據",
+                "before_start_h": "在你開始之前",
+                "open_source_h": "開放來源"
+            },
+            "overview": {
+                "title": "概覽",
+                "navigation_h": "導覽",
+                "features_h": "地圖特徵"
+            },
+            "editing": {
+                "title": "編輯及儲存",
+                "select_h": "選擇",
+                "save_h": "儲存",
+                "upload_h": "上載",
+                "backups_h": "自動備份",
+                "keyboard_h": "鍵盤快速鍵"
+            },
+            "feature_editor": {
+                "title": "特徵編輯器",
+                "type_h": "特徵種類"
+            },
+            "points": {
+                "title": "點",
+                "intro": "*點*是用來表示如商店、餐廳和紀念碑這些特徵,它們用來標示一個特定位置和描述那裏有甚麼。",
+                "add_point_h": "新增點",
+                "move_point_h": "移動點",
+                "delete_point_h": "刪除點"
+            },
+            "lines": {
+                "title": "綫",
+                "add_line_h": "新增綫",
+                "modify_line_h": "修改綫"
+            }
         },
         "intro": {
             "done": "完成",
             },
             "areas": {
                 "title": "範圍",
-                "add_playground": "*範圍*可以用來顯示特徵邊界,例如湖泊、建築物和住宅區。 {br}另外它亦可以用作更詳盡表示特徵,代替只用點來表示的特徵。**按{button}範圍按鈕來新增範圍。**",
                 "start_playground": "讓我們用範圍這方法來新增遊樂場吧。範圍是由增加特徵外圍的*點*來繪製。**點或是按空白鍵來放起始點至遊樂場的一角上。**",
                 "continue_playground": "繼續在遊樂場邊界上放更多點來繪製範圍。如果遇到現有的行人徑,你也可以連接上。{br}貼士:你可以按住 '{alt}' 鍵防止點連到其他特徵。 **繼續繪製遊樂場範圍。**",
                 "finish_playground": "按enter鍵或是在第一個或最後一個點再按一下就可完成編輯範圍。**完成繪製遊樂場範圍**",
                 "aeroway": {
                     "label": "種類"
                 },
+                "agrarian": {
+                    "label": "產品"
+                },
                 "amenity": {
                     "label": "種類"
                 },
                 "board_type": {
                     "label": "種類"
                 },
+                "boules": {
+                    "label": "種類"
+                },
                 "boundary": {
                     "label": "種類"
                 },
                 "bunker_type": {
                     "label": "種類"
                 },
+                "cables": {
+                    "label": " 電纜",
+                    "placeholder": "1, 2, 3..."
+                },
                 "camera/direction": {
                     "label": "方向 (順時針度數)",
                     "placeholder": "45, 90, 180, 270"
                     "label": "容納",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向",
-                    "options": {
-                        "E": "東",
-                        "ENE": "東北偏東",
-                        "ESE": "東南偏東",
-                        "N": "北",
-                        "NE": "東北",
-                        "NNE": "東北偏北",
-                        "NNW": "西北偏北",
-                        "NW": "西北",
-                        "S": "南",
-                        "SE": "東南",
-                        "SSE": "東南偏南",
-                        "SSW": "西南偏南",
-                        "SW": "西南",
-                        "W": "西",
-                        "WNW": "西北偏西",
-                        "WSW": "西南偏西"
-                    }
-                },
                 "castle_type": {
                     "label": "種類"
                 },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "逆時針",
-                        "clockwise": "順時針"
-                    }
-                },
                 "clothes": {
                     "label": "衣物"
                 },
                 "craft": {
                     "label": "種類"
                 },
+                "crane/type": {
+                    "label": "起重機種類",
+                    "options": {
+                        "floor-mounted_crane": "坐地式起重機",
+                        "portal_crane": "流動起重機",
+                        "travel_lift": "活動式起重機"
+                    }
+                },
                 "crop": {
                     "label": "農作物"
                 },
                 "description": {
                     "label": "描述"
                 },
+                "devices": {
+                    "label": "裝置",
+                    "placeholder": "1, 2, 3..."
+                },
                 "diaper": {
                     "label": "設有換片設備"
                 },
                         "wall": "牆上"
                     }
                 },
+                "fitness_station": {
+                    "label": "設備種類"
+                },
                 "fixme": {
                     "label": "整好我"
                 },
                     "label": "類",
                     "placeholder": "預設"
                 },
+                "frequency": {
+                    "label": "操作頻率"
+                },
                 "fuel": {
                     "label": "燃料"
                 },
                 "generator/type": {
                     "label": "種類"
                 },
+                "government": {
+                    "label": "種類"
+                },
                 "grape_variety": {
                     "label": "葡萄種類"
                 },
                     "label": "扶手"
                 },
                 "hashtags": {
+                    "label": "建議的主題標籤",
                     "placeholder": "#例子"
                 },
                 "healthcare": {
                 "inscription": {
                     "label": "碑文"
                 },
+                "intermittent": {
+                    "label": "間中"
+                },
                 "internet_access": {
                     "label": "用到互聯網",
                     "options": {
                 "maxweight": {
                     "label": "最大承重"
                 },
-                "milestone_position": {
-                    "label": "里程碑位置",
-                    "placeholder": "距離準確至一個小數位 (123.4)"
+                "memorial": {
+                    "label": "種類"
+                },
+                "monitoring_multi": {
+                    "label": "監測"
                 },
                 "mtb/scale": {
                     "label": "越野單車徑難度",
                     "label": "標準桿",
                     "placeholder": "3, 4, 5..."
                 },
-                "parallel_direction": {
-                    "label": "方向",
-                    "options": {
-                        "backward": "後向",
-                        "forward": "前向"
-                    }
-                },
                 "park_ride": {
                     "label": "泊車轉乘"
                 },
                 "payment_multi": {
                     "label": "付款種類"
                 },
+                "phases": {
+                    "label": "相位",
+                    "placeholder": "1, 2, 3..."
+                },
                 "phone": {
                     "label": "電話",
                     "placeholder": "+852 12345678"
                     "label": "電力輸出",
                     "placeholder": "500 MW, 1000 MW, 2000 MW..."
                 },
+                "playground/baby": {
+                    "label": "嬰兒座位"
+                },
+                "playground/max_age": {
+                    "label": "最大年齡"
+                },
+                "playground/min_age": {
+                    "label": "最小年齡"
+                },
                 "population": {
                     "label": "人口"
                 },
                 "railway": {
                     "label": "類別"
                 },
+                "rating": {
+                    "label": "電力功率"
+                },
                 "recycling_accepts": {
                     "label": "接受"
                 },
-                "recycling_type": {
-                    "label": "回收種類",
-                    "options": {
-                        "centre": "回收中心",
-                        "container": "回收箱"
-                    }
-                },
                 "ref": {
                     "label": "參考編號"
                 },
                     },
                     "placeholder": "未知"
                 },
+                "structure_waterway": {
+                    "options": {
+                        "tunnel": "隧道"
+                    },
+                    "placeholder": "未知"
+                },
                 "studio": {
                     "label": "種類"
                 },
+                "substance": {
+                    "label": "物質"
+                },
                 "substation": {
                     "label": "種類"
                 },
                 "surveillance/zone": {
                     "label": "監視區域"
                 },
+                "switch": {
+                    "label": "種類"
+                },
                 "tactile_paving": {
                     "label": "盲人引路徑"
                 },
                     },
                     "placeholder": "實心、接近實心、柔性..."
                 },
+                "trade": {
+                    "label": "種類"
+                },
                 "traffic_calming": {
                     "label": "種類"
                 },
                     },
                     "placeholder": "優良、好、差勁..."
                 },
+                "transformer": {
+                    "label": "種類"
+                },
                 "trees": {
                     "label": "樹"
                 },
                         "street": "5 至 20米 (16 至 65呎)"
                     }
                 },
+                "volcano/type": {
+                    "label": "火山種類"
+                },
                 "wall": {
                     "label": "種類"
                 },
                 },
                 "wikipedia": {
                     "label": "維基百科全書"
+                },
+                "windings": {
+                    "placeholder": "1, 2, 3..."
                 }
             },
             "presets": {
                     "terms": "牽繩"
                 },
                 "aerialway/station": {
-                    "name": "纜車站",
-                    "terms": "纜車車站"
+                    "name": "纜車站"
                 },
                 "aerialway/t-bar": {
                     "name": "T型吊桿",
                     "terms": "錢幣兌換,換錢"
                 },
                 "amenity/bus_station": {
-                    "name": "巴士站",
-                    "terms": "巴士站"
+                    "name": "巴士總站"
                 },
                 "amenity/cafe": {
                     "name": "茶座",
                     "terms": "Fast Food,快餐店,速食店"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "客運碼頭",
-                    "terms": "客運碼頭,客運渡輪碼頭,渡輪碼頭"
+                    "name": "客運碼頭"
                 },
                 "amenity/fire_station": {
                     "name": "消防局",
                     "name": "郊野公園遊客中心",
                     "terms": "Ranger Station,郊野公園管理站,郊野公園訪客中心"
                 },
-                "amenity/recycling": {
-                    "name": "回收設施",
-                    "terms": "Recycling,回收桶,回收箱,廢物回收桶"
-                },
                 "amenity/recycling_centre": {
                     "name": "回收中心",
                     "terms": "Recycling Center, 廢物回收中心, 資源回收中心"
                     "name": "輸血中心",
                     "terms": "捐血中心,獻血中心"
                 },
+                "healthcare/midwife": {
+                    "name": "助產士",
+                    "terms": "Midwife,助產士"
+                },
+                "healthcare/occupational_therapist": {
+                    "name": "職業治療師",
+                    "terms": "Occupational Therapist,職業治療師"
+                },
+                "healthcare/optometrist": {
+                    "name": "視光師",
+                    "terms": "Optometrist,視光師"
+                },
+                "healthcare/physiotherapist": {
+                    "name": "物理治療師",
+                    "terms": "Physiotherapist,物理治療師"
+                },
+                "healthcare/podiatrist": {
+                    "name": "足病診療師",
+                    "terms": "Podiatrist,足病診療師,足療師,足部診療師,足部治療師"
+                },
+                "healthcare/psychotherapist": {
+                    "name": "心理治療師",
+                    "terms": "Psychotherapist,心理治療師"
+                },
+                "healthcare/rehabilitation": {
+                    "name": "復康設施",
+                    "terms": "Rehabilitation Facility,康復設施"
+                },
                 "healthcare/speech_therapist": {
                     "name": "言語治療師",
                     "terms": "Speech Therapist,語言治療師"
                     "terms": "Bridle Path,馬徑,馬道,策騎徑"
                 },
                 "highway/bus_stop": {
-                    "name": "巴士站",
-                    "terms": "Bus Stop,公交車站,公共汽車站,巴士站"
+                    "name": "巴士站 / 月台"
                 },
                 "highway/corridor": {
                     "name": "室內走廊",
                     "name": "十字路口",
                     "terms": "十字路口"
                 },
+                "highway/crossing-raised": {
+                    "name": "隆起的過路處",
+                    "terms": "Raised Street Crossing,隆起的過路處"
+                },
                 "highway/crosswalk": {
                     "name": "行人過路處",
                     "terms": "行人過路線"
                 },
+                "highway/crosswalk-raised": {
+                    "name": "隆起的行人過路處",
+                    "terms": "Raised Pedestrian Crosswalk,隆起的行人過路處"
+                },
                 "highway/cycleway": {
                     "name": "單車徑",
                     "terms": "Cycle Path,單車徑,自行車道"
                     "name": "路徑",
                     "terms": "Path,徑,路徑"
                 },
+                "highway/pedestrian_area": {
+                    "name": "行人專用區",
+                    "terms": "Pedestrian Area,徒步區"
+                },
+                "highway/pedestrian_line": {
+                    "name": "行人專用街道",
+                    "terms": "Pedestrian Street,行人專用街道"
+                },
                 "highway/primary": {
                     "name": "市區幹道",
                     "terms": "Primary Road,主要道路,大路"
                     "name": "盆地",
                     "terms": "Basin,水池,盆地"
                 },
+                "landuse/brownfield": {
+                    "name": "棕地",
+                    "terms": "Brownfield,棕地"
+                },
                 "landuse/cemetery": {
                     "name": "墳場",
                     "terms": "Cemetery,墓地,墳場"
                     "name": "森林",
                     "terms": "Forest,森,森林"
                 },
-                "landuse/garages": {
-                    "name": "車庫",
-                    "terms": "Garage,車房"
-                },
                 "landuse/grass": {
                     "name": "草地",
                     "terms": "Grass,草地"
                 },
+                "landuse/greenfield": {
+                    "name": "未開墾土地",
+                    "terms": "Greenfield,未開墾土地,未開發地帶"
+                },
+                "landuse/greenhouse_horticulture": {
+                    "name": "溫室園藝",
+                    "terms": "Greenhouse Horticulture,溫室園藝"
+                },
                 "landuse/harbour": {
                     "name": "海港",
                     "terms": "Harbor, Harbour, 海港, 港灣"
                     "name": "工業區",
                     "terms": "工業區, 工業村, 工業邨"
                 },
+                "landuse/industrial/scrap_yard": {
+                    "name": "廢料場",
+                    "terms": "Scrap Yard, 廢車場, 廢物場"
+                },
+                "landuse/industrial/slaughterhouse": {
+                    "name": "屠場",
+                    "terms": "Slaughterhouse,屠宰場"
+                },
                 "landuse/landfill": {
                     "name": "堆填區",
                     "terms": "垃圾堆填區,填土區,填築地"
                     "name": "遊樂場",
                     "terms": "遊樂園"
                 },
+                "landuse/religious": {
+                    "name": "宗教用地",
+                    "terms": "Religious Area,宗教設施用地"
+                },
                 "landuse/residential": {
                     "name": "住宅區",
                     "terms": "住宅用地, 住宅地"
                     "name": "戶外健體站",
                     "terms": "Outdoor Fitness Station, 健體站, 健身站"
                 },
+                "leisure/fitness_station/balance_beam": {
+                    "name": "平衡木",
+                    "terms": "Exercise Balance Beam,平衡木"
+                },
+                "leisure/fitness_station/box": {
+                    "name": "健身箱",
+                    "terms": "Exercise Box,運動箱"
+                },
+                "leisure/fitness_station/horizontal_bar": {
+                    "name": "平衡單槓",
+                    "terms": "Exercise Horizontal Bar,健身平衡單槓"
+                },
+                "leisure/fitness_station/horizontal_ladder": {
+                    "name": "馬騮架",
+                    "terms": "Exercise Monkey Bars,橫爬架"
+                },
                 "leisure/garden": {
                     "name": "花園",
                     "terms": "Garden,公園,果園,植物園,花園,菜園"
                     "terms": "Office,寫字樓,辦公室"
                 },
                 "office/administrative": {
-                    "name": "行政樓",
-                    "terms": "Administrative Office,行政樓"
-                },
-                "office/company": {
-                    "name": "公司辦事處",
-                    "terms": "Company Office,公司,公司寫字樓"
+                    "name": "行政樓"
                 },
                 "office/coworking": {
                     "name": "共同工作空間",
                     "terms": "Law Office,律師事務所"
                 },
                 "office/lawyer/notary": {
-                    "name": "公證行",
-                    "terms": "Notary Office,公證人"
+                    "name": "公證行"
                 },
                 "office/ngo": {
                     "name": "非政府機構辦公室",
                     "name": "變壓器",
                     "terms": "Transformer,火牛房,變電所"
                 },
-                "public_transport/platform": {
-                    "name": "月台",
-                    "terms": "Platform,月台,月臺"
-                },
-                "public_transport/stop_position": {
-                    "name": "停車位置",
-                    "terms": "Stop Position,停止位置"
-                },
                 "railway": {
                     "name": "鐵路"
                 },
                     "name": "纜索鐵道",
                     "terms": "纜索鐵道, 索道, 纜車"
                 },
-                "railway/halt": {
-                    "name": "火車細站",
-                    "terms": "Railway Halt,小火車站,火車站仔,火車細站"
-                },
                 "railway/level_crossing": {
                     "name": "鐵路交滙處 (道路)",
                     "terms": "Railway Crossing (Road), 鐵路交滙處 (道路)"
                     "name": "窄軌鐵路",
                     "terms": "窄軌鐵路, 窄軌鐵道"
                 },
-                "railway/platform": {
-                    "name": "鐵路月台",
-                    "terms": "Railway Platform,月臺,站臺,鐵道月台"
-                },
                 "railway/rail": {
                     "name": "路軌",
                     "terms": "Rail,火車軌,路軌,軌,鐵軌"
                     "name": "鐵路訊號",
                     "terms": "Railway Signal,鐵道信號,鐵路信號"
                 },
-                "railway/station": {
-                    "name": "火車站",
-                    "terms": "Railway Station,火車站,鐵路站"
-                },
                 "railway/subway": {
                     "name": "地下鐵",
                     "terms": "MTR,Mass Transit Railway,Subway,地下鐵,地下鐵路,地鐵,捷運"
                     "name": "電車",
                     "terms": "Tram,電車"
                 },
-                "railway/tram_stop": {
-                    "name": "電車站",
-                    "terms": "Tram Stop, 電車站"
-                },
                 "relation": {
                     "name": "關係",
                     "terms": "Relation,關係,關系"
                     "name": "珠寶店",
                     "terms": "Jeweler,珠寶店,珠寶舖,珠寶金行,首飾店,首飾舖,金舖"
                 },
-                "shop/kiosk": {
-                    "name": "報紙亭",
-                    "terms": "報紙檔,報紙檔攤,報紙攤檔,報刊檔"
-                },
                 "shop/kitchen": {
                     "name": "廚房設計店",
                     "terms": "廚房設計店"
                 "description": "Premium DigitalGlobe 衛星圖",
                 "name": "DigitalGlobe Premium 航攝圖"
             },
+            "DigitalGlobe-Premium-vintage": {
+                "attribution": {
+                    "text": "條款和意見"
+                },
+                "description": "航攝邊界及拍攝日期。標籤會在縮放第14級或更高時顯示。",
+                "name": "DigitalGlobe Premium 舊航攝圖"
+            },
             "DigitalGlobe-Standard": {
                 "attribution": {
                     "text": "條款和意見"
                 "description": "Standard DigitalGlobe 衛星圖",
                 "name": "DigitalGlobe Standard 航攝圖"
             },
+            "DigitalGlobe-Standard-vintage": {
+                "attribution": {
+                    "text": "條款和意見"
+                },
+                "description": "航攝邊界及拍攝日期。標籤會在縮放水平14或以上時顯示。",
+                "name": "DigitalGlobe Standard 舊航攝圖"
+            },
             "EsriWorldImagery": {
                 "attribution": {
                     "text": "條款和意見"
                 },
                 "name": "OSM 檢查器:標籤"
             },
+            "US-TIGER-Roads-2012": {
+                "name": "TIGER Roads 2012"
+            },
+            "US-TIGER-Roads-2014": {
+                "description": "在縮放水平16以上,公共地圖數據乃來自美國人口普查。 在較低的縮放水平時,OpenStreetMap只包括自2006年之前的變更",
+                "name": "TIGER Roads 2014"
+            },
+            "US-TIGER-Roads-2017": {
+                "description": "黃色 = 來自美國人口普查的公共地圖數據。紅色 = 在OpenStreetMap找不到數據",
+                "name": "TIGER Roads 2017"
+            },
             "Waymarked_Trails-Cycling": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 地圖資料 OpenStreetMap 貢獻者, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: 單車"
             },
             "Waymarked_Trails-Hiking": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 地圖資料 OpenStreetMap 貢獻者, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: 遠足"
             },
             "Waymarked_Trails-MTB": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 地圖資料 OpenStreetMap 貢獻者, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: 越野單車"
             },
             "Waymarked_Trails-Skating": {
-                "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0, 地圖資料 OpenStreetMap 貢獻者, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: 溜冰"
             },
             "Waymarked_Trails-Winter_Sports": {
-                "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0, 地圖資料 OpenStreetMap 貢獻者, ODbL 1.0"
-                },
                 "name": "Waymarked Trails: 冬季運動"
             },
             "basemap.at": {
index 144fb3900a62c24b54f4e6ae88bb7c2b2b8c536f..13d3598e81cf08ff44ae6edd07c7652ad8b4658d 100644 (file)
@@ -25,6 +25,9 @@
             },
             "draw_line": {
                 "tail": "點擊地圖以添加線段的其它節點。點擊其他線段以連接它們,點擊兩下以完成線段的繪製。"
+            },
+            "drag_node": {
+                "connected_to_hidden": "這個沒辦法被編輯,因其與其他隱藏的圖徵相連"
             }
         },
         "operations": {
             "about_changeset_comments": "關於編輯變動",
             "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments",
             "google_warning": "您在此留言中提到了 Google:請注意從 Google 地圖是嚴格禁止的。",
-            "google_warning_link": "http://www.openstreetmap.org/copyright"
+            "google_warning_link": "https://www.openstreetmap.org/copyright"
         },
         "contributors": {
             "list": "正顯示 {users} 的編輯",
                 "title": "測量",
                 "selected": "{n} 被選擇",
                 "geometry": "形狀",
-                "closed": "已關閉",
+                "closed_line": "封閉線段",
+                "closed_area": "封閉區域",
                 "center": "中心",
                 "perimeter": "周長",
                 "length": "長度",
                 "centroid": "質心",
                 "location": "位置",
                 "metric": "公制",
-                "imperial": "英制"
+                "imperial": "英制",
+                "node_count": "節點數目"
             }
         },
         "geometry": {
             "title": "背景",
             "description": "背景圖像設定",
             "key": "B",
-            "percent_brightness": "{opacity}%的亮度",
+            "backgrounds": "背景",
             "none": "無",
             "best_imagery": "這個地點已知最佳的影像來源",
             "switch": "切換回此背景",
             "custom": "客製化",
             "custom_button": "編輯自訂的背景",
-            "custom_prompt": "輸入圖磚 URL 範本。有效的代號是:\n   - {zoom}/{z}, {x}, {y} 給 Z/X/Y 結構\n   - {ty} 給 TMS 樣式的 Y 座標\n   - {u} 給 quadtile 結構使用\n   - {switch:a,b,c} 給 DNS 伺服器多路通訊使用\n\n範例:\n{example}",
-            "fix_misalignment": "調整影像偏移",
-            "imagery_source_faq": "影像是從那裡來的呢?",
+            "custom_prompt": "輸入標題網址模版。有效的代碼是: \n- {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n- {-y} or {ty} for flipped TMS-style Y coordinates\n- {u} for quadtile scheme\n- {switch:a,b,c} for DNS server multiplexing\n\n範例:\n{example}",
+            "overlays": "覆疊",
+            "imagery_source_faq": "影像資訊 / 問題回報",
             "reset": "重設",
-            "offset": "在灰色區域內拖拉調整影像偏移,或是輸入偏移公尺數。",
+            "display_options": "顯示設定",
+            "brightness": "亮度",
+            "contrast": "對比",
+            "saturation": "飽和度",
+            "sharpness": "銳利度",
             "minimap": {
-                "description": "小地圖",
+                "description": "顯示小地圖",
                 "tooltip": "顯示縮小的地圖幫助你確認所在區域的位置",
                 "key": "/"
-            }
+            },
+            "fix_misalignment": "調整影像偏移",
+            "offset": "在灰色區域內拖拉調整影像偏移,或是輸入偏移公尺數。"
         },
         "map_data": {
             "title": "地圖圖資",
             "status_code": "伺服器傳回的狀態碼{code}",
             "unknown_error_details": "請確定你已經連上網路。",
             "uploading": "正在上傳修改至 OpenStreetMap...",
+            "conflict_progress": "檢查衝突:{total} 中的 {num}",
             "unsaved_changes": "你有未儲存的編輯",
             "conflict": {
                 "header": "解決編輯衝突",
             "untagged_area_tooltip": "選擇適當的物件種類描述這區域是什麼。",
             "untagged_relation": "未標記的關係",
             "untagged_relation_tooltip": "選取一個可以適當地描述這個關係的圖徽類型。",
-            "many_deletions": "您正要刪除 {n} 個圖徽。您確定您要這麼做嗎?這將會把它們從每個人都看到的 openstreetmap.org 的地圖上刪除。",
+            "many_deletions": "您正要刪除 {n} 個圖徽:{p} 個節點、{l} 條線段、{a} 個區域、{r} 個關係。您確定您要這麼做嗎?這將會把它們從每個人都看得到的 openstreetmap.org 的地圖上刪除。",
             "tag_suggests_area": "{tag} 標籤所建議的線段應為區域,但這個不是一區域",
             "deprecated_tags": "已棄用的標籤︰{tags}"
         },
         "help": {
             "title": "說明文件",
             "key": "H",
-            "help": "# 說明\n\n這是[開放街圖](http://www.openstreetmap.org/)的編輯器。\n開放街圖是自由及可編輯的世界地圖。您可以用這個編輯器來添加和更新您所在區域的地圖資料,令這個開源和開放資料的世界地圖變得更好。\n\n您在地圖上所做的編輯,將會讓所有使用開放街圖的人看到。為了編輯,您需要先[登入](https://www.openstreetmap.org/login)。\n\n[iD編輯器](http://ideditor.com/) 採用開源方式合作開發的專案, [原始碼可在GitHub找到](https://github.com/openstreetmap/iD)。\n",
-            "editing_saving": "# 編輯和儲存\n\n這個編輯器設計上主要為了在線上運作,現在你正透過網路連線在網路上存取它。\n\n### 選擇圖徵\n\n要選擇圖徵,像是道路或是興趣點,請點一下地圖。\n這會高亮度顯示選擇的圖徵,並且開啟有詳細資訊的面版,\n顯示所有你能對圖徵做的動作。\n要選擇多個圖徵,你必須按住'Shift'鍵。\n接著按你想選擇的圖徵,或是拖拉地圖來畫出長方形。\n這樣做會畫出方框選擇所有在範圍裡的點。\n\n### 儲存編輯\n\n當你編輯道路、建築和地方等變動時,\n這些資料會儲存在本地空間,直到你上傳到伺服器。\n不要擔心你可能會犯錯,你可以按復原按鈕恢復變動,\n以及按重覆按鍵重覆動作。\n\n按'儲存'結束這一串編輯 - 舉例來說,\n如果你完成繪製城鎮裡的一區,想要開始畫新的一區。你有機會回顧先前你做的事情,而編輯器提供有用的建議,\n而且如果出錯時會警告。\n\n如果所有東西都看起來都好的時候,你可以輸入簡短的評論,解釋你的變動,\n接著再次按'儲存'輸出變動到[OpenStreetMap.org](http://www.openstreetmap.org/),\n之後會讓大家都看得到,並且繼續繪製和改進。\n如果你無法在一次的時間裡完成編輯,你可以關係編輯器視窗,之後再回來 (相同瀏覽器和電腦),\n編輯器程式會詢問你是否恢復你的工作。\n\n### 使用編輯器\n\n你可以按 `?`顯示鍵盤快速鍵清單。\n",
-            "roads": "# 道路\n\n您可以利用這個編輯器創建,修復,及刪除道路。道路可以有很多種:行人路徑,公路,步道,單車路線等等 - 任何經常使用的路段都可製圖。\n\n### 選擇道路\n\n按圖上的道路以選擇該道路。道路的輪廓會以高亮度顯示,而同時地圖上會出現小工具選單,旁邊亦會彈出面板,顯示有關該道路的資訊。\n\n### 修改道路\n\n您或會經常注意到,道路並非對齊在背景中顯示的衛星圖像或GPS軌跡。您可以調整這些道路,讓他們位於正確的位置。\n\n首先,按您想修訂的道路。這會將道路以高亮度顯示,並顯示沿著這道路的節點,你可以拖曳這些節點到更好的位置。如果您想增加細節,可以為道路添加新的節點,點擊兩下道路上沒有節點的部分,便可在該處増加節點。\n\n如果道路連接到另一條道路,但在地圖上並未妥善連接,你可以拖曳道路的其中一個節點到另一條道路上,以連接兩條道路。連接好道路,對地圖非常重要,特別是對提供駕駛指示的應用程序而言,是必要的。\n\n您也可以按下'移動'工具或按`M`快速鍵,來移動整條道路,然後按一下以完成移動的動作。\n\n### 刪除道路\n\n如果一條道路完全不正確 - 您看到它在衛星圖像上不存在,並最好實地證實它根本不存在 - 您可以將道路刪除,這會從地圖中將之移除。刪除物件時務必要小心 - 像任何其他的編輯,結果會被大家看見,而衛星圖像往往會過時,因此該道路或許只是新建的。\n\n要刪除道路,您可以按住它以選擇,然後按下垃圾桶圖標,或按 ’Delete’ 鍵。\n\n### 繪製新道路\n\n發現某處應有一條道路,但地圖上沒有?按編輯器左上方的'線'按鈕,或按下`2`快速鍵,以開始繪製線段。\n\n在地圖上點擊道路的開端,以開始繪製道路。如果道路從一條現有的道路分支出來,應點擊兩者連接的地方,以開始繪製。\n\n然後按住沿著道路的點,以根據衛星影像或GPS軌跡,正確地繪製道路。如果您繪製的道路如果與另一條道路交匯,請點擊相交點以將它們連接起來。當您完成繪製後,可按兩下滑鼠或按鍵盤上的 'Return' 或 ’Enter’ 鍵。\n\n",
-            "gps": "# GPS\n\nGPS 資料是 OpenStreetMap 最可靠的資料來源. 這個編輯器支援 `.gpx` 的軌跡檔。 你可以使用智慧型手機的程式或個人 GPS 硬體去搜集。\n\n關於如何進行 GPS 資料搜集, 可參考 [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/)。\n\n當要使用 GPX 軌跡檔去繪圖時,你可以直接拖拉 GPX 檔案至地圖編輯器上,如果編輯器識別到軌跡檔時,它將用亮紫色把軌跡顯示在地圖上。你可以點擊右側的 'Map Data' 選單去顯示、隱藏或縮放這個軌跡所產生的圖層。\n\n這個 GPX 軌跡並沒有上傳至 OpenStreetMap,但這種方式適合於當你想把軌跡當成參考資料去繪製新的地圖時,當然你也可以[上傳軌跡至 OpenStreetMap](http://www.openstreetmap.org/trace/create) 供其它人使用。\n",
-            "imagery": "# 圖像\n\n空照圖是繪製地圖重要的資料來源。在畫面右方的'背景圖像設定'選單中,可選擇使用的圖像,\n他們分別為空照圖、衛星影像和其他可自由編輯的圖像資源。\n\n編輯器預設使用[Bing Maps](http://www.bing.com/maps/)的衛星圖層,\n但當您平移或縮放地圖至一個新的地理區域,或可使用新的資源。\n在一些國家,像美國、法國和丹麥,部分區域有非常高品質的圖像。\n\n圖像會與地圖數據有所偏移。如果你看見很多的道路與背景有偏移,請不要立刻將它們全部搬移以與背景刎合。相反,你可以在「背景設定」選單中,點擊下方的「校準底圖」,以調整圖像以配合現有地圖數據。\n\n圖像有時候或會因為圖像提供者方面的誤差,與地圖資料有所偏移。\n如果您看到有很多路與背景是平移錯位的,請不要立刻將它們全部搬移以與背景刎合。\n您只需要點擊圖像設定介面底部的'校準'來調整圖像,讓它符合現有資料。\n",
-            "addresses": "# 地址\n\n地址是地圖中最有用的訊息之一。\n\n雖然地址通常被視為街道的一部分,在 OpenStreetMap 中,它們是沿相關街道的建築物和地方的屬性。\n\n您可以將地址訊息,添加到以建築物輪廓為代表、或以點為代表的地方之上。地址資料的最佳來源,是實地調查或個人知識 - 與任何其他物件一樣,嚴格禁止抄襲商業來源(如Google 地圖)的地圖資料。\n",
-            "inspector": "# 使用檢視面板\n檢視面板是畫面右面的用戶界面元素,當您選擇一個物件時便會出現,讓您可編輯物件的詳細資料。\n\n### 選擇物件類型\n\n在您添加一個點、線段或區域後,您可以選擇物件的類型,例如該物件是公路還是住宅區道路,是超級市場還是咖啡廳。檢視面板將顯示常用物件類型的按鈕,要找出其他物件類型,您可以在搜尋框中輸入您所要的物件類型。 點選物件類型按鈕右下角的'i'字按鈕,可顯示物件類型的更多資訊。點選按鈕以選擇該類型。\n\n### 使用表格和編輯標籤\n\n在您選擇物件類型後,或選擇已經被編配類型的物件時,檢查面板會顯示該物件詳細資料的欄位, 如名稱和地址。\n\n在欄位下方,您可以點選按鈕,以添加其他詳細資料,如維基百科的條目連結,無障礙設施狀況,以及其他更多資料。\n\n在面板的底部,點擊'增加標籤'以添加其他任意的標籤到該物件。[Taginfo](http://taginfo.openstreetmap.org/) 是相當好用的工具,你可以了解常用的標籤組合。\n\n您在檢查面板所做的更改,會自動套用到地圖上。您可以隨時點選'復原'按鈕,撤消這些更改。\n",
-            "buildings": "# 建築物\n\n開放街圖是世界上最大的建築物資料庫。您可以建立\n和改善這個資料庫。\n\n### 選擇建築物\n\n您可以點選建築物的邊界,以選擇該建築物。該建築物將以高亮度顯示,並會開啟小工具選單,和在右邊顯示有關建築物更多資料的面板。\n\n### 修改建築物\n\n有時候,建築物的位置或其標籤或許會不正確。\n\n要移動整個建築物的位置,先選擇該建築物,然後點選’移動’工具。移動您的滑鼠以移動築物,在移到正確位置上按一下。\n\n要更正建築物的形狀,點選並拖曳建築物輪廓的節點,以移到更好的位置。\n\n### 繪製新建築物\n\n為地圖添加建築物的主要問題之一,是開放街圖可以用輪廓或點的形式,記錄建築物。一般來說,應_盡可能以區域記錄建築物的輪廓_,並以置於建築輪廓內的點,記錄建築物中的公司、住宅、設施及其他東西。\n\n要開始繪製建築物,先單擊左上方的’區域’按鈕,最後則按鍵盤上的’Return'鍵或點選所繪的第一個節點,完成輪廓的繪製。\n\n### 刪除建築物\n\n如果一項建築物完全不正確 - 您看到它在衛星圖像上不存在,並最好實地證實它根本不存在 - 您可以將建築物刪除,這會從地圖中將之移除。刪除物件時務必要小心 - 像任何其他的編輯,結果會被大家看見,而衛星圖像往往會過時,因此該建築物或許只是新建的。\n\n要刪除建築物,您可以點選它以選擇,然後按下垃圾桶按鈕,或按 ’Delete’ 鍵。\n",
-            "relations": "# 關係\n\n關係是在開放街圖裡將其他物件組合在一起的特殊物件。\n舉兩個常見的例子-*路線關係*可用來將屬於某一高速公路或道路的路段併合;而*多重多邊形*則可用來將數條線段組合,以勾劃出較為複雜區域(如分開為數個區塊,或像甜甜圈一樣中間穿洞的區域)。\n\n在一個關係中組合在一起的物件,稱為該關係的*成員*。\n在面板裡,您可以看到一個物件屬於哪些關係,並可點選當中任何一個關係。\n當您點選了一個關係後,面板會列出關係中的所有成員,\n而這些成員亦會在地圖上標示出來。\n\n在您編輯時,iD在大多數情況下都會自動處理所涉及的關係。但是需注意,若您刪除舊有的路段以重繪更精確的路段,\n您必須確定將新的路段,仍為原本路段所屬關係的成員。\n\n## 編輯關係\n\n如果您想編輯關係,以下是基本要領。\n\n要將物件加入一個現有的關係,請選擇該物件,\n點選面板中\"所有關係\"下的\"+\"按鈕,並選擇或輸入關係的名稱。\n\n要增加一個新的關係,點選第一個要加入新關係作為成員的物件,\n點選面板中\"所有關係\"下的\"+\"按鈕,並選擇\"建立新關係...\"。\n\n要將物件從一個關係中移除,選擇該物件,\n點選您想將該物件移除的關係旁的垃圾桶按鈕。\n\n您可以運用\"合併\"工具,創建內含空洞的多重多邊形。\n繪製兩個區域(內部與外部),按住 Shift 鍵並分別點選它們兩者,\n然後點選 \"合併\"(+)按鈕。\n"
+            "help": {
+                "title": "說明文件",
+                "welcome": "歡迎來到 [開放街圖](https://www.openstreetmap.org/)的 iD 編輯器。使用 iD 編輯器能讓你在網頁瀏覽器更新開放街圖。",
+                "open_data_h": "開放資料",
+                "open_data": "在地圖上面的編輯變動會讓所有使用開放街圖的人看到。你的編輯必須基於個人知識,現地踏察,或是收集的空照或是街景影像。從商業來源如 Google 地圖,則[嚴重禁止](https://www.openstreetmap.org/copyright)。",
+                "before_start_h": "在開始之前",
+                "before_start": "你應該先熟悉開放街圖以及編輯器之前再開始編輯。iD 編輯器中有教學能教你基本編輯開放街圖的方法。點螢幕上的\"開始新手教學\"進行新手教學-這只會花 15 分鐘。",
+                "open_source_h": "開源",
+                "open_source": "iD 編輯器是共同協作的開源專案,你現在則是使用 {version} 版本。專案的原始碥在 [GitHub 上面](https://github.com/openstreetmap/iD)。",
+                "open_source_help": "你可以藉由[翻譯](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) 或是 [回報臭蟲](https://github.com/openstreetmap/iD/issues),協助 iD 專案的發展。"
+            },
+            "overview": {
+                "title": "概要",
+                "navigation_h": "瀏覽",
+                "navigation_drag": "你藉由按住 {leftclick} 滑鼠左鍵和移動滑鼠拖動地圖。你也可以使用鍵盤上的  `↓`, `↑`, `←`, `→` 方向鍵移動。",
+                "navigation_zoom": "你可以用滑鼠滾輪或是觸控版放大或縮小,或是按地圖旁的 {plus} / {minus} 按鈕。你也可以用鍵盤上的  `+`, `-` 鍵。",
+                "features_h": "圖徵",
+                "features": "我們用字詞*圖徵*來描述地圖上會出現的東西,像是道路、建築、或是興趣點。任何在現實世界出現的東西,都可以當作圖徵畫到開放街圖上面。地圖圖徵在地圖上以*點*、*線*或是*區域*的方式呈現。",
+                "nodes_ways": "在開放街圖裡,點有時候被稱為*節點*,而線和區域則被稱為*路徑*。"
+            },
+            "editing": {
+                "title": "編輯及儲存",
+                "select_h": "選取",
+                "select_left_click": "對著圖徵按 {leftclick} 左鍵選擇,則會用高亮度顯示加上會發光,而側邊欄則會顯示關於圖徵的詳細內容,像是名稱或是地址。",
+                "select_right_click": "對著圖徵按 {rightclick} 右鍵則會顯示編輯選單,列出可以執行的指令,像是旋轉、移動和刪除。",
+                "multiselect_h": "多重選擇",
+                "multiselect_shift_click": "`{shift}`+{leftclick} 按左鍵來一次選擇多個圖徵,這讓移動或刪除多個物件更為容易。",
+                "multiselect_lasso": "另一個多重選擇的方式是按住 `{shift}` 鍵,然後按 {leftclick} 左鍵拖動滑鼠拉出選擇方框。而所有在方框區域內的節點都會被選擇。",
+                "undo_redo_h": "復原及重複動作",
+                "undo_redo": "你的編輯都會存在本地的瀏覽器裡,直到你選擇上傳到開放街圖伺服器上。你可以點 {undo} **復原**按鈕來復原先前的編輯, {redo} 取消復原按鍵來取消復原。",
+                "save_h": "儲存",
+                "save": "點 {save} **儲存** 完成你的編輯並傳送到開放街圖。你應該記得你必須時常儲存你的成果! ",
+                "save_validation": "在儲存畫面,你有機會回顧你做了什麼。iD 會進行基本的檢查,確保沒有遺失的資料,以及提供有幫助的建議,還有在怪怪的時候提出警告。",
+                "upload_h": "上傳",
+                "upload": "在上傳你的變動之前,你必須輸入 [編輯變動留言](https://wiki.openstreetmap.org/wiki/Good_changeset_comments)。接著按**上傳**來傳送你的變動到開放街圖,然後這業變動會合併到地圖上,每個人都看得到。",
+                "backups_h": "自動備份",
+                "backups": "如果你無法在一次完成你的編輯,比如說你的電腦當機,或是你關掉瀏覽器分頁,你的編輯仍儲存在瀏覽器的儲存空間。之後你可以回來(同一台電腦的的同一個瀏覽器),iD 會讓你恢復你的工作。",
+                "keyboard_h": "鍵盤快速鍵",
+                "keyboard": "您可以透過按下 `?` 鍵瀏覽鍵盤快捷鍵清單"
+            },
+            "feature_editor": {
+                "title": "圖徵編輯器",
+                "intro": "*圖徵編輯器*會出現在地圖旁邊,允許你看到和編輯你選擇圖徵所有的資訊。",
+                "definitions": "上半部分會顯示圖徵的類型,中間部分則有顯示圖徵內容,像是名字或地址的*欄位*。",
+                "type_h": "圖徵類型",
+                "type": "你可以點選圖徵類型來改變不同的圖徵類型。所有現實世界存在的東西都可以加到開放街圖上面,所以總共有成千種圖徵類型能夠選擇。",
+                "type_picker": "類選選擇器顯示最常見的圖徵類儒,像是公園、醫院、餐廳、道路建築。你可以藉由在搜尋框輸入任何東西來搜尋。你也可以點選圖徵類型旁邊的 {inspect} **資訊**圖示來得到更多資訊。",
+                "fields_h": "欄位",
+                "fields_all_fields": "\"所有欄位\"部分含有你能編輯,所有圖徵的詳細資訊。在開放街圖,所有的欄位都是選擇性的,你不確定的話可以選擇留空。",
+                "fields_example": "每一個圖徵類型會有不同的欄位。舉例來說,道路類可能就有路面和速限的欄位,而餐廳則會顯示食物類型,以及營業時間的欄位。",
+                "fields_add_field": "你也可以按下拉選單\"新增欄位\",增加新的欄位,像是描述、維基百科連結、輪椅通通等項目。",
+                "tags_h": "標籤",
+                "tags_all_tags": "下面的欄位選擇,你可以展開\"所有標籤\"部分,替你選擇的圖徵加上任何在開放街圖上面的標籤。每一個標籤由一個\"鍵\"和\"值\"構成,資料元件定義所有在開放街圖上儲存的圖徵。",
+                "tags_resources": "編輯圖徵的標籤需要開放街圖進階的知識。你應該參考 [開放街圖 Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) 或 [Taginfo](https://taginfo.openstreetmap.org/) 熟悉已經被接受的開放街圖標籤慣例。"
+            },
+            "points": {
+                "title": "點",
+                "intro": "*點*可以用來表示像是商店、餐廳和紀念碑的圖徵。他們佔據特定的地點,描述在那裡的東西。",
+                "add_point_h": "新增點",
+                "add_point": "要新增一個點,點選地圖上面工具列 {點} **點**按鈕,或是按快速鍵 `1`。這會讓滑鼠遊標變成十字圖樣。",
+                "add_point_finish": "要在地圖放置新的點,將滑鼠十字移到點的位置,接著按 {leftclick} 左鍵或按`空白鍵`。",
+                "move_point_h": "移動點",
+                "move_point": "要移動點的話,請將滑鼠指標移到點的上面,接著按下去然後按住 {leftclick} 左鍵不放,然後移到點到新的位置。",
+                "delete_point_h": "刪除點",
+                "delete_point": "刪除現實世界不存在的圖徵是很 OK 的事情。從開放街圖刪除圖徵,意味著從每個人會用到的地圖移除,所以你必須確定圖徵確實不在了,才真的刪除圖徵。",
+                "delete_point_command": "要刪去一個點,  {rightclick} 右鍵點選該點以打開編輯選單,然後選擇 {delete} **刪除** 指令。"
+            },
+            "lines": {
+                "title": "線",
+                "intro": "*線*用來代表像是道路、鐵路和河流。線應沿著被代表物體的中心繪製。",
+                "add_line_h": "新增線",
+                "add_line": "要新增線,點地圖上方工具列的 {line} **線**按鈕,或是按快速鍵 `2`。這會讓滑鼠指標變成十字形狀。",
+                "add_line_draw": "接下來,移動滑鼠指標到線開始的地方,按下 {leftclick} 左鍵,或是按`空白鍵`開始沿著線放置點。按著或是用`空白鍵`增加更多點,而在繪製的過程,你可以放大地圖,或是拖拉地圖來增加更多細節。",
+                "add_line_finish": "要完成畫線,按下 `{return}` 或對該線最後一個節點點擊一次。",
+                "modify_line_h": "變更線",
+                "modify_line_dragnode": "有時候你會看線的形狀並不正確,比方說道路並沒有與背景影像重合。要調整線的形狀,首先按 {leftclick} 左鍵選取線,所有線的點都會變成小的圓圈,接著你可以拖動這些點到更適合的位置。",
+                "modify_line_addnode": "你也可以沿著線新增點,在線上 {leftclick} **x2** 點兩下,或是拖動點跟點中間的小三角形。",
+                "connect_line_h": "連結線",
+                "connect_line": "路要適當連結,不只方便地圖顯示,還是提供導航最基本的方式。",
+                "connect_line_display": "道路的交叉處會用灰色圓圈表示,而線的尾段如無連到任何東西,則是用較大的白色圓圈代表。",
+                "connect_line_drag": "要讓線連到其他圖徵,則要將線的節點接到其他圖徵上,直到兩個圖徵接合為止。小技巧:你可以按著 `{alt}` 鍵避免點連到其他圖徵。",
+                "connect_line_tag": "如果你的交叉處是交通號誌或是穿越道,你可以藉由選取連接的點,然後用圖徵編輯器選取正確的圖徵類似來增加。",
+                "disconnect_line_h": "切斷線",
+                "disconnect_line_command": "要將道路從其他圖徵切斷,對著選取的節點按 {rightclick} 右健,然後在編輯選單選取 {disconnect} **切斷命令。",
+                "move_line_h": "移動線",
+                "move_line_command": "要移動整條線,用 {rightclick} 右鍵點線然後選擇選單 {move} **移動** 指令。接著移動滑鼠,用 {leftclick} 左鍵點要移動到的新地點。",
+                "move_line_connected": "有連到其他圖徵的線,則在移動線的同時也被移動到新地點。iD 可能會阻止你不讓你移動線到與其他連接的線交叉。",
+                "delete_line_h": "刪除線段",
+                "delete_line": "如果一條線都不對,舉例來說道路並不存在真實世界,當然你可以刪除。當你要刪除圖徵時請小心:背景影像也許過時,而看起來錯誤的道路也許是新修築的。",
+                "delete_line_command": "要刪除線,對著線按 {rightclick} 右鍵選取,接著在顯示的編輯選單,使用 {delete} **刪除**指令。"
+            },
+            "areas": {
+                "title": "區域",
+                "intro": "*區埔通常用來顯示有邊界的圖徵,像是湖泊、建築、住宅區。區域應當沿著圖徵邊緣繪製,舉例來說就是沿著建築物地基繪製。",
+                "point_or_area_h": "點或區域?",
+                "point_or_area": "許多圖徵能夠用點或是區域表示。你應該儘可能用區域來畫建築和其他東西的外框。將節點放在建築區域裡來表示商家、便利設施和其他在位於建築的圖徵。",
+                "add_area_h": "新增區域",
+                "add_area_command": "要增加區域,在地圖上方工具列點 {aera} **區域**按鈕,或是按快速鍵 `3`,這會讓滑鼠指標變成十字形。",
+                "add_area_draw": "接著,移動滑鼠指標到圖徵的角落,然後點 {leftclick} 左鍵,或是按`空白鍵`來放置點到區域的邊緣。繼續按著放置更多點,或是按`空白鍵`。當你在繪製的時候,你可以放大或是拖動地圖來增加更多細節。",
+                "add_area_finish": "要完成繪製區域,按 `{return}` 或再次點第一個點或最後一個點。",
+                "square_area_h": "直角角落",
+                "square_area_command": "許多圖徵像是建築有直角,要直角化區域的角落,則對著區域的邊緣按 {rightclick} 右鍵,然後選擇編輯選單 {orthogonalize} **方角化**指令。",
+                "modify_area_h": "變動區域",
+                "modify_area_dragnode": "你會常看到形狀不太對的區域,比如說跟背景影像不太符合的建築物。要修正區域的形狀,先按 {leftclick} 左鍵選擇區域,所有區域上的點會以小圓圈顯示,你可以拖動這些點到更適當的地點。",
+                "modify_area_addnode": "你也可以藉由區域邊緣上 {leftclick} **x2** 點兩下新增點,或是拖動兩點中間的小三角形來新增點。",
+                "delete_area_h": "刪除區域",
+                "delete_area": "如果區域畫得完全不對,像是真實世界並不存在那棟建築,那麼你可以放心刪除。但當刪除時請小心 - 背景影像也許已經過時了,那棟怪怪的建築也許只是新蓋好的建築。",
+                "delete_area_command": "要刪除區域,請對著區域按 {rightclick} 右鍵選取,接著出現編輯選單,然後使用 {delete} **刪除**指令。"
+            },
+            "relations": {
+                "title": "關聯",
+                "intro": "*關聯*是開放街圖特殊型態的圖徵,能夠將其他圖徵組織成一組。屬於關聯的圖徵被稱為*成員*,而每個成員在關聯裡都會有*角色*。",
+                "edit_relation_h": "編輯關聯",
+                "edit_relation": "在圖徵編輯器裡的最下面,你可以展開\"所有關係\"部分,能看到選擇的圖徵是那些關聯的成員。你可以點選關聯選擇和編輯關聯。",
+                "edit_relation_add": "要將圖徵加到關聯裡,選擇圖徵,接著點圖徵編輯器中\"所有關係\"部分的 {plus} 加號按鈕。你可以從附近關聯的清單選擇,或是選\"新關係...\"選項。",
+                "edit_relation_delete": "你也可以按 {delete} **刪除**按鈕將關聯中的選擇圖徵移除。如果你移除關聯中所有的成員,關聯也將被自動刪除。",
+                "maintain_relation_h": "維護關聯",
+                "maintain_relation": "大部分的情形來說,你編輯時 iD 會自動維護關聯,你應當特別注意替換關聯中的成員。舉例來說,如果你刪除一段路,用新繪製的路段取代,你應當如同原來的一樣,將新的部分加到同一個關聯 (路線、轉彎限制等)。",
+                "relation_types_h": "關聯種類",
+                "multipolygon_h": "多重多邊形",
+                "multipolygon": "*多重多邊形*關聯是擁有一個或多個*外框*以及一個或多個內部圖徵的群組。外框圖徵定義多重多邊形的外圍,而內部圖徵則定義次區域或是多重多邊形內部的洞。",
+                "multipolygon_create": "要創建多重多邊形,像是建築內有洞的狀況,要用區域的方式先畫外框,再來用線段或是不同形狀區塊的方式畫內部的邊緣。接著 `{shift}`+{leftclick}  左鍵同時選擇兩個圖徵,{rightclick} 右鍵點下去之後出現編輯選單,接著選 {merge} **合併**命令。 ",
+                "multipolygon_merge": "合併數個線段或區域會產生以所有選擇區域為成員新的多重多邊形。iD 會自動選擇是內部還是外部的角色,取決於那個圖徵是否在某一個圖徵裡面。",
+                "turn_restriction_h": "轉彎限制",
+                "turn_restriction": "*轉彎限制*關聯是有數個交叉道路的群組。轉彎限制由*從*道,*經由*節點或道路,以及*到*道路。",
+                "turn_restriction_field": "要編輯轉彎限制,選擇兩個以上道路交叉的節點。圖徵編輯器則會顯示特別的\"轉彎限制\"欄位,欄位裡有交叉點相關的模式。",
+                "turn_restriction_editing": "在\"轉彎限制\"欄位中,點選\"從\"道路,接著看是允許或是限制\"到\"道路。你可以點轉彎圖示切換允許或是限制,iD 會依據從、經由、到的角色,自動新建關聯。",
+                "route_h": "路線",
+                "route": "*路線*關聯是一個由一個或多個線段圖徵組成的道路網路群組,像是公車路線、火車路線或是公路路線。",
+                "route_add": "要增加圖徵到路線關聯,選擇圖徵在圖徵編輯器,向下滾動到\"所有關係\"部分,接著點 {plus} 加號按鈕,增加圖徵到鄰近已存在或是新的關聯中。",
+                "boundary_h": "邊界",
+                "boundary": "*邊界*關聯是一個由一個或多個線段圖徵組成的行政邊界。",
+                "boundary_add": "要增加圖徵到邊界關聯,選擇圖徵在圖徵編輯器,向下滾動到\"所有關係\"部分,接著點 {plus} 加號按鈕,增加圖徵到鄰近已存在或是新的關聯中。"
+            },
+            "imagery": {
+                "title": "背景影像",
+                "intro": "背景影像出現在地圖資料下方,是繪製地圖時相當重要的資源。這些影像可能是從衛星、飛機和無人機收集的空拍影像,或是掃描歷史地圖或是其他自由可用的來源資料。",
+                "sources_h": "空拍圖來源",
+                "choosing": "要看有那些影像來源可以用在編輯,點選地圖旁的 {layers} **背景設定**按鈕。",
+                "sources": "[Bing 地圖](https://www.bing.com/maps/)影像是預設的背景影像。視你在編輯的地方,還有其他的影像來源,有些影像比較新或有更高的解析度,所以請常常檢查有些可用,選擇那個圖層是最好用的繪製地圖參考來源。",
+                "offsets_h": "調整空拍圖層偏移",
+                "offset": "有時候影像會與既有地圖資料有些偏移狀況,如果你看到道路或是建築相比背景影像有偏移狀況,也許影像並沒有對準,請別移動全部的資料來吻合背景影像。你可以在背景影像設定,藉由\"調整影像偏移\"調整背景來將影像吻合既有的資料。",
+                "offset_change": "點小三角形微幅調整影像,或是按住左鍵在灰色區域拖動,來調整影像。"
+            },
+            "streetlevel": {
+                "title": "街景照片",
+                "intro": "街景影像很適合拿來繪製交通號誌、商家以及其他從衛星和空拍影像難以看到的細節。iD 編輯器支援  [Mapillary](https://www.mapillary.com) 和[OpenStreetCam](https://www.openstreetcam.org) 的街景影像。",
+                "using_h": "使用街景照片",
+                "using": "要使用街景影像來畫地圖,點地圖旁 {data} **地圖資料**面板,切換不同的影像圖層。",
+                "photos": "當啟用時,圖片圖層會顯示有一連串有圖片沿著一條線,在更高的縮放程度,圓圈標示代表圖片的位置,而在更高的縮放下面,方向標示會顯示照片拍攝時的鏡頭方向。",
+                "viewer": "當你點其中一個照片位置,會在圖片下面角落出現照片檢示器。圖片檢示器能控制照片序列要往前進或後退。同時會顯示拍照者的名稱,拍攝日期,以及連到原始網站的連結。"
+            },
+            "gps": {
+                "title": "GPS 軌跡",
+                "intro": "收集的 GPS 軌跡對開放街圖是相當可靠的資料來源。編輯器支援本地電腦的 *.gpx*、*,geojson*,以及 *.kml* 檔案。你可以用智慧型手機、運動手錶或其他 GPS 裝置收集 GPS 軌跡。",
+                "survey": "要知道如何用 GPS 踏查,請閱讀[使用手機、GPS 或紙本繪圖](http://learnosm.org/en/mobile-mapping/)。",
+                "using_h": "使用 GPS 軌跡",
+                "using": "要用 GPS 軌跡畫地圖,請把資料檔案拖到地圖編輯器裡。如果成功辨識,則會在地圖上顯示亮紫色的線條。點地圖旁邊的 {data}  **地圖資料**面板啟用、關閉,或是縮放到你的 GPS 資料。",
+                "tracing": "GPS 軌跡並未傳到開放街圖 - 而最好的使用方式則是照著軌跡的指引,繪製你要新增的圖徵。",
+                "upload": "您也可以透過[上傳你的 GPS 資訊至 OpenStreetMap 開放街圖](https://www.openstreetmap.org/trace/create)以供其他使用者利用。"
+            }
         },
         "intro": {
             "done": "完成",
             },
             "areas": {
                 "title": "區域",
-                "add_playground": "*區域*可以用來顯示圖徵邊界,常用在表示湖泊、建築和住宅區。 {br}。另外區域也可以用在更詳盡的畫地圖上面,取代先前只有節點表示的圖徵。**點{button}區域按鈕來新增區域。**",
+                "add_playground": "*區域*可以用來顯示圖徵邊界,常用在表示湖泊、建築和住宅區。 {br}。另外區域也可以用在畫更詳盡有更多圖徵的地圖上面,取代先前只用節點表示的圖徵。**點{button}區域按鈕來新增區域。**",
                 "start_playground": "讓我們用畫區域的方式來新增遊樂場吧。區域是由增加圖徵邊界的*節點*來繪製。**點或是按空白鍵在遊樂場邊角標上初始節點。**",
                 "continue_playground": "繼續在遊樂場邊界標上更多節點來繪製區域。如果遇到既有的人行道,你也可以將區域連接到人行道上。{br}小技巧:你可以按住 '{alt}' 鍵防止節點連到其他圖徵。 **繼續繪製遊樂場區域。** ",
                 "finish_playground": "按enter鏈或是按第一個或最後一個節點完成編輯。**完成遊樂場區域繪製**",
                     "title": "選擇圖徵",
                     "select_one": "選擇單一圖徵",
                     "select_multi": "選擇多個圖徵",
-                    "lasso": "套索選擇圖徵周圍"
+                    "lasso": "套索選擇圖徵周圍",
+                    "search": "尋找與文字搜尋吻合的圖徵"
                 },
                 "with_selected": {
                     "title": "選中圖徵",
                 }
             }
         },
+        "units": {
+            "feet": "{quantity} 英呎",
+            "miles": "{quantity} 英哩",
+            "square_feet": "{quantity} 平方英呎",
+            "square_miles": "{quantity} 平方英哩",
+            "acres": "{quantity} 英畝",
+            "meters": "{quantity} 公尺",
+            "kilometers": "{quantity} 公里",
+            "square_meters": "{quantity} 平方公尺",
+            "square_kilometers": "{quantity} 平方公里",
+            "hectares": "{quantity} 公頃",
+            "area_pair": "{area1} ({area2})",
+            "arcdegrees": "{quantity}°",
+            "arcminutes": "{quantity}′",
+            "arcseconds": "{quantity}″",
+            "north": "北",
+            "south": "南",
+            "east": "東",
+            "west": "西",
+            "coordinate": "{coordinate}{direction}",
+            "coordinate_pair": "{latitude}, {longitude}"
+        },
         "presets": {
             "categories": {
                 "category-barrier": {
                 "brand": {
                     "label": "品牌"
                 },
+                "brewery": {
+                    "label": "生啤酒"
+                },
                 "bridge": {
                     "label": "類型",
                     "placeholder": "預設"
                     "label": "容量",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向",
-                    "options": {
-                        "E": "東",
-                        "ENE": "東北偏東",
-                        "ESE": "東南偏東",
-                        "N": "北",
-                        "NE": "東北",
-                        "NNE": "東北偏北",
-                        "NNW": "西北偏北",
-                        "NW": "西北",
-                        "S": "南",
-                        "SE": "東南",
-                        "SSE": "東南偏南",
-                        "SSW": "西南偏南",
-                        "SW": "西南",
-                        "W": "西",
-                        "WNW": "西北偏西",
-                        "WSW": "西南偏西"
-                    }
-                },
                 "castle_type": {
                     "label": "種類"
                 },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "反時針",
-                        "clockwise": "順時針"
-                    }
-                },
                 "clothes": {
                     "label": "服飾"
                 },
                 "diaper": {
                     "label": "有尿布台"
                 },
+                "direction": {
+                    "label": "方向 (順時針角度)",
+                    "placeholder": "45、90、180、270"
+                },
+                "direction_cardinal": {
+                    "label": "方向",
+                    "options": {
+                        "E": "東方",
+                        "ENE": "東北方",
+                        "ESE": "東南方",
+                        "N": "北方",
+                        "NE": "東北方",
+                        "NNE": "北北東",
+                        "NNW": "北北西",
+                        "NW": "西北方",
+                        "S": "南方",
+                        "SE": "東南方",
+                        "SSE": "南南東",
+                        "SSW": "南南西",
+                        "SW": "西南方",
+                        "W": "西方",
+                        "WNW": "西北西",
+                        "WSW": "西南西"
+                    }
+                },
+                "direction_clock": {
+                    "label": "方向",
+                    "options": {
+                        "anticlockwise": "逆時針",
+                        "clockwise": "順時針"
+                    }
+                },
+                "direction_vertex": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "後退",
+                        "both": "兩者都有 / 全都有",
+                        "forward": "前進"
+                    }
+                },
                 "display": {
                     "label": "顯示"
                 },
                 "memorial": {
                     "label": "類型"
                 },
-                "milestone_position": {
-                    "label": "里程碑位置",
-                    "placeholder": "距離,顯示一位小數 (123.4)"
+                "monitoring_multi": {
+                    "label": "監測"
                 },
                 "mtb/scale": {
                     "label": "越越單車難度",
                 "oneway": {
                     "label": "單行道",
                     "options": {
+                        "alternating": "交替",
                         "no": "否",
+                        "reversible": "可反轉",
                         "undefined": "假設為否",
                         "yes": "是"
                     }
                 "oneway_yes": {
                     "label": "單程路",
                     "options": {
+                        "alternating": "交替",
                         "no": "否",
+                        "reversible": "可反轉",
                         "undefined": "假設為是",
                         "yes": "是"
                     }
                     "label": "標準桿數",
                     "placeholder": "3,4,5..."
                 },
-                "parallel_direction": {
-                    "label": "方向",
-                    "options": {
-                        "backward": "反向",
-                        "forward": "正向"
-                    }
-                },
                 "park_ride": {
                     "label": "停車轉乘"
                 },
                 "railway": {
                     "label": "種類"
                 },
+                "railway/position": {
+                    "label": "里程牌位置",
+                    "placeholder": "距離達小數點一位數 (123.4)"
+                },
+                "railway/signal/direction": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "後退",
+                        "both": "兩個方向 / 全部",
+                        "forward": "前進"
+                    }
+                },
                 "rating": {
                     "label": "電力頻率"
                 },
                 "recycling_accepts": {
                     "label": "接受"
                 },
-                "recycling_type": {
-                    "label": "回收品項",
-                    "options": {
-                        "centre": "回收中心",
-                        "container": "回收箱"
-                    }
-                },
                 "ref": {
                     "label": "參考編號"
                 },
+                "ref/isil": {
+                    "label": "ISIL 代碼"
+                },
                 "ref_aeroway_gate": {
                     "label": "閘門編號"
                 },
                 "traffic_signals": {
                     "label": "號誌種類"
                 },
+                "traffic_signals/direction": {
+                    "label": "方向",
+                    "options": {
+                        "backward": "後退",
+                        "both": "兩個方向 / 全部",
+                        "forward": "前後"
+                    }
+                },
                 "trail_visibility": {
                     "label": "路徑可見度",
                     "options": {
                     "terms": "牽繩"
                 },
                 "aerialway/station": {
-                    "name": "纜車站",
-                    "terms": "纜車車站"
+                    "name": "纜車站"
                 },
                 "aerialway/t-bar": {
                     "name": "T型吊桿",
                     "terms": "錢幣兌換,貨幣兌換"
                 },
                 "amenity/bus_station": {
-                    "name": "公車客運站",
-                    "terms": "客運站,轉運站,長途客運站"
+                    "name": "客運站"
                 },
                 "amenity/cafe": {
                     "name": "咖啡廳",
                     "terms": "咖啡店"
                 },
+                "amenity/car_pooling": {
+                    "name": "汽車共乘",
+                    "terms": "共乘,拚車"
+                },
                 "amenity/car_rental": {
                     "name": "汽車租車店",
                     "terms": "汽車出租店,租車店,汽車租車店"
                 },
                 "amenity/charging_station": {
                     "name": "充電站",
-                    "terms": "充電站, 電池交換站"
+                    "terms": "充電站, 電池交換站, 充電處"
                 },
                 "amenity/childcare": {
                     "name": "托兒所/托嬰處",
                 },
                 "amenity/clinic/fertility": {
                     "name": "生產診所",
-                    "terms": "生產診所"
+                    "terms": "生產診所,不孕診所"
                 },
                 "amenity/clock": {
                     "name": "時鐘",
                 },
                 "amenity/courthouse": {
                     "name": "法院",
-                    "terms": "法庭"
+                    "terms": "法庭,地方法院,高等法院,最高法院"
                 },
                 "amenity/coworking_space": {
                     "name": "共同工作空間"
                 },
                 "amenity/drinking_water": {
                     "name": "飲水機",
-                    "terms": "飲水,水源,活水,飲處"
+                    "terms": "飲水,水源,活水,飲處,取水處"
                 },
                 "amenity/driving_school": {
                     "name": "駕訓班",
-                    "terms": "駕訓班"
+                    "terms": "駕訓班,駕訓學校"
                 },
                 "amenity/embassy": {
                     "name": "使館",
                     "terms": "速食店"
                 },
                 "amenity/ferry_terminal": {
-                    "name": "水運碼頭",
-                    "terms": "水路碼頭,遊艇碼頭"
+                    "name": "水運碼頭"
                 },
                 "amenity/fire_station": {
                     "name": "消防局",
                 },
                 "amenity/internet_cafe": {
                     "name": "網咖",
-                    "terms": "網咖"
+                    "terms": "網咖,網吧,網路咖啡店,Internet Cafe"
                 },
                 "amenity/kindergarten": {
                     "name": "育幼院/幼兒園範圍",
                     "name": "圖書館",
                     "terms": "圖書室,閱覽室"
                 },
+                "amenity/love_hotel": {
+                    "name": "情趣旅館",
+                    "terms": "愛情旅館,情人旅館"
+                },
                 "amenity/marketplace": {
                     "name": "市場",
                     "terms": "市集,傳統市場,marketplace"
                 },
                 "amenity/music_school": {
                     "name": "音樂學校",
-                    "terms": "<translate with synonyms or related terms for 'Music School', separated by commas>"
+                    "terms": "音樂學院,音樂學校"
                 },
                 "amenity/nightclub": {
                     "name": "夜總會",
                 },
                 "amenity/parking_space": {
                     "name": "停車位",
-                    "terms": "å\81\9cè»\8aæ¥\81,停車空間"
+                    "terms": "å\81\9cè»\8aæ ¼,停車空間"
                 },
                 "amenity/pavilion": {
                     "name": "亭",
                 },
                 "amenity/place_of_worship": {
                     "name": "宗教祟拜場所",
-                    "terms": "廟,教堂,寺廟,清真寺,禮拜堂"
+                    "terms": "廟,教堂,寺廟,清真寺,禮拜堂,寺,聚會所,教會"
                 },
                 "amenity/place_of_worship/buddhist": {
                     "name": "佛寺",
                 },
                 "amenity/place_of_worship/christian": {
                     "name": "教堂",
-                    "terms": "教堂,教會"
+                    "terms": "教堂,教會,聚會所"
                 },
                 "amenity/place_of_worship/hindu": {
                     "name": "印度寺廟",
-                    "terms": "印度寺廟"
+                    "terms": "印度寺廟,Hindu Temple"
                 },
                 "amenity/place_of_worship/jewish": {
                     "name": "猶太教堂",
                 },
                 "amenity/post_box": {
                     "name": "郵筒",
-                    "terms": "郵箱,Postbox,Mailbox"
+                    "terms": "郵箱,Postbox,Mailbox,投遞處"
                 },
                 "amenity/post_office": {
                     "name": "郵局",
                     "terms": "郊野公園管理站,自然保護區管理站"
                 },
                 "amenity/recycling": {
-                    "name": "資源回收",
-                    "terms": "回收筒,回收箱,資源回收設施"
+                    "name": "資源回收",
+                    "terms": "資源回收筒,回收筒,回收箱"
                 },
                 "amenity/recycling_centre": {
                     "name": "資源回收中心",
                 },
                 "amenity/sanitary_dump_station": {
                     "name": "RV移動廁所",
-                    "terms": "RV流動廁所"
+                    "terms": "RV流動廁所,流動廁所"
                 },
                 "amenity/school": {
                     "name": "中小學範圍",
                 },
                 "amenity/shower": {
                     "name": "淋浴間",
-                    "terms": "淋浴間,淋浴"
+                    "terms": "淋浴間,淋浴,淋浴設施"
+                },
+                "amenity/smoking_area": {
+                    "name": "吸煙區",
+                    "terms": "吸煙區,吸菸區"
                 },
                 "amenity/social_facility": {
                     "name": "社福機構",
                 },
                 "amenity/social_facility/food_bank": {
                     "name": "食物銀行",
-                    "terms": "食物銀行"
+                    "terms": "食物銀行,Food Bank"
                 },
                 "amenity/social_facility/group_home": {
                     "name": "老人之家",
-                    "terms": "老人安養院"
+                    "terms": "老人安養院,榮民之家"
                 },
                 "amenity/social_facility/homeless_shelter": {
                     "name": "遊民收容所",
                 },
                 "amenity/studio": {
                     "name": "工作室",
-                    "terms": "工作室"
+                    "terms": "工作室,Studio"
                 },
                 "amenity/swimming_pool": {
                     "name": "游泳池"
                 },
                 "amenity/taxi": {
                     "name": "計程車招呼站",
-                    "terms": "計程車站"
+                    "terms": "計程車站,招呼站"
                 },
                 "amenity/telephone": {
-                    "name": "電話",
-                    "terms": "話亭,電話亭"
+                    "name": "公用電話",
+                    "terms": "話亭,電話亭,電話"
                 },
                 "amenity/theatre": {
                     "name": "戲劇院",
                 },
                 "amenity/waste/dog_excrement": {
                     "name": "狗排洩物箱",
-                    "terms": "<translate with synonyms or related terms for 'Dog Excrement Bin', separated by commas>"
+                    "terms": "寵物排洩物箱,狗糞便棄置箱"
                 },
                 "amenity/waste_basket": {
                     "name": "垃圾筒",
                 },
                 "attraction/amusement_ride": {
                     "name": "遊樂園",
-                    "terms": "<translate with synonyms or related terms for 'Amusement Ride', separated by commas>"
+                    "terms": "遊樂場"
                 },
                 "attraction/animal": {
                     "name": "動物",
-                    "terms": "<translate with synonyms or related terms for 'Animal', separated by commas>"
+                    "terms": "動物圍欄"
                 },
                 "attraction/big_wheel": {
                     "name": "摩天輪",
-                    "terms": "<translate with synonyms or related terms for 'Big Wheel', separated by commas>"
+                    "terms": "摩天輪"
                 },
                 "attraction/bumper_car": {
                     "name": "碰碰車",
-                    "terms": "<translate with synonyms or related terms for 'Bumper Car', separated by commas>"
+                    "terms": "碰碰車"
                 },
                 "attraction/bungee_jumping": {
                     "name": "高空彈跳",
-                    "terms": "<translate with synonyms or related terms for 'Bungee Jumping', separated by commas>"
+                    "terms": "高空彈跳"
                 },
                 "attraction/carousel": {
                     "name": "旋轉木馬",
-                    "terms": "<translate with synonyms or related terms for 'Carousel', separated by commas>"
+                    "terms": "旋轉木馬"
                 },
                 "attraction/dark_ride": {
                     "name": "黑暗探險",
-                    "terms": "<translate with synonyms or related terms for 'Dark Ride', separated by commas>"
+                    "terms": "黑暗探險"
                 },
                 "attraction/drop_tower": {
                     "name": "自由落體",
-                    "terms": "<translate with synonyms or related terms for 'Drop Tower', separated by commas>"
+                    "terms": "大怒神"
                 },
                 "attraction/pirate_ship": {
                     "name": "海盜船",
-                    "terms": "<translate with synonyms or related terms for 'Pirate Ship', separated by commas>"
+                    "terms": "海盜船"
                 },
                 "attraction/river_rafting": {
                     "name": "激流船",
-                    "terms": "<translate with synonyms or related terms for 'River Rafting', separated by commas>"
+                    "terms": "激流船"
                 },
                 "attraction/roller_coaster": {
                     "name": "雲霄飛車",
-                    "terms": "<translate with synonyms or related terms for 'Roller Coaster', separated by commas>"
+                    "terms": "雲霄飛車"
                 },
                 "attraction/train": {
                     "name": "遊樂園小火車",
-                    "terms": "<translate with synonyms or related terms for 'Tourist Train', separated by commas>"
+                    "terms": "遊樂園小火車"
                 },
                 "attraction/water_slide": {
                     "name": "滑水道",
-                    "terms": "<translate with synonyms or related terms for 'Water Slide', separated by commas>"
+                    "terms": "滑水道"
                 },
                 "barrier": {
                     "name": "柵欄",
                     "name": "樹籬",
                     "terms": "樹籬"
                 },
+                "barrier/kerb": {
+                    "name": "路緣",
+                    "terms": "路緣"
+                },
                 "barrier/kissing_gate": {
                     "name": "單人轉門",
                     "terms": "U形旋轉小門,V形旋轉小門"
                 },
                 "barrier/lift_gate": {
-                    "name": "é\96\98é\96\80",
-                    "terms": "é\81\93é\96\98"
+                    "name": "é\81\93é\96\98",
+                    "terms": "é\96\98é\96\80"
                 },
                 "barrier/retaining_wall": {
                     "name": "擋土牆",
                 },
                 "barrier/wall": {
                     "name": "牆",
-                    "terms": "牆"
+                    "terms": "牆"
                 },
                 "boundary/administrative": {
                     "name": "行政界線",
                 },
                 "building/barn": {
                     "name": "穀倉",
-                    "terms": "穀倉"
+                    "terms": "穀倉,糧倉"
+                },
+                "building/boathouse": {
+                    "name": "船屋",
+                    "terms": "船屋,船庫,艇庫"
+                },
+                "building/bungalow": {
+                    "name": "平房",
+                    "terms": "平房"
                 },
                 "building/bunker": {
                     "name": "地堡"
                     "name": "教堂建築",
                     "terms": "教堂"
                 },
+                "building/civic": {
+                    "name": "公民建築",
+                    "terms": "公民建築"
+                },
                 "building/college": {
                     "name": "學院校舍",
-                    "terms": "學院建築,學院建築物,技術學院建築,學校建築,College Building"
+                    "terms": "學院建築,學院建築物,技術學院建築,學校建築,College Building,校舍"
                 },
                 "building/commercial": {
                     "name": "商業建築物",
                 },
                 "building/dormitory": {
                     "name": "宿舍",
-                    "terms": "學舍,學生宿舍"
+                    "terms": "學舍,學生宿舍,學寮"
                 },
                 "building/entrance": {
                     "name": "入口/出口"
                 },
+                "building/farm": {
+                    "name": "農舍",
+                    "terms": "農舍"
+                },
                 "building/garage": {
                     "name": "車庫",
                     "terms": "車庫"
                     "name": "育幼院/幼兒園校舍",
                     "terms": "育幼院/幼兒園校舍,育幼院校舍,幼兒園校舍,幼稚園校舍"
                 },
+                "building/mosque": {
+                    "name": "清真寺建築",
+                    "terms": "清真寺大院,清真寺大廈"
+                },
                 "building/public": {
                     "name": "公共建築物",
                     "terms": "公共建築"
                     "name": "屋頂",
                     "terms": "上蓋"
                 },
+                "building/ruins": {
+                    "name": "建築廢墟",
+                    "terms": "建築廢墟"
+                },
                 "building/school": {
                     "name": "中小學建築物",
-                    "terms": "學校建物,學校建築,小學建築,中學建築,高中建築,國中建築,國小建築,School Building"
+                    "terms": "學校建物,學校建築,小學建築,中學建築,高中建築,國中建築,國小建築,School Building,校舍"
                 },
                 "building/semidetached_house": {
                     "name": "半獨立式房屋",
                     "terms": "半獨立式住宅,半獨立式房子"
                 },
+                "building/service": {
+                    "name": "服務建築",
+                    "terms": "服務建築"
+                },
                 "building/shed": {
                     "name": "小屋",
                     "terms": "小屋"
                     "name": "馬房",
                     "terms": "馬房"
                 },
+                "building/stadium": {
+                    "name": "體育館大廈",
+                    "terms": "體育場大廈"
+                },
                 "building/static_caravan": {
                     "name": "固定的拖掛式房車",
                     "terms": "固定的拖掛式房車"
                 },
+                "building/temple": {
+                    "name": "寺廟建築",
+                    "terms": "寺廟建築,寺廟大樓"
+                },
                 "building/terrace": {
                     "name": "排屋",
                     "terms": "行列式房屋,連棟式住宅"
                 "building/train_station": {
                     "name": "火車站建築物"
                 },
+                "building/transportation": {
+                    "name": "大眾運輸大樓",
+                    "terms": "交通運輸大樓,轉運站大樓"
+                },
                 "building/university": {
                     "name": "大學建築",
                     "terms": "大學建築物,大學校舍,校舍,學校建築,University Building"
                     "name": "露營營地",
                     "terms": "露營營地,露營場地,營地"
                 },
+                "circular": {
+                    "name": "圓環"
+                },
                 "club": {
                     "name": "俱樂部",
-                    "terms": "俱樂部"
+                    "terms": "俱樂部,Club"
                 },
                 "craft": {
                     "name": "工藝",
                     "terms": "打鐵匠"
                 },
                 "craft/boatbuilder": {
-                    "name": "é\80 è\88¹å» ",
+                    "name": "é\80 è\88¹å\8c ",
                     "terms": "造船廠"
                 },
                 "craft/bookbinder": {
                     "terms": "書籍釘裝"
                 },
                 "craft/brewery": {
-                    "name": "é\87\80é\85\92å» ",
+                    "name": "é\87\80é\85\92å\8c ",
                     "terms": "釀酒廠"
                 },
                 "craft/carpenter": {
                 },
                 "craft/chimney_sweeper": {
                     "name": "煙囪清掃工 ",
-                    "terms": "<translate with synonyms or related terms for 'Chimney Sweeper', separated by commas>"
+                    "terms": "掃煙囪"
                 },
                 "craft/clockmaker": {
-                    "name": "製é\90\98å» ",
+                    "name": "製é\90\98å\8c ",
                     "terms": "製鐘店"
                 },
                 "craft/confectionery": {
-                    "name": "ç³\96æ\9e\9c製é\80 å\95\86",
-                    "terms": "<translate with synonyms or related terms for 'Candy Maker', separated by commas>"
+                    "name": "ç³\96æ\9e\9c製é\80 å\8c ",
+                    "terms": "糖果製造商,甜食製造匠"
                 },
                 "craft/distillery": {
                     "name": "酒廠",
                 },
                 "craft/dressmaker": {
                     "name": "製衣店",
-                    "terms": "製衣åº\97"
+                    "terms": "製衣å\8c ,è¨\82å\81\9aè¡£æ\9c\8d"
                 },
                 "craft/electrician": {
                     "name": "電氣工程",
-                    "terms": "é\9b»æ°£å·¥ç¨\8b"
+                    "terms": "é\9b»æ°£å\8c "
                 },
                 "craft/electronics_repair": {
                     "name": "電器維修店",
                 "emergency/private": {
                     "name": "供私人緊急通行"
                 },
+                "emergency/water_tank": {
+                    "name": "緊急水箱",
+                    "terms": "緊急水箱"
+                },
                 "emergency/yes": {
                     "name": "開放緊急通行"
                 },
                 },
                 "footway/sidewalk": {
                     "name": "人行道",
-                    "terms": "路邊行人路"
+                    "terms": "路邊行人路,路邊人行路"
                 },
                 "ford": {
                     "name": "淺灘",
                     "name": "馬道",
                     "terms": "馬道"
                 },
+                "highway/bus_guideway": {
+                    "name": "導向公車道",
+                    "terms": "導向公車道"
+                },
                 "highway/bus_stop": {
-                    "name": "公車站",
-                    "terms": "公共汽車站,站牌,公車站牌,公車停靠站,巴士站,巴士站牌,巴士停靠站"
+                    "name": "公車站牌/公車月台"
                 },
                 "highway/corridor": {
                     "name": "室內走廊",
                 },
                 "highway/pedestrian_area": {
                     "name": "徒步區",
-                    "terms": "<translate with synonyms or related terms for 'Pedestrian Area', separated by commas>"
+                    "terms": "行人徒步區"
                 },
                 "highway/pedestrian_line": {
-                    "name": "人行徒步街道",
-                    "terms": "<translate with synonyms or related terms for 'Pedestrian Street', separated by commas>"
+                    "name": "行人徒步街道",
+                    "terms": "行人徒步道路"
                 },
                 "highway/primary": {
                     "name": "主要道路",
                     "terms": "次級道路連接道"
                 },
                 "highway/service": {
-                    "name": "輔助道路",
+                    "name": "服務道路",
                     "terms": "輔助道路"
                 },
                 "highway/service/alley": {
                     "terms": "公路服務區,公路休息區"
                 },
                 "highway/speed_camera": {
-                    "name": "測速攝影機",
+                    "name": "測速照相機",
                     "terms": "測速攝影機,測速照相機,測速照相,測速攝影"
                 },
                 "highway/steps": {
                     "terms": "紀念碑"
                 },
                 "historic/monument": {
-                    "name": "古蹟",
-                    "terms": "古蹟"
+                    "name": "纪念建築物",
+                    "terms": "纪念碑,紀念塔,古蹟"
                 },
                 "historic/ruins": {
                     "name": "遺址",
                     "terms": "森林"
                 },
                 "landuse/garages": {
-                    "name": "è»\8a庫群",
-                    "terms": "許å¤\9aç\9b¸é\80£ç\9a\84車庫"
+                    "name": "è»\8a庫ç\94¨å\9c°",
+                    "terms": "è»\8a庫ç\94¨å\9c°,車庫"
                 },
                 "landuse/grass": {
                     "name": "草地",
                     "name": "未開發地帶",
                     "terms": "未開發地帶,未開發地區"
                 },
+                "landuse/greenhouse_horticulture": {
+                    "name": "溫室園藝",
+                    "terms": "溫室農業"
+                },
                 "landuse/harbour": {
                     "name": "港灣",
                     "terms": "港灣,海港"
                 },
                 "landuse/industrial": {
-                    "name": "工業",
+                    "name": "工業用地",
                     "terms": "工業區"
                 },
                 "landuse/industrial/scrap_yard": {
                     "name": "廢料場",
-                    "terms": "<translate with synonyms or related terms for 'Scrap Yard', separated by commas>"
+                    "terms": "廢料儲存地"
                 },
                 "landuse/industrial/slaughterhouse": {
                     "name": "屠宰場",
-                    "terms": "<translate with synonyms or related terms for 'Slaughterhouse', separated by commas>"
+                    "terms": "屠宰場"
                 },
                 "landuse/landfill": {
                     "name": "埯埋場",
                 },
                 "landuse/meadow": {
                     "name": "牧場",
-                    "terms": "牧場"
+                    "terms": "放牧用地"
                 },
                 "landuse/military": {
                     "name": "軍事用地",
                     "terms": "軍用機場,軍機場"
                 },
                 "landuse/military/barracks": {
-                    "name": "軍",
-                    "terms": "營房,軍營"
+                    "name": "軍事建築",
+                    "terms": "營房,軍營,營舍"
                 },
                 "landuse/military/bunker": {
                     "name": "軍事碉堡",
                     "terms": "障礙課程場地,障礙課程"
                 },
                 "landuse/military/office": {
-                    "name": "軍事辦公室",
+                    "name": "軍事單位辦公室",
                     "terms": "軍事辦公室"
                 },
                 "landuse/military/range": {
-                    "name": "軍靶場",
+                    "name": "軍靶場",
                     "terms": "靶場,軍用靶場,射擊場,軍事靶場"
                 },
                 "landuse/military/training_area": {
                 },
                 "landuse/quarry": {
                     "name": "礦區",
-                    "terms": "礦場"
+                    "terms": "礦場,採礦場"
                 },
                 "landuse/railway": {
                     "name": "鐵路通道",
                 },
                 "landuse/religious": {
                     "name": "宗教設施用地",
-                    "terms": "<translate with synonyms or related terms for 'Religious Area', separated by commas>"
+                    "terms": "寺廟用地,教會用地,廟宇用地"
                 },
                 "landuse/residential": {
-                    "name": "住宅",
-                    "terms": "住宅用地"
+                    "name": "住宅用地",
+                    "terms": "住宅"
                 },
                 "landuse/retail": {
-                    "name": "零售",
-                    "terms": "零售區域"
+                    "name": "零售",
+                    "terms": "零售區域,零售"
                 },
                 "landuse/vineyard": {
                     "name": "酒莊",
                 },
                 "leisure": {
                     "name": "休閒設施",
-                    "terms": "休閒設施"
+                    "terms": "休閒設施,休閒娛樂"
                 },
                 "leisure/adult_gaming_centre": {
                     "name": "成人遊戲中心",
                 },
                 "leisure/fitness_centre": {
                     "name": "健身房/健身中心",
-                    "terms": "健身房,健身中心"
+                    "terms": "健身房,健身中心,Gym"
                 },
                 "leisure/fitness_centre/yoga": {
                     "name": "瑜珈教室",
                 },
                 "leisure/fitness_station/balance_beam": {
                     "name": "運動平衡梁",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Balance Beam', separated by commas>"
+                    "terms": "運動平衡梁"
                 },
                 "leisure/fitness_station/box": {
                     "name": "運動箱",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Box', separated by commas>"
+                    "terms": "運動箱"
                 },
                 "leisure/fitness_station/horizontal_bar": {
                     "name": "運動平衡單槓",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Horizontal Bar', separated by commas>"
+                    "terms": "運動平衡單槓"
                 },
                 "leisure/fitness_station/horizontal_ladder": {
                     "name": "橫爬架",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Monkey Bars', separated by commas>"
+                    "terms": "橫爬架"
                 },
                 "leisure/fitness_station/hyperextension": {
                     "name": "羅馬凳站",
-                    "terms": "<translate with synonyms or related terms for 'Hyperextension Station', separated by commas>"
+                    "terms": "羅馬凳站"
                 },
                 "leisure/fitness_station/parallel_bars": {
                     "name": "雙槓",
-                    "terms": "<translate with synonyms or related terms for 'Parallel Bars', separated by commas>"
+                    "terms": "雙槓"
                 },
                 "leisure/fitness_station/push-up": {
                     "name": "伏地挺身站",
-                    "terms": "<translate with synonyms or related terms for 'Push-Up Station', separated by commas>"
+                    "terms": "伏地挺身站"
                 },
                 "leisure/fitness_station/rings": {
                     "name": "運動吊環",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Rings', separated by commas>"
+                    "terms": "運動吊環"
                 },
                 "leisure/fitness_station/sign": {
                     "name": "運動指示標誌",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Instruction Sign', separated by commas>"
+                    "terms": "運動指示說明"
                 },
                 "leisure/fitness_station/sit-up": {
                     "name": "仰臥起坐台",
-                    "terms": "<translate with synonyms or related terms for 'Sit-Up Station', separated by commas>"
+                    "terms": "仰臥起坐台"
                 },
                 "leisure/fitness_station/stairs": {
                     "name": "運動椅",
-                    "terms": "<translate with synonyms or related terms for 'Exercise Stairs', separated by commas>"
+                    "terms": "運動椅"
                 },
                 "leisure/garden": {
                     "name": "花園",
                 },
                 "leisure/hackerspace": {
                     "name": "駭客空間",
-                    "terms": "駭客空間"
+                    "terms": "駭客空間,Hackerspace"
                 },
                 "leisure/horse_riding": {
                     "name": "騎馬場",
                 },
                 "leisure/water_park": {
                     "name": "水上樂園",
-                    "terms": "水上公園"
+                    "terms": "水上公園,水上遊樂園"
                 },
                 "line": {
-                    "name": "線",
+                    "name": "線",
                     "terms": "線"
                 },
                 "man_made": {
                     "name": "人工設施",
-                    "terms": "人造構築,人造建築"
+                    "terms": "人造構築,人造建築,人造設施"
                 },
                 "man_made/adit": {
                     "name": "坑口",
                     "name": "塔狀天線",
                     "terms": "塔狀天線,天線"
                 },
+                "man_made/monitoring_station": {
+                    "name": "監測站",
+                    "terms": "監測點"
+                },
                 "man_made/observation": {
                     "name": "瞭望塔",
                     "terms": "瞭望塔"
                 },
                 "man_made/water_well": {
                     "name": "水井",
-                    "terms": "水井"
+                    "terms": "水井,井,取水井"
                 },
                 "man_made/water_works": {
                     "name": "淨水廠",
                 },
                 "office/accountant": {
                     "name": "會計師事務所",
-                    "terms": "<translate with synonyms or related terms for 'Accountant Office', separated by commas>"
+                    "terms": "會計師辦公室,會計師"
                 },
                 "office/administrative": {
-                    "name": "行政辦公室",
-                    "terms": "行政辦公室"
+                    "name": "行政辦公室"
                 },
                 "office/adoption_agency": {
                     "name": "領養代理",
-                    "terms": "<translate with synonyms or related terms for 'Adoption Agency', separated by commas>"
+                    "terms": "領養事務所"
                 },
                 "office/advertising_agency": {
                     "name": "廣告代理公司",
-                    "terms": "<translate with synonyms or related terms for 'Advertising Agency', separated by commas>"
+                    "terms": "廣告代理商"
                 },
                 "office/architect": {
                     "name": "建築師事務所",
-                    "terms": "<translate with synonyms or related terms for 'Architect Office', separated by commas>"
+                    "terms": "建築師辦公室,建築師"
                 },
                 "office/association": {
                     "name": "非營利組織辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Nonprofit Organization Office', separated by commas>"
+                    "terms": "NGO,非營利組織"
                 },
                 "office/charity": {
                     "name": "慈善事業辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Charity Office', separated by commas>"
+                    "terms": "慈善事業"
                 },
                 "office/company": {
-                    "name": "公司辦事處",
-                    "terms": "一般公司"
+                    "name": "公司辦公室",
+                    "terms": "辦公室,企業辦事處,企業辦公室"
                 },
                 "office/coworking": {
                     "name": "共同工作空間",
                 },
                 "office/educational_institution": {
                     "name": "教育機構",
-                    "terms": "教育機構,教育單位"
+                    "terms": "教育機構,教育單位,補習班"
                 },
                 "office/employment_agency": {
                     "name": "就業服務站",
                 },
                 "office/energy_supplier": {
                     "name": "電力供應辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Energy Supplier Office', separated by commas>"
+                    "terms": "電力公司辦公室,台電,台電辦事處"
                 },
                 "office/estate_agent": {
                     "name": "房地產仲介",
                 },
                 "office/forestry": {
                     "name": "林務辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Forestry Office', separated by commas>"
+                    "terms": "林務局"
                 },
                 "office/foundation": {
                     "name": "基金會辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Foundation Office', separated by commas>"
+                    "terms": "基金會"
                 },
                 "office/government": {
                     "name": "政府辦公室",
-                    "terms": "政府辦公室"
+                    "terms": "政府機關"
                 },
                 "office/government/register_office": {
                     "name": "戶政事務所",
                 },
                 "office/government/tax": {
                     "name": "稅務辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Tax and Revenue Office', separated by commas>"
+                    "terms": "稅捐處"
                 },
                 "office/guide": {
                     "name": "導遊辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Tour Guide Office', separated by commas>"
+                    "terms": "導遊"
                 },
                 "office/insurance": {
                     "name": "保險公司辦公室",
                 },
                 "office/it": {
                     "name": "資訊公司辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Information Technology Office', separated by commas>"
+                    "terms": "IT"
                 },
                 "office/lawyer": {
                     "name": "律師事務所",
                     "terms": "法律事務所,律師樓"
                 },
                 "office/lawyer/notary": {
-                    "name": "公證處",
-                    "terms": "公證人,民間公證人,民間公證處,Notary Office"
+                    "name": "公證處"
                 },
                 "office/moving_company": {
                     "name": "搬家公司辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Moving Company Office', separated by commas>"
+                    "terms": "搬家公司"
                 },
                 "office/newspaper": {
                     "name": "報社辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Newspaper Office', separated by commas>"
+                    "terms": "媒體,報社,電視台,網路媒體"
                 },
                 "office/ngo": {
                     "name": "非政府機構辦公室",
-                    "terms": "NGO辦公室"
+                    "terms": "NGO辦公室,非政府組織"
                 },
                 "office/notary": {
                     "name": "公證處",
-                    "terms": "<translate with synonyms or related terms for 'Notary Office', separated by commas>"
+                    "terms": "公證處"
                 },
                 "office/physician": {
                     "name": "醫務所"
                 },
                 "office/private_investigator": {
                     "name": "私家偵探辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Private Investigator Office', separated by commas>"
+                    "terms": "私家偵探"
                 },
                 "office/quango": {
                     "name": "準非政府組織辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Quasi-NGO Office', separated by commas>"
+                    "terms": "準非政府組織辦公室"
                 },
                 "office/research": {
                     "name": "研究機構",
-                    "terms": "研究辦公室"
+                    "terms": "研究辦公室,研究中心"
                 },
                 "office/surveyor": {
                     "name": "測量員辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Surveyor Office', separated by commas>"
+                    "terms": "地圖測繪"
                 },
                 "office/tax_advisor": {
                     "name": "稅務顧問辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Tax Advisor Office', separated by commas>"
+                    "terms": "稅務顧問辦公室"
                 },
                 "office/telecommunication": {
                     "name": "電信公司辦事處",
-                    "terms": "電訊公司辦事處"
+                    "terms": "電訊公司辦事處,電信門市"
                 },
                 "office/therapist": {
                     "name": "治療師辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Therapist Office', separated by commas>"
+                    "terms": "治療師辦公室"
                 },
                 "office/travel_agent": {
                     "name": "旅行社"
                 },
                 "office/water_utility": {
                     "name": "自來水設施辦公室",
-                    "terms": "<translate with synonyms or related terms for 'Water Utility Office', separated by commas>"
+                    "terms": "自來水事務處,自來水公司"
                 },
                 "piste": {
                     "name": "滑雪場",
                 },
                 "place/plot": {
                     "name": "地籍",
-                    "terms": "<translate with synonyms or related terms for 'Plot', separated by commas>"
+                    "terms": "地籍"
                 },
                 "place/quarter": {
                     "name": "自治市區",
                 },
                 "playground/balance_beam": {
                     "name": "平衡梁",
-                    "terms": "<translate with synonyms or related terms for 'Play Balance Beam', separated by commas>"
+                    "terms": "平衡梁"
                 },
                 "playground/basket_spinner": {
                     "name": "籃子旋轉器",
-                    "terms": "<translate with synonyms or related terms for 'Basket Spinner', separated by commas>"
+                    "terms": "籃子旋轉器"
                 },
                 "playground/basket_swing": {
                     "name": "籃子鞦韆",
-                    "terms": "<translate with synonyms or related terms for 'Basket Swing', separated by commas>"
+                    "terms": "籃子鞦韆"
                 },
                 "playground/climbing_frame": {
                     "name": "攀爬架",
-                    "terms": "<translate with synonyms or related terms for 'Climbing Frame', separated by commas>"
+                    "terms": "攀爬架"
                 },
                 "playground/cushion": {
                     "name": "彈力靠墊",
-                    "terms": "<translate with synonyms or related terms for 'Bouncy Cushion', separated by commas>"
+                    "terms": "彈力靠墊"
                 },
                 "playground/horizontal_bar": {
                     "name": "單槓",
-                    "terms": "<translate with synonyms or related terms for 'Play Horizontal Bar', separated by commas>"
+                    "terms": "單槓"
                 },
                 "playground/rocker": {
                     "name": "彈簧椅",
-                    "terms": "<translate with synonyms or related terms for 'Spring Rider', separated by commas>"
+                    "terms": "彈簧椅"
                 },
                 "playground/roundabout": {
                     "name": "旋轉輪",
-                    "terms": "<translate with synonyms or related terms for 'Play Roundabout', separated by commas>"
+                    "terms": "旋轉輪"
                 },
                 "playground/sandpit": {
                     "name": "沙坑",
-                    "terms": "<translate with synonyms or related terms for 'Sandpit', separated by commas>"
+                    "terms": "沙坑"
                 },
                 "playground/seesaw": {
                     "name": "蹺蹺板",
-                    "terms": "<translate with synonyms or related terms for 'Seesaw', separated by commas>"
+                    "terms": "蹺蹺板"
                 },
                 "playground/slide": {
                     "name": "溜滑梯",
-                    "terms": "<translate with synonyms or related terms for 'Slide', separated by commas>"
+                    "terms": "溜滑梯"
                 },
                 "playground/structure": {
                     "name": "遊樂場設施",
-                    "terms": "<translate with synonyms or related terms for 'Play Structure', separated by commas>"
+                    "terms": "遊樂場設施"
                 },
                 "playground/swing": {
                     "name": "鞦韆",
-                    "terms": "<translate with synonyms or related terms for 'Swing', separated by commas>"
+                    "terms": "鞦韆"
                 },
                 "playground/zipwire": {
                     "name": "Zip Wire",
-                    "terms": "<translate with synonyms or related terms for 'Zip Wire', separated by commas>"
+                    "terms": "Zip Wire"
                 },
                 "point": {
                     "name": "點",
                     "name": "變壓器",
                     "terms": "變壓器"
                 },
+                "public_transport/linear_platform": {
+                    "name": "轉運站 / 月台",
+                    "terms": "站牌,客運站牌,客運月台"
+                },
+                "public_transport/linear_platform_aerialway": {
+                    "name": "纜車站/月台",
+                    "terms": "纜車站,纜車月台"
+                },
+                "public_transport/linear_platform_bus": {
+                    "name": "公車站/公車月台",
+                    "terms": "公車月台"
+                },
+                "public_transport/linear_platform_ferry": {
+                    "name": "船運停船處 / 船運月台",
+                    "terms": "渡輪停船處,船運月台"
+                },
+                "public_transport/linear_platform_light_rail": {
+                    "name": "輕軌停車處/ 月台",
+                    "terms": "輕軌停車處,輕軌月台"
+                },
+                "public_transport/linear_platform_monorail": {
+                    "name": "單軌電車停車處 / 月台",
+                    "terms": "單軌電車停車處,"
+                },
+                "public_transport/linear_platform_subway": {
+                    "name": "捷運停車處 / 月台",
+                    "terms": "地鐵停車處,地鐵月台"
+                },
+                "public_transport/linear_platform_train": {
+                    "name": "火車停車處 / 月台",
+                    "terms": "火車停車處,火車月台"
+                },
+                "public_transport/linear_platform_tram": {
+                    "name": "街車停車處 / 月台",
+                    "terms": "街車停車處,街車月台"
+                },
+                "public_transport/linear_platform_trolleybus": {
+                    "name": "無軌電車停車處 / 月台",
+                    "terms": "無軌電車停車處,無軌電車月台"
+                },
                 "public_transport/platform": {
-                    "name": "月台",
-                    "terms": "站台"
+                    "name": "公車專用道停車處 / 月台",
+                    "terms": "公車專用道停車處,公車專用道月台"
+                },
+                "public_transport/platform_aerialway": {
+                    "name": "纜車站 / 月台",
+                    "terms": "纜車站,纜車月台"
+                },
+                "public_transport/platform_bus": {
+                    "name": "公車站牌 / 公車月台",
+                    "terms": "公車站牌,公車月台,巴士站牌,巴士月台"
+                },
+                "public_transport/platform_ferry": {
+                    "name": "船運停船處 / 船運月台",
+                    "terms": "船運停船處,船運月台,"
+                },
+                "public_transport/platform_light_rail": {
+                    "name": "輕軌停車處/ 月台",
+                    "terms": "輕軌停車處,輕軌月台"
+                },
+                "public_transport/platform_monorail": {
+                    "name": "單軌電車停車處 / 月台",
+                    "terms": "單軌電車停車處,單軌月台"
+                },
+                "public_transport/platform_subway": {
+                    "name": "捷運停車處 / 月台",
+                    "terms": "捷運停車處,捷運月台,地鐵停車處,地鐵月台"
+                },
+                "public_transport/platform_train": {
+                    "name": "火車停車處 / 月台",
+                    "terms": "火車停車處,火車月台"
+                },
+                "public_transport/platform_tram": {
+                    "name": "路面電車停車處 / 月台",
+                    "terms": "路面電車停車處,路面電車月台"
+                },
+                "public_transport/platform_trolleybus": {
+                    "name": "無軌電車站 / 月台",
+                    "terms": "無軌電車站,無軌電車月台"
+                },
+                "public_transport/station": {
+                    "name": "轉運站",
+                    "terms": "客運站"
+                },
+                "public_transport/station_aerialway": {
+                    "name": "纜車站",
+                    "terms": "纜車車站"
+                },
+                "public_transport/station_bus": {
+                    "name": "轉運站",
+                    "terms": "客運站"
+                },
+                "public_transport/station_ferry": {
+                    "name": "船運站",
+                    "terms": "船運站,渡輪站"
+                },
+                "public_transport/station_light_rail": {
+                    "name": "輕軌站",
+                    "terms": "輕軌車站"
+                },
+                "public_transport/station_monorail": {
+                    "name": "單軌站",
+                    "terms": "單軌車站"
+                },
+                "public_transport/station_subway": {
+                    "name": "捷運站",
+                    "terms": "地鐵站,地下鐵站"
+                },
+                "public_transport/station_train": {
+                    "name": "火車站",
+                    "terms": "鐵路車站,車站"
+                },
+                "public_transport/station_train_halt": {
+                    "name": "火車站 (小站/招呼)",
+                    "terms": "招呼站,小站"
+                },
+                "public_transport/station_tram": {
+                    "name": "電車站",
+                    "terms": "電車站"
+                },
+                "public_transport/station_trolleybus": {
+                    "name": "無軌電車站",
+                    "terms": "無軌電車站"
+                },
+                "public_transport/stop_area": {
+                    "name": "轉運站區",
+                    "terms": "客運站區"
                 },
                 "public_transport/stop_position": {
-                    "name": "停車位置",
-                    "terms": "靠站位置"
+                    "name": "轉運站停車位置",
+                    "terms": "客運站停車位置"
+                },
+                "public_transport/stop_position_aerialway": {
+                    "name": "纜車停車位置",
+                    "terms": "纜車停車位置"
+                },
+                "public_transport/stop_position_bus": {
+                    "name": "公車停靠位置",
+                    "terms": "巴士停靠位置"
+                },
+                "public_transport/stop_position_ferry": {
+                    "name": "船運停船位置",
+                    "terms": "船運停船點"
+                },
+                "public_transport/stop_position_light_rail": {
+                    "name": "輕軌鐵路停車位置",
+                    "terms": "輕軌電車停車點"
+                },
+                "public_transport/stop_position_monorail": {
+                    "name": "單軌電車停車位置",
+                    "terms": "單軌電車停車點"
+                },
+                "public_transport/stop_position_subway": {
+                    "name": "捷運停車位置",
+                    "terms": "捷運停車點"
+                },
+                "public_transport/stop_position_train": {
+                    "name": "火車停車位置",
+                    "terms": "火車停車點"
+                },
+                "public_transport/stop_position_tram": {
+                    "name": "街車停車位置",
+                    "terms": "街車停車點"
+                },
+                "public_transport/stop_position_trolleybus": {
+                    "name": "無軌電車停車位置",
+                    "terms": "無軌電車停車點"
                 },
                 "railway": {
                     "name": "鐵路"
                     "terms": "纜車"
                 },
                 "railway/halt": {
-                    "name": "無人招呼站",
-                    "terms": "鐵路停車處"
+                    "name": "火車站 (小站/招呼)"
                 },
                 "railway/level_crossing": {
                     "name": "鐵路平交道(道路)",
                     "terms": "鐵路平交道,平交道"
                 },
+                "railway/light_rail": {
+                    "name": "輕軌",
+                    "terms": "輕軌鐵路"
+                },
                 "railway/milestone": {
                     "name": "鐵路里程碑",
                     "terms": "鐵路里程碑"
                 },
+                "railway/miniature": {
+                    "name": "微型鐵路",
+                    "terms": "微型鐵路,微型鐵軌"
+                },
                 "railway/monorail": {
                     "name": "單軌電車",
                     "terms": "畢軌電車"
                     "terms": "窄軌鐵路"
                 },
                 "railway/platform": {
-                    "name": "月台",
-                    "terms": "鐵道月台,鐵路月台,輕軌月台"
+                    "name": "街車站/月台"
                 },
                 "railway/rail": {
                     "name": "鐵軌",
                     "terms": "鐵道信號"
                 },
                 "railway/station": {
-                    "name": "火車站",
-                    "terms": "鐵路站,車站,高鐵站"
+                    "name": "火車站"
                 },
                 "railway/subway": {
                     "name": "捷運",
                     "terms": "電車"
                 },
                 "railway/tram_stop": {
-                    "name": "電車站",
-                    "terms": "電車站,車站"
+                    "name": "街車停靠點"
                 },
                 "relation": {
                     "name": "關係",
                 },
                 "shop/agrarian": {
                     "name": "農用品店",
-                    "terms": "<translate with synonyms or related terms for 'Agriculture Shop', separated by commas>"
+                    "terms": "農用品店"
                 },
                 "shop/alcohol": {
                     "name": "酒類專賣店",
                     "terms": "銀樓,首飾店"
                 },
                 "shop/kiosk": {
-                    "name": "報紙販賣機",
-                    "terms": "å ±ç´\99販賣æ©\9f"
+                    "name": "書報攤",
+                    "terms": "å\94®è²¨äº­"
                 },
                 "shop/kitchen": {
                     "name": "廚房設計行",
-                    "terms": "廚房設計店"
+                    "terms": "廚房設計店,廚房用品店"
                 },
                 "shop/laundry": {
                     "name": "洗衣店",
                     "terms": "鎖匠"
                 },
                 "shop/lottery": {
-                    "name": "投注站",
-                    "terms": "彩券行"
+                    "name": "彩券行",
+                    "terms": "投注站,公益彩券"
                 },
                 "shop/mall": {
                     "name": "購物中心",
                 },
                 "shop/medical_supply": {
                     "name": "醫療器材行",
-                    "terms": "醫療器材店"
+                    "terms": "醫療用品店"
                 },
                 "shop/mobile_phone": {
                     "name": "行動電話店",
-                    "terms": "手機商店,手機店"
+                    "terms": "手機商店,手機店,手機行,行動通訊店"
                 },
                 "shop/money_lender": {
-                    "name": "放款人",
-                    "terms": "借貸人"
+                    "name": "地下錢莊",
+                    "terms": "借貸人,放款人,汽車借款"
                 },
                 "shop/motorcycle": {
                     "name": "機車行",
                     "terms": "電子遊戲商店,電玩店"
                 },
                 "shop/watches": {
-                    "name": "手錶店",
+                    "name": "鐘錶行",
                     "terms": "手錶店"
                 },
                 "shop/water_sports": {
                 },
                 "tourism/chalet": {
                     "name": "假日小屋",
-                    "terms": "<translate with synonyms or related terms for 'Holiday Cottage', separated by commas>"
+                    "terms": "假日小屋"
                 },
                 "tourism/gallery": {
                     "name": "藝廊",
                     "terms": "博物館"
                 },
                 "tourism/picnic_site": {
-                    "name": "é\87\8eé¤\90å\9c°é»\9e",
+                    "name": "é\87\8eé¤\90å ´å\9c°",
                     "terms": "野餐地點"
                 },
                 "tourism/theme_park": {
                 },
                 "tourism/wilderness_hut": {
                     "name": "野外小屋",
-                    "terms": "<translate with synonyms or related terms for 'Wilderness Hut', separated by commas>"
+                    "terms": "野外小屋"
                 },
                 "tourism/zoo": {
                     "name": "動物園",
                     "name": "騎馬路線",
                     "terms": "騎馬路線,騎乘路線"
                 },
+                "type/route/light_rail": {
+                    "name": "輕軌路線",
+                    "terms": "輕軌路線"
+                },
                 "type/route/pipeline": {
                     "name": "管道路線",
                     "terms": "管線路線"
                 },
+                "type/route/piste": {
+                    "name": "滑雪路線",
+                    "terms": "滑雪路線"
+                },
                 "type/route/power": {
                     "name": "供電路線",
                     "terms": "輸電線路"
                     "name": "道路路線",
                     "terms": "公路路線"
                 },
+                "type/route/subway": {
+                    "name": "地下鐵路線",
+                    "terms": "地下鐵路線,捷運路線"
+                },
                 "type/route/train": {
                     "name": "鐵路路線",
                     "terms": "列車路線"
                 "description": "Esri 世界衛星圖。",
                 "name": "Esri 世界衛星圖"
             },
+            "EsriWorldImageryClarity": {
+                "attribution": {
+                    "text": "使用條款與意見回饋"
+                },
+                "description": "Ersi 的封存衛星圖可能比預設的圖層更清晰且更精確。",
+                "name": "Esri 世界衛星圖(清晰版)Beta"
+            },
             "MAPNIK": {
                 "attribution": {
                     "text": "© OpenStreetMap 貢獻者,CC-BY-SA"
             },
             "Waymarked_Trails-Cycling": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0,圖資:OpenStreetMap 貢獻者, ODbL 1.0"
+                    "text": "© waymarkedtrails.org,OpenStreetMap 貢獻者,,CC by-SA 3.0"
                 },
                 "name": "小徑標示:自行車"
             },
             "Waymarked_Trails-Hiking": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0,圖資:OpenStreetMap 貢獻者, ODbL 1.0"
+                    "text": "© waymarkedtrails.org,OpenStreetMap 貢獻者,,CC by-SA 3.0"
                 },
                 "name": "小徑標示:健行"
             },
             "Waymarked_Trails-MTB": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0,圖資:OpenStreetMap 貢獻者, ODbL 1.0"
+                    "text": "© waymarkedtrails.org,OpenStreetMap 貢獻者,,CC by-SA 3.0"
                 },
                 "name": "小徑標示:MTB"
             },
             "Waymarked_Trails-Skating": {
                 "attribution": {
-                    "text": "© Sarah Hoffmann, CC by-SA 3.0,圖資:OpenStreetMap 貢獻者, ODbL 1.0"
+                    "text": "© waymarkedtrails.org,OpenStreetMap 貢獻者,,CC by-SA 3.0"
                 },
                 "name": "小徑標示:溜冰"
             },
             "Waymarked_Trails-Winter_Sports": {
                 "attribution": {
-                    "text": "© Michael Spreng, CC by-SA 3.0,圖資:OpenStreetMap 貢獻者, ODbL 1.0"
+                    "text": "© waymarkedtrails.org,OpenStreetMap 貢獻者,,CC by-SA 3.0"
                 },
                 "name": "小徑標示:冬季運動"
             },
index d4c2818733f2e7d3f7f769bc30384f7a3e130ddc..5dc7923198cfa2a9457f3b61a0a65ff839ce674a 100644 (file)
         "background": {
             "title": "背景",
             "description": "设置背景",
-            "percent_brightness": "{opacity}% 亮度",
             "reset": "重置"
         },
         "restore": {
                     "label": "容量",
                     "placeholder": "50, 100, 200..."
                 },
-                "cardinal_direction": {
-                    "label": "方向"
-                },
-                "clock_direction": {
-                    "label": "方向",
-                    "options": {
-                        "anticlockwise": "逆时针",
-                        "clockwise": "顺时针"
-                    }
-                },
                 "collection_times": {
                     "label": "收集时间"
                 },
                 "highway/bridleway": {
                     "name": "马道"
                 },
-                "highway/bus_stop": {
-                    "name": "公交车站"
-                },
                 "highway/cycleway": {
                     "name": "自行车道"
                 },
                 "railway/monorail": {
                     "name": "单轨铁路"
                 },
-                "railway/platform": {
-                    "name": "站台"
-                },
                 "railway/rail": {
                     "name": "铁轨"
                 },
-                "railway/station": {
-                    "name": "火车站"
-                },
                 "railway/subway": {
                     "name": "地铁"
                 },
index 6331a973f370f490a7430524a63e942be698e8e5..5ffb3a7e1499dc7bebec3d7c15cb6aa619c17c73 100644 (file)
@@ -156,7 +156,7 @@ function getSegDistSq(px, py, a, b) {
     return dx * dx + dy * dy;
 }
 
-},{"tinyqueue":181}],2:[function(require,module,exports){
+},{"tinyqueue":232}],2:[function(require,module,exports){
 /*
  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
  *
@@ -679,7 +679,7 @@ process.umask = function() { return 0; };
 /*!
  * The buffer module from node.js, for the browser.
  *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @author   Feross Aboukhadijeh <https://feross.org>
  * @license  MIT
  */
 /* eslint-disable no-proto */
@@ -782,7 +782,7 @@ function from (value, encodingOrOffset, length) {
     throw new TypeError('"value" argument must not be a number')
   }
 
-  if (value instanceof ArrayBuffer) {
+  if (isArrayBuffer(value)) {
     return fromArrayBuffer(value, encodingOrOffset, length)
   }
 
@@ -1042,7 +1042,7 @@ function byteLength (string, encoding) {
   if (Buffer.isBuffer(string)) {
     return string.length
   }
-  if (isArrayBufferView(string) || string instanceof ArrayBuffer) {
+  if (isArrayBufferView(string) || isArrayBuffer(string)) {
     return string.byteLength
   }
   if (typeof string !== 'string') {
@@ -2374,6 +2374,14 @@ function blitBuffer (src, dst, offset, length) {
   return i
 }
 
+// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
+// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
+function isArrayBuffer (obj) {
+  return obj instanceof ArrayBuffer ||
+    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
+      typeof obj.byteLength === 'number')
+}
+
 // Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`
 function isArrayBufferView (obj) {
   return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)
@@ -2387,6 +2395,7 @@ function numberIsNaN (obj) {
 'use strict';
 
 module.exports = earcut;
+module.exports.default = earcut;
 
 function earcut(data, holeIndices, dim) {
 
@@ -2399,7 +2408,7 @@ function earcut(data, holeIndices, dim) {
 
     if (!outerNode) return triangles;
 
-    var minX, minY, maxX, maxY, x, y, size;
+    var minX, minY, maxX, maxY, x, y, invSize;
 
     if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
 
@@ -2417,11 +2426,12 @@ function earcut(data, holeIndices, dim) {
             if (y > maxY) maxY = y;
         }
 
-        // minX, minY and size are later used to transform coords into integers for z-order calculation
-        size = Math.max(maxX - minX, maxY - minY);
+        // minX, minY and invSize are later used to transform coords into integers for z-order calculation
+        invSize = Math.max(maxX - minX, maxY - minY);
+        invSize = invSize !== 0 ? 1 / invSize : 0;
     }
 
-    earcutLinked(outerNode, triangles, dim, minX, minY, size);
+    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
 
     return triangles;
 }
@@ -2457,7 +2467,7 @@ function filterPoints(start, end) {
         if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
             removeNode(p);
             p = end = p.prev;
-            if (p === p.next) return null;
+            if (p === p.next) break;
             again = true;
 
         } else {
@@ -2469,11 +2479,11 @@ function filterPoints(start, end) {
 }
 
 // main ear slicing loop which triangulates a polygon (given as a linked list)
-function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
+function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
     if (!ear) return;
 
     // interlink polygon nodes in z-order
-    if (!pass && size) indexCurve(ear, minX, minY, size);
+    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
 
     var stop = ear,
         prev, next;
@@ -2483,7 +2493,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         prev = ear.prev;
         next = ear.next;
 
-        if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
+        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
             // cut off the triangle
             triangles.push(prev.i / dim);
             triangles.push(ear.i / dim);
@@ -2504,16 +2514,16 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         if (ear === stop) {
             // try filtering points and slicing again
             if (!pass) {
-                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
+                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
 
             // if this didn't work, try curing all small self-intersections locally
             } else if (pass === 1) {
                 ear = cureLocalIntersections(ear, triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, size, 2);
+                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
 
             // as a last resort, try splitting the remaining polygon into two
             } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, size);
+                splitEarcut(ear, triangles, dim, minX, minY, invSize);
             }
 
             break;
@@ -2541,7 +2551,7 @@ function isEar(ear) {
     return true;
 }
 
-function isEarHashed(ear, minX, minY, size) {
+function isEarHashed(ear, minX, minY, invSize) {
     var a = ear.prev,
         b = ear,
         c = ear.next;
@@ -2555,8 +2565,8 @@ function isEarHashed(ear, minX, minY, size) {
         maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
 
     // z-order range for the current triangle bbox;
-    var minZ = zOrder(minTX, minTY, minX, minY, size),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, size);
+    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
+        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
 
     // first look for points inside the triangle in increasing z-order
     var p = ear.nextZ;
@@ -2607,7 +2617,7 @@ function cureLocalIntersections(start, triangles, dim) {
 }
 
 // try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, size) {
+function splitEarcut(start, triangles, dim, minX, minY, invSize) {
     // look for a valid diagonal that divides the polygon into two
     var a = start;
     do {
@@ -2622,8 +2632,8 @@ function splitEarcut(start, triangles, dim, minX, minY, size) {
                 c = filterPoints(c, c.next);
 
                 // run earcut on each half
-                earcutLinked(a, triangles, dim, minX, minY, size);
-                earcutLinked(c, triangles, dim, minX, minY, size);
+                earcutLinked(a, triangles, dim, minX, minY, invSize);
+                earcutLinked(c, triangles, dim, minX, minY, invSize);
                 return;
             }
             b = b.next;
@@ -2680,7 +2690,7 @@ function findHoleBridge(hole, outerNode) {
     // find a segment intersected by a ray from the hole's leftmost point to the left;
     // segment's endpoint with lesser x will be potential connection point
     do {
-        if (hy <= p.y && hy >= p.next.y) {
+        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
             var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
             if (x <= hx && x > qx) {
                 qx = x;
@@ -2711,7 +2721,7 @@ function findHoleBridge(hole, outerNode) {
     p = m.next;
 
     while (p !== stop) {
-        if (hx >= p.x && p.x >= mx &&
+        if (hx >= p.x && p.x >= mx && hx !== p.x &&
                 pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
 
             tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
@@ -2729,10 +2739,10 @@ function findHoleBridge(hole, outerNode) {
 }
 
 // interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, size) {
+function indexCurve(start, minX, minY, invSize) {
     var p = start;
     do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
+        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
         p.prevZ = p.prev;
         p.nextZ = p.next;
         p = p.next;
@@ -2765,20 +2775,11 @@ function sortLinked(list) {
                 q = q.nextZ;
                 if (!q) break;
             }
-
             qSize = inSize;
 
             while (pSize > 0 || (qSize > 0 && q)) {
 
-                if (pSize === 0) {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                } else if (qSize === 0 || !q) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else if (p.z <= q.z) {
+                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
                     e = p;
                     p = p.nextZ;
                     pSize--;
@@ -2806,11 +2807,11 @@ function sortLinked(list) {
     return list;
 }
 
-// z-order of a point given coords and size of the data bounding box
-function zOrder(x, y, minX, minY, size) {
+// z-order of a point given coords and inverse of the longer side of data bbox
+function zOrder(x, y, minX, minY, invSize) {
     // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) / size;
-    y = 32767 * (y - minY) / size;
+    x = 32767 * (x - minX) * invSize;
+    y = 32767 * (y - minY) * invSize;
 
     x = (x | (x << 8)) & 0x00FF00FF;
     x = (x | (x << 4)) & 0x0F0F0F0F;
@@ -2894,7 +2895,8 @@ function middleInside(a, b) {
         px = (a.x + b.x) / 2,
         py = (a.y + b.y) / 2;
     do {
-        if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
+        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
+                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
             inside = !inside;
         p = p.next;
     } while (p !== a);
@@ -5392,7 +5394,7 @@ var BehaviorSubject = (function (_super) {
 }(Subject_1.Subject));
 exports.BehaviorSubject = BehaviorSubject;
 
-},{"./Subject":34,"./util/ObjectUnsubscribedError":164}],27:[function(require,module,exports){
+},{"./Subject":34,"./util/ObjectUnsubscribedError":211}],27:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -5562,8 +5564,9 @@ exports.Notification = Notification;
 var root_1 = require('./util/root');
 var toSubscriber_1 = require('./util/toSubscriber');
 var observable_1 = require('./symbol/observable');
+var pipe_1 = require('./util/pipe');
 /**
- * A representation of any set of values over any amount of time. This the most basic building block
+ * A representation of any set of values over any amount of time. This is the most basic building block
  * of RxJS.
  *
  * @class Observable<T>
@@ -5571,7 +5574,7 @@ var observable_1 = require('./symbol/observable');
 var Observable = (function () {
     /**
      * @constructor
-     * @param {Function} subscribe the function that is  called when the Observable is
+     * @param {Function} subscribe the function that is called when the Observable is
      * initially subscribed to. This function is given a Subscriber, to which new values
      * can be `next`ed, or an `error` method can be called to raise an error, or
      * `complete` can be called to notify of a successful completion.
@@ -5600,7 +5603,7 @@ var Observable = (function () {
      *
      * <span class="informal">Use it when you have all these Observables, but still nothing is happening.</span>
      *
-     * `subscribe` is not a regular operator, but a method that calls Observables internal `subscribe` function. It
+     * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It
      * might be for example a function that you passed to a {@link create} static factory, but most of the time it is
      * a library implementation, which defines what and when will be emitted by an Observable. This means that calling
      * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often
@@ -5642,7 +5645,7 @@ var Observable = (function () {
      *     console.log('Adding: ' + value);
      *     this.sum = this.sum + value;
      *   },
-     *   error() { // We actually could just remote this method,
+     *   error() { // We actually could just remove this method,
      *   },        // since we do not really care about errors right now.
      *   complete() {
      *     console.log('Sum equals: ' + this.sum);
@@ -5697,7 +5700,7 @@ var Observable = (function () {
      * // Logs:
      * // 0 after 1s
      * // 1 after 2s
-     * // "unsubscribed!" after 2,5s
+     * // "unsubscribed!" after 2.5s
      *
      *
      * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,
@@ -5797,6 +5800,54 @@ var Observable = (function () {
     Observable.prototype[observable_1.observable] = function () {
         return this;
     };
+    /* tslint:enable:max-line-length */
+    /**
+     * Used to stitch together functional operators into a chain.
+     * @method pipe
+     * @return {Observable} the Observable result of all of the operators having
+     * been called in the order they were passed in.
+     *
+     * @example
+     *
+     * import { map, filter, scan } from 'rxjs/operators';
+     *
+     * Rx.Observable.interval(1000)
+     *   .pipe(
+     *     filter(x => x % 2 === 0),
+     *     map(x => x + x),
+     *     scan((acc, x) => acc + x)
+     *   )
+     *   .subscribe(x => console.log(x))
+     */
+    Observable.prototype.pipe = function () {
+        var operations = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            operations[_i - 0] = arguments[_i];
+        }
+        if (operations.length === 0) {
+            return this;
+        }
+        return pipe_1.pipeFromArray(operations)(this);
+    };
+    /* tslint:enable:max-line-length */
+    Observable.prototype.toPromise = function (PromiseCtor) {
+        var _this = this;
+        if (!PromiseCtor) {
+            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {
+                PromiseCtor = root_1.root.Rx.config.Promise;
+            }
+            else if (root_1.root.Promise) {
+                PromiseCtor = root_1.root.Promise;
+            }
+        }
+        if (!PromiseCtor) {
+            throw new Error('no Promise impl found');
+        }
+        return new PromiseCtor(function (resolve, reject) {
+            var value;
+            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
+        });
+    };
     // HACK: Since TypeScript inherits static properties too, we have to
     // fight against TypeScript here so Subject can have a different static create signature
     /**
@@ -5814,7 +5865,7 @@ var Observable = (function () {
 }());
 exports.Observable = Observable;
 
-},{"./symbol/observable":159,"./util/root":176,"./util/toSubscriber":178}],30:[function(require,module,exports){
+},{"./symbol/observable":206,"./util/pipe":226,"./util/root":227,"./util/toSubscriber":229}],30:[function(require,module,exports){
 "use strict";
 exports.empty = {
     closed: true,
@@ -5864,7 +5915,7 @@ var __extends = (this && this.__extends) || function (d, b) {
 var Subject_1 = require('./Subject');
 var queue_1 = require('./scheduler/queue');
 var Subscription_1 = require('./Subscription');
-var observeOn_1 = require('./operator/observeOn');
+var observeOn_1 = require('./operators/observeOn');
 var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
 var SubjectSubscription_1 = require('./SubjectSubscription');
 /**
@@ -5957,7 +6008,7 @@ var ReplayEvent = (function () {
     return ReplayEvent;
 }());
 
-},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operator/observeOn":131,"./scheduler/queue":157,"./util/ObjectUnsubscribedError":164}],33:[function(require,module,exports){
+},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operators/observeOn":174,"./scheduler/queue":204,"./util/ObjectUnsubscribedError":211}],33:[function(require,module,exports){
 "use strict";
 /**
  * An execution context and a data structure to order tasks and schedule their
@@ -6176,7 +6227,7 @@ var AnonymousSubject = (function (_super) {
 }(Subject));
 exports.AnonymousSubject = AnonymousSubject;
 
-},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/ObjectUnsubscribedError":164}],35:[function(require,module,exports){
+},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":207,"./util/ObjectUnsubscribedError":211}],35:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -6482,7 +6533,7 @@ var SafeSubscriber = (function (_super) {
     return SafeSubscriber;
 }(Subscriber));
 
-},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/isFunction":171}],37:[function(require,module,exports){
+},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":207,"./util/isFunction":220}],37:[function(require,module,exports){
 "use strict";
 var isArray_1 = require('./util/isArray');
 var isObject_1 = require('./util/isObject');
@@ -6676,305 +6727,317 @@ function flattenUnsubscriptionErrors(errors) {
     return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
 }
 
-},{"./util/UnsubscriptionError":166,"./util/errorObject":167,"./util/isArray":168,"./util/isFunction":171,"./util/isObject":173,"./util/tryCatch":179}],38:[function(require,module,exports){
+},{"./util/UnsubscriptionError":214,"./util/errorObject":215,"./util/isArray":217,"./util/isFunction":220,"./util/isObject":222,"./util/tryCatch":230}],38:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var combineLatest_1 = require('../../observable/combineLatest');
 Observable_1.Observable.combineLatest = combineLatest_1.combineLatest;
 
-},{"../../Observable":29,"../../observable/combineLatest":99}],39:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/combineLatest":101}],39:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var defer_1 = require('../../observable/defer');
 Observable_1.Observable.defer = defer_1.defer;
 
-},{"../../Observable":29,"../../observable/defer":100}],40:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/defer":103}],40:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var empty_1 = require('../../observable/empty');
 Observable_1.Observable.empty = empty_1.empty;
 
-},{"../../Observable":29,"../../observable/empty":101}],41:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/empty":104}],41:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var from_1 = require('../../observable/from');
 Observable_1.Observable.from = from_1.from;
 
-},{"../../Observable":29,"../../observable/from":102}],42:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/from":105}],42:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var fromEvent_1 = require('../../observable/fromEvent');
 Observable_1.Observable.fromEvent = fromEvent_1.fromEvent;
 
-},{"../../Observable":29,"../../observable/fromEvent":103}],43:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/fromEvent":106}],43:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var fromPromise_1 = require('../../observable/fromPromise');
 Observable_1.Observable.fromPromise = fromPromise_1.fromPromise;
 
-},{"../../Observable":29,"../../observable/fromPromise":104}],44:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/fromPromise":107}],44:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var merge_1 = require('../../observable/merge');
 Observable_1.Observable.merge = merge_1.merge;
 
-},{"../../Observable":29,"../../observable/merge":105}],45:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/merge":108}],45:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var of_1 = require('../../observable/of');
 Observable_1.Observable.of = of_1.of;
 
-},{"../../Observable":29,"../../observable/of":106}],46:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/of":109}],46:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var throw_1 = require('../../observable/throw');
 Observable_1.Observable.throw = throw_1._throw;
 
-},{"../../Observable":29,"../../observable/throw":107}],47:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/throw":110}],47:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var timer_1 = require('../../observable/timer');
 Observable_1.Observable.timer = timer_1.timer;
 
-},{"../../Observable":29,"../../observable/timer":108}],48:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/timer":111}],48:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var zip_1 = require('../../observable/zip');
 Observable_1.Observable.zip = zip_1.zip;
 
-},{"../../Observable":29,"../../observable/zip":109}],49:[function(require,module,exports){
+},{"../../Observable":29,"../../observable/zip":112}],49:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var buffer_1 = require('../../operator/buffer');
 Observable_1.Observable.prototype.buffer = buffer_1.buffer;
 
-},{"../../Observable":29,"../../operator/buffer":110}],50:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/buffer":113}],50:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var bufferCount_1 = require('../../operator/bufferCount');
 Observable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount;
 
-},{"../../Observable":29,"../../operator/bufferCount":111}],51:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/bufferCount":114}],51:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var bufferWhen_1 = require('../../operator/bufferWhen');
 Observable_1.Observable.prototype.bufferWhen = bufferWhen_1.bufferWhen;
 
-},{"../../Observable":29,"../../operator/bufferWhen":112}],52:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/bufferWhen":115}],52:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var catch_1 = require('../../operator/catch');
 Observable_1.Observable.prototype.catch = catch_1._catch;
 Observable_1.Observable.prototype._catch = catch_1._catch;
 
-},{"../../Observable":29,"../../operator/catch":113}],53:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/catch":116}],53:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var combineLatest_1 = require('../../operator/combineLatest');
 Observable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;
 
-},{"../../Observable":29,"../../operator/combineLatest":114}],54:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/combineLatest":117}],54:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var concat_1 = require('../../operator/concat');
 Observable_1.Observable.prototype.concat = concat_1.concat;
 
-},{"../../Observable":29,"../../operator/concat":115}],55:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/concat":118}],55:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var debounceTime_1 = require('../../operator/debounceTime');
 Observable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime;
 
-},{"../../Observable":29,"../../operator/debounceTime":116}],56:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/debounceTime":119}],56:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var delay_1 = require('../../operator/delay');
 Observable_1.Observable.prototype.delay = delay_1.delay;
 
-},{"../../Observable":29,"../../operator/delay":117}],57:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/delay":120}],57:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var distinct_1 = require('../../operator/distinct');
 Observable_1.Observable.prototype.distinct = distinct_1.distinct;
 
-},{"../../Observable":29,"../../operator/distinct":118}],58:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/distinct":121}],58:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var distinctUntilChanged_1 = require('../../operator/distinctUntilChanged');
 Observable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
 
-},{"../../Observable":29,"../../operator/distinctUntilChanged":119}],59:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/distinctUntilChanged":122}],59:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var do_1 = require('../../operator/do');
 Observable_1.Observable.prototype.do = do_1._do;
 Observable_1.Observable.prototype._do = do_1._do;
 
-},{"../../Observable":29,"../../operator/do":120}],60:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/do":123}],60:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var expand_1 = require('../../operator/expand');
 Observable_1.Observable.prototype.expand = expand_1.expand;
 
-},{"../../Observable":29,"../../operator/expand":121}],61:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/expand":124}],61:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var filter_1 = require('../../operator/filter');
 Observable_1.Observable.prototype.filter = filter_1.filter;
 
-},{"../../Observable":29,"../../operator/filter":122}],62:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/filter":125}],62:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var finally_1 = require('../../operator/finally');
 Observable_1.Observable.prototype.finally = finally_1._finally;
 Observable_1.Observable.prototype._finally = finally_1._finally;
 
-},{"../../Observable":29,"../../operator/finally":123}],63:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/finally":126}],63:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var first_1 = require('../../operator/first');
 Observable_1.Observable.prototype.first = first_1.first;
 
-},{"../../Observable":29,"../../operator/first":124}],64:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/first":127}],64:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var last_1 = require('../../operator/last');
 Observable_1.Observable.prototype.last = last_1.last;
 
-},{"../../Observable":29,"../../operator/last":125}],65:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/last":128}],65:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var map_1 = require('../../operator/map');
 Observable_1.Observable.prototype.map = map_1.map;
 
-},{"../../Observable":29,"../../operator/map":126}],66:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/map":129}],66:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var merge_1 = require('../../operator/merge');
 Observable_1.Observable.prototype.merge = merge_1.merge;
 
-},{"../../Observable":29,"../../operator/merge":127}],67:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/merge":130}],67:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var mergeAll_1 = require('../../operator/mergeAll');
 Observable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll;
 
-},{"../../Observable":29,"../../operator/mergeAll":128}],68:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/mergeAll":131}],68:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var mergeMap_1 = require('../../operator/mergeMap');
 Observable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;
 Observable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;
 
-},{"../../Observable":29,"../../operator/mergeMap":129}],69:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/mergeMap":132}],69:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var pairwise_1 = require('../../operator/pairwise');
 Observable_1.Observable.prototype.pairwise = pairwise_1.pairwise;
 
-},{"../../Observable":29,"../../operator/pairwise":132}],70:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/pairwise":133}],70:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var pluck_1 = require('../../operator/pluck');
 Observable_1.Observable.prototype.pluck = pluck_1.pluck;
 
-},{"../../Observable":29,"../../operator/pluck":133}],71:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/pluck":134}],71:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var publish_1 = require('../../operator/publish');
 Observable_1.Observable.prototype.publish = publish_1.publish;
 
-},{"../../Observable":29,"../../operator/publish":134}],72:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/publish":135}],72:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var publishReplay_1 = require('../../operator/publishReplay');
 Observable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;
 
-},{"../../Observable":29,"../../operator/publishReplay":135}],73:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/publishReplay":136}],73:[function(require,module,exports){
+"use strict";
+var Observable_1 = require('../../Observable');
+var retry_1 = require('../../operator/retry');
+Observable_1.Observable.prototype.retry = retry_1.retry;
+
+},{"../../Observable":29,"../../operator/retry":137}],74:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var sample_1 = require('../../operator/sample');
 Observable_1.Observable.prototype.sample = sample_1.sample;
 
-},{"../../Observable":29,"../../operator/sample":136}],74:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/sample":138}],75:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var scan_1 = require('../../operator/scan');
 Observable_1.Observable.prototype.scan = scan_1.scan;
 
-},{"../../Observable":29,"../../operator/scan":137}],75:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/scan":139}],76:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var share_1 = require('../../operator/share');
 Observable_1.Observable.prototype.share = share_1.share;
 
-},{"../../Observable":29,"../../operator/share":138}],76:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/share":140}],77:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var skip_1 = require('../../operator/skip');
 Observable_1.Observable.prototype.skip = skip_1.skip;
 
-},{"../../Observable":29,"../../operator/skip":139}],77:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/skip":141}],78:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var skipUntil_1 = require('../../operator/skipUntil');
 Observable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil;
 
-},{"../../Observable":29,"../../operator/skipUntil":140}],78:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/skipUntil":142}],79:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var skipWhile_1 = require('../../operator/skipWhile');
 Observable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile;
 
-},{"../../Observable":29,"../../operator/skipWhile":141}],79:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/skipWhile":143}],80:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var startWith_1 = require('../../operator/startWith');
 Observable_1.Observable.prototype.startWith = startWith_1.startWith;
 
-},{"../../Observable":29,"../../operator/startWith":142}],80:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/startWith":144}],81:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var switchMap_1 = require('../../operator/switchMap');
 Observable_1.Observable.prototype.switchMap = switchMap_1.switchMap;
 
-},{"../../Observable":29,"../../operator/switchMap":143}],81:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/switchMap":145}],82:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var take_1 = require('../../operator/take');
 Observable_1.Observable.prototype.take = take_1.take;
 
-},{"../../Observable":29,"../../operator/take":144}],82:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/take":146}],83:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var takeUntil_1 = require('../../operator/takeUntil');
 Observable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;
 
-},{"../../Observable":29,"../../operator/takeUntil":145}],83:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/takeUntil":147}],84:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var takeWhile_1 = require('../../operator/takeWhile');
 Observable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile;
 
-},{"../../Observable":29,"../../operator/takeWhile":146}],84:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/takeWhile":148}],85:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var throttleTime_1 = require('../../operator/throttleTime');
 Observable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime;
 
-},{"../../Observable":29,"../../operator/throttleTime":148}],85:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/throttleTime":149}],86:[function(require,module,exports){
+"use strict";
+var Observable_1 = require('../../Observable');
+var timeout_1 = require('../../operator/timeout');
+Observable_1.Observable.prototype.timeout = timeout_1.timeout;
+
+},{"../../Observable":29,"../../operator/timeout":150}],87:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var withLatestFrom_1 = require('../../operator/withLatestFrom');
 Observable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;
 
-},{"../../Observable":29,"../../operator/withLatestFrom":149}],86:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/withLatestFrom":151}],88:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../../Observable');
 var zip_1 = require('../../operator/zip');
 Observable_1.Observable.prototype.zip = zip_1.zipProto;
 
-},{"../../Observable":29,"../../operator/zip":150}],87:[function(require,module,exports){
+},{"../../Observable":29,"../../operator/zip":152}],89:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7045,7 +7108,7 @@ var ArrayLikeObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.ArrayLikeObservable = ArrayLikeObservable;
 
-},{"../Observable":29,"./EmptyObservable":91,"./ScalarObservable":97}],88:[function(require,module,exports){
+},{"../Observable":29,"./EmptyObservable":93,"./ScalarObservable":99}],90:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7168,7 +7231,7 @@ var ArrayObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.ArrayObservable = ArrayObservable;
 
-},{"../Observable":29,"../util/isScheduler":175,"./EmptyObservable":91,"./ScalarObservable":97}],89:[function(require,module,exports){
+},{"../Observable":29,"../util/isScheduler":224,"./EmptyObservable":93,"./ScalarObservable":99}],91:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7179,6 +7242,7 @@ var Subject_1 = require('../Subject');
 var Observable_1 = require('../Observable');
 var Subscriber_1 = require('../Subscriber');
 var Subscription_1 = require('../Subscription');
+var refCount_1 = require('../operators/refCount');
 /**
  * @class ConnectableObservable<T>
  */
@@ -7219,7 +7283,7 @@ var ConnectableObservable = (function (_super) {
         return connection;
     };
     ConnectableObservable.prototype.refCount = function () {
-        return this.lift(new RefCountOperator(this));
+        return refCount_1.refCount()(this);
     };
     return ConnectableObservable;
 }(Observable_1.Observable));
@@ -7338,7 +7402,7 @@ var RefCountSubscriber = (function (_super) {
     return RefCountSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37}],90:[function(require,module,exports){
+},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37,"../operators/refCount":179}],92:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7438,7 +7502,7 @@ var DeferSubscriber = (function (_super) {
     return DeferSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":177}],91:[function(require,module,exports){
+},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":228}],93:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7520,7 +7584,7 @@ var EmptyObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.EmptyObservable = EmptyObservable;
 
-},{"../Observable":29}],92:[function(require,module,exports){
+},{"../Observable":29}],94:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7604,7 +7668,7 @@ var ErrorObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.ErrorObservable = ErrorObservable;
 
-},{"../Observable":29}],93:[function(require,module,exports){
+},{"../Observable":29}],95:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7651,31 +7715,107 @@ var FromEventObservable = (function (_super) {
      * Creates an Observable that emits events of a specific type coming from the
      * given event target.
      *
-     * <span class="informal">Creates an Observable from DOM events, or Node
+     * <span class="informal">Creates an Observable from DOM events, or Node.js
      * EventEmitter events or others.</span>
      *
      * <img src="./img/fromEvent.png" width="100%">
      *
-     * Creates an Observable by attaching an event listener to an "event target",
-     * which may be an object with `addEventListener` and `removeEventListener`,
-     * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the
-     * DOM, or an HTMLCollection from the DOM. The event handler is attached when
-     * the output Observable is subscribed, and removed when the Subscription is
-     * unsubscribed.
+     * `fromEvent` accepts as a first argument event target, which is an object with methods
+     * for registering event handler functions. As a second argument it takes string that indicates
+     * type of event we want to listen for. `fromEvent` supports selected types of event targets,
+     * which are described in detail below. If your event target does not match any of the ones listed,
+     * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.
+     * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event
+     * handler functions have different names, but they all accept a string describing event type
+     * and function itself, which will be called whenever said event happens.
+     *
+     * Every time resulting Observable is subscribed, event handler function will be registered
+     * to event target on given event type. When that event fires, value
+     * passed as a first argument to registered function will be emitted by output Observable.
+     * When Observable is unsubscribed, function will be unregistered from event target.
+     *
+     * Note that if event target calls registered function with more than one argument, second
+     * and following arguments will not appear in resulting stream. In order to get access to them,
+     * you can pass to `fromEvent` optional project function, which will be called with all arguments
+     * passed to event handler. Output Observable will then emit value returned by project function,
+     * instead of the usual value.
+     *
+     * Remember that event targets listed below are checked via duck typing. It means that
+     * no matter what kind of object you have and no matter what environment you work in,
+     * you can safely use `fromEvent` on that object if it exposes described methods (provided
+     * of course they behave as was described above). So for example if Node.js library exposes
+     * event target which has the same method names as DOM EventTarget, `fromEvent` is still
+     * a good choice.
+     *
+     * If the API you use is more callback then event handler oriented (subscribed
+     * callback function fires only once and thus there is no need to manually
+     * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}
+     * instead.
+     *
+     * `fromEvent` supports following types of event targets:
+     *
+     * **DOM EventTarget**
+     *
+     * This is an object with `addEventListener` and `removeEventListener` methods.
+     *
+     * In the browser, `addEventListener` accepts - apart from event type string and event
+     * handler function arguments - optional third parameter, which is either an object or boolean,
+     * both used for additional configuration how and when passed function will be called. When
+     * `fromEvent` is used with event target of that type, you can provide this values
+     * as third parameter as well.
+     *
+     * **Node.js EventEmitter**
+     *
+     * An object with `addListener` and `removeListener` methods.
+     *
+     * **JQuery-style event target**
+     *
+     * An object with `on` and `off` methods
+     *
+     * **DOM NodeList**
+     *
+     * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.
+     *
+     * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes
+     * it contains and install event handler function in every of them. When returned Observable
+     * is unsubscribed, function will be removed from all Nodes.
+     *
+     * **DOM HtmlCollection**
+     *
+     * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is
+     * installed and removed in each of elements.
+     *
      *
      * @example <caption>Emits clicks happening on the DOM document</caption>
      * var clicks = Rx.Observable.fromEvent(document, 'click');
      * clicks.subscribe(x => console.log(x));
      *
      * // Results in:
-     * // MouseEvent object logged to console everytime a click
+     * // MouseEvent object logged to console every time a click
      * // occurs on the document.
      *
-     * @see {@link from}
+     *
+     * @example <caption>Use addEventListener with capture option</caption>
+     * var clicksInDocument = Rx.Observable.fromEvent(document, 'click', true); // note optional configuration parameter
+     *                                                                          // which will be passed to addEventListener
+     * var clicksInDiv = Rx.Observable.fromEvent(someDivInDocument, 'click');
+     *
+     * clicksInDocument.subscribe(() => console.log('document'));
+     * clicksInDiv.subscribe(() => console.log('div'));
+     *
+     * // By default events bubble UP in DOM tree, so normally
+     * // when we would click on div in document
+     * // "div" would be logged first and then "document".
+     * // Since we specified optional `capture` option, document
+     * // will catch event when it goes DOWN DOM tree, so console
+     * // will log "document" and then "div".
+     *
+     * @see {@link bindCallback}
+     * @see {@link bindNodeCallback}
      * @see {@link fromEventPattern}
      *
-     * @param {EventTargetLike} target The DOMElement, event target, Node.js
-     * EventEmitter, NodeList or HTMLCollection to attach the event handler to.
+     * @param {EventTargetLike} target The DOM EventTarget, Node.js
+     * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.
      * @param {string} eventName The event name of interest, being emitted by the
      * `target`.
      * @param {EventListenerOptions} [options] Options to pass through to addEventListener
@@ -7745,7 +7885,7 @@ var FromEventObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.FromEventObservable = FromEventObservable;
 
-},{"../Observable":29,"../Subscription":37,"../util/errorObject":167,"../util/isFunction":171,"../util/tryCatch":179}],94:[function(require,module,exports){
+},{"../Observable":29,"../Subscription":37,"../util/errorObject":215,"../util/isFunction":220,"../util/tryCatch":230}],96:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -7761,7 +7901,7 @@ var ArrayObservable_1 = require('./ArrayObservable');
 var ArrayLikeObservable_1 = require('./ArrayLikeObservable');
 var iterator_1 = require('../symbol/iterator');
 var Observable_1 = require('../Observable');
-var observeOn_1 = require('../operator/observeOn');
+var observeOn_1 = require('../operators/observeOn');
 var observable_1 = require('../symbol/observable');
 /**
  * We need this JSDoc comment for affecting ESDoc.
@@ -7868,7 +8008,7 @@ var FromObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.FromObservable = FromObservable;
 
-},{"../Observable":29,"../operator/observeOn":131,"../symbol/iterator":158,"../symbol/observable":159,"../util/isArray":168,"../util/isArrayLike":169,"../util/isPromise":174,"./ArrayLikeObservable":87,"./ArrayObservable":88,"./IteratorObservable":95,"./PromiseObservable":96}],95:[function(require,module,exports){
+},{"../Observable":29,"../operators/observeOn":174,"../symbol/iterator":205,"../symbol/observable":206,"../util/isArray":217,"../util/isArrayLike":218,"../util/isPromise":223,"./ArrayLikeObservable":89,"./ArrayObservable":90,"./IteratorObservable":97,"./PromiseObservable":98}],97:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -8032,7 +8172,7 @@ function sign(value) {
     return valueAsNumber < 0 ? -1 : 1;
 }
 
-},{"../Observable":29,"../symbol/iterator":158,"../util/root":176}],96:[function(require,module,exports){
+},{"../Observable":29,"../symbol/iterator":205,"../util/root":227}],98:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -8154,7 +8294,7 @@ function dispatchError(arg) {
     }
 }
 
-},{"../Observable":29,"../util/root":176}],97:[function(require,module,exports){
+},{"../Observable":29,"../util/root":227}],99:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -8213,7 +8353,7 @@ var ScalarObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.ScalarObservable = ScalarObservable;
 
-},{"../Observable":29}],98:[function(require,module,exports){
+},{"../Observable":29}],100:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -8321,12 +8461,12 @@ var TimerObservable = (function (_super) {
 }(Observable_1.Observable));
 exports.TimerObservable = TimerObservable;
 
-},{"../Observable":29,"../scheduler/async":156,"../util/isDate":170,"../util/isNumeric":172,"../util/isScheduler":175}],99:[function(require,module,exports){
+},{"../Observable":29,"../scheduler/async":203,"../util/isDate":219,"../util/isNumeric":221,"../util/isScheduler":224}],101:[function(require,module,exports){
 "use strict";
 var isScheduler_1 = require('../util/isScheduler');
 var isArray_1 = require('../util/isArray');
 var ArrayObservable_1 = require('./ArrayObservable');
-var combineLatest_1 = require('../operator/combineLatest');
+var combineLatest_1 = require('../operators/combineLatest');
 /* tslint:enable:max-line-length */
 /**
  * Combines multiple Observables to create an Observable whose values are
@@ -8458,65 +8598,171 @@ function combineLatest() {
 }
 exports.combineLatest = combineLatest;
 
-},{"../operator/combineLatest":114,"../util/isArray":168,"../util/isScheduler":175,"./ArrayObservable":88}],100:[function(require,module,exports){
+},{"../operators/combineLatest":157,"../util/isArray":217,"../util/isScheduler":224,"./ArrayObservable":90}],102:[function(require,module,exports){
+"use strict";
+var isScheduler_1 = require('../util/isScheduler');
+var of_1 = require('./of');
+var from_1 = require('./from');
+var concatAll_1 = require('../operators/concatAll');
+/* tslint:enable:max-line-length */
+/**
+ * Creates an output Observable which sequentially emits all values from given
+ * Observable and then moves on to the next.
+ *
+ * <span class="informal">Concatenates multiple Observables together by
+ * sequentially emitting their values, one Observable after the other.</span>
+ *
+ * <img src="./img/concat.png" width="100%">
+ *
+ * `concat` joins multiple Observables together, by subscribing to them one at a time and
+ * merging their results into the output Observable. You can pass either an array of
+ * Observables, or put them directly as arguments. Passing an empty array will result
+ * in Observable that completes immediately.
+ *
+ * `concat` will subscribe to first input Observable and emit all its values, without
+ * changing or affecting them in any way. When that Observable completes, it will
+ * subscribe to then next Observable passed and, again, emit its values. This will be
+ * repeated, until the operator runs out of Observables. When last input Observable completes,
+ * `concat` will complete as well. At any given moment only one Observable passed to operator
+ * emits values. If you would like to emit values from passed Observables concurrently, check out
+ * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
+ * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
+ *
+ * Note that if some input Observable never completes, `concat` will also never complete
+ * and Observables following the one that did not complete will never be subscribed. On the other
+ * hand, if some Observable simply completes immediately after it is subscribed, it will be
+ * invisible for `concat`, which will just move on to the next Observable.
+ *
+ * If any Observable in chain errors, instead of passing control to the next Observable,
+ * `concat` will error immediately as well. Observables that would be subscribed after
+ * the one that emitted error, never will.
+ *
+ * If you pass to `concat` the same Observable many times, its stream of values
+ * will be "replayed" on every subscription, which means you can repeat given Observable
+ * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
+ * you can always use {@link repeat}.
+ *
+ * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
+ * var timer = Rx.Observable.interval(1000).take(4);
+ * var sequence = Rx.Observable.range(1, 10);
+ * var result = Rx.Observable.concat(timer, sequence);
+ * result.subscribe(x => console.log(x));
+ *
+ * // results in:
+ * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
+ *
+ *
+ * @example <caption>Concatenate an array of 3 Observables</caption>
+ * var timer1 = Rx.Observable.interval(1000).take(10);
+ * var timer2 = Rx.Observable.interval(2000).take(6);
+ * var timer3 = Rx.Observable.interval(500).take(10);
+ * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed
+ * result.subscribe(x => console.log(x));
+ *
+ * // results in the following:
+ * // (Prints to console sequentially)
+ * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
+ * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
+ * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
+ *
+ *
+ * @example <caption>Concatenate the same Observable to repeat it</caption>
+ * const timer = Rx.Observable.interval(1000).take(2);
+ *
+ * Rx.Observable.concat(timer, timer) // concating the same Observable!
+ * .subscribe(
+ *   value => console.log(value),
+ *   err => {},
+ *   () => console.log('...and it is done!')
+ * );
+ *
+ * // Logs:
+ * // 0 after 1s
+ * // 1 after 2s
+ * // 0 after 3s
+ * // 1 after 4s
+ * // "...and it is done!" also after 4s
+ *
+ * @see {@link concatAll}
+ * @see {@link concatMap}
+ * @see {@link concatMapTo}
+ *
+ * @param {ObservableInput} input1 An input Observable to concatenate with others.
+ * @param {ObservableInput} input2 An input Observable to concatenate with others.
+ * More than one input Observables may be given as argument.
+ * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
+ * Observable subscription on.
+ * @return {Observable} All values of each passed Observable merged into a
+ * single Observable, in order, in serial fashion.
+ * @static true
+ * @name concat
+ * @owner Observable
+ */
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i - 0] = arguments[_i];
+    }
+    if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) {
+        return from_1.from(observables[0]);
+    }
+    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
+}
+exports.concat = concat;
+
+},{"../operators/concatAll":159,"../util/isScheduler":224,"./from":105,"./of":109}],103:[function(require,module,exports){
 "use strict";
 var DeferObservable_1 = require('./DeferObservable');
 exports.defer = DeferObservable_1.DeferObservable.create;
 
-},{"./DeferObservable":90}],101:[function(require,module,exports){
+},{"./DeferObservable":92}],104:[function(require,module,exports){
 "use strict";
 var EmptyObservable_1 = require('./EmptyObservable');
 exports.empty = EmptyObservable_1.EmptyObservable.create;
 
-},{"./EmptyObservable":91}],102:[function(require,module,exports){
+},{"./EmptyObservable":93}],105:[function(require,module,exports){
 "use strict";
 var FromObservable_1 = require('./FromObservable');
 exports.from = FromObservable_1.FromObservable.create;
 
-},{"./FromObservable":94}],103:[function(require,module,exports){
+},{"./FromObservable":96}],106:[function(require,module,exports){
 "use strict";
 var FromEventObservable_1 = require('./FromEventObservable');
 exports.fromEvent = FromEventObservable_1.FromEventObservable.create;
 
-},{"./FromEventObservable":93}],104:[function(require,module,exports){
+},{"./FromEventObservable":95}],107:[function(require,module,exports){
 "use strict";
 var PromiseObservable_1 = require('./PromiseObservable');
 exports.fromPromise = PromiseObservable_1.PromiseObservable.create;
 
-},{"./PromiseObservable":96}],105:[function(require,module,exports){
+},{"./PromiseObservable":98}],108:[function(require,module,exports){
 "use strict";
 var merge_1 = require('../operator/merge');
 exports.merge = merge_1.mergeStatic;
 
-},{"../operator/merge":127}],106:[function(require,module,exports){
+},{"../operator/merge":130}],109:[function(require,module,exports){
 "use strict";
 var ArrayObservable_1 = require('./ArrayObservable');
 exports.of = ArrayObservable_1.ArrayObservable.of;
 
-},{"./ArrayObservable":88}],107:[function(require,module,exports){
+},{"./ArrayObservable":90}],110:[function(require,module,exports){
 "use strict";
 var ErrorObservable_1 = require('./ErrorObservable');
 exports._throw = ErrorObservable_1.ErrorObservable.create;
 
-},{"./ErrorObservable":92}],108:[function(require,module,exports){
+},{"./ErrorObservable":94}],111:[function(require,module,exports){
 "use strict";
 var TimerObservable_1 = require('./TimerObservable');
 exports.timer = TimerObservable_1.TimerObservable.create;
 
-},{"./TimerObservable":98}],109:[function(require,module,exports){
+},{"./TimerObservable":100}],112:[function(require,module,exports){
 "use strict";
-var zip_1 = require('../operator/zip');
+var zip_1 = require('../operators/zip');
 exports.zip = zip_1.zipStatic;
 
-},{"../operator/zip":150}],110:[function(require,module,exports){
+},{"../operators/zip":197}],113:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
+var buffer_1 = require('../operators/buffer');
 /**
  * Buffers the source Observable values until `closingNotifier` emits.
  *
@@ -8550,49 +8796,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function buffer(closingNotifier) {
-    return this.lift(new BufferOperator(closingNotifier));
+    return buffer_1.buffer(closingNotifier)(this);
 }
 exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        _super.call(this, destination);
-        this.buffer = [];
-        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],111:[function(require,module,exports){
+},{"../operators/buffer":153}],114:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
+var bufferCount_1 = require('../operators/bufferCount');
 /**
  * Buffers the source Observable values until the size hits the maximum
  * `bufferSize` given.
@@ -8636,108 +8846,13 @@ var Subscriber_1 = require('../Subscriber');
  */
 function bufferCount(bufferSize, startBufferEvery) {
     if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return this.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+    return bufferCount_1.bufferCount(bufferSize, startBufferEvery)(this);
 }
 exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        _super.call(this, destination);
-        this.bufferSize = bufferSize;
-        this.buffer = [];
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSkipCountSubscriber = (function (_super) {
-    __extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        _super.call(this, destination);
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        this.buffers = [];
-        this.count = 0;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],112:[function(require,module,exports){
+},{"../operators/bufferCount":154}],115:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('../Subscription');
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
+var bufferWhen_1 = require('../operators/bufferWhen');
 /**
  * Buffers the source Observable values, using a factory function of closing
  * Observables to determine when to close, emit, and reset the buffer.
@@ -8772,7 +8887,1877 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function bufferWhen(closingSelector) {
-    return this.lift(new BufferWhenOperator(closingSelector));
+    return bufferWhen_1.bufferWhen(closingSelector)(this);
+}
+exports.bufferWhen = bufferWhen;
+
+},{"../operators/bufferWhen":155}],116:[function(require,module,exports){
+"use strict";
+var catchError_1 = require('../operators/catchError');
+/**
+ * Catches errors on the observable to be handled by returning a new observable or throwing an error.
+ *
+ * <img src="./img/catch.png" width="100%">
+ *
+ * @example <caption>Continues with a different Observable when there's an error</caption>
+ *
+ * Observable.of(1, 2, 3, 4, 5)
+ *   .map(n => {
+ *        if (n == 4) {
+ *          throw 'four!';
+ *     }
+ *        return n;
+ *   })
+ *   .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))
+ *   .subscribe(x => console.log(x));
+ *   // 1, 2, 3, I, II, III, IV, V
+ *
+ * @example <caption>Retries the caught source Observable again in case of error, similar to retry() operator</caption>
+ *
+ * Observable.of(1, 2, 3, 4, 5)
+ *   .map(n => {
+ *        if (n === 4) {
+ *          throw 'four!';
+ *     }
+ *        return n;
+ *   })
+ *   .catch((err, caught) => caught)
+ *   .take(30)
+ *   .subscribe(x => console.log(x));
+ *   // 1, 2, 3, 1, 2, 3, ...
+ *
+ * @example <caption>Throws a new error when the source Observable throws an error</caption>
+ *
+ * Observable.of(1, 2, 3, 4, 5)
+ *   .map(n => {
+ *     if (n == 4) {
+ *       throw 'four!';
+ *     }
+ *     return n;
+ *   })
+ *   .catch(err => {
+ *     throw 'error in source. Details: ' + err;
+ *   })
+ *   .subscribe(
+ *     x => console.log(x),
+ *     err => console.log(err)
+ *   );
+ *   // 1, 2, 3, error in source. Details: four!
+ *
+ * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
+ *  is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
+ *  is returned by the `selector` will be used to continue the observable chain.
+ * @return {Observable} An observable that originates from either the source or the observable returned by the
+ *  catch `selector` function.
+ * @method catch
+ * @name catch
+ * @owner Observable
+ */
+function _catch(selector) {
+    return catchError_1.catchError(selector)(this);
+}
+exports._catch = _catch;
+
+},{"../operators/catchError":156}],117:[function(require,module,exports){
+"use strict";
+var combineLatest_1 = require('../operators/combineLatest');
+/* tslint:enable:max-line-length */
+/**
+ * Combines multiple Observables to create an Observable whose values are
+ * calculated from the latest values of each of its input Observables.
+ *
+ * <span class="informal">Whenever any input Observable emits a value, it
+ * computes a formula using the latest values from all the inputs, then emits
+ * the output of that formula.</span>
+ *
+ * <img src="./img/combineLatest.png" width="100%">
+ *
+ * `combineLatest` combines the values from this Observable with values from
+ * Observables passed as arguments. This is done by subscribing to each
+ * Observable, in order, and collecting an array of each of the most recent
+ * values any time any of the input Observables emits, then either taking that
+ * array and passing it as arguments to an optional `project` function and
+ * emitting the return value of that, or just emitting the array of recent
+ * values directly if there is no `project` function.
+ *
+ * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
+ * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
+ * var height = Rx.Observable.of(1.76, 1.77, 1.78);
+ * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));
+ * bmi.subscribe(x => console.log('BMI is ' + x));
+ *
+ * // With output to console:
+ * // BMI is 24.212293388429753
+ * // BMI is 23.93948099205209
+ * // BMI is 23.671253629592222
+ *
+ * @see {@link combineAll}
+ * @see {@link merge}
+ * @see {@link withLatestFrom}
+ *
+ * @param {ObservableInput} other An input Observable to combine with the source
+ * Observable. More than one input Observables may be given as argument.
+ * @param {function} [project] An optional function to project the values from
+ * the combined latest values into a new value on the output Observable.
+ * @return {Observable} An Observable of projected values from the most recent
+ * values from each input Observable, or an array of the most recent values from
+ * each input Observable.
+ * @method combineLatest
+ * @owner Observable
+ */
+function combineLatest() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i - 0] = arguments[_i];
+    }
+    return combineLatest_1.combineLatest.apply(void 0, observables)(this);
+}
+exports.combineLatest = combineLatest;
+
+},{"../operators/combineLatest":157}],118:[function(require,module,exports){
+"use strict";
+var concat_1 = require('../operators/concat');
+/* tslint:enable:max-line-length */
+/**
+ * Creates an output Observable which sequentially emits all values from every
+ * given input Observable after the current Observable.
+ *
+ * <span class="informal">Concatenates multiple Observables together by
+ * sequentially emitting their values, one Observable after the other.</span>
+ *
+ * <img src="./img/concat.png" width="100%">
+ *
+ * Joins this Observable with multiple other Observables by subscribing to them
+ * one at a time, starting with the source, and merging their results into the
+ * output Observable. Will wait for each Observable to complete before moving
+ * on to the next.
+ *
+ * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
+ * var timer = Rx.Observable.interval(1000).take(4);
+ * var sequence = Rx.Observable.range(1, 10);
+ * var result = timer.concat(sequence);
+ * result.subscribe(x => console.log(x));
+ *
+ * // results in:
+ * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
+ *
+ * @example <caption>Concatenate 3 Observables</caption>
+ * var timer1 = Rx.Observable.interval(1000).take(10);
+ * var timer2 = Rx.Observable.interval(2000).take(6);
+ * var timer3 = Rx.Observable.interval(500).take(10);
+ * var result = timer1.concat(timer2, timer3);
+ * result.subscribe(x => console.log(x));
+ *
+ * // results in the following:
+ * // (Prints to console sequentially)
+ * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
+ * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
+ * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
+ *
+ * @see {@link concatAll}
+ * @see {@link concatMap}
+ * @see {@link concatMapTo}
+ *
+ * @param {ObservableInput} other An input Observable to concatenate after the source
+ * Observable. More than one input Observables may be given as argument.
+ * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
+ * Observable subscription on.
+ * @return {Observable} All values of each passed Observable merged into a
+ * single Observable, in order, in serial fashion.
+ * @method concat
+ * @owner Observable
+ */
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i - 0] = arguments[_i];
+    }
+    return concat_1.concat.apply(void 0, observables)(this);
+}
+exports.concat = concat;
+
+},{"../operators/concat":158}],119:[function(require,module,exports){
+"use strict";
+var async_1 = require('../scheduler/async');
+var debounceTime_1 = require('../operators/debounceTime');
+/**
+ * Emits a value from the source Observable only after a particular time span
+ * has passed without another source emission.
+ *
+ * <span class="informal">It's like {@link delay}, but passes only the most
+ * recent value from each burst of emissions.</span>
+ *
+ * <img src="./img/debounceTime.png" width="100%">
+ *
+ * `debounceTime` delays values emitted by the source Observable, but drops
+ * previous pending delayed emissions if a new value arrives on the source
+ * Observable. This operator keeps track of the most recent value from the
+ * source Observable, and emits that only when `dueTime` enough time has passed
+ * without any other value appearing on the source Observable. If a new value
+ * appears before `dueTime` silence occurs, the previous value will be dropped
+ * and will not be emitted on the output Observable.
+ *
+ * This is a rate-limiting operator, because it is impossible for more than one
+ * value to be emitted in any time window of duration `dueTime`, but it is also
+ * a delay-like operator since output emissions do not occur at the same time as
+ * they did on the source Observable. Optionally takes a {@link IScheduler} for
+ * managing timers.
+ *
+ * @example <caption>Emit the most recent click after a burst of clicks</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.debounceTime(1000);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link auditTime}
+ * @see {@link debounce}
+ * @see {@link delay}
+ * @see {@link sampleTime}
+ * @see {@link throttleTime}
+ *
+ * @param {number} dueTime The timeout duration in milliseconds (or the time
+ * unit determined internally by the optional `scheduler`) for the window of
+ * time required to wait for emission silence before emitting the most recent
+ * source value.
+ * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
+ * managing the timers that handle the timeout for each value.
+ * @return {Observable} An Observable that delays the emissions of the source
+ * Observable by the specified `dueTime`, and may drop some values if they occur
+ * too frequently.
+ * @method debounceTime
+ * @owner Observable
+ */
+function debounceTime(dueTime, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return debounceTime_1.debounceTime(dueTime, scheduler)(this);
+}
+exports.debounceTime = debounceTime;
+
+},{"../operators/debounceTime":160,"../scheduler/async":203}],120:[function(require,module,exports){
+"use strict";
+var async_1 = require('../scheduler/async');
+var delay_1 = require('../operators/delay');
+/**
+ * Delays the emission of items from the source Observable by a given timeout or
+ * until a given Date.
+ *
+ * <span class="informal">Time shifts each item by some specified amount of
+ * milliseconds.</span>
+ *
+ * <img src="./img/delay.png" width="100%">
+ *
+ * If the delay argument is a Number, this operator time shifts the source
+ * Observable by that amount of time expressed in milliseconds. The relative
+ * time intervals between the values are preserved.
+ *
+ * If the delay argument is a Date, this operator time shifts the start of the
+ * Observable execution until the given date occurs.
+ *
+ * @example <caption>Delay each click by one second</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second
+ * delayedClicks.subscribe(x => console.log(x));
+ *
+ * @example <caption>Delay all clicks until a future date happens</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var date = new Date('March 15, 2050 12:00:00'); // in the future
+ * var delayedClicks = clicks.delay(date); // click emitted only after that date
+ * delayedClicks.subscribe(x => console.log(x));
+ *
+ * @see {@link debounceTime}
+ * @see {@link delayWhen}
+ *
+ * @param {number|Date} delay The delay duration in milliseconds (a `number`) or
+ * a `Date` until which the emission of the source items is delayed.
+ * @param {Scheduler} [scheduler=async] The IScheduler to use for
+ * managing the timers that handle the time-shift for each item.
+ * @return {Observable} An Observable that delays the emissions of the source
+ * Observable by the specified timeout or Date.
+ * @method delay
+ * @owner Observable
+ */
+function delay(delay, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return delay_1.delay(delay, scheduler)(this);
+}
+exports.delay = delay;
+
+},{"../operators/delay":161,"../scheduler/async":203}],121:[function(require,module,exports){
+"use strict";
+var distinct_1 = require('../operators/distinct');
+/**
+ * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
+ *
+ * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will
+ * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the
+ * source observable directly with an equality check against previous values.
+ *
+ * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
+ *
+ * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
+ * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
+ * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
+ * that the internal `Set` can be "flushed", basically clearing it of values.
+ *
+ * @example <caption>A simple example with numbers</caption>
+ * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)
+ *   .distinct()
+ *   .subscribe(x => console.log(x)); // 1, 2, 3, 4
+ *
+ * @example <caption>An example using a keySelector function</caption>
+ * interface Person {
+ *    age: number,
+ *    name: string
+ * }
+ *
+ * Observable.of<Person>(
+ *     { age: 4, name: 'Foo'},
+ *     { age: 7, name: 'Bar'},
+ *     { age: 5, name: 'Foo'})
+ *     .distinct((p: Person) => p.name)
+ *     .subscribe(x => console.log(x));
+ *
+ * // displays:
+ * // { age: 4, name: 'Foo' }
+ * // { age: 7, name: 'Bar' }
+ *
+ * @see {@link distinctUntilChanged}
+ * @see {@link distinctUntilKeyChanged}
+ *
+ * @param {function} [keySelector] Optional function to select which value you want to check as distinct.
+ * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.
+ * @return {Observable} An Observable that emits items from the source Observable with distinct values.
+ * @method distinct
+ * @owner Observable
+ */
+function distinct(keySelector, flushes) {
+    return distinct_1.distinct(keySelector, flushes)(this);
+}
+exports.distinct = distinct;
+
+},{"../operators/distinct":162}],122:[function(require,module,exports){
+"use strict";
+var distinctUntilChanged_1 = require('../operators/distinctUntilChanged');
+/* tslint:enable:max-line-length */
+/**
+ * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.
+ *
+ * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
+ *
+ * If a comparator function is not provided, an equality check is used by default.
+ *
+ * @example <caption>A simple example with numbers</caption>
+ * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)
+ *   .distinctUntilChanged()
+ *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4
+ *
+ * @example <caption>An example using a compare function</caption>
+ * interface Person {
+ *    age: number,
+ *    name: string
+ * }
+ *
+ * Observable.of<Person>(
+ *     { age: 4, name: 'Foo'},
+ *     { age: 7, name: 'Bar'},
+ *     { age: 5, name: 'Foo'})
+ *     { age: 6, name: 'Foo'})
+ *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)
+ *     .subscribe(x => console.log(x));
+ *
+ * // displays:
+ * // { age: 4, name: 'Foo' }
+ * // { age: 7, name: 'Bar' }
+ * // { age: 5, name: 'Foo' }
+ *
+ * @see {@link distinct}
+ * @see {@link distinctUntilKeyChanged}
+ *
+ * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.
+ * @return {Observable} An Observable that emits items from the source Observable with distinct values.
+ * @method distinctUntilChanged
+ * @owner Observable
+ */
+function distinctUntilChanged(compare, keySelector) {
+    return distinctUntilChanged_1.distinctUntilChanged(compare, keySelector)(this);
+}
+exports.distinctUntilChanged = distinctUntilChanged;
+
+},{"../operators/distinctUntilChanged":163}],123:[function(require,module,exports){
+"use strict";
+var tap_1 = require('../operators/tap');
+/* tslint:enable:max-line-length */
+/**
+ * Perform a side effect for every emission on the source Observable, but return
+ * an Observable that is identical to the source.
+ *
+ * <span class="informal">Intercepts each emission on the source and runs a
+ * function, but returns an output which is identical to the source as long as errors don't occur.</span>
+ *
+ * <img src="./img/do.png" width="100%">
+ *
+ * Returns a mirrored Observable of the source Observable, but modified so that
+ * the provided Observer is called to perform a side effect for every value,
+ * error, and completion emitted by the source. Any errors that are thrown in
+ * the aforementioned Observer or handlers are safely sent down the error path
+ * of the output Observable.
+ *
+ * This operator is useful for debugging your Observables for the correct values
+ * or performing other side effects.
+ *
+ * Note: this is different to a `subscribe` on the Observable. If the Observable
+ * returned by `do` is not subscribed, the side effects specified by the
+ * Observer will never happen. `do` therefore simply spies on existing
+ * execution, it does not trigger an execution to happen like `subscribe` does.
+ *
+ * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var positions = clicks
+ *   .do(ev => console.log(ev))
+ *   .map(ev => ev.clientX);
+ * positions.subscribe(x => console.log(x));
+ *
+ * @see {@link map}
+ * @see {@link subscribe}
+ *
+ * @param {Observer|function} [nextOrObserver] A normal Observer object or a
+ * callback for `next`.
+ * @param {function} [error] Callback for errors in the source.
+ * @param {function} [complete] Callback for the completion of the source.
+ * @return {Observable} An Observable identical to the source, but runs the
+ * specified Observer or callback(s) for each item.
+ * @method do
+ * @name do
+ * @owner Observable
+ */
+function _do(nextOrObserver, error, complete) {
+    return tap_1.tap(nextOrObserver, error, complete)(this);
+}
+exports._do = _do;
+
+},{"../operators/tap":192}],124:[function(require,module,exports){
+"use strict";
+var expand_1 = require('../operators/expand');
+/* tslint:enable:max-line-length */
+/**
+ * Recursively projects each source value to an Observable which is merged in
+ * the output Observable.
+ *
+ * <span class="informal">It's similar to {@link mergeMap}, but applies the
+ * projection function to every source value as well as every output value.
+ * It's recursive.</span>
+ *
+ * <img src="./img/expand.png" width="100%">
+ *
+ * Returns an Observable that emits items based on applying a function that you
+ * supply to each item emitted by the source Observable, where that function
+ * returns an Observable, and then merging those resulting Observables and
+ * emitting the results of this merger. *Expand* will re-emit on the output
+ * Observable every source value. Then, each output value is given to the
+ * `project` function which returns an inner Observable to be merged on the
+ * output Observable. Those output values resulting from the projection are also
+ * given to the `project` function to produce new output values. This is how
+ * *expand* behaves recursively.
+ *
+ * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var powersOfTwo = clicks
+ *   .mapTo(1)
+ *   .expand(x => Rx.Observable.of(2 * x).delay(1000))
+ *   .take(10);
+ * powersOfTwo.subscribe(x => console.log(x));
+ *
+ * @see {@link mergeMap}
+ * @see {@link mergeScan}
+ *
+ * @param {function(value: T, index: number) => Observable} project A function
+ * that, when applied to an item emitted by the source or the output Observable,
+ * returns an Observable.
+ * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
+ * Observables being subscribed to concurrently.
+ * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to
+ * each projected inner Observable.
+ * @return {Observable} An Observable that emits the source values and also
+ * result of applying the projection function to each value emitted on the
+ * output Observable and and merging the results of the Observables obtained
+ * from this transformation.
+ * @method expand
+ * @owner Observable
+ */
+function expand(project, concurrent, scheduler) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (scheduler === void 0) { scheduler = undefined; }
+    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
+    return expand_1.expand(project, concurrent, scheduler)(this);
+}
+exports.expand = expand;
+
+},{"../operators/expand":164}],125:[function(require,module,exports){
+"use strict";
+var filter_1 = require('../operators/filter');
+/* tslint:enable:max-line-length */
+/**
+ * Filter items emitted by the source Observable by only emitting those that
+ * satisfy a specified predicate.
+ *
+ * <span class="informal">Like
+ * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
+ * it only emits a value from the source if it passes a criterion function.</span>
+ *
+ * <img src="./img/filter.png" width="100%">
+ *
+ * Similar to the well-known `Array.prototype.filter` method, this operator
+ * takes values from the source Observable, passes them through a `predicate`
+ * function and only emits those values that yielded `true`.
+ *
+ * @example <caption>Emit only click events whose target was a DIV element</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');
+ * clicksOnDivs.subscribe(x => console.log(x));
+ *
+ * @see {@link distinct}
+ * @see {@link distinctUntilChanged}
+ * @see {@link distinctUntilKeyChanged}
+ * @see {@link ignoreElements}
+ * @see {@link partition}
+ * @see {@link skip}
+ *
+ * @param {function(value: T, index: number): boolean} predicate A function that
+ * evaluates each value emitted by the source Observable. If it returns `true`,
+ * the value is emitted, if `false` the value is not passed to the output
+ * Observable. The `index` parameter is the number `i` for the i-th source
+ * emission that has happened since the subscription, starting from the number
+ * `0`.
+ * @param {any} [thisArg] An optional argument to determine the value of `this`
+ * in the `predicate` function.
+ * @return {Observable} An Observable of values from the source that were
+ * allowed by the `predicate` function.
+ * @method filter
+ * @owner Observable
+ */
+function filter(predicate, thisArg) {
+    return filter_1.filter(predicate, thisArg)(this);
+}
+exports.filter = filter;
+
+},{"../operators/filter":165}],126:[function(require,module,exports){
+"use strict";
+var finalize_1 = require('../operators/finalize');
+/**
+ * Returns an Observable that mirrors the source Observable, but will call a specified function when
+ * the source terminates on complete or error.
+ * @param {function} callback Function to be called when source terminates.
+ * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.
+ * @method finally
+ * @owner Observable
+ */
+function _finally(callback) {
+    return finalize_1.finalize(callback)(this);
+}
+exports._finally = _finally;
+
+},{"../operators/finalize":166}],127:[function(require,module,exports){
+"use strict";
+var first_1 = require('../operators/first');
+/**
+ * Emits only the first value (or the first value that meets some condition)
+ * emitted by the source Observable.
+ *
+ * <span class="informal">Emits only the first value. Or emits only the first
+ * value that passes some test.</span>
+ *
+ * <img src="./img/first.png" width="100%">
+ *
+ * If called with no arguments, `first` emits the first value of the source
+ * Observable, then completes. If called with a `predicate` function, `first`
+ * emits the first value of the source that matches the specified condition. It
+ * may also take a `resultSelector` function to produce the output value from
+ * the input value, and a `defaultValue` to emit in case the source completes
+ * before it is able to emit a valid value. Throws an error if `defaultValue`
+ * was not provided and a matching element is not found.
+ *
+ * @example <caption>Emit only the first click that happens on the DOM</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.first();
+ * result.subscribe(x => console.log(x));
+ *
+ * @example <caption>Emits the first click that happens on a DIV</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.first(ev => ev.target.tagName === 'DIV');
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link filter}
+ * @see {@link find}
+ * @see {@link take}
+ *
+ * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
+ * callback if the Observable completes before any `next` notification was sent.
+ *
+ * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
+ * An optional function called with each item to test for condition matching.
+ * @param {function(value: T, index: number): R} [resultSelector] A function to
+ * produce the value on the output Observable based on the values
+ * and the indices of the source Observable. The arguments passed to this
+ * function are:
+ * - `value`: the value that was emitted on the source.
+ * - `index`: the "index" of the value from the source.
+ * @param {R} [defaultValue] The default value emitted in case no valid value
+ * was found on the source.
+ * @return {Observable<T|R>} An Observable of the first item that matches the
+ * condition.
+ * @method first
+ * @owner Observable
+ */
+function first(predicate, resultSelector, defaultValue) {
+    return first_1.first(predicate, resultSelector, defaultValue)(this);
+}
+exports.first = first;
+
+},{"../operators/first":167}],128:[function(require,module,exports){
+"use strict";
+var last_1 = require('../operators/last');
+/* tslint:enable:max-line-length */
+/**
+ * Returns an Observable that emits only the last item emitted by the source Observable.
+ * It optionally takes a predicate function as a parameter, in which case, rather than emitting
+ * the last item from the source Observable, the resulting Observable will emit the last item
+ * from the source Observable that satisfies the predicate.
+ *
+ * <img src="./img/last.png" width="100%">
+ *
+ * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
+ * callback if the Observable completes before any `next` notification was sent.
+ * @param {function} predicate - The condition any source emitted item has to satisfy.
+ * @return {Observable} An Observable that emits only the last item satisfying the given condition
+ * from the source, or an NoSuchElementException if no such items are emitted.
+ * @throws - Throws if no items that match the predicate are emitted by the source Observable.
+ * @method last
+ * @owner Observable
+ */
+function last(predicate, resultSelector, defaultValue) {
+    return last_1.last(predicate, resultSelector, defaultValue)(this);
+}
+exports.last = last;
+
+},{"../operators/last":168}],129:[function(require,module,exports){
+"use strict";
+var map_1 = require('../operators/map');
+/**
+ * Applies a given `project` function to each value emitted by the source
+ * Observable, and emits the resulting values as an Observable.
+ *
+ * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
+ * it passes each source value through a transformation function to get
+ * corresponding output values.</span>
+ *
+ * <img src="./img/map.png" width="100%">
+ *
+ * Similar to the well known `Array.prototype.map` function, this operator
+ * applies a projection to each value and emits that projection in the output
+ * Observable.
+ *
+ * @example <caption>Map every click to the clientX position of that click</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var positions = clicks.map(ev => ev.clientX);
+ * positions.subscribe(x => console.log(x));
+ *
+ * @see {@link mapTo}
+ * @see {@link pluck}
+ *
+ * @param {function(value: T, index: number): R} project The function to apply
+ * to each `value` emitted by the source Observable. The `index` parameter is
+ * the number `i` for the i-th emission that has happened since the
+ * subscription, starting from the number `0`.
+ * @param {any} [thisArg] An optional argument to define what `this` is in the
+ * `project` function.
+ * @return {Observable<R>} An Observable that emits the values from the source
+ * Observable transformed by the given `project` function.
+ * @method map
+ * @owner Observable
+ */
+function map(project, thisArg) {
+    return map_1.map(project, thisArg)(this);
+}
+exports.map = map;
+
+},{"../operators/map":169}],130:[function(require,module,exports){
+"use strict";
+var merge_1 = require('../operators/merge');
+var merge_2 = require('../operators/merge');
+exports.mergeStatic = merge_2.mergeStatic;
+/* tslint:enable:max-line-length */
+/**
+ * Creates an output Observable which concurrently emits all values from every
+ * given input Observable.
+ *
+ * <span class="informal">Flattens multiple Observables together by blending
+ * their values into one Observable.</span>
+ *
+ * <img src="./img/merge.png" width="100%">
+ *
+ * `merge` subscribes to each given input Observable (either the source or an
+ * Observable given as argument), and simply forwards (without doing any
+ * transformation) all the values from all the input Observables to the output
+ * Observable. The output Observable only completes once all input Observables
+ * have completed. Any error delivered by an input Observable will be immediately
+ * emitted on the output Observable.
+ *
+ * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var timer = Rx.Observable.interval(1000);
+ * var clicksOrTimer = clicks.merge(timer);
+ * clicksOrTimer.subscribe(x => console.log(x));
+ *
+ * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
+ * var timer1 = Rx.Observable.interval(1000).take(10);
+ * var timer2 = Rx.Observable.interval(2000).take(6);
+ * var timer3 = Rx.Observable.interval(500).take(10);
+ * var concurrent = 2; // the argument
+ * var merged = timer1.merge(timer2, timer3, concurrent);
+ * merged.subscribe(x => console.log(x));
+ *
+ * @see {@link mergeAll}
+ * @see {@link mergeMap}
+ * @see {@link mergeMapTo}
+ * @see {@link mergeScan}
+ *
+ * @param {ObservableInput} other An input Observable to merge with the source
+ * Observable. More than one input Observables may be given as argument.
+ * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
+ * Observables being subscribed to concurrently.
+ * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
+ * concurrency of input Observables.
+ * @return {Observable} An Observable that emits items that are the result of
+ * every input Observable.
+ * @method merge
+ * @owner Observable
+ */
+function merge() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i - 0] = arguments[_i];
+    }
+    return merge_1.merge.apply(void 0, observables)(this);
+}
+exports.merge = merge;
+
+},{"../operators/merge":170}],131:[function(require,module,exports){
+"use strict";
+var mergeAll_1 = require('../operators/mergeAll');
+/**
+ * Converts a higher-order Observable into a first-order Observable which
+ * concurrently delivers all values that are emitted on the inner Observables.
+ *
+ * <span class="informal">Flattens an Observable-of-Observables.</span>
+ *
+ * <img src="./img/mergeAll.png" width="100%">
+ *
+ * `mergeAll` subscribes to an Observable that emits Observables, also known as
+ * a higher-order Observable. Each time it observes one of these emitted inner
+ * Observables, it subscribes to that and delivers all the values from the
+ * inner Observable on the output Observable. The output Observable only
+ * completes once all inner Observables have completed. Any error delivered by
+ * a inner Observable will be immediately emitted on the output Observable.
+ *
+ * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));
+ * var firstOrder = higherOrder.mergeAll();
+ * firstOrder.subscribe(x => console.log(x));
+ *
+ * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));
+ * var firstOrder = higherOrder.mergeAll(2);
+ * firstOrder.subscribe(x => console.log(x));
+ *
+ * @see {@link combineAll}
+ * @see {@link concatAll}
+ * @see {@link exhaust}
+ * @see {@link merge}
+ * @see {@link mergeMap}
+ * @see {@link mergeMapTo}
+ * @see {@link mergeScan}
+ * @see {@link switch}
+ * @see {@link zipAll}
+ *
+ * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
+ * Observables being subscribed to concurrently.
+ * @return {Observable} An Observable that emits values coming from all the
+ * inner Observables emitted by the source Observable.
+ * @method mergeAll
+ * @owner Observable
+ */
+function mergeAll(concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return mergeAll_1.mergeAll(concurrent)(this);
+}
+exports.mergeAll = mergeAll;
+
+},{"../operators/mergeAll":171}],132:[function(require,module,exports){
+"use strict";
+var mergeMap_1 = require('../operators/mergeMap');
+/* tslint:enable:max-line-length */
+/**
+ * Projects each source value to an Observable which is merged in the output
+ * Observable.
+ *
+ * <span class="informal">Maps each value to an Observable, then flattens all of
+ * these inner Observables using {@link mergeAll}.</span>
+ *
+ * <img src="./img/mergeMap.png" width="100%">
+ *
+ * Returns an Observable that emits items based on applying a function that you
+ * supply to each item emitted by the source Observable, where that function
+ * returns an Observable, and then merging those resulting Observables and
+ * emitting the results of this merger.
+ *
+ * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>
+ * var letters = Rx.Observable.of('a', 'b', 'c');
+ * var result = letters.mergeMap(x =>
+ *   Rx.Observable.interval(1000).map(i => x+i)
+ * );
+ * result.subscribe(x => console.log(x));
+ *
+ * // Results in the following:
+ * // a0
+ * // b0
+ * // c0
+ * // a1
+ * // b1
+ * // c1
+ * // continues to list a,b,c with respective ascending integers
+ *
+ * @see {@link concatMap}
+ * @see {@link exhaustMap}
+ * @see {@link merge}
+ * @see {@link mergeAll}
+ * @see {@link mergeMapTo}
+ * @see {@link mergeScan}
+ * @see {@link switchMap}
+ *
+ * @param {function(value: T, ?index: number): ObservableInput} project A function
+ * that, when applied to an item emitted by the source Observable, returns an
+ * Observable.
+ * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
+ * A function to produce the value on the output Observable based on the values
+ * and the indices of the source (outer) emission and the inner Observable
+ * emission. The arguments passed to this function are:
+ * - `outerValue`: the value that came from the source
+ * - `innerValue`: the value that came from the projected Observable
+ * - `outerIndex`: the "index" of the value that came from the source
+ * - `innerIndex`: the "index" of the value from the projected Observable
+ * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
+ * Observables being subscribed to concurrently.
+ * @return {Observable} An Observable that emits the result of applying the
+ * projection function (and the optional `resultSelector`) to each item emitted
+ * by the source Observable and merging the results of the Observables obtained
+ * from this transformation.
+ * @method mergeMap
+ * @owner Observable
+ */
+function mergeMap(project, resultSelector, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return mergeMap_1.mergeMap(project, resultSelector, concurrent)(this);
+}
+exports.mergeMap = mergeMap;
+
+},{"../operators/mergeMap":172}],133:[function(require,module,exports){
+"use strict";
+var pairwise_1 = require('../operators/pairwise');
+/**
+ * Groups pairs of consecutive emissions together and emits them as an array of
+ * two values.
+ *
+ * <span class="informal">Puts the current value and previous value together as
+ * an array, and emits that.</span>
+ *
+ * <img src="./img/pairwise.png" width="100%">
+ *
+ * The Nth emission from the source Observable will cause the output Observable
+ * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
+ * pair. For this reason, `pairwise` emits on the second and subsequent
+ * emissions from the source Observable, but not on the first emission, because
+ * there is no previous value in that case.
+ *
+ * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var pairs = clicks.pairwise();
+ * var distance = pairs.map(pair => {
+ *   var x0 = pair[0].clientX;
+ *   var y0 = pair[0].clientY;
+ *   var x1 = pair[1].clientX;
+ *   var y1 = pair[1].clientY;
+ *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
+ * });
+ * distance.subscribe(x => console.log(x));
+ *
+ * @see {@link buffer}
+ * @see {@link bufferCount}
+ *
+ * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
+ * consecutive values from the source Observable.
+ * @method pairwise
+ * @owner Observable
+ */
+function pairwise() {
+    return pairwise_1.pairwise()(this);
+}
+exports.pairwise = pairwise;
+
+},{"../operators/pairwise":175}],134:[function(require,module,exports){
+"use strict";
+var pluck_1 = require('../operators/pluck');
+/**
+ * Maps each source value (an object) to its specified nested property.
+ *
+ * <span class="informal">Like {@link map}, but meant only for picking one of
+ * the nested properties of every emitted object.</span>
+ *
+ * <img src="./img/pluck.png" width="100%">
+ *
+ * Given a list of strings describing a path to an object property, retrieves
+ * the value of a specified nested property from all values in the source
+ * Observable. If a property can't be resolved, it will return `undefined` for
+ * that value.
+ *
+ * @example <caption>Map every click to the tagName of the clicked target element</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var tagNames = clicks.pluck('target', 'tagName');
+ * tagNames.subscribe(x => console.log(x));
+ *
+ * @see {@link map}
+ *
+ * @param {...string} properties The nested properties to pluck from each source
+ * value (an object).
+ * @return {Observable} A new Observable of property values from the source values.
+ * @method pluck
+ * @owner Observable
+ */
+function pluck() {
+    var properties = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        properties[_i - 0] = arguments[_i];
+    }
+    return pluck_1.pluck.apply(void 0, properties)(this);
+}
+exports.pluck = pluck;
+
+},{"../operators/pluck":176}],135:[function(require,module,exports){
+"use strict";
+var publish_1 = require('../operators/publish');
+/* tslint:enable:max-line-length */
+/**
+ * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
+ * before it begins emitting items to those Observers that have subscribed to it.
+ *
+ * <img src="./img/publish.png" width="100%">
+ *
+ * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times
+ * as needed, without causing multiple subscriptions to the source sequence.
+ * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
+ * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.
+ * @method publish
+ * @owner Observable
+ */
+function publish(selector) {
+    return publish_1.publish(selector)(this);
+}
+exports.publish = publish;
+
+},{"../operators/publish":177}],136:[function(require,module,exports){
+"use strict";
+var publishReplay_1 = require('../operators/publishReplay');
+/* tslint:enable:max-line-length */
+/**
+ * @param bufferSize
+ * @param windowTime
+ * @param selectorOrScheduler
+ * @param scheduler
+ * @return {Observable<T> | ConnectableObservable<T>}
+ * @method publishReplay
+ * @owner Observable
+ */
+function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
+    return publishReplay_1.publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler)(this);
+}
+exports.publishReplay = publishReplay;
+
+},{"../operators/publishReplay":178}],137:[function(require,module,exports){
+"use strict";
+var retry_1 = require('../operators/retry');
+/**
+ * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
+ * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given
+ * as a number parameter) rather than propagating the `error` call.
+ *
+ * <img src="./img/retry.png" width="100%">
+ *
+ * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted
+ * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second
+ * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications
+ * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].
+ * @param {number} count - Number of retry attempts before failing.
+ * @return {Observable} The source Observable modified with the retry logic.
+ * @method retry
+ * @owner Observable
+ */
+function retry(count) {
+    if (count === void 0) { count = -1; }
+    return retry_1.retry(count)(this);
+}
+exports.retry = retry;
+
+},{"../operators/retry":180}],138:[function(require,module,exports){
+"use strict";
+var sample_1 = require('../operators/sample');
+/**
+ * Emits the most recently emitted value from the source Observable whenever
+ * another Observable, the `notifier`, emits.
+ *
+ * <span class="informal">It's like {@link sampleTime}, but samples whenever
+ * the `notifier` Observable emits something.</span>
+ *
+ * <img src="./img/sample.png" width="100%">
+ *
+ * Whenever the `notifier` Observable emits a value or completes, `sample`
+ * looks at the source Observable and emits whichever value it has most recently
+ * emitted since the previous sampling, unless the source has not emitted
+ * anything since the previous sampling. The `notifier` is subscribed to as soon
+ * as the output Observable is subscribed.
+ *
+ * @example <caption>On every click, sample the most recent "seconds" timer</caption>
+ * var seconds = Rx.Observable.interval(1000);
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = seconds.sample(clicks);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link audit}
+ * @see {@link debounce}
+ * @see {@link sampleTime}
+ * @see {@link throttle}
+ *
+ * @param {Observable<any>} notifier The Observable to use for sampling the
+ * source Observable.
+ * @return {Observable<T>} An Observable that emits the results of sampling the
+ * values emitted by the source Observable whenever the notifier Observable
+ * emits value or completes.
+ * @method sample
+ * @owner Observable
+ */
+function sample(notifier) {
+    return sample_1.sample(notifier)(this);
+}
+exports.sample = sample;
+
+},{"../operators/sample":181}],139:[function(require,module,exports){
+"use strict";
+var scan_1 = require('../operators/scan');
+/* tslint:enable:max-line-length */
+/**
+ * Applies an accumulator function over the source Observable, and returns each
+ * intermediate result, with an optional seed value.
+ *
+ * <span class="informal">It's like {@link reduce}, but emits the current
+ * accumulation whenever the source emits a value.</span>
+ *
+ * <img src="./img/scan.png" width="100%">
+ *
+ * Combines together all values emitted on the source, using an accumulator
+ * function that knows how to join a new source value into the accumulation from
+ * the past. Is similar to {@link reduce}, but emits the intermediate
+ * accumulations.
+ *
+ * Returns an Observable that applies a specified `accumulator` function to each
+ * item emitted by the source Observable. If a `seed` value is specified, then
+ * that value will be used as the initial value for the accumulator. If no seed
+ * value is specified, the first item of the source is used as the seed.
+ *
+ * @example <caption>Count the number of click events</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var ones = clicks.mapTo(1);
+ * var seed = 0;
+ * var count = ones.scan((acc, one) => acc + one, seed);
+ * count.subscribe(x => console.log(x));
+ *
+ * @see {@link expand}
+ * @see {@link mergeScan}
+ * @see {@link reduce}
+ *
+ * @param {function(acc: R, value: T, index: number): R} accumulator
+ * The accumulator function called on each source value.
+ * @param {T|R} [seed] The initial accumulation value.
+ * @return {Observable<R>} An observable of the accumulated values.
+ * @method scan
+ * @owner Observable
+ */
+function scan(accumulator, seed) {
+    if (arguments.length >= 2) {
+        return scan_1.scan(accumulator, seed)(this);
+    }
+    return scan_1.scan(accumulator)(this);
+}
+exports.scan = scan;
+
+},{"../operators/scan":182}],140:[function(require,module,exports){
+"use strict";
+var share_1 = require('../operators/share');
+/**
+ * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
+ * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
+ * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
+ *
+ * This behaves similarly to .publish().refCount(), with a behavior difference when the source observable emits complete.
+ * .publish().refCount() will not resubscribe to the original source, however .share() will resubscribe to the original source.
+ * Observable.of("test").publish().refCount() will not re-emit "test" on new subscriptions, Observable.of("test").share() will
+ * re-emit "test" to new subscriptions.
+ *
+ * <img src="./img/share.png" width="100%">
+ *
+ * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.
+ * @method share
+ * @owner Observable
+ */
+function share() {
+    return share_1.share()(this);
+}
+exports.share = share;
+;
+
+},{"../operators/share":183}],141:[function(require,module,exports){
+"use strict";
+var skip_1 = require('../operators/skip');
+/**
+ * Returns an Observable that skips the first `count` items emitted by the source Observable.
+ *
+ * <img src="./img/skip.png" width="100%">
+ *
+ * @param {Number} count - The number of times, items emitted by source Observable should be skipped.
+ * @return {Observable} An Observable that skips values emitted by the source Observable.
+ *
+ * @method skip
+ * @owner Observable
+ */
+function skip(count) {
+    return skip_1.skip(count)(this);
+}
+exports.skip = skip;
+
+},{"../operators/skip":184}],142:[function(require,module,exports){
+"use strict";
+var skipUntil_1 = require('../operators/skipUntil');
+/**
+ * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
+ *
+ * <img src="./img/skipUntil.png" width="100%">
+ *
+ * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to
+ * be mirrored by the resulting Observable.
+ * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits
+ * an item, then emits the remaining items.
+ * @method skipUntil
+ * @owner Observable
+ */
+function skipUntil(notifier) {
+    return skipUntil_1.skipUntil(notifier)(this);
+}
+exports.skipUntil = skipUntil;
+
+},{"../operators/skipUntil":185}],143:[function(require,module,exports){
+"use strict";
+var skipWhile_1 = require('../operators/skipWhile');
+/**
+ * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
+ * true, but emits all further source items as soon as the condition becomes false.
+ *
+ * <img src="./img/skipWhile.png" width="100%">
+ *
+ * @param {Function} predicate - A function to test each item emitted from the source Observable.
+ * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the
+ * specified predicate becomes false.
+ * @method skipWhile
+ * @owner Observable
+ */
+function skipWhile(predicate) {
+    return skipWhile_1.skipWhile(predicate)(this);
+}
+exports.skipWhile = skipWhile;
+
+},{"../operators/skipWhile":186}],144:[function(require,module,exports){
+"use strict";
+var startWith_1 = require('../operators/startWith');
+/* tslint:enable:max-line-length */
+/**
+ * Returns an Observable that emits the items you specify as arguments before it begins to emit
+ * items emitted by the source Observable.
+ *
+ * <img src="./img/startWith.png" width="100%">
+ *
+ * @param {...T} values - Items you want the modified Observable to emit first.
+ * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling
+ * the emissions of the `next` notifications.
+ * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items
+ * emitted by the source Observable.
+ * @method startWith
+ * @owner Observable
+ */
+function startWith() {
+    var array = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        array[_i - 0] = arguments[_i];
+    }
+    return startWith_1.startWith.apply(void 0, array)(this);
+}
+exports.startWith = startWith;
+
+},{"../operators/startWith":187}],145:[function(require,module,exports){
+"use strict";
+var switchMap_1 = require('../operators/switchMap');
+/* tslint:enable:max-line-length */
+/**
+ * Projects each source value to an Observable which is merged in the output
+ * Observable, emitting values only from the most recently projected Observable.
+ *
+ * <span class="informal">Maps each value to an Observable, then flattens all of
+ * these inner Observables using {@link switch}.</span>
+ *
+ * <img src="./img/switchMap.png" width="100%">
+ *
+ * Returns an Observable that emits items based on applying a function that you
+ * supply to each item emitted by the source Observable, where that function
+ * returns an (so-called "inner") Observable. Each time it observes one of these
+ * inner Observables, the output Observable begins emitting the items emitted by
+ * that inner Observable. When a new inner Observable is emitted, `switchMap`
+ * stops emitting items from the earlier-emitted inner Observable and begins
+ * emitting items from the new one. It continues to behave like this for
+ * subsequent inner Observables.
+ *
+ * @example <caption>Rerun an interval Observable on every click event</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link concatMap}
+ * @see {@link exhaustMap}
+ * @see {@link mergeMap}
+ * @see {@link switch}
+ * @see {@link switchMapTo}
+ *
+ * @param {function(value: T, ?index: number): ObservableInput} project A function
+ * that, when applied to an item emitted by the source Observable, returns an
+ * Observable.
+ * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
+ * A function to produce the value on the output Observable based on the values
+ * and the indices of the source (outer) emission and the inner Observable
+ * emission. The arguments passed to this function are:
+ * - `outerValue`: the value that came from the source
+ * - `innerValue`: the value that came from the projected Observable
+ * - `outerIndex`: the "index" of the value that came from the source
+ * - `innerIndex`: the "index" of the value from the projected Observable
+ * @return {Observable} An Observable that emits the result of applying the
+ * projection function (and the optional `resultSelector`) to each item emitted
+ * by the source Observable and taking only the values from the most recently
+ * projected inner Observable.
+ * @method switchMap
+ * @owner Observable
+ */
+function switchMap(project, resultSelector) {
+    return switchMap_1.switchMap(project, resultSelector)(this);
+}
+exports.switchMap = switchMap;
+
+},{"../operators/switchMap":188}],146:[function(require,module,exports){
+"use strict";
+var take_1 = require('../operators/take');
+/**
+ * Emits only the first `count` values emitted by the source Observable.
+ *
+ * <span class="informal">Takes the first `count` values from the source, then
+ * completes.</span>
+ *
+ * <img src="./img/take.png" width="100%">
+ *
+ * `take` returns an Observable that emits only the first `count` values emitted
+ * by the source Observable. If the source emits fewer than `count` values then
+ * all of its values are emitted. After that, it completes, regardless if the
+ * source completes.
+ *
+ * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>
+ * var interval = Rx.Observable.interval(1000);
+ * var five = interval.take(5);
+ * five.subscribe(x => console.log(x));
+ *
+ * @see {@link takeLast}
+ * @see {@link takeUntil}
+ * @see {@link takeWhile}
+ * @see {@link skip}
+ *
+ * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
+ * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
+ *
+ * @param {number} count The maximum number of `next` values to emit.
+ * @return {Observable<T>} An Observable that emits only the first `count`
+ * values emitted by the source Observable, or all of the values from the source
+ * if the source emits fewer than `count` values.
+ * @method take
+ * @owner Observable
+ */
+function take(count) {
+    return take_1.take(count)(this);
+}
+exports.take = take;
+
+},{"../operators/take":189}],147:[function(require,module,exports){
+"use strict";
+var takeUntil_1 = require('../operators/takeUntil');
+/**
+ * Emits the values emitted by the source Observable until a `notifier`
+ * Observable emits a value.
+ *
+ * <span class="informal">Lets values pass until a second Observable,
+ * `notifier`, emits something. Then, it completes.</span>
+ *
+ * <img src="./img/takeUntil.png" width="100%">
+ *
+ * `takeUntil` subscribes and begins mirroring the source Observable. It also
+ * monitors a second Observable, `notifier` that you provide. If the `notifier`
+ * emits a value, the output Observable stops mirroring the source Observable
+ * and completes.
+ *
+ * @example <caption>Tick every second until the first click happens</caption>
+ * var interval = Rx.Observable.interval(1000);
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = interval.takeUntil(clicks);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link take}
+ * @see {@link takeLast}
+ * @see {@link takeWhile}
+ * @see {@link skip}
+ *
+ * @param {Observable} notifier The Observable whose first emitted value will
+ * cause the output Observable of `takeUntil` to stop emitting values from the
+ * source Observable.
+ * @return {Observable<T>} An Observable that emits the values from the source
+ * Observable until such time as `notifier` emits its first value.
+ * @method takeUntil
+ * @owner Observable
+ */
+function takeUntil(notifier) {
+    return takeUntil_1.takeUntil(notifier)(this);
+}
+exports.takeUntil = takeUntil;
+
+},{"../operators/takeUntil":190}],148:[function(require,module,exports){
+"use strict";
+var takeWhile_1 = require('../operators/takeWhile');
+/**
+ * Emits values emitted by the source Observable so long as each value satisfies
+ * the given `predicate`, and then completes as soon as this `predicate` is not
+ * satisfied.
+ *
+ * <span class="informal">Takes values from the source only while they pass the
+ * condition given. When the first value does not satisfy, it completes.</span>
+ *
+ * <img src="./img/takeWhile.png" width="100%">
+ *
+ * `takeWhile` subscribes and begins mirroring the source Observable. Each value
+ * emitted on the source is given to the `predicate` function which returns a
+ * boolean, representing a condition to be satisfied by the source values. The
+ * output Observable emits the source values until such time as the `predicate`
+ * returns false, at which point `takeWhile` stops mirroring the source
+ * Observable and completes the output Observable.
+ *
+ * @example <caption>Emit click events only while the clientX property is greater than 200</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.takeWhile(ev => ev.clientX > 200);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link take}
+ * @see {@link takeLast}
+ * @see {@link takeUntil}
+ * @see {@link skip}
+ *
+ * @param {function(value: T, index: number): boolean} predicate A function that
+ * evaluates a value emitted by the source Observable and returns a boolean.
+ * Also takes the (zero-based) index as the second argument.
+ * @return {Observable<T>} An Observable that emits the values from the source
+ * Observable so long as each value satisfies the condition defined by the
+ * `predicate`, then completes.
+ * @method takeWhile
+ * @owner Observable
+ */
+function takeWhile(predicate) {
+    return takeWhile_1.takeWhile(predicate)(this);
+}
+exports.takeWhile = takeWhile;
+
+},{"../operators/takeWhile":191}],149:[function(require,module,exports){
+"use strict";
+var async_1 = require('../scheduler/async');
+var throttle_1 = require('../operators/throttle');
+var throttleTime_1 = require('../operators/throttleTime');
+/**
+ * Emits a value from the source Observable, then ignores subsequent source
+ * values for `duration` milliseconds, then repeats this process.
+ *
+ * <span class="informal">Lets a value pass, then ignores source values for the
+ * next `duration` milliseconds.</span>
+ *
+ * <img src="./img/throttleTime.png" width="100%">
+ *
+ * `throttleTime` emits the source Observable values on the output Observable
+ * when its internal timer is disabled, and ignores source values when the timer
+ * is enabled. Initially, the timer is disabled. As soon as the first source
+ * value arrives, it is forwarded to the output Observable, and then the timer
+ * is enabled. After `duration` milliseconds (or the time unit determined
+ * internally by the optional `scheduler`) has passed, the timer is disabled,
+ * and this process repeats for the next source value. Optionally takes a
+ * {@link IScheduler} for managing timers.
+ *
+ * @example <caption>Emit clicks at a rate of at most one click per second</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var result = clicks.throttleTime(1000);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link auditTime}
+ * @see {@link debounceTime}
+ * @see {@link delay}
+ * @see {@link sampleTime}
+ * @see {@link throttle}
+ *
+ * @param {number} duration Time to wait before emitting another value after
+ * emitting the last value, measured in milliseconds or the time unit determined
+ * internally by the optional `scheduler`.
+ * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
+ * managing the timers that handle the throttling.
+ * @return {Observable<T>} An Observable that performs the throttle operation to
+ * limit the rate of emissions from the source.
+ * @method throttleTime
+ * @owner Observable
+ */
+function throttleTime(duration, scheduler, config) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
+    return throttleTime_1.throttleTime(duration, scheduler, config)(this);
+}
+exports.throttleTime = throttleTime;
+
+},{"../operators/throttle":193,"../operators/throttleTime":194,"../scheduler/async":203}],150:[function(require,module,exports){
+"use strict";
+var async_1 = require('../scheduler/async');
+var timeout_1 = require('../operators/timeout');
+/**
+ *
+ * Errors if Observable does not emit a value in given time span.
+ *
+ * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
+ *
+ * <img src="./img/timeout.png" width="100%">
+ *
+ * `timeout` operator accepts as an argument either a number or a Date.
+ *
+ * If number was provided, it returns an Observable that behaves like a source
+ * Observable, unless there is a period of time where there is no value emitted.
+ * So if you provide `100` as argument and first value comes after 50ms from
+ * the moment of subscription, this value will be simply re-emitted by the resulting
+ * Observable. If however after that 100ms passes without a second value being emitted,
+ * stream will end with an error and source Observable will be unsubscribed.
+ * These checks are performed throughout whole lifecycle of Observable - from the moment
+ * it was subscribed to, until it completes or errors itself. Thus every value must be
+ * emitted within specified period since previous value.
+ *
+ * If provided argument was Date, returned Observable behaves differently. It throws
+ * if Observable did not complete before provided Date. This means that periods between
+ * emission of particular values do not matter in this case. If Observable did not complete
+ * before provided Date, source Observable will be unsubscribed. Other than that, resulting
+ * stream behaves just as source Observable.
+ *
+ * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)
+ * when returned Observable will check if source stream emitted value or completed.
+ *
+ * @example <caption>Check if ticks are emitted within certain timespan</caption>
+ * const seconds = Rx.Observable.interval(1000);
+ *
+ * seconds.timeout(1100) // Let's use bigger timespan to be safe,
+ *                       // since `interval` might fire a bit later then scheduled.
+ * .subscribe(
+ *     value => console.log(value), // Will emit numbers just as regular `interval` would.
+ *     err => console.log(err) // Will never be called.
+ * );
+ *
+ * seconds.timeout(900).subscribe(
+ *     value => console.log(value), // Will never be called.
+ *     err => console.log(err) // Will emit error before even first value is emitted,
+ *                             // since it did not arrive within 900ms period.
+ * );
+ *
+ * @example <caption>Use Date to check if Observable completed</caption>
+ * const seconds = Rx.Observable.interval(1000);
+ *
+ * seconds.timeout(new Date("December 17, 2020 03:24:00"))
+ * .subscribe(
+ *     value => console.log(value), // Will emit values as regular `interval` would
+ *                                  // until December 17, 2020 at 03:24:00.
+ *     err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error,
+ *                             // since Observable did not complete by then.
+ * );
+ *
+ * @see {@link timeoutWith}
+ *
+ * @param {number|Date} due Number specifying period within which Observable must emit values
+ *                          or Date specifying before when Observable should complete
+ * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur.
+ * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.
+ * @method timeout
+ * @owner Observable
+ */
+function timeout(due, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return timeout_1.timeout(due, scheduler)(this);
+}
+exports.timeout = timeout;
+
+},{"../operators/timeout":195,"../scheduler/async":203}],151:[function(require,module,exports){
+"use strict";
+var withLatestFrom_1 = require('../operators/withLatestFrom');
+/* tslint:enable:max-line-length */
+/**
+ * Combines the source Observable with other Observables to create an Observable
+ * whose values are calculated from the latest values of each, only when the
+ * source emits.
+ *
+ * <span class="informal">Whenever the source Observable emits a value, it
+ * computes a formula using that value plus the latest values from other input
+ * Observables, then emits the output of that formula.</span>
+ *
+ * <img src="./img/withLatestFrom.png" width="100%">
+ *
+ * `withLatestFrom` combines each value from the source Observable (the
+ * instance) with the latest values from the other input Observables only when
+ * the source emits a value, optionally using a `project` function to determine
+ * the value to be emitted on the output Observable. All input Observables must
+ * emit at least one value before the output Observable will emit a value.
+ *
+ * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var timer = Rx.Observable.interval(1000);
+ * var result = clicks.withLatestFrom(timer);
+ * result.subscribe(x => console.log(x));
+ *
+ * @see {@link combineLatest}
+ *
+ * @param {ObservableInput} other An input Observable to combine with the source
+ * Observable. More than one input Observables may be given as argument.
+ * @param {Function} [project] Projection function for combining values
+ * together. Receives all values in order of the Observables passed, where the
+ * first parameter is a value from the source Observable. (e.g.
+ * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not
+ * passed, arrays will be emitted on the output Observable.
+ * @return {Observable} An Observable of projected values from the most recent
+ * values from each input Observable, or an array of the most recent values from
+ * each input Observable.
+ * @method withLatestFrom
+ * @owner Observable
+ */
+function withLatestFrom() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        args[_i - 0] = arguments[_i];
+    }
+    return withLatestFrom_1.withLatestFrom.apply(void 0, args)(this);
+}
+exports.withLatestFrom = withLatestFrom;
+
+},{"../operators/withLatestFrom":196}],152:[function(require,module,exports){
+"use strict";
+var zip_1 = require('../operators/zip');
+/* tslint:enable:max-line-length */
+/**
+ * @param observables
+ * @return {Observable<R>}
+ * @method zip
+ * @owner Observable
+ */
+function zipProto() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i - 0] = arguments[_i];
+    }
+    return zip_1.zip.apply(void 0, observables)(this);
+}
+exports.zipProto = zipProto;
+
+},{"../operators/zip":197}],153:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var OuterSubscriber_1 = require('../OuterSubscriber');
+var subscribeToResult_1 = require('../util/subscribeToResult');
+/**
+ * Buffers the source Observable values until `closingNotifier` emits.
+ *
+ * <span class="informal">Collects values from the past as an array, and emits
+ * that array only when another Observable emits.</span>
+ *
+ * <img src="./img/buffer.png" width="100%">
+ *
+ * Buffers the incoming Observable values until the given `closingNotifier`
+ * Observable emits a value, at which point it emits the buffer on the output
+ * Observable and starts a new buffer internally, awaiting the next time
+ * `closingNotifier` emits.
+ *
+ * @example <caption>On every click, emit array of most recent interval events</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var interval = Rx.Observable.interval(1000);
+ * var buffered = interval.buffer(clicks);
+ * buffered.subscribe(x => console.log(x));
+ *
+ * @see {@link bufferCount}
+ * @see {@link bufferTime}
+ * @see {@link bufferToggle}
+ * @see {@link bufferWhen}
+ * @see {@link window}
+ *
+ * @param {Observable<any>} closingNotifier An Observable that signals the
+ * buffer to be emitted on the output Observable.
+ * @return {Observable<T[]>} An Observable of buffers, which are arrays of
+ * values.
+ * @method buffer
+ * @owner Observable
+ */
+function buffer(closingNotifier) {
+    return function bufferOperatorFunction(source) {
+        return source.lift(new BufferOperator(closingNotifier));
+    };
+}
+exports.buffer = buffer;
+var BufferOperator = (function () {
+    function BufferOperator(closingNotifier) {
+        this.closingNotifier = closingNotifier;
+    }
+    BufferOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
+    };
+    return BufferOperator;
+}());
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var BufferSubscriber = (function (_super) {
+    __extends(BufferSubscriber, _super);
+    function BufferSubscriber(destination, closingNotifier) {
+        _super.call(this, destination);
+        this.buffer = [];
+        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
+    }
+    BufferSubscriber.prototype._next = function (value) {
+        this.buffer.push(value);
+    };
+    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var buffer = this.buffer;
+        this.buffer = [];
+        this.destination.next(buffer);
+    };
+    return BufferSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],154:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Subscriber_1 = require('../Subscriber');
+/**
+ * Buffers the source Observable values until the size hits the maximum
+ * `bufferSize` given.
+ *
+ * <span class="informal">Collects values from the past as an array, and emits
+ * that array only when its size reaches `bufferSize`.</span>
+ *
+ * <img src="./img/bufferCount.png" width="100%">
+ *
+ * Buffers a number of values from the source Observable by `bufferSize` then
+ * emits the buffer and clears it, and starts a new buffer each
+ * `startBufferEvery` values. If `startBufferEvery` is not provided or is
+ * `null`, then new buffers are started immediately at the start of the source
+ * and when each buffer closes and is emitted.
+ *
+ * @example <caption>Emit the last two click events as an array</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var buffered = clicks.bufferCount(2);
+ * buffered.subscribe(x => console.log(x));
+ *
+ * @example <caption>On every click, emit the last two click events as an array</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var buffered = clicks.bufferCount(2, 1);
+ * buffered.subscribe(x => console.log(x));
+ *
+ * @see {@link buffer}
+ * @see {@link bufferTime}
+ * @see {@link bufferToggle}
+ * @see {@link bufferWhen}
+ * @see {@link pairwise}
+ * @see {@link windowCount}
+ *
+ * @param {number} bufferSize The maximum size of the buffer emitted.
+ * @param {number} [startBufferEvery] Interval at which to start a new buffer.
+ * For example if `startBufferEvery` is `2`, then a new buffer will be started
+ * on every other value from the source. A new buffer is started at the
+ * beginning of the source by default.
+ * @return {Observable<T[]>} An Observable of arrays of buffered values.
+ * @method bufferCount
+ * @owner Observable
+ */
+function bufferCount(bufferSize, startBufferEvery) {
+    if (startBufferEvery === void 0) { startBufferEvery = null; }
+    return function bufferCountOperatorFunction(source) {
+        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+    };
+}
+exports.bufferCount = bufferCount;
+var BufferCountOperator = (function () {
+    function BufferCountOperator(bufferSize, startBufferEvery) {
+        this.bufferSize = bufferSize;
+        this.startBufferEvery = startBufferEvery;
+        if (!startBufferEvery || bufferSize === startBufferEvery) {
+            this.subscriberClass = BufferCountSubscriber;
+        }
+        else {
+            this.subscriberClass = BufferSkipCountSubscriber;
+        }
+    }
+    BufferCountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
+    };
+    return BufferCountOperator;
+}());
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var BufferCountSubscriber = (function (_super) {
+    __extends(BufferCountSubscriber, _super);
+    function BufferCountSubscriber(destination, bufferSize) {
+        _super.call(this, destination);
+        this.bufferSize = bufferSize;
+        this.buffer = [];
+    }
+    BufferCountSubscriber.prototype._next = function (value) {
+        var buffer = this.buffer;
+        buffer.push(value);
+        if (buffer.length == this.bufferSize) {
+            this.destination.next(buffer);
+            this.buffer = [];
+        }
+    };
+    BufferCountSubscriber.prototype._complete = function () {
+        var buffer = this.buffer;
+        if (buffer.length > 0) {
+            this.destination.next(buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    return BufferCountSubscriber;
+}(Subscriber_1.Subscriber));
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var BufferSkipCountSubscriber = (function (_super) {
+    __extends(BufferSkipCountSubscriber, _super);
+    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
+        _super.call(this, destination);
+        this.bufferSize = bufferSize;
+        this.startBufferEvery = startBufferEvery;
+        this.buffers = [];
+        this.count = 0;
+    }
+    BufferSkipCountSubscriber.prototype._next = function (value) {
+        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
+        this.count++;
+        if (count % startBufferEvery === 0) {
+            buffers.push([]);
+        }
+        for (var i = buffers.length; i--;) {
+            var buffer = buffers[i];
+            buffer.push(value);
+            if (buffer.length === bufferSize) {
+                buffers.splice(i, 1);
+                this.destination.next(buffer);
+            }
+        }
+    };
+    BufferSkipCountSubscriber.prototype._complete = function () {
+        var _a = this, buffers = _a.buffers, destination = _a.destination;
+        while (buffers.length > 0) {
+            var buffer = buffers.shift();
+            if (buffer.length > 0) {
+                destination.next(buffer);
+            }
+        }
+        _super.prototype._complete.call(this);
+    };
+    return BufferSkipCountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":36}],155:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Subscription_1 = require('../Subscription');
+var tryCatch_1 = require('../util/tryCatch');
+var errorObject_1 = require('../util/errorObject');
+var OuterSubscriber_1 = require('../OuterSubscriber');
+var subscribeToResult_1 = require('../util/subscribeToResult');
+/**
+ * Buffers the source Observable values, using a factory function of closing
+ * Observables to determine when to close, emit, and reset the buffer.
+ *
+ * <span class="informal">Collects values from the past as an array. When it
+ * starts collecting values, it calls a function that returns an Observable that
+ * tells when to close the buffer and restart collecting.</span>
+ *
+ * <img src="./img/bufferWhen.png" width="100%">
+ *
+ * Opens a buffer immediately, then closes the buffer when the observable
+ * returned by calling `closingSelector` function emits a value. When it closes
+ * the buffer, it immediately opens a new buffer and repeats the process.
+ *
+ * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var buffered = clicks.bufferWhen(() =>
+ *   Rx.Observable.interval(1000 + Math.random() * 4000)
+ * );
+ * buffered.subscribe(x => console.log(x));
+ *
+ * @see {@link buffer}
+ * @see {@link bufferCount}
+ * @see {@link bufferTime}
+ * @see {@link bufferToggle}
+ * @see {@link windowWhen}
+ *
+ * @param {function(): Observable} closingSelector A function that takes no
+ * arguments and returns an Observable that signals buffer closure.
+ * @return {Observable<T[]>} An observable of arrays of buffered values.
+ * @method bufferWhen
+ * @owner Observable
+ */
+function bufferWhen(closingSelector) {
+    return function (source) {
+        return source.lift(new BufferWhenOperator(closingSelector));
+    };
 }
 exports.bufferWhen = bufferWhen;
 var BufferWhenOperator = (function () {
@@ -8849,7 +10834,7 @@ var BufferWhenSubscriber = (function (_super) {
     return BufferWhenSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],113:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":215,"../util/subscribeToResult":228,"../util/tryCatch":230}],156:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -8913,16 +10898,16 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  *  is returned by the `selector` will be used to continue the observable chain.
  * @return {Observable} An observable that originates from either the source or the observable returned by the
  *  catch `selector` function.
- * @method catch
- * @name catch
- * @owner Observable
+ * @name catchError
  */
-function _catch(selector) {
-    var operator = new CatchOperator(selector);
-    var caught = this.lift(operator);
-    return (operator.caught = caught);
+function catchError(selector) {
+    return function catchErrorOperatorFunction(source) {
+        var operator = new CatchOperator(selector);
+        var caught = source.lift(operator);
+        return (operator.caught = caught);
+    };
 }
-exports._catch = _catch;
+exports.catchError = catchError;
 var CatchOperator = (function () {
     function CatchOperator(selector) {
         this.selector = selector;
@@ -8966,7 +10951,7 @@ var CatchSubscriber = (function (_super) {
     return CatchSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],114:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],157:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9036,8 +11021,7 @@ function combineLatest() {
     if (observables.length === 1 && isArray_1.isArray(observables[0])) {
         observables = observables[0].slice();
     }
-    observables.unshift(this);
-    return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));
+    return function (source) { return source.lift.call(new ArrayObservable_1.ArrayObservable([source].concat(observables)), new CombineLatestOperator(project)); };
 }
 exports.combineLatest = combineLatest;
 var CombineLatestOperator = (function () {
@@ -9119,12 +11103,9 @@ var CombineLatestSubscriber = (function (_super) {
 }(OuterSubscriber_1.OuterSubscriber));
 exports.CombineLatestSubscriber = CombineLatestSubscriber;
 
-},{"../OuterSubscriber":31,"../observable/ArrayObservable":88,"../util/isArray":168,"../util/subscribeToResult":177}],115:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../observable/ArrayObservable":90,"../util/isArray":217,"../util/subscribeToResult":228}],158:[function(require,module,exports){
 "use strict";
-var Observable_1 = require('../Observable');
-var isScheduler_1 = require('../util/isScheduler');
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
+var concat_1 = require('../observable/concat');
 /* tslint:enable:max-line-length */
 /**
  * Creates an output Observable which sequentially emits all values from every
@@ -9180,121 +11161,67 @@ function concat() {
     for (var _i = 0; _i < arguments.length; _i++) {
         observables[_i - 0] = arguments[_i];
     }
-    return this.lift.call(concatStatic.apply(void 0, [this].concat(observables)));
+    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
 }
 exports.concat = concat;
-/* tslint:enable:max-line-length */
+
+},{"../observable/concat":102}],159:[function(require,module,exports){
+"use strict";
+var mergeAll_1 = require('./mergeAll');
 /**
- * Creates an output Observable which sequentially emits all values from given
- * Observable and then moves on to the next.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * `concat` joins multiple Observables together, by subscribing to them one at a time and
- * merging their results into the output Observable. You can pass either an array of
- * Observables, or put them directly as arguments. Passing an empty array will result
- * in Observable that completes immediately.
- *
- * `concat` will subscribe to first input Observable and emit all its values, without
- * changing or affecting them in any way. When that Observable completes, it will
- * subscribe to then next Observable passed and, again, emit its values. This will be
- * repeated, until the operator runs out of Observables. When last input Observable completes,
- * `concat` will complete as well. At any given moment only one Observable passed to operator
- * emits values. If you would like to emit values from passed Observables concurrently, check out
- * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
- * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
- *
- * Note that if some input Observable never completes, `concat` will also never complete
- * and Observables following the one that did not complete will never be subscribed. On the other
- * hand, if some Observable simply completes immediately after it is subscribed, it will be
- * invisible for `concat`, which will just move on to the next Observable.
- *
- * If any Observable in chain errors, instead of passing control to the next Observable,
- * `concat` will error immediately as well. Observables that would be subscribed after
- * the one that emitted error, never will.
- *
- * If you pass to `concat` the same Observable many times, its stream of values
- * will be "replayed" on every subscription, which means you can repeat given Observable
- * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
- * you can always use {@link repeat}.
+ * Converts a higher-order Observable into a first-order Observable by
+ * concatenating the inner Observables in order.
  *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = Rx.Observable.concat(timer, sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
+ * <span class="informal">Flattens an Observable-of-Observables by putting one
+ * inner Observable after the other.</span>
  *
+ * <img src="./img/concatAll.png" width="100%">
  *
- * @example <caption>Concatenate an array of 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed
- * result.subscribe(x => console.log(x));
+ * Joins every Observable emitted by the source (a higher-order Observable), in
+ * a serial fashion. It subscribes to each inner Observable only after the
+ * previous inner Observable has completed, and merges all of their values into
+ * the returned observable.
  *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
+ * __Warning:__ If the source Observable emits Observables quickly and
+ * endlessly, and the inner Observables it emits generally complete slower than
+ * the source emits, you can run into memory issues as the incoming Observables
+ * collect in an unbounded buffer.
  *
+ * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set
+ * to `1`.
  *
- * @example <caption>Concatenate the same Observable to repeat it</caption>
- * const timer = Rx.Observable.interval(1000).take(2);
- *
- * Rx.Observable.concat(timer, timer) // concating the same Observable!
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('...and it is done!')
- * );
+ * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4));
+ * var firstOrder = higherOrder.concatAll();
+ * firstOrder.subscribe(x => console.log(x));
  *
- * // Logs:
- * // 0 after 1s
- * // 1 after 2s
- * // 0 after 3s
- * // 1 after 4s
- * // "...and it is done!" also after 4s
+ * // Results in the following:
+ * // (results are not concurrent)
+ * // For every click on the "document" it will emit values 0 to 3 spaced
+ * // on a 1000ms interval
+ * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
  *
- * @see {@link concatAll}
+ * @see {@link combineAll}
+ * @see {@link concat}
  * @see {@link concatMap}
  * @see {@link concatMapTo}
+ * @see {@link exhaust}
+ * @see {@link mergeAll}
+ * @see {@link switch}
+ * @see {@link zipAll}
  *
- * @param {ObservableInput} input1 An input Observable to concatenate with others.
- * @param {ObservableInput} input2 An input Observable to concatenate with others.
- * More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @static true
- * @name concat
+ * @return {Observable} An Observable emitting values from all the inner
+ * Observables concatenated.
+ * @method concatAll
  * @owner Observable
  */
-function concatStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var scheduler = null;
-    var args = observables;
-    if (isScheduler_1.isScheduler(args[observables.length - 1])) {
-        scheduler = args.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
-    }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));
+function concatAll() {
+    return mergeAll_1.mergeAll(1);
 }
-exports.concatStatic = concatStatic;
+exports.concatAll = concatAll;
 
-},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],116:[function(require,module,exports){
+},{"./mergeAll":171}],160:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9351,7 +11278,7 @@ var async_1 = require('../scheduler/async');
  */
 function debounceTime(dueTime, scheduler) {
     if (scheduler === void 0) { scheduler = async_1.async; }
-    return this.lift(new DebounceTimeOperator(dueTime, scheduler));
+    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
 }
 exports.debounceTime = debounceTime;
 var DebounceTimeOperator = (function () {
@@ -9411,7 +11338,7 @@ function dispatchNext(subscriber) {
     subscriber.debouncedNext();
 }
 
-},{"../Subscriber":36,"../scheduler/async":156}],117:[function(require,module,exports){
+},{"../Subscriber":36,"../scheduler/async":203}],161:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9465,7 +11392,7 @@ function delay(delay, scheduler) {
     if (scheduler === void 0) { scheduler = async_1.async; }
     var absoluteDelay = isDate_1.isDate(delay);
     var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return this.lift(new DelayOperator(delayFor, scheduler));
+    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
 }
 exports.delay = delay;
 var DelayOperator = (function () {
@@ -9547,7 +11474,7 @@ var DelayMessage = (function () {
     return DelayMessage;
 }());
 
-},{"../Notification":28,"../Subscriber":36,"../scheduler/async":156,"../util/isDate":170}],118:[function(require,module,exports){
+},{"../Notification":28,"../Subscriber":36,"../scheduler/async":203,"../util/isDate":219}],162:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9603,7 +11530,7 @@ var Set_1 = require('../util/Set');
  * @owner Observable
  */
 function distinct(keySelector, flushes) {
-    return this.lift(new DistinctOperator(keySelector, flushes));
+    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
 }
 exports.distinct = distinct;
 var DistinctOperator = (function () {
@@ -9668,7 +11595,7 @@ var DistinctSubscriber = (function (_super) {
 }(OuterSubscriber_1.OuterSubscriber));
 exports.DistinctSubscriber = DistinctSubscriber;
 
-},{"../OuterSubscriber":31,"../util/Set":165,"../util/subscribeToResult":177}],119:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/Set":212,"../util/subscribeToResult":228}],163:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9719,7 +11646,7 @@ var errorObject_1 = require('../util/errorObject');
  * @owner Observable
  */
 function distinctUntilChanged(compare, keySelector) {
-    return this.lift(new DistinctUntilChangedOperator(compare, keySelector));
+    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
 }
 exports.distinctUntilChanged = distinctUntilChanged;
 var DistinctUntilChangedOperator = (function () {
@@ -9777,121 +11704,7 @@ var DistinctUntilChangedSubscriber = (function (_super) {
     return DistinctUntilChangedSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../util/errorObject":167,"../util/tryCatch":179}],120:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:enable:max-line-length */
-/**
- * Perform a side effect for every emission on the source Observable, but return
- * an Observable that is identical to the source.
- *
- * <span class="informal">Intercepts each emission on the source and runs a
- * function, but returns an output which is identical to the source as long as errors don't occur.</span>
- *
- * <img src="./img/do.png" width="100%">
- *
- * Returns a mirrored Observable of the source Observable, but modified so that
- * the provided Observer is called to perform a side effect for every value,
- * error, and completion emitted by the source. Any errors that are thrown in
- * the aforementioned Observer or handlers are safely sent down the error path
- * of the output Observable.
- *
- * This operator is useful for debugging your Observables for the correct values
- * or performing other side effects.
- *
- * Note: this is different to a `subscribe` on the Observable. If the Observable
- * returned by `do` is not subscribed, the side effects specified by the
- * Observer will never happen. `do` therefore simply spies on existing
- * execution, it does not trigger an execution to happen like `subscribe` does.
- *
- * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks
- *   .do(ev => console.log(ev))
- *   .map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link map}
- * @see {@link subscribe}
- *
- * @param {Observer|function} [nextOrObserver] A normal Observer object or a
- * callback for `next`.
- * @param {function} [error] Callback for errors in the source.
- * @param {function} [complete] Callback for the completion of the source.
- * @return {Observable} An Observable identical to the source, but runs the
- * specified Observer or callback(s) for each item.
- * @method do
- * @name do
- * @owner Observable
- */
-function _do(nextOrObserver, error, complete) {
-    return this.lift(new DoOperator(nextOrObserver, error, complete));
-}
-exports._do = _do;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DoSubscriber = (function (_super) {
-    __extends(DoSubscriber, _super);
-    function DoSubscriber(destination, nextOrObserver, error, complete) {
-        _super.call(this, destination);
-        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-        safeSubscriber.syncErrorThrowable = true;
-        this.add(safeSubscriber);
-        this.safeSubscriber = safeSubscriber;
-    }
-    DoSubscriber.prototype._next = function (value) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.next(value);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.next(value);
-        }
-    };
-    DoSubscriber.prototype._error = function (err) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.error(err);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.error(err);
-        }
-    };
-    DoSubscriber.prototype._complete = function () {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.complete();
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return DoSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":36}],121:[function(require,module,exports){
+},{"../Subscriber":36,"../util/errorObject":215,"../util/tryCatch":230}],164:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -9952,7 +11765,7 @@ function expand(project, concurrent, scheduler) {
     if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
     if (scheduler === void 0) { scheduler = undefined; }
     concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return this.lift(new ExpandOperator(project, concurrent, scheduler));
+    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
 }
 exports.expand = expand;
 var ExpandOperator = (function () {
@@ -10043,7 +11856,7 @@ var ExpandSubscriber = (function (_super) {
 }(OuterSubscriber_1.OuterSubscriber));
 exports.ExpandSubscriber = ExpandSubscriber;
 
-},{"../OuterSubscriber":31,"../util/errorObject":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],122:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/errorObject":215,"../util/subscribeToResult":228,"../util/tryCatch":230}],165:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10092,7 +11905,9 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function filter(predicate, thisArg) {
-    return this.lift(new FilterOperator(predicate, thisArg));
+    return function filterOperatorFunction(source) {
+        return source.lift(new FilterOperator(predicate, thisArg));
+    };
 }
 exports.filter = filter;
 var FilterOperator = (function () {
@@ -10117,7 +11932,6 @@ var FilterSubscriber = (function (_super) {
         this.predicate = predicate;
         this.thisArg = thisArg;
         this.count = 0;
-        this.predicate = predicate;
     }
     // the try catch block below is left specifically for
     // optimization and perf reasons. a tryCatcher is not necessary here.
@@ -10137,7 +11951,7 @@ var FilterSubscriber = (function (_super) {
     return FilterSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],123:[function(require,module,exports){
+},{"../Subscriber":36}],166:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10154,10 +11968,10 @@ var Subscription_1 = require('../Subscription');
  * @method finally
  * @owner Observable
  */
-function _finally(callback) {
-    return this.lift(new FinallyOperator(callback));
+function finalize(callback) {
+    return function (source) { return source.lift(new FinallyOperator(callback)); };
 }
-exports._finally = _finally;
+exports.finalize = finalize;
 var FinallyOperator = (function () {
     function FinallyOperator(callback) {
         this.callback = callback;
@@ -10181,7 +11995,7 @@ var FinallySubscriber = (function (_super) {
     return FinallySubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../Subscription":37}],124:[function(require,module,exports){
+},{"../Subscriber":36,"../Subscription":37}],167:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10240,7 +12054,7 @@ var EmptyError_1 = require('../util/EmptyError');
  * @owner Observable
  */
 function first(predicate, resultSelector, defaultValue) {
-    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));
+    return function (source) { return source.lift(new FirstOperator(predicate, resultSelector, defaultValue, source)); };
 }
 exports.first = first;
 var FirstOperator = (function () {
@@ -10334,7 +12148,7 @@ var FirstSubscriber = (function (_super) {
     return FirstSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../util/EmptyError":163}],125:[function(require,module,exports){
+},{"../Subscriber":36,"../util/EmptyError":210}],168:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10362,7 +12176,7 @@ var EmptyError_1 = require('../util/EmptyError');
  * @owner Observable
  */
 function last(predicate, resultSelector, defaultValue) {
-    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));
+    return function (source) { return source.lift(new LastOperator(predicate, resultSelector, defaultValue, source)); };
 }
 exports.last = last;
 var LastOperator = (function () {
@@ -10454,7 +12268,7 @@ var LastSubscriber = (function (_super) {
     return LastSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../util/EmptyError":163}],126:[function(require,module,exports){
+},{"../Subscriber":36,"../util/EmptyError":210}],169:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10496,10 +12310,12 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function map(project, thisArg) {
-    if (typeof project !== 'function') {
-        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-    }
-    return this.lift(new MapOperator(project, thisArg));
+    return function mapOperation(source) {
+        if (typeof project !== 'function') {
+            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
+        }
+        return source.lift(new MapOperator(project, thisArg));
+    };
 }
 exports.map = map;
 var MapOperator = (function () {
@@ -10542,65 +12358,19 @@ var MapSubscriber = (function (_super) {
     return MapSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],127:[function(require,module,exports){
+},{"../Subscriber":36}],170:[function(require,module,exports){
 "use strict";
 var Observable_1 = require('../Observable');
 var ArrayObservable_1 = require('../observable/ArrayObservable');
 var mergeAll_1 = require('./mergeAll');
 var isScheduler_1 = require('../util/isScheduler');
 /* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (either the source or an
- * Observable given as argument), and simply forwards (without doing any
- * transformation) all the values from all the input Observables to the output
- * Observable. The output Observable only completes once all input Observables
- * have completed. Any error delivered by an input Observable will be immediately
- * emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = clicks.merge(timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = timer1.merge(timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {ObservableInput} other An input Observable to merge with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} An Observable that emits items that are the result of
- * every input Observable.
- * @method merge
- * @owner Observable
- */
 function merge() {
     var observables = [];
     for (var _i = 0; _i < arguments.length; _i++) {
         observables[_i - 0] = arguments[_i];
     }
-    return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));
+    return function (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); };
 }
 exports.merge = merge;
 /* tslint:enable:max-line-length */
@@ -10684,19 +12454,14 @@ function mergeStatic() {
     if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
         return observables[0];
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));
+    return mergeAll_1.mergeAll(concurrent)(new ArrayObservable_1.ArrayObservable(observables, scheduler));
 }
 exports.mergeStatic = mergeStatic;
 
-},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],128:[function(require,module,exports){
+},{"../Observable":29,"../observable/ArrayObservable":90,"../util/isScheduler":224,"./mergeAll":171}],171:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
+var mergeMap_1 = require('./mergeMap');
+var identity_1 = require('../util/identity');
 /**
  * Converts a higher-order Observable into a first-order Observable which
  * concurrently delivers all values that are emitted on the inner Observables.
@@ -10743,64 +12508,11 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  */
 function mergeAll(concurrent) {
     if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return this.lift(new MergeAllOperator(concurrent));
+    return mergeMap_1.mergeMap(identity_1.identity, null, concurrent);
 }
 exports.mergeAll = mergeAll;
-var MergeAllOperator = (function () {
-    function MergeAllOperator(concurrent) {
-        this.concurrent = concurrent;
-    }
-    MergeAllOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));
-    };
-    return MergeAllOperator;
-}());
-exports.MergeAllOperator = MergeAllOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MergeAllSubscriber = (function (_super) {
-    __extends(MergeAllSubscriber, _super);
-    function MergeAllSubscriber(destination, concurrent) {
-        _super.call(this, destination);
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-    }
-    MergeAllSubscriber.prototype._next = function (observable) {
-        if (this.active < this.concurrent) {
-            this.active++;
-            this.add(subscribeToResult_1.subscribeToResult(this, observable));
-        }
-        else {
-            this.buffer.push(observable);
-        }
-    };
-    MergeAllSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeAllSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeAllSubscriber = MergeAllSubscriber;
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],129:[function(require,module,exports){
+},{"../util/identity":216,"./mergeMap":172}],172:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -10870,11 +12582,13 @@ var OuterSubscriber_1 = require('../OuterSubscriber');
  */
 function mergeMap(project, resultSelector, concurrent) {
     if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-        resultSelector = null;
-    }
-    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));
+    return function mergeMapOperatorFunction(source) {
+        if (typeof resultSelector === 'number') {
+            concurrent = resultSelector;
+            resultSelector = null;
+        }
+        return source.lift(new MergeMapOperator(project, resultSelector, concurrent));
+    };
 }
 exports.mergeMap = mergeMap;
 var MergeMapOperator = (function () {
@@ -10972,7 +12686,7 @@ var MergeMapSubscriber = (function (_super) {
 }(OuterSubscriber_1.OuterSubscriber));
 exports.MergeMapSubscriber = MergeMapSubscriber;
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],130:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],173:[function(require,module,exports){
 "use strict";
 var ConnectableObservable_1 = require('../observable/ConnectableObservable');
 /* tslint:enable:max-line-length */
@@ -10996,22 +12710,24 @@ var ConnectableObservable_1 = require('../observable/ConnectableObservable');
  * @owner Observable
  */
 function multicast(subjectOrSubjectFactory, selector) {
-    var subjectFactory;
-    if (typeof subjectOrSubjectFactory === 'function') {
-        subjectFactory = subjectOrSubjectFactory;
-    }
-    else {
-        subjectFactory = function subjectFactory() {
-            return subjectOrSubjectFactory;
-        };
-    }
-    if (typeof selector === 'function') {
-        return this.lift(new MulticastOperator(subjectFactory, selector));
-    }
-    var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor);
-    connectable.source = this;
-    connectable.subjectFactory = subjectFactory;
-    return connectable;
+    return function multicastOperatorFunction(source) {
+        var subjectFactory;
+        if (typeof subjectOrSubjectFactory === 'function') {
+            subjectFactory = subjectOrSubjectFactory;
+        }
+        else {
+            subjectFactory = function subjectFactory() {
+                return subjectOrSubjectFactory;
+            };
+        }
+        if (typeof selector === 'function') {
+            return source.lift(new MulticastOperator(subjectFactory, selector));
+        }
+        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
+        connectable.source = source;
+        connectable.subjectFactory = subjectFactory;
+        return connectable;
+    };
 }
 exports.multicast = multicast;
 var MulticastOperator = (function () {
@@ -11030,7 +12746,7 @@ var MulticastOperator = (function () {
 }());
 exports.MulticastOperator = MulticastOperator;
 
-},{"../observable/ConnectableObservable":89}],131:[function(require,module,exports){
+},{"../observable/ConnectableObservable":91}],174:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11087,7 +12803,9 @@ var Notification_1 = require('../Notification');
  */
 function observeOn(scheduler, delay) {
     if (delay === void 0) { delay = 0; }
-    return this.lift(new ObserveOnOperator(scheduler, delay));
+    return function observeOnOperatorFunction(source) {
+        return source.lift(new ObserveOnOperator(scheduler, delay));
+    };
 }
 exports.observeOn = observeOn;
 var ObserveOnOperator = (function () {
@@ -11144,7 +12862,7 @@ var ObserveOnMessage = (function () {
 }());
 exports.ObserveOnMessage = ObserveOnMessage;
 
-},{"../Notification":28,"../Subscriber":36}],132:[function(require,module,exports){
+},{"../Notification":28,"../Subscriber":36}],175:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11188,7 +12906,7 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function pairwise() {
-    return this.lift(new PairwiseOperator());
+    return function (source) { return source.lift(new PairwiseOperator()); };
 }
 exports.pairwise = pairwise;
 var PairwiseOperator = (function () {
@@ -11222,7 +12940,7 @@ var PairwiseSubscriber = (function (_super) {
     return PairwiseSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],133:[function(require,module,exports){
+},{"../Subscriber":36}],176:[function(require,module,exports){
 "use strict";
 var map_1 = require('./map');
 /**
@@ -11260,7 +12978,7 @@ function pluck() {
     if (length === 0) {
         throw new Error('list of properties cannot be empty.');
     }
-    return map_1.map.call(this, plucker(properties, length));
+    return function (source) { return map_1.map(plucker(properties, length))(source); };
 }
 exports.pluck = pluck;
 function plucker(props, length) {
@@ -11280,7 +12998,7 @@ function plucker(props, length) {
     return mapper;
 }
 
-},{"./map":126}],134:[function(require,module,exports){
+},{"./map":169}],177:[function(require,module,exports){
 "use strict";
 var Subject_1 = require('../Subject');
 var multicast_1 = require('./multicast');
@@ -11299,31 +13017,180 @@ var multicast_1 = require('./multicast');
  * @owner Observable
  */
 function publish(selector) {
-    return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast.call(this, new Subject_1.Subject());
+    return selector ?
+        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
+        multicast_1.multicast(new Subject_1.Subject());
 }
 exports.publish = publish;
 
-},{"../Subject":34,"./multicast":130}],135:[function(require,module,exports){
+},{"../Subject":34,"./multicast":173}],178:[function(require,module,exports){
 "use strict";
 var ReplaySubject_1 = require('../ReplaySubject');
 var multicast_1 = require('./multicast');
+/* tslint:enable:max-line-length */
+function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
+    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
+        scheduler = selectorOrScheduler;
+    }
+    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
+    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
+    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
+}
+exports.publishReplay = publishReplay;
+
+},{"../ReplaySubject":32,"./multicast":173}],179:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Subscriber_1 = require('../Subscriber');
+function refCount() {
+    return function refCountOperatorFunction(source) {
+        return source.lift(new RefCountOperator(source));
+    };
+}
+exports.refCount = refCount;
+var RefCountOperator = (function () {
+    function RefCountOperator(connectable) {
+        this.connectable = connectable;
+    }
+    RefCountOperator.prototype.call = function (subscriber, source) {
+        var connectable = this.connectable;
+        connectable._refCount++;
+        var refCounter = new RefCountSubscriber(subscriber, connectable);
+        var subscription = source.subscribe(refCounter);
+        if (!refCounter.closed) {
+            refCounter.connection = connectable.connect();
+        }
+        return subscription;
+    };
+    return RefCountOperator;
+}());
+var RefCountSubscriber = (function (_super) {
+    __extends(RefCountSubscriber, _super);
+    function RefCountSubscriber(destination, connectable) {
+        _super.call(this, destination);
+        this.connectable = connectable;
+    }
+    RefCountSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (!connectable) {
+            this.connection = null;
+            return;
+        }
+        this.connectable = null;
+        var refCount = connectable._refCount;
+        if (refCount <= 0) {
+            this.connection = null;
+            return;
+        }
+        connectable._refCount = refCount - 1;
+        if (refCount > 1) {
+            this.connection = null;
+            return;
+        }
+        ///
+        // Compare the local RefCountSubscriber's connection Subscription to the
+        // connection Subscription on the shared ConnectableObservable. In cases
+        // where the ConnectableObservable source synchronously emits values, and
+        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
+        // execution continues to here before the RefCountOperator has a chance to
+        // supply the RefCountSubscriber with the shared connection Subscription.
+        // For example:
+        // ```
+        // Observable.range(0, 10)
+        //   .publish()
+        //   .refCount()
+        //   .take(5)
+        //   .subscribe();
+        // ```
+        // In order to account for this case, RefCountSubscriber should only dispose
+        // the ConnectableObservable's shared connection Subscription if the
+        // connection Subscription exists, *and* either:
+        //   a. RefCountSubscriber doesn't have a reference to the shared connection
+        //      Subscription yet, or,
+        //   b. RefCountSubscriber's connection Subscription reference is identical
+        //      to the shared connection Subscription
+        ///
+        var connection = this.connection;
+        var sharedConnection = connectable._connection;
+        this.connection = null;
+        if (sharedConnection && (!connection || sharedConnection === connection)) {
+            sharedConnection.unsubscribe();
+        }
+    };
+    return RefCountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":36}],180:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Subscriber_1 = require('../Subscriber');
 /**
- * @param bufferSize
- * @param windowTime
- * @param scheduler
- * @return {ConnectableObservable<T>}
- * @method publishReplay
+ * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
+ * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given
+ * as a number parameter) rather than propagating the `error` call.
+ *
+ * <img src="./img/retry.png" width="100%">
+ *
+ * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted
+ * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second
+ * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications
+ * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].
+ * @param {number} count - Number of retry attempts before failing.
+ * @return {Observable} The source Observable modified with the retry logic.
+ * @method retry
  * @owner Observable
  */
-function publishReplay(bufferSize, windowTime, scheduler) {
-    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-    return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));
-}
-exports.publishReplay = publishReplay;
+function retry(count) {
+    if (count === void 0) { count = -1; }
+    return function (source) { return source.lift(new RetryOperator(count, source)); };
+}
+exports.retry = retry;
+var RetryOperator = (function () {
+    function RetryOperator(count, source) {
+        this.count = count;
+        this.source = source;
+    }
+    RetryOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
+    };
+    return RetryOperator;
+}());
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var RetrySubscriber = (function (_super) {
+    __extends(RetrySubscriber, _super);
+    function RetrySubscriber(destination, count, source) {
+        _super.call(this, destination);
+        this.count = count;
+        this.source = source;
+    }
+    RetrySubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var _a = this, source = _a.source, count = _a.count;
+            if (count === 0) {
+                return _super.prototype.error.call(this, err);
+            }
+            else if (count > -1) {
+                this.count = count - 1;
+            }
+            source.subscribe(this._unsubscribeAndRecycle());
+        }
+    };
+    return RetrySubscriber;
+}(Subscriber_1.Subscriber));
 
-},{"../ReplaySubject":32,"./multicast":130}],136:[function(require,module,exports){
+},{"../Subscriber":36}],181:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11367,7 +13234,7 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function sample(notifier) {
-    return this.lift(new SampleOperator(notifier));
+    return function (source) { return source.lift(new SampleOperator(notifier)); };
 }
 exports.sample = sample;
 var SampleOperator = (function () {
@@ -11412,7 +13279,7 @@ var SampleSubscriber = (function (_super) {
     return SampleSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],137:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],182:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11468,7 +13335,9 @@ function scan(accumulator, seed) {
     if (arguments.length >= 2) {
         hasSeed = true;
     }
-    return this.lift(new ScanOperator(accumulator, seed, hasSeed));
+    return function scanOperatorFunction(source) {
+        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
+    };
 }
 exports.scan = scan;
 var ScanOperator = (function () {
@@ -11532,9 +13401,10 @@ var ScanSubscriber = (function (_super) {
     return ScanSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],138:[function(require,module,exports){
+},{"../Subscriber":36}],183:[function(require,module,exports){
 "use strict";
 var multicast_1 = require('./multicast');
+var refCount_1 = require('./refCount');
 var Subject_1 = require('../Subject');
 function shareSubjectFactory() {
     return new Subject_1.Subject();
@@ -11543,7 +13413,7 @@ function shareSubjectFactory() {
  * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
  * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
  * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for .publish().refCount().
+ * This is an alias for .multicast(() => new Subject()).refCount().
  *
  * <img src="./img/share.png" width="100%">
  *
@@ -11552,12 +13422,12 @@ function shareSubjectFactory() {
  * @owner Observable
  */
 function share() {
-    return multicast_1.multicast.call(this, shareSubjectFactory).refCount();
+    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
 }
 exports.share = share;
 ;
 
-},{"../Subject":34,"./multicast":130}],139:[function(require,module,exports){
+},{"../Subject":34,"./multicast":173,"./refCount":179}],184:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11577,7 +13447,7 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function skip(count) {
-    return this.lift(new SkipOperator(count));
+    return function (source) { return source.lift(new SkipOperator(count)); };
 }
 exports.skip = skip;
 var SkipOperator = (function () {
@@ -11609,7 +13479,7 @@ var SkipSubscriber = (function (_super) {
     return SkipSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],140:[function(require,module,exports){
+},{"../Subscriber":36}],185:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11631,7 +13501,7 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function skipUntil(notifier) {
-    return this.lift(new SkipUntilOperator(notifier));
+    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
 }
 exports.skipUntil = skipUntil;
 var SkipUntilOperator = (function () {
@@ -11681,7 +13551,7 @@ var SkipUntilSubscriber = (function (_super) {
     return SkipUntilSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],141:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],186:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11702,7 +13572,7 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function skipWhile(predicate) {
-    return this.lift(new SkipWhileOperator(predicate));
+    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
 }
 exports.skipWhile = skipWhile;
 var SkipWhileOperator = (function () {
@@ -11748,12 +13618,12 @@ var SkipWhileSubscriber = (function (_super) {
     return SkipWhileSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],142:[function(require,module,exports){
+},{"../Subscriber":36}],187:[function(require,module,exports){
 "use strict";
 var ArrayObservable_1 = require('../observable/ArrayObservable');
 var ScalarObservable_1 = require('../observable/ScalarObservable');
 var EmptyObservable_1 = require('../observable/EmptyObservable');
-var concat_1 = require('./concat');
+var concat_1 = require('../observable/concat');
 var isScheduler_1 = require('../util/isScheduler');
 /* tslint:enable:max-line-length */
 /**
@@ -11775,27 +13645,29 @@ function startWith() {
     for (var _i = 0; _i < arguments.length; _i++) {
         array[_i - 0] = arguments[_i];
     }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
-    }
-    else {
-        scheduler = null;
-    }
-    var len = array.length;
-    if (len === 1) {
-        return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);
-    }
-    else if (len > 1) {
-        return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);
-    }
-    else {
-        return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);
-    }
+    return function (source) {
+        var scheduler = array[array.length - 1];
+        if (isScheduler_1.isScheduler(scheduler)) {
+            array.pop();
+        }
+        else {
+            scheduler = null;
+        }
+        var len = array.length;
+        if (len === 1) {
+            return concat_1.concat(new ScalarObservable_1.ScalarObservable(array[0], scheduler), source);
+        }
+        else if (len > 1) {
+            return concat_1.concat(new ArrayObservable_1.ArrayObservable(array, scheduler), source);
+        }
+        else {
+            return concat_1.concat(new EmptyObservable_1.EmptyObservable(scheduler), source);
+        }
+    };
 }
 exports.startWith = startWith;
 
-},{"../observable/ArrayObservable":88,"../observable/EmptyObservable":91,"../observable/ScalarObservable":97,"../util/isScheduler":175,"./concat":115}],143:[function(require,module,exports){
+},{"../observable/ArrayObservable":90,"../observable/EmptyObservable":93,"../observable/ScalarObservable":99,"../observable/concat":102,"../util/isScheduler":224}],188:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11853,7 +13725,9 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function switchMap(project, resultSelector) {
-    return this.lift(new SwitchMapOperator(project, resultSelector));
+    return function switchMapOperatorFunction(source) {
+        return source.lift(new SwitchMapOperator(project, resultSelector));
+    };
 }
 exports.switchMap = switchMap;
 var SwitchMapOperator = (function () {
@@ -11936,7 +13810,7 @@ var SwitchMapSubscriber = (function (_super) {
     return SwitchMapSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],144:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],189:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -11980,12 +13854,14 @@ var EmptyObservable_1 = require('../observable/EmptyObservable');
  * @owner Observable
  */
 function take(count) {
-    if (count === 0) {
-        return new EmptyObservable_1.EmptyObservable();
-    }
-    else {
-        return this.lift(new TakeOperator(count));
-    }
+    return function (source) {
+        if (count === 0) {
+            return new EmptyObservable_1.EmptyObservable();
+        }
+        else {
+            return source.lift(new TakeOperator(count));
+        }
+    };
 }
 exports.take = take;
 var TakeOperator = (function () {
@@ -12026,7 +13902,7 @@ var TakeSubscriber = (function (_super) {
     return TakeSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../observable/EmptyObservable":91,"../util/ArgumentOutOfRangeError":162}],145:[function(require,module,exports){
+},{"../Subscriber":36,"../observable/EmptyObservable":93,"../util/ArgumentOutOfRangeError":209}],190:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12069,7 +13945,7 @@ var subscribeToResult_1 = require('../util/subscribeToResult');
  * @owner Observable
  */
 function takeUntil(notifier) {
-    return this.lift(new TakeUntilOperator(notifier));
+    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
 }
 exports.takeUntil = takeUntil;
 var TakeUntilOperator = (function () {
@@ -12102,7 +13978,7 @@ var TakeUntilSubscriber = (function (_super) {
     return TakeUntilSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],146:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],191:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12147,7 +14023,7 @@ var Subscriber_1 = require('../Subscriber');
  * @owner Observable
  */
 function takeWhile(predicate) {
-    return this.lift(new TakeWhileOperator(predicate));
+    return function (source) { return source.lift(new TakeWhileOperator(predicate)); };
 }
 exports.takeWhile = takeWhile;
 var TakeWhileOperator = (function () {
@@ -12195,7 +14071,121 @@ var TakeWhileSubscriber = (function (_super) {
     return TakeWhileSubscriber;
 }(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],147:[function(require,module,exports){
+},{"../Subscriber":36}],192:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Subscriber_1 = require('../Subscriber');
+/* tslint:enable:max-line-length */
+/**
+ * Perform a side effect for every emission on the source Observable, but return
+ * an Observable that is identical to the source.
+ *
+ * <span class="informal">Intercepts each emission on the source and runs a
+ * function, but returns an output which is identical to the source as long as errors don't occur.</span>
+ *
+ * <img src="./img/do.png" width="100%">
+ *
+ * Returns a mirrored Observable of the source Observable, but modified so that
+ * the provided Observer is called to perform a side effect for every value,
+ * error, and completion emitted by the source. Any errors that are thrown in
+ * the aforementioned Observer or handlers are safely sent down the error path
+ * of the output Observable.
+ *
+ * This operator is useful for debugging your Observables for the correct values
+ * or performing other side effects.
+ *
+ * Note: this is different to a `subscribe` on the Observable. If the Observable
+ * returned by `do` is not subscribed, the side effects specified by the
+ * Observer will never happen. `do` therefore simply spies on existing
+ * execution, it does not trigger an execution to happen like `subscribe` does.
+ *
+ * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>
+ * var clicks = Rx.Observable.fromEvent(document, 'click');
+ * var positions = clicks
+ *   .do(ev => console.log(ev))
+ *   .map(ev => ev.clientX);
+ * positions.subscribe(x => console.log(x));
+ *
+ * @see {@link map}
+ * @see {@link subscribe}
+ *
+ * @param {Observer|function} [nextOrObserver] A normal Observer object or a
+ * callback for `next`.
+ * @param {function} [error] Callback for errors in the source.
+ * @param {function} [complete] Callback for the completion of the source.
+ * @return {Observable} An Observable identical to the source, but runs the
+ * specified Observer or callback(s) for each item.
+ * @name tap
+ */
+function tap(nextOrObserver, error, complete) {
+    return function tapOperatorFunction(source) {
+        return source.lift(new DoOperator(nextOrObserver, error, complete));
+    };
+}
+exports.tap = tap;
+var DoOperator = (function () {
+    function DoOperator(nextOrObserver, error, complete) {
+        this.nextOrObserver = nextOrObserver;
+        this.error = error;
+        this.complete = complete;
+    }
+    DoOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
+    };
+    return DoOperator;
+}());
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var DoSubscriber = (function (_super) {
+    __extends(DoSubscriber, _super);
+    function DoSubscriber(destination, nextOrObserver, error, complete) {
+        _super.call(this, destination);
+        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);
+        safeSubscriber.syncErrorThrowable = true;
+        this.add(safeSubscriber);
+        this.safeSubscriber = safeSubscriber;
+    }
+    DoSubscriber.prototype._next = function (value) {
+        var safeSubscriber = this.safeSubscriber;
+        safeSubscriber.next(value);
+        if (safeSubscriber.syncErrorThrown) {
+            this.destination.error(safeSubscriber.syncErrorValue);
+        }
+        else {
+            this.destination.next(value);
+        }
+    };
+    DoSubscriber.prototype._error = function (err) {
+        var safeSubscriber = this.safeSubscriber;
+        safeSubscriber.error(err);
+        if (safeSubscriber.syncErrorThrown) {
+            this.destination.error(safeSubscriber.syncErrorValue);
+        }
+        else {
+            this.destination.error(err);
+        }
+    };
+    DoSubscriber.prototype._complete = function () {
+        var safeSubscriber = this.safeSubscriber;
+        safeSubscriber.complete();
+        if (safeSubscriber.syncErrorThrown) {
+            this.destination.error(safeSubscriber.syncErrorValue);
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    return DoSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":36}],193:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12250,7 +14240,7 @@ exports.defaultThrottleConfig = {
  */
 function throttle(durationSelector, config) {
     if (config === void 0) { config = exports.defaultThrottleConfig; }
-    return this.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing));
+    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
 }
 exports.throttle = throttle;
 var ThrottleOperator = (function () {
@@ -12338,7 +14328,7 @@ var ThrottleSubscriber = (function (_super) {
     return ThrottleSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],148:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],194:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12390,7 +14380,7 @@ var throttle_1 = require('./throttle');
 function throttleTime(duration, scheduler, config) {
     if (scheduler === void 0) { scheduler = async_1.async; }
     if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
-    return this.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));
+    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
 }
 exports.throttleTime = throttleTime;
 var ThrottleTimeOperator = (function () {
@@ -12455,7 +14445,149 @@ function dispatchNext(arg) {
     subscriber.clearThrottle();
 }
 
-},{"../Subscriber":36,"../scheduler/async":156,"./throttle":147}],149:[function(require,module,exports){
+},{"../Subscriber":36,"../scheduler/async":203,"./throttle":193}],195:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var async_1 = require('../scheduler/async');
+var isDate_1 = require('../util/isDate');
+var Subscriber_1 = require('../Subscriber');
+var TimeoutError_1 = require('../util/TimeoutError');
+/**
+ *
+ * Errors if Observable does not emit a value in given time span.
+ *
+ * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
+ *
+ * <img src="./img/timeout.png" width="100%">
+ *
+ * `timeout` operator accepts as an argument either a number or a Date.
+ *
+ * If number was provided, it returns an Observable that behaves like a source
+ * Observable, unless there is a period of time where there is no value emitted.
+ * So if you provide `100` as argument and first value comes after 50ms from
+ * the moment of subscription, this value will be simply re-emitted by the resulting
+ * Observable. If however after that 100ms passes without a second value being emitted,
+ * stream will end with an error and source Observable will be unsubscribed.
+ * These checks are performed throughout whole lifecycle of Observable - from the moment
+ * it was subscribed to, until it completes or errors itself. Thus every value must be
+ * emitted within specified period since previous value.
+ *
+ * If provided argument was Date, returned Observable behaves differently. It throws
+ * if Observable did not complete before provided Date. This means that periods between
+ * emission of particular values do not matter in this case. If Observable did not complete
+ * before provided Date, source Observable will be unsubscribed. Other than that, resulting
+ * stream behaves just as source Observable.
+ *
+ * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)
+ * when returned Observable will check if source stream emitted value or completed.
+ *
+ * @example <caption>Check if ticks are emitted within certain timespan</caption>
+ * const seconds = Rx.Observable.interval(1000);
+ *
+ * seconds.timeout(1100) // Let's use bigger timespan to be safe,
+ *                       // since `interval` might fire a bit later then scheduled.
+ * .subscribe(
+ *     value => console.log(value), // Will emit numbers just as regular `interval` would.
+ *     err => console.log(err) // Will never be called.
+ * );
+ *
+ * seconds.timeout(900).subscribe(
+ *     value => console.log(value), // Will never be called.
+ *     err => console.log(err) // Will emit error before even first value is emitted,
+ *                             // since it did not arrive within 900ms period.
+ * );
+ *
+ * @example <caption>Use Date to check if Observable completed</caption>
+ * const seconds = Rx.Observable.interval(1000);
+ *
+ * seconds.timeout(new Date("December 17, 2020 03:24:00"))
+ * .subscribe(
+ *     value => console.log(value), // Will emit values as regular `interval` would
+ *                                  // until December 17, 2020 at 03:24:00.
+ *     err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error,
+ *                             // since Observable did not complete by then.
+ * );
+ *
+ * @see {@link timeoutWith}
+ *
+ * @param {number|Date} due Number specifying period within which Observable must emit values
+ *                          or Date specifying before when Observable should complete
+ * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur.
+ * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.
+ * @method timeout
+ * @owner Observable
+ */
+function timeout(due, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    var absoluteTimeout = isDate_1.isDate(due);
+    var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
+    return function (source) { return source.lift(new TimeoutOperator(waitFor, absoluteTimeout, scheduler, new TimeoutError_1.TimeoutError())); };
+}
+exports.timeout = timeout;
+var TimeoutOperator = (function () {
+    function TimeoutOperator(waitFor, absoluteTimeout, scheduler, errorInstance) {
+        this.waitFor = waitFor;
+        this.absoluteTimeout = absoluteTimeout;
+        this.scheduler = scheduler;
+        this.errorInstance = errorInstance;
+    }
+    TimeoutOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TimeoutSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.scheduler, this.errorInstance));
+    };
+    return TimeoutOperator;
+}());
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+var TimeoutSubscriber = (function (_super) {
+    __extends(TimeoutSubscriber, _super);
+    function TimeoutSubscriber(destination, absoluteTimeout, waitFor, scheduler, errorInstance) {
+        _super.call(this, destination);
+        this.absoluteTimeout = absoluteTimeout;
+        this.waitFor = waitFor;
+        this.scheduler = scheduler;
+        this.errorInstance = errorInstance;
+        this.action = null;
+        this.scheduleTimeout();
+    }
+    TimeoutSubscriber.dispatchTimeout = function (subscriber) {
+        subscriber.error(subscriber.errorInstance);
+    };
+    TimeoutSubscriber.prototype.scheduleTimeout = function () {
+        var action = this.action;
+        if (action) {
+            // Recycle the action if we've already scheduled one. All the production
+            // Scheduler Actions mutate their state/delay time and return themeselves.
+            // VirtualActions are immutable, so they create and return a clone. In this
+            // case, we need to set the action reference to the most recent VirtualAction,
+            // to ensure that's the one we clone from next time.
+            this.action = action.schedule(this, this.waitFor);
+        }
+        else {
+            this.add(this.action = this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout, this.waitFor, this));
+        }
+    };
+    TimeoutSubscriber.prototype._next = function (value) {
+        if (!this.absoluteTimeout) {
+            this.scheduleTimeout();
+        }
+        _super.prototype._next.call(this, value);
+    };
+    TimeoutSubscriber.prototype._unsubscribe = function () {
+        this.action = null;
+        this.scheduler = null;
+        this.errorInstance = null;
+    };
+    return TimeoutSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":36,"../scheduler/async":203,"../util/TimeoutError":213,"../util/isDate":219}],196:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12508,12 +14640,14 @@ function withLatestFrom() {
     for (var _i = 0; _i < arguments.length; _i++) {
         args[_i - 0] = arguments[_i];
     }
-    var project;
-    if (typeof args[args.length - 1] === 'function') {
-        project = args.pop();
-    }
-    var observables = args;
-    return this.lift(new WithLatestFromOperator(observables, project));
+    return function (source) {
+        var project;
+        if (typeof args[args.length - 1] === 'function') {
+            project = args.pop();
+        }
+        var observables = args;
+        return source.lift(new WithLatestFromOperator(observables, project));
+    };
 }
 exports.withLatestFrom = withLatestFrom;
 var WithLatestFromOperator = (function () {
@@ -12586,7 +14720,7 @@ var WithLatestFromSubscriber = (function (_super) {
     return WithLatestFromSubscriber;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],150:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],197:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12606,14 +14740,16 @@ var iterator_1 = require('../symbol/iterator');
  * @method zip
  * @owner Observable
  */
-function zipProto() {
+function zip() {
     var observables = [];
     for (var _i = 0; _i < arguments.length; _i++) {
         observables[_i - 0] = arguments[_i];
     }
-    return this.lift.call(zipStatic.apply(void 0, [this].concat(observables)));
+    return function zipOperatorFunction(source) {
+        return source.lift.call(zipStatic.apply(void 0, [source].concat(observables)));
+    };
 }
-exports.zipProto = zipProto;
+exports.zip = zip;
 /* tslint:enable:max-line-length */
 /**
  * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
@@ -12866,7 +15002,7 @@ var ZipBufferIterator = (function (_super) {
     return ZipBufferIterator;
 }(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":88,"../symbol/iterator":158,"../util/isArray":168,"../util/subscribeToResult":177}],151:[function(require,module,exports){
+},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":90,"../symbol/iterator":205,"../util/isArray":217,"../util/subscribeToResult":228}],198:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -12911,7 +15047,7 @@ var Action = (function (_super) {
 }(Subscription_1.Subscription));
 exports.Action = Action;
 
-},{"../Subscription":37}],152:[function(require,module,exports){
+},{"../Subscription":37}],199:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13054,7 +15190,7 @@ var AsyncAction = (function (_super) {
 }(Action_1.Action));
 exports.AsyncAction = AsyncAction;
 
-},{"../util/root":176,"./Action":151}],153:[function(require,module,exports){
+},{"../util/root":227,"./Action":198}],200:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13106,7 +15242,7 @@ var AsyncScheduler = (function (_super) {
 }(Scheduler_1.Scheduler));
 exports.AsyncScheduler = AsyncScheduler;
 
-},{"../Scheduler":33}],154:[function(require,module,exports){
+},{"../Scheduler":33}],201:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13156,7 +15292,7 @@ var QueueAction = (function (_super) {
 }(AsyncAction_1.AsyncAction));
 exports.QueueAction = QueueAction;
 
-},{"./AsyncAction":152}],155:[function(require,module,exports){
+},{"./AsyncAction":199}],202:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13173,7 +15309,7 @@ var QueueScheduler = (function (_super) {
 }(AsyncScheduler_1.AsyncScheduler));
 exports.QueueScheduler = QueueScheduler;
 
-},{"./AsyncScheduler":153}],156:[function(require,module,exports){
+},{"./AsyncScheduler":200}],203:[function(require,module,exports){
 "use strict";
 var AsyncAction_1 = require('./AsyncAction');
 var AsyncScheduler_1 = require('./AsyncScheduler');
@@ -13221,7 +15357,7 @@ var AsyncScheduler_1 = require('./AsyncScheduler');
  */
 exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
 
-},{"./AsyncAction":152,"./AsyncScheduler":153}],157:[function(require,module,exports){
+},{"./AsyncAction":199,"./AsyncScheduler":200}],204:[function(require,module,exports){
 "use strict";
 var QueueAction_1 = require('./QueueAction');
 var QueueScheduler_1 = require('./QueueScheduler');
@@ -13288,7 +15424,7 @@ var QueueScheduler_1 = require('./QueueScheduler');
  */
 exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
 
-},{"./QueueAction":154,"./QueueScheduler":155}],158:[function(require,module,exports){
+},{"./QueueAction":201,"./QueueScheduler":202}],205:[function(require,module,exports){
 "use strict";
 var root_1 = require('../util/root');
 function symbolIteratorPonyfill(root) {
@@ -13327,7 +15463,7 @@ exports.iterator = symbolIteratorPonyfill(root_1.root);
  */
 exports.$$iterator = exports.iterator;
 
-},{"../util/root":176}],159:[function(require,module,exports){
+},{"../util/root":227}],206:[function(require,module,exports){
 "use strict";
 var root_1 = require('../util/root');
 function getSymbolObservable(context) {
@@ -13354,7 +15490,7 @@ exports.observable = getSymbolObservable(root_1.root);
  */
 exports.$$observable = exports.observable;
 
-},{"../util/root":176}],160:[function(require,module,exports){
+},{"../util/root":227}],207:[function(require,module,exports){
 "use strict";
 var root_1 = require('../util/root');
 var Symbol = root_1.root.Symbol;
@@ -13365,7 +15501,7 @@ exports.rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'f
  */
 exports.$$rxSubscriber = exports.rxSubscriber;
 
-},{"../util/root":176}],161:[function(require,module,exports){
+},{"../util/root":227}],208:[function(require,module,exports){
 "use strict";
 var root_1 = require('./root');
 var RequestAnimationFrameDefinition = (function () {
@@ -13400,7 +15536,7 @@ var RequestAnimationFrameDefinition = (function () {
 exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition;
 exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root);
 
-},{"./root":176}],162:[function(require,module,exports){
+},{"./root":227}],209:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13429,7 +15565,7 @@ var ArgumentOutOfRangeError = (function (_super) {
 }(Error));
 exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
 
-},{}],163:[function(require,module,exports){
+},{}],210:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13458,7 +15594,7 @@ var EmptyError = (function (_super) {
 }(Error));
 exports.EmptyError = EmptyError;
 
-},{}],164:[function(require,module,exports){
+},{}],211:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13486,7 +15622,7 @@ var ObjectUnsubscribedError = (function (_super) {
 }(Error));
 exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
 
-},{}],165:[function(require,module,exports){
+},{}],212:[function(require,module,exports){
 "use strict";
 var root_1 = require('./root');
 function minimalSetImpl() {
@@ -13520,7 +15656,33 @@ function minimalSetImpl() {
 exports.minimalSetImpl = minimalSetImpl;
 exports.Set = root_1.root.Set || minimalSetImpl();
 
-},{"./root":176}],166:[function(require,module,exports){
+},{"./root":227}],213:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+/**
+ * An error thrown when duetime elapses.
+ *
+ * @see {@link timeout}
+ *
+ * @class TimeoutError
+ */
+var TimeoutError = (function (_super) {
+    __extends(TimeoutError, _super);
+    function TimeoutError() {
+        var err = _super.call(this, 'Timeout has occurred');
+        this.name = err.name = 'TimeoutError';
+        this.stack = err.stack;
+        this.message = err.message;
+    }
+    return TimeoutError;
+}(Error));
+exports.TimeoutError = TimeoutError;
+
+},{}],214:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || function (d, b) {
     for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
@@ -13546,34 +15708,41 @@ var UnsubscriptionError = (function (_super) {
 }(Error));
 exports.UnsubscriptionError = UnsubscriptionError;
 
-},{}],167:[function(require,module,exports){
+},{}],215:[function(require,module,exports){
 "use strict";
 // typeof any so that it we don't have to cast when comparing a result to the error object
 exports.errorObject = { e: {} };
 
-},{}],168:[function(require,module,exports){
+},{}],216:[function(require,module,exports){
+"use strict";
+function identity(x) {
+    return x;
+}
+exports.identity = identity;
+
+},{}],217:[function(require,module,exports){
 "use strict";
 exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
 
-},{}],169:[function(require,module,exports){
+},{}],218:[function(require,module,exports){
 "use strict";
 exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; });
 
-},{}],170:[function(require,module,exports){
+},{}],219:[function(require,module,exports){
 "use strict";
 function isDate(value) {
     return value instanceof Date && !isNaN(+value);
 }
 exports.isDate = isDate;
 
-},{}],171:[function(require,module,exports){
+},{}],220:[function(require,module,exports){
 "use strict";
 function isFunction(x) {
     return typeof x === 'function';
 }
 exports.isFunction = isFunction;
 
-},{}],172:[function(require,module,exports){
+},{}],221:[function(require,module,exports){
 "use strict";
 var isArray_1 = require('../util/isArray');
 function isNumeric(val) {
@@ -13586,28 +15755,60 @@ function isNumeric(val) {
 exports.isNumeric = isNumeric;
 ;
 
-},{"../util/isArray":168}],173:[function(require,module,exports){
+},{"../util/isArray":217}],222:[function(require,module,exports){
 "use strict";
 function isObject(x) {
     return x != null && typeof x === 'object';
 }
 exports.isObject = isObject;
 
-},{}],174:[function(require,module,exports){
+},{}],223:[function(require,module,exports){
 "use strict";
 function isPromise(value) {
     return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
 }
 exports.isPromise = isPromise;
 
-},{}],175:[function(require,module,exports){
+},{}],224:[function(require,module,exports){
 "use strict";
 function isScheduler(value) {
     return value && typeof value.schedule === 'function';
 }
 exports.isScheduler = isScheduler;
 
-},{}],176:[function(require,module,exports){
+},{}],225:[function(require,module,exports){
+"use strict";
+/* tslint:disable:no-empty */
+function noop() { }
+exports.noop = noop;
+
+},{}],226:[function(require,module,exports){
+"use strict";
+var noop_1 = require('./noop');
+/* tslint:enable:max-line-length */
+function pipe() {
+    var fns = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        fns[_i - 0] = arguments[_i];
+    }
+    return pipeFromArray(fns);
+}
+exports.pipe = pipe;
+/* @internal */
+function pipeFromArray(fns) {
+    if (!fns) {
+        return noop_1.noop;
+    }
+    if (fns.length === 1) {
+        return fns[0];
+    }
+    return function piped(input) {
+        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
+    };
+}
+exports.pipeFromArray = pipeFromArray;
+
+},{"./noop":225}],227:[function(require,module,exports){
 (function (global){
 "use strict";
 // CommonJS / Node have global context exposed as "global" variable.
@@ -13630,7 +15831,7 @@ exports.root = _root;
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 
-},{}],177:[function(require,module,exports){
+},{}],228:[function(require,module,exports){
 "use strict";
 var root_1 = require('./root');
 var isArrayLike_1 = require('./isArrayLike');
@@ -13652,6 +15853,7 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {
             return null;
         }
         else {
+            destination.syncErrorThrowable = true;
             return result.subscribe(destination);
         }
     }
@@ -13709,7 +15911,7 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {
 }
 exports.subscribeToResult = subscribeToResult;
 
-},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":158,"../symbol/observable":159,"./isArrayLike":169,"./isObject":173,"./isPromise":174,"./root":176}],178:[function(require,module,exports){
+},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":205,"../symbol/observable":206,"./isArrayLike":218,"./isObject":222,"./isPromise":223,"./root":227}],229:[function(require,module,exports){
 "use strict";
 var Subscriber_1 = require('../Subscriber');
 var rxSubscriber_1 = require('../symbol/rxSubscriber');
@@ -13730,7 +15932,7 @@ function toSubscriber(nextOrObserver, error, complete) {
 }
 exports.toSubscriber = toSubscriber;
 
-},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":160}],179:[function(require,module,exports){
+},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":207}],230:[function(require,module,exports){
 "use strict";
 var errorObject_1 = require('./errorObject');
 var tryCatchTarget;
@@ -13750,883 +15952,907 @@ function tryCatch(fn) {
 exports.tryCatch = tryCatch;
 ;
 
-},{"./errorObject":167}],180:[function(require,module,exports){
+},{"./errorObject":215}],231:[function(require,module,exports){
 // threejs.org/license
-(function(l,xa){"object"===typeof exports&&"undefined"!==typeof module?xa(exports):"function"===typeof define&&define.amd?define(["exports"],xa):xa(l.THREE=l.THREE||{})})(this,function(l){function xa(){}function C(a,b){this.x=a||0;this.y=b||0}function ba(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:hf++});this.uuid=Y.generateUUID();this.name="";this.image=void 0!==a?a:ba.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ba.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=
-void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function fa(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Cb(a,b,c){this.uuid=Y.generateUUID();this.width=
-a;this.height=b;this.scissor=new fa(0,0,a,b);this.scissorTest=!1;this.viewport=new fa(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ba(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Db(a,b,c){Cb.call(this,a,b,c);this.activeMipMapLevel=
-this.activeCubeFace=0}function oa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function db(a,b,c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==
-m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Xa(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];ba.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Eb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=xe[e];void 0===f&&(f=new Float32Array(e),xe[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function ye(a,b){var c=ze[b];void 0===c&&(c=new Int32Array(b),ze[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}
-function jf(a,b){a.uniform1f(this.addr,b)}function kf(a,b){a.uniform1i(this.addr,b)}function lf(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function mf(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function nf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function of(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function pf(a,b){void 0===b.elements?
-a.uniformMatrix3fv(this.addr,!1,b):(Ae.set(b.elements),a.uniformMatrix3fv(this.addr,!1,Ae))}function qf(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Be.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Be))}function rf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||Ce,d)}function sf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||De,d)}function Ee(a,b){a.uniform2iv(this.addr,b)}function Fe(a,b){a.uniform3iv(this.addr,b)}function Ge(a,
-b){a.uniform4iv(this.addr,b)}function tf(a){switch(a){case 5126:return jf;case 35664:return lf;case 35665:return mf;case 35666:return nf;case 35674:return of;case 35675:return pf;case 35676:return qf;case 35678:case 36198:return rf;case 35680:return sf;case 5124:case 35670:return kf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function uf(a,b){a.uniform1fv(this.addr,b)}function vf(a,b){a.uniform1iv(this.addr,b)}function wf(a,b){a.uniform2fv(this.addr,
-Eb(b,this.size,2))}function xf(a,b){a.uniform3fv(this.addr,Eb(b,this.size,3))}function yf(a,b){a.uniform4fv(this.addr,Eb(b,this.size,4))}function zf(a,b){a.uniformMatrix2fv(this.addr,!1,Eb(b,this.size,4))}function Af(a,b){a.uniformMatrix3fv(this.addr,!1,Eb(b,this.size,9))}function Bf(a,b){a.uniformMatrix4fv(this.addr,!1,Eb(b,this.size,16))}function Cf(a,b,c){var d=b.length,e=ye(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||Ce,e[a])}function Df(a,b,c){var d=b.length,e=ye(c,
-d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||De,e[a])}function Ef(a){switch(a){case 5126:return uf;case 35664:return wf;case 35665:return xf;case 35666:return yf;case 35674:return zf;case 35675:return Af;case 35676:return Bf;case 35678:return Cf;case 35680:return Df;case 5124:case 35670:return vf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function Ff(a,b,c){this.id=a;this.addr=c;this.setValue=tf(b.type)}function Gf(a,b,
-c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Ef(b.type)}function He(a){this.id=a;this.seq=[];this.map={}}function eb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(Pd.lastIndex=0;;){var m=Pd.exec(h),q=Pd.lastIndex,v=m[1],p=m[3];"]"===m[2]&&(v|=0);if(void 0===p||"["===p&&q+2===k){h=g;e=void 0===p?new Ff(v,e,f):new Gf(v,e,f);h.seq.push(e);
-h.map[e.id]=e;break}else p=g.map[v],void 0===p&&(p=new He(v),v=g,g=p,v.seq.push(g),v.map[g.id]=g),g=p}}}function G(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function fd(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function Hf(a,b){var c,d,e,f,g,h,k,m,q,v,p=a.context,r=a.state,l,t,y,x,u,H;this.render=function(w,I,W){if(0!==b.length){w=new n;var D=W.w/W.z,O=.5*W.z,aa=.5*W.w,F=16/W.w,ja=new C(F*D,F),T=new n(1,1,0),fb=new C(1,
-1),Ya=new fd;Ya.min.set(W.x,W.y);Ya.max.set(W.x+(W.z-16),W.y+(W.w-16));if(void 0===x){var F=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),ka=new Uint16Array([0,1,2,0,2,3]);l=p.createBuffer();t=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,l);p.bufferData(p.ARRAY_BUFFER,F,p.STATIC_DRAW);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);p.bufferData(p.ELEMENT_ARRAY_BUFFER,ka,p.STATIC_DRAW);u=p.createTexture();H=p.createTexture();r.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGB,16,16,0,
-p.RGB,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);r.bindTexture(p.TEXTURE_2D,H);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,16,16,0,p.RGBA,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);
-p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);var F=y={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
-fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},ka=p.createProgram(),P=p.createShader(p.FRAGMENT_SHADER),
-M=p.createShader(p.VERTEX_SHADER),V="precision "+a.getPrecision()+" float;\n";p.shaderSource(P,V+F.fragmentShader);p.shaderSource(M,V+F.vertexShader);p.compileShader(P);p.compileShader(M);p.attachShader(ka,P);p.attachShader(ka,M);p.linkProgram(ka);x=ka;q=p.getAttribLocation(x,"position");v=p.getAttribLocation(x,"uv");c=p.getUniformLocation(x,"renderType");d=p.getUniformLocation(x,"map");e=p.getUniformLocation(x,"occlusionMap");f=p.getUniformLocation(x,"opacity");g=p.getUniformLocation(x,"color");
-h=p.getUniformLocation(x,"scale");k=p.getUniformLocation(x,"rotation");m=p.getUniformLocation(x,"screenPosition")}p.useProgram(x);r.initAttributes();r.enableAttribute(q);r.enableAttribute(v);r.disableUnusedAttributes();p.uniform1i(e,0);p.uniform1i(d,1);p.bindBuffer(p.ARRAY_BUFFER,l);p.vertexAttribPointer(q,2,p.FLOAT,!1,16,0);p.vertexAttribPointer(v,2,p.FLOAT,!1,16,8);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);r.disable(p.CULL_FACE);r.buffers.depth.setMask(!1);ka=0;for(P=b.length;ka<P;ka++)if(F=16/W.w,
-ja.set(F*D,F),M=b[ka],w.set(M.matrixWorld.elements[12],M.matrixWorld.elements[13],M.matrixWorld.elements[14]),w.applyMatrix4(I.matrixWorldInverse),w.applyMatrix4(I.projectionMatrix),T.copy(w),fb.x=W.x+T.x*O+O-8,fb.y=W.y+T.y*aa+aa-8,!0===Ya.containsPoint(fb)){r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,null);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGB,fb.x,fb.y,16,16,0);p.uniform1i(c,0);p.uniform2f(h,ja.x,ja.y);p.uniform3f(m,T.x,T.y,T.z);
-r.disable(p.BLEND);r.enable(p.DEPTH_TEST);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,H);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGBA,fb.x,fb.y,16,16,0);p.uniform1i(c,1);r.disable(p.DEPTH_TEST);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);M.positionScreen.copy(T);M.customUpdateCallback?M.customUpdateCallback(M):M.updateLensFlares();p.uniform1i(c,2);r.enable(p.BLEND);for(var V=0,pa=M.lensFlares.length;V<
-pa;V++){var S=M.lensFlares[V];.001<S.opacity&&.001<S.scale&&(T.x=S.x,T.y=S.y,T.z=S.z,F=S.size*S.scale/W.w,ja.x=F*D,ja.y=F,p.uniform3f(m,T.x,T.y,T.z),p.uniform2f(h,ja.x,ja.y),p.uniform1f(k,S.rotation),p.uniform1f(f,S.opacity),p.uniform3f(g,S.color.r,S.color.g,S.color.b),r.setBlending(S.blending,S.blendEquation,S.blendSrc,S.blendDst),a.setTexture2D(S.texture,1),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0))}}r.enable(p.CULL_FACE);r.enable(p.DEPTH_TEST);r.buffers.depth.setMask(!0);a.resetGLState()}}}
-function If(a,b){var c,d,e,f,g,h,k,m,q,v,p,r,l,t,y,x,u;function H(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var w=a.context,I=a.state,W,D,O,aa,F=new n,ja=new oa,T=new n;this.render=function(n,Ya){if(0!==b.length){if(void 0===O){var ka=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),P=new Uint16Array([0,1,2,0,2,3]);W=w.createBuffer();D=w.createBuffer();w.bindBuffer(w.ARRAY_BUFFER,W);w.bufferData(w.ARRAY_BUFFER,ka,w.STATIC_DRAW);
-w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.bufferData(w.ELEMENT_ARRAY_BUFFER,P,w.STATIC_DRAW);var ka=w.createProgram(),P=w.createShader(w.VERTEX_SHADER),M=w.createShader(w.FRAGMENT_SHADER);w.shaderSource(P,["precision "+a.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
-w.shaderSource(M,["precision "+a.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
-w.compileShader(P);w.compileShader(M);w.attachShader(ka,P);w.attachShader(ka,M);w.linkProgram(ka);O=ka;x=w.getAttribLocation(O,"position");u=w.getAttribLocation(O,"uv");c=w.getUniformLocation(O,"uvOffset");d=w.getUniformLocation(O,"uvScale");e=w.getUniformLocation(O,"rotation");f=w.getUniformLocation(O,"scale");g=w.getUniformLocation(O,"color");h=w.getUniformLocation(O,"map");k=w.getUniformLocation(O,"opacity");m=w.getUniformLocation(O,"modelViewMatrix");q=w.getUniformLocation(O,"projectionMatrix");
-v=w.getUniformLocation(O,"fogType");p=w.getUniformLocation(O,"fogDensity");r=w.getUniformLocation(O,"fogNear");l=w.getUniformLocation(O,"fogFar");t=w.getUniformLocation(O,"fogColor");y=w.getUniformLocation(O,"alphaTest");ka=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ka.width=8;ka.height=8;P=ka.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);aa=new ba(ka);aa.needsUpdate=!0}w.useProgram(O);I.initAttributes();I.enableAttribute(x);I.enableAttribute(u);I.disableUnusedAttributes();
-I.disable(w.CULL_FACE);I.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,W);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(u,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.uniformMatrix4fv(q,!1,Ya.projectionMatrix.elements);I.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ka=0;(M=n.fog)?(w.uniform3f(t,M.color.r,M.color.g,M.color.b),M.isFog?(w.uniform1f(r,M.near),w.uniform1f(l,M.far),w.uniform1i(v,1),P=ka=1):M.isFogExp2&&(w.uniform1f(p,M.density),w.uniform1i(v,2),P=ka=2)):
-(w.uniform1i(v,0),P=ka=0);for(var M=0,V=b.length;M<V;M++){var pa=b[M];pa.modelViewMatrix.multiplyMatrices(Ya.matrixWorldInverse,pa.matrixWorld);pa.z=-pa.modelViewMatrix.elements[14]}b.sort(H);for(var S=[],M=0,V=b.length;M<V;M++){var pa=b[M],N=pa.material;if(!1!==N.visible){pa.onBeforeRender(a,n,Ya,void 0,N,void 0);w.uniform1f(y,N.alphaTest);w.uniformMatrix4fv(m,!1,pa.modelViewMatrix.elements);pa.matrixWorld.decompose(F,ja,T);S[0]=T.x;S[1]=T.y;var C=0;n.fog&&N.fog&&(C=P);ka!==C&&(w.uniform1i(v,C),
-ka=C);null!==N.map?(w.uniform2f(c,N.map.offset.x,N.map.offset.y),w.uniform2f(d,N.map.repeat.x,N.map.repeat.y)):(w.uniform2f(c,0,0),w.uniform2f(d,1,1));w.uniform1f(k,N.opacity);w.uniform3f(g,N.color.r,N.color.g,N.color.b);w.uniform1f(e,N.rotation);w.uniform2fv(f,S);I.setBlending(N.blending,N.blendEquation,N.blendSrc,N.blendDst,N.blendEquationAlpha,N.blendSrcAlpha,N.blendDstAlpha,N.premultipliedAlpha);I.buffers.depth.setTest(N.depthTest);I.buffers.depth.setMask(N.depthWrite);N.map?a.setTexture2D(N.map,
-0):a.setTexture2D(aa,0);w.drawElements(w.TRIANGLES,6,w.UNSIGNED_SHORT,0);pa.onAfterRender(a,n,Ya,void 0,N,void 0)}}I.enable(w.CULL_FACE);a.resetGLState()}}}function U(){Object.defineProperty(this,"id",{value:Jf++});this.uuid=Y.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=
-null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.needsUpdate=this.visible=!0}function ra(a){U.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
-this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),
-this.setValues(a))}function Za(a){U.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Ra(a,b){this.min=void 0!==a?a:new n(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new n(-Infinity,-Infinity,-Infinity)}function Ea(a,b){this.center=void 0!==a?a:new n;this.radius=
-void 0!==b?b:0}function Ba(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function Aa(a,b){this.normal=void 0!==a?a:new n(1,0,0);this.constant=void 0!==b?b:0}function gd(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Aa,void 0!==b?b:new Aa,void 0!==c?c:new Aa,void 0!==d?d:new Aa,void 0!==e?e:new Aa,void 0!==f?f:new Aa]}function Ie(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=t;var h=b.customDepthMaterial;
-d&&(g=y,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length:f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=
-g.uuid,h=c.uuid,b=x[f],void 0===b&&(b={},x[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;F.renderSingleSided&&2==h&&(h=0);F.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth=c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(b,d,g,h){if(!1!==b.visible){if(b.layers.test(d.layers)&&
-(b.isMesh||b.isLine||b.isPoints)&&b.castShadow&&(!b.frustumCulled||k.intersectsObject(b))){b.modelViewMatrix.multiplyMatrices(g.matrixWorldInverse,b.matrixWorld);var m=c.update(b),p=b.material;if(Array.isArray(p))for(var q=m.groups,v=0,r=q.length;v<r;v++){var u=q[v],w=p[u.materialIndex];w&&w.visible&&(w=e(b,w,h,l),a.renderBufferDirect(g,null,m,w,b,u))}else p.visible&&(w=e(b,p,h,l),a.renderBufferDirect(g,null,m,w,b,null))}b=b.children;m=0;for(p=b.length;m<p;m++)f(b[m],d,g,h)}}var g=a.context,h=a.state,
-k=new gd,m=new K,q=b.shadows,v=new C,p=new C(d.maxTextureSize,d.maxTextureSize),r=new n,l=new n,t=Array(4),y=Array(4),x={},u=[new n(1,0,0),new n(-1,0,0),new n(0,0,1),new n(0,0,-1),new n(0,1,0),new n(0,-1,0)],H=[new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,0,1),new n(0,0,-1)],w=[new fa,new fa,new fa,new fa,new fa,new fa];b=new Za;b.depthPacking=3201;b.clipping=!0;d=$a.distanceRGBA;for(var I=Ca.clone(d.uniforms),W=0;4!==W;++W){var D=0!==(W&1),O=0!==(W&2),aa=b.clone();aa.morphTargets=
-D;aa.skinning=O;t[W]=aa;D=new ra({defines:{USE_SHADOWMAP:""},uniforms:I,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:D,skinning:O,clipping:!0});y[W]=D}var F=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,c){if(!1!==F.enabled&&(!1!==F.autoUpdate||!1!==F.needsUpdate)&&0!==q.length){h.disable(g.BLEND);h.buffers.color.setClear(1,1,1,1);h.buffers.depth.setTest(!0);h.setScissorTest(!1);
-for(var d,e=0,t=q.length;e<t;e++){var n=q[e];d=n.shadow;var y=n&&n.isPointLight;if(void 0===d)console.warn("THREE.WebGLShadowMap:",n,"has no shadow.");else{var x=d.camera;v.copy(d.mapSize);v.min(p);if(y){var D=v.x,I=v.y;w[0].set(2*D,I,D,I);w[1].set(0,I,D,I);w[2].set(3*D,I,D,I);w[3].set(D,I,D,I);w[4].set(3*D,0,D,I);w[5].set(D,0,D,I);v.x*=4;v.y*=2}null===d.map&&(d.map=new Cb(v.x,v.y,{minFilter:1003,magFilter:1003,format:1023}),d.map.texture.name=n.name+".shadowMap",x.updateProjectionMatrix());d.isSpotLightShadow&&
-d.update(n);D=d.map;I=d.matrix;l.setFromMatrixPosition(n.matrixWorld);x.position.copy(l);y?(d=6,I.makeTranslation(-l.x,-l.y,-l.z)):(d=1,r.setFromMatrixPosition(n.target.matrixWorld),x.lookAt(r),x.updateMatrixWorld(),I.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),I.multiply(x.projectionMatrix),I.multiply(x.matrixWorldInverse));a.setRenderTarget(D);a.clear();for(n=0;n<d;n++)y&&(r.copy(x.position),r.add(u[n]),x.up.copy(H[n]),x.lookAt(r),x.updateMatrixWorld(),h.viewport(w[n])),m.multiplyMatrices(x.projectionMatrix,
-x.matrixWorldInverse),k.setFromMatrix(m),f(b,c,x,y)}}e=a.getClearColor();t=a.getClearAlpha();a.setClearColor(e,t);F.needsUpdate=!1}}}function Kf(a){var b={};return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){var e=c.uuid,f=c,g=f.array,h=f.dynamic?
-a.DYNAMIC_DRAW:a.STATIC_DRAW,k=a.createBuffer();a.bindBuffer(d,k);a.bufferData(d,g,h);f.onUploadCallback();h=a.FLOAT;g instanceof Float32Array?h=a.FLOAT:g instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):g instanceof Uint16Array?h=a.UNSIGNED_SHORT:g instanceof Int16Array?h=a.SHORT:g instanceof Uint32Array?h=a.UNSIGNED_INT:g instanceof Int32Array?h=a.INT:g instanceof Int8Array?h=a.BYTE:g instanceof Uint8Array&&(h=a.UNSIGNED_BYTE);b[e]={buffer:k,
-type:h,bytesPerElement:g.BYTES_PER_ELEMENT,version:f.version}}else e.version<c.version&&(f=c,g=f.array,k=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic?a.bufferData(d,g,a.STATIC_DRAW):-1===k.count?a.bufferSubData(d,0,g):0===k.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(a.bufferSubData(d,k.offset*g.BYTES_PER_ELEMENT,g.subarray(k.offset,k.offset+
-k.count)),k.count=-1),e.version=c.version)}}}function ab(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||ab.DefaultOrder}function Qd(){this.mask=1}function z(){Object.defineProperty(this,"id",{value:Lf++});this.uuid=Y.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=z.DefaultUp.clone();var a=new n,b=new ab,c=new oa,d=new n(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,
-{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new K},normalMatrix:{value:new Ba}});this.matrix=new K;this.matrixWorld=new K;this.matrixAutoUpdate=z.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Qd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function Na(){z.call(this);this.type="Camera";this.matrixWorldInverse=
-new K;this.projectionMatrix=new K}function Fb(a,b,c,d,e,f){Na.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function qa(a,b,c,d){Na.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=
-0;this.updateProjectionMatrix()}function Sa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new n;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new G;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function J(){Object.defineProperty(this,"id",{value:Rd++});this.uuid=Y.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=
-[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Z(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=Y.generateUUID();this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=
-!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function pc(a,b){Z.call(this,new Int8Array(a),b)}function qc(a,b){Z.call(this,new Uint8Array(a),b)}function rc(a,b){Z.call(this,new Uint8ClampedArray(a),b)}function sc(a,b){Z.call(this,new Int16Array(a),b)}function gb(a,b){Z.call(this,new Uint16Array(a),b)}function tc(a,b){Z.call(this,new Int32Array(a),b)}function hb(a,b){Z.call(this,new Uint32Array(a),b)}function B(a,b){Z.call(this,new Float32Array(a),b)}function uc(a,
-b){Z.call(this,new Float64Array(a),b)}function Je(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Sd(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function E(){Object.defineProperty(this,
-"id",{value:Rd++});this.uuid=Y.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Gb(a,b,c,d,e,f){J.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new ib(a,b,c,d,e,f));this.mergeVertices()}function ib(a,b,c,d,e,f){function g(a,b,
-c,d,e,f,g,l,W,D,O){var aa=f/W,F=g/D,ja=f/2,T=g/2,C=l/2;g=W+1;var B=D+1,z=f=0,P,M,V=new n;for(M=0;M<B;M++){var pa=M*F-T;for(P=0;P<g;P++)V[a]=(P*aa-ja)*d,V[b]=pa*e,V[c]=C,m.push(V.x,V.y,V.z),V[a]=0,V[b]=0,V[c]=0<l?1:-1,q.push(V.x,V.y,V.z),v.push(P/W),v.push(1-M/D),f+=1}for(M=0;M<D;M++)for(P=0;P<W;P++)a=p+P+g*(M+1),b=p+(P+1)+g*(M+1),c=p+(P+1)+g*M,k.push(p+P+g*M,a,c),k.push(a,b,c),z+=6;h.addGroup(r,z,O);r+=z;p+=f}E.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,
-heightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=[],m=[],q=[],v=[],p=0,r=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute("position",new B(m,3));this.addAttribute("normal",new B(q,3));this.addAttribute("uv",new B(v,2))}function vc(a,b,c,d){J.call(this);this.type=
-"PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new jb(a,b,c,d));this.mergeVertices()}function jb(a,b,c,d){E.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d,q=[],v=[],p=[],r=[];for(a=0;a<h;a++){var l=a*m-f;for(b=0;b<g;b++)v.push(b*k-e,-l,0),p.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=
-0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute("position",new B(v,3));this.addAttribute("normal",new B(p,3));this.addAttribute("uv",new B(r,2))}function ya(a){U.call(this);this.type="MeshBasicMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=
-!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function kb(a,b){this.origin=void 0!==a?a:new n;this.direction=void 0!==b?b:new n}function Hb(a,b){this.start=void 0!==a?a:new n;this.end=void 0!==b?b:new n}function Ta(a,b,c){this.a=void 0!==a?a:new n;this.b=void 0!==b?b:new n;this.c=void 0!==c?c:new n}function la(a,b){z.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new E;this.material=void 0!==
-b?b:new ya({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Mf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new G(0),g=0,h,k,m,q;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,r){b=b.background;null===b?e(f,g):b&&b.isColor&&(e(b,1),r=!0);(a.autoClear||r)&&a.clear(a.autoClearColor,a.autoClearDepth,
-a.autoClearStencil);b&&b.isCubeTexture?(void 0===m&&(m=new qa,q=new la(new ib(5,5,5),new ra({uniforms:$a.cube.uniforms,vertexShader:$a.cube.vertexShader,fragmentShader:$a.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))),m.projectionMatrix.copy(d.projectionMatrix),m.matrixWorld.extractRotation(d.matrixWorld),m.matrixWorldInverse.getInverse(m.matrixWorld),q.material.uniforms.tCube.value=b,q.modelViewMatrix.multiplyMatrices(m.matrixWorldInverse,q.matrixWorld),c.update(q),a.renderBufferDirect(m,
-null,q.geometry,q.material,q,null)):b&&b.isTexture&&(void 0===h&&(h=new Fb(-1,1,1,-1,0,1),k=new la(new jb(2,2),new ya({depthTest:!1,depthWrite:!1,fog:!1}))),k.material.map=b,c.update(k),a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Nf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Of(a,b){return a.renderOrder!==
-b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Pf(){var a=[],b=-1,c=[],d=-1;return{opaque:a,transparent:c,init:function(){d=b=-1},push:function(e,f,g,h,k){var m,q;g.transparent?(m=c,q=++d):(m=a,q=++b);(q=m[q])?(q.id=e.id,q.object=e,q.geometry=f,q.material=g,q.program=g.program,q.renderOrder=e.renderOrder,q.z=h,q.group=k):(q={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},m.push(q))},finish:function(){a.length=b+1;c.length=
-d+1},sort:function(){a.sort(Nf);c.sort(Of)}}}function Qf(){var a={};return{get:function(b,c){var d=b.id+","+c.id,e=a[d];void 0===e&&(e=new Pf,a[d]=e);return e},dispose:function(){a={}}}}function Rf(a,b,c){var d,e,f;this.setMode=function(a){d=a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)};this.renderInstances=function(g,h,k){var m=b.get("ANGLE_instanced_arrays");null===m?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):
-(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*k/3))}}function Sf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
-else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES&&(c.faces+=e.maxInstancedCount*g/3)}}}function Tf(a,b,c){function d(a){a=a.target;var h=e[a.id];null!==h.index&&b.remove(h.index);for(var k in h.attributes)b.remove(h.attributes[k]);a.removeEventListener("dispose",d);delete e[a.id];if(k=f[a.id])b.remove(k),
-delete f[a.id];if(k=f[h.id])b.remove(k),delete f[h.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new E).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=
-c[f],e=0,q=d.length;e<q;e++)b.update(d[e],a.ARRAY_BUFFER)},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;var d=[],e=c.index,m=c.attributes;if(null!==e)for(var e=e.array,m=0,q=e.length;m<q;m+=3){var v=e[m+0],p=e[m+1],r=e[m+2];d.push(v,p,p,r,r,v)}else for(e=m.position.array,m=0,q=e.length/3-1;m<q;m+=3)v=m+0,p=m+1,r=m+2,d.push(v,p,p,r,r,v);d=new (65535<Sd(d)?hb:gb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=d}}}function Uf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];
-var c;switch(b.type){case "DirectionalLight":c={direction:new n,color:new G,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "SpotLight":c={position:new n,direction:new n,color:new G,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "PointLight":c={position:new n,color:new G,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "HemisphereLight":c={direction:new n,skyColor:new G,
-groundColor:new G};break;case "RectAreaLight":c={color:new G,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function Vf(a,b,c){var d={};return{update:function(a){var f=c.frame,g=a.geometry,h=b.get(a,g);d[h.id]!==f&&(g.isGeometry&&h.updateFromObject(a),b.update(h),d[h.id]=f);return h},clear:function(){d={}}}}function Wf(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);
-!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),Wf(c));return d}function Le(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD",
-"( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+a);}}function Td(a,b){var c=Le(b);return"vec4 "+a+"( vec4 value ) { return "+c[0]+"ToLinear"+c[1]+"; }"}function Xf(a,b){var c=Le(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+c[0]+c[1]+"; }"}function Yf(a,b){var c;switch(b){case 1:c="Linear";break;case 2:c="Reinhard";break;case 3:c="Uncharted2";break;case 4:c="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+
-b);}return"vec3 "+a+"( vec3 color ) { return "+c+"ToneMapping( color ); }"}function Zf(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":
-""].filter(wc).join("\n")}function $f(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function wc(a){return""!==a}function Me(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Ud(a){return a.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(a,c){var d=X[c];
-if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Ud(d)})}function Ne(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function ag(a,b,c,d,e){var f=a.context,g=c.extensions,h=c.defines,k=d.vertexShader,m=d.fragmentShader,q="SHADOWMAP_TYPE_BASIC";1===e.shadowMapType?q="SHADOWMAP_TYPE_PCF":2===e.shadowMapType&&(q="SHADOWMAP_TYPE_PCF_SOFT");
-var v="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",r="ENVMAP_BLENDING_MULTIPLY";if(e.envMap){switch(c.envMap.mapping){case 301:case 302:v="ENVMAP_TYPE_CUBE";break;case 306:case 307:v="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:v="ENVMAP_TYPE_EQUIREC";break;case 305:v="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:r="ENVMAP_BLENDING_MULTIPLY";break;case 1:r="ENVMAP_BLENDING_MIX";break;case 2:r="ENVMAP_BLENDING_ADD"}}var l=0<a.gammaFactor?
-a.gammaFactor:1,g=Zf(g,e,a.extensions),t=$f(h),n=f.createProgram();c.isRawShaderMaterial?(h=[t,"\n"].filter(wc).join("\n"),d=[g,t,"\n"].filter(wc).join("\n")):(h=["precision "+e.precision+" float;","precision "+e.precision+" int;","#define SHADER_NAME "+d.name,t,e.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+l,"#define MAX_BONES "+e.maxBones,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":
-"",e.envMap?"#define "+p:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.displacementMap&&e.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.vertexColors?"#define USE_COLOR":"",e.flatShading?
-"#define FLAT_SHADED":"",e.skinning?"#define USE_SKINNING":"",e.useVertexTexture?"#define BONE_TEXTURE":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals&&!1===e.flatShading?"#define USE_MORPHNORMALS":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+e.numClippingPlanes,e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+q:"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.logarithmicDepthBuffer?
-"#define USE_LOGDEPTHBUF":"",e.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;",
-"\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(wc).join("\n"),
-d=[g,"precision "+e.precision+" float;","precision "+e.precision+" int;","#define SHADER_NAME "+d.name,t,e.alphaTest?"#define ALPHATEST "+e.alphaTest:"","#define GAMMA_FACTOR "+l,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+v:"",e.envMap?"#define "+p:"",e.envMap?"#define "+r:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",
-e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.vertexColors?"#define USE_COLOR":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+e.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+
-(e.numClippingPlanes-e.numClipIntersection),e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+q:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",e.envMap&&a.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;",
-"uniform vec3 cameraPosition;",0!==e.toneMapping?"#define TONE_MAPPING":"",0!==e.toneMapping?X.tonemapping_pars_fragment:"",0!==e.toneMapping?Yf("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.outputEncoding||e.mapEncoding||e.envMapEncoding||e.emissiveMapEncoding?X.encodings_pars_fragment:"",e.mapEncoding?Td("mapTexelToLinear",e.mapEncoding):"",e.envMapEncoding?Td("envMapTexelToLinear",e.envMapEncoding):"",e.emissiveMapEncoding?Td("emissiveMapTexelToLinear",e.emissiveMapEncoding):
-"",e.outputEncoding?Xf("linearToOutputTexel",e.outputEncoding):"",e.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(wc).join("\n"));k=Ud(k);k=Me(k,e);m=Ud(m);m=Me(m,e);c.isShaderMaterial||(k=Ne(k),m=Ne(m));m=d+m;k=Ke(f,f.VERTEX_SHADER,h+k);m=Ke(f,f.FRAGMENT_SHADER,m);f.attachShader(n,k);f.attachShader(n,m);void 0!==c.index0AttributeName?f.bindAttribLocation(n,0,c.index0AttributeName):!0===e.morphTargets&&f.bindAttribLocation(n,0,"position");f.linkProgram(n);e=f.getProgramInfoLog(n);
-q=f.getShaderInfoLog(k);v=f.getShaderInfoLog(m);r=p=!0;if(!1===f.getProgramParameter(n,f.LINK_STATUS))p=!1,console.error("THREE.WebGLProgram: shader error: ",f.getError(),"gl.VALIDATE_STATUS",f.getProgramParameter(n,f.VALIDATE_STATUS),"gl.getProgramInfoLog",e,q,v);else if(""!==e)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",e);else if(""===q||""===v)r=!1;r&&(this.diagnostics={runnable:p,material:c,programLog:e,vertexShader:{log:q,prefix:h},fragmentShader:{log:v,prefix:d}});f.deleteShader(k);
-f.deleteShader(m);var x;this.getUniforms=function(){void 0===x&&(x=new eb(f,n,a));return x};var u;this.getAttributes=function(){if(void 0===u){for(var a={},b=f.getProgramParameter(n,f.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=f.getActiveAttrib(n,c).name;a[d]=f.getAttribLocation(n,d)}u=a}return u};this.destroy=function(){f.deleteProgram(n);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},
-attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=bg++;this.code=b;this.usedTimes=1;this.program=n;this.vertexShader=k;this.fragmentShader=m;return this}function cg(a,b){function c(a,b){var c;a?a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding):c=3E3;3E3===
-c&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},f="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");
-this.getParameters=function(d,f,k,m,q,v){var p=e[d.type],r;if(v.isSkinnedMesh)if(r=v.skeleton.bones,b.floatVertexTextures)r=1024;else{var l=Math.min(Math.floor((b.maxVertexUniforms-20)/4),r.length);l<r.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+r.length+" bones. This GPU supports "+l+"."),r=0):r=l}else r=0;l=a.getPrecision();null!==d.precision&&(l=b.getMaxPrecision(d.precision),l!==d.precision&&console.warn("THREE.WebGLProgram.getParameters:",d.precision,"not supported, using",l,"instead."));
-var t=a.getRenderTarget();return{shaderID:p,precision:l,supportsVertexTextures:b.vertexTextures,outputEncoding:c(t?t.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap,emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,
-displacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,gradientMap:!!d.gradientMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!k,useFog:d.fog,fogExp:k&&k.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning&&0<r,maxBones:r,useVertexTexture:b.floatVertexTextures,morphTargets:d.morphTargets,morphNormals:d.morphNormals,
-maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numRectAreaLights:f.rectArea.length,numHemiLights:f.hemi.length,numClippingPlanes:m,numClipIntersection:q,dithering:d.dithering,shadowMapEnabled:a.shadowMap.enabled&&v.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:d.premultipliedAlpha,
-alphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<f.length;e++)d.push(c[f[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(b,c,e,f){for(var q,v=0,p=d.length;v<
-p;v++){var r=d[v];if(r.code===f){q=r;++q.usedTimes;break}}void 0===q&&(q=new ag(a,f,b,c,e),d.push(q));return q};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function dg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,
-0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return Y.isPowerOfTwo(a.width)&&Y.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function v(b){b=b.target;b.removeEventListener("dispose",v);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);
-else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function p(b){b=b.target;b.removeEventListener("dispose",p);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),
-c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,p){var q=d.get(b);if(0<b.version&&q.__version!==b.version){var r=b.image;if(void 0===r)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===r.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===q.__webglInit&&(q.__webglInit=!0,b.addEventListener("dispose",v),q.__webglTexture=
-a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var t=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(t))if(r=t,r instanceof HTMLImageElement||r instanceof HTMLCanvasElement){var n=document.createElementNS("http://www.w3.org/1999/xhtml",
-"canvas");n.width=Y.nearestPowerOfTwo(r.width);n.height=Y.nearestPowerOfTwo(r.height);n.getContext("2d").drawImage(r,0,0,n.width,n.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+r.width+"x"+r.height+"). Resized to "+n.width+"x"+n.height,r);t=n}else t=r;var r=k(t),n=f(b.format),y=f(b.type);l(a.TEXTURE_2D,b,r);var aa=b.mipmaps;if(b.isDepthTexture){aa=a.DEPTH_COMPONENT;if(1015===b.type){if(!x)throw Error("Float Depth Texture only supported in WebGL2.0");aa=a.DEPTH_COMPONENT32F}else x&&
-(aa=a.DEPTH_COMPONENT16);1026===b.format&&aa===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),b.type=1012,y=f(b.type));1027===b.format&&(aa=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),b.type=1020,y=f(b.type)));c.texImage2D(a.TEXTURE_2D,0,aa,t.width,t.height,0,n,y,null)}else if(b.isDataTexture)if(0<aa.length&&
-r){for(var F=0,ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,t.width,t.height,0,n,y,t.data);else if(b.isCompressedTexture)for(F=0,ja=aa.length;F<ja;F++)t=aa[F],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(n)?c.compressedTexImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,t.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):
-c.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);else if(0<aa.length&&r){F=0;for(ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,n,y,t);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,n,y,t);m(b,r)&&a.generateMipmap(a.TEXTURE_2D);q.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture)}function l(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),
-a.texParameteri(c,a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,q(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,q(g.minFilter)),
-1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=
-g.anisotropy)}function t(b,e,g,h){var k=f(e.texture.format),m=f(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function n(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,
-b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var x="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=r;this.setTextureCube=function(b,p){var q=d.get(b);if(6===b.image.length)if(0<b.version&&q.__version!==
-b.version){q.__image__webglTextureCube||(b.addEventListener("dispose",v),q.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var r=b&&b.isCompressedTexture,t=b.image[0]&&b.image[0].isDataTexture,n=[],y=0;6>y;y++)n[y]=r||t?t?b.image[y].image:b.image[y]:h(b.image[y],e.maxCubemapSize);var x=k(n[0]),F=f(b.format),ja=f(b.type);l(a.TEXTURE_CUBE_MAP,b,x);for(y=
-0;6>y;y++)if(r)for(var T,C=n[y].mipmaps,z=0,B=C.length;z<B;z++)T=C[z],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(F)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,T.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,F,ja,T.data);else t?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,n[y].width,n[y].height,
-0,F,ja,n[y].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,F,ja,n[y]);m(b,x)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);q.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+p),c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",p);
-f.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,q=k(b);if(h){e.__webglFramebuffer=[];for(var v=0;6>v;v++)e.__webglFramebuffer[v]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,q);for(v=0;6>v;v++)t(e.__webglFramebuffer[v],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+v);m(b.texture,q)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,
-null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,q),t(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,q)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,
-e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,
-a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),n(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),n(e.__webglDepthbuffer,
-b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);m(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function eg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function fg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
-a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==u[b]&&(a.enable(b),u[b]=!0)}function f(b){!1!==u[b]&&(a.disable(b),u[b]=!1)}function g(b,d,g,h,k,m,p,q){0!==b?e(a.BLEND):f(a.BLEND);5===b||b===w&&q===ja||(2===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),
-a.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,
-a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),w=b,ja=q);if(5===b){k=k||d;m=m||g;p=p||h;if(d!==I||k!==O)a.blendEquationSeparate(c(d),c(k)),I=d,O=k;if(g!==W||h!==D||m!==aa||p!==F)a.blendFuncSeparate(c(g),c(h),c(m),c(p)),W=g,D=h,aa=m,F=p}else F=aa=O=D=W=I=null}function h(b){T!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),T=b)}function k(b){0!==b?(e(a.CULL_FACE),b!==C&&(1===b?a.cullFace(a.BACK):
-2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);C=b}function m(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),B!==c||P!==d)a.polygonOffset(c,d),B=c,P=d}else f(a.POLYGON_OFFSET_FILL)}function q(b){void 0===b&&(b=a.TEXTURE0+V-1);S!==b&&(a.activeTexture(b),S=b)}var v=new function(){var b=!1,c=new fa,d=null,e=new fa;return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&
-(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(0,0,0,1)}}},p=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);
-break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=null,d=null,g=null,h=null,k=null,m=null,p=null,q=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},
-setOp:function(b,c,d){if(k!==b||m!==c||p!==d)a.stencilOp(b,c,d),k=b,m=c,p=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=p=m=k=h=g=d=c=null}}},l=a.getParameter(a.MAX_VERTEX_ATTRIBS),t=new Uint8Array(l),n=new Uint8Array(l),x=new Uint8Array(l),u={},H=null,w=null,I=null,W=null,D=null,O=null,aa=null,F=null,ja=!1,T=null,C=null,z=null,B=null,P=null,M=null,V=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),l=parseFloat(/^WebGL\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),
-pa=1<=parseFloat(l),S=null,N={},E=new fa,G=new fa,K={};K[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);K[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:v,depth:p,stencil:r},init:function(){v.setClear(0,0,0,1);p.setClear(1);r.setClear(0);e(a.DEPTH_TEST);p.setFunc(3);h(!1);k(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=t.length;a<b;a++)t[a]=0},enableAttribute:function(c){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=
-1);0!==x[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),x[c]=0)},enableAttributeAndDivisor:function(c,d){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=1);x[c]!==d&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,d),x[c]=d)},disableUnusedAttributes:function(){for(var b=0,c=n.length;b!==c;++b)n[b]!==t[b]&&(a.disableVertexAttribArray(b),n[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===H&&(H=[],b.get("WEBGL_compressed_texture_pvrtc")||
-b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)H.push(c[d]);return H},setBlending:g,setMaterial:function(b){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);h(1===b.side);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);p.setFunc(b.depthFunc);p.setTest(b.depthTest);p.setMask(b.depthWrite);v.setMask(b.colorWrite);
-m(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==z&&(pa&&a.lineWidth(b),z=b)},setPolygonOffset:m,getScissorTest:function(){return M},setScissorTest:function(b){(M=b)?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:q,bindTexture:function(b,c){null===S&&q();var d=N[S];void 0===d&&(d={type:void 0,texture:void 0},N[S]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||K[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,
-arguments)}catch(b){console.error("THREE.WebGLState:",b)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(b){console.error("THREE.WebGLState:",b)}},scissor:function(b){!1===E.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),E.copy(b))},viewport:function(b){!1===G.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),G.copy(b))},reset:function(){for(var b=0;b<n.length;b++)1===n[b]&&(a.disableVertexAttribArray(b),n[b]=0);u={};S=H=null;N={};C=T=w=null;v.reset();p.reset();r.reset()}}}function gg(a,b,c){function d(b){if("highp"===
-b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=
-!0===c.logarithmicDepthBuffer&&!!b.get("EXT_frag_depth");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),q=a.getParameter(a.MAX_VERTEX_ATTRIBS),v=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),p=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<h,t=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;
-var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m,maxAttributes:q,maxVertexUniforms:v,maxVaryings:p,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:t,floatVertexTextures:l&&t}}function kd(a){qa.call(this);this.cameras=a||[]}function hg(a){var b=this,c=null,d=null;"VRFrameData"in window&&(d=new window.VRFrameData);
-var e=new K,f=new K,g=new K,h=new qa;h.bounds=new fa(0,0,.5,1);h.layers.enable(1);var k=new qa;k.bounds=new fa(.5,0,.5,1);k.layers.enable(2);var m=new kd([h,k]);m.layers.enable(1);m.layers.enable(2);var q,v;window.addEventListener("vrdisplaypresentchange",function(){if(c.isPresenting){var d=c.getEyeParameters("left"),e=d.renderWidth,d=d.renderHeight;v=a.getPixelRatio();q=a.getSize();a.setDrawingBufferSize(2*e,d,1)}else b.enabled&&a.setDrawingBufferSize(q.width,q.height,v)},!1);this.standing=this.enabled=
-!1;this.getDevice=function(){return c};this.setDevice=function(a){void 0!==a&&(c=a)};this.getCamera=function(a){if(null===c)return a;c.depthNear=a.near;c.depthFar=a.far;c.getFrameData(d);var b=d.pose;null!==b.position?a.position.fromArray(b.position):a.position.set(0,0,0);null!==b.orientation&&a.quaternion.fromArray(b.orientation);a.updateMatrixWorld();b=c.stageParameters;this.standing&&b&&(f.fromArray(b.sittingToStandingTransform),g.getInverse(f),a.matrixWorld.multiply(f),a.matrixWorldInverse.multiply(g));
-if(!1===c.isPresenting)return a;m.matrixWorld.copy(a.matrixWorld);m.matrixWorldInverse.copy(a.matrixWorldInverse);h.matrixWorldInverse.fromArray(d.leftViewMatrix);k.matrixWorldInverse.fromArray(d.rightViewMatrix);this.standing&&b&&(h.matrixWorldInverse.multiply(g),k.matrixWorldInverse.multiply(g));a=a.parent;null!==a&&(e.getInverse(a.matrixWorld),h.matrixWorldInverse.multiply(e),k.matrixWorldInverse.multiply(e));h.matrixWorld.getInverse(h.matrixWorldInverse);k.matrixWorld.getInverse(k.matrixWorldInverse);
-h.projectionMatrix.fromArray(d.leftProjectionMatrix);k.projectionMatrix.fromArray(d.rightProjectionMatrix);m.projectionMatrix.copy(h.projectionMatrix);a=c.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&h.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&k.bounds.fromArray(a.rightBounds));return m};this.getStandingMatrix=function(){return f};this.submitFrame=function(){c&&c.isPresenting&&c.submitFrame()}}function ig(a){var b={};return{get:function(c){if(void 0!==
-b[c])return b[c];var d;switch(c){case "WEBGL_depth_texture":d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||
-a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function jg(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=
-e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Aa,k=new Ba,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=
-function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,k,r,l,t){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,x=l.clippingState||null;m.value=x;x=b(c,r,n,t);for(c=0;c!==n;++c)x[c]=d[c];l.clippingState=x;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Xd(a){function b(){ga.init();ga.scissor(J.copy(ea).multiplyScalar(Q));
-ga.viewport(U.copy(hd).multiplyScalar(Q))}function c(){S=G=null;pa="";V=-1;ga.reset()}function d(a){a.preventDefault();c();b();ha.clear();xa.clear()}function e(a){a=a.target;a.removeEventListener("dispose",e);f(a);ha.remove(a)}function f(a){var b=ha.get(a).program;a.program=void 0;void 0!==b&&va.releaseProgram(b)}function g(a,b,c){a.render(function(a){B.renderBufferImmediate(a,b,c)})}function h(a,b){return Math.abs(b[0])-Math.abs(a[0])}function k(a,b,c){if(a.visible){if(a.layers.test(b.layers))if(a.isLight)aa.push(a);
-else if(a.isSprite)a.frustumCulled&&!Vd.intersectsSprite(a)||C.push(a);else if(a.isLensFlare)z.push(a);else if(a.isImmediateRenderObject)c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd),F.push(a,null,a.material,Oa.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||Vd.intersectsObject(a)){c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd);var d=xa.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<
-h;g++){var m=f[g],q=e[m.materialIndex];q&&q.visible&&F.push(a,d,q,Oa.z,m)}else e.visible&&F.push(a,d,e,Oa.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d,g=g.group;if(c.isArrayCamera){N=c;for(var p=c.cameras,v=0,r=p.length;v<r;v++){var l=p[v];if(h.layers.test(l.layers)){var t=l.bounds,n=t.x*ba,ca=t.y*L,u=t.z*ba,t=t.w*L;B.setViewport(n,ca,u,t);B.setScissor(n,ca,u,t);B.setScissorTest(!0);
-q(h,b,l,k,m,g)}}}else N=null,q(h,b,c,k,m,g)}}function q(a,b,c,d,e,f){a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);a.onBeforeRender(B,b,c,d,e,f);if(a.isImmediateRenderObject){ga.setMaterial(e);var h=p(c,b.fog,e,a);pa="";g(a,h,e)}else B.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(B,b,c,d,e,f)}function v(a,b,c){var d=ha.get(a);c=va.getParameters(a,da,b,Ha.numPlanes,Ha.numIntersection,c);var g=va.getProgramCode(a,c),h=
-d.program,k=!0;if(void 0===h)a.addEventListener("dispose",e);else if(h.code!==g)f(a);else{if(void 0!==c.shaderID)return;k=!1}k&&(c.shaderID?(h=$a[c.shaderID],d.shader={name:a.type,uniforms:Ca.clone(h.uniforms),vertexShader:h.vertexShader,fragmentShader:h.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),h=va.acquireProgram(a,d.shader,c,g),d.program=h,a.program=h);c=h.getAttributes();if(a.morphTargets)for(g=
-a.numSupportedMorphTargets=0;g<B.maxMorphTargets;g++)0<=c["morphTarget"+g]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(g=a.numSupportedMorphNormals=0;g<B.maxMorphNormals;g++)0<=c["morphNormal"+g]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Ha.numPlanes,d.numIntersection=Ha.numIntersection,c.clippingPlanes=Ha.uniform;d.fog=b;d.lightsHash=da.hash;a.lights&&(c.ambientLightColor.value=da.ambient,c.directionalLights.value=
-da.directional,c.spotLights.value=da.spot,c.rectAreaLights.value=da.rectArea,c.pointLights.value=da.point,c.hemisphereLights.value=da.hemi,c.directionalShadowMap.value=da.directionalShadowMap,c.directionalShadowMatrix.value=da.directionalShadowMatrix,c.spotShadowMap.value=da.spotShadowMap,c.spotShadowMatrix.value=da.spotShadowMatrix,c.pointShadowMap.value=da.pointShadowMap,c.pointShadowMatrix.value=da.pointShadowMatrix);a=d.program.getUniforms();a=eb.seqWithValue(a.seq,c);d.uniformsList=a}function p(a,
-b,c,d){X=0;var e=ha.get(c);id&&(Wd||a!==S)&&Ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===S&&c.id===V);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==da.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Ha.numPlanes&&e.numIntersection===Ha.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(v(c,b,d),c.needsUpdate=!1);var f=!1,g=!1,h=!1,k=e.program,m=k.getUniforms(),q=e.shader.uniforms;
-k.id!==G&&(A.useProgram(k.program),G=k.id,h=g=f=!0);c.id!==V&&(V=c.id,g=!0);if(f||a!==S){m.setValue(A,"projectionMatrix",a.projectionMatrix);ia.logarithmicDepthBuffer&&m.setValue(A,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));S!==(N||a)&&(S=N||a,h=g=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)f=m.map.cameraPosition,void 0!==f&&f.setValue(A,Oa.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||
-c.isShaderMaterial||c.skinning)&&m.setValue(A,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(m.setOptional(A,d,"bindMatrix"),m.setOptional(A,d,"bindMatrixInverse"),a=d.skeleton))if(f=a.bones,ia.floatVertexTextures){if(void 0===a.boneTexture){var f=Math.sqrt(4*f.length),f=Y.nextPowerOfTwo(Math.ceil(f)),f=Math.max(f,4),p=new Float32Array(f*f*4);p.set(a.boneMatrices);var t=new db(p,f,f,1023,1015);a.boneMatrices=p;a.boneTexture=t;a.boneTextureSize=f}m.setValue(A,"boneTexture",a.boneTexture);m.setValue(A,
-"boneTextureSize",a.boneTextureSize)}else m.setOptional(A,a,"boneMatrices");if(g){m.setValue(A,"toneMappingExposure",B.toneMappingExposure);m.setValue(A,"toneMappingWhitePoint",B.toneMappingWhitePoint);c.lights&&(g=h,q.ambientLightColor.needsUpdate=g,q.directionalLights.needsUpdate=g,q.pointLights.needsUpdate=g,q.spotLights.needsUpdate=g,q.rectAreaLights.needsUpdate=g,q.hemisphereLights.needsUpdate=g);b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&
-(q.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshNormalMaterial||c.isMeshDepthMaterial){q.opacity.value=c.opacity;q.diffuse.value=c.color;c.emissive&&q.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);q.map.value=c.map;q.specularMap.value=c.specularMap;q.alphaMap.value=c.alphaMap;c.lightMap&&(q.lightMap.value=c.lightMap,q.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(q.aoMap.value=
-c.aoMap,q.aoMapIntensity.value=c.aoMapIntensity);var n;c.map?n=c.map:c.specularMap?n=c.specularMap:c.displacementMap?n=c.displacementMap:c.normalMap?n=c.normalMap:c.bumpMap?n=c.bumpMap:c.roughnessMap?n=c.roughnessMap:c.metalnessMap?n=c.metalnessMap:c.alphaMap?n=c.alphaMap:c.emissiveMap&&(n=c.emissiveMap);void 0!==n&&(n.isWebGLRenderTarget&&(n=n.texture),b=n.offset,n=n.repeat,q.offsetRepeat.value.set(b.x,b.y,n.x,n.y));q.envMap.value=c.envMap;q.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;
-q.reflectivity.value=c.reflectivity;q.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity):c.isLineDashedMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*Q,q.scale.value=.5*L,q.map.value=c.map,null!==c.map&&(n=c.map.offset,c=c.map.repeat,q.offsetRepeat.value.set(n.x,
-n.y,c.x,c.y))):c.isMeshLambertMaterial?c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap):c.isMeshToonMaterial?(r(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):c.isMeshPhongMaterial?r(q,c):c.isMeshPhysicalMaterial?(q.clearCoat.value=c.clearCoat,q.clearCoatRoughness.value=c.clearCoatRoughness,l(q,c)):c.isMeshStandardMaterial?l(q,c):c.isMeshDepthMaterial?c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias):
-c.isMeshNormalMaterial&&(c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias));void 0!==q.ltcMat&&(q.ltcMat.value=R.LTC_MAT_TEXTURE);void 0!==q.ltcMag&&(q.ltcMag.value=R.LTC_MAG_TEXTURE);eb.upload(A,e.uniformsList,q,B)}m.setValue(A,"modelViewMatrix",
-d.modelViewMatrix);m.setValue(A,"normalMatrix",d.normalMatrix);m.setValue(A,"modelMatrix",d.matrixWorld);return k}function r(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,
-a.displacementBias.value=b.displacementBias)}function l(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=
-b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function t(a,b){var c,d,e,f,g=0,h=0,k=0,m,q,p,v=b.matrixWorldInverse,r=0,l=0,n=0,t=0,ca=0;c=0;for(d=a.length;c<d;c++)if(e=a[c],f=e.color,m=e.intensity,q=e.distance,p=e.shadow&&e.shadow.map?e.shadow.map.texture:null,e.isAmbientLight)g+=f.r*m,h+=f.g*m,k+=f.b*m;else if(e.isDirectionalLight){var u=wa.get(e);u.color.copy(e.color).multiplyScalar(e.intensity);u.direction.setFromMatrixPosition(e.matrixWorld);
-Oa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.directionalShadowMap[r]=p;da.directionalShadowMatrix[r]=e.shadow.matrix;da.directional[r]=u;r++}else if(e.isSpotLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(f).multiplyScalar(m);u.distance=q;u.direction.setFromMatrixPosition(e.matrixWorld);
-Oa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);u.coneCos=Math.cos(e.angle);u.penumbraCos=Math.cos(e.angle*(1-e.penumbra));u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.spotShadowMap[n]=p;da.spotShadowMatrix[n]=e.shadow.matrix;da.spot[n]=u;n++}else if(e.isRectAreaLight)u=wa.get(e),u.color.copy(f).multiplyScalar(m/(e.width*e.height)),u.position.setFromMatrixPosition(e.matrixWorld),
-u.position.applyMatrix4(v),oa.identity(),qa.copy(e.matrixWorld),qa.premultiply(v),oa.extractRotation(qa),u.halfWidth.set(.5*e.width,0,0),u.halfHeight.set(0,.5*e.height,0),u.halfWidth.applyMatrix4(oa),u.halfHeight.applyMatrix4(oa),da.rectArea[t]=u,t++;else if(e.isPointLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(e.color).multiplyScalar(e.intensity);u.distance=e.distance;u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,
-u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.pointShadowMap[l]=p;da.pointShadowMatrix[l]=e.shadow.matrix;da.point[l]=u;l++}else e.isHemisphereLight&&(u=wa.get(e),u.direction.setFromMatrixPosition(e.matrixWorld),u.direction.transformDirection(v),u.direction.normalize(),u.skyColor.copy(e.color).multiplyScalar(m),u.groundColor.copy(e.groundColor).multiplyScalar(m),da.hemi[ca]=u,ca++);da.ambient[0]=g;da.ambient[1]=h;da.ambient[2]=k;da.directional.length=r;da.spot.length=n;
-da.rectArea.length=t;da.point.length=l;da.hemi.length=ca;da.hash=r+","+l+","+n+","+t+","+ca+","+da.shadows.length}function y(a){var b;if(1E3===a)return A.REPEAT;if(1001===a)return A.CLAMP_TO_EDGE;if(1002===a)return A.MIRRORED_REPEAT;if(1003===a)return A.NEAREST;if(1004===a)return A.NEAREST_MIPMAP_NEAREST;if(1005===a)return A.NEAREST_MIPMAP_LINEAR;if(1006===a)return A.LINEAR;if(1007===a)return A.LINEAR_MIPMAP_NEAREST;if(1008===a)return A.LINEAR_MIPMAP_LINEAR;if(1009===a)return A.UNSIGNED_BYTE;if(1017===
-a)return A.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return A.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return A.UNSIGNED_SHORT_5_6_5;if(1010===a)return A.BYTE;if(1011===a)return A.SHORT;if(1012===a)return A.UNSIGNED_SHORT;if(1013===a)return A.INT;if(1014===a)return A.UNSIGNED_INT;if(1015===a)return A.FLOAT;if(1016===a&&(b=ma.get("OES_texture_half_float"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return A.ALPHA;if(1022===a)return A.RGB;if(1023===a)return A.RGBA;if(1024===a)return A.LUMINANCE;if(1025===a)return A.LUMINANCE_ALPHA;
-if(1026===a)return A.DEPTH_COMPONENT;if(1027===a)return A.DEPTH_STENCIL;if(100===a)return A.FUNC_ADD;if(101===a)return A.FUNC_SUBTRACT;if(102===a)return A.FUNC_REVERSE_SUBTRACT;if(200===a)return A.ZERO;if(201===a)return A.ONE;if(202===a)return A.SRC_COLOR;if(203===a)return A.ONE_MINUS_SRC_COLOR;if(204===a)return A.SRC_ALPHA;if(205===a)return A.ONE_MINUS_SRC_ALPHA;if(206===a)return A.DST_ALPHA;if(207===a)return A.ONE_MINUS_DST_ALPHA;if(208===a)return A.DST_COLOR;if(209===a)return A.ONE_MINUS_DST_COLOR;
-if(210===a)return A.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ma.get("WEBGL_compressed_texture_s3tc"),null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ma.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
-if(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===a&&(b=ma.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ma.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ma.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","86");a=a||{};var x=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml",
-"canvas"),u=void 0!==a.context?a.context:null,H=void 0!==a.alpha?a.alpha:!1,w=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,W=void 0!==a.antialias?a.antialias:!1,D=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,O=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,aa=[],F=null,ja=new Float32Array(8),C=[],z=[];this.domElement=x;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=
-!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var B=this,G=null,P=null,M=null,V=-1,pa="",S=null,N=null,J=new fa,Z=null,U=new fa,X=0,ba=x.width,L=x.height,Q=1,ea=new fa(0,0,ba,L),na=!1,hd=new fa(0,0,ba,L),Vd=new gd,Ha=new jg,id=!1,Wd=!1,jd=new K,Oa=new n,qa=new K,oa=new K,da={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],
-spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},ta={geometries:0,textures:0},la={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:la,memory:ta,programs:null};var A;try{H={alpha:H,depth:w,stencil:I,antialias:W,premultipliedAlpha:D,preserveDrawingBuffer:O};A=u||x.getContext("webgl",H)||x.getContext("experimental-webgl",H);if(null===A){if(null!==x.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";
-throw"Error creating WebGL context.";}void 0===A.getShaderPrecisionFormat&&(A.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});x.addEventListener("webglcontextlost",d,!1)}catch(kg){console.error("THREE.WebGLRenderer: "+kg)}var ma=new ig(A);ma.get("WEBGL_depth_texture");ma.get("OES_texture_float");ma.get("OES_texture_float_linear");ma.get("OES_texture_half_float");ma.get("OES_texture_half_float_linear");ma.get("OES_standard_derivatives");ma.get("ANGLE_instanced_arrays");
-ma.get("OES_element_index_uint")&&(E.MaxIndex=4294967296);var ia=new gg(A,ma,a),ga=new fg(A,ma,y),ha=new eg,ra=new dg(A,ma,ga,ha,ia,y,ta),ua=new Kf(A),za=new Tf(A,ua,ta),xa=new Vf(A,za,la),va=new cg(this,ia),wa=new Uf,Aa=new Qf,ya=new Mf(this,ga,xa,D),sa=new hg(this);this.info.programs=va.programs;var Da=new Sf(A,ma,la),Ea=new Rf(A,ma,la);b();this.context=A;this.capabilities=ia;this.extensions=ma;this.properties=ha;this.renderLists=Aa;this.state=ga;this.vr=sa;var Ba=new Ie(this,da,xa,ia);this.shadowMap=
-Ba;var Fa=new If(this,C),Ga=new Hf(this,z);this.getContext=function(){return A};this.getContextAttributes=function(){return A.getContextAttributes()};this.forceContextLoss=function(){var a=ma.get("WEBGL_lose_context");a&&a.loseContext()};this.getMaxAnisotropy=function(){return ia.getMaxAnisotropy()};this.getPrecision=function(){return ia.precision};this.getPixelRatio=function(){return Q};this.setPixelRatio=function(a){void 0!==a&&(Q=a,this.setSize(ba,L,!1))};this.getSize=function(){return{width:ba,
-height:L}};this.setSize=function(a,b,c){var d=sa.getDevice();d&&d.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(ba=a,L=b,x.width=a*Q,x.height=b*Q,!1!==c&&(x.style.width=a+"px",x.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:ba*Q,height:L*Q}};this.setDrawingBufferSize=function(a,b,c){ba=a;L=b;Q=c;x.width=a*c;x.height=b*c;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){hd.set(a,L-
-b-d,c,d);ga.viewport(U.copy(hd).multiplyScalar(Q))};this.setScissor=function(a,b,c,d){ea.set(a,L-b-d,c,d);ga.scissor(J.copy(ea).multiplyScalar(Q))};this.setScissorTest=function(a){ga.setScissorTest(na=a)};this.getClearColor=ya.getClearColor;this.setClearColor=ya.setClearColor;this.getClearAlpha=ya.getClearAlpha;this.setClearAlpha=ya.setClearAlpha;this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=A.COLOR_BUFFER_BIT;if(void 0===b||b)d|=A.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=A.STENCIL_BUFFER_BIT;
-A.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=c;this.dispose=function(){x.removeEventListener("webglcontextlost",d,!1);Aa.dispose()};this.renderBufferImmediate=function(a,b,c){ga.initAttributes();var d=ha.get(a);a.hasPositions&&!d.position&&(d.position=A.createBuffer());a.hasNormals&&!d.normal&&
-(d.normal=A.createBuffer());a.hasUvs&&!d.uv&&(d.uv=A.createBuffer());a.hasColors&&!d.color&&(d.color=A.createBuffer());b=b.getAttributes();a.hasPositions&&(A.bindBuffer(A.ARRAY_BUFFER,d.position),A.bufferData(A.ARRAY_BUFFER,a.positionArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.position),A.vertexAttribPointer(b.position,3,A.FLOAT,!1,0,0));if(a.hasNormals){A.bindBuffer(A.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&1===c.shading)for(var e=0,f=
-3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}A.bufferData(A.ARRAY_BUFFER,a.normalArray,A.DYNAMIC_DRAW);ga.enableAttribute(b.normal);A.vertexAttribPointer(b.normal,3,A.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(A.bindBuffer(A.ARRAY_BUFFER,d.uv),A.bufferData(A.ARRAY_BUFFER,a.uvArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.uv),A.vertexAttribPointer(ua.uv,2,A.FLOAT,
-!1,0,0));a.hasColors&&0!==c.vertexColors&&(A.bindBuffer(A.ARRAY_BUFFER,d.color),A.bufferData(A.ARRAY_BUFFER,a.colorArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.color),A.vertexAttribPointer(b.color,3,A.FLOAT,!1,0,0));ga.disableUnusedAttributes();A.drawArrays(A.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){ga.setMaterial(d);var g=p(a,b,d,e);a=c.id+"_"+g.id+"_"+(!0===d.wireframe);var k=!1;a!==pa&&(pa=a,k=!0);b=e.morphTargetInfluences;if(void 0!==b){var m=[];a=0;for(var q=
-b.length;a<q;a++)k=b[a],m.push([k,a]);m.sort(h);8<m.length&&(m.length=8);var v=c.morphAttributes;a=0;for(q=m.length;a<q;a++)k=m[a],ja[a]=k[0],0!==k[0]?(b=k[1],!0===d.morphTargets&&v.position&&c.addAttribute("morphTarget"+a,v.position[b]),!0===d.morphNormals&&v.normal&&c.addAttribute("morphNormal"+a,v.normal[b])):(!0===d.morphTargets&&c.removeAttribute("morphTarget"+a),!0===d.morphNormals&&c.removeAttribute("morphNormal"+a));a=m.length;for(b=ja.length;a<b;a++)ja[a]=0;g.getUniforms().setValue(A,"morphTargetInfluences",
-ja);k=!0}b=c.index;q=c.attributes.position;m=1;!0===d.wireframe&&(b=za.getWireframeAttribute(c),m=2);var r;a=Da;null!==b&&(r=ua.get(b),a=Ea,a.setIndex(r));if(k){k=void 0;if(c&&c.isInstancedBufferGeometry&&null===ma.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===k&&(k=0);ga.initAttributes();var v=c.attributes,g=g.getAttributes(),l=d.defaultAttributeValues,
-n;for(n in g){var t=g[n];if(0<=t){var u=v[n];if(void 0!==u){var ca=u.normalized,w=u.itemSize,x=ua.get(u),y=x.buffer,H=x.type,x=x.bytesPerElement;if(u.isInterleavedBufferAttribute){var I=u.data,D=I.stride,u=u.offset;I&&I.isInstancedInterleavedBuffer?(ga.enableAttributeAndDivisor(t,I.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=I.meshPerAttribute*I.count)):ga.enableAttribute(t);A.bindBuffer(A.ARRAY_BUFFER,y);A.vertexAttribPointer(t,w,H,ca,D*x,(k*D+u)*x)}else u.isInstancedBufferAttribute?
-(ga.enableAttributeAndDivisor(t,u.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):ga.enableAttribute(t),A.bindBuffer(A.ARRAY_BUFFER,y),A.vertexAttribPointer(t,w,H,ca,0,k*w*x)}else if(void 0!==l&&(ca=l[n],void 0!==ca))switch(ca.length){case 2:A.vertexAttrib2fv(t,ca);break;case 3:A.vertexAttrib3fv(t,ca);break;case 4:A.vertexAttrib4fv(t,ca);break;default:A.vertexAttrib1fv(t,ca)}}}ga.disableUnusedAttributes()}null!==b&&A.bindBuffer(A.ELEMENT_ARRAY_BUFFER,
-r.buffer)}r=0;null!==b?r=b.count:void 0!==q&&(r=q.count);b=c.drawRange.start*m;q=null!==f?f.start*m:0;n=Math.max(b,q);f=Math.max(0,Math.min(r,b+c.drawRange.count*m,q+(null!==f?f.count*m:Infinity))-1-n+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ga.setLineWidth(d.wireframeLinewidth*(null===P?Q:1)),a.setMode(A.LINES);else switch(e.drawMode){case 0:a.setMode(A.TRIANGLES);break;case 1:a.setMode(A.TRIANGLE_STRIP);break;case 2:a.setMode(A.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ga.setLineWidth(d*
-(null===P?Q:1)),e.isLineSegments?a.setMode(A.LINES):e.isLineLoop?a.setMode(A.LINE_LOOP):a.setMode(A.LINE_STRIP)):e.isPoints&&a.setMode(A.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,n,f):a.render(n,f)}};this.compile=function(a,b){aa=[];a.traverse(function(a){a.isLight&&aa.push(a)});t(aa,b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)v(b.material[c],a.fog,b);else v(b.material,a.fog,b)})};this.animate=function(a){function b(){a();
-(sa.getDevice()||window).requestAnimationFrame(b)}(sa.getDevice()||window).requestAnimationFrame(b)};this.render=function(a,b,c,d){if(b&&b.isCamera){pa="";V=-1;S=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();sa.enabled&&(b=sa.getCamera(b));jd.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Vd.setFromMatrix(jd);aa.length=0;C.length=0;z.length=0;Wd=this.localClippingEnabled;id=Ha.init(this.clippingPlanes,Wd,b);F=Aa.get(a,b);F.init();k(a,b,B.sortObjects);
-F.finish();!0===B.sortObjects&&F.sort();id&&Ha.beginShadows();for(var e=aa,f=0,g=0,h=e.length;g<h;g++){var q=e[g];q.castShadow&&(da.shadows[f]=q,f++)}da.shadows.length=f;Ba.render(a,b);t(aa,b);id&&Ha.endShadows();la.frame++;la.calls=0;la.vertices=0;la.faces=0;la.points=0;void 0===c&&(c=null);this.setRenderTarget(c);ya.render(a,b,d);d=F.opaque;e=F.transparent;a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,b,f),e.length&&m(e,a,b,f)):(d.length&&m(d,a,b),e.length&&m(e,a,b));Fa.render(a,b);Ga.render(a,
-b,U);c&&ra.updateRenderTargetMipmap(c);ga.buffers.depth.setTest(!0);ga.buffers.depth.setMask(!0);ga.buffers.color.setMask(!0);b.isArrayCamera&&B.setScissorTest(!1);sa.enabled&&sa.submitFrame()}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFaceCulling=function(a,b){ga.setCullFace(a);ga.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=X;a>=ia.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+
-ia.maxTextures);X+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ra.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ra.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=
-!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ra.setTextureCube(b,c):ra.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ha.get(a).__webglFramebuffer&&ra.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,
-c;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,J.copy(a.scissor),Z=a.scissorTest,U.copy(a.viewport)):(c=null,J.copy(ea).multiplyScalar(Q),Z=na,U.copy(hd).multiplyScalar(Q));M!==c&&(A.bindFramebuffer(A.FRAMEBUFFER,c),M=c);ga.scissor(J);ga.setScissorTest(Z);ga.viewport(U);b&&(b=ha.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=
-function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=ha.get(a).__webglFramebuffer;if(g){var h=!1;g!==M&&(A.bindFramebuffer(A.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&y(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||y(q)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ma.get("OES_texture_float")||ma.get("WEBGL_color_buffer_float"))||
-1016===q&&ma.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,y(m),y(q),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}}
-function Ib(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function ld(){z.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new n;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function bb(a){U.call(this);this.type="SpriteMaterial";
-this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function xc(a){z.call(this);this.type="Sprite";this.material=void 0!==a?a:new bb}function yc(){z.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function zc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length.");
-this.boneInverses=[];for(var c=0,d=this.bones.length;c<d;c++)this.boneInverses.push(new K)}}function md(){z.call(this);this.type="Bone"}function nd(a,b){la.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new K;this.bindMatrixInverse=new K;var c=this.initBones(),c=new zc(c);this.bind(c,this.matrixWorld);this.normalizeSkinWeights()}function ea(a){U.call(this);this.type="LineBasicMaterial";this.color=new G(16777215);this.linewidth=1;this.linejoin=this.linecap="round";
-this.lights=!1;this.setValues(a)}function sa(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new Q(a,b);z.call(this);this.type="Line";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new ea({color:16777215*Math.random()})}function Q(a,b){sa.call(this,a,b);this.type="LineSegments"}function od(a,b){sa.call(this,a,b);this.type="LineLoop"}function Fa(a){U.call(this);this.type="PointsMaterial";this.color=
-new G(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Kb(a,b){z.call(this);this.type="Points";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new Fa({color:16777215*Math.random()})}function Ac(){z.call(this);this.type="Group"}function pd(a,b,c,d,e,f,g,h,k){function m(){requestAnimationFrame(m);a.readyState>=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0)}ba.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;m()}function Lb(a,b,
-c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function qd(a,b,c,d,e,f,g,h,k){ba.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Bc(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);ba.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,
-height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Mb(a){E.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f,g=[0,0],h={},k,m,q=["a","b","c"];if(a&&a.isGeometry){var v=a.faces;c=0;for(e=v.length;c<e;c++){var p=v[c];for(d=0;3>d;d++)k=p[q[d]],m=p[q[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],q=a.vertices[c.index1],b.push(q.x,q.y,q.z),q=a.vertices[c.index2],
-b.push(q.x,q.y,q.z)}else if(a&&a.isBufferGeometry){var r,q=new n;if(null!==a.index){v=a.attributes.position;p=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:p.count,materialIndex:0}]);a=0;for(f=r.length;a<f;++a)for(c=r[a],d=c.start,e=c.count,c=d,e=d+e;c<e;c+=3)for(d=0;3>d;d++)k=p.getX(c+d),m=p.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],q.fromBufferAttribute(v,c.index1),b.push(q.x,q.y,q.z),q.fromBufferAttribute(v,
-c.index2),b.push(q.x,q.y,q.z)}else for(v=a.attributes.position,c=0,e=v.count/3;c<e;c++)for(d=0;3>d;d++)h=3*c+d,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z),h=3*c+(d+1)%3,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z)}this.addAttribute("position",new B(b,3))}function Cc(a,b,c){J.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function Nb(a,b,c){E.call(this);this.type="ParametricBufferGeometry";this.parameters=
-{func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new n,k=new n,m=new n,q=new n,v=new n,p,r,l=b+1;for(p=0;p<=c;p++){var t=p/c;for(r=0;r<=b;r++){var y=r/b,k=a(y,t,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(m=a(y-1E-5,t,m),q.subVectors(k,m)):(m=a(y+1E-5,t,m),q.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),v.subVectors(k,m)):(m=a(y,t+1E-5,m),v.subVectors(m,k));h.crossVectors(q,v).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(p=0;p<c;p++)for(r=0;r<b;r++)a=p*l+r+1,h=(p+1)*l+r+1,k=(p+1)*l+r,d.push(p*l+r,a,k),
-d.push(a,h,k);this.setIndex(d);this.addAttribute("position",new B(e,3));this.addAttribute("normal",new B(f,3));this.addAttribute("uv",new B(g,2))}function Dc(a,b,c,d){J.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new za(a,b,c,d));this.mergeVertices()}function za(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===
-c.z&&(k[b]=d/2/Math.PI+.5)}E.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new n,d=new n,g=new n,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k=c,l=d,y=g,x=Math.pow(2,a),u=[],H,w;for(H=0;H<=x;H++){u[H]=[];var I=k.clone().lerp(y,H/x),W=l.clone().lerp(y,H/x),D=x-H;for(w=0;w<=D;w++)u[H][w]=0===w&&H===x?I:I.clone().lerp(W,w/D)}for(H=0;H<x;H++)for(w=0;w<2*(x-H)-1;w++)k=Math.floor(w/
-2),0===w%2?(e(u[H][k+1]),e(u[H+1][k]),e(u[H][k])):(e(u[H][k+1]),e(u[H+1][k+1]),e(u[H+1][k]))}})(d);(function(a){for(var b=new n,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new n,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new n,b=new n,c=new n,d=new n,e=new C,f=new C,l=new C,y=0,
-x=0;y<h.length;y+=9,x+=6){a.set(h[y+0],h[y+1],h[y+2]);b.set(h[y+3],h[y+4],h[y+5]);c.set(h[y+6],h[y+7],h[y+8]);e.set(k[x+0],k[x+1]);f.set(k[x+2],k[x+3]);l.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var u=Math.atan2(d.z,-d.x);g(e,x+0,a,u);g(f,x+2,b,u);g(l,x+4,c,u)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new B(h,3));this.addAttribute("normal",
-new B(h.slice(),3));this.addAttribute("uv",new B(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Ec(a,b){J.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Ob(a,b){za.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Fc(a,b){J.call(this);this.type="OctahedronGeometry";this.parameters=
-{radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function lb(a,b){za.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Gc(a,b){J.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;za.call(this,[-1,c,0,1,c,0,
--1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Hc(a,b){J.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;za.call(this,
-[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,
-b,c,d,e,f){J.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(v=0;v<=d;v++){var q=v/d*Math.PI*2,l=Math.sin(q),q=-Math.cos(q);
-k.x=q*m.x+l*e.x;k.y=q*m.y+l*e.y;k.z=q*m.z+l*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;p.push(h.x,h.y,h.z)}}E.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new n,k=new n,m=new C,q,v,p=[],r=[],l=[],t=[];for(q=0;q<b;q++)f(q);f(!1===e?b:0);for(q=0;q<=
-b;q++)for(v=0;v<=d;v++)m.x=q/b,m.y=v/d,l.push(m.x,m.y);(function(){for(v=1;v<=b;v++)for(q=1;q<=d;q++){var a=(d+1)*v+(q-1),c=(d+1)*v+q,e=(d+1)*(v-1)+q;t.push((d+1)*(v-1)+(q-1),a,e);t.push(a,c,e)}})();this.setIndex(t);this.addAttribute("position",new B(p,3));this.addAttribute("normal",new B(r,3));this.addAttribute("uv",new B(l,2))}function Jc(a,b,c,d,e,f,g){J.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");
-this.fromBufferGeometry(new Sb(a,b,c,d,e,f));this.mergeVertices()}function Sb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}E.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],m=[],q=[],v,p,r=new n,l=new n,t=new n,y=new n,x=new n,u=new n,H=new n;for(v=
-0;v<=c;++v)for(p=v/c*e*Math.PI*2,g(p,e,f,a,t),g(p+.01,e,f,a,y),u.subVectors(y,t),H.addVectors(y,t),x.crossVectors(u,H),H.crossVectors(x,u),x.normalize(),H.normalize(),p=0;p<=d;++p){var w=p/d*Math.PI*2,I=-b*Math.cos(w),w=b*Math.sin(w);r.x=t.x+(I*H.x+w*x.x);r.y=t.y+(I*H.y+w*x.y);r.z=t.z+(I*H.z+w*x.z);k.push(r.x,r.y,r.z);l.subVectors(r,t).normalize();m.push(l.x,l.y,l.z);q.push(v/c);q.push(p/d)}for(p=1;p<=c;p++)for(v=1;v<=d;v++)a=(d+1)*p+(v-1),b=(d+1)*p+v,e=(d+1)*(p-1)+v,h.push((d+1)*(p-1)+(v-1),a,e),
-h.push(a,b,e);this.setIndex(h);this.addAttribute("position",new B(k,3));this.addAttribute("normal",new B(m,3));this.addAttribute("uv",new B(q,2))}function Kc(a,b,c,d,e){J.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Tb(a,b,c,d,e));this.mergeVertices()}function Tb(a,b,c,d,e){E.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=
-b||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],m=new n,q=new n,v=new n,p,r;for(p=0;p<=c;p++)for(r=0;r<=d;r++){var l=r/d*e,t=p/c*Math.PI*2;q.x=(a+b*Math.cos(t))*Math.cos(l);q.y=(a+b*Math.cos(t))*Math.sin(l);q.z=b*Math.sin(t);g.push(q.x,q.y,q.z);m.x=a*Math.cos(l);m.y=a*Math.sin(l);v.subVectors(q,m).normalize();h.push(v.x,v.y,v.z);k.push(r/d);k.push(p/c)}for(p=1;p<=c;p++)for(r=1;r<=d;r++)a=(d+1)*(p-1)+r-1,b=(d+1)*(p-1)+r,e=(d+1)*p+r,f.push((d+1)*p+r-1,a,e),f.push(a,
-b,e);this.setIndex(f);this.addAttribute("position",new B(g,3));this.addAttribute("normal",new B(h,3));this.addAttribute("uv",new B(k,2))}function cb(a,b){J.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ga(a,b));this.mergeVertices()}function Ga(a,b){"undefined"!==typeof a&&(E.call(this),this.type="ExtrudeBufferGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Lc(a,b){J.call(this);this.type="TextGeometry";
-this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new J;c=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Ga.call(this,c,b);this.type="TextBufferGeometry"}
-function Mc(a,b,c,d,e,f,g){J.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new mb(a,b,c,d,e,f,g));this.mergeVertices()}function mb(a,b,c,d,e,f,g){E.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==
-d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,m,q=0,v=[],p=new n,r=new n,l=[],t=[],y=[],x=[];for(m=0;m<=c;m++){var u=[],H=m/c;for(k=0;k<=b;k++){var w=k/b;p.x=-a*Math.cos(d+w*e)*Math.sin(f+H*g);p.y=a*Math.cos(f+H*g);p.z=a*Math.sin(d+w*e)*Math.sin(f+H*g);t.push(p.x,p.y,p.z);r.set(p.x,p.y,p.z).normalize();y.push(r.x,r.y,r.z);x.push(w,1-H);u.push(q++)}v.push(u)}for(m=0;m<c;m++)for(k=0;k<b;k++)a=v[m][k+1],d=v[m][k],e=v[m+1][k],g=v[m+1][k+1],(0!==m||0<f)&&l.push(a,d,
-g),(m!==c-1||h<Math.PI)&&l.push(d,e,g);this.setIndex(l);this.addAttribute("position",new B(t,3));this.addAttribute("normal",new B(y,3));this.addAttribute("uv",new B(x,2))}function Nc(a,b,c,d,e,f){J.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Vb(a,b,c,d,e,f));this.mergeVertices()}function Vb(a,b,c,d,e,f){E.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,
-outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;b=b||50;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],m=[],q=a,v=(b-a)/d,p=new n,r=new C,l,t;for(l=0;l<=d;l++){for(t=0;t<=c;t++)a=e+t/c*f,p.x=q*Math.cos(a),p.y=q*Math.sin(a),h.push(p.x,p.y,p.z),k.push(0,0,1),r.x=(p.x/b+1)/2,r.y=(p.y/b+1)/2,m.push(r.x,r.y);q+=v}for(l=0;l<d;l++)for(b=l*(c+1),t=0;t<c;t++)a=t+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,
-f,q);this.setIndex(g);this.addAttribute("position",new B(h,3));this.addAttribute("normal",new B(k,3));this.addAttribute("uv",new B(m,2))}function Oc(a,b,c,d){J.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Wb(a,b,c,d));this.mergeVertices()}function Wb(a,b,c,d){E.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=Y.clamp(d,
-0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new n,m=new C,q,v;for(q=0;q<=b;q++){v=c+q*h*d;var p=Math.sin(v),r=Math.cos(v);for(v=0;v<=a.length-1;v++)k.x=a[v].x*p,k.y=a[v].y,k.z=a[v].x*r,f.push(k.x,k.y,k.z),m.x=q/b,m.y=v/(a.length-1),g.push(m.x,m.y)}for(q=0;q<b;q++)for(v=0;v<a.length-1;v++)c=v+q*a.length,h=c+a.length,k=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,k,m);this.setIndex(e);this.addAttribute("position",new B(f,3));this.addAttribute("uv",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=
-this.attributes.normal.array,e=new n,f=new n,g=new n,c=b*a.length*3,v=q=0;q<a.length;q++,v+=3)e.x=d[v+0],e.y=d[v+1],e.z=d[v+2],f.x=d[c+v+0],f.y=d[c+v+1],f.z=d[c+v+2],g.addVectors(e,f).normalize(),d[v+0]=d[c+v+0]=g.x,d[v+1]=d[c+v+1]=g.y,d[v+2]=d[c+v+2]=g.z}function Xb(a,b){J.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new Yb(a,
-b));this.mergeVertices()}function Yb(a,b){function c(a){var c,h,m=e.length/3;a=a.extractPoints(b);var l=a.shape,n=a.holes;if(!1===Ia.isClockWise(l))for(l=l.reverse(),a=0,c=n.length;a<c;a++)h=n[a],!0===Ia.isClockWise(h)&&(n[a]=h.reverse());var y=Ia.triangulateShape(l,n);a=0;for(c=n.length;a<c;a++)h=n[a],l=l.concat(h);a=0;for(c=l.length;a<c;a++)h=l[a],e.push(h.x,h.y,0),f.push(0,0,1),g.push(h.x,h.y);a=0;for(c=y.length;a<c;a++)l=y[a],d.push(l[0]+m,l[1]+m,l[2]+m),k+=3}E.call(this);this.type="ShapeBufferGeometry";
-this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(d);this.addAttribute("position",new B(e,3));this.addAttribute("normal",new B(f,3));this.addAttribute("uv",new B(g,2))}function Zb(a,b){E.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[],d=Math.cos(Y.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g,h,k=["a","b","c"],m;a.isBufferGeometry?
-(m=new J,m.fromBufferGeometry(a)):m=a.clone();m.mergeVertices();m.computeFaceNormals();var q=m.vertices;m=m.faces;for(var v=0,p=m.length;v<p;v++)for(var l=m[v],n=0;3>n;n++)g=l[k[n]],h=l[k[(n+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+","+e[1],void 0===f[g]?f[g]={index1:e[0],index2:e[1],face1:v,face2:void 0}:f[g].face2=v;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=q[e.index1],c.push(k.x,k.y,k.z),k=q[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position",
-new B(c,3))}function nb(a,b,c,d,e,f,g,h){J.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Ua(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new C,D=new n,O=0,aa=!0===c?a:b,F=!0===c?1:-1;f=ca;for(e=1;e<=d;e++)v.push(0,y*F,0),p.push(0,F,0),l.push(.5,.5),ca++;k=ca;for(e=0;e<=d;e++){var B=e/d*h+g,z=Math.cos(B),
-B=Math.sin(B);D.x=aa*B;D.y=y*F;D.z=aa*z;v.push(D.x,D.y,D.z);p.push(0,F,0);t.x=.5*z+.5;t.y=.5*B*F+.5;l.push(t.x,t.y);ca++}for(e=0;e<d;e++)t=f+e,D=k+e,!0===c?q.push(D,D+1,t):q.push(D+1,D,t),O+=3;m.addGroup(x,O,!0===c?1:2);x+=O}E.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=Math.floor(d)||8;e=Math.floor(e)||
-1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],v=[],p=[],l=[],ca=0,t=[],y=c/2,x=0;(function(){var f,k,w=new n,I=new n,W=0,D=(b-a)/c;for(k=0;k<=e;k++){var O=[],aa=k/e,F=aa*(b-a)+a;for(f=0;f<=d;f++){var B=f/d,C=B*h+g,z=Math.sin(C),C=Math.cos(C);I.x=F*z;I.y=-aa*c+y;I.z=F*C;v.push(I.x,I.y,I.z);w.set(z,D,C).normalize();p.push(w.x,w.y,w.z);l.push(B,1-aa);O.push(ca++)}t.push(O)}for(f=0;f<d;f++)for(k=0;k<e;k++)w=t[k+1][f],I=t[k+1][f+1],D=t[k][f+1],q.push(t[k][f],w,D),q.push(w,I,D),
-W+=6;m.addGroup(x,W,0);x+=W})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute("position",new B(v,3));this.addAttribute("normal",new B(p,3));this.addAttribute("uv",new B(l,2))}function Pc(a,b,c,d,e,f,g){nb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Qc(a,b,c,d,e,f,g){Ua.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,
-height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Rc(a,b,c,d){J.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){E.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],
-h=[],k,m,q=new n,v=new C;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);m=0;for(k=3;m<=b;m++,k+=3){var p=c+m/b*d;q.x=a*Math.cos(p);q.y=a*Math.sin(p);f.push(q.x,q.y,q.z);g.push(0,0,1);v.x=(f[k]/a+1)/2;v.y=(f[k+1]/a+1)/2;h.push(v.x,v.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute("position",new B(f,3));this.addAttribute("normal",new B(g,3));this.addAttribute("uv",new B(h,2))}function ac(a){ra.call(this,{uniforms:Ca.merge([R.lights,{opacity:{value:1}}]),vertexShader:X.shadow_vert,
-fragmentShader:X.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}});this.setValues(a)}function bc(a){ra.call(this,a);this.type="RawShaderMaterial"}function Pa(a){U.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new G(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=
-null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=
-!1;this.setValues(a)}function ob(a){Pa.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ja(a){U.call(this);this.type="MeshPhongMaterial";this.color=new G(16777215);this.specular=new G(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=
-1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function pb(a){Ja.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;
-this.setValues(a)}function qb(a){U.call(this);this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function rb(a){U.call(this);this.type="MeshLambertMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=
-1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function sb(a){U.call(this);this.type="LineDashedMaterial";this.color=new G(16777215);this.scale=this.linewidth=1;this.dashSize=
-3;this.gapSize=1;this.lights=!1;this.setValues(a)}function Zd(a,b,c){var d=this,e=!1,f=0,g=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}}function Ka(a){this.manager=void 0!==a?a:va}function Oe(a){this.manager=void 0!==
-a?a:va;this._parser=null}function $d(a){this.manager=void 0!==a?a:va;this._parser=null}function Sc(a){this.manager=void 0!==a?a:va}function ae(a){this.manager=void 0!==a?a:va}function rd(a){this.manager=void 0!==a?a:va}function na(a,b){z.call(this);this.type="Light";this.color=new G(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function sd(a,b,c){na.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(z.DefaultUp);this.updateMatrix();this.groundColor=new G(b)}
-function tb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new K}function td(){tb.call(this,new qa(50,1,.5,500))}function ud(a,b,c,d,e,f){na.call(this,a,b);this.type="SpotLight";this.position.copy(z.DefaultUp);this.updateMatrix();this.target=new z;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=
-void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new td}function vd(a,b,c,d){na.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new tb(new qa(90,1,.5,500))}function wd(){tb.call(this,new Fb(-5,5,5,-5,.5,500))}function xd(a,b){na.call(this,a,b);this.type="DirectionalLight";this.position.copy(z.DefaultUp);this.updateMatrix();
-this.target=new z;this.shadow=new wd}function yd(a,b){na.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function zd(a,b,c,d){na.call(this,a,b);this.type="RectAreaLight";this.position.set(0,1,0);this.updateMatrix();this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function wa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Ad(a,b,c,d){wa.call(this,a,b,c,d);this._offsetNext=
-this._weightNext=this._offsetPrev=this._weightPrev=-0}function Tc(a,b,c,d){wa.call(this,a,b,c,d)}function Bd(a,b,c,d){wa.call(this,a,b,c,d)}function ub(a,b,c,d){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=ia.convertArray(b,this.TimeBufferType);this.values=ia.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function cc(a,b,
-c,d){ub.call(this,a,b,c,d)}function Cd(a,b,c,d){wa.call(this,a,b,c,d)}function Uc(a,b,c,d){ub.call(this,a,b,c,d)}function dc(a,b,c,d){ub.call(this,a,b,c,d)}function Dd(a,b,c,d){ub.call(this,a,b,c,d)}function Ed(a,b,c){ub.call(this,a,b,c)}function Fd(a,b,c,d){ub.call(this,a,b,c,d)}function vb(a,b,c,d){ub.apply(this,arguments)}function Da(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=Y.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Gd(a){this.manager=
-void 0!==a?a:va;this.textures={}}function be(a){this.manager=void 0!==a?a:va}function ec(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ce(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function Pe(a){this.manager=void 0!==a?a:va;this.texturePath=""}function Qe(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*
-c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function wb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function xb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function ua(){this.arcLengthDivisions=200}function Qa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Vc(){this.arcLengthDivisions=200;this.curves=[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=
-f;this.aClockwise=g;this.aRotation=h||0}function yb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function fc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function gc(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Wc(a){Vc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function zb(){Wc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Re(a){this.manager=
-void 0!==a?a:va}function fe(a){this.manager=void 0!==a?a:va}function Se(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new qa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new qa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Hd(a,b,c){z.call(this);this.type="CubeCamera";var d=new qa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new n(1,0,0));this.add(d);var e=new qa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new n(-1,0,0));this.add(e);
-var f=new qa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new n(0,1,0));this.add(f);var g=new qa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new n(0,-1,0));this.add(g);var h=new qa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new n(0,0,1));this.add(h);var k=new qa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new n(0,0,-1));this.add(k);this.renderTarget=new Db(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=
-this.renderTarget,p=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(){z.call(this);this.type="AudioListener";this.context=he.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=
-null}function hc(a){z.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function ie(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function je(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==
-b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function ke(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Te(a,b,c){c=c||ha.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function ha(a,
-b,c){this.path=b;this.parsedPath=c||ha.parseTrackName(b);this.node=ha.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Ue(a){this.uuid=Y.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-
-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Ve(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=
-null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function We(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Id(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function le(){E.call(this);this.type="InstancedBufferGeometry";
-this.maxInstancedCount=void 0}function me(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function ic(a,b){this.uuid=Y.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function ne(a,b,c){ic.call(this,a,b);this.meshPerAttribute=c||1}function oe(a,b,c){Z.call(this,a,b);this.meshPerAttribute=c||1}function Xe(a,b,c,d){this.ray=
-new kb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function Ye(a,b){return a.distance-b.distance}function pe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)pe(a[d],b,c,!0)}}function Ze(a){this.autoStart=void 0!==a?
-a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function $e(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function af(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ta(a,b){la.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation("__default",0,c-1,c/1);this.setAnimationWeight("__default",1)}function Xc(a){z.call(this);
-this.material=a;this.render=function(a){}}function Yc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new E;b=new B(6*b,3);c.addAttribute("position",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function jc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=
-!1;a=new E;for(var b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new B(b,3));b=new ea({fog:!1});this.cone=new Q(a,b);this.add(this.cone);this.update()}function bf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,bf(a.children[c]));return b}function kc(a){for(var b=bf(a),c=new E,d=[],e=[],f=new G(0,
-0,1),g=new G(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position",new B(d,3));c.addAttribute("color",new B(e,3));d=new ea({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});Q.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.onBeforeRender()}function lc(a,b){this.light=a;this.light.updateMatrixWorld();var c=new mb(b,4,2),d=new ya({wireframe:!0,
-fog:!1});d.color.copy(this.light.color);la.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1}function mc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;a=new ea({color:a.color});var b=new E;b.addAttribute("position",new Z(new Float32Array(15),3));this.add(new sa(b,a));this.update()}function nc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;var c=
-new lb(b);c.rotateY(.5*Math.PI);var d=new ya({vertexColors:2,wireframe:!0}),e=c.getAttribute("position"),e=new Float32Array(3*e.count);c.addAttribute("color",new Z(e,3));this.add(new la(c,d));this.update()}function Zc(a,b,c,d){a=a||10;b=b||10;c=new G(void 0!==c?c:4473924);d=new G(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,m=0,q=-g;k<=b;k++,q+=f){a.push(-g,0,q,g,0,q);a.push(q,0,-g,q,0,g);var l=k===e?c:d;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,
-m);m+=3}b=new E;b.addAttribute("position",new B(a,3));b.addAttribute("color",new B(h,3));c=new ea({vertexColors:2});Q.call(this,b,c)}function Jd(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new G(void 0!==e?e:4473924);f=new G(void 0!==f?f:8947848);var g=[],h=[],k,m,q,l,p;for(q=0;q<=b;q++)m=q/b*2*Math.PI,k=Math.sin(m)*a,m=Math.cos(m)*a,g.push(0,0,0),g.push(k,0,m),p=q&1?e:f,h.push(p.r,p.g,p.b),h.push(p.r,p.g,p.b);for(q=0;q<=c;q++)for(p=q&1?e:f,l=a-a/c*q,b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*l,
-m=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*l,m=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b);a=new E;a.addAttribute("position",new B(g,3));a.addAttribute("color",new B(h,3));g=new ea({vertexColors:2});Q.call(this,a,g)}function $c(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");
-c=new E;b=new B(6*b,3);c.addAttribute("position",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function oc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new E;c.addAttribute("position",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new ea({fog:!1});this.add(new sa(c,d));c=new E;c.addAttribute("position",new B([0,0,0,0,0,1],3));this.add(new sa(c,d));this.update()}
-function ad(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new E,e=new ea({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new G(16755200),m=new G(16711680),q=new G(43775),l=new G(16777215),p=new G(3355443);b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);b("n3","f3",k);b("n4","f4",k);b("p","n1",m);b("p",
-"n2",m);b("p","n3",m);b("p","n4",m);b("u1","u2",q);b("u2","u3",q);b("u3","u1",q);b("c","t",l);b("p","c",p);b("cn1","cn2",p);b("cn3","cn4",p);b("cf1","cf2",p);b("cf3","cf4",p);d.addAttribute("position",new B(f,3));d.addAttribute("color",new B(g,3));Q.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Ab(a,b){this.object=a;void 0===b&&(b=16776960);var c=new Uint16Array([0,
-1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new E;e.setIndex(new Z(c,1));e.addAttribute("position",new Z(d,3));Q.call(this,e,new ea({color:b}));this.matrixAutoUpdate=!1;this.update()}function Bb(a,b,c,d,e,f){z.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Kd&&(Kd=new E,Kd.addAttribute("position",new B([0,0,0,0,1,0],3)),qe=new Ua(0,.5,1,5,1),qe.translate(0,-.5,0));this.position.copy(b);this.line=new sa(Kd,new ea({color:d}));
-this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new la(qe,new ya({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function Ld(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new E;a.addAttribute("position",new B(b,3));a.addAttribute("color",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new ea({vertexColors:2});Q.call(this,a,b)}function re(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*
-(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,m,q){e=((f-e)/k-(g-e)/(k+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+q)+(h-g)/q)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function La(a){this.arcLengthDivisions=200;2>a.length&&console.warn("THREE.CatmullRomCurve3: Points array needs at least two entries.");this.points=a||[];this.closed=!1}function bd(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=
-c;this.v3=d}function cd(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function dd(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Md(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}function cf(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom";this.closed=!0}function df(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type=
-"catmullrom"}function se(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});
-void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(xa.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},
-hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var b=b.slice(0),c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var Y={DEG2RAD:Math.PI/180,RAD2DEG:180/
-Math.PI,generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,
-b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*Y.DEG2RAD},radToDeg:function(a){return a*Y.RAD2DEG},isPowerOfTwo:function(a){return 0===
-(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=
-a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},
-subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,
-Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);
-this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||
-1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,
-a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-
-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});var hf=0;ba.DEFAULT_IMAGE=void 0;ba.DEFAULT_MAPPING=300;Object.defineProperty(ba.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ba.prototype,xa.prototype,{constructor:ba,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=
-a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,
-name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=Y.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),g.width=c.width,g.height=
-c.height,g.getContext("2d").drawImage(c,0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL("image/jpeg",.6):g.toDataURL("image/png");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%
-2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(fa.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},
-setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,
-this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,
-b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=
-a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/
-b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781):
-(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,
-a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new fa,b=new fa);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,
-c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):
-Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+
-Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===
-b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Cb.prototype,xa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==
-a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Db.prototype=Object.create(Cb.prototype);
-Db.prototype.constructor=Db;Db.prototype.isWebGLRenderTargetCube=!0;Object.assign(oa,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var p=h*d+k*q+m*l+c*e,r=0<=p?1:-1,n=1-p*p;n>Number.EPSILON&&(n=Math.sqrt(n),p=Math.atan2(n,p*r),f=Math.sin(f*p)/n,g=Math.sin(g*p)/n);r*=g;h=h*f+d*r;k=k*f+q*r;m=m*f+l*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*
-m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(oa.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(oa.prototype,{set:function(a,b,c,d){this._x=
-a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=
-h(d/2),e=h(e/2);"XYZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"YXZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"ZXY"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"ZYX"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"YZX"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):"XZY"===f&&(this._x=c*m*g-
-k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+
-c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new n,b;return function(c,d){void 0===a&&(a=new n);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=
-a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();
-0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,
-k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),
-this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b*k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,
-b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=
-b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;
-return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
-b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new oa;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new oa;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*
-b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*
--g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},
-divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},
-clampScalar:function(){var a=new n,b=new n;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);
-this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*
-this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),
-this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new n;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new n;return function(b){return this.sub(a.copy(b).multiplyScalar(2*
-this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(Y.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*
-a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,
-4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(K.prototype,
-{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,l,p,r,n,t){var y=this.elements;y[0]=a;y[4]=b;y[8]=c;y[12]=d;y[1]=e;y[5]=f;y[9]=g;y[13]=h;y[2]=k;y[6]=m;y[10]=q;y[14]=l;y[3]=p;y[7]=r;y[11]=n;y[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];
-b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new n;return function(b){var c=this.elements,d=b.elements,
-e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),
-h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=q-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*
-d+q,b[1]=g*e,b[5]=q*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=q-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=
-c*g;var m=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new n,b=new n,c=new n;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,
-a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],q=c[5],l=c[9],
-p=c[13],r=c[2],n=c[6],t=c[10],y=c[14],x=c[3],u=c[7],H=c[11],c=c[15],w=d[0],I=d[4],W=d[8],D=d[12],O=d[1],B=d[5],F=d[9],C=d[13],z=d[2],E=d[6],G=d[10],K=d[14],P=d[3],M=d[7],V=d[11],d=d[15];e[0]=f*w+g*O+h*z+k*P;e[4]=f*I+g*B+h*E+k*M;e[8]=f*W+g*F+h*G+k*V;e[12]=f*D+g*C+h*K+k*d;e[1]=m*w+q*O+l*z+p*P;e[5]=m*I+q*B+l*E+p*M;e[9]=m*W+q*F+l*G+p*V;e[13]=m*D+q*C+l*K+p*d;e[2]=r*w+n*O+t*z+y*P;e[6]=r*I+n*B+t*E+y*M;e[10]=r*W+n*F+t*G+y*V;e[14]=r*D+n*C+t*K+y*d;e[3]=x*w+u*O+H*z+c*P;e[7]=x*I+u*B+H*E+c*M;e[11]=x*W+u*F+H*G+
-c*V;e[15]=x*D+u*C+H*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=
-a[1],g=a[5],h=a[9],k=a[13],m=a[2],q=a[6],l=a[10],p=a[14];return a[3]*(+e*h*q-d*k*q-e*g*l+c*k*l+d*g*p-c*h*p)+a[7]*(+b*h*p-b*k*l+e*f*l-d*f*p+d*k*m-e*h*m)+a[11]*(+b*k*q-b*g*p-e*f*q+c*f*p+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*q+b*g*l+d*f*q-c*f*l+c*h*m)},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=this.elements;b[12]=
-a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[1],g=d[2],h=d[3],k=d[4],m=d[5],q=d[6],l=d[7],p=d[8],r=d[9],n=d[10],t=d[11],y=d[12],x=d[13],u=d[14],d=d[15],H=r*u*l-x*n*l+x*q*t-m*u*t-r*q*d+m*n*d,w=y*n*l-p*u*l-y*q*t+k*u*t+p*q*d-k*n*d,I=p*x*l-y*r*l+y*m*t-k*x*t-p*m*d+k*r*d,W=y*r*q-p*x*q-y*m*n+k*x*n+p*m*u-k*r*u,D=e*H+f*w+g*I+h*W;if(0===D){if(!0===b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
-return this.identity()}D=1/D;c[0]=H*D;c[1]=(x*n*h-r*u*h-x*g*t+f*u*t+r*g*d-f*n*d)*D;c[2]=(m*u*h-x*q*h+x*g*l-f*u*l-m*g*d+f*q*d)*D;c[3]=(r*q*h-m*n*h-r*g*l+f*n*l+m*g*t-f*q*t)*D;c[4]=w*D;c[5]=(p*u*h-y*n*h+y*g*t-e*u*t-p*g*d+e*n*d)*D;c[6]=(y*q*h-k*u*h-y*g*l+e*u*l+k*g*d-e*q*d)*D;c[7]=(k*n*h-p*q*h+p*g*l-e*n*l-k*g*t+e*q*t)*D;c[8]=I*D;c[9]=(y*r*h-p*x*h-y*f*t+e*x*t+p*f*d-e*r*d)*D;c[10]=(k*x*h-y*m*h+y*f*l-e*x*l-k*f*d+e*m*d)*D;c[11]=(p*m*h-k*r*h-p*f*l+e*r*l+k*f*t-e*m*t)*D;c[12]=W*D;c[13]=(p*x*g-y*r*g+y*f*n-e*x*
-n-p*f*u+e*r*u)*D;c[14]=(y*m*g-k*x*g-y*f*q+e*x*q+k*f*u-e*m*u)*D;c[15]=(k*r*g-p*m*g+p*f*q-e*r*q-k*f*n+e*m*n)*D;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,
-0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,k=e*f,m=e*g;this.set(k*f+c,k*
-g-d*h,k*h+d*g,0,k*g+d*h,m*g+c,m*h-d*f,0,k*h-d*g,m*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new n,b=new K;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),
-k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
-var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;
-a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});db.prototype=Object.create(ba.prototype);
-db.prototype.constructor=db;db.prototype.isDataTexture=!0;Xa.prototype=Object.create(ba.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Ce=new ba,De=new Xa,xe=[],ze=[],Be=new Float32Array(16),Ae=new Float32Array(9);He.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Pd=/([\w\d_]+)(\])?(\[|\.)?/g;
-eb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};eb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};eb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};eb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,
-beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,
-darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,
-khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,
-mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,
-peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,
-yellow:16776960,yellowgreen:10145074};Object.assign(G.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&
---d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=Y.euclideanModulo(b,1);c=Y.clamp(c,0,1);d=Y.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=
-/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=
-parseFloat(c[1])/360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&
-(c=lg[a],void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},
-convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===
-e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},
-addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,
-b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var R={common:{diffuse:{value:new G(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},
+(function(m,ja){"object"===typeof exports&&"undefined"!==typeof module?ja(exports):"function"===typeof define&&define.amd?define(["exports"],ja):ja(m.THREE=m.THREE||{})})(this,function(m){function ja(){}function C(a,b){this.x=a||0;this.y=b||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Z(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}
+function p(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function ra(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function ea(a,b,c,d,e,f,g,h,k,l){Object.defineProperty(this,"id",{value:kf++});this.uuid=R.generateUUID();this.name="";this.image=void 0!==a?a:ea.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ea.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=
+void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.center=new C(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ra;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==l?l:3E3;this.version=0;this.onUpdate=null}function da(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Hb(a,
+b,c){this.uuid=R.generateUUID();this.width=a;this.height=b;this.scissor=new da(0,0,a,b);this.scissorTest=!1;this.viewport=new da(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ea(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Ib(a,b,c){Hb.call(this,
+a,b,c);this.activeMipMapLevel=this.activeCubeFace=0}function fb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==l?l:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Ua(a,b,c,d,e,f,g,h,k,l){a=void 0!==a?a:[];ea.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,l);this.flipY=!1}function Jb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=we[e];void 0===f&&(f=new Float32Array(e),
+we[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function xe(a,b){var c=ye[b];void 0===c&&(c=new Int32Array(b),ye[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function lf(a,b){a.uniform1f(this.addr,b)}function mf(a,b){a.uniform1i(this.addr,b)}function nf(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function of(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,
+b)}function pf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function qf(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function rf(a,b){void 0===b.elements?a.uniformMatrix3fv(this.addr,!1,b):(ze.set(b.elements),a.uniformMatrix3fv(this.addr,!1,ze))}function sf(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Ae.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Ae))}function tf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||
+Be,d)}function uf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||Ce,d)}function De(a,b){a.uniform2iv(this.addr,b)}function Ee(a,b){a.uniform3iv(this.addr,b)}function Fe(a,b){a.uniform4iv(this.addr,b)}function vf(a){switch(a){case 5126:return lf;case 35664:return nf;case 35665:return of;case 35666:return pf;case 35674:return qf;case 35675:return rf;case 35676:return sf;case 35678:case 36198:return tf;case 35680:return uf;case 5124:case 35670:return mf;case 35667:case 35671:return De;
+case 35668:case 35672:return Ee;case 35669:case 35673:return Fe}}function wf(a,b){a.uniform1fv(this.addr,b)}function xf(a,b){a.uniform1iv(this.addr,b)}function yf(a,b){a.uniform2fv(this.addr,Jb(b,this.size,2))}function zf(a,b){a.uniform3fv(this.addr,Jb(b,this.size,3))}function Af(a,b){a.uniform4fv(this.addr,Jb(b,this.size,4))}function Bf(a,b){a.uniformMatrix2fv(this.addr,!1,Jb(b,this.size,4))}function Cf(a,b){a.uniformMatrix3fv(this.addr,!1,Jb(b,this.size,9))}function Df(a,b){a.uniformMatrix4fv(this.addr,
+!1,Jb(b,this.size,16))}function Ef(a,b,c){var d=b.length,e=xe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||Be,e[a])}function Ff(a,b,c){var d=b.length,e=xe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||Ce,e[a])}function Gf(a){switch(a){case 5126:return wf;case 35664:return yf;case 35665:return zf;case 35666:return Af;case 35674:return Bf;case 35675:return Cf;case 35676:return Df;case 35678:return Ef;case 35680:return Ff;case 5124:case 35670:return xf;
+case 35667:case 35671:return De;case 35668:case 35672:return Ee;case 35669:case 35673:return Fe}}function Hf(a,b,c){this.id=a;this.addr=c;this.setValue=vf(b.type)}function If(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Gf(b.type)}function Ge(a){this.id=a;this.seq=[];this.map={}}function gb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=
+h.length;for(Od.lastIndex=0;;){var l=Od.exec(h),q=Od.lastIndex,n=l[1],t=l[3];"]"===l[2]&&(n|=0);if(void 0===t||"["===t&&q+2===k){h=g;e=void 0===t?new Hf(n,e,f):new If(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else t=g.map[n],void 0===t&&(t=new Ge(n),n=g,g=t,n.seq.push(g),n.map[g.id]=g),g=t}}}function H(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function kd(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function Jf(a,b,c,
+d,e){var f,g,h,k,l,q,n,t,r,m,v,w,x,z,I,B;this.render=function(a,u,za,la){if(0!==a.length){u=new p;var J=la.w/la.z,ta=.5*la.z,Va=.5*la.w,L=16/la.w,Y=new C(L*J,L),ua=new p(1,1,0),M=new C(1,1),V=new kd;V.min.set(la.x,la.y);V.max.set(la.x+(la.z-16),la.y+(la.w-16));if(void 0===z){var L=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),y=new Uint16Array([0,1,2,0,2,3]);v=b.createBuffer();w=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,v);b.bufferData(b.ARRAY_BUFFER,L,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
+w);b.bufferData(b.ELEMENT_ARRAY_BUFFER,y,b.STATIC_DRAW);I=b.createTexture();B=b.createTexture();c.bindTexture(b.TEXTURE_2D,I);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);c.bindTexture(b.TEXTURE_2D,B);b.texImage2D(b.TEXTURE_2D,0,
+b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);var L=x={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\n\tvUV = uv;\n\tvec2 pos = position;\n\tif ( renderType == 2 ) {\n\t\tvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\n\t\tvVisibility =        visibility.r / 9.0;\n\t\tvVisibility *= 1.0 - visibility.g / 9.0;\n\t\tvVisibility *=       visibility.b / 9.0;\n\t\tvVisibility *= 1.0 - visibility.a / 9.0;\n\t\tpos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\n\t\tpos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n\t}\n\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
+fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\n\tif ( renderType == 0 ) {\n\t\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n\t} else if ( renderType == 1 ) {\n\t\tgl_FragColor = texture2D( map, vUV );\n\t} else {\n\t\tvec4 texture = texture2D( map, vUV );\n\t\ttexture.a *= opacity * vVisibility;\n\t\tgl_FragColor = texture;\n\t\tgl_FragColor.rgb *= color;\n\t}\n}"},y=b.createProgram(),
+A=b.createShader(b.FRAGMENT_SHADER),aa=b.createShader(b.VERTEX_SHADER),D="precision "+e.precision+" float;\n";b.shaderSource(A,D+L.fragmentShader);b.shaderSource(aa,D+L.vertexShader);b.compileShader(A);b.compileShader(aa);b.attachShader(y,A);b.attachShader(y,aa);b.linkProgram(y);z=y;r=b.getAttribLocation(z,"position");m=b.getAttribLocation(z,"uv");f=b.getUniformLocation(z,"renderType");g=b.getUniformLocation(z,"map");h=b.getUniformLocation(z,"occlusionMap");k=b.getUniformLocation(z,"opacity");l=b.getUniformLocation(z,
+"color");q=b.getUniformLocation(z,"scale");n=b.getUniformLocation(z,"rotation");t=b.getUniformLocation(z,"screenPosition")}c.useProgram(z);c.initAttributes();c.enableAttribute(r);c.enableAttribute(m);c.disableUnusedAttributes();b.uniform1i(h,0);b.uniform1i(g,1);b.bindBuffer(b.ARRAY_BUFFER,v);b.vertexAttribPointer(r,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(m,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,w);c.disable(b.CULL_FACE);c.buffers.depth.setMask(!1);y=0;for(A=a.length;y<A;y++)if(L=
+16/la.w,Y.set(L*J,L),aa=a[y],u.set(aa.matrixWorld.elements[12],aa.matrixWorld.elements[13],aa.matrixWorld.elements[14]),u.applyMatrix4(za.matrixWorldInverse),u.applyMatrix4(za.projectionMatrix),ua.copy(u),M.x=la.x+ua.x*ta+ta-8,M.y=la.y+ua.y*Va+Va-8,!0===V.containsPoint(M)){c.activeTexture(b.TEXTURE0);c.bindTexture(b.TEXTURE_2D,null);c.activeTexture(b.TEXTURE1);c.bindTexture(b.TEXTURE_2D,I);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,M.x,M.y,16,16,0);b.uniform1i(f,0);b.uniform2f(q,Y.x,Y.y);b.uniform3f(t,
+ua.x,ua.y,ua.z);c.disable(b.BLEND);c.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);c.activeTexture(b.TEXTURE0);c.bindTexture(b.TEXTURE_2D,B);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,M.x,M.y,16,16,0);b.uniform1i(f,1);c.disable(b.DEPTH_TEST);c.activeTexture(b.TEXTURE1);c.bindTexture(b.TEXTURE_2D,I);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);aa.positionScreen.copy(ua);aa.customUpdateCallback?aa.customUpdateCallback(aa):aa.updateLensFlares();b.uniform1i(f,2);c.enable(b.BLEND);
+for(var D=0,H=aa.lensFlares.length;D<H;D++){var E=aa.lensFlares[D];.001<E.opacity&&.001<E.scale&&(ua.x=E.x,ua.y=E.y,ua.z=E.z,L=E.size*E.scale/la.w,Y.x=L*J,Y.y=L,b.uniform3f(t,ua.x,ua.y,ua.z),b.uniform2f(q,Y.x,Y.y),b.uniform1f(n,E.rotation),b.uniform1f(k,E.opacity),b.uniform3f(l,E.color.r,E.color.g,E.color.b),c.setBlending(E.blending,E.blendEquation,E.blendSrc,E.blendDst),d.setTexture2D(E.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0))}}c.enable(b.CULL_FACE);c.enable(b.DEPTH_TEST);c.buffers.depth.setMask(!0);
+c.reset()}}}function tc(a,b,c,d,e,f,g,h,k){ea.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Kf(a,b,c,d,e){var f,g,h,k,l,q,n,t,r,m,v,w,x,z,I,B,J;function ta(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var za,la,ha,He,Va=new p,L=new Z,C=new p;this.render=function(u,p,V){if(0!==u.length){if(void 0===ha){var M=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),y=new Uint16Array([0,1,2,0,2,3]);za=b.createBuffer();la=b.createBuffer();
+b.bindBuffer(b.ARRAY_BUFFER,za);b.bufferData(b.ARRAY_BUFFER,M,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.bufferData(b.ELEMENT_ARRAY_BUFFER,y,b.STATIC_DRAW);M=b.createProgram();y=b.createShader(b.VERTEX_SHADER);var Y=b.createShader(b.FRAGMENT_SHADER);b.shaderSource(y,["precision "+e.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvUV = uvOffset + uv * uvScale;\n\tvec2 alignedPosition = position * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\tfogDepth = - mvPosition.z;\n}"].join("\n"));
+b.shaderSource(Y,["precision "+e.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvec4 texture = texture2D( map, vUV );\n\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\n\tif ( gl_FragColor.a < alphaTest ) discard;\n\tif ( fogType > 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n"));
+b.compileShader(y);b.compileShader(Y);b.attachShader(M,y);b.attachShader(M,Y);b.linkProgram(M);ha=M;B=b.getAttribLocation(ha,"position");J=b.getAttribLocation(ha,"uv");f=b.getUniformLocation(ha,"uvOffset");g=b.getUniformLocation(ha,"uvScale");h=b.getUniformLocation(ha,"rotation");k=b.getUniformLocation(ha,"scale");l=b.getUniformLocation(ha,"color");q=b.getUniformLocation(ha,"map");n=b.getUniformLocation(ha,"opacity");t=b.getUniformLocation(ha,"modelViewMatrix");r=b.getUniformLocation(ha,"projectionMatrix");
+m=b.getUniformLocation(ha,"fogType");v=b.getUniformLocation(ha,"fogDensity");w=b.getUniformLocation(ha,"fogNear");x=b.getUniformLocation(ha,"fogFar");z=b.getUniformLocation(ha,"fogColor");b.getUniformLocation(ha,"fogDepth");I=b.getUniformLocation(ha,"alphaTest");M=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");M.width=8;M.height=8;y=M.getContext("2d");y.fillStyle="white";y.fillRect(0,0,8,8);He=new tc(M)}c.useProgram(ha);c.initAttributes();c.enableAttribute(B);c.enableAttribute(J);
+c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,za);b.vertexAttribPointer(B,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(J,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.uniformMatrix4fv(r,!1,V.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(q,0);y=M=0;(Y=p.fog)?(b.uniform3f(z,Y.color.r,Y.color.g,Y.color.b),Y.isFog?(b.uniform1f(w,Y.near),b.uniform1f(x,Y.far),b.uniform1i(m,1),y=M=1):Y.isFogExp2&&(b.uniform1f(v,Y.density),
+b.uniform1i(m,2),y=M=2)):(b.uniform1i(m,0),y=M=0);for(var A=0,ua=u.length;A<ua;A++)Y=u[A],Y.modelViewMatrix.multiplyMatrices(V.matrixWorldInverse,Y.matrixWorld),Y.z=-Y.modelViewMatrix.elements[14];u.sort(ta);for(var E=[],A=0,ua=u.length;A<ua;A++){Y=u[A];var G=Y.material;if(!1!==G.visible){Y.onBeforeRender(a,p,V,void 0,G,void 0);b.uniform1f(I,G.alphaTest);b.uniformMatrix4fv(t,!1,Y.modelViewMatrix.elements);Y.matrixWorld.decompose(Va,L,C);E[0]=C.x;E[1]=C.y;var D=0;p.fog&&G.fog&&(D=y);M!==D&&(b.uniform1i(m,
+D),M=D);null!==G.map?(b.uniform2f(f,G.map.offset.x,G.map.offset.y),b.uniform2f(g,G.map.repeat.x,G.map.repeat.y)):(b.uniform2f(f,0,0),b.uniform2f(g,1,1));b.uniform1f(n,G.opacity);b.uniform3f(l,G.color.r,G.color.g,G.color.b);b.uniform1f(h,G.rotation);b.uniform2fv(k,E);c.setBlending(G.blending,G.blendEquation,G.blendSrc,G.blendDst,G.blendEquationAlpha,G.blendSrcAlpha,G.blendDstAlpha,G.premultipliedAlpha);c.buffers.depth.setTest(G.depthTest);c.buffers.depth.setMask(G.depthWrite);c.buffers.color.setMask(G.colorWrite);
+d.setTexture2D(G.map||He,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);Y.onAfterRender(a,p,V,void 0,G,void 0)}}c.enable(b.CULL_FACE);c.reset()}}}function Q(){Object.defineProperty(this,"id",{value:Lf++});this.uuid=R.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.flatShading=!1;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=
+null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.visible=!0;this.userData={};this.needsUpdate=!0}function Wa(a){Q.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=
+this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Xa(a){Q.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Oa(a,b){this.min=void 0!==
+a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new p(-Infinity,-Infinity,-Infinity)}function Da(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:0}function Aa(a,b){this.normal=void 0!==a?a:new p(1,0,0);this.constant=void 0!==b?b:0}function ld(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Aa,void 0!==b?b:new Aa,void 0!==c?c:new Aa,void 0!==d?d:new Aa,void 0!==e?e:new Aa,void 0!==f?f:new Aa]}function Ie(a,b,c){function d(b,c,d,e,f,g){var h=b.geometry;var k=n;var l=b.customDepthMaterial;
+d&&(k=t,l=b.customDistanceMaterial);l?k=l:(l=!1,c.morphTargets&&(h&&h.isBufferGeometry?l=h.morphAttributes&&h.morphAttributes.position&&0<h.morphAttributes.position.length:h&&h.isGeometry&&(l=h.morphTargets&&0<h.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b),b=b.isSkinnedMesh&&c.skinning,h=0,l&&(h|=1),b&&(h|=2),k=k[h]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(h=
+k.uuid,l=c.uuid,b=r[h],void 0===b&&(b={},r[h]=b),h=b[l],void 0===h&&(h=k.clone(),b[l]=h),k=h);k.visible=c.visible;k.wireframe=c.wireframe;l=c.side;B.renderSingleSided&&2==l&&(l=0);B.renderReverseSided&&(0===l?l=1:1===l&&(l=0));k.side=l;k.clipShadows=c.clipShadows;k.clippingPlanes=c.clippingPlanes;k.clipIntersection=c.clipIntersection;k.wireframeLinewidth=c.wireframeLinewidth;k.linewidth=c.linewidth;d&&k.isMeshDistanceMaterial&&(k.referencePosition.copy(e),k.nearDistance=f,k.farDistance=g);return k}
+function e(c,g,h,k){var l;if(!1!==c.visible){if(c.layers.test(g.layers)&&(c.isMesh||c.isLine||c.isPoints)&&c.castShadow&&(!c.frustumCulled||f.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(h.matrixWorldInverse,c.matrixWorld);var n=b.update(c),t=c.material;if(Array.isArray(t))for(var r=n.groups,m=0,z=r.length;m<z;m++){var u=r[m];(l=t[u.materialIndex])&&l.visible&&(l=d(c,l,k,q,h.near,h.far),a.renderBufferDirect(h,null,n,l,c,u))}else t.visible&&(l=d(c,t,k,q,h.near,h.far),a.renderBufferDirect(h,
+null,n,l,c,null))}c=c.children;n=0;for(t=c.length;n<t;n++)e(c[n],g,h,k)}}var f=new ld,g=new K,h=new C,k=new C(c,c),l=new p,q=new p,n=Array(4),t=Array(4),r={},m=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)],v=[new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)],w=[new da,new da,new da,new da,new da,new da];for(c=0;4!==c;++c){var x=0!==(c&1),z=0!==(c&2),I=new Wa({depthPacking:3201,morphTargets:x,skinning:z});n[c]=I;x=new Xa({morphTargets:x,
+skinning:z});t[c]=x}var B=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,c,d){if(!1!==B.enabled&&(!1!==B.autoUpdate||!1!==B.needsUpdate)&&0!==b.length){var n=a.state;n.disable(a.context.BLEND);n.buffers.color.setClear(1,1,1,1);n.buffers.depth.setTest(!0);n.setScissorTest(!1);for(var t,r=0,z=b.length;r<z;r++){var u=b[r];t=u.shadow;var I=u&&u.isPointLight;if(void 0===t)console.warn("THREE.WebGLShadowMap:",
+u,"has no shadow.");else{var p=t.camera;h.copy(t.mapSize);h.min(k);if(I){var x=h.x,J=h.y;w[0].set(2*x,J,x,J);w[1].set(0,J,x,J);w[2].set(3*x,J,x,J);w[3].set(x,J,x,J);w[4].set(3*x,0,x,J);w[5].set(x,0,x,J);h.x*=4;h.y*=2}null===t.map&&(t.map=new Hb(h.x,h.y,{minFilter:1003,magFilter:1003,format:1023}),t.map.texture.name=u.name+".shadowMap",p.updateProjectionMatrix());t.isSpotLightShadow&&t.update(u);x=t.map;J=t.matrix;q.setFromMatrixPosition(u.matrixWorld);p.position.copy(q);I?(t=6,J.makeTranslation(-q.x,
+-q.y,-q.z)):(t=1,l.setFromMatrixPosition(u.target.matrixWorld),p.lookAt(l),p.updateMatrixWorld(),J.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),J.multiply(p.projectionMatrix),J.multiply(p.matrixWorldInverse));a.setRenderTarget(x);a.clear();for(u=0;u<t;u++)I&&(l.copy(p.position),l.add(m[u]),p.up.copy(v[u]),p.lookAt(l),p.updateMatrixWorld(),n.viewport(w[u])),g.multiplyMatrices(p.projectionMatrix,p.matrixWorldInverse),f.setFromMatrix(g),e(c,d,p,I)}}B.needsUpdate=!1}}}function Mf(a){var b={};return{get:function(a){a.isInterleavedBufferAttribute&&
+(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){var e=c.uuid,f=c.array,g=c.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW,h=a.createBuffer();a.bindBuffer(d,h);a.bufferData(d,f,g);c.onUploadCallback();d=a.FLOAT;f instanceof Float32Array?d=a.FLOAT:f instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):
+f instanceof Uint16Array?d=a.UNSIGNED_SHORT:f instanceof Int16Array?d=a.SHORT:f instanceof Uint32Array?d=a.UNSIGNED_INT:f instanceof Int32Array?d=a.INT:f instanceof Int8Array?d=a.BYTE:f instanceof Uint8Array&&(d=a.UNSIGNED_BYTE);b[e]={buffer:h,type:d,bytesPerElement:f.BYTES_PER_ELEMENT,version:c.version}}else e.version<c.version&&(f=c,h=f.array,g=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic?a.bufferData(d,h,a.STATIC_DRAW):-1===g.count?a.bufferSubData(d,0,h):0===g.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):
+(a.bufferSubData(d,g.offset*h.BYTES_PER_ELEMENT,h.subarray(g.offset,g.offset+g.count)),g.count=-1),e.version=c.version)}}}function Ya(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Ya.DefaultOrder}function Pd(){this.mask=1}function A(){Object.defineProperty(this,"id",{value:Nf++});this.uuid=R.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=A.DefaultUp.clone();var a=new p,b=new Ya,c=new Z,d=new p(1,1,1);b.onChange(function(){c.setFromEuler(b,
+!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new K},normalMatrix:{value:new ra}});this.matrix=new K;this.matrixWorld=new K;this.matrixAutoUpdate=A.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Pd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=
+0;this.userData={}}function La(){A.call(this);this.type="Camera";this.matrixWorldInverse=new K;this.projectionMatrix=new K}function Kb(a,b,c,d,e,f){La.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function Pa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?
+e:new H;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function N(){Object.defineProperty(this,"id",{value:Of+=2});this.uuid=R.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=
+this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function P(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=R.generateUUID();this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function uc(a,b,c){P.call(this,new Int8Array(a),b,c)}function vc(a,b,c){P.call(this,new Uint8Array(a),
+b,c)}function wc(a,b,c){P.call(this,new Uint8ClampedArray(a),b,c)}function xc(a,b,c){P.call(this,new Int16Array(a),b,c)}function hb(a,b,c){P.call(this,new Uint16Array(a),b,c)}function yc(a,b,c){P.call(this,new Int32Array(a),b,c)}function ib(a,b,c){P.call(this,new Uint32Array(a),b,c)}function y(a,b,c){P.call(this,new Float32Array(a),b,c)}function zc(a,b,c){P.call(this,new Float64Array(a),b,c)}function Je(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=
+[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Qd(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function D(){Object.defineProperty(this,"id",{value:Pf+=2});this.uuid=R.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes=
+{};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Lb(a,b,c,d,e,f){N.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new jb(a,b,c,d,e,f));this.mergeVertices()}function jb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,m,ta,za,la){var z=f/ta,u=g/za,v=f/2,w=g/2,I=m/2;g=ta+1;var B=za+1,x=f=0,J,y,C=new p;for(y=0;y<B;y++){var A=y*u-w;for(J=0;J<g;J++)C[a]=
+(J*z-v)*d,C[b]=A*e,C[c]=I,l.push(C.x,C.y,C.z),C[a]=0,C[b]=0,C[c]=0<m?1:-1,q.push(C.x,C.y,C.z),n.push(J/ta),n.push(1-y/za),f+=1}for(y=0;y<za;y++)for(J=0;J<ta;J++)a=t+J+g*(y+1),b=t+(J+1)+g*(y+1),c=t+(J+1)+g*y,k.push(t+J+g*y,a,c),k.push(a,b,c),x+=6;h.addGroup(r,x,la);r+=x;t+=f}D.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;a=a||1;b=b||1;c=c||1;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=
+[],l=[],q=[],n=[],t=0,r=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute("position",new y(l,3));this.addAttribute("normal",new y(q,3));this.addAttribute("uv",new y(n,2))}function Ac(a,b,c,d){N.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new kb(a,
+b,c,d));this.mergeVertices()}function kb(a,b,c,d){D.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,l=b/d,q=[],n=[],t=[],r=[];for(a=0;a<h;a++){var m=a*l-f;for(b=0;b<g;b++)n.push(b*k-e,-m,0),t.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute("position",
+new y(n,3));this.addAttribute("normal",new y(t,3));this.addAttribute("uv",new y(r,2))}function va(a){Q.call(this);this.type="MeshBasicMaterial";this.color=new H(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=
+!1;this.setValues(a)}function oa(a){Q.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,
+drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function lb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p}function Mb(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function Qa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==
+b?b:new p;this.c=void 0!==c?c:new p}function pa(a,b){A.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new va({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Qf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new H(0),g=0,h,k,l;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,
+g)},render:function(b,d,t,r){d=d.background;null===d?e(f,g):d&&d.isColor&&(e(d,1),r=!0);(a.autoClear||r)&&a.clear(a.autoClearColor,a.autoClearDepth,a.autoClearStencil);d&&d.isCubeTexture?(void 0===l&&(l=new pa(new jb(1,1,1),new oa({uniforms:mb.cube.uniforms,vertexShader:mb.cube.vertexShader,fragmentShader:mb.cube.fragmentShader,side:1,depthTest:!0,depthWrite:!1,fog:!1})),l.geometry.removeAttribute("normal"),l.geometry.removeAttribute("uv"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},
+c.update(l.geometry)),l.material.uniforms.tCube.value=d,b.push(l,l.geometry,l.material,0,null)):d&&d.isTexture&&(void 0===h&&(h=new Kb(-1,1,1,-1,0,1),k=new pa(new kb(2,2),new va({depthTest:!1,depthWrite:!1,fog:!1})),c.update(k.geometry)),k.material.map=d,a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Rf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-
+b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Sf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Tf(){var a=[],b=0,c=[],d=[];return{opaque:c,transparent:d,init:function(){b=0;c.length=0;d.length=0},push:function(e,f,g,h,k){var l=a[b];void 0===l?(l={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},a[b]=l):(l.id=e.id,l.object=e,l.geometry=f,l.material=g,l.program=g.program,l.renderOrder=e.renderOrder,
+l.z=h,l.group=k);(!0===g.transparent?d:c).push(l);b++},sort:function(){1<c.length&&c.sort(Rf);1<d.length&&d.sort(Sf)}}}function Uf(){var a={};return{get:function(b,c){b=b.id+","+c.id;c=a[b];void 0===c&&(c=new Tf,a[b]=c);return c},dispose:function(){a={}}}}function Vf(a,b){return Math.abs(b[1])-Math.abs(a[1])}function Wf(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,k=h.length;d=b[e.id];if(void 0===d){d=[];for(var l=0;l<k;l++)d[l]=[l,0];b[e.id]=d}var q=
+f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(l=0;l<k;l++){var n=d[l];0!==n[1]&&(q&&e.removeAttribute("morphTarget"+l),f&&e.removeAttribute("morphNormal"+l))}for(l=0;l<k;l++)n=d[l],n[0]=l,n[1]=h[l];d.sort(Vf);for(l=0;8>l;l++){if(n=d[l])if(h=n[0],n=n[1]){q&&e.addAttribute("morphTarget"+l,q[h]);f&&e.addAttribute("morphNormal"+l,f[h]);c[l]=n;continue}c[l]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Xf(a,b,c){var d,e,f;this.setMode=function(a){d=
+a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES?c.faces+=h/3:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var l=b.get("ANGLE_instanced_arrays");null===l?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(l.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=
+k*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function Yf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES?c.faces+=f/3:d===a.POINTS&&(c.points+=f)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
+else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES?c.faces+=e.maxInstancedCount*g/3:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function Zf(a,b,c){function d(a){a=a.target;var g=e[a.id];null!==g.index&&b.remove(g.index);for(var k in g.attributes)b.remove(g.attributes[k]);a.removeEventListener("dispose",
+d);delete e[a.id];if(k=f[a.id])b.remove(k),delete f[a.id];if(k=f[g.id])b.remove(k),delete f[g.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new D).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],
+a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=c[f],e=0,g=d.length;e<g;e++)b.update(d[e],a.ARRAY_BUFFER)},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;d=[];var e=c.index;var g=c.attributes;if(null!==e){var q=e.array;for(var n=0,t=q.length;n<t;n+=3){var r=q[n+0];g=q[n+1];e=q[n+2];d.push(r,g,g,e,e,r)}}else for(q=g.position.array,n=0,t=q.length/3-1;n<t;n+=3)r=n+0,g=n+1,e=n+2,d.push(r,g,g,e,e,r);d=new (65535<Qd(d)?ib:hb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=
+d}}}function $f(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new p,color:new H,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "SpotLight":c={position:new p,direction:new p,color:new H,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "PointLight":c={position:new p,color:new H,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C,
+shadowCameraNear:1,shadowCameraFar:1E3};break;case "HemisphereLight":c={direction:new p,skyColor:new H,groundColor:new H};break;case "RectAreaLight":c={color:new H,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function ag(){var a=new $f,b={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},c=new p,d=new K,e=new K;return{setup:function(f,
+g,h){for(var k,l=0,q=0,n=0,t=0,r=0,m=0,v=0,w=0,p=h.matrixWorldInverse,z=0,I=f.length;z<I;z++){var B=f[z];k=B.color;var J=B.intensity,ta=B.distance,za=B.shadow&&B.shadow.map?B.shadow.map.texture:null;if(B.isAmbientLight)l+=k.r*J,q+=k.g*J,n+=k.b*J;else if(B.isDirectionalLight){h=a.get(B);h.color.copy(B.color).multiplyScalar(B.intensity);h.direction.setFromMatrixPosition(B.matrixWorld);c.setFromMatrixPosition(B.target.matrixWorld);h.direction.sub(c);h.direction.transformDirection(p);if(h.shadow=B.castShadow)k=
+B.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize;b.directionalShadowMap[t]=za;b.directionalShadowMatrix[t]=B.shadow.matrix;b.directional[t]=h;t++}else if(B.isSpotLight){h=a.get(B);h.position.setFromMatrixPosition(B.matrixWorld);h.position.applyMatrix4(p);h.color.copy(k).multiplyScalar(J);h.distance=ta;h.direction.setFromMatrixPosition(B.matrixWorld);c.setFromMatrixPosition(B.target.matrixWorld);h.direction.sub(c);h.direction.transformDirection(p);h.coneCos=Math.cos(B.angle);
+h.penumbraCos=Math.cos(B.angle*(1-B.penumbra));h.decay=0===B.distance?0:B.decay;if(h.shadow=B.castShadow)k=B.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize;b.spotShadowMap[m]=za;b.spotShadowMatrix[m]=B.shadow.matrix;b.spot[m]=h;m++}else if(B.isRectAreaLight)h=a.get(B),h.color.copy(k).multiplyScalar(J/(B.width*B.height)),h.position.setFromMatrixPosition(B.matrixWorld),h.position.applyMatrix4(p),e.identity(),d.copy(B.matrixWorld),d.premultiply(p),e.extractRotation(d),h.halfWidth.set(.5*
+B.width,0,0),h.halfHeight.set(0,.5*B.height,0),h.halfWidth.applyMatrix4(e),h.halfHeight.applyMatrix4(e),b.rectArea[v]=h,v++;else if(B.isPointLight){h=a.get(B);h.position.setFromMatrixPosition(B.matrixWorld);h.position.applyMatrix4(p);h.color.copy(B.color).multiplyScalar(B.intensity);h.distance=B.distance;h.decay=0===B.distance?0:B.decay;if(h.shadow=B.castShadow)k=B.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize,h.shadowCameraNear=k.camera.near,h.shadowCameraFar=k.camera.far;
+b.pointShadowMap[r]=za;b.pointShadowMatrix[r]=B.shadow.matrix;b.point[r]=h;r++}else B.isHemisphereLight&&(h=a.get(B),h.direction.setFromMatrixPosition(B.matrixWorld),h.direction.transformDirection(p),h.direction.normalize(),h.skyColor.copy(B.color).multiplyScalar(J),h.groundColor.copy(B.groundColor).multiplyScalar(J),b.hemi[w]=h,w++)}b.ambient[0]=l;b.ambient[1]=q;b.ambient[2]=n;b.directional.length=t;b.spot.length=m;b.rectArea.length=v;b.point.length=r;b.hemi.length=w;b.hash=t+","+r+","+m+","+v+","+
+w+","+g.length},state:b}}function bg(a,b){var c={};return{update:function(d){var e=b.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},clear:function(){c={}}}}function cg(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");
+""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),cg(c));return d}function Le(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+
+a);}}function Rd(a,b){b=Le(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function dg(a,b){b=Le(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function eg(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function fg(a,b,c){a=a||{};return[a.derivatives||
+b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Bc).join("\n")}function gg(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+
+c+" "+d)}return b.join("\n")}function Bc(a){return""!==a}function Me(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Sd(a){return a.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(a,c){a=W[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Sd(a)})}function Ne(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,
+function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function hg(a,b,c,d,e,f){var g=a.context,h=d.defines,k=e.vertexShader,l=e.fragmentShader,q="SHADOWMAP_TYPE_BASIC";1===f.shadowMapType?q="SHADOWMAP_TYPE_PCF":2===f.shadowMapType&&(q="SHADOWMAP_TYPE_PCF_SOFT");var n="ENVMAP_TYPE_CUBE",t="ENVMAP_MODE_REFLECTION",r="ENVMAP_BLENDING_MULTIPLY";if(f.envMap){switch(d.envMap.mapping){case 301:case 302:n="ENVMAP_TYPE_CUBE";break;case 306:case 307:n="ENVMAP_TYPE_CUBE_UV";
+break;case 303:case 304:n="ENVMAP_TYPE_EQUIREC";break;case 305:n="ENVMAP_TYPE_SPHERE"}switch(d.envMap.mapping){case 302:case 304:t="ENVMAP_MODE_REFRACTION"}switch(d.combine){case 0:r="ENVMAP_BLENDING_MULTIPLY";break;case 1:r="ENVMAP_BLENDING_MIX";break;case 2:r="ENVMAP_BLENDING_ADD"}}var m=0<a.gammaFactor?a.gammaFactor:1,v=fg(d.extensions,f,b),w=gg(h),p=g.createProgram();d.isRawShaderMaterial?(h=[w].filter(Bc).join("\n"),0<h.length&&(h+="\n"),b=[v,w].filter(Bc).join("\n"),0<b.length&&(b+="\n")):(h=
+["precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,w,f.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+m,"#define MAX_BONES "+f.maxBones,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+t:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":
+"",f.normalMap?"#define USE_NORMALMAP":"",f.displacementMap&&f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&&
+!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+f.numClippingPlanes,f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+q:"",f.sizeAttenuation?"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&b.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;",
+"uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;",
+"\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Bc).join("\n"),b=[v,"precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,w,f.alphaTest?"#define ALPHATEST "+f.alphaTest:
+"","#define GAMMA_FACTOR "+m,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+n:"",f.envMap?"#define "+t:"",f.envMap?"#define "+r:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":
+"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.gradientMap?"#define USE_GRADIENTMAP":"",f.flatShading?"#define FLAT_SHADED":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+f.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(f.numClippingPlanes-f.numClipIntersection),f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+q:"",f.premultipliedAlpha?
+"#define PREMULTIPLIED_ALPHA":"",f.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&b.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",f.envMap&&b.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==f.toneMapping?"#define TONE_MAPPING":"",0!==f.toneMapping?W.tonemapping_pars_fragment:"",0!==f.toneMapping?eg("toneMapping",f.toneMapping):
+"",f.dithering?"#define DITHERING":"",f.outputEncoding||f.mapEncoding||f.envMapEncoding||f.emissiveMapEncoding?W.encodings_pars_fragment:"",f.mapEncoding?Rd("mapTexelToLinear",f.mapEncoding):"",f.envMapEncoding?Rd("envMapTexelToLinear",f.envMapEncoding):"",f.emissiveMapEncoding?Rd("emissiveMapTexelToLinear",f.emissiveMapEncoding):"",f.outputEncoding?dg("linearToOutputTexel",f.outputEncoding):"",f.depthPacking?"#define DEPTH_PACKING "+d.depthPacking:"","\n"].filter(Bc).join("\n"));k=Sd(k);k=Me(k,f);
+l=Sd(l);l=Me(l,f);d.isShaderMaterial||(k=Ne(k),l=Ne(l));l=b+l;k=Ke(g,g.VERTEX_SHADER,h+k);l=Ke(g,g.FRAGMENT_SHADER,l);g.attachShader(p,k);g.attachShader(p,l);void 0!==d.index0AttributeName?g.bindAttribLocation(p,0,d.index0AttributeName):!0===f.morphTargets&&g.bindAttribLocation(p,0,"position");g.linkProgram(p);f=g.getProgramInfoLog(p);e=g.getShaderInfoLog(k);q=g.getShaderInfoLog(l);t=n=!0;if(!1===g.getProgramParameter(p,g.LINK_STATUS))n=!1,console.error("THREE.WebGLProgram: shader error: ",g.getError(),
+"gl.VALIDATE_STATUS",g.getProgramParameter(p,g.VALIDATE_STATUS),"gl.getProgramInfoLog",f,e,q);else if(""!==f)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",f);else if(""===e||""===q)t=!1;t&&(this.diagnostics={runnable:n,material:d,programLog:f,vertexShader:{log:e,prefix:h},fragmentShader:{log:q,prefix:b}});g.deleteShader(k);g.deleteShader(l);var z;this.getUniforms=function(){void 0===z&&(z=new gb(g,p,a));return z};var I;this.getAttributes=function(){if(void 0===I){for(var a={},b=g.getProgramParameter(p,
+g.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=g.getActiveAttrib(p,c).name;a[d]=g.getAttribLocation(p,d)}I=a}return I};this.destroy=function(){g.deleteProgram(p);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=ig++;this.code=c;this.usedTimes=1;
+this.program=p;this.vertexShader=k;this.fragmentShader=l;return this}function jg(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding);else var c=3E3;3E3===c&&b&&(c=3007);return c}var e=[],f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",
+MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow"},g="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");
+this.getParameters=function(b,e,g,q,n,t,r){var h=f[b.type];if(r.isSkinnedMesh){var l=r.skeleton.bones;if(c.floatVertexTextures)l=1024;else{var k=Math.min(Math.floor((c.maxVertexUniforms-20)/4),l.length);k<l.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+l.length+" bones. This GPU supports "+k+"."),l=0):l=k}}else l=0;k=c.precision;null!==b.precision&&(k=c.getMaxPrecision(b.precision),k!==b.precision&&console.warn("THREE.WebGLProgram.getParameters:",b.precision,"not supported, using",k,"instead."));
+var m=a.getRenderTarget();return{shaderID:h,precision:k,supportsVertexTextures:c.vertexTextures,outputEncoding:d(m?m.texture:null,a.gammaOutput),map:!!b.map,mapEncoding:d(b.map,a.gammaInput),envMap:!!b.envMap,envMapMode:b.envMap&&b.envMap.mapping,envMapEncoding:d(b.envMap,a.gammaInput),envMapCubeUV:!!b.envMap&&(306===b.envMap.mapping||307===b.envMap.mapping),lightMap:!!b.lightMap,aoMap:!!b.aoMap,emissiveMap:!!b.emissiveMap,emissiveMapEncoding:d(b.emissiveMap,a.gammaInput),bumpMap:!!b.bumpMap,normalMap:!!b.normalMap,
+displacementMap:!!b.displacementMap,roughnessMap:!!b.roughnessMap,metalnessMap:!!b.metalnessMap,specularMap:!!b.specularMap,alphaMap:!!b.alphaMap,gradientMap:!!b.gradientMap,combine:b.combine,vertexColors:b.vertexColors,fog:!!q,useFog:b.fog,fogExp:q&&q.isFogExp2,flatShading:b.flatShading,sizeAttenuation:b.sizeAttenuation,logarithmicDepthBuffer:c.logarithmicDepthBuffer,skinning:b.skinning&&0<l,maxBones:l,useVertexTexture:c.floatVertexTextures,morphTargets:b.morphTargets,morphNormals:b.morphNormals,
+maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numClippingPlanes:n,numClipIntersection:t,dithering:b.dithering,shadowMapEnabled:a.shadowMap.enabled&&r.receiveShadow&&0<g.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:b.premultipliedAlpha,
+alphaTest:b.alphaTest,doubleSided:2===b.side,flipSided:1===b.side,depthPacking:void 0!==b.depthPacking?b.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<g.length;e++)d.push(c[g[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(c,d,f,g){for(var h,l=0,k=e.length;l<
+k;l++){var q=e[l];if(q.code===g){h=q;++h.usedTimes;break}}void 0===h&&(h=new hg(a,b,g,c,d,f),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function kg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,
+0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function k(a){return R.isPowerOfTwo(a.width)&&R.isPowerOfTwo(a.height)}function l(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function n(b){b=b.target;b.removeEventListener("dispose",n);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);
+else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function t(b){b=b.target;b.removeEventListener("dispose",t);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),
+c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,q){var t=d.get(b);if(0<b.version&&t.__version!==b.version){var r=b.image;if(void 0===r)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===r.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===t.__webglInit&&(t.__webglInit=!0,b.addEventListener("dispose",n),t.__webglTexture=
+a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_2D,t.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var u=h(b.image,e.maxTextureSize);(1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(u)&&(q=u,q instanceof HTMLImageElement||q instanceof HTMLCanvasElement||q instanceof ImageBitmap?(r=document.createElementNS("http://www.w3.org/1999/xhtml",
+"canvas"),r.width=R.floorPowerOfTwo(q.width),r.height=R.floorPowerOfTwo(q.height),r.getContext("2d").drawImage(q,0,0,r.width,r.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+q.width+"x"+q.height+"). Resized to "+r.width+"x"+r.height,q),u=r):u=q);q=k(u);var r=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_2D,b,q);var p=b.mipmaps;if(b.isDepthTexture){p=a.DEPTH_COMPONENT;if(1015===b.type){if(!x)throw Error("Float Depth Texture only supported in WebGL2.0");p=a.DEPTH_COMPONENT32F}else x&&
+(p=a.DEPTH_COMPONENT16);1026===b.format&&p===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),b.type=1012,z=f.convert(b.type));1027===b.format&&(p=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),b.type=1020,z=f.convert(b.type)));c.texImage2D(a.TEXTURE_2D,0,p,u.width,u.height,0,r,z,null)}else if(b.isDataTexture)if(0<
+p.length&&q){for(var v=0,w=p.length;v<w;v++)u=p[v],c.texImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,r,z,u.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,r,u.width,u.height,0,r,z,u.data);else if(b.isCompressedTexture)for(v=0,w=p.length;v<w;v++)u=p[v],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(r)?c.compressedTexImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,u.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):
+c.texImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,r,z,u.data);else if(0<p.length&&q){v=0;for(w=p.length;v<w;v++)u=p[v],c.texImage2D(a.TEXTURE_2D,v,r,r,z,u);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,r,r,z,u);l(b,q)&&a.generateMipmap(a.TEXTURE_2D);t.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_2D,t.__webglTexture)}function m(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f.convert(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,
+f.convert(g.wrapT)),a.texParameteri(c,a.TEXTURE_MAG_FILTER,f.convert(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f.convert(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,q(g.magFilter)),a.texParameteri(c,
+a.TEXTURE_MIN_FILTER,q(g.minFilter)),1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,
+e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=g.anisotropy)}function p(b,e,g,h){var l=f.convert(e.texture.format),k=f.convert(e.texture.type);c.texImage2D(h,0,l,e.width,e.height,0,l,k,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function w(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),
+a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var x="undefined"!==typeof WebGL2RenderingContext&&a instanceof window.WebGL2RenderingContext;this.setTexture2D=r;this.setTextureCube=
+function(b,q){var t=d.get(b);if(6===b.image.length)if(0<b.version&&t.__version!==b.version){t.__image__webglTextureCube||(b.addEventListener("dispose",n),t.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_CUBE_MAP,t.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);q=b&&b.isCompressedTexture;for(var r=b.image[0]&&b.image[0].isDataTexture,u=[],p=0;6>p;p++)u[p]=q||r?r?b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize);
+var v=k(u[0]),w=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_CUBE_MAP,b,v);for(p=0;6>p;p++)if(q)for(var x,I=u[p].mipmaps,y=0,C=I.length;y<C;y++)x=I[y],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(w)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,y,w,x.width,x.height,0,x.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,y,w,x.width,x.height,
+0,w,z,x.data);else r?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,0,w,u[p].width,u[p].height,0,w,z,u[p].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,0,w,w,z,u[p]);l(b,v)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);t.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+q),c.bindTexture(a.TEXTURE_CUBE_MAP,t.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=
+function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",t);f.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,n=k(b);if(h){e.__webglFramebuffer=[];for(var q=0;6>q;q++)e.__webglFramebuffer[q]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);m(a.TEXTURE_CUBE_MAP,b.texture,n);for(q=0;6>q;q++)p(e.__webglFramebuffer[q],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+q);
+l(b.texture,n)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),m(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),l(b.texture,n)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported");
+a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,
+a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer,
+b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);l(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function lg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function mg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
+a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==z[b]&&(a.enable(b),z[b]=!0)}function f(b){!1!==z[b]&&(a.disable(b),z[b]=!1)}function g(b,d,g,h,l,k,n,q){0!==b?e(a.BLEND):f(a.BLEND);if(5!==b){if(b!==J||q!==L)switch(b){case 2:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),
+a.blendFunc(a.SRC_ALPHA,a.ONE));break;case 3:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR));break;case 4:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR));break;default:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,
+a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA))}E=A=ha=C=y=ta=null}else{l=l||d;k=k||g;n=n||h;if(d!==ta||l!==ha)a.blendEquationSeparate(c.convert(d),c.convert(l)),ta=d,ha=l;if(g!==y||h!==C||k!==A||n!==E)a.blendFuncSeparate(c.convert(g),c.convert(h),c.convert(k),c.convert(n)),y=g,C=h,A=k,E=n}J=b;L=q}function h(b){D!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),D=b)}
+function k(b){0!==b?(e(a.CULL_FACE),b!==H&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);H=b}function l(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),V!==c||K!==d)a.polygonOffset(c,d),V=c,K=d}else f(a.POLYGON_OFFSET_FILL)}function q(b){void 0===b&&(b=a.TEXTURE0+N-1);R!==b&&(a.activeTexture(b),R=b)}var n=new function(){var b=!1,c=new da,d=null,e=new da(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},
+setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},t=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);
+break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=null,d=null,g=null,h=null,l=null,k=null,n=null,q=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||
+(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(l!==b||k!==c||n!==d)a.stencilOp(b,c,d),l=b,k=c,n=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=n=k=l=h=g=d=c=null}}},m=a.getParameter(a.MAX_VERTEX_ATTRIBS),p=new Uint8Array(m),w=new Uint8Array(m),x=new Uint8Array(m),z={},I=null,B=null,J=null,ta=null,y=null,C=null,ha=null,A=null,E=null,L=!1,D=null,H=null,M=null,
+V=null,K=null,N=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),m=parseFloat(/^WebGL\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),aa=1<=parseFloat(m),R=null,P={},Q=new da,G=new da,X={};X[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);X[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);n.setClear(0,0,0,1);t.setClear(1);r.setClear(0);e(a.DEPTH_TEST);t.setFunc(3);h(!1);k(1);e(a.CULL_FACE);e(a.BLEND);g(1);return{buffers:{color:n,depth:t,stencil:r},initAttributes:function(){for(var a=
+0,b=p.length;a<b;a++)p[a]=0},enableAttribute:function(c){p[c]=1;0===w[c]&&(a.enableVertexAttribArray(c),w[c]=1);0!==x[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),x[c]=0)},enableAttributeAndDivisor:function(c,d){p[c]=1;0===w[c]&&(a.enableVertexAttribArray(c),w[c]=1);x[c]!==d&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,d),x[c]=d)},disableUnusedAttributes:function(){for(var b=0,c=w.length;b!==c;++b)w[b]!==p[b]&&(a.disableVertexAttribArray(b),w[b]=0)},enable:e,
+disable:f,getCompressedTextureFormats:function(){if(null===I&&(I=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)I.push(c[d]);return I},useProgram:function(b){return B!==b?(a.useProgram(b),B=b,!0):!1},setBlending:g,setMaterial:function(b){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);h(1===b.side);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,
+b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);t.setFunc(b.depthFunc);t.setTest(b.depthTest);t.setMask(b.depthWrite);n.setMask(b.colorWrite);l(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==M&&(aa&&a.lineWidth(b),M=b)},setPolygonOffset:l,setScissorTest:function(b){b?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:q,bindTexture:function(b,c){null===R&&q();var d=P[R];void 0===d&&(d=
+{type:void 0,texture:void 0},P[R]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||X[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(fa){console.error("THREE.WebGLState:",fa)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(fa){console.error("THREE.WebGLState:",fa)}},scissor:function(b){!1===Q.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),Q.copy(b))},viewport:function(b){!1===G.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),G.copy(b))},
+reset:function(){for(var b=0;b<w.length;b++)1===w[b]&&(a.disableVertexAttribArray(b),w[b]=0);z={};R=I=null;P={};H=D=J=B=null;n.reset();t.reset();r.reset()}}}function ng(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,
+a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=!0===c.logarithmicDepthBuffer;var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),l=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),q=a.getParameter(a.MAX_VERTEX_ATTRIBS),n=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),t=a.getParameter(a.MAX_VARYING_VECTORS),
+r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),m=0<h,p=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:l,maxAttributes:q,maxVertexUniforms:n,maxVaryings:t,maxFragmentUniforms:r,vertexTextures:m,floatFragmentTextures:p,floatVertexTextures:m&&
+p}}function U(a,b,c,d){La.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function nd(a){U.call(this);this.cameras=a||[]}function og(a){function b(){if(null!==d&&d.isPresenting){var b=d.getEyeParameters("left"),e=b.renderWidth,b=b.renderHeight;t=a.getPixelRatio();n=a.getSize();a.setDrawingBufferSize(2*
+e,b,1)}else c.enabled&&a.setDrawingBufferSize(n.width,n.height,t)}var c=this,d=null,e=null;"undefined"!==typeof window&&"VRFrameData"in window&&(e=new window.VRFrameData);var f=new K,g=new K,h=new K,k=new U;k.bounds=new da(0,0,.5,1);k.layers.enable(1);var l=new U;l.bounds=new da(.5,0,.5,1);l.layers.enable(2);var q=new nd([k,l]);q.layers.enable(1);q.layers.enable(2);var n,t;"undefined"!==typeof window&&window.addEventListener("vrdisplaypresentchange",b,!1);this.standing=this.enabled=!1;this.getDevice=
+function(){return d};this.setDevice=function(a){void 0!==a&&(d=a)};this.getCamera=function(a){if(null===d)return a;d.depthNear=a.near;d.depthFar=a.far;d.getFrameData(e);var b=e.pose;null!==b.position?a.position.fromArray(b.position):a.position.set(0,0,0);null!==b.orientation&&a.quaternion.fromArray(b.orientation);a.updateMatrixWorld();b=d.stageParameters;this.standing&&b&&(g.fromArray(b.sittingToStandingTransform),h.getInverse(g),a.matrixWorld.multiply(g),a.matrixWorldInverse.multiply(h));if(!1===
+d.isPresenting)return a;k.near=a.near;l.near=a.near;k.far=a.far;l.far=a.far;q.matrixWorld.copy(a.matrixWorld);q.matrixWorldInverse.copy(a.matrixWorldInverse);k.matrixWorldInverse.fromArray(e.leftViewMatrix);l.matrixWorldInverse.fromArray(e.rightViewMatrix);this.standing&&b&&(k.matrixWorldInverse.multiply(h),l.matrixWorldInverse.multiply(h));a=a.parent;null!==a&&(f.getInverse(a.matrixWorld),k.matrixWorldInverse.multiply(f),l.matrixWorldInverse.multiply(f));k.matrixWorld.getInverse(k.matrixWorldInverse);
+l.matrixWorld.getInverse(l.matrixWorldInverse);k.projectionMatrix.fromArray(e.leftProjectionMatrix);l.projectionMatrix.fromArray(e.rightProjectionMatrix);q.projectionMatrix.copy(k.projectionMatrix);a=d.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&k.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&l.bounds.fromArray(a.rightBounds));return q};this.getStandingMatrix=function(){return g};this.submitFrame=function(){d&&d.isPresenting&&d.submitFrame()};
+this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",b)}}function pg(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||
+a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");
+break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function qg(){function a(){l.value!==d&&(l.value=d,l.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=l.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+
+3]=h.constant}l.value=g;l.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Aa,k=new ra,l={value:null,needsUpdate:!1};this.uniform=l;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,k,r,m,p){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,q=m.clippingState||null;
+l.value=q;q=b(c,r,n,p);for(c=0;c!==n;++c)q[c]=d[c];m.clippingState=q;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Pe(a,b){return{convert:function(c){if(1E3===c)return a.REPEAT;if(1001===c)return a.CLAMP_TO_EDGE;if(1002===c)return a.MIRRORED_REPEAT;if(1003===c)return a.NEAREST;if(1004===c)return a.NEAREST_MIPMAP_NEAREST;if(1005===c)return a.NEAREST_MIPMAP_LINEAR;if(1006===c)return a.LINEAR;if(1007===c)return a.LINEAR_MIPMAP_NEAREST;if(1008===c)return a.LINEAR_MIPMAP_LINEAR;
+if(1009===c)return a.UNSIGNED_BYTE;if(1017===c)return a.UNSIGNED_SHORT_4_4_4_4;if(1018===c)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===c)return a.UNSIGNED_SHORT_5_6_5;if(1010===c)return a.BYTE;if(1011===c)return a.SHORT;if(1012===c)return a.UNSIGNED_SHORT;if(1013===c)return a.INT;if(1014===c)return a.UNSIGNED_INT;if(1015===c)return a.FLOAT;if(1016===c){var d=b.get("OES_texture_half_float");if(null!==d)return d.HALF_FLOAT_OES}if(1021===c)return a.ALPHA;if(1022===c)return a.RGB;if(1023===c)return a.RGBA;
+if(1024===c)return a.LUMINANCE;if(1025===c)return a.LUMINANCE_ALPHA;if(1026===c)return a.DEPTH_COMPONENT;if(1027===c)return a.DEPTH_STENCIL;if(100===c)return a.FUNC_ADD;if(101===c)return a.FUNC_SUBTRACT;if(102===c)return a.FUNC_REVERSE_SUBTRACT;if(200===c)return a.ZERO;if(201===c)return a.ONE;if(202===c)return a.SRC_COLOR;if(203===c)return a.ONE_MINUS_SRC_COLOR;if(204===c)return a.SRC_ALPHA;if(205===c)return a.ONE_MINUS_SRC_ALPHA;if(206===c)return a.DST_ALPHA;if(207===c)return a.ONE_MINUS_DST_ALPHA;
+if(208===c)return a.DST_COLOR;if(209===c)return a.ONE_MINUS_DST_COLOR;if(210===c)return a.SRC_ALPHA_SATURATE;if(2001===c||2002===c||2003===c||2004===c)if(d=b.get("WEBGL_compressed_texture_s3tc"),null!==d){if(2001===c)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===c)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===c)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===c)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===c||2101===c||2102===c||2103===c)if(d=b.get("WEBGL_compressed_texture_pvrtc"),null!==
+d){if(2100===c)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===c)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===c)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===c)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===c&&(d=b.get("WEBGL_compressed_texture_etc1"),null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(103===c||104===c)if(d=b.get("EXT_blend_minmax"),null!==d){if(103===c)return d.MIN_EXT;if(104===c)return d.MAX_EXT}return 1020===c&&(d=b.get("WEBGL_depth_texture"),null!==d)?d.UNSIGNED_INT_24_8_WEBGL:
+0}}}function Wd(a){function b(){ia=new pg(F);ia.get("WEBGL_depth_texture");ia.get("OES_texture_float");ia.get("OES_texture_float_linear");ia.get("OES_texture_half_float");ia.get("OES_texture_half_float_linear");ia.get("OES_standard_derivatives");ia.get("OES_element_index_uint");ia.get("ANGLE_instanced_arrays");oa=new Pe(F,ia);Z=new ng(F,ia,a);ba=new mg(F,ia,oa);ba.scissor(S.copy(ea).multiplyScalar(O));ba.viewport(Q.copy(ca).multiplyScalar(O));U=new lg;T=new kg(F,ia,ba,U,Z,oa,Vd);na=new Mf(F);pa=new Zf(F,
+na,Vd);ra=new bg(pa,Ra);va=new Wf(F);ma=new jg(L,ia,Z);sa=new ag;qa=new Uf;ja=new Qf(L,ba,pa,J);wa=new Yf(F,ia,Ra);xa=new Xf(F,ia,Ra);ya=new Jf(L,F,ba,T,Z);Aa=new Kf(L,F,ba,T,Z);L.info.programs=ma.programs;L.context=F;L.capabilities=Z;L.extensions=ia;L.properties=U;L.renderLists=qa;L.state=ba}function c(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");Y=!0}function d(){console.log("THREE.WebGLRenderer: Context Restored.");Y=!1;b()}function e(a){a=a.target;a.removeEventListener("dispose",
+e);f(a);U.remove(a)}function f(a){var b=U.get(a).program;a.program=void 0;void 0!==b&&ma.releaseProgram(b)}function g(a,b,c){a.render(function(a){L.renderBufferImmediate(a,b,c)})}function h(a){null!==Ba&&Ba(a);(a=ka.getDevice())&&a.isPresenting?a.requestAnimationFrame(h):window.requestAnimationFrame(h)}function k(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)y.push(a),a.castShadow&&C.push(a);else if(a.isSprite)a.frustumCulled&&!Td.intersectsSprite(a)||D.push(a);else if(a.isLensFlare)Va.push(a);
+else if(a.isImmediateRenderObject)c&&Nb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(md),A.push(a,null,a.material,Nb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||Td.intersectsObject(a)){c&&Nb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(md);var d=ra.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<h;g++){var l=f[g],n=e[l.materialIndex];n&&n.visible&&A.push(a,d,n,Nb.z,l)}else e.visible&&A.push(a,d,e,
+Nb.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function l(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,k=void 0===d?g.material:d,g=g.group;if(c.isArrayCamera){aa=c;for(var n=c.cameras,t=0,r=n.length;t<r;t++){var m=n[t];if(h.layers.test(m.layers)){var u=m.bounds;ba.viewport(Q.set(u.x*X,u.y*fa,u.z*X,u.w*fa).multiplyScalar(O));q(h,b,m,l,k,g)}}}else aa=null,q(h,b,c,l,k,g)}}function q(a,b,c,d,e,f){a.onBeforeRender(L,b,c,d,e,f);a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,
+a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){ba.setMaterial(e);var h=t(c,b.fog,e,a);N="";g(a,h,e)}else L.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(L,b,c,d,e,f)}function n(a,b,c){var d=U.get(a);c=ma.getParameters(a,sa.state,C,b,Fa.numPlanes,Fa.numIntersection,c);var g=ma.getProgramCode(a,c),h=d.program,l=!0;if(void 0===h)a.addEventListener("dispose",e);else if(h.code!==g)f(a);else{if(void 0!==c.shaderID)return;l=!1}l&&(c.shaderID?(h=mb[c.shaderID],
+d.shader={name:a.type,uniforms:Ea.clone(h.uniforms),vertexShader:h.vertexShader,fragmentShader:h.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),h=ma.acquireProgram(a,d.shader,c,g),d.program=h,a.program=h);c=h.getAttributes();if(a.morphTargets)for(g=a.numSupportedMorphTargets=0;g<L.maxMorphTargets;g++)0<=c["morphTarget"+g]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(g=a.numSupportedMorphNormals=
+0;g<L.maxMorphNormals;g++)0<=c["morphNormal"+g]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Fa.numPlanes,d.numIntersection=Fa.numIntersection,c.clippingPlanes=Fa.uniform;d.fog=b;d.lightsHash=sa.state.hash;a.lights&&(c.ambientLightColor.value=sa.state.ambient,c.directionalLights.value=sa.state.directional,c.spotLights.value=sa.state.spot,c.rectAreaLights.value=sa.state.rectArea,c.pointLights.value=sa.state.point,
+c.hemisphereLights.value=sa.state.hemi,c.directionalShadowMap.value=sa.state.directionalShadowMap,c.directionalShadowMatrix.value=sa.state.directionalShadowMatrix,c.spotShadowMap.value=sa.state.spotShadowMap,c.spotShadowMatrix.value=sa.state.spotShadowMatrix,c.pointShadowMap.value=sa.state.pointShadowMap,c.pointShadowMatrix.value=sa.state.pointShadowMatrix);a=d.program.getUniforms();a=gb.seqWithValue(a.seq,c);d.uniformsList=a}function t(a,b,c,d){G=0;var e=U.get(c);ga&&(Ud||a!==P)&&Fa.setState(c.clippingPlanes,
+c.clipIntersection,c.clipShadows,a,e,a===P&&c.id===V);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==sa.state.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Fa.numPlanes&&e.numIntersection===Fa.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(n(c,b,d),c.needsUpdate=!1);var f=!1,g=!1,h=!1,l=e.program,k=l.getUniforms(),q=e.shader.uniforms;ba.useProgram(l.program)&&(h=g=f=!0);c.id!==V&&(V=c.id,g=!0);if(f||
+a!==P){k.setValue(F,"projectionMatrix",a.projectionMatrix);Z.logarithmicDepthBuffer&&k.setValue(F,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));P!==(aa||a)&&(P=aa||a,h=g=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)f=k.map.cameraPosition,void 0!==f&&f.setValue(F,Nb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&k.setValue(F,"viewMatrix",
+a.matrixWorldInverse)}if(c.skinning&&(k.setOptional(F,d,"bindMatrix"),k.setOptional(F,d,"bindMatrixInverse"),a=d.skeleton))if(f=a.bones,Z.floatVertexTextures){if(void 0===a.boneTexture){var f=Math.sqrt(4*f.length),f=R.ceilPowerOfTwo(f),f=Math.max(f,4),t=new Float32Array(f*f*4);t.set(a.boneMatrices);var u=new fb(t,f,f,1023,1015);a.boneMatrices=t;a.boneTexture=u;a.boneTextureSize=f}k.setValue(F,"boneTexture",a.boneTexture);k.setValue(F,"boneTextureSize",a.boneTextureSize)}else k.setOptional(F,a,"boneMatrices");
+g&&(k.setValue(F,"toneMappingExposure",L.toneMappingExposure),k.setValue(F,"toneMappingWhitePoint",L.toneMappingWhitePoint),c.lights&&(g=h,q.ambientLightColor.needsUpdate=g,q.directionalLights.needsUpdate=g,q.pointLights.needsUpdate=g,q.spotLights.needsUpdate=g,q.rectAreaLights.needsUpdate=g,q.hemisphereLights.needsUpdate=g),b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&(q.fogDensity.value=b.density)),c.isMeshBasicMaterial?r(q,c):c.isMeshLambertMaterial?
+(r(q,c),c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(r(q,c),c.isMeshToonMaterial?(m(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):m(q,c)):c.isMeshStandardMaterial?(r(q,c),c.isMeshPhysicalMaterial&&(q.clearCoat.value=c.clearCoat,q.clearCoatRoughness.value=c.clearCoatRoughness),q.roughness.value=c.roughness,q.metalness.value=c.metalness,c.roughnessMap&&(q.roughnessMap.value=c.roughnessMap),c.metalnessMap&&(q.metalnessMap.value=c.metalnessMap),c.emissiveMap&&
+(q.emissiveMap.value=c.emissiveMap),c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias),c.envMap&&(q.envMapIntensity.value=c.envMapIntensity)):c.isMeshDepthMaterial?(r(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=
+c.displacementScale,q.displacementBias.value=c.displacementBias)):c.isMeshDistanceMaterial?(r(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias),q.referencePosition.value.copy(c.referencePosition),q.nearDistance.value=c.nearDistance,q.farDistance.value=c.farDistance):c.isMeshNormalMaterial?(r(q,c),c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=
+c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias)):c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,c.isLineDashedMaterial&&(q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale)):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*O,q.scale.value=
+.5*fa,q.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&(b=c.map.offset,g=c.map.repeat,h=c.map.center,c.map.matrix.setUvTransform(b.x,b.y,g.x,g.y,c.map.rotation,h.x,h.y)),q.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(q.color.value=c.color,q.opacity.value=c.opacity),void 0!==q.ltcMat&&(q.ltcMat.value=E.LTC_MAT_TEXTURE),void 0!==q.ltcMag&&(q.ltcMag.value=E.LTC_MAG_TEXTURE),gb.upload(F,e.uniformsList,q,L));k.setValue(F,"modelViewMatrix",d.modelViewMatrix);k.setValue(F,"normalMatrix",
+d.normalMatrix);k.setValue(F,"modelMatrix",d.matrixWorld);return l}function r(a,b){a.opacity.value=b.opacity;b.color&&(a.diffuse.value=b.color);b.emissive&&a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);b.map&&(a.map.value=b.map);b.alphaMap&&(a.alphaMap.value=b.alphaMap);b.specularMap&&(a.specularMap.value=b.specularMap);b.envMap&&(a.envMap.value=b.envMap,a.flipEnvMap.value=b.envMap&&b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio);
+b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap:b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);if(void 0!==c){c.isWebGLRenderTarget&&(c=c.texture);if(!0===c.matrixAutoUpdate){b=
+c.offset;var d=c.repeat,e=c.center;c.matrix.setUvTransform(b.x,b.y,d.x,d.y,c.rotation,e.x,e.y)}a.uvTransform.value.copy(c.matrix)}}function m(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=
+b.displacementScale,a.displacementBias.value=b.displacementBias)}console.log("THREE.WebGLRenderer","88");a=a||{};var v=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),w=void 0!==a.context?a.context:null,x=void 0!==a.alpha?a.alpha:!1,z=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,B=void 0!==a.antialias?a.antialias:!1,J=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,ta=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,y=
+[],C=[],A=null,D=[],Va=[];this.domElement=v;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var L=this,Y=!1,H=null,M=null,V=-1,N="",P=null,aa=null,Q=new da,S=new da,W=null,G=0,X=v.width,
+fa=v.height,O=1,ca=new da(0,0,X,fa),ea=new da(0,0,X,fa),Oe=!1,Td=new ld,Fa=new qg,ga=!1,Ud=!1,md=new K,Nb=new p,Vd={geometries:0,textures:0},Ra={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:Ra,memory:Vd,programs:null};try{x={alpha:x,depth:z,stencil:I,antialias:B,premultipliedAlpha:J,preserveDrawingBuffer:ta};var F=w||v.getContext("webgl",x)||v.getContext("experimental-webgl",x);if(null===F){if(null!==v.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";
+throw"Error creating WebGL context.";}void 0===F.getShaderPrecisionFormat&&(F.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});v.addEventListener("webglcontextlost",c,!1);v.addEventListener("webglcontextrestored",d,!1)}catch(rg){console.error("THREE.WebGLRenderer: "+rg)}var ia,Z,ba,U,T,na,pa,ra,sa,ma,qa,ja,va,wa,xa,ya,Aa,oa;b();var ka=new og(L);this.vr=ka;var Ca=new Ie(L,ra,Z.maxTextureSize);this.shadowMap=Ca;this.getContext=function(){return F};this.getContextAttributes=
+function(){return F.getContextAttributes()};this.forceContextLoss=function(){var a=ia.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=ia.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return O};this.setPixelRatio=function(a){void 0!==a&&(O=a,this.setSize(X,fa,!1))};this.getSize=function(){return{width:X,height:fa}};this.setSize=function(a,b,c){var d=ka.getDevice();d&&d.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):
+(X=a,fa=b,v.width=a*O,v.height=b*O,!1!==c&&(v.style.width=a+"px",v.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:X*O,height:fa*O}};this.setDrawingBufferSize=function(a,b,c){X=a;fa=b;O=c;v.width=a*c;v.height=b*c;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){ca.set(a,fa-b-d,c,d);ba.viewport(Q.copy(ca).multiplyScalar(O))};this.setScissor=function(a,b,c,d){ea.set(a,fa-b-d,c,d);ba.scissor(S.copy(ea).multiplyScalar(O))};this.setScissorTest=
+function(a){ba.setScissorTest(Oe=a)};this.getClearColor=function(){return ja.getClearColor()};this.setClearColor=function(){ja.setClearColor.apply(ja,arguments)};this.getClearAlpha=function(){return ja.getClearAlpha()};this.setClearAlpha=function(){ja.setClearAlpha.apply(ja,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=F.COLOR_BUFFER_BIT;if(void 0===b||b)d|=F.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=F.STENCIL_BUFFER_BIT;F.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};
+this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.dispose=function(){v.removeEventListener("webglcontextlost",c,!1);v.removeEventListener("webglcontextrestored",d,!1);qa.dispose();ka.dispose()};this.renderBufferImmediate=function(a,b,c){ba.initAttributes();var d=U.get(a);a.hasPositions&&!d.position&&(d.position=F.createBuffer());a.hasNormals&&!d.normal&&(d.normal=F.createBuffer());
+a.hasUvs&&!d.uv&&(d.uv=F.createBuffer());a.hasColors&&!d.color&&(d.color=F.createBuffer());b=b.getAttributes();a.hasPositions&&(F.bindBuffer(F.ARRAY_BUFFER,d.position),F.bufferData(F.ARRAY_BUFFER,a.positionArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.position),F.vertexAttribPointer(b.position,3,F.FLOAT,!1,0,0));if(a.hasNormals){F.bindBuffer(F.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&!0===c.flatShading)for(var e=0,f=3*a.count;e<f;e+=9){var g=
+a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,l=(g[e+1]+g[e+4]+g[e+7])/3,k=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=l;g[e+2]=k;g[e+3]=h;g[e+4]=l;g[e+5]=k;g[e+6]=h;g[e+7]=l;g[e+8]=k}F.bufferData(F.ARRAY_BUFFER,a.normalArray,F.DYNAMIC_DRAW);ba.enableAttribute(b.normal);F.vertexAttribPointer(b.normal,3,F.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(F.bindBuffer(F.ARRAY_BUFFER,d.uv),F.bufferData(F.ARRAY_BUFFER,a.uvArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.uv),F.vertexAttribPointer(b.uv,2,F.FLOAT,!1,0,0));a.hasColors&&
+0!==c.vertexColors&&(F.bindBuffer(F.ARRAY_BUFFER,d.color),F.bufferData(F.ARRAY_BUFFER,a.colorArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.color),F.vertexAttribPointer(b.color,3,F.FLOAT,!1,0,0));ba.disableUnusedAttributes();F.drawArrays(F.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){ba.setMaterial(d);var g=t(a,b,d,e);a=c.id+"_"+g.id+"_"+(!0===d.wireframe);var h=!1;a!==N&&(N=a,h=!0);e.morphTargetInfluences&&(va.update(e,c,d,g),h=!0);var l=c.index,k=c.attributes.position;
+b=1;!0===d.wireframe&&(l=pa.getWireframeAttribute(c),b=2);a=wa;if(null!==l){var n=na.get(l);a=xa;a.setIndex(n)}if(h){h=void 0;if(c&&c.isInstancedBufferGeometry&&null===ia.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===h&&(h=0);ba.initAttributes();var q=c.attributes,g=g.getAttributes(),r=d.defaultAttributeValues;for(J in g){var m=g[J];if(0<=m){var u=
+q[J];if(void 0!==u){var p=u.normalized,v=u.itemSize,w=na.get(u);if(void 0!==w){var z=w.buffer,x=w.type,w=w.bytesPerElement;if(u.isInterleavedBufferAttribute){var B=u.data,I=B.stride,u=u.offset;B&&B.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(m,B.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=B.meshPerAttribute*B.count)):ba.enableAttribute(m);F.bindBuffer(F.ARRAY_BUFFER,z);F.vertexAttribPointer(m,v,x,p,I*w,(h*I+u)*w)}else u.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(m,
+u.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):ba.enableAttribute(m),F.bindBuffer(F.ARRAY_BUFFER,z),F.vertexAttribPointer(m,v,x,p,0,h*v*w)}}else if(void 0!==r&&(p=r[J],void 0!==p))switch(p.length){case 2:F.vertexAttrib2fv(m,p);break;case 3:F.vertexAttrib3fv(m,p);break;case 4:F.vertexAttrib4fv(m,p);break;default:F.vertexAttrib1fv(m,p)}}}ba.disableUnusedAttributes()}null!==l&&F.bindBuffer(F.ELEMENT_ARRAY_BUFFER,n.buffer)}n=0;null!==l?n=l.count:void 0!==
+k&&(n=k.count);l=c.drawRange.start*b;k=null!==f?f.start*b:0;var J=Math.max(l,k);f=Math.max(0,Math.min(n,l+c.drawRange.count*b,k+(null!==f?f.count*b:Infinity))-1-J+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ba.setLineWidth(d.wireframeLinewidth*(null===H?O:1)),a.setMode(F.LINES);else switch(e.drawMode){case 0:a.setMode(F.TRIANGLES);break;case 1:a.setMode(F.TRIANGLE_STRIP);break;case 2:a.setMode(F.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ba.setLineWidth(d*(null===H?O:1)),e.isLineSegments?
+a.setMode(F.LINES):e.isLineLoop?a.setMode(F.LINE_LOOP):a.setMode(F.LINE_STRIP)):e.isPoints&&a.setMode(F.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,J,f):a.render(J,f)}};this.compile=function(a,b){y.length=0;C.length=0;a.traverse(function(a){a.isLight&&(y.push(a),a.castShadow&&C.push(a))});sa.setup(y,C,b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)n(b.material[c],a.fog,b);else n(b.material,a.fog,b)})};
+var Da=!1,Ba=null;this.animate=function(a){Ba=a;Da||((a=ka.getDevice())&&a.isPresenting?a.requestAnimationFrame(h):window.requestAnimationFrame(h),Da=!0)};this.render=function(a,b,c,d){if(!b||!b.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else if(!Y){N="";V=-1;P=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();ka.enabled&&(b=ka.getCamera(b));md.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Td.setFromMatrix(md);
+y.length=0;C.length=0;D.length=0;Va.length=0;Ud=this.localClippingEnabled;ga=Fa.init(this.clippingPlanes,Ud,b);A=qa.get(a,b);A.init();k(a,b,L.sortObjects);!0===L.sortObjects&&A.sort();ga&&Fa.beginShadows();Ca.render(C,a,b);sa.setup(y,C,b);ga&&Fa.endShadows();Ra.frame++;Ra.calls=0;Ra.vertices=0;Ra.faces=0;Ra.points=0;void 0===c&&(c=null);this.setRenderTarget(c);ja.render(A,a,b,d);d=A.opaque;var e=A.transparent;if(a.overrideMaterial){var f=a.overrideMaterial;d.length&&l(d,a,b,f);e.length&&l(e,a,b,f)}else d.length&&
+l(d,a,b),e.length&&l(e,a,b);Aa.render(D,a,b);ya.render(Va,a,b,Q);c&&T.updateRenderTargetMipmap(c);ba.buffers.depth.setTest(!0);ba.buffers.depth.setMask(!0);ba.buffers.color.setMask(!0);ba.setPolygonOffset(!1);ka.enabled&&ka.submitFrame()}};this.setFaceCulling=function(a,b){ba.setCullFace(a);ba.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=G;a>=Z.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+Z.maxTextures);G+=1;return a};
+this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);T.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);T.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&
+b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?T.setTextureCube(b,c):T.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return H};this.setRenderTarget=function(a){(H=a)&&void 0===U.get(a).__webglFramebuffer&&T.setupRenderTarget(a);var b=null,c=!1;a?(b=U.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&
+(b=b[a.activeCubeFace],c=!0),Q.copy(a.viewport),S.copy(a.scissor),W=a.scissorTest):(Q.copy(ca).multiplyScalar(O),S.copy(ea).multiplyScalar(O),W=Oe);M!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),M=b);ba.viewport(Q);ba.scissor(S);ba.setScissorTest(W);c&&(c=U.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=U.get(a).__webglFramebuffer;
+if(g){var h=!1;g!==M&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var l=a.texture,k=l.format,n=l.type;1023!==k&&oa.convert(k)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||oa.convert(n)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ia.get("OES_texture_float")||ia.get("WEBGL_color_buffer_float"))||1016===n&&ia.get("EXT_color_buffer_half_float")?
+F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,oa.convert(k),oa.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&F.bindFramebuffer(F.FRAMEBUFFER,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}}
+function Ob(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Pb(a,b,c){this.name="";this.color=new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function od(){A.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Xd(a,b,c,d,e){A.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function Za(a){Q.call(this);this.type="SpriteMaterial";
+this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Cc(a){A.call(this);this.type="Sprite";this.material=void 0!==a?a:new Za}function Dc(){A.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Ec(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),
+this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new K)}function pd(){A.call(this);this.type="Bone"}function qd(a,b){pa.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new K;this.bindMatrixInverse=new K;a=this.initBones();a=new Ec(a);this.bind(a,this.matrixWorld);this.normalizeSkinWeights()}function O(a){Q.call(this);this.type="LineBasicMaterial";this.color=new H(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;
+this.setValues(a)}function ma(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new ca(a,b);A.call(this);this.type="Line";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new O({color:16777215*Math.random()})}function ca(a,b){ma.call(this,a,b);this.type="LineSegments"}function rd(a,b){ma.call(this,a,b);this.type="LineLoop"}function Ba(a){Q.call(this);this.type="PointsMaterial";this.color=new H(16777215);
+this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Qb(a,b){A.call(this);this.type="Points";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Ba({color:16777215*Math.random()})}function Fc(){A.call(this);this.type="Group"}function sd(a,b,c,d,e,f,g,h,k){function l(){var a=q.image;a.readyState>=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0);requestAnimationFrame(l)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;requestAnimationFrame(l)}
+function Rb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Gc(a,b,c,d,e,f,g,h,k,l){l=void 0!==l?l:1026;if(1026!==l&&1027!==l)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===l&&(c=1012);void 0===c&&1027===l&&(c=1020);ea.call(this,null,d,e,f,g,h,l,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==
+h?h:1003;this.generateMipmaps=this.flipY=!1}function Sb(a){D.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&a.isGeometry){var k=a.faces;var l=0;for(d=k.length;l<d;l++){var q=k[l];for(c=0;3>c;c++){var n=q[h[c]];var t=q[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)l=g[n],h=a.vertices[l.index1],b.push(h.x,h.y,h.z),h=a.vertices[l.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry){var h=
+new p;if(null!==a.index){k=a.attributes.position;q=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:q.count,materialIndex:0}]);a=0;for(e=r.length;a<e;++a)for(l=r[a],c=l.start,d=l.count,l=c,d=c+d;l<d;l+=3)for(c=0;3>c;c++)n=q.getX(l+c),t=q.getX(l+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)l=g[n],h.fromBufferAttribute(k,l.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,l.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,
+l=0,d=k.count/3;l<d;l++)for(c=0;3>c;c++)g=3*l+c,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z),g=3*l+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z)}this.addAttribute("position",new y(b,3))}function Hc(a,b,c){N.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Tb(a,b,c));this.mergeVertices()}function Tb(a,b,c){D.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=
+new p,k=new p,l=new p,q=new p,n=new p,t,r,m=b+1;for(t=0;t<=c;t++){var v=t/c;for(r=0;r<=b;r++){var w=r/b,k=a(w,v,k);e.push(k.x,k.y,k.z);0<=w-1E-5?(l=a(w-1E-5,v,l),q.subVectors(k,l)):(l=a(w+1E-5,v,l),q.subVectors(l,k));0<=v-1E-5?(l=a(w,v-1E-5,l),n.subVectors(k,l)):(l=a(w,v+1E-5,l),n.subVectors(l,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(w,v)}}for(t=0;t<c;t++)for(r=0;r<b;r++)a=t*m+r+1,h=(t+1)*m+r+1,k=(t+1)*m+r,d.push(t*m+r,a,k),d.push(a,h,k);this.setIndex(d);this.addAttribute("position",
+new y(e,3));this.addAttribute("normal",new y(f,3));this.addAttribute("uv",new y(g,2))}function Ic(a,b,c,d){N.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new qa(a,b,c,d));this.mergeVertices()}function qa(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.call(this);this.type="PolyhedronBufferGeometry";
+this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k,l,m=c,x=d,z=g,I=Math.pow(2,a),B=[];for(l=0;l<=I;l++){B[l]=[];var J=m.clone().lerp(z,l/I),y=x.clone().lerp(z,l/I),C=I-l;for(k=0;k<=C;k++)B[l][k]=0===k&&l===I?J:J.clone().lerp(y,k/C)}for(l=0;l<I;l++)for(k=0;k<2*(I-l)-1;k++)m=Math.floor(k/2),0===k%2?(e(B[l][m+1]),e(B[l+1][m]),e(B[l][m])):(e(B[l][m+1]),e(B[l+1][m+
+1]),e(B[l+1][m]))}})(d);(function(a){for(var b=new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new p,b=new p,c=new p,d=new p,e=new C,f=new C,m=new C,w=0,x=0;w<h.length;w+=9,x+=6){a.set(h[w+0],h[w+1],h[w+2]);b.set(h[w+3],h[w+4],h[w+
+5]);c.set(h[w+6],h[w+7],h[w+8]);e.set(k[x+0],k[x+1]);f.set(k[x+2],k[x+3]);m.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var z=Math.atan2(d.z,-d.x);g(e,x+0,a,z);g(f,x+2,b,z);g(m,x+4,c,z)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new y(h,3));this.addAttribute("normal",new y(h.slice(),3));this.addAttribute("uv",new y(k,2));0===d?this.computeVertexNormals():
+this.normalizeNormals()}function Jc(a,b){N.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){qa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Kc(a,b){N.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new nb(a,b));this.mergeVertices()}
+function nb(a,b){qa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b){N.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Vb(a,b));this.mergeVertices()}function Vb(a,b){var c=(1+Math.sqrt(5))/2;qa.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,
+5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Mc(a,b){N.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Wb(a,b));this.mergeVertices()}function Wb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;qa.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,
+d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Nc(a,b,c,d,e,f){N.call(this);this.type="TubeGeometry";this.parameters={path:a,
+tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Xb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Xb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var l=t/d*Math.PI*2,n=Math.sin(l),l=-Math.cos(l);k.x=l*f.x+n*e.x;k.y=l*f.y+n*e.y;k.z=l*f.z+n*e.z;k.normalize();u.push(k.x,
+k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z=q.z+c*k.z;m.push(h.x,h.y,h.z)}}D.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,l=new C,q=new p,n,t,m=[],u=[],v=[],w=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)l.x=n/b,l.y=t/d,v.push(l.x,l.y);(function(){for(t=
+1;t<=b;t++)for(n=1;n<=d;n++){var a=(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;w.push((d+1)*(t-1)+(n-1),a,e);w.push(a,c,e)}})();this.setIndex(w);this.addAttribute("position",new y(m,3));this.addAttribute("normal",new y(u,3));this.addAttribute("uv",new y(v,2))}function Oc(a,b,c,d,e,f,g){N.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");
+this.fromBufferGeometry(new Yb(a,b,c,d,e,f));this.mergeVertices()}function Yb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}D.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],l=[],q=[],n,t=new p,m=new p,u=new p,v=new p,w=new p,x=new p,z=new p;for(n=0;n<=
+c;++n){var I=n/c*e*Math.PI*2;g(I,e,f,a,u);g(I+.01,e,f,a,v);x.subVectors(v,u);z.addVectors(v,u);w.crossVectors(x,z);z.crossVectors(w,x);w.normalize();z.normalize();for(I=0;I<=d;++I){var B=I/d*Math.PI*2,J=-b*Math.cos(B),B=b*Math.sin(B);t.x=u.x+(J*z.x+B*w.x);t.y=u.y+(J*z.y+B*w.y);t.z=u.z+(J*z.z+B*w.z);k.push(t.x,t.y,t.z);m.subVectors(t,u).normalize();l.push(m.x,m.y,m.z);q.push(n/c);q.push(I/d)}}for(I=1;I<=c;I++)for(n=1;n<=d;n++)a=(d+1)*I+(n-1),b=(d+1)*I+n,e=(d+1)*(I-1)+n,h.push((d+1)*(I-1)+(n-1),a,e),
+h.push(a,b,e);this.setIndex(h);this.addAttribute("position",new y(k,3));this.addAttribute("normal",new y(l,3));this.addAttribute("uv",new y(q,2))}function Pc(a,b,c,d,e){N.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Zb(a,b,c,d,e));this.mergeVertices()}function Zb(a,b,c,d,e){D.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||
+.4;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],l=new p,q=new p,n=new p,t,m;for(t=0;t<=c;t++)for(m=0;m<=d;m++){var u=m/d*e,v=t/c*Math.PI*2;q.x=(a+b*Math.cos(v))*Math.cos(u);q.y=(a+b*Math.cos(v))*Math.sin(u);q.z=b*Math.sin(v);g.push(q.x,q.y,q.z);l.x=a*Math.cos(u);l.y=a*Math.sin(u);n.subVectors(q,l).normalize();h.push(n.x,n.y,n.z);k.push(m/d);k.push(t/c)}for(t=1;t<=c;t++)for(m=1;m<=d;m++)a=(d+1)*(t-1)+m-1,b=(d+1)*(t-1)+m,e=(d+1)*t+m,f.push((d+1)*t+m-1,a,e),f.push(a,b,
+e);this.setIndex(f);this.addAttribute("position",new y(g,3));this.addAttribute("normal",new y(h,3));this.addAttribute("uv",new y(k,2))}function $a(a,b){N.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ga(a,b));this.mergeVertices()}function Ga(a,b){"undefined"!==typeof a&&(D.call(this),this.type="ExtrudeBufferGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Qc(a,b){N.call(this);this.type="TextGeometry";
+this.parameters={text:a,parameters:b};this.fromBufferGeometry(new $b(a,b));this.mergeVertices()}function $b(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new N;a=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Ga.call(this,a,b);this.type="TextBufferGeometry"}
+function Rc(a,b,c,d,e,f,g){N.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new ob(a,b,c,d,e,f,g));this.mergeVertices()}function ob(a,b,c,d,e,f,g){D.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==
+d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,l,q=0,n=[],t=new p,m=new p,u=[],v=[],w=[],x=[];for(l=0;l<=c;l++){var z=[],I=l/c;for(k=0;k<=b;k++){var B=k/b;t.x=-a*Math.cos(d+B*e)*Math.sin(f+I*g);t.y=a*Math.cos(f+I*g);t.z=a*Math.sin(d+B*e)*Math.sin(f+I*g);v.push(t.x,t.y,t.z);m.set(t.x,t.y,t.z).normalize();w.push(m.x,m.y,m.z);x.push(B,1-I);z.push(q++)}n.push(z)}for(l=0;l<c;l++)for(k=0;k<b;k++)a=n[l][k+1],d=n[l][k],e=n[l+1][k],g=n[l+1][k+1],(0!==l||0<f)&&u.push(a,d,
+g),(l!==c-1||h<Math.PI)&&u.push(d,e,g);this.setIndex(u);this.addAttribute("position",new y(v,3));this.addAttribute("normal",new y(w,3));this.addAttribute("uv",new y(x,2))}function Sc(a,b,c,d,e,f){N.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new ac(a,b,c,d,e,f));this.mergeVertices()}function ac(a,b,c,d,e,f){D.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,
+outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],l=[],q=a,n=(b-a)/d,t=new p,m=new C,u,v;for(u=0;u<=d;u++){for(v=0;v<=c;v++)a=e+v/c*f,t.x=q*Math.cos(a),t.y=q*Math.sin(a),h.push(t.x,t.y,t.z),k.push(0,0,1),m.x=(t.x/b+1)/2,m.y=(t.y/b+1)/2,l.push(m.x,m.y);q+=n}for(u=0;u<d;u++)for(b=u*(c+1),v=0;v<c;v++)a=v+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,
+f,q);this.setIndex(g);this.addAttribute("position",new y(h,3));this.addAttribute("normal",new y(k,3));this.addAttribute("uv",new y(l,2))}function Tc(a,b,c,d){N.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new bc(a,b,c,d));this.mergeVertices()}function bc(a,b,c,d){D.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=R.clamp(d,
+0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new p,l=new C,q;for(q=0;q<=b;q++){var n=c+q*h*d;var t=Math.sin(n),m=Math.cos(n);for(n=0;n<=a.length-1;n++)k.x=a[n].x*t,k.y=a[n].y,k.z=a[n].x*m,f.push(k.x,k.y,k.z),l.x=q/b,l.y=n/(a.length-1),g.push(l.x,l.y)}for(q=0;q<b;q++)for(n=0;n<a.length-1;n++)c=n+q*a.length,h=c+a.length,k=c+a.length+1,l=c+1,e.push(c,h,l),e.push(h,k,l);this.setIndex(e);this.addAttribute("position",new y(f,3));this.addAttribute("uv",new y(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=
+this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=q=0;q<a.length;q++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function cc(a,b){N.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new dc(a,
+b));this.mergeVertices()}function dc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var l=a.shape,q=a.holes;if(!1===Ha.isClockWise(l))for(l=l.reverse(),a=0,c=q.length;a<c;a++){var m=q[a];!0===Ha.isClockWise(m)&&(q[a]=m.reverse())}var p=Ha.triangulateShape(l,q);a=0;for(c=q.length;a<c;a++)m=q[a],l=l.concat(m);a=0;for(c=l.length;a<c;a++)m=l[a],e.push(m.x,m.y,0),f.push(0,0,1),g.push(m.x,m.y);a=0;for(c=p.length;a<c;a++)l=p[a],d.push(l[0]+h,l[1]+h,l[2]+h),k+=3}D.call(this);this.type="ShapeBufferGeometry";
+this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var l=0;l<a.length;l++)c(a[l]),this.addGroup(h,k,l),h+=k,k=0;this.setIndex(d);this.addAttribute("position",new y(e,3));this.addAttribute("normal",new y(f,3));this.addAttribute("uv",new y(g,2))}function ec(a,b){D.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(R.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=
+new N;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,k=g.length;h<k;h++)for(var l=g[h],q=0;3>q;q++){var n=l[f[q]];var t=l[f[(q+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position",
+new y(c,3))}function pb(a,b,c,d,e,f,g,h){N.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Sa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Sa(a,b,c,d,e,f,g,h){function k(c){var e,f=new C,k=new p,r=0,v=!0===c?a:b,z=!0===c?1:-1;var y=u;for(e=1;e<=d;e++)n.push(0,w*z,0),t.push(0,z,0),m.push(.5,.5),u++;var A=u;for(e=0;e<=d;e++){var D=e/d*h+g,L=Math.cos(D),
+D=Math.sin(D);k.x=v*D;k.y=w*z;k.z=v*L;n.push(k.x,k.y,k.z);t.push(0,z,0);f.x=.5*L+.5;f.y=.5*D*z+.5;m.push(f.x,f.y);u++}for(e=0;e<d;e++)f=y+e,k=A+e,!0===c?q.push(k,k+1,f):q.push(k+1,k,f),r+=3;l.addGroup(x,r,!0===c?1:2);x+=r}D.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var l=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:
+!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],n=[],t=[],m=[],u=0,v=[],w=c/2,x=0;(function(){var f,k,r=new p,J=new p,y=0,C=(b-a)/c;for(k=0;k<=e;k++){var A=[],D=k/e,E=D*(b-a)+a;for(f=0;f<=d;f++){var H=f/d,L=H*h+g,Y=Math.sin(L),L=Math.cos(L);J.x=E*Y;J.y=-D*c+w;J.z=E*L;n.push(J.x,J.y,J.z);r.set(Y,C,L).normalize();t.push(r.x,r.y,r.z);m.push(H,1-D);A.push(u++)}v.push(A)}for(f=0;f<d;f++)for(k=0;k<e;k++)r=v[k+1][f],J=v[k+1][f+1],C=v[k][f+1],q.push(v[k][f],r,C),q.push(r,J,C),y+=6;l.addGroup(x,y,0);
+x+=y})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute("position",new y(n,3));this.addAttribute("normal",new y(t,3));this.addAttribute("uv",new y(m,2))}function Uc(a,b,c,d,e,f,g){pb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Vc(a,b,c,d,e,f,g){Sa.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,
+heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Wc(a,b,c,d){N.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new fc(a,b,c,d));this.mergeVertices()}function fc(a,b,c,d){D.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],k,l=new p,q=new C;f.push(0,
+0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(k=3;n<=b;n++,k+=3){var t=c+n/b*d;l.x=a*Math.cos(t);l.y=a*Math.sin(t);f.push(l.x,l.y,l.z);g.push(0,0,1);q.x=(f[k]/a+1)/2;q.y=(f[k+1]/a+1)/2;h.push(q.x,q.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute("position",new y(f,3));this.addAttribute("normal",new y(g,3));this.addAttribute("uv",new y(h,2))}function gc(a){Q.call(this);this.type="ShadowMaterial";this.color=new H(0);this.opacity=1;this.transparent=this.lights=!0;this.setValues(a)}
+function hc(a){oa.call(this,a);this.type="RawShaderMaterial"}function Ma(a){Q.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new H(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=
+0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function qb(a){Ma.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ia(a){Q.call(this);this.type="MeshPhongMaterial";
+this.color=new H(16777215);this.specular=new H(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=
+!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function rb(a){Ia.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;this.setValues(a)}function sb(a){Q.call(this);this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=
+!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function tb(a){Q.call(this);this.type="MeshLambertMaterial";this.color=new H(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=
+1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function ub(a){O.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Yd(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,
+f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=a}}function Ja(a){this.manager=void 0!==a?a:wa}function Qe(a){this.manager=void 0!==a?a:wa;this._parser=null}function Zd(a){this.manager=void 0!==a?a:wa;this._parser=null}function Xc(a){this.manager=void 0!==a?a:wa}function $d(a){this.manager=void 0!==a?a:wa}function td(a){this.manager=void 0!==a?a:wa}function ga(a,
+b){A.call(this);this.type="Light";this.color=new H(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function ud(a,b,c){ga.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(A.DefaultUp);this.updateMatrix();this.groundColor=new H(b)}function vb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new K}function vd(){vb.call(this,new U(50,1,.5,500))}function wd(a,b,c,d,e,f){ga.call(this,a,b);this.type="SpotLight";
+this.position.copy(A.DefaultUp);this.updateMatrix();this.target=new A;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new vd}function xd(a,b,c,d){ga.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=
+a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new vb(new U(90,1,.5,500))}function yd(){vb.call(this,new Kb(-5,5,5,-5,.5,500))}function zd(a,b){ga.call(this,a,b);this.type="DirectionalLight";this.position.copy(A.DefaultUp);this.updateMatrix();this.target=new A;this.shadow=new yd}function Ad(a,b){ga.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function Bd(a,b,c,d){ga.call(this,a,b);this.type="RectAreaLight";this.position.set(0,1,0);this.updateMatrix();
+this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function xa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Cd(a,b,c,d){xa.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Yc(a,b,c,d){xa.call(this,a,b,c,d)}function Dd(a,b,c,d){xa.call(this,a,b,c,d)}function wb(a,b,c,d){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===
+b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=T.convertArray(b,this.TimeBufferType);this.values=T.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function ic(a,b,c,d){wb.call(this,a,b,c,d)}function Ed(a,b,c,d){xa.call(this,a,b,c,d)}function Zc(a,b,c,d){wb.call(this,a,b,c,d)}function jc(a,b,c,d){wb.call(this,a,b,c,d)}function Fd(a,b,c,d){wb.call(this,a,b,c,d)}function Gd(a,b,c){wb.call(this,a,b,
+c)}function Hd(a,b,c,d){wb.call(this,a,b,c,d)}function xb(a,b,c,d){wb.apply(this,a,b,c,d)}function ka(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=R.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Id(a){this.manager=void 0!==a?a:wa;this.textures={}}function ae(a){this.manager=void 0!==a?a:wa}function kc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function be(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),
+a=void 0);this.manager=void 0!==a?a:wa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:wa;this.texturePath=""}function Se(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function yb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function zb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function S(){this.type="Curve";this.arcLengthDivisions=200}function Ka(a,b){S.call(this);this.type="LineCurve";this.v1=a||
+new C;this.v2=b||new C}function Ab(){S.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function Na(a,b,c,d,e,f,g,h){S.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ab(a){S.call(this);this.type="SplineCurve";this.points=a||[]}function bb(a,b,c,d){S.call(this);this.type="CubicBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=
+c||new C;this.v3=d||new C}function cb(a,b,c){S.call(this);this.type="QuadraticBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C}function Bb(a){Ab.call(this);this.type="Path";this.currentPoint=new C;a&&this.setFromPoints(a)}function Cb(a){Bb.call(this,a);this.type="Shape";this.holes=[]}function ce(){this.type="ShapePath";this.subPaths=[];this.currentPath=null}function de(a){this.type="Font";this.data=a}function Te(a){this.manager=void 0!==a?a:wa}function ee(a){this.manager=void 0!==a?
+a:wa}function Ue(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new U;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new U;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function $c(a,b,c){A.call(this);this.type="CubeCamera";var d=new U(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new U(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new U(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));
+this.add(f);var g=new U(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new U(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new U(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Ib(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,l=c.texture.generateMipmaps;c.texture.generateMipmaps=
+!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=l;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function fe(){A.call(this);this.type="AudioListener";this.context=ge.getContext();this.gain=
+this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function lc(a){A.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function he(a){lc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}
+function ie(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function je(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ve(a,
+b,c){c=c||na.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function na(a,b,c){this.path=b;this.parsedPath=c||na.parseTrackName(b);this.node=na.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(){this.uuid=R.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath=
+{};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function Xe(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=
+this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ye(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),
+a=b);this.value=a}function ke(){D.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function le(a,b,c,d){this.uuid=R.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function mc(a,b){this.uuid=R.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function me(a,b,c){mc.call(this,a,b);this.meshPerAttribute=c||1}function ne(a,
+b,c){P.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new lb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function $e(a,b){return a.distance-b.distance}function oe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=
+a.length;d<e;d++)oe(a[d],b,c,!0)}}function af(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function bf(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function cf(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ad(a){A.call(this);this.material=a;this.render=function(){}}function bd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:
+16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new D;b=new y(6*b,3);c.addAttribute("position",b);ca.call(this,c,new O({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function nc(a,b){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new D;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,
+d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new y(b,3));b=new O({fog:!1});this.cone=new ca(a,b);this.add(this.cone);this.update()}function df(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,df(a.children[c]));return b}function oc(a){for(var b=df(a),c=new D,d=[],e=[],f=new H(0,0,1),g=new H(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,
+0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position",new y(d,3));c.addAttribute("color",new y(e,3));d=new O({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});ca.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function pc(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new ob(b,4,2);b=new va({wireframe:!0,fog:!1});pa.call(this,a,b);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}
+function qc(a,b){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new O({fog:!1});b=new D;b.addAttribute("position",new P(new Float32Array(15),3));this.line=new ma(b,a);this.add(this.line);this.update()}function rc(a,b,c){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new nb(b);a.rotateY(.5*Math.PI);this.material=new va({wireframe:!0,fog:!1});void 0===
+this.color&&(this.material.vertexColors=2);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.addAttribute("color",new P(b,3));this.add(new pa(a,this.material));this.update()}function cd(a,b,c,d){a=a||10;b=b||10;c=new H(void 0!==c?c:4473924);d=new H(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,l=0,q=-g;k<=b;k++,q+=f){a.push(-g,0,q,g,0,q);a.push(q,0,-g,q,0,g);var n=k===e?c:d;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3}b=new D;b.addAttribute("position",
+new y(a,3));b.addAttribute("color",new y(h,3));c=new O({vertexColors:2});ca.call(this,b,c)}function Kd(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new H(void 0!==e?e:4473924);f=new H(void 0!==f?f:8947848);var g=[],h=[],k;for(k=0;k<=b;k++){var l=k/b*2*Math.PI;var q=Math.sin(l)*a;l=Math.cos(l)*a;g.push(0,0,0);g.push(q,0,l);var n=k&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(k=0;k<=c;k++){n=k&1?e:f;var t=a-a/c*k;for(b=0;b<d;b++)l=b/d*2*Math.PI,q=Math.sin(l)*t,l=Math.cos(l)*t,g.push(q,0,l),h.push(n.r,
+n.g,n.b),l=(b+1)/d*2*Math.PI,q=Math.sin(l)*t,l=Math.cos(l)*t,g.push(q,0,l),h.push(n.r,n.g,n.b)}a=new D;a.addAttribute("position",new y(g,3));a.addAttribute("color",new y(h,3));g=new O({vertexColors:2});ca.call(this,a,g)}function dd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");c=new D;
+b=new y(6*b,3);c.addAttribute("position",b);ca.call(this,c,new O({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function sc(a,b,c){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new D;a.addAttribute("position",new y([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new O({fog:!1});this.lightPlane=new ma(a,b);this.add(this.lightPlane);a=new D;a.addAttribute("position",new y([0,0,0,0,0,1],3));this.targetLine=
+new ma(a,b);this.add(this.targetLine);this.update()}function ed(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new D,e=new O({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new H(16755200),l=new H(16711680),q=new H(43775),n=new H(16777215),t=new H(3355443);b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);
+b("n3","f3",k);b("n4","f4",k);b("p","n1",l);b("p","n2",l);b("p","n3",l);b("p","n4",l);b("u1","u2",q);b("u2","u3",q);b("u3","u1",q);b("c","t",n);b("p","c",t);b("cn1","cn2",t);b("cn3","cn4",t);b("cf1","cf2",t);b("cf3","cf4",t);d.addAttribute("position",new y(f,3));d.addAttribute("color",new y(g,3));ca.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Db(a,b){this.object=
+a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new D;d.setIndex(new P(a,1));d.addAttribute("position",new P(c,3));ca.call(this,d,new O({color:b}));this.matrixAutoUpdate=!1;this.update()}function fd(a,b){this.type="Box3Helper";this.box=a;a=void 0!==b?b:16776960;b=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new D;c.setIndex(new P(b,1));c.addAttribute("position",new y([1,1,1,-1,1,1,-1,-1,1,1,-1,
+1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));ca.call(this,c,new O({color:a}));this.geometry.computeBoundingSphere()}function gd(a,b,c){this.type="PlaneHelper";this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new D;b.addAttribute("position",new y([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));b.computeBoundingSphere();ma.call(this,b,new O({color:a}));b=new D;b.addAttribute("position",new y([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();
+this.add(new pa(b,new va({color:a,opacity:.2,transparent:!0,depthWrite:!1})))}function Eb(a,b,c,d,e,f){A.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Ld&&(Ld=new D,Ld.addAttribute("position",new y([0,0,0,0,1,0],3)),pe=new Sa(0,.5,1,5,1),pe.translate(0,-.5,0));this.position.copy(b);this.line=new ma(Ld,new O({color:d}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new pa(pe,new va({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);
+this.setDirection(a);this.setLength(c,e,f)}function hd(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new D;a.addAttribute("position",new y(b,3));a.addAttribute("color",new y([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new O({vertexColors:2});ca.call(this,a,b)}function qe(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,l,q){e=((f-e)/k-(g-e)/(k+l)+(g-f)/l)*l;h=((g-f)/
+l-(h-f)/(l+q)+(h-g)/q)*l;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function ya(a,b,c,d){S.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function Fb(a,b,c,d){S.call(this);this.type="CubicBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function Gb(a,b,c){S.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=
+c||new p}function db(a,b){S.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function id(a,b,c,d,e,f){Na.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function ef(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type="catmullrom";this.closed=!0}function ff(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type="catmullrom"}function re(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");
+ya.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===
+a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(ja.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;
+var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var b=b.slice(0),c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var R={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),
+b=0,c;return function(){for(var d="",e=0;36>e;e++)8===e||13===e||18===e||23===e?d+="-":14===e?d+="4":(2>=b&&(b=33554432+16777216*Math.random()|0),c=b&15,b>>=4,d+=a[19===e?c&3|8:c]);return d}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,
+b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*R.DEG2RAD},radToDeg:function(a){return a*R.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,
+Math.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;
+default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},
+addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;
+return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=
+Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);
+this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+
+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=
+(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);
+return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(K.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,l,q,n,t,m,p,v){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=k;r[6]=l;r[10]=q;r[14]=n;r[3]=t;r[7]=m;r[11]=p;r[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},
+copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
+b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
+var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){var k=f*h;var l=f*e;var q=c*h;a=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+q*d;b[5]=k-a*d;b[9]=-c*g;b[2]=a-k*d;b[6]=q+l*d;b[10]=f*g}else"YXZ"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k+a*c,b[4]=q*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-q,b[6]=a+k*c,b[10]=f*g):"ZXY"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k-a*c,b[4]=-f*e,b[8]=q+l*c,b[1]=l+q*c,b[5]=f*h,b[9]=
+a-k*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(k=f*h,l=f*e,q=c*h,a=c*e,b[0]=g*h,b[4]=q*d-l,b[8]=k*d+a,b[1]=g*e,b[5]=a*d+k,b[9]=l*d-q,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=a-k*e,b[8]=q*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+q,b[10]=k-a*e):"XZY"===a.order&&(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=k*e+a,b[5]=f*h,b[9]=l*e-q,b[2]=q*e-l,b[6]=c*h,b[10]=a*e+k);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=
+this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var l=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,
+c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;
+b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],l=c[9],q=c[13],n=c[2],m=c[6],r=c[10],p=c[14],v=c[3],w=c[7],x=c[11],c=c[15],z=d[0],I=d[4],B=d[8],J=d[12],y=d[1],C=d[5],A=d[9],D=d[13],E=d[2],H=d[6],L=d[10],Y=d[14],N=d[3],M=d[7],V=d[11],d=d[15];b[0]=a*z+e*y+f*E+g*N;b[4]=a*I+e*C+f*H+g*M;b[8]=a*B+e*A+f*L+g*V;b[12]=a*J+e*D+f*Y+g*d;b[1]=h*z+k*y+l*E+q*N;b[5]=h*I+k*C+l*H+q*M;b[9]=h*B+k*A+l*L+q*V;b[13]=h*J+k*D+l*Y+q*d;b[2]=n*z+m*y+r*E+p*N;b[6]=n*I+m*C+r*H+p*M;b[10]=n*B+m*A+r*L+p*V;b[14]=n*J+m*
+D+r*Y+p*d;b[3]=v*z+w*y+x*E+c*N;b[7]=v*I+w*C+x*H+c*M;b[11]=v*B+w*A+x*L+c*V;b[15]=v*J+w*D+x*Y+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=
+this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],l=a[2],q=a[6],n=a[10],m=a[14];return a[3]*(+e*h*q-d*k*q-e*g*n+c*k*n+d*g*m-c*h*m)+a[7]*(+b*h*m-b*k*n+e*f*n-d*f*m+d*k*l-e*h*l)+a[11]*(+b*k*q-b*g*m-e*f*q+c*f*m+e*g*l-c*k*l)+a[15]*(-d*g*l-b*h*q+b*g*n+d*f*q-c*f*n+c*h*l)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=
+this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements;a=d[0];var e=d[1],f=d[2],g=d[3],h=d[4],k=d[5],l=d[6],q=d[7],n=d[8],m=d[9],r=d[10],p=d[11],v=d[12],w=d[13],x=d[14],d=d[15],z=m*x*q-w*r*q+w*l*p-k*x*p-m*l*d+k*r*d,I=v*r*q-n*x*q-v*l*p+h*x*p+n*l*d-h*r*d,B=n*w*q-v*m*q+v*k*p-h*w*p-n*k*d+h*m*d,J=v*m*l-n*w*l-v*k*r+h*w*r+n*k*x-h*m*x,y=a*z+e*I+f*B+g*J;if(0===y){if(!0===b)throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");
+console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/y;c[0]=z*b;c[1]=(w*r*g-m*x*g-w*f*p+e*x*p+m*f*d-e*r*d)*b;c[2]=(k*x*g-w*l*g+w*f*q-e*x*q-k*f*d+e*l*d)*b;c[3]=(m*l*g-k*r*g-m*f*q+e*r*q+k*f*p-e*l*p)*b;c[4]=I*b;c[5]=(n*x*g-v*r*g+v*f*p-a*x*p-n*f*d+a*r*d)*b;c[6]=(v*l*g-h*x*g-v*f*q+a*x*q+h*f*d-a*l*d)*b;c[7]=(h*r*g-n*l*g+n*f*q-a*r*q-h*f*p+a*l*p)*b;c[8]=B*b;c[9]=(v*m*g-n*w*g-v*e*p+a*w*p+n*e*d-a*m*d)*b;c[10]=(h*w*g-v*k*g+v*e*q-a*w*q-h*e*d+a*k*d)*b;c[11]=
+(n*k*g-h*m*g-n*e*q+a*m*q+h*e*p-a*k*p)*b;c[12]=J*b;c[13]=(n*w*f-v*m*f+v*e*r-a*w*r-n*e*x+a*m*x)*b;c[14]=(v*k*f-h*w*f-v*e*l+a*w*l+h*e*x-a*k*x)*b;c[15]=(h*m*f-n*k*f+n*e*l-a*m*l-h*e*r+a*k*r)*b;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],
+a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=
+Math.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new p,b=new K;return function(c,
+d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,l=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=l;b.elements[9]*=l;b.elements[10]*=l;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
+var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),l=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*l;g[14]=-((f+e)*l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;
+a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(Z,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,
+d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],l=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||l!==n){f=1-g;var m=h*d+k*q+l*n+c*e,r=0<=m?1:-1,p=1-m*m;p>Number.EPSILON&&(p=Math.sqrt(p),m=Math.atan2(p,m*r),f=Math.sin(f*m)/p,g=Math.sin(g*m)/p);r*=g;h=h*f+d*r;k=k*f+q*r;l=l*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+l*l+c*c),h*=g,k*=g,l*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=l;a[b+3]=c}});Object.defineProperties(Z.prototype,{x:{get:function(){return this._x},
+set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(Z.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,
+this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2),f=f(e/2),c=g(c/2),d=g(d/2),e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+
+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,
+b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],l=c+f+b;0<l?(c=.5/Math.sqrt(l+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=
+.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=
+-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},
+multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();
+return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g),g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;
+this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=
+a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;
+case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},
+addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=
+a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new Z;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");
+return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new Z;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*
+d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,l=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-l*-f;this.y=k*a+b*-f+l*-e-h*-g;this.z=l*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld,
+a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=
+Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=
+Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=
+-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-
+this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=
+a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(R.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-
+a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=
+a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=
+[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var l=this.elements;l[0]=a;l[1]=d;l[2]=g;l[3]=b;l[4]=e;l[5]=h;l[6]=c;l[7]=f;l[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},
+copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,
+a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],k=c[7],l=c[2],q=c[5],c=c[8],n=d[0],m=d[3],r=d[6],p=d[1],v=d[4],w=d[7],x=d[2],z=d[5],d=d[8];b[0]=a*n+e*p+f*x;b[3]=a*m+e*v+f*z;b[6]=a*r+e*w+f*d;b[1]=g*n+h*p+k*x;b[4]=g*m+h*v+k*z;b[7]=g*r+h*w+k*d;b[2]=l*n+q*p+c*x;b[5]=l*m+q*v+c*z;b[8]=l*r+q*w+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;
+b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");var c=a.elements;a=this.elements;var d=c[0],e=c[1],f=c[2],g=c[3],h=c[4],k=c[5],l=c[6],q=c[7],c=c[8],n=c*h-k*q,m=k*l-c*g,r=q*g-h*l,p=d*n+e*m+f*r;if(0===p){if(!0===
+b)throw Error("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");console.warn("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/p;a[0]=n*b;a[1]=(f*q-c*e)*b;a[2]=(k*e-f*h)*b;a[3]=m*b;a[4]=(c*d-f*l)*b;a[5]=(f*g-k*d)*b;a[6]=r*b;a[7]=(e*l-q*d)*b;a[8]=(h*d-e*g)*b;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},
+transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],
+k=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*k;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*k;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=
+this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var kf=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;Object.defineProperty(ea.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ea.prototype,ja.prototype,{constructor:ea,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=
+a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;
+return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};
+if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=R.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var k=h.getContext("2d");d instanceof ImageData?k.putImageData(d,0,0):k.drawImage(d,0,0,d.width,d.height)}h=2048<h.width||2048<h.height?h.toDataURL("image/jpeg",.6):h.toDataURL("image/png");e[f]={uuid:g,
+url:h}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%
+2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(da.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;
+case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
+this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,
+b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*
+e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var k=a[6];var l=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+
+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+l-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;l=(l+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>l?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>l?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>l?(h=k=.707106781,c=0):(c=Math.sqrt(l),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;
+this.w=Math.acos((b+f+l-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,
+this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new da,b=new da);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);
+this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},
+dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=
+(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,
+b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Hb.prototype,ja.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=
+a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Ib.prototype=Object.create(Hb.prototype);Ib.prototype.constructor=Ib;Ib.prototype.isWebGLRenderTargetCube=!0;fb.prototype=Object.create(ea.prototype);fb.prototype.constructor=fb;fb.prototype.isDataTexture=!0;Ua.prototype=Object.create(ea.prototype);Ua.prototype.constructor=
+Ua;Ua.prototype.isCubeTexture=!0;Object.defineProperty(Ua.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Be=new ea,Ce=new Ua,we=[],ye=[],Ae=new Float32Array(16),ze=new Float32Array(9);Ge.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Od=/([\w\d_]+)(\])?(\[|\.)?/g;gb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};gb.prototype.setOptional=function(a,
+b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var sg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,
+cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,
+deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,
+lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,
+mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,
+royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&
+a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=R.euclideanModulo(b,
+1);c=R.clamp(c,0,1);d=R.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,
+parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/360,
+e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=sg[a],void 0!==
+c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(){var a=
+this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):
+k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=
+a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=
+0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var E={common:{diffuse:{value:new H(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ra},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},
 aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new C(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},
-fogFar:{value:2E3},fogColor:{value:new G(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},
-pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new G(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)}}},Ca={merge:function(a){for(var b=
-{},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},X={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",
+fogFar:{value:2E3},fogColor:{value:new H(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},
+pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new H(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ra}}},
+Ea={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},W={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",
 alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",
-aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",
+aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",
 bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",
 clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",
 clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
-color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n",
+color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n",
 cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
 defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",
 emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM            = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",
+envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",
 envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
 envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",
 fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",
 gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",
 lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
-lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
+lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
 lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",
 lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
 lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3(   1,   0, t.y ),\n\t\t\tvec3(   0, t.z,   0 ),\n\t\t\tvec3( t.w,   0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",
-lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",
-logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n",
-map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n",
+lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",
+logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n",
+map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n",
 metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",
 morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
-normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
+normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
 normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
+packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
 premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n",
-roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",
+roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",
 shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",
 shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
+shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
 skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",
 skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",
-specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
-uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n",
-uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
-cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
+specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
+uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n",
+uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
+uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
+cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
 depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",
-distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n",
-equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",
+distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n",
+distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n",
+equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",
 linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
 linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n",
-meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
+meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
 meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
+meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
 meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
+meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
 meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
+meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
 meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",
+normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",
 normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",
 points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
 points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"},$a={basic:{uniforms:Ca.merge([R.common,
-R.aomap,R.lightmap,R.fog]),vertexShader:X.meshbasic_vert,fragmentShader:X.meshbasic_frag},lambert:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.fog,R.lights,{emissive:{value:new G(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.gradientmap,R.fog,R.lights,{emissive:{value:new G(0)},specular:{value:new G(1118481)},shininess:{value:30}}]),vertexShader:X.meshphong_vert,
-fragmentShader:X.meshphong_frag},standard:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.roughnessmap,R.metalnessmap,R.fog,R.lights,{emissive:{value:new G(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:Ca.merge([R.points,R.fog]),vertexShader:X.points_vert,fragmentShader:X.points_frag},dashed:{uniforms:Ca.merge([R.common,R.fog,{scale:{value:1},
-dashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,fragmentShader:X.linedashed_frag},depth:{uniforms:Ca.merge([R.common,R.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:Ca.merge([R.common,R.bumpmap,R.normalmap,R.displacementmap,{opacity:{value:1}}]),vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert,fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null},
-tFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new n}},vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};$a.physical={uniforms:Ca.merge([$a.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};Object.assign(fd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();
-for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||
-this.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<
-this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},
-distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Jf=0;Object.assign(U.prototype,xa.prototype,{isMaterial:!0,onBeforeCompile:function(){},
-setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});
-var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);
-void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&
-(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&
-(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==
-this.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&
-(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);d.skinning=this.skinning;d.morphTargets=this.morphTargets;d.dithering=this.dithering;c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=
-a.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=
-a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});
-ra.prototype=Object.create(U.prototype);ra.prototype.constructor=ra;ra.prototype.isShaderMaterial=!0;ra.prototype.copy=function(a){U.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ca.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=
-a.extensions;return this};ra.prototype.toJSON=function(a){a=U.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Za.prototype=Object.create(U.prototype);Za.prototype.constructor=Za;Za.prototype.isMeshDepthMaterial=!0;Za.prototype.copy=function(a){U.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=
-a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Object.assign(Ra.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],q=a[h+1],l=a[h+2];m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);
-l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),q=a.getY(h),l=a.getZ(h);m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=
-new n;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<
-this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){var a=
-new n;return function(b){var c=this;b.updateMatrixWorld(!0);b.traverse(function(b){var e,f;e=b.geometry;if(void 0!==e)if(e.isGeometry){var g=e.vertices;e=0;for(f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}else if(e.isBufferGeometry&&(g=e.attributes.position,void 0!==g))for(e=0,f=g.count;e<f;e++)a.fromBufferAttribute(g,e).applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||
-a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new n).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<
-this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new n;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x):(b=a.normal.x*this.max.x,c=a.normal.x*this.min.x);0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*
-this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,b){return(b||new n).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new n;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new n;return function(b){b=b||new Ea;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);
-this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new n,new n,new n,new n,new n,new n,new n,new n];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,
-this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ea.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=
-new Ra;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-
-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new n;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=
-a||new Ra;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ba.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,
-0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),
-a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[3],h=c[6],k=c[1],m=c[4],q=c[7],l=c[2],p=c[5],c=c[8],r=d[0],n=d[3],t=d[6],y=d[1],x=d[4],u=d[7],H=d[2],w=d[5],d=d[8];e[0]=f*r+g*y+h*H;e[3]=f*n+g*x+h*w;e[6]=f*t+g*u+h*d;e[1]=k*r+m*y+q*H;e[4]=k*n+m*x+q*w;e[7]=k*t+m*u+q*d;e[2]=l*r+p*y+c*H;
-e[5]=l*n+p*x+c*w;e[8]=l*t+p*u+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],
-h=c[3],k=c[4],m=c[5],q=c[6],l=c[7],c=c[8],p=c*k-m*l,r=m*q-c*h,n=l*h-k*q,t=e*p+f*r+g*n;if(0===t){if(!0===b)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return this.identity()}t=1/t;d[0]=p*t;d[1]=(g*l-c*f)*t;d[2]=(m*f-g*k)*t;d[3]=r*t;d[4]=(c*e-g*q)*t;d[5]=(g*h-m*e)*t;d[6]=n*t;d[7]=(f*q-l*e)*t;d[8]=(k*e-f*h)*t;return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=
-a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},
-toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=
-new n,b=new n;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+
-this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||new n).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new n;return function(b,c){var d=c||new n,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/
-f,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new n).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new n,b=new Ba;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c),
-f=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(gd.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=
-this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],q=c[8],l=c[9],p=c[10],r=c[11],n=c[12],t=c[13],y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-q,c-n).normalize();b[1].setComponents(f+a,m+g,r+q,c+n).normalize();b[2].setComponents(f+d,m+h,r+l,c+t).normalize();b[3].setComponents(f-d,m-h,r-l,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-y).normalize();b[5].setComponents(f+e,
-m+k,r+p,c+y).normalize();return this},intersectsObject:function(){var a=new Ea;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ea;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=
-0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new n,b=new n;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>
-c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});ab.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");ab.DefaultOrder="XYZ";Object.defineProperties(ab.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;
-this.onChangeCallback()}}});Object.assign(ab.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=Y.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],q=e[2],l=e[6],
-e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(l,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,
--1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(l,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(l,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=
-b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new oa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=
-a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new n(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Qd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=
-this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});var Lf=0;z.DefaultUp=new n(0,1,0);z.DefaultMatrixAutoUpdate=!0;Object.assign(z.prototype,xa.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);
-return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new oa;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new n(1,0,0);return function(b){return this.rotateOnAxis(a,
-b)}}(),rotateY:function(){var a=new n(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new n(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new n;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new n(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new n(0,1,0);return function(b){return this.translateOnAxis(a,
-b)}}(),translateZ:function(){var a=new n(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new K;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new K;return function(b){this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=
-0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);
--1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new n;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},
-getWorldQuaternion:function(){var a=new n,b=new n;return function(c){c=c||new oa;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new oa;return function(b){b=b||new ab;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new n,b=new oa;return function(c){c=c||new n;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new oa;
-return function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,
-this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],
-c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||""===a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);f.matrix=this.matrix.toArray();
-void 0!==this.geometry&&(f.geometry=b(a.geometries,this.geometry));if(void 0!==this.material)if(Array.isArray(this.material)){for(var g=[],h=0,k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);d&&(d=c(a.geometries),g=c(a.materials),h=c(a.textures),k=c(a.images),0<d.length&&(e.geometries=d),0<g.length&&
-(e.materials=g),0<h.length&&(e.textures=h),0<k.length&&(e.images=k));e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.layers.mask=a.layers.mask;
-this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});Na.prototype=Object.assign(Object.create(z.prototype),{constructor:Na,isCamera:!0,copy:function(a,b){z.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);
-return this},getWorldDirection:function(){var a=new oa;return function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){z.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Fb.prototype=Object.assign(Object.create(Na.prototype),{constructor:Fb,isOrthographicCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.left=a.left;
-this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),
-c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,
-a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});qa.prototype=Object.assign(Object.create(Na.prototype),{constructor:qa,isPerspectiveCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=
-null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*Y.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*Y.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*Y.RAD2DEG*Math.atan(Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},
-getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/
-g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});
-Object.assign(Sa.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Rd=0;Object.assign(J.prototype,xa.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=
-(new Ba).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);
-this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);
-a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[q[a].clone(),q[b].clone(),q[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Sa(a,b,d,f,r,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([l[a].clone(),l[b].clone(),l[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([p[a].clone(),p[b].clone(),p[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,
-g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var q=[],l=[],p=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new n(f[e],f[e+1],f[e+2])),void 0!==g&&q.push(new n(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new G(h[e],h[e+1],h[e+2])),void 0!==k&&l.push(new C(k[r],k[r+1])),void 0!==m&&p.push(new C(m[r],m[r+1]));var ca=a.groups;if(0<ca.length)for(e=0;e<
-ca.length;e++)for(var f=ca[e],t=f.start,y=f.count,r=t,t=t+y;r<t;r+=3)void 0!==d?b(d[r],d[r+1],d[r+2],f.materialIndex):b(r,r+1,r+2,f.materialIndex);else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();
-this.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new K;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new n,b=new n,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},
-computeVertexNormals:function(a){void 0===a&&(a=!0);var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new n;if(a){var e,f,g,h=new n,k=new n;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(),a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),
-d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),
-d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):
-e.__originalVertexNormals[a]=e.vertexNormals[a].clone();var f=new J;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=0;for(d=this.faces.length;c<d;c++)h=new n,k={a:new n,b:new n,c:new n},e.push(h),g.push(k)}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();
-f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Ra);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Ea);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],q=a.faceVertexUvs[0],l=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new Ba).getNormalMatrix(b));a=0;for(var r=g.length;a<
-r;a++){var n=g[a].clone();void 0!==b&&n.applyMatrix4(b);f.push(n)}a=0;for(r=p.length;a<r;a++)l.push(p[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],t=g.vertexNormals,p=g.vertexColors,l=new Sa(g.a+e,g.b+e,g.c+e);l.normal.copy(g.normal);void 0!==d&&l.normal.applyMatrix3(d).normalize();b=0;for(f=t.length;b<f;b++)n=t[b].clone(),void 0!==d&&n.applyMatrix3(d).normalize(),l.vertexNormals.push(n);l.color.copy(g.color);b=0;for(f=p.length;b<f;b++)n=p[b],l.vertexColors.push(n.clone());l.materialIndex=g.materialIndex+
-c;h.push(l)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a)},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<
-g;f++)d=this.vertices[f],d=Math.round(d.x*e)+"_"+Math.round(d.y*e)+"_"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,1);f=this.vertices.length-b.length;this.vertices=
-b;return f},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+
-a.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==l[b])return l[b];l[b]=q.length;q.push(a.getHex());return l[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==
-this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],m={},q=[],l={},p=[],r={};for(g=0;g<this.faces.length;g++){var n=this.faces[g],t=void 0!==this.faceVertexUvs[0][g],y=0<n.normal.length(),x=0<n.vertexNormals.length,u=1!==n.color.r||1!==n.color.g||1!==n.color.b,H=0<n.vertexColors.length,w=0,w=a(w,0,0),w=a(w,1,!0),w=a(w,2,!1),w=a(w,3,t),w=a(w,4,y),w=a(w,5,x),w=a(w,6,
-u),w=a(w,7,H);h.push(w);h.push(n.a,n.b,n.c);h.push(n.materialIndex);t&&(t=this.faceVertexUvs[0][g],h.push(d(t[0]),d(t[1]),d(t[2])));y&&h.push(b(n.normal));x&&(y=n.vertexNormals,h.push(b(y[0]),b(y[1]),b(y[2])));u&&h.push(c(n.color));H&&(n=n.vertexColors,h.push(c(n[0]),c(n[1]),c(n[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<q.length&&(e.data.colors=q);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new J).copy(this)},copy:function(a){var b,c,d,e,f,g;this.vertices=
-[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;d=a.vertices;b=0;for(c=d.length;b<c;b++)this.vertices.push(d[b].clone());d=a.colors;b=0;for(c=d.length;b<c;b++)this.colors.push(d[b].clone());d=a.faces;b=0;for(c=d.length;b<c;b++)this.faces.push(d[b].clone());b=0;for(c=a.faceVertexUvs.length;b<c;b++){var h=a.faceVertexUvs[b];void 0===
-this.faceVertexUvs[b]&&(this.faceVertexUvs[b]=[]);d=0;for(e=h.length;d<e;d++){var k=h[d],m=[];f=0;for(g=k.length;f<g;f++)m.push(k[f].clone());this.faceVertexUvs[b].push(m)}}f=a.morphTargets;b=0;for(c=f.length;b<c;b++){g={};g.name=f[b].name;if(void 0!==f[b].vertices)for(g.vertices=[],d=0,e=f[b].vertices.length;d<e;d++)g.vertices.push(f[b].vertices[d].clone());if(void 0!==f[b].normals)for(g.normals=[],d=0,e=f[b].normals.length;d<e;d++)g.normals.push(f[b].normals[d].clone());this.morphTargets.push(g)}f=
-a.morphNormals;b=0;for(c=f.length;b<c;b++){g={};if(void 0!==f[b].vertexNormals)for(g.vertexNormals=[],d=0,e=f[b].vertexNormals.length;d<e;d++)h=f[b].vertexNormals[d],k={},k.a=h.a.clone(),k.b=h.b.clone(),k.c=h.c.clone(),g.vertexNormals.push(k);if(void 0!==f[b].faceNormals)for(g.faceNormals=[],d=0,e=f[b].faceNormals.length;d<e;d++)g.faceNormals.push(f[b].faceNormals[d].clone());this.morphNormals.push(g)}d=a.skinWeights;b=0;for(c=d.length;b<c;b++)this.skinWeights.push(d[b].clone());d=a.skinIndices;b=
-0;for(c=d.length;b<c;b++)this.skinIndices.push(d[b].clone());d=a.lineDistances;b=0;for(c=d.length;b<c;b++)this.lineDistances.push(d[b]);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;
-this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(Z.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(Z.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=
-new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",
-d),f=new G);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new C);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=
-a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new n);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new fa);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*
-this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+
-1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)}});pc.prototype=Object.create(Z.prototype);pc.prototype.constructor=pc;qc.prototype=Object.create(Z.prototype);
-qc.prototype.constructor=qc;rc.prototype=Object.create(Z.prototype);rc.prototype.constructor=rc;sc.prototype=Object.create(Z.prototype);sc.prototype.constructor=sc;gb.prototype=Object.create(Z.prototype);gb.prototype.constructor=gb;tc.prototype=Object.create(Z.prototype);tc.prototype.constructor=tc;hb.prototype=Object.create(Z.prototype);hb.prototype.constructor=hb;B.prototype=Object.create(Z.prototype);B.prototype.constructor=B;uc.prototype=Object.create(Z.prototype);uc.prototype.constructor=uc;
-Object.assign(Je.prototype,{computeGroups:function(a){var b,c=[],d=void 0;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length,k;if(0<h){k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=
-k}var q=a.morphNormals,l=q.length,p;if(0<l){p=[];for(m=0;m<l;m++)p[m]=[];this.morphTargets.normal=p}for(var r=a.skinIndices,n=a.skinWeights,t=r.length===c.length,y=n.length===c.length,m=0;m<b.length;m++){var x=b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var u=x.vertexNormals;3===u.length?this.normals.push(u[0],u[1],u[2]):(u=x.normal,this.normals.push(u,u,u));u=x.vertexColors;3===u.length?this.colors.push(u[0],u[1],u[2]):(u=x.color,this.colors.push(u,u,u));!0===e&&(u=d[0][m],void 0!==u?this.uvs.push(u[0],
-u[1],u[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new C,new C,new C)));!0===f&&(u=d[1][m],void 0!==u?this.uvs2.push(u[0],u[1],u[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new C,new C,new C)));for(u=0;u<h;u++){var H=g[u].vertices;k[u].push(H[x.a],H[x.b],H[x.c])}for(u=0;u<l;u++)H=q[u].vertexNormals[m],p[u].push(H.a,H.b,H.c);t&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);y&&this.skinWeights.push(n[x.a],
-n[x.b],n[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});E.MaxIndex=65535;Object.assign(E.prototype,xa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<Sd(a)?hb:gb)(a,1):this.index=a},addAttribute:function(a,b,c){if(b&&b.isBufferAttribute||
-b&&b.isInterleavedBufferAttribute)if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new Z(b,c))},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==
-c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new Ba).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);
-this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);
-a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,
-1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=
-b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=
-!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},
-fromGeometry:function(a){a.__directGeometry=(new Je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new Z(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new Z(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new Z(b,3)).copyColorsArray(a.colors)));
-0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new Z(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new Z(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<Sd(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new Z(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],
-h=new B(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Ra);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Ra,b=new n;return function(){null===this.boundingSphere&&
-(this.boundingSphere=new Ea);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},
-computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new Z(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,k,m,q=new n,l=new n,p=new n,r=new n,ca=new n;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var t=0,y=c.length;t<y;++t)for(f=c[t],g=f.start,h=f.count,f=g,g+=h;f<g;f+=3)h=3*a[f+0],k=3*a[f+1],m=3*a[f+2],
-q.fromArray(d,h),l.fromArray(d,k),p.fromArray(d,m),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[h]+=r.x,e[h+1]+=r.y,e[h+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z,e[m]+=r.x,e[m+1]+=r.y,e[m+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)q.fromArray(d,f),l.fromArray(d,f+3),p.fromArray(d,f+6),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,
-b){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b,c,d,e,f=0,g=a.count;f<g;f++)b=a.getX(f),c=a.getY(f),d=a.getZ(f),e=1/Math.sqrt(b*b+c*c+d*d),a.setXYZ(f,b*e,c*e,d*e)},toNonIndexed:function(){if(null===
-this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new E,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,m=0,q=b.length;m<q;m++){h=b[m]*e;for(var l=0;l<e;l++)g[k++]=f[h++]}a.addAttribute(d,new Z(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&
-(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));
-c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new E).copy(this)},copy:function(a){var b,c,d;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(b in c)this.addAttribute(b,c[b].clone());var e=a.morphAttributes;for(b in e){var f=[],g=e[b];c=0;for(d=g.length;c<d;c++)f.push(g[c].clone());
-this.morphAttributes[b]=f}b=a.groups;c=0;for(d=b.length;c<d;c++)e=b[c],this.addGroup(e.start,e.count,e.materialIndex);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Gb.prototype=Object.create(J.prototype);Gb.prototype.constructor=Gb;ib.prototype=Object.create(E.prototype);ib.prototype.constructor=
-ib;vc.prototype=Object.create(J.prototype);vc.prototype.constructor=vc;jb.prototype=Object.create(E.prototype);jb.prototype.constructor=jb;ya.prototype=Object.create(U.prototype);ya.prototype.constructor=ya;ya.prototype.isMeshBasicMaterial=!0;ya.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=
-a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};Object.assign(kb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new n).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new n;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new n;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},
-distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new n;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);
-var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),q=-c.dot(b),l=c.lengthSq(),p=Math.abs(1-k*k),r;0<p?(d=k*q-m,e=k*m-q,r=h*p,0<=d?e>=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*q)+l):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-q),h),k=-d*d+e*(e+2*q)+l):e<=r?(d=0,e=Math.min(Math.max(-h,-q),h),k=e*(e+2*q)+l):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,
--q),h),k=-d*d+e*(e+2*q)+l)):(e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new n;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=
-a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;
-var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new n;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=
-new n,b=new n,c=new n,d=new n;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},
-equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Hb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new n).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new n).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},
-distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new n;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new n,b=new n;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=Y.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new n;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);
-this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Ta,{normal:function(){var a=new n;return function(b,c,d,e){e=e||new n;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=
-b.dot(b);g=b.dot(c);var m=d*k-e*e;h=h||new n;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new n;return function(b,c,d,e){b=Ta.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Ta.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new n,b=new n;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new n).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ta.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Ta.barycoordFromPoint(a,
-this.a,this.b,this.c,b)},containsPoint:function(a){return Ta.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new Aa,b=[new Hb,new Hb,new Hb],c=new n,d=new n;return function(e,f){var g=f||new n,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;k<b.length;k++){b[k].closestPointToPoint(c,!0,d);var m=c.distanceToSquared(d);
-m<h&&(h=m,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});la.prototype=Object.assign(Object.create(z.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){z.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry,b,c;if(a.isBufferGeometry){if(a=a.morphAttributes,b=Object.keys(a),0<b.length){var d=a[b[0]];if(void 0!==d)for(this.morphTargetInfluences=
-[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a}}else if(d=a.morphTargets,void 0!==d&&0<d.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a},raycast:function(){function a(a,b,c,d,e,f,g){Ta.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);
-e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;x.copy(g);x.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(x);return c<b.near||c>b.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,q,l,n){g.fromBufferAttribute(f,q);h.fromBufferAttribute(f,l);k.fromBufferAttribute(f,n);if(c=b(c,d,e,g,h,k,y))m&&(p.fromBufferAttribute(m,q),r.fromBufferAttribute(m,
-l),ca.fromBufferAttribute(m,n),c.uv=a(y,g,h,k,p,r,ca)),c.face=new Sa(q,l,n,Ta.normal(g,h,k)),c.faceIndex=q;return c}var d=new K,e=new kb,f=new Ea,g=new n,h=new n,k=new n,m=new n,q=new n,l=new n,p=new C,r=new C,ca=new C,t=new n,y=new n,x=new n;return function(n,t){var w=this.geometry,x=this.material,B=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(B),!1!==n.ray.intersectsSphere(f)&&(d.getInverse(B),e.copy(n.ray).applyMatrix4(d),
-null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var D;if(w.isBufferGeometry){var O,C,x=w.index,F=w.attributes.position,B=w.attributes.uv,z,T;if(null!==x)for(z=0,T=x.count;z<T;z+=3){if(w=x.getX(z),O=x.getX(z+1),C=x.getX(z+2),D=c(this,n,e,F,B,w,O,C))D.faceIndex=Math.floor(z/3),t.push(D)}else for(z=0,T=F.count;z<T;z+=3)if(w=z,O=z+1,C=z+2,D=c(this,n,e,F,B,w,O,C))D.index=w,t.push(D)}else if(w.isGeometry){var E,B=Array.isArray(x);z=w.vertices;T=w.faces;O=w.faceVertexUvs[0];0<O.length&&(F=O);
-for(var G=0,K=T.length;G<K;G++){var P=T[G];D=B?x[P.materialIndex]:x;if(void 0!==D){O=z[P.a];C=z[P.b];E=z[P.c];if(!0===D.morphTargets){D=w.morphTargets;var M=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var V=0,pa=D.length;V<pa;V++){var S=M[V];if(0!==S){var N=D[V].vertices;g.addScaledVector(m.subVectors(N[P.a],O),S);h.addScaledVector(q.subVectors(N[P.b],C),S);k.addScaledVector(l.subVectors(N[P.c],E),S)}}g.add(O);h.add(C);k.add(E);O=g;C=h;E=k}if(D=b(this,n,e,O,C,E,y))F&&F[G]&&
-(M=F[G],p.copy(M[0]),r.copy(M[1]),ca.copy(M[2]),D.uv=a(y,O,C,E,p,r,ca)),D.face=P,D.faceIndex=G,t.push(D)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var bg=0;kd.prototype=Object.assign(Object.create(qa.prototype),{constructor:kd,isArrayCamera:!0});Ib.prototype.isFogExp2=!0;Ib.prototype.clone=function(){return new Ib(this.color.getHex(),this.density)};Ib.prototype.toJSON=function(a){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};
-Jb.prototype.isFog=!0;Jb.prototype.clone=function(){return new Jb(this.color.getHex(),this.near,this.far)};Jb.prototype.toJSON=function(a){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};ld.prototype=Object.assign(Object.create(z.prototype),{constructor:ld,copy:function(a,b){z.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());
-this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=z.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Yd.prototype=Object.assign(Object.create(z.prototype),{constructor:Yd,isLensFlare:!0,copy:function(a){z.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=
-0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new G(16777215));void 0===d&&(d=1);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],
-c.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)}});bb.prototype=Object.create(U.prototype);bb.prototype.constructor=bb;bb.prototype.isSpriteMaterial=!0;bb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};xc.prototype=Object.assign(Object.create(z.prototype),{constructor:xc,isSprite:!0,raycast:function(){var a=
-new n,b=new n,c=new n;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f||(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});yc.prototype=Object.assign(Object.create(z.prototype),{constructor:yc,copy:function(a){z.prototype.copy.call(this,a,
-!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new n;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=
-b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new n,b=new n;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.levels=
-[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(zc.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new K;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b,c;b=0;for(c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<
-c;b++)if(a=this.bones[b])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new K,b=new K;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new zc(this.bones,
-this.boneInverses)}});md.prototype=Object.assign(Object.create(z.prototype),{constructor:md,isBone:!0});nd.prototype=Object.assign(Object.create(la.prototype),{constructor:nd,isSkinnedMesh:!0,initBones:function(){var a=[],b,c,d,e;if(this.geometry&&void 0!==this.geometry.bones){d=0;for(e=this.geometry.bones.length;d<e;d++)c=this.geometry.bones[d],b=new md,a.push(b),b.name=c.name,b.position.fromArray(c.pos),b.quaternion.fromArray(c.rotq),void 0!==c.scl&&b.scale.fromArray(c.scl);d=0;for(e=this.geometry.bones.length;d<
-e;d++)c=this.geometry.bones[d],-1!==c.parent&&null!==c.parent&&void 0!==a[c.parent]?a[c.parent].add(a[d]):this.add(a[d])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a,b;if(this.geometry&&this.geometry.isGeometry)for(b=0;b<this.geometry.skinWeights.length;b++){var c=
-this.geometry.skinWeights[b];a=1/c.lengthManhattan();Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var c=new fa,d=this.geometry.attributes.skinWeight;for(b=0;b<d.count;b++)c.x=d.getX(b),c.y=d.getY(b),c.z=d.getZ(b),c.w=d.getW(b),a=1/c.lengthManhattan(),Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0),d.setXYZW(b,c.x,c.y,c.z,c.w)}},updateMatrixWorld:function(a){la.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):
-"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ea.prototype=Object.create(U.prototype);ea.prototype.constructor=ea;ea.prototype.isLineBasicMaterial=!0;ea.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;
-return this};sa.prototype=Object.assign(Object.create(z.prototype),{constructor:sa,isLine:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new n,m=new n,h=new n,q=new n,l=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var p=g.index,
-r=g.attributes.position.array;if(null!==p)for(var p=p.array,g=0,ca=p.length-1;g<ca;g+=l){var t=p[g+1];k.fromArray(r,3*p[g]);m.fromArray(r,3*t);t=b.distanceSqToSegment(k,m,q,h);t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,ca=r.length/3-1;g<ca;g+=l)k.fromArray(r,3*g),m.fromArray(r,3*g+3),t=b.distanceSqToSegment(k,m,q,h),t>f||(q.applyMatrix4(this.matrixWorld),
-t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=l)t=b.distanceSqToSegment(k[g],k[g+1],q,h),t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,
-this.material)).copy(this)}});Q.prototype=Object.assign(Object.create(sa.prototype),{constructor:Q,isLineSegments:!0});od.prototype=Object.assign(Object.create(sa.prototype),{constructor:od,isLineLoop:!0});Fa.prototype=Object.create(U.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isPointsMaterial=!0;Fa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype),
-{constructor:Kb,isPoints:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<q){var h=b.closestPointToPoint(a);h.applyMatrix4(k);var m=d.ray.origin.distanceTo(h);m<d.near||m>d.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);
-c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),q=m*m,m=new n;if(h.isBufferGeometry){var l=h.index,h=h.attributes.position.array;if(null!==l)for(var p=l.array,l=0,r=p.length;l<r;l++){var ca=p[l];m.fromArray(h,3*ca);f(m,ca)}else for(l=0,p=h.length/3;l<p;l++)m.fromArray(h,3*l),f(m,l)}else for(m=h.vertices,l=0,p=m.length;l<p;l++)f(m[l],l)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
-Ac.prototype=Object.assign(Object.create(z.prototype),{constructor:Ac});pd.prototype=Object.create(ba.prototype);pd.prototype.constructor=pd;Lb.prototype=Object.create(ba.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isCompressedTexture=!0;qd.prototype=Object.create(ba.prototype);qd.prototype.constructor=qd;Bc.prototype=Object.create(ba.prototype);Bc.prototype.constructor=Bc;Bc.prototype.isDepthTexture=!0;Mb.prototype=Object.create(E.prototype);Mb.prototype.constructor=Mb;Cc.prototype=Object.create(J.prototype);
-Cc.prototype.constructor=Cc;Nb.prototype=Object.create(E.prototype);Nb.prototype.constructor=Nb;Dc.prototype=Object.create(J.prototype);Dc.prototype.constructor=Dc;za.prototype=Object.create(E.prototype);za.prototype.constructor=za;Ec.prototype=Object.create(J.prototype);Ec.prototype.constructor=Ec;Ob.prototype=Object.create(za.prototype);Ob.prototype.constructor=Ob;Fc.prototype=Object.create(J.prototype);Fc.prototype.constructor=Fc;lb.prototype=Object.create(za.prototype);lb.prototype.constructor=
-lb;Gc.prototype=Object.create(J.prototype);Gc.prototype.constructor=Gc;Pb.prototype=Object.create(za.prototype);Pb.prototype.constructor=Pb;Hc.prototype=Object.create(J.prototype);Hc.prototype.constructor=Hc;Qb.prototype=Object.create(za.prototype);Qb.prototype.constructor=Qb;Ic.prototype=Object.create(J.prototype);Ic.prototype.constructor=Ic;Rb.prototype=Object.create(E.prototype);Rb.prototype.constructor=Rb;Jc.prototype=Object.create(J.prototype);Jc.prototype.constructor=Jc;Sb.prototype=Object.create(E.prototype);
-Sb.prototype.constructor=Sb;Kc.prototype=Object.create(J.prototype);Kc.prototype.constructor=Kc;Tb.prototype=Object.create(E.prototype);Tb.prototype.constructor=Tb;var Ia={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,k;if(0<Ia.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var m=2*c;for(h=c-1;2<c;){if(0>=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");
-break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var q;a:{var l,p,r,n,t,y,x,u;l=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;n=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-l)*(y-p)-(n-p)*(t-l))q=!1;else{var H,w,I,z,D,O,B,C,E,G;H=t-r;w=y-n;I=l-t;z=p-y;D=r-l;O=n-p;for(q=0;q<c;q++)if(x=a[e[q]].x,u=a[e[q]].y,!(x===l&&u===p||x===r&&u===n||x===t&&u===y)&&(B=x-l,C=u-p,E=x-r,G=u-n,x-=t,u-=y,E=H*G-w*E,B=D*C-O*B,C=I*u-z*x,E>=-Number.EPSILON&&C>=-Number.EPSILON&&B>=-Number.EPSILON)){q=!1;break a}q=!0}}if(q){d.push([a[e[g]],
-a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;k<c;g++,k++)e[g]=e[k];c--;m=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,m=e.y-c.y,q=a.x-c.x,l=a.y-c.y,p=h*k-g*m,n=h*q-g*l;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>n||n>p)return[];k=m*q-k*
-l;if(0>k||k>p)return[]}else{if(0<n||n<p)return[];k=m*q-k*l;if(0<k||k<p)return[]}if(0===k)return!f||0!==n&&n!==p?[a]:[];if(k===p)return!f||0!==n&&n!==p?[b]:[];if(0===n)return[c];if(n===p)return[e];f=k/p;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==n||m*q!==k*l)return[];h=0===g&&0===h;k=0===k&&0===m;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,p=c.x,m=e,c=e.x):(b=e,p=e.x,m=c,c=c.x)):
-(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,p=c.y,m=e,c=e.y):(b=e,p=e.y,m=c,c=c.y));return k<=p?a<p?[]:a===p?f?[]:[b]:a<=c?[b,h]:[b,m]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,k,m,q,l={};k=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(k,b[g]);g=0;for(h=
-k.length;g<h;g++)q=k[g].x+":"+k[g].y,void 0!==l[q]&&console.warn("THREE.ShapeUtils: Duplicate point",q,g),l[q]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,k;for(d=0;d<m.length;d++)for(f=
-b[m[d]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=e(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,m=[],q,l,p,n,v,B=[],C,z,E,G=0;for(q=b.length;G<q;G++)m.push(G);C=0;for(var K=2*m.length;0<m.length;){K--;if(0>K){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(l=C;l<h.length;l++){p=h[l];q=-1;for(G=0;G<m.length;G++)if(n=m[G],v=p.x+":"+p.y+":"+n,void 0===B[v]){k=b[n];for(z=0;z<k.length;z++)if(n=k[z],c(l,z)&&!d(p,n)&&!g(p,n)){q=z;m.splice(G,
-1);C=h.slice(0,l+1);n=h.slice(l);z=k.slice(q);E=k.slice(0,q+1);h=C.concat(z).concat(E).concat(n);C=l;break}if(0<=q)break;B[v]=!0}if(0<=q)break}}return h}(a,b);var p=Ia.triangulate(g,!1);g=0;for(h=p.length;g<h;g++)for(m=p[g],k=0;3>k;k++)q=m[k].x+":"+m[k].y,q=l[q],void 0!==q&&(m[k]=q);return p.concat()},isClockWise:function(a){return 0>Ia.area(a)}};cb.prototype=Object.create(J.prototype);cb.prototype.constructor=cb;Ga.prototype=Object.create(E.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=
-function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index);this.addAttribute("position",new B(b.arrays.position,3));this.addAttribute("uv",new B(b.arrays.uv,2))};
-Ga.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new C(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&
-(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new C(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=H+2*y;for(e=0;e<f;e++){var g=ba*e,m=ba*(e+1),l=b+d+g,p=b+d+m,m=b+c+m;h(b+c+g);h(l);h(m);h(l);h(p);h(m);g=q.length/3;g=D.generateSideWallUV(Z,q,g-6,g-3,g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);k(g[2]);k(g[3])}}}function f(a,b,c){r.push(a);r.push(b);r.push(c)}
-function g(a,b,c){h(a);h(b);h(c);a=q.length/3;a=D.generateTopUV(Z,q,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){l.push(q.length/3);q.push(r[3*a+0]);q.push(r[3*a+1]);q.push(r[3*a+2])}function k(a){p.push(a.x);p.push(a.y)}var m=b.arrays?b.arrays:this.getArrays(),q=m.position,l=m.index,p=m.uv,r=[],m=void 0!==b.amount?b.amount:100,z=void 0!==b.bevelThickness?b.bevelThickness:6,t=void 0!==b.bevelSize?b.bevelSize:z-2,y=void 0!==b.bevelSegments?b.bevelSegments:3,x=void 0!==b.bevelEnabled?b.bevelEnabled:
-!0,u=void 0!==b.curveSegments?b.curveSegments:12,H=void 0!==b.steps?b.steps:1,w=b.extrudePath,I,G=!1,D=void 0!==b.UVGenerator?b.UVGenerator:cb.WorldUVGenerator,O,E,F,K;w&&(I=w.getSpacedPoints(H),G=!0,x=!1,O=void 0!==b.frames?b.frames:w.computeFrenetFrames(H,!1),E=new n,F=new n,K=new n);x||(t=z=y=0);var T,J,U,Z=this,w=a.extractPoints(u),u=w.shape,P=w.holes;if(!Ia.isClockWise(u))for(u=u.reverse(),J=0,U=P.length;J<U;J++)T=P[J],Ia.isClockWise(T)&&(P[J]=T.reverse());var M=Ia.triangulateShape(u,P),V=u;
-J=0;for(U=P.length;J<U;J++)T=P[J],u=u.concat(T);var R,S,N,Y,Q,ba=u.length,X,fa=M.length,w=[],L=0;N=V.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),w[L]=d(V[L],V[R],V[S]);var ha=[],ea,ia=w.concat();J=0;for(U=P.length;J<U;J++){T=P[J];ea=[];L=0;N=T.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),ea[L]=d(T[L],T[R],T[S]);ha.push(ea);ia=ia.concat(ea)}for(R=0;R<y;R++){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),
-f(Q.x,Q.y,-Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),f(Q.x,Q.y,-Y)}S=t;for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[0]).multiplyScalar(Q.x),E.copy(O.binormals[0]).multiplyScalar(Q.y),K.copy(I[0]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,0);for(N=1;N<=H;N++)for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[N]).multiplyScalar(Q.x),E.copy(O.binormals[N]).multiplyScalar(Q.y),K.copy(I[N]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,
-m/H*N);for(R=y-1;0<=R;R--){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),f(Q.x,Q.y,m+Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),G?f(Q.x,Q.y+I[H-1].y,I[H-1].x+Y):f(Q.x,Q.y,m+Y)}(function(){var a=q.length/3;if(x){var c=0*ba;for(L=0;L<fa;L++)X=M[L],g(X[2]+c,X[1]+c,X[0]+c);c=ba*(H+2*y);for(L=0;L<fa;L++)X=M[L],g(X[0]+c,X[1]+c,X[2]+c)}else{for(L=0;L<fa;L++)X=M[L],g(X[2],X[1],X[0]);for(L=0;L<fa;L++)X=
-M[L],g(X[0]+ba*H,X[1]+ba*H,X[2]+ba*H)}Z.addGroup(a,q.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=q.length/3,c=0;e(V,c);c+=V.length;J=0;for(U=P.length;J<U;J++)T=P[J],e(T,c),c+=T.length;Z.addGroup(a,q.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(l),this.addAttribute("position",new B(q,3)),this.addAttribute("uv",new B(b.arrays.uv,2)))};cb.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*
-c],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var m=b[3*e],l=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(m,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(l,1-e),new C(p,1-b)]}};Lc.prototype=Object.create(J.prototype);Lc.prototype.constructor=Lc;Ub.prototype=Object.create(Ga.prototype);Ub.prototype.constructor=Ub;Mc.prototype=
-Object.create(J.prototype);Mc.prototype.constructor=Mc;mb.prototype=Object.create(E.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(J.prototype);Nc.prototype.constructor=Nc;Vb.prototype=Object.create(E.prototype);Vb.prototype.constructor=Vb;Oc.prototype=Object.create(J.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(E.prototype);Wb.prototype.constructor=Wb;Xb.prototype=Object.create(J.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(E.prototype);
-Yb.prototype.constructor=Yb;Zb.prototype=Object.create(E.prototype);Zb.prototype.constructor=Zb;nb.prototype=Object.create(J.prototype);nb.prototype.constructor=nb;Ua.prototype=Object.create(E.prototype);Ua.prototype.constructor=Ua;Pc.prototype=Object.create(nb.prototype);Pc.prototype.constructor=Pc;Qc.prototype=Object.create(Ua.prototype);Qc.prototype.constructor=Qc;Rc.prototype=Object.create(J.prototype);Rc.prototype.constructor=Rc;$b.prototype=Object.create(E.prototype);$b.prototype.constructor=
-$b;var Ma=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Cc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Dc,PolyhedronBufferGeometry:za,TubeGeometry:Ic,TubeBufferGeometry:Rb,TorusKnotGeometry:Jc,TorusKnotBufferGeometry:Sb,TorusGeometry:Kc,TorusBufferGeometry:Tb,TextGeometry:Lc,TextBufferGeometry:Ub,
-SphereGeometry:Mc,SphereBufferGeometry:mb,RingGeometry:Nc,RingBufferGeometry:Vb,PlaneGeometry:vc,PlaneBufferGeometry:jb,LatheGeometry:Oc,LatheBufferGeometry:Wb,ShapeGeometry:Xb,ShapeBufferGeometry:Yb,ExtrudeGeometry:cb,ExtrudeBufferGeometry:Ga,EdgesGeometry:Zb,ConeGeometry:Pc,ConeBufferGeometry:Qc,CylinderGeometry:nb,CylinderBufferGeometry:Ua,CircleGeometry:Rc,CircleBufferGeometry:$b,BoxGeometry:Gb,BoxBufferGeometry:ib});ac.prototype=Object.create(ra.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=
-!0;bc.prototype=Object.create(ra.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(U.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=
-a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;
-this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ob.prototype=Object.create(Pa.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshPhysicalMaterial=!0;ob.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=
-a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(U.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);
-this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;
-this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};pb.prototype=Object.create(Ja.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshToonMaterial=!0;pb.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};qb.prototype=Object.create(U.prototype);qb.prototype.constructor=
-qb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};
-rb.prototype=Object.create(U.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=
-a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(U.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=function(a){U.prototype.copy.call(this,
-a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var mg=Object.freeze({ShadowMaterial:ac,SpriteMaterial:bb,RawShaderMaterial:bc,ShaderMaterial:ra,PointsMaterial:Fa,MeshPhysicalMaterial:ob,MeshStandardMaterial:Pa,MeshPhongMaterial:Ja,MeshToonMaterial:pb,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:Za,MeshBasicMaterial:ya,LineDashedMaterial:sb,LineBasicMaterial:ea,Material:U}),ed={enabled:!1,files:{},
-add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},va=new Zd;Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=
-g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var n=new Uint8Array(m),k=0;k<g.length;k++)n[k]=g.charCodeAt(k);"blob"===l&&(m=new Blob([m],{type:h}));break;case "document":m=(new DOMParser).parseFromString(g,h);break;case "json":m=JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(r){window.setTimeout(function(){d&&d(r);
-e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{var p=new XMLHttpRequest;p.open("GET",a,!0);p.addEventListener("load",function(c){var f=c.target.response;ed.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn("THREE.FileLoader: HTTP Status 0 received."),b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemEnd(a),e.manager.itemError(a))},!1);void 0!==c&&p.addEventListener("progress",function(a){c(a)},!1);p.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);
-e.manager.itemError(a)},!1);void 0!==this.responseType&&(p.responseType=this.responseType);void 0!==this.withCredentials&&(p.withCredentials=this.withCredentials);p.overrideMimeType&&p.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)p.setRequestHeader(h,this.requestHeader[h]);p.send(null)}e.manager.itemStart(a);return p},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=
-a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(Oe.prototype,{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Lb;h.image=g;var k=new Ka(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");
-if(Array.isArray(a))for(var m=0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=
-a;return this}});Object.assign($d.prototype,{load:function(a,b,c,d){var e=this,f=new db,g=new Ka(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?
-a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Sc.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS("http://www.w3.org/1999/xhtml","img");
-c.addEventListener("load",function(){ed.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);c.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ae.prototype,{load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=
-a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Xa,g=new Sc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(rd.prototype,{load:function(a,b,c,d){var e=new Sc(this.manager);e.setCrossOrigin(this.crossOrigin);e.setPath(this.path);var f=new ba;f.image=e.load(a,function(){var c=0<a.search(/\.(jpg|jpeg)$/)||
-0===a.search(/^data\:image\/jpeg/);f.format=c?1022:1023;f.needsUpdate=!0;void 0!==b&&b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});na.prototype=Object.assign(Object.create(z.prototype),{constructor:na,isLight:!0,copy:function(a){z.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=
-this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});sd.prototype=Object.assign(Object.create(na.prototype),{constructor:sd,isHemisphereLight:!0,copy:function(a){na.prototype.copy.call(this,
-a);this.groundColor.copy(a.groundColor);return this}});Object.assign(tb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;
-return a}});td.prototype=Object.assign(Object.create(tb.prototype),{constructor:td,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*Y.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});ud.prototype=Object.assign(Object.create(na.prototype),{constructor:ud,isSpotLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=
-a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});vd.prototype=Object.assign(Object.create(na.prototype),{constructor:vd,isPointLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});wd.prototype=Object.assign(Object.create(tb.prototype),{constructor:wd});xd.prototype=Object.assign(Object.create(na.prototype),{constructor:xd,isDirectionalLight:!0,copy:function(a){na.prototype.copy.call(this,
-a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});yd.prototype=Object.assign(Object.create(na.prototype),{constructor:yd,isAmbientLight:!0});zd.prototype=Object.assign(Object.create(na.prototype),{constructor:zd,isRectAreaLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=na.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var ia={arraySlice:function(a,
-b,c){return ia.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
-new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
-while(void 0!==f)}}}};Object.assign(wa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=
-0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=
-c[a+e];return b},interpolate_:function(a,b,c,d){throw Error("call to abstract method");},intervalChanged_:function(a,b,c){}});Object.assign(wa.prototype,{beforeStart_:wa.prototype.copySampleValue_,afterEnd_:wa.prototype.copySampleValue_});Ad.prototype=Object.assign(Object.create(wa.prototype),{constructor:Ad,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=
-a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,
-p=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c];return e}});Tc.prototype=Object.assign(Object.create(wa.prototype),{constructor:Tc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Bd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Bd,
-interpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Wa;Wa={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Bd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Tc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Ad(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;
-switch(a){case 2300:b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn("THREE.KeyframeTrackPrototype:",b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;
-case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,
-1),e=f-1),d=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",
-this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ia.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==
-k[0]))if(d)h=!0;else for(var m=g*c,l=m-c,n=m+c,k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ia.arraySlice(a,0,e),this.values=ia.arraySlice(b,0,e*c));return this}};cc.prototype=Object.assign(Object.create(Wa),{constructor:cc,ValueTypeName:"vector"});Cd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Cd,
-interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)oa.slerpFlat(e,0,f,a-g,f,a,b);return e}});Uc.prototype=Object.assign(Object.create(Wa),{constructor:Uc,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Cd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});dc.prototype=Object.assign(Object.create(Wa),{constructor:dc,ValueTypeName:"number"});
-Dd.prototype=Object.assign(Object.create(Wa),{constructor:Dd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Ed.prototype=Object.assign(Object.create(Wa),{constructor:Ed,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Fd.prototype=Object.assign(Object.create(Wa),{constructor:Fd,ValueTypeName:"color"});
-vb.prototype=Wa;Wa.constructor=vb;Object.assign(vb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=vb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];ia.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:ia.convertArray(a.times,Array),values:ia.convertArray(a.values,
-Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return dc;case "vector":case "vector2":case "vector3":case "vector4":return cc;case "color":return Fd;case "quaternion":return Uc;case "bool":case "boolean":return Ed;case "string":return Dd}throw Error("Unsupported typeName: "+a);}});Object.assign(Da,{parse:function(a){for(var b=
-[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(vb.parse(c[e]).scale(d));return new Da(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(vb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ia.getKeyframeOrder(h),h=ia.sortedArray(h,1,m),k=ia.sortedArray(k,1,m);d||0!==h[0]||
-(h.push(e),k.push(k[0]));f.push((new dc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new Da(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];
-for(m in d)a.push(Da.CreateFromMorphTargetSequence(m,d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ia.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.hierarchy||[],k=0;k<h.length;k++){var m=h[k].keys;if(m&&0!==m.length)if(m[0].morphTargets){for(var f={},l=0;l<m.length;l++)if(m[l].morphTargets)for(var n=
-0;n<m[l].morphTargets.length;n++)f[m[l].morphTargets[n]]=-1;for(var p in f){for(var r=[],z=[],n=0;n!==m[l].morphTargets.length;++n){var t=m[l];r.push(t.time);z.push(t.morphTarget===p?1:0)}d.push(new dc(".morphTargetInfluence["+p+"]",r,z))}f=f.length*(g||1)}else l=".bones["+b[k].name+"]",c(cc,l+".position",m,"pos",d),c(Uc,l+".quaternion",m,"rot",d),c(cc,l+".scale",m,"scl",d)}return 0===d.length?null:new Da(e,f,d)}});Object.assign(Da.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==
-c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Gd.prototype,{load:function(a,b,c,d){var e=this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===
-c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new mg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=
-a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);
-void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);
-void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&
-(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);
-void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));return d}});Object.assign(be.prototype,{load:function(a,b,c,d){var e=
-this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new E,c=a.data.index;void 0!==c&&(c=new ef[c.type](c.array),b.setIndex(new Z(c,1)));var d=a.data.attributes,e;for(e in d){var f=d[e],c=new ef[f.type](f.array);b.addAttribute(e,new Z(c,f.itemSize,f.normalized))}e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,d=e.length;c!==d;++c)f=e[c],b.addGroup(f.start,f.count,f.materialIndex);a=a.data.boundingSphere;void 0!==a&&(e=new n,void 0!==
-a.center&&e.fromArray(a.center),b.boundingSphere=new Ea(e,a.radius));return b}});var ef={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};ec.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=
-b[c+1];if(b[c].test(a))return e}return null}};Object.assign(ec.prototype,{crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},b=new G,c=new rd,d=new Gd;return function(e,f,g){function h(a,
-b,d,e,h){a=f+a;var m=ec.Handlers.get(a);null!==m?a=m.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&("repeat"===e[0]&&(a.wrapS=1E3),"mirror"===e[0]&&(a.wrapS=1002),"repeat"===e[1]&&(a.wrapT=1E3),"mirror"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=Y.generateUUID();k[b]=a;return b}var k={},m={uuid:Y.generateUUID(),type:"MeshLambertMaterial"},l;for(l in e){var n=e[l];
-switch(l){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":m.name=n;break;case "blending":m.blending=a[n];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",l,"is no longer supported.");break;case "colorDiffuse":m.color=b.fromArray(n).getHex();break;case "colorSpecular":m.specular=b.fromArray(n).getHex();break;case "colorEmissive":m.emissive=b.fromArray(n).getHex();break;case "specularCoef":m.shininess=n;break;case "shading":"basic"===
-n.toLowerCase()&&(m.type="MeshBasicMaterial");"phong"===n.toLowerCase()&&(m.type="MeshPhongMaterial");"standard"===n.toLowerCase()&&(m.type="MeshStandardMaterial");break;case "mapDiffuse":m.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":m.emissiveMap=h(n,e.mapEmissiveRepeat,e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);
-break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":m.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":m.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":m.bumpMap=
-h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case "mapBumpScale":m.bumpScale=n;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":m.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case "mapNormalFactor":m.normalScale=[n,n];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":m.specularMap=
-h(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":m.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":m.roughnessMap=h(n,e.mapRoughnessRepeat,
-e.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":m.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":m.side=1;break;case "doubleSided":m.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");
-m.opacity=n;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":m[l]=n;break;case "vertexColors":!0===n&&(m.vertexColors=2);"face"===n&&(m.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",l,n)}}"MeshBasicMaterial"===m.type&&delete m.emissive;"MeshPhongMaterial"!==m.type&&delete m.specular;1>m.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ce.prototype,
-{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:ec.prototype.extractUrlBase(a),g=new Ka(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");
-return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new J,d=a,e,f,g,h,k,m,l,v,p,r,z,t,y,x,u=d.faces;p=d.vertices;var B=d.normals,w=d.colors;m=d.scale;var I=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&I++;for(e=0;e<I;e++)c.faceVertexUvs[e]=[]}h=0;for(k=p.length;h<k;)e=new n,e.x=p[h++]*m,e.y=p[h++]*m,e.z=p[h++]*m,c.vertices.push(e);
-h=0;for(k=u.length;h<k;)if(p=u[h++],r=p&1,g=p&2,e=p&8,l=p&16,z=p&32,m=p&64,p&=128,r){r=new Sa;r.a=u[h];r.b=u[h+1];r.c=u[h+3];t=new Sa;t.a=u[h+1];t.b=u[h+2];t.c=u[h+3];h+=4;g&&(g=u[h++],r.materialIndex=g,t.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=[],c.faceVertexUvs[e][g+1]=[],f=0;4>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+1].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]),
-t.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=u[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(p)for(e=0;4>e;e++)m=u[h++],m=w[m],2!==e&&r.vertexColors.push(new G(m)),0!==e&&t.vertexColors.push(new G(m));c.faces.push(r);c.faces.push(t)}else{r=new Sa;r.a=u[h++];r.b=u[h++];r.c=u[h++];g&&(g=u[h++],r.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=
-[],f=0;3>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),c.faceVertexUvs[e][g].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]));if(z)for(e=0;3>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),r.vertexNormals.push(z);m&&(m=u[h++],r.color.setHex(w[m]));if(p)for(e=0;3>e;e++)m=u[h++],r.vertexColors.push(new G(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,u=d.skinWeights.length;k<u;k+=h)c.skinWeights.push(new fa(d.skinWeights[k],1<h?d.skinWeights[k+
-1]:0,2<h?d.skinWeights[k+2]:0,3<h?d.skinWeights[k+3]:0));if(d.skinIndices)for(k=0,u=d.skinIndices.length;k<u;k+=h)c.skinIndices.push(new fa(d.skinIndices[k],1<h?d.skinIndices[k+1]:0,2<h?d.skinIndices[k+2]:0,3<h?d.skinIndices[k+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+
-") should match.");k=a;u=k.scale;if(void 0!==k.morphTargets)for(d=0,h=k.morphTargets.length;d<h;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=k.morphTargets[d].name,c.morphTargets[d].vertices=[],B=c.morphTargets[d].vertices,w=k.morphTargets[d].vertices,I=0,p=w.length;I<p;I+=3)m=new n,m.x=w[I]*u,m.y=w[I+1]*u,m.z=w[I+2]*u,B.push(m);if(void 0!==k.morphColors&&0<k.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),u=c.faces,k=k.morphColors[0].colors,
-d=0,h=u.length;d<h;d++)u[d].color.fromArray(k,3*d);k=a;d=[];h=[];void 0!==k.animation&&h.push(k.animation);void 0!==k.animations&&(k.animations.length?h=h.concat(k.animations):h.push(k.animations));for(k=0;k<h.length;k++)(u=Da.parseAnimation(h[k],c.bones))&&d.push(u);c.morphTargets&&(h=Da.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(h));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};
-d=ec.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}}()});Object.assign(Pe.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ka(e.manager)).load(a,function(c){var g=null;try{g=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error("THREE:ObjectLoader: Can't parse "+a+".",h.message);return}c=g.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+
-a+". Use THREE.JSONLoader instead."):e.parse(g,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},
-parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new ce,d=new be,e=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":g=new Ma[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":g=new Ma[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":g=new Ma[h.type](h.radius,h.segments,h.thetaStart,
-h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":g=new Ma[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":g=new Ma[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":g=new Ma[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,
-h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "IcosahedronGeometry":case "OctahedronGeometry":case "TetrahedronGeometry":g=new Ma[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":g=new Ma[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":g=new Ma[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":g=
-new Ma[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":g=new Ma[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "BufferGeometry":g=d.parse(h);break;case "Geometry":g=c.parse(h,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==
-a){var d=new Gd;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=a[e];if("MultiMaterial"===g.type){for(var h=[],k=0;k<g.materials.length;k++)h.push(d.parse(g.materials[k]));c[g.uuid]=h}else c[g.uuid]=d.parse(g)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=Da.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}
-var d=this,e={};if(void 0!==a&&0<a.length){var f=new Zd(b),g=new Sc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var k=a[f],m=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(k.url)?k.url:d.texturePath+k.url;e[k.uuid]=c(m)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&
-console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new ba(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ng));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],ff),h.wrapT=c(g.wrap[1],ff));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,gf));
-void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,gf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new K;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function f(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],c=0,e=a.length;c<e;c++){var f=a[c];void 0===d[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(d[f])}return b}void 0===
-d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return d[a]}}var g;switch(b.type){case "Scene":g=new ld;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new G(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Jb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Ib(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new qa(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==
-b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case "OrthographicCamera":g=new Fb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new yd(b.color,b.intensity);break;case "DirectionalLight":g=new xd(b.color,b.intensity);break;case "PointLight":g=new vd(b.color,b.intensity,b.distance,b.decay);break;case "RectAreaLight":g=new zd(b.color,b.intensity,b.width,b.height);break;case "SpotLight":g=
-new ud(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new sd(b.color,b.groundColor,b.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new nd(g,h):new la(g,h);break;case "LOD":g=new yc;break;case "Line":g=new sa(e(b.geometry),f(b.material),b.mode);break;case "LineLoop":g=new od(e(b.geometry),f(b.material));break;
-case "LineSegments":g=new Q(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Kb(e(b.geometry),f(b.material));break;case "Sprite":g=new xc(f(b.material));break;case "Group":g=new Ac;break;default:g=new z}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),
-void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=
-b.userData);if(void 0!==b.children)for(var k in b.children)g.add(this.parseObject(b.children[k],c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var m=b[h];k=g.getObjectByProperty("uuid",m.object);void 0!==k&&g.addLevel(k,m.distance)}return g}}()});var ng={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},ff={RepeatWrapping:1E3,
-ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},gf={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(ua.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/
-a));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),f+=c.distanceTo(d),b.push(f),d=c;return this.cacheArcLengths=
-b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);
-return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new n,d=[],e=[],f=[],g=new n,h=new K,k,m;for(k=0;k<=a;k++)m=k/a,d[k]=this.getTangentAt(m),d[k].normalize();e[0]=new n;f[0]=new n;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),v=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));v<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-
-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(Y.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Y.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}}});Qa.prototype=Object.create(ua.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isLineCurve=
-!0;Qa.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};Qa.prototype.getPointAt=function(a){return this.getPoint(a)};Qa.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};Vc.prototype=Object.assign(Object.create(ua.prototype),{constructor:Vc,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);
-a.equals(b)||this.curves.push(new Qa(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;
-for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),
-c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},createPointsGeometry:function(a){a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){for(var b=new J,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new n(e.x,e.y,e.z||0))}return b}});Va.prototype=Object.create(ua.prototype);Va.prototype.constructor=Va;Va.prototype.isEllipseCurve=!0;Va.prototype.getPoint=
-function(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b;for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new C(a,e)};yb.prototype=Object.create(ua.prototype);yb.prototype.constructor=
-yb;yb.prototype.isSplineCurve=!0;yb.prototype.getPoint=function(a){var b=this.points,c=(b.length-1)*a;a=Math.floor(c);var c=c-a,d=b[0===a?a:a-1],e=b[a],f=b[a>b.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new C(Qe(c,d.x,e.x,f.x,b.x),Qe(c,d.y,e.y,f.y,b.y))};fc.prototype=Object.create(ua.prototype);fc.prototype.constructor=fc;fc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new C(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y))};gc.prototype=Object.create(ua.prototype);
-gc.prototype.constructor=gc;gc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new C(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y))};var te=Object.assign(Object.create(Vc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Qa(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,
-b,c,d){a=new gc(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new fc(this.currentPoint.clone(),new C(a,b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new yb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,
-b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Va(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)}});Wc.prototype=te;te.constructor=Wc;zb.prototype=Object.assign(Object.create(te),{constructor:zb,getPointsHoles:function(a){for(var b=
-[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Object.assign(de.prototype,{moveTo:function(a,b){this.currentPath=new Wc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,
-b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new zb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,m=h.y-g.y;if(Math.abs(m)>Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;
-0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ia.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new zb,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var n=[],p=[],r=0,z;n[r]=void 0;p[r]=[];for(var t=0,y=f.length;t<y;t++)h=f[t],z=h.getPoints(),g=e(z),(g=a?!g:g)?(!l&&n[r]&&r++,n[r]={s:new zb,p:z},n[r].s.curves=h.curves,l&&r++,p[r]=[]):p[r].push({h:h,
-p:z[0]});if(!n[0])return c(f);if(1<n.length){t=!1;h=[];e=0;for(f=n.length;e<f;e++)k[e]=[];e=0;for(f=n.length;e<f;e++)for(g=p[e],l=0;l<g.length;l++){r=g[l];z=!0;for(y=0;y<n.length;y++)d(r.p,n[y].p)&&(e!==y&&h.push({froms:e,tos:y,hole:l}),z?(z=!1,k[y].push(r)):t=!0);z&&k[e].push(r)}0<h.length&&(t||(p=k))}t=0;for(e=n.length;t<e;t++)for(k=n[t].s,m.push(k),h=p[t],f=0,g=h.length;f<g;f++)k.holes.push(h[f].h);return m}});Object.assign(ee.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=
-100);void 0===c&&(c=4);var d=this.data;a=String(a).split("");var e=b/d.resolution,f=(d.boundingBox.yMax-d.boundingBox.yMin+d.underlineThickness)*e,g=0,h=0;b=[];for(var k=0;k<a.length;k++){var m=a[k];if("\n"===m)g=0,h-=f;else{var l;l=e;var n=g,p=h;if(m=d.glyphs[m]||d.glyphs["?"]){var r=new de,z=[],t,y,x,u,B,w,C,G;if(m.o)for(var D=m._cachedOutline||(m._cachedOutline=m.o.split(" ")),E=0,J=D.length;E<J;)switch(D[E++]){case "m":t=D[E++]*l+n;y=D[E++]*l+p;r.moveTo(t,y);break;case "l":t=D[E++]*l+n;y=D[E++]*
-l+p;r.lineTo(t,y);break;case "q":t=D[E++]*l+n;y=D[E++]*l+p;B=D[E++]*l+n;w=D[E++]*l+p;r.quadraticCurveTo(B,w,t,y);if(u=z[z.length-1]){x=u.x;u=u.y;for(var F=1;F<=c;F++){var K=F/c;wb(K,x,B,t);wb(K,u,w,y)}}break;case "b":if(t=D[E++]*l+n,y=D[E++]*l+p,B=D[E++]*l+n,w=D[E++]*l+p,C=D[E++]*l+n,G=D[E++]*l+p,r.bezierCurveTo(B,w,C,G,t,y),u=z[z.length-1])for(x=u.x,u=u.y,F=1;F<=c;F++)K=F/c,xb(K,x,B,C,t),xb(K,u,w,G,y)}l={offsetX:m.ha*l,path:r}}else l=void 0;g+=l.offsetX;b.push(l.path)}}c=[];d=0;for(a=b.length;d<
-a;d++)Array.prototype.push.apply(c,b[d].toShapes());return c}});Object.assign(Re.prototype,{load:function(a,b,c,d){var e=this;(new Ka(this.manager)).load(a,function(a){var c;try{c=JSON.parse(a)}catch(d){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ee(a)}});var Nd,he={getContext:function(){void 0===Nd&&(Nd=new (window.AudioContext||window.webkitAudioContext));
-return Nd},setContext:function(a){Nd=a}};Object.assign(fe.prototype,{load:function(a,b,c,d){var e=new Ka(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){he.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(Se.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new K,m=new K;return function(l){if(a!==this||b!==l.focus||c!==l.fov||d!==l.aspect*this.aspect||e!==l.near||f!==l.far||g!==l.zoom||h!==this.eyeSep){a=this;b=l.focus;c=l.fov;d=l.aspect*this.aspect;e=
-l.near;f=l.far;g=l.zoom;var n=l.projectionMatrix.clone();h=this.eyeSep/2;var p=h*e/b,r=e*Math.tan(Y.DEG2RAD*c*.5)/g,z,t;m.elements[12]=-h;k.elements[12]=h;z=-r*d+p;t=r*d+p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraL.projectionMatrix.copy(n);z=-r*d-p;t=r*d-p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(l.matrixWorld).multiply(m);this.cameraR.matrixWorld.copy(l.matrixWorld).multiply(k)}}()});Hd.prototype=Object.create(z.prototype);
-Hd.prototype.constructor=Hd;ge.prototype=Object.assign(Object.create(z.prototype),{constructor:ge,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);
-this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new n,b=new oa,c=new n,d=new n;return function(e){z.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),
-e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,
-f.z))}}()});hc.prototype=Object.assign(Object.create(z.prototype),{constructor:hc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);a.start(0,this.startTime);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.source.stop(),this.startTime=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-
-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=
-a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});ie.prototype=Object.assign(Object.create(hc.prototype),{constructor:ie,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=
-a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new n;return function(b){z.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(je.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);
-return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(ke.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&
-this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){oa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=
-1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Te.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
-c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(ha,{Composite:Te,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ha.Composite(a,b,c):new ha(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),b=["material","materials","bones"];return function(c){var d=a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+
-c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+c);return d}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;
-if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};if(c=d(a.children))return c}return null}});Object.assign(ha.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,
-NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[this.propertyName]=
-a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=
-a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=
-this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=ha.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",
-this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",
-this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
-this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",
-this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+
-this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(ha.prototype,{_getValue_unbound:ha.prototype.getValue,_setValue_unbound:ha.prototype.setValue});Object.assign(Ue.prototype,{isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,k=h.length,m=0,l=arguments.length;m!==l;++m){var n=
-arguments[m],p=n.uuid,r=e[p];if(void 0===r){r=c++;e[p]=r;b.push(n);for(var p=0,z=k;p!==z;++p)h[p].push(new ha(n,f[p],g[p]))}else if(r<d){var t=--d,z=b[t];e[z.uuid]=r;b[r]=z;e[p]=t;b[t]=n;p=0;for(z=k;p!==z;++p){var y=h[p],x=y[r];y[r]=y[t];void 0===x&&(x=new ha(n,f[p],g[p]));y[t]=x}}else void 0!==b[r]&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=d},remove:function(a){for(var b=
-this._objects,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g],m=k.uuid,l=d[m];if(void 0!==l&&l>=c){var n=c++,p=b[n];d[p.uuid]=l;b[l]=p;d[m]=n;b[n]=k;k=0;for(m=f;k!==m;++k){var p=e[k],r=p[l];p[l]=p[n];p[n]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,n=e[l];
-if(void 0!==n)if(delete e[l],n<d){var l=--d,v=b[l],p=--c,r=b[p];e[v.uuid]=n;b[n]=v;e[r.uuid]=l;b[l]=r;b.pop();v=0;for(r=g;v!==r;++v){var z=f[v],t=z[p];z[n]=z[l];z[l]=t;z.pop()}}else for(p=--c,r=b[p],e[r.uuid]=n,b[n]=r,b.pop(),v=0,r=g;v!==r;++v)z=f[v],z[n]=z[p],z.pop()}this.nCachedObjects_=d},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;
-c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new ha(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(Ve.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=
-!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?
-a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=
-null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,
-b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||
-this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],
-b=b*d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===
-d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?
-c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,
-b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(We.prototype,xa.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var n=d[k],v=n.name,p=l[v];if(void 0===
-p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,v));continue}p=new ke(ha.create(c,v,b&&b._propertyBindings[k].binding.parsedPath),n.ValueTypeName,n.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,v)}f[k]=p;g[k].resultBuffer=p.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,
-c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=
-0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},
-_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var b=a._clip.uuid,c=this._actionsByClip,d=c[b],e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;
-f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=
-this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;
-delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Tc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),
-c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid,e="string"===typeof a?Da.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===
-e&&(e=g._clip)}if(null===e)return null;e=new Ve(this,e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?Da.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=
-0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=
-g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,
-b);null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Id.prototype.clone=function(){return new Id(void 0===this.value.clone?this.value:this.value.clone())};le.prototype=Object.assign(Object.create(E.prototype),{constructor:le,isInstancedBufferGeometry:!0,addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=
-a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this}});Object.defineProperties(me.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(me.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+
-this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+
-1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(ic.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ic.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
-this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=
-a;return this}});ne.prototype=Object.assign(Object.create(ic.prototype),{constructor:ne,isInstancedInterleavedBuffer:!0,copy:function(a){ic.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});oe.prototype=Object.assign(Object.create(Z.prototype),{constructor:oe,isInstancedBufferAttribute:!0,copy:function(a){Z.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(Xe.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,
-b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];pe(a,this,c,b);c.sort(Ye);return c},intersectObjects:function(a,
-b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)pe(a[d],this,c,b);c.sort(Ye);return c}});Object.assign(Ze.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=
-0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign($e.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-
-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(Y.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(af.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*
-a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});ta.prototype=Object.create(la.prototype);ta.prototype.constructor=ta;ta.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};ta.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/i,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<
-g;f++){var h=e.morphTargets[f].name.match(b);if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};ta.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ta.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ta.prototype.setAnimationFPS=
-function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ta.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ta.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ta.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ta.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ta.prototype.getAnimationDuration=
-function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ta.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};ta.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ta.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>
-d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+Y.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!==
-d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};Xc.prototype=Object.create(z.prototype);Xc.prototype.constructor=Xc;Xc.prototype.isImmediateRenderObject=!0;Yc.prototype=Object.create(Q.prototype);Yc.prototype.constructor=Yc;Yc.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);
-var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,n=k.length;l<n;l++)for(var v=k[l],p=0,r=v.vertexNormals.length;p<r;p++){var z=v.vertexNormals[p];a.copy(h[v[d[p]]]).applyMatrix4(e);b.copy(z).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,p=g=0,r=d.count;p<
-r;p++)a.set(d.getX(p),d.getY(p),d.getZ(p)).applyMatrix4(e),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0}}();jc.prototype=Object.create(z.prototype);jc.prototype.constructor=jc;jc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};jc.prototype.update=function(){var a=new n,b=new n;return function(){this.light.updateMatrixWorld();var c=
-this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color)}}();kc.prototype=Object.create(Q.prototype);kc.prototype.constructor=kc;kc.prototype.onBeforeRender=function(){var a=new n,b=new K,c=new K;return function(){var d=this.bones,e=this.geometry,f=e.getAttribute("position");c.getInverse(this.root.matrixWorld);
-for(var g=0,h=0;g<d.length;g++){var k=d[g];k.parent&&k.parent.isBone&&(b.multiplyMatrices(c,k.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h,a.x,a.y,a.z),b.multiplyMatrices(c,k.parent.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h+1,a.x,a.y,a.z),h+=2)}e.getAttribute("position").needsUpdate=!0}}();lc.prototype=Object.create(la.prototype);lc.prototype.constructor=lc;lc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};lc.prototype.update=function(){this.material.color.copy(this.light.color)};
-mc.prototype=Object.create(z.prototype);mc.prototype.constructor=mc;mc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};mc.prototype.update=function(){var a=this.children[0];a.material.color.copy(this.light.color);var b=.5*this.light.width,c=.5*this.light.height,a=a.geometry.attributes.position,d=a.array;d[0]=b;d[1]=-c;d[2]=0;d[3]=b;d[4]=c;d[5]=0;d[6]=-b;d[7]=c;d[8]=0;d[9]=-b;d[10]=-c;d[11]=0;d[12]=b;d[13]=-c;d[14]=0;a.needsUpdate=!0};nc.prototype=
-Object.create(z.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};nc.prototype.update=function(){var a=new n,b=new G,c=new G;return function(){var d=this.children[0],e=d.geometry.getAttribute("color");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());e.needsUpdate=
-!0}}();Zc.prototype=Object.create(Q.prototype);Zc.prototype.constructor=Zc;Jd.prototype=Object.create(Q.prototype);Jd.prototype.constructor=Jd;$c.prototype=Object.create(Q.prototype);$c.prototype.constructor=$c;$c.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<
-l;k++){var n=f[k],v=n.normal;a.copy(g[n.a]).add(g[n.b]).add(g[n.c]).divideScalar(3).applyMatrix4(d);b.copy(v).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();oc.prototype=Object.create(z.prototype);oc.prototype.constructor=oc;oc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose();b.geometry.dispose();b.material.dispose()};oc.prototype.update=function(){var a=
-new n,b=new n,c=new n;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color);e.lookAt(c);e.scale.z=c.length()}}();ad.prototype=Object.create(Q.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),h=0,k=a.length;h<
-k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new n,e=new Na;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.getAttribute("position").needsUpdate=
-!0}}();Ab.prototype=Object.create(Q.prototype);Ab.prototype.constructor=Ab;Ab.prototype.update=function(){var a=new Ra;return function(b){void 0!==b&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;
-e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Ab.prototype.setFromObject=function(a){this.object=a;this.update();return this};var Kd,qe;Bb.prototype=Object.create(z.prototype);Bb.prototype.constructor=Bb;Bb.prototype.setDirection=function(){var a=new n,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,
-b))}}();Bb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Bb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Ld.prototype=Object.create(Q.prototype);Ld.prototype.constructor=Ld;var Od=new n,ue=new re,ve=new re,we=new re;La.prototype=Object.create(ua.prototype);La.prototype.constructor=
-La;La.prototype.getPoint=function(a){var b=this.points,c=b.length;a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0<d?0:(Math.floor(Math.abs(d)/b.length)+1)*b.length:0===a&&d===c-1&&(d=c-2,a=1);var e,f,g;this.closed||0<d?e=b[(d-1)%c]:(Od.subVectors(b[0],b[1]).add(b[0]),e=Od);f=b[d%c];g=b[(d+1)%c];this.closed||d+2<c?b=b[(d+2)%c]:(Od.subVectors(b[c-1],b[c-2]).add(b[c-1]),b=Od);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var h="chordal"===this.type?.5:.25,
-c=Math.pow(e.distanceToSquared(f),h),d=Math.pow(f.distanceToSquared(g),h),h=Math.pow(g.distanceToSquared(b),h);1E-4>d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);ue.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);ve.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);we.initNonuniformCatmullRom(e.z,f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,ue.initCatmullRom(e.x,f.x,g.x,b.x,c),ve.initCatmullRom(e.y,f.y,g.y,b.y,c),we.initCatmullRom(e.z,f.z,g.z,b.z,c));return new n(ue.calc(a),
-ve.calc(a),we.calc(a))};bd.prototype=Object.create(ua.prototype);bd.prototype.constructor=bd;bd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new n(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y),xb(a,b.z,c.z,d.z,e.z))};cd.prototype=Object.create(ua.prototype);cd.prototype.constructor=cd;cd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new n(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y),wb(a,b.z,c.z,d.z))};dd.prototype=Object.create(ua.prototype);dd.prototype.constructor=
-dd;dd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new n;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Md.prototype=Object.create(Va.prototype);Md.prototype.constructor=Md;ua.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(ua.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};cf.prototype=Object.create(La.prototype);df.prototype=Object.create(La.prototype);se.prototype=Object.create(La.prototype);
-Object.assign(se.prototype,{initFromArray:function(a){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(a){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(a){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});Zc.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};kc.prototype.update=
-function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(fd.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");
-return this.getSize(a)}});Object.assign(Ra.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Hb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Y.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()};Object.assign(Ba.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
-return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,
-b,c){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(K.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new n);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
-return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
-return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
-rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},
-applyToVector3Array:function(a,b,c){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Aa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};oa.prototype.multiplyVector3=
-function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(kb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)}});Object.assign(zb.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new cb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,
-b,c)}});Object.assign(n.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},
+shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"},
+mb={basic:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.fog]),vertexShader:W.meshbasic_vert,fragmentShader:W.meshbasic_frag},lambert:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.fog,E.lights,{emissive:{value:new H(0)}}]),vertexShader:W.meshlambert_vert,fragmentShader:W.meshlambert_frag},phong:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.gradientmap,
+E.fog,E.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:W.meshphong_vert,fragmentShader:W.meshphong_frag},standard:{uniforms:Ea.merge([E.common,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.roughnessmap,E.metalnessmap,E.fog,E.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag},points:{uniforms:Ea.merge([E.points,
+E.fog]),vertexShader:W.points_vert,fragmentShader:W.points_frag},dashed:{uniforms:Ea.merge([E.common,E.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:W.linedashed_vert,fragmentShader:W.linedashed_frag},depth:{uniforms:Ea.merge([E.common,E.displacementmap]),vertexShader:W.depth_vert,fragmentShader:W.depth_frag},normal:{uniforms:Ea.merge([E.common,E.bumpmap,E.normalmap,E.displacementmap,{opacity:{value:1}}]),vertexShader:W.normal_vert,fragmentShader:W.normal_frag},cube:{uniforms:{tCube:{value:null},
+tFlip:{value:-1},opacity:{value:1}},vertexShader:W.cube_vert,fragmentShader:W.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:W.equirect_vert,fragmentShader:W.equirect_frag},distanceRGBA:{uniforms:Ea.merge([E.common,E.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:W.distanceRGBA_vert,fragmentShader:W.distanceRGBA_frag},shadow:{uniforms:Ea.merge([E.lights,E.fog,{color:{value:new H(0)},opacity:{value:1}}]),vertexShader:W.shadow_vert,
+fragmentShader:W.shadow_frag}};mb.physical={uniforms:Ea.merge([mb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag};Object.assign(kd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){c=a.copy(c).multiplyScalar(.5);
+this.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=
+a||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=
+this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);
+this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});tc.prototype=Object.create(ea.prototype);tc.prototype.constructor=tc;var Lf=0;Object.assign(Q.prototype,ja.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+
+b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=
+void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);
+this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&
+this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);
+this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&
+(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation);
+1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&
+(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;
+this.lights=a.lights;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=
+a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.userData=JSON.parse(JSON.stringify(a.userData));this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=
+a[d].clone();this.clippingPlanes=b;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Wa.prototype=Object.create(Q.prototype);Wa.prototype.constructor=Wa;Wa.prototype.isMeshDepthMaterial=!0;Wa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=
+a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Xa.prototype=Object.create(Q.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isMeshDistanceMaterial=!0;Xa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=
+a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Object.assign(Oa.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var l=a[h],q=a[h+1],n=a[h+2];l<b&&(b=l);q<c&&(c=q);n<d&&(d=n);l>e&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=
+Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var l=a.getX(h),q=a.getY(h),n=a.getZ(h);l<b&&(b=l);q<c&&(c=q);n<d&&(d=n);l>e&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new p;return function(b,c){c=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(c);this.max.copy(b).add(c);
+return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new p;return this.isEmpty()?a.set(0,0,0):
+a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new p;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){function a(a){var f=a.geometry;if(void 0!==f)if(f.isGeometry)for(f=f.vertices,c=0,d=f.length;c<d;c++)e.copy(f[c]),
+e.applyMatrix4(a.matrixWorld),b.expandByPoint(e);else if(f.isBufferGeometry&&(f=f.attributes.position,void 0!==f))for(c=0,d=f.count;c<d;c++)e.fromBufferAttribute(f,c).applyMatrix4(a.matrixWorld),b.expandByPoint(e)}var b,c,d,e=new p;return function(c){b=this;c.updateMatrixWorld(!0);c.traverse(a);return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=
+this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center,
+a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,
+b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Da;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=
+[new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);
+a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Oa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e<f;e++)c=Math.max(c,
+d.distanceToSquared(b[e]));this.radius=Math.sqrt(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=
+b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);b=b||new p;b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){a=a||new Oa;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);
+this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=
+new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+
+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return(b||new p).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){c=c||new p;var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1<e))return c.copy(d).multiplyScalar(e).add(b.start)}}(),intersectsLine:function(a){var b=
+this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new p).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new p,b=new ra;return function(c,d){d=d||b.getNormalMatrix(c);c=this.coplanarPoint(a).applyMatrix4(c);d=this.normal.applyMatrix3(d).normalize();this.constant=-c.dot(d);return this}}(),
+translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(ld.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,
+c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],q=c[8],n=c[9],m=c[10],r=c[11],p=c[12],v=c[13],w=c[14],c=c[15];b[0].setComponents(f-a,l-g,r-q,c-p).normalize();b[1].setComponents(f+a,l+g,r+q,c+p).normalize();b[2].setComponents(f+d,l+h,r+n,c+v).normalize();b[3].setComponents(f-d,l-h,r-n,c-v).normalize();b[4].setComponents(f-e,l-k,r-m,c-w).normalize();b[5].setComponents(f+e,l+k,r+m,c+w).normalize();return this},intersectsObject:function(){var a=new Da;return function(b){var c=
+b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Da;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new p,b=
+new p;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});Ya.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");
+Ya.DefaultOrder="XYZ";Object.defineProperties(Ya.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(Ya.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=
+c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=R.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],l=e[9],q=e[2],n=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-l,e),this._z=
+Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===
+b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-l,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);
+return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new Z;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===
+b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Pd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});
+var Nf=0;A.DefaultUp=new p(0,1,0);A.DefaultMatrixAutoUpdate=!0;Object.assign(A.prototype,ja.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,
+!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new Z;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateOnWorldAxis:function(){var a=new Z;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.premultiply(a);return this}}(),rotateX:function(){var a=new p(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=
+new p(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new p(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new p;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new p(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new p(0,1,0);return function(b){return this.translateOnAxis(a,
+b)}}(),translateZ:function(){var a=new p(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new K;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new K,b=new p;return function(c,d,e){c.isVector3?b.copy(c):b.set(c,d,e);this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),
+add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);
+return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new p;this.updateMatrixWorld(!0);
+return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new p,b=new p;return function(c){c=c||new Z;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new Z;return function(b){b=b||new Ya;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new p,b=new Z;return function(c){c=c||new p;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),
+getWorldDirection:function(){var a=new Z;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,
+this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=
+[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.matrix=
+this.matrix.toArray();void 0!==this.geometry&&(f.geometry=b(a.geometries,this.geometry));if(void 0!==this.material)if(Array.isArray(this.material)){for(var g=[],h=0,k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);d&&(d=c(a.geometries),g=c(a.materials),h=c(a.textures),k=c(a.images),0<d.length&&
+(e.geometries=d),0<g.length&&(e.materials=g),0<h.length&&(e.textures=h),0<k.length&&(e.images=k));e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;
+this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});La.prototype=Object.assign(Object.create(A.prototype),{constructor:La,isCamera:!0,copy:function(a,b){A.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);
+this.projectionMatrix.copy(a.projectionMatrix);return this},getWorldDirection:function(){var a=new Z;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){A.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Kb.prototype=Object.assign(Object.create(La.prototype),{constructor:Kb,isOrthographicCamera:!0,copy:function(a,b){La.prototype.copy.call(this,
+a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},
+clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view&&this.view.enabled)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/
+this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});Object.assign(Pa.prototype,
+{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Of=0;Object.assign(N.prototype,ja.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=(new ra).getNormalMatrix(a),
+c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);this.applyMatrix(a);
+return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new A;return function(b){a.lookAt(b);
+a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[q[a].clone(),q[b].clone(),q[d].clone()]:[],t=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Pa(a,b,d,f,t,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([n[a].clone(),n[b].clone(),n[d].clone()]);void 0!==l&&c.faceVertexUvs[1].push([m[a].clone(),m[b].clone(),m[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,
+g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,l=void 0!==e.uv2?e.uv2.array:void 0;void 0!==l&&(this.faceVertexUvs[1]=[]);for(var q=[],n=[],m=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new p(f[e],f[e+1],f[e+2])),void 0!==g&&q.push(new p(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new H(h[e],h[e+1],h[e+2])),void 0!==k&&n.push(new C(k[r],k[r+1])),void 0!==l&&m.push(new C(l[r],l[r+1]));var u=a.groups;if(0<u.length)for(e=0;e<u.length;e++)for(var f=
+u[e],v=f.start,w=f.count,r=v,v=v+w;r<v;r+=3)void 0!==d?b(d[r],d[r+1],d[r+2],f.materialIndex):b(r,r+1,r+2,f.materialIndex);else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,
+a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new K;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===
+a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var k=this.vertices[b.c];e.subVectors(k,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=
+this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),
+d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):
+d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new N;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=new p;var k={a:new p,b:new p,c:new p};d.push(h);g.push(k)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();
+f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(d.normal),k.a.copy(d.vertexNormals[0]),k.b.copy(d.vertexNormals[1]),k.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===
+this.boundingBox&&(this.boundingBox=new Oa);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Da);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,l=this.faceVertexUvs[0],q=a.faceVertexUvs[0],n=this.colors,m=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ra).getNormalMatrix(b));a=0;for(var r=g.length;a<
+r;a++){var p=g[a].clone();void 0!==b&&p.applyMatrix4(b);f.push(p)}a=0;for(r=m.length;a<r;a++)n.push(m[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],v=g.vertexNormals,m=g.vertexColors,n=new Pa(g.a+e,g.b+e,g.c+e);n.normal.copy(g.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(f=v.length;b<f;b++)p=v[b].clone(),void 0!==d&&p.applyMatrix3(d).normalize(),n.vertexNormals.push(p);n.color.copy(g.color);b=0;for(f=m.length;b<f;b++)p=m[b],n.vertexColors.push(p.clone());n.materialIndex=g.materialIndex+
+c;h.push(n)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());l.push(d)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<
+e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=
+b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);
+g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==l[b])return l[b];l[b]=k.length/3;k.push(a.x,a.y,a.z);return l[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=q.length;q.push(a.getHex());return n[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==p[b])return p[b];p[b]=m.length/2;m.push(a.x,a.y);return p[b]}var e=
+{metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],l={},q=[],n={},m=[],p={};for(g=0;g<this.faces.length;g++){var u=this.faces[g],v=void 0!==this.faceVertexUvs[0][g],w=0<u.normal.length(),x=0<u.vertexNormals.length,z=
+1!==u.color.r||1!==u.color.g||1!==u.color.b,I=0<u.vertexColors.length,B=0,B=a(B,0,0),B=a(B,1,!0),B=a(B,2,!1),B=a(B,3,v),B=a(B,4,w),B=a(B,5,x),B=a(B,6,z),B=a(B,7,I);h.push(B);h.push(u.a,u.b,u.c);h.push(u.materialIndex);v&&(v=this.faceVertexUvs[0][g],h.push(d(v[0]),d(v[1]),d(v[2])));w&&h.push(b(u.normal));x&&(w=u.vertexNormals,h.push(b(w[0]),b(w[1]),b(w[2])));z&&h.push(c(u.color));I&&(u=u.vertexColors,h.push(c(u[0]),c(u[1]),c(u[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<q.length&&(e.data.colors=
+q);0<m.length&&(e.data.uvs=[m]);e.data.faces=h;return e},clone:function(){return(new N).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());
+e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],k=[];var l=0;for(d=h.length;l<d;l++)k.push(h[l].clone());this.faceVertexUvs[f].push(k)}}l=a.morphTargets;f=0;for(b=l.length;f<b;f++){d={};d.name=l[f].name;if(void 0!==l[f].vertices)for(d.vertices=[],e=0,c=l[f].vertices.length;e<c;e++)d.vertices.push(l[f].vertices[e].clone());
+if(void 0!==l[f].normals)for(d.normals=[],e=0,c=l[f].normals.length;e<c;e++)d.normals.push(l[f].normals[e].clone());this.morphTargets.push(d)}l=a.morphNormals;f=0;for(b=l.length;f<b;f++){d={};if(void 0!==l[f].vertexNormals)for(d.vertexNormals=[],e=0,c=l[f].vertexNormals.length;e<c;e++)g=l[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==l[f].faceNormals)for(d.faceNormals=[],e=0,c=l[f].faceNormals.length;e<c;e++)d.faceNormals.push(l[f].faceNormals[e].clone());
+this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=
+a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(P.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(P.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==
+a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=
+0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new H);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new C);
+b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new da);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;
+b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},
+setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,
+this.itemSize)).copy(this)}});uc.prototype=Object.create(P.prototype);uc.prototype.constructor=uc;vc.prototype=Object.create(P.prototype);vc.prototype.constructor=vc;wc.prototype=Object.create(P.prototype);wc.prototype.constructor=wc;xc.prototype=Object.create(P.prototype);xc.prototype.constructor=xc;hb.prototype=Object.create(P.prototype);hb.prototype.constructor=hb;yc.prototype=Object.create(P.prototype);yc.prototype.constructor=yc;ib.prototype=Object.create(P.prototype);ib.prototype.constructor=
+ib;y.prototype=Object.create(P.prototype);y.prototype.constructor=y;zc.prototype=Object.create(P.prototype);zc.prototype.constructor=zc;Object.assign(Je.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,
+e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var k=[];for(var l=0;l<h;l++)k[l]=[];this.morphTargets.position=k}var q=a.morphNormals,n=q.length;if(0<n){var m=[];for(l=0;l<n;l++)m[l]=[];this.morphTargets.normal=m}for(var p=a.skinIndices,u=a.skinWeights,v=p.length===c.length,w=u.length===c.length,l=0;l<b.length;l++){var x=b[l];this.vertices.push(c[x.a],c[x.b],c[x.c]);var z=x.vertexNormals;3===z.length?this.normals.push(z[0],z[1],z[2]):(z=x.normal,this.normals.push(z,
+z,z));z=x.vertexColors;3===z.length?this.colors.push(z[0],z[1],z[2]):(z=x.color,this.colors.push(z,z,z));!0===e&&(z=d[0][l],void 0!==z?this.uvs.push(z[0],z[1],z[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",l),this.uvs.push(new C,new C,new C)));!0===f&&(z=d[1][l],void 0!==z?this.uvs2.push(z[0],z[1],z[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",l),this.uvs2.push(new C,new C,new C)));for(z=0;z<h;z++){var I=g[z].vertices;k[z].push(I[x.a],
+I[x.b],I[x.c])}for(z=0;z<n;z++)I=q[z].vertexNormals[l],m[z].push(I.a,I.b,I.c);v&&this.skinIndices.push(p[x.a],p[x.b],p[x.c]);w&&this.skinWeights.push(u[x.a],u[x.b],u[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});var Pf=1;Object.assign(D.prototype,ja.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},
+setIndex:function(a){Array.isArray(a)?this.index=new (65535<Qd(a)?ib:hb)(a,1):this.index=a},addAttribute:function(a,b,c){if(b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute)if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new P(b,c))},getAttribute:function(a){return this.attributes[a]},
+removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new ra).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==
+this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,
+c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new A;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new y(3*b.vertices.length,3);var c=new y(3*b.colors.length,
+3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new y(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=
+[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,e.y,e.z||0)}this.addAttribute("position",new y(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=
+!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=
+!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new Je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=
+new Float32Array(3*a.vertices.length);this.addAttribute("position",(new P(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new P(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new P(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new P(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=
+new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new P(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<Qd(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new P(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new y(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new y(4*a.skinIndices.length,
+4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new y(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Oa);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):
+this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Oa,b=new p;return function(){null===this.boundingSphere&&(this.boundingSphere=new Da);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);
+a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;
+if(void 0===b.normal)this.addAttribute("normal",new P(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h=new p,k=new p,l=new p,q=new p,n=new p;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var m=0,r=c.length;m<r;++m){f=c[m];g=f.start;var u=f.count;f=g;for(g+=u;f<g;f+=3){u=3*a[f+0];var v=3*a[f+1];var w=3*a[f+2];h.fromArray(d,u);k.fromArray(d,v);l.fromArray(d,w);q.subVectors(l,k);n.subVectors(h,k);q.cross(n);e[u]+=q.x;e[u+
+1]+=q.y;e[u+2]+=q.z;e[v]+=q.x;e[v+1]+=q.y;e[v+2]+=q.z;e[w]+=q.x;e[w+1]+=q.y;e[w+2]+=q.z}}}else for(f=0,g=d.length;f<g;f+=9)h.fromArray(d,f),k.fromArray(d,f+3),l.fromArray(d,f+6),q.subVectors(l,k),n.subVectors(h,k),q.cross(n),e[f]=q.x,e[f+1]=q.y,e[f+2]=q.z,e[f+3]=q.x,e[f+4]=q.y,e[f+5]=q.z,e[f+6]=q.x,e[f+7]=q.y,e[f+8]=q.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=
+c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){var a=new p;return function(){for(var b=this.attributes.normal,c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.normalize(),b.setXYZ(c,a.x,a.y,a.z)}}(),toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),
+this;var a=new D,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,l=0,q=b.length;l<q;l++){h=b[l]*e;for(var n=0;n<e;n++)g[k++]=f[h++]}a.addAttribute(d,new P(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters;for(var c in b)void 0!==b[c]&&
+(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c];b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),
+radius:c.radius});return a},clone:function(){return(new D).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.addAttribute(g,c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}var g=a.groups;c=0;for(b=g.length;c<b;c++)d=
+g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Lb.prototype=Object.create(N.prototype);Lb.prototype.constructor=Lb;jb.prototype=Object.create(D.prototype);jb.prototype.constructor=jb;Ac.prototype=Object.create(N.prototype);Ac.prototype.constructor=
+Ac;kb.prototype=Object.create(D.prototype);kb.prototype.constructor=kb;va.prototype=Object.create(Q.prototype);va.prototype.constructor=va;va.prototype.isMeshBasicMaterial=!0;va.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=
+a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};oa.prototype=Object.create(Q.prototype);oa.prototype.constructor=oa;oa.prototype.isShaderMaterial=!0;oa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;
+this.uniforms=Ea.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this};oa.prototype.toJSON=function(a){a=Q.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Object.assign(lb.prototype,
+{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new p).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,
+b){b=b||new p;b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=
+new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),l=c.dot(this.direction),q=-c.dot(b),n=c.lengthSq(),m=Math.abs(1-k*k);if(0<m){d=k*q-l;e=k*l-q;var p=h*m;0<=d?e>=-p?e<=p?(h=1/m,d*=h,e*=h,k=d*(d+k*e+2*l)+e*(k*d+e+2*q)+n):(e=h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):(e=-h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):e<=-p?(d=Math.max(0,-(-k*h+l)),e=0<d?-h:Math.min(Math.max(-h,
+-q),h),k=-d*d+e*(e+2*q)+n):e<=p?(d=0,e=Math.min(Math.max(-h,-q),h),k=e*(e+2*q)+n):(d=Math.max(0,-(k*h+l)),e=0<d?h:Math.min(Math.max(-h,-q),h),k=-d*d+e*(e+2*q)+n)}else e=0<k?-h:h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n;f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new p;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d;b=b.radius*b.radius;if(e>b)return null;
+b=Math.sqrt(b-e);e=d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);
+return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;
+if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;
+g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Mb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);
+this.end.copy(a.end);return this},getCenter:function(a){return(a||new p).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new p).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){b=b||new p;return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c,
+this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=R.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new p;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Qa,{normal:function(){var a=new p;return function(b,c,d,e){e=e||new p;
+e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var l=d*k-e*e;h=h||new p;if(0===l)return h.set(-2,-1,-1);l=1/l;k=(k*f-e*g)*l;d=(d*g-e*f)*l;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new p;return function(b,c,d,e){b=
+Qa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Qa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,
+this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Qa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Qa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Qa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=
+new Aa,b=[new Mb,new Mb,new Mb],c=new p,d=new p;return function(e,f){f=f||new p;var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;e<b.length;e++){b[e].closestPointToPoint(c,!0,d);var h=c.distanceToSquared(d);h<g&&(g=h,f.copy(d))}return f}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});pa.prototype=Object.assign(Object.create(A.prototype),
+{constructor:pa,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){A.prototype.copy.call(this,a);this.drawMode=a.drawMode;void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==
+c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else if(c=a.morphTargets,void 0!==c&&0<c.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++)d=c[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[d]=a},raycast:function(){function a(a,b,c,d,e,f,g){Qa.barycoordFromPoint(a,b,c,d,v);e.multiplyScalar(v.x);
+f.multiplyScalar(v.y);g.multiplyScalar(v.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;x.copy(h);x.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(x);return b<c.near||b>c.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,l,n,q,t){g.fromBufferAttribute(f,n);h.fromBufferAttribute(f,q);k.fromBufferAttribute(f,t);if(c=b(c,c.material,d,e,g,h,k,w))l&&(m.fromBufferAttribute(l,
+n),r.fromBufferAttribute(l,q),u.fromBufferAttribute(l,t),c.uv=a(w,g,h,k,m,r,u)),c.face=new Pa(n,q,t,Qa.normal(g,h,k)),c.faceIndex=n;return c}var d=new K,e=new lb,f=new Da,g=new p,h=new p,k=new p,l=new p,q=new p,n=new p,m=new C,r=new C,u=new C,v=new p,w=new p,x=new p;return function(t,p){var v=this.geometry,x=this.material,z=this.matrixWorld;if(void 0!==x&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(z),!1!==t.ray.intersectsSphere(f)&&(d.getInverse(z),
+e.copy(t.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox)))){var y;if(v.isBufferGeometry){var x=v.index,I=v.attributes.position,z=v.attributes.uv,C;if(null!==x){var A=0;for(C=x.count;A<C;A+=3){v=x.getX(A);var D=x.getX(A+1);var E=x.getX(A+2);if(y=c(this,t,e,I,z,v,D,E))y.faceIndex=Math.floor(A/3),p.push(y)}}else if(void 0!==I)for(A=0,C=I.count;A<C;A+=3)if(v=A,D=A+1,E=A+2,y=c(this,t,e,I,z,v,D,E))y.index=v,p.push(y)}else if(v.isGeometry){var z=Array.isArray(x);A=v.vertices;
+C=v.faces;D=v.faceVertexUvs[0];0<D.length&&(I=D);for(var H=0,N=C.length;H<N;H++){var M=C[H];y=z?x[M.materialIndex]:x;if(void 0!==y){D=A[M.a];E=A[M.b];var V=A[M.c];if(!0===y.morphTargets){var K=v.morphTargets,P=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var Q=0,R=K.length;Q<R;Q++){var O=P[Q];if(0!==O){var S=K[Q].vertices;g.addScaledVector(l.subVectors(S[M.a],D),O);h.addScaledVector(q.subVectors(S[M.b],E),O);k.addScaledVector(n.subVectors(S[M.c],V),O)}}g.add(D);h.add(E);k.add(V);
+D=g;E=h;V=k}if(y=b(this,y,t,e,D,E,V,w))I&&I[H]&&(K=I[H],m.copy(K[0]),r.copy(K[1]),u.copy(K[2]),y.uv=a(w,D,E,V,m,r,u)),y.face=M,y.faceIndex=H,p.push(y)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var ig=0;U.prototype=Object.assign(Object.create(La.prototype),{constructor:U,isPerspectiveCamera:!0,copy:function(a,b){La.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;
+this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*R.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*R.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*R.RAD2DEG*Math.atan(Math.tan(.5*R.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,
+1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},
+updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*R.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=
+this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});nd.prototype=Object.assign(Object.create(U.prototype),{constructor:nd,isArrayCamera:!0});Ob.prototype.isFogExp2=!0;Ob.prototype.clone=function(){return new Ob(this.color.getHex(),this.density)};Ob.prototype.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),
+density:this.density}};Pb.prototype.isFog=!0;Pb.prototype.clone=function(){return new Pb(this.color.getHex(),this.near,this.far)};Pb.prototype.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};od.prototype=Object.assign(Object.create(A.prototype),{constructor:od,copy:function(a,b){A.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=
+a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=A.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Xd.prototype=Object.assign(Object.create(A.prototype),{constructor:Xd,isLensFlare:!0,copy:function(a){A.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=
+a.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new H(16777215));void 0===d&&(d=1);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c=2*-this.positionScreen.x,d=2*-this.positionScreen.y;
+for(a=0;a<b;a++){var e=this.lensFlares[a];e.x=this.positionScreen.x+c*e.distance;e.y=this.positionScreen.y+d*e.distance;e.wantedRotation=e.x*Math.PI*.25;e.rotation+=.25*(e.wantedRotation-e.rotation)}}});Za.prototype=Object.create(Q.prototype);Za.prototype.constructor=Za;Za.prototype.isSpriteMaterial=!0;Za.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};Cc.prototype=Object.assign(Object.create(A.prototype),{constructor:Cc,
+isSprite:!0,raycast:function(){var a=new p,b=new p,c=new p;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f||(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});Dc.prototype=Object.assign(Object.create(A.prototype),{constructor:Dc,copy:function(a){A.prototype.copy.call(this,
+a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new p;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=
+b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new p,b=new p;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.levels=
+[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(Ec.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new K;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<
+b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new K,b=new K;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new Ec(this.bones,
+this.boneInverses)}});pd.prototype=Object.assign(Object.create(A.prototype),{constructor:pd,isBone:!0});qd.prototype=Object.assign(Object.create(pa.prototype),{constructor:qd,isSkinnedMesh:!0,initBones:function(){var a=[],b;if(this.geometry&&void 0!==this.geometry.bones){var c=0;for(b=this.geometry.bones.length;c<b;c++){var d=this.geometry.bones[c];var e=new pd;a.push(e);e.name=d.name;e.position.fromArray(d.pos);e.quaternion.fromArray(d.rotq);void 0!==d.scl&&e.scale.fromArray(d.scl)}c=0;for(b=this.geometry.bones.length;c<
+b;c++)d=this.geometry.bones[c],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[c]):this.add(a[c])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a;if(this.geometry&&this.geometry.isGeometry)for(a=0;a<this.geometry.skinWeights.length;a++){var b=
+this.geometry.skinWeights[a];var c=1/b.manhattanLength();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var b=new da,d=this.geometry.attributes.skinWeight;for(a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.manhattanLength(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)}},updateMatrixWorld:function(a){pa.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):
+"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});O.prototype=Object.create(Q.prototype);O.prototype.constructor=O;O.prototype.isLineBasicMaterial=!0;O.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};
+ma.prototype=Object.assign(Object.create(A.prototype),{constructor:ma,isLine:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new p,l=new p,h=new p,q=new p,n=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var m=g.index;var r=g.attributes.position.array;
+if(null!==m)for(var u=m.array,g=0,v=u.length-1;g<v;g+=n)m=u[g+1],k.fromArray(r,3*u[g]),l.fromArray(r,3*m),m=b.distanceSqToSegment(k,l,q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),m<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}));else for(g=0,v=r.length/3-1;g<v;g+=n)k.fromArray(r,3*g),l.fromArray(r,3*g+3),m=b.distanceSqToSegment(k,l,q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),
+m<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,l=k.length,g=0;g<l-1;g+=n)m=b.distanceSqToSegment(k[g],k[g+1],q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),m<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,
+this.material)).copy(this)}});ca.prototype=Object.assign(Object.create(ma.prototype),{constructor:ca,isLineSegments:!0});rd.prototype=Object.assign(Object.create(ma.prototype),{constructor:rd,isLineLoop:!0});Ba.prototype=Object.create(Q.prototype);Ba.prototype.constructor=Ba;Ba.prototype.isPointsMaterial=!0;Ba.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Qb.prototype=Object.assign(Object.create(A.prototype),
+{constructor:Qb,isPoints:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<m){a=b.closestPointToPoint(a);a.applyMatrix4(k);var h=d.ray.origin.distanceTo(a);h<d.near||h>d.far||e.push({distance:h,distanceToRay:Math.sqrt(f),point:a.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,l=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);
+c.radius+=l;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var l=l/((this.scale.x+this.scale.y+this.scale.z)/3),m=l*l,l=new p;if(h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var t=n.array,n=0,r=t.length;n<r;n++){var u=t[n];l.fromArray(h,3*u);f(l,u)}else for(n=0,t=h.length/3;n<t;n++)l.fromArray(h,3*n),f(l,n)}else for(l=h.vertices,n=0,t=l.length;n<t;n++)f(l[n],n)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
+Fc.prototype=Object.assign(Object.create(A.prototype),{constructor:Fc});sd.prototype=Object.create(ea.prototype);sd.prototype.constructor=sd;Rb.prototype=Object.create(ea.prototype);Rb.prototype.constructor=Rb;Rb.prototype.isCompressedTexture=!0;Gc.prototype=Object.create(ea.prototype);Gc.prototype.constructor=Gc;Gc.prototype.isDepthTexture=!0;Sb.prototype=Object.create(D.prototype);Sb.prototype.constructor=Sb;Hc.prototype=Object.create(N.prototype);Hc.prototype.constructor=Hc;Tb.prototype=Object.create(D.prototype);
+Tb.prototype.constructor=Tb;Ic.prototype=Object.create(N.prototype);Ic.prototype.constructor=Ic;qa.prototype=Object.create(D.prototype);qa.prototype.constructor=qa;Jc.prototype=Object.create(N.prototype);Jc.prototype.constructor=Jc;Ub.prototype=Object.create(qa.prototype);Ub.prototype.constructor=Ub;Kc.prototype=Object.create(N.prototype);Kc.prototype.constructor=Kc;nb.prototype=Object.create(qa.prototype);nb.prototype.constructor=nb;Lc.prototype=Object.create(N.prototype);Lc.prototype.constructor=
+Lc;Vb.prototype=Object.create(qa.prototype);Vb.prototype.constructor=Vb;Mc.prototype=Object.create(N.prototype);Mc.prototype.constructor=Mc;Wb.prototype=Object.create(qa.prototype);Wb.prototype.constructor=Wb;Nc.prototype=Object.create(N.prototype);Nc.prototype.constructor=Nc;Xb.prototype=Object.create(D.prototype);Xb.prototype.constructor=Xb;Oc.prototype=Object.create(N.prototype);Oc.prototype.constructor=Oc;Yb.prototype=Object.create(D.prototype);Yb.prototype.constructor=Yb;Pc.prototype=Object.create(N.prototype);
+Pc.prototype.constructor=Pc;Zb.prototype=Object.create(D.prototype);Zb.prototype.constructor=Zb;var Ha={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g;if(0<Ha.area(a))for(g=0;g<c;g++)e[g]=g;else for(g=0;g<c;g++)e[g]=c-1-g;var h=2*c;for(g=c-1;2<c;){if(0>=h--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}var k=
+g;c<=k&&(k=0);g=k+1;c<=g&&(g=0);var l=g+1;c<=l&&(l=0);a:{var m;var n=a[e[k]].x;var p=a[e[k]].y;var r=a[e[g]].x;var u=a[e[g]].y;var v=a[e[l]].x;var w=a[e[l]].y;if(0>=(r-n)*(w-p)-(u-p)*(v-n))var x=!1;else{var z=v-r;var y=w-u;var B=n-v;var C=p-w;var A=r-n;x=u-p;for(m=0;m<c;m++){var D=a[e[m]].x;var E=a[e[m]].y;if(!(D===n&&E===p||D===r&&E===u||D===v&&E===w)){var H=D-n;var N=E-p;var K=D-r;var L=E-u;D-=v;E-=w;L=z*L-y*K;N=A*N-x*H;D=B*E-C*D;if(L>=-Number.EPSILON&&D>=-Number.EPSILON&&N>=-Number.EPSILON){x=
+!1;break a}}}x=!0}}if(x){d.push([a[e[k]],a[e[g]],a[e[l]]]);f.push([e[k],e[g],e[l]]);k=g;for(l=g+1;l<c;k++,l++)e[k]=e[l];c--;h=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,l=e.y-c.y,m=a.x-c.x,n=a.y-c.y,q=h*k-g*l,p=h*m-g*n;if(Math.abs(q)>Number.EPSILON){if(0<
+q){if(0>p||p>q)return[];k=l*m-k*n;if(0>k||k>q)return[]}else{if(0<p||p<q)return[];k=l*m-k*n;if(0<k||k<q)return[]}if(0===k)return!f||0!==p&&p!==q?[a]:[];if(k===q)return!f||0!==p&&p!==q?[b]:[];if(0===p)return[c];if(p===q)return[e];f=k/q;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==p||l*m!==k*n)return[];h=0===g&&0===h;k=0===k&&0===l;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,q=c.x,l=
+e,c=e.x):(b=e,q=e.x,l=c,c=c.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,q=c.y,l=e,c=e.y):(b=e,q=e.y,l=c,c=c.y));return k<=q?a<q?[]:a===q?f?[]:[b]:a<=c?[b,h]:[b,l]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,l]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h={},k=a.concat();var l=0;for(g=b.length;l<g;l++)Array.prototype.push.apply(k,
+b[l]);l=0;for(g=k.length;l<g;l++){var m=k[l].x+":"+k[l].y;void 0!==h[m]&&console.warn("THREE.ShapeUtils: Duplicate point",m,l);h[m]=l}l=function(a,b){function c(a,b){var c=h.length-1,d=a-1;0>d&&(d=c);var e=a+1;e>c&&(e=0);c=f(h[a],h[d],h[e],D[b]);if(!c)return!1;c=D.length-1;d=b-1;0>d&&(d=c);e=b+1;e>c&&(e=0);return(c=f(D[b],D[d],D[e],h[a]))?!0:!1}function d(a,b){var c;for(c=0;c<h.length;c++){var d=c+1;d%=h.length;d=e(a,b,h[c],h[d],!0);if(0<d.length)return!0}return!1}function g(a,c){var d,f;for(d=0;d<
+k.length;d++){var g=b[k[d]];for(f=0;f<g.length;f++){var h=f+1;h%=g.length;h=e(a,c,g[f],g[h],!0);if(0<h.length)return!0}}return!1}var h=a.concat(),k=[],l,m;a=[];var q,n=0;for(l=b.length;n<l;n++)k.push(n);var p=0;for(var t=2*k.length;0<k.length;){t--;if(0>t){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!');break}for(m=p;m<h.length;m++){var y=h[m];l=-1;for(n=0;n<k.length;n++){var C=k[n];var A=y.x+":"+y.y+":"+C;if(void 0===a[A]){var D=
+b[C];for(q=0;q<D.length;q++)if(C=D[q],c(m,q)&&!d(y,C)&&!g(y,C)){l=q;k.splice(n,1);p=h.slice(0,m+1);C=h.slice(m);q=D.slice(l);var E=D.slice(0,l+1);h=p.concat(q).concat(E).concat(C);p=m;break}if(0<=l)break;a[A]=!0}}if(0<=l)break}}return h}(a,b);k=Ha.triangulate(l,!1);l=0;for(g=k.length;l<g;l++)for(b=k[l],a=0;3>a;a++)m=b[a].x+":"+b[a].y,m=h[m],void 0!==m&&(b[a]=m);return k.concat()},isClockWise:function(a){return 0>Ha.area(a)}};$a.prototype=Object.create(N.prototype);$a.prototype.constructor=$a;Ga.prototype=
+Object.create(D.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index);this.addAttribute("position",
+new y(b.arrays.position,3));this.addAttribute("uv",new y(b.arrays.uv,2))};Ga.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g),h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new C(f,
+d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new C(f/e,d/e)}function e(a,b){for(G=a.length;0<=--G;){var c=G;var d=G-1;0>d&&(d=a.length-1);var e,f=A+2*w;for(e=0;e<f;e++){var g=Z*e,l=Z*(e+1),q=b+d+g,n=b+d+l,l=b+c+l;h(b+c+g);h(q);h(l);h(q);h(n);h(l);g=m.length/3;g=E.generateSideWallUV(R,m,g-6,g-3,g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);
+k(g[2]);k(g[3])}}}function f(a,b,c){r.push(a);r.push(b);r.push(c)}function g(a,b,c){h(a);h(b);h(c);a=m.length/3;a=E.generateTopUV(R,m,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){n.push(m.length/3);m.push(r[3*a+0]);m.push(r[3*a+1]);m.push(r[3*a+2])}function k(a){t.push(a.x);t.push(a.y)}var l=b.arrays?b.arrays:this.getArrays(),m=l.position,n=l.index,t=l.uv,r=[],l=void 0!==b.amount?b.amount:100,u=void 0!==b.bevelThickness?b.bevelThickness:6,v=void 0!==b.bevelSize?b.bevelSize:u-2,w=void 0!==b.bevelSegments?
+b.bevelSegments:3,x=void 0!==b.bevelEnabled?b.bevelEnabled:!0,z=void 0!==b.curveSegments?b.curveSegments:12,A=void 0!==b.steps?b.steps:1,B=b.extrudePath,D=!1,E=void 0!==b.UVGenerator?b.UVGenerator:$a.WorldUVGenerator;if(B){var H=B.getSpacedPoints(A);D=!0;x=!1;var N=void 0!==b.frames?b.frames:B.computeFrenetFrames(A,!1);var K=new p;var Q=new p;var P=new p}x||(v=u=w=0);var L,R=this,z=a.extractPoints(z);a=z.shape;var O=z.holes;if(!Ha.isClockWise(a)){a=a.reverse();var M=0;for(L=O.length;M<L;M++){var V=
+O[M];Ha.isClockWise(V)&&(O[M]=V.reverse())}}var S=Ha.triangulateShape(a,O),W=a;M=0;for(L=O.length;M<L;M++)V=O[M],a=a.concat(V);var aa,Z=a.length,U,ca=S.length,z=[],G=0;var X=W.length;var fa=X-1;for(aa=G+1;G<X;G++,fa++,aa++)fa===X&&(fa=0),aa===X&&(aa=0),z[G]=d(W[G],W[fa],W[aa]);var B=[],ea=z.concat();M=0;for(L=O.length;M<L;M++){V=O[M];var da=[];G=0;X=V.length;fa=X-1;for(aa=G+1;G<X;G++,fa++,aa++)fa===X&&(fa=0),aa===X&&(aa=0),da[G]=d(V[G],V[fa],V[aa]);B.push(da);ea=ea.concat(da)}for(fa=0;fa<w;fa++){X=
+fa/w;var ga=u*Math.cos(X*Math.PI/2);aa=v*Math.sin(X*Math.PI/2);G=0;for(X=W.length;G<X;G++){var T=c(W[G],z[G],aa);f(T.x,T.y,-ga)}M=0;for(L=O.length;M<L;M++)for(V=O[M],da=B[M],G=0,X=V.length;G<X;G++)T=c(V[G],da[G],aa),f(T.x,T.y,-ga)}aa=v;for(G=0;G<Z;G++)T=x?c(a[G],ea[G],aa):a[G],D?(Q.copy(N.normals[0]).multiplyScalar(T.x),K.copy(N.binormals[0]).multiplyScalar(T.y),P.copy(H[0]).add(Q).add(K),f(P.x,P.y,P.z)):f(T.x,T.y,0);for(X=1;X<=A;X++)for(G=0;G<Z;G++)T=x?c(a[G],ea[G],aa):a[G],D?(Q.copy(N.normals[X]).multiplyScalar(T.x),
+K.copy(N.binormals[X]).multiplyScalar(T.y),P.copy(H[X]).add(Q).add(K),f(P.x,P.y,P.z)):f(T.x,T.y,l/A*X);for(fa=w-1;0<=fa;fa--){X=fa/w;ga=u*Math.cos(X*Math.PI/2);aa=v*Math.sin(X*Math.PI/2);G=0;for(X=W.length;G<X;G++)T=c(W[G],z[G],aa),f(T.x,T.y,l+ga);M=0;for(L=O.length;M<L;M++)for(V=O[M],da=B[M],G=0,X=V.length;G<X;G++)T=c(V[G],da[G],aa),D?f(T.x,T.y+H[A-1].y,H[A-1].x+ga):f(T.x,T.y,l+ga)}(function(){var a=m.length/3;if(x){var c=0*Z;for(G=0;G<ca;G++)U=S[G],g(U[2]+c,U[1]+c,U[0]+c);c=Z*(A+2*w);for(G=0;G<
+ca;G++)U=S[G],g(U[0]+c,U[1]+c,U[2]+c)}else{for(G=0;G<ca;G++)U=S[G],g(U[2],U[1],U[0]);for(G=0;G<ca;G++)U=S[G],g(U[0]+Z*A,U[1]+Z*A,U[2]+Z*A)}R.addGroup(a,m.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=m.length/3,c=0;e(W,c);c+=W.length;M=0;for(L=O.length;M<L;M++)V=O[M],e(V,c),c+=V.length;R.addGroup(a,m.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(n),this.addAttribute("position",new y(m,3)),this.addAttribute("uv",new y(b.arrays.uv,2)))};
+$a.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*c],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var l=b[3*e],m=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(l,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(m,1-e),new C(p,1-b)]}};Qc.prototype=Object.create(N.prototype);
+Qc.prototype.constructor=Qc;$b.prototype=Object.create(Ga.prototype);$b.prototype.constructor=$b;Rc.prototype=Object.create(N.prototype);Rc.prototype.constructor=Rc;ob.prototype=Object.create(D.prototype);ob.prototype.constructor=ob;Sc.prototype=Object.create(N.prototype);Sc.prototype.constructor=Sc;ac.prototype=Object.create(D.prototype);ac.prototype.constructor=ac;Tc.prototype=Object.create(N.prototype);Tc.prototype.constructor=Tc;bc.prototype=Object.create(D.prototype);bc.prototype.constructor=
+bc;cc.prototype=Object.create(N.prototype);cc.prototype.constructor=cc;dc.prototype=Object.create(D.prototype);dc.prototype.constructor=dc;ec.prototype=Object.create(D.prototype);ec.prototype.constructor=ec;pb.prototype=Object.create(N.prototype);pb.prototype.constructor=pb;Sa.prototype=Object.create(D.prototype);Sa.prototype.constructor=Sa;Uc.prototype=Object.create(pb.prototype);Uc.prototype.constructor=Uc;Vc.prototype=Object.create(Sa.prototype);Vc.prototype.constructor=Vc;Wc.prototype=Object.create(N.prototype);
+Wc.prototype.constructor=Wc;fc.prototype=Object.create(D.prototype);fc.prototype.constructor=fc;var Ca=Object.freeze({WireframeGeometry:Sb,ParametricGeometry:Hc,ParametricBufferGeometry:Tb,TetrahedronGeometry:Jc,TetrahedronBufferGeometry:Ub,OctahedronGeometry:Kc,OctahedronBufferGeometry:nb,IcosahedronGeometry:Lc,IcosahedronBufferGeometry:Vb,DodecahedronGeometry:Mc,DodecahedronBufferGeometry:Wb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:qa,TubeGeometry:Nc,TubeBufferGeometry:Xb,TorusKnotGeometry:Oc,
+TorusKnotBufferGeometry:Yb,TorusGeometry:Pc,TorusBufferGeometry:Zb,TextGeometry:Qc,TextBufferGeometry:$b,SphereGeometry:Rc,SphereBufferGeometry:ob,RingGeometry:Sc,RingBufferGeometry:ac,PlaneGeometry:Ac,PlaneBufferGeometry:kb,LatheGeometry:Tc,LatheBufferGeometry:bc,ShapeGeometry:cc,ShapeBufferGeometry:dc,ExtrudeGeometry:$a,ExtrudeBufferGeometry:Ga,EdgesGeometry:ec,ConeGeometry:Uc,ConeBufferGeometry:Vc,CylinderGeometry:pb,CylinderBufferGeometry:Sa,CircleGeometry:Wc,CircleBufferGeometry:fc,BoxGeometry:Lb,
+BoxBufferGeometry:jb});gc.prototype=Object.create(Q.prototype);gc.prototype.constructor=gc;gc.prototype.isShadowMaterial=!0;hc.prototype=Object.create(oa.prototype);hc.prototype.constructor=hc;hc.prototype.isRawShaderMaterial=!0;Ma.prototype=Object.create(Q.prototype);Ma.prototype.constructor=Ma;Ma.prototype.isMeshStandardMaterial=!0;Ma.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;
+this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;
+this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype=Object.create(Ma.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshPhysicalMaterial=
+!0;qb.prototype.copy=function(a){Ma.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ia.prototype=Object.create(Q.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isMeshPhongMaterial=!0;Ia.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=
+a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=
+a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};rb.prototype=Object.create(Ia.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshToonMaterial=!0;rb.prototype.copy=function(a){Ia.prototype.copy.call(this,
+a);this.gradientMap=a.gradientMap;return this};sb.prototype=Object.create(Q.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshNormalMaterial=!0;sb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;
+this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};tb.prototype=Object.create(Q.prototype);tb.prototype.constructor=tb;tb.prototype.isMeshLambertMaterial=!0;tb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=
+a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ub.prototype=Object.create(O.prototype);ub.prototype.constructor=
+ub;ub.prototype.isLineDashedMaterial=!0;ub.prototype.copy=function(a){O.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var tg=Object.freeze({ShadowMaterial:gc,SpriteMaterial:Za,RawShaderMaterial:hc,ShaderMaterial:oa,PointsMaterial:Ba,MeshPhysicalMaterial:qb,MeshStandardMaterial:Ma,MeshPhongMaterial:Ia,MeshToonMaterial:rb,MeshNormalMaterial:sb,MeshLambertMaterial:tb,MeshDepthMaterial:Wa,MeshDistanceMaterial:Xa,MeshBasicMaterial:va,LineDashedMaterial:ub,
+LineBasicMaterial:O,Material:Q}),jd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},wa=new Yd,Ta={};Object.assign(Ja.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=jd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},
+0),f;if(void 0!==Ta[a])Ta[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2],g=g[3],g=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":for(var l=new Uint8Array(g.length),h=0;h<g.length;h++)l[h]=g.charCodeAt(h);var m="blob"===k?new Blob([l.buffer],{type:c}):l.buffer;break;case "document":m=(new DOMParser).parseFromString(g,c);break;case "json":m=
+JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(t){window.setTimeout(function(){d&&d(t);e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{Ta[a]=[];Ta[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=b.target.response;jd.add(a,c);var d=Ta[a];delete Ta[a];if(200===this.status){for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}e.manager.itemEnd(a)}else if(0===
+this.status){console.warn("THREE.FileLoader: HTTP Status 0 received.");f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onLoad)h.onLoad(c);e.manager.itemEnd(a)}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemEnd(a);e.manager.itemError(a)}},!1);n.addEventListener("progress",function(b){for(var c=Ta[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=Ta[a];delete Ta[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];
+if(g.onError)g.onError(b)}e.manager.itemEnd(a);e.manager.itemError(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=
+a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(Qe.prototype,{load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=g._parser(a,!0);h[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};f+=1;6===f&&(1===a.mipmapCount&&(k.minFilter=1006),k.format=a.format,k.needsUpdate=!0,b&&b(k))},c,d)}var f,g=this,h=[],k=new Rb;
+k.image=h;var l=new Ja(this.manager);l.setPath(this.path);l.setResponseType("arraybuffer");if(Array.isArray(a))for(var m=f=0,n=a.length;m<n;++m)e(m);else l.load(a,function(a){a=g._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){h[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)h[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),h[d].format=a.format,h[d].width=a.width,h[d].height=a.height}else k.image.width=a.width,k.image.height=a.height,k.mipmaps=a.mipmaps;1===a.mipmapCount&&
+(k.minFilter=1006);k.format=a.format;k.needsUpdate=!0;b&&b(k)},c,d);return k},setPath:function(a){this.path=a;return this}});Object.assign(Zd.prototype,{load:function(a,b,c,d){var e=this,f=new fb,g=new Ja(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==
+a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Xc.prototype,{crossOrigin:"Anonymous",load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=jd.get(a);
+if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS("http://www.w3.org/1999/xhtml","img");c.addEventListener("load",function(){jd.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);c.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=
+a;return this},setPath:function(a){this.path=a;return this}});Object.assign($d.prototype,{crossOrigin:"Anonymous",load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Ua,g=new Xc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(td.prototype,
+{crossOrigin:"Anonymous",load:function(a,b,c,d){var e=new Xc(this.manager);e.setCrossOrigin(this.crossOrigin);e.setPath(this.path);var f=new ea;f.image=e.load(a,function(){var c=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data\:image\/jpeg/);f.format=c?1022:1023;f.needsUpdate=!0;void 0!==b&&b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});ga.prototype=Object.assign(Object.create(A.prototype),{constructor:ga,isLight:!0,copy:function(a){A.prototype.copy.call(this,
+a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&
+(a.object.shadow=this.shadow.toJSON());return a}});ud.prototype=Object.assign(Object.create(ga.prototype),{constructor:ud,isHemisphereLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});Object.assign(vb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=
+this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});vd.prototype=Object.assign(Object.create(vb.prototype),{constructor:vd,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*R.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});
+wd.prototype=Object.assign(Object.create(ga.prototype),{constructor:wd,isSpotLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});xd.prototype=Object.assign(Object.create(ga.prototype),{constructor:xd,isPointLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();
+return this}});yd.prototype=Object.assign(Object.create(vb.prototype),{constructor:yd});zd.prototype=Object.assign(Object.create(ga.prototype),{constructor:zd,isDirectionalLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});Ad.prototype=Object.assign(Object.create(ga.prototype),{constructor:Ad,isAmbientLight:!0});Bd.prototype=Object.assign(Object.create(ga.prototype),{constructor:Bd,isRectAreaLight:!0,copy:function(a){ga.prototype.copy.call(this,
+a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=ga.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var T={arraySlice:function(a,b,c){return T.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof
+DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==
+f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};Object.assign(xa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;
+break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||
+this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(xa.prototype,{beforeStart_:xa.prototype.copySampleValue_,afterEnd_:xa.prototype.copySampleValue_});Cd.prototype=Object.assign(Object.create(xa.prototype),{constructor:Cd,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,
+b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,
+f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,l=this._offsetNext,m=this._weightPrev,n=this._weightNext,p=(c-b)/(d-b);c=p*p;d=c*p;b=-m*d+2*m*c-m*p;m=(1+m)*d+(-1.5-2*m)*c+(-.5+m)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+m*f[h+c]+p*f[a+c]+n*f[l+c];return e}});Yc.prototype=Object.assign(Object.create(xa.prototype),{constructor:Yc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-
+b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Dd.prototype=Object.assign(Object.create(xa.prototype),{constructor:Dd,interpolate_:function(a){return this.copySampleValue_(a-1)}});var eb={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Dd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Yc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Cd(this.times,
+this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn("THREE.KeyframeTrackPrototype:",
+b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},
+trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=T.arraySlice(c,e,f),this.values=T.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",
+this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&T.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a,
+b,c=this.times,d=this.values,e=this.getValueSize(),f=2302===this.getInterpolation(),g=1,h=c.length-1,k=1;k<h;++k){a=!1;var l=c[k];if(l!==c[k+1]&&(1!==k||l!==l[0]))if(f)a=!0;else{b=k*e;for(var m=b-e,n=b+e,l=0;l!==e;++l){var p=d[b+l];if(p!==d[m+l]||p!==d[n+l]){a=!0;break}}}if(a){if(k!==g)for(c[g]=c[k],b=k*e,a=g*e,l=0;l!==e;++l)d[a+l]=d[b+l];++g}}if(0<h){c[g]=c[h];b=h*e;a=g*e;for(l=0;l!==e;++l)d[a+l]=d[b+l];++g}g!==c.length&&(this.times=T.arraySlice(c,0,g),this.values=T.arraySlice(d,0,g*e));return this}};
+ic.prototype=Object.assign(Object.create(eb),{constructor:ic,ValueTypeName:"vector"});Ed.prototype=Object.assign(Object.create(xa.prototype),{constructor:Ed,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)Z.slerpFlat(e,0,f,a-g,f,a,b);return e}});Zc.prototype=Object.assign(Object.create(eb),{constructor:Zc,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Ed(this.times,
+this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});jc.prototype=Object.assign(Object.create(eb),{constructor:jc,ValueTypeName:"number"});Fd.prototype=Object.assign(Object.create(eb),{constructor:Fd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Gd.prototype=Object.assign(Object.create(eb),{constructor:Gd,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,
+InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Hd.prototype=Object.assign(Object.create(eb),{constructor:Hd,ValueTypeName:"color"});xb.prototype=eb;eb.constructor=xb;Object.assign(xb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=xb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];T.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,
+a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:T.convertArray(a.times,Array),values:T.convertArray(a.values,Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return jc;case "vector":case "vector2":case "vector3":case "vector4":return ic;
+case "color":return Hd;case "quaternion":return Zc;case "bool":case "boolean":return Gd;case "string":return Fd}throw Error("Unsupported typeName: "+a);}});Object.assign(ka,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(xb.parse(c[e]).scale(d));return new ka(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(xb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,
+b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var l=T.getKeyframeOrder(h),h=T.sortedArray(h,1,l),k=T.sortedArray(k,1,l);d||0!==h[0]||(h.push(e),k.push(k[0]));f.push((new jc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new ka(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,
+b,c){for(var d,e={},f=/^([\w-]*?)([\d]+)$/,g=0,h=a.length;g<h;g++){var k=a[g],l=k.name.match(f);l&&1<l.length&&(d=l[1],(l=e[d])||(e[d]=l=[]),l.push(k))}a=[];for(d in e)a.push(ka.CreateFromMorphTargetSequence(d,e[d],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];T.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||
+-1,g=a.fps||30;a=a.hierarchy||[];for(var h=0;h<a.length;h++){var k=a[h].keys;if(k&&0!==k.length)if(k[0].morphTargets){for(var f={},l=0;l<k.length;l++)if(k[l].morphTargets)for(var m=0;m<k[l].morphTargets.length;m++)f[k[l].morphTargets[m]]=-1;for(var n in f){for(var p=[],r=[],m=0;m!==k[l].morphTargets.length;++m){var u=k[l];p.push(u.time);r.push(u.morphTarget===n?1:0)}d.push(new jc(".morphTargetInfluence["+n+"]",p,r))}f=f.length*(g||1)}else l=".bones["+b[h].name+"]",c(ic,l+".position",k,"pos",d),c(Zc,
+l+".quaternion",k,"rot",d),c(ic,l+".scale",k,"scl",d)}return 0===d.length?null:new ka(e,f,d)}});Object.assign(ka.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Id.prototype,
+{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new tg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);
+void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==
+a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==
+a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=
+a.morphTargets);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&
+(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=
+b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=
+b(a.gradientMap));return d}});Object.assign(ae.prototype,{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new D;var c=a.data.index;void 0!==c&&(c=new gf[c.type](c.array),b.setIndex(new P(c,1)));var d=a.data.attributes;for(f in d){var e=d[f];c=new gf[e.type](e.array);b.addAttribute(f,new P(c,e.itemSize,e.normalized))}var f=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==f)for(c=0,d=f.length;c!==d;++c)e=f[c],
+b.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(f=new p,void 0!==a.center&&f.fromArray(a.center),b.boundingSphere=new Da(f,a.radius));return b}});var gf={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};kc.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,
+b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(kc.prototype,{crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},
+b=new H,c=new td,d=new Id;return function(e,f,g){function h(a,b,d,e,h){a=f+a;var l=kc.Handlers.get(a);null!==l?a=l.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&("repeat"===e[0]&&(a.wrapS=1E3),"mirror"===e[0]&&(a.wrapS=1002),"repeat"===e[1]&&(a.wrapT=1E3),"mirror"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=R.generateUUID();k[b]=a;return b}var k={},l={uuid:R.generateUUID(),
+type:"MeshLambertMaterial"},m;for(m in e){var n=e[m];switch(m){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":l.name=n;break;case "blending":l.blending=a[n];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",m,"is no longer supported.");break;case "colorDiffuse":l.color=b.fromArray(n).getHex();break;case "colorSpecular":l.specular=b.fromArray(n).getHex();break;case "colorEmissive":l.emissive=b.fromArray(n).getHex();
+break;case "specularCoef":l.shininess=n;break;case "shading":"basic"===n.toLowerCase()&&(l.type="MeshBasicMaterial");"phong"===n.toLowerCase()&&(l.type="MeshPhongMaterial");"standard"===n.toLowerCase()&&(l.type="MeshStandardMaterial");break;case "mapDiffuse":l.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":l.emissiveMap=h(n,e.mapEmissiveRepeat,
+e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":l.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":l.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;
+case "mapBump":l.bumpMap=h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case "mapBumpScale":l.bumpScale=n;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":l.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case "mapNormalFactor":l.normalScale=[n,n];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":l.specularMap=
+h(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":l.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":l.roughnessMap=h(n,e.mapRoughnessRepeat,
+e.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":l.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":l.side=1;break;case "doubleSided":l.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");
+l.opacity=n;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":l[m]=n;break;case "vertexColors":!0===n&&(l.vertexColors=2);"face"===n&&(l.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",m,n)}}"MeshBasicMaterial"===l.type&&delete l.emissive;"MeshPhongMaterial"!==l.type&&delete l.specular;1>l.opacity&&(l.transparent=!0);d.setTextures(k);return d.parse(l)}}()});Object.assign(be.prototype,
+{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:kc.prototype.extractUrlBase(a),g=new Ja(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");
+return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new N,d=a,e,f,g,h=d.faces;var k=d.vertices;var l=d.normals,m=d.colors;var n=d.scale;var t=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&t++;for(e=0;e<t;e++)c.faceVertexUvs[e]=[]}var r=0;for(g=k.length;r<g;)e=new p,e.x=k[r++]*n,e.y=k[r++]*n,e.z=k[r++]*n,c.vertices.push(e);
+r=0;for(g=h.length;r<g;){k=h[r++];var u=k&1;var v=k&2;e=k&8;var w=k&16;var x=k&32;n=k&64;k&=128;if(u){u=new Pa;u.a=h[r];u.b=h[r+1];u.c=h[r+3];var z=new Pa;z.a=h[r+1];z.b=h[r+2];z.c=h[r+3];r+=4;v&&(v=h[r++],u.materialIndex=v,z.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++){var y=d.uvs[e];c.faceVertexUvs[e][v]=[];c.faceVertexUvs[e][v+1]=[];for(f=0;4>f;f++){var B=h[r++];var A=y[2*B];B=y[2*B+1];A=new C(A,B);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}w&&(w=3*
+h[r++],u.normal.set(l[w++],l[w++],l[w]),z.normal.copy(u.normal));if(x)for(e=0;4>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),2!==e&&u.vertexNormals.push(x),0!==e&&z.vertexNormals.push(x);n&&(n=h[r++],n=m[n],u.color.setHex(n),z.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[r++],n=m[n],2!==e&&u.vertexColors.push(new H(n)),0!==e&&z.vertexColors.push(new H(n));c.faces.push(u);c.faces.push(z)}else{u=new Pa;u.a=h[r++];u.b=h[r++];u.c=h[r++];v&&(v=h[r++],u.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++)for(y=
+d.uvs[e],c.faceVertexUvs[e][v]=[],f=0;3>f;f++)B=h[r++],A=y[2*B],B=y[2*B+1],A=new C(A,B),c.faceVertexUvs[e][v].push(A);w&&(w=3*h[r++],u.normal.set(l[w++],l[w++],l[w]));if(x)for(e=0;3>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),u.vertexNormals.push(x);n&&(n=h[r++],u.color.setHex(m[n]));if(k)for(e=0;3>e;e++)n=h[r++],u.vertexColors.push(new H(m[n]));c.faces.push(u)}}d=a;r=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g<h;g+=r)c.skinWeights.push(new da(d.skinWeights[g],
+1<r?d.skinWeights[g+1]:0,2<r?d.skinWeights[g+2]:0,3<r?d.skinWeights[g+3]:0));if(d.skinIndices)for(g=0,h=d.skinIndices.length;g<h;g+=r)c.skinIndices.push(new da(d.skinIndices[g],1<r?d.skinIndices[g+1]:0,2<r?d.skinIndices[g+2]:0,3<r?d.skinIndices[g+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+
+c.skinWeights.length+") should match.");g=a;h=g.scale;if(void 0!==g.morphTargets)for(d=0,r=g.morphTargets.length;d<r;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=g.morphTargets[d].name,c.morphTargets[d].vertices=[],l=c.morphTargets[d].vertices,m=g.morphTargets[d].vertices,t=0,k=m.length;t<k;t+=3)n=new p,n.x=m[t]*h,n.y=m[t+1]*h,n.z=m[t+2]*h,l.push(n);if(void 0!==g.morphColors&&0<g.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),
+h=c.faces,g=g.morphColors[0].colors,d=0,r=h.length;d<r;d++)h[d].color.fromArray(g,3*d);g=a;d=[];r=[];void 0!==g.animation&&r.push(g.animation);void 0!==g.animations&&(g.animations.length?r=r.concat(g.animations):r.push(g.animations));for(g=0;g<r.length;g++)(h=ka.parseAnimation(r[g],c.bones))&&d.push(h);c.morphTargets&&(r=ka.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(r));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===
+a.materials.length)return{geometry:c};a=kc.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:a}}}()});Object.assign(Re.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ja(e.manager)).load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error("THREE:ObjectLoader: Can't parse "+a+".",h.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?
+console.error("THREE.ObjectLoader: Can't load "+a+". Use THREE.JSONLoader instead."):e.parse(f,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&
+0!==a.images.length||void 0===b||b(e);return e},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new be,d=new ae,e=0,f=a.length;e<f;e++){var g=a[e];switch(g.type){case "PlaneGeometry":case "PlaneBufferGeometry":var h=new Ca[g.type](g.width,g.height,g.widthSegments,g.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":h=new Ca[g.type](g.width,g.height,g.depth,g.widthSegments,g.heightSegments,g.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":h=
+new Ca[g.type](g.radius,g.segments,g.thetaStart,g.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":h=new Ca[g.type](g.radiusTop,g.radiusBottom,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":h=new Ca[g.type](g.radius,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":h=new Ca[g.type](g.radius,g.widthSegments,
+g.heightSegments,g.phiStart,g.phiLength,g.thetaStart,g.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":h=new Ca[g.type](g.radius,g.detail);break;case "RingGeometry":case "RingBufferGeometry":h=new Ca[g.type](g.innerRadius,g.outerRadius,g.thetaSegments,g.phiSegments,g.thetaStart,g.thetaLength);
+break;case "TorusGeometry":case "TorusBufferGeometry":h=new Ca[g.type](g.radius,g.tube,g.radialSegments,g.tubularSegments,g.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":h=new Ca[g.type](g.radius,g.tube,g.tubularSegments,g.radialSegments,g.p,g.q);break;case "LatheGeometry":case "LatheBufferGeometry":h=new Ca[g.type](g.points,g.segments,g.phiStart,g.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":h=new Ca[g.type](g.vertices,g.indices,g.radius,g.details);
+break;case "BufferGeometry":h=d.parse(g);break;case "Geometry":h=c.parse(g,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+g.type+'"');continue}h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);b[g.uuid]=h}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new Id;d.setTextures(b);b=0;for(var e=a.length;b<e;b++){var f=a[b];if("MultiMaterial"===f.type){for(var g=[],h=0;h<f.materials.length;h++)g.push(d.parse(f.materials[h]));c[f.uuid]=
+g}else c[f.uuid]=d.parse(f)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=ka.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new Yd(b);var f=new Xc(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],k=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?
+h.url:d.texturePath+h.url;e[h.uuid]=c(k)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new ea(b[g.image]);h.needsUpdate=!0;
+h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ug));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],hf),h.wrapT=c(g.wrap[1],hf));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,jf));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,jf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);
+void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new K;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function f(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],c=0,e=a.length;c<e;c++){var f=a[c];void 0===d[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(d[f])}return b}void 0===d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return d[a]}}switch(b.type){case "Scene":var g=
+new od;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new H(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Pb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Ob(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new U(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=
+Object.assign({},b.view));break;case "OrthographicCamera":g=new Kb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new Ad(b.color,b.intensity);break;case "DirectionalLight":g=new zd(b.color,b.intensity);break;case "PointLight":g=new xd(b.color,b.intensity,b.distance,b.decay);break;case "RectAreaLight":g=new Bd(b.color,b.intensity,b.width,b.height);break;case "SpotLight":g=new wd(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new ud(b.color,
+b.groundColor,b.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new qd(g,h):new pa(g,h);break;case "LOD":g=new Dc;break;case "Line":g=new ma(e(b.geometry),f(b.material),b.mode);break;case "LineLoop":g=new rd(e(b.geometry),f(b.material));break;case "LineSegments":g=new ca(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Qb(e(b.geometry),
+f(b.material));break;case "Sprite":g=new Cc(f(b.material));break;case "Group":g=new Fc;break;default:g=new A}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);
+void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=b.userData);if(void 0!==b.children)for(var h=b.children,k=0;k<h.length;k++)g.add(this.parseObject(h[k],
+c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var k=b[h],l=g.getObjectByProperty("uuid",k.object);void 0!==l&&g.addLevel(l,k.distance)}return g}}()});var ug={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},hf={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},jf={NearestFilter:1003,NearestMipMapNearestFilter:1004,
+NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(S.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/
+a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,
+b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=
+[],g=new p,h=new K,k;for(k=0;k<=a;k++){var l=k/a;d[k]=this.getTangentAt(l);d[k].normalize()}e[0]=new p;f[0]=new p;k=Number.MAX_VALUE;l=Math.abs(d[0].x);var m=Math.abs(d[0].y),n=Math.abs(d[0].z);l<=k&&(k=l,c.set(1,0,0));m<=k&&(k=m,c.set(0,1,0));n<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(R.clamp(d[k-
+1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(R.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Ka.prototype=Object.create(S.prototype);
+Ka.prototype.constructor=Ka;Ka.prototype.isLineCurve=!0;Ka.prototype.getPoint=function(a,b){b=b||new C;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ka.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ka.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};Ka.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ab.prototype=Object.assign(Object.create(S.prototype),
+{constructor:Ab,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new Ka(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=
+!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=
+e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){S.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this}});Na.prototype=Object.create(S.prototype);Na.prototype.constructor=Na;Na.prototype.isEllipseCurve=
+!0;Na.prototype.getPoint=function(a,b){b=b||new C;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Na.prototype.copy=function(a){S.prototype.copy.call(this,
+a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ab.prototype=Object.create(S.prototype);ab.prototype.constructor=ab;ab.prototype.isSplineCurve=!0;ab.prototype.getPoint=function(a,b){b=b||new C;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);var d=d-a,e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-2?c.length-1:a+1],c=c[a>c.length-3?c.length-1:a+2];b.set(Se(d,
+e.x,f.x,g.x,c.x),Se(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};bb.prototype=Object.create(S.prototype);bb.prototype.constructor=bb;bb.prototype.isCubicBezierCurve=!0;bb.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(zb(a,c.x,d.x,e.x,f.x),zb(a,c.y,d.y,e.y,f.y));return b};bb.prototype.copy=function(a){S.prototype.copy.call(this,
+a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};cb.prototype=Object.create(S.prototype);cb.prototype.constructor=cb;cb.prototype.isQuadraticBezierCurve=!0;cb.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2;b.set(yb(a,c.x,d.x,e.x),yb(a,c.y,d.y,e.y));return b};cb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};var se=Object.assign(Object.create(Ab.prototype),
+{setFromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Ka(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new cb(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new bb(this.currentPoint.clone(),new C(a,
+b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new ab(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,
+e,f,g,h){a=new Na(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)},copy:function(a){Ab.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this}});Bb.prototype=se;se.constructor=Bb;Cb.prototype=Object.assign(Object.create(se),{constructor:Cb,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),
+holes:this.getPointsHoles(a)}},copy:function(a){Bb.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this}});Object.assign(ce.prototype,{moveTo:function(a,b){this.currentPath=new Bb;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,
+b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Cb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(Math.abs(l)>Number.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=
+a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ha.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Cb;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints()),k=a?!k:k;h=[];var l=[],m=[],n=0;l[n]=void 0;m[n]=[];for(var p=0,r=f.length;p<r;p++){g=f[p];var u=g.getPoints();var v=e(u);(v=a?!v:v)?(!k&&l[n]&&n++,l[n]={s:new Cb,p:u},l[n].s.curves=g.curves,k&&n++,m[n]=[]):m[n].push({h:g,p:u[0]})}if(!l[0])return c(f);if(1<
+l.length){p=!1;a=[];e=0;for(f=l.length;e<f;e++)h[e]=[];e=0;for(f=l.length;e<f;e++)for(g=m[e],v=0;v<g.length;v++){k=g[v];n=!0;for(u=0;u<l.length;u++)d(k.p,l[u].p)&&(e!==u&&a.push({froms:e,tos:u,hole:v}),n?(n=!1,h[u].push(k)):p=!0);n&&h[e].push(k)}0<a.length&&(p||(m=h))}p=0;for(e=l.length;p<e;p++)for(h=l[p].s,b.push(h),a=m[p],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(de.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);void 0===c&&(c=4);var d=this.data;
+a=String(a).split("");var e=b/d.resolution,f=(d.boundingBox.yMax-d.boundingBox.yMin+d.underlineThickness)*e,g=0,h=0;b=[];for(var k=0;k<a.length;k++){var l=a[k];if("\n"===l)g=0,h-=f;else{var m;var n=e;var p=g,r=h;if(l=d.glyphs[l]||d.glyphs["?"]){var u=new ce,v=[];if(l.o)for(var w=l._cachedOutline||(l._cachedOutline=l.o.split(" ")),x=0,y=w.length;x<y;)switch(w[x++]){case "m":var A=w[x++]*n+p;var B=w[x++]*n+r;u.moveTo(A,B);break;case "l":A=w[x++]*n+p;B=w[x++]*n+r;u.lineTo(A,B);break;case "q":var C=w[x++]*
+n+p;var D=w[x++]*n+r;var E=w[x++]*n+p;var H=w[x++]*n+r;u.quadraticCurveTo(E,H,C,D);if(m=v[v.length-1]){var N=m.x;m=m.y;for(var K=1;K<=c;K++){var O=K/c;yb(O,N,E,C);yb(O,m,H,D)}}break;case "b":if(C=w[x++]*n+p,D=w[x++]*n+r,E=w[x++]*n+p,H=w[x++]*n+r,A=w[x++]*n+p,B=w[x++]*n+r,u.bezierCurveTo(E,H,A,B,C,D),m=v[v.length-1])for(N=m.x,m=m.y,K=1;K<=c;K++)O=K/c,zb(O,N,E,A,C),zb(O,m,H,B,D)}n={offsetX:l.ha*n,path:u}}else n=void 0;g+=n.offsetX;b.push(n.path)}}c=[];d=0;for(a=b.length;d<a;d++)Array.prototype.push.apply(c,
+b[d].toShapes());return c}});Object.assign(Te.prototype,{load:function(a,b,c,d){var e=this,f=new Ja(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(k){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new de(a)},setPath:function(a){this.path=a;return this}});var Md,ge={getContext:function(){void 0===Md&&(Md=new (window.AudioContext||
+window.webkitAudioContext));return Md},setContext:function(a){Md=a}};Object.assign(ee.prototype,{load:function(a,b,c,d){var e=new Ja(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){ge.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(Ue.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new K,l=new K;return function(m){if(a!==this||b!==m.focus||c!==m.fov||d!==m.aspect*this.aspect||e!==m.near||f!==m.far||g!==m.zoom||h!==this.eyeSep){a=this;b=m.focus;c=m.fov;
+d=m.aspect*this.aspect;e=m.near;f=m.far;g=m.zoom;var n=m.projectionMatrix.clone();h=this.eyeSep/2;var q=h*e/b,p=e*Math.tan(R.DEG2RAD*c*.5)/g;l.elements[12]=-h;k.elements[12]=h;var u=-p*d+q;var v=p*d+q;n.elements[0]=2*e/(v-u);n.elements[8]=(v+u)/(v-u);this.cameraL.projectionMatrix.copy(n);u=-p*d-q;v=p*d-q;n.elements[0]=2*e/(v-u);n.elements[8]=(v+u)/(v-u);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(m.matrixWorld).multiply(l);this.cameraR.matrixWorld.copy(m.matrixWorld).multiply(k)}}()});
+$c.prototype=Object.create(A.prototype);$c.prototype.constructor=$c;fe.prototype=Object.assign(Object.create(A.prototype),{constructor:fe,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):
+this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new p,b=new Z,c=new p,d=new p;return function(e){A.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,
+this.context.currentTime),e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,
+d.y,d.z,f.x,f.y,f.z))}}()});lc.prototype=Object.assign(Object.create(A.prototype),{constructor:lc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);this.startTime=this.context.currentTime;a.start(this.startTime,this.offset);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return!0===this.isPlaying&&(this.source.stop(),this.offset+=(this.context.currentTime-
+this.startTime)*this.playbackRate,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.offset=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());
+return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},
+setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),
+!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});he.prototype=Object.assign(Object.create(lc.prototype),{constructor:he,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=
+a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new p;return function(b){A.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,
+a.y,a.z)}}()});Object.assign(ie.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(je.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},apply:function(a){var b=
+this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=
+0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){Z.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Ve.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
+c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(na,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new na.Composite(a,b,c):new na(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+
+"$"),b=["material","materials","bones"];return function(c){var d=a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+
+c);return d}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(na.prototype,{_getValue_unavailable:function(){},
+_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=
+a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=
+!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],
+getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=na.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",
+this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",
+this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=
+a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===
+e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,
+this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(na.prototype,{_getValue_unbound:na.prototype.getValue,_setValue_unbound:na.prototype.setValue});Object.assign(We.prototype,
+{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){var m=arguments[k],n=m.uuid,p=d[n];if(void 0===p){p=b++;d[n]=p;a.push(m);for(var n=0,r=h;n!==r;++n)g[n].push(new na(m,e[n],f[n]))}else if(p<c){var u=--c,r=a[u];d[r.uuid]=p;a[p]=r;d[n]=u;a[u]=m;n=0;for(r=h;n!==r;++n){var v=g[n],w=v[p];v[p]=v[u];void 0===w&&(w=new na(m,e[n],f[n]));v[u]=
+w}}else void 0!==a[p]&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,l=c[k];if(void 0!==l&&l>=b){var m=b++,n=a[m];c[n.uuid]=l;a[l]=n;c[k]=m;a[m]=h;h=0;for(k=e;h!==k;++h){var n=d[h],p=
+n[l];n[l]=n[m];n[m]=p}}}this.nCachedObjects_=b},uncache:function(){for(var a,b,c=this._objects,d=c.length,e=this.nCachedObjects_,f=this._indicesByUUID,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){b=arguments[k].uuid;var m=f[b];if(void 0!==m)if(delete f[b],m<e){var n=--e,p=c[n];b=--d;a=c[b];f[p.uuid]=m;c[m]=p;f[a.uuid]=n;c[n]=a;c.pop();for(var p=0,r=h;p!==r;++p){a=g[p];var u=a[b];a[m]=a[n];a[n]=u;a.pop()}}else for(b=--d,a=c[b],f[a.uuid]=m,c[m]=a,c.pop(),p=0,r=h;p!==r;++p)a=g[p],a[m]=
+a[b],a.pop()}this.nCachedObjects_=e},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new na(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=
+f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(Xe.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},
+isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);
+this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},
+setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=
+this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;
+for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],
+b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;
+-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=
+b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ye.prototype,ja.prototype,
+{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===k&&(k={},h[g]=k);for(h=0;h!==e;++h){var l=d[h],m=l.name,n=k[m];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,m));continue}n=new je(na.create(c,m,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n,
+g,m)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,
+c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},
+get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);
+f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var b=a._clip.uuid,c=this._actionsByClip,d=c[b],e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;
+for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=
+e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=
+--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Yc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;
+b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?ka.findByName(c,a):a;a=null!==c?c.uuid:a;var e=this._actionsByClip[a],f=null;if(void 0!==e){f=e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new Xe(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?ka.findByName(c,
+a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;
+b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=
+this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});Jd.prototype.clone=function(){return new Jd(void 0===this.value.clone?this.value:this.value.clone())};ke.prototype=Object.assign(Object.create(D.prototype),
+{constructor:ke,isInstancedBufferGeometry:!0,copy:function(a){D.prototype.copy.call(this,a);this.maxInstancedCount=a.maxInstancedCount;return this},clone:function(){return(new this.constructor).copy(this)}});Object.defineProperties(le.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(le.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*
+this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+
+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(mc.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});
+Object.assign(mc.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+
+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});me.prototype=Object.assign(Object.create(mc.prototype),{constructor:me,isInstancedInterleavedBuffer:!0,copy:function(a){mc.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});ne.prototype=Object.assign(Object.create(P.prototype),{constructor:ne,isInstancedBufferAttribute:!0,
+copy:function(a){P.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(Ze.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):
+console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];oe(a,this,c,b);c.sort($e);return c},intersectObjects:function(a,b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)oe(a[d],this,c,b);c.sort($e);return c}});Object.assign(af.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=
+0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign(bf.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},
+copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(R.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(cf.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},
+copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});ad.prototype=Object.create(A.prototype);ad.prototype.constructor=ad;ad.prototype.isImmediateRenderObject=!0;bd.prototype=Object.create(ca.prototype);bd.prototype.constructor=bd;bd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){var d,e=["a","b","c"];this.object.updateMatrixWorld(!0);
+c.getNormalMatrix(this.object.matrixWorld);var f=this.object.matrixWorld,g=this.geometry.attributes.position;if((d=this.object.geometry)&&d.isGeometry)for(var h=d.vertices,k=d.faces,l=d=0,m=k.length;l<m;l++)for(var n=k[l],p=0,r=n.vertexNormals.length;p<r;p++){var u=n.vertexNormals[p];a.copy(h[n[e[p]]]).applyMatrix4(f);b.copy(u).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);g.setXYZ(d,a.x,a.y,a.z);d+=1;g.setXYZ(d,b.x,b.y,b.z);d+=1}else if(d&&d.isBufferGeometry)for(e=d.attributes.position,
+h=d.attributes.normal,p=d=0,r=e.count;p<r;p++)a.set(e.getX(p),e.getY(p),e.getZ(p)).applyMatrix4(f),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),g.setXYZ(d,a.x,a.y,a.z),d+=1,g.setXYZ(d,b.x,b.y,b.z),d+=1;g.needsUpdate=!0}}();nc.prototype=Object.create(A.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};nc.prototype.update=function(){var a=new p,b=new p;return function(){this.light.updateMatrixWorld();
+var c=this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}();oc.prototype=Object.create(ca.prototype);oc.prototype.constructor=oc;oc.prototype.updateMatrixWorld=function(){var a=new p,b=new K,c=new K;return function(d){var e=
+this.bones,f=this.geometry,g=f.getAttribute("position");c.getInverse(this.root.matrixWorld);for(var h=0,k=0;h<e.length;h++){var l=e[h];l.parent&&l.parent.isBone&&(b.multiplyMatrices(c,l.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k,a.x,a.y,a.z),b.multiplyMatrices(c,l.parent.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k+1,a.x,a.y,a.z),k+=2)}f.getAttribute("position").needsUpdate=!0;A.prototype.updateMatrixWorld.call(this,d)}}();pc.prototype=Object.create(pa.prototype);pc.prototype.constructor=
+pc;pc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};pc.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};qc.prototype=Object.create(A.prototype);qc.prototype.constructor=qc;qc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};qc.prototype.update=function(){var a=.5*this.light.width,b=.5*this.light.height,c=this.line.geometry.attributes.position,
+d=c.array;d[0]=a;d[1]=-b;d[2]=0;d[3]=a;d[4]=b;d[5]=0;d[6]=-a;d[7]=b;d[8]=0;d[9]=-a;d[10]=-b;d[11]=0;d[12]=a;d[13]=-b;d[14]=0;c.needsUpdate=!0;void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)};rc.prototype=Object.create(A.prototype);rc.prototype.constructor=rc;rc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};rc.prototype.update=function(){var a=new p,b=new H,c=new H;return function(){var d=
+this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=d.geometry.getAttribute("color");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}e.needsUpdate=!0}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate())}}();cd.prototype=Object.create(ca.prototype);cd.prototype.constructor=cd;Kd.prototype=Object.create(ca.prototype);Kd.prototype.constructor=Kd;dd.prototype=Object.create(ca.prototype);
+dd.prototype.constructor=dd;dd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<l;k++){var m=f[k],n=m.normal;a.copy(g[m.a]).add(g[m.b]).add(g[m.c]).divideScalar(3).applyMatrix4(d);b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,
+a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();sc.prototype=Object.create(A.prototype);sc.prototype.constructor=sc;sc.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};sc.prototype.update=function(){var a=new p,b=new p,c=new p;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,
+a);this.lightPlane.lookAt(c);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(c);this.targetLine.scale.z=c.length()}}();ed.prototype=Object.create(ca.prototype);ed.prototype.constructor=ed;ed.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),
+h=0,k=a.length;h<k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new p,e=new La;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",
+0,1,-1);b.getAttribute("position").needsUpdate=!0}}();Db.prototype=Object.create(ca.prototype);Db.prototype.constructor=Db;Db.prototype.update=function(){var a=new Oa;return function(b){void 0!==b&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=
+c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Db.prototype.setFromObject=function(a){this.object=a;this.update();return this};fd.prototype=Object.create(ca.prototype);fd.prototype.constructor=fd;fd.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),A.prototype.updateMatrixWorld.call(this,
+a))};gd.prototype=Object.create(ma.prototype);gd.prototype.constructor=gd;gd.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal);A.prototype.updateMatrixWorld.call(this,a)};var Ld,pe;Eb.prototype=Object.create(A.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,
+0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Eb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};hd.prototype=Object.create(ca.prototype);hd.prototype.constructor=hd;var Nd=new p,
+te=new qe,ue=new qe,ve=new qe;ya.prototype=Object.create(S.prototype);ya.prototype.constructor=ya;ya.prototype.isCatmullRomCurve3=!0;ya.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/c.length)+1)*c.length:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Nd.subVectors(c[0],c[1]).add(c[0]),f=Nd;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Nd.subVectors(c[d-
+1],c[d-2]).add(c[d-1]),c=Nd);if("centripetal"===this.curveType||"chordal"===this.curveType){var k="chordal"===this.curveType?.5:.25,d=Math.pow(f.distanceToSquared(g),k),e=Math.pow(g.distanceToSquared(h),k),k=Math.pow(h.distanceToSquared(c),k);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);te.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);ue.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);ve.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(te.initCatmullRom(f.x,g.x,h.x,
+c.x,this.tension),ue.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),ve.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(te.calc(a),ue.calc(a),ve.calc(a));return b};ya.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Fb.prototype=Object.create(S.prototype);Fb.prototype.constructor=Fb;Fb.prototype.isCubicBezierCurve3=
+!0;Fb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(zb(a,c.x,d.x,e.x,f.x),zb(a,c.y,d.y,e.y,f.y),zb(a,c.z,d.z,e.z,f.z));return b};Fb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Gb.prototype=Object.create(S.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isQuadraticBezierCurve3=!0;Gb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,
+e=this.v2;b.set(yb(a,c.x,d.x,e.x),yb(a,c.y,d.y,e.y),yb(a,c.z,d.z,e.z));return b};Gb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};db.prototype=Object.create(S.prototype);db.prototype.constructor=db;db.prototype.isLineCurve3=!0;db.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};db.prototype.getPointAt=function(a,b){return this.getPoint(a,
+b)};db.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};id.prototype=Object.create(Na.prototype);id.prototype.constructor=id;id.prototype.isArcCurve=!0;S.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(S.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(Ab.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
+a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new N,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,
+e.y,e.z||0))}return b}});Object.assign(Bb.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");this.setFromPoints(a)}});ef.prototype=Object.create(ya.prototype);ff.prototype=Object.create(ya.prototype);re.prototype=Object.create(ya.prototype);Object.assign(re.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},
+reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});cd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};oc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(kd.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},
+empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Oa.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},
+empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});
+Mb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(R,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return R.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");
+return R.ceilPowerOfTwo(a)}});Object.assign(ra.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
+return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(K.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;
+return function(){void 0===a&&(a=new p);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");
+return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");
+return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
+return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Aa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};
+Z.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(lb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},
+isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}});Object.assign(Cb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new $a(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");
+return new cc(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});
+Object.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},
 getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,
-b,c){console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(fa.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});J.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(z.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
-return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(z.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
-this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(yc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(zc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},
-set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(ua.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});qa.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");
-void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(na.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");
+b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(da.prototype,{fromAttribute:function(a,
+b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});N.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(A.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
+return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(A.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
+this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(Dc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Ec.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},
+set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(S.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});U.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");
+void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(ga.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");
 this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");
 this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");
-this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(Z.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(E.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,
+this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(P.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(D.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,
 b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});
-Object.defineProperties(E.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Id.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
-return this}}});Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new G}}});Object.defineProperties(Ja.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});
-Object.defineProperties(ra.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Xd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()},
-supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");
-return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},
-supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");
-return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});
-Object.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");
-this.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Cb.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
-this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=
-a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=
-a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");
-return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});hc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new fe).load(a,function(a){b.setBuffer(a)});return this};je.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Db;l.WebGLRenderTarget=
-Cb;l.WebGLRenderer=Xd;l.ShaderLib=$a;l.UniformsLib=R;l.UniformsUtils=Ca;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=ld;l.LensFlare=Yd;l.Sprite=xc;l.LOD=yc;l.SkinnedMesh=nd;l.Skeleton=zc;l.Bone=md;l.Mesh=la;l.LineSegments=Q;l.LineLoop=od;l.Line=sa;l.Points=Kb;l.Group=Ac;l.VideoTexture=pd;l.DataTexture=db;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=qd;l.DepthTexture=Bc;l.Texture=ba;l.CompressedTextureLoader=Oe;l.DataTextureLoader=$d;l.CubeTextureLoader=ae;l.TextureLoader=rd;l.ObjectLoader=
-Pe;l.MaterialLoader=Gd;l.BufferGeometryLoader=be;l.DefaultLoadingManager=va;l.LoadingManager=Zd;l.JSONLoader=ce;l.ImageLoader=Sc;l.FontLoader=Re;l.FileLoader=Ka;l.Loader=ec;l.Cache=ed;l.AudioLoader=fe;l.SpotLightShadow=td;l.SpotLight=ud;l.PointLight=vd;l.RectAreaLight=zd;l.HemisphereLight=sd;l.DirectionalLightShadow=wd;l.DirectionalLight=xd;l.AmbientLight=yd;l.LightShadow=tb;l.Light=na;l.StereoCamera=Se;l.PerspectiveCamera=qa;l.OrthographicCamera=Fb;l.CubeCamera=Hd;l.ArrayCamera=kd;l.Camera=Na;l.AudioListener=
-ge;l.PositionalAudio=ie;l.AudioContext=he;l.AudioAnalyser=je;l.Audio=hc;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=Dd;l.QuaternionKeyframeTrack=Uc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=Fd;l.BooleanKeyframeTrack=Ed;l.PropertyMixer=ke;l.PropertyBinding=ha;l.KeyframeTrack=vb;l.AnimationUtils=ia;l.AnimationObjectGroup=Ue;l.AnimationMixer=We;l.AnimationClip=Da;l.Uniform=Id;l.InstancedBufferGeometry=le;l.BufferGeometry=E;l.GeometryIdCount=function(){return Rd++};l.Geometry=J;l.InterleavedBufferAttribute=
-me;l.InstancedInterleavedBuffer=ne;l.InterleavedBuffer=ic;l.InstancedBufferAttribute=oe;l.Face3=Sa;l.Object3D=z;l.Raycaster=Xe;l.Layers=Qd;l.EventDispatcher=xa;l.Clock=Ze;l.QuaternionLinearInterpolant=Cd;l.LinearInterpolant=Tc;l.DiscreteInterpolant=Bd;l.CubicInterpolant=Ad;l.Interpolant=wa;l.Triangle=Ta;l.Math=Y;l.Spherical=$e;l.Cylindrical=af;l.Plane=Aa;l.Frustum=gd;l.Sphere=Ea;l.Ray=kb;l.Matrix4=K;l.Matrix3=Ba;l.Box3=Ra;l.Box2=fd;l.Line3=Hb;l.Euler=ab;l.Vector4=fa;l.Vector3=n;l.Vector2=C;l.Quaternion=
-oa;l.Color=G;l.MorphBlendMesh=ta;l.ImmediateRenderObject=Xc;l.VertexNormalsHelper=Yc;l.SpotLightHelper=jc;l.SkeletonHelper=kc;l.PointLightHelper=lc;l.RectAreaLightHelper=mc;l.HemisphereLightHelper=nc;l.GridHelper=Zc;l.PolarGridHelper=Jd;l.FaceNormalsHelper=$c;l.DirectionalLightHelper=oc;l.CameraHelper=ad;l.BoxHelper=Ab;l.ArrowHelper=Bb;l.AxisHelper=Ld;l.CatmullRomCurve3=La;l.CubicBezierCurve3=bd;l.QuadraticBezierCurve3=cd;l.LineCurve3=dd;l.ArcCurve=Md;l.EllipseCurve=Va;l.SplineCurve=yb;l.CubicBezierCurve=
-fc;l.QuadraticBezierCurve=gc;l.LineCurve=Qa;l.Shape=zb;l.Path=Wc;l.ShapePath=de;l.Font=ee;l.CurvePath=Vc;l.Curve=ua;l.ShapeUtils=Ia;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Ac,d=0,e=b.length;d<e;d++)c.add(new la(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){a.applyMatrix((new K).getInverse(c.matrixWorld));b.remove(a);c.add(a)}};l.WireframeGeometry=Mb;l.ParametricGeometry=Cc;l.ParametricBufferGeometry=
-Nb;l.TetrahedronGeometry=Ec;l.TetrahedronBufferGeometry=Ob;l.OctahedronGeometry=Fc;l.OctahedronBufferGeometry=lb;l.IcosahedronGeometry=Gc;l.IcosahedronBufferGeometry=Pb;l.DodecahedronGeometry=Hc;l.DodecahedronBufferGeometry=Qb;l.PolyhedronGeometry=Dc;l.PolyhedronBufferGeometry=za;l.TubeGeometry=Ic;l.TubeBufferGeometry=Rb;l.TorusKnotGeometry=Jc;l.TorusKnotBufferGeometry=Sb;l.TorusGeometry=Kc;l.TorusBufferGeometry=Tb;l.TextGeometry=Lc;l.TextBufferGeometry=Ub;l.SphereGeometry=Mc;l.SphereBufferGeometry=
-mb;l.RingGeometry=Nc;l.RingBufferGeometry=Vb;l.PlaneGeometry=vc;l.PlaneBufferGeometry=jb;l.LatheGeometry=Oc;l.LatheBufferGeometry=Wb;l.ShapeGeometry=Xb;l.ShapeBufferGeometry=Yb;l.ExtrudeGeometry=cb;l.ExtrudeBufferGeometry=Ga;l.EdgesGeometry=Zb;l.ConeGeometry=Pc;l.ConeBufferGeometry=Qc;l.CylinderGeometry=nb;l.CylinderBufferGeometry=Ua;l.CircleGeometry=Rc;l.CircleBufferGeometry=$b;l.BoxGeometry=Gb;l.BoxBufferGeometry=ib;l.ShadowMaterial=ac;l.SpriteMaterial=bb;l.RawShaderMaterial=bc;l.ShaderMaterial=
-ra;l.PointsMaterial=Fa;l.MeshPhysicalMaterial=ob;l.MeshStandardMaterial=Pa;l.MeshPhongMaterial=Ja;l.MeshToonMaterial=pb;l.MeshNormalMaterial=qb;l.MeshLambertMaterial=rb;l.MeshDepthMaterial=Za;l.MeshBasicMaterial=ya;l.LineDashedMaterial=sb;l.LineBasicMaterial=ea;l.Material=U;l.Float64BufferAttribute=uc;l.Float32BufferAttribute=B;l.Uint32BufferAttribute=hb;l.Int32BufferAttribute=tc;l.Uint16BufferAttribute=gb;l.Int16BufferAttribute=sc;l.Uint8ClampedBufferAttribute=rc;l.Uint8BufferAttribute=qc;l.Int8BufferAttribute=
-pc;l.BufferAttribute=Z;l.REVISION="86";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=2;l.NoColors=0;l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.AddEquation=
-100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=
-0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.NearestFilter=1003;l.NearestMipMapNearestFilter=
-1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=
-1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=2001;l.RGBA_S3TC_DXT1_Format=2002;l.RGBA_S3TC_DXT3_Format=2003;l.RGBA_S3TC_DXT5_Format=2004;l.RGB_PVRTC_4BPPV1_Format=2100;l.RGB_PVRTC_2BPPV1_Format=2101;l.RGBA_PVRTC_4BPPV1_Format=2102;l.RGBA_PVRTC_2BPPV1_Format=2103;l.RGB_ETC1_Format=2151;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=
-2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=Gb;l.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Sa(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=
-function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};l.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};l.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Kb(a,b)};l.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");
-return new xc(a)};l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Kb(a,b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Fa(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Fa(a)};l.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");
-return new Fa(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new n(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new Z(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new pc(a,b)};l.Uint8Attribute=
-function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new qc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new rc(a,b)};l.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new sc(a,b)};l.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");
-return new gb(a,b)};l.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new tc(a,b)};l.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new hb(a,b)};l.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");return new B(a,b)};l.Float64Attribute=
-function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new uc(a,b)};l.ClosedSplineCurve3=cf;l.SplineCurve3=df;l.Spline=se;l.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new Ab(a,b)};l.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new Q(new Zb(a.geometry),new ea({color:void 0!==
-b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new Q(new Mb(a.geometry),new ea({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ka(a)};l.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new $d(a)};l.GeometryUtils={merge:function(a,b,
-c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var d;b.isMesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");
-var e=new rd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new ae;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};
-l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");
-this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(l,"__esModule",{value:!0})});
-
-},{}],181:[function(require,module,exports){
+Object.defineProperties(D.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Jd.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
+return this}}});Object.defineProperties(Q.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new H}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");
+this.flatShading=1===a}}});Object.defineProperties(Ia.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(oa.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},
+set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Wd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");
+return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");
+return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},
+supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
+return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
+addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});Object.defineProperties(Wd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");
+this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Hb.prototype,
+{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");
+return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");
+return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},
+set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");
+this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});lc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new ee).load(a,function(a){b.setBuffer(a)});return this};
+ie.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};$c.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};m.WebGLRenderTargetCube=Ib;m.WebGLRenderTarget=Hb;m.WebGLRenderer=Wd;m.ShaderLib=mb;m.UniformsLib=E;m.UniformsUtils=Ea;m.ShaderChunk=W;m.FogExp2=Ob;m.Fog=Pb;m.Scene=od;m.LensFlare=Xd;m.Sprite=Cc;m.LOD=Dc;m.SkinnedMesh=qd;m.Skeleton=
+Ec;m.Bone=pd;m.Mesh=pa;m.LineSegments=ca;m.LineLoop=rd;m.Line=ma;m.Points=Qb;m.Group=Fc;m.VideoTexture=sd;m.DataTexture=fb;m.CompressedTexture=Rb;m.CubeTexture=Ua;m.CanvasTexture=tc;m.DepthTexture=Gc;m.Texture=ea;m.CompressedTextureLoader=Qe;m.DataTextureLoader=Zd;m.CubeTextureLoader=$d;m.TextureLoader=td;m.ObjectLoader=Re;m.MaterialLoader=Id;m.BufferGeometryLoader=ae;m.DefaultLoadingManager=wa;m.LoadingManager=Yd;m.JSONLoader=be;m.ImageLoader=Xc;m.FontLoader=Te;m.FileLoader=Ja;m.Loader=kc;m.Cache=
+jd;m.AudioLoader=ee;m.SpotLightShadow=vd;m.SpotLight=wd;m.PointLight=xd;m.RectAreaLight=Bd;m.HemisphereLight=ud;m.DirectionalLightShadow=yd;m.DirectionalLight=zd;m.AmbientLight=Ad;m.LightShadow=vb;m.Light=ga;m.StereoCamera=Ue;m.PerspectiveCamera=U;m.OrthographicCamera=Kb;m.CubeCamera=$c;m.ArrayCamera=nd;m.Camera=La;m.AudioListener=fe;m.PositionalAudio=he;m.AudioContext=ge;m.AudioAnalyser=ie;m.Audio=lc;m.VectorKeyframeTrack=ic;m.StringKeyframeTrack=Fd;m.QuaternionKeyframeTrack=Zc;m.NumberKeyframeTrack=
+jc;m.ColorKeyframeTrack=Hd;m.BooleanKeyframeTrack=Gd;m.PropertyMixer=je;m.PropertyBinding=na;m.KeyframeTrack=xb;m.AnimationUtils=T;m.AnimationObjectGroup=We;m.AnimationMixer=Ye;m.AnimationClip=ka;m.Uniform=Jd;m.InstancedBufferGeometry=ke;m.BufferGeometry=D;m.Geometry=N;m.InterleavedBufferAttribute=le;m.InstancedInterleavedBuffer=me;m.InterleavedBuffer=mc;m.InstancedBufferAttribute=ne;m.Face3=Pa;m.Object3D=A;m.Raycaster=Ze;m.Layers=Pd;m.EventDispatcher=ja;m.Clock=af;m.QuaternionLinearInterpolant=Ed;
+m.LinearInterpolant=Yc;m.DiscreteInterpolant=Dd;m.CubicInterpolant=Cd;m.Interpolant=xa;m.Triangle=Qa;m.Math=R;m.Spherical=bf;m.Cylindrical=cf;m.Plane=Aa;m.Frustum=ld;m.Sphere=Da;m.Ray=lb;m.Matrix4=K;m.Matrix3=ra;m.Box3=Oa;m.Box2=kd;m.Line3=Mb;m.Euler=Ya;m.Vector4=da;m.Vector3=p;m.Vector2=C;m.Quaternion=Z;m.Color=H;m.ImmediateRenderObject=ad;m.VertexNormalsHelper=bd;m.SpotLightHelper=nc;m.SkeletonHelper=oc;m.PointLightHelper=pc;m.RectAreaLightHelper=qc;m.HemisphereLightHelper=rc;m.GridHelper=cd;m.PolarGridHelper=
+Kd;m.FaceNormalsHelper=dd;m.DirectionalLightHelper=sc;m.CameraHelper=ed;m.BoxHelper=Db;m.Box3Helper=fd;m.PlaneHelper=gd;m.ArrowHelper=Eb;m.AxesHelper=hd;m.CatmullRomCurve3=ya;m.CubicBezierCurve3=Fb;m.QuadraticBezierCurve3=Gb;m.LineCurve3=db;m.ArcCurve=id;m.EllipseCurve=Na;m.SplineCurve=ab;m.CubicBezierCurve=bb;m.QuadraticBezierCurve=cb;m.LineCurve=Ka;m.Shape=Cb;m.Path=Bb;m.ShapePath=ce;m.Font=de;m.CurvePath=Ab;m.Curve=S;m.ShapeUtils=Ha;m.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=
+new Fc,d=0,e=b.length;d<e;d++)c.add(new pa(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){a.applyMatrix((new K).getInverse(c.matrixWorld));b.remove(a);c.add(a)}};m.WebGLUtils=Pe;m.WireframeGeometry=Sb;m.ParametricGeometry=Hc;m.ParametricBufferGeometry=Tb;m.TetrahedronGeometry=Jc;m.TetrahedronBufferGeometry=Ub;m.OctahedronGeometry=Kc;m.OctahedronBufferGeometry=nb;m.IcosahedronGeometry=Lc;m.IcosahedronBufferGeometry=Vb;m.DodecahedronGeometry=
+Mc;m.DodecahedronBufferGeometry=Wb;m.PolyhedronGeometry=Ic;m.PolyhedronBufferGeometry=qa;m.TubeGeometry=Nc;m.TubeBufferGeometry=Xb;m.TorusKnotGeometry=Oc;m.TorusKnotBufferGeometry=Yb;m.TorusGeometry=Pc;m.TorusBufferGeometry=Zb;m.TextGeometry=Qc;m.TextBufferGeometry=$b;m.SphereGeometry=Rc;m.SphereBufferGeometry=ob;m.RingGeometry=Sc;m.RingBufferGeometry=ac;m.PlaneGeometry=Ac;m.PlaneBufferGeometry=kb;m.LatheGeometry=Tc;m.LatheBufferGeometry=bc;m.ShapeGeometry=cc;m.ShapeBufferGeometry=dc;m.ExtrudeGeometry=
+$a;m.ExtrudeBufferGeometry=Ga;m.EdgesGeometry=ec;m.ConeGeometry=Uc;m.ConeBufferGeometry=Vc;m.CylinderGeometry=pb;m.CylinderBufferGeometry=Sa;m.CircleGeometry=Wc;m.CircleBufferGeometry=fc;m.BoxGeometry=Lb;m.BoxBufferGeometry=jb;m.ShadowMaterial=gc;m.SpriteMaterial=Za;m.RawShaderMaterial=hc;m.ShaderMaterial=oa;m.PointsMaterial=Ba;m.MeshPhysicalMaterial=qb;m.MeshStandardMaterial=Ma;m.MeshPhongMaterial=Ia;m.MeshToonMaterial=rb;m.MeshNormalMaterial=sb;m.MeshLambertMaterial=tb;m.MeshDepthMaterial=Wa;m.MeshDistanceMaterial=
+Xa;m.MeshBasicMaterial=va;m.LineDashedMaterial=ub;m.LineBasicMaterial=O;m.Material=Q;m.Float64BufferAttribute=zc;m.Float32BufferAttribute=y;m.Uint32BufferAttribute=ib;m.Int32BufferAttribute=yc;m.Uint16BufferAttribute=hb;m.Int16BufferAttribute=xc;m.Uint8ClampedBufferAttribute=wc;m.Uint8BufferAttribute=vc;m.Int8BufferAttribute=uc;m.BufferAttribute=P;m.REVISION="88";m.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};m.CullFaceNone=0;m.CullFaceBack=1;m.CullFaceFront=2;m.CullFaceFrontBack=3;m.FrontFaceDirectionCW=0;m.FrontFaceDirectionCCW=
+1;m.BasicShadowMap=0;m.PCFShadowMap=1;m.PCFSoftShadowMap=2;m.FrontSide=0;m.BackSide=1;m.DoubleSide=2;m.FlatShading=1;m.SmoothShading=2;m.NoColors=0;m.FaceColors=1;m.VertexColors=2;m.NoBlending=0;m.NormalBlending=1;m.AdditiveBlending=2;m.SubtractiveBlending=3;m.MultiplyBlending=4;m.CustomBlending=5;m.AddEquation=100;m.SubtractEquation=101;m.ReverseSubtractEquation=102;m.MinEquation=103;m.MaxEquation=104;m.ZeroFactor=200;m.OneFactor=201;m.SrcColorFactor=202;m.OneMinusSrcColorFactor=203;m.SrcAlphaFactor=
+204;m.OneMinusSrcAlphaFactor=205;m.DstAlphaFactor=206;m.OneMinusDstAlphaFactor=207;m.DstColorFactor=208;m.OneMinusDstColorFactor=209;m.SrcAlphaSaturateFactor=210;m.NeverDepth=0;m.AlwaysDepth=1;m.LessDepth=2;m.LessEqualDepth=3;m.EqualDepth=4;m.GreaterEqualDepth=5;m.GreaterDepth=6;m.NotEqualDepth=7;m.MultiplyOperation=0;m.MixOperation=1;m.AddOperation=2;m.NoToneMapping=0;m.LinearToneMapping=1;m.ReinhardToneMapping=2;m.Uncharted2ToneMapping=3;m.CineonToneMapping=4;m.UVMapping=300;m.CubeReflectionMapping=
+301;m.CubeRefractionMapping=302;m.EquirectangularReflectionMapping=303;m.EquirectangularRefractionMapping=304;m.SphericalReflectionMapping=305;m.CubeUVReflectionMapping=306;m.CubeUVRefractionMapping=307;m.RepeatWrapping=1E3;m.ClampToEdgeWrapping=1001;m.MirroredRepeatWrapping=1002;m.NearestFilter=1003;m.NearestMipMapNearestFilter=1004;m.NearestMipMapLinearFilter=1005;m.LinearFilter=1006;m.LinearMipMapNearestFilter=1007;m.LinearMipMapLinearFilter=1008;m.UnsignedByteType=1009;m.ByteType=1010;m.ShortType=
+1011;m.UnsignedShortType=1012;m.IntType=1013;m.UnsignedIntType=1014;m.FloatType=1015;m.HalfFloatType=1016;m.UnsignedShort4444Type=1017;m.UnsignedShort5551Type=1018;m.UnsignedShort565Type=1019;m.UnsignedInt248Type=1020;m.AlphaFormat=1021;m.RGBFormat=1022;m.RGBAFormat=1023;m.LuminanceFormat=1024;m.LuminanceAlphaFormat=1025;m.RGBEFormat=1023;m.DepthFormat=1026;m.DepthStencilFormat=1027;m.RGB_S3TC_DXT1_Format=2001;m.RGBA_S3TC_DXT1_Format=2002;m.RGBA_S3TC_DXT3_Format=2003;m.RGBA_S3TC_DXT5_Format=2004;
+m.RGB_PVRTC_4BPPV1_Format=2100;m.RGB_PVRTC_2BPPV1_Format=2101;m.RGBA_PVRTC_4BPPV1_Format=2102;m.RGBA_PVRTC_2BPPV1_Format=2103;m.RGB_ETC1_Format=2151;m.LoopOnce=2200;m.LoopRepeat=2201;m.LoopPingPong=2202;m.InterpolateDiscrete=2300;m.InterpolateLinear=2301;m.InterpolateSmooth=2302;m.ZeroCurvatureEnding=2400;m.ZeroSlopeEnding=2401;m.WrapAroundEnding=2402;m.TrianglesDrawMode=0;m.TriangleStripDrawMode=1;m.TriangleFanDrawMode=2;m.LinearEncoding=3E3;m.sRGBEncoding=3001;m.GammaEncoding=3007;m.RGBEEncoding=
+3002;m.LogLuvEncoding=3003;m.RGBM7Encoding=3004;m.RGBM16Encoding=3005;m.RGBDEncoding=3006;m.BasicDepthPacking=3200;m.RGBADepthPacking=3201;m.CubeGeometry=Lb;m.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Pa(a,b,c,e,f,g)};m.LineStrip=0;m.LinePieces=1;m.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};m.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
+a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};m.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Qb(a,b)};m.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Cc(a)};m.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Qb(a,b)};m.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");
+return new Ba(a)};m.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Ba(a)};m.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Ba(a)};m.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};m.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");
+return(new P(a,b)).setDynamic(!0)};m.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new uc(a,b)};m.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new vc(a,b)};m.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new wc(a,
+b)};m.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new xc(a,b)};m.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new hb(a,b)};m.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new yc(a,b)};m.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");
+return new ib(a,b)};m.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");return new y(a,b)};m.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new zc(a,b)};m.ClosedSplineCurve3=ef;m.SplineCurve3=ff;m.Spline=re;m.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new hd(a)};
+m.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new Db(a,b)};m.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new ca(new ec(a.geometry),new O({color:void 0!==b?b:16777215}))};m.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new ca(new Sb(a.geometry),new O({color:void 0!==
+b?b:16777215}))};m.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ja(a)};m.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new Zd(a)};m.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();
+var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};m.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new td;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");
+var e=new $d;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};m.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=
+function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};m.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml",
+"canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(m,"__esModule",{value:!0})});
+
+},{}],232:[function(require,module,exports){
 'use strict';
 
 module.exports = TinyQueue;
@@ -14713,7 +16939,7 @@ TinyQueue.prototype = {
     }
 };
 
-},{}],182:[function(require,module,exports){
+},{}],233:[function(require,module,exports){
 //     Underscore.js 1.8.3
 //     http://underscorejs.org
 //     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
@@ -16263,22 +18489,22 @@ TinyQueue.prototype = {
   }
 }.call(this));
 
-},{}],183:[function(require,module,exports){
+},{}],234:[function(require,module,exports){
 var createElement = require("./vdom/create-element.js")
 
 module.exports = createElement
 
-},{"./vdom/create-element.js":189}],184:[function(require,module,exports){
+},{"./vdom/create-element.js":240}],235:[function(require,module,exports){
 var diff = require("./vtree/diff.js")
 
 module.exports = diff
 
-},{"./vtree/diff.js":209}],185:[function(require,module,exports){
+},{"./vtree/diff.js":260}],236:[function(require,module,exports){
 var h = require("./virtual-hyperscript/index.js")
 
 module.exports = h
 
-},{"./virtual-hyperscript/index.js":196}],186:[function(require,module,exports){
+},{"./virtual-hyperscript/index.js":247}],237:[function(require,module,exports){
 var diff = require("./diff.js")
 var patch = require("./patch.js")
 var h = require("./h.js")
@@ -16295,12 +18521,12 @@ module.exports = {
     VText: VText
 }
 
-},{"./create-element.js":183,"./diff.js":184,"./h.js":185,"./patch.js":187,"./vnode/vnode.js":205,"./vnode/vtext.js":207}],187:[function(require,module,exports){
+},{"./create-element.js":234,"./diff.js":235,"./h.js":236,"./patch.js":238,"./vnode/vnode.js":256,"./vnode/vtext.js":258}],238:[function(require,module,exports){
 var patch = require("./vdom/patch.js")
 
 module.exports = patch
 
-},{"./vdom/patch.js":192}],188:[function(require,module,exports){
+},{"./vdom/patch.js":243}],239:[function(require,module,exports){
 var isObject = require("is-object")
 var isHook = require("../vnode/is-vhook.js")
 
@@ -16399,7 +18625,7 @@ function getPrototype(value) {
     }
 }
 
-},{"../vnode/is-vhook.js":200,"is-object":20}],189:[function(require,module,exports){
+},{"../vnode/is-vhook.js":251,"is-object":20}],240:[function(require,module,exports){
 var document = require("global/document")
 
 var applyProperties = require("./apply-properties")
@@ -16447,7 +18673,7 @@ function createElement(vnode, opts) {
     return node
 }
 
-},{"../vnode/handle-thunk.js":198,"../vnode/is-vnode.js":201,"../vnode/is-vtext.js":202,"../vnode/is-widget.js":203,"./apply-properties":188,"global/document":16}],190:[function(require,module,exports){
+},{"../vnode/handle-thunk.js":249,"../vnode/is-vnode.js":252,"../vnode/is-vtext.js":253,"../vnode/is-widget.js":254,"./apply-properties":239,"global/document":16}],241:[function(require,module,exports){
 // Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
 // We don't want to read all of the DOM nodes in the tree so we use
 // the in-order tree indexing to eliminate recursion down certain branches.
@@ -16534,7 +18760,7 @@ function ascending(a, b) {
     return a > b ? 1 : -1
 }
 
-},{}],191:[function(require,module,exports){
+},{}],242:[function(require,module,exports){
 var applyProperties = require("./apply-properties")
 
 var isWidget = require("../vnode/is-widget.js")
@@ -16687,7 +18913,7 @@ function replaceRoot(oldRoot, newRoot) {
     return newRoot;
 }
 
-},{"../vnode/is-widget.js":203,"../vnode/vpatch.js":206,"./apply-properties":188,"./update-widget":193}],192:[function(require,module,exports){
+},{"../vnode/is-widget.js":254,"../vnode/vpatch.js":257,"./apply-properties":239,"./update-widget":244}],243:[function(require,module,exports){
 var document = require("global/document")
 var isArray = require("x-is-array")
 
@@ -16769,7 +18995,7 @@ function patchIndices(patches) {
     return indices
 }
 
-},{"./create-element":189,"./dom-index":190,"./patch-op":191,"global/document":16,"x-is-array":228}],193:[function(require,module,exports){
+},{"./create-element":240,"./dom-index":241,"./patch-op":242,"global/document":16,"x-is-array":279}],244:[function(require,module,exports){
 var isWidget = require("../vnode/is-widget.js")
 
 module.exports = updateWidget
@@ -16786,7 +19012,7 @@ function updateWidget(a, b) {
     return false
 }
 
-},{"../vnode/is-widget.js":203}],194:[function(require,module,exports){
+},{"../vnode/is-widget.js":254}],245:[function(require,module,exports){
 'use strict';
 
 var EvStore = require('ev-store');
@@ -16815,7 +19041,7 @@ EvHook.prototype.unhook = function(node, propertyName) {
     es[propName] = undefined;
 };
 
-},{"ev-store":9}],195:[function(require,module,exports){
+},{"ev-store":9}],246:[function(require,module,exports){
 'use strict';
 
 module.exports = SoftSetHook;
@@ -16834,7 +19060,7 @@ SoftSetHook.prototype.hook = function (node, propertyName) {
     }
 };
 
-},{}],196:[function(require,module,exports){
+},{}],247:[function(require,module,exports){
 'use strict';
 
 var isArray = require('x-is-array');
@@ -16973,7 +19199,7 @@ function errorString(obj) {
     }
 }
 
-},{"../vnode/is-thunk":199,"../vnode/is-vhook":200,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vnode.js":205,"../vnode/vtext.js":207,"./hooks/ev-hook.js":194,"./hooks/soft-set-hook.js":195,"./parse-tag.js":197,"x-is-array":228}],197:[function(require,module,exports){
+},{"../vnode/is-thunk":250,"../vnode/is-vhook":251,"../vnode/is-vnode":252,"../vnode/is-vtext":253,"../vnode/is-widget":254,"../vnode/vnode.js":256,"../vnode/vtext.js":258,"./hooks/ev-hook.js":245,"./hooks/soft-set-hook.js":246,"./parse-tag.js":248,"x-is-array":279}],248:[function(require,module,exports){
 'use strict';
 
 var split = require('browser-split');
@@ -17029,7 +19255,7 @@ function parseTag(tag, props) {
     return props.namespace ? tagName : tagName.toUpperCase();
 }
 
-},{"browser-split":5}],198:[function(require,module,exports){
+},{"browser-split":5}],249:[function(require,module,exports){
 var isVNode = require("./is-vnode")
 var isVText = require("./is-vtext")
 var isWidget = require("./is-widget")
@@ -17071,14 +19297,14 @@ function renderThunk(thunk, previous) {
     return renderedThunk
 }
 
-},{"./is-thunk":199,"./is-vnode":201,"./is-vtext":202,"./is-widget":203}],199:[function(require,module,exports){
+},{"./is-thunk":250,"./is-vnode":252,"./is-vtext":253,"./is-widget":254}],250:[function(require,module,exports){
 module.exports = isThunk
 
 function isThunk(t) {
     return t && t.type === "Thunk"
 }
 
-},{}],200:[function(require,module,exports){
+},{}],251:[function(require,module,exports){
 module.exports = isHook
 
 function isHook(hook) {
@@ -17087,7 +19313,7 @@ function isHook(hook) {
        typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
 }
 
-},{}],201:[function(require,module,exports){
+},{}],252:[function(require,module,exports){
 var version = require("./version")
 
 module.exports = isVirtualNode
@@ -17096,7 +19322,7 @@ function isVirtualNode(x) {
     return x && x.type === "VirtualNode" && x.version === version
 }
 
-},{"./version":204}],202:[function(require,module,exports){
+},{"./version":255}],253:[function(require,module,exports){
 var version = require("./version")
 
 module.exports = isVirtualText
@@ -17105,17 +19331,17 @@ function isVirtualText(x) {
     return x && x.type === "VirtualText" && x.version === version
 }
 
-},{"./version":204}],203:[function(require,module,exports){
+},{"./version":255}],254:[function(require,module,exports){
 module.exports = isWidget
 
 function isWidget(w) {
     return w && w.type === "Widget"
 }
 
-},{}],204:[function(require,module,exports){
+},{}],255:[function(require,module,exports){
 module.exports = "2"
 
-},{}],205:[function(require,module,exports){
+},{}],256:[function(require,module,exports){
 var version = require("./version")
 var isVNode = require("./is-vnode")
 var isWidget = require("./is-widget")
@@ -17189,7 +19415,7 @@ function VirtualNode(tagName, properties, children, key, namespace) {
 VirtualNode.prototype.version = version
 VirtualNode.prototype.type = "VirtualNode"
 
-},{"./is-thunk":199,"./is-vhook":200,"./is-vnode":201,"./is-widget":203,"./version":204}],206:[function(require,module,exports){
+},{"./is-thunk":250,"./is-vhook":251,"./is-vnode":252,"./is-widget":254,"./version":255}],257:[function(require,module,exports){
 var version = require("./version")
 
 VirtualPatch.NONE = 0
@@ -17213,7 +19439,7 @@ function VirtualPatch(type, vNode, patch) {
 VirtualPatch.prototype.version = version
 VirtualPatch.prototype.type = "VirtualPatch"
 
-},{"./version":204}],207:[function(require,module,exports){
+},{"./version":255}],258:[function(require,module,exports){
 var version = require("./version")
 
 module.exports = VirtualText
@@ -17225,7 +19451,7 @@ function VirtualText(text) {
 VirtualText.prototype.version = version
 VirtualText.prototype.type = "VirtualText"
 
-},{"./version":204}],208:[function(require,module,exports){
+},{"./version":255}],259:[function(require,module,exports){
 var isObject = require("is-object")
 var isHook = require("../vnode/is-vhook")
 
@@ -17285,7 +19511,7 @@ function getPrototype(value) {
   }
 }
 
-},{"../vnode/is-vhook":200,"is-object":20}],209:[function(require,module,exports){
+},{"../vnode/is-vhook":251,"is-object":20}],260:[function(require,module,exports){
 var isArray = require("x-is-array")
 
 var VPatch = require("../vnode/vpatch")
@@ -17714,7 +19940,7 @@ function appendPatch(apply, patch) {
     }
 }
 
-},{"../vnode/handle-thunk":198,"../vnode/is-thunk":199,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vpatch":206,"./diff-props":208,"x-is-array":228}],210:[function(require,module,exports){
+},{"../vnode/handle-thunk":249,"../vnode/is-thunk":250,"../vnode/is-vnode":252,"../vnode/is-vtext":253,"../vnode/is-widget":254,"../vnode/vpatch":257,"./diff-props":259,"x-is-array":279}],261:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17733,7 +19959,7 @@ define(function (require) {
 });
 })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
 
-},{"./Scheduler":211,"./env":223,"./makePromise":225}],211:[function(require,module,exports){
+},{"./Scheduler":262,"./env":274,"./makePromise":276}],262:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17815,7 +20041,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],212:[function(require,module,exports){
+},{}],263:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17843,7 +20069,7 @@ define(function() {
        return TimeoutError;
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-},{}],213:[function(require,module,exports){
+},{}],264:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17900,7 +20126,7 @@ define(function() {
 
 
 
-},{}],214:[function(require,module,exports){
+},{}],265:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18201,7 +20427,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../apply":213,"../state":226}],215:[function(require,module,exports){
+},{"../apply":264,"../state":277}],266:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18363,7 +20589,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],216:[function(require,module,exports){
+},{}],267:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18392,7 +20618,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],217:[function(require,module,exports){
+},{}],268:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18414,7 +20640,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../state":226}],218:[function(require,module,exports){
+},{"../state":277}],269:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18481,7 +20707,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],219:[function(require,module,exports){
+},{}],270:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18507,7 +20733,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],220:[function(require,module,exports){
+},{}],271:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18587,7 +20813,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../TimeoutError":212,"../env":223}],221:[function(require,module,exports){
+},{"../TimeoutError":263,"../env":274}],272:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18675,7 +20901,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../env":223,"../format":224}],222:[function(require,module,exports){
+},{"../env":274,"../format":275}],273:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18715,7 +20941,7 @@ define(function() {
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
 
-},{}],223:[function(require,module,exports){
+},{}],274:[function(require,module,exports){
 (function (process){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
@@ -18793,7 +21019,7 @@ define(function(require) {
 
 }).call(this,require('_process'))
 
-},{"_process":6}],224:[function(require,module,exports){
+},{"_process":6}],275:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18851,7 +21077,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],225:[function(require,module,exports){
+},{}],276:[function(require,module,exports){
 (function (process){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
@@ -19811,7 +22037,7 @@ define(function() {
 
 }).call(this,require('_process'))
 
-},{"_process":6}],226:[function(require,module,exports){
+},{"_process":6}],277:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -19848,7 +22074,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],227:[function(require,module,exports){
+},{}],278:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 
 /**
@@ -20078,7 +22304,7 @@ define(function (require) {
 });
 })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
 
-},{"./lib/Promise":210,"./lib/TimeoutError":212,"./lib/apply":213,"./lib/decorators/array":214,"./lib/decorators/flow":215,"./lib/decorators/fold":216,"./lib/decorators/inspect":217,"./lib/decorators/iterate":218,"./lib/decorators/progress":219,"./lib/decorators/timed":220,"./lib/decorators/unhandledRejection":221,"./lib/decorators/with":222}],228:[function(require,module,exports){
+},{"./lib/Promise":261,"./lib/TimeoutError":263,"./lib/apply":264,"./lib/decorators/array":265,"./lib/decorators/flow":266,"./lib/decorators/fold":267,"./lib/decorators/inspect":268,"./lib/decorators/iterate":269,"./lib/decorators/progress":270,"./lib/decorators/timed":271,"./lib/decorators/unhandledRejection":272,"./lib/decorators/with":273}],279:[function(require,module,exports){
 var nativeIsArray = Array.isArray
 var toString = Object.prototype.toString
 
@@ -20088,7 +22314,7 @@ function isArray(obj) {
     return toString.call(obj) === "[object Array]"
 }
 
-},{}],229:[function(require,module,exports){
+},{}],280:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var APIv3_1 = require("./api/APIv3");
@@ -20096,7 +22322,7 @@ exports.APIv3 = APIv3_1.APIv3;
 var ModelCreator_1 = require("./api/ModelCreator");
 exports.ModelCreator = ModelCreator_1.ModelCreator;
 
-},{"./api/APIv3":242,"./api/ModelCreator":243}],230:[function(require,module,exports){
+},{"./api/APIv3":293,"./api/ModelCreator":294}],281:[function(require,module,exports){
 "use strict";
 function __export(m) {
     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
@@ -20130,6 +22356,8 @@ var ImageComponent_1 = require("./component/ImageComponent");
 exports.ImageComponent = ImageComponent_1.ImageComponent;
 var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent");
 exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent;
+var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler");
+exports.KeyPlayHandler = KeyPlayHandler_1.KeyPlayHandler;
 var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler");
 exports.KeyZoomHandler = KeyZoomHandler_1.KeyZoomHandler;
 var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler");
@@ -20172,6 +22400,8 @@ var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
 exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer;
 var SequenceDOMInteraction_1 = require("./component/sequence/SequenceDOMInteraction");
 exports.SequenceDOMInteraction = SequenceDOMInteraction_1.SequenceDOMInteraction;
+var ControlMode_1 = require("./component/sequence/ControlMode");
+exports.ControlMode = ControlMode_1.ControlMode;
 var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
 exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent;
 var ImagePlaneFactory_1 = require("./component/imageplane/ImagePlaneFactory");
@@ -20248,7 +22478,7 @@ var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
 exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
 __export(require("./component/interfaces/interfaces"));
 
-},{"./component/AttributionComponent":244,"./component/BackgroundComponent":245,"./component/BearingComponent":246,"./component/CacheComponent":247,"./component/Component":248,"./component/ComponentService":249,"./component/CoverComponent":250,"./component/DebugComponent":251,"./component/ImageComponent":252,"./component/LoadingComponent":253,"./component/NavigationComponent":254,"./component/RouteComponent":255,"./component/StatsComponent":256,"./component/direction/DirectionComponent":257,"./component/direction/DirectionDOMCalculator":258,"./component/direction/DirectionDOMRenderer":259,"./component/imageplane/ImagePlaneComponent":260,"./component/imageplane/ImagePlaneFactory":261,"./component/imageplane/ImagePlaneGLRenderer":262,"./component/imageplane/ImagePlaneScene":263,"./component/imageplane/ImagePlaneShaders":264,"./component/imageplane/SliderComponent":265,"./component/interfaces/interfaces":267,"./component/keyboard/KeySequenceNavigationHandler":268,"./component/keyboard/KeySpatialNavigationHandler":269,"./component/keyboard/KeyZoomHandler":270,"./component/keyboard/KeyboardComponent":271,"./component/marker/MarkerComponent":273,"./component/marker/MarkerScene":274,"./component/marker/MarkerSet":275,"./component/marker/marker/CircleMarker":276,"./component/marker/marker/Marker":277,"./component/marker/marker/SimpleMarker":278,"./component/mouse/BounceHandler":279,"./component/mouse/DoubleClickZoomHandler":280,"./component/mouse/DragPanHandler":281,"./component/mouse/MouseComponent":282,"./component/mouse/ScrollZoomHandler":283,"./component/mouse/TouchZoomHandler":284,"./component/popup/PopupComponent":286,"./component/popup/popup/Popup":287,"./component/sequence/SequenceComponent":288,"./component/sequence/SequenceDOMInteraction":289,"./component/sequence/SequenceDOMRenderer":290,"./component/tag/TagComponent":292,"./component/tag/TagCreator":293,"./component/tag/TagDOMRenderer":294,"./component/tag/TagMode":295,"./component/tag/TagOperation":296,"./component/tag/TagScene":297,"./component/tag/TagSet":298,"./component/tag/error/GeometryTagError":299,"./component/tag/geometry/Geometry":300,"./component/tag/geometry/PointGeometry":301,"./component/tag/geometry/PolygonGeometry":302,"./component/tag/geometry/RectGeometry":303,"./component/tag/geometry/VertexGeometry":304,"./component/tag/handlers/CreateHandlerBase":305,"./component/tag/handlers/CreatePointHandler":306,"./component/tag/handlers/CreatePolygonHandler":307,"./component/tag/handlers/CreateRectDragHandler":308,"./component/tag/handlers/CreateRectHandler":309,"./component/tag/handlers/CreateVertexHandler":310,"./component/tag/handlers/EditVertexHandler":311,"./component/tag/handlers/TagHandlerBase":312,"./component/tag/tag/OutlineCreateTag":313,"./component/tag/tag/OutlineRenderTag":314,"./component/tag/tag/OutlineTag":315,"./component/tag/tag/RenderTag":316,"./component/tag/tag/SpotRenderTag":317,"./component/tag/tag/SpotTag":318,"./component/tag/tag/Tag":319,"./component/utils/HandlerBase":320}],231:[function(require,module,exports){
+},{"./component/AttributionComponent":295,"./component/BackgroundComponent":296,"./component/BearingComponent":297,"./component/CacheComponent":298,"./component/Component":299,"./component/ComponentService":300,"./component/CoverComponent":301,"./component/DebugComponent":302,"./component/ImageComponent":303,"./component/LoadingComponent":304,"./component/NavigationComponent":305,"./component/RouteComponent":306,"./component/StatsComponent":307,"./component/direction/DirectionComponent":308,"./component/direction/DirectionDOMCalculator":309,"./component/direction/DirectionDOMRenderer":310,"./component/imageplane/ImagePlaneComponent":311,"./component/imageplane/ImagePlaneFactory":312,"./component/imageplane/ImagePlaneGLRenderer":313,"./component/imageplane/ImagePlaneScene":314,"./component/imageplane/ImagePlaneShaders":315,"./component/imageplane/SliderComponent":316,"./component/interfaces/interfaces":318,"./component/keyboard/KeyPlayHandler":319,"./component/keyboard/KeySequenceNavigationHandler":320,"./component/keyboard/KeySpatialNavigationHandler":321,"./component/keyboard/KeyZoomHandler":322,"./component/keyboard/KeyboardComponent":323,"./component/marker/MarkerComponent":325,"./component/marker/MarkerScene":326,"./component/marker/MarkerSet":327,"./component/marker/marker/CircleMarker":328,"./component/marker/marker/Marker":329,"./component/marker/marker/SimpleMarker":330,"./component/mouse/BounceHandler":331,"./component/mouse/DoubleClickZoomHandler":332,"./component/mouse/DragPanHandler":333,"./component/mouse/MouseComponent":334,"./component/mouse/ScrollZoomHandler":335,"./component/mouse/TouchZoomHandler":336,"./component/popup/PopupComponent":338,"./component/popup/popup/Popup":339,"./component/sequence/ControlMode":340,"./component/sequence/SequenceComponent":341,"./component/sequence/SequenceDOMInteraction":342,"./component/sequence/SequenceDOMRenderer":343,"./component/tag/TagComponent":345,"./component/tag/TagCreator":346,"./component/tag/TagDOMRenderer":347,"./component/tag/TagMode":348,"./component/tag/TagOperation":349,"./component/tag/TagScene":350,"./component/tag/TagSet":351,"./component/tag/error/GeometryTagError":352,"./component/tag/geometry/Geometry":353,"./component/tag/geometry/PointGeometry":354,"./component/tag/geometry/PolygonGeometry":355,"./component/tag/geometry/RectGeometry":356,"./component/tag/geometry/VertexGeometry":357,"./component/tag/handlers/CreateHandlerBase":358,"./component/tag/handlers/CreatePointHandler":359,"./component/tag/handlers/CreatePolygonHandler":360,"./component/tag/handlers/CreateRectDragHandler":361,"./component/tag/handlers/CreateRectHandler":362,"./component/tag/handlers/CreateVertexHandler":363,"./component/tag/handlers/EditVertexHandler":364,"./component/tag/handlers/TagHandlerBase":365,"./component/tag/tag/OutlineCreateTag":366,"./component/tag/tag/OutlineRenderTag":367,"./component/tag/tag/OutlineTag":368,"./component/tag/tag/RenderTag":369,"./component/tag/tag/SpotRenderTag":370,"./component/tag/tag/SpotTag":371,"./component/tag/tag/Tag":372,"./component/utils/HandlerBase":373}],282:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
@@ -20262,7 +22492,7 @@ exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculator
 var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
 exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator;
 
-},{"./graph/edge/EdgeCalculator":338,"./graph/edge/EdgeCalculatorCoefficients":339,"./graph/edge/EdgeCalculatorDirections":340,"./graph/edge/EdgeCalculatorSettings":341,"./graph/edge/EdgeDirection":342}],232:[function(require,module,exports){
+},{"./graph/edge/EdgeCalculator":392,"./graph/edge/EdgeCalculatorCoefficients":393,"./graph/edge/EdgeCalculatorDirections":394,"./graph/edge/EdgeCalculatorSettings":395,"./graph/edge/EdgeDirection":396}],283:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
@@ -20272,7 +22502,7 @@ exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError;
 var MapillaryError_1 = require("./error/MapillaryError");
 exports.MapillaryError = MapillaryError_1.MapillaryError;
 
-},{"./error/ArgumentMapillaryError":321,"./error/GraphMapillaryError":322,"./error/MapillaryError":323}],233:[function(require,module,exports){
+},{"./error/ArgumentMapillaryError":374,"./error/GraphMapillaryError":375,"./error/MapillaryError":376}],284:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Camera_1 = require("./geo/Camera");
@@ -20286,7 +22516,7 @@ exports.Spatial = Spatial_1.Spatial;
 var Transform_1 = require("./geo/Transform");
 exports.Transform = Transform_1.Transform;
 
-},{"./geo/Camera":324,"./geo/GeoCoords":325,"./geo/Spatial":326,"./geo/Transform":327,"./geo/ViewportCoords":328}],234:[function(require,module,exports){
+},{"./geo/Camera":377,"./geo/GeoCoords":378,"./geo/Spatial":379,"./geo/Transform":380,"./geo/ViewportCoords":381}],285:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var FilterCreator_1 = require("./graph/FilterCreator");
@@ -20295,6 +22525,8 @@ var Graph_1 = require("./graph/Graph");
 exports.Graph = Graph_1.Graph;
 var GraphCalculator_1 = require("./graph/GraphCalculator");
 exports.GraphCalculator = GraphCalculator_1.GraphCalculator;
+var GraphMode_1 = require("./graph/GraphMode");
+exports.GraphMode = GraphMode_1.GraphMode;
 var GraphService_1 = require("./graph/GraphService");
 exports.GraphService = GraphService_1.GraphService;
 var ImageLoadingService_1 = require("./graph/ImageLoadingService");
@@ -20308,7 +22540,7 @@ exports.NodeCache = NodeCache_1.NodeCache;
 var Sequence_1 = require("./graph/Sequence");
 exports.Sequence = Sequence_1.Sequence;
 
-},{"./graph/FilterCreator":329,"./graph/Graph":330,"./graph/GraphCalculator":331,"./graph/GraphService":332,"./graph/ImageLoadingService":333,"./graph/MeshReader":334,"./graph/Node":335,"./graph/NodeCache":336,"./graph/Sequence":337}],235:[function(require,module,exports){
+},{"./graph/FilterCreator":382,"./graph/Graph":383,"./graph/GraphCalculator":384,"./graph/GraphMode":385,"./graph/GraphService":386,"./graph/ImageLoadingService":387,"./graph/MeshReader":388,"./graph/Node":389,"./graph/NodeCache":390,"./graph/Sequence":391}],286:[function(require,module,exports){
 "use strict";
 /**
  * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
@@ -20334,7 +22566,7 @@ exports.MarkerComponent = MarkerComponent;
 var PopupComponent = require("./component/popup/Popup");
 exports.PopupComponent = PopupComponent;
 
-},{"./Edge":231,"./Render":236,"./Support":238,"./Viewer":241,"./component/marker/Marker":272,"./component/popup/Popup":285,"./component/tag/Tag":291}],236:[function(require,module,exports){
+},{"./Edge":282,"./Render":287,"./Support":289,"./Viewer":292,"./component/marker/Marker":324,"./component/popup/Popup":337,"./component/tag/Tag":344}],287:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var DOMRenderer_1 = require("./render/DOMRenderer");
@@ -20350,7 +22582,7 @@ exports.RenderMode = RenderMode_1.RenderMode;
 var RenderService_1 = require("./render/RenderService");
 exports.RenderService = RenderService_1.RenderService;
 
-},{"./render/DOMRenderer":343,"./render/GLRenderStage":344,"./render/GLRenderer":345,"./render/RenderCamera":346,"./render/RenderMode":347,"./render/RenderService":348}],237:[function(require,module,exports){
+},{"./render/DOMRenderer":397,"./render/GLRenderStage":398,"./render/GLRenderer":399,"./render/RenderCamera":400,"./render/RenderMode":401,"./render/RenderService":402}],288:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var State_1 = require("./state/State");
@@ -20366,7 +22598,7 @@ exports.TraversingState = TraversingState_1.TraversingState;
 var WaitingState_1 = require("./state/states/WaitingState");
 exports.WaitingState = WaitingState_1.WaitingState;
 
-},{"./state/State":349,"./state/StateContext":350,"./state/StateService":351,"./state/states/StateBase":352,"./state/states/TraversingState":353,"./state/states/WaitingState":354}],238:[function(require,module,exports){
+},{"./state/State":403,"./state/StateContext":404,"./state/StateService":405,"./state/states/StateBase":406,"./state/states/TraversingState":407,"./state/states/WaitingState":408}],289:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var support = require("./utils/Support");
@@ -20405,7 +22637,7 @@ function isFallbackSupported() {
 }
 exports.isFallbackSupported = isFallbackSupported;
 
-},{"./utils/Support":362}],239:[function(require,module,exports){
+},{"./utils/Support":416}],290:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
@@ -20417,7 +22649,7 @@ exports.TextureProvider = TextureProvider_1.TextureProvider;
 var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
 exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator;
 
-},{"./tiles/ImageTileLoader":355,"./tiles/ImageTileStore":356,"./tiles/RegionOfInterestCalculator":357,"./tiles/TextureProvider":358}],240:[function(require,module,exports){
+},{"./tiles/ImageTileLoader":409,"./tiles/ImageTileStore":410,"./tiles/RegionOfInterestCalculator":411,"./tiles/TextureProvider":412}],291:[function(require,module,exports){
 "use strict";
 function __export(m) {
     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
@@ -20433,7 +22665,7 @@ __export(require("./utils/Support"));
 var Urls_1 = require("./utils/Urls");
 exports.Urls = Urls_1.Urls;
 
-},{"./utils/DOM":359,"./utils/EventEmitter":360,"./utils/Settings":361,"./utils/Support":362,"./utils/Urls":363}],241:[function(require,module,exports){
+},{"./utils/DOM":413,"./utils/EventEmitter":414,"./utils/Settings":415,"./utils/Support":416,"./utils/Urls":417}],292:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Alignment_1 = require("./viewer/Alignment");
@@ -20456,6 +22688,8 @@ var MouseService_1 = require("./viewer/MouseService");
 exports.MouseService = MouseService_1.MouseService;
 var Navigator_1 = require("./viewer/Navigator");
 exports.Navigator = Navigator_1.Navigator;
+var PlayService_1 = require("./viewer/PlayService");
+exports.PlayService = PlayService_1.PlayService;
 var Projection_1 = require("./viewer/Projection");
 exports.Projection = Projection_1.Projection;
 var SpriteService_1 = require("./viewer/SpriteService");
@@ -20465,7 +22699,7 @@ exports.TouchService = TouchService_1.TouchService;
 var Viewer_1 = require("./viewer/Viewer");
 exports.Viewer = Viewer_1.Viewer;
 
-},{"./viewer/Alignment":364,"./viewer/CacheService":365,"./viewer/ComponentController":366,"./viewer/Container":367,"./viewer/ImageSize":368,"./viewer/KeyboardService":369,"./viewer/LoadingService":370,"./viewer/MouseService":371,"./viewer/Navigator":372,"./viewer/Observer":373,"./viewer/Projection":374,"./viewer/SpriteService":375,"./viewer/TouchService":376,"./viewer/Viewer":377}],242:[function(require,module,exports){
+},{"./viewer/Alignment":418,"./viewer/CacheService":419,"./viewer/ComponentController":420,"./viewer/Container":421,"./viewer/ImageSize":422,"./viewer/KeyboardService":423,"./viewer/LoadingService":424,"./viewer/MouseService":425,"./viewer/Navigator":426,"./viewer/Observer":427,"./viewer/PlayService":428,"./viewer/Projection":429,"./viewer/SpriteService":430,"./viewer/TouchService":431,"./viewer/Viewer":432}],293:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -20480,7 +22714,7 @@ var API_1 = require("../API");
  *
  * @classdesc Provides methods for access of API v3.
  */
-var APIv3 = (function () {
+var APIv3 = /** @class */ (function () {
     /**
      * Create a new api v3 instance.
      *
@@ -20677,7 +22911,7 @@ var APIv3 = (function () {
 exports.APIv3 = APIv3;
 exports.default = APIv3;
 
-},{"../API":229,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],243:[function(require,module,exports){
+},{"../API":280,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],294:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -20689,7 +22923,7 @@ var Utils_1 = require("../Utils");
  *
  * @classdesc Creates API models.
  */
-var ModelCreator = (function () {
+var ModelCreator = /** @class */ (function () {
     function ModelCreator() {
     }
     /**
@@ -20721,7 +22955,7 @@ var ModelCreator = (function () {
 exports.ModelCreator = ModelCreator;
 exports.default = ModelCreator;
 
-},{"../Utils":240,"falcor":15,"falcor-http-datasource":10}],244:[function(require,module,exports){
+},{"../Utils":291,"falcor":15,"falcor-http-datasource":10}],295:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -20737,7 +22971,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var vd = require("virtual-dom");
 var Component_1 = require("../Component");
-var AttributionComponent = (function (_super) {
+var AttributionComponent = /** @class */ (function (_super) {
     __extends(AttributionComponent, _super);
     function AttributionComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -20756,14 +22990,14 @@ var AttributionComponent = (function (_super) {
     AttributionComponent.prototype._getDefaultConfiguration = function () {
         return {};
     };
-    AttributionComponent.prototype._getAttributionNode = function (username, photoId) {
+    AttributionComponent.prototype._getAttributionNode = function (username, key) {
         return vd.h("div.Attribution", {}, [
             vd.h("a", { href: "https://www.mapillary.com/app/user/" + username,
                 target: "_blank",
                 textContent: "@" + username,
             }, []),
             vd.h("span", { textContent: "|" }, []),
-            vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + photoId + "&focus=photo",
+            vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + key + "&focus=photo",
                 target: "_blank",
                 textContent: "mapillary.com",
             }, []),
@@ -20776,7 +23010,7 @@ exports.AttributionComponent = AttributionComponent;
 Component_1.ComponentService.register(AttributionComponent);
 exports.default = AttributionComponent;
 
-},{"../Component":230,"virtual-dom":186}],245:[function(require,module,exports){
+},{"../Component":281,"virtual-dom":237}],296:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -20792,14 +23026,14 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var vd = require("virtual-dom");
 var Component_1 = require("../Component");
-var BackgroundComponent = (function (_super) {
+var BackgroundComponent = /** @class */ (function (_super) {
     __extends(BackgroundComponent, _super);
     function BackgroundComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
     }
     BackgroundComponent.prototype._activate = function () {
         this._container.domRenderer.render$
-            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given photo.") });
+            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") });
     };
     BackgroundComponent.prototype._deactivate = function () {
         return;
@@ -20820,7 +23054,7 @@ exports.BackgroundComponent = BackgroundComponent;
 Component_1.ComponentService.register(BackgroundComponent);
 exports.default = BackgroundComponent;
 
-},{"../Component":230,"virtual-dom":186}],246:[function(require,module,exports){
+},{"../Component":281,"virtual-dom":237}],297:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -20838,7 +23072,7 @@ var vd = require("virtual-dom");
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../Component");
 var Geo_1 = require("../Geo");
-var BearingComponent = (function (_super) {
+var BearingComponent = /** @class */ (function (_super) {
     __extends(BearingComponent, _super);
     function BearingComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -20857,8 +23091,8 @@ var BearingComponent = (function (_super) {
             var node = frame.state.currentNode;
             var transform = frame.state.currentTransform;
             if (node.pano) {
-                var hFov_1 = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
-                return [_this._spatial.degToRad(node.ca), hFov_1];
+                var panoHFov = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
+                return [_this._spatial.degToRad(node.ca), panoHFov];
             }
             var size = Math.max(transform.basicWidth, transform.basicHeight);
             if (size <= 0) {
@@ -20970,7 +23204,7 @@ exports.BearingComponent = BearingComponent;
 Component_1.ComponentService.register(BearingComponent);
 exports.default = BearingComponent;
 
-},{"../Component":230,"../Geo":233,"rxjs/Observable":29,"virtual-dom":186}],247:[function(require,module,exports){
+},{"../Component":281,"../Geo":284,"rxjs/Observable":29,"virtual-dom":237}],298:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -21002,7 +23236,7 @@ require("rxjs/add/operator/skip");
 require("rxjs/add/operator/switchMap");
 var Edge_1 = require("../Edge");
 var Component_1 = require("../Component");
-var CacheComponent = (function (_super) {
+var CacheComponent = /** @class */ (function (_super) {
     __extends(CacheComponent, _super);
     function CacheComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -21128,7 +23362,7 @@ exports.CacheComponent = CacheComponent;
 Component_1.ComponentService.register(CacheComponent);
 exports.default = CacheComponent;
 
-},{"../Component":230,"../Edge":231,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":76,"rxjs/add/operator/switchMap":80}],248:[function(require,module,exports){
+},{"../Component":281,"../Edge":282,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":77,"rxjs/add/operator/switchMap":81}],299:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -21147,7 +23381,7 @@ require("rxjs/add/operator/publishReplay");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/startWith");
 var Utils_1 = require("../Utils");
-var Component = (function (_super) {
+var Component = /** @class */ (function (_super) {
     __extends(Component, _super);
     function Component(name, container, navigator) {
         var _this = _super.call(this) || this;
@@ -21251,17 +23485,15 @@ var Component = (function (_super) {
 exports.Component = Component;
 exports.default = Component;
 
-},{"../Utils":240,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79}],249:[function(require,module,exports){
+},{"../Utils":291,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80}],300:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var _ = require("underscore");
 var Error_1 = require("../Error");
-var ComponentService = (function () {
+var ComponentService = /** @class */ (function () {
     function ComponentService(container, navigator) {
         this._components = {};
-        this._container = container;
-        this._navigator = navigator;
         for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) {
             var component = _a[_i];
             this._components[component.componentName] = {
@@ -21355,7 +23587,7 @@ var ComponentService = (function () {
 exports.ComponentService = ComponentService;
 exports.default = ComponentService;
 
-},{"../Error":232,"underscore":182}],250:[function(require,module,exports){
+},{"../Error":283,"underscore":233}],301:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21374,7 +23606,7 @@ require("rxjs/add/operator/filter");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/withLatestFrom");
 var Component_1 = require("../Component");
-var CoverComponent = (function (_super) {
+var CoverComponent = /** @class */ (function (_super) {
     __extends(CoverComponent, _super);
     function CoverComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -21444,7 +23676,7 @@ exports.CoverComponent = CoverComponent;
 Component_1.ComponentService.registerCover(CoverComponent);
 exports.default = CoverComponent;
 
-},{"../Component":230,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85,"virtual-dom":186}],251:[function(require,module,exports){
+},{"../Component":281,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":87,"virtual-dom":237}],302:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21463,12 +23695,11 @@ var vd = require("virtual-dom");
 var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
 require("rxjs/add/operator/combineLatest");
 var Component_1 = require("../Component");
-var DebugComponent = (function (_super) {
+var DebugComponent = /** @class */ (function (_super) {
     __extends(DebugComponent, _super);
-    function DebugComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
+    function DebugComponent() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
         _this._open$ = new BehaviorSubject_1.BehaviorSubject(false);
-        _this._displaying = false;
         return _this;
     }
     DebugComponent.prototype._activate = function () {
@@ -21558,7 +23789,7 @@ exports.DebugComponent = DebugComponent;
 Component_1.ComponentService.register(DebugComponent);
 exports.default = DebugComponent;
 
-},{"../Component":230,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,"underscore":182,"virtual-dom":186}],252:[function(require,module,exports){
+},{"../Component":281,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,"underscore":233,"virtual-dom":237}],303:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21577,7 +23808,7 @@ var Observable_1 = require("rxjs/Observable");
 require("rxjs/add/operator/combineLatest");
 var Component_1 = require("../Component");
 var Utils_1 = require("../Utils");
-var ImageComponent = (function (_super) {
+var ImageComponent = /** @class */ (function (_super) {
     __extends(ImageComponent, _super);
     function ImageComponent(name, container, navigator, dom) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -21631,7 +23862,7 @@ exports.ImageComponent = ImageComponent;
 Component_1.ComponentService.register(ImageComponent);
 exports.default = ImageComponent;
 
-},{"../Component":230,"../Utils":240,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"virtual-dom":186}],253:[function(require,module,exports){
+},{"../Component":281,"../Utils":291,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"virtual-dom":237}],304:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21647,9 +23878,10 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var _ = require("underscore");
 var vd = require("virtual-dom");
+var Observable_1 = require("rxjs/Observable");
 require("rxjs/add/operator/combineLatest");
 var Component_1 = require("../Component");
-var LoadingComponent = (function (_super) {
+var LoadingComponent = /** @class */ (function (_super) {
     __extends(LoadingComponent, _super);
     function LoadingComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -21657,10 +23889,12 @@ var LoadingComponent = (function (_super) {
     LoadingComponent.prototype._activate = function () {
         var _this = this;
         this._loadingSubscription = this._navigator.loadingService.loading$
-            .combineLatest(this._navigator.imageLoadingService.loadstatus$, function (loading, loadStatus) {
-            if (!loading) {
-                return { name: "loading", vnode: _this._getBarVNode(100) };
-            }
+            .switchMap(function (loading) {
+            return loading ?
+                _this._navigator.imageLoadingService.loadstatus$ :
+                Observable_1.Observable.of({});
+        })
+            .map(function (loadStatus) {
             var total = 0;
             var loaded = 0;
             for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
@@ -21704,7 +23938,7 @@ exports.LoadingComponent = LoadingComponent;
 Component_1.ComponentService.register(LoadingComponent);
 exports.default = LoadingComponent;
 
-},{"../Component":230,"rxjs/add/operator/combineLatest":53,"underscore":182,"virtual-dom":186}],254:[function(require,module,exports){
+},{"../Component":281,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"underscore":233,"virtual-dom":237}],305:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21731,7 +23965,7 @@ var Component_1 = require("../Component");
  *
  * Replaces the functionality in the Direction and Sequence components.
  */
-var NavigationComponent = (function (_super) {
+var NavigationComponent = /** @class */ (function (_super) {
     __extends(NavigationComponent, _super);
     function NavigationComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -21833,7 +24067,7 @@ exports.NavigationComponent = NavigationComponent;
 Component_1.ComponentService.register(NavigationComponent);
 exports.default = NavigationComponent;
 
-},{"../Component":230,"../Edge":231,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":186}],255:[function(require,module,exports){
+},{"../Component":281,"../Edge":282,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":237}],306:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -21861,24 +24095,24 @@ require("rxjs/add/operator/mergeMap");
 require("rxjs/add/operator/pluck");
 require("rxjs/add/operator/scan");
 var Component_1 = require("../Component");
-var DescriptionState = (function () {
+var DescriptionState = /** @class */ (function () {
     function DescriptionState() {
     }
     return DescriptionState;
 }());
-var RouteState = (function () {
+var RouteState = /** @class */ (function () {
     function RouteState() {
     }
     return RouteState;
 }());
-var RouteTrack = (function () {
+var RouteTrack = /** @class */ (function () {
     function RouteTrack() {
         this.nodeInstructions = [];
         this.nodeInstructionsOrdered = [];
     }
     return RouteTrack;
 }());
-var RouteComponent = (function (_super) {
+var RouteComponent = /** @class */ (function (_super) {
     __extends(RouteComponent, _super);
     function RouteComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -22053,7 +24287,7 @@ exports.RouteComponent = RouteComponent;
 Component_1.ComponentService.register(RouteComponent);
 exports.default = RouteComponent;
 
-},{"../Component":230,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":74,"underscore":182,"virtual-dom":186}],256:[function(require,module,exports){
+},{"../Component":281,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":75,"underscore":233,"virtual-dom":237}],307:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -22073,7 +24307,7 @@ require("rxjs/add/operator/filter");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/scan");
 var Component_1 = require("../Component");
-var StatsComponent = (function (_super) {
+var StatsComponent = /** @class */ (function (_super) {
     __extends(StatsComponent, _super);
     function StatsComponent(name, container, navigator) {
         return _super.call(this, name, container, navigator) || this;
@@ -22143,7 +24377,7 @@ exports.StatsComponent = StatsComponent;
 Component_1.ComponentService.register(StatsComponent);
 exports.default = StatsComponent;
 
-},{"../Component":230,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74}],257:[function(require,module,exports){
+},{"../Component":281,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75}],308:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -22171,7 +24405,7 @@ var Component_1 = require("../../Component");
  * @class DirectionComponent
  * @classdesc Component showing navigation arrows for steps and turns.
  */
-var DirectionComponent = (function (_super) {
+var DirectionComponent = /** @class */ (function (_super) {
     __extends(DirectionComponent, _super);
     function DirectionComponent(name, container, navigator, directionDOMRenderer) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -22329,7 +24563,7 @@ exports.DirectionComponent = DirectionComponent;
 Component_1.ComponentService.register(DirectionComponent);
 exports.default = DirectionComponent;
 
-},{"../../Component":230,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":75,"virtual-dom":186}],258:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":76,"virtual-dom":237}],309:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Geo_1 = require("../../Geo");
@@ -22337,7 +24571,7 @@ var Geo_1 = require("../../Geo");
  * @class DirectionDOMCalculator
  * @classdesc Helper class for calculating DOM CSS properties.
  */
-var DirectionDOMCalculator = (function () {
+var DirectionDOMCalculator = /** @class */ (function () {
     function DirectionDOMCalculator(configuration, element) {
         this._spatial = new Geo_1.Spatial();
         this._minThresholdWidth = 320;
@@ -22568,7 +24802,7 @@ var DirectionDOMCalculator = (function () {
 exports.DirectionDOMCalculator = DirectionDOMCalculator;
 exports.default = DirectionDOMCalculator;
 
-},{"../../Geo":233}],259:[function(require,module,exports){
+},{"../../Geo":284}],310:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -22580,7 +24814,7 @@ var Geo_1 = require("../../Geo");
  * @class DirectionDOMRenderer
  * @classdesc DOM renderer for direction arrows.
  */
-var DirectionDOMRenderer = (function () {
+var DirectionDOMRenderer = /** @class */ (function () {
     function DirectionDOMRenderer(configuration, element) {
         this._isEdge = false;
         this._spatial = new Geo_1.Spatial();
@@ -22935,7 +25169,7 @@ var DirectionDOMRenderer = (function () {
 exports.DirectionDOMRenderer = DirectionDOMRenderer;
 exports.default = DirectionDOMRenderer;
 
-},{"../../Component":230,"../../Edge":231,"../../Geo":233,"virtual-dom":186}],260:[function(require,module,exports){
+},{"../../Component":281,"../../Edge":282,"../../Geo":284,"virtual-dom":237}],311:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -22969,7 +25203,7 @@ var Component_1 = require("../../Component");
 var Render_1 = require("../../Render");
 var Tiles_1 = require("../../Tiles");
 var Utils_1 = require("../../Utils");
-var ImagePlaneComponent = (function (_super) {
+var ImagePlaneComponent = /** @class */ (function (_super) {
     __extends(ImagePlaneComponent, _super);
     function ImagePlaneComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -23144,7 +25378,16 @@ var ImagePlaneComponent = (function (_super) {
             .publishReplay(1)
             .refCount();
         this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentNode$
+        var nodeImage$ = this._navigator.stateService.currentState$
+            .filter(function (frame) {
+            return frame.state.nodesAhead === 0;
+        })
+            .map(function (frame) {
+            return frame.state.currentNode;
+        })
+            .distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        })
             .debounceTime(1000)
             .withLatestFrom(hasTexture$)
             .filter(function (args) {
@@ -23223,13 +25466,13 @@ exports.ImagePlaneComponent = ImagePlaneComponent;
 Component_1.ComponentService.register(ImagePlaneComponent);
 exports.default = ImagePlaneComponent;
 
-},{"../../Component":230,"../../Render":236,"../../Tiles":239,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/skipWhile":78,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],261:[function(require,module,exports){
+},{"../../Component":281,"../../Render":287,"../../Tiles":290,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/skipWhile":79,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87}],312:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
 var Component_1 = require("../../Component");
-var ImagePlaneFactory = (function () {
+var ImagePlaneFactory = /** @class */ (function () {
     function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) {
         this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
         this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
@@ -23452,21 +25695,18 @@ var ImagePlaneFactory = (function () {
 exports.ImagePlaneFactory = ImagePlaneFactory;
 exports.default = ImagePlaneFactory;
 
-},{"../../Component":230,"three":180}],262:[function(require,module,exports){
+},{"../../Component":281,"three":231}],313:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var ImagePlaneGLRenderer = (function () {
+var ImagePlaneGLRenderer = /** @class */ (function () {
     function ImagePlaneGLRenderer() {
         this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
         this._imagePlaneScene = new Component_1.ImagePlaneScene();
         this._alpha = 0;
         this._alphaOld = 0;
         this._fadeOutSpeed = 0.05;
-        this._lastCamera = new Geo_1.Camera();
-        this._epsilon = 0.000001;
         this._currentKey = null;
         this._previousKey = null;
         this._providerDisposers = {};
@@ -23617,12 +25857,12 @@ var ImagePlaneGLRenderer = (function () {
 exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
 exports.default = ImagePlaneGLRenderer;
 
-},{"../../Component":230,"../../Geo":233}],263:[function(require,module,exports){
+},{"../../Component":281}],314:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
-var ImagePlaneScene = (function () {
+var ImagePlaneScene = /** @class */ (function () {
     function ImagePlaneScene() {
         this.scene = new THREE.Scene();
         this.sceneOld = new THREE.Scene();
@@ -23694,28 +25934,28 @@ var ImagePlaneScene = (function () {
 exports.ImagePlaneScene = ImagePlaneScene;
 exports.default = ImagePlaneScene;
 
-},{"three":180}],264:[function(require,module,exports){
+},{"three":231}],315:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 
 var path = require("path");
-var ImagePlaneShaders = (function () {
+var ImagePlaneShaders = /** @class */ (function () {
     function ImagePlaneShaders() {
     }
     ImagePlaneShaders.equirectangular = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
         vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
     ImagePlaneShaders.perspective = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
         vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
     return ImagePlaneShaders;
 }());
 exports.ImagePlaneShaders = ImagePlaneShaders;
 
-},{"path":22}],265:[function(require,module,exports){
+},{"path":22}],316:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -23749,7 +25989,7 @@ var State_1 = require("../../State");
 var Render_1 = require("../../Render");
 var Utils_1 = require("../../Utils");
 var Component_1 = require("../../Component");
-var SliderState = (function () {
+var SliderState = /** @class */ (function () {
     function SliderState() {
         this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
         this._imagePlaneScene = new Component_1.ImagePlaneScene();
@@ -23896,7 +26136,7 @@ var SliderState = (function () {
     };
     return SliderState;
 }());
-var SliderComponent = (function (_super) {
+var SliderComponent = /** @class */ (function (_super) {
     __extends(SliderComponent, _super);
     /**
      * Create a new slider component instance.
@@ -24159,7 +26399,7 @@ exports.SliderComponent = SliderComponent;
 Component_1.ComponentService.register(SliderComponent);
 exports.default = SliderComponent;
 
-},{"../../Component":230,"../../Render":236,"../../State":237,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/add/operator/zip":86}],266:[function(require,module,exports){
+},{"../../Component":281,"../../Render":287,"../../State":288,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87,"rxjs/add/operator/zip":88}],317:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var CoverState;
@@ -24169,13 +26409,117 @@ var CoverState;
     CoverState[CoverState["Visible"] = 2] = "Visible";
 })(CoverState = exports.CoverState || (exports.CoverState = {}));
 
-},{}],267:[function(require,module,exports){
+},{}],318:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var ICoverConfiguration_1 = require("./ICoverConfiguration");
 exports.CoverState = ICoverConfiguration_1.CoverState;
 
-},{"./ICoverConfiguration":266}],268:[function(require,module,exports){
+},{"./ICoverConfiguration":317}],319:[function(require,module,exports){
+"use strict";
+/// <reference path="../../../typings/index.d.ts" />
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+/**
+ * The `KeyPlayHandler` allows the user to control the play behavior
+ * using the following key commands:
+ *
+ * `Spacebar`: Start or stop playing.
+ * `SHIFT` + `D`: Switch direction.
+ * `<`: Decrease speed.
+ * `>`: Increase speed.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyPlay.disable();
+ * keyboardComponent.keyPlay.enable();
+ *
+ * var isEnabled = keyboardComponent.keyPlay.isEnabled;
+ * ```
+ */
+var KeyPlayHandler = /** @class */ (function (_super) {
+    __extends(KeyPlayHandler, _super);
+    function KeyPlayHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    KeyPlayHandler.prototype._enable = function () {
+        var _this = this;
+        this._keyDownSubscription = this._container.keyboardService.keyDown$
+            .withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$
+            .switchMap(function (node) {
+            return node.sequenceEdges$;
+        }))
+            .subscribe(function (_a) {
+            var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4];
+            if (event.altKey || event.ctrlKey || event.metaKey) {
+                return;
+            }
+            switch (event.key) {
+                case "D":
+                    if (!event.shiftKey) {
+                        return;
+                    }
+                    var newDirection = playing ?
+                        null : direction === Edge_1.EdgeDirection.Next ?
+                        Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ?
+                        Edge_1.EdgeDirection.Next : null;
+                    if (newDirection != null) {
+                        _this._navigator.playService.setDirection(newDirection);
+                    }
+                    break;
+                case " ":
+                    if (event.shiftKey) {
+                        return;
+                    }
+                    if (playing) {
+                        _this._navigator.playService.stop();
+                    }
+                    else {
+                        for (var _i = 0, _b = status.edges; _i < _b.length; _i++) {
+                            var edge = _b[_i];
+                            if (edge.data.direction === direction) {
+                                _this._navigator.playService.play();
+                            }
+                        }
+                    }
+                    break;
+                case "<":
+                    _this._navigator.playService.setSpeed(speed - 0.05);
+                    break;
+                case ">":
+                    _this._navigator.playService.setSpeed(speed + 0.05);
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+        });
+    };
+    KeyPlayHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeyPlayHandler.prototype._getConfiguration = function (enable) {
+        return { keyZoom: enable };
+    };
+    return KeyPlayHandler;
+}(Component_1.HandlerBase));
+exports.KeyPlayHandler = KeyPlayHandler;
+exports.default = KeyPlayHandler;
+
+},{"../../Component":281,"../../Edge":282}],320:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -24194,7 +26538,7 @@ require("rxjs/add/operator/withLatestFrom");
 var Component_1 = require("../../Component");
 var Edge_1 = require("../../Edge");
 /**
- * The `KeySequenceNavigationHandler` allows the user navigate through a sequence using the
+ * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
  * following key commands:
  *
  * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
@@ -24210,7 +26554,7 @@ var Edge_1 = require("../../Edge");
  * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
  * ```
  */
-var KeySequenceNavigationHandler = (function (_super) {
+var KeySequenceNavigationHandler = /** @class */ (function (_super) {
     __extends(KeySequenceNavigationHandler, _super);
     function KeySequenceNavigationHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -24261,7 +26605,7 @@ var KeySequenceNavigationHandler = (function (_super) {
 exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler;
 exports.default = KeySequenceNavigationHandler;
 
-},{"../../Component":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],269:[function(require,module,exports){
+},{"../../Component":281,"../../Edge":282,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],321:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -24280,7 +26624,7 @@ require("rxjs/add/operator/withLatestFrom");
 var Component_1 = require("../../Component");
 var Edge_1 = require("../../Edge");
 /**
- * The `KeySpatialNavigationHandler` allows the user navigate through a sequence using the
+ * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
  * following key commands:
  *
  * `Up Arrow`: Step forward.
@@ -24301,7 +26645,7 @@ var Edge_1 = require("../../Edge");
  * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
  * ```
  */
-var KeySpatialNavigationHandler = (function (_super) {
+var KeySpatialNavigationHandler = /** @class */ (function (_super) {
     __extends(KeySpatialNavigationHandler, _super);
     function KeySpatialNavigationHandler(component, container, navigator, spatial) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -24405,7 +26749,7 @@ var KeySpatialNavigationHandler = (function (_super) {
 exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler;
 exports.default = KeySpatialNavigationHandler;
 
-},{"../../Component":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],270:[function(require,module,exports){
+},{"../../Component":281,"../../Edge":282,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],322:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -24422,7 +26766,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
 require("rxjs/add/operator/withLatestFrom");
 var Component_1 = require("../../Component");
 /**
- * The `KeyZoomHandler` allows the user zoom in and out using the
+ * The `KeyZoomHandler` allows the user to zoom in and out using the
  * following key commands:
  *
  * `+`: Zoom in.
@@ -24438,7 +26782,7 @@ var Component_1 = require("../../Component");
  * var isEnabled = keyboardComponent.keyZoom.isEnabled;
  * ```
  */
-var KeyZoomHandler = (function (_super) {
+var KeyZoomHandler = /** @class */ (function (_super) {
     __extends(KeyZoomHandler, _super);
     function KeyZoomHandler(component, container, navigator, viewportCoords) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -24482,7 +26826,7 @@ var KeyZoomHandler = (function (_super) {
 exports.KeyZoomHandler = KeyZoomHandler;
 exports.default = KeyZoomHandler;
 
-},{"../../Component":230,"rxjs/add/operator/withLatestFrom":85}],271:[function(require,module,exports){
+},{"../../Component":281,"rxjs/add/operator/withLatestFrom":87}],323:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -24514,23 +26858,24 @@ var Geo_1 = require("../../Geo");
  * var keyboardComponent = viewer.getComponent("keyboard");
  * ```
  */
-var KeyboardComponent = (function (_super) {
+var KeyboardComponent = /** @class */ (function (_super) {
     __extends(KeyboardComponent, _super);
     function KeyboardComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
-        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
+        _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator);
         _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator);
         _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial());
+        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
         return _this;
     }
-    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
+    Object.defineProperty(KeyboardComponent.prototype, "keyPlay", {
         /**
-         * Get key zoom.
+         * Get key play.
          *
-         * @returns {KeyZoomHandler} The key zoom handler.
+         * @returns {KeyPlayHandler} The key play handler.
          */
         get: function () {
-            return this._keyZoomHandler;
+            return this._keyPlayHandler;
         },
         enumerable: true,
         configurable: true
@@ -24559,15 +26904,27 @@ var KeyboardComponent = (function (_super) {
         enumerable: true,
         configurable: true
     });
+    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
+        /**
+         * Get key zoom.
+         *
+         * @returns {KeyZoomHandler} The key zoom handler.
+         */
+        get: function () {
+            return this._keyZoomHandler;
+        },
+        enumerable: true,
+        configurable: true
+    });
     KeyboardComponent.prototype._activate = function () {
         var _this = this;
         this._configurationSubscription = this._configuration$
             .subscribe(function (configuration) {
-            if (configuration.keyZoom) {
-                _this._keyZoomHandler.enable();
+            if (configuration.keyPlay) {
+                _this._keyPlayHandler.enable();
             }
             else {
-                _this._keyZoomHandler.disable();
+                _this._keyPlayHandler.disable();
             }
             if (configuration.keySequenceNavigation) {
                 _this._keySequenceNavigationHandler.enable();
@@ -24581,13 +26938,23 @@ var KeyboardComponent = (function (_super) {
             else {
                 _this._keySpatialNavigationHandler.disable();
             }
+            if (configuration.keyZoom) {
+                _this._keyZoomHandler.enable();
+            }
+            else {
+                _this._keyZoomHandler.disable();
+            }
         });
     };
     KeyboardComponent.prototype._deactivate = function () {
         this._configurationSubscription.unsubscribe();
+        this._keyPlayHandler.disable();
+        this._keySequenceNavigationHandler.disable();
+        this._keySpatialNavigationHandler.disable();
+        this._keyZoomHandler.disable();
     };
     KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return { keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
+        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
     };
     KeyboardComponent.componentName = "keyboard";
     return KeyboardComponent;
@@ -24596,7 +26963,7 @@ exports.KeyboardComponent = KeyboardComponent;
 Component_1.ComponentService.register(KeyboardComponent);
 exports.default = KeyboardComponent;
 
-},{"../../Component":230,"../../Geo":233}],272:[function(require,module,exports){
+},{"../../Component":281,"../../Geo":284}],324:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var MarkerComponent_1 = require("./MarkerComponent");
@@ -24606,7 +26973,7 @@ exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
 var CircleMarker_1 = require("./marker/CircleMarker");
 exports.CircleMarker = CircleMarker_1.CircleMarker;
 
-},{"./MarkerComponent":273,"./marker/CircleMarker":276,"./marker/SimpleMarker":278}],273:[function(require,module,exports){
+},{"./MarkerComponent":325,"./marker/CircleMarker":328,"./marker/SimpleMarker":330}],325:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -24666,7 +27033,7 @@ var Geo_1 = require("../../Geo");
  * var markerComponent = viewer.getComponent("marker");
  * ```
  */
-var MarkerComponent = (function (_super) {
+var MarkerComponent = /** @class */ (function (_super) {
     __extends(MarkerComponent, _super);
     function MarkerComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -25099,12 +27466,12 @@ exports.MarkerComponent = MarkerComponent;
 Component_1.ComponentService.register(MarkerComponent);
 exports.default = MarkerComponent;
 
-},{"../../Component":230,"../../Geo":233,"../../Graph":234,"../../Render":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"three":180,"when":227}],274:[function(require,module,exports){
+},{"../../Component":281,"../../Geo":284,"../../Graph":285,"../../Render":287,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"three":231,"when":278}],326:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
-var MarkerScene = (function () {
+var MarkerScene = /** @class */ (function () {
     function MarkerScene(scene, raycaster) {
         this._needsRender = false;
         this._interactiveObjects = [];
@@ -25222,7 +27589,7 @@ var MarkerScene = (function () {
 exports.MarkerScene = MarkerScene;
 exports.default = MarkerScene;
 
-},{"three":180}],275:[function(require,module,exports){
+},{"three":231}],327:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -25231,7 +27598,7 @@ var Subject_1 = require("rxjs/Subject");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/publishReplay");
 require("rxjs/add/operator/scan");
-var MarkerSet = (function () {
+var MarkerSet = /** @class */ (function () {
     function MarkerSet() {
         this._hash = {};
         this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]);
@@ -25343,7 +27710,7 @@ var MarkerSet = (function () {
 exports.MarkerSet = MarkerSet;
 exports.default = MarkerSet;
 
-},{"rbush":25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74}],276:[function(require,module,exports){
+},{"rbush":25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75}],328:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -25388,7 +27755,7 @@ var Component_1 = require("../../../Component");
  * markerComponent.add([defaultMarker, configuredMarker]);
  * ```
  */
-var CircleMarker = (function (_super) {
+var CircleMarker = /** @class */ (function (_super) {
     __extends(CircleMarker, _super);
     function CircleMarker(id, latLon, options) {
         var _this = _super.call(this, id, latLon) || this;
@@ -25426,7 +27793,7 @@ var CircleMarker = (function (_super) {
 exports.CircleMarker = CircleMarker;
 exports.default = CircleMarker;
 
-},{"../../../Component":230,"three":180}],277:[function(require,module,exports){
+},{"../../../Component":281,"three":231}],329:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -25436,7 +27803,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
  * @classdesc Represents an abstract marker class that should be extended
  * by marker implementations used in the marker component.
  */
-var Marker = (function () {
+var Marker = /** @class */ (function () {
     function Marker(id, latLon) {
         this._id = id;
         this._latLon = latLon;
@@ -25513,7 +27880,7 @@ var Marker = (function () {
 exports.Marker = Marker;
 exports.default = Marker;
 
-},{}],278:[function(require,module,exports){
+},{}],330:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -25561,7 +27928,7 @@ var Component_1 = require("../../../Component");
  * markerComponent.add([defaultMarker, interactiveMarker]);
  * ```
  */
-var SimpleMarker = (function (_super) {
+var SimpleMarker = /** @class */ (function (_super) {
     __extends(SimpleMarker, _super);
     function SimpleMarker(id, latLon, options) {
         var _this = _super.call(this, id, latLon) || this;
@@ -25580,14 +27947,12 @@ var SimpleMarker = (function (_super) {
         var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
             color: this._color,
             opacity: this._opacity,
-            shading: THREE.SmoothShading,
             transparent: true,
         }));
         cone.renderOrder = 1;
         var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
             color: this._ballColor,
             opacity: this._ballOpacity,
-            shading: THREE.SmoothShading,
             transparent: true,
         }));
         ball.position.z = this._markerHeight(radius);
@@ -25662,7 +28027,7 @@ var SimpleMarker = (function (_super) {
 exports.SimpleMarker = SimpleMarker;
 exports.default = SimpleMarker;
 
-},{"../../../Component":230,"three":180}],279:[function(require,module,exports){
+},{"../../../Component":281,"three":231}],331:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -25682,7 +28047,7 @@ var Component_1 = require("../../Component");
  * The `BounceHandler` ensures that the viewer bounces back to the image
  * when drag panning outside of the image edge.
  */
-var BounceHandler = (function (_super) {
+var BounceHandler = /** @class */ (function (_super) {
     __extends(BounceHandler, _super);
     function BounceHandler(component, container, navigator, viewportCoords, spatial) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -25772,7 +28137,7 @@ var BounceHandler = (function (_super) {
 exports.BounceHandler = BounceHandler;
 exports.default = BounceHandler;
 
-},{"../../Component":230,"rxjs/Observable":29}],280:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Observable":29}],332:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -25788,7 +28153,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../../Component");
 /**
- * The `DoubleClickZoomHandler` allows the user to zoom the viewer photo at a point by double clicking.
+ * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.
  *
  * @example
  * ```
@@ -25800,7 +28165,7 @@ var Component_1 = require("../../Component");
  * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
  * ```
  */
-var DoubleClickZoomHandler = (function (_super) {
+var DoubleClickZoomHandler = /** @class */ (function (_super) {
     __extends(DoubleClickZoomHandler, _super);
     function DoubleClickZoomHandler(component, container, navigator, viewportCoords) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -25838,7 +28203,7 @@ var DoubleClickZoomHandler = (function (_super) {
 exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
 exports.default = DoubleClickZoomHandler;
 
-},{"../../Component":230,"rxjs/Observable":29}],281:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Observable":29}],333:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -25859,7 +28224,7 @@ require("rxjs/add/operator/sample");
 require("rxjs/add/operator/takeWhile");
 var Component_1 = require("../../Component");
 /**
- * The `DragPanHandler` allows the user to pan the viewer photo by clicking and dragging the cursor.
+ * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
  *
  * @example
  * ```
@@ -25871,7 +28236,7 @@ var Component_1 = require("../../Component");
  * var isEnabled = mouseComponent.dragPan.isEnabled;
  * ```
  */
-var DragPanHandler = (function (_super) {
+var DragPanHandler = /** @class */ (function (_super) {
     __extends(DragPanHandler, _super);
     function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -25887,12 +28252,14 @@ var DragPanHandler = (function (_super) {
             .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)
             .map(function (event) {
             return true;
-        });
+        })
+            .share();
         var draggingStopped$ = this._container.mouseService
             .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)
             .map(function (event) {
             return false;
-        });
+        })
+            .share();
         this._activeMouseSubscription = Observable_1.Observable
             .merge(draggingStarted$, draggingStopped$)
             .subscribe(this._container.mouseService.activate$);
@@ -26089,7 +28456,7 @@ var DragPanHandler = (function (_super) {
 exports.DragPanHandler = DragPanHandler;
 exports.default = DragPanHandler;
 
-},{"../../Component":230,"rxjs/Observable":29,"rxjs/add/operator/concat":54,"rxjs/add/operator/sample":73,"rxjs/add/operator/takeWhile":83,"three":180}],282:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Observable":29,"rxjs/add/operator/concat":54,"rxjs/add/operator/sample":74,"rxjs/add/operator/takeWhile":84,"three":231}],334:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -26112,15 +28479,25 @@ var Geo_1 = require("../../Geo");
  * @class MouseComponent
  *
  * @classdesc Component handling mouse and touch events for camera movement.
+ *
+ * To retrive and use the mouse component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var mouseComponent = viewer.getComponent("mouse");
+ * ```
  */
-var MouseComponent = (function (_super) {
+var MouseComponent = /** @class */ (function (_super) {
     __extends(MouseComponent, _super);
     function MouseComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
         var spatial = new Geo_1.Spatial();
         var viewportCoords = new Geo_1.ViewportCoords();
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
         _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
         _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
         _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
@@ -26228,7 +28605,7 @@ exports.MouseComponent = MouseComponent;
 Component_1.ComponentService.register(MouseComponent);
 exports.default = MouseComponent;
 
-},{"../../Component":230,"../../Geo":233,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85}],283:[function(require,module,exports){
+},{"../../Component":281,"../../Geo":284,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":87}],335:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -26243,7 +28620,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../Component");
 /**
- * The `ScrollZoomHandler` allows the user to zoom the viewer photo by scrolling.
+ * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
  *
  * @example
  * ```
@@ -26255,7 +28632,7 @@ var Component_1 = require("../../Component");
  * var isEnabled = mouseComponent.scrollZoom.isEnabled;
  * ```
  */
-var ScrollZoomHandler = (function (_super) {
+var ScrollZoomHandler = /** @class */ (function (_super) {
     __extends(ScrollZoomHandler, _super);
     function ScrollZoomHandler(component, container, navigator, viewportCoords) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -26319,7 +28696,7 @@ var ScrollZoomHandler = (function (_super) {
 exports.ScrollZoomHandler = ScrollZoomHandler;
 exports.default = ScrollZoomHandler;
 
-},{"../../Component":230}],284:[function(require,module,exports){
+},{"../../Component":281}],336:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -26336,7 +28713,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../../Component");
 /**
- * The `TouchZoomHandler` allows the user to zoom the viewer photo by pinching on a touchscreen.
+ * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
  *
  * @example
  * ```
@@ -26348,7 +28725,7 @@ var Component_1 = require("../../Component");
  * var isEnabled = mouseComponent.touchZoom.isEnabled;
  * ```
  */
-var TouchZoomHandler = (function (_super) {
+var TouchZoomHandler = /** @class */ (function (_super) {
     __extends(TouchZoomHandler, _super);
     function TouchZoomHandler(component, container, navigator, viewportCoords) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -26408,7 +28785,7 @@ var TouchZoomHandler = (function (_super) {
 exports.TouchZoomHandler = TouchZoomHandler;
 exports.default = TouchZoomHandler;
 
-},{"../../Component":230,"rxjs/Observable":29}],285:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Observable":29}],337:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Popup_1 = require("./popup/Popup");
@@ -26416,7 +28793,7 @@ exports.Popup = Popup_1.Popup;
 var PopupComponent_1 = require("./PopupComponent");
 exports.PopupComponent = PopupComponent_1.PopupComponent;
 
-},{"./PopupComponent":286,"./popup/Popup":287}],286:[function(require,module,exports){
+},{"./PopupComponent":338,"./popup/Popup":339}],338:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -26462,7 +28839,7 @@ var Utils_1 = require("../../Utils");
  * var popupComponent = viewer.getComponent("popup");
  * ```
  */
-var PopupComponent = (function (_super) {
+var PopupComponent = /** @class */ (function (_super) {
     __extends(PopupComponent, _super);
     function PopupComponent(name, container, navigator, dom) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -26600,7 +28977,7 @@ exports.PopupComponent = PopupComponent;
 Component_1.ComponentService.register(PopupComponent);
 exports.default = PopupComponent;
 
-},{"../../Component":230,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34}],287:[function(require,module,exports){
+},{"../../Component":281,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34}],339:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -26655,7 +29032,7 @@ var Viewer_1 = require("../../../Viewer");
  * @description Implementation of API methods and API documentation inspired
  * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
  */
-var Popup = (function () {
+var Popup = /** @class */ (function () {
     function Popup(options, viewportCoords, dom) {
         this._options = {};
         if (!!options) {
@@ -26867,17 +29244,17 @@ var Popup = (function () {
         var pointPixel = null;
         var position = this._alignmentToPopupAligment(this._options.position);
         var float = this._alignmentToPopupAligment(this._options.float);
+        var classList = this._container.classList;
         if (this._point != null) {
             pointPixel =
                 this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
         }
         else {
-            var classList_1 = this._container.classList;
             var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"];
             var appliedPosition = null;
             for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) {
                 var alignment = alignments_1[_i];
-                if (classList_1.contains("mapillaryjs-popup-float-" + alignment)) {
+                if (classList.contains("mapillaryjs-popup-float-" + alignment)) {
                     appliedPosition = alignment;
                     break;
                 }
@@ -26912,7 +29289,6 @@ var Popup = (function () {
             "top-left": "translate(-100%,-100%)",
             "top-right": "translate(0,-100%)",
         };
-        var classList = this._container.classList;
         for (var key in floatTranslate) {
             if (!floatTranslate.hasOwnProperty(key)) {
                 continue;
@@ -26941,21 +29317,21 @@ var Popup = (function () {
             var largestVisibleArea = [0, null, null];
             for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
                 var automaticPosition = automaticPositions_1[_i];
-                var pointBasic_1 = this._pointFromRectPosition(rect, automaticPosition);
-                var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic_1[0], pointBasic_1[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-                if (pointPixel == null) {
+                var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition);
+                var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+                if (autoPointPixel == null) {
                     continue;
                 }
                 var floatOffset = floatOffsets[automaticPosition];
-                var offsetedPosition = [pointPixel[0] + floatOffset[0], pointPixel[1] + floatOffset[1]];
+                var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];
                 var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;
                 var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));
                 if (floats.length === 0 &&
-                    pointPixel[0] > 0 &&
-                    pointPixel[0] < size.width &&
-                    pointPixel[1] > 0 &&
-                    pointPixel[1] < size.height) {
-                    return [pointPixel, automaticPosition];
+                    autoPointPixel[0] > 0 &&
+                    autoPointPixel[0] < size.width &&
+                    autoPointPixel[1] > 0 &&
+                    autoPointPixel[1] < size.height) {
+                    return [autoPointPixel, automaticPosition];
                 }
                 var minX = Math.max(offsetedPosition[0] - width / 2, 0);
                 var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
@@ -26966,7 +29342,7 @@ var Popup = (function () {
                 var visibleArea = staticCoeff * visibleX * visibleY;
                 if (visibleArea > largestVisibleArea[0]) {
                     largestVisibleArea[0] = visibleArea;
-                    largestVisibleArea[1] = pointPixel;
+                    largestVisibleArea[1] = autoPointPixel;
                     largestVisibleArea[2] = automaticPosition;
                 }
             }
@@ -26975,8 +29351,8 @@ var Popup = (function () {
             }
         }
         var pointBasic = this._pointFromRectPosition(rect, position);
-        var pointCanvas = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        return [pointCanvas, position != null ? position : "top"];
+        var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+        return [pointPixel, position != null ? position : "top"];
     };
     Popup.prototype._alignmentToPopupAligment = function (float) {
         switch (float) {
@@ -27055,27 +29431,31 @@ var Popup = (function () {
         return floats;
     };
     Popup.prototype._pointFromRectPosition = function (rect, position) {
+        var x0 = rect[0];
+        var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1;
+        var y0 = rect[1];
+        var y1 = rect[3];
         switch (position) {
             case "bottom":
-                return [(rect[0] + rect[2]) / 2, rect[3]];
+                return [(x0 + x1) / 2, y1];
             case "bottom-left":
-                return [rect[0], rect[3]];
+                return [x0, y1];
             case "bottom-right":
-                return [rect[2], rect[3]];
+                return [x1, y1];
             case "center":
-                return [(rect[0] + rect[2]) / 2, (rect[1] + rect[3]) / 2];
+                return [(x0 + x1) / 2, (y0 + y1) / 2];
             case "left":
-                return [rect[0], (rect[1] + rect[3]) / 2];
+                return [x0, (y0 + y1) / 2];
             case "right":
-                return [rect[2], (rect[1] + rect[3]) / 2];
+                return [x1, (y0 + y1) / 2];
             case "top":
-                return [(rect[0] + rect[2]) / 2, rect[1]];
+                return [(x0 + x1) / 2, y0];
             case "top-left":
-                return [rect[0], rect[1]];
+                return [x0, y0];
             case "top-right":
-                return [rect[2], rect[1]];
+                return [x1, y0];
             default:
-                return [(rect[0] + rect[2]) / 2, rect[3]];
+                return [(x0 + x1) / 2, y1];
         }
     };
     return Popup;
@@ -27083,7 +29463,17 @@ var Popup = (function () {
 exports.Popup = Popup;
 exports.default = Popup;
 
-},{"../../../Geo":233,"../../../Utils":240,"../../../Viewer":241,"rxjs/Subject":34}],288:[function(require,module,exports){
+},{"../../../Geo":284,"../../../Utils":291,"../../../Viewer":292,"rxjs/Subject":34}],340:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ControlMode;
+(function (ControlMode) {
+    ControlMode[ControlMode["Default"] = 0] = "Default";
+    ControlMode[ControlMode["Playback"] = 1] = "Playback";
+})(ControlMode = exports.ControlMode || (exports.ControlMode = {}));
+exports.default = ControlMode;
+
+},{}],341:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -27109,6 +29499,7 @@ require("rxjs/add/operator/finally");
 require("rxjs/add/operator/first");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/publishReplay");
+require("rxjs/add/operator/retry");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/share");
 require("rxjs/add/operator/switchMap");
@@ -27121,23 +29512,40 @@ var Edge_1 = require("../../Edge");
  * @classdesc Component showing navigation arrows for sequence directions
  * as well as playing button. Exposes an API to start and stop play.
  */
-var SequenceComponent = (function (_super) {
+var SequenceComponent = /** @class */ (function (_super) {
     __extends(SequenceComponent, _super);
     function SequenceComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
-        _this._nodesAhead = 5;
-        _this._configurationOperation$ = new Subject_1.Subject();
-        _this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container.element);
+        _this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container);
         _this._sequenceDOMInteraction = new Component_1.SequenceDOMInteraction();
         _this._containerWidth$ = new Subject_1.Subject();
         _this._hoveredKeySubject$ = new Subject_1.Subject();
         _this._hoveredKey$ = _this._hoveredKeySubject$.share();
-        _this._edgeStatus$ = _this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .publishReplay(1)
-            .refCount();
+        _this._navigator.playService.playing$
+            .skip(1)
+            .withLatestFrom(_this._configuration$)
+            .subscribe(function (_a) {
+            var playing = _a[0], configuration = _a[1];
+            _this.fire(SequenceComponent.playingchanged, playing);
+            if (playing === configuration.playing) {
+                return;
+            }
+            if (playing) {
+                _this.play();
+            }
+            else {
+                _this.stop();
+            }
+        });
+        _this._navigator.playService.direction$
+            .skip(1)
+            .withLatestFrom(_this._configuration$)
+            .subscribe(function (_a) {
+            var direction = _a[0], configuration = _a[1];
+            if (direction !== configuration.direction) {
+                _this.setDirection(direction);
+            }
+        });
         return _this;
     }
     Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
@@ -27243,17 +29651,34 @@ var SequenceComponent = (function (_super) {
     };
     SequenceComponent.prototype._activate = function () {
         var _this = this;
+        this._sequenceDOMRenderer.activate();
+        var edgeStatus$ = this._navigator.stateService.currentNode$
+            .switchMap(function (node) {
+            return node.sequenceEdges$;
+        })
+            .publishReplay(1)
+            .refCount();
         this._renderSubscription = Observable_1.Observable
-            .combineLatest(this._edgeStatus$, this._configuration$, this._containerWidth$)
-            .map(function (ec) {
-            var edgeStatus = ec[0];
-            var configuration = ec[1];
-            var containerWidth = ec[2];
+            .combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.startWith(this._sequenceDOMRenderer), this._navigator.playService.speed$)
+            .map(function (_a) {
+            var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4];
             var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, _this, _this._sequenceDOMInteraction, _this._navigator);
+                .render(edgeStatus, configuration, containerWidth, speed, _this, _this._sequenceDOMInteraction, _this._navigator);
             return { name: _this._name, vnode: vNode };
         })
             .subscribe(this._container.domRenderer.render$);
+        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$
+            .subscribe(function (speed) {
+            _this._navigator.playService.setSpeed(speed);
+        });
+        this._setDirectionSubscription = this._configuration$
+            .map(function (configuration) {
+            return configuration.direction;
+        })
+            .distinctUntilChanged()
+            .subscribe(function (direction) {
+            _this._navigator.playService.setDirection(direction);
+        });
         this._containerWidthSubscription = this._configuration$
             .distinctUntilChanged(function (value1, value2) {
             return value1[0] === value2[0] && value1[1] === value2[1];
@@ -27264,68 +29689,22 @@ var SequenceComponent = (function (_super) {
             return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
         })
             .subscribe(this._containerWidth$);
-        this._configurationSubscription = this._configurationOperation$
-            .scan(function (configuration, operation) {
-            return operation(configuration);
-        }, { playing: false })
-            .finally(function () {
-            if (_this._playingSubscription != null) {
-                _this._navigator.stateService.cutNodes();
-                _this._stop();
-            }
-        })
-            .subscribe(function () { });
-        this._configuration$
-            .map(function (newConfiguration) {
-            return function (configuration) {
-                if (newConfiguration.playing !== configuration.playing) {
-                    _this._navigator.stateService.cutNodes();
-                    if (newConfiguration.playing) {
-                        _this._play();
-                    }
-                    else {
-                        _this._stop();
-                    }
-                }
-                configuration.playing = newConfiguration.playing;
-                return configuration;
-            };
-        })
-            .subscribe(this._configurationOperation$);
-        this._stopSubscription = this._configuration$
-            .switchMap(function (configuration) {
-            var edgeStatus$ = configuration.playing ?
-                _this._edgeStatus$ :
-                Observable_1.Observable.empty();
-            var edgeDirection$ = Observable_1.Observable
-                .of(configuration.direction);
-            return Observable_1.Observable
-                .combineLatest(edgeStatus$, edgeDirection$);
+        this._playingSubscription = this._configuration$
+            .map(function (configuration) {
+            return configuration.playing;
         })
-            .map(function (ne) {
-            var edgeStatus = ne[0];
-            var direction = ne[1];
-            if (!edgeStatus.cached) {
-                return true;
+            .distinctUntilChanged()
+            .subscribe(function (playing) {
+            if (playing) {
+                _this._navigator.playService.play();
             }
-            for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return true;
-                }
+            else {
+                _this._navigator.playService.stop();
             }
-            return false;
-        })
-            .filter(function (hasEdge) {
-            return !hasEdge;
-        })
-            .map(function (hasEdge) {
-            return { playing: false };
-        })
-            .subscribe(this._configurationSubject$);
+        });
         this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$
             .switchMap(function (direction) {
-            return _this._edgeStatus$
+            return edgeStatus$
                 .map(function (edgeStatus) {
                 for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
                     var edge = _a[_i];
@@ -27342,84 +29721,23 @@ var SequenceComponent = (function (_super) {
             .subscribe(this._hoveredKeySubject$);
     };
     SequenceComponent.prototype._deactivate = function () {
-        this._stopSubscription.unsubscribe();
         this._renderSubscription.unsubscribe();
-        this._configurationSubscription.unsubscribe();
+        this._playingSubscription.unsubscribe();
         this._containerWidthSubscription.unsubscribe();
         this._hoveredKeySubscription.unsubscribe();
-        this.stop();
+        this._setSpeedSubscription.unsubscribe();
+        this._setDirectionSubscription.unsubscribe();
+        this._sequenceDOMRenderer.deactivate();
     };
     SequenceComponent.prototype._getDefaultConfiguration = function () {
         return {
             direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 117,
+            maxWidth: 108,
             minWidth: 70,
             playing: false,
             visible: true,
         };
     };
-    SequenceComponent.prototype._play = function () {
-        var _this = this;
-        this._playingSubscription = this._navigator.stateService.currentState$
-            .filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        })
-            .map(function (frame) {
-            return frame.state.lastNode;
-        })
-            .distinctUntilChanged(undefined, function (lastNode) {
-            return lastNode.key;
-        })
-            .withLatestFrom(this._configuration$, function (lastNode, configuration) {
-            return [lastNode, configuration.direction];
-        })
-            .switchMap(function (nd) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(nd[1]) > -1 ?
-                nd[0].sequenceEdges$ :
-                nd[0].spatialEdges$)
-                .filter(function (status) {
-                return status.cached;
-            })
-                .zip(Observable_1.Observable.of(nd[1]), function (status, direction) {
-                return [status, direction];
-            });
-        })
-            .map(function (ed) {
-            var direction = ed[1];
-            for (var _i = 0, _a = ed[0].edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return edge.to;
-                }
-            }
-            return null;
-        })
-            .filter(function (key) {
-            return key != null;
-        })
-            .switchMap(function (key) {
-            return _this._navigator.graphService.cacheNode$(key);
-        })
-            .subscribe(function (node) {
-            _this._navigator.stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
-        });
-        this._clearSubscription = this._navigator.stateService.currentNode$
-            .bufferCount(1, 7)
-            .subscribe(function (nodes) {
-            _this._navigator.stateService.clearPriorNodes();
-        });
-        this.fire(SequenceComponent.playingchanged, true);
-    };
-    SequenceComponent.prototype._stop = function () {
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this._clearSubscription.unsubscribe();
-        this._clearSubscription = null;
-        this.fire(SequenceComponent.playingchanged, false);
-    };
     /** @inheritdoc */
     SequenceComponent.componentName = "sequence";
     /**
@@ -27435,11 +29753,11 @@ exports.SequenceComponent = SequenceComponent;
 Component_1.ComponentService.register(SequenceComponent);
 exports.default = SequenceComponent;
 
-},{"../../Component":230,"../../Edge":231,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],289:[function(require,module,exports){
+},{"../../Component":281,"../../Edge":282,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/retry":73,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87}],342:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
-var SequenceDOMInteraction = (function () {
+var SequenceDOMInteraction = /** @class */ (function () {
     function SequenceDOMInteraction() {
         this._mouseEnterDirection$ = new Subject_1.Subject();
         this._mouseLeaveDirection$ = new Subject_1.Subject();
@@ -27463,41 +29781,87 @@ var SequenceDOMInteraction = (function () {
 exports.SequenceDOMInteraction = SequenceDOMInteraction;
 exports.default = SequenceDOMInteraction;
 
-},{"rxjs/Subject":34}],290:[function(require,module,exports){
+},{"rxjs/Subject":34}],343:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var vd = require("virtual-dom");
+var Observable_1 = require("rxjs/Observable");
+var Subject_1 = require("rxjs/Subject");
+var Component_1 = require("../../Component");
 var Edge_1 = require("../../Edge");
-var SequenceDOMRenderer = (function () {
-    function SequenceDOMRenderer(element) {
+var SequenceDOMRenderer = /** @class */ (function () {
+    function SequenceDOMRenderer(container) {
+        this._container = container;
         this._minThresholdWidth = 320;
         this._maxThresholdWidth = 1480;
         this._minThresholdHeight = 240;
         this._maxThresholdHeight = 820;
+        this._stepperDefaultWidth = 108;
+        this._controlsDefaultWidth = 52;
+        this._defaultHeight = 30;
+        this._expandControls = false;
+        this._mode = Component_1.ControlMode.Default;
+        this._speed = 0.5;
+        this._changingSpeed = false;
+        this._notifyChanged$ = new Subject_1.Subject();
+        this._notifySpeedChanged$ = new Subject_1.Subject();
     }
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
+    Object.defineProperty(SequenceDOMRenderer.prototype, "speed", {
+        get: function () {
+            return this._speed;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", {
+        get: function () {
+            return this._notifyChanged$;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", {
+        get: function () {
+            return this._notifySpeedChanged$;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    SequenceDOMRenderer.prototype.activate = function () {
+        var _this = this;
+        if (!!this._changingSpeedSubscription) {
+            return;
         }
-        var nextKey = null;
-        var prevKey = null;
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
-                nextKey = edge.to;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
-                prevKey = edge.to;
+        this._changingSpeedSubscription = Observable_1.Observable
+            .merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$
+            .filter(function (touchEvent) {
+            return touchEvent.touches.length === 0;
+        }))
+            .subscribe(function (event) {
+            if (_this._changingSpeed) {
+                _this._changingSpeed = false;
             }
+        });
+    };
+    SequenceDOMRenderer.prototype.deactivate = function () {
+        if (!this._changingSpeedSubscription) {
+            return;
         }
-        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
-        var arrows = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator);
-        var containerProperties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: { height: (0.27 * containerWidth) + "px", width: containerWidth + "px" },
-        };
-        return vd.h("div.SequenceContainer", containerProperties, arrows.concat([playingButton]));
+        this._changingSpeed = false;
+        this._expandControls = false;
+        this._mode = Component_1.ControlMode.Default;
+        this._changingSpeedSubscription.unsubscribe();
+        this._changingSpeedSubscription = null;
+    };
+    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, component, interaction, navigator) {
+        if (configuration.visible === false) {
+            return vd.h("div.SequenceContainer", {}, []);
+        }
+        var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, interaction, navigator);
+        var controls = this._createSequenceControls(containerWidth);
+        var playback = this._createPlaybackControls(containerWidth, speed, component, configuration);
+        return vd.h("div.SequenceContainer", [stepper, controls, playback]);
     };
     SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) {
         var elementWidth = element.offsetWidth;
@@ -27512,24 +29876,137 @@ var SequenceDOMRenderer = (function () {
         var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
         return minWidth + coeff * (maxWidth - minWidth);
     };
+    SequenceDOMRenderer.prototype._createSpeedInput = function (speed) {
+        var _this = this;
+        this._speed = speed;
+        var onSpeed = function (e) {
+            _this._speed = Number(e.target.value) / 1000;
+            _this._notifySpeedChanged$.next(_this._speed);
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;
+        var onStart = function (e) {
+            _this._changingSpeed = true;
+            e.stopPropagation();
+        };
+        var onMove = function (e) {
+            if (_this._changingSpeed === true) {
+                e.stopPropagation();
+            }
+        };
+        var speedInput = vd.h("input.SequenceSpeed", {
+            max: 1000,
+            min: 0,
+            onchange: onSpeed,
+            oninput: onSpeed,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: 1000 * speed,
+        }, []);
+        return vd.h("div.SequenceSpeedContainer", [speedInput]);
+    };
+    SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) {
+        var _this = this;
+        if (this._mode !== Component_1.ControlMode.Playback) {
+            return vd.h("div.SequencePlayback", []);
+        }
+        var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []);
+        var direction = configuration.direction === Edge_1.EdgeDirection.Next ?
+            Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next;
+        var playing = configuration.playing;
+        var switchButtonProperties = {
+            onclick: function () {
+                if (!playing) {
+                    component.setDirection(direction);
+                }
+            },
+        };
+        var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton";
+        var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]);
+        var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []);
+        var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]);
+        var fastIcon = vd.h("div.SequenceFastIconGrey.SequenceIconVisible", []);
+        var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]);
+        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
+        var closeButtonProperties = {
+            onclick: function () {
+                _this._mode = Component_1.ControlMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
+        var speedInput = this._createSpeedInput(speed);
+        var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton];
+        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
+        var playbackProperties = { style: { top: top + "px" } };
+        return vd.h("div.SequencePlayback", playbackProperties, playbackChildren);
+    };
     SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
         var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
             configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
         var onclick = configuration.playing ?
             function (e) { component.stop(); } :
             canPlay ? function (e) { component.play(); } : null;
-        var buttonProperties = {
-            onclick: onclick,
-            style: {},
-        };
+        var buttonProperties = { onclick: onclick };
         var iconClass = configuration.playing ?
             "Stop" :
             canPlay ? "Play" : "PlayDisabled";
-        var icon = vd.h("div.SequenceComponentIcon", { className: iconClass }, []);
+        var iconProperties = { className: iconClass };
+        if (configuration.direction === Edge_1.EdgeDirection.Prev) {
+            iconProperties.style = {
+                transform: "rotate(180deg) translate(50%, 50%)",
+            };
+        }
+        var icon = vd.h("div.SequenceComponentIcon", iconProperties, []);
         var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
         return vd.h("div." + buttonClass, buttonProperties, [icon]);
     };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, configuration, interaction, navigator) {
+    SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) {
+        var _this = this;
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
+        var expanderProperties = {
+            onclick: function () {
+                _this._expandControls = !_this._expandControls;
+                _this._mode = Component_1.ControlMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+            style: {
+                "border-bottom-right-radius": borderRadius + "px",
+                "border-top-right-radius": borderRadius + "px",
+            },
+        };
+        var expanderBar = vd.h("div.SequenceExpanderBar", []);
+        var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]);
+        var fastIconClassName = this._mode === Component_1.ControlMode.Playback ?
+            ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon";
+        var fastIcon = vd.h("div" + fastIconClassName, []);
+        var playbackProperties = {
+            onclick: function () {
+                _this._mode = _this._mode === Component_1.ControlMode.Playback ?
+                    Component_1.ControlMode.Default :
+                    Component_1.ControlMode.Playback;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var controls = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]);
+        var properties = {
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)",
+                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px",
+            },
+        };
+        var className = ".SequenceControls" +
+            (this._expandControls ? ".SequenceControlsExpanded" : "");
+        return vd.h("div" + className, properties, [controls, expander]);
+    };
+    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, interaction, navigator) {
         var nextProperties = {
             onclick: nextKey != null ?
                 function (e) {
@@ -27539,8 +30016,8 @@ var SequenceDOMRenderer = (function () {
                 null,
             onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
             onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-            style: {},
         };
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
         var prevProperties = {
             onclick: prevKey != null ?
                 function (e) {
@@ -27550,17 +30027,44 @@ var SequenceDOMRenderer = (function () {
                 null,
             onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
             onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {},
+            style: {
+                "border-bottom-left-radius": borderRadius + "px",
+                "border-top-left-radius": borderRadius + "px",
+            },
         };
         var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
         var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
         var nextIcon = vd.h("div.SequenceComponentIcon", []);
         var prevIcon = vd.h("div.SequenceComponentIcon", []);
         return [
-            vd.h("div." + nextClass, nextProperties, [nextIcon]),
             vd.h("div." + prevClass, prevProperties, [prevIcon]),
+            vd.h("div." + nextClass, nextProperties, [nextIcon]),
         ];
     };
+    SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) {
+        var nextKey = null;
+        var prevKey = null;
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
+                nextKey = edge.to;
+            }
+            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
+                prevKey = edge.to;
+            }
+        }
+        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
+        var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, interaction, navigator);
+        buttons.splice(1, 0, playingButton);
+        var containerProperties = {
+            oncontextmenu: function (event) { event.preventDefault(); },
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                width: containerWidth + "px",
+            },
+        };
+        return vd.h("div.SequenceStepper", containerProperties, buttons);
+    };
     SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
         var className = direction === Edge_1.EdgeDirection.Next ?
             "SequenceStepNext" :
@@ -27580,7 +30084,7 @@ var SequenceDOMRenderer = (function () {
 exports.SequenceDOMRenderer = SequenceDOMRenderer;
 exports.default = SequenceDOMRenderer;
 
-},{"../../Edge":231,"virtual-dom":186}],291:[function(require,module,exports){
+},{"../../Component":281,"../../Edge":282,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":237}],344:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var GeometryTagError_1 = require("./error/GeometryTagError");
@@ -27600,7 +30104,7 @@ exports.TagComponent = TagComponent_1.TagComponent;
 var TagMode_1 = require("./TagMode");
 exports.TagMode = TagMode_1.TagMode;
 
-},{"./TagComponent":292,"./TagMode":295,"./error/GeometryTagError":299,"./geometry/PointGeometry":301,"./geometry/PolygonGeometry":302,"./geometry/RectGeometry":303,"./tag/OutlineTag":315,"./tag/SpotTag":318}],292:[function(require,module,exports){
+},{"./TagComponent":345,"./TagMode":348,"./error/GeometryTagError":352,"./geometry/PointGeometry":354,"./geometry/PolygonGeometry":355,"./geometry/RectGeometry":356,"./tag/OutlineTag":368,"./tag/SpotTag":371}],345:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -27680,7 +30184,7 @@ var Render_1 = require("../../Render");
  * var tagComponent = viewer.getComponent("tag");
  * ```
  */
-var TagComponent = (function (_super) {
+var TagComponent = /** @class */ (function (_super) {
     __extends(TagComponent, _super);
     function TagComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
@@ -28159,7 +30663,7 @@ exports.TagComponent = TagComponent;
 Component_1.ComponentService.register(TagComponent);
 exports.default = TagComponent;
 
-},{"../../Component":230,"../../Geo":233,"../../Render":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/skip":76,"rxjs/add/operator/skipUntil":77,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/take":81,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85,"when":227}],293:[function(require,module,exports){
+},{"../../Component":281,"../../Geo":284,"../../Render":287,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/skip":77,"rxjs/add/operator/skipUntil":78,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/take":82,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87,"when":278}],346:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
@@ -28168,7 +30672,7 @@ require("rxjs/add/operator/scan");
 require("rxjs/add/operator/share");
 require("rxjs/add/operator/withLatestFrom");
 var Component_1 = require("../../Component");
-var TagCreator = (function () {
+var TagCreator = /** @class */ (function () {
     function TagCreator(component, navigator) {
         this._component = component;
         this._navigator = navigator;
@@ -28251,12 +30755,12 @@ var TagCreator = (function () {
 exports.TagCreator = TagCreator;
 exports.default = TagCreator;
 
-},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/withLatestFrom":85}],294:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/withLatestFrom":87}],347:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var vd = require("virtual-dom");
-var TagDOMRenderer = (function () {
+var TagDOMRenderer = /** @class */ (function () {
     function TagDOMRenderer() {
     }
     TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
@@ -28277,7 +30781,7 @@ var TagDOMRenderer = (function () {
 }());
 exports.TagDOMRenderer = TagDOMRenderer;
 
-},{"virtual-dom":186}],295:[function(require,module,exports){
+},{"virtual-dom":237}],348:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -28314,7 +30818,7 @@ var TagMode;
 })(TagMode = exports.TagMode || (exports.TagMode = {}));
 exports.default = TagMode;
 
-},{}],296:[function(require,module,exports){
+},{}],349:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var TagOperation;
@@ -28325,12 +30829,12 @@ var TagOperation;
 })(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
 exports.default = TagOperation;
 
-},{}],297:[function(require,module,exports){
+},{}],350:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
-var TagScene = (function () {
+var TagScene = /** @class */ (function () {
     function TagScene(scene, raycaster) {
         this._createTag = null;
         this._needsRender = false;
@@ -28493,7 +30997,7 @@ var TagScene = (function () {
 exports.TagScene = TagScene;
 exports.default = TagScene;
 
-},{"three":180}],298:[function(require,module,exports){
+},{"three":231}],351:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
@@ -28501,7 +31005,7 @@ require("rxjs/add/operator/map");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/share");
 var Component_1 = require("../../Component");
-var TagSet = (function () {
+var TagSet = /** @class */ (function () {
     function TagSet() {
         this._active = false;
         this._hash = {};
@@ -28647,7 +31151,7 @@ var TagSet = (function () {
 exports.TagSet = TagSet;
 exports.default = TagSet;
 
-},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75}],299:[function(require,module,exports){
+},{"../../Component":281,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76}],352:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -28661,7 +31165,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var Error_1 = require("../../../Error");
-var GeometryTagError = (function (_super) {
+var GeometryTagError = /** @class */ (function (_super) {
     __extends(GeometryTagError, _super);
     function GeometryTagError(message) {
         var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
@@ -28673,7 +31177,7 @@ var GeometryTagError = (function (_super) {
 exports.GeometryTagError = GeometryTagError;
 exports.default = Error_1.MapillaryError;
 
-},{"../../../Error":232}],300:[function(require,module,exports){
+},{"../../../Error":283}],353:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
@@ -28682,7 +31186,7 @@ var Subject_1 = require("rxjs/Subject");
  * @abstract
  * @classdesc Represents a geometry.
  */
-var Geometry = (function () {
+var Geometry = /** @class */ (function () {
     /**
      * Create a geometry.
      *
@@ -28712,7 +31216,7 @@ var Geometry = (function () {
 exports.Geometry = Geometry;
 exports.default = Geometry;
 
-},{"rxjs/Subject":34}],301:[function(require,module,exports){
+},{"rxjs/Subject":34}],354:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -28737,7 +31241,7 @@ var Component_1 = require("../../../Component");
  * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
  * ```
  */
-var PointGeometry = (function (_super) {
+var PointGeometry = /** @class */ (function (_super) {
     __extends(PointGeometry, _super);
     /**
      * Create a point geometry.
@@ -28807,7 +31311,7 @@ var PointGeometry = (function (_super) {
 }(Component_1.Geometry));
 exports.PointGeometry = PointGeometry;
 
-},{"../../../Component":230}],302:[function(require,module,exports){
+},{"../../../Component":281}],355:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -28833,7 +31337,7 @@ var Component_1 = require("../../../Component");
  * var polygonGeometry = new Mapillary.TagComponent.PointGeometry(basicPolygon);
  * ```
  */
-var PolygonGeometry = (function (_super) {
+var PolygonGeometry = /** @class */ (function (_super) {
     __extends(PolygonGeometry, _super);
     /**
      * Create a polygon geometry.
@@ -29079,7 +31583,7 @@ var PolygonGeometry = (function (_super) {
 exports.PolygonGeometry = PolygonGeometry;
 exports.default = PolygonGeometry;
 
-},{"../../../Component":230}],303:[function(require,module,exports){
+},{"../../../Component":281}],356:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -29104,7 +31608,7 @@ var Component_1 = require("../../../Component");
  * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
  * ```
  */
-var RectGeometry = (function (_super) {
+var RectGeometry = /** @class */ (function (_super) {
     __extends(RectGeometry, _super);
     /**
      * Create a rectangle geometry.
@@ -29725,7 +32229,7 @@ var RectGeometry = (function (_super) {
 exports.RectGeometry = RectGeometry;
 exports.default = RectGeometry;
 
-},{"../../../Component":230}],304:[function(require,module,exports){
+},{"../../../Component":281}],357:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -29747,7 +32251,7 @@ var Component_1 = require("../../../Component");
  * @abstract
  * @classdesc Represents a vertex geometry.
  */
-var VertexGeometry = (function (_super) {
+var VertexGeometry = /** @class */ (function (_super) {
     __extends(VertexGeometry, _super);
     /**
      * Create a vertex geometry.
@@ -29807,7 +32311,7 @@ var VertexGeometry = (function (_super) {
 exports.VertexGeometry = VertexGeometry;
 exports.default = VertexGeometry;
 
-},{"../../../Component":230,"@mapbox/polylabel":1,"earcut":8}],305:[function(require,module,exports){
+},{"../../../Component":281,"@mapbox/polylabel":1,"earcut":8}],358:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -29823,7 +32327,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
 var Component_1 = require("../../../Component");
-var CreateHandlerBase = (function (_super) {
+var CreateHandlerBase = /** @class */ (function (_super) {
     __extends(CreateHandlerBase, _super);
     function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) {
         var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
@@ -29865,7 +32369,7 @@ var CreateHandlerBase = (function (_super) {
 exports.CreateHandlerBase = CreateHandlerBase;
 exports.default = CreateHandlerBase;
 
-},{"../../../Component":230,"rxjs/Subject":34}],306:[function(require,module,exports){
+},{"../../../Component":281,"rxjs/Subject":34}],359:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -29879,7 +32383,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../../Component");
-var CreatePointHandler = (function (_super) {
+var CreatePointHandler = /** @class */ (function (_super) {
     __extends(CreatePointHandler, _super);
     function CreatePointHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -29905,7 +32409,7 @@ var CreatePointHandler = (function (_super) {
 exports.CreatePointHandler = CreatePointHandler;
 exports.default = CreatePointHandler;
 
-},{"../../../Component":230}],307:[function(require,module,exports){
+},{"../../../Component":281}],360:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -29919,7 +32423,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../../Component");
-var CreatePolygonHandler = (function (_super) {
+var CreatePolygonHandler = /** @class */ (function (_super) {
     __extends(CreatePolygonHandler, _super);
     function CreatePolygonHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -29945,7 +32449,7 @@ var CreatePolygonHandler = (function (_super) {
 exports.CreatePolygonHandler = CreatePolygonHandler;
 exports.default = CreatePolygonHandler;
 
-},{"../../../Component":230}],308:[function(require,module,exports){
+},{"../../../Component":281}],361:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -29960,7 +32464,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../../../Component");
-var CreateRectDragHandler = (function (_super) {
+var CreateRectDragHandler = /** @class */ (function (_super) {
     __extends(CreateRectDragHandler, _super);
     function CreateRectDragHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -30051,7 +32555,7 @@ var CreateRectDragHandler = (function (_super) {
 exports.CreateRectDragHandler = CreateRectDragHandler;
 exports.default = CreateRectDragHandler;
 
-},{"../../../Component":230,"rxjs/Observable":29}],309:[function(require,module,exports){
+},{"../../../Component":281,"rxjs/Observable":29}],362:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -30065,7 +32569,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../../Component");
-var CreateRectHandler = (function (_super) {
+var CreateRectHandler = /** @class */ (function (_super) {
     __extends(CreateRectHandler, _super);
     function CreateRectHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -30109,7 +32613,7 @@ var CreateRectHandler = (function (_super) {
 exports.CreateRectHandler = CreateRectHandler;
 exports.default = CreateRectHandler;
 
-},{"../../../Component":230}],310:[function(require,module,exports){
+},{"../../../Component":281}],363:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -30124,7 +32628,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../../../Component");
-var CreateVertexHandler = (function (_super) {
+var CreateVertexHandler = /** @class */ (function (_super) {
     __extends(CreateVertexHandler, _super);
     function CreateVertexHandler() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -30196,7 +32700,7 @@ var CreateVertexHandler = (function (_super) {
 exports.CreateVertexHandler = CreateVertexHandler;
 exports.default = CreateVertexHandler;
 
-},{"../../../Component":230,"rxjs/Observable":29}],311:[function(require,module,exports){
+},{"../../../Component":281,"rxjs/Observable":29}],364:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -30211,7 +32715,7 @@ var __extends = (this && this.__extends) || (function () {
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
 var Component_1 = require("../../../Component");
-var EditVertexHandler = (function (_super) {
+var EditVertexHandler = /** @class */ (function (_super) {
     __extends(EditVertexHandler, _super);
     function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) {
         var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
@@ -30328,7 +32832,7 @@ var EditVertexHandler = (function (_super) {
 exports.EditVertexHandler = EditVertexHandler;
 exports.default = EditVertexHandler;
 
-},{"../../../Component":230,"rxjs/Observable":29}],312:[function(require,module,exports){
+},{"../../../Component":281,"rxjs/Observable":29}],365:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -30343,7 +32847,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../../../Component");
-var TagHandlerBase = (function (_super) {
+var TagHandlerBase = /** @class */ (function (_super) {
     __extends(TagHandlerBase, _super);
     function TagHandlerBase(component, container, navigator, viewportCoords) {
         var _this = _super.call(this, component, container, navigator) || this;
@@ -30366,7 +32870,7 @@ var TagHandlerBase = (function (_super) {
 exports.TagHandlerBase = TagHandlerBase;
 exports.default = TagHandlerBase;
 
-},{"../../../Component":230}],313:[function(require,module,exports){
+},{"../../../Component":281}],366:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -30375,7 +32879,7 @@ var vd = require("virtual-dom");
 var Subject_1 = require("rxjs/Subject");
 var Component_1 = require("../../../Component");
 var Geo_1 = require("../../../Geo");
-var OutlineCreateTag = (function () {
+var OutlineCreateTag = /** @class */ (function () {
     function OutlineCreateTag(geometry, options, transform, viewportCoords) {
         var _this = this;
         this._geometry = geometry;
@@ -30592,7 +33096,7 @@ var OutlineCreateTag = (function () {
 exports.OutlineCreateTag = OutlineCreateTag;
 exports.default = OutlineCreateTag;
 
-},{"../../../Component":230,"../../../Geo":233,"rxjs/Subject":34,"three":180,"virtual-dom":186}],314:[function(require,module,exports){
+},{"../../../Component":281,"../../../Geo":284,"rxjs/Subject":34,"three":231,"virtual-dom":237}],367:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -30613,7 +33117,7 @@ var Component_1 = require("../../../Component");
  * @class OutlineRenderTag
  * @classdesc Tag visualizing the properties of an OutlineTag.
  */
-var OutlineRenderTag = (function (_super) {
+var OutlineRenderTag = /** @class */ (function (_super) {
     __extends(OutlineRenderTag, _super);
     function OutlineRenderTag(tag, transform) {
         var _this = _super.call(this, tag, transform) || this;
@@ -30957,7 +33461,7 @@ var OutlineRenderTag = (function (_super) {
 }(Component_1.RenderTag));
 exports.OutlineRenderTag = OutlineRenderTag;
 
-},{"../../../Component":230,"three":180,"virtual-dom":186}],315:[function(require,module,exports){
+},{"../../../Component":281,"three":231,"virtual-dom":237}],368:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -30989,7 +33493,7 @@ var Viewer_1 = require("../../../Viewer");
  * tagComponent.add([tag]);
  * ```
  */
-var OutlineTag = (function (_super) {
+var OutlineTag = /** @class */ (function (_super) {
     __extends(OutlineTag, _super);
     /**
      * Create an outline tag.
@@ -31335,13 +33839,13 @@ var OutlineTag = (function (_super) {
 exports.OutlineTag = OutlineTag;
 exports.default = OutlineTag;
 
-},{"../../../Component":230,"../../../Viewer":241,"rxjs/Subject":34}],316:[function(require,module,exports){
+},{"../../../Component":281,"../../../Viewer":292,"rxjs/Subject":34}],369:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
 var Geo_1 = require("../../../Geo");
-var RenderTag = (function () {
+var RenderTag = /** @class */ (function () {
     function RenderTag(tag, transform, viewportCoords) {
         this._tag = tag;
         this._transform = transform;
@@ -31375,7 +33879,7 @@ var RenderTag = (function () {
 exports.RenderTag = RenderTag;
 exports.default = RenderTag;
 
-},{"../../../Geo":233,"rxjs/Subject":34}],317:[function(require,module,exports){
+},{"../../../Geo":284,"rxjs/Subject":34}],370:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -31396,7 +33900,7 @@ var Viewer_1 = require("../../../Viewer");
  * @class SpotRenderTag
  * @classdesc Tag visualizing the properties of a SpotTag.
  */
-var SpotRenderTag = (function (_super) {
+var SpotRenderTag = /** @class */ (function (_super) {
     __extends(SpotRenderTag, _super);
     function SpotRenderTag() {
         return _super !== null && _super.apply(this, arguments) || this;
@@ -31420,24 +33924,24 @@ var SpotRenderTag = (function (_super) {
             if (tag.icon != null) {
                 if (atlas.loaded) {
                     var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
-                    var transform_1 = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                    var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
                     var properties = {
                         onmousedown: interactNone,
                         style: {
                             pointerEvents: "all",
-                            transform: transform_1,
+                            transform: iconTransform,
                         },
                     };
                     vNodes.push(vd.h("div", properties, [sprite]));
                 }
             }
             else if (tag.text != null) {
-                var transform_2 = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
                 var properties = {
                     onmousedown: interactNone,
                     style: {
                         color: this._colorToCss(tag.textColor),
-                        transform: transform_2,
+                        transform: textTransform,
                     },
                     textContent: tag.text,
                 };
@@ -31490,7 +33994,7 @@ var SpotRenderTag = (function (_super) {
 }(Component_1.RenderTag));
 exports.SpotRenderTag = SpotRenderTag;
 
-},{"../../../Component":230,"../../../Viewer":241,"virtual-dom":186}],318:[function(require,module,exports){
+},{"../../../Component":281,"../../../Viewer":292,"virtual-dom":237}],371:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -31520,7 +34024,7 @@ var Component_1 = require("../../../Component");
  * tagComponent.add([tag]);
  * ```
  */
-var SpotTag = (function (_super) {
+var SpotTag = /** @class */ (function (_super) {
     __extends(SpotTag, _super);
     /**
      * Create a spot tag.
@@ -31670,7 +34174,7 @@ var SpotTag = (function (_super) {
 exports.SpotTag = SpotTag;
 exports.default = SpotTag;
 
-},{"../../../Component":230}],319:[function(require,module,exports){
+},{"../../../Component":281}],372:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -31692,7 +34196,7 @@ var Utils_1 = require("../../../Utils");
  * @abstract
  * @classdesc Abstract class representing the basic functionality of for a tag.
  */
-var Tag = (function (_super) {
+var Tag = /** @class */ (function (_super) {
     __extends(Tag, _super);
     /**
      * Create a tag.
@@ -31787,10 +34291,10 @@ var Tag = (function (_super) {
 exports.Tag = Tag;
 exports.default = Tag;
 
-},{"../../../Utils":240,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":75}],320:[function(require,module,exports){
+},{"../../../Utils":291,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":76}],373:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var HandlerBase = (function () {
+var HandlerBase = /** @class */ (function () {
     function HandlerBase(component, container, navigator) {
         this._component = component;
         this._container = container;
@@ -31842,7 +34346,7 @@ var HandlerBase = (function () {
 exports.HandlerBase = HandlerBase;
 exports.default = HandlerBase;
 
-},{}],321:[function(require,module,exports){
+},{}],374:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -31856,7 +34360,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = (function (_super) {
+var ArgumentMapillaryError = /** @class */ (function (_super) {
     __extends(ArgumentMapillaryError, _super);
     function ArgumentMapillaryError(message) {
         var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
@@ -31868,7 +34372,7 @@ var ArgumentMapillaryError = (function (_super) {
 exports.ArgumentMapillaryError = ArgumentMapillaryError;
 exports.default = ArgumentMapillaryError;
 
-},{"./MapillaryError":323}],322:[function(require,module,exports){
+},{"./MapillaryError":376}],375:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -31882,7 +34386,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = (function (_super) {
+var GraphMapillaryError = /** @class */ (function (_super) {
     __extends(GraphMapillaryError, _super);
     function GraphMapillaryError(message) {
         var _this = _super.call(this, message) || this;
@@ -31894,7 +34398,7 @@ var GraphMapillaryError = (function (_super) {
 exports.GraphMapillaryError = GraphMapillaryError;
 exports.default = GraphMapillaryError;
 
-},{"./MapillaryError":323}],323:[function(require,module,exports){
+},{"./MapillaryError":376}],376:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -31907,7 +34411,7 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError = (function (_super) {
+var MapillaryError = /** @class */ (function (_super) {
     __extends(MapillaryError, _super);
     function MapillaryError(message) {
         var _this = _super.call(this, message) || this;
@@ -31919,7 +34423,7 @@ var MapillaryError = (function (_super) {
 exports.MapillaryError = MapillaryError;
 exports.default = MapillaryError;
 
-},{}],324:[function(require,module,exports){
+},{}],377:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -31929,7 +34433,7 @@ var THREE = require("three");
  *
  * @classdesc Holds information about a camera.
  */
-var Camera = (function () {
+var Camera = /** @class */ (function () {
     /**
      * Create a new camera instance.
      * @param {Transform} [transform] - Optional transform instance.
@@ -32069,7 +34573,7 @@ var Camera = (function () {
 }());
 exports.Camera = Camera;
 
-},{"three":180}],325:[function(require,module,exports){
+},{"three":231}],378:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -32141,7 +34645,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
  * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in
  * the first step for both conversions.
  */
-var GeoCoords = (function () {
+var GeoCoords = /** @class */ (function () {
     function GeoCoords() {
         this._wgs84a = 6378137.0;
         this._wgs84b = 6356752.31424518;
@@ -32293,7 +34797,7 @@ var GeoCoords = (function () {
 exports.GeoCoords = GeoCoords;
 exports.default = GeoCoords;
 
-},{}],326:[function(require,module,exports){
+},{}],379:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -32303,7 +34807,7 @@ var THREE = require("three");
  *
  * @classdesc Provides methods for scalar, vector and matrix calculations.
  */
-var Spatial = (function () {
+var Spatial = /** @class */ (function () {
     function Spatial() {
         this._epsilon = 1e-9;
     }
@@ -32522,7 +35026,7 @@ var Spatial = (function () {
 exports.Spatial = Spatial;
 exports.default = Spatial;
 
-},{"three":180}],327:[function(require,module,exports){
+},{"three":231}],380:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -32533,7 +35037,7 @@ var THREE = require("three");
  * @classdesc Class used for calculating coordinate transformations
  * and projections.
  */
-var Transform = (function () {
+var Transform = /** @class */ (function () {
     /**
      * Create a new transform instance.
      * @param {Node} apiNavImIm - Node properties.
@@ -33051,7 +35555,7 @@ var Transform = (function () {
 }());
 exports.Transform = Transform;
 
-},{"three":180}],328:[function(require,module,exports){
+},{"three":231}],381:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -33065,7 +35569,7 @@ var THREE = require("three");
  * Basic coordinates are 2D coordinates on the [0, 1] interval and
  * have the origin point, (0, 0), at the top left corner and the
  * maximum value, (1, 1), at the bottom right corner of the original
- * photo.
+ * image.
  *
  * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
  * have the origin point in the center. The bottom left corner point is
@@ -33078,7 +35582,7 @@ var THREE = require("three");
  *
  * 3D coordinates are in the topocentric world reference frame.
  */
-var ViewportCoords = (function () {
+var ViewportCoords = /** @class */ (function () {
     function ViewportCoords() {
         this._unprojectDepth = 200;
     }
@@ -33425,7 +35929,7 @@ var ViewportCoords = (function () {
 exports.ViewportCoords = ViewportCoords;
 exports.default = ViewportCoords;
 
-},{"three":180}],329:[function(require,module,exports){
+},{"three":231}],382:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -33434,7 +35938,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
  * @classdesc Represents a class for creating node filters. Implementation and
  * definitions based on https://github.com/mapbox/feature-filter.
  */
-var FilterCreator = (function () {
+var FilterCreator = /** @class */ (function () {
     function FilterCreator() {
     }
     /**
@@ -33513,11 +36017,12 @@ var FilterCreator = (function () {
 exports.FilterCreator = FilterCreator;
 exports.default = FilterCreator;
 
-},{}],330:[function(require,module,exports){
+},{}],383:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var rbush = require("rbush");
+var Observable_1 = require("rxjs/Observable");
 var Subject_1 = require("rxjs/Subject");
 require("rxjs/add/observable/from");
 require("rxjs/add/operator/catch");
@@ -33533,7 +36038,7 @@ var Graph_1 = require("../Graph");
  *
  * @classdesc Represents a graph of nodes with edges.
  */
-var Graph = (function () {
+var Graph = /** @class */ (function () {
     /**
      * Create a new graph instance.
      *
@@ -33548,10 +36053,12 @@ var Graph = (function () {
         this._apiV3 = apiV3;
         this._cachedNodes = {};
         this._cachedNodeTiles = {};
+        this._cachedSequenceNodes = {};
         this._cachedSpatialEdges = {};
         this._cachedTiles = {};
         this._cachingFill$ = {};
         this._cachingFull$ = {};
+        this._cachingSequenceNodes$ = {};
         this._cachingSequences$ = {};
         this._cachingSpatialArea$ = {};
         this._cachingTiles$ = {};
@@ -33566,6 +36073,7 @@ var Graph = (function () {
             {
                 maxSequences: 50,
                 maxUnusedNodes: 100,
+                maxUnusedPreStoredNodes: 30,
                 maxUnusedTiles: 20,
             };
         this._nodes = {};
@@ -33737,6 +36245,96 @@ var Graph = (function () {
         var edges = this._edgeCalculator.computeSequenceEdges(node, sequence);
         node.cacheSequenceEdges(edges);
     };
+    /**
+     * Retrieve and cache full nodes for all keys in a sequence.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Graph>} Observable emitting the graph
+     * when the nodes of the sequence has been cached.
+     */
+    Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        var _this = this;
+        if (!this.hasSequence(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ").");
+        }
+        if (this.hasSequenceNodes(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ").");
+        }
+        var sequence = this.getSequence(sequenceKey);
+        if (sequence.key in this._cachingSequenceNodes$) {
+            return this._cachingSequenceNodes$[sequence.key];
+        }
+        var batches = [];
+        var keys = sequence.keys.slice();
+        if (!!referenceNodeKey) {
+            var referenceIndex = keys.indexOf(referenceNodeKey);
+            if (referenceIndex !== -1) {
+                for (var _i = 0, _a = [20, 40]; _i < _a.length; _i++) {
+                    var referenceBatchSize = _a[_i];
+                    if (referenceIndex < keys.length - 1) {
+                        batches.push(keys.splice(referenceIndex, referenceBatchSize));
+                    }
+                    if (referenceIndex > 0) {
+                        var shift = referenceIndex === keys.length - 1 ? 1 : 0;
+                        var batch = keys.splice(Math.max(0, referenceIndex + shift - referenceBatchSize), referenceBatchSize);
+                        batches.push(batch);
+                        referenceIndex -= batch.length;
+                    }
+                }
+            }
+        }
+        var batchSize = 200;
+        while (keys.length > 0) {
+            batches.push(keys.splice(0, batchSize));
+        }
+        var batchesToCache = batches.length;
+        var sequenceNodes$ = Observable_1.Observable
+            .from(batches)
+            .mergeMap(function (batch) {
+            return _this._apiV3.imageByKeyFull$(batch)
+                .do(function (imageByKeyFull) {
+                for (var fullKey in imageByKeyFull) {
+                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {
+                        continue;
+                    }
+                    var fn = imageByKeyFull[fullKey];
+                    if (_this.hasNode(fullKey)) {
+                        var node = _this.getNode(fn.key);
+                        if (!node.full) {
+                            _this._makeFull(node, fn);
+                        }
+                    }
+                    else {
+                        if (fn.sequence == null || fn.sequence.key == null) {
+                            console.warn("Sequence missing, discarding (" + fn.key + ")");
+                        }
+                        var node = new Graph_1.Node(fn);
+                        _this._makeFull(node, fn);
+                        var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
+                        _this._preStore(h, node);
+                        _this._setNode(node);
+                    }
+                }
+                batchesToCache--;
+            })
+                .map(function (imageByKeyFull) {
+                return _this;
+            });
+        }, 6)
+            .last()
+            .finally(function () {
+            delete _this._cachingSequenceNodes$[sequence.key];
+            if (batchesToCache === 0) {
+                _this._cachedSequenceNodes[sequence.key] = true;
+            }
+        })
+            .publish()
+            .refCount();
+        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;
+        return sequenceNodes$;
+    };
     /**
      * Retrieve and cache full nodes for a node spatial area.
      *
@@ -33932,17 +36530,17 @@ var Graph = (function () {
                             continue;
                         }
                         if (preStored != null && coreNode.key in preStored) {
-                            var node_1 = preStored[coreNode.key];
+                            var preStoredNode = preStored[coreNode.key];
                             delete preStored[coreNode.key];
-                            hCache.push(node_1);
-                            var nodeIndexItem_1 = {
-                                lat: node_1.latLon.lat,
-                                lon: node_1.latLon.lon,
-                                node: node_1,
+                            hCache.push(preStoredNode);
+                            var preStoredNodeIndexItem = {
+                                lat: preStoredNode.latLon.lat,
+                                lon: preStoredNode.latLon.lon,
+                                node: preStoredNode,
                             };
-                            _this._nodeIndex.insert(nodeIndexItem_1);
-                            _this._nodeIndexTiles[h].push(nodeIndexItem_1);
-                            _this._nodeToTile[node_1.key] = h;
+                            _this._nodeIndex.insert(preStoredNodeIndexItem);
+                            _this._nodeIndexTiles[h].push(preStoredNodeIndexItem);
+                            _this._nodeToTile[preStoredNode.key] = h;
                             continue;
                         }
                         var node = new Graph_1.Node(coreNode);
@@ -34063,6 +36661,16 @@ var Graph = (function () {
     Graph.prototype.isCachingSequence = function (sequenceKey) {
         return sequenceKey in this._cachingSequences$;
     };
+    /**
+     * Get a value indicating if the graph is caching sequence nodes.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if the sequence nodes are
+     * being cached.
+     */
+    Graph.prototype.isCachingSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachingSequenceNodes$;
+    };
     /**
      * Get a value indicating if the graph is caching the tiles
      * required for calculating spatial edges of a node.
@@ -34129,6 +36737,16 @@ var Graph = (function () {
         }
         return hasSequence;
     };
+    /**
+     * Get a value indicating if sequence nodes has been cached in the graph.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if a sequence nodes has been
+     * cached in the graph.
+     */
+    Graph.prototype.hasSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachedSequenceNodes;
+    };
     /**
      * Get a value indicating if the graph has fully cached
      * all nodes in the spatial area of a node.
@@ -34313,12 +36931,15 @@ var Graph = (function () {
      * @param {Array<string>} keepKeys - Keys of nodes to keep in
      * graph unrelated to last access. Tiles related to those keys
      * will also be kept in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
      */
-    Graph.prototype.uncache = function (keepKeys) {
+    Graph.prototype.uncache = function (keepKeys, keepSequenceKey) {
         var keysInUse = {};
         this._addNewKeys(keysInUse, this._cachingFull$);
         this._addNewKeys(keysInUse, this._cachingFill$);
-        this._addNewKeys(keysInUse, this._cachingTiles$);
         this._addNewKeys(keysInUse, this._cachingSpatialArea$);
         this._addNewKeys(keysInUse, this._requiredNodeTiles);
         this._addNewKeys(keysInUse, this._requiredSpatialArea);
@@ -34360,8 +36981,43 @@ var Graph = (function () {
         });
         for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) {
             var uncacheH = uncacheHs_1[_b];
-            this._uncacheTile(uncacheH);
+            this._uncacheTile(uncacheH, keepSequenceKey);
+        }
+        var potentialPreStored = [];
+        var nonCachedPreStored = [];
+        for (var h in this._preStored) {
+            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {
+                continue;
+            }
+            var prestoredNodes = this._preStored[h];
+            for (var key in prestoredNodes) {
+                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {
+                    continue;
+                }
+                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {
+                    continue;
+                }
+                if (key in this._cachedNodes) {
+                    potentialPreStored.push([this._cachedNodes[key], h]);
+                }
+                else {
+                    nonCachedPreStored.push([key, h]);
+                }
+            }
         }
+        var uncachePreStored = potentialPreStored
+            .sort(function (_a, _b) {
+            var na1 = _a[0], h1 = _a[1];
+            var na2 = _b[0], h2 = _b[1];
+            return na2.accessed - na1.accessed;
+        })
+            .slice(this._configuration.maxUnusedPreStoredNodes)
+            .map(function (_a) {
+            var na = _a[0], h = _a[1];
+            return [na.node.key, h];
+        });
+        this._uncachePreStored(nonCachedPreStored);
+        this._uncachePreStored(uncachePreStored);
         var potentialNodes = [];
         for (var key in this._cachedNodes) {
             if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {
@@ -34389,7 +37045,8 @@ var Graph = (function () {
         var potentialSequences = [];
         for (var sequenceKey in this._sequences) {
             if (!this._sequences.hasOwnProperty(sequenceKey) ||
-                sequenceKey in this._cachingSequences$) {
+                sequenceKey in this._cachingSequences$ ||
+                sequenceKey === keepSequenceKey) {
                 continue;
             }
             potentialSequences.push(this._sequences[sequenceKey]);
@@ -34403,6 +37060,9 @@ var Graph = (function () {
             var sequenceAccess = uncacheSequences_1[_d];
             var sequenceKey = sequenceAccess.sequence.key;
             delete this._sequences[sequenceKey];
+            if (sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[sequenceKey];
+            }
             sequenceAccess.sequence.dispose();
         }
     };
@@ -34474,11 +37134,10 @@ var Graph = (function () {
         }
         this._nodes[key] = node;
     };
-    Graph.prototype._uncacheTile = function (h) {
+    Graph.prototype._uncacheTile = function (h, keepSequenceKey) {
         for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
             var node = _a[_i];
             var key = node.key;
-            delete this._nodes[key];
             delete this._nodeToTile[key];
             if (key in this._cachedNodes) {
                 delete this._cachedNodes[key];
@@ -34489,7 +37148,17 @@ var Graph = (function () {
             if (key in this._cachedSpatialEdges) {
                 delete this._cachedSpatialEdges[key];
             }
-            node.dispose();
+            if (node.sequenceKey === keepSequenceKey) {
+                this._preStore(h, node);
+                node.uncache();
+            }
+            else {
+                delete this._nodes[key];
+                if (node.sequenceKey in this._cachedSequenceNodes) {
+                    delete this._cachedSequenceNodes[node.sequenceKey];
+                }
+                node.dispose();
+            }
         }
         for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) {
             var nodeIndexItem = _c[_b];
@@ -34498,6 +37167,33 @@ var Graph = (function () {
         delete this._nodeIndexTiles[h];
         delete this._cachedTiles[h];
     };
+    Graph.prototype._uncachePreStored = function (preStored) {
+        var hs = {};
+        for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) {
+            var _a = preStored_1[_i], key = _a[0], h = _a[1];
+            if (key in this._nodes) {
+                delete this._nodes[key];
+            }
+            if (key in this._cachedNodes) {
+                delete this._cachedNodes[key];
+            }
+            var node = this._preStored[h][key];
+            if (node.sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[node.sequenceKey];
+            }
+            delete this._preStored[h][key];
+            node.dispose();
+            hs[h] = true;
+        }
+        for (var h in hs) {
+            if (!hs.hasOwnProperty(h)) {
+                continue;
+            }
+            if (Object.keys(this._preStored[h]).length === 0) {
+                delete this._preStored[h];
+            }
+        }
+    };
     Graph.prototype._updateCachedTileAccess = function (key, accessed) {
         if (key in this._nodeToTile) {
             this._cachedTiles[this._nodeToTile[key]].accessed = accessed;
@@ -34513,14 +37209,14 @@ var Graph = (function () {
 exports.Graph = Graph;
 exports.default = Graph;
 
-},{"../Edge":231,"../Error":232,"../Graph":234,"rbush":25,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],331:[function(require,module,exports){
+},{"../Edge":282,"../Error":283,"../Graph":285,"rbush":25,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],384:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var geohash = require("latlon-geohash");
 var THREE = require("three");
 var Geo_1 = require("../Geo");
-var GeoHashDirections = (function () {
+var GeoHashDirections = /** @class */ (function () {
     function GeoHashDirections() {
     }
     GeoHashDirections.n = "n";
@@ -34538,7 +37234,7 @@ var GeoHashDirections = (function () {
  *
  * @classdesc Represents a calculator for graph entities.
  */
-var GraphCalculator = (function () {
+var GraphCalculator = /** @class */ (function () {
     /**
      * Create a new graph calculator instance.
      *
@@ -34675,7 +37371,39 @@ var GraphCalculator = (function () {
 exports.GraphCalculator = GraphCalculator;
 exports.default = GraphCalculator;
 
-},{"../Geo":233,"latlon-geohash":21,"three":180}],332:[function(require,module,exports){
+},{"../Geo":284,"latlon-geohash":21,"three":231}],385:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+/**
+ * Enumeration for graph modes.
+ * @enum {number}
+ * @readonly
+ * @description Modes for the retrieval and caching performed
+ * by the graph service on the graph.
+ */
+var GraphMode;
+(function (GraphMode) {
+    /**
+     * Caching is performed on sequences only and sequence edges are
+     * calculated. Spatial tiles
+     * are not retrieved and spatial edges are not calculated when
+     * caching nodes. Complete sequences are being cached for requested
+     * nodes within the graph.
+     */
+    GraphMode[GraphMode["Sequence"] = 0] = "Sequence";
+    /**
+     * Caching is performed with emphasis on spatial data. Sequence edges
+     * as well as spatial edges are cached. Sequence data
+     * is still requested but complete sequences are not being cached
+     * for requested nodes.
+     *
+     * This is the initial mode of the graph service.
+     */
+    GraphMode[GraphMode["Spatial"] = 1] = "Spatial";
+})(GraphMode = exports.GraphMode || (exports.GraphMode = {}));
+exports.default = GraphMode;
+
+},{}],386:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
@@ -34690,12 +37418,13 @@ require("rxjs/add/operator/last");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/mergeMap");
 require("rxjs/add/operator/publishReplay");
+var Graph_1 = require("../Graph");
 /**
  * @class GraphService
  *
  * @classdesc Represents a service for graph operations.
  */
-var GraphService = (function () {
+var GraphService = /** @class */ (function () {
     /**
      * Create a new graph service instance.
      *
@@ -34708,12 +37437,34 @@ var GraphService = (function () {
             .publishReplay(1)
             .refCount();
         this._graph$.subscribe(function () { });
+        this._graphMode = Graph_1.GraphMode.Spatial;
+        this._graphModeSubject$ = new Subject_1.Subject();
+        this._graphMode$ = this._graphModeSubject$
+            .startWith(this._graphMode)
+            .publishReplay(1)
+            .refCount();
+        this._graphMode$.subscribe(function () { });
         this._imageLoadingService = imageLoadingService;
         this._firstGraphSubjects$ = [];
         this._initializeCacheSubscriptions = [];
         this._sequenceSubscriptions = [];
         this._spatialSubscriptions = [];
     }
+    Object.defineProperty(GraphService.prototype, "graphMode$", {
+        /**
+         * Get graph mode observable.
+         *
+         * @description Emits the current graph mode.
+         *
+         * @returns {Observable<GraphMode>} Observable
+         * emitting the current graph mode when it changes.
+         */
+        get: function () {
+            return this._graphMode$;
+        },
+        enumerable: true,
+        configurable: true
+    });
     /**
      * Cache a node in the graph and retrieve it.
      *
@@ -34787,13 +37538,16 @@ var GraphService = (function () {
         if (!initializeCacheSubscription.closed) {
             this._initializeCacheSubscriptions.push(initializeCacheSubscription);
         }
-        var sequenceSubscription = firstGraph$
+        var graphSequence$ = firstGraph$
             .mergeMap(function (graph) {
             if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
                 return graph.cacheNodeSequence$(key);
             }
             return Observable_1.Observable.of(graph);
         })
+            .publishReplay(1)
+            .refCount();
+        var sequenceSubscription = graphSequence$
             .do(function (graph) {
             if (!graph.getNode(key).sequenceEdges.cached) {
                 graph.cacheSequenceEdges(key);
@@ -34811,64 +37565,66 @@ var GraphService = (function () {
         if (!sequenceSubscription.closed) {
             this._sequenceSubscriptions.push(sequenceSubscription);
         }
-        var spatialSubscription = firstGraph$
-            .expand(function (graph) {
-            if (graph.hasTiles(key)) {
-                return Observable_1.Observable.empty();
-            }
-            return Observable_1.Observable
-                .from(graph.cacheTiles$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .mergeMap(function (g) {
-                    if (g.isCachingTiles(key)) {
-                        return Observable_1.Observable.empty();
-                    }
-                    return Observable_1.Observable.of(g);
-                })
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache tile data (" + key + ").", error);
+        if (this._graphMode === Graph_1.GraphMode.Spatial) {
+            var spatialSubscription_1 = firstGraph$
+                .expand(function (graph) {
+                if (graph.hasTiles(key)) {
                     return Observable_1.Observable.empty();
+                }
+                return Observable_1.Observable
+                    .from(graph.cacheTiles$(key))
+                    .mergeMap(function (graph$) {
+                    return graph$
+                        .mergeMap(function (g) {
+                        if (g.isCachingTiles(key)) {
+                            return Observable_1.Observable.empty();
+                        }
+                        return Observable_1.Observable.of(g);
+                    })
+                        .catch(function (error, caught$) {
+                        console.error("Failed to cache tile data (" + key + ").", error);
+                        return Observable_1.Observable.empty();
+                    });
                 });
-            });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            if (graph.hasSpatialArea(key)) {
-                return Observable_1.Observable.of(graph);
-            }
-            return Observable_1.Observable
-                .from(graph.cacheSpatialArea$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache spatial nodes (" + key + ").", error);
-                    return Observable_1.Observable.empty();
+            })
+                .last()
+                .mergeMap(function (graph) {
+                if (graph.hasSpatialArea(key)) {
+                    return Observable_1.Observable.of(graph);
+                }
+                return Observable_1.Observable
+                    .from(graph.cacheSpatialArea$(key))
+                    .mergeMap(function (graph$) {
+                    return graph$
+                        .catch(function (error, caught$) {
+                        console.error("Failed to cache spatial nodes (" + key + ").", error);
+                        return Observable_1.Observable.empty();
+                    });
                 });
+            })
+                .last()
+                .mergeMap(function (graph) {
+                return graph.hasNodeSequence(key) ?
+                    Observable_1.Observable.of(graph) :
+                    graph.cacheNodeSequence$(key);
+            })
+                .do(function (graph) {
+                if (!graph.getNode(key).spatialEdges.cached) {
+                    graph.cacheSpatialEdges(key);
+                }
+            })
+                .finally(function () {
+                if (spatialSubscription_1 == null) {
+                    return;
+                }
+                _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions);
+            })
+                .subscribe(function (graph) { return; }, function (error) {
+                console.error("Failed to cache spatial edges (" + key + ").", error);
             });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            return graph.hasNodeSequence(key) ?
-                Observable_1.Observable.of(graph) :
-                graph.cacheNodeSequence$(key);
-        })
-            .do(function (graph) {
-            if (!graph.getNode(key).spatialEdges.cached) {
-                graph.cacheSpatialEdges(key);
+            if (!spatialSubscription_1.closed) {
+                this._spatialSubscriptions.push(spatialSubscription_1);
             }
-        })
-            .finally(function () {
-            if (spatialSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(spatialSubscription, _this._spatialSubscriptions);
-        })
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache spatial edges (" + key + ").", error);
-        });
-        if (!spatialSubscription.closed) {
-            this._spatialSubscriptions.push(spatialSubscription);
         }
         return node$
             .first(function (node) {
@@ -34896,6 +37652,40 @@ var GraphService = (function () {
             return graph.getSequence(sequenceKey);
         });
     };
+    /**
+     * Cache a sequence and its nodes in the graph and retrieve the sequence.
+     *
+     * @description Caches a sequence and its assets are cached and
+     * retrieves all nodes belonging to the sequence. The node assets
+     * or edges will not be cached.
+     *
+     * @param {string} sequenceKey - Sequence key.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Sequence>} Observable emitting a single item,
+     * the sequence, when it has been retrieved, its assets are cached and
+     * all nodes belonging to the sequence has been retrieved.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        return this._graph$
+            .first()
+            .mergeMap(function (graph) {
+            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
+                return graph.cacheSequence$(sequenceKey);
+            }
+            return Observable_1.Observable.of(graph);
+        })
+            .mergeMap(function (graph) {
+            if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {
+                return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);
+            }
+            return Observable_1.Observable.of(graph);
+        })
+            .map(function (graph) {
+            return graph.getSequence(sequenceKey);
+        });
+    };
     /**
      * Set a spatial edge filter on the graph.
      *
@@ -34912,8 +37702,34 @@ var GraphService = (function () {
             .do(function (graph) {
             graph.resetSpatialEdges();
             graph.setFilter(filter);
+        })
+            .map(function (graph) {
+            return undefined;
         });
     };
+    /**
+     * Set the graph mode.
+     *
+     * @description If graph mode is set to spatial, caching
+     * is performed with emphasis on spatial edges. If graph
+     * mode is set to sequence no tile data is requested and
+     * no spatial edges are computed.
+     *
+     * When setting graph mode to sequence all spatial
+     * subscriptions are aborted.
+     *
+     * @param {GraphMode} mode - Graph mode to set.
+     */
+    GraphService.prototype.setGraphMode = function (mode) {
+        if (this._graphMode === mode) {
+            return;
+        }
+        if (mode === Graph_1.GraphMode.Sequence) {
+            this._resetSubscriptions(this._spatialSubscriptions);
+        }
+        this._graphMode = mode;
+        this._graphModeSubject$.next(this._graphMode);
+    };
     /**
      * Reset the graph.
      *
@@ -34933,6 +37749,9 @@ var GraphService = (function () {
             .first()
             .do(function (graph) {
             graph.reset(keepKeys);
+        })
+            .map(function (graph) {
+            return undefined;
         });
     };
     /**
@@ -34943,14 +37762,21 @@ var GraphService = (function () {
      * related to those nodes.
      *
      * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
      * @return {Observable<Graph>} Observable emitting a single item,
      * the graph, when the graph has been uncached.
      */
-    GraphService.prototype.uncache$ = function (keepKeys) {
+    GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) {
         return this._graph$
             .first()
             .do(function (graph) {
-            graph.uncache(keepKeys);
+            graph.uncache(keepKeys, keepSequenceKey);
+        })
+            .map(function (graph) {
+            return undefined;
         });
     };
     GraphService.prototype._abortSubjects = function (subjects) {
@@ -34980,19 +37806,38 @@ var GraphService = (function () {
 exports.GraphService = GraphService;
 exports.default = GraphService;
 
-},{"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],333:[function(require,module,exports){
+},{"../Graph":285,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],387:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var Subject_1 = require("rxjs/Subject");
-var ImageLoadingService = (function () {
+var ImageLoadingService = /** @class */ (function () {
     function ImageLoadingService() {
         this._loadnode$ = new Subject_1.Subject();
         this._loadstatus$ = this._loadnode$
-            .scan(function (nodes, node) {
-            nodes[node.key] = node.loadStatus;
+            .scan(function (_a, node) {
+            var nodes = _a[0];
+            var changed = false;
+            if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {
+                if (node.key in nodes) {
+                    delete nodes[node.key];
+                    changed = true;
+                }
+            }
+            else {
+                nodes[node.key] = node.loadStatus;
+                changed = true;
+            }
+            return [nodes, changed];
+        }, [{}, false])
+            .filter(function (_a) {
+            var nodes = _a[0], changed = _a[1];
+            return changed;
+        })
+            .map(function (_a) {
+            var nodes = _a[0];
             return nodes;
-        }, {})
+        })
             .publishReplay(1)
             .refCount();
         this._loadstatus$.subscribe(function () { });
@@ -35015,12 +37860,12 @@ var ImageLoadingService = (function () {
 }());
 exports.ImageLoadingService = ImageLoadingService;
 
-},{"rxjs/Subject":34}],334:[function(require,module,exports){
+},{"rxjs/Subject":34}],388:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var Pbf = require("pbf");
-var MeshReader = (function () {
+var MeshReader = /** @class */ (function () {
     function MeshReader() {
     }
     MeshReader.read = function (buffer) {
@@ -35039,7 +37884,7 @@ var MeshReader = (function () {
 }());
 exports.MeshReader = MeshReader;
 
-},{"pbf":23}],335:[function(require,module,exports){
+},{"pbf":23}],389:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 require("rxjs/add/observable/combineLatest");
@@ -35073,7 +37918,7 @@ require("rxjs/add/operator/map");
  * The same concept as above also applies to the compass angle (or bearing) properties
  * `originalCa`, `computedCa` and `ca`.
  */
-var Node = (function () {
+var Node = /** @class */ (function () {
     /**
      * Create a new node instance.
      *
@@ -35682,7 +38527,7 @@ var Node = (function () {
 exports.Node = Node;
 exports.default = Node;
 
-},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],336:[function(require,module,exports){
+},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],390:[function(require,module,exports){
 (function (Buffer){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -35697,7 +38542,7 @@ var Utils_1 = require("../Utils");
  *
  * @classdesc Represents the cached properties of a node.
  */
-var NodeCache = (function () {
+var NodeCache = /** @class */ (function () {
     /**
      * Create a new node cache instance.
      */
@@ -36089,7 +38934,7 @@ exports.default = NodeCache;
 
 }).call(this,require("buffer").Buffer)
 
-},{"../Graph":234,"../Utils":240,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],337:[function(require,module,exports){
+},{"../Graph":285,"../Utils":291,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],391:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -36099,7 +38944,7 @@ var _ = require("underscore");
  *
  * @classdesc Represents a sequence of ordered nodes.
  */
-var Sequence = (function () {
+var Sequence = /** @class */ (function () {
     /**
      * Create a new sequene instance.
      *
@@ -36179,7 +39024,7 @@ var Sequence = (function () {
 exports.Sequence = Sequence;
 exports.default = Sequence;
 
-},{"underscore":182}],338:[function(require,module,exports){
+},{"underscore":233}],392:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -36192,7 +39037,7 @@ var Geo_1 = require("../../Geo");
  *
  * @classdesc Represents a class for calculating node edges.
  */
-var EdgeCalculator = (function () {
+var EdgeCalculator = /** @class */ (function () {
     /**
      * Create a new edge calculator instance.
      *
@@ -36782,10 +39627,10 @@ var EdgeCalculator = (function () {
 exports.EdgeCalculator = EdgeCalculator;
 exports.default = EdgeCalculator;
 
-},{"../../Edge":231,"../../Error":232,"../../Geo":233,"three":180}],339:[function(require,module,exports){
+},{"../../Edge":282,"../../Error":283,"../../Geo":284,"three":231}],393:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorCoefficients = (function () {
+var EdgeCalculatorCoefficients = /** @class */ (function () {
     function EdgeCalculatorCoefficients() {
         this.panoPreferredDistance = 2;
         this.panoMotion = 2;
@@ -36808,11 +39653,11 @@ var EdgeCalculatorCoefficients = (function () {
 exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
 exports.default = EdgeCalculatorCoefficients;
 
-},{}],340:[function(require,module,exports){
+},{}],394:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = (function () {
+var EdgeCalculatorDirections = /** @class */ (function () {
     function EdgeCalculatorDirections() {
         this.steps = {};
         this.turns = {};
@@ -36881,10 +39726,10 @@ var EdgeCalculatorDirections = (function () {
 }());
 exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
 
-},{"../../Edge":231}],341:[function(require,module,exports){
+},{"../../Edge":282}],395:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorSettings = (function () {
+var EdgeCalculatorSettings = /** @class */ (function () {
     function EdgeCalculatorSettings() {
         this.panoMinDistance = 0.1;
         this.panoMaxDistance = 20;
@@ -36918,7 +39763,7 @@ var EdgeCalculatorSettings = (function () {
 exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
 exports.default = EdgeCalculatorSettings;
 
-},{}],342:[function(require,module,exports){
+},{}],396:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -36976,7 +39821,7 @@ var EdgeDirection;
     EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
 })(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {}));
 
-},{}],343:[function(require,module,exports){
+},{}],397:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -36990,7 +39835,7 @@ require("rxjs/add/operator/map");
 require("rxjs/add/operator/pluck");
 require("rxjs/add/operator/scan");
 var Render_1 = require("../Render");
-var DOMRenderer = (function () {
+var DOMRenderer = /** @class */ (function () {
     function DOMRenderer(element, renderService, currentFrame$) {
         this._adaptiveOperation$ = new Subject_1.Subject();
         this._render$ = new Subject_1.Subject();
@@ -37164,7 +40009,7 @@ var DOMRenderer = (function () {
 exports.DOMRenderer = DOMRenderer;
 exports.default = DOMRenderer;
 
-},{"../Render":236,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":74,"underscore":182,"virtual-dom":186}],344:[function(require,module,exports){
+},{"../Render":287,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":75,"underscore":233,"virtual-dom":237}],398:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var GLRenderStage;
@@ -37174,7 +40019,7 @@ var GLRenderStage;
 })(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
 exports.default = GLRenderStage;
 
-},{}],345:[function(require,module,exports){
+},{}],399:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -37193,7 +40038,7 @@ require("rxjs/add/operator/share");
 require("rxjs/add/operator/startWith");
 var Render_1 = require("../Render");
 var Utils_1 = require("../Utils");
-var GLRenderer = (function () {
+var GLRenderer = /** @class */ (function () {
     function GLRenderer(canvasContainer, renderService, dom) {
         var _this = this;
         this._renderFrame$ = new Subject_1.Subject();
@@ -37426,14 +40271,14 @@ var GLRenderer = (function () {
 exports.GLRenderer = GLRenderer;
 exports.default = GLRenderer;
 
-},{"../Render":236,"../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/startWith":79,"three":180}],346:[function(require,module,exports){
+},{"../Render":287,"../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/startWith":80,"three":231}],400:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
 var Geo_1 = require("../Geo");
 var Render_1 = require("../Render");
-var RenderCamera = (function () {
+var RenderCamera = /** @class */ (function () {
     function RenderCamera(elementWidth, elementHeight, renderMode) {
         this.alpha = -1;
         this.zoom = 0;
@@ -37552,7 +40397,7 @@ var RenderCamera = (function () {
 exports.RenderCamera = RenderCamera;
 exports.default = RenderCamera;
 
-},{"../Geo":233,"../Render":236,"three":180}],347:[function(require,module,exports){
+},{"../Geo":284,"../Render":287,"three":231}],401:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -37588,7 +40433,7 @@ var RenderMode;
 })(RenderMode = exports.RenderMode || (exports.RenderMode = {}));
 exports.default = RenderMode;
 
-},{}],348:[function(require,module,exports){
+},{}],402:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -37605,7 +40450,7 @@ require("rxjs/add/operator/startWith");
 require("rxjs/add/operator/withLatestFrom");
 var Geo_1 = require("../Geo");
 var Render_1 = require("../Render");
-var RenderService = (function () {
+var RenderService = /** @class */ (function () {
     function RenderService(element, currentFrame$, renderMode) {
         var _this = this;
         this._element = element;
@@ -37764,7 +40609,7 @@ var RenderService = (function () {
 exports.RenderService = RenderService;
 exports.default = RenderService;
 
-},{"../Geo":233,"../Render":236,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/skip":76,"rxjs/add/operator/startWith":79,"rxjs/add/operator/withLatestFrom":85}],349:[function(require,module,exports){
+},{"../Geo":284,"../Render":287,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/skip":77,"rxjs/add/operator/startWith":80,"rxjs/add/operator/withLatestFrom":87}],403:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var State;
@@ -37774,12 +40619,12 @@ var State;
 })(State = exports.State || (exports.State = {}));
 exports.default = State;
 
-},{}],350:[function(require,module,exports){
+},{}],404:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var State_1 = require("../State");
 var Geo_1 = require("../Geo");
-var StateContext = (function () {
+var StateContext = /** @class */ (function () {
     function StateContext() {
         this._state = new State_1.TraversingState({
             alpha: 1,
@@ -37964,11 +40809,14 @@ var StateContext = (function () {
     StateContext.prototype.zoomIn = function (delta, reference) {
         this._state.zoomIn(delta, reference);
     };
+    StateContext.prototype.setSpeed = function (speed) {
+        this._state.setSpeed(speed);
+    };
     return StateContext;
 }());
 exports.StateContext = StateContext;
 
-},{"../Geo":233,"../State":237}],351:[function(require,module,exports){
+},{"../Geo":284,"../State":288}],405:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
@@ -37987,7 +40835,7 @@ require("rxjs/add/operator/startWith");
 require("rxjs/add/operator/switchMap");
 require("rxjs/add/operator/withLatestFrom");
 var State_1 = require("../State");
-var StateService = (function () {
+var StateService = /** @class */ (function () {
     function StateService() {
         var _this = this;
         this._appendNode$ = new Subject_1.Subject();
@@ -38340,6 +41188,9 @@ var StateService = (function () {
         this._inMotionOperation$.next(true);
         this._invokeContextOperation(function (context) { context.setCenter(center); });
     };
+    StateService.prototype.setSpeed = function (speed) {
+        this._invokeContextOperation(function (context) { context.setSpeed(speed); });
+    };
     StateService.prototype.setZoom = function (zoom) {
         this._inMotionOperation$.next(true);
         this._invokeContextOperation(function (context) { context.setZoom(zoom); });
@@ -38372,13 +41223,13 @@ var StateService = (function () {
 }());
 exports.StateService = StateService;
 
-},{"../State":237,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/util/AnimationFrame":161}],352:[function(require,module,exports){
+},{"../State":288,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87,"rxjs/util/AnimationFrame":208}],406:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var Error_1 = require("../../Error");
 var Geo_1 = require("../../Geo");
-var StateBase = (function () {
+var StateBase = /** @class */ (function () {
     function StateBase(state) {
         this._spatial = new Geo_1.Spatial();
         this._geoCoords = new Geo_1.GeoCoords();
@@ -38686,7 +41537,7 @@ var StateBase = (function () {
 }());
 exports.StateBase = StateBase;
 
-},{"../../Error":232,"../../Geo":233}],353:[function(require,module,exports){
+},{"../../Error":283,"../../Geo":284}],407:[function(require,module,exports){
 "use strict";
 /// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -38703,7 +41554,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
 var UnitBezier = require("@mapbox/unitbezier");
 var State_1 = require("../../State");
-var RotationDelta = (function () {
+var RotationDelta = /** @class */ (function () {
     function RotationDelta(phi, theta) {
         this._phi = phi;
         this._theta = theta;
@@ -38760,14 +41611,15 @@ var RotationDelta = (function () {
     };
     return RotationDelta;
 }());
-var TraversingState = (function (_super) {
+var TraversingState = /** @class */ (function (_super) {
     __extends(TraversingState, _super);
     function TraversingState(state) {
         var _this = _super.call(this, state) || this;
         _this._adjustCameras();
         _this._motionless = _this._motionlessTransition();
         _this._baseAlpha = _this._alpha;
-        _this._animationSpeed = 0.025;
+        _this._animationSpeed = 1 / 40;
+        _this._speedCoefficient = 1;
         _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
         _this._useBezier = false;
         _this._rotationDelta = new RotationDelta(0, 0);
@@ -38905,6 +41757,9 @@ var TraversingState = (function (_super) {
         var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
         this._currentCamera.lookat.fromArray(lookat);
     };
+    TraversingState.prototype.setSpeed = function (speed) {
+        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);
+    };
     TraversingState.prototype.zoomIn = function (delta, reference) {
         if (this._currentNode == null) {
             return;
@@ -38988,7 +41843,7 @@ var TraversingState = (function (_super) {
             this._desiredLookat = null;
         }
         var animationSpeed = this._animationSpeed * (60 / fps);
-        this._baseAlpha = Math.min(1, this._baseAlpha + animationSpeed);
+        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);
         if (this._useBezier) {
             this._alpha = this._unitBezier.solve(this._baseAlpha);
         }
@@ -39231,7 +42086,7 @@ var TraversingState = (function (_super) {
 }(State_1.StateBase));
 exports.TraversingState = TraversingState;
 
-},{"../../State":237,"@mapbox/unitbezier":2,"three":180}],354:[function(require,module,exports){
+},{"../../State":288,"@mapbox/unitbezier":2,"three":231}],408:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
     var extendStatics = Object.setPrototypeOf ||
@@ -39245,7 +42100,7 @@ var __extends = (this && this.__extends) || (function () {
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
 var State_1 = require("../../State");
-var WaitingState = (function (_super) {
+var WaitingState = /** @class */ (function (_super) {
     __extends(WaitingState, _super);
     function WaitingState(state) {
         var _this = _super.call(this, state) || this;
@@ -39273,6 +42128,7 @@ var WaitingState = (function (_super) {
     WaitingState.prototype.rotateBasicUnbounded = function (basicRotation) { return; };
     WaitingState.prototype.rotateBasicWithoutInertia = function (basicRotation) { return; };
     WaitingState.prototype.rotateToBasic = function (basic) { return; };
+    WaitingState.prototype.setSpeed = function (speed) { return; };
     WaitingState.prototype.zoomIn = function (delta, reference) { return; };
     WaitingState.prototype.move = function (delta) {
         this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
@@ -39309,7 +42165,7 @@ var WaitingState = (function (_super) {
 }(State_1.StateBase));
 exports.WaitingState = WaitingState;
 
-},{"../../State":237}],355:[function(require,module,exports){
+},{"../../State":288}],409:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
@@ -39318,7 +42174,7 @@ var Observable_1 = require("rxjs/Observable");
  *
  * @classdesc Represents a loader of image tiles.
  */
-var ImageTileLoader = (function () {
+var ImageTileLoader = /** @class */ (function () {
     /**
      * Create a new node image tile loader instance.
      *
@@ -39401,7 +42257,7 @@ var ImageTileLoader = (function () {
 exports.ImageTileLoader = ImageTileLoader;
 exports.default = ImageTileLoader;
 
-},{"rxjs/Observable":29}],356:[function(require,module,exports){
+},{"rxjs/Observable":29}],410:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -39409,7 +42265,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
  *
  * @classdesc Represents a store for image tiles.
  */
-var ImageTileStore = (function () {
+var ImageTileStore = /** @class */ (function () {
     /**
      * Create a new node image tile store instance.
      */
@@ -39469,7 +42325,7 @@ var ImageTileStore = (function () {
 exports.ImageTileStore = ImageTileStore;
 exports.default = ImageTileStore;
 
-},{}],357:[function(require,module,exports){
+},{}],411:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -39479,7 +42335,7 @@ var Geo_1 = require("../Geo");
  *
  * @classdesc Represents a calculator for regions of interest.
  */
-var RegionOfInterestCalculator = (function () {
+var RegionOfInterestCalculator = /** @class */ (function () {
     function RegionOfInterestCalculator() {
         this._viewportCoords = new Geo_1.ViewportCoords();
     }
@@ -39610,7 +42466,7 @@ var RegionOfInterestCalculator = (function () {
 exports.RegionOfInterestCalculator = RegionOfInterestCalculator;
 exports.default = RegionOfInterestCalculator;
 
-},{"../Geo":233}],358:[function(require,module,exports){
+},{"../Geo":284}],412:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -39621,7 +42477,7 @@ var Subject_1 = require("rxjs/Subject");
  *
  * @classdesc Represents a provider of textures.
  */
-var TextureProvider = (function () {
+var TextureProvider = /** @class */ (function () {
     /**
      * Create a new node texture provider instance.
      *
@@ -40091,10 +42947,10 @@ var TextureProvider = (function () {
 exports.TextureProvider = TextureProvider;
 exports.default = TextureProvider;
 
-},{"rxjs/Subject":34,"three":180}],359:[function(require,module,exports){
+},{"rxjs/Subject":34,"three":231}],413:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var DOM = (function () {
+var DOM = /** @class */ (function () {
     function DOM(doc) {
         this._document = !!doc ? doc : document;
     }
@@ -40120,10 +42976,10 @@ var DOM = (function () {
 exports.DOM = DOM;
 exports.default = DOM;
 
-},{}],360:[function(require,module,exports){
+},{}],414:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EventEmitter = (function () {
+var EventEmitter = /** @class */ (function () {
     function EventEmitter() {
         this._events = {};
     }
@@ -40179,11 +43035,11 @@ var EventEmitter = (function () {
 exports.EventEmitter = EventEmitter;
 exports.default = EventEmitter;
 
-},{}],361:[function(require,module,exports){
+},{}],415:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Viewer_1 = require("../Viewer");
-var Settings = (function () {
+var Settings = /** @class */ (function () {
     function Settings() {
     }
     Settings.setOptions = function (options) {
@@ -40223,7 +43079,7 @@ var Settings = (function () {
 exports.Settings = Settings;
 exports.default = Settings;
 
-},{"../Viewer":241}],362:[function(require,module,exports){
+},{"../Viewer":292}],416:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 function isBrowser() {
@@ -40234,7 +43090,8 @@ function isArraySupported() {
     return !!(Array.prototype &&
         Array.prototype.filter &&
         Array.prototype.indexOf &&
-        Array.prototype.map);
+        Array.prototype.map &&
+        Array.prototype.reverse);
 }
 exports.isArraySupported = isArraySupported;
 function isFunctionSupported() {
@@ -40288,10 +43145,10 @@ function isWebGLSupported() {
 }
 exports.isWebGLSupported = isWebGLSupported;
 
-},{}],363:[function(require,module,exports){
+},{}],417:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Urls = (function () {
+var Urls = /** @class */ (function () {
     function Urls() {
     }
     Object.defineProperty(Urls, "tileScheme", {
@@ -40329,7 +43186,7 @@ var Urls = (function () {
 exports.Urls = Urls;
 exports.default = Urls;
 
-},{}],364:[function(require,module,exports){
+},{}],418:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -40378,15 +43235,18 @@ var Alignment;
 })(Alignment = exports.Alignment || (exports.Alignment = {}));
 exports.default = Alignment;
 
-},{}],365:[function(require,module,exports){
+},{}],419:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("rxjs/Observable");
 require("rxjs/add/operator/bufferCount");
 require("rxjs/add/operator/delay");
 require("rxjs/add/operator/distinctUntilChanged");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/switchMap");
-var CacheService = (function () {
+require("rxjs/add/operator/timeout");
+var Graph_1 = require("../Graph");
+var CacheService = /** @class */ (function () {
     function CacheService(graphService, stateService) {
         this._graphService = graphService;
         this._stateService = stateService;
@@ -40409,15 +43269,44 @@ var CacheService = (function () {
             return frame.state.currentNode.key;
         })
             .map(function (frame) {
-            return frame.state.trajectory
+            var trajectory = frame.state.trajectory;
+            var trajectoryKeys = trajectory
                 .map(function (n) {
                 return n.key;
             });
+            var sequenceKey = trajectory[trajectory.length - 1].sequenceKey;
+            return [trajectoryKeys, sequenceKey];
         })
             .bufferCount(1, 5)
-            .switchMap(function (keepKeysBuffer) {
-            var keepKeys = keepKeysBuffer[0];
-            return _this._graphService.uncache$(keepKeys);
+            .withLatestFrom(this._graphService.graphMode$)
+            .switchMap(function (_a) {
+            var keepBuffer = _a[0], graphMode = _a[1];
+            var keepKeys = keepBuffer[0][0];
+            var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ?
+                keepBuffer[0][1] : undefined;
+            return _this._graphService.uncache$(keepKeys, keepSequenceKey);
+        })
+            .subscribe(function () { });
+        this._cacheNodeSubscription = this._graphService.graphMode$
+            .skip(1)
+            .withLatestFrom(this._stateService.currentState$)
+            .switchMap(function (_a) {
+            var mode = _a[0], frame = _a[1];
+            return mode === Graph_1.GraphMode.Sequence ?
+                _this._keyToEdges(frame.state.currentNode.key, function (node) {
+                    return node.sequenceEdges$;
+                }) :
+                Observable_1.Observable
+                    .from(frame.state.trajectory
+                    .map(function (node) {
+                    return node.key;
+                })
+                    .slice(frame.state.currentIndex))
+                    .mergeMap(function (key) {
+                    return _this._keyToEdges(key, function (node) {
+                        return node.spatialEdges$;
+                    });
+                }, 6);
         })
             .subscribe(function () { });
         this._started = true;
@@ -40428,18 +43317,32 @@ var CacheService = (function () {
         }
         this._uncacheSubscription.unsubscribe();
         this._uncacheSubscription = null;
+        this._cacheNodeSubscription.unsubscribe();
+        this._cacheNodeSubscription = null;
         this._started = false;
     };
+    CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) {
+        return this._graphService.cacheNode$(key)
+            .switchMap(nodeToEdgeMap)
+            .first(function (status) {
+            return status.cached;
+        })
+            .timeout(15000)
+            .catch(function (error) {
+            console.error("Failed to cache edges (" + key + ").", error);
+            return Observable_1.Observable.empty();
+        });
+    };
     return CacheService;
 }());
 exports.CacheService = CacheService;
 exports.default = CacheService;
 
-},{"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":80}],366:[function(require,module,exports){
+},{"../Graph":285,"rxjs/Observable":29,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/timeout":86}],420:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Component_1 = require("../Component");
-var ComponentController = (function () {
+var ComponentController = /** @class */ (function () {
     function ComponentController(container, navigator, observer, key, options, componentService) {
         var _this = this;
         this._container = container;
@@ -40468,6 +43371,7 @@ var ComponentController = (function () {
                 _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden });
                 _this._subscribeCoverComponent();
                 _this._navigator.stateService.start();
+                _this._navigator.cacheService.start();
                 _this._observer.startEmit();
             });
         }
@@ -40554,6 +43458,7 @@ var ComponentController = (function () {
                 })
                     .subscribe(function (node) {
                     _this._navigator.stateService.start();
+                    _this._navigator.cacheService.start();
                     _this._observer.startEmit();
                     _this._coverComponent.configure({ state: Component_1.CoverState.Hidden });
                     _this._componentService.deactivateCover();
@@ -40566,6 +43471,8 @@ var ComponentController = (function () {
             else if (conf.state === Component_1.CoverState.Visible) {
                 _this._observer.stopEmit();
                 _this._navigator.stateService.stop();
+                _this._navigator.cacheService.stop();
+                _this._navigator.playService.stop();
                 _this._componentService.activateCover();
                 _this._setNavigable(conf.key == null);
             }
@@ -40609,13 +43516,13 @@ var ComponentController = (function () {
 }());
 exports.ComponentController = ComponentController;
 
-},{"../Component":230}],367:[function(require,module,exports){
+},{"../Component":281}],421:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Render_1 = require("../Render");
 var Utils_1 = require("../Utils");
 var Viewer_1 = require("../Viewer");
-var Container = (function () {
+var Container = /** @class */ (function () {
     function Container(id, stateService, options, dom) {
         this.id = id;
         this._dom = !!dom ? dom : new Utils_1.DOM();
@@ -40648,12 +43555,19 @@ var Container = (function () {
         enumerable: true,
         configurable: true
     });
+    Object.defineProperty(Container.prototype, "domContainer", {
+        get: function () {
+            return this._domContainer;
+        },
+        enumerable: true,
+        configurable: true
+    });
     return Container;
 }());
 exports.Container = Container;
 exports.default = Container;
 
-},{"../Render":236,"../Utils":240,"../Viewer":241}],368:[function(require,module,exports){
+},{"../Render":287,"../Utils":291,"../Viewer":292}],422:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 /**
@@ -40682,11 +43596,11 @@ var ImageSize;
     ImageSize[ImageSize["Size2048"] = 2048] = "Size2048";
 })(ImageSize = exports.ImageSize || (exports.ImageSize = {}));
 
-},{}],369:[function(require,module,exports){
+},{}],423:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
-var KeyboardService = (function () {
+var KeyboardService = /** @class */ (function () {
     function KeyboardService(canvasContainer) {
         this._keyDown$ = Observable_1.Observable.fromEvent(canvasContainer, "keydown");
     }
@@ -40702,7 +43616,7 @@ var KeyboardService = (function () {
 exports.KeyboardService = KeyboardService;
 exports.default = KeyboardService;
 
-},{"rxjs/Observable":29}],370:[function(require,module,exports){
+},{"rxjs/Observable":29}],424:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -40714,7 +43628,7 @@ require("rxjs/add/operator/map");
 require("rxjs/add/operator/publishReplay");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/startWith");
-var LoadingService = (function () {
+var LoadingService = /** @class */ (function () {
     function LoadingService() {
         this._loadersSubject$ = new Subject_1.Subject();
         this._loaders$ = this._loadersSubject$
@@ -40761,7 +43675,7 @@ var LoadingService = (function () {
 exports.LoadingService = LoadingService;
 exports.default = LoadingService;
 
-},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,"underscore":182}],371:[function(require,module,exports){
+},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,"underscore":233}],425:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
@@ -40778,12 +43692,10 @@ require("rxjs/add/operator/scan");
 require("rxjs/add/operator/switchMap");
 require("rxjs/add/operator/withLatestFrom");
 var Geo_1 = require("../Geo");
-var MouseService = (function () {
+var MouseService = /** @class */ (function () {
     function MouseService(container, canvasContainer, domContainer, doc, viewportCoords) {
         var _this = this;
-        this._canvasContainer = canvasContainer;
-        this._domContainer = domContainer;
-        this._viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords();
+        viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords();
         this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
         this._active$ = this._activeSubject$
             .distinctUntilChanged()
@@ -41215,7 +44127,7 @@ var MouseService = (function () {
 exports.MouseService = MouseService;
 exports.default = MouseService;
 
-},{"../Geo":233,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],372:[function(require,module,exports){
+},{"../Geo":284,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],426:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -41233,8 +44145,8 @@ var Graph_1 = require("../Graph");
 var Edge_1 = require("../Edge");
 var State_1 = require("../State");
 var Viewer_1 = require("../Viewer");
-var Navigator = (function () {
-    function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) {
+var Navigator = /** @class */ (function () {
+    function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService) {
         this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token);
         this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
         this._graphService = graphService != null ?
@@ -41246,7 +44158,9 @@ var Navigator = (function () {
         this._cacheService = cacheService != null ?
             cacheService :
             new Viewer_1.CacheService(this._graphService, this._stateService);
-        this._cacheService.start();
+        this._playService = playService != null ?
+            playService :
+            new Viewer_1.PlayService(this._graphService, this._stateService);
         this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
         this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null);
         this._request$ = null;
@@ -41260,6 +44174,13 @@ var Navigator = (function () {
         enumerable: true,
         configurable: true
     });
+    Object.defineProperty(Navigator.prototype, "cacheService", {
+        get: function () {
+            return this._cacheService;
+        },
+        enumerable: true,
+        configurable: true
+    });
     Object.defineProperty(Navigator.prototype, "graphService", {
         get: function () {
             return this._graphService;
@@ -41288,6 +44209,13 @@ var Navigator = (function () {
         enumerable: true,
         configurable: true
     });
+    Object.defineProperty(Navigator.prototype, "playService", {
+        get: function () {
+            return this._playService;
+        },
+        enumerable: true,
+        configurable: true
+    });
     Object.defineProperty(Navigator.prototype, "stateService", {
         get: function () {
             return this._stateService;
@@ -41357,7 +44285,7 @@ var Navigator = (function () {
                 return _this._trajectoryKeys$()
                     .mergeMap(function (keys) {
                     return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
+                        .mergeMap(function () {
                         return _this._cacheKeys$(keys);
                     });
                 })
@@ -41368,12 +44296,12 @@ var Navigator = (function () {
                 .mergeMap(function (requestedKey) {
                 if (requestedKey != null) {
                     return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
+                        .mergeMap(function () {
                         return _this._graphService.cacheNode$(requestedKey);
                     });
                 }
                 return _this._graphService.setFilter$(filter)
-                    .map(function (graph) {
+                    .map(function () {
                     return undefined;
                 });
             });
@@ -41393,14 +44321,11 @@ var Navigator = (function () {
         })
             .mergeMap(function (key) {
             return key == null ?
-                _this._graphService.reset$([])
-                    .map(function (graph) {
-                    return undefined;
-                }) :
+                _this._graphService.reset$([]) :
                 _this._trajectoryKeys$()
                     .mergeMap(function (keys) {
                     return _this._graphService.reset$(keys)
-                        .mergeMap(function (graph) {
+                        .mergeMap(function () {
                         return _this._cacheKeys$(keys);
                     });
                 })
@@ -41475,7 +44400,7 @@ var Navigator = (function () {
 exports.Navigator = Navigator;
 exports.default = Navigator;
 
-},{"../API":229,"../Edge":231,"../Graph":234,"../State":237,"../Viewer":241,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],373:[function(require,module,exports){
+},{"../API":280,"../Edge":282,"../Graph":285,"../State":288,"../Viewer":292,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],427:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var Observable_1 = require("rxjs/Observable");
@@ -41485,7 +44410,7 @@ require("rxjs/add/operator/distinctUntilChanged");
 require("rxjs/add/operator/map");
 require("rxjs/add/operator/throttleTime");
 var Viewer_1 = require("../Viewer");
-var Observer = (function () {
+var Observer = /** @class */ (function () {
     function Observer(eventEmitter, navigator, container) {
         var _this = this;
         this._container = container;
@@ -41649,13 +44574,303 @@ var Observer = (function () {
 exports.Observer = Observer;
 exports.default = Observer;
 
-},{"../Viewer":241,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":84}],374:[function(require,module,exports){
+},{"../Viewer":292,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":85}],428:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("rxjs/Observable");
+var Subject_1 = require("rxjs/Subject");
+require("rxjs/add/operator/timeout");
+var Edge_1 = require("../Edge");
+var Graph_1 = require("../Graph");
+var PlayService = /** @class */ (function () {
+    function PlayService(graphService, stateService) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._directionSubject$ = new Subject_1.Subject();
+        this._direction$ = this._directionSubject$
+            .startWith(Edge_1.EdgeDirection.Next)
+            .publishReplay(1)
+            .refCount();
+        this._direction$.subscribe();
+        this._playing = false;
+        this._playingSubject$ = new Subject_1.Subject();
+        this._playing$ = this._playingSubject$
+            .startWith(this._playing)
+            .publishReplay(1)
+            .refCount();
+        this._playing$.subscribe();
+        this._speed = 0.5;
+        this._speedSubject$ = new Subject_1.Subject();
+        this._speed$ = this._speedSubject$
+            .startWith(this._speed)
+            .publishReplay(1)
+            .refCount();
+        this._speed$.subscribe();
+        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));
+    }
+    Object.defineProperty(PlayService.prototype, "playing", {
+        get: function () {
+            return this._playing;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "direction$", {
+        get: function () {
+            return this._direction$;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "playing$", {
+        get: function () {
+            return this._playing$;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "speed$", {
+        get: function () {
+            return this._speed$;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    PlayService.prototype.play = function () {
+        var _this = this;
+        if (this._playing) {
+            return;
+        }
+        this._stateService.cutNodes();
+        var stateSpeed = this._setSpeed(this._speed);
+        this._stateService.setSpeed(stateSpeed);
+        this._graphModeSubscription = this._speed$
+            .map(function (speed) {
+            return speed > 0.54 ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial;
+        })
+            .distinctUntilChanged()
+            .subscribe(function (mode) {
+            _this._graphService.setGraphMode(mode);
+        });
+        this._cacheSubscription = this._stateService.currentNode$
+            .map(function (node) {
+            return [node.sequenceKey, node.key];
+        })
+            .distinctUntilChanged(undefined, function (_a) {
+            var sequenceKey = _a[0], nodeKey = _a[1];
+            return sequenceKey;
+        })
+            .combineLatest(this._graphService.graphMode$, this._direction$)
+            .switchMap(function (_a) {
+            var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2];
+            if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) {
+                return Observable_1.Observable.of([undefined, direction]);
+            }
+            var sequence$ = (mode === Graph_1.GraphMode.Sequence ?
+                _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :
+                _this._graphService.cacheSequence$(sequenceKey))
+                .retry(3)
+                .catch(function () {
+                return Observable_1.Observable.of(undefined);
+            });
+            return Observable_1.Observable
+                .combineLatest(sequence$, Observable_1.Observable.of(direction));
+        })
+            .switchMap(function (_a) {
+            var sequence = _a[0], direction = _a[1];
+            if (sequence === undefined) {
+                return Observable_1.Observable.empty();
+            }
+            var sequenceKeys = sequence.keys.slice();
+            if (direction === Edge_1.EdgeDirection.Prev) {
+                sequenceKeys.reverse();
+            }
+            return _this._stateService.currentState$
+                .map(function (frame) {
+                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];
+            })
+                .scan(function (_a, _b) {
+                var lastRequestKey = _a[0], previousRequestKeys = _a[1];
+                var lastTrajectoryKey = _b[0], nodesAhead = _b[1];
+                if (lastRequestKey === undefined) {
+                    lastRequestKey = lastTrajectoryKey;
+                }
+                var lastIndex = sequenceKeys.length - 1;
+                if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {
+                    return [lastRequestKey, []];
+                }
+                var current = sequenceKeys.indexOf(lastTrajectoryKey);
+                var start = sequenceKeys.indexOf(lastRequestKey) + 1;
+                var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1;
+                if (end <= start) {
+                    return [lastRequestKey, []];
+                }
+                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];
+            }, [undefined, []])
+                .mergeMap(function (_a) {
+                var lastRequestKey = _a[0], newRequestKeys = _a[1];
+                return Observable_1.Observable.from(newRequestKeys);
+            });
+        })
+            .mergeMap(function (key) {
+            return _this._graphService.cacheNode$(key)
+                .catch(function () {
+                return Observable_1.Observable.empty();
+            });
+        }, 6)
+            .subscribe();
+        this._playingSubscription = this._stateService.currentState$
+            .filter(function (frame) {
+            return frame.state.nodesAhead < _this._nodesAhead;
+        })
+            .map(function (frame) {
+            return frame.state.lastNode;
+        })
+            .distinctUntilChanged(undefined, function (lastNode) {
+            return lastNode.key;
+        })
+            .withLatestFrom(this._direction$)
+            .switchMap(function (_a) {
+            var node = _a[0], direction = _a[1];
+            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$)
+                .first(function (status) {
+                return status.cached;
+            })
+                .timeout(15000)
+                .zip(Observable_1.Observable.of(direction))
+                .map(function (_a) {
+                var s = _a[0], d = _a[1];
+                for (var _i = 0, _b = s.edges; _i < _b.length; _i++) {
+                    var edge = _b[_i];
+                    if (edge.data.direction === d) {
+                        return edge.to;
+                    }
+                }
+                return null;
+            })
+                .filter(function (key) {
+                return key != null;
+            })
+                .switchMap(function (key) {
+                return _this._graphService.cacheNode$(key);
+            });
+        })
+            .subscribe(function (node) {
+            _this._stateService.appendNodes([node]);
+        }, function (error) {
+            console.error(error);
+            _this.stop();
+        });
+        this._clearSubscription = this._stateService.currentNode$
+            .bufferCount(1, 10)
+            .subscribe(function (nodes) {
+            _this._stateService.clearPriorNodes();
+        });
+        this._setPlaying(true);
+        this._stopSubscription = Observable_1.Observable
+            .combineLatest(this._stateService.currentNode$, this._direction$)
+            .switchMap(function (_a) {
+            var node = _a[0], direction = _a[1];
+            var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$)
+                .first(function (status) {
+                return status.cached;
+            })
+                .timeout(15000)
+                .catch(function (error) {
+                console.error(error);
+                return Observable_1.Observable.of({ cached: false, edges: [] });
+            });
+            return Observable_1.Observable
+                .combineLatest(Observable_1.Observable.of(direction), edgeStatus$);
+        })
+            .map(function (_a) {
+            var direction = _a[0], edgeStatus = _a[1];
+            for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) {
+                var edge = _b[_i];
+                if (edge.data.direction === direction) {
+                    return true;
+                }
+            }
+            return false;
+        })
+            .first(function (hasEdge) {
+            return !hasEdge;
+        })
+            .subscribe(undefined, undefined, function () { _this.stop(); });
+        if (this._stopSubscription.closed) {
+            this._stopSubscription = null;
+        }
+    };
+    PlayService.prototype.setDirection = function (direction) {
+        this._directionSubject$.next(direction);
+    };
+    PlayService.prototype.setSpeed = function (speed) {
+        speed = Math.max(0, Math.min(1, speed));
+        if (speed === this._speed) {
+            return;
+        }
+        var stateSpeed = this._setSpeed(speed);
+        if (this._playing) {
+            this._stateService.setSpeed(stateSpeed);
+        }
+        this._speedSubject$.next(this._speed);
+    };
+    PlayService.prototype.stop = function () {
+        if (!this._playing) {
+            return;
+        }
+        if (!!this._stopSubscription) {
+            if (!this._stopSubscription.closed) {
+                this._stopSubscription.unsubscribe();
+            }
+            this._stopSubscription = null;
+        }
+        this._graphModeSubscription.unsubscribe();
+        this._graphModeSubscription = null;
+        this._cacheSubscription.unsubscribe();
+        this._cacheSubscription = null;
+        this._playingSubscription.unsubscribe();
+        this._playingSubscription = null;
+        this._clearSubscription.unsubscribe();
+        this._clearSubscription = null;
+        this._stateService.setSpeed(1);
+        this._stateService.cutNodes();
+        this._graphService.setGraphMode(Graph_1.GraphMode.Spatial);
+        this._setPlaying(false);
+    };
+    PlayService.prototype._mapSpeed = function (speed) {
+        var x = 2 * speed - 1;
+        return Math.pow(10, x) - 0.2 * x;
+    };
+    PlayService.prototype._mapNodesAhead = function (stateSpeed) {
+        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));
+    };
+    PlayService.prototype._setPlaying = function (playing) {
+        this._playing = playing;
+        this._playingSubject$.next(playing);
+    };
+    PlayService.prototype._setSpeed = function (speed) {
+        this._speed = speed;
+        var stateSpeed = this._mapSpeed(this._speed);
+        this._nodesAhead = this._mapNodesAhead(stateSpeed);
+        return stateSpeed;
+    };
+    return PlayService;
+}());
+exports.PlayService = PlayService;
+exports.default = PlayService;
+
+},{"../Edge":282,"../Graph":285,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/timeout":86}],429:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
 var THREE = require("three");
 var Geo_1 = require("../Geo");
-var Projection = (function () {
+var Projection = /** @class */ (function () {
     function Projection(geoCoords, viewportCoords) {
         this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords();
         this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
@@ -41708,7 +44923,7 @@ var Projection = (function () {
 exports.Projection = Projection;
 exports.default = Projection;
 
-},{"../Geo":233,"three":180}],375:[function(require,module,exports){
+},{"../Geo":284,"three":231}],430:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -41719,7 +44934,7 @@ require("rxjs/add/operator/publishReplay");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/startWith");
 var Viewer_1 = require("../Viewer");
-var SpriteAtlas = (function () {
+var SpriteAtlas = /** @class */ (function () {
     function SpriteAtlas() {
     }
     Object.defineProperty(SpriteAtlas.prototype, "json", {
@@ -41798,7 +45013,7 @@ var SpriteAtlas = (function () {
                 break;
             case Viewer_1.Alignment.BottomRight:
             case Viewer_1.Alignment.Right:
-            case Viewer_1.Alignment.BottomRight:
+            case Viewer_1.Alignment.TopRight:
             default:
                 break;
         }
@@ -41843,7 +45058,7 @@ var SpriteAtlas = (function () {
     };
     return SpriteAtlas;
 }());
-var SpriteService = (function () {
+var SpriteService = /** @class */ (function () {
     function SpriteService(sprite) {
         var _this = this;
         this._retina = window.devicePixelRatio > 1;
@@ -41907,7 +45122,7 @@ var SpriteService = (function () {
 exports.SpriteService = SpriteService;
 exports.default = SpriteService;
 
-},{"../Viewer":241,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,"three":180,"virtual-dom":186}],376:[function(require,module,exports){
+},{"../Viewer":292,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,"three":231,"virtual-dom":237}],431:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
@@ -41920,11 +45135,9 @@ require("rxjs/add/operator/map");
 require("rxjs/add/operator/merge");
 require("rxjs/add/operator/scan");
 require("rxjs/add/operator/switchMap");
-var TouchService = (function () {
+var TouchService = /** @class */ (function () {
     function TouchService(canvasContainer, domContainer) {
         var _this = this;
-        this._canvasContainer = canvasContainer;
-        this._domContainer = domContainer;
         this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
         this._active$ = this._activeSubject$
             .distinctUntilChanged()
@@ -42182,7 +45395,7 @@ var TouchService = (function () {
 }());
 exports.TouchService = TouchService;
 
-},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80}],377:[function(require,module,exports){
+},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81}],432:[function(require,module,exports){
 "use strict";
 /// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
@@ -42203,8 +45416,8 @@ var Utils_1 = require("../Utils");
 /**
  * @class Viewer
  *
- * @classdesc The Viewer object represents the navigable photo viewer.
- * Create a Viewer by specifying a container, client ID, photo key and
+ * @classdesc The Viewer object represents the navigable image viewer.
+ * Create a Viewer by specifying a container, client ID, image key and
  * other options. The viewer exposes methods and events for programmatic
  * interaction.
  *
@@ -42249,25 +45462,52 @@ var Utils_1 = require("../Utils");
  * zoomed independently of the size of the viewer container resulting in
  * different conversion results for different viewing directions.
  */
-var Viewer = (function (_super) {
+var Viewer = /** @class */ (function (_super) {
     __extends(Viewer, _super);
     /**
      * Create a new viewer instance.
      *
+     * @description It is possible to initialize the viewer with or
+     * without a key.
+     *
+     * When initializing with a key the viewer is bound to that key
+     * until the node/image for that key has been successfully loaded.
+     * Also, a cover with the image of the key will be shown.
+     * If the data for that key can not be loaded because the key is
+     * faulty or other errors occur it is not possible to navigate
+     * to another key because the viewer is not navigable. The viewer
+     * becomes navigable when the data for the has been loaded and
+     * the image is shown in the viewer. This wayof initializing
+     * the viewer is mostly for embedding in blog posts and similar
+     * where one wants to show a specific image initially.
+     *
+     * If the viewer is initialized without a key (with null or
+     * undefined) it is not bound to any particular key and it is
+     * possible to move to any key with `viewer.moveToKey("<my-image-key>")`.
+     * If the first move to a key fails it is possible to move to another
+     * key. The viewer will show a black background until a move
+     * succeeds. This way of intitializing is suited for a map-viewer
+     * application when the initial key is not known at implementation
+     * time.
+     *
      * @param {string} id - Required `id` of a DOM element which will
      * be transformed into the viewer.
      * @param {string} clientId - Required `Mapillary API ClientID`. Can
      * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} [key] - Optional `photoId` to start from, can be any
-     * Mapillary photo, if null no image is loaded.
-     * @param {IViewerOptions} [options] - Optional configuration object
-     * specifing Viewer's initial setup.
-     * @param {string} [token] - Optional bearer token for API requests of
+     * @param {string} key - Optional `image-key` to start from. The key
+     * can be any Mapillary image. If a key is provided the viewer is
+     * bound to that key until it has been fully loaded. If null is provided
+     * no image is loaded at viewer initialization and the viewer is not
+     * bound to any particular key. Any image can then be navigated to
+     * with e.g. `viewer.moveToKey("<my-image-key>")`.
+     * @param {IViewerOptions} options - Optional configuration object
+     * specifing Viewer's and the components' initial setup.
+     * @param {string} token - Optional bearer token for API requests of
      * protected resources.
      *
      * @example
      * ```
-     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<my key>");
+     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<image-key>");
      * ```
      */
     function Viewer(id, clientId, key, options, token) {
@@ -42369,16 +45609,16 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Get the basic coordinates of the current photo that is
+     * Get the basic coordinates of the current image that is
      * at the center of the viewport.
      *
      * @description Basic coordinates are 2D coordinates on the [0, 1] interval
      * and have the origin point, (0, 0), at the top left corner and the
      * maximum value, (1, 1), at the bottom right corner of the original
-     * photo.
+     * image.
      *
      * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current photo at the center for the viewport.
+     * of the current image at the center for the viewport.
      *
      * @example
      * ```
@@ -42419,7 +45659,7 @@ var Viewer = (function (_super) {
         return this._container.element;
     };
     /**
-     * Get the photo's current zoom level.
+     * Get the image's current zoom level.
      *
      * @returns {Promise<number>} Promise to the viewers's current
      * zoom level.
@@ -42505,9 +45745,9 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Navigate to a given photo key.
+     * Navigate to a given image key.
      *
-     * @param {string} key - A valid Mapillary photo key.
+     * @param {string} key - A valid Mapillary image key.
      * @returns {Promise<Node>} Promise to the node that was navigated to.
      * @throws {Error} Propagates any IO errors to the caller.
      * @throws {Error} When viewer is not navigable.
@@ -42586,6 +45826,9 @@ var Viewer = (function (_super) {
      * The promises of those move requests will be rejected and
      * the rejections need to be caught.
      *
+     * Calling setAuthToken also resets the complete viewer cache
+     * so it should not be called repeatedly.
+     *
      * @param {string} [token] token - Bearer token.
      * @returns {Promise<void>} Promise that resolves after token
      * is set.
@@ -42612,16 +45855,16 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Set the basic coordinates of the current photo to be in the
+     * Set the basic coordinates of the current image to be in the
      * center of the viewport.
      *
      * @description Basic coordinates are 2D coordinates on the [0, 1] interval
      * and has the origin point, (0, 0), at the top left corner and the
      * maximum value, (1, 1), at the bottom right corner of the original
-     * photo.
+     * image.
      *
      * @param {number[]} The basic coordinates of the current
-     * photo to be at the center for the viewport.
+     * image to be at the center for the viewport.
      *
      * @example
      * ```
@@ -42700,13 +45943,13 @@ var Viewer = (function (_super) {
         this._container.renderService.renderMode$.next(renderMode);
     };
     /**
-     * Set the photo's current zoom level.
+     * Set the image's current zoom level.
      *
      * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the photo to the view whereas three
+     * Zero means zooming out to fit the image to the view whereas three
      * shows the highest level of detail.
      *
-     * @param {number} The photo's current zoom level.
+     * @param {number} The image's current zoom level.
      *
      * @example
      * ```
@@ -42886,6 +46129,6 @@ var Viewer = (function (_super) {
 }(Utils_1.EventEmitter));
 exports.Viewer = Viewer;
 
-},{"../Utils":240,"../Viewer":241,"rxjs/Observable":29,"when":227}]},{},[235])(235)
+},{"../Utils":291,"../Viewer":292,"rxjs/Observable":29,"when":278}]},{},[286])(286)
 });
 //# sourceMappingURL=mapillary.js.map
index f1fae2621c956935ef975593728616ed79faccba..c7c437fedfac5fa75e2a51b3becf21ddd7a8dbf3 100644 (file)
@@ -74,6 +74,7 @@
     "node_modules/rxjs/add/operator/pluck.js",
     "node_modules/rxjs/add/operator/publish.js",
     "node_modules/rxjs/add/operator/publishReplay.js",
+    "node_modules/rxjs/add/operator/retry.js",
     "node_modules/rxjs/add/operator/sample.js",
     "node_modules/rxjs/add/operator/scan.js",
     "node_modules/rxjs/add/operator/share.js",
@@ -86,6 +87,7 @@
     "node_modules/rxjs/add/operator/takeUntil.js",
     "node_modules/rxjs/add/operator/takeWhile.js",
     "node_modules/rxjs/add/operator/throttleTime.js",
+    "node_modules/rxjs/add/operator/timeout.js",
     "node_modules/rxjs/add/operator/withLatestFrom.js",
     "node_modules/rxjs/add/operator/zip.js",
     "node_modules/rxjs/observable/ArrayLikeObservable.js",
     "node_modules/rxjs/observable/ScalarObservable.js",
     "node_modules/rxjs/observable/TimerObservable.js",
     "node_modules/rxjs/observable/combineLatest.js",
+    "node_modules/rxjs/observable/concat.js",
     "node_modules/rxjs/observable/defer.js",
     "node_modules/rxjs/observable/empty.js",
     "node_modules/rxjs/observable/from.js",
     "node_modules/rxjs/operator/merge.js",
     "node_modules/rxjs/operator/mergeAll.js",
     "node_modules/rxjs/operator/mergeMap.js",
-    "node_modules/rxjs/operator/multicast.js",
-    "node_modules/rxjs/operator/observeOn.js",
     "node_modules/rxjs/operator/pairwise.js",
     "node_modules/rxjs/operator/pluck.js",
     "node_modules/rxjs/operator/publish.js",
     "node_modules/rxjs/operator/publishReplay.js",
+    "node_modules/rxjs/operator/retry.js",
     "node_modules/rxjs/operator/sample.js",
     "node_modules/rxjs/operator/scan.js",
     "node_modules/rxjs/operator/share.js",
     "node_modules/rxjs/operator/take.js",
     "node_modules/rxjs/operator/takeUntil.js",
     "node_modules/rxjs/operator/takeWhile.js",
-    "node_modules/rxjs/operator/throttle.js",
     "node_modules/rxjs/operator/throttleTime.js",
+    "node_modules/rxjs/operator/timeout.js",
     "node_modules/rxjs/operator/withLatestFrom.js",
     "node_modules/rxjs/operator/zip.js",
+    "node_modules/rxjs/operators/buffer.js",
+    "node_modules/rxjs/operators/bufferCount.js",
+    "node_modules/rxjs/operators/bufferWhen.js",
+    "node_modules/rxjs/operators/catchError.js",
+    "node_modules/rxjs/operators/combineLatest.js",
+    "node_modules/rxjs/operators/concat.js",
+    "node_modules/rxjs/operators/concatAll.js",
+    "node_modules/rxjs/operators/debounceTime.js",
+    "node_modules/rxjs/operators/delay.js",
+    "node_modules/rxjs/operators/distinct.js",
+    "node_modules/rxjs/operators/distinctUntilChanged.js",
+    "node_modules/rxjs/operators/expand.js",
+    "node_modules/rxjs/operators/filter.js",
+    "node_modules/rxjs/operators/finalize.js",
+    "node_modules/rxjs/operators/first.js",
+    "node_modules/rxjs/operators/last.js",
+    "node_modules/rxjs/operators/map.js",
+    "node_modules/rxjs/operators/merge.js",
+    "node_modules/rxjs/operators/mergeAll.js",
+    "node_modules/rxjs/operators/mergeMap.js",
+    "node_modules/rxjs/operators/multicast.js",
+    "node_modules/rxjs/operators/observeOn.js",
+    "node_modules/rxjs/operators/pairwise.js",
+    "node_modules/rxjs/operators/pluck.js",
+    "node_modules/rxjs/operators/publish.js",
+    "node_modules/rxjs/operators/publishReplay.js",
+    "node_modules/rxjs/operators/refCount.js",
+    "node_modules/rxjs/operators/retry.js",
+    "node_modules/rxjs/operators/sample.js",
+    "node_modules/rxjs/operators/scan.js",
+    "node_modules/rxjs/operators/share.js",
+    "node_modules/rxjs/operators/skip.js",
+    "node_modules/rxjs/operators/skipUntil.js",
+    "node_modules/rxjs/operators/skipWhile.js",
+    "node_modules/rxjs/operators/startWith.js",
+    "node_modules/rxjs/operators/switchMap.js",
+    "node_modules/rxjs/operators/take.js",
+    "node_modules/rxjs/operators/takeUntil.js",
+    "node_modules/rxjs/operators/takeWhile.js",
+    "node_modules/rxjs/operators/tap.js",
+    "node_modules/rxjs/operators/throttle.js",
+    "node_modules/rxjs/operators/throttleTime.js",
+    "node_modules/rxjs/operators/timeout.js",
+    "node_modules/rxjs/operators/withLatestFrom.js",
+    "node_modules/rxjs/operators/zip.js",
     "node_modules/rxjs/scheduler/Action.js",
     "node_modules/rxjs/scheduler/AsyncAction.js",
     "node_modules/rxjs/scheduler/AsyncScheduler.js",
     "node_modules/rxjs/util/EmptyError.js",
     "node_modules/rxjs/util/ObjectUnsubscribedError.js",
     "node_modules/rxjs/util/Set.js",
+    "node_modules/rxjs/util/TimeoutError.js",
     "node_modules/rxjs/util/UnsubscriptionError.js",
     "node_modules/rxjs/util/errorObject.js",
+    "node_modules/rxjs/util/identity.js",
     "node_modules/rxjs/util/isArray.js",
     "node_modules/rxjs/util/isArrayLike.js",
     "node_modules/rxjs/util/isDate.js",
     "node_modules/rxjs/util/isObject.js",
     "node_modules/rxjs/util/isPromise.js",
     "node_modules/rxjs/util/isScheduler.js",
+    "node_modules/rxjs/util/noop.js",
+    "node_modules/rxjs/util/pipe.js",
     "node_modules/rxjs/util/root.js",
     "node_modules/rxjs/util/subscribeToResult.js",
     "node_modules/rxjs/util/toSubscriber.js",
     "src/component/imageplane/SliderComponent.ts",
     "src/component/interfaces/ICoverConfiguration.ts",
     "src/component/interfaces/interfaces.ts",
+    "src/component/keyboard/KeyPlayHandler.ts",
     "src/component/keyboard/KeySequenceNavigationHandler.ts",
     "src/component/keyboard/KeySpatialNavigationHandler.ts",
     "src/component/keyboard/KeyZoomHandler.ts",
     "src/component/popup/Popup.ts",
     "src/component/popup/PopupComponent.ts",
     "src/component/popup/popup/Popup.ts",
+    "src/component/sequence/ControlMode.ts",
     "src/component/sequence/SequenceComponent.ts",
     "src/component/sequence/SequenceDOMInteraction.ts",
     "src/component/sequence/SequenceDOMRenderer.ts",
     "src/graph/FilterCreator.ts",
     "src/graph/Graph.ts",
     "src/graph/GraphCalculator.ts",
+    "src/graph/GraphMode.ts",
     "src/graph/GraphService.ts",
     "src/graph/ImageLoadingService.ts",
     "src/graph/MeshReader.ts",
     "src/viewer/MouseService.ts",
     "src/viewer/Navigator.ts",
     "src/viewer/Observer.ts",
+    "src/viewer/PlayService.ts",
     "src/viewer/Projection.ts",
     "src/viewer/SpriteService.ts",
     "src/viewer/TouchService.ts",
     "src/viewer/Viewer.ts"
   ],
   "names": [],
-  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1qDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7NA;AACA;AACA;AACA;AACA;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChMA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvIA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;;ACHA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC12BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5gDA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC37BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACRA,qCAAkC;AAA1B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",
+  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9nBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7NA;AACA;AACA;AACA;AACA;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChMA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9GA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACl4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5gDA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC37BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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",
   "file": "generated.js",
   "sourceRoot": "",
   "sourcesContent": [
     "",
     "/*!\n * Cross-Browser Split 1.1.1\n * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>\n * Available under the MIT License\n * ECMAScript compliant, uniform cross-browser split method\n */\n\n/**\n * Splits a string into an array of strings using a regex or string separator. Matches of the\n * separator are not included in the result array. However, if `separator` is a regex that contains\n * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n * cross-browser.\n * @param {String} str String to split.\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n * @example\n *\n * // Basic use\n * split('a b c d', ' ');\n * // -> ['a', 'b', 'c', 'd']\n *\n * // With limit\n * split('a b c d', ' ', 2);\n * // -> ['a', 'b']\n *\n * // Backreferences in result array\n * split('..word1 word2..', /([a-z]+)(\\d+)/i);\n * // -> ['..', 'word', '1', ' ', 'word', '2', '..']\n */\nmodule.exports = (function split(undef) {\n\n  var nativeSplit = String.prototype.split,\n    compliantExecNpcg = /()??/.exec(\"\")[1] === undef,\n    // NPCG: nonparticipating capturing group\n    self;\n\n  self = function(str, separator, limit) {\n    // If `separator` is not a regex, use `nativeSplit`\n    if (Object.prototype.toString.call(separator) !== \"[object RegExp]\") {\n      return nativeSplit.call(str, separator, limit);\n    }\n    var output = [],\n      flags = (separator.ignoreCase ? \"i\" : \"\") + (separator.multiline ? \"m\" : \"\") + (separator.extended ? \"x\" : \"\") + // Proposed for ES6\n      (separator.sticky ? \"y\" : \"\"),\n      // Firefox 3+\n      lastLastIndex = 0,\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      separator = new RegExp(separator.source, flags + \"g\"),\n      separator2, match, lastIndex, lastLength;\n    str += \"\"; // Type-convert\n    if (!compliantExecNpcg) {\n      // Doesn't need flags gy, but they don't hurt\n      separator2 = new RegExp(\"^\" + separator.source + \"$(?!\\\\s)\", flags);\n    }\n    /* Values for `limit`, per the spec:\n     * If undefined: 4294967295 // Math.pow(2, 32) - 1\n     * If 0, Infinity, or NaN: 0\n     * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n     * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n     * If other: Type-convert, then use the above rules\n     */\n    limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1\n    limit >>> 0; // ToUint32(limit)\n    while (match = separator.exec(str)) {\n      // `separator.lastIndex` is not reliable cross-browser\n      lastIndex = match.index + match[0].length;\n      if (lastIndex > lastLastIndex) {\n        output.push(str.slice(lastLastIndex, match.index));\n        // Fix browsers whose `exec` methods don't consistently return `undefined` for\n        // nonparticipating capturing groups\n        if (!compliantExecNpcg && match.length > 1) {\n          match[0].replace(separator2, function() {\n            for (var i = 1; i < arguments.length - 2; i++) {\n              if (arguments[i] === undef) {\n                match[i] = undef;\n              }\n            }\n          });\n        }\n        if (match.length > 1 && match.index < str.length) {\n          Array.prototype.push.apply(output, match.slice(1));\n        }\n        lastLength = match[0].length;\n        lastLastIndex = lastIndex;\n        if (output.length >= limit) {\n          break;\n        }\n      }\n      if (separator.lastIndex === match.index) {\n        separator.lastIndex++; // Avoid an infinite loop\n      }\n    }\n    if (lastLastIndex === str.length) {\n      if (lastLength || !separator.test(\"\")) {\n        output.push(\"\");\n      }\n    } else {\n      output.push(str.slice(lastLastIndex));\n    }\n    return output.length > limit ? output.slice(0, limit) : output;\n  };\n\n  return self;\n})();\n",
     "// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // 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\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // 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.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n",
-    "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('Invalid typed array length')\n  }\n  // Return an augmented `Uint8Array` instance\n  var buf = new Uint8Array(length)\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species &&\n    Buffer[Symbol.species] === Buffer) {\n  Object.defineProperty(Buffer, Symbol.species, {\n    value: null,\n    configurable: true,\n    enumerable: false,\n    writable: false\n  })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (value instanceof ArrayBuffer) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  return fromObject(value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  var buf = createBuffer(length)\n\n  var actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  var buf = createBuffer(length)\n  for (var i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  var buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    var buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj) {\n    if (isArrayBufferView(obj) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n        return createBuffer(0)\n      }\n      return fromArrayLike(obj)\n    }\n\n    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n      return fromArrayLike(obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (isArrayBufferView(string) || string instanceof ArrayBuffer) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  newBuf.__proto__ = Buffer.prototype\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : new Buffer(val, encoding)\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`\nfunction isArrayBufferView (obj) {\n  return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)\n}\n\nfunction numberIsNaN (obj) {\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n",
-    "'use strict';\n\nmodule.exports = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, size;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and size are later used to transform coords into integers for z-order calculation\n        size = Math.max(maxX - minX, maxY - minY);\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) return null;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && size) indexCurve(ear, minX, minY, size);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertice leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(ear, triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, size);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, size) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, size),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\n    // first look for points inside the triangle in increasing z-order\n    var p = ear.nextZ;\n\n    while (p && p.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.nextZ;\n    }\n\n    // then look for points in decreasing z-order\n    p = ear.prevZ;\n\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, size);\n                earcutLinked(c, triangles, dim, minX, minY, size);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m.next;\n\n    while (p !== stop) {\n        if (hx >= p.x && p.x >= mx &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    }\n\n    return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, size) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize === 0) {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                } else if (qSize === 0 || !q) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else if (p.z <= q.z) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and size of the data bounding box\nfunction zOrder(x, y, minX, minY, size) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) / size;\n    y = 32767 * (y - minY) / size;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    if ((equals(p1, q1) && equals(p2, q2)) ||\n        (equals(p1, q2) && equals(p2, q1))) return true;\n    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertice index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertice nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n",
+    "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('Invalid typed array length')\n  }\n  // Return an augmented `Uint8Array` instance\n  var buf = new Uint8Array(length)\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species &&\n    Buffer[Symbol.species] === Buffer) {\n  Object.defineProperty(Buffer, Symbol.species, {\n    value: null,\n    configurable: true,\n    enumerable: false,\n    writable: false\n  })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (isArrayBuffer(value)) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  return fromObject(value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  var buf = createBuffer(length)\n\n  var actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  var buf = createBuffer(length)\n  for (var i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  var buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    var buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj) {\n    if (isArrayBufferView(obj) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n        return createBuffer(0)\n      }\n      return fromArrayLike(obj)\n    }\n\n    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n      return fromArrayLike(obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (isArrayBufferView(string) || isArrayBuffer(string)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  newBuf.__proto__ = Buffer.prototype\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : new Buffer(val, encoding)\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check\n// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166\nfunction isArrayBuffer (obj) {\n  return obj instanceof ArrayBuffer ||\n    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&\n      typeof obj.byteLength === 'number')\n}\n\n// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`\nfunction isArrayBufferView (obj) {\n  return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)\n}\n\nfunction numberIsNaN (obj) {\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n",
+    "'use strict';\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertice leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(ear, triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n    // first look for points inside the triangle in increasing z-order\n    var p = ear.nextZ;\n\n    while (p && p.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.nextZ;\n    }\n\n    // then look for points in decreasing z-order\n    p = ear.prevZ;\n\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m.next;\n\n    while (p !== stop) {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    }\n\n    return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    if ((equals(p1, q1) && equals(p2, q2)) ||\n        (equals(p1, q2) && equals(p2, q1))) return true;\n    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertice index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertice nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n",
     "'use strict';\n\nvar OneVersionConstraint = require('individual/one-version');\n\nvar MY_VERSION = '7';\nOneVersionConstraint('ev-store', MY_VERSION);\n\nvar hashKey = '__EV_STORE_KEY@' + MY_VERSION;\n\nmodule.exports = EvStore;\n\nfunction EvStore(elem) {\n    var hash = elem[hashKey];\n\n    if (!hash) {\n        hash = elem[hashKey] = {};\n    }\n\n    return hash;\n}\n",
     "'use strict';\nvar request = require('./request');\nvar buildQueryObject = require('./buildQueryObject');\nvar isArray = Array.isArray;\n\nfunction simpleExtend(obj, obj2) {\n  var prop;\n  for (prop in obj2) {\n    obj[prop] = obj2[prop];\n  }\n  return obj;\n}\n\nfunction XMLHttpSource(jsongUrl, config) {\n  this._jsongUrl = jsongUrl;\n  if (typeof config === 'number') {\n    var newConfig = {\n      timeout: config\n    };\n    config = newConfig;\n  }\n  this._config = simpleExtend({\n    timeout: 15000,\n    headers: {}\n  }, config || {});\n}\n\nXMLHttpSource.prototype = {\n  // because javascript\n  constructor: XMLHttpSource,\n  /**\n   * buildQueryObject helper\n   */\n  buildQueryObject: buildQueryObject,\n\n  /**\n   * @inheritDoc DataSource#get\n   */\n  get: function httpSourceGet(pathSet) {\n    var method = 'GET';\n    var queryObject = this.buildQueryObject(this._jsongUrl, method, {\n      paths: pathSet,\n      method: 'get'\n    });\n    var config = simpleExtend(queryObject, this._config);\n    // pass context for onBeforeRequest callback\n    var context = this;\n    return request(method, config, context);\n  },\n\n  /**\n   * @inheritDoc DataSource#set\n   */\n  set: function httpSourceSet(jsongEnv) {\n    var method = 'POST';\n    var queryObject = this.buildQueryObject(this._jsongUrl, method, {\n      jsonGraph: jsongEnv,\n      method: 'set'\n    });\n    var config = simpleExtend(queryObject, this._config);\n    config.headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n    \n    // pass context for onBeforeRequest callback\n    var context = this;\n    return request(method, config, context);\n\n  },\n\n  /**\n   * @inheritDoc DataSource#call\n   */\n  call: function httpSourceCall(callPath, args, pathSuffix, paths) {\n    // arguments defaults\n    args = args || [];\n    pathSuffix = pathSuffix || [];\n    paths = paths || [];\n\n    var method = 'POST';\n    var queryData = [];\n    queryData.push('method=call');\n    queryData.push('callPath=' + encodeURIComponent(JSON.stringify(callPath)));\n    queryData.push('arguments=' + encodeURIComponent(JSON.stringify(args)));\n    queryData.push('pathSuffixes=' + encodeURIComponent(JSON.stringify(pathSuffix)));\n    queryData.push('paths=' + encodeURIComponent(JSON.stringify(paths)));\n\n    var queryObject = this.buildQueryObject(this._jsongUrl, method, queryData.join('&'));\n    var config = simpleExtend(queryObject, this._config);\n    config.headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n    \n    // pass context for onBeforeRequest callback\n    var context = this;\n    return request(method, config, context);\n  }\n};\n// ES6 modules\nXMLHttpSource.XMLHttpSource = XMLHttpSource;\nXMLHttpSource['default'] = XMLHttpSource;\n// commonjs\nmodule.exports = XMLHttpSource;\n",
     "'use strict';\nmodule.exports = function buildQueryObject(url, method, queryData) {\n  var qData = [];\n  var keys;\n  var data = {url: url};\n  var isQueryParamUrl = url.indexOf('?') !== -1;\n  var startUrl = (isQueryParamUrl) ? '&' : '?';\n\n  if (typeof queryData === 'string') {\n    qData.push(queryData);\n  } else {\n\n    keys = Object.keys(queryData);\n    keys.forEach(function (k) {\n      var value = (typeof queryData[k] === 'object') ? JSON.stringify(queryData[k]) : queryData[k];\n      qData.push(k + '=' + encodeURIComponent(value));\n    });\n  }\n\n  if (method === 'GET') {\n    data.url += startUrl + qData.join('&');\n  } else {\n    data.data = qData.join('&');\n  }\n\n  return data;\n};\n",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('./Subject');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\n/**\n * @class BehaviorSubject<T>\n */\nvar BehaviorSubject = (function (_super) {\n    __extends(BehaviorSubject, _super);\n    function BehaviorSubject(_value) {\n        _super.call(this);\n        this._value = _value;\n    }\n    Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n        get: function () {\n            return this.getValue();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BehaviorSubject.prototype._subscribe = function (subscriber) {\n        var subscription = _super.prototype._subscribe.call(this, subscriber);\n        if (subscription && !subscription.closed) {\n            subscriber.next(this._value);\n        }\n        return subscription;\n    };\n    BehaviorSubject.prototype.getValue = function () {\n        if (this.hasError) {\n            throw this.thrownError;\n        }\n        else if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else {\n            return this._value;\n        }\n    };\n    BehaviorSubject.prototype.next = function (value) {\n        _super.prototype.next.call(this, this._value = value);\n    };\n    return BehaviorSubject;\n}(Subject_1.Subject));\nexports.BehaviorSubject = BehaviorSubject;\n//# sourceMappingURL=BehaviorSubject.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('./Subscriber');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar InnerSubscriber = (function (_super) {\n    __extends(InnerSubscriber, _super);\n    function InnerSubscriber(parent, outerValue, outerIndex) {\n        _super.call(this);\n        this.parent = parent;\n        this.outerValue = outerValue;\n        this.outerIndex = outerIndex;\n        this.index = 0;\n    }\n    InnerSubscriber.prototype._next = function (value) {\n        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n    };\n    InnerSubscriber.prototype._error = function (error) {\n        this.parent.notifyError(error, this);\n        this.unsubscribe();\n    };\n    InnerSubscriber.prototype._complete = function () {\n        this.parent.notifyComplete(this);\n        this.unsubscribe();\n    };\n    return InnerSubscriber;\n}(Subscriber_1.Subscriber));\nexports.InnerSubscriber = InnerSubscriber;\n//# sourceMappingURL=InnerSubscriber.js.map",
     "\"use strict\";\nvar Observable_1 = require('./Observable');\n/**\n * Represents a push-based event or value that an {@link Observable} can emit.\n * This class is particularly useful for operators that manage notifications,\n * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and\n * others. Besides wrapping the actual delivered value, it also annotates it\n * with metadata of, for instance, what type of push message it is (`next`,\n * `error`, or `complete`).\n *\n * @see {@link materialize}\n * @see {@link dematerialize}\n * @see {@link observeOn}\n *\n * @class Notification<T>\n */\nvar Notification = (function () {\n    function Notification(kind, value, error) {\n        this.kind = kind;\n        this.value = value;\n        this.error = error;\n        this.hasValue = kind === 'N';\n    }\n    /**\n     * Delivers to the given `observer` the value wrapped by this Notification.\n     * @param {Observer} observer\n     * @return\n     */\n    Notification.prototype.observe = function (observer) {\n        switch (this.kind) {\n            case 'N':\n                return observer.next && observer.next(this.value);\n            case 'E':\n                return observer.error && observer.error(this.error);\n            case 'C':\n                return observer.complete && observer.complete();\n        }\n    };\n    /**\n     * Given some {@link Observer} callbacks, deliver the value represented by the\n     * current Notification to the correctly corresponding callback.\n     * @param {function(value: T): void} next An Observer `next` callback.\n     * @param {function(err: any): void} [error] An Observer `error` callback.\n     * @param {function(): void} [complete] An Observer `complete` callback.\n     * @return {any}\n     */\n    Notification.prototype.do = function (next, error, complete) {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return next && next(this.value);\n            case 'E':\n                return error && error(this.error);\n            case 'C':\n                return complete && complete();\n        }\n    };\n    /**\n     * Takes an Observer or its individual callback functions, and calls `observe`\n     * or `do` methods accordingly.\n     * @param {Observer|function(value: T): void} nextOrObserver An Observer or\n     * the `next` callback.\n     * @param {function(err: any): void} [error] An Observer `error` callback.\n     * @param {function(): void} [complete] An Observer `complete` callback.\n     * @return {any}\n     */\n    Notification.prototype.accept = function (nextOrObserver, error, complete) {\n        if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n            return this.observe(nextOrObserver);\n        }\n        else {\n            return this.do(nextOrObserver, error, complete);\n        }\n    };\n    /**\n     * Returns a simple Observable that just delivers the notification represented\n     * by this Notification instance.\n     * @return {any}\n     */\n    Notification.prototype.toObservable = function () {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return Observable_1.Observable.of(this.value);\n            case 'E':\n                return Observable_1.Observable.throw(this.error);\n            case 'C':\n                return Observable_1.Observable.empty();\n        }\n        throw new Error('unexpected notification kind value');\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `next` from a\n     * given value.\n     * @param {T} value The `next` value.\n     * @return {Notification<T>} The \"next\" Notification representing the\n     * argument.\n     */\n    Notification.createNext = function (value) {\n        if (typeof value !== 'undefined') {\n            return new Notification('N', value);\n        }\n        return Notification.undefinedValueNotification;\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `error` from a\n     * given error.\n     * @param {any} [err] The `error` error.\n     * @return {Notification<T>} The \"error\" Notification representing the\n     * argument.\n     */\n    Notification.createError = function (err) {\n        return new Notification('E', undefined, err);\n    };\n    /**\n     * A shortcut to create a Notification instance of the type `complete`.\n     * @return {Notification<any>} The valueless \"complete\" Notification.\n     */\n    Notification.createComplete = function () {\n        return Notification.completeNotification;\n    };\n    Notification.completeNotification = new Notification('C');\n    Notification.undefinedValueNotification = new Notification('N', undefined);\n    return Notification;\n}());\nexports.Notification = Notification;\n//# sourceMappingURL=Notification.js.map",
-    "\"use strict\";\nvar root_1 = require('./util/root');\nvar toSubscriber_1 = require('./util/toSubscriber');\nvar observable_1 = require('./symbol/observable');\n/**\n * A representation of any set of values over any amount of time. This the most basic building block\n * of RxJS.\n *\n * @class Observable<T>\n */\nvar Observable = (function () {\n    /**\n     * @constructor\n     * @param {Function} subscribe the function that is  called when the Observable is\n     * initially subscribed to. This function is given a Subscriber, to which new values\n     * can be `next`ed, or an `error` method can be called to raise an error, or\n     * `complete` can be called to notify of a successful completion.\n     */\n    function Observable(subscribe) {\n        this._isScalar = false;\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    /**\n     * Creates a new Observable, with this Observable as the source, and the passed\n     * operator defined as the new observable's operator.\n     * @method lift\n     * @param {Operator} operator the operator defining the operation to take on the observable\n     * @return {Observable} a new observable with the Operator applied\n     */\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    /**\n     * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n     *\n     * <span class=\"informal\">Use it when you have all these Observables, but still nothing is happening.</span>\n     *\n     * `subscribe` is not a regular operator, but a method that calls Observables internal `subscribe` function. It\n     * might be for example a function that you passed to a {@link create} static factory, but most of the time it is\n     * a library implementation, which defines what and when will be emitted by an Observable. This means that calling\n     * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n     * thought.\n     *\n     * Apart from starting the execution of an Observable, this method allows you to listen for values\n     * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n     * following ways.\n     *\n     * The first way is creating an object that implements {@link Observer} interface. It should have methods\n     * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n     * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do\n     * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n     * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n     * do anything, you can simply omit it. Note however, that if `error` method is not provided, all errors will\n     * be left uncaught.\n     *\n     * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n     * This means you can provide three functions as arguments to `subscribe`, where first function is equivalent\n     * of a `next` method, second of an `error` method and third of a `complete` method. Just as in case of Observer,\n     * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,\n     * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n     * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.\n     *\n     * Whatever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n     * This object allows you to call `unsubscribe` on it, which in turn will stop work that an Observable does and will clean\n     * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n     * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n     *\n     * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n     * It is an Observable itself that decides when these functions will be called. For example {@link of}\n     * by default emits all its values synchronously. Always check documentation for how given Observable\n     * will behave when subscribed and if its default behavior can be modified with a {@link Scheduler}.\n     *\n     * @example <caption>Subscribe with an Observer</caption>\n     * const sumObserver = {\n     *   sum: 0,\n     *   next(value) {\n     *     console.log('Adding: ' + value);\n     *     this.sum = this.sum + value;\n     *   },\n     *   error() { // We actually could just remote this method,\n     *   },        // since we do not really care about errors right now.\n     *   complete() {\n     *     console.log('Sum equals: ' + this.sum);\n     *   }\n     * };\n     *\n     * Rx.Observable.of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n     * .subscribe(sumObserver);\n     *\n     * // Logs:\n     * // \"Adding: 1\"\n     * // \"Adding: 2\"\n     * // \"Adding: 3\"\n     * // \"Sum equals: 6\"\n     *\n     *\n     * @example <caption>Subscribe with functions</caption>\n     * let sum = 0;\n     *\n     * Rx.Observable.of(1, 2, 3)\n     * .subscribe(\n     *   function(value) {\n     *     console.log('Adding: ' + value);\n     *     sum = sum + value;\n     *   },\n     *   undefined,\n     *   function() {\n     *     console.log('Sum equals: ' + sum);\n     *   }\n     * );\n     *\n     * // Logs:\n     * // \"Adding: 1\"\n     * // \"Adding: 2\"\n     * // \"Adding: 3\"\n     * // \"Sum equals: 6\"\n     *\n     *\n     * @example <caption>Cancel a subscription</caption>\n     * const subscription = Rx.Observable.interval(1000).subscribe(\n     *   num => console.log(num),\n     *   undefined,\n     *   () => console.log('completed!') // Will not be called, even\n     * );                                // when cancelling subscription\n     *\n     *\n     * setTimeout(() => {\n     *   subscription.unsubscribe();\n     *   console.log('unsubscribed!');\n     * }, 2500);\n     *\n     * // Logs:\n     * // 0 after 1s\n     * // 1 after 2s\n     * // \"unsubscribed!\" after 2,5s\n     *\n     *\n     * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n     *  or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n     *  Observable.\n     * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n     *  the error will be thrown as unhandled.\n     * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n     * @return {ISubscription} a subscription reference to the registered handlers\n     * @method subscribe\n     */\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var operator = this.operator;\n        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);\n        if (operator) {\n            operator.call(sink, this.source);\n        }\n        else {\n            sink.add(this.source ? this._subscribe(sink) : this._trySubscribe(sink));\n        }\n        if (sink.syncErrorThrowable) {\n            sink.syncErrorThrowable = false;\n            if (sink.syncErrorThrown) {\n                throw sink.syncErrorValue;\n            }\n        }\n        return sink;\n    };\n    Observable.prototype._trySubscribe = function (sink) {\n        try {\n            return this._subscribe(sink);\n        }\n        catch (err) {\n            sink.syncErrorThrown = true;\n            sink.syncErrorValue = err;\n            sink.error(err);\n        }\n    };\n    /**\n     * @method forEach\n     * @param {Function} next a handler for each value emitted by the observable\n     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise\n     * @return {Promise} a promise that either resolves on observable completion or\n     *  rejects with the handled error\n     */\n    Observable.prototype.forEach = function (next, PromiseCtor) {\n        var _this = this;\n        if (!PromiseCtor) {\n            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n                PromiseCtor = root_1.root.Rx.config.Promise;\n            }\n            else if (root_1.root.Promise) {\n                PromiseCtor = root_1.root.Promise;\n            }\n        }\n        if (!PromiseCtor) {\n            throw new Error('no Promise impl found');\n        }\n        return new PromiseCtor(function (resolve, reject) {\n            // Must be declared in a separate statement to avoid a RefernceError when\n            // accessing subscription below in the closure due to Temporal Dead Zone.\n            var subscription;\n            subscription = _this.subscribe(function (value) {\n                if (subscription) {\n                    // if there is a subscription, then we can surmise\n                    // the next handling is asynchronous. Any errors thrown\n                    // need to be rejected explicitly and unsubscribe must be\n                    // called manually\n                    try {\n                        next(value);\n                    }\n                    catch (err) {\n                        reject(err);\n                        subscription.unsubscribe();\n                    }\n                }\n                else {\n                    // if there is NO subscription, then we're getting a nexted\n                    // value synchronously during subscription. We can just call it.\n                    // If it errors, Observable's `subscribe` will ensure the\n                    // unsubscription logic is called, then synchronously rethrow the error.\n                    // After that, Promise will trap the error and send it\n                    // down the rejection path.\n                    next(value);\n                }\n            }, reject, resolve);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        return this.source.subscribe(subscriber);\n    };\n    /**\n     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n     * @method Symbol.observable\n     * @return {Observable} this instance of the observable\n     */\n    Observable.prototype[observable_1.observable] = function () {\n        return this;\n    };\n    // HACK: Since TypeScript inherits static properties too, we have to\n    // fight against TypeScript here so Subject can have a different static create signature\n    /**\n     * Creates a new cold Observable by calling the Observable constructor\n     * @static true\n     * @owner Observable\n     * @method create\n     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n     * @return {Observable} a new cold observable\n     */\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\nexports.Observable = Observable;\n//# sourceMappingURL=Observable.js.map",
+    "\"use strict\";\nvar root_1 = require('./util/root');\nvar toSubscriber_1 = require('./util/toSubscriber');\nvar observable_1 = require('./symbol/observable');\nvar pipe_1 = require('./util/pipe');\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable<T>\n */\nvar Observable = (function () {\n    /**\n     * @constructor\n     * @param {Function} subscribe the function that is called when the Observable is\n     * initially subscribed to. This function is given a Subscriber, to which new values\n     * can be `next`ed, or an `error` method can be called to raise an error, or\n     * `complete` can be called to notify of a successful completion.\n     */\n    function Observable(subscribe) {\n        this._isScalar = false;\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    /**\n     * Creates a new Observable, with this Observable as the source, and the passed\n     * operator defined as the new observable's operator.\n     * @method lift\n     * @param {Operator} operator the operator defining the operation to take on the observable\n     * @return {Observable} a new observable with the Operator applied\n     */\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    /**\n     * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n     *\n     * <span class=\"informal\">Use it when you have all these Observables, but still nothing is happening.</span>\n     *\n     * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n     * might be for example a function that you passed to a {@link create} static factory, but most of the time it is\n     * a library implementation, which defines what and when will be emitted by an Observable. This means that calling\n     * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n     * thought.\n     *\n     * Apart from starting the execution of an Observable, this method allows you to listen for values\n     * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n     * following ways.\n     *\n     * The first way is creating an object that implements {@link Observer} interface. It should have methods\n     * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n     * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do\n     * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n     * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n     * do anything, you can simply omit it. Note however, that if `error` method is not provided, all errors will\n     * be left uncaught.\n     *\n     * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n     * This means you can provide three functions as arguments to `subscribe`, where first function is equivalent\n     * of a `next` method, second of an `error` method and third of a `complete` method. Just as in case of Observer,\n     * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,\n     * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n     * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.\n     *\n     * Whatever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n     * This object allows you to call `unsubscribe` on it, which in turn will stop work that an Observable does and will clean\n     * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n     * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n     *\n     * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n     * It is an Observable itself that decides when these functions will be called. For example {@link of}\n     * by default emits all its values synchronously. Always check documentation for how given Observable\n     * will behave when subscribed and if its default behavior can be modified with a {@link Scheduler}.\n     *\n     * @example <caption>Subscribe with an Observer</caption>\n     * const sumObserver = {\n     *   sum: 0,\n     *   next(value) {\n     *     console.log('Adding: ' + value);\n     *     this.sum = this.sum + value;\n     *   },\n     *   error() { // We actually could just remove this method,\n     *   },        // since we do not really care about errors right now.\n     *   complete() {\n     *     console.log('Sum equals: ' + this.sum);\n     *   }\n     * };\n     *\n     * Rx.Observable.of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n     * .subscribe(sumObserver);\n     *\n     * // Logs:\n     * // \"Adding: 1\"\n     * // \"Adding: 2\"\n     * // \"Adding: 3\"\n     * // \"Sum equals: 6\"\n     *\n     *\n     * @example <caption>Subscribe with functions</caption>\n     * let sum = 0;\n     *\n     * Rx.Observable.of(1, 2, 3)\n     * .subscribe(\n     *   function(value) {\n     *     console.log('Adding: ' + value);\n     *     sum = sum + value;\n     *   },\n     *   undefined,\n     *   function() {\n     *     console.log('Sum equals: ' + sum);\n     *   }\n     * );\n     *\n     * // Logs:\n     * // \"Adding: 1\"\n     * // \"Adding: 2\"\n     * // \"Adding: 3\"\n     * // \"Sum equals: 6\"\n     *\n     *\n     * @example <caption>Cancel a subscription</caption>\n     * const subscription = Rx.Observable.interval(1000).subscribe(\n     *   num => console.log(num),\n     *   undefined,\n     *   () => console.log('completed!') // Will not be called, even\n     * );                                // when cancelling subscription\n     *\n     *\n     * setTimeout(() => {\n     *   subscription.unsubscribe();\n     *   console.log('unsubscribed!');\n     * }, 2500);\n     *\n     * // Logs:\n     * // 0 after 1s\n     * // 1 after 2s\n     * // \"unsubscribed!\" after 2.5s\n     *\n     *\n     * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n     *  or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n     *  Observable.\n     * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n     *  the error will be thrown as unhandled.\n     * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n     * @return {ISubscription} a subscription reference to the registered handlers\n     * @method subscribe\n     */\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var operator = this.operator;\n        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);\n        if (operator) {\n            operator.call(sink, this.source);\n        }\n        else {\n            sink.add(this.source ? this._subscribe(sink) : this._trySubscribe(sink));\n        }\n        if (sink.syncErrorThrowable) {\n            sink.syncErrorThrowable = false;\n            if (sink.syncErrorThrown) {\n                throw sink.syncErrorValue;\n            }\n        }\n        return sink;\n    };\n    Observable.prototype._trySubscribe = function (sink) {\n        try {\n            return this._subscribe(sink);\n        }\n        catch (err) {\n            sink.syncErrorThrown = true;\n            sink.syncErrorValue = err;\n            sink.error(err);\n        }\n    };\n    /**\n     * @method forEach\n     * @param {Function} next a handler for each value emitted by the observable\n     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise\n     * @return {Promise} a promise that either resolves on observable completion or\n     *  rejects with the handled error\n     */\n    Observable.prototype.forEach = function (next, PromiseCtor) {\n        var _this = this;\n        if (!PromiseCtor) {\n            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n                PromiseCtor = root_1.root.Rx.config.Promise;\n            }\n            else if (root_1.root.Promise) {\n                PromiseCtor = root_1.root.Promise;\n            }\n        }\n        if (!PromiseCtor) {\n            throw new Error('no Promise impl found');\n        }\n        return new PromiseCtor(function (resolve, reject) {\n            // Must be declared in a separate statement to avoid a RefernceError when\n            // accessing subscription below in the closure due to Temporal Dead Zone.\n            var subscription;\n            subscription = _this.subscribe(function (value) {\n                if (subscription) {\n                    // if there is a subscription, then we can surmise\n                    // the next handling is asynchronous. Any errors thrown\n                    // need to be rejected explicitly and unsubscribe must be\n                    // called manually\n                    try {\n                        next(value);\n                    }\n                    catch (err) {\n                        reject(err);\n                        subscription.unsubscribe();\n                    }\n                }\n                else {\n                    // if there is NO subscription, then we're getting a nexted\n                    // value synchronously during subscription. We can just call it.\n                    // If it errors, Observable's `subscribe` will ensure the\n                    // unsubscription logic is called, then synchronously rethrow the error.\n                    // After that, Promise will trap the error and send it\n                    // down the rejection path.\n                    next(value);\n                }\n            }, reject, resolve);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        return this.source.subscribe(subscriber);\n    };\n    /**\n     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n     * @method Symbol.observable\n     * @return {Observable} this instance of the observable\n     */\n    Observable.prototype[observable_1.observable] = function () {\n        return this;\n    };\n    /* tslint:enable:max-line-length */\n    /**\n     * Used to stitch together functional operators into a chain.\n     * @method pipe\n     * @return {Observable} the Observable result of all of the operators having\n     * been called in the order they were passed in.\n     *\n     * @example\n     *\n     * import { map, filter, scan } from 'rxjs/operators';\n     *\n     * Rx.Observable.interval(1000)\n     *   .pipe(\n     *     filter(x => x % 2 === 0),\n     *     map(x => x + x),\n     *     scan((acc, x) => acc + x)\n     *   )\n     *   .subscribe(x => console.log(x))\n     */\n    Observable.prototype.pipe = function () {\n        var operations = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            operations[_i - 0] = arguments[_i];\n        }\n        if (operations.length === 0) {\n            return this;\n        }\n        return pipe_1.pipeFromArray(operations)(this);\n    };\n    /* tslint:enable:max-line-length */\n    Observable.prototype.toPromise = function (PromiseCtor) {\n        var _this = this;\n        if (!PromiseCtor) {\n            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n                PromiseCtor = root_1.root.Rx.config.Promise;\n            }\n            else if (root_1.root.Promise) {\n                PromiseCtor = root_1.root.Promise;\n            }\n        }\n        if (!PromiseCtor) {\n            throw new Error('no Promise impl found');\n        }\n        return new PromiseCtor(function (resolve, reject) {\n            var value;\n            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });\n        });\n    };\n    // HACK: Since TypeScript inherits static properties too, we have to\n    // fight against TypeScript here so Subject can have a different static create signature\n    /**\n     * Creates a new cold Observable by calling the Observable constructor\n     * @static true\n     * @owner Observable\n     * @method create\n     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n     * @return {Observable} a new cold observable\n     */\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\nexports.Observable = Observable;\n//# sourceMappingURL=Observable.js.map",
     "\"use strict\";\nexports.empty = {\n    closed: true,\n    next: function (value) { },\n    error: function (err) { throw err; },\n    complete: function () { }\n};\n//# sourceMappingURL=Observer.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('./Subscriber');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar OuterSubscriber = (function (_super) {\n    __extends(OuterSubscriber, _super);\n    function OuterSubscriber() {\n        _super.apply(this, arguments);\n    }\n    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    OuterSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.destination.error(error);\n    };\n    OuterSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.destination.complete();\n    };\n    return OuterSubscriber;\n}(Subscriber_1.Subscriber));\nexports.OuterSubscriber = OuterSubscriber;\n//# sourceMappingURL=OuterSubscriber.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('./Subject');\nvar queue_1 = require('./scheduler/queue');\nvar Subscription_1 = require('./Subscription');\nvar observeOn_1 = require('./operator/observeOn');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\nvar SubjectSubscription_1 = require('./SubjectSubscription');\n/**\n * @class ReplaySubject<T>\n */\nvar ReplaySubject = (function (_super) {\n    __extends(ReplaySubject, _super);\n    function ReplaySubject(bufferSize, windowTime, scheduler) {\n        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n        _super.call(this);\n        this.scheduler = scheduler;\n        this._events = [];\n        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n        this._windowTime = windowTime < 1 ? 1 : windowTime;\n    }\n    ReplaySubject.prototype.next = function (value) {\n        var now = this._getNow();\n        this._events.push(new ReplayEvent(now, value));\n        this._trimBufferThenGetEvents();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        var _events = this._trimBufferThenGetEvents();\n        var scheduler = this.scheduler;\n        var subscription;\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n        }\n        if (scheduler) {\n            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));\n        }\n        var len = _events.length;\n        for (var i = 0; i < len && !subscriber.closed; i++) {\n            subscriber.next(_events[i].value);\n        }\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n        }\n        return subscription;\n    };\n    ReplaySubject.prototype._getNow = function () {\n        return (this.scheduler || queue_1.queue).now();\n    };\n    ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n        var now = this._getNow();\n        var _bufferSize = this._bufferSize;\n        var _windowTime = this._windowTime;\n        var _events = this._events;\n        var eventsCount = _events.length;\n        var spliceCount = 0;\n        // Trim events that fall out of the time window.\n        // Start at the front of the list. Break early once\n        // we encounter an event that falls within the window.\n        while (spliceCount < eventsCount) {\n            if ((now - _events[spliceCount].time) < _windowTime) {\n                break;\n            }\n            spliceCount++;\n        }\n        if (eventsCount > _bufferSize) {\n            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n        }\n        if (spliceCount > 0) {\n            _events.splice(0, spliceCount);\n        }\n        return _events;\n    };\n    return ReplaySubject;\n}(Subject_1.Subject));\nexports.ReplaySubject = ReplaySubject;\nvar ReplayEvent = (function () {\n    function ReplayEvent(time, value) {\n        this.time = time;\n        this.value = value;\n    }\n    return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('./Subject');\nvar queue_1 = require('./scheduler/queue');\nvar Subscription_1 = require('./Subscription');\nvar observeOn_1 = require('./operators/observeOn');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\nvar SubjectSubscription_1 = require('./SubjectSubscription');\n/**\n * @class ReplaySubject<T>\n */\nvar ReplaySubject = (function (_super) {\n    __extends(ReplaySubject, _super);\n    function ReplaySubject(bufferSize, windowTime, scheduler) {\n        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n        _super.call(this);\n        this.scheduler = scheduler;\n        this._events = [];\n        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n        this._windowTime = windowTime < 1 ? 1 : windowTime;\n    }\n    ReplaySubject.prototype.next = function (value) {\n        var now = this._getNow();\n        this._events.push(new ReplayEvent(now, value));\n        this._trimBufferThenGetEvents();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        var _events = this._trimBufferThenGetEvents();\n        var scheduler = this.scheduler;\n        var subscription;\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscription = Subscription_1.Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n        }\n        if (scheduler) {\n            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));\n        }\n        var len = _events.length;\n        for (var i = 0; i < len && !subscriber.closed; i++) {\n            subscriber.next(_events[i].value);\n        }\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n        }\n        return subscription;\n    };\n    ReplaySubject.prototype._getNow = function () {\n        return (this.scheduler || queue_1.queue).now();\n    };\n    ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n        var now = this._getNow();\n        var _bufferSize = this._bufferSize;\n        var _windowTime = this._windowTime;\n        var _events = this._events;\n        var eventsCount = _events.length;\n        var spliceCount = 0;\n        // Trim events that fall out of the time window.\n        // Start at the front of the list. Break early once\n        // we encounter an event that falls within the window.\n        while (spliceCount < eventsCount) {\n            if ((now - _events[spliceCount].time) < _windowTime) {\n                break;\n            }\n            spliceCount++;\n        }\n        if (eventsCount > _bufferSize) {\n            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n        }\n        if (spliceCount > 0) {\n            _events.splice(0, spliceCount);\n        }\n        return _events;\n    };\n    return ReplaySubject;\n}(Subject_1.Subject));\nexports.ReplaySubject = ReplaySubject;\nvar ReplayEvent = (function () {\n    function ReplayEvent(time, value) {\n        this.time = time;\n        this.value = value;\n    }\n    return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map",
     "\"use strict\";\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an {@link Action}.\n *\n * ```ts\n * class Scheduler {\n *   now(): number;\n *   schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n */\nvar Scheduler = (function () {\n    function Scheduler(SchedulerAction, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        this.SchedulerAction = SchedulerAction;\n        this.now = now;\n    }\n    /**\n     * Schedules a function, `work`, for execution. May happen at some point in\n     * the future, according to the `delay` parameter, if specified. May be passed\n     * some context object, `state`, which will be passed to the `work` function.\n     *\n     * The given arguments will be processed an stored as an Action object in a\n     * queue of actions.\n     *\n     * @param {function(state: ?T): ?Subscription} work A function representing a\n     * task, or some unit of work to be executed by the Scheduler.\n     * @param {number} [delay] Time to wait before executing the work, where the\n     * time unit is implicit and defined by the Scheduler itself.\n     * @param {T} [state] Some contextual data that the `work` function uses when\n     * called by the Scheduler.\n     * @return {Subscription} A subscription in order to be able to unsubscribe\n     * the scheduled work.\n     */\n    Scheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) { delay = 0; }\n        return new this.SchedulerAction(this, work).schedule(state, delay);\n    };\n    Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };\n    return Scheduler;\n}());\nexports.Scheduler = Scheduler;\n//# sourceMappingURL=Scheduler.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('./Observable');\nvar Subscriber_1 = require('./Subscriber');\nvar Subscription_1 = require('./Subscription');\nvar ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');\nvar SubjectSubscription_1 = require('./SubjectSubscription');\nvar rxSubscriber_1 = require('./symbol/rxSubscriber');\n/**\n * @class SubjectSubscriber<T>\n */\nvar SubjectSubscriber = (function (_super) {\n    __extends(SubjectSubscriber, _super);\n    function SubjectSubscriber(destination) {\n        _super.call(this, destination);\n        this.destination = destination;\n    }\n    return SubjectSubscriber;\n}(Subscriber_1.Subscriber));\nexports.SubjectSubscriber = SubjectSubscriber;\n/**\n * @class Subject<T>\n */\nvar Subject = (function (_super) {\n    __extends(Subject, _super);\n    function Subject() {\n        _super.call(this);\n        this.observers = [];\n        this.closed = false;\n        this.isStopped = false;\n        this.hasError = false;\n        this.thrownError = null;\n    }\n    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {\n        return new SubjectSubscriber(this);\n    };\n    Subject.prototype.lift = function (operator) {\n        var subject = new AnonymousSubject(this, this);\n        subject.operator = operator;\n        return subject;\n    };\n    Subject.prototype.next = function (value) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        if (!this.isStopped) {\n            var observers = this.observers;\n            var len = observers.length;\n            var copy = observers.slice();\n            for (var i = 0; i < len; i++) {\n                copy[i].next(value);\n            }\n        }\n    };\n    Subject.prototype.error = function (err) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        this.hasError = true;\n        this.thrownError = err;\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].error(err);\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.complete = function () {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].complete();\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.unsubscribe = function () {\n        this.isStopped = true;\n        this.closed = true;\n        this.observers = null;\n    };\n    Subject.prototype._trySubscribe = function (subscriber) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else {\n            return _super.prototype._trySubscribe.call(this, subscriber);\n        }\n    };\n    Subject.prototype._subscribe = function (subscriber) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return Subscription_1.Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n            return Subscription_1.Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n        }\n    };\n    Subject.prototype.asObservable = function () {\n        var observable = new Observable_1.Observable();\n        observable.source = this;\n        return observable;\n    };\n    Subject.create = function (destination, source) {\n        return new AnonymousSubject(destination, source);\n    };\n    return Subject;\n}(Observable_1.Observable));\nexports.Subject = Subject;\n/**\n * @class AnonymousSubject<T>\n */\nvar AnonymousSubject = (function (_super) {\n    __extends(AnonymousSubject, _super);\n    function AnonymousSubject(destination, source) {\n        _super.call(this);\n        this.destination = destination;\n        this.source = source;\n    }\n    AnonymousSubject.prototype.next = function (value) {\n        var destination = this.destination;\n        if (destination && destination.next) {\n            destination.next(value);\n        }\n    };\n    AnonymousSubject.prototype.error = function (err) {\n        var destination = this.destination;\n        if (destination && destination.error) {\n            this.destination.error(err);\n        }\n    };\n    AnonymousSubject.prototype.complete = function () {\n        var destination = this.destination;\n        if (destination && destination.complete) {\n            this.destination.complete();\n        }\n    };\n    AnonymousSubject.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        if (source) {\n            return this.source.subscribe(subscriber);\n        }\n        else {\n            return Subscription_1.Subscription.EMPTY;\n        }\n    };\n    return AnonymousSubject;\n}(Subject));\nexports.AnonymousSubject = AnonymousSubject;\n//# sourceMappingURL=Subject.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('./Subscription');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SubjectSubscription = (function (_super) {\n    __extends(SubjectSubscription, _super);\n    function SubjectSubscription(subject, subscriber) {\n        _super.call(this);\n        this.subject = subject;\n        this.subscriber = subscriber;\n        this.closed = false;\n    }\n    SubjectSubscription.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.closed = true;\n        var subject = this.subject;\n        var observers = subject.observers;\n        this.subject = null;\n        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n            return;\n        }\n        var subscriberIndex = observers.indexOf(this.subscriber);\n        if (subscriberIndex !== -1) {\n            observers.splice(subscriberIndex, 1);\n        }\n    };\n    return SubjectSubscription;\n}(Subscription_1.Subscription));\nexports.SubjectSubscription = SubjectSubscription;\n//# sourceMappingURL=SubjectSubscription.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar pluck_1 = require('../../operator/pluck');\nObservable_1.Observable.prototype.pluck = pluck_1.pluck;\n//# sourceMappingURL=pluck.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar publish_1 = require('../../operator/publish');\nObservable_1.Observable.prototype.publish = publish_1.publish;\n//# sourceMappingURL=publish.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar publishReplay_1 = require('../../operator/publishReplay');\nObservable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;\n//# sourceMappingURL=publishReplay.js.map",
+    "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar retry_1 = require('../../operator/retry');\nObservable_1.Observable.prototype.retry = retry_1.retry;\n//# sourceMappingURL=retry.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar sample_1 = require('../../operator/sample');\nObservable_1.Observable.prototype.sample = sample_1.sample;\n//# sourceMappingURL=sample.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar scan_1 = require('../../operator/scan');\nObservable_1.Observable.prototype.scan = scan_1.scan;\n//# sourceMappingURL=scan.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar share_1 = require('../../operator/share');\nObservable_1.Observable.prototype.share = share_1.share;\n//# sourceMappingURL=share.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar takeUntil_1 = require('../../operator/takeUntil');\nObservable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;\n//# sourceMappingURL=takeUntil.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar takeWhile_1 = require('../../operator/takeWhile');\nObservable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile;\n//# sourceMappingURL=takeWhile.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar throttleTime_1 = require('../../operator/throttleTime');\nObservable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime;\n//# sourceMappingURL=throttleTime.js.map",
+    "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar timeout_1 = require('../../operator/timeout');\nObservable_1.Observable.prototype.timeout = timeout_1.timeout;\n//# sourceMappingURL=timeout.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar withLatestFrom_1 = require('../../operator/withLatestFrom');\nObservable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;\n//# sourceMappingURL=withLatestFrom.js.map",
     "\"use strict\";\nvar Observable_1 = require('../../Observable');\nvar zip_1 = require('../../operator/zip');\nObservable_1.Observable.prototype.zip = zip_1.zipProto;\n//# sourceMappingURL=zip.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar ScalarObservable_1 = require('./ScalarObservable');\nvar EmptyObservable_1 = require('./EmptyObservable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayLikeObservable = (function (_super) {\n    __extends(ArrayLikeObservable, _super);\n    function ArrayLikeObservable(arrayLike, scheduler) {\n        _super.call(this);\n        this.arrayLike = arrayLike;\n        this.scheduler = scheduler;\n        if (!scheduler && arrayLike.length === 1) {\n            this._isScalar = true;\n            this.value = arrayLike[0];\n        }\n    }\n    ArrayLikeObservable.create = function (arrayLike, scheduler) {\n        var length = arrayLike.length;\n        if (length === 0) {\n            return new EmptyObservable_1.EmptyObservable();\n        }\n        else if (length === 1) {\n            return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);\n        }\n        else {\n            return new ArrayLikeObservable(arrayLike, scheduler);\n        }\n    };\n    ArrayLikeObservable.dispatch = function (state) {\n        var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;\n        if (subscriber.closed) {\n            return;\n        }\n        if (index >= length) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(arrayLike[index]);\n        state.index = index + 1;\n        this.schedule(state);\n    };\n    ArrayLikeObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;\n        var length = arrayLike.length;\n        if (scheduler) {\n            return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {\n                arrayLike: arrayLike, index: index, length: length, subscriber: subscriber\n            });\n        }\n        else {\n            for (var i = 0; i < length && !subscriber.closed; i++) {\n                subscriber.next(arrayLike[i]);\n            }\n            subscriber.complete();\n        }\n    };\n    return ArrayLikeObservable;\n}(Observable_1.Observable));\nexports.ArrayLikeObservable = ArrayLikeObservable;\n//# sourceMappingURL=ArrayLikeObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar ScalarObservable_1 = require('./ScalarObservable');\nvar EmptyObservable_1 = require('./EmptyObservable');\nvar isScheduler_1 = require('../util/isScheduler');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayObservable = (function (_super) {\n    __extends(ArrayObservable, _super);\n    function ArrayObservable(array, scheduler) {\n        _super.call(this);\n        this.array = array;\n        this.scheduler = scheduler;\n        if (!scheduler && array.length === 1) {\n            this._isScalar = true;\n            this.value = array[0];\n        }\n    }\n    ArrayObservable.create = function (array, scheduler) {\n        return new ArrayObservable(array, scheduler);\n    };\n    /**\n     * Creates an Observable that emits some values you specify as arguments,\n     * immediately one after the other, and then emits a complete notification.\n     *\n     * <span class=\"informal\">Emits the arguments you provide, then completes.\n     * </span>\n     *\n     * <img src=\"./img/of.png\" width=\"100%\">\n     *\n     * This static operator is useful for creating a simple Observable that only\n     * emits the arguments given, and the complete notification thereafter. It can\n     * be used for composing with other Observables, such as with {@link concat}.\n     * By default, it uses a `null` IScheduler, which means the `next`\n     * notifications are sent synchronously, although with a different IScheduler\n     * it is possible to determine when those notifications will be delivered.\n     *\n     * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>\n     * var numbers = Rx.Observable.of(10, 20, 30);\n     * var letters = Rx.Observable.of('a', 'b', 'c');\n     * var interval = Rx.Observable.interval(1000);\n     * var result = numbers.concat(letters).concat(interval);\n     * result.subscribe(x => console.log(x));\n     *\n     * @see {@link create}\n     * @see {@link empty}\n     * @see {@link never}\n     * @see {@link throw}\n     *\n     * @param {...T} values Arguments that represent `next` values to be emitted.\n     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n     * the emissions of the `next` notifications.\n     * @return {Observable<T>} An Observable that emits each given input value.\n     * @static true\n     * @name of\n     * @owner Observable\n     */\n    ArrayObservable.of = function () {\n        var array = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            array[_i - 0] = arguments[_i];\n        }\n        var scheduler = array[array.length - 1];\n        if (isScheduler_1.isScheduler(scheduler)) {\n            array.pop();\n        }\n        else {\n            scheduler = null;\n        }\n        var len = array.length;\n        if (len > 1) {\n            return new ArrayObservable(array, scheduler);\n        }\n        else if (len === 1) {\n            return new ScalarObservable_1.ScalarObservable(array[0], scheduler);\n        }\n        else {\n            return new EmptyObservable_1.EmptyObservable(scheduler);\n        }\n    };\n    ArrayObservable.dispatch = function (state) {\n        var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;\n        if (index >= count) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(array[index]);\n        if (subscriber.closed) {\n            return;\n        }\n        state.index = index + 1;\n        this.schedule(state);\n    };\n    ArrayObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var array = this.array;\n        var count = array.length;\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(ArrayObservable.dispatch, 0, {\n                array: array, index: index, count: count, subscriber: subscriber\n            });\n        }\n        else {\n            for (var i = 0; i < count && !subscriber.closed; i++) {\n                subscriber.next(array[i]);\n            }\n            subscriber.complete();\n        }\n    };\n    return ArrayObservable;\n}(Observable_1.Observable));\nexports.ArrayObservable = ArrayObservable;\n//# sourceMappingURL=ArrayObservable.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('../Subject');\nvar Observable_1 = require('../Observable');\nvar Subscriber_1 = require('../Subscriber');\nvar Subscription_1 = require('../Subscription');\n/**\n * @class ConnectableObservable<T>\n */\nvar ConnectableObservable = (function (_super) {\n    __extends(ConnectableObservable, _super);\n    function ConnectableObservable(source, subjectFactory) {\n        _super.call(this);\n        this.source = source;\n        this.subjectFactory = subjectFactory;\n        this._refCount = 0;\n        this._isComplete = false;\n    }\n    ConnectableObservable.prototype._subscribe = function (subscriber) {\n        return this.getSubject().subscribe(subscriber);\n    };\n    ConnectableObservable.prototype.getSubject = function () {\n        var subject = this._subject;\n        if (!subject || subject.isStopped) {\n            this._subject = this.subjectFactory();\n        }\n        return this._subject;\n    };\n    ConnectableObservable.prototype.connect = function () {\n        var connection = this._connection;\n        if (!connection) {\n            this._isComplete = false;\n            connection = this._connection = new Subscription_1.Subscription();\n            connection.add(this.source\n                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n            if (connection.closed) {\n                this._connection = null;\n                connection = Subscription_1.Subscription.EMPTY;\n            }\n            else {\n                this._connection = connection;\n            }\n        }\n        return connection;\n    };\n    ConnectableObservable.prototype.refCount = function () {\n        return this.lift(new RefCountOperator(this));\n    };\n    return ConnectableObservable;\n}(Observable_1.Observable));\nexports.ConnectableObservable = ConnectableObservable;\nvar connectableProto = ConnectableObservable.prototype;\nexports.connectableObservableDescriptor = {\n    operator: { value: null },\n    _refCount: { value: 0, writable: true },\n    _subject: { value: null, writable: true },\n    _connection: { value: null, writable: true },\n    _subscribe: { value: connectableProto._subscribe },\n    _isComplete: { value: connectableProto._isComplete, writable: true },\n    getSubject: { value: connectableProto.getSubject },\n    connect: { value: connectableProto.connect },\n    refCount: { value: connectableProto.refCount }\n};\nvar ConnectableSubscriber = (function (_super) {\n    __extends(ConnectableSubscriber, _super);\n    function ConnectableSubscriber(destination, connectable) {\n        _super.call(this, destination);\n        this.connectable = connectable;\n    }\n    ConnectableSubscriber.prototype._error = function (err) {\n        this._unsubscribe();\n        _super.prototype._error.call(this, err);\n    };\n    ConnectableSubscriber.prototype._complete = function () {\n        this.connectable._isComplete = true;\n        this._unsubscribe();\n        _super.prototype._complete.call(this);\n    };\n    ConnectableSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (connectable) {\n            this.connectable = null;\n            var connection = connectable._connection;\n            connectable._refCount = 0;\n            connectable._subject = null;\n            connectable._connection = null;\n            if (connection) {\n                connection.unsubscribe();\n            }\n        }\n    };\n    return ConnectableSubscriber;\n}(Subject_1.SubjectSubscriber));\nvar RefCountOperator = (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n    __extends(RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        _super.call(this, destination);\n        this.connectable = connectable;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        ///\n        // Compare the local RefCountSubscriber's connection Subscription to the\n        // connection Subscription on the shared ConnectableObservable. In cases\n        // where the ConnectableObservable source synchronously emits values, and\n        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n        // execution continues to here before the RefCountOperator has a chance to\n        // supply the RefCountSubscriber with the shared connection Subscription.\n        // For example:\n        // ```\n        // Observable.range(0, 10)\n        //   .publish()\n        //   .refCount()\n        //   .take(5)\n        //   .subscribe();\n        // ```\n        // In order to account for this case, RefCountSubscriber should only dispose\n        // the ConnectableObservable's shared connection Subscription if the\n        // connection Subscription exists, *and* either:\n        //   a. RefCountSubscriber doesn't have a reference to the shared connection\n        //      Subscription yet, or,\n        //   b. RefCountSubscriber's connection Subscription reference is identical\n        //      to the shared connection Subscription\n        ///\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=ConnectableObservable.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = require('../Subject');\nvar Observable_1 = require('../Observable');\nvar Subscriber_1 = require('../Subscriber');\nvar Subscription_1 = require('../Subscription');\nvar refCount_1 = require('../operators/refCount');\n/**\n * @class ConnectableObservable<T>\n */\nvar ConnectableObservable = (function (_super) {\n    __extends(ConnectableObservable, _super);\n    function ConnectableObservable(source, subjectFactory) {\n        _super.call(this);\n        this.source = source;\n        this.subjectFactory = subjectFactory;\n        this._refCount = 0;\n        this._isComplete = false;\n    }\n    ConnectableObservable.prototype._subscribe = function (subscriber) {\n        return this.getSubject().subscribe(subscriber);\n    };\n    ConnectableObservable.prototype.getSubject = function () {\n        var subject = this._subject;\n        if (!subject || subject.isStopped) {\n            this._subject = this.subjectFactory();\n        }\n        return this._subject;\n    };\n    ConnectableObservable.prototype.connect = function () {\n        var connection = this._connection;\n        if (!connection) {\n            this._isComplete = false;\n            connection = this._connection = new Subscription_1.Subscription();\n            connection.add(this.source\n                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n            if (connection.closed) {\n                this._connection = null;\n                connection = Subscription_1.Subscription.EMPTY;\n            }\n            else {\n                this._connection = connection;\n            }\n        }\n        return connection;\n    };\n    ConnectableObservable.prototype.refCount = function () {\n        return refCount_1.refCount()(this);\n    };\n    return ConnectableObservable;\n}(Observable_1.Observable));\nexports.ConnectableObservable = ConnectableObservable;\nvar connectableProto = ConnectableObservable.prototype;\nexports.connectableObservableDescriptor = {\n    operator: { value: null },\n    _refCount: { value: 0, writable: true },\n    _subject: { value: null, writable: true },\n    _connection: { value: null, writable: true },\n    _subscribe: { value: connectableProto._subscribe },\n    _isComplete: { value: connectableProto._isComplete, writable: true },\n    getSubject: { value: connectableProto.getSubject },\n    connect: { value: connectableProto.connect },\n    refCount: { value: connectableProto.refCount }\n};\nvar ConnectableSubscriber = (function (_super) {\n    __extends(ConnectableSubscriber, _super);\n    function ConnectableSubscriber(destination, connectable) {\n        _super.call(this, destination);\n        this.connectable = connectable;\n    }\n    ConnectableSubscriber.prototype._error = function (err) {\n        this._unsubscribe();\n        _super.prototype._error.call(this, err);\n    };\n    ConnectableSubscriber.prototype._complete = function () {\n        this.connectable._isComplete = true;\n        this._unsubscribe();\n        _super.prototype._complete.call(this);\n    };\n    ConnectableSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (connectable) {\n            this.connectable = null;\n            var connection = connectable._connection;\n            connectable._refCount = 0;\n            connectable._subject = null;\n            connectable._connection = null;\n            if (connection) {\n                connection.unsubscribe();\n            }\n        }\n    };\n    return ConnectableSubscriber;\n}(Subject_1.SubjectSubscriber));\nvar RefCountOperator = (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n    __extends(RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        _super.call(this, destination);\n        this.connectable = connectable;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        ///\n        // Compare the local RefCountSubscriber's connection Subscription to the\n        // connection Subscription on the shared ConnectableObservable. In cases\n        // where the ConnectableObservable source synchronously emits values, and\n        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n        // execution continues to here before the RefCountOperator has a chance to\n        // supply the RefCountSubscriber with the shared connection Subscription.\n        // For example:\n        // ```\n        // Observable.range(0, 10)\n        //   .publish()\n        //   .refCount()\n        //   .take(5)\n        //   .subscribe();\n        // ```\n        // In order to account for this case, RefCountSubscriber should only dispose\n        // the ConnectableObservable's shared connection Subscription if the\n        // connection Subscription exists, *and* either:\n        //   a. RefCountSubscriber doesn't have a reference to the shared connection\n        //      Subscription yet, or,\n        //   b. RefCountSubscriber's connection Subscription reference is identical\n        //      to the shared connection Subscription\n        ///\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=ConnectableObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar DeferObservable = (function (_super) {\n    __extends(DeferObservable, _super);\n    function DeferObservable(observableFactory) {\n        _super.call(this);\n        this.observableFactory = observableFactory;\n    }\n    /**\n     * Creates an Observable that, on subscribe, calls an Observable factory to\n     * make an Observable for each new Observer.\n     *\n     * <span class=\"informal\">Creates the Observable lazily, that is, only when it\n     * is subscribed.\n     * </span>\n     *\n     * <img src=\"./img/defer.png\" width=\"100%\">\n     *\n     * `defer` allows you to create the Observable only when the Observer\n     * subscribes, and create a fresh Observable for each Observer. It waits until\n     * an Observer subscribes to it, and then it generates an Observable,\n     * typically with an Observable factory function. It does this afresh for each\n     * subscriber, so although each subscriber may think it is subscribing to the\n     * same Observable, in fact each subscriber gets its own individual\n     * Observable.\n     *\n     * @example <caption>Subscribe to either an Observable of clicks or an Observable of interval, at random</caption>\n     * var clicksOrInterval = Rx.Observable.defer(function () {\n     *   if (Math.random() > 0.5) {\n     *     return Rx.Observable.fromEvent(document, 'click');\n     *   } else {\n     *     return Rx.Observable.interval(1000);\n     *   }\n     * });\n     * clicksOrInterval.subscribe(x => console.log(x));\n     *\n     * // Results in the following behavior:\n     * // If the result of Math.random() is greater than 0.5 it will listen\n     * // for clicks anywhere on the \"document\"; when document is clicked it\n     * // will log a MouseEvent object to the console. If the result is less\n     * // than 0.5 it will emit ascending numbers, one every second(1000ms).\n     *\n     * @see {@link create}\n     *\n     * @param {function(): SubscribableOrPromise} observableFactory The Observable\n     * factory function to invoke for each Observer that subscribes to the output\n     * Observable. May also return a Promise, which will be converted on the fly\n     * to an Observable.\n     * @return {Observable} An Observable whose Observers' subscriptions trigger\n     * an invocation of the given Observable factory function.\n     * @static true\n     * @name defer\n     * @owner Observable\n     */\n    DeferObservable.create = function (observableFactory) {\n        return new DeferObservable(observableFactory);\n    };\n    DeferObservable.prototype._subscribe = function (subscriber) {\n        return new DeferSubscriber(subscriber, this.observableFactory);\n    };\n    return DeferObservable;\n}(Observable_1.Observable));\nexports.DeferObservable = DeferObservable;\nvar DeferSubscriber = (function (_super) {\n    __extends(DeferSubscriber, _super);\n    function DeferSubscriber(destination, factory) {\n        _super.call(this, destination);\n        this.factory = factory;\n        this.tryDefer();\n    }\n    DeferSubscriber.prototype.tryDefer = function () {\n        try {\n            this._callFactory();\n        }\n        catch (err) {\n            this._error(err);\n        }\n    };\n    DeferSubscriber.prototype._callFactory = function () {\n        var result = this.factory();\n        if (result) {\n            this.add(subscribeToResult_1.subscribeToResult(this, result));\n        }\n    };\n    return DeferSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=DeferObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar EmptyObservable = (function (_super) {\n    __extends(EmptyObservable, _super);\n    function EmptyObservable(scheduler) {\n        _super.call(this);\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable that emits no items to the Observer and immediately\n     * emits a complete notification.\n     *\n     * <span class=\"informal\">Just emits 'complete', and nothing else.\n     * </span>\n     *\n     * <img src=\"./img/empty.png\" width=\"100%\">\n     *\n     * This static operator is useful for creating a simple Observable that only\n     * emits the complete notification. It can be used for composing with other\n     * Observables, such as in a {@link mergeMap}.\n     *\n     * @example <caption>Emit the number 7, then complete.</caption>\n     * var result = Rx.Observable.empty().startWith(7);\n     * result.subscribe(x => console.log(x));\n     *\n     * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>\n     * var interval = Rx.Observable.interval(1000);\n     * var result = interval.mergeMap(x =>\n     *   x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()\n     * );\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following to the console:\n     * // x is equal to the count on the interval eg(0,1,2,3,...)\n     * // x will occur every 1000ms\n     * // if x % 2 is equal to 1 print abc\n     * // if x % 2 is not equal to 1 nothing will be output\n     *\n     * @see {@link create}\n     * @see {@link never}\n     * @see {@link of}\n     * @see {@link throw}\n     *\n     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n     * the emission of the complete notification.\n     * @return {Observable} An \"empty\" Observable: emits only the complete\n     * notification.\n     * @static true\n     * @name empty\n     * @owner Observable\n     */\n    EmptyObservable.create = function (scheduler) {\n        return new EmptyObservable(scheduler);\n    };\n    EmptyObservable.dispatch = function (arg) {\n        var subscriber = arg.subscriber;\n        subscriber.complete();\n    };\n    EmptyObservable.prototype._subscribe = function (subscriber) {\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });\n        }\n        else {\n            subscriber.complete();\n        }\n    };\n    return EmptyObservable;\n}(Observable_1.Observable));\nexports.EmptyObservable = EmptyObservable;\n//# sourceMappingURL=EmptyObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ErrorObservable = (function (_super) {\n    __extends(ErrorObservable, _super);\n    function ErrorObservable(error, scheduler) {\n        _super.call(this);\n        this.error = error;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable that emits no items to the Observer and immediately\n     * emits an error notification.\n     *\n     * <span class=\"informal\">Just emits 'error', and nothing else.\n     * </span>\n     *\n     * <img src=\"./img/throw.png\" width=\"100%\">\n     *\n     * This static operator is useful for creating a simple Observable that only\n     * emits the error notification. It can be used for composing with other\n     * Observables, such as in a {@link mergeMap}.\n     *\n     * @example <caption>Emit the number 7, then emit an error.</caption>\n     * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);\n     * result.subscribe(x => console.log(x), e => console.error(e));\n     *\n     * @example <caption>Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 13</caption>\n     * var interval = Rx.Observable.interval(1000);\n     * var result = interval.mergeMap(x =>\n     *   x === 13 ?\n     *     Rx.Observable.throw('Thirteens are bad') :\n     *     Rx.Observable.of('a', 'b', 'c')\n     * );\n     * result.subscribe(x => console.log(x), e => console.error(e));\n     *\n     * @see {@link create}\n     * @see {@link empty}\n     * @see {@link never}\n     * @see {@link of}\n     *\n     * @param {any} error The particular Error to pass to the error notification.\n     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n     * the emission of the error notification.\n     * @return {Observable} An error Observable: emits only the error notification\n     * using the given error argument.\n     * @static true\n     * @name throw\n     * @owner Observable\n     */\n    ErrorObservable.create = function (error, scheduler) {\n        return new ErrorObservable(error, scheduler);\n    };\n    ErrorObservable.dispatch = function (arg) {\n        var error = arg.error, subscriber = arg.subscriber;\n        subscriber.error(error);\n    };\n    ErrorObservable.prototype._subscribe = function (subscriber) {\n        var error = this.error;\n        var scheduler = this.scheduler;\n        subscriber.syncErrorThrowable = true;\n        if (scheduler) {\n            return scheduler.schedule(ErrorObservable.dispatch, 0, {\n                error: error, subscriber: subscriber\n            });\n        }\n        else {\n            subscriber.error(error);\n        }\n    };\n    return ErrorObservable;\n}(Observable_1.Observable));\nexports.ErrorObservable = ErrorObservable;\n//# sourceMappingURL=ErrorObservable.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar tryCatch_1 = require('../util/tryCatch');\nvar isFunction_1 = require('../util/isFunction');\nvar errorObject_1 = require('../util/errorObject');\nvar Subscription_1 = require('../Subscription');\nvar toString = Object.prototype.toString;\nfunction isNodeStyleEventEmitter(sourceObj) {\n    return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\nfunction isJQueryStyleEventEmitter(sourceObj) {\n    return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\nfunction isNodeList(sourceObj) {\n    return !!sourceObj && toString.call(sourceObj) === '[object NodeList]';\n}\nfunction isHTMLCollection(sourceObj) {\n    return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]';\n}\nfunction isEventTarget(sourceObj) {\n    return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromEventObservable = (function (_super) {\n    __extends(FromEventObservable, _super);\n    function FromEventObservable(sourceObj, eventName, selector, options) {\n        _super.call(this);\n        this.sourceObj = sourceObj;\n        this.eventName = eventName;\n        this.selector = selector;\n        this.options = options;\n    }\n    /* tslint:enable:max-line-length */\n    /**\n     * Creates an Observable that emits events of a specific type coming from the\n     * given event target.\n     *\n     * <span class=\"informal\">Creates an Observable from DOM events, or Node\n     * EventEmitter events or others.</span>\n     *\n     * <img src=\"./img/fromEvent.png\" width=\"100%\">\n     *\n     * Creates an Observable by attaching an event listener to an \"event target\",\n     * which may be an object with `addEventListener` and `removeEventListener`,\n     * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the\n     * DOM, or an HTMLCollection from the DOM. The event handler is attached when\n     * the output Observable is subscribed, and removed when the Subscription is\n     * unsubscribed.\n     *\n     * @example <caption>Emits clicks happening on the DOM document</caption>\n     * var clicks = Rx.Observable.fromEvent(document, 'click');\n     * clicks.subscribe(x => console.log(x));\n     *\n     * // Results in:\n     * // MouseEvent object logged to console everytime a click\n     * // occurs on the document.\n     *\n     * @see {@link from}\n     * @see {@link fromEventPattern}\n     *\n     * @param {EventTargetLike} target The DOMElement, event target, Node.js\n     * EventEmitter, NodeList or HTMLCollection to attach the event handler to.\n     * @param {string} eventName The event name of interest, being emitted by the\n     * `target`.\n     * @param {EventListenerOptions} [options] Options to pass through to addEventListener\n     * @param {SelectorMethodSignature<T>} [selector] An optional function to\n     * post-process results. It takes the arguments from the event handler and\n     * should return a single value.\n     * @return {Observable<T>}\n     * @static true\n     * @name fromEvent\n     * @owner Observable\n     */\n    FromEventObservable.create = function (target, eventName, options, selector) {\n        if (isFunction_1.isFunction(options)) {\n            selector = options;\n            options = undefined;\n        }\n        return new FromEventObservable(target, eventName, selector, options);\n    };\n    FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {\n        var unsubscribe;\n        if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {\n            for (var i = 0, len = sourceObj.length; i < len; i++) {\n                FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n            }\n        }\n        else if (isEventTarget(sourceObj)) {\n            var source_1 = sourceObj;\n            sourceObj.addEventListener(eventName, handler, options);\n            unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };\n        }\n        else if (isJQueryStyleEventEmitter(sourceObj)) {\n            var source_2 = sourceObj;\n            sourceObj.on(eventName, handler);\n            unsubscribe = function () { return source_2.off(eventName, handler); };\n        }\n        else if (isNodeStyleEventEmitter(sourceObj)) {\n            var source_3 = sourceObj;\n            sourceObj.addListener(eventName, handler);\n            unsubscribe = function () { return source_3.removeListener(eventName, handler); };\n        }\n        else {\n            throw new TypeError('Invalid event target');\n        }\n        subscriber.add(new Subscription_1.Subscription(unsubscribe));\n    };\n    FromEventObservable.prototype._subscribe = function (subscriber) {\n        var sourceObj = this.sourceObj;\n        var eventName = this.eventName;\n        var options = this.options;\n        var selector = this.selector;\n        var handler = selector ? function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            var result = tryCatch_1.tryCatch(selector).apply(void 0, args);\n            if (result === errorObject_1.errorObject) {\n                subscriber.error(errorObject_1.errorObject.e);\n            }\n            else {\n                subscriber.next(result);\n            }\n        } : function (e) { return subscriber.next(e); };\n        FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);\n    };\n    return FromEventObservable;\n}(Observable_1.Observable));\nexports.FromEventObservable = FromEventObservable;\n//# sourceMappingURL=FromEventObservable.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isArray_1 = require('../util/isArray');\nvar isArrayLike_1 = require('../util/isArrayLike');\nvar isPromise_1 = require('../util/isPromise');\nvar PromiseObservable_1 = require('./PromiseObservable');\nvar IteratorObservable_1 = require('./IteratorObservable');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar ArrayLikeObservable_1 = require('./ArrayLikeObservable');\nvar iterator_1 = require('../symbol/iterator');\nvar Observable_1 = require('../Observable');\nvar observeOn_1 = require('../operator/observeOn');\nvar observable_1 = require('../symbol/observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromObservable = (function (_super) {\n    __extends(FromObservable, _super);\n    function FromObservable(ish, scheduler) {\n        _super.call(this, null);\n        this.ish = ish;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable from an Array, an array-like object, a Promise, an\n     * iterable object, or an Observable-like object.\n     *\n     * <span class=\"informal\">Converts almost anything to an Observable.</span>\n     *\n     * <img src=\"./img/from.png\" width=\"100%\">\n     *\n     * Convert various other objects and data types into Observables. `from`\n     * converts a Promise or an array-like or an\n     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)\n     * object into an Observable that emits the items in that promise or array or\n     * iterable. A String, in this context, is treated as an array of characters.\n     * Observable-like objects (contains a function named with the ES2015 Symbol\n     * for Observable) can also be converted through this operator.\n     *\n     * @example <caption>Converts an array to an Observable</caption>\n     * var array = [10, 20, 30];\n     * var result = Rx.Observable.from(array);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 10 20 30\n     *\n     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>\n     * function* generateDoubles(seed) {\n     *   var i = seed;\n     *   while (true) {\n     *     yield i;\n     *     i = 2 * i; // double it\n     *   }\n     * }\n     *\n     * var iterator = generateDoubles(3);\n     * var result = Rx.Observable.from(iterator).take(10);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 3 6 12 24 48 96 192 384 768 1536\n     *\n     * @see {@link create}\n     * @see {@link fromEvent}\n     * @see {@link fromEventPattern}\n     * @see {@link fromPromise}\n     *\n     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an\n     * Observable-like, an Array, an iterable or an array-like object to be\n     * converted.\n     * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n     * emissions of values.\n     * @return {Observable<T>} The Observable whose values are originally from the\n     * input object that was converted.\n     * @static true\n     * @name from\n     * @owner Observable\n     */\n    FromObservable.create = function (ish, scheduler) {\n        if (ish != null) {\n            if (typeof ish[observable_1.observable] === 'function') {\n                if (ish instanceof Observable_1.Observable && !scheduler) {\n                    return ish;\n                }\n                return new FromObservable(ish, scheduler);\n            }\n            else if (isArray_1.isArray(ish)) {\n                return new ArrayObservable_1.ArrayObservable(ish, scheduler);\n            }\n            else if (isPromise_1.isPromise(ish)) {\n                return new PromiseObservable_1.PromiseObservable(ish, scheduler);\n            }\n            else if (typeof ish[iterator_1.iterator] === 'function' || typeof ish === 'string') {\n                return new IteratorObservable_1.IteratorObservable(ish, scheduler);\n            }\n            else if (isArrayLike_1.isArrayLike(ish)) {\n                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);\n            }\n        }\n        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');\n    };\n    FromObservable.prototype._subscribe = function (subscriber) {\n        var ish = this.ish;\n        var scheduler = this.scheduler;\n        if (scheduler == null) {\n            return ish[observable_1.observable]().subscribe(subscriber);\n        }\n        else {\n            return ish[observable_1.observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));\n        }\n    };\n    return FromObservable;\n}(Observable_1.Observable));\nexports.FromObservable = FromObservable;\n//# sourceMappingURL=FromObservable.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\nvar tryCatch_1 = require('../util/tryCatch');\nvar isFunction_1 = require('../util/isFunction');\nvar errorObject_1 = require('../util/errorObject');\nvar Subscription_1 = require('../Subscription');\nvar toString = Object.prototype.toString;\nfunction isNodeStyleEventEmitter(sourceObj) {\n    return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\nfunction isJQueryStyleEventEmitter(sourceObj) {\n    return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\nfunction isNodeList(sourceObj) {\n    return !!sourceObj && toString.call(sourceObj) === '[object NodeList]';\n}\nfunction isHTMLCollection(sourceObj) {\n    return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]';\n}\nfunction isEventTarget(sourceObj) {\n    return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromEventObservable = (function (_super) {\n    __extends(FromEventObservable, _super);\n    function FromEventObservable(sourceObj, eventName, selector, options) {\n        _super.call(this);\n        this.sourceObj = sourceObj;\n        this.eventName = eventName;\n        this.selector = selector;\n        this.options = options;\n    }\n    /* tslint:enable:max-line-length */\n    /**\n     * Creates an Observable that emits events of a specific type coming from the\n     * given event target.\n     *\n     * <span class=\"informal\">Creates an Observable from DOM events, or Node.js\n     * EventEmitter events or others.</span>\n     *\n     * <img src=\"./img/fromEvent.png\" width=\"100%\">\n     *\n     * `fromEvent` accepts as a first argument event target, which is an object with methods\n     * for registering event handler functions. As a second argument it takes string that indicates\n     * type of event we want to listen for. `fromEvent` supports selected types of event targets,\n     * which are described in detail below. If your event target does not match any of the ones listed,\n     * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.\n     * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event\n     * handler functions have different names, but they all accept a string describing event type\n     * and function itself, which will be called whenever said event happens.\n     *\n     * Every time resulting Observable is subscribed, event handler function will be registered\n     * to event target on given event type. When that event fires, value\n     * passed as a first argument to registered function will be emitted by output Observable.\n     * When Observable is unsubscribed, function will be unregistered from event target.\n     *\n     * Note that if event target calls registered function with more than one argument, second\n     * and following arguments will not appear in resulting stream. In order to get access to them,\n     * you can pass to `fromEvent` optional project function, which will be called with all arguments\n     * passed to event handler. Output Observable will then emit value returned by project function,\n     * instead of the usual value.\n     *\n     * Remember that event targets listed below are checked via duck typing. It means that\n     * no matter what kind of object you have and no matter what environment you work in,\n     * you can safely use `fromEvent` on that object if it exposes described methods (provided\n     * of course they behave as was described above). So for example if Node.js library exposes\n     * event target which has the same method names as DOM EventTarget, `fromEvent` is still\n     * a good choice.\n     *\n     * If the API you use is more callback then event handler oriented (subscribed\n     * callback function fires only once and thus there is no need to manually\n     * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}\n     * instead.\n     *\n     * `fromEvent` supports following types of event targets:\n     *\n     * **DOM EventTarget**\n     *\n     * This is an object with `addEventListener` and `removeEventListener` methods.\n     *\n     * In the browser, `addEventListener` accepts - apart from event type string and event\n     * handler function arguments - optional third parameter, which is either an object or boolean,\n     * both used for additional configuration how and when passed function will be called. When\n     * `fromEvent` is used with event target of that type, you can provide this values\n     * as third parameter as well.\n     *\n     * **Node.js EventEmitter**\n     *\n     * An object with `addListener` and `removeListener` methods.\n     *\n     * **JQuery-style event target**\n     *\n     * An object with `on` and `off` methods\n     *\n     * **DOM NodeList**\n     *\n     * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.\n     *\n     * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes\n     * it contains and install event handler function in every of them. When returned Observable\n     * is unsubscribed, function will be removed from all Nodes.\n     *\n     * **DOM HtmlCollection**\n     *\n     * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is\n     * installed and removed in each of elements.\n     *\n     *\n     * @example <caption>Emits clicks happening on the DOM document</caption>\n     * var clicks = Rx.Observable.fromEvent(document, 'click');\n     * clicks.subscribe(x => console.log(x));\n     *\n     * // Results in:\n     * // MouseEvent object logged to console every time a click\n     * // occurs on the document.\n     *\n     *\n     * @example <caption>Use addEventListener with capture option</caption>\n     * var clicksInDocument = Rx.Observable.fromEvent(document, 'click', true); // note optional configuration parameter\n     *                                                                          // which will be passed to addEventListener\n     * var clicksInDiv = Rx.Observable.fromEvent(someDivInDocument, 'click');\n     *\n     * clicksInDocument.subscribe(() => console.log('document'));\n     * clicksInDiv.subscribe(() => console.log('div'));\n     *\n     * // By default events bubble UP in DOM tree, so normally\n     * // when we would click on div in document\n     * // \"div\" would be logged first and then \"document\".\n     * // Since we specified optional `capture` option, document\n     * // will catch event when it goes DOWN DOM tree, so console\n     * // will log \"document\" and then \"div\".\n     *\n     * @see {@link bindCallback}\n     * @see {@link bindNodeCallback}\n     * @see {@link fromEventPattern}\n     *\n     * @param {EventTargetLike} target The DOM EventTarget, Node.js\n     * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.\n     * @param {string} eventName The event name of interest, being emitted by the\n     * `target`.\n     * @param {EventListenerOptions} [options] Options to pass through to addEventListener\n     * @param {SelectorMethodSignature<T>} [selector] An optional function to\n     * post-process results. It takes the arguments from the event handler and\n     * should return a single value.\n     * @return {Observable<T>}\n     * @static true\n     * @name fromEvent\n     * @owner Observable\n     */\n    FromEventObservable.create = function (target, eventName, options, selector) {\n        if (isFunction_1.isFunction(options)) {\n            selector = options;\n            options = undefined;\n        }\n        return new FromEventObservable(target, eventName, selector, options);\n    };\n    FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {\n        var unsubscribe;\n        if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {\n            for (var i = 0, len = sourceObj.length; i < len; i++) {\n                FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n            }\n        }\n        else if (isEventTarget(sourceObj)) {\n            var source_1 = sourceObj;\n            sourceObj.addEventListener(eventName, handler, options);\n            unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };\n        }\n        else if (isJQueryStyleEventEmitter(sourceObj)) {\n            var source_2 = sourceObj;\n            sourceObj.on(eventName, handler);\n            unsubscribe = function () { return source_2.off(eventName, handler); };\n        }\n        else if (isNodeStyleEventEmitter(sourceObj)) {\n            var source_3 = sourceObj;\n            sourceObj.addListener(eventName, handler);\n            unsubscribe = function () { return source_3.removeListener(eventName, handler); };\n        }\n        else {\n            throw new TypeError('Invalid event target');\n        }\n        subscriber.add(new Subscription_1.Subscription(unsubscribe));\n    };\n    FromEventObservable.prototype._subscribe = function (subscriber) {\n        var sourceObj = this.sourceObj;\n        var eventName = this.eventName;\n        var options = this.options;\n        var selector = this.selector;\n        var handler = selector ? function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i - 0] = arguments[_i];\n            }\n            var result = tryCatch_1.tryCatch(selector).apply(void 0, args);\n            if (result === errorObject_1.errorObject) {\n                subscriber.error(errorObject_1.errorObject.e);\n            }\n            else {\n                subscriber.next(result);\n            }\n        } : function (e) { return subscriber.next(e); };\n        FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);\n    };\n    return FromEventObservable;\n}(Observable_1.Observable));\nexports.FromEventObservable = FromEventObservable;\n//# sourceMappingURL=FromEventObservable.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isArray_1 = require('../util/isArray');\nvar isArrayLike_1 = require('../util/isArrayLike');\nvar isPromise_1 = require('../util/isPromise');\nvar PromiseObservable_1 = require('./PromiseObservable');\nvar IteratorObservable_1 = require('./IteratorObservable');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar ArrayLikeObservable_1 = require('./ArrayLikeObservable');\nvar iterator_1 = require('../symbol/iterator');\nvar Observable_1 = require('../Observable');\nvar observeOn_1 = require('../operators/observeOn');\nvar observable_1 = require('../symbol/observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromObservable = (function (_super) {\n    __extends(FromObservable, _super);\n    function FromObservable(ish, scheduler) {\n        _super.call(this, null);\n        this.ish = ish;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Creates an Observable from an Array, an array-like object, a Promise, an\n     * iterable object, or an Observable-like object.\n     *\n     * <span class=\"informal\">Converts almost anything to an Observable.</span>\n     *\n     * <img src=\"./img/from.png\" width=\"100%\">\n     *\n     * Convert various other objects and data types into Observables. `from`\n     * converts a Promise or an array-like or an\n     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)\n     * object into an Observable that emits the items in that promise or array or\n     * iterable. A String, in this context, is treated as an array of characters.\n     * Observable-like objects (contains a function named with the ES2015 Symbol\n     * for Observable) can also be converted through this operator.\n     *\n     * @example <caption>Converts an array to an Observable</caption>\n     * var array = [10, 20, 30];\n     * var result = Rx.Observable.from(array);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 10 20 30\n     *\n     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>\n     * function* generateDoubles(seed) {\n     *   var i = seed;\n     *   while (true) {\n     *     yield i;\n     *     i = 2 * i; // double it\n     *   }\n     * }\n     *\n     * var iterator = generateDoubles(3);\n     * var result = Rx.Observable.from(iterator).take(10);\n     * result.subscribe(x => console.log(x));\n     *\n     * // Results in the following:\n     * // 3 6 12 24 48 96 192 384 768 1536\n     *\n     * @see {@link create}\n     * @see {@link fromEvent}\n     * @see {@link fromEventPattern}\n     * @see {@link fromPromise}\n     *\n     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an\n     * Observable-like, an Array, an iterable or an array-like object to be\n     * converted.\n     * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n     * emissions of values.\n     * @return {Observable<T>} The Observable whose values are originally from the\n     * input object that was converted.\n     * @static true\n     * @name from\n     * @owner Observable\n     */\n    FromObservable.create = function (ish, scheduler) {\n        if (ish != null) {\n            if (typeof ish[observable_1.observable] === 'function') {\n                if (ish instanceof Observable_1.Observable && !scheduler) {\n                    return ish;\n                }\n                return new FromObservable(ish, scheduler);\n            }\n            else if (isArray_1.isArray(ish)) {\n                return new ArrayObservable_1.ArrayObservable(ish, scheduler);\n            }\n            else if (isPromise_1.isPromise(ish)) {\n                return new PromiseObservable_1.PromiseObservable(ish, scheduler);\n            }\n            else if (typeof ish[iterator_1.iterator] === 'function' || typeof ish === 'string') {\n                return new IteratorObservable_1.IteratorObservable(ish, scheduler);\n            }\n            else if (isArrayLike_1.isArrayLike(ish)) {\n                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);\n            }\n        }\n        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');\n    };\n    FromObservable.prototype._subscribe = function (subscriber) {\n        var ish = this.ish;\n        var scheduler = this.scheduler;\n        if (scheduler == null) {\n            return ish[observable_1.observable]().subscribe(subscriber);\n        }\n        else {\n            return ish[observable_1.observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));\n        }\n    };\n    return FromObservable;\n}(Observable_1.Observable));\nexports.FromObservable = FromObservable;\n//# sourceMappingURL=FromObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Observable_1 = require('../Observable');\nvar iterator_1 = require('../symbol/iterator');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar IteratorObservable = (function (_super) {\n    __extends(IteratorObservable, _super);\n    function IteratorObservable(iterator, scheduler) {\n        _super.call(this);\n        this.scheduler = scheduler;\n        if (iterator == null) {\n            throw new Error('iterator cannot be null.');\n        }\n        this.iterator = getIterator(iterator);\n    }\n    IteratorObservable.create = function (iterator, scheduler) {\n        return new IteratorObservable(iterator, scheduler);\n    };\n    IteratorObservable.dispatch = function (state) {\n        var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;\n        if (hasError) {\n            subscriber.error(state.error);\n            return;\n        }\n        var result = iterator.next();\n        if (result.done) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(result.value);\n        state.index = index + 1;\n        if (subscriber.closed) {\n            if (typeof iterator.return === 'function') {\n                iterator.return();\n            }\n            return;\n        }\n        this.schedule(state);\n    };\n    IteratorObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(IteratorObservable.dispatch, 0, {\n                index: index, iterator: iterator, subscriber: subscriber\n            });\n        }\n        else {\n            do {\n                var result = iterator.next();\n                if (result.done) {\n                    subscriber.complete();\n                    break;\n                }\n                else {\n                    subscriber.next(result.value);\n                }\n                if (subscriber.closed) {\n                    if (typeof iterator.return === 'function') {\n                        iterator.return();\n                    }\n                    break;\n                }\n            } while (true);\n        }\n    };\n    return IteratorObservable;\n}(Observable_1.Observable));\nexports.IteratorObservable = IteratorObservable;\nvar StringIterator = (function () {\n    function StringIterator(str, idx, len) {\n        if (idx === void 0) { idx = 0; }\n        if (len === void 0) { len = str.length; }\n        this.str = str;\n        this.idx = idx;\n        this.len = len;\n    }\n    StringIterator.prototype[iterator_1.iterator] = function () { return (this); };\n    StringIterator.prototype.next = function () {\n        return this.idx < this.len ? {\n            done: false,\n            value: this.str.charAt(this.idx++)\n        } : {\n            done: true,\n            value: undefined\n        };\n    };\n    return StringIterator;\n}());\nvar ArrayIterator = (function () {\n    function ArrayIterator(arr, idx, len) {\n        if (idx === void 0) { idx = 0; }\n        if (len === void 0) { len = toLength(arr); }\n        this.arr = arr;\n        this.idx = idx;\n        this.len = len;\n    }\n    ArrayIterator.prototype[iterator_1.iterator] = function () { return this; };\n    ArrayIterator.prototype.next = function () {\n        return this.idx < this.len ? {\n            done: false,\n            value: this.arr[this.idx++]\n        } : {\n            done: true,\n            value: undefined\n        };\n    };\n    return ArrayIterator;\n}());\nfunction getIterator(obj) {\n    var i = obj[iterator_1.iterator];\n    if (!i && typeof obj === 'string') {\n        return new StringIterator(obj);\n    }\n    if (!i && obj.length !== undefined) {\n        return new ArrayIterator(obj);\n    }\n    if (!i) {\n        throw new TypeError('object is not iterable');\n    }\n    return obj[iterator_1.iterator]();\n}\nvar maxSafeInteger = Math.pow(2, 53) - 1;\nfunction toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) {\n        return 0;\n    }\n    if (len === 0 || !numberIsFinite(len)) {\n        return len;\n    }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) {\n        return 0;\n    }\n    if (len > maxSafeInteger) {\n        return maxSafeInteger;\n    }\n    return len;\n}\nfunction numberIsFinite(value) {\n    return typeof value === 'number' && root_1.root.isFinite(value);\n}\nfunction sign(value) {\n    var valueAsNumber = +value;\n    if (valueAsNumber === 0) {\n        return valueAsNumber;\n    }\n    if (isNaN(valueAsNumber)) {\n        return valueAsNumber;\n    }\n    return valueAsNumber < 0 ? -1 : 1;\n}\n//# sourceMappingURL=IteratorObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar PromiseObservable = (function (_super) {\n    __extends(PromiseObservable, _super);\n    function PromiseObservable(promise, scheduler) {\n        _super.call(this);\n        this.promise = promise;\n        this.scheduler = scheduler;\n    }\n    /**\n     * Converts a Promise to an Observable.\n     *\n     * <span class=\"informal\">Returns an Observable that just emits the Promise's\n     * resolved value, then completes.</span>\n     *\n     * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an\n     * Observable. If the Promise resolves with a value, the output Observable\n     * emits that resolved value as a `next`, and then completes. If the Promise\n     * is rejected, then the output Observable emits the corresponding Error.\n     *\n     * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>\n     * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));\n     * result.subscribe(x => console.log(x), e => console.error(e));\n     *\n     * @see {@link bindCallback}\n     * @see {@link from}\n     *\n     * @param {PromiseLike<T>} promise The promise to be converted.\n     * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling\n     * the delivery of the resolved value (or the rejection).\n     * @return {Observable<T>} An Observable which wraps the Promise.\n     * @static true\n     * @name fromPromise\n     * @owner Observable\n     */\n    PromiseObservable.create = function (promise, scheduler) {\n        return new PromiseObservable(promise, scheduler);\n    };\n    PromiseObservable.prototype._subscribe = function (subscriber) {\n        var _this = this;\n        var promise = this.promise;\n        var scheduler = this.scheduler;\n        if (scheduler == null) {\n            if (this._isScalar) {\n                if (!subscriber.closed) {\n                    subscriber.next(this.value);\n                    subscriber.complete();\n                }\n            }\n            else {\n                promise.then(function (value) {\n                    _this.value = value;\n                    _this._isScalar = true;\n                    if (!subscriber.closed) {\n                        subscriber.next(value);\n                        subscriber.complete();\n                    }\n                }, function (err) {\n                    if (!subscriber.closed) {\n                        subscriber.error(err);\n                    }\n                })\n                    .then(null, function (err) {\n                    // escape the promise trap, throw unhandled errors\n                    root_1.root.setTimeout(function () { throw err; });\n                });\n            }\n        }\n        else {\n            if (this._isScalar) {\n                if (!subscriber.closed) {\n                    return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });\n                }\n            }\n            else {\n                promise.then(function (value) {\n                    _this.value = value;\n                    _this._isScalar = true;\n                    if (!subscriber.closed) {\n                        subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));\n                    }\n                }, function (err) {\n                    if (!subscriber.closed) {\n                        subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));\n                    }\n                })\n                    .then(null, function (err) {\n                    // escape the promise trap, throw unhandled errors\n                    root_1.root.setTimeout(function () { throw err; });\n                });\n            }\n        }\n    };\n    return PromiseObservable;\n}(Observable_1.Observable));\nexports.PromiseObservable = PromiseObservable;\nfunction dispatchNext(arg) {\n    var value = arg.value, subscriber = arg.subscriber;\n    if (!subscriber.closed) {\n        subscriber.next(value);\n        subscriber.complete();\n    }\n}\nfunction dispatchError(arg) {\n    var err = arg.err, subscriber = arg.subscriber;\n    if (!subscriber.closed) {\n        subscriber.error(err);\n    }\n}\n//# sourceMappingURL=PromiseObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = require('../Observable');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ScalarObservable = (function (_super) {\n    __extends(ScalarObservable, _super);\n    function ScalarObservable(value, scheduler) {\n        _super.call(this);\n        this.value = value;\n        this.scheduler = scheduler;\n        this._isScalar = true;\n        if (scheduler) {\n            this._isScalar = false;\n        }\n    }\n    ScalarObservable.create = function (value, scheduler) {\n        return new ScalarObservable(value, scheduler);\n    };\n    ScalarObservable.dispatch = function (state) {\n        var done = state.done, value = state.value, subscriber = state.subscriber;\n        if (done) {\n            subscriber.complete();\n            return;\n        }\n        subscriber.next(value);\n        if (subscriber.closed) {\n            return;\n        }\n        state.done = true;\n        this.schedule(state);\n    };\n    ScalarObservable.prototype._subscribe = function (subscriber) {\n        var value = this.value;\n        var scheduler = this.scheduler;\n        if (scheduler) {\n            return scheduler.schedule(ScalarObservable.dispatch, 0, {\n                done: false, value: value, subscriber: subscriber\n            });\n        }\n        else {\n            subscriber.next(value);\n            if (!subscriber.closed) {\n                subscriber.complete();\n            }\n        }\n    };\n    return ScalarObservable;\n}(Observable_1.Observable));\nexports.ScalarObservable = ScalarObservable;\n//# sourceMappingURL=ScalarObservable.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isNumeric_1 = require('../util/isNumeric');\nvar Observable_1 = require('../Observable');\nvar async_1 = require('../scheduler/async');\nvar isScheduler_1 = require('../util/isScheduler');\nvar isDate_1 = require('../util/isDate');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar TimerObservable = (function (_super) {\n    __extends(TimerObservable, _super);\n    function TimerObservable(dueTime, period, scheduler) {\n        if (dueTime === void 0) { dueTime = 0; }\n        _super.call(this);\n        this.period = -1;\n        this.dueTime = 0;\n        if (isNumeric_1.isNumeric(period)) {\n            this.period = Number(period) < 1 && 1 || Number(period);\n        }\n        else if (isScheduler_1.isScheduler(period)) {\n            scheduler = period;\n        }\n        if (!isScheduler_1.isScheduler(scheduler)) {\n            scheduler = async_1.async;\n        }\n        this.scheduler = scheduler;\n        this.dueTime = isDate_1.isDate(dueTime) ?\n            (+dueTime - this.scheduler.now()) :\n            dueTime;\n    }\n    /**\n     * Creates an Observable that starts emitting after an `initialDelay` and\n     * emits ever increasing numbers after each `period` of time thereafter.\n     *\n     * <span class=\"informal\">Its like {@link interval}, but you can specify when\n     * should the emissions start.</span>\n     *\n     * <img src=\"./img/timer.png\" width=\"100%\">\n     *\n     * `timer` returns an Observable that emits an infinite sequence of ascending\n     * integers, with a constant interval of time, `period` of your choosing\n     * between those emissions. The first emission happens after the specified\n     * `initialDelay`. The initial delay may be a {@link Date}. By default, this\n     * operator uses the `async` IScheduler to provide a notion of time, but you\n     * may pass any IScheduler to it. If `period` is not specified, the output\n     * Observable emits only one value, `0`. Otherwise, it emits an infinite\n     * sequence.\n     *\n     * @example <caption>Emits ascending numbers, one every second (1000ms), starting after 3 seconds</caption>\n     * var numbers = Rx.Observable.timer(3000, 1000);\n     * numbers.subscribe(x => console.log(x));\n     *\n     * @example <caption>Emits one number after five seconds</caption>\n     * var numbers = Rx.Observable.timer(5000);\n     * numbers.subscribe(x => console.log(x));\n     *\n     * @see {@link interval}\n     * @see {@link delay}\n     *\n     * @param {number|Date} initialDelay The initial delay time to wait before\n     * emitting the first value of `0`.\n     * @param {number} [period] The period of time between emissions of the\n     * subsequent numbers.\n     * @param {Scheduler} [scheduler=async] The IScheduler to use for scheduling\n     * the emission of values, and providing a notion of \"time\".\n     * @return {Observable} An Observable that emits a `0` after the\n     * `initialDelay` and ever increasing numbers after each `period` of time\n     * thereafter.\n     * @static true\n     * @name timer\n     * @owner Observable\n     */\n    TimerObservable.create = function (initialDelay, period, scheduler) {\n        if (initialDelay === void 0) { initialDelay = 0; }\n        return new TimerObservable(initialDelay, period, scheduler);\n    };\n    TimerObservable.dispatch = function (state) {\n        var index = state.index, period = state.period, subscriber = state.subscriber;\n        var action = this;\n        subscriber.next(index);\n        if (subscriber.closed) {\n            return;\n        }\n        else if (period === -1) {\n            return subscriber.complete();\n        }\n        state.index = index + 1;\n        action.schedule(state, period);\n    };\n    TimerObservable.prototype._subscribe = function (subscriber) {\n        var index = 0;\n        var _a = this, period = _a.period, dueTime = _a.dueTime, scheduler = _a.scheduler;\n        return scheduler.schedule(TimerObservable.dispatch, dueTime, {\n            index: index, period: period, subscriber: subscriber\n        });\n    };\n    return TimerObservable;\n}(Observable_1.Observable));\nexports.TimerObservable = TimerObservable;\n//# sourceMappingURL=TimerObservable.js.map",
-    "\"use strict\";\nvar isScheduler_1 = require('../util/isScheduler');\nvar isArray_1 = require('../util/isArray');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar combineLatest_1 = require('../operator/combineLatest');\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from all the Observables passed as\n * arguments. This is done by subscribing to each Observable in order and,\n * whenever any Observable emits, collecting an array of the most recent\n * values from each Observable. So if you pass `n` Observables to operator,\n * returned Observable will always emit an array of `n` values, in order\n * corresponding to order of passed Observables (value from the first Observable\n * on the first place and so on).\n *\n * Static version of `combineLatest` accepts either an array of Observables\n * or each Observable can be put directly as an argument. Note that array of\n * Observables is good choice, if you don't know beforehand how many Observables\n * you will combine. Passing empty array will result in Observable that\n * completes immediately.\n *\n * To ensure output array has always the same length, `combineLatest` will\n * actually wait for all input Observables to emit at least once,\n * before it starts emitting results. This means if some Observable emits\n * values before other Observables started emitting, all that values but last\n * will be lost. On the other hand, is some Observable does not emit value but\n * completes, resulting Observable will complete at the same moment without\n * emitting anything, since it will be now impossible to include value from\n * completed Observable in resulting array. Also, if some input Observable does\n * not emit any value and never completes, `combineLatest` will also never emit\n * and never complete, since, again, it will wait for all streams to emit some\n * value.\n *\n * If at least one Observable was passed to `combineLatest` and all passed Observables\n * emitted something, resulting Observable will complete when all combined\n * streams complete. So even if some Observable completes, result of\n * `combineLatest` will still emit values when other Observables do. In case\n * of completed Observable, its value from now on will always be the last\n * emitted value. On the other hand, if any Observable errors, `combineLatest`\n * will error immediately as well, and all other Observables will be unsubscribed.\n *\n * `combineLatest` accepts as optional parameter `project` function, which takes\n * as arguments all values that would normally be emitted by resulting Observable.\n * `project` can return any kind of value, which will be then emitted by Observable\n * instead of default array. Note that `project` does not take as argument that array\n * of values, but values themselves. That means default `project` can be imagined\n * as function that takes all its arguments and puts them into an array.\n *\n *\n * @example <caption>Combine two timer Observables</caption>\n * const firstTimer = Rx.Observable.timer(0, 1000); // emit 0, 1, 2... after every second, starting from now\n * const secondTimer = Rx.Observable.timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now\n * const combinedTimers = Rx.Observable.combineLatest(firstTimer, secondTimer);\n * combinedTimers.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0] after 0.5s\n * // [1, 0] after 1s\n * // [1, 1] after 1.5s\n * // [2, 1] after 2s\n *\n *\n * @example <caption>Combine an array of Observables</caption>\n * const observables = [1, 5, 10].map(\n *   n => Rx.Observable.of(n).delay(n * 1000).startWith(0) // emit 0 and then emit n after n seconds\n * );\n * const combined = Rx.Observable.combineLatest(observables);\n * combined.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0, 0] immediately\n * // [1, 0, 0] after 1s\n * // [1, 5, 0] after 5s\n * // [1, 5, 10] after 10s\n *\n *\n * @example <caption>Use project function to dynamically calculate the Body-Mass Index</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} observable1 An input Observable to combine with other Observables.\n * @param {ObservableInput} observable2 An input Observable to combine with other Observables.\n * More than one input Observables may be given as arguments\n * or an array of Observables may be given as the first argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to\n * each input Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @static true\n * @name combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    var scheduler = null;\n    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {\n        scheduler = observables.pop();\n    }\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\n//# sourceMappingURL=combineLatest.js.map",
+    "\"use strict\";\nvar isScheduler_1 = require('../util/isScheduler');\nvar isArray_1 = require('../util/isArray');\nvar ArrayObservable_1 = require('./ArrayObservable');\nvar combineLatest_1 = require('../operators/combineLatest');\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from all the Observables passed as\n * arguments. This is done by subscribing to each Observable in order and,\n * whenever any Observable emits, collecting an array of the most recent\n * values from each Observable. So if you pass `n` Observables to operator,\n * returned Observable will always emit an array of `n` values, in order\n * corresponding to order of passed Observables (value from the first Observable\n * on the first place and so on).\n *\n * Static version of `combineLatest` accepts either an array of Observables\n * or each Observable can be put directly as an argument. Note that array of\n * Observables is good choice, if you don't know beforehand how many Observables\n * you will combine. Passing empty array will result in Observable that\n * completes immediately.\n *\n * To ensure output array has always the same length, `combineLatest` will\n * actually wait for all input Observables to emit at least once,\n * before it starts emitting results. This means if some Observable emits\n * values before other Observables started emitting, all that values but last\n * will be lost. On the other hand, is some Observable does not emit value but\n * completes, resulting Observable will complete at the same moment without\n * emitting anything, since it will be now impossible to include value from\n * completed Observable in resulting array. Also, if some input Observable does\n * not emit any value and never completes, `combineLatest` will also never emit\n * and never complete, since, again, it will wait for all streams to emit some\n * value.\n *\n * If at least one Observable was passed to `combineLatest` and all passed Observables\n * emitted something, resulting Observable will complete when all combined\n * streams complete. So even if some Observable completes, result of\n * `combineLatest` will still emit values when other Observables do. In case\n * of completed Observable, its value from now on will always be the last\n * emitted value. On the other hand, if any Observable errors, `combineLatest`\n * will error immediately as well, and all other Observables will be unsubscribed.\n *\n * `combineLatest` accepts as optional parameter `project` function, which takes\n * as arguments all values that would normally be emitted by resulting Observable.\n * `project` can return any kind of value, which will be then emitted by Observable\n * instead of default array. Note that `project` does not take as argument that array\n * of values, but values themselves. That means default `project` can be imagined\n * as function that takes all its arguments and puts them into an array.\n *\n *\n * @example <caption>Combine two timer Observables</caption>\n * const firstTimer = Rx.Observable.timer(0, 1000); // emit 0, 1, 2... after every second, starting from now\n * const secondTimer = Rx.Observable.timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now\n * const combinedTimers = Rx.Observable.combineLatest(firstTimer, secondTimer);\n * combinedTimers.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0] after 0.5s\n * // [1, 0] after 1s\n * // [1, 1] after 1.5s\n * // [2, 1] after 2s\n *\n *\n * @example <caption>Combine an array of Observables</caption>\n * const observables = [1, 5, 10].map(\n *   n => Rx.Observable.of(n).delay(n * 1000).startWith(0) // emit 0 and then emit n after n seconds\n * );\n * const combined = Rx.Observable.combineLatest(observables);\n * combined.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0, 0] immediately\n * // [1, 0, 0] after 1s\n * // [1, 5, 0] after 5s\n * // [1, 5, 10] after 10s\n *\n *\n * @example <caption>Use project function to dynamically calculate the Body-Mass Index</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} observable1 An input Observable to combine with other Observables.\n * @param {ObservableInput} observable2 An input Observable to combine with other Observables.\n * More than one input Observables may be given as arguments\n * or an array of Observables may be given as the first argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to\n * each input Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @static true\n * @name combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    var scheduler = null;\n    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {\n        scheduler = observables.pop();\n    }\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\n//# sourceMappingURL=combineLatest.js.map",
+    "\"use strict\";\nvar isScheduler_1 = require('../util/isScheduler');\nvar of_1 = require('./of');\nvar from_1 = require('./from');\nvar concatAll_1 = require('../operators/concatAll');\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from given\n * Observable and then moves on to the next.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * `concat` joins multiple Observables together, by subscribing to them one at a time and\n * merging their results into the output Observable. You can pass either an array of\n * Observables, or put them directly as arguments. Passing an empty array will result\n * in Observable that completes immediately.\n *\n * `concat` will subscribe to first input Observable and emit all its values, without\n * changing or affecting them in any way. When that Observable completes, it will\n * subscribe to then next Observable passed and, again, emit its values. This will be\n * repeated, until the operator runs out of Observables. When last input Observable completes,\n * `concat` will complete as well. At any given moment only one Observable passed to operator\n * emits values. If you would like to emit values from passed Observables concurrently, check out\n * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,\n * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.\n *\n * Note that if some input Observable never completes, `concat` will also never complete\n * and Observables following the one that did not complete will never be subscribed. On the other\n * hand, if some Observable simply completes immediately after it is subscribed, it will be\n * invisible for `concat`, which will just move on to the next Observable.\n *\n * If any Observable in chain errors, instead of passing control to the next Observable,\n * `concat` will error immediately as well. Observables that would be subscribed after\n * the one that emitted error, never will.\n *\n * If you pass to `concat` the same Observable many times, its stream of values\n * will be \"replayed\" on every subscription, which means you can repeat given Observable\n * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,\n * you can always use {@link repeat}.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = Rx.Observable.concat(timer, sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n *\n * @example <caption>Concatenate an array of 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n *\n * @example <caption>Concatenate the same Observable to repeat it</caption>\n * const timer = Rx.Observable.interval(1000).take(2);\n *\n * Rx.Observable.concat(timer, timer) // concating the same Observable!\n * .subscribe(\n *   value => console.log(value),\n *   err => {},\n *   () => console.log('...and it is done!')\n * );\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 0 after 3s\n * // 1 after 4s\n * // \"...and it is done!\" also after 4s\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} input1 An input Observable to concatenate with others.\n * @param {ObservableInput} input2 An input Observable to concatenate with others.\n * More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @static true\n * @name concat\n * @owner Observable\n */\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) {\n        return from_1.from(observables[0]);\n    }\n    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));\n}\nexports.concat = concat;\n//# sourceMappingURL=concat.js.map",
     "\"use strict\";\nvar DeferObservable_1 = require('./DeferObservable');\nexports.defer = DeferObservable_1.DeferObservable.create;\n//# sourceMappingURL=defer.js.map",
     "\"use strict\";\nvar EmptyObservable_1 = require('./EmptyObservable');\nexports.empty = EmptyObservable_1.EmptyObservable.create;\n//# sourceMappingURL=empty.js.map",
     "\"use strict\";\nvar FromObservable_1 = require('./FromObservable');\nexports.from = FromObservable_1.FromObservable.create;\n//# sourceMappingURL=from.js.map",
     "\"use strict\";\nvar ArrayObservable_1 = require('./ArrayObservable');\nexports.of = ArrayObservable_1.ArrayObservable.of;\n//# sourceMappingURL=of.js.map",
     "\"use strict\";\nvar ErrorObservable_1 = require('./ErrorObservable');\nexports._throw = ErrorObservable_1.ErrorObservable.create;\n//# sourceMappingURL=throw.js.map",
     "\"use strict\";\nvar TimerObservable_1 = require('./TimerObservable');\nexports.timer = TimerObservable_1.TimerObservable.create;\n//# sourceMappingURL=timer.js.map",
-    "\"use strict\";\nvar zip_1 = require('../operator/zip');\nexports.zip = zip_1.zipStatic;\n//# sourceMappingURL=zip.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Buffers the source Observable values until `closingNotifier` emits.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when another Observable emits.</span>\n *\n * <img src=\"./img/buffer.png\" width=\"100%\">\n *\n * Buffers the incoming Observable values until the given `closingNotifier`\n * Observable emits a value, at which point it emits the buffer on the output\n * Observable and starts a new buffer internally, awaiting the next time\n * `closingNotifier` emits.\n *\n * @example <caption>On every click, emit array of most recent interval events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var interval = Rx.Observable.interval(1000);\n * var buffered = interval.buffer(clicks);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link window}\n *\n * @param {Observable<any>} closingNotifier An Observable that signals the\n * buffer to be emitted on the output Observable.\n * @return {Observable<T[]>} An Observable of buffers, which are arrays of\n * values.\n * @method buffer\n * @owner Observable\n */\nfunction buffer(closingNotifier) {\n    return this.lift(new BufferOperator(closingNotifier));\n}\nexports.buffer = buffer;\nvar BufferOperator = (function () {\n    function BufferOperator(closingNotifier) {\n        this.closingNotifier = closingNotifier;\n    }\n    BufferOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));\n    };\n    return BufferOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferSubscriber = (function (_super) {\n    __extends(BufferSubscriber, _super);\n    function BufferSubscriber(destination, closingNotifier) {\n        _super.call(this, destination);\n        this.buffer = [];\n        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n    }\n    BufferSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var buffer = this.buffer;\n        this.buffer = [];\n        this.destination.next(buffer);\n    };\n    return BufferSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=buffer.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.</span>\n *\n * <img src=\"./img/bufferCount.png\" width=\"100%\">\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * @example <caption>Emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2);\n * buffered.subscribe(x => console.log(x));\n *\n * @example <caption>On every click, emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2, 1);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param {number} bufferSize The maximum size of the buffer emitted.\n * @param {number} [startBufferEvery] Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return {Observable<T[]>} An Observable of arrays of buffered values.\n * @method bufferCount\n * @owner Observable\n */\nfunction bufferCount(bufferSize, startBufferEvery) {\n    if (startBufferEvery === void 0) { startBufferEvery = null; }\n    return this.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n}\nexports.bufferCount = bufferCount;\nvar BufferCountOperator = (function () {\n    function BufferCountOperator(bufferSize, startBufferEvery) {\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        if (!startBufferEvery || bufferSize === startBufferEvery) {\n            this.subscriberClass = BufferCountSubscriber;\n        }\n        else {\n            this.subscriberClass = BufferSkipCountSubscriber;\n        }\n    }\n    BufferCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));\n    };\n    return BufferCountOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferCountSubscriber = (function (_super) {\n    __extends(BufferCountSubscriber, _super);\n    function BufferCountSubscriber(destination, bufferSize) {\n        _super.call(this, destination);\n        this.bufferSize = bufferSize;\n        this.buffer = [];\n    }\n    BufferCountSubscriber.prototype._next = function (value) {\n        var buffer = this.buffer;\n        buffer.push(value);\n        if (buffer.length == this.bufferSize) {\n            this.destination.next(buffer);\n            this.buffer = [];\n        }\n    };\n    BufferCountSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer.length > 0) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferCountSubscriber;\n}(Subscriber_1.Subscriber));\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferSkipCountSubscriber = (function (_super) {\n    __extends(BufferSkipCountSubscriber, _super);\n    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {\n        _super.call(this, destination);\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        this.buffers = [];\n        this.count = 0;\n    }\n    BufferSkipCountSubscriber.prototype._next = function (value) {\n        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;\n        this.count++;\n        if (count % startBufferEvery === 0) {\n            buffers.push([]);\n        }\n        for (var i = buffers.length; i--;) {\n            var buffer = buffers[i];\n            buffer.push(value);\n            if (buffer.length === bufferSize) {\n                buffers.splice(i, 1);\n                this.destination.next(buffer);\n            }\n        }\n    };\n    BufferSkipCountSubscriber.prototype._complete = function () {\n        var _a = this, buffers = _a.buffers, destination = _a.destination;\n        while (buffers.length > 0) {\n            var buffer = buffers.shift();\n            if (buffer.length > 0) {\n                destination.next(buffer);\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferSkipCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=bufferCount.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('../Subscription');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Buffers the source Observable values, using a factory function of closing\n * Observables to determine when to close, emit, and reset the buffer.\n *\n * <span class=\"informal\">Collects values from the past as an array. When it\n * starts collecting values, it calls a function that returns an Observable that\n * tells when to close the buffer and restart collecting.</span>\n *\n * <img src=\"./img/bufferWhen.png\" width=\"100%\">\n *\n * Opens a buffer immediately, then closes the buffer when the observable\n * returned by calling `closingSelector` function emits a value. When it closes\n * the buffer, it immediately opens a new buffer and repeats the process.\n *\n * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferWhen(() =>\n *   Rx.Observable.interval(1000 + Math.random() * 4000)\n * );\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link windowWhen}\n *\n * @param {function(): Observable} closingSelector A function that takes no\n * arguments and returns an Observable that signals buffer closure.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferWhen\n * @owner Observable\n */\nfunction bufferWhen(closingSelector) {\n    return this.lift(new BufferWhenOperator(closingSelector));\n}\nexports.bufferWhen = bufferWhen;\nvar BufferWhenOperator = (function () {\n    function BufferWhenOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    BufferWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));\n    };\n    return BufferWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferWhenSubscriber = (function (_super) {\n    __extends(BufferWhenSubscriber, _super);\n    function BufferWhenSubscriber(destination, closingSelector) {\n        _super.call(this, destination);\n        this.closingSelector = closingSelector;\n        this.subscribing = false;\n        this.openBuffer();\n    }\n    BufferWhenSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferWhenSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferWhenSubscriber.prototype._unsubscribe = function () {\n        this.buffer = null;\n        this.subscribing = false;\n    };\n    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openBuffer();\n    };\n    BufferWhenSubscriber.prototype.notifyComplete = function () {\n        if (this.subscribing) {\n            this.complete();\n        }\n        else {\n            this.openBuffer();\n        }\n    };\n    BufferWhenSubscriber.prototype.openBuffer = function () {\n        var closingSubscription = this.closingSubscription;\n        if (closingSubscription) {\n            this.remove(closingSubscription);\n            closingSubscription.unsubscribe();\n        }\n        var buffer = this.buffer;\n        if (this.buffer) {\n            this.destination.next(buffer);\n        }\n        this.buffer = [];\n        var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();\n        if (closingNotifier === errorObject_1.errorObject) {\n            this.error(errorObject_1.errorObject.e);\n        }\n        else {\n            closingSubscription = new Subscription_1.Subscription();\n            this.closingSubscription = closingSubscription;\n            this.add(closingSubscription);\n            this.subscribing = true;\n            closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n            this.subscribing = false;\n        }\n    };\n    return BufferWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=bufferWhen.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n *\n * <img src=\"./img/catch.png\" width=\"100%\">\n *\n * @example <caption>Continues with a different Observable when there's an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n == 4) {\n * \t     throw 'four!';\n *     }\n *\t   return n;\n *   })\n *   .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, I, II, III, IV, V\n *\n * @example <caption>Retries the caught source Observable again in case of error, similar to retry() operator</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n === 4) {\n * \t     throw 'four!';\n *     }\n * \t   return n;\n *   })\n *   .catch((err, caught) => caught)\n *   .take(30)\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, 1, 2, 3, ...\n *\n * @example <caption>Throws a new error when the source Observable throws an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n *     if (n == 4) {\n *       throw 'four!';\n *     }\n *     return n;\n *   })\n *   .catch(err => {\n *     throw 'error in source. Details: ' + err;\n *   })\n *   .subscribe(\n *     x => console.log(x),\n *     err => console.log(err)\n *   );\n *   // 1, 2, 3, error in source. Details: four!\n *\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n *  is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n *  is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} An observable that originates from either the source or the observable returned by the\n *  catch `selector` function.\n * @method catch\n * @name catch\n * @owner Observable\n */\nfunction _catch(selector) {\n    var operator = new CatchOperator(selector);\n    var caught = this.lift(operator);\n    return (operator.caught = caught);\n}\nexports._catch = _catch;\nvar CatchOperator = (function () {\n    function CatchOperator(selector) {\n        this.selector = selector;\n    }\n    CatchOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n    };\n    return CatchOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CatchSubscriber = (function (_super) {\n    __extends(CatchSubscriber, _super);\n    function CatchSubscriber(destination, selector, caught) {\n        _super.call(this, destination);\n        this.selector = selector;\n        this.caught = caught;\n    }\n    // NOTE: overriding `error` instead of `_error` because we don't want\n    // to have this flag this subscriber as `isStopped`. We can mimic the\n    // behavior of the RetrySubscriber (from the `retry` operator), where\n    // we unsubscribe from our source chain, reset our Subscriber flags,\n    // then subscribe to the selector result.\n    CatchSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var result = void 0;\n            try {\n                result = this.selector(err, this.caught);\n            }\n            catch (err2) {\n                _super.prototype.error.call(this, err2);\n                return;\n            }\n            this._unsubscribeAndRecycle();\n            this.add(subscribeToResult_1.subscribeToResult(this, result));\n        }\n    };\n    return CatchSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=catch.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar isArray_1 = require('../util/isArray');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar none = {};\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0].slice();\n    }\n    observables.unshift(this);\n    return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\nvar CombineLatestOperator = (function () {\n    function CombineLatestOperator(project) {\n        this.project = project;\n    }\n    CombineLatestOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));\n    };\n    return CombineLatestOperator;\n}());\nexports.CombineLatestOperator = CombineLatestOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CombineLatestSubscriber = (function (_super) {\n    __extends(CombineLatestSubscriber, _super);\n    function CombineLatestSubscriber(destination, project) {\n        _super.call(this, destination);\n        this.project = project;\n        this.active = 0;\n        this.values = [];\n        this.observables = [];\n    }\n    CombineLatestSubscriber.prototype._next = function (observable) {\n        this.values.push(none);\n        this.observables.push(observable);\n    };\n    CombineLatestSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            this.active = len;\n            this.toRespond = len;\n            for (var i = 0; i < len; i++) {\n                var observable = observables[i];\n                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n        if ((this.active -= 1) === 0) {\n            this.destination.complete();\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var values = this.values;\n        var oldVal = values[outerIndex];\n        var toRespond = !this.toRespond\n            ? 0\n            : oldVal === none ? --this.toRespond : this.toRespond;\n        values[outerIndex] = innerValue;\n        if (toRespond === 0) {\n            if (this.project) {\n                this._tryProject(values);\n            }\n            else {\n                this.destination.next(values.slice());\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype._tryProject = function (values) {\n        var result;\n        try {\n            result = this.project.apply(this, values);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return CombineLatestSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.CombineLatestSubscriber = CombineLatestSubscriber;\n//# sourceMappingURL=combineLatest.js.map",
-    "\"use strict\";\nvar Observable_1 = require('../Observable');\nvar isScheduler_1 = require('../util/isScheduler');\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar mergeAll_1 = require('./mergeAll');\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from every\n * given input Observable after the current Observable.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * Joins this Observable with multiple other Observables by subscribing to them\n * one at a time, starting with the source, and merging their results into the\n * output Observable. Will wait for each Observable to complete before moving\n * on to the next.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = timer.concat(sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n * @example <caption>Concatenate 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = timer1.concat(timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} other An input Observable to concatenate after the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @method concat\n * @owner Observable\n */\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return this.lift.call(concatStatic.apply(void 0, [this].concat(observables)));\n}\nexports.concat = concat;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from given\n * Observable and then moves on to the next.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * `concat` joins multiple Observables together, by subscribing to them one at a time and\n * merging their results into the output Observable. You can pass either an array of\n * Observables, or put them directly as arguments. Passing an empty array will result\n * in Observable that completes immediately.\n *\n * `concat` will subscribe to first input Observable and emit all its values, without\n * changing or affecting them in any way. When that Observable completes, it will\n * subscribe to then next Observable passed and, again, emit its values. This will be\n * repeated, until the operator runs out of Observables. When last input Observable completes,\n * `concat` will complete as well. At any given moment only one Observable passed to operator\n * emits values. If you would like to emit values from passed Observables concurrently, check out\n * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,\n * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.\n *\n * Note that if some input Observable never completes, `concat` will also never complete\n * and Observables following the one that did not complete will never be subscribed. On the other\n * hand, if some Observable simply completes immediately after it is subscribed, it will be\n * invisible for `concat`, which will just move on to the next Observable.\n *\n * If any Observable in chain errors, instead of passing control to the next Observable,\n * `concat` will error immediately as well. Observables that would be subscribed after\n * the one that emitted error, never will.\n *\n * If you pass to `concat` the same Observable many times, its stream of values\n * will be \"replayed\" on every subscription, which means you can repeat given Observable\n * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,\n * you can always use {@link repeat}.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = Rx.Observable.concat(timer, sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n *\n * @example <caption>Concatenate an array of 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n *\n * @example <caption>Concatenate the same Observable to repeat it</caption>\n * const timer = Rx.Observable.interval(1000).take(2);\n *\n * Rx.Observable.concat(timer, timer) // concating the same Observable!\n * .subscribe(\n *   value => console.log(value),\n *   err => {},\n *   () => console.log('...and it is done!')\n * );\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 0 after 3s\n * // 1 after 4s\n * // \"...and it is done!\" also after 4s\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} input1 An input Observable to concatenate with others.\n * @param {ObservableInput} input2 An input Observable to concatenate with others.\n * More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @static true\n * @name concat\n * @owner Observable\n */\nfunction concatStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var scheduler = null;\n    var args = observables;\n    if (isScheduler_1.isScheduler(args[observables.length - 1])) {\n        scheduler = args.pop();\n    }\n    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {\n        return observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));\n}\nexports.concatStatic = concatStatic;\n//# sourceMappingURL=concat.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar async_1 = require('../scheduler/async');\n/**\n * Emits a value from the source Observable only after a particular time span\n * has passed without another source emission.\n *\n * <span class=\"informal\">It's like {@link delay}, but passes only the most\n * recent value from each burst of emissions.</span>\n *\n * <img src=\"./img/debounceTime.png\" width=\"100%\">\n *\n * `debounceTime` delays values emitted by the source Observable, but drops\n * previous pending delayed emissions if a new value arrives on the source\n * Observable. This operator keeps track of the most recent value from the\n * source Observable, and emits that only when `dueTime` enough time has passed\n * without any other value appearing on the source Observable. If a new value\n * appears before `dueTime` silence occurs, the previous value will be dropped\n * and will not be emitted on the output Observable.\n *\n * This is a rate-limiting operator, because it is impossible for more than one\n * value to be emitted in any time window of duration `dueTime`, but it is also\n * a delay-like operator since output emissions do not occur at the same time as\n * they did on the source Observable. Optionally takes a {@link IScheduler} for\n * managing timers.\n *\n * @example <caption>Emit the most recent click after a burst of clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.debounceTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounce}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttleTime}\n *\n * @param {number} dueTime The timeout duration in milliseconds (or the time\n * unit determined internally by the optional `scheduler`) for the window of\n * time required to wait for emission silence before emitting the most recent\n * source value.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the timeout for each value.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified `dueTime`, and may drop some values if they occur\n * too frequently.\n * @method debounceTime\n * @owner Observable\n */\nfunction debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    return this.lift(new DebounceTimeOperator(dueTime, scheduler));\n}\nexports.debounceTime = debounceTime;\nvar DebounceTimeOperator = (function () {\n    function DebounceTimeOperator(dueTime, scheduler) {\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n    }\n    DebounceTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));\n    };\n    return DebounceTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DebounceTimeSubscriber = (function (_super) {\n    __extends(DebounceTimeSubscriber, _super);\n    function DebounceTimeSubscriber(destination, dueTime, scheduler) {\n        _super.call(this, destination);\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n        this.debouncedSubscription = null;\n        this.lastValue = null;\n        this.hasValue = false;\n    }\n    DebounceTimeSubscriber.prototype._next = function (value) {\n        this.clearDebounce();\n        this.lastValue = value;\n        this.hasValue = true;\n        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));\n    };\n    DebounceTimeSubscriber.prototype._complete = function () {\n        this.debouncedNext();\n        this.destination.complete();\n    };\n    DebounceTimeSubscriber.prototype.debouncedNext = function () {\n        this.clearDebounce();\n        if (this.hasValue) {\n            this.destination.next(this.lastValue);\n            this.lastValue = null;\n            this.hasValue = false;\n        }\n    };\n    DebounceTimeSubscriber.prototype.clearDebounce = function () {\n        var debouncedSubscription = this.debouncedSubscription;\n        if (debouncedSubscription !== null) {\n            this.remove(debouncedSubscription);\n            debouncedSubscription.unsubscribe();\n            this.debouncedSubscription = null;\n        }\n    };\n    return DebounceTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(subscriber) {\n    subscriber.debouncedNext();\n}\n//# sourceMappingURL=debounceTime.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = require('../scheduler/async');\nvar isDate_1 = require('../util/isDate');\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * <span class=\"informal\">Time shifts each item by some specified amount of\n * milliseconds.</span>\n *\n * <img src=\"./img/delay.png\" width=\"100%\">\n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example <caption>Delay each click by one second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example <caption>Delay all clicks until a future date happens</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nfunction delay(delay, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    var absoluteDelay = isDate_1.isDate(delay);\n    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n    return this.lift(new DelayOperator(delayFor, scheduler));\n}\nexports.delay = delay;\nvar DelayOperator = (function () {\n    function DelayOperator(delay, scheduler) {\n        this.delay = delay;\n        this.scheduler = scheduler;\n    }\n    DelayOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n    };\n    return DelayOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DelaySubscriber = (function (_super) {\n    __extends(DelaySubscriber, _super);\n    function DelaySubscriber(destination, delay, scheduler) {\n        _super.call(this, destination);\n        this.delay = delay;\n        this.scheduler = scheduler;\n        this.queue = [];\n        this.active = false;\n        this.errored = false;\n    }\n    DelaySubscriber.dispatch = function (state) {\n        var source = state.source;\n        var queue = source.queue;\n        var scheduler = state.scheduler;\n        var destination = state.destination;\n        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n            queue.shift().notification.observe(destination);\n        }\n        if (queue.length > 0) {\n            var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n            this.schedule(state, delay_1);\n        }\n        else {\n            source.active = false;\n        }\n    };\n    DelaySubscriber.prototype._schedule = function (scheduler) {\n        this.active = true;\n        this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n            source: this, destination: this.destination, scheduler: scheduler\n        }));\n    };\n    DelaySubscriber.prototype.scheduleNotification = function (notification) {\n        if (this.errored === true) {\n            return;\n        }\n        var scheduler = this.scheduler;\n        var message = new DelayMessage(scheduler.now() + this.delay, notification);\n        this.queue.push(message);\n        if (this.active === false) {\n            this._schedule(scheduler);\n        }\n    };\n    DelaySubscriber.prototype._next = function (value) {\n        this.scheduleNotification(Notification_1.Notification.createNext(value));\n    };\n    DelaySubscriber.prototype._error = function (err) {\n        this.errored = true;\n        this.queue = [];\n        this.destination.error(err);\n    };\n    DelaySubscriber.prototype._complete = function () {\n        this.scheduleNotification(Notification_1.Notification.createComplete());\n    };\n    return DelaySubscriber;\n}(Subscriber_1.Subscriber));\nvar DelayMessage = (function () {\n    function DelayMessage(time, notification) {\n        this.time = time;\n        this.notification = notification;\n    }\n    return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar Set_1 = require('../util/Set');\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.\n *\n * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will\n * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the\n * source observable directly with an equality check against previous values.\n *\n * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.\n *\n * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the\n * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`\n * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so\n * that the internal `Set` can be \"flushed\", basically clearing it of values.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)\n *   .distinct()\n *   .subscribe(x => console.log(x)); // 1, 2, 3, 4\n *\n * @example <caption>An example using a keySelector function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     .distinct((p: Person) => p.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n *\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [keySelector] Optional function to select which value you want to check as distinct.\n * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinct\n * @owner Observable\n */\nfunction distinct(keySelector, flushes) {\n    return this.lift(new DistinctOperator(keySelector, flushes));\n}\nexports.distinct = distinct;\nvar DistinctOperator = (function () {\n    function DistinctOperator(keySelector, flushes) {\n        this.keySelector = keySelector;\n        this.flushes = flushes;\n    }\n    DistinctOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));\n    };\n    return DistinctOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctSubscriber = (function (_super) {\n    __extends(DistinctSubscriber, _super);\n    function DistinctSubscriber(destination, keySelector, flushes) {\n        _super.call(this, destination);\n        this.keySelector = keySelector;\n        this.values = new Set_1.Set();\n        if (flushes) {\n            this.add(subscribeToResult_1.subscribeToResult(this, flushes));\n        }\n    }\n    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values.clear();\n    };\n    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DistinctSubscriber.prototype._next = function (value) {\n        if (this.keySelector) {\n            this._useKeySelector(value);\n        }\n        else {\n            this._finalizeNext(value, value);\n        }\n    };\n    DistinctSubscriber.prototype._useKeySelector = function (value) {\n        var key;\n        var destination = this.destination;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this._finalizeNext(key, value);\n    };\n    DistinctSubscriber.prototype._finalizeNext = function (key, value) {\n        var values = this.values;\n        if (!values.has(key)) {\n            values.add(key);\n            this.destination.next(value);\n        }\n    };\n    return DistinctSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.DistinctSubscriber = DistinctSubscriber;\n//# sourceMappingURL=distinct.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n *\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n *\n * If a comparator function is not provided, an equality check is used by default.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)\n *   .distinctUntilChanged()\n *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4\n *\n * @example <caption>An example using a compare function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     { age: 6, name: 'Foo'})\n *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n * // { age: 5, name: 'Foo' }\n *\n * @see {@link distinct}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nfunction distinctUntilChanged(compare, keySelector) {\n    return this.lift(new DistinctUntilChangedOperator(compare, keySelector));\n}\nexports.distinctUntilChanged = distinctUntilChanged;\nvar DistinctUntilChangedOperator = (function () {\n    function DistinctUntilChangedOperator(compare, keySelector) {\n        this.compare = compare;\n        this.keySelector = keySelector;\n    }\n    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n    };\n    return DistinctUntilChangedOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctUntilChangedSubscriber = (function (_super) {\n    __extends(DistinctUntilChangedSubscriber, _super);\n    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n        _super.call(this, destination);\n        this.keySelector = keySelector;\n        this.hasKey = false;\n        if (typeof compare === 'function') {\n            this.compare = compare;\n        }\n    }\n    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n        return x === y;\n    };\n    DistinctUntilChangedSubscriber.prototype._next = function (value) {\n        var keySelector = this.keySelector;\n        var key = value;\n        if (keySelector) {\n            key = tryCatch_1.tryCatch(this.keySelector)(value);\n            if (key === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        var result = false;\n        if (this.hasKey) {\n            result = tryCatch_1.tryCatch(this.compare)(this.key, key);\n            if (result === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        else {\n            this.hasKey = true;\n        }\n        if (Boolean(result) === false) {\n            this.key = key;\n            this.destination.next(value);\n        }\n    };\n    return DistinctUntilChangedSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=distinctUntilChanged.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * <span class=\"informal\">Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source as long as errors don't occur.</span>\n *\n * <img src=\"./img/do.png\" width=\"100%\">\n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n *   .do(ev => console.log(ev))\n *   .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @method do\n * @name do\n * @owner Observable\n */\nfunction _do(nextOrObserver, error, complete) {\n    return this.lift(new DoOperator(nextOrObserver, error, complete));\n}\nexports._do = _do;\nvar DoOperator = (function () {\n    function DoOperator(nextOrObserver, error, complete) {\n        this.nextOrObserver = nextOrObserver;\n        this.error = error;\n        this.complete = complete;\n    }\n    DoOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n    };\n    return DoOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DoSubscriber = (function (_super) {\n    __extends(DoSubscriber, _super);\n    function DoSubscriber(destination, nextOrObserver, error, complete) {\n        _super.call(this, destination);\n        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n        safeSubscriber.syncErrorThrowable = true;\n        this.add(safeSubscriber);\n        this.safeSubscriber = safeSubscriber;\n    }\n    DoSubscriber.prototype._next = function (value) {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.next(value);\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.next(value);\n        }\n    };\n    DoSubscriber.prototype._error = function (err) {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.error(err);\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.error(err);\n        }\n    };\n    DoSubscriber.prototype._complete = function () {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.complete();\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    return DoSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=do.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Recursively projects each source value to an Observable which is merged in\n * the output Observable.\n *\n * <span class=\"informal\">It's similar to {@link mergeMap}, but applies the\n * projection function to every source value as well as every output value.\n * It's recursive.</span>\n *\n * <img src=\"./img/expand.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger. *Expand* will re-emit on the output\n * Observable every source value. Then, each output value is given to the\n * `project` function which returns an inner Observable to be merged on the\n * output Observable. Those output values resulting from the projection are also\n * given to the `project` function to produce new output values. This is how\n * *expand* behaves recursively.\n *\n * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var powersOfTwo = clicks\n *   .mapTo(1)\n *   .expand(x => Rx.Observable.of(2 * x).delay(1000))\n *   .take(10);\n * powersOfTwo.subscribe(x => console.log(x));\n *\n * @see {@link mergeMap}\n * @see {@link mergeScan}\n *\n * @param {function(value: T, index: number) => Observable} project A function\n * that, when applied to an item emitted by the source or the output Observable,\n * returns an Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to\n * each projected inner Observable.\n * @return {Observable} An Observable that emits the source values and also\n * result of applying the projection function to each value emitted on the\n * output Observable and and merging the results of the Observables obtained\n * from this transformation.\n * @method expand\n * @owner Observable\n */\nfunction expand(project, concurrent, scheduler) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (scheduler === void 0) { scheduler = undefined; }\n    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n    return this.lift(new ExpandOperator(project, concurrent, scheduler));\n}\nexports.expand = expand;\nvar ExpandOperator = (function () {\n    function ExpandOperator(project, concurrent, scheduler) {\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n    }\n    ExpandOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));\n    };\n    return ExpandOperator;\n}());\nexports.ExpandOperator = ExpandOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ExpandSubscriber = (function (_super) {\n    __extends(ExpandSubscriber, _super);\n    function ExpandSubscriber(destination, project, concurrent, scheduler) {\n        _super.call(this, destination);\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n        this.index = 0;\n        this.active = 0;\n        this.hasCompleted = false;\n        if (concurrent < Number.POSITIVE_INFINITY) {\n            this.buffer = [];\n        }\n    }\n    ExpandSubscriber.dispatch = function (arg) {\n        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;\n        subscriber.subscribeToProjection(result, value, index);\n    };\n    ExpandSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (destination.closed) {\n            this._complete();\n            return;\n        }\n        var index = this.index++;\n        if (this.active < this.concurrent) {\n            destination.next(value);\n            var result = tryCatch_1.tryCatch(this.project)(value, index);\n            if (result === errorObject_1.errorObject) {\n                destination.error(errorObject_1.errorObject.e);\n            }\n            else if (!this.scheduler) {\n                this.subscribeToProjection(result, value, index);\n            }\n            else {\n                var state = { subscriber: this, result: result, value: value, index: index };\n                this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));\n            }\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {\n        this.active++;\n        this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));\n    };\n    ExpandSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._next(innerValue);\n    };\n    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer && buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    return ExpandSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.ExpandSubscriber = ExpandSubscriber;\n//# sourceMappingURL=expand.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * <span class=\"informal\">Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.</span>\n *\n * <img src=\"./img/filter.png\" width=\"100%\">\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example <caption>Emit only click events whose target was a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nfunction filter(predicate, thisArg) {\n    return this.lift(new FilterOperator(predicate, thisArg));\n}\nexports.filter = filter;\nvar FilterOperator = (function () {\n    function FilterOperator(predicate, thisArg) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n    }\n    FilterOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n    };\n    return FilterOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FilterSubscriber = (function (_super) {\n    __extends(FilterSubscriber, _super);\n    function FilterSubscriber(destination, predicate, thisArg) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.count = 0;\n        this.predicate = predicate;\n    }\n    // the try catch block below is left specifically for\n    // optimization and perf reasons. a tryCatcher is not necessary here.\n    FilterSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.destination.next(value);\n        }\n    };\n    return FilterSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=filter.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar Subscription_1 = require('../Subscription');\n/**\n * Returns an Observable that mirrors the source Observable, but will call a specified function when\n * the source terminates on complete or error.\n * @param {function} callback Function to be called when source terminates.\n * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.\n * @method finally\n * @owner Observable\n */\nfunction _finally(callback) {\n    return this.lift(new FinallyOperator(callback));\n}\nexports._finally = _finally;\nvar FinallyOperator = (function () {\n    function FinallyOperator(callback) {\n        this.callback = callback;\n    }\n    FinallyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FinallySubscriber(subscriber, this.callback));\n    };\n    return FinallyOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FinallySubscriber = (function (_super) {\n    __extends(FinallySubscriber, _super);\n    function FinallySubscriber(destination, callback) {\n        _super.call(this, destination);\n        this.add(new Subscription_1.Subscription(callback));\n    }\n    return FinallySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=finally.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/**\n * Emits only the first value (or the first value that meets some condition)\n * emitted by the source Observable.\n *\n * <span class=\"informal\">Emits only the first value. Or emits only the first\n * value that passes some test.</span>\n *\n * <img src=\"./img/first.png\" width=\"100%\">\n *\n * If called with no arguments, `first` emits the first value of the source\n * Observable, then completes. If called with a `predicate` function, `first`\n * emits the first value of the source that matches the specified condition. It\n * may also take a `resultSelector` function to produce the output value from\n * the input value, and a `defaultValue` to emit in case the source completes\n * before it is able to emit a valid value. Throws an error if `defaultValue`\n * was not provided and a matching element is not found.\n *\n * @example <caption>Emit only the first click that happens on the DOM</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Emits the first click that happens on a DIV</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link take}\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]\n * An optional function called with each item to test for condition matching.\n * @param {function(value: T, index: number): R} [resultSelector] A function to\n * produce the value on the output Observable based on the values\n * and the indices of the source Observable. The arguments passed to this\n * function are:\n * - `value`: the value that was emitted on the source.\n * - `index`: the \"index\" of the value from the source.\n * @param {R} [defaultValue] The default value emitted in case no valid value\n * was found on the source.\n * @return {Observable<T|R>} An Observable of the first item that matches the\n * condition.\n * @method first\n * @owner Observable\n */\nfunction first(predicate, resultSelector, defaultValue) {\n    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.first = first;\nvar FirstOperator = (function () {\n    function FirstOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    FirstOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return FirstOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FirstSubscriber = (function (_super) {\n    __extends(FirstSubscriber, _super);\n    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.index = 0;\n        this.hasCompleted = false;\n        this._emitted = false;\n    }\n    FirstSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._emit = function (value, index) {\n        if (this.resultSelector) {\n            this._tryResultSelector(value, index);\n            return;\n        }\n        this._emitFinal(value);\n    };\n    FirstSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this._emitFinal(result);\n    };\n    FirstSubscriber.prototype._emitFinal = function (value) {\n        var destination = this.destination;\n        if (!this._emitted) {\n            this._emitted = true;\n            destination.next(value);\n            destination.complete();\n            this.hasCompleted = true;\n        }\n    };\n    FirstSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {\n            destination.next(this.defaultValue);\n            destination.complete();\n        }\n        else if (!this.hasCompleted) {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return FirstSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=first.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits only the last item emitted by the source Observable.\n * It optionally takes a predicate function as a parameter, in which case, rather than emitting\n * the last item from the source Observable, the resulting Observable will emit the last item\n * from the source Observable that satisfies the predicate.\n *\n * <img src=\"./img/last.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {function} predicate - The condition any source emitted item has to satisfy.\n * @return {Observable} An Observable that emits only the last item satisfying the given condition\n * from the source, or an NoSuchElementException if no such items are emitted.\n * @throws - Throws if no items that match the predicate are emitted by the source Observable.\n * @method last\n * @owner Observable\n */\nfunction last(predicate, resultSelector, defaultValue) {\n    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.last = last;\nvar LastOperator = (function () {\n    function LastOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    LastOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return LastOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar LastSubscriber = (function (_super) {\n    __extends(LastSubscriber, _super);\n    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.hasValue = false;\n        this.index = 0;\n        if (typeof defaultValue !== 'undefined') {\n            this.lastValue = defaultValue;\n            this.hasValue = true;\n        }\n    }\n    LastSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.lastValue = result;\n        this.hasValue = true;\n    };\n    LastSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (this.hasValue) {\n            destination.next(this.lastValue);\n            destination.complete();\n        }\n        else {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return LastSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=last.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * <span class=\"informal\">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.</span>\n *\n * <img src=\"./img/map.png\" width=\"100%\">\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example <caption>Map every click to the clientX position of that click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable<R>} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nfunction map(project, thisArg) {\n    if (typeof project !== 'function') {\n        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n    }\n    return this.lift(new MapOperator(project, thisArg));\n}\nexports.map = map;\nvar MapOperator = (function () {\n    function MapOperator(project, thisArg) {\n        this.project = project;\n        this.thisArg = thisArg;\n    }\n    MapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n    };\n    return MapOperator;\n}());\nexports.MapOperator = MapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MapSubscriber = (function (_super) {\n    __extends(MapSubscriber, _super);\n    function MapSubscriber(destination, project, thisArg) {\n        _super.call(this, destination);\n        this.project = project;\n        this.count = 0;\n        this.thisArg = thisArg || this;\n    }\n    // NOTE: This looks unoptimized, but it's actually purposefully NOT\n    // using try/catch optimizations.\n    MapSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.project.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return MapSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=map.js.map",
-    "\"use strict\";\nvar Observable_1 = require('../Observable');\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar mergeAll_1 = require('./mergeAll');\nvar isScheduler_1 = require('../util/isScheduler');\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (either the source or an\n * Observable given as argument), and simply forwards (without doing any\n * transformation) all the values from all the input Observables to the output\n * Observable. The output Observable only completes once all input Observables\n * have completed. Any error delivered by an input Observable will be immediately\n * emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = clicks.merge(timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = timer1.merge(timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {ObservableInput} other An input Observable to merge with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} An Observable that emits items that are the result of\n * every input Observable.\n * @method merge\n * @owner Observable\n */\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));\n}\nexports.merge = merge;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = Rx.Observable.merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits it's max iteration, timer2 will\n * //   continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits it's max iteration it terminates, and\n * //   timer3 will continue to emit a value every 500ms until it is complete\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...ObservableInput} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nfunction mergeStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var concurrent = Number.POSITIVE_INFINITY;\n    var scheduler = null;\n    var last = observables[observables.length - 1];\n    if (isScheduler_1.isScheduler(last)) {\n        scheduler = observables.pop();\n        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n            concurrent = observables.pop();\n        }\n    }\n    else if (typeof last === 'number') {\n        concurrent = observables.pop();\n    }\n    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {\n        return observables[0];\n    }\n    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));\n}\nexports.mergeStatic = mergeStatic;\n//# sourceMappingURL=merge.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables.</span>\n *\n * <img src=\"./img/mergeAll.png\" width=\"100%\">\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var firstOrder = higherOrder.mergeAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));\n * var firstOrder = higherOrder.mergeAll(2);\n * firstOrder.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nfunction mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return this.lift(new MergeAllOperator(concurrent));\n}\nexports.mergeAll = mergeAll;\nvar MergeAllOperator = (function () {\n    function MergeAllOperator(concurrent) {\n        this.concurrent = concurrent;\n    }\n    MergeAllOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));\n    };\n    return MergeAllOperator;\n}());\nexports.MergeAllOperator = MergeAllOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeAllSubscriber = (function (_super) {\n    __extends(MergeAllSubscriber, _super);\n    function MergeAllSubscriber(destination, concurrent) {\n        _super.call(this, destination);\n        this.concurrent = concurrent;\n        this.hasCompleted = false;\n        this.buffer = [];\n        this.active = 0;\n    }\n    MergeAllSubscriber.prototype._next = function (observable) {\n        if (this.active < this.concurrent) {\n            this.active++;\n            this.add(subscribeToResult_1.subscribeToResult(this, observable));\n        }\n        else {\n            this.buffer.push(observable);\n        }\n    };\n    MergeAllSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n    };\n    MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeAllSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeAllSubscriber = MergeAllSubscriber;\n//# sourceMappingURL=mergeAll.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.</span>\n *\n * <img src=\"./img/mergeMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n *   Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nfunction mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n        resultSelector = null;\n    }\n    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));\n}\nexports.mergeMap = mergeMap;\nvar MergeMapOperator = (function () {\n    function MergeMapOperator(project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n    }\n    MergeMapOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));\n    };\n    return MergeMapOperator;\n}());\nexports.MergeMapOperator = MergeMapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeMapSubscriber = (function (_super) {\n    __extends(MergeMapSubscriber, _super);\n    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        _super.call(this, destination);\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n        this.hasCompleted = false;\n        this.buffer = [];\n        this.active = 0;\n        this.index = 0;\n    }\n    MergeMapSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            this._tryNext(value);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeMapSubscriber.prototype._tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.active++;\n        this._innerSub(result, value, index);\n    };\n    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n    };\n    MergeMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n    };\n    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (this.resultSelector) {\n            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        else {\n            this.destination.next(innerValue);\n        }\n    };\n    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {\n        var result;\n        try {\n            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeMapSubscriber = MergeMapSubscriber;\n//# sourceMappingURL=mergeMap.js.map",
-    "\"use strict\";\nvar ConnectableObservable_1 = require('../observable/ConnectableObservable');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits the results of invoking a specified selector on items\n * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.\n *\n * <img src=\"./img/multicast.png\" width=\"100%\">\n *\n * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through\n * which the source sequence's elements will be multicast to the selector function\n * or Subject to push source elements into.\n * @param {Function} [selector] - Optional selector function that can use the multicasted source stream\n * as many times as needed, without causing multiple subscriptions to the source stream.\n * Subscribers to the given source will receive all notifications of the source from the\n * time of the subscription forward.\n * @return {Observable} An Observable that emits the results of invoking the selector\n * on the items emitted by a `ConnectableObservable` that shares a single subscription to\n * the underlying stream.\n * @method multicast\n * @owner Observable\n */\nfunction multicast(subjectOrSubjectFactory, selector) {\n    var subjectFactory;\n    if (typeof subjectOrSubjectFactory === 'function') {\n        subjectFactory = subjectOrSubjectFactory;\n    }\n    else {\n        subjectFactory = function subjectFactory() {\n            return subjectOrSubjectFactory;\n        };\n    }\n    if (typeof selector === 'function') {\n        return this.lift(new MulticastOperator(subjectFactory, selector));\n    }\n    var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor);\n    connectable.source = this;\n    connectable.subjectFactory = subjectFactory;\n    return connectable;\n}\nexports.multicast = multicast;\nvar MulticastOperator = (function () {\n    function MulticastOperator(subjectFactory, selector) {\n        this.subjectFactory = subjectFactory;\n        this.selector = selector;\n    }\n    MulticastOperator.prototype.call = function (subscriber, source) {\n        var selector = this.selector;\n        var subject = this.subjectFactory();\n        var subscription = selector(subject).subscribe(subscriber);\n        subscription.add(source.subscribe(subject));\n        return subscription;\n    };\n    return MulticastOperator;\n}());\nexports.MulticastOperator = MulticastOperator;\n//# sourceMappingURL=multicast.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n *\n * Re-emits all notifications from source Observable with specified scheduler.\n *\n * <span class=\"informal\">Ensure a specific scheduler is used, from outside of an Observable.</span>\n *\n * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule\n * notifications emitted by the source Observable. It might be useful, if you do not have control over\n * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.\n *\n * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,\n * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal\n * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits\n * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.\n * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split\n * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source\n * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a\n * little bit more, to ensure that they are emitted at expected moments.\n *\n * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications\n * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`\n * will delay all notifications - including error notifications - while `delay` will pass through error\n * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator\n * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used\n * for notification emissions in general.\n *\n * @example <caption>Ensure values in subscribe are called just before browser repaint.</caption>\n * const intervals = Rx.Observable.interval(10); // Intervals are scheduled\n *                                               // with async scheduler by default...\n *\n * intervals\n * .observeOn(Rx.Scheduler.animationFrame)       // ...but we will observe on animationFrame\n * .subscribe(val => {                           // scheduler to ensure smooth animation.\n *   someDiv.style.height = val + 'px';\n * });\n *\n * @see {@link delay}\n *\n * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable.\n * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.\n * @return {Observable<T>} Observable that emits the same notifications as the source Observable,\n * but with provided scheduler.\n *\n * @method observeOn\n * @owner Observable\n */\nfunction observeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return this.lift(new ObserveOnOperator(scheduler, delay));\n}\nexports.observeOn = observeOn;\nvar ObserveOnOperator = (function () {\n    function ObserveOnOperator(scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n    };\n    return ObserveOnOperator;\n}());\nexports.ObserveOnOperator = ObserveOnOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ObserveOnSubscriber = (function (_super) {\n    __extends(ObserveOnSubscriber, _super);\n    function ObserveOnSubscriber(destination, scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        _super.call(this, destination);\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnSubscriber.dispatch = function (arg) {\n        var notification = arg.notification, destination = arg.destination;\n        notification.observe(destination);\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n        this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n    };\n    ObserveOnSubscriber.prototype._next = function (value) {\n        this.scheduleMessage(Notification_1.Notification.createNext(value));\n    };\n    ObserveOnSubscriber.prototype._error = function (err) {\n        this.scheduleMessage(Notification_1.Notification.createError(err));\n    };\n    ObserveOnSubscriber.prototype._complete = function () {\n        this.scheduleMessage(Notification_1.Notification.createComplete());\n    };\n    return ObserveOnSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ObserveOnSubscriber = ObserveOnSubscriber;\nvar ObserveOnMessage = (function () {\n    function ObserveOnMessage(notification, destination) {\n        this.notification = notification;\n        this.destination = destination;\n    }\n    return ObserveOnMessage;\n}());\nexports.ObserveOnMessage = ObserveOnMessage;\n//# sourceMappingURL=observeOn.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Groups pairs of consecutive emissions together and emits them as an array of\n * two values.\n *\n * <span class=\"informal\">Puts the current value and previous value together as\n * an array, and emits that.</span>\n *\n * <img src=\"./img/pairwise.png\" width=\"100%\">\n *\n * The Nth emission from the source Observable will cause the output Observable\n * to emit an array [(N-1)th, Nth] of the previous and the current value, as a\n * pair. For this reason, `pairwise` emits on the second and subsequent\n * emissions from the source Observable, but not on the first emission, because\n * there is no previous value in that case.\n *\n * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var pairs = clicks.pairwise();\n * var distance = pairs.map(pair => {\n *   var x0 = pair[0].clientX;\n *   var y0 = pair[0].clientY;\n *   var x1 = pair[1].clientX;\n *   var y1 = pair[1].clientY;\n *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));\n * });\n * distance.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n *\n * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of\n * consecutive values from the source Observable.\n * @method pairwise\n * @owner Observable\n */\nfunction pairwise() {\n    return this.lift(new PairwiseOperator());\n}\nexports.pairwise = pairwise;\nvar PairwiseOperator = (function () {\n    function PairwiseOperator() {\n    }\n    PairwiseOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new PairwiseSubscriber(subscriber));\n    };\n    return PairwiseOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar PairwiseSubscriber = (function (_super) {\n    __extends(PairwiseSubscriber, _super);\n    function PairwiseSubscriber(destination) {\n        _super.call(this, destination);\n        this.hasPrev = false;\n    }\n    PairwiseSubscriber.prototype._next = function (value) {\n        if (this.hasPrev) {\n            this.destination.next([this.prev, value]);\n        }\n        else {\n            this.hasPrev = true;\n        }\n        this.prev = value;\n    };\n    return PairwiseSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=pairwise.js.map",
-    "\"use strict\";\nvar map_1 = require('./map');\n/**\n * Maps each source value (an object) to its specified nested property.\n *\n * <span class=\"informal\">Like {@link map}, but meant only for picking one of\n * the nested properties of every emitted object.</span>\n *\n * <img src=\"./img/pluck.png\" width=\"100%\">\n *\n * Given a list of strings describing a path to an object property, retrieves\n * the value of a specified nested property from all values in the source\n * Observable. If a property can't be resolved, it will return `undefined` for\n * that value.\n *\n * @example <caption>Map every click to the tagName of the clicked target element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var tagNames = clicks.pluck('target', 'tagName');\n * tagNames.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {...string} properties The nested properties to pluck from each source\n * value (an object).\n * @return {Observable} A new Observable of property values from the source values.\n * @method pluck\n * @owner Observable\n */\nfunction pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i - 0] = arguments[_i];\n    }\n    var length = properties.length;\n    if (length === 0) {\n        throw new Error('list of properties cannot be empty.');\n    }\n    return map_1.map.call(this, plucker(properties, length));\n}\nexports.pluck = pluck;\nfunction plucker(props, length) {\n    var mapper = function (x) {\n        var currentProp = x;\n        for (var i = 0; i < length; i++) {\n            var p = currentProp[props[i]];\n            if (typeof p !== 'undefined') {\n                currentProp = p;\n            }\n            else {\n                return undefined;\n            }\n        }\n        return currentProp;\n    };\n    return mapper;\n}\n//# sourceMappingURL=pluck.js.map",
-    "\"use strict\";\nvar Subject_1 = require('../Subject');\nvar multicast_1 = require('./multicast');\n/* tslint:enable:max-line-length */\n/**\n * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called\n * before it begins emitting items to those Observers that have subscribed to it.\n *\n * <img src=\"./img/publish.png\" width=\"100%\">\n *\n * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times\n * as needed, without causing multiple subscriptions to the source sequence.\n * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.\n * @method publish\n * @owner Observable\n */\nfunction publish(selector) {\n    return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :\n        multicast_1.multicast.call(this, new Subject_1.Subject());\n}\nexports.publish = publish;\n//# sourceMappingURL=publish.js.map",
-    "\"use strict\";\nvar ReplaySubject_1 = require('../ReplaySubject');\nvar multicast_1 = require('./multicast');\n/**\n * @param bufferSize\n * @param windowTime\n * @param scheduler\n * @return {ConnectableObservable<T>}\n * @method publishReplay\n * @owner Observable\n */\nfunction publishReplay(bufferSize, windowTime, scheduler) {\n    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n    return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));\n}\nexports.publishReplay = publishReplay;\n//# sourceMappingURL=publishReplay.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Emits the most recently emitted value from the source Observable whenever\n * another Observable, the `notifier`, emits.\n *\n * <span class=\"informal\">It's like {@link sampleTime}, but samples whenever\n * the `notifier` Observable emits something.</span>\n *\n * <img src=\"./img/sample.png\" width=\"100%\">\n *\n * Whenever the `notifier` Observable emits a value or completes, `sample`\n * looks at the source Observable and emits whichever value it has most recently\n * emitted since the previous sampling, unless the source has not emitted\n * anything since the previous sampling. The `notifier` is subscribed to as soon\n * as the output Observable is subscribed.\n *\n * @example <caption>On every click, sample the most recent \"seconds\" timer</caption>\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = seconds.sample(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {Observable<any>} notifier The Observable to use for sampling the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the results of sampling the\n * values emitted by the source Observable whenever the notifier Observable\n * emits value or completes.\n * @method sample\n * @owner Observable\n */\nfunction sample(notifier) {\n    return this.lift(new SampleOperator(notifier));\n}\nexports.sample = sample;\nvar SampleOperator = (function () {\n    function SampleOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SampleOperator.prototype.call = function (subscriber, source) {\n        var sampleSubscriber = new SampleSubscriber(subscriber);\n        var subscription = source.subscribe(sampleSubscriber);\n        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));\n        return subscription;\n    };\n    return SampleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SampleSubscriber = (function (_super) {\n    __extends(SampleSubscriber, _super);\n    function SampleSubscriber() {\n        _super.apply(this, arguments);\n        this.hasValue = false;\n    }\n    SampleSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n    };\n    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.value);\n        }\n    };\n    return SampleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=sample.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns each\n * intermediate result, with an optional seed value.\n *\n * <span class=\"informal\">It's like {@link reduce}, but emits the current\n * accumulation whenever the source emits a value.</span>\n *\n * <img src=\"./img/scan.png\" width=\"100%\">\n *\n * Combines together all values emitted on the source, using an accumulator\n * function that knows how to join a new source value into the accumulation from\n * the past. Is similar to {@link reduce}, but emits the intermediate\n * accumulations.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var ones = clicks.mapTo(1);\n * var seed = 0;\n * var count = ones.scan((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link reduce}\n *\n * @param {function(acc: R, value: T, index: number): R} accumulator\n * The accumulator function called on each source value.\n * @param {T|R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @method scan\n * @owner Observable\n */\nfunction scan(accumulator, seed) {\n    var hasSeed = false;\n    // providing a seed of `undefined` *should* be valid and trigger\n    // hasSeed! so don't use `seed !== undefined` checks!\n    // For this reason, we have to check it here at the original call site\n    // otherwise inside Operator/Subscriber we won't know if `undefined`\n    // means they didn't provide anything or if they literally provided `undefined`\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return this.lift(new ScanOperator(accumulator, seed, hasSeed));\n}\nexports.scan = scan;\nvar ScanOperator = (function () {\n    function ScanOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) { hasSeed = false; }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ScanOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ScanSubscriber = (function (_super) {\n    __extends(ScanSubscriber, _super);\n    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n        _super.call(this, destination);\n        this.accumulator = accumulator;\n        this._seed = _seed;\n        this.hasSeed = hasSeed;\n        this.index = 0;\n    }\n    Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n        get: function () {\n            return this._seed;\n        },\n        set: function (value) {\n            this.hasSeed = true;\n            this._seed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ScanSubscriber.prototype._next = function (value) {\n        if (!this.hasSeed) {\n            this.seed = value;\n            this.destination.next(value);\n        }\n        else {\n            return this._tryNext(value);\n        }\n    };\n    ScanSubscriber.prototype._tryNext = function (value) {\n        var index = this.index++;\n        var result;\n        try {\n            result = this.accumulator(this.seed, value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n        this.seed = result;\n        this.destination.next(result);\n    };\n    return ScanSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=scan.js.map",
-    "\"use strict\";\nvar multicast_1 = require('./multicast');\nvar Subject_1 = require('../Subject');\nfunction shareSubjectFactory() {\n    return new Subject_1.Subject();\n}\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n * This is an alias for .publish().refCount().\n *\n * <img src=\"./img/share.png\" width=\"100%\">\n *\n * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.\n * @method share\n * @owner Observable\n */\nfunction share() {\n    return multicast_1.multicast.call(this, shareSubjectFactory).refCount();\n}\nexports.share = share;\n;\n//# sourceMappingURL=share.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that skips the first `count` items emitted by the source Observable.\n *\n * <img src=\"./img/skip.png\" width=\"100%\">\n *\n * @param {Number} count - The number of times, items emitted by source Observable should be skipped.\n * @return {Observable} An Observable that skips values emitted by the source Observable.\n *\n * @method skip\n * @owner Observable\n */\nfunction skip(count) {\n    return this.lift(new SkipOperator(count));\n}\nexports.skip = skip;\nvar SkipOperator = (function () {\n    function SkipOperator(total) {\n        this.total = total;\n    }\n    SkipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipSubscriber(subscriber, this.total));\n    };\n    return SkipOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipSubscriber = (function (_super) {\n    __extends(SkipSubscriber, _super);\n    function SkipSubscriber(destination, total) {\n        _super.call(this, destination);\n        this.total = total;\n        this.count = 0;\n    }\n    SkipSubscriber.prototype._next = function (x) {\n        if (++this.count > this.total) {\n            this.destination.next(x);\n        }\n    };\n    return SkipSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skip.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.\n *\n * <img src=\"./img/skipUntil.png\" width=\"100%\">\n *\n * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to\n * be mirrored by the resulting Observable.\n * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits\n * an item, then emits the remaining items.\n * @method skipUntil\n * @owner Observable\n */\nfunction skipUntil(notifier) {\n    return this.lift(new SkipUntilOperator(notifier));\n}\nexports.skipUntil = skipUntil;\nvar SkipUntilOperator = (function () {\n    function SkipUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SkipUntilOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier));\n    };\n    return SkipUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipUntilSubscriber = (function (_super) {\n    __extends(SkipUntilSubscriber, _super);\n    function SkipUntilSubscriber(destination, notifier) {\n        _super.call(this, destination);\n        this.hasValue = false;\n        this.isInnerStopped = false;\n        this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n    }\n    SkipUntilSubscriber.prototype._next = function (value) {\n        if (this.hasValue) {\n            _super.prototype._next.call(this, value);\n        }\n    };\n    SkipUntilSubscriber.prototype._complete = function () {\n        if (this.isInnerStopped) {\n            _super.prototype._complete.call(this);\n        }\n        else {\n            this.unsubscribe();\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.hasValue = true;\n    };\n    SkipUntilSubscriber.prototype.notifyComplete = function () {\n        this.isInnerStopped = true;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    return SkipUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=skipUntil.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds\n * true, but emits all further source items as soon as the condition becomes false.\n *\n * <img src=\"./img/skipWhile.png\" width=\"100%\">\n *\n * @param {Function} predicate - A function to test each item emitted from the source Observable.\n * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the\n * specified predicate becomes false.\n * @method skipWhile\n * @owner Observable\n */\nfunction skipWhile(predicate) {\n    return this.lift(new SkipWhileOperator(predicate));\n}\nexports.skipWhile = skipWhile;\nvar SkipWhileOperator = (function () {\n    function SkipWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    SkipWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));\n    };\n    return SkipWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipWhileSubscriber = (function (_super) {\n    __extends(SkipWhileSubscriber, _super);\n    function SkipWhileSubscriber(destination, predicate) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.skipping = true;\n        this.index = 0;\n    }\n    SkipWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (this.skipping) {\n            this.tryCallPredicate(value);\n        }\n        if (!this.skipping) {\n            destination.next(value);\n        }\n    };\n    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {\n        try {\n            var result = this.predicate(value, this.index++);\n            this.skipping = Boolean(result);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    return SkipWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skipWhile.js.map",
-    "\"use strict\";\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar ScalarObservable_1 = require('../observable/ScalarObservable');\nvar EmptyObservable_1 = require('../observable/EmptyObservable');\nvar concat_1 = require('./concat');\nvar isScheduler_1 = require('../util/isScheduler');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits the items you specify as arguments before it begins to emit\n * items emitted by the source Observable.\n *\n * <img src=\"./img/startWith.png\" width=\"100%\">\n *\n * @param {...T} values - Items you want the modified Observable to emit first.\n * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling\n * the emissions of the `next` notifications.\n * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items\n * emitted by the source Observable.\n * @method startWith\n * @owner Observable\n */\nfunction startWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i - 0] = arguments[_i];\n    }\n    var scheduler = array[array.length - 1];\n    if (isScheduler_1.isScheduler(scheduler)) {\n        array.pop();\n    }\n    else {\n        scheduler = null;\n    }\n    var len = array.length;\n    if (len === 1) {\n        return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);\n    }\n    else if (len > 1) {\n        return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);\n    }\n    else {\n        return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);\n    }\n}\nexports.startWith = startWith;\n//# sourceMappingURL=startWith.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, emitting values only from the most recently projected Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link switch}.</span>\n *\n * <img src=\"./img/switchMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each time it observes one of these\n * inner Observables, the output Observable begins emitting the items emitted by\n * that inner Observable. When a new inner Observable is emitted, `switchMap`\n * stops emitting items from the earlier-emitted inner Observable and begins\n * emitting items from the new one. It continues to behave like this for\n * subsequent inner Observables.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switch}\n * @see {@link switchMapTo}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking only the values from the most recently\n * projected inner Observable.\n * @method switchMap\n * @owner Observable\n */\nfunction switchMap(project, resultSelector) {\n    return this.lift(new SwitchMapOperator(project, resultSelector));\n}\nexports.switchMap = switchMap;\nvar SwitchMapOperator = (function () {\n    function SwitchMapOperator(project, resultSelector) {\n        this.project = project;\n        this.resultSelector = resultSelector;\n    }\n    SwitchMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));\n    };\n    return SwitchMapOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchMapSubscriber = (function (_super) {\n    __extends(SwitchMapSubscriber, _super);\n    function SwitchMapSubscriber(destination, project, resultSelector) {\n        _super.call(this, destination);\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.index = 0;\n    }\n    SwitchMapSubscriber.prototype._next = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (error) {\n            this.destination.error(error);\n            return;\n        }\n        this._innerSub(result, value, index);\n    };\n    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscription = this.innerSubscription;\n        if (innerSubscription) {\n            innerSubscription.unsubscribe();\n        }\n        this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));\n    };\n    SwitchMapSubscriber.prototype._complete = function () {\n        var innerSubscription = this.innerSubscription;\n        if (!innerSubscription || innerSubscription.closed) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype._unsubscribe = function () {\n        this.innerSubscription = null;\n    };\n    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.remove(innerSub);\n        this.innerSubscription = null;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (this.resultSelector) {\n            this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        else {\n            this.destination.next(innerValue);\n        }\n    };\n    SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n        var result;\n        try {\n            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return SwitchMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=switchMap.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');\nvar EmptyObservable_1 = require('../observable/EmptyObservable');\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Takes the first `count` values from the source, then\n * completes.</span>\n *\n * <img src=\"./img/take.png\" width=\"100%\">\n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable<T>} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nfunction take(count) {\n    if (count === 0) {\n        return new EmptyObservable_1.EmptyObservable();\n    }\n    else {\n        return this.lift(new TakeOperator(count));\n    }\n}\nexports.take = take;\nvar TakeOperator = (function () {\n    function TakeOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n        }\n    }\n    TakeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeSubscriber(subscriber, this.total));\n    };\n    return TakeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeSubscriber = (function (_super) {\n    __extends(TakeSubscriber, _super);\n    function TakeSubscriber(destination, total) {\n        _super.call(this, destination);\n        this.total = total;\n        this.count = 0;\n    }\n    TakeSubscriber.prototype._next = function (value) {\n        var total = this.total;\n        var count = ++this.count;\n        if (count <= total) {\n            this.destination.next(value);\n            if (count === total) {\n                this.destination.complete();\n                this.unsubscribe();\n            }\n        }\n    };\n    return TakeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=take.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Emits the values emitted by the source Observable until a `notifier`\n * Observable emits a value.\n *\n * <span class=\"informal\">Lets values pass until a second Observable,\n * `notifier`, emits something. Then, it completes.</span>\n *\n * <img src=\"./img/takeUntil.png\" width=\"100%\">\n *\n * `takeUntil` subscribes and begins mirroring the source Observable. It also\n * monitors a second Observable, `notifier` that you provide. If the `notifier`\n * emits a value or a complete notification, the output Observable stops\n * mirroring the source Observable and completes.\n *\n * @example <caption>Tick every second until the first click happens</caption>\n * var interval = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = interval.takeUntil(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @param {Observable} notifier The Observable whose first emitted value will\n * cause the output Observable of `takeUntil` to stop emitting values from the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable until such time as `notifier` emits its first value.\n * @method takeUntil\n * @owner Observable\n */\nfunction takeUntil(notifier) {\n    return this.lift(new TakeUntilOperator(notifier));\n}\nexports.takeUntil = takeUntil;\nvar TakeUntilOperator = (function () {\n    function TakeUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    TakeUntilOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));\n    };\n    return TakeUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeUntilSubscriber = (function (_super) {\n    __extends(TakeUntilSubscriber, _super);\n    function TakeUntilSubscriber(destination, notifier) {\n        _super.call(this, destination);\n        this.notifier = notifier;\n        this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n    }\n    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.complete();\n    };\n    TakeUntilSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    return TakeUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=takeUntil.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Emits values emitted by the source Observable so long as each value satisfies\n * the given `predicate`, and then completes as soon as this `predicate` is not\n * satisfied.\n *\n * <span class=\"informal\">Takes values from the source only while they pass the\n * condition given. When the first value does not satisfy, it completes.</span>\n *\n * <img src=\"./img/takeWhile.png\" width=\"100%\">\n *\n * `takeWhile` subscribes and begins mirroring the source Observable. Each value\n * emitted on the source is given to the `predicate` function which returns a\n * boolean, representing a condition to be satisfied by the source values. The\n * output Observable emits the source values until such time as the `predicate`\n * returns false, at which point `takeWhile` stops mirroring the source\n * Observable and completes the output Observable.\n *\n * @example <caption>Emit click events only while the clientX property is greater than 200</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.takeWhile(ev => ev.clientX > 200);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates a value emitted by the source Observable and returns a boolean.\n * Also takes the (zero-based) index as the second argument.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable so long as each value satisfies the condition defined by the\n * `predicate`, then completes.\n * @method takeWhile\n * @owner Observable\n */\nfunction takeWhile(predicate) {\n    return this.lift(new TakeWhileOperator(predicate));\n}\nexports.takeWhile = takeWhile;\nvar TakeWhileOperator = (function () {\n    function TakeWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    TakeWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate));\n    };\n    return TakeWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeWhileSubscriber = (function (_super) {\n    __extends(TakeWhileSubscriber, _super);\n    function TakeWhileSubscriber(destination, predicate) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.index = 0;\n    }\n    TakeWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        var result;\n        try {\n            result = this.predicate(value, this.index++);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this.nextOrComplete(value, result);\n    };\n    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {\n        var destination = this.destination;\n        if (Boolean(predicateResult)) {\n            destination.next(value);\n        }\n        else {\n            destination.complete();\n        }\n    };\n    return TakeWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=takeWhile.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nexports.defaultThrottleConfig = {\n    leading: true,\n    trailing: false\n};\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for a duration determined by another Observable, then repeats this\n * process.\n *\n * <span class=\"informal\">It's like {@link throttleTime}, but the silencing\n * duration is determined by a second Observable.</span>\n *\n * <img src=\"./img/throttle.png\" width=\"100%\">\n *\n * `throttle` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled by calling the `durationSelector` function with the source value,\n * which returns the \"duration\" Observable. When the duration Observable emits a\n * value or completes, the timer is disabled, and this process repeats for the\n * next source value.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttle(ev => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link delayWhen}\n * @see {@link sample}\n * @see {@link throttleTime}\n *\n * @param {function(value: T): SubscribableOrPromise} durationSelector A function\n * that receives a value from the source Observable, for computing the silencing\n * duration for each source value, returned as an Observable or a Promise.\n * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults\n * to `{ leading: true, trailing: false }`.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttle\n * @owner Observable\n */\nfunction throttle(durationSelector, config) {\n    if (config === void 0) { config = exports.defaultThrottleConfig; }\n    return this.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing));\n}\nexports.throttle = throttle;\nvar ThrottleOperator = (function () {\n    function ThrottleOperator(durationSelector, leading, trailing) {\n        this.durationSelector = durationSelector;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n    };\n    return ThrottleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleSubscriber = (function (_super) {\n    __extends(ThrottleSubscriber, _super);\n    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {\n        _super.call(this, destination);\n        this.destination = destination;\n        this.durationSelector = durationSelector;\n        this._leading = _leading;\n        this._trailing = _trailing;\n        this._hasTrailingValue = false;\n    }\n    ThrottleSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this._trailing) {\n                this._hasTrailingValue = true;\n                this._trailingValue = value;\n            }\n        }\n        else {\n            var duration = this.tryDurationSelector(value);\n            if (duration) {\n                this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration));\n            }\n            if (this._leading) {\n                this.destination.next(value);\n                if (this._trailing) {\n                    this._hasTrailingValue = true;\n                    this._trailingValue = value;\n                }\n            }\n        }\n    };\n    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {\n        try {\n            return this.durationSelector(value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return null;\n        }\n    };\n    ThrottleSubscriber.prototype._unsubscribe = function () {\n        var _a = this, throttled = _a.throttled, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue, _trailing = _a._trailing;\n        this._trailingValue = null;\n        this._hasTrailingValue = false;\n        if (throttled) {\n            this.remove(throttled);\n            this.throttled = null;\n            throttled.unsubscribe();\n        }\n    };\n    ThrottleSubscriber.prototype._sendTrailing = function () {\n        var _a = this, destination = _a.destination, throttled = _a.throttled, _trailing = _a._trailing, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue;\n        if (throttled && _trailing && _hasTrailingValue) {\n            destination.next(_trailingValue);\n            this._trailingValue = null;\n            this._hasTrailingValue = false;\n        }\n    };\n    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._sendTrailing();\n        this._unsubscribe();\n    };\n    ThrottleSubscriber.prototype.notifyComplete = function () {\n        this._sendTrailing();\n        this._unsubscribe();\n    };\n    return ThrottleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=throttle.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar async_1 = require('../scheduler/async');\nvar throttle_1 = require('./throttle');\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for `duration` milliseconds, then repeats this process.\n *\n * <span class=\"informal\">Lets a value pass, then ignores source values for the\n * next `duration` milliseconds.</span>\n *\n * <img src=\"./img/throttleTime.png\" width=\"100%\">\n *\n * `throttleTime` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled. After `duration` milliseconds (or the time unit determined\n * internally by the optional `scheduler`) has passed, the timer is disabled,\n * and this process repeats for the next source value. Optionally takes a\n * {@link IScheduler} for managing timers.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttleTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {number} duration Time to wait before emitting another value after\n * emitting the last value, measured in milliseconds or the time unit determined\n * internally by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the throttling.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttleTime\n * @owner Observable\n */\nfunction throttleTime(duration, scheduler, config) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }\n    return this.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));\n}\nexports.throttleTime = throttleTime;\nvar ThrottleTimeOperator = (function () {\n    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n    };\n    return ThrottleTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleTimeSubscriber = (function (_super) {\n    __extends(ThrottleTimeSubscriber, _super);\n    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {\n        _super.call(this, destination);\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n        this._hasTrailingValue = false;\n        this._trailingValue = null;\n    }\n    ThrottleTimeSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n        else {\n            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n            if (this.leading) {\n                this.destination.next(value);\n            }\n        }\n    };\n    ThrottleTimeSubscriber.prototype.clearThrottle = function () {\n        var throttled = this.throttled;\n        if (throttled) {\n            if (this.trailing && this._hasTrailingValue) {\n                this.destination.next(this._trailingValue);\n                this._trailingValue = null;\n                this._hasTrailingValue = false;\n            }\n            throttled.unsubscribe();\n            this.remove(throttled);\n            this.throttled = null;\n        }\n    };\n    return ThrottleTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(arg) {\n    var subscriber = arg.subscriber;\n    subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Combines the source Observable with other Observables to create an Observable\n * whose values are calculated from the latest values of each, only when the\n * source emits.\n *\n * <span class=\"informal\">Whenever the source Observable emits a value, it\n * computes a formula using that value plus the latest values from other input\n * Observables, then emits the output of that formula.</span>\n *\n * <img src=\"./img/withLatestFrom.png\" width=\"100%\">\n *\n * `withLatestFrom` combines each value from the source Observable (the\n * instance) with the latest values from the other input Observables only when\n * the source emits a value, optionally using a `project` function to determine\n * the value to be emitted on the output Observable. All input Observables must\n * emit at least one value before the output Observable will emit a value.\n *\n * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var result = clicks.withLatestFrom(timer);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Function} [project] Projection function for combining values\n * together. Receives all values in order of the Observables passed, where the\n * first parameter is a value from the source Observable. (e.g.\n * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not\n * passed, arrays will be emitted on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method withLatestFrom\n * @owner Observable\n */\nfunction withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i - 0] = arguments[_i];\n    }\n    var project;\n    if (typeof args[args.length - 1] === 'function') {\n        project = args.pop();\n    }\n    var observables = args;\n    return this.lift(new WithLatestFromOperator(observables, project));\n}\nexports.withLatestFrom = withLatestFrom;\nvar WithLatestFromOperator = (function () {\n    function WithLatestFromOperator(observables, project) {\n        this.observables = observables;\n        this.project = project;\n    }\n    WithLatestFromOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n    };\n    return WithLatestFromOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WithLatestFromSubscriber = (function (_super) {\n    __extends(WithLatestFromSubscriber, _super);\n    function WithLatestFromSubscriber(destination, observables, project) {\n        _super.call(this, destination);\n        this.observables = observables;\n        this.project = project;\n        this.toRespond = [];\n        var len = observables.length;\n        this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            this.toRespond.push(i);\n        }\n        for (var i = 0; i < len; i++) {\n            var observable = observables[i];\n            this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n        }\n    }\n    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        var toRespond = this.toRespond;\n        if (toRespond.length > 0) {\n            var found = toRespond.indexOf(outerIndex);\n            if (found !== -1) {\n                toRespond.splice(found, 1);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    WithLatestFromSubscriber.prototype._next = function (value) {\n        if (this.toRespond.length === 0) {\n            var args = [value].concat(this.values);\n            if (this.project) {\n                this._tryProject(args);\n            }\n            else {\n                this.destination.next(args);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return WithLatestFromSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=withLatestFrom.js.map",
-    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar isArray_1 = require('../util/isArray');\nvar Subscriber_1 = require('../Subscriber');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar iterator_1 = require('../symbol/iterator');\n/* tslint:enable:max-line-length */\n/**\n * @param observables\n * @return {Observable<R>}\n * @method zip\n * @owner Observable\n */\nfunction zipProto() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return this.lift.call(zipStatic.apply(void 0, [this].concat(observables)));\n}\nexports.zipProto = zipProto;\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each\n * of its input Observables.\n *\n * If the latest parameter is a function, this function is used to compute the created value from the input values.\n * Otherwise, an array of the input values is returned.\n *\n * @example <caption>Combine age and name from different sources</caption>\n *\n * let age$ = Observable.of<number>(27, 25, 29);\n * let name$ = Observable.of<string>('Foo', 'Bar', 'Beer');\n * let isDev$ = Observable.of<boolean>(true, true, false);\n *\n * Observable\n *     .zip(age$,\n *          name$,\n *          isDev$,\n *          (age: number, name: string, isDev: boolean) => ({ age, name, isDev }))\n *     .subscribe(x => console.log(x));\n *\n * // outputs\n * // { age: 27, name: 'Foo', isDev: true }\n * // { age: 25, name: 'Bar', isDev: true }\n * // { age: 29, name: 'Beer', isDev: false }\n *\n * @param observables\n * @return {Observable<R>}\n * @static true\n * @name zip\n * @owner Observable\n */\nfunction zipStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = observables[observables.length - 1];\n    if (typeof project === 'function') {\n        observables.pop();\n    }\n    return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));\n}\nexports.zipStatic = zipStatic;\nvar ZipOperator = (function () {\n    function ZipOperator(project) {\n        this.project = project;\n    }\n    ZipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ZipSubscriber(subscriber, this.project));\n    };\n    return ZipOperator;\n}());\nexports.ZipOperator = ZipOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipSubscriber = (function (_super) {\n    __extends(ZipSubscriber, _super);\n    function ZipSubscriber(destination, project, values) {\n        if (values === void 0) { values = Object.create(null); }\n        _super.call(this, destination);\n        this.iterators = [];\n        this.active = 0;\n        this.project = (typeof project === 'function') ? project : null;\n        this.values = values;\n    }\n    ZipSubscriber.prototype._next = function (value) {\n        var iterators = this.iterators;\n        if (isArray_1.isArray(value)) {\n            iterators.push(new StaticArrayIterator(value));\n        }\n        else if (typeof value[iterator_1.iterator] === 'function') {\n            iterators.push(new StaticIterator(value[iterator_1.iterator]()));\n        }\n        else {\n            iterators.push(new ZipBufferIterator(this.destination, this, value));\n        }\n    };\n    ZipSubscriber.prototype._complete = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        if (len === 0) {\n            this.destination.complete();\n            return;\n        }\n        this.active = len;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (iterator.stillUnsubscribed) {\n                this.add(iterator.subscribe(iterator, i));\n            }\n            else {\n                this.active--; // not an observable\n            }\n        }\n    };\n    ZipSubscriber.prototype.notifyInactive = function () {\n        this.active--;\n        if (this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ZipSubscriber.prototype.checkIterators = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        var destination = this.destination;\n        // abort if not all of them have values\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n                return;\n            }\n        }\n        var shouldComplete = false;\n        var args = [];\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            var result = iterator.next();\n            // check to see if it's completed now that you've gotten\n            // the next value.\n            if (iterator.hasCompleted()) {\n                shouldComplete = true;\n            }\n            if (result.done) {\n                destination.complete();\n                return;\n            }\n            args.push(result.value);\n        }\n        if (this.project) {\n            this._tryProject(args);\n        }\n        else {\n            destination.next(args);\n        }\n        if (shouldComplete) {\n            destination.complete();\n        }\n    };\n    ZipSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return ZipSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ZipSubscriber = ZipSubscriber;\nvar StaticIterator = (function () {\n    function StaticIterator(iterator) {\n        this.iterator = iterator;\n        this.nextResult = iterator.next();\n    }\n    StaticIterator.prototype.hasValue = function () {\n        return true;\n    };\n    StaticIterator.prototype.next = function () {\n        var result = this.nextResult;\n        this.nextResult = this.iterator.next();\n        return result;\n    };\n    StaticIterator.prototype.hasCompleted = function () {\n        var nextResult = this.nextResult;\n        return nextResult && nextResult.done;\n    };\n    return StaticIterator;\n}());\nvar StaticArrayIterator = (function () {\n    function StaticArrayIterator(array) {\n        this.array = array;\n        this.index = 0;\n        this.length = 0;\n        this.length = array.length;\n    }\n    StaticArrayIterator.prototype[iterator_1.iterator] = function () {\n        return this;\n    };\n    StaticArrayIterator.prototype.next = function (value) {\n        var i = this.index++;\n        var array = this.array;\n        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n    };\n    StaticArrayIterator.prototype.hasValue = function () {\n        return this.array.length > this.index;\n    };\n    StaticArrayIterator.prototype.hasCompleted = function () {\n        return this.array.length === this.index;\n    };\n    return StaticArrayIterator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipBufferIterator = (function (_super) {\n    __extends(ZipBufferIterator, _super);\n    function ZipBufferIterator(destination, parent, observable) {\n        _super.call(this, destination);\n        this.parent = parent;\n        this.observable = observable;\n        this.stillUnsubscribed = true;\n        this.buffer = [];\n        this.isComplete = false;\n    }\n    ZipBufferIterator.prototype[iterator_1.iterator] = function () {\n        return this;\n    };\n    // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next\n    //    this is legit because `next()` will never be called by a subscription in this case.\n    ZipBufferIterator.prototype.next = function () {\n        var buffer = this.buffer;\n        if (buffer.length === 0 && this.isComplete) {\n            return { value: null, done: true };\n        }\n        else {\n            return { value: buffer.shift(), done: false };\n        }\n    };\n    ZipBufferIterator.prototype.hasValue = function () {\n        return this.buffer.length > 0;\n    };\n    ZipBufferIterator.prototype.hasCompleted = function () {\n        return this.buffer.length === 0 && this.isComplete;\n    };\n    ZipBufferIterator.prototype.notifyComplete = function () {\n        if (this.buffer.length > 0) {\n            this.isComplete = true;\n            this.parent.notifyInactive();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.buffer.push(innerValue);\n        this.parent.checkIterators();\n    };\n    ZipBufferIterator.prototype.subscribe = function (value, index) {\n        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);\n    };\n    return ZipBufferIterator;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=zip.js.map",
+    "\"use strict\";\nvar zip_1 = require('../operators/zip');\nexports.zip = zip_1.zipStatic;\n//# sourceMappingURL=zip.js.map",
+    "\"use strict\";\nvar buffer_1 = require('../operators/buffer');\n/**\n * Buffers the source Observable values until `closingNotifier` emits.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when another Observable emits.</span>\n *\n * <img src=\"./img/buffer.png\" width=\"100%\">\n *\n * Buffers the incoming Observable values until the given `closingNotifier`\n * Observable emits a value, at which point it emits the buffer on the output\n * Observable and starts a new buffer internally, awaiting the next time\n * `closingNotifier` emits.\n *\n * @example <caption>On every click, emit array of most recent interval events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var interval = Rx.Observable.interval(1000);\n * var buffered = interval.buffer(clicks);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link window}\n *\n * @param {Observable<any>} closingNotifier An Observable that signals the\n * buffer to be emitted on the output Observable.\n * @return {Observable<T[]>} An Observable of buffers, which are arrays of\n * values.\n * @method buffer\n * @owner Observable\n */\nfunction buffer(closingNotifier) {\n    return buffer_1.buffer(closingNotifier)(this);\n}\nexports.buffer = buffer;\n//# sourceMappingURL=buffer.js.map",
+    "\"use strict\";\nvar bufferCount_1 = require('../operators/bufferCount');\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.</span>\n *\n * <img src=\"./img/bufferCount.png\" width=\"100%\">\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * @example <caption>Emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2);\n * buffered.subscribe(x => console.log(x));\n *\n * @example <caption>On every click, emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2, 1);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param {number} bufferSize The maximum size of the buffer emitted.\n * @param {number} [startBufferEvery] Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return {Observable<T[]>} An Observable of arrays of buffered values.\n * @method bufferCount\n * @owner Observable\n */\nfunction bufferCount(bufferSize, startBufferEvery) {\n    if (startBufferEvery === void 0) { startBufferEvery = null; }\n    return bufferCount_1.bufferCount(bufferSize, startBufferEvery)(this);\n}\nexports.bufferCount = bufferCount;\n//# sourceMappingURL=bufferCount.js.map",
+    "\"use strict\";\nvar bufferWhen_1 = require('../operators/bufferWhen');\n/**\n * Buffers the source Observable values, using a factory function of closing\n * Observables to determine when to close, emit, and reset the buffer.\n *\n * <span class=\"informal\">Collects values from the past as an array. When it\n * starts collecting values, it calls a function that returns an Observable that\n * tells when to close the buffer and restart collecting.</span>\n *\n * <img src=\"./img/bufferWhen.png\" width=\"100%\">\n *\n * Opens a buffer immediately, then closes the buffer when the observable\n * returned by calling `closingSelector` function emits a value. When it closes\n * the buffer, it immediately opens a new buffer and repeats the process.\n *\n * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferWhen(() =>\n *   Rx.Observable.interval(1000 + Math.random() * 4000)\n * );\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link windowWhen}\n *\n * @param {function(): Observable} closingSelector A function that takes no\n * arguments and returns an Observable that signals buffer closure.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferWhen\n * @owner Observable\n */\nfunction bufferWhen(closingSelector) {\n    return bufferWhen_1.bufferWhen(closingSelector)(this);\n}\nexports.bufferWhen = bufferWhen;\n//# sourceMappingURL=bufferWhen.js.map",
+    "\"use strict\";\nvar catchError_1 = require('../operators/catchError');\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n *\n * <img src=\"./img/catch.png\" width=\"100%\">\n *\n * @example <caption>Continues with a different Observable when there's an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n == 4) {\n * \t     throw 'four!';\n *     }\n *\t   return n;\n *   })\n *   .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, I, II, III, IV, V\n *\n * @example <caption>Retries the caught source Observable again in case of error, similar to retry() operator</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n === 4) {\n * \t     throw 'four!';\n *     }\n * \t   return n;\n *   })\n *   .catch((err, caught) => caught)\n *   .take(30)\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, 1, 2, 3, ...\n *\n * @example <caption>Throws a new error when the source Observable throws an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n *     if (n == 4) {\n *       throw 'four!';\n *     }\n *     return n;\n *   })\n *   .catch(err => {\n *     throw 'error in source. Details: ' + err;\n *   })\n *   .subscribe(\n *     x => console.log(x),\n *     err => console.log(err)\n *   );\n *   // 1, 2, 3, error in source. Details: four!\n *\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n *  is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n *  is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} An observable that originates from either the source or the observable returned by the\n *  catch `selector` function.\n * @method catch\n * @name catch\n * @owner Observable\n */\nfunction _catch(selector) {\n    return catchError_1.catchError(selector)(this);\n}\nexports._catch = _catch;\n//# sourceMappingURL=catch.js.map",
+    "\"use strict\";\nvar combineLatest_1 = require('../operators/combineLatest');\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return combineLatest_1.combineLatest.apply(void 0, observables)(this);\n}\nexports.combineLatest = combineLatest;\n//# sourceMappingURL=combineLatest.js.map",
+    "\"use strict\";\nvar concat_1 = require('../operators/concat');\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from every\n * given input Observable after the current Observable.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * Joins this Observable with multiple other Observables by subscribing to them\n * one at a time, starting with the source, and merging their results into the\n * output Observable. Will wait for each Observable to complete before moving\n * on to the next.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = timer.concat(sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n * @example <caption>Concatenate 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = timer1.concat(timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} other An input Observable to concatenate after the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @method concat\n * @owner Observable\n */\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return concat_1.concat.apply(void 0, observables)(this);\n}\nexports.concat = concat;\n//# sourceMappingURL=concat.js.map",
+    "\"use strict\";\nvar async_1 = require('../scheduler/async');\nvar debounceTime_1 = require('../operators/debounceTime');\n/**\n * Emits a value from the source Observable only after a particular time span\n * has passed without another source emission.\n *\n * <span class=\"informal\">It's like {@link delay}, but passes only the most\n * recent value from each burst of emissions.</span>\n *\n * <img src=\"./img/debounceTime.png\" width=\"100%\">\n *\n * `debounceTime` delays values emitted by the source Observable, but drops\n * previous pending delayed emissions if a new value arrives on the source\n * Observable. This operator keeps track of the most recent value from the\n * source Observable, and emits that only when `dueTime` enough time has passed\n * without any other value appearing on the source Observable. If a new value\n * appears before `dueTime` silence occurs, the previous value will be dropped\n * and will not be emitted on the output Observable.\n *\n * This is a rate-limiting operator, because it is impossible for more than one\n * value to be emitted in any time window of duration `dueTime`, but it is also\n * a delay-like operator since output emissions do not occur at the same time as\n * they did on the source Observable. Optionally takes a {@link IScheduler} for\n * managing timers.\n *\n * @example <caption>Emit the most recent click after a burst of clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.debounceTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounce}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttleTime}\n *\n * @param {number} dueTime The timeout duration in milliseconds (or the time\n * unit determined internally by the optional `scheduler`) for the window of\n * time required to wait for emission silence before emitting the most recent\n * source value.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the timeout for each value.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified `dueTime`, and may drop some values if they occur\n * too frequently.\n * @method debounceTime\n * @owner Observable\n */\nfunction debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    return debounceTime_1.debounceTime(dueTime, scheduler)(this);\n}\nexports.debounceTime = debounceTime;\n//# sourceMappingURL=debounceTime.js.map",
+    "\"use strict\";\nvar async_1 = require('../scheduler/async');\nvar delay_1 = require('../operators/delay');\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * <span class=\"informal\">Time shifts each item by some specified amount of\n * milliseconds.</span>\n *\n * <img src=\"./img/delay.png\" width=\"100%\">\n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example <caption>Delay each click by one second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example <caption>Delay all clicks until a future date happens</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nfunction delay(delay, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    return delay_1.delay(delay, scheduler)(this);\n}\nexports.delay = delay;\n//# sourceMappingURL=delay.js.map",
+    "\"use strict\";\nvar distinct_1 = require('../operators/distinct');\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.\n *\n * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will\n * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the\n * source observable directly with an equality check against previous values.\n *\n * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.\n *\n * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the\n * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`\n * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so\n * that the internal `Set` can be \"flushed\", basically clearing it of values.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)\n *   .distinct()\n *   .subscribe(x => console.log(x)); // 1, 2, 3, 4\n *\n * @example <caption>An example using a keySelector function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     .distinct((p: Person) => p.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n *\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [keySelector] Optional function to select which value you want to check as distinct.\n * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinct\n * @owner Observable\n */\nfunction distinct(keySelector, flushes) {\n    return distinct_1.distinct(keySelector, flushes)(this);\n}\nexports.distinct = distinct;\n//# sourceMappingURL=distinct.js.map",
+    "\"use strict\";\nvar distinctUntilChanged_1 = require('../operators/distinctUntilChanged');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n *\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n *\n * If a comparator function is not provided, an equality check is used by default.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)\n *   .distinctUntilChanged()\n *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4\n *\n * @example <caption>An example using a compare function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     { age: 6, name: 'Foo'})\n *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n * // { age: 5, name: 'Foo' }\n *\n * @see {@link distinct}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nfunction distinctUntilChanged(compare, keySelector) {\n    return distinctUntilChanged_1.distinctUntilChanged(compare, keySelector)(this);\n}\nexports.distinctUntilChanged = distinctUntilChanged;\n//# sourceMappingURL=distinctUntilChanged.js.map",
+    "\"use strict\";\nvar tap_1 = require('../operators/tap');\n/* tslint:enable:max-line-length */\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * <span class=\"informal\">Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source as long as errors don't occur.</span>\n *\n * <img src=\"./img/do.png\" width=\"100%\">\n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n *   .do(ev => console.log(ev))\n *   .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @method do\n * @name do\n * @owner Observable\n */\nfunction _do(nextOrObserver, error, complete) {\n    return tap_1.tap(nextOrObserver, error, complete)(this);\n}\nexports._do = _do;\n//# sourceMappingURL=do.js.map",
+    "\"use strict\";\nvar expand_1 = require('../operators/expand');\n/* tslint:enable:max-line-length */\n/**\n * Recursively projects each source value to an Observable which is merged in\n * the output Observable.\n *\n * <span class=\"informal\">It's similar to {@link mergeMap}, but applies the\n * projection function to every source value as well as every output value.\n * It's recursive.</span>\n *\n * <img src=\"./img/expand.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger. *Expand* will re-emit on the output\n * Observable every source value. Then, each output value is given to the\n * `project` function which returns an inner Observable to be merged on the\n * output Observable. Those output values resulting from the projection are also\n * given to the `project` function to produce new output values. This is how\n * *expand* behaves recursively.\n *\n * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var powersOfTwo = clicks\n *   .mapTo(1)\n *   .expand(x => Rx.Observable.of(2 * x).delay(1000))\n *   .take(10);\n * powersOfTwo.subscribe(x => console.log(x));\n *\n * @see {@link mergeMap}\n * @see {@link mergeScan}\n *\n * @param {function(value: T, index: number) => Observable} project A function\n * that, when applied to an item emitted by the source or the output Observable,\n * returns an Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to\n * each projected inner Observable.\n * @return {Observable} An Observable that emits the source values and also\n * result of applying the projection function to each value emitted on the\n * output Observable and and merging the results of the Observables obtained\n * from this transformation.\n * @method expand\n * @owner Observable\n */\nfunction expand(project, concurrent, scheduler) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (scheduler === void 0) { scheduler = undefined; }\n    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n    return expand_1.expand(project, concurrent, scheduler)(this);\n}\nexports.expand = expand;\n//# sourceMappingURL=expand.js.map",
+    "\"use strict\";\nvar filter_1 = require('../operators/filter');\n/* tslint:enable:max-line-length */\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * <span class=\"informal\">Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.</span>\n *\n * <img src=\"./img/filter.png\" width=\"100%\">\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example <caption>Emit only click events whose target was a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nfunction filter(predicate, thisArg) {\n    return filter_1.filter(predicate, thisArg)(this);\n}\nexports.filter = filter;\n//# sourceMappingURL=filter.js.map",
+    "\"use strict\";\nvar finalize_1 = require('../operators/finalize');\n/**\n * Returns an Observable that mirrors the source Observable, but will call a specified function when\n * the source terminates on complete or error.\n * @param {function} callback Function to be called when source terminates.\n * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.\n * @method finally\n * @owner Observable\n */\nfunction _finally(callback) {\n    return finalize_1.finalize(callback)(this);\n}\nexports._finally = _finally;\n//# sourceMappingURL=finally.js.map",
+    "\"use strict\";\nvar first_1 = require('../operators/first');\n/**\n * Emits only the first value (or the first value that meets some condition)\n * emitted by the source Observable.\n *\n * <span class=\"informal\">Emits only the first value. Or emits only the first\n * value that passes some test.</span>\n *\n * <img src=\"./img/first.png\" width=\"100%\">\n *\n * If called with no arguments, `first` emits the first value of the source\n * Observable, then completes. If called with a `predicate` function, `first`\n * emits the first value of the source that matches the specified condition. It\n * may also take a `resultSelector` function to produce the output value from\n * the input value, and a `defaultValue` to emit in case the source completes\n * before it is able to emit a valid value. Throws an error if `defaultValue`\n * was not provided and a matching element is not found.\n *\n * @example <caption>Emit only the first click that happens on the DOM</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Emits the first click that happens on a DIV</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link take}\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]\n * An optional function called with each item to test for condition matching.\n * @param {function(value: T, index: number): R} [resultSelector] A function to\n * produce the value on the output Observable based on the values\n * and the indices of the source Observable. The arguments passed to this\n * function are:\n * - `value`: the value that was emitted on the source.\n * - `index`: the \"index\" of the value from the source.\n * @param {R} [defaultValue] The default value emitted in case no valid value\n * was found on the source.\n * @return {Observable<T|R>} An Observable of the first item that matches the\n * condition.\n * @method first\n * @owner Observable\n */\nfunction first(predicate, resultSelector, defaultValue) {\n    return first_1.first(predicate, resultSelector, defaultValue)(this);\n}\nexports.first = first;\n//# sourceMappingURL=first.js.map",
+    "\"use strict\";\nvar last_1 = require('../operators/last');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits only the last item emitted by the source Observable.\n * It optionally takes a predicate function as a parameter, in which case, rather than emitting\n * the last item from the source Observable, the resulting Observable will emit the last item\n * from the source Observable that satisfies the predicate.\n *\n * <img src=\"./img/last.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {function} predicate - The condition any source emitted item has to satisfy.\n * @return {Observable} An Observable that emits only the last item satisfying the given condition\n * from the source, or an NoSuchElementException if no such items are emitted.\n * @throws - Throws if no items that match the predicate are emitted by the source Observable.\n * @method last\n * @owner Observable\n */\nfunction last(predicate, resultSelector, defaultValue) {\n    return last_1.last(predicate, resultSelector, defaultValue)(this);\n}\nexports.last = last;\n//# sourceMappingURL=last.js.map",
+    "\"use strict\";\nvar map_1 = require('../operators/map');\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * <span class=\"informal\">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.</span>\n *\n * <img src=\"./img/map.png\" width=\"100%\">\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example <caption>Map every click to the clientX position of that click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable<R>} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nfunction map(project, thisArg) {\n    return map_1.map(project, thisArg)(this);\n}\nexports.map = map;\n//# sourceMappingURL=map.js.map",
+    "\"use strict\";\nvar merge_1 = require('../operators/merge');\nvar merge_2 = require('../operators/merge');\nexports.mergeStatic = merge_2.mergeStatic;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (either the source or an\n * Observable given as argument), and simply forwards (without doing any\n * transformation) all the values from all the input Observables to the output\n * Observable. The output Observable only completes once all input Observables\n * have completed. Any error delivered by an input Observable will be immediately\n * emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = clicks.merge(timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = timer1.merge(timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {ObservableInput} other An input Observable to merge with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} An Observable that emits items that are the result of\n * every input Observable.\n * @method merge\n * @owner Observable\n */\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return merge_1.merge.apply(void 0, observables)(this);\n}\nexports.merge = merge;\n//# sourceMappingURL=merge.js.map",
+    "\"use strict\";\nvar mergeAll_1 = require('../operators/mergeAll');\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables.</span>\n *\n * <img src=\"./img/mergeAll.png\" width=\"100%\">\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var firstOrder = higherOrder.mergeAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));\n * var firstOrder = higherOrder.mergeAll(2);\n * firstOrder.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nfunction mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return mergeAll_1.mergeAll(concurrent)(this);\n}\nexports.mergeAll = mergeAll;\n//# sourceMappingURL=mergeAll.js.map",
+    "\"use strict\";\nvar mergeMap_1 = require('../operators/mergeMap');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.</span>\n *\n * <img src=\"./img/mergeMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n *   Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nfunction mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return mergeMap_1.mergeMap(project, resultSelector, concurrent)(this);\n}\nexports.mergeMap = mergeMap;\n//# sourceMappingURL=mergeMap.js.map",
+    "\"use strict\";\nvar pairwise_1 = require('../operators/pairwise');\n/**\n * Groups pairs of consecutive emissions together and emits them as an array of\n * two values.\n *\n * <span class=\"informal\">Puts the current value and previous value together as\n * an array, and emits that.</span>\n *\n * <img src=\"./img/pairwise.png\" width=\"100%\">\n *\n * The Nth emission from the source Observable will cause the output Observable\n * to emit an array [(N-1)th, Nth] of the previous and the current value, as a\n * pair. For this reason, `pairwise` emits on the second and subsequent\n * emissions from the source Observable, but not on the first emission, because\n * there is no previous value in that case.\n *\n * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var pairs = clicks.pairwise();\n * var distance = pairs.map(pair => {\n *   var x0 = pair[0].clientX;\n *   var y0 = pair[0].clientY;\n *   var x1 = pair[1].clientX;\n *   var y1 = pair[1].clientY;\n *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));\n * });\n * distance.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n *\n * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of\n * consecutive values from the source Observable.\n * @method pairwise\n * @owner Observable\n */\nfunction pairwise() {\n    return pairwise_1.pairwise()(this);\n}\nexports.pairwise = pairwise;\n//# sourceMappingURL=pairwise.js.map",
+    "\"use strict\";\nvar pluck_1 = require('../operators/pluck');\n/**\n * Maps each source value (an object) to its specified nested property.\n *\n * <span class=\"informal\">Like {@link map}, but meant only for picking one of\n * the nested properties of every emitted object.</span>\n *\n * <img src=\"./img/pluck.png\" width=\"100%\">\n *\n * Given a list of strings describing a path to an object property, retrieves\n * the value of a specified nested property from all values in the source\n * Observable. If a property can't be resolved, it will return `undefined` for\n * that value.\n *\n * @example <caption>Map every click to the tagName of the clicked target element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var tagNames = clicks.pluck('target', 'tagName');\n * tagNames.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {...string} properties The nested properties to pluck from each source\n * value (an object).\n * @return {Observable} A new Observable of property values from the source values.\n * @method pluck\n * @owner Observable\n */\nfunction pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i - 0] = arguments[_i];\n    }\n    return pluck_1.pluck.apply(void 0, properties)(this);\n}\nexports.pluck = pluck;\n//# sourceMappingURL=pluck.js.map",
+    "\"use strict\";\nvar publish_1 = require('../operators/publish');\n/* tslint:enable:max-line-length */\n/**\n * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called\n * before it begins emitting items to those Observers that have subscribed to it.\n *\n * <img src=\"./img/publish.png\" width=\"100%\">\n *\n * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times\n * as needed, without causing multiple subscriptions to the source sequence.\n * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.\n * @method publish\n * @owner Observable\n */\nfunction publish(selector) {\n    return publish_1.publish(selector)(this);\n}\nexports.publish = publish;\n//# sourceMappingURL=publish.js.map",
+    "\"use strict\";\nvar publishReplay_1 = require('../operators/publishReplay');\n/* tslint:enable:max-line-length */\n/**\n * @param bufferSize\n * @param windowTime\n * @param selectorOrScheduler\n * @param scheduler\n * @return {Observable<T> | ConnectableObservable<T>}\n * @method publishReplay\n * @owner Observable\n */\nfunction publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {\n    return publishReplay_1.publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler)(this);\n}\nexports.publishReplay = publishReplay;\n//# sourceMappingURL=publishReplay.js.map",
+    "\"use strict\";\nvar retry_1 = require('../operators/retry');\n/**\n * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable\n * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given\n * as a number parameter) rather than propagating the `error` call.\n *\n * <img src=\"./img/retry.png\" width=\"100%\">\n *\n * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted\n * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second\n * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications\n * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].\n * @param {number} count - Number of retry attempts before failing.\n * @return {Observable} The source Observable modified with the retry logic.\n * @method retry\n * @owner Observable\n */\nfunction retry(count) {\n    if (count === void 0) { count = -1; }\n    return retry_1.retry(count)(this);\n}\nexports.retry = retry;\n//# sourceMappingURL=retry.js.map",
+    "\"use strict\";\nvar sample_1 = require('../operators/sample');\n/**\n * Emits the most recently emitted value from the source Observable whenever\n * another Observable, the `notifier`, emits.\n *\n * <span class=\"informal\">It's like {@link sampleTime}, but samples whenever\n * the `notifier` Observable emits something.</span>\n *\n * <img src=\"./img/sample.png\" width=\"100%\">\n *\n * Whenever the `notifier` Observable emits a value or completes, `sample`\n * looks at the source Observable and emits whichever value it has most recently\n * emitted since the previous sampling, unless the source has not emitted\n * anything since the previous sampling. The `notifier` is subscribed to as soon\n * as the output Observable is subscribed.\n *\n * @example <caption>On every click, sample the most recent \"seconds\" timer</caption>\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = seconds.sample(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {Observable<any>} notifier The Observable to use for sampling the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the results of sampling the\n * values emitted by the source Observable whenever the notifier Observable\n * emits value or completes.\n * @method sample\n * @owner Observable\n */\nfunction sample(notifier) {\n    return sample_1.sample(notifier)(this);\n}\nexports.sample = sample;\n//# sourceMappingURL=sample.js.map",
+    "\"use strict\";\nvar scan_1 = require('../operators/scan');\n/* tslint:enable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns each\n * intermediate result, with an optional seed value.\n *\n * <span class=\"informal\">It's like {@link reduce}, but emits the current\n * accumulation whenever the source emits a value.</span>\n *\n * <img src=\"./img/scan.png\" width=\"100%\">\n *\n * Combines together all values emitted on the source, using an accumulator\n * function that knows how to join a new source value into the accumulation from\n * the past. Is similar to {@link reduce}, but emits the intermediate\n * accumulations.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var ones = clicks.mapTo(1);\n * var seed = 0;\n * var count = ones.scan((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link reduce}\n *\n * @param {function(acc: R, value: T, index: number): R} accumulator\n * The accumulator function called on each source value.\n * @param {T|R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @method scan\n * @owner Observable\n */\nfunction scan(accumulator, seed) {\n    if (arguments.length >= 2) {\n        return scan_1.scan(accumulator, seed)(this);\n    }\n    return scan_1.scan(accumulator)(this);\n}\nexports.scan = scan;\n//# sourceMappingURL=scan.js.map",
+    "\"use strict\";\nvar share_1 = require('../operators/share');\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n *\n * This behaves similarly to .publish().refCount(), with a behavior difference when the source observable emits complete.\n * .publish().refCount() will not resubscribe to the original source, however .share() will resubscribe to the original source.\n * Observable.of(\"test\").publish().refCount() will not re-emit \"test\" on new subscriptions, Observable.of(\"test\").share() will\n * re-emit \"test\" to new subscriptions.\n *\n * <img src=\"./img/share.png\" width=\"100%\">\n *\n * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.\n * @method share\n * @owner Observable\n */\nfunction share() {\n    return share_1.share()(this);\n}\nexports.share = share;\n;\n//# sourceMappingURL=share.js.map",
+    "\"use strict\";\nvar skip_1 = require('../operators/skip');\n/**\n * Returns an Observable that skips the first `count` items emitted by the source Observable.\n *\n * <img src=\"./img/skip.png\" width=\"100%\">\n *\n * @param {Number} count - The number of times, items emitted by source Observable should be skipped.\n * @return {Observable} An Observable that skips values emitted by the source Observable.\n *\n * @method skip\n * @owner Observable\n */\nfunction skip(count) {\n    return skip_1.skip(count)(this);\n}\nexports.skip = skip;\n//# sourceMappingURL=skip.js.map",
+    "\"use strict\";\nvar skipUntil_1 = require('../operators/skipUntil');\n/**\n * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.\n *\n * <img src=\"./img/skipUntil.png\" width=\"100%\">\n *\n * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to\n * be mirrored by the resulting Observable.\n * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits\n * an item, then emits the remaining items.\n * @method skipUntil\n * @owner Observable\n */\nfunction skipUntil(notifier) {\n    return skipUntil_1.skipUntil(notifier)(this);\n}\nexports.skipUntil = skipUntil;\n//# sourceMappingURL=skipUntil.js.map",
+    "\"use strict\";\nvar skipWhile_1 = require('../operators/skipWhile');\n/**\n * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds\n * true, but emits all further source items as soon as the condition becomes false.\n *\n * <img src=\"./img/skipWhile.png\" width=\"100%\">\n *\n * @param {Function} predicate - A function to test each item emitted from the source Observable.\n * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the\n * specified predicate becomes false.\n * @method skipWhile\n * @owner Observable\n */\nfunction skipWhile(predicate) {\n    return skipWhile_1.skipWhile(predicate)(this);\n}\nexports.skipWhile = skipWhile;\n//# sourceMappingURL=skipWhile.js.map",
+    "\"use strict\";\nvar startWith_1 = require('../operators/startWith');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits the items you specify as arguments before it begins to emit\n * items emitted by the source Observable.\n *\n * <img src=\"./img/startWith.png\" width=\"100%\">\n *\n * @param {...T} values - Items you want the modified Observable to emit first.\n * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling\n * the emissions of the `next` notifications.\n * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items\n * emitted by the source Observable.\n * @method startWith\n * @owner Observable\n */\nfunction startWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i - 0] = arguments[_i];\n    }\n    return startWith_1.startWith.apply(void 0, array)(this);\n}\nexports.startWith = startWith;\n//# sourceMappingURL=startWith.js.map",
+    "\"use strict\";\nvar switchMap_1 = require('../operators/switchMap');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, emitting values only from the most recently projected Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link switch}.</span>\n *\n * <img src=\"./img/switchMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each time it observes one of these\n * inner Observables, the output Observable begins emitting the items emitted by\n * that inner Observable. When a new inner Observable is emitted, `switchMap`\n * stops emitting items from the earlier-emitted inner Observable and begins\n * emitting items from the new one. It continues to behave like this for\n * subsequent inner Observables.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switch}\n * @see {@link switchMapTo}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking only the values from the most recently\n * projected inner Observable.\n * @method switchMap\n * @owner Observable\n */\nfunction switchMap(project, resultSelector) {\n    return switchMap_1.switchMap(project, resultSelector)(this);\n}\nexports.switchMap = switchMap;\n//# sourceMappingURL=switchMap.js.map",
+    "\"use strict\";\nvar take_1 = require('../operators/take');\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Takes the first `count` values from the source, then\n * completes.</span>\n *\n * <img src=\"./img/take.png\" width=\"100%\">\n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable<T>} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nfunction take(count) {\n    return take_1.take(count)(this);\n}\nexports.take = take;\n//# sourceMappingURL=take.js.map",
+    "\"use strict\";\nvar takeUntil_1 = require('../operators/takeUntil');\n/**\n * Emits the values emitted by the source Observable until a `notifier`\n * Observable emits a value.\n *\n * <span class=\"informal\">Lets values pass until a second Observable,\n * `notifier`, emits something. Then, it completes.</span>\n *\n * <img src=\"./img/takeUntil.png\" width=\"100%\">\n *\n * `takeUntil` subscribes and begins mirroring the source Observable. It also\n * monitors a second Observable, `notifier` that you provide. If the `notifier`\n * emits a value, the output Observable stops mirroring the source Observable\n * and completes.\n *\n * @example <caption>Tick every second until the first click happens</caption>\n * var interval = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = interval.takeUntil(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @param {Observable} notifier The Observable whose first emitted value will\n * cause the output Observable of `takeUntil` to stop emitting values from the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable until such time as `notifier` emits its first value.\n * @method takeUntil\n * @owner Observable\n */\nfunction takeUntil(notifier) {\n    return takeUntil_1.takeUntil(notifier)(this);\n}\nexports.takeUntil = takeUntil;\n//# sourceMappingURL=takeUntil.js.map",
+    "\"use strict\";\nvar takeWhile_1 = require('../operators/takeWhile');\n/**\n * Emits values emitted by the source Observable so long as each value satisfies\n * the given `predicate`, and then completes as soon as this `predicate` is not\n * satisfied.\n *\n * <span class=\"informal\">Takes values from the source only while they pass the\n * condition given. When the first value does not satisfy, it completes.</span>\n *\n * <img src=\"./img/takeWhile.png\" width=\"100%\">\n *\n * `takeWhile` subscribes and begins mirroring the source Observable. Each value\n * emitted on the source is given to the `predicate` function which returns a\n * boolean, representing a condition to be satisfied by the source values. The\n * output Observable emits the source values until such time as the `predicate`\n * returns false, at which point `takeWhile` stops mirroring the source\n * Observable and completes the output Observable.\n *\n * @example <caption>Emit click events only while the clientX property is greater than 200</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.takeWhile(ev => ev.clientX > 200);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates a value emitted by the source Observable and returns a boolean.\n * Also takes the (zero-based) index as the second argument.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable so long as each value satisfies the condition defined by the\n * `predicate`, then completes.\n * @method takeWhile\n * @owner Observable\n */\nfunction takeWhile(predicate) {\n    return takeWhile_1.takeWhile(predicate)(this);\n}\nexports.takeWhile = takeWhile;\n//# sourceMappingURL=takeWhile.js.map",
+    "\"use strict\";\nvar async_1 = require('../scheduler/async');\nvar throttle_1 = require('../operators/throttle');\nvar throttleTime_1 = require('../operators/throttleTime');\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for `duration` milliseconds, then repeats this process.\n *\n * <span class=\"informal\">Lets a value pass, then ignores source values for the\n * next `duration` milliseconds.</span>\n *\n * <img src=\"./img/throttleTime.png\" width=\"100%\">\n *\n * `throttleTime` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled. After `duration` milliseconds (or the time unit determined\n * internally by the optional `scheduler`) has passed, the timer is disabled,\n * and this process repeats for the next source value. Optionally takes a\n * {@link IScheduler} for managing timers.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttleTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {number} duration Time to wait before emitting another value after\n * emitting the last value, measured in milliseconds or the time unit determined\n * internally by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the throttling.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttleTime\n * @owner Observable\n */\nfunction throttleTime(duration, scheduler, config) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }\n    return throttleTime_1.throttleTime(duration, scheduler, config)(this);\n}\nexports.throttleTime = throttleTime;\n//# sourceMappingURL=throttleTime.js.map",
+    "\"use strict\";\nvar async_1 = require('../scheduler/async');\nvar timeout_1 = require('../operators/timeout');\n/**\n *\n * Errors if Observable does not emit a value in given time span.\n *\n * <span class=\"informal\">Timeouts on Observable that doesn't emit values fast enough.</span>\n *\n * <img src=\"./img/timeout.png\" width=\"100%\">\n *\n * `timeout` operator accepts as an argument either a number or a Date.\n *\n * If number was provided, it returns an Observable that behaves like a source\n * Observable, unless there is a period of time where there is no value emitted.\n * So if you provide `100` as argument and first value comes after 50ms from\n * the moment of subscription, this value will be simply re-emitted by the resulting\n * Observable. If however after that 100ms passes without a second value being emitted,\n * stream will end with an error and source Observable will be unsubscribed.\n * These checks are performed throughout whole lifecycle of Observable - from the moment\n * it was subscribed to, until it completes or errors itself. Thus every value must be\n * emitted within specified period since previous value.\n *\n * If provided argument was Date, returned Observable behaves differently. It throws\n * if Observable did not complete before provided Date. This means that periods between\n * emission of particular values do not matter in this case. If Observable did not complete\n * before provided Date, source Observable will be unsubscribed. Other than that, resulting\n * stream behaves just as source Observable.\n *\n * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)\n * when returned Observable will check if source stream emitted value or completed.\n *\n * @example <caption>Check if ticks are emitted within certain timespan</caption>\n * const seconds = Rx.Observable.interval(1000);\n *\n * seconds.timeout(1100) // Let's use bigger timespan to be safe,\n *                       // since `interval` might fire a bit later then scheduled.\n * .subscribe(\n *     value => console.log(value), // Will emit numbers just as regular `interval` would.\n *     err => console.log(err) // Will never be called.\n * );\n *\n * seconds.timeout(900).subscribe(\n *     value => console.log(value), // Will never be called.\n *     err => console.log(err) // Will emit error before even first value is emitted,\n *                             // since it did not arrive within 900ms period.\n * );\n *\n * @example <caption>Use Date to check if Observable completed</caption>\n * const seconds = Rx.Observable.interval(1000);\n *\n * seconds.timeout(new Date(\"December 17, 2020 03:24:00\"))\n * .subscribe(\n *     value => console.log(value), // Will emit values as regular `interval` would\n *                                  // until December 17, 2020 at 03:24:00.\n *     err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error,\n *                             // since Observable did not complete by then.\n * );\n *\n * @see {@link timeoutWith}\n *\n * @param {number|Date} due Number specifying period within which Observable must emit values\n *                          or Date specifying before when Observable should complete\n * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur.\n * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.\n * @method timeout\n * @owner Observable\n */\nfunction timeout(due, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    return timeout_1.timeout(due, scheduler)(this);\n}\nexports.timeout = timeout;\n//# sourceMappingURL=timeout.js.map",
+    "\"use strict\";\nvar withLatestFrom_1 = require('../operators/withLatestFrom');\n/* tslint:enable:max-line-length */\n/**\n * Combines the source Observable with other Observables to create an Observable\n * whose values are calculated from the latest values of each, only when the\n * source emits.\n *\n * <span class=\"informal\">Whenever the source Observable emits a value, it\n * computes a formula using that value plus the latest values from other input\n * Observables, then emits the output of that formula.</span>\n *\n * <img src=\"./img/withLatestFrom.png\" width=\"100%\">\n *\n * `withLatestFrom` combines each value from the source Observable (the\n * instance) with the latest values from the other input Observables only when\n * the source emits a value, optionally using a `project` function to determine\n * the value to be emitted on the output Observable. All input Observables must\n * emit at least one value before the output Observable will emit a value.\n *\n * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var result = clicks.withLatestFrom(timer);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Function} [project] Projection function for combining values\n * together. Receives all values in order of the Observables passed, where the\n * first parameter is a value from the source Observable. (e.g.\n * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not\n * passed, arrays will be emitted on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method withLatestFrom\n * @owner Observable\n */\nfunction withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i - 0] = arguments[_i];\n    }\n    return withLatestFrom_1.withLatestFrom.apply(void 0, args)(this);\n}\nexports.withLatestFrom = withLatestFrom;\n//# sourceMappingURL=withLatestFrom.js.map",
+    "\"use strict\";\nvar zip_1 = require('../operators/zip');\n/* tslint:enable:max-line-length */\n/**\n * @param observables\n * @return {Observable<R>}\n * @method zip\n * @owner Observable\n */\nfunction zipProto() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return zip_1.zip.apply(void 0, observables)(this);\n}\nexports.zipProto = zipProto;\n//# sourceMappingURL=zip.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Buffers the source Observable values until `closingNotifier` emits.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when another Observable emits.</span>\n *\n * <img src=\"./img/buffer.png\" width=\"100%\">\n *\n * Buffers the incoming Observable values until the given `closingNotifier`\n * Observable emits a value, at which point it emits the buffer on the output\n * Observable and starts a new buffer internally, awaiting the next time\n * `closingNotifier` emits.\n *\n * @example <caption>On every click, emit array of most recent interval events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var interval = Rx.Observable.interval(1000);\n * var buffered = interval.buffer(clicks);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link window}\n *\n * @param {Observable<any>} closingNotifier An Observable that signals the\n * buffer to be emitted on the output Observable.\n * @return {Observable<T[]>} An Observable of buffers, which are arrays of\n * values.\n * @method buffer\n * @owner Observable\n */\nfunction buffer(closingNotifier) {\n    return function bufferOperatorFunction(source) {\n        return source.lift(new BufferOperator(closingNotifier));\n    };\n}\nexports.buffer = buffer;\nvar BufferOperator = (function () {\n    function BufferOperator(closingNotifier) {\n        this.closingNotifier = closingNotifier;\n    }\n    BufferOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));\n    };\n    return BufferOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferSubscriber = (function (_super) {\n    __extends(BufferSubscriber, _super);\n    function BufferSubscriber(destination, closingNotifier) {\n        _super.call(this, destination);\n        this.buffer = [];\n        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n    }\n    BufferSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var buffer = this.buffer;\n        this.buffer = [];\n        this.destination.next(buffer);\n    };\n    return BufferSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=buffer.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.</span>\n *\n * <img src=\"./img/bufferCount.png\" width=\"100%\">\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * @example <caption>Emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2);\n * buffered.subscribe(x => console.log(x));\n *\n * @example <caption>On every click, emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2, 1);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param {number} bufferSize The maximum size of the buffer emitted.\n * @param {number} [startBufferEvery] Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return {Observable<T[]>} An Observable of arrays of buffered values.\n * @method bufferCount\n * @owner Observable\n */\nfunction bufferCount(bufferSize, startBufferEvery) {\n    if (startBufferEvery === void 0) { startBufferEvery = null; }\n    return function bufferCountOperatorFunction(source) {\n        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n    };\n}\nexports.bufferCount = bufferCount;\nvar BufferCountOperator = (function () {\n    function BufferCountOperator(bufferSize, startBufferEvery) {\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        if (!startBufferEvery || bufferSize === startBufferEvery) {\n            this.subscriberClass = BufferCountSubscriber;\n        }\n        else {\n            this.subscriberClass = BufferSkipCountSubscriber;\n        }\n    }\n    BufferCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));\n    };\n    return BufferCountOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferCountSubscriber = (function (_super) {\n    __extends(BufferCountSubscriber, _super);\n    function BufferCountSubscriber(destination, bufferSize) {\n        _super.call(this, destination);\n        this.bufferSize = bufferSize;\n        this.buffer = [];\n    }\n    BufferCountSubscriber.prototype._next = function (value) {\n        var buffer = this.buffer;\n        buffer.push(value);\n        if (buffer.length == this.bufferSize) {\n            this.destination.next(buffer);\n            this.buffer = [];\n        }\n    };\n    BufferCountSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer.length > 0) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferCountSubscriber;\n}(Subscriber_1.Subscriber));\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferSkipCountSubscriber = (function (_super) {\n    __extends(BufferSkipCountSubscriber, _super);\n    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {\n        _super.call(this, destination);\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        this.buffers = [];\n        this.count = 0;\n    }\n    BufferSkipCountSubscriber.prototype._next = function (value) {\n        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;\n        this.count++;\n        if (count % startBufferEvery === 0) {\n            buffers.push([]);\n        }\n        for (var i = buffers.length; i--;) {\n            var buffer = buffers[i];\n            buffer.push(value);\n            if (buffer.length === bufferSize) {\n                buffers.splice(i, 1);\n                this.destination.next(buffer);\n            }\n        }\n    };\n    BufferSkipCountSubscriber.prototype._complete = function () {\n        var _a = this, buffers = _a.buffers, destination = _a.destination;\n        while (buffers.length > 0) {\n            var buffer = buffers.shift();\n            if (buffer.length > 0) {\n                destination.next(buffer);\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferSkipCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=bufferCount.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('../Subscription');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Buffers the source Observable values, using a factory function of closing\n * Observables to determine when to close, emit, and reset the buffer.\n *\n * <span class=\"informal\">Collects values from the past as an array. When it\n * starts collecting values, it calls a function that returns an Observable that\n * tells when to close the buffer and restart collecting.</span>\n *\n * <img src=\"./img/bufferWhen.png\" width=\"100%\">\n *\n * Opens a buffer immediately, then closes the buffer when the observable\n * returned by calling `closingSelector` function emits a value. When it closes\n * the buffer, it immediately opens a new buffer and repeats the process.\n *\n * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferWhen(() =>\n *   Rx.Observable.interval(1000 + Math.random() * 4000)\n * );\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link windowWhen}\n *\n * @param {function(): Observable} closingSelector A function that takes no\n * arguments and returns an Observable that signals buffer closure.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferWhen\n * @owner Observable\n */\nfunction bufferWhen(closingSelector) {\n    return function (source) {\n        return source.lift(new BufferWhenOperator(closingSelector));\n    };\n}\nexports.bufferWhen = bufferWhen;\nvar BufferWhenOperator = (function () {\n    function BufferWhenOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    BufferWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));\n    };\n    return BufferWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferWhenSubscriber = (function (_super) {\n    __extends(BufferWhenSubscriber, _super);\n    function BufferWhenSubscriber(destination, closingSelector) {\n        _super.call(this, destination);\n        this.closingSelector = closingSelector;\n        this.subscribing = false;\n        this.openBuffer();\n    }\n    BufferWhenSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferWhenSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferWhenSubscriber.prototype._unsubscribe = function () {\n        this.buffer = null;\n        this.subscribing = false;\n    };\n    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openBuffer();\n    };\n    BufferWhenSubscriber.prototype.notifyComplete = function () {\n        if (this.subscribing) {\n            this.complete();\n        }\n        else {\n            this.openBuffer();\n        }\n    };\n    BufferWhenSubscriber.prototype.openBuffer = function () {\n        var closingSubscription = this.closingSubscription;\n        if (closingSubscription) {\n            this.remove(closingSubscription);\n            closingSubscription.unsubscribe();\n        }\n        var buffer = this.buffer;\n        if (this.buffer) {\n            this.destination.next(buffer);\n        }\n        this.buffer = [];\n        var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();\n        if (closingNotifier === errorObject_1.errorObject) {\n            this.error(errorObject_1.errorObject.e);\n        }\n        else {\n            closingSubscription = new Subscription_1.Subscription();\n            this.closingSubscription = closingSubscription;\n            this.add(closingSubscription);\n            this.subscribing = true;\n            closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n            this.subscribing = false;\n        }\n    };\n    return BufferWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=bufferWhen.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n *\n * <img src=\"./img/catch.png\" width=\"100%\">\n *\n * @example <caption>Continues with a different Observable when there's an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n == 4) {\n * \t     throw 'four!';\n *     }\n *\t   return n;\n *   })\n *   .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, I, II, III, IV, V\n *\n * @example <caption>Retries the caught source Observable again in case of error, similar to retry() operator</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n * \t   if (n === 4) {\n * \t     throw 'four!';\n *     }\n * \t   return n;\n *   })\n *   .catch((err, caught) => caught)\n *   .take(30)\n *   .subscribe(x => console.log(x));\n *   // 1, 2, 3, 1, 2, 3, ...\n *\n * @example <caption>Throws a new error when the source Observable throws an error</caption>\n *\n * Observable.of(1, 2, 3, 4, 5)\n *   .map(n => {\n *     if (n == 4) {\n *       throw 'four!';\n *     }\n *     return n;\n *   })\n *   .catch(err => {\n *     throw 'error in source. Details: ' + err;\n *   })\n *   .subscribe(\n *     x => console.log(x),\n *     err => console.log(err)\n *   );\n *   // 1, 2, 3, error in source. Details: four!\n *\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n *  is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n *  is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} An observable that originates from either the source or the observable returned by the\n *  catch `selector` function.\n * @name catchError\n */\nfunction catchError(selector) {\n    return function catchErrorOperatorFunction(source) {\n        var operator = new CatchOperator(selector);\n        var caught = source.lift(operator);\n        return (operator.caught = caught);\n    };\n}\nexports.catchError = catchError;\nvar CatchOperator = (function () {\n    function CatchOperator(selector) {\n        this.selector = selector;\n    }\n    CatchOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n    };\n    return CatchOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CatchSubscriber = (function (_super) {\n    __extends(CatchSubscriber, _super);\n    function CatchSubscriber(destination, selector, caught) {\n        _super.call(this, destination);\n        this.selector = selector;\n        this.caught = caught;\n    }\n    // NOTE: overriding `error` instead of `_error` because we don't want\n    // to have this flag this subscriber as `isStopped`. We can mimic the\n    // behavior of the RetrySubscriber (from the `retry` operator), where\n    // we unsubscribe from our source chain, reset our Subscriber flags,\n    // then subscribe to the selector result.\n    CatchSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var result = void 0;\n            try {\n                result = this.selector(err, this.caught);\n            }\n            catch (err2) {\n                _super.prototype.error.call(this, err2);\n                return;\n            }\n            this._unsubscribeAndRecycle();\n            this.add(subscribeToResult_1.subscribeToResult(this, result));\n        }\n    };\n    return CatchSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=catchError.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar isArray_1 = require('../util/isArray');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar none = {};\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = null;\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    // if the first and only other argument besides the resultSelector is an array\n    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n    if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n        observables = observables[0].slice();\n    }\n    return function (source) { return source.lift.call(new ArrayObservable_1.ArrayObservable([source].concat(observables)), new CombineLatestOperator(project)); };\n}\nexports.combineLatest = combineLatest;\nvar CombineLatestOperator = (function () {\n    function CombineLatestOperator(project) {\n        this.project = project;\n    }\n    CombineLatestOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));\n    };\n    return CombineLatestOperator;\n}());\nexports.CombineLatestOperator = CombineLatestOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CombineLatestSubscriber = (function (_super) {\n    __extends(CombineLatestSubscriber, _super);\n    function CombineLatestSubscriber(destination, project) {\n        _super.call(this, destination);\n        this.project = project;\n        this.active = 0;\n        this.values = [];\n        this.observables = [];\n    }\n    CombineLatestSubscriber.prototype._next = function (observable) {\n        this.values.push(none);\n        this.observables.push(observable);\n    };\n    CombineLatestSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            this.active = len;\n            this.toRespond = len;\n            for (var i = 0; i < len; i++) {\n                var observable = observables[i];\n                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n        if ((this.active -= 1) === 0) {\n            this.destination.complete();\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var values = this.values;\n        var oldVal = values[outerIndex];\n        var toRespond = !this.toRespond\n            ? 0\n            : oldVal === none ? --this.toRespond : this.toRespond;\n        values[outerIndex] = innerValue;\n        if (toRespond === 0) {\n            if (this.project) {\n                this._tryProject(values);\n            }\n            else {\n                this.destination.next(values.slice());\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype._tryProject = function (values) {\n        var result;\n        try {\n            result = this.project.apply(this, values);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return CombineLatestSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.CombineLatestSubscriber = CombineLatestSubscriber;\n//# sourceMappingURL=combineLatest.js.map",
+    "\"use strict\";\nvar concat_1 = require('../observable/concat');\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from every\n * given input Observable after the current Observable.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * Joins this Observable with multiple other Observables by subscribing to them\n * one at a time, starting with the source, and merging their results into the\n * output Observable. Will wait for each Observable to complete before moving\n * on to the next.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = timer.concat(sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n * @example <caption>Concatenate 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = timer1.concat(timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} other An input Observable to concatenate after the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @method concat\n * @owner Observable\n */\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };\n}\nexports.concat = concat;\n//# sourceMappingURL=concat.js.map",
+    "\"use strict\";\nvar mergeAll_1 = require('./mergeAll');\n/**\n * Converts a higher-order Observable into a first-order Observable by\n * concatenating the inner Observables in order.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by putting one\n * inner Observable after the other.</span>\n *\n * <img src=\"./img/concatAll.png\" width=\"100%\">\n *\n * Joins every Observable emitted by the source (a higher-order Observable), in\n * a serial fashion. It subscribes to each inner Observable only after the\n * previous inner Observable has completed, and merges all of their values into\n * the returned observable.\n *\n * __Warning:__ If the source Observable emits Observables quickly and\n * endlessly, and the inner Observables it emits generally complete slower than\n * the source emits, you can run into memory issues as the incoming Observables\n * collect in an unbounded buffer.\n *\n * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set\n * to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4));\n * var firstOrder = higherOrder.concatAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link combineAll}\n * @see {@link concat}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n * @see {@link exhaust}\n * @see {@link mergeAll}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @return {Observable} An Observable emitting values from all the inner\n * Observables concatenated.\n * @method concatAll\n * @owner Observable\n */\nfunction concatAll() {\n    return mergeAll_1.mergeAll(1);\n}\nexports.concatAll = concatAll;\n//# sourceMappingURL=concatAll.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar async_1 = require('../scheduler/async');\n/**\n * Emits a value from the source Observable only after a particular time span\n * has passed without another source emission.\n *\n * <span class=\"informal\">It's like {@link delay}, but passes only the most\n * recent value from each burst of emissions.</span>\n *\n * <img src=\"./img/debounceTime.png\" width=\"100%\">\n *\n * `debounceTime` delays values emitted by the source Observable, but drops\n * previous pending delayed emissions if a new value arrives on the source\n * Observable. This operator keeps track of the most recent value from the\n * source Observable, and emits that only when `dueTime` enough time has passed\n * without any other value appearing on the source Observable. If a new value\n * appears before `dueTime` silence occurs, the previous value will be dropped\n * and will not be emitted on the output Observable.\n *\n * This is a rate-limiting operator, because it is impossible for more than one\n * value to be emitted in any time window of duration `dueTime`, but it is also\n * a delay-like operator since output emissions do not occur at the same time as\n * they did on the source Observable. Optionally takes a {@link IScheduler} for\n * managing timers.\n *\n * @example <caption>Emit the most recent click after a burst of clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.debounceTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounce}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttleTime}\n *\n * @param {number} dueTime The timeout duration in milliseconds (or the time\n * unit determined internally by the optional `scheduler`) for the window of\n * time required to wait for emission silence before emitting the most recent\n * source value.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the timeout for each value.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified `dueTime`, and may drop some values if they occur\n * too frequently.\n * @method debounceTime\n * @owner Observable\n */\nfunction debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };\n}\nexports.debounceTime = debounceTime;\nvar DebounceTimeOperator = (function () {\n    function DebounceTimeOperator(dueTime, scheduler) {\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n    }\n    DebounceTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));\n    };\n    return DebounceTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DebounceTimeSubscriber = (function (_super) {\n    __extends(DebounceTimeSubscriber, _super);\n    function DebounceTimeSubscriber(destination, dueTime, scheduler) {\n        _super.call(this, destination);\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n        this.debouncedSubscription = null;\n        this.lastValue = null;\n        this.hasValue = false;\n    }\n    DebounceTimeSubscriber.prototype._next = function (value) {\n        this.clearDebounce();\n        this.lastValue = value;\n        this.hasValue = true;\n        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));\n    };\n    DebounceTimeSubscriber.prototype._complete = function () {\n        this.debouncedNext();\n        this.destination.complete();\n    };\n    DebounceTimeSubscriber.prototype.debouncedNext = function () {\n        this.clearDebounce();\n        if (this.hasValue) {\n            this.destination.next(this.lastValue);\n            this.lastValue = null;\n            this.hasValue = false;\n        }\n    };\n    DebounceTimeSubscriber.prototype.clearDebounce = function () {\n        var debouncedSubscription = this.debouncedSubscription;\n        if (debouncedSubscription !== null) {\n            this.remove(debouncedSubscription);\n            debouncedSubscription.unsubscribe();\n            this.debouncedSubscription = null;\n        }\n    };\n    return DebounceTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(subscriber) {\n    subscriber.debouncedNext();\n}\n//# sourceMappingURL=debounceTime.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = require('../scheduler/async');\nvar isDate_1 = require('../util/isDate');\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * <span class=\"informal\">Time shifts each item by some specified amount of\n * milliseconds.</span>\n *\n * <img src=\"./img/delay.png\" width=\"100%\">\n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example <caption>Delay each click by one second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example <caption>Delay all clicks until a future date happens</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nfunction delay(delay, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    var absoluteDelay = isDate_1.isDate(delay);\n    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };\n}\nexports.delay = delay;\nvar DelayOperator = (function () {\n    function DelayOperator(delay, scheduler) {\n        this.delay = delay;\n        this.scheduler = scheduler;\n    }\n    DelayOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n    };\n    return DelayOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DelaySubscriber = (function (_super) {\n    __extends(DelaySubscriber, _super);\n    function DelaySubscriber(destination, delay, scheduler) {\n        _super.call(this, destination);\n        this.delay = delay;\n        this.scheduler = scheduler;\n        this.queue = [];\n        this.active = false;\n        this.errored = false;\n    }\n    DelaySubscriber.dispatch = function (state) {\n        var source = state.source;\n        var queue = source.queue;\n        var scheduler = state.scheduler;\n        var destination = state.destination;\n        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n            queue.shift().notification.observe(destination);\n        }\n        if (queue.length > 0) {\n            var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n            this.schedule(state, delay_1);\n        }\n        else {\n            source.active = false;\n        }\n    };\n    DelaySubscriber.prototype._schedule = function (scheduler) {\n        this.active = true;\n        this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n            source: this, destination: this.destination, scheduler: scheduler\n        }));\n    };\n    DelaySubscriber.prototype.scheduleNotification = function (notification) {\n        if (this.errored === true) {\n            return;\n        }\n        var scheduler = this.scheduler;\n        var message = new DelayMessage(scheduler.now() + this.delay, notification);\n        this.queue.push(message);\n        if (this.active === false) {\n            this._schedule(scheduler);\n        }\n    };\n    DelaySubscriber.prototype._next = function (value) {\n        this.scheduleNotification(Notification_1.Notification.createNext(value));\n    };\n    DelaySubscriber.prototype._error = function (err) {\n        this.errored = true;\n        this.queue = [];\n        this.destination.error(err);\n    };\n    DelaySubscriber.prototype._complete = function () {\n        this.scheduleNotification(Notification_1.Notification.createComplete());\n    };\n    return DelaySubscriber;\n}(Subscriber_1.Subscriber));\nvar DelayMessage = (function () {\n    function DelayMessage(time, notification) {\n        this.time = time;\n        this.notification = notification;\n    }\n    return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar Set_1 = require('../util/Set');\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.\n *\n * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will\n * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the\n * source observable directly with an equality check against previous values.\n *\n * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.\n *\n * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the\n * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`\n * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so\n * that the internal `Set` can be \"flushed\", basically clearing it of values.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)\n *   .distinct()\n *   .subscribe(x => console.log(x)); // 1, 2, 3, 4\n *\n * @example <caption>An example using a keySelector function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     .distinct((p: Person) => p.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n *\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [keySelector] Optional function to select which value you want to check as distinct.\n * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinct\n * @owner Observable\n */\nfunction distinct(keySelector, flushes) {\n    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };\n}\nexports.distinct = distinct;\nvar DistinctOperator = (function () {\n    function DistinctOperator(keySelector, flushes) {\n        this.keySelector = keySelector;\n        this.flushes = flushes;\n    }\n    DistinctOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));\n    };\n    return DistinctOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctSubscriber = (function (_super) {\n    __extends(DistinctSubscriber, _super);\n    function DistinctSubscriber(destination, keySelector, flushes) {\n        _super.call(this, destination);\n        this.keySelector = keySelector;\n        this.values = new Set_1.Set();\n        if (flushes) {\n            this.add(subscribeToResult_1.subscribeToResult(this, flushes));\n        }\n    }\n    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values.clear();\n    };\n    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DistinctSubscriber.prototype._next = function (value) {\n        if (this.keySelector) {\n            this._useKeySelector(value);\n        }\n        else {\n            this._finalizeNext(value, value);\n        }\n    };\n    DistinctSubscriber.prototype._useKeySelector = function (value) {\n        var key;\n        var destination = this.destination;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this._finalizeNext(key, value);\n    };\n    DistinctSubscriber.prototype._finalizeNext = function (key, value) {\n        var values = this.values;\n        if (!values.has(key)) {\n            values.add(key);\n            this.destination.next(value);\n        }\n    };\n    return DistinctSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.DistinctSubscriber = DistinctSubscriber;\n//# sourceMappingURL=distinct.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n *\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n *\n * If a comparator function is not provided, an equality check is used by default.\n *\n * @example <caption>A simple example with numbers</caption>\n * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)\n *   .distinctUntilChanged()\n *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4\n *\n * @example <caption>An example using a compare function</caption>\n * interface Person {\n *    age: number,\n *    name: string\n * }\n *\n * Observable.of<Person>(\n *     { age: 4, name: 'Foo'},\n *     { age: 7, name: 'Bar'},\n *     { age: 5, name: 'Foo'})\n *     { age: 6, name: 'Foo'})\n *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)\n *     .subscribe(x => console.log(x));\n *\n * // displays:\n * // { age: 4, name: 'Foo' }\n * // { age: 7, name: 'Bar' }\n * // { age: 5, name: 'Foo' }\n *\n * @see {@link distinct}\n * @see {@link distinctUntilKeyChanged}\n *\n * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} An Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nfunction distinctUntilChanged(compare, keySelector) {\n    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };\n}\nexports.distinctUntilChanged = distinctUntilChanged;\nvar DistinctUntilChangedOperator = (function () {\n    function DistinctUntilChangedOperator(compare, keySelector) {\n        this.compare = compare;\n        this.keySelector = keySelector;\n    }\n    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n    };\n    return DistinctUntilChangedOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctUntilChangedSubscriber = (function (_super) {\n    __extends(DistinctUntilChangedSubscriber, _super);\n    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n        _super.call(this, destination);\n        this.keySelector = keySelector;\n        this.hasKey = false;\n        if (typeof compare === 'function') {\n            this.compare = compare;\n        }\n    }\n    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n        return x === y;\n    };\n    DistinctUntilChangedSubscriber.prototype._next = function (value) {\n        var keySelector = this.keySelector;\n        var key = value;\n        if (keySelector) {\n            key = tryCatch_1.tryCatch(this.keySelector)(value);\n            if (key === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        var result = false;\n        if (this.hasKey) {\n            result = tryCatch_1.tryCatch(this.compare)(this.key, key);\n            if (result === errorObject_1.errorObject) {\n                return this.destination.error(errorObject_1.errorObject.e);\n            }\n        }\n        else {\n            this.hasKey = true;\n        }\n        if (Boolean(result) === false) {\n            this.key = key;\n            this.destination.next(value);\n        }\n    };\n    return DistinctUntilChangedSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=distinctUntilChanged.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar tryCatch_1 = require('../util/tryCatch');\nvar errorObject_1 = require('../util/errorObject');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Recursively projects each source value to an Observable which is merged in\n * the output Observable.\n *\n * <span class=\"informal\">It's similar to {@link mergeMap}, but applies the\n * projection function to every source value as well as every output value.\n * It's recursive.</span>\n *\n * <img src=\"./img/expand.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger. *Expand* will re-emit on the output\n * Observable every source value. Then, each output value is given to the\n * `project` function which returns an inner Observable to be merged on the\n * output Observable. Those output values resulting from the projection are also\n * given to the `project` function to produce new output values. This is how\n * *expand* behaves recursively.\n *\n * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var powersOfTwo = clicks\n *   .mapTo(1)\n *   .expand(x => Rx.Observable.of(2 * x).delay(1000))\n *   .take(10);\n * powersOfTwo.subscribe(x => console.log(x));\n *\n * @see {@link mergeMap}\n * @see {@link mergeScan}\n *\n * @param {function(value: T, index: number) => Observable} project A function\n * that, when applied to an item emitted by the source or the output Observable,\n * returns an Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to\n * each projected inner Observable.\n * @return {Observable} An Observable that emits the source values and also\n * result of applying the projection function to each value emitted on the\n * output Observable and and merging the results of the Observables obtained\n * from this transformation.\n * @method expand\n * @owner Observable\n */\nfunction expand(project, concurrent, scheduler) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (scheduler === void 0) { scheduler = undefined; }\n    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };\n}\nexports.expand = expand;\nvar ExpandOperator = (function () {\n    function ExpandOperator(project, concurrent, scheduler) {\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n    }\n    ExpandOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));\n    };\n    return ExpandOperator;\n}());\nexports.ExpandOperator = ExpandOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ExpandSubscriber = (function (_super) {\n    __extends(ExpandSubscriber, _super);\n    function ExpandSubscriber(destination, project, concurrent, scheduler) {\n        _super.call(this, destination);\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n        this.index = 0;\n        this.active = 0;\n        this.hasCompleted = false;\n        if (concurrent < Number.POSITIVE_INFINITY) {\n            this.buffer = [];\n        }\n    }\n    ExpandSubscriber.dispatch = function (arg) {\n        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;\n        subscriber.subscribeToProjection(result, value, index);\n    };\n    ExpandSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (destination.closed) {\n            this._complete();\n            return;\n        }\n        var index = this.index++;\n        if (this.active < this.concurrent) {\n            destination.next(value);\n            var result = tryCatch_1.tryCatch(this.project)(value, index);\n            if (result === errorObject_1.errorObject) {\n                destination.error(errorObject_1.errorObject.e);\n            }\n            else if (!this.scheduler) {\n                this.subscribeToProjection(result, value, index);\n            }\n            else {\n                var state = { subscriber: this, result: result, value: value, index: index };\n                this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));\n            }\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {\n        this.active++;\n        this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));\n    };\n    ExpandSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._next(innerValue);\n    };\n    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer && buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    return ExpandSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.ExpandSubscriber = ExpandSubscriber;\n//# sourceMappingURL=expand.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * <span class=\"informal\">Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.</span>\n *\n * <img src=\"./img/filter.png\" width=\"100%\">\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example <caption>Emit only click events whose target was a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nfunction filter(predicate, thisArg) {\n    return function filterOperatorFunction(source) {\n        return source.lift(new FilterOperator(predicate, thisArg));\n    };\n}\nexports.filter = filter;\nvar FilterOperator = (function () {\n    function FilterOperator(predicate, thisArg) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n    }\n    FilterOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n    };\n    return FilterOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FilterSubscriber = (function (_super) {\n    __extends(FilterSubscriber, _super);\n    function FilterSubscriber(destination, predicate, thisArg) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.count = 0;\n    }\n    // the try catch block below is left specifically for\n    // optimization and perf reasons. a tryCatcher is not necessary here.\n    FilterSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.destination.next(value);\n        }\n    };\n    return FilterSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=filter.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar Subscription_1 = require('../Subscription');\n/**\n * Returns an Observable that mirrors the source Observable, but will call a specified function when\n * the source terminates on complete or error.\n * @param {function} callback Function to be called when source terminates.\n * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.\n * @method finally\n * @owner Observable\n */\nfunction finalize(callback) {\n    return function (source) { return source.lift(new FinallyOperator(callback)); };\n}\nexports.finalize = finalize;\nvar FinallyOperator = (function () {\n    function FinallyOperator(callback) {\n        this.callback = callback;\n    }\n    FinallyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FinallySubscriber(subscriber, this.callback));\n    };\n    return FinallyOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FinallySubscriber = (function (_super) {\n    __extends(FinallySubscriber, _super);\n    function FinallySubscriber(destination, callback) {\n        _super.call(this, destination);\n        this.add(new Subscription_1.Subscription(callback));\n    }\n    return FinallySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=finalize.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/**\n * Emits only the first value (or the first value that meets some condition)\n * emitted by the source Observable.\n *\n * <span class=\"informal\">Emits only the first value. Or emits only the first\n * value that passes some test.</span>\n *\n * <img src=\"./img/first.png\" width=\"100%\">\n *\n * If called with no arguments, `first` emits the first value of the source\n * Observable, then completes. If called with a `predicate` function, `first`\n * emits the first value of the source that matches the specified condition. It\n * may also take a `resultSelector` function to produce the output value from\n * the input value, and a `defaultValue` to emit in case the source completes\n * before it is able to emit a valid value. Throws an error if `defaultValue`\n * was not provided and a matching element is not found.\n *\n * @example <caption>Emit only the first click that happens on the DOM</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Emits the first click that happens on a DIV</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link take}\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]\n * An optional function called with each item to test for condition matching.\n * @param {function(value: T, index: number): R} [resultSelector] A function to\n * produce the value on the output Observable based on the values\n * and the indices of the source Observable. The arguments passed to this\n * function are:\n * - `value`: the value that was emitted on the source.\n * - `index`: the \"index\" of the value from the source.\n * @param {R} [defaultValue] The default value emitted in case no valid value\n * was found on the source.\n * @return {Observable<T|R>} An Observable of the first item that matches the\n * condition.\n * @method first\n * @owner Observable\n */\nfunction first(predicate, resultSelector, defaultValue) {\n    return function (source) { return source.lift(new FirstOperator(predicate, resultSelector, defaultValue, source)); };\n}\nexports.first = first;\nvar FirstOperator = (function () {\n    function FirstOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    FirstOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return FirstOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FirstSubscriber = (function (_super) {\n    __extends(FirstSubscriber, _super);\n    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.index = 0;\n        this.hasCompleted = false;\n        this._emitted = false;\n    }\n    FirstSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this._emit(value, index);\n        }\n    };\n    FirstSubscriber.prototype._emit = function (value, index) {\n        if (this.resultSelector) {\n            this._tryResultSelector(value, index);\n            return;\n        }\n        this._emitFinal(value);\n    };\n    FirstSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this._emitFinal(result);\n    };\n    FirstSubscriber.prototype._emitFinal = function (value) {\n        var destination = this.destination;\n        if (!this._emitted) {\n            this._emitted = true;\n            destination.next(value);\n            destination.complete();\n            this.hasCompleted = true;\n        }\n    };\n    FirstSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {\n            destination.next(this.defaultValue);\n            destination.complete();\n        }\n        else if (!this.hasCompleted) {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return FirstSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=first.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar EmptyError_1 = require('../util/EmptyError');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits only the last item emitted by the source Observable.\n * It optionally takes a predicate function as a parameter, in which case, rather than emitting\n * the last item from the source Observable, the resulting Observable will emit the last item\n * from the source Observable that satisfies the predicate.\n *\n * <img src=\"./img/last.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {function} predicate - The condition any source emitted item has to satisfy.\n * @return {Observable} An Observable that emits only the last item satisfying the given condition\n * from the source, or an NoSuchElementException if no such items are emitted.\n * @throws - Throws if no items that match the predicate are emitted by the source Observable.\n * @method last\n * @owner Observable\n */\nfunction last(predicate, resultSelector, defaultValue) {\n    return function (source) { return source.lift(new LastOperator(predicate, resultSelector, defaultValue, source)); };\n}\nexports.last = last;\nvar LastOperator = (function () {\n    function LastOperator(predicate, resultSelector, defaultValue, source) {\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n    }\n    LastOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n    };\n    return LastOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar LastSubscriber = (function (_super) {\n    __extends(LastSubscriber, _super);\n    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.resultSelector = resultSelector;\n        this.defaultValue = defaultValue;\n        this.source = source;\n        this.hasValue = false;\n        this.index = 0;\n        if (typeof defaultValue !== 'undefined') {\n            this.lastValue = defaultValue;\n            this.hasValue = true;\n        }\n    }\n    LastSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this._tryPredicate(value, index);\n        }\n        else {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryPredicate = function (value, index) {\n        var result;\n        try {\n            result = this.predicate(value, index, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            if (this.resultSelector) {\n                this._tryResultSelector(value, index);\n                return;\n            }\n            this.lastValue = value;\n            this.hasValue = true;\n        }\n    };\n    LastSubscriber.prototype._tryResultSelector = function (value, index) {\n        var result;\n        try {\n            result = this.resultSelector(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.lastValue = result;\n        this.hasValue = true;\n    };\n    LastSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (this.hasValue) {\n            destination.next(this.lastValue);\n            destination.complete();\n        }\n        else {\n            destination.error(new EmptyError_1.EmptyError);\n        }\n    };\n    return LastSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=last.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * <span class=\"informal\">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.</span>\n *\n * <img src=\"./img/map.png\" width=\"100%\">\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example <caption>Map every click to the clientX position of that click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable<R>} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nfunction map(project, thisArg) {\n    return function mapOperation(source) {\n        if (typeof project !== 'function') {\n            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n        }\n        return source.lift(new MapOperator(project, thisArg));\n    };\n}\nexports.map = map;\nvar MapOperator = (function () {\n    function MapOperator(project, thisArg) {\n        this.project = project;\n        this.thisArg = thisArg;\n    }\n    MapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n    };\n    return MapOperator;\n}());\nexports.MapOperator = MapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MapSubscriber = (function (_super) {\n    __extends(MapSubscriber, _super);\n    function MapSubscriber(destination, project, thisArg) {\n        _super.call(this, destination);\n        this.project = project;\n        this.count = 0;\n        this.thisArg = thisArg || this;\n    }\n    // NOTE: This looks unoptimized, but it's actually purposefully NOT\n    // using try/catch optimizations.\n    MapSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.project.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return MapSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=map.js.map",
+    "\"use strict\";\nvar Observable_1 = require('../Observable');\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar mergeAll_1 = require('./mergeAll');\nvar isScheduler_1 = require('../util/isScheduler');\n/* tslint:enable:max-line-length */\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); };\n}\nexports.merge = merge;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = Rx.Observable.merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits it's max iteration, timer2 will\n * //   continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits it's max iteration it terminates, and\n * //   timer3 will continue to emit a value every 500ms until it is complete\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...ObservableInput} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The IScheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nfunction mergeStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var concurrent = Number.POSITIVE_INFINITY;\n    var scheduler = null;\n    var last = observables[observables.length - 1];\n    if (isScheduler_1.isScheduler(last)) {\n        scheduler = observables.pop();\n        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n            concurrent = observables.pop();\n        }\n    }\n    else if (typeof last === 'number') {\n        concurrent = observables.pop();\n    }\n    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {\n        return observables[0];\n    }\n    return mergeAll_1.mergeAll(concurrent)(new ArrayObservable_1.ArrayObservable(observables, scheduler));\n}\nexports.mergeStatic = mergeStatic;\n//# sourceMappingURL=merge.js.map",
+    "\"use strict\";\nvar mergeMap_1 = require('./mergeMap');\nvar identity_1 = require('../util/identity');\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables.</span>\n *\n * <img src=\"./img/mergeAll.png\" width=\"100%\">\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var firstOrder = higherOrder.mergeAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));\n * var firstOrder = higherOrder.mergeAll(2);\n * firstOrder.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nfunction mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return mergeMap_1.mergeMap(identity_1.identity, null, concurrent);\n}\nexports.mergeAll = mergeAll;\n//# sourceMappingURL=mergeAll.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.</span>\n *\n * <img src=\"./img/mergeMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n *   Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nfunction mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return function mergeMapOperatorFunction(source) {\n        if (typeof resultSelector === 'number') {\n            concurrent = resultSelector;\n            resultSelector = null;\n        }\n        return source.lift(new MergeMapOperator(project, resultSelector, concurrent));\n    };\n}\nexports.mergeMap = mergeMap;\nvar MergeMapOperator = (function () {\n    function MergeMapOperator(project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n    }\n    MergeMapOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));\n    };\n    return MergeMapOperator;\n}());\nexports.MergeMapOperator = MergeMapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeMapSubscriber = (function (_super) {\n    __extends(MergeMapSubscriber, _super);\n    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        _super.call(this, destination);\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.concurrent = concurrent;\n        this.hasCompleted = false;\n        this.buffer = [];\n        this.active = 0;\n        this.index = 0;\n    }\n    MergeMapSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            this._tryNext(value);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeMapSubscriber.prototype._tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.active++;\n        this._innerSub(result, value, index);\n    };\n    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n    };\n    MergeMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n    };\n    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (this.resultSelector) {\n            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        else {\n            this.destination.next(innerValue);\n        }\n    };\n    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {\n        var result;\n        try {\n            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeMapSubscriber = MergeMapSubscriber;\n//# sourceMappingURL=mergeMap.js.map",
+    "\"use strict\";\nvar ConnectableObservable_1 = require('../observable/ConnectableObservable');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits the results of invoking a specified selector on items\n * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.\n *\n * <img src=\"./img/multicast.png\" width=\"100%\">\n *\n * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through\n * which the source sequence's elements will be multicast to the selector function\n * or Subject to push source elements into.\n * @param {Function} [selector] - Optional selector function that can use the multicasted source stream\n * as many times as needed, without causing multiple subscriptions to the source stream.\n * Subscribers to the given source will receive all notifications of the source from the\n * time of the subscription forward.\n * @return {Observable} An Observable that emits the results of invoking the selector\n * on the items emitted by a `ConnectableObservable` that shares a single subscription to\n * the underlying stream.\n * @method multicast\n * @owner Observable\n */\nfunction multicast(subjectOrSubjectFactory, selector) {\n    return function multicastOperatorFunction(source) {\n        var subjectFactory;\n        if (typeof subjectOrSubjectFactory === 'function') {\n            subjectFactory = subjectOrSubjectFactory;\n        }\n        else {\n            subjectFactory = function subjectFactory() {\n                return subjectOrSubjectFactory;\n            };\n        }\n        if (typeof selector === 'function') {\n            return source.lift(new MulticastOperator(subjectFactory, selector));\n        }\n        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);\n        connectable.source = source;\n        connectable.subjectFactory = subjectFactory;\n        return connectable;\n    };\n}\nexports.multicast = multicast;\nvar MulticastOperator = (function () {\n    function MulticastOperator(subjectFactory, selector) {\n        this.subjectFactory = subjectFactory;\n        this.selector = selector;\n    }\n    MulticastOperator.prototype.call = function (subscriber, source) {\n        var selector = this.selector;\n        var subject = this.subjectFactory();\n        var subscription = selector(subject).subscribe(subscriber);\n        subscription.add(source.subscribe(subject));\n        return subscription;\n    };\n    return MulticastOperator;\n}());\nexports.MulticastOperator = MulticastOperator;\n//# sourceMappingURL=multicast.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar Notification_1 = require('../Notification');\n/**\n *\n * Re-emits all notifications from source Observable with specified scheduler.\n *\n * <span class=\"informal\">Ensure a specific scheduler is used, from outside of an Observable.</span>\n *\n * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule\n * notifications emitted by the source Observable. It might be useful, if you do not have control over\n * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.\n *\n * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,\n * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal\n * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits\n * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.\n * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split\n * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source\n * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a\n * little bit more, to ensure that they are emitted at expected moments.\n *\n * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications\n * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`\n * will delay all notifications - including error notifications - while `delay` will pass through error\n * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator\n * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used\n * for notification emissions in general.\n *\n * @example <caption>Ensure values in subscribe are called just before browser repaint.</caption>\n * const intervals = Rx.Observable.interval(10); // Intervals are scheduled\n *                                               // with async scheduler by default...\n *\n * intervals\n * .observeOn(Rx.Scheduler.animationFrame)       // ...but we will observe on animationFrame\n * .subscribe(val => {                           // scheduler to ensure smooth animation.\n *   someDiv.style.height = val + 'px';\n * });\n *\n * @see {@link delay}\n *\n * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable.\n * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.\n * @return {Observable<T>} Observable that emits the same notifications as the source Observable,\n * but with provided scheduler.\n *\n * @method observeOn\n * @owner Observable\n */\nfunction observeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return function observeOnOperatorFunction(source) {\n        return source.lift(new ObserveOnOperator(scheduler, delay));\n    };\n}\nexports.observeOn = observeOn;\nvar ObserveOnOperator = (function () {\n    function ObserveOnOperator(scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n    };\n    return ObserveOnOperator;\n}());\nexports.ObserveOnOperator = ObserveOnOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ObserveOnSubscriber = (function (_super) {\n    __extends(ObserveOnSubscriber, _super);\n    function ObserveOnSubscriber(destination, scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        _super.call(this, destination);\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnSubscriber.dispatch = function (arg) {\n        var notification = arg.notification, destination = arg.destination;\n        notification.observe(destination);\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n        this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n    };\n    ObserveOnSubscriber.prototype._next = function (value) {\n        this.scheduleMessage(Notification_1.Notification.createNext(value));\n    };\n    ObserveOnSubscriber.prototype._error = function (err) {\n        this.scheduleMessage(Notification_1.Notification.createError(err));\n    };\n    ObserveOnSubscriber.prototype._complete = function () {\n        this.scheduleMessage(Notification_1.Notification.createComplete());\n    };\n    return ObserveOnSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ObserveOnSubscriber = ObserveOnSubscriber;\nvar ObserveOnMessage = (function () {\n    function ObserveOnMessage(notification, destination) {\n        this.notification = notification;\n        this.destination = destination;\n    }\n    return ObserveOnMessage;\n}());\nexports.ObserveOnMessage = ObserveOnMessage;\n//# sourceMappingURL=observeOn.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Groups pairs of consecutive emissions together and emits them as an array of\n * two values.\n *\n * <span class=\"informal\">Puts the current value and previous value together as\n * an array, and emits that.</span>\n *\n * <img src=\"./img/pairwise.png\" width=\"100%\">\n *\n * The Nth emission from the source Observable will cause the output Observable\n * to emit an array [(N-1)th, Nth] of the previous and the current value, as a\n * pair. For this reason, `pairwise` emits on the second and subsequent\n * emissions from the source Observable, but not on the first emission, because\n * there is no previous value in that case.\n *\n * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var pairs = clicks.pairwise();\n * var distance = pairs.map(pair => {\n *   var x0 = pair[0].clientX;\n *   var y0 = pair[0].clientY;\n *   var x1 = pair[1].clientX;\n *   var y1 = pair[1].clientY;\n *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));\n * });\n * distance.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n *\n * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of\n * consecutive values from the source Observable.\n * @method pairwise\n * @owner Observable\n */\nfunction pairwise() {\n    return function (source) { return source.lift(new PairwiseOperator()); };\n}\nexports.pairwise = pairwise;\nvar PairwiseOperator = (function () {\n    function PairwiseOperator() {\n    }\n    PairwiseOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new PairwiseSubscriber(subscriber));\n    };\n    return PairwiseOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar PairwiseSubscriber = (function (_super) {\n    __extends(PairwiseSubscriber, _super);\n    function PairwiseSubscriber(destination) {\n        _super.call(this, destination);\n        this.hasPrev = false;\n    }\n    PairwiseSubscriber.prototype._next = function (value) {\n        if (this.hasPrev) {\n            this.destination.next([this.prev, value]);\n        }\n        else {\n            this.hasPrev = true;\n        }\n        this.prev = value;\n    };\n    return PairwiseSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=pairwise.js.map",
+    "\"use strict\";\nvar map_1 = require('./map');\n/**\n * Maps each source value (an object) to its specified nested property.\n *\n * <span class=\"informal\">Like {@link map}, but meant only for picking one of\n * the nested properties of every emitted object.</span>\n *\n * <img src=\"./img/pluck.png\" width=\"100%\">\n *\n * Given a list of strings describing a path to an object property, retrieves\n * the value of a specified nested property from all values in the source\n * Observable. If a property can't be resolved, it will return `undefined` for\n * that value.\n *\n * @example <caption>Map every click to the tagName of the clicked target element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var tagNames = clicks.pluck('target', 'tagName');\n * tagNames.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {...string} properties The nested properties to pluck from each source\n * value (an object).\n * @return {Observable} A new Observable of property values from the source values.\n * @method pluck\n * @owner Observable\n */\nfunction pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i - 0] = arguments[_i];\n    }\n    var length = properties.length;\n    if (length === 0) {\n        throw new Error('list of properties cannot be empty.');\n    }\n    return function (source) { return map_1.map(plucker(properties, length))(source); };\n}\nexports.pluck = pluck;\nfunction plucker(props, length) {\n    var mapper = function (x) {\n        var currentProp = x;\n        for (var i = 0; i < length; i++) {\n            var p = currentProp[props[i]];\n            if (typeof p !== 'undefined') {\n                currentProp = p;\n            }\n            else {\n                return undefined;\n            }\n        }\n        return currentProp;\n    };\n    return mapper;\n}\n//# sourceMappingURL=pluck.js.map",
+    "\"use strict\";\nvar Subject_1 = require('../Subject');\nvar multicast_1 = require('./multicast');\n/* tslint:enable:max-line-length */\n/**\n * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called\n * before it begins emitting items to those Observers that have subscribed to it.\n *\n * <img src=\"./img/publish.png\" width=\"100%\">\n *\n * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times\n * as needed, without causing multiple subscriptions to the source sequence.\n * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.\n * @method publish\n * @owner Observable\n */\nfunction publish(selector) {\n    return selector ?\n        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :\n        multicast_1.multicast(new Subject_1.Subject());\n}\nexports.publish = publish;\n//# sourceMappingURL=publish.js.map",
+    "\"use strict\";\nvar ReplaySubject_1 = require('../ReplaySubject');\nvar multicast_1 = require('./multicast');\n/* tslint:enable:max-line-length */\nfunction publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {\n    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {\n        scheduler = selectorOrScheduler;\n    }\n    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;\n    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);\n    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };\n}\nexports.publishReplay = publishReplay;\n//# sourceMappingURL=publishReplay.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nfunction refCount() {\n    return function refCountOperatorFunction(source) {\n        return source.lift(new RefCountOperator(source));\n    };\n}\nexports.refCount = refCount;\nvar RefCountOperator = (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n    __extends(RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        _super.call(this, destination);\n        this.connectable = connectable;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        ///\n        // Compare the local RefCountSubscriber's connection Subscription to the\n        // connection Subscription on the shared ConnectableObservable. In cases\n        // where the ConnectableObservable source synchronously emits values, and\n        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n        // execution continues to here before the RefCountOperator has a chance to\n        // supply the RefCountSubscriber with the shared connection Subscription.\n        // For example:\n        // ```\n        // Observable.range(0, 10)\n        //   .publish()\n        //   .refCount()\n        //   .take(5)\n        //   .subscribe();\n        // ```\n        // In order to account for this case, RefCountSubscriber should only dispose\n        // the ConnectableObservable's shared connection Subscription if the\n        // connection Subscription exists, *and* either:\n        //   a. RefCountSubscriber doesn't have a reference to the shared connection\n        //      Subscription yet, or,\n        //   b. RefCountSubscriber's connection Subscription reference is identical\n        //      to the shared connection Subscription\n        ///\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=refCount.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable\n * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given\n * as a number parameter) rather than propagating the `error` call.\n *\n * <img src=\"./img/retry.png\" width=\"100%\">\n *\n * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted\n * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second\n * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications\n * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].\n * @param {number} count - Number of retry attempts before failing.\n * @return {Observable} The source Observable modified with the retry logic.\n * @method retry\n * @owner Observable\n */\nfunction retry(count) {\n    if (count === void 0) { count = -1; }\n    return function (source) { return source.lift(new RetryOperator(count, source)); };\n}\nexports.retry = retry;\nvar RetryOperator = (function () {\n    function RetryOperator(count, source) {\n        this.count = count;\n        this.source = source;\n    }\n    RetryOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));\n    };\n    return RetryOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RetrySubscriber = (function (_super) {\n    __extends(RetrySubscriber, _super);\n    function RetrySubscriber(destination, count, source) {\n        _super.call(this, destination);\n        this.count = count;\n        this.source = source;\n    }\n    RetrySubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _a = this, source = _a.source, count = _a.count;\n            if (count === 0) {\n                return _super.prototype.error.call(this, err);\n            }\n            else if (count > -1) {\n                this.count = count - 1;\n            }\n            source.subscribe(this._unsubscribeAndRecycle());\n        }\n    };\n    return RetrySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=retry.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Emits the most recently emitted value from the source Observable whenever\n * another Observable, the `notifier`, emits.\n *\n * <span class=\"informal\">It's like {@link sampleTime}, but samples whenever\n * the `notifier` Observable emits something.</span>\n *\n * <img src=\"./img/sample.png\" width=\"100%\">\n *\n * Whenever the `notifier` Observable emits a value or completes, `sample`\n * looks at the source Observable and emits whichever value it has most recently\n * emitted since the previous sampling, unless the source has not emitted\n * anything since the previous sampling. The `notifier` is subscribed to as soon\n * as the output Observable is subscribed.\n *\n * @example <caption>On every click, sample the most recent \"seconds\" timer</caption>\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = seconds.sample(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {Observable<any>} notifier The Observable to use for sampling the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the results of sampling the\n * values emitted by the source Observable whenever the notifier Observable\n * emits value or completes.\n * @method sample\n * @owner Observable\n */\nfunction sample(notifier) {\n    return function (source) { return source.lift(new SampleOperator(notifier)); };\n}\nexports.sample = sample;\nvar SampleOperator = (function () {\n    function SampleOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SampleOperator.prototype.call = function (subscriber, source) {\n        var sampleSubscriber = new SampleSubscriber(subscriber);\n        var subscription = source.subscribe(sampleSubscriber);\n        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));\n        return subscription;\n    };\n    return SampleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SampleSubscriber = (function (_super) {\n    __extends(SampleSubscriber, _super);\n    function SampleSubscriber() {\n        _super.apply(this, arguments);\n        this.hasValue = false;\n    }\n    SampleSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n    };\n    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.value);\n        }\n    };\n    return SampleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=sample.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns each\n * intermediate result, with an optional seed value.\n *\n * <span class=\"informal\">It's like {@link reduce}, but emits the current\n * accumulation whenever the source emits a value.</span>\n *\n * <img src=\"./img/scan.png\" width=\"100%\">\n *\n * Combines together all values emitted on the source, using an accumulator\n * function that knows how to join a new source value into the accumulation from\n * the past. Is similar to {@link reduce}, but emits the intermediate\n * accumulations.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var ones = clicks.mapTo(1);\n * var seed = 0;\n * var count = ones.scan((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link reduce}\n *\n * @param {function(acc: R, value: T, index: number): R} accumulator\n * The accumulator function called on each source value.\n * @param {T|R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @method scan\n * @owner Observable\n */\nfunction scan(accumulator, seed) {\n    var hasSeed = false;\n    // providing a seed of `undefined` *should* be valid and trigger\n    // hasSeed! so don't use `seed !== undefined` checks!\n    // For this reason, we have to check it here at the original call site\n    // otherwise inside Operator/Subscriber we won't know if `undefined`\n    // means they didn't provide anything or if they literally provided `undefined`\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return function scanOperatorFunction(source) {\n        return source.lift(new ScanOperator(accumulator, seed, hasSeed));\n    };\n}\nexports.scan = scan;\nvar ScanOperator = (function () {\n    function ScanOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) { hasSeed = false; }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ScanOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ScanSubscriber = (function (_super) {\n    __extends(ScanSubscriber, _super);\n    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n        _super.call(this, destination);\n        this.accumulator = accumulator;\n        this._seed = _seed;\n        this.hasSeed = hasSeed;\n        this.index = 0;\n    }\n    Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n        get: function () {\n            return this._seed;\n        },\n        set: function (value) {\n            this.hasSeed = true;\n            this._seed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ScanSubscriber.prototype._next = function (value) {\n        if (!this.hasSeed) {\n            this.seed = value;\n            this.destination.next(value);\n        }\n        else {\n            return this._tryNext(value);\n        }\n    };\n    ScanSubscriber.prototype._tryNext = function (value) {\n        var index = this.index++;\n        var result;\n        try {\n            result = this.accumulator(this.seed, value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n        this.seed = result;\n        this.destination.next(result);\n    };\n    return ScanSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=scan.js.map",
+    "\"use strict\";\nvar multicast_1 = require('./multicast');\nvar refCount_1 = require('./refCount');\nvar Subject_1 = require('../Subject');\nfunction shareSubjectFactory() {\n    return new Subject_1.Subject();\n}\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n * This is an alias for .multicast(() => new Subject()).refCount().\n *\n * <img src=\"./img/share.png\" width=\"100%\">\n *\n * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.\n * @method share\n * @owner Observable\n */\nfunction share() {\n    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };\n}\nexports.share = share;\n;\n//# sourceMappingURL=share.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that skips the first `count` items emitted by the source Observable.\n *\n * <img src=\"./img/skip.png\" width=\"100%\">\n *\n * @param {Number} count - The number of times, items emitted by source Observable should be skipped.\n * @return {Observable} An Observable that skips values emitted by the source Observable.\n *\n * @method skip\n * @owner Observable\n */\nfunction skip(count) {\n    return function (source) { return source.lift(new SkipOperator(count)); };\n}\nexports.skip = skip;\nvar SkipOperator = (function () {\n    function SkipOperator(total) {\n        this.total = total;\n    }\n    SkipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipSubscriber(subscriber, this.total));\n    };\n    return SkipOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipSubscriber = (function (_super) {\n    __extends(SkipSubscriber, _super);\n    function SkipSubscriber(destination, total) {\n        _super.call(this, destination);\n        this.total = total;\n        this.count = 0;\n    }\n    SkipSubscriber.prototype._next = function (x) {\n        if (++this.count > this.total) {\n            this.destination.next(x);\n        }\n    };\n    return SkipSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skip.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.\n *\n * <img src=\"./img/skipUntil.png\" width=\"100%\">\n *\n * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to\n * be mirrored by the resulting Observable.\n * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits\n * an item, then emits the remaining items.\n * @method skipUntil\n * @owner Observable\n */\nfunction skipUntil(notifier) {\n    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };\n}\nexports.skipUntil = skipUntil;\nvar SkipUntilOperator = (function () {\n    function SkipUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SkipUntilOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier));\n    };\n    return SkipUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipUntilSubscriber = (function (_super) {\n    __extends(SkipUntilSubscriber, _super);\n    function SkipUntilSubscriber(destination, notifier) {\n        _super.call(this, destination);\n        this.hasValue = false;\n        this.isInnerStopped = false;\n        this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n    }\n    SkipUntilSubscriber.prototype._next = function (value) {\n        if (this.hasValue) {\n            _super.prototype._next.call(this, value);\n        }\n    };\n    SkipUntilSubscriber.prototype._complete = function () {\n        if (this.isInnerStopped) {\n            _super.prototype._complete.call(this);\n        }\n        else {\n            this.unsubscribe();\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.hasValue = true;\n    };\n    SkipUntilSubscriber.prototype.notifyComplete = function () {\n        this.isInnerStopped = true;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    return SkipUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=skipUntil.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds\n * true, but emits all further source items as soon as the condition becomes false.\n *\n * <img src=\"./img/skipWhile.png\" width=\"100%\">\n *\n * @param {Function} predicate - A function to test each item emitted from the source Observable.\n * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the\n * specified predicate becomes false.\n * @method skipWhile\n * @owner Observable\n */\nfunction skipWhile(predicate) {\n    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };\n}\nexports.skipWhile = skipWhile;\nvar SkipWhileOperator = (function () {\n    function SkipWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    SkipWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));\n    };\n    return SkipWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipWhileSubscriber = (function (_super) {\n    __extends(SkipWhileSubscriber, _super);\n    function SkipWhileSubscriber(destination, predicate) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.skipping = true;\n        this.index = 0;\n    }\n    SkipWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (this.skipping) {\n            this.tryCallPredicate(value);\n        }\n        if (!this.skipping) {\n            destination.next(value);\n        }\n    };\n    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {\n        try {\n            var result = this.predicate(value, this.index++);\n            this.skipping = Boolean(result);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    return SkipWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skipWhile.js.map",
+    "\"use strict\";\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar ScalarObservable_1 = require('../observable/ScalarObservable');\nvar EmptyObservable_1 = require('../observable/EmptyObservable');\nvar concat_1 = require('../observable/concat');\nvar isScheduler_1 = require('../util/isScheduler');\n/* tslint:enable:max-line-length */\n/**\n * Returns an Observable that emits the items you specify as arguments before it begins to emit\n * items emitted by the source Observable.\n *\n * <img src=\"./img/startWith.png\" width=\"100%\">\n *\n * @param {...T} values - Items you want the modified Observable to emit first.\n * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling\n * the emissions of the `next` notifications.\n * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items\n * emitted by the source Observable.\n * @method startWith\n * @owner Observable\n */\nfunction startWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i - 0] = arguments[_i];\n    }\n    return function (source) {\n        var scheduler = array[array.length - 1];\n        if (isScheduler_1.isScheduler(scheduler)) {\n            array.pop();\n        }\n        else {\n            scheduler = null;\n        }\n        var len = array.length;\n        if (len === 1) {\n            return concat_1.concat(new ScalarObservable_1.ScalarObservable(array[0], scheduler), source);\n        }\n        else if (len > 1) {\n            return concat_1.concat(new ArrayObservable_1.ArrayObservable(array, scheduler), source);\n        }\n        else {\n            return concat_1.concat(new EmptyObservable_1.EmptyObservable(scheduler), source);\n        }\n    };\n}\nexports.startWith = startWith;\n//# sourceMappingURL=startWith.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, emitting values only from the most recently projected Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link switch}.</span>\n *\n * <img src=\"./img/switchMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each time it observes one of these\n * inner Observables, the output Observable begins emitting the items emitted by\n * that inner Observable. When a new inner Observable is emitted, `switchMap`\n * stops emitting items from the earlier-emitted inner Observable and begins\n * emitting items from the new one. It continues to behave like this for\n * subsequent inner Observables.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switch}\n * @see {@link switchMapTo}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking only the values from the most recently\n * projected inner Observable.\n * @method switchMap\n * @owner Observable\n */\nfunction switchMap(project, resultSelector) {\n    return function switchMapOperatorFunction(source) {\n        return source.lift(new SwitchMapOperator(project, resultSelector));\n    };\n}\nexports.switchMap = switchMap;\nvar SwitchMapOperator = (function () {\n    function SwitchMapOperator(project, resultSelector) {\n        this.project = project;\n        this.resultSelector = resultSelector;\n    }\n    SwitchMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));\n    };\n    return SwitchMapOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchMapSubscriber = (function (_super) {\n    __extends(SwitchMapSubscriber, _super);\n    function SwitchMapSubscriber(destination, project, resultSelector) {\n        _super.call(this, destination);\n        this.project = project;\n        this.resultSelector = resultSelector;\n        this.index = 0;\n    }\n    SwitchMapSubscriber.prototype._next = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (error) {\n            this.destination.error(error);\n            return;\n        }\n        this._innerSub(result, value, index);\n    };\n    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscription = this.innerSubscription;\n        if (innerSubscription) {\n            innerSubscription.unsubscribe();\n        }\n        this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));\n    };\n    SwitchMapSubscriber.prototype._complete = function () {\n        var innerSubscription = this.innerSubscription;\n        if (!innerSubscription || innerSubscription.closed) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype._unsubscribe = function () {\n        this.innerSubscription = null;\n    };\n    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.remove(innerSub);\n        this.innerSubscription = null;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (this.resultSelector) {\n            this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        else {\n            this.destination.next(innerValue);\n        }\n    };\n    SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n        var result;\n        try {\n            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return SwitchMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=switchMap.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');\nvar EmptyObservable_1 = require('../observable/EmptyObservable');\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Takes the first `count` values from the source, then\n * completes.</span>\n *\n * <img src=\"./img/take.png\" width=\"100%\">\n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable<T>} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nfunction take(count) {\n    return function (source) {\n        if (count === 0) {\n            return new EmptyObservable_1.EmptyObservable();\n        }\n        else {\n            return source.lift(new TakeOperator(count));\n        }\n    };\n}\nexports.take = take;\nvar TakeOperator = (function () {\n    function TakeOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n        }\n    }\n    TakeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeSubscriber(subscriber, this.total));\n    };\n    return TakeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeSubscriber = (function (_super) {\n    __extends(TakeSubscriber, _super);\n    function TakeSubscriber(destination, total) {\n        _super.call(this, destination);\n        this.total = total;\n        this.count = 0;\n    }\n    TakeSubscriber.prototype._next = function (value) {\n        var total = this.total;\n        var count = ++this.count;\n        if (count <= total) {\n            this.destination.next(value);\n            if (count === total) {\n                this.destination.complete();\n                this.unsubscribe();\n            }\n        }\n    };\n    return TakeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=take.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/**\n * Emits the values emitted by the source Observable until a `notifier`\n * Observable emits a value.\n *\n * <span class=\"informal\">Lets values pass until a second Observable,\n * `notifier`, emits something. Then, it completes.</span>\n *\n * <img src=\"./img/takeUntil.png\" width=\"100%\">\n *\n * `takeUntil` subscribes and begins mirroring the source Observable. It also\n * monitors a second Observable, `notifier` that you provide. If the `notifier`\n * emits a value or a complete notification, the output Observable stops\n * mirroring the source Observable and completes.\n *\n * @example <caption>Tick every second until the first click happens</caption>\n * var interval = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = interval.takeUntil(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @param {Observable} notifier The Observable whose first emitted value will\n * cause the output Observable of `takeUntil` to stop emitting values from the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable until such time as `notifier` emits its first value.\n * @method takeUntil\n * @owner Observable\n */\nfunction takeUntil(notifier) {\n    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };\n}\nexports.takeUntil = takeUntil;\nvar TakeUntilOperator = (function () {\n    function TakeUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    TakeUntilOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));\n    };\n    return TakeUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeUntilSubscriber = (function (_super) {\n    __extends(TakeUntilSubscriber, _super);\n    function TakeUntilSubscriber(destination, notifier) {\n        _super.call(this, destination);\n        this.notifier = notifier;\n        this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n    }\n    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.complete();\n    };\n    TakeUntilSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    return TakeUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=takeUntil.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/**\n * Emits values emitted by the source Observable so long as each value satisfies\n * the given `predicate`, and then completes as soon as this `predicate` is not\n * satisfied.\n *\n * <span class=\"informal\">Takes values from the source only while they pass the\n * condition given. When the first value does not satisfy, it completes.</span>\n *\n * <img src=\"./img/takeWhile.png\" width=\"100%\">\n *\n * `takeWhile` subscribes and begins mirroring the source Observable. Each value\n * emitted on the source is given to the `predicate` function which returns a\n * boolean, representing a condition to be satisfied by the source values. The\n * output Observable emits the source values until such time as the `predicate`\n * returns false, at which point `takeWhile` stops mirroring the source\n * Observable and completes the output Observable.\n *\n * @example <caption>Emit click events only while the clientX property is greater than 200</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.takeWhile(ev => ev.clientX > 200);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates a value emitted by the source Observable and returns a boolean.\n * Also takes the (zero-based) index as the second argument.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable so long as each value satisfies the condition defined by the\n * `predicate`, then completes.\n * @method takeWhile\n * @owner Observable\n */\nfunction takeWhile(predicate) {\n    return function (source) { return source.lift(new TakeWhileOperator(predicate)); };\n}\nexports.takeWhile = takeWhile;\nvar TakeWhileOperator = (function () {\n    function TakeWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    TakeWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate));\n    };\n    return TakeWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeWhileSubscriber = (function (_super) {\n    __extends(TakeWhileSubscriber, _super);\n    function TakeWhileSubscriber(destination, predicate) {\n        _super.call(this, destination);\n        this.predicate = predicate;\n        this.index = 0;\n    }\n    TakeWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        var result;\n        try {\n            result = this.predicate(value, this.index++);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this.nextOrComplete(value, result);\n    };\n    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {\n        var destination = this.destination;\n        if (Boolean(predicateResult)) {\n            destination.next(value);\n        }\n        else {\n            destination.complete();\n        }\n    };\n    return TakeWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=takeWhile.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\n/* tslint:enable:max-line-length */\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * <span class=\"informal\">Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source as long as errors don't occur.</span>\n *\n * <img src=\"./img/do.png\" width=\"100%\">\n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n *   .do(ev => console.log(ev))\n *   .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @name tap\n */\nfunction tap(nextOrObserver, error, complete) {\n    return function tapOperatorFunction(source) {\n        return source.lift(new DoOperator(nextOrObserver, error, complete));\n    };\n}\nexports.tap = tap;\nvar DoOperator = (function () {\n    function DoOperator(nextOrObserver, error, complete) {\n        this.nextOrObserver = nextOrObserver;\n        this.error = error;\n        this.complete = complete;\n    }\n    DoOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n    };\n    return DoOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DoSubscriber = (function (_super) {\n    __extends(DoSubscriber, _super);\n    function DoSubscriber(destination, nextOrObserver, error, complete) {\n        _super.call(this, destination);\n        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n        safeSubscriber.syncErrorThrowable = true;\n        this.add(safeSubscriber);\n        this.safeSubscriber = safeSubscriber;\n    }\n    DoSubscriber.prototype._next = function (value) {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.next(value);\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.next(value);\n        }\n    };\n    DoSubscriber.prototype._error = function (err) {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.error(err);\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.error(err);\n        }\n    };\n    DoSubscriber.prototype._complete = function () {\n        var safeSubscriber = this.safeSubscriber;\n        safeSubscriber.complete();\n        if (safeSubscriber.syncErrorThrown) {\n            this.destination.error(safeSubscriber.syncErrorValue);\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    return DoSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=tap.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nexports.defaultThrottleConfig = {\n    leading: true,\n    trailing: false\n};\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for a duration determined by another Observable, then repeats this\n * process.\n *\n * <span class=\"informal\">It's like {@link throttleTime}, but the silencing\n * duration is determined by a second Observable.</span>\n *\n * <img src=\"./img/throttle.png\" width=\"100%\">\n *\n * `throttle` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled by calling the `durationSelector` function with the source value,\n * which returns the \"duration\" Observable. When the duration Observable emits a\n * value or completes, the timer is disabled, and this process repeats for the\n * next source value.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttle(ev => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link delayWhen}\n * @see {@link sample}\n * @see {@link throttleTime}\n *\n * @param {function(value: T): SubscribableOrPromise} durationSelector A function\n * that receives a value from the source Observable, for computing the silencing\n * duration for each source value, returned as an Observable or a Promise.\n * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults\n * to `{ leading: true, trailing: false }`.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttle\n * @owner Observable\n */\nfunction throttle(durationSelector, config) {\n    if (config === void 0) { config = exports.defaultThrottleConfig; }\n    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };\n}\nexports.throttle = throttle;\nvar ThrottleOperator = (function () {\n    function ThrottleOperator(durationSelector, leading, trailing) {\n        this.durationSelector = durationSelector;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n    };\n    return ThrottleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleSubscriber = (function (_super) {\n    __extends(ThrottleSubscriber, _super);\n    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {\n        _super.call(this, destination);\n        this.destination = destination;\n        this.durationSelector = durationSelector;\n        this._leading = _leading;\n        this._trailing = _trailing;\n        this._hasTrailingValue = false;\n    }\n    ThrottleSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this._trailing) {\n                this._hasTrailingValue = true;\n                this._trailingValue = value;\n            }\n        }\n        else {\n            var duration = this.tryDurationSelector(value);\n            if (duration) {\n                this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration));\n            }\n            if (this._leading) {\n                this.destination.next(value);\n                if (this._trailing) {\n                    this._hasTrailingValue = true;\n                    this._trailingValue = value;\n                }\n            }\n        }\n    };\n    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {\n        try {\n            return this.durationSelector(value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return null;\n        }\n    };\n    ThrottleSubscriber.prototype._unsubscribe = function () {\n        var _a = this, throttled = _a.throttled, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue, _trailing = _a._trailing;\n        this._trailingValue = null;\n        this._hasTrailingValue = false;\n        if (throttled) {\n            this.remove(throttled);\n            this.throttled = null;\n            throttled.unsubscribe();\n        }\n    };\n    ThrottleSubscriber.prototype._sendTrailing = function () {\n        var _a = this, destination = _a.destination, throttled = _a.throttled, _trailing = _a._trailing, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue;\n        if (throttled && _trailing && _hasTrailingValue) {\n            destination.next(_trailingValue);\n            this._trailingValue = null;\n            this._hasTrailingValue = false;\n        }\n    };\n    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._sendTrailing();\n        this._unsubscribe();\n    };\n    ThrottleSubscriber.prototype.notifyComplete = function () {\n        this._sendTrailing();\n        this._unsubscribe();\n    };\n    return ThrottleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=throttle.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = require('../Subscriber');\nvar async_1 = require('../scheduler/async');\nvar throttle_1 = require('./throttle');\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for `duration` milliseconds, then repeats this process.\n *\n * <span class=\"informal\">Lets a value pass, then ignores source values for the\n * next `duration` milliseconds.</span>\n *\n * <img src=\"./img/throttleTime.png\" width=\"100%\">\n *\n * `throttleTime` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled. After `duration` milliseconds (or the time unit determined\n * internally by the optional `scheduler`) has passed, the timer is disabled,\n * and this process repeats for the next source value. Optionally takes a\n * {@link IScheduler} for managing timers.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttleTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {number} duration Time to wait before emitting another value after\n * emitting the last value, measured in milliseconds or the time unit determined\n * internally by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for\n * managing the timers that handle the throttling.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttleTime\n * @owner Observable\n */\nfunction throttleTime(duration, scheduler, config) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }\n    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };\n}\nexports.throttleTime = throttleTime;\nvar ThrottleTimeOperator = (function () {\n    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n    };\n    return ThrottleTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleTimeSubscriber = (function (_super) {\n    __extends(ThrottleTimeSubscriber, _super);\n    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {\n        _super.call(this, destination);\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n        this._hasTrailingValue = false;\n        this._trailingValue = null;\n    }\n    ThrottleTimeSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n        else {\n            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n            if (this.leading) {\n                this.destination.next(value);\n            }\n        }\n    };\n    ThrottleTimeSubscriber.prototype.clearThrottle = function () {\n        var throttled = this.throttled;\n        if (throttled) {\n            if (this.trailing && this._hasTrailingValue) {\n                this.destination.next(this._trailingValue);\n                this._trailingValue = null;\n                this._hasTrailingValue = false;\n            }\n            throttled.unsubscribe();\n            this.remove(throttled);\n            this.throttled = null;\n        }\n    };\n    return ThrottleTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(arg) {\n    var subscriber = arg.subscriber;\n    subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = require('../scheduler/async');\nvar isDate_1 = require('../util/isDate');\nvar Subscriber_1 = require('../Subscriber');\nvar TimeoutError_1 = require('../util/TimeoutError');\n/**\n *\n * Errors if Observable does not emit a value in given time span.\n *\n * <span class=\"informal\">Timeouts on Observable that doesn't emit values fast enough.</span>\n *\n * <img src=\"./img/timeout.png\" width=\"100%\">\n *\n * `timeout` operator accepts as an argument either a number or a Date.\n *\n * If number was provided, it returns an Observable that behaves like a source\n * Observable, unless there is a period of time where there is no value emitted.\n * So if you provide `100` as argument and first value comes after 50ms from\n * the moment of subscription, this value will be simply re-emitted by the resulting\n * Observable. If however after that 100ms passes without a second value being emitted,\n * stream will end with an error and source Observable will be unsubscribed.\n * These checks are performed throughout whole lifecycle of Observable - from the moment\n * it was subscribed to, until it completes or errors itself. Thus every value must be\n * emitted within specified period since previous value.\n *\n * If provided argument was Date, returned Observable behaves differently. It throws\n * if Observable did not complete before provided Date. This means that periods between\n * emission of particular values do not matter in this case. If Observable did not complete\n * before provided Date, source Observable will be unsubscribed. Other than that, resulting\n * stream behaves just as source Observable.\n *\n * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)\n * when returned Observable will check if source stream emitted value or completed.\n *\n * @example <caption>Check if ticks are emitted within certain timespan</caption>\n * const seconds = Rx.Observable.interval(1000);\n *\n * seconds.timeout(1100) // Let's use bigger timespan to be safe,\n *                       // since `interval` might fire a bit later then scheduled.\n * .subscribe(\n *     value => console.log(value), // Will emit numbers just as regular `interval` would.\n *     err => console.log(err) // Will never be called.\n * );\n *\n * seconds.timeout(900).subscribe(\n *     value => console.log(value), // Will never be called.\n *     err => console.log(err) // Will emit error before even first value is emitted,\n *                             // since it did not arrive within 900ms period.\n * );\n *\n * @example <caption>Use Date to check if Observable completed</caption>\n * const seconds = Rx.Observable.interval(1000);\n *\n * seconds.timeout(new Date(\"December 17, 2020 03:24:00\"))\n * .subscribe(\n *     value => console.log(value), // Will emit values as regular `interval` would\n *                                  // until December 17, 2020 at 03:24:00.\n *     err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error,\n *                             // since Observable did not complete by then.\n * );\n *\n * @see {@link timeoutWith}\n *\n * @param {number|Date} due Number specifying period within which Observable must emit values\n *                          or Date specifying before when Observable should complete\n * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur.\n * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.\n * @method timeout\n * @owner Observable\n */\nfunction timeout(due, scheduler) {\n    if (scheduler === void 0) { scheduler = async_1.async; }\n    var absoluteTimeout = isDate_1.isDate(due);\n    var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);\n    return function (source) { return source.lift(new TimeoutOperator(waitFor, absoluteTimeout, scheduler, new TimeoutError_1.TimeoutError())); };\n}\nexports.timeout = timeout;\nvar TimeoutOperator = (function () {\n    function TimeoutOperator(waitFor, absoluteTimeout, scheduler, errorInstance) {\n        this.waitFor = waitFor;\n        this.absoluteTimeout = absoluteTimeout;\n        this.scheduler = scheduler;\n        this.errorInstance = errorInstance;\n    }\n    TimeoutOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TimeoutSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.scheduler, this.errorInstance));\n    };\n    return TimeoutOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TimeoutSubscriber = (function (_super) {\n    __extends(TimeoutSubscriber, _super);\n    function TimeoutSubscriber(destination, absoluteTimeout, waitFor, scheduler, errorInstance) {\n        _super.call(this, destination);\n        this.absoluteTimeout = absoluteTimeout;\n        this.waitFor = waitFor;\n        this.scheduler = scheduler;\n        this.errorInstance = errorInstance;\n        this.action = null;\n        this.scheduleTimeout();\n    }\n    TimeoutSubscriber.dispatchTimeout = function (subscriber) {\n        subscriber.error(subscriber.errorInstance);\n    };\n    TimeoutSubscriber.prototype.scheduleTimeout = function () {\n        var action = this.action;\n        if (action) {\n            // Recycle the action if we've already scheduled one. All the production\n            // Scheduler Actions mutate their state/delay time and return themeselves.\n            // VirtualActions are immutable, so they create and return a clone. In this\n            // case, we need to set the action reference to the most recent VirtualAction,\n            // to ensure that's the one we clone from next time.\n            this.action = action.schedule(this, this.waitFor);\n        }\n        else {\n            this.add(this.action = this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout, this.waitFor, this));\n        }\n    };\n    TimeoutSubscriber.prototype._next = function (value) {\n        if (!this.absoluteTimeout) {\n            this.scheduleTimeout();\n        }\n        _super.prototype._next.call(this, value);\n    };\n    TimeoutSubscriber.prototype._unsubscribe = function () {\n        this.action = null;\n        this.scheduler = null;\n        this.errorInstance = null;\n    };\n    return TimeoutSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=timeout.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\n/* tslint:enable:max-line-length */\n/**\n * Combines the source Observable with other Observables to create an Observable\n * whose values are calculated from the latest values of each, only when the\n * source emits.\n *\n * <span class=\"informal\">Whenever the source Observable emits a value, it\n * computes a formula using that value plus the latest values from other input\n * Observables, then emits the output of that formula.</span>\n *\n * <img src=\"./img/withLatestFrom.png\" width=\"100%\">\n *\n * `withLatestFrom` combines each value from the source Observable (the\n * instance) with the latest values from the other input Observables only when\n * the source emits a value, optionally using a `project` function to determine\n * the value to be emitted on the output Observable. All input Observables must\n * emit at least one value before the output Observable will emit a value.\n *\n * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var result = clicks.withLatestFrom(timer);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Function} [project] Projection function for combining values\n * together. Receives all values in order of the Observables passed, where the\n * first parameter is a value from the source Observable. (e.g.\n * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not\n * passed, arrays will be emitted on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method withLatestFrom\n * @owner Observable\n */\nfunction withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i - 0] = arguments[_i];\n    }\n    return function (source) {\n        var project;\n        if (typeof args[args.length - 1] === 'function') {\n            project = args.pop();\n        }\n        var observables = args;\n        return source.lift(new WithLatestFromOperator(observables, project));\n    };\n}\nexports.withLatestFrom = withLatestFrom;\nvar WithLatestFromOperator = (function () {\n    function WithLatestFromOperator(observables, project) {\n        this.observables = observables;\n        this.project = project;\n    }\n    WithLatestFromOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n    };\n    return WithLatestFromOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WithLatestFromSubscriber = (function (_super) {\n    __extends(WithLatestFromSubscriber, _super);\n    function WithLatestFromSubscriber(destination, observables, project) {\n        _super.call(this, destination);\n        this.observables = observables;\n        this.project = project;\n        this.toRespond = [];\n        var len = observables.length;\n        this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            this.toRespond.push(i);\n        }\n        for (var i = 0; i < len; i++) {\n            var observable = observables[i];\n            this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n        }\n    }\n    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        var toRespond = this.toRespond;\n        if (toRespond.length > 0) {\n            var found = toRespond.indexOf(outerIndex);\n            if (found !== -1) {\n                toRespond.splice(found, 1);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype.notifyComplete = function () {\n        // noop\n    };\n    WithLatestFromSubscriber.prototype._next = function (value) {\n        if (this.toRespond.length === 0) {\n            var args = [value].concat(this.values);\n            if (this.project) {\n                this._tryProject(args);\n            }\n            else {\n                this.destination.next(args);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return WithLatestFromSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=withLatestFrom.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = require('../observable/ArrayObservable');\nvar isArray_1 = require('../util/isArray');\nvar Subscriber_1 = require('../Subscriber');\nvar OuterSubscriber_1 = require('../OuterSubscriber');\nvar subscribeToResult_1 = require('../util/subscribeToResult');\nvar iterator_1 = require('../symbol/iterator');\n/* tslint:enable:max-line-length */\n/**\n * @param observables\n * @return {Observable<R>}\n * @method zip\n * @owner Observable\n */\nfunction zip() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    return function zipOperatorFunction(source) {\n        return source.lift.call(zipStatic.apply(void 0, [source].concat(observables)));\n    };\n}\nexports.zip = zip;\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each\n * of its input Observables.\n *\n * If the latest parameter is a function, this function is used to compute the created value from the input values.\n * Otherwise, an array of the input values is returned.\n *\n * @example <caption>Combine age and name from different sources</caption>\n *\n * let age$ = Observable.of<number>(27, 25, 29);\n * let name$ = Observable.of<string>('Foo', 'Bar', 'Beer');\n * let isDev$ = Observable.of<boolean>(true, true, false);\n *\n * Observable\n *     .zip(age$,\n *          name$,\n *          isDev$,\n *          (age: number, name: string, isDev: boolean) => ({ age, name, isDev }))\n *     .subscribe(x => console.log(x));\n *\n * // outputs\n * // { age: 27, name: 'Foo', isDev: true }\n * // { age: 25, name: 'Bar', isDev: true }\n * // { age: 29, name: 'Beer', isDev: false }\n *\n * @param observables\n * @return {Observable<R>}\n * @static true\n * @name zip\n * @owner Observable\n */\nfunction zipStatic() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i - 0] = arguments[_i];\n    }\n    var project = observables[observables.length - 1];\n    if (typeof project === 'function') {\n        observables.pop();\n    }\n    return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));\n}\nexports.zipStatic = zipStatic;\nvar ZipOperator = (function () {\n    function ZipOperator(project) {\n        this.project = project;\n    }\n    ZipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ZipSubscriber(subscriber, this.project));\n    };\n    return ZipOperator;\n}());\nexports.ZipOperator = ZipOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipSubscriber = (function (_super) {\n    __extends(ZipSubscriber, _super);\n    function ZipSubscriber(destination, project, values) {\n        if (values === void 0) { values = Object.create(null); }\n        _super.call(this, destination);\n        this.iterators = [];\n        this.active = 0;\n        this.project = (typeof project === 'function') ? project : null;\n        this.values = values;\n    }\n    ZipSubscriber.prototype._next = function (value) {\n        var iterators = this.iterators;\n        if (isArray_1.isArray(value)) {\n            iterators.push(new StaticArrayIterator(value));\n        }\n        else if (typeof value[iterator_1.iterator] === 'function') {\n            iterators.push(new StaticIterator(value[iterator_1.iterator]()));\n        }\n        else {\n            iterators.push(new ZipBufferIterator(this.destination, this, value));\n        }\n    };\n    ZipSubscriber.prototype._complete = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        if (len === 0) {\n            this.destination.complete();\n            return;\n        }\n        this.active = len;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (iterator.stillUnsubscribed) {\n                this.add(iterator.subscribe(iterator, i));\n            }\n            else {\n                this.active--; // not an observable\n            }\n        }\n    };\n    ZipSubscriber.prototype.notifyInactive = function () {\n        this.active--;\n        if (this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ZipSubscriber.prototype.checkIterators = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        var destination = this.destination;\n        // abort if not all of them have values\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n                return;\n            }\n        }\n        var shouldComplete = false;\n        var args = [];\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            var result = iterator.next();\n            // check to see if it's completed now that you've gotten\n            // the next value.\n            if (iterator.hasCompleted()) {\n                shouldComplete = true;\n            }\n            if (result.done) {\n                destination.complete();\n                return;\n            }\n            args.push(result.value);\n        }\n        if (this.project) {\n            this._tryProject(args);\n        }\n        else {\n            destination.next(args);\n        }\n        if (shouldComplete) {\n            destination.complete();\n        }\n    };\n    ZipSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return ZipSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ZipSubscriber = ZipSubscriber;\nvar StaticIterator = (function () {\n    function StaticIterator(iterator) {\n        this.iterator = iterator;\n        this.nextResult = iterator.next();\n    }\n    StaticIterator.prototype.hasValue = function () {\n        return true;\n    };\n    StaticIterator.prototype.next = function () {\n        var result = this.nextResult;\n        this.nextResult = this.iterator.next();\n        return result;\n    };\n    StaticIterator.prototype.hasCompleted = function () {\n        var nextResult = this.nextResult;\n        return nextResult && nextResult.done;\n    };\n    return StaticIterator;\n}());\nvar StaticArrayIterator = (function () {\n    function StaticArrayIterator(array) {\n        this.array = array;\n        this.index = 0;\n        this.length = 0;\n        this.length = array.length;\n    }\n    StaticArrayIterator.prototype[iterator_1.iterator] = function () {\n        return this;\n    };\n    StaticArrayIterator.prototype.next = function (value) {\n        var i = this.index++;\n        var array = this.array;\n        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n    };\n    StaticArrayIterator.prototype.hasValue = function () {\n        return this.array.length > this.index;\n    };\n    StaticArrayIterator.prototype.hasCompleted = function () {\n        return this.array.length === this.index;\n    };\n    return StaticArrayIterator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipBufferIterator = (function (_super) {\n    __extends(ZipBufferIterator, _super);\n    function ZipBufferIterator(destination, parent, observable) {\n        _super.call(this, destination);\n        this.parent = parent;\n        this.observable = observable;\n        this.stillUnsubscribed = true;\n        this.buffer = [];\n        this.isComplete = false;\n    }\n    ZipBufferIterator.prototype[iterator_1.iterator] = function () {\n        return this;\n    };\n    // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next\n    //    this is legit because `next()` will never be called by a subscription in this case.\n    ZipBufferIterator.prototype.next = function () {\n        var buffer = this.buffer;\n        if (buffer.length === 0 && this.isComplete) {\n            return { value: null, done: true };\n        }\n        else {\n            return { value: buffer.shift(), done: false };\n        }\n    };\n    ZipBufferIterator.prototype.hasValue = function () {\n        return this.buffer.length > 0;\n    };\n    ZipBufferIterator.prototype.hasCompleted = function () {\n        return this.buffer.length === 0 && this.isComplete;\n    };\n    ZipBufferIterator.prototype.notifyComplete = function () {\n        if (this.buffer.length > 0) {\n            this.isComplete = true;\n            this.parent.notifyInactive();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.buffer.push(innerValue);\n        this.parent.checkIterators();\n    };\n    ZipBufferIterator.prototype.subscribe = function (value, index) {\n        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);\n    };\n    return ZipBufferIterator;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=zip.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = require('../Subscription');\n/**\n * A unit of work to be executed in a {@link Scheduler}. An action is typically\n * created from within a Scheduler and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action<T> extends Subscription {\n *   new (scheduler: Scheduler, work: (state?: T) => void);\n *   schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action<T>\n */\nvar Action = (function (_super) {\n    __extends(Action, _super);\n    function Action(scheduler, work) {\n        _super.call(this);\n    }\n    /**\n     * Schedules this action on its parent Scheduler for execution. May be passed\n     * some context object, `state`. May happen at some point in the future,\n     * according to the `delay` parameter, if specified.\n     * @param {T} [state] Some contextual data that the `work` function uses when\n     * called by the Scheduler.\n     * @param {number} [delay] Time to wait before executing the work, where the\n     * time unit is implicit and defined by the Scheduler.\n     * @return {void}\n     */\n    Action.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        return this;\n    };\n    return Action;\n}(Subscription_1.Subscription));\nexports.Action = Action;\n//# sourceMappingURL=Action.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = require('../util/root');\nvar Action_1 = require('./Action');\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AsyncAction = (function (_super) {\n    __extends(AsyncAction, _super);\n    function AsyncAction(scheduler, work) {\n        _super.call(this, scheduler, work);\n        this.scheduler = scheduler;\n        this.work = work;\n        this.pending = false;\n    }\n    AsyncAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (this.closed) {\n            return this;\n        }\n        // Always replace the current state with the new state.\n        this.state = state;\n        // Set the pending flag indicating that this action has been scheduled, or\n        // has recursively rescheduled itself.\n        this.pending = true;\n        var id = this.id;\n        var scheduler = this.scheduler;\n        //\n        // Important implementation note:\n        //\n        // Actions only execute once by default, unless rescheduled from within the\n        // scheduled callback. This allows us to implement single and repeat\n        // actions via the same code path, without adding API surface area, as well\n        // as mimic traditional recursion but across asynchronous boundaries.\n        //\n        // However, JS runtimes and timers distinguish between intervals achieved by\n        // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n        // serial `setTimeout` calls can be individually delayed, which delays\n        // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n        // guarantee the interval callback will be invoked more precisely to the\n        // interval period, regardless of load.\n        //\n        // Therefore, we use `setInterval` to schedule single and repeat actions.\n        // If the action reschedules itself with the same delay, the interval is not\n        // canceled. If the action doesn't reschedule, or reschedules with a\n        // different delay, the interval will be canceled after scheduled callback\n        // execution.\n        //\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, delay);\n        }\n        this.delay = delay;\n        // If this action has already an async Id, don't request a new one.\n        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n        return this;\n    };\n    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);\n    };\n    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        // If this action is rescheduled with the same delay time, don't clear the interval id.\n        if (delay !== null && this.delay === delay && this.pending === false) {\n            return id;\n        }\n        // Otherwise, if the action's delay time is different from the current delay,\n        // or the action has been rescheduled before it's executed, clear the interval id\n        return root_1.root.clearInterval(id) && undefined || undefined;\n    };\n    /**\n     * Immediately executes this action and the `work` it contains.\n     * @return {any}\n     */\n    AsyncAction.prototype.execute = function (state, delay) {\n        if (this.closed) {\n            return new Error('executing a cancelled action');\n        }\n        this.pending = false;\n        var error = this._execute(state, delay);\n        if (error) {\n            return error;\n        }\n        else if (this.pending === false && this.id != null) {\n            // Dequeue if the action didn't reschedule itself. Don't call\n            // unsubscribe(), because the action could reschedule later.\n            // For example:\n            // ```\n            // scheduler.schedule(function doWork(counter) {\n            //   /* ... I'm a busy worker bee ... */\n            //   var originalAction = this;\n            //   /* wait 100ms before rescheduling the action */\n            //   setTimeout(function () {\n            //     originalAction.schedule(counter + 1);\n            //   }, 100);\n            // }, 1000);\n            // ```\n            this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n        }\n    };\n    AsyncAction.prototype._execute = function (state, delay) {\n        var errored = false;\n        var errorValue = undefined;\n        try {\n            this.work(state);\n        }\n        catch (e) {\n            errored = true;\n            errorValue = !!e && e || new Error(e);\n        }\n        if (errored) {\n            this.unsubscribe();\n            return errorValue;\n        }\n    };\n    AsyncAction.prototype._unsubscribe = function () {\n        var id = this.id;\n        var scheduler = this.scheduler;\n        var actions = scheduler.actions;\n        var index = actions.indexOf(this);\n        this.work = null;\n        this.state = null;\n        this.pending = false;\n        this.scheduler = null;\n        if (index !== -1) {\n            actions.splice(index, 1);\n        }\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, null);\n        }\n        this.delay = null;\n    };\n    return AsyncAction;\n}(Action_1.Action));\nexports.AsyncAction = AsyncAction;\n//# sourceMappingURL=AsyncAction.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Scheduler_1 = require('../Scheduler');\nvar AsyncScheduler = (function (_super) {\n    __extends(AsyncScheduler, _super);\n    function AsyncScheduler() {\n        _super.apply(this, arguments);\n        this.actions = [];\n        /**\n         * A flag to indicate whether the Scheduler is currently executing a batch of\n         * queued actions.\n         * @type {boolean}\n         */\n        this.active = false;\n        /**\n         * An internal ID used to track the latest asynchronous task such as those\n         * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n         * others.\n         * @type {any}\n         */\n        this.scheduled = undefined;\n    }\n    AsyncScheduler.prototype.flush = function (action) {\n        var actions = this.actions;\n        if (this.active) {\n            actions.push(action);\n            return;\n        }\n        var error;\n        this.active = true;\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (action = actions.shift()); // exhaust the scheduler queue\n        this.active = false;\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsyncScheduler;\n}(Scheduler_1.Scheduler));\nexports.AsyncScheduler = AsyncScheduler;\n//# sourceMappingURL=AsyncScheduler.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an Observable or a sequence was queried but has no\n * elements.\n *\n * @see {@link first}\n * @see {@link last}\n * @see {@link single}\n *\n * @class EmptyError\n */\nvar EmptyError = (function (_super) {\n    __extends(EmptyError, _super);\n    function EmptyError() {\n        var err = _super.call(this, 'no elements in sequence');\n        this.name = err.name = 'EmptyError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return EmptyError;\n}(Error));\nexports.EmptyError = EmptyError;\n//# sourceMappingURL=EmptyError.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nvar ObjectUnsubscribedError = (function (_super) {\n    __extends(ObjectUnsubscribedError, _super);\n    function ObjectUnsubscribedError() {\n        var err = _super.call(this, 'object unsubscribed');\n        this.name = err.name = 'ObjectUnsubscribedError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return ObjectUnsubscribedError;\n}(Error));\nexports.ObjectUnsubscribedError = ObjectUnsubscribedError;\n//# sourceMappingURL=ObjectUnsubscribedError.js.map",
     "\"use strict\";\nvar root_1 = require('./root');\nfunction minimalSetImpl() {\n    // THIS IS NOT a full impl of Set, this is just the minimum\n    // bits of functionality we need for this library.\n    return (function () {\n        function MinimalSet() {\n            this._values = [];\n        }\n        MinimalSet.prototype.add = function (value) {\n            if (!this.has(value)) {\n                this._values.push(value);\n            }\n        };\n        MinimalSet.prototype.has = function (value) {\n            return this._values.indexOf(value) !== -1;\n        };\n        Object.defineProperty(MinimalSet.prototype, \"size\", {\n            get: function () {\n                return this._values.length;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        MinimalSet.prototype.clear = function () {\n            this._values.length = 0;\n        };\n        return MinimalSet;\n    }());\n}\nexports.minimalSetImpl = minimalSetImpl;\nexports.Set = root_1.root.Set || minimalSetImpl();\n//# sourceMappingURL=Set.js.map",
+    "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when duetime elapses.\n *\n * @see {@link timeout}\n *\n * @class TimeoutError\n */\nvar TimeoutError = (function (_super) {\n    __extends(TimeoutError, _super);\n    function TimeoutError() {\n        var err = _super.call(this, 'Timeout has occurred');\n        this.name = err.name = 'TimeoutError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return TimeoutError;\n}(Error));\nexports.TimeoutError = TimeoutError;\n//# sourceMappingURL=TimeoutError.js.map",
     "\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nvar UnsubscriptionError = (function (_super) {\n    __extends(UnsubscriptionError, _super);\n    function UnsubscriptionError(errors) {\n        _super.call(this);\n        this.errors = errors;\n        var err = Error.call(this, errors ?\n            errors.length + \" errors occurred during unsubscription:\\n  \" + errors.map(function (err, i) { return ((i + 1) + \") \" + err.toString()); }).join('\\n  ') : '');\n        this.name = err.name = 'UnsubscriptionError';\n        this.stack = err.stack;\n        this.message = err.message;\n    }\n    return UnsubscriptionError;\n}(Error));\nexports.UnsubscriptionError = UnsubscriptionError;\n//# sourceMappingURL=UnsubscriptionError.js.map",
     "\"use strict\";\n// typeof any so that it we don't have to cast when comparing a result to the error object\nexports.errorObject = { e: {} };\n//# sourceMappingURL=errorObject.js.map",
+    "\"use strict\";\nfunction identity(x) {\n    return x;\n}\nexports.identity = identity;\n//# sourceMappingURL=identity.js.map",
     "\"use strict\";\nexports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });\n//# sourceMappingURL=isArray.js.map",
     "\"use strict\";\nexports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; });\n//# sourceMappingURL=isArrayLike.js.map",
     "\"use strict\";\nfunction isDate(value) {\n    return value instanceof Date && !isNaN(+value);\n}\nexports.isDate = isDate;\n//# sourceMappingURL=isDate.js.map",
     "\"use strict\";\nfunction isObject(x) {\n    return x != null && typeof x === 'object';\n}\nexports.isObject = isObject;\n//# sourceMappingURL=isObject.js.map",
     "\"use strict\";\nfunction isPromise(value) {\n    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';\n}\nexports.isPromise = isPromise;\n//# sourceMappingURL=isPromise.js.map",
     "\"use strict\";\nfunction isScheduler(value) {\n    return value && typeof value.schedule === 'function';\n}\nexports.isScheduler = isScheduler;\n//# sourceMappingURL=isScheduler.js.map",
+    "\"use strict\";\n/* tslint:disable:no-empty */\nfunction noop() { }\nexports.noop = noop;\n//# sourceMappingURL=noop.js.map",
+    "\"use strict\";\nvar noop_1 = require('./noop');\n/* tslint:enable:max-line-length */\nfunction pipe() {\n    var fns = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        fns[_i - 0] = arguments[_i];\n    }\n    return pipeFromArray(fns);\n}\nexports.pipe = pipe;\n/* @internal */\nfunction pipeFromArray(fns) {\n    if (!fns) {\n        return noop_1.noop;\n    }\n    if (fns.length === 1) {\n        return fns[0];\n    }\n    return function piped(input) {\n        return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n    };\n}\nexports.pipeFromArray = pipeFromArray;\n//# sourceMappingURL=pipe.js.map",
     "\"use strict\";\n// CommonJS / Node have global context exposed as \"global\" variable.\n// We don't want to include the whole node.d.ts this this compilation unit so we'll just fake\n// the global \"global\" var for now.\nvar __window = typeof window !== 'undefined' && window;\nvar __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&\n    self instanceof WorkerGlobalScope && self;\nvar __global = typeof global !== 'undefined' && global;\nvar _root = __window || __global || __self;\nexports.root = _root;\n// Workaround Closure Compiler restriction: The body of a goog.module cannot use throw.\n// This is needed when used with angular/tsickle which inserts a goog.module statement.\n// Wrap in IIFE\n(function () {\n    if (!_root) {\n        throw new Error('RxJS could not find any global context (window, self, global)');\n    }\n})();\n//# sourceMappingURL=root.js.map",
-    "\"use strict\";\nvar root_1 = require('./root');\nvar isArrayLike_1 = require('./isArrayLike');\nvar isPromise_1 = require('./isPromise');\nvar isObject_1 = require('./isObject');\nvar Observable_1 = require('../Observable');\nvar iterator_1 = require('../symbol/iterator');\nvar InnerSubscriber_1 = require('../InnerSubscriber');\nvar observable_1 = require('../symbol/observable');\nfunction subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {\n    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);\n    if (destination.closed) {\n        return null;\n    }\n    if (result instanceof Observable_1.Observable) {\n        if (result._isScalar) {\n            destination.next(result.value);\n            destination.complete();\n            return null;\n        }\n        else {\n            return result.subscribe(destination);\n        }\n    }\n    else if (isArrayLike_1.isArrayLike(result)) {\n        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {\n            destination.next(result[i]);\n        }\n        if (!destination.closed) {\n            destination.complete();\n        }\n    }\n    else if (isPromise_1.isPromise(result)) {\n        result.then(function (value) {\n            if (!destination.closed) {\n                destination.next(value);\n                destination.complete();\n            }\n        }, function (err) { return destination.error(err); })\n            .then(null, function (err) {\n            // Escaping the Promise trap: globally throw unhandled errors\n            root_1.root.setTimeout(function () { throw err; });\n        });\n        return destination;\n    }\n    else if (result && typeof result[iterator_1.iterator] === 'function') {\n        var iterator = result[iterator_1.iterator]();\n        do {\n            var item = iterator.next();\n            if (item.done) {\n                destination.complete();\n                break;\n            }\n            destination.next(item.value);\n            if (destination.closed) {\n                break;\n            }\n        } while (true);\n    }\n    else if (result && typeof result[observable_1.observable] === 'function') {\n        var obs = result[observable_1.observable]();\n        if (typeof obs.subscribe !== 'function') {\n            destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));\n        }\n        else {\n            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));\n        }\n    }\n    else {\n        var value = isObject_1.isObject(result) ? 'an invalid object' : \"'\" + result + \"'\";\n        var msg = (\"You provided \" + value + \" where a stream was expected.\")\n            + ' You can provide an Observable, Promise, Array, or Iterable.';\n        destination.error(new TypeError(msg));\n    }\n    return null;\n}\nexports.subscribeToResult = subscribeToResult;\n//# sourceMappingURL=subscribeToResult.js.map",
+    "\"use strict\";\nvar root_1 = require('./root');\nvar isArrayLike_1 = require('./isArrayLike');\nvar isPromise_1 = require('./isPromise');\nvar isObject_1 = require('./isObject');\nvar Observable_1 = require('../Observable');\nvar iterator_1 = require('../symbol/iterator');\nvar InnerSubscriber_1 = require('../InnerSubscriber');\nvar observable_1 = require('../symbol/observable');\nfunction subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {\n    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);\n    if (destination.closed) {\n        return null;\n    }\n    if (result instanceof Observable_1.Observable) {\n        if (result._isScalar) {\n            destination.next(result.value);\n            destination.complete();\n            return null;\n        }\n        else {\n            destination.syncErrorThrowable = true;\n            return result.subscribe(destination);\n        }\n    }\n    else if (isArrayLike_1.isArrayLike(result)) {\n        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {\n            destination.next(result[i]);\n        }\n        if (!destination.closed) {\n            destination.complete();\n        }\n    }\n    else if (isPromise_1.isPromise(result)) {\n        result.then(function (value) {\n            if (!destination.closed) {\n                destination.next(value);\n                destination.complete();\n            }\n        }, function (err) { return destination.error(err); })\n            .then(null, function (err) {\n            // Escaping the Promise trap: globally throw unhandled errors\n            root_1.root.setTimeout(function () { throw err; });\n        });\n        return destination;\n    }\n    else if (result && typeof result[iterator_1.iterator] === 'function') {\n        var iterator = result[iterator_1.iterator]();\n        do {\n            var item = iterator.next();\n            if (item.done) {\n                destination.complete();\n                break;\n            }\n            destination.next(item.value);\n            if (destination.closed) {\n                break;\n            }\n        } while (true);\n    }\n    else if (result && typeof result[observable_1.observable] === 'function') {\n        var obs = result[observable_1.observable]();\n        if (typeof obs.subscribe !== 'function') {\n            destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));\n        }\n        else {\n            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));\n        }\n    }\n    else {\n        var value = isObject_1.isObject(result) ? 'an invalid object' : \"'\" + result + \"'\";\n        var msg = (\"You provided \" + value + \" where a stream was expected.\")\n            + ' You can provide an Observable, Promise, Array, or Iterable.';\n        destination.error(new TypeError(msg));\n    }\n    return null;\n}\nexports.subscribeToResult = subscribeToResult;\n//# sourceMappingURL=subscribeToResult.js.map",
     "\"use strict\";\nvar Subscriber_1 = require('../Subscriber');\nvar rxSubscriber_1 = require('../symbol/rxSubscriber');\nvar Observer_1 = require('../Observer');\nfunction toSubscriber(nextOrObserver, error, complete) {\n    if (nextOrObserver) {\n        if (nextOrObserver instanceof Subscriber_1.Subscriber) {\n            return nextOrObserver;\n        }\n        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {\n            return nextOrObserver[rxSubscriber_1.rxSubscriber]();\n        }\n    }\n    if (!nextOrObserver && !error && !complete) {\n        return new Subscriber_1.Subscriber(Observer_1.empty);\n    }\n    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n}\nexports.toSubscriber = toSubscriber;\n//# sourceMappingURL=toSubscriber.js.map",
     "\"use strict\";\nvar errorObject_1 = require('./errorObject');\nvar tryCatchTarget;\nfunction tryCatcher() {\n    try {\n        return tryCatchTarget.apply(this, arguments);\n    }\n    catch (e) {\n        errorObject_1.errorObject.e = e;\n        return errorObject_1.errorObject;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n;\n//# sourceMappingURL=tryCatch.js.map",
-    "// threejs.org/license\n(function(l,xa){\"object\"===typeof exports&&\"undefined\"!==typeof module?xa(exports):\"function\"===typeof define&&define.amd?define([\"exports\"],xa):xa(l.THREE=l.THREE||{})})(this,function(l){function xa(){}function C(a,b){this.x=a||0;this.y=b||0}function ba(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,\"id\",{value:hf++});this.uuid=Y.generateUUID();this.name=\"\";this.image=void 0!==a?a:ba.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ba.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=\nvoid 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function fa(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Cb(a,b,c){this.uuid=Y.generateUUID();this.width=\na;this.height=b;this.scissor=new fa(0,0,a,b);this.scissorTest=!1;this.viewport=new fa(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ba(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Db(a,b,c){Cb.call(this,a,b,c);this.activeMipMapLevel=\nthis.activeCubeFace=0}function oa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error(\"THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.\")}function db(a,b,c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==\nm?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Xa(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];ba.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Eb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=xe[e];void 0===f&&(f=new Float32Array(e),xe[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function ye(a,b){var c=ze[b];void 0===c&&(c=new Int32Array(b),ze[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}\nfunction jf(a,b){a.uniform1f(this.addr,b)}function kf(a,b){a.uniform1i(this.addr,b)}function lf(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function mf(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function nf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function of(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function pf(a,b){void 0===b.elements?\na.uniformMatrix3fv(this.addr,!1,b):(Ae.set(b.elements),a.uniformMatrix3fv(this.addr,!1,Ae))}function qf(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Be.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Be))}function rf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||Ce,d)}function sf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||De,d)}function Ee(a,b){a.uniform2iv(this.addr,b)}function Fe(a,b){a.uniform3iv(this.addr,b)}function Ge(a,\nb){a.uniform4iv(this.addr,b)}function tf(a){switch(a){case 5126:return jf;case 35664:return lf;case 35665:return mf;case 35666:return nf;case 35674:return of;case 35675:return pf;case 35676:return qf;case 35678:case 36198:return rf;case 35680:return sf;case 5124:case 35670:return kf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function uf(a,b){a.uniform1fv(this.addr,b)}function vf(a,b){a.uniform1iv(this.addr,b)}function wf(a,b){a.uniform2fv(this.addr,\nEb(b,this.size,2))}function xf(a,b){a.uniform3fv(this.addr,Eb(b,this.size,3))}function yf(a,b){a.uniform4fv(this.addr,Eb(b,this.size,4))}function zf(a,b){a.uniformMatrix2fv(this.addr,!1,Eb(b,this.size,4))}function Af(a,b){a.uniformMatrix3fv(this.addr,!1,Eb(b,this.size,9))}function Bf(a,b){a.uniformMatrix4fv(this.addr,!1,Eb(b,this.size,16))}function Cf(a,b,c){var d=b.length,e=ye(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||Ce,e[a])}function Df(a,b,c){var d=b.length,e=ye(c,\nd);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||De,e[a])}function Ef(a){switch(a){case 5126:return uf;case 35664:return wf;case 35665:return xf;case 35666:return yf;case 35674:return zf;case 35675:return Af;case 35676:return Bf;case 35678:return Cf;case 35680:return Df;case 5124:case 35670:return vf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function Ff(a,b,c){this.id=a;this.addr=c;this.setValue=tf(b.type)}function Gf(a,b,\nc){this.id=a;this.addr=c;this.size=b.size;this.setValue=Ef(b.type)}function He(a){this.id=a;this.seq=[];this.map={}}function eb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(Pd.lastIndex=0;;){var m=Pd.exec(h),q=Pd.lastIndex,v=m[1],p=m[3];\"]\"===m[2]&&(v|=0);if(void 0===p||\"[\"===p&&q+2===k){h=g;e=void 0===p?new Ff(v,e,f):new Gf(v,e,f);h.seq.push(e);\nh.map[e.id]=e;break}else p=g.map[v],void 0===p&&(p=new He(v),v=g,g=p,v.seq.push(g),v.map[g.id]=g),g=p}}}function G(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function fd(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function Hf(a,b){var c,d,e,f,g,h,k,m,q,v,p=a.context,r=a.state,l,t,y,x,u,H;this.render=function(w,I,W){if(0!==b.length){w=new n;var D=W.w/W.z,O=.5*W.z,aa=.5*W.w,F=16/W.w,ja=new C(F*D,F),T=new n(1,1,0),fb=new C(1,\n1),Ya=new fd;Ya.min.set(W.x,W.y);Ya.max.set(W.x+(W.z-16),W.y+(W.w-16));if(void 0===x){var F=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),ka=new Uint16Array([0,1,2,0,2,3]);l=p.createBuffer();t=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,l);p.bufferData(p.ARRAY_BUFFER,F,p.STATIC_DRAW);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);p.bufferData(p.ELEMENT_ARRAY_BUFFER,ka,p.STATIC_DRAW);u=p.createTexture();H=p.createTexture();r.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGB,16,16,0,\np.RGB,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);r.bindTexture(p.TEXTURE_2D,H);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,16,16,0,p.RGBA,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);\np.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);var F=y={vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif ( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility =        visibility.r / 9.0;\\nvVisibility *= 1.0 - visibility.g / 9.0;\\nvVisibility *=       visibility.b / 9.0;\\nvVisibility *= 1.0 - visibility.a / 9.0;\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",\nfragmentShader:\"uniform lowp int renderType;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif ( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if ( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},ka=p.createProgram(),P=p.createShader(p.FRAGMENT_SHADER),\nM=p.createShader(p.VERTEX_SHADER),V=\"precision \"+a.getPrecision()+\" float;\\n\";p.shaderSource(P,V+F.fragmentShader);p.shaderSource(M,V+F.vertexShader);p.compileShader(P);p.compileShader(M);p.attachShader(ka,P);p.attachShader(ka,M);p.linkProgram(ka);x=ka;q=p.getAttribLocation(x,\"position\");v=p.getAttribLocation(x,\"uv\");c=p.getUniformLocation(x,\"renderType\");d=p.getUniformLocation(x,\"map\");e=p.getUniformLocation(x,\"occlusionMap\");f=p.getUniformLocation(x,\"opacity\");g=p.getUniformLocation(x,\"color\");\nh=p.getUniformLocation(x,\"scale\");k=p.getUniformLocation(x,\"rotation\");m=p.getUniformLocation(x,\"screenPosition\")}p.useProgram(x);r.initAttributes();r.enableAttribute(q);r.enableAttribute(v);r.disableUnusedAttributes();p.uniform1i(e,0);p.uniform1i(d,1);p.bindBuffer(p.ARRAY_BUFFER,l);p.vertexAttribPointer(q,2,p.FLOAT,!1,16,0);p.vertexAttribPointer(v,2,p.FLOAT,!1,16,8);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);r.disable(p.CULL_FACE);r.buffers.depth.setMask(!1);ka=0;for(P=b.length;ka<P;ka++)if(F=16/W.w,\nja.set(F*D,F),M=b[ka],w.set(M.matrixWorld.elements[12],M.matrixWorld.elements[13],M.matrixWorld.elements[14]),w.applyMatrix4(I.matrixWorldInverse),w.applyMatrix4(I.projectionMatrix),T.copy(w),fb.x=W.x+T.x*O+O-8,fb.y=W.y+T.y*aa+aa-8,!0===Ya.containsPoint(fb)){r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,null);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGB,fb.x,fb.y,16,16,0);p.uniform1i(c,0);p.uniform2f(h,ja.x,ja.y);p.uniform3f(m,T.x,T.y,T.z);\nr.disable(p.BLEND);r.enable(p.DEPTH_TEST);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,H);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGBA,fb.x,fb.y,16,16,0);p.uniform1i(c,1);r.disable(p.DEPTH_TEST);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);M.positionScreen.copy(T);M.customUpdateCallback?M.customUpdateCallback(M):M.updateLensFlares();p.uniform1i(c,2);r.enable(p.BLEND);for(var V=0,pa=M.lensFlares.length;V<\npa;V++){var S=M.lensFlares[V];.001<S.opacity&&.001<S.scale&&(T.x=S.x,T.y=S.y,T.z=S.z,F=S.size*S.scale/W.w,ja.x=F*D,ja.y=F,p.uniform3f(m,T.x,T.y,T.z),p.uniform2f(h,ja.x,ja.y),p.uniform1f(k,S.rotation),p.uniform1f(f,S.opacity),p.uniform3f(g,S.color.r,S.color.g,S.color.b),r.setBlending(S.blending,S.blendEquation,S.blendSrc,S.blendDst),a.setTexture2D(S.texture,1),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0))}}r.enable(p.CULL_FACE);r.enable(p.DEPTH_TEST);r.buffers.depth.setMask(!0);a.resetGLState()}}}\nfunction If(a,b){var c,d,e,f,g,h,k,m,q,v,p,r,l,t,y,x,u;function H(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var w=a.context,I=a.state,W,D,O,aa,F=new n,ja=new oa,T=new n;this.render=function(n,Ya){if(0!==b.length){if(void 0===O){var ka=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),P=new Uint16Array([0,1,2,0,2,3]);W=w.createBuffer();D=w.createBuffer();w.bindBuffer(w.ARRAY_BUFFER,W);w.bufferData(w.ARRAY_BUFFER,ka,w.STATIC_DRAW);\nw.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.bufferData(w.ELEMENT_ARRAY_BUFFER,P,w.STATIC_DRAW);var ka=w.createProgram(),P=w.createShader(w.VERTEX_SHADER),M=w.createShader(w.FRAGMENT_SHADER);w.shaderSource(P,[\"precision \"+a.getPrecision()+\" float;\",\"#define SHADER_NAME SpriteMaterial\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position * scale;\\nvec2 rotatedPosition;\\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\nvec4 finalPosition;\\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition;\\nfinalPosition = projectionMatrix * finalPosition;\\ngl_Position = finalPosition;\\n}\"].join(\"\\n\"));\nw.shaderSource(M,[\"precision \"+a.getPrecision()+\" float;\",\"#define SHADER_NAME SpriteMaterial\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int fogType;\\nuniform vec3 fogColor;\\nuniform float fogDensity;\\nuniform float fogNear;\\nuniform float fogFar;\\nuniform float alphaTest;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\nif ( texture.a < alphaTest ) discard;\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\nif ( fogType > 0 ) {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat fogFactor = 0.0;\\nif ( fogType == 1 ) {\\nfogFactor = smoothstep( fogNear, fogFar, depth );\\n} else {\\nconst float LOG2 = 1.442695;\\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n}\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n}\\n}\"].join(\"\\n\"));\nw.compileShader(P);w.compileShader(M);w.attachShader(ka,P);w.attachShader(ka,M);w.linkProgram(ka);O=ka;x=w.getAttribLocation(O,\"position\");u=w.getAttribLocation(O,\"uv\");c=w.getUniformLocation(O,\"uvOffset\");d=w.getUniformLocation(O,\"uvScale\");e=w.getUniformLocation(O,\"rotation\");f=w.getUniformLocation(O,\"scale\");g=w.getUniformLocation(O,\"color\");h=w.getUniformLocation(O,\"map\");k=w.getUniformLocation(O,\"opacity\");m=w.getUniformLocation(O,\"modelViewMatrix\");q=w.getUniformLocation(O,\"projectionMatrix\");\nv=w.getUniformLocation(O,\"fogType\");p=w.getUniformLocation(O,\"fogDensity\");r=w.getUniformLocation(O,\"fogNear\");l=w.getUniformLocation(O,\"fogFar\");t=w.getUniformLocation(O,\"fogColor\");y=w.getUniformLocation(O,\"alphaTest\");ka=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");ka.width=8;ka.height=8;P=ka.getContext(\"2d\");P.fillStyle=\"white\";P.fillRect(0,0,8,8);aa=new ba(ka);aa.needsUpdate=!0}w.useProgram(O);I.initAttributes();I.enableAttribute(x);I.enableAttribute(u);I.disableUnusedAttributes();\nI.disable(w.CULL_FACE);I.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,W);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(u,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.uniformMatrix4fv(q,!1,Ya.projectionMatrix.elements);I.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ka=0;(M=n.fog)?(w.uniform3f(t,M.color.r,M.color.g,M.color.b),M.isFog?(w.uniform1f(r,M.near),w.uniform1f(l,M.far),w.uniform1i(v,1),P=ka=1):M.isFogExp2&&(w.uniform1f(p,M.density),w.uniform1i(v,2),P=ka=2)):\n(w.uniform1i(v,0),P=ka=0);for(var M=0,V=b.length;M<V;M++){var pa=b[M];pa.modelViewMatrix.multiplyMatrices(Ya.matrixWorldInverse,pa.matrixWorld);pa.z=-pa.modelViewMatrix.elements[14]}b.sort(H);for(var S=[],M=0,V=b.length;M<V;M++){var pa=b[M],N=pa.material;if(!1!==N.visible){pa.onBeforeRender(a,n,Ya,void 0,N,void 0);w.uniform1f(y,N.alphaTest);w.uniformMatrix4fv(m,!1,pa.modelViewMatrix.elements);pa.matrixWorld.decompose(F,ja,T);S[0]=T.x;S[1]=T.y;var C=0;n.fog&&N.fog&&(C=P);ka!==C&&(w.uniform1i(v,C),\nka=C);null!==N.map?(w.uniform2f(c,N.map.offset.x,N.map.offset.y),w.uniform2f(d,N.map.repeat.x,N.map.repeat.y)):(w.uniform2f(c,0,0),w.uniform2f(d,1,1));w.uniform1f(k,N.opacity);w.uniform3f(g,N.color.r,N.color.g,N.color.b);w.uniform1f(e,N.rotation);w.uniform2fv(f,S);I.setBlending(N.blending,N.blendEquation,N.blendSrc,N.blendDst,N.blendEquationAlpha,N.blendSrcAlpha,N.blendDstAlpha,N.premultipliedAlpha);I.buffers.depth.setTest(N.depthTest);I.buffers.depth.setMask(N.depthWrite);N.map?a.setTexture2D(N.map,\n0):a.setTexture2D(aa,0);w.drawElements(w.TRIANGLES,6,w.UNSIGNED_SHORT,0);pa.onAfterRender(a,n,Ya,void 0,N,void 0)}}I.enable(w.CULL_FACE);a.resetGLState()}}}function U(){Object.defineProperty(this,\"id\",{value:Jf++});this.uuid=Y.generateUUID();this.name=\"\";this.type=\"Material\";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=\nnull;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.needsUpdate=this.visible=!0}function ra(a){U.call(this);this.type=\"ShaderMaterial\";this.defines={};this.uniforms={};this.vertexShader=\"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\nthis.fragmentShader=\"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error(\"THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.\"),\nthis.setValues(a))}function Za(a){U.call(this);this.type=\"MeshDepthMaterial\";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Ra(a,b){this.min=void 0!==a?a:new n(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new n(-Infinity,-Infinity,-Infinity)}function Ea(a,b){this.center=void 0!==a?a:new n;this.radius=\nvoid 0!==b?b:0}function Ba(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error(\"THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.\")}function Aa(a,b){this.normal=void 0!==a?a:new n(1,0,0);this.constant=void 0!==b?b:0}function gd(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Aa,void 0!==b?b:new Aa,void 0!==c?c:new Aa,void 0!==d?d:new Aa,void 0!==e?e:new Aa,void 0!==f?f:new Aa]}function Ie(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=t;var h=b.customDepthMaterial;\nd&&(g=y,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length:f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn(\"THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:\",b),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=\ng.uuid,h=c.uuid,b=x[f],void 0===b&&(b={},x[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;F.renderSingleSided&&2==h&&(h=0);F.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth=c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(b,d,g,h){if(!1!==b.visible){if(b.layers.test(d.layers)&&\n(b.isMesh||b.isLine||b.isPoints)&&b.castShadow&&(!b.frustumCulled||k.intersectsObject(b))){b.modelViewMatrix.multiplyMatrices(g.matrixWorldInverse,b.matrixWorld);var m=c.update(b),p=b.material;if(Array.isArray(p))for(var q=m.groups,v=0,r=q.length;v<r;v++){var u=q[v],w=p[u.materialIndex];w&&w.visible&&(w=e(b,w,h,l),a.renderBufferDirect(g,null,m,w,b,u))}else p.visible&&(w=e(b,p,h,l),a.renderBufferDirect(g,null,m,w,b,null))}b=b.children;m=0;for(p=b.length;m<p;m++)f(b[m],d,g,h)}}var g=a.context,h=a.state,\nk=new gd,m=new K,q=b.shadows,v=new C,p=new C(d.maxTextureSize,d.maxTextureSize),r=new n,l=new n,t=Array(4),y=Array(4),x={},u=[new n(1,0,0),new n(-1,0,0),new n(0,0,1),new n(0,0,-1),new n(0,1,0),new n(0,-1,0)],H=[new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,0,1),new n(0,0,-1)],w=[new fa,new fa,new fa,new fa,new fa,new fa];b=new Za;b.depthPacking=3201;b.clipping=!0;d=$a.distanceRGBA;for(var I=Ca.clone(d.uniforms),W=0;4!==W;++W){var D=0!==(W&1),O=0!==(W&2),aa=b.clone();aa.morphTargets=\nD;aa.skinning=O;t[W]=aa;D=new ra({defines:{USE_SHADOWMAP:\"\"},uniforms:I,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:D,skinning:O,clipping:!0});y[W]=D}var F=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,c){if(!1!==F.enabled&&(!1!==F.autoUpdate||!1!==F.needsUpdate)&&0!==q.length){h.disable(g.BLEND);h.buffers.color.setClear(1,1,1,1);h.buffers.depth.setTest(!0);h.setScissorTest(!1);\nfor(var d,e=0,t=q.length;e<t;e++){var n=q[e];d=n.shadow;var y=n&&n.isPointLight;if(void 0===d)console.warn(\"THREE.WebGLShadowMap:\",n,\"has no shadow.\");else{var x=d.camera;v.copy(d.mapSize);v.min(p);if(y){var D=v.x,I=v.y;w[0].set(2*D,I,D,I);w[1].set(0,I,D,I);w[2].set(3*D,I,D,I);w[3].set(D,I,D,I);w[4].set(3*D,0,D,I);w[5].set(D,0,D,I);v.x*=4;v.y*=2}null===d.map&&(d.map=new Cb(v.x,v.y,{minFilter:1003,magFilter:1003,format:1023}),d.map.texture.name=n.name+\".shadowMap\",x.updateProjectionMatrix());d.isSpotLightShadow&&\nd.update(n);D=d.map;I=d.matrix;l.setFromMatrixPosition(n.matrixWorld);x.position.copy(l);y?(d=6,I.makeTranslation(-l.x,-l.y,-l.z)):(d=1,r.setFromMatrixPosition(n.target.matrixWorld),x.lookAt(r),x.updateMatrixWorld(),I.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),I.multiply(x.projectionMatrix),I.multiply(x.matrixWorldInverse));a.setRenderTarget(D);a.clear();for(n=0;n<d;n++)y&&(r.copy(x.position),r.add(u[n]),x.up.copy(H[n]),x.lookAt(r),x.updateMatrixWorld(),h.viewport(w[n])),m.multiplyMatrices(x.projectionMatrix,\nx.matrixWorldInverse),k.setFromMatrix(m),f(b,c,x,y)}}e=a.getClearColor();t=a.getClearAlpha();a.setClearColor(e,t);F.needsUpdate=!1}}}function Kf(a){var b={};return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){var e=c.uuid,f=c,g=f.array,h=f.dynamic?\na.DYNAMIC_DRAW:a.STATIC_DRAW,k=a.createBuffer();a.bindBuffer(d,k);a.bufferData(d,g,h);f.onUploadCallback();h=a.FLOAT;g instanceof Float32Array?h=a.FLOAT:g instanceof Float64Array?console.warn(\"THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.\"):g instanceof Uint16Array?h=a.UNSIGNED_SHORT:g instanceof Int16Array?h=a.SHORT:g instanceof Uint32Array?h=a.UNSIGNED_INT:g instanceof Int32Array?h=a.INT:g instanceof Int8Array?h=a.BYTE:g instanceof Uint8Array&&(h=a.UNSIGNED_BYTE);b[e]={buffer:k,\ntype:h,bytesPerElement:g.BYTES_PER_ELEMENT,version:f.version}}else e.version<c.version&&(f=c,g=f.array,k=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic?a.bufferData(d,g,a.STATIC_DRAW):-1===k.count?a.bufferSubData(d,0,g):0===k.count?console.error(\"THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.\"):(a.bufferSubData(d,k.offset*g.BYTES_PER_ELEMENT,g.subarray(k.offset,k.offset+\nk.count)),k.count=-1),e.version=c.version)}}}function ab(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||ab.DefaultOrder}function Qd(){this.mask=1}function z(){Object.defineProperty(this,\"id\",{value:Lf++});this.uuid=Y.generateUUID();this.name=\"\";this.type=\"Object3D\";this.parent=null;this.children=[];this.up=z.DefaultUp.clone();var a=new n,b=new ab,c=new oa,d=new n(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,\n{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new K},normalMatrix:{value:new Ba}});this.matrix=new K;this.matrixWorld=new K;this.matrixAutoUpdate=z.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Qd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function Na(){z.call(this);this.type=\"Camera\";this.matrixWorldInverse=\nnew K;this.projectionMatrix=new K}function Fb(a,b,c,d,e,f){Na.call(this);this.type=\"OrthographicCamera\";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function qa(a,b,c,d){Na.call(this);this.type=\"PerspectiveCamera\";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=\n0;this.updateProjectionMatrix()}function Sa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new n;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new G;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function J(){Object.defineProperty(this,\"id\",{value:Rd++});this.uuid=Y.generateUUID();this.name=\"\";this.type=\"Geometry\";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=\n[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Z(a,b,c){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.uuid=Y.generateUUID();this.name=\"\";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=\n!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function pc(a,b){Z.call(this,new Int8Array(a),b)}function qc(a,b){Z.call(this,new Uint8Array(a),b)}function rc(a,b){Z.call(this,new Uint8ClampedArray(a),b)}function sc(a,b){Z.call(this,new Int16Array(a),b)}function gb(a,b){Z.call(this,new Uint16Array(a),b)}function tc(a,b){Z.call(this,new Int32Array(a),b)}function hb(a,b){Z.call(this,new Uint32Array(a),b)}function B(a,b){Z.call(this,new Float32Array(a),b)}function uc(a,\nb){Z.call(this,new Float64Array(a),b)}function Je(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Sd(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function E(){Object.defineProperty(this,\n\"id\",{value:Rd++});this.uuid=Y.generateUUID();this.name=\"\";this.type=\"BufferGeometry\";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Gb(a,b,c,d,e,f){J.call(this);this.type=\"BoxGeometry\";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new ib(a,b,c,d,e,f));this.mergeVertices()}function ib(a,b,c,d,e,f){function g(a,b,\nc,d,e,f,g,l,W,D,O){var aa=f/W,F=g/D,ja=f/2,T=g/2,C=l/2;g=W+1;var B=D+1,z=f=0,P,M,V=new n;for(M=0;M<B;M++){var pa=M*F-T;for(P=0;P<g;P++)V[a]=(P*aa-ja)*d,V[b]=pa*e,V[c]=C,m.push(V.x,V.y,V.z),V[a]=0,V[b]=0,V[c]=0<l?1:-1,q.push(V.x,V.y,V.z),v.push(P/W),v.push(1-M/D),f+=1}for(M=0;M<D;M++)for(P=0;P<W;P++)a=p+P+g*(M+1),b=p+(P+1)+g*(M+1),c=p+(P+1)+g*M,k.push(p+P+g*M,a,c),k.push(a,b,c),z+=6;h.addGroup(r,z,O);r+=z;p+=f}E.call(this);this.type=\"BoxBufferGeometry\";this.parameters={width:a,height:b,depth:c,widthSegments:d,\nheightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=[],m=[],q=[],v=[],p=0,r=0;g(\"z\",\"y\",\"x\",-1,-1,c,b,a,f,e,0);g(\"z\",\"y\",\"x\",1,-1,c,b,-a,f,e,1);g(\"x\",\"z\",\"y\",1,1,a,c,b,d,f,2);g(\"x\",\"z\",\"y\",1,-1,a,c,-b,d,f,3);g(\"x\",\"y\",\"z\",1,-1,a,b,c,d,e,4);g(\"x\",\"y\",\"z\",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute(\"position\",new B(m,3));this.addAttribute(\"normal\",new B(q,3));this.addAttribute(\"uv\",new B(v,2))}function vc(a,b,c,d){J.call(this);this.type=\n\"PlaneGeometry\";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new jb(a,b,c,d));this.mergeVertices()}function jb(a,b,c,d){E.call(this);this.type=\"PlaneBufferGeometry\";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d,q=[],v=[],p=[],r=[];for(a=0;a<h;a++){var l=a*m-f;for(b=0;b<g;b++)v.push(b*k-e,-l,0),p.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=\n0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute(\"position\",new B(v,3));this.addAttribute(\"normal\",new B(p,3));this.addAttribute(\"uv\",new B(r,2))}function ya(a){U.call(this);this.type=\"MeshBasicMaterial\";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=\n!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function kb(a,b){this.origin=void 0!==a?a:new n;this.direction=void 0!==b?b:new n}function Hb(a,b){this.start=void 0!==a?a:new n;this.end=void 0!==b?b:new n}function Ta(a,b,c){this.a=void 0!==a?a:new n;this.b=void 0!==b?b:new n;this.c=void 0!==c?c:new n}function la(a,b){z.call(this);this.type=\"Mesh\";this.geometry=void 0!==a?a:new E;this.material=void 0!==\nb?b:new ya({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Mf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new G(0),g=0,h,k,m,q;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,r){b=b.background;null===b?e(f,g):b&&b.isColor&&(e(b,1),r=!0);(a.autoClear||r)&&a.clear(a.autoClearColor,a.autoClearDepth,\na.autoClearStencil);b&&b.isCubeTexture?(void 0===m&&(m=new qa,q=new la(new ib(5,5,5),new ra({uniforms:$a.cube.uniforms,vertexShader:$a.cube.vertexShader,fragmentShader:$a.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))),m.projectionMatrix.copy(d.projectionMatrix),m.matrixWorld.extractRotation(d.matrixWorld),m.matrixWorldInverse.getInverse(m.matrixWorld),q.material.uniforms.tCube.value=b,q.modelViewMatrix.multiplyMatrices(m.matrixWorldInverse,q.matrixWorld),c.update(q),a.renderBufferDirect(m,\nnull,q.geometry,q.material,q,null)):b&&b.isTexture&&(void 0===h&&(h=new Fb(-1,1,1,-1,0,1),k=new la(new jb(2,2),new ya({depthTest:!1,depthWrite:!1,fog:!1}))),k.material.map=b,c.update(k),a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Nf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Of(a,b){return a.renderOrder!==\nb.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Pf(){var a=[],b=-1,c=[],d=-1;return{opaque:a,transparent:c,init:function(){d=b=-1},push:function(e,f,g,h,k){var m,q;g.transparent?(m=c,q=++d):(m=a,q=++b);(q=m[q])?(q.id=e.id,q.object=e,q.geometry=f,q.material=g,q.program=g.program,q.renderOrder=e.renderOrder,q.z=h,q.group=k):(q={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},m.push(q))},finish:function(){a.length=b+1;c.length=\nd+1},sort:function(){a.sort(Nf);c.sort(Of)}}}function Qf(){var a={};return{get:function(b,c){var d=b.id+\",\"+c.id,e=a[d];void 0===e&&(e=new Pf,a[d]=e);return e},dispose:function(){a={}}}}function Rf(a,b,c){var d,e,f;this.setMode=function(a){d=a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)};this.renderInstances=function(g,h,k){var m=b.get(\"ANGLE_instanced_arrays\");null===m?console.error(\"THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\"):\n(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*k/3))}}function Sf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)};this.renderInstances=function(e,f,g){var h=b.get(\"ANGLE_instanced_arrays\");if(null===h)console.error(\"THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");\nelse{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES&&(c.faces+=e.maxInstancedCount*g/3)}}}function Tf(a,b,c){function d(a){a=a.target;var h=e[a.id];null!==h.index&&b.remove(h.index);for(var k in h.attributes)b.remove(h.attributes[k]);a.removeEventListener(\"dispose\",d);delete e[a.id];if(k=f[a.id])b.remove(k),\ndelete f[a.id];if(k=f[h.id])b.remove(k),delete f[h.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener(\"dispose\",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new E).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=\nc[f],e=0,q=d.length;e<q;e++)b.update(d[e],a.ARRAY_BUFFER)},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;var d=[],e=c.index,m=c.attributes;if(null!==e)for(var e=e.array,m=0,q=e.length;m<q;m+=3){var v=e[m+0],p=e[m+1],r=e[m+2];d.push(v,p,p,r,r,v)}else for(e=m.position.array,m=0,q=e.length/3-1;m<q;m+=3)v=m+0,p=m+1,r=m+2,d.push(v,p,p,r,r,v);d=new (65535<Sd(d)?hb:gb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=d}}}function Uf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];\nvar c;switch(b.type){case \"DirectionalLight\":c={direction:new n,color:new G,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case \"SpotLight\":c={position:new n,direction:new n,color:new G,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case \"PointLight\":c={position:new n,color:new G,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case \"HemisphereLight\":c={direction:new n,skyColor:new G,\ngroundColor:new G};break;case \"RectAreaLight\":c={color:new G,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function Vf(a,b,c){var d={};return{update:function(a){var f=c.frame,g=a.geometry,h=b.get(a,g);d[h.id]!==f&&(g.isGeometry&&h.updateFromObject(a),b.update(h),d[h.id]=f);return h},clear:function(){d={}}}}function Wf(a){a=a.split(\"\\n\");for(var b=0;b<a.length;b++)a[b]=b+1+\": \"+a[b];return a.join(\"\\n\")}function Ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);\n!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error(\"THREE.WebGLShader: Shader couldn't compile.\");\"\"!==a.getShaderInfoLog(d)&&console.warn(\"THREE.WebGLShader: gl.getShaderInfoLog()\",b===a.VERTEX_SHADER?\"vertex\":\"fragment\",a.getShaderInfoLog(d),Wf(c));return d}function Le(a){switch(a){case 3E3:return[\"Linear\",\"( value )\"];case 3001:return[\"sRGB\",\"( value )\"];case 3002:return[\"RGBE\",\"( value )\"];case 3004:return[\"RGBM\",\"( value, 7.0 )\"];case 3005:return[\"RGBM\",\"( value, 16.0 )\"];case 3006:return[\"RGBD\",\n\"( value, 256.0 )\"];case 3007:return[\"Gamma\",\"( value, float( GAMMA_FACTOR ) )\"];default:throw Error(\"unsupported encoding: \"+a);}}function Td(a,b){var c=Le(b);return\"vec4 \"+a+\"( vec4 value ) { return \"+c[0]+\"ToLinear\"+c[1]+\"; }\"}function Xf(a,b){var c=Le(b);return\"vec4 \"+a+\"( vec4 value ) { return LinearTo\"+c[0]+c[1]+\"; }\"}function Yf(a,b){var c;switch(b){case 1:c=\"Linear\";break;case 2:c=\"Reinhard\";break;case 3:c=\"Uncharted2\";break;case 4:c=\"OptimizedCineon\";break;default:throw Error(\"unsupported toneMapping: \"+\nb);}return\"vec3 \"+a+\"( vec3 color ) { return \"+c+\"ToneMapping( color ); }\"}function Zf(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?\"#extension GL_OES_standard_derivatives : enable\":\"\",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get(\"EXT_frag_depth\")?\"#extension GL_EXT_frag_depth : enable\":\"\",a.drawBuffers&&c.get(\"WEBGL_draw_buffers\")?\"#extension GL_EXT_draw_buffers : require\":\"\",(a.shaderTextureLOD||b.envMap)&&c.get(\"EXT_shader_texture_lod\")?\"#extension GL_EXT_shader_texture_lod : enable\":\n\"\"].filter(wc).join(\"\\n\")}function $f(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push(\"#define \"+c+\" \"+d)}return b.join(\"\\n\")}function wc(a){return\"\"!==a}function Me(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Ud(a){return a.replace(/^[ \\t]*#include +<([\\w\\d.]+)>/gm,function(a,c){var d=X[c];\nif(void 0===d)throw Error(\"Can not resolve #include <\"+c+\">\");return Ud(d)})}function Ne(a){return a.replace(/for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g,function(a,c,d,e){a=\"\";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\\[ i \\]/g,\"[ \"+c+\" ]\");return a})}function ag(a,b,c,d,e){var f=a.context,g=c.extensions,h=c.defines,k=d.vertexShader,m=d.fragmentShader,q=\"SHADOWMAP_TYPE_BASIC\";1===e.shadowMapType?q=\"SHADOWMAP_TYPE_PCF\":2===e.shadowMapType&&(q=\"SHADOWMAP_TYPE_PCF_SOFT\");\nvar v=\"ENVMAP_TYPE_CUBE\",p=\"ENVMAP_MODE_REFLECTION\",r=\"ENVMAP_BLENDING_MULTIPLY\";if(e.envMap){switch(c.envMap.mapping){case 301:case 302:v=\"ENVMAP_TYPE_CUBE\";break;case 306:case 307:v=\"ENVMAP_TYPE_CUBE_UV\";break;case 303:case 304:v=\"ENVMAP_TYPE_EQUIREC\";break;case 305:v=\"ENVMAP_TYPE_SPHERE\"}switch(c.envMap.mapping){case 302:case 304:p=\"ENVMAP_MODE_REFRACTION\"}switch(c.combine){case 0:r=\"ENVMAP_BLENDING_MULTIPLY\";break;case 1:r=\"ENVMAP_BLENDING_MIX\";break;case 2:r=\"ENVMAP_BLENDING_ADD\"}}var l=0<a.gammaFactor?\na.gammaFactor:1,g=Zf(g,e,a.extensions),t=$f(h),n=f.createProgram();c.isRawShaderMaterial?(h=[t,\"\\n\"].filter(wc).join(\"\\n\"),d=[g,t,\"\\n\"].filter(wc).join(\"\\n\")):(h=[\"precision \"+e.precision+\" float;\",\"precision \"+e.precision+\" int;\",\"#define SHADER_NAME \"+d.name,t,e.supportsVertexTextures?\"#define VERTEX_TEXTURES\":\"\",\"#define GAMMA_FACTOR \"+l,\"#define MAX_BONES \"+e.maxBones,e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\n\"\",e.envMap?\"#define \"+p:\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.displacementMap&&e.supportsVertexTextures?\"#define USE_DISPLACEMENTMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.flatShading?\n\"#define FLAT_SHADED\":\"\",e.skinning?\"#define USE_SKINNING\":\"\",e.useVertexTexture?\"#define BONE_TEXTURE\":\"\",e.morphTargets?\"#define USE_MORPHTARGETS\":\"\",e.morphNormals&&!1===e.flatShading?\"#define USE_MORPHNORMALS\":\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",\"#define NUM_CLIPPING_PLANES \"+e.numClippingPlanes,e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+q:\"\",e.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",e.logarithmicDepthBuffer?\n\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&a.extensions.get(\"EXT_frag_depth\")?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 modelMatrix;\",\"uniform mat4 modelViewMatrix;\",\"uniform mat4 projectionMatrix;\",\"uniform mat4 viewMatrix;\",\"uniform mat3 normalMatrix;\",\"uniform vec3 cameraPosition;\",\"attribute vec3 position;\",\"attribute vec3 normal;\",\"attribute vec2 uv;\",\"#ifdef USE_COLOR\",\"\\tattribute vec3 color;\",\"#endif\",\"#ifdef USE_MORPHTARGETS\",\"\\tattribute vec3 morphTarget0;\",\"\\tattribute vec3 morphTarget1;\",\n\"\\tattribute vec3 morphTarget2;\",\"\\tattribute vec3 morphTarget3;\",\"\\t#ifdef USE_MORPHNORMALS\",\"\\t\\tattribute vec3 morphNormal0;\",\"\\t\\tattribute vec3 morphNormal1;\",\"\\t\\tattribute vec3 morphNormal2;\",\"\\t\\tattribute vec3 morphNormal3;\",\"\\t#else\",\"\\t\\tattribute vec3 morphTarget4;\",\"\\t\\tattribute vec3 morphTarget5;\",\"\\t\\tattribute vec3 morphTarget6;\",\"\\t\\tattribute vec3 morphTarget7;\",\"\\t#endif\",\"#endif\",\"#ifdef USE_SKINNING\",\"\\tattribute vec4 skinIndex;\",\"\\tattribute vec4 skinWeight;\",\"#endif\",\"\\n\"].filter(wc).join(\"\\n\"),\nd=[g,\"precision \"+e.precision+\" float;\",\"precision \"+e.precision+\" int;\",\"#define SHADER_NAME \"+d.name,t,e.alphaTest?\"#define ALPHATEST \"+e.alphaTest:\"\",\"#define GAMMA_FACTOR \"+l,e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.envMap?\"#define \"+v:\"\",e.envMap?\"#define \"+p:\"\",e.envMap?\"#define \"+r:\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",\ne.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.gradientMap?\"#define USE_GRADIENTMAP\":\"\",e.flatShading?\"#define FLAT_SHADED\":\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",\"#define NUM_CLIPPING_PLANES \"+e.numClippingPlanes,\"#define UNION_CLIPPING_PLANES \"+\n(e.numClippingPlanes-e.numClipIntersection),e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+q:\"\",e.premultipliedAlpha?\"#define PREMULTIPLIED_ALPHA\":\"\",e.physicallyCorrectLights?\"#define PHYSICALLY_CORRECT_LIGHTS\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&a.extensions.get(\"EXT_frag_depth\")?\"#define USE_LOGDEPTHBUF_EXT\":\"\",e.envMap&&a.extensions.get(\"EXT_shader_texture_lod\")?\"#define TEXTURE_LOD_EXT\":\"\",\"uniform mat4 viewMatrix;\",\n\"uniform vec3 cameraPosition;\",0!==e.toneMapping?\"#define TONE_MAPPING\":\"\",0!==e.toneMapping?X.tonemapping_pars_fragment:\"\",0!==e.toneMapping?Yf(\"toneMapping\",e.toneMapping):\"\",e.dithering?\"#define DITHERING\":\"\",e.outputEncoding||e.mapEncoding||e.envMapEncoding||e.emissiveMapEncoding?X.encodings_pars_fragment:\"\",e.mapEncoding?Td(\"mapTexelToLinear\",e.mapEncoding):\"\",e.envMapEncoding?Td(\"envMapTexelToLinear\",e.envMapEncoding):\"\",e.emissiveMapEncoding?Td(\"emissiveMapTexelToLinear\",e.emissiveMapEncoding):\n\"\",e.outputEncoding?Xf(\"linearToOutputTexel\",e.outputEncoding):\"\",e.depthPacking?\"#define DEPTH_PACKING \"+c.depthPacking:\"\",\"\\n\"].filter(wc).join(\"\\n\"));k=Ud(k);k=Me(k,e);m=Ud(m);m=Me(m,e);c.isShaderMaterial||(k=Ne(k),m=Ne(m));m=d+m;k=Ke(f,f.VERTEX_SHADER,h+k);m=Ke(f,f.FRAGMENT_SHADER,m);f.attachShader(n,k);f.attachShader(n,m);void 0!==c.index0AttributeName?f.bindAttribLocation(n,0,c.index0AttributeName):!0===e.morphTargets&&f.bindAttribLocation(n,0,\"position\");f.linkProgram(n);e=f.getProgramInfoLog(n);\nq=f.getShaderInfoLog(k);v=f.getShaderInfoLog(m);r=p=!0;if(!1===f.getProgramParameter(n,f.LINK_STATUS))p=!1,console.error(\"THREE.WebGLProgram: shader error: \",f.getError(),\"gl.VALIDATE_STATUS\",f.getProgramParameter(n,f.VALIDATE_STATUS),\"gl.getProgramInfoLog\",e,q,v);else if(\"\"!==e)console.warn(\"THREE.WebGLProgram: gl.getProgramInfoLog()\",e);else if(\"\"===q||\"\"===v)r=!1;r&&(this.diagnostics={runnable:p,material:c,programLog:e,vertexShader:{log:q,prefix:h},fragmentShader:{log:v,prefix:d}});f.deleteShader(k);\nf.deleteShader(m);var x;this.getUniforms=function(){void 0===x&&(x=new eb(f,n,a));return x};var u;this.getAttributes=function(){if(void 0===u){for(var a={},b=f.getProgramParameter(n,f.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=f.getActiveAttrib(n,c).name;a[d]=f.getAttribLocation(n,d)}u=a}return u};this.destroy=function(){f.deleteProgram(n);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn(\"THREE.WebGLProgram: .uniforms is now .getUniforms().\");return this.getUniforms()}},\nattributes:{get:function(){console.warn(\"THREE.WebGLProgram: .attributes is now .getAttributes().\");return this.getAttributes()}}});this.id=bg++;this.code=b;this.usedTimes=1;this.program=n;this.vertexShader=k;this.fragmentShader=m;return this}function cg(a,b){function c(a,b){var c;a?a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn(\"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\"),c=a.texture.encoding):c=3E3;3E3===\nc&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:\"depth\",MeshNormalMaterial:\"normal\",MeshBasicMaterial:\"basic\",MeshLambertMaterial:\"lambert\",MeshPhongMaterial:\"phong\",MeshToonMaterial:\"phong\",MeshStandardMaterial:\"physical\",MeshPhysicalMaterial:\"physical\",LineBasicMaterial:\"basic\",LineDashedMaterial:\"dashed\",PointsMaterial:\"points\"},f=\"precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering\".split(\" \");\nthis.getParameters=function(d,f,k,m,q,v){var p=e[d.type],r;if(v.isSkinnedMesh)if(r=v.skeleton.bones,b.floatVertexTextures)r=1024;else{var l=Math.min(Math.floor((b.maxVertexUniforms-20)/4),r.length);l<r.length?(console.warn(\"THREE.WebGLRenderer: Skeleton has \"+r.length+\" bones. This GPU supports \"+l+\".\"),r=0):r=l}else r=0;l=a.getPrecision();null!==d.precision&&(l=b.getMaxPrecision(d.precision),l!==d.precision&&console.warn(\"THREE.WebGLProgram.getParameters:\",d.precision,\"not supported, using\",l,\"instead.\"));\nvar t=a.getRenderTarget();return{shaderID:p,precision:l,supportsVertexTextures:b.vertexTextures,outputEncoding:c(t?t.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap,emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,\ndisplacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,gradientMap:!!d.gradientMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!k,useFog:d.fog,fogExp:k&&k.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning&&0<r,maxBones:r,useVertexTexture:b.floatVertexTextures,morphTargets:d.morphTargets,morphNormals:d.morphNormals,\nmaxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numRectAreaLights:f.rectArea.length,numHemiLights:f.hemi.length,numClippingPlanes:m,numClipIntersection:q,dithering:d.dithering,shadowMapEnabled:a.shadowMap.enabled&&v.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:d.premultipliedAlpha,\nalphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<f.length;e++)d.push(c[f[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(b,c,e,f){for(var q,v=0,p=d.length;v<\np;v++){var r=d[v];if(r.code===f){q=r;++q.usedTimes;break}}void 0===q&&(q=new ag(a,f,b,c,e),d.push(q));return q};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function dg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext(\"2d\").drawImage(a,\n0,0,a.width,a.height,0,0,d.width,d.height);console.warn(\"THREE.WebGLRenderer: image is too big (\"+a.width+\"x\"+a.height+\"). Resized to \"+d.width+\"x\"+d.height,a);return d}return a}function k(a){return Y.isPowerOfTwo(a.width)&&Y.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function v(b){b=b.target;b.removeEventListener(\"dispose\",v);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);\nelse{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function p(b){b=b.target;b.removeEventListener(\"dispose\",p);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),\nc.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,p){var q=d.get(b);if(0<b.version&&q.__version!==b.version){var r=b.image;if(void 0===r)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is undefined\",b);else if(!1===r.complete)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is incomplete\",b);else{void 0===q.__webglInit&&(q.__webglInit=!0,b.addEventListener(\"dispose\",v),q.__webglTexture=\na.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var t=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(t))if(r=t,r instanceof HTMLImageElement||r instanceof HTMLCanvasElement){var n=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"canvas\");n.width=Y.nearestPowerOfTwo(r.width);n.height=Y.nearestPowerOfTwo(r.height);n.getContext(\"2d\").drawImage(r,0,0,n.width,n.height);console.warn(\"THREE.WebGLRenderer: image is not power of two (\"+r.width+\"x\"+r.height+\"). Resized to \"+n.width+\"x\"+n.height,r);t=n}else t=r;var r=k(t),n=f(b.format),y=f(b.type);l(a.TEXTURE_2D,b,r);var aa=b.mipmaps;if(b.isDepthTexture){aa=a.DEPTH_COMPONENT;if(1015===b.type){if(!x)throw Error(\"Float Depth Texture only supported in WebGL2.0\");aa=a.DEPTH_COMPONENT32F}else x&&\n(aa=a.DEPTH_COMPONENT16);1026===b.format&&aa===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.\"),b.type=1012,y=f(b.type));1027===b.format&&(aa=a.DEPTH_STENCIL,1020!==b.type&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.\"),b.type=1020,y=f(b.type)));c.texImage2D(a.TEXTURE_2D,0,aa,t.width,t.height,0,n,y,null)}else if(b.isDataTexture)if(0<aa.length&&\nr){for(var F=0,ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,t.width,t.height,0,n,y,t.data);else if(b.isCompressedTexture)for(F=0,ja=aa.length;F<ja;F++)t=aa[F],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(n)?c.compressedTexImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,t.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):\nc.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);else if(0<aa.length&&r){F=0;for(ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,n,y,t);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,n,y,t);m(b,r)&&a.generateMipmap(a.TEXTURE_2D);q.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture)}function l(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),\na.texParameteri(c,a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.\",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,q(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,q(g.minFilter)),\n1003!==g.minFilter&&1006!==g.minFilter&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.\",g));!(h=b.get(\"EXT_texture_filter_anisotropic\"))||1015===g.type&&null===b.get(\"OES_texture_float_linear\")||1016===g.type&&null===b.get(\"OES_texture_half_float_linear\")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=\ng.anisotropy)}function t(b,e,g,h){var k=f(e.texture.format),m=f(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function n(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,\nb)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var x=\"undefined\"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=r;this.setTextureCube=function(b,p){var q=d.get(b);if(6===b.image.length)if(0<b.version&&q.__version!==\nb.version){q.__image__webglTextureCube||(b.addEventListener(\"dispose\",v),q.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var r=b&&b.isCompressedTexture,t=b.image[0]&&b.image[0].isDataTexture,n=[],y=0;6>y;y++)n[y]=r||t?t?b.image[y].image:b.image[y]:h(b.image[y],e.maxCubemapSize);var x=k(n[0]),F=f(b.format),ja=f(b.type);l(a.TEXTURE_CUBE_MAP,b,x);for(y=\n0;6>y;y++)if(r)for(var T,C=n[y].mipmaps,z=0,B=C.length;z<B;z++)T=C[z],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(F)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,T.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,F,ja,T.data);else t?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,n[y].width,n[y].height,\n0,F,ja,n[y].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,F,ja,n[y]);m(b,x)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);q.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+p),c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener(\"dispose\",p);\nf.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,q=k(b);if(h){e.__webglFramebuffer=[];for(var v=0;6>v;v++)e.__webglFramebuffer[v]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,q);for(v=0;6>v;v++)t(e.__webglFramebuffer[v],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+v);m(b.texture,q)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,\nnull)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,q),t(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,q)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error(\"target.depthTexture not supported in Cube render targets\");if(b&&b.isWebGLRenderTargetCube)throw Error(\"Depth Texture with cube render targets is not supported!\");a.bindFramebuffer(a.FRAMEBUFFER,\ne.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error(\"renderTarget.depthTexture must be an instance of THREE.DepthTexture\");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,\na.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error(\"Unknown depthTexture format\");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),n(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),n(e.__webglDepthbuffer,\nb);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);m(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function eg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function fg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();\na.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==u[b]&&(a.enable(b),u[b]=!0)}function f(b){!1!==u[b]&&(a.disable(b),u[b]=!1)}function g(b,d,g,h,k,m,p,q){0!==b?e(a.BLEND):f(a.BLEND);5===b||b===w&&q===ja||(2===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),\na.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,\na.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),w=b,ja=q);if(5===b){k=k||d;m=m||g;p=p||h;if(d!==I||k!==O)a.blendEquationSeparate(c(d),c(k)),I=d,O=k;if(g!==W||h!==D||m!==aa||p!==F)a.blendFuncSeparate(c(g),c(h),c(m),c(p)),W=g,D=h,aa=m,F=p}else F=aa=O=D=W=I=null}function h(b){T!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),T=b)}function k(b){0!==b?(e(a.CULL_FACE),b!==C&&(1===b?a.cullFace(a.BACK):\n2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);C=b}function m(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),B!==c||P!==d)a.polygonOffset(c,d),B=c,P=d}else f(a.POLYGON_OFFSET_FILL)}function q(b){void 0===b&&(b=a.TEXTURE0+V-1);S!==b&&(a.activeTexture(b),S=b)}var v=new function(){var b=!1,c=new fa,d=null,e=new fa;return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&\n(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(0,0,0,1)}}},p=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);\nbreak;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=null,d=null,g=null,h=null,k=null,m=null,p=null,q=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},\nsetOp:function(b,c,d){if(k!==b||m!==c||p!==d)a.stencilOp(b,c,d),k=b,m=c,p=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=p=m=k=h=g=d=c=null}}},l=a.getParameter(a.MAX_VERTEX_ATTRIBS),t=new Uint8Array(l),n=new Uint8Array(l),x=new Uint8Array(l),u={},H=null,w=null,I=null,W=null,D=null,O=null,aa=null,F=null,ja=!1,T=null,C=null,z=null,B=null,P=null,M=null,V=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),l=parseFloat(/^WebGL\\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),\npa=1<=parseFloat(l),S=null,N={},E=new fa,G=new fa,K={};K[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);K[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:v,depth:p,stencil:r},init:function(){v.setClear(0,0,0,1);p.setClear(1);r.setClear(0);e(a.DEPTH_TEST);p.setFunc(3);h(!1);k(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=t.length;a<b;a++)t[a]=0},enableAttribute:function(c){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=\n1);0!==x[c]&&(b.get(\"ANGLE_instanced_arrays\").vertexAttribDivisorANGLE(c,0),x[c]=0)},enableAttributeAndDivisor:function(c,d){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=1);x[c]!==d&&(b.get(\"ANGLE_instanced_arrays\").vertexAttribDivisorANGLE(c,d),x[c]=d)},disableUnusedAttributes:function(){for(var b=0,c=n.length;b!==c;++b)n[b]!==t[b]&&(a.disableVertexAttribArray(b),n[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===H&&(H=[],b.get(\"WEBGL_compressed_texture_pvrtc\")||\nb.get(\"WEBGL_compressed_texture_s3tc\")||b.get(\"WEBGL_compressed_texture_etc1\")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)H.push(c[d]);return H},setBlending:g,setMaterial:function(b){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);h(1===b.side);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);p.setFunc(b.depthFunc);p.setTest(b.depthTest);p.setMask(b.depthWrite);v.setMask(b.colorWrite);\nm(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==z&&(pa&&a.lineWidth(b),z=b)},setPolygonOffset:m,getScissorTest:function(){return M},setScissorTest:function(b){(M=b)?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:q,bindTexture:function(b,c){null===S&&q();var d=N[S];void 0===d&&(d={type:void 0,texture:void 0},N[S]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||K[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,\narguments)}catch(b){console.error(\"THREE.WebGLState:\",b)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(b){console.error(\"THREE.WebGLState:\",b)}},scissor:function(b){!1===E.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),E.copy(b))},viewport:function(b){!1===G.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),G.copy(b))},reset:function(){for(var b=0;b<n.length;b++)1===n[b]&&(a.disableVertexAttribArray(b),n[b]=0);u={};S=H=null;N={};C=T=w=null;v.reset();p.reset();r.reset()}}}function gg(a,b,c){function d(b){if(\"highp\"===\nb){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return\"highp\";b=\"mediump\"}return\"mediump\"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?\"mediump\":\"lowp\"}var e,f=void 0!==c.precision?c.precision:\"highp\",g=d(f);g!==f&&(console.warn(\"THREE.WebGLRenderer:\",f,\"not supported, using\",g,\"instead.\"),f=g);c=\n!0===c.logarithmicDepthBuffer&&!!b.get(\"EXT_frag_depth\");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),q=a.getParameter(a.MAX_VERTEX_ATTRIBS),v=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),p=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<h,t=!!b.get(\"OES_texture_float\");return{getMaxAnisotropy:function(){if(void 0!==e)return e;\nvar c=b.get(\"EXT_texture_filter_anisotropic\");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m,maxAttributes:q,maxVertexUniforms:v,maxVaryings:p,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:t,floatVertexTextures:l&&t}}function kd(a){qa.call(this);this.cameras=a||[]}function hg(a){var b=this,c=null,d=null;\"VRFrameData\"in window&&(d=new window.VRFrameData);\nvar e=new K,f=new K,g=new K,h=new qa;h.bounds=new fa(0,0,.5,1);h.layers.enable(1);var k=new qa;k.bounds=new fa(.5,0,.5,1);k.layers.enable(2);var m=new kd([h,k]);m.layers.enable(1);m.layers.enable(2);var q,v;window.addEventListener(\"vrdisplaypresentchange\",function(){if(c.isPresenting){var d=c.getEyeParameters(\"left\"),e=d.renderWidth,d=d.renderHeight;v=a.getPixelRatio();q=a.getSize();a.setDrawingBufferSize(2*e,d,1)}else b.enabled&&a.setDrawingBufferSize(q.width,q.height,v)},!1);this.standing=this.enabled=\n!1;this.getDevice=function(){return c};this.setDevice=function(a){void 0!==a&&(c=a)};this.getCamera=function(a){if(null===c)return a;c.depthNear=a.near;c.depthFar=a.far;c.getFrameData(d);var b=d.pose;null!==b.position?a.position.fromArray(b.position):a.position.set(0,0,0);null!==b.orientation&&a.quaternion.fromArray(b.orientation);a.updateMatrixWorld();b=c.stageParameters;this.standing&&b&&(f.fromArray(b.sittingToStandingTransform),g.getInverse(f),a.matrixWorld.multiply(f),a.matrixWorldInverse.multiply(g));\nif(!1===c.isPresenting)return a;m.matrixWorld.copy(a.matrixWorld);m.matrixWorldInverse.copy(a.matrixWorldInverse);h.matrixWorldInverse.fromArray(d.leftViewMatrix);k.matrixWorldInverse.fromArray(d.rightViewMatrix);this.standing&&b&&(h.matrixWorldInverse.multiply(g),k.matrixWorldInverse.multiply(g));a=a.parent;null!==a&&(e.getInverse(a.matrixWorld),h.matrixWorldInverse.multiply(e),k.matrixWorldInverse.multiply(e));h.matrixWorld.getInverse(h.matrixWorldInverse);k.matrixWorld.getInverse(k.matrixWorldInverse);\nh.projectionMatrix.fromArray(d.leftProjectionMatrix);k.projectionMatrix.fromArray(d.rightProjectionMatrix);m.projectionMatrix.copy(h.projectionMatrix);a=c.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&h.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&k.bounds.fromArray(a.rightBounds));return m};this.getStandingMatrix=function(){return f};this.submitFrame=function(){c&&c.isPresenting&&c.submitFrame()}}function ig(a){var b={};return{get:function(c){if(void 0!==\nb[c])return b[c];var d;switch(c){case \"WEBGL_depth_texture\":d=a.getExtension(\"WEBGL_depth_texture\")||a.getExtension(\"MOZ_WEBGL_depth_texture\")||a.getExtension(\"WEBKIT_WEBGL_depth_texture\");break;case \"EXT_texture_filter_anisotropic\":d=a.getExtension(\"EXT_texture_filter_anisotropic\")||a.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||a.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");break;case \"WEBGL_compressed_texture_s3tc\":d=a.getExtension(\"WEBGL_compressed_texture_s3tc\")||a.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||\na.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");break;case \"WEBGL_compressed_texture_pvrtc\":d=a.getExtension(\"WEBGL_compressed_texture_pvrtc\")||a.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\");break;case \"WEBGL_compressed_texture_etc1\":d=a.getExtension(\"WEBGL_compressed_texture_etc1\");break;default:d=a.getExtension(c)}null===d&&console.warn(\"THREE.WebGLRenderer: \"+c+\" extension not supported.\");return b[c]=d}}}function jg(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=\ne;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Aa,k=new Ba,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=\nfunction(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,k,r,l,t){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,x=l.clippingState||null;m.value=x;x=b(c,r,n,t);for(c=0;c!==n;++c)x[c]=d[c];l.clippingState=x;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Xd(a){function b(){ga.init();ga.scissor(J.copy(ea).multiplyScalar(Q));\nga.viewport(U.copy(hd).multiplyScalar(Q))}function c(){S=G=null;pa=\"\";V=-1;ga.reset()}function d(a){a.preventDefault();c();b();ha.clear();xa.clear()}function e(a){a=a.target;a.removeEventListener(\"dispose\",e);f(a);ha.remove(a)}function f(a){var b=ha.get(a).program;a.program=void 0;void 0!==b&&va.releaseProgram(b)}function g(a,b,c){a.render(function(a){B.renderBufferImmediate(a,b,c)})}function h(a,b){return Math.abs(b[0])-Math.abs(a[0])}function k(a,b,c){if(a.visible){if(a.layers.test(b.layers))if(a.isLight)aa.push(a);\nelse if(a.isSprite)a.frustumCulled&&!Vd.intersectsSprite(a)||C.push(a);else if(a.isLensFlare)z.push(a);else if(a.isImmediateRenderObject)c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd),F.push(a,null,a.material,Oa.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||Vd.intersectsObject(a)){c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd);var d=xa.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<\nh;g++){var m=f[g],q=e[m.materialIndex];q&&q.visible&&F.push(a,d,q,Oa.z,m)}else e.visible&&F.push(a,d,e,Oa.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d,g=g.group;if(c.isArrayCamera){N=c;for(var p=c.cameras,v=0,r=p.length;v<r;v++){var l=p[v];if(h.layers.test(l.layers)){var t=l.bounds,n=t.x*ba,ca=t.y*L,u=t.z*ba,t=t.w*L;B.setViewport(n,ca,u,t);B.setScissor(n,ca,u,t);B.setScissorTest(!0);\nq(h,b,l,k,m,g)}}}else N=null,q(h,b,c,k,m,g)}}function q(a,b,c,d,e,f){a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);a.onBeforeRender(B,b,c,d,e,f);if(a.isImmediateRenderObject){ga.setMaterial(e);var h=p(c,b.fog,e,a);pa=\"\";g(a,h,e)}else B.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(B,b,c,d,e,f)}function v(a,b,c){var d=ha.get(a);c=va.getParameters(a,da,b,Ha.numPlanes,Ha.numIntersection,c);var g=va.getProgramCode(a,c),h=\nd.program,k=!0;if(void 0===h)a.addEventListener(\"dispose\",e);else if(h.code!==g)f(a);else{if(void 0!==c.shaderID)return;k=!1}k&&(c.shaderID?(h=$a[c.shaderID],d.shader={name:a.type,uniforms:Ca.clone(h.uniforms),vertexShader:h.vertexShader,fragmentShader:h.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),h=va.acquireProgram(a,d.shader,c,g),d.program=h,a.program=h);c=h.getAttributes();if(a.morphTargets)for(g=\na.numSupportedMorphTargets=0;g<B.maxMorphTargets;g++)0<=c[\"morphTarget\"+g]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(g=a.numSupportedMorphNormals=0;g<B.maxMorphNormals;g++)0<=c[\"morphNormal\"+g]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Ha.numPlanes,d.numIntersection=Ha.numIntersection,c.clippingPlanes=Ha.uniform;d.fog=b;d.lightsHash=da.hash;a.lights&&(c.ambientLightColor.value=da.ambient,c.directionalLights.value=\nda.directional,c.spotLights.value=da.spot,c.rectAreaLights.value=da.rectArea,c.pointLights.value=da.point,c.hemisphereLights.value=da.hemi,c.directionalShadowMap.value=da.directionalShadowMap,c.directionalShadowMatrix.value=da.directionalShadowMatrix,c.spotShadowMap.value=da.spotShadowMap,c.spotShadowMatrix.value=da.spotShadowMatrix,c.pointShadowMap.value=da.pointShadowMap,c.pointShadowMatrix.value=da.pointShadowMatrix);a=d.program.getUniforms();a=eb.seqWithValue(a.seq,c);d.uniformsList=a}function p(a,\nb,c,d){X=0;var e=ha.get(c);id&&(Wd||a!==S)&&Ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===S&&c.id===V);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==da.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Ha.numPlanes&&e.numIntersection===Ha.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(v(c,b,d),c.needsUpdate=!1);var f=!1,g=!1,h=!1,k=e.program,m=k.getUniforms(),q=e.shader.uniforms;\nk.id!==G&&(A.useProgram(k.program),G=k.id,h=g=f=!0);c.id!==V&&(V=c.id,g=!0);if(f||a!==S){m.setValue(A,\"projectionMatrix\",a.projectionMatrix);ia.logarithmicDepthBuffer&&m.setValue(A,\"logDepthBufFC\",2/(Math.log(a.far+1)/Math.LN2));S!==(N||a)&&(S=N||a,h=g=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)f=m.map.cameraPosition,void 0!==f&&f.setValue(A,Oa.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||\nc.isShaderMaterial||c.skinning)&&m.setValue(A,\"viewMatrix\",a.matrixWorldInverse)}if(c.skinning&&(m.setOptional(A,d,\"bindMatrix\"),m.setOptional(A,d,\"bindMatrixInverse\"),a=d.skeleton))if(f=a.bones,ia.floatVertexTextures){if(void 0===a.boneTexture){var f=Math.sqrt(4*f.length),f=Y.nextPowerOfTwo(Math.ceil(f)),f=Math.max(f,4),p=new Float32Array(f*f*4);p.set(a.boneMatrices);var t=new db(p,f,f,1023,1015);a.boneMatrices=p;a.boneTexture=t;a.boneTextureSize=f}m.setValue(A,\"boneTexture\",a.boneTexture);m.setValue(A,\n\"boneTextureSize\",a.boneTextureSize)}else m.setOptional(A,a,\"boneMatrices\");if(g){m.setValue(A,\"toneMappingExposure\",B.toneMappingExposure);m.setValue(A,\"toneMappingWhitePoint\",B.toneMappingWhitePoint);c.lights&&(g=h,q.ambientLightColor.needsUpdate=g,q.directionalLights.needsUpdate=g,q.pointLights.needsUpdate=g,q.spotLights.needsUpdate=g,q.rectAreaLights.needsUpdate=g,q.hemisphereLights.needsUpdate=g);b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&\n(q.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshNormalMaterial||c.isMeshDepthMaterial){q.opacity.value=c.opacity;q.diffuse.value=c.color;c.emissive&&q.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);q.map.value=c.map;q.specularMap.value=c.specularMap;q.alphaMap.value=c.alphaMap;c.lightMap&&(q.lightMap.value=c.lightMap,q.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(q.aoMap.value=\nc.aoMap,q.aoMapIntensity.value=c.aoMapIntensity);var n;c.map?n=c.map:c.specularMap?n=c.specularMap:c.displacementMap?n=c.displacementMap:c.normalMap?n=c.normalMap:c.bumpMap?n=c.bumpMap:c.roughnessMap?n=c.roughnessMap:c.metalnessMap?n=c.metalnessMap:c.alphaMap?n=c.alphaMap:c.emissiveMap&&(n=c.emissiveMap);void 0!==n&&(n.isWebGLRenderTarget&&(n=n.texture),b=n.offset,n=n.repeat,q.offsetRepeat.value.set(b.x,b.y,n.x,n.y));q.envMap.value=c.envMap;q.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;\nq.reflectivity.value=c.reflectivity;q.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity):c.isLineDashedMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*Q,q.scale.value=.5*L,q.map.value=c.map,null!==c.map&&(n=c.map.offset,c=c.map.repeat,q.offsetRepeat.value.set(n.x,\nn.y,c.x,c.y))):c.isMeshLambertMaterial?c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap):c.isMeshToonMaterial?(r(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):c.isMeshPhongMaterial?r(q,c):c.isMeshPhysicalMaterial?(q.clearCoat.value=c.clearCoat,q.clearCoatRoughness.value=c.clearCoatRoughness,l(q,c)):c.isMeshStandardMaterial?l(q,c):c.isMeshDepthMaterial?c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias):\nc.isMeshNormalMaterial&&(c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias));void 0!==q.ltcMat&&(q.ltcMat.value=R.LTC_MAT_TEXTURE);void 0!==q.ltcMag&&(q.ltcMag.value=R.LTC_MAG_TEXTURE);eb.upload(A,e.uniformsList,q,B)}m.setValue(A,\"modelViewMatrix\",\nd.modelViewMatrix);m.setValue(A,\"normalMatrix\",d.normalMatrix);m.setValue(A,\"modelMatrix\",d.matrixWorld);return k}function r(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,\na.displacementBias.value=b.displacementBias)}function l(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=\nb.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function t(a,b){var c,d,e,f,g=0,h=0,k=0,m,q,p,v=b.matrixWorldInverse,r=0,l=0,n=0,t=0,ca=0;c=0;for(d=a.length;c<d;c++)if(e=a[c],f=e.color,m=e.intensity,q=e.distance,p=e.shadow&&e.shadow.map?e.shadow.map.texture:null,e.isAmbientLight)g+=f.r*m,h+=f.g*m,k+=f.b*m;else if(e.isDirectionalLight){var u=wa.get(e);u.color.copy(e.color).multiplyScalar(e.intensity);u.direction.setFromMatrixPosition(e.matrixWorld);\nOa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.directionalShadowMap[r]=p;da.directionalShadowMatrix[r]=e.shadow.matrix;da.directional[r]=u;r++}else if(e.isSpotLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(f).multiplyScalar(m);u.distance=q;u.direction.setFromMatrixPosition(e.matrixWorld);\nOa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);u.coneCos=Math.cos(e.angle);u.penumbraCos=Math.cos(e.angle*(1-e.penumbra));u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.spotShadowMap[n]=p;da.spotShadowMatrix[n]=e.shadow.matrix;da.spot[n]=u;n++}else if(e.isRectAreaLight)u=wa.get(e),u.color.copy(f).multiplyScalar(m/(e.width*e.height)),u.position.setFromMatrixPosition(e.matrixWorld),\nu.position.applyMatrix4(v),oa.identity(),qa.copy(e.matrixWorld),qa.premultiply(v),oa.extractRotation(qa),u.halfWidth.set(.5*e.width,0,0),u.halfHeight.set(0,.5*e.height,0),u.halfWidth.applyMatrix4(oa),u.halfHeight.applyMatrix4(oa),da.rectArea[t]=u,t++;else if(e.isPointLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(e.color).multiplyScalar(e.intensity);u.distance=e.distance;u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,\nu.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.pointShadowMap[l]=p;da.pointShadowMatrix[l]=e.shadow.matrix;da.point[l]=u;l++}else e.isHemisphereLight&&(u=wa.get(e),u.direction.setFromMatrixPosition(e.matrixWorld),u.direction.transformDirection(v),u.direction.normalize(),u.skyColor.copy(e.color).multiplyScalar(m),u.groundColor.copy(e.groundColor).multiplyScalar(m),da.hemi[ca]=u,ca++);da.ambient[0]=g;da.ambient[1]=h;da.ambient[2]=k;da.directional.length=r;da.spot.length=n;\nda.rectArea.length=t;da.point.length=l;da.hemi.length=ca;da.hash=r+\",\"+l+\",\"+n+\",\"+t+\",\"+ca+\",\"+da.shadows.length}function y(a){var b;if(1E3===a)return A.REPEAT;if(1001===a)return A.CLAMP_TO_EDGE;if(1002===a)return A.MIRRORED_REPEAT;if(1003===a)return A.NEAREST;if(1004===a)return A.NEAREST_MIPMAP_NEAREST;if(1005===a)return A.NEAREST_MIPMAP_LINEAR;if(1006===a)return A.LINEAR;if(1007===a)return A.LINEAR_MIPMAP_NEAREST;if(1008===a)return A.LINEAR_MIPMAP_LINEAR;if(1009===a)return A.UNSIGNED_BYTE;if(1017===\na)return A.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return A.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return A.UNSIGNED_SHORT_5_6_5;if(1010===a)return A.BYTE;if(1011===a)return A.SHORT;if(1012===a)return A.UNSIGNED_SHORT;if(1013===a)return A.INT;if(1014===a)return A.UNSIGNED_INT;if(1015===a)return A.FLOAT;if(1016===a&&(b=ma.get(\"OES_texture_half_float\"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return A.ALPHA;if(1022===a)return A.RGB;if(1023===a)return A.RGBA;if(1024===a)return A.LUMINANCE;if(1025===a)return A.LUMINANCE_ALPHA;\nif(1026===a)return A.DEPTH_COMPONENT;if(1027===a)return A.DEPTH_STENCIL;if(100===a)return A.FUNC_ADD;if(101===a)return A.FUNC_SUBTRACT;if(102===a)return A.FUNC_REVERSE_SUBTRACT;if(200===a)return A.ZERO;if(201===a)return A.ONE;if(202===a)return A.SRC_COLOR;if(203===a)return A.ONE_MINUS_SRC_COLOR;if(204===a)return A.SRC_ALPHA;if(205===a)return A.ONE_MINUS_SRC_ALPHA;if(206===a)return A.DST_ALPHA;if(207===a)return A.ONE_MINUS_DST_ALPHA;if(208===a)return A.DST_COLOR;if(209===a)return A.ONE_MINUS_DST_COLOR;\nif(210===a)return A.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ma.get(\"WEBGL_compressed_texture_s3tc\"),null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ma.get(\"WEBGL_compressed_texture_pvrtc\"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\nif(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===a&&(b=ma.get(\"WEBGL_compressed_texture_etc1\"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ma.get(\"EXT_blend_minmax\"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ma.get(\"WEBGL_depth_texture\"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log(\"THREE.WebGLRenderer\",\"86\");a=a||{};var x=void 0!==a.canvas?a.canvas:document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"canvas\"),u=void 0!==a.context?a.context:null,H=void 0!==a.alpha?a.alpha:!1,w=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,W=void 0!==a.antialias?a.antialias:!1,D=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,O=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,aa=[],F=null,ja=new Float32Array(8),C=[],z=[];this.domElement=x;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=\n!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var B=this,G=null,P=null,M=null,V=-1,pa=\"\",S=null,N=null,J=new fa,Z=null,U=new fa,X=0,ba=x.width,L=x.height,Q=1,ea=new fa(0,0,ba,L),na=!1,hd=new fa(0,0,ba,L),Vd=new gd,Ha=new jg,id=!1,Wd=!1,jd=new K,Oa=new n,qa=new K,oa=new K,da={hash:\"\",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],\nspot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},ta={geometries:0,textures:0},la={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:la,memory:ta,programs:null};var A;try{H={alpha:H,depth:w,stencil:I,antialias:W,premultipliedAlpha:D,preserveDrawingBuffer:O};A=u||x.getContext(\"webgl\",H)||x.getContext(\"experimental-webgl\",H);if(null===A){if(null!==x.getContext(\"webgl\"))throw\"Error creating WebGL context with your selected attributes.\";\nthrow\"Error creating WebGL context.\";}void 0===A.getShaderPrecisionFormat&&(A.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});x.addEventListener(\"webglcontextlost\",d,!1)}catch(kg){console.error(\"THREE.WebGLRenderer: \"+kg)}var ma=new ig(A);ma.get(\"WEBGL_depth_texture\");ma.get(\"OES_texture_float\");ma.get(\"OES_texture_float_linear\");ma.get(\"OES_texture_half_float\");ma.get(\"OES_texture_half_float_linear\");ma.get(\"OES_standard_derivatives\");ma.get(\"ANGLE_instanced_arrays\");\nma.get(\"OES_element_index_uint\")&&(E.MaxIndex=4294967296);var ia=new gg(A,ma,a),ga=new fg(A,ma,y),ha=new eg,ra=new dg(A,ma,ga,ha,ia,y,ta),ua=new Kf(A),za=new Tf(A,ua,ta),xa=new Vf(A,za,la),va=new cg(this,ia),wa=new Uf,Aa=new Qf,ya=new Mf(this,ga,xa,D),sa=new hg(this);this.info.programs=va.programs;var Da=new Sf(A,ma,la),Ea=new Rf(A,ma,la);b();this.context=A;this.capabilities=ia;this.extensions=ma;this.properties=ha;this.renderLists=Aa;this.state=ga;this.vr=sa;var Ba=new Ie(this,da,xa,ia);this.shadowMap=\nBa;var Fa=new If(this,C),Ga=new Hf(this,z);this.getContext=function(){return A};this.getContextAttributes=function(){return A.getContextAttributes()};this.forceContextLoss=function(){var a=ma.get(\"WEBGL_lose_context\");a&&a.loseContext()};this.getMaxAnisotropy=function(){return ia.getMaxAnisotropy()};this.getPrecision=function(){return ia.precision};this.getPixelRatio=function(){return Q};this.setPixelRatio=function(a){void 0!==a&&(Q=a,this.setSize(ba,L,!1))};this.getSize=function(){return{width:ba,\nheight:L}};this.setSize=function(a,b,c){var d=sa.getDevice();d&&d.isPresenting?console.warn(\"THREE.WebGLRenderer: Can't change size while VR device is presenting.\"):(ba=a,L=b,x.width=a*Q,x.height=b*Q,!1!==c&&(x.style.width=a+\"px\",x.style.height=b+\"px\"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:ba*Q,height:L*Q}};this.setDrawingBufferSize=function(a,b,c){ba=a;L=b;Q=c;x.width=a*c;x.height=b*c;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){hd.set(a,L-\nb-d,c,d);ga.viewport(U.copy(hd).multiplyScalar(Q))};this.setScissor=function(a,b,c,d){ea.set(a,L-b-d,c,d);ga.scissor(J.copy(ea).multiplyScalar(Q))};this.setScissorTest=function(a){ga.setScissorTest(na=a)};this.getClearColor=ya.getClearColor;this.setClearColor=ya.setClearColor;this.getClearAlpha=ya.getClearAlpha;this.setClearAlpha=ya.setClearAlpha;this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=A.COLOR_BUFFER_BIT;if(void 0===b||b)d|=A.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=A.STENCIL_BUFFER_BIT;\nA.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=c;this.dispose=function(){x.removeEventListener(\"webglcontextlost\",d,!1);Aa.dispose()};this.renderBufferImmediate=function(a,b,c){ga.initAttributes();var d=ha.get(a);a.hasPositions&&!d.position&&(d.position=A.createBuffer());a.hasNormals&&!d.normal&&\n(d.normal=A.createBuffer());a.hasUvs&&!d.uv&&(d.uv=A.createBuffer());a.hasColors&&!d.color&&(d.color=A.createBuffer());b=b.getAttributes();a.hasPositions&&(A.bindBuffer(A.ARRAY_BUFFER,d.position),A.bufferData(A.ARRAY_BUFFER,a.positionArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.position),A.vertexAttribPointer(b.position,3,A.FLOAT,!1,0,0));if(a.hasNormals){A.bindBuffer(A.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&1===c.shading)for(var e=0,f=\n3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}A.bufferData(A.ARRAY_BUFFER,a.normalArray,A.DYNAMIC_DRAW);ga.enableAttribute(b.normal);A.vertexAttribPointer(b.normal,3,A.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(A.bindBuffer(A.ARRAY_BUFFER,d.uv),A.bufferData(A.ARRAY_BUFFER,a.uvArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.uv),A.vertexAttribPointer(ua.uv,2,A.FLOAT,\n!1,0,0));a.hasColors&&0!==c.vertexColors&&(A.bindBuffer(A.ARRAY_BUFFER,d.color),A.bufferData(A.ARRAY_BUFFER,a.colorArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.color),A.vertexAttribPointer(b.color,3,A.FLOAT,!1,0,0));ga.disableUnusedAttributes();A.drawArrays(A.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){ga.setMaterial(d);var g=p(a,b,d,e);a=c.id+\"_\"+g.id+\"_\"+(!0===d.wireframe);var k=!1;a!==pa&&(pa=a,k=!0);b=e.morphTargetInfluences;if(void 0!==b){var m=[];a=0;for(var q=\nb.length;a<q;a++)k=b[a],m.push([k,a]);m.sort(h);8<m.length&&(m.length=8);var v=c.morphAttributes;a=0;for(q=m.length;a<q;a++)k=m[a],ja[a]=k[0],0!==k[0]?(b=k[1],!0===d.morphTargets&&v.position&&c.addAttribute(\"morphTarget\"+a,v.position[b]),!0===d.morphNormals&&v.normal&&c.addAttribute(\"morphNormal\"+a,v.normal[b])):(!0===d.morphTargets&&c.removeAttribute(\"morphTarget\"+a),!0===d.morphNormals&&c.removeAttribute(\"morphNormal\"+a));a=m.length;for(b=ja.length;a<b;a++)ja[a]=0;g.getUniforms().setValue(A,\"morphTargetInfluences\",\nja);k=!0}b=c.index;q=c.attributes.position;m=1;!0===d.wireframe&&(b=za.getWireframeAttribute(c),m=2);var r;a=Da;null!==b&&(r=ua.get(b),a=Ea,a.setIndex(r));if(k){k=void 0;if(c&&c.isInstancedBufferGeometry&&null===ma.get(\"ANGLE_instanced_arrays\"))console.error(\"THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");else{void 0===k&&(k=0);ga.initAttributes();var v=c.attributes,g=g.getAttributes(),l=d.defaultAttributeValues,\nn;for(n in g){var t=g[n];if(0<=t){var u=v[n];if(void 0!==u){var ca=u.normalized,w=u.itemSize,x=ua.get(u),y=x.buffer,H=x.type,x=x.bytesPerElement;if(u.isInterleavedBufferAttribute){var I=u.data,D=I.stride,u=u.offset;I&&I.isInstancedInterleavedBuffer?(ga.enableAttributeAndDivisor(t,I.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=I.meshPerAttribute*I.count)):ga.enableAttribute(t);A.bindBuffer(A.ARRAY_BUFFER,y);A.vertexAttribPointer(t,w,H,ca,D*x,(k*D+u)*x)}else u.isInstancedBufferAttribute?\n(ga.enableAttributeAndDivisor(t,u.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):ga.enableAttribute(t),A.bindBuffer(A.ARRAY_BUFFER,y),A.vertexAttribPointer(t,w,H,ca,0,k*w*x)}else if(void 0!==l&&(ca=l[n],void 0!==ca))switch(ca.length){case 2:A.vertexAttrib2fv(t,ca);break;case 3:A.vertexAttrib3fv(t,ca);break;case 4:A.vertexAttrib4fv(t,ca);break;default:A.vertexAttrib1fv(t,ca)}}}ga.disableUnusedAttributes()}null!==b&&A.bindBuffer(A.ELEMENT_ARRAY_BUFFER,\nr.buffer)}r=0;null!==b?r=b.count:void 0!==q&&(r=q.count);b=c.drawRange.start*m;q=null!==f?f.start*m:0;n=Math.max(b,q);f=Math.max(0,Math.min(r,b+c.drawRange.count*m,q+(null!==f?f.count*m:Infinity))-1-n+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ga.setLineWidth(d.wireframeLinewidth*(null===P?Q:1)),a.setMode(A.LINES);else switch(e.drawMode){case 0:a.setMode(A.TRIANGLES);break;case 1:a.setMode(A.TRIANGLE_STRIP);break;case 2:a.setMode(A.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ga.setLineWidth(d*\n(null===P?Q:1)),e.isLineSegments?a.setMode(A.LINES):e.isLineLoop?a.setMode(A.LINE_LOOP):a.setMode(A.LINE_STRIP)):e.isPoints&&a.setMode(A.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,n,f):a.render(n,f)}};this.compile=function(a,b){aa=[];a.traverse(function(a){a.isLight&&aa.push(a)});t(aa,b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)v(b.material[c],a.fog,b);else v(b.material,a.fog,b)})};this.animate=function(a){function b(){a();\n(sa.getDevice()||window).requestAnimationFrame(b)}(sa.getDevice()||window).requestAnimationFrame(b)};this.render=function(a,b,c,d){if(b&&b.isCamera){pa=\"\";V=-1;S=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();sa.enabled&&(b=sa.getCamera(b));jd.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Vd.setFromMatrix(jd);aa.length=0;C.length=0;z.length=0;Wd=this.localClippingEnabled;id=Ha.init(this.clippingPlanes,Wd,b);F=Aa.get(a,b);F.init();k(a,b,B.sortObjects);\nF.finish();!0===B.sortObjects&&F.sort();id&&Ha.beginShadows();for(var e=aa,f=0,g=0,h=e.length;g<h;g++){var q=e[g];q.castShadow&&(da.shadows[f]=q,f++)}da.shadows.length=f;Ba.render(a,b);t(aa,b);id&&Ha.endShadows();la.frame++;la.calls=0;la.vertices=0;la.faces=0;la.points=0;void 0===c&&(c=null);this.setRenderTarget(c);ya.render(a,b,d);d=F.opaque;e=F.transparent;a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,b,f),e.length&&m(e,a,b,f)):(d.length&&m(d,a,b),e.length&&m(e,a,b));Fa.render(a,b);Ga.render(a,\nb,U);c&&ra.updateRenderTargetMipmap(c);ga.buffers.depth.setTest(!0);ga.buffers.depth.setMask(!0);ga.buffers.color.setMask(!0);b.isArrayCamera&&B.setScissorTest(!1);sa.enabled&&sa.submitFrame()}else console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\")};this.setFaceCulling=function(a,b){ga.setCullFace(a);ga.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=X;a>=ia.maxTextures&&console.warn(\"THREE.WebGLRenderer: Trying to use \"+a+\" texture units while this GPU supports only \"+\nia.maxTextures);X+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn(\"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\"),a=!0),b=b.texture);ra.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn(\"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\"),a=!0);ra.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=\n!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn(\"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\"),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ra.setTextureCube(b,c):ra.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ha.get(a).__webglFramebuffer&&ra.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,\nc;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,J.copy(a.scissor),Z=a.scissorTest,U.copy(a.viewport)):(c=null,J.copy(ea).multiplyScalar(Q),Z=na,U.copy(hd).multiplyScalar(Q));M!==c&&(A.bindFramebuffer(A.FRAMEBUFFER,c),M=c);ga.scissor(J);ga.setScissorTest(Z);ga.viewport(U);b&&(b=ha.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=\nfunction(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=ha.get(a).__webglFramebuffer;if(g){var h=!1;g!==M&&(A.bindFramebuffer(A.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&y(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.\"):1009===q||y(q)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ma.get(\"OES_texture_float\")||ma.get(\"WEBGL_color_buffer_float\"))||\n1016===q&&ma.get(\"EXT_color_buffer_half_float\")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,y(m),y(q),f):console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.\"):console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.\")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,M)}}}else console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.\")}}\nfunction Ib(a,b){this.name=\"\";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name=\"\";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function ld(){z.call(this);this.type=\"Scene\";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new n;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function bb(a){U.call(this);this.type=\"SpriteMaterial\";\nthis.color=new G(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function xc(a){z.call(this);this.type=\"Sprite\";this.material=void 0!==a?a:new bb}function yc(){z.call(this);this.type=\"LOD\";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function zc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn(\"THREE.Skeleton boneInverses is the wrong length.\");\nthis.boneInverses=[];for(var c=0,d=this.bones.length;c<d;c++)this.boneInverses.push(new K)}}function md(){z.call(this);this.type=\"Bone\"}function nd(a,b){la.call(this,a,b);this.type=\"SkinnedMesh\";this.bindMode=\"attached\";this.bindMatrix=new K;this.bindMatrixInverse=new K;var c=this.initBones(),c=new zc(c);this.bind(c,this.matrixWorld);this.normalizeSkinWeights()}function ea(a){U.call(this);this.type=\"LineBasicMaterial\";this.color=new G(16777215);this.linewidth=1;this.linejoin=this.linecap=\"round\";\nthis.lights=!1;this.setValues(a)}function sa(a,b,c){if(1===c)return console.warn(\"THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.\"),new Q(a,b);z.call(this);this.type=\"Line\";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new ea({color:16777215*Math.random()})}function Q(a,b){sa.call(this,a,b);this.type=\"LineSegments\"}function od(a,b){sa.call(this,a,b);this.type=\"LineLoop\"}function Fa(a){U.call(this);this.type=\"PointsMaterial\";this.color=\nnew G(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Kb(a,b){z.call(this);this.type=\"Points\";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new Fa({color:16777215*Math.random()})}function Ac(){z.call(this);this.type=\"Group\"}function pd(a,b,c,d,e,f,g,h,k){function m(){requestAnimationFrame(m);a.readyState>=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0)}ba.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;m()}function Lb(a,b,\nc,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function qd(a,b,c,d,e,f,g,h,k){ba.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Bc(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error(\"DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat\");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);ba.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,\nheight:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Mb(a){E.call(this);this.type=\"WireframeGeometry\";var b=[],c,d,e,f,g=[0,0],h={},k,m,q=[\"a\",\"b\",\"c\"];if(a&&a.isGeometry){var v=a.faces;c=0;for(e=v.length;c<e;c++){var p=v[c];for(d=0;3>d;d++)k=p[q[d]],m=p[q[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+\",\"+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],q=a.vertices[c.index1],b.push(q.x,q.y,q.z),q=a.vertices[c.index2],\nb.push(q.x,q.y,q.z)}else if(a&&a.isBufferGeometry){var r,q=new n;if(null!==a.index){v=a.attributes.position;p=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:p.count,materialIndex:0}]);a=0;for(f=r.length;a<f;++a)for(c=r[a],d=c.start,e=c.count,c=d,e=d+e;c<e;c+=3)for(d=0;3>d;d++)k=p.getX(c+d),m=p.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+\",\"+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],q.fromBufferAttribute(v,c.index1),b.push(q.x,q.y,q.z),q.fromBufferAttribute(v,\nc.index2),b.push(q.x,q.y,q.z)}else for(v=a.attributes.position,c=0,e=v.count/3;c<e;c++)for(d=0;3>d;d++)h=3*c+d,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z),h=3*c+(d+1)%3,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z)}this.addAttribute(\"position\",new B(b,3))}function Cc(a,b,c){J.call(this);this.type=\"ParametricGeometry\";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function Nb(a,b,c){E.call(this);this.type=\"ParametricBufferGeometry\";this.parameters=\n{func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new n,k=new n,m=new n,q=new n,v=new n,p,r,l=b+1;for(p=0;p<=c;p++){var t=p/c;for(r=0;r<=b;r++){var y=r/b,k=a(y,t,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(m=a(y-1E-5,t,m),q.subVectors(k,m)):(m=a(y+1E-5,t,m),q.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),v.subVectors(k,m)):(m=a(y,t+1E-5,m),v.subVectors(m,k));h.crossVectors(q,v).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(p=0;p<c;p++)for(r=0;r<b;r++)a=p*l+r+1,h=(p+1)*l+r+1,k=(p+1)*l+r,d.push(p*l+r,a,k),\nd.push(a,h,k);this.setIndex(d);this.addAttribute(\"position\",new B(e,3));this.addAttribute(\"normal\",new B(f,3));this.addAttribute(\"uv\",new B(g,2))}function Dc(a,b,c,d){J.call(this);this.type=\"PolyhedronGeometry\";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new za(a,b,c,d));this.mergeVertices()}function za(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===\nc.z&&(k[b]=d/2/Math.PI+.5)}E.call(this);this.type=\"PolyhedronBufferGeometry\";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new n,d=new n,g=new n,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k=c,l=d,y=g,x=Math.pow(2,a),u=[],H,w;for(H=0;H<=x;H++){u[H]=[];var I=k.clone().lerp(y,H/x),W=l.clone().lerp(y,H/x),D=x-H;for(w=0;w<=D;w++)u[H][w]=0===w&&H===x?I:I.clone().lerp(W,w/D)}for(H=0;H<x;H++)for(w=0;w<2*(x-H)-1;w++)k=Math.floor(w/\n2),0===w%2?(e(u[H][k+1]),e(u[H+1][k]),e(u[H][k])):(e(u[H][k+1]),e(u[H+1][k+1]),e(u[H+1][k]))}})(d);(function(a){for(var b=new n,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new n,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new n,b=new n,c=new n,d=new n,e=new C,f=new C,l=new C,y=0,\nx=0;y<h.length;y+=9,x+=6){a.set(h[y+0],h[y+1],h[y+2]);b.set(h[y+3],h[y+4],h[y+5]);c.set(h[y+6],h[y+7],h[y+8]);e.set(k[x+0],k[x+1]);f.set(k[x+2],k[x+3]);l.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var u=Math.atan2(d.z,-d.x);g(e,x+0,a,u);g(f,x+2,b,u);g(l,x+4,c,u)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute(\"position\",new B(h,3));this.addAttribute(\"normal\",\nnew B(h.slice(),3));this.addAttribute(\"uv\",new B(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Ec(a,b){J.call(this);this.type=\"TetrahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Ob(a,b){za.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type=\"TetrahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Fc(a,b){J.call(this);this.type=\"OctahedronGeometry\";this.parameters=\n{radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function lb(a,b){za.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type=\"OctahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Gc(a,b){J.call(this);this.type=\"IcosahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;za.call(this,[-1,c,0,1,c,0,\n-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type=\"IcosahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Hc(a,b){J.call(this);this.type=\"DodecahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;za.call(this,\n[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type=\"DodecahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Ic(a,\nb,c,d,e,f){J.call(this);this.type=\"TubeGeometry\";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn(\"THREE.TubeGeometry: taper has been removed.\");a=new Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(v=0;v<=d;v++){var q=v/d*Math.PI*2,l=Math.sin(q),q=-Math.cos(q);\nk.x=q*m.x+l*e.x;k.y=q*m.y+l*e.y;k.z=q*m.z+l*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;p.push(h.x,h.y,h.z)}}E.call(this);this.type=\"TubeBufferGeometry\";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new n,k=new n,m=new C,q,v,p=[],r=[],l=[],t=[];for(q=0;q<b;q++)f(q);f(!1===e?b:0);for(q=0;q<=\nb;q++)for(v=0;v<=d;v++)m.x=q/b,m.y=v/d,l.push(m.x,m.y);(function(){for(v=1;v<=b;v++)for(q=1;q<=d;q++){var a=(d+1)*v+(q-1),c=(d+1)*v+q,e=(d+1)*(v-1)+q;t.push((d+1)*(v-1)+(q-1),a,e);t.push(a,c,e)}})();this.setIndex(t);this.addAttribute(\"position\",new B(p,3));this.addAttribute(\"normal\",new B(r,3));this.addAttribute(\"uv\",new B(l,2))}function Jc(a,b,c,d,e,f,g){J.call(this);this.type=\"TorusKnotGeometry\";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn(\"THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.\");\nthis.fromBufferGeometry(new Sb(a,b,c,d,e,f));this.mergeVertices()}function Sb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}E.call(this);this.type=\"TorusKnotBufferGeometry\";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],m=[],q=[],v,p,r=new n,l=new n,t=new n,y=new n,x=new n,u=new n,H=new n;for(v=\n0;v<=c;++v)for(p=v/c*e*Math.PI*2,g(p,e,f,a,t),g(p+.01,e,f,a,y),u.subVectors(y,t),H.addVectors(y,t),x.crossVectors(u,H),H.crossVectors(x,u),x.normalize(),H.normalize(),p=0;p<=d;++p){var w=p/d*Math.PI*2,I=-b*Math.cos(w),w=b*Math.sin(w);r.x=t.x+(I*H.x+w*x.x);r.y=t.y+(I*H.y+w*x.y);r.z=t.z+(I*H.z+w*x.z);k.push(r.x,r.y,r.z);l.subVectors(r,t).normalize();m.push(l.x,l.y,l.z);q.push(v/c);q.push(p/d)}for(p=1;p<=c;p++)for(v=1;v<=d;v++)a=(d+1)*p+(v-1),b=(d+1)*p+v,e=(d+1)*(p-1)+v,h.push((d+1)*(p-1)+(v-1),a,e),\nh.push(a,b,e);this.setIndex(h);this.addAttribute(\"position\",new B(k,3));this.addAttribute(\"normal\",new B(m,3));this.addAttribute(\"uv\",new B(q,2))}function Kc(a,b,c,d,e){J.call(this);this.type=\"TorusGeometry\";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Tb(a,b,c,d,e));this.mergeVertices()}function Tb(a,b,c,d,e){E.call(this);this.type=\"TorusBufferGeometry\";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=\nb||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],m=new n,q=new n,v=new n,p,r;for(p=0;p<=c;p++)for(r=0;r<=d;r++){var l=r/d*e,t=p/c*Math.PI*2;q.x=(a+b*Math.cos(t))*Math.cos(l);q.y=(a+b*Math.cos(t))*Math.sin(l);q.z=b*Math.sin(t);g.push(q.x,q.y,q.z);m.x=a*Math.cos(l);m.y=a*Math.sin(l);v.subVectors(q,m).normalize();h.push(v.x,v.y,v.z);k.push(r/d);k.push(p/c)}for(p=1;p<=c;p++)for(r=1;r<=d;r++)a=(d+1)*(p-1)+r-1,b=(d+1)*(p-1)+r,e=(d+1)*p+r,f.push((d+1)*p+r-1,a,e),f.push(a,\nb,e);this.setIndex(f);this.addAttribute(\"position\",new B(g,3));this.addAttribute(\"normal\",new B(h,3));this.addAttribute(\"uv\",new B(k,2))}function cb(a,b){J.call(this);this.type=\"ExtrudeGeometry\";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ga(a,b));this.mergeVertices()}function Ga(a,b){\"undefined\"!==typeof a&&(E.call(this),this.type=\"ExtrudeBufferGeometry\",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Lc(a,b){J.call(this);this.type=\"TextGeometry\";\nthis.parameters={text:a,parameters:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error(\"THREE.TextGeometry: font parameter is not an instance of THREE.Font.\"),new J;c=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Ga.call(this,c,b);this.type=\"TextBufferGeometry\"}\nfunction Mc(a,b,c,d,e,f,g){J.call(this);this.type=\"SphereGeometry\";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new mb(a,b,c,d,e,f,g));this.mergeVertices()}function mb(a,b,c,d,e,f,g){E.call(this);this.type=\"SphereBufferGeometry\";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==\nd?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,m,q=0,v=[],p=new n,r=new n,l=[],t=[],y=[],x=[];for(m=0;m<=c;m++){var u=[],H=m/c;for(k=0;k<=b;k++){var w=k/b;p.x=-a*Math.cos(d+w*e)*Math.sin(f+H*g);p.y=a*Math.cos(f+H*g);p.z=a*Math.sin(d+w*e)*Math.sin(f+H*g);t.push(p.x,p.y,p.z);r.set(p.x,p.y,p.z).normalize();y.push(r.x,r.y,r.z);x.push(w,1-H);u.push(q++)}v.push(u)}for(m=0;m<c;m++)for(k=0;k<b;k++)a=v[m][k+1],d=v[m][k],e=v[m+1][k],g=v[m+1][k+1],(0!==m||0<f)&&l.push(a,d,\ng),(m!==c-1||h<Math.PI)&&l.push(d,e,g);this.setIndex(l);this.addAttribute(\"position\",new B(t,3));this.addAttribute(\"normal\",new B(y,3));this.addAttribute(\"uv\",new B(x,2))}function Nc(a,b,c,d,e,f){J.call(this);this.type=\"RingGeometry\";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Vb(a,b,c,d,e,f));this.mergeVertices()}function Vb(a,b,c,d,e,f){E.call(this);this.type=\"RingBufferGeometry\";this.parameters={innerRadius:a,\nouterRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;b=b||50;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],m=[],q=a,v=(b-a)/d,p=new n,r=new C,l,t;for(l=0;l<=d;l++){for(t=0;t<=c;t++)a=e+t/c*f,p.x=q*Math.cos(a),p.y=q*Math.sin(a),h.push(p.x,p.y,p.z),k.push(0,0,1),r.x=(p.x/b+1)/2,r.y=(p.y/b+1)/2,m.push(r.x,r.y);q+=v}for(l=0;l<d;l++)for(b=l*(c+1),t=0;t<c;t++)a=t+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,\nf,q);this.setIndex(g);this.addAttribute(\"position\",new B(h,3));this.addAttribute(\"normal\",new B(k,3));this.addAttribute(\"uv\",new B(m,2))}function Oc(a,b,c,d){J.call(this);this.type=\"LatheGeometry\";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Wb(a,b,c,d));this.mergeVertices()}function Wb(a,b,c,d){E.call(this);this.type=\"LatheBufferGeometry\";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=Y.clamp(d,\n0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new n,m=new C,q,v;for(q=0;q<=b;q++){v=c+q*h*d;var p=Math.sin(v),r=Math.cos(v);for(v=0;v<=a.length-1;v++)k.x=a[v].x*p,k.y=a[v].y,k.z=a[v].x*r,f.push(k.x,k.y,k.z),m.x=q/b,m.y=v/(a.length-1),g.push(m.x,m.y)}for(q=0;q<b;q++)for(v=0;v<a.length-1;v++)c=v+q*a.length,h=c+a.length,k=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,k,m);this.setIndex(e);this.addAttribute(\"position\",new B(f,3));this.addAttribute(\"uv\",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=\nthis.attributes.normal.array,e=new n,f=new n,g=new n,c=b*a.length*3,v=q=0;q<a.length;q++,v+=3)e.x=d[v+0],e.y=d[v+1],e.z=d[v+2],f.x=d[c+v+0],f.y=d[c+v+1],f.z=d[c+v+2],g.addVectors(e,f).normalize(),d[v+0]=d[c+v+0]=g.x,d[v+1]=d[c+v+1]=g.y,d[v+2]=d[c+v+2]=g.z}function Xb(a,b){J.call(this);this.type=\"ShapeGeometry\";\"object\"===typeof b&&(console.warn(\"THREE.ShapeGeometry: Options parameter has been removed.\"),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new Yb(a,\nb));this.mergeVertices()}function Yb(a,b){function c(a){var c,h,m=e.length/3;a=a.extractPoints(b);var l=a.shape,n=a.holes;if(!1===Ia.isClockWise(l))for(l=l.reverse(),a=0,c=n.length;a<c;a++)h=n[a],!0===Ia.isClockWise(h)&&(n[a]=h.reverse());var y=Ia.triangulateShape(l,n);a=0;for(c=n.length;a<c;a++)h=n[a],l=l.concat(h);a=0;for(c=l.length;a<c;a++)h=l[a],e.push(h.x,h.y,0),f.push(0,0,1),g.push(h.x,h.y);a=0;for(c=y.length;a<c;a++)l=y[a],d.push(l[0]+m,l[1]+m,l[2]+m),k+=3}E.call(this);this.type=\"ShapeBufferGeometry\";\nthis.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(d);this.addAttribute(\"position\",new B(e,3));this.addAttribute(\"normal\",new B(f,3));this.addAttribute(\"uv\",new B(g,2))}function Zb(a,b){E.call(this);this.type=\"EdgesGeometry\";this.parameters={thresholdAngle:b};var c=[],d=Math.cos(Y.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g,h,k=[\"a\",\"b\",\"c\"],m;a.isBufferGeometry?\n(m=new J,m.fromBufferGeometry(a)):m=a.clone();m.mergeVertices();m.computeFaceNormals();var q=m.vertices;m=m.faces;for(var v=0,p=m.length;v<p;v++)for(var l=m[v],n=0;3>n;n++)g=l[k[n]],h=l[k[(n+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+\",\"+e[1],void 0===f[g]?f[g]={index1:e[0],index2:e[1],face1:v,face2:void 0}:f[g].face2=v;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=q[e.index1],c.push(k.x,k.y,k.z),k=q[e.index2],c.push(k.x,k.y,k.z);this.addAttribute(\"position\",\nnew B(c,3))}function nb(a,b,c,d,e,f,g,h){J.call(this);this.type=\"CylinderGeometry\";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Ua(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new C,D=new n,O=0,aa=!0===c?a:b,F=!0===c?1:-1;f=ca;for(e=1;e<=d;e++)v.push(0,y*F,0),p.push(0,F,0),l.push(.5,.5),ca++;k=ca;for(e=0;e<=d;e++){var B=e/d*h+g,z=Math.cos(B),\nB=Math.sin(B);D.x=aa*B;D.y=y*F;D.z=aa*z;v.push(D.x,D.y,D.z);p.push(0,F,0);t.x=.5*z+.5;t.y=.5*B*F+.5;l.push(t.x,t.y);ca++}for(e=0;e<d;e++)t=f+e,D=k+e,!0===c?q.push(D,D+1,t):q.push(D+1,D,t),O+=3;m.addGroup(x,O,!0===c?1:2);x+=O}E.call(this);this.type=\"CylinderBufferGeometry\";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=Math.floor(d)||8;e=Math.floor(e)||\n1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],v=[],p=[],l=[],ca=0,t=[],y=c/2,x=0;(function(){var f,k,w=new n,I=new n,W=0,D=(b-a)/c;for(k=0;k<=e;k++){var O=[],aa=k/e,F=aa*(b-a)+a;for(f=0;f<=d;f++){var B=f/d,C=B*h+g,z=Math.sin(C),C=Math.cos(C);I.x=F*z;I.y=-aa*c+y;I.z=F*C;v.push(I.x,I.y,I.z);w.set(z,D,C).normalize();p.push(w.x,w.y,w.z);l.push(B,1-aa);O.push(ca++)}t.push(O)}for(f=0;f<d;f++)for(k=0;k<e;k++)w=t[k+1][f],I=t[k+1][f+1],D=t[k][f+1],q.push(t[k][f],w,D),q.push(w,I,D),\nW+=6;m.addGroup(x,W,0);x+=W})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute(\"position\",new B(v,3));this.addAttribute(\"normal\",new B(p,3));this.addAttribute(\"uv\",new B(l,2))}function Pc(a,b,c,d,e,f,g){nb.call(this,0,a,b,c,d,e,f,g);this.type=\"ConeGeometry\";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Qc(a,b,c,d,e,f,g){Ua.call(this,0,a,b,c,d,e,f,g);this.type=\"ConeBufferGeometry\";this.parameters={radius:a,\nheight:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Rc(a,b,c,d){J.call(this);this.type=\"CircleGeometry\";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){E.call(this);this.type=\"CircleBufferGeometry\";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],\nh=[],k,m,q=new n,v=new C;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);m=0;for(k=3;m<=b;m++,k+=3){var p=c+m/b*d;q.x=a*Math.cos(p);q.y=a*Math.sin(p);f.push(q.x,q.y,q.z);g.push(0,0,1);v.x=(f[k]/a+1)/2;v.y=(f[k+1]/a+1)/2;h.push(v.x,v.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute(\"position\",new B(f,3));this.addAttribute(\"normal\",new B(g,3));this.addAttribute(\"uv\",new B(h,2))}function ac(a){ra.call(this,{uniforms:Ca.merge([R.lights,{opacity:{value:1}}]),vertexShader:X.shadow_vert,\nfragmentShader:X.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}});this.setValues(a)}function bc(a){ra.call(this,a);this.type=\"RawShaderMaterial\"}function Pa(a){U.call(this);this.defines={STANDARD:\"\"};this.type=\"MeshStandardMaterial\";this.color=new G(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=\nnull;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=\n!1;this.setValues(a)}function ob(a){Pa.call(this);this.defines={PHYSICAL:\"\"};this.type=\"MeshPhysicalMaterial\";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ja(a){U.call(this);this.type=\"MeshPhongMaterial\";this.color=new G(16777215);this.specular=new G(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=\n1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function pb(a){Ja.call(this);this.defines={TOON:\"\"};this.type=\"MeshToonMaterial\";this.gradientMap=null;\nthis.setValues(a)}function qb(a){U.call(this);this.type=\"MeshNormalMaterial\";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function rb(a){U.call(this);this.type=\"MeshLambertMaterial\";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=\n1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function sb(a){U.call(this);this.type=\"LineDashedMaterial\";this.color=new G(16777215);this.scale=this.linewidth=1;this.dashSize=\n3;this.gapSize=1;this.lights=!1;this.setValues(a)}function Zd(a,b,c){var d=this,e=!1,f=0,g=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}}function Ka(a){this.manager=void 0!==a?a:va}function Oe(a){this.manager=void 0!==\na?a:va;this._parser=null}function $d(a){this.manager=void 0!==a?a:va;this._parser=null}function Sc(a){this.manager=void 0!==a?a:va}function ae(a){this.manager=void 0!==a?a:va}function rd(a){this.manager=void 0!==a?a:va}function na(a,b){z.call(this);this.type=\"Light\";this.color=new G(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function sd(a,b,c){na.call(this,a,c);this.type=\"HemisphereLight\";this.castShadow=void 0;this.position.copy(z.DefaultUp);this.updateMatrix();this.groundColor=new G(b)}\nfunction tb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new K}function td(){tb.call(this,new qa(50,1,.5,500))}function ud(a,b,c,d,e,f){na.call(this,a,b);this.type=\"SpotLight\";this.position.copy(z.DefaultUp);this.updateMatrix();this.target=new z;Object.defineProperty(this,\"power\",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=\nvoid 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new td}function vd(a,b,c,d){na.call(this,a,b);this.type=\"PointLight\";Object.defineProperty(this,\"power\",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new tb(new qa(90,1,.5,500))}function wd(){tb.call(this,new Fb(-5,5,5,-5,.5,500))}function xd(a,b){na.call(this,a,b);this.type=\"DirectionalLight\";this.position.copy(z.DefaultUp);this.updateMatrix();\nthis.target=new z;this.shadow=new wd}function yd(a,b){na.call(this,a,b);this.type=\"AmbientLight\";this.castShadow=void 0}function zd(a,b,c,d){na.call(this,a,b);this.type=\"RectAreaLight\";this.position.set(0,1,0);this.updateMatrix();this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function wa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Ad(a,b,c,d){wa.call(this,a,b,c,d);this._offsetNext=\nthis._weightNext=this._offsetPrev=this._weightPrev=-0}function Tc(a,b,c,d){wa.call(this,a,b,c,d)}function Bd(a,b,c,d){wa.call(this,a,b,c,d)}function ub(a,b,c,d){if(void 0===a)throw Error(\"track name is undefined\");if(void 0===b||0===b.length)throw Error(\"no keyframes in track named \"+a);this.name=a;this.times=ia.convertArray(b,this.TimeBufferType);this.values=ia.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function cc(a,b,\nc,d){ub.call(this,a,b,c,d)}function Cd(a,b,c,d){wa.call(this,a,b,c,d)}function Uc(a,b,c,d){ub.call(this,a,b,c,d)}function dc(a,b,c,d){ub.call(this,a,b,c,d)}function Dd(a,b,c,d){ub.call(this,a,b,c,d)}function Ed(a,b,c){ub.call(this,a,b,c)}function Fd(a,b,c,d){ub.call(this,a,b,c,d)}function vb(a,b,c,d){ub.apply(this,arguments)}function Da(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=Y.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Gd(a){this.manager=\nvoid 0!==a?a:va;this.textures={}}function be(a){this.manager=void 0!==a?a:va}function ec(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ce(a){\"boolean\"===typeof a&&(console.warn(\"THREE.JSONLoader: showStatus parameter has been removed from constructor.\"),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function Pe(a){this.manager=void 0!==a?a:va;this.texturePath=\"\"}function Qe(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*\nc-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function wb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function xb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function ua(){this.arcLengthDivisions=200}function Qa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Vc(){this.arcLengthDivisions=200;this.curves=[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=\nf;this.aClockwise=g;this.aRotation=h||0}function yb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function fc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function gc(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Wc(a){Vc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function zb(){Wc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Re(a){this.manager=\nvoid 0!==a?a:va}function fe(a){this.manager=void 0!==a?a:va}function Se(){this.type=\"StereoCamera\";this.aspect=1;this.eyeSep=.064;this.cameraL=new qa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new qa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Hd(a,b,c){z.call(this);this.type=\"CubeCamera\";var d=new qa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new n(1,0,0));this.add(d);var e=new qa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new n(-1,0,0));this.add(e);\nvar f=new qa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new n(0,1,0));this.add(f);var g=new qa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new n(0,-1,0));this.add(g);var h=new qa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new n(0,0,1));this.add(h);var k=new qa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new n(0,0,-1));this.add(k);this.renderTarget=new Db(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name=\"CubeCamera\";this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=\nthis.renderTarget,p=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(){z.call(this);this.type=\"AudioListener\";this.context=he.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=\nnull}function hc(a){z.call(this);this.type=\"Audio\";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType=\"empty\";this.filters=[]}function ie(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function je(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==\nb?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function ke(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case \"quaternion\":b=this._slerp;break;case \"string\":case \"bool\":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Te(a,b,c){c=c||ha.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function ha(a,\nb,c){this.path=b;this.parsedPath=c||ha.parseTrackName(b);this.node=ha.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Ue(a){this.uuid=Y.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-\ne.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Ve(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=\nnull;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function We(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Id(a,b){\"string\"===typeof a&&(console.warn(\"THREE.Uniform: Type parameter is no longer needed.\"),a=b);this.value=a}function le(){E.call(this);this.type=\"InstancedBufferGeometry\";\nthis.maxInstancedCount=void 0}function me(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function ic(a,b){this.uuid=Y.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function ne(a,b,c){ic.call(this,a,b);this.meshPerAttribute=c||1}function oe(a,b,c){Z.call(this,a,b);this.meshPerAttribute=c||1}function Xe(a,b,c,d){this.ray=\nnew kb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn(\"THREE.Raycaster: params.PointCloud has been renamed to params.Points.\");return this.Points}}})}function Ye(a,b){return a.distance-b.distance}function pe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)pe(a[d],b,c,!0)}}function Ze(a){this.autoStart=void 0!==a?\na:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function $e(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function af(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ta(a,b){la.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,c-1,c/1);this.setAnimationWeight(\"__default\",1)}function Xc(a){z.call(this);\nthis.material=a;this.render=function(a){}}function Yc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new E;b=new B(6*b,3);c.addAttribute(\"position\",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function jc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=\n!1;a=new E;for(var b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute(\"position\",new B(b,3));b=new ea({fog:!1});this.cone=new Q(a,b);this.add(this.cone);this.update()}function bf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,bf(a.children[c]));return b}function kc(a){for(var b=bf(a),c=new E,d=[],e=[],f=new G(0,\n0,1),g=new G(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute(\"position\",new B(d,3));c.addAttribute(\"color\",new B(e,3));d=new ea({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});Q.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.onBeforeRender()}function lc(a,b){this.light=a;this.light.updateMatrixWorld();var c=new mb(b,4,2),d=new ya({wireframe:!0,\nfog:!1});d.color.copy(this.light.color);la.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1}function mc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;a=new ea({color:a.color});var b=new E;b.addAttribute(\"position\",new Z(new Float32Array(15),3));this.add(new sa(b,a));this.update()}function nc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;var c=\nnew lb(b);c.rotateY(.5*Math.PI);var d=new ya({vertexColors:2,wireframe:!0}),e=c.getAttribute(\"position\"),e=new Float32Array(3*e.count);c.addAttribute(\"color\",new Z(e,3));this.add(new la(c,d));this.update()}function Zc(a,b,c,d){a=a||10;b=b||10;c=new G(void 0!==c?c:4473924);d=new G(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,m=0,q=-g;k<=b;k++,q+=f){a.push(-g,0,q,g,0,q);a.push(q,0,-g,q,0,g);var l=k===e?c:d;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,\nm);m+=3}b=new E;b.addAttribute(\"position\",new B(a,3));b.addAttribute(\"color\",new B(h,3));c=new ea({vertexColors:2});Q.call(this,b,c)}function Jd(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new G(void 0!==e?e:4473924);f=new G(void 0!==f?f:8947848);var g=[],h=[],k,m,q,l,p;for(q=0;q<=b;q++)m=q/b*2*Math.PI,k=Math.sin(m)*a,m=Math.cos(m)*a,g.push(0,0,0),g.push(k,0,m),p=q&1?e:f,h.push(p.r,p.g,p.b),h.push(p.r,p.g,p.b);for(q=0;q<=c;q++)for(p=q&1?e:f,l=a-a/c*q,b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*l,\nm=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*l,m=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b);a=new E;a.addAttribute(\"position\",new B(g,3));a.addAttribute(\"color\",new B(h,3));g=new ea({vertexColors:2});Q.call(this,a,g)}function $c(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn(\"THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.\");\nc=new E;b=new B(6*b,3);c.addAttribute(\"position\",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function oc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new E;c.addAttribute(\"position\",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new ea({fog:!1});this.add(new sa(c,d));c=new E;c.addAttribute(\"position\",new B([0,0,0,0,0,1],3));this.add(new sa(c,d));this.update()}\nfunction ad(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new E,e=new ea({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new G(16755200),m=new G(16711680),q=new G(43775),l=new G(16777215),p=new G(3355443);b(\"n1\",\"n2\",k);b(\"n2\",\"n4\",k);b(\"n4\",\"n3\",k);b(\"n3\",\"n1\",k);b(\"f1\",\"f2\",k);b(\"f2\",\"f4\",k);b(\"f4\",\"f3\",k);b(\"f3\",\"f1\",k);b(\"n1\",\"f1\",k);b(\"n2\",\"f2\",k);b(\"n3\",\"f3\",k);b(\"n4\",\"f4\",k);b(\"p\",\"n1\",m);b(\"p\",\n\"n2\",m);b(\"p\",\"n3\",m);b(\"p\",\"n4\",m);b(\"u1\",\"u2\",q);b(\"u2\",\"u3\",q);b(\"u3\",\"u1\",q);b(\"c\",\"t\",l);b(\"p\",\"c\",p);b(\"cn1\",\"cn2\",p);b(\"cn3\",\"cn4\",p);b(\"cf1\",\"cf2\",p);b(\"cf3\",\"cf4\",p);d.addAttribute(\"position\",new B(f,3));d.addAttribute(\"color\",new B(g,3));Q.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Ab(a,b){this.object=a;void 0===b&&(b=16776960);var c=new Uint16Array([0,\n1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new E;e.setIndex(new Z(c,1));e.addAttribute(\"position\",new Z(d,3));Q.call(this,e,new ea({color:b}));this.matrixAutoUpdate=!1;this.update()}function Bb(a,b,c,d,e,f){z.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Kd&&(Kd=new E,Kd.addAttribute(\"position\",new B([0,0,0,0,1,0],3)),qe=new Ua(0,.5,1,5,1),qe.translate(0,-.5,0));this.position.copy(b);this.line=new sa(Kd,new ea({color:d}));\nthis.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new la(qe,new ya({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function Ld(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new E;a.addAttribute(\"position\",new B(b,3));a.addAttribute(\"color\",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new ea({vertexColors:2});Q.call(this,a,b)}function re(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*\n(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,m,q){e=((f-e)/k-(g-e)/(k+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+q)+(h-g)/q)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function La(a){this.arcLengthDivisions=200;2>a.length&&console.warn(\"THREE.CatmullRomCurve3: Points array needs at least two entries.\");this.points=a||[];this.closed=!1}function bd(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=\nc;this.v3=d}function cd(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function dd(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Md(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}function cf(a){console.warn(\"THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.\");La.call(this,a);this.type=\"catmullrom\";this.closed=!0}function df(a){console.warn(\"THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.\");La.call(this,a);this.type=\n\"catmullrom\"}function se(a){console.warn(\"THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.\");La.call(this,a);this.type=\"catmullrom\"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return\"number\"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,\"name\",{get:function(){return this.toString().match(/^\\s*function\\s*([^\\(\\s]*)/)[1]}});\nvoid 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError(\"Cannot convert undefined or null to object\");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(xa.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},\nhasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var b=b.slice(0),c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var Y={DEG2RAD:Math.PI/180,RAD2DEG:180/\nMath.PI,generateUUID:function(){var a=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\".split(\"\"),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]=\"-\":14===e?b[e]=\"4\":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join(\"\")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,\nb,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*Y.DEG2RAD},radToDeg:function(a){return a*Y.RAD2DEG},isPowerOfTwo:function(a){return 0===\n(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=\na;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),\nthis.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},\nsubVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,\nMath.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);\nthis.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||\n1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,\na).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn(\"THREE.Vector2: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-\na.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});var hf=0;ba.DEFAULT_IMAGE=void 0;ba.DEFAULT_MAPPING=300;Object.defineProperty(ba.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});Object.assign(ba.prototype,xa.prototype,{constructor:ba,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=\na.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5,type:\"Texture\",generator:\"Texture.toJSON\"},uuid:this.uuid,\nname:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=Y.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\"),g.width=c.width,g.height=\nc.height,g.getContext(\"2d\").drawImage(c,0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL(\"image/jpeg\",.6):g.toDataURL(\"image/png\");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:\"dispose\"})},transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%\n2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(fa.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},\nsetZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,\nthis.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,\nb){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=\na;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/\nb);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781):\n(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,\na.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new fa,b=new fa);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,\nc)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):\nMath.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+\nMath.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===\nb&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn(\"THREE.Vector4: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Cb.prototype,xa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==\na||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Db.prototype=Object.create(Cb.prototype);\nDb.prototype.constructor=Db;Db.prototype.isWebGLRenderTargetCube=!0;Object.assign(oa,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var p=h*d+k*q+m*l+c*e,r=0<=p?1:-1,n=1-p*p;n>Number.EPSILON&&(n=Math.sqrt(n),p=Math.atan2(n,p*r),f=Math.sin(f*p)/n,g=Math.sin(g*p)/n);r*=g;h=h*f+d*r;k=k*f+q*r;m=m*f+l*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*\nm+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(oa.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(oa.prototype,{set:function(a,b,c,d){this._x=\na;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error(\"THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.\");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=\nh(d/2),e=h(e/2);\"XYZ\"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):\"YXZ\"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):\"ZXY\"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):\"ZYX\"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):\"YZX\"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):\"XZY\"===f&&(this._x=c*m*g-\nk*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+\nc-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new n,b;return function(c,d){void 0===a&&(a=new n);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=\na.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();\n0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.\"),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,\nk=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),\nthis._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b*k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,\nb){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=\nb;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),\nthis.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;\nreturn this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.\"),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*\nb.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new oa;return function(b){b&&b.isEuler||console.error(\"THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.\");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new oa;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*\nb+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*\n-g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},\ndivide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},\nclampScalar:function(){var a=new n,b=new n;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);\nthis.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*\nthis.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.\"),\nthis.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new n;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new n;return function(b){return this.sub(a.copy(b).multiplyScalar(2*\nthis.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(Y.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*\na.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,\n4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn(\"THREE.Vector3: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(K.prototype,\n{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,l,p,r,n,t){var y=this.elements;y[0]=a;y[4]=b;y[8]=c;y[12]=d;y[1]=e;y[5]=f;y[9]=g;y[13]=h;y[2]=k;y[6]=m;y[10]=q;y[14]=l;y[3]=p;y[7]=r;y[11]=n;y[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];\nb[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new n;return function(b){var c=this.elements,d=b.elements,\ne=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error(\"THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.\");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),\nh=Math.cos(e),e=Math.sin(e);if(\"XYZ\"===a.order){a=f*h;var k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else\"YXZ\"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=q+a*c,b[10]=f*g):\"ZXY\"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=q-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):\"ZYX\"===a.order?(a=f*h,k=f*e,m=c*h,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*\nd+q,b[1]=g*e,b[5]=q*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):\"YZX\"===a.order?(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=q-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-q*e):\"XZY\"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=\nc*g;var m=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new n,b=new n,c=new n;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,\na);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.\"),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],q=c[5],l=c[9],\np=c[13],r=c[2],n=c[6],t=c[10],y=c[14],x=c[3],u=c[7],H=c[11],c=c[15],w=d[0],I=d[4],W=d[8],D=d[12],O=d[1],B=d[5],F=d[9],C=d[13],z=d[2],E=d[6],G=d[10],K=d[14],P=d[3],M=d[7],V=d[11],d=d[15];e[0]=f*w+g*O+h*z+k*P;e[4]=f*I+g*B+h*E+k*M;e[8]=f*W+g*F+h*G+k*V;e[12]=f*D+g*C+h*K+k*d;e[1]=m*w+q*O+l*z+p*P;e[5]=m*I+q*B+l*E+p*M;e[9]=m*W+q*F+l*G+p*V;e[13]=m*D+q*C+l*K+p*d;e[2]=r*w+n*O+t*z+y*P;e[6]=r*I+n*B+t*E+y*M;e[10]=r*W+n*F+t*G+y*V;e[14]=r*D+n*C+t*K+y*d;e[3]=x*w+u*O+H*z+c*P;e[7]=x*I+u*B+H*E+c*M;e[11]=x*W+u*F+H*G+\nc*V;e[15]=x*D+u*C+H*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=\na[1],g=a[5],h=a[9],k=a[13],m=a[2],q=a[6],l=a[10],p=a[14];return a[3]*(+e*h*q-d*k*q-e*g*l+c*k*l+d*g*p-c*h*p)+a[7]*(+b*h*p-b*k*l+e*f*l-d*f*p+d*k*m-e*h*m)+a[11]*(+b*k*q-b*g*p-e*f*q+c*f*p+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*q+b*g*l+d*f*q-c*f*l+c*h*m)},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=this.elements;b[12]=\na.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[1],g=d[2],h=d[3],k=d[4],m=d[5],q=d[6],l=d[7],p=d[8],r=d[9],n=d[10],t=d[11],y=d[12],x=d[13],u=d[14],d=d[15],H=r*u*l-x*n*l+x*q*t-m*u*t-r*q*d+m*n*d,w=y*n*l-p*u*l-y*q*t+k*u*t+p*q*d-k*n*d,I=p*x*l-y*r*l+y*m*t-k*x*t-p*m*d+k*r*d,W=y*r*q-p*x*q-y*m*n+k*x*n+p*m*u-k*r*u,D=e*H+f*w+g*I+h*W;if(0===D){if(!0===b)throw Error(\"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\");console.warn(\"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\");\nreturn this.identity()}D=1/D;c[0]=H*D;c[1]=(x*n*h-r*u*h-x*g*t+f*u*t+r*g*d-f*n*d)*D;c[2]=(m*u*h-x*q*h+x*g*l-f*u*l-m*g*d+f*q*d)*D;c[3]=(r*q*h-m*n*h-r*g*l+f*n*l+m*g*t-f*q*t)*D;c[4]=w*D;c[5]=(p*u*h-y*n*h+y*g*t-e*u*t-p*g*d+e*n*d)*D;c[6]=(y*q*h-k*u*h-y*g*l+e*u*l+k*g*d-e*q*d)*D;c[7]=(k*n*h-p*q*h+p*g*l-e*n*l-k*g*t+e*q*t)*D;c[8]=I*D;c[9]=(y*r*h-p*x*h-y*f*t+e*x*t+p*f*d-e*r*d)*D;c[10]=(k*x*h-y*m*h+y*f*l-e*x*l-k*f*d+e*m*d)*D;c[11]=(p*m*h-k*r*h-p*f*l+e*r*l+k*f*t-e*m*t)*D;c[12]=W*D;c[13]=(p*x*g-y*r*g+y*f*n-e*x*\nn-p*f*u+e*r*u)*D;c[14]=(y*m*g-k*x*g-y*f*q+e*x*q+k*f*u-e*m*u)*D;c[15]=(k*r*g-p*m*g+p*f*q-e*r*q-k*f*n+e*m*n)*D;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,\n0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,k=e*f,m=e*g;this.set(k*f+c,k*\ng-d*h,k*h+d*g,0,k*g+d*h,m*g+c,m*h-d*f,0,k*h-d*g,m*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new n,b=new K;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),\nk=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn(\"THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.\");\nvar g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;\na=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});db.prototype=Object.create(ba.prototype);\ndb.prototype.constructor=db;db.prototype.isDataTexture=!0;Xa.prototype=Object.create(ba.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,\"images\",{get:function(){return this.image},set:function(a){this.image=a}});var Ce=new ba,De=new Xa,xe=[],ze=[],Be=new Float32Array(16),Ae=new Float32Array(9);He.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Pd=/([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\neb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};eb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};eb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};eb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,\nbeige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,\ndarkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,\nkhaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,\nmediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,\nperu:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,\nyellow:16776960,yellowgreen:10145074};Object.assign(G.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):\"number\"===typeof a?this.setHex(a):\"string\"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&\n--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=Y.euclideanModulo(b,1);c=Y.clamp(c,0,1);d=Y.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn(\"THREE.Color: Alpha component of \"+a+\" will be ignored.\")}var c;if(c=/^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec(a)){var d=c[2];switch(c[1]){case \"rgb\":case \"rgba\":if(c=\n/^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case \"hsl\":case \"hsla\":if(c=/^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d)){var d=\nparseFloat(c[1])/360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&\n(c=lg[a],void 0!==c?this.setHex(c):console.warn(\"THREE.Color: Unknown color \"+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},\nconvertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return(\"000000\"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===\ne)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return\"rgb(\"+(255*this.r|0)+\",\"+(255*this.g|0)+\",\"+(255*this.b|0)+\")\"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},\naddScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,\nb){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var R={common:{diffuse:{value:new G(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},\naoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new C(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},\nfogFar:{value:2E3},fogColor:{value:new G(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},\npointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new G(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)}}},Ca={merge:function(a){for(var b=\n{},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},X={alphamap_fragment:\"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\",alphamap_pars_fragment:\"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\",\nalphatest_fragment:\"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\",aomap_fragment:\"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\",\naomap_pars_fragment:\"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\",begin_vertex:\"\\nvec3 transformed = vec3( position );\\n\",beginnormal_vertex:\"\\nvec3 objectNormal = vec3( normal );\\n\",bsdfs:\"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t}\\n\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE  = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\\n\\tfloat b = 3.45068 + (4.18814 + y) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\\n\\treturn result;\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\",\nbumpmap_pars_fragment:\"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\",\nclipping_planes_fragment:\"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\",\nclipping_planes_pars_fragment:\"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\",clipping_planes_pars_vertex:\"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\",clipping_planes_vertex:\"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\",\ncolor_fragment:\"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\",color_pars_fragment:\"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\",color_pars_vertex:\"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\",common:\"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\",\ncube_uv_reflection_fragment:\"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale =  bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\",\ndefaultnormal_vertex:\"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n\",displacementmap_pars_vertex:\"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\",displacementmap_vertex:\"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\",\nemissivemap_fragment:\"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\",emissivemap_pars_fragment:\"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\",encodings_fragment:\"  gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\",encodings_pars_fragment:\"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM            = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D      = max( maxRange / maxRGB, 1.0 );\\n\\tD            = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value )  {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\",\nenvmap_fragment:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\",\nenvmap_pars_fragment:\"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\",envmap_vertex:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\",\nfog_vertex:\"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\",fog_pars_vertex:\"#ifdef USE_FOG\\n  varying float fogDepth;\\n#endif\\n\",fog_fragment:\"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\",fog_pars_fragment:\"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\",\ngradientmap_pars_fragment:\"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\",lights_lambert_vertex:\"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",\nlights_pars:\"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\",\nlights_phong_fragment:\"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\",lights_phong_pars_fragment:\"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\",\nlights_physical_fragment:\"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\",\nlights_physical_pars_fragment:\"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tfloat norm = texture2D( ltcMag, uv ).a;\\n\\t\\tvec4 t = texture2D( ltcMat, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3(   1,   0, t.y ),\\n\\t\\t\\tvec3(   0, t.z,   0 ),\\n\\t\\t\\tvec3( t.w,   0, t.x )\\n\\t\\t);\\n\\t\\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\",\nlights_template:\"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\",\nlogdepthbuf_fragment:\"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\",logdepthbuf_pars_fragment:\"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\",logdepthbuf_pars_vertex:\"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\",logdepthbuf_vertex:\"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\",\nmap_fragment:\"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\",map_pars_fragment:\"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\",map_particle_fragment:\"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\",map_particle_pars_fragment:\"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\",\nmetalnessmap_fragment:\"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\\n\",metalnessmap_pars_fragment:\"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\",\nnormal_flip:\"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\",normal_fragment:\"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\",\nnormalmap_pars_fragment:\"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\",\npacking:\"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\",\npremultiplied_alpha_fragment:\"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\",project_vertex:\"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n\",dithering_fragment:\"#if defined( DITHERING )\\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\\n\",dithering_pars_fragment:\"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\\n\",\nroughnessmap_fragment:\"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\\n\",roughnessmap_pars_fragment:\"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\",shadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\",\nshadowmap_vertex:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\",\nshadowmask_pars_fragment:\"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\",\nskinbase_vertex:\"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\",\nskinning_vertex:\"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\\n\",skinnormal_vertex:\"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\",\nspecularmap_fragment:\"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\",specularmap_pars_fragment:\"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\",tonemapping_fragment:\"#if defined( TONE_MAPPING )\\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\",tonemapping_pars_fragment:\"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\",\nuv_pars_fragment:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\",uv_pars_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\",\nuv_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",uv2_pars_fragment:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\",uv2_pars_vertex:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\",\nuv2_vertex:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\",worldpos_vertex:\"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\\n\",cube_frag:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\",\ncube_vert:\"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\",depth_frag:\"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\",\ndepth_vert:\"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n}\\n\",\ndistanceRGBA_frag:\"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\",distanceRGBA_vert:\"varying vec4 vWorldPosition;\\n#include <common>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <skinbase_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition;\\n}\\n\",\nequirect_frag:\"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\",equirect_vert:\"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\",\nlinedashed_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\nlinedashed_vert:\"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshbasic_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <normal_flip>\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\nmeshbasic_vert:\"#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_ENVMAP\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshlambert_frag:\"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <emissivemap_fragment>\\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include <lightmap_fragment>\\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <normal_flip>\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshlambert_vert:\"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <lights_lambert_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshphong_frag:\"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_flip>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshphong_vert:\"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshphysical_frag:\"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <cube_uv_reflection_fragment>\\n#include <lights_pars>\\n#include <lights_physical_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_flip>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshphysical_vert:\"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nnormal_frag:\"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_flip>\\n\\t#include <normal_fragment>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\",\nnormal_vert:\"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\",\npoints_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\npoints_vert:\"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nshadow_frag:\"uniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\",shadow_vert:\"#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n}\\n\"},$a={basic:{uniforms:Ca.merge([R.common,\nR.aomap,R.lightmap,R.fog]),vertexShader:X.meshbasic_vert,fragmentShader:X.meshbasic_frag},lambert:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.fog,R.lights,{emissive:{value:new G(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.gradientmap,R.fog,R.lights,{emissive:{value:new G(0)},specular:{value:new G(1118481)},shininess:{value:30}}]),vertexShader:X.meshphong_vert,\nfragmentShader:X.meshphong_frag},standard:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.roughnessmap,R.metalnessmap,R.fog,R.lights,{emissive:{value:new G(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:Ca.merge([R.points,R.fog]),vertexShader:X.points_vert,fragmentShader:X.points_frag},dashed:{uniforms:Ca.merge([R.common,R.fog,{scale:{value:1},\ndashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,fragmentShader:X.linedashed_frag},depth:{uniforms:Ca.merge([R.common,R.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:Ca.merge([R.common,R.bumpmap,R.normalmap,R.displacementmap,{opacity:{value:1}}]),vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert,fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null},\ntFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new n}},vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};$a.physical={uniforms:Ca.merge([$a.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};Object.assign(fd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();\nfor(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||\nthis.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<\nthis.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},\ndistanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Jf=0;Object.assign(U.prototype,xa.prototype,{isMaterial:!0,onBeforeCompile:function(){},\nsetValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn(\"THREE.Material: '\"+b+\"' parameter is undefined.\");else{var d=this[b];void 0===d?console.warn(\"THREE.\"+this.type+\": '\"+b+\"' is not a property of this material.\"):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=\"overdraw\"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});\nvar d={metadata:{version:4.5,type:\"Material\",generator:\"Material.toJSON\"}};d.uuid=this.uuid;d.type=this.type;\"\"!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);\nvoid 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&\n(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&\n(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==\nthis.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&\n(d.wireframeLinewidth=this.wireframeLinewidth);\"round\"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);\"round\"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);d.skinning=this.skinning;d.morphTargets=this.morphTargets;d.dithering=this.dithering;c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=\na.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=\na.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});\nra.prototype=Object.create(U.prototype);ra.prototype.constructor=ra;ra.prototype.isShaderMaterial=!0;ra.prototype.copy=function(a){U.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ca.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=\na.extensions;return this};ra.prototype.toJSON=function(a){a=U.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Za.prototype=Object.create(U.prototype);Za.prototype.constructor=Za;Za.prototype.isMeshDepthMaterial=!0;Za.prototype.copy=function(a){U.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=\na.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Object.assign(Ra.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],q=a[h+1],l=a[h+2];m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);\nl>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),q=a.getY(h),l=a.getZ(h);m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=\nnew n;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<\nthis.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){var a=\nnew n;return function(b){var c=this;b.updateMatrixWorld(!0);b.traverse(function(b){var e,f;e=b.geometry;if(void 0!==e)if(e.isGeometry){var g=e.vertices;e=0;for(f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}else if(e.isBufferGeometry&&(g=e.attributes.position,void 0!==g))for(e=0,f=g.count;e<f;e++)a.fromBufferAttribute(g,e).applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||\na.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new n).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<\nthis.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new n;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x):(b=a.normal.x*this.max.x,c=a.normal.x*this.min.x);0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*\nthis.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,b){return(b||new n).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new n;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new n;return function(b){b=b||new Ea;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);\nthis.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new n,new n,new n,new n,new n,new n,new n,new n];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,\nthis.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ea.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=\nnew Ra;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-\nthis.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new n;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=\na||new Ra;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ba.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,\n0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),\na.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[3],h=c[6],k=c[1],m=c[4],q=c[7],l=c[2],p=c[5],c=c[8],r=d[0],n=d[3],t=d[6],y=d[1],x=d[4],u=d[7],H=d[2],w=d[5],d=d[8];e[0]=f*r+g*y+h*H;e[3]=f*n+g*x+h*w;e[6]=f*t+g*u+h*d;e[1]=k*r+m*y+q*H;e[4]=k*n+m*x+q*w;e[7]=k*t+m*u+q*d;e[2]=l*r+p*y+c*H;\ne[5]=l*n+p*x+c*w;e[8]=l*t+p*u+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error(\"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],\nh=c[3],k=c[4],m=c[5],q=c[6],l=c[7],c=c[8],p=c*k-m*l,r=m*q-c*h,n=l*h-k*q,t=e*p+f*r+g*n;if(0===t){if(!0===b)throw Error(\"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\");console.warn(\"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\");return this.identity()}t=1/t;d[0]=p*t;d[1]=(g*l-c*f)*t;d[2]=(m*f-g*k)*t;d[3]=r*t;d[4]=(c*e-g*q)*t;d[5]=(g*h-m*e)*t;d[6]=n*t;d[7]=(f*q-l*e)*t;d[8]=(k*e-f*h)*t;return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=\na;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},\ntoArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=\nnew n,b=new n;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+\nthis.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||new n).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new n;return function(b,c){var d=c||new n,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/\nf,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new n).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new n,b=new Ba;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c),\nf=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(gd.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=\nthis.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],q=c[8],l=c[9],p=c[10],r=c[11],n=c[12],t=c[13],y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-q,c-n).normalize();b[1].setComponents(f+a,m+g,r+q,c+n).normalize();b[2].setComponents(f+d,m+h,r+l,c+t).normalize();b[3].setComponents(f-d,m-h,r-l,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-y).normalize();b[5].setComponents(f+e,\nm+k,r+p,c+y).normalize();return this},intersectsObject:function(){var a=new Ea;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ea;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=\n0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new n,b=new n;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>\nc;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});ab.RotationOrders=\"XYZ YZX ZXY XZY YXZ ZYX\".split(\" \");ab.DefaultOrder=\"XYZ\";Object.defineProperties(ab.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;\nthis.onChangeCallback()}}});Object.assign(ab.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=Y.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],q=e[2],l=e[6],\ne=e[10];b=b||this._order;\"XYZ\"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(l,k),this._z=0)):\"YXZ\"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):\"ZXY\"===b?(this._x=Math.asin(d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):\"ZYX\"===b?(this._y=Math.asin(-d(q,\n-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(l,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):\"YZX\"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):\"XZY\"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(l,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn(\"THREE.Euler: .setFromRotationMatrix() given unsupported order: \"+b);this._order=\nb;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new oa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=\na[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new n(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Qd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=\nthis.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});var Lf=0;z.DefaultUp=new n(0,1,0);z.DefaultMatrixAutoUpdate=!0;Object.assign(z.prototype,xa.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);\nreturn this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new oa;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new n(1,0,0);return function(b){return this.rotateOnAxis(a,\nb)}}(),rotateY:function(){var a=new n(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new n(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new n;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new n(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new n(0,1,0);return function(b){return this.translateOnAxis(a,\nb)}}(),translateZ:function(){var a=new n(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new K;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new K;return function(b){this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=\n0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error(\"THREE.Object3D.add: object can't be added as a child of itself.\",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:\"added\"}),this.children.push(a)):console.error(\"THREE.Object3D.add: object not an instance of THREE.Object3D.\",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);\n-1!==b&&(a.parent=null,a.dispatchEvent({type:\"removed\"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty(\"id\",a)},getObjectByName:function(a){return this.getObjectByProperty(\"name\",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new n;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},\ngetWorldQuaternion:function(){var a=new n,b=new n;return function(c){c=c||new oa;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new oa;return function(b){b=b||new ab;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new n,b=new oa;return function(c){c=c||new n;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new oa;\nreturn function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,\nthis.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],\nc;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||\"\"===a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{}},e.metadata={version:4.5,type:\"Object\",generator:\"Object3D.toJSON\"});var f={};f.uuid=this.uuid;f.type=this.type;\"\"!==this.name&&(f.name=this.name);\"{}\"!==JSON.stringify(this.userData)&&(f.userData=this.userData);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);f.matrix=this.matrix.toArray();\nvoid 0!==this.geometry&&(f.geometry=b(a.geometries,this.geometry));if(void 0!==this.material)if(Array.isArray(this.material)){for(var g=[],h=0,k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);d&&(d=c(a.geometries),g=c(a.materials),h=c(a.textures),k=c(a.images),0<d.length&&(e.geometries=d),0<g.length&&\n(e.materials=g),0<h.length&&(e.textures=h),0<k.length&&(e.images=k));e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.layers.mask=a.layers.mask;\nthis.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});Na.prototype=Object.assign(Object.create(z.prototype),{constructor:Na,isCamera:!0,copy:function(a,b){z.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);\nreturn this},getWorldDirection:function(){var a=new oa;return function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){z.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Fb.prototype=Object.assign(Object.create(Na.prototype),{constructor:Fb,isOrthographicCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.left=a.left;\nthis.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),\nc=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,\na);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});qa.prototype=Object.assign(Object.create(Na.prototype),{constructor:qa,isPerspectiveCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=\nnull===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*Y.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*Y.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*Y.RAD2DEG*Math.atan(Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},\ngetFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/\ng,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});\nObject.assign(Sa.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Rd=0;Object.assign(J.prototype,xa.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=\n(new Ba).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);\nthis.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);\na.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[q[a].clone(),q[b].clone(),q[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Sa(a,b,d,f,r,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([l[a].clone(),l[b].clone(),l[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([p[a].clone(),p[b].clone(),p[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,\ng=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var q=[],l=[],p=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new n(f[e],f[e+1],f[e+2])),void 0!==g&&q.push(new n(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new G(h[e],h[e+1],h[e+2])),void 0!==k&&l.push(new C(k[r],k[r+1])),void 0!==m&&p.push(new C(m[r],m[r+1]));var ca=a.groups;if(0<ca.length)for(e=0;e<\nca.length;e++)for(var f=ca[e],t=f.start,y=f.count,r=t,t=t+y;r<t;r+=3)void 0!==d?b(d[r],d[r+1],d[r+2],f.materialIndex):b(r,r+1,r+2,f.materialIndex);else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();\nthis.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new K;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new n,b=new n,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},\ncomputeVertexNormals:function(a){void 0===a&&(a=!0);var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new n;if(a){var e,f,g,h=new n,k=new n;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(),a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),\nd[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),\nd[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):\ne.__originalVertexNormals[a]=e.vertexNormals[a].clone();var f=new J;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=0;for(d=this.faces.length;c<d;c++)h=new n,k={a:new n,b:new n,c:new n},e.push(h),g.push(k)}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();\nf.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===\nthis.boundingBox&&(this.boundingBox=new Ra);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Ea);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],q=a.faceVertexUvs[0],l=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new Ba).getNormalMatrix(b));a=0;for(var r=g.length;a<\nr;a++){var n=g[a].clone();void 0!==b&&n.applyMatrix4(b);f.push(n)}a=0;for(r=p.length;a<r;a++)l.push(p[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],t=g.vertexNormals,p=g.vertexColors,l=new Sa(g.a+e,g.b+e,g.c+e);l.normal.copy(g.normal);void 0!==d&&l.normal.applyMatrix3(d).normalize();b=0;for(f=t.length;b<f;b++)n=t[b].clone(),void 0!==d&&n.applyMatrix3(d).normalize(),l.vertexNormals.push(n);l.color.copy(g.color);b=0;for(f=p.length;b<f;b++)n=p[b],l.vertexColors.push(n.clone());l.materialIndex=g.materialIndex+\nc;h.push(l)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}else console.error(\"THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.\",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error(\"THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.\",a)},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<\ng;f++)d=this.vertices[f],d=Math.round(d.x*e)+\"_\"+Math.round(d.y*e)+\"_\"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,1);f=this.vertices.length-b.length;this.vertices=\nb;return f},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+\na.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==l[b])return l[b];l[b]=q.length;q.push(a.getHex());return l[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:\"Geometry\",generator:\"Geometry.toJSON\"}};e.uuid=this.uuid;e.type=this.type;\"\"!==this.name&&(e.name=this.name);if(void 0!==\nthis.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],m={},q=[],l={},p=[],r={};for(g=0;g<this.faces.length;g++){var n=this.faces[g],t=void 0!==this.faceVertexUvs[0][g],y=0<n.normal.length(),x=0<n.vertexNormals.length,u=1!==n.color.r||1!==n.color.g||1!==n.color.b,H=0<n.vertexColors.length,w=0,w=a(w,0,0),w=a(w,1,!0),w=a(w,2,!1),w=a(w,3,t),w=a(w,4,y),w=a(w,5,x),w=a(w,6,\nu),w=a(w,7,H);h.push(w);h.push(n.a,n.b,n.c);h.push(n.materialIndex);t&&(t=this.faceVertexUvs[0][g],h.push(d(t[0]),d(t[1]),d(t[2])));y&&h.push(b(n.normal));x&&(y=n.vertexNormals,h.push(b(y[0]),b(y[1]),b(y[2])));u&&h.push(c(n.color));H&&(n=n.vertexColors,h.push(c(n[0]),c(n[1]),c(n[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<q.length&&(e.data.colors=q);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new J).copy(this)},copy:function(a){var b,c,d,e,f,g;this.vertices=\n[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;d=a.vertices;b=0;for(c=d.length;b<c;b++)this.vertices.push(d[b].clone());d=a.colors;b=0;for(c=d.length;b<c;b++)this.colors.push(d[b].clone());d=a.faces;b=0;for(c=d.length;b<c;b++)this.faces.push(d[b].clone());b=0;for(c=a.faceVertexUvs.length;b<c;b++){var h=a.faceVertexUvs[b];void 0===\nthis.faceVertexUvs[b]&&(this.faceVertexUvs[b]=[]);d=0;for(e=h.length;d<e;d++){var k=h[d],m=[];f=0;for(g=k.length;f<g;f++)m.push(k[f].clone());this.faceVertexUvs[b].push(m)}}f=a.morphTargets;b=0;for(c=f.length;b<c;b++){g={};g.name=f[b].name;if(void 0!==f[b].vertices)for(g.vertices=[],d=0,e=f[b].vertices.length;d<e;d++)g.vertices.push(f[b].vertices[d].clone());if(void 0!==f[b].normals)for(g.normals=[],d=0,e=f[b].normals.length;d<e;d++)g.normals.push(f[b].normals[d].clone());this.morphTargets.push(g)}f=\na.morphNormals;b=0;for(c=f.length;b<c;b++){g={};if(void 0!==f[b].vertexNormals)for(g.vertexNormals=[],d=0,e=f[b].vertexNormals.length;d<e;d++)h=f[b].vertexNormals[d],k={},k.a=h.a.clone(),k.b=h.b.clone(),k.c=h.c.clone(),g.vertexNormals.push(k);if(void 0!==f[b].faceNormals)for(g.faceNormals=[],d=0,e=f[b].faceNormals.length;d<e;d++)g.faceNormals.push(f[b].faceNormals[d].clone());this.morphNormals.push(g)}d=a.skinWeights;b=0;for(c=d.length;b<c;b++)this.skinWeights.push(d[b].clone());d=a.skinIndices;b=\n0;for(c=d.length;b<c;b++)this.skinIndices.push(d[b].clone());d=a.lineDistances;b=0;for(c=d.length;b<c;b++)this.lineDistances.push(d[b]);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;\nthis.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Object.defineProperty(Z.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});Object.assign(Z.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=\nnew a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyColorsArray(): color is undefined\",\nd),f=new G);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector2sArray(): vector is undefined\",d),f=new C);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=\na[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector3sArray(): vector is undefined\",d),f=new n);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector4sArray(): vector is undefined\",d),f=new fa);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*\nthis.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+\n1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)}});pc.prototype=Object.create(Z.prototype);pc.prototype.constructor=pc;qc.prototype=Object.create(Z.prototype);\nqc.prototype.constructor=qc;rc.prototype=Object.create(Z.prototype);rc.prototype.constructor=rc;sc.prototype=Object.create(Z.prototype);sc.prototype.constructor=sc;gb.prototype=Object.create(Z.prototype);gb.prototype.constructor=gb;tc.prototype=Object.create(Z.prototype);tc.prototype.constructor=tc;hb.prototype=Object.create(Z.prototype);hb.prototype.constructor=hb;B.prototype=Object.create(Z.prototype);B.prototype.constructor=B;uc.prototype=Object.create(Z.prototype);uc.prototype.constructor=uc;\nObject.assign(Je.prototype,{computeGroups:function(a){var b,c=[],d=void 0;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length,k;if(0<h){k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=\nk}var q=a.morphNormals,l=q.length,p;if(0<l){p=[];for(m=0;m<l;m++)p[m]=[];this.morphTargets.normal=p}for(var r=a.skinIndices,n=a.skinWeights,t=r.length===c.length,y=n.length===c.length,m=0;m<b.length;m++){var x=b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var u=x.vertexNormals;3===u.length?this.normals.push(u[0],u[1],u[2]):(u=x.normal,this.normals.push(u,u,u));u=x.vertexColors;3===u.length?this.colors.push(u[0],u[1],u[2]):(u=x.color,this.colors.push(u,u,u));!0===e&&(u=d[0][m],void 0!==u?this.uvs.push(u[0],\nu[1],u[2]):(console.warn(\"THREE.DirectGeometry.fromGeometry(): Undefined vertexUv \",m),this.uvs.push(new C,new C,new C)));!0===f&&(u=d[1][m],void 0!==u?this.uvs2.push(u[0],u[1],u[2]):(console.warn(\"THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 \",m),this.uvs2.push(new C,new C,new C)));for(u=0;u<h;u++){var H=g[u].vertices;k[u].push(H[x.a],H[x.b],H[x.c])}for(u=0;u<l;u++)H=q[u].vertexNormals[m],p[u].push(H.a,H.b,H.c);t&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);y&&this.skinWeights.push(n[x.a],\nn[x.b],n[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});E.MaxIndex=65535;Object.assign(E.prototype,xa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<Sd(a)?hb:gb)(a,1):this.index=a},addAttribute:function(a,b,c){if(b&&b.isBufferAttribute||\nb&&b.isInterleavedBufferAttribute)if(\"index\"===a)console.warn(\"THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.\"),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn(\"THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).\"),this.addAttribute(a,new Z(b,c))},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==\nc?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new Ba).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);\nthis.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);\na.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.addAttribute(\"position\",a.copyVector3sArray(b.vertices));this.addAttribute(\"color\",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,\n1),this.addAttribute(\"lineDistance\",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=\nb.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=\n!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},\nfromGeometry:function(a){a.__directGeometry=(new Je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute(\"position\",(new Z(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute(\"normal\",(new Z(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute(\"color\",(new Z(b,3)).copyColorsArray(a.colors)));\n0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute(\"uv\",(new Z(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute(\"uv2\",(new Z(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<Sd(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new Z(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],\nh=new B(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.addAttribute(\"skinIndex\",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.addAttribute(\"skinWeight\",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===\nthis.boundingBox&&(this.boundingBox=new Ra);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Ra,b=new n;return function(){null===this.boundingSphere&&\n(this.boundingSphere=new Ea);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},\ncomputeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute(\"normal\",new Z(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,k,m,q=new n,l=new n,p=new n,r=new n,ca=new n;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var t=0,y=c.length;t<y;++t)for(f=c[t],g=f.start,h=f.count,f=g,g+=h;f<g;f+=3)h=3*a[f+0],k=3*a[f+1],m=3*a[f+2],\nq.fromArray(d,h),l.fromArray(d,k),p.fromArray(d,m),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[h]+=r.x,e[h+1]+=r.y,e[h+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z,e[m]+=r.x,e[m+1]+=r.y,e[m+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)q.fromArray(d,f),l.fromArray(d,f+3),p.fromArray(d,f+6),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,\nb){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}console.error(\"THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.\",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b,c,d,e,f=0,g=a.count;f<g;f++)b=a.getX(f),c=a.getY(f),d=a.getZ(f),e=1/Math.sqrt(b*b+c*c+d*d),a.setXYZ(f,b*e,c*e,d*e)},toNonIndexed:function(){if(null===\nthis.index)return console.warn(\"THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.\"),this;var a=new E,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,m=0,q=b.length;m<q;m++){h=b[m]*e;for(var l=0;l<e;l++)g[k++]=f[h++]}a.addAttribute(d,new Z(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:\"BufferGeometry\",generator:\"BufferGeometry.toJSON\"}};a.uuid=this.uuid;a.type=this.type;\"\"!==this.name&&\n(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));\nc=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new E).copy(this)},copy:function(a){var b,c,d;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(b in c)this.addAttribute(b,c[b].clone());var e=a.morphAttributes;for(b in e){var f=[],g=e[b];c=0;for(d=g.length;c<d;c++)f.push(g[c].clone());\nthis.morphAttributes[b]=f}b=a.groups;c=0;for(d=b.length;c<d;c++)e=b[c],this.addGroup(e.start,e.count,e.materialIndex);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Gb.prototype=Object.create(J.prototype);Gb.prototype.constructor=Gb;ib.prototype=Object.create(E.prototype);ib.prototype.constructor=\nib;vc.prototype=Object.create(J.prototype);vc.prototype.constructor=vc;jb.prototype=Object.create(E.prototype);jb.prototype.constructor=jb;ya.prototype=Object.create(U.prototype);ya.prototype.constructor=ya;ya.prototype.isMeshBasicMaterial=!0;ya.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=\na.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};Object.assign(kb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},\ncopy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new n).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new n;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new n;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},\ndistanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new n;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);\nvar h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),q=-c.dot(b),l=c.lengthSq(),p=Math.abs(1-k*k),r;0<p?(d=k*q-m,e=k*m-q,r=h*p,0<=d?e>=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*q)+l):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-q),h),k=-d*d+e*(e+2*q)+l):e<=r?(d=0,e=Math.min(Math.max(-h,-q),h),k=e*(e+2*q)+l):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,\n-q),h),k=-d*d+e*(e+2*q)+l)):(e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new n;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=\na.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;\nvar h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new n;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=\nnew n,b=new n,c=new n,d=new n;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},\nequals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Hb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new n).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new n).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},\ndistance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new n;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new n,b=new n;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=Y.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new n;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);\nthis.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Ta,{normal:function(){var a=new n;return function(b,c,d,e){e=e||new n;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=\nb.dot(b);g=b.dot(c);var m=d*k-e*e;h=h||new n;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new n;return function(b,c,d,e){b=Ta.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Ta.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},\ncopy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new n,b=new n;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new n).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ta.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Ta.barycoordFromPoint(a,\nthis.a,this.b,this.c,b)},containsPoint:function(a){return Ta.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new Aa,b=[new Hb,new Hb,new Hb],c=new n,d=new n;return function(e,f){var g=f||new n,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;k<b.length;k++){b[k].closestPointToPoint(c,!0,d);var m=c.distanceToSquared(d);\nm<h&&(h=m,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});la.prototype=Object.assign(Object.create(z.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){z.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry,b,c;if(a.isBufferGeometry){if(a=a.morphAttributes,b=Object.keys(a),0<b.length){var d=a[b[0]];if(void 0!==d)for(this.morphTargetInfluences=\n[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a}}else if(d=a.morphTargets,void 0!==d&&0<d.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a},raycast:function(){function a(a,b,c,d,e,f,g){Ta.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);\ne.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;x.copy(g);x.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(x);return c<b.near||c>b.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,q,l,n){g.fromBufferAttribute(f,q);h.fromBufferAttribute(f,l);k.fromBufferAttribute(f,n);if(c=b(c,d,e,g,h,k,y))m&&(p.fromBufferAttribute(m,q),r.fromBufferAttribute(m,\nl),ca.fromBufferAttribute(m,n),c.uv=a(y,g,h,k,p,r,ca)),c.face=new Sa(q,l,n,Ta.normal(g,h,k)),c.faceIndex=q;return c}var d=new K,e=new kb,f=new Ea,g=new n,h=new n,k=new n,m=new n,q=new n,l=new n,p=new C,r=new C,ca=new C,t=new n,y=new n,x=new n;return function(n,t){var w=this.geometry,x=this.material,B=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(B),!1!==n.ray.intersectsSphere(f)&&(d.getInverse(B),e.copy(n.ray).applyMatrix4(d),\nnull===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var D;if(w.isBufferGeometry){var O,C,x=w.index,F=w.attributes.position,B=w.attributes.uv,z,T;if(null!==x)for(z=0,T=x.count;z<T;z+=3){if(w=x.getX(z),O=x.getX(z+1),C=x.getX(z+2),D=c(this,n,e,F,B,w,O,C))D.faceIndex=Math.floor(z/3),t.push(D)}else for(z=0,T=F.count;z<T;z+=3)if(w=z,O=z+1,C=z+2,D=c(this,n,e,F,B,w,O,C))D.index=w,t.push(D)}else if(w.isGeometry){var E,B=Array.isArray(x);z=w.vertices;T=w.faces;O=w.faceVertexUvs[0];0<O.length&&(F=O);\nfor(var G=0,K=T.length;G<K;G++){var P=T[G];D=B?x[P.materialIndex]:x;if(void 0!==D){O=z[P.a];C=z[P.b];E=z[P.c];if(!0===D.morphTargets){D=w.morphTargets;var M=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var V=0,pa=D.length;V<pa;V++){var S=M[V];if(0!==S){var N=D[V].vertices;g.addScaledVector(m.subVectors(N[P.a],O),S);h.addScaledVector(q.subVectors(N[P.b],C),S);k.addScaledVector(l.subVectors(N[P.c],E),S)}}g.add(O);h.add(C);k.add(E);O=g;C=h;E=k}if(D=b(this,n,e,O,C,E,y))F&&F[G]&&\n(M=F[G],p.copy(M[0]),r.copy(M[1]),ca.copy(M[2]),D.uv=a(y,O,C,E,p,r,ca)),D.face=P,D.faceIndex=G,t.push(D)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var bg=0;kd.prototype=Object.assign(Object.create(qa.prototype),{constructor:kd,isArrayCamera:!0});Ib.prototype.isFogExp2=!0;Ib.prototype.clone=function(){return new Ib(this.color.getHex(),this.density)};Ib.prototype.toJSON=function(a){return{type:\"FogExp2\",color:this.color.getHex(),density:this.density}};\nJb.prototype.isFog=!0;Jb.prototype.clone=function(){return new Jb(this.color.getHex(),this.near,this.far)};Jb.prototype.toJSON=function(a){return{type:\"Fog\",color:this.color.getHex(),near:this.near,far:this.far}};ld.prototype=Object.assign(Object.create(z.prototype),{constructor:ld,copy:function(a,b){z.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());\nthis.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=z.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Yd.prototype=Object.assign(Object.create(z.prototype),{constructor:Yd,isLensFlare:!0,copy:function(a){z.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=\n0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new G(16777215));void 0===d&&(d=1);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],\nc.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)}});bb.prototype=Object.create(U.prototype);bb.prototype.constructor=bb;bb.prototype.isSpriteMaterial=!0;bb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};xc.prototype=Object.assign(Object.create(z.prototype),{constructor:xc,isSprite:!0,raycast:function(){var a=\nnew n,b=new n,c=new n;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f||(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});yc.prototype=Object.assign(Object.create(z.prototype),{constructor:yc,copy:function(a){z.prototype.copy.call(this,a,\n!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new n;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=\nb.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new n,b=new n;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.levels=\n[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(zc.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new K;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b,c;b=0;for(c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<\nc;b++)if(a=this.bones[b])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new K,b=new K;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new zc(this.bones,\nthis.boneInverses)}});md.prototype=Object.assign(Object.create(z.prototype),{constructor:md,isBone:!0});nd.prototype=Object.assign(Object.create(la.prototype),{constructor:nd,isSkinnedMesh:!0,initBones:function(){var a=[],b,c,d,e;if(this.geometry&&void 0!==this.geometry.bones){d=0;for(e=this.geometry.bones.length;d<e;d++)c=this.geometry.bones[d],b=new md,a.push(b),b.name=c.name,b.position.fromArray(c.pos),b.quaternion.fromArray(c.rotq),void 0!==c.scl&&b.scale.fromArray(c.scl);d=0;for(e=this.geometry.bones.length;d<\ne;d++)c=this.geometry.bones[d],-1!==c.parent&&null!==c.parent&&void 0!==a[c.parent]?a[c.parent].add(a[d]):this.add(a[d])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a,b;if(this.geometry&&this.geometry.isGeometry)for(b=0;b<this.geometry.skinWeights.length;b++){var c=\nthis.geometry.skinWeights[b];a=1/c.lengthManhattan();Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var c=new fa,d=this.geometry.attributes.skinWeight;for(b=0;b<d.count;b++)c.x=d.getX(b),c.y=d.getY(b),c.z=d.getZ(b),c.w=d.getW(b),a=1/c.lengthManhattan(),Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0),d.setXYZW(b,c.x,c.y,c.z,c.w)}},updateMatrixWorld:function(a){la.prototype.updateMatrixWorld.call(this,a);\"attached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):\n\"detached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn(\"THREE.SkinnedMesh: Unrecognized bindMode: \"+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ea.prototype=Object.create(U.prototype);ea.prototype.constructor=ea;ea.prototype.isLineBasicMaterial=!0;ea.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;\nreturn this};sa.prototype=Object.assign(Object.create(z.prototype),{constructor:sa,isLine:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new n,m=new n,h=new n,q=new n,l=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var p=g.index,\nr=g.attributes.position.array;if(null!==p)for(var p=p.array,g=0,ca=p.length-1;g<ca;g+=l){var t=p[g+1];k.fromArray(r,3*p[g]);m.fromArray(r,3*t);t=b.distanceSqToSegment(k,m,q,h);t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,ca=r.length/3-1;g<ca;g+=l)k.fromArray(r,3*g),m.fromArray(r,3*g+3),t=b.distanceSqToSegment(k,m,q,h),t>f||(q.applyMatrix4(this.matrixWorld),\nt=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=l)t=b.distanceSqToSegment(k[g],k[g+1],q,h),t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,\nthis.material)).copy(this)}});Q.prototype=Object.assign(Object.create(sa.prototype),{constructor:Q,isLineSegments:!0});od.prototype=Object.assign(Object.create(sa.prototype),{constructor:od,isLineLoop:!0});Fa.prototype=Object.create(U.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isPointsMaterial=!0;Fa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype),\n{constructor:Kb,isPoints:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<q){var h=b.closestPointToPoint(a);h.applyMatrix4(k);var m=d.ray.origin.distanceTo(h);m<d.near||m>d.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);\nc.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),q=m*m,m=new n;if(h.isBufferGeometry){var l=h.index,h=h.attributes.position.array;if(null!==l)for(var p=l.array,l=0,r=p.length;l<r;l++){var ca=p[l];m.fromArray(h,3*ca);f(m,ca)}else for(l=0,p=h.length/3;l<p;l++)m.fromArray(h,3*l),f(m,l)}else for(m=h.vertices,l=0,p=m.length;l<p;l++)f(m[l],l)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});\nAc.prototype=Object.assign(Object.create(z.prototype),{constructor:Ac});pd.prototype=Object.create(ba.prototype);pd.prototype.constructor=pd;Lb.prototype=Object.create(ba.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isCompressedTexture=!0;qd.prototype=Object.create(ba.prototype);qd.prototype.constructor=qd;Bc.prototype=Object.create(ba.prototype);Bc.prototype.constructor=Bc;Bc.prototype.isDepthTexture=!0;Mb.prototype=Object.create(E.prototype);Mb.prototype.constructor=Mb;Cc.prototype=Object.create(J.prototype);\nCc.prototype.constructor=Cc;Nb.prototype=Object.create(E.prototype);Nb.prototype.constructor=Nb;Dc.prototype=Object.create(J.prototype);Dc.prototype.constructor=Dc;za.prototype=Object.create(E.prototype);za.prototype.constructor=za;Ec.prototype=Object.create(J.prototype);Ec.prototype.constructor=Ec;Ob.prototype=Object.create(za.prototype);Ob.prototype.constructor=Ob;Fc.prototype=Object.create(J.prototype);Fc.prototype.constructor=Fc;lb.prototype=Object.create(za.prototype);lb.prototype.constructor=\nlb;Gc.prototype=Object.create(J.prototype);Gc.prototype.constructor=Gc;Pb.prototype=Object.create(za.prototype);Pb.prototype.constructor=Pb;Hc.prototype=Object.create(J.prototype);Hc.prototype.constructor=Hc;Qb.prototype=Object.create(za.prototype);Qb.prototype.constructor=Qb;Ic.prototype=Object.create(J.prototype);Ic.prototype.constructor=Ic;Rb.prototype=Object.create(E.prototype);Rb.prototype.constructor=Rb;Jc.prototype=Object.create(J.prototype);Jc.prototype.constructor=Jc;Sb.prototype=Object.create(E.prototype);\nSb.prototype.constructor=Sb;Kc.prototype=Object.create(J.prototype);Kc.prototype.constructor=Kc;Tb.prototype=Object.create(E.prototype);Tb.prototype.constructor=Tb;var Ia={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,k;if(0<Ia.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var m=2*c;for(h=c-1;2<c;){if(0>=m--){console.warn(\"THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()\");\nbreak}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var q;a:{var l,p,r,n,t,y,x,u;l=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;n=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-l)*(y-p)-(n-p)*(t-l))q=!1;else{var H,w,I,z,D,O,B,C,E,G;H=t-r;w=y-n;I=l-t;z=p-y;D=r-l;O=n-p;for(q=0;q<c;q++)if(x=a[e[q]].x,u=a[e[q]].y,!(x===l&&u===p||x===r&&u===n||x===t&&u===y)&&(B=x-l,C=u-p,E=x-r,G=u-n,x-=t,u-=y,E=H*G-w*E,B=D*C-O*B,C=I*u-z*x,E>=-Number.EPSILON&&C>=-Number.EPSILON&&B>=-Number.EPSILON)){q=!1;break a}q=!0}}if(q){d.push([a[e[g]],\na[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;k<c;g++,k++)e[g]=e[k];c--;m=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,m=e.y-c.y,q=a.x-c.x,l=a.y-c.y,p=h*k-g*m,n=h*q-g*l;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>n||n>p)return[];k=m*q-k*\nl;if(0>k||k>p)return[]}else{if(0<n||n<p)return[];k=m*q-k*l;if(0<k||k<p)return[]}if(0===k)return!f||0!==n&&n!==p?[a]:[];if(k===p)return!f||0!==n&&n!==p?[b]:[];if(0===n)return[c];if(n===p)return[e];f=k/p;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==n||m*q!==k*l)return[];h=0===g&&0===h;k=0===k&&0===m;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,p=c.x,m=e,c=e.x):(b=e,p=e.x,m=c,c=c.x)):\n(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,p=c.y,m=e,c=e.y):(b=e,p=e.y,m=c,c=c.y));return k<=p?a<p?[]:a===p?f?[]:[b]:a<=c?[b,h]:[b,m]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,k,m,q,l={};k=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(k,b[g]);g=0;for(h=\nk.length;g<h;g++)q=k[g].x+\":\"+k[g].y,void 0!==l[q]&&console.warn(\"THREE.ShapeUtils: Duplicate point\",q,g),l[q]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,k;for(d=0;d<m.length;d++)for(f=\nb[m[d]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=e(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,m=[],q,l,p,n,v,B=[],C,z,E,G=0;for(q=b.length;G<q;G++)m.push(G);C=0;for(var K=2*m.length;0<m.length;){K--;if(0>K){console.log(\"Infinite Loop! Holes left:\"+m.length+\", Probably Hole outside Shape!\");break}for(l=C;l<h.length;l++){p=h[l];q=-1;for(G=0;G<m.length;G++)if(n=m[G],v=p.x+\":\"+p.y+\":\"+n,void 0===B[v]){k=b[n];for(z=0;z<k.length;z++)if(n=k[z],c(l,z)&&!d(p,n)&&!g(p,n)){q=z;m.splice(G,\n1);C=h.slice(0,l+1);n=h.slice(l);z=k.slice(q);E=k.slice(0,q+1);h=C.concat(z).concat(E).concat(n);C=l;break}if(0<=q)break;B[v]=!0}if(0<=q)break}}return h}(a,b);var p=Ia.triangulate(g,!1);g=0;for(h=p.length;g<h;g++)for(m=p[g],k=0;3>k;k++)q=m[k].x+\":\"+m[k].y,q=l[q],void 0!==q&&(m[k]=q);return p.concat()},isClockWise:function(a){return 0>Ia.area(a)}};cb.prototype=Object.create(J.prototype);cb.prototype.constructor=cb;Ga.prototype=Object.create(E.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=\nfunction(){var a=this.getAttribute(\"position\"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute(\"uv\"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index);this.addAttribute(\"position\",new B(b.arrays.position,3));this.addAttribute(\"uv\",new B(b.arrays.uv,2))};\nGa.prototype.addShape=function(a,b){function c(a,b,c){b||console.error(\"THREE.ExtrudeGeometry: vec does not exist\");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new C(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&\n(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new C(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=H+2*y;for(e=0;e<f;e++){var g=ba*e,m=ba*(e+1),l=b+d+g,p=b+d+m,m=b+c+m;h(b+c+g);h(l);h(m);h(l);h(p);h(m);g=q.length/3;g=D.generateSideWallUV(Z,q,g-6,g-3,g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);k(g[2]);k(g[3])}}}function f(a,b,c){r.push(a);r.push(b);r.push(c)}\nfunction g(a,b,c){h(a);h(b);h(c);a=q.length/3;a=D.generateTopUV(Z,q,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){l.push(q.length/3);q.push(r[3*a+0]);q.push(r[3*a+1]);q.push(r[3*a+2])}function k(a){p.push(a.x);p.push(a.y)}var m=b.arrays?b.arrays:this.getArrays(),q=m.position,l=m.index,p=m.uv,r=[],m=void 0!==b.amount?b.amount:100,z=void 0!==b.bevelThickness?b.bevelThickness:6,t=void 0!==b.bevelSize?b.bevelSize:z-2,y=void 0!==b.bevelSegments?b.bevelSegments:3,x=void 0!==b.bevelEnabled?b.bevelEnabled:\n!0,u=void 0!==b.curveSegments?b.curveSegments:12,H=void 0!==b.steps?b.steps:1,w=b.extrudePath,I,G=!1,D=void 0!==b.UVGenerator?b.UVGenerator:cb.WorldUVGenerator,O,E,F,K;w&&(I=w.getSpacedPoints(H),G=!0,x=!1,O=void 0!==b.frames?b.frames:w.computeFrenetFrames(H,!1),E=new n,F=new n,K=new n);x||(t=z=y=0);var T,J,U,Z=this,w=a.extractPoints(u),u=w.shape,P=w.holes;if(!Ia.isClockWise(u))for(u=u.reverse(),J=0,U=P.length;J<U;J++)T=P[J],Ia.isClockWise(T)&&(P[J]=T.reverse());var M=Ia.triangulateShape(u,P),V=u;\nJ=0;for(U=P.length;J<U;J++)T=P[J],u=u.concat(T);var R,S,N,Y,Q,ba=u.length,X,fa=M.length,w=[],L=0;N=V.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),w[L]=d(V[L],V[R],V[S]);var ha=[],ea,ia=w.concat();J=0;for(U=P.length;J<U;J++){T=P[J];ea=[];L=0;N=T.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),ea[L]=d(T[L],T[R],T[S]);ha.push(ea);ia=ia.concat(ea)}for(R=0;R<y;R++){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),\nf(Q.x,Q.y,-Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),f(Q.x,Q.y,-Y)}S=t;for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[0]).multiplyScalar(Q.x),E.copy(O.binormals[0]).multiplyScalar(Q.y),K.copy(I[0]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,0);for(N=1;N<=H;N++)for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[N]).multiplyScalar(Q.x),E.copy(O.binormals[N]).multiplyScalar(Q.y),K.copy(I[N]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,\nm/H*N);for(R=y-1;0<=R;R--){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),f(Q.x,Q.y,m+Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),G?f(Q.x,Q.y+I[H-1].y,I[H-1].x+Y):f(Q.x,Q.y,m+Y)}(function(){var a=q.length/3;if(x){var c=0*ba;for(L=0;L<fa;L++)X=M[L],g(X[2]+c,X[1]+c,X[0]+c);c=ba*(H+2*y);for(L=0;L<fa;L++)X=M[L],g(X[0]+c,X[1]+c,X[2]+c)}else{for(L=0;L<fa;L++)X=M[L],g(X[2],X[1],X[0]);for(L=0;L<fa;L++)X=\nM[L],g(X[0]+ba*H,X[1]+ba*H,X[2]+ba*H)}Z.addGroup(a,q.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=q.length/3,c=0;e(V,c);c+=V.length;J=0;for(U=P.length;J<U;J++)T=P[J],e(T,c),c+=T.length;Z.addGroup(a,q.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(l),this.addAttribute(\"position\",new B(q,3)),this.addAttribute(\"uv\",new B(b.arrays.uv,2)))};cb.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*\nc],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var m=b[3*e],l=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(m,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(l,1-e),new C(p,1-b)]}};Lc.prototype=Object.create(J.prototype);Lc.prototype.constructor=Lc;Ub.prototype=Object.create(Ga.prototype);Ub.prototype.constructor=Ub;Mc.prototype=\nObject.create(J.prototype);Mc.prototype.constructor=Mc;mb.prototype=Object.create(E.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(J.prototype);Nc.prototype.constructor=Nc;Vb.prototype=Object.create(E.prototype);Vb.prototype.constructor=Vb;Oc.prototype=Object.create(J.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(E.prototype);Wb.prototype.constructor=Wb;Xb.prototype=Object.create(J.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(E.prototype);\nYb.prototype.constructor=Yb;Zb.prototype=Object.create(E.prototype);Zb.prototype.constructor=Zb;nb.prototype=Object.create(J.prototype);nb.prototype.constructor=nb;Ua.prototype=Object.create(E.prototype);Ua.prototype.constructor=Ua;Pc.prototype=Object.create(nb.prototype);Pc.prototype.constructor=Pc;Qc.prototype=Object.create(Ua.prototype);Qc.prototype.constructor=Qc;Rc.prototype=Object.create(J.prototype);Rc.prototype.constructor=Rc;$b.prototype=Object.create(E.prototype);$b.prototype.constructor=\n$b;var Ma=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Cc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Dc,PolyhedronBufferGeometry:za,TubeGeometry:Ic,TubeBufferGeometry:Rb,TorusKnotGeometry:Jc,TorusKnotBufferGeometry:Sb,TorusGeometry:Kc,TorusBufferGeometry:Tb,TextGeometry:Lc,TextBufferGeometry:Ub,\nSphereGeometry:Mc,SphereBufferGeometry:mb,RingGeometry:Nc,RingBufferGeometry:Vb,PlaneGeometry:vc,PlaneBufferGeometry:jb,LatheGeometry:Oc,LatheBufferGeometry:Wb,ShapeGeometry:Xb,ShapeBufferGeometry:Yb,ExtrudeGeometry:cb,ExtrudeBufferGeometry:Ga,EdgesGeometry:Zb,ConeGeometry:Pc,ConeBufferGeometry:Qc,CylinderGeometry:nb,CylinderBufferGeometry:Ua,CircleGeometry:Rc,CircleBufferGeometry:$b,BoxGeometry:Gb,BoxBufferGeometry:ib});ac.prototype=Object.create(ra.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=\n!0;bc.prototype=Object.create(ra.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(U.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.defines={STANDARD:\"\"};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=\na.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;\nthis.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ob.prototype=Object.create(Pa.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshPhysicalMaterial=!0;ob.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:\"\"};this.reflectivity=\na.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(U.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);\nthis.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;\nthis.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};pb.prototype=Object.create(Ja.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshToonMaterial=!0;pb.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};qb.prototype=Object.create(U.prototype);qb.prototype.constructor=\nqb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};\nrb.prototype=Object.create(U.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=\na.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(U.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=function(a){U.prototype.copy.call(this,\na);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var mg=Object.freeze({ShadowMaterial:ac,SpriteMaterial:bb,RawShaderMaterial:bc,ShaderMaterial:ra,PointsMaterial:Fa,MeshPhysicalMaterial:ob,MeshStandardMaterial:Pa,MeshPhongMaterial:Ja,MeshToonMaterial:pb,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:Za,MeshBasicMaterial:ya,LineDashedMaterial:sb,LineBasicMaterial:ea,Material:U}),ed={enabled:!1,files:{},\nadd:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},va=new Zd;Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a=\"\");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=\ng[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||\"\").toLowerCase();switch(l){case \"arraybuffer\":case \"blob\":m=new ArrayBuffer(g.length);for(var n=new Uint8Array(m),k=0;k<g.length;k++)n[k]=g.charCodeAt(k);\"blob\"===l&&(m=new Blob([m],{type:h}));break;case \"document\":m=(new DOMParser).parseFromString(g,h);break;case \"json\":m=JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(r){window.setTimeout(function(){d&&d(r);\ne.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{var p=new XMLHttpRequest;p.open(\"GET\",a,!0);p.addEventListener(\"load\",function(c){var f=c.target.response;ed.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn(\"THREE.FileLoader: HTTP Status 0 received.\"),b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemEnd(a),e.manager.itemError(a))},!1);void 0!==c&&p.addEventListener(\"progress\",function(a){c(a)},!1);p.addEventListener(\"error\",function(b){d&&d(b);e.manager.itemEnd(a);\ne.manager.itemError(a)},!1);void 0!==this.responseType&&(p.responseType=this.responseType);void 0!==this.withCredentials&&(p.withCredentials=this.withCredentials);p.overrideMimeType&&p.overrideMimeType(void 0!==this.mimeType?this.mimeType:\"text/plain\");for(h in this.requestHeader)p.setRequestHeader(h,this.requestHeader[h]);p.send(null)}e.manager.itemStart(a);return p},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=\na;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(Oe.prototype,{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Lb;h.image=g;var k=new Ka(this.manager);k.setPath(this.path);k.setResponseType(\"arraybuffer\");\nif(Array.isArray(a))for(var m=0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=\na;return this}});Object.assign($d.prototype,{load:function(a,b,c,d){var e=this,f=new db,g=new Ka(this.manager);g.setResponseType(\"arraybuffer\");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?\na.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Sc.prototype,{load:function(a,b,c,d){void 0===a&&(a=\"\");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"img\");\nc.addEventListener(\"load\",function(){ed.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);c.addEventListener(\"error\",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);\"data:\"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ae.prototype,{load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=\na;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Xa,g=new Sc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(rd.prototype,{load:function(a,b,c,d){var e=new Sc(this.manager);e.setCrossOrigin(this.crossOrigin);e.setPath(this.path);var f=new ba;f.image=e.load(a,function(){var c=0<a.search(/\\.(jpg|jpeg)$/)||\n0===a.search(/^data\\:image\\/jpeg/);f.format=c?1022:1023;f.needsUpdate=!0;void 0!==b&&b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});na.prototype=Object.assign(Object.create(z.prototype),{constructor:na,isLight:!0,copy:function(a){z.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=\nthis.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});sd.prototype=Object.assign(Object.create(na.prototype),{constructor:sd,isHemisphereLight:!0,copy:function(a){na.prototype.copy.call(this,\na);this.groundColor.copy(a.groundColor);return this}});Object.assign(tb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;\nreturn a}});td.prototype=Object.assign(Object.create(tb.prototype),{constructor:td,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*Y.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});ud.prototype=Object.assign(Object.create(na.prototype),{constructor:ud,isSpotLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=\na.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});vd.prototype=Object.assign(Object.create(na.prototype),{constructor:vd,isPointLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});wd.prototype=Object.assign(Object.create(tb.prototype),{constructor:wd});xd.prototype=Object.assign(Object.create(na.prototype),{constructor:xd,isDirectionalLight:!0,copy:function(a){na.prototype.copy.call(this,\na);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});yd.prototype=Object.assign(Object.create(na.prototype),{constructor:yd,isAmbientLight:!0});zd.prototype=Object.assign(Object.create(na.prototype),{constructor:zd,isRectAreaLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=na.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var ia={arraySlice:function(a,\nb,c){return ia.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:\"number\"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=\nnew a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];\nwhile(void 0!==f)}}}};Object.assign(wa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=\n0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=\nc[a+e];return b},interpolate_:function(a,b,c,d){throw Error(\"call to abstract method\");},intervalChanged_:function(a,b,c){}});Object.assign(wa.prototype,{beforeStart_:wa.prototype.copySampleValue_,afterEnd_:wa.prototype.copySampleValue_});Ad.prototype=Object.assign(Object.create(wa.prototype),{constructor:Ad,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=\na;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,\np=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c];return e}});Tc.prototype=Object.assign(Object.create(wa.prototype),{constructor:Tc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Bd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Bd,\ninterpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Wa;Wa={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Bd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Tc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Ad(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;\nswitch(a){case 2300:b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b=\"unsupported interpolation for \"+this.ValueTypeName+\" keyframe track named \"+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn(\"THREE.KeyframeTrackPrototype:\",b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;\ncase this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,\n1),e=f-1),d=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error(\"THREE.KeyframeTrackPrototype: Invalid value size in track.\",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error(\"THREE.KeyframeTrackPrototype: Track is empty.\",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if(\"number\"===typeof g&&isNaN(g)){console.error(\"THREE.KeyframeTrackPrototype: Time is not a valid number.\",\nthis,f,g);a=!1;break}if(null!==e&&e>g){console.error(\"THREE.KeyframeTrackPrototype: Out of order keys.\",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ia.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error(\"THREE.KeyframeTrackPrototype: Value is not a valid number.\",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==\nk[0]))if(d)h=!0;else for(var m=g*c,l=m-c,n=m+c,k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ia.arraySlice(a,0,e),this.values=ia.arraySlice(b,0,e*c));return this}};cc.prototype=Object.assign(Object.create(Wa),{constructor:cc,ValueTypeName:\"vector\"});Cd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Cd,\ninterpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)oa.slerpFlat(e,0,f,a-g,f,a,b);return e}});Uc.prototype=Object.assign(Object.create(Wa),{constructor:Uc,ValueTypeName:\"quaternion\",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Cd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});dc.prototype=Object.assign(Object.create(Wa),{constructor:dc,ValueTypeName:\"number\"});\nDd.prototype=Object.assign(Object.create(Wa),{constructor:Dd,ValueTypeName:\"string\",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Ed.prototype=Object.assign(Object.create(Wa),{constructor:Ed,ValueTypeName:\"bool\",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Fd.prototype=Object.assign(Object.create(Wa),{constructor:Fd,ValueTypeName:\"color\"});\nvb.prototype=Wa;Wa.constructor=vb;Object.assign(vb,{parse:function(a){if(void 0===a.type)throw Error(\"track type undefined, can not parse\");var b=vb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];ia.flattenJSON(a.keys,c,d,\"value\");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:ia.convertArray(a.times,Array),values:ia.convertArray(a.values,\nArray)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case \"scalar\":case \"double\":case \"float\":case \"number\":case \"integer\":return dc;case \"vector\":case \"vector2\":case \"vector3\":case \"vector4\":return cc;case \"color\":return Fd;case \"quaternion\":return Uc;case \"bool\":case \"boolean\":return Ed;case \"string\":return Dd}throw Error(\"Unsupported typeName: \"+a);}});Object.assign(Da,{parse:function(a){for(var b=\n[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(vb.parse(c[e]).scale(d));return new Da(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(vb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ia.getKeyframeOrder(h),h=ia.sortedArray(h,1,m),k=ia.sortedArray(k,1,m);d||0!==h[0]||\n(h.push(e),k.push(k[0]));f.push((new dc(\".morphTargetInfluences[\"+b[g].name+\"]\",h,k)).scale(1/c))}return new Da(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\\w-]*?)([\\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];\nfor(m in d)a.push(Da.CreateFromMorphTargetSequence(m,d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error(\"THREE.AnimationClip: No animation in JSONLoader data.\"),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ia.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||\"default\",f=a.length||-1,g=a.fps||30,h=a.hierarchy||[],k=0;k<h.length;k++){var m=h[k].keys;if(m&&0!==m.length)if(m[0].morphTargets){for(var f={},l=0;l<m.length;l++)if(m[l].morphTargets)for(var n=\n0;n<m[l].morphTargets.length;n++)f[m[l].morphTargets[n]]=-1;for(var p in f){for(var r=[],z=[],n=0;n!==m[l].morphTargets.length;++n){var t=m[l];r.push(t.time);z.push(t.morphTarget===p?1:0)}d.push(new dc(\".morphTargetInfluence[\"+p+\"]\",r,z))}f=f.length*(g||1)}else l=\".bones[\"+b[k].name+\"]\",c(cc,l+\".position\",m,\"pos\",d),c(Uc,l+\".quaternion\",m,\"rot\",d),c(cc,l+\".scale\",m,\"scl\",d)}return 0===d.length?null:new Da(e,f,d)}});Object.assign(Da.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==\nc;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Gd.prototype,{load:function(a,b,c,d){var e=this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===\nc[a]&&console.warn(\"THREE.MaterialLoader: Undefined texture\",a);return c[a]}var c=this.textures,d=new mg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=\na.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);\nvoid 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);\nvoid 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&\n(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);\nvoid 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));return d}});Object.assign(be.prototype,{load:function(a,b,c,d){var e=\nthis;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new E,c=a.data.index;void 0!==c&&(c=new ef[c.type](c.array),b.setIndex(new Z(c,1)));var d=a.data.attributes,e;for(e in d){var f=d[e],c=new ef[f.type](f.array);b.addAttribute(e,new Z(c,f.itemSize,f.normalized))}e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,d=e.length;c!==d;++c)f=e[c],b.addGroup(f.start,f.count,f.materialIndex);a=a.data.boundingSphere;void 0!==a&&(e=new n,void 0!==\na.center&&e.fromArray(a.center),b.boundingSphere=new Ea(e,a.radius));return b}});var ef={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:\"undefined\"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};ec.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=\nb[c+1];if(b[c].test(a))return e}return null}};Object.assign(ec.prototype,{crossOrigin:void 0,extractUrlBase:function(a){a=a.split(\"/\");if(1===a.length)return\"./\";a.pop();return a.join(\"/\")+\"/\"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},b=new G,c=new rd,d=new Gd;return function(e,f,g){function h(a,\nb,d,e,h){a=f+a;var m=ec.Handlers.get(a);null!==m?a=m.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&(\"repeat\"===e[0]&&(a.wrapS=1E3),\"mirror\"===e[0]&&(a.wrapS=1002),\"repeat\"===e[1]&&(a.wrapT=1E3),\"mirror\"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=Y.generateUUID();k[b]=a;return b}var k={},m={uuid:Y.generateUUID(),type:\"MeshLambertMaterial\"},l;for(l in e){var n=e[l];\nswitch(l){case \"DbgColor\":case \"DbgIndex\":case \"opticalDensity\":case \"illumination\":break;case \"DbgName\":m.name=n;break;case \"blending\":m.blending=a[n];break;case \"colorAmbient\":case \"mapAmbient\":console.warn(\"THREE.Loader.createMaterial:\",l,\"is no longer supported.\");break;case \"colorDiffuse\":m.color=b.fromArray(n).getHex();break;case \"colorSpecular\":m.specular=b.fromArray(n).getHex();break;case \"colorEmissive\":m.emissive=b.fromArray(n).getHex();break;case \"specularCoef\":m.shininess=n;break;case \"shading\":\"basic\"===\nn.toLowerCase()&&(m.type=\"MeshBasicMaterial\");\"phong\"===n.toLowerCase()&&(m.type=\"MeshPhongMaterial\");\"standard\"===n.toLowerCase()&&(m.type=\"MeshStandardMaterial\");break;case \"mapDiffuse\":m.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case \"mapDiffuseRepeat\":case \"mapDiffuseOffset\":case \"mapDiffuseWrap\":case \"mapDiffuseAnisotropy\":break;case \"mapEmissive\":m.emissiveMap=h(n,e.mapEmissiveRepeat,e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);\nbreak;case \"mapEmissiveRepeat\":case \"mapEmissiveOffset\":case \"mapEmissiveWrap\":case \"mapEmissiveAnisotropy\":break;case \"mapLight\":m.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case \"mapLightRepeat\":case \"mapLightOffset\":case \"mapLightWrap\":case \"mapLightAnisotropy\":break;case \"mapAO\":m.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case \"mapAORepeat\":case \"mapAOOffset\":case \"mapAOWrap\":case \"mapAOAnisotropy\":break;case \"mapBump\":m.bumpMap=\nh(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case \"mapBumpScale\":m.bumpScale=n;break;case \"mapBumpRepeat\":case \"mapBumpOffset\":case \"mapBumpWrap\":case \"mapBumpAnisotropy\":break;case \"mapNormal\":m.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case \"mapNormalFactor\":m.normalScale=[n,n];break;case \"mapNormalRepeat\":case \"mapNormalOffset\":case \"mapNormalWrap\":case \"mapNormalAnisotropy\":break;case \"mapSpecular\":m.specularMap=\nh(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case \"mapSpecularRepeat\":case \"mapSpecularOffset\":case \"mapSpecularWrap\":case \"mapSpecularAnisotropy\":break;case \"mapMetalness\":m.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case \"mapMetalnessRepeat\":case \"mapMetalnessOffset\":case \"mapMetalnessWrap\":case \"mapMetalnessAnisotropy\":break;case \"mapRoughness\":m.roughnessMap=h(n,e.mapRoughnessRepeat,\ne.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case \"mapRoughnessRepeat\":case \"mapRoughnessOffset\":case \"mapRoughnessWrap\":case \"mapRoughnessAnisotropy\":break;case \"mapAlpha\":m.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case \"mapAlphaRepeat\":case \"mapAlphaOffset\":case \"mapAlphaWrap\":case \"mapAlphaAnisotropy\":break;case \"flipSided\":m.side=1;break;case \"doubleSided\":m.side=2;break;case \"transparency\":console.warn(\"THREE.Loader.createMaterial: transparency has been renamed to opacity\");\nm.opacity=n;break;case \"depthTest\":case \"depthWrite\":case \"colorWrite\":case \"opacity\":case \"reflectivity\":case \"transparent\":case \"visible\":case \"wireframe\":m[l]=n;break;case \"vertexColors\":!0===n&&(m.vertexColors=2);\"face\"===n&&(m.vertexColors=1);break;default:console.error(\"THREE.Loader.createMaterial: Unsupported\",l,n)}}\"MeshBasicMaterial\"===m.type&&delete m.emissive;\"MeshPhongMaterial\"!==m.type&&delete m.specular;1>m.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ce.prototype,\n{load:function(a,b,c,d){var e=this,f=this.texturePath&&\"string\"===typeof this.texturePath?this.texturePath:ec.prototype.extractUrlBase(a),g=new Ka(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if(\"object\"===d.toLowerCase()){console.error(\"THREE.JSONLoader: \"+a+\" should be loaded with THREE.ObjectLoader instead.\");return}if(\"scene\"===d.toLowerCase()){console.error(\"THREE.JSONLoader: \"+a+\" should be loaded with THREE.SceneLoader instead.\");\nreturn}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new J,d=a,e,f,g,h,k,m,l,v,p,r,z,t,y,x,u=d.faces;p=d.vertices;var B=d.normals,w=d.colors;m=d.scale;var I=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&I++;for(e=0;e<I;e++)c.faceVertexUvs[e]=[]}h=0;for(k=p.length;h<k;)e=new n,e.x=p[h++]*m,e.y=p[h++]*m,e.z=p[h++]*m,c.vertices.push(e);\nh=0;for(k=u.length;h<k;)if(p=u[h++],r=p&1,g=p&2,e=p&8,l=p&16,z=p&32,m=p&64,p&=128,r){r=new Sa;r.a=u[h];r.b=u[h+1];r.c=u[h+3];t=new Sa;t.a=u[h+1];t.b=u[h+2];t.c=u[h+3];h+=4;g&&(g=u[h++],r.materialIndex=g,t.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=[],c.faceVertexUvs[e][g+1]=[],f=0;4>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+1].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]),\nt.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=u[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(p)for(e=0;4>e;e++)m=u[h++],m=w[m],2!==e&&r.vertexColors.push(new G(m)),0!==e&&t.vertexColors.push(new G(m));c.faces.push(r);c.faces.push(t)}else{r=new Sa;r.a=u[h++];r.b=u[h++];r.c=u[h++];g&&(g=u[h++],r.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=\n[],f=0;3>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),c.faceVertexUvs[e][g].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]));if(z)for(e=0;3>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),r.vertexNormals.push(z);m&&(m=u[h++],r.color.setHex(w[m]));if(p)for(e=0;3>e;e++)m=u[h++],r.vertexColors.push(new G(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,u=d.skinWeights.length;k<u;k+=h)c.skinWeights.push(new fa(d.skinWeights[k],1<h?d.skinWeights[k+\n1]:0,2<h?d.skinWeights[k+2]:0,3<h?d.skinWeights[k+3]:0));if(d.skinIndices)for(k=0,u=d.skinIndices.length;k<u;k+=h)c.skinIndices.push(new fa(d.skinIndices[k],1<h?d.skinIndices[k+1]:0,2<h?d.skinIndices[k+2]:0,3<h?d.skinIndices[k+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn(\"When skinning, number of vertices (\"+c.vertices.length+\"), skinIndices (\"+c.skinIndices.length+\"), and skinWeights (\"+c.skinWeights.length+\n\") should match.\");k=a;u=k.scale;if(void 0!==k.morphTargets)for(d=0,h=k.morphTargets.length;d<h;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=k.morphTargets[d].name,c.morphTargets[d].vertices=[],B=c.morphTargets[d].vertices,w=k.morphTargets[d].vertices,I=0,p=w.length;I<p;I+=3)m=new n,m.x=w[I]*u,m.y=w[I+1]*u,m.z=w[I+2]*u,B.push(m);if(void 0!==k.morphColors&&0<k.morphColors.length)for(console.warn('THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.'),u=c.faces,k=k.morphColors[0].colors,\nd=0,h=u.length;d<h;d++)u[d].color.fromArray(k,3*d);k=a;d=[];h=[];void 0!==k.animation&&h.push(k.animation);void 0!==k.animations&&(k.animations.length?h=h.concat(k.animations):h.push(k.animations));for(k=0;k<h.length;k++)(u=Da.parseAnimation(h[k],c.bones))&&d.push(u);c.morphTargets&&(h=Da.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(h));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};\nd=ec.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}}()});Object.assign(Pe.prototype,{load:function(a,b,c,d){\"\"===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf(\"/\")+1));var e=this;(new Ka(e.manager)).load(a,function(c){var g=null;try{g=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error(\"THREE:ObjectLoader: Can't parse \"+a+\".\",h.message);return}c=g.metadata;void 0===c||void 0===c.type||\"geometry\"===c.type.toLowerCase()?console.error(\"THREE.ObjectLoader: Can't load \"+\na+\". Use THREE.JSONLoader instead.\"):e.parse(g,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},\nparseGeometries:function(a){var b={};if(void 0!==a)for(var c=new ce,d=new be,e=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case \"PlaneGeometry\":case \"PlaneBufferGeometry\":g=new Ma[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case \"BoxGeometry\":case \"BoxBufferGeometry\":case \"CubeGeometry\":g=new Ma[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case \"CircleGeometry\":case \"CircleBufferGeometry\":g=new Ma[h.type](h.radius,h.segments,h.thetaStart,\nh.thetaLength);break;case \"CylinderGeometry\":case \"CylinderBufferGeometry\":g=new Ma[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case \"ConeGeometry\":case \"ConeBufferGeometry\":g=new Ma[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case \"SphereGeometry\":case \"SphereBufferGeometry\":g=new Ma[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,\nh.thetaStart,h.thetaLength);break;case \"DodecahedronGeometry\":case \"IcosahedronGeometry\":case \"OctahedronGeometry\":case \"TetrahedronGeometry\":g=new Ma[h.type](h.radius,h.detail);break;case \"RingGeometry\":case \"RingBufferGeometry\":g=new Ma[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case \"TorusGeometry\":case \"TorusBufferGeometry\":g=new Ma[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case \"TorusKnotGeometry\":case \"TorusKnotBufferGeometry\":g=\nnew Ma[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case \"LatheGeometry\":case \"LatheBufferGeometry\":g=new Ma[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case \"BufferGeometry\":g=d.parse(h);break;case \"Geometry\":g=c.parse(h,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type \"'+h.type+'\"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==\na){var d=new Gd;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=a[e];if(\"MultiMaterial\"===g.type){for(var h=[],k=0;k<g.materials.length;k++)h.push(d.parse(g.materials[k]));c[g.uuid]=h}else c[g.uuid]=d.parse(g)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=Da.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}\nvar d=this,e={};if(void 0!==a&&0<a.length){var f=new Zd(b),g=new Sc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var k=a[f],m=/^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test(k.url)?k.url:d.texturePath+k.url;e[k.uuid]=c(m)}}return e},parseTextures:function(a,b){function c(a,b){if(\"number\"===typeof a)return a;console.warn(\"THREE.ObjectLoader.parseTexture: Constant should be in numeric form.\",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&\nconsole.warn('THREE.ObjectLoader: No \"image\" specified for',g.uuid);void 0===b[g.image]&&console.warn(\"THREE.ObjectLoader: Undefined image\",g.image);var h=new ba(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ng));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],ff),h.wrapT=c(g.wrap[1],ff));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,gf));\nvoid 0!==g.magFilter&&(h.magFilter=c(g.magFilter,gf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new K;return function(b,c,d){function e(a){void 0===c[a]&&console.warn(\"THREE.ObjectLoader: Undefined geometry\",a);return c[a]}function f(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],c=0,e=a.length;c<e;c++){var f=a[c];void 0===d[f]&&console.warn(\"THREE.ObjectLoader: Undefined material\",f);b.push(d[f])}return b}void 0===\nd[a]&&console.warn(\"THREE.ObjectLoader: Undefined material\",a);return d[a]}}var g;switch(b.type){case \"Scene\":g=new ld;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new G(b.background));void 0!==b.fog&&(\"Fog\"===b.fog.type?g.fog=new Jb(b.fog.color,b.fog.near,b.fog.far):\"FogExp2\"===b.fog.type&&(g.fog=new Ib(b.fog.color,b.fog.density)));break;case \"PerspectiveCamera\":g=new qa(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==\nb.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case \"OrthographicCamera\":g=new Fb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case \"AmbientLight\":g=new yd(b.color,b.intensity);break;case \"DirectionalLight\":g=new xd(b.color,b.intensity);break;case \"PointLight\":g=new vd(b.color,b.intensity,b.distance,b.decay);break;case \"RectAreaLight\":g=new zd(b.color,b.intensity,b.width,b.height);break;case \"SpotLight\":g=\nnew ud(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case \"HemisphereLight\":g=new sd(b.color,b.groundColor,b.intensity);break;case \"SkinnedMesh\":console.warn(\"THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.\");case \"Mesh\":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new nd(g,h):new la(g,h);break;case \"LOD\":g=new yc;break;case \"Line\":g=new sa(e(b.geometry),f(b.material),b.mode);break;case \"LineLoop\":g=new od(e(b.geometry),f(b.material));break;\ncase \"LineSegments\":g=new Q(e(b.geometry),f(b.material));break;case \"PointCloud\":case \"Points\":g=new Kb(e(b.geometry),f(b.material));break;case \"Sprite\":g=new xc(f(b.material));break;case \"Group\":g=new Ac;break;default:g=new z}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),\nvoid 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=\nb.userData);if(void 0!==b.children)for(var k in b.children)g.add(this.parseObject(b.children[k],c,d));if(\"LOD\"===b.type)for(b=b.levels,h=0;h<b.length;h++){var m=b[h];k=g.getObjectByProperty(\"uuid\",m.object);void 0!==k&&g.addLevel(k,m.distance)}return g}}()});var ng={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},ff={RepeatWrapping:1E3,\nClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},gf={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(ua.prototype,{getPoint:function(){console.warn(\"THREE.Curve: .getPoint() not implemented.\");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/\na));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),f+=c.distanceTo(d),b.push(f),d=c;return this.cacheArcLengths=\nb},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);\nreturn this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new n,d=[],e=[],f=[],g=new n,h=new K,k,m;for(k=0;k<=a;k++)m=k/a,d[k]=this.getTangentAt(m),d[k].normalize();e[0]=new n;f[0]=new n;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),v=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));v<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-\n1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(Y.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Y.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}}});Qa.prototype=Object.create(ua.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isLineCurve=\n!0;Qa.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};Qa.prototype.getPointAt=function(a){return this.getPoint(a)};Qa.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};Vc.prototype=Object.assign(Object.create(ua.prototype),{constructor:Vc,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);\na.equals(b)||this.curves.push(new Qa(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;\nfor(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),\nc=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},createPointsGeometry:function(a){a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){for(var b=new J,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new n(e.x,e.y,e.z||0))}return b}});Va.prototype=Object.create(ua.prototype);Va.prototype.constructor=Va;Va.prototype.isEllipseCurve=!0;Va.prototype.getPoint=\nfunction(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b;for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new C(a,e)};yb.prototype=Object.create(ua.prototype);yb.prototype.constructor=\nyb;yb.prototype.isSplineCurve=!0;yb.prototype.getPoint=function(a){var b=this.points,c=(b.length-1)*a;a=Math.floor(c);var c=c-a,d=b[0===a?a:a-1],e=b[a],f=b[a>b.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new C(Qe(c,d.x,e.x,f.x,b.x),Qe(c,d.y,e.y,f.y,b.y))};fc.prototype=Object.create(ua.prototype);fc.prototype.constructor=fc;fc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new C(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y))};gc.prototype=Object.create(ua.prototype);\ngc.prototype.constructor=gc;gc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new C(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y))};var te=Object.assign(Object.create(Vc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Qa(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,\nb,c,d){a=new gc(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new fc(this.currentPoint.clone(),new C(a,b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new yb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,\nb,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Va(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)}});Wc.prototype=te;te.constructor=Wc;zb.prototype=Object.assign(Object.create(te),{constructor:zb,getPointsHoles:function(a){for(var b=\n[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Object.assign(de.prototype,{moveTo:function(a,b){this.currentPath=new Wc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,\nb,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new zb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,m=h.y-g.y;if(Math.abs(m)>Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;\n0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ia.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new zb,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var n=[],p=[],r=0,z;n[r]=void 0;p[r]=[];for(var t=0,y=f.length;t<y;t++)h=f[t],z=h.getPoints(),g=e(z),(g=a?!g:g)?(!l&&n[r]&&r++,n[r]={s:new zb,p:z},n[r].s.curves=h.curves,l&&r++,p[r]=[]):p[r].push({h:h,\np:z[0]});if(!n[0])return c(f);if(1<n.length){t=!1;h=[];e=0;for(f=n.length;e<f;e++)k[e]=[];e=0;for(f=n.length;e<f;e++)for(g=p[e],l=0;l<g.length;l++){r=g[l];z=!0;for(y=0;y<n.length;y++)d(r.p,n[y].p)&&(e!==y&&h.push({froms:e,tos:y,hole:l}),z?(z=!1,k[y].push(r)):t=!0);z&&k[e].push(r)}0<h.length&&(t||(p=k))}t=0;for(e=n.length;t<e;t++)for(k=n[t].s,m.push(k),h=p[t],f=0,g=h.length;f<g;f++)k.holes.push(h[f].h);return m}});Object.assign(ee.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=\n100);void 0===c&&(c=4);var d=this.data;a=String(a).split(\"\");var e=b/d.resolution,f=(d.boundingBox.yMax-d.boundingBox.yMin+d.underlineThickness)*e,g=0,h=0;b=[];for(var k=0;k<a.length;k++){var m=a[k];if(\"\\n\"===m)g=0,h-=f;else{var l;l=e;var n=g,p=h;if(m=d.glyphs[m]||d.glyphs[\"?\"]){var r=new de,z=[],t,y,x,u,B,w,C,G;if(m.o)for(var D=m._cachedOutline||(m._cachedOutline=m.o.split(\" \")),E=0,J=D.length;E<J;)switch(D[E++]){case \"m\":t=D[E++]*l+n;y=D[E++]*l+p;r.moveTo(t,y);break;case \"l\":t=D[E++]*l+n;y=D[E++]*\nl+p;r.lineTo(t,y);break;case \"q\":t=D[E++]*l+n;y=D[E++]*l+p;B=D[E++]*l+n;w=D[E++]*l+p;r.quadraticCurveTo(B,w,t,y);if(u=z[z.length-1]){x=u.x;u=u.y;for(var F=1;F<=c;F++){var K=F/c;wb(K,x,B,t);wb(K,u,w,y)}}break;case \"b\":if(t=D[E++]*l+n,y=D[E++]*l+p,B=D[E++]*l+n,w=D[E++]*l+p,C=D[E++]*l+n,G=D[E++]*l+p,r.bezierCurveTo(B,w,C,G,t,y),u=z[z.length-1])for(x=u.x,u=u.y,F=1;F<=c;F++)K=F/c,xb(K,x,B,C,t),xb(K,u,w,G,y)}l={offsetX:m.ha*l,path:r}}else l=void 0;g+=l.offsetX;b.push(l.path)}}c=[];d=0;for(a=b.length;d<\na;d++)Array.prototype.push.apply(c,b[d].toShapes());return c}});Object.assign(Re.prototype,{load:function(a,b,c,d){var e=this;(new Ka(this.manager)).load(a,function(a){var c;try{c=JSON.parse(a)}catch(d){console.warn(\"THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.\"),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ee(a)}});var Nd,he={getContext:function(){void 0===Nd&&(Nd=new (window.AudioContext||window.webkitAudioContext));\nreturn Nd},setContext:function(a){Nd=a}};Object.assign(fe.prototype,{load:function(a,b,c,d){var e=new Ka(this.manager);e.setResponseType(\"arraybuffer\");e.load(a,function(a){he.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(Se.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new K,m=new K;return function(l){if(a!==this||b!==l.focus||c!==l.fov||d!==l.aspect*this.aspect||e!==l.near||f!==l.far||g!==l.zoom||h!==this.eyeSep){a=this;b=l.focus;c=l.fov;d=l.aspect*this.aspect;e=\nl.near;f=l.far;g=l.zoom;var n=l.projectionMatrix.clone();h=this.eyeSep/2;var p=h*e/b,r=e*Math.tan(Y.DEG2RAD*c*.5)/g,z,t;m.elements[12]=-h;k.elements[12]=h;z=-r*d+p;t=r*d+p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraL.projectionMatrix.copy(n);z=-r*d-p;t=r*d-p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(l.matrixWorld).multiply(m);this.cameraR.matrixWorld.copy(l.matrixWorld).multiply(k)}}()});Hd.prototype=Object.create(z.prototype);\nHd.prototype.constructor=Hd;ge.prototype=Object.assign(Object.create(z.prototype),{constructor:ge,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);\nthis.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new n,b=new oa,c=new n,d=new n;return function(e){z.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),\ne.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,\nf.z))}}()});hc.prototype=Object.assign(Object.create(z.prototype),{constructor:hc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType=\"audioNode\";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType=\"buffer\";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn(\"THREE.Audio: Audio is already playing.\");else if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");\nelse{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);a.start(0,this.startTime);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");\nelse return this.source.stop(),this.startTime=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-\n1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");\nelse return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn(\"THREE.Audio: this Audio has no playback control.\"),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return this.loop=\na,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});ie.prototype=Object.assign(Object.create(hc.prototype),{constructor:ie,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=\na},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new n;return function(b){z.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(je.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);\nreturn this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(ke.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&\nthis._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){oa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=\n1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Te.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,\nc=a.length;b!==c;++b)a[b].unbind()}});Object.assign(ha,{Composite:Te,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ha.Composite(a,b,c):new ha(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\\s/g,\"_\").replace(/[^\\w-]/g,\"\")},parseTrackName:function(){var a=new RegExp(\"^\"+/((?:[\\w-]+[\\/:])*)/.source+/([\\w-\\.]+)?/.source+/(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?/.source+/\\.([\\w-]+)(?:\\[(.+)\\])?/.source+\"$\"),b=[\"material\",\"materials\",\"bones\"];return function(c){var d=a.exec(c);if(!d)throw Error(\"PropertyBinding: Cannot parse trackName: \"+\nc);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(\".\");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error(\"PropertyBinding: can not parse propertyName from trackName: \"+c);return d}}(),findNode:function(a,b){if(!b||\"\"===b||\"root\"===b||\".\"===b||-1===b||b===a.name||b===a.uuid)return a;\nif(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};if(c=d(a.children))return c}return null}});Object.assign(ha.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,\nNeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[this.propertyName]=\na[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=\na[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=\nthis.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=ha.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case \"materials\":if(!a.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",this);return}if(!a.material.materials){console.error(\"THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.\",\nthis);return}a=a.material.materials;break;case \"bones\":if(!a.skeleton){console.error(\"THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.\",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error(\"THREE.PropertyBinding: Can not bind to objectName of node undefined.\",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error(\"THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.\",\nthis,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error(\"THREE.PropertyBinding: Trying to update property for track: \"+b.nodeName+\".\"+d+\" but it wasn't found.\",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if(\"morphTargetInfluences\"===d){if(!a.geometry){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.\",\nthis);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.\",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.\",\nthis);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error(\"THREE.PropertyBinding: Trying to update node for track: \"+\nthis.path+\" but it wasn't found.\")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(ha.prototype,{_getValue_unbound:ha.prototype.getValue,_setValue_unbound:ha.prototype.setValue});Object.assign(Ue.prototype,{isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,k=h.length,m=0,l=arguments.length;m!==l;++m){var n=\narguments[m],p=n.uuid,r=e[p];if(void 0===r){r=c++;e[p]=r;b.push(n);for(var p=0,z=k;p!==z;++p)h[p].push(new ha(n,f[p],g[p]))}else if(r<d){var t=--d,z=b[t];e[z.uuid]=r;b[r]=z;e[p]=t;b[t]=n;p=0;for(z=k;p!==z;++p){var y=h[p],x=y[r];y[r]=y[t];void 0===x&&(x=new ha(n,f[p],g[p]));y[t]=x}}else void 0!==b[r]&&console.error(\"THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.\")}this.nCachedObjects_=d},remove:function(a){for(var b=\nthis._objects,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g],m=k.uuid,l=d[m];if(void 0!==l&&l>=c){var n=c++,p=b[n];d[p.uuid]=l;b[l]=p;d[m]=n;b[n]=k;k=0;for(m=f;k!==m;++k){var p=e[k],r=p[l];p[l]=p[n];p[n]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,n=e[l];\nif(void 0!==n)if(delete e[l],n<d){var l=--d,v=b[l],p=--c,r=b[p];e[v.uuid]=n;b[n]=v;e[r.uuid]=l;b[l]=r;b.pop();v=0;for(r=g;v!==r;++v){var z=f[v],t=z[p];z[n]=z[l];z[l]=t;z.pop()}}else for(p=--c,r=b[p],e[r.uuid]=n,b[n]=r,b.pop(),v=0,r=g;v!==r;++v)z=f[v],z[n]=z[p],z.pop()}this.nCachedObjects_=d},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;\nc[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new ha(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(Ve.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=\n!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?\na:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=\nnull,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,\nb,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||\nthis._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],\nb=b*d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===\nd)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:\"finished\",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?\nc:0,this._mixer.dispatchEvent({type:\"finished\",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:\"loop\",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,\nb,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(We.prototype,xa.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var n=d[k],v=n.name,p=l[v];if(void 0===\np){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,v));continue}p=new ke(ha.create(c,v,b&&b._propertyBindings[k].binding.parsedPath),n.ValueTypeName,n.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,v)}f[k]=p;g[k].resultBuffer=p.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,\nc,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=\n0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},\n_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var b=a._clip.uuid,c=this._actionsByClip,d=c[b],e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;\nf._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=\nthis._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;\ndelete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Tc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),\nc.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid,e=\"string\"===typeof a?Da.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===\ne&&(e=g._clip)}if(null===e)return null;e=new Ve(this,e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c=\"string\"===typeof a?Da.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=\n0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=\ng._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,\nb);null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Id.prototype.clone=function(){return new Id(void 0===this.value.clone?this.value:this.value.clone())};le.prototype=Object.assign(Object.create(E.prototype),{constructor:le,isInstancedBufferGeometry:!0,addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=\na.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this}});Object.defineProperties(me.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(me.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+\nthis.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+\n1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(ic.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});Object.assign(ic.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");\nthis.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=\na;return this}});ne.prototype=Object.assign(Object.create(ic.prototype),{constructor:ne,isInstancedInterleavedBuffer:!0,copy:function(a){ic.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});oe.prototype=Object.assign(Object.create(Z.prototype),{constructor:oe,isInstancedBufferAttribute:!0,copy:function(a){Z.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(Xe.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,\nb)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error(\"THREE.Raycaster: Unsupported camera type.\")},intersectObject:function(a,b){var c=[];pe(a,this,c,b);c.sort(Ye);return c},intersectObjects:function(a,\nb){var c=[];if(!1===Array.isArray(a))return console.warn(\"THREE.Raycaster.intersectObjects: objects is not an Array.\"),c;for(var d=0,e=a.length;d<e;d++)pe(a[d],this,c,b);c.sort(Ye);return c}});Object.assign(Ze.prototype,{start:function(){this.oldTime=this.startTime=(\"undefined\"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=\n0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=(\"undefined\"===typeof performance?Date:performance).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign($e.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-\n1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(Y.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(af.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*\na.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});ta.prototype=Object.create(la.prototype);ta.prototype.constructor=ta;ta.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};ta.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\\d+)/i,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<\ng;f++){var h=e.morphTargets[f].name.match(b);if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};ta.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ta.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ta.prototype.setAnimationFPS=\nfunction(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ta.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ta.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ta.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ta.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ta.prototype.getAnimationDuration=\nfunction(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ta.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn(\"THREE.MorphBlendMesh: animation[\"+a+\"] undefined in .playAnimation()\")};ta.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ta.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>\nd.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+Y.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!==\nd.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};Xc.prototype=Object.create(z.prototype);Xc.prototype.constructor=Xc;Xc.prototype.isImmediateRenderObject=!0;Yc.prototype=Object.create(Q.prototype);Yc.prototype.constructor=Yc;Yc.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){var d=[\"a\",\"b\",\"c\"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);\nvar e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,n=k.length;l<n;l++)for(var v=k[l],p=0,r=v.vertexNormals.length;p<r;p++){var z=v.vertexNormals[p];a.copy(h[v[d[p]]]).applyMatrix4(e);b.copy(z).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,p=g=0,r=d.count;p<\nr;p++)a.set(d.getX(p),d.getY(p),d.getZ(p)).applyMatrix4(e),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0}}();jc.prototype=Object.create(z.prototype);jc.prototype.constructor=jc;jc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};jc.prototype.update=function(){var a=new n,b=new n;return function(){this.light.updateMatrixWorld();var c=\nthis.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color)}}();kc.prototype=Object.create(Q.prototype);kc.prototype.constructor=kc;kc.prototype.onBeforeRender=function(){var a=new n,b=new K,c=new K;return function(){var d=this.bones,e=this.geometry,f=e.getAttribute(\"position\");c.getInverse(this.root.matrixWorld);\nfor(var g=0,h=0;g<d.length;g++){var k=d[g];k.parent&&k.parent.isBone&&(b.multiplyMatrices(c,k.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h,a.x,a.y,a.z),b.multiplyMatrices(c,k.parent.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h+1,a.x,a.y,a.z),h+=2)}e.getAttribute(\"position\").needsUpdate=!0}}();lc.prototype=Object.create(la.prototype);lc.prototype.constructor=lc;lc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};lc.prototype.update=function(){this.material.color.copy(this.light.color)};\nmc.prototype=Object.create(z.prototype);mc.prototype.constructor=mc;mc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};mc.prototype.update=function(){var a=this.children[0];a.material.color.copy(this.light.color);var b=.5*this.light.width,c=.5*this.light.height,a=a.geometry.attributes.position,d=a.array;d[0]=b;d[1]=-c;d[2]=0;d[3]=b;d[4]=c;d[5]=0;d[6]=-b;d[7]=c;d[8]=0;d[9]=-b;d[10]=-c;d[11]=0;d[12]=b;d[13]=-c;d[14]=0;a.needsUpdate=!0};nc.prototype=\nObject.create(z.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};nc.prototype.update=function(){var a=new n,b=new G,c=new G;return function(){var d=this.children[0],e=d.geometry.getAttribute(\"color\");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());e.needsUpdate=\n!0}}();Zc.prototype=Object.create(Q.prototype);Zc.prototype.constructor=Zc;Jd.prototype=Object.create(Q.prototype);Jd.prototype.constructor=Jd;$c.prototype=Object.create(Q.prototype);$c.prototype.constructor=$c;$c.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<\nl;k++){var n=f[k],v=n.normal;a.copy(g[n.a]).add(g[n.b]).add(g[n.c]).divideScalar(3).applyMatrix4(d);b.copy(v).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();oc.prototype=Object.create(z.prototype);oc.prototype.constructor=oc;oc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose();b.geometry.dispose();b.material.dispose()};oc.prototype.update=function(){var a=\nnew n,b=new n,c=new n;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color);e.lookAt(c);e.scale.z=c.length()}}();ad.prototype=Object.create(Q.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute(\"position\"),h=0,k=a.length;h<\nk;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new n,e=new Na;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",.7,1.1,-1);a(\"u2\",-.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",0,1,-1);b.getAttribute(\"position\").needsUpdate=\n!0}}();Ab.prototype=Object.create(Q.prototype);Ab.prototype.constructor=Ab;Ab.prototype.update=function(){var a=new Ra;return function(b){void 0!==b&&console.warn(\"THREE.BoxHelper: .update() has no longer arguments.\");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;\ne[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Ab.prototype.setFromObject=function(a){this.object=a;this.update();return this};var Kd,qe;Bb.prototype=Object.create(z.prototype);Bb.prototype.constructor=Bb;Bb.prototype.setDirection=function(){var a=new n,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,\nb))}}();Bb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Bb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Ld.prototype=Object.create(Q.prototype);Ld.prototype.constructor=Ld;var Od=new n,ue=new re,ve=new re,we=new re;La.prototype=Object.create(ua.prototype);La.prototype.constructor=\nLa;La.prototype.getPoint=function(a){var b=this.points,c=b.length;a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0<d?0:(Math.floor(Math.abs(d)/b.length)+1)*b.length:0===a&&d===c-1&&(d=c-2,a=1);var e,f,g;this.closed||0<d?e=b[(d-1)%c]:(Od.subVectors(b[0],b[1]).add(b[0]),e=Od);f=b[d%c];g=b[(d+1)%c];this.closed||d+2<c?b=b[(d+2)%c]:(Od.subVectors(b[c-1],b[c-2]).add(b[c-1]),b=Od);if(void 0===this.type||\"centripetal\"===this.type||\"chordal\"===this.type){var h=\"chordal\"===this.type?.5:.25,\nc=Math.pow(e.distanceToSquared(f),h),d=Math.pow(f.distanceToSquared(g),h),h=Math.pow(g.distanceToSquared(b),h);1E-4>d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);ue.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);ve.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);we.initNonuniformCatmullRom(e.z,f.z,g.z,b.z,c,d,h)}else\"catmullrom\"===this.type&&(c=void 0!==this.tension?this.tension:.5,ue.initCatmullRom(e.x,f.x,g.x,b.x,c),ve.initCatmullRom(e.y,f.y,g.y,b.y,c),we.initCatmullRom(e.z,f.z,g.z,b.z,c));return new n(ue.calc(a),\nve.calc(a),we.calc(a))};bd.prototype=Object.create(ua.prototype);bd.prototype.constructor=bd;bd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new n(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y),xb(a,b.z,c.z,d.z,e.z))};cd.prototype=Object.create(ua.prototype);cd.prototype.constructor=cd;cd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new n(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y),wb(a,b.z,c.z,d.z))};dd.prototype=Object.create(ua.prototype);dd.prototype.constructor=\ndd;dd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new n;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Md.prototype=Object.create(Va.prototype);Md.prototype.constructor=Md;ua.create=function(a,b){console.log(\"THREE.Curve.create() has been deprecated\");a.prototype=Object.create(ua.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};cf.prototype=Object.create(La.prototype);df.prototype=Object.create(La.prototype);se.prototype=Object.create(La.prototype);\nObject.assign(se.prototype,{initFromArray:function(a){console.error(\"THREE.Spline: .initFromArray() has been removed.\")},getControlPointsArray:function(a){console.error(\"THREE.Spline: .getControlPointsArray() has been removed.\")},reparametrizeByArcLength:function(a){console.error(\"THREE.Spline: .reparametrizeByArcLength() has been removed.\")}});Zc.prototype.setColors=function(){console.error(\"THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.\")};kc.prototype.update=\nfunction(){console.error(\"THREE.SkeletonHelper: update() no longer needs to be called.\")};Object.assign(fd.prototype,{center:function(a){console.warn(\"THREE.Box2: .center() has been renamed to .getCenter().\");return this.getCenter(a)},empty:function(){console.warn(\"THREE.Box2: .empty() has been renamed to .isEmpty().\");return this.isEmpty()},isIntersectionBox:function(a){console.warn(\"THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},size:function(a){console.warn(\"THREE.Box2: .size() has been renamed to .getSize().\");\nreturn this.getSize(a)}});Object.assign(Ra.prototype,{center:function(a){console.warn(\"THREE.Box3: .center() has been renamed to .getCenter().\");return this.getCenter(a)},empty:function(){console.warn(\"THREE.Box3: .empty() has been renamed to .isEmpty().\");return this.isEmpty()},isIntersectionBox:function(a){console.warn(\"THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn(\"THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().\");\nreturn this.intersectsSphere(a)},size:function(a){console.warn(\"THREE.Box3: .size() has been renamed to .getSize().\");return this.getSize(a)}});Hb.prototype.center=function(a){console.warn(\"THREE.Line3: .center() has been renamed to .getCenter().\");return this.getCenter(a)};Y.random16=function(){console.warn(\"THREE.Math.random16() has been deprecated. Use Math.random() instead.\");return Math.random()};Object.assign(Ba.prototype,{flattenToArrayOffset:function(a,b){console.warn(\"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\");\nreturn this.toArray(a,b)},multiplyVector3:function(a){console.warn(\"THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.\");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.error(\"THREE.Matrix3: .multiplyVector3Array() has been removed.\")},applyToBuffer:function(a,b,c){console.warn(\"THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.\");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,\nb,c){console.error(\"THREE.Matrix3: .applyToVector3Array() has been removed.\")}});Object.assign(K.prototype,{extractPosition:function(a){console.warn(\"THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().\");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn(\"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new n);console.warn(\"THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.\");\nreturn a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn(\"THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().\");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn(\"THREE.Matrix4: .multiplyToArray() has been removed.\")},multiplyVector3:function(a){console.warn(\"THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn(\"THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.\");\nreturn a.applyMatrix4(this)},multiplyVector3Array:function(a){console.error(\"THREE.Matrix4: .multiplyVector3Array() has been removed.\")},rotateAxis:function(a){console.warn(\"THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.\");a.transformDirection(this)},crossVector:function(a){console.warn(\"THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return a.applyMatrix4(this)},translate:function(){console.error(\"THREE.Matrix4: .translate() has been removed.\")},\nrotateX:function(){console.error(\"THREE.Matrix4: .rotateX() has been removed.\")},rotateY:function(){console.error(\"THREE.Matrix4: .rotateY() has been removed.\")},rotateZ:function(){console.error(\"THREE.Matrix4: .rotateZ() has been removed.\")},rotateByAxis:function(){console.error(\"THREE.Matrix4: .rotateByAxis() has been removed.\")},applyToBuffer:function(a,b,c){console.warn(\"THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.\");return this.applyToBufferAttribute(a)},\napplyToVector3Array:function(a,b,c){console.error(\"THREE.Matrix4: .applyToVector3Array() has been removed.\")},makeFrustum:function(a,b,c,d,e,f){console.warn(\"THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.\");return this.makePerspective(a,b,d,c,e,f)}});Aa.prototype.isIntersectionLine=function(a){console.warn(\"THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().\");return this.intersectsLine(a)};oa.prototype.multiplyVector3=\nfunction(a){console.warn(\"THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.\");return a.applyQuaternion(this)};Object.assign(kb.prototype,{isIntersectionBox:function(a){console.warn(\"THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn(\"THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().\");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn(\"THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().\");\nreturn this.intersectsSphere(a)}});Object.assign(zb.prototype,{extrude:function(a){console.warn(\"THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.\");return new cb(this,a)},makeGeometry:function(a){console.warn(\"THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.\");return new Xb(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.error(\"THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,\nb,c)}});Object.assign(n.prototype,{setEulerFromRotationMatrix:function(){console.error(\"THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.\")},setEulerFromQuaternion:function(){console.error(\"THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.\")},getPositionFromMatrix:function(a){console.warn(\"THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().\");return this.setFromMatrixPosition(a)},\ngetScaleFromMatrix:function(a){console.warn(\"THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().\");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn(\"THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().\");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn(\"THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.\");return this.applyMatrix4(a)},fromAttribute:function(a,\nb,c){console.error(\"THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,b,c)}});Object.assign(fa.prototype,{fromAttribute:function(a,b,c){console.error(\"THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,b,c)}});J.prototype.computeTangents=function(){console.warn(\"THREE.Geometry: .computeTangents() has been removed.\")};Object.assign(z.prototype,{getChildByName:function(a){console.warn(\"THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().\");\nreturn this.getObjectByName(a)},renderDepth:function(){console.warn(\"THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.\")},translate:function(a,b){console.warn(\"THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.\");return this.translateOnAxis(b,a)}});Object.defineProperties(z.prototype,{eulerOrder:{get:function(){console.warn(\"THREE.Object3D: .eulerOrder is now .rotation.order.\");return this.rotation.order},set:function(a){console.warn(\"THREE.Object3D: .eulerOrder is now .rotation.order.\");\nthis.rotation.order=a}},useQuaternion:{get:function(){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")},set:function(){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")}}});Object.defineProperties(yc.prototype,{objects:{get:function(){console.warn(\"THREE.LOD: .objects has been renamed to .levels.\");return this.levels}}});Object.defineProperty(zc.prototype,\"useVertexTexture\",{get:function(){console.warn(\"THREE.Skeleton: useVertexTexture has been removed.\")},\nset:function(){console.warn(\"THREE.Skeleton: useVertexTexture has been removed.\")}});Object.defineProperty(ua.prototype,\"__arcLengthDivisions\",{get:function(){console.warn(\"THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.\");return this.arcLengthDivisions},set:function(a){console.warn(\"THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.\");this.arcLengthDivisions=a}});qa.prototype.setLens=function(a,b){console.warn(\"THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.\");\nvoid 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(na.prototype,{onlyShadow:{set:function(){console.warn(\"THREE.Light: .onlyShadow has been removed.\")}},shadowCameraFov:{set:function(a){console.warn(\"THREE.Light: .shadowCameraFov is now .shadow.camera.fov.\");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn(\"THREE.Light: .shadowCameraLeft is now .shadow.camera.left.\");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn(\"THREE.Light: .shadowCameraRight is now .shadow.camera.right.\");\nthis.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn(\"THREE.Light: .shadowCameraTop is now .shadow.camera.top.\");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn(\"THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.\");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn(\"THREE.Light: .shadowCameraNear is now .shadow.camera.near.\");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn(\"THREE.Light: .shadowCameraFar is now .shadow.camera.far.\");\nthis.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn(\"THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.\")}},shadowBias:{set:function(a){console.warn(\"THREE.Light: .shadowBias is now .shadow.bias.\");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn(\"THREE.Light: .shadowDarkness has been removed.\")}},shadowMapWidth:{set:function(a){console.warn(\"THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.\");\nthis.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn(\"THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.\");this.shadow.mapSize.height=a}}});Object.defineProperties(Z.prototype,{length:{get:function(){console.warn(\"THREE.BufferAttribute: .length has been deprecated. Use .count instead.\");return this.array.length}}});Object.assign(E.prototype,{addIndex:function(a){console.warn(\"THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().\");this.setIndex(a)},addDrawCall:function(a,\nb,c){void 0!==c&&console.warn(\"THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.\");console.warn(\"THREE.BufferGeometry: .addDrawCall() is now .addGroup().\");this.addGroup(a,b)},clearDrawCalls:function(){console.warn(\"THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().\");this.clearGroups()},computeTangents:function(){console.warn(\"THREE.BufferGeometry: .computeTangents() has been removed.\")},computeOffsets:function(){console.warn(\"THREE.BufferGeometry: .computeOffsets() has been removed.\")}});\nObject.defineProperties(E.prototype,{drawcalls:{get:function(){console.error(\"THREE.BufferGeometry: .drawcalls has been renamed to .groups.\");return this.groups}},offsets:{get:function(){console.warn(\"THREE.BufferGeometry: .offsets has been renamed to .groups.\");return this.groups}}});Object.defineProperties(Id.prototype,{dynamic:{set:function(){console.warn(\"THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.\")}},onUpdate:{value:function(){console.warn(\"THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.\");\nreturn this}}});Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn(\"THREE.Material: .wrapAround has been removed.\")},set:function(){console.warn(\"THREE.Material: .wrapAround has been removed.\")}},wrapRGB:{get:function(){console.warn(\"THREE.Material: .wrapRGB has been removed.\");return new G}}});Object.defineProperties(Ja.prototype,{metal:{get:function(){console.warn(\"THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.\");return!1},set:function(){console.warn(\"THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead\")}}});\nObject.defineProperties(ra.prototype,{derivatives:{get:function(){console.warn(\"THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.\");return this.extensions.derivatives},set:function(a){console.warn(\"THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.\");this.extensions.derivatives=a}}});Object.assign(Xd.prototype,{getCurrentRenderTarget:function(){console.warn(\"THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().\");return this.getRenderTarget()},\nsupportsFloatTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).\");return this.extensions.get(\"OES_texture_float\")},supportsHalfFloatTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).\");return this.extensions.get(\"OES_texture_half_float\")},supportsStandardDerivatives:function(){console.warn(\"THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).\");\nreturn this.extensions.get(\"OES_standard_derivatives\")},supportsCompressedTextureS3TC:function(){console.warn(\"THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).\");return this.extensions.get(\"WEBGL_compressed_texture_s3tc\")},supportsCompressedTexturePVRTC:function(){console.warn(\"THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).\");return this.extensions.get(\"WEBGL_compressed_texture_pvrtc\")},\nsupportsBlendMinMax:function(){console.warn(\"THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).\");return this.extensions.get(\"EXT_blend_minmax\")},supportsVertexTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.\");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn(\"THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).\");\nreturn this.extensions.get(\"ANGLE_instanced_arrays\")},enableScissorTest:function(a){console.warn(\"THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().\");this.setScissorTest(a)},initMaterial:function(){console.warn(\"THREE.WebGLRenderer: .initMaterial() has been removed.\")},addPrePlugin:function(){console.warn(\"THREE.WebGLRenderer: .addPrePlugin() has been removed.\")},addPostPlugin:function(){console.warn(\"THREE.WebGLRenderer: .addPostPlugin() has been removed.\")},updateShadowMap:function(){console.warn(\"THREE.WebGLRenderer: .updateShadowMap() has been removed.\")}});\nObject.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.\");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.\");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.\");\nthis.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn(\"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \"+a+\".\");this.renderReverseSided=a}}});Object.defineProperties(Cb.prototype,{wrapS:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.\");return this.texture.wrapS},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.\");\nthis.texture.wrapS=a}},wrapT:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.\");return this.texture.wrapT},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.\");this.texture.wrapT=a}},magFilter:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.\");return this.texture.magFilter},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.\");this.texture.magFilter=\na}},minFilter:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.\");return this.texture.minFilter},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.\");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.\");return this.texture.anisotropy},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.\");this.texture.anisotropy=\na}},offset:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .offset is now .texture.offset.\");return this.texture.offset},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .offset is now .texture.offset.\");this.texture.offset=a}},repeat:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .repeat is now .texture.repeat.\");return this.texture.repeat},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .repeat is now .texture.repeat.\");this.texture.repeat=a}},format:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .format is now .texture.format.\");\nreturn this.texture.format},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .format is now .texture.format.\");this.texture.format=a}},type:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .type is now .texture.type.\");return this.texture.type},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .type is now .texture.type.\");this.texture.type=a}},generateMipmaps:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.\");return this.texture.generateMipmaps},\nset:function(a){console.warn(\"THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.\");this.texture.generateMipmaps=a}}});hc.prototype.load=function(a){console.warn(\"THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.\");var b=this;(new fe).load(a,function(a){b.setBuffer(a)});return this};je.prototype.getData=function(){console.warn(\"THREE.AudioAnalyser: .getData() is now .getFrequencyData().\");return this.getFrequencyData()};l.WebGLRenderTargetCube=Db;l.WebGLRenderTarget=\nCb;l.WebGLRenderer=Xd;l.ShaderLib=$a;l.UniformsLib=R;l.UniformsUtils=Ca;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=ld;l.LensFlare=Yd;l.Sprite=xc;l.LOD=yc;l.SkinnedMesh=nd;l.Skeleton=zc;l.Bone=md;l.Mesh=la;l.LineSegments=Q;l.LineLoop=od;l.Line=sa;l.Points=Kb;l.Group=Ac;l.VideoTexture=pd;l.DataTexture=db;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=qd;l.DepthTexture=Bc;l.Texture=ba;l.CompressedTextureLoader=Oe;l.DataTextureLoader=$d;l.CubeTextureLoader=ae;l.TextureLoader=rd;l.ObjectLoader=\nPe;l.MaterialLoader=Gd;l.BufferGeometryLoader=be;l.DefaultLoadingManager=va;l.LoadingManager=Zd;l.JSONLoader=ce;l.ImageLoader=Sc;l.FontLoader=Re;l.FileLoader=Ka;l.Loader=ec;l.Cache=ed;l.AudioLoader=fe;l.SpotLightShadow=td;l.SpotLight=ud;l.PointLight=vd;l.RectAreaLight=zd;l.HemisphereLight=sd;l.DirectionalLightShadow=wd;l.DirectionalLight=xd;l.AmbientLight=yd;l.LightShadow=tb;l.Light=na;l.StereoCamera=Se;l.PerspectiveCamera=qa;l.OrthographicCamera=Fb;l.CubeCamera=Hd;l.ArrayCamera=kd;l.Camera=Na;l.AudioListener=\nge;l.PositionalAudio=ie;l.AudioContext=he;l.AudioAnalyser=je;l.Audio=hc;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=Dd;l.QuaternionKeyframeTrack=Uc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=Fd;l.BooleanKeyframeTrack=Ed;l.PropertyMixer=ke;l.PropertyBinding=ha;l.KeyframeTrack=vb;l.AnimationUtils=ia;l.AnimationObjectGroup=Ue;l.AnimationMixer=We;l.AnimationClip=Da;l.Uniform=Id;l.InstancedBufferGeometry=le;l.BufferGeometry=E;l.GeometryIdCount=function(){return Rd++};l.Geometry=J;l.InterleavedBufferAttribute=\nme;l.InstancedInterleavedBuffer=ne;l.InterleavedBuffer=ic;l.InstancedBufferAttribute=oe;l.Face3=Sa;l.Object3D=z;l.Raycaster=Xe;l.Layers=Qd;l.EventDispatcher=xa;l.Clock=Ze;l.QuaternionLinearInterpolant=Cd;l.LinearInterpolant=Tc;l.DiscreteInterpolant=Bd;l.CubicInterpolant=Ad;l.Interpolant=wa;l.Triangle=Ta;l.Math=Y;l.Spherical=$e;l.Cylindrical=af;l.Plane=Aa;l.Frustum=gd;l.Sphere=Ea;l.Ray=kb;l.Matrix4=K;l.Matrix3=Ba;l.Box3=Ra;l.Box2=fd;l.Line3=Hb;l.Euler=ab;l.Vector4=fa;l.Vector3=n;l.Vector2=C;l.Quaternion=\noa;l.Color=G;l.MorphBlendMesh=ta;l.ImmediateRenderObject=Xc;l.VertexNormalsHelper=Yc;l.SpotLightHelper=jc;l.SkeletonHelper=kc;l.PointLightHelper=lc;l.RectAreaLightHelper=mc;l.HemisphereLightHelper=nc;l.GridHelper=Zc;l.PolarGridHelper=Jd;l.FaceNormalsHelper=$c;l.DirectionalLightHelper=oc;l.CameraHelper=ad;l.BoxHelper=Ab;l.ArrowHelper=Bb;l.AxisHelper=Ld;l.CatmullRomCurve3=La;l.CubicBezierCurve3=bd;l.QuadraticBezierCurve3=cd;l.LineCurve3=dd;l.ArcCurve=Md;l.EllipseCurve=Va;l.SplineCurve=yb;l.CubicBezierCurve=\nfc;l.QuadraticBezierCurve=gc;l.LineCurve=Qa;l.Shape=zb;l.Path=Wc;l.ShapePath=de;l.Font=ee;l.CurvePath=Vc;l.Curve=ua;l.ShapeUtils=Ia;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Ac,d=0,e=b.length;d<e;d++)c.add(new la(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){a.applyMatrix((new K).getInverse(c.matrixWorld));b.remove(a);c.add(a)}};l.WireframeGeometry=Mb;l.ParametricGeometry=Cc;l.ParametricBufferGeometry=\nNb;l.TetrahedronGeometry=Ec;l.TetrahedronBufferGeometry=Ob;l.OctahedronGeometry=Fc;l.OctahedronBufferGeometry=lb;l.IcosahedronGeometry=Gc;l.IcosahedronBufferGeometry=Pb;l.DodecahedronGeometry=Hc;l.DodecahedronBufferGeometry=Qb;l.PolyhedronGeometry=Dc;l.PolyhedronBufferGeometry=za;l.TubeGeometry=Ic;l.TubeBufferGeometry=Rb;l.TorusKnotGeometry=Jc;l.TorusKnotBufferGeometry=Sb;l.TorusGeometry=Kc;l.TorusBufferGeometry=Tb;l.TextGeometry=Lc;l.TextBufferGeometry=Ub;l.SphereGeometry=Mc;l.SphereBufferGeometry=\nmb;l.RingGeometry=Nc;l.RingBufferGeometry=Vb;l.PlaneGeometry=vc;l.PlaneBufferGeometry=jb;l.LatheGeometry=Oc;l.LatheBufferGeometry=Wb;l.ShapeGeometry=Xb;l.ShapeBufferGeometry=Yb;l.ExtrudeGeometry=cb;l.ExtrudeBufferGeometry=Ga;l.EdgesGeometry=Zb;l.ConeGeometry=Pc;l.ConeBufferGeometry=Qc;l.CylinderGeometry=nb;l.CylinderBufferGeometry=Ua;l.CircleGeometry=Rc;l.CircleBufferGeometry=$b;l.BoxGeometry=Gb;l.BoxBufferGeometry=ib;l.ShadowMaterial=ac;l.SpriteMaterial=bb;l.RawShaderMaterial=bc;l.ShaderMaterial=\nra;l.PointsMaterial=Fa;l.MeshPhysicalMaterial=ob;l.MeshStandardMaterial=Pa;l.MeshPhongMaterial=Ja;l.MeshToonMaterial=pb;l.MeshNormalMaterial=qb;l.MeshLambertMaterial=rb;l.MeshDepthMaterial=Za;l.MeshBasicMaterial=ya;l.LineDashedMaterial=sb;l.LineBasicMaterial=ea;l.Material=U;l.Float64BufferAttribute=uc;l.Float32BufferAttribute=B;l.Uint32BufferAttribute=hb;l.Int32BufferAttribute=tc;l.Uint16BufferAttribute=gb;l.Int16BufferAttribute=sc;l.Uint8ClampedBufferAttribute=rc;l.Uint8BufferAttribute=qc;l.Int8BufferAttribute=\npc;l.BufferAttribute=Z;l.REVISION=\"86\";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=2;l.NoColors=0;l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.AddEquation=\n100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=\n0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.NearestFilter=1003;l.NearestMipMapNearestFilter=\n1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=\n1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=2001;l.RGBA_S3TC_DXT1_Format=2002;l.RGBA_S3TC_DXT3_Format=2003;l.RGBA_S3TC_DXT5_Format=2004;l.RGB_PVRTC_4BPPV1_Format=2100;l.RGB_PVRTC_2BPPV1_Format=2101;l.RGBA_PVRTC_4BPPV1_Format=2102;l.RGBA_PVRTC_2BPPV1_Format=2103;l.RGB_ETC1_Format=2151;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=\n2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=Gb;l.Face4=function(a,b,c,d,e,f,g){console.warn(\"THREE.Face4 has been removed. A THREE.Face3 will be created instead.\");return new Sa(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=\nfunction(a){console.warn(\"THREE.MeshFaceMaterial has been removed. Use an Array instead.\");return a};l.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn(\"THREE.MultiMaterial has been removed. Use an Array instead.\");a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};l.PointCloud=function(a,b){console.warn(\"THREE.PointCloud has been renamed to THREE.Points.\");return new Kb(a,b)};l.Particle=function(a){console.warn(\"THREE.Particle has been renamed to THREE.Sprite.\");\nreturn new xc(a)};l.ParticleSystem=function(a,b){console.warn(\"THREE.ParticleSystem has been renamed to THREE.Points.\");return new Kb(a,b)};l.PointCloudMaterial=function(a){console.warn(\"THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.\");return new Fa(a)};l.ParticleBasicMaterial=function(a){console.warn(\"THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.\");return new Fa(a)};l.ParticleSystemMaterial=function(a){console.warn(\"THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.\");\nreturn new Fa(a)};l.Vertex=function(a,b,c){console.warn(\"THREE.Vertex has been removed. Use THREE.Vector3 instead.\");return new n(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn(\"THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.\");return(new Z(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,b){console.warn(\"THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.\");return new pc(a,b)};l.Uint8Attribute=\nfunction(a,b){console.warn(\"THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.\");return new qc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn(\"THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.\");return new rc(a,b)};l.Int16Attribute=function(a,b){console.warn(\"THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.\");return new sc(a,b)};l.Uint16Attribute=function(a,b){console.warn(\"THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.\");\nreturn new gb(a,b)};l.Int32Attribute=function(a,b){console.warn(\"THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.\");return new tc(a,b)};l.Uint32Attribute=function(a,b){console.warn(\"THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.\");return new hb(a,b)};l.Float32Attribute=function(a,b){console.warn(\"THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.\");return new B(a,b)};l.Float64Attribute=\nfunction(a,b){console.warn(\"THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.\");return new uc(a,b)};l.ClosedSplineCurve3=cf;l.SplineCurve3=df;l.Spline=se;l.BoundingBoxHelper=function(a,b){console.warn(\"THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.\");return new Ab(a,b)};l.EdgesHelper=function(a,b){console.warn(\"THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.\");return new Q(new Zb(a.geometry),new ea({color:void 0!==\nb?b:16777215}))};l.WireframeHelper=function(a,b){console.warn(\"THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.\");return new Q(new Mb(a.geometry),new ea({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn(\"THREE.XHRLoader has been renamed to THREE.FileLoader.\");return new Ka(a)};l.BinaryTextureLoader=function(a){console.warn(\"THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.\");return new $d(a)};l.GeometryUtils={merge:function(a,b,\nc){console.warn(\"THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.\");var d;b.isMesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn(\"THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.\");return a.center()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn(\"THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.\");\nvar e=new rd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn(\"THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.\");var e=new ae;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error(\"THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.\")},loadCompressedTextureCube:function(){console.error(\"THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.\")}};\nl.Projector=function(){console.error(\"THREE.Projector has been moved to /examples/js/renderers/Projector.js.\");this.projectVector=function(a,b){console.warn(\"THREE.Projector: .projectVector() is now vector.project().\");a.project(b)};this.unprojectVector=function(a,b){console.warn(\"THREE.Projector: .unprojectVector() is now vector.unproject().\");a.unproject(b)};this.pickingRay=function(){console.error(\"THREE.Projector: .pickingRay() is now raycaster.setFromCamera().\")}};l.CanvasRenderer=function(){console.error(\"THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js\");\nthis.domElement=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(l,\"__esModule\",{value:!0})});\n",
+    "// threejs.org/license\n(function(m,ja){\"object\"===typeof exports&&\"undefined\"!==typeof module?ja(exports):\"function\"===typeof define&&define.amd?define([\"exports\"],ja):ja(m.THREE=m.THREE||{})})(this,function(m){function ja(){}function C(a,b){this.x=a||0;this.y=b||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error(\"THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.\")}function Z(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}\nfunction p(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function ra(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error(\"THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.\")}function ea(a,b,c,d,e,f,g,h,k,l){Object.defineProperty(this,\"id\",{value:kf++});this.uuid=R.generateUUID();this.name=\"\";this.image=void 0!==a?a:ea.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ea.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=\nvoid 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.center=new C(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ra;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==l?l:3E3;this.version=0;this.onUpdate=null}function da(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Hb(a,\nb,c){this.uuid=R.generateUUID();this.width=a;this.height=b;this.scissor=new da(0,0,a,b);this.scissorTest=!1;this.viewport=new da(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ea(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Ib(a,b,c){Hb.call(this,\na,b,c);this.activeMipMapLevel=this.activeCubeFace=0}function fb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==l?l:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Ua(a,b,c,d,e,f,g,h,k,l){a=void 0!==a?a:[];ea.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,l);this.flipY=!1}function Jb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=we[e];void 0===f&&(f=new Float32Array(e),\nwe[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function xe(a,b){var c=ye[b];void 0===c&&(c=new Int32Array(b),ye[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function lf(a,b){a.uniform1f(this.addr,b)}function mf(a,b){a.uniform1i(this.addr,b)}function nf(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function of(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,\nb)}function pf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function qf(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function rf(a,b){void 0===b.elements?a.uniformMatrix3fv(this.addr,!1,b):(ze.set(b.elements),a.uniformMatrix3fv(this.addr,!1,ze))}function sf(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Ae.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Ae))}function tf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||\nBe,d)}function uf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||Ce,d)}function De(a,b){a.uniform2iv(this.addr,b)}function Ee(a,b){a.uniform3iv(this.addr,b)}function Fe(a,b){a.uniform4iv(this.addr,b)}function vf(a){switch(a){case 5126:return lf;case 35664:return nf;case 35665:return of;case 35666:return pf;case 35674:return qf;case 35675:return rf;case 35676:return sf;case 35678:case 36198:return tf;case 35680:return uf;case 5124:case 35670:return mf;case 35667:case 35671:return De;\ncase 35668:case 35672:return Ee;case 35669:case 35673:return Fe}}function wf(a,b){a.uniform1fv(this.addr,b)}function xf(a,b){a.uniform1iv(this.addr,b)}function yf(a,b){a.uniform2fv(this.addr,Jb(b,this.size,2))}function zf(a,b){a.uniform3fv(this.addr,Jb(b,this.size,3))}function Af(a,b){a.uniform4fv(this.addr,Jb(b,this.size,4))}function Bf(a,b){a.uniformMatrix2fv(this.addr,!1,Jb(b,this.size,4))}function Cf(a,b){a.uniformMatrix3fv(this.addr,!1,Jb(b,this.size,9))}function Df(a,b){a.uniformMatrix4fv(this.addr,\n!1,Jb(b,this.size,16))}function Ef(a,b,c){var d=b.length,e=xe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||Be,e[a])}function Ff(a,b,c){var d=b.length,e=xe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||Ce,e[a])}function Gf(a){switch(a){case 5126:return wf;case 35664:return yf;case 35665:return zf;case 35666:return Af;case 35674:return Bf;case 35675:return Cf;case 35676:return Df;case 35678:return Ef;case 35680:return Ff;case 5124:case 35670:return xf;\ncase 35667:case 35671:return De;case 35668:case 35672:return Ee;case 35669:case 35673:return Fe}}function Hf(a,b,c){this.id=a;this.addr=c;this.setValue=vf(b.type)}function If(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Gf(b.type)}function Ge(a){this.id=a;this.seq=[];this.map={}}function gb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=\nh.length;for(Od.lastIndex=0;;){var l=Od.exec(h),q=Od.lastIndex,n=l[1],t=l[3];\"]\"===l[2]&&(n|=0);if(void 0===t||\"[\"===t&&q+2===k){h=g;e=void 0===t?new Hf(n,e,f):new If(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else t=g.map[n],void 0===t&&(t=new Ge(n),n=g,g=t,n.seq.push(g),n.map[g.id]=g),g=t}}}function H(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function kd(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function Jf(a,b,c,\nd,e){var f,g,h,k,l,q,n,t,r,m,v,w,x,z,I,B;this.render=function(a,u,za,la){if(0!==a.length){u=new p;var J=la.w/la.z,ta=.5*la.z,Va=.5*la.w,L=16/la.w,Y=new C(L*J,L),ua=new p(1,1,0),M=new C(1,1),V=new kd;V.min.set(la.x,la.y);V.max.set(la.x+(la.z-16),la.y+(la.w-16));if(void 0===z){var L=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),y=new Uint16Array([0,1,2,0,2,3]);v=b.createBuffer();w=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,v);b.bufferData(b.ARRAY_BUFFER,L,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,\nw);b.bufferData(b.ELEMENT_ARRAY_BUFFER,y,b.STATIC_DRAW);I=b.createTexture();B=b.createTexture();c.bindTexture(b.TEXTURE_2D,I);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);c.bindTexture(b.TEXTURE_2D,B);b.texImage2D(b.TEXTURE_2D,0,\nb.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);var L=x={vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\n\\tvUV = uv;\\n\\tvec2 pos = position;\\n\\tif ( renderType == 2 ) {\\n\\t\\tvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\\n\\t\\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\n\\t\\tvVisibility =        visibility.r / 9.0;\\n\\t\\tvVisibility *= 1.0 - visibility.g / 9.0;\\n\\t\\tvVisibility *=       visibility.b / 9.0;\\n\\t\\tvVisibility *= 1.0 - visibility.a / 9.0;\\n\\t\\tpos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\n\\t\\tpos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n\\t}\\n\\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",\nfragmentShader:\"uniform lowp int renderType;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\n\\tif ( renderType == 0 ) {\\n\\t\\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n\\t} else if ( renderType == 1 ) {\\n\\t\\tgl_FragColor = texture2D( map, vUV );\\n\\t} else {\\n\\t\\tvec4 texture = texture2D( map, vUV );\\n\\t\\ttexture.a *= opacity * vVisibility;\\n\\t\\tgl_FragColor = texture;\\n\\t\\tgl_FragColor.rgb *= color;\\n\\t}\\n}\"},y=b.createProgram(),\nA=b.createShader(b.FRAGMENT_SHADER),aa=b.createShader(b.VERTEX_SHADER),D=\"precision \"+e.precision+\" float;\\n\";b.shaderSource(A,D+L.fragmentShader);b.shaderSource(aa,D+L.vertexShader);b.compileShader(A);b.compileShader(aa);b.attachShader(y,A);b.attachShader(y,aa);b.linkProgram(y);z=y;r=b.getAttribLocation(z,\"position\");m=b.getAttribLocation(z,\"uv\");f=b.getUniformLocation(z,\"renderType\");g=b.getUniformLocation(z,\"map\");h=b.getUniformLocation(z,\"occlusionMap\");k=b.getUniformLocation(z,\"opacity\");l=b.getUniformLocation(z,\n\"color\");q=b.getUniformLocation(z,\"scale\");n=b.getUniformLocation(z,\"rotation\");t=b.getUniformLocation(z,\"screenPosition\")}c.useProgram(z);c.initAttributes();c.enableAttribute(r);c.enableAttribute(m);c.disableUnusedAttributes();b.uniform1i(h,0);b.uniform1i(g,1);b.bindBuffer(b.ARRAY_BUFFER,v);b.vertexAttribPointer(r,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(m,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,w);c.disable(b.CULL_FACE);c.buffers.depth.setMask(!1);y=0;for(A=a.length;y<A;y++)if(L=\n16/la.w,Y.set(L*J,L),aa=a[y],u.set(aa.matrixWorld.elements[12],aa.matrixWorld.elements[13],aa.matrixWorld.elements[14]),u.applyMatrix4(za.matrixWorldInverse),u.applyMatrix4(za.projectionMatrix),ua.copy(u),M.x=la.x+ua.x*ta+ta-8,M.y=la.y+ua.y*Va+Va-8,!0===V.containsPoint(M)){c.activeTexture(b.TEXTURE0);c.bindTexture(b.TEXTURE_2D,null);c.activeTexture(b.TEXTURE1);c.bindTexture(b.TEXTURE_2D,I);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,M.x,M.y,16,16,0);b.uniform1i(f,0);b.uniform2f(q,Y.x,Y.y);b.uniform3f(t,\nua.x,ua.y,ua.z);c.disable(b.BLEND);c.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);c.activeTexture(b.TEXTURE0);c.bindTexture(b.TEXTURE_2D,B);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,M.x,M.y,16,16,0);b.uniform1i(f,1);c.disable(b.DEPTH_TEST);c.activeTexture(b.TEXTURE1);c.bindTexture(b.TEXTURE_2D,I);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);aa.positionScreen.copy(ua);aa.customUpdateCallback?aa.customUpdateCallback(aa):aa.updateLensFlares();b.uniform1i(f,2);c.enable(b.BLEND);\nfor(var D=0,H=aa.lensFlares.length;D<H;D++){var E=aa.lensFlares[D];.001<E.opacity&&.001<E.scale&&(ua.x=E.x,ua.y=E.y,ua.z=E.z,L=E.size*E.scale/la.w,Y.x=L*J,Y.y=L,b.uniform3f(t,ua.x,ua.y,ua.z),b.uniform2f(q,Y.x,Y.y),b.uniform1f(n,E.rotation),b.uniform1f(k,E.opacity),b.uniform3f(l,E.color.r,E.color.g,E.color.b),c.setBlending(E.blending,E.blendEquation,E.blendSrc,E.blendDst),d.setTexture2D(E.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0))}}c.enable(b.CULL_FACE);c.enable(b.DEPTH_TEST);c.buffers.depth.setMask(!0);\nc.reset()}}}function tc(a,b,c,d,e,f,g,h,k){ea.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Kf(a,b,c,d,e){var f,g,h,k,l,q,n,t,r,m,v,w,x,z,I,B,J;function ta(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var za,la,ha,He,Va=new p,L=new Z,C=new p;this.render=function(u,p,V){if(0!==u.length){if(void 0===ha){var M=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),y=new Uint16Array([0,1,2,0,2,3]);za=b.createBuffer();la=b.createBuffer();\nb.bindBuffer(b.ARRAY_BUFFER,za);b.bufferData(b.ARRAY_BUFFER,M,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.bufferData(b.ELEMENT_ARRAY_BUFFER,y,b.STATIC_DRAW);M=b.createProgram();y=b.createShader(b.VERTEX_SHADER);var Y=b.createShader(b.FRAGMENT_SHADER);b.shaderSource(y,[\"precision \"+e.precision+\" float;\",\"#define SHADER_NAME SpriteMaterial\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float fogDepth;\\nvoid main() {\\n\\tvUV = uvOffset + uv * uvScale;\\n\\tvec2 alignedPosition = position * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tvec4 mvPosition;\\n\\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\tfogDepth = - mvPosition.z;\\n}\"].join(\"\\n\"));\nb.shaderSource(Y,[\"precision \"+e.precision+\" float;\",\"#define SHADER_NAME SpriteMaterial\\nuniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int fogType;\\nuniform vec3 fogColor;\\nuniform float fogDensity;\\nuniform float fogNear;\\nuniform float fogFar;\\nuniform float alphaTest;\\nvarying vec2 vUV;\\nvarying float fogDepth;\\nvoid main() {\\n\\tvec4 texture = texture2D( map, vUV );\\n\\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\n\\tif ( gl_FragColor.a < alphaTest ) discard;\\n\\tif ( fogType > 0 ) {\\n\\t\\tfloat fogFactor = 0.0;\\n\\t\\tif ( fogType == 1 ) {\\n\\t\\t\\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t\\t} else {\\n\\t\\t\\tconst float LOG2 = 1.442695;\\n\\t\\t\\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\\n\\t\\t\\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n\\t\\t}\\n\\t\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n\\t}\\n}\"].join(\"\\n\"));\nb.compileShader(y);b.compileShader(Y);b.attachShader(M,y);b.attachShader(M,Y);b.linkProgram(M);ha=M;B=b.getAttribLocation(ha,\"position\");J=b.getAttribLocation(ha,\"uv\");f=b.getUniformLocation(ha,\"uvOffset\");g=b.getUniformLocation(ha,\"uvScale\");h=b.getUniformLocation(ha,\"rotation\");k=b.getUniformLocation(ha,\"scale\");l=b.getUniformLocation(ha,\"color\");q=b.getUniformLocation(ha,\"map\");n=b.getUniformLocation(ha,\"opacity\");t=b.getUniformLocation(ha,\"modelViewMatrix\");r=b.getUniformLocation(ha,\"projectionMatrix\");\nm=b.getUniformLocation(ha,\"fogType\");v=b.getUniformLocation(ha,\"fogDensity\");w=b.getUniformLocation(ha,\"fogNear\");x=b.getUniformLocation(ha,\"fogFar\");z=b.getUniformLocation(ha,\"fogColor\");b.getUniformLocation(ha,\"fogDepth\");I=b.getUniformLocation(ha,\"alphaTest\");M=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");M.width=8;M.height=8;y=M.getContext(\"2d\");y.fillStyle=\"white\";y.fillRect(0,0,8,8);He=new tc(M)}c.useProgram(ha);c.initAttributes();c.enableAttribute(B);c.enableAttribute(J);\nc.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,za);b.vertexAttribPointer(B,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(J,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.uniformMatrix4fv(r,!1,V.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(q,0);y=M=0;(Y=p.fog)?(b.uniform3f(z,Y.color.r,Y.color.g,Y.color.b),Y.isFog?(b.uniform1f(w,Y.near),b.uniform1f(x,Y.far),b.uniform1i(m,1),y=M=1):Y.isFogExp2&&(b.uniform1f(v,Y.density),\nb.uniform1i(m,2),y=M=2)):(b.uniform1i(m,0),y=M=0);for(var A=0,ua=u.length;A<ua;A++)Y=u[A],Y.modelViewMatrix.multiplyMatrices(V.matrixWorldInverse,Y.matrixWorld),Y.z=-Y.modelViewMatrix.elements[14];u.sort(ta);for(var E=[],A=0,ua=u.length;A<ua;A++){Y=u[A];var G=Y.material;if(!1!==G.visible){Y.onBeforeRender(a,p,V,void 0,G,void 0);b.uniform1f(I,G.alphaTest);b.uniformMatrix4fv(t,!1,Y.modelViewMatrix.elements);Y.matrixWorld.decompose(Va,L,C);E[0]=C.x;E[1]=C.y;var D=0;p.fog&&G.fog&&(D=y);M!==D&&(b.uniform1i(m,\nD),M=D);null!==G.map?(b.uniform2f(f,G.map.offset.x,G.map.offset.y),b.uniform2f(g,G.map.repeat.x,G.map.repeat.y)):(b.uniform2f(f,0,0),b.uniform2f(g,1,1));b.uniform1f(n,G.opacity);b.uniform3f(l,G.color.r,G.color.g,G.color.b);b.uniform1f(h,G.rotation);b.uniform2fv(k,E);c.setBlending(G.blending,G.blendEquation,G.blendSrc,G.blendDst,G.blendEquationAlpha,G.blendSrcAlpha,G.blendDstAlpha,G.premultipliedAlpha);c.buffers.depth.setTest(G.depthTest);c.buffers.depth.setMask(G.depthWrite);c.buffers.color.setMask(G.colorWrite);\nd.setTexture2D(G.map||He,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);Y.onAfterRender(a,p,V,void 0,G,void 0)}}c.enable(b.CULL_FACE);c.reset()}}}function Q(){Object.defineProperty(this,\"id\",{value:Lf++});this.uuid=R.generateUUID();this.name=\"\";this.type=\"Material\";this.lights=this.fog=!0;this.blending=1;this.side=0;this.flatShading=!1;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=\nnull;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.visible=!0;this.userData={};this.needsUpdate=!0}function Wa(a){Q.call(this);this.type=\"MeshDepthMaterial\";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=\nthis.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Xa(a){Q.call(this);this.type=\"MeshDistanceMaterial\";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Oa(a,b){this.min=void 0!==\na?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new p(-Infinity,-Infinity,-Infinity)}function Da(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:0}function Aa(a,b){this.normal=void 0!==a?a:new p(1,0,0);this.constant=void 0!==b?b:0}function ld(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Aa,void 0!==b?b:new Aa,void 0!==c?c:new Aa,void 0!==d?d:new Aa,void 0!==e?e:new Aa,void 0!==f?f:new Aa]}function Ie(a,b,c){function d(b,c,d,e,f,g){var h=b.geometry;var k=n;var l=b.customDepthMaterial;\nd&&(k=t,l=b.customDistanceMaterial);l?k=l:(l=!1,c.morphTargets&&(h&&h.isBufferGeometry?l=h.morphAttributes&&h.morphAttributes.position&&0<h.morphAttributes.position.length:h&&h.isGeometry&&(l=h.morphTargets&&0<h.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn(\"THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:\",b),b=b.isSkinnedMesh&&c.skinning,h=0,l&&(h|=1),b&&(h|=2),k=k[h]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(h=\nk.uuid,l=c.uuid,b=r[h],void 0===b&&(b={},r[h]=b),h=b[l],void 0===h&&(h=k.clone(),b[l]=h),k=h);k.visible=c.visible;k.wireframe=c.wireframe;l=c.side;B.renderSingleSided&&2==l&&(l=0);B.renderReverseSided&&(0===l?l=1:1===l&&(l=0));k.side=l;k.clipShadows=c.clipShadows;k.clippingPlanes=c.clippingPlanes;k.clipIntersection=c.clipIntersection;k.wireframeLinewidth=c.wireframeLinewidth;k.linewidth=c.linewidth;d&&k.isMeshDistanceMaterial&&(k.referencePosition.copy(e),k.nearDistance=f,k.farDistance=g);return k}\nfunction e(c,g,h,k){var l;if(!1!==c.visible){if(c.layers.test(g.layers)&&(c.isMesh||c.isLine||c.isPoints)&&c.castShadow&&(!c.frustumCulled||f.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(h.matrixWorldInverse,c.matrixWorld);var n=b.update(c),t=c.material;if(Array.isArray(t))for(var r=n.groups,m=0,z=r.length;m<z;m++){var u=r[m];(l=t[u.materialIndex])&&l.visible&&(l=d(c,l,k,q,h.near,h.far),a.renderBufferDirect(h,null,n,l,c,u))}else t.visible&&(l=d(c,t,k,q,h.near,h.far),a.renderBufferDirect(h,\nnull,n,l,c,null))}c=c.children;n=0;for(t=c.length;n<t;n++)e(c[n],g,h,k)}}var f=new ld,g=new K,h=new C,k=new C(c,c),l=new p,q=new p,n=Array(4),t=Array(4),r={},m=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)],v=[new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)],w=[new da,new da,new da,new da,new da,new da];for(c=0;4!==c;++c){var x=0!==(c&1),z=0!==(c&2),I=new Wa({depthPacking:3201,morphTargets:x,skinning:z});n[c]=I;x=new Xa({morphTargets:x,\nskinning:z});t[c]=x}var B=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,c,d){if(!1!==B.enabled&&(!1!==B.autoUpdate||!1!==B.needsUpdate)&&0!==b.length){var n=a.state;n.disable(a.context.BLEND);n.buffers.color.setClear(1,1,1,1);n.buffers.depth.setTest(!0);n.setScissorTest(!1);for(var t,r=0,z=b.length;r<z;r++){var u=b[r];t=u.shadow;var I=u&&u.isPointLight;if(void 0===t)console.warn(\"THREE.WebGLShadowMap:\",\nu,\"has no shadow.\");else{var p=t.camera;h.copy(t.mapSize);h.min(k);if(I){var x=h.x,J=h.y;w[0].set(2*x,J,x,J);w[1].set(0,J,x,J);w[2].set(3*x,J,x,J);w[3].set(x,J,x,J);w[4].set(3*x,0,x,J);w[5].set(x,0,x,J);h.x*=4;h.y*=2}null===t.map&&(t.map=new Hb(h.x,h.y,{minFilter:1003,magFilter:1003,format:1023}),t.map.texture.name=u.name+\".shadowMap\",p.updateProjectionMatrix());t.isSpotLightShadow&&t.update(u);x=t.map;J=t.matrix;q.setFromMatrixPosition(u.matrixWorld);p.position.copy(q);I?(t=6,J.makeTranslation(-q.x,\n-q.y,-q.z)):(t=1,l.setFromMatrixPosition(u.target.matrixWorld),p.lookAt(l),p.updateMatrixWorld(),J.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),J.multiply(p.projectionMatrix),J.multiply(p.matrixWorldInverse));a.setRenderTarget(x);a.clear();for(u=0;u<t;u++)I&&(l.copy(p.position),l.add(m[u]),p.up.copy(v[u]),p.lookAt(l),p.updateMatrixWorld(),n.viewport(w[u])),g.multiplyMatrices(p.projectionMatrix,p.matrixWorldInverse),f.setFromMatrix(g),e(c,d,p,I)}}B.needsUpdate=!1}}}function Mf(a){var b={};return{get:function(a){a.isInterleavedBufferAttribute&&\n(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){var e=c.uuid,f=c.array,g=c.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW,h=a.createBuffer();a.bindBuffer(d,h);a.bufferData(d,f,g);c.onUploadCallback();d=a.FLOAT;f instanceof Float32Array?d=a.FLOAT:f instanceof Float64Array?console.warn(\"THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.\"):\nf instanceof Uint16Array?d=a.UNSIGNED_SHORT:f instanceof Int16Array?d=a.SHORT:f instanceof Uint32Array?d=a.UNSIGNED_INT:f instanceof Int32Array?d=a.INT:f instanceof Int8Array?d=a.BYTE:f instanceof Uint8Array&&(d=a.UNSIGNED_BYTE);b[e]={buffer:h,type:d,bytesPerElement:f.BYTES_PER_ELEMENT,version:c.version}}else e.version<c.version&&(f=c,h=f.array,g=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic?a.bufferData(d,h,a.STATIC_DRAW):-1===g.count?a.bufferSubData(d,0,h):0===g.count?console.error(\"THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.\"):\n(a.bufferSubData(d,g.offset*h.BYTES_PER_ELEMENT,h.subarray(g.offset,g.offset+g.count)),g.count=-1),e.version=c.version)}}}function Ya(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Ya.DefaultOrder}function Pd(){this.mask=1}function A(){Object.defineProperty(this,\"id\",{value:Nf++});this.uuid=R.generateUUID();this.name=\"\";this.type=\"Object3D\";this.parent=null;this.children=[];this.up=A.DefaultUp.clone();var a=new p,b=new Ya,c=new Z,d=new p(1,1,1);b.onChange(function(){c.setFromEuler(b,\n!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new K},normalMatrix:{value:new ra}});this.matrix=new K;this.matrixWorld=new K;this.matrixAutoUpdate=A.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Pd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=\n0;this.userData={}}function La(){A.call(this);this.type=\"Camera\";this.matrixWorldInverse=new K;this.projectionMatrix=new K}function Kb(a,b,c,d,e,f){La.call(this);this.type=\"OrthographicCamera\";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function Pa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?\ne:new H;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function N(){Object.defineProperty(this,\"id\",{value:Of+=2});this.uuid=R.generateUUID();this.name=\"\";this.type=\"Geometry\";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=\nthis.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function P(a,b,c){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.uuid=R.generateUUID();this.name=\"\";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function uc(a,b,c){P.call(this,new Int8Array(a),b,c)}function vc(a,b,c){P.call(this,new Uint8Array(a),\nb,c)}function wc(a,b,c){P.call(this,new Uint8ClampedArray(a),b,c)}function xc(a,b,c){P.call(this,new Int16Array(a),b,c)}function hb(a,b,c){P.call(this,new Uint16Array(a),b,c)}function yc(a,b,c){P.call(this,new Int32Array(a),b,c)}function ib(a,b,c){P.call(this,new Uint32Array(a),b,c)}function y(a,b,c){P.call(this,new Float32Array(a),b,c)}function zc(a,b,c){P.call(this,new Float64Array(a),b,c)}function Je(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=\n[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Qd(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function D(){Object.defineProperty(this,\"id\",{value:Pf+=2});this.uuid=R.generateUUID();this.name=\"\";this.type=\"BufferGeometry\";this.index=null;this.attributes={};this.morphAttributes=\n{};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Lb(a,b,c,d,e,f){N.call(this);this.type=\"BoxGeometry\";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new jb(a,b,c,d,e,f));this.mergeVertices()}function jb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,m,ta,za,la){var z=f/ta,u=g/za,v=f/2,w=g/2,I=m/2;g=ta+1;var B=za+1,x=f=0,J,y,C=new p;for(y=0;y<B;y++){var A=y*u-w;for(J=0;J<g;J++)C[a]=\n(J*z-v)*d,C[b]=A*e,C[c]=I,l.push(C.x,C.y,C.z),C[a]=0,C[b]=0,C[c]=0<m?1:-1,q.push(C.x,C.y,C.z),n.push(J/ta),n.push(1-y/za),f+=1}for(y=0;y<za;y++)for(J=0;J<ta;J++)a=t+J+g*(y+1),b=t+(J+1)+g*(y+1),c=t+(J+1)+g*y,k.push(t+J+g*y,a,c),k.push(a,b,c),x+=6;h.addGroup(r,x,la);r+=x;t+=f}D.call(this);this.type=\"BoxBufferGeometry\";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;a=a||1;b=b||1;c=c||1;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=\n[],l=[],q=[],n=[],t=0,r=0;g(\"z\",\"y\",\"x\",-1,-1,c,b,a,f,e,0);g(\"z\",\"y\",\"x\",1,-1,c,b,-a,f,e,1);g(\"x\",\"z\",\"y\",1,1,a,c,b,d,f,2);g(\"x\",\"z\",\"y\",1,-1,a,c,-b,d,f,3);g(\"x\",\"y\",\"z\",1,-1,a,b,c,d,e,4);g(\"x\",\"y\",\"z\",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute(\"position\",new y(l,3));this.addAttribute(\"normal\",new y(q,3));this.addAttribute(\"uv\",new y(n,2))}function Ac(a,b,c,d){N.call(this);this.type=\"PlaneGeometry\";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new kb(a,\nb,c,d));this.mergeVertices()}function kb(a,b,c,d){D.call(this);this.type=\"PlaneBufferGeometry\";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,l=b/d,q=[],n=[],t=[],r=[];for(a=0;a<h;a++){var m=a*l-f;for(b=0;b<g;b++)n.push(b*k-e,-m,0),t.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute(\"position\",\nnew y(n,3));this.addAttribute(\"normal\",new y(t,3));this.addAttribute(\"uv\",new y(r,2))}function va(a){Q.call(this);this.type=\"MeshBasicMaterial\";this.color=new H(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.lights=this.morphTargets=this.skinning=\n!1;this.setValues(a)}function oa(a){Q.call(this);this.type=\"ShaderMaterial\";this.defines={};this.uniforms={};this.vertexShader=\"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";this.fragmentShader=\"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,\ndrawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error(\"THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.\"),this.setValues(a))}function lb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p}function Mb(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function Qa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==\nb?b:new p;this.c=void 0!==c?c:new p}function pa(a,b){A.call(this);this.type=\"Mesh\";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new va({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Qf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new H(0),g=0,h,k,l;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,\ng)},render:function(b,d,t,r){d=d.background;null===d?e(f,g):d&&d.isColor&&(e(d,1),r=!0);(a.autoClear||r)&&a.clear(a.autoClearColor,a.autoClearDepth,a.autoClearStencil);d&&d.isCubeTexture?(void 0===l&&(l=new pa(new jb(1,1,1),new oa({uniforms:mb.cube.uniforms,vertexShader:mb.cube.vertexShader,fragmentShader:mb.cube.fragmentShader,side:1,depthTest:!0,depthWrite:!1,fog:!1})),l.geometry.removeAttribute(\"normal\"),l.geometry.removeAttribute(\"uv\"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},\nc.update(l.geometry)),l.material.uniforms.tCube.value=d,b.push(l,l.geometry,l.material,0,null)):d&&d.isTexture&&(void 0===h&&(h=new Kb(-1,1,1,-1,0,1),k=new pa(new kb(2,2),new va({depthTest:!1,depthWrite:!1,fog:!1})),c.update(k.geometry)),k.material.map=d,a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Rf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-\nb.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Sf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Tf(){var a=[],b=0,c=[],d=[];return{opaque:c,transparent:d,init:function(){b=0;c.length=0;d.length=0},push:function(e,f,g,h,k){var l=a[b];void 0===l?(l={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},a[b]=l):(l.id=e.id,l.object=e,l.geometry=f,l.material=g,l.program=g.program,l.renderOrder=e.renderOrder,\nl.z=h,l.group=k);(!0===g.transparent?d:c).push(l);b++},sort:function(){1<c.length&&c.sort(Rf);1<d.length&&d.sort(Sf)}}}function Uf(){var a={};return{get:function(b,c){b=b.id+\",\"+c.id;c=a[b];void 0===c&&(c=new Tf,a[b]=c);return c},dispose:function(){a={}}}}function Vf(a,b){return Math.abs(b[1])-Math.abs(a[1])}function Wf(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,k=h.length;d=b[e.id];if(void 0===d){d=[];for(var l=0;l<k;l++)d[l]=[l,0];b[e.id]=d}var q=\nf.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(l=0;l<k;l++){var n=d[l];0!==n[1]&&(q&&e.removeAttribute(\"morphTarget\"+l),f&&e.removeAttribute(\"morphNormal\"+l))}for(l=0;l<k;l++)n=d[l],n[0]=l,n[1]=h[l];d.sort(Vf);for(l=0;8>l;l++){if(n=d[l])if(h=n[0],n=n[1]){q&&e.addAttribute(\"morphTarget\"+l,q[h]);f&&e.addAttribute(\"morphNormal\"+l,f[h]);c[l]=n;continue}c[l]=0}g.getUniforms().setValue(a,\"morphTargetInfluences\",c)}}}function Xf(a,b,c){var d,e,f;this.setMode=function(a){d=\na};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES?c.faces+=h/3:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var l=b.get(\"ANGLE_instanced_arrays\");null===l?console.error(\"THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\"):(l.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=\nk*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function Yf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES?c.faces+=f/3:d===a.POINTS&&(c.points+=f)};this.renderInstances=function(e,f,g){var h=b.get(\"ANGLE_instanced_arrays\");if(null===h)console.error(\"THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");\nelse{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES?c.faces+=e.maxInstancedCount*g/3:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function Zf(a,b,c){function d(a){a=a.target;var g=e[a.id];null!==g.index&&b.remove(g.index);for(var k in g.attributes)b.remove(g.attributes[k]);a.removeEventListener(\"dispose\",\nd);delete e[a.id];if(k=f[a.id])b.remove(k),delete f[a.id];if(k=f[g.id])b.remove(k),delete f[g.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener(\"dispose\",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new D).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],\na.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=c[f],e=0,g=d.length;e<g;e++)b.update(d[e],a.ARRAY_BUFFER)},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;d=[];var e=c.index;var g=c.attributes;if(null!==e){var q=e.array;for(var n=0,t=q.length;n<t;n+=3){var r=q[n+0];g=q[n+1];e=q[n+2];d.push(r,g,g,e,e,r)}}else for(q=g.position.array,n=0,t=q.length/3-1;n<t;n+=3)r=n+0,g=n+1,e=n+2,d.push(r,g,g,e,e,r);d=new (65535<Qd(d)?ib:hb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=\nd}}}function $f(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case \"DirectionalLight\":var c={direction:new p,color:new H,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case \"SpotLight\":c={position:new p,direction:new p,color:new H,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case \"PointLight\":c={position:new p,color:new H,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C,\nshadowCameraNear:1,shadowCameraFar:1E3};break;case \"HemisphereLight\":c={direction:new p,skyColor:new H,groundColor:new H};break;case \"RectAreaLight\":c={color:new H,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function ag(){var a=new $f,b={hash:\"\",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},c=new p,d=new K,e=new K;return{setup:function(f,\ng,h){for(var k,l=0,q=0,n=0,t=0,r=0,m=0,v=0,w=0,p=h.matrixWorldInverse,z=0,I=f.length;z<I;z++){var B=f[z];k=B.color;var J=B.intensity,ta=B.distance,za=B.shadow&&B.shadow.map?B.shadow.map.texture:null;if(B.isAmbientLight)l+=k.r*J,q+=k.g*J,n+=k.b*J;else if(B.isDirectionalLight){h=a.get(B);h.color.copy(B.color).multiplyScalar(B.intensity);h.direction.setFromMatrixPosition(B.matrixWorld);c.setFromMatrixPosition(B.target.matrixWorld);h.direction.sub(c);h.direction.transformDirection(p);if(h.shadow=B.castShadow)k=\nB.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize;b.directionalShadowMap[t]=za;b.directionalShadowMatrix[t]=B.shadow.matrix;b.directional[t]=h;t++}else if(B.isSpotLight){h=a.get(B);h.position.setFromMatrixPosition(B.matrixWorld);h.position.applyMatrix4(p);h.color.copy(k).multiplyScalar(J);h.distance=ta;h.direction.setFromMatrixPosition(B.matrixWorld);c.setFromMatrixPosition(B.target.matrixWorld);h.direction.sub(c);h.direction.transformDirection(p);h.coneCos=Math.cos(B.angle);\nh.penumbraCos=Math.cos(B.angle*(1-B.penumbra));h.decay=0===B.distance?0:B.decay;if(h.shadow=B.castShadow)k=B.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize;b.spotShadowMap[m]=za;b.spotShadowMatrix[m]=B.shadow.matrix;b.spot[m]=h;m++}else if(B.isRectAreaLight)h=a.get(B),h.color.copy(k).multiplyScalar(J/(B.width*B.height)),h.position.setFromMatrixPosition(B.matrixWorld),h.position.applyMatrix4(p),e.identity(),d.copy(B.matrixWorld),d.premultiply(p),e.extractRotation(d),h.halfWidth.set(.5*\nB.width,0,0),h.halfHeight.set(0,.5*B.height,0),h.halfWidth.applyMatrix4(e),h.halfHeight.applyMatrix4(e),b.rectArea[v]=h,v++;else if(B.isPointLight){h=a.get(B);h.position.setFromMatrixPosition(B.matrixWorld);h.position.applyMatrix4(p);h.color.copy(B.color).multiplyScalar(B.intensity);h.distance=B.distance;h.decay=0===B.distance?0:B.decay;if(h.shadow=B.castShadow)k=B.shadow,h.shadowBias=k.bias,h.shadowRadius=k.radius,h.shadowMapSize=k.mapSize,h.shadowCameraNear=k.camera.near,h.shadowCameraFar=k.camera.far;\nb.pointShadowMap[r]=za;b.pointShadowMatrix[r]=B.shadow.matrix;b.point[r]=h;r++}else B.isHemisphereLight&&(h=a.get(B),h.direction.setFromMatrixPosition(B.matrixWorld),h.direction.transformDirection(p),h.direction.normalize(),h.skyColor.copy(B.color).multiplyScalar(J),h.groundColor.copy(B.groundColor).multiplyScalar(J),b.hemi[w]=h,w++)}b.ambient[0]=l;b.ambient[1]=q;b.ambient[2]=n;b.directional.length=t;b.spot.length=m;b.rectArea.length=v;b.point.length=r;b.hemi.length=w;b.hash=t+\",\"+r+\",\"+m+\",\"+v+\",\"+\nw+\",\"+g.length},state:b}}function bg(a,b){var c={};return{update:function(d){var e=b.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},clear:function(){c={}}}}function cg(a){a=a.split(\"\\n\");for(var b=0;b<a.length;b++)a[b]=b+1+\": \"+a[b];return a.join(\"\\n\")}function Ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error(\"THREE.WebGLShader: Shader couldn't compile.\");\n\"\"!==a.getShaderInfoLog(d)&&console.warn(\"THREE.WebGLShader: gl.getShaderInfoLog()\",b===a.VERTEX_SHADER?\"vertex\":\"fragment\",a.getShaderInfoLog(d),cg(c));return d}function Le(a){switch(a){case 3E3:return[\"Linear\",\"( value )\"];case 3001:return[\"sRGB\",\"( value )\"];case 3002:return[\"RGBE\",\"( value )\"];case 3004:return[\"RGBM\",\"( value, 7.0 )\"];case 3005:return[\"RGBM\",\"( value, 16.0 )\"];case 3006:return[\"RGBD\",\"( value, 256.0 )\"];case 3007:return[\"Gamma\",\"( value, float( GAMMA_FACTOR ) )\"];default:throw Error(\"unsupported encoding: \"+\na);}}function Rd(a,b){b=Le(b);return\"vec4 \"+a+\"( vec4 value ) { return \"+b[0]+\"ToLinear\"+b[1]+\"; }\"}function dg(a,b){b=Le(b);return\"vec4 \"+a+\"( vec4 value ) { return LinearTo\"+b[0]+b[1]+\"; }\"}function eg(a,b){switch(b){case 1:b=\"Linear\";break;case 2:b=\"Reinhard\";break;case 3:b=\"Uncharted2\";break;case 4:b=\"OptimizedCineon\";break;default:throw Error(\"unsupported toneMapping: \"+b);}return\"vec3 \"+a+\"( vec3 color ) { return \"+b+\"ToneMapping( color ); }\"}function fg(a,b,c){a=a||{};return[a.derivatives||\nb.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?\"#extension GL_OES_standard_derivatives : enable\":\"\",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get(\"EXT_frag_depth\")?\"#extension GL_EXT_frag_depth : enable\":\"\",a.drawBuffers&&c.get(\"WEBGL_draw_buffers\")?\"#extension GL_EXT_draw_buffers : require\":\"\",(a.shaderTextureLOD||b.envMap)&&c.get(\"EXT_shader_texture_lod\")?\"#extension GL_EXT_shader_texture_lod : enable\":\"\"].filter(Bc).join(\"\\n\")}function gg(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push(\"#define \"+\nc+\" \"+d)}return b.join(\"\\n\")}function Bc(a){return\"\"!==a}function Me(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Sd(a){return a.replace(/^[ \\t]*#include +<([\\w\\d.]+)>/gm,function(a,c){a=W[c];if(void 0===a)throw Error(\"Can not resolve #include <\"+c+\">\");return Sd(a)})}function Ne(a){return a.replace(/for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g,\nfunction(a,c,d,e){a=\"\";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\\[ i \\]/g,\"[ \"+c+\" ]\");return a})}function hg(a,b,c,d,e,f){var g=a.context,h=d.defines,k=e.vertexShader,l=e.fragmentShader,q=\"SHADOWMAP_TYPE_BASIC\";1===f.shadowMapType?q=\"SHADOWMAP_TYPE_PCF\":2===f.shadowMapType&&(q=\"SHADOWMAP_TYPE_PCF_SOFT\");var n=\"ENVMAP_TYPE_CUBE\",t=\"ENVMAP_MODE_REFLECTION\",r=\"ENVMAP_BLENDING_MULTIPLY\";if(f.envMap){switch(d.envMap.mapping){case 301:case 302:n=\"ENVMAP_TYPE_CUBE\";break;case 306:case 307:n=\"ENVMAP_TYPE_CUBE_UV\";\nbreak;case 303:case 304:n=\"ENVMAP_TYPE_EQUIREC\";break;case 305:n=\"ENVMAP_TYPE_SPHERE\"}switch(d.envMap.mapping){case 302:case 304:t=\"ENVMAP_MODE_REFRACTION\"}switch(d.combine){case 0:r=\"ENVMAP_BLENDING_MULTIPLY\";break;case 1:r=\"ENVMAP_BLENDING_MIX\";break;case 2:r=\"ENVMAP_BLENDING_ADD\"}}var m=0<a.gammaFactor?a.gammaFactor:1,v=fg(d.extensions,f,b),w=gg(h),p=g.createProgram();d.isRawShaderMaterial?(h=[w].filter(Bc).join(\"\\n\"),0<h.length&&(h+=\"\\n\"),b=[v,w].filter(Bc).join(\"\\n\"),0<b.length&&(b+=\"\\n\")):(h=\n[\"precision \"+f.precision+\" float;\",\"precision \"+f.precision+\" int;\",\"#define SHADER_NAME \"+e.name,w,f.supportsVertexTextures?\"#define VERTEX_TEXTURES\":\"\",\"#define GAMMA_FACTOR \"+m,\"#define MAX_BONES \"+f.maxBones,f.useFog&&f.fog?\"#define USE_FOG\":\"\",f.useFog&&f.fogExp?\"#define FOG_EXP2\":\"\",f.map?\"#define USE_MAP\":\"\",f.envMap?\"#define USE_ENVMAP\":\"\",f.envMap?\"#define \"+t:\"\",f.lightMap?\"#define USE_LIGHTMAP\":\"\",f.aoMap?\"#define USE_AOMAP\":\"\",f.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",f.bumpMap?\"#define USE_BUMPMAP\":\n\"\",f.normalMap?\"#define USE_NORMALMAP\":\"\",f.displacementMap&&f.supportsVertexTextures?\"#define USE_DISPLACEMENTMAP\":\"\",f.specularMap?\"#define USE_SPECULARMAP\":\"\",f.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",f.metalnessMap?\"#define USE_METALNESSMAP\":\"\",f.alphaMap?\"#define USE_ALPHAMAP\":\"\",f.vertexColors?\"#define USE_COLOR\":\"\",f.flatShading?\"#define FLAT_SHADED\":\"\",f.skinning?\"#define USE_SKINNING\":\"\",f.useVertexTexture?\"#define BONE_TEXTURE\":\"\",f.morphTargets?\"#define USE_MORPHTARGETS\":\"\",f.morphNormals&&\n!1===f.flatShading?\"#define USE_MORPHNORMALS\":\"\",f.doubleSided?\"#define DOUBLE_SIDED\":\"\",f.flipSided?\"#define FLIP_SIDED\":\"\",\"#define NUM_CLIPPING_PLANES \"+f.numClippingPlanes,f.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",f.shadowMapEnabled?\"#define \"+q:\"\",f.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",f.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",f.logarithmicDepthBuffer&&b.get(\"EXT_frag_depth\")?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 modelMatrix;\",\"uniform mat4 modelViewMatrix;\",\n\"uniform mat4 projectionMatrix;\",\"uniform mat4 viewMatrix;\",\"uniform mat3 normalMatrix;\",\"uniform vec3 cameraPosition;\",\"attribute vec3 position;\",\"attribute vec3 normal;\",\"attribute vec2 uv;\",\"#ifdef USE_COLOR\",\"\\tattribute vec3 color;\",\"#endif\",\"#ifdef USE_MORPHTARGETS\",\"\\tattribute vec3 morphTarget0;\",\"\\tattribute vec3 morphTarget1;\",\"\\tattribute vec3 morphTarget2;\",\"\\tattribute vec3 morphTarget3;\",\"\\t#ifdef USE_MORPHNORMALS\",\"\\t\\tattribute vec3 morphNormal0;\",\"\\t\\tattribute vec3 morphNormal1;\",\n\"\\t\\tattribute vec3 morphNormal2;\",\"\\t\\tattribute vec3 morphNormal3;\",\"\\t#else\",\"\\t\\tattribute vec3 morphTarget4;\",\"\\t\\tattribute vec3 morphTarget5;\",\"\\t\\tattribute vec3 morphTarget6;\",\"\\t\\tattribute vec3 morphTarget7;\",\"\\t#endif\",\"#endif\",\"#ifdef USE_SKINNING\",\"\\tattribute vec4 skinIndex;\",\"\\tattribute vec4 skinWeight;\",\"#endif\",\"\\n\"].filter(Bc).join(\"\\n\"),b=[v,\"precision \"+f.precision+\" float;\",\"precision \"+f.precision+\" int;\",\"#define SHADER_NAME \"+e.name,w,f.alphaTest?\"#define ALPHATEST \"+f.alphaTest:\n\"\",\"#define GAMMA_FACTOR \"+m,f.useFog&&f.fog?\"#define USE_FOG\":\"\",f.useFog&&f.fogExp?\"#define FOG_EXP2\":\"\",f.map?\"#define USE_MAP\":\"\",f.envMap?\"#define USE_ENVMAP\":\"\",f.envMap?\"#define \"+n:\"\",f.envMap?\"#define \"+t:\"\",f.envMap?\"#define \"+r:\"\",f.lightMap?\"#define USE_LIGHTMAP\":\"\",f.aoMap?\"#define USE_AOMAP\":\"\",f.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",f.bumpMap?\"#define USE_BUMPMAP\":\"\",f.normalMap?\"#define USE_NORMALMAP\":\"\",f.specularMap?\"#define USE_SPECULARMAP\":\"\",f.roughnessMap?\"#define USE_ROUGHNESSMAP\":\n\"\",f.metalnessMap?\"#define USE_METALNESSMAP\":\"\",f.alphaMap?\"#define USE_ALPHAMAP\":\"\",f.vertexColors?\"#define USE_COLOR\":\"\",f.gradientMap?\"#define USE_GRADIENTMAP\":\"\",f.flatShading?\"#define FLAT_SHADED\":\"\",f.doubleSided?\"#define DOUBLE_SIDED\":\"\",f.flipSided?\"#define FLIP_SIDED\":\"\",\"#define NUM_CLIPPING_PLANES \"+f.numClippingPlanes,\"#define UNION_CLIPPING_PLANES \"+(f.numClippingPlanes-f.numClipIntersection),f.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",f.shadowMapEnabled?\"#define \"+q:\"\",f.premultipliedAlpha?\n\"#define PREMULTIPLIED_ALPHA\":\"\",f.physicallyCorrectLights?\"#define PHYSICALLY_CORRECT_LIGHTS\":\"\",f.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",f.logarithmicDepthBuffer&&b.get(\"EXT_frag_depth\")?\"#define USE_LOGDEPTHBUF_EXT\":\"\",f.envMap&&b.get(\"EXT_shader_texture_lod\")?\"#define TEXTURE_LOD_EXT\":\"\",\"uniform mat4 viewMatrix;\",\"uniform vec3 cameraPosition;\",0!==f.toneMapping?\"#define TONE_MAPPING\":\"\",0!==f.toneMapping?W.tonemapping_pars_fragment:\"\",0!==f.toneMapping?eg(\"toneMapping\",f.toneMapping):\n\"\",f.dithering?\"#define DITHERING\":\"\",f.outputEncoding||f.mapEncoding||f.envMapEncoding||f.emissiveMapEncoding?W.encodings_pars_fragment:\"\",f.mapEncoding?Rd(\"mapTexelToLinear\",f.mapEncoding):\"\",f.envMapEncoding?Rd(\"envMapTexelToLinear\",f.envMapEncoding):\"\",f.emissiveMapEncoding?Rd(\"emissiveMapTexelToLinear\",f.emissiveMapEncoding):\"\",f.outputEncoding?dg(\"linearToOutputTexel\",f.outputEncoding):\"\",f.depthPacking?\"#define DEPTH_PACKING \"+d.depthPacking:\"\",\"\\n\"].filter(Bc).join(\"\\n\"));k=Sd(k);k=Me(k,f);\nl=Sd(l);l=Me(l,f);d.isShaderMaterial||(k=Ne(k),l=Ne(l));l=b+l;k=Ke(g,g.VERTEX_SHADER,h+k);l=Ke(g,g.FRAGMENT_SHADER,l);g.attachShader(p,k);g.attachShader(p,l);void 0!==d.index0AttributeName?g.bindAttribLocation(p,0,d.index0AttributeName):!0===f.morphTargets&&g.bindAttribLocation(p,0,\"position\");g.linkProgram(p);f=g.getProgramInfoLog(p);e=g.getShaderInfoLog(k);q=g.getShaderInfoLog(l);t=n=!0;if(!1===g.getProgramParameter(p,g.LINK_STATUS))n=!1,console.error(\"THREE.WebGLProgram: shader error: \",g.getError(),\n\"gl.VALIDATE_STATUS\",g.getProgramParameter(p,g.VALIDATE_STATUS),\"gl.getProgramInfoLog\",f,e,q);else if(\"\"!==f)console.warn(\"THREE.WebGLProgram: gl.getProgramInfoLog()\",f);else if(\"\"===e||\"\"===q)t=!1;t&&(this.diagnostics={runnable:n,material:d,programLog:f,vertexShader:{log:e,prefix:h},fragmentShader:{log:q,prefix:b}});g.deleteShader(k);g.deleteShader(l);var z;this.getUniforms=function(){void 0===z&&(z=new gb(g,p,a));return z};var I;this.getAttributes=function(){if(void 0===I){for(var a={},b=g.getProgramParameter(p,\ng.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=g.getActiveAttrib(p,c).name;a[d]=g.getAttribLocation(p,d)}I=a}return I};this.destroy=function(){g.deleteProgram(p);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn(\"THREE.WebGLProgram: .uniforms is now .getUniforms().\");return this.getUniforms()}},attributes:{get:function(){console.warn(\"THREE.WebGLProgram: .attributes is now .getAttributes().\");return this.getAttributes()}}});this.id=ig++;this.code=c;this.usedTimes=1;\nthis.program=p;this.vertexShader=k;this.fragmentShader=l;return this}function jg(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn(\"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\"),c=a.texture.encoding);else var c=3E3;3E3===c&&b&&(c=3007);return c}var e=[],f={MeshDepthMaterial:\"depth\",MeshDistanceMaterial:\"distanceRGBA\",MeshNormalMaterial:\"normal\",MeshBasicMaterial:\"basic\",MeshLambertMaterial:\"lambert\",\nMeshPhongMaterial:\"phong\",MeshToonMaterial:\"phong\",MeshStandardMaterial:\"physical\",MeshPhysicalMaterial:\"physical\",LineBasicMaterial:\"basic\",LineDashedMaterial:\"dashed\",PointsMaterial:\"points\",ShadowMaterial:\"shadow\"},g=\"precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering\".split(\" \");\nthis.getParameters=function(b,e,g,q,n,t,r){var h=f[b.type];if(r.isSkinnedMesh){var l=r.skeleton.bones;if(c.floatVertexTextures)l=1024;else{var k=Math.min(Math.floor((c.maxVertexUniforms-20)/4),l.length);k<l.length?(console.warn(\"THREE.WebGLRenderer: Skeleton has \"+l.length+\" bones. This GPU supports \"+k+\".\"),l=0):l=k}}else l=0;k=c.precision;null!==b.precision&&(k=c.getMaxPrecision(b.precision),k!==b.precision&&console.warn(\"THREE.WebGLProgram.getParameters:\",b.precision,\"not supported, using\",k,\"instead.\"));\nvar m=a.getRenderTarget();return{shaderID:h,precision:k,supportsVertexTextures:c.vertexTextures,outputEncoding:d(m?m.texture:null,a.gammaOutput),map:!!b.map,mapEncoding:d(b.map,a.gammaInput),envMap:!!b.envMap,envMapMode:b.envMap&&b.envMap.mapping,envMapEncoding:d(b.envMap,a.gammaInput),envMapCubeUV:!!b.envMap&&(306===b.envMap.mapping||307===b.envMap.mapping),lightMap:!!b.lightMap,aoMap:!!b.aoMap,emissiveMap:!!b.emissiveMap,emissiveMapEncoding:d(b.emissiveMap,a.gammaInput),bumpMap:!!b.bumpMap,normalMap:!!b.normalMap,\ndisplacementMap:!!b.displacementMap,roughnessMap:!!b.roughnessMap,metalnessMap:!!b.metalnessMap,specularMap:!!b.specularMap,alphaMap:!!b.alphaMap,gradientMap:!!b.gradientMap,combine:b.combine,vertexColors:b.vertexColors,fog:!!q,useFog:b.fog,fogExp:q&&q.isFogExp2,flatShading:b.flatShading,sizeAttenuation:b.sizeAttenuation,logarithmicDepthBuffer:c.logarithmicDepthBuffer,skinning:b.skinning&&0<l,maxBones:l,useVertexTexture:c.floatVertexTextures,morphTargets:b.morphTargets,morphNormals:b.morphNormals,\nmaxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numClippingPlanes:n,numClipIntersection:t,dithering:b.dithering,shadowMapEnabled:a.shadowMap.enabled&&r.receiveShadow&&0<g.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:b.premultipliedAlpha,\nalphaTest:b.alphaTest,doubleSided:2===b.side,flipSided:1===b.side,depthPacking:void 0!==b.depthPacking?b.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<g.length;e++)d.push(c[g[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(c,d,f,g){for(var h,l=0,k=e.length;l<\nk;l++){var q=e[l];if(q.code===g){h=q;++h.usedTimes;break}}void 0===h&&(h=new hg(a,b,g,c,d,f),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function kg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){b/=Math.max(a.width,a.height);var c=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext(\"2d\").drawImage(a,\n0,0,a.width,a.height,0,0,c.width,c.height);console.warn(\"THREE.WebGLRenderer: image is too big (\"+a.width+\"x\"+a.height+\"). Resized to \"+c.width+\"x\"+c.height,a);return c}return a}function k(a){return R.isPowerOfTwo(a.width)&&R.isPowerOfTwo(a.height)}function l(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function n(b){b=b.target;b.removeEventListener(\"dispose\",n);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);\nelse{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function t(b){b=b.target;b.removeEventListener(\"dispose\",t);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),\nc.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,q){var t=d.get(b);if(0<b.version&&t.__version!==b.version){var r=b.image;if(void 0===r)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is undefined\",b);else if(!1===r.complete)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is incomplete\",b);else{void 0===t.__webglInit&&(t.__webglInit=!0,b.addEventListener(\"dispose\",n),t.__webglTexture=\na.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_2D,t.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var u=h(b.image,e.maxTextureSize);(1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(u)&&(q=u,q instanceof HTMLImageElement||q instanceof HTMLCanvasElement||q instanceof ImageBitmap?(r=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"canvas\"),r.width=R.floorPowerOfTwo(q.width),r.height=R.floorPowerOfTwo(q.height),r.getContext(\"2d\").drawImage(q,0,0,r.width,r.height),console.warn(\"THREE.WebGLRenderer: image is not power of two (\"+q.width+\"x\"+q.height+\"). Resized to \"+r.width+\"x\"+r.height,q),u=r):u=q);q=k(u);var r=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_2D,b,q);var p=b.mipmaps;if(b.isDepthTexture){p=a.DEPTH_COMPONENT;if(1015===b.type){if(!x)throw Error(\"Float Depth Texture only supported in WebGL2.0\");p=a.DEPTH_COMPONENT32F}else x&&\n(p=a.DEPTH_COMPONENT16);1026===b.format&&p===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.\"),b.type=1012,z=f.convert(b.type));1027===b.format&&(p=a.DEPTH_STENCIL,1020!==b.type&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.\"),b.type=1020,z=f.convert(b.type)));c.texImage2D(a.TEXTURE_2D,0,p,u.width,u.height,0,r,z,null)}else if(b.isDataTexture)if(0<\np.length&&q){for(var v=0,w=p.length;v<w;v++)u=p[v],c.texImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,r,z,u.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,r,u.width,u.height,0,r,z,u.data);else if(b.isCompressedTexture)for(v=0,w=p.length;v<w;v++)u=p[v],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(r)?c.compressedTexImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,u.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):\nc.texImage2D(a.TEXTURE_2D,v,r,u.width,u.height,0,r,z,u.data);else if(0<p.length&&q){v=0;for(w=p.length;v<w;v++)u=p[v],c.texImage2D(a.TEXTURE_2D,v,r,r,z,u);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,r,r,z,u);l(b,q)&&a.generateMipmap(a.TEXTURE_2D);t.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_2D,t.__webglTexture)}function m(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f.convert(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,\nf.convert(g.wrapT)),a.texParameteri(c,a.TEXTURE_MAG_FILTER,f.convert(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f.convert(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.\",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,q(g.magFilter)),a.texParameteri(c,\na.TEXTURE_MIN_FILTER,q(g.minFilter)),1003!==g.minFilter&&1006!==g.minFilter&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.\",g));!(h=b.get(\"EXT_texture_filter_anisotropic\"))||1015===g.type&&null===b.get(\"OES_texture_float_linear\")||1016===g.type&&null===b.get(\"OES_texture_half_float_linear\")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,\ne.getMaxAnisotropy())),d.get(g).__currentAnisotropy=g.anisotropy)}function p(b,e,g,h){var l=f.convert(e.texture.format),k=f.convert(e.texture.type);c.texImage2D(h,0,l,e.width,e.height,0,l,k,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function w(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),\na.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var x=\"undefined\"!==typeof WebGL2RenderingContext&&a instanceof window.WebGL2RenderingContext;this.setTexture2D=r;this.setTextureCube=\nfunction(b,q){var t=d.get(b);if(6===b.image.length)if(0<b.version&&t.__version!==b.version){t.__image__webglTextureCube||(b.addEventListener(\"dispose\",n),t.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+q);c.bindTexture(a.TEXTURE_CUBE_MAP,t.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);q=b&&b.isCompressedTexture;for(var r=b.image[0]&&b.image[0].isDataTexture,u=[],p=0;6>p;p++)u[p]=q||r?r?b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize);\nvar v=k(u[0]),w=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_CUBE_MAP,b,v);for(p=0;6>p;p++)if(q)for(var x,I=u[p].mipmaps,y=0,C=I.length;y<C;y++)x=I[y],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(w)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,y,w,x.width,x.height,0,x.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,y,w,x.width,x.height,\n0,w,z,x.data);else r?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,0,w,u[p].width,u[p].height,0,w,z,u[p].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+p,0,w,w,z,u[p]);l(b,v)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);t.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+q),c.bindTexture(a.TEXTURE_CUBE_MAP,t.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=\nfunction(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener(\"dispose\",t);f.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,n=k(b);if(h){e.__webglFramebuffer=[];for(var q=0;6>q;q++)e.__webglFramebuffer[q]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);m(a.TEXTURE_CUBE_MAP,b.texture,n);for(q=0;6>q;q++)p(e.__webglFramebuffer[q],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+q);\nl(b.texture,n)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),m(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),l(b.texture,n)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error(\"target.depthTexture not supported in Cube render targets\");if(b&&b.isWebGLRenderTargetCube)throw Error(\"Depth Texture with cube render targets is not supported\");\na.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error(\"renderTarget.depthTexture must be an instance of THREE.DepthTexture\");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,\na.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error(\"Unknown depthTexture format\");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer,\nb);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);l(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function lg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function mg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();\na.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==z[b]&&(a.enable(b),z[b]=!0)}function f(b){!1!==z[b]&&(a.disable(b),z[b]=!1)}function g(b,d,g,h,l,k,n,q){0!==b?e(a.BLEND):f(a.BLEND);if(5!==b){if(b!==J||q!==L)switch(b){case 2:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),\na.blendFunc(a.SRC_ALPHA,a.ONE));break;case 3:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR));break;case 4:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR));break;default:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,\na.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA))}E=A=ha=C=y=ta=null}else{l=l||d;k=k||g;n=n||h;if(d!==ta||l!==ha)a.blendEquationSeparate(c.convert(d),c.convert(l)),ta=d,ha=l;if(g!==y||h!==C||k!==A||n!==E)a.blendFuncSeparate(c.convert(g),c.convert(h),c.convert(k),c.convert(n)),y=g,C=h,A=k,E=n}J=b;L=q}function h(b){D!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),D=b)}\nfunction k(b){0!==b?(e(a.CULL_FACE),b!==H&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);H=b}function l(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),V!==c||K!==d)a.polygonOffset(c,d),V=c,K=d}else f(a.POLYGON_OFFSET_FILL)}function q(b){void 0===b&&(b=a.TEXTURE0+N-1);R!==b&&(a.activeTexture(b),R=b)}var n=new function(){var b=!1,c=new da,d=null,e=new da(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},\nsetClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},t=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);\nbreak;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=null,d=null,g=null,h=null,l=null,k=null,n=null,q=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||\n(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(l!==b||k!==c||n!==d)a.stencilOp(b,c,d),l=b,k=c,n=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=n=k=l=h=g=d=c=null}}},m=a.getParameter(a.MAX_VERTEX_ATTRIBS),p=new Uint8Array(m),w=new Uint8Array(m),x=new Uint8Array(m),z={},I=null,B=null,J=null,ta=null,y=null,C=null,ha=null,A=null,E=null,L=!1,D=null,H=null,M=null,\nV=null,K=null,N=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),m=parseFloat(/^WebGL\\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),aa=1<=parseFloat(m),R=null,P={},Q=new da,G=new da,X={};X[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);X[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);n.setClear(0,0,0,1);t.setClear(1);r.setClear(0);e(a.DEPTH_TEST);t.setFunc(3);h(!1);k(1);e(a.CULL_FACE);e(a.BLEND);g(1);return{buffers:{color:n,depth:t,stencil:r},initAttributes:function(){for(var a=\n0,b=p.length;a<b;a++)p[a]=0},enableAttribute:function(c){p[c]=1;0===w[c]&&(a.enableVertexAttribArray(c),w[c]=1);0!==x[c]&&(b.get(\"ANGLE_instanced_arrays\").vertexAttribDivisorANGLE(c,0),x[c]=0)},enableAttributeAndDivisor:function(c,d){p[c]=1;0===w[c]&&(a.enableVertexAttribArray(c),w[c]=1);x[c]!==d&&(b.get(\"ANGLE_instanced_arrays\").vertexAttribDivisorANGLE(c,d),x[c]=d)},disableUnusedAttributes:function(){for(var b=0,c=w.length;b!==c;++b)w[b]!==p[b]&&(a.disableVertexAttribArray(b),w[b]=0)},enable:e,\ndisable:f,getCompressedTextureFormats:function(){if(null===I&&(I=[],b.get(\"WEBGL_compressed_texture_pvrtc\")||b.get(\"WEBGL_compressed_texture_s3tc\")||b.get(\"WEBGL_compressed_texture_etc1\")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)I.push(c[d]);return I},useProgram:function(b){return B!==b?(a.useProgram(b),B=b,!0):!1},setBlending:g,setMaterial:function(b){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);h(1===b.side);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,\nb.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);t.setFunc(b.depthFunc);t.setTest(b.depthTest);t.setMask(b.depthWrite);n.setMask(b.colorWrite);l(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==M&&(aa&&a.lineWidth(b),M=b)},setPolygonOffset:l,setScissorTest:function(b){b?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:q,bindTexture:function(b,c){null===R&&q();var d=P[R];void 0===d&&(d=\n{type:void 0,texture:void 0},P[R]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||X[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(fa){console.error(\"THREE.WebGLState:\",fa)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(fa){console.error(\"THREE.WebGLState:\",fa)}},scissor:function(b){!1===Q.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),Q.copy(b))},viewport:function(b){!1===G.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),G.copy(b))},\nreset:function(){for(var b=0;b<w.length;b++)1===w[b]&&(a.disableVertexAttribArray(b),w[b]=0);z={};R=I=null;P={};H=D=J=B=null;n.reset();t.reset();r.reset()}}}function ng(a,b,c){function d(b){if(\"highp\"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return\"highp\";b=\"mediump\"}return\"mediump\"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,\na.MEDIUM_FLOAT).precision?\"mediump\":\"lowp\"}var e,f=void 0!==c.precision?c.precision:\"highp\",g=d(f);g!==f&&(console.warn(\"THREE.WebGLRenderer:\",f,\"not supported, using\",g,\"instead.\"),f=g);c=!0===c.logarithmicDepthBuffer;var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),l=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),q=a.getParameter(a.MAX_VERTEX_ATTRIBS),n=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),t=a.getParameter(a.MAX_VARYING_VECTORS),\nr=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),m=0<h,p=!!b.get(\"OES_texture_float\");return{getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get(\"EXT_texture_filter_anisotropic\");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:l,maxAttributes:q,maxVertexUniforms:n,maxVaryings:t,maxFragmentUniforms:r,vertexTextures:m,floatFragmentTextures:p,floatVertexTextures:m&&\np}}function U(a,b,c,d){La.call(this);this.type=\"PerspectiveCamera\";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function nd(a){U.call(this);this.cameras=a||[]}function og(a){function b(){if(null!==d&&d.isPresenting){var b=d.getEyeParameters(\"left\"),e=b.renderWidth,b=b.renderHeight;t=a.getPixelRatio();n=a.getSize();a.setDrawingBufferSize(2*\ne,b,1)}else c.enabled&&a.setDrawingBufferSize(n.width,n.height,t)}var c=this,d=null,e=null;\"undefined\"!==typeof window&&\"VRFrameData\"in window&&(e=new window.VRFrameData);var f=new K,g=new K,h=new K,k=new U;k.bounds=new da(0,0,.5,1);k.layers.enable(1);var l=new U;l.bounds=new da(.5,0,.5,1);l.layers.enable(2);var q=new nd([k,l]);q.layers.enable(1);q.layers.enable(2);var n,t;\"undefined\"!==typeof window&&window.addEventListener(\"vrdisplaypresentchange\",b,!1);this.standing=this.enabled=!1;this.getDevice=\nfunction(){return d};this.setDevice=function(a){void 0!==a&&(d=a)};this.getCamera=function(a){if(null===d)return a;d.depthNear=a.near;d.depthFar=a.far;d.getFrameData(e);var b=e.pose;null!==b.position?a.position.fromArray(b.position):a.position.set(0,0,0);null!==b.orientation&&a.quaternion.fromArray(b.orientation);a.updateMatrixWorld();b=d.stageParameters;this.standing&&b&&(g.fromArray(b.sittingToStandingTransform),h.getInverse(g),a.matrixWorld.multiply(g),a.matrixWorldInverse.multiply(h));if(!1===\nd.isPresenting)return a;k.near=a.near;l.near=a.near;k.far=a.far;l.far=a.far;q.matrixWorld.copy(a.matrixWorld);q.matrixWorldInverse.copy(a.matrixWorldInverse);k.matrixWorldInverse.fromArray(e.leftViewMatrix);l.matrixWorldInverse.fromArray(e.rightViewMatrix);this.standing&&b&&(k.matrixWorldInverse.multiply(h),l.matrixWorldInverse.multiply(h));a=a.parent;null!==a&&(f.getInverse(a.matrixWorld),k.matrixWorldInverse.multiply(f),l.matrixWorldInverse.multiply(f));k.matrixWorld.getInverse(k.matrixWorldInverse);\nl.matrixWorld.getInverse(l.matrixWorldInverse);k.projectionMatrix.fromArray(e.leftProjectionMatrix);l.projectionMatrix.fromArray(e.rightProjectionMatrix);q.projectionMatrix.copy(k.projectionMatrix);a=d.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&k.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&l.bounds.fromArray(a.rightBounds));return q};this.getStandingMatrix=function(){return g};this.submitFrame=function(){d&&d.isPresenting&&d.submitFrame()};\nthis.dispose=function(){\"undefined\"!==typeof window&&window.removeEventListener(\"vrdisplaypresentchange\",b)}}function pg(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case \"WEBGL_depth_texture\":var d=a.getExtension(\"WEBGL_depth_texture\")||a.getExtension(\"MOZ_WEBGL_depth_texture\")||a.getExtension(\"WEBKIT_WEBGL_depth_texture\");break;case \"EXT_texture_filter_anisotropic\":d=a.getExtension(\"EXT_texture_filter_anisotropic\")||a.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||\na.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");break;case \"WEBGL_compressed_texture_s3tc\":d=a.getExtension(\"WEBGL_compressed_texture_s3tc\")||a.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||a.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");break;case \"WEBGL_compressed_texture_pvrtc\":d=a.getExtension(\"WEBGL_compressed_texture_pvrtc\")||a.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\");break;case \"WEBGL_compressed_texture_etc1\":d=a.getExtension(\"WEBGL_compressed_texture_etc1\");\nbreak;default:d=a.getExtension(c)}null===d&&console.warn(\"THREE.WebGLRenderer: \"+c+\" extension not supported.\");return b[c]=d}}}function qg(){function a(){l.value!==d&&(l.value=d,l.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=l.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+\n3]=h.constant}l.value=g;l.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Aa,k=new ra,l={value:null,needsUpdate:!1};this.uniform=l;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,k,r,m,p){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,q=m.clippingState||null;\nl.value=q;q=b(c,r,n,p);for(c=0;c!==n;++c)q[c]=d[c];m.clippingState=q;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Pe(a,b){return{convert:function(c){if(1E3===c)return a.REPEAT;if(1001===c)return a.CLAMP_TO_EDGE;if(1002===c)return a.MIRRORED_REPEAT;if(1003===c)return a.NEAREST;if(1004===c)return a.NEAREST_MIPMAP_NEAREST;if(1005===c)return a.NEAREST_MIPMAP_LINEAR;if(1006===c)return a.LINEAR;if(1007===c)return a.LINEAR_MIPMAP_NEAREST;if(1008===c)return a.LINEAR_MIPMAP_LINEAR;\nif(1009===c)return a.UNSIGNED_BYTE;if(1017===c)return a.UNSIGNED_SHORT_4_4_4_4;if(1018===c)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===c)return a.UNSIGNED_SHORT_5_6_5;if(1010===c)return a.BYTE;if(1011===c)return a.SHORT;if(1012===c)return a.UNSIGNED_SHORT;if(1013===c)return a.INT;if(1014===c)return a.UNSIGNED_INT;if(1015===c)return a.FLOAT;if(1016===c){var d=b.get(\"OES_texture_half_float\");if(null!==d)return d.HALF_FLOAT_OES}if(1021===c)return a.ALPHA;if(1022===c)return a.RGB;if(1023===c)return a.RGBA;\nif(1024===c)return a.LUMINANCE;if(1025===c)return a.LUMINANCE_ALPHA;if(1026===c)return a.DEPTH_COMPONENT;if(1027===c)return a.DEPTH_STENCIL;if(100===c)return a.FUNC_ADD;if(101===c)return a.FUNC_SUBTRACT;if(102===c)return a.FUNC_REVERSE_SUBTRACT;if(200===c)return a.ZERO;if(201===c)return a.ONE;if(202===c)return a.SRC_COLOR;if(203===c)return a.ONE_MINUS_SRC_COLOR;if(204===c)return a.SRC_ALPHA;if(205===c)return a.ONE_MINUS_SRC_ALPHA;if(206===c)return a.DST_ALPHA;if(207===c)return a.ONE_MINUS_DST_ALPHA;\nif(208===c)return a.DST_COLOR;if(209===c)return a.ONE_MINUS_DST_COLOR;if(210===c)return a.SRC_ALPHA_SATURATE;if(2001===c||2002===c||2003===c||2004===c)if(d=b.get(\"WEBGL_compressed_texture_s3tc\"),null!==d){if(2001===c)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===c)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===c)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===c)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===c||2101===c||2102===c||2103===c)if(d=b.get(\"WEBGL_compressed_texture_pvrtc\"),null!==\nd){if(2100===c)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===c)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===c)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===c)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===c&&(d=b.get(\"WEBGL_compressed_texture_etc1\"),null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(103===c||104===c)if(d=b.get(\"EXT_blend_minmax\"),null!==d){if(103===c)return d.MIN_EXT;if(104===c)return d.MAX_EXT}return 1020===c&&(d=b.get(\"WEBGL_depth_texture\"),null!==d)?d.UNSIGNED_INT_24_8_WEBGL:\n0}}}function Wd(a){function b(){ia=new pg(F);ia.get(\"WEBGL_depth_texture\");ia.get(\"OES_texture_float\");ia.get(\"OES_texture_float_linear\");ia.get(\"OES_texture_half_float\");ia.get(\"OES_texture_half_float_linear\");ia.get(\"OES_standard_derivatives\");ia.get(\"OES_element_index_uint\");ia.get(\"ANGLE_instanced_arrays\");oa=new Pe(F,ia);Z=new ng(F,ia,a);ba=new mg(F,ia,oa);ba.scissor(S.copy(ea).multiplyScalar(O));ba.viewport(Q.copy(ca).multiplyScalar(O));U=new lg;T=new kg(F,ia,ba,U,Z,oa,Vd);na=new Mf(F);pa=new Zf(F,\nna,Vd);ra=new bg(pa,Ra);va=new Wf(F);ma=new jg(L,ia,Z);sa=new ag;qa=new Uf;ja=new Qf(L,ba,pa,J);wa=new Yf(F,ia,Ra);xa=new Xf(F,ia,Ra);ya=new Jf(L,F,ba,T,Z);Aa=new Kf(L,F,ba,T,Z);L.info.programs=ma.programs;L.context=F;L.capabilities=Z;L.extensions=ia;L.properties=U;L.renderLists=qa;L.state=ba}function c(a){a.preventDefault();console.log(\"THREE.WebGLRenderer: Context Lost.\");Y=!0}function d(){console.log(\"THREE.WebGLRenderer: Context Restored.\");Y=!1;b()}function e(a){a=a.target;a.removeEventListener(\"dispose\",\ne);f(a);U.remove(a)}function f(a){var b=U.get(a).program;a.program=void 0;void 0!==b&&ma.releaseProgram(b)}function g(a,b,c){a.render(function(a){L.renderBufferImmediate(a,b,c)})}function h(a){null!==Ba&&Ba(a);(a=ka.getDevice())&&a.isPresenting?a.requestAnimationFrame(h):window.requestAnimationFrame(h)}function k(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)y.push(a),a.castShadow&&C.push(a);else if(a.isSprite)a.frustumCulled&&!Td.intersectsSprite(a)||D.push(a);else if(a.isLensFlare)Va.push(a);\nelse if(a.isImmediateRenderObject)c&&Nb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(md),A.push(a,null,a.material,Nb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||Td.intersectsObject(a)){c&&Nb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(md);var d=ra.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<h;g++){var l=f[g],n=e[l.materialIndex];n&&n.visible&&A.push(a,d,n,Nb.z,l)}else e.visible&&A.push(a,d,e,\nNb.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function l(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,k=void 0===d?g.material:d,g=g.group;if(c.isArrayCamera){aa=c;for(var n=c.cameras,t=0,r=n.length;t<r;t++){var m=n[t];if(h.layers.test(m.layers)){var u=m.bounds;ba.viewport(Q.set(u.x*X,u.y*fa,u.z*X,u.w*fa).multiplyScalar(O));q(h,b,m,l,k,g)}}}else aa=null,q(h,b,c,l,k,g)}}function q(a,b,c,d,e,f){a.onBeforeRender(L,b,c,d,e,f);a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,\na.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){ba.setMaterial(e);var h=t(c,b.fog,e,a);N=\"\";g(a,h,e)}else L.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(L,b,c,d,e,f)}function n(a,b,c){var d=U.get(a);c=ma.getParameters(a,sa.state,C,b,Fa.numPlanes,Fa.numIntersection,c);var g=ma.getProgramCode(a,c),h=d.program,l=!0;if(void 0===h)a.addEventListener(\"dispose\",e);else if(h.code!==g)f(a);else{if(void 0!==c.shaderID)return;l=!1}l&&(c.shaderID?(h=mb[c.shaderID],\nd.shader={name:a.type,uniforms:Ea.clone(h.uniforms),vertexShader:h.vertexShader,fragmentShader:h.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),h=ma.acquireProgram(a,d.shader,c,g),d.program=h,a.program=h);c=h.getAttributes();if(a.morphTargets)for(g=a.numSupportedMorphTargets=0;g<L.maxMorphTargets;g++)0<=c[\"morphTarget\"+g]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(g=a.numSupportedMorphNormals=\n0;g<L.maxMorphNormals;g++)0<=c[\"morphNormal\"+g]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Fa.numPlanes,d.numIntersection=Fa.numIntersection,c.clippingPlanes=Fa.uniform;d.fog=b;d.lightsHash=sa.state.hash;a.lights&&(c.ambientLightColor.value=sa.state.ambient,c.directionalLights.value=sa.state.directional,c.spotLights.value=sa.state.spot,c.rectAreaLights.value=sa.state.rectArea,c.pointLights.value=sa.state.point,\nc.hemisphereLights.value=sa.state.hemi,c.directionalShadowMap.value=sa.state.directionalShadowMap,c.directionalShadowMatrix.value=sa.state.directionalShadowMatrix,c.spotShadowMap.value=sa.state.spotShadowMap,c.spotShadowMatrix.value=sa.state.spotShadowMatrix,c.pointShadowMap.value=sa.state.pointShadowMap,c.pointShadowMatrix.value=sa.state.pointShadowMatrix);a=d.program.getUniforms();a=gb.seqWithValue(a.seq,c);d.uniformsList=a}function t(a,b,c,d){G=0;var e=U.get(c);ga&&(Ud||a!==P)&&Fa.setState(c.clippingPlanes,\nc.clipIntersection,c.clipShadows,a,e,a===P&&c.id===V);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==sa.state.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Fa.numPlanes&&e.numIntersection===Fa.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(n(c,b,d),c.needsUpdate=!1);var f=!1,g=!1,h=!1,l=e.program,k=l.getUniforms(),q=e.shader.uniforms;ba.useProgram(l.program)&&(h=g=f=!0);c.id!==V&&(V=c.id,g=!0);if(f||\na!==P){k.setValue(F,\"projectionMatrix\",a.projectionMatrix);Z.logarithmicDepthBuffer&&k.setValue(F,\"logDepthBufFC\",2/(Math.log(a.far+1)/Math.LN2));P!==(aa||a)&&(P=aa||a,h=g=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)f=k.map.cameraPosition,void 0!==f&&f.setValue(F,Nb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&k.setValue(F,\"viewMatrix\",\na.matrixWorldInverse)}if(c.skinning&&(k.setOptional(F,d,\"bindMatrix\"),k.setOptional(F,d,\"bindMatrixInverse\"),a=d.skeleton))if(f=a.bones,Z.floatVertexTextures){if(void 0===a.boneTexture){var f=Math.sqrt(4*f.length),f=R.ceilPowerOfTwo(f),f=Math.max(f,4),t=new Float32Array(f*f*4);t.set(a.boneMatrices);var u=new fb(t,f,f,1023,1015);a.boneMatrices=t;a.boneTexture=u;a.boneTextureSize=f}k.setValue(F,\"boneTexture\",a.boneTexture);k.setValue(F,\"boneTextureSize\",a.boneTextureSize)}else k.setOptional(F,a,\"boneMatrices\");\ng&&(k.setValue(F,\"toneMappingExposure\",L.toneMappingExposure),k.setValue(F,\"toneMappingWhitePoint\",L.toneMappingWhitePoint),c.lights&&(g=h,q.ambientLightColor.needsUpdate=g,q.directionalLights.needsUpdate=g,q.pointLights.needsUpdate=g,q.spotLights.needsUpdate=g,q.rectAreaLights.needsUpdate=g,q.hemisphereLights.needsUpdate=g),b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&(q.fogDensity.value=b.density)),c.isMeshBasicMaterial?r(q,c):c.isMeshLambertMaterial?\n(r(q,c),c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(r(q,c),c.isMeshToonMaterial?(m(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):m(q,c)):c.isMeshStandardMaterial?(r(q,c),c.isMeshPhysicalMaterial&&(q.clearCoat.value=c.clearCoat,q.clearCoatRoughness.value=c.clearCoatRoughness),q.roughness.value=c.roughness,q.metalness.value=c.metalness,c.roughnessMap&&(q.roughnessMap.value=c.roughnessMap),c.metalnessMap&&(q.metalnessMap.value=c.metalnessMap),c.emissiveMap&&\n(q.emissiveMap.value=c.emissiveMap),c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias),c.envMap&&(q.envMapIntensity.value=c.envMapIntensity)):c.isMeshDepthMaterial?(r(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=\nc.displacementScale,q.displacementBias.value=c.displacementBias)):c.isMeshDistanceMaterial?(r(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias),q.referencePosition.value.copy(c.referencePosition),q.nearDistance.value=c.nearDistance,q.farDistance.value=c.farDistance):c.isMeshNormalMaterial?(r(q,c),c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=\nc.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias)):c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,c.isLineDashedMaterial&&(q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale)):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*O,q.scale.value=\n.5*fa,q.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&(b=c.map.offset,g=c.map.repeat,h=c.map.center,c.map.matrix.setUvTransform(b.x,b.y,g.x,g.y,c.map.rotation,h.x,h.y)),q.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(q.color.value=c.color,q.opacity.value=c.opacity),void 0!==q.ltcMat&&(q.ltcMat.value=E.LTC_MAT_TEXTURE),void 0!==q.ltcMag&&(q.ltcMag.value=E.LTC_MAG_TEXTURE),gb.upload(F,e.uniformsList,q,L));k.setValue(F,\"modelViewMatrix\",d.modelViewMatrix);k.setValue(F,\"normalMatrix\",\nd.normalMatrix);k.setValue(F,\"modelMatrix\",d.matrixWorld);return l}function r(a,b){a.opacity.value=b.opacity;b.color&&(a.diffuse.value=b.color);b.emissive&&a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);b.map&&(a.map.value=b.map);b.alphaMap&&(a.alphaMap.value=b.alphaMap);b.specularMap&&(a.specularMap.value=b.specularMap);b.envMap&&(a.envMap.value=b.envMap,a.flipEnvMap.value=b.envMap&&b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio);\nb.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap:b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);if(void 0!==c){c.isWebGLRenderTarget&&(c=c.texture);if(!0===c.matrixAutoUpdate){b=\nc.offset;var d=c.repeat,e=c.center;c.matrix.setUvTransform(b.x,b.y,d.x,d.y,c.rotation,e.x,e.y)}a.uvTransform.value.copy(c.matrix)}}function m(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=\nb.displacementScale,a.displacementBias.value=b.displacementBias)}console.log(\"THREE.WebGLRenderer\",\"88\");a=a||{};var v=void 0!==a.canvas?a.canvas:document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\"),w=void 0!==a.context?a.context:null,x=void 0!==a.alpha?a.alpha:!1,z=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,B=void 0!==a.antialias?a.antialias:!1,J=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,ta=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,y=\n[],C=[],A=null,D=[],Va=[];this.domElement=v;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var L=this,Y=!1,H=null,M=null,V=-1,N=\"\",P=null,aa=null,Q=new da,S=new da,W=null,G=0,X=v.width,\nfa=v.height,O=1,ca=new da(0,0,X,fa),ea=new da(0,0,X,fa),Oe=!1,Td=new ld,Fa=new qg,ga=!1,Ud=!1,md=new K,Nb=new p,Vd={geometries:0,textures:0},Ra={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:Ra,memory:Vd,programs:null};try{x={alpha:x,depth:z,stencil:I,antialias:B,premultipliedAlpha:J,preserveDrawingBuffer:ta};var F=w||v.getContext(\"webgl\",x)||v.getContext(\"experimental-webgl\",x);if(null===F){if(null!==v.getContext(\"webgl\"))throw\"Error creating WebGL context with your selected attributes.\";\nthrow\"Error creating WebGL context.\";}void 0===F.getShaderPrecisionFormat&&(F.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});v.addEventListener(\"webglcontextlost\",c,!1);v.addEventListener(\"webglcontextrestored\",d,!1)}catch(rg){console.error(\"THREE.WebGLRenderer: \"+rg)}var ia,Z,ba,U,T,na,pa,ra,sa,ma,qa,ja,va,wa,xa,ya,Aa,oa;b();var ka=new og(L);this.vr=ka;var Ca=new Ie(L,ra,Z.maxTextureSize);this.shadowMap=Ca;this.getContext=function(){return F};this.getContextAttributes=\nfunction(){return F.getContextAttributes()};this.forceContextLoss=function(){var a=ia.get(\"WEBGL_lose_context\");a&&a.loseContext()};this.forceContextRestore=function(){var a=ia.get(\"WEBGL_lose_context\");a&&a.restoreContext()};this.getPixelRatio=function(){return O};this.setPixelRatio=function(a){void 0!==a&&(O=a,this.setSize(X,fa,!1))};this.getSize=function(){return{width:X,height:fa}};this.setSize=function(a,b,c){var d=ka.getDevice();d&&d.isPresenting?console.warn(\"THREE.WebGLRenderer: Can't change size while VR device is presenting.\"):\n(X=a,fa=b,v.width=a*O,v.height=b*O,!1!==c&&(v.style.width=a+\"px\",v.style.height=b+\"px\"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:X*O,height:fa*O}};this.setDrawingBufferSize=function(a,b,c){X=a;fa=b;O=c;v.width=a*c;v.height=b*c;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){ca.set(a,fa-b-d,c,d);ba.viewport(Q.copy(ca).multiplyScalar(O))};this.setScissor=function(a,b,c,d){ea.set(a,fa-b-d,c,d);ba.scissor(S.copy(ea).multiplyScalar(O))};this.setScissorTest=\nfunction(a){ba.setScissorTest(Oe=a)};this.getClearColor=function(){return ja.getClearColor()};this.setClearColor=function(){ja.setClearColor.apply(ja,arguments)};this.getClearAlpha=function(){return ja.getClearAlpha()};this.setClearAlpha=function(){ja.setClearAlpha.apply(ja,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=F.COLOR_BUFFER_BIT;if(void 0===b||b)d|=F.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=F.STENCIL_BUFFER_BIT;F.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};\nthis.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.dispose=function(){v.removeEventListener(\"webglcontextlost\",c,!1);v.removeEventListener(\"webglcontextrestored\",d,!1);qa.dispose();ka.dispose()};this.renderBufferImmediate=function(a,b,c){ba.initAttributes();var d=U.get(a);a.hasPositions&&!d.position&&(d.position=F.createBuffer());a.hasNormals&&!d.normal&&(d.normal=F.createBuffer());\na.hasUvs&&!d.uv&&(d.uv=F.createBuffer());a.hasColors&&!d.color&&(d.color=F.createBuffer());b=b.getAttributes();a.hasPositions&&(F.bindBuffer(F.ARRAY_BUFFER,d.position),F.bufferData(F.ARRAY_BUFFER,a.positionArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.position),F.vertexAttribPointer(b.position,3,F.FLOAT,!1,0,0));if(a.hasNormals){F.bindBuffer(F.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&!0===c.flatShading)for(var e=0,f=3*a.count;e<f;e+=9){var g=\na.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,l=(g[e+1]+g[e+4]+g[e+7])/3,k=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=l;g[e+2]=k;g[e+3]=h;g[e+4]=l;g[e+5]=k;g[e+6]=h;g[e+7]=l;g[e+8]=k}F.bufferData(F.ARRAY_BUFFER,a.normalArray,F.DYNAMIC_DRAW);ba.enableAttribute(b.normal);F.vertexAttribPointer(b.normal,3,F.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(F.bindBuffer(F.ARRAY_BUFFER,d.uv),F.bufferData(F.ARRAY_BUFFER,a.uvArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.uv),F.vertexAttribPointer(b.uv,2,F.FLOAT,!1,0,0));a.hasColors&&\n0!==c.vertexColors&&(F.bindBuffer(F.ARRAY_BUFFER,d.color),F.bufferData(F.ARRAY_BUFFER,a.colorArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.color),F.vertexAttribPointer(b.color,3,F.FLOAT,!1,0,0));ba.disableUnusedAttributes();F.drawArrays(F.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){ba.setMaterial(d);var g=t(a,b,d,e);a=c.id+\"_\"+g.id+\"_\"+(!0===d.wireframe);var h=!1;a!==N&&(N=a,h=!0);e.morphTargetInfluences&&(va.update(e,c,d,g),h=!0);var l=c.index,k=c.attributes.position;\nb=1;!0===d.wireframe&&(l=pa.getWireframeAttribute(c),b=2);a=wa;if(null!==l){var n=na.get(l);a=xa;a.setIndex(n)}if(h){h=void 0;if(c&&c.isInstancedBufferGeometry&&null===ia.get(\"ANGLE_instanced_arrays\"))console.error(\"THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");else{void 0===h&&(h=0);ba.initAttributes();var q=c.attributes,g=g.getAttributes(),r=d.defaultAttributeValues;for(J in g){var m=g[J];if(0<=m){var u=\nq[J];if(void 0!==u){var p=u.normalized,v=u.itemSize,w=na.get(u);if(void 0!==w){var z=w.buffer,x=w.type,w=w.bytesPerElement;if(u.isInterleavedBufferAttribute){var B=u.data,I=B.stride,u=u.offset;B&&B.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(m,B.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=B.meshPerAttribute*B.count)):ba.enableAttribute(m);F.bindBuffer(F.ARRAY_BUFFER,z);F.vertexAttribPointer(m,v,x,p,I*w,(h*I+u)*w)}else u.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(m,\nu.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):ba.enableAttribute(m),F.bindBuffer(F.ARRAY_BUFFER,z),F.vertexAttribPointer(m,v,x,p,0,h*v*w)}}else if(void 0!==r&&(p=r[J],void 0!==p))switch(p.length){case 2:F.vertexAttrib2fv(m,p);break;case 3:F.vertexAttrib3fv(m,p);break;case 4:F.vertexAttrib4fv(m,p);break;default:F.vertexAttrib1fv(m,p)}}}ba.disableUnusedAttributes()}null!==l&&F.bindBuffer(F.ELEMENT_ARRAY_BUFFER,n.buffer)}n=0;null!==l?n=l.count:void 0!==\nk&&(n=k.count);l=c.drawRange.start*b;k=null!==f?f.start*b:0;var J=Math.max(l,k);f=Math.max(0,Math.min(n,l+c.drawRange.count*b,k+(null!==f?f.count*b:Infinity))-1-J+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ba.setLineWidth(d.wireframeLinewidth*(null===H?O:1)),a.setMode(F.LINES);else switch(e.drawMode){case 0:a.setMode(F.TRIANGLES);break;case 1:a.setMode(F.TRIANGLE_STRIP);break;case 2:a.setMode(F.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ba.setLineWidth(d*(null===H?O:1)),e.isLineSegments?\na.setMode(F.LINES):e.isLineLoop?a.setMode(F.LINE_LOOP):a.setMode(F.LINE_STRIP)):e.isPoints&&a.setMode(F.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,J,f):a.render(J,f)}};this.compile=function(a,b){y.length=0;C.length=0;a.traverse(function(a){a.isLight&&(y.push(a),a.castShadow&&C.push(a))});sa.setup(y,C,b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)n(b.material[c],a.fog,b);else n(b.material,a.fog,b)})};\nvar Da=!1,Ba=null;this.animate=function(a){Ba=a;Da||((a=ka.getDevice())&&a.isPresenting?a.requestAnimationFrame(h):window.requestAnimationFrame(h),Da=!0)};this.render=function(a,b,c,d){if(!b||!b.isCamera)console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\");else if(!Y){N=\"\";V=-1;P=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();ka.enabled&&(b=ka.getCamera(b));md.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Td.setFromMatrix(md);\ny.length=0;C.length=0;D.length=0;Va.length=0;Ud=this.localClippingEnabled;ga=Fa.init(this.clippingPlanes,Ud,b);A=qa.get(a,b);A.init();k(a,b,L.sortObjects);!0===L.sortObjects&&A.sort();ga&&Fa.beginShadows();Ca.render(C,a,b);sa.setup(y,C,b);ga&&Fa.endShadows();Ra.frame++;Ra.calls=0;Ra.vertices=0;Ra.faces=0;Ra.points=0;void 0===c&&(c=null);this.setRenderTarget(c);ja.render(A,a,b,d);d=A.opaque;var e=A.transparent;if(a.overrideMaterial){var f=a.overrideMaterial;d.length&&l(d,a,b,f);e.length&&l(e,a,b,f)}else d.length&&\nl(d,a,b),e.length&&l(e,a,b);Aa.render(D,a,b);ya.render(Va,a,b,Q);c&&T.updateRenderTargetMipmap(c);ba.buffers.depth.setTest(!0);ba.buffers.depth.setMask(!0);ba.buffers.color.setMask(!0);ba.setPolygonOffset(!1);ka.enabled&&ka.submitFrame()}};this.setFaceCulling=function(a,b){ba.setCullFace(a);ba.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=G;a>=Z.maxTextures&&console.warn(\"THREE.WebGLRenderer: Trying to use \"+a+\" texture units while this GPU supports only \"+Z.maxTextures);G+=1;return a};\nthis.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn(\"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\"),a=!0),b=b.texture);T.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn(\"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\"),a=!0);T.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&\nb.isWebGLRenderTargetCube&&(a||(console.warn(\"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\"),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?T.setTextureCube(b,c):T.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return H};this.setRenderTarget=function(a){(H=a)&&void 0===U.get(a).__webglFramebuffer&&T.setupRenderTarget(a);var b=null,c=!1;a?(b=U.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&\n(b=b[a.activeCubeFace],c=!0),Q.copy(a.viewport),S.copy(a.scissor),W=a.scissorTest):(Q.copy(ca).multiplyScalar(O),S.copy(ea).multiplyScalar(O),W=Oe);M!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),M=b);ba.viewport(Q);ba.scissor(S);ba.setScissorTest(W);c&&(c=U.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=U.get(a).__webglFramebuffer;\nif(g){var h=!1;g!==M&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var l=a.texture,k=l.format,n=l.type;1023!==k&&oa.convert(k)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.\"):1009===n||oa.convert(n)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ia.get(\"OES_texture_float\")||ia.get(\"WEBGL_color_buffer_float\"))||1016===n&&ia.get(\"EXT_color_buffer_half_float\")?\nF.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,oa.convert(k),oa.convert(n),f):console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.\"):console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.\")}finally{h&&F.bindFramebuffer(F.FRAMEBUFFER,M)}}}else console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.\")}}\nfunction Ob(a,b){this.name=\"\";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Pb(a,b,c){this.name=\"\";this.color=new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function od(){A.call(this);this.type=\"Scene\";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Xd(a,b,c,d,e){A.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function Za(a){Q.call(this);this.type=\"SpriteMaterial\";\nthis.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Cc(a){A.call(this);this.type=\"Sprite\";this.material=void 0!==a?a:new Za}function Dc(){A.call(this);this.type=\"LOD\";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Ec(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn(\"THREE.Skeleton boneInverses is the wrong length.\"),\nthis.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new K)}function pd(){A.call(this);this.type=\"Bone\"}function qd(a,b){pa.call(this,a,b);this.type=\"SkinnedMesh\";this.bindMode=\"attached\";this.bindMatrix=new K;this.bindMatrixInverse=new K;a=this.initBones();a=new Ec(a);this.bind(a,this.matrixWorld);this.normalizeSkinWeights()}function O(a){Q.call(this);this.type=\"LineBasicMaterial\";this.color=new H(16777215);this.linewidth=1;this.linejoin=this.linecap=\"round\";this.lights=!1;\nthis.setValues(a)}function ma(a,b,c){if(1===c)return console.warn(\"THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.\"),new ca(a,b);A.call(this);this.type=\"Line\";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new O({color:16777215*Math.random()})}function ca(a,b){ma.call(this,a,b);this.type=\"LineSegments\"}function rd(a,b){ma.call(this,a,b);this.type=\"LineLoop\"}function Ba(a){Q.call(this);this.type=\"PointsMaterial\";this.color=new H(16777215);\nthis.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Qb(a,b){A.call(this);this.type=\"Points\";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Ba({color:16777215*Math.random()})}function Fc(){A.call(this);this.type=\"Group\"}function sd(a,b,c,d,e,f,g,h,k){function l(){var a=q.image;a.readyState>=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0);requestAnimationFrame(l)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;requestAnimationFrame(l)}\nfunction Rb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Gc(a,b,c,d,e,f,g,h,k,l){l=void 0!==l?l:1026;if(1026!==l&&1027!==l)throw Error(\"DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat\");void 0===c&&1026===l&&(c=1012);void 0===c&&1027===l&&(c=1020);ea.call(this,null,d,e,f,g,h,l,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==\nh?h:1003;this.generateMipmaps=this.flipY=!1}function Sb(a){D.call(this);this.type=\"WireframeGeometry\";var b=[],c,d,e,f=[0,0],g={},h=[\"a\",\"b\",\"c\"];if(a&&a.isGeometry){var k=a.faces;var l=0;for(d=k.length;l<d;l++){var q=k[l];for(c=0;3>c;c++){var n=q[h[c]];var t=q[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+\",\"+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)l=g[n],h=a.vertices[l.index1],b.push(h.x,h.y,h.z),h=a.vertices[l.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry){var h=\nnew p;if(null!==a.index){k=a.attributes.position;q=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:q.count,materialIndex:0}]);a=0;for(e=r.length;a<e;++a)for(l=r[a],c=l.start,d=l.count,l=c,d=c+d;l<d;l+=3)for(c=0;3>c;c++)n=q.getX(l+c),t=q.getX(l+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+\",\"+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)l=g[n],h.fromBufferAttribute(k,l.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,l.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,\nl=0,d=k.count/3;l<d;l++)for(c=0;3>c;c++)g=3*l+c,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z),g=3*l+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z)}this.addAttribute(\"position\",new y(b,3))}function Hc(a,b,c){N.call(this);this.type=\"ParametricGeometry\";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Tb(a,b,c));this.mergeVertices()}function Tb(a,b,c){D.call(this);this.type=\"ParametricBufferGeometry\";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=\nnew p,k=new p,l=new p,q=new p,n=new p,t,r,m=b+1;for(t=0;t<=c;t++){var v=t/c;for(r=0;r<=b;r++){var w=r/b,k=a(w,v,k);e.push(k.x,k.y,k.z);0<=w-1E-5?(l=a(w-1E-5,v,l),q.subVectors(k,l)):(l=a(w+1E-5,v,l),q.subVectors(l,k));0<=v-1E-5?(l=a(w,v-1E-5,l),n.subVectors(k,l)):(l=a(w,v+1E-5,l),n.subVectors(l,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(w,v)}}for(t=0;t<c;t++)for(r=0;r<b;r++)a=t*m+r+1,h=(t+1)*m+r+1,k=(t+1)*m+r,d.push(t*m+r,a,k),d.push(a,h,k);this.setIndex(d);this.addAttribute(\"position\",\nnew y(e,3));this.addAttribute(\"normal\",new y(f,3));this.addAttribute(\"uv\",new y(g,2))}function Ic(a,b,c,d){N.call(this);this.type=\"PolyhedronGeometry\";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new qa(a,b,c,d));this.mergeVertices()}function qa(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.call(this);this.type=\"PolyhedronBufferGeometry\";\nthis.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k,l,m=c,x=d,z=g,I=Math.pow(2,a),B=[];for(l=0;l<=I;l++){B[l]=[];var J=m.clone().lerp(z,l/I),y=x.clone().lerp(z,l/I),C=I-l;for(k=0;k<=C;k++)B[l][k]=0===k&&l===I?J:J.clone().lerp(y,k/C)}for(l=0;l<I;l++)for(k=0;k<2*(I-l)-1;k++)m=Math.floor(k/2),0===k%2?(e(B[l][m+1]),e(B[l+1][m]),e(B[l][m])):(e(B[l][m+1]),e(B[l+1][m+\n1]),e(B[l+1][m]))}})(d);(function(a){for(var b=new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new p,b=new p,c=new p,d=new p,e=new C,f=new C,m=new C,w=0,x=0;w<h.length;w+=9,x+=6){a.set(h[w+0],h[w+1],h[w+2]);b.set(h[w+3],h[w+4],h[w+\n5]);c.set(h[w+6],h[w+7],h[w+8]);e.set(k[x+0],k[x+1]);f.set(k[x+2],k[x+3]);m.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var z=Math.atan2(d.z,-d.x);g(e,x+0,a,z);g(f,x+2,b,z);g(m,x+4,c,z)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute(\"position\",new y(h,3));this.addAttribute(\"normal\",new y(h.slice(),3));this.addAttribute(\"uv\",new y(k,2));0===d?this.computeVertexNormals():\nthis.normalizeNormals()}function Jc(a,b){N.call(this);this.type=\"TetrahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){qa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type=\"TetrahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Kc(a,b){N.call(this);this.type=\"OctahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new nb(a,b));this.mergeVertices()}\nfunction nb(a,b){qa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type=\"OctahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Lc(a,b){N.call(this);this.type=\"IcosahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Vb(a,b));this.mergeVertices()}function Vb(a,b){var c=(1+Math.sqrt(5))/2;qa.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,\n5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type=\"IcosahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Mc(a,b){N.call(this);this.type=\"DodecahedronGeometry\";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Wb(a,b));this.mergeVertices()}function Wb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;qa.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,\nd,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type=\"DodecahedronBufferGeometry\";this.parameters={radius:a,detail:b}}function Nc(a,b,c,d,e,f){N.call(this);this.type=\"TubeGeometry\";this.parameters={path:a,\ntubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn(\"THREE.TubeGeometry: taper has been removed.\");a=new Xb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Xb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var l=t/d*Math.PI*2,n=Math.sin(l),l=-Math.cos(l);k.x=l*f.x+n*e.x;k.y=l*f.y+n*e.y;k.z=l*f.z+n*e.z;k.normalize();u.push(k.x,\nk.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z=q.z+c*k.z;m.push(h.x,h.y,h.z)}}D.call(this);this.type=\"TubeBufferGeometry\";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,l=new C,q=new p,n,t,m=[],u=[],v=[],w=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)l.x=n/b,l.y=t/d,v.push(l.x,l.y);(function(){for(t=\n1;t<=b;t++)for(n=1;n<=d;n++){var a=(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;w.push((d+1)*(t-1)+(n-1),a,e);w.push(a,c,e)}})();this.setIndex(w);this.addAttribute(\"position\",new y(m,3));this.addAttribute(\"normal\",new y(u,3));this.addAttribute(\"uv\",new y(v,2))}function Oc(a,b,c,d,e,f,g){N.call(this);this.type=\"TorusKnotGeometry\";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn(\"THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.\");\nthis.fromBufferGeometry(new Yb(a,b,c,d,e,f));this.mergeVertices()}function Yb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}D.call(this);this.type=\"TorusKnotBufferGeometry\";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],l=[],q=[],n,t=new p,m=new p,u=new p,v=new p,w=new p,x=new p,z=new p;for(n=0;n<=\nc;++n){var I=n/c*e*Math.PI*2;g(I,e,f,a,u);g(I+.01,e,f,a,v);x.subVectors(v,u);z.addVectors(v,u);w.crossVectors(x,z);z.crossVectors(w,x);w.normalize();z.normalize();for(I=0;I<=d;++I){var B=I/d*Math.PI*2,J=-b*Math.cos(B),B=b*Math.sin(B);t.x=u.x+(J*z.x+B*w.x);t.y=u.y+(J*z.y+B*w.y);t.z=u.z+(J*z.z+B*w.z);k.push(t.x,t.y,t.z);m.subVectors(t,u).normalize();l.push(m.x,m.y,m.z);q.push(n/c);q.push(I/d)}}for(I=1;I<=c;I++)for(n=1;n<=d;n++)a=(d+1)*I+(n-1),b=(d+1)*I+n,e=(d+1)*(I-1)+n,h.push((d+1)*(I-1)+(n-1),a,e),\nh.push(a,b,e);this.setIndex(h);this.addAttribute(\"position\",new y(k,3));this.addAttribute(\"normal\",new y(l,3));this.addAttribute(\"uv\",new y(q,2))}function Pc(a,b,c,d,e){N.call(this);this.type=\"TorusGeometry\";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Zb(a,b,c,d,e));this.mergeVertices()}function Zb(a,b,c,d,e){D.call(this);this.type=\"TorusBufferGeometry\";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||\n.4;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],l=new p,q=new p,n=new p,t,m;for(t=0;t<=c;t++)for(m=0;m<=d;m++){var u=m/d*e,v=t/c*Math.PI*2;q.x=(a+b*Math.cos(v))*Math.cos(u);q.y=(a+b*Math.cos(v))*Math.sin(u);q.z=b*Math.sin(v);g.push(q.x,q.y,q.z);l.x=a*Math.cos(u);l.y=a*Math.sin(u);n.subVectors(q,l).normalize();h.push(n.x,n.y,n.z);k.push(m/d);k.push(t/c)}for(t=1;t<=c;t++)for(m=1;m<=d;m++)a=(d+1)*(t-1)+m-1,b=(d+1)*(t-1)+m,e=(d+1)*t+m,f.push((d+1)*t+m-1,a,e),f.push(a,b,\ne);this.setIndex(f);this.addAttribute(\"position\",new y(g,3));this.addAttribute(\"normal\",new y(h,3));this.addAttribute(\"uv\",new y(k,2))}function $a(a,b){N.call(this);this.type=\"ExtrudeGeometry\";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ga(a,b));this.mergeVertices()}function Ga(a,b){\"undefined\"!==typeof a&&(D.call(this),this.type=\"ExtrudeBufferGeometry\",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Qc(a,b){N.call(this);this.type=\"TextGeometry\";\nthis.parameters={text:a,parameters:b};this.fromBufferGeometry(new $b(a,b));this.mergeVertices()}function $b(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error(\"THREE.TextGeometry: font parameter is not an instance of THREE.Font.\"),new N;a=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Ga.call(this,a,b);this.type=\"TextBufferGeometry\"}\nfunction Rc(a,b,c,d,e,f,g){N.call(this);this.type=\"SphereGeometry\";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new ob(a,b,c,d,e,f,g));this.mergeVertices()}function ob(a,b,c,d,e,f,g){D.call(this);this.type=\"SphereBufferGeometry\";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==\nd?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,l,q=0,n=[],t=new p,m=new p,u=[],v=[],w=[],x=[];for(l=0;l<=c;l++){var z=[],I=l/c;for(k=0;k<=b;k++){var B=k/b;t.x=-a*Math.cos(d+B*e)*Math.sin(f+I*g);t.y=a*Math.cos(f+I*g);t.z=a*Math.sin(d+B*e)*Math.sin(f+I*g);v.push(t.x,t.y,t.z);m.set(t.x,t.y,t.z).normalize();w.push(m.x,m.y,m.z);x.push(B,1-I);z.push(q++)}n.push(z)}for(l=0;l<c;l++)for(k=0;k<b;k++)a=n[l][k+1],d=n[l][k],e=n[l+1][k],g=n[l+1][k+1],(0!==l||0<f)&&u.push(a,d,\ng),(l!==c-1||h<Math.PI)&&u.push(d,e,g);this.setIndex(u);this.addAttribute(\"position\",new y(v,3));this.addAttribute(\"normal\",new y(w,3));this.addAttribute(\"uv\",new y(x,2))}function Sc(a,b,c,d,e,f){N.call(this);this.type=\"RingGeometry\";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new ac(a,b,c,d,e,f));this.mergeVertices()}function ac(a,b,c,d,e,f){D.call(this);this.type=\"RingBufferGeometry\";this.parameters={innerRadius:a,\nouterRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],l=[],q=a,n=(b-a)/d,t=new p,m=new C,u,v;for(u=0;u<=d;u++){for(v=0;v<=c;v++)a=e+v/c*f,t.x=q*Math.cos(a),t.y=q*Math.sin(a),h.push(t.x,t.y,t.z),k.push(0,0,1),m.x=(t.x/b+1)/2,m.y=(t.y/b+1)/2,l.push(m.x,m.y);q+=n}for(u=0;u<d;u++)for(b=u*(c+1),v=0;v<c;v++)a=v+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,\nf,q);this.setIndex(g);this.addAttribute(\"position\",new y(h,3));this.addAttribute(\"normal\",new y(k,3));this.addAttribute(\"uv\",new y(l,2))}function Tc(a,b,c,d){N.call(this);this.type=\"LatheGeometry\";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new bc(a,b,c,d));this.mergeVertices()}function bc(a,b,c,d){D.call(this);this.type=\"LatheBufferGeometry\";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=R.clamp(d,\n0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new p,l=new C,q;for(q=0;q<=b;q++){var n=c+q*h*d;var t=Math.sin(n),m=Math.cos(n);for(n=0;n<=a.length-1;n++)k.x=a[n].x*t,k.y=a[n].y,k.z=a[n].x*m,f.push(k.x,k.y,k.z),l.x=q/b,l.y=n/(a.length-1),g.push(l.x,l.y)}for(q=0;q<b;q++)for(n=0;n<a.length-1;n++)c=n+q*a.length,h=c+a.length,k=c+a.length+1,l=c+1,e.push(c,h,l),e.push(h,k,l);this.setIndex(e);this.addAttribute(\"position\",new y(f,3));this.addAttribute(\"uv\",new y(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=\nthis.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=q=0;q<a.length;q++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function cc(a,b){N.call(this);this.type=\"ShapeGeometry\";\"object\"===typeof b&&(console.warn(\"THREE.ShapeGeometry: Options parameter has been removed.\"),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new dc(a,\nb));this.mergeVertices()}function dc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var l=a.shape,q=a.holes;if(!1===Ha.isClockWise(l))for(l=l.reverse(),a=0,c=q.length;a<c;a++){var m=q[a];!0===Ha.isClockWise(m)&&(q[a]=m.reverse())}var p=Ha.triangulateShape(l,q);a=0;for(c=q.length;a<c;a++)m=q[a],l=l.concat(m);a=0;for(c=l.length;a<c;a++)m=l[a],e.push(m.x,m.y,0),f.push(0,0,1),g.push(m.x,m.y);a=0;for(c=p.length;a<c;a++)l=p[a],d.push(l[0]+h,l[1]+h,l[2]+h),k+=3}D.call(this);this.type=\"ShapeBufferGeometry\";\nthis.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var l=0;l<a.length;l++)c(a[l]),this.addGroup(h,k,l),h+=k,k=0;this.setIndex(d);this.addAttribute(\"position\",new y(e,3));this.addAttribute(\"normal\",new y(f,3));this.addAttribute(\"uv\",new y(g,2))}function ec(a,b){D.call(this);this.type=\"EdgesGeometry\";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(R.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=[\"a\",\"b\",\"c\"];if(a.isBufferGeometry){var g=\nnew N;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,k=g.length;h<k;h++)for(var l=g[h],q=0;3>q;q++){var n=l[f[q]];var t=l[f[(q+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+\",\"+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute(\"position\",\nnew y(c,3))}function pb(a,b,c,d,e,f,g,h){N.call(this);this.type=\"CylinderGeometry\";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Sa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Sa(a,b,c,d,e,f,g,h){function k(c){var e,f=new C,k=new p,r=0,v=!0===c?a:b,z=!0===c?1:-1;var y=u;for(e=1;e<=d;e++)n.push(0,w*z,0),t.push(0,z,0),m.push(.5,.5),u++;var A=u;for(e=0;e<=d;e++){var D=e/d*h+g,L=Math.cos(D),\nD=Math.sin(D);k.x=v*D;k.y=w*z;k.z=v*L;n.push(k.x,k.y,k.z);t.push(0,z,0);f.x=.5*L+.5;f.y=.5*D*z+.5;m.push(f.x,f.y);u++}for(e=0;e<d;e++)f=y+e,k=A+e,!0===c?q.push(k,k+1,f):q.push(k+1,k,f),r+=3;l.addGroup(x,r,!0===c?1:2);x+=r}D.call(this);this.type=\"CylinderBufferGeometry\";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var l=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:\n!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],n=[],t=[],m=[],u=0,v=[],w=c/2,x=0;(function(){var f,k,r=new p,J=new p,y=0,C=(b-a)/c;for(k=0;k<=e;k++){var A=[],D=k/e,E=D*(b-a)+a;for(f=0;f<=d;f++){var H=f/d,L=H*h+g,Y=Math.sin(L),L=Math.cos(L);J.x=E*Y;J.y=-D*c+w;J.z=E*L;n.push(J.x,J.y,J.z);r.set(Y,C,L).normalize();t.push(r.x,r.y,r.z);m.push(H,1-D);A.push(u++)}v.push(A)}for(f=0;f<d;f++)for(k=0;k<e;k++)r=v[k+1][f],J=v[k+1][f+1],C=v[k][f+1],q.push(v[k][f],r,C),q.push(r,J,C),y+=6;l.addGroup(x,y,0);\nx+=y})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute(\"position\",new y(n,3));this.addAttribute(\"normal\",new y(t,3));this.addAttribute(\"uv\",new y(m,2))}function Uc(a,b,c,d,e,f,g){pb.call(this,0,a,b,c,d,e,f,g);this.type=\"ConeGeometry\";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Vc(a,b,c,d,e,f,g){Sa.call(this,0,a,b,c,d,e,f,g);this.type=\"ConeBufferGeometry\";this.parameters={radius:a,height:b,radialSegments:c,\nheightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Wc(a,b,c,d){N.call(this);this.type=\"CircleGeometry\";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new fc(a,b,c,d));this.mergeVertices()}function fc(a,b,c,d){D.call(this);this.type=\"CircleBufferGeometry\";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],k,l=new p,q=new C;f.push(0,\n0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(k=3;n<=b;n++,k+=3){var t=c+n/b*d;l.x=a*Math.cos(t);l.y=a*Math.sin(t);f.push(l.x,l.y,l.z);g.push(0,0,1);q.x=(f[k]/a+1)/2;q.y=(f[k+1]/a+1)/2;h.push(q.x,q.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute(\"position\",new y(f,3));this.addAttribute(\"normal\",new y(g,3));this.addAttribute(\"uv\",new y(h,2))}function gc(a){Q.call(this);this.type=\"ShadowMaterial\";this.color=new H(0);this.opacity=1;this.transparent=this.lights=!0;this.setValues(a)}\nfunction hc(a){oa.call(this,a);this.type=\"RawShaderMaterial\"}function Ma(a){Q.call(this);this.defines={STANDARD:\"\"};this.type=\"MeshStandardMaterial\";this.color=new H(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=\n0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function qb(a){Ma.call(this);this.defines={PHYSICAL:\"\"};this.type=\"MeshPhysicalMaterial\";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ia(a){Q.call(this);this.type=\"MeshPhongMaterial\";\nthis.color=new H(16777215);this.specular=new H(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=\n!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function rb(a){Ia.call(this);this.defines={TOON:\"\"};this.type=\"MeshToonMaterial\";this.gradientMap=null;this.setValues(a)}function sb(a){Q.call(this);this.type=\"MeshNormalMaterial\";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=\n!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function tb(a){Q.call(this);this.type=\"MeshLambertMaterial\";this.color=new H(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new H(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=\n1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function ub(a){O.call(this);this.type=\"LineDashedMaterial\";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Yd(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,\nf,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=a}}function Ja(a){this.manager=void 0!==a?a:wa}function Qe(a){this.manager=void 0!==a?a:wa;this._parser=null}function Zd(a){this.manager=void 0!==a?a:wa;this._parser=null}function Xc(a){this.manager=void 0!==a?a:wa}function $d(a){this.manager=void 0!==a?a:wa}function td(a){this.manager=void 0!==a?a:wa}function ga(a,\nb){A.call(this);this.type=\"Light\";this.color=new H(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function ud(a,b,c){ga.call(this,a,c);this.type=\"HemisphereLight\";this.castShadow=void 0;this.position.copy(A.DefaultUp);this.updateMatrix();this.groundColor=new H(b)}function vb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new K}function vd(){vb.call(this,new U(50,1,.5,500))}function wd(a,b,c,d,e,f){ga.call(this,a,b);this.type=\"SpotLight\";\nthis.position.copy(A.DefaultUp);this.updateMatrix();this.target=new A;Object.defineProperty(this,\"power\",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new vd}function xd(a,b,c,d){ga.call(this,a,b);this.type=\"PointLight\";Object.defineProperty(this,\"power\",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=\na/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new vb(new U(90,1,.5,500))}function yd(){vb.call(this,new Kb(-5,5,5,-5,.5,500))}function zd(a,b){ga.call(this,a,b);this.type=\"DirectionalLight\";this.position.copy(A.DefaultUp);this.updateMatrix();this.target=new A;this.shadow=new yd}function Ad(a,b){ga.call(this,a,b);this.type=\"AmbientLight\";this.castShadow=void 0}function Bd(a,b,c,d){ga.call(this,a,b);this.type=\"RectAreaLight\";this.position.set(0,1,0);this.updateMatrix();\nthis.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function xa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Cd(a,b,c,d){xa.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Yc(a,b,c,d){xa.call(this,a,b,c,d)}function Dd(a,b,c,d){xa.call(this,a,b,c,d)}function wb(a,b,c,d){if(void 0===a)throw Error(\"track name is undefined\");if(void 0===b||0===\nb.length)throw Error(\"no keyframes in track named \"+a);this.name=a;this.times=T.convertArray(b,this.TimeBufferType);this.values=T.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function ic(a,b,c,d){wb.call(this,a,b,c,d)}function Ed(a,b,c,d){xa.call(this,a,b,c,d)}function Zc(a,b,c,d){wb.call(this,a,b,c,d)}function jc(a,b,c,d){wb.call(this,a,b,c,d)}function Fd(a,b,c,d){wb.call(this,a,b,c,d)}function Gd(a,b,c){wb.call(this,a,b,\nc)}function Hd(a,b,c,d){wb.call(this,a,b,c,d)}function xb(a,b,c,d){wb.apply(this,a,b,c,d)}function ka(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=R.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Id(a){this.manager=void 0!==a?a:wa;this.textures={}}function ae(a){this.manager=void 0!==a?a:wa}function kc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function be(a){\"boolean\"===typeof a&&(console.warn(\"THREE.JSONLoader: showStatus parameter has been removed from constructor.\"),\na=void 0);this.manager=void 0!==a?a:wa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:wa;this.texturePath=\"\"}function Se(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function yb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function zb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function S(){this.type=\"Curve\";this.arcLengthDivisions=200}function Ka(a,b){S.call(this);this.type=\"LineCurve\";this.v1=a||\nnew C;this.v2=b||new C}function Ab(){S.call(this);this.type=\"CurvePath\";this.curves=[];this.autoClose=!1}function Na(a,b,c,d,e,f,g,h){S.call(this);this.type=\"EllipseCurve\";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ab(a){S.call(this);this.type=\"SplineCurve\";this.points=a||[]}function bb(a,b,c,d){S.call(this);this.type=\"CubicBezierCurve\";this.v0=a||new C;this.v1=b||new C;this.v2=\nc||new C;this.v3=d||new C}function cb(a,b,c){S.call(this);this.type=\"QuadraticBezierCurve\";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C}function Bb(a){Ab.call(this);this.type=\"Path\";this.currentPoint=new C;a&&this.setFromPoints(a)}function Cb(a){Bb.call(this,a);this.type=\"Shape\";this.holes=[]}function ce(){this.type=\"ShapePath\";this.subPaths=[];this.currentPath=null}function de(a){this.type=\"Font\";this.data=a}function Te(a){this.manager=void 0!==a?a:wa}function ee(a){this.manager=void 0!==a?\na:wa}function Ue(){this.type=\"StereoCamera\";this.aspect=1;this.eyeSep=.064;this.cameraL=new U;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new U;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function $c(a,b,c){A.call(this);this.type=\"CubeCamera\";var d=new U(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new U(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new U(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));\nthis.add(f);var g=new U(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new U(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new U(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Ib(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name=\"CubeCamera\";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,l=c.texture.generateMipmaps;c.texture.generateMipmaps=\n!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=l;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function fe(){A.call(this);this.type=\"AudioListener\";this.context=ge.getContext();this.gain=\nthis.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function lc(a){A.call(this);this.type=\"Audio\";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType=\"empty\";this.filters=[]}function he(a){lc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}\nfunction ie(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function je(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case \"quaternion\":b=this._slerp;break;case \"string\":case \"bool\":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ve(a,\nb,c){c=c||na.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function na(a,b,c){this.path=b;this.parsedPath=c||na.parseTrackName(b);this.node=na.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(){this.uuid=R.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath=\n{};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function Xe(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=\nthis._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ye(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){\"string\"===typeof a&&(console.warn(\"THREE.Uniform: Type parameter is no longer needed.\"),\na=b);this.value=a}function ke(){D.call(this);this.type=\"InstancedBufferGeometry\";this.maxInstancedCount=void 0}function le(a,b,c,d){this.uuid=R.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function mc(a,b){this.uuid=R.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function me(a,b,c){mc.call(this,a,b);this.meshPerAttribute=c||1}function ne(a,\nb,c){P.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new lb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn(\"THREE.Raycaster: params.PointCloud has been renamed to params.Points.\");return this.Points}}})}function $e(a,b){return a.distance-b.distance}function oe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=\na.length;d<e;d++)oe(a[d],b,c,!0)}}function af(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function bf(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function cf(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ad(a){A.call(this);this.material=a;this.render=function(){}}function bd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:\n16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new D;b=new y(6*b,3);c.addAttribute(\"position\",b);ca.call(this,c,new O({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function nc(a,b){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new D;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,\nd=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute(\"position\",new y(b,3));b=new O({fog:!1});this.cone=new ca(a,b);this.add(this.cone);this.update()}function df(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,df(a.children[c]));return b}function oc(a){for(var b=df(a),c=new D,d=[],e=[],f=new H(0,0,1),g=new H(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,\n0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute(\"position\",new y(d,3));c.addAttribute(\"color\",new y(e,3));d=new O({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});ca.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function pc(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new ob(b,4,2);b=new va({wireframe:!0,fog:!1});pa.call(this,a,b);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}\nfunction qc(a,b){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new O({fog:!1});b=new D;b.addAttribute(\"position\",new P(new Float32Array(15),3));this.line=new ma(b,a);this.add(this.line);this.update()}function rc(a,b,c){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new nb(b);a.rotateY(.5*Math.PI);this.material=new va({wireframe:!0,fog:!1});void 0===\nthis.color&&(this.material.vertexColors=2);b=a.getAttribute(\"position\");b=new Float32Array(3*b.count);a.addAttribute(\"color\",new P(b,3));this.add(new pa(a,this.material));this.update()}function cd(a,b,c,d){a=a||10;b=b||10;c=new H(void 0!==c?c:4473924);d=new H(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,l=0,q=-g;k<=b;k++,q+=f){a.push(-g,0,q,g,0,q);a.push(q,0,-g,q,0,g);var n=k===e?c:d;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3;n.toArray(h,l);l+=3}b=new D;b.addAttribute(\"position\",\nnew y(a,3));b.addAttribute(\"color\",new y(h,3));c=new O({vertexColors:2});ca.call(this,b,c)}function Kd(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new H(void 0!==e?e:4473924);f=new H(void 0!==f?f:8947848);var g=[],h=[],k;for(k=0;k<=b;k++){var l=k/b*2*Math.PI;var q=Math.sin(l)*a;l=Math.cos(l)*a;g.push(0,0,0);g.push(q,0,l);var n=k&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(k=0;k<=c;k++){n=k&1?e:f;var t=a-a/c*k;for(b=0;b<d;b++)l=b/d*2*Math.PI,q=Math.sin(l)*t,l=Math.cos(l)*t,g.push(q,0,l),h.push(n.r,\nn.g,n.b),l=(b+1)/d*2*Math.PI,q=Math.sin(l)*t,l=Math.cos(l)*t,g.push(q,0,l),h.push(n.r,n.g,n.b)}a=new D;a.addAttribute(\"position\",new y(g,3));a.addAttribute(\"color\",new y(h,3));g=new O({vertexColors:2});ca.call(this,a,g)}function dd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn(\"THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.\");c=new D;\nb=new y(6*b,3);c.addAttribute(\"position\",b);ca.call(this,c,new O({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function sc(a,b,c){A.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new D;a.addAttribute(\"position\",new y([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new O({fog:!1});this.lightPlane=new ma(a,b);this.add(this.lightPlane);a=new D;a.addAttribute(\"position\",new y([0,0,0,0,0,1],3));this.targetLine=\nnew ma(a,b);this.add(this.targetLine);this.update()}function ed(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new D,e=new O({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new H(16755200),l=new H(16711680),q=new H(43775),n=new H(16777215),t=new H(3355443);b(\"n1\",\"n2\",k);b(\"n2\",\"n4\",k);b(\"n4\",\"n3\",k);b(\"n3\",\"n1\",k);b(\"f1\",\"f2\",k);b(\"f2\",\"f4\",k);b(\"f4\",\"f3\",k);b(\"f3\",\"f1\",k);b(\"n1\",\"f1\",k);b(\"n2\",\"f2\",k);\nb(\"n3\",\"f3\",k);b(\"n4\",\"f4\",k);b(\"p\",\"n1\",l);b(\"p\",\"n2\",l);b(\"p\",\"n3\",l);b(\"p\",\"n4\",l);b(\"u1\",\"u2\",q);b(\"u2\",\"u3\",q);b(\"u3\",\"u1\",q);b(\"c\",\"t\",n);b(\"p\",\"c\",t);b(\"cn1\",\"cn2\",t);b(\"cn3\",\"cn4\",t);b(\"cf1\",\"cf2\",t);b(\"cf3\",\"cf4\",t);d.addAttribute(\"position\",new y(f,3));d.addAttribute(\"color\",new y(g,3));ca.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Db(a,b){this.object=\na;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new D;d.setIndex(new P(a,1));d.addAttribute(\"position\",new P(c,3));ca.call(this,d,new O({color:b}));this.matrixAutoUpdate=!1;this.update()}function fd(a,b){this.type=\"Box3Helper\";this.box=a;a=void 0!==b?b:16776960;b=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new D;c.setIndex(new P(b,1));c.addAttribute(\"position\",new y([1,1,1,-1,1,1,-1,-1,1,1,-1,\n1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));ca.call(this,c,new O({color:a}));this.geometry.computeBoundingSphere()}function gd(a,b,c){this.type=\"PlaneHelper\";this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new D;b.addAttribute(\"position\",new y([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));b.computeBoundingSphere();ma.call(this,b,new O({color:a}));b=new D;b.addAttribute(\"position\",new y([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();\nthis.add(new pa(b,new va({color:a,opacity:.2,transparent:!0,depthWrite:!1})))}function Eb(a,b,c,d,e,f){A.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Ld&&(Ld=new D,Ld.addAttribute(\"position\",new y([0,0,0,0,1,0],3)),pe=new Sa(0,.5,1,5,1),pe.translate(0,-.5,0));this.position.copy(b);this.line=new ma(Ld,new O({color:d}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new pa(pe,new va({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);\nthis.setDirection(a);this.setLength(c,e,f)}function hd(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new D;a.addAttribute(\"position\",new y(b,3));a.addAttribute(\"color\",new y([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new O({vertexColors:2});ca.call(this,a,b)}function qe(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,l,q){e=((f-e)/k-(g-e)/(k+l)+(g-f)/l)*l;h=((g-f)/\nl-(h-f)/(l+q)+(h-g)/q)*l;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function ya(a,b,c,d){S.call(this);this.type=\"CatmullRomCurve3\";this.points=a||[];this.closed=b||!1;this.curveType=c||\"centripetal\";this.tension=d||.5}function Fb(a,b,c,d){S.call(this);this.type=\"CubicBezierCurve3\";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function Gb(a,b,c){S.call(this);this.type=\"QuadraticBezierCurve3\";this.v0=a||new p;this.v1=b||new p;this.v2=\nc||new p}function db(a,b){S.call(this);this.type=\"LineCurve3\";this.v1=a||new p;this.v2=b||new p}function id(a,b,c,d,e,f){Na.call(this,a,b,c,c,d,e,f);this.type=\"ArcCurve\"}function ef(a){console.warn(\"THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.\");ya.call(this,a);this.type=\"catmullrom\";this.closed=!0}function ff(a){console.warn(\"THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.\");ya.call(this,a);this.type=\"catmullrom\"}function re(a){console.warn(\"THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.\");\nya.call(this,a);this.type=\"catmullrom\"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return\"number\"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1===\"name\"in Function.prototype&&Object.defineProperty(Function.prototype,\"name\",{get:function(){return this.toString().match(/^\\s*function\\s*([^\\(\\s]*)/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===\na||null===a)throw new TypeError(\"Cannot convert undefined or null to object\");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(ja.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;\nvar c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var b=b.slice(0),c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var R={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\".split(\"\"),\nb=0,c;return function(){for(var d=\"\",e=0;36>e;e++)8===e||13===e||18===e||23===e?d+=\"-\":14===e?d+=\"4\":(2>=b&&(b=33554432+16777216*Math.random()|0),c=b&15,b>>=4,d+=a[19===e?c&3|8:c]);return d}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,\nb,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*R.DEG2RAD},radToDeg:function(a){return a*R.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,\nMath.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;\ndefault:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},\naddScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;\nreturn this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=\nMath.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);\nthis.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+\nMath.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=\n(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn(\"THREE.Vector2: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);\nreturn this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(K.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,l,q,n,t,m,p,v){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=k;r[6]=l;r[10]=q;r[14]=n;r[3]=t;r[7]=m;r[11]=p;r[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},\ncopy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,\nb.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error(\"THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.\");\nvar b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if(\"XYZ\"===a.order){var k=f*h;var l=f*e;var q=c*h;a=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+q*d;b[5]=k-a*d;b[9]=-c*g;b[2]=a-k*d;b[6]=q+l*d;b[10]=f*g}else\"YXZ\"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k+a*c,b[4]=q*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-q,b[6]=a+k*c,b[10]=f*g):\"ZXY\"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k-a*c,b[4]=-f*e,b[8]=q+l*c,b[1]=l+q*c,b[5]=f*h,b[9]=\na-k*c,b[2]=-f*d,b[6]=c,b[10]=f*g):\"ZYX\"===a.order?(k=f*h,l=f*e,q=c*h,a=c*e,b[0]=g*h,b[4]=q*d-l,b[8]=k*d+a,b[1]=g*e,b[5]=a*d+k,b[9]=l*d-q,b[2]=-d,b[6]=c*g,b[10]=f*g):\"YZX\"===a.order?(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=a-k*e,b[8]=q*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+q,b[10]=k-a*e):\"XZY\"===a.order&&(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=k*e+a,b[5]=f*h,b[9]=l*e-q,b[2]=q*e-l,b[6]=c*h,b[10]=a*e+k);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=\nthis.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var l=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,\nc.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.\"),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;\nb=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],l=c[9],q=c[13],n=c[2],m=c[6],r=c[10],p=c[14],v=c[3],w=c[7],x=c[11],c=c[15],z=d[0],I=d[4],B=d[8],J=d[12],y=d[1],C=d[5],A=d[9],D=d[13],E=d[2],H=d[6],L=d[10],Y=d[14],N=d[3],M=d[7],V=d[11],d=d[15];b[0]=a*z+e*y+f*E+g*N;b[4]=a*I+e*C+f*H+g*M;b[8]=a*B+e*A+f*L+g*V;b[12]=a*J+e*D+f*Y+g*d;b[1]=h*z+k*y+l*E+q*N;b[5]=h*I+k*C+l*H+q*M;b[9]=h*B+k*A+l*L+q*V;b[13]=h*J+k*D+l*Y+q*d;b[2]=n*z+m*y+r*E+p*N;b[6]=n*I+m*C+r*H+p*M;b[10]=n*B+m*A+r*L+p*V;b[14]=n*J+m*\nD+r*Y+p*d;b[3]=v*z+w*y+x*E+c*N;b[7]=v*I+w*C+x*H+c*M;b[11]=v*B+w*A+x*L+c*V;b[15]=v*J+w*D+x*Y+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=\nthis.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],l=a[2],q=a[6],n=a[10],m=a[14];return a[3]*(+e*h*q-d*k*q-e*g*n+c*k*n+d*g*m-c*h*m)+a[7]*(+b*h*m-b*k*n+e*f*n-d*f*m+d*k*l-e*h*l)+a[11]*(+b*k*q-b*g*m-e*f*q+c*f*m+e*g*l-c*k*l)+a[15]*(-d*g*l-b*h*q+b*g*n+d*f*q-c*f*n+c*h*l)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=\nthis.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements;a=d[0];var e=d[1],f=d[2],g=d[3],h=d[4],k=d[5],l=d[6],q=d[7],n=d[8],m=d[9],r=d[10],p=d[11],v=d[12],w=d[13],x=d[14],d=d[15],z=m*x*q-w*r*q+w*l*p-k*x*p-m*l*d+k*r*d,I=v*r*q-n*x*q-v*l*p+h*x*p+n*l*d-h*r*d,B=n*w*q-v*m*q+v*k*p-h*w*p-n*k*d+h*m*d,J=v*m*l-n*w*l-v*k*r+h*w*r+n*k*x-h*m*x,y=a*z+e*I+f*B+g*J;if(0===y){if(!0===b)throw Error(\"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\");\nconsole.warn(\"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\");return this.identity()}b=1/y;c[0]=z*b;c[1]=(w*r*g-m*x*g-w*f*p+e*x*p+m*f*d-e*r*d)*b;c[2]=(k*x*g-w*l*g+w*f*q-e*x*q-k*f*d+e*l*d)*b;c[3]=(m*l*g-k*r*g-m*f*q+e*r*q+k*f*p-e*l*p)*b;c[4]=I*b;c[5]=(n*x*g-v*r*g+v*f*p-a*x*p-n*f*d+a*r*d)*b;c[6]=(v*l*g-h*x*g-v*f*q+a*x*q+h*f*d-a*l*d)*b;c[7]=(h*r*g-n*l*g+n*f*q-a*r*q-h*f*p+a*l*p)*b;c[8]=B*b;c[9]=(v*m*g-n*w*g-v*e*p+a*w*p+n*e*d-a*m*d)*b;c[10]=(h*w*g-v*k*g+v*e*q-a*w*q-h*e*d+a*k*d)*b;c[11]=\n(n*k*g-h*m*g-n*e*q+a*m*q+h*e*p-a*k*p)*b;c[12]=J*b;c[13]=(n*w*f-v*m*f+v*e*r-a*w*r-n*e*x+a*m*x)*b;c[14]=(v*k*f-h*w*f-v*e*l+a*w*l+h*e*x-a*k*x)*b;c[15]=(h*m*f-n*k*f+n*e*l-a*m*l-h*e*r+a*k*r)*b;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],\na[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=\nMath.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new p,b=new K;return function(c,\nd,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,l=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=l;b.elements[9]*=l;b.elements[10]*=l;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn(\"THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.\");\nvar g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),l=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*l;g[14]=-((f+e)*l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;\na=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(Z,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,\nd)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],l=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||l!==n){f=1-g;var m=h*d+k*q+l*n+c*e,r=0<=m?1:-1,p=1-m*m;p>Number.EPSILON&&(p=Math.sqrt(p),m=Math.atan2(p,m*r),f=Math.sin(f*m)/p,g=Math.sin(g*m)/p);r*=g;h=h*f+d*r;k=k*f+q*r;l=l*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+l*l+c*c),h*=g,k*=g,l*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=l;a[b+3]=c}});Object.defineProperties(Z.prototype,{x:{get:function(){return this._x},\nset:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(Z.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,\nthis._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error(\"THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.\");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2),f=f(e/2),c=g(c/2),d=g(d/2),e=g(e/2);\"XYZ\"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):\"YXZ\"===a?(this._x=c*k*f+\nh*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):\"ZXY\"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):\"ZYX\"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):\"YZX\"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):\"XZY\"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,\nb){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],l=c+f+b;0<l?(c=.5/Math.sqrt(l+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=\n.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=\n-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},\nmultiply:function(a,b){return void 0!==b?(console.warn(\"THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.\"),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();\nreturn this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g),g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;\nthis._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=\na;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;\ncase 1:return this.y;case 2:return this.z;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},\naddVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=\na.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.\"),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new Z;return function(b){b&&b.isEuler||console.error(\"THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.\");\nreturn this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new Z;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*\nd+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,l=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-l*-f;this.y=k*a+b*-f+l*-e-h*-g;this.z=l*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld,\na.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=\nMath.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=\nMath.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=\n-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-\nthis.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==b?(console.warn(\"THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.\"),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=\na.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(R.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-\na.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=\na[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=\n[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn(\"THREE.Vector3: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var l=this.elements;l[0]=a;l[1]=d;l[2]=g;l[3]=b;l[4]=e;l[5]=h;l[6]=c;l[7]=f;l[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},\ncopy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,\na)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],k=c[7],l=c[2],q=c[5],c=c[8],n=d[0],m=d[3],r=d[6],p=d[1],v=d[4],w=d[7],x=d[2],z=d[5],d=d[8];b[0]=a*n+e*p+f*x;b[3]=a*m+e*v+f*z;b[6]=a*r+e*w+f*d;b[1]=g*n+h*p+k*x;b[4]=g*m+h*v+k*z;b[7]=g*r+h*w+k*d;b[2]=l*n+q*p+c*x;b[5]=l*m+q*v+c*z;b[8]=l*r+q*w+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;\nb[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error(\"THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.\");var c=a.elements;a=this.elements;var d=c[0],e=c[1],f=c[2],g=c[3],h=c[4],k=c[5],l=c[6],q=c[7],c=c[8],n=c*h-k*q,m=k*l-c*g,r=q*g-h*l,p=d*n+e*m+f*r;if(0===p){if(!0===\nb)throw Error(\"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\");console.warn(\"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\");return this.identity()}b=1/p;a[0]=n*b;a[1]=(f*q-c*e)*b;a[2]=(k*e-f*h)*b;a[3]=m*b;a[4]=(c*d-f*l)*b;a[5]=(f*g-k*d)*b;a[6]=r*b;a[7]=(e*l-q*d)*b;a[8]=(h*d-e*g)*b;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},\ntransposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],\nk=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*k;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*k;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=\nthis.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var kf=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;Object.defineProperty(ea.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});Object.assign(ea.prototype,ja.prototype,{constructor:ea,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=\na.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;\nreturn this},toJSON:function(a){var b=void 0===a||\"string\"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:\"Texture\",generator:\"Texture.toJSON\"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};\nif(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=R.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"canvas\");h.width=d.width;h.height=d.height;var k=h.getContext(\"2d\");d instanceof ImageData?k.putImageData(d,0,0):k.drawImage(d,0,0,d.width,d.height)}h=2048<h.width||2048<h.height?h.toDataURL(\"image/jpeg\",.6):h.toDataURL(\"image/png\");e[f]={uuid:g,\nurl:h}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:\"dispose\"})},transformUv:function(a){if(300===this.mapping){a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%\n2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(da.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;\ncase 3:this.w=b;break;default:throw Error(\"index is out of range: \"+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(\"index is out of range: \"+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),\nthis.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn(\"THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(a,\nb);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*\ne;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var k=a[6];var l=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+\ne)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+l-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;l=(l+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>l?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>l?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>l?(h=k=.707106781,c=0):(c=Math.sqrt(l),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;\nthis.w=Math.acos((b+f+l-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,\nthis.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new da,b=new da);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);\nthis.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},\ndot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=\n(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,\nb,c){void 0!==c&&console.warn(\"THREE.Vector4: offset has been removed from .fromBufferAttribute().\");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Hb.prototype,ja.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=\na.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Ib.prototype=Object.create(Hb.prototype);Ib.prototype.constructor=Ib;Ib.prototype.isWebGLRenderTargetCube=!0;fb.prototype=Object.create(ea.prototype);fb.prototype.constructor=fb;fb.prototype.isDataTexture=!0;Ua.prototype=Object.create(ea.prototype);Ua.prototype.constructor=\nUa;Ua.prototype.isCubeTexture=!0;Object.defineProperty(Ua.prototype,\"images\",{get:function(){return this.image},set:function(a){this.image=a}});var Be=new ea,Ce=new Ua,we=[],ye=[],Ae=new Float32Array(16),ze=new Float32Array(9);Ge.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Od=/([\\w\\d_]+)(\\])?(\\[|\\.)?/g;gb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};gb.prototype.setOptional=function(a,\nb,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var sg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,\ncadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,\ndeeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,\nlightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,\nmediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,\nroyalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&\na.isColor?this.copy(a):\"number\"===typeof a?this.setHex(a):\"string\"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=R.euclideanModulo(b,\n1);c=R.clamp(c,0,1);d=R.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn(\"THREE.Color: Alpha component of \"+a+\" will be ignored.\")}var c;if(c=/^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec(a)){var d=c[2];switch(c[1]){case \"rgb\":case \"rgba\":if(c=/^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d))return this.r=Math.min(255,\nparseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case \"hsl\":case \"hsla\":if(c=/^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(d)){var d=parseFloat(c[1])/360,\ne=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=sg[a],void 0!==\nc?this.setHex(c):console.warn(\"THREE.Color: Unknown color \"+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(){var a=\nthis.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return(\"000000\"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):\nk/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return\"rgb(\"+(255*this.r|0)+\",\"+(255*this.g|0)+\",\"+(255*this.b|0)+\")\"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=\na;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=\n0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var E={common:{diffuse:{value:new H(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ra},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},\naoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new C(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},\nfogFar:{value:2E3},fogColor:{value:new H(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},\npointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new H(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ra}}},\nEa={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},W={alphamap_fragment:\"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\",alphamap_pars_fragment:\"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\",\nalphatest_fragment:\"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\",aomap_fragment:\"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\",\naomap_pars_fragment:\"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\",begin_vertex:\"\\nvec3 transformed = vec3( position );\\n\",beginnormal_vertex:\"\\nvec3 objectNormal = vec3( normal );\\n\",bsdfs:\"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t}\\n\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE  = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\\n\\tfloat b = 3.45068 + (4.18814 + y) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\\n\\treturn result;\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\",\nbumpmap_pars_fragment:\"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\",\nclipping_planes_fragment:\"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\",\nclipping_planes_pars_fragment:\"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\",clipping_planes_pars_vertex:\"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\",clipping_planes_vertex:\"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\",\ncolor_fragment:\"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\",color_pars_fragment:\"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\",color_pars_vertex:\"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\",common:\"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\n\",\ncube_uv_reflection_fragment:\"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale =  bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\",\ndefaultnormal_vertex:\"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n\",displacementmap_pars_vertex:\"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\",displacementmap_vertex:\"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\",\nemissivemap_fragment:\"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\",emissivemap_pars_fragment:\"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\",encodings_fragment:\"  gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\",encodings_pars_fragment:\"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM            = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D      = max( maxRange / maxRGB, 1.0 );\\n\\tD            = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value )  {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\",\nenvmap_fragment:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\",\nenvmap_pars_fragment:\"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\",\nenvmap_pars_vertex:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\",envmap_vertex:\"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\",\nfog_vertex:\"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\",fog_pars_vertex:\"#ifdef USE_FOG\\n  varying float fogDepth;\\n#endif\\n\",fog_fragment:\"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\",fog_pars_fragment:\"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\",\ngradientmap_pars_fragment:\"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\",\nlightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\",lights_lambert_vertex:\"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",\nlights_pars:\"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t\\tfloat shadowCameraNear;\\n\\t\\tfloat shadowCameraFar;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\",\nlights_phong_fragment:\"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\",lights_phong_pars_fragment:\"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\",\nlights_physical_fragment:\"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\",\nlights_physical_pars_fragment:\"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tfloat norm = texture2D( ltcMag, uv ).a;\\n\\t\\tvec4 t = texture2D( ltcMat, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3(   1,   0, t.y ),\\n\\t\\t\\tvec3(   0, t.z,   0 ),\\n\\t\\t\\tvec3( t.w,   0, t.x )\\n\\t\\t);\\n\\t\\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\",\nlights_template:\"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\",\nlogdepthbuf_fragment:\"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\",logdepthbuf_pars_fragment:\"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\",logdepthbuf_pars_vertex:\"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\",logdepthbuf_vertex:\"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\tgl_Position.z *= gl_Position.w;\\n\\t#endif\\n#endif\\n\",\nmap_fragment:\"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\",map_pars_fragment:\"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\",map_particle_fragment:\"#ifdef USE_MAP\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\",map_particle_pars_fragment:\"#ifdef USE_MAP\\n\\tuniform mat3 uvTransform;\\n\\tuniform sampler2D map;\\n#endif\\n\",\nmetalnessmap_fragment:\"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\\n\",metalnessmap_pars_fragment:\"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\",\nmorphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\",\nnormal_fragment:\"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\",\nnormalmap_pars_fragment:\"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\",\npacking:\"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\",\npremultiplied_alpha_fragment:\"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\",project_vertex:\"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n\",dithering_fragment:\"#if defined( DITHERING )\\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\\n\",dithering_pars_fragment:\"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\\n\",\nroughnessmap_fragment:\"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\\n\",roughnessmap_pars_fragment:\"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\",shadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\",\nshadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\",\nshadowmap_vertex:\"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\",\nshadowmask_pars_fragment:\"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\",\nskinbase_vertex:\"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\",\nskinning_vertex:\"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\\n\",skinnormal_vertex:\"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\",\nspecularmap_fragment:\"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\",specularmap_pars_fragment:\"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\",tonemapping_fragment:\"#if defined( TONE_MAPPING )\\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\",tonemapping_pars_fragment:\"#ifndef saturate\\n\\t#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\",\nuv_pars_fragment:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\",uv_pars_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\n\",\nuv_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\",uv2_pars_fragment:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\",uv2_pars_vertex:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\",\nuv2_vertex:\"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\",worldpos_vertex:\"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\\n\",cube_frag:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\",\ncube_vert:\"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\\n\",depth_frag:\"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\",\ndepth_vert:\"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n}\\n\",\ndistanceRGBA_frag:\"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\\n\",\ndistanceRGBA_vert:\"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\\n\",\nequirect_frag:\"uniform sampler2D tEquirect;\\nvarying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\",equirect_vert:\"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\",\nlinedashed_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\nlinedashed_vert:\"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshbasic_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\nmeshbasic_vert:\"#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_ENVMAP\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshlambert_frag:\"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <emissivemap_fragment>\\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include <lightmap_fragment>\\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshlambert_vert:\"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <lights_lambert_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshphong_frag:\"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshphong_vert:\"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nmeshphysical_frag:\"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <cube_uv_reflection_fragment>\\n#include <lights_pars>\\n#include <lights_physical_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\",\nmeshphysical_vert:\"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nnormal_frag:\"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\",\nnormal_vert:\"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\",\npoints_frag:\"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\",\npoints_vert:\"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\",\nshadow_frag:\"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <fog_fragment>\\n}\\n\",shadow_vert:\"#include <fog_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\"},\nmb={basic:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.fog]),vertexShader:W.meshbasic_vert,fragmentShader:W.meshbasic_frag},lambert:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.fog,E.lights,{emissive:{value:new H(0)}}]),vertexShader:W.meshlambert_vert,fragmentShader:W.meshlambert_frag},phong:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.gradientmap,\nE.fog,E.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:W.meshphong_vert,fragmentShader:W.meshphong_frag},standard:{uniforms:Ea.merge([E.common,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.roughnessmap,E.metalnessmap,E.fog,E.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag},points:{uniforms:Ea.merge([E.points,\nE.fog]),vertexShader:W.points_vert,fragmentShader:W.points_frag},dashed:{uniforms:Ea.merge([E.common,E.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:W.linedashed_vert,fragmentShader:W.linedashed_frag},depth:{uniforms:Ea.merge([E.common,E.displacementmap]),vertexShader:W.depth_vert,fragmentShader:W.depth_frag},normal:{uniforms:Ea.merge([E.common,E.bumpmap,E.normalmap,E.displacementmap,{opacity:{value:1}}]),vertexShader:W.normal_vert,fragmentShader:W.normal_frag},cube:{uniforms:{tCube:{value:null},\ntFlip:{value:-1},opacity:{value:1}},vertexShader:W.cube_vert,fragmentShader:W.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:W.equirect_vert,fragmentShader:W.equirect_frag},distanceRGBA:{uniforms:Ea.merge([E.common,E.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:W.distanceRGBA_vert,fragmentShader:W.distanceRGBA_frag},shadow:{uniforms:Ea.merge([E.lights,E.fog,{color:{value:new H(0)},opacity:{value:1}}]),vertexShader:W.shadow_vert,\nfragmentShader:W.shadow_frag}};mb.physical={uniforms:Ea.merge([mb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag};Object.assign(kd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){c=a.copy(c).multiplyScalar(.5);\nthis.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=\na||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=\nthis.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);\nthis.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});tc.prototype=Object.create(ea.prototype);tc.prototype.constructor=tc;var Lf=0;Object.assign(Q.prototype,ja.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn(\"THREE.Material: '\"+\nb+\"' parameter is undefined.\");else if(\"shading\"===b)console.warn(\"THREE.\"+this.type+\": .shading has been removed. Use the boolean .flatShading instead.\"),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn(\"THREE.\"+this.type+\": '\"+b+\"' is not a property of this material.\"):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=\"overdraw\"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=\nvoid 0===a||\"string\"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:\"Material\",generator:\"Material.toJSON\"}};d.uuid=this.uuid;d.type=this.type;\"\"!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);\nthis.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&\nthis.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);\nthis.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&\n(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation);\n1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);\"round\"!==this.wireframeLinecap&&\n(d.wireframeLinecap=this.wireframeLinecap);\"round\"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);\"{}\"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;\nthis.lights=a.lights;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=\na.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.userData=JSON.parse(JSON.stringify(a.userData));this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=\na[d].clone();this.clippingPlanes=b;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Wa.prototype=Object.create(Q.prototype);Wa.prototype.constructor=Wa;Wa.prototype.isMeshDepthMaterial=!0;Wa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=\na.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Xa.prototype=Object.create(Q.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isMeshDistanceMaterial=!0;Xa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=\na.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Object.assign(Oa.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var l=a[h],q=a[h+1],n=a[h+2];l<b&&(b=l);q<c&&(c=q);n<d&&(d=n);l>e&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=\nInfinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var l=a.getX(h),q=a.getY(h),n=a.getZ(h);l<b&&(b=l);q<c&&(c=q);n<d&&(d=n);l>e&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new p;return function(b,c){c=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(c);this.max.copy(b).add(c);\nreturn this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new p;return this.isEmpty()?a.set(0,0,0):\na.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new p;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){function a(a){var f=a.geometry;if(void 0!==f)if(f.isGeometry)for(f=f.vertices,c=0,d=f.length;c<d;c++)e.copy(f[c]),\ne.applyMatrix4(a.matrixWorld),b.expandByPoint(e);else if(f.isBufferGeometry&&(f=f.attributes.position,void 0!==f))for(c=0,d=f.count;c<d;c++)e.fromBufferAttribute(f,c).applyMatrix4(a.matrixWorld),b.expandByPoint(e)}var b,c,d,e=new p;return function(c){b=this;c.updateMatrixWorld(!0);c.traverse(a);return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=\nthis.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center,\na);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,\nb){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Da;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=\n[new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);\na[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Oa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e<f;e++)c=Math.max(c,\nd.distanceToSquared(b[e]));this.radius=Math.sqrt(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=\nb*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);b=b||new p;b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){a=a||new Oa;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);\nthis.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=\nnew p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+\nthis.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return(b||new p).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){c=c||new p;var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1<e))return c.copy(d).multiplyScalar(e).add(b.start)}}(),intersectsLine:function(a){var b=\nthis.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new p).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new p,b=new ra;return function(c,d){d=d||b.getNormalMatrix(c);c=this.coplanarPoint(a).applyMatrix4(c);d=this.normal.applyMatrix3(d).normalize();this.constant=-c.dot(d);return this}}(),\ntranslate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(ld.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,\nc=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],q=c[8],n=c[9],m=c[10],r=c[11],p=c[12],v=c[13],w=c[14],c=c[15];b[0].setComponents(f-a,l-g,r-q,c-p).normalize();b[1].setComponents(f+a,l+g,r+q,c+p).normalize();b[2].setComponents(f+d,l+h,r+n,c+v).normalize();b[3].setComponents(f-d,l-h,r-n,c-v).normalize();b[4].setComponents(f-e,l-k,r-m,c-w).normalize();b[5].setComponents(f+e,l+k,r+m,c+w).normalize();return this},intersectsObject:function(){var a=new Da;return function(b){var c=\nb.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Da;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new p,b=\nnew p;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});Ya.RotationOrders=\"XYZ YZX ZXY XZY YXZ ZYX\".split(\" \");\nYa.DefaultOrder=\"XYZ\";Object.defineProperties(Ya.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(Ya.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=\nc;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=R.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],l=e[9],q=e[2],n=e[6],e=e[10];b=b||this._order;\"XYZ\"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-l,e),this._z=\nMath.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):\"YXZ\"===b?(this._x=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):\"ZXY\"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):\"ZYX\"===b?(this._y=Math.asin(-d(q,-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):\"YZX\"===\nb?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):\"XZY\"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-l,e),this._y=0)):console.warn(\"THREE.Euler: .setFromRotationMatrix() given unsupported order: \"+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);\nreturn this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new Z;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===\nb&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Pd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});\nvar Nf=0;A.DefaultUp=new p(0,1,0);A.DefaultMatrixAutoUpdate=!0;Object.assign(A.prototype,ja.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,\n!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new Z;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateOnWorldAxis:function(){var a=new Z;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.premultiply(a);return this}}(),rotateX:function(){var a=new p(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=\nnew p(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new p(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new p;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new p(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new p(0,1,0);return function(b){return this.translateOnAxis(a,\nb)}}(),translateZ:function(){var a=new p(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new K;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new K,b=new p;return function(c,d,e){c.isVector3?b.copy(c):b.set(c,d,e);this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),\nadd:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error(\"THREE.Object3D.add: object can't be added as a child of itself.\",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:\"added\"}),this.children.push(a)):console.error(\"THREE.Object3D.add: object not an instance of THREE.Object3D.\",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);\nreturn this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:\"removed\"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty(\"id\",a)},getObjectByName:function(a){return this.getObjectByProperty(\"name\",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new p;this.updateMatrixWorld(!0);\nreturn a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new p,b=new p;return function(c){c=c||new Z;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new Z;return function(b){b=b||new Ya;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new p,b=new Z;return function(c){c=c||new p;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),\ngetWorldDirection:function(){var a=new Z;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,\nthis.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=\n[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||\"string\"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{}},e.metadata={version:4.5,type:\"Object\",generator:\"Object3D.toJSON\"});var f={};f.uuid=this.uuid;f.type=this.type;\"\"!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);\"{}\"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.matrix=\nthis.matrix.toArray();void 0!==this.geometry&&(f.geometry=b(a.geometries,this.geometry));if(void 0!==this.material)if(Array.isArray(this.material)){for(var g=[],h=0,k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);d&&(d=c(a.geometries),g=c(a.materials),h=c(a.textures),k=c(a.images),0<d.length&&\n(e.geometries=d),0<g.length&&(e.materials=g),0<h.length&&(e.textures=h),0<k.length&&(e.images=k));e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;\nthis.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});La.prototype=Object.assign(Object.create(A.prototype),{constructor:La,isCamera:!0,copy:function(a,b){A.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);\nthis.projectionMatrix.copy(a.projectionMatrix);return this},getWorldDirection:function(){var a=new Z;return function(b){b=b||new p;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){A.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Kb.prototype=Object.assign(Object.create(La.prototype),{constructor:Kb,isOrthographicCamera:!0,copy:function(a,b){La.prototype.copy.call(this,\na,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},\nclearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view&&this.view.enabled)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/\nthis.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});Object.assign(Pa.prototype,\n{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Of=0;Object.assign(N.prototype,ja.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=(new ra).getNormalMatrix(a),\nc=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);this.applyMatrix(a);\nreturn this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new A;return function(b){a.lookAt(b);\na.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[q[a].clone(),q[b].clone(),q[d].clone()]:[],t=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Pa(a,b,d,f,t,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([n[a].clone(),n[b].clone(),n[d].clone()]);void 0!==l&&c.faceVertexUvs[1].push([m[a].clone(),m[b].clone(),m[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,\ng=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,l=void 0!==e.uv2?e.uv2.array:void 0;void 0!==l&&(this.faceVertexUvs[1]=[]);for(var q=[],n=[],m=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new p(f[e],f[e+1],f[e+2])),void 0!==g&&q.push(new p(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new H(h[e],h[e+1],h[e+2])),void 0!==k&&n.push(new C(k[r],k[r+1])),void 0!==l&&m.push(new C(l[r],l[r+1]));var u=a.groups;if(0<u.length)for(e=0;e<u.length;e++)for(var f=\nu[e],v=f.start,w=f.count,r=v,v=v+w;r<v;r+=3)void 0!==d?b(d[r],d[r+1],d[r+2],f.materialIndex):b(r,r+1,r+2,f.materialIndex);else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,\na.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new K;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===\na&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var k=this.vertices[b.c];e.subVectors(k,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=\nthis.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),\nd[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):\nd.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new N;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=new p;var k={a:new p,b:new p,c:new p};d.push(h);g.push(k)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();\nf.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(d.normal),k.a.copy(d.vertexNormals[0]),k.b.copy(d.vertexNormals[1]),k.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===\nthis.boundingBox&&(this.boundingBox=new Oa);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Da);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,l=this.faceVertexUvs[0],q=a.faceVertexUvs[0],n=this.colors,m=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ra).getNormalMatrix(b));a=0;for(var r=g.length;a<\nr;a++){var p=g[a].clone();void 0!==b&&p.applyMatrix4(b);f.push(p)}a=0;for(r=m.length;a<r;a++)n.push(m[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],v=g.vertexNormals,m=g.vertexColors,n=new Pa(g.a+e,g.b+e,g.c+e);n.normal.copy(g.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(f=v.length;b<f;b++)p=v[b].clone(),void 0!==d&&p.applyMatrix3(d).normalize(),n.vertexNormals.push(p);n.color.copy(g.color);b=0;for(f=m.length;b<f;b++)p=m[b],n.vertexColors.push(p.clone());n.materialIndex=g.materialIndex+\nc;h.push(n)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());l.push(d)}}else console.error(\"THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.\",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error(\"THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.\",a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<\ne;f++){var g=this.vertices[f];g=Math.round(g.x*d)+\"_\"+Math.round(g.y*d)+\"_\"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=\nb;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);\ng&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==l[b])return l[b];l[b]=k.length/3;k.push(a.x,a.y,a.z);return l[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=q.length;q.push(a.getHex());return n[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==p[b])return p[b];p[b]=m.length/2;m.push(a.x,a.y);return p[b]}var e=\n{metadata:{version:4.5,type:\"Geometry\",generator:\"Geometry.toJSON\"}};e.uuid=this.uuid;e.type=this.type;\"\"!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],l={},q=[],n={},m=[],p={};for(g=0;g<this.faces.length;g++){var u=this.faces[g],v=void 0!==this.faceVertexUvs[0][g],w=0<u.normal.length(),x=0<u.vertexNormals.length,z=\n1!==u.color.r||1!==u.color.g||1!==u.color.b,I=0<u.vertexColors.length,B=0,B=a(B,0,0),B=a(B,1,!0),B=a(B,2,!1),B=a(B,3,v),B=a(B,4,w),B=a(B,5,x),B=a(B,6,z),B=a(B,7,I);h.push(B);h.push(u.a,u.b,u.c);h.push(u.materialIndex);v&&(v=this.faceVertexUvs[0][g],h.push(d(v[0]),d(v[1]),d(v[2])));w&&h.push(b(u.normal));x&&(w=u.vertexNormals,h.push(b(w[0]),b(w[1]),b(w[2])));z&&h.push(c(u.color));I&&(u=u.vertexColors,h.push(c(u[0]),c(u[1]),c(u[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<q.length&&(e.data.colors=\nq);0<m.length&&(e.data.uvs=[m]);e.data.faces=h;return e},clone:function(){return(new N).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());\ne=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],k=[];var l=0;for(d=h.length;l<d;l++)k.push(h[l].clone());this.faceVertexUvs[f].push(k)}}l=a.morphTargets;f=0;for(b=l.length;f<b;f++){d={};d.name=l[f].name;if(void 0!==l[f].vertices)for(d.vertices=[],e=0,c=l[f].vertices.length;e<c;e++)d.vertices.push(l[f].vertices[e].clone());\nif(void 0!==l[f].normals)for(d.normals=[],e=0,c=l[f].normals.length;e<c;e++)d.normals.push(l[f].normals[e].clone());this.morphTargets.push(d)}l=a.morphNormals;f=0;for(b=l.length;f<b;f++){d={};if(void 0!==l[f].vertexNormals)for(d.vertexNormals=[],e=0,c=l[f].vertexNormals.length;e<c;e++)g=l[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==l[f].faceNormals)for(d.faceNormals=[],e=0,c=l[f].faceNormals.length;e<c;e++)d.faceNormals.push(l[f].faceNormals[e].clone());\nthis.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=\na.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Object.defineProperty(P.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});Object.assign(P.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.count=void 0!==\na?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=\n0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyColorsArray(): color is undefined\",d),f=new H);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector2sArray(): vector is undefined\",d),f=new C);\nb[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector3sArray(): vector is undefined\",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn(\"THREE.BufferAttribute.copyVector4sArray(): vector is undefined\",d),f=new da);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;\nb[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},\nsetW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,\nthis.itemSize)).copy(this)}});uc.prototype=Object.create(P.prototype);uc.prototype.constructor=uc;vc.prototype=Object.create(P.prototype);vc.prototype.constructor=vc;wc.prototype=Object.create(P.prototype);wc.prototype.constructor=wc;xc.prototype=Object.create(P.prototype);xc.prototype.constructor=xc;hb.prototype=Object.create(P.prototype);hb.prototype.constructor=hb;yc.prototype=Object.create(P.prototype);yc.prototype.constructor=yc;ib.prototype=Object.create(P.prototype);ib.prototype.constructor=\nib;y.prototype=Object.create(P.prototype);y.prototype.constructor=y;zc.prototype=Object.create(P.prototype);zc.prototype.constructor=zc;Object.assign(Je.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,\ne=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var k=[];for(var l=0;l<h;l++)k[l]=[];this.morphTargets.position=k}var q=a.morphNormals,n=q.length;if(0<n){var m=[];for(l=0;l<n;l++)m[l]=[];this.morphTargets.normal=m}for(var p=a.skinIndices,u=a.skinWeights,v=p.length===c.length,w=u.length===c.length,l=0;l<b.length;l++){var x=b[l];this.vertices.push(c[x.a],c[x.b],c[x.c]);var z=x.vertexNormals;3===z.length?this.normals.push(z[0],z[1],z[2]):(z=x.normal,this.normals.push(z,\nz,z));z=x.vertexColors;3===z.length?this.colors.push(z[0],z[1],z[2]):(z=x.color,this.colors.push(z,z,z));!0===e&&(z=d[0][l],void 0!==z?this.uvs.push(z[0],z[1],z[2]):(console.warn(\"THREE.DirectGeometry.fromGeometry(): Undefined vertexUv \",l),this.uvs.push(new C,new C,new C)));!0===f&&(z=d[1][l],void 0!==z?this.uvs2.push(z[0],z[1],z[2]):(console.warn(\"THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 \",l),this.uvs2.push(new C,new C,new C)));for(z=0;z<h;z++){var I=g[z].vertices;k[z].push(I[x.a],\nI[x.b],I[x.c])}for(z=0;z<n;z++)I=q[z].vertexNormals[l],m[z].push(I.a,I.b,I.c);v&&this.skinIndices.push(p[x.a],p[x.b],p[x.c]);w&&this.skinWeights.push(u[x.a],u[x.b],u[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});var Pf=1;Object.assign(D.prototype,ja.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},\nsetIndex:function(a){Array.isArray(a)?this.index=new (65535<Qd(a)?ib:hb)(a,1):this.index=a},addAttribute:function(a,b,c){if(b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute)if(\"index\"===a)console.warn(\"THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.\"),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn(\"THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).\"),this.addAttribute(a,new P(b,c))},getAttribute:function(a){return this.attributes[a]},\nremoveAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new ra).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==\nthis.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,\nc,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new A;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new y(3*b.vertices.length,3);var c=new y(3*b.colors.length,\n3);this.addAttribute(\"position\",a.copyVector3sArray(b.vertices));this.addAttribute(\"color\",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new y(b.lineDistances.length,1),this.addAttribute(\"lineDistance\",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=\n[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,e.y,e.z||0)}this.addAttribute(\"position\",new y(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=\n!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=\n!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new Je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=\nnew Float32Array(3*a.vertices.length);this.addAttribute(\"position\",(new P(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute(\"normal\",(new P(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute(\"color\",(new P(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute(\"uv\",(new P(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=\nnew Float32Array(2*a.uvs2.length),this.addAttribute(\"uv2\",(new P(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<Qd(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new P(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new y(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new y(4*a.skinIndices.length,\n4),this.addAttribute(\"skinIndex\",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new y(4*a.skinWeights.length,4),this.addAttribute(\"skinWeight\",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Oa);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):\nthis.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Oa,b=new p;return function(){null===this.boundingSphere&&(this.boundingSphere=new Da);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);\na.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;\nif(void 0===b.normal)this.addAttribute(\"normal\",new P(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h=new p,k=new p,l=new p,q=new p,n=new p;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var m=0,r=c.length;m<r;++m){f=c[m];g=f.start;var u=f.count;f=g;for(g+=u;f<g;f+=3){u=3*a[f+0];var v=3*a[f+1];var w=3*a[f+2];h.fromArray(d,u);k.fromArray(d,v);l.fromArray(d,w);q.subVectors(l,k);n.subVectors(h,k);q.cross(n);e[u]+=q.x;e[u+\n1]+=q.y;e[u+2]+=q.z;e[v]+=q.x;e[v+1]+=q.y;e[v+2]+=q.z;e[w]+=q.x;e[w+1]+=q.y;e[w+2]+=q.z}}}else for(f=0,g=d.length;f<g;f+=9)h.fromArray(d,f),k.fromArray(d,f+3),l.fromArray(d,f+6),q.subVectors(l,k),n.subVectors(h,k),q.cross(n),e[f]=q.x,e[f+1]=q.y,e[f+2]=q.z,e[f+3]=q.x,e[f+4]=q.y,e[f+5]=q.z,e[f+6]=q.x,e[f+7]=q.y,e[f+8]=q.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=\nc[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}console.error(\"THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.\",a)},normalizeNormals:function(){var a=new p;return function(){for(var b=this.attributes.normal,c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.normalize(),b.setXYZ(c,a.x,a.y,a.z)}}(),toNonIndexed:function(){if(null===this.index)return console.warn(\"THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.\"),\nthis;var a=new D,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,l=0,q=b.length;l<q;l++){h=b[l]*e;for(var n=0;n<e;n++)g[k++]=f[h++]}a.addAttribute(d,new P(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:\"BufferGeometry\",generator:\"BufferGeometry.toJSON\"}};a.uuid=this.uuid;a.type=this.type;\"\"!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters;for(var c in b)void 0!==b[c]&&\n(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c];b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),\nradius:c.radius});return a},clone:function(){return(new D).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.addAttribute(g,c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}var g=a.groups;c=0;for(b=g.length;c<b;c++)d=\ng[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:\"dispose\"})}});Lb.prototype=Object.create(N.prototype);Lb.prototype.constructor=Lb;jb.prototype=Object.create(D.prototype);jb.prototype.constructor=jb;Ac.prototype=Object.create(N.prototype);Ac.prototype.constructor=\nAc;kb.prototype=Object.create(D.prototype);kb.prototype.constructor=kb;va.prototype=Object.create(Q.prototype);va.prototype.constructor=va;va.prototype.isMeshBasicMaterial=!0;va.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=\na.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};oa.prototype=Object.create(Q.prototype);oa.prototype.constructor=oa;oa.prototype.isShaderMaterial=!0;oa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;\nthis.uniforms=Ea.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this};oa.prototype.toJSON=function(a){a=Q.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Object.assign(lb.prototype,\n{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new p).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,\nb){b=b||new p;b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=\nnew p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),l=c.dot(this.direction),q=-c.dot(b),n=c.lengthSq(),m=Math.abs(1-k*k);if(0<m){d=k*q-l;e=k*l-q;var p=h*m;0<=d?e>=-p?e<=p?(h=1/m,d*=h,e*=h,k=d*(d+k*e+2*l)+e*(k*d+e+2*q)+n):(e=h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):(e=-h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):e<=-p?(d=Math.max(0,-(-k*h+l)),e=0<d?-h:Math.min(Math.max(-h,\n-q),h),k=-d*d+e*(e+2*q)+n):e<=p?(d=0,e=Math.min(Math.max(-h,-q),h),k=e*(e+2*q)+n):(d=Math.max(0,-(k*h+l)),e=0<d?h:Math.min(Math.max(-h,-q),h),k=-d*d+e*(e+2*q)+n)}else e=0<k?-h:h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n;f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new p;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d;b=b.radius*b.radius;if(e>b)return null;\nb=Math.sqrt(b-e);e=d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);\nreturn 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;\nif(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;\ng=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Mb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);\nthis.end.copy(a.end);return this},getCenter:function(a){return(a||new p).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new p).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){b=b||new p;return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c,\nthis.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=R.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new p;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Qa,{normal:function(){var a=new p;return function(b,c,d,e){e=e||new p;\ne.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var l=d*k-e*e;h=h||new p;if(0===l)return h.set(-2,-1,-1);l=1/l;k=(k*f-e*g)*l;d=(d*g-e*f)*l;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new p;return function(b,c,d,e){b=\nQa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Qa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,\nthis.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Qa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Qa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Qa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=\nnew Aa,b=[new Mb,new Mb,new Mb],c=new p,d=new p;return function(e,f){f=f||new p;var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;e<b.length;e++){b[e].closestPointToPoint(c,!0,d);var h=c.distanceToSquared(d);h<g&&(g=h,f.copy(d))}return f}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});pa.prototype=Object.assign(Object.create(A.prototype),\n{constructor:pa,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){A.prototype.copy.call(this,a);this.drawMode=a.drawMode;void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==\nc)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else if(c=a.morphTargets,void 0!==c&&0<c.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++)d=c[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[d]=a},raycast:function(){function a(a,b,c,d,e,f,g){Qa.barycoordFromPoint(a,b,c,d,v);e.multiplyScalar(v.x);\nf.multiplyScalar(v.y);g.multiplyScalar(v.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;x.copy(h);x.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(x);return b<c.near||b>c.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,l,n,q,t){g.fromBufferAttribute(f,n);h.fromBufferAttribute(f,q);k.fromBufferAttribute(f,t);if(c=b(c,c.material,d,e,g,h,k,w))l&&(m.fromBufferAttribute(l,\nn),r.fromBufferAttribute(l,q),u.fromBufferAttribute(l,t),c.uv=a(w,g,h,k,m,r,u)),c.face=new Pa(n,q,t,Qa.normal(g,h,k)),c.faceIndex=n;return c}var d=new K,e=new lb,f=new Da,g=new p,h=new p,k=new p,l=new p,q=new p,n=new p,m=new C,r=new C,u=new C,v=new p,w=new p,x=new p;return function(t,p){var v=this.geometry,x=this.material,z=this.matrixWorld;if(void 0!==x&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(z),!1!==t.ray.intersectsSphere(f)&&(d.getInverse(z),\ne.copy(t.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox)))){var y;if(v.isBufferGeometry){var x=v.index,I=v.attributes.position,z=v.attributes.uv,C;if(null!==x){var A=0;for(C=x.count;A<C;A+=3){v=x.getX(A);var D=x.getX(A+1);var E=x.getX(A+2);if(y=c(this,t,e,I,z,v,D,E))y.faceIndex=Math.floor(A/3),p.push(y)}}else if(void 0!==I)for(A=0,C=I.count;A<C;A+=3)if(v=A,D=A+1,E=A+2,y=c(this,t,e,I,z,v,D,E))y.index=v,p.push(y)}else if(v.isGeometry){var z=Array.isArray(x);A=v.vertices;\nC=v.faces;D=v.faceVertexUvs[0];0<D.length&&(I=D);for(var H=0,N=C.length;H<N;H++){var M=C[H];y=z?x[M.materialIndex]:x;if(void 0!==y){D=A[M.a];E=A[M.b];var V=A[M.c];if(!0===y.morphTargets){var K=v.morphTargets,P=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var Q=0,R=K.length;Q<R;Q++){var O=P[Q];if(0!==O){var S=K[Q].vertices;g.addScaledVector(l.subVectors(S[M.a],D),O);h.addScaledVector(q.subVectors(S[M.b],E),O);k.addScaledVector(n.subVectors(S[M.c],V),O)}}g.add(D);h.add(E);k.add(V);\nD=g;E=h;V=k}if(y=b(this,y,t,e,D,E,V,w))I&&I[H]&&(K=I[H],m.copy(K[0]),r.copy(K[1]),u.copy(K[2]),y.uv=a(w,D,E,V,m,r,u)),y.face=M,y.faceIndex=H,p.push(y)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var ig=0;U.prototype=Object.assign(Object.create(La.prototype),{constructor:U,isPerspectiveCamera:!0,copy:function(a,b){La.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;\nthis.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*R.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*R.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*R.RAD2DEG*Math.atan(Math.tan(.5*R.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,\n1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},\nupdateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*R.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=\nthis.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});nd.prototype=Object.assign(Object.create(U.prototype),{constructor:nd,isArrayCamera:!0});Ob.prototype.isFogExp2=!0;Ob.prototype.clone=function(){return new Ob(this.color.getHex(),this.density)};Ob.prototype.toJSON=function(){return{type:\"FogExp2\",color:this.color.getHex(),\ndensity:this.density}};Pb.prototype.isFog=!0;Pb.prototype.clone=function(){return new Pb(this.color.getHex(),this.near,this.far)};Pb.prototype.toJSON=function(){return{type:\"Fog\",color:this.color.getHex(),near:this.near,far:this.far}};od.prototype=Object.assign(Object.create(A.prototype),{constructor:od,copy:function(a,b){A.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=\na.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=A.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Xd.prototype=Object.assign(Object.create(A.prototype),{constructor:Xd,isLensFlare:!0,copy:function(a){A.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=\na.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new H(16777215));void 0===d&&(d=1);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c=2*-this.positionScreen.x,d=2*-this.positionScreen.y;\nfor(a=0;a<b;a++){var e=this.lensFlares[a];e.x=this.positionScreen.x+c*e.distance;e.y=this.positionScreen.y+d*e.distance;e.wantedRotation=e.x*Math.PI*.25;e.rotation+=.25*(e.wantedRotation-e.rotation)}}});Za.prototype=Object.create(Q.prototype);Za.prototype.constructor=Za;Za.prototype.isSpriteMaterial=!0;Za.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};Cc.prototype=Object.assign(Object.create(A.prototype),{constructor:Cc,\nisSprite:!0,raycast:function(){var a=new p,b=new p,c=new p;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f||(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});Dc.prototype=Object.assign(Object.create(A.prototype),{constructor:Dc,copy:function(a){A.prototype.copy.call(this,\na,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new p;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=\nb.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new p,b=new p;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.levels=\n[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(Ec.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new K;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<\nb;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new K,b=new K;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new Ec(this.bones,\nthis.boneInverses)}});pd.prototype=Object.assign(Object.create(A.prototype),{constructor:pd,isBone:!0});qd.prototype=Object.assign(Object.create(pa.prototype),{constructor:qd,isSkinnedMesh:!0,initBones:function(){var a=[],b;if(this.geometry&&void 0!==this.geometry.bones){var c=0;for(b=this.geometry.bones.length;c<b;c++){var d=this.geometry.bones[c];var e=new pd;a.push(e);e.name=d.name;e.position.fromArray(d.pos);e.quaternion.fromArray(d.rotq);void 0!==d.scl&&e.scale.fromArray(d.scl)}c=0;for(b=this.geometry.bones.length;c<\nb;c++)d=this.geometry.bones[c],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[c]):this.add(a[c])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a;if(this.geometry&&this.geometry.isGeometry)for(a=0;a<this.geometry.skinWeights.length;a++){var b=\nthis.geometry.skinWeights[a];var c=1/b.manhattanLength();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var b=new da,d=this.geometry.attributes.skinWeight;for(a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.manhattanLength(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)}},updateMatrixWorld:function(a){pa.prototype.updateMatrixWorld.call(this,a);\"attached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):\n\"detached\"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn(\"THREE.SkinnedMesh: Unrecognized bindMode: \"+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});O.prototype=Object.create(Q.prototype);O.prototype.constructor=O;O.prototype.isLineBasicMaterial=!0;O.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};\nma.prototype=Object.assign(Object.create(A.prototype),{constructor:ma,isLine:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new p,l=new p,h=new p,q=new p,n=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var m=g.index;var r=g.attributes.position.array;\nif(null!==m)for(var u=m.array,g=0,v=u.length-1;g<v;g+=n)m=u[g+1],k.fromArray(r,3*u[g]),l.fromArray(r,3*m),m=b.distanceSqToSegment(k,l,q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),m<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}));else for(g=0,v=r.length/3-1;g<v;g+=n)k.fromArray(r,3*g),l.fromArray(r,3*g+3),m=b.distanceSqToSegment(k,l,q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),\nm<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,l=k.length,g=0;g<l-1;g+=n)m=b.distanceSqToSegment(k[g],k[g+1],q,h),m>f||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),m<d.near||m>d.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,\nthis.material)).copy(this)}});ca.prototype=Object.assign(Object.create(ma.prototype),{constructor:ca,isLineSegments:!0});rd.prototype=Object.assign(Object.create(ma.prototype),{constructor:rd,isLineLoop:!0});Ba.prototype=Object.create(Q.prototype);Ba.prototype.constructor=Ba;Ba.prototype.isPointsMaterial=!0;Ba.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Qb.prototype=Object.assign(Object.create(A.prototype),\n{constructor:Qb,isPoints:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<m){a=b.closestPointToPoint(a);a.applyMatrix4(k);var h=d.ray.origin.distanceTo(a);h<d.near||h>d.far||e.push({distance:h,distanceToRay:Math.sqrt(f),point:a.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,l=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);\nc.radius+=l;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var l=l/((this.scale.x+this.scale.y+this.scale.z)/3),m=l*l,l=new p;if(h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var t=n.array,n=0,r=t.length;n<r;n++){var u=t[n];l.fromArray(h,3*u);f(l,u)}else for(n=0,t=h.length/3;n<t;n++)l.fromArray(h,3*n),f(l,n)}else for(l=h.vertices,n=0,t=l.length;n<t;n++)f(l[n],n)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});\nFc.prototype=Object.assign(Object.create(A.prototype),{constructor:Fc});sd.prototype=Object.create(ea.prototype);sd.prototype.constructor=sd;Rb.prototype=Object.create(ea.prototype);Rb.prototype.constructor=Rb;Rb.prototype.isCompressedTexture=!0;Gc.prototype=Object.create(ea.prototype);Gc.prototype.constructor=Gc;Gc.prototype.isDepthTexture=!0;Sb.prototype=Object.create(D.prototype);Sb.prototype.constructor=Sb;Hc.prototype=Object.create(N.prototype);Hc.prototype.constructor=Hc;Tb.prototype=Object.create(D.prototype);\nTb.prototype.constructor=Tb;Ic.prototype=Object.create(N.prototype);Ic.prototype.constructor=Ic;qa.prototype=Object.create(D.prototype);qa.prototype.constructor=qa;Jc.prototype=Object.create(N.prototype);Jc.prototype.constructor=Jc;Ub.prototype=Object.create(qa.prototype);Ub.prototype.constructor=Ub;Kc.prototype=Object.create(N.prototype);Kc.prototype.constructor=Kc;nb.prototype=Object.create(qa.prototype);nb.prototype.constructor=nb;Lc.prototype=Object.create(N.prototype);Lc.prototype.constructor=\nLc;Vb.prototype=Object.create(qa.prototype);Vb.prototype.constructor=Vb;Mc.prototype=Object.create(N.prototype);Mc.prototype.constructor=Mc;Wb.prototype=Object.create(qa.prototype);Wb.prototype.constructor=Wb;Nc.prototype=Object.create(N.prototype);Nc.prototype.constructor=Nc;Xb.prototype=Object.create(D.prototype);Xb.prototype.constructor=Xb;Oc.prototype=Object.create(N.prototype);Oc.prototype.constructor=Oc;Yb.prototype=Object.create(D.prototype);Yb.prototype.constructor=Yb;Pc.prototype=Object.create(N.prototype);\nPc.prototype.constructor=Pc;Zb.prototype=Object.create(D.prototype);Zb.prototype.constructor=Zb;var Ha={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g;if(0<Ha.area(a))for(g=0;g<c;g++)e[g]=g;else for(g=0;g<c;g++)e[g]=c-1-g;var h=2*c;for(g=c-1;2<c;){if(0>=h--){console.warn(\"THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()\");break}var k=\ng;c<=k&&(k=0);g=k+1;c<=g&&(g=0);var l=g+1;c<=l&&(l=0);a:{var m;var n=a[e[k]].x;var p=a[e[k]].y;var r=a[e[g]].x;var u=a[e[g]].y;var v=a[e[l]].x;var w=a[e[l]].y;if(0>=(r-n)*(w-p)-(u-p)*(v-n))var x=!1;else{var z=v-r;var y=w-u;var B=n-v;var C=p-w;var A=r-n;x=u-p;for(m=0;m<c;m++){var D=a[e[m]].x;var E=a[e[m]].y;if(!(D===n&&E===p||D===r&&E===u||D===v&&E===w)){var H=D-n;var N=E-p;var K=D-r;var L=E-u;D-=v;E-=w;L=z*L-y*K;N=A*N-x*H;D=B*E-C*D;if(L>=-Number.EPSILON&&D>=-Number.EPSILON&&N>=-Number.EPSILON){x=\n!1;break a}}}x=!0}}if(x){d.push([a[e[k]],a[e[g]],a[e[l]]]);f.push([e[k],e[g],e[l]]);k=g;for(l=g+1;l<c;k++,l++)e[k]=e[l];c--;h=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,l=e.y-c.y,m=a.x-c.x,n=a.y-c.y,q=h*k-g*l,p=h*m-g*n;if(Math.abs(q)>Number.EPSILON){if(0<\nq){if(0>p||p>q)return[];k=l*m-k*n;if(0>k||k>q)return[]}else{if(0<p||p<q)return[];k=l*m-k*n;if(0<k||k<q)return[]}if(0===k)return!f||0!==p&&p!==q?[a]:[];if(k===q)return!f||0!==p&&p!==q?[b]:[];if(0===p)return[c];if(p===q)return[e];f=k/q;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==p||l*m!==k*n)return[];h=0===g&&0===h;k=0===k&&0===l;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,q=c.x,l=\ne,c=e.x):(b=e,q=e.x,l=c,c=c.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,q=c.y,l=e,c=e.y):(b=e,q=e.y,l=c,c=c.y));return k<=q?a<q?[]:a===q?f?[]:[b]:a<=c?[b,h]:[b,l]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,l]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h={},k=a.concat();var l=0;for(g=b.length;l<g;l++)Array.prototype.push.apply(k,\nb[l]);l=0;for(g=k.length;l<g;l++){var m=k[l].x+\":\"+k[l].y;void 0!==h[m]&&console.warn(\"THREE.ShapeUtils: Duplicate point\",m,l);h[m]=l}l=function(a,b){function c(a,b){var c=h.length-1,d=a-1;0>d&&(d=c);var e=a+1;e>c&&(e=0);c=f(h[a],h[d],h[e],D[b]);if(!c)return!1;c=D.length-1;d=b-1;0>d&&(d=c);e=b+1;e>c&&(e=0);return(c=f(D[b],D[d],D[e],h[a]))?!0:!1}function d(a,b){var c;for(c=0;c<h.length;c++){var d=c+1;d%=h.length;d=e(a,b,h[c],h[d],!0);if(0<d.length)return!0}return!1}function g(a,c){var d,f;for(d=0;d<\nk.length;d++){var g=b[k[d]];for(f=0;f<g.length;f++){var h=f+1;h%=g.length;h=e(a,c,g[f],g[h],!0);if(0<h.length)return!0}}return!1}var h=a.concat(),k=[],l,m;a=[];var q,n=0;for(l=b.length;n<l;n++)k.push(n);var p=0;for(var t=2*k.length;0<k.length;){t--;if(0>t){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!');break}for(m=p;m<h.length;m++){var y=h[m];l=-1;for(n=0;n<k.length;n++){var C=k[n];var A=y.x+\":\"+y.y+\":\"+C;if(void 0===a[A]){var D=\nb[C];for(q=0;q<D.length;q++)if(C=D[q],c(m,q)&&!d(y,C)&&!g(y,C)){l=q;k.splice(n,1);p=h.slice(0,m+1);C=h.slice(m);q=D.slice(l);var E=D.slice(0,l+1);h=p.concat(q).concat(E).concat(C);p=m;break}if(0<=l)break;a[A]=!0}}if(0<=l)break}}return h}(a,b);k=Ha.triangulate(l,!1);l=0;for(g=k.length;l<g;l++)for(b=k[l],a=0;3>a;a++)m=b[a].x+\":\"+b[a].y,m=h[m],void 0!==m&&(b[a]=m);return k.concat()},isClockWise:function(a){return 0>Ha.area(a)}};$a.prototype=Object.create(N.prototype);$a.prototype.constructor=$a;Ga.prototype=\nObject.create(D.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=function(){var a=this.getAttribute(\"position\"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute(\"uv\"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index);this.addAttribute(\"position\",\nnew y(b.arrays.position,3));this.addAttribute(\"uv\",new y(b.arrays.uv,2))};Ga.prototype.addShape=function(a,b){function c(a,b,c){b||console.error(\"THREE.ExtrudeGeometry: vec does not exist\");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g),h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new C(f,\nd);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new C(f/e,d/e)}function e(a,b){for(G=a.length;0<=--G;){var c=G;var d=G-1;0>d&&(d=a.length-1);var e,f=A+2*w;for(e=0;e<f;e++){var g=Z*e,l=Z*(e+1),q=b+d+g,n=b+d+l,l=b+c+l;h(b+c+g);h(q);h(l);h(q);h(n);h(l);g=m.length/3;g=E.generateSideWallUV(R,m,g-6,g-3,g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);\nk(g[2]);k(g[3])}}}function f(a,b,c){r.push(a);r.push(b);r.push(c)}function g(a,b,c){h(a);h(b);h(c);a=m.length/3;a=E.generateTopUV(R,m,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){n.push(m.length/3);m.push(r[3*a+0]);m.push(r[3*a+1]);m.push(r[3*a+2])}function k(a){t.push(a.x);t.push(a.y)}var l=b.arrays?b.arrays:this.getArrays(),m=l.position,n=l.index,t=l.uv,r=[],l=void 0!==b.amount?b.amount:100,u=void 0!==b.bevelThickness?b.bevelThickness:6,v=void 0!==b.bevelSize?b.bevelSize:u-2,w=void 0!==b.bevelSegments?\nb.bevelSegments:3,x=void 0!==b.bevelEnabled?b.bevelEnabled:!0,z=void 0!==b.curveSegments?b.curveSegments:12,A=void 0!==b.steps?b.steps:1,B=b.extrudePath,D=!1,E=void 0!==b.UVGenerator?b.UVGenerator:$a.WorldUVGenerator;if(B){var H=B.getSpacedPoints(A);D=!0;x=!1;var N=void 0!==b.frames?b.frames:B.computeFrenetFrames(A,!1);var K=new p;var Q=new p;var P=new p}x||(v=u=w=0);var L,R=this,z=a.extractPoints(z);a=z.shape;var O=z.holes;if(!Ha.isClockWise(a)){a=a.reverse();var M=0;for(L=O.length;M<L;M++){var V=\nO[M];Ha.isClockWise(V)&&(O[M]=V.reverse())}}var S=Ha.triangulateShape(a,O),W=a;M=0;for(L=O.length;M<L;M++)V=O[M],a=a.concat(V);var aa,Z=a.length,U,ca=S.length,z=[],G=0;var X=W.length;var fa=X-1;for(aa=G+1;G<X;G++,fa++,aa++)fa===X&&(fa=0),aa===X&&(aa=0),z[G]=d(W[G],W[fa],W[aa]);var B=[],ea=z.concat();M=0;for(L=O.length;M<L;M++){V=O[M];var da=[];G=0;X=V.length;fa=X-1;for(aa=G+1;G<X;G++,fa++,aa++)fa===X&&(fa=0),aa===X&&(aa=0),da[G]=d(V[G],V[fa],V[aa]);B.push(da);ea=ea.concat(da)}for(fa=0;fa<w;fa++){X=\nfa/w;var ga=u*Math.cos(X*Math.PI/2);aa=v*Math.sin(X*Math.PI/2);G=0;for(X=W.length;G<X;G++){var T=c(W[G],z[G],aa);f(T.x,T.y,-ga)}M=0;for(L=O.length;M<L;M++)for(V=O[M],da=B[M],G=0,X=V.length;G<X;G++)T=c(V[G],da[G],aa),f(T.x,T.y,-ga)}aa=v;for(G=0;G<Z;G++)T=x?c(a[G],ea[G],aa):a[G],D?(Q.copy(N.normals[0]).multiplyScalar(T.x),K.copy(N.binormals[0]).multiplyScalar(T.y),P.copy(H[0]).add(Q).add(K),f(P.x,P.y,P.z)):f(T.x,T.y,0);for(X=1;X<=A;X++)for(G=0;G<Z;G++)T=x?c(a[G],ea[G],aa):a[G],D?(Q.copy(N.normals[X]).multiplyScalar(T.x),\nK.copy(N.binormals[X]).multiplyScalar(T.y),P.copy(H[X]).add(Q).add(K),f(P.x,P.y,P.z)):f(T.x,T.y,l/A*X);for(fa=w-1;0<=fa;fa--){X=fa/w;ga=u*Math.cos(X*Math.PI/2);aa=v*Math.sin(X*Math.PI/2);G=0;for(X=W.length;G<X;G++)T=c(W[G],z[G],aa),f(T.x,T.y,l+ga);M=0;for(L=O.length;M<L;M++)for(V=O[M],da=B[M],G=0,X=V.length;G<X;G++)T=c(V[G],da[G],aa),D?f(T.x,T.y+H[A-1].y,H[A-1].x+ga):f(T.x,T.y,l+ga)}(function(){var a=m.length/3;if(x){var c=0*Z;for(G=0;G<ca;G++)U=S[G],g(U[2]+c,U[1]+c,U[0]+c);c=Z*(A+2*w);for(G=0;G<\nca;G++)U=S[G],g(U[0]+c,U[1]+c,U[2]+c)}else{for(G=0;G<ca;G++)U=S[G],g(U[2],U[1],U[0]);for(G=0;G<ca;G++)U=S[G],g(U[0]+Z*A,U[1]+Z*A,U[2]+Z*A)}R.addGroup(a,m.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=m.length/3,c=0;e(W,c);c+=W.length;M=0;for(L=O.length;M<L;M++)V=O[M],e(V,c),c+=V.length;R.addGroup(a,m.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(n),this.addAttribute(\"position\",new y(m,3)),this.addAttribute(\"uv\",new y(b.arrays.uv,2)))};\n$a.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*c],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var l=b[3*e],m=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(l,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(m,1-e),new C(p,1-b)]}};Qc.prototype=Object.create(N.prototype);\nQc.prototype.constructor=Qc;$b.prototype=Object.create(Ga.prototype);$b.prototype.constructor=$b;Rc.prototype=Object.create(N.prototype);Rc.prototype.constructor=Rc;ob.prototype=Object.create(D.prototype);ob.prototype.constructor=ob;Sc.prototype=Object.create(N.prototype);Sc.prototype.constructor=Sc;ac.prototype=Object.create(D.prototype);ac.prototype.constructor=ac;Tc.prototype=Object.create(N.prototype);Tc.prototype.constructor=Tc;bc.prototype=Object.create(D.prototype);bc.prototype.constructor=\nbc;cc.prototype=Object.create(N.prototype);cc.prototype.constructor=cc;dc.prototype=Object.create(D.prototype);dc.prototype.constructor=dc;ec.prototype=Object.create(D.prototype);ec.prototype.constructor=ec;pb.prototype=Object.create(N.prototype);pb.prototype.constructor=pb;Sa.prototype=Object.create(D.prototype);Sa.prototype.constructor=Sa;Uc.prototype=Object.create(pb.prototype);Uc.prototype.constructor=Uc;Vc.prototype=Object.create(Sa.prototype);Vc.prototype.constructor=Vc;Wc.prototype=Object.create(N.prototype);\nWc.prototype.constructor=Wc;fc.prototype=Object.create(D.prototype);fc.prototype.constructor=fc;var Ca=Object.freeze({WireframeGeometry:Sb,ParametricGeometry:Hc,ParametricBufferGeometry:Tb,TetrahedronGeometry:Jc,TetrahedronBufferGeometry:Ub,OctahedronGeometry:Kc,OctahedronBufferGeometry:nb,IcosahedronGeometry:Lc,IcosahedronBufferGeometry:Vb,DodecahedronGeometry:Mc,DodecahedronBufferGeometry:Wb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:qa,TubeGeometry:Nc,TubeBufferGeometry:Xb,TorusKnotGeometry:Oc,\nTorusKnotBufferGeometry:Yb,TorusGeometry:Pc,TorusBufferGeometry:Zb,TextGeometry:Qc,TextBufferGeometry:$b,SphereGeometry:Rc,SphereBufferGeometry:ob,RingGeometry:Sc,RingBufferGeometry:ac,PlaneGeometry:Ac,PlaneBufferGeometry:kb,LatheGeometry:Tc,LatheBufferGeometry:bc,ShapeGeometry:cc,ShapeBufferGeometry:dc,ExtrudeGeometry:$a,ExtrudeBufferGeometry:Ga,EdgesGeometry:ec,ConeGeometry:Uc,ConeBufferGeometry:Vc,CylinderGeometry:pb,CylinderBufferGeometry:Sa,CircleGeometry:Wc,CircleBufferGeometry:fc,BoxGeometry:Lb,\nBoxBufferGeometry:jb});gc.prototype=Object.create(Q.prototype);gc.prototype.constructor=gc;gc.prototype.isShadowMaterial=!0;hc.prototype=Object.create(oa.prototype);hc.prototype.constructor=hc;hc.prototype.isRawShaderMaterial=!0;Ma.prototype=Object.create(Q.prototype);Ma.prototype.constructor=Ma;Ma.prototype.isMeshStandardMaterial=!0;Ma.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.defines={STANDARD:\"\"};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;\nthis.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;\nthis.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype=Object.create(Ma.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshPhysicalMaterial=\n!0;qb.prototype.copy=function(a){Ma.prototype.copy.call(this,a);this.defines={PHYSICAL:\"\"};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ia.prototype=Object.create(Q.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isMeshPhongMaterial=!0;Ia.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=\na.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=\na.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};rb.prototype=Object.create(Ia.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshToonMaterial=!0;rb.prototype.copy=function(a){Ia.prototype.copy.call(this,\na);this.gradientMap=a.gradientMap;return this};sb.prototype=Object.create(Q.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshNormalMaterial=!0;sb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;\nthis.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};tb.prototype=Object.create(Q.prototype);tb.prototype.constructor=tb;tb.prototype.isMeshLambertMaterial=!0;tb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=\na.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ub.prototype=Object.create(O.prototype);ub.prototype.constructor=\nub;ub.prototype.isLineDashedMaterial=!0;ub.prototype.copy=function(a){O.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var tg=Object.freeze({ShadowMaterial:gc,SpriteMaterial:Za,RawShaderMaterial:hc,ShaderMaterial:oa,PointsMaterial:Ba,MeshPhysicalMaterial:qb,MeshStandardMaterial:Ma,MeshPhongMaterial:Ia,MeshToonMaterial:rb,MeshNormalMaterial:sb,MeshLambertMaterial:tb,MeshDepthMaterial:Wa,MeshDistanceMaterial:Xa,MeshBasicMaterial:va,LineDashedMaterial:ub,\nLineBasicMaterial:O,Material:Q}),jd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},wa=new Yd,Ta={};Object.assign(Ja.prototype,{load:function(a,b,c,d){void 0===a&&(a=\"\");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=jd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},\n0),f;if(void 0!==Ta[a])Ta[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2],g=g[3],g=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||\"\").toLowerCase();switch(k){case \"arraybuffer\":case \"blob\":for(var l=new Uint8Array(g.length),h=0;h<g.length;h++)l[h]=g.charCodeAt(h);var m=\"blob\"===k?new Blob([l.buffer],{type:c}):l.buffer;break;case \"document\":m=(new DOMParser).parseFromString(g,c);break;case \"json\":m=\nJSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(t){window.setTimeout(function(){d&&d(t);e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{Ta[a]=[];Ta[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open(\"GET\",a,!0);n.addEventListener(\"load\",function(b){var c=b.target.response;jd.add(a,c);var d=Ta[a];delete Ta[a];if(200===this.status){for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}e.manager.itemEnd(a)}else if(0===\nthis.status){console.warn(\"THREE.FileLoader: HTTP Status 0 received.\");f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onLoad)h.onLoad(c);e.manager.itemEnd(a)}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemEnd(a);e.manager.itemError(a)}},!1);n.addEventListener(\"progress\",function(b){for(var c=Ta[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener(\"error\",function(b){var c=Ta[a];delete Ta[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];\nif(g.onError)g.onError(b)}e.manager.itemEnd(a);e.manager.itemError(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:\"text/plain\");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=\na;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(Qe.prototype,{load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=g._parser(a,!0);h[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};f+=1;6===f&&(1===a.mipmapCount&&(k.minFilter=1006),k.format=a.format,k.needsUpdate=!0,b&&b(k))},c,d)}var f,g=this,h=[],k=new Rb;\nk.image=h;var l=new Ja(this.manager);l.setPath(this.path);l.setResponseType(\"arraybuffer\");if(Array.isArray(a))for(var m=f=0,n=a.length;m<n;++m)e(m);else l.load(a,function(a){a=g._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){h[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)h[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),h[d].format=a.format,h[d].width=a.width,h[d].height=a.height}else k.image.width=a.width,k.image.height=a.height,k.mipmaps=a.mipmaps;1===a.mipmapCount&&\n(k.minFilter=1006);k.format=a.format;k.needsUpdate=!0;b&&b(k)},c,d);return k},setPath:function(a){this.path=a;return this}});Object.assign(Zd.prototype,{load:function(a,b,c,d){var e=this,f=new fb,g=new Ja(this.manager);g.setResponseType(\"arraybuffer\");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==\na.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Xc.prototype,{crossOrigin:\"Anonymous\",load:function(a,b,c,d){void 0===a&&(a=\"\");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=jd.get(a);\nif(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"img\");c.addEventListener(\"load\",function(){jd.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);c.addEventListener(\"error\",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);\"data:\"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=\na;return this},setPath:function(a){this.path=a;return this}});Object.assign($d.prototype,{crossOrigin:\"Anonymous\",load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Ua,g=new Xc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(td.prototype,\n{crossOrigin:\"Anonymous\",load:function(a,b,c,d){var e=new Xc(this.manager);e.setCrossOrigin(this.crossOrigin);e.setPath(this.path);var f=new ea;f.image=e.load(a,function(){var c=0<a.search(/\\.(jpg|jpeg)$/)||0===a.search(/^data\\:image\\/jpeg/);f.format=c?1022:1023;f.needsUpdate=!0;void 0!==b&&b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});ga.prototype=Object.assign(Object.create(A.prototype),{constructor:ga,isLight:!0,copy:function(a){A.prototype.copy.call(this,\na);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=A.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&\n(a.object.shadow=this.shadow.toJSON());return a}});ud.prototype=Object.assign(Object.create(ga.prototype),{constructor:ud,isHemisphereLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});Object.assign(vb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=\nthis.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});vd.prototype=Object.assign(Object.create(vb.prototype),{constructor:vd,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*R.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});\nwd.prototype=Object.assign(Object.create(ga.prototype),{constructor:wd,isSpotLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});xd.prototype=Object.assign(Object.create(ga.prototype),{constructor:xd,isPointLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();\nreturn this}});yd.prototype=Object.assign(Object.create(vb.prototype),{constructor:yd});zd.prototype=Object.assign(Object.create(ga.prototype),{constructor:zd,isDirectionalLight:!0,copy:function(a){ga.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});Ad.prototype=Object.assign(Object.create(ga.prototype),{constructor:Ad,isAmbientLight:!0});Bd.prototype=Object.assign(Object.create(ga.prototype),{constructor:Bd,isRectAreaLight:!0,copy:function(a){ga.prototype.copy.call(this,\na);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=ga.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var T={arraySlice:function(a,b,c){return T.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:\"number\"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof\nDataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==\nf)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};Object.assign(xa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;\nbreak c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||\nthis.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error(\"call to abstract method\");},intervalChanged_:function(){}});Object.assign(xa.prototype,{beforeStart_:xa.prototype.copySampleValue_,afterEnd_:xa.prototype.copySampleValue_});Cd.prototype=Object.assign(Object.create(xa.prototype),{constructor:Cd,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,\nb,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,\nf=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,l=this._offsetNext,m=this._weightPrev,n=this._weightNext,p=(c-b)/(d-b);c=p*p;d=c*p;b=-m*d+2*m*c-m*p;m=(1+m)*d+(-1.5-2*m)*c+(-.5+m)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+m*f[h+c]+p*f[a+c]+n*f[l+c];return e}});Yc.prototype=Object.assign(Object.create(xa.prototype),{constructor:Yc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-\nb);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Dd.prototype=Object.assign(Object.create(xa.prototype),{constructor:Dd,interpolate_:function(a){return this.copySampleValue_(a-1)}});var eb={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Dd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Yc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Cd(this.times,\nthis.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b=\"unsupported interpolation for \"+this.ValueTypeName+\" keyframe track named \"+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn(\"THREE.KeyframeTrackPrototype:\",\nb)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},\ntrim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=T.arraySlice(c,e,f),this.values=T.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error(\"THREE.KeyframeTrackPrototype: Invalid value size in track.\",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error(\"THREE.KeyframeTrackPrototype: Track is empty.\",\nthis),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if(\"number\"===typeof g&&isNaN(g)){console.error(\"THREE.KeyframeTrackPrototype: Time is not a valid number.\",this,f,g);a=!1;break}if(null!==e&&e>g){console.error(\"THREE.KeyframeTrackPrototype: Out of order keys.\",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&T.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error(\"THREE.KeyframeTrackPrototype: Value is not a valid number.\",this,f,d);a=!1;break}return a},optimize:function(){for(var a,\nb,c=this.times,d=this.values,e=this.getValueSize(),f=2302===this.getInterpolation(),g=1,h=c.length-1,k=1;k<h;++k){a=!1;var l=c[k];if(l!==c[k+1]&&(1!==k||l!==l[0]))if(f)a=!0;else{b=k*e;for(var m=b-e,n=b+e,l=0;l!==e;++l){var p=d[b+l];if(p!==d[m+l]||p!==d[n+l]){a=!0;break}}}if(a){if(k!==g)for(c[g]=c[k],b=k*e,a=g*e,l=0;l!==e;++l)d[a+l]=d[b+l];++g}}if(0<h){c[g]=c[h];b=h*e;a=g*e;for(l=0;l!==e;++l)d[a+l]=d[b+l];++g}g!==c.length&&(this.times=T.arraySlice(c,0,g),this.values=T.arraySlice(d,0,g*e));return this}};\nic.prototype=Object.assign(Object.create(eb),{constructor:ic,ValueTypeName:\"vector\"});Ed.prototype=Object.assign(Object.create(xa.prototype),{constructor:Ed,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)Z.slerpFlat(e,0,f,a-g,f,a,b);return e}});Zc.prototype=Object.assign(Object.create(eb),{constructor:Zc,ValueTypeName:\"quaternion\",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Ed(this.times,\nthis.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});jc.prototype=Object.assign(Object.create(eb),{constructor:jc,ValueTypeName:\"number\"});Fd.prototype=Object.assign(Object.create(eb),{constructor:Fd,ValueTypeName:\"string\",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Gd.prototype=Object.assign(Object.create(eb),{constructor:Gd,ValueTypeName:\"bool\",ValueBufferType:Array,DefaultInterpolation:2300,\nInterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Hd.prototype=Object.assign(Object.create(eb),{constructor:Hd,ValueTypeName:\"color\"});xb.prototype=eb;eb.constructor=xb;Object.assign(xb,{parse:function(a){if(void 0===a.type)throw Error(\"track type undefined, can not parse\");var b=xb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];T.flattenJSON(a.keys,c,d,\"value\");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,\na.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:T.convertArray(a.times,Array),values:T.convertArray(a.values,Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case \"scalar\":case \"double\":case \"float\":case \"number\":case \"integer\":return jc;case \"vector\":case \"vector2\":case \"vector3\":case \"vector4\":return ic;\ncase \"color\":return Hd;case \"quaternion\":return Zc;case \"bool\":case \"boolean\":return Gd;case \"string\":return Fd}throw Error(\"Unsupported typeName: \"+a);}});Object.assign(ka,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(xb.parse(c[e]).scale(d));return new ka(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(xb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,\nb,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var l=T.getKeyframeOrder(h),h=T.sortedArray(h,1,l),k=T.sortedArray(k,1,l);d||0!==h[0]||(h.push(e),k.push(k[0]));f.push((new jc(\".morphTargetInfluences[\"+b[g].name+\"]\",h,k)).scale(1/c))}return new ka(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,\nb,c){for(var d,e={},f=/^([\\w-]*?)([\\d]+)$/,g=0,h=a.length;g<h;g++){var k=a[g],l=k.name.match(f);l&&1<l.length&&(d=l[1],(l=e[d])||(e[d]=l=[]),l.push(k))}a=[];for(d in e)a.push(ka.CreateFromMorphTargetSequence(d,e[d],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error(\"THREE.AnimationClip: No animation in JSONLoader data.\"),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];T.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||\"default\",f=a.length||\n-1,g=a.fps||30;a=a.hierarchy||[];for(var h=0;h<a.length;h++){var k=a[h].keys;if(k&&0!==k.length)if(k[0].morphTargets){for(var f={},l=0;l<k.length;l++)if(k[l].morphTargets)for(var m=0;m<k[l].morphTargets.length;m++)f[k[l].morphTargets[m]]=-1;for(var n in f){for(var p=[],r=[],m=0;m!==k[l].morphTargets.length;++m){var u=k[l];p.push(u.time);r.push(u.morphTarget===n?1:0)}d.push(new jc(\".morphTargetInfluence[\"+n+\"]\",p,r))}f=f.length*(g||1)}else l=\".bones[\"+b[h].name+\"]\",c(ic,l+\".position\",k,\"pos\",d),c(Zc,\nl+\".quaternion\",k,\"rot\",d),c(ic,l+\".scale\",k,\"scl\",d)}return 0===d.length?null:new ka(e,f,d)}});Object.assign(ka.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Id.prototype,\n{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===c[a]&&console.warn(\"THREE.MaterialLoader: Undefined texture\",a);return c[a]}var c=this.textures,d=new tg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);\nvoid 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==\na.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==\na.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=\na.morphTargets);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&\n(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=\nb(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=\nb(a.gradientMap));return d}});Object.assign(ae.prototype,{load:function(a,b,c,d){var e=this;(new Ja(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new D;var c=a.data.index;void 0!==c&&(c=new gf[c.type](c.array),b.setIndex(new P(c,1)));var d=a.data.attributes;for(f in d){var e=d[f];c=new gf[e.type](e.array);b.addAttribute(f,new P(c,e.itemSize,e.normalized))}var f=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==f)for(c=0,d=f.length;c!==d;++c)e=f[c],\nb.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(f=new p,void 0!==a.center&&f.fromArray(a.center),b.boundingSphere=new Da(f,a.radius));return b}});var gf={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:\"undefined\"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};kc.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,\nb)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(kc.prototype,{crossOrigin:void 0,extractUrlBase:function(a){a=a.split(\"/\");if(1===a.length)return\"./\";a.pop();return a.join(\"/\")+\"/\"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},\nb=new H,c=new td,d=new Id;return function(e,f,g){function h(a,b,d,e,h){a=f+a;var l=kc.Handlers.get(a);null!==l?a=l.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&(\"repeat\"===e[0]&&(a.wrapS=1E3),\"mirror\"===e[0]&&(a.wrapS=1002),\"repeat\"===e[1]&&(a.wrapT=1E3),\"mirror\"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=R.generateUUID();k[b]=a;return b}var k={},l={uuid:R.generateUUID(),\ntype:\"MeshLambertMaterial\"},m;for(m in e){var n=e[m];switch(m){case \"DbgColor\":case \"DbgIndex\":case \"opticalDensity\":case \"illumination\":break;case \"DbgName\":l.name=n;break;case \"blending\":l.blending=a[n];break;case \"colorAmbient\":case \"mapAmbient\":console.warn(\"THREE.Loader.createMaterial:\",m,\"is no longer supported.\");break;case \"colorDiffuse\":l.color=b.fromArray(n).getHex();break;case \"colorSpecular\":l.specular=b.fromArray(n).getHex();break;case \"colorEmissive\":l.emissive=b.fromArray(n).getHex();\nbreak;case \"specularCoef\":l.shininess=n;break;case \"shading\":\"basic\"===n.toLowerCase()&&(l.type=\"MeshBasicMaterial\");\"phong\"===n.toLowerCase()&&(l.type=\"MeshPhongMaterial\");\"standard\"===n.toLowerCase()&&(l.type=\"MeshStandardMaterial\");break;case \"mapDiffuse\":l.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case \"mapDiffuseRepeat\":case \"mapDiffuseOffset\":case \"mapDiffuseWrap\":case \"mapDiffuseAnisotropy\":break;case \"mapEmissive\":l.emissiveMap=h(n,e.mapEmissiveRepeat,\ne.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);break;case \"mapEmissiveRepeat\":case \"mapEmissiveOffset\":case \"mapEmissiveWrap\":case \"mapEmissiveAnisotropy\":break;case \"mapLight\":l.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case \"mapLightRepeat\":case \"mapLightOffset\":case \"mapLightWrap\":case \"mapLightAnisotropy\":break;case \"mapAO\":l.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case \"mapAORepeat\":case \"mapAOOffset\":case \"mapAOWrap\":case \"mapAOAnisotropy\":break;\ncase \"mapBump\":l.bumpMap=h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case \"mapBumpScale\":l.bumpScale=n;break;case \"mapBumpRepeat\":case \"mapBumpOffset\":case \"mapBumpWrap\":case \"mapBumpAnisotropy\":break;case \"mapNormal\":l.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case \"mapNormalFactor\":l.normalScale=[n,n];break;case \"mapNormalRepeat\":case \"mapNormalOffset\":case \"mapNormalWrap\":case \"mapNormalAnisotropy\":break;case \"mapSpecular\":l.specularMap=\nh(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case \"mapSpecularRepeat\":case \"mapSpecularOffset\":case \"mapSpecularWrap\":case \"mapSpecularAnisotropy\":break;case \"mapMetalness\":l.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case \"mapMetalnessRepeat\":case \"mapMetalnessOffset\":case \"mapMetalnessWrap\":case \"mapMetalnessAnisotropy\":break;case \"mapRoughness\":l.roughnessMap=h(n,e.mapRoughnessRepeat,\ne.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case \"mapRoughnessRepeat\":case \"mapRoughnessOffset\":case \"mapRoughnessWrap\":case \"mapRoughnessAnisotropy\":break;case \"mapAlpha\":l.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case \"mapAlphaRepeat\":case \"mapAlphaOffset\":case \"mapAlphaWrap\":case \"mapAlphaAnisotropy\":break;case \"flipSided\":l.side=1;break;case \"doubleSided\":l.side=2;break;case \"transparency\":console.warn(\"THREE.Loader.createMaterial: transparency has been renamed to opacity\");\nl.opacity=n;break;case \"depthTest\":case \"depthWrite\":case \"colorWrite\":case \"opacity\":case \"reflectivity\":case \"transparent\":case \"visible\":case \"wireframe\":l[m]=n;break;case \"vertexColors\":!0===n&&(l.vertexColors=2);\"face\"===n&&(l.vertexColors=1);break;default:console.error(\"THREE.Loader.createMaterial: Unsupported\",m,n)}}\"MeshBasicMaterial\"===l.type&&delete l.emissive;\"MeshPhongMaterial\"!==l.type&&delete l.specular;1>l.opacity&&(l.transparent=!0);d.setTextures(k);return d.parse(l)}}()});Object.assign(be.prototype,\n{load:function(a,b,c,d){var e=this,f=this.texturePath&&\"string\"===typeof this.texturePath?this.texturePath:kc.prototype.extractUrlBase(a),g=new Ja(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if(\"object\"===d.toLowerCase()){console.error(\"THREE.JSONLoader: \"+a+\" should be loaded with THREE.ObjectLoader instead.\");return}if(\"scene\"===d.toLowerCase()){console.error(\"THREE.JSONLoader: \"+a+\" should be loaded with THREE.SceneLoader instead.\");\nreturn}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new N,d=a,e,f,g,h=d.faces;var k=d.vertices;var l=d.normals,m=d.colors;var n=d.scale;var t=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&t++;for(e=0;e<t;e++)c.faceVertexUvs[e]=[]}var r=0;for(g=k.length;r<g;)e=new p,e.x=k[r++]*n,e.y=k[r++]*n,e.z=k[r++]*n,c.vertices.push(e);\nr=0;for(g=h.length;r<g;){k=h[r++];var u=k&1;var v=k&2;e=k&8;var w=k&16;var x=k&32;n=k&64;k&=128;if(u){u=new Pa;u.a=h[r];u.b=h[r+1];u.c=h[r+3];var z=new Pa;z.a=h[r+1];z.b=h[r+2];z.c=h[r+3];r+=4;v&&(v=h[r++],u.materialIndex=v,z.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++){var y=d.uvs[e];c.faceVertexUvs[e][v]=[];c.faceVertexUvs[e][v+1]=[];for(f=0;4>f;f++){var B=h[r++];var A=y[2*B];B=y[2*B+1];A=new C(A,B);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}w&&(w=3*\nh[r++],u.normal.set(l[w++],l[w++],l[w]),z.normal.copy(u.normal));if(x)for(e=0;4>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),2!==e&&u.vertexNormals.push(x),0!==e&&z.vertexNormals.push(x);n&&(n=h[r++],n=m[n],u.color.setHex(n),z.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[r++],n=m[n],2!==e&&u.vertexColors.push(new H(n)),0!==e&&z.vertexColors.push(new H(n));c.faces.push(u);c.faces.push(z)}else{u=new Pa;u.a=h[r++];u.b=h[r++];u.c=h[r++];v&&(v=h[r++],u.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++)for(y=\nd.uvs[e],c.faceVertexUvs[e][v]=[],f=0;3>f;f++)B=h[r++],A=y[2*B],B=y[2*B+1],A=new C(A,B),c.faceVertexUvs[e][v].push(A);w&&(w=3*h[r++],u.normal.set(l[w++],l[w++],l[w]));if(x)for(e=0;3>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),u.vertexNormals.push(x);n&&(n=h[r++],u.color.setHex(m[n]));if(k)for(e=0;3>e;e++)n=h[r++],u.vertexColors.push(new H(m[n]));c.faces.push(u)}}d=a;r=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g<h;g+=r)c.skinWeights.push(new da(d.skinWeights[g],\n1<r?d.skinWeights[g+1]:0,2<r?d.skinWeights[g+2]:0,3<r?d.skinWeights[g+3]:0));if(d.skinIndices)for(g=0,h=d.skinIndices.length;g<h;g+=r)c.skinIndices.push(new da(d.skinIndices[g],1<r?d.skinIndices[g+1]:0,2<r?d.skinIndices[g+2]:0,3<r?d.skinIndices[g+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn(\"When skinning, number of vertices (\"+c.vertices.length+\"), skinIndices (\"+c.skinIndices.length+\"), and skinWeights (\"+\nc.skinWeights.length+\") should match.\");g=a;h=g.scale;if(void 0!==g.morphTargets)for(d=0,r=g.morphTargets.length;d<r;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=g.morphTargets[d].name,c.morphTargets[d].vertices=[],l=c.morphTargets[d].vertices,m=g.morphTargets[d].vertices,t=0,k=m.length;t<k;t+=3)n=new p,n.x=m[t]*h,n.y=m[t+1]*h,n.z=m[t+2]*h,l.push(n);if(void 0!==g.morphColors&&0<g.morphColors.length)for(console.warn('THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.'),\nh=c.faces,g=g.morphColors[0].colors,d=0,r=h.length;d<r;d++)h[d].color.fromArray(g,3*d);g=a;d=[];r=[];void 0!==g.animation&&r.push(g.animation);void 0!==g.animations&&(g.animations.length?r=r.concat(g.animations):r.push(g.animations));for(g=0;g<r.length;g++)(h=ka.parseAnimation(r[g],c.bones))&&d.push(h);c.morphTargets&&(r=ka.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(r));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===\na.materials.length)return{geometry:c};a=kc.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:a}}}()});Object.assign(Re.prototype,{load:function(a,b,c,d){\"\"===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf(\"/\")+1));var e=this;(new Ja(e.manager)).load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error(\"THREE:ObjectLoader: Can't parse \"+a+\".\",h.message);return}c=f.metadata;void 0===c||void 0===c.type||\"geometry\"===c.type.toLowerCase()?\nconsole.error(\"THREE.ObjectLoader: Can't load \"+a+\". Use THREE.JSONLoader instead.\"):e.parse(f,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&\n0!==a.images.length||void 0===b||b(e);return e},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new be,d=new ae,e=0,f=a.length;e<f;e++){var g=a[e];switch(g.type){case \"PlaneGeometry\":case \"PlaneBufferGeometry\":var h=new Ca[g.type](g.width,g.height,g.widthSegments,g.heightSegments);break;case \"BoxGeometry\":case \"BoxBufferGeometry\":case \"CubeGeometry\":h=new Ca[g.type](g.width,g.height,g.depth,g.widthSegments,g.heightSegments,g.depthSegments);break;case \"CircleGeometry\":case \"CircleBufferGeometry\":h=\nnew Ca[g.type](g.radius,g.segments,g.thetaStart,g.thetaLength);break;case \"CylinderGeometry\":case \"CylinderBufferGeometry\":h=new Ca[g.type](g.radiusTop,g.radiusBottom,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case \"ConeGeometry\":case \"ConeBufferGeometry\":h=new Ca[g.type](g.radius,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case \"SphereGeometry\":case \"SphereBufferGeometry\":h=new Ca[g.type](g.radius,g.widthSegments,\ng.heightSegments,g.phiStart,g.phiLength,g.thetaStart,g.thetaLength);break;case \"DodecahedronGeometry\":case \"DodecahedronBufferGeometry\":case \"IcosahedronGeometry\":case \"IcosahedronBufferGeometry\":case \"OctahedronGeometry\":case \"OctahedronBufferGeometry\":case \"TetrahedronGeometry\":case \"TetrahedronBufferGeometry\":h=new Ca[g.type](g.radius,g.detail);break;case \"RingGeometry\":case \"RingBufferGeometry\":h=new Ca[g.type](g.innerRadius,g.outerRadius,g.thetaSegments,g.phiSegments,g.thetaStart,g.thetaLength);\nbreak;case \"TorusGeometry\":case \"TorusBufferGeometry\":h=new Ca[g.type](g.radius,g.tube,g.radialSegments,g.tubularSegments,g.arc);break;case \"TorusKnotGeometry\":case \"TorusKnotBufferGeometry\":h=new Ca[g.type](g.radius,g.tube,g.tubularSegments,g.radialSegments,g.p,g.q);break;case \"LatheGeometry\":case \"LatheBufferGeometry\":h=new Ca[g.type](g.points,g.segments,g.phiStart,g.phiLength);break;case \"PolyhedronGeometry\":case \"PolyhedronBufferGeometry\":h=new Ca[g.type](g.vertices,g.indices,g.radius,g.details);\nbreak;case \"BufferGeometry\":h=d.parse(g);break;case \"Geometry\":h=c.parse(g,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type \"'+g.type+'\"');continue}h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);b[g.uuid]=h}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new Id;d.setTextures(b);b=0;for(var e=a.length;b<e;b++){var f=a[b];if(\"MultiMaterial\"===f.type){for(var g=[],h=0;h<f.materials.length;h++)g.push(d.parse(f.materials[h]));c[f.uuid]=\ng}else c[f.uuid]=d.parse(f)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=ka.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new Yd(b);var f=new Xc(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],k=/^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test(h.url)?\nh.url:d.texturePath+h.url;e[h.uuid]=c(k)}}return e},parseTextures:function(a,b){function c(a,b){if(\"number\"===typeof a)return a;console.warn(\"THREE.ObjectLoader.parseTexture: Constant should be in numeric form.\",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No \"image\" specified for',g.uuid);void 0===b[g.image]&&console.warn(\"THREE.ObjectLoader: Undefined image\",g.image);var h=new ea(b[g.image]);h.needsUpdate=!0;\nh.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ug));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],hf),h.wrapT=c(g.wrap[1],hf));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,jf));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,jf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);\nvoid 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new K;return function(b,c,d){function e(a){void 0===c[a]&&console.warn(\"THREE.ObjectLoader: Undefined geometry\",a);return c[a]}function f(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],c=0,e=a.length;c<e;c++){var f=a[c];void 0===d[f]&&console.warn(\"THREE.ObjectLoader: Undefined material\",f);b.push(d[f])}return b}void 0===d[a]&&console.warn(\"THREE.ObjectLoader: Undefined material\",a);return d[a]}}switch(b.type){case \"Scene\":var g=\nnew od;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new H(b.background));void 0!==b.fog&&(\"Fog\"===b.fog.type?g.fog=new Pb(b.fog.color,b.fog.near,b.fog.far):\"FogExp2\"===b.fog.type&&(g.fog=new Ob(b.fog.color,b.fog.density)));break;case \"PerspectiveCamera\":g=new U(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=\nObject.assign({},b.view));break;case \"OrthographicCamera\":g=new Kb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case \"AmbientLight\":g=new Ad(b.color,b.intensity);break;case \"DirectionalLight\":g=new zd(b.color,b.intensity);break;case \"PointLight\":g=new xd(b.color,b.intensity,b.distance,b.decay);break;case \"RectAreaLight\":g=new Bd(b.color,b.intensity,b.width,b.height);break;case \"SpotLight\":g=new wd(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case \"HemisphereLight\":g=new ud(b.color,\nb.groundColor,b.intensity);break;case \"SkinnedMesh\":console.warn(\"THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.\");case \"Mesh\":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new qd(g,h):new pa(g,h);break;case \"LOD\":g=new Dc;break;case \"Line\":g=new ma(e(b.geometry),f(b.material),b.mode);break;case \"LineLoop\":g=new rd(e(b.geometry),f(b.material));break;case \"LineSegments\":g=new ca(e(b.geometry),f(b.material));break;case \"PointCloud\":case \"Points\":g=new Qb(e(b.geometry),\nf(b.material));break;case \"Sprite\":g=new Cc(f(b.material));break;case \"Group\":g=new Fc;break;default:g=new A}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);\nvoid 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=b.userData);if(void 0!==b.children)for(var h=b.children,k=0;k<h.length;k++)g.add(this.parseObject(h[k],\nc,d));if(\"LOD\"===b.type)for(b=b.levels,h=0;h<b.length;h++){var k=b[h],l=g.getObjectByProperty(\"uuid\",k.object);void 0!==l&&g.addLevel(l,k.distance)}return g}}()});var ug={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},hf={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},jf={NearestFilter:1003,NearestMipMapNearestFilter:1004,\nNearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(S.prototype,{getPoint:function(){console.warn(\"THREE.Curve: .getPoint() not implemented.\");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/\na));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,\nb){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=\n[],g=new p,h=new K,k;for(k=0;k<=a;k++){var l=k/a;d[k]=this.getTangentAt(l);d[k].normalize()}e[0]=new p;f[0]=new p;k=Number.MAX_VALUE;l=Math.abs(d[0].x);var m=Math.abs(d[0].y),n=Math.abs(d[0].z);l<=k&&(k=l,c.set(1,0,0));m<=k&&(k=m,c.set(0,1,0));n<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(R.clamp(d[k-\n1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(R.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Ka.prototype=Object.create(S.prototype);\nKa.prototype.constructor=Ka;Ka.prototype.isLineCurve=!0;Ka.prototype.getPoint=function(a,b){b=b||new C;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ka.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ka.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};Ka.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ab.prototype=Object.assign(Object.create(S.prototype),\n{constructor:Ab,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new Ka(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=\n!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=\ne[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){S.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this}});Na.prototype=Object.create(S.prototype);Na.prototype.constructor=Na;Na.prototype.isEllipseCurve=\n!0;Na.prototype.getPoint=function(a,b){b=b||new C;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Na.prototype.copy=function(a){S.prototype.copy.call(this,\na);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ab.prototype=Object.create(S.prototype);ab.prototype.constructor=ab;ab.prototype.isSplineCurve=!0;ab.prototype.getPoint=function(a,b){b=b||new C;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);var d=d-a,e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-2?c.length-1:a+1],c=c[a>c.length-3?c.length-1:a+2];b.set(Se(d,\ne.x,f.x,g.x,c.x),Se(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};bb.prototype=Object.create(S.prototype);bb.prototype.constructor=bb;bb.prototype.isCubicBezierCurve=!0;bb.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(zb(a,c.x,d.x,e.x,f.x),zb(a,c.y,d.y,e.y,f.y));return b};bb.prototype.copy=function(a){S.prototype.copy.call(this,\na);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};cb.prototype=Object.create(S.prototype);cb.prototype.constructor=cb;cb.prototype.isQuadraticBezierCurve=!0;cb.prototype.getPoint=function(a,b){b=b||new C;var c=this.v0,d=this.v1,e=this.v2;b.set(yb(a,c.x,d.x,e.x),yb(a,c.y,d.y,e.y));return b};cb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};var se=Object.assign(Object.create(Ab.prototype),\n{setFromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Ka(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new cb(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new bb(this.currentPoint.clone(),new C(a,\nb),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new ab(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,\ne,f,g,h){a=new Na(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)},copy:function(a){Ab.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this}});Bb.prototype=se;se.constructor=Bb;Cb.prototype=Object.assign(Object.create(se),{constructor:Cb,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),\nholes:this.getPointsHoles(a)}},copy:function(a){Bb.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this}});Object.assign(ce.prototype,{moveTo:function(a,b){this.currentPath=new Bb;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,\nb,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Cb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(Math.abs(l)>Number.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=\na.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ha.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Cb;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints()),k=a?!k:k;h=[];var l=[],m=[],n=0;l[n]=void 0;m[n]=[];for(var p=0,r=f.length;p<r;p++){g=f[p];var u=g.getPoints();var v=e(u);(v=a?!v:v)?(!k&&l[n]&&n++,l[n]={s:new Cb,p:u},l[n].s.curves=g.curves,k&&n++,m[n]=[]):m[n].push({h:g,p:u[0]})}if(!l[0])return c(f);if(1<\nl.length){p=!1;a=[];e=0;for(f=l.length;e<f;e++)h[e]=[];e=0;for(f=l.length;e<f;e++)for(g=m[e],v=0;v<g.length;v++){k=g[v];n=!0;for(u=0;u<l.length;u++)d(k.p,l[u].p)&&(e!==u&&a.push({froms:e,tos:u,hole:v}),n?(n=!1,h[u].push(k)):p=!0);n&&h[e].push(k)}0<a.length&&(p||(m=h))}p=0;for(e=l.length;p<e;p++)for(h=l[p].s,b.push(h),a=m[p],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(de.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);void 0===c&&(c=4);var d=this.data;\na=String(a).split(\"\");var e=b/d.resolution,f=(d.boundingBox.yMax-d.boundingBox.yMin+d.underlineThickness)*e,g=0,h=0;b=[];for(var k=0;k<a.length;k++){var l=a[k];if(\"\\n\"===l)g=0,h-=f;else{var m;var n=e;var p=g,r=h;if(l=d.glyphs[l]||d.glyphs[\"?\"]){var u=new ce,v=[];if(l.o)for(var w=l._cachedOutline||(l._cachedOutline=l.o.split(\" \")),x=0,y=w.length;x<y;)switch(w[x++]){case \"m\":var A=w[x++]*n+p;var B=w[x++]*n+r;u.moveTo(A,B);break;case \"l\":A=w[x++]*n+p;B=w[x++]*n+r;u.lineTo(A,B);break;case \"q\":var C=w[x++]*\nn+p;var D=w[x++]*n+r;var E=w[x++]*n+p;var H=w[x++]*n+r;u.quadraticCurveTo(E,H,C,D);if(m=v[v.length-1]){var N=m.x;m=m.y;for(var K=1;K<=c;K++){var O=K/c;yb(O,N,E,C);yb(O,m,H,D)}}break;case \"b\":if(C=w[x++]*n+p,D=w[x++]*n+r,E=w[x++]*n+p,H=w[x++]*n+r,A=w[x++]*n+p,B=w[x++]*n+r,u.bezierCurveTo(E,H,A,B,C,D),m=v[v.length-1])for(N=m.x,m=m.y,K=1;K<=c;K++)O=K/c,zb(O,N,E,A,C),zb(O,m,H,B,D)}n={offsetX:l.ha*n,path:u}}else n=void 0;g+=n.offsetX;b.push(n.path)}}c=[];d=0;for(a=b.length;d<a;d++)Array.prototype.push.apply(c,\nb[d].toShapes());return c}});Object.assign(Te.prototype,{load:function(a,b,c,d){var e=this,f=new Ja(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(k){console.warn(\"THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.\"),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new de(a)},setPath:function(a){this.path=a;return this}});var Md,ge={getContext:function(){void 0===Md&&(Md=new (window.AudioContext||\nwindow.webkitAudioContext));return Md},setContext:function(a){Md=a}};Object.assign(ee.prototype,{load:function(a,b,c,d){var e=new Ja(this.manager);e.setResponseType(\"arraybuffer\");e.load(a,function(a){ge.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(Ue.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new K,l=new K;return function(m){if(a!==this||b!==m.focus||c!==m.fov||d!==m.aspect*this.aspect||e!==m.near||f!==m.far||g!==m.zoom||h!==this.eyeSep){a=this;b=m.focus;c=m.fov;\nd=m.aspect*this.aspect;e=m.near;f=m.far;g=m.zoom;var n=m.projectionMatrix.clone();h=this.eyeSep/2;var q=h*e/b,p=e*Math.tan(R.DEG2RAD*c*.5)/g;l.elements[12]=-h;k.elements[12]=h;var u=-p*d+q;var v=p*d+q;n.elements[0]=2*e/(v-u);n.elements[8]=(v+u)/(v-u);this.cameraL.projectionMatrix.copy(n);u=-p*d-q;v=p*d-q;n.elements[0]=2*e/(v-u);n.elements[8]=(v+u)/(v-u);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(m.matrixWorld).multiply(l);this.cameraR.matrixWorld.copy(m.matrixWorld).multiply(k)}}()});\n$c.prototype=Object.create(A.prototype);$c.prototype.constructor=$c;fe.prototype=Object.assign(Object.create(A.prototype),{constructor:fe,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):\nthis.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new p,b=new Z,c=new p,d=new p;return function(e){A.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,\nthis.context.currentTime),e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,\nd.y,d.z,f.x,f.y,f.z))}}()});lc.prototype=Object.assign(Object.create(A.prototype),{constructor:lc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType=\"audioNode\";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType=\"buffer\";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn(\"THREE.Audio: Audio is already playing.\");else if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");\nelse{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);this.startTime=this.context.currentTime;a.start(this.startTime,this.offset);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return!0===this.isPlaying&&(this.source.stop(),this.offset+=(this.context.currentTime-\nthis.startTime)*this.playbackRate,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return this.source.stop(),this.offset=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());\nreturn this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},\nsetFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn(\"THREE.Audio: this Audio has no playback control.\"),\n!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn(\"THREE.Audio: this Audio has no playback control.\");else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});he.prototype=Object.assign(Object.create(lc.prototype),{constructor:he,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=\na},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new p;return function(b){A.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,\na.y,a.z)}}()});Object.assign(ie.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(je.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},apply:function(a){var b=\nthis.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=\n0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){Z.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Ve.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,\nc=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(na,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new na.Composite(a,b,c):new na(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\\s/g,\"_\").replace(/[^\\w-]/g,\"\")},parseTrackName:function(){var a=new RegExp(\"^\"+/((?:[\\w-]+[\\/:])*)/.source+/([\\w-\\.]+)?/.source+/(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?/.source+/\\.([\\w-]+)(?:\\[(.+)\\])?/.source+\n\"$\"),b=[\"material\",\"materials\",\"bones\"];return function(c){var d=a.exec(c);if(!d)throw Error(\"PropertyBinding: Cannot parse trackName: \"+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(\".\");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error(\"PropertyBinding: can not parse propertyName from trackName: \"+\nc);return d}}(),findNode:function(a,b){if(!b||\"\"===b||\"root\"===b||\".\"===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(na.prototype,{_getValue_unavailable:function(){},\n_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=\na[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=\n!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],\ngetValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=na.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case \"materials\":if(!a.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",\nthis);return}if(!a.material.materials){console.error(\"THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.\",this);return}a=a.material.materials;break;case \"bones\":if(!a.skeleton){console.error(\"THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.\",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error(\"THREE.PropertyBinding: Can not bind to objectName of node undefined.\",\nthis);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error(\"THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.\",this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error(\"THREE.PropertyBinding: Trying to update property for track: \"+b.nodeName+\".\"+d+\" but it wasn't found.\",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=\na);c=this.BindingType.Direct;if(void 0!==e){if(\"morphTargetInfluences\"===d){if(!a.geometry){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.\",this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.\",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===\ne){e=c;break}}else{if(!a.geometry.morphTargets){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.\",this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,\nthis.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error(\"THREE.PropertyBinding: Trying to update node for track: \"+this.path+\" but it wasn't found.\")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(na.prototype,{_getValue_unbound:na.prototype.getValue,_setValue_unbound:na.prototype.setValue});Object.assign(We.prototype,\n{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){var m=arguments[k],n=m.uuid,p=d[n];if(void 0===p){p=b++;d[n]=p;a.push(m);for(var n=0,r=h;n!==r;++n)g[n].push(new na(m,e[n],f[n]))}else if(p<c){var u=--c,r=a[u];d[r.uuid]=p;a[p]=r;d[n]=u;a[u]=m;n=0;for(r=h;n!==r;++n){var v=g[n],w=v[p];v[p]=v[u];void 0===w&&(w=new na(m,e[n],f[n]));v[u]=\nw}}else void 0!==a[p]&&console.error(\"THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.\")}this.nCachedObjects_=c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,l=c[k];if(void 0!==l&&l>=b){var m=b++,n=a[m];c[n.uuid]=l;a[l]=n;c[k]=m;a[m]=h;h=0;for(k=e;h!==k;++h){var n=d[h],p=\nn[l];n[l]=n[m];n[m]=p}}}this.nCachedObjects_=b},uncache:function(){for(var a,b,c=this._objects,d=c.length,e=this.nCachedObjects_,f=this._indicesByUUID,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){b=arguments[k].uuid;var m=f[b];if(void 0!==m)if(delete f[b],m<e){var n=--e,p=c[n];b=--d;a=c[b];f[p.uuid]=m;c[m]=p;f[a.uuid]=n;c[n]=a;c.pop();for(var p=0,r=h;p!==r;++p){a=g[p];var u=a[b];a[m]=a[n];a[n]=u;a.pop()}}else for(b=--d,a=c[b],f[a.uuid]=m,c[m]=a,c.pop(),p=0,r=h;p!==r;++p)a=g[p],a[m]=\na[b],a.pop()}this.nCachedObjects_=e},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new na(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=\nf[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(Xe.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},\nisScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);\nthis.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},\nsetDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=\nthis._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;\nfor(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],\nb=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:\"finished\",action:this,direction:0>a?-1:1})}else{d=2202===d;\n-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:\"finished\",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:\"loop\",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=\nb,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ye.prototype,ja.prototype,\n{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===k&&(k={},h[g]=k);for(h=0;h!==e;++h){var l=d[h],m=l.name,n=k[m];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,m));continue}n=new je(na.create(c,m,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n,\ng,m)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,\nc=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},\nget inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);\nf.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var b=a._clip.uuid,c=this._actionsByClip,d=c[b],e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;\nfor(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=\ne);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=\n--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Yc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;\nb[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid,c=\"string\"===typeof a?ka.findByName(c,a):a;a=null!==c?c.uuid:a;var e=this._actionsByClip[a],f=null;if(void 0!==e){f=e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new Xe(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c=\"string\"===typeof a?ka.findByName(c,\na):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;\nb=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=\nthis._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});Jd.prototype.clone=function(){return new Jd(void 0===this.value.clone?this.value:this.value.clone())};ke.prototype=Object.assign(Object.create(D.prototype),\n{constructor:ke,isInstancedBufferGeometry:!0,copy:function(a){D.prototype.copy.call(this,a);this.maxInstancedCount=a.maxInstancedCount;return this},clone:function(){return(new this.constructor).copy(this)}});Object.defineProperties(le.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(le.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*\nthis.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+\n3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(mc.prototype,\"needsUpdate\",{set:function(a){!0===a&&this.version++}});\nObject.assign(mc.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+\nd]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});me.prototype=Object.assign(Object.create(mc.prototype),{constructor:me,isInstancedInterleavedBuffer:!0,copy:function(a){mc.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});ne.prototype=Object.assign(Object.create(P.prototype),{constructor:ne,isInstancedBufferAttribute:!0,\ncopy:function(a){P.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(Ze.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):\nconsole.error(\"THREE.Raycaster: Unsupported camera type.\")},intersectObject:function(a,b){var c=[];oe(a,this,c,b);c.sort($e);return c},intersectObjects:function(a,b){var c=[];if(!1===Array.isArray(a))return console.warn(\"THREE.Raycaster.intersectObjects: objects is not an Array.\"),c;for(var d=0,e=a.length;d<e;d++)oe(a[d],this,c,b);c.sort($e);return c}});Object.assign(af.prototype,{start:function(){this.oldTime=this.startTime=(\"undefined\"===typeof performance?Date:performance).now();this.elapsedTime=\n0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=(\"undefined\"===typeof performance?Date:performance).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign(bf.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},\ncopy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(R.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(cf.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},\ncopy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});ad.prototype=Object.create(A.prototype);ad.prototype.constructor=ad;ad.prototype.isImmediateRenderObject=!0;bd.prototype=Object.create(ca.prototype);bd.prototype.constructor=bd;bd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){var d,e=[\"a\",\"b\",\"c\"];this.object.updateMatrixWorld(!0);\nc.getNormalMatrix(this.object.matrixWorld);var f=this.object.matrixWorld,g=this.geometry.attributes.position;if((d=this.object.geometry)&&d.isGeometry)for(var h=d.vertices,k=d.faces,l=d=0,m=k.length;l<m;l++)for(var n=k[l],p=0,r=n.vertexNormals.length;p<r;p++){var u=n.vertexNormals[p];a.copy(h[n[e[p]]]).applyMatrix4(f);b.copy(u).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);g.setXYZ(d,a.x,a.y,a.z);d+=1;g.setXYZ(d,b.x,b.y,b.z);d+=1}else if(d&&d.isBufferGeometry)for(e=d.attributes.position,\nh=d.attributes.normal,p=d=0,r=e.count;p<r;p++)a.set(e.getX(p),e.getY(p),e.getZ(p)).applyMatrix4(f),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),g.setXYZ(d,a.x,a.y,a.z),d+=1,g.setXYZ(d,b.x,b.y,b.z),d+=1;g.needsUpdate=!0}}();nc.prototype=Object.create(A.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};nc.prototype.update=function(){var a=new p,b=new p;return function(){this.light.updateMatrixWorld();\nvar c=this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}();oc.prototype=Object.create(ca.prototype);oc.prototype.constructor=oc;oc.prototype.updateMatrixWorld=function(){var a=new p,b=new K,c=new K;return function(d){var e=\nthis.bones,f=this.geometry,g=f.getAttribute(\"position\");c.getInverse(this.root.matrixWorld);for(var h=0,k=0;h<e.length;h++){var l=e[h];l.parent&&l.parent.isBone&&(b.multiplyMatrices(c,l.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k,a.x,a.y,a.z),b.multiplyMatrices(c,l.parent.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k+1,a.x,a.y,a.z),k+=2)}f.getAttribute(\"position\").needsUpdate=!0;A.prototype.updateMatrixWorld.call(this,d)}}();pc.prototype=Object.create(pa.prototype);pc.prototype.constructor=\npc;pc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};pc.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};qc.prototype=Object.create(A.prototype);qc.prototype.constructor=qc;qc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};qc.prototype.update=function(){var a=.5*this.light.width,b=.5*this.light.height,c=this.line.geometry.attributes.position,\nd=c.array;d[0]=a;d[1]=-b;d[2]=0;d[3]=a;d[4]=b;d[5]=0;d[6]=-a;d[7]=b;d[8]=0;d[9]=-a;d[10]=-b;d[11]=0;d[12]=a;d[13]=-b;d[14]=0;c.needsUpdate=!0;void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)};rc.prototype=Object.create(A.prototype);rc.prototype.constructor=rc;rc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};rc.prototype.update=function(){var a=new p,b=new H,c=new H;return function(){var d=\nthis.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=d.geometry.getAttribute(\"color\");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}e.needsUpdate=!0}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate())}}();cd.prototype=Object.create(ca.prototype);cd.prototype.constructor=cd;Kd.prototype=Object.create(ca.prototype);Kd.prototype.constructor=Kd;dd.prototype=Object.create(ca.prototype);\ndd.prototype.constructor=dd;dd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<l;k++){var m=f[k],n=m.normal;a.copy(g[m.a]).add(g[m.b]).add(g[m.c]).divideScalar(3).applyMatrix4(d);b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,\na.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();sc.prototype=Object.create(A.prototype);sc.prototype.constructor=sc;sc.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};sc.prototype.update=function(){var a=new p,b=new p,c=new p;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,\na);this.lightPlane.lookAt(c);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(c);this.targetLine.scale.z=c.length()}}();ed.prototype=Object.create(ca.prototype);ed.prototype.constructor=ed;ed.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute(\"position\"),\nh=0,k=a.length;h<k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new p,e=new La;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a(\"c\",0,0,-1);a(\"t\",0,0,1);a(\"n1\",-1,-1,-1);a(\"n2\",1,-1,-1);a(\"n3\",-1,1,-1);a(\"n4\",1,1,-1);a(\"f1\",-1,-1,1);a(\"f2\",1,-1,1);a(\"f3\",-1,1,1);a(\"f4\",1,1,1);a(\"u1\",.7,1.1,-1);a(\"u2\",-.7,1.1,-1);a(\"u3\",0,2,-1);a(\"cf1\",-1,0,1);a(\"cf2\",1,0,1);a(\"cf3\",0,-1,1);a(\"cf4\",0,1,1);a(\"cn1\",-1,0,-1);a(\"cn2\",1,0,-1);a(\"cn3\",0,-1,-1);a(\"cn4\",\n0,1,-1);b.getAttribute(\"position\").needsUpdate=!0}}();Db.prototype=Object.create(ca.prototype);Db.prototype.constructor=Db;Db.prototype.update=function(){var a=new Oa;return function(b){void 0!==b&&console.warn(\"THREE.BoxHelper: .update() has no longer arguments.\");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=\nc.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Db.prototype.setFromObject=function(a){this.object=a;this.update();return this};fd.prototype=Object.create(ca.prototype);fd.prototype.constructor=fd;fd.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),A.prototype.updateMatrixWorld.call(this,\na))};gd.prototype=Object.create(ma.prototype);gd.prototype.constructor=gd;gd.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal);A.prototype.updateMatrixWorld.call(this,a)};var Ld,pe;Eb.prototype=Object.create(A.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,\n0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Eb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};hd.prototype=Object.create(ca.prototype);hd.prototype.constructor=hd;var Nd=new p,\nte=new qe,ue=new qe,ve=new qe;ya.prototype=Object.create(S.prototype);ya.prototype.constructor=ya;ya.prototype.isCatmullRomCurve3=!0;ya.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/c.length)+1)*c.length:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Nd.subVectors(c[0],c[1]).add(c[0]),f=Nd;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Nd.subVectors(c[d-\n1],c[d-2]).add(c[d-1]),c=Nd);if(\"centripetal\"===this.curveType||\"chordal\"===this.curveType){var k=\"chordal\"===this.curveType?.5:.25,d=Math.pow(f.distanceToSquared(g),k),e=Math.pow(g.distanceToSquared(h),k),k=Math.pow(h.distanceToSquared(c),k);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);te.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);ue.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);ve.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else\"catmullrom\"===this.curveType&&(te.initCatmullRom(f.x,g.x,h.x,\nc.x,this.tension),ue.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),ve.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(te.calc(a),ue.calc(a),ve.calc(a));return b};ya.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Fb.prototype=Object.create(S.prototype);Fb.prototype.constructor=Fb;Fb.prototype.isCubicBezierCurve3=\n!0;Fb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(zb(a,c.x,d.x,e.x,f.x),zb(a,c.y,d.y,e.y,f.y),zb(a,c.z,d.z,e.z,f.z));return b};Fb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Gb.prototype=Object.create(S.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isQuadraticBezierCurve3=!0;Gb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,\ne=this.v2;b.set(yb(a,c.x,d.x,e.x),yb(a,c.y,d.y,e.y),yb(a,c.z,d.z,e.z));return b};Gb.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};db.prototype=Object.create(S.prototype);db.prototype.constructor=db;db.prototype.isLineCurve3=!0;db.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};db.prototype.getPointAt=function(a,b){return this.getPoint(a,\nb)};db.prototype.copy=function(a){S.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};id.prototype=Object.create(Na.prototype);id.prototype.constructor=id;id.prototype.isArcCurve=!0;S.create=function(a,b){console.log(\"THREE.Curve.create() has been deprecated\");a.prototype=Object.create(S.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(Ab.prototype,{createPointsGeometry:function(a){console.warn(\"THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.\");\na=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn(\"THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.\");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn(\"THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.\");for(var b=new N,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,\ne.y,e.z||0))}return b}});Object.assign(Bb.prototype,{fromPoints:function(a){console.warn(\"THREE.Path: .fromPoints() has been renamed to .setFromPoints().\");this.setFromPoints(a)}});ef.prototype=Object.create(ya.prototype);ff.prototype=Object.create(ya.prototype);re.prototype=Object.create(ya.prototype);Object.assign(re.prototype,{initFromArray:function(){console.error(\"THREE.Spline: .initFromArray() has been removed.\")},getControlPointsArray:function(){console.error(\"THREE.Spline: .getControlPointsArray() has been removed.\")},\nreparametrizeByArcLength:function(){console.error(\"THREE.Spline: .reparametrizeByArcLength() has been removed.\")}});cd.prototype.setColors=function(){console.error(\"THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.\")};oc.prototype.update=function(){console.error(\"THREE.SkeletonHelper: update() no longer needs to be called.\")};Object.assign(kd.prototype,{center:function(a){console.warn(\"THREE.Box2: .center() has been renamed to .getCenter().\");return this.getCenter(a)},\nempty:function(){console.warn(\"THREE.Box2: .empty() has been renamed to .isEmpty().\");return this.isEmpty()},isIntersectionBox:function(a){console.warn(\"THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},size:function(a){console.warn(\"THREE.Box2: .size() has been renamed to .getSize().\");return this.getSize(a)}});Object.assign(Oa.prototype,{center:function(a){console.warn(\"THREE.Box3: .center() has been renamed to .getCenter().\");return this.getCenter(a)},\nempty:function(){console.warn(\"THREE.Box3: .empty() has been renamed to .isEmpty().\");return this.isEmpty()},isIntersectionBox:function(a){console.warn(\"THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn(\"THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().\");return this.intersectsSphere(a)},size:function(a){console.warn(\"THREE.Box3: .size() has been renamed to .getSize().\");return this.getSize(a)}});\nMb.prototype.center=function(a){console.warn(\"THREE.Line3: .center() has been renamed to .getCenter().\");return this.getCenter(a)};Object.assign(R,{random16:function(){console.warn(\"THREE.Math: .random16() has been deprecated. Use Math.random() instead.\");return Math.random()},nearestPowerOfTwo:function(a){console.warn(\"THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().\");return R.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn(\"THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().\");\nreturn R.ceilPowerOfTwo(a)}});Object.assign(ra.prototype,{flattenToArrayOffset:function(a,b){console.warn(\"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\");return this.toArray(a,b)},multiplyVector3:function(a){console.warn(\"THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.\");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error(\"THREE.Matrix3: .multiplyVector3Array() has been removed.\")},applyToBuffer:function(a){console.warn(\"THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.\");\nreturn this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error(\"THREE.Matrix3: .applyToVector3Array() has been removed.\")}});Object.assign(K.prototype,{extractPosition:function(a){console.warn(\"THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().\");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn(\"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\");return this.toArray(a,b)},getPosition:function(){var a;\nreturn function(){void 0===a&&(a=new p);console.warn(\"THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.\");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn(\"THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().\");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn(\"THREE.Matrix4: .multiplyToArray() has been removed.\")},multiplyVector3:function(a){console.warn(\"THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.\");\nreturn a.applyMatrix4(this)},multiplyVector4:function(a){console.warn(\"THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error(\"THREE.Matrix4: .multiplyVector3Array() has been removed.\")},rotateAxis:function(a){console.warn(\"THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.\");a.transformDirection(this)},crossVector:function(a){console.warn(\"THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.\");\nreturn a.applyMatrix4(this)},translate:function(){console.error(\"THREE.Matrix4: .translate() has been removed.\")},rotateX:function(){console.error(\"THREE.Matrix4: .rotateX() has been removed.\")},rotateY:function(){console.error(\"THREE.Matrix4: .rotateY() has been removed.\")},rotateZ:function(){console.error(\"THREE.Matrix4: .rotateZ() has been removed.\")},rotateByAxis:function(){console.error(\"THREE.Matrix4: .rotateByAxis() has been removed.\")},applyToBuffer:function(a){console.warn(\"THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.\");\nreturn this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error(\"THREE.Matrix4: .applyToVector3Array() has been removed.\")},makeFrustum:function(a,b,c,d,e,f){console.warn(\"THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.\");return this.makePerspective(a,b,d,c,e,f)}});Aa.prototype.isIntersectionLine=function(a){console.warn(\"THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().\");return this.intersectsLine(a)};\nZ.prototype.multiplyVector3=function(a){console.warn(\"THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.\");return a.applyQuaternion(this)};Object.assign(lb.prototype,{isIntersectionBox:function(a){console.warn(\"THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().\");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn(\"THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().\");return this.intersectsPlane(a)},\nisIntersectionSphere:function(a){console.warn(\"THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().\");return this.intersectsSphere(a)}});Object.assign(Cb.prototype,{extractAllPoints:function(a){console.warn(\"THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.\");return this.extractPoints(a)},extrude:function(a){console.warn(\"THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.\");return new $a(this,a)},makeGeometry:function(a){console.warn(\"THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.\");\nreturn new cc(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.warn(\"THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn(\"THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().\");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn(\"THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().\");return this.manhattanLength()}});\nObject.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error(\"THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.\")},setEulerFromQuaternion:function(){console.error(\"THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.\")},getPositionFromMatrix:function(a){console.warn(\"THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().\");return this.setFromMatrixPosition(a)},\ngetScaleFromMatrix:function(a){console.warn(\"THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().\");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn(\"THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().\");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn(\"THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.\");return this.applyMatrix4(a)},fromAttribute:function(a,\nb,c){console.warn(\"THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn(\"THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().\");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn(\"THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().\");return this.manhattanLength()}});Object.assign(da.prototype,{fromAttribute:function(a,\nb,c){console.warn(\"THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().\");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn(\"THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().\");return this.manhattanLength()}});N.prototype.computeTangents=function(){console.warn(\"THREE.Geometry: .computeTangents() has been removed.\")};Object.assign(A.prototype,{getChildByName:function(a){console.warn(\"THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().\");\nreturn this.getObjectByName(a)},renderDepth:function(){console.warn(\"THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.\")},translate:function(a,b){console.warn(\"THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.\");return this.translateOnAxis(b,a)}});Object.defineProperties(A.prototype,{eulerOrder:{get:function(){console.warn(\"THREE.Object3D: .eulerOrder is now .rotation.order.\");return this.rotation.order},set:function(a){console.warn(\"THREE.Object3D: .eulerOrder is now .rotation.order.\");\nthis.rotation.order=a}},useQuaternion:{get:function(){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")},set:function(){console.warn(\"THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.\")}}});Object.defineProperties(Dc.prototype,{objects:{get:function(){console.warn(\"THREE.LOD: .objects has been renamed to .levels.\");return this.levels}}});Object.defineProperty(Ec.prototype,\"useVertexTexture\",{get:function(){console.warn(\"THREE.Skeleton: useVertexTexture has been removed.\")},\nset:function(){console.warn(\"THREE.Skeleton: useVertexTexture has been removed.\")}});Object.defineProperty(S.prototype,\"__arcLengthDivisions\",{get:function(){console.warn(\"THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.\");return this.arcLengthDivisions},set:function(a){console.warn(\"THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.\");this.arcLengthDivisions=a}});U.prototype.setLens=function(a,b){console.warn(\"THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.\");\nvoid 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(ga.prototype,{onlyShadow:{set:function(){console.warn(\"THREE.Light: .onlyShadow has been removed.\")}},shadowCameraFov:{set:function(a){console.warn(\"THREE.Light: .shadowCameraFov is now .shadow.camera.fov.\");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn(\"THREE.Light: .shadowCameraLeft is now .shadow.camera.left.\");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn(\"THREE.Light: .shadowCameraRight is now .shadow.camera.right.\");\nthis.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn(\"THREE.Light: .shadowCameraTop is now .shadow.camera.top.\");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn(\"THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.\");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn(\"THREE.Light: .shadowCameraNear is now .shadow.camera.near.\");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn(\"THREE.Light: .shadowCameraFar is now .shadow.camera.far.\");\nthis.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn(\"THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.\")}},shadowBias:{set:function(a){console.warn(\"THREE.Light: .shadowBias is now .shadow.bias.\");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn(\"THREE.Light: .shadowDarkness has been removed.\")}},shadowMapWidth:{set:function(a){console.warn(\"THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.\");\nthis.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn(\"THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.\");this.shadow.mapSize.height=a}}});Object.defineProperties(P.prototype,{length:{get:function(){console.warn(\"THREE.BufferAttribute: .length has been deprecated. Use .count instead.\");return this.array.length}}});Object.assign(D.prototype,{addIndex:function(a){console.warn(\"THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().\");this.setIndex(a)},addDrawCall:function(a,\nb,c){void 0!==c&&console.warn(\"THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.\");console.warn(\"THREE.BufferGeometry: .addDrawCall() is now .addGroup().\");this.addGroup(a,b)},clearDrawCalls:function(){console.warn(\"THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().\");this.clearGroups()},computeTangents:function(){console.warn(\"THREE.BufferGeometry: .computeTangents() has been removed.\")},computeOffsets:function(){console.warn(\"THREE.BufferGeometry: .computeOffsets() has been removed.\")}});\nObject.defineProperties(D.prototype,{drawcalls:{get:function(){console.error(\"THREE.BufferGeometry: .drawcalls has been renamed to .groups.\");return this.groups}},offsets:{get:function(){console.warn(\"THREE.BufferGeometry: .offsets has been renamed to .groups.\");return this.groups}}});Object.defineProperties(Jd.prototype,{dynamic:{set:function(){console.warn(\"THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.\")}},onUpdate:{value:function(){console.warn(\"THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.\");\nreturn this}}});Object.defineProperties(Q.prototype,{wrapAround:{get:function(){console.warn(\"THREE.Material: .wrapAround has been removed.\")},set:function(){console.warn(\"THREE.Material: .wrapAround has been removed.\")}},wrapRGB:{get:function(){console.warn(\"THREE.Material: .wrapRGB has been removed.\");return new H}},shading:{get:function(){console.error(\"THREE.\"+this.type+\": .shading has been removed. Use the boolean .flatShading instead.\")},set:function(a){console.warn(\"THREE.\"+this.type+\": .shading has been removed. Use the boolean .flatShading instead.\");\nthis.flatShading=1===a}}});Object.defineProperties(Ia.prototype,{metal:{get:function(){console.warn(\"THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.\");return!1},set:function(){console.warn(\"THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead\")}}});Object.defineProperties(oa.prototype,{derivatives:{get:function(){console.warn(\"THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.\");return this.extensions.derivatives},\nset:function(a){console.warn(\"THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.\");this.extensions.derivatives=a}}});Object.assign(Wd.prototype,{getCurrentRenderTarget:function(){console.warn(\"THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().\");return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn(\"THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().\");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn(\"THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.\");\nreturn this.capabilities.precision},resetGLState:function(){console.warn(\"THREE.WebGLRenderer: .resetGLState() is now .state.reset().\");return this.state.reset()},supportsFloatTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).\");return this.extensions.get(\"OES_texture_float\")},supportsHalfFloatTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).\");\nreturn this.extensions.get(\"OES_texture_half_float\")},supportsStandardDerivatives:function(){console.warn(\"THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).\");return this.extensions.get(\"OES_standard_derivatives\")},supportsCompressedTextureS3TC:function(){console.warn(\"THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).\");return this.extensions.get(\"WEBGL_compressed_texture_s3tc\")},\nsupportsCompressedTexturePVRTC:function(){console.warn(\"THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).\");return this.extensions.get(\"WEBGL_compressed_texture_pvrtc\")},supportsBlendMinMax:function(){console.warn(\"THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).\");return this.extensions.get(\"EXT_blend_minmax\")},supportsVertexTextures:function(){console.warn(\"THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.\");\nreturn this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn(\"THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).\");return this.extensions.get(\"ANGLE_instanced_arrays\")},enableScissorTest:function(a){console.warn(\"THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().\");this.setScissorTest(a)},initMaterial:function(){console.warn(\"THREE.WebGLRenderer: .initMaterial() has been removed.\")},addPrePlugin:function(){console.warn(\"THREE.WebGLRenderer: .addPrePlugin() has been removed.\")},\naddPostPlugin:function(){console.warn(\"THREE.WebGLRenderer: .addPostPlugin() has been removed.\")},updateShadowMap:function(){console.warn(\"THREE.WebGLRenderer: .updateShadowMap() has been removed.\")}});Object.defineProperties(Wd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.\");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.\");\nthis.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn(\"THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.\");this.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn(\"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \"+a+\".\");this.renderReverseSided=a}}});Object.defineProperties(Hb.prototype,\n{wrapS:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.\");return this.texture.wrapS},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.\");this.texture.wrapS=a}},wrapT:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.\");return this.texture.wrapT},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.\");this.texture.wrapT=a}},magFilter:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.\");\nreturn this.texture.magFilter},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.\");this.texture.magFilter=a}},minFilter:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.\");return this.texture.minFilter},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.\");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.\");\nreturn this.texture.anisotropy},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.\");this.texture.anisotropy=a}},offset:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .offset is now .texture.offset.\");return this.texture.offset},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .offset is now .texture.offset.\");this.texture.offset=a}},repeat:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .repeat is now .texture.repeat.\");return this.texture.repeat},\nset:function(a){console.warn(\"THREE.WebGLRenderTarget: .repeat is now .texture.repeat.\");this.texture.repeat=a}},format:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .format is now .texture.format.\");return this.texture.format},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .format is now .texture.format.\");this.texture.format=a}},type:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .type is now .texture.type.\");return this.texture.type},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .type is now .texture.type.\");\nthis.texture.type=a}},generateMipmaps:{get:function(){console.warn(\"THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.\");return this.texture.generateMipmaps},set:function(a){console.warn(\"THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.\");this.texture.generateMipmaps=a}}});lc.prototype.load=function(a){console.warn(\"THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.\");var b=this;(new ee).load(a,function(a){b.setBuffer(a)});return this};\nie.prototype.getData=function(){console.warn(\"THREE.AudioAnalyser: .getData() is now .getFrequencyData().\");return this.getFrequencyData()};$c.prototype.updateCubeMap=function(a,b){console.warn(\"THREE.CubeCamera: .updateCubeMap() is now .update().\");return this.update(a,b)};m.WebGLRenderTargetCube=Ib;m.WebGLRenderTarget=Hb;m.WebGLRenderer=Wd;m.ShaderLib=mb;m.UniformsLib=E;m.UniformsUtils=Ea;m.ShaderChunk=W;m.FogExp2=Ob;m.Fog=Pb;m.Scene=od;m.LensFlare=Xd;m.Sprite=Cc;m.LOD=Dc;m.SkinnedMesh=qd;m.Skeleton=\nEc;m.Bone=pd;m.Mesh=pa;m.LineSegments=ca;m.LineLoop=rd;m.Line=ma;m.Points=Qb;m.Group=Fc;m.VideoTexture=sd;m.DataTexture=fb;m.CompressedTexture=Rb;m.CubeTexture=Ua;m.CanvasTexture=tc;m.DepthTexture=Gc;m.Texture=ea;m.CompressedTextureLoader=Qe;m.DataTextureLoader=Zd;m.CubeTextureLoader=$d;m.TextureLoader=td;m.ObjectLoader=Re;m.MaterialLoader=Id;m.BufferGeometryLoader=ae;m.DefaultLoadingManager=wa;m.LoadingManager=Yd;m.JSONLoader=be;m.ImageLoader=Xc;m.FontLoader=Te;m.FileLoader=Ja;m.Loader=kc;m.Cache=\njd;m.AudioLoader=ee;m.SpotLightShadow=vd;m.SpotLight=wd;m.PointLight=xd;m.RectAreaLight=Bd;m.HemisphereLight=ud;m.DirectionalLightShadow=yd;m.DirectionalLight=zd;m.AmbientLight=Ad;m.LightShadow=vb;m.Light=ga;m.StereoCamera=Ue;m.PerspectiveCamera=U;m.OrthographicCamera=Kb;m.CubeCamera=$c;m.ArrayCamera=nd;m.Camera=La;m.AudioListener=fe;m.PositionalAudio=he;m.AudioContext=ge;m.AudioAnalyser=ie;m.Audio=lc;m.VectorKeyframeTrack=ic;m.StringKeyframeTrack=Fd;m.QuaternionKeyframeTrack=Zc;m.NumberKeyframeTrack=\njc;m.ColorKeyframeTrack=Hd;m.BooleanKeyframeTrack=Gd;m.PropertyMixer=je;m.PropertyBinding=na;m.KeyframeTrack=xb;m.AnimationUtils=T;m.AnimationObjectGroup=We;m.AnimationMixer=Ye;m.AnimationClip=ka;m.Uniform=Jd;m.InstancedBufferGeometry=ke;m.BufferGeometry=D;m.Geometry=N;m.InterleavedBufferAttribute=le;m.InstancedInterleavedBuffer=me;m.InterleavedBuffer=mc;m.InstancedBufferAttribute=ne;m.Face3=Pa;m.Object3D=A;m.Raycaster=Ze;m.Layers=Pd;m.EventDispatcher=ja;m.Clock=af;m.QuaternionLinearInterpolant=Ed;\nm.LinearInterpolant=Yc;m.DiscreteInterpolant=Dd;m.CubicInterpolant=Cd;m.Interpolant=xa;m.Triangle=Qa;m.Math=R;m.Spherical=bf;m.Cylindrical=cf;m.Plane=Aa;m.Frustum=ld;m.Sphere=Da;m.Ray=lb;m.Matrix4=K;m.Matrix3=ra;m.Box3=Oa;m.Box2=kd;m.Line3=Mb;m.Euler=Ya;m.Vector4=da;m.Vector3=p;m.Vector2=C;m.Quaternion=Z;m.Color=H;m.ImmediateRenderObject=ad;m.VertexNormalsHelper=bd;m.SpotLightHelper=nc;m.SkeletonHelper=oc;m.PointLightHelper=pc;m.RectAreaLightHelper=qc;m.HemisphereLightHelper=rc;m.GridHelper=cd;m.PolarGridHelper=\nKd;m.FaceNormalsHelper=dd;m.DirectionalLightHelper=sc;m.CameraHelper=ed;m.BoxHelper=Db;m.Box3Helper=fd;m.PlaneHelper=gd;m.ArrowHelper=Eb;m.AxesHelper=hd;m.CatmullRomCurve3=ya;m.CubicBezierCurve3=Fb;m.QuadraticBezierCurve3=Gb;m.LineCurve3=db;m.ArcCurve=id;m.EllipseCurve=Na;m.SplineCurve=ab;m.CubicBezierCurve=bb;m.QuadraticBezierCurve=cb;m.LineCurve=Ka;m.Shape=Cb;m.Path=Bb;m.ShapePath=ce;m.Font=de;m.CurvePath=Ab;m.Curve=S;m.ShapeUtils=Ha;m.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=\nnew Fc,d=0,e=b.length;d<e;d++)c.add(new pa(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){a.applyMatrix((new K).getInverse(c.matrixWorld));b.remove(a);c.add(a)}};m.WebGLUtils=Pe;m.WireframeGeometry=Sb;m.ParametricGeometry=Hc;m.ParametricBufferGeometry=Tb;m.TetrahedronGeometry=Jc;m.TetrahedronBufferGeometry=Ub;m.OctahedronGeometry=Kc;m.OctahedronBufferGeometry=nb;m.IcosahedronGeometry=Lc;m.IcosahedronBufferGeometry=Vb;m.DodecahedronGeometry=\nMc;m.DodecahedronBufferGeometry=Wb;m.PolyhedronGeometry=Ic;m.PolyhedronBufferGeometry=qa;m.TubeGeometry=Nc;m.TubeBufferGeometry=Xb;m.TorusKnotGeometry=Oc;m.TorusKnotBufferGeometry=Yb;m.TorusGeometry=Pc;m.TorusBufferGeometry=Zb;m.TextGeometry=Qc;m.TextBufferGeometry=$b;m.SphereGeometry=Rc;m.SphereBufferGeometry=ob;m.RingGeometry=Sc;m.RingBufferGeometry=ac;m.PlaneGeometry=Ac;m.PlaneBufferGeometry=kb;m.LatheGeometry=Tc;m.LatheBufferGeometry=bc;m.ShapeGeometry=cc;m.ShapeBufferGeometry=dc;m.ExtrudeGeometry=\n$a;m.ExtrudeBufferGeometry=Ga;m.EdgesGeometry=ec;m.ConeGeometry=Uc;m.ConeBufferGeometry=Vc;m.CylinderGeometry=pb;m.CylinderBufferGeometry=Sa;m.CircleGeometry=Wc;m.CircleBufferGeometry=fc;m.BoxGeometry=Lb;m.BoxBufferGeometry=jb;m.ShadowMaterial=gc;m.SpriteMaterial=Za;m.RawShaderMaterial=hc;m.ShaderMaterial=oa;m.PointsMaterial=Ba;m.MeshPhysicalMaterial=qb;m.MeshStandardMaterial=Ma;m.MeshPhongMaterial=Ia;m.MeshToonMaterial=rb;m.MeshNormalMaterial=sb;m.MeshLambertMaterial=tb;m.MeshDepthMaterial=Wa;m.MeshDistanceMaterial=\nXa;m.MeshBasicMaterial=va;m.LineDashedMaterial=ub;m.LineBasicMaterial=O;m.Material=Q;m.Float64BufferAttribute=zc;m.Float32BufferAttribute=y;m.Uint32BufferAttribute=ib;m.Int32BufferAttribute=yc;m.Uint16BufferAttribute=hb;m.Int16BufferAttribute=xc;m.Uint8ClampedBufferAttribute=wc;m.Uint8BufferAttribute=vc;m.Int8BufferAttribute=uc;m.BufferAttribute=P;m.REVISION=\"88\";m.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};m.CullFaceNone=0;m.CullFaceBack=1;m.CullFaceFront=2;m.CullFaceFrontBack=3;m.FrontFaceDirectionCW=0;m.FrontFaceDirectionCCW=\n1;m.BasicShadowMap=0;m.PCFShadowMap=1;m.PCFSoftShadowMap=2;m.FrontSide=0;m.BackSide=1;m.DoubleSide=2;m.FlatShading=1;m.SmoothShading=2;m.NoColors=0;m.FaceColors=1;m.VertexColors=2;m.NoBlending=0;m.NormalBlending=1;m.AdditiveBlending=2;m.SubtractiveBlending=3;m.MultiplyBlending=4;m.CustomBlending=5;m.AddEquation=100;m.SubtractEquation=101;m.ReverseSubtractEquation=102;m.MinEquation=103;m.MaxEquation=104;m.ZeroFactor=200;m.OneFactor=201;m.SrcColorFactor=202;m.OneMinusSrcColorFactor=203;m.SrcAlphaFactor=\n204;m.OneMinusSrcAlphaFactor=205;m.DstAlphaFactor=206;m.OneMinusDstAlphaFactor=207;m.DstColorFactor=208;m.OneMinusDstColorFactor=209;m.SrcAlphaSaturateFactor=210;m.NeverDepth=0;m.AlwaysDepth=1;m.LessDepth=2;m.LessEqualDepth=3;m.EqualDepth=4;m.GreaterEqualDepth=5;m.GreaterDepth=6;m.NotEqualDepth=7;m.MultiplyOperation=0;m.MixOperation=1;m.AddOperation=2;m.NoToneMapping=0;m.LinearToneMapping=1;m.ReinhardToneMapping=2;m.Uncharted2ToneMapping=3;m.CineonToneMapping=4;m.UVMapping=300;m.CubeReflectionMapping=\n301;m.CubeRefractionMapping=302;m.EquirectangularReflectionMapping=303;m.EquirectangularRefractionMapping=304;m.SphericalReflectionMapping=305;m.CubeUVReflectionMapping=306;m.CubeUVRefractionMapping=307;m.RepeatWrapping=1E3;m.ClampToEdgeWrapping=1001;m.MirroredRepeatWrapping=1002;m.NearestFilter=1003;m.NearestMipMapNearestFilter=1004;m.NearestMipMapLinearFilter=1005;m.LinearFilter=1006;m.LinearMipMapNearestFilter=1007;m.LinearMipMapLinearFilter=1008;m.UnsignedByteType=1009;m.ByteType=1010;m.ShortType=\n1011;m.UnsignedShortType=1012;m.IntType=1013;m.UnsignedIntType=1014;m.FloatType=1015;m.HalfFloatType=1016;m.UnsignedShort4444Type=1017;m.UnsignedShort5551Type=1018;m.UnsignedShort565Type=1019;m.UnsignedInt248Type=1020;m.AlphaFormat=1021;m.RGBFormat=1022;m.RGBAFormat=1023;m.LuminanceFormat=1024;m.LuminanceAlphaFormat=1025;m.RGBEFormat=1023;m.DepthFormat=1026;m.DepthStencilFormat=1027;m.RGB_S3TC_DXT1_Format=2001;m.RGBA_S3TC_DXT1_Format=2002;m.RGBA_S3TC_DXT3_Format=2003;m.RGBA_S3TC_DXT5_Format=2004;\nm.RGB_PVRTC_4BPPV1_Format=2100;m.RGB_PVRTC_2BPPV1_Format=2101;m.RGBA_PVRTC_4BPPV1_Format=2102;m.RGBA_PVRTC_2BPPV1_Format=2103;m.RGB_ETC1_Format=2151;m.LoopOnce=2200;m.LoopRepeat=2201;m.LoopPingPong=2202;m.InterpolateDiscrete=2300;m.InterpolateLinear=2301;m.InterpolateSmooth=2302;m.ZeroCurvatureEnding=2400;m.ZeroSlopeEnding=2401;m.WrapAroundEnding=2402;m.TrianglesDrawMode=0;m.TriangleStripDrawMode=1;m.TriangleFanDrawMode=2;m.LinearEncoding=3E3;m.sRGBEncoding=3001;m.GammaEncoding=3007;m.RGBEEncoding=\n3002;m.LogLuvEncoding=3003;m.RGBM7Encoding=3004;m.RGBM16Encoding=3005;m.RGBDEncoding=3006;m.BasicDepthPacking=3200;m.RGBADepthPacking=3201;m.CubeGeometry=Lb;m.Face4=function(a,b,c,d,e,f,g){console.warn(\"THREE.Face4 has been removed. A THREE.Face3 will be created instead.\");return new Pa(a,b,c,e,f,g)};m.LineStrip=0;m.LinePieces=1;m.MeshFaceMaterial=function(a){console.warn(\"THREE.MeshFaceMaterial has been removed. Use an Array instead.\");return a};m.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn(\"THREE.MultiMaterial has been removed. Use an Array instead.\");\na.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};m.PointCloud=function(a,b){console.warn(\"THREE.PointCloud has been renamed to THREE.Points.\");return new Qb(a,b)};m.Particle=function(a){console.warn(\"THREE.Particle has been renamed to THREE.Sprite.\");return new Cc(a)};m.ParticleSystem=function(a,b){console.warn(\"THREE.ParticleSystem has been renamed to THREE.Points.\");return new Qb(a,b)};m.PointCloudMaterial=function(a){console.warn(\"THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.\");\nreturn new Ba(a)};m.ParticleBasicMaterial=function(a){console.warn(\"THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.\");return new Ba(a)};m.ParticleSystemMaterial=function(a){console.warn(\"THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.\");return new Ba(a)};m.Vertex=function(a,b,c){console.warn(\"THREE.Vertex has been removed. Use THREE.Vector3 instead.\");return new p(a,b,c)};m.DynamicBufferAttribute=function(a,b){console.warn(\"THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.\");\nreturn(new P(a,b)).setDynamic(!0)};m.Int8Attribute=function(a,b){console.warn(\"THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.\");return new uc(a,b)};m.Uint8Attribute=function(a,b){console.warn(\"THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.\");return new vc(a,b)};m.Uint8ClampedAttribute=function(a,b){console.warn(\"THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.\");return new wc(a,\nb)};m.Int16Attribute=function(a,b){console.warn(\"THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.\");return new xc(a,b)};m.Uint16Attribute=function(a,b){console.warn(\"THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.\");return new hb(a,b)};m.Int32Attribute=function(a,b){console.warn(\"THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.\");return new yc(a,b)};m.Uint32Attribute=function(a,b){console.warn(\"THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.\");\nreturn new ib(a,b)};m.Float32Attribute=function(a,b){console.warn(\"THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.\");return new y(a,b)};m.Float64Attribute=function(a,b){console.warn(\"THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.\");return new zc(a,b)};m.ClosedSplineCurve3=ef;m.SplineCurve3=ff;m.Spline=re;m.AxisHelper=function(a){console.warn(\"THREE.AxisHelper has been renamed to THREE.AxesHelper.\");return new hd(a)};\nm.BoundingBoxHelper=function(a,b){console.warn(\"THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.\");return new Db(a,b)};m.EdgesHelper=function(a,b){console.warn(\"THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.\");return new ca(new ec(a.geometry),new O({color:void 0!==b?b:16777215}))};m.WireframeHelper=function(a,b){console.warn(\"THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.\");return new ca(new Sb(a.geometry),new O({color:void 0!==\nb?b:16777215}))};m.XHRLoader=function(a){console.warn(\"THREE.XHRLoader has been renamed to THREE.FileLoader.\");return new Ja(a)};m.BinaryTextureLoader=function(a){console.warn(\"THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.\");return new Zd(a)};m.GeometryUtils={merge:function(a,b,c){console.warn(\"THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.\");if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();\nvar d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn(\"THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.\");return a.center()}};m.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn(\"THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.\");var e=new td;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn(\"THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.\");\nvar e=new $d;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error(\"THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.\")},loadCompressedTextureCube:function(){console.error(\"THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.\")}};m.Projector=function(){console.error(\"THREE.Projector has been moved to /examples/js/renderers/Projector.js.\");this.projectVector=\nfunction(a,b){console.warn(\"THREE.Projector: .projectVector() is now vector.project().\");a.project(b)};this.unprojectVector=function(a,b){console.warn(\"THREE.Projector: .unprojectVector() is now vector.unproject().\");a.unproject(b)};this.pickingRay=function(){console.error(\"THREE.Projector: .pickingRay() is now raycaster.setFromCamera().\")}};m.CanvasRenderer=function(){console.error(\"THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js\");this.domElement=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\n\"canvas\");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(m,\"__esModule\",{value:!0})});\n",
     "'use strict';\n\nmodule.exports = TinyQueue;\n\nfunction TinyQueue(data, compare) {\n    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);\n\n    this.data = data || [];\n    this.length = this.data.length;\n    this.compare = compare || defaultCompare;\n\n    if (this.length > 0) {\n        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);\n    }\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nTinyQueue.prototype = {\n\n    push: function (item) {\n        this.data.push(item);\n        this.length++;\n        this._up(this.length - 1);\n    },\n\n    pop: function () {\n        if (this.length === 0) return undefined;\n        var top = this.data[0];\n        this.length--;\n        if (this.length > 0) {\n            this.data[0] = this.data[this.length];\n            this._down(0);\n        }\n        this.data.pop();\n        return top;\n    },\n\n    peek: function () {\n        return this.data[0];\n    },\n\n    _up: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var item = data[pos];\n\n        while (pos > 0) {\n            var parent = (pos - 1) >> 1;\n            var current = data[parent];\n            if (compare(item, current) >= 0) break;\n            data[pos] = current;\n            pos = parent;\n        }\n\n        data[pos] = item;\n    },\n\n    _down: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var len = this.length;\n        var halfLen = len >> 1;\n        var item = data[pos];\n\n        while (pos < halfLen) {\n            var left = (pos << 1) + 1;\n            var right = left + 1;\n            var best = data[left];\n\n            if (right < len && compare(data[right], best) < 0) {\n                left = right;\n                best = data[right];\n            }\n            if (compare(best, item) >= 0) break;\n\n            data[pos] = best;\n            pos = left;\n        }\n\n        data[pos] = item;\n    }\n};\n",
     "//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n",
     "var createElement = require(\"./vdom/create-element.js\")\n\nmodule.exports = createElement\n",
     "/** @license MIT License (c) copyright 2010-2014 original author or authors */\n\n/**\n * Promises/A+ and when() implementation\n * when is part of the cujoJS family of libraries (http://cujojs.com/)\n * @author Brian Cavalier\n * @author John Hann\n */\n(function(define) { 'use strict';\ndefine(function (require) {\n\n\tvar timed = require('./lib/decorators/timed');\n\tvar array = require('./lib/decorators/array');\n\tvar flow = require('./lib/decorators/flow');\n\tvar fold = require('./lib/decorators/fold');\n\tvar inspect = require('./lib/decorators/inspect');\n\tvar generate = require('./lib/decorators/iterate');\n\tvar progress = require('./lib/decorators/progress');\n\tvar withThis = require('./lib/decorators/with');\n\tvar unhandledRejection = require('./lib/decorators/unhandledRejection');\n\tvar TimeoutError = require('./lib/TimeoutError');\n\n\tvar Promise = [array, flow, fold, generate, progress,\n\t\tinspect, withThis, timed, unhandledRejection]\n\t\t.reduce(function(Promise, feature) {\n\t\t\treturn feature(Promise);\n\t\t}, require('./lib/Promise'));\n\n\tvar apply = require('./lib/apply')(Promise);\n\n\t// Public API\n\n\twhen.promise     = promise;              // Create a pending promise\n\twhen.resolve     = Promise.resolve;      // Create a resolved promise\n\twhen.reject      = Promise.reject;       // Create a rejected promise\n\n\twhen.lift        = lift;                 // lift a function to return promises\n\twhen['try']      = attempt;              // call a function and return a promise\n\twhen.attempt     = attempt;              // alias for when.try\n\n\twhen.iterate     = Promise.iterate;      // DEPRECATED (use cujojs/most streams) Generate a stream of promises\n\twhen.unfold      = Promise.unfold;       // DEPRECATED (use cujojs/most streams) Generate a stream of promises\n\n\twhen.join        = join;                 // Join 2 or more promises\n\n\twhen.all         = all;                  // Resolve a list of promises\n\twhen.settle      = settle;               // Settle a list of promises\n\n\twhen.any         = lift(Promise.any);    // One-winner race\n\twhen.some        = lift(Promise.some);   // Multi-winner race\n\twhen.race        = lift(Promise.race);   // First-to-settle race\n\n\twhen.map         = map;                  // Array.map() for promises\n\twhen.filter      = filter;               // Array.filter() for promises\n\twhen.reduce      = lift(Promise.reduce);       // Array.reduce() for promises\n\twhen.reduceRight = lift(Promise.reduceRight);  // Array.reduceRight() for promises\n\n\twhen.isPromiseLike = isPromiseLike;      // Is something promise-like, aka thenable\n\n\twhen.Promise     = Promise;              // Promise constructor\n\twhen.defer       = defer;                // Create a {promise, resolve, reject} tuple\n\n\t// Error types\n\n\twhen.TimeoutError = TimeoutError;\n\n\t/**\n\t * Get a trusted promise for x, or by transforming x with onFulfilled\n\t *\n\t * @param {*} x\n\t * @param {function?} onFulfilled callback to be called when x is\n\t *   successfully fulfilled.  If promiseOrValue is an immediate value, callback\n\t *   will be invoked immediately.\n\t * @param {function?} onRejected callback to be called when x is\n\t *   rejected.\n\t * @param {function?} onProgress callback to be called when progress updates\n\t *   are issued for x. @deprecated\n\t * @returns {Promise} a new promise that will fulfill with the return\n\t *   value of callback or errback or the completion value of promiseOrValue if\n\t *   callback and/or errback is not supplied.\n\t */\n\tfunction when(x, onFulfilled, onRejected, onProgress) {\n\t\tvar p = Promise.resolve(x);\n\t\tif (arguments.length < 2) {\n\t\t\treturn p;\n\t\t}\n\n\t\treturn p.then(onFulfilled, onRejected, onProgress);\n\t}\n\n\t/**\n\t * Creates a new promise whose fate is determined by resolver.\n\t * @param {function} resolver function(resolve, reject, notify)\n\t * @returns {Promise} promise whose fate is determine by resolver\n\t */\n\tfunction promise(resolver) {\n\t\treturn new Promise(resolver);\n\t}\n\n\t/**\n\t * Lift the supplied function, creating a version of f that returns\n\t * promises, and accepts promises as arguments.\n\t * @param {function} f\n\t * @returns {Function} version of f that returns promises\n\t */\n\tfunction lift(f) {\n\t\treturn function() {\n\t\t\tfor(var i=0, l=arguments.length, a=new Array(l); i<l; ++i) {\n\t\t\t\ta[i] = arguments[i];\n\t\t\t}\n\t\t\treturn apply(f, this, a);\n\t\t};\n\t}\n\n\t/**\n\t * Call f in a future turn, with the supplied args, and return a promise\n\t * for the result.\n\t * @param {function} f\n\t * @returns {Promise}\n\t */\n\tfunction attempt(f /*, args... */) {\n\t\t/*jshint validthis:true */\n\t\tfor(var i=0, l=arguments.length-1, a=new Array(l); i<l; ++i) {\n\t\t\ta[i] = arguments[i+1];\n\t\t}\n\t\treturn apply(f, this, a);\n\t}\n\n\t/**\n\t * Creates a {promise, resolver} pair, either or both of which\n\t * may be given out safely to consumers.\n\t * @return {{promise: Promise, resolve: function, reject: function, notify: function}}\n\t */\n\tfunction defer() {\n\t\treturn new Deferred();\n\t}\n\n\tfunction Deferred() {\n\t\tvar p = Promise._defer();\n\n\t\tfunction resolve(x) { p._handler.resolve(x); }\n\t\tfunction reject(x) { p._handler.reject(x); }\n\t\tfunction notify(x) { p._handler.notify(x); }\n\n\t\tthis.promise = p;\n\t\tthis.resolve = resolve;\n\t\tthis.reject = reject;\n\t\tthis.notify = notify;\n\t\tthis.resolver = { resolve: resolve, reject: reject, notify: notify };\n\t}\n\n\t/**\n\t * Determines if x is promise-like, i.e. a thenable object\n\t * NOTE: Will return true for *any thenable object*, and isn't truly\n\t * safe, since it may attempt to access the `then` property of x (i.e.\n\t *  clever/malicious getters may do weird things)\n\t * @param {*} x anything\n\t * @returns {boolean} true if x is promise-like\n\t */\n\tfunction isPromiseLike(x) {\n\t\treturn x && typeof x.then === 'function';\n\t}\n\n\t/**\n\t * Return a promise that will resolve only once all the supplied arguments\n\t * have resolved. The resolution value of the returned promise will be an array\n\t * containing the resolution values of each of the arguments.\n\t * @param {...*} arguments may be a mix of promises and values\n\t * @returns {Promise}\n\t */\n\tfunction join(/* ...promises */) {\n\t\treturn Promise.all(arguments);\n\t}\n\n\t/**\n\t * Return a promise that will fulfill once all input promises have\n\t * fulfilled, or reject when any one input promise rejects.\n\t * @param {array|Promise} promises array (or promise for an array) of promises\n\t * @returns {Promise}\n\t */\n\tfunction all(promises) {\n\t\treturn when(promises, Promise.all);\n\t}\n\n\t/**\n\t * Return a promise that will always fulfill with an array containing\n\t * the outcome states of all input promises.  The returned promise\n\t * will only reject if `promises` itself is a rejected promise.\n\t * @param {array|Promise} promises array (or promise for an array) of promises\n\t * @returns {Promise} promise for array of settled state descriptors\n\t */\n\tfunction settle(promises) {\n\t\treturn when(promises, Promise.settle);\n\t}\n\n\t/**\n\t * Promise-aware array map function, similar to `Array.prototype.map()`,\n\t * but input array may contain promises or values.\n\t * @param {Array|Promise} promises array of anything, may contain promises and values\n\t * @param {function(x:*, index:Number):*} mapFunc map function which may\n\t *  return a promise or value\n\t * @returns {Promise} promise that will fulfill with an array of mapped values\n\t *  or reject if any input promise rejects.\n\t */\n\tfunction map(promises, mapFunc) {\n\t\treturn when(promises, function(promises) {\n\t\t\treturn Promise.map(promises, mapFunc);\n\t\t});\n\t}\n\n\t/**\n\t * Filter the provided array of promises using the provided predicate.  Input may\n\t * contain promises and values\n\t * @param {Array|Promise} promises array of promises and values\n\t * @param {function(x:*, index:Number):boolean} predicate filtering predicate.\n\t *  Must return truthy (or promise for truthy) for items to retain.\n\t * @returns {Promise} promise that will fulfill with an array containing all items\n\t *  for which predicate returned truthy.\n\t */\n\tfunction filter(promises, predicate) {\n\t\treturn when(promises, function(promises) {\n\t\t\treturn Promise.filter(promises, predicate);\n\t\t});\n\t}\n\n\treturn when;\n});\n})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });\n",
     "var nativeIsArray = Array.isArray\nvar toString = Object.prototype.toString\n\nmodule.exports = nativeIsArray || isArray\n\nfunction isArray(obj) {\n    return toString.call(obj) === \"[object Array]\"\n}\n",
     "export {APIv3} from \"./api/APIv3\";\nexport {ModelCreator} from \"./api/ModelCreator\";\nexport * from \"./api/interfaces/interfaces\";\n",
-    "export {Component} from \"./component/Component\";\nexport {ComponentService} from \"./component/ComponentService\";\nexport {HandlerBase} from \"./component/utils/HandlerBase\";\nexport {AttributionComponent} from \"./component/AttributionComponent\";\nexport {BackgroundComponent} from \"./component/BackgroundComponent\";\nexport {BearingComponent} from \"./component/BearingComponent\";\nexport {CacheComponent} from \"./component/CacheComponent\";\nexport {CoverComponent} from \"./component/CoverComponent\";\nexport {DebugComponent} from \"./component/DebugComponent\";\nexport {DirectionComponent} from \"./component/direction/DirectionComponent\";\nexport {DirectionDOMCalculator} from \"./component/direction/DirectionDOMCalculator\";\nexport {DirectionDOMRenderer} from \"./component/direction/DirectionDOMRenderer\";\nexport {ImageComponent} from \"./component/ImageComponent\";\nexport {KeyboardComponent} from \"./component/keyboard/KeyboardComponent\";\nexport {KeyZoomHandler} from \"./component/keyboard/KeyZoomHandler\";\nexport {KeySequenceNavigationHandler} from \"./component/keyboard/KeySequenceNavigationHandler\";\nexport {KeySpatialNavigationHandler} from \"./component/keyboard/KeySpatialNavigationHandler\";\nexport {LoadingComponent} from \"./component/LoadingComponent\";\nexport {Marker} from \"./component/marker/marker/Marker\";\nexport {MarkerComponent} from \"./component/marker/MarkerComponent\";\nexport {MarkerScene} from \"./component/marker/MarkerScene\";\nexport {MarkerSet} from \"./component/marker/MarkerSet\";\nexport {MouseComponent} from \"./component/mouse/MouseComponent\";\nexport * from \"./component/mouse/HandlerTypes\";\nexport {BounceHandler} from \"./component/mouse/BounceHandler\";\nexport {DragPanHandler} from \"./component/mouse/DragPanHandler\";\nexport {DoubleClickZoomHandler} from \"./component/mouse/DoubleClickZoomHandler\";\nexport {ScrollZoomHandler} from \"./component/mouse/ScrollZoomHandler\";\nexport {TouchZoomHandler} from \"./component/mouse/TouchZoomHandler\";\nexport {Popup} from \"./component/popup/popup/Popup\";\nexport {PopupComponent} from \"./component/popup/PopupComponent\";\nexport {PopupAlignment} from \"./component/popup/popup/PopupAlignment\";\nexport {IPopupOffset} from \"./component/popup/interfaces/IPopupOffset\";\nexport {IPopupOptions} from \"./component/popup/interfaces/IPopupOptions\";\nexport {NavigationComponent} from \"./component/NavigationComponent\";\nexport {RouteComponent} from \"./component/RouteComponent\";\nexport {SequenceComponent} from \"./component/sequence/SequenceComponent\";\nexport {SequenceDOMRenderer} from \"./component/sequence/SequenceDOMRenderer\";\nexport {SequenceDOMInteraction} from \"./component/sequence/SequenceDOMInteraction\";\nexport {ImagePlaneComponent} from \"./component/imageplane/ImagePlaneComponent\";\nexport {ImagePlaneFactory} from \"./component/imageplane/ImagePlaneFactory\";\nexport {ImagePlaneGLRenderer} from \"./component/imageplane/ImagePlaneGLRenderer\";\nexport {ImagePlaneScene} from \"./component/imageplane/ImagePlaneScene\";\nexport {ImagePlaneShaders} from \"./component/imageplane/ImagePlaneShaders\";\nexport {SimpleMarker} from \"./component/marker/marker/SimpleMarker\";\nexport {CircleMarker} from \"./component/marker/marker/CircleMarker\";\nexport {SliderComponent} from \"./component/imageplane/SliderComponent\";\nexport {StatsComponent} from \"./component/StatsComponent\";\nexport {TagHandlerBase} from \"./component/tag/handlers/TagHandlerBase\";\nexport {CreateHandlerBase} from \"./component/tag/handlers/CreateHandlerBase\";\nexport {CreatePointHandler} from \"./component/tag/handlers/CreatePointHandler\";\nexport {CreateVertexHandler} from \"./component/tag/handlers/CreateVertexHandler\";\nexport {CreatePolygonHandler} from \"./component/tag/handlers/CreatePolygonHandler\";\nexport {CreateRectHandler} from \"./component/tag/handlers/CreateRectHandler\";\nexport {CreateRectDragHandler} from \"./component/tag/handlers/CreateRectDragHandler\";\nexport {EditVertexHandler} from \"./component/tag/handlers/EditVertexHandler\";\nexport {Tag} from \"./component/tag/tag/Tag\";\nexport {OutlineTag} from \"./component/tag/tag/OutlineTag\";\nexport {RenderTag} from \"./component/tag/tag/RenderTag\";\nexport {OutlineRenderTag} from \"./component/tag/tag/OutlineRenderTag\";\nexport {OutlineCreateTag} from \"./component/tag/tag/OutlineCreateTag\";\nexport {SpotTag} from \"./component/tag/tag/SpotTag\";\nexport {SpotRenderTag} from \"./component/tag/tag/SpotRenderTag\";\nexport {TagComponent} from \"./component/tag/TagComponent\";\nexport {TagCreator} from \"./component/tag/TagCreator\";\nexport {TagDOMRenderer} from \"./component/tag/TagDOMRenderer\";\nexport {TagMode} from \"./component/tag/TagMode\";\nexport {TagOperation} from \"./component/tag/TagOperation\";\nexport {TagScene} from \"./component/tag/TagScene\";\nexport {TagSet} from \"./component/tag/TagSet\";\nexport {Geometry} from \"./component/tag/geometry/Geometry\";\nexport {VertexGeometry} from \"./component/tag/geometry/VertexGeometry\";\nexport {RectGeometry} from \"./component/tag/geometry/RectGeometry\";\nexport {PointGeometry} from \"./component/tag/geometry/PointGeometry\";\nexport {PolygonGeometry} from \"./component/tag/geometry/PolygonGeometry\";\nexport {GeometryTagError} from \"./component/tag/error/GeometryTagError\";\nexport * from \"./component/interfaces/interfaces\";\n",
+    "export {Component} from \"./component/Component\";\nexport {ComponentService} from \"./component/ComponentService\";\nexport {HandlerBase} from \"./component/utils/HandlerBase\";\nexport {AttributionComponent} from \"./component/AttributionComponent\";\nexport {BackgroundComponent} from \"./component/BackgroundComponent\";\nexport {BearingComponent} from \"./component/BearingComponent\";\nexport {CacheComponent} from \"./component/CacheComponent\";\nexport {CoverComponent} from \"./component/CoverComponent\";\nexport {DebugComponent} from \"./component/DebugComponent\";\nexport {DirectionComponent} from \"./component/direction/DirectionComponent\";\nexport {DirectionDOMCalculator} from \"./component/direction/DirectionDOMCalculator\";\nexport {DirectionDOMRenderer} from \"./component/direction/DirectionDOMRenderer\";\nexport {ImageComponent} from \"./component/ImageComponent\";\nexport {KeyboardComponent} from \"./component/keyboard/KeyboardComponent\";\nexport {KeyPlayHandler} from \"./component/keyboard/KeyPlayHandler\";\nexport {KeyZoomHandler} from \"./component/keyboard/KeyZoomHandler\";\nexport {KeySequenceNavigationHandler} from \"./component/keyboard/KeySequenceNavigationHandler\";\nexport {KeySpatialNavigationHandler} from \"./component/keyboard/KeySpatialNavigationHandler\";\nexport {LoadingComponent} from \"./component/LoadingComponent\";\nexport {Marker} from \"./component/marker/marker/Marker\";\nexport {MarkerComponent} from \"./component/marker/MarkerComponent\";\nexport {MarkerScene} from \"./component/marker/MarkerScene\";\nexport {MarkerSet} from \"./component/marker/MarkerSet\";\nexport {MouseComponent} from \"./component/mouse/MouseComponent\";\nexport * from \"./component/mouse/HandlerTypes\";\nexport {BounceHandler} from \"./component/mouse/BounceHandler\";\nexport {DragPanHandler} from \"./component/mouse/DragPanHandler\";\nexport {DoubleClickZoomHandler} from \"./component/mouse/DoubleClickZoomHandler\";\nexport {ScrollZoomHandler} from \"./component/mouse/ScrollZoomHandler\";\nexport {TouchZoomHandler} from \"./component/mouse/TouchZoomHandler\";\nexport {Popup} from \"./component/popup/popup/Popup\";\nexport {PopupComponent} from \"./component/popup/PopupComponent\";\nexport {PopupAlignment} from \"./component/popup/popup/PopupAlignment\";\nexport {IPopupOffset} from \"./component/popup/interfaces/IPopupOffset\";\nexport {IPopupOptions} from \"./component/popup/interfaces/IPopupOptions\";\nexport {NavigationComponent} from \"./component/NavigationComponent\";\nexport {RouteComponent} from \"./component/RouteComponent\";\nexport {SequenceComponent} from \"./component/sequence/SequenceComponent\";\nexport {SequenceDOMRenderer} from \"./component/sequence/SequenceDOMRenderer\";\nexport {SequenceDOMInteraction} from \"./component/sequence/SequenceDOMInteraction\";\nexport {ControlMode} from \"./component/sequence/ControlMode\";\nexport {ImagePlaneComponent} from \"./component/imageplane/ImagePlaneComponent\";\nexport {ImagePlaneFactory} from \"./component/imageplane/ImagePlaneFactory\";\nexport {ImagePlaneGLRenderer} from \"./component/imageplane/ImagePlaneGLRenderer\";\nexport {ImagePlaneScene} from \"./component/imageplane/ImagePlaneScene\";\nexport {ImagePlaneShaders} from \"./component/imageplane/ImagePlaneShaders\";\nexport {SimpleMarker} from \"./component/marker/marker/SimpleMarker\";\nexport {CircleMarker} from \"./component/marker/marker/CircleMarker\";\nexport {SliderComponent} from \"./component/imageplane/SliderComponent\";\nexport {StatsComponent} from \"./component/StatsComponent\";\nexport {TagHandlerBase} from \"./component/tag/handlers/TagHandlerBase\";\nexport {CreateHandlerBase} from \"./component/tag/handlers/CreateHandlerBase\";\nexport {CreatePointHandler} from \"./component/tag/handlers/CreatePointHandler\";\nexport {CreateVertexHandler} from \"./component/tag/handlers/CreateVertexHandler\";\nexport {CreatePolygonHandler} from \"./component/tag/handlers/CreatePolygonHandler\";\nexport {CreateRectHandler} from \"./component/tag/handlers/CreateRectHandler\";\nexport {CreateRectDragHandler} from \"./component/tag/handlers/CreateRectDragHandler\";\nexport {EditVertexHandler} from \"./component/tag/handlers/EditVertexHandler\";\nexport {Tag} from \"./component/tag/tag/Tag\";\nexport {OutlineTag} from \"./component/tag/tag/OutlineTag\";\nexport {RenderTag} from \"./component/tag/tag/RenderTag\";\nexport {OutlineRenderTag} from \"./component/tag/tag/OutlineRenderTag\";\nexport {OutlineCreateTag} from \"./component/tag/tag/OutlineCreateTag\";\nexport {SpotTag} from \"./component/tag/tag/SpotTag\";\nexport {SpotRenderTag} from \"./component/tag/tag/SpotRenderTag\";\nexport {TagComponent} from \"./component/tag/TagComponent\";\nexport {TagCreator} from \"./component/tag/TagCreator\";\nexport {TagDOMRenderer} from \"./component/tag/TagDOMRenderer\";\nexport {TagMode} from \"./component/tag/TagMode\";\nexport {TagOperation} from \"./component/tag/TagOperation\";\nexport {TagScene} from \"./component/tag/TagScene\";\nexport {TagSet} from \"./component/tag/TagSet\";\nexport {Geometry} from \"./component/tag/geometry/Geometry\";\nexport {VertexGeometry} from \"./component/tag/geometry/VertexGeometry\";\nexport {RectGeometry} from \"./component/tag/geometry/RectGeometry\";\nexport {PointGeometry} from \"./component/tag/geometry/PointGeometry\";\nexport {PolygonGeometry} from \"./component/tag/geometry/PolygonGeometry\";\nexport {GeometryTagError} from \"./component/tag/error/GeometryTagError\";\nexport * from \"./component/interfaces/interfaces\";\n",
     "export {EdgeDirection} from \"./graph/edge/EdgeDirection\";\nexport {EdgeCalculatorSettings} from \"./graph/edge/EdgeCalculatorSettings\";\nexport {EdgeCalculatorDirections} from \"./graph/edge/EdgeCalculatorDirections\";\nexport {EdgeCalculatorCoefficients} from \"./graph/edge/EdgeCalculatorCoefficients\";\nexport {EdgeCalculator} from \"./graph/edge/EdgeCalculator\";\nexport * from \"./graph/edge/interfaces/interfaces\";\n",
     "export {ArgumentMapillaryError} from \"./error/ArgumentMapillaryError\";\nexport {GraphMapillaryError} from \"./error/GraphMapillaryError\";\nexport {MapillaryError} from \"./error/MapillaryError\";\n",
     "export {Camera} from \"./geo/Camera\";\nexport {GeoCoords} from \"./geo/GeoCoords\";\nexport {ViewportCoords} from \"./geo/ViewportCoords\";\nexport {Spatial} from \"./geo/Spatial\";\nexport {Transform} from \"./geo/Transform\";\nexport * from \"./geo/interfaces/interfaces\";\n",
-    "export {\n    FilterCreator,\n    FilterFunction,\n} from \"./graph/FilterCreator\";\nexport {\n    FilterExpression,\n    FilterOperation,\n    FilterOperator,\n    FilterValue,\n} from \"./graph/FilterExpression\";\nexport {Graph} from \"./graph/Graph\";\nexport {GraphCalculator} from \"./graph/GraphCalculator\";\nexport {GraphService} from \"./graph/GraphService\";\nexport {ImageLoadingService} from \"./graph/ImageLoadingService\";\nexport {MeshReader} from \"./graph/MeshReader\";\nexport {Node} from \"./graph/Node\";\nexport {NodeCache} from \"./graph/NodeCache\";\nexport {Sequence} from \"./graph/Sequence\";\nexport * from \"./graph/interfaces/interfaces\";\n",
+    "export {\n    FilterCreator,\n    FilterFunction,\n} from \"./graph/FilterCreator\";\nexport {\n    FilterExpression,\n    FilterOperation,\n    FilterOperator,\n    FilterValue,\n} from \"./graph/FilterExpression\";\nexport {Graph} from \"./graph/Graph\";\nexport {GraphCalculator} from \"./graph/GraphCalculator\";\nexport {GraphMode} from \"./graph/GraphMode\";\nexport {GraphService} from \"./graph/GraphService\";\nexport {ImageLoadingService} from \"./graph/ImageLoadingService\";\nexport {MeshReader} from \"./graph/MeshReader\";\nexport {Node} from \"./graph/Node\";\nexport {NodeCache} from \"./graph/NodeCache\";\nexport {Sequence} from \"./graph/Sequence\";\nexport * from \"./graph/interfaces/interfaces\";\n",
     "/**\n * MapillaryJS is a WebGL JavaScript library for exploring street level imagery\n * @name Mapillary\n */\n\nexport * from \"./Support\";\n\nexport {EdgeDirection} from \"./Edge\";\nexport {RenderMode} from \"./Render\";\nexport {\n    Alignment,\n    ImageSize,\n    Viewer,\n} from \"./Viewer\";\n\nimport * as TagComponent from \"./component/tag/Tag\";\nexport {TagComponent};\n\nimport * as MarkerComponent from \"./component/marker/Marker\";\nexport {MarkerComponent};\n\nimport * as PopupComponent from \"./component/popup/Popup\";\nexport {PopupComponent};\n",
     "export {DOMRenderer} from \"./render/DOMRenderer\";\nexport {GLRenderer} from \"./render/GLRenderer\";\nexport {GLRenderStage} from \"./render/GLRenderStage\";\nexport {RenderCamera} from \"./render/RenderCamera\";\nexport {RenderMode} from \"./render/RenderMode\";\nexport {RenderService} from \"./render/RenderService\";\nexport * from \"./render/interfaces/interfaces\";\n",
     "export {State} from \"./state/State\";\nexport {StateBase} from \"./state/states/StateBase\";\nexport {StateContext} from \"./state/StateContext\";\nexport {StateService} from \"./state/StateService\";\nexport {TraversingState} from \"./state/states/TraversingState\";\nexport {WaitingState} from \"./state/states/WaitingState\";\nexport * from \"./state/interfaces/interfaces\";\n",
     "import * as support from \"./utils/Support\";\n\n/**\n * Test whether the current browser supports the full\n * functionality of MapillaryJS.\n *\n * @description The full functionality includes WebGL rendering.\n *\n * @return {boolean}\n *\n * @example `var supported = Mapillary.isSupported();`\n */\nexport function isSupported(): boolean {\n    return isFallbackSupported() &&\n        support.isWebGLSupportedCached();\n}\n\n/**\n * Test whether the current browser supports the fallback\n * functionality of MapillaryJS.\n *\n * @description The fallback functionality does not include WebGL\n * rendering, only 2D canvas rendering.\n *\n * @return {boolean}\n *\n * @example `var fallbackSupported = Mapillary.isFallbackSupported();`\n */\nexport function isFallbackSupported(): boolean {\n    return support.isBrowser() &&\n        support.isArraySupported() &&\n        support.isFunctionSupported() &&\n        support.isJSONSupported() &&\n        support.isObjectSupported();\n}\n",
     "export {ImageTileLoader} from \"./tiles/ImageTileLoader\";\nexport {ImageTileStore} from \"./tiles/ImageTileStore\";\nexport {TextureProvider} from \"./tiles/TextureProvider\";\nexport {RegionOfInterestCalculator} from \"./tiles/RegionOfInterestCalculator\";\nexport * from \"./tiles/interfaces/interfaces\";\n",
     "export {DOM} from \"./utils/DOM\";\nexport {EventEmitter} from \"./utils/EventEmitter\";\nexport {Func} from \"./utils/Func\";\nexport {Settings} from \"./utils/Settings\";\nexport * from \"./utils/Support\";\nexport {Urls} from \"./utils/Urls\";\n",
-    "export {Alignment} from \"./viewer/Alignment\";\nexport {CacheService} from \"./viewer/CacheService\";\nexport {ComponentController} from \"./viewer/ComponentController\";\nexport {Container} from \"./viewer/Container\";\nexport {Observer} from \"./viewer/Observer\";\nexport {ImageSize} from \"./viewer/ImageSize\";\nexport {KeyboardService} from \"./viewer/KeyboardService\";\nexport {LoadingService} from \"./viewer/LoadingService\";\nexport {MouseService} from \"./viewer/MouseService\";\nexport {Navigator} from \"./viewer/Navigator\";\nexport {Projection} from \"./viewer/Projection\";\nexport {SpriteService} from \"./viewer/SpriteService\";\nexport {TouchService} from \"./viewer/TouchService\";\nexport {Viewer} from \"./viewer/Viewer\";\nexport * from \"./viewer/interfaces/interfaces\";\n",
+    "export {Alignment} from \"./viewer/Alignment\";\nexport {CacheService} from \"./viewer/CacheService\";\nexport {ComponentController} from \"./viewer/ComponentController\";\nexport {Container} from \"./viewer/Container\";\nexport {Observer} from \"./viewer/Observer\";\nexport {ImageSize} from \"./viewer/ImageSize\";\nexport {KeyboardService} from \"./viewer/KeyboardService\";\nexport {LoadingService} from \"./viewer/LoadingService\";\nexport {MouseService} from \"./viewer/MouseService\";\nexport {Navigator} from \"./viewer/Navigator\";\nexport {PlayService} from \"./viewer/PlayService\";\nexport {Projection} from \"./viewer/Projection\";\nexport {SpriteService} from \"./viewer/SpriteService\";\nexport {TouchService} from \"./viewer/TouchService\";\nexport {Viewer} from \"./viewer/Viewer\";\nexport * from \"./viewer/interfaces/interfaces\";\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as falcor from \"falcor\";\n\nimport {Observable} from \"rxjs/Observable\";\n\nimport \"rxjs/add/observable/defer\";\nimport \"rxjs/add/observable/fromPromise\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/map\";\n\nimport {\n    ICoreNode,\n    IFillNode,\n    IFullNode,\n    ISequence,\n    ModelCreator,\n} from \"../API\";\n\ninterface IFalcorResult<T> {\n    json: T;\n}\n\ninterface IImageByKey<T> {\n    imageByKey: { [key: string]: T };\n}\n\ninterface IImageCloseTo<T> {\n    imageCloseTo: { [key: string]: T };\n}\n\ninterface IImagesByH<T> {\n    imagesByH: { [key: string]: { [index: string]: T } };\n}\n\ninterface ISequenceByKey<T> {\n    sequenceByKey: { [sequenceKey: string]: T };\n}\n\ntype APIPath =\n    \"imageByKey\" |\n    \"imageCloseTo\" |\n    \"imagesByH\" |\n    \"imageViewAdd\" |\n    \"sequenceByKey\" |\n    \"sequenceViewAdd\";\n\n/**\n * @class APIv3\n *\n * @classdesc Provides methods for access of API v3.\n */\nexport class APIv3 {\n    private _clientId: string;\n\n    private _model: falcor.Model;\n    private _modelCreator: ModelCreator;\n\n    private _pageCount: number;\n\n    private _pathImageByKey: APIPath;\n    private _pathImageCloseTo: APIPath;\n    private _pathImagesByH: APIPath;\n    private _pathImageViewAdd: APIPath;\n    private _pathSequenceByKey: APIPath;\n    private _pathSequenceViewAdd: APIPath;\n\n    private _propertiesCore: string[];\n    private _propertiesFill: string[];\n    private _propertiesKey: string[];\n    private _propertiesSequence: string[];\n    private _propertiesSpatial: string[];\n    private _propertiesUser: string[];\n\n    /**\n     * Create a new api v3 instance.\n     *\n     * @param {number} clientId - Client id for API requests.\n     * @param {number} [token] - Optional bearer token for API requests of\n     * protected resources.\n     * @param {ModelCreator} [creator] - Optional model creator instance.\n     */\n    constructor(clientId: string, token?: string, creator?: ModelCreator) {\n        this._clientId = clientId;\n\n        this._modelCreator = creator != null ? creator : new ModelCreator();\n        this._model = this._modelCreator.createModel(clientId, token);\n\n        this._pageCount = 999;\n\n        this._pathImageByKey = \"imageByKey\";\n        this._pathImageCloseTo = \"imageCloseTo\";\n        this._pathImagesByH = \"imagesByH\";\n        this._pathImageViewAdd = \"imageViewAdd\";\n        this._pathSequenceByKey = \"sequenceByKey\";\n        this._pathSequenceViewAdd = \"sequenceViewAdd\";\n\n        this._propertiesCore = [\n            \"cl\",\n            \"l\",\n            \"sequence\",\n        ];\n\n        this._propertiesFill = [\n            \"captured_at\",\n            \"user\",\n            \"project\",\n        ];\n\n        this._propertiesKey = [\n            \"key\",\n        ];\n\n        this._propertiesSequence = [\n            \"keys\",\n        ];\n\n        this._propertiesSpatial = [\n            \"atomic_scale\",\n            \"ca\",\n            \"calt\",\n            \"cca\",\n            \"cfocal\",\n            \"gpano\",\n            \"height\",\n            \"merge_cc\",\n            \"merge_version\",\n            \"c_rotation\",\n            \"orientation\",\n            \"width\",\n        ];\n\n        this._propertiesUser = [\n            \"username\",\n        ];\n    }\n\n    public imageByKeyFill$(keys: string[]): Observable<{ [key: string]: IFillNode }> {\n        return this._catchInvalidateGet$(\n            this._wrapPromise$<IFalcorResult<IImageByKey<IFillNode>>>(this._model.get([\n                this._pathImageByKey,\n                keys,\n                this._propertiesKey\n                    .concat(this._propertiesFill)\n                    .concat(this._propertiesSpatial),\n                this._propertiesKey\n                    .concat(this._propertiesUser)]))\n            .map(\n                (value: IFalcorResult<IImageByKey<IFillNode>>): { [key: string]: IFillNode } => {\n                    if (!value) {\n                        throw new Error(`Images (${keys.join(\", \")}) could not be found.`);\n                    }\n\n                    return value.json.imageByKey;\n                }),\n            this._pathImageByKey,\n            keys);\n    }\n\n    public imageByKeyFull$(keys: string[]): Observable<{ [key: string]: IFullNode }> {\n        return this._catchInvalidateGet$(\n            this._wrapPromise$<IFalcorResult<IImageByKey<IFullNode>>>(this._model.get([\n                this._pathImageByKey,\n                keys,\n                this._propertiesKey\n                    .concat(this._propertiesCore)\n                    .concat(this._propertiesFill)\n                    .concat(this._propertiesSpatial),\n                this._propertiesKey\n                    .concat(this._propertiesUser)]))\n            .map(\n                (value: IFalcorResult<IImageByKey<IFullNode>>): { [key: string]: IFullNode } => {\n                    if (!value) {\n                        throw new Error(`Images (${keys.join(\", \")}) could not be found.`);\n                    }\n\n                    return value.json.imageByKey;\n                }),\n            this._pathImageByKey,\n            keys);\n    }\n\n    public imageCloseTo$(lat: number, lon: number): Observable<IFullNode> {\n        let lonLat: string = `${lon}:${lat}`;\n        return this._catchInvalidateGet$(\n            this._wrapPromise$<IFalcorResult<IImageCloseTo<IFullNode>>>(this._model.get([\n                this._pathImageCloseTo,\n                [lonLat],\n                this._propertiesKey\n                    .concat(this._propertiesCore)\n                    .concat(this._propertiesFill)\n                    .concat(this._propertiesSpatial),\n                this._propertiesKey\n                    .concat(this._propertiesUser)]))\n            .map(\n                (value: IFalcorResult<IImageCloseTo<IFullNode>>): IFullNode => {\n                    return value != null ? value.json.imageCloseTo[lonLat] : null;\n                }),\n            this._pathImageCloseTo,\n            [lonLat]);\n    }\n\n    public imagesByH$(hs: string[]): Observable<{ [h: string]: { [index: string]: ICoreNode } }> {\n        return this._catchInvalidateGet$(\n            this._wrapPromise$<IFalcorResult<IImagesByH<ICoreNode>>>(this._model.get([\n                this._pathImagesByH,\n                hs,\n                { from: 0, to: this._pageCount },\n                this._propertiesKey\n                    .concat(this._propertiesCore),\n                this._propertiesKey]))\n            .map(\n                (value: IFalcorResult<IImagesByH<ICoreNode>>): { [h: string]: { [index: string]: ICoreNode } } => {\n                    if (value == null) {\n                        value = { json: { imagesByH: {} } };\n                        for (let h of hs) {\n                            value.json.imagesByH[h] = {};\n                            for (let i: number = 0; i <= this._pageCount; i++) {\n                                value.json.imagesByH[h][i] = null;\n                            }\n                        }\n                    }\n\n                    return value.json.imagesByH;\n                }),\n            this._pathImagesByH,\n            hs);\n    }\n\n    public imageViewAdd$(keys: string[]): Observable<void> {\n        return this._catchInvalidateCall$(\n            this._wrapPromise$<void>(\n                this._model.call(\n                    [this._pathImageViewAdd],\n                    [keys])),\n            this._pathImageViewAdd,\n            keys);\n    }\n\n    public invalidateImageByKey(keys: string[]): void {\n        this._invalidateGet(this._pathImageByKey, keys);\n    }\n\n    public invalidateImagesByH(hs: string[]): void {\n        this._invalidateGet(this._pathImagesByH, hs);\n    }\n\n    public invalidateSequenceByKey(sKeys: string[]): void {\n        this._invalidateGet(this._pathSequenceByKey, sKeys);\n    }\n\n    public setToken(token?: string): void {\n        this._model.invalidate([]);\n        this._model = null;\n        this._model = this._modelCreator.createModel(this._clientId, token);\n    }\n\n    public sequenceByKey$(sequenceKeys: string[]): Observable<{ [sequenceKey: string]: ISequence }> {\n        return this._catchInvalidateGet$(\n            this._wrapPromise$<IFalcorResult<ISequenceByKey<ISequence>>>(this._model.get([\n                this._pathSequenceByKey,\n                sequenceKeys,\n                this._propertiesKey\n                    .concat(this._propertiesSequence)]))\n            .map(\n                (value: IFalcorResult<ISequenceByKey<ISequence>>): { [sequenceKey: string]: ISequence } => {\n                    return value.json.sequenceByKey;\n                }),\n            this._pathSequenceByKey,\n            sequenceKeys);\n    }\n\n    public sequenceViewAdd$(sequenceKeys: string[]): Observable<void> {\n        return this._catchInvalidateCall$(\n            this._wrapPromise$<void>(\n                this._model.call(\n                    [this._pathSequenceViewAdd],\n                    [sequenceKeys])),\n            this._pathSequenceViewAdd,\n            sequenceKeys);\n    }\n\n    public get clientId(): string {\n        return this._clientId;\n    }\n\n    private _catchInvalidateGet$<TResult>(observable: Observable<TResult>, path: APIPath, paths: string[]): Observable<TResult> {\n        return observable\n            .catch(\n                (error: Error): Observable<TResult> => {\n                    this._invalidateGet(path, paths);\n\n                    throw error;\n                });\n    }\n\n    private _catchInvalidateCall$<TResult>(observable: Observable<TResult>, path: APIPath, paths: string[]): Observable<TResult> {\n        return observable\n            .catch(\n                (error: Error): Observable<TResult> => {\n                    this._invalidateCall(path, paths);\n\n                    throw error;\n                });\n    }\n\n    private _invalidateGet(path: APIPath, paths: string[]): void {\n        this._model.invalidate([path, paths]);\n    }\n\n    private _invalidateCall(path: APIPath, paths: string[]): void {\n        this._model.invalidate([path], [paths]);\n    }\n\n    private _wrapPromise$<T>(promise: Promise<T>): Observable<T> {\n        return Observable.defer(() => Observable.fromPromise(promise));\n    }\n}\n\nexport default APIv3;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as falcor from \"falcor\";\nimport * as HttpDataSource from \"falcor-http-datasource\";\n\nimport {Urls} from \"../Utils\";\n\ntype HttpDataSourceConfiguration = {\n    crossDomain: boolean;\n    withCredentials: boolean;\n    headers?: { [key: string]: string } ;\n};\n\n/**\n * @class ModelCreator\n *\n * @classdesc Creates API models.\n */\nexport class ModelCreator {\n    /**\n     * Creates a Falcor model.\n     *\n     * @description Max cache size will be set to 16 MB. Authorization\n     * header will be added if bearer token is supplied.\n     *\n     * @param {number} clientId - Client id for API requests.\n     * @param {number} [token] - Optional bearer token for API requests of\n     * protected resources.\n     * @returns {falcor.Model} Falcor model for HTTP requests.\n     */\n    public createModel(clientId: string, token?: string): falcor.Model {\n        const configuration: HttpDataSourceConfiguration = {\n            crossDomain: true,\n            withCredentials: false,\n        };\n\n        if (token != null) {\n            configuration.headers = { \"Authorization\": `Bearer ${token}` };\n        }\n\n        return new falcor.Model({\n            maxSize: 16 * 1024 * 1024,\n            source: new HttpDataSource(Urls.falcorModel(clientId), configuration),\n        });\n    }\n}\n\nexport default ModelCreator;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {Container, Navigator} from \"../Viewer\";\nimport {Node} from \"../Graph\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\nimport {IVNodeHash} from \"../Render\";\n\nexport class AttributionComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"attribution\";\n    private _disposable: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._disposable = this._navigator.stateService.currentNode$\n            .map(\n                (node: Node): IVNodeHash => {\n                    return {name: this._name, vnode: this._getAttributionNode(node.username, node.key)};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._disposable.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getAttributionNode(username: string, photoId: string): vd.VNode {\n        return vd.h(\"div.Attribution\", {}, [\n            vd.h(\"a\", {href: `https://www.mapillary.com/app/user/${username}`,\n                       target: \"_blank\",\n                       textContent: `@${username}`,\n                      },\n                 []),\n            vd.h(\"span\", {textContent: \"|\"}, []),\n            vd.h(\"a\", {href: `https://www.mapillary.com/app/?pKey=${photoId}&focus=photo`,\n                       target: \"_blank\",\n                       textContent: \"mapillary.com\",\n                      },\n                 []),\n        ]);\n    }\n}\n\nComponentService.register(AttributionComponent);\nexport default AttributionComponent;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Container, Navigator} from \"../Viewer\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\n\nexport class BackgroundComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"background\";\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._container.domRenderer.render$\n            .next({name: this._name, vnode: this._getBackgroundNode(\"The viewer can't display the given photo.\")});\n    }\n\n    protected _deactivate(): void {\n        return;\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getBackgroundNode(notice: string): vd.VNode {\n        // todo: add condition for when to display the DOM node\n        return vd.h(\"div.BackgroundWrapper\", {}, [\n            vd.h(\"p\", {textContent: notice}, []),\n        ]);\n    }\n}\n\nComponentService.register(BackgroundComponent);\nexport default BackgroundComponent;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    ComponentService,\n    IComponentConfiguration,\n} from \"../Component\";\nimport {\n    Spatial,\n    Transform,\n} from \"../Geo\";\nimport {Node} from \"../Graph\";\nimport {\n    IVNodeHash,\n    RenderCamera,\n} from \"../Render\";\nimport {IFrame} from \"../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../Viewer\";\n\nexport class BearingComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"bearing\";\n\n    private _spatial: Spatial;\n    private _svgNamespace: string;\n    private _distinctThreshold: number;\n\n    private _renderSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._spatial = new Spatial();\n        this._svgNamespace = \"http://www.w3.org/2000/svg\";\n        this._distinctThreshold = Math.PI / 90;\n    }\n\n    protected _activate(): void {\n        let nodeBearingFov$: Observable<[number, number]> = this._navigator.stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .map(\n                (frame: IFrame): [number, number] => {\n                    let node: Node = frame.state.currentNode;\n                    let transform: Transform = frame.state.currentTransform;\n\n                    if (node.pano) {\n                        let hFov: number = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;\n\n                        return [this._spatial.degToRad(node.ca), hFov];\n                    }\n\n                    let size: number = Math.max(transform.basicWidth, transform.basicHeight);\n\n                    if (size <= 0) {\n                        console.warn(\n                            `Original image size (${transform.basicWidth}, ${transform.basicHeight}) is invalid (${node.key}. ` +\n                            \"Not showing available fov.\");\n                    }\n\n                    let hFov: number = size > 0 ?\n                        2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) :\n                        0;\n\n                    return [this._spatial.degToRad(node.ca), hFov];\n                })\n            .distinctUntilChanged(\n                (a1: [number, number], a2: [number, number]): boolean => {\n                    return Math.abs(a2[0] - a1[0]) < this._distinctThreshold &&\n                        Math.abs(a2[1] - a1[1]) < this._distinctThreshold;\n                });\n\n        let cameraBearingFov$: Observable<[number, number]> = this._container.renderService.renderCamera$\n            .map(\n                (rc: RenderCamera): [number, number] => {\n                    let vFov: number = this._spatial.degToRad(rc.perspective.fov);\n                    let hFov: number = rc.perspective.aspect === Number.POSITIVE_INFINITY ?\n                        Math.PI :\n                        Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;\n\n                    return [this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];\n                })\n            .distinctUntilChanged(\n                (a1: [number, number], a2: [number, number]): boolean => {\n                    return Math.abs(a2[0] - a1[0]) < this._distinctThreshold &&\n                        Math.abs(a2[1] - a1[1]) < this._distinctThreshold;\n                });\n\n        this._renderSubscription = Observable\n            .combineLatest(\n                nodeBearingFov$,\n                cameraBearingFov$)\n            .map(\n                (args: [[number, number], [number, number]]): IVNodeHash => {\n                    let background: vd.VNode = vd.h(\n                        \"div.BearingIndicatorBackground\",\n                        { oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); } },\n                        [\n                            vd.h(\"div.BearingIndicatorBackgroundRectangle\", {}, []),\n                            vd.h(\"div.BearingIndicatorBackgroundCircle\", {}, []),\n                        ]);\n\n                    let north: vd.VNode = vd.h(\"div.BearingIndicatorNorth\", {}, []);\n\n                    let nodeSector: vd.VNode = this._createCircleSector(args[0][0], args[0][1], \"#000\");\n                    let cameraSector: vd.VNode = this._createCircleSector(args[1][0], args[1][1], \"#fff\");\n\n                    let compass: vd.VNode = this._createCircleSectorCompass(nodeSector, cameraSector);\n\n                    return {\n                        name: this._name,\n                        vnode: vd.h(\n                            \"div.BearingIndicator\",\n                            {},\n                            [\n                                background,\n                                north,\n                                compass,\n                            ]),\n                    };\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._renderSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _createCircleSectorCompass(nodeSector: vd.VNode, cameraSector: vd.VNode): vd.VNode {\n        let group: vd.VNode =\n            vd.h(\n                \"g\",\n                {\n                    attributes: { transform: \"translate(1,1)\" },\n                    namespace: this._svgNamespace,\n                },\n                [nodeSector, cameraSector]);\n\n        let centerCircle: vd.VNode =\n             vd.h(\n                \"circle\",\n                {\n                    attributes: {\n                        cx: \"1\",\n                        cy: \"1\",\n                        fill: \"#abb1b9\",\n                        r: \"0.291667\",\n                        stroke: \"#000\",\n                        \"stroke-width\": \"0.0833333\",\n                    },\n                    namespace: this._svgNamespace,\n                },\n                []);\n\n        let svg: vd.VNode =\n            vd.h(\n                \"svg\",\n                {\n                    attributes: { viewBox: \"0 0 2 2\" },\n                    namespace: this._svgNamespace,\n                    style: {\n                        bottom: \"4px\",\n                        height: \"48px\",\n                        left: \"4px\",\n                        position: \"absolute\",\n                        width: \"48px\",\n                    },\n                },\n                [group, centerCircle]);\n\n        return svg;\n    }\n\n    private _createCircleSector(bearing: number, fov: number, fill: string): vd.VNode {\n        if (fov > 2 * Math.PI - Math.PI / 90) {\n            return vd.h(\n            \"circle\",\n            {\n                attributes: { cx: \"0\", cy: \"0\", fill: fill, r: \"1\" },\n                namespace: this._svgNamespace,\n            },\n            []);\n        }\n\n        let arcStart: number = bearing - fov / 2 - Math.PI / 2;\n        let arcEnd: number = arcStart + fov;\n\n        let startX: number = Math.cos(arcStart);\n        let startY: number = Math.sin(arcStart);\n\n        let endX: number = Math.cos(arcEnd);\n        let endY: number = Math.sin(arcEnd);\n\n        let largeArc: number = fov >= Math.PI ? 1 : 0;\n\n        let description: string = `M 0 0 ${startX} ${startY} A 1 1 0 ${largeArc} 1 ${endX} ${endY}`;\n\n        return vd.h(\n            \"path\",\n            {\n                attributes: { d: description, fill: fill },\n                namespace: this._svgNamespace,\n            },\n            []);\n    }\n}\n\nComponentService.register(BearingComponent);\nexport default BearingComponent;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {Container, Navigator} from \"../Viewer\";\nimport {Node} from \"../Graph\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\nimport {IVNodeHash} from \"../Render\";\n\nexport class AttributionComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"attribution\";\n    private _disposable: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._disposable = this._navigator.stateService.currentNode$\n            .map(\n                (node: Node): IVNodeHash => {\n                    return {name: this._name, vnode: this._getAttributionNode(node.username, node.key)};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._disposable.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getAttributionNode(username: string, key: string): vd.VNode {\n        return vd.h(\"div.Attribution\", {}, [\n            vd.h(\"a\", {href: `https://www.mapillary.com/app/user/${username}`,\n                       target: \"_blank\",\n                       textContent: `@${username}`,\n                      },\n                 []),\n            vd.h(\"span\", {textContent: \"|\"}, []),\n            vd.h(\"a\", {href: `https://www.mapillary.com/app/?pKey=${key}&focus=photo`,\n                       target: \"_blank\",\n                       textContent: \"mapillary.com\",\n                      },\n                 []),\n        ]);\n    }\n}\n\nComponentService.register(AttributionComponent);\nexport default AttributionComponent;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Container, Navigator} from \"../Viewer\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\n\nexport class BackgroundComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"background\";\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._container.domRenderer.render$\n            .next({name: this._name, vnode: this._getBackgroundNode(\"The viewer can't display the given image.\")});\n    }\n\n    protected _deactivate(): void {\n        return;\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getBackgroundNode(notice: string): vd.VNode {\n        // todo: add condition for when to display the DOM node\n        return vd.h(\"div.BackgroundWrapper\", {}, [\n            vd.h(\"p\", {textContent: notice}, []),\n        ]);\n    }\n}\n\nComponentService.register(BackgroundComponent);\nexport default BackgroundComponent;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    ComponentService,\n    IComponentConfiguration,\n} from \"../Component\";\nimport {\n    Spatial,\n    Transform,\n} from \"../Geo\";\nimport {Node} from \"../Graph\";\nimport {\n    IVNodeHash,\n    RenderCamera,\n} from \"../Render\";\nimport {IFrame} from \"../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../Viewer\";\n\nexport class BearingComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"bearing\";\n\n    private _spatial: Spatial;\n    private _svgNamespace: string;\n    private _distinctThreshold: number;\n\n    private _renderSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._spatial = new Spatial();\n        this._svgNamespace = \"http://www.w3.org/2000/svg\";\n        this._distinctThreshold = Math.PI / 90;\n    }\n\n    protected _activate(): void {\n        let nodeBearingFov$: Observable<[number, number]> = this._navigator.stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .map(\n                (frame: IFrame): [number, number] => {\n                    let node: Node = frame.state.currentNode;\n                    let transform: Transform = frame.state.currentTransform;\n\n                    if (node.pano) {\n                        let panoHFov: number = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;\n\n                        return [this._spatial.degToRad(node.ca), panoHFov];\n                    }\n\n                    let size: number = Math.max(transform.basicWidth, transform.basicHeight);\n\n                    if (size <= 0) {\n                        console.warn(\n                            `Original image size (${transform.basicWidth}, ${transform.basicHeight}) is invalid (${node.key}. ` +\n                            \"Not showing available fov.\");\n                    }\n\n                    let hFov: number = size > 0 ?\n                        2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) :\n                        0;\n\n                    return [this._spatial.degToRad(node.ca), hFov];\n                })\n            .distinctUntilChanged(\n                (a1: [number, number], a2: [number, number]): boolean => {\n                    return Math.abs(a2[0] - a1[0]) < this._distinctThreshold &&\n                        Math.abs(a2[1] - a1[1]) < this._distinctThreshold;\n                });\n\n        let cameraBearingFov$: Observable<[number, number]> = this._container.renderService.renderCamera$\n            .map(\n                (rc: RenderCamera): [number, number] => {\n                    let vFov: number = this._spatial.degToRad(rc.perspective.fov);\n                    let hFov: number = rc.perspective.aspect === Number.POSITIVE_INFINITY ?\n                        Math.PI :\n                        Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;\n\n                    return [this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];\n                })\n            .distinctUntilChanged(\n                (a1: [number, number], a2: [number, number]): boolean => {\n                    return Math.abs(a2[0] - a1[0]) < this._distinctThreshold &&\n                        Math.abs(a2[1] - a1[1]) < this._distinctThreshold;\n                });\n\n        this._renderSubscription = Observable\n            .combineLatest(\n                nodeBearingFov$,\n                cameraBearingFov$)\n            .map(\n                (args: [[number, number], [number, number]]): IVNodeHash => {\n                    let background: vd.VNode = vd.h(\n                        \"div.BearingIndicatorBackground\",\n                        { oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); } },\n                        [\n                            vd.h(\"div.BearingIndicatorBackgroundRectangle\", {}, []),\n                            vd.h(\"div.BearingIndicatorBackgroundCircle\", {}, []),\n                        ]);\n\n                    let north: vd.VNode = vd.h(\"div.BearingIndicatorNorth\", {}, []);\n\n                    let nodeSector: vd.VNode = this._createCircleSector(args[0][0], args[0][1], \"#000\");\n                    let cameraSector: vd.VNode = this._createCircleSector(args[1][0], args[1][1], \"#fff\");\n\n                    let compass: vd.VNode = this._createCircleSectorCompass(nodeSector, cameraSector);\n\n                    return {\n                        name: this._name,\n                        vnode: vd.h(\n                            \"div.BearingIndicator\",\n                            {},\n                            [\n                                background,\n                                north,\n                                compass,\n                            ]),\n                    };\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._renderSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _createCircleSectorCompass(nodeSector: vd.VNode, cameraSector: vd.VNode): vd.VNode {\n        let group: vd.VNode =\n            vd.h(\n                \"g\",\n                {\n                    attributes: { transform: \"translate(1,1)\" },\n                    namespace: this._svgNamespace,\n                },\n                [nodeSector, cameraSector]);\n\n        let centerCircle: vd.VNode =\n             vd.h(\n                \"circle\",\n                {\n                    attributes: {\n                        cx: \"1\",\n                        cy: \"1\",\n                        fill: \"#abb1b9\",\n                        r: \"0.291667\",\n                        stroke: \"#000\",\n                        \"stroke-width\": \"0.0833333\",\n                    },\n                    namespace: this._svgNamespace,\n                },\n                []);\n\n        let svg: vd.VNode =\n            vd.h(\n                \"svg\",\n                {\n                    attributes: { viewBox: \"0 0 2 2\" },\n                    namespace: this._svgNamespace,\n                    style: {\n                        bottom: \"4px\",\n                        height: \"48px\",\n                        left: \"4px\",\n                        position: \"absolute\",\n                        width: \"48px\",\n                    },\n                },\n                [group, centerCircle]);\n\n        return svg;\n    }\n\n    private _createCircleSector(bearing: number, fov: number, fill: string): vd.VNode {\n        if (fov > 2 * Math.PI - Math.PI / 90) {\n            return vd.h(\n            \"circle\",\n            {\n                attributes: { cx: \"0\", cy: \"0\", fill: fill, r: \"1\" },\n                namespace: this._svgNamespace,\n            },\n            []);\n        }\n\n        let arcStart: number = bearing - fov / 2 - Math.PI / 2;\n        let arcEnd: number = arcStart + fov;\n\n        let startX: number = Math.cos(arcStart);\n        let startY: number = Math.sin(arcStart);\n\n        let endX: number = Math.cos(arcEnd);\n        let endY: number = Math.sin(arcEnd);\n\n        let largeArc: number = fov >= Math.PI ? 1 : 0;\n\n        let description: string = `M 0 0 ${startX} ${startY} A 1 1 0 ${largeArc} 1 ${endX} ${endY}`;\n\n        return vd.h(\n            \"path\",\n            {\n                attributes: { d: description, fill: fill },\n                namespace: this._svgNamespace,\n            },\n            []);\n    }\n}\n\nComponentService.register(BearingComponent);\nexport default BearingComponent;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\nimport \"rxjs/add/observable/from\";\nimport \"rxjs/add/observable/merge\";\nimport \"rxjs/add/observable/of\";\nimport \"rxjs/add/observable/zip\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/combineLatest\";\nimport \"rxjs/add/operator/distinct\";\nimport \"rxjs/add/operator/expand\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/mergeAll\";\nimport \"rxjs/add/operator/skip\";\nimport \"rxjs/add/operator/switchMap\";\n\nimport {EdgeDirection, IEdge} from \"../Edge\";\nimport {IEdgeStatus, Node} from \"../Graph\";\nimport {ComponentService, Component, ICacheConfiguration, ICacheDepth} from \"../Component\";\nimport {Container, Navigator} from \"../Viewer\";\n\ntype EdgesDepth = [IEdge[], number];\n\nexport class CacheComponent extends Component<ICacheConfiguration> {\n    public static componentName: string = \"cache\";\n\n    private _sequenceSubscription: Subscription;\n    private _spatialSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    /**\n     * Set the cache depth.\n     *\n     * Configures the cache depth. The cache depth can be different for\n     * different edge direction types.\n     *\n     * @param {ICacheDepth} depth - Cache depth structure.\n     */\n    public setDepth(depth: ICacheDepth): void {\n        this.configure({ depth: depth });\n    }\n\n    protected _activate(): void {\n        this._sequenceSubscription = Observable\n            .combineLatest(\n                this._navigator.stateService.currentNode$\n                    .switchMap(\n                        (node: Node): Observable<IEdgeStatus> => {\n                            return node.sequenceEdges$;\n                        })\n                    .filter(\n                        (status: IEdgeStatus): boolean => {\n                            return status.cached;\n                        }),\n                this._configuration$)\n            .switchMap(\n                (nc: [IEdgeStatus, ICacheConfiguration]): Observable<EdgesDepth> => {\n                    let status: IEdgeStatus = nc[0];\n                    let configuration: ICacheConfiguration = nc[1];\n\n                    let sequenceDepth: number = Math.max(0, Math.min(4, configuration.depth.sequence));\n\n                    let next$: Observable<EdgesDepth> = this._cache$(status.edges, EdgeDirection.Next, sequenceDepth);\n                    let prev$: Observable<EdgesDepth> = this._cache$(status.edges, EdgeDirection.Prev, sequenceDepth);\n\n                    return Observable\n                        .merge<EdgesDepth>(\n                            next$,\n                            prev$)\n                        .catch(\n                            (error: Error, caught: Observable<EdgesDepth>): Observable<EdgesDepth> => {\n                                console.error(\"Failed to cache sequence edges.\", error);\n\n                                return Observable.empty<EdgesDepth>();\n                            });\n                 })\n            .subscribe(() => { /*noop*/ });\n\n        this._spatialSubscription = this._navigator.stateService.currentNode$\n                .switchMap(\n                    (node: Node): Observable<[Node, IEdgeStatus]> => {\n                        return Observable\n                            .combineLatest(\n                                Observable.of<Node>(node),\n                                node.spatialEdges$\n                                    .filter(\n                                        (status: IEdgeStatus): boolean => {\n                                            return status.cached;\n                                        }));\n                    })\n                .combineLatest(\n                    this._configuration$,\n                    (ns: [Node, IEdgeStatus], configuration: ICacheConfiguration):\n                        [Node, IEdgeStatus, ICacheConfiguration] => {\n                            return [ns[0], ns[1], configuration];\n                        })\n            .switchMap(\n                (args: [Node, IEdgeStatus, ICacheConfiguration]): Observable<EdgesDepth> => {\n                    let node: Node = args[0];\n                    let edges: IEdge[] = args[1].edges;\n                    let depth: ICacheDepth = args[2].depth;\n\n                    let panoDepth: number = Math.max(0, Math.min(2, depth.pano));\n                    let stepDepth: number = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));\n                    let turnDepth: number = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));\n\n                    let pano$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.Pano, panoDepth);\n\n                    let forward$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.StepForward, stepDepth);\n                    let backward$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.StepBackward, stepDepth);\n                    let left$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.StepLeft, stepDepth);\n                    let right$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.StepRight, stepDepth);\n\n                    let turnLeft$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.TurnLeft, turnDepth);\n                    let turnRight$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.TurnRight, turnDepth);\n                    let turnU$: Observable<EdgesDepth> = this._cache$(edges, EdgeDirection.TurnU, turnDepth);\n\n                    return Observable\n                        .merge<EdgesDepth>(\n                            forward$,\n                            backward$,\n                            left$,\n                            right$,\n                            pano$,\n                            turnLeft$,\n                            turnRight$,\n                            turnU$)\n                        .catch(\n                            (error: Error, caught: Observable<EdgesDepth>): Observable<EdgesDepth> => {\n                                console.error(\"Failed to cache spatial edges.\", error);\n\n                                return Observable.empty<EdgesDepth>();\n                            });\n                })\n            .subscribe(() => { /*noop*/ });\n    }\n\n    protected _deactivate(): void {\n        this._sequenceSubscription.unsubscribe();\n        this._spatialSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): ICacheConfiguration {\n        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };\n    }\n\n    private _cache$(edges: IEdge[], direction: EdgeDirection, depth: number): Observable<EdgesDepth> {\n        return Observable\n            .zip(\n                Observable.of<IEdge[]>(edges),\n                Observable.of<number>(depth))\n            .expand(\n                (ed: EdgesDepth): Observable<EdgesDepth> => {\n                    let es: IEdge[] = ed[0];\n                    let d: number = ed[1];\n\n                    let edgesDepths$: Observable<EdgesDepth>[] = [];\n\n                    if (d > 0) {\n                        for (let edge of es) {\n                            if (edge.data.direction === direction) {\n                                edgesDepths$.push(\n                                    Observable\n                                        .zip(\n                                            this._navigator.graphService.cacheNode$(edge.to)\n                                                .mergeMap(\n                                                    (n: Node): Observable<IEdge[]> => {\n                                                        return this._nodeToEdges$(n, direction);\n                                                    }),\n                                            Observable.of<number>(d - 1)));\n                            }\n                        }\n                    }\n\n                    return Observable\n                        .from<Observable<EdgesDepth>>(edgesDepths$)\n                        .mergeAll();\n                })\n            .skip(1);\n    }\n\n    private _nodeToEdges$(node: Node, direction: EdgeDirection): Observable<IEdge[]> {\n       return ([EdgeDirection.Next, EdgeDirection.Prev].indexOf(direction) > -1 ?\n            node.sequenceEdges$ :\n            node.spatialEdges$)\n                .first(\n                    (status: IEdgeStatus): boolean => {\n                        return status.cached;\n                    })\n                .map(\n                    (status: IEdgeStatus): IEdge[] => {\n                        return status.edges;\n                    });\n    }\n}\n\nComponentService.register(CacheComponent);\nexport default CacheComponent;\n",
     "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\n\nimport {IComponentConfiguration} from \"../Component\";\nimport {\n    Container,\n    Navigator,\n} from \"../Viewer\";\nimport {EventEmitter} from \"../Utils\";\n\nexport abstract class Component<TConfiguration extends IComponentConfiguration> extends EventEmitter {\n    /**\n     * Component name. Used when interacting with component through the Viewer's API.\n     */\n    public static componentName: string = \"not_worthy\";\n\n    protected _activated: boolean;\n    protected _container: Container;\n    protected _name: string;\n    protected _navigator: Navigator;\n\n    protected _activated$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n    protected _configuration$: Observable<TConfiguration>;\n    protected _configurationSubject$: Subject<TConfiguration> = new Subject<TConfiguration>();\n\n    constructor (name: string, container: Container, navigator: Navigator) {\n        super();\n\n        this._activated = false;\n        this._container = container;\n        this._name = name;\n        this._navigator = navigator;\n\n        this._configuration$ =\n            this._configurationSubject$\n                .startWith(this.defaultConfiguration)\n                .scan(\n                    (conf: TConfiguration, newConf: TConfiguration): TConfiguration => {\n                        for (let key in newConf) {\n                            if (newConf.hasOwnProperty(key)) {\n                                conf[key] = <any>newConf[key];\n                            }\n                        }\n\n                        return conf;\n                    })\n                .publishReplay(1)\n                .refCount();\n\n        this._configuration$.subscribe(() => { /*noop*/ });\n    }\n\n    public get activated(): boolean {\n        return this._activated;\n    }\n\n    public get activated$(): Observable<boolean> {\n        return this._activated$;\n    }\n\n    /**\n     * Get default configuration.\n     *\n     * @returns {TConfiguration} Default configuration for component.\n     */\n    public get defaultConfiguration(): TConfiguration {\n        return this._getDefaultConfiguration();\n    }\n\n    public get configuration$(): Observable<TConfiguration> {\n        return this._configuration$;\n    }\n\n    public get name(): string {\n        return this._name;\n    }\n\n    public activate(conf?: TConfiguration): void {\n        if (this._activated) {\n            return;\n        }\n\n        if (conf !== undefined) {\n            this._configurationSubject$.next(conf);\n        }\n\n        this._activated = true;\n        this._activate();\n        this._activated$.next(true);\n    }\n\n    public configure(conf: TConfiguration): void {\n        this._configurationSubject$.next(conf);\n    }\n\n    public deactivate(): void {\n        if (!this._activated) {\n            return;\n        }\n\n        this._activated = false;\n        this._deactivate();\n        this._container.domRenderer.clear(this._name);\n        this._container.glRenderer.clear(this._name);\n        this._activated$.next(false);\n    }\n\n    /**\n     * Detect the viewer's new width and height and resize the component's\n     * rendered elements accordingly if applicable.\n     */\n    public resize(): void { return; }\n\n    protected abstract _activate(): void;\n\n    protected abstract _deactivate(): void;\n\n    protected abstract _getDefaultConfiguration(): TConfiguration;\n}\n\nexport default Component;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\n\nimport {ArgumentMapillaryError} from \"../Error\";\nimport {Container, Navigator} from \"../Viewer\";\nimport {CoverComponent, Component, IComponentConfiguration} from \"../Component\";\n\ninterface IActiveComponent {\n    active: boolean;\n    component: Component<IComponentConfiguration>;\n}\n\nexport class ComponentService {\n    public static registeredCoverComponent: typeof CoverComponent;\n    public static registeredComponents: {[key: string]: { new (...args: any[]): Component<IComponentConfiguration>; }} = {};\n\n    private _container: Container;\n    private _coverActivated: boolean;\n    private _coverComponent: CoverComponent;\n    private _navigator: Navigator;\n    private _components: {[key: string]: IActiveComponent} = {};\n\n    public static register<T extends Component<IComponentConfiguration>>(\n        component: { componentName: string, new (...args: any[]): T; }): void {\n        if (ComponentService.registeredComponents[component.componentName] === undefined) {\n            ComponentService.registeredComponents[component.componentName] = component;\n        }\n    }\n\n    public static registerCover(coverComponent: typeof CoverComponent): void {\n        ComponentService.registeredCoverComponent = coverComponent;\n    }\n\n    constructor (container: Container, navigator: Navigator) {\n        this._container = container;\n        this._navigator = navigator;\n\n        for (let component of _.values(ComponentService.registeredComponents)) {\n            this._components[component.componentName] = {\n                active: false,\n                component: new component(component.componentName, container, navigator),\n            };\n        }\n\n        this._coverComponent = new ComponentService.registeredCoverComponent(\"cover\", container, navigator);\n        this._coverComponent.activate();\n        this._coverActivated = true;\n    }\n\n    public get coverActivated(): boolean {\n        return this._coverActivated;\n    }\n\n    public activateCover(): void {\n        if (this._coverActivated) {\n            return;\n        }\n        this._coverActivated = true;\n\n        for (let component of _.values(this._components)) {\n            if (component.active) {\n                component.component.deactivate();\n            }\n        }\n        return;\n    }\n\n    public deactivateCover(): void {\n        if (!this._coverActivated) {\n            return;\n        }\n        this._coverActivated = false;\n\n        for (let component of _.values(this._components)) {\n            if (component.active) {\n                component.component.activate();\n            }\n        }\n        return;\n    }\n\n    public activate(name: string): void {\n        this._checkName(name);\n        this._components[name].active = true;\n        if (!this._coverActivated) {\n            this.get(name).activate();\n        }\n    }\n\n    public configure<TConfiguration extends IComponentConfiguration>(name: string, conf: TConfiguration): void {\n        this._checkName(name);\n        this.get(name).configure(conf);\n    }\n\n    public deactivate(name: string): void {\n        this._checkName(name);\n        this._components[name].active = false;\n        if (!this._coverActivated) {\n            this.get(name).deactivate();\n        }\n    }\n\n    public resize(): void {\n        for (let component of _.values(this._components)) {\n            component.component.resize();\n        }\n    }\n\n    public get<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return <TComponent>this._components[name].component;\n    }\n\n    public getCover(): CoverComponent {\n        return this._coverComponent;\n    }\n\n    private _checkName(name: string): void {\n        if (!(name in this._components)) {\n            throw new ArgumentMapillaryError(`Component does not exist: ${name}`);\n        }\n    }\n}\n\nexport default ComponentService;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\n\nimport {ArgumentMapillaryError} from \"../Error\";\nimport {Container, Navigator} from \"../Viewer\";\nimport {CoverComponent, Component, IComponentConfiguration} from \"../Component\";\n\ninterface IActiveComponent {\n    active: boolean;\n    component: Component<IComponentConfiguration>;\n}\n\nexport class ComponentService {\n    public static registeredCoverComponent: typeof CoverComponent;\n    public static registeredComponents: {[key: string]: { new (...args: any[]): Component<IComponentConfiguration>; }} = {};\n\n    private _coverActivated: boolean;\n    private _coverComponent: CoverComponent;\n    private _components: {[key: string]: IActiveComponent} = {};\n\n    public static register<T extends Component<IComponentConfiguration>>(\n        component: { componentName: string, new (...args: any[]): T; }): void {\n        if (ComponentService.registeredComponents[component.componentName] === undefined) {\n            ComponentService.registeredComponents[component.componentName] = component;\n        }\n    }\n\n    public static registerCover(coverComponent: typeof CoverComponent): void {\n        ComponentService.registeredCoverComponent = coverComponent;\n    }\n\n    constructor (container: Container, navigator: Navigator) {\n        for (let component of _.values(ComponentService.registeredComponents)) {\n            this._components[component.componentName] = {\n                active: false,\n                component: new component(component.componentName, container, navigator),\n            };\n        }\n\n        this._coverComponent = new ComponentService.registeredCoverComponent(\"cover\", container, navigator);\n        this._coverComponent.activate();\n        this._coverActivated = true;\n    }\n\n    public get coverActivated(): boolean {\n        return this._coverActivated;\n    }\n\n    public activateCover(): void {\n        if (this._coverActivated) {\n            return;\n        }\n        this._coverActivated = true;\n\n        for (let component of _.values(this._components)) {\n            if (component.active) {\n                component.component.deactivate();\n            }\n        }\n        return;\n    }\n\n    public deactivateCover(): void {\n        if (!this._coverActivated) {\n            return;\n        }\n        this._coverActivated = false;\n\n        for (let component of _.values(this._components)) {\n            if (component.active) {\n                component.component.activate();\n            }\n        }\n        return;\n    }\n\n    public activate(name: string): void {\n        this._checkName(name);\n        this._components[name].active = true;\n        if (!this._coverActivated) {\n            this.get(name).activate();\n        }\n    }\n\n    public configure<TConfiguration extends IComponentConfiguration>(name: string, conf: TConfiguration): void {\n        this._checkName(name);\n        this.get(name).configure(conf);\n    }\n\n    public deactivate(name: string): void {\n        this._checkName(name);\n        this._components[name].active = false;\n        if (!this._coverActivated) {\n            this.get(name).deactivate();\n        }\n    }\n\n    public resize(): void {\n        for (let component of _.values(this._components)) {\n            component.component.resize();\n        }\n    }\n\n    public get<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return <TComponent>this._components[name].component;\n    }\n\n    public getCover(): CoverComponent {\n        return this._coverComponent;\n    }\n\n    private _checkName(name: string): void {\n        if (!(name in this._components)) {\n            throw new ArgumentMapillaryError(`Component does not exist: ${name}`);\n        }\n    }\n}\n\nexport default ComponentService;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Node} from \"../Graph\";\nimport {\n    Container,\n    Navigator,\n} from \"../Viewer\";\nimport {\n    CoverState,\n    ICoverConfiguration,\n    ComponentService,\n    Component,\n} from \"../Component\";\n\nimport {IVNodeHash} from \"../Render\";\n\nexport class CoverComponent extends Component<ICoverConfiguration> {\n    public static componentName: string = \"cover\";\n\n    private _disposable: Subscription;\n    private _keyDisposable: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    public _activate(): void {\n        this._keyDisposable = this._navigator.stateService.currentNode$\n            .withLatestFrom(\n                this._configuration$,\n                (node: Node, configuration: ICoverConfiguration): [Node, ICoverConfiguration] => {\n                    return [node, configuration];\n                })\n            .filter(\n                ([node, configuration]: [Node, ICoverConfiguration]): boolean => {\n                    return node.key !== configuration.key;\n                })\n            .map(([node, configuration]: [Node, ICoverConfiguration]): Node => { return node; })\n            .map(\n                (node: Node): ICoverConfiguration => {\n                    return { key: node.key, src: node.image.src };\n                })\n            .subscribe(this._configurationSubject$);\n\n        this._disposable = this._configuration$\n            .map(\n                (conf: ICoverConfiguration): IVNodeHash => {\n                    if (!conf.key) {\n                        return { name: this._name, vnode: vd.h(\"div\", []) };\n                    }\n\n                    if (conf.state === CoverState.Hidden) {\n                        return {name: this._name, vnode: vd.h(\"div.Cover.CoverDone\", [ this._getCoverBackgroundVNode(conf) ])};\n                    }\n\n                    return { name: this._name, vnode: this._getCoverButtonVNode(conf) };\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    public _deactivate(): void {\n        this._disposable.unsubscribe();\n        this._keyDisposable.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): ICoverConfiguration {\n        return { state: CoverState.Visible };\n    }\n\n    private _getCoverButtonVNode(conf: ICoverConfiguration): vd.VNode {\n        const cover: string = conf.state === CoverState.Loading ? \"div.Cover.CoverLoading\" : \"div.Cover\";\n\n        return vd.h(cover, [\n            this._getCoverBackgroundVNode(conf),\n            vd.h(\"button.CoverButton\", { onclick: (): void => { this.configure({ state: CoverState.Loading }); } }, [\"Explore\"]),\n            vd.h(\"a.CoverLogo\", {href: `https://www.mapillary.com`, target: \"_blank\"}, []),\n        ]);\n    }\n\n    private _getCoverBackgroundVNode(conf: ICoverConfiguration): vd.VNode {\n        let url: string = conf.src != null ?\n            `url(${conf.src})` :\n            `url(https://d1cuyjsrcm0gby.cloudfront.net/${conf.key}/thumb-640.jpg)`;\n\n        let properties: vd.createProperties = { style: { backgroundImage: url } };\n\n        let children: vd.VNode[] = [];\n        if (conf.state === CoverState.Loading) {\n            children.push(vd.h(\"div.Spinner\", {}, []));\n        }\n\n        children.push(vd.h(\"div.CoverBackgroundGradient\", {}, []));\n\n        return vd.h(\"div.CoverBackground\", properties, children);\n    }\n}\n\nComponentService.registerCover(CoverComponent);\nexport default CoverComponent;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\nimport * as vd from \"virtual-dom\";\n\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/combineLatest\";\n\nimport {IVNodeHash} from \"../Render\";\nimport {IFrame} from \"../State\";\nimport {Component, ComponentService, IComponentConfiguration} from \"../Component\";\nimport {Container, Navigator} from \"../Viewer\";\n\nexport class DebugComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"debug\";\n\n    private _displaying: boolean;\n    private _disposable: Subscription;\n\n    private _open$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n        this._displaying = false;\n    }\n\n    public _activate(): void {\n        this._disposable = this._navigator.stateService.currentState$\n            .combineLatest(\n                this._open$,\n                this._navigator.imageLoadingService.loadstatus$,\n                (frame: IFrame, open: boolean, loadStatus: any): IVNodeHash => {\n                    return {name: this._name, vnode: this._getDebugVNode(open, this._getDebugInfo(frame, loadStatus))};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    public _deactivate(): void {\n        this._disposable.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getDebugInfo(frame: IFrame, loadStatus: any): vd.VNode[] {\n        let ret: vd.VNode[] = [];\n\n        ret.push(vd.h(\"h2\", \"Node\"));\n\n        if (frame.state.currentNode) {\n            ret.push(vd.h(\"p\", `currentNode: ${frame.state.currentNode.key}`));\n        }\n\n        if (frame.state.previousNode) {\n            ret.push(vd.h(\"p\", `previousNode: ${frame.state.previousNode.key}`));\n        }\n\n        ret.push(vd.h(\"h2\", \"Loading\"));\n\n        let total: number = 0;\n        let loaded: number = 0;\n        let loading: number = 0;\n\n        for (let loadStat of _.values(loadStatus)) {\n            total += loadStat.loaded;\n            if (loadStat.loaded !== loadStat.total) {\n                loading++;\n            } else {\n                loaded++;\n            }\n        }\n\n        ret.push(vd.h(\"p\", `Loaded Images: ${loaded}`));\n        ret.push(vd.h(\"p\", `Loading Images: ${loading}`));\n        ret.push(vd.h(\"p\", `Total bytes loaded: ${total}`));\n\n        ret.push(vd.h(\"h2\", \"Camera\"));\n\n        ret.push(vd.h(\"p\", `camera.position.x: ${frame.state.camera.position.x}`));\n        ret.push(vd.h(\"p\", `camera.position.y: ${frame.state.camera.position.y}`));\n        ret.push(vd.h(\"p\", `camera.position.z: ${frame.state.camera.position.z}`));\n\n        ret.push(vd.h(\"p\", `camera.lookat.x: ${frame.state.camera.lookat.x}`));\n        ret.push(vd.h(\"p\", `camera.lookat.y: ${frame.state.camera.lookat.y}`));\n        ret.push(vd.h(\"p\", `camera.lookat.z: ${frame.state.camera.lookat.z}`));\n\n        ret.push(vd.h(\"p\", `camera.up.x: ${frame.state.camera.up.x}`));\n        ret.push(vd.h(\"p\", `camera.up.y: ${frame.state.camera.up.y}`));\n        ret.push(vd.h(\"p\", `camera.up.z: ${frame.state.camera.up.z}`));\n\n        return ret;\n    }\n\n    private _getDebugVNode(open: boolean, info: vd.VNode[]): vd.VNode {\n        if (open) {\n            return vd.h(\"div.Debug\", {}, [\n                vd.h(\"h2\", {}, [\"Debug\"]),\n                this._getDebugVNodeButton(open),\n                vd.h(\"pre\", {}, info),\n            ]);\n        } else {\n            return this._getDebugVNodeButton(open);\n        }\n    }\n\n    private _getDebugVNodeButton(open: boolean): any {\n        let buttonText: string = open ? \"Disable Debug\" : \"D\";\n        let buttonCssClass: string = open ? \"\" : \".DebugButtonFixed\";\n\n        if (open) {\n            return vd.h(`button.DebugButton${buttonCssClass}`,\n                        {onclick: this._closeDebugElement.bind(this)},\n                        [buttonText]);\n        } else {\n            return vd.h(`button.DebugButton${buttonCssClass}`,\n                        {onclick: this._openDebugElement.bind(this)},\n                        [buttonText]);\n        }\n    }\n\n    private _closeDebugElement(open: boolean): void {\n        this._open$.next(false);\n    }\n\n    private _openDebugElement(): void {\n        this._open$.next(true);\n    }\n}\n\nComponentService.register(DebugComponent);\nexport default DebugComponent;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\nimport * as vd from \"virtual-dom\";\n\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/combineLatest\";\n\nimport {IVNodeHash} from \"../Render\";\nimport {IFrame} from \"../State\";\nimport {Component, ComponentService, IComponentConfiguration} from \"../Component\";\n\nexport class DebugComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"debug\";\n\n    private _disposable: Subscription;\n\n    private _open$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n\n    public _activate(): void {\n        this._disposable = this._navigator.stateService.currentState$\n            .combineLatest(\n                this._open$,\n                this._navigator.imageLoadingService.loadstatus$,\n                (frame: IFrame, open: boolean, loadStatus: any): IVNodeHash => {\n                    return {name: this._name, vnode: this._getDebugVNode(open, this._getDebugInfo(frame, loadStatus))};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    public _deactivate(): void {\n        this._disposable.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getDebugInfo(frame: IFrame, loadStatus: any): vd.VNode[] {\n        let ret: vd.VNode[] = [];\n\n        ret.push(vd.h(\"h2\", \"Node\"));\n\n        if (frame.state.currentNode) {\n            ret.push(vd.h(\"p\", `currentNode: ${frame.state.currentNode.key}`));\n        }\n\n        if (frame.state.previousNode) {\n            ret.push(vd.h(\"p\", `previousNode: ${frame.state.previousNode.key}`));\n        }\n\n        ret.push(vd.h(\"h2\", \"Loading\"));\n\n        let total: number = 0;\n        let loaded: number = 0;\n        let loading: number = 0;\n\n        for (let loadStat of _.values(loadStatus)) {\n            total += loadStat.loaded;\n            if (loadStat.loaded !== loadStat.total) {\n                loading++;\n            } else {\n                loaded++;\n            }\n        }\n\n        ret.push(vd.h(\"p\", `Loaded Images: ${loaded}`));\n        ret.push(vd.h(\"p\", `Loading Images: ${loading}`));\n        ret.push(vd.h(\"p\", `Total bytes loaded: ${total}`));\n\n        ret.push(vd.h(\"h2\", \"Camera\"));\n\n        ret.push(vd.h(\"p\", `camera.position.x: ${frame.state.camera.position.x}`));\n        ret.push(vd.h(\"p\", `camera.position.y: ${frame.state.camera.position.y}`));\n        ret.push(vd.h(\"p\", `camera.position.z: ${frame.state.camera.position.z}`));\n\n        ret.push(vd.h(\"p\", `camera.lookat.x: ${frame.state.camera.lookat.x}`));\n        ret.push(vd.h(\"p\", `camera.lookat.y: ${frame.state.camera.lookat.y}`));\n        ret.push(vd.h(\"p\", `camera.lookat.z: ${frame.state.camera.lookat.z}`));\n\n        ret.push(vd.h(\"p\", `camera.up.x: ${frame.state.camera.up.x}`));\n        ret.push(vd.h(\"p\", `camera.up.y: ${frame.state.camera.up.y}`));\n        ret.push(vd.h(\"p\", `camera.up.z: ${frame.state.camera.up.z}`));\n\n        return ret;\n    }\n\n    private _getDebugVNode(open: boolean, info: vd.VNode[]): vd.VNode {\n        if (open) {\n            return vd.h(\"div.Debug\", {}, [\n                vd.h(\"h2\", {}, [\"Debug\"]),\n                this._getDebugVNodeButton(open),\n                vd.h(\"pre\", {}, info),\n            ]);\n        } else {\n            return this._getDebugVNodeButton(open);\n        }\n    }\n\n    private _getDebugVNodeButton(open: boolean): any {\n        let buttonText: string = open ? \"Disable Debug\" : \"D\";\n        let buttonCssClass: string = open ? \"\" : \".DebugButtonFixed\";\n\n        if (open) {\n            return vd.h(`button.DebugButton${buttonCssClass}`,\n                        {onclick: this._closeDebugElement.bind(this)},\n                        [buttonText]);\n        } else {\n            return vd.h(`button.DebugButton${buttonCssClass}`,\n                        {onclick: this._openDebugElement.bind(this)},\n                        [buttonText]);\n        }\n    }\n\n    private _closeDebugElement(open: boolean): void {\n        this._open$.next(false);\n    }\n\n    private _openDebugElement(): void {\n        this._open$.next(true);\n    }\n}\n\nComponentService.register(DebugComponent);\nexport default DebugComponent;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/combineLatest\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\nimport {Node} from \"../Graph\";\nimport {ISize} from \"../Render\";\nimport {DOM} from \"../Utils\";\nimport {Container, Navigator} from \"../Viewer\";\n\nexport class ImageComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"image\";\n\n    private _canvasId: string;\n    private _dom: DOM;\n    private drawSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator, dom?: DOM) {\n        super(name, container, navigator);\n\n        this._canvasId = `${container.id}-${this._name}`;\n        this._dom = !!dom ? dom : new DOM();\n    }\n\n    protected _activate(): void {\n        const canvasSize$: Observable<[HTMLCanvasElement, ISize]> = this._container.domRenderer.element$\n            .map(\n                (element: HTMLElement): HTMLCanvasElement => {\n                    return <HTMLCanvasElement>this._dom.document.getElementById(this._canvasId);\n                })\n            .filter(\n                (canvas: HTMLCanvasElement): boolean => {\n                    return !!canvas;\n                })\n            .map(\n                (canvas: HTMLCanvasElement): [HTMLCanvasElement, ISize] => {\n                    const adaptableDomRenderer: HTMLElement = canvas.parentElement;\n                    const width: number = adaptableDomRenderer.offsetWidth;\n                    const height: number = adaptableDomRenderer.offsetHeight;\n\n                    return [canvas, { height: height, width: width }];\n                })\n            .distinctUntilChanged(\n                (s1: ISize, s2: ISize): boolean => {\n                    return s1.height === s2.height && s1.width === s2.width;\n                },\n                ([canvas, size]: [HTMLCanvasElement, ISize]): ISize => {\n                    return size;\n                });\n\n        this.drawSubscription = Observable\n            .combineLatest(\n                canvasSize$,\n                this._navigator.stateService.currentNode$)\n            .subscribe(\n                ([[canvas, size], node]: [[HTMLCanvasElement, ISize], Node]): void => {\n                    canvas.width = size.width;\n                    canvas.height = size.height;\n                    canvas\n                        .getContext(\"2d\")\n                        .drawImage(node.image, 0, 0, size.width, size.height);\n                });\n\n        this._container.domRenderer.renderAdaptive$.next({name: this._name, vnode: vd.h(`canvas#${this._canvasId}`, [])});\n    }\n\n    protected _deactivate(): void {\n        this.drawSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n}\n\nComponentService.register(ImageComponent);\nexport default ImageComponent;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\nimport * as vd from \"virtual-dom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/combineLatest\";\n\nimport {Container, Navigator} from \"../Viewer\";\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\n\nimport {IVNodeHash} from \"../Render\";\n\nexport class LoadingComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"loading\";\n\n    private _loadingSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._loadingSubscription = this._navigator.loadingService.loading$\n            .combineLatest(\n                this._navigator.imageLoadingService.loadstatus$,\n                (loading: boolean, loadStatus: any): IVNodeHash => {\n                    if (!loading) {\n                        return {name: \"loading\", vnode: this._getBarVNode(100)};\n                    }\n\n                    let total: number = 0;\n                    let loaded: number = 0;\n\n                    for (let loadStat of _.values(loadStatus)) {\n                        if (loadStat.loaded !== loadStat.total) {\n                            loaded += loadStat.loaded;\n                            total += loadStat.total;\n                        }\n                    }\n\n                    let percentage: number = 100;\n                    if (total !== 0) {\n                        percentage = (loaded / total) * 100;\n                    }\n\n                    return {name: this._name, vnode: this._getBarVNode(percentage)};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._loadingSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getBarVNode(percentage: number): vd.VNode {\n        let loadingBarStyle: any = {};\n        let loadingContainerStyle: any = {};\n\n        if (percentage !== 100) {\n            loadingBarStyle.width = percentage.toFixed(0) + \"%\";\n            loadingBarStyle.opacity = \"1\";\n\n        } else {\n            loadingBarStyle.width = \"100%\";\n            loadingBarStyle.opacity = \"0\";\n        }\n\n        return vd.h(\"div.Loading\", { style: loadingContainerStyle }, [ vd.h(\"div.LoadingBar\", {style: loadingBarStyle}, [])]);\n    }\n}\n\nComponentService.register(LoadingComponent);\nexport default LoadingComponent;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/combineLatest\";\n\nimport {Container, Navigator} from \"../Viewer\";\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\n\nimport {IVNodeHash} from \"../Render\";\nimport {ILoadStatus} from \"../Graph\";\n\nexport class LoadingComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"loading\";\n\n    private _loadingSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._loadingSubscription = this._navigator.loadingService.loading$\n            .switchMap(\n                (loading: boolean): Observable<{ [key: string]: ILoadStatus }> => {\n                    return loading ?\n                        this._navigator.imageLoadingService.loadstatus$ :\n                        Observable.of({});\n                })\n            .map(\n                (loadStatus: { [key: string]: ILoadStatus }): IVNodeHash => {\n                    let total: number = 0;\n                    let loaded: number = 0;\n\n                    for (let loadStat of _.values(loadStatus)) {\n                        if (loadStat.loaded !== loadStat.total) {\n                            loaded += loadStat.loaded;\n                            total += loadStat.total;\n                        }\n                    }\n\n                    let percentage: number = 100;\n                    if (total !== 0) {\n                        percentage = (loaded / total) * 100;\n                    }\n\n                    return {name: this._name, vnode: this._getBarVNode(percentage)};\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._loadingSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _getBarVNode(percentage: number): vd.VNode {\n        let loadingBarStyle: any = {};\n        let loadingContainerStyle: any = {};\n\n        if (percentage !== 100) {\n            loadingBarStyle.width = percentage.toFixed(0) + \"%\";\n            loadingBarStyle.opacity = \"1\";\n\n        } else {\n            loadingBarStyle.width = \"100%\";\n            loadingBarStyle.opacity = \"0\";\n        }\n\n        return vd.h(\"div.Loading\", { style: loadingContainerStyle }, [ vd.h(\"div.LoadingBar\", {style: loadingBarStyle}, [])]);\n    }\n}\n\nComponentService.register(LoadingComponent);\nexport default LoadingComponent;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/first\";\n\nimport {EdgeDirection, IEdge} from \"../Edge\";\nimport {IEdgeStatus, Node} from \"../Graph\";\nimport {Container, Navigator} from \"../Viewer\";\nimport {ComponentService, Component, IComponentConfiguration, INavigationConfiguration} from \"../Component\";\n\nimport {IVNodeHash} from \"../Render\";\n\n/**\n * @class NavigationComponent\n *\n * @classdesc Fallback navigation component for environments without WebGL support.\n *\n * Replaces the functionality in the Direction and Sequence components.\n */\nexport class NavigationComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"navigation\";\n\n    private _renderSubscription: Subscription;\n\n    private _seqNames: { [dir: string]: string };\n    private _spaTopNames: { [dir: string]: string };\n    private _spaBottomNames: { [dir: string]: string };\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._seqNames = {};\n        this._seqNames[EdgeDirection[EdgeDirection.Prev]] = \"Prev\";\n        this._seqNames[EdgeDirection[EdgeDirection.Next]] = \"Next\";\n\n        this._spaTopNames = {};\n        this._spaTopNames[EdgeDirection[EdgeDirection.TurnLeft]] = \"Turnleft\";\n        this._spaTopNames[EdgeDirection[EdgeDirection.StepLeft]] = \"Left\";\n        this._spaTopNames[EdgeDirection[EdgeDirection.StepForward]] = \"Forward\";\n        this._spaTopNames[EdgeDirection[EdgeDirection.StepRight]] = \"Right\";\n        this._spaTopNames[EdgeDirection[EdgeDirection.TurnRight]] = \"Turnright\";\n\n        this._spaBottomNames = {};\n        this._spaBottomNames[EdgeDirection[EdgeDirection.TurnU]] = \"Turnaround\";\n        this._spaBottomNames[EdgeDirection[EdgeDirection.StepBackward]] = \"Backward\";\n    }\n\n    protected _activate(): void {\n        this._renderSubscription = Observable\n            .combineLatest(\n                this._navigator.stateService.currentNode$,\n                this._configuration$)\n            .switchMap(\n                ([node, configuration]: [Node, INavigationConfiguration]): Observable<EdgeDirection[]> => {\n                    const sequenceEdges$: Observable<EdgeDirection[]> = configuration.sequence ?\n                        node.sequenceEdges$\n                            .map(\n                                (status: IEdgeStatus): EdgeDirection[] => {\n                                    return status.edges\n                                        .map(\n                                            (edge: IEdge): EdgeDirection => {\n                                                return edge.data.direction;\n                                            });\n                                }) :\n                        Observable.of<EdgeDirection[]>([]);\n\n                    const spatialEdges$: Observable<EdgeDirection[]> = !node.pano && configuration.spatial ?\n                        node.spatialEdges$\n                            .map(\n                                (status: IEdgeStatus): EdgeDirection[] => {\n                                    return status.edges\n                                        .map(\n                                            (edge: IEdge): EdgeDirection => {\n                                                return edge.data.direction;\n                                            });\n                                }) :\n                        Observable.of<EdgeDirection[]>([]);\n\n                    return Observable\n                        .combineLatest(\n                            sequenceEdges$,\n                            spatialEdges$)\n                        .map(\n                            ([seq, spa]: [EdgeDirection[], EdgeDirection[]]): EdgeDirection[] => {\n                                 return seq.concat(spa);\n                            });\n                })\n            .map(\n                (edgeDirections: EdgeDirection[]): IVNodeHash => {\n                    const seqs: vd.VNode[] = this._createArrowRow(this._seqNames, edgeDirections);\n                    const spaTops: vd.VNode[] = this._createArrowRow(this._spaTopNames, edgeDirections);\n                    const spaBottoms: vd.VNode[] = this._createArrowRow(this._spaBottomNames, edgeDirections);\n\n                    const seqContainer: vd.VNode = vd.h(`div.NavigationSequence`, seqs);\n                    const spaTopContainer: vd.VNode = vd.h(`div.NavigationSpatialTop`, spaTops);\n                    const spaBottomContainer: vd.VNode = vd.h(`div.NavigationSpatialBottom`, spaBottoms);\n                    const spaContainer: vd.VNode = vd.h(`div.NavigationSpatial`, [spaTopContainer, spaBottomContainer]);\n\n                    return { name: this._name, vnode: vd.h(`div.NavigationContainer`, [seqContainer, spaContainer]) };\n                })\n            .subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._renderSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): INavigationConfiguration {\n        return { sequence: true, spatial: true };\n    }\n\n    private _createArrowRow(arrowNames: { [dir: string]: string }, edgeDirections: EdgeDirection[]): vd.VNode[] {\n        const arrows: vd.VNode[] = [];\n\n        for (const arrowName in arrowNames) {\n            if (!(arrowNames.hasOwnProperty(arrowName))) {\n                continue;\n            }\n\n            const direction: EdgeDirection = EdgeDirection[<keyof typeof EdgeDirection>arrowName];\n            if (edgeDirections.indexOf(direction) !== -1) {\n                arrows.push(this._createVNode(direction, arrowNames[arrowName], \"visible\"));\n            } else {\n                arrows.push(this._createVNode(direction, arrowNames[arrowName], \"hidden\"));\n            }\n        }\n\n        return arrows;\n    }\n\n    private _createVNode(direction: EdgeDirection, name: string, visibility: string): vd.VNode {\n        return vd.h(\n            `span.Direction.Direction${name}`,\n            {\n                onclick: (ev: Event): void => {\n                    this._navigator.moveDir$(direction)\n                        .subscribe(\n                            (node: Node): void => { return; },\n                            (error: Error): void => { console.error(error); });\n                },\n                style: {\n                    visibility: visibility,\n                },\n            },\n            []);\n    }\n}\n\nComponentService.register(NavigationComponent);\nexport default NavigationComponent;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/fromPromise\";\nimport \"rxjs/add/observable/of\";\n\nimport \"rxjs/add/operator/combineLatest\";\nimport \"rxjs/add/operator/distinct\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/pluck\";\nimport \"rxjs/add/operator/scan\";\n\nimport {ISequence} from \"../API\";\nimport {IRouteConfiguration, IRoutePath, ComponentService, Component} from \"../Component\";\nimport {Node} from \"../Graph\";\nimport {IVNodeHash} from \"../Render\";\nimport {IFrame} from \"../State\";\nimport {Container, Navigator} from \"../Viewer\";\n\ninterface IRtAndFrame {\n    routeTrack: RouteTrack;\n    frame: IFrame;\n    conf: IRouteConfiguration;\n}\n\ninterface IConfAndNode {\n    conf: IRouteConfiguration;\n    node: Node;\n}\n\ninterface INodeInstruction {\n    key: string;\n    description: string;\n}\n\ninterface IInstructionPlace {\n    place: number;\n    nodeInstructions: INodeInstruction[];\n}\n\nclass DescriptionState {\n    public description: string;\n    public showsLeft: number;\n}\n\nclass RouteState {\n    public routeTrack: RouteTrack;\n    public currentNode: Node;\n    public lastNode: Node;\n    public playing: boolean;\n}\n\nclass RouteTrack {\n    public nodeInstructions: INodeInstruction[] = [];\n    public nodeInstructionsOrdered: INodeInstruction[][] = [];\n}\n\nexport class RouteComponent extends Component<IRouteConfiguration> {\n    public static componentName: string = \"route\";\n\n    private _disposable: Subscription;\n    private _disposableDescription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        let _slowedStream$: Observable<IFrame>;\n\n        _slowedStream$ = this._navigator.stateService.currentState$.filter((frame: IFrame) => {\n            return (frame.id % 2) === 0;\n        }).filter((frame: IFrame) => {\n            return frame.state.nodesAhead < 15;\n        }).distinctUntilChanged(undefined, (frame: IFrame): string => {\n            return frame.state.lastNode.key;\n        });\n\n        let _routeTrack$: Observable<RouteTrack>;\n\n        _routeTrack$ = this.configuration$.mergeMap((conf: IRouteConfiguration): Observable<IRoutePath> => {\n            return Observable.from<IRoutePath>(conf.paths);\n        }).distinct((p: IRoutePath): string => {\n            return p.sequenceKey;\n        }).mergeMap((path: IRoutePath): Observable<ISequence> => {\n            return this._navigator.apiV3.sequenceByKey$([path.sequenceKey])\n                .map(\n                    (sequenceByKey: { [sequenceKey: string]: ISequence }): ISequence => {\n                        return sequenceByKey[path.sequenceKey];\n                    });\n        }).combineLatest(this.configuration$, (sequence: ISequence, conf: IRouteConfiguration): IInstructionPlace[] => {\n            let i: number = 0;\n            let instructionPlaces: IInstructionPlace[] = [];\n\n            for (let path of conf.paths) {\n                if (path.sequenceKey === sequence.key) {\n                    let nodeInstructions: INodeInstruction[] = [];\n                    let saveKey: boolean = false;\n                    for (let key of sequence.keys) {\n                        if (path.startKey === key) {\n                            saveKey = true;\n                        }\n                        if (saveKey) {\n                            let description: string = null;\n\n                            for (let infoKey of path.infoKeys) {\n                                if (infoKey.key === key) {\n                                    description = infoKey.description;\n                                }\n                            }\n\n                            nodeInstructions.push({description: description, key: key});\n                        }\n                        if (path.stopKey === key) {\n                            saveKey = false;\n                        }\n                    }\n                    instructionPlaces.push({nodeInstructions: nodeInstructions, place: i});\n                }\n                i++;\n            }\n\n            return instructionPlaces;\n        }).scan(\n            (routeTrack: RouteTrack, instructionPlaces: IInstructionPlace[]): RouteTrack => {\n                for (let instructionPlace of instructionPlaces) {\n                    routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;\n                }\n                routeTrack.nodeInstructions = _.flatten(routeTrack.nodeInstructionsOrdered);\n                return routeTrack;\n            },\n            new RouteTrack());\n\n        this._disposable = _slowedStream$\n            .combineLatest(_routeTrack$, this.configuration$,\n                           (frame: IFrame, routeTrack: RouteTrack, conf: IRouteConfiguration): IRtAndFrame => {\n                               return {conf: conf, frame: frame, routeTrack: routeTrack};\n                           }).scan(\n                               (routeState: RouteState, rtAndFrame: IRtAndFrame): RouteState => {\n                                   if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {\n                                       routeState.routeTrack = rtAndFrame.routeTrack;\n                                       routeState.currentNode = rtAndFrame.frame.state.currentNode;\n                                       routeState.lastNode = rtAndFrame.frame.state.lastNode;\n                                       routeState.playing = true;\n                                   } else {\n                                       this._navigator.stateService.cutNodes();\n                                       routeState.playing = false;\n                                   }\n                                   return routeState;\n                               },\n                               new RouteState())\n            .filter((routeState: RouteState): boolean => {\n                return routeState.playing;\n            }).filter((routeState: RouteState): boolean => {\n                for (let nodeInstruction of routeState.routeTrack.nodeInstructions) {\n                    if (!nodeInstruction) {\n                        continue;\n                    }\n                    if (nodeInstruction.key === routeState.lastNode.key) {\n                        return true;\n                    }\n                }\n                return false;\n            }).distinctUntilChanged(undefined, (routeState: RouteState): string => {\n                return routeState.lastNode.key;\n            }).mergeMap((routeState: RouteState): Observable<Node> => {\n                let i: number = 0;\n                for (let nodeInstruction of routeState.routeTrack.nodeInstructions) {\n                    if (nodeInstruction.key === routeState.lastNode.key) {\n                        break;\n                    }\n                    i++;\n                }\n\n                let nextInstruction: INodeInstruction = routeState.routeTrack.nodeInstructions[i + 1];\n                if (!nextInstruction) {\n                    return Observable.of<Node>(null);\n                }\n\n                return this._navigator.graphService.cacheNode$(nextInstruction.key);\n            }).combineLatest(this.configuration$, (node: Node, conf: IRouteConfiguration): IConfAndNode => {\n                return {conf: conf, node: node};\n            }).filter((cAN: IConfAndNode) => {\n                return cAN.node !== null && cAN.conf.playing;\n            }).pluck<IConfAndNode, Node>(\"node\").subscribe(this._navigator.stateService.appendNode$);\n\n        this._disposableDescription = this._navigator.stateService.currentNode$\n            .combineLatest(_routeTrack$, this.configuration$,\n                           (node: Node, routeTrack: RouteTrack, conf: IRouteConfiguration): string => {\n                               if (conf.playing !== undefined && !conf.playing) {\n                                   return \"quit\";\n                               }\n\n                               let description: string = null;\n\n                               for (let nodeInstruction of routeTrack.nodeInstructions) {\n                                   if (nodeInstruction.key === node.key) {\n                                       description = nodeInstruction.description;\n                                       break;\n                                   }\n                               }\n\n                               return description;\n            }).scan(\n                (descriptionState: DescriptionState, description: string): DescriptionState => {\n                    if (description !== descriptionState.description && description !== null) {\n                        descriptionState.description = description;\n                        descriptionState.showsLeft = 6;\n                    } else {\n                        descriptionState.showsLeft--;\n                    }\n\n                    if (description === \"quit\") {\n                        descriptionState.description = null;\n                    }\n\n                    return descriptionState;\n                },\n                new DescriptionState(),\n            ).map((descriptionState: DescriptionState): IVNodeHash => {\n                if (descriptionState.showsLeft > 0 && descriptionState.description) {\n                    return {name: this._name, vnode: this._getRouteAnnotationNode(descriptionState.description)};\n                } else {\n                    return {name: this._name, vnode: vd.h(\"div\", [])};\n                }\n            }).subscribe(this._container.domRenderer.render$);\n    }\n\n    protected _deactivate(): void {\n        this._disposable.unsubscribe();\n        this._disposableDescription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IRouteConfiguration {\n        return {};\n    }\n\n    public play(): void {\n        this.configure({ playing: true });\n    }\n\n    public stop(): void {\n        this.configure({ playing: false });\n    }\n\n    private _getRouteAnnotationNode(description: string): vd.VNode {\n        return vd.h(\"div.RouteFrame\", {}, [\n            vd.h(\"p\", {textContent: description}, []),\n        ]);\n    }\n}\n\nComponentService.register(RouteComponent);\nexport default RouteComponent;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/buffer\";\nimport \"rxjs/add/operator/debounceTime\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/scan\";\n\nimport {ComponentService, Component, IComponentConfiguration} from \"../Component\";\nimport {Node} from \"../Graph\";\nimport {Container, Navigator} from \"../Viewer\";\n\ntype Keys = { [key: string]: boolean };\n\ninterface IKeys {\n    report: string[];\n    reported: Keys;\n}\n\nexport class StatsComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"stats\";\n\n    private _sequenceSubscription: Subscription;\n    private _imageSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n    }\n\n    protected _activate(): void {\n        this._sequenceSubscription = this._navigator.stateService.currentNode$\n            .scan(\n                (keys: IKeys, node: Node): IKeys => {\n                    let sKey: string = node.sequenceKey;\n                    keys.report = [];\n\n                    if (!(sKey in keys.reported)) {\n                        keys.report = [sKey];\n                        keys.reported[sKey] = true;\n                    }\n\n                    return keys;\n                },\n                { report: [], reported: {} })\n            .filter(\n                (keys: IKeys): boolean => {\n                    return keys.report.length > 0;\n                })\n            .mergeMap(\n                (keys: IKeys): Observable<void> => {\n                    return this._navigator.apiV3.sequenceViewAdd$(keys.report)\n                        .catch(\n                            (error: Error, caught: Observable<void>): Observable<void> => {\n                                console.error(`Failed to report sequence stats (${keys.report})`, error);\n\n                                return Observable.empty<void>();\n                            });\n                })\n            .subscribe(() => { /*noop*/ });\n\n        this._imageSubscription = this._navigator.stateService.currentNode$\n            .map(\n                (node: Node): string => {\n                    return node.key;\n                })\n            .buffer(this._navigator.stateService.currentNode$.debounceTime(5000))\n            .scan(\n                 (keys: IKeys, newKeys: string[]): IKeys => {\n                     keys.report = [];\n\n                     for (let key of newKeys) {\n                        if (!(key in keys.reported)) {\n                            keys.report.push(key);\n                            keys.reported[key] = true;\n                        }\n                     }\n\n                     return keys;\n                 },\n                 { report: [], reported: {} })\n             .filter(\n                (keys: IKeys): boolean => {\n                    return keys.report.length > 0;\n                })\n            .mergeMap(\n                (keys: IKeys): Observable<void> => {\n                    return this._navigator.apiV3.imageViewAdd$(keys.report)\n                        .catch(\n                            (error: Error, caught: Observable<void>): Observable<void> => {\n                                console.error(`Failed to report image stats (${keys.report})`, error);\n\n                                return Observable.empty<void>();\n                            });\n                })\n            .subscribe(() => { /*noop*/ });\n    }\n\n    protected _deactivate(): void {\n        this._sequenceSubscription.unsubscribe();\n        this._imageSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n}\n\nComponentService.register(StatsComponent);\nexport default StatsComponent;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/share\";\n\nimport {\n    ComponentService,\n    Component,\n    DirectionDOMRenderer,\n    IDirectionConfiguration,\n} from \"../../Component\";\nimport {IEdgeStatus, Node, Sequence} from \"../../Graph\";\nimport {IVNodeHash, RenderCamera} from \"../../Render\";\nimport {Container, Navigator} from \"../../Viewer\";\n\n/**\n * @class DirectionComponent\n * @classdesc Component showing navigation arrows for steps and turns.\n */\nexport class DirectionComponent extends Component<IDirectionConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"direction\";\n\n    private _renderer: DirectionDOMRenderer;\n\n    private _hoveredKeySubject$: Subject<string>;\n    private _hoveredKey$: Observable<string>;\n\n    private _configurationSubscription: Subscription;\n    private _nodeSubscription: Subscription;\n    private _renderCameraSubscription: Subscription;\n    private _hoveredKeySubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator, directionDOMRenderer?: DirectionDOMRenderer) {\n        super(name, container, navigator);\n\n        this._renderer = !!directionDOMRenderer ?\n            directionDOMRenderer :\n            new DirectionDOMRenderer(this.defaultConfiguration, container.element);\n\n        this._hoveredKeySubject$ = new Subject<string>();\n\n        this._hoveredKey$ = this._hoveredKeySubject$.share();\n    }\n\n    /**\n     * Get hovered key observable.\n     *\n     * @description An observable emitting the key of the node for the direction\n     * arrow that is being hovered. When the mouse leaves a direction arrow null\n     * is emitted.\n     *\n     * @returns {Observable<string>}\n     */\n    public get hoveredKey$(): Observable<string> {\n        return this._hoveredKey$;\n    }\n\n    /**\n     * Set highlight key.\n     *\n     * @description The arrow pointing towards the node corresponding to the\n     * highlight key will be highlighted.\n     *\n     * @param {string} highlightKey Key of node to be highlighted if existing\n     * among arrows.\n     */\n    public setHighlightKey(highlightKey: string): void {\n        this.configure({ highlightKey: highlightKey });\n    }\n\n    /**\n     * Set min width of container element.\n     *\n     * @description  Set min width of the non transformed container element holding\n     * the navigation arrows. If the min width is larger than the max width the\n     * min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMinWidth(minWidth: number): void {\n        this.configure({ minWidth: minWidth });\n    }\n\n    /**\n     * Set max width of container element.\n     *\n     * @description Set max width of the non transformed container element holding\n     * the navigation arrows. If the min width is larger than the max width the\n     * min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMaxWidth(maxWidth: number): void {\n        this.configure({ maxWidth: maxWidth });\n    }\n\n    /** @inheritdoc */\n    public resize(): void {\n        this._renderer.resize(this._container.element);\n    }\n\n    protected _activate(): void {\n        this._configurationSubscription = this._configuration$\n            .subscribe(\n                (configuration: IDirectionConfiguration): void => {\n                    this._renderer.setConfiguration(configuration);\n                });\n\n        this._nodeSubscription = this._navigator.stateService.currentNode$\n            .do(\n                (node: Node): void => {\n                    this._container.domRenderer.render$.next({name: this._name, vnode: vd.h(\"div\", {}, [])});\n                    this._renderer.setNode(node);\n                })\n            .withLatestFrom(this._configuration$)\n            .switchMap(\n                ([node, configuration]: [Node, IDirectionConfiguration]): Observable<[IEdgeStatus, Sequence]> => {\n                    return Observable\n                        .combineLatest(\n                            node.spatialEdges$,\n                            configuration.distinguishSequence ?\n                                this._navigator.graphService\n                                    .cacheSequence$(node.sequenceKey)\n                                    .catch(\n                                        (error: Error, caught: Observable<Sequence>): Observable<Sequence> => {\n                                            console.error(`Failed to cache sequence (${node.sequenceKey})`, error);\n\n                                            return Observable.of<Sequence>(null);\n                                        }) :\n                                Observable.of<Sequence>(null));\n                })\n            .subscribe(\n                ([edgeStatus, sequence]: [IEdgeStatus, Sequence]): void => {\n                    this._renderer.setEdges(edgeStatus, sequence);\n                });\n\n        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$\n            .do(\n                (renderCamera: RenderCamera): void => {\n                    this._renderer.setRenderCamera(renderCamera);\n                })\n            .map(\n                (renderCamera: RenderCamera): DirectionDOMRenderer => {\n                    return this._renderer;\n                })\n            .filter(\n                (renderer: DirectionDOMRenderer): boolean => {\n                    return renderer.needsRender;\n                })\n            .map(\n                (renderer: DirectionDOMRenderer): IVNodeHash => {\n                    return { name: this._name, vnode: renderer.render(this._navigator) };\n                })\n            .subscribe(this._container.domRenderer.render$);\n\n        this._hoveredKeySubscription = Observable\n            .combineLatest(\n                [\n                    this._container.domRenderer.element$,\n                    this._container.renderService.renderCamera$,\n                    this._container.mouseService.mouseMove$.startWith(null),\n                    this._container.mouseService.mouseUp$.startWith(null),\n                ],\n                (e: Element, rc: RenderCamera, mm: MouseEvent, mu: MouseEvent): Element => {\n                    return e;\n                })\n            .map(\n                (element: Element): string => {\n                    let elements: NodeListOf<Element> = element.getElementsByClassName(\"DirectionsPerspective\");\n\n                    for (let i: number = 0; i < elements.length; i++) {\n                        let hovered: Element = elements.item(i).querySelector(\":hover\");\n\n                        if (hovered != null && hovered.hasAttribute(\"data-key\")) {\n                            return hovered.getAttribute(\"data-key\");\n                        }\n                    }\n\n                    return null;\n                })\n            .distinctUntilChanged()\n            .subscribe(this._hoveredKeySubject$);\n    }\n\n    protected _deactivate(): void {\n        this._configurationSubscription.unsubscribe();\n        this._nodeSubscription.unsubscribe();\n        this._renderCameraSubscription.unsubscribe();\n        this._hoveredKeySubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IDirectionConfiguration {\n        return {\n            distinguishSequence: false,\n            maxWidth: 460,\n            minWidth: 260,\n        };\n    }\n}\n\nComponentService.register(DirectionComponent);\nexport default DirectionComponent;\n",
-    "import {IDirectionConfiguration} from \"../../Component\";\nimport {Spatial} from \"../../Geo\";\n\n/**\n * @class DirectionDOMCalculator\n * @classdesc Helper class for calculating DOM CSS properties.\n */\nexport class DirectionDOMCalculator {\n    private _spatial: Spatial;\n\n    private _elementWidth: number;\n    private _elementHeight: number;\n\n    private _minWidth: number;\n    private _maxWidth: number;\n\n    private _minThresholdWidth: number;\n    private _maxThresholdWidth: number;\n    private _minThresholdHeight: number;\n    private _maxThresholdHeight: number;\n\n    private _containerWidth: number;\n    private _containerWidthCss: string;\n    private _containerMarginCss: string;\n    private _containerLeftCss: string;\n    private _containerHeight: number;\n    private _containerHeightCss: string;\n    private _containerBottomCss: string;\n\n    private _stepCircleSize: number;\n    private _stepCircleSizeCss: string;\n    private _stepCircleMarginCss: string;\n\n    private _turnCircleSize: number;\n    private _turnCircleSizeCss: string;\n\n    private _outerRadius: number;\n    private _innerRadius: number;\n\n    private _shadowOffset: number;\n\n    constructor(configuration: IDirectionConfiguration, element: HTMLElement) {\n        this._spatial = new Spatial();\n\n        this._minThresholdWidth = 320;\n        this._maxThresholdWidth = 1480;\n        this._minThresholdHeight = 240;\n        this._maxThresholdHeight = 820;\n\n        this._configure(configuration);\n        this._resize(element);\n        this._reset();\n    }\n\n    public get minWidth(): number {\n        return this._minWidth;\n    }\n\n    public get maxWidth(): number {\n        return this._maxWidth;\n    }\n\n    public get containerWidth(): number {\n        return this._containerWidth;\n    }\n\n    public get containerWidthCss(): string {\n        return this._containerWidthCss;\n    }\n\n    public get containerMarginCss(): string {\n        return this._containerMarginCss;\n    }\n\n    public get containerLeftCss(): string {\n        return this._containerLeftCss;\n    }\n\n    public get containerHeight(): number {\n        return this._containerHeight;\n    }\n\n    public get containerHeightCss(): string {\n        return this._containerHeightCss;\n    }\n\n    public get containerBottomCss(): string {\n        return this._containerBottomCss;\n    }\n\n    public get stepCircleSize(): number {\n        return this._stepCircleSize;\n    }\n\n    public get stepCircleSizeCss(): string {\n        return this._stepCircleSizeCss;\n    }\n\n    public get stepCircleMarginCss(): string {\n        return this._stepCircleMarginCss;\n    }\n\n    public get turnCircleSize(): number {\n        return this._turnCircleSize;\n    }\n\n    public get turnCircleSizeCss(): string {\n        return this._turnCircleSizeCss;\n    }\n\n    public get outerRadius(): number {\n        return this._outerRadius;\n    }\n\n    public get innerRadius(): number {\n        return this._innerRadius;\n    }\n\n    public get shadowOffset(): number {\n        return this._shadowOffset;\n    }\n\n    /**\n     * Configures the min and max width values.\n     *\n     * @param {IDirectionConfiguration} configuration Configuration\n     * with min and max width values.\n     */\n    public configure(configuration: IDirectionConfiguration): void {\n        this._configure(configuration);\n        this._reset();\n    }\n\n    /**\n     * Resizes all properties according to the width and height\n     * of the element.\n     *\n     * @param {HTMLElement} element The container element from which to extract\n     * the width and height.\n     */\n    public resize(element: HTMLElement): void {\n        this._resize(element);\n        this._reset();\n    }\n\n    /**\n     * Calculates the coordinates on the unit circle for an angle.\n     *\n     * @param {number} angle Angle in radians.\n     * @returns {Array<number>} The x and y coordinates on the unit circle.\n     */\n    public angleToCoordinates(angle: number): Array<number> {\n        return [Math.cos(angle), Math.sin(angle)];\n    }\n\n    /**\n     * Calculates the coordinates on the unit circle for the\n     * relative angle between the first and second angle.\n     *\n     * @param {number} first Angle in radians.\n     * @param {number} second Angle in radians.\n     * @returns {Array<number>} The x and y coordinates on the unit circle\n     * for the relative angle between the first and second angle.\n     */\n    public relativeAngleToCoordiantes(first: number, second: number): Array<number> {\n        let relativeAngle: number = this._spatial.wrapAngle(first - second);\n\n        return this.angleToCoordinates(relativeAngle);\n    }\n\n    private _configure(configuration: IDirectionConfiguration): void {\n        this._minWidth = configuration.minWidth;\n        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);\n    }\n\n    private _resize(element: HTMLElement): void {\n        this._elementWidth = element.offsetWidth;\n        this._elementHeight = element.offsetHeight;\n    }\n\n    private _reset(): void {\n        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);\n        this._containerHeight = this._getContainerHeight(this.containerWidth);\n        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);\n        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);\n        this._outerRadius = this._getOuterRadius(this._containerHeight);\n        this._innerRadius = this._getInnerRadius(this._containerHeight);\n\n        this._shadowOffset = 3;\n\n        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);\n        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);\n        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));\n        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);\n        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));\n        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);\n        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);\n        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);\n    }\n\n    private _getContainerWidth(elementWidth: number, elementHeight: number): number {\n        let relativeWidth: number =\n            (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);\n        let relativeHeight: number =\n            (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);\n\n        let coeff: number = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));\n\n        coeff = 0.04 * Math.round(25 * coeff);\n\n        return this._minWidth + coeff * (this._maxWidth - this._minWidth);\n    }\n\n    private _getContainerHeight(containerWidth: number): number {\n        return 0.77 * containerWidth;\n    }\n\n    private _getStepCircleDiameter(containerHeight: number): number {\n        return 0.34 * containerHeight;\n    }\n\n    private _getTurnCircleDiameter(containerHeight: number): number {\n        return 0.3 * containerHeight;\n    }\n\n    private _getOuterRadius(containerHeight: number): number {\n        return 0.31 * containerHeight;\n    }\n\n    private _getInnerRadius(containerHeight: number): number {\n        return 0.125 * containerHeight;\n    }\n\n    private _numberToCssPixels(value: number): string {\n        return value + \"px\";\n    }\n\n    private _getMaxWidth(value: number, minWidth: number): number {\n        return value > minWidth ? value : minWidth;\n    }\n}\n\nexport default DirectionDOMCalculator;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {DirectionDOMCalculator, IDirectionConfiguration} from \"../../Component\";\nimport {EdgeDirection, IEdge} from \"../../Edge\";\nimport {Spatial} from \"../../Geo\";\nimport {IEdgeStatus, Node, Sequence} from \"../../Graph\";\nimport {RenderCamera} from \"../../Render\";\nimport {IRotation} from \"../../State\";\nimport {Navigator} from \"../../Viewer\";\n\n/**\n * @class DirectionDOMRenderer\n * @classdesc DOM renderer for direction arrows.\n */\nexport class DirectionDOMRenderer {\n    private _spatial: Spatial;\n    private _calculator: DirectionDOMCalculator;\n\n    private _node: Node;\n\n    private _rotation: IRotation;\n    private _epsilon: number;\n\n    private _highlightKey: string;\n    private _distinguishSequence: boolean;\n\n    private _needsRender: boolean;\n\n    private _stepEdges: IEdge[];\n    private _turnEdges: IEdge[];\n    private _panoEdges: IEdge[];\n    private _sequenceEdgeKeys: string[];\n\n    private _stepDirections: EdgeDirection[];\n    private _turnDirections: EdgeDirection[];\n    private _turnNames: {[dir: number]: string};\n\n    private _isEdge: boolean = false;\n\n    constructor(configuration: IDirectionConfiguration, element: HTMLElement) {\n        this._spatial = new Spatial();\n        this._calculator = new DirectionDOMCalculator(configuration, element);\n\n        this._node = null;\n\n        this._rotation = { phi: 0, theta: 0 };\n        this._epsilon = 0.5 * Math.PI / 180;\n\n        this._highlightKey = null;\n        this._distinguishSequence = false;\n\n        this._needsRender = false;\n\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n\n        this._stepDirections = [\n            EdgeDirection.StepForward,\n            EdgeDirection.StepBackward,\n            EdgeDirection.StepLeft,\n            EdgeDirection.StepRight,\n        ];\n\n        this._turnDirections = [\n            EdgeDirection.TurnLeft,\n            EdgeDirection.TurnRight,\n            EdgeDirection.TurnU,\n        ];\n\n        this._turnNames = {};\n        this._turnNames[EdgeDirection.TurnLeft] = \"TurnLeft\";\n        this._turnNames[EdgeDirection.TurnRight] = \"TurnRight\";\n        this._turnNames[EdgeDirection.TurnU] = \"TurnAround\";\n\n        // detects IE 8-11, then Edge 20+.\n        let isIE: boolean = !!(<any>document).documentMode;\n        this._isEdge = !isIE && !!(<any>window).StyleMedia;\n    }\n\n    /**\n     * Get needs render.\n     *\n     * @returns {boolean} Value indicating whether render should be called.\n     */\n    public get needsRender(): boolean {\n        return this._needsRender;\n    }\n\n    /**\n     * Renders virtual DOM elements.\n     *\n     * @description Calling render resets the needs render property.\n     */\n    public render(navigator: Navigator): vd.VNode {\n        this._needsRender = false;\n\n        let rotation: IRotation = this._rotation;\n\n        let steps: vd.VNode[] = [];\n        let turns: vd.VNode[] = [];\n\n        if (this._node.pano) {\n            steps = steps.concat(this._createPanoArrows(navigator, rotation));\n        } else {\n            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));\n            steps = steps.concat(this._createStepArrows(navigator, rotation));\n            turns = turns.concat(this._createTurnArrows(navigator));\n        }\n\n        return this._getContainer(steps, turns, rotation);\n    }\n\n    public setEdges(edgeStatus: IEdgeStatus, sequence: Sequence): void {\n        this._setEdges(edgeStatus, sequence);\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set node for which to show edges.\n     *\n     * @param {Node} node\n     */\n    public setNode(node: Node): void {\n        this._node = node;\n        this._clearEdges();\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set the render camera to use for calculating rotations.\n     *\n     * @param {RenderCamera} renderCamera\n     */\n    public setRenderCamera(renderCamera: RenderCamera): void {\n        let rotation: IRotation = renderCamera.rotation;\n\n        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {\n            return;\n        }\n\n        this._rotation = rotation;\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set configuration values.\n     *\n     * @param {IDirectionConfiguration} configuration\n     */\n    public setConfiguration(configuration: IDirectionConfiguration): void {\n        let needsRender: boolean = false;\n        if (this._highlightKey !== configuration.highlightKey ||\n            this._distinguishSequence !== configuration.distinguishSequence) {\n            this._highlightKey = configuration.highlightKey;\n            this._distinguishSequence = configuration.distinguishSequence;\n\n            needsRender = true;\n        }\n\n        if (this._calculator.minWidth !== configuration.minWidth ||\n            this._calculator.maxWidth !== configuration.maxWidth) {\n            this._calculator.configure(configuration);\n            needsRender = true;\n        }\n\n        if (needsRender) {\n            this._setNeedsRender();\n        }\n    }\n\n    /**\n     * Detect the element's width and height and resize\n     * elements accordingly.\n     *\n     * @param {HTMLElement} element Viewer container element.\n     */\n    public resize(element: HTMLElement): void {\n        this._calculator.resize(element);\n\n        this._setNeedsRender();\n    }\n\n    private _setNeedsRender(): void {\n        if (this._node != null) {\n            this._needsRender = true;\n        }\n    }\n\n    private _clearEdges(): void {\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n    }\n\n    private _setEdges(edgeStatus: IEdgeStatus, sequence: Sequence): void {\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n\n        for (let edge of edgeStatus.edges) {\n            let direction: EdgeDirection = edge.data.direction;\n\n            if (this._stepDirections.indexOf(direction) > -1) {\n                this._stepEdges.push(edge);\n                continue;\n            }\n\n            if (this._turnDirections.indexOf(direction) > -1) {\n                this._turnEdges.push(edge);\n                continue;\n            }\n\n            if (edge.data.direction === EdgeDirection.Pano) {\n                this._panoEdges.push(edge);\n            }\n        }\n\n        if (this._distinguishSequence && sequence != null) {\n            let edges: IEdge[] = this._panoEdges\n                .concat(this._stepEdges)\n                .concat(this._turnEdges);\n\n            for (let edge of edges) {\n                let edgeKey: string = edge.to;\n\n                for (let sequenceKey of sequence.keys) {\n                    if (sequenceKey === edgeKey) {\n                        this._sequenceEdgeKeys.push(edgeKey);\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    private _createPanoArrows(navigator: Navigator, rotation: IRotation): Array<vd.VNode> {\n        let arrows: Array<vd.VNode> = [];\n\n        for (let panoEdge of this._panoEdges) {\n            arrows.push(\n                this._createVNodeByKey(\n                    navigator,\n                    panoEdge.to,\n                    panoEdge.data.worldMotionAzimuth,\n                    rotation,\n                    this._calculator.outerRadius,\n                    \"DirectionsArrowPano\"));\n        }\n\n        for (let stepEdge of this._stepEdges) {\n            arrows.push(\n                this._createPanoToPerspectiveArrow(\n                    navigator,\n                    stepEdge.to,\n                    stepEdge.data.worldMotionAzimuth,\n                    rotation,\n                    stepEdge.data.direction));\n        }\n\n        return arrows;\n    }\n\n    private _createPanoToPerspectiveArrow(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        direction: EdgeDirection): vd.VNode {\n\n        let threshold: number = Math.PI / 8;\n\n        let relativePhi: number = rotation.phi;\n\n        switch (direction) {\n            case EdgeDirection.StepBackward:\n                relativePhi = rotation.phi - Math.PI;\n                break;\n            case EdgeDirection.StepLeft:\n                relativePhi = rotation.phi + Math.PI / 2;\n                break;\n            case EdgeDirection.StepRight:\n                relativePhi = rotation.phi - Math.PI / 2;\n                break;\n            default:\n                break;\n        }\n\n        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {\n            return this._createVNodeByKey(\n                navigator,\n                key,\n                azimuth,\n                rotation,\n                this._calculator.outerRadius,\n                \"DirectionsArrowStep\");\n        }\n\n        return this._createVNodeDisabled(key, azimuth, rotation);\n    }\n\n    private _createPerspectiveToPanoArrows(navigator: Navigator, rotation: IRotation): Array<vd.VNode> {\n        let arrows: Array<vd.VNode> = [];\n\n        for (let panoEdge of this._panoEdges) {\n            arrows.push(\n                this._createVNodeByKey(\n                    navigator,\n                    panoEdge.to,\n                    panoEdge.data.worldMotionAzimuth,\n                    rotation,\n                    this._calculator.innerRadius,\n                    \"DirectionsArrowPano\",\n                    true));\n        }\n\n        return arrows;\n    }\n\n    private _createStepArrows(navigator: Navigator, rotation: IRotation): Array<vd.VNode> {\n        let arrows: Array<vd.VNode> = [];\n\n        for (let stepEdge of this._stepEdges) {\n            arrows.push(\n                this._createVNodeByDirection(\n                    navigator,\n                    stepEdge.to,\n                    stepEdge.data.worldMotionAzimuth,\n                    rotation,\n                    stepEdge.data.direction));\n        }\n\n        return arrows;\n    }\n\n\n    private _createTurnArrows(navigator: Navigator): Array<vd.VNode> {\n        let turns: Array<vd.VNode> = [];\n\n        for (let turnEdge of this._turnEdges) {\n            let direction: EdgeDirection = turnEdge.data.direction;\n            let name: string = this._turnNames[direction];\n\n            turns.push(\n                this._createVNodeByTurn(\n                    navigator,\n                    turnEdge.to,\n                    name,\n                    direction));\n        }\n\n        return turns;\n    }\n\n    private _createVNodeByKey(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        offset: number,\n        className: string,\n        shiftVertically?: boolean): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveToKey$(key)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            offset,\n            className,\n            \"DirectionsCircle\",\n            onClick,\n            shiftVertically);\n    }\n\n    private _createVNodeByDirection(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        direction: EdgeDirection): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveDir$(direction)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            this._calculator.outerRadius,\n            \"DirectionsArrowStep\",\n            \"DirectionsCircle\",\n            onClick);\n    }\n\n    private _createVNodeByTurn(\n        navigator: Navigator,\n        key: string,\n        className: string,\n        direction: EdgeDirection): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveDir$(direction)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        let style: any = {\n            height: this._calculator.turnCircleSizeCss,\n            transform: \"rotate(0)\", // apply transform to preserve 3D\n            width: this._calculator.turnCircleSizeCss,\n        };\n\n        switch (direction) {\n            case EdgeDirection.TurnLeft:\n                style.left = \"5px\";\n                style.top = \"5px\";\n                break;\n            case EdgeDirection.TurnRight:\n                style.right = \"5px\";\n                style.top = \"5px\";\n                break;\n            case EdgeDirection.TurnU:\n                style.left = \"5px\";\n                style.bottom = \"5px\";\n                break;\n            default:\n                break;\n        }\n\n        let circleProperties: vd.createProperties = {\n            attributes: {\n                \"data-key\": key,\n            },\n            onclick: onClick,\n            style: style,\n        };\n\n        let circleClassName: string = \"TurnCircle\";\n\n        if (this._sequenceEdgeKeys.indexOf(key) > -1) {\n            circleClassName += \"Sequence\";\n        }\n\n        if (this._highlightKey === key) {\n            circleClassName += \"Highlight\";\n        }\n\n        let turn: vd.VNode = vd.h(`div.${className}`, {}, []);\n\n        return vd.h(\"div.\" + circleClassName, circleProperties, [turn]);\n    }\n\n    private _createVNodeDisabled(key: string, azimuth: number, rotation: IRotation): vd.VNode {\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            this._calculator.outerRadius,\n            \"DirectionsArrowDisabled\",\n            \"DirectionsCircleDisabled\");\n    }\n\n    private _createVNode(\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        radius: number,\n        className: string,\n        circleClassName: string,\n        onClick?: (e: Event) => void,\n        shiftVertically?: boolean): vd.VNode {\n\n        let translation: Array<number> = this._calculator.angleToCoordinates(azimuth - rotation.phi);\n\n        // rotate 90 degrees clockwise and flip over X-axis\n        let translationX: number = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);\n        let translationY: number = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);\n\n        let shadowTranslation: Array<number> = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);\n        let shadowOffset: number = this._calculator.shadowOffset;\n        let shadowTranslationX: number = -shadowOffset * shadowTranslation[1];\n        let shadowTranslationY: number = shadowOffset * shadowTranslation[0];\n\n        let filter: string = `drop-shadow(${shadowTranslationX}px ${shadowTranslationY}px 1px rgba(0,0,0,0.8))`;\n\n        let properties: vd.createProperties = {\n            style: {\n                \"-webkit-filter\": filter,\n                filter: filter,\n            },\n        };\n\n        let chevron: vd.VNode = vd.h(\"div.\" + className, properties, []);\n\n        let azimuthDeg: number = -this._spatial.radToDeg(azimuth - rotation.phi);\n        let circleTransform: string = shiftVertically ?\n            `translate(${translationX}px, ${translationY}px) rotate(${azimuthDeg}deg) translateZ(-0.01px)` :\n            `translate(${translationX}px, ${translationY}px) rotate(${azimuthDeg}deg)`;\n\n        let circleProperties: vd.createProperties = {\n            attributes: { \"data-key\": key },\n            onclick: onClick,\n            style: {\n                height: this._calculator.stepCircleSizeCss,\n                marginLeft: this._calculator.stepCircleMarginCss,\n                marginTop: this._calculator.stepCircleMarginCss,\n                transform: circleTransform,\n                width: this._calculator.stepCircleSizeCss,\n            },\n        };\n\n        if (this._sequenceEdgeKeys.indexOf(key) > -1) {\n            circleClassName += \"Sequence\";\n        }\n\n        if (this._highlightKey === key) {\n            circleClassName += \"Highlight\";\n        }\n\n        return vd.h(\"div.\" + circleClassName, circleProperties, [chevron]);\n    }\n\n    private _getContainer(\n        steps: vd.VNode[],\n        turns: vd.VNode[],\n        rotation: IRotation): vd.VNode {\n\n        // edge does not handle hover on perspective transforms.\n        let transform: string = this._isEdge ?\n            \"rotateX(60deg)\" :\n            `perspective(${this._calculator.containerWidthCss}) rotateX(60deg)`;\n\n        let properties: vd.createProperties = {\n            oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); },\n            style: {\n                bottom: this._calculator.containerBottomCss,\n                height: this._calculator.containerHeightCss,\n                left: this._calculator.containerLeftCss,\n                marginLeft: this._calculator.containerMarginCss,\n                transform: transform,\n                width: this._calculator.containerWidthCss,\n            },\n        };\n\n        return vd.h(\"div.DirectionsPerspective\", properties, turns.concat(steps));\n    }\n}\n\nexport default DirectionDOMRenderer;\n",
-    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/combineLatest\";\nimport \"rxjs/add/operator/debounceTime\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/pairwise\";\nimport \"rxjs/add/operator/publish\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/skipWhile\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/takeUntil\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    ComponentService,\n    Component,\n    IImagePlaneConfiguration,\n    ImagePlaneGLRenderer,\n} from \"../../Component\";\nimport {\n    Transform,\n} from \"../../Geo\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n    ImageSize,\n} from \"../../Viewer\";\nimport {\n    GLRenderStage,\n    IGLRenderHash,\n    ISize,\n    RenderCamera,\n} from \"../../Render\";\nimport {Node} from \"../../Graph\";\nimport {\n    ImageTileLoader,\n    ImageTileStore,\n    IRegionOfInterest,\n    RegionOfInterestCalculator,\n    TextureProvider,\n} from \"../../Tiles\";\nimport {\n    Settings,\n    Urls,\n} from \"../../Utils\";\n\ninterface IImagePlaneGLRendererOperation {\n    (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer;\n}\n\ntype PositionLookat = [THREE.Vector3, THREE.Vector3, number, number, number];\n\nexport class ImagePlaneComponent extends Component<IImagePlaneConfiguration> {\n    public static componentName: string = \"imagePlane\";\n\n    private _rendererOperation$: Subject<IImagePlaneGLRendererOperation>;\n    private _renderer$: Observable<ImagePlaneGLRenderer>;\n    private _rendererCreator$: Subject<void>;\n    private _rendererDisposer$: Subject<void>;\n\n    private _abortTextureProviderSubscription: Subscription;\n    private _hasTextureSubscription: Subscription;\n    private _rendererSubscription: Subscription;\n    private _setRegionOfInterestSubscription: Subscription;\n    private _setTextureProviderSubscription: Subscription;\n    private _setTileSizeSubscription: Subscription;\n    private _stateSubscription: Subscription;\n    private _textureProviderSubscription: Subscription;\n    private _updateBackgroundSubscription: Subscription;\n    private _updateTextureImageSubscription: Subscription;\n\n    private _imageTileLoader: ImageTileLoader;\n    private _roiCalculator: RegionOfInterestCalculator;\n\n    constructor (name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._imageTileLoader = new ImageTileLoader(Urls.tileScheme, Urls.tileDomain, Urls.origin);\n        this._roiCalculator = new RegionOfInterestCalculator();\n\n        this._rendererOperation$ = new Subject<IImagePlaneGLRendererOperation>();\n        this._rendererCreator$ = new Subject<void>();\n        this._rendererDisposer$ = new Subject<void>();\n\n        this._renderer$ = this._rendererOperation$\n            .scan(\n                (renderer: ImagePlaneGLRenderer, operation: IImagePlaneGLRendererOperation): ImagePlaneGLRenderer => {\n                    return operation(renderer);\n                },\n                null)\n            .filter(\n                (renderer: ImagePlaneGLRenderer): boolean => {\n                    return renderer != null;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (renderer: ImagePlaneGLRenderer): number => {\n                    return renderer.frameId;\n                });\n\n        this._rendererCreator$\n            .map(\n                (): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        if (renderer != null) {\n                            throw new Error(\"Multiple image plane states can not be created at the same time\");\n                        }\n\n                        return new ImagePlaneGLRenderer();\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        this._rendererDisposer$\n            .map(\n                (): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.dispose();\n\n                        return null;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n    }\n\n    protected _activate(): void {\n        this._rendererSubscription = this._renderer$\n            .map(\n                (renderer: ImagePlaneGLRenderer): IGLRenderHash => {\n                    let renderHash: IGLRenderHash = {\n                        name: this._name,\n                        render: {\n                            frameId: renderer.frameId,\n                            needsRender: renderer.needsRender,\n                            render: renderer.render.bind(renderer),\n                            stage: GLRenderStage.Background,\n                        },\n                    };\n\n                    renderer.clearNeedsRender();\n\n                    return renderHash;\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        this._rendererCreator$.next(null);\n\n        this._stateSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.updateFrame(frame);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        let textureProvider$: Observable<TextureProvider> = this._navigator.stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .combineLatest(this._configuration$)\n            .filter(\n                (args: [IFrame, IImagePlaneConfiguration]): boolean => {\n                    return args[1].imageTiling === true;\n                })\n            .map(\n                (args: [IFrame, IImagePlaneConfiguration]): IFrame => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.glRenderer.webGLRenderer$,\n                this._container.renderService.size$)\n            .map(\n                ([frame, renderer, size]: [IFrame, THREE.WebGLRenderer, ISize]): TextureProvider => {\n                    let state: ICurrentState = frame.state;\n                    let viewportSize: number = Math.max(size.width, size.height);\n\n                    let currentNode: Node = state.currentNode;\n                    let currentTransform: Transform = state.currentTransform;\n                    let tileSize: number = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;\n\n                    return new TextureProvider(\n                        currentNode.key,\n                        currentTransform.basicWidth,\n                        currentTransform.basicHeight,\n                        tileSize,\n                        currentNode.image,\n                        this._imageTileLoader,\n                        new ImageTileStore(),\n                        renderer);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._textureProviderSubscription = textureProvider$.subscribe(() => { /*noop*/ });\n\n        this._setTextureProviderSubscription = textureProvider$\n            .map(\n                (provider: TextureProvider): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.setTextureProvider(provider.key, provider);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        this._setTileSizeSubscription = this._container.renderService.size$\n            .switchMap(\n                (size: ISize): Observable<[TextureProvider, ISize]> => {\n                    return Observable\n                        .combineLatest(\n                            textureProvider$,\n                            Observable.of<ISize>(size))\n                        .first();\n                })\n            .subscribe(\n                ([provider, size]: [TextureProvider, ISize]): void => {\n                    let viewportSize: number = Math.max(size.width, size.height);\n                    let tileSize: number = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;\n\n                    provider.setTileSize(tileSize);\n                });\n\n        this._abortTextureProviderSubscription = textureProvider$\n            .pairwise()\n            .subscribe(\n                (pair: [TextureProvider, TextureProvider]): void => {\n                    let previous: TextureProvider = pair[0];\n                    previous.abort();\n                });\n\n        let roiTrigger$: Observable<[RenderCamera, ISize, Transform]> = Observable\n            .combineLatest(\n                this._container.renderService.renderCameraFrame$,\n                this._container.renderService.size$.debounceTime(250))\n            .map(\n                ([camera, size]: [RenderCamera, ISize]): PositionLookat => {\n                    return [\n                        camera.camera.position.clone(),\n                        camera.camera.lookat.clone(),\n                        camera.zoom.valueOf(),\n                        size.height.valueOf(),\n                        size.width.valueOf()];\n                })\n            .pairwise()\n            .skipWhile(\n                (pls: [PositionLookat, PositionLookat]): boolean => {\n                    return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;\n                })\n            .map(\n                (pls: [PositionLookat, PositionLookat]): boolean => {\n                    let samePosition: boolean = pls[0][0].equals(pls[1][0]);\n                    let sameLookat: boolean = pls[0][1].equals(pls[1][1]);\n                    let sameZoom: boolean = pls[0][2] === pls[1][2];\n                    let sameHeight: boolean = pls[0][3] === pls[1][3];\n                    let sameWidth: boolean = pls[0][4] === pls[1][4];\n\n                    return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;\n                })\n            .distinctUntilChanged()\n            .filter(\n                (stalled: boolean): boolean => {\n                    return stalled;\n                })\n            .switchMap(\n                (stalled: boolean): Observable<RenderCamera> => {\n                    return this._container.renderService.renderCameraFrame$\n                        .first();\n                })\n            .withLatestFrom(\n                this._container.renderService.size$,\n                this._navigator.stateService.currentTransform$);\n\n        this._setRegionOfInterestSubscription = textureProvider$\n            .switchMap(\n                (provider: TextureProvider): Observable<[IRegionOfInterest, TextureProvider]> => {\n                    return roiTrigger$\n                        .map(\n                            ([camera, size, transform]: [RenderCamera, ISize, Transform]):\n                            [IRegionOfInterest, TextureProvider] => {\n                                return [\n                                    this._roiCalculator.computeRegionOfInterest(camera, size, transform),\n                                    provider,\n                                ];\n                            });\n                })\n            .filter(\n                (args: [IRegionOfInterest, TextureProvider]): boolean => {\n                    return !args[1].disposed;\n                })\n            .subscribe(\n                (args: [IRegionOfInterest, TextureProvider]): void => {\n                    let roi: IRegionOfInterest = args[0];\n                    let provider: TextureProvider = args[1];\n\n                    provider.setRegionOfInterest(roi);\n                });\n\n        let hasTexture$: Observable<boolean> = textureProvider$\n            .switchMap(\n                (provider: TextureProvider): Observable<boolean> => {\n                    return provider.hasTexture$;\n                })\n            .startWith(false)\n            .publishReplay(1)\n            .refCount();\n\n        this._hasTextureSubscription = hasTexture$.subscribe(() => { /*noop*/ });\n\n        let nodeImage$: Observable<[HTMLImageElement, Node]> = this._navigator.stateService.currentNode$\n            .debounceTime(1000)\n            .withLatestFrom(hasTexture$)\n            .filter(\n                (args: [Node, boolean]): boolean => {\n                    return !args[1];\n                })\n            .map(\n                (args: [Node, boolean]): Node => {\n                    return args[0];\n                })\n            .filter(\n                (node: Node): boolean => {\n                    return node.pano ?\n                        Settings.maxImageSize > Settings.basePanoramaSize :\n                        Settings.maxImageSize > Settings.baseImageSize;\n                })\n            .switchMap(\n                (node: Node): Observable<[HTMLImageElement, Node]> => {\n                    let baseImageSize: ImageSize = node.pano ?\n                        Settings.basePanoramaSize :\n                        Settings.baseImageSize;\n\n                    if (Math.max(node.image.width, node.image.height) > baseImageSize) {\n                        return Observable.empty<[HTMLImageElement, Node]>();\n                    }\n\n                    let image$: Observable<[HTMLImageElement, Node]> = node\n                        .cacheImage$(Settings.maxImageSize)\n                            .map(\n                                (n: Node): [HTMLImageElement, Node] => {\n                                    return [n.image, n];\n                                });\n\n                    return image$\n                        .takeUntil(\n                            hasTexture$\n                                .filter(\n                                    (hasTexture: boolean): boolean => {\n\n                                        return hasTexture;\n                                    }))\n                        .catch(\n                            (error: Error, caught: Observable<[HTMLImageElement, Node]>):\n                                Observable<[HTMLImageElement, Node]> => {\n                                console.error(`Failed to fetch high res image (${node.key})`, error);\n\n                                return Observable.empty<[HTMLImageElement, Node]>();\n                            });\n                })\n            .publish()\n            .refCount();\n\n        this._updateBackgroundSubscription = nodeImage$\n            .withLatestFrom(textureProvider$)\n            .subscribe(\n                (args: [[HTMLImageElement, Node], TextureProvider]): void => {\n                    if (args[0][1].key !== args[1].key ||\n                        args[1].disposed) {\n                        return;\n                    }\n\n                    args[1].updateBackground(args[0][0]);\n                });\n\n        this._updateTextureImageSubscription = nodeImage$\n            .map(\n                (imn: [HTMLImageElement, Node]): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.updateTextureImage(imn[0], imn[1]);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n    }\n\n    protected _deactivate(): void {\n        this._rendererDisposer$.next(null);\n\n        this._abortTextureProviderSubscription.unsubscribe();\n        this._hasTextureSubscription.unsubscribe();\n        this._rendererSubscription.unsubscribe();\n        this._setRegionOfInterestSubscription.unsubscribe();\n        this._setTextureProviderSubscription.unsubscribe();\n        this._setTileSizeSubscription.unsubscribe();\n        this._stateSubscription.unsubscribe();\n        this._textureProviderSubscription.unsubscribe();\n        this._updateBackgroundSubscription.unsubscribe();\n        this._updateTextureImageSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IImagePlaneConfiguration {\n        return { imageTiling: false };\n    }\n}\n\nComponentService.register(ImagePlaneComponent);\nexport default ImagePlaneComponent;\n",
+    "import {IDirectionConfiguration} from \"../../Component\";\nimport {Spatial} from \"../../Geo\";\n\n/**\n * @class DirectionDOMCalculator\n * @classdesc Helper class for calculating DOM CSS properties.\n */\nexport class DirectionDOMCalculator {\n    private _spatial: Spatial;\n\n    private _elementWidth: number;\n    private _elementHeight: number;\n\n    private _minWidth: number;\n    private _maxWidth: number;\n\n    private _minThresholdWidth: number;\n    private _maxThresholdWidth: number;\n    private _minThresholdHeight: number;\n    private _maxThresholdHeight: number;\n\n    private _containerWidth: number;\n    private _containerWidthCss: string;\n    private _containerMarginCss: string;\n    private _containerLeftCss: string;\n    private _containerHeight: number;\n    private _containerHeightCss: string;\n    private _containerBottomCss: string;\n\n    private _stepCircleSize: number;\n    private _stepCircleSizeCss: string;\n    private _stepCircleMarginCss: string;\n\n    private _turnCircleSize: number;\n    private _turnCircleSizeCss: string;\n\n    private _outerRadius: number;\n    private _innerRadius: number;\n\n    private _shadowOffset: number;\n\n    constructor(configuration: IDirectionConfiguration, element: HTMLElement) {\n        this._spatial = new Spatial();\n\n        this._minThresholdWidth = 320;\n        this._maxThresholdWidth = 1480;\n        this._minThresholdHeight = 240;\n        this._maxThresholdHeight = 820;\n\n        this._configure(configuration);\n        this._resize(element);\n        this._reset();\n    }\n\n    public get minWidth(): number {\n        return this._minWidth;\n    }\n\n    public get maxWidth(): number {\n        return this._maxWidth;\n    }\n\n    public get containerWidth(): number {\n        return this._containerWidth;\n    }\n\n    public get containerWidthCss(): string {\n        return this._containerWidthCss;\n    }\n\n    public get containerMarginCss(): string {\n        return this._containerMarginCss;\n    }\n\n    public get containerLeftCss(): string {\n        return this._containerLeftCss;\n    }\n\n    public get containerHeight(): number {\n        return this._containerHeight;\n    }\n\n    public get containerHeightCss(): string {\n        return this._containerHeightCss;\n    }\n\n    public get containerBottomCss(): string {\n        return this._containerBottomCss;\n    }\n\n    public get stepCircleSize(): number {\n        return this._stepCircleSize;\n    }\n\n    public get stepCircleSizeCss(): string {\n        return this._stepCircleSizeCss;\n    }\n\n    public get stepCircleMarginCss(): string {\n        return this._stepCircleMarginCss;\n    }\n\n    public get turnCircleSize(): number {\n        return this._turnCircleSize;\n    }\n\n    public get turnCircleSizeCss(): string {\n        return this._turnCircleSizeCss;\n    }\n\n    public get outerRadius(): number {\n        return this._outerRadius;\n    }\n\n    public get innerRadius(): number {\n        return this._innerRadius;\n    }\n\n    public get shadowOffset(): number {\n        return this._shadowOffset;\n    }\n\n    /**\n     * Configures the min and max width values.\n     *\n     * @param {IDirectionConfiguration} configuration Configuration\n     * with min and max width values.\n     */\n    public configure(configuration: IDirectionConfiguration): void {\n        this._configure(configuration);\n        this._reset();\n    }\n\n    /**\n     * Resizes all properties according to the width and height\n     * of the element.\n     *\n     * @param {HTMLElement} element The container element from which to extract\n     * the width and height.\n     */\n    public resize(element: HTMLElement): void {\n        this._resize(element);\n        this._reset();\n    }\n\n    /**\n     * Calculates the coordinates on the unit circle for an angle.\n     *\n     * @param {number} angle Angle in radians.\n     * @returns {Array<number>} The x and y coordinates on the unit circle.\n     */\n    public angleToCoordinates(angle: number): number[] {\n        return [Math.cos(angle), Math.sin(angle)];\n    }\n\n    /**\n     * Calculates the coordinates on the unit circle for the\n     * relative angle between the first and second angle.\n     *\n     * @param {number} first Angle in radians.\n     * @param {number} second Angle in radians.\n     * @returns {Array<number>} The x and y coordinates on the unit circle\n     * for the relative angle between the first and second angle.\n     */\n    public relativeAngleToCoordiantes(first: number, second: number): number[] {\n        let relativeAngle: number = this._spatial.wrapAngle(first - second);\n\n        return this.angleToCoordinates(relativeAngle);\n    }\n\n    private _configure(configuration: IDirectionConfiguration): void {\n        this._minWidth = configuration.minWidth;\n        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);\n    }\n\n    private _resize(element: HTMLElement): void {\n        this._elementWidth = element.offsetWidth;\n        this._elementHeight = element.offsetHeight;\n    }\n\n    private _reset(): void {\n        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);\n        this._containerHeight = this._getContainerHeight(this.containerWidth);\n        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);\n        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);\n        this._outerRadius = this._getOuterRadius(this._containerHeight);\n        this._innerRadius = this._getInnerRadius(this._containerHeight);\n\n        this._shadowOffset = 3;\n\n        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);\n        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);\n        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));\n        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);\n        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));\n        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);\n        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);\n        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);\n    }\n\n    private _getContainerWidth(elementWidth: number, elementHeight: number): number {\n        let relativeWidth: number =\n            (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);\n        let relativeHeight: number =\n            (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);\n\n        let coeff: number = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));\n\n        coeff = 0.04 * Math.round(25 * coeff);\n\n        return this._minWidth + coeff * (this._maxWidth - this._minWidth);\n    }\n\n    private _getContainerHeight(containerWidth: number): number {\n        return 0.77 * containerWidth;\n    }\n\n    private _getStepCircleDiameter(containerHeight: number): number {\n        return 0.34 * containerHeight;\n    }\n\n    private _getTurnCircleDiameter(containerHeight: number): number {\n        return 0.3 * containerHeight;\n    }\n\n    private _getOuterRadius(containerHeight: number): number {\n        return 0.31 * containerHeight;\n    }\n\n    private _getInnerRadius(containerHeight: number): number {\n        return 0.125 * containerHeight;\n    }\n\n    private _numberToCssPixels(value: number): string {\n        return value + \"px\";\n    }\n\n    private _getMaxWidth(value: number, minWidth: number): number {\n        return value > minWidth ? value : minWidth;\n    }\n}\n\nexport default DirectionDOMCalculator;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {DirectionDOMCalculator, IDirectionConfiguration} from \"../../Component\";\nimport {EdgeDirection, IEdge} from \"../../Edge\";\nimport {Spatial} from \"../../Geo\";\nimport {IEdgeStatus, Node, Sequence} from \"../../Graph\";\nimport {RenderCamera} from \"../../Render\";\nimport {IRotation} from \"../../State\";\nimport {Navigator} from \"../../Viewer\";\n\n/**\n * @class DirectionDOMRenderer\n * @classdesc DOM renderer for direction arrows.\n */\nexport class DirectionDOMRenderer {\n    private _spatial: Spatial;\n    private _calculator: DirectionDOMCalculator;\n\n    private _node: Node;\n\n    private _rotation: IRotation;\n    private _epsilon: number;\n\n    private _highlightKey: string;\n    private _distinguishSequence: boolean;\n\n    private _needsRender: boolean;\n\n    private _stepEdges: IEdge[];\n    private _turnEdges: IEdge[];\n    private _panoEdges: IEdge[];\n    private _sequenceEdgeKeys: string[];\n\n    private _stepDirections: EdgeDirection[];\n    private _turnDirections: EdgeDirection[];\n    private _turnNames: {[dir: number]: string};\n\n    private _isEdge: boolean = false;\n\n    constructor(configuration: IDirectionConfiguration, element: HTMLElement) {\n        this._spatial = new Spatial();\n        this._calculator = new DirectionDOMCalculator(configuration, element);\n\n        this._node = null;\n\n        this._rotation = { phi: 0, theta: 0 };\n        this._epsilon = 0.5 * Math.PI / 180;\n\n        this._highlightKey = null;\n        this._distinguishSequence = false;\n\n        this._needsRender = false;\n\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n\n        this._stepDirections = [\n            EdgeDirection.StepForward,\n            EdgeDirection.StepBackward,\n            EdgeDirection.StepLeft,\n            EdgeDirection.StepRight,\n        ];\n\n        this._turnDirections = [\n            EdgeDirection.TurnLeft,\n            EdgeDirection.TurnRight,\n            EdgeDirection.TurnU,\n        ];\n\n        this._turnNames = {};\n        this._turnNames[EdgeDirection.TurnLeft] = \"TurnLeft\";\n        this._turnNames[EdgeDirection.TurnRight] = \"TurnRight\";\n        this._turnNames[EdgeDirection.TurnU] = \"TurnAround\";\n\n        // detects IE 8-11, then Edge 20+.\n        let isIE: boolean = !!(<any>document).documentMode;\n        this._isEdge = !isIE && !!(<any>window).StyleMedia;\n    }\n\n    /**\n     * Get needs render.\n     *\n     * @returns {boolean} Value indicating whether render should be called.\n     */\n    public get needsRender(): boolean {\n        return this._needsRender;\n    }\n\n    /**\n     * Renders virtual DOM elements.\n     *\n     * @description Calling render resets the needs render property.\n     */\n    public render(navigator: Navigator): vd.VNode {\n        this._needsRender = false;\n\n        let rotation: IRotation = this._rotation;\n\n        let steps: vd.VNode[] = [];\n        let turns: vd.VNode[] = [];\n\n        if (this._node.pano) {\n            steps = steps.concat(this._createPanoArrows(navigator, rotation));\n        } else {\n            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));\n            steps = steps.concat(this._createStepArrows(navigator, rotation));\n            turns = turns.concat(this._createTurnArrows(navigator));\n        }\n\n        return this._getContainer(steps, turns, rotation);\n    }\n\n    public setEdges(edgeStatus: IEdgeStatus, sequence: Sequence): void {\n        this._setEdges(edgeStatus, sequence);\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set node for which to show edges.\n     *\n     * @param {Node} node\n     */\n    public setNode(node: Node): void {\n        this._node = node;\n        this._clearEdges();\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set the render camera to use for calculating rotations.\n     *\n     * @param {RenderCamera} renderCamera\n     */\n    public setRenderCamera(renderCamera: RenderCamera): void {\n        let rotation: IRotation = renderCamera.rotation;\n\n        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {\n            return;\n        }\n\n        this._rotation = rotation;\n\n        this._setNeedsRender();\n    }\n\n    /**\n     * Set configuration values.\n     *\n     * @param {IDirectionConfiguration} configuration\n     */\n    public setConfiguration(configuration: IDirectionConfiguration): void {\n        let needsRender: boolean = false;\n        if (this._highlightKey !== configuration.highlightKey ||\n            this._distinguishSequence !== configuration.distinguishSequence) {\n            this._highlightKey = configuration.highlightKey;\n            this._distinguishSequence = configuration.distinguishSequence;\n\n            needsRender = true;\n        }\n\n        if (this._calculator.minWidth !== configuration.minWidth ||\n            this._calculator.maxWidth !== configuration.maxWidth) {\n            this._calculator.configure(configuration);\n            needsRender = true;\n        }\n\n        if (needsRender) {\n            this._setNeedsRender();\n        }\n    }\n\n    /**\n     * Detect the element's width and height and resize\n     * elements accordingly.\n     *\n     * @param {HTMLElement} element Viewer container element.\n     */\n    public resize(element: HTMLElement): void {\n        this._calculator.resize(element);\n\n        this._setNeedsRender();\n    }\n\n    private _setNeedsRender(): void {\n        if (this._node != null) {\n            this._needsRender = true;\n        }\n    }\n\n    private _clearEdges(): void {\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n    }\n\n    private _setEdges(edgeStatus: IEdgeStatus, sequence: Sequence): void {\n        this._stepEdges = [];\n        this._turnEdges = [];\n        this._panoEdges = [];\n        this._sequenceEdgeKeys = [];\n\n        for (let edge of edgeStatus.edges) {\n            let direction: EdgeDirection = edge.data.direction;\n\n            if (this._stepDirections.indexOf(direction) > -1) {\n                this._stepEdges.push(edge);\n                continue;\n            }\n\n            if (this._turnDirections.indexOf(direction) > -1) {\n                this._turnEdges.push(edge);\n                continue;\n            }\n\n            if (edge.data.direction === EdgeDirection.Pano) {\n                this._panoEdges.push(edge);\n            }\n        }\n\n        if (this._distinguishSequence && sequence != null) {\n            let edges: IEdge[] = this._panoEdges\n                .concat(this._stepEdges)\n                .concat(this._turnEdges);\n\n            for (let edge of edges) {\n                let edgeKey: string = edge.to;\n\n                for (let sequenceKey of sequence.keys) {\n                    if (sequenceKey === edgeKey) {\n                        this._sequenceEdgeKeys.push(edgeKey);\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    private _createPanoArrows(navigator: Navigator, rotation: IRotation): vd.VNode[] {\n        let arrows: vd.VNode[] = [];\n\n        for (let panoEdge of this._panoEdges) {\n            arrows.push(\n                this._createVNodeByKey(\n                    navigator,\n                    panoEdge.to,\n                    panoEdge.data.worldMotionAzimuth,\n                    rotation,\n                    this._calculator.outerRadius,\n                    \"DirectionsArrowPano\"));\n        }\n\n        for (let stepEdge of this._stepEdges) {\n            arrows.push(\n                this._createPanoToPerspectiveArrow(\n                    navigator,\n                    stepEdge.to,\n                    stepEdge.data.worldMotionAzimuth,\n                    rotation,\n                    stepEdge.data.direction));\n        }\n\n        return arrows;\n    }\n\n    private _createPanoToPerspectiveArrow(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        direction: EdgeDirection): vd.VNode {\n\n        let threshold: number = Math.PI / 8;\n\n        let relativePhi: number = rotation.phi;\n\n        switch (direction) {\n            case EdgeDirection.StepBackward:\n                relativePhi = rotation.phi - Math.PI;\n                break;\n            case EdgeDirection.StepLeft:\n                relativePhi = rotation.phi + Math.PI / 2;\n                break;\n            case EdgeDirection.StepRight:\n                relativePhi = rotation.phi - Math.PI / 2;\n                break;\n            default:\n                break;\n        }\n\n        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {\n            return this._createVNodeByKey(\n                navigator,\n                key,\n                azimuth,\n                rotation,\n                this._calculator.outerRadius,\n                \"DirectionsArrowStep\");\n        }\n\n        return this._createVNodeDisabled(key, azimuth, rotation);\n    }\n\n    private _createPerspectiveToPanoArrows(navigator: Navigator, rotation: IRotation): vd.VNode[] {\n        let arrows: vd.VNode[] = [];\n\n        for (let panoEdge of this._panoEdges) {\n            arrows.push(\n                this._createVNodeByKey(\n                    navigator,\n                    panoEdge.to,\n                    panoEdge.data.worldMotionAzimuth,\n                    rotation,\n                    this._calculator.innerRadius,\n                    \"DirectionsArrowPano\",\n                    true));\n        }\n\n        return arrows;\n    }\n\n    private _createStepArrows(navigator: Navigator, rotation: IRotation): vd.VNode[] {\n        let arrows: vd.VNode[] = [];\n\n        for (let stepEdge of this._stepEdges) {\n            arrows.push(\n                this._createVNodeByDirection(\n                    navigator,\n                    stepEdge.to,\n                    stepEdge.data.worldMotionAzimuth,\n                    rotation,\n                    stepEdge.data.direction));\n        }\n\n        return arrows;\n    }\n\n    private _createTurnArrows(navigator: Navigator): vd.VNode[] {\n        let turns: vd.VNode[] = [];\n\n        for (let turnEdge of this._turnEdges) {\n            let direction: EdgeDirection = turnEdge.data.direction;\n            let name: string = this._turnNames[direction];\n\n            turns.push(\n                this._createVNodeByTurn(\n                    navigator,\n                    turnEdge.to,\n                    name,\n                    direction));\n        }\n\n        return turns;\n    }\n\n    private _createVNodeByKey(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        offset: number,\n        className: string,\n        shiftVertically?: boolean): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveToKey$(key)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            offset,\n            className,\n            \"DirectionsCircle\",\n            onClick,\n            shiftVertically);\n    }\n\n    private _createVNodeByDirection(\n        navigator: Navigator,\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        direction: EdgeDirection): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveDir$(direction)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            this._calculator.outerRadius,\n            \"DirectionsArrowStep\",\n            \"DirectionsCircle\",\n            onClick);\n    }\n\n    private _createVNodeByTurn(\n        navigator: Navigator,\n        key: string,\n        className: string,\n        direction: EdgeDirection): vd.VNode {\n\n        let onClick: (e: Event) => void =\n            (e: Event): void => {\n                navigator.moveDir$(direction)\n                    .subscribe(\n                        (node: Node): void => { return; },\n                        (error: Error): void => { console.error(error); });\n            };\n\n        let style: any = {\n            height: this._calculator.turnCircleSizeCss,\n            transform: \"rotate(0)\", // apply transform to preserve 3D\n            width: this._calculator.turnCircleSizeCss,\n        };\n\n        switch (direction) {\n            case EdgeDirection.TurnLeft:\n                style.left = \"5px\";\n                style.top = \"5px\";\n                break;\n            case EdgeDirection.TurnRight:\n                style.right = \"5px\";\n                style.top = \"5px\";\n                break;\n            case EdgeDirection.TurnU:\n                style.left = \"5px\";\n                style.bottom = \"5px\";\n                break;\n            default:\n                break;\n        }\n\n        let circleProperties: vd.createProperties = {\n            attributes: {\n                \"data-key\": key,\n            },\n            onclick: onClick,\n            style: style,\n        };\n\n        let circleClassName: string = \"TurnCircle\";\n\n        if (this._sequenceEdgeKeys.indexOf(key) > -1) {\n            circleClassName += \"Sequence\";\n        }\n\n        if (this._highlightKey === key) {\n            circleClassName += \"Highlight\";\n        }\n\n        let turn: vd.VNode = vd.h(`div.${className}`, {}, []);\n\n        return vd.h(\"div.\" + circleClassName, circleProperties, [turn]);\n    }\n\n    private _createVNodeDisabled(key: string, azimuth: number, rotation: IRotation): vd.VNode {\n        return this._createVNode(\n            key,\n            azimuth,\n            rotation,\n            this._calculator.outerRadius,\n            \"DirectionsArrowDisabled\",\n            \"DirectionsCircleDisabled\");\n    }\n\n    private _createVNode(\n        key: string,\n        azimuth: number,\n        rotation: IRotation,\n        radius: number,\n        className: string,\n        circleClassName: string,\n        onClick?: (e: Event) => void,\n        shiftVertically?: boolean): vd.VNode {\n\n        let translation: number[] = this._calculator.angleToCoordinates(azimuth - rotation.phi);\n\n        // rotate 90 degrees clockwise and flip over X-axis\n        let translationX: number = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);\n        let translationY: number = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);\n\n        let shadowTranslation: number[] = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);\n        let shadowOffset: number = this._calculator.shadowOffset;\n        let shadowTranslationX: number = -shadowOffset * shadowTranslation[1];\n        let shadowTranslationY: number = shadowOffset * shadowTranslation[0];\n\n        let filter: string = `drop-shadow(${shadowTranslationX}px ${shadowTranslationY}px 1px rgba(0,0,0,0.8))`;\n\n        let properties: vd.createProperties = {\n            style: {\n                \"-webkit-filter\": filter,\n                filter: filter,\n            },\n        };\n\n        let chevron: vd.VNode = vd.h(\"div.\" + className, properties, []);\n\n        let azimuthDeg: number = -this._spatial.radToDeg(azimuth - rotation.phi);\n        let circleTransform: string = shiftVertically ?\n            `translate(${translationX}px, ${translationY}px) rotate(${azimuthDeg}deg) translateZ(-0.01px)` :\n            `translate(${translationX}px, ${translationY}px) rotate(${azimuthDeg}deg)`;\n\n        let circleProperties: vd.createProperties = {\n            attributes: { \"data-key\": key },\n            onclick: onClick,\n            style: {\n                height: this._calculator.stepCircleSizeCss,\n                marginLeft: this._calculator.stepCircleMarginCss,\n                marginTop: this._calculator.stepCircleMarginCss,\n                transform: circleTransform,\n                width: this._calculator.stepCircleSizeCss,\n            },\n        };\n\n        if (this._sequenceEdgeKeys.indexOf(key) > -1) {\n            circleClassName += \"Sequence\";\n        }\n\n        if (this._highlightKey === key) {\n            circleClassName += \"Highlight\";\n        }\n\n        return vd.h(\"div.\" + circleClassName, circleProperties, [chevron]);\n    }\n\n    private _getContainer(\n        steps: vd.VNode[],\n        turns: vd.VNode[],\n        rotation: IRotation): vd.VNode {\n\n        // edge does not handle hover on perspective transforms.\n        let transform: string = this._isEdge ?\n            \"rotateX(60deg)\" :\n            `perspective(${this._calculator.containerWidthCss}) rotateX(60deg)`;\n\n        let properties: vd.createProperties = {\n            oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); },\n            style: {\n                bottom: this._calculator.containerBottomCss,\n                height: this._calculator.containerHeightCss,\n                left: this._calculator.containerLeftCss,\n                marginLeft: this._calculator.containerMarginCss,\n                transform: transform,\n                width: this._calculator.containerWidthCss,\n            },\n        };\n\n        return vd.h(\"div.DirectionsPerspective\", properties, turns.concat(steps));\n    }\n}\n\nexport default DirectionDOMRenderer;\n",
+    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/combineLatest\";\nimport \"rxjs/add/operator/debounceTime\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/pairwise\";\nimport \"rxjs/add/operator/publish\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/skipWhile\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/takeUntil\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    ComponentService,\n    Component,\n    IImagePlaneConfiguration,\n    ImagePlaneGLRenderer,\n} from \"../../Component\";\nimport {\n    Transform,\n} from \"../../Geo\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n    ImageSize,\n} from \"../../Viewer\";\nimport {\n    GLRenderStage,\n    IGLRenderHash,\n    ISize,\n    RenderCamera,\n} from \"../../Render\";\nimport {Node} from \"../../Graph\";\nimport {\n    ImageTileLoader,\n    ImageTileStore,\n    IRegionOfInterest,\n    RegionOfInterestCalculator,\n    TextureProvider,\n} from \"../../Tiles\";\nimport {\n    Settings,\n    Urls,\n} from \"../../Utils\";\n\ninterface IImagePlaneGLRendererOperation {\n    (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer;\n}\n\ntype PositionLookat = [THREE.Vector3, THREE.Vector3, number, number, number];\n\nexport class ImagePlaneComponent extends Component<IImagePlaneConfiguration> {\n    public static componentName: string = \"imagePlane\";\n\n    private _rendererOperation$: Subject<IImagePlaneGLRendererOperation>;\n    private _renderer$: Observable<ImagePlaneGLRenderer>;\n    private _rendererCreator$: Subject<void>;\n    private _rendererDisposer$: Subject<void>;\n\n    private _abortTextureProviderSubscription: Subscription;\n    private _hasTextureSubscription: Subscription;\n    private _rendererSubscription: Subscription;\n    private _setRegionOfInterestSubscription: Subscription;\n    private _setTextureProviderSubscription: Subscription;\n    private _setTileSizeSubscription: Subscription;\n    private _stateSubscription: Subscription;\n    private _textureProviderSubscription: Subscription;\n    private _updateBackgroundSubscription: Subscription;\n    private _updateTextureImageSubscription: Subscription;\n\n    private _imageTileLoader: ImageTileLoader;\n    private _roiCalculator: RegionOfInterestCalculator;\n\n    constructor (name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._imageTileLoader = new ImageTileLoader(Urls.tileScheme, Urls.tileDomain, Urls.origin);\n        this._roiCalculator = new RegionOfInterestCalculator();\n\n        this._rendererOperation$ = new Subject<IImagePlaneGLRendererOperation>();\n        this._rendererCreator$ = new Subject<void>();\n        this._rendererDisposer$ = new Subject<void>();\n\n        this._renderer$ = this._rendererOperation$\n            .scan(\n                (renderer: ImagePlaneGLRenderer, operation: IImagePlaneGLRendererOperation): ImagePlaneGLRenderer => {\n                    return operation(renderer);\n                },\n                null)\n            .filter(\n                (renderer: ImagePlaneGLRenderer): boolean => {\n                    return renderer != null;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (renderer: ImagePlaneGLRenderer): number => {\n                    return renderer.frameId;\n                });\n\n        this._rendererCreator$\n            .map(\n                (): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        if (renderer != null) {\n                            throw new Error(\"Multiple image plane states can not be created at the same time\");\n                        }\n\n                        return new ImagePlaneGLRenderer();\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        this._rendererDisposer$\n            .map(\n                (): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.dispose();\n\n                        return null;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n    }\n\n    protected _activate(): void {\n        this._rendererSubscription = this._renderer$\n            .map(\n                (renderer: ImagePlaneGLRenderer): IGLRenderHash => {\n                    let renderHash: IGLRenderHash = {\n                        name: this._name,\n                        render: {\n                            frameId: renderer.frameId,\n                            needsRender: renderer.needsRender,\n                            render: renderer.render.bind(renderer),\n                            stage: GLRenderStage.Background,\n                        },\n                    };\n\n                    renderer.clearNeedsRender();\n\n                    return renderHash;\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        this._rendererCreator$.next(null);\n\n        this._stateSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.updateFrame(frame);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        let textureProvider$: Observable<TextureProvider> = this._navigator.stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .combineLatest(this._configuration$)\n            .filter(\n                (args: [IFrame, IImagePlaneConfiguration]): boolean => {\n                    return args[1].imageTiling === true;\n                })\n            .map(\n                (args: [IFrame, IImagePlaneConfiguration]): IFrame => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.glRenderer.webGLRenderer$,\n                this._container.renderService.size$)\n            .map(\n                ([frame, renderer, size]: [IFrame, THREE.WebGLRenderer, ISize]): TextureProvider => {\n                    let state: ICurrentState = frame.state;\n                    let viewportSize: number = Math.max(size.width, size.height);\n\n                    let currentNode: Node = state.currentNode;\n                    let currentTransform: Transform = state.currentTransform;\n                    let tileSize: number = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;\n\n                    return new TextureProvider(\n                        currentNode.key,\n                        currentTransform.basicWidth,\n                        currentTransform.basicHeight,\n                        tileSize,\n                        currentNode.image,\n                        this._imageTileLoader,\n                        new ImageTileStore(),\n                        renderer);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._textureProviderSubscription = textureProvider$.subscribe(() => { /*noop*/ });\n\n        this._setTextureProviderSubscription = textureProvider$\n            .map(\n                (provider: TextureProvider): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.setTextureProvider(provider.key, provider);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n\n        this._setTileSizeSubscription = this._container.renderService.size$\n            .switchMap(\n                (size: ISize): Observable<[TextureProvider, ISize]> => {\n                    return Observable\n                        .combineLatest(\n                            textureProvider$,\n                            Observable.of<ISize>(size))\n                        .first();\n                })\n            .subscribe(\n                ([provider, size]: [TextureProvider, ISize]): void => {\n                    let viewportSize: number = Math.max(size.width, size.height);\n                    let tileSize: number = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;\n\n                    provider.setTileSize(tileSize);\n                });\n\n        this._abortTextureProviderSubscription = textureProvider$\n            .pairwise()\n            .subscribe(\n                (pair: [TextureProvider, TextureProvider]): void => {\n                    let previous: TextureProvider = pair[0];\n                    previous.abort();\n                });\n\n        let roiTrigger$: Observable<[RenderCamera, ISize, Transform]> = Observable\n            .combineLatest(\n                this._container.renderService.renderCameraFrame$,\n                this._container.renderService.size$.debounceTime(250))\n            .map(\n                ([camera, size]: [RenderCamera, ISize]): PositionLookat => {\n                    return [\n                        camera.camera.position.clone(),\n                        camera.camera.lookat.clone(),\n                        camera.zoom.valueOf(),\n                        size.height.valueOf(),\n                        size.width.valueOf()];\n                })\n            .pairwise()\n            .skipWhile(\n                (pls: [PositionLookat, PositionLookat]): boolean => {\n                    return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;\n                })\n            .map(\n                (pls: [PositionLookat, PositionLookat]): boolean => {\n                    let samePosition: boolean = pls[0][0].equals(pls[1][0]);\n                    let sameLookat: boolean = pls[0][1].equals(pls[1][1]);\n                    let sameZoom: boolean = pls[0][2] === pls[1][2];\n                    let sameHeight: boolean = pls[0][3] === pls[1][3];\n                    let sameWidth: boolean = pls[0][4] === pls[1][4];\n\n                    return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;\n                })\n            .distinctUntilChanged()\n            .filter(\n                (stalled: boolean): boolean => {\n                    return stalled;\n                })\n            .switchMap(\n                (stalled: boolean): Observable<RenderCamera> => {\n                    return this._container.renderService.renderCameraFrame$\n                        .first();\n                })\n            .withLatestFrom(\n                this._container.renderService.size$,\n                this._navigator.stateService.currentTransform$);\n\n        this._setRegionOfInterestSubscription = textureProvider$\n            .switchMap(\n                (provider: TextureProvider): Observable<[IRegionOfInterest, TextureProvider]> => {\n                    return roiTrigger$\n                        .map(\n                            ([camera, size, transform]: [RenderCamera, ISize, Transform]):\n                            [IRegionOfInterest, TextureProvider] => {\n                                return [\n                                    this._roiCalculator.computeRegionOfInterest(camera, size, transform),\n                                    provider,\n                                ];\n                            });\n                })\n            .filter(\n                (args: [IRegionOfInterest, TextureProvider]): boolean => {\n                    return !args[1].disposed;\n                })\n            .subscribe(\n                (args: [IRegionOfInterest, TextureProvider]): void => {\n                    let roi: IRegionOfInterest = args[0];\n                    let provider: TextureProvider = args[1];\n\n                    provider.setRegionOfInterest(roi);\n                });\n\n        let hasTexture$: Observable<boolean> = textureProvider$\n            .switchMap(\n                (provider: TextureProvider): Observable<boolean> => {\n                    return provider.hasTexture$;\n                })\n            .startWith(false)\n            .publishReplay(1)\n            .refCount();\n\n        this._hasTextureSubscription = hasTexture$.subscribe(() => { /*noop*/ });\n\n        let nodeImage$: Observable<[HTMLImageElement, Node]> = this._navigator.stateService.currentState$\n            .filter(\n                (frame: IFrame): boolean => {\n                    return frame.state.nodesAhead === 0;\n                })\n            .map(\n                (frame: IFrame): Node => {\n                    return frame.state.currentNode;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (node: Node): string => {\n                    return node.key;\n                })\n            .debounceTime(1000)\n            .withLatestFrom(hasTexture$)\n            .filter(\n                (args: [Node, boolean]): boolean => {\n                    return !args[1];\n                })\n            .map(\n                (args: [Node, boolean]): Node => {\n                    return args[0];\n                })\n            .filter(\n                (node: Node): boolean => {\n                    return node.pano ?\n                        Settings.maxImageSize > Settings.basePanoramaSize :\n                        Settings.maxImageSize > Settings.baseImageSize;\n                })\n            .switchMap(\n                (node: Node): Observable<[HTMLImageElement, Node]> => {\n                    let baseImageSize: ImageSize = node.pano ?\n                        Settings.basePanoramaSize :\n                        Settings.baseImageSize;\n\n                    if (Math.max(node.image.width, node.image.height) > baseImageSize) {\n                        return Observable.empty<[HTMLImageElement, Node]>();\n                    }\n\n                    let image$: Observable<[HTMLImageElement, Node]> = node\n                        .cacheImage$(Settings.maxImageSize)\n                            .map(\n                                (n: Node): [HTMLImageElement, Node] => {\n                                    return [n.image, n];\n                                });\n\n                    return image$\n                        .takeUntil(\n                            hasTexture$\n                                .filter(\n                                    (hasTexture: boolean): boolean => {\n\n                                        return hasTexture;\n                                    }))\n                        .catch(\n                            (error: Error, caught: Observable<[HTMLImageElement, Node]>):\n                                Observable<[HTMLImageElement, Node]> => {\n                                console.error(`Failed to fetch high res image (${node.key})`, error);\n\n                                return Observable.empty<[HTMLImageElement, Node]>();\n                            });\n                })\n            .publish()\n            .refCount();\n\n        this._updateBackgroundSubscription = nodeImage$\n            .withLatestFrom(textureProvider$)\n            .subscribe(\n                (args: [[HTMLImageElement, Node], TextureProvider]): void => {\n                    if (args[0][1].key !== args[1].key ||\n                        args[1].disposed) {\n                        return;\n                    }\n\n                    args[1].updateBackground(args[0][0]);\n                });\n\n        this._updateTextureImageSubscription = nodeImage$\n            .map(\n                (imn: [HTMLImageElement, Node]): IImagePlaneGLRendererOperation => {\n                    return (renderer: ImagePlaneGLRenderer): ImagePlaneGLRenderer => {\n                        renderer.updateTextureImage(imn[0], imn[1]);\n\n                        return renderer;\n                    };\n                })\n            .subscribe(this._rendererOperation$);\n    }\n\n    protected _deactivate(): void {\n        this._rendererDisposer$.next(null);\n\n        this._abortTextureProviderSubscription.unsubscribe();\n        this._hasTextureSubscription.unsubscribe();\n        this._rendererSubscription.unsubscribe();\n        this._setRegionOfInterestSubscription.unsubscribe();\n        this._setTextureProviderSubscription.unsubscribe();\n        this._setTileSizeSubscription.unsubscribe();\n        this._stateSubscription.unsubscribe();\n        this._textureProviderSubscription.unsubscribe();\n        this._updateBackgroundSubscription.unsubscribe();\n        this._updateTextureImageSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IImagePlaneConfiguration {\n        return { imageTiling: false };\n    }\n}\n\nComponentService.register(ImagePlaneComponent);\nexport default ImagePlaneComponent;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {IGPano} from \"../../API\";\nimport {Transform} from \"../../Geo\";\nimport {Node} from \"../../Graph\";\nimport {ImagePlaneShaders} from \"../../Component\";\n\nexport class ImagePlaneFactory {\n    private _imagePlaneDepth: number;\n    private _imageSphereRadius: number;\n\n    constructor(imagePlaneDepth?: number, imageSphereRadius?: number) {\n        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;\n        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;\n    }\n\n    public createMesh(node: Node, transform: Transform): THREE.Mesh {\n        let mesh: THREE.Mesh = node.pano ?\n            this._createImageSphere(node, transform) :\n            this._createImagePlane(node, transform);\n\n        return mesh;\n    }\n\n    private _createImageSphere(node: Node, transform: Transform): THREE.Mesh {\n        let texture: THREE.Texture = this._createTexture(node.image);\n        let materialParameters: THREE.ShaderMaterialParameters = this._createSphereMaterialParameters(transform, texture);\n        let material: THREE.ShaderMaterial = new THREE.ShaderMaterial(materialParameters);\n\n        let mesh: THREE.Mesh = this._useMesh(transform, node) ?\n            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :\n            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);\n\n        return mesh;\n    }\n\n    private _createImagePlane(node: Node, transform: Transform): THREE.Mesh {\n        let texture: THREE.Texture = this._createTexture(node.image);\n        let materialParameters: THREE.ShaderMaterialParameters = this._createPlaneMaterialParameters(transform, texture);\n        let material: THREE.ShaderMaterial = new THREE.ShaderMaterial(materialParameters);\n\n        let geometry: THREE.BufferGeometry = this._useMesh(transform, node) ?\n            this._getImagePlaneGeo(transform, node) :\n            this._getFlatImagePlaneGeo(transform);\n\n        return new THREE.Mesh(geometry, material);\n    }\n\n    private _createSphereMaterialParameters(transform: Transform, texture: THREE.Texture): THREE.ShaderMaterialParameters {\n        let gpano: IGPano = transform.gpano;\n\n        let halfCroppedWidth: number = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;\n        let phiShift: number = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;\n        let phiLength: number = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;\n\n        let halfCroppedHeight: number = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;\n        let thetaShift: number = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;\n        let thetaLength: number = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;\n\n        let materialParameters: THREE.ShaderMaterialParameters = {\n            depthWrite: false,\n            fragmentShader: ImagePlaneShaders.equirectangular.fragment,\n            side: THREE.DoubleSide,\n            transparent: true,\n            uniforms: {\n                opacity: {\n                    type: \"f\",\n                    value: 1,\n                },\n                phiLength: {\n                    type: \"f\",\n                    value: phiLength,\n                },\n                phiShift: {\n                    type: \"f\",\n                    value: phiShift,\n                },\n                projectorMat: {\n                    type: \"m4\",\n                    value: transform.rt,\n                },\n                projectorTex: {\n                    type: \"t\",\n                    value: texture,\n                },\n                thetaLength: {\n                    type: \"f\",\n                    value: thetaLength,\n                },\n                thetaShift: {\n                    type: \"f\",\n                    value: thetaShift,\n                },\n            },\n            vertexShader: ImagePlaneShaders.equirectangular.vertex,\n        };\n\n        return materialParameters;\n    }\n\n    private _createPlaneMaterialParameters(transform: Transform, texture: THREE.Texture): THREE.ShaderMaterialParameters {\n        let materialParameters: THREE.ShaderMaterialParameters = {\n            depthWrite: false,\n            fragmentShader: ImagePlaneShaders.perspective.fragment,\n            side: THREE.DoubleSide,\n            transparent: true,\n            uniforms: {\n                bbox: {\n                    type: \"v4\",\n                    value: new THREE.Vector4(0, 0, 1, 1),\n                },\n                opacity: {\n                    type: \"f\",\n                    value: 1,\n                },\n                projectorMat: {\n                    type: \"m4\",\n                    value: transform.projectorMatrix(),\n                },\n                projectorTex: {\n                    type: \"t\",\n                    value: texture,\n                },\n            },\n            vertexShader: ImagePlaneShaders.perspective.vertex,\n        };\n\n        return materialParameters;\n    }\n\n    private _createTexture(image: HTMLImageElement): THREE.Texture {\n        let texture: THREE.Texture = new THREE.Texture(image);\n        texture.minFilter = THREE.LinearFilter;\n        texture.needsUpdate = true;\n\n        return texture;\n    }\n\n    private _useMesh(transform: Transform, node: Node): boolean {\n        return node.mesh.vertices.length && transform.hasValidScale;\n    }\n\n    private _getImageSphereGeo(transform: Transform, node: Node): THREE.BufferGeometry {\n        let t: THREE.Matrix4 = new THREE.Matrix4().getInverse(transform.srt);\n\n        // push everything at least 5 meters in front of the camera\n        let minZ: number = 5.0 * transform.scale;\n        let maxZ: number = this._imageSphereRadius * transform.scale;\n\n        let vertices: number[] = node.mesh.vertices;\n        let numVertices: number = vertices.length / 3;\n        let positions: Float32Array = new Float32Array(vertices.length);\n        for (let i: number = 0; i < numVertices; ++i) {\n            let index: number = 3 * i;\n            let x: number = vertices[index + 0];\n            let y: number = vertices[index + 1];\n            let z: number = vertices[index + 2];\n\n            let l: number = Math.sqrt(x * x + y * y + z * z);\n            let boundedL: number = Math.max(minZ, Math.min(l, maxZ));\n            let factor: number = boundedL / l;\n            let p: THREE.Vector3 = new THREE.Vector3(x * factor, y * factor, z * factor);\n\n            p.applyMatrix4(t);\n\n            positions[index + 0] = p.x;\n            positions[index + 1] = p.y;\n            positions[index + 2] = p.z;\n        }\n\n        let faces: number[] = node.mesh.faces;\n        let indices: Uint16Array = new Uint16Array(faces.length);\n        for (let i: number = 0; i < faces.length; ++i) {\n            indices[i] = faces[i];\n        }\n\n        let geometry: THREE.BufferGeometry = new THREE.BufferGeometry();\n\n        geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\n        return geometry;\n    }\n\n    private _getImagePlaneGeo(transform: Transform, node: Node): THREE.BufferGeometry {\n        let t: THREE.Matrix4 = new THREE.Matrix4().getInverse(transform.srt);\n\n        // push everything at least 5 meters in front of the camera\n        let minZ: number = 5.0 * transform.scale;\n        let maxZ: number = this._imagePlaneDepth * transform.scale;\n\n        let vertices: number[] = node.mesh.vertices;\n        let numVertices: number = vertices.length / 3;\n        let positions: Float32Array = new Float32Array(vertices.length);\n        for (let i: number = 0; i < numVertices; ++i) {\n            let index: number = 3 * i;\n            let x: number = vertices[index + 0];\n            let y: number = vertices[index + 1];\n            let z: number = vertices[index + 2];\n\n            let boundedZ: number = Math.max(minZ, Math.min(z, maxZ));\n            let factor: number = boundedZ / z;\n            let p: THREE.Vector3 = new THREE.Vector3(x * factor, y * factor, boundedZ);\n\n            p.applyMatrix4(t);\n\n            positions[index + 0] = p.x;\n            positions[index + 1] = p.y;\n            positions[index + 2] = p.z;\n        }\n\n        let faces: number[] = node.mesh.faces;\n        let indices: Uint16Array = new Uint16Array(faces.length);\n        for (let i: number = 0; i < faces.length; ++i) {\n            indices[i] = faces[i];\n        }\n\n        let geometry: THREE.BufferGeometry = new THREE.BufferGeometry();\n\n        geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\n        return geometry;\n    }\n\n    private _getFlatImageSphereGeo(transform: Transform): THREE.Geometry {\n        let gpano: IGPano = transform.gpano;\n        let phiStart: number = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;\n        let phiLength: number = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;\n        let thetaStart: number = Math.PI *\n            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /\n            gpano.FullPanoHeightPixels;\n        let thetaLength: number = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;\n        let geometry: THREE.SphereGeometry = new THREE.SphereGeometry(\n            this._imageSphereRadius,\n            20,\n            40,\n            phiStart - Math.PI / 2,\n            phiLength,\n            thetaStart,\n            thetaLength);\n\n        geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt));\n\n        return geometry;\n    }\n\n    private _getFlatImagePlaneGeo(transform: Transform): THREE.BufferGeometry {\n        let width: number = transform.width;\n        let height: number = transform.height;\n        let size: number = Math.max(width, height);\n        let dx: number = width / 2.0 / size;\n        let dy: number = height / 2.0 / size;\n\n        let vertices: number[][] = [];\n        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));\n        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));\n        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));\n        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));\n\n        let positions: Float32Array = new Float32Array(12);\n        for (let i: number = 0; i < vertices.length; i++) {\n            let index: number = 3 * i;\n            positions[index + 0] = vertices[i][0];\n            positions[index + 1] = vertices[i][1];\n            positions[index + 2] = vertices[i][2];\n        }\n\n        let indices: Uint16Array = new Uint16Array(6);\n        indices[0] = 0;\n        indices[1] = 1;\n        indices[2] = 3;\n        indices[3] = 1;\n        indices[4] = 2;\n        indices[5] = 3;\n\n        let geometry: THREE.BufferGeometry = new THREE.BufferGeometry();\n\n        geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\n        return geometry;\n    }\n}\n\nexport default ImagePlaneFactory;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ImagePlaneScene,\n    ImagePlaneFactory,\n    IShaderMaterial,\n} from \"../../Component\";\nimport {Camera} from \"../../Geo\";\nimport {Node} from \"../../Graph\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {TextureProvider} from \"../../Tiles\";\n\nexport class ImagePlaneGLRenderer {\n    private _imagePlaneFactory: ImagePlaneFactory;\n    private _imagePlaneScene: ImagePlaneScene;\n\n    private _alpha: number;\n    private _alphaOld: number;\n    private _fadeOutSpeed: number;\n    private _lastCamera: Camera;\n    private _epsilon: number;\n\n    private _currentKey: string;\n    private _previousKey: string;\n    private _providerDisposers: { [key: string]: () => void };\n\n    private _frameId: number;\n    private _needsRender: boolean;\n\n    constructor() {\n        this._imagePlaneFactory = new ImagePlaneFactory();\n        this._imagePlaneScene = new ImagePlaneScene();\n\n        this._alpha = 0;\n        this._alphaOld = 0;\n        this._fadeOutSpeed = 0.05;\n        this._lastCamera = new Camera();\n        this._epsilon = 0.000001;\n\n        this._currentKey = null;\n        this._previousKey = null;\n        this._providerDisposers = {};\n\n        this._frameId = 0;\n        this._needsRender = false;\n    }\n\n    public get frameId(): number {\n        return this._frameId;\n    }\n\n    public get needsRender(): boolean {\n        return this._needsRender;\n    }\n\n    public indicateNeedsRender(): void {\n        this._needsRender = true;\n    }\n\n    public updateFrame(frame: IFrame): void {\n        this._updateFrameId(frame.id);\n        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;\n        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;\n        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;\n    }\n\n    public setTextureProvider(key: string, provider: TextureProvider): void {\n        if (key !== this._currentKey) {\n            return;\n        }\n\n        let createdSubscription: Subscription = provider.textureCreated$\n            .subscribe(\n                (texture: THREE.Texture): void => {\n                    this._updateTexture(texture);\n                });\n\n        let updatedSubscription: Subscription = provider.textureUpdated$\n            .subscribe(\n                (updated: boolean): void => {\n                    this._needsRender = true;\n                });\n\n        let dispose: () => void = (): void => {\n            createdSubscription.unsubscribe();\n            updatedSubscription.unsubscribe();\n            provider.dispose();\n        };\n\n        if (key in this._providerDisposers) {\n            let disposeProvider: () => void = this._providerDisposers[key];\n            disposeProvider();\n\n            delete this._providerDisposers[key];\n        }\n\n        this._providerDisposers[key] = dispose;\n    }\n\n    public _updateTexture(texture: THREE.Texture): void {\n        this._needsRender = true;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            let material: IShaderMaterial = <IShaderMaterial>plane.material;\n\n            let oldTexture: THREE.Texture = <THREE.Texture>material.uniforms.projectorTex.value;\n            material.uniforms.projectorTex.value = null;\n            oldTexture.dispose();\n\n            material.uniforms.projectorTex.value = texture;\n        }\n    }\n\n    public updateTextureImage(image: HTMLImageElement, node?: Node): void {\n        if (this._currentKey !== node.key) {\n            return;\n        }\n\n        this._needsRender = true;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            let material: IShaderMaterial = <IShaderMaterial>plane.material;\n            let texture: THREE.Texture = <THREE.Texture>material.uniforms.projectorTex.value;\n\n            texture.image = image;\n            texture.needsUpdate = true;\n        }\n    }\n\n    public render(\n        perspectiveCamera: THREE.PerspectiveCamera,\n        renderer: THREE.WebGLRenderer): void {\n        let planeAlpha: number = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = planeAlpha;\n        }\n\n        for (let plane of this._imagePlaneScene.imagePlanesOld) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = this._alphaOld;\n        }\n\n        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);\n        renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = this._alpha;\n        }\n\n        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);\n    }\n\n    public clearNeedsRender(): void {\n        this._needsRender = false;\n    }\n\n    public dispose(): void {\n        this._imagePlaneScene.clear();\n    }\n\n    private _updateFrameId(frameId: number): void {\n        this._frameId = frameId;\n    }\n\n    private _updateAlpha(alpha: number): boolean {\n        if (alpha === this._alpha) {\n            return false;\n        }\n\n        this._alpha = alpha;\n\n        return true;\n    }\n\n    private _updateAlphaOld(alpha: number): boolean {\n        if (alpha < 1 || this._alphaOld === 0) {\n            return false;\n        }\n\n        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);\n\n        return true;\n    }\n\n    private _updateImagePlanes(state: ICurrentState): boolean {\n        if (state.currentNode == null || state.currentNode.key === this._currentKey) {\n            return false;\n        }\n\n        let previousKey: string = state.previousNode != null ? state.previousNode.key : null;\n        let currentKey: string = state.currentNode.key;\n\n        if (this._previousKey !== previousKey &&\n            this._previousKey !== currentKey &&\n            this._previousKey in this._providerDisposers) {\n\n            let disposeProvider: () => void = this._providerDisposers[this._previousKey];\n            disposeProvider();\n\n            delete this._providerDisposers[this._previousKey];\n        }\n\n        if (previousKey != null) {\n            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {\n                let previousMesh: THREE.Mesh =\n                    this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform);\n\n                this._imagePlaneScene.updateImagePlanes([previousMesh]);\n            }\n\n            this._previousKey = previousKey;\n        }\n\n        this._currentKey = currentKey;\n        let currentMesh: THREE.Mesh =\n            this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform);\n\n        this._imagePlaneScene.updateImagePlanes([currentMesh]);\n\n        this._alphaOld = 1;\n\n        return true;\n    }\n}\n\nexport default ImagePlaneGLRenderer;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ImagePlaneScene,\n    ImagePlaneFactory,\n    IShaderMaterial,\n} from \"../../Component\";\nimport {Node} from \"../../Graph\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {TextureProvider} from \"../../Tiles\";\n\nexport class ImagePlaneGLRenderer {\n    private _imagePlaneFactory: ImagePlaneFactory;\n    private _imagePlaneScene: ImagePlaneScene;\n\n    private _alpha: number;\n    private _alphaOld: number;\n    private _fadeOutSpeed: number;\n\n    private _currentKey: string;\n    private _previousKey: string;\n    private _providerDisposers: { [key: string]: () => void };\n\n    private _frameId: number;\n    private _needsRender: boolean;\n\n    constructor() {\n        this._imagePlaneFactory = new ImagePlaneFactory();\n        this._imagePlaneScene = new ImagePlaneScene();\n\n        this._alpha = 0;\n        this._alphaOld = 0;\n        this._fadeOutSpeed = 0.05;\n\n        this._currentKey = null;\n        this._previousKey = null;\n        this._providerDisposers = {};\n\n        this._frameId = 0;\n        this._needsRender = false;\n    }\n\n    public get frameId(): number {\n        return this._frameId;\n    }\n\n    public get needsRender(): boolean {\n        return this._needsRender;\n    }\n\n    public indicateNeedsRender(): void {\n        this._needsRender = true;\n    }\n\n    public updateFrame(frame: IFrame): void {\n        this._updateFrameId(frame.id);\n        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;\n        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;\n        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;\n    }\n\n    public setTextureProvider(key: string, provider: TextureProvider): void {\n        if (key !== this._currentKey) {\n            return;\n        }\n\n        let createdSubscription: Subscription = provider.textureCreated$\n            .subscribe(\n                (texture: THREE.Texture): void => {\n                    this._updateTexture(texture);\n                });\n\n        let updatedSubscription: Subscription = provider.textureUpdated$\n            .subscribe(\n                (updated: boolean): void => {\n                    this._needsRender = true;\n                });\n\n        let dispose: () => void = (): void => {\n            createdSubscription.unsubscribe();\n            updatedSubscription.unsubscribe();\n            provider.dispose();\n        };\n\n        if (key in this._providerDisposers) {\n            let disposeProvider: () => void = this._providerDisposers[key];\n            disposeProvider();\n\n            delete this._providerDisposers[key];\n        }\n\n        this._providerDisposers[key] = dispose;\n    }\n\n    public _updateTexture(texture: THREE.Texture): void {\n        this._needsRender = true;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            let material: IShaderMaterial = <IShaderMaterial>plane.material;\n\n            let oldTexture: THREE.Texture = <THREE.Texture>material.uniforms.projectorTex.value;\n            material.uniforms.projectorTex.value = null;\n            oldTexture.dispose();\n\n            material.uniforms.projectorTex.value = texture;\n        }\n    }\n\n    public updateTextureImage(image: HTMLImageElement, node?: Node): void {\n        if (this._currentKey !== node.key) {\n            return;\n        }\n\n        this._needsRender = true;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            let material: IShaderMaterial = <IShaderMaterial>plane.material;\n            let texture: THREE.Texture = <THREE.Texture>material.uniforms.projectorTex.value;\n\n            texture.image = image;\n            texture.needsUpdate = true;\n        }\n    }\n\n    public render(\n        perspectiveCamera: THREE.PerspectiveCamera,\n        renderer: THREE.WebGLRenderer): void {\n        let planeAlpha: number = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha;\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = planeAlpha;\n        }\n\n        for (let plane of this._imagePlaneScene.imagePlanesOld) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = this._alphaOld;\n        }\n\n        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);\n        renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);\n\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            (<IShaderMaterial>plane.material).uniforms.opacity.value = this._alpha;\n        }\n\n        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);\n    }\n\n    public clearNeedsRender(): void {\n        this._needsRender = false;\n    }\n\n    public dispose(): void {\n        this._imagePlaneScene.clear();\n    }\n\n    private _updateFrameId(frameId: number): void {\n        this._frameId = frameId;\n    }\n\n    private _updateAlpha(alpha: number): boolean {\n        if (alpha === this._alpha) {\n            return false;\n        }\n\n        this._alpha = alpha;\n\n        return true;\n    }\n\n    private _updateAlphaOld(alpha: number): boolean {\n        if (alpha < 1 || this._alphaOld === 0) {\n            return false;\n        }\n\n        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);\n\n        return true;\n    }\n\n    private _updateImagePlanes(state: ICurrentState): boolean {\n        if (state.currentNode == null || state.currentNode.key === this._currentKey) {\n            return false;\n        }\n\n        let previousKey: string = state.previousNode != null ? state.previousNode.key : null;\n        let currentKey: string = state.currentNode.key;\n\n        if (this._previousKey !== previousKey &&\n            this._previousKey !== currentKey &&\n            this._previousKey in this._providerDisposers) {\n\n            let disposeProvider: () => void = this._providerDisposers[this._previousKey];\n            disposeProvider();\n\n            delete this._providerDisposers[this._previousKey];\n        }\n\n        if (previousKey != null) {\n            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {\n                let previousMesh: THREE.Mesh =\n                    this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform);\n\n                this._imagePlaneScene.updateImagePlanes([previousMesh]);\n            }\n\n            this._previousKey = previousKey;\n        }\n\n        this._currentKey = currentKey;\n        let currentMesh: THREE.Mesh =\n            this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform);\n\n        this._imagePlaneScene.updateImagePlanes([currentMesh]);\n\n        this._alphaOld = 1;\n\n        return true;\n    }\n}\n\nexport default ImagePlaneGLRenderer;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {IShaderMaterial} from \"../../Component\";\n\nexport class ImagePlaneScene {\n    public scene: THREE.Scene;\n    public sceneOld: THREE.Scene;\n\n    public imagePlanes: THREE.Mesh[];\n    public imagePlanesOld: THREE.Mesh[];\n\n    constructor() {\n        this.scene = new THREE.Scene();\n        this.sceneOld = new THREE.Scene();\n\n        this.imagePlanes = [];\n        this.imagePlanesOld = [];\n    }\n\n    public updateImagePlanes(planes: THREE.Mesh[]): void {\n        this._dispose(this.imagePlanesOld, this.sceneOld);\n\n        for (let plane of this.imagePlanes) {\n            this.scene.remove(plane);\n            this.sceneOld.add(plane);\n        }\n\n        for (let plane of planes) {\n            this.scene.add(plane);\n        }\n\n        this.imagePlanesOld = this.imagePlanes;\n        this.imagePlanes = planes;\n    }\n\n    public addImagePlanes(planes: THREE.Mesh[]): void {\n        for (let plane of planes) {\n            this.scene.add(plane);\n            this.imagePlanes.push(plane);\n        }\n    }\n\n    public addImagePlanesOld(planes: THREE.Mesh[]): void {\n        for (let plane of planes) {\n            this.sceneOld.add(plane);\n            this.imagePlanesOld.push(plane);\n        }\n    }\n\n    public setImagePlanes(planes: THREE.Mesh[]): void {\n        this._clear();\n        this.addImagePlanes(planes);\n    }\n\n    public setImagePlanesOld(planes: THREE.Mesh[]): void {\n        this._clearOld();\n        this.addImagePlanesOld(planes);\n    }\n\n    public clear(): void {\n        this._clear();\n        this._clearOld();\n    }\n\n    private _clear(): void {\n        this._dispose(this.imagePlanes, this.scene);\n        this.imagePlanes.length = 0;\n    }\n\n    private _clearOld(): void {\n        this._dispose(this.imagePlanesOld, this.sceneOld);\n        this.imagePlanesOld.length = 0;\n    }\n\n    private _dispose(planes: THREE.Mesh[], scene: THREE.Scene): void {\n        for (let plane of planes) {\n            scene.remove(plane);\n            plane.geometry.dispose();\n            plane.material.dispose();\n            let texture: THREE.Texture = (<IShaderMaterial>plane.material).uniforms.projectorTex.value;\n            if (texture != null) {\n                texture.dispose();\n            }\n        }\n    }\n}\n\nexport default ImagePlaneScene;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport {IShader} from \"../../Component\";\n\nexport class ImagePlaneShaders {\n    public static equirectangular: IShader = {\n        fragment: fs.readFileSync(path.join(__dirname, \"./shaders/equirectangular.fragment.glsl\"), \"utf8\"),\n        vertex: fs.readFileSync(path.join(__dirname, \"./shaders/equirectangular.vertex.glsl\"), \"utf8\"),\n    };\n    public static perspective: IShader = {\n        fragment: fs.readFileSync(path.join(__dirname, \"./shaders/perspective.fragment.glsl\"), \"utf8\"),\n        vertex: fs.readFileSync(path.join(__dirname, \"./shaders/perspective.vertex.glsl\"), \"utf8\"),\n    };\n}\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/combineLatest\";\nimport \"rxjs/add/observable/fromEvent\";\nimport \"rxjs/add/observable/of\";\nimport \"rxjs/add/observable/zip\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\nimport \"rxjs/add/operator/zip\";\n\nimport {Node} from \"../../Graph\";\nimport {\n    ICurrentState,\n    IFrame,\n    State,\n} from \"../../State\";\nimport {\n    Container,\n    ImageSize,\n    Navigator,\n} from \"../../Viewer\";\nimport {\n    IGLRenderHash,\n    GLRenderStage,\n} from \"../../Render\";\nimport {\n    DOM,\n    Settings,\n} from \"../../Utils\";\nimport {\n    IBBoxShaderMaterial,\n    Component,\n    ComponentService,\n    ImagePlaneScene,\n    ImagePlaneFactory,\n    ISliderKeys,\n    ISliderConfiguration,\n    IShaderMaterial,\n} from \"../../Component\";\n\ninterface ISliderNodes {\n    background: Node;\n    foreground: Node;\n}\n\ninterface ISliderCombination {\n    nodes: ISliderNodes;\n    state: ICurrentState;\n}\n\ninterface ISliderStateOperation {\n    (sliderState: SliderState): SliderState;\n}\n\nclass SliderState {\n    private _imagePlaneFactory: ImagePlaneFactory;\n    private _imagePlaneScene: ImagePlaneScene;\n\n    private _currentKey: string;\n    private _previousKey: string;\n    private _currentPano: boolean;\n\n    private _frameId: number;\n\n    private _glNeedsRender: boolean;\n    private _domNeedsRender: boolean;\n    private _sliderVisible: boolean;\n\n    private _curtain: number;\n\n    constructor() {\n        this._imagePlaneFactory = new ImagePlaneFactory();\n        this._imagePlaneScene = new ImagePlaneScene();\n\n        this._currentKey = null;\n        this._previousKey = null;\n        this._currentPano = false;\n\n        this._frameId = 0;\n\n        this._glNeedsRender = false;\n        this._domNeedsRender = true;\n\n        this._curtain = 1;\n    }\n\n    public get frameId(): number {\n        return this._frameId;\n    }\n\n    public get curtain(): number {\n        return this._curtain;\n    }\n\n    public get glNeedsRender(): boolean {\n        return this._glNeedsRender;\n    }\n\n    public get domNeedsRender(): boolean {\n        return this._domNeedsRender;\n    }\n\n    public get sliderVisible(): boolean {\n        return this._sliderVisible;\n    }\n\n    public set sliderVisible(value: boolean) {\n        this._sliderVisible = value;\n        this._domNeedsRender = true;\n    }\n\n    public get disabled(): boolean {\n        return this._currentKey == null ||\n            this._previousKey == null ||\n            this._currentPano;\n    }\n\n    public update(frame: IFrame): void {\n        this._updateFrameId(frame.id);\n        let needsRender: boolean = this._updateImagePlanes(frame.state);\n\n        this._domNeedsRender = needsRender || this._domNeedsRender;\n\n        needsRender = this._updateCurtain(frame.state.alpha) || needsRender;\n        this._glNeedsRender = needsRender || this._glNeedsRender;\n    }\n\n    public updateTexture(image: HTMLImageElement, node: Node): void {\n        let imagePlanes: THREE.Mesh[] = node.key === this._currentKey ?\n            this._imagePlaneScene.imagePlanes :\n            node.key === this._previousKey ?\n                this._imagePlaneScene.imagePlanesOld :\n                [];\n\n        if (imagePlanes.length === 0) {\n            return;\n        }\n\n        this._glNeedsRender = true;\n\n        for (let plane of imagePlanes) {\n            let material: IShaderMaterial = <IShaderMaterial>plane.material;\n            let texture: THREE.Texture = <THREE.Texture>material.uniforms.projectorTex.value;\n\n            texture.image = image;\n            texture.needsUpdate = true;\n        }\n    }\n\n    public render(\n        perspectiveCamera: THREE.PerspectiveCamera,\n        renderer: THREE.WebGLRenderer): void {\n\n        if (!this.disabled) {\n            renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);\n        }\n\n        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);\n    }\n\n    public dispose(): void {\n        this._imagePlaneScene.clear();\n    }\n\n    public clearGLNeedsRender(): void {\n        this._glNeedsRender = false;\n    }\n\n    public clearDomNeedsRender(): void {\n        this._domNeedsRender = false;\n    }\n\n    private _updateFrameId(frameId: number): void {\n        this._frameId = frameId;\n    }\n\n    private _updateImagePlanes(state: ICurrentState): boolean {\n        if (state.currentNode == null) {\n            return;\n        }\n\n        let needsRender: boolean = false;\n\n        if (state.previousNode != null && this._previousKey !== state.previousNode.key) {\n            needsRender = true;\n\n            this._previousKey = state.previousNode.key;\n            this._imagePlaneScene.setImagePlanesOld([\n                this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform),\n            ]);\n        }\n\n        if (this._currentKey !== state.currentNode.key) {\n            needsRender = true;\n\n            this._currentKey = state.currentNode.key;\n            this._currentPano = state.currentNode.pano;\n            this._imagePlaneScene.setImagePlanes([\n                this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform),\n            ]);\n\n            if (!this.disabled) {\n                this._updateBbox();\n            }\n        }\n\n        return needsRender;\n    }\n\n    private _updateCurtain(alpha: number): boolean {\n        if (this.disabled ||\n            Math.abs(this._curtain - alpha) < 0.001) {\n            return false;\n        }\n\n        this._curtain = alpha;\n        this._updateBbox();\n\n        return true;\n    }\n\n    private _updateBbox(): void {\n        for (let plane of this._imagePlaneScene.imagePlanes) {\n            let shaderMaterial: IBBoxShaderMaterial = <IBBoxShaderMaterial>plane.material;\n            let bbox: THREE.Vector4 = <THREE.Vector4>shaderMaterial.uniforms.bbox.value;\n\n            bbox.z = this._curtain;\n        }\n    }\n}\n\nexport class SliderComponent extends Component<ISliderConfiguration> {\n    public static componentName: string = \"slider\";\n\n    private _dom: DOM;\n\n    private _sliderContainer: HTMLDivElement;\n    private _sliderWrapper: HTMLDivElement;\n    private _sliderControl: HTMLInputElement;\n\n    private _moveToHandler: (event: Event) => void;\n\n    private _sliderStateOperation$: Subject<ISliderStateOperation>;\n    private _sliderState$: Observable<SliderState>;\n    private _sliderStateCreator$: Subject<void>;\n    private _sliderStateDisposer$: Subject<void>;\n\n    private _setKeysSubscription: Subscription;\n    private _setSliderVisibleSubscription: Subscription;\n\n    private _stateSubscription: Subscription;\n    private _glRenderSubscription: Subscription;\n    private _domRenderSubscription: Subscription;\n    private _nodeSubscription: Subscription;\n\n    /**\n     * Create a new slider component instance.\n     * @class SliderComponent\n     */\n    constructor (name: string, container: Container, navigator: Navigator, dom?: DOM) {\n        super(name, container, navigator);\n\n        this._dom = !!dom ? dom : new DOM();\n\n        this._sliderStateOperation$ = new Subject<ISliderStateOperation>();\n        this._sliderStateCreator$ = new Subject<void>();\n        this._sliderStateDisposer$ = new Subject<void>();\n\n        this._sliderState$ = this._sliderStateOperation$\n            .scan(\n                (sliderState: SliderState, operation: ISliderStateOperation): SliderState => {\n                    return operation(sliderState);\n                },\n                null)\n            .filter(\n                (sliderState: SliderState): boolean => {\n                    return sliderState != null;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (sliderState: SliderState): number => {\n                    return sliderState.frameId;\n                });\n\n        this._sliderStateCreator$\n            .map(\n                (): ISliderStateOperation => {\n                    return (sliderState: SliderState): SliderState => {\n                        if (sliderState != null) {\n                            throw new Error(\"Multiple slider states can not be created at the same time\");\n                        }\n\n                        return new SliderState();\n                    };\n                })\n            .subscribe(this._sliderStateOperation$);\n\n        this._sliderStateDisposer$\n            .map(\n                (): ISliderStateOperation => {\n                    return (sliderState: SliderState): SliderState => {\n                        sliderState.dispose();\n\n                        return null;\n                    };\n                })\n            .subscribe(this._sliderStateOperation$);\n    }\n\n    /**\n     * Set the image keys.\n     *\n     * Configures the component to show the image planes for the supplied image keys.\n     *\n     * @param {keys} ISliderKeys - Slider keys object specifying the images to be shown in the foreground and the background.\n     */\n    public setKeys(keys: ISliderKeys): void {\n        this.configure({ keys: keys });\n    }\n\n    /**\n     * Set the initial position.\n     *\n     * Configures the intial position of the slider. The inital position value will be used when the component is activated.\n     *\n     * @param {number} initialPosition - Initial slider position.\n     */\n    public setInitialPosition(initialPosition: number): void {\n        this.configure({ initialPosition: initialPosition });\n    }\n\n    /**\n     * Set the value controlling if the slider is visible.\n     *\n     * @param {boolean} sliderVisible - Value indicating if the slider should be visible or not.\n     */\n    public setSliderVisible(sliderVisible: boolean): void {\n        this.configure({ sliderVisible: sliderVisible });\n    }\n\n    protected _activate(): void {\n        this._sliderContainer = this._dom.createElement(\"div\", \"mapillary-js-slider-container\", this._container.element);\n        this._sliderWrapper = this._dom.createElement(\"div\", \"SliderWrapper\", this._sliderContainer);\n        this._sliderControl = this._dom.createElement(\"input\", \"SliderControl\", this._sliderWrapper);\n        this._sliderControl.setAttribute(\"type\", \"range\");\n        this._sliderControl.setAttribute(\"min\", \"0\");\n        this._sliderControl.setAttribute(\"max\", \"1000\");\n        this._sliderControl.style.visibility = \"hidden\";\n\n        this._moveToHandler = (e: Event): void => {\n            const curtain: number = Number((<HTMLInputElement>e.target).value) / 1000;\n            this._navigator.stateService.moveTo(curtain);\n        };\n\n        this._sliderControl.addEventListener(\"input\", this._moveToHandler);\n        this._sliderControl.addEventListener(\"change\", this._moveToHandler);\n\n        Observable\n            .combineLatest<State, ISliderConfiguration>(\n                this._navigator.stateService.state$,\n                this._configuration$)\n            .first()\n            .subscribe(\n                ([state, configuration]: [State, ISliderConfiguration]): void => {\n                    if (state === State.Traversing) {\n                        this._navigator.stateService.wait();\n\n                        let position: number = configuration.initialPosition != null ? configuration.initialPosition : 1;\n\n                        this._sliderControl.value = (1000 * position).toString();\n                        this._navigator.stateService.moveTo(position);\n                    }\n                });\n\n        this._glRenderSubscription = this._sliderState$\n            .map(\n                (sliderState: SliderState): IGLRenderHash => {\n                    let renderHash: IGLRenderHash = {\n                        name: this._name,\n                        render: {\n                            frameId: sliderState.frameId,\n                            needsRender: sliderState.glNeedsRender,\n                            render: sliderState.render.bind(sliderState),\n                            stage: GLRenderStage.Background,\n                        },\n                    };\n\n                    sliderState.clearGLNeedsRender();\n\n                    return renderHash;\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        this._domRenderSubscription = this._sliderState$\n            .filter(\n                (sliderState: SliderState): boolean => {\n                    return sliderState.domNeedsRender;\n                })\n            .subscribe(\n                (sliderState: SliderState): void => {\n                    this._sliderControl.value = (1000 * sliderState.curtain).toString();\n\n                    const visibility: string = sliderState.disabled || !sliderState.sliderVisible ? \"hidden\" : \"visible\";\n                    this._sliderControl.style.visibility = visibility;\n\n                    sliderState.clearDomNeedsRender();\n                });\n\n        this._sliderStateCreator$.next(null);\n\n        this._stateSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): ISliderStateOperation => {\n                    return (sliderState: SliderState): SliderState => {\n                        sliderState.update(frame);\n\n                        return sliderState;\n                    };\n                })\n            .subscribe(this._sliderStateOperation$);\n\n        this._setSliderVisibleSubscription = this._configuration$\n            .map(\n                (configuration: ISliderConfiguration): boolean => {\n                    return configuration.sliderVisible == null || configuration.sliderVisible;\n                })\n            .distinctUntilChanged()\n            .map(\n                (sliderVisible: boolean): ISliderStateOperation => {\n                    return (sliderState: SliderState): SliderState => {\n                        sliderState.sliderVisible = sliderVisible;\n\n                        return sliderState;\n                    };\n                })\n            .subscribe(this._sliderStateOperation$);\n\n        this._setKeysSubscription = this._configuration$\n            .filter(\n                (configuration: ISliderConfiguration): boolean => {\n                    return configuration.keys != null;\n                })\n            .switchMap(\n                (configuration: ISliderConfiguration): Observable<ISliderCombination> => {\n                    return Observable\n                        .zip(\n                            this._catchCacheNode$(configuration.keys.background),\n                            this._catchCacheNode$(configuration.keys.foreground))\n                        .map(\n                            (nodes: [Node, Node]): ISliderNodes => {\n                                return { background: nodes[0], foreground: nodes[1] };\n                            })\n                        .zip(this._navigator.stateService.currentState$.first())\n                        .map(\n                            (nf: [ISliderNodes, IFrame]): ISliderCombination => {\n                                return { nodes: nf[0], state: nf[1].state };\n                            });\n                })\n            .subscribe(\n                (co: ISliderCombination): void => {\n                    if (co.state.currentNode != null &&\n                        co.state.previousNode != null &&\n                        co.state.currentNode.key === co.nodes.foreground.key &&\n                        co.state.previousNode.key === co.nodes.background.key) {\n                        return;\n                    }\n\n                    if (co.state.currentNode.key === co.nodes.background.key) {\n                        this._navigator.stateService.setNodes([co.nodes.foreground]);\n                        return;\n                    }\n\n                    if (co.state.currentNode.key === co.nodes.foreground.key &&\n                        co.state.trajectory.length === 1) {\n                        this._navigator.stateService.prependNodes([co.nodes.background]);\n                        return;\n                    }\n\n                    this._navigator.stateService.setNodes([co.nodes.background]);\n                    this._navigator.stateService.setNodes([co.nodes.foreground]);\n                },\n                (e: Error): void => {\n                    console.error(e);\n                });\n\n        let previousNode$: Observable<Node> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): Node => {\n                    return frame.state.previousNode;\n                })\n            .filter(\n                (node: Node): boolean => {\n                    return node != null;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (node: Node): string => {\n                    return node.key;\n                });\n\n        this._nodeSubscription = Observable\n            .merge(\n                previousNode$,\n                this._navigator.stateService.currentNode$)\n            .filter(\n                (node: Node): boolean => {\n                    return node.pano ?\n                        Settings.maxImageSize > Settings.basePanoramaSize :\n                        Settings.maxImageSize > Settings.baseImageSize;\n                })\n            .mergeMap(\n                (node: Node): Observable<[HTMLImageElement, Node]> => {\n                    let baseImageSize: ImageSize = node.pano ?\n                        Settings.basePanoramaSize :\n                        Settings.baseImageSize;\n\n                    if (Math.max(node.image.width, node.image.height) > baseImageSize) {\n                        return Observable.empty<[HTMLImageElement, Node]>();\n                    }\n\n                    return node.cacheImage$(Settings.maxImageSize)\n                            .map(\n                                (n: Node): [HTMLImageElement, Node] => {\n                                    return [n.image, n];\n                                })\n                            .catch(\n                                (error: Error, caught: Observable<[HTMLImageElement, Node]>):\n                                    Observable<[HTMLImageElement, Node]> => {\n                                    console.error(`Failed to fetch high res slider image (${node.key})`, error);\n\n                                    return Observable.empty<[HTMLImageElement, Node]>();\n                                });\n                })\n            .map(\n                ([element, node]: [HTMLImageElement, Node]): ISliderStateOperation => {\n                    return (sliderState: SliderState): SliderState => {\n                        sliderState.updateTexture(element, node);\n\n                        return sliderState;\n                    };\n                })\n            .subscribe(this._sliderStateOperation$);\n    }\n\n    protected _deactivate(): void {\n        this._navigator.stateService.state$\n            .first()\n            .subscribe(\n                (state: State): void => {\n                    if (state === State.Waiting) {\n                        this._navigator.stateService.traverse();\n                    }\n                });\n\n        this._sliderStateDisposer$.next(null);\n\n        this._setKeysSubscription.unsubscribe();\n        this._setSliderVisibleSubscription.unsubscribe();\n        this._stateSubscription.unsubscribe();\n        this._glRenderSubscription.unsubscribe();\n        this._domRenderSubscription.unsubscribe();\n        this._nodeSubscription.unsubscribe();\n\n        this.configure({ keys: null });\n\n        this._sliderControl.removeEventListener(\"input\", this._moveToHandler);\n        this._sliderControl.removeEventListener(\"change\", this._moveToHandler);\n\n        this._container.element.removeChild(this._sliderContainer);\n\n        this._moveToHandler = null;\n        this._sliderControl = null;\n        this._sliderWrapper = null;\n        this._sliderContainer = null;\n    }\n\n    protected _getDefaultConfiguration(): ISliderConfiguration {\n        return {};\n    }\n\n    private _catchCacheNode$(key: string): Observable<Node> {\n        return this._navigator.graphService.cacheNode$(key)\n            .catch(\n                (error: Error, caught: Observable<Node>): Observable<Node> => {\n                    console.error(`Failed to cache slider node (${key})`, error);\n\n                    return Observable.empty<Node>();\n                });\n    }\n}\n\nComponentService.register(SliderComponent);\nexport default SliderComponent;\n",
     "import {IComponentConfiguration} from \"../../Component\";\n\nexport enum CoverState {\n    Hidden,\n    Loading,\n    Visible,\n}\n\nexport interface ICoverConfiguration extends IComponentConfiguration {\n    key?: string;\n    src?: string;\n    state?: CoverState;\n}\n\nexport default ICoverConfiguration;\n",
     "export {ICacheConfiguration, ICacheDepth} from \"./ICacheConfiguration\";\nexport {CoverState, ICoverConfiguration} from \"./ICoverConfiguration\";\nexport {IDirectionConfiguration} from \"./IDirectionConfiguration\";\nexport {IImagePlaneConfiguration} from \"./IImagePlaneConfiguration\";\nexport {IKeyboardConfiguration} from \"./IKeyboardConfiguration\";\nexport {IMarkerConfiguration} from \"./IMarkerConfiguration\";\nexport {IMouseConfiguration} from \"./IMouseConfiguration\";\nexport {INavigationConfiguration} from \"./INavigationConfiguration\";\nexport {IRouteConfiguration, IRoutePath, IRouteInfoKey} from \"./IRouteConfiguration\";\nexport {ISliderConfiguration, ISliderKeys} from \"./ISliderConfiguration\";\nexport {IComponentConfiguration} from \"./IComponentConfiguration\";\nexport {ISequenceConfiguration} from \"./ISequenceConfiguration\";\nexport {ITagConfiguration} from \"./ITagConfiguration\";\nexport {IShader} from \"./IShader\";\nexport * from \"../imageplane/interfaces/interfaces\";\nexport * from \"../marker/interfaces/interfaces\";\nexport * from \"../tag/interfaces/interfaces\";\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\n\n/**\n * The `KeySequenceNavigationHandler` allows the user navigate through a sequence using the\n * following key commands:\n *\n * `ALT` + `Up Arrow`: Navigate to next image in the sequence.\n * `ALT` + `Down Arrow`: Navigate to previous image in sequence.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keySequenceNavigation.disable();\n * keyboardComponent.keySequenceNavigation.enable();\n *\n * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;\n * ```\n */\nexport class KeySequenceNavigationHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _keyDownSubscription: Subscription;\n\n    protected _enable(): void {\n        const sequenceEdges$: Observable<IEdgeStatus> = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.sequenceEdges$;\n                });\n\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(sequenceEdges$)\n            .subscribe(\n                ([event, edgeStatus]: [KeyboardEvent, IEdgeStatus]): void => {\n                    let direction: EdgeDirection = null;\n                    switch (event.keyCode) {\n                        case 38: // up\n                            direction = EdgeDirection.Next;\n                            break;\n                        case 40: // down\n                            direction = EdgeDirection.Prev;\n                            break;\n                        default:\n                            return;\n                    }\n\n                    event.preventDefault();\n\n                    if (!event.altKey || event.shiftKey || !edgeStatus.cached) {\n                        return;\n                    }\n\n                    for (const edge of edgeStatus.edges) {\n                        if (edge.data.direction === direction) {\n                            this._navigator.moveToKey$(edge.to)\n                                .subscribe(\n                                    (n: Node): void => { return; },\n                                    (e: Error): void => { console.error(e); });\n\n                            return;\n                        }\n                    }\n                });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keySequenceNavigation: enable };\n    }\n}\n\nexport default KeySequenceNavigationHandler;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    EdgeDirection,\n    IEdge,\n} from \"../../Edge\";\nimport {\n    Camera,\n    Spatial,\n} from \"../../Geo\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\nimport {\n    IFrame,\n    IRotation,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `KeySpatialNavigationHandler` allows the user navigate through a sequence using the\n * following key commands:\n *\n * `Up Arrow`: Step forward.\n * `Down Arrow`: Step backward.\n * `Left Arrow`: Step to the left.\n * `Rigth Arrow`: Step to the right.\n * `SHIFT` + `Down Arrow`: Turn around.\n * `SHIFT` + `Left Arrow`: Turn to the left.\n * `SHIFT` + `Rigth Arrow`: Turn to the right.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keySpatialNavigation.disable();\n * keyboardComponent.keySpatialNavigation.enable();\n *\n * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;\n * ```\n */\nexport class KeySpatialNavigationHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _spatial: Spatial;\n\n    private _keyDownSubscription: Subscription;\n\n    constructor(\n        component: Component<IKeyboardConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        spatial: Spatial) {\n        super(component, container, navigator);\n\n        this._spatial = spatial;\n    }\n\n    protected _enable(): void {\n        const spatialEdges$: Observable<IEdgeStatus> = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.spatialEdges$;\n                });\n\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(\n                spatialEdges$,\n                this._navigator.stateService.currentState$)\n            .subscribe(([event, edgeStatus, frame]: [KeyboardEvent, IEdgeStatus, IFrame]): void => {\n                let pano: boolean = frame.state.currentNode.pano;\n                let direction: EdgeDirection = null;\n                switch (event.keyCode) {\n                    case 37: // left\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnLeft : EdgeDirection.StepLeft;\n                        break;\n                    case 38: // up\n                        direction = event.shiftKey && !pano ? EdgeDirection.Pano : EdgeDirection.StepForward;\n                        break;\n                    case 39: // right\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnRight : EdgeDirection.StepRight;\n                        break;\n                    case 40: // down\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnU : EdgeDirection.StepBackward;\n                        break;\n                    default:\n                        return;\n                }\n\n                event.preventDefault();\n\n                if (event.altKey || !edgeStatus.cached ||\n                    (event.shiftKey && pano)) {\n                    return;\n                }\n\n                if (!pano) {\n                    this._moveDir(direction, edgeStatus);\n                } else {\n                    const shifts: { [dir: number]: number } = {};\n\n                    shifts[EdgeDirection.StepBackward] = Math.PI;\n                    shifts[EdgeDirection.StepForward] = 0;\n                    shifts[EdgeDirection.StepLeft] = Math.PI / 2;\n                    shifts[EdgeDirection.StepRight] = -Math.PI / 2;\n\n                    const phi: number = this._rotationFromCamera(frame.state.camera).phi;\n                    const navigationAngle: number = this._spatial.wrapAngle(phi + shifts[direction]);\n                    const threshold: number = Math.PI / 4;\n                    const edges: IEdge[] = edgeStatus.edges.filter(\n                        (e: IEdge): boolean => {\n                            return e.data.direction === EdgeDirection.Pano || e.data.direction === direction;\n                        });\n\n                    let smallestAngle: number = Number.MAX_VALUE;\n                    let toKey: string = null;\n                    for (const edge of edges) {\n                        const angle: number = Math.abs(this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));\n\n                        if (angle < Math.min(smallestAngle, threshold)) {\n                            smallestAngle = angle;\n                            toKey = edge.to;\n                        }\n                    }\n\n                    if (toKey == null) {\n                        return;\n                    }\n\n                    this._moveToKey(toKey);\n                }\n            });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keySpatialNavigation: enable };\n    }\n\n    private _moveDir(direction: EdgeDirection, edgeStatus: IEdgeStatus): void {\n        for (const edge of edgeStatus.edges) {\n            if (edge.data.direction === direction) {\n                this._moveToKey(edge.to);\n                return;\n            }\n        }\n    }\n\n    private _moveToKey(key: string): void {\n        this._navigator.moveToKey$(key)\n            .subscribe(\n                (n: Node): void => { /* noop */ },\n                (e: Error): void => { console.error(e); });\n    }\n\n    private _rotationFromCamera(camera: Camera): IRotation {\n        let direction: THREE.Vector3 = camera.lookat.clone().sub(camera.position);\n\n        let upProjection: number = direction.clone().dot(camera.up);\n        let planeProjection: THREE.Vector3 = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));\n\n        let phi: number = Math.atan2(planeProjection.y, planeProjection.x);\n        let theta: number = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);\n\n        return { phi: phi, theta: theta };\n    }\n}\n\nexport default KeySpatialNavigationHandler;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `KeyZoomHandler` allows the user zoom in and out using the\n * following key commands:\n *\n * `+`: Zoom in.\n * `-`: Zoom out.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keyZoom.disable();\n * keyboardComponent.keyZoom.enable();\n *\n * var isEnabled = keyboardComponent.keyZoom.isEnabled;\n * ```\n */\nexport class KeyZoomHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _keyDownSubscription: Subscription;\n\n    private _viewportCoords: ViewportCoords;\n\n    constructor(\n        component: Component<IKeyboardConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([event, render, transform]: [KeyboardEvent, RenderCamera, Transform]): void => {\n                    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n                        return;\n                    }\n\n                    let delta: number = 0;\n                    switch (event.key) {\n                        case \"+\":\n                            delta = 1;\n                            break;\n                        case \"-\":\n                            delta = -1;\n                            break;\n                        default:\n                            return;\n                    }\n\n                    event.preventDefault();\n\n                    const unprojected: THREE.Vector3 = this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);\n                    const reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    this._navigator.stateService.zoomIn(delta, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keyZoom: enable };\n    }\n}\n\nexport default KeyZoomHandler;\n",
-    "import {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ComponentService,\n    Component,\n    IKeyboardConfiguration,\n    KeyZoomHandler,\n    KeySequenceNavigationHandler,\n    KeySpatialNavigationHandler,\n} from \"../../Component\";\nimport {\n    Spatial,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class KeyboardComponent\n *\n * @classdesc Component for keyboard event handling.\n *\n * To retrive and use the keyboard component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\");\n *\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n * ```\n */\nexport class KeyboardComponent extends Component<IKeyboardConfiguration> {\n    public static componentName: string = \"keyboard\";\n\n    private _keyZoomHandler: KeyZoomHandler;\n    private _keySequenceNavigationHandler: KeySequenceNavigationHandler;\n    private _keySpatialNavigationHandler: KeySpatialNavigationHandler;\n\n    private _configurationSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._keyZoomHandler = new KeyZoomHandler(this, container, navigator, new ViewportCoords());\n        this._keySequenceNavigationHandler = new KeySequenceNavigationHandler(this, container, navigator);\n        this._keySpatialNavigationHandler = new KeySpatialNavigationHandler(this, container, navigator, new Spatial());\n    }\n\n    /**\n     * Get key zoom.\n     *\n     * @returns {KeyZoomHandler} The key zoom handler.\n     */\n    public get keyZoom(): KeyZoomHandler {\n        return this._keyZoomHandler;\n    }\n\n    /**\n     * Get key sequence navigation.\n     *\n     * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.\n     */\n    public get keySequenceNavigation(): KeySequenceNavigationHandler {\n        return this._keySequenceNavigationHandler;\n    }\n\n    /**\n     * Get spatial.\n     *\n     * @returns {KeySpatialNavigationHandler} The spatial handler.\n     */\n    public get keySpatialNavigation(): KeySpatialNavigationHandler {\n        return this._keySpatialNavigationHandler;\n    }\n\n    protected _activate(): void {\n        this._configurationSubscription = this._configuration$\n            .subscribe(\n                (configuration: IKeyboardConfiguration): void => {\n                    if (configuration.keyZoom) {\n                        this._keyZoomHandler.enable();\n                    } else {\n                        this._keyZoomHandler.disable();\n                    }\n\n                    if (configuration.keySequenceNavigation) {\n                        this._keySequenceNavigationHandler.enable();\n                    } else {\n                        this._keySequenceNavigationHandler.disable();\n                    }\n\n                    if (configuration.keySpatialNavigation) {\n                        this._keySpatialNavigationHandler.enable();\n                    } else {\n                        this._keySpatialNavigationHandler.disable();\n                    }\n                });\n    }\n\n    protected _deactivate(): void {\n        this._configurationSubscription.unsubscribe();\n    }\n\n    protected _getDefaultConfiguration(): IKeyboardConfiguration {\n        return { keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };\n    }\n}\n\nComponentService.register(KeyboardComponent);\nexport default KeyboardComponent;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\n\n/**\n * The `KeyPlayHandler` allows the user to control the play behavior\n * using the following key commands:\n *\n * `Spacebar`: Start or stop playing.\n * `SHIFT` + `D`: Switch direction.\n * `<`: Decrease speed.\n * `>`: Increase speed.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keyPlay.disable();\n * keyboardComponent.keyPlay.enable();\n *\n * var isEnabled = keyboardComponent.keyPlay.isEnabled;\n * ```\n */\nexport class KeyPlayHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _keyDownSubscription: Subscription;\n\n    protected _enable(): void {\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(\n                this._navigator.playService.playing$,\n                this._navigator.playService.direction$,\n                this._navigator.playService.speed$,\n                this._navigator.stateService.currentNode$\n                    .switchMap(\n                        (node: Node): Observable<IEdgeStatus> => {\n                            return node.sequenceEdges$;\n                        }))\n            .subscribe(\n                (\n                    [event, playing, direction, speed, status]:\n                    [KeyboardEvent, boolean, EdgeDirection, number, IEdgeStatus]): void => {\n\n                    if (event.altKey || event.ctrlKey || event.metaKey) {\n                        return;\n                    }\n\n                    switch (event.key) {\n                        case \"D\":\n                            if (!event.shiftKey) {\n                                return;\n                            }\n\n                            const newDirection: EdgeDirection = playing ?\n                                null : direction === EdgeDirection.Next ?\n                                EdgeDirection.Prev : direction === EdgeDirection.Prev ?\n                                EdgeDirection.Next : null;\n\n                            if (newDirection != null) {\n                                this._navigator.playService.setDirection(newDirection);\n                            }\n\n                            break;\n                        case \" \":\n                            if (event.shiftKey) {\n                                return;\n                            }\n\n                            if (playing) {\n                                this._navigator.playService.stop();\n                            } else {\n                                for (let edge of status.edges) {\n                                    if (edge.data.direction === direction) {\n                                        this._navigator.playService.play();\n                                    }\n                                }\n                            }\n\n                            break;\n                        case \"<\":\n                            this._navigator.playService.setSpeed(speed - 0.05);\n                            break;\n                        case \">\":\n                            this._navigator.playService.setSpeed(speed + 0.05);\n                            break;\n                        default:\n                            return;\n                    }\n\n                    event.preventDefault();\n                });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keyZoom: enable };\n    }\n}\n\nexport default KeyPlayHandler;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\n\n/**\n * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the\n * following key commands:\n *\n * `ALT` + `Up Arrow`: Navigate to next image in the sequence.\n * `ALT` + `Down Arrow`: Navigate to previous image in sequence.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keySequenceNavigation.disable();\n * keyboardComponent.keySequenceNavigation.enable();\n *\n * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;\n * ```\n */\nexport class KeySequenceNavigationHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _keyDownSubscription: Subscription;\n\n    protected _enable(): void {\n        const sequenceEdges$: Observable<IEdgeStatus> = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.sequenceEdges$;\n                });\n\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(sequenceEdges$)\n            .subscribe(\n                ([event, edgeStatus]: [KeyboardEvent, IEdgeStatus]): void => {\n                    let direction: EdgeDirection = null;\n                    switch (event.keyCode) {\n                        case 38: // up\n                            direction = EdgeDirection.Next;\n                            break;\n                        case 40: // down\n                            direction = EdgeDirection.Prev;\n                            break;\n                        default:\n                            return;\n                    }\n\n                    event.preventDefault();\n\n                    if (!event.altKey || event.shiftKey || !edgeStatus.cached) {\n                        return;\n                    }\n\n                    for (const edge of edgeStatus.edges) {\n                        if (edge.data.direction === direction) {\n                            this._navigator.moveToKey$(edge.to)\n                                .subscribe(\n                                    (n: Node): void => { return; },\n                                    (e: Error): void => { console.error(e); });\n\n                            return;\n                        }\n                    }\n                });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keySequenceNavigation: enable };\n    }\n}\n\nexport default KeySequenceNavigationHandler;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    EdgeDirection,\n    IEdge,\n} from \"../../Edge\";\nimport {\n    Camera,\n    Spatial,\n} from \"../../Geo\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\nimport {\n    IFrame,\n    IRotation,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the\n * following key commands:\n *\n * `Up Arrow`: Step forward.\n * `Down Arrow`: Step backward.\n * `Left Arrow`: Step to the left.\n * `Rigth Arrow`: Step to the right.\n * `SHIFT` + `Down Arrow`: Turn around.\n * `SHIFT` + `Left Arrow`: Turn to the left.\n * `SHIFT` + `Rigth Arrow`: Turn to the right.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keySpatialNavigation.disable();\n * keyboardComponent.keySpatialNavigation.enable();\n *\n * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;\n * ```\n */\nexport class KeySpatialNavigationHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _spatial: Spatial;\n\n    private _keyDownSubscription: Subscription;\n\n    constructor(\n        component: Component<IKeyboardConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        spatial: Spatial) {\n        super(component, container, navigator);\n\n        this._spatial = spatial;\n    }\n\n    protected _enable(): void {\n        const spatialEdges$: Observable<IEdgeStatus> = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.spatialEdges$;\n                });\n\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(\n                spatialEdges$,\n                this._navigator.stateService.currentState$)\n            .subscribe(([event, edgeStatus, frame]: [KeyboardEvent, IEdgeStatus, IFrame]): void => {\n                let pano: boolean = frame.state.currentNode.pano;\n                let direction: EdgeDirection = null;\n                switch (event.keyCode) {\n                    case 37: // left\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnLeft : EdgeDirection.StepLeft;\n                        break;\n                    case 38: // up\n                        direction = event.shiftKey && !pano ? EdgeDirection.Pano : EdgeDirection.StepForward;\n                        break;\n                    case 39: // right\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnRight : EdgeDirection.StepRight;\n                        break;\n                    case 40: // down\n                        direction = event.shiftKey && !pano ? EdgeDirection.TurnU : EdgeDirection.StepBackward;\n                        break;\n                    default:\n                        return;\n                }\n\n                event.preventDefault();\n\n                if (event.altKey || !edgeStatus.cached ||\n                    (event.shiftKey && pano)) {\n                    return;\n                }\n\n                if (!pano) {\n                    this._moveDir(direction, edgeStatus);\n                } else {\n                    const shifts: { [dir: number]: number } = {};\n\n                    shifts[EdgeDirection.StepBackward] = Math.PI;\n                    shifts[EdgeDirection.StepForward] = 0;\n                    shifts[EdgeDirection.StepLeft] = Math.PI / 2;\n                    shifts[EdgeDirection.StepRight] = -Math.PI / 2;\n\n                    const phi: number = this._rotationFromCamera(frame.state.camera).phi;\n                    const navigationAngle: number = this._spatial.wrapAngle(phi + shifts[direction]);\n                    const threshold: number = Math.PI / 4;\n                    const edges: IEdge[] = edgeStatus.edges.filter(\n                        (e: IEdge): boolean => {\n                            return e.data.direction === EdgeDirection.Pano || e.data.direction === direction;\n                        });\n\n                    let smallestAngle: number = Number.MAX_VALUE;\n                    let toKey: string = null;\n                    for (const edge of edges) {\n                        const angle: number = Math.abs(this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));\n\n                        if (angle < Math.min(smallestAngle, threshold)) {\n                            smallestAngle = angle;\n                            toKey = edge.to;\n                        }\n                    }\n\n                    if (toKey == null) {\n                        return;\n                    }\n\n                    this._moveToKey(toKey);\n                }\n            });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keySpatialNavigation: enable };\n    }\n\n    private _moveDir(direction: EdgeDirection, edgeStatus: IEdgeStatus): void {\n        for (const edge of edgeStatus.edges) {\n            if (edge.data.direction === direction) {\n                this._moveToKey(edge.to);\n                return;\n            }\n        }\n    }\n\n    private _moveToKey(key: string): void {\n        this._navigator.moveToKey$(key)\n            .subscribe(\n                (n: Node): void => { /* noop */ },\n                (e: Error): void => { console.error(e); });\n    }\n\n    private _rotationFromCamera(camera: Camera): IRotation {\n        let direction: THREE.Vector3 = camera.lookat.clone().sub(camera.position);\n\n        let upProjection: number = direction.clone().dot(camera.up);\n        let planeProjection: THREE.Vector3 = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));\n\n        let phi: number = Math.atan2(planeProjection.y, planeProjection.x);\n        let theta: number = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);\n\n        return { phi: phi, theta: theta };\n    }\n}\n\nexport default KeySpatialNavigationHandler;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IKeyboardConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `KeyZoomHandler` allows the user to zoom in and out using the\n * following key commands:\n *\n * `+`: Zoom in.\n * `-`: Zoom out.\n *\n * @example\n * ```\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n *\n * keyboardComponent.keyZoom.disable();\n * keyboardComponent.keyZoom.enable();\n *\n * var isEnabled = keyboardComponent.keyZoom.isEnabled;\n * ```\n */\nexport class KeyZoomHandler extends HandlerBase<IKeyboardConfiguration> {\n    private _keyDownSubscription: Subscription;\n\n    private _viewportCoords: ViewportCoords;\n\n    constructor(\n        component: Component<IKeyboardConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._keyDownSubscription = this._container.keyboardService.keyDown$\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([event, render, transform]: [KeyboardEvent, RenderCamera, Transform]): void => {\n                    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n                        return;\n                    }\n\n                    let delta: number = 0;\n                    switch (event.key) {\n                        case \"+\":\n                            delta = 1;\n                            break;\n                        case \"-\":\n                            delta = -1;\n                            break;\n                        default:\n                            return;\n                    }\n\n                    event.preventDefault();\n\n                    const unprojected: THREE.Vector3 = this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);\n                    const reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    this._navigator.stateService.zoomIn(delta, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._keyDownSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IKeyboardConfiguration {\n        return { keyZoom: enable };\n    }\n}\n\nexport default KeyZoomHandler;\n",
+    "import {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ComponentService,\n    Component,\n    IKeyboardConfiguration,\n    KeyPlayHandler,\n    KeySequenceNavigationHandler,\n    KeySpatialNavigationHandler,\n    KeyZoomHandler,\n} from \"../../Component\";\nimport {\n    Spatial,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class KeyboardComponent\n *\n * @classdesc Component for keyboard event handling.\n *\n * To retrive and use the keyboard component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\");\n *\n * var keyboardComponent = viewer.getComponent(\"keyboard\");\n * ```\n */\nexport class KeyboardComponent extends Component<IKeyboardConfiguration> {\n    public static componentName: string = \"keyboard\";\n\n    private _keyPlayHandler: KeyPlayHandler;\n    private _keySequenceNavigationHandler: KeySequenceNavigationHandler;\n    private _keySpatialNavigationHandler: KeySpatialNavigationHandler;\n    private _keyZoomHandler: KeyZoomHandler;\n\n    private _configurationSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._keyPlayHandler = new KeyPlayHandler(this, container, navigator);\n        this._keySequenceNavigationHandler = new KeySequenceNavigationHandler(this, container, navigator);\n        this._keySpatialNavigationHandler = new KeySpatialNavigationHandler(this, container, navigator, new Spatial());\n        this._keyZoomHandler = new KeyZoomHandler(this, container, navigator, new ViewportCoords());\n    }\n\n    /**\n     * Get key play.\n     *\n     * @returns {KeyPlayHandler} The key play handler.\n     */\n    public get keyPlay(): KeyPlayHandler {\n        return this._keyPlayHandler;\n    }\n\n    /**\n     * Get key sequence navigation.\n     *\n     * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.\n     */\n    public get keySequenceNavigation(): KeySequenceNavigationHandler {\n        return this._keySequenceNavigationHandler;\n    }\n\n    /**\n     * Get spatial.\n     *\n     * @returns {KeySpatialNavigationHandler} The spatial handler.\n     */\n    public get keySpatialNavigation(): KeySpatialNavigationHandler {\n        return this._keySpatialNavigationHandler;\n    }\n\n    /**\n     * Get key zoom.\n     *\n     * @returns {KeyZoomHandler} The key zoom handler.\n     */\n    public get keyZoom(): KeyZoomHandler {\n        return this._keyZoomHandler;\n    }\n\n    protected _activate(): void {\n        this._configurationSubscription = this._configuration$\n            .subscribe(\n                (configuration: IKeyboardConfiguration): void => {\n                    if (configuration.keyPlay) {\n                        this._keyPlayHandler.enable();\n                    } else {\n                        this._keyPlayHandler.disable();\n                    }\n\n                    if (configuration.keySequenceNavigation) {\n                        this._keySequenceNavigationHandler.enable();\n                    } else {\n                        this._keySequenceNavigationHandler.disable();\n                    }\n\n                    if (configuration.keySpatialNavigation) {\n                        this._keySpatialNavigationHandler.enable();\n                    } else {\n                        this._keySpatialNavigationHandler.disable();\n                    }\n\n                    if (configuration.keyZoom) {\n                        this._keyZoomHandler.enable();\n                    } else {\n                        this._keyZoomHandler.disable();\n                    }\n                });\n    }\n\n    protected _deactivate(): void {\n        this._configurationSubscription.unsubscribe();\n\n        this._keyPlayHandler.disable();\n        this._keySequenceNavigationHandler.disable();\n        this._keySpatialNavigationHandler.disable();\n        this._keyZoomHandler.disable();\n    }\n\n    protected _getDefaultConfiguration(): IKeyboardConfiguration {\n        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };\n    }\n}\n\nComponentService.register(KeyboardComponent);\nexport default KeyboardComponent;\n",
     "export {MarkerComponent} from \"./MarkerComponent\";\nexport {SimpleMarker} from \"./marker/SimpleMarker\";\nexport {CircleMarker} from \"./marker/CircleMarker\";\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as when from \"when\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\n\nimport {ILatLon} from \"../../API\";\nimport {\n    IMarkerConfiguration,\n    IMarkerEvent,\n    Marker,\n    MarkerScene,\n    MarkerSet,\n    ComponentService,\n    Component,\n} from \"../../Component\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\nimport {\n    IGLRenderHash,\n    GLRenderStage,\n    RenderCamera,\n} from \"../../Render\";\nimport {\n    GraphCalculator,\n    Node,\n} from \"../../Graph\";\nimport {\n    GeoCoords,\n    ILatLonAlt,\n    ViewportCoords,\n} from \"../../Geo\";\n\n\n/**\n * @class MarkerComponent\n *\n * @classdesc Component for showing and editing 3D marker objects.\n *\n * The `add` method is used for adding new markers or replacing\n * markers already in the set.\n *\n * If a marker already in the set has the same\n * id as one of the markers added, the old marker will be removed and\n * the added marker will take its place.\n *\n * It is not possible to update markers in the set by updating any properties\n * directly on the marker object. Markers need to be replaced by\n * re-adding them for updates to geographic position or configuration\n * to be reflected.\n *\n * Markers added to the marker component can be either interactive\n * or non-interactive. Different marker types define their behavior.\n * Markers with interaction support can be configured with options\n * to respond to dragging inside the viewer and be detected when\n * retrieving markers from pixel points with the `getMarkerIdAt` method.\n *\n * To retrive and use the marker component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\",\n *     { component: { marker: true } });\n *\n * var markerComponent = viewer.getComponent(\"marker\");\n * ```\n */\nexport class MarkerComponent extends Component<IMarkerConfiguration> {\n    public static componentName: string = \"marker\";\n\n    /**\n     * Fired when the position of a marker is changed.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"changed\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static changed: string = \"changed\";\n\n    /**\n     * Fired when a marker drag interaction starts.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"dragstart\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static dragstart: string = \"dragstart\";\n\n    /**\n     * Fired when a marker drag interaction ends.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"dragend\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static dragend: string = \"dragend\";\n\n    private _relativeGroundAltitude: number;\n\n    private _geoCoords: GeoCoords;\n    private _graphCalculator: GraphCalculator;\n    private _markerScene: MarkerScene;\n    private _markerSet: MarkerSet;\n    private _viewportCoords: ViewportCoords;\n\n    private _adjustHeightSubscription: Subscription;\n    private _dragEventSubscription: Subscription;\n    private _markersUpdatedSubscription: Subscription;\n    private _mouseClaimSubscription: Subscription;\n    private _referenceSubscription: Subscription;\n    private _renderSubscription: Subscription;\n    private _setChangedSubscription: Subscription;\n    private _updateMarkerSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._relativeGroundAltitude = -2;\n\n        this._geoCoords = new GeoCoords();\n        this._graphCalculator = new GraphCalculator();\n        this._markerScene = new MarkerScene();\n        this._markerSet = new MarkerSet();\n        this._viewportCoords = new ViewportCoords();\n    }\n\n    /**\n     * Add markers to the marker set or replace markers in the marker set.\n     *\n     * @description If a marker already in the set has the same\n     * id as one of the markers added, the old marker will be removed\n     * the added marker will take its place.\n     *\n     * Any marker inside the visible bounding bbox\n     * will be initialized and placed in the viewer.\n     *\n     * @param {Array<Marker>} markers - Markers to add.\n     *\n     * @example ```markerComponent.add([marker1, marker2]);```\n     */\n    public add(markers: Marker[]): void {\n        this._markerSet.add(markers);\n    }\n\n    /**\n     * Returns the marker in the marker set with the specified id, or\n     * undefined if the id matches no marker.\n     *\n     * @param {string} markerId - Id of the marker.\n     *\n     * @example ```var marker = markerComponent.get(\"markerId\");```\n     *\n     */\n    public get(markerId: string): Marker {\n        return this._markerSet.get(markerId);\n    }\n\n\n    /**\n     * Returns an array of all markers.\n     *\n     * @example ```var markers = markerComponent.getAll();```\n     */\n    public getAll(): Marker[] {\n        return this._markerSet.getAll();\n    }\n\n    /**\n     * Returns the id of the interactive marker closest to the current camera\n     * position at the specified point.\n     *\n     * @description Notice that the pixelPoint argument requires x, y\n     * coordinates from pixel space.\n     *\n     * With this function, you can use the coordinates provided by mouse\n     * events to get information out of the marker component.\n     *\n     * If no interactive geometry of an interactive marker exist at the pixel\n     * point, `null` will be returned.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.\n     * @returns {string} Id of the interactive marker closest to the camera. If no\n     * interactive marker exist at the pixel point, `null` will be returned.\n     *\n     * @example\n     * ```\n     * markerComponent.getMarkerIdAt([100, 100])\n     *     .then((markerId) => { console.log(markerId); });\n     * ```\n     */\n    public getMarkerIdAt(pixelPoint: number[]): when.Promise<string> {\n        return when.promise<string>((resolve: (value: string) => void, reject: (reason: Error) => void): void => {\n            this._container.renderService.renderCamera$\n                .first()\n                .map(\n                    (render: RenderCamera): string => {\n                        const viewport: number[] = this._viewportCoords\n                            .canvasToViewport(\n                                pixelPoint[0],\n                                pixelPoint[1],\n                                this._container.element);\n\n                        const id: string = this._markerScene.intersectObjects(viewport, render.perspective);\n\n                        return id;\n                    })\n                .subscribe(\n                    (id: string): void => {\n                        resolve(id);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n        });\n    }\n\n    /**\n     * Check if a marker exist in the marker set.\n     *\n     * @param {string} markerId - Id of the marker.\n     *\n     * @example ```var markerExists = markerComponent.has(\"markerId\");```\n     */\n    public has(markerId: string): boolean {\n        return this._markerSet.has(markerId);\n    }\n\n    /**\n     * Remove markers with the specified ids from the marker set.\n     *\n     * @param {Array<string>} markerIds - Ids for markers to remove.\n     *\n     * @example ```markerComponent.remove([\"id-1\", \"id-2\"]);```\n     */\n    public remove(markerIds: string[]): void {\n        this._markerSet.remove(markerIds);\n    }\n\n    /**\n     * Remove all markers from the marker set.\n     *\n     * @example ```markerComponent.removeAll();```\n     */\n    public removeAll(): void {\n        this._markerSet.removeAll();\n    }\n\n    protected _activate(): void {\n        const groundAltitude$: Observable<number> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): number => {\n                    return frame.state.camera.position.z + this._relativeGroundAltitude;\n                })\n            .distinctUntilChanged(\n                (a1: number, a2: number): boolean => {\n                    return Math.abs(a1 - a2) < 0.01;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const geoInitiated$: Observable<void> = Observable\n            .combineLatest(\n                groundAltitude$,\n                this._navigator.stateService.reference$)\n            .first()\n            .map((): void => { /* noop */ })\n            .publishReplay(1)\n            .refCount();\n\n        const clampedConfiguration$: Observable<IMarkerConfiguration> = this._configuration$\n            .map(\n                (configuration: IMarkerConfiguration): IMarkerConfiguration => {\n                    return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };\n                });\n\n        const currentlatLon$: Observable<ILatLon> = this._navigator.stateService.currentNode$\n            .map((node: Node): ILatLon => { return node.latLon; })\n            .publishReplay(1)\n            .refCount();\n\n        const visibleBBox$: Observable<[ILatLon, ILatLon]> = Observable\n            .combineLatest(\n                clampedConfiguration$,\n                currentlatLon$)\n            .map(\n                ([configuration, latLon]: [IMarkerConfiguration, ILatLon]): [ILatLon, ILatLon] => {\n                    return this._graphCalculator\n                        .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const visibleMarkers$: Observable<Marker[]> = Observable\n            .combineLatest(\n                Observable\n                    .of<MarkerSet>(this._markerSet)\n                    .concat(this._markerSet.changed$),\n                visibleBBox$)\n            .map(\n                ([set, bbox]: [MarkerSet, [ILatLon, ILatLon]]): Marker[] => {\n                    return set.search(bbox);\n                });\n\n        this._setChangedSubscription = geoInitiated$\n            .switchMap(\n                (): Observable<[Marker[], ILatLonAlt, number]> => {\n                    return visibleMarkers$\n                        .withLatestFrom(\n                            this._navigator.stateService.reference$,\n                            groundAltitude$);\n                })\n            .subscribe(\n                ([markers, reference, alt]: [Marker[], ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n                    const sceneMarkers: { [id: string]: Marker } = markerScene.markers;\n                    const markersToRemove: { [id: string]: Marker } = Object.assign({}, sceneMarkers);\n\n                    for (const marker of markers) {\n                         if (marker.id in sceneMarkers) {\n                            delete markersToRemove[marker.id];\n                        } else {\n                            const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                            markerScene.add(marker, point3d);\n                        }\n                    }\n\n                    for (const id in markersToRemove) {\n                        if (!markersToRemove.hasOwnProperty(id)) {\n                            continue;\n                        }\n\n                        markerScene.remove(id);\n                    }\n                });\n\n        this._markersUpdatedSubscription = geoInitiated$\n            .switchMap(\n                (): Observable<[Marker[], [ILatLon, ILatLon], ILatLonAlt, number]> => {\n                    return this._markerSet.updated$\n                        .withLatestFrom(\n                            visibleBBox$,\n                            this._navigator.stateService.reference$,\n                            groundAltitude$);\n                })\n            .subscribe(\n                ([markers, [sw, ne], reference, alt]: [Marker[], [ILatLon, ILatLon], ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    for (const marker of markers) {\n                        const exists: boolean = markerScene.has(marker.id);\n                        const visible: boolean = marker.latLon.lat > sw.lat &&\n                            marker.latLon.lat < ne.lat &&\n                            marker.latLon.lon > sw.lon &&\n                            marker.latLon.lon < ne.lon;\n\n                        if (visible) {\n                            const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                            markerScene.add(marker, point3d);\n                        } else if (!visible && exists) {\n                            markerScene.remove(marker.id);\n                        }\n                    }\n                });\n\n        this._referenceSubscription = this._navigator.stateService.reference$\n            .skip(1)\n            .withLatestFrom(groundAltitude$)\n            .subscribe(\n                ([reference, alt]: [ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    for (const marker of markerScene.getAll()) {\n                        const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                        markerScene.update(marker.id, point3d);\n                    }\n                });\n\n        this._adjustHeightSubscription = groundAltitude$\n            .skip(1)\n            .withLatestFrom(\n                this._navigator.stateService.reference$,\n                currentlatLon$)\n            .subscribe(\n                ([alt, reference, latLon]: [number, ILatLonAlt, ILatLon]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    const position: number[] = geoCoords\n                        .geodeticToEnu(\n                            latLon.lat,\n                            latLon.lon,\n                            reference.alt + alt,\n                            reference.lat,\n                            reference.lon,\n                            reference.alt);\n\n                    for (const marker of markerScene.getAll()) {\n                        const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                        const distanceX: number = point3d[0] - position[0];\n                        const distanceY: number = point3d[1] - position[1];\n\n                        const groundDistance: number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n                        if (groundDistance > 50) {\n                            continue;\n                        }\n\n                        markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));\n                    }\n                });\n\n        this._renderSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): IGLRenderHash => {\n                    const scene: MarkerScene = this._markerScene;\n\n                    return {\n                        name: this._name,\n                        render: {\n                            frameId: frame.id,\n                            needsRender: scene.needsRender,\n                            render: scene.render.bind(scene),\n                            stage: GLRenderStage.Foreground,\n                        },\n                    };\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        const hoveredMarkerId$: Observable<string> = Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._container.mouseService.mouseMove$)\n            .map(\n                ([render, event]: [RenderCamera, MouseEvent]): string => {\n                    const element: HTMLElement = this._container.element;\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n                    const viewport: number[] = this._viewportCoords.canvasToViewport(\n                        canvasX,\n                        canvasY,\n                        element);\n\n                    const markerId: string = this._markerScene.intersectObjects(viewport, render.perspective);\n\n                    return markerId;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const draggingStarted$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._name, this._container.mouseService.mouseDragStart$)\n                .map(\n                    (event: MouseEvent): boolean => {\n                        return true;\n                    });\n\n        const draggingStopped$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._name, this._container.mouseService.mouseDragEnd$)\n                .map(\n                    (event: Event): boolean => {\n                        return false;\n                    });\n\n        const filteredDragging$: Observable<boolean> = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .startWith(false);\n\n        this._dragEventSubscription = draggingStarted$\n            .withLatestFrom(hoveredMarkerId$)\n            .merge(Observable\n                .combineLatest(\n                    draggingStopped$,\n                    Observable.of<string>(null)))\n            .startWith([false, null])\n            .pairwise()\n            .subscribe(\n                ([previous, current]: [boolean, string][]): void => {\n                    const dragging: boolean = current[0];\n                    const eventType: string = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;\n                    const id: string = dragging ? current[1] : previous[1];\n                    const marker: Marker = this._markerScene.get(id);\n                    const markerEvent: IMarkerEvent = { marker: marker, target: this, type: eventType };\n\n                    this.fire(eventType, markerEvent);\n                });\n\n        const mouseDown$: Observable<boolean> = Observable\n            .merge(\n                this._container.mouseService.mouseDown$\n                    .map((event: MouseEvent): boolean => { return true; }),\n                this._container.mouseService.documentMouseUp$\n                    .map((event: MouseEvent): boolean => { return false; }))\n            .startWith(false);\n\n        this._mouseClaimSubscription = Observable\n            .combineLatest(\n                this._container.mouseService.active$,\n                hoveredMarkerId$.distinctUntilChanged(),\n                mouseDown$,\n                filteredDragging$)\n            .map(\n                ([active, markerId, mouseDown, filteredDragging]: [boolean, string, boolean, boolean]): boolean => {\n                    return (!active && markerId != null && mouseDown) || filteredDragging;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (claim: boolean): void => {\n                    if (claim) {\n                        this._container.mouseService.claimMouse(this._name, 1);\n                        this._container.mouseService.claimWheel(this._name, 1);\n                    } else {\n                        this._container.mouseService.unclaimMouse(this._name);\n                        this._container.mouseService.unclaimWheel(this._name);\n                    }\n                });\n\n        const offset$: Observable<[Marker, number[], RenderCamera]> = this._container.mouseService\n            .filtered$(this._name, this._container.mouseService.mouseDragStart$)\n            .withLatestFrom(\n                hoveredMarkerId$,\n                this._container.renderService.renderCamera$)\n            .map(\n                ([e, id, r]: [MouseEvent, string, RenderCamera]): [Marker, number[], RenderCamera] => {\n                    const marker: Marker = this._markerScene.get(id);\n                    const element: HTMLElement = this._container.element;\n\n                    const [groundCanvasX, groundCanvasY]: number[] =\n                        this._viewportCoords.projectToCanvas(\n                            marker.geometry.position.toArray(),\n                            element,\n                            r.perspective);\n\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(e, element);\n\n                    const offset: number[] = [canvasX - groundCanvasX, canvasY - groundCanvasY];\n\n                    return [marker, offset, r];\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._updateMarkerSubscription = this._container.mouseService\n            .filtered$(this._name, this._container.mouseService.mouseDrag$)\n            .withLatestFrom(\n                offset$,\n                this._navigator.stateService.reference$,\n                clampedConfiguration$)\n            .subscribe(\n                ([event, [marker, offset, render], reference, configuration]:\n                    [MouseEvent, [Marker, number[], RenderCamera], ILatLonAlt, IMarkerConfiguration]): void => {\n                    if (!this._markerScene.has(marker.id)) {\n                        return;\n                    }\n\n                    const element: HTMLElement = this._container.element;\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    const groundX: number = canvasX - offset[0];\n                    const groundY: number = canvasY - offset[1];\n\n                    const [viewportX, viewportY]: number[] = this._viewportCoords\n                        .canvasToViewport(\n                            groundX,\n                            groundY,\n                            element);\n\n                    const direction: THREE.Vector3 = new THREE.Vector3(viewportX, viewportY, 1)\n                        .unproject(render.perspective)\n                        .sub(render.perspective.position)\n                        .normalize();\n\n                    const distance: number = Math.min(\n                        this._relativeGroundAltitude / direction.z,\n                        configuration.visibleBBoxSize / 2 - 0.1);\n\n                    if (distance < 0) {\n                        return;\n                    }\n\n                    const intersection: THREE.Vector3 = direction\n                        .clone()\n                        .multiplyScalar(distance)\n                        .add(render.perspective.position);\n\n                    intersection.z = render.perspective.position.z + this._relativeGroundAltitude;\n\n                    const [lat, lon]: number[] = this._geoCoords\n                        .enuToGeodetic(\n                            intersection.x,\n                            intersection.y,\n                            intersection.z,\n                            reference.lat,\n                            reference.lon,\n                            reference.alt);\n\n                    this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });\n                    this._markerSet.update(marker);\n\n                    const markerEvent: IMarkerEvent = { marker: marker, target: this, type: MarkerComponent.changed };\n                    this.fire(MarkerComponent.changed, markerEvent);\n                });\n    }\n\n    protected _deactivate(): void {\n        this._adjustHeightSubscription.unsubscribe();\n        this._dragEventSubscription.unsubscribe();\n        this._markersUpdatedSubscription.unsubscribe();\n        this._mouseClaimSubscription.unsubscribe();\n        this._referenceSubscription.unsubscribe();\n        this._renderSubscription.unsubscribe();\n        this._setChangedSubscription.unsubscribe();\n        this._updateMarkerSubscription.unsubscribe();\n\n        this._markerScene.clear();\n    }\n\n    protected _getDefaultConfiguration(): IMarkerConfiguration {\n        return { visibleBBoxSize: 100 };\n    }\n}\n\nComponentService.register(MarkerComponent);\nexport default MarkerComponent;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as when from \"when\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\n\nimport {ILatLon} from \"../../API\";\nimport {\n    IMarkerConfiguration,\n    IMarkerEvent,\n    Marker,\n    MarkerScene,\n    MarkerSet,\n    ComponentService,\n    Component,\n} from \"../../Component\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\nimport {\n    IGLRenderHash,\n    GLRenderStage,\n    RenderCamera,\n} from \"../../Render\";\nimport {\n    GraphCalculator,\n    Node,\n} from \"../../Graph\";\nimport {\n    GeoCoords,\n    ILatLonAlt,\n    ViewportCoords,\n} from \"../../Geo\";\n\n/**\n * @class MarkerComponent\n *\n * @classdesc Component for showing and editing 3D marker objects.\n *\n * The `add` method is used for adding new markers or replacing\n * markers already in the set.\n *\n * If a marker already in the set has the same\n * id as one of the markers added, the old marker will be removed and\n * the added marker will take its place.\n *\n * It is not possible to update markers in the set by updating any properties\n * directly on the marker object. Markers need to be replaced by\n * re-adding them for updates to geographic position or configuration\n * to be reflected.\n *\n * Markers added to the marker component can be either interactive\n * or non-interactive. Different marker types define their behavior.\n * Markers with interaction support can be configured with options\n * to respond to dragging inside the viewer and be detected when\n * retrieving markers from pixel points with the `getMarkerIdAt` method.\n *\n * To retrive and use the marker component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\",\n *     { component: { marker: true } });\n *\n * var markerComponent = viewer.getComponent(\"marker\");\n * ```\n */\nexport class MarkerComponent extends Component<IMarkerConfiguration> {\n    public static componentName: string = \"marker\";\n\n    /**\n     * Fired when the position of a marker is changed.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"changed\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static changed: string = \"changed\";\n\n    /**\n     * Fired when a marker drag interaction starts.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"dragstart\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static dragstart: string = \"dragstart\";\n\n    /**\n     * Fired when a marker drag interaction ends.\n     * @event\n     * @type {IMarkerEvent} markerEvent - Marker event data.\n     * @example\n     * ```\n     * markerComponent.on(\"dragend\", function(e) {\n     *     console.log(e.marker.id, e.marker.latLon);\n     * });\n     * ```\n     */\n    public static dragend: string = \"dragend\";\n\n    private _relativeGroundAltitude: number;\n\n    private _geoCoords: GeoCoords;\n    private _graphCalculator: GraphCalculator;\n    private _markerScene: MarkerScene;\n    private _markerSet: MarkerSet;\n    private _viewportCoords: ViewportCoords;\n\n    private _adjustHeightSubscription: Subscription;\n    private _dragEventSubscription: Subscription;\n    private _markersUpdatedSubscription: Subscription;\n    private _mouseClaimSubscription: Subscription;\n    private _referenceSubscription: Subscription;\n    private _renderSubscription: Subscription;\n    private _setChangedSubscription: Subscription;\n    private _updateMarkerSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._relativeGroundAltitude = -2;\n\n        this._geoCoords = new GeoCoords();\n        this._graphCalculator = new GraphCalculator();\n        this._markerScene = new MarkerScene();\n        this._markerSet = new MarkerSet();\n        this._viewportCoords = new ViewportCoords();\n    }\n\n    /**\n     * Add markers to the marker set or replace markers in the marker set.\n     *\n     * @description If a marker already in the set has the same\n     * id as one of the markers added, the old marker will be removed\n     * the added marker will take its place.\n     *\n     * Any marker inside the visible bounding bbox\n     * will be initialized and placed in the viewer.\n     *\n     * @param {Array<Marker>} markers - Markers to add.\n     *\n     * @example ```markerComponent.add([marker1, marker2]);```\n     */\n    public add(markers: Marker[]): void {\n        this._markerSet.add(markers);\n    }\n\n    /**\n     * Returns the marker in the marker set with the specified id, or\n     * undefined if the id matches no marker.\n     *\n     * @param {string} markerId - Id of the marker.\n     *\n     * @example ```var marker = markerComponent.get(\"markerId\");```\n     *\n     */\n    public get(markerId: string): Marker {\n        return this._markerSet.get(markerId);\n    }\n\n    /**\n     * Returns an array of all markers.\n     *\n     * @example ```var markers = markerComponent.getAll();```\n     */\n    public getAll(): Marker[] {\n        return this._markerSet.getAll();\n    }\n\n    /**\n     * Returns the id of the interactive marker closest to the current camera\n     * position at the specified point.\n     *\n     * @description Notice that the pixelPoint argument requires x, y\n     * coordinates from pixel space.\n     *\n     * With this function, you can use the coordinates provided by mouse\n     * events to get information out of the marker component.\n     *\n     * If no interactive geometry of an interactive marker exist at the pixel\n     * point, `null` will be returned.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.\n     * @returns {string} Id of the interactive marker closest to the camera. If no\n     * interactive marker exist at the pixel point, `null` will be returned.\n     *\n     * @example\n     * ```\n     * markerComponent.getMarkerIdAt([100, 100])\n     *     .then((markerId) => { console.log(markerId); });\n     * ```\n     */\n    public getMarkerIdAt(pixelPoint: number[]): when.Promise<string> {\n        return when.promise<string>((resolve: (value: string) => void, reject: (reason: Error) => void): void => {\n            this._container.renderService.renderCamera$\n                .first()\n                .map(\n                    (render: RenderCamera): string => {\n                        const viewport: number[] = this._viewportCoords\n                            .canvasToViewport(\n                                pixelPoint[0],\n                                pixelPoint[1],\n                                this._container.element);\n\n                        const id: string = this._markerScene.intersectObjects(viewport, render.perspective);\n\n                        return id;\n                    })\n                .subscribe(\n                    (id: string): void => {\n                        resolve(id);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n        });\n    }\n\n    /**\n     * Check if a marker exist in the marker set.\n     *\n     * @param {string} markerId - Id of the marker.\n     *\n     * @example ```var markerExists = markerComponent.has(\"markerId\");```\n     */\n    public has(markerId: string): boolean {\n        return this._markerSet.has(markerId);\n    }\n\n    /**\n     * Remove markers with the specified ids from the marker set.\n     *\n     * @param {Array<string>} markerIds - Ids for markers to remove.\n     *\n     * @example ```markerComponent.remove([\"id-1\", \"id-2\"]);```\n     */\n    public remove(markerIds: string[]): void {\n        this._markerSet.remove(markerIds);\n    }\n\n    /**\n     * Remove all markers from the marker set.\n     *\n     * @example ```markerComponent.removeAll();```\n     */\n    public removeAll(): void {\n        this._markerSet.removeAll();\n    }\n\n    protected _activate(): void {\n        const groundAltitude$: Observable<number> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): number => {\n                    return frame.state.camera.position.z + this._relativeGroundAltitude;\n                })\n            .distinctUntilChanged(\n                (a1: number, a2: number): boolean => {\n                    return Math.abs(a1 - a2) < 0.01;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const geoInitiated$: Observable<void> = Observable\n            .combineLatest(\n                groundAltitude$,\n                this._navigator.stateService.reference$)\n            .first()\n            .map((): void => { /* noop */ })\n            .publishReplay(1)\n            .refCount();\n\n        const clampedConfiguration$: Observable<IMarkerConfiguration> = this._configuration$\n            .map(\n                (configuration: IMarkerConfiguration): IMarkerConfiguration => {\n                    return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };\n                });\n\n        const currentlatLon$: Observable<ILatLon> = this._navigator.stateService.currentNode$\n            .map((node: Node): ILatLon => { return node.latLon; })\n            .publishReplay(1)\n            .refCount();\n\n        const visibleBBox$: Observable<[ILatLon, ILatLon]> = Observable\n            .combineLatest(\n                clampedConfiguration$,\n                currentlatLon$)\n            .map(\n                ([configuration, latLon]: [IMarkerConfiguration, ILatLon]): [ILatLon, ILatLon] => {\n                    return this._graphCalculator\n                        .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const visibleMarkers$: Observable<Marker[]> = Observable\n            .combineLatest(\n                Observable\n                    .of<MarkerSet>(this._markerSet)\n                    .concat(this._markerSet.changed$),\n                visibleBBox$)\n            .map(\n                ([set, bbox]: [MarkerSet, [ILatLon, ILatLon]]): Marker[] => {\n                    return set.search(bbox);\n                });\n\n        this._setChangedSubscription = geoInitiated$\n            .switchMap(\n                (): Observable<[Marker[], ILatLonAlt, number]> => {\n                    return visibleMarkers$\n                        .withLatestFrom(\n                            this._navigator.stateService.reference$,\n                            groundAltitude$);\n                })\n            .subscribe(\n                ([markers, reference, alt]: [Marker[], ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n                    const sceneMarkers: { [id: string]: Marker } = markerScene.markers;\n                    const markersToRemove: { [id: string]: Marker } = Object.assign({}, sceneMarkers);\n\n                    for (const marker of markers) {\n                         if (marker.id in sceneMarkers) {\n                            delete markersToRemove[marker.id];\n                        } else {\n                            const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                            markerScene.add(marker, point3d);\n                        }\n                    }\n\n                    for (const id in markersToRemove) {\n                        if (!markersToRemove.hasOwnProperty(id)) {\n                            continue;\n                        }\n\n                        markerScene.remove(id);\n                    }\n                });\n\n        this._markersUpdatedSubscription = geoInitiated$\n            .switchMap(\n                (): Observable<[Marker[], [ILatLon, ILatLon], ILatLonAlt, number]> => {\n                    return this._markerSet.updated$\n                        .withLatestFrom(\n                            visibleBBox$,\n                            this._navigator.stateService.reference$,\n                            groundAltitude$);\n                })\n            .subscribe(\n                ([markers, [sw, ne], reference, alt]: [Marker[], [ILatLon, ILatLon], ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    for (const marker of markers) {\n                        const exists: boolean = markerScene.has(marker.id);\n                        const visible: boolean = marker.latLon.lat > sw.lat &&\n                            marker.latLon.lat < ne.lat &&\n                            marker.latLon.lon > sw.lon &&\n                            marker.latLon.lon < ne.lon;\n\n                        if (visible) {\n                            const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                            markerScene.add(marker, point3d);\n                        } else if (!visible && exists) {\n                            markerScene.remove(marker.id);\n                        }\n                    }\n                });\n\n        this._referenceSubscription = this._navigator.stateService.reference$\n            .skip(1)\n            .withLatestFrom(groundAltitude$)\n            .subscribe(\n                ([reference, alt]: [ILatLonAlt, number]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    for (const marker of markerScene.getAll()) {\n                        const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                        markerScene.update(marker.id, point3d);\n                    }\n                });\n\n        this._adjustHeightSubscription = groundAltitude$\n            .skip(1)\n            .withLatestFrom(\n                this._navigator.stateService.reference$,\n                currentlatLon$)\n            .subscribe(\n                ([alt, reference, latLon]: [number, ILatLonAlt, ILatLon]): void => {\n                    const geoCoords: GeoCoords = this._geoCoords;\n                    const markerScene: MarkerScene = this._markerScene;\n\n                    const position: number[] = geoCoords\n                        .geodeticToEnu(\n                            latLon.lat,\n                            latLon.lon,\n                            reference.alt + alt,\n                            reference.lat,\n                            reference.lon,\n                            reference.alt);\n\n                    for (const marker of markerScene.getAll()) {\n                        const point3d: number[] = geoCoords\n                                .geodeticToEnu(\n                                    marker.latLon.lat,\n                                    marker.latLon.lon,\n                                    reference.alt + alt,\n                                    reference.lat,\n                                    reference.lon,\n                                    reference.alt);\n\n                        const distanceX: number = point3d[0] - position[0];\n                        const distanceY: number = point3d[1] - position[1];\n\n                        const groundDistance: number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n                        if (groundDistance > 50) {\n                            continue;\n                        }\n\n                        markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));\n                    }\n                });\n\n        this._renderSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): IGLRenderHash => {\n                    const scene: MarkerScene = this._markerScene;\n\n                    return {\n                        name: this._name,\n                        render: {\n                            frameId: frame.id,\n                            needsRender: scene.needsRender,\n                            render: scene.render.bind(scene),\n                            stage: GLRenderStage.Foreground,\n                        },\n                    };\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        const hoveredMarkerId$: Observable<string> = Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._container.mouseService.mouseMove$)\n            .map(\n                ([render, event]: [RenderCamera, MouseEvent]): string => {\n                    const element: HTMLElement = this._container.element;\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n                    const viewport: number[] = this._viewportCoords.canvasToViewport(\n                        canvasX,\n                        canvasY,\n                        element);\n\n                    const markerId: string = this._markerScene.intersectObjects(viewport, render.perspective);\n\n                    return markerId;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const draggingStarted$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._name, this._container.mouseService.mouseDragStart$)\n                .map(\n                    (event: MouseEvent): boolean => {\n                        return true;\n                    });\n\n        const draggingStopped$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._name, this._container.mouseService.mouseDragEnd$)\n                .map(\n                    (event: Event): boolean => {\n                        return false;\n                    });\n\n        const filteredDragging$: Observable<boolean> = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .startWith(false);\n\n        this._dragEventSubscription = draggingStarted$\n            .withLatestFrom(hoveredMarkerId$)\n            .merge(Observable\n                .combineLatest(\n                    draggingStopped$,\n                    Observable.of<string>(null)))\n            .startWith([false, null])\n            .pairwise()\n            .subscribe(\n                ([previous, current]: [boolean, string][]): void => {\n                    const dragging: boolean = current[0];\n                    const eventType: string = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;\n                    const id: string = dragging ? current[1] : previous[1];\n                    const marker: Marker = this._markerScene.get(id);\n                    const markerEvent: IMarkerEvent = { marker: marker, target: this, type: eventType };\n\n                    this.fire(eventType, markerEvent);\n                });\n\n        const mouseDown$: Observable<boolean> = Observable\n            .merge(\n                this._container.mouseService.mouseDown$\n                    .map((event: MouseEvent): boolean => { return true; }),\n                this._container.mouseService.documentMouseUp$\n                    .map((event: MouseEvent): boolean => { return false; }))\n            .startWith(false);\n\n        this._mouseClaimSubscription = Observable\n            .combineLatest(\n                this._container.mouseService.active$,\n                hoveredMarkerId$.distinctUntilChanged(),\n                mouseDown$,\n                filteredDragging$)\n            .map(\n                ([active, markerId, mouseDown, filteredDragging]: [boolean, string, boolean, boolean]): boolean => {\n                    return (!active && markerId != null && mouseDown) || filteredDragging;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (claim: boolean): void => {\n                    if (claim) {\n                        this._container.mouseService.claimMouse(this._name, 1);\n                        this._container.mouseService.claimWheel(this._name, 1);\n                    } else {\n                        this._container.mouseService.unclaimMouse(this._name);\n                        this._container.mouseService.unclaimWheel(this._name);\n                    }\n                });\n\n        const offset$: Observable<[Marker, number[], RenderCamera]> = this._container.mouseService\n            .filtered$(this._name, this._container.mouseService.mouseDragStart$)\n            .withLatestFrom(\n                hoveredMarkerId$,\n                this._container.renderService.renderCamera$)\n            .map(\n                ([e, id, r]: [MouseEvent, string, RenderCamera]): [Marker, number[], RenderCamera] => {\n                    const marker: Marker = this._markerScene.get(id);\n                    const element: HTMLElement = this._container.element;\n\n                    const [groundCanvasX, groundCanvasY]: number[] =\n                        this._viewportCoords.projectToCanvas(\n                            marker.geometry.position.toArray(),\n                            element,\n                            r.perspective);\n\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(e, element);\n\n                    const offset: number[] = [canvasX - groundCanvasX, canvasY - groundCanvasY];\n\n                    return [marker, offset, r];\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._updateMarkerSubscription = this._container.mouseService\n            .filtered$(this._name, this._container.mouseService.mouseDrag$)\n            .withLatestFrom(\n                offset$,\n                this._navigator.stateService.reference$,\n                clampedConfiguration$)\n            .subscribe(\n                ([event, [marker, offset, render], reference, configuration]:\n                    [MouseEvent, [Marker, number[], RenderCamera], ILatLonAlt, IMarkerConfiguration]): void => {\n                    if (!this._markerScene.has(marker.id)) {\n                        return;\n                    }\n\n                    const element: HTMLElement = this._container.element;\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    const groundX: number = canvasX - offset[0];\n                    const groundY: number = canvasY - offset[1];\n\n                    const [viewportX, viewportY]: number[] = this._viewportCoords\n                        .canvasToViewport(\n                            groundX,\n                            groundY,\n                            element);\n\n                    const direction: THREE.Vector3 = new THREE.Vector3(viewportX, viewportY, 1)\n                        .unproject(render.perspective)\n                        .sub(render.perspective.position)\n                        .normalize();\n\n                    const distance: number = Math.min(\n                        this._relativeGroundAltitude / direction.z,\n                        configuration.visibleBBoxSize / 2 - 0.1);\n\n                    if (distance < 0) {\n                        return;\n                    }\n\n                    const intersection: THREE.Vector3 = direction\n                        .clone()\n                        .multiplyScalar(distance)\n                        .add(render.perspective.position);\n\n                    intersection.z = render.perspective.position.z + this._relativeGroundAltitude;\n\n                    const [lat, lon]: number[] = this._geoCoords\n                        .enuToGeodetic(\n                            intersection.x,\n                            intersection.y,\n                            intersection.z,\n                            reference.lat,\n                            reference.lon,\n                            reference.alt);\n\n                    this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });\n                    this._markerSet.update(marker);\n\n                    const markerEvent: IMarkerEvent = { marker: marker, target: this, type: MarkerComponent.changed };\n                    this.fire(MarkerComponent.changed, markerEvent);\n                });\n    }\n\n    protected _deactivate(): void {\n        this._adjustHeightSubscription.unsubscribe();\n        this._dragEventSubscription.unsubscribe();\n        this._markersUpdatedSubscription.unsubscribe();\n        this._mouseClaimSubscription.unsubscribe();\n        this._referenceSubscription.unsubscribe();\n        this._renderSubscription.unsubscribe();\n        this._setChangedSubscription.unsubscribe();\n        this._updateMarkerSubscription.unsubscribe();\n\n        this._markerScene.clear();\n    }\n\n    protected _getDefaultConfiguration(): IMarkerConfiguration {\n        return { visibleBBoxSize: 100 };\n    }\n}\n\nComponentService.register(MarkerComponent);\nexport default MarkerComponent;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../../API\";\nimport {Marker} from \"../../Component\";\n\nexport class MarkerScene {\n    private _needsRender: boolean;\n    private _interactiveObjects: THREE.Object3D[];\n    private _markers: { [key: string]: Marker };\n    private _objectMarkers: { [id: string]: string };\n    private _raycaster: THREE.Raycaster;\n    private _scene: THREE.Scene;\n\n    constructor(scene?: THREE.Scene, raycaster?: THREE.Raycaster) {\n        this._needsRender = false;\n        this._interactiveObjects = [];\n        this._markers = {};\n        this._objectMarkers = {};\n        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();\n        this._scene = !!scene ? scene : new THREE.Scene();\n    }\n\n    public get markers(): { [key: string]: Marker } {\n        return this._markers;\n    }\n\n    public get needsRender(): boolean {\n        return this._needsRender;\n    }\n\n    public add(marker: Marker, position: number[]): void {\n        if (marker.id in this._markers) {\n            this._dispose(marker.id);\n        }\n\n        marker.createGeometry(position);\n        this._scene.add(marker.geometry);\n        this._markers[marker.id] = marker;\n        for (let interactiveObject of marker.getInteractiveObjects()) {\n            this._interactiveObjects.push(interactiveObject);\n            this._objectMarkers[interactiveObject.uuid] = marker.id;\n        }\n\n        this._needsRender = true;\n    }\n\n    public clear(): void {\n        for (const id in this._markers) {\n            if (!this._markers.hasOwnProperty) {\n                continue;\n            }\n\n            this._dispose(id);\n        }\n\n        this._needsRender = true;\n    }\n\n    public get(id: string): Marker {\n        return this._markers[id];\n    }\n\n    public getAll(): Marker[] {\n        return Object\n            .keys(this._markers)\n            .map((id: string): Marker => { return this._markers[id]; });\n    }\n\n    public has(id: string): boolean {\n        return id in this._markers;\n    }\n\n    public intersectObjects([viewportX, viewportY]: number[], camera: THREE.Camera): string {\n        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);\n\n        const intersects: THREE.Intersection[] = this._raycaster.intersectObjects(this._interactiveObjects);\n        for (const intersect of intersects) {\n            if (intersect.object.uuid in this._objectMarkers) {\n                return this._objectMarkers[intersect.object.uuid];\n            }\n        }\n\n        return null;\n    }\n\n    public lerpAltitude(id: string, alt: number, alpha: number): void {\n        if (!(id in this._markers)) {\n            return;\n        }\n\n        this._markers[id].lerpAltitude(alt, alpha);\n\n        this._needsRender = true;\n    }\n\n    public remove(id: string): void {\n        if (!(id in this._markers)) {\n            return;\n        }\n\n        this._dispose(id);\n\n        this._needsRender = true;\n    }\n\n    public render(\n        perspectiveCamera: THREE.PerspectiveCamera,\n        renderer: THREE.WebGLRenderer): void {\n\n        renderer.render(this._scene, perspectiveCamera);\n\n        this._needsRender = false;\n    }\n\n    public update(id: string, position: number[], latLon?: ILatLon): void {\n        if (!(id in this._markers)) {\n            return;\n        }\n\n        const marker: Marker = this._markers[id];\n        marker.updatePosition(position, latLon);\n\n        this._needsRender = true;\n    }\n\n    private _dispose(id: string): void {\n        const marker: Marker = this._markers[id];\n        this._scene.remove(marker.geometry);\n        for (let interactiveObject of marker.getInteractiveObjects()) {\n            const index: number = this._interactiveObjects.indexOf(interactiveObject);\n            if (index !== -1) {\n                this._interactiveObjects.splice(index, 1);\n            } else {\n                console.warn(`Object does not exist (${interactiveObject.id}) for ${id}`);\n            }\n\n            delete this._objectMarkers[interactiveObject.uuid];\n        }\n\n        marker.disposeGeometry();\n\n        delete this._markers[id];\n    }\n}\n\nexport default MarkerScene;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as rbush from \"rbush\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\n\nimport {ILatLon} from \"../../API\";\nimport {Marker} from \"../../Component\";\n\ntype MarkerIndexItem = {\n    lat: number;\n    lon: number;\n    marker: Marker;\n};\n\ntype MarkerIndex = rbush.RBush<MarkerIndexItem>;\n\nexport class MarkerSet {\n    private _hash: { [id: string]: MarkerIndexItem };\n    private _index: MarkerIndex;\n\n    private _indexChanged$: Subject<MarkerSet>;\n    private _updated$: Subject<Marker[]>;\n\n    constructor() {\n        this._hash = {};\n        this._index = rbush<MarkerIndexItem>(16, [\".lon\", \".lat\", \".lon\", \".lat\"]);\n\n        this._indexChanged$ = new Subject<MarkerSet>();\n        this._updated$ = new Subject<Marker[]>();\n    }\n\n    public get changed$(): Observable<MarkerSet> {\n        return this._indexChanged$;\n    }\n\n    public get updated$(): Observable<Marker[]> {\n        return this._updated$;\n    }\n\n    public add(markers: Marker[]): void {\n        const updated: Marker[] = [];\n        const hash: { [id: string]: MarkerIndexItem } = this._hash;\n        const index: MarkerIndex = this._index;\n\n        for (const marker of markers) {\n            const id: string = marker.id;\n\n            if (id in hash) {\n                index.remove(hash[id]);\n                updated.push(marker);\n            }\n\n            const item: MarkerIndexItem = {\n                lat: marker.latLon.lat,\n                lon: marker.latLon.lon,\n                marker: marker,\n            };\n\n            hash[id] = item;\n            index.insert(item);\n        }\n\n        if (updated.length > 0) {\n            this._updated$.next(updated);\n        }\n\n        if (markers.length > updated.length) {\n            this._indexChanged$.next(this);\n        }\n    }\n\n    public has(id: string): boolean {\n        return id in this._hash;\n    }\n\n    public get(id: string): Marker {\n        return this.has(id) ? this._hash[id].marker : undefined;\n    }\n\n    public getAll(): Marker[] {\n        return this._index\n            .all()\n            .map(\n                (indexItem: MarkerIndexItem): Marker => {\n                    return indexItem.marker;\n                });\n    }\n\n    public remove(ids: string[]): void {\n        const hash: { [id: string]: MarkerIndexItem } = this._hash;\n        const index: MarkerIndex = this._index;\n\n        let changed: boolean = false;\n        for (const id of ids) {\n            if (!(id in hash)) {\n                continue;\n            }\n\n            const item: MarkerIndexItem = hash[id];\n            index.remove(item);\n            delete hash[id];\n            changed = true;\n        }\n\n        if (changed) {\n            this._indexChanged$.next(this);\n        }\n    }\n\n    public removeAll(): void {\n        this._hash = {};\n        this._index.clear();\n\n        this._indexChanged$.next(this);\n    }\n\n    public search([sw, ne]: [ILatLon, ILatLon]): Marker[] {\n        return this._index\n            .search({ maxX: ne.lon, maxY: ne.lat, minX: sw.lon, minY: sw.lat })\n            .map(\n                (indexItem: MarkerIndexItem): Marker => {\n                    return indexItem.marker;\n                });\n    }\n\n    public update(marker: Marker): void {\n        const hash: { [id: string]: MarkerIndexItem } = this._hash;\n        const index: MarkerIndex = this._index;\n        const id: string = marker.id;\n\n        if (!(id in hash)) {\n            return;\n        }\n\n        index.remove(hash[id]);\n\n        const item: MarkerIndexItem = {\n            lat: marker.latLon.lat,\n            lon: marker.latLon.lon,\n            marker: marker,\n        };\n\n        hash[id] = item;\n        index.insert(item);\n    }\n}\n\nexport default MarkerSet;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../../../API\";\nimport {\n    ICircleMarkerOptions,\n    Marker,\n} from \"../../../Component\";\n\n/**\n * @class CircleMarker\n *\n * @classdesc Non-interactive marker with a flat circle shape. The circle\n * marker can not be configured to be interactive.\n *\n * Circle marker properties can not be updated after creation.\n *\n * To create and add one `CircleMarker` with default configuration\n * and one with configuration use\n *\n * @example\n * ```\n * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(\n *     \"id-1\",\n *     { lat: 0, lon: 0, });\n *\n * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(\n *     \"id-2\",\n *     { lat: 0, lon: 0, },\n *     {\n *         color: \"#0Ff\",\n *         opacity: 0.3,\n *         radius: 0.7,\n *     });\n *\n * markerComponent.add([defaultMarker, configuredMarker]);\n * ```\n */\nexport class CircleMarker extends Marker {\n    private _color: number | string;\n    private _opacity: number;\n    private _radius: number;\n\n    constructor(id: string, latLon: ILatLon, options?: ICircleMarkerOptions) {\n        super(id, latLon);\n\n        options = !!options ? options : {};\n        this._color = options.color != null ? options.color : 0xffffff;\n        this._opacity = options.opacity != null ? options.opacity : 0.4;\n        this._radius = options.radius != null ? options.radius : 1;\n    }\n\n    protected _createGeometry(position: number[]): void {\n        const circle: THREE.Mesh = new THREE.Mesh(\n            new THREE.CircleGeometry(this._radius, 16),\n            new THREE.MeshBasicMaterial({\n                color: this._color,\n                opacity: this._opacity,\n                transparent: true,\n            }));\n\n        circle.up.fromArray([0, 0, 1]);\n        circle.renderOrder = -1;\n\n        const group: THREE.Object3D = new THREE.Object3D();\n        group.add(circle);\n        group.position.fromArray(position);\n\n        this._geometry = group;\n    }\n\n    protected _disposeGeometry(): void {\n        for (let mesh of <THREE.Mesh[]>this._geometry.children) {\n            mesh.geometry.dispose();\n            mesh.material.dispose();\n        }\n    }\n\n    protected _getInteractiveObjects(): THREE.Object3D[] {\n        return [];\n    }\n}\n\nexport default CircleMarker;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../../../API\";\n\n/**\n * @class Marker\n *\n * @classdesc Represents an abstract marker class that should be extended\n * by marker implementations used in the marker component.\n */\nexport abstract class Marker {\n    protected _id: string;\n    protected _geometry: THREE.Object3D;\n    protected _latLon: ILatLon;\n\n    constructor(id: string, latLon: ILatLon) {\n        this._id = id;\n        this._latLon = latLon;\n    }\n\n    /**\n     * Get id.\n     * @returns {string} The id of the marker.\n     */\n    public get id(): string {\n        return this._id;\n    }\n\n    public get geometry(): THREE.Object3D {\n        return this._geometry;\n    }\n\n    /**\n     * Get lat lon.\n     * @returns {ILatLon} The geographic coordinates of the marker.\n     */\n    public get latLon(): ILatLon {\n        return this._latLon;\n    }\n\n    public createGeometry(position: number[]): void {\n        if (!!this._geometry) {\n            return;\n        }\n\n        this._createGeometry(position);\n\n        // update matrix world if raycasting occurs before first render\n        this._geometry.updateMatrixWorld(true);\n    }\n\n    public disposeGeometry(): void {\n        if (!this._geometry) {\n            return;\n        }\n\n        this._disposeGeometry();\n\n        this._geometry = undefined;\n    }\n\n    public getInteractiveObjects(): THREE.Object3D[] {\n        if (!this._geometry) {\n            return [];\n        }\n\n        return this._getInteractiveObjects();\n    }\n\n    public lerpAltitude(alt: number, alpha: number): void {\n        if (!this._geometry) {\n            return;\n        }\n\n        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;\n    }\n\n    public updatePosition(position: number[], latLon?: ILatLon): void {\n        if (!!latLon) {\n            this._latLon.lat = latLon.lat;\n            this._latLon.lon = latLon.lon;\n        }\n\n        if (!this._geometry) {\n            return;\n        }\n\n        this._geometry.position.fromArray(position);\n        this._geometry.updateMatrixWorld(true);\n    }\n\n    protected abstract _createGeometry(position: number[]): void;\n\n    protected abstract _disposeGeometry(): void;\n\n    protected abstract _getInteractiveObjects(): THREE.Object3D[];\n}\n\nexport default Marker;\n",
-    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../../../API\";\nimport {\n    ISimpleMarkerOptions,\n    Marker,\n} from \"../../../Component\";\n\n/**\n * @class SimpleMarker\n *\n * @classdesc Interactive marker with ice cream shape. The sphere\n * inside the ice cream can be configured to be interactive.\n *\n * Simple marker properties can not be updated after creation.\n *\n * To create and add one `SimpleMarker` with default configuration\n * (non-interactive) and one interactive with configuration use\n *\n * @example\n * ```\n * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(\n *     \"id-1\",\n *     { lat: 0, lon: 0, });\n *\n * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(\n *     \"id-2\",\n *     { lat: 0, lon: 0, },\n *     {\n *         ballColor: \"#00f\",\n *         ballOpacity: 0.5,\n *         color: \"#00f\",\n *         interactive: true,\n *         opacity: 0.3,\n *         radius: 0.7,\n *     });\n *\n * markerComponent.add([defaultMarker, interactiveMarker]);\n * ```\n */\nexport class SimpleMarker extends Marker {\n    private _ballColor: number | string;\n    private _ballOpacity: number;\n    private _circleToRayAngle: number;\n    private _color: number | string;\n    private _interactive: boolean;\n    private _opacity: number;\n    private _radius: number;\n\n    constructor(id: string, latLon: ILatLon, options?: ISimpleMarkerOptions) {\n        super(id, latLon);\n\n        options = !!options ? options : {};\n        this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;\n        this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;\n        this._circleToRayAngle = 2;\n        this._color = options.color != null ? options.color : 0xff0000;\n        this._interactive = !!options.interactive;\n        this._opacity = options.opacity != null ? options.opacity : 0.4;\n        this._radius = options.radius != null ? options.radius : 1;\n    }\n\n    protected _createGeometry(position: number[]): void {\n        const radius: number = this._radius;\n        const cone: THREE.Mesh = new THREE.Mesh(\n            this._markerGeometry(radius, 8, 8),\n            new THREE.MeshBasicMaterial({\n                color: this._color,\n                opacity: this._opacity,\n                shading: THREE.SmoothShading,\n                transparent: true,\n            }));\n\n        cone.renderOrder = 1;\n\n        const ball: THREE.Mesh = new THREE.Mesh(\n            new THREE.SphereGeometry(radius / 2, 8, 8),\n            new THREE.MeshBasicMaterial({\n                color: this._ballColor,\n                opacity: this._ballOpacity,\n                shading: THREE.SmoothShading,\n                transparent: true,\n            }));\n\n        ball.position.z = this._markerHeight(radius);\n\n        const group: THREE.Object3D = new THREE.Object3D();\n        group.add(ball);\n        group.add(cone);\n        group.position.fromArray(position);\n\n        this._geometry = group;\n    }\n\n    protected _disposeGeometry(): void {\n        for (let mesh of <THREE.Mesh[]>this._geometry.children) {\n            mesh.geometry.dispose();\n            mesh.material.dispose();\n        }\n    }\n\n    protected _getInteractiveObjects(): THREE.Object3D[] {\n        return this._interactive ? [this._geometry.children[0]] : [];\n    }\n\n    private _markerHeight(radius: number): number {\n        let t: number = Math.tan(Math.PI - this._circleToRayAngle);\n        return radius * Math.sqrt(1 + t * t);\n    }\n\n    private _markerGeometry(radius: number, widthSegments: number, heightSegments: number ): THREE.Geometry {\n        let geometry: THREE.Geometry = new THREE.Geometry();\n\n        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);\n        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);\n        let height: number = this._markerHeight(radius);\n\n        let vertices: any[] = [];\n\n        for (let y: number = 0; y <= heightSegments; ++y) {\n\n            let verticesRow: any[] = [];\n\n            for (let x: number = 0; x <= widthSegments; ++x) {\n                let u: number = x / widthSegments * Math.PI * 2;\n                let v: number = y / heightSegments * Math.PI;\n\n                let r: number;\n                if (v < this._circleToRayAngle) {\n                    r = radius;\n                } else {\n                    let t: number = Math.tan(v - this._circleToRayAngle);\n                    r = radius * Math.sqrt(1 + t * t);\n                }\n\n                let vertex: THREE.Vector3 = new THREE.Vector3();\n                vertex.x = r * Math.cos(u) * Math.sin(v);\n                vertex.y = r * Math.sin(u) * Math.sin(v);\n                vertex.z = r * Math.cos(v) + height;\n\n                geometry.vertices.push(vertex);\n                verticesRow.push(geometry.vertices.length - 1);\n            }\n            vertices.push(verticesRow);\n        }\n\n        for (let y: number = 0; y < heightSegments; ++y) {\n            for (let x: number = 0; x < widthSegments; ++x) {\n                let v1: number = vertices[y][x + 1];\n                let v2: number = vertices[y][x];\n                let v3: number = vertices[y + 1][x];\n                let v4: number = vertices[y + 1][x + 1];\n\n                let n1: THREE.Vector3 = geometry.vertices[v1].clone().normalize();\n                let n2: THREE.Vector3 = geometry.vertices[v2].clone().normalize();\n                let n3: THREE.Vector3 = geometry.vertices[v3].clone().normalize();\n                let n4: THREE.Vector3 = geometry.vertices[v4].clone().normalize();\n\n                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));\n                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));\n            }\n        }\n\n        geometry.computeFaceNormals();\n        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);\n\n        return geometry;\n    }\n}\n\nexport default SimpleMarker;\n",
+    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../../../API\";\nimport {\n    ISimpleMarkerOptions,\n    Marker,\n} from \"../../../Component\";\n\n/**\n * @class SimpleMarker\n *\n * @classdesc Interactive marker with ice cream shape. The sphere\n * inside the ice cream can be configured to be interactive.\n *\n * Simple marker properties can not be updated after creation.\n *\n * To create and add one `SimpleMarker` with default configuration\n * (non-interactive) and one interactive with configuration use\n *\n * @example\n * ```\n * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(\n *     \"id-1\",\n *     { lat: 0, lon: 0, });\n *\n * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(\n *     \"id-2\",\n *     { lat: 0, lon: 0, },\n *     {\n *         ballColor: \"#00f\",\n *         ballOpacity: 0.5,\n *         color: \"#00f\",\n *         interactive: true,\n *         opacity: 0.3,\n *         radius: 0.7,\n *     });\n *\n * markerComponent.add([defaultMarker, interactiveMarker]);\n * ```\n */\nexport class SimpleMarker extends Marker {\n    private _ballColor: number | string;\n    private _ballOpacity: number;\n    private _circleToRayAngle: number;\n    private _color: number | string;\n    private _interactive: boolean;\n    private _opacity: number;\n    private _radius: number;\n\n    constructor(id: string, latLon: ILatLon, options?: ISimpleMarkerOptions) {\n        super(id, latLon);\n\n        options = !!options ? options : {};\n        this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;\n        this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;\n        this._circleToRayAngle = 2;\n        this._color = options.color != null ? options.color : 0xff0000;\n        this._interactive = !!options.interactive;\n        this._opacity = options.opacity != null ? options.opacity : 0.4;\n        this._radius = options.radius != null ? options.radius : 1;\n    }\n\n    protected _createGeometry(position: number[]): void {\n        const radius: number = this._radius;\n        const cone: THREE.Mesh = new THREE.Mesh(\n            this._markerGeometry(radius, 8, 8),\n            new THREE.MeshBasicMaterial({\n                color: this._color,\n                opacity: this._opacity,\n                transparent: true,\n            }));\n\n        cone.renderOrder = 1;\n\n        const ball: THREE.Mesh = new THREE.Mesh(\n            new THREE.SphereGeometry(radius / 2, 8, 8),\n            new THREE.MeshBasicMaterial({\n                color: this._ballColor,\n                opacity: this._ballOpacity,\n                transparent: true,\n            }));\n\n        ball.position.z = this._markerHeight(radius);\n\n        const group: THREE.Object3D = new THREE.Object3D();\n        group.add(ball);\n        group.add(cone);\n        group.position.fromArray(position);\n\n        this._geometry = group;\n    }\n\n    protected _disposeGeometry(): void {\n        for (let mesh of <THREE.Mesh[]>this._geometry.children) {\n            mesh.geometry.dispose();\n            mesh.material.dispose();\n        }\n    }\n\n    protected _getInteractiveObjects(): THREE.Object3D[] {\n        return this._interactive ? [this._geometry.children[0]] : [];\n    }\n\n    private _markerHeight(radius: number): number {\n        let t: number = Math.tan(Math.PI - this._circleToRayAngle);\n        return radius * Math.sqrt(1 + t * t);\n    }\n\n    private _markerGeometry(radius: number, widthSegments: number, heightSegments: number): THREE.Geometry {\n        let geometry: THREE.Geometry = new THREE.Geometry();\n\n        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);\n        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);\n        let height: number = this._markerHeight(radius);\n\n        let vertices: any[] = [];\n\n        for (let y: number = 0; y <= heightSegments; ++y) {\n\n            let verticesRow: any[] = [];\n\n            for (let x: number = 0; x <= widthSegments; ++x) {\n                let u: number = x / widthSegments * Math.PI * 2;\n                let v: number = y / heightSegments * Math.PI;\n\n                let r: number;\n                if (v < this._circleToRayAngle) {\n                    r = radius;\n                } else {\n                    let t: number = Math.tan(v - this._circleToRayAngle);\n                    r = radius * Math.sqrt(1 + t * t);\n                }\n\n                let vertex: THREE.Vector3 = new THREE.Vector3();\n                vertex.x = r * Math.cos(u) * Math.sin(v);\n                vertex.y = r * Math.sin(u) * Math.sin(v);\n                vertex.z = r * Math.cos(v) + height;\n\n                geometry.vertices.push(vertex);\n                verticesRow.push(geometry.vertices.length - 1);\n            }\n            vertices.push(verticesRow);\n        }\n\n        for (let y: number = 0; y < heightSegments; ++y) {\n            for (let x: number = 0; x < widthSegments; ++x) {\n                let v1: number = vertices[y][x + 1];\n                let v2: number = vertices[y][x];\n                let v3: number = vertices[y + 1][x];\n                let v4: number = vertices[y + 1][x + 1];\n\n                let n1: THREE.Vector3 = geometry.vertices[v1].clone().normalize();\n                let n2: THREE.Vector3 = geometry.vertices[v2].clone().normalize();\n                let n3: THREE.Vector3 = geometry.vertices[v3].clone().normalize();\n                let n4: THREE.Vector3 = geometry.vertices[v4].clone().normalize();\n\n                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));\n                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));\n            }\n        }\n\n        geometry.computeFaceNormals();\n        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);\n\n        return geometry;\n    }\n}\n\nexport default SimpleMarker;\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Spatial,\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    RenderCamera,\n} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `BounceHandler` ensures that the viewer bounces back to the image\n * when drag panning outside of the image edge.\n */\nexport class BounceHandler extends HandlerBase<IMouseConfiguration> {\n    private _spatial: Spatial;\n    private _viewportCoords: ViewportCoords;\n\n    private _basicDistanceThreshold: number;\n    private _basicRotationThreshold: number;\n    private _bounceCoeff: number;\n\n    private _bounceSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords,\n        spatial: Spatial) {\n        super(component, container, navigator);\n\n        this._spatial = spatial;\n        this._viewportCoords = viewportCoords;\n\n        this._basicDistanceThreshold = 1e-3;\n        this._basicRotationThreshold = 5e-2;\n        this._bounceCoeff = 1e-1;\n    }\n\n    protected _enable(): void {\n        const inTransition$: Observable<boolean> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): boolean => {\n                    return frame.state.alpha < 1;\n                });\n\n        this._bounceSubscription = Observable\n            .combineLatest(\n                inTransition$,\n                this._navigator.stateService.inTranslation$,\n                this._container.mouseService.active$,\n                this._container.touchService.active$)\n            .map(\n                (noForce: boolean[]): boolean => {\n                    return noForce[0] || noForce[1] || noForce[2] || noForce[3];\n                })\n            .distinctUntilChanged()\n            .switchMap(\n                (noForce: boolean): Observable<[RenderCamera, Transform]> => {\n                    return noForce ?\n                        Observable.empty() :\n                        Observable.combineLatest(\n                            this._container.renderService.renderCamera$,\n                            this._navigator.stateService.currentTransform$.first());\n                })\n            .subscribe(\n                (args: [RenderCamera, Transform]): void => {\n                    let renderCamera: RenderCamera = args[0];\n                    let perspectiveCamera: THREE.PerspectiveCamera = renderCamera.perspective;\n                    let transform: Transform = args[1];\n\n                    if (!transform.hasValidScale && renderCamera.camera.focal < 0.1) {\n                        return;\n                    }\n\n                    if (renderCamera.perspective.aspect === 0 || renderCamera.perspective.aspect === Number.POSITIVE_INFINITY) {\n                        return;\n                    }\n\n                    let distanceThreshold: number = this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom);\n                    let basicCenter: number[] = this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera);\n\n                    if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) {\n                        return;\n                    }\n\n                    let basicDistances: number[] = this._viewportCoords.getBasicDistances(transform, perspectiveCamera);\n                    let basicX: number = 0;\n                    let basicY: number = 0;\n\n                    if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold &&\n                        basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) {\n                        return;\n                    }\n\n                    if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold &&\n                        Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) {\n                        return;\n                    }\n\n                    let coeff: number = this._bounceCoeff;\n\n                    if (basicDistances[1] > 0 && basicDistances[3] === 0) {\n                        basicX = -coeff * basicDistances[1];\n                    } else if (basicDistances[1] === 0 && basicDistances[3] > 0) {\n                        basicX = coeff * basicDistances[3];\n                    } else if (basicDistances[1] > 0 && basicDistances[3] > 0) {\n                        basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2;\n                    }\n\n                    if (basicDistances[0] > 0 && basicDistances[2] === 0) {\n                        basicY = coeff * basicDistances[0];\n                    } else if (basicDistances[0] === 0 && basicDistances[2] > 0) {\n                        basicY = -coeff * basicDistances[2];\n                    } else if (basicDistances[0] > 0 && basicDistances[2] > 0) {\n                        basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2;\n                    }\n\n                    let rotationThreshold: number = this._basicRotationThreshold;\n\n                    basicX = this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold);\n                    basicY = this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold);\n\n                    this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]);\n                });\n    }\n\n    protected _disable(): void {\n        this._bounceSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { };\n    }\n}\n\nexport default BounceHandler;\n",
-    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n    ClientTouch,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the viewer photo at a point by double clicking.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.doubleClickZoom.disable();\n * mouseComponent.doubleClickZoom.enable();\n *\n * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;\n * ```\n */\nexport class DoubleClickZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._zoomSubscription = Observable\n            .merge(\n                this._container.mouseService\n                    .filtered$(this._component.name, this._container.mouseService.dblClick$),\n                this._container.touchService.doubleTap$\n                    .map(\n                        (e: TouchEvent): ClientTouch => {\n                            let touch: Touch = e.touches[0];\n                            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };\n                        }))\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([event, render, transform]: [MouseEvent | ClientTouch, RenderCamera, Transform]): void => {\n                    const element: HTMLElement = this._container.element;\n\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    const unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    const reference: number[] = transform.projectBasic(unprojected.toArray());\n                    const delta: number = !!(<{ shiftKey: boolean }>event).shiftKey ? -1 : 1;\n\n                    this._navigator.stateService.zoomIn(delta, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._zoomSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { doubleClickZoom: enable };\n    }\n}\n\nexport default DoubleClickZoomHandler;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/sample\";\nimport \"rxjs/add/operator/takeWhile\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n    MouseTouchPair,\n} from \"../../Component\";\nimport {\n    Camera,\n    Spatial,\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    RenderCamera,\n} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `DragPanHandler` allows the user to pan the viewer photo by clicking and dragging the cursor.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.dragPan.disable();\n * mouseComponent.dragPan.enable();\n *\n * var isEnabled = mouseComponent.dragPan.isEnabled;\n * ```\n */\nexport class DragPanHandler extends HandlerBase<IMouseConfiguration> {\n    private _spatial: Spatial;\n    private _viewportCoords: ViewportCoords;\n\n    private _basicRotationThreshold: number;\n    private _forceCoeff: number;\n\n    private _activeMouseSubscription: Subscription;\n    private _activeTouchSubscription: Subscription;\n    private _preventDefaultSubscription: Subscription;\n    private _rotateBasicSubscription: Subscription;\n    private _rotateBasicWithoutInertiaSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords,\n        spatial: Spatial) {\n        super(component, container, navigator);\n\n        this._spatial = spatial;\n        this._viewportCoords = viewportCoords;\n\n        this._basicRotationThreshold = 5e-2;\n        this._forceCoeff = 2e-1;\n    }\n\n    protected _enable(): void {\n        let draggingStarted$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)\n                .map(\n                    (event: MouseEvent): boolean => {\n                        return true;\n                    });\n\n        let draggingStopped$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)\n                .map(\n                    (event: Event): boolean => {\n                        return false;\n                    });\n\n        this._activeMouseSubscription = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .subscribe(this._container.mouseService.activate$);\n\n        this._preventDefaultSubscription = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .switchMap(\n                (dragging: boolean): Observable<MouseEvent> => {\n                    return dragging ?\n                        this._container.mouseService.documentMouseMove$ :\n                        Observable.empty<MouseEvent>();\n                })\n            .merge(this._container.touchService.touchMove$)\n            .subscribe(\n                (event: MouseEvent | TouchEvent): void => {\n                    event.preventDefault(); // prevent selection of content outside the viewer\n                });\n\n        let touchMovingStarted$: Observable<boolean> =\n            this._container.touchService.singleTouchDragStart$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return true;\n                    });\n\n        let touchMovingStopped$: Observable<boolean> =\n            this._container.touchService.singleTouchDragEnd$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return false;\n                    });\n\n        this._activeTouchSubscription = Observable\n            .merge(\n                touchMovingStarted$,\n                touchMovingStopped$)\n            .subscribe(this._container.touchService.activate$);\n\n        const basicRotation$: Observable<number[]> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): boolean => {\n                    return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;\n                })\n            .distinctUntilChanged()\n            .switchMap(\n                (enable: boolean): Observable<MouseTouchPair> => {\n                    if (!enable) {\n                        return Observable.empty<MouseTouchPair>();\n                    }\n\n                    const mouseDrag$: Observable<[MouseEvent, MouseEvent]> = this._container.mouseService\n                        .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)\n                        .switchMap(\n                            (mouseDragStart: MouseEvent): Observable<MouseEvent> => {\n                                return Observable\n                                    .of(mouseDragStart)\n                                    .concat(\n                                        this._container.mouseService\n                                            .filtered$(this._component.name, this._container.mouseService.mouseDrag$))\n                                    .merge(\n                                        this._container.mouseService\n                                            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)\n                                            .map(\n                                                (e: Event): MouseEvent => {\n                                                    return null;\n                                                }))\n                                    .takeWhile(\n                                        (e: MouseEvent): boolean => {\n                                            return !!e;\n                                        })\n                                    .startWith(null);\n                            })\n                        .pairwise()\n                        .filter(\n                            (pair: [MouseEvent, MouseEvent]): boolean => {\n                                return pair[0] != null && pair[1] != null;\n                            });\n\n                    const singleTouchDrag$: Observable<[Touch, Touch]> = Observable\n                        .merge(\n                            this._container.touchService.singleTouchDragStart$,\n                            this._container.touchService.singleTouchDrag$,\n                            this._container.touchService.singleTouchDragEnd$.map((t: TouchEvent): TouchEvent => { return null; }))\n                        .map(\n                            (event: TouchEvent): Touch => {\n                                return event != null && event.touches.length > 0 ?\n                                    event.touches[0] : null;\n                            })\n                        .pairwise()\n                        .filter(\n                            (pair: [Touch, Touch]): boolean => {\n                                return pair[0] != null && pair[1] != null;\n                            });\n\n                    return Observable\n                        .merge(\n                            mouseDrag$,\n                            singleTouchDrag$);\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$,\n                this._navigator.stateService.currentCamera$)\n            .map(\n                ([events, render, transform, c]: [MouseTouchPair, RenderCamera, Transform, Camera]): number[] => {\n                    let camera: Camera = c.clone();\n\n                    let previousEvent: MouseEvent | Touch = events[0];\n                    let event: MouseEvent | Touch = events[1];\n\n                    let movementX: number = event.clientX - previousEvent.clientX;\n                    let movementY: number = event.clientY - previousEvent.clientY;\n\n                    let element: HTMLElement = this._container.element;\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    let currentDirection: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let directionX: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX - movementX,\n                            canvasY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let directionY: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY - movementY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let deltaPhi: number = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);\n                    let deltaTheta: number = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);\n\n                    let upQuaternion: THREE.Quaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));\n                    let upQuaternionInverse: THREE.Quaternion = upQuaternion.clone().inverse();\n\n                    let offset: THREE.Vector3 = new THREE.Vector3();\n                    offset.copy(camera.lookat).sub(camera.position);\n                    offset.applyQuaternion(upQuaternion);\n                    let length: number = offset.length();\n\n                    let phi: number = Math.atan2(offset.y, offset.x);\n                    phi += deltaPhi;\n\n                    let theta: number = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);\n                    theta += deltaTheta;\n                    theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta));\n\n                    offset.x = Math.sin(theta) * Math.cos(phi);\n                    offset.y = Math.sin(theta) * Math.sin(phi);\n                    offset.z = Math.cos(theta);\n                    offset.applyQuaternion(upQuaternionInverse);\n\n                    let lookat: THREE.Vector3 = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length));\n\n                    let basic: number[] = transform.projectBasic(lookat.toArray());\n                    let original: number[] = transform.projectBasic(camera.lookat.toArray());\n\n                    let x: number = basic[0] - original[0];\n                    let y: number = basic[1] - original[1];\n\n                    if (Math.abs(x) > 1) {\n                        x = 0;\n                    } else if (x > 0.5) {\n                        x = x - 1;\n                    } else if (x < -0.5) {\n                        x = x + 1;\n                    }\n\n                    let rotationThreshold: number = this._basicRotationThreshold;\n\n                    x = this._spatial.clamp(x, -rotationThreshold, rotationThreshold);\n                    y = this._spatial.clamp(y, -rotationThreshold, rotationThreshold);\n\n                    if (transform.fullPano) {\n                        return [x, y];\n                    }\n\n                    let pixelDistances: number[] =\n                        this._viewportCoords.getPixelDistances(\n                            this._container.element,\n                            transform,\n                            render.perspective);\n\n                    let coeff: number = this._forceCoeff;\n\n                    if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) {\n                        y /= Math.max(1, coeff * pixelDistances[0]);\n                    }\n\n                    if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) {\n                        x /= Math.max(1, coeff * pixelDistances[1]);\n                    }\n\n                    if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) {\n                        y /= Math.max(1, coeff * pixelDistances[2]);\n                    }\n\n                    if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) {\n                        x /= Math.max(1, coeff * pixelDistances[3]);\n                    }\n\n                    return [x, y];\n                })\n            .share();\n\n        this._rotateBasicWithoutInertiaSubscription = basicRotation$\n            .subscribe(\n                (basicRotation: number[]): void => {\n                    this._navigator.stateService.rotateBasicWithoutInertia(basicRotation);\n                });\n\n        this._rotateBasicSubscription = basicRotation$\n            .scan(\n                (rotationBuffer: [number, number[]][], rotation: number[]): [number, number[]][] => {\n                    this._drainBuffer(rotationBuffer);\n\n                    rotationBuffer.push([Date.now(), rotation]);\n\n                    return rotationBuffer;\n                },\n                [])\n            .sample(\n                Observable\n                    .merge(\n                        this._container.mouseService.filtered$(\n                            this._component.name,\n                            this._container.mouseService.mouseDragEnd$),\n                        this._container.touchService.singleTouchDragEnd$))\n            .map(\n                (rotationBuffer: [number, number[]][]): number[] => {\n                    const drainedBuffer: [number, number[]][] = this._drainBuffer(rotationBuffer.slice());\n                    const basicRotation: number[] = [0, 0];\n\n                    for (const rotation of drainedBuffer) {\n                        basicRotation[0] += rotation[1][0];\n                        basicRotation[1] += rotation[1][1];\n                    }\n\n                    const count: number = drainedBuffer.length;\n                    if (count > 0) {\n                        basicRotation[0] /= count;\n                        basicRotation[1] /= count;\n                    }\n\n                    return basicRotation;\n                })\n            .subscribe(\n                (basicRotation: number[]): void => {\n                    this._navigator.stateService.rotateBasic(basicRotation);\n                });\n    }\n\n    protected _disable(): void {\n        this._activeMouseSubscription.unsubscribe();\n        this._activeTouchSubscription.unsubscribe();\n        this._preventDefaultSubscription.unsubscribe();\n        this._rotateBasicSubscription.unsubscribe();\n        this._rotateBasicWithoutInertiaSubscription.unsubscribe();\n\n        this._activeMouseSubscription = null;\n        this._activeTouchSubscription = null;\n        this._preventDefaultSubscription = null;\n        this._rotateBasicSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { dragPan: enable };\n    }\n\n    private _drainBuffer<T>(buffer: [number, T][]): [number, T][] {\n        const cutoff: number = 50;\n        const now: number = Date.now();\n\n        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {\n            buffer.shift();\n        }\n\n        return buffer;\n    }\n}\n\nexport default DragPanHandler;\n",
-    "import {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/merge\";\n\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    BounceHandler,\n    ComponentService,\n    Component,\n    DoubleClickZoomHandler,\n    DragPanHandler,\n    IMouseConfiguration,\n    ScrollZoomHandler,\n    TouchZoomHandler,\n} from \"../../Component\";\nimport {\n    ViewportCoords,\n    Spatial,\n} from \"../../Geo\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class MouseComponent\n *\n * @classdesc Component handling mouse and touch events for camera movement.\n */\nexport class MouseComponent extends Component<IMouseConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"mouse\";\n\n    private _viewportCoords: ViewportCoords;\n    private _spatial: Spatial;\n\n    private _bounceHandler: BounceHandler;\n    private _doubleClickZoomHandler: DoubleClickZoomHandler;\n    private _dragPanHandler: DragPanHandler;\n    private _scrollZoomHandler: ScrollZoomHandler;\n    private _touchZoomHandler: TouchZoomHandler;\n\n    private _configurationSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        let spatial: Spatial = new Spatial();\n        let viewportCoords: ViewportCoords = new ViewportCoords();\n\n        this._spatial = spatial;\n        this._viewportCoords = viewportCoords;\n\n        this._bounceHandler = new BounceHandler(this, container, navigator, viewportCoords, spatial);\n        this._doubleClickZoomHandler = new DoubleClickZoomHandler(this, container, navigator, viewportCoords);\n        this._dragPanHandler = new DragPanHandler(this, container, navigator, viewportCoords, spatial);\n        this._scrollZoomHandler = new ScrollZoomHandler(this, container, navigator, viewportCoords);\n        this._touchZoomHandler = new TouchZoomHandler(this, container, navigator, viewportCoords);\n    }\n\n    /**\n     * Get double click zoom.\n     *\n     * @returns {DoubleClickZoomHandler} The double click zoom handler.\n     */\n    public get doubleClickZoom(): DoubleClickZoomHandler {\n        return this._doubleClickZoomHandler;\n    }\n\n    /**\n     * Get drag pan.\n     *\n     * @returns {DragPanHandler} The drag pan handler.\n     */\n    public get dragPan(): DragPanHandler {\n        return this._dragPanHandler;\n    }\n\n    /**\n     * Get scroll zoom.\n     *\n     * @returns {ScrollZoomHandler} The scroll zoom handler.\n     */\n    public get scrollZoom(): ScrollZoomHandler {\n        return this._scrollZoomHandler;\n    }\n\n    /**\n     * Get touch zoom.\n     *\n     * @returns {TouchZoomHandler} The touch zoom handler.\n     */\n    public get touchZoom(): TouchZoomHandler {\n        return this._touchZoomHandler;\n    }\n\n    protected _activate(): void {\n        this._bounceHandler.enable();\n\n        this._configurationSubscription = this._configuration$\n            .subscribe(\n                (configuration: IMouseConfiguration): void => {\n                    if (configuration.doubleClickZoom) {\n                        this._doubleClickZoomHandler.enable();\n                    } else {\n                        this._doubleClickZoomHandler.disable();\n                    }\n\n                    if (configuration.dragPan) {\n                        this._dragPanHandler.enable();\n                    } else {\n                        this._dragPanHandler.disable();\n                    }\n\n                    if (configuration.scrollZoom) {\n                        this._scrollZoomHandler.enable();\n                    } else {\n                        this._scrollZoomHandler.disable();\n                    }\n\n                    if (configuration.touchZoom) {\n                        this._touchZoomHandler.enable();\n                    } else {\n                        this._touchZoomHandler.disable();\n                    }\n                });\n\n        this._container.mouseService.claimMouse(this._name, 0);\n    }\n\n    protected _deactivate(): void {\n        this._container.mouseService.unclaimMouse(this._name);\n\n        this._configurationSubscription.unsubscribe();\n\n        this._bounceHandler.disable();\n        this._doubleClickZoomHandler.disable();\n        this._dragPanHandler.disable();\n        this._scrollZoomHandler.disable();\n        this._touchZoomHandler.disable();\n    }\n\n    protected _getDefaultConfiguration(): IMouseConfiguration {\n        return { doubleClickZoom: true, dragPan: true, scrollZoom: true, touchZoom: true };\n    }\n}\n\nComponentService.register(MouseComponent);\nexport default MouseComponent;\n",
-    "import {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the viewer photo by scrolling.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.scrollZoom.disable();\n * mouseComponent.scrollZoom.enable();\n *\n * var isEnabled = mouseComponent.scrollZoom.isEnabled;\n * ```\n */\nexport class ScrollZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _preventDefaultSubscription: Subscription;\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._container.mouseService.claimWheel(this._component.name, 0);\n\n        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$\n            .subscribe(\n                (event: WheelEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._zoomSubscription = this._container.mouseService\n            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$)\n            .withLatestFrom(\n                this._navigator.stateService.currentState$,\n                (w: WheelEvent, f: IFrame): [WheelEvent, IFrame] => {\n                    return [w, f];\n                })\n            .filter(\n                (args: [WheelEvent, IFrame]): boolean => {\n                    let state: ICurrentState = args[1].state;\n                    return state.currentNode.fullPano || state.nodesAhead < 1;\n                })\n            .map(\n                (args: [WheelEvent, IFrame]): WheelEvent => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$,\n                (w: WheelEvent, r: RenderCamera, t: Transform): [WheelEvent, RenderCamera, Transform] => {\n                    return [w, r, t];\n                })\n            .subscribe(\n                (args: [WheelEvent, RenderCamera, Transform]): void => {\n                    let event: WheelEvent = args[0];\n                    let render: RenderCamera = args[1];\n                    let transform: Transform = args[2];\n\n                    let element: HTMLElement = this._container.element;\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    let unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    let reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    let deltaY: number = event.deltaY;\n                    if (event.deltaMode === 1) {\n                        deltaY = 40 * deltaY;\n                    } else if (event.deltaMode === 2) {\n                        deltaY = 800 * deltaY;\n                    }\n\n                    const canvasSize: number[] = this._viewportCoords.containerToCanvas(element);\n\n                    let zoom: number = -3 * deltaY / canvasSize[1];\n\n                    this._navigator.stateService.zoomIn(zoom, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._container.mouseService.unclaimWheel(this._component.name);\n\n        this._preventDefaultSubscription.unsubscribe();\n        this._zoomSubscription.unsubscribe();\n\n        this._preventDefaultSubscription = null;\n        this._zoomSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { scrollZoom: enable };\n    }\n}\n\nexport default ScrollZoomHandler;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    IPinch,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `TouchZoomHandler` allows the user to zoom the viewer photo by pinching on a touchscreen.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.touchZoom.disable();\n * mouseComponent.touchZoom.enable();\n *\n * var isEnabled = mouseComponent.touchZoom.isEnabled;\n * ```\n */\nexport class TouchZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _activeSubscription: Subscription;\n    private _preventDefaultSubscription: Subscription;\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._preventDefaultSubscription = this._container.touchService.pinch$\n            .subscribe(\n                (pinch: IPinch): void => {\n                    pinch.originalEvent.preventDefault();\n                });\n\n        let pinchStarted$: Observable<boolean> =\n            this._container.touchService.pinchStart$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return true;\n                    });\n\n        let pinchStopped$: Observable<boolean> =\n            this._container.touchService.pinchEnd$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return false;\n                    });\n\n        this._activeSubscription = Observable\n            .merge(\n                pinchStarted$,\n                pinchStopped$)\n            .subscribe(this._container.touchService.activate$);\n\n        this._zoomSubscription = this._container.touchService.pinch$\n            .withLatestFrom(this._navigator.stateService.currentState$)\n            .filter(\n                (args: [IPinch, IFrame]): boolean => {\n                    let state: ICurrentState = args[1].state;\n                    return state.currentNode.fullPano || state.nodesAhead < 1;\n                })\n            .map(\n                (args: [IPinch, IFrame]): IPinch => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([pinch, render, transform]: [IPinch, RenderCamera, Transform]): void => {\n                    let element: HTMLElement = this._container.element;\n\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(pinch, element);\n\n                    let unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    let reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    const [canvasWidth, canvasHeight]: number[] = this._viewportCoords.containerToCanvas(element);\n                    let zoom: number = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);\n\n                    this._navigator.stateService.zoomIn(zoom, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._activeSubscription.unsubscribe();\n        this._preventDefaultSubscription.unsubscribe();\n        this._zoomSubscription.unsubscribe();\n\n        this._preventDefaultSubscription = null;\n        this._zoomSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { touchZoom: enable };\n    }\n}\n\nexport default TouchZoomHandler;\n",
+    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n    ClientTouch,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.doubleClickZoom.disable();\n * mouseComponent.doubleClickZoom.enable();\n *\n * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;\n * ```\n */\nexport class DoubleClickZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._zoomSubscription = Observable\n            .merge(\n                this._container.mouseService\n                    .filtered$(this._component.name, this._container.mouseService.dblClick$),\n                this._container.touchService.doubleTap$\n                    .map(\n                        (e: TouchEvent): ClientTouch => {\n                            let touch: Touch = e.touches[0];\n                            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };\n                        }))\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([event, render, transform]: [MouseEvent | ClientTouch, RenderCamera, Transform]): void => {\n                    const element: HTMLElement = this._container.element;\n\n                    const [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    const unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    const reference: number[] = transform.projectBasic(unprojected.toArray());\n                    const delta: number = !!(<{ shiftKey: boolean }>event).shiftKey ? -1 : 1;\n\n                    this._navigator.stateService.zoomIn(delta, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._zoomSubscription.unsubscribe();\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { doubleClickZoom: enable };\n    }\n}\n\nexport default DoubleClickZoomHandler;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/sample\";\nimport \"rxjs/add/operator/takeWhile\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n    MouseTouchPair,\n} from \"../../Component\";\nimport {\n    Camera,\n    Spatial,\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    RenderCamera,\n} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.dragPan.disable();\n * mouseComponent.dragPan.enable();\n *\n * var isEnabled = mouseComponent.dragPan.isEnabled;\n * ```\n */\nexport class DragPanHandler extends HandlerBase<IMouseConfiguration> {\n    private _spatial: Spatial;\n    private _viewportCoords: ViewportCoords;\n\n    private _basicRotationThreshold: number;\n    private _forceCoeff: number;\n\n    private _activeMouseSubscription: Subscription;\n    private _activeTouchSubscription: Subscription;\n    private _preventDefaultSubscription: Subscription;\n    private _rotateBasicSubscription: Subscription;\n    private _rotateBasicWithoutInertiaSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords,\n        spatial: Spatial) {\n        super(component, container, navigator);\n\n        this._spatial = spatial;\n        this._viewportCoords = viewportCoords;\n\n        this._basicRotationThreshold = 5e-2;\n        this._forceCoeff = 2e-1;\n    }\n\n    protected _enable(): void {\n        let draggingStarted$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)\n                .map(\n                    (event: MouseEvent): boolean => {\n                        return true;\n                    })\n                .share();\n\n        let draggingStopped$: Observable<boolean> =\n             this._container.mouseService\n                .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)\n                .map(\n                    (event: Event): boolean => {\n                        return false;\n                    })\n                .share();\n\n        this._activeMouseSubscription = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .subscribe(this._container.mouseService.activate$);\n\n        this._preventDefaultSubscription = Observable\n            .merge(\n                draggingStarted$,\n                draggingStopped$)\n            .switchMap(\n                (dragging: boolean): Observable<MouseEvent> => {\n                    return dragging ?\n                        this._container.mouseService.documentMouseMove$ :\n                        Observable.empty<MouseEvent>();\n                })\n            .merge(this._container.touchService.touchMove$)\n            .subscribe(\n                (event: MouseEvent | TouchEvent): void => {\n                    event.preventDefault(); // prevent selection of content outside the viewer\n                });\n\n        let touchMovingStarted$: Observable<boolean> =\n            this._container.touchService.singleTouchDragStart$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return true;\n                    });\n\n        let touchMovingStopped$: Observable<boolean> =\n            this._container.touchService.singleTouchDragEnd$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return false;\n                    });\n\n        this._activeTouchSubscription = Observable\n            .merge(\n                touchMovingStarted$,\n                touchMovingStopped$)\n            .subscribe(this._container.touchService.activate$);\n\n        const basicRotation$: Observable<number[]> = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): boolean => {\n                    return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;\n                })\n            .distinctUntilChanged()\n            .switchMap(\n                (enable: boolean): Observable<MouseTouchPair> => {\n                    if (!enable) {\n                        return Observable.empty<MouseTouchPair>();\n                    }\n\n                    const mouseDrag$: Observable<[MouseEvent, MouseEvent]> = this._container.mouseService\n                        .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)\n                        .switchMap(\n                            (mouseDragStart: MouseEvent): Observable<MouseEvent> => {\n                                return Observable\n                                    .of(mouseDragStart)\n                                    .concat(\n                                        this._container.mouseService\n                                            .filtered$(this._component.name, this._container.mouseService.mouseDrag$))\n                                    .merge(\n                                        this._container.mouseService\n                                            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)\n                                            .map(\n                                                (e: Event): MouseEvent => {\n                                                    return null;\n                                                }))\n                                    .takeWhile(\n                                        (e: MouseEvent): boolean => {\n                                            return !!e;\n                                        })\n                                    .startWith(null);\n                            })\n                        .pairwise()\n                        .filter(\n                            (pair: [MouseEvent, MouseEvent]): boolean => {\n                                return pair[0] != null && pair[1] != null;\n                            });\n\n                    const singleTouchDrag$: Observable<[Touch, Touch]> = Observable\n                        .merge(\n                            this._container.touchService.singleTouchDragStart$,\n                            this._container.touchService.singleTouchDrag$,\n                            this._container.touchService.singleTouchDragEnd$.map((t: TouchEvent): TouchEvent => { return null; }))\n                        .map(\n                            (event: TouchEvent): Touch => {\n                                return event != null && event.touches.length > 0 ?\n                                    event.touches[0] : null;\n                            })\n                        .pairwise()\n                        .filter(\n                            (pair: [Touch, Touch]): boolean => {\n                                return pair[0] != null && pair[1] != null;\n                            });\n\n                    return Observable\n                        .merge(\n                            mouseDrag$,\n                            singleTouchDrag$);\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$,\n                this._navigator.stateService.currentCamera$)\n            .map(\n                ([events, render, transform, c]: [MouseTouchPair, RenderCamera, Transform, Camera]): number[] => {\n                    let camera: Camera = c.clone();\n\n                    let previousEvent: MouseEvent | Touch = events[0];\n                    let event: MouseEvent | Touch = events[1];\n\n                    let movementX: number = event.clientX - previousEvent.clientX;\n                    let movementY: number = event.clientY - previousEvent.clientY;\n\n                    let element: HTMLElement = this._container.element;\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    let currentDirection: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let directionX: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX - movementX,\n                            canvasY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let directionY: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY - movementY,\n                            element,\n                            render.perspective)\n                                .sub(render.perspective.position);\n\n                    let deltaPhi: number = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);\n                    let deltaTheta: number = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);\n\n                    let upQuaternion: THREE.Quaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));\n                    let upQuaternionInverse: THREE.Quaternion = upQuaternion.clone().inverse();\n\n                    let offset: THREE.Vector3 = new THREE.Vector3();\n                    offset.copy(camera.lookat).sub(camera.position);\n                    offset.applyQuaternion(upQuaternion);\n                    let length: number = offset.length();\n\n                    let phi: number = Math.atan2(offset.y, offset.x);\n                    phi += deltaPhi;\n\n                    let theta: number = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);\n                    theta += deltaTheta;\n                    theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta));\n\n                    offset.x = Math.sin(theta) * Math.cos(phi);\n                    offset.y = Math.sin(theta) * Math.sin(phi);\n                    offset.z = Math.cos(theta);\n                    offset.applyQuaternion(upQuaternionInverse);\n\n                    let lookat: THREE.Vector3 = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length));\n\n                    let basic: number[] = transform.projectBasic(lookat.toArray());\n                    let original: number[] = transform.projectBasic(camera.lookat.toArray());\n\n                    let x: number = basic[0] - original[0];\n                    let y: number = basic[1] - original[1];\n\n                    if (Math.abs(x) > 1) {\n                        x = 0;\n                    } else if (x > 0.5) {\n                        x = x - 1;\n                    } else if (x < -0.5) {\n                        x = x + 1;\n                    }\n\n                    let rotationThreshold: number = this._basicRotationThreshold;\n\n                    x = this._spatial.clamp(x, -rotationThreshold, rotationThreshold);\n                    y = this._spatial.clamp(y, -rotationThreshold, rotationThreshold);\n\n                    if (transform.fullPano) {\n                        return [x, y];\n                    }\n\n                    let pixelDistances: number[] =\n                        this._viewportCoords.getPixelDistances(\n                            this._container.element,\n                            transform,\n                            render.perspective);\n\n                    let coeff: number = this._forceCoeff;\n\n                    if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) {\n                        y /= Math.max(1, coeff * pixelDistances[0]);\n                    }\n\n                    if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) {\n                        x /= Math.max(1, coeff * pixelDistances[1]);\n                    }\n\n                    if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) {\n                        y /= Math.max(1, coeff * pixelDistances[2]);\n                    }\n\n                    if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) {\n                        x /= Math.max(1, coeff * pixelDistances[3]);\n                    }\n\n                    return [x, y];\n                })\n            .share();\n\n        this._rotateBasicWithoutInertiaSubscription = basicRotation$\n            .subscribe(\n                (basicRotation: number[]): void => {\n                    this._navigator.stateService.rotateBasicWithoutInertia(basicRotation);\n                });\n\n        this._rotateBasicSubscription = basicRotation$\n            .scan(\n                (rotationBuffer: [number, number[]][], rotation: number[]): [number, number[]][] => {\n                    this._drainBuffer(rotationBuffer);\n\n                    rotationBuffer.push([Date.now(), rotation]);\n\n                    return rotationBuffer;\n                },\n                [])\n            .sample(\n                Observable\n                    .merge(\n                        this._container.mouseService.filtered$(\n                            this._component.name,\n                            this._container.mouseService.mouseDragEnd$),\n                        this._container.touchService.singleTouchDragEnd$))\n            .map(\n                (rotationBuffer: [number, number[]][]): number[] => {\n                    const drainedBuffer: [number, number[]][] = this._drainBuffer(rotationBuffer.slice());\n                    const basicRotation: number[] = [0, 0];\n\n                    for (const rotation of drainedBuffer) {\n                        basicRotation[0] += rotation[1][0];\n                        basicRotation[1] += rotation[1][1];\n                    }\n\n                    const count: number = drainedBuffer.length;\n                    if (count > 0) {\n                        basicRotation[0] /= count;\n                        basicRotation[1] /= count;\n                    }\n\n                    return basicRotation;\n                })\n            .subscribe(\n                (basicRotation: number[]): void => {\n                    this._navigator.stateService.rotateBasic(basicRotation);\n                });\n    }\n\n    protected _disable(): void {\n        this._activeMouseSubscription.unsubscribe();\n        this._activeTouchSubscription.unsubscribe();\n        this._preventDefaultSubscription.unsubscribe();\n        this._rotateBasicSubscription.unsubscribe();\n        this._rotateBasicWithoutInertiaSubscription.unsubscribe();\n\n        this._activeMouseSubscription = null;\n        this._activeTouchSubscription = null;\n        this._preventDefaultSubscription = null;\n        this._rotateBasicSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { dragPan: enable };\n    }\n\n    private _drainBuffer<T>(buffer: [number, T][]): [number, T][] {\n        const cutoff: number = 50;\n        const now: number = Date.now();\n\n        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {\n            buffer.shift();\n        }\n\n        return buffer;\n    }\n}\n\nexport default DragPanHandler;\n",
+    "import {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/merge\";\n\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    BounceHandler,\n    ComponentService,\n    Component,\n    DoubleClickZoomHandler,\n    DragPanHandler,\n    IMouseConfiguration,\n    ScrollZoomHandler,\n    TouchZoomHandler,\n} from \"../../Component\";\nimport {\n    ViewportCoords,\n    Spatial,\n} from \"../../Geo\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class MouseComponent\n *\n * @classdesc Component handling mouse and touch events for camera movement.\n *\n * To retrive and use the mouse component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\");\n *\n * var mouseComponent = viewer.getComponent(\"mouse\");\n * ```\n */\nexport class MouseComponent extends Component<IMouseConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"mouse\";\n\n    private _bounceHandler: BounceHandler;\n    private _doubleClickZoomHandler: DoubleClickZoomHandler;\n    private _dragPanHandler: DragPanHandler;\n    private _scrollZoomHandler: ScrollZoomHandler;\n    private _touchZoomHandler: TouchZoomHandler;\n\n    private _configurationSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        const spatial: Spatial = new Spatial();\n        const viewportCoords: ViewportCoords = new ViewportCoords();\n\n        this._bounceHandler = new BounceHandler(this, container, navigator, viewportCoords, spatial);\n        this._doubleClickZoomHandler = new DoubleClickZoomHandler(this, container, navigator, viewportCoords);\n        this._dragPanHandler = new DragPanHandler(this, container, navigator, viewportCoords, spatial);\n        this._scrollZoomHandler = new ScrollZoomHandler(this, container, navigator, viewportCoords);\n        this._touchZoomHandler = new TouchZoomHandler(this, container, navigator, viewportCoords);\n    }\n\n    /**\n     * Get double click zoom.\n     *\n     * @returns {DoubleClickZoomHandler} The double click zoom handler.\n     */\n    public get doubleClickZoom(): DoubleClickZoomHandler {\n        return this._doubleClickZoomHandler;\n    }\n\n    /**\n     * Get drag pan.\n     *\n     * @returns {DragPanHandler} The drag pan handler.\n     */\n    public get dragPan(): DragPanHandler {\n        return this._dragPanHandler;\n    }\n\n    /**\n     * Get scroll zoom.\n     *\n     * @returns {ScrollZoomHandler} The scroll zoom handler.\n     */\n    public get scrollZoom(): ScrollZoomHandler {\n        return this._scrollZoomHandler;\n    }\n\n    /**\n     * Get touch zoom.\n     *\n     * @returns {TouchZoomHandler} The touch zoom handler.\n     */\n    public get touchZoom(): TouchZoomHandler {\n        return this._touchZoomHandler;\n    }\n\n    protected _activate(): void {\n        this._bounceHandler.enable();\n\n        this._configurationSubscription = this._configuration$\n            .subscribe(\n                (configuration: IMouseConfiguration): void => {\n                    if (configuration.doubleClickZoom) {\n                        this._doubleClickZoomHandler.enable();\n                    } else {\n                        this._doubleClickZoomHandler.disable();\n                    }\n\n                    if (configuration.dragPan) {\n                        this._dragPanHandler.enable();\n                    } else {\n                        this._dragPanHandler.disable();\n                    }\n\n                    if (configuration.scrollZoom) {\n                        this._scrollZoomHandler.enable();\n                    } else {\n                        this._scrollZoomHandler.disable();\n                    }\n\n                    if (configuration.touchZoom) {\n                        this._touchZoomHandler.enable();\n                    } else {\n                        this._touchZoomHandler.disable();\n                    }\n                });\n\n        this._container.mouseService.claimMouse(this._name, 0);\n    }\n\n    protected _deactivate(): void {\n        this._container.mouseService.unclaimMouse(this._name);\n\n        this._configurationSubscription.unsubscribe();\n\n        this._bounceHandler.disable();\n        this._doubleClickZoomHandler.disable();\n        this._dragPanHandler.disable();\n        this._scrollZoomHandler.disable();\n        this._touchZoomHandler.disable();\n    }\n\n    protected _getDefaultConfiguration(): IMouseConfiguration {\n        return { doubleClickZoom: true, dragPan: true, scrollZoom: true, touchZoom: true };\n    }\n}\n\nComponentService.register(MouseComponent);\nexport default MouseComponent;\n",
+    "import {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.scrollZoom.disable();\n * mouseComponent.scrollZoom.enable();\n *\n * var isEnabled = mouseComponent.scrollZoom.isEnabled;\n * ```\n */\nexport class ScrollZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _preventDefaultSubscription: Subscription;\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._container.mouseService.claimWheel(this._component.name, 0);\n\n        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$\n            .subscribe(\n                (event: WheelEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._zoomSubscription = this._container.mouseService\n            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$)\n            .withLatestFrom(\n                this._navigator.stateService.currentState$,\n                (w: WheelEvent, f: IFrame): [WheelEvent, IFrame] => {\n                    return [w, f];\n                })\n            .filter(\n                (args: [WheelEvent, IFrame]): boolean => {\n                    let state: ICurrentState = args[1].state;\n                    return state.currentNode.fullPano || state.nodesAhead < 1;\n                })\n            .map(\n                (args: [WheelEvent, IFrame]): WheelEvent => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$,\n                (w: WheelEvent, r: RenderCamera, t: Transform): [WheelEvent, RenderCamera, Transform] => {\n                    return [w, r, t];\n                })\n            .subscribe(\n                (args: [WheelEvent, RenderCamera, Transform]): void => {\n                    let event: WheelEvent = args[0];\n                    let render: RenderCamera = args[1];\n                    let transform: Transform = args[2];\n\n                    let element: HTMLElement = this._container.element;\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(event, element);\n\n                    let unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    let reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    let deltaY: number = event.deltaY;\n                    if (event.deltaMode === 1) {\n                        deltaY = 40 * deltaY;\n                    } else if (event.deltaMode === 2) {\n                        deltaY = 800 * deltaY;\n                    }\n\n                    const canvasSize: number[] = this._viewportCoords.containerToCanvas(element);\n\n                    let zoom: number = -3 * deltaY / canvasSize[1];\n\n                    this._navigator.stateService.zoomIn(zoom, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._container.mouseService.unclaimWheel(this._component.name);\n\n        this._preventDefaultSubscription.unsubscribe();\n        this._zoomSubscription.unsubscribe();\n\n        this._preventDefaultSubscription = null;\n        this._zoomSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { scrollZoom: enable };\n    }\n}\n\nexport default ScrollZoomHandler;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Component,\n    IMouseConfiguration,\n    HandlerBase,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {RenderCamera} from \"../../Render\";\nimport {\n    ICurrentState,\n    IFrame,\n} from \"../../State\";\nimport {\n    Container,\n    IPinch,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.\n *\n * @example\n * ```\n * var mouseComponent = viewer.getComponent(\"mouse\");\n *\n * mouseComponent.touchZoom.disable();\n * mouseComponent.touchZoom.enable();\n *\n * var isEnabled = mouseComponent.touchZoom.isEnabled;\n * ```\n */\nexport class TouchZoomHandler extends HandlerBase<IMouseConfiguration> {\n    private _viewportCoords: ViewportCoords;\n\n    private _activeSubscription: Subscription;\n    private _preventDefaultSubscription: Subscription;\n    private _zoomSubscription: Subscription;\n\n    constructor(\n        component: Component<IMouseConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords) {\n        super(component, container, navigator);\n\n        this._viewportCoords = viewportCoords;\n    }\n\n    protected _enable(): void {\n        this._preventDefaultSubscription = this._container.touchService.pinch$\n            .subscribe(\n                (pinch: IPinch): void => {\n                    pinch.originalEvent.preventDefault();\n                });\n\n        let pinchStarted$: Observable<boolean> =\n            this._container.touchService.pinchStart$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return true;\n                    });\n\n        let pinchStopped$: Observable<boolean> =\n            this._container.touchService.pinchEnd$\n                .map(\n                    (event: TouchEvent): boolean => {\n                        return false;\n                    });\n\n        this._activeSubscription = Observable\n            .merge(\n                pinchStarted$,\n                pinchStopped$)\n            .subscribe(this._container.touchService.activate$);\n\n        this._zoomSubscription = this._container.touchService.pinch$\n            .withLatestFrom(this._navigator.stateService.currentState$)\n            .filter(\n                (args: [IPinch, IFrame]): boolean => {\n                    let state: ICurrentState = args[1].state;\n                    return state.currentNode.fullPano || state.nodesAhead < 1;\n                })\n            .map(\n                (args: [IPinch, IFrame]): IPinch => {\n                    return args[0];\n                })\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([pinch, render, transform]: [IPinch, RenderCamera, Transform]): void => {\n                    let element: HTMLElement = this._container.element;\n\n                    let [canvasX, canvasY]: number[] = this._viewportCoords.canvasPosition(pinch, element);\n\n                    let unprojected: THREE.Vector3 =\n                        this._viewportCoords.unprojectFromCanvas(\n                            canvasX,\n                            canvasY,\n                            element,\n                            render.perspective);\n\n                    let reference: number[] = transform.projectBasic(unprojected.toArray());\n\n                    const [canvasWidth, canvasHeight]: number[] = this._viewportCoords.containerToCanvas(element);\n                    let zoom: number = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);\n\n                    this._navigator.stateService.zoomIn(zoom, reference);\n                });\n    }\n\n    protected _disable(): void {\n        this._activeSubscription.unsubscribe();\n        this._preventDefaultSubscription.unsubscribe();\n        this._zoomSubscription.unsubscribe();\n\n        this._preventDefaultSubscription = null;\n        this._zoomSubscription = null;\n    }\n\n    protected _getConfiguration(enable: boolean): IMouseConfiguration {\n        return { touchZoom: enable };\n    }\n}\n\nexport default TouchZoomHandler;\n",
     "export {Popup} from \"./popup/Popup\";\nexport {PopupComponent} from \"./PopupComponent\";\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ComponentService,\n    Component,\n    IComponentConfiguration,\n    Popup,\n} from \"../../Component\";\nimport {Transform} from \"../../Geo\";\nimport {\n    ISize,\n    RenderCamera,\n} from \"../../Render\";\nimport {DOM} from \"../../Utils\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class PopupComponent\n *\n * @classdesc Component for showing HTML popup objects.\n *\n * The `add` method is used for adding new popups. Popups are removed by reference.\n *\n * It is not possible to update popups in the set by updating any properties\n * directly on the popup object. Popups need to be replaced by\n * removing them and creating new ones with relevant changed properties and\n * adding those instead.\n *\n * Popups are only relevant to a single image because they are based on\n * 2D basic image coordinates. Popups related to a certain image should\n * be removed when the viewer is moved to another node.\n *\n * To retrive and use the popup component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\",\n *     { component: { popup: true } });\n *\n * var popupComponent = viewer.getComponent(\"popup\");\n * ```\n */\nexport class PopupComponent extends Component<IComponentConfiguration> {\n    public static componentName: string = \"popup\";\n\n    private _dom: DOM;\n\n    private _popupContainer: HTMLDivElement;\n    private _popups: Popup[];\n\n    private _added$: Subject<Popup[]>;\n    private _popups$: Subject<Popup[]>;\n\n    private _updateAllSubscription: Subscription;\n    private _updateAddedChangedSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator, dom?: DOM) {\n        super(name, container, navigator);\n\n        this._dom = !!dom ? dom : new DOM();\n\n        this._popups = [];\n\n        this._added$ = new Subject<Popup[]>();\n        this._popups$ = new Subject<Popup[]>();\n    }\n\n    /**\n     * Add popups to the popups set.\n     *\n     * @description Adding a new popup never replaces an old one\n     * because they are stored by reference. Adding an already\n     * existing popup has no effect.\n     *\n     * @param {Array<Popup>} popups - Popups to add.\n     *\n     * @example ```popupComponent.add([popup1, popup2]);```\n     */\n    public add(popups: Popup[]): void {\n        for (const popup of popups) {\n            if (this._popups.indexOf(popup) !== -1) {\n                continue;\n            }\n\n            this._popups.push(popup);\n\n            if (this._activated) {\n                popup.setParentContainer(this._popupContainer);\n            }\n        }\n\n        this._added$.next(popups);\n        this._popups$.next(this._popups);\n    }\n\n    /**\n     * Returns an array of all popups.\n     *\n     * @example ```var popups = popupComponent.getAll();```\n     */\n    public getAll(): Popup[] {\n        return this._popups.slice();\n    }\n\n    /**\n     * Remove popups based on reference from the popup set.\n     *\n     * @param {Array<Popup>} popups - Popups to remove.\n     *\n     * @example ```popupComponent.remove([popup1, popup2]);```\n     */\n    public remove(popups: Popup[]): void {\n        for (const popup of popups) {\n            this._remove(popup);\n        }\n\n        this._popups$.next(this._popups);\n    }\n\n    /**\n     * Remove all popups from the popup set.\n     *\n     * @example ```popupComponent.removeAll();```\n     */\n    public removeAll(): void {\n        for (const popup of this._popups.slice()) {\n            this._remove(popup);\n        }\n\n        this._popups$.next(this._popups);\n    }\n\n    protected _activate(): void {\n        this._popupContainer = this._dom.createElement(\"div\", \"mapillary-js-popup-container\", this._container.element) ;\n\n        for (const popup of this._popups) {\n            popup.setParentContainer(this._popupContainer);\n        }\n\n        this._updateAllSubscription = Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._container.renderService.size$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([renderCamera, size, transform]: [RenderCamera, ISize, Transform]): void => {\n                    for (const popup of this._popups) {\n                        popup.update(renderCamera, size, transform);\n                    }\n                });\n\n        const changed$: Observable<Popup[]> = this._popups$\n            .startWith(this._popups)\n            .switchMap(\n                (popups: Popup[]): Observable<Popup> => {\n                    return Observable\n                        .from(popups)\n                        .mergeMap(\n                            (popup: Popup): Observable<Popup> => {\n                                return popup.changed$;\n                            });\n                })\n            .map(\n                (popup: Popup): Popup[] => {\n                    return [popup];\n                });\n\n        this._updateAddedChangedSubscription = this._added$\n            .merge(changed$)\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._container.renderService.size$,\n                this._navigator.stateService.currentTransform$)\n            .subscribe(\n                ([popups, renderCamera, size, transform]: [Popup[], RenderCamera, ISize, Transform]): void => {\n                    for (const popup of popups) {\n                        popup.update(renderCamera, size, transform);\n                    }\n                });\n    }\n\n    protected _deactivate(): void {\n        this._updateAllSubscription.unsubscribe();\n        this._updateAddedChangedSubscription.unsubscribe();\n\n        for (const popup of this._popups) {\n            popup.remove();\n        }\n\n        this._container.element.removeChild(this._popupContainer);\n        delete this._popupContainer;\n    }\n\n    protected _getDefaultConfiguration(): IComponentConfiguration {\n        return {};\n    }\n\n    private _remove(popup: Popup): void {\n        const index: number = this._popups.indexOf(popup);\n        if (index === -1) {\n            return;\n        }\n\n        const removed: Popup = this._popups.splice(index, 1)[0];\n        if (this._activated) {\n            removed.remove();\n        }\n    }\n}\n\nComponentService.register(PopupComponent);\nexport default PopupComponent;\n",
-    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport {\n    IPopupOffset,\n    IPopupOptions,\n    PopupAlignment,\n} from \"../../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../../Geo\";\nimport {\n    ISize,\n    RenderCamera,\n} from \"../../../Render\";\nimport {DOM} from \"../../../Utils\";\nimport {Alignment} from \"../../../Viewer\";\n\n/**\n * @class Popup\n *\n * @classdesc Popup instance for rendering custom HTML content\n * on top of images. Popups are based on 2D basic image coordinates\n * (see the {@link Viewer} class documentation for more information about coordinate\n * systems) and a certain popup is therefore only relevant to a single image.\n * Popups related to a certain image should be removed when moving\n * to another image.\n *\n * A popup must have both its content and its point or rect set to be\n * rendered. Popup options can not be updated after creation but the\n * basic point or rect as well as its content can be changed by calling\n * the appropriate methods.\n *\n * To create and add one `Popup` with default configuration\n * (tooltip visuals and automatic float) and one with specific options\n * use\n *\n * @example\n * ```\n * var defaultSpan = document.createElement('span');\n * defaultSpan.innerHTML = 'hello default';\n *\n * var defaultPopup = new Mapillary.PopupComponent.Popup();\n * defaultPopup.setDOMContent(defaultSpan);\n * defaultPopup.setBasicPoint([0.3, 0.3]);\n *\n * var cleanSpan = document.createElement('span');\n * cleanSpan.innerHTML = 'hello clean';\n *\n * var cleanPopup = new Mapillary.PopupComponent.Popup({\n *     clean: true,\n *     float: Mapillary.Alignment.Top,\n *     offset: 10,\n *     opacity: 0.7,\n * });\n *\n * cleanPopup.setDOMContent(cleanSpan);\n * cleanPopup.setBasicPoint([0.6, 0.6]);\n *\n * popupComponent.add([defaultPopup, cleanPopup]);\n * ```\n *\n * @description Implementation of API methods and API documentation inspired\n * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js\n */\nexport class Popup {\n    protected _notifyChanged$: Subject<Popup>;\n\n    private _container: HTMLDivElement;\n    private _content: HTMLDivElement;\n    private _parentContainer: HTMLElement;\n    private _options: IPopupOptions;\n    private _tip: HTMLDivElement;\n\n    private _point: number[];\n    private _rect: number[];\n\n    private _dom: DOM;\n    private _viewportCoords: ViewportCoords;\n\n    constructor(options?: IPopupOptions, viewportCoords?: ViewportCoords, dom?: DOM) {\n        this._options = {};\n\n        if (!!options) {\n            this._options.capturePointer = options.capturePointer == null ? true : options.capturePointer;\n            this._options.clean = options.clean;\n            this._options.float = options.float;\n            this._options.offset = options.offset;\n            this._options.opacity = options.opacity;\n            this._options.position = options.position;\n        }\n\n        this._dom = !!dom ? dom : new DOM();\n        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords();\n\n        this._notifyChanged$ = new Subject<Popup>();\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal observable used by the component to\n     * render the popup when its position or content has changed.\n     */\n    public get changed$(): Observable<Popup> {\n        return this._notifyChanged$;\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method used by the component to\n     * remove all references to the popup.\n     */\n    public remove(): void {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._parentContainer) {\n            delete this._parentContainer;\n        }\n    }\n\n    /**\n     * Sets a 2D basic image coordinates point to the popup's anchor, and\n     * moves the popup to it.\n     *\n     * @description Overwrites any previously set point or rect.\n     *\n     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setBasicPoint(basicPoint: number[]): void {\n        this._point = basicPoint.slice();\n        this._rect = null;\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets a 2D basic image coordinates rect to the popup's anchor, and\n     * moves the popup to it.\n     *\n     * @description Overwrites any previously set point or rect.\n     *\n     * @param {Array<number>} basicRect - Rect in 2D basic image\n     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setBasicRect(basicRect: number[]): void {\n        this._rect = basicRect.slice();\n        this._point = null;\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets the popup's content to the element provided as a DOM node.\n     *\n     * @param {Node} htmlNode - A DOM node to be used as content for the popup.\n     *\n     * @example\n     * ```\n     * var div = document.createElement('div');\n     * div.innerHTML = 'hello image';\n     *\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setDOMContent(div);\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setDOMContent(htmlNode: Node): void {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        const className: string = \"mapillaryjs-popup-content\" +\n            (this._options.clean === true ? \"-clean\" : \"\") +\n            (this._options.capturePointer === true ? \" mapillaryjs-popup-capture-pointer\" : \"\");\n\n        this._content = this._dom.createElement(\"div\", className, this._container);\n\n        this._content.appendChild(htmlNode);\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets the popup's content to the HTML provided as a string.\n     *\n     * @description This method does not perform HTML filtering or sanitization,\n     * and must be used only with trusted content. Consider Popup#setText if the\n     * content is an untrusted text string.\n     *\n     * @param {string} html - A string representing HTML content for the popup.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setHTML('<div>hello image</div>');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setHTML(html: string): void {\n        const frag: DocumentFragment = this._dom.document.createDocumentFragment();\n        const temp: HTMLBodyElement = this._dom.createElement(\"body\");\n        let child: Node;\n        temp.innerHTML = html;\n\n        while (true) {\n            child = temp.firstChild;\n            if (!child) {\n                break;\n            }\n\n            frag.appendChild(child);\n        }\n\n        this.setDOMContent(frag);\n    }\n\n    /**\n     * Sets the popup's content to a string of text.\n     *\n     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.\n     * Use this method for security against XSS if the popup content is user-provided.\n     *\n     * @param {string} text - Textual content for the popup.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setText(text: string): void {\n        this.setDOMContent(this._dom.document.createTextNode(text));\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method for attaching the popup to\n     * its parent container so that it is rendered in the DOM tree.\n     */\n    public setParentContainer(parentContainer: HTMLElement): void {\n        this._parentContainer = parentContainer;\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method for updating the rendered\n     * position of the popup called by the popup component.\n     */\n    public update(renderCamera: RenderCamera, size: ISize, transform: Transform): void {\n        if (!this._parentContainer || !this._content) {\n            return;\n        }\n\n        if (!this._point && !this._rect) {\n            return;\n        }\n\n        if (!this._container) {\n            this._container = this._dom.createElement(\"div\", \"mapillaryjs-popup\", this._parentContainer);\n\n            const showTip: boolean =\n                this._options.clean !== true &&\n                this._options.float !== Alignment.Center;\n\n            if (showTip) {\n                const tipClassName: string =\n                    \"mapillaryjs-popup-tip\" +\n                    (this._options.capturePointer === true ? \" mapillaryjs-popup-capture-pointer\" : \"\");\n\n                this._tip = this._dom.createElement(\"div\", tipClassName, this._container);\n                this._dom.createElement(\"div\", \"mapillaryjs-popup-tip-inner\", this._tip);\n            }\n\n            this._container.appendChild(this._content);\n            this._parentContainer.appendChild(this._container);\n\n            if (this._options.opacity != null) {\n                this._container.style.opacity = this._options.opacity.toString();\n            }\n        }\n\n        let pointPixel: number[] = null;\n        let position: PopupAlignment = this._alignmentToPopupAligment(this._options.position);\n        let float: PopupAlignment = this._alignmentToPopupAligment(this._options.float);\n\n        if (this._point != null) {\n            pointPixel =\n                this._viewportCoords.basicToCanvasSafe(\n                    this._point[0],\n                    this._point[1],\n                    { offsetHeight: size.height, offsetWidth: size.width },\n                    transform,\n                    renderCamera.perspective);\n        } else {\n            const classList: DOMTokenList = this._container.classList;\n            const alignments: PopupAlignment[] =\n                [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"];\n\n            let appliedPosition: PopupAlignment = null;\n            for (const alignment of alignments) {\n                if (classList.contains(`mapillaryjs-popup-float-${alignment}`)) {\n                    appliedPosition = alignment;\n                    break;\n                }\n            }\n\n            [pointPixel, position] = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform);\n\n            if (!float) {\n                float = position;\n            }\n        }\n\n        if (pointPixel == null) {\n            this._container.style.visibility = \"hidden\";\n            return;\n        }\n\n        this._container.style.visibility = \"visible\";\n\n        if (!float) {\n            const width: number = this._container.offsetWidth;\n            const height: number = this._container.offsetHeight;\n            const floats: PopupAlignment[] = this._pixelToFloats(pointPixel, size, width, height);\n\n            float = floats.length === 0 ? \"top\" : <PopupAlignment>floats.join(\"-\");\n        }\n\n        const offset: { [key in PopupAlignment]: number[] } = this._normalizeOffset(this._options.offset);\n\n        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];\n        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];\n\n        const floatTranslate: {[key in PopupAlignment]: string } = {\n            \"bottom\": \"translate(-50%,0)\",\n            \"bottom-left\": \"translate(-100%,0)\",\n            \"bottom-right\": \"translate(0,0)\",\n            \"center\": \"translate(-50%,-50%)\",\n            \"left\": \"translate(-100%,-50%)\",\n            \"right\": \"translate(0,-50%)\",\n            \"top\": \"translate(-50%,-100%)\",\n            \"top-left\": \"translate(-100%,-100%)\",\n            \"top-right\": \"translate(0,-100%)\",\n        };\n\n        const classList: DOMTokenList = this._container.classList;\n        for (const key in floatTranslate) {\n            if (!floatTranslate.hasOwnProperty(key)) {\n                continue;\n            }\n\n            classList.remove(`mapillaryjs-popup-float-${key}`);\n        }\n\n        classList.add(`mapillaryjs-popup-float-${float}`);\n\n        this._container.style.transform = `${floatTranslate[float]} translate(${pointPixel[0]}px,${pointPixel[1]}px)`;\n    }\n\n    private _rectToPixel(\n        rect: number[],\n        position: PopupAlignment,\n        appliedPosition: PopupAlignment,\n        renderCamera: RenderCamera,\n        size: ISize, transform:\n        Transform): [number[], PopupAlignment] {\n\n        if (!position) {\n            const width: number = this._container.offsetWidth;\n            const height: number = this._container.offsetHeight;\n\n            const floatOffsets: { [key: string]: number[] } = {\n                \"bottom\": [0, height / 2],\n                \"bottom-left\": [-width / 2, height / 2],\n                \"bottom-right\": [width / 2, height / 2],\n                \"left\": [-width / 2, 0],\n                \"right\": [width / 2, 0],\n                \"top\": [0, -height / 2],\n                \"top-left\": [-width / 2, -height / 2],\n                \"top-right\": [width / 2, -height / 2],\n            };\n\n            const automaticPositions: PopupAlignment[] =\n                [\"top\", \"bottom\", \"left\", \"right\"];\n\n            let largestVisibleArea: [number, number[], PopupAlignment] = [0, null, null];\n\n            for (const automaticPosition of automaticPositions) {\n                const pointBasic: number[] = this._pointFromRectPosition(rect, automaticPosition);\n                const pointPixel: number[] =\n                    this._viewportCoords.basicToCanvasSafe(\n                        pointBasic[0],\n                        pointBasic[1],\n                        { offsetHeight: size.height, offsetWidth: size.width },\n                        transform,\n                        renderCamera.perspective);\n\n                if (pointPixel == null) {\n                    continue;\n                }\n\n                const floatOffset: number[] = floatOffsets[automaticPosition];\n                const offsetedPosition: number[] = [pointPixel[0] + floatOffset[0], pointPixel[1] + floatOffset[1]];\n                const staticCoeff: number = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;\n                const floats: PopupAlignment[] =\n                    this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));\n\n                if (floats.length === 0 &&\n                    pointPixel[0] > 0 &&\n                    pointPixel[0] < size.width &&\n                    pointPixel[1] > 0 &&\n                    pointPixel[1] < size.height) {\n\n                    return [pointPixel, automaticPosition];\n                }\n\n                const minX: number = Math.max(offsetedPosition[0] - width / 2, 0);\n                const maxX: number = Math.min(offsetedPosition[0] + width / 2, size.width);\n                const minY: number = Math.max(offsetedPosition[1] - height / 2, 0);\n                const maxY: number = Math.min(offsetedPosition[1] + height / 2, size.height);\n\n                const visibleX: number = Math.max(0, maxX - minX);\n                const visibleY: number = Math.max(0, maxY - minY);\n\n                const visibleArea: number = staticCoeff * visibleX * visibleY;\n\n                if (visibleArea > largestVisibleArea[0]) {\n                    largestVisibleArea[0] = visibleArea;\n                    largestVisibleArea[1] = pointPixel;\n                    largestVisibleArea[2] = automaticPosition;\n                }\n            }\n\n            if (largestVisibleArea[0] > 0) {\n                return [largestVisibleArea[1], largestVisibleArea[2]];\n            }\n        }\n\n        const pointBasic: number[] = this._pointFromRectPosition(rect, position);\n        const pointCanvas: number[] =\n            this._viewportCoords.basicToCanvasSafe(\n                pointBasic[0],\n                pointBasic[1],\n                { offsetHeight: size.height, offsetWidth: size.width },\n                transform,\n                renderCamera.perspective);\n\n        return [pointCanvas, position != null ? position : \"top\"];\n    }\n\n    private _alignmentToPopupAligment(float: Alignment): PopupAlignment {\n        switch (float) {\n            case Alignment.Bottom:\n                return \"bottom\";\n            case Alignment.BottomLeft:\n                return \"bottom-left\";\n            case Alignment.BottomRight:\n                return \"bottom-right\";\n            case Alignment.Center:\n                return \"center\";\n            case Alignment.Left:\n                return \"left\";\n            case Alignment.Right:\n                return \"right\";\n            case Alignment.Top:\n                return \"top\";\n            case Alignment.TopLeft:\n                return \"top-left\";\n            case Alignment.TopRight:\n                return \"top-right\";\n            default:\n                return null;\n        }\n    }\n\n    private _normalizeOffset(offset: number | IPopupOffset): { [key in PopupAlignment]: number[] } {\n        if (offset == null) {\n            return this._normalizeOffset(0);\n        }\n\n        if (typeof offset === \"number\") {\n            // input specifies a radius\n            const sideOffset: number = <number>offset;\n            const sign: number = sideOffset >= 0 ? 1 : -1;\n            const cornerOffset: number = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));\n            return {\n                \"bottom\": [0, sideOffset],\n                \"bottom-left\": [-cornerOffset, cornerOffset],\n                \"bottom-right\": [cornerOffset, cornerOffset],\n                \"center\": [0, 0],\n                \"left\": [-sideOffset, 0],\n                \"right\": [sideOffset, 0],\n                \"top\": [0, -sideOffset],\n                \"top-left\": [-cornerOffset, -cornerOffset],\n                \"top-right\": [cornerOffset, -cornerOffset],\n            };\n        } else {\n            // input specifes a value for each position\n            return {\n                \"bottom\": offset.bottom || [0, 0],\n                \"bottom-left\": offset.bottomLeft || [0, 0],\n                \"bottom-right\": offset.bottomRight || [0, 0],\n                \"center\": offset.center || [0, 0],\n                \"left\": offset.left || [0, 0],\n                \"right\": offset.right || [0, 0],\n                \"top\": offset.top || [0, 0],\n                \"top-left\": offset.topLeft || [0, 0],\n                \"top-right\": offset.topRight || [0, 0],\n               };\n        }\n    }\n\n    private _pixelToFloats(pointPixel: number[], size: ISize, width: number, height: number): PopupAlignment[] {\n        const floats: PopupAlignment[] = [];\n\n        if (pointPixel[1] < height) {\n            floats.push(\"bottom\");\n        } else if (pointPixel[1] > size.height - height) {\n            floats.push(\"top\");\n        }\n\n        if (pointPixel[0] < width / 2) {\n            floats.push(\"right\");\n        } else if (pointPixel[0] > size.width - width / 2) {\n            floats.push(\"left\");\n        }\n\n        return floats;\n    }\n\n    private _pointFromRectPosition(rect: number[], position: PopupAlignment): number[] {\n        switch (position) {\n            case \"bottom\":\n                return [(rect[0] + rect[2]) / 2, rect[3]];\n            case \"bottom-left\":\n                return [rect[0], rect[3]];\n            case \"bottom-right\":\n                return [rect[2], rect[3]];\n            case \"center\":\n                return [(rect[0] + rect[2]) / 2, (rect[1] + rect[3]) / 2];\n            case \"left\":\n                return [rect[0], (rect[1] + rect[3]) / 2];\n            case \"right\":\n                return [rect[2], (rect[1] + rect[3]) / 2];\n            case \"top\":\n                return [(rect[0] + rect[2]) / 2, rect[1]];\n            case \"top-left\":\n                return [rect[0], rect[1]];\n            case \"top-right\":\n                return [rect[2], rect[1]];\n            default:\n                return [(rect[0] + rect[2]) / 2, rect[3]];\n        }\n    }\n}\n\nexport default Popup;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/combineLatest\";\nimport \"rxjs/add/observable/of\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/share\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/takeUntil\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    Component,\n    ComponentService,\n    ISequenceConfiguration,\n    SequenceDOMRenderer,\n    SequenceDOMInteraction,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {IEdgeStatus, Node} from \"../../Graph\";\nimport {IVNodeHash} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {Container, Navigator} from \"../../Viewer\";\n\ninterface IConfigurationOperation {\n    (configuration: ISequenceConfiguration): ISequenceConfiguration;\n}\n\n/**\n * @class SequenceComponent\n * @classdesc Component showing navigation arrows for sequence directions\n * as well as playing button. Exposes an API to start and stop play.\n */\nexport class SequenceComponent extends Component<ISequenceConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"sequence\";\n\n    /**\n     * Event fired when playing starts or stops.\n     *\n     * @event PlayerComponent#playingchanged\n     * @type {boolean} Indicates whether the player is playing.\n     */\n    public static playingchanged: string = \"playingchanged\";\n\n    private _sequenceDOMRenderer: SequenceDOMRenderer;\n    private _sequenceDOMInteraction: SequenceDOMInteraction;\n    private _nodesAhead: number = 5;\n\n    private _configurationOperation$: Subject<IConfigurationOperation> = new Subject<IConfigurationOperation>();\n    private _hoveredKeySubject$: Subject<string>;\n    private _hoveredKey$: Observable<string>;\n    private _containerWidth$: Subject<number>;\n    private _edgeStatus$: Observable<IEdgeStatus>;\n\n    private _configurationSubscription: Subscription;\n    private _renderSubscription: Subscription;\n    private _containerWidthSubscription: Subscription;\n    private _hoveredKeySubscription: Subscription;\n\n    private _playingSubscription: Subscription;\n    private _clearSubscription: Subscription;\n    private _stopSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._sequenceDOMRenderer = new SequenceDOMRenderer(container.element);\n        this._sequenceDOMInteraction = new SequenceDOMInteraction();\n\n        this._containerWidth$ = new Subject<number>();\n        this._hoveredKeySubject$ = new Subject<string>();\n\n        this._hoveredKey$ = this._hoveredKeySubject$.share();\n\n        this._edgeStatus$ = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.sequenceEdges$;\n                })\n            .publishReplay(1)\n            .refCount();\n    }\n\n    /**\n     * Get hovered key observable.\n     *\n     * @description An observable emitting the key of the node for the direction\n     * arrow that is being hovered. When the mouse leaves a direction arrow null\n     * is emitted.\n     *\n     * @returns {Observable<string>}\n     */\n    public get hoveredKey$(): Observable<string> {\n        return this._hoveredKey$;\n    }\n\n    /**\n     * Start playing.\n     *\n     * @fires PlayerComponent#playingchanged\n     */\n    public play(): void {\n        this.configure({ playing: true });\n    }\n\n    /**\n     * Stop playing.\n     *\n     * @fires PlayerComponent#playingchanged\n     */\n    public stop(): void {\n        this.configure({ playing: false });\n    }\n\n    /**\n     * Set the direction to follow when playing.\n     *\n     * @param {EdgeDirection} direction - The direction that will be followed when playing.\n     */\n    public setDirection(direction: EdgeDirection): void {\n        this.configure({ direction: direction });\n    }\n\n    /**\n     * Set highlight key.\n     *\n     * @description The arrow pointing towards the node corresponding to the\n     * highlight key will be highlighted.\n     *\n     * @param {string} highlightKey Key of node to be highlighted if existing.\n     */\n    public setHighlightKey(highlightKey: string): void {\n        this.configure({ highlightKey: highlightKey });\n    }\n\n    /**\n     * Set max width of container element.\n     *\n     * @description Set max width of the container element holding\n     * the sequence navigation elements. If the min width is larger than the\n     * max width the min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMaxWidth(maxWidth: number): void {\n        this.configure({ maxWidth: maxWidth });\n    }\n\n    /**\n     * Set min width of container element.\n     *\n     * @description Set min width of the container element holding\n     * the sequence navigation elements. If the min width is larger than the\n     * max width the min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMinWidth(minWidth: number): void {\n        this.configure({ minWidth: minWidth });\n    }\n\n    /**\n     * Set the value indicating whether the sequence UI elements should be visible.\n     *\n     * @param {boolean} visible\n     */\n    public setVisible(visible: boolean): void {\n        this.configure({ visible: visible });\n    }\n\n    /** @inheritdoc */\n    public resize(): void {\n        this._configuration$\n            .first()\n            .map(\n                (configuration: ISequenceConfiguration): number => {\n                    return this._sequenceDOMRenderer.getContainerWidth(\n                        this._container.element,\n                        configuration);\n                })\n            .subscribe(\n                (containerWidth: number): void => {\n                    this._containerWidth$.next(containerWidth);\n                });\n    }\n\n    protected _activate(): void {\n        this._renderSubscription = Observable\n            .combineLatest(\n                this._edgeStatus$,\n                this._configuration$,\n                this._containerWidth$)\n            .map(\n                (ec: [IEdgeStatus, ISequenceConfiguration, number]): IVNodeHash => {\n                    let edgeStatus: IEdgeStatus = ec[0];\n                    let configuration: ISequenceConfiguration = ec[1];\n                    let containerWidth: number = ec[2];\n\n                    let vNode: vd.VNode = this._sequenceDOMRenderer\n                        .render(\n                            edgeStatus,\n                            configuration,\n                            containerWidth,\n                            this,\n                            this._sequenceDOMInteraction,\n                            this._navigator);\n\n                    return {name: this._name, vnode: vNode };\n                })\n            .subscribe(this._container.domRenderer.render$);\n\n        this._containerWidthSubscription = this._configuration$\n            .distinctUntilChanged(\n                (value1: [number, number], value2: [number, number]): boolean => {\n                    return value1[0] === value2[0] && value1[1] === value2[1];\n                },\n                (configuration: ISequenceConfiguration) => {\n                    return [configuration.minWidth, configuration.maxWidth];\n                })\n            .map(\n                (configuration: ISequenceConfiguration): number => {\n                    return this._sequenceDOMRenderer.getContainerWidth(\n                        this._container.element,\n                        configuration);\n                })\n            .subscribe(this._containerWidth$);\n\n        this._configurationSubscription = this._configurationOperation$\n            .scan<ISequenceConfiguration>(\n                (configuration: ISequenceConfiguration, operation: IConfigurationOperation): ISequenceConfiguration => {\n                    return operation(configuration);\n                },\n                { playing: false })\n            .finally(\n                (): void => {\n                    if (this._playingSubscription != null) {\n                        this._navigator.stateService.cutNodes();\n                        this._stop();\n                    }\n                })\n            .subscribe(() => { /*noop*/ });\n\n        this._configuration$\n            .map(\n                (newConfiguration: ISequenceConfiguration) => {\n                    return (configuration: ISequenceConfiguration): ISequenceConfiguration => {\n                        if (newConfiguration.playing !== configuration.playing) {\n\n                            this._navigator.stateService.cutNodes();\n\n                            if (newConfiguration.playing) {\n                                this._play();\n                            } else {\n                                this._stop();\n                            }\n                        }\n\n                        configuration.playing = newConfiguration.playing;\n\n                        return configuration;\n                    };\n                })\n            .subscribe(this._configurationOperation$);\n\n        this._stopSubscription = this._configuration$\n            .switchMap(\n                (configuration: ISequenceConfiguration): Observable<[IEdgeStatus, EdgeDirection]> => {\n                    let edgeStatus$: Observable<IEdgeStatus> = configuration.playing ?\n                        this._edgeStatus$ :\n                        Observable.empty<IEdgeStatus>();\n\n                    let edgeDirection$: Observable<EdgeDirection> = Observable\n                        .of(configuration.direction);\n\n                    return Observable\n                        .combineLatest<IEdgeStatus, EdgeDirection>(edgeStatus$, edgeDirection$);\n                })\n            .map(\n                (ne: [IEdgeStatus, EdgeDirection]): boolean => {\n                    let edgeStatus: IEdgeStatus = ne[0];\n                    let direction: EdgeDirection = ne[1];\n\n                    if (!edgeStatus.cached) {\n                        return true;\n                    }\n\n                    for (let edge of edgeStatus.edges) {\n                        if (edge.data.direction === direction) {\n                            return true;\n                        }\n                    }\n\n                    return false;\n                })\n            .filter(\n                (hasEdge: boolean): boolean => {\n                    return !hasEdge;\n                })\n            .map(\n                (hasEdge: boolean): ISequenceConfiguration => {\n                    return { playing: false };\n                })\n            .subscribe(this._configurationSubject$);\n\n        this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$\n            .switchMap(\n                (direction: EdgeDirection): Observable<string> => {\n                    return this._edgeStatus$\n                        .map(\n                            (edgeStatus: IEdgeStatus): string => {\n                                for (let edge of edgeStatus.edges) {\n                                    if (edge.data.direction === direction) {\n                                        return edge.to;\n                                    }\n                                }\n\n                                return null;\n                            })\n                        .takeUntil(this._sequenceDOMInteraction.mouseLeaveDirection$)\n                        .concat<string>(Observable.of<string>(null));\n                })\n            .distinctUntilChanged()\n            .subscribe(this._hoveredKeySubject$);\n    }\n\n    protected _deactivate(): void {\n        this._stopSubscription.unsubscribe();\n        this._renderSubscription.unsubscribe();\n        this._configurationSubscription.unsubscribe();\n        this._containerWidthSubscription.unsubscribe();\n        this._hoveredKeySubscription.unsubscribe();\n\n        this.stop();\n    }\n\n    protected _getDefaultConfiguration(): ISequenceConfiguration {\n        return {\n            direction: EdgeDirection.Next,\n            maxWidth: 117,\n            minWidth: 70,\n            playing: false,\n            visible: true,\n        };\n    }\n\n    private _play(): void {\n        this._playingSubscription = this._navigator.stateService.currentState$\n            .filter(\n                (frame: IFrame): boolean => {\n                    return frame.state.nodesAhead < this._nodesAhead;\n                })\n            .map(\n                (frame: IFrame): Node => {\n                    return frame.state.lastNode;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (lastNode: Node): string => {\n                    return lastNode.key;\n                })\n            .withLatestFrom(\n                this._configuration$,\n                (lastNode: Node, configuration: ISequenceConfiguration): [Node, EdgeDirection] => {\n                    return [lastNode, configuration.direction];\n                })\n            .switchMap(\n                (nd: [Node, EdgeDirection]): Observable<[IEdgeStatus, EdgeDirection]> => {\n                    return ([EdgeDirection.Next, EdgeDirection.Prev].indexOf(nd[1]) > -1 ?\n                            nd[0].sequenceEdges$ :\n                            nd[0].spatialEdges$)\n                        .filter(\n                            (status: IEdgeStatus): boolean => {\n                                return status.cached;\n                            })\n                        .zip(\n                            Observable.of<EdgeDirection>(nd[1]),\n                            (status: IEdgeStatus, direction: EdgeDirection): [IEdgeStatus, EdgeDirection] => {\n                                return [status, direction];\n                            });\n                })\n            .map(\n                (ed: [IEdgeStatus, EdgeDirection]): string => {\n                    let direction: EdgeDirection = ed[1];\n\n                    for (let edge of ed[0].edges) {\n                        if (edge.data.direction === direction) {\n                            return edge.to;\n                        }\n                    }\n\n                    return null;\n                })\n            .filter(\n                (key: string): boolean => {\n                    return key != null;\n                })\n            .switchMap(\n                (key: string): Observable<Node> => {\n                    return this._navigator.graphService.cacheNode$(key);\n                })\n            .subscribe(\n                (node: Node): void => {\n                    this._navigator.stateService.appendNodes([node]);\n                },\n                (error: Error): void => {\n                    console.error(error);\n                    this.stop();\n                });\n\n        this._clearSubscription = this._navigator.stateService.currentNode$\n            .bufferCount(1, 7)\n            .subscribe(\n                (nodes: Node[]): void => {\n                    this._navigator.stateService.clearPriorNodes();\n                });\n\n        this.fire(SequenceComponent.playingchanged, true);\n    }\n\n    private _stop(): void {\n        this._playingSubscription.unsubscribe();\n        this._playingSubscription = null;\n\n        this._clearSubscription.unsubscribe();\n        this._clearSubscription = null;\n\n        this.fire(SequenceComponent.playingchanged, false);\n    }\n}\n\nComponentService.register(SequenceComponent);\nexport default SequenceComponent;\n",
+    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport {\n    IPopupOffset,\n    IPopupOptions,\n    PopupAlignment,\n} from \"../../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../../Geo\";\nimport {\n    ISize,\n    RenderCamera,\n} from \"../../../Render\";\nimport {DOM} from \"../../../Utils\";\nimport {Alignment} from \"../../../Viewer\";\n\n/**\n * @class Popup\n *\n * @classdesc Popup instance for rendering custom HTML content\n * on top of images. Popups are based on 2D basic image coordinates\n * (see the {@link Viewer} class documentation for more information about coordinate\n * systems) and a certain popup is therefore only relevant to a single image.\n * Popups related to a certain image should be removed when moving\n * to another image.\n *\n * A popup must have both its content and its point or rect set to be\n * rendered. Popup options can not be updated after creation but the\n * basic point or rect as well as its content can be changed by calling\n * the appropriate methods.\n *\n * To create and add one `Popup` with default configuration\n * (tooltip visuals and automatic float) and one with specific options\n * use\n *\n * @example\n * ```\n * var defaultSpan = document.createElement('span');\n * defaultSpan.innerHTML = 'hello default';\n *\n * var defaultPopup = new Mapillary.PopupComponent.Popup();\n * defaultPopup.setDOMContent(defaultSpan);\n * defaultPopup.setBasicPoint([0.3, 0.3]);\n *\n * var cleanSpan = document.createElement('span');\n * cleanSpan.innerHTML = 'hello clean';\n *\n * var cleanPopup = new Mapillary.PopupComponent.Popup({\n *     clean: true,\n *     float: Mapillary.Alignment.Top,\n *     offset: 10,\n *     opacity: 0.7,\n * });\n *\n * cleanPopup.setDOMContent(cleanSpan);\n * cleanPopup.setBasicPoint([0.6, 0.6]);\n *\n * popupComponent.add([defaultPopup, cleanPopup]);\n * ```\n *\n * @description Implementation of API methods and API documentation inspired\n * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js\n */\nexport class Popup {\n    protected _notifyChanged$: Subject<Popup>;\n\n    private _container: HTMLDivElement;\n    private _content: HTMLDivElement;\n    private _parentContainer: HTMLElement;\n    private _options: IPopupOptions;\n    private _tip: HTMLDivElement;\n\n    private _point: number[];\n    private _rect: number[];\n\n    private _dom: DOM;\n    private _viewportCoords: ViewportCoords;\n\n    constructor(options?: IPopupOptions, viewportCoords?: ViewportCoords, dom?: DOM) {\n        this._options = {};\n\n        if (!!options) {\n            this._options.capturePointer = options.capturePointer == null ? true : options.capturePointer;\n            this._options.clean = options.clean;\n            this._options.float = options.float;\n            this._options.offset = options.offset;\n            this._options.opacity = options.opacity;\n            this._options.position = options.position;\n        }\n\n        this._dom = !!dom ? dom : new DOM();\n        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords();\n\n        this._notifyChanged$ = new Subject<Popup>();\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal observable used by the component to\n     * render the popup when its position or content has changed.\n     */\n    public get changed$(): Observable<Popup> {\n        return this._notifyChanged$;\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method used by the component to\n     * remove all references to the popup.\n     */\n    public remove(): void {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._parentContainer) {\n            delete this._parentContainer;\n        }\n    }\n\n    /**\n     * Sets a 2D basic image coordinates point to the popup's anchor, and\n     * moves the popup to it.\n     *\n     * @description Overwrites any previously set point or rect.\n     *\n     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setBasicPoint(basicPoint: number[]): void {\n        this._point = basicPoint.slice();\n        this._rect = null;\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets a 2D basic image coordinates rect to the popup's anchor, and\n     * moves the popup to it.\n     *\n     * @description Overwrites any previously set point or rect.\n     *\n     * @param {Array<number>} basicRect - Rect in 2D basic image\n     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setBasicRect(basicRect: number[]): void {\n        this._rect = basicRect.slice();\n        this._point = null;\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets the popup's content to the element provided as a DOM node.\n     *\n     * @param {Node} htmlNode - A DOM node to be used as content for the popup.\n     *\n     * @example\n     * ```\n     * var div = document.createElement('div');\n     * div.innerHTML = 'hello image';\n     *\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setDOMContent(div);\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setDOMContent(htmlNode: Node): void {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        const className: string = \"mapillaryjs-popup-content\" +\n            (this._options.clean === true ? \"-clean\" : \"\") +\n            (this._options.capturePointer === true ? \" mapillaryjs-popup-capture-pointer\" : \"\");\n\n        this._content = this._dom.createElement(\"div\", className, this._container);\n\n        this._content.appendChild(htmlNode);\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Sets the popup's content to the HTML provided as a string.\n     *\n     * @description This method does not perform HTML filtering or sanitization,\n     * and must be used only with trusted content. Consider Popup#setText if the\n     * content is an untrusted text string.\n     *\n     * @param {string} html - A string representing HTML content for the popup.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setHTML('<div>hello image</div>');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setHTML(html: string): void {\n        const frag: DocumentFragment = this._dom.document.createDocumentFragment();\n        const temp: HTMLBodyElement = this._dom.createElement(\"body\");\n        let child: Node;\n        temp.innerHTML = html;\n\n        while (true) {\n            child = temp.firstChild;\n            if (!child) {\n                break;\n            }\n\n            frag.appendChild(child);\n        }\n\n        this.setDOMContent(frag);\n    }\n\n    /**\n     * Sets the popup's content to a string of text.\n     *\n     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.\n     * Use this method for security against XSS if the popup content is user-provided.\n     *\n     * @param {string} text - Textual content for the popup.\n     *\n     * @example\n     * ```\n     * var popup = new Mapillary.PopupComponent.Popup();\n     * popup.setText('hello image');\n     * popup.setBasicPoint([0.3, 0.3]);\n     *\n     * popupComponent.add([popup]);\n     * ```\n     */\n    public setText(text: string): void {\n        this.setDOMContent(this._dom.document.createTextNode(text));\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method for attaching the popup to\n     * its parent container so that it is rendered in the DOM tree.\n     */\n    public setParentContainer(parentContainer: HTMLElement): void {\n        this._parentContainer = parentContainer;\n    }\n\n    /**\n     * @ignore\n     *\n     * @description Internal method for updating the rendered\n     * position of the popup called by the popup component.\n     */\n    public update(renderCamera: RenderCamera, size: ISize, transform: Transform): void {\n        if (!this._parentContainer || !this._content) {\n            return;\n        }\n\n        if (!this._point && !this._rect) {\n            return;\n        }\n\n        if (!this._container) {\n            this._container = this._dom.createElement(\"div\", \"mapillaryjs-popup\", this._parentContainer);\n\n            const showTip: boolean =\n                this._options.clean !== true &&\n                this._options.float !== Alignment.Center;\n\n            if (showTip) {\n                const tipClassName: string =\n                    \"mapillaryjs-popup-tip\" +\n                    (this._options.capturePointer === true ? \" mapillaryjs-popup-capture-pointer\" : \"\");\n\n                this._tip = this._dom.createElement(\"div\", tipClassName, this._container);\n                this._dom.createElement(\"div\", \"mapillaryjs-popup-tip-inner\", this._tip);\n            }\n\n            this._container.appendChild(this._content);\n            this._parentContainer.appendChild(this._container);\n\n            if (this._options.opacity != null) {\n                this._container.style.opacity = this._options.opacity.toString();\n            }\n        }\n\n        let pointPixel: number[] = null;\n        let position: PopupAlignment = this._alignmentToPopupAligment(this._options.position);\n        let float: PopupAlignment = this._alignmentToPopupAligment(this._options.float);\n\n        const classList: DOMTokenList = this._container.classList;\n\n        if (this._point != null) {\n            pointPixel =\n                this._viewportCoords.basicToCanvasSafe(\n                    this._point[0],\n                    this._point[1],\n                    { offsetHeight: size.height, offsetWidth: size.width },\n                    transform,\n                    renderCamera.perspective);\n        } else {\n            const alignments: PopupAlignment[] =\n                [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"];\n\n            let appliedPosition: PopupAlignment = null;\n            for (const alignment of alignments) {\n                if (classList.contains(`mapillaryjs-popup-float-${alignment}`)) {\n                    appliedPosition = alignment;\n                    break;\n                }\n            }\n\n            [pointPixel, position] = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform);\n\n            if (!float) {\n                float = position;\n            }\n        }\n\n        if (pointPixel == null) {\n            this._container.style.visibility = \"hidden\";\n            return;\n        }\n\n        this._container.style.visibility = \"visible\";\n\n        if (!float) {\n            const width: number = this._container.offsetWidth;\n            const height: number = this._container.offsetHeight;\n            const floats: PopupAlignment[] = this._pixelToFloats(pointPixel, size, width, height);\n\n            float = floats.length === 0 ? \"top\" : <PopupAlignment>floats.join(\"-\");\n        }\n\n        const offset: { [key in PopupAlignment]: number[] } = this._normalizeOffset(this._options.offset);\n\n        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];\n        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];\n\n        const floatTranslate: {[key in PopupAlignment]: string } = {\n            \"bottom\": \"translate(-50%,0)\",\n            \"bottom-left\": \"translate(-100%,0)\",\n            \"bottom-right\": \"translate(0,0)\",\n            \"center\": \"translate(-50%,-50%)\",\n            \"left\": \"translate(-100%,-50%)\",\n            \"right\": \"translate(0,-50%)\",\n            \"top\": \"translate(-50%,-100%)\",\n            \"top-left\": \"translate(-100%,-100%)\",\n            \"top-right\": \"translate(0,-100%)\",\n        };\n\n        for (const key in floatTranslate) {\n            if (!floatTranslate.hasOwnProperty(key)) {\n                continue;\n            }\n\n            classList.remove(`mapillaryjs-popup-float-${key}`);\n        }\n\n        classList.add(`mapillaryjs-popup-float-${float}`);\n\n        this._container.style.transform = `${floatTranslate[float]} translate(${pointPixel[0]}px,${pointPixel[1]}px)`;\n    }\n\n    private _rectToPixel(\n        rect: number[],\n        position: PopupAlignment,\n        appliedPosition: PopupAlignment,\n        renderCamera: RenderCamera,\n        size: ISize,\n        transform: Transform): [number[], PopupAlignment] {\n\n        if (!position) {\n            const width: number = this._container.offsetWidth;\n            const height: number = this._container.offsetHeight;\n\n            const floatOffsets: { [key: string]: number[] } = {\n                \"bottom\": [0, height / 2],\n                \"bottom-left\": [-width / 2, height / 2],\n                \"bottom-right\": [width / 2, height / 2],\n                \"left\": [-width / 2, 0],\n                \"right\": [width / 2, 0],\n                \"top\": [0, -height / 2],\n                \"top-left\": [-width / 2, -height / 2],\n                \"top-right\": [width / 2, -height / 2],\n            };\n\n            const automaticPositions: PopupAlignment[] =\n                [\"top\", \"bottom\", \"left\", \"right\"];\n\n            let largestVisibleArea: [number, number[], PopupAlignment] = [0, null, null];\n\n            for (const automaticPosition of automaticPositions) {\n                const autoPointBasic: number[] = this._pointFromRectPosition(rect, automaticPosition);\n                const autoPointPixel: number[] =\n                    this._viewportCoords.basicToCanvasSafe(\n                        autoPointBasic[0],\n                        autoPointBasic[1],\n                        { offsetHeight: size.height, offsetWidth: size.width },\n                        transform,\n                        renderCamera.perspective);\n\n                if (autoPointPixel == null) {\n                    continue;\n                }\n\n                const floatOffset: number[] = floatOffsets[automaticPosition];\n                const offsetedPosition: number[] = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];\n                const staticCoeff: number = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;\n                const floats: PopupAlignment[] =\n                    this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));\n\n                if (floats.length === 0 &&\n                    autoPointPixel[0] > 0 &&\n                    autoPointPixel[0] < size.width &&\n                    autoPointPixel[1] > 0 &&\n                    autoPointPixel[1] < size.height) {\n\n                    return [autoPointPixel, automaticPosition];\n                }\n\n                const minX: number = Math.max(offsetedPosition[0] - width / 2, 0);\n                const maxX: number = Math.min(offsetedPosition[0] + width / 2, size.width);\n                const minY: number = Math.max(offsetedPosition[1] - height / 2, 0);\n                const maxY: number = Math.min(offsetedPosition[1] + height / 2, size.height);\n\n                const visibleX: number = Math.max(0, maxX - minX);\n                const visibleY: number = Math.max(0, maxY - minY);\n\n                const visibleArea: number = staticCoeff * visibleX * visibleY;\n\n                if (visibleArea > largestVisibleArea[0]) {\n                    largestVisibleArea[0] = visibleArea;\n                    largestVisibleArea[1] = autoPointPixel;\n                    largestVisibleArea[2] = automaticPosition;\n                }\n            }\n\n            if (largestVisibleArea[0] > 0) {\n                return [largestVisibleArea[1], largestVisibleArea[2]];\n            }\n        }\n\n        const pointBasic: number[] = this._pointFromRectPosition(rect, position);\n        const pointPixel: number[] =\n            this._viewportCoords.basicToCanvasSafe(\n                pointBasic[0],\n                pointBasic[1],\n                { offsetHeight: size.height, offsetWidth: size.width },\n                transform,\n                renderCamera.perspective);\n\n        return [pointPixel, position != null ? position : \"top\"];\n    }\n\n    private _alignmentToPopupAligment(float: Alignment): PopupAlignment {\n        switch (float) {\n            case Alignment.Bottom:\n                return \"bottom\";\n            case Alignment.BottomLeft:\n                return \"bottom-left\";\n            case Alignment.BottomRight:\n                return \"bottom-right\";\n            case Alignment.Center:\n                return \"center\";\n            case Alignment.Left:\n                return \"left\";\n            case Alignment.Right:\n                return \"right\";\n            case Alignment.Top:\n                return \"top\";\n            case Alignment.TopLeft:\n                return \"top-left\";\n            case Alignment.TopRight:\n                return \"top-right\";\n            default:\n                return null;\n        }\n    }\n\n    private _normalizeOffset(offset: number | IPopupOffset): { [key in PopupAlignment]: number[] } {\n        if (offset == null) {\n            return this._normalizeOffset(0);\n        }\n\n        if (typeof offset === \"number\") {\n            // input specifies a radius\n            const sideOffset: number = <number>offset;\n            const sign: number = sideOffset >= 0 ? 1 : -1;\n            const cornerOffset: number = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));\n            return {\n                \"bottom\": [0, sideOffset],\n                \"bottom-left\": [-cornerOffset, cornerOffset],\n                \"bottom-right\": [cornerOffset, cornerOffset],\n                \"center\": [0, 0],\n                \"left\": [-sideOffset, 0],\n                \"right\": [sideOffset, 0],\n                \"top\": [0, -sideOffset],\n                \"top-left\": [-cornerOffset, -cornerOffset],\n                \"top-right\": [cornerOffset, -cornerOffset],\n            };\n        } else {\n            // input specifes a value for each position\n            return {\n                \"bottom\": offset.bottom || [0, 0],\n                \"bottom-left\": offset.bottomLeft || [0, 0],\n                \"bottom-right\": offset.bottomRight || [0, 0],\n                \"center\": offset.center || [0, 0],\n                \"left\": offset.left || [0, 0],\n                \"right\": offset.right || [0, 0],\n                \"top\": offset.top || [0, 0],\n                \"top-left\": offset.topLeft || [0, 0],\n                \"top-right\": offset.topRight || [0, 0],\n               };\n        }\n    }\n\n    private _pixelToFloats(pointPixel: number[], size: ISize, width: number, height: number): PopupAlignment[] {\n        const floats: PopupAlignment[] = [];\n\n        if (pointPixel[1] < height) {\n            floats.push(\"bottom\");\n        } else if (pointPixel[1] > size.height - height) {\n            floats.push(\"top\");\n        }\n\n        if (pointPixel[0] < width / 2) {\n            floats.push(\"right\");\n        } else if (pointPixel[0] > size.width - width / 2) {\n            floats.push(\"left\");\n        }\n\n        return floats;\n    }\n\n    private _pointFromRectPosition(rect: number[], position: PopupAlignment): number[] {\n        const x0: number = rect[0];\n        const x1: number = rect[0] < rect[2] ? rect[2] : rect[2] + 1;\n        const y0: number = rect[1];\n        const y1: number = rect[3];\n\n        switch (position) {\n            case \"bottom\":\n                return [(x0 + x1) / 2, y1];\n            case \"bottom-left\":\n                return [x0, y1];\n            case \"bottom-right\":\n                return [x1, y1];\n            case \"center\":\n                return [(x0 + x1) / 2, (y0 + y1) / 2];\n            case \"left\":\n                return [x0, (y0 + y1) / 2];\n            case \"right\":\n                return [x1, (y0 + y1) / 2];\n            case \"top\":\n                return [(x0 + x1) / 2, y0];\n            case \"top-left\":\n                return [x0, y0];\n            case \"top-right\":\n                return [x1, y0];\n            default:\n                return [(x0 + x1) / 2, y1];\n        }\n    }\n}\n\nexport default Popup;\n",
+    "export enum ControlMode {\n    Default,\n    Playback,\n}\n\nexport default ControlMode;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/combineLatest\";\nimport \"rxjs/add/observable/of\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/retry\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/share\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/takeUntil\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    Component,\n    ComponentService,\n    ISequenceConfiguration,\n    SequenceDOMRenderer,\n    SequenceDOMInteraction,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {IEdgeStatus, Node, Sequence} from \"../../Graph\";\nimport {IVNodeHash} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {Container, Navigator} from \"../../Viewer\";\n\ninterface IConfigurationOperation {\n    (configuration: ISequenceConfiguration): ISequenceConfiguration;\n}\n\n/**\n * @class SequenceComponent\n * @classdesc Component showing navigation arrows for sequence directions\n * as well as playing button. Exposes an API to start and stop play.\n */\nexport class SequenceComponent extends Component<ISequenceConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"sequence\";\n\n    /**\n     * Event fired when playing starts or stops.\n     *\n     * @event PlayerComponent#playingchanged\n     * @type {boolean} Indicates whether the player is playing.\n     */\n    public static playingchanged: string = \"playingchanged\";\n\n    private _sequenceDOMRenderer: SequenceDOMRenderer;\n    private _sequenceDOMInteraction: SequenceDOMInteraction;\n\n    private _hoveredKeySubject$: Subject<string>;\n    private _hoveredKey$: Observable<string>;\n    private _containerWidth$: Subject<number>;\n\n    private _renderSubscription: Subscription;\n    private _playingSubscription: Subscription;\n    private _containerWidthSubscription: Subscription;\n    private _hoveredKeySubscription: Subscription;\n    private _setSpeedSubscription: Subscription;\n    private _setDirectionSubscription: Subscription;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._sequenceDOMRenderer = new SequenceDOMRenderer(container);\n        this._sequenceDOMInteraction = new SequenceDOMInteraction();\n\n        this._containerWidth$ = new Subject<number>();\n        this._hoveredKeySubject$ = new Subject<string>();\n\n        this._hoveredKey$ = this._hoveredKeySubject$.share();\n\n        this._navigator.playService.playing$\n            .skip(1)\n            .withLatestFrom(this._configuration$)\n            .subscribe(\n                ([playing, configuration]: [boolean, ISequenceConfiguration]): void => {\n                    this.fire(SequenceComponent.playingchanged, playing);\n\n                    if (playing === configuration.playing) {\n                        return;\n                    }\n\n                    if (playing) {\n                        this.play();\n                    } else {\n                        this.stop();\n                    }\n                });\n\n        this._navigator.playService.direction$\n            .skip(1)\n            .withLatestFrom(this._configuration$)\n            .subscribe(\n                ([direction, configuration]: [EdgeDirection, ISequenceConfiguration]): void => {\n                    if (direction !== configuration.direction) {\n                        this.setDirection(direction);\n                    }\n                });\n    }\n\n    /**\n     * Get hovered key observable.\n     *\n     * @description An observable emitting the key of the node for the direction\n     * arrow that is being hovered. When the mouse leaves a direction arrow null\n     * is emitted.\n     *\n     * @returns {Observable<string>}\n     */\n    public get hoveredKey$(): Observable<string> {\n        return this._hoveredKey$;\n    }\n\n    /**\n     * Start playing.\n     *\n     * @fires PlayerComponent#playingchanged\n     */\n    public play(): void {\n        this.configure({ playing: true });\n    }\n\n    /**\n     * Stop playing.\n     *\n     * @fires PlayerComponent#playingchanged\n     */\n    public stop(): void {\n        this.configure({ playing: false });\n    }\n\n    /**\n     * Set the direction to follow when playing.\n     *\n     * @param {EdgeDirection} direction - The direction that will be followed when playing.\n     */\n    public setDirection(direction: EdgeDirection): void {\n        this.configure({ direction: direction });\n    }\n\n    /**\n     * Set highlight key.\n     *\n     * @description The arrow pointing towards the node corresponding to the\n     * highlight key will be highlighted.\n     *\n     * @param {string} highlightKey Key of node to be highlighted if existing.\n     */\n    public setHighlightKey(highlightKey: string): void {\n        this.configure({ highlightKey: highlightKey });\n    }\n\n    /**\n     * Set max width of container element.\n     *\n     * @description Set max width of the container element holding\n     * the sequence navigation elements. If the min width is larger than the\n     * max width the min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMaxWidth(maxWidth: number): void {\n        this.configure({ maxWidth: maxWidth });\n    }\n\n    /**\n     * Set min width of container element.\n     *\n     * @description Set min width of the container element holding\n     * the sequence navigation elements. If the min width is larger than the\n     * max width the min width value will be used.\n     *\n     * The container element is automatically resized when the resize\n     * method on the Viewer class is called.\n     *\n     * @param {number} minWidth\n     */\n    public setMinWidth(minWidth: number): void {\n        this.configure({ minWidth: minWidth });\n    }\n\n    /**\n     * Set the value indicating whether the sequence UI elements should be visible.\n     *\n     * @param {boolean} visible\n     */\n    public setVisible(visible: boolean): void {\n        this.configure({ visible: visible });\n    }\n\n    /** @inheritdoc */\n    public resize(): void {\n        this._configuration$\n            .first()\n            .map(\n                (configuration: ISequenceConfiguration): number => {\n                    return this._sequenceDOMRenderer.getContainerWidth(\n                        this._container.element,\n                        configuration);\n                })\n            .subscribe(\n                (containerWidth: number): void => {\n                    this._containerWidth$.next(containerWidth);\n                });\n    }\n\n    protected _activate(): void {\n        this._sequenceDOMRenderer.activate();\n\n        const edgeStatus$: Observable<IEdgeStatus> = this._navigator.stateService.currentNode$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.sequenceEdges$;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._renderSubscription = Observable\n            .combineLatest(\n                edgeStatus$,\n                this._configuration$,\n                this._containerWidth$,\n                this._sequenceDOMRenderer.changed$.startWith(this._sequenceDOMRenderer),\n                this._navigator.playService.speed$)\n            .map(\n                (\n                    [edgeStatus, configuration, containerWidth, renderer, speed]:\n                    [IEdgeStatus, ISequenceConfiguration, number, SequenceDOMRenderer, number]): IVNodeHash => {\n\n                    const vNode: vd.VNode = this._sequenceDOMRenderer\n                        .render(\n                            edgeStatus,\n                            configuration,\n                            containerWidth,\n                            speed,\n                            this,\n                            this._sequenceDOMInteraction,\n                            this._navigator);\n\n                    return {name: this._name, vnode: vNode };\n                })\n            .subscribe(this._container.domRenderer.render$);\n\n        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$\n            .subscribe(\n                (speed: number): void => {\n                    this._navigator.playService.setSpeed(speed);\n                });\n\n        this._setDirectionSubscription = this._configuration$\n            .map(\n                (configuration: ISequenceConfiguration): EdgeDirection => {\n                    return configuration.direction;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (direction: EdgeDirection): void => {\n                    this._navigator.playService.setDirection(direction);\n                });\n\n        this._containerWidthSubscription = this._configuration$\n            .distinctUntilChanged(\n                (value1: [number, number], value2: [number, number]): boolean => {\n                    return value1[0] === value2[0] && value1[1] === value2[1];\n                },\n                (configuration: ISequenceConfiguration) => {\n                    return [configuration.minWidth, configuration.maxWidth];\n                })\n            .map(\n                (configuration: ISequenceConfiguration): number => {\n                    return this._sequenceDOMRenderer.getContainerWidth(\n                        this._container.element,\n                        configuration);\n                })\n            .subscribe(this._containerWidth$);\n\n        this._playingSubscription = this._configuration$\n            .map(\n                (configuration: ISequenceConfiguration): boolean => {\n                    return configuration.playing;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (playing: boolean) => {\n                    if (playing) {\n                        this._navigator.playService.play();\n                    } else {\n                        this._navigator.playService.stop();\n                    }\n                });\n\n        this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$\n            .switchMap(\n                (direction: EdgeDirection): Observable<string> => {\n                    return edgeStatus$\n                        .map(\n                            (edgeStatus: IEdgeStatus): string => {\n                                for (let edge of edgeStatus.edges) {\n                                    if (edge.data.direction === direction) {\n                                        return edge.to;\n                                    }\n                                }\n\n                                return null;\n                            })\n                        .takeUntil(this._sequenceDOMInteraction.mouseLeaveDirection$)\n                        .concat<string>(Observable.of<string>(null));\n                })\n            .distinctUntilChanged()\n            .subscribe(this._hoveredKeySubject$);\n    }\n\n    protected _deactivate(): void {\n        this._renderSubscription.unsubscribe();\n        this._playingSubscription.unsubscribe();\n        this._containerWidthSubscription.unsubscribe();\n        this._hoveredKeySubscription.unsubscribe();\n        this._setSpeedSubscription.unsubscribe();\n        this._setDirectionSubscription.unsubscribe();\n\n        this._sequenceDOMRenderer.deactivate();\n    }\n\n    protected _getDefaultConfiguration(): ISequenceConfiguration {\n        return {\n            direction: EdgeDirection.Next,\n            maxWidth: 108,\n            minWidth: 70,\n            playing: false,\n            visible: true,\n        };\n    }\n}\n\nComponentService.register(SequenceComponent);\nexport default SequenceComponent;\n",
     "import {Subject} from \"rxjs/Subject\";\n\nimport {EdgeDirection} from \"../../Edge\";\n\nexport class SequenceDOMInteraction {\n    private _mouseEnterDirection$: Subject<EdgeDirection>;\n    private _mouseLeaveDirection$: Subject<EdgeDirection>;\n\n    constructor() {\n        this._mouseEnterDirection$ = new Subject<EdgeDirection>();\n        this._mouseLeaveDirection$ = new Subject<EdgeDirection>();\n    }\n\n    public get mouseEnterDirection$(): Subject<EdgeDirection> {\n        return this._mouseEnterDirection$;\n    }\n\n    public get mouseLeaveDirection$(): Subject<EdgeDirection> {\n        return this._mouseLeaveDirection$;\n    }\n}\n\nexport default SequenceDOMInteraction;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {\n    ISequenceConfiguration,\n    SequenceComponent,\n    SequenceDOMInteraction,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {IEdgeStatus, Node} from \"../../Graph\";\nimport {Navigator} from \"../../Viewer\";\n\nexport class SequenceDOMRenderer {\n    private _minThresholdWidth: number;\n    private _maxThresholdWidth: number;\n    private _minThresholdHeight: number;\n    private _maxThresholdHeight: number;\n\n    constructor(element: HTMLElement) {\n        this._minThresholdWidth = 320;\n        this._maxThresholdWidth = 1480;\n        this._minThresholdHeight = 240;\n        this._maxThresholdHeight = 820;\n    }\n\n    public render(\n        edgeStatus: IEdgeStatus,\n        configuration: ISequenceConfiguration,\n        containerWidth: number,\n        component: SequenceComponent,\n        interaction: SequenceDOMInteraction,\n        navigator: Navigator): vd.VNode {\n\n        if (configuration.visible === false) {\n            return vd.h(\"div.SequenceContainer\", {}, []);\n        }\n\n        let nextKey: string = null;\n        let prevKey: string = null;\n\n        for (let edge of edgeStatus.edges) {\n            if (edge.data.direction === EdgeDirection.Next) {\n                nextKey = edge.to;\n            }\n\n            if (edge.data.direction === EdgeDirection.Prev) {\n                prevKey = edge.to;\n            }\n        }\n\n        let playingButton: vd.VNode = this._createPlayingButton(nextKey, prevKey, configuration, component);\n        let arrows: vd.VNode[] = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator);\n\n        let containerProperties: vd.createProperties = {\n            oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); },\n            style: { height: (0.27 * containerWidth) + \"px\", width: containerWidth + \"px\" },\n        };\n\n        return vd.h(\"div.SequenceContainer\", containerProperties, arrows.concat([playingButton]));\n    }\n\n    public getContainerWidth(element: HTMLElement, configuration: ISequenceConfiguration): number {\n        let elementWidth: number = element.offsetWidth;\n        let elementHeight: number = element.offsetHeight;\n\n        let minWidth: number = configuration.minWidth;\n        let maxWidth: number = configuration.maxWidth;\n        if (maxWidth < minWidth) {\n            maxWidth = minWidth;\n        }\n\n        let relativeWidth: number =\n            (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);\n        let relativeHeight: number =\n            (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);\n\n        let coeff: number = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));\n\n        return minWidth + coeff * (maxWidth - minWidth);\n    }\n\n    private _createPlayingButton(\n        nextKey: string,\n        prevKey: string,\n        configuration: ISequenceConfiguration,\n        component: SequenceComponent): vd.VNode {\n\n        let canPlay: boolean = configuration.direction === EdgeDirection.Next && nextKey != null ||\n            configuration.direction === EdgeDirection.Prev && prevKey != null;\n\n        let onclick: (e: Event) => void = configuration.playing ?\n            (e: Event): void => { component.stop(); } :\n            canPlay ? (e: Event): void => { component.play(); } : null;\n\n        let buttonProperties: vd.createProperties = {\n            onclick: onclick,\n            style: {\n\n            },\n        };\n\n        let iconClass: string = configuration.playing ?\n            \"Stop\" :\n            canPlay ? \"Play\" : \"PlayDisabled\";\n\n        let icon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", { className: iconClass }, []);\n\n        let buttonClass: string = canPlay ? \"SequencePlay\" : \"SequencePlayDisabled\";\n\n        return vd.h(\"div.\" + buttonClass, buttonProperties, [icon]);\n    }\n\n    private _createSequenceArrows(\n        nextKey: string,\n        prevKey: string,\n        configuration: ISequenceConfiguration,\n        interaction: SequenceDOMInteraction,\n        navigator: Navigator): vd.VNode[] {\n\n        let nextProperties: vd.createProperties = {\n            onclick: nextKey != null ?\n                (e: Event): void => {\n                    navigator.moveDir$(EdgeDirection.Next)\n                        .subscribe(\n                            (node: Node): void => { return; },\n                            (error: Error): void => { console.error(error); });\n                } :\n                null,\n            onmouseenter: (e: MouseEvent): void => { interaction.mouseEnterDirection$.next(EdgeDirection.Next); },\n            onmouseleave: (e: MouseEvent): void => { interaction.mouseLeaveDirection$.next(EdgeDirection.Next); },\n            style: {\n\n            },\n        };\n\n        let prevProperties: vd.createProperties = {\n            onclick: prevKey != null ?\n                (e: Event): void => {\n                    navigator.moveDir$(EdgeDirection.Prev)\n                        .subscribe(\n                            (node: Node): void => { return; },\n                            (error: Error): void => { console.error(error); });\n                } :\n                null,\n            onmouseenter: (e: MouseEvent): void => { interaction.mouseEnterDirection$.next(EdgeDirection.Prev); },\n            onmouseleave: (e: MouseEvent): void => { interaction.mouseLeaveDirection$.next(EdgeDirection.Prev); },\n            style: {\n\n            },\n        };\n\n        let nextClass: string = this._getStepClassName(EdgeDirection.Next, nextKey, configuration.highlightKey);\n        let prevClass: string = this._getStepClassName(EdgeDirection.Prev, prevKey, configuration.highlightKey);\n\n        let nextIcon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", []);\n        let prevIcon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", []);\n\n        return [\n            vd.h(\"div.\" + nextClass, nextProperties, [nextIcon]),\n            vd.h(\"div.\" + prevClass, prevProperties, [prevIcon]),\n        ];\n    }\n\n    private _getStepClassName(direction: EdgeDirection, key: string, highlightKey: string): string {\n        let className: string = direction === EdgeDirection.Next ?\n            \"SequenceStepNext\" :\n            \"SequenceStepPrev\";\n\n        if (key == null) {\n            className += \"Disabled\";\n        } else {\n            if (highlightKey === key) {\n                className += \"Highlight\";\n            }\n        }\n\n        return className;\n    }\n}\n\nexport default SequenceDOMRenderer;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ControlMode,\n    ISequenceConfiguration,\n    SequenceComponent,\n    SequenceDOMInteraction,\n} from \"../../Component\";\nimport {EdgeDirection} from \"../../Edge\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../../Graph\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\nexport class SequenceDOMRenderer {\n    private _container: Container;\n\n    private _minThresholdWidth: number;\n    private _maxThresholdWidth: number;\n    private _minThresholdHeight: number;\n    private _maxThresholdHeight: number;\n    private _stepperDefaultWidth: number;\n    private _controlsDefaultWidth: number;\n    private _defaultHeight: number;\n    private _expandControls: boolean;\n    private _mode: ControlMode;\n    private _speed: number;\n    private _changingSpeed: boolean;\n\n    private _notifyChanged$: Subject<SequenceDOMRenderer>;\n    private _notifySpeedChanged$: Subject<number>;\n\n    private _changingSpeedSubscription: Subscription;\n\n    constructor(container: Container) {\n        this._container = container;\n\n        this._minThresholdWidth = 320;\n        this._maxThresholdWidth = 1480;\n        this._minThresholdHeight = 240;\n        this._maxThresholdHeight = 820;\n        this._stepperDefaultWidth = 108;\n        this._controlsDefaultWidth = 52;\n\n        this._defaultHeight = 30;\n        this._expandControls = false;\n        this._mode = ControlMode.Default;\n        this._speed = 0.5;\n        this._changingSpeed = false;\n\n        this._notifyChanged$ = new Subject<SequenceDOMRenderer>();\n        this._notifySpeedChanged$ = new Subject<number>();\n    }\n\n    public get speed(): number {\n        return this._speed;\n    }\n\n    public get changed$(): Observable<SequenceDOMRenderer> {\n        return this._notifyChanged$;\n    }\n\n    public get speed$(): Observable<number> {\n        return this._notifySpeedChanged$;\n    }\n\n    public activate(): void {\n        if (!!this._changingSpeedSubscription) {\n            return;\n        }\n\n        this._changingSpeedSubscription = Observable\n            .merge(\n                this._container.mouseService.documentMouseUp$,\n                this._container.touchService.touchEnd$\n                    .filter(\n                        (touchEvent: TouchEvent): boolean => {\n                            return touchEvent.touches.length === 0;\n                        }))\n            .subscribe(\n                (event: Event): void => {\n                    if (this._changingSpeed) {\n                        this._changingSpeed = false;\n                    }\n                });\n    }\n\n    public deactivate(): void {\n        if (!this._changingSpeedSubscription) {\n            return;\n        }\n\n        this._changingSpeed = false;\n        this._expandControls = false;\n        this._mode = ControlMode.Default;\n\n        this._changingSpeedSubscription.unsubscribe();\n        this._changingSpeedSubscription = null;\n    }\n\n    public render(\n        edgeStatus: IEdgeStatus,\n        configuration: ISequenceConfiguration,\n        containerWidth: number,\n        speed: number,\n        component: SequenceComponent,\n        interaction: SequenceDOMInteraction,\n        navigator: Navigator): vd.VNode {\n\n        if (configuration.visible === false) {\n            return vd.h(\"div.SequenceContainer\", {}, []);\n        }\n\n        const stepper: vd.VNode =\n            this._createStepper(edgeStatus, configuration, containerWidth, component, interaction, navigator);\n        const controls: vd.VNode = this._createSequenceControls(containerWidth);\n        const playback: vd.VNode = this._createPlaybackControls(containerWidth, speed, component, configuration);\n\n        return vd.h(\"div.SequenceContainer\", [stepper, controls, playback]);\n    }\n\n    public getContainerWidth(element: HTMLElement, configuration: ISequenceConfiguration): number {\n        let elementWidth: number = element.offsetWidth;\n        let elementHeight: number = element.offsetHeight;\n\n        let minWidth: number = configuration.minWidth;\n        let maxWidth: number = configuration.maxWidth;\n        if (maxWidth < minWidth) {\n            maxWidth = minWidth;\n        }\n\n        let relativeWidth: number =\n            (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);\n        let relativeHeight: number =\n            (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);\n\n        let coeff: number = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));\n\n        return minWidth + coeff * (maxWidth - minWidth);\n    }\n\n    private _createSpeedInput(speed: number): vd.VNode {\n        this._speed = speed;\n\n        const onSpeed: (e: Event) => void = (e: Event): void => {\n            this._speed = Number((<HTMLInputElement>e.target).value) / 1000;\n            this._notifySpeedChanged$.next(this._speed);\n        };\n\n        const boundingRect: ClientRect = this._container.domContainer.getBoundingClientRect();\n        const width: number = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;\n\n        const onStart: (e: Event) => void = (e: Event): void => {\n            this._changingSpeed = true;\n            e.stopPropagation();\n        };\n\n        const onMove: (e: Event) => void = (e: Event): void => {\n            if (this._changingSpeed === true) {\n                e.stopPropagation();\n            }\n        };\n\n        const speedInput: vd.VNode = vd.h(\n            \"input.SequenceSpeed\",\n            {\n                max: 1000,\n                min: 0,\n                onchange: onSpeed,\n                oninput: onSpeed,\n                onmousedown: onStart,\n                onmousemove: onMove,\n                ontouchmove: onMove,\n                ontouchstart: onStart,\n                style: {\n                    width: `${width}px`,\n                },\n                type: \"range\",\n                value: 1000 * speed,\n            },\n            []);\n\n        return vd.h(\"div.SequenceSpeedContainer\", [speedInput]);\n    }\n\n    private _createPlaybackControls(\n        containerWidth: number,\n        speed: number,\n        component: SequenceComponent,\n        configuration: ISequenceConfiguration): vd.VNode {\n\n        if (this._mode !== ControlMode.Playback) {\n            return vd.h(\"div.SequencePlayback\", []);\n        }\n\n        const switchIcon: vd.VNode = vd.h(\"div.SequenceSwitchIcon.SequenceIconVisible\", []);\n        const direction: EdgeDirection = configuration.direction === EdgeDirection.Next ?\n            EdgeDirection.Prev : EdgeDirection.Next;\n\n        const playing: boolean = configuration.playing;\n        const switchButtonProperties: vd.createProperties = {\n            onclick: (): void => {\n                if (!playing) {\n                    component.setDirection(direction);\n                }\n            },\n        };\n        const switchButtonClassName: string = configuration.playing ? \".SequenceSwitchButtonDisabled\" : \".SequenceSwitchButton\";\n        const switchButton: vd.VNode = vd.h(\"div\" + switchButtonClassName, switchButtonProperties, [switchIcon]);\n        const slowIcon: vd.VNode = vd.h(\"div.SequenceSlowIcon.SequenceIconVisible\", []);\n        const slowContainer: vd.VNode = vd.h(\"div.SequenceSlowContainer\", [slowIcon]);\n        const fastIcon: vd.VNode = vd.h(\"div.SequenceFastIconGrey.SequenceIconVisible\", []);\n        const fastContainer: vd.VNode = vd.h(\"div.SequenceFastContainer\", [fastIcon]);\n        const closeIcon: vd.VNode = vd.h(\"div.SequenceCloseIcon.SequenceIconVisible\", []);\n        const closeButtonProperties: vd.createProperties = {\n            onclick: (): void => {\n                this._mode = ControlMode.Default;\n                this._notifyChanged$.next(this);\n            },\n        };\n        const closeButton: vd.VNode = vd.h(\"div.SequenceCloseButton\", closeButtonProperties, [closeIcon]);\n        const speedInput: vd.VNode = this._createSpeedInput(speed);\n\n        const playbackChildren: vd.VNode[] = [switchButton, slowContainer, speedInput, fastContainer, closeButton];\n\n        const top: number = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);\n        const playbackProperties: vd.createProperties = { style: { top: `${top}px` } };\n\n        return vd.h(\"div.SequencePlayback\", playbackProperties, playbackChildren);\n    }\n\n    private _createPlayingButton(\n        nextKey: string,\n        prevKey: string,\n        configuration: ISequenceConfiguration,\n        component: SequenceComponent): vd.VNode {\n\n        let canPlay: boolean = configuration.direction === EdgeDirection.Next && nextKey != null ||\n            configuration.direction === EdgeDirection.Prev && prevKey != null;\n\n        let onclick: (e: Event) => void = configuration.playing ?\n            (e: Event): void => { component.stop(); } :\n            canPlay ? (e: Event): void => { component.play(); } : null;\n\n        let buttonProperties: vd.createProperties = { onclick: onclick };\n\n        let iconClass: string = configuration.playing ?\n            \"Stop\" :\n            canPlay ? \"Play\" : \"PlayDisabled\";\n\n        let iconProperties: vd.createProperties = { className: iconClass };\n        if (configuration.direction === EdgeDirection.Prev) {\n            iconProperties.style = {\n                transform: \"rotate(180deg) translate(50%, 50%)\",\n            };\n        }\n\n        let icon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", iconProperties, []);\n\n        let buttonClass: string = canPlay ? \"SequencePlay\" : \"SequencePlayDisabled\";\n\n        return vd.h(\"div.\" + buttonClass, buttonProperties, [icon]);\n    }\n\n    private _createSequenceControls(containerWidth: number): vd.VNode {\n        const borderRadius: number = Math.round(8 / this._stepperDefaultWidth * containerWidth);\n        const expanderProperties: vd.createProperties = {\n            onclick: (): void => {\n                this._expandControls = !this._expandControls;\n                this._mode = ControlMode.Default;\n                this._notifyChanged$.next(this);\n            },\n            style: {\n                \"border-bottom-right-radius\": `${borderRadius}px`,\n                \"border-top-right-radius\": `${borderRadius}px`,\n            },\n        };\n        const expanderBar: vd.VNode = vd.h(\"div.SequenceExpanderBar\", []);\n        const expander: vd.VNode = vd.h(\"div.SequenceExpanderButton\", expanderProperties, [expanderBar]);\n        const fastIconClassName: string = this._mode === ControlMode.Playback ?\n            \".SequenceFastIconGrey.SequenceIconVisible\" : \".SequenceFastIcon\";\n        const fastIcon: vd.VNode = vd.h(\"div\" + fastIconClassName, []);\n\n        const playbackProperties: vd.createProperties = {\n            onclick: (): void => {\n                this._mode = this._mode === ControlMode.Playback ?\n                    ControlMode.Default :\n                    ControlMode.Playback;\n                this._notifyChanged$.next(this);\n            },\n        };\n        const controls: vd.VNode = vd.h(\"div.SequencePlaybackButton\", playbackProperties, [fastIcon]);\n\n        const properties: vd.createProperties = {\n            style: {\n                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + \"px\",\n                transform: `translate(${containerWidth / 2 + 2}px, 0)`,\n                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + \"px\",\n            },\n        };\n\n        const className: string = \".SequenceControls\" +\n            (this._expandControls ? \".SequenceControlsExpanded\" : \"\");\n\n        return vd.h(\"div\" + className, properties, [controls, expander]);\n    }\n\n    private _createSequenceArrows(\n        nextKey: string,\n        prevKey: string,\n        containerWidth: number,\n        configuration: ISequenceConfiguration,\n        interaction: SequenceDOMInteraction,\n        navigator: Navigator): vd.VNode[] {\n\n        let nextProperties: vd.createProperties = {\n            onclick: nextKey != null ?\n                (e: Event): void => {\n                    navigator.moveDir$(EdgeDirection.Next)\n                        .subscribe(\n                            (node: Node): void => { return; },\n                            (error: Error): void => { console.error(error); });\n                } :\n                null,\n            onmouseenter: (e: MouseEvent): void => { interaction.mouseEnterDirection$.next(EdgeDirection.Next); },\n            onmouseleave: (e: MouseEvent): void => { interaction.mouseLeaveDirection$.next(EdgeDirection.Next); },\n        };\n\n        const borderRadius: number = Math.round(8 / this._stepperDefaultWidth * containerWidth);\n        let prevProperties: vd.createProperties = {\n            onclick: prevKey != null ?\n                (e: Event): void => {\n                    navigator.moveDir$(EdgeDirection.Prev)\n                        .subscribe(\n                            (node: Node): void => { return; },\n                            (error: Error): void => { console.error(error); });\n                } :\n                null,\n            onmouseenter: (e: MouseEvent): void => { interaction.mouseEnterDirection$.next(EdgeDirection.Prev); },\n            onmouseleave: (e: MouseEvent): void => { interaction.mouseLeaveDirection$.next(EdgeDirection.Prev); },\n            style: {\n                \"border-bottom-left-radius\": `${borderRadius}px`,\n                \"border-top-left-radius\": `${borderRadius}px`,\n            },\n        };\n\n        let nextClass: string = this._getStepClassName(EdgeDirection.Next, nextKey, configuration.highlightKey);\n        let prevClass: string = this._getStepClassName(EdgeDirection.Prev, prevKey, configuration.highlightKey);\n\n        let nextIcon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", []);\n        let prevIcon: vd.VNode = vd.h(\"div.SequenceComponentIcon\", []);\n\n        return [\n            vd.h(\"div.\" + prevClass, prevProperties, [prevIcon]),\n            vd.h(\"div.\" + nextClass, nextProperties, [nextIcon]),\n        ];\n    }\n\n    private _createStepper(\n        edgeStatus: IEdgeStatus,\n        configuration: ISequenceConfiguration,\n        containerWidth: number,\n        component: SequenceComponent,\n        interaction: SequenceDOMInteraction,\n        navigator: Navigator,\n        ): vd.VNode {\n\n        let nextKey: string = null;\n        let prevKey: string = null;\n\n        for (let edge of edgeStatus.edges) {\n            if (edge.data.direction === EdgeDirection.Next) {\n                nextKey = edge.to;\n            }\n\n            if (edge.data.direction === EdgeDirection.Prev) {\n                prevKey = edge.to;\n            }\n        }\n\n        const playingButton: vd.VNode = this._createPlayingButton(nextKey, prevKey, configuration, component);\n        const buttons: vd.VNode[] = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, interaction, navigator);\n        buttons.splice(1, 0, playingButton);\n\n        const containerProperties: vd.createProperties = {\n            oncontextmenu: (event: MouseEvent): void => { event.preventDefault(); },\n            style: {\n                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + \"px\",\n                width: containerWidth + \"px\",\n            },\n        };\n\n        return vd.h(\"div.SequenceStepper\", containerProperties, buttons);\n    }\n\n    private _getStepClassName(direction: EdgeDirection, key: string, highlightKey: string): string {\n        let className: string = direction === EdgeDirection.Next ?\n            \"SequenceStepNext\" :\n            \"SequenceStepPrev\";\n\n        if (key == null) {\n            className += \"Disabled\";\n        } else {\n            if (highlightKey === key) {\n                className += \"Highlight\";\n            }\n        }\n\n        return className;\n    }\n}\n\nexport default SequenceDOMRenderer;\n",
     "export {GeometryTagError} from \"./error/GeometryTagError\";\nexport {PointGeometry} from \"./geometry/PointGeometry\";\nexport {RectGeometry} from \"./geometry/RectGeometry\";\nexport {PolygonGeometry} from \"./geometry/PolygonGeometry\";\nexport {IOutlineTagOptions} from \"./interfaces/IOutlineTagOptions\";\nexport {OutlineTag} from \"./tag/OutlineTag\";\nexport {SpotTag} from \"./tag/SpotTag\";\nexport {TagComponent} from \"./TagComponent\";\nexport {TagMode} from \"./TagMode\";\n",
     "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as when from \"when\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\nimport \"rxjs/add/observable/empty\";\nimport \"rxjs/add/observable/from\";\nimport \"rxjs/add/observable/merge\";\nimport \"rxjs/add/observable/of\";\n\nimport \"rxjs/add/operator/combineLatest\";\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/share\";\nimport \"rxjs/add/operator/skip\";\nimport \"rxjs/add/operator/skipUntil\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/take\";\nimport \"rxjs/add/operator/takeUntil\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    ComponentService,\n    Component,\n    CreateHandlerBase,\n    CreatePointHandler,\n    CreatePolygonHandler,\n    CreateRectHandler,\n    CreateRectDragHandler,\n    EditVertexHandler,\n    Geometry,\n    ITagConfiguration,\n    OutlineCreateTag,\n    RenderTag,\n    Tag,\n    TagCreator,\n    TagDOMRenderer,\n    TagMode,\n    TagScene,\n    TagSet,\n} from \"../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../Geo\";\nimport {\n    GLRenderStage,\n    IGLRenderHash,\n    ISize,\n    IVNodeHash,\n    RenderCamera,\n} from \"../../Render\";\nimport {IFrame} from \"../../State\";\nimport {\n    Container,\n    ISpriteAtlas,\n    Navigator,\n} from \"../../Viewer\";\n\n/**\n * @class TagComponent\n *\n * @classdesc Component for showing and editing tags with different\n * geometries composed from 2D basic image coordinates (see the\n * {@link Viewer} class documentation for more information about coordinate\n * systems).\n *\n * The `add` method is used for adding new tags or replacing\n * tags already in the set. Tags are removed by id.\n *\n * If a tag already in the set has the same\n * id as one of the tags added, the old tag will be removed and\n * the added tag will take its place.\n *\n * The tag component mode can be set to either be non interactive or\n * to be in creating mode of a certain geometry type.\n *\n * The tag properties can be updated at any time and the change will\n * be visibile immediately.\n *\n * Tags are only relevant to a single image because they are based on\n * 2D basic image coordinates. Tags related to a certain image should\n * be removed when the viewer is moved to another node.\n *\n * To retrive and use the tag component\n *\n * @example\n * ```\n * var viewer = new Mapillary.Viewer(\n *     \"<element-id>\",\n *     \"<client-id>\",\n *     \"<my key>\",\n *     { component: { tag: true } });\n *\n * var tagComponent = viewer.getComponent(\"tag\");\n * ```\n */\nexport class TagComponent extends Component<ITagConfiguration> {\n    /** @inheritdoc */\n    public static componentName: string = \"tag\";\n\n    /**\n     * Event fired when an interaction to create a geometry ends.\n     *\n     * @description A create interaction can by a geometry being created\n     * or by the creation being aborted.\n     *\n     * @event TagComponent#creategeometryend\n     * @type {TagComponent} Tag component.\n     * @example\n     * ```\n     * tagComponent.on(\"creategeometryend\", function(component) {\n     *     console.log(component);\n     * });\n     * ```\n     */\n    public static creategeometryend: string = \"creategeometryend\";\n\n    /**\n     * Event fired when an interaction to create a geometry starts.\n     *\n     * @description A create interaction starts when the first vertex\n     * is created in the geometry.\n     *\n     * @event TagComponent#creategeometrystart\n     * @type {TagComponent} Tag component.\n     * @example\n     * ```\n     * tagComponent.on(\"creategeometrystart\", function(component) {\n     *     console.log(component);\n     * });\n     * ```\n     */\n    public static creategeometrystart: string = \"creategeometrystart\";\n\n    /**\n     * Event fired when the create mode is changed.\n     *\n     * @event TagComponent#modechanged\n     * @type {TagMode} Tag mode\n     * @example\n     * ```\n     * tagComponent.on(\"modechanged\", function(mode) {\n     *     console.log(mode);\n     * });\n     * ```\n     */\n    public static modechanged: string = \"modechanged\";\n\n    /**\n     * Event fired when a geometry has been created.\n     *\n     * @event TagComponent#geometrycreated\n     * @type {Geometry} Created geometry.\n     * @example\n     * ```\n     * tagComponent.on(\"geometrycreated\", function(geometry) {\n     *     console.log(geometry);\n     * });\n     * ```\n     */\n    public static geometrycreated: string = \"geometrycreated\";\n\n    /**\n     * Event fired when the tags collection has changed.\n     *\n     * @event TagComponent#tagschanged\n     * @type {TagComponent} Tag component.\n     * @example\n     * ```\n     * tagComponent.on(\"tagschanged\", function(component) {\n     *     console.log(component.getAll());\n     * });\n     * ```\n     */\n    public static tagschanged: string = \"tagschanged\";\n\n    private _tagDomRenderer: TagDOMRenderer;\n    private _tagScene: TagScene;\n    private _tagSet: TagSet;\n    private _tagCreator: TagCreator;\n    private _viewportCoords: ViewportCoords;\n\n    private _renderTags$: Observable<RenderTag<Tag>[]>;\n    private _tagChanged$: Observable<Tag>;\n    private _renderTagGLChanged$: Observable<RenderTag<Tag>>;\n    private _createGeometryChanged$: Observable<OutlineCreateTag>;\n    private _createGLObjectsChanged$: Observable<OutlineCreateTag>;\n\n    private _creatingConfiguration$: Observable<ITagConfiguration>;\n\n    private _updateGLObjectsSubscription: Subscription;\n    private _updateTagSceneSubscription: Subscription;\n\n    private _stopCreateSubscription: Subscription;\n    private _setGLCreateTagSubscription: Subscription;\n    private _createGLObjectsChangedSubscription: Subscription;\n\n    private _handlerStopCreateSubscription: Subscription;\n    private _handlerEnablerSubscription: Subscription;\n\n    private _domSubscription: Subscription;\n    private _glSubscription: Subscription;\n\n    private _fireCreateGeometryEventSubscription: Subscription;\n    private _fireGeometryCreatedSubscription: Subscription;\n    private _fireTagsChangedSubscription: Subscription;\n\n    private _createHandlers: { [K in keyof typeof TagMode]: CreateHandlerBase };\n    private _editVertexHandler: EditVertexHandler;\n\n    constructor(name: string, container: Container, navigator: Navigator) {\n        super(name, container, navigator);\n\n        this._tagDomRenderer = new TagDOMRenderer();\n        this._tagScene = new TagScene();\n        this._tagSet = new TagSet();\n        this._tagCreator = new TagCreator(this, navigator);\n        this._viewportCoords = new ViewportCoords();\n\n        this._createHandlers = {\n            \"CreatePoint\": new CreatePointHandler(this, container, navigator, this._viewportCoords, this._tagCreator),\n            \"CreatePolygon\": new CreatePolygonHandler(this, container, navigator, this._viewportCoords, this._tagCreator),\n            \"CreateRect\": new CreateRectHandler(this, container, navigator, this._viewportCoords, this._tagCreator),\n            \"CreateRectDrag\": new CreateRectDragHandler(this, container, navigator, this._viewportCoords, this._tagCreator),\n            \"Default\": undefined,\n        };\n\n        this._editVertexHandler = new EditVertexHandler(this, container, navigator, this._viewportCoords, this._tagSet);\n\n        this._renderTags$ = this._tagSet.changed$\n            .map(\n                (tagSet: TagSet): RenderTag<Tag>[] => {\n                    const tags: RenderTag<Tag>[] = tagSet.getAll();\n\n                    // ensure that tags are always rendered in the same order\n                    // to avoid hover tracking problems on first resize.\n                    tags.sort(\n                        (t1: RenderTag<Tag>, t2: RenderTag<Tag>): number => {\n                            const id1: string = t1.tag.id;\n                            const id2: string = t2.tag.id;\n\n                            if (id1 < id2) {\n                                return -1;\n                            }\n\n                            if (id1 > id2) {\n                                return 1;\n                            }\n\n                            return 0;\n                        });\n\n                    return tags;\n                })\n            .share();\n\n        this._tagChanged$ = this._renderTags$\n            .switchMap(\n                (tags: RenderTag<Tag>[]): Observable<Tag> => {\n                    return Observable\n                        .from(tags)\n                        .mergeMap(\n                            (tag: RenderTag<Tag>): Observable<Tag> => {\n                                return Observable\n                                    .merge(\n                                        tag.tag.changed$,\n                                        tag.tag.geometryChanged$);\n                            });\n                })\n            .share();\n\n        this._renderTagGLChanged$ = this._renderTags$\n            .switchMap(\n                (tags: RenderTag<Tag>[]): Observable<RenderTag<Tag>> => {\n                    return Observable\n                        .from(tags)\n                        .mergeMap(\n                            (tag: RenderTag<Tag>): Observable<RenderTag<Tag>> => {\n                                return tag.glObjectsChanged$;\n                            });\n                })\n            .share();\n\n        this._createGeometryChanged$ = this._tagCreator.tag$\n            .switchMap(\n                (tag: OutlineCreateTag): Observable<OutlineCreateTag> => {\n                    return tag != null ?\n                        tag.geometryChanged$ :\n                        Observable.empty<OutlineCreateTag>();\n                })\n            .share();\n\n        this._createGLObjectsChanged$ = this._tagCreator.tag$\n            .switchMap(\n                (tag: OutlineCreateTag): Observable<OutlineCreateTag> => {\n                    return tag != null ?\n                        tag.glObjectsChanged$ :\n                        Observable.empty<OutlineCreateTag>();\n                })\n            .share();\n\n        this._creatingConfiguration$ = this._configuration$\n            .distinctUntilChanged(\n                (c1: ITagConfiguration, c2: ITagConfiguration): boolean => {\n                    return c1.mode === c2.mode;\n                },\n                (configuration: ITagConfiguration): ITagConfiguration => {\n                    return {\n                        createColor: configuration.createColor,\n                        mode: configuration.mode,\n                    };\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._creatingConfiguration$\n            .subscribe(\n                (configuration: ITagConfiguration): void => {\n                    this.fire(TagComponent.modechanged, configuration.mode);\n                });\n    }\n\n    /**\n     * Add tags to the tag set or replace tags in the tag set.\n     *\n     * @description If a tag already in the set has the same\n     * id as one of the tags added, the old tag will be removed\n     * the added tag will take its place.\n     *\n     * @param {Array<Tag>} tags - Tags to add.\n     *\n     * @example ```tagComponent.add([tag1, tag2]);```\n     */\n    public add(tags: Tag[]): void {\n        if (this._activated) {\n            this._navigator.stateService.currentTransform$\n                .first()\n                .subscribe(\n                    (transform: Transform): void => {\n                        this._tagSet.add(tags, transform);\n\n                        const renderTags: RenderTag<Tag>[] = tags\n                            .map(\n                                (tag: Tag): RenderTag<Tag> => {\n                                    return this._tagSet.get(tag.id);\n                                });\n\n                        this._tagScene.add(renderTags);\n                    });\n        } else {\n            this._tagSet.addDeactivated(tags);\n        }\n    }\n\n    /**\n     * Change the current tag mode.\n     *\n     * @description Change the tag mode to one of the create modes for creating new geometries.\n     *\n     * @param {TagMode} mode - New tag mode.\n     *\n     * @fires TagComponent#modechanged\n     *\n     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```\n     */\n    public changeMode(mode: TagMode): void {\n        this.configure({ mode: mode });\n    }\n\n    /**\n     * Returns the tag in the tag set with the specified id, or\n     * undefined if the id matches no tag.\n     *\n     * @param {string} tagId - Id of the tag.\n     *\n     * @example ```var tag = tagComponent.get(\"tagId\");```\n     */\n    public get(tagId: string): Tag {\n        if (this._activated) {\n            const renderTag: RenderTag<Tag> = this._tagSet.get(tagId);\n            return renderTag !== undefined ? renderTag.tag : undefined;\n        } else {\n            return this._tagSet.getDeactivated(tagId);\n        }\n    }\n\n    /**\n     * Returns an array of all tags.\n     *\n     * @example ```var tags = tagComponent.getAll();```\n     */\n    public getAll(): Tag[] {\n        if (this.activated) {\n            return this._tagSet\n                .getAll()\n                .map(\n                    (renderTag: RenderTag<Tag>): Tag => {\n                        return renderTag.tag;\n                    });\n        } else {\n            return this._tagSet.getAllDeactivated();\n        }\n    }\n\n    /**\n     * Returns an array of tag ids for tags that contain the specified point.\n     *\n     * @description The pixel point must lie inside the polygon or rectangle\n     * of an added tag for the tag id to be returned. Tag ids for\n     * tags that do not have a fill will also be returned if the point is inside\n     * the geometry of the tag. Tags with point geometries can not be retrieved.\n     *\n     * No tag ids will be returned for panoramas.\n     *\n     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.\n     *\n     * With this function, you can use the coordinates provided by mouse\n     * events to get information out of the tag component.\n     *\n     * If no tag at exist the pixel point, an empty array will be returned.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.\n     * @returns {Array<string>} Ids of the tags that contain the specified pixel point.\n     *\n     * @example\n     * ```\n     * tagComponent.getTagIdsAt([100, 100])\n     *     .then((tagIds) => { console.log(tagIds); });\n     * ```\n     */\n    public getTagIdsAt(pixelPoint: number[]): when.Promise<string[]> {\n        return when.promise<string[]>((resolve: (value: string[]) => void, reject: (reason: Error) => void): void => {\n            this._container.renderService.renderCamera$\n                .first()\n                .map(\n                    (render: RenderCamera): string[] => {\n                        const viewport: number[] = this._viewportCoords\n                            .canvasToViewport(\n                                pixelPoint[0],\n                                pixelPoint[1],\n                                this._container.element);\n\n                        const ids: string[] = this._tagScene.intersectObjects(viewport, render.perspective);\n\n                        return ids;\n                    })\n                .subscribe(\n                    (ids: string[]): void => {\n                        resolve(ids);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n        });\n    }\n\n    /**\n     * Check if a tag exist in the tag set.\n     *\n     * @param {string} tagId - Id of the tag.\n     *\n     * @example ```var tagExists = tagComponent.has(\"tagId\");```\n     */\n    public has(tagId: string): boolean {\n        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);\n    }\n\n    /**\n     * Remove tags with the specified ids from the tag set.\n     *\n     * @param {Array<string>} tagIds - Ids for tags to remove.\n     *\n     * @example ```tagComponent.remove([\"id-1\", \"id-2\"]);```\n     */\n    public remove(tagIds: string[]): void {\n        if (this._activated) {\n            this._tagSet.remove(tagIds);\n            this._tagScene.remove(tagIds);\n        } else {\n            this._tagSet.removeDeactivated(tagIds);\n        }\n    }\n\n    /**\n     * Remove all tags from the tag set.\n     *\n     * @example ```tagComponent.removeAll();```\n     */\n    public removeAll(): void {\n        if (this._activated) {\n            this._tagSet.removeAll();\n            this._tagScene.removeAll();\n        } else {\n            this._tagSet.removeAllDeactivated();\n        }\n    }\n\n    protected _activate(): void {\n        this._editVertexHandler.enable();\n\n        const handlerGeometryCreated$: Observable<Geometry> = Observable\n            .from<keyof typeof TagMode>(<(keyof typeof TagMode)[]>Object.keys(this._createHandlers))\n            .map(\n                (key: keyof typeof TagMode): CreateHandlerBase => {\n                    return this._createHandlers[key];\n                })\n            .filter(\n                (handler: CreateHandlerBase): boolean => {\n                    return !!handler;\n                })\n            .mergeMap(\n                (handler: CreateHandlerBase): Observable<Geometry> => {\n                    return handler.geometryCreated$;\n                })\n            .share();\n\n        this._fireGeometryCreatedSubscription = handlerGeometryCreated$\n            .subscribe(\n                (geometry: Geometry): void => {\n                    this.fire(TagComponent.geometrycreated, geometry);\n                });\n\n        this._fireCreateGeometryEventSubscription = this._tagCreator.tag$\n            .skipWhile(\n                (tag: OutlineCreateTag): boolean => {\n                    return tag == null;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (tag: OutlineCreateTag): void => {\n                    const eventType: string = tag != null ?\n                        TagComponent.creategeometrystart :\n                        TagComponent.creategeometryend;\n\n                    this.fire(eventType, this);\n                });\n\n        this._handlerStopCreateSubscription = handlerGeometryCreated$\n            .subscribe(\n                (): void => {\n                    this.changeMode(TagMode.Default);\n                });\n\n        this._handlerEnablerSubscription = this._creatingConfiguration$\n            .subscribe(\n                (configuration: ITagConfiguration): void => {\n                    this._disableCreateHandlers();\n\n                    const mode: keyof typeof TagMode = <keyof typeof TagMode>TagMode[configuration.mode];\n                    const handler: CreateHandlerBase = this._createHandlers[mode];\n                    if (!!handler) {\n                        handler.enable();\n                    }\n                });\n\n        this._fireTagsChangedSubscription = this._renderTags$\n            .subscribe(\n                (tags: RenderTag<Tag>[]): void => {\n                    this.fire(TagComponent.tagschanged, this);\n                });\n\n        this._stopCreateSubscription = this._tagCreator.tag$\n            .switchMap(\n                (tag: OutlineCreateTag): Observable<void> => {\n                    return tag != null ?\n                        tag.aborted$\n                            .map((t: OutlineCreateTag): void => { return null; }) :\n                        Observable.empty<void>();\n                })\n            .subscribe((): void => { this.changeMode(TagMode.Default); });\n\n        this._setGLCreateTagSubscription = this._tagCreator.tag$\n            .subscribe(\n                (tag: OutlineCreateTag): void => {\n                    if (this._tagScene.hasCreateTag()) {\n                        this._tagScene.removeCreateTag();\n                    }\n\n                    if (tag != null) {\n                        this._tagScene.addCreateTag(tag);\n                    }\n                });\n\n        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$\n            .subscribe(\n                (tag: OutlineCreateTag): void => {\n                    this._tagScene.updateCreateTagObjects(tag);\n                });\n\n        this._updateGLObjectsSubscription = this._renderTagGLChanged$\n            .subscribe(\n                (tag: RenderTag<Tag>): void => {\n                    this._tagScene.updateObjects(tag);\n                });\n\n        this._updateTagSceneSubscription = this._tagChanged$\n            .subscribe(\n                (tag: Tag): void => {\n                    this._tagScene.update();\n                });\n\n        this._domSubscription = this._renderTags$\n            .startWith([])\n            .do(\n                (tags: RenderTag<Tag>[]): void => {\n                    this._container.domRenderer.render$.next({\n                        name: this._name,\n                        vnode: this._tagDomRenderer.clear(),\n                    });\n                })\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._container.spriteService.spriteAtlas$,\n                this._container.renderService.size$,\n                this._tagChanged$.startWith(null),\n                this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null),\n                (renderTags: RenderTag<Tag>[], rc: RenderCamera, atlas: ISpriteAtlas, size: ISize, tag: Tag, ct: OutlineCreateTag):\n                [RenderCamera, ISpriteAtlas, ISize, RenderTag<Tag>[], Tag, OutlineCreateTag] => {\n                    return [rc, atlas, size, renderTags, tag, ct];\n                })\n            .map(\n                (args: [RenderCamera, ISpriteAtlas, ISize, RenderTag<Tag>[], Tag, OutlineCreateTag]):\n                    IVNodeHash => {\n                    return {\n                        name: this._name,\n                        vnode: this._tagDomRenderer.render(args[3], args[5], args[1], args[0].perspective, args[2]),\n                    };\n                })\n            .subscribe(this._container.domRenderer.render$);\n\n        this._glSubscription = this._navigator.stateService.currentState$\n            .map(\n                (frame: IFrame): IGLRenderHash => {\n                    const tagScene: TagScene = this._tagScene;\n\n                    return {\n                        name: this._name,\n                        render: {\n                            frameId: frame.id,\n                            needsRender: tagScene.needsRender,\n                            render: tagScene.render.bind(tagScene),\n                            stage: GLRenderStage.Foreground,\n                        },\n                    };\n                })\n            .subscribe(this._container.glRenderer.render$);\n\n        this._navigator.stateService.currentTransform$\n            .first()\n            .subscribe(\n                (transform: Transform): void => {\n                    this._tagSet.activate(transform);\n                    this._tagScene.add(this._tagSet.getAll());\n                });\n\n    }\n\n    protected _deactivate(): void {\n        this._editVertexHandler.disable();\n        this._disableCreateHandlers();\n\n        this._tagScene.clear();\n        this._tagSet.deactivate();\n\n        this._tagCreator.delete$.next(null);\n\n        this._updateGLObjectsSubscription.unsubscribe();\n        this._updateTagSceneSubscription.unsubscribe();\n\n        this._stopCreateSubscription.unsubscribe();\n        this._setGLCreateTagSubscription.unsubscribe();\n        this._createGLObjectsChangedSubscription.unsubscribe();\n\n        this._domSubscription.unsubscribe();\n        this._glSubscription.unsubscribe();\n\n        this._fireCreateGeometryEventSubscription.unsubscribe();\n        this._fireGeometryCreatedSubscription.unsubscribe();\n        this._fireTagsChangedSubscription.unsubscribe();\n\n        this._handlerStopCreateSubscription.unsubscribe();\n        this._handlerEnablerSubscription.unsubscribe();\n\n        this._container.element.classList.remove(\"component-tag-create\");\n    }\n\n    protected _getDefaultConfiguration(): ITagConfiguration {\n        return {\n            createColor: 0xFFFFFF,\n            mode: TagMode.Default,\n        };\n    }\n\n    private _disableCreateHandlers(): void {\n        const createHandlers: { [K in keyof typeof TagMode]: CreateHandlerBase } = this._createHandlers;\n        for (const key in createHandlers) {\n            if (!createHandlers.hasOwnProperty(key)) {\n                continue;\n            }\n\n            const handler: CreateHandlerBase = createHandlers[<keyof typeof TagMode>key];\n            if (!!handler) {\n                handler.disable();\n            }\n        }\n    }\n}\n\nComponentService.register(TagComponent);\nexport default TagComponent;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/share\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {\n    Component,\n    ITagConfiguration,\n    OutlineCreateTag,\n    PolygonGeometry,\n    RectGeometry,\n} from \"../../Component\";\nimport {Transform} from \"../../Geo\";\nimport {Navigator} from \"../../Viewer\";\n\ninterface ICreateTagOperation {\n    (tag: OutlineCreateTag): OutlineCreateTag;\n}\n\nexport class TagCreator {\n    private _component: Component<ITagConfiguration>;\n    private _navigator: Navigator;\n\n    private _tagOperation$: Subject<ICreateTagOperation>;\n    private _tag$: Observable<OutlineCreateTag>;\n\n    private _createPolygon$: Subject<number[]>;\n    private _createRect$: Subject<number[]>;\n    private _delete$: Subject<void>;\n\n    constructor(component: Component<ITagConfiguration>, navigator: Navigator) {\n        this._component = component;\n        this._navigator = navigator;\n\n        this._tagOperation$ = new Subject<ICreateTagOperation>();\n        this._createPolygon$ = new Subject<number[]>();\n        this._createRect$ = new Subject<number[]>();\n        this._delete$ = new Subject<void>();\n\n        this._tag$ = this._tagOperation$\n            .scan(\n                (tag: OutlineCreateTag, operation: ICreateTagOperation): OutlineCreateTag => {\n                    return operation(tag);\n                },\n                null)\n            .share();\n\n        this._createRect$\n            .withLatestFrom(\n                this._component.configuration$,\n                this._navigator.stateService.currentTransform$)\n            .map(\n                ([coord, conf, transform]: [number[], ITagConfiguration, Transform]): ICreateTagOperation => {\n                    return (tag: OutlineCreateTag): OutlineCreateTag => {\n                        const geometry: RectGeometry = new RectGeometry([\n                            coord[0],\n                            coord[1],\n                            coord[0],\n                            coord[1],\n                        ]);\n\n                        return new OutlineCreateTag(geometry, { color: conf.createColor }, transform);\n                    };\n                })\n            .subscribe(this._tagOperation$);\n\n        this._createPolygon$\n            .withLatestFrom(\n                this._component.configuration$,\n                this._navigator.stateService.currentTransform$)\n            .map(\n                ([coord, conf, transform]: [number[], ITagConfiguration, Transform]): ICreateTagOperation => {\n                    return (tag: OutlineCreateTag): OutlineCreateTag => {\n                        const geometry: PolygonGeometry = new PolygonGeometry([\n                            [coord[0], coord[1]],\n                            [coord[0], coord[1]],\n                            [coord[0], coord[1]],\n                        ]);\n\n                        return new OutlineCreateTag(geometry, { color: conf.createColor }, transform);\n                    };\n                })\n            .subscribe(this._tagOperation$);\n\n        this._delete$\n            .map(\n                (): ICreateTagOperation => {\n                    return (tag: OutlineCreateTag): OutlineCreateTag => {\n                        return null;\n                    };\n                })\n            .subscribe(this._tagOperation$);\n    }\n\n    public get createRect$(): Subject<number[]> {\n        return this._createRect$;\n    }\n\n    public get createPolygon$(): Subject<number[]> {\n        return this._createPolygon$;\n    }\n\n    public get delete$(): Subject<void> {\n        return this._delete$;\n    }\n\n    public get tag$(): Observable<OutlineCreateTag> {\n        return this._tag$;\n    }\n}\n\nexport default TagCreator;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class Geometry\n * @abstract\n * @classdesc Represents a geometry.\n */\nexport abstract class Geometry {\n    protected _notifyChanged$: Subject<Geometry>;\n\n    /**\n     * Create a geometry.\n     *\n     * @constructor\n     */\n    constructor() {\n        this._notifyChanged$ = new Subject<Geometry>();\n    }\n\n    /**\n     * Get changed observable.\n     *\n     * @description Emits the geometry itself every time the geometry\n     * has changed.\n     *\n     * @returns {Observable<Geometry>} Observable emitting the geometry instance.\n     * @ignore\n     */\n    public get changed$(): Observable<Geometry> {\n        return this._notifyChanged$;\n    }\n\n    /**\n     * Get the 2D basic coordinates for the centroid of the geometry.\n     *\n     * @returns {Array<number>} 2D basic coordinates representing the centroid.\n     * @ignore\n     */\n    public abstract getCentroid2d(): number[];\n\n    /**\n     * Get the 3D world coordinates for the centroid of the geometry.\n     *\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<number>} 3D world coordinates representing the centroid.\n     * @ignore\n     */\n    public abstract getCentroid3d(transform: Transform): number[];\n\n    /**\n     * Set the 2D centroid of the geometry.\n     *\n     * @param {Array<number>} value - The new value of the centroid in basic coordinates.\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @ignore\n     */\n    public abstract setCentroid2d(value: number[], transform: Transform): void;\n}\n\nexport default Geometry;\n",
     "import {Geometry, GeometryTagError} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class PointGeometry\n *\n * @classdesc Represents a point geometry in the 2D basic image coordinate system.\n *\n * @example\n * ```\n * var basicPoint = [0.5, 0.7];\n * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);\n * ```\n */\nexport class PointGeometry extends Geometry {\n    private _point: number[];\n\n    /**\n     * Create a point geometry.\n     *\n     * @constructor\n     * @param {Array<number>} point - An array representing the basic coordinates of\n     * the point.\n     *\n     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.\n     */\n    constructor(point: number[]) {\n        super();\n\n        let x: number = point[0];\n        let y: number = point[1];\n\n        if (x < 0 || x > 1 || y < 0 || y > 1) {\n            throw new GeometryTagError(\"Basic coordinates must be on the interval [0, 1].\");\n        }\n\n        this._point = point.slice();\n    }\n\n    /**\n     * Get point property.\n     * @returns {Array<number>} Array representing the basic coordinates of the point.\n     */\n    public get point(): number[] {\n        return this._point;\n    }\n\n    /**\n     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D\n     * basic coordinates of the point itself.\n     *\n     * @returns {Array<number>} 2D basic coordinates representing the centroid.\n     */\n    public getCentroid2d(): number[] {\n        return this._point.slice();\n    }\n\n    /**\n     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D\n     * world coordinates of the point itself.\n     *\n     * @param {Transform} transform - The transform of the node related to the point.\n     * @returns {Array<number>} 3D world coordinates representing the centroid.\n     */\n    public getCentroid3d(transform: Transform): number[] {\n        return transform.unprojectBasic(this._point, 200);\n    }\n\n    /**\n     * Set the centroid of the point, i.e. the point coordinates.\n     *\n     * @param {Array<number>} value - The new value of the centroid.\n     * @param {Transform} transform - The transform of the node related to the point.\n     */\n    public setCentroid2d(value: number[], transform: Transform): void {\n        let changed: number[] = [\n            Math.max(0, Math.min(1, value[0])),\n            Math.max(0, Math.min(1, value[1])),\n        ];\n\n        this._point[0] = changed[0];\n        this._point[1] = changed[1];\n\n        this._notifyChanged$.next(this);\n    }\n}\n",
     "import {GeometryTagError, VertexGeometry} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class PolygonGeometry\n *\n * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.\n * All polygons and holes provided to the constructor needs to be closed.\n *\n * @example\n * ```\n * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];\n * var polygonGeometry = new Mapillary.TagComponent.PointGeometry(basicPolygon);\n * ```\n */\nexport class PolygonGeometry extends VertexGeometry {\n    private _polygon: number[][];\n    private _holes: number[][][];\n\n    /**\n     * Create a polygon geometry.\n     *\n     * @constructor\n     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.\n     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.\n     * Each array of holes vertices must be closed.\n     *\n     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.\n     */\n    constructor(polygon: number[][], holes?: number[][][]) {\n        super();\n\n        let polygonLength: number = polygon.length;\n\n        if (polygonLength < 3) {\n            throw new GeometryTagError(\"A polygon must have three or more positions.\");\n        }\n\n        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||\n            polygon[0][1] !== polygon[polygonLength - 1][1]) {\n            throw new GeometryTagError(\"First and last positions must be equivalent.\");\n        }\n\n        this._polygon = [];\n        for (let vertex of polygon) {\n            if (vertex[0] < 0 || vertex[0] > 1 ||\n                vertex[1] < 0 || vertex[1] > 1) {\n                throw new GeometryTagError(\"Basic coordinates of polygon must be on the interval [0, 1].\");\n            }\n\n            this._polygon.push(vertex.slice());\n        }\n\n        this._holes = [];\n\n        if (holes == null) {\n            return;\n        }\n\n        for (let i: number = 0; i < holes.length; i++) {\n            let hole: number[][] = holes[i];\n            let holeLength: number = hole.length;\n\n            if (holeLength < 3) {\n                throw new GeometryTagError(\"A polygon hole must have three or more positions.\");\n            }\n\n            if (hole[0][0] !== hole[holeLength - 1][0] ||\n                hole[0][1] !== hole[holeLength - 1][1]) {\n                throw new GeometryTagError(\"First and last positions of hole must be equivalent.\");\n            }\n\n            this._holes.push([]);\n\n            for (let vertex of hole) {\n                if (vertex[0] < 0 || vertex[0] > 1 ||\n                    vertex[1] < 0 || vertex[1] > 1) {\n                    throw new GeometryTagError(\"Basic coordinates of hole must be on the interval [0, 1].\");\n                }\n\n                this._holes[i].push(vertex.slice());\n            }\n        }\n    }\n\n    /**\n     * Get polygon property.\n     * @returns {Array<Array<number>>} Closed 2d polygon.\n     */\n    public get polygon(): number[][] {\n        return this._polygon;\n    }\n\n    /**\n     * Get holes property.\n     * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.\n     */\n    public get holes(): number[][][] {\n        return this._holes;\n    }\n\n    /**\n     * Add a vertex to the polygon by appending it after the last vertex.\n     *\n     * @param {Array<number>} vertex - Vertex to add.\n     */\n    public addVertex2d(vertex: number[]): void {\n        let clamped: number[] = [\n            Math.max(0, Math.min(1, vertex[0])),\n            Math.max(0, Math.min(1, vertex[1])),\n        ];\n\n        this._polygon.splice(this._polygon.length - 1, 0, clamped);\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     */\n    public getVertex2d(index: number): number[] {\n        return this._polygon[index].slice();\n    }\n\n    /**\n     * Remove a vertex from the polygon.\n     *\n     * @param {number} index - The index of the vertex to remove.\n     */\n    public removeVertex2d(index: number): void {\n        if (index < 0 ||\n            index >= this._polygon.length ||\n            this._polygon.length < 4) {\n            throw new GeometryTagError(\"Index for removed vertex must be valid.\");\n        }\n\n        if (index > 0 && index < this._polygon.length - 1) {\n            this._polygon.splice(index, 1);\n        } else {\n            this._polygon.splice(0, 1);\n            this._polygon.pop();\n\n            let closing: number[] = this._polygon[0].slice();\n            this._polygon.push(closing);\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public setVertex2d(index: number, value: number[], transform: Transform): void {\n        let changed: number[] = [\n            Math.max(0, Math.min(1, value[0])),\n            Math.max(0, Math.min(1, value[1])),\n        ];\n\n        if (index === 0 || index === this._polygon.length - 1) {\n            this._polygon[0] = changed.slice();\n            this._polygon[this._polygon.length - 1] = changed.slice();\n        } else {\n            this._polygon[index] = changed.slice();\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public setCentroid2d(value: number[], transform: Transform): void {\n        let xs: number[] = this._polygon.map((point: number[]): number => { return point[0]; });\n        let ys: number[] = this._polygon.map((point: number[]): number => { return point[1]; });\n\n        let minX: number = Math.min.apply(Math, xs);\n        let maxX: number = Math.max.apply(Math, xs);\n        let minY: number = Math.min.apply(Math, ys);\n        let maxY: number = Math.max.apply(Math, ys);\n\n        let centroid: number[] = this.getCentroid2d();\n\n        let minTranslationX: number = -minX;\n        let maxTranslationX: number = 1 - maxX;\n        let minTranslationY: number = -minY;\n        let maxTranslationY: number = 1 - maxY;\n\n        let translationX: number = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));\n        let translationY: number = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));\n\n        for (let point of this._polygon) {\n            point[0] += translationX;\n            point[1] += translationY;\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public getPoints3d(transform: Transform): number[][] {\n        return this.getVertices3d(transform);\n    }\n\n    /** @inheritdoc */\n    public getVertex3d(index: number, transform: Transform): number[] {\n        return transform.unprojectBasic(this._polygon[index], 200);\n    }\n\n    /** @inheritdoc */\n    public getVertices2d(): number[][] {\n        return this._polygon.slice();\n    }\n\n    /** @inheritdoc */\n    public getVertices3d(transform: Transform): number[][] {\n        return this._polygon\n            .map(\n                (point: number[]) => {\n                    return transform.unprojectBasic(point, 200);\n                });\n    }\n\n    /**\n     * Get a polygon representation of the 3D coordinates for the vertices of each hole\n     * of the geometry.\n     *\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates\n     * representing the vertices of each hole of the geometry.\n     */\n    public getHoleVertices3d(transform: Transform): number[][][] {\n        let holes3d: number[][][] = [];\n\n        for (let hole of this._holes) {\n            let hole3d: number[][] = hole\n                .map(\n                    (point: number[]) => {\n                        return transform.unprojectBasic(point, 200);\n                    });\n\n            holes3d.push(hole3d);\n        }\n\n        return holes3d;\n    }\n\n    /** @inheritdoc */\n    public getCentroid2d(): number[] {\n        let polygon: number[][] = this._polygon;\n\n        let area: number = 0;\n        let centroidX: number = 0;\n        let centroidY: number = 0;\n\n        for (let i: number = 0; i < polygon.length - 1; i++) {\n            let xi: number = polygon[i][0];\n            let yi: number = polygon[i][1];\n            let xi1: number = polygon[i + 1][0];\n            let yi1: number = polygon[i + 1][1];\n\n            let a: number = xi * yi1 - xi1 * yi;\n\n            area += a;\n            centroidX += (xi + xi1) * a;\n            centroidY += (yi + yi1) * a;\n        }\n\n        area /= 2;\n\n        centroidX /= 6 * area;\n        centroidY /= 6 * area;\n\n        return [centroidX, centroidY];\n    }\n\n    /** @inheritdoc */\n    public getCentroid3d(transform: Transform): number[] {\n        let centroid2d: number[] = this.getCentroid2d();\n\n        return transform.unprojectBasic(centroid2d, 200);\n    }\n\n    /** @inheritdoc */\n    public getTriangles3d(transform: Transform): number[] {\n        return this._triangulate(\n            this._polygon,\n            this.getPoints3d(transform),\n            this._holes,\n            this.getHoleVertices3d(transform));\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility2d(): number[] {\n        return this._getPoleOfInaccessibility2d(this._polygon.slice());\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility3d(transform: Transform): number[] {\n        let pole2d: number[] = this._getPoleOfInaccessibility2d(this._polygon.slice());\n\n        return transform.unprojectBasic(pole2d, 200);\n    }\n}\n\nexport default PolygonGeometry;\n",
-    "import {GeometryTagError, VertexGeometry} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class RectGeometry\n *\n * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.\n *\n * @example\n * ```\n * var basicRect = [0.5, 0.3, 0.7, 0.4];\n * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);\n * ```\n */\nexport class RectGeometry extends VertexGeometry {\n    private _anchorIndex: number;\n    private _inverted: boolean;\n    private _rect: number[];\n\n    /**\n     * Create a rectangle geometry.\n     *\n     * @constructor\n     * @param {Array<number>} rect - An array representing the top-left and bottom-right\n     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].\n     *\n     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.\n     */\n    constructor(rect: number[]) {\n        super();\n\n        if (rect[1] > rect[3]) {\n            throw new GeometryTagError(\"Basic Y coordinates values can not be inverted.\");\n        }\n\n        for (let coord of rect) {\n            if (coord < 0 || coord > 1) {\n                throw new GeometryTagError(\"Basic coordinates must be on the interval [0, 1].\");\n            }\n        }\n\n\n        this._anchorIndex = undefined;\n        this._rect = rect.slice(0, 4);\n        this._inverted = this._rect[0] > this._rect[2];\n    }\n\n    /**\n     * Get anchor index property.\n     *\n     * @returns {number} Index representing the current anchor property if\n     * achoring indexing has been initialized. If anchor indexing has not been\n     * initialized or has been terminated undefined will be returned.\n     */\n    public get anchorIndex(): number {\n        return this._anchorIndex;\n    }\n\n    /**\n     * Get inverted property.\n     *\n     * @returns {boolean} Boolean determining whether the rect geometry is\n     * inverted. For panoramas the rect geometrye may be inverted.\n     */\n    public get inverted(): boolean {\n        return this._inverted;\n    }\n\n    /**\n     * Get rect property.\n     *\n     * @returns {Array<number>} Array representing the top-left and bottom-right\n     * corners of the rectangle in basic coordinates.\n     */\n    public get rect(): number[] {\n        return this._rect;\n    }\n\n    /**\n     * Initialize anchor indexing to enable setting opposite vertex.\n     *\n     * @param {number} [index] - The index of the vertex to use as anchor.\n     *\n     * @throws {Error} If anchor indexing has already been initialized.\n     * @throws {Error} If index is not valid (0 to 3).\n     */\n    public initializeAnchorIndexing(index?: number): void {\n        if (this._anchorIndex !== undefined) {\n            throw new Error(\"Anchor indexing is already initialized.\");\n        }\n\n        if (index < 0 || index > 3) {\n            throw new Error(`Invalid anchor index: ${index}.`);\n        }\n\n        this._anchorIndex = index === undefined ? 0 : index;\n    }\n\n    /**\n     * Terminate anchor indexing to disable setting pposite vertex.\n     */\n    public terminateAnchorIndexing(): void {\n        this._anchorIndex = undefined;\n    }\n\n    /**\n     * Set the value of the vertex opposite to the anchor in the polygon\n     * representation of the rectangle.\n     *\n     * @description Setting the opposite vertex may change the anchor index.\n     *\n     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     *\n     * @throws {Error} When anchor indexing has not been initialized.\n     */\n    public setOppositeVertex2d(opposite: number[], transform: Transform): void {\n        if (this._anchorIndex === undefined) {\n            throw new Error(\"Anchor indexing needs to be initialized.\");\n        }\n\n        const changed: number[] = [\n            Math.max(0, Math.min(1, opposite[0])),\n            Math.max(0, Math.min(1, opposite[1])),\n        ];\n\n        const original: number[] = this._rect.slice();\n        const anchor: number[] = this._anchorIndex === 0 ? [original[0], original[3]] :\n            this._anchorIndex === 1 ? [original[0], original[1]] :\n            this._anchorIndex === 2 ? [original[2], original[1]] :\n            [original[2], original[3]];\n\n        if (transform.fullPano) {\n            const deltaX: number = this._anchorIndex < 2 ?\n                changed[0] - original[2] :\n                changed[0] - original[0];\n\n            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {\n                // right side passes boundary rightward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {\n                // left side passes right side and boundary rightward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {\n                this._inverted = false;\n                if (anchor[0] > changed[0]) {\n                    // left side passes boundary rightward\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                } else {\n                    // left side passes right side and boundary rightward\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                }\n            } else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {\n                // left side passes boundary leftward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {\n                // right side passes left side and boundary leftward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {\n                this._inverted = false;\n                if (anchor[0] > changed[0]) {\n                    // right side passes boundary leftward\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                } else {\n                    // right side passes left side and boundary leftward\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                }\n            } else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {\n                // inverted and right side passes left side completing a loop\n                this._inverted = false;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {\n                // inverted and left side passes right side completing a loop\n                this._inverted = false;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (this._inverted) {\n                // if still inverted only top and bottom can switch\n                if (this._anchorIndex < 2) {\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                } else {\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                }\n            } else {\n                // if still not inverted treat as non full pano\n                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {\n                    this._anchorIndex = 0;\n                } else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {\n                    this._anchorIndex = 1;\n                } else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {\n                    this._anchorIndex = 2;\n                } else {\n                    this._anchorIndex = 3;\n                }\n            }\n\n            const rect: number[] = [];\n            if (this._anchorIndex === 0) {\n                rect[0] = anchor[0];\n                rect[1] = changed[1];\n                rect[2] = changed[0];\n                rect[3] = anchor[1];\n            } else if (this._anchorIndex === 1) {\n                rect[0] = anchor[0];\n                rect[1] = anchor[1];\n                rect[2] = changed[0];\n                rect[3] = changed[1];\n            } else if (this._anchorIndex === 2) {\n                rect[0] = changed[0];\n                rect[1] = anchor[1];\n                rect[2] = anchor[0];\n                rect[3] = changed[1];\n            } else {\n                rect[0] = changed[0];\n                rect[1] = changed[1];\n                rect[2] = anchor[0];\n                rect[3] = anchor[1];\n            }\n\n            if (!this._inverted && rect[0] > rect[2] ||\n                this._inverted && rect[0] < rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n\n            if (rect[1] > rect[3]) {\n                rect[1] = original[1];\n                rect[3] = original[3];\n            }\n\n            this._rect[0] = rect[0];\n            this._rect[1] = rect[1];\n            this._rect[2] = rect[2];\n            this._rect[3] = rect[3];\n        } else {\n            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {\n                this._anchorIndex = 0;\n            } else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {\n                this._anchorIndex = 1;\n            } else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {\n                this._anchorIndex = 2;\n            } else {\n                this._anchorIndex = 3;\n            }\n\n            const rect: number[] = [];\n            if (this._anchorIndex === 0) {\n                rect[0] = anchor[0];\n                rect[1] = changed[1];\n                rect[2] = changed[0];\n                rect[3] = anchor[1];\n            } else if (this._anchorIndex === 1) {\n                rect[0] = anchor[0];\n                rect[1] = anchor[1];\n                rect[2] = changed[0];\n                rect[3] = changed[1];\n            } else if (this._anchorIndex === 2) {\n                rect[0] = changed[0];\n                rect[1] = anchor[1];\n                rect[2] = anchor[0];\n                rect[3] = changed[1];\n            } else {\n                rect[0] = changed[0];\n                rect[1] = changed[1];\n                rect[2] = anchor[0];\n                rect[3] = anchor[1];\n            }\n\n            if (rect[0] > rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n\n            if (rect[1] > rect[3]) {\n                rect[1] = original[1];\n                rect[3] = original[3];\n            }\n\n            this._rect[0] = rect[0];\n            this._rect[1] = rect[1];\n            this._rect[2] = rect[2];\n            this._rect[3] = rect[3];\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Set the value of a vertex in the polygon representation of the rectangle.\n     *\n     * @description The polygon is defined to have the first vertex at the\n     * bottom-left corner with the rest of the vertices following in clockwise order.\n     *\n     * @param {number} index - The index of the vertex to be set.\n     * @param {Array<number>} value - The new value of the vertex.\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     */\n    public setVertex2d(index: number, value: number[], transform: Transform): void {\n        let original: number[] = this._rect.slice();\n\n        let changed: number[] = [\n            Math.max(0, Math.min(1, value[0])),\n            Math.max(0, Math.min(1, value[1])),\n        ];\n\n        let rect: number[] = [];\n        if (index === 0) {\n            rect[0] = changed[0];\n            rect[1] = original[1];\n            rect[2] = original[2];\n            rect[3] = changed[1];\n        } else if (index === 1) {\n            rect[0] = changed[0];\n            rect[1] = changed[1];\n            rect[2] = original[2];\n            rect[3] = original[3];\n        } else if (index === 2) {\n            rect[0] = original[0];\n            rect[1] = changed[1];\n            rect[2] = changed[0];\n            rect[3] = original[3];\n        } else if (index === 3) {\n            rect[0] = original[0];\n            rect[1] = original[1];\n            rect[2] = changed[0];\n            rect[3] = changed[1];\n        }\n\n        if (transform.fullPano) {\n            let passingBoundaryLeftward: boolean =\n                index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||\n                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;\n\n            let passingBoundaryRightward: boolean =\n                index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||\n                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;\n\n            if (passingBoundaryLeftward || passingBoundaryRightward) {\n                this._inverted = !this._inverted;\n            } else {\n                if (rect[0] - original[0] < -0.25) {\n                    rect[0] = original[0];\n                }\n\n                if (rect[2] - original[2] > 0.25) {\n                    rect[2] = original[2];\n                }\n            }\n\n            if (!this._inverted && rect[0] > rect[2] ||\n                this._inverted && rect[0] < rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n        } else {\n            if (rect[0] > rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n        }\n\n        if (rect[1] > rect[3]) {\n            rect[1] = original[1];\n            rect[3] = original[3];\n        }\n\n        this._rect[0] = rect[0];\n        this._rect[1] = rect[1];\n        this._rect[2] = rect[2];\n        this._rect[3] = rect[3];\n\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public setCentroid2d(value: number[], transform: Transform): void {\n        let original: number[] = this._rect.slice();\n\n        let x0: number = original[0];\n        let x1: number = this._inverted ? original[2] + 1 : original[2];\n\n        let y0: number = original[1];\n        let y1: number = original[3];\n\n        let centerX: number = x0 + (x1 - x0) / 2;\n        let centerY: number = y0 + (y1 - y0) / 2;\n\n        let translationX: number = 0;\n\n        if (transform.gpano != null &&\n            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {\n            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;\n        } else {\n            let minTranslationX: number = -x0;\n            let maxTranslationX: number = 1 - x1;\n\n            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));\n        }\n\n        let minTranslationY: number = -y0;\n        let maxTranslationY: number = 1 - y1;\n\n        let translationY: number = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));\n\n        this._rect[0] = original[0] + translationX;\n        this._rect[1] = original[1] + translationY;\n        this._rect[2] = original[2] + translationX;\n        this._rect[3] = original[3] + translationY;\n\n        if (this._rect[0] < 0) {\n            this._rect[0] += 1;\n            this._inverted = !this._inverted;\n        } else if (this._rect[0] > 1) {\n            this._rect[0] -= 1;\n            this._inverted = !this._inverted;\n        }\n\n        if (this._rect[2] < 0) {\n            this._rect[2] += 1;\n            this._inverted = !this._inverted;\n        } else if (this._rect[2] > 1) {\n            this._rect[2] -= 1;\n            this._inverted = !this._inverted;\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get the 3D coordinates for the vertices of the rectangle with\n     * interpolated points along the lines.\n     *\n     * @param {Transform} transform - The transform of the node related to\n     * the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates\n     * representing the rectangle.\n     */\n    public getPoints3d(transform: Transform): number[][] {\n        return this._getPoints2d(transform)\n            .map(\n                (point: number[]) => {\n                    return transform.unprojectBasic(point, 200);\n                });\n    }\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The method shifts the right side\n     * coordinates of the rectangle by one unit to ensure that the vertices are ordered\n     * clockwise.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     */\n    public getVertex2d(index: number): number[] {\n        return this._rectToVertices2d(this._rect)[index];\n    }\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The coordinates will not be shifted\n     * so they may not appear in clockwise order when layed out on the plane.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     */\n    public getNonAdjustedVertex2d(index: number): number[] {\n        return this._rectToNonAdjustedVertices2d(this._rect)[index];\n    }\n\n    /**\n     * Get a vertex from the polygon representation of the 3D coordinates for the\n     * vertices of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @param {number} index - Vertex index.\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing\n     * the vertices of the geometry.\n     */\n    public getVertex3d(index: number, transform: Transform): number[] {\n        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);\n    }\n\n    /**\n     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing\n     * the rectangle vertices.\n     */\n    public getVertices2d(): number[][] {\n        return this._rectToVertices2d(this._rect);\n    }\n\n    /**\n     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing\n     * the rectangle vertices.\n     */\n    public getVertices3d(transform: Transform): number[][] {\n        return this._rectToVertices2d(this._rect)\n            .map(\n                (vertex: number[]) => {\n                    return transform.unprojectBasic(vertex, 200);\n                });\n    }\n\n    /** @inheritdoc */\n    public getCentroid2d(): number[] {\n        const rect: number[] = this._rect;\n\n        const x0: number = rect[0];\n        const x1: number = this._inverted ? rect[2] + 1 : rect[2];\n\n        const y0: number = rect[1];\n        const y1: number = rect[3];\n\n        const centroidX: number = x0 + (x1 - x0) / 2;\n        const centroidY: number = y0 + (y1 - y0) / 2;\n\n        return [centroidX, centroidY];\n    }\n\n    /** @inheritdoc */\n    public getCentroid3d(transform: Transform): number[] {\n        const centroid2d: number[] = this.getCentroid2d();\n\n        return transform.unprojectBasic(centroid2d, 200);\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility2d(): number[] {\n        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility3d(transform: Transform): number[] {\n        let pole2d: number[] = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));\n\n        return transform.unprojectBasic(pole2d, 200);\n    }\n\n    /** @inheritdoc */\n    public getTriangles3d(transform: Transform): number[] {\n        return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform));\n    }\n\n    /**\n     * Check if a particular bottom-right value is valid according to the current\n     * rectangle coordinates.\n     *\n     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate\n     * @returns {boolean} Value indicating whether the provided bottom-right coordinates\n     * are valid.\n     */\n    public validate(bottomRight: number[]): boolean {\n        let rect: number[] = this._rect;\n\n        if (!this._inverted && bottomRight[0] < rect[0] ||\n            bottomRight[0] - rect[2] > 0.25 ||\n            bottomRight[1] < rect[1]) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Get the 2D coordinates for the vertices of the rectangle with\n     * interpolated points along the lines.\n     *\n     * @param {Transform} transform - The transform of the node related to\n     * the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates\n     * representing the rectangle.\n     */\n    private _getPoints2d(transform: Transform): number[][] {\n        let vertices2d: number[][] = this._rectToVertices2d(this._rect);\n\n        let sides: number = vertices2d.length - 1;\n        let sections: number = 10;\n\n        let points2d: number[][] = [];\n\n        for (let i: number = 0; i < sides; ++i) {\n            let startX: number = vertices2d[i][0];\n            let startY: number = vertices2d[i][1];\n\n            let endX: number = vertices2d[i + 1][0];\n            let endY: number = vertices2d[i + 1][1];\n\n            let intervalX: number = (endX - startX) / (sections - 1);\n            let intervalY: number = (endY - startY) / (sections - 1);\n\n            for (let j: number = 0; j < sections; ++j) {\n                let point: number[] = [\n                    startX + j * intervalX,\n                    startY + j * intervalY,\n                ];\n\n                points2d.push(point);\n            }\n        }\n\n        return points2d;\n    }\n\n    /**\n     * Convert the top-left, bottom-right representation of a rectangle to a polygon\n     * representation of the vertices starting at the bottom-left corner going\n     * clockwise.\n     *\n     * @description The method shifts the right side coordinates of the rectangle\n     * by one unit to ensure that the vertices are ordered clockwise.\n     *\n     * @param {Array<number>} rect - Top-left, bottom-right representation of a\n     * rectangle.\n     * @returns {Array<Array<number>>} Polygon representation of the vertices of the\n     * rectangle.\n     */\n    private _rectToVertices2d(rect: number[]): number[][] {\n        return [\n            [rect[0], rect[3]],\n            [rect[0], rect[1]],\n            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],\n            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],\n            [rect[0], rect[3]],\n        ];\n    }\n\n    /**\n     * Convert the top-left, bottom-right representation of a rectangle to a polygon\n     * representation of the vertices starting at the bottom-left corner going\n     * clockwise.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The coordinates will not be shifted\n     * to ensure that the vertices are ordered clockwise when layed out on the plane.\n     *\n     * @param {Array<number>} rect - Top-left, bottom-right representation of a\n     * rectangle.\n     * @returns {Array<Array<number>>} Polygon representation of the vertices of the\n     * rectangle.\n     */\n    private _rectToNonAdjustedVertices2d(rect: number[]): number[][] {\n        return [\n            [rect[0], rect[3]],\n            [rect[0], rect[1]],\n            [rect[2], rect[1]],\n            [rect[2], rect[3]],\n            [rect[0], rect[3]],\n        ];\n    }\n}\n\nexport default RectGeometry;\n",
+    "import {GeometryTagError, VertexGeometry} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class RectGeometry\n *\n * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.\n *\n * @example\n * ```\n * var basicRect = [0.5, 0.3, 0.7, 0.4];\n * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);\n * ```\n */\nexport class RectGeometry extends VertexGeometry {\n    private _anchorIndex: number;\n    private _inverted: boolean;\n    private _rect: number[];\n\n    /**\n     * Create a rectangle geometry.\n     *\n     * @constructor\n     * @param {Array<number>} rect - An array representing the top-left and bottom-right\n     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].\n     *\n     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.\n     */\n    constructor(rect: number[]) {\n        super();\n\n        if (rect[1] > rect[3]) {\n            throw new GeometryTagError(\"Basic Y coordinates values can not be inverted.\");\n        }\n\n        for (let coord of rect) {\n            if (coord < 0 || coord > 1) {\n                throw new GeometryTagError(\"Basic coordinates must be on the interval [0, 1].\");\n            }\n        }\n\n        this._anchorIndex = undefined;\n        this._rect = rect.slice(0, 4);\n        this._inverted = this._rect[0] > this._rect[2];\n    }\n\n    /**\n     * Get anchor index property.\n     *\n     * @returns {number} Index representing the current anchor property if\n     * achoring indexing has been initialized. If anchor indexing has not been\n     * initialized or has been terminated undefined will be returned.\n     */\n    public get anchorIndex(): number {\n        return this._anchorIndex;\n    }\n\n    /**\n     * Get inverted property.\n     *\n     * @returns {boolean} Boolean determining whether the rect geometry is\n     * inverted. For panoramas the rect geometrye may be inverted.\n     */\n    public get inverted(): boolean {\n        return this._inverted;\n    }\n\n    /**\n     * Get rect property.\n     *\n     * @returns {Array<number>} Array representing the top-left and bottom-right\n     * corners of the rectangle in basic coordinates.\n     */\n    public get rect(): number[] {\n        return this._rect;\n    }\n\n    /**\n     * Initialize anchor indexing to enable setting opposite vertex.\n     *\n     * @param {number} [index] - The index of the vertex to use as anchor.\n     *\n     * @throws {Error} If anchor indexing has already been initialized.\n     * @throws {Error} If index is not valid (0 to 3).\n     */\n    public initializeAnchorIndexing(index?: number): void {\n        if (this._anchorIndex !== undefined) {\n            throw new Error(\"Anchor indexing is already initialized.\");\n        }\n\n        if (index < 0 || index > 3) {\n            throw new Error(`Invalid anchor index: ${index}.`);\n        }\n\n        this._anchorIndex = index === undefined ? 0 : index;\n    }\n\n    /**\n     * Terminate anchor indexing to disable setting pposite vertex.\n     */\n    public terminateAnchorIndexing(): void {\n        this._anchorIndex = undefined;\n    }\n\n    /**\n     * Set the value of the vertex opposite to the anchor in the polygon\n     * representation of the rectangle.\n     *\n     * @description Setting the opposite vertex may change the anchor index.\n     *\n     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     *\n     * @throws {Error} When anchor indexing has not been initialized.\n     */\n    public setOppositeVertex2d(opposite: number[], transform: Transform): void {\n        if (this._anchorIndex === undefined) {\n            throw new Error(\"Anchor indexing needs to be initialized.\");\n        }\n\n        const changed: number[] = [\n            Math.max(0, Math.min(1, opposite[0])),\n            Math.max(0, Math.min(1, opposite[1])),\n        ];\n\n        const original: number[] = this._rect.slice();\n        const anchor: number[] = this._anchorIndex === 0 ? [original[0], original[3]] :\n            this._anchorIndex === 1 ? [original[0], original[1]] :\n            this._anchorIndex === 2 ? [original[2], original[1]] :\n            [original[2], original[3]];\n\n        if (transform.fullPano) {\n            const deltaX: number = this._anchorIndex < 2 ?\n                changed[0] - original[2] :\n                changed[0] - original[0];\n\n            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {\n                // right side passes boundary rightward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {\n                // left side passes right side and boundary rightward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {\n                this._inverted = false;\n                if (anchor[0] > changed[0]) {\n                    // left side passes boundary rightward\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                } else {\n                    // left side passes right side and boundary rightward\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                }\n            } else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {\n                // left side passes boundary leftward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {\n                // right side passes left side and boundary leftward\n                this._inverted = true;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {\n                this._inverted = false;\n                if (anchor[0] > changed[0]) {\n                    // right side passes boundary leftward\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                } else {\n                    // right side passes left side and boundary leftward\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                }\n            } else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {\n                // inverted and right side passes left side completing a loop\n                this._inverted = false;\n                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n            } else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {\n                // inverted and left side passes right side completing a loop\n                this._inverted = false;\n                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n            } else if (this._inverted) {\n                // if still inverted only top and bottom can switch\n                if (this._anchorIndex < 2) {\n                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;\n                } else {\n                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;\n                }\n            } else {\n                // if still not inverted treat as non full pano\n                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {\n                    this._anchorIndex = 0;\n                } else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {\n                    this._anchorIndex = 1;\n                } else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {\n                    this._anchorIndex = 2;\n                } else {\n                    this._anchorIndex = 3;\n                }\n            }\n\n            const rect: number[] = [];\n            if (this._anchorIndex === 0) {\n                rect[0] = anchor[0];\n                rect[1] = changed[1];\n                rect[2] = changed[0];\n                rect[3] = anchor[1];\n            } else if (this._anchorIndex === 1) {\n                rect[0] = anchor[0];\n                rect[1] = anchor[1];\n                rect[2] = changed[0];\n                rect[3] = changed[1];\n            } else if (this._anchorIndex === 2) {\n                rect[0] = changed[0];\n                rect[1] = anchor[1];\n                rect[2] = anchor[0];\n                rect[3] = changed[1];\n            } else {\n                rect[0] = changed[0];\n                rect[1] = changed[1];\n                rect[2] = anchor[0];\n                rect[3] = anchor[1];\n            }\n\n            if (!this._inverted && rect[0] > rect[2] ||\n                this._inverted && rect[0] < rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n\n            if (rect[1] > rect[3]) {\n                rect[1] = original[1];\n                rect[3] = original[3];\n            }\n\n            this._rect[0] = rect[0];\n            this._rect[1] = rect[1];\n            this._rect[2] = rect[2];\n            this._rect[3] = rect[3];\n        } else {\n            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {\n                this._anchorIndex = 0;\n            } else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {\n                this._anchorIndex = 1;\n            } else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {\n                this._anchorIndex = 2;\n            } else {\n                this._anchorIndex = 3;\n            }\n\n            const rect: number[] = [];\n            if (this._anchorIndex === 0) {\n                rect[0] = anchor[0];\n                rect[1] = changed[1];\n                rect[2] = changed[0];\n                rect[3] = anchor[1];\n            } else if (this._anchorIndex === 1) {\n                rect[0] = anchor[0];\n                rect[1] = anchor[1];\n                rect[2] = changed[0];\n                rect[3] = changed[1];\n            } else if (this._anchorIndex === 2) {\n                rect[0] = changed[0];\n                rect[1] = anchor[1];\n                rect[2] = anchor[0];\n                rect[3] = changed[1];\n            } else {\n                rect[0] = changed[0];\n                rect[1] = changed[1];\n                rect[2] = anchor[0];\n                rect[3] = anchor[1];\n            }\n\n            if (rect[0] > rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n\n            if (rect[1] > rect[3]) {\n                rect[1] = original[1];\n                rect[3] = original[3];\n            }\n\n            this._rect[0] = rect[0];\n            this._rect[1] = rect[1];\n            this._rect[2] = rect[2];\n            this._rect[3] = rect[3];\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Set the value of a vertex in the polygon representation of the rectangle.\n     *\n     * @description The polygon is defined to have the first vertex at the\n     * bottom-left corner with the rest of the vertices following in clockwise order.\n     *\n     * @param {number} index - The index of the vertex to be set.\n     * @param {Array<number>} value - The new value of the vertex.\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     */\n    public setVertex2d(index: number, value: number[], transform: Transform): void {\n        let original: number[] = this._rect.slice();\n\n        let changed: number[] = [\n            Math.max(0, Math.min(1, value[0])),\n            Math.max(0, Math.min(1, value[1])),\n        ];\n\n        let rect: number[] = [];\n        if (index === 0) {\n            rect[0] = changed[0];\n            rect[1] = original[1];\n            rect[2] = original[2];\n            rect[3] = changed[1];\n        } else if (index === 1) {\n            rect[0] = changed[0];\n            rect[1] = changed[1];\n            rect[2] = original[2];\n            rect[3] = original[3];\n        } else if (index === 2) {\n            rect[0] = original[0];\n            rect[1] = changed[1];\n            rect[2] = changed[0];\n            rect[3] = original[3];\n        } else if (index === 3) {\n            rect[0] = original[0];\n            rect[1] = original[1];\n            rect[2] = changed[0];\n            rect[3] = changed[1];\n        }\n\n        if (transform.fullPano) {\n            let passingBoundaryLeftward: boolean =\n                index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||\n                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;\n\n            let passingBoundaryRightward: boolean =\n                index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||\n                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;\n\n            if (passingBoundaryLeftward || passingBoundaryRightward) {\n                this._inverted = !this._inverted;\n            } else {\n                if (rect[0] - original[0] < -0.25) {\n                    rect[0] = original[0];\n                }\n\n                if (rect[2] - original[2] > 0.25) {\n                    rect[2] = original[2];\n                }\n            }\n\n            if (!this._inverted && rect[0] > rect[2] ||\n                this._inverted && rect[0] < rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n        } else {\n            if (rect[0] > rect[2]) {\n                rect[0] = original[0];\n                rect[2] = original[2];\n            }\n        }\n\n        if (rect[1] > rect[3]) {\n            rect[1] = original[1];\n            rect[3] = original[3];\n        }\n\n        this._rect[0] = rect[0];\n        this._rect[1] = rect[1];\n        this._rect[2] = rect[2];\n        this._rect[3] = rect[3];\n\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public setCentroid2d(value: number[], transform: Transform): void {\n        let original: number[] = this._rect.slice();\n\n        let x0: number = original[0];\n        let x1: number = this._inverted ? original[2] + 1 : original[2];\n\n        let y0: number = original[1];\n        let y1: number = original[3];\n\n        let centerX: number = x0 + (x1 - x0) / 2;\n        let centerY: number = y0 + (y1 - y0) / 2;\n\n        let translationX: number = 0;\n\n        if (transform.gpano != null &&\n            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {\n            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;\n        } else {\n            let minTranslationX: number = -x0;\n            let maxTranslationX: number = 1 - x1;\n\n            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));\n        }\n\n        let minTranslationY: number = -y0;\n        let maxTranslationY: number = 1 - y1;\n\n        let translationY: number = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));\n\n        this._rect[0] = original[0] + translationX;\n        this._rect[1] = original[1] + translationY;\n        this._rect[2] = original[2] + translationX;\n        this._rect[3] = original[3] + translationY;\n\n        if (this._rect[0] < 0) {\n            this._rect[0] += 1;\n            this._inverted = !this._inverted;\n        } else if (this._rect[0] > 1) {\n            this._rect[0] -= 1;\n            this._inverted = !this._inverted;\n        }\n\n        if (this._rect[2] < 0) {\n            this._rect[2] += 1;\n            this._inverted = !this._inverted;\n        } else if (this._rect[2] > 1) {\n            this._rect[2] -= 1;\n            this._inverted = !this._inverted;\n        }\n\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get the 3D coordinates for the vertices of the rectangle with\n     * interpolated points along the lines.\n     *\n     * @param {Transform} transform - The transform of the node related to\n     * the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates\n     * representing the rectangle.\n     */\n    public getPoints3d(transform: Transform): number[][] {\n        return this._getPoints2d(transform)\n            .map(\n                (point: number[]) => {\n                    return transform.unprojectBasic(point, 200);\n                });\n    }\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The method shifts the right side\n     * coordinates of the rectangle by one unit to ensure that the vertices are ordered\n     * clockwise.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     */\n    public getVertex2d(index: number): number[] {\n        return this._rectToVertices2d(this._rect)[index];\n    }\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The coordinates will not be shifted\n     * so they may not appear in clockwise order when layed out on the plane.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     */\n    public getNonAdjustedVertex2d(index: number): number[] {\n        return this._rectToNonAdjustedVertices2d(this._rect)[index];\n    }\n\n    /**\n     * Get a vertex from the polygon representation of the 3D coordinates for the\n     * vertices of the geometry.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @param {number} index - Vertex index.\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing\n     * the vertices of the geometry.\n     */\n    public getVertex3d(index: number, transform: Transform): number[] {\n        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);\n    }\n\n    /**\n     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing\n     * the rectangle vertices.\n     */\n    public getVertices2d(): number[][] {\n        return this._rectToVertices2d(this._rect);\n    }\n\n    /**\n     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order.\n     *\n     * @param {Transform} transform - The transform of the node related to the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing\n     * the rectangle vertices.\n     */\n    public getVertices3d(transform: Transform): number[][] {\n        return this._rectToVertices2d(this._rect)\n            .map(\n                (vertex: number[]) => {\n                    return transform.unprojectBasic(vertex, 200);\n                });\n    }\n\n    /** @inheritdoc */\n    public getCentroid2d(): number[] {\n        const rect: number[] = this._rect;\n\n        const x0: number = rect[0];\n        const x1: number = this._inverted ? rect[2] + 1 : rect[2];\n\n        const y0: number = rect[1];\n        const y1: number = rect[3];\n\n        const centroidX: number = x0 + (x1 - x0) / 2;\n        const centroidY: number = y0 + (y1 - y0) / 2;\n\n        return [centroidX, centroidY];\n    }\n\n    /** @inheritdoc */\n    public getCentroid3d(transform: Transform): number[] {\n        const centroid2d: number[] = this.getCentroid2d();\n\n        return transform.unprojectBasic(centroid2d, 200);\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility2d(): number[] {\n        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));\n    }\n\n    /** @inheritdoc */\n    public getPoleOfAccessibility3d(transform: Transform): number[] {\n        let pole2d: number[] = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));\n\n        return transform.unprojectBasic(pole2d, 200);\n    }\n\n    /** @inheritdoc */\n    public getTriangles3d(transform: Transform): number[] {\n        return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform));\n    }\n\n    /**\n     * Check if a particular bottom-right value is valid according to the current\n     * rectangle coordinates.\n     *\n     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate\n     * @returns {boolean} Value indicating whether the provided bottom-right coordinates\n     * are valid.\n     */\n    public validate(bottomRight: number[]): boolean {\n        let rect: number[] = this._rect;\n\n        if (!this._inverted && bottomRight[0] < rect[0] ||\n            bottomRight[0] - rect[2] > 0.25 ||\n            bottomRight[1] < rect[1]) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Get the 2D coordinates for the vertices of the rectangle with\n     * interpolated points along the lines.\n     *\n     * @param {Transform} transform - The transform of the node related to\n     * the rectangle.\n     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates\n     * representing the rectangle.\n     */\n    private _getPoints2d(transform: Transform): number[][] {\n        let vertices2d: number[][] = this._rectToVertices2d(this._rect);\n\n        let sides: number = vertices2d.length - 1;\n        let sections: number = 10;\n\n        let points2d: number[][] = [];\n\n        for (let i: number = 0; i < sides; ++i) {\n            let startX: number = vertices2d[i][0];\n            let startY: number = vertices2d[i][1];\n\n            let endX: number = vertices2d[i + 1][0];\n            let endY: number = vertices2d[i + 1][1];\n\n            let intervalX: number = (endX - startX) / (sections - 1);\n            let intervalY: number = (endY - startY) / (sections - 1);\n\n            for (let j: number = 0; j < sections; ++j) {\n                let point: number[] = [\n                    startX + j * intervalX,\n                    startY + j * intervalY,\n                ];\n\n                points2d.push(point);\n            }\n        }\n\n        return points2d;\n    }\n\n    /**\n     * Convert the top-left, bottom-right representation of a rectangle to a polygon\n     * representation of the vertices starting at the bottom-left corner going\n     * clockwise.\n     *\n     * @description The method shifts the right side coordinates of the rectangle\n     * by one unit to ensure that the vertices are ordered clockwise.\n     *\n     * @param {Array<number>} rect - Top-left, bottom-right representation of a\n     * rectangle.\n     * @returns {Array<Array<number>>} Polygon representation of the vertices of the\n     * rectangle.\n     */\n    private _rectToVertices2d(rect: number[]): number[][] {\n        return [\n            [rect[0], rect[3]],\n            [rect[0], rect[1]],\n            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],\n            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],\n            [rect[0], rect[3]],\n        ];\n    }\n\n    /**\n     * Convert the top-left, bottom-right representation of a rectangle to a polygon\n     * representation of the vertices starting at the bottom-left corner going\n     * clockwise.\n     *\n     * @description The first vertex represents the bottom-left corner with the rest of\n     * the vertices following in clockwise order. The coordinates will not be shifted\n     * to ensure that the vertices are ordered clockwise when layed out on the plane.\n     *\n     * @param {Array<number>} rect - Top-left, bottom-right representation of a\n     * rectangle.\n     * @returns {Array<Array<number>>} Polygon representation of the vertices of the\n     * rectangle.\n     */\n    private _rectToNonAdjustedVertices2d(rect: number[]): number[][] {\n        return [\n            [rect[0], rect[3]],\n            [rect[0], rect[1]],\n            [rect[2], rect[1]],\n            [rect[2], rect[3]],\n            [rect[0], rect[3]],\n        ];\n    }\n}\n\nexport default RectGeometry;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as earcut from \"earcut\";\nimport * as polylabel from \"@mapbox/polylabel\";\n\nimport {Geometry} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\n\n/**\n * @class VertexGeometry\n * @abstract\n * @classdesc Represents a vertex geometry.\n */\nexport abstract class VertexGeometry extends Geometry {\n\n    /**\n     * Create a vertex geometry.\n     *\n     * @constructor\n     */\n    constructor() {\n        super();\n    }\n\n    /**\n     * Get the 3D coordinates for the vertices of the geometry with possibly\n     * interpolated points along the lines.\n     *\n     * @param {Transform} transform - The transform of the node related to\n     * the geometry.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates\n     * representing the geometry.\n     * @ignore\n     */\n    public abstract getPoints3d(transform: Transform): number[][];\n\n    /**\n     * Get the polygon pole of inaccessibility, the most\n     * distant internal point from the polygon outline.\n     *\n     * @returns {Array<number>} 2D basic coordinates for the pole of inaccessibility.\n     * @ignore\n     */\n    public abstract getPoleOfAccessibility2d(): number[];\n\n    /**\n     * Get the polygon pole of inaccessibility, the most\n     * distant internal point from the polygon outline.\n     *\n     * @param transform - The transform of the node related to\n     * the geometry.\n     * @returns {Array<number>} 3D world coordinates for the pole of inaccessibility.\n     * @ignore\n     */\n    public abstract getPoleOfAccessibility3d(transform: Transform): number[];\n\n    /**\n     * Get the coordinates of a vertex from the polygon representation of the geometry.\n     *\n     * @param {number} index - Vertex index.\n     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.\n     * @ignore\n     */\n    public abstract getVertex2d(index: number): number[];\n\n    /**\n     * Get a vertex from the polygon representation of the 3D coordinates for the\n     * vertices of the geometry.\n     *\n     * @param {number} index - Vertex index.\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<number>} Array representing the 3D world coordinates of the vertex.\n     * @ignore\n     */\n    public abstract getVertex3d(index: number, transform: Transform): number[];\n\n    /**\n     * Get a polygon representation of the 2D basic coordinates for the vertices of the geometry.\n     *\n     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing\n     * the vertices of the geometry.\n     * @ignore\n     */\n    public abstract getVertices2d(): number[][];\n\n    /**\n     * Get a polygon representation of the 3D world coordinates for the vertices of the geometry.\n     *\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing\n     * the vertices of the geometry.\n     * @ignore\n     */\n    public abstract getVertices3d(transform: Transform): number[][];\n\n    /**\n     * Get a flattend array of the 3D world coordinates for the\n     * triangles filling the geometry.\n     *\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @returns {Array<number>} Flattened array of 3D world coordinates of the triangles.\n     * @ignore\n     */\n    public abstract getTriangles3d(transform: Transform): number[];\n\n    /**\n     * Set the value of a vertex in the polygon representation of the geometry.\n     *\n     * @description The polygon is defined to have the first vertex at the\n     * bottom-left corner with the rest of the vertices following in clockwise order.\n     *\n     * @param {number} index - The index of the vertex to be set.\n     * @param {Array<number>} value - The new value of the vertex.\n     * @param {Transform} transform - The transform of the node related to the geometry.\n     * @ignore\n     */\n    public abstract setVertex2d(index: number, value: number[], transform: Transform): void;\n\n    /**\n     * Finds the polygon pole of inaccessibility, the most distant internal\n     * point from the polygon outline.\n     *\n     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.\n     * @returns {Array<number>} Point of inaccessibility.\n     * @ignore\n     */\n    protected _getPoleOfInaccessibility2d(points2d: number[][]): number[] {\n        let pole2d: number[] = polylabel([points2d], 3e-2);\n\n        return pole2d;\n    }\n\n    /**\n     * Triangulates a 2d polygon and returns the triangle\n     * representation as a flattened array of 3d points.\n     *\n     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.\n     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.\n     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.\n     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.\n     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.\n     * @ignore\n     */\n    protected _triangulate(\n        points2d: number[][],\n        points3d: number[][],\n        holes2d?: number[][][],\n        holes3d?: number[][][]): number[] {\n\n        let data: number[][][] = [points2d.slice(0, -1)];\n        for (let hole2d of holes2d != null ? holes2d : []) {\n            data.push(hole2d.slice(0, -1));\n        }\n\n        let points: number[][] = points3d.slice(0, -1);\n        for (let hole3d of holes3d != null ? holes3d : []) {\n            points = points.concat(hole3d.slice(0, -1));\n        }\n\n        let flattened: earcut.Data = earcut.flatten(data);\n        let indices: number[] = earcut(flattened.vertices, flattened.holes, flattened.dimensions);\n        let triangles: number[] = [];\n\n        for (let i: number = 0; i < indices.length; ++i) {\n            let point: number[] = points[indices[i]];\n\n            triangles.push(point[0]);\n            triangles.push(point[1]);\n            triangles.push(point[2]);\n        }\n\n        return triangles;\n    }\n}\n\nexport default VertexGeometry;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport {\n    Component,\n    Geometry,\n    ITagConfiguration,\n    TagCreator,\n    TagHandlerBase,\n} from \"../../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../../Geo\";\nimport {RenderCamera} from \"../../../Render\";\nimport {\n    Container,\n    Navigator,\n} from \"../../../Viewer\";\n\nexport abstract class CreateHandlerBase extends TagHandlerBase {\n    protected _tagCreator: TagCreator;\n\n    protected _geometryCreated$: Subject<Geometry>;\n\n    constructor(\n        component: Component<ITagConfiguration>,\n        container: Container,\n        navigator: Navigator,\n        viewportCoords: ViewportCoords,\n        tagCreator: TagCreator) {\n        super(component, container, navigator, viewportCoords);\n\n        this._tagCreator = tagCreator;\n        this._geometryCreated$ = new Subject<Geometry>();\n    }\n\n    public get geometryCreated$(): Observable<Geometry> {\n        return this._geometryCreated$;\n    }\n\n    protected abstract _enableCreate(): void;\n\n    protected abstract _disableCreate(): void;\n\n    protected _enable(): void {\n        this._enableCreate();\n        this._container.element.classList.add(\"component-tag-create\");\n    }\n\n    protected _disable(): void {\n        this._container.element.classList.remove(\"component-tag-create\");\n        this._disableCreate();\n    }\n\n    protected _validateBasic(basic: number[]): boolean {\n        const x: number = basic[0];\n        const y: number = basic[1];\n\n        return 0 <= x && x <= 1 && 0 <= y && y <= 1;\n    }\n\n    protected _mouseEventToBasic$(mouseEvent$: Observable<MouseEvent>): Observable<number[]> {\n        return mouseEvent$\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .map(\n                ([event, camera, transform]: [MouseEvent, RenderCamera, Transform]): number[] => {\n                    return this._mouseEventToBasic(\n                        event,\n                        this._container.element,\n                        camera,\n                        transform);\n                });\n    }\n}\n\nexport default CreateHandlerBase;\n",
     "import {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    CreateHandlerBase,\n    PointGeometry,\n} from \"../../../Component\";\n\nexport class CreatePointHandler extends CreateHandlerBase {\n    private _geometryCreatedSubscription: Subscription;\n\n    protected _enableCreate(): void {\n        this._container.mouseService.deferPixels(this._name, 4);\n\n        this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$)\n            .filter(this._validateBasic)\n            .map(\n                (basic: number[]): PointGeometry => {\n                    return new PointGeometry(basic);\n                })\n            .subscribe(this._geometryCreated$);\n    }\n\n    protected _disableCreate(): void {\n        this._container.mouseService.undeferPixels(this._name);\n\n        this._geometryCreatedSubscription.unsubscribe();\n    }\n\n    protected _getNameExtension(): string {\n        return \"create-point\";\n    }\n}\n\nexport default CreatePointHandler;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    Geometry,\n    InteractionCursor,\n    OutlineTag,\n    PolygonGeometry,\n    RectGeometry,\n    RenderTag,\n    TagOperation,\n} from \"../../../Component\";\nimport {Transform} from \"../../../Geo\";\nimport {ISize} from \"../../../Render\";\nimport {ISpriteAtlas} from \"../../../Viewer\";\n\n/**\n * @class OutlineRenderTag\n * @classdesc Tag visualizing the properties of an OutlineTag.\n */\nexport class OutlineRenderTag extends RenderTag<OutlineTag> {\n    private _fill: THREE.Mesh;\n    private _holes: THREE.Line[];\n    private _outline: THREE.Line;\n\n    private _changedSubscription: Subscription;\n    private _geometryChangedSubscription: Subscription;\n\n    constructor(tag: OutlineTag, transform: Transform) {\n        super(tag, transform);\n\n        this._fill = !transform.gpano ?\n            this._createFill() :\n            null;\n\n        this._holes = this._tag.lineWidth >= 1 ?\n            this._createHoles() :\n            [];\n\n        this._outline = this._tag.lineWidth >= 1 ?\n            this._createOutline() :\n            null;\n\n        this._geometryChangedSubscription = this._tag.geometry.changed$\n            .subscribe(\n                (geometry: Geometry): void => {\n                    if (this._fill != null) {\n                        this._updateFillGeometry();\n                    }\n\n                    if (this._holes.length > 0) {\n                        this._updateHoleGeometries();\n                    }\n\n                    if (this._outline != null) {\n                        this._updateOulineGeometry();\n                    }\n                });\n\n        this._changedSubscription = this._tag.changed$\n            .subscribe(\n                (changedTag: OutlineTag): void => {\n                    let glObjectsChanged: boolean = false;\n\n                    if (this._fill != null) {\n                        this._updateFillMaterial(<THREE.MeshBasicMaterial>this._fill.material);\n                    }\n\n                    if (this._outline == null) {\n                        if (this._tag.lineWidth >= 1) {\n                            this._holes = this._createHoles();\n                            this._outline = this._createOutline();\n                            glObjectsChanged = true;\n                        }\n                    } else {\n                        this._updateHoleMaterials();\n                        this._updateOutlineMaterial();\n                    }\n\n                    if (glObjectsChanged) {\n                        this._glObjectsChanged$.next(this);\n                    }\n                });\n    }\n\n    public dispose(): void {\n        this._disposeFill();\n        this._disposeHoles();\n        this._disposeOutline();\n\n        this._changedSubscription.unsubscribe();\n        this._geometryChangedSubscription.unsubscribe();\n    }\n\n    public getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ISize): vd.VNode[] {\n        const vNodes: vd.VNode[] = [];\n        const isRect: boolean = this._tag.geometry instanceof RectGeometry;\n        const isPerspective: boolean = !this._transform.gpano;\n        const container: { offsetHeight: number, offsetWidth: number } = {\n            offsetHeight: size.height, offsetWidth: size.width,\n        };\n\n        if (this._tag.icon != null && (isRect || isPerspective)) {\n            const [iconBasicX, iconBasicY]: number[] = this._tag.geometry instanceof RectGeometry ?\n                this._tag.geometry.getVertex2d(this._tag.iconIndex) :\n                this._tag.geometry.getPoleOfAccessibility2d();\n\n            const iconCanvas: number[] =\n                this._viewportCoords.basicToCanvasSafe(\n                    iconBasicX,\n                    iconBasicY,\n                    container,\n                    this._transform,\n                    camera);\n\n            if (iconCanvas != null) {\n                const interact: (e: MouseEvent) => void = (e: MouseEvent): void => {\n                    this._interact$.next({ offsetX: 0, offsetY: 0, operation: TagOperation.None, tag: this._tag });\n                };\n\n                if (atlas.loaded) {\n                    const sprite: vd.VNode = atlas.getDOMSprite(this._tag.icon, this._tag.iconFloat);\n                    const iconCanvasX: number = Math.round(iconCanvas[0]);\n                    const iconCanvasY: number = Math.round(iconCanvas[1]);\n                    const transform: string = `translate(${iconCanvasX}px,${iconCanvasY}px)`;\n\n                    const click: (e: MouseEvent) => void = (e: MouseEvent): void => {\n                        e.stopPropagation();\n                        this._tag.click$.next(this._tag);\n                    };\n\n                    const properties: vd.createProperties = {\n                        onclick: click,\n                        onmousedown: interact,\n                        style: { transform: transform },\n                    };\n\n                    vNodes.push(vd.h(\"div.TagSymbol\", properties, [sprite]));\n                }\n            }\n        } else if (this._tag.text != null && (isRect || isPerspective)) {\n            const [textBasicX, textBasicY]: number[] = this._tag.geometry instanceof RectGeometry ?\n                this._tag.geometry.getVertex2d(3) :\n                this._tag.geometry.getPoleOfAccessibility2d();\n\n            const textCanvas: number[] =\n                this._viewportCoords.basicToCanvasSafe(\n                    textBasicX,\n                    textBasicY,\n                    container,\n                    this._transform,\n                    camera);\n\n            if (textCanvas != null) {\n                const textCanvasX: number = Math.round(textCanvas[0]);\n                const textCanvasY: number = Math.round(textCanvas[1]);\n                const transform: string = this._tag.geometry instanceof RectGeometry ?\n                    `translate(${textCanvasX}px,${textCanvasY}px)` :\n                    `translate(-50%, -50%) translate(${textCanvasX}px,${textCanvasY}px)`;\n\n                const interact: (e: MouseEvent) => void = (e: MouseEvent): void => {\n                    this._interact$.next({ offsetX: 0, offsetY: 0, operation: TagOperation.None, tag: this._tag });\n                };\n\n                const properties: vd.createProperties = {\n                    onmousedown: interact,\n                    style: {\n                        color: this._colorToCss(this._tag.textColor),\n                        transform: transform,\n                    },\n                    textContent: this._tag.text,\n                };\n\n                vNodes.push(vd.h(\"span.TagSymbol\", properties, []));\n            }\n        }\n\n        if (!this._tag.editable) {\n            return vNodes;\n        }\n\n        const lineColor: string = this._colorToCss(this._tag.lineColor);\n\n        if (this._tag.geometry instanceof RectGeometry) {\n            const [centroidBasicX, centroidBasicY]: number[] = this._tag.geometry.getCentroid2d();\n            const centroidCanvas: number[] =\n                this._viewportCoords.basicToCanvasSafe(\n                    centroidBasicX,\n                    centroidBasicY,\n                    container,\n                    this._transform,\n                    camera);\n\n            if (centroidCanvas != null) {\n                const interact: (e: MouseEvent) => void = this._interact(TagOperation.Centroid, \"move\");\n                const centroidCanvasX: number = Math.round(centroidCanvas[0]);\n                const centroidCanvasY: number = Math.round(centroidCanvas[1]);\n                const transform: string = `translate(-50%, -50%) translate(${centroidCanvasX}px,${centroidCanvasY}px)`;\n\n                const properties: vd.createProperties = {\n                    onmousedown: interact,\n                    style: { background: lineColor, transform: transform },\n                };\n\n                vNodes.push(vd.h(\"div.TagMover\", properties, []));\n            }\n        }\n\n        const vertices2d: number[][] = this._tag.geometry.getVertices2d();\n\n        for (let i: number = 0; i < vertices2d.length - 1; i++) {\n            if (isRect &&\n                ((this._tag.icon != null && i === this._tag.iconIndex) ||\n                (this._tag.icon == null && this._tag.text != null && i === 3))) {\n                continue;\n            }\n\n            const [vertexBasicX, vertexBasicY]: number[] = vertices2d[i];\n            const vertexCanvas: number[] =\n                this._viewportCoords.basicToCanvasSafe(\n                    vertexBasicX,\n                    vertexBasicY,\n                    container,\n                    this._transform,\n                    camera);\n\n            if (vertexCanvas == null) {\n                continue;\n            }\n\n            const cursor: InteractionCursor = isRect ?\n                 i % 2 === 0 ? \"nesw-resize\" : \"nwse-resize\" :\n                 \"crosshair\";\n\n            const interact: (e: MouseEvent) => void = this._interact(TagOperation.Vertex, cursor, i);\n            const vertexCanvasX: number = Math.round(vertexCanvas[0]);\n            const vertexCanvasY: number = Math.round(vertexCanvas[1]);\n            const transform: string = `translate(-50%, -50%) translate(${vertexCanvasX}px,${vertexCanvasY}px)`;\n\n            const properties: vd.createProperties = {\n                onmousedown: interact,\n                style: { background: lineColor, transform: transform, cursor: cursor },\n            };\n\n            vNodes.push(vd.h(\"div.TagResizer\", properties, []));\n\n            if (!this._tag.indicateVertices) {\n                continue;\n            }\n\n            const pointProperties: vd.createProperties = {\n                style: { background: lineColor, transform: transform },\n            };\n\n            vNodes.push(vd.h(\"div.TagVertex\", pointProperties, []));\n        }\n\n        return vNodes;\n    }\n\n    public getGLObjects(): THREE.Object3D[] {\n        const glObjects: THREE.Object3D[] = [];\n\n        if (this._fill != null) {\n            glObjects.push(this._fill);\n        }\n\n        for (const hole of this._holes) {\n            glObjects.push(hole);\n        }\n\n        if (this._outline != null) {\n            glObjects.push(this._outline);\n        }\n\n        return glObjects;\n    }\n\n    public getRetrievableObjects(): THREE.Object3D[] {\n        return this._fill != null ? [this._fill] : [];\n    }\n\n    private _colorToCss(color: number): string {\n        return \"#\" + (\"000000\" + color.toString(16)).substr(-6);\n    }\n\n    private _createFill(): THREE.Mesh {\n        let triangles: number[] = this._tag.geometry.getTriangles3d(this._transform);\n        let positions: Float32Array = new Float32Array(triangles);\n\n        let geometry: THREE.BufferGeometry = new THREE.BufferGeometry();\n        geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        geometry.computeBoundingSphere();\n\n        let material: THREE.MeshBasicMaterial =\n            new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });\n\n        this._updateFillMaterial(material);\n\n        return new THREE.Mesh(geometry, material);\n    }\n\n    private _createHoles(): THREE.Line[] {\n        let holes: THREE.Line[] = [];\n\n        if (this._tag.geometry instanceof PolygonGeometry) {\n            let polygonGeometry: PolygonGeometry = <PolygonGeometry>this._tag.geometry;\n            let holes3d: number[][][] = polygonGeometry.getHoleVertices3d(this._transform);\n\n            for (let holePoints3d of holes3d) {\n                let hole: THREE.Line = this._createLine(holePoints3d);\n                holes.push(hole);\n            }\n        }\n\n        return holes;\n    }\n\n    private _createLine(points3d: number[][]): THREE.Line {\n        let positions: Float32Array = this._getLinePositions(points3d);\n\n        let geometry: THREE.BufferGeometry = new THREE.BufferGeometry();\n        geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        geometry.computeBoundingSphere();\n\n        let material: THREE.LineBasicMaterial = new THREE.LineBasicMaterial();\n        this._updateLineBasicMaterial(material);\n\n        const line: THREE.Line = new THREE.Line(geometry, material);\n        line.renderOrder = 1;\n\n        return line;\n    }\n\n    private _createOutline(): THREE.Line {\n        let points3d: number[][] = this._tag.geometry.getPoints3d(this._transform);\n        return this._createLine(points3d);\n    }\n\n    private _disposeFill(): void {\n        if (this._fill == null) {\n            return;\n        }\n\n        this._fill.geometry.dispose();\n        this._fill.material.dispose();\n        this._fill = null;\n    }\n\n    private _disposeHoles(): void {\n        for (let hole of this._holes) {\n            hole.geometry.dispose();\n            hole.material.dispose();\n        }\n\n        this._holes = [];\n    }\n\n    private _disposeOutline(): void {\n        if (this._outline == null) {\n            return;\n        }\n\n        this._outline.geometry.dispose();\n        this._outline.material.dispose();\n        this._outline = null;\n    }\n\n    private _getLinePositions(points3d: number[][]): Float32Array {\n        let length: number = points3d.length;\n        let positions: Float32Array = new Float32Array(length * 3);\n\n        for (let i: number = 0; i < length; ++i) {\n            let index: number = 3 * i;\n            let position: number[] = points3d[i];\n\n            positions[index + 0] = position[0];\n            positions[index + 1] = position[1];\n            positions[index + 2] = position[2];\n        }\n\n        return positions;\n    }\n\n    private _interact(operation: TagOperation, cursor?: InteractionCursor, vertexIndex?: number): (e: MouseEvent) => void {\n        return (e: MouseEvent): void => {\n            let offsetX: number = e.offsetX - (<HTMLElement>e.target).offsetWidth / 2;\n            let offsetY: number = e.offsetY - (<HTMLElement>e.target).offsetHeight / 2;\n\n            this._interact$.next({\n                cursor: cursor,\n                offsetX: offsetX,\n                offsetY: offsetY,\n                operation: operation,\n                tag: this._tag,\n                vertexIndex: vertexIndex,\n            });\n        };\n    }\n\n    private _updateFillGeometry(): void {\n        let triangles: number[] = this._tag.geometry.getTriangles3d(this._transform);\n        let positions: Float32Array = new Float32Array(triangles);\n\n        let geometry: THREE.BufferGeometry = <THREE.BufferGeometry>this._fill.geometry;\n        let attribute: THREE.BufferAttribute = <THREE.BufferAttribute>geometry.getAttribute(\"position\");\n\n        if (attribute.array.length === positions.length) {\n            attribute.set(positions);\n            attribute.needsUpdate = true;\n        } else {\n            geometry.removeAttribute(\"position\");\n            geometry.addAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n        }\n\n        geometry.computeBoundingSphere();\n    }\n\n    private _updateFillMaterial(material: THREE.MeshBasicMaterial): void {\n        material.color = new THREE.Color(this._tag.fillColor);\n        material.opacity = this._tag.fillOpacity;\n        material.needsUpdate = true;\n    }\n\n    private _updateHoleGeometries(): void {\n        let polygonGeometry: PolygonGeometry = <PolygonGeometry>this._tag.geometry;\n        let holes3d: number[][][] = polygonGeometry.getHoleVertices3d(this._transform);\n\n        if (holes3d.length !== this._holes.length) {\n            throw new Error(\"Changing the number of holes is not supported.\");\n        }\n\n        for (let i: number = 0; i < this._holes.length; i++) {\n            let holePoints3d: number[][] = holes3d[i];\n            let hole: THREE.Line = this._holes[i];\n\n            this._updateLine(hole, holePoints3d);\n        }\n    }\n\n    private _updateHoleMaterials(): void {\n        for (let hole of this._holes) {\n            let material: THREE.LineBasicMaterial = <THREE.LineBasicMaterial>hole.material;\n\n            this._updateLineBasicMaterial(material);\n        }\n    }\n\n    private _updateLine(line: THREE.Line, points3d: number[][]): void {\n        let positions: Float32Array = this._getLinePositions(points3d);\n\n        let geometry: THREE.BufferGeometry = <THREE.BufferGeometry>line.geometry;\n        let attribute: THREE.BufferAttribute = <THREE.BufferAttribute>geometry.getAttribute(\"position\");\n\n        attribute.set(positions);\n        attribute.needsUpdate = true;\n\n        geometry.computeBoundingSphere();\n    }\n\n    private _updateOulineGeometry(): void {\n        let points3d: number[][] = this._tag.geometry.getPoints3d(this._transform);\n\n        this._updateLine(this._outline, points3d);\n    }\n\n    private _updateOutlineMaterial(): void {\n        let material: THREE.LineBasicMaterial = <THREE.LineBasicMaterial>this._outline.material;\n\n        this._updateLineBasicMaterial(material);\n    }\n\n    private _updateLineBasicMaterial(material: THREE.LineBasicMaterial): void {\n        material.color = new THREE.Color(this._tag.lineColor);\n        material.linewidth = Math.max(this._tag.lineWidth, 1);\n        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;\n        material.opacity = this._tag.lineOpacity;\n        material.transparent = this._tag.lineOpacity < 1;\n        material.needsUpdate = true;\n    }\n}\n",
     "import {Subject} from \"rxjs/Subject\";\n\nimport {\n    IOutlineTagOptions,\n    Tag,\n    VertexGeometry,\n} from \"../../../Component\";\nimport {Alignment} from \"../../../Viewer\";\n\n/**\n * @class OutlineTag\n *\n * @classdesc Tag holding properties for visualizing a geometry outline.\n *\n * @example\n * ```\n * var geometry = new Mapillary.TagComponent.RectGeometry([0.3, 0.3, 0.5, 0.4]);\n * var tag = new Mapillary.TagComponent.OutlineTag(\n *     \"id-1\",\n *     geometry\n *     { editable: true, lineColor: 0xff0000 });\n *\n * tagComponent.add([tag]);\n * ```\n */\nexport class OutlineTag extends Tag {\n    /**\n     * Event fired when the icon of the outline tag is clicked.\n     *\n     * @event OutlineTag#click\n     * @type {OutlineTag} The tag instance that was clicked.\n     */\n    public static click: string = \"click\";\n\n    protected _geometry: VertexGeometry;\n\n    private _editable: boolean;\n    private _icon: string;\n    private _iconFloat: Alignment;\n    private _iconIndex: number;\n    private _indicateVertices: boolean;\n    private _lineColor: number;\n    private _lineOpacity: number;\n    private _lineWidth: number;\n    private _fillColor: number;\n    private _fillOpacity: number;\n    private _text: string;\n    private _textColor: number;\n\n    private _click$: Subject<OutlineTag>;\n\n    /**\n     * Create an outline tag.\n     *\n     * @override\n     * @constructor\n     * @param {string} id - Unique identifier of the tag.\n     * @param {VertexGeometry} geometry - Geometry defining vertices of tag.\n     * @param {IOutlineTagOptions} options - Options defining the visual appearance and\n     * behavior of the outline tag.\n     */\n    constructor(id: string, geometry: VertexGeometry, options?: IOutlineTagOptions) {\n        super(id, geometry);\n\n        options = !!options ? options : {};\n\n        this._editable = options.editable == null ? false : options.editable;\n        this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;\n        this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;\n        this._icon = options.icon === undefined ? null : options.icon;\n        this._iconFloat = options.iconFloat == null ? Alignment.Center : options.iconFloat;\n        this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex;\n        this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;\n        this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;\n        this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;\n        this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;\n        this._text = options.text === undefined ? null : options.text;\n        this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;\n\n        this._click$ = new Subject<OutlineTag>();\n\n        this._click$\n            .subscribe(\n                (t: Tag): void => {\n                    this.fire(OutlineTag.click, this);\n                });\n    }\n\n    /**\n     * Click observable.\n     *\n     * @description An observable emitting the tag when the icon of the\n     * tag has been clicked.\n     *\n     * @returns {Observable<Tag>}\n     */\n    public get click$(): Subject<OutlineTag> {\n        return this._click$;\n    }\n\n    /**\n     * Get editable property.\n     * @returns {boolean} Value indicating if tag is editable.\n     */\n    public get editable(): boolean {\n        return this._editable;\n    }\n\n    /**\n     * Set editable property.\n     * @param {boolean}\n     *\n     * @fires Tag#changed\n     */\n    public set editable(value: boolean) {\n        this._editable = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get fill color property.\n     * @returns {number}\n     */\n    public get fillColor(): number {\n        return this._fillColor;\n    }\n\n    /**\n     * Set fill color property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set fillColor(value: number) {\n        this._fillColor = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get fill opacity property.\n     * @returns {number}\n     */\n    public get fillOpacity(): number {\n        return this._fillOpacity;\n    }\n\n    /**\n     * Set fill opacity property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set fillOpacity(value: number) {\n        this._fillOpacity = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /** @inheritdoc */\n    public get geometry(): VertexGeometry {\n        return this._geometry;\n    }\n\n    /**\n     * Get icon property.\n     * @returns {string}\n     */\n    public get icon(): string {\n        return this._icon;\n    }\n\n    /**\n     * Set icon property.\n     * @param {string}\n     *\n     * @fires Tag#changed\n     */\n    public set icon(value: string) {\n        this._icon = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get icon float property.\n     * @returns {Alignment}\n     */\n    public get iconFloat(): Alignment {\n        return this._iconFloat;\n    }\n\n    /**\n     * Set icon float property.\n     * @param {Alignment}\n     *\n     * @fires Tag#changed\n     */\n    public set iconFloat(value: Alignment) {\n        this._iconFloat = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get icon index property.\n     * @returns {number}\n     */\n    public get iconIndex(): number {\n        return this._iconIndex;\n    }\n\n    /**\n     * Set icon index property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set iconIndex(value: number) {\n        this._iconIndex = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get indicate vertices property.\n     * @returns {boolean} Value indicating if vertices should be indicated\n     * when tag is editable.\n     */\n    public get indicateVertices(): boolean {\n        return this._indicateVertices;\n    }\n\n    /**\n     * Set indicate vertices property.\n     * @param {boolean}\n     *\n     * @fires Tag#changed\n     */\n    public set indicateVertices(value: boolean) {\n        this._indicateVertices = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get line color property.\n     * @returns {number}\n     */\n    public get lineColor(): number {\n        return this._lineColor;\n    }\n\n    /**\n     * Set line color property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set lineColor(value: number) {\n        this._lineColor = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get line opacity property.\n     * @returns {number}\n     */\n    public get lineOpacity(): number {\n        return this._lineOpacity;\n    }\n\n    /**\n     * Set line opacity property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set lineOpacity(value: number) {\n        this._lineOpacity = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get line width property.\n     * @returns {number}\n     */\n    public get lineWidth(): number {\n        return this._lineWidth;\n    }\n\n    /**\n     * Set line width property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set lineWidth(value: number) {\n        this._lineWidth = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get text property.\n     * @returns {string}\n     */\n    public get text(): string {\n        return this._text;\n    }\n\n    /**\n     * Set text property.\n     * @param {string}\n     *\n     * @fires Tag#changed\n     */\n    public set text(value: string) {\n        this._text = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get text color property.\n     * @returns {number}\n     */\n    public get textColor(): number {\n        return this._textColor;\n    }\n\n    /**\n     * Set text color property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set textColor(value: number) {\n        this._textColor = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Set options for tag.\n     *\n     * @description Sets all the option properties provided and keeps\n     * the rest of the values as is.\n     *\n     * @param {IOutlineTagOptions} options - Outline tag options\n     *\n     * @fires {Tag#changed}\n     */\n    public setOptions(options: IOutlineTagOptions): void {\n        this._editable = options.editable == null ? this._editable : options.editable;\n        this._icon = options.icon === undefined ? this._icon : options.icon;\n        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;\n        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;\n        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;\n        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;\n        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;\n        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;\n        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;\n        this._text = options.text === undefined ? this._text : options.text;\n        this._textColor = options.textColor == null ? this._textColor : options.textColor;\n        this._notifyChanged$.next(this);\n    }\n}\n\nexport default OutlineTag;\n",
     "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport {IInteraction} from \"../../../Component\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../../../Geo\";\nimport {ISize} from \"../../../Render\";\nimport {ISpriteAtlas} from \"../../../Viewer\";\n\nexport abstract class RenderTag<T> {\n    protected _tag: T;\n    protected _transform: Transform;\n    protected _viewportCoords: ViewportCoords;\n\n    protected _glObjectsChanged$: Subject<RenderTag<T>>;\n    protected _interact$: Subject<IInteraction>;\n\n    constructor(tag: T, transform: Transform, viewportCoords?: ViewportCoords) {\n        this._tag = tag;\n        this._transform = transform;\n        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords();\n\n        this._glObjectsChanged$ = new Subject<RenderTag<T>>();\n        this._interact$ = new Subject<IInteraction>();\n    }\n\n    public get glObjectsChanged$(): Observable<RenderTag<T>> {\n        return this._glObjectsChanged$;\n    }\n\n    public get interact$(): Observable<IInteraction> {\n        return this._interact$;\n    }\n\n    public get tag(): T {\n        return this._tag;\n    }\n\n    public abstract dispose(): void;\n\n    public abstract getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ISize): vd.VNode[];\n\n    public abstract getGLObjects(): THREE.Object3D[];\n\n    public abstract getRetrievableObjects(): THREE.Object3D[];\n}\n\nexport default RenderTag;\n",
-    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {\n    InteractionCursor,\n    RenderTag,\n    SpotTag,\n    Tag,\n    TagOperation,\n} from \"../../../Component\";\nimport {ISize} from \"../../../Render\";\nimport {\n    Alignment,\n    ISpriteAtlas,\n} from \"../../../Viewer\";\n\n/**\n * @class SpotRenderTag\n * @classdesc Tag visualizing the properties of a SpotTag.\n */\nexport class SpotRenderTag extends RenderTag<SpotTag> {\n    public dispose(): void { /* noop */ }\n\n    public getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ISize): vd.VNode[] {\n        const tag: SpotTag = this._tag;\n        const container: { offsetHeight: number, offsetWidth: number } = {\n            offsetHeight: size.height, offsetWidth: size.width,\n        };\n\n        const vNodes: vd.VNode[] = [];\n        const [centroidBasicX, centroidBasicY]: number[] = tag.geometry.getCentroid2d();\n        const centroidCanvas: number[] =\n            this._viewportCoords.basicToCanvasSafe(\n                centroidBasicX,\n                centroidBasicY,\n                container,\n                this._transform,\n                camera);\n\n        if (centroidCanvas != null) {\n            const interactNone: (e: MouseEvent) => void = (e: MouseEvent): void => {\n                this._interact$.next({ offsetX: 0, offsetY: 0, operation: TagOperation.None, tag: tag });\n            };\n\n            const canvasX: number = Math.round(centroidCanvas[0]);\n            const canvasY: number = Math.round(centroidCanvas[1]);\n\n            if (tag.icon != null) {\n                if (atlas.loaded) {\n                    const sprite: vd.VNode = atlas.getDOMSprite(tag.icon, Alignment.Bottom);\n                    const transform: string = `translate(${canvasX}px,${canvasY + 8}px)`;\n                    const properties: vd.createProperties = {\n                        onmousedown: interactNone,\n                        style: {\n                            pointerEvents: \"all\",\n                            transform: transform,\n                        },\n                    };\n\n                    vNodes.push(vd.h(\"div\", properties, [sprite]));\n                }\n            } else if (tag.text != null) {\n                const transform: string = `translate(-50%,0%) translate(${canvasX}px,${canvasY + 8}px)`;\n                const properties: vd.createProperties = {\n                    onmousedown: interactNone,\n                    style: {\n                        color: this._colorToCss(tag.textColor),\n                        transform: transform,\n                    },\n                    textContent: tag.text,\n                };\n\n                vNodes.push(vd.h(\"span.TagSymbol\", properties, []));\n            }\n\n            const interact: (e: MouseEvent) => void = this._interact(TagOperation.Centroid, tag, \"move\");\n            const background: string = this._colorToCss(tag.color);\n            const transform: string = `translate(-50%,-50%) translate(${canvasX}px,${canvasY}px)`;\n\n            if (tag.editable) {\n                let interactorProperties: vd.createProperties = {\n                    onmousedown: interact,\n                    style: {\n                        background: background,\n                        transform: transform,\n                    },\n                };\n\n                vNodes.push(vd.h(\"div.TagSpotInteractor\", interactorProperties, []));\n            }\n\n            const pointProperties: vd.createProperties = {\n                style: {\n                    background: background,\n                    transform: transform,\n                },\n            };\n\n            vNodes.push(vd.h(\"div.TagVertex\", pointProperties, []));\n        }\n\n        return vNodes;\n    }\n\n    public getGLObjects(): THREE.Object3D[] { return []; }\n\n    public getRetrievableObjects(): THREE.Object3D[] { return []; }\n\n    private _colorToCss(color: number): string {\n        return \"#\" + (\"000000\" + color.toString(16)).substr(-6);\n    }\n\n    private _interact(operation: TagOperation, tag: Tag, cursor: InteractionCursor, vertexIndex?: number): (e: MouseEvent) => void {\n        return (e: MouseEvent): void => {\n            const offsetX: number = e.offsetX - (<HTMLElement>e.target).offsetWidth / 2;\n            const offsetY: number = e.offsetY - (<HTMLElement>e.target).offsetHeight / 2;\n\n            this._interact$.next({\n                cursor: cursor,\n                offsetX: offsetX,\n                offsetY: offsetY,\n                operation: operation,\n                tag: tag,\n                vertexIndex: vertexIndex,\n            });\n        };\n    }\n}\n",
+    "/// <reference path=\"../../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {\n    InteractionCursor,\n    RenderTag,\n    SpotTag,\n    Tag,\n    TagOperation,\n} from \"../../../Component\";\nimport {ISize} from \"../../../Render\";\nimport {\n    Alignment,\n    ISpriteAtlas,\n} from \"../../../Viewer\";\n\n/**\n * @class SpotRenderTag\n * @classdesc Tag visualizing the properties of a SpotTag.\n */\nexport class SpotRenderTag extends RenderTag<SpotTag> {\n    public dispose(): void { /* noop */ }\n\n    public getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ISize): vd.VNode[] {\n        const tag: SpotTag = this._tag;\n        const container: { offsetHeight: number, offsetWidth: number } = {\n            offsetHeight: size.height, offsetWidth: size.width,\n        };\n\n        const vNodes: vd.VNode[] = [];\n        const [centroidBasicX, centroidBasicY]: number[] = tag.geometry.getCentroid2d();\n        const centroidCanvas: number[] =\n            this._viewportCoords.basicToCanvasSafe(\n                centroidBasicX,\n                centroidBasicY,\n                container,\n                this._transform,\n                camera);\n\n        if (centroidCanvas != null) {\n            const interactNone: (e: MouseEvent) => void = (e: MouseEvent): void => {\n                this._interact$.next({ offsetX: 0, offsetY: 0, operation: TagOperation.None, tag: tag });\n            };\n\n            const canvasX: number = Math.round(centroidCanvas[0]);\n            const canvasY: number = Math.round(centroidCanvas[1]);\n\n            if (tag.icon != null) {\n                if (atlas.loaded) {\n                    const sprite: vd.VNode = atlas.getDOMSprite(tag.icon, Alignment.Bottom);\n                    const iconTransform: string = `translate(${canvasX}px,${canvasY + 8}px)`;\n                    const properties: vd.createProperties = {\n                        onmousedown: interactNone,\n                        style: {\n                            pointerEvents: \"all\",\n                            transform: iconTransform,\n                        },\n                    };\n\n                    vNodes.push(vd.h(\"div\", properties, [sprite]));\n                }\n            } else if (tag.text != null) {\n                const textTransform: string = `translate(-50%,0%) translate(${canvasX}px,${canvasY + 8}px)`;\n                const properties: vd.createProperties = {\n                    onmousedown: interactNone,\n                    style: {\n                        color: this._colorToCss(tag.textColor),\n                        transform: textTransform,\n                    },\n                    textContent: tag.text,\n                };\n\n                vNodes.push(vd.h(\"span.TagSymbol\", properties, []));\n            }\n\n            const interact: (e: MouseEvent) => void = this._interact(TagOperation.Centroid, tag, \"move\");\n            const background: string = this._colorToCss(tag.color);\n            const transform: string = `translate(-50%,-50%) translate(${canvasX}px,${canvasY}px)`;\n\n            if (tag.editable) {\n                let interactorProperties: vd.createProperties = {\n                    onmousedown: interact,\n                    style: {\n                        background: background,\n                        transform: transform,\n                    },\n                };\n\n                vNodes.push(vd.h(\"div.TagSpotInteractor\", interactorProperties, []));\n            }\n\n            const pointProperties: vd.createProperties = {\n                style: {\n                    background: background,\n                    transform: transform,\n                },\n            };\n\n            vNodes.push(vd.h(\"div.TagVertex\", pointProperties, []));\n        }\n\n        return vNodes;\n    }\n\n    public getGLObjects(): THREE.Object3D[] { return []; }\n\n    public getRetrievableObjects(): THREE.Object3D[] { return []; }\n\n    private _colorToCss(color: number): string {\n        return \"#\" + (\"000000\" + color.toString(16)).substr(-6);\n    }\n\n    private _interact(operation: TagOperation, tag: Tag, cursor: InteractionCursor, vertexIndex?: number): (e: MouseEvent) => void {\n        return (e: MouseEvent): void => {\n            const offsetX: number = e.offsetX - (<HTMLElement>e.target).offsetWidth / 2;\n            const offsetY: number = e.offsetY - (<HTMLElement>e.target).offsetHeight / 2;\n\n            this._interact$.next({\n                cursor: cursor,\n                offsetX: offsetX,\n                offsetY: offsetY,\n                operation: operation,\n                tag: tag,\n                vertexIndex: vertexIndex,\n            });\n        };\n    }\n}\n",
     "import {\n    Geometry,\n    ISpotTagOptions,\n    Tag,\n} from \"../../../Component\";\n\n/**\n * @class SpotTag\n *\n * @classdesc Tag holding properties for visualizing the centroid of a geometry.\n *\n * @example\n * ```\n * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);\n * var tag = new Mapillary.TagComponent.SpotTag(\n *     \"id-1\",\n *     geometry\n *     { editable: true, color: 0xff0000 });\n *\n * tagComponent.add([tag]);\n * ```\n */\nexport class SpotTag extends Tag {\n    protected _geometry: Geometry;\n\n    private _color: number;\n    private _editable: boolean;\n    private _icon: string;\n    private _text: string;\n    private _textColor: number;\n\n    /**\n     * Create a spot tag.\n     *\n     * @override\n     * @constructor\n     * @param {string} id\n     * @param {Geometry} geometry\n     * @param {IOutlineTagOptions} options - Options defining the visual appearance and\n     * behavior of the spot tag.\n     */\n    constructor(id: string, geometry: Geometry, options?: ISpotTagOptions) {\n        super(id, geometry);\n\n        options = !!options ? options : {};\n\n        this._color = options.color == null ? 0xFFFFFF : options.color;\n        this._editable = options.editable == null ? false : options.editable;\n        this._icon = options.icon === undefined ? null : options.icon;\n        this._text = options.text === undefined ? null : options.text;\n        this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;\n    }\n\n    /**\n     * Get color property.\n     * @returns {number} The color of the spot as a hexagonal number;\n     */\n    public get color(): number {\n        return this._color;\n    }\n\n    /**\n     * Set color property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set color(value: number) {\n        this._color = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get editable property.\n     * @returns {boolean} Value indicating if tag is editable.\n     */\n    public get editable(): boolean {\n        return this._editable;\n    }\n\n    /**\n     * Set editable property.\n     * @param {boolean}\n     *\n     * @fires Tag#changed\n     */\n    public set editable(value: boolean) {\n        this._editable = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get icon property.\n     * @returns {string}\n     */\n    public get icon(): string {\n        return this._icon;\n    }\n\n    /**\n     * Set icon property.\n     * @param {string}\n     *\n     * @fires Tag#changed\n     */\n    public set icon(value: string) {\n        this._icon = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get text property.\n     * @returns {string}\n     */\n    public get text(): string {\n        return this._text;\n    }\n\n    /**\n     * Set text property.\n     * @param {string}\n     *\n     * @fires Tag#changed\n     */\n    public set text(value: string) {\n        this._text = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Get text color property.\n     * @returns {number}\n     */\n    public get textColor(): number {\n        return this._textColor;\n    }\n\n    /**\n     * Set text color property.\n     * @param {number}\n     *\n     * @fires Tag#changed\n     */\n    public set textColor(value: number) {\n        this._textColor = value;\n        this._notifyChanged$.next(this);\n    }\n\n    /**\n     * Set options for tag.\n     *\n     * @description Sets all the option properties provided and keps\n     * the rest of the values as is.\n     *\n     * @param {ISpotTagOptions} options - Spot tag options\n     *\n     * @fires {Tag#changed}\n     */\n    public setOptions(options: ISpotTagOptions): void {\n        this._color = options.color == null ? this._color : options.color;\n        this._editable = options.editable == null ? this._editable : options.editable;\n        this._icon = options.icon === undefined ? this._icon : options.icon;\n        this._text = options.text === undefined ? this._text : options.text;\n        this._textColor = options.textColor == null ? this._textColor : options.textColor;\n        this._notifyChanged$.next(this);\n    }\n}\n\nexport default SpotTag;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/share\";\n\nimport {Geometry} from \"../../../Component\";\nimport {EventEmitter} from \"../../../Utils\";\n\n/**\n * @class Tag\n * @abstract\n * @classdesc Abstract class representing the basic functionality of for a tag.\n */\nexport abstract class Tag extends EventEmitter {\n    /**\n     * Event fired when a property related to the visual appearance of the\n     * tag has changed.\n     *\n     * @event Tag#changed\n     * @type {Tag} The tag instance that has changed.\n     */\n    public static changed: string = \"changed\";\n\n    /**\n     * Event fired when the geometry of the tag has changed.\n     *\n     * @event Tag#geometrychanged\n     * @type {Tag} The tag instance whose geometry has changed.\n     */\n    public static geometrychanged: string = \"geometrychanged\";\n\n    protected _id: string;\n    protected _geometry: Geometry;\n\n    protected _notifyChanged$: Subject<Tag>;\n\n    /**\n     * Create a tag.\n     *\n     * @constructor\n     * @param {string} id\n     * @param {Geometry} geometry\n     */\n    constructor(id: string, geometry: Geometry) {\n        super();\n\n        this._id = id;\n        this._geometry = geometry;\n\n        this._notifyChanged$ = new Subject<Tag>();\n\n        this._notifyChanged$\n            .subscribe(\n                (t: Tag): void => {\n                    this.fire(Tag.changed, this);\n                });\n\n        this._geometry.changed$\n            .subscribe(\n                (g: Geometry): void => {\n                    this.fire(Tag.geometrychanged, this);\n                });\n    }\n\n    /**\n     * Get id property.\n     * @returns {string}\n     */\n    public get id(): string {\n        return this._id;\n    }\n\n    /**\n     * Get geometry property.\n     * @returns {Geometry} The geometry of the tag.\n     */\n    public get geometry(): Geometry {\n        return this._geometry;\n    }\n\n    /**\n     * Get changed observable.\n     * @returns {Observable<Tag>}\n     * @ignore\n     */\n    public get changed$(): Observable<Tag> {\n        return this._notifyChanged$;\n    }\n\n    /**\n     * Get geometry changed observable.\n     * @returns {Observable<Tag>}\n     * @ignore\n     */\n    public get geometryChanged$(): Observable<Tag> {\n        return this._geometry.changed$\n            .map(\n                (geometry: Geometry): Tag => {\n                    return this;\n                })\n            .share();\n    }\n}\n\nexport default Tag;\n",
     "import {\n    Component,\n    IComponentConfiguration,\n} from \"../../Component\";\nimport {\n    Container,\n    Navigator,\n} from \"../../Viewer\";\n\nexport abstract class HandlerBase<TConfiguration extends IComponentConfiguration> {\n    protected _component: Component<TConfiguration>;\n    protected _container: Container;\n    protected _navigator: Navigator;\n\n    protected _enabled: boolean;\n\n    constructor(component: Component<TConfiguration>, container: Container, navigator: Navigator) {\n        this._component = component;\n        this._container = container;\n        this._navigator = navigator;\n\n        this._enabled = false;\n    }\n\n    /**\n     * Returns a Boolean indicating whether the interaction is enabled.\n     *\n     * @returns {boolean} `true` if the interaction is enabled.\n     */\n    public get isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    /**\n     * Enables the interaction.\n     *\n     * @example ```<component-name>.<handler-name>.enable();```\n     */\n    public enable(): void {\n        if (this._enabled || !this._component.activated) { return; }\n\n        this._enable();\n        this._enabled = true;\n\n        this._component.configure(this._getConfiguration(true));\n    }\n\n    /**\n     * Disables the interaction.\n     *\n     * @example ```<component-name>.<handler-name>.disable();```\n     */\n    public disable(): void {\n        if (!this._enabled) { return; }\n\n        this._disable();\n        this._enabled = false;\n\n        if (this._component.activated) {\n            this._component.configure(this._getConfiguration(false));\n        }\n    }\n\n    protected abstract _enable(): void;\n\n    protected abstract _disable(): void;\n\n    protected abstract _getConfiguration(enable: boolean): TConfiguration;\n}\n\nexport default HandlerBase;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Transform} from \"../Geo\";\n\n/**\n * @class Camera\n *\n * @classdesc Holds information about a camera.\n */\nexport class Camera {\n    private _position: THREE.Vector3;\n    private _lookat: THREE.Vector3;\n    private _up: THREE.Vector3;\n    private _focal: number;\n\n    /**\n     * Create a new camera instance.\n     * @param {Transform} [transform] - Optional transform instance.\n     */\n    constructor(transform?: Transform) {\n        if (transform != null) {\n            this._position = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0));\n            this._lookat = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10));\n            this._up = transform.upVector();\n            this._focal = this._getFocal(transform);\n        } else {\n            this._position = new THREE.Vector3(0, 0, 0);\n            this._lookat = new THREE.Vector3(0, 0, 1);\n            this._up = new THREE.Vector3(0, -1, 0);\n            this._focal = 1;\n        }\n    }\n\n   /**\n    * Get position.\n    * @returns {THREE.Vector3} The position vector.\n    */\n    public get position(): THREE.Vector3 {\n        return this._position;\n    }\n\n   /**\n    * Get lookat.\n    * @returns {THREE.Vector3} The lookat vector.\n    */\n    public get lookat(): THREE.Vector3 {\n        return this._lookat;\n    }\n\n   /**\n    * Get up.\n    * @returns {THREE.Vector3} The up vector.\n    */\n    public get up(): THREE.Vector3 {\n        return this._up;\n    }\n\n   /**\n    * Get focal.\n    * @returns {number} The focal length.\n    */\n    public get focal(): number {\n        return this._focal;\n    }\n\n   /**\n    * Set focal.\n    */\n    public set focal(value: number) {\n        this._focal = value;\n    }\n\n    /**\n     * Update this camera to the linearly interpolated value of two other cameras.\n     *\n     * @param {Camera} a - First camera.\n     * @param {Camera} b - Second camera.\n     * @param {number} alpha - Interpolation value on the interval [0, 1].\n     */\n    public lerpCameras(a: Camera, b: Camera, alpha: number): void {\n      this._position.subVectors(b.position, a.position).multiplyScalar(alpha).add(a.position);\n      this._lookat.subVectors(b.lookat, a.lookat).multiplyScalar(alpha).add(a.lookat);\n      this._up.subVectors(b.up, a.up).multiplyScalar(alpha).add(a.up);\n      this._focal = (1 - alpha) * a.focal + alpha * b.focal;\n    }\n\n    /**\n     * Copy the properties of another camera to this camera.\n     *\n     * @param {Camera} other - Another camera.\n     */\n    public copy(other: Camera): void {\n        this._position.copy(other.position);\n        this._lookat.copy(other.lookat);\n        this._up.copy(other.up);\n        this._focal = other.focal;\n    }\n\n    /**\n     * Clone this camera.\n     *\n     * @returns {Camera} A camera with cloned properties equal to this camera.\n     */\n    public clone(): Camera {\n        let camera: Camera = new Camera();\n\n        camera.position.copy(this._position);\n        camera.lookat.copy(this._lookat);\n        camera.up.copy(this._up);\n        camera.focal = this._focal;\n\n        return camera;\n    }\n\n    /**\n     * Determine the distance between this camera and another camera.\n     *\n     * @param {Camera} other - Another camera.\n     * @returns {number} The distance between the cameras.\n     */\n    public diff(other: Camera): number {\n        let pd: number = this._position.distanceToSquared(other.position);\n        let ld: number = this._lookat.distanceToSquared(other.lookat);\n        let ud: number = this._up.distanceToSquared(other.up);\n        let fd: number = 100 * Math.abs(this._focal - other.focal);\n\n        return Math.max(pd, ld, ud, fd);\n    }\n\n    /**\n     * Get the focal length based on the transform.\n     *\n     * @description Returns the focal length of the transform if gpano info is not available.\n     * Returns a focal length corresponding to a vertical fov clamped to [45, 90] degrees based on\n     * the gpano information if available.\n     *\n     * @returns {number} Focal length.\n     */\n    private _getFocal(transform: Transform): number {\n        if (transform.gpano == null) {\n            return transform.focal;\n        }\n\n        let vFov: number = Math.PI * transform.gpano.CroppedAreaImageHeightPixels / transform.gpano.FullPanoHeightPixels;\n        let focal: number = 0.5 / Math.tan(vFov / 2);\n\n        return Math.min(1 / (2 * (Math.sqrt(2) - 1)), Math.max(0.5, focal));\n    }\n}\n",
     "/**\n * @class GeoCoords\n *\n * @classdesc Converts coordinates between the geodetic (WGS84),\n * Earth-Centered, Earth-Fixed (ECEF) and local topocentric\n * East, North, Up (ENU) reference frames.\n *\n * The WGS84 has latitude (degrees), longitude (degrees) and\n * altitude (meters) values.\n *\n * The ECEF Z-axis pierces the north pole and the\n * XY-axis defines the equatorial plane. The X-axis extends\n * from the geocenter to the intersection of the Equator and\n * the Greenwich Meridian. All values in meters.\n *\n * The WGS84 parameters are:\n *\n * a = 6378137\n * b = a * (1 - f)\n * f = 1 / 298.257223563\n * e = Math.sqrt((a^2 - b^2) / a^2)\n * e' = Math.sqrt((a^2 - b^2) / b^2)\n *\n * The WGS84 to ECEF conversion is performed using the following:\n *\n * X = (N - h) * cos(phi) * cos(lambda)\n * Y = (N + h) * cos(phi) * sin(lambda)\n * Z = (b^2 * N / a^2 + h) * sin(phi)\n *\n * where\n *\n * phi = latitude\n * lambda = longitude\n * h = height above ellipsoid (altitude)\n * N = Radius of curvature (meters)\n *   = a / Math.sqrt(1 - e^2 * sin(phi)^2)\n *\n * The ECEF to WGS84 conversion is performed using the following:\n *\n * phi = arctan((Z + e'^2 * b * sin(theta)^3) / (p - e^2 * a * cos(theta)^3))\n * lambda = arctan(Y / X)\n * h = p / cos(phi) - N\n *\n * where\n *\n * p = Math.sqrt(X^2 + Y^2)\n * theta = arctan(Z * a / p * b)\n *\n * In the ENU reference frame the x-axis points to the\n * East, the y-axis to the North and the z-axis Up. All values\n * in meters.\n *\n * The ECEF to ENU conversion is performed using the following:\n *\n * | x |   |       -sin(lambda_r)                cos(lambda_r)             0      | | X - X_r |\n * | y | = | -sin(phi_r) * cos(lambda_r)  -sin(phi_r) * sin(lambda_r)  cos(phi_r) | | Y - Y_r |\n * | z |   |  cos(phi_r) * cos(lambda_r)   cos(phi_r) * sin(lambda_r)  sin(phi_r) | | Z - Z_r |\n *\n * where\n *\n * phi_r = latitude of reference\n * lambda_r = longitude of reference\n * X_r, Y_r, Z_r = ECEF coordinates of reference\n *\n * The ENU to ECEF conversion is performed by solving the above equation for X, Y, Z.\n *\n * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in\n * the first step for both conversions.\n */\nexport class GeoCoords {\n    private _wgs84a: number = 6378137.0;\n    private _wgs84b: number = 6356752.31424518;\n\n    /**\n     * Convert coordinates from geodetic (WGS84) reference to local topocentric\n     * (ENU) reference.\n     *\n     * @param {number} lat Latitude in degrees.\n     * @param {number} lon Longitude in degrees.\n     * @param {number} alt Altitude in meters.\n     * @param {number} refLat Reference latitude in degrees.\n     * @param {number} refLon Reference longitude in degrees.\n     * @param {number} refAlt Reference altitude in meters.\n     * @returns {Array<number>} The x, y, z local topocentric ENU coordinates.\n     */\n    public geodeticToEnu(\n        lat: number,\n        lon: number,\n        alt: number,\n        refLat: number,\n        refLon: number,\n        refAlt: number): number[] {\n\n        let ecef: number[] = this.geodeticToEcef(lat, lon, alt);\n\n        return this.ecefToEnu(ecef[0], ecef[1], ecef[2], refLat, refLon, refAlt);\n    }\n\n    /**\n     * Convert coordinates from local topocentric (ENU) reference to\n     * geodetic (WGS84) reference.\n     *\n     * @param {number} x Topocentric ENU coordinate in East direction.\n     * @param {number} y Topocentric ENU coordinate in North direction.\n     * @param {number} z Topocentric ENU coordinate in Up direction.\n     * @param {number} refLat Reference latitude in degrees.\n     * @param {number} refLon Reference longitude in degrees.\n     * @param {number} refAlt Reference altitude in meters.\n     * @returns {Array<number>} The latitude and longitude in degrees\n     *                          as well as altitude in meters.\n     */\n    public enuToGeodetic(\n        x: number,\n        y: number,\n        z: number,\n        refLat: number,\n        refLon: number,\n        refAlt: number): number[] {\n\n        let ecef: number[] = this.enuToEcef(x, y, z, refLat, refLon, refAlt);\n\n        return this.ecefToGeodetic(ecef[0], ecef[1], ecef[2]);\n    }\n\n    /**\n     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference\n     * to local topocentric (ENU) reference.\n     *\n     * @param {number} X ECEF X-value.\n     * @param {number} Y ECEF Y-value.\n     * @param {number} Z ECEF Z-value.\n     * @param {number} refLat Reference latitude in degrees.\n     * @param {number} refLon Reference longitude in degrees.\n     * @param {number} refAlt Reference altitude in meters.\n     * @returns {Array<number>} The x, y, z topocentric ENU coordinates in East, North\n     * and Up directions respectively.\n     */\n    public ecefToEnu(\n        X: number,\n        Y: number,\n        Z: number,\n        refLat: number,\n        refLon: number,\n        refAlt: number): number[] {\n\n        let refEcef: number[] = this.geodeticToEcef(refLat, refLon, refAlt);\n\n        let V: number[] = [X - refEcef[0], Y - refEcef[1], Z - refEcef[2]];\n\n        refLat = refLat * Math.PI / 180.0;\n        refLon = refLon * Math.PI / 180.0;\n\n        let cosLat: number = Math.cos(refLat);\n        let sinLat: number = Math.sin(refLat);\n        let cosLon: number = Math.cos(refLon);\n        let sinLon: number = Math.sin(refLon);\n\n        let x: number = -sinLon * V[0] + cosLon * V[1];\n        let y: number = -sinLat * cosLon * V[0] - sinLat * sinLon * V[1] + cosLat * V[2];\n        let z: number = cosLat * cosLon * V[0] + cosLat * sinLon * V[1] + sinLat * V[2];\n\n        return [x, y, z];\n    }\n\n    /**\n     * Convert coordinates from local topocentric (ENU) reference\n     * to Earth-Centered, Earth-Fixed (ECEF) reference.\n     *\n     * @param {number} x Topocentric ENU coordinate in East direction.\n     * @param {number} y Topocentric ENU coordinate in North direction.\n     * @param {number} z Topocentric ENU coordinate in Up direction.\n     * @param {number} refLat Reference latitude in degrees.\n     * @param {number} refLon Reference longitude in degrees.\n     * @param {number} refAlt Reference altitude in meters.\n     * @returns {Array<number>} The X, Y, Z ECEF coordinates.\n     */\n    public enuToEcef(\n        x: number,\n        y: number,\n        z: number,\n        refLat: number,\n        refLon: number,\n        refAlt: number): number[] {\n\n        let refEcef: number[] = this.geodeticToEcef(refLat, refLon, refAlt);\n\n        refLat = refLat * Math.PI / 180.0;\n        refLon = refLon * Math.PI / 180.0;\n\n        let cosLat: number = Math.cos(refLat);\n        let sinLat: number = Math.sin(refLat);\n        let cosLon: number = Math.cos(refLon);\n        let sinLon: number = Math.sin(refLon);\n\n        let X: number = -sinLon * x - sinLat * cosLon * y + cosLat * cosLon * z + refEcef[0];\n        let Y: number = cosLon * x - sinLat * sinLon * y + cosLat * sinLon * z + refEcef[1];\n        let Z: number = cosLat * y + sinLat * z + refEcef[2];\n\n        return [X, Y, Z];\n    }\n\n    /**\n     * Convert coordinates from geodetic reference (WGS84) to Earth-Centered,\n     * Earth-Fixed (ECEF) reference.\n     *\n     * @param {number} lat Latitude in degrees.\n     * @param {number} lon Longitude in degrees.\n     * @param {number} alt Altitude in meters.\n     * @returns {Array<number>} The X, Y, Z ECEF coordinates.\n     */\n    public geodeticToEcef(lat: number, lon: number, alt: number): number[] {\n        let a: number = this._wgs84a;\n        let b: number = this._wgs84b;\n\n        lat = lat * Math.PI / 180.0;\n        lon = lon * Math.PI / 180.0;\n\n        let cosLat: number = Math.cos(lat);\n        let sinLat: number = Math.sin(lat);\n        let cosLon: number = Math.cos(lon);\n        let sinLon: number = Math.sin(lon);\n\n        let a2: number = a * a;\n        let b2: number = b * b;\n\n        let L: number = 1.0 / Math.sqrt(a2 * cosLat * cosLat + b2 * sinLat * sinLat);\n\n        let nhcl: number = (a2 * L + alt) * cosLat;\n\n        let X: number = nhcl * cosLon;\n        let Y: number = nhcl * sinLon;\n        let Z: number = (b2 * L + alt) * sinLat;\n\n        return [X, Y, Z];\n    }\n\n    /**\n     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference\n     * to geodetic reference (WGS84).\n     *\n     * @param {number} X ECEF X-value.\n     * @param {number} Y ECEF Y-value.\n     * @param {number} Z ECEF Z-value.\n     * @returns {Array<number>} The latitude and longitude in degrees\n     *                          as well as altitude in meters.\n     */\n    public ecefToGeodetic(X: number, Y: number, Z: number): number[] {\n        let a: number = this._wgs84a;\n        let b: number = this._wgs84b;\n\n        let a2: number = a * a;\n        let b2: number = b * b;\n\n        let a2mb2: number = a2 - b2;\n\n        let ea: number = Math.sqrt(a2mb2 / a2);\n        let eb: number = Math.sqrt(a2mb2 / b2);\n\n        let p: number = Math.sqrt(X * X + Y * Y);\n        let theta: number = Math.atan2(Z * a, p * b);\n\n        let sinTheta: number = Math.sin(theta);\n        let cosTheta: number = Math.cos(theta);\n\n        let lon: number = Math.atan2(Y, X);\n        let lat: number =\n            Math.atan2(Z + eb * eb * b * sinTheta * sinTheta * sinTheta,\n                       p - ea * ea * a * cosTheta * cosTheta * cosTheta);\n\n        let sinLat: number = Math.sin(lat);\n        let cosLat: number = Math.cos(lat);\n\n        let N: number = a / Math.sqrt(1 - ea * ea * sinLat * sinLat);\n        let alt: number = p / cosLat - N;\n\n        return [lat * 180.0 / Math.PI, lon * 180.0 / Math.PI, alt];\n    }\n}\n\nexport default GeoCoords;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\n/**\n * @class Spatial\n *\n * @classdesc Provides methods for scalar, vector and matrix calculations.\n */\nexport class Spatial {\n    private _epsilon: number = 1e-9;\n\n    /**\n     * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to\n     * bearing (clockwise with origin at north or Y-axis).\n     *\n     * @param {number} phi - Azimuthal phi angle in radians.\n     * @returns {number} Bearing in radians.\n     */\n    public azimuthalToBearing(phi: number): number {\n         return -phi + Math.PI / 2;\n    }\n\n    /**\n     * Converts degrees to radians.\n     *\n     * @param {number} deg - Degrees.\n     * @returns {number} Radians.\n     */\n    public degToRad(deg: number): number {\n        return Math.PI * deg / 180;\n    }\n\n    /**\n     * Converts radians to degrees.\n     *\n     * @param {number} rad - Radians.\n     * @returns {number} Degrees.\n     */\n    public radToDeg(rad: number): number {\n        return 180 * rad / Math.PI;\n    }\n\n    /**\n     * Creates a rotation matrix from an angle-axis vector.\n     *\n     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.\n     * @returns {THREE.Matrix4} Rotation matrix.\n     */\n    public rotationMatrix(angleAxis: number[]): THREE.Matrix4 {\n        let axis: THREE.Vector3 =\n            new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]);\n        let angle: number = axis.length();\n        if (angle > 0) {\n            axis.normalize();\n        }\n\n        return new THREE.Matrix4().makeRotationAxis(axis, angle);\n    }\n\n    /**\n     * Rotates a vector according to a angle-axis rotation vector.\n     *\n     * @param {Array<number>} vector - Vector to rotate.\n     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.\n     * @returns {THREE.Vector3} Rotated vector.\n     */\n    public rotate(vector: number[], angleAxis: number[]): THREE.Vector3 {\n        let v: THREE.Vector3 = new THREE.Vector3(vector[0], vector[1], vector[2]);\n        let rotationMatrix: THREE.Matrix4 = this.rotationMatrix(angleAxis);\n        v.applyMatrix4(rotationMatrix);\n\n        return v;\n    }\n\n    /**\n     * Calculates the optical center from a rotation vector\n     * on the angle-axis representation and a translation vector\n     * according to C = -R^T t.\n     *\n     * @param {Array<number>} rotation - Angle-axis representation of a rotation.\n     * @param {Array<number>} translation - Translation vector.\n     * @returns {THREE.Vector3} Optical center.\n     */\n    public opticalCenter(rotation: number[], translation: number[]): THREE.Vector3 {\n        let angleAxis: number[] = [-rotation[0], -rotation[1], -rotation[2]];\n        let vector: number[] = [-translation[0], -translation[1], -translation[2]];\n\n        return this.rotate(vector, angleAxis);\n    }\n\n    /**\n     * Calculates the viewing direction from a rotation vector\n     * on the angle-axis representation.\n     *\n     * @param {number[]} rotation - Angle-axis representation of a rotation.\n     * @returns {THREE.Vector3} Viewing direction.\n     */\n    public viewingDirection(rotation: number[]): THREE.Vector3 {\n        let angleAxis: number[] = [-rotation[0], -rotation[1], -rotation[2]];\n\n        return this.rotate([0, 0, 1], angleAxis);\n    }\n\n    /**\n     * Wrap a number on the interval [min, max].\n     *\n     * @param {number} value - Value to wrap.\n     * @param {number} min - Lower endpoint of interval.\n     * @param {number} max - Upper endpoint of interval.\n     * @returns {number} The wrapped number.\n     */\n    public wrap(value: number, min: number, max: number): number {\n        if (max < min) {\n            throw new Error(\"Invalid arguments: max must be larger than min.\");\n        }\n\n        let interval: number = (max - min);\n\n        while (value > max || value < min) {\n            if (value > max) {\n                value = value - interval;\n            } else if (value < min) {\n                value = value + interval;\n            }\n        }\n\n        return value;\n    }\n\n    /**\n     * Wrap an angle on the interval [-Pi, Pi].\n     *\n     * @param {number} angle - Value to wrap.\n     * @returns {number} Wrapped angle.\n     */\n    public wrapAngle(angle: number): number {\n        return this.wrap(angle, -Math.PI, Math.PI);\n    }\n\n    /**\n     * Limit the value to the interval [min, max] by changing the value to\n     * the nearest available one when it is outside the interval.\n     *\n     * @param {number} value - Value to clamp.\n     * @param {number} min - Minimum of the interval.\n     * @param {number} max - Maximum of the interval.\n     * @returns {number} Clamped value.\n     */\n    public clamp(value: number, min: number, max: number): number {\n        if (value < min) {\n            return min;\n        }\n\n        if (value > max) {\n            return max;\n        }\n\n        return value;\n    }\n\n    /**\n     * Calculates the counter-clockwise angle from the first\n     * vector (x1, y1)^T to the second (x2, y2)^T.\n     *\n     * @param {number} x1 - X coordinate of first vector.\n     * @param {number} y1 - Y coordinate of first vector.\n     * @param {number} x2 - X coordinate of second vector.\n     * @param {number} y2 - Y coordinate of second vector.\n     * @returns {number} Counter clockwise angle between the vectors.\n     */\n    public angleBetweenVector2(x1: number, y1: number, x2: number, y2: number): number {\n        let angle: number = Math.atan2(y2, x2) - Math.atan2(y1, x1);\n\n        return this.wrapAngle(angle);\n    }\n\n    /**\n     * Calculates the minimum (absolute) angle change for rotation\n     * from one angle to another on the [-Pi, Pi] interval.\n     *\n     * @param {number} angle1 - Start angle.\n     * @param {number} angle2 - Destination angle.\n     * @returns {number} Absolute angle change between angles.\n     */\n    public angleDifference(angle1: number, angle2: number): number {\n        let angle: number = angle2 - angle1;\n\n        return this.wrapAngle(angle);\n    }\n\n    /**\n     * Calculates the relative rotation angle between two\n     * angle-axis vectors.\n     *\n     * @param {number} rotation1 - First angle-axis vector.\n     * @param {number} rotation2 - Second angle-axis vector.\n     * @returns {number} Relative rotation angle.\n     */\n    public relativeRotationAngle(rotation1: number[], rotation2: number[]): number {\n        let R1T: THREE.Matrix4 = this.rotationMatrix(\n            [-rotation1[0], -rotation1[1], -rotation1[2]]);\n        let R2: THREE.Matrix4 = this.rotationMatrix(rotation2);\n\n        let R: THREE.Matrix4 = R1T.multiply(R2);\n        let elements: Float32Array = R.elements;\n\n        // from Tr(R) = 1 + 2*cos(theta)\n        let theta: number = Math.acos((elements[0] + elements[5] + elements[10] - 1) / 2);\n\n        return theta;\n    }\n\n    /**\n     * Calculates the angle from a vector to a plane.\n     *\n     * @param {Array<number>} vector - The vector.\n     * @param {Array<number>} planeNormal - Normal of the plane.\n     * @returns {number} Angle from between plane and vector.\n     */\n    public angleToPlane(vector: number[], planeNormal: number[]): number {\n        let v: THREE.Vector3 = new THREE.Vector3().fromArray(vector);\n        let norm: number = v.length();\n\n        if (norm < this._epsilon) {\n            return 0;\n        }\n\n        let projection: number = v.dot(new THREE.Vector3().fromArray(planeNormal));\n\n        return Math.asin(projection / norm);\n    }\n\n    /**\n     * Calculates the distance between two coordinates\n     * (latitude longitude pairs) in meters according to\n     * the haversine formula.\n     *\n     * @param {number} lat1 - Latitude of the first coordinate.\n     * @param {number} lon1 - Longitude of the first coordinate.\n     * @param {number} lat2 - Latitude of the second coordinate.\n     * @param {number} lon2 - Longitude of the second coordinate.\n     * @returns {number} Distance between lat lon positions.\n     */\n    public distanceFromLatLon(lat1: number, lon1: number, lat2: number, lon2: number): number {\n        let r: number = 6371000;\n        let dLat: number = this.degToRad(lat2 - lat1);\n        let dLon: number = this.degToRad(lon2 - lon1);\n\n        let hav: number =\n            Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n            Math.cos(lat1) * Math.cos(lat2) *\n            Math.sin(dLon / 2) * Math.sin(dLon / 2);\n\n        let d: number = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav));\n\n        return d;\n    }\n}\n\nexport default Spatial;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {IGPano} from \"../API\";\nimport {Node} from \"../Graph\";\n\n/**\n * @class Transform\n *\n * @classdesc Class used for calculating coordinate transformations\n * and projections.\n */\nexport class Transform {\n    private _width: number;\n    private _height: number;\n    private _focal: number;\n    private _orientation: number;\n    private _scale: number;\n    private _basicWidth: number;\n    private _basicHeight: number;\n    private _basicAspect: number;\n\n    private _gpano: IGPano;\n\n    private _rt: THREE.Matrix4;\n    private _srt: THREE.Matrix4;\n\n    /**\n     * Create a new transform instance.\n     * @param {Node} apiNavImIm - Node properties.\n     * @param {HTMLImageElement} image - Node image.\n     * @param {Array<number>} translation - Node translation vector in three dimensions.\n     */\n    constructor(node: Node, image: HTMLImageElement, translation: number[]) {\n        this._orientation = this._getValue(node.orientation, 1);\n\n        let imageWidth: number = image != null ? image.width : 4;\n        let imageHeight: number = image != null ? image.height : 3;\n        let keepOrientation: boolean = this._orientation < 5;\n\n        this._width = this._getValue(node.width, keepOrientation ? imageWidth : imageHeight);\n        this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth);\n\n        this._basicAspect = keepOrientation ?\n             this._width / this._height :\n             this._height / this._width;\n\n        this._basicWidth = keepOrientation ? node.width : node.height;\n        this._basicHeight = keepOrientation ? node.height : node.width;\n\n        this._focal = this._getValue(node.focal, 1);\n        this._scale = this._getValue(node.scale, 0);\n\n        this._gpano = node.gpano != null ? node.gpano : null;\n\n        this._rt = this._getRt(node.rotation, translation);\n        this._srt = this._getSrt(this._rt, this._scale);\n    }\n\n    /**\n     * Get basic aspect.\n     * @returns {number} The orientation adjusted aspect ratio.\n     */\n    public get basicAspect(): number {\n        return this._basicAspect;\n    }\n\n    /**\n     * Get basic height.\n     *\n     * @description Does not fall back to node image height but\n     * uses original value from API so can be faulty.\n     *\n     * @returns {number} The height of the basic version image\n     * (adjusted for orientation).\n     */\n    public get basicHeight(): number {\n        return this._basicHeight;\n    }\n\n    /**\n     * Get basic width.\n     *\n     * @description Does not fall back to node image width but\n     * uses original value from API so can be faulty.\n     *\n     * @returns {number} The width of the basic version image\n     * (adjusted for orientation).\n     */\n    public get basicWidth(): number {\n        return this._basicWidth;\n    }\n\n    /**\n     * Get focal.\n     * @returns {number} The node focal length.\n     */\n    public get focal(): number {\n        return this._focal;\n    }\n\n    /**\n     * Get fullPano.\n     *\n     * @returns {boolean} Value indicating whether the node is a complete\n     * 360 panorama.\n     */\n    public get fullPano(): boolean {\n        return this._gpano != null &&\n            this._gpano.CroppedAreaLeftPixels === 0 &&\n            this._gpano.CroppedAreaTopPixels === 0 &&\n            this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&\n            this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;\n    }\n\n    /**\n     * Get gpano.\n     * @returns {number} The node gpano information.\n     */\n    public get gpano(): IGPano {\n        return this._gpano;\n    }\n\n    /**\n     * Get height.\n     *\n     * @description Falls back to the node image height if\n     * the API data is faulty.\n     *\n     * @returns {number} The orientation adjusted image height.\n     */\n    public get height(): number {\n        return this._height;\n    }\n\n    /**\n     * Get orientation.\n     * @returns {number} The image orientation.\n     */\n    public get orientation(): number {\n        return this._orientation;\n    }\n\n    /**\n     * Get rt.\n     * @returns {THREE.Matrix4} The extrinsic camera matrix.\n     */\n    public get rt(): THREE.Matrix4 {\n        return this._rt;\n    }\n\n    /**\n     * Get srt.\n     * @returns {THREE.Matrix4} The scaled extrinsic camera matrix.\n     */\n    public get srt(): THREE.Matrix4 {\n        return this._srt;\n    }\n\n    /**\n     * Get scale.\n     * @returns {number} The node atomic reconstruction scale.\n     */\n    public get scale(): number {\n        return this._scale;\n    }\n\n    /**\n     * Get has valid scale.\n     * @returns {boolean} Value indicating if the scale of the transform is valid.\n     */\n    public get hasValidScale(): boolean {\n        return this._scale > 1e-2 && this._scale < 50;\n    }\n\n    /**\n     * Get width.\n     *\n     * @description Falls back to the node image width if\n     * the API data is faulty.\n     *\n     * @returns {number} The orientation adjusted image width.\n     */\n    public get width(): number {\n        return this._width;\n    }\n\n    /**\n     * Calculate the up vector for the node transform.\n     *\n     * @returns {THREE.Vector3} Normalized and orientation adjusted up vector.\n     */\n    public upVector(): THREE.Vector3 {\n        let rte: Float32Array = this._rt.elements;\n\n        switch (this._orientation) {\n            case 1:\n                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);\n            case 3:\n                return new THREE.Vector3(rte[1],  rte[5],  rte[9]);\n            case 6:\n                return new THREE.Vector3(-rte[0], -rte[4], -rte[8]);\n            case 8:\n                return new THREE.Vector3(rte[0],  rte[4],  rte[8]);\n            default:\n                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);\n        }\n    }\n\n    /**\n     * Calculate projector matrix for projecting 3D points to texture map\n     * coordinates (u and v).\n     *\n     * @returns {THREE.Matrix4} Projection matrix for 3D point to texture\n     * map coordinate calculations.\n     */\n    public projectorMatrix(): THREE.Matrix4 {\n        let projector: THREE.Matrix4 = this._normalizedToTextureMatrix();\n\n        let f: number = this._focal;\n        let projection: THREE.Matrix4 = new THREE.Matrix4().set(\n            f, 0, 0, 0,\n            0, f, 0, 0,\n            0, 0, 0, 0,\n            0, 0, 1, 0);\n\n        projector.multiply(projection);\n        projector.multiply(this._rt);\n\n        return projector;\n    }\n\n    /**\n     * Project 3D world coordinates to basic coordinates.\n     *\n     * @param {Array<number>} point3d - 3D world coordinates.\n     * @return {Array<number>} 2D basic coordinates.\n     */\n    public projectBasic(point3d: number[]): number[] {\n        let sfm: number[] = this.projectSfM(point3d);\n        return this._sfmToBasic(sfm);\n    }\n\n    /**\n     * Unproject basic coordinates to 3D world coordinates.\n     *\n     * @param {Array<number>} basic - 2D basic coordinates.\n     * @param {Array<number>} distance - Depth to unproject from camera center.\n     * @returns {Array<number>} Unprojected 3D world coordinates.\n     */\n    public unprojectBasic(basic: number[], distance: number): number[] {\n        let sfm: number[] = this._basicToSfm(basic);\n        return this.unprojectSfM(sfm, distance);\n    }\n\n    /**\n     * Project 3D world coordinates to SfM coordinates.\n     *\n     * @param {Array<number>} point3d - 3D world coordinates.\n     * @return {Array<number>} 2D SfM coordinates.\n     */\n    public projectSfM(point3d: number[]): number[] {\n        let v: THREE.Vector4 = new THREE.Vector4(point3d[0], point3d[1], point3d[2], 1);\n        v.applyMatrix4(this._rt);\n        return this._bearingToSfm([v.x, v.y, v.z]);\n    }\n\n    /**\n     * Unproject SfM coordinates to a 3D world coordinates.\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @param {Array<number>} distance - Depth to unproject from camera center.\n     * @returns {Array<number>} Unprojected 3D world coordinates.\n     */\n    public unprojectSfM(sfm: number[], distance: number): number[] {\n        let bearing: number[] = this._sfmToBearing(sfm);\n        let v: THREE.Vector4 = new THREE.Vector4(\n            distance * bearing[0],\n            distance * bearing[1],\n            distance * bearing[2],\n            1);\n        v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));\n        return [v.x / v.w, v.y / v.w, v.z / v.w];\n    }\n\n    /**\n     * Transform SfM coordinates to bearing vector (3D cartesian\n     * coordinates on the unit sphere).\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @returns {Array<number>} Bearing vector (3D cartesian coordinates\n     * on the unit sphere).\n     */\n    private _sfmToBearing(sfm: number[]): number[] {\n        if (this._fullPano()) {\n            let lon: number = sfm[0] * 2 * Math.PI;\n            let lat: number = -sfm[1] * 2 * Math.PI;\n            let x: number = Math.cos(lat) * Math.sin(lon);\n            let y: number = -Math.sin(lat);\n            let z: number = Math.cos(lat) * Math.cos(lon);\n            return [x, y, z];\n        } else if (this._gpano) {\n            let size: number = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);\n            let fullPanoPixel: number[] = [\n                sfm[0] * size + this.gpano.CroppedAreaImageWidthPixels / 2 + this.gpano.CroppedAreaLeftPixels,\n                sfm[1] * size + this.gpano.CroppedAreaImageHeightPixels / 2 + this.gpano.CroppedAreaTopPixels,\n            ];\n            let lon: number = 2 * Math.PI * (fullPanoPixel[0] / this.gpano.FullPanoWidthPixels - 0.5);\n            let lat: number = - Math.PI * (fullPanoPixel[1] / this.gpano.FullPanoHeightPixels - 0.5);\n            let x: number = Math.cos(lat) * Math.sin(lon);\n            let y: number = -Math.sin(lat);\n            let z: number = Math.cos(lat) * Math.cos(lon);\n            return [x, y, z];\n        } else {\n            let v: THREE.Vector3 = new THREE.Vector3(sfm[0], sfm[1], this._focal);\n            v.normalize();\n            return [v.x, v.y, v.z];\n        }\n    }\n\n    /**\n     * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to\n     * SfM coordinates.\n     *\n     * @param {Array<number>} bearing - Bearing vector (3D cartesian coordinates on the\n     * unit sphere).\n     * @returns {Array<number>} 2D SfM coordinates.\n     */\n    private _bearingToSfm(bearing: number[]): number[] {\n        if (this._fullPano()) {\n            let x: number = bearing[0];\n            let y: number = bearing[1];\n            let z: number = bearing[2];\n            let lon: number = Math.atan2(x, z);\n            let lat: number = Math.atan2(-y, Math.sqrt(x * x + z * z));\n            return [lon / (2 * Math.PI), -lat / (2 * Math.PI)];\n        } else if (this._gpano) {\n            let x: number = bearing[0];\n            let y: number = bearing[1];\n            let z: number = bearing[2];\n            let lon: number = Math.atan2(x, z);\n            let lat: number = Math.atan2(-y, Math.sqrt(x * x + z * z));\n            let fullPanoPixel: number[] = [\n                (lon / (2 * Math.PI) + 0.5) * this.gpano.FullPanoWidthPixels,\n                (- lat / Math.PI + 0.5) * this.gpano.FullPanoHeightPixels,\n            ];\n            let size: number = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);\n            return [\n                (fullPanoPixel[0] - this.gpano.CroppedAreaLeftPixels - this.gpano.CroppedAreaImageWidthPixels / 2) / size,\n                (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,\n            ];\n        } else {\n            if (bearing[2] > 0) {\n                return [\n                    bearing[0] * this._focal / bearing[2],\n                    bearing[1] * this._focal / bearing[2],\n                ];\n            } else {\n                return [\n                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,\n                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,\n                ];\n            }\n        }\n    }\n\n    /**\n     * Convert basic coordinates to SfM coordinates.\n     *\n     * @param {Array<number>} basic - 2D basic coordinates.\n     * @returns {Array<number>} 2D SfM coordinates.\n     */\n    private _basicToSfm(basic: number[]): number[] {\n        let rotatedX: number;\n        let rotatedY: number;\n\n        switch (this._orientation) {\n            case 1:\n                rotatedX = basic[0];\n                rotatedY = basic[1];\n                break;\n            case 3:\n                rotatedX = 1 - basic[0];\n                rotatedY = 1 - basic[1];\n                break;\n            case 6:\n                rotatedX = basic[1];\n                rotatedY = 1 - basic[0];\n                break;\n            case 8:\n                rotatedX = 1 - basic[1];\n                rotatedY = basic[0];\n                break;\n            default:\n                rotatedX = basic[0];\n                rotatedY = basic[1];\n                break;\n        }\n\n        let w: number = this._width;\n        let h: number = this._height;\n        let s: number = Math.max(w, h);\n        let sfmX: number = rotatedX * w / s - w / s / 2;\n        let sfmY: number = rotatedY * h / s - h / s / 2;\n\n        return [sfmX, sfmY];\n    }\n\n    /**\n     * Convert SfM coordinates to basic coordinates.\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    private _sfmToBasic(sfm: number[]): number[] {\n        let w: number = this._width;\n        let h: number = this._height;\n        let s: number = Math.max(w, h);\n        let rotatedX: number = (sfm[0] + w / s / 2) / w * s;\n        let rotatedY: number = (sfm[1] + h / s / 2) / h * s;\n\n        let basicX: number;\n        let basicY: number;\n\n        switch (this._orientation) {\n            case 1:\n                basicX = rotatedX;\n                basicY = rotatedY;\n                break;\n            case 3:\n                basicX = 1 - rotatedX;\n                basicY = 1 - rotatedY;\n                break;\n            case 6:\n                basicX = 1 - rotatedY;\n                basicY = rotatedX;\n                break;\n            case 8:\n                basicX = rotatedY;\n                basicY = 1 - rotatedX;\n                break;\n            default:\n                basicX = rotatedX;\n                basicY = rotatedY;\n                break;\n        }\n\n        return [basicX, basicY];\n    }\n\n    /**\n     * Determines if the gpano information indicates a full panorama.\n     *\n     * @returns {boolean} Value determining if the gpano information indicates\n     * a full panorama.\n     */\n    private _fullPano(): boolean {\n        return this.gpano != null &&\n            this.gpano.CroppedAreaLeftPixels === 0 &&\n            this.gpano.CroppedAreaTopPixels === 0 &&\n            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&\n            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;\n    }\n\n    /**\n     * Checks a value and returns it if it exists and is larger than 0.\n     * Fallbacks if it is null.\n     *\n     * @param {number} value - Value to check.\n     * @param {number} fallback - Value to fall back to.\n     * @returns {number} The value or its fallback value if it is not defined or negative.\n     */\n    private _getValue(value: number, fallback: number): number {\n        return value != null && value > 0 ? value : fallback;\n    }\n\n    /**\n     * Creates the extrinsic camera matrix [ R | t ].\n     *\n     * @param {Array<number>} rotation - Rotation vector in angle axis representation.\n     * @param {Array<number>} translation - Translation vector.\n     * @returns {THREE.Matrix4} Extrisic camera matrix.\n     */\n    private _getRt(rotation: number[], translation: number[]): THREE.Matrix4 {\n        let axis: THREE.Vector3 = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);\n        let angle: number = axis.length();\n        if (angle > 0) {\n            axis.normalize();\n        }\n\n        let rt: THREE.Matrix4 = new THREE.Matrix4();\n        rt.makeRotationAxis(axis, angle);\n        rt.setPosition(\n            new THREE.Vector3(\n                translation[0],\n                translation[1],\n                translation[2]));\n\n        return rt;\n    }\n\n    /**\n     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].\n     *\n     * @param {THREE.Matrix4} rt - Extrisic camera matrix.\n     * @param {number} scale - Scale factor.\n     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.\n     */\n    private _getSrt(rt: THREE.Matrix4, scale: number): THREE.Matrix4 {\n        let srt: THREE.Matrix4 = rt.clone();\n        let elements: Float32Array = srt.elements;\n\n        elements[12] = scale * elements[12];\n        elements[13] = scale * elements[13];\n        elements[14] = scale * elements[14];\n\n        srt.scale(new THREE.Vector3(scale, scale, scale));\n\n        return srt;\n    }\n\n    /**\n     * Calculate a transformation matrix from normalized coordinates for\n     * texture map coordinates.\n     *\n     * @returns {THREE.Matrix4} Normalized coordinates to texture map\n     * coordinates transformation matrix.\n     */\n    private _normalizedToTextureMatrix(): THREE.Matrix4 {\n        let size: number = Math.max(this._width, this._height);\n        let w: number = size / this._width;\n        let h: number = size / this._height;\n\n        switch (this._orientation) {\n            case 1:\n                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 3:\n                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 6:\n                return new THREE.Matrix4().set( 0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 8:\n                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            default:\n                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n        }\n    }\n}\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Transform} from \"../Geo\";\n\n/**\n * @class ViewportCoords\n *\n * @classdesc Provides methods for calculating 2D coordinate conversions\n * as well as 3D projection and unprojection.\n *\n * Basic coordinates are 2D coordinates on the [0, 1] interval and\n * have the origin point, (0, 0), at the top left corner and the\n * maximum value, (1, 1), at the bottom right corner of the original\n * photo.\n *\n * Viewport coordinates are 2D coordinates on the [-1, 1] interval and\n * have the origin point in the center. The bottom left corner point is\n * (-1, -1) and the top right corner point is (1, 1).\n *\n * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and\n * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left\n * corner and the maximum value is (canvasWidth, canvasHeight) is in the\n * bottom right corner.\n *\n * 3D coordinates are in the topocentric world reference frame.\n */\nexport class ViewportCoords {\n    private _unprojectDepth: number = 200;\n\n    /**\n     * Convert basic coordinates to canvas coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public basicToCanvas(\n        basicX: number,\n        basicY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const canvas: number[] = this.projectToCanvas(point3d, container, camera);\n\n        return canvas;\n    }\n\n    /**\n     * Convert basic coordinates to canvas coordinates safely. If 3D point is\n     * behind camera null will be returned.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point\n     * in front of the camera, otherwise null.\n     */\n    public basicToCanvasSafe(\n        basicX: number,\n        basicY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const pointCamera: number[] = this.worldToCamera(point3d, camera);\n\n        if (pointCamera[2] > 0) {\n            return null;\n        }\n\n        const [viewportX, viewportY]: number[] = this.cameraToViewport(pointCamera, camera);\n        const canvas: number[] = this.viewportToCanvas(viewportX, viewportY, container);\n\n        return canvas;\n    }\n\n    /**\n     * Convert basic coordinates to viewport coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public basicToViewport(\n        basicX: number,\n        basicY: number,\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const viewport: number[] = this.projectToViewport(point3d, camera);\n\n        return viewport;\n    }\n\n    /**\n     * Convert camera 3D coordinates to viewport coordinates.\n     *\n     * @param {number} pointCamera - 3D point in camera coordinate system.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public cameraToViewport(\n        pointCamera: number[],\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: THREE.Vector3 =\n            new THREE.Vector3().fromArray(pointCamera)\n                .applyMatrix4(camera.projectionMatrix);\n\n        return [viewport.x, viewport.y];\n    }\n\n    /**\n     * Get canvas pixel position from event.\n     *\n     * @param {Event} event - Event containing clientX and clientY properties.\n     * @param {HTMLElement} element - HTML element.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public canvasPosition(event: { clientX: number, clientY: number }, element: HTMLElement): number[] {\n        const clientRect: ClientRect = element.getBoundingClientRect();\n\n        const canvasX: number = event.clientX - clientRect.left - element.clientLeft;\n        const canvasY: number = event.clientY - clientRect.top - element.clientTop;\n\n        return [canvasX, canvasY];\n    }\n\n    /**\n     * Convert canvas coordinates to basic coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    public canvasToBasic(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] =\n            this.unprojectFromCanvas(canvasX, canvasY, container, camera)\n                .toArray();\n\n        const basic: number[] = transform.projectBasic(point3d);\n\n        return basic;\n    }\n\n    /**\n     * Convert canvas coordinates to viewport coordinates.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public canvasToViewport(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number }):\n        number[] {\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n        const viewportX: number = 2 * canvasX / canvasWidth - 1;\n        const viewportY: number = 1 - 2 * canvasY / canvasHeight;\n\n        return [viewportX, viewportY];\n    }\n\n    /**\n     * Determines the width and height of the container in canvas coordinates.\n     *\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public containerToCanvas(container: { offsetHeight: number, offsetWidth: number }): number[] {\n        return [container.offsetWidth, container.offsetHeight];\n    }\n\n    /**\n     * Determine basic distances from image to canvas corners.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * Determines the smallest basic distance for every side of the canvas.\n     *\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].\n     */\n    public getBasicDistances(\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const topLeftBasic: number[] = this.viewportToBasic(-1, 1, transform, camera);\n        const topRightBasic: number[] = this.viewportToBasic(1, 1, transform, camera);\n        const bottomRightBasic: number[] = this.viewportToBasic(1, -1, transform, camera);\n        const bottomLeftBasic: number[] = this.viewportToBasic(-1, -1, transform, camera);\n\n        let topBasicDistance: number = 0;\n        let rightBasicDistance: number = 0;\n        let bottomBasicDistance: number = 0;\n        let leftBasicDistance: number = 0;\n\n        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {\n            topBasicDistance = topLeftBasic[1] > topRightBasic[1] ?\n                -topLeftBasic[1] :\n                -topRightBasic[1];\n        }\n\n        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {\n            rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ?\n                topRightBasic[0] - 1 :\n                bottomRightBasic[0] - 1;\n        }\n\n        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {\n            bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ?\n                bottomRightBasic[1] - 1 :\n                bottomLeftBasic[1] - 1;\n        }\n\n        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {\n            leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ?\n                -bottomLeftBasic[0] :\n                -topLeftBasic[0];\n        }\n\n        return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance];\n    }\n\n    /**\n     * Determine pixel distances from image to canvas corners.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * Determines the smallest pixel distance for every side of the canvas.\n     *\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].\n     */\n    public getPixelDistances(\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const topLeftBasic: number[] = this.viewportToBasic(-1, 1, transform, camera);\n        const topRightBasic: number[] = this.viewportToBasic(1, 1, transform, camera);\n        const bottomRightBasic: number[] = this.viewportToBasic(1, -1, transform, camera);\n        const bottomLeftBasic: number[] = this.viewportToBasic(-1, -1, transform, camera);\n\n        let topPixelDistance: number = 0;\n        let rightPixelDistance: number = 0;\n        let bottomPixelDistance: number = 0;\n        let leftPixelDistance: number = 0;\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n\n        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {\n            const basicX: number = topLeftBasic[1] > topRightBasic[1] ?\n                topLeftBasic[0] :\n                topRightBasic[0];\n\n            const canvas: number[] = this.basicToCanvas(basicX, 0, container, transform, camera);\n\n            topPixelDistance = canvas[1] > 0 ? canvas[1] : 0;\n        }\n\n        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {\n            const basicY: number = topRightBasic[0] < bottomRightBasic[0] ?\n                topRightBasic[1] :\n                bottomRightBasic[1];\n\n            const canvas: number[] = this.basicToCanvas(1, basicY, container, transform, camera);\n\n            rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0;\n        }\n\n        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {\n            const basicX: number = bottomRightBasic[1] < bottomLeftBasic[1] ?\n                bottomRightBasic[0] :\n                bottomLeftBasic[0];\n\n            const canvas: number[] = this.basicToCanvas(basicX, 1, container, transform, camera);\n\n            bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0;\n        }\n\n        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {\n            const basicY: number = bottomLeftBasic[0] > topLeftBasic[0] ?\n                bottomLeftBasic[1] :\n                topLeftBasic[1];\n\n            const canvas: number[] = this.basicToCanvas(0, basicY, container, transform, camera);\n\n            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;\n        }\n\n        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];\n    }\n\n    /**\n     * Determine if an event occured inside an element.\n     *\n     * @param {Event} event - Event containing clientX and clientY properties.\n     * @param {HTMLElement} element - HTML element.\n     * @returns {boolean} Value indicating if the event occured inside the element or not.\n     */\n    public insideElement(event: { clientX: number, clientY: number }, element: HTMLElement): boolean {\n        const clientRect: ClientRect = element.getBoundingClientRect();\n\n        const minX: number = clientRect.left + element.clientLeft;\n        const maxX: number = minX + element.clientWidth;\n        const minY: number = clientRect.top + element.clientTop;\n        const maxY: number = minY + element.clientHeight;\n\n        return event.clientX > minX &&\n            event.clientX < maxX &&\n            event.clientY > minY &&\n            event.clientY < maxY;\n    }\n\n    /**\n     * Project 3D world coordinates to canvas coordinates.\n     *\n     * @param {Array<number>} point3D - 3D world coordinates.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public projectToCanvas(\n        point3d: number[],\n        container: { offsetHeight: number, offsetWidth: number },\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: number[] = this.projectToViewport(point3d, camera);\n        const canvas: number[] =\n            this.viewportToCanvas(viewport[0], viewport[1], container);\n\n        return canvas;\n    }\n\n    /**\n     * Project 3D world coordinates to viewport coordinates.\n     *\n     * @param {Array<number>} point3D - 3D world coordinates.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public projectToViewport(\n        point3d: number[],\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: THREE.Vector3 =\n            new THREE.Vector3(point3d[0], point3d[1], point3d[2])\n                .project(camera);\n\n        return [viewport.x, viewport.y];\n    }\n\n    /**\n     * Uproject canvas coordinates to 3D world coordinates.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D world coordinates.\n     */\n    public unprojectFromCanvas(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        camera: THREE.Camera):\n        THREE.Vector3 {\n\n        const viewport: number[] =\n            this.canvasToViewport(canvasX, canvasY, container);\n\n        const point3d: THREE.Vector3 =\n            this.unprojectFromViewport(viewport[0], viewport[1], camera);\n\n        return point3d;\n    }\n\n    /**\n     * Unproject viewport coordinates to 3D world coordinates.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D world coordinates.\n     */\n    public unprojectFromViewport(\n        viewportX: number,\n        viewportY: number,\n        camera: THREE.Camera):\n        THREE.Vector3 {\n\n        const point3d: THREE.Vector3 =\n            new THREE.Vector3(viewportX, viewportY, 1)\n                .unproject(camera);\n\n        return point3d;\n    }\n\n    /**\n     * Convert viewport coordinates to basic coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    public viewportToBasic(\n        viewportX: number,\n        viewportY: number,\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] =\n            new THREE.Vector3(viewportX, viewportY, 1)\n                .unproject(camera)\n                .toArray();\n\n        const basic: number[] = transform.projectBasic(point3d);\n\n        return basic;\n    }\n\n    /**\n     * Convert viewport coordinates to canvas coordinates.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public viewportToCanvas(\n        viewportX: number,\n        viewportY: number,\n        container: { offsetHeight: number, offsetWidth: number }):\n        number[] {\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n        const canvasX: number = canvasWidth * (viewportX + 1) / 2;\n        const canvasY: number = -canvasHeight * (viewportY - 1) / 2;\n\n        return [canvasX, canvasY];\n    }\n\n    /**\n     * Convert 3D world coordinates to 3D camera coordinates.\n     *\n     * @param {number} point3D - 3D point in world coordinate system.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D camera coordinates.\n     */\n    public worldToCamera(\n        point3d: number[],\n        camera: THREE.Camera): number[] {\n\n        const pointCamera: THREE.Vector3 =\n            new THREE.Vector3(point3d[0], point3d[1], point3d[2])\n                .applyMatrix4(camera.matrixWorldInverse);\n\n        return pointCamera.toArray();\n    }\n}\n\nexport default ViewportCoords;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {IGPano} from \"../API\";\nimport {Node} from \"../Graph\";\n\n/**\n * @class Transform\n *\n * @classdesc Class used for calculating coordinate transformations\n * and projections.\n */\nexport class Transform {\n    private _width: number;\n    private _height: number;\n    private _focal: number;\n    private _orientation: number;\n    private _scale: number;\n    private _basicWidth: number;\n    private _basicHeight: number;\n    private _basicAspect: number;\n\n    private _gpano: IGPano;\n\n    private _rt: THREE.Matrix4;\n    private _srt: THREE.Matrix4;\n\n    /**\n     * Create a new transform instance.\n     * @param {Node} apiNavImIm - Node properties.\n     * @param {HTMLImageElement} image - Node image.\n     * @param {Array<number>} translation - Node translation vector in three dimensions.\n     */\n    constructor(node: Node, image: HTMLImageElement, translation: number[]) {\n        this._orientation = this._getValue(node.orientation, 1);\n\n        let imageWidth: number = image != null ? image.width : 4;\n        let imageHeight: number = image != null ? image.height : 3;\n        let keepOrientation: boolean = this._orientation < 5;\n\n        this._width = this._getValue(node.width, keepOrientation ? imageWidth : imageHeight);\n        this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth);\n\n        this._basicAspect = keepOrientation ?\n             this._width / this._height :\n             this._height / this._width;\n\n        this._basicWidth = keepOrientation ? node.width : node.height;\n        this._basicHeight = keepOrientation ? node.height : node.width;\n\n        this._focal = this._getValue(node.focal, 1);\n        this._scale = this._getValue(node.scale, 0);\n\n        this._gpano = node.gpano != null ? node.gpano : null;\n\n        this._rt = this._getRt(node.rotation, translation);\n        this._srt = this._getSrt(this._rt, this._scale);\n    }\n\n    /**\n     * Get basic aspect.\n     * @returns {number} The orientation adjusted aspect ratio.\n     */\n    public get basicAspect(): number {\n        return this._basicAspect;\n    }\n\n    /**\n     * Get basic height.\n     *\n     * @description Does not fall back to node image height but\n     * uses original value from API so can be faulty.\n     *\n     * @returns {number} The height of the basic version image\n     * (adjusted for orientation).\n     */\n    public get basicHeight(): number {\n        return this._basicHeight;\n    }\n\n    /**\n     * Get basic width.\n     *\n     * @description Does not fall back to node image width but\n     * uses original value from API so can be faulty.\n     *\n     * @returns {number} The width of the basic version image\n     * (adjusted for orientation).\n     */\n    public get basicWidth(): number {\n        return this._basicWidth;\n    }\n\n    /**\n     * Get focal.\n     * @returns {number} The node focal length.\n     */\n    public get focal(): number {\n        return this._focal;\n    }\n\n    /**\n     * Get fullPano.\n     *\n     * @returns {boolean} Value indicating whether the node is a complete\n     * 360 panorama.\n     */\n    public get fullPano(): boolean {\n        return this._gpano != null &&\n            this._gpano.CroppedAreaLeftPixels === 0 &&\n            this._gpano.CroppedAreaTopPixels === 0 &&\n            this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&\n            this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;\n    }\n\n    /**\n     * Get gpano.\n     * @returns {number} The node gpano information.\n     */\n    public get gpano(): IGPano {\n        return this._gpano;\n    }\n\n    /**\n     * Get height.\n     *\n     * @description Falls back to the node image height if\n     * the API data is faulty.\n     *\n     * @returns {number} The orientation adjusted image height.\n     */\n    public get height(): number {\n        return this._height;\n    }\n\n    /**\n     * Get orientation.\n     * @returns {number} The image orientation.\n     */\n    public get orientation(): number {\n        return this._orientation;\n    }\n\n    /**\n     * Get rt.\n     * @returns {THREE.Matrix4} The extrinsic camera matrix.\n     */\n    public get rt(): THREE.Matrix4 {\n        return this._rt;\n    }\n\n    /**\n     * Get srt.\n     * @returns {THREE.Matrix4} The scaled extrinsic camera matrix.\n     */\n    public get srt(): THREE.Matrix4 {\n        return this._srt;\n    }\n\n    /**\n     * Get scale.\n     * @returns {number} The node atomic reconstruction scale.\n     */\n    public get scale(): number {\n        return this._scale;\n    }\n\n    /**\n     * Get has valid scale.\n     * @returns {boolean} Value indicating if the scale of the transform is valid.\n     */\n    public get hasValidScale(): boolean {\n        return this._scale > 1e-2 && this._scale < 50;\n    }\n\n    /**\n     * Get width.\n     *\n     * @description Falls back to the node image width if\n     * the API data is faulty.\n     *\n     * @returns {number} The orientation adjusted image width.\n     */\n    public get width(): number {\n        return this._width;\n    }\n\n    /**\n     * Calculate the up vector for the node transform.\n     *\n     * @returns {THREE.Vector3} Normalized and orientation adjusted up vector.\n     */\n    public upVector(): THREE.Vector3 {\n        let rte: Float32Array = this._rt.elements;\n\n        switch (this._orientation) {\n            case 1:\n                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);\n            case 3:\n                return new THREE.Vector3(rte[1],  rte[5],  rte[9]);\n            case 6:\n                return new THREE.Vector3(-rte[0], -rte[4], -rte[8]);\n            case 8:\n                return new THREE.Vector3(rte[0],  rte[4],  rte[8]);\n            default:\n                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);\n        }\n    }\n\n    /**\n     * Calculate projector matrix for projecting 3D points to texture map\n     * coordinates (u and v).\n     *\n     * @returns {THREE.Matrix4} Projection matrix for 3D point to texture\n     * map coordinate calculations.\n     */\n    public projectorMatrix(): THREE.Matrix4 {\n        let projector: THREE.Matrix4 = this._normalizedToTextureMatrix();\n\n        let f: number = this._focal;\n        let projection: THREE.Matrix4 = new THREE.Matrix4().set(\n            f, 0, 0, 0,\n            0, f, 0, 0,\n            0, 0, 0, 0,\n            0, 0, 1, 0);\n\n        projector.multiply(projection);\n        projector.multiply(this._rt);\n\n        return projector;\n    }\n\n    /**\n     * Project 3D world coordinates to basic coordinates.\n     *\n     * @param {Array<number>} point3d - 3D world coordinates.\n     * @return {Array<number>} 2D basic coordinates.\n     */\n    public projectBasic(point3d: number[]): number[] {\n        let sfm: number[] = this.projectSfM(point3d);\n        return this._sfmToBasic(sfm);\n    }\n\n    /**\n     * Unproject basic coordinates to 3D world coordinates.\n     *\n     * @param {Array<number>} basic - 2D basic coordinates.\n     * @param {Array<number>} distance - Depth to unproject from camera center.\n     * @returns {Array<number>} Unprojected 3D world coordinates.\n     */\n    public unprojectBasic(basic: number[], distance: number): number[] {\n        let sfm: number[] = this._basicToSfm(basic);\n        return this.unprojectSfM(sfm, distance);\n    }\n\n    /**\n     * Project 3D world coordinates to SfM coordinates.\n     *\n     * @param {Array<number>} point3d - 3D world coordinates.\n     * @return {Array<number>} 2D SfM coordinates.\n     */\n    public projectSfM(point3d: number[]): number[] {\n        let v: THREE.Vector4 = new THREE.Vector4(point3d[0], point3d[1], point3d[2], 1);\n        v.applyMatrix4(this._rt);\n        return this._bearingToSfm([v.x, v.y, v.z]);\n    }\n\n    /**\n     * Unproject SfM coordinates to a 3D world coordinates.\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @param {Array<number>} distance - Depth to unproject from camera center.\n     * @returns {Array<number>} Unprojected 3D world coordinates.\n     */\n    public unprojectSfM(sfm: number[], distance: number): number[] {\n        let bearing: number[] = this._sfmToBearing(sfm);\n        let v: THREE.Vector4 = new THREE.Vector4(\n            distance * bearing[0],\n            distance * bearing[1],\n            distance * bearing[2],\n            1);\n        v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));\n        return [v.x / v.w, v.y / v.w, v.z / v.w];\n    }\n\n    /**\n     * Transform SfM coordinates to bearing vector (3D cartesian\n     * coordinates on the unit sphere).\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @returns {Array<number>} Bearing vector (3D cartesian coordinates\n     * on the unit sphere).\n     */\n    private _sfmToBearing(sfm: number[]): number[] {\n        if (this._fullPano()) {\n            let lon: number = sfm[0] * 2 * Math.PI;\n            let lat: number = -sfm[1] * 2 * Math.PI;\n            let x: number = Math.cos(lat) * Math.sin(lon);\n            let y: number = -Math.sin(lat);\n            let z: number = Math.cos(lat) * Math.cos(lon);\n            return [x, y, z];\n        } else if (this._gpano) {\n            let size: number = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);\n            let fullPanoPixel: number[] = [\n                sfm[0] * size + this.gpano.CroppedAreaImageWidthPixels / 2 + this.gpano.CroppedAreaLeftPixels,\n                sfm[1] * size + this.gpano.CroppedAreaImageHeightPixels / 2 + this.gpano.CroppedAreaTopPixels,\n            ];\n            let lon: number = 2 * Math.PI * (fullPanoPixel[0] / this.gpano.FullPanoWidthPixels - 0.5);\n            let lat: number = - Math.PI * (fullPanoPixel[1] / this.gpano.FullPanoHeightPixels - 0.5);\n            let x: number = Math.cos(lat) * Math.sin(lon);\n            let y: number = -Math.sin(lat);\n            let z: number = Math.cos(lat) * Math.cos(lon);\n            return [x, y, z];\n        } else {\n            let v: THREE.Vector3 = new THREE.Vector3(sfm[0], sfm[1], this._focal);\n            v.normalize();\n            return [v.x, v.y, v.z];\n        }\n    }\n\n    /**\n     * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to\n     * SfM coordinates.\n     *\n     * @param {Array<number>} bearing - Bearing vector (3D cartesian coordinates on the\n     * unit sphere).\n     * @returns {Array<number>} 2D SfM coordinates.\n     */\n    private _bearingToSfm(bearing: number[]): number[] {\n        if (this._fullPano()) {\n            let x: number = bearing[0];\n            let y: number = bearing[1];\n            let z: number = bearing[2];\n            let lon: number = Math.atan2(x, z);\n            let lat: number = Math.atan2(-y, Math.sqrt(x * x + z * z));\n            return [lon / (2 * Math.PI), -lat / (2 * Math.PI)];\n        } else if (this._gpano) {\n            let x: number = bearing[0];\n            let y: number = bearing[1];\n            let z: number = bearing[2];\n            let lon: number = Math.atan2(x, z);\n            let lat: number = Math.atan2(-y, Math.sqrt(x * x + z * z));\n            let fullPanoPixel: number[] = [\n                (lon / (2 * Math.PI) + 0.5) * this.gpano.FullPanoWidthPixels,\n                (- lat / Math.PI + 0.5) * this.gpano.FullPanoHeightPixels,\n            ];\n            let size: number = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);\n            return [\n                (fullPanoPixel[0] - this.gpano.CroppedAreaLeftPixels - this.gpano.CroppedAreaImageWidthPixels / 2) / size,\n                (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,\n            ];\n        } else {\n            if (bearing[2] > 0) {\n                return [\n                    bearing[0] * this._focal / bearing[2],\n                    bearing[1] * this._focal / bearing[2],\n                ];\n            } else {\n                return [\n                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,\n                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,\n                ];\n            }\n        }\n    }\n\n    /**\n     * Convert basic coordinates to SfM coordinates.\n     *\n     * @param {Array<number>} basic - 2D basic coordinates.\n     * @returns {Array<number>} 2D SfM coordinates.\n     */\n    private _basicToSfm(basic: number[]): number[] {\n        let rotatedX: number;\n        let rotatedY: number;\n\n        switch (this._orientation) {\n            case 1:\n                rotatedX = basic[0];\n                rotatedY = basic[1];\n                break;\n            case 3:\n                rotatedX = 1 - basic[0];\n                rotatedY = 1 - basic[1];\n                break;\n            case 6:\n                rotatedX = basic[1];\n                rotatedY = 1 - basic[0];\n                break;\n            case 8:\n                rotatedX = 1 - basic[1];\n                rotatedY = basic[0];\n                break;\n            default:\n                rotatedX = basic[0];\n                rotatedY = basic[1];\n                break;\n        }\n\n        let w: number = this._width;\n        let h: number = this._height;\n        let s: number = Math.max(w, h);\n        let sfmX: number = rotatedX * w / s - w / s / 2;\n        let sfmY: number = rotatedY * h / s - h / s / 2;\n\n        return [sfmX, sfmY];\n    }\n\n    /**\n     * Convert SfM coordinates to basic coordinates.\n     *\n     * @param {Array<number>} sfm - 2D SfM coordinates.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    private _sfmToBasic(sfm: number[]): number[] {\n        let w: number = this._width;\n        let h: number = this._height;\n        let s: number = Math.max(w, h);\n        let rotatedX: number = (sfm[0] + w / s / 2) / w * s;\n        let rotatedY: number = (sfm[1] + h / s / 2) / h * s;\n\n        let basicX: number;\n        let basicY: number;\n\n        switch (this._orientation) {\n            case 1:\n                basicX = rotatedX;\n                basicY = rotatedY;\n                break;\n            case 3:\n                basicX = 1 - rotatedX;\n                basicY = 1 - rotatedY;\n                break;\n            case 6:\n                basicX = 1 - rotatedY;\n                basicY = rotatedX;\n                break;\n            case 8:\n                basicX = rotatedY;\n                basicY = 1 - rotatedX;\n                break;\n            default:\n                basicX = rotatedX;\n                basicY = rotatedY;\n                break;\n        }\n\n        return [basicX, basicY];\n    }\n\n    /**\n     * Determines if the gpano information indicates a full panorama.\n     *\n     * @returns {boolean} Value determining if the gpano information indicates\n     * a full panorama.\n     */\n    private _fullPano(): boolean {\n        return this.gpano != null &&\n            this.gpano.CroppedAreaLeftPixels === 0 &&\n            this.gpano.CroppedAreaTopPixels === 0 &&\n            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&\n            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;\n    }\n\n    /**\n     * Checks a value and returns it if it exists and is larger than 0.\n     * Fallbacks if it is null.\n     *\n     * @param {number} value - Value to check.\n     * @param {number} fallback - Value to fall back to.\n     * @returns {number} The value or its fallback value if it is not defined or negative.\n     */\n    private _getValue(value: number, fallback: number): number {\n        return value != null && value > 0 ? value : fallback;\n    }\n\n    /**\n     * Creates the extrinsic camera matrix [ R | t ].\n     *\n     * @param {Array<number>} rotation - Rotation vector in angle axis representation.\n     * @param {Array<number>} translation - Translation vector.\n     * @returns {THREE.Matrix4} Extrisic camera matrix.\n     */\n    private _getRt(rotation: number[], translation: number[]): THREE.Matrix4 {\n        let axis: THREE.Vector3 = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);\n        let angle: number = axis.length();\n        if (angle > 0) {\n            axis.normalize();\n        }\n\n        let rt: THREE.Matrix4 = new THREE.Matrix4();\n        rt.makeRotationAxis(axis, angle);\n        rt.setPosition(\n            new THREE.Vector3(\n                translation[0],\n                translation[1],\n                translation[2]));\n\n        return rt;\n    }\n\n    /**\n     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].\n     *\n     * @param {THREE.Matrix4} rt - Extrisic camera matrix.\n     * @param {number} scale - Scale factor.\n     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.\n     */\n    private _getSrt(rt: THREE.Matrix4, scale: number): THREE.Matrix4 {\n        let srt: THREE.Matrix4 = rt.clone();\n        let elements: Float32Array = srt.elements;\n\n        elements[12] = scale * elements[12];\n        elements[13] = scale * elements[13];\n        elements[14] = scale * elements[14];\n\n        srt.scale(new THREE.Vector3(scale, scale, scale));\n\n        return srt;\n    }\n\n    /**\n     * Calculate a transformation matrix from normalized coordinates for\n     * texture map coordinates.\n     *\n     * @returns {THREE.Matrix4} Normalized coordinates to texture map\n     * coordinates transformation matrix.\n     */\n    private _normalizedToTextureMatrix(): THREE.Matrix4 {\n        let size: number = Math.max(this._width, this._height);\n        let w: number = size / this._width;\n        let h: number = size / this._height;\n\n        switch (this._orientation) {\n            case 1:\n                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 3:\n                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 6:\n                return new THREE.Matrix4().set(0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            case 8:\n                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n            default:\n                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);\n        }\n    }\n}\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Transform} from \"../Geo\";\n\n/**\n * @class ViewportCoords\n *\n * @classdesc Provides methods for calculating 2D coordinate conversions\n * as well as 3D projection and unprojection.\n *\n * Basic coordinates are 2D coordinates on the [0, 1] interval and\n * have the origin point, (0, 0), at the top left corner and the\n * maximum value, (1, 1), at the bottom right corner of the original\n * image.\n *\n * Viewport coordinates are 2D coordinates on the [-1, 1] interval and\n * have the origin point in the center. The bottom left corner point is\n * (-1, -1) and the top right corner point is (1, 1).\n *\n * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and\n * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left\n * corner and the maximum value is (canvasWidth, canvasHeight) is in the\n * bottom right corner.\n *\n * 3D coordinates are in the topocentric world reference frame.\n */\nexport class ViewportCoords {\n    private _unprojectDepth: number = 200;\n\n    /**\n     * Convert basic coordinates to canvas coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public basicToCanvas(\n        basicX: number,\n        basicY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const canvas: number[] = this.projectToCanvas(point3d, container, camera);\n\n        return canvas;\n    }\n\n    /**\n     * Convert basic coordinates to canvas coordinates safely. If 3D point is\n     * behind camera null will be returned.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point\n     * in front of the camera, otherwise null.\n     */\n    public basicToCanvasSafe(\n        basicX: number,\n        basicY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const pointCamera: number[] = this.worldToCamera(point3d, camera);\n\n        if (pointCamera[2] > 0) {\n            return null;\n        }\n\n        const [viewportX, viewportY]: number[] = this.cameraToViewport(pointCamera, camera);\n        const canvas: number[] = this.viewportToCanvas(viewportX, viewportY, container);\n\n        return canvas;\n    }\n\n    /**\n     * Convert basic coordinates to viewport coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} basicX - Basic X coordinate.\n     * @param {number} basicY - Basic Y coordinate.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public basicToViewport(\n        basicX: number,\n        basicY: number,\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);\n        const viewport: number[] = this.projectToViewport(point3d, camera);\n\n        return viewport;\n    }\n\n    /**\n     * Convert camera 3D coordinates to viewport coordinates.\n     *\n     * @param {number} pointCamera - 3D point in camera coordinate system.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public cameraToViewport(\n        pointCamera: number[],\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: THREE.Vector3 =\n            new THREE.Vector3().fromArray(pointCamera)\n                .applyMatrix4(camera.projectionMatrix);\n\n        return [viewport.x, viewport.y];\n    }\n\n    /**\n     * Get canvas pixel position from event.\n     *\n     * @param {Event} event - Event containing clientX and clientY properties.\n     * @param {HTMLElement} element - HTML element.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public canvasPosition(event: { clientX: number, clientY: number }, element: HTMLElement): number[] {\n        const clientRect: ClientRect = element.getBoundingClientRect();\n\n        const canvasX: number = event.clientX - clientRect.left - element.clientLeft;\n        const canvasY: number = event.clientY - clientRect.top - element.clientTop;\n\n        return [canvasX, canvasY];\n    }\n\n    /**\n     * Convert canvas coordinates to basic coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    public canvasToBasic(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] =\n            this.unprojectFromCanvas(canvasX, canvasY, container, camera)\n                .toArray();\n\n        const basic: number[] = transform.projectBasic(point3d);\n\n        return basic;\n    }\n\n    /**\n     * Convert canvas coordinates to viewport coordinates.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public canvasToViewport(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number }):\n        number[] {\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n        const viewportX: number = 2 * canvasX / canvasWidth - 1;\n        const viewportY: number = 1 - 2 * canvasY / canvasHeight;\n\n        return [viewportX, viewportY];\n    }\n\n    /**\n     * Determines the width and height of the container in canvas coordinates.\n     *\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public containerToCanvas(container: { offsetHeight: number, offsetWidth: number }): number[] {\n        return [container.offsetWidth, container.offsetHeight];\n    }\n\n    /**\n     * Determine basic distances from image to canvas corners.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * Determines the smallest basic distance for every side of the canvas.\n     *\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].\n     */\n    public getBasicDistances(\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const topLeftBasic: number[] = this.viewportToBasic(-1, 1, transform, camera);\n        const topRightBasic: number[] = this.viewportToBasic(1, 1, transform, camera);\n        const bottomRightBasic: number[] = this.viewportToBasic(1, -1, transform, camera);\n        const bottomLeftBasic: number[] = this.viewportToBasic(-1, -1, transform, camera);\n\n        let topBasicDistance: number = 0;\n        let rightBasicDistance: number = 0;\n        let bottomBasicDistance: number = 0;\n        let leftBasicDistance: number = 0;\n\n        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {\n            topBasicDistance = topLeftBasic[1] > topRightBasic[1] ?\n                -topLeftBasic[1] :\n                -topRightBasic[1];\n        }\n\n        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {\n            rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ?\n                topRightBasic[0] - 1 :\n                bottomRightBasic[0] - 1;\n        }\n\n        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {\n            bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ?\n                bottomRightBasic[1] - 1 :\n                bottomLeftBasic[1] - 1;\n        }\n\n        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {\n            leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ?\n                -bottomLeftBasic[0] :\n                -topLeftBasic[0];\n        }\n\n        return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance];\n    }\n\n    /**\n     * Determine pixel distances from image to canvas corners.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * Determines the smallest pixel distance for every side of the canvas.\n     *\n     * @param {HTMLElement} container - The viewer container.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].\n     */\n    public getPixelDistances(\n        container: { offsetHeight: number, offsetWidth: number },\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const topLeftBasic: number[] = this.viewportToBasic(-1, 1, transform, camera);\n        const topRightBasic: number[] = this.viewportToBasic(1, 1, transform, camera);\n        const bottomRightBasic: number[] = this.viewportToBasic(1, -1, transform, camera);\n        const bottomLeftBasic: number[] = this.viewportToBasic(-1, -1, transform, camera);\n\n        let topPixelDistance: number = 0;\n        let rightPixelDistance: number = 0;\n        let bottomPixelDistance: number = 0;\n        let leftPixelDistance: number = 0;\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n\n        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {\n            const basicX: number = topLeftBasic[1] > topRightBasic[1] ?\n                topLeftBasic[0] :\n                topRightBasic[0];\n\n            const canvas: number[] = this.basicToCanvas(basicX, 0, container, transform, camera);\n\n            topPixelDistance = canvas[1] > 0 ? canvas[1] : 0;\n        }\n\n        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {\n            const basicY: number = topRightBasic[0] < bottomRightBasic[0] ?\n                topRightBasic[1] :\n                bottomRightBasic[1];\n\n            const canvas: number[] = this.basicToCanvas(1, basicY, container, transform, camera);\n\n            rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0;\n        }\n\n        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {\n            const basicX: number = bottomRightBasic[1] < bottomLeftBasic[1] ?\n                bottomRightBasic[0] :\n                bottomLeftBasic[0];\n\n            const canvas: number[] = this.basicToCanvas(basicX, 1, container, transform, camera);\n\n            bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0;\n        }\n\n        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {\n            const basicY: number = bottomLeftBasic[0] > topLeftBasic[0] ?\n                bottomLeftBasic[1] :\n                topLeftBasic[1];\n\n            const canvas: number[] = this.basicToCanvas(0, basicY, container, transform, camera);\n\n            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;\n        }\n\n        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];\n    }\n\n    /**\n     * Determine if an event occured inside an element.\n     *\n     * @param {Event} event - Event containing clientX and clientY properties.\n     * @param {HTMLElement} element - HTML element.\n     * @returns {boolean} Value indicating if the event occured inside the element or not.\n     */\n    public insideElement(event: { clientX: number, clientY: number }, element: HTMLElement): boolean {\n        const clientRect: ClientRect = element.getBoundingClientRect();\n\n        const minX: number = clientRect.left + element.clientLeft;\n        const maxX: number = minX + element.clientWidth;\n        const minY: number = clientRect.top + element.clientTop;\n        const maxY: number = minY + element.clientHeight;\n\n        return event.clientX > minX &&\n            event.clientX < maxX &&\n            event.clientY > minY &&\n            event.clientY < maxY;\n    }\n\n    /**\n     * Project 3D world coordinates to canvas coordinates.\n     *\n     * @param {Array<number>} point3D - 3D world coordinates.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public projectToCanvas(\n        point3d: number[],\n        container: { offsetHeight: number, offsetWidth: number },\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: number[] = this.projectToViewport(point3d, camera);\n        const canvas: number[] =\n            this.viewportToCanvas(viewport[0], viewport[1], container);\n\n        return canvas;\n    }\n\n    /**\n     * Project 3D world coordinates to viewport coordinates.\n     *\n     * @param {Array<number>} point3D - 3D world coordinates.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D viewport coordinates.\n     */\n    public projectToViewport(\n        point3d: number[],\n        camera: THREE.Camera):\n        number[] {\n\n        const viewport: THREE.Vector3 =\n            new THREE.Vector3(point3d[0], point3d[1], point3d[2])\n                .project(camera);\n\n        return [viewport.x, viewport.y];\n    }\n\n    /**\n     * Uproject canvas coordinates to 3D world coordinates.\n     *\n     * @param {number} canvasX - Canvas X coordinate.\n     * @param {number} canvasY - Canvas Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D world coordinates.\n     */\n    public unprojectFromCanvas(\n        canvasX: number,\n        canvasY: number,\n        container: { offsetHeight: number, offsetWidth: number },\n        camera: THREE.Camera):\n        THREE.Vector3 {\n\n        const viewport: number[] =\n            this.canvasToViewport(canvasX, canvasY, container);\n\n        const point3d: THREE.Vector3 =\n            this.unprojectFromViewport(viewport[0], viewport[1], camera);\n\n        return point3d;\n    }\n\n    /**\n     * Unproject viewport coordinates to 3D world coordinates.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D world coordinates.\n     */\n    public unprojectFromViewport(\n        viewportX: number,\n        viewportY: number,\n        camera: THREE.Camera):\n        THREE.Vector3 {\n\n        const point3d: THREE.Vector3 =\n            new THREE.Vector3(viewportX, viewportY, 1)\n                .unproject(camera);\n\n        return point3d;\n    }\n\n    /**\n     * Convert viewport coordinates to basic coordinates.\n     *\n     * @description Transform origin and camera position needs to be the\n     * equal for reliable return value.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {Transform} transform - Transform of the node to unproject from.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 2D basic coordinates.\n     */\n    public viewportToBasic(\n        viewportX: number,\n        viewportY: number,\n        transform: Transform,\n        camera: THREE.Camera):\n        number[] {\n\n        const point3d: number[] =\n            new THREE.Vector3(viewportX, viewportY, 1)\n                .unproject(camera)\n                .toArray();\n\n        const basic: number[] = transform.projectBasic(point3d);\n\n        return basic;\n    }\n\n    /**\n     * Convert viewport coordinates to canvas coordinates.\n     *\n     * @param {number} viewportX - Viewport X coordinate.\n     * @param {number} viewportY - Viewport Y coordinate.\n     * @param {HTMLElement} container - The viewer container.\n     * @returns {Array<number>} 2D canvas coordinates.\n     */\n    public viewportToCanvas(\n        viewportX: number,\n        viewportY: number,\n        container: { offsetHeight: number, offsetWidth: number }):\n        number[] {\n\n        const [canvasWidth, canvasHeight]: number[] = this.containerToCanvas(container);\n        const canvasX: number = canvasWidth * (viewportX + 1) / 2;\n        const canvasY: number = -canvasHeight * (viewportY - 1) / 2;\n\n        return [canvasX, canvasY];\n    }\n\n    /**\n     * Convert 3D world coordinates to 3D camera coordinates.\n     *\n     * @param {number} point3D - 3D point in world coordinate system.\n     * @param {THREE.Camera} camera - Camera used in rendering.\n     * @returns {Array<number>} 3D camera coordinates.\n     */\n    public worldToCamera(\n        point3d: number[],\n        camera: THREE.Camera): number[] {\n\n        const pointCamera: THREE.Vector3 =\n            new THREE.Vector3(point3d[0], point3d[1], point3d[2])\n                .applyMatrix4(camera.matrixWorldInverse);\n\n        return pointCamera.toArray();\n    }\n}\n\nexport default ViewportCoords;\n",
     "import {\n    FilterExpression,\n    FilterOperation,\n    FilterOperator,\n    FilterValue,\n    Node,\n} from \"../Graph\";\nimport {Func} from \"../Utils\";\n\nexport type FilterFunction = Func<Node, boolean>;\n\n/**\n * @class Filter\n *\n * @classdesc Represents a class for creating node filters. Implementation and\n * definitions based on https://github.com/mapbox/feature-filter.\n */\nexport class FilterCreator {\n    /**\n     * Create a filter from a filter expression.\n     *\n     * @description The following filters are supported:\n     *\n     * Comparison\n     * `==`\n     * `!=`\n     * `<`\n     * `<=`\n     * `>`\n     * `>=`\n     *\n     * Set membership\n     * `in`\n     * `!in`\n     *\n     * Combining\n     * `all`\n     *\n     * @param {FilterExpression} filter - Comparison, set membership or combinding filter\n     * expression.\n     * @returns {FilterFunction} Function taking a node and returning a boolean that\n     * indicates whether the node passed the test or not.\n     */\n    public createFilter(filter: FilterExpression): FilterFunction {\n        return <FilterFunction>new Function(\"node\", \"return \" + this._compile(filter) + \";\");\n    }\n\n    private _compile(filter: FilterExpression): string {\n        if (filter == null || filter.length <= 1) {\n            return \"true\";\n        }\n\n        const operator: FilterOperator = <FilterOperator>filter[0];\n        const operation: string =\n            operator === \"==\" ? this._compileComparisonOp(\"===\", <string>filter[1], filter[2], false) :\n            operator === \"!=\" ? this._compileComparisonOp(\"!==\", <string>filter[1], filter[2], false) :\n            operator === \">\" ||\n            operator === \">=\" ||\n            operator === \"<\" ||\n            operator === \"<=\" ? this._compileComparisonOp(operator, <string>filter[1], filter[2], true) :\n            operator === \"in\" ?\n                this._compileInOp<FilterValue>(<string>filter[1], <FilterValue[]>filter.slice(2)) :\n            operator === \"!in\" ?\n                this._compileNegation(\n                    this._compileInOp<FilterValue>(<string>filter[1], <FilterValue[]>filter.slice(2))) :\n            operator === \"all\" ? this._compileLogicalOp(<FilterOperation[]>filter.slice(1), \"&&\") :\n            \"true\";\n\n        return \"(\" + operation + \")\";\n    }\n\n    private _compare<T>(a: T, b: T): number {\n        return a < b ? -1 : a > b ? 1 : 0;\n    }\n\n    private _compileComparisonOp<T>(operator: string, property: string, value: T, checkType: boolean): string {\n        const left: string = this._compilePropertyReference(property);\n        const right: string = JSON.stringify(value);\n\n        return (checkType ? \"typeof \" + left + \"===typeof \" + right + \"&&\" : \"\") + left + operator + right;\n    }\n\n    private _compileInOp<T>(property: string, values: T[]): string {\n        const compare: (a: T, b: T) => number = this._compare;\n        const left: string = JSON.stringify(values.sort(compare));\n        const right: string = this._compilePropertyReference(property);\n\n        return left + \".indexOf(\" + right + \")!==-1\";\n    }\n\n    private _compileLogicalOp(filters: FilterOperation[], operator: string): string {\n        const compile: (filter: FilterExpression) => string = this._compile.bind(this);\n\n        return filters.map<string>(compile).join(operator);\n    }\n\n    private _compileNegation(expression: string): string {\n        return \"!(\" + expression + \")\";\n    }\n\n    private _compilePropertyReference(property: string): string {\n        return \"node[\" + JSON.stringify(property) + \"]\";\n    }\n}\n\nexport default FilterCreator;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as rbush from \"rbush\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/from\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publish\";\n\nimport {\n    APIv3,\n    ICoreNode,\n    IFillNode,\n    IFullNode,\n    ILatLon,\n    ISequence,\n} from \"../API\";\nimport {\n    IEdge,\n    IPotentialEdge,\n    EdgeCalculator,\n} from \"../Edge\";\nimport {GraphMapillaryError} from \"../Error\";\nimport {\n    FilterCreator,\n    FilterExpression,\n    FilterFunction,\n    IGraphConfiguration,\n    Node,\n    NodeCache,\n    Sequence,\n    GraphCalculator,\n} from \"../Graph\";\n\ntype NodeIndexItem = {\n    lat: number;\n    lon: number;\n    node: Node;\n};\n\ntype NodeTiles = {\n    cache: string[];\n    caching: string[];\n};\n\ntype SpatialArea = {\n    all: { [key: string]: Node };\n    cacheKeys: string[];\n    cacheNodes: { [key: string]: Node };\n};\n\ntype NodeAccess = {\n    node: Node;\n    accessed: number;\n};\n\ntype TileAccess = {\n    nodes: Node[];\n    accessed: number;\n};\n\ntype SequenceAccess = {\n    sequence: Sequence;\n    accessed: number;\n};\n\n/**\n * @class Graph\n *\n * @classdesc Represents a graph of nodes with edges.\n */\nexport class Graph {\n    private _apiV3: APIv3;\n\n    /**\n     * Nodes that have initialized cache with a timestamp of last access.\n     */\n    private _cachedNodes: { [key: string]: NodeAccess };\n\n    /**\n     * Nodes for which the required tiles are cached.\n     */\n    private _cachedNodeTiles: { [key: string]: boolean };\n\n    /**\n     * Nodes for which the spatial edges are cached.\n     */\n    private _cachedSpatialEdges: { [key: string]: Node };\n\n    /**\n     * Cached tiles with a timestamp of last access.\n     */\n    private _cachedTiles: { [h: string]: TileAccess };\n\n    /**\n     * Nodes for which fill properties are being retreived.\n     */\n    private _cachingFill$: { [key: string]: Observable<Graph> };\n\n    /**\n     * Nodes for which full properties are being retrieved.\n     */\n    private _cachingFull$: { [key: string]: Observable<Graph> };\n\n    /**\n     * Sequences that are being retrieved.\n     */\n    private _cachingSequences$: { [sequenceKey: string]: Observable<Graph> };\n\n    /**\n     * Nodes for which the spatial area fill properties are being retrieved.\n     */\n    private _cachingSpatialArea$: { [key: string]: Observable<Graph>[] };\n\n    /**\n     * Tiles that are being retrieved.\n     */\n    private _cachingTiles$: { [h: string]: Observable<Graph> };\n\n    private _changed$: Subject<Graph>;\n\n    private _defaultAlt: number;\n    private _edgeCalculator: EdgeCalculator;\n    private _filter: FilterFunction;\n    private _filterCreator: FilterCreator;\n    private _graphCalculator: GraphCalculator;\n    private _configuration: IGraphConfiguration;\n\n    /**\n     * All nodes in the graph.\n     */\n    private _nodes: { [key: string]: Node };\n\n    /**\n     * Contains all nodes in the graph. Used for fast spatial lookups.\n     */\n    private _nodeIndex: rbush.RBush<NodeIndexItem>;\n\n    /**\n     * All node index items sorted in tiles for easy uncache.\n     */\n    private _nodeIndexTiles: { [h: string]: NodeIndexItem[] };\n\n    /**\n     * Node to tile dictionary for easy tile access updates.\n     */\n    private _nodeToTile: { [key: string]: string };\n\n    /**\n     * Nodes retrieved before tiles, stored on tile level.\n     */\n    private _preStored: { [h: string]:  { [key: string]: Node }; };\n\n    /**\n     * Tiles required for a node to retrive spatial area.\n     */\n    private _requiredNodeTiles: { [key: string]: NodeTiles };\n\n    /**\n     * Other nodes required for node to calculate spatial edges.\n     */\n    private _requiredSpatialArea: { [key: string]: SpatialArea };\n\n    /**\n     * All sequences in graph with a timestamp of last access.\n     */\n    private _sequences: { [skey: string]: SequenceAccess };\n\n    private _tilePrecision: number;\n    private _tileThreshold: number;\n\n    /**\n     * Create a new graph instance.\n     *\n     * @param {APIv3} [apiV3] - API instance for retrieving data.\n     * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.\n     * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.\n     * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.\n     * @param {FilterCreator} [filterCreator] - Instance for  filter creation.\n     * @param {IGraphConfiguration} [configuration] - Configuration struct.\n     */\n    constructor(\n        apiV3: APIv3,\n        nodeIndex?: rbush.RBush<NodeIndexItem>,\n        graphCalculator?: GraphCalculator,\n        edgeCalculator?: EdgeCalculator,\n        filterCreator?: FilterCreator,\n        configuration?: IGraphConfiguration) {\n\n        this._apiV3 = apiV3;\n\n        this._cachedNodes = {};\n        this._cachedNodeTiles = {};\n        this._cachedSpatialEdges = {};\n        this._cachedTiles = {};\n\n        this._cachingFill$ = {};\n        this._cachingFull$ = {};\n        this._cachingSequences$ = {};\n        this._cachingSpatialArea$ = {};\n        this._cachingTiles$ = {};\n\n        this._changed$ = new Subject<Graph>();\n\n        this._defaultAlt = 2;\n        this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new EdgeCalculator();\n        this._filterCreator = filterCreator != null ? filterCreator : new FilterCreator();\n        this._filter = this._filterCreator.createFilter(undefined);\n        this._graphCalculator = graphCalculator != null ? graphCalculator : new GraphCalculator();\n        this._configuration = configuration != null ?\n            configuration :\n            {\n                maxSequences: 50,\n                maxUnusedNodes: 100,\n                maxUnusedTiles: 20,\n            };\n\n        this._nodes = {};\n        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush<NodeIndexItem>(16, [\".lat\", \".lon\", \".lat\", \".lon\"]);\n        this._nodeIndexTiles = {};\n        this._nodeToTile = {};\n\n        this._preStored = {};\n\n        this._requiredNodeTiles = {};\n        this._requiredSpatialArea = {};\n\n        this._sequences = {};\n\n        this._tilePrecision = 7;\n        this._tileThreshold = 20;\n    }\n\n    /**\n     * Get changed$.\n     *\n     * @returns {Observable<Graph>} Observable emitting\n     * the graph every time it has changed.\n     */\n    public get changed$(): Observable<Graph> {\n        return this._changed$;\n    }\n\n    /**\n     * Retrieve and cache node fill properties.\n     *\n     * @param {string} key - Key of node to fill.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the node has been updated.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheFill$(key: string): Observable<Graph> {\n        if (key in this._cachingFull$) {\n            throw new GraphMapillaryError(`Cannot fill node while caching full (${key}).`);\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot fill node that does not exist in graph (${key}).`);\n        }\n\n        if (key in this._cachingFill$) {\n            return this._cachingFill$[key];\n        }\n\n        let node: Node = this.getNode(key);\n        if (node.full) {\n            throw new GraphMapillaryError(`Cannot fill node that is already full (${key}).`);\n        }\n\n        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key])\n            .do(\n                (imageByKeyFill: { [key: string]: IFillNode }): void => {\n                    if (!node.full) {\n                        this._makeFull(node, imageByKeyFill[key]);\n                    }\n\n                    delete this._cachingFill$[key];\n                })\n            .map(\n                (imageByKeyFill: { [key: string]: IFillNode }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (key in this._cachingFill$) {\n                        delete this._cachingFill$[key];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingFill$[key];\n    }\n\n    /**\n     * Retrieve and cache full node properties.\n     *\n     * @param {string} key - Key of node to fill.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the node has been updated.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheFull$(key: string): Observable<Graph> {\n        if (key in this._cachingFull$) {\n            return this._cachingFull$[key];\n        }\n\n        if (this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache full node that already exist in graph (${key}).`);\n        }\n\n        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key])\n            .do(\n                (imageByKeyFull: { [key: string]: IFullNode }): void => {\n                    let fn: IFullNode = imageByKeyFull[key];\n\n                    if (this.hasNode(key)) {\n                        let node: Node = this.getNode(key);\n\n                        if (!node.full) {\n                            this._makeFull(node, fn);\n                        }\n                    } else {\n                        if (fn.sequence == null || fn.sequence.key == null) {\n                            throw new GraphMapillaryError(`Node has no sequence (${key}).`);\n                        }\n\n                        let node: Node = new Node(fn);\n                        this._makeFull(node, fn);\n\n                        let h: string = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);\n                        this._preStore(h, node);\n                        this._setNode(node);\n\n                        delete this._cachingFull$[key];\n                    }\n                })\n            .map(\n                (imageByKeyFull: { [key: string]: IFullNode }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (key in this._cachingFull$) {\n                        delete this._cachingFull$[key];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingFull$[key];\n    }\n\n    /**\n     * Retrieve and cache a node sequence.\n     *\n     * @param {string} key - Key of node for which to retrieve sequence.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the sequence has been retrieved.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheNodeSequence$(key: string): Observable<Graph> {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache sequence edges of node that does not exist in graph (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        if (node.sequenceKey in this._sequences) {\n            throw new GraphMapillaryError(`Sequence already cached (${key}), (${node.sequenceKey}).`);\n        }\n\n        return this._cacheSequence$(node.sequenceKey);\n    }\n\n    /**\n     * Retrieve and cache a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence to cache.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the sequence has been retrieved.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSequence$(sequenceKey: string): Observable<Graph> {\n        if (sequenceKey in this._sequences) {\n            throw new GraphMapillaryError(`Sequence already cached (${sequenceKey})`);\n        }\n\n        return this._cacheSequence$(sequenceKey);\n    }\n\n    /**\n     * Cache sequence edges for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSequenceEdges(key: string): void {\n        let node: Node = this.getNode(key);\n\n        if (!(node.sequenceKey in this._sequences)) {\n            throw new GraphMapillaryError(`Sequence is not cached (${key}), (${node.sequenceKey})`);\n        }\n\n        let sequence: Sequence = this._sequences[node.sequenceKey].sequence;\n        let edges: IEdge[] = this._edgeCalculator.computeSequenceEdges(node, sequence);\n\n        node.cacheSequenceEdges(edges);\n    }\n\n    /**\n     * Retrieve and cache full nodes for a node spatial area.\n     *\n     * @param {string} key - Key of node for which to retrieve sequence.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the nodes in the spatial area has been made full.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSpatialArea$(key: string): Observable<Graph>[] {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache spatial area of node that does not exist in graph (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            throw new GraphMapillaryError(`Node already spatially cached (${key}).`);\n        }\n\n        if (!(key in this._requiredSpatialArea)) {\n            throw new GraphMapillaryError(`Spatial area not determined (${key}).`);\n        }\n\n        let spatialArea: SpatialArea = this._requiredSpatialArea[key];\n        if (Object.keys(spatialArea.cacheNodes).length === 0) {\n            throw new GraphMapillaryError(`Spatial nodes already cached (${key}).`);\n        }\n\n        if (key in this._cachingSpatialArea$) {\n            return this._cachingSpatialArea$[key];\n        }\n\n        let batches: string[][] = [];\n        while (spatialArea.cacheKeys.length > 0) {\n            batches.push(spatialArea.cacheKeys.splice(0, 200));\n        }\n\n        let batchesToCache: number = batches.length;\n        let spatialNodes$: Observable<Graph>[] = [];\n\n        for (let batch of batches) {\n            let spatialNodeBatch$: Observable<Graph> = this._apiV3.imageByKeyFill$(batch)\n                .do(\n                    (imageByKeyFill: { [key: string]: IFillNode }): void => {\n                        for (let fillKey in imageByKeyFill) {\n                            if (!imageByKeyFill.hasOwnProperty(fillKey)) {\n                                continue;\n                            }\n\n                            let spatialNode: Node = spatialArea.cacheNodes[fillKey];\n                            if (spatialNode.full) {\n                                delete spatialArea.cacheNodes[fillKey];\n                                continue;\n                            }\n\n                            let fillNode: IFillNode = imageByKeyFill[fillKey];\n                            this._makeFull(spatialNode, fillNode);\n\n                            delete spatialArea.cacheNodes[fillKey];\n                        }\n\n                        if (--batchesToCache === 0) {\n                            delete this._cachingSpatialArea$[key];\n                        }\n                    })\n                .map(\n                    (imageByKeyFill: { [key: string]: IFillNode }): Graph => {\n                        return this;\n                    })\n                .catch(\n                    (error: Error): Observable<Graph> => {\n                        for (let batchKey of batch) {\n                            if (batchKey in spatialArea.all) {\n                                delete spatialArea.all[batchKey];\n                            }\n\n                            if (batchKey in spatialArea.cacheNodes) {\n                                delete spatialArea.cacheNodes[batchKey];\n                            }\n                        }\n\n                        if (--batchesToCache === 0) {\n                            delete this._cachingSpatialArea$[key];\n                        }\n\n                        throw error;\n                    })\n                .finally(\n                    (): void => {\n                        if (Object.keys(spatialArea.cacheNodes).length === 0) {\n                            this._changed$.next(this);\n                        }\n                    })\n                .publish()\n                .refCount();\n\n            spatialNodes$.push(spatialNodeBatch$);\n        }\n\n        this._cachingSpatialArea$[key] = spatialNodes$;\n\n        return spatialNodes$;\n    }\n\n    /**\n     * Cache spatial edges for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSpatialEdges(key: string): void {\n        if (key in this._cachedSpatialEdges) {\n             throw new GraphMapillaryError(`Spatial edges already cached (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        let sequence: Sequence = this._sequences[node.sequenceKey].sequence;\n\n        let fallbackKeys: string[] = [];\n        let prevKey: string = sequence.findPrevKey(node.key);\n        if (prevKey != null) {\n            fallbackKeys.push(prevKey);\n        }\n\n        let nextKey: string = sequence.findNextKey(node.key);\n        if (nextKey != null) {\n            fallbackKeys.push(nextKey);\n        }\n\n        let allSpatialNodes: { [key: string]: Node } = this._requiredSpatialArea[key].all;\n        let potentialNodes: Node[] = [];\n        let filter: FilterFunction = this._filter;\n        for (let spatialNodeKey in allSpatialNodes) {\n            if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) {\n                continue;\n            }\n\n            let spatialNode: Node = allSpatialNodes[spatialNodeKey];\n\n            if (filter(spatialNode)) {\n                potentialNodes.push(spatialNode);\n            }\n        }\n\n        let potentialEdges: IPotentialEdge[] =\n            this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys);\n\n        let edges: IEdge[] =\n            this._edgeCalculator.computeStepEdges(\n                node,\n                potentialEdges,\n                prevKey,\n                nextKey);\n\n        edges = edges.concat(this._edgeCalculator.computeTurnEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computePanoEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computePerspectiveToPanoEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computeSimilarEdges(node, potentialEdges));\n\n        node.cacheSpatialEdges(edges);\n\n        this._cachedSpatialEdges[key] = node;\n        delete this._requiredSpatialArea[key];\n        delete this._cachedNodeTiles[key];\n    }\n\n    /**\n     * Retrieve and cache geohash tiles for a node.\n     *\n     * @param {string} key - Key of node for which to retrieve tiles.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the tiles required for the node has been cached.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheTiles$(key: string): Observable<Graph>[] {\n        if (key in this._cachedNodeTiles) {\n            throw new GraphMapillaryError(`Tiles already cached (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            throw new GraphMapillaryError(`Spatial edges already cached so tiles considered cached (${key}).`);\n        }\n\n        if (!(key in this._requiredNodeTiles)) {\n            throw new GraphMapillaryError(`Tiles have not been determined (${key}).`);\n        }\n\n        let nodeTiles: NodeTiles = this._requiredNodeTiles[key];\n        if (nodeTiles.cache.length === 0 &&\n            nodeTiles.caching.length === 0) {\n            throw new GraphMapillaryError(`Tiles already cached (${key}).`);\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache tiles of node that does not exist in graph (${key}).`);\n        }\n\n        let hs: string[] = nodeTiles.cache.slice();\n        nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs);\n        nodeTiles.cache = [];\n\n        let cacheTiles$: Observable<Graph>[] = [];\n\n        for (let h of nodeTiles.caching) {\n            let cacheTile$: Observable<Graph> = null;\n            if (h in this._cachingTiles$) {\n                cacheTile$ = this._cachingTiles$[h];\n            } else {\n                cacheTile$ = this._apiV3.imagesByH$([h])\n                    .do(\n                        (imagesByH: { [key: string]: { [index: string]: ICoreNode } }): void => {\n                            let coreNodes: { [index: string]: ICoreNode } = imagesByH[h];\n\n                            if (h in this._cachedTiles) {\n                                return;\n                            }\n\n                            this._nodeIndexTiles[h] = [];\n                            this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };\n                            let hCache: Node[] = this._cachedTiles[h].nodes;\n                            let preStored: { [key: string]: Node } = this._removeFromPreStore(h);\n\n                            for (let index in coreNodes) {\n                                if (!coreNodes.hasOwnProperty(index)) {\n                                    continue;\n                                }\n\n                                let coreNode: ICoreNode = coreNodes[index];\n\n                                if (coreNode == null) {\n                                    break;\n                                }\n\n                                if (coreNode.sequence == null ||\n                                    coreNode.sequence.key == null) {\n                                    console.warn(`Sequence missing, discarding (${coreNode.key})`);\n\n                                    continue;\n                                }\n\n                                if (preStored != null && coreNode.key in preStored) {\n                                    let node: Node = preStored[coreNode.key];\n                                    delete preStored[coreNode.key];\n\n                                    hCache.push(node);\n\n                                    let nodeIndexItem: NodeIndexItem = {\n                                        lat: node.latLon.lat,\n                                        lon: node.latLon.lon,\n                                        node: node,\n                                    };\n\n                                    this._nodeIndex.insert(nodeIndexItem);\n                                    this._nodeIndexTiles[h].push(nodeIndexItem);\n                                    this._nodeToTile[node.key] = h;\n\n                                    continue;\n                                }\n\n                                let node: Node = new Node(coreNode);\n\n                                hCache.push(node);\n\n                                let nodeIndexItem: NodeIndexItem = {\n                                    lat: node.latLon.lat,\n                                    lon: node.latLon.lon,\n                                    node: node,\n                                };\n\n                                this._nodeIndex.insert(nodeIndexItem);\n                                this._nodeIndexTiles[h].push(nodeIndexItem);\n                                this._nodeToTile[node.key] = h;\n\n                                this._setNode(node);\n                            }\n\n                            delete this._cachingTiles$[h];\n                        })\n                    .map(\n                        (imagesByH: { [key: string]: { [index: string]: ICoreNode } }): Graph => {\n                            return this;\n                        })\n                    .catch(\n                        (error: Error): Observable<Graph> => {\n                            delete this._cachingTiles$[h];\n\n                            throw error;\n                        })\n                    .publish()\n                    .refCount();\n\n                this._cachingTiles$[h] = cacheTile$;\n            }\n\n            cacheTiles$.push(\n                cacheTile$\n                    .do(\n                        (graph: Graph): void => {\n                            let index: number = nodeTiles.caching.indexOf(h);\n                            if (index > -1) {\n                                nodeTiles.caching.splice(index, 1);\n                            }\n\n                            if (nodeTiles.caching.length === 0 &&\n                                nodeTiles.cache.length === 0) {\n                                delete this._requiredNodeTiles[key];\n\n                                this._cachedNodeTiles[key] = true;\n                            }\n                        })\n                    .catch(\n                        (error: Error): Observable<Graph> => {\n                            let index: number = nodeTiles.caching.indexOf(h);\n                            if (index > -1) {\n                                nodeTiles.caching.splice(index, 1);\n                            }\n\n                            if (nodeTiles.caching.length === 0 &&\n                                nodeTiles.cache.length === 0) {\n                                delete this._requiredNodeTiles[key];\n\n                                this._cachedNodeTiles[key] = true;\n                            }\n\n                            throw error;\n                        })\n                    .finally(\n                        (): void => {\n                            this._changed$.next(this);\n                        })\n                    .publish()\n                    .refCount());\n        }\n\n        return cacheTiles$;\n    }\n\n    /**\n     * Initialize the cache for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public initializeCache(key: string): void {\n        if (key in this._cachedNodes) {\n            throw new GraphMapillaryError(`Node already in cache (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        node.initializeCache(new NodeCache());\n\n        let accessed: number = new Date().getTime();\n        this._cachedNodes[key] = { accessed: accessed, node: node };\n\n        this._updateCachedTileAccess(key, accessed);\n    }\n\n    /**\n     * Get a value indicating if the graph is fill caching a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the node is being fill cached.\n     */\n    public isCachingFill(key: string): boolean {\n        return key in this._cachingFill$;\n    }\n\n    /**\n     * Get a value indicating if the graph is fully caching a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the node is being fully cached.\n     */\n    public isCachingFull(key: string): boolean {\n        return key in this._cachingFull$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching a sequence of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the sequence of a node is\n     * being cached.\n     */\n    public isCachingNodeSequence(key: string): boolean {\n        let node: Node = this.getNode(key);\n\n        return node.sequenceKey in this._cachingSequences$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if the sequence is\n     * being cached.\n     */\n    public isCachingSequence(sequenceKey: string): boolean {\n        return sequenceKey in this._cachingSequences$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching the tiles\n     * required for calculating spatial edges of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the tiles of\n     * a node are being cached.\n     */\n    public isCachingTiles(key: string): boolean {\n        return key in this._requiredNodeTiles &&\n            this._requiredNodeTiles[key].cache.length === 0 &&\n            this._requiredNodeTiles[key].caching.length > 0;\n    }\n\n    /**\n     * Get a value indicating if the cache has been initialized\n     * for a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the cache has been\n     * initialized for a node.\n     */\n    public hasInitializedCache(key: string): boolean {\n        return key in this._cachedNodes;\n    }\n\n    /**\n     * Get a value indicating if a node exist in the graph.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if a node exist in the graph.\n     */\n    public hasNode(key: string): boolean {\n        let accessed: number = new Date().getTime();\n\n        this._updateCachedNodeAccess(key, accessed);\n        this._updateCachedTileAccess(key, accessed);\n\n        return key in this._nodes;\n    }\n\n    /**\n     * Get a value indicating if a node sequence exist in the graph.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if a node sequence exist\n     * in the graph.\n     */\n    public hasNodeSequence(key: string): boolean {\n        let node: Node = this.getNode(key);\n        let sequenceKey: string = node.sequenceKey;\n\n        let hasNodeSequence: boolean = sequenceKey in this._sequences;\n\n        if (hasNodeSequence) {\n            this._sequences[sequenceKey].accessed = new Date().getTime();\n        }\n\n        return hasNodeSequence;\n    }\n\n    /**\n     * Get a value indicating if a sequence exist in the graph.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if a sequence exist\n     * in the graph.\n     */\n    public hasSequence(sequenceKey: string): boolean {\n        let hasSequence: boolean = sequenceKey in this._sequences;\n\n        if (hasSequence) {\n            this._sequences[sequenceKey].accessed = new Date().getTime();\n        }\n\n        return hasSequence;\n    }\n\n    /**\n     * Get a value indicating if the graph has fully cached\n     * all nodes in the spatial area of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the spatial area\n     * of a node has been cached.\n     */\n    public hasSpatialArea(key: string): boolean {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Spatial area nodes cannot be determined if node not in graph (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            return true;\n        }\n\n        if (key in this._requiredSpatialArea) {\n            return Object.keys(this._requiredSpatialArea[key].cacheNodes).length === 0;\n        }\n\n        let node: Node = this.getNode(key);\n        let bbox: [ILatLon, ILatLon] = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold);\n\n        let spatialItems: NodeIndexItem[] = this._nodeIndex.search({\n            maxX: bbox[1].lat,\n            maxY: bbox[1].lon,\n            minX: bbox[0].lat,\n            minY: bbox[0].lon,\n        });\n\n        let spatialNodes: SpatialArea = {\n            all: {},\n            cacheKeys: [],\n            cacheNodes: {},\n        };\n\n        for (let spatialItem of spatialItems) {\n            spatialNodes.all[spatialItem.node.key] = spatialItem.node;\n\n            if (!spatialItem.node.full) {\n                spatialNodes.cacheKeys.push(spatialItem.node.key);\n                spatialNodes.cacheNodes[spatialItem.node.key] = spatialItem.node;\n            }\n        }\n\n        this._requiredSpatialArea[key] = spatialNodes;\n\n        return spatialNodes.cacheKeys.length === 0;\n    }\n\n    /**\n     * Get a value indicating if the graph has a tiles required\n     * for a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the the tiles required\n     * by a node has been cached.\n     */\n    public hasTiles(key: string): boolean {\n        if (key in this._cachedNodeTiles) {\n            return true;\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            return true;\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Node does not exist in graph (${key}).`);\n        }\n\n        let nodeTiles: NodeTiles = { cache: [], caching: [] };\n\n        if (!(key in this._requiredNodeTiles)) {\n            let node: Node = this.getNode(key);\n            nodeTiles.cache = this._graphCalculator\n                .encodeHs(\n                    node.latLon,\n                    this._tilePrecision,\n                    this._tileThreshold)\n                .filter(\n                    (h: string): boolean => {\n                        return !(h in this._cachedTiles);\n                    });\n\n            if (nodeTiles.cache.length > 0) {\n                this._requiredNodeTiles[key] = nodeTiles;\n            }\n        } else {\n            nodeTiles = this._requiredNodeTiles[key];\n        }\n\n        return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0;\n    }\n\n    /**\n     * Get a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {Node} Retrieved node.\n     */\n    public getNode(key: string): Node {\n        let accessed: number = new Date().getTime();\n\n        this._updateCachedNodeAccess(key, accessed);\n        this._updateCachedTileAccess(key, accessed);\n\n        return this._nodes[key];\n    }\n\n    /**\n     * Get a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {Node} Retrieved sequence.\n     */\n    public getSequence(sequenceKey: string): Sequence {\n        let sequenceAccess: SequenceAccess = this._sequences[sequenceKey];\n        sequenceAccess.accessed = new Date().getTime();\n\n        return sequenceAccess.sequence;\n    }\n\n    /**\n     * Reset all spatial edges of the graph nodes.\n     */\n    public resetSpatialEdges(): void {\n        let cachedKeys: string[] = Object.keys(this._cachedSpatialEdges);\n\n        for (let cachedKey of cachedKeys) {\n            let node: Node = this._cachedSpatialEdges[cachedKey];\n            node.resetSpatialEdges();\n\n            delete this._cachedSpatialEdges[cachedKey];\n        }\n    }\n\n    /**\n     * Reset the complete graph but keep the nodes corresponding\n     * to the supplied keys. All other nodes will be disposed.\n     *\n     * @param {Array<string>} keepKeys - Keys for nodes to keep\n     * in graph after reset.\n     */\n    public reset(keepKeys: string[]): void {\n        const nodes: Node[] = [];\n        for (const key of keepKeys) {\n            if (!this.hasNode(key)) {\n                throw new Error(`Node does not exist ${key}`);\n            }\n\n            const node: Node = this.getNode(key);\n            node.resetSequenceEdges();\n            node.resetSpatialEdges();\n            nodes.push(node);\n        }\n\n        for (let cachedKey of Object.keys(this._cachedNodes)) {\n            if (keepKeys.indexOf(cachedKey) !== -1) {\n                continue;\n            }\n\n            this._cachedNodes[cachedKey].node.dispose();\n            delete this._cachedNodes[cachedKey];\n        }\n\n        this._cachedNodeTiles = {};\n        this._cachedSpatialEdges = {};\n        this._cachedTiles = {};\n\n        this._cachingFill$ = {};\n        this._cachingFull$ = {};\n        this._cachingSequences$ = {};\n        this._cachingSpatialArea$ = {};\n        this._cachingTiles$ = {};\n\n        this._nodes = {};\n        this._nodeToTile = {};\n\n        this._preStored = {};\n\n        for (const node of nodes) {\n            this._nodes[node.key] = node;\n\n            const h: string = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);\n            this._preStore(h, node);\n        }\n\n        this._requiredNodeTiles = {};\n        this._requiredSpatialArea = {};\n\n        this._sequences = {};\n\n        this._nodeIndexTiles = {};\n        this._nodeIndex.clear();\n    }\n\n    /**\n     * Set the spatial node filter.\n     *\n     * @param {FilterExpression} filter - Filter expression to be applied\n     * when calculating spatial edges.\n     */\n    public setFilter(filter: FilterExpression): void {\n        this._filter = this._filterCreator.createFilter(filter);\n    }\n\n    /**\n     * Uncache the graph according to the graph configuration.\n     *\n     * @description Uncaches unused tiles, unused nodes and\n     * sequences according to the numbers specified in the\n     * graph configuration. Sequences does not have a direct\n     * reference to either tiles or nodes and may be uncached\n     * even if they are related to the nodes that should be kept.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in\n     * graph unrelated to last access. Tiles related to those keys\n     * will also be kept in graph.\n     */\n    public uncache(keepKeys: string[]): void {\n        let keysInUse: { [key: string]: boolean } = {};\n\n        this._addNewKeys(keysInUse, this._cachingFull$);\n        this._addNewKeys(keysInUse, this._cachingFill$);\n        this._addNewKeys(keysInUse, this._cachingTiles$);\n        this._addNewKeys(keysInUse, this._cachingSpatialArea$);\n        this._addNewKeys(keysInUse, this._requiredNodeTiles);\n        this._addNewKeys(keysInUse, this._requiredSpatialArea);\n\n        for (let key of keepKeys) {\n            if (key in keysInUse) {\n                continue;\n            }\n\n            keysInUse[key] = true;\n        }\n\n        let keepHs: { [h: string]: boolean } = {};\n        for (let key in keysInUse) {\n            if (!keysInUse.hasOwnProperty(key)) {\n                continue;\n            }\n\n            let node: Node = this._nodes[key];\n\n            let nodeHs: string[] = this._graphCalculator.encodeHs(node.latLon);\n            for (let nodeH of nodeHs) {\n                if (!(nodeH in keepHs)) {\n                    keepHs[nodeH] = true;\n                }\n            }\n        }\n\n        let potentialHs: [string, TileAccess][] = [];\n        for (let h in this._cachedTiles) {\n            if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) {\n                continue;\n            }\n\n            potentialHs.push([h, this._cachedTiles[h]]);\n        }\n\n        let uncacheHs: string[] = potentialHs\n            .sort(\n                (h1: [string, TileAccess], h2: [string, TileAccess]): number => {\n                    return h2[1].accessed - h1[1].accessed;\n                })\n            .slice(this._configuration.maxUnusedTiles)\n            .map(\n                (h: [string, TileAccess]): string => {\n                    return h[0];\n                });\n\n        for (let uncacheH of uncacheHs) {\n            this._uncacheTile(uncacheH);\n        }\n\n        let potentialNodes: NodeAccess[] = [];\n        for (let key in this._cachedNodes) {\n            if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {\n                continue;\n            }\n\n            potentialNodes.push(this._cachedNodes[key]);\n        }\n\n        let uncacheNodes: NodeAccess[] = potentialNodes\n            .sort(\n                (n1: NodeAccess, n2: NodeAccess): number => {\n                    return n2.accessed - n1.accessed;\n                })\n            .slice(this._configuration.maxUnusedNodes);\n\n        for (let nodeAccess of uncacheNodes) {\n            nodeAccess.node.uncache();\n            let key: string = nodeAccess.node.key;\n            delete this._cachedNodes[key];\n\n            if (key in this._cachedNodeTiles) {\n                delete this._cachedNodeTiles[key];\n            }\n\n            if (key in this._cachedSpatialEdges) {\n                delete this._cachedSpatialEdges[key];\n            }\n        }\n\n        let potentialSequences: SequenceAccess[] = [];\n        for (let sequenceKey in this._sequences) {\n            if (!this._sequences.hasOwnProperty(sequenceKey) ||\n                sequenceKey in this._cachingSequences$) {\n                continue;\n            }\n\n            potentialSequences.push(this._sequences[sequenceKey]);\n        }\n\n        let uncacheSequences: SequenceAccess[] = potentialSequences\n            .sort(\n                (s1: SequenceAccess, s2: SequenceAccess): number => {\n                    return s2.accessed - s1.accessed;\n                })\n            .slice(this._configuration.maxSequences);\n\n        for (let sequenceAccess of uncacheSequences) {\n            let sequenceKey: string = sequenceAccess.sequence.key;\n\n            delete this._sequences[sequenceKey];\n\n            sequenceAccess.sequence.dispose();\n        }\n    }\n\n    private _addNewKeys<T>(keys: { [key: string]: boolean }, dict: { [key: string]: T }): void {\n        for (let key in dict) {\n            if (!dict.hasOwnProperty(key) || !this.hasNode(key)) {\n                continue;\n            }\n\n            if (!(key in keys)) {\n                keys[key] = true;\n            }\n        }\n    }\n\n    private _cacheSequence$(sequenceKey: string): Observable<Graph> {\n        if (sequenceKey in this._cachingSequences$) {\n            return this._cachingSequences$[sequenceKey];\n        }\n\n        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey])\n            .do(\n                (sequenceByKey: { [sequenceKey: string]: ISequence }): void => {\n                    if (!(sequenceKey in this._sequences)) {\n                        this._sequences[sequenceKey] = {\n                            accessed: new Date().getTime(),\n                            sequence: new Sequence(sequenceByKey[sequenceKey]),\n                        };\n                    }\n\n                    delete this._cachingSequences$[sequenceKey];\n                })\n            .map(\n                (sequenceByKey: { [sequenceKey: string]: ISequence }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (sequenceKey in this._cachingSequences$) {\n                        delete this._cachingSequences$[sequenceKey];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingSequences$[sequenceKey];\n    }\n\n    private _makeFull(node: Node, fillNode: IFillNode): void {\n        if (fillNode.calt == null) {\n            fillNode.calt = this._defaultAlt;\n        }\n\n        if (fillNode.c_rotation == null) {\n            fillNode.c_rotation = this._graphCalculator.rotationFromCompass(fillNode.ca, fillNode.orientation);\n        }\n\n        node.makeFull(fillNode);\n    }\n\n    private _preStore(h: string, node: Node): void {\n        if (!(h in this._preStored)) {\n            this._preStored[h] = {};\n        }\n\n        this._preStored[h][node.key] = node;\n    }\n\n    private _removeFromPreStore(h: string): { [key: string]: Node } {\n        let preStored: { [key: string]: Node } = null;\n\n        if (h in this._preStored) {\n            preStored = this._preStored[h];\n            delete this._preStored[h];\n        }\n\n        return preStored;\n    }\n\n    private _setNode(node: Node): void {\n        let key: string = node.key;\n\n        if (this.hasNode(key)) {\n            throw new GraphMapillaryError(`Node already exist (${key}).`);\n        }\n\n        this._nodes[key] = node;\n    }\n\n    private _uncacheTile(h: string): void {\n        for (let node of this._cachedTiles[h].nodes) {\n            let key: string = node.key;\n\n            delete this._nodes[key];\n            delete this._nodeToTile[key];\n\n            if (key in this._cachedNodes) {\n                delete this._cachedNodes[key];\n            }\n\n            if (key in this._cachedNodeTiles) {\n                delete this._cachedNodeTiles[key];\n            }\n\n            if (key in this._cachedSpatialEdges) {\n                delete this._cachedSpatialEdges[key];\n            }\n\n            node.dispose();\n        }\n\n        for (let nodeIndexItem of this._nodeIndexTiles[h]) {\n            this._nodeIndex.remove(nodeIndexItem);\n        }\n\n        delete this._nodeIndexTiles[h];\n        delete this._cachedTiles[h];\n    }\n\n    private _updateCachedTileAccess(key: string, accessed: number): void {\n        if (key in this._nodeToTile) {\n            this._cachedTiles[this._nodeToTile[key]].accessed = accessed;\n        }\n    }\n\n    private _updateCachedNodeAccess(key: string, accessed: number): void {\n        if (key in this._cachedNodes) {\n            this._cachedNodes[key].accessed = accessed;\n        }\n    }\n}\n\nexport default Graph;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as rbush from \"rbush\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/from\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publish\";\n\nimport {\n    APIv3,\n    ICoreNode,\n    IFillNode,\n    IFullNode,\n    ILatLon,\n    ISequence,\n} from \"../API\";\nimport {\n    IEdge,\n    IPotentialEdge,\n    EdgeCalculator,\n} from \"../Edge\";\nimport {GraphMapillaryError} from \"../Error\";\nimport {\n    FilterCreator,\n    FilterExpression,\n    FilterFunction,\n    IGraphConfiguration,\n    Node,\n    NodeCache,\n    Sequence,\n    GraphCalculator,\n} from \"../Graph\";\n\ntype NodeIndexItem = {\n    lat: number;\n    lon: number;\n    node: Node;\n};\n\ntype NodeTiles = {\n    cache: string[];\n    caching: string[];\n};\n\ntype SpatialArea = {\n    all: { [key: string]: Node };\n    cacheKeys: string[];\n    cacheNodes: { [key: string]: Node };\n};\n\ntype NodeAccess = {\n    node: Node;\n    accessed: number;\n};\n\ntype TileAccess = {\n    nodes: Node[];\n    accessed: number;\n};\n\ntype SequenceAccess = {\n    sequence: Sequence;\n    accessed: number;\n};\n\n/**\n * @class Graph\n *\n * @classdesc Represents a graph of nodes with edges.\n */\nexport class Graph {\n    private _apiV3: APIv3;\n\n    /**\n     * Nodes that have initialized cache with a timestamp of last access.\n     */\n    private _cachedNodes: { [key: string]: NodeAccess };\n\n    /**\n     * Nodes for which the required tiles are cached.\n     */\n    private _cachedNodeTiles: { [key: string]: boolean };\n\n    /**\n     * Sequences for which the nodes are cached.\n     */\n    private _cachedSequenceNodes: { [sequenceKey: string]: boolean };\n\n    /**\n     * Nodes for which the spatial edges are cached.\n     */\n    private _cachedSpatialEdges: { [key: string]: Node };\n\n    /**\n     * Cached tiles with a timestamp of last access.\n     */\n    private _cachedTiles: { [h: string]: TileAccess };\n\n    /**\n     * Nodes for which fill properties are being retreived.\n     */\n    private _cachingFill$: { [key: string]: Observable<Graph> };\n\n    /**\n     * Nodes for which full properties are being retrieved.\n     */\n    private _cachingFull$: { [key: string]: Observable<Graph> };\n\n    /**\n     * Sequences for which the nodes are being retrieved.\n     */\n    private _cachingSequenceNodes$: { [sequenceKey: string]: Observable<Graph> };\n\n    /**\n     * Sequences that are being retrieved.\n     */\n    private _cachingSequences$: { [sequenceKey: string]: Observable<Graph> };\n\n    /**\n     * Nodes for which the spatial area fill properties are being retrieved.\n     */\n    private _cachingSpatialArea$: { [key: string]: Observable<Graph>[] };\n\n    /**\n     * Tiles that are being retrieved.\n     */\n    private _cachingTiles$: { [h: string]: Observable<Graph> };\n\n    private _changed$: Subject<Graph>;\n\n    private _defaultAlt: number;\n    private _edgeCalculator: EdgeCalculator;\n    private _filter: FilterFunction;\n    private _filterCreator: FilterCreator;\n    private _graphCalculator: GraphCalculator;\n    private _configuration: IGraphConfiguration;\n\n    /**\n     * All nodes in the graph.\n     */\n    private _nodes: { [key: string]: Node };\n\n    /**\n     * Contains all nodes in the graph. Used for fast spatial lookups.\n     */\n    private _nodeIndex: rbush.RBush<NodeIndexItem>;\n\n    /**\n     * All node index items sorted in tiles for easy uncache.\n     */\n    private _nodeIndexTiles: { [h: string]: NodeIndexItem[] };\n\n    /**\n     * Node to tile dictionary for easy tile access updates.\n     */\n    private _nodeToTile: { [key: string]: string };\n\n    /**\n     * Nodes retrieved before tiles, stored on tile level.\n     */\n    private _preStored: { [h: string]: { [key: string]: Node } };\n\n    /**\n     * Tiles required for a node to retrive spatial area.\n     */\n    private _requiredNodeTiles: { [key: string]: NodeTiles };\n\n    /**\n     * Other nodes required for node to calculate spatial edges.\n     */\n    private _requiredSpatialArea: { [key: string]: SpatialArea };\n\n    /**\n     * All sequences in graph with a timestamp of last access.\n     */\n    private _sequences: { [skey: string]: SequenceAccess };\n\n    private _tilePrecision: number;\n    private _tileThreshold: number;\n\n    /**\n     * Create a new graph instance.\n     *\n     * @param {APIv3} [apiV3] - API instance for retrieving data.\n     * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.\n     * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.\n     * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.\n     * @param {FilterCreator} [filterCreator] - Instance for  filter creation.\n     * @param {IGraphConfiguration} [configuration] - Configuration struct.\n     */\n    constructor(\n        apiV3: APIv3,\n        nodeIndex?: rbush.RBush<NodeIndexItem>,\n        graphCalculator?: GraphCalculator,\n        edgeCalculator?: EdgeCalculator,\n        filterCreator?: FilterCreator,\n        configuration?: IGraphConfiguration) {\n\n        this._apiV3 = apiV3;\n\n        this._cachedNodes = {};\n        this._cachedNodeTiles = {};\n        this._cachedSequenceNodes = {};\n        this._cachedSpatialEdges = {};\n        this._cachedTiles = {};\n\n        this._cachingFill$ = {};\n        this._cachingFull$ = {};\n        this._cachingSequenceNodes$ = {};\n        this._cachingSequences$ = {};\n        this._cachingSpatialArea$ = {};\n        this._cachingTiles$ = {};\n\n        this._changed$ = new Subject<Graph>();\n\n        this._defaultAlt = 2;\n        this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new EdgeCalculator();\n        this._filterCreator = filterCreator != null ? filterCreator : new FilterCreator();\n        this._filter = this._filterCreator.createFilter(undefined);\n        this._graphCalculator = graphCalculator != null ? graphCalculator : new GraphCalculator();\n        this._configuration = configuration != null ?\n            configuration :\n            {\n                maxSequences: 50,\n                maxUnusedNodes: 100,\n                maxUnusedPreStoredNodes: 30,\n                maxUnusedTiles: 20,\n            };\n\n        this._nodes = {};\n        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush<NodeIndexItem>(16, [\".lat\", \".lon\", \".lat\", \".lon\"]);\n        this._nodeIndexTiles = {};\n        this._nodeToTile = {};\n\n        this._preStored = {};\n\n        this._requiredNodeTiles = {};\n        this._requiredSpatialArea = {};\n\n        this._sequences = {};\n\n        this._tilePrecision = 7;\n        this._tileThreshold = 20;\n    }\n\n    /**\n     * Get changed$.\n     *\n     * @returns {Observable<Graph>} Observable emitting\n     * the graph every time it has changed.\n     */\n    public get changed$(): Observable<Graph> {\n        return this._changed$;\n    }\n\n    /**\n     * Retrieve and cache node fill properties.\n     *\n     * @param {string} key - Key of node to fill.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the node has been updated.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheFill$(key: string): Observable<Graph> {\n        if (key in this._cachingFull$) {\n            throw new GraphMapillaryError(`Cannot fill node while caching full (${key}).`);\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot fill node that does not exist in graph (${key}).`);\n        }\n\n        if (key in this._cachingFill$) {\n            return this._cachingFill$[key];\n        }\n\n        let node: Node = this.getNode(key);\n        if (node.full) {\n            throw new GraphMapillaryError(`Cannot fill node that is already full (${key}).`);\n        }\n\n        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key])\n            .do(\n                (imageByKeyFill: { [key: string]: IFillNode }): void => {\n                    if (!node.full) {\n                        this._makeFull(node, imageByKeyFill[key]);\n                    }\n\n                    delete this._cachingFill$[key];\n                })\n            .map(\n                (imageByKeyFill: { [key: string]: IFillNode }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (key in this._cachingFill$) {\n                        delete this._cachingFill$[key];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingFill$[key];\n    }\n\n    /**\n     * Retrieve and cache full node properties.\n     *\n     * @param {string} key - Key of node to fill.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the node has been updated.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheFull$(key: string): Observable<Graph> {\n        if (key in this._cachingFull$) {\n            return this._cachingFull$[key];\n        }\n\n        if (this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache full node that already exist in graph (${key}).`);\n        }\n\n        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key])\n            .do(\n                (imageByKeyFull: { [key: string]: IFullNode }): void => {\n                    let fn: IFullNode = imageByKeyFull[key];\n\n                    if (this.hasNode(key)) {\n                        let node: Node = this.getNode(key);\n\n                        if (!node.full) {\n                            this._makeFull(node, fn);\n                        }\n                    } else {\n                        if (fn.sequence == null || fn.sequence.key == null) {\n                            throw new GraphMapillaryError(`Node has no sequence (${key}).`);\n                        }\n\n                        let node: Node = new Node(fn);\n                        this._makeFull(node, fn);\n\n                        let h: string = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);\n                        this._preStore(h, node);\n                        this._setNode(node);\n\n                        delete this._cachingFull$[key];\n                    }\n                })\n            .map(\n                (imageByKeyFull: { [key: string]: IFullNode }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (key in this._cachingFull$) {\n                        delete this._cachingFull$[key];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingFull$[key];\n    }\n\n    /**\n     * Retrieve and cache a node sequence.\n     *\n     * @param {string} key - Key of node for which to retrieve sequence.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the sequence has been retrieved.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheNodeSequence$(key: string): Observable<Graph> {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache sequence edges of node that does not exist in graph (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        if (node.sequenceKey in this._sequences) {\n            throw new GraphMapillaryError(`Sequence already cached (${key}), (${node.sequenceKey}).`);\n        }\n\n        return this._cacheSequence$(node.sequenceKey);\n    }\n\n    /**\n     * Retrieve and cache a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence to cache.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the sequence has been retrieved.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSequence$(sequenceKey: string): Observable<Graph> {\n        if (sequenceKey in this._sequences) {\n            throw new GraphMapillaryError(`Sequence already cached (${sequenceKey})`);\n        }\n\n        return this._cacheSequence$(sequenceKey);\n    }\n\n    /**\n     * Cache sequence edges for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSequenceEdges(key: string): void {\n        let node: Node = this.getNode(key);\n\n        if (!(node.sequenceKey in this._sequences)) {\n            throw new GraphMapillaryError(`Sequence is not cached (${key}), (${node.sequenceKey})`);\n        }\n\n        let sequence: Sequence = this._sequences[node.sequenceKey].sequence;\n        let edges: IEdge[] = this._edgeCalculator.computeSequenceEdges(node, sequence);\n\n        node.cacheSequenceEdges(edges);\n    }\n\n    /**\n     * Retrieve and cache full nodes for all keys in a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @param {string} referenceNodeKey - Key of node to use as reference\n     * for optimized caching.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the nodes of the sequence has been cached.\n     */\n    public cacheSequenceNodes$(sequenceKey: string, referenceNodeKey?: string): Observable<Graph> {\n        if (!this.hasSequence(sequenceKey)) {\n            throw new GraphMapillaryError(\n                `Cannot cache sequence nodes of sequence that does not exist in graph (${sequenceKey}).`);\n        }\n\n        if (this.hasSequenceNodes(sequenceKey)) {\n            throw new GraphMapillaryError(`Sequence nodes already cached (${sequenceKey}).`);\n        }\n\n        const sequence: Sequence = this.getSequence(sequenceKey);\n        if (sequence.key in this._cachingSequenceNodes$) {\n            return this._cachingSequenceNodes$[sequence.key];\n        }\n\n        const batches: string[][] = [];\n        const keys: string[] = sequence.keys.slice();\n        if (!!referenceNodeKey) {\n            let referenceIndex: number = keys.indexOf(referenceNodeKey);\n\n            if (referenceIndex !== -1) {\n                for (const referenceBatchSize of [20, 40]) {\n                    if (referenceIndex < keys.length - 1) {\n                        batches.push(keys.splice(referenceIndex, referenceBatchSize));\n                    }\n\n                    if (referenceIndex > 0) {\n                        const shift: number = referenceIndex === keys.length - 1 ? 1 : 0;\n                        const batch: string[] =\n                            keys.splice(Math.max(0, referenceIndex + shift - referenceBatchSize), referenceBatchSize);\n\n                        batches.push(batch);\n                        referenceIndex -= batch.length;\n                    }\n                }\n            }\n        }\n\n        const batchSize: number = 200;\n        while (keys.length > 0) {\n            batches.push(keys.splice(0, batchSize));\n        }\n\n        let batchesToCache: number = batches.length;\n        const sequenceNodes$: Observable<Graph> = Observable\n            .from(batches)\n            .mergeMap(\n                (batch: string[]): Observable<Graph> => {\n                    return this._apiV3.imageByKeyFull$(batch)\n                        .do(\n                            (imageByKeyFull: { [key: string]: IFullNode }): void => {\n                                for (const fullKey in imageByKeyFull) {\n                                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {\n                                        continue;\n                                    }\n\n                                    const fn: IFullNode = imageByKeyFull[fullKey];\n\n                                    if (this.hasNode(fullKey)) {\n                                        const node: Node = this.getNode(fn.key);\n\n                                        if (!node.full) {\n                                            this._makeFull(node, fn);\n                                        }\n                                    } else {\n                                        if (fn.sequence == null || fn.sequence.key == null) {\n                                            console.warn(`Sequence missing, discarding (${fn.key})`);\n                                        }\n\n                                        const node: Node = new Node(fn);\n                                        this._makeFull(node, fn);\n\n                                        const h: string = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);\n                                        this._preStore(h, node);\n                                        this._setNode(node);\n                                    }\n                                }\n\n                                batchesToCache--;\n                            })\n                        .map(\n                            (imageByKeyFull: { [key: string]: IFullNode }): Graph => {\n                                return this;\n                            });\n                },\n                6)\n            .last()\n            .finally(\n                (): void => {\n                    delete this._cachingSequenceNodes$[sequence.key];\n\n                    if (batchesToCache === 0) {\n                        this._cachedSequenceNodes[sequence.key] = true;\n                    }\n                })\n            .publish()\n            .refCount();\n\n        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;\n\n        return sequenceNodes$;\n    }\n\n    /**\n     * Retrieve and cache full nodes for a node spatial area.\n     *\n     * @param {string} key - Key of node for which to retrieve sequence.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the nodes in the spatial area has been made full.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSpatialArea$(key: string): Observable<Graph>[] {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache spatial area of node that does not exist in graph (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            throw new GraphMapillaryError(`Node already spatially cached (${key}).`);\n        }\n\n        if (!(key in this._requiredSpatialArea)) {\n            throw new GraphMapillaryError(`Spatial area not determined (${key}).`);\n        }\n\n        let spatialArea: SpatialArea = this._requiredSpatialArea[key];\n        if (Object.keys(spatialArea.cacheNodes).length === 0) {\n            throw new GraphMapillaryError(`Spatial nodes already cached (${key}).`);\n        }\n\n        if (key in this._cachingSpatialArea$) {\n            return this._cachingSpatialArea$[key];\n        }\n\n        let batches: string[][] = [];\n        while (spatialArea.cacheKeys.length > 0) {\n            batches.push(spatialArea.cacheKeys.splice(0, 200));\n        }\n\n        let batchesToCache: number = batches.length;\n        let spatialNodes$: Observable<Graph>[] = [];\n\n        for (let batch of batches) {\n            let spatialNodeBatch$: Observable<Graph> = this._apiV3.imageByKeyFill$(batch)\n                .do(\n                    (imageByKeyFill: { [key: string]: IFillNode }): void => {\n                        for (let fillKey in imageByKeyFill) {\n                            if (!imageByKeyFill.hasOwnProperty(fillKey)) {\n                                continue;\n                            }\n\n                            let spatialNode: Node = spatialArea.cacheNodes[fillKey];\n                            if (spatialNode.full) {\n                                delete spatialArea.cacheNodes[fillKey];\n                                continue;\n                            }\n\n                            let fillNode: IFillNode = imageByKeyFill[fillKey];\n                            this._makeFull(spatialNode, fillNode);\n\n                            delete spatialArea.cacheNodes[fillKey];\n                        }\n\n                        if (--batchesToCache === 0) {\n                            delete this._cachingSpatialArea$[key];\n                        }\n                    })\n                .map(\n                    (imageByKeyFill: { [key: string]: IFillNode }): Graph => {\n                        return this;\n                    })\n                .catch(\n                    (error: Error): Observable<Graph> => {\n                        for (let batchKey of batch) {\n                            if (batchKey in spatialArea.all) {\n                                delete spatialArea.all[batchKey];\n                            }\n\n                            if (batchKey in spatialArea.cacheNodes) {\n                                delete spatialArea.cacheNodes[batchKey];\n                            }\n                        }\n\n                        if (--batchesToCache === 0) {\n                            delete this._cachingSpatialArea$[key];\n                        }\n\n                        throw error;\n                    })\n                .finally(\n                    (): void => {\n                        if (Object.keys(spatialArea.cacheNodes).length === 0) {\n                            this._changed$.next(this);\n                        }\n                    })\n                .publish()\n                .refCount();\n\n            spatialNodes$.push(spatialNodeBatch$);\n        }\n\n        this._cachingSpatialArea$[key] = spatialNodes$;\n\n        return spatialNodes$;\n    }\n\n    /**\n     * Cache spatial edges for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheSpatialEdges(key: string): void {\n        if (key in this._cachedSpatialEdges) {\n             throw new GraphMapillaryError(`Spatial edges already cached (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        let sequence: Sequence = this._sequences[node.sequenceKey].sequence;\n\n        let fallbackKeys: string[] = [];\n        let prevKey: string = sequence.findPrevKey(node.key);\n        if (prevKey != null) {\n            fallbackKeys.push(prevKey);\n        }\n\n        let nextKey: string = sequence.findNextKey(node.key);\n        if (nextKey != null) {\n            fallbackKeys.push(nextKey);\n        }\n\n        let allSpatialNodes: { [key: string]: Node } = this._requiredSpatialArea[key].all;\n        let potentialNodes: Node[] = [];\n        let filter: FilterFunction = this._filter;\n        for (let spatialNodeKey in allSpatialNodes) {\n            if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) {\n                continue;\n            }\n\n            let spatialNode: Node = allSpatialNodes[spatialNodeKey];\n\n            if (filter(spatialNode)) {\n                potentialNodes.push(spatialNode);\n            }\n        }\n\n        let potentialEdges: IPotentialEdge[] =\n            this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys);\n\n        let edges: IEdge[] =\n            this._edgeCalculator.computeStepEdges(\n                node,\n                potentialEdges,\n                prevKey,\n                nextKey);\n\n        edges = edges.concat(this._edgeCalculator.computeTurnEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computePanoEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computePerspectiveToPanoEdges(node, potentialEdges));\n        edges = edges.concat(this._edgeCalculator.computeSimilarEdges(node, potentialEdges));\n\n        node.cacheSpatialEdges(edges);\n\n        this._cachedSpatialEdges[key] = node;\n        delete this._requiredSpatialArea[key];\n        delete this._cachedNodeTiles[key];\n    }\n\n    /**\n     * Retrieve and cache geohash tiles for a node.\n     *\n     * @param {string} key - Key of node for which to retrieve tiles.\n     * @returns {Observable<Graph>} Observable emitting the graph\n     * when the tiles required for the node has been cached.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public cacheTiles$(key: string): Observable<Graph>[] {\n        if (key in this._cachedNodeTiles) {\n            throw new GraphMapillaryError(`Tiles already cached (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            throw new GraphMapillaryError(`Spatial edges already cached so tiles considered cached (${key}).`);\n        }\n\n        if (!(key in this._requiredNodeTiles)) {\n            throw new GraphMapillaryError(`Tiles have not been determined (${key}).`);\n        }\n\n        let nodeTiles: NodeTiles = this._requiredNodeTiles[key];\n        if (nodeTiles.cache.length === 0 &&\n            nodeTiles.caching.length === 0) {\n            throw new GraphMapillaryError(`Tiles already cached (${key}).`);\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Cannot cache tiles of node that does not exist in graph (${key}).`);\n        }\n\n        let hs: string[] = nodeTiles.cache.slice();\n        nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs);\n        nodeTiles.cache = [];\n\n        let cacheTiles$: Observable<Graph>[] = [];\n\n        for (let h of nodeTiles.caching) {\n            let cacheTile$: Observable<Graph> = null;\n            if (h in this._cachingTiles$) {\n                cacheTile$ = this._cachingTiles$[h];\n            } else {\n                cacheTile$ = this._apiV3.imagesByH$([h])\n                    .do(\n                        (imagesByH: { [key: string]: { [index: string]: ICoreNode } }): void => {\n                            let coreNodes: { [index: string]: ICoreNode } = imagesByH[h];\n\n                            if (h in this._cachedTiles) {\n                                return;\n                            }\n\n                            this._nodeIndexTiles[h] = [];\n                            this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };\n                            let hCache: Node[] = this._cachedTiles[h].nodes;\n                            let preStored: { [key: string]: Node } = this._removeFromPreStore(h);\n\n                            for (let index in coreNodes) {\n                                if (!coreNodes.hasOwnProperty(index)) {\n                                    continue;\n                                }\n\n                                let coreNode: ICoreNode = coreNodes[index];\n\n                                if (coreNode == null) {\n                                    break;\n                                }\n\n                                if (coreNode.sequence == null ||\n                                    coreNode.sequence.key == null) {\n                                    console.warn(`Sequence missing, discarding (${coreNode.key})`);\n\n                                    continue;\n                                }\n\n                                if (preStored != null && coreNode.key in preStored) {\n                                    let preStoredNode: Node = preStored[coreNode.key];\n                                    delete preStored[coreNode.key];\n\n                                    hCache.push(preStoredNode);\n\n                                    let preStoredNodeIndexItem: NodeIndexItem = {\n                                        lat: preStoredNode.latLon.lat,\n                                        lon: preStoredNode.latLon.lon,\n                                        node: preStoredNode,\n                                    };\n\n                                    this._nodeIndex.insert(preStoredNodeIndexItem);\n                                    this._nodeIndexTiles[h].push(preStoredNodeIndexItem);\n                                    this._nodeToTile[preStoredNode.key] = h;\n\n                                    continue;\n                                }\n\n                                let node: Node = new Node(coreNode);\n\n                                hCache.push(node);\n\n                                let nodeIndexItem: NodeIndexItem = {\n                                    lat: node.latLon.lat,\n                                    lon: node.latLon.lon,\n                                    node: node,\n                                };\n\n                                this._nodeIndex.insert(nodeIndexItem);\n                                this._nodeIndexTiles[h].push(nodeIndexItem);\n                                this._nodeToTile[node.key] = h;\n\n                                this._setNode(node);\n                            }\n\n                            delete this._cachingTiles$[h];\n                        })\n                    .map(\n                        (imagesByH: { [key: string]: { [index: string]: ICoreNode } }): Graph => {\n                            return this;\n                        })\n                    .catch(\n                        (error: Error): Observable<Graph> => {\n                            delete this._cachingTiles$[h];\n\n                            throw error;\n                        })\n                    .publish()\n                    .refCount();\n\n                this._cachingTiles$[h] = cacheTile$;\n            }\n\n            cacheTiles$.push(\n                cacheTile$\n                    .do(\n                        (graph: Graph): void => {\n                            let index: number = nodeTiles.caching.indexOf(h);\n                            if (index > -1) {\n                                nodeTiles.caching.splice(index, 1);\n                            }\n\n                            if (nodeTiles.caching.length === 0 &&\n                                nodeTiles.cache.length === 0) {\n                                delete this._requiredNodeTiles[key];\n\n                                this._cachedNodeTiles[key] = true;\n                            }\n                        })\n                    .catch(\n                        (error: Error): Observable<Graph> => {\n                            let index: number = nodeTiles.caching.indexOf(h);\n                            if (index > -1) {\n                                nodeTiles.caching.splice(index, 1);\n                            }\n\n                            if (nodeTiles.caching.length === 0 &&\n                                nodeTiles.cache.length === 0) {\n                                delete this._requiredNodeTiles[key];\n\n                                this._cachedNodeTiles[key] = true;\n                            }\n\n                            throw error;\n                        })\n                    .finally(\n                        (): void => {\n                            this._changed$.next(this);\n                        })\n                    .publish()\n                    .refCount());\n        }\n\n        return cacheTiles$;\n    }\n\n    /**\n     * Initialize the cache for a node.\n     *\n     * @param {string} key - Key of node.\n     * @throws {GraphMapillaryError} When the operation is not valid on the\n     * current graph.\n     */\n    public initializeCache(key: string): void {\n        if (key in this._cachedNodes) {\n            throw new GraphMapillaryError(`Node already in cache (${key}).`);\n        }\n\n        let node: Node = this.getNode(key);\n        node.initializeCache(new NodeCache());\n\n        let accessed: number = new Date().getTime();\n        this._cachedNodes[key] = { accessed: accessed, node: node };\n\n        this._updateCachedTileAccess(key, accessed);\n    }\n\n    /**\n     * Get a value indicating if the graph is fill caching a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the node is being fill cached.\n     */\n    public isCachingFill(key: string): boolean {\n        return key in this._cachingFill$;\n    }\n\n    /**\n     * Get a value indicating if the graph is fully caching a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the node is being fully cached.\n     */\n    public isCachingFull(key: string): boolean {\n        return key in this._cachingFull$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching a sequence of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the sequence of a node is\n     * being cached.\n     */\n    public isCachingNodeSequence(key: string): boolean {\n        let node: Node = this.getNode(key);\n\n        return node.sequenceKey in this._cachingSequences$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if the sequence is\n     * being cached.\n     */\n    public isCachingSequence(sequenceKey: string): boolean {\n        return sequenceKey in this._cachingSequences$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching sequence nodes.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if the sequence nodes are\n     * being cached.\n     */\n    public isCachingSequenceNodes(sequenceKey: string): boolean {\n        return sequenceKey in this._cachingSequenceNodes$;\n    }\n\n    /**\n     * Get a value indicating if the graph is caching the tiles\n     * required for calculating spatial edges of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the tiles of\n     * a node are being cached.\n     */\n    public isCachingTiles(key: string): boolean {\n        return key in this._requiredNodeTiles &&\n            this._requiredNodeTiles[key].cache.length === 0 &&\n            this._requiredNodeTiles[key].caching.length > 0;\n    }\n\n    /**\n     * Get a value indicating if the cache has been initialized\n     * for a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the cache has been\n     * initialized for a node.\n     */\n    public hasInitializedCache(key: string): boolean {\n        return key in this._cachedNodes;\n    }\n\n    /**\n     * Get a value indicating if a node exist in the graph.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if a node exist in the graph.\n     */\n    public hasNode(key: string): boolean {\n        let accessed: number = new Date().getTime();\n\n        this._updateCachedNodeAccess(key, accessed);\n        this._updateCachedTileAccess(key, accessed);\n\n        return key in this._nodes;\n    }\n\n    /**\n     * Get a value indicating if a node sequence exist in the graph.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if a node sequence exist\n     * in the graph.\n     */\n    public hasNodeSequence(key: string): boolean {\n        let node: Node = this.getNode(key);\n        let sequenceKey: string = node.sequenceKey;\n\n        let hasNodeSequence: boolean = sequenceKey in this._sequences;\n\n        if (hasNodeSequence) {\n            this._sequences[sequenceKey].accessed = new Date().getTime();\n        }\n\n        return hasNodeSequence;\n    }\n\n    /**\n     * Get a value indicating if a sequence exist in the graph.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if a sequence exist\n     * in the graph.\n     */\n    public hasSequence(sequenceKey: string): boolean {\n        let hasSequence: boolean = sequenceKey in this._sequences;\n\n        if (hasSequence) {\n            this._sequences[sequenceKey].accessed = new Date().getTime();\n        }\n\n        return hasSequence;\n    }\n\n    /**\n     * Get a value indicating if sequence nodes has been cached in the graph.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {boolean} Value indicating if a sequence nodes has been\n     * cached in the graph.\n     */\n    public hasSequenceNodes(sequenceKey: string): boolean {\n        return sequenceKey in this._cachedSequenceNodes;\n    }\n\n    /**\n     * Get a value indicating if the graph has fully cached\n     * all nodes in the spatial area of a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the spatial area\n     * of a node has been cached.\n     */\n    public hasSpatialArea(key: string): boolean {\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Spatial area nodes cannot be determined if node not in graph (${key}).`);\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            return true;\n        }\n\n        if (key in this._requiredSpatialArea) {\n            return Object.keys(this._requiredSpatialArea[key].cacheNodes).length === 0;\n        }\n\n        let node: Node = this.getNode(key);\n        let bbox: [ILatLon, ILatLon] = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold);\n\n        let spatialItems: NodeIndexItem[] = this._nodeIndex.search({\n            maxX: bbox[1].lat,\n            maxY: bbox[1].lon,\n            minX: bbox[0].lat,\n            minY: bbox[0].lon,\n        });\n\n        let spatialNodes: SpatialArea = {\n            all: {},\n            cacheKeys: [],\n            cacheNodes: {},\n        };\n\n        for (let spatialItem of spatialItems) {\n            spatialNodes.all[spatialItem.node.key] = spatialItem.node;\n\n            if (!spatialItem.node.full) {\n                spatialNodes.cacheKeys.push(spatialItem.node.key);\n                spatialNodes.cacheNodes[spatialItem.node.key] = spatialItem.node;\n            }\n        }\n\n        this._requiredSpatialArea[key] = spatialNodes;\n\n        return spatialNodes.cacheKeys.length === 0;\n    }\n\n    /**\n     * Get a value indicating if the graph has a tiles required\n     * for a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {boolean} Value indicating if the the tiles required\n     * by a node has been cached.\n     */\n    public hasTiles(key: string): boolean {\n        if (key in this._cachedNodeTiles) {\n            return true;\n        }\n\n        if (key in this._cachedSpatialEdges) {\n            return true;\n        }\n\n        if (!this.hasNode(key)) {\n            throw new GraphMapillaryError(`Node does not exist in graph (${key}).`);\n        }\n\n        let nodeTiles: NodeTiles = { cache: [], caching: [] };\n\n        if (!(key in this._requiredNodeTiles)) {\n            let node: Node = this.getNode(key);\n            nodeTiles.cache = this._graphCalculator\n                .encodeHs(\n                    node.latLon,\n                    this._tilePrecision,\n                    this._tileThreshold)\n                .filter(\n                    (h: string): boolean => {\n                        return !(h in this._cachedTiles);\n                    });\n\n            if (nodeTiles.cache.length > 0) {\n                this._requiredNodeTiles[key] = nodeTiles;\n            }\n        } else {\n            nodeTiles = this._requiredNodeTiles[key];\n        }\n\n        return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0;\n    }\n\n    /**\n     * Get a node.\n     *\n     * @param {string} key - Key of node.\n     * @returns {Node} Retrieved node.\n     */\n    public getNode(key: string): Node {\n        let accessed: number = new Date().getTime();\n\n        this._updateCachedNodeAccess(key, accessed);\n        this._updateCachedTileAccess(key, accessed);\n\n        return this._nodes[key];\n    }\n\n    /**\n     * Get a sequence.\n     *\n     * @param {string} sequenceKey - Key of sequence.\n     * @returns {Node} Retrieved sequence.\n     */\n    public getSequence(sequenceKey: string): Sequence {\n        let sequenceAccess: SequenceAccess = this._sequences[sequenceKey];\n        sequenceAccess.accessed = new Date().getTime();\n\n        return sequenceAccess.sequence;\n    }\n\n    /**\n     * Reset all spatial edges of the graph nodes.\n     */\n    public resetSpatialEdges(): void {\n        let cachedKeys: string[] = Object.keys(this._cachedSpatialEdges);\n\n        for (let cachedKey of cachedKeys) {\n            let node: Node = this._cachedSpatialEdges[cachedKey];\n            node.resetSpatialEdges();\n\n            delete this._cachedSpatialEdges[cachedKey];\n        }\n    }\n\n    /**\n     * Reset the complete graph but keep the nodes corresponding\n     * to the supplied keys. All other nodes will be disposed.\n     *\n     * @param {Array<string>} keepKeys - Keys for nodes to keep\n     * in graph after reset.\n     */\n    public reset(keepKeys: string[]): void {\n        const nodes: Node[] = [];\n        for (const key of keepKeys) {\n            if (!this.hasNode(key)) {\n                throw new Error(`Node does not exist ${key}`);\n            }\n\n            const node: Node = this.getNode(key);\n            node.resetSequenceEdges();\n            node.resetSpatialEdges();\n            nodes.push(node);\n        }\n\n        for (let cachedKey of Object.keys(this._cachedNodes)) {\n            if (keepKeys.indexOf(cachedKey) !== -1) {\n                continue;\n            }\n\n            this._cachedNodes[cachedKey].node.dispose();\n            delete this._cachedNodes[cachedKey];\n        }\n\n        this._cachedNodeTiles = {};\n        this._cachedSpatialEdges = {};\n        this._cachedTiles = {};\n\n        this._cachingFill$ = {};\n        this._cachingFull$ = {};\n        this._cachingSequences$ = {};\n        this._cachingSpatialArea$ = {};\n        this._cachingTiles$ = {};\n\n        this._nodes = {};\n        this._nodeToTile = {};\n\n        this._preStored = {};\n\n        for (const node of nodes) {\n            this._nodes[node.key] = node;\n\n            const h: string = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);\n            this._preStore(h, node);\n        }\n\n        this._requiredNodeTiles = {};\n        this._requiredSpatialArea = {};\n\n        this._sequences = {};\n\n        this._nodeIndexTiles = {};\n        this._nodeIndex.clear();\n    }\n\n    /**\n     * Set the spatial node filter.\n     *\n     * @param {FilterExpression} filter - Filter expression to be applied\n     * when calculating spatial edges.\n     */\n    public setFilter(filter: FilterExpression): void {\n        this._filter = this._filterCreator.createFilter(filter);\n    }\n\n    /**\n     * Uncache the graph according to the graph configuration.\n     *\n     * @description Uncaches unused tiles, unused nodes and\n     * sequences according to the numbers specified in the\n     * graph configuration. Sequences does not have a direct\n     * reference to either tiles or nodes and may be uncached\n     * even if they are related to the nodes that should be kept.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in\n     * graph unrelated to last access. Tiles related to those keys\n     * will also be kept in graph.\n     * @param {string} keepSequenceKey - Optional key of sequence\n     * for which the belonging nodes should not be disposed or\n     * removed from the graph. These nodes may still be uncached if\n     * not specified in keep keys param.\n     */\n    public uncache(keepKeys: string[], keepSequenceKey?: string): void {\n        let keysInUse: { [key: string]: boolean } = {};\n\n        this._addNewKeys(keysInUse, this._cachingFull$);\n        this._addNewKeys(keysInUse, this._cachingFill$);\n        this._addNewKeys(keysInUse, this._cachingSpatialArea$);\n        this._addNewKeys(keysInUse, this._requiredNodeTiles);\n        this._addNewKeys(keysInUse, this._requiredSpatialArea);\n\n        for (let key of keepKeys) {\n            if (key in keysInUse) {\n                continue;\n            }\n\n            keysInUse[key] = true;\n        }\n\n        let keepHs: { [h: string]: boolean } = {};\n        for (let key in keysInUse) {\n            if (!keysInUse.hasOwnProperty(key)) {\n                continue;\n            }\n\n            let node: Node = this._nodes[key];\n\n            let nodeHs: string[] = this._graphCalculator.encodeHs(node.latLon);\n            for (let nodeH of nodeHs) {\n                if (!(nodeH in keepHs)) {\n                    keepHs[nodeH] = true;\n                }\n            }\n        }\n\n        let potentialHs: [string, TileAccess][] = [];\n        for (let h in this._cachedTiles) {\n            if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) {\n                continue;\n            }\n\n            potentialHs.push([h, this._cachedTiles[h]]);\n        }\n\n        let uncacheHs: string[] = potentialHs\n            .sort(\n                (h1: [string, TileAccess], h2: [string, TileAccess]): number => {\n                    return h2[1].accessed - h1[1].accessed;\n                })\n            .slice(this._configuration.maxUnusedTiles)\n            .map(\n                (h: [string, TileAccess]): string => {\n                    return h[0];\n                });\n\n        for (let uncacheH of uncacheHs) {\n            this._uncacheTile(uncacheH, keepSequenceKey);\n        }\n\n        let potentialPreStored: [NodeAccess, string][] = [];\n        let nonCachedPreStored: [string, string][] = [];\n        for (let h in this._preStored) {\n            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {\n                continue;\n            }\n\n            const prestoredNodes: { [key: string]: Node } = this._preStored[h];\n\n            for (let key in prestoredNodes) {\n                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {\n                    continue;\n                }\n\n                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {\n                    continue;\n                }\n\n                if (key in this._cachedNodes) {\n                    potentialPreStored.push([this._cachedNodes[key], h]);\n                } else {\n                    nonCachedPreStored.push([key, h]);\n                }\n            }\n        }\n\n        let uncachePreStored: [string, string][] = potentialPreStored\n            .sort(\n                ([na1, h1]: [NodeAccess, string], [na2, h2]: [NodeAccess, string]): number => {\n                    return na2.accessed - na1.accessed;\n                })\n            .slice(this._configuration.maxUnusedPreStoredNodes)\n            .map(\n                ([na, h]: [NodeAccess, string]): [string, string] => {\n                    return [na.node.key, h];\n                });\n\n        this._uncachePreStored(nonCachedPreStored);\n        this._uncachePreStored(uncachePreStored);\n\n        let potentialNodes: NodeAccess[] = [];\n        for (let key in this._cachedNodes) {\n            if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {\n                continue;\n            }\n\n            potentialNodes.push(this._cachedNodes[key]);\n        }\n\n        let uncacheNodes: NodeAccess[] = potentialNodes\n            .sort(\n                (n1: NodeAccess, n2: NodeAccess): number => {\n                    return n2.accessed - n1.accessed;\n                })\n            .slice(this._configuration.maxUnusedNodes);\n\n        for (let nodeAccess of uncacheNodes) {\n            nodeAccess.node.uncache();\n            let key: string = nodeAccess.node.key;\n            delete this._cachedNodes[key];\n\n            if (key in this._cachedNodeTiles) {\n                delete this._cachedNodeTiles[key];\n            }\n\n            if (key in this._cachedSpatialEdges) {\n                delete this._cachedSpatialEdges[key];\n            }\n        }\n\n        let potentialSequences: SequenceAccess[] = [];\n        for (let sequenceKey in this._sequences) {\n            if (!this._sequences.hasOwnProperty(sequenceKey) ||\n                sequenceKey in this._cachingSequences$ ||\n                sequenceKey === keepSequenceKey) {\n                continue;\n            }\n\n            potentialSequences.push(this._sequences[sequenceKey]);\n        }\n\n        let uncacheSequences: SequenceAccess[] = potentialSequences\n            .sort(\n                (s1: SequenceAccess, s2: SequenceAccess): number => {\n                    return s2.accessed - s1.accessed;\n                })\n            .slice(this._configuration.maxSequences);\n\n        for (let sequenceAccess of uncacheSequences) {\n            let sequenceKey: string = sequenceAccess.sequence.key;\n\n            delete this._sequences[sequenceKey];\n\n            if (sequenceKey in this._cachedSequenceNodes) {\n                delete this._cachedSequenceNodes[sequenceKey];\n            }\n\n            sequenceAccess.sequence.dispose();\n        }\n    }\n\n    private _addNewKeys<T>(keys: { [key: string]: boolean }, dict: { [key: string]: T }): void {\n        for (let key in dict) {\n            if (!dict.hasOwnProperty(key) || !this.hasNode(key)) {\n                continue;\n            }\n\n            if (!(key in keys)) {\n                keys[key] = true;\n            }\n        }\n    }\n\n    private _cacheSequence$(sequenceKey: string): Observable<Graph> {\n        if (sequenceKey in this._cachingSequences$) {\n            return this._cachingSequences$[sequenceKey];\n        }\n\n        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey])\n            .do(\n                (sequenceByKey: { [sequenceKey: string]: ISequence }): void => {\n                    if (!(sequenceKey in this._sequences)) {\n                        this._sequences[sequenceKey] = {\n                            accessed: new Date().getTime(),\n                            sequence: new Sequence(sequenceByKey[sequenceKey]),\n                        };\n                    }\n\n                    delete this._cachingSequences$[sequenceKey];\n                })\n            .map(\n                (sequenceByKey: { [sequenceKey: string]: ISequence }): Graph => {\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    if (sequenceKey in this._cachingSequences$) {\n                        delete this._cachingSequences$[sequenceKey];\n                    }\n\n                    this._changed$.next(this);\n                })\n            .publish()\n            .refCount();\n\n        return this._cachingSequences$[sequenceKey];\n    }\n\n    private _makeFull(node: Node, fillNode: IFillNode): void {\n        if (fillNode.calt == null) {\n            fillNode.calt = this._defaultAlt;\n        }\n\n        if (fillNode.c_rotation == null) {\n            fillNode.c_rotation = this._graphCalculator.rotationFromCompass(fillNode.ca, fillNode.orientation);\n        }\n\n        node.makeFull(fillNode);\n    }\n\n    private _preStore(h: string, node: Node): void {\n        if (!(h in this._preStored)) {\n            this._preStored[h] = {};\n        }\n\n        this._preStored[h][node.key] = node;\n    }\n\n    private _removeFromPreStore(h: string): { [key: string]: Node } {\n        let preStored: { [key: string]: Node } = null;\n\n        if (h in this._preStored) {\n            preStored = this._preStored[h];\n            delete this._preStored[h];\n        }\n\n        return preStored;\n    }\n\n    private _setNode(node: Node): void {\n        let key: string = node.key;\n\n        if (this.hasNode(key)) {\n            throw new GraphMapillaryError(`Node already exist (${key}).`);\n        }\n\n        this._nodes[key] = node;\n    }\n\n    private _uncacheTile(h: string, keepSequenceKey: string): void {\n        for (let node of this._cachedTiles[h].nodes) {\n            let key: string = node.key;\n\n            delete this._nodeToTile[key];\n\n            if (key in this._cachedNodes) {\n                delete this._cachedNodes[key];\n            }\n\n            if (key in this._cachedNodeTiles) {\n                delete this._cachedNodeTiles[key];\n            }\n\n            if (key in this._cachedSpatialEdges) {\n                delete this._cachedSpatialEdges[key];\n            }\n\n            if (node.sequenceKey === keepSequenceKey) {\n                this._preStore(h, node);\n                node.uncache();\n            } else {\n                delete this._nodes[key];\n\n                if (node.sequenceKey in this._cachedSequenceNodes) {\n                    delete this._cachedSequenceNodes[node.sequenceKey];\n                }\n\n                node.dispose();\n            }\n        }\n\n        for (let nodeIndexItem of this._nodeIndexTiles[h]) {\n            this._nodeIndex.remove(nodeIndexItem);\n        }\n\n        delete this._nodeIndexTiles[h];\n        delete this._cachedTiles[h];\n    }\n\n    private _uncachePreStored(preStored: [string, string][]): void {\n        let hs: { [h: string]: boolean } = {};\n        for (let [key, h] of preStored) {\n            if (key in this._nodes) {\n                delete this._nodes[key];\n            }\n\n            if (key in this._cachedNodes) {\n                delete this._cachedNodes[key];\n            }\n\n            let node: Node = this._preStored[h][key];\n\n            if (node.sequenceKey in this._cachedSequenceNodes) {\n                delete this._cachedSequenceNodes[node.sequenceKey];\n            }\n\n            delete this._preStored[h][key];\n\n            node.dispose();\n\n            hs[h] = true;\n        }\n\n        for (let h in hs) {\n            if (!hs.hasOwnProperty(h)) {\n                continue;\n            }\n\n            if (Object.keys(this._preStored[h]).length === 0) {\n                delete this._preStored[h];\n            }\n        }\n    }\n\n    private _updateCachedTileAccess(key: string, accessed: number): void {\n        if (key in this._nodeToTile) {\n            this._cachedTiles[this._nodeToTile[key]].accessed = accessed;\n        }\n    }\n\n    private _updateCachedNodeAccess(key: string, accessed: number): void {\n        if (key in this._cachedNodes) {\n            this._cachedNodes[key].accessed = accessed;\n        }\n    }\n}\n\nexport default Graph;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as geohash from \"latlon-geohash\";\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../API\";\nimport {GeoCoords} from \"../Geo\";\n\nclass GeoHashDirections {\n    public static n: string = \"n\";\n    public static nw: string = \"nw\";\n    public static w: string = \"w\";\n    public static sw: string = \"sw\";\n    public static s: string = \"s\";\n    public static se: string = \"se\";\n    public static e: string = \"e\";\n    public static ne: string = \"ne\";\n}\n\n/**\n * @class GraphCalculator\n *\n * @classdesc Represents a calculator for graph entities.\n */\nexport class GraphCalculator {\n    private _geoCoords: GeoCoords;\n\n    /**\n     * Create a new graph calculator instance.\n     *\n     * @param {GeoCoords} geoCoords - Geo coords instance.\n     */\n    constructor(geoCoords?: GeoCoords) {\n        this._geoCoords = geoCoords != null ? geoCoords : new GeoCoords();\n    }\n\n    /**\n     * Encode the geohash tile for geodetic coordinates.\n     *\n     * @param {ILatLon} latlon - Latitude and longitude to encode.\n     * @param {number} precision - Precision of the encoding.\n     *\n     * @returns {string} The geohash tile for the lat, lon and precision.\n     */\n    public encodeH(latLon: ILatLon, precision: number = 7): string {\n        return geohash.encode(latLon.lat, latLon.lon, precision);\n    }\n\n    /**\n     * Encode the geohash tiles within a threshold from a position\n     * using Manhattan distance.\n     *\n     * @param {ILatLon} latlon - Latitude and longitude to encode.\n     * @param {number} precision - Precision of the encoding.\n     * @param {number} threshold - Threshold of the encoding in meters.\n     *\n     * @returns {string} The geohash tiles reachable within the threshold.\n     */\n    public encodeHs(latLon: ILatLon, precision: number = 7, threshold: number = 20): string[] {\n        let h: string = geohash.encode(latLon.lat, latLon.lon, precision);\n        let bounds: geohash.IBounds = geohash.bounds(h);\n        let ne: geohash.ILatLon = bounds.ne;\n        let sw: geohash.ILatLon = bounds.sw;\n        let neighbours: { [key: string]: string } = geohash.neighbours(h);\n\n        let bl: number[] = [0, 0, 0];\n        let tr: number[] =\n            this._geoCoords.geodeticToEnu(\n                ne.lat,\n                ne.lon,\n                0,\n                sw.lat,\n                sw.lon,\n                0);\n\n        let position: number[] =\n            this._geoCoords.geodeticToEnu(\n                latLon.lat,\n                latLon.lon,\n                0,\n                sw.lat,\n                sw.lon,\n                0);\n\n        let left: number = position[0] - bl[0];\n        let right: number = tr[0] - position[0];\n        let bottom: number = position[1] - bl[1];\n        let top: number = tr[1] - position[1];\n\n        let l: boolean = left < threshold;\n        let r: boolean = right < threshold;\n        let b: boolean = bottom < threshold;\n        let t: boolean = top < threshold;\n\n        let hs: string[] = [h];\n\n        if (t) {\n            hs.push(neighbours[GeoHashDirections.n]);\n        }\n\n        if (t && l) {\n            hs.push(neighbours[GeoHashDirections.nw]);\n        }\n\n        if (l) {\n            hs.push(neighbours[GeoHashDirections.w]);\n        }\n\n        if (l && b) {\n            hs.push(neighbours[GeoHashDirections.sw]);\n        }\n\n        if (b) {\n            hs.push(neighbours[GeoHashDirections.s]);\n        }\n\n        if (b && r) {\n            hs.push(neighbours[GeoHashDirections.se]);\n        }\n\n        if (r) {\n            hs.push(neighbours[GeoHashDirections.e]);\n        }\n\n        if (r && t) {\n            hs.push(neighbours[GeoHashDirections.ne]);\n        }\n\n        return hs;\n    }\n\n    /**\n     * Get the bounding box corners for a circle with radius of a threshold\n     * with center in a geodetic position.\n     *\n     * @param {ILatLon} latlon - Latitude and longitude to encode.\n     * @param {number} threshold - Threshold distance from the position in meters.\n     *\n     * @returns {Array<ILatLon>} The south west and north east corners of the\n     * bounding box.\n     */\n    public boundingBoxCorners(latLon: ILatLon, threshold: number): [ILatLon, ILatLon] {\n        let bl: number[] =\n            this._geoCoords.enuToGeodetic(\n                -threshold,\n                -threshold,\n                0,\n                latLon.lat,\n                latLon.lon,\n                0);\n\n        let tr: number[] =\n            this._geoCoords.enuToGeodetic(\n                threshold,\n                threshold,\n                0,\n                latLon.lat,\n                latLon.lon,\n                0);\n\n        return [\n            { lat: bl[0], lon: bl[1] },\n            { lat: tr[0], lon: tr[1] },\n        ];\n    }\n\n    /**\n     * Convert a compass angle to an angle axis rotation vector.\n     *\n     * @param {number} compassAngle - The compass angle in degrees.\n     * @param {number} orientation - The orientation of the original image.\n     *\n     * @returns {Array<number>} Angle axis rotation vector.\n     */\n    public rotationFromCompass(compassAngle: number, orientation: number): number[] {\n        let x: number = 0;\n        let y: number = 0;\n        let z: number = 0;\n\n        switch (orientation) {\n            case 1:\n                x = Math.PI / 2;\n                break;\n            case 3:\n                x = -Math.PI / 2;\n                z = Math.PI;\n                break;\n            case 6:\n                y = -Math.PI / 2;\n                z = -Math.PI / 2;\n                break;\n            case 8:\n                y = Math.PI / 2;\n                z = Math.PI / 2;\n                break;\n            default:\n                break;\n        }\n\n        let rz: THREE.Matrix4 = new THREE.Matrix4().makeRotationZ(z);\n        let euler: THREE.Euler = new THREE.Euler(x, y, compassAngle * Math.PI / 180, \"XYZ\");\n        let re: THREE.Matrix4 = new THREE.Matrix4().makeRotationFromEuler(euler);\n\n        let rotation: THREE.Vector4 = new THREE.Vector4().setAxisAngleFromRotationMatrix(<any>re.multiply(rz));\n\n        return rotation.multiplyScalar(rotation.w).toArray().slice(0, 3);\n    }\n}\n\nexport default GraphCalculator;\n",
-    "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/expand\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/last\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/publishReplay\";\n\nimport {\n    FilterExpression,\n    Graph,\n    ImageLoadingService,\n    Node,\n    Sequence,\n} from \"../Graph\";\n\n\n/**\n * @class GraphService\n *\n * @classdesc Represents a service for graph operations.\n */\nexport class GraphService {\n    private _graph$: Observable<Graph>;\n\n    private _imageLoadingService: ImageLoadingService;\n\n    private _firstGraphSubjects$: Subject<Graph>[];\n\n    private _initializeCacheSubscriptions: Subscription[];\n    private _sequenceSubscriptions: Subscription[];\n    private _spatialSubscriptions: Subscription[];\n\n    /**\n     * Create a new graph service instance.\n     *\n     * @param {Graph} graph - Graph instance to be operated on.\n     */\n    constructor(graph: Graph, imageLoadingService: ImageLoadingService) {\n        this._graph$ = Observable\n            .of(graph)\n            .concat(graph.changed$)\n            .publishReplay(1)\n            .refCount();\n\n        this._graph$.subscribe(() => { /*noop*/ });\n\n        this._imageLoadingService = imageLoadingService;\n\n        this._firstGraphSubjects$ = [];\n\n        this._initializeCacheSubscriptions = [];\n        this._sequenceSubscriptions = [];\n        this._spatialSubscriptions = [];\n    }\n\n    /**\n     * Cache a node in the graph and retrieve it.\n     *\n     * @description When called, the full properties of\n     * the node are retrieved and the node cache is initialized.\n     * After that the node assets are cached and the node\n     * is emitted to the observable when.\n     * In parallel to caching the node assets, the sequence and\n     * spatial edges of the node are cached. For this, the sequence\n     * of the node and the required tiles and spatial nodes are\n     * retrieved. The sequence and spatial edges may be set before\n     * or after the node is returned.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @return {Observable<Node>} Observable emitting a single item,\n     * the node, when it has been retrieved and its assets are cached.\n     * @throws {Error} Propagates any IO node caching errors to the caller.\n     */\n    public cacheNode$(key: string): Observable<Node> {\n        let firstGraphSubject$: Subject<Graph> = new Subject<Graph>();\n\n        this._firstGraphSubjects$.push(firstGraphSubject$);\n\n        let firstGraph$: Observable<Graph> = firstGraphSubject$\n            .publishReplay(1)\n            .refCount();\n\n        let node$: Observable<Node> = firstGraph$\n            .map(\n                (graph: Graph): Node => {\n                    return graph.getNode(key);\n                })\n            .mergeMap(\n                (node: Node): Observable<Node> => {\n                    return node.assetsCached ?\n                        Observable.of(node) :\n                        node.cacheAssets$();\n                })\n            .publishReplay(1)\n            .refCount();\n\n        node$.subscribe(\n            (node: Node): void => {\n                this._imageLoadingService.loadnode$.next(node);\n            },\n            (error: Error): void => {\n                console.error(`Failed to cache node (${key})`, error);\n            });\n\n        let initializeCacheSubscription: Subscription = this._graph$\n            .first()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingFull(key) || !graph.hasNode(key)) {\n                        return graph.cacheFull$(key);\n                    }\n\n                    if (graph.isCachingFill(key) || !graph.getNode(key).full) {\n                        return graph.cacheFill$(key);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .do(\n                (graph: Graph): void => {\n                    if (!graph.hasInitializedCache(key)) {\n                        graph.initializeCache(key);\n                    }\n                })\n            .finally(\n                (): void => {\n                    if (initializeCacheSubscription == null) {\n                        return;\n                    }\n\n                    this._removeFromArray(initializeCacheSubscription, this._initializeCacheSubscriptions);\n                    this._removeFromArray(firstGraphSubject$, this._firstGraphSubjects$);\n                })\n            .subscribe(\n                (graph: Graph): void => {\n                    firstGraphSubject$.next(graph);\n                    firstGraphSubject$.complete();\n                },\n                (error: Error): void => {\n                    firstGraphSubject$.error(error);\n                });\n\n        if (!initializeCacheSubscription.closed) {\n            this._initializeCacheSubscriptions.push(initializeCacheSubscription);\n        }\n\n        let sequenceSubscription: Subscription = firstGraph$\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {\n                        return graph.cacheNodeSequence$(key);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .do(\n                (graph: Graph): void => {\n                    if (!graph.getNode(key).sequenceEdges.cached) {\n                        graph.cacheSequenceEdges(key);\n                    }\n                })\n            .finally(\n                (): void => {\n                    if (sequenceSubscription == null) {\n                        return;\n                    }\n\n                    this._removeFromArray(sequenceSubscription, this._sequenceSubscriptions);\n                })\n            .subscribe(\n                (graph: Graph): void => { return; },\n                (error: Error): void => {\n                    console.error(`Failed to cache sequence edges (${key}).`, error);\n                });\n\n        if (!sequenceSubscription.closed) {\n            this._sequenceSubscriptions.push(sequenceSubscription);\n        }\n\n        let spatialSubscription: Subscription = firstGraph$\n            .expand(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.hasTiles(key)) {\n                        return Observable.empty<Graph>();\n                    }\n\n                    return Observable\n                        .from<Observable<Graph>>(graph.cacheTiles$(key))\n                        .mergeMap(\n                            (graph$: Observable<Graph>): Observable<Graph> => {\n                                return graph$\n                                    .mergeMap(\n                                        (g: Graph): Observable<Graph> => {\n                                            if (g.isCachingTiles(key)) {\n                                                return Observable.empty<Graph>();\n                                            }\n\n                                            return Observable.of<Graph>(g);\n                                        })\n                                    .catch(\n                                        (error: Error, caught$: Observable<Graph>): Observable<Graph> => {\n                                            console.error(`Failed to cache tile data (${key}).`, error);\n\n                                            return Observable.empty<Graph>();\n                                        });\n                            });\n                })\n            .last()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.hasSpatialArea(key)) {\n                        return Observable.of<Graph>(graph);\n                    }\n\n                    return Observable\n                        .from<Observable<Graph>>(graph.cacheSpatialArea$(key))\n                        .mergeMap(\n                            (graph$: Observable<Graph>): Observable<Graph> => {\n                                return graph$\n                                    .catch(\n                                        (error: Error, caught$: Observable<Graph>): Observable<Graph> => {\n                                            console.error(`Failed to cache spatial nodes (${key}).`, error);\n\n                                            return Observable.empty<Graph>();\n                                        });\n                            });\n                })\n            .last()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    return graph.hasNodeSequence(key) ?\n                        Observable.of<Graph>(graph) :\n                        graph.cacheNodeSequence$(key);\n                })\n            .do(\n                (graph: Graph): void => {\n                    if (!graph.getNode(key).spatialEdges.cached) {\n                        graph.cacheSpatialEdges(key);\n                    }\n                })\n            .finally(\n                (): void => {\n                    if (spatialSubscription == null) {\n                        return;\n                    }\n\n                    this._removeFromArray(spatialSubscription, this._spatialSubscriptions);\n                })\n            .subscribe(\n                (graph: Graph): void => { return; },\n                (error: Error): void => {\n                    console.error(`Failed to cache spatial edges (${key}).`, error);\n                });\n\n        if (!spatialSubscription.closed) {\n            this._spatialSubscriptions.push(spatialSubscription);\n        }\n\n        return node$\n            .first(\n                (node: Node): boolean => {\n                    return node.assetsCached;\n                });\n    }\n\n    /**\n     * Cache a sequence in the graph and retrieve it.\n     *\n     * @param {string} sequenceKey - Sequence key.\n     * @returns {Observable<Sequence>} Observable emitting a single item,\n     * the sequence, when it has been retrieved and its assets are cached.\n     * @throws {Error} Propagates any IO node caching errors to the caller.\n     */\n    public cacheSequence$(sequenceKey: string): Observable<Sequence> {\n        return this._graph$\n            .first()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {\n                        return graph.cacheSequence$(sequenceKey);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .map(\n                (graph: Graph): Sequence => {\n                    return graph.getSequence(sequenceKey);\n                });\n    }\n\n    /**\n     * Set a spatial edge filter on the graph.\n     *\n     * @description Resets the spatial edges of all cached nodes.\n     *\n     * @param {FilterExpression} filter - Filter expression to be applied.\n     * @return {Observable<Graph>} Observable emitting a single item,\n     * the graph, when the spatial edges have been reset.\n     */\n    public setFilter$(filter: FilterExpression): Observable<Graph> {\n        this._resetSubscriptions(this._spatialSubscriptions);\n\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.resetSpatialEdges();\n                    graph.setFilter(filter);\n                });\n    }\n\n    /**\n     * Reset the graph.\n     *\n     * @description Resets the graph but keeps the nodes of the\n     * supplied keys.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.\n     * @return {Observable<Node>} Observable emitting a single item,\n     * the graph, when it has been reset.\n     */\n    public reset$(keepKeys: string[]): Observable<Graph> {\n        this._abortSubjects(this._firstGraphSubjects$);\n        this._resetSubscriptions(this._initializeCacheSubscriptions);\n        this._resetSubscriptions(this._sequenceSubscriptions);\n        this._resetSubscriptions(this._spatialSubscriptions);\n\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.reset(keepKeys);\n                });\n    }\n\n    /**\n     * Uncache the graph.\n     *\n     * @description Uncaches the graph by removing tiles, nodes and\n     * sequences. Keeps the nodes of the supplied keys and the tiles\n     * related to those nodes.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.\n     * @return {Observable<Graph>} Observable emitting a single item,\n     * the graph, when the graph has been uncached.\n     */\n    public uncache$(keepKeys: string[]): Observable<Graph> {\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.uncache(keepKeys);\n                });\n    }\n\n    private _abortSubjects<T>(subjects: Subject<T>[]): void {\n        for (let subject of subjects.slice()) {\n            this._removeFromArray(subject, subjects);\n\n            subject.error(new Error(\"Cache node request was aborted.\"));\n        }\n    }\n\n    private _removeFromArray<T>(object: T, objects: T[]): void {\n        let index: number = objects.indexOf(object);\n        if (index !== -1) {\n            objects.splice(index, 1);\n        }\n    }\n\n    private _resetSubscriptions(subscriptions: Subscription[]): void {\n        for (let subscription of subscriptions.slice()) {\n            this._removeFromArray(subscription, subscriptions);\n\n            if (!subscription.closed) {\n                subscription.unsubscribe();\n            }\n        }\n    }\n}\n\nexport default GraphService;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ILoadStatus, Node} from \"../Graph\";\n\nexport class ImageLoadingService {\n    private _loadnode$: Subject<Node> = new Subject<Node>();\n    private _loadstatus$: Observable<{[key: string]: ILoadStatus}>;\n\n    constructor () {\n        this._loadstatus$ = this._loadnode$\n            .scan(\n                (nodes: {[key: string]: ILoadStatus}, node: Node): {[key: string]: ILoadStatus} => {\n                    nodes[node.key] = node.loadStatus;\n                    return nodes;\n                },\n                {})\n            .publishReplay(1)\n            .refCount();\n\n        this._loadstatus$.subscribe(() => { /*noop*/ });\n    }\n\n    public get loadnode$(): Subject<Node> {\n        return this._loadnode$;\n    }\n\n    public get loadstatus$(): Observable<{[key: string]: ILoadStatus}> {\n        return this._loadstatus$;\n    }\n}\n",
+    "/**\n * Enumeration for graph modes.\n * @enum {number}\n * @readonly\n * @description Modes for the retrieval and caching performed\n * by the graph service on the graph.\n */\nexport enum GraphMode {\n    /**\n     * Caching is performed on sequences only and sequence edges are\n     * calculated. Spatial tiles\n     * are not retrieved and spatial edges are not calculated when\n     * caching nodes. Complete sequences are being cached for requested\n     * nodes within the graph.\n     */\n    Sequence,\n\n    /**\n     * Caching is performed with emphasis on spatial data. Sequence edges\n     * as well as spatial edges are cached. Sequence data\n     * is still requested but complete sequences are not being cached\n     * for requested nodes.\n     *\n     * This is the initial mode of the graph service.\n     */\n    Spatial,\n}\n\nexport default GraphMode;\n",
+    "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/catch\";\nimport \"rxjs/add/operator/concat\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/expand\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/last\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/publishReplay\";\n\nimport {\n    FilterExpression,\n    Graph,\n    GraphMode,\n    ImageLoadingService,\n    Node,\n    Sequence,\n} from \"../Graph\";\n\n/**\n * @class GraphService\n *\n * @classdesc Represents a service for graph operations.\n */\nexport class GraphService {\n    private _graph$: Observable<Graph>;\n    private _graphMode: GraphMode;\n    private _graphMode$: Observable<GraphMode>;\n    private _graphModeSubject$: Subject<GraphMode>;\n\n    private _imageLoadingService: ImageLoadingService;\n\n    private _firstGraphSubjects$: Subject<Graph>[];\n\n    private _initializeCacheSubscriptions: Subscription[];\n    private _sequenceSubscriptions: Subscription[];\n    private _spatialSubscriptions: Subscription[];\n\n    /**\n     * Create a new graph service instance.\n     *\n     * @param {Graph} graph - Graph instance to be operated on.\n     */\n    constructor(graph: Graph, imageLoadingService: ImageLoadingService) {\n        this._graph$ = Observable\n            .of(graph)\n            .concat(graph.changed$)\n            .publishReplay(1)\n            .refCount();\n\n        this._graph$.subscribe(() => { /*noop*/ });\n\n        this._graphMode = GraphMode.Spatial;\n        this._graphModeSubject$ = new Subject<GraphMode>();\n        this._graphMode$ = this._graphModeSubject$\n            .startWith(this._graphMode)\n            .publishReplay(1)\n            .refCount();\n\n        this._graphMode$.subscribe(() => { /*noop*/ });\n\n        this._imageLoadingService = imageLoadingService;\n\n        this._firstGraphSubjects$ = [];\n\n        this._initializeCacheSubscriptions = [];\n        this._sequenceSubscriptions = [];\n        this._spatialSubscriptions = [];\n    }\n\n    /**\n     * Get graph mode observable.\n     *\n     * @description Emits the current graph mode.\n     *\n     * @returns {Observable<GraphMode>} Observable\n     * emitting the current graph mode when it changes.\n     */\n    public get graphMode$(): Observable<GraphMode> {\n        return this._graphMode$;\n    }\n\n    /**\n     * Cache a node in the graph and retrieve it.\n     *\n     * @description When called, the full properties of\n     * the node are retrieved and the node cache is initialized.\n     * After that the node assets are cached and the node\n     * is emitted to the observable when.\n     * In parallel to caching the node assets, the sequence and\n     * spatial edges of the node are cached. For this, the sequence\n     * of the node and the required tiles and spatial nodes are\n     * retrieved. The sequence and spatial edges may be set before\n     * or after the node is returned.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @return {Observable<Node>} Observable emitting a single item,\n     * the node, when it has been retrieved and its assets are cached.\n     * @throws {Error} Propagates any IO node caching errors to the caller.\n     */\n    public cacheNode$(key: string): Observable<Node> {\n        const firstGraphSubject$: Subject<Graph> = new Subject<Graph>();\n\n        this._firstGraphSubjects$.push(firstGraphSubject$);\n\n        const firstGraph$: Observable<Graph> = firstGraphSubject$\n            .publishReplay(1)\n            .refCount();\n\n        const node$: Observable<Node> = firstGraph$\n            .map(\n                (graph: Graph): Node => {\n                    return graph.getNode(key);\n                })\n            .mergeMap(\n                (node: Node): Observable<Node> => {\n                    return node.assetsCached ?\n                        Observable.of(node) :\n                        node.cacheAssets$();\n                })\n            .publishReplay(1)\n            .refCount();\n\n        node$.subscribe(\n            (node: Node): void => {\n                this._imageLoadingService.loadnode$.next(node);\n            },\n            (error: Error): void => {\n                console.error(`Failed to cache node (${key})`, error);\n            });\n\n        const initializeCacheSubscription: Subscription = this._graph$\n            .first()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingFull(key) || !graph.hasNode(key)) {\n                        return graph.cacheFull$(key);\n                    }\n\n                    if (graph.isCachingFill(key) || !graph.getNode(key).full) {\n                        return graph.cacheFill$(key);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .do(\n                (graph: Graph): void => {\n                    if (!graph.hasInitializedCache(key)) {\n                        graph.initializeCache(key);\n                    }\n                })\n            .finally(\n                (): void => {\n                    if (initializeCacheSubscription == null) {\n                        return;\n                    }\n\n                    this._removeFromArray(initializeCacheSubscription, this._initializeCacheSubscriptions);\n                    this._removeFromArray(firstGraphSubject$, this._firstGraphSubjects$);\n                })\n            .subscribe(\n                (graph: Graph): void => {\n                    firstGraphSubject$.next(graph);\n                    firstGraphSubject$.complete();\n                },\n                (error: Error): void => {\n                    firstGraphSubject$.error(error);\n                });\n\n        if (!initializeCacheSubscription.closed) {\n            this._initializeCacheSubscriptions.push(initializeCacheSubscription);\n        }\n\n        const graphSequence$: Observable<Graph> = firstGraph$\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {\n                        return graph.cacheNodeSequence$(key);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        const sequenceSubscription: Subscription = graphSequence$\n            .do(\n                (graph: Graph): void => {\n                    if (!graph.getNode(key).sequenceEdges.cached) {\n                        graph.cacheSequenceEdges(key);\n                    }\n                })\n            .finally(\n                (): void => {\n                    if (sequenceSubscription == null) {\n                        return;\n                    }\n\n                    this._removeFromArray(sequenceSubscription, this._sequenceSubscriptions);\n                })\n            .subscribe(\n                (graph: Graph): void => { return; },\n                (error: Error): void => {\n                    console.error(`Failed to cache sequence edges (${key}).`, error);\n                });\n\n        if (!sequenceSubscription.closed) {\n            this._sequenceSubscriptions.push(sequenceSubscription);\n        }\n\n        if (this._graphMode === GraphMode.Spatial) {\n            const spatialSubscription: Subscription = firstGraph$\n                .expand(\n                    (graph: Graph): Observable<Graph> => {\n                        if (graph.hasTiles(key)) {\n                            return Observable.empty<Graph>();\n                        }\n\n                        return Observable\n                            .from<Observable<Graph>>(graph.cacheTiles$(key))\n                            .mergeMap(\n                                (graph$: Observable<Graph>): Observable<Graph> => {\n                                    return graph$\n                                        .mergeMap(\n                                            (g: Graph): Observable<Graph> => {\n                                                if (g.isCachingTiles(key)) {\n                                                    return Observable.empty<Graph>();\n                                                }\n\n                                                return Observable.of<Graph>(g);\n                                            })\n                                        .catch(\n                                            (error: Error, caught$: Observable<Graph>): Observable<Graph> => {\n                                                console.error(`Failed to cache tile data (${key}).`, error);\n\n                                                return Observable.empty<Graph>();\n                                            });\n                                });\n                    })\n                .last()\n                .mergeMap(\n                    (graph: Graph): Observable<Graph> => {\n                        if (graph.hasSpatialArea(key)) {\n                            return Observable.of<Graph>(graph);\n                        }\n\n                        return Observable\n                            .from<Observable<Graph>>(graph.cacheSpatialArea$(key))\n                            .mergeMap(\n                                (graph$: Observable<Graph>): Observable<Graph> => {\n                                    return graph$\n                                        .catch(\n                                            (error: Error, caught$: Observable<Graph>): Observable<Graph> => {\n                                                console.error(`Failed to cache spatial nodes (${key}).`, error);\n\n                                                return Observable.empty<Graph>();\n                                            });\n                                });\n                    })\n                .last()\n                .mergeMap(\n                    (graph: Graph): Observable<Graph> => {\n                        return graph.hasNodeSequence(key) ?\n                            Observable.of<Graph>(graph) :\n                            graph.cacheNodeSequence$(key);\n                    })\n                .do(\n                    (graph: Graph): void => {\n                        if (!graph.getNode(key).spatialEdges.cached) {\n                            graph.cacheSpatialEdges(key);\n                        }\n                    })\n                .finally(\n                    (): void => {\n                        if (spatialSubscription == null) {\n                            return;\n                        }\n\n                        this._removeFromArray(spatialSubscription, this._spatialSubscriptions);\n                    })\n                .subscribe(\n                    (graph: Graph): void => { return; },\n                    (error: Error): void => {\n                        console.error(`Failed to cache spatial edges (${key}).`, error);\n                    });\n\n            if (!spatialSubscription.closed) {\n                this._spatialSubscriptions.push(spatialSubscription);\n            }\n        }\n\n        return node$\n            .first(\n                (node: Node): boolean => {\n                    return node.assetsCached;\n                });\n    }\n\n    /**\n     * Cache a sequence in the graph and retrieve it.\n     *\n     * @param {string} sequenceKey - Sequence key.\n     * @returns {Observable<Sequence>} Observable emitting a single item,\n     * the sequence, when it has been retrieved and its assets are cached.\n     * @throws {Error} Propagates any IO node caching errors to the caller.\n     */\n    public cacheSequence$(sequenceKey: string): Observable<Sequence> {\n        return this._graph$\n            .first()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {\n                        return graph.cacheSequence$(sequenceKey);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .map(\n                (graph: Graph): Sequence => {\n                    return graph.getSequence(sequenceKey);\n                });\n    }\n\n    /**\n     * Cache a sequence and its nodes in the graph and retrieve the sequence.\n     *\n     * @description Caches a sequence and its assets are cached and\n     * retrieves all nodes belonging to the sequence. The node assets\n     * or edges will not be cached.\n     *\n     * @param {string} sequenceKey - Sequence key.\n     * @param {string} referenceNodeKey - Key of node to use as reference\n     * for optimized caching.\n     * @returns {Observable<Sequence>} Observable emitting a single item,\n     * the sequence, when it has been retrieved, its assets are cached and\n     * all nodes belonging to the sequence has been retrieved.\n     * @throws {Error} Propagates any IO node caching errors to the caller.\n     */\n    public cacheSequenceNodes$(sequenceKey: string, referenceNodeKey?: string): Observable<Sequence> {\n        return this._graph$\n            .first()\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {\n                        return graph.cacheSequence$(sequenceKey);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .mergeMap(\n                (graph: Graph): Observable<Graph> => {\n                    if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {\n                        return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);\n                    }\n\n                    return Observable.of<Graph>(graph);\n                })\n            .map(\n                (graph: Graph): Sequence => {\n                    return graph.getSequence(sequenceKey);\n                });\n    }\n\n    /**\n     * Set a spatial edge filter on the graph.\n     *\n     * @description Resets the spatial edges of all cached nodes.\n     *\n     * @param {FilterExpression} filter - Filter expression to be applied.\n     * @return {Observable<Graph>} Observable emitting a single item,\n     * the graph, when the spatial edges have been reset.\n     */\n    public setFilter$(filter: FilterExpression): Observable<void> {\n        this._resetSubscriptions(this._spatialSubscriptions);\n\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.resetSpatialEdges();\n                    graph.setFilter(filter);\n                })\n            .map(\n                (graph: Graph): void => {\n                    return undefined;\n                });\n    }\n\n    /**\n     * Set the graph mode.\n     *\n     * @description If graph mode is set to spatial, caching\n     * is performed with emphasis on spatial edges. If graph\n     * mode is set to sequence no tile data is requested and\n     * no spatial edges are computed.\n     *\n     * When setting graph mode to sequence all spatial\n     * subscriptions are aborted.\n     *\n     * @param {GraphMode} mode - Graph mode to set.\n     */\n    public setGraphMode(mode: GraphMode): void {\n        if (this._graphMode === mode) {\n            return;\n        }\n\n        if (mode === GraphMode.Sequence) {\n            this._resetSubscriptions(this._spatialSubscriptions);\n        }\n\n        this._graphMode = mode;\n        this._graphModeSubject$.next(this._graphMode);\n    }\n\n    /**\n     * Reset the graph.\n     *\n     * @description Resets the graph but keeps the nodes of the\n     * supplied keys.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.\n     * @return {Observable<Node>} Observable emitting a single item,\n     * the graph, when it has been reset.\n     */\n    public reset$(keepKeys: string[]): Observable<void> {\n        this._abortSubjects(this._firstGraphSubjects$);\n        this._resetSubscriptions(this._initializeCacheSubscriptions);\n        this._resetSubscriptions(this._sequenceSubscriptions);\n        this._resetSubscriptions(this._spatialSubscriptions);\n\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.reset(keepKeys);\n                })\n            .map(\n                (graph: Graph): void => {\n                    return undefined;\n                });\n    }\n\n    /**\n     * Uncache the graph.\n     *\n     * @description Uncaches the graph by removing tiles, nodes and\n     * sequences. Keeps the nodes of the supplied keys and the tiles\n     * related to those nodes.\n     *\n     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.\n     * @param {string} keepSequenceKey - Optional key of sequence\n     * for which the belonging nodes should not be disposed or\n     * removed from the graph. These nodes may still be uncached if\n     * not specified in keep keys param.\n     * @return {Observable<Graph>} Observable emitting a single item,\n     * the graph, when the graph has been uncached.\n     */\n    public uncache$(keepKeys: string[], keepSequenceKey?: string): Observable<void> {\n        return this._graph$\n            .first()\n            .do(\n                (graph: Graph): void => {\n                    graph.uncache(keepKeys, keepSequenceKey);\n                })\n            .map(\n                (graph: Graph): void => {\n                    return undefined;\n                });\n    }\n\n    private _abortSubjects<T>(subjects: Subject<T>[]): void {\n        for (const subject of subjects.slice()) {\n            this._removeFromArray(subject, subjects);\n\n            subject.error(new Error(\"Cache node request was aborted.\"));\n        }\n    }\n\n    private _removeFromArray<T>(object: T, objects: T[]): void {\n        const index: number = objects.indexOf(object);\n        if (index !== -1) {\n            objects.splice(index, 1);\n        }\n    }\n\n    private _resetSubscriptions(subscriptions: Subscription[]): void {\n        for (const subscription of subscriptions.slice()) {\n            this._removeFromArray(subscription, subscriptions);\n\n            if (!subscription.closed) {\n                subscription.unsubscribe();\n            }\n        }\n    }\n}\n\nexport default GraphService;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ILoadStatus, Node} from \"../Graph\";\n\nexport class ImageLoadingService {\n    private _loadnode$: Subject<Node> = new Subject<Node>();\n    private _loadstatus$: Observable<{[key: string]: ILoadStatus}>;\n\n    constructor () {\n        this._loadstatus$ = this._loadnode$\n            .scan(\n                ([nodes]: [{[key: string]: ILoadStatus}, boolean], node: Node): [{[key: string]: ILoadStatus}, boolean] => {\n                    let changed: boolean = false;\n                    if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {\n                        if (node.key in nodes) {\n                            delete nodes[node.key];\n                            changed = true;\n                        }\n                    } else {\n                        nodes[node.key] = node.loadStatus;\n                        changed = true;\n                    }\n\n                    return [nodes, changed];\n                },\n                [{}, false])\n            .filter(\n                ([nodes, changed]: [{[key: string]: ILoadStatus}, boolean]): boolean => {\n                    return changed;\n                })\n            .map(\n                ([nodes]: [{[key: string]: ILoadStatus}, boolean]): {[key: string]: ILoadStatus} => {\n                    return nodes;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._loadstatus$.subscribe(() => { /*noop*/ });\n    }\n\n    public get loadnode$(): Subject<Node> {\n        return this._loadnode$;\n    }\n\n    public get loadstatus$(): Observable<{[key: string]: ILoadStatus}> {\n        return this._loadstatus$;\n    }\n}\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as Pbf from \"pbf\";\n\nimport {IMesh} from \"../Graph\";\n\nexport class MeshReader {\n    public static read(buffer: Buffer): IMesh {\n        let pbf: Pbf<IMesh> = new Pbf<IMesh>(buffer);\n\n        return pbf.readFields(MeshReader._readMeshField, { faces: [], vertices: [] });\n    }\n\n    private static _readMeshField(tag: number, mesh: IMesh, pbf: Pbf<IMesh>): void {\n        if (tag === 1) {\n            mesh.vertices.push(pbf.readFloat());\n        } else if (tag === 2) {\n            mesh.faces.push(pbf.readVarint());\n        }\n    }\n}\n",
     "import {Observable} from \"rxjs/Observable\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/map\";\n\nimport {\n    ICoreNode,\n    IFillNode,\n    IGPano,\n    ILatLon,\n} from \"../API\";\nimport {IEdge} from \"../Edge\";\nimport {\n    IEdgeStatus,\n    IMesh,\n    ILoadStatus,\n    NodeCache,\n} from \"../Graph\";\nimport {ImageSize} from \"../Viewer\";\n\n/**\n * @class Node\n *\n * @classdesc Represents a node in the navigation graph.\n *\n * Explanation of position and bearing properties:\n *\n * When images are uploaded they will have GPS information in the EXIF, this is what\n * is called `originalLatLon`(@link Node#originalLatLon).\n *\n * When Structure from Motions has been run for a node a `computedLatLon` that\n * differs from the `originalLatLon` will be created. It is different because\n * GPS positions are not very exact and SfM aligns the camera positions according\n * to the 3D reconstruction (@link Node#computedLatLon).\n *\n * At last there exist a `latLon` property which evaluates to\n * the `computedLatLon` from SfM if it exists but falls back\n * to the `originalLatLon` from the EXIF GPS otherwise (@link Node#latlon).\n *\n * Everything that is done in in the Viewer is based on the SfM positions,\n * i.e. `computedLatLon`. That is why the smooth transitions go in the right\n * direction (nd not in strange directions because of bad GPS).\n *\n * E.g. when placing a marker in the Viewer it is relative to the SfM\n * position i.e. the `computedLatLon`.\n *\n * The same concept as above also applies to the compass angle (or bearing) properties\n * `originalCa`, `computedCa` and `ca`.\n */\nexport class Node {\n    private _cache: NodeCache;\n    private _core: ICoreNode;\n    private _fill: IFillNode;\n\n    /**\n     * Create a new node instance.\n     *\n     * @description Nodes are always created internally by the library.\n     * Nodes can not be added to the library through any API method.\n     *\n     * @param {ICoreNode} coreNode - Raw core node data.\n     */\n    constructor(core: ICoreNode) {\n        this._cache = null;\n        this._core = core;\n        this._fill = null;\n    }\n\n    /**\n     * Get assets cached.\n     *\n     * @description The assets that need to be cached for this property\n     * to report true are the following: fill properties, image and mesh.\n     * The library ensures that the current node will always have the\n     * assets cached.\n     *\n     * @returns {boolean} Value indicating whether all assets have been\n     * cached.\n     */\n    public get assetsCached(): boolean {\n        return this._core != null &&\n            this._fill != null &&\n            this._cache != null &&\n            this._cache.image != null &&\n            this._cache.mesh != null;\n    }\n\n    /**\n     * Get alt.\n     *\n     * @description If SfM has not been run the computed altitude is\n     * set to a default value of two meters.\n     *\n     * @returns {number} Altitude, in meters.\n     */\n    public get alt(): number {\n        return this._fill.calt;\n    }\n\n    /**\n     * Get ca.\n     *\n     * @description If the SfM computed compass angle exists it will\n     * be returned, otherwise the original EXIF compass angle.\n     *\n     * @returns {number} Compass angle, measured in degrees.\n     */\n    public get ca(): number {\n        return this._fill.cca != null ? this._fill.cca : this._fill.ca;\n    }\n\n    /**\n     * Get capturedAt.\n     *\n     * @returns {number} Timestamp when the image was captured.\n     */\n    public get capturedAt(): number {\n        return this._fill.captured_at;\n    }\n\n    /**\n     * Get computedCA.\n     *\n     * @description Will not be set if SfM has not been run.\n     *\n     * @returns {number} SfM computed compass angle, measured in degrees.\n     */\n    public get computedCA(): number {\n        return this._fill.cca;\n    }\n\n    /**\n     * Get computedLatLon.\n     *\n     * @description Will not be set if SfM has not been run.\n     *\n     * @returns {ILatLon} SfM computed latitude longitude in WGS84 datum,\n     * measured in degrees.\n     */\n    public get computedLatLon(): ILatLon {\n        return this._core.cl;\n    }\n\n    /**\n     * Get focal.\n     *\n     * @description Will not be set if SfM has not been run.\n     *\n     * @returns {number} SfM computed focal length.\n     */\n    public get focal(): number {\n        return this._fill.cfocal;\n    }\n\n    /**\n     * Get full.\n     *\n     * @description The library ensures that the current node will\n     * always be full.\n     *\n     * @returns {boolean} Value indicating whether the node has all\n     * properties filled.\n     */\n    public get full(): boolean {\n        return this._fill != null;\n    }\n\n    /**\n     * Get fullPano.\n     *\n     * @returns {boolean} Value indicating whether the node is a complete\n     * 360 panorama.\n     */\n    public get fullPano(): boolean {\n        return this._fill.gpano != null &&\n            this._fill.gpano.CroppedAreaLeftPixels === 0 &&\n            this._fill.gpano.CroppedAreaTopPixels === 0 &&\n            this._fill.gpano.CroppedAreaImageWidthPixels === this._fill.gpano.FullPanoWidthPixels &&\n            this._fill.gpano.CroppedAreaImageHeightPixels === this._fill.gpano.FullPanoHeightPixels;\n    }\n\n    /**\n     * Get gpano.\n     *\n     * @description Will not be set for non panoramic images.\n     *\n     * @returns {IGPano} Panorama information for panorama images.\n     */\n    public get gpano(): IGPano {\n        return this._fill.gpano;\n    }\n\n    /**\n     * Get height.\n     *\n     * @returns {number} Height of original image, not adjusted\n     * for orientation.\n     */\n    public get height(): number {\n        return this._fill.height;\n    }\n\n    /**\n     * Get image.\n     *\n     * @description The image will always be set on the current node.\n     *\n     * @returns {HTMLImageElement} Cached image element of the node.\n     */\n    public get image(): HTMLImageElement {\n        return this._cache.image;\n    }\n\n    /**\n     * Get key.\n     *\n     * @returns {string} Unique key of the node.\n     */\n    public get key(): string {\n        return this._core.key;\n    }\n\n    /**\n     * Get latLon.\n     *\n     * @description If the SfM computed latitude longitude exist\n     * it will be returned, otherwise the original EXIF latitude\n     * longitude.\n     *\n     * @returns {ILatLon} Latitude longitude in WGS84 datum,\n     * measured in degrees.\n     */\n    public get latLon(): ILatLon {\n        return this._core.cl != null ? this._core.cl : this._core.l;\n    }\n\n    /**\n     * Get loadStatus.\n     *\n     * @returns {ILoadStatus} Value indicating the load status\n     * of the mesh and image.\n     */\n    public get loadStatus(): ILoadStatus {\n        return this._cache.loadStatus;\n    }\n\n    /**\n     * Get merged.\n     *\n     * @returns {boolean} Value indicating whether SfM has been\n     * run on the node and the node has been merged into a\n     * connected component.\n     */\n    public get merged(): boolean {\n        return this._fill != null &&\n            this._fill.merge_version != null &&\n            this._fill.merge_version > 0;\n    }\n\n    /**\n     * Get mergeCC.\n     *\n     * @description Will not be set if SfM has not yet been run on\n     * node.\n     *\n     * @returns {number} SfM connected component key to which\n     * image belongs.\n     */\n    public get mergeCC(): number {\n        return this._fill.merge_cc;\n    }\n\n    /**\n     * Get mergeVersion.\n     *\n     * @returns {number} Version for which SfM was run and image was merged.\n     */\n    public get mergeVersion(): number {\n        return this._fill.merge_version;\n    }\n\n    /**\n     * Get mesh.\n     *\n     * @description The mesh will always be set on the current node.\n     *\n     * @returns {IMesh} SfM triangulated mesh of reconstructed\n     * atomic 3D points.\n     */\n    public get mesh(): IMesh {\n        return this._cache.mesh;\n    }\n\n    /**\n     * Get orientation.\n     *\n     * @returns {number} EXIF orientation of original image.\n     */\n    public get orientation(): number {\n        return this._fill.orientation;\n    }\n\n    /**\n     * Get originalCA.\n     *\n     * @returns {number} Original EXIF compass angle, measured in\n     * degrees.\n     */\n    public get originalCA(): number {\n        return this._fill.ca;\n    }\n\n    /**\n     * Get originalLatLon.\n     *\n     * @returns {ILatLon} Original EXIF latitude longitude in\n     * WGS84 datum, measured in degrees.\n     */\n    public get originalLatLon(): ILatLon {\n        return this._core.l;\n    }\n\n    /**\n     * Get pano.\n     *\n     * @returns {boolean} Value indicating whether the node is a panorama.\n     * It could be a cropped or full panorama.\n     */\n    public get pano(): boolean {\n        return this._fill.gpano != null &&\n            this._fill.gpano.FullPanoWidthPixels != null;\n    }\n\n    /**\n     * Get projectKey.\n     *\n     * @returns {string} Unique key of the project to which\n     * the node belongs.\n     */\n    public get projectKey(): string {\n        return this._fill.project != null ?\n            this._fill.project.key :\n            null;\n    }\n\n    /**\n     * Get rotation.\n     *\n     * @description Will not be set if SfM has not been run.\n     *\n     * @returns {Array<number>} Rotation vector in angle axis representation.\n     */\n    public get rotation(): number[] {\n        return this._fill.c_rotation;\n    }\n\n    /**\n     * Get scale.\n     *\n     * @description Will not be set if SfM has not been run.\n     *\n     * @returns {number} Scale of atomic reconstruction.\n     */\n    public get scale(): number {\n        return this._fill.atomic_scale;\n    }\n\n    /**\n     * Get sequenceKey.\n     *\n     * @returns {string} Unique key of the sequence to which\n     * the node belongs.\n     */\n    public get sequenceKey(): string {\n        return this._core.sequence.key;\n    }\n\n    /**\n     * Get sequenceEdges.\n     *\n     * @returns {IEdgeStatus} Value describing the status of the\n     * sequence edges.\n     */\n    public get sequenceEdges(): IEdgeStatus {\n        return this._cache.sequenceEdges;\n    }\n\n    /**\n     * Get sequenceEdges$.\n     *\n     * @returns {Observable<IEdgeStatus>} Observable emitting\n     * values describing the status of the sequence edges.\n     */\n    public get sequenceEdges$(): Observable<IEdgeStatus> {\n        return this._cache.sequenceEdges$;\n    }\n\n    /**\n     * Get spatialEdges.\n     *\n     * @returns {IEdgeStatus} Value describing the status of the\n     * spatial edges.\n     */\n    public get spatialEdges(): IEdgeStatus {\n        return this._cache.spatialEdges;\n    }\n\n    /**\n     * Get spatialEdges$.\n     *\n     * @returns {Observable<IEdgeStatus>} Observable emitting\n     * values describing the status of the spatial edges.\n     */\n    public get spatialEdges$(): Observable<IEdgeStatus> {\n        return this._cache.spatialEdges$;\n    }\n\n    /**\n     * Get userKey.\n     *\n     * @returns {string} Unique key of the user who uploaded\n     * the image.\n     */\n    public get userKey(): string {\n        return this._fill.user.key;\n    }\n\n    /**\n     * Get username.\n     *\n     * @returns {string} Username of the user who uploaded\n     * the image.\n     */\n    public get username(): string {\n        return this._fill.user.username;\n    }\n\n    /**\n     * Get width.\n     *\n     * @returns {number} Width of original image, not\n     * adjusted for orientation.\n     */\n    public get width(): number {\n        return this._fill.width;\n    }\n\n    /**\n     * Cache the image and mesh assets.\n     *\n     * @description The assets are always cached internally by the\n     * library prior to setting a node as the current node.\n     *\n     * @returns {Observable<Node>} Observable emitting this node whenever the\n     * load status has changed and when the mesh or image has been fully loaded.\n     */\n    public cacheAssets$(): Observable<Node> {\n        return this._cache.cacheAssets$(this.key, this.pano, this.merged)\n            .map(\n                (cache: NodeCache): Node => {\n                    return this;\n                });\n    }\n\n    public cacheImage$(imageSize: ImageSize): Observable<Node> {\n        return this._cache.cacheImage$(this.key, imageSize)\n            .map(\n                (cache: NodeCache): Node => {\n                    return this;\n                });\n    }\n\n    /**\n     * Cache the sequence edges.\n     *\n     * @description The sequence edges are cached asynchronously\n     * internally by the library.\n     *\n     * @param {Array<IEdge>} edges - Sequence edges to cache.\n     */\n    public cacheSequenceEdges(edges: IEdge[]): void {\n        this._cache.cacheSequenceEdges(edges);\n    }\n\n    /**\n     * Cache the spatial edges.\n     *\n     * @description The spatial edges are cached asynchronously\n     * internally by the library.\n     *\n     * @param {Array<IEdge>} edges - Spatial edges to cache.\n     */\n    public cacheSpatialEdges(edges: IEdge[]): void {\n        this._cache.cacheSpatialEdges(edges);\n    }\n\n    /**\n     * Dispose the node.\n     *\n     * @description Disposes all cached assets.\n     */\n    public dispose(): void {\n        if (this._cache != null) {\n            this._cache.dispose();\n            this._cache = null;\n        }\n\n        this._core = null;\n        this._fill = null;\n    }\n\n    /**\n     * Initialize the node cache.\n     *\n     * @description The node cache is initialized internally by\n     * the library.\n     *\n     * @param {NodeCache} cache - The node cache to set as cache.\n     */\n    public initializeCache(cache: NodeCache): void {\n        if (this._cache != null) {\n            throw new Error(`Node cache already initialized (${this.key}).`);\n        }\n\n        this._cache = cache;\n    }\n\n    /**\n     * Fill the node with all properties.\n     *\n     * @description The node is filled internally by\n     * the library.\n     *\n     * @param {IFillNode} fill - The fill node struct.\n     */\n    public makeFull(fill: IFillNode): void {\n        if (fill == null) {\n            throw new Error(\"Fill can not be null.\");\n        }\n\n        this._fill = fill;\n    }\n\n    /**\n     * Reset the sequence edges.\n     */\n    public resetSequenceEdges(): void {\n        this._cache.resetSequenceEdges();\n    }\n\n    /**\n     * Reset the spatial edges.\n     */\n    public resetSpatialEdges(): void {\n        this._cache.resetSpatialEdges();\n    }\n\n    /**\n     * Clears the image and mesh assets, aborts\n     * any outstanding requests and resets edges.\n     */\n    public uncache(): void {\n        if (this._cache == null) {\n            return;\n        }\n\n        this._cache.dispose();\n        this._cache = null;\n    }\n}\n\nexport default Node;\n",
     "import {Subject} from \"rxjs/Subject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subscriber} from \"rxjs/Subscriber\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/publishReplay\";\n\nimport {IEdge} from \"../Edge\";\nimport {\n    IEdgeStatus,\n    IMesh,\n    ILoadStatus,\n    ILoadStatusObject,\n    MeshReader,\n} from \"../Graph\";\nimport {\n    Settings,\n    Urls,\n} from \"../Utils\";\nimport {ImageSize} from \"../Viewer\";\n\n/**\n * @class NodeCache\n *\n * @classdesc Represents the cached properties of a node.\n */\nexport class NodeCache {\n    private _disposed: boolean;\n\n    private _image: HTMLImageElement;\n    private _loadStatus: ILoadStatus;\n    private _mesh: IMesh;\n    private _sequenceEdges: IEdgeStatus;\n    private _spatialEdges: IEdgeStatus;\n\n    private _imageRequest: XMLHttpRequest;\n    private _meshRequest: XMLHttpRequest;\n\n    private _sequenceEdgesChanged$: Subject<IEdgeStatus>;\n    private _sequenceEdges$: Observable<IEdgeStatus>;\n    private _spatialEdgesChanged$: Subject<IEdgeStatus>;\n    private _spatialEdges$: Observable<IEdgeStatus>;\n\n    private _cachingAssets$: Observable<NodeCache>;\n\n    private _sequenceEdgesSubscription: Subscription;\n    private _spatialEdgesSubscription: Subscription;\n\n    /**\n     * Create a new node cache instance.\n     */\n    constructor() {\n        this._disposed = false;\n\n        this._image = null;\n        this._loadStatus = { loaded: 0, total: 0 };\n        this._mesh = null;\n        this._sequenceEdges = { cached: false, edges: [] };\n        this._spatialEdges = { cached: false, edges: [] };\n\n        this._sequenceEdgesChanged$ = new Subject<IEdgeStatus>();\n        this._sequenceEdges$ = this._sequenceEdgesChanged$\n            .startWith(this._sequenceEdges)\n            .publishReplay(1)\n            .refCount();\n\n        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(() => { /*noop*/ });\n\n        this._spatialEdgesChanged$ = new Subject<IEdgeStatus>();\n        this._spatialEdges$ = this._spatialEdgesChanged$\n            .startWith(this._spatialEdges)\n            .publishReplay(1)\n            .refCount();\n\n        this._spatialEdgesSubscription = this._spatialEdges$.subscribe(() => { /*noop*/ });\n\n        this._cachingAssets$ = null;\n    }\n\n    /**\n     * Get image.\n     *\n     * @description Will not be set when assets have not been cached\n     * or when the object has been disposed.\n     *\n     * @returns {HTMLImageElement} Cached image element of the node.\n     */\n    public get image(): HTMLImageElement {\n        return this._image;\n    }\n\n    /**\n     * Get loadStatus.\n     *\n     * @returns {ILoadStatus} Value indicating the load status\n     * of the mesh and image.\n     */\n    public get loadStatus(): ILoadStatus {\n        return this._loadStatus;\n    }\n\n    /**\n     * Get mesh.\n     *\n     * @description Will not be set when assets have not been cached\n     * or when the object has been disposed.\n     *\n     * @returns {IMesh} SfM triangulated mesh of reconstructed\n     * atomic 3D points.\n     */\n    public get mesh(): IMesh {\n        return this._mesh;\n    }\n\n    /**\n     * Get sequenceEdges.\n     *\n     * @returns {IEdgeStatus} Value describing the status of the\n     * sequence edges.\n     */\n    public get sequenceEdges(): IEdgeStatus {\n        return this._sequenceEdges;\n    }\n\n    /**\n     * Get sequenceEdges$.\n     *\n     * @returns {Observable<IEdgeStatus>} Observable emitting\n     * values describing the status of the sequence edges.\n     */\n    public get sequenceEdges$(): Observable<IEdgeStatus> {\n        return this._sequenceEdges$;\n    }\n\n    /**\n     * Get spatialEdges.\n     *\n     * @returns {IEdgeStatus} Value describing the status of the\n     * spatial edges.\n     */\n    public get spatialEdges(): IEdgeStatus {\n        return this._spatialEdges;\n    }\n\n    /**\n     * Get spatialEdges$.\n     *\n     * @returns {Observable<IEdgeStatus>} Observable emitting\n     * values describing the status of the spatial edges.\n     */\n    public get spatialEdges$(): Observable<IEdgeStatus> {\n        return this._spatialEdges$;\n    }\n\n    /**\n     * Cache the image and mesh assets.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @param {boolean} pano - Value indicating whether node is a panorama.\n     * @param {boolean} merged - Value indicating whether node is merged.\n     * @returns {Observable<NodeCache>} Observable emitting this node\n     * cache whenever the load status has changed and when the mesh or image\n     * has been fully loaded.\n     */\n    public cacheAssets$(key: string, pano: boolean, merged: boolean): Observable<NodeCache> {\n        if (this._cachingAssets$ != null) {\n            return this._cachingAssets$;\n        }\n\n        let imageSize: ImageSize = pano ?\n            Settings.basePanoramaSize :\n            Settings.baseImageSize;\n\n        this._cachingAssets$ = Observable\n            .combineLatest(\n                this._cacheImage$(key, imageSize),\n                this._cacheMesh$(key, merged),\n                (imageStatus: ILoadStatusObject<HTMLImageElement>, meshStatus: ILoadStatusObject<IMesh>): NodeCache => {\n                    this._loadStatus.loaded = 0;\n                    this._loadStatus.total = 0;\n\n                    if (meshStatus) {\n                        this._mesh = meshStatus.object;\n                        this._loadStatus.loaded += meshStatus.loaded.loaded;\n                        this._loadStatus.total += meshStatus.loaded.total;\n                    }\n\n                    if (imageStatus) {\n                        this._image = imageStatus.object;\n                        this._loadStatus.loaded += imageStatus.loaded.loaded;\n                        this._loadStatus.total += imageStatus.loaded.total;\n                    }\n\n                    return this;\n                })\n            .finally(\n                (): void => {\n                    this._cachingAssets$ = null;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        return this._cachingAssets$;\n    }\n\n    /**\n     * Cache an image with a higher resolution than the current one.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @param {ImageSize} imageSize - The size to cache.\n     * @returns {Observable<NodeCache>} Observable emitting a single item,\n     * the node cache, when the image has been cached. If supplied image\n     * size is not larger than the current image size the node cache is\n     * returned immediately.\n     */\n    public cacheImage$(key: string, imageSize: ImageSize): Observable<NodeCache> {\n        if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) {\n            return Observable.of<NodeCache>(this);\n        }\n\n        return this._cacheImage$(key, imageSize)\n            .first(\n                (status: ILoadStatusObject<HTMLImageElement>): boolean => {\n                    return status.object != null;\n                })\n            .do(\n                (status: ILoadStatusObject<HTMLImageElement>): void => {\n                    this._disposeImage();\n                    this._image = status.object;\n                })\n            .map(\n                (imageStatus: ILoadStatusObject<HTMLImageElement>): NodeCache => {\n                    return this;\n                });\n    }\n\n    /**\n     * Cache the sequence edges.\n     *\n     * @param {Array<IEdge>} edges - Sequence edges to cache.\n     */\n    public cacheSequenceEdges(edges: IEdge[]): void {\n        this._sequenceEdges = { cached: true, edges: edges };\n        this._sequenceEdgesChanged$.next(this._sequenceEdges);\n    }\n\n    /**\n     * Cache the spatial edges.\n     *\n     * @param {Array<IEdge>} edges - Spatial edges to cache.\n     */\n    public cacheSpatialEdges(edges: IEdge[]): void {\n        this._spatialEdges = { cached: true, edges: edges };\n        this._spatialEdgesChanged$.next(this._spatialEdges);\n    }\n\n    /**\n     * Dispose the node cache.\n     *\n     * @description Disposes all cached assets and unsubscribes to\n     * all streams.\n     */\n    public dispose(): void {\n        this._sequenceEdgesSubscription.unsubscribe();\n        this._spatialEdgesSubscription.unsubscribe();\n\n        this._disposeImage();\n\n        this._mesh = null;\n        this._loadStatus.loaded = 0;\n        this._loadStatus.total = 0;\n        this._sequenceEdges = { cached: false, edges: [] };\n        this._spatialEdges = { cached: false, edges: [] };\n\n        this._sequenceEdgesChanged$.next(this._sequenceEdges);\n        this._spatialEdgesChanged$.next(this._spatialEdges);\n\n        this._disposed = true;\n\n        if (this._imageRequest != null) {\n            this._imageRequest.abort();\n        }\n\n        if (this._meshRequest != null) {\n            this._meshRequest.abort();\n        }\n    }\n\n    /**\n     * Reset the sequence edges.\n     */\n    public resetSequenceEdges(): void {\n        this._sequenceEdges = { cached: false, edges: [] };\n        this._sequenceEdgesChanged$.next(this._sequenceEdges);\n    }\n\n    /**\n     * Reset the spatial edges.\n     */\n    public resetSpatialEdges(): void {\n        this._spatialEdges = { cached: false, edges: [] };\n        this._spatialEdgesChanged$.next(this._spatialEdges);\n    }\n\n    /**\n     * Cache the image.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @param {boolean} pano - Value indicating whether node is a panorama.\n     * @returns {Observable<ILoadStatusObject<HTMLImageElement>>} Observable\n     * emitting a load status object every time the load status changes\n     * and completes when the image is fully loaded.\n     */\n    private _cacheImage$(key: string, imageSize: ImageSize): Observable<ILoadStatusObject<HTMLImageElement>> {\n        return Observable.create(\n            (subscriber: Subscriber<ILoadStatusObject<HTMLImageElement>>): void => {\n                let xmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n                xmlHTTP.open(\"GET\", Urls.thumbnail(key, imageSize), true);\n                xmlHTTP.responseType = \"arraybuffer\";\n                xmlHTTP.timeout = 15000;\n\n                xmlHTTP.onload = (pe: ProgressEvent) => {\n                    if (xmlHTTP.status !== 200) {\n                        this._imageRequest = null;\n\n                        subscriber.error(\n                            new Error(`Failed to fetch image (${key}). Status: ${xmlHTTP.status}, ${xmlHTTP.statusText}`));\n\n                        return;\n                    }\n\n                    let image: HTMLImageElement = new Image();\n                    image.crossOrigin = \"Anonymous\";\n\n                    image.onload = (e: Event) => {\n                        this._imageRequest = null;\n\n                        if (this._disposed) {\n                            window.URL.revokeObjectURL(image.src);\n                            subscriber.error(new Error(`Image load was aborted (${key})`));\n\n                            return;\n                        }\n\n                        subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image });\n                        subscriber.complete();\n                    };\n\n                    image.onerror = (error: ErrorEvent) => {\n                        this._imageRequest = null;\n\n                        subscriber.error(new Error(`Failed to load image (${key})`));\n                    };\n\n                    let blob: Blob = new Blob([xmlHTTP.response]);\n                    image.src = window.URL.createObjectURL(blob);\n                };\n\n                xmlHTTP.onprogress = (pe: ProgressEvent) => {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    subscriber.next({loaded: { loaded: pe.loaded, total: pe.total }, object: null });\n                };\n\n                xmlHTTP.onerror = (error: Event) => {\n                    this._imageRequest = null;\n\n                    subscriber.error(new Error(`Failed to fetch image (${key})`));\n                };\n\n                xmlHTTP.ontimeout = (e: Event) => {\n                    this._imageRequest = null;\n\n                    subscriber.error(new Error(`Image request timed out (${key})`));\n                };\n\n                xmlHTTP.onabort = (event: Event) => {\n                    this._imageRequest = null;\n\n                    subscriber.error(new Error(`Image request was aborted (${key})`));\n                };\n\n                this._imageRequest = xmlHTTP;\n\n                xmlHTTP.send(null);\n            });\n    }\n\n    /**\n     * Cache the mesh.\n     *\n     * @param {string} key - Key of the node to cache.\n     * @param {boolean} merged - Value indicating whether node is merged.\n     * @returns {Observable<ILoadStatusObject<IMesh>>} Observable emitting\n     * a load status object every time the load status changes and completes\n     * when the mesh is fully loaded.\n     */\n    private _cacheMesh$(key: string, merged: boolean): Observable<ILoadStatusObject<IMesh>> {\n        return Observable.create(\n            (subscriber: Subscriber<ILoadStatusObject<IMesh>>): void => {\n                if (!merged) {\n                    subscriber.next(this._createEmptyMeshLoadStatus());\n                    subscriber.complete();\n                    return;\n                }\n\n                let xmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n                xmlHTTP.open(\"GET\", Urls.protoMesh(key), true);\n                xmlHTTP.responseType = \"arraybuffer\";\n                xmlHTTP.timeout = 15000;\n\n                xmlHTTP.onload = (pe: ProgressEvent) => {\n                    this._meshRequest = null;\n\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    let mesh: IMesh = xmlHTTP.status === 200 ?\n                        MeshReader.read(new Buffer(xmlHTTP.response)) :\n                        { faces: [], vertices: [] };\n\n                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: mesh });\n                    subscriber.complete();\n                };\n\n                xmlHTTP.onprogress = (pe: ProgressEvent) => {\n                    if (this._disposed) {\n                        return;\n                    }\n\n                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });\n                };\n\n                xmlHTTP.onerror = (e: Event) => {\n                    this._meshRequest = null;\n\n                    console.error(`Failed to cache mesh (${key})`);\n\n                    subscriber.next(this._createEmptyMeshLoadStatus());\n                    subscriber.complete();\n                };\n\n                xmlHTTP.ontimeout = (e: Event) => {\n                    this._meshRequest = null;\n\n                    console.error(`Mesh request timed out (${key})`);\n\n                    subscriber.next(this._createEmptyMeshLoadStatus());\n                    subscriber.complete();\n                };\n\n                xmlHTTP.onabort = (e: Event) => {\n                    this._meshRequest = null;\n\n                    subscriber.error(new Error(`Mesh request was aborted (${key})`));\n                };\n\n                this._meshRequest = xmlHTTP;\n\n                xmlHTTP.send(null);\n            });\n    }\n\n    /**\n     * Create a load status object with an empty mesh.\n     *\n     * @returns {ILoadStatusObject<IMesh>} Load status object\n     * with empty mesh.\n     */\n    private _createEmptyMeshLoadStatus(): ILoadStatusObject<IMesh> {\n        return {\n            loaded: { loaded: 0, total: 0 },\n            object: { faces: [], vertices: [] },\n        };\n    }\n\n    private _disposeImage(): void {\n        if (this._image != null) {\n            window.URL.revokeObjectURL(this._image.src);\n        }\n\n        this._image = null;\n    }\n}\n\nexport default NodeCache;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\n\nimport {ISequence} from \"../API\";\n\n/**\n * @class Sequence\n *\n * @classdesc Represents a sequence of ordered nodes.\n */\nexport class Sequence {\n    private _key: string;\n    private _keys: string[];\n\n    /**\n     * Create a new sequene instance.\n     *\n     * @param {ISequence} sequence - Raw sequence data.\n     */\n    constructor(sequence: ISequence) {\n        this._key = sequence.key;\n        this._keys = sequence.keys;\n    }\n\n    /**\n     * Get key.\n     *\n     * @returns {string} Unique sequence key.\n     */\n    public get key(): string {\n        return this._key;\n    }\n\n    /**\n     * Get keys.\n     *\n     * @returns {Array<string>} Array of ordered node keys in the sequence.\n     */\n    public get keys(): string[] {\n        return this._keys;\n    }\n\n    /**\n     * Dispose the sequence.\n     *\n     * @description Disposes all cached assets.\n     */\n    public dispose(): void {\n        this._key = null;\n        this._keys = null;\n    }\n\n    /**\n     * Find the next node key in the sequence with respect to\n     * the provided node key.\n     *\n     * @param {string} key - Reference node key.\n     * @returns {string} Next key in sequence if it exists, null otherwise.\n     */\n    public findNextKey(key: string): string {\n        let i: number = _.indexOf(this._keys, key);\n\n        if ((i + 1) >= this._keys.length || i === -1) {\n            return null;\n        } else {\n            return this._keys[i + 1];\n        }\n    }\n\n    /**\n     * Find the previous node key in the sequence with respect to\n     * the provided node key.\n     *\n     * @param {string} key - Reference node key.\n     * @returns {string} Previous key in sequence if it exists, null otherwise.\n     */\n    public findPrevKey(key: string): string {\n        let i: number = _.indexOf(this._keys, key);\n\n        if (i === 0 || i === -1) {\n            return null;\n        } else {\n            return this._keys[i - 1];\n        }\n    }\n}\n\nexport default Sequence;\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {\n    Node,\n    Sequence,\n} from \"../../Graph\";\nimport\n{\n    EdgeDirection,\n    IStep,\n    ITurn,\n    IPano,\n    IEdge,\n    IPotentialEdge,\n    EdgeCalculatorSettings,\n    EdgeCalculatorDirections,\n    EdgeCalculatorCoefficients,\n} from \"../../Edge\";\nimport {ArgumentMapillaryError} from \"../../Error\";\nimport {GeoCoords, Spatial} from \"../../Geo\";\n\n/**\n * @class EdgeCalculator\n *\n * @classdesc Represents a class for calculating node edges.\n */\nexport class EdgeCalculator {\n\n    private _spatial: Spatial;\n    private _geoCoords: GeoCoords;\n\n    private _settings: EdgeCalculatorSettings;\n    private _directions: EdgeCalculatorDirections;\n    private _coefficients: EdgeCalculatorCoefficients;\n\n    /**\n     * Create a new edge calculator instance.\n     *\n     * @param {EdgeCalculatorSettings} settings - Settings struct.\n     * @param {EdgeCalculatorDirections} directions - Directions struct.\n     * @param {EdgeCalculatorCoefficients} coefficients - Coefficients struct.\n     */\n    constructor(\n        settings?: EdgeCalculatorSettings,\n        directions?: EdgeCalculatorDirections,\n        coefficients?: EdgeCalculatorCoefficients) {\n\n        this._spatial = new Spatial();\n        this._geoCoords = new GeoCoords();\n\n        this._settings = settings != null ? settings : new EdgeCalculatorSettings();\n        this._directions = directions != null ? directions : new EdgeCalculatorDirections();\n        this._coefficients = coefficients != null ? coefficients : new EdgeCalculatorCoefficients();\n    }\n\n    /**\n     * Returns the potential edges to destination nodes for a set\n     * of nodes with respect to a source node.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<Node>} nodes - Potential destination nodes.\n     * @param {Array<string>} fallbackKeys - Keys for destination nodes that should\n     * be returned even if they do not meet the criteria for a potential edge.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public getPotentialEdges(node: Node, potentialNodes: Node[], fallbackKeys: string[]): IPotentialEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (!node.merged) {\n            return [];\n        }\n\n        let currentDirection: THREE.Vector3 =\n            this._spatial.viewingDirection(node.rotation);\n        let currentVerticalDirection: number =\n            this._spatial.angleToPlane(currentDirection.toArray(), [0, 0, 1]);\n\n        let potentialEdges: IPotentialEdge[] = [];\n\n        for (let potential of potentialNodes) {\n            if (!potential.merged ||\n                potential.key === node.key) {\n                continue;\n            }\n\n            let enu: number[] = this._geoCoords.geodeticToEnu(\n                potential.latLon.lat,\n                potential.latLon.lon,\n                potential.alt,\n                node.latLon.lat,\n                node.latLon.lon,\n                node.alt);\n\n            let motion: THREE.Vector3 = new THREE.Vector3(enu[0], enu[1], enu[2]);\n            let distance: number = motion.length();\n\n            if (distance > this._settings.maxDistance &&\n                fallbackKeys.indexOf(potential.key) < 0) {\n                continue;\n            }\n\n            let motionChange: number = this._spatial.angleBetweenVector2(\n                currentDirection.x,\n                currentDirection.y,\n                motion.x,\n                motion.y);\n\n            let verticalMotion: number = this._spatial.angleToPlane(motion.toArray(), [0, 0, 1]);\n\n            let direction: THREE.Vector3 =\n                this._spatial.viewingDirection(potential.rotation);\n\n            let directionChange: number = this._spatial.angleBetweenVector2(\n                currentDirection.x,\n                currentDirection.y,\n                direction.x,\n                direction.y);\n\n            let verticalDirection: number = this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);\n            let verticalDirectionChange: number = verticalDirection - currentVerticalDirection;\n\n            let rotation: number = this._spatial.relativeRotationAngle(\n                node.rotation,\n                potential.rotation);\n\n            let worldMotionAzimuth: number =\n                this._spatial.angleBetweenVector2(1, 0, motion.x, motion.y);\n\n            let sameSequence: boolean = potential.sequenceKey != null &&\n                node.sequenceKey != null &&\n                potential.sequenceKey === node.sequenceKey;\n\n            let sameMergeCC: boolean =\n                 (potential.mergeCC == null && node.mergeCC == null) ||\n                 potential.mergeCC === node.mergeCC;\n\n            let sameUser: boolean =\n                potential.userKey === node.userKey;\n\n            let potentialEdge: IPotentialEdge = {\n                capturedAt: potential.capturedAt,\n                croppedPano: potential.pano && !potential.fullPano,\n                directionChange: directionChange,\n                distance: distance,\n                fullPano: potential.fullPano,\n                key: potential.key,\n                motionChange: motionChange,\n                rotation: rotation,\n                sameMergeCC: sameMergeCC,\n                sameSequence: sameSequence,\n                sameUser: sameUser,\n                sequenceKey: potential.sequenceKey,\n                verticalDirectionChange: verticalDirectionChange,\n                verticalMotion: verticalMotion,\n                worldMotionAzimuth: worldMotionAzimuth,\n            };\n\n            potentialEdges.push(potentialEdge);\n        }\n\n        return potentialEdges;\n    }\n\n    /**\n     * Computes the sequence edges for a node.\n     *\n     * @param {Node} node - Source node.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeSequenceEdges(node: Node, sequence: Sequence): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (node.sequenceKey !== sequence.key) {\n            throw new ArgumentMapillaryError(\"Node and sequence does not correspond.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        let nextKey: string = sequence.findNextKey(node.key);\n        if (nextKey != null) {\n            edges.push({\n                data: {\n                    direction: EdgeDirection.Next,\n                    worldMotionAzimuth: Number.NaN,\n                },\n                from: node.key,\n                to: nextKey,\n            });\n        }\n\n        let prevKey: string = sequence.findPrevKey(node.key);\n        if (prevKey != null) {\n            edges.push({\n                data: {\n                    direction: EdgeDirection.Prev,\n                    worldMotionAzimuth: Number.NaN,\n                },\n                from: node.key,\n                to: prevKey,\n            });\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the similar edges for a node.\n     *\n     * @description Similar edges for perspective images and cropped panoramas\n     * look roughly in the same direction and are positioned closed to the node.\n     * Similar edges for full panoramas only target other full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeSimilarEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let nodeFullPano: boolean = node.fullPano;\n        let sequenceGroups: { [key: string]: IPotentialEdge[] } = {};\n\n        for (let potentialEdge of potentialEdges) {\n            if (potentialEdge.sequenceKey == null) {\n                continue;\n            }\n\n            if (potentialEdge.sameSequence ||\n                !potentialEdge.sameMergeCC) {\n                continue;\n            }\n\n            if (nodeFullPano) {\n                if (!potentialEdge.fullPano) {\n                    continue;\n                }\n            } else {\n                if (!potentialEdge.fullPano &&\n                    Math.abs(potentialEdge.directionChange) > this._settings.similarMaxDirectionChange) {\n                    continue;\n                }\n            }\n\n            if (potentialEdge.distance > this._settings.similarMaxDistance) {\n                continue;\n            }\n\n            if (potentialEdge.sameUser &&\n                Math.abs(potentialEdge.capturedAt - node.capturedAt) <\n                    this._settings.similarMinTimeDifference) {\n                continue;\n            }\n\n            if (sequenceGroups[potentialEdge.sequenceKey] == null) {\n                sequenceGroups[potentialEdge.sequenceKey] = [];\n            }\n\n            sequenceGroups[potentialEdge.sequenceKey].push(potentialEdge);\n\n        }\n\n        let similarEdges: IPotentialEdge[] = [];\n\n        let calculateScore: (potentialEdge: IPotentialEdge) => number =\n            node.fullPano ?\n                (potentialEdge: IPotentialEdge): number => {\n                    return potentialEdge.distance;\n                } :\n                (potentialEdge: IPotentialEdge): number => {\n                    return this._coefficients.similarDistance * potentialEdge.distance +\n                        this._coefficients.similarRotation * potentialEdge.rotation;\n                };\n\n        for (let sequenceKey in sequenceGroups) {\n            if (!sequenceGroups.hasOwnProperty(sequenceKey)) {\n                continue;\n            }\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let similarEdge: IPotentialEdge = null;\n\n            for (let potentialEdge of sequenceGroups[sequenceKey]) {\n                let score: number = calculateScore(potentialEdge);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    similarEdge = potentialEdge;\n                }\n            }\n\n            if (similarEdge == null) {\n                continue;\n            }\n\n            similarEdges.push(similarEdge);\n        }\n\n\n        return similarEdges\n            .map<IEdge>(\n                (potentialEdge: IPotentialEdge): IEdge => {\n                    return {\n                        data: {\n                            direction: EdgeDirection.Similar,\n                            worldMotionAzimuth: potentialEdge.worldMotionAzimuth,\n                        },\n                        from: node.key,\n                        to: potentialEdge.key,\n                    };\n                });\n    }\n\n    /**\n     * Computes the step edges for a perspective node.\n     *\n     * @description Step edge targets can only be other perspective nodes.\n     * Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @param {string} prevKey - Key of previous node in sequence.\n     * @param {string} prevKey - Key of next node in sequence.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeStepEdges(\n        node: Node,\n        potentialEdges: IPotentialEdge[],\n        prevKey: string,\n        nextKey: string): IEdge[] {\n\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        if (node.pano) {\n            return edges;\n        }\n\n        for (let k in this._directions.steps) {\n            if (!this._directions.steps.hasOwnProperty(k)) {\n                continue;\n            }\n\n            let step: IStep = this._directions.steps[k];\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n            let fallback: IPotentialEdge = null;\n\n            for (let potential of potentialEdges) {\n                if (potential.croppedPano || potential.fullPano) {\n                    continue;\n                }\n\n                if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) {\n                    continue;\n                }\n\n                let motionDifference: number =\n                    this._spatial.angleDifference(step.motionChange, potential.motionChange);\n                let directionMotionDifference: number =\n                    this._spatial.angleDifference(potential.directionChange, motionDifference);\n                let drift: number =\n                    Math.max(Math.abs(motionDifference), Math.abs(directionMotionDifference));\n\n                if (Math.abs(drift) > this._settings.stepMaxDrift) {\n                    continue;\n                }\n\n                let potentialKey: string = potential.key;\n                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {\n                    fallback = potential;\n                }\n\n                if (potential.distance > this._settings.stepMaxDistance) {\n                    continue;\n                }\n\n                motionDifference = Math.sqrt(\n                    motionDifference * motionDifference +\n                    potential.verticalMotion * potential.verticalMotion);\n\n                let score: number =\n                    this._coefficients.stepPreferredDistance *\n                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /\n                    this._settings.stepMaxDistance +\n                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +\n                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +\n                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            edge = edge == null ? fallback : edge;\n            if (edge != null) {\n                edges.push({\n                    data: {\n                        direction: step.direction,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            }\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the turn edges for a perspective node.\n     *\n     * @description Turn edge targets can only be other perspective images.\n     * Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeTurnEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        if (node.pano) {\n            return edges;\n        }\n\n        for (let k in this._directions.turns) {\n            if (!this._directions.turns.hasOwnProperty(k)) {\n                continue;\n            }\n\n            let turn: ITurn = this._directions.turns[k];\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n\n            for (let potential of potentialEdges) {\n                if (potential.croppedPano || potential.fullPano) {\n                    continue;\n                }\n\n                if (potential.distance > this._settings.turnMaxDistance) {\n                    continue;\n                }\n\n                let rig: boolean =\n                    turn.direction !== EdgeDirection.TurnU &&\n                    potential.distance < this._settings.turnMaxRigDistance &&\n                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;\n\n                let directionDifference: number = this._spatial.angleDifference(\n                    turn.directionChange, potential.directionChange);\n\n                let score: number;\n\n                if (\n                    rig &&\n                    potential.directionChange * turn.directionChange > 0 &&\n                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {\n                    score = -Math.PI / 2 + Math.abs(potential.directionChange);\n                } else {\n                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {\n                        continue;\n                    }\n\n                    let motionDifference: number = turn.motionChange ?\n                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;\n\n                    motionDifference = Math.sqrt(\n                        motionDifference * motionDifference +\n                        potential.verticalMotion * potential.verticalMotion);\n\n                    score =\n                        this._coefficients.turnDistance * potential.distance /\n                        this._settings.turnMaxDistance +\n                        this._coefficients.turnMotion * motionDifference / Math.PI +\n                        this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                        this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n                }\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            if (edge != null) {\n                edges.push({\n                    data: {\n                        direction: turn.direction,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            }\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the pano edges for a perspective node.\n     *\n     * @description Perspective to pano edge targets can only be\n     * full pano nodes. Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computePerspectiveToPanoEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (node.pano) {\n            return [];\n        }\n\n        let lowestScore: number = Number.MAX_VALUE;\n        let edge: IPotentialEdge = null;\n\n        for (let potential of potentialEdges) {\n            if (!potential.fullPano) {\n                continue;\n            }\n\n            let score: number =\n                this._coefficients.panoPreferredDistance *\n                Math.abs(potential.distance - this._settings.panoPreferredDistance) /\n                this._settings.panoMaxDistance +\n                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +\n                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n            if (score < lowestScore) {\n                lowestScore = score;\n                edge = potential;\n            }\n        }\n\n        if (edge == null) {\n            return [];\n        }\n\n        return [\n            {\n                data: {\n                    direction: EdgeDirection.Pano,\n                    worldMotionAzimuth: edge.worldMotionAzimuth,\n                },\n                from: node.key,\n                to: edge.key,\n            },\n        ];\n    }\n\n    /**\n     * Computes the full pano and step edges for a full pano node.\n     *\n     * @description Pano to pano edge targets can only be\n     * full pano nodes. Pano to step edge targets can only be perspective\n     * nodes.\n     * Returns an empty array for cropped panoramas and perspective nodes.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computePanoEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (!node.fullPano) {\n            return [];\n        }\n\n        let panoEdges: IEdge[] = [];\n        let potentialPanos: IPotentialEdge[] = [];\n        let potentialSteps: [EdgeDirection, IPotentialEdge][] = [];\n\n        for (let potential of potentialEdges) {\n            if (potential.distance > this._settings.panoMaxDistance) {\n                continue;\n            }\n\n            if (potential.fullPano) {\n                if (potential.distance < this._settings.panoMinDistance) {\n                    continue;\n                }\n\n                potentialPanos.push(potential);\n            } else {\n                if (potential.croppedPano) {\n                    continue;\n                }\n\n                for (let k in this._directions.panos) {\n                    if (!this._directions.panos.hasOwnProperty(k)) {\n                        continue;\n                    }\n\n                    let pano: IPano = this._directions.panos[k];\n\n                    let turn: number = this._spatial.angleDifference(\n                        potential.directionChange,\n                        potential.motionChange);\n\n                    let turnChange: number = this._spatial.angleDifference(pano.directionChange, turn);\n\n                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {\n                        continue;\n                    }\n\n                    potentialSteps.push([pano.direction, potential]);\n\n                    // break if step direction found\n                    break;\n                }\n            }\n        }\n\n        let maxRotationDifference: number = Math.PI / this._settings.panoMaxItems;\n        let occupiedAngles: number[] = [];\n        let stepAngles: number[] = [];\n\n        for (let index: number = 0; index < this._settings.panoMaxItems; index++) {\n            let rotation: number = index / this._settings.panoMaxItems * 2 * Math.PI;\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n\n            for (let potential of potentialPanos) {\n                let motionDifference: number = this._spatial.angleDifference(rotation, potential.motionChange);\n\n                if (Math.abs(motionDifference) > maxRotationDifference) {\n                    continue;\n                }\n\n                let occupiedDifference: number = Number.MAX_VALUE;\n                for (let occupiedAngle of occupiedAngles) {\n                    let difference: number = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));\n                    if (difference < occupiedDifference) {\n                        occupiedDifference = difference;\n                    }\n                }\n\n                if (occupiedDifference <= maxRotationDifference) {\n                    continue;\n                }\n\n                let score: number =\n                    this._coefficients.panoPreferredDistance *\n                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /\n                    this._settings.panoMaxDistance +\n                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +\n                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            if (edge != null) {\n                occupiedAngles.push(edge.motionChange);\n                panoEdges.push({\n                    data: {\n                        direction: EdgeDirection.Pano,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            } else {\n                stepAngles.push(rotation);\n            }\n        }\n\n        let occupiedStepAngles: {[direction: string]: number[] } = {};\n        occupiedStepAngles[EdgeDirection.Pano] = occupiedAngles;\n        occupiedStepAngles[EdgeDirection.StepForward] = [];\n        occupiedStepAngles[EdgeDirection.StepLeft] = [];\n        occupiedStepAngles[EdgeDirection.StepBackward] = [];\n        occupiedStepAngles[EdgeDirection.StepRight] = [];\n\n        for (let stepAngle of stepAngles) {\n            let occupations: [EdgeDirection, IPotentialEdge][] = [];\n\n            for (let k in this._directions.panos) {\n                if (!this._directions.panos.hasOwnProperty(k)) {\n                    continue;\n                }\n\n                let pano: IPano = this._directions.panos[k];\n\n                let allOccupiedAngles: number[] = occupiedStepAngles[EdgeDirection.Pano]\n                    .concat(occupiedStepAngles[pano.direction])\n                    .concat(occupiedStepAngles[pano.prev])\n                    .concat(occupiedStepAngles[pano.next]);\n\n                let lowestScore: number = Number.MAX_VALUE;\n                let edge: [EdgeDirection, IPotentialEdge] = null;\n\n                for (let potential of potentialSteps) {\n                    if (potential[0] !== pano.direction) {\n                        continue;\n                    }\n\n                    let motionChange: number = this._spatial.angleDifference(stepAngle, potential[1].motionChange);\n\n                    if (Math.abs(motionChange) > maxRotationDifference) {\n                        continue;\n                    }\n\n                    let minOccupiedDifference: number = Number.MAX_VALUE;\n                    for (let occupiedAngle of allOccupiedAngles) {\n                        let occupiedDifference: number =\n                            Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));\n\n                        if (occupiedDifference < minOccupiedDifference) {\n                            minOccupiedDifference = occupiedDifference;\n                        }\n                    }\n\n                    if (minOccupiedDifference <= maxRotationDifference) {\n                        continue;\n                    }\n\n                    let score: number = this._coefficients.panoPreferredDistance *\n                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /\n                        this._settings.panoMaxDistance +\n                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +\n                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);\n\n                    if (score < lowestScore) {\n                        lowestScore = score;\n                        edge = potential;\n                    }\n                }\n\n                if (edge != null) {\n                    occupations.push(edge);\n                    panoEdges.push({\n                        data: {\n                            direction: edge[0],\n                            worldMotionAzimuth: edge[1].worldMotionAzimuth,\n                        },\n                        from: node.key,\n                        to: edge[1].key,\n                    });\n                }\n            }\n\n            for (let occupation of occupations) {\n                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);\n            }\n        }\n\n        return panoEdges;\n    }\n}\n\nexport default EdgeCalculator;\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {\n    Node,\n    Sequence,\n} from \"../../Graph\";\nimport\n{\n    EdgeDirection,\n    IStep,\n    ITurn,\n    IPano,\n    IEdge,\n    IPotentialEdge,\n    EdgeCalculatorSettings,\n    EdgeCalculatorDirections,\n    EdgeCalculatorCoefficients,\n} from \"../../Edge\";\nimport {ArgumentMapillaryError} from \"../../Error\";\nimport {GeoCoords, Spatial} from \"../../Geo\";\n\n/**\n * @class EdgeCalculator\n *\n * @classdesc Represents a class for calculating node edges.\n */\nexport class EdgeCalculator {\n\n    private _spatial: Spatial;\n    private _geoCoords: GeoCoords;\n\n    private _settings: EdgeCalculatorSettings;\n    private _directions: EdgeCalculatorDirections;\n    private _coefficients: EdgeCalculatorCoefficients;\n\n    /**\n     * Create a new edge calculator instance.\n     *\n     * @param {EdgeCalculatorSettings} settings - Settings struct.\n     * @param {EdgeCalculatorDirections} directions - Directions struct.\n     * @param {EdgeCalculatorCoefficients} coefficients - Coefficients struct.\n     */\n    constructor(\n        settings?: EdgeCalculatorSettings,\n        directions?: EdgeCalculatorDirections,\n        coefficients?: EdgeCalculatorCoefficients) {\n\n        this._spatial = new Spatial();\n        this._geoCoords = new GeoCoords();\n\n        this._settings = settings != null ? settings : new EdgeCalculatorSettings();\n        this._directions = directions != null ? directions : new EdgeCalculatorDirections();\n        this._coefficients = coefficients != null ? coefficients : new EdgeCalculatorCoefficients();\n    }\n\n    /**\n     * Returns the potential edges to destination nodes for a set\n     * of nodes with respect to a source node.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<Node>} nodes - Potential destination nodes.\n     * @param {Array<string>} fallbackKeys - Keys for destination nodes that should\n     * be returned even if they do not meet the criteria for a potential edge.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public getPotentialEdges(node: Node, potentialNodes: Node[], fallbackKeys: string[]): IPotentialEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (!node.merged) {\n            return [];\n        }\n\n        let currentDirection: THREE.Vector3 =\n            this._spatial.viewingDirection(node.rotation);\n        let currentVerticalDirection: number =\n            this._spatial.angleToPlane(currentDirection.toArray(), [0, 0, 1]);\n\n        let potentialEdges: IPotentialEdge[] = [];\n\n        for (let potential of potentialNodes) {\n            if (!potential.merged ||\n                potential.key === node.key) {\n                continue;\n            }\n\n            let enu: number[] = this._geoCoords.geodeticToEnu(\n                potential.latLon.lat,\n                potential.latLon.lon,\n                potential.alt,\n                node.latLon.lat,\n                node.latLon.lon,\n                node.alt);\n\n            let motion: THREE.Vector3 = new THREE.Vector3(enu[0], enu[1], enu[2]);\n            let distance: number = motion.length();\n\n            if (distance > this._settings.maxDistance &&\n                fallbackKeys.indexOf(potential.key) < 0) {\n                continue;\n            }\n\n            let motionChange: number = this._spatial.angleBetweenVector2(\n                currentDirection.x,\n                currentDirection.y,\n                motion.x,\n                motion.y);\n\n            let verticalMotion: number = this._spatial.angleToPlane(motion.toArray(), [0, 0, 1]);\n\n            let direction: THREE.Vector3 =\n                this._spatial.viewingDirection(potential.rotation);\n\n            let directionChange: number = this._spatial.angleBetweenVector2(\n                currentDirection.x,\n                currentDirection.y,\n                direction.x,\n                direction.y);\n\n            let verticalDirection: number = this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);\n            let verticalDirectionChange: number = verticalDirection - currentVerticalDirection;\n\n            let rotation: number = this._spatial.relativeRotationAngle(\n                node.rotation,\n                potential.rotation);\n\n            let worldMotionAzimuth: number =\n                this._spatial.angleBetweenVector2(1, 0, motion.x, motion.y);\n\n            let sameSequence: boolean = potential.sequenceKey != null &&\n                node.sequenceKey != null &&\n                potential.sequenceKey === node.sequenceKey;\n\n            let sameMergeCC: boolean =\n                 (potential.mergeCC == null && node.mergeCC == null) ||\n                 potential.mergeCC === node.mergeCC;\n\n            let sameUser: boolean =\n                potential.userKey === node.userKey;\n\n            let potentialEdge: IPotentialEdge = {\n                capturedAt: potential.capturedAt,\n                croppedPano: potential.pano && !potential.fullPano,\n                directionChange: directionChange,\n                distance: distance,\n                fullPano: potential.fullPano,\n                key: potential.key,\n                motionChange: motionChange,\n                rotation: rotation,\n                sameMergeCC: sameMergeCC,\n                sameSequence: sameSequence,\n                sameUser: sameUser,\n                sequenceKey: potential.sequenceKey,\n                verticalDirectionChange: verticalDirectionChange,\n                verticalMotion: verticalMotion,\n                worldMotionAzimuth: worldMotionAzimuth,\n            };\n\n            potentialEdges.push(potentialEdge);\n        }\n\n        return potentialEdges;\n    }\n\n    /**\n     * Computes the sequence edges for a node.\n     *\n     * @param {Node} node - Source node.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeSequenceEdges(node: Node, sequence: Sequence): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (node.sequenceKey !== sequence.key) {\n            throw new ArgumentMapillaryError(\"Node and sequence does not correspond.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        let nextKey: string = sequence.findNextKey(node.key);\n        if (nextKey != null) {\n            edges.push({\n                data: {\n                    direction: EdgeDirection.Next,\n                    worldMotionAzimuth: Number.NaN,\n                },\n                from: node.key,\n                to: nextKey,\n            });\n        }\n\n        let prevKey: string = sequence.findPrevKey(node.key);\n        if (prevKey != null) {\n            edges.push({\n                data: {\n                    direction: EdgeDirection.Prev,\n                    worldMotionAzimuth: Number.NaN,\n                },\n                from: node.key,\n                to: prevKey,\n            });\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the similar edges for a node.\n     *\n     * @description Similar edges for perspective images and cropped panoramas\n     * look roughly in the same direction and are positioned closed to the node.\n     * Similar edges for full panoramas only target other full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeSimilarEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let nodeFullPano: boolean = node.fullPano;\n        let sequenceGroups: { [key: string]: IPotentialEdge[] } = {};\n\n        for (let potentialEdge of potentialEdges) {\n            if (potentialEdge.sequenceKey == null) {\n                continue;\n            }\n\n            if (potentialEdge.sameSequence ||\n                !potentialEdge.sameMergeCC) {\n                continue;\n            }\n\n            if (nodeFullPano) {\n                if (!potentialEdge.fullPano) {\n                    continue;\n                }\n            } else {\n                if (!potentialEdge.fullPano &&\n                    Math.abs(potentialEdge.directionChange) > this._settings.similarMaxDirectionChange) {\n                    continue;\n                }\n            }\n\n            if (potentialEdge.distance > this._settings.similarMaxDistance) {\n                continue;\n            }\n\n            if (potentialEdge.sameUser &&\n                Math.abs(potentialEdge.capturedAt - node.capturedAt) <\n                    this._settings.similarMinTimeDifference) {\n                continue;\n            }\n\n            if (sequenceGroups[potentialEdge.sequenceKey] == null) {\n                sequenceGroups[potentialEdge.sequenceKey] = [];\n            }\n\n            sequenceGroups[potentialEdge.sequenceKey].push(potentialEdge);\n\n        }\n\n        let similarEdges: IPotentialEdge[] = [];\n\n        let calculateScore: (potentialEdge: IPotentialEdge) => number =\n            node.fullPano ?\n                (potentialEdge: IPotentialEdge): number => {\n                    return potentialEdge.distance;\n                } :\n                (potentialEdge: IPotentialEdge): number => {\n                    return this._coefficients.similarDistance * potentialEdge.distance +\n                        this._coefficients.similarRotation * potentialEdge.rotation;\n                };\n\n        for (let sequenceKey in sequenceGroups) {\n            if (!sequenceGroups.hasOwnProperty(sequenceKey)) {\n                continue;\n            }\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let similarEdge: IPotentialEdge = null;\n\n            for (let potentialEdge of sequenceGroups[sequenceKey]) {\n                let score: number = calculateScore(potentialEdge);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    similarEdge = potentialEdge;\n                }\n            }\n\n            if (similarEdge == null) {\n                continue;\n            }\n\n            similarEdges.push(similarEdge);\n        }\n\n        return similarEdges\n            .map<IEdge>(\n                (potentialEdge: IPotentialEdge): IEdge => {\n                    return {\n                        data: {\n                            direction: EdgeDirection.Similar,\n                            worldMotionAzimuth: potentialEdge.worldMotionAzimuth,\n                        },\n                        from: node.key,\n                        to: potentialEdge.key,\n                    };\n                });\n    }\n\n    /**\n     * Computes the step edges for a perspective node.\n     *\n     * @description Step edge targets can only be other perspective nodes.\n     * Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @param {string} prevKey - Key of previous node in sequence.\n     * @param {string} prevKey - Key of next node in sequence.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeStepEdges(\n        node: Node,\n        potentialEdges: IPotentialEdge[],\n        prevKey: string,\n        nextKey: string): IEdge[] {\n\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        if (node.pano) {\n            return edges;\n        }\n\n        for (let k in this._directions.steps) {\n            if (!this._directions.steps.hasOwnProperty(k)) {\n                continue;\n            }\n\n            let step: IStep = this._directions.steps[k];\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n            let fallback: IPotentialEdge = null;\n\n            for (let potential of potentialEdges) {\n                if (potential.croppedPano || potential.fullPano) {\n                    continue;\n                }\n\n                if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) {\n                    continue;\n                }\n\n                let motionDifference: number =\n                    this._spatial.angleDifference(step.motionChange, potential.motionChange);\n                let directionMotionDifference: number =\n                    this._spatial.angleDifference(potential.directionChange, motionDifference);\n                let drift: number =\n                    Math.max(Math.abs(motionDifference), Math.abs(directionMotionDifference));\n\n                if (Math.abs(drift) > this._settings.stepMaxDrift) {\n                    continue;\n                }\n\n                let potentialKey: string = potential.key;\n                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {\n                    fallback = potential;\n                }\n\n                if (potential.distance > this._settings.stepMaxDistance) {\n                    continue;\n                }\n\n                motionDifference = Math.sqrt(\n                    motionDifference * motionDifference +\n                    potential.verticalMotion * potential.verticalMotion);\n\n                let score: number =\n                    this._coefficients.stepPreferredDistance *\n                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /\n                    this._settings.stepMaxDistance +\n                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +\n                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +\n                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            edge = edge == null ? fallback : edge;\n            if (edge != null) {\n                edges.push({\n                    data: {\n                        direction: step.direction,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            }\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the turn edges for a perspective node.\n     *\n     * @description Turn edge targets can only be other perspective images.\n     * Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computeTurnEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        let edges: IEdge[] = [];\n\n        if (node.pano) {\n            return edges;\n        }\n\n        for (let k in this._directions.turns) {\n            if (!this._directions.turns.hasOwnProperty(k)) {\n                continue;\n            }\n\n            let turn: ITurn = this._directions.turns[k];\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n\n            for (let potential of potentialEdges) {\n                if (potential.croppedPano || potential.fullPano) {\n                    continue;\n                }\n\n                if (potential.distance > this._settings.turnMaxDistance) {\n                    continue;\n                }\n\n                let rig: boolean =\n                    turn.direction !== EdgeDirection.TurnU &&\n                    potential.distance < this._settings.turnMaxRigDistance &&\n                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;\n\n                let directionDifference: number = this._spatial.angleDifference(\n                    turn.directionChange, potential.directionChange);\n\n                let score: number;\n\n                if (\n                    rig &&\n                    potential.directionChange * turn.directionChange > 0 &&\n                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {\n                    score = -Math.PI / 2 + Math.abs(potential.directionChange);\n                } else {\n                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {\n                        continue;\n                    }\n\n                    let motionDifference: number = turn.motionChange ?\n                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;\n\n                    motionDifference = Math.sqrt(\n                        motionDifference * motionDifference +\n                        potential.verticalMotion * potential.verticalMotion);\n\n                    score =\n                        this._coefficients.turnDistance * potential.distance /\n                        this._settings.turnMaxDistance +\n                        this._coefficients.turnMotion * motionDifference / Math.PI +\n                        this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                        this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n                }\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            if (edge != null) {\n                edges.push({\n                    data: {\n                        direction: turn.direction,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            }\n        }\n\n        return edges;\n    }\n\n    /**\n     * Computes the pano edges for a perspective node.\n     *\n     * @description Perspective to pano edge targets can only be\n     * full pano nodes. Returns an empty array for cropped and full panoramas.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computePerspectiveToPanoEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (node.pano) {\n            return [];\n        }\n\n        let lowestScore: number = Number.MAX_VALUE;\n        let edge: IPotentialEdge = null;\n\n        for (let potential of potentialEdges) {\n            if (!potential.fullPano) {\n                continue;\n            }\n\n            let score: number =\n                this._coefficients.panoPreferredDistance *\n                Math.abs(potential.distance - this._settings.panoPreferredDistance) /\n                this._settings.panoMaxDistance +\n                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +\n                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n            if (score < lowestScore) {\n                lowestScore = score;\n                edge = potential;\n            }\n        }\n\n        if (edge == null) {\n            return [];\n        }\n\n        return [\n            {\n                data: {\n                    direction: EdgeDirection.Pano,\n                    worldMotionAzimuth: edge.worldMotionAzimuth,\n                },\n                from: node.key,\n                to: edge.key,\n            },\n        ];\n    }\n\n    /**\n     * Computes the full pano and step edges for a full pano node.\n     *\n     * @description Pano to pano edge targets can only be\n     * full pano nodes. Pano to step edge targets can only be perspective\n     * nodes.\n     * Returns an empty array for cropped panoramas and perspective nodes.\n     *\n     * @param {Node} node - Source node.\n     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.\n     * @throws {ArgumentMapillaryError} If node is not full.\n     */\n    public computePanoEdges(node: Node, potentialEdges: IPotentialEdge[]): IEdge[] {\n        if (!node.full) {\n            throw new ArgumentMapillaryError(\"Node has to be full.\");\n        }\n\n        if (!node.fullPano) {\n            return [];\n        }\n\n        let panoEdges: IEdge[] = [];\n        let potentialPanos: IPotentialEdge[] = [];\n        let potentialSteps: [EdgeDirection, IPotentialEdge][] = [];\n\n        for (let potential of potentialEdges) {\n            if (potential.distance > this._settings.panoMaxDistance) {\n                continue;\n            }\n\n            if (potential.fullPano) {\n                if (potential.distance < this._settings.panoMinDistance) {\n                    continue;\n                }\n\n                potentialPanos.push(potential);\n            } else {\n                if (potential.croppedPano) {\n                    continue;\n                }\n\n                for (let k in this._directions.panos) {\n                    if (!this._directions.panos.hasOwnProperty(k)) {\n                        continue;\n                    }\n\n                    let pano: IPano = this._directions.panos[k];\n\n                    let turn: number = this._spatial.angleDifference(\n                        potential.directionChange,\n                        potential.motionChange);\n\n                    let turnChange: number = this._spatial.angleDifference(pano.directionChange, turn);\n\n                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {\n                        continue;\n                    }\n\n                    potentialSteps.push([pano.direction, potential]);\n\n                    // break if step direction found\n                    break;\n                }\n            }\n        }\n\n        let maxRotationDifference: number = Math.PI / this._settings.panoMaxItems;\n        let occupiedAngles: number[] = [];\n        let stepAngles: number[] = [];\n\n        for (let index: number = 0; index < this._settings.panoMaxItems; index++) {\n            let rotation: number = index / this._settings.panoMaxItems * 2 * Math.PI;\n\n            let lowestScore: number = Number.MAX_VALUE;\n            let edge: IPotentialEdge = null;\n\n            for (let potential of potentialPanos) {\n                let motionDifference: number = this._spatial.angleDifference(rotation, potential.motionChange);\n\n                if (Math.abs(motionDifference) > maxRotationDifference) {\n                    continue;\n                }\n\n                let occupiedDifference: number = Number.MAX_VALUE;\n                for (let occupiedAngle of occupiedAngles) {\n                    let difference: number = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));\n                    if (difference < occupiedDifference) {\n                        occupiedDifference = difference;\n                    }\n                }\n\n                if (occupiedDifference <= maxRotationDifference) {\n                    continue;\n                }\n\n                let score: number =\n                    this._coefficients.panoPreferredDistance *\n                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /\n                    this._settings.panoMaxDistance +\n                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +\n                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +\n                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);\n\n                if (score < lowestScore) {\n                    lowestScore = score;\n                    edge = potential;\n                }\n            }\n\n            if (edge != null) {\n                occupiedAngles.push(edge.motionChange);\n                panoEdges.push({\n                    data: {\n                        direction: EdgeDirection.Pano,\n                        worldMotionAzimuth: edge.worldMotionAzimuth,\n                    },\n                    from: node.key,\n                    to: edge.key,\n                });\n            } else {\n                stepAngles.push(rotation);\n            }\n        }\n\n        let occupiedStepAngles: {[direction: string]: number[] } = {};\n        occupiedStepAngles[EdgeDirection.Pano] = occupiedAngles;\n        occupiedStepAngles[EdgeDirection.StepForward] = [];\n        occupiedStepAngles[EdgeDirection.StepLeft] = [];\n        occupiedStepAngles[EdgeDirection.StepBackward] = [];\n        occupiedStepAngles[EdgeDirection.StepRight] = [];\n\n        for (let stepAngle of stepAngles) {\n            let occupations: [EdgeDirection, IPotentialEdge][] = [];\n\n            for (let k in this._directions.panos) {\n                if (!this._directions.panos.hasOwnProperty(k)) {\n                    continue;\n                }\n\n                let pano: IPano = this._directions.panos[k];\n\n                let allOccupiedAngles: number[] = occupiedStepAngles[EdgeDirection.Pano]\n                    .concat(occupiedStepAngles[pano.direction])\n                    .concat(occupiedStepAngles[pano.prev])\n                    .concat(occupiedStepAngles[pano.next]);\n\n                let lowestScore: number = Number.MAX_VALUE;\n                let edge: [EdgeDirection, IPotentialEdge] = null;\n\n                for (let potential of potentialSteps) {\n                    if (potential[0] !== pano.direction) {\n                        continue;\n                    }\n\n                    let motionChange: number = this._spatial.angleDifference(stepAngle, potential[1].motionChange);\n\n                    if (Math.abs(motionChange) > maxRotationDifference) {\n                        continue;\n                    }\n\n                    let minOccupiedDifference: number = Number.MAX_VALUE;\n                    for (let occupiedAngle of allOccupiedAngles) {\n                        let occupiedDifference: number =\n                            Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));\n\n                        if (occupiedDifference < minOccupiedDifference) {\n                            minOccupiedDifference = occupiedDifference;\n                        }\n                    }\n\n                    if (minOccupiedDifference <= maxRotationDifference) {\n                        continue;\n                    }\n\n                    let score: number = this._coefficients.panoPreferredDistance *\n                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /\n                        this._settings.panoMaxDistance +\n                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +\n                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);\n\n                    if (score < lowestScore) {\n                        lowestScore = score;\n                        edge = potential;\n                    }\n                }\n\n                if (edge != null) {\n                    occupations.push(edge);\n                    panoEdges.push({\n                        data: {\n                            direction: edge[0],\n                            worldMotionAzimuth: edge[1].worldMotionAzimuth,\n                        },\n                        from: node.key,\n                        to: edge[1].key,\n                    });\n                }\n            }\n\n            for (let occupation of occupations) {\n                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);\n            }\n        }\n\n        return panoEdges;\n    }\n}\n\nexport default EdgeCalculator;\n",
     "export class EdgeCalculatorCoefficients {\n    public panoPreferredDistance: number;\n    public panoMotion: number;\n    public panoSequencePenalty: number;\n    public panoMergeCCPenalty: number;\n\n    public stepPreferredDistance: number;\n    public stepMotion: number;\n    public stepRotation: number;\n    public stepSequencePenalty: number;\n    public stepMergeCCPenalty: number;\n\n    public similarDistance: number;\n    public similarRotation: number;\n\n    public turnDistance: number;\n    public turnMotion: number;\n    public turnSequencePenalty: number;\n    public turnMergeCCPenalty: number;\n\n    constructor() {\n        this.panoPreferredDistance = 2;\n        this.panoMotion = 2;\n        this.panoSequencePenalty = 1;\n        this.panoMergeCCPenalty = 4;\n\n        this.stepPreferredDistance = 4;\n        this.stepMotion = 3;\n        this.stepRotation = 4;\n        this.stepSequencePenalty = 2;\n        this.stepMergeCCPenalty = 6;\n\n        this.similarDistance = 2;\n        this.similarRotation = 3;\n\n        this.turnDistance = 4;\n        this.turnMotion = 2;\n        this.turnSequencePenalty = 1;\n        this.turnMergeCCPenalty = 4;\n    }\n}\n\nexport default EdgeCalculatorCoefficients;\n",
     "import {\n    EdgeDirection,\n    IPano,\n    IStep,\n    ITurn,\n} from \"../../Edge\";\n\nexport class EdgeCalculatorDirections {\n\n    public steps: { [direction: string]: IStep } = {};\n    public turns: { [direction: string]: ITurn } = {};\n    public panos: { [direction: string]: IPano } = {};\n\n    constructor() {\n        this.steps[EdgeDirection.StepForward] = {\n            direction: EdgeDirection.StepForward,\n            motionChange: 0,\n            useFallback: true,\n        };\n\n        this.steps[EdgeDirection.StepBackward] = {\n            direction: EdgeDirection.StepBackward,\n            motionChange: Math.PI,\n            useFallback: true,\n        };\n\n        this.steps[EdgeDirection.StepLeft] = {\n            direction: EdgeDirection.StepLeft,\n            motionChange: Math.PI / 2,\n            useFallback: false,\n        };\n\n        this.steps[EdgeDirection.StepRight] = {\n            direction: EdgeDirection.StepRight,\n            motionChange: -Math.PI / 2,\n            useFallback: false,\n        };\n\n        this.turns[EdgeDirection.TurnLeft] = {\n            direction: EdgeDirection.TurnLeft,\n            directionChange: Math.PI / 2,\n            motionChange: Math.PI / 4,\n        };\n\n        this.turns[EdgeDirection.TurnRight] = {\n            direction: EdgeDirection.TurnRight,\n            directionChange: -Math.PI / 2,\n            motionChange: -Math.PI / 4,\n        };\n\n        this.turns[EdgeDirection.TurnU] = {\n            direction: EdgeDirection.TurnU,\n            directionChange: Math.PI,\n            motionChange: null,\n        };\n\n        this.panos[EdgeDirection.StepForward] = {\n            direction: EdgeDirection.StepForward,\n            directionChange: 0,\n            next: EdgeDirection.StepLeft,\n            prev: EdgeDirection.StepRight,\n        };\n\n        this.panos[EdgeDirection.StepBackward] = {\n            direction: EdgeDirection.StepBackward,\n            directionChange: Math.PI,\n            next: EdgeDirection.StepRight,\n            prev: EdgeDirection.StepLeft,\n        };\n\n        this.panos[EdgeDirection.StepLeft] = {\n            direction: EdgeDirection.StepLeft,\n            directionChange: Math.PI / 2,\n            next: EdgeDirection.StepBackward,\n            prev: EdgeDirection.StepForward,\n        };\n\n        this.panos[EdgeDirection.StepRight] = {\n            direction: EdgeDirection.StepRight,\n            directionChange: -Math.PI / 2,\n            next: EdgeDirection.StepForward,\n            prev: EdgeDirection.StepBackward,\n        };\n    }\n}\n",
     "export class EdgeCalculatorSettings {\n    public panoMinDistance: number;\n    public panoMaxDistance: number;\n    public panoPreferredDistance: number;\n    public panoMaxItems: number;\n    public panoMaxStepTurnChange: number;\n\n    public rotationMaxDistance: number;\n    public rotationMaxDirectionChange: number;\n    public rotationMaxVerticalDirectionChange: number;\n\n    public similarMaxDirectionChange: number;\n    public similarMaxDistance: number;\n    public similarMinTimeDifference: number;\n\n    public stepMaxDistance: number;\n    public stepMaxDirectionChange: number;\n    public stepMaxDrift: number;\n    public stepPreferredDistance: number;\n\n    public turnMaxDistance: number;\n    public turnMaxDirectionChange: number;\n    public turnMaxRigDistance: number;\n    public turnMinRigDirectionChange: number;\n\n    constructor() {\n        this.panoMinDistance = 0.1;\n        this.panoMaxDistance = 20;\n        this.panoPreferredDistance = 5;\n        this.panoMaxItems = 4;\n        this.panoMaxStepTurnChange = Math.PI / 8;\n\n        this.rotationMaxDistance = this.turnMaxRigDistance;\n        this.rotationMaxDirectionChange = Math.PI / 6;\n        this.rotationMaxVerticalDirectionChange = Math.PI / 8;\n\n        this.similarMaxDirectionChange = Math.PI / 8;\n        this.similarMaxDistance = 12;\n        this.similarMinTimeDifference = 12 * 3600 * 1000;\n\n        this.stepMaxDistance = 20;\n        this.stepMaxDirectionChange = Math.PI / 6;\n        this.stepMaxDrift = Math.PI / 6;\n        this.stepPreferredDistance = 4;\n\n        this.turnMaxDistance = 15;\n        this.turnMaxDirectionChange = 2 * Math.PI / 9;\n        this.turnMaxRigDistance = 0.65;\n        this.turnMinRigDirectionChange = Math.PI / 6;\n    }\n\n    public get maxDistance(): number {\n        return Math.max(\n            this.panoMaxDistance,\n            this.similarMaxDistance,\n            this.stepMaxDistance,\n            this.turnMaxDistance);\n    }\n}\n\nexport default EdgeCalculatorSettings;\n",
     "/**\n * Enumeration for render mode\n * @enum {number}\n * @readonly\n * @description Modes for specifying how rendering is done\n * in the viewer. All modes preserves the original aspect\n * ratio of the images.\n */\nexport enum RenderMode {\n\n    /**\n     * Displays all content within the viewer.\n     *\n     * @description Black bars shown on both\n     * sides of the content. Bars are shown\n     * either below and above or to the left\n     * and right of the content depending on\n     * the aspect ratio relation between the\n     * image and the viewer.\n     */\n    Letterbox,\n\n    /**\n     * Fills the viewer by cropping content.\n     *\n     * @description Cropping is done either\n     * in horizontal or vertical direction\n     * depending on the aspect ratio relation\n     * between the image and the viewer.\n     */\n    Fill,\n}\n\nexport default RenderMode;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/skip\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {Camera, Spatial, Transform} from \"../Geo\";\nimport {Node} from \"../Graph\";\nimport {RenderCamera, RenderMode, ISize} from \"../Render\";\nimport {IFrame} from \"../State\";\n\ninterface IRenderCameraOperation {\n    (rc: RenderCamera): RenderCamera;\n}\n\nexport class RenderService {\n    private _bearing$: Observable<number>;\n\n    private _element: HTMLElement;\n    private _currentFrame$: Observable<IFrame>;\n\n    private _renderCameraOperation$: Subject<IRenderCameraOperation>;\n    private _renderCameraHolder$: Observable<RenderCamera>;\n    private _renderCameraFrame$: Observable<RenderCamera>;\n    private _renderCamera$: Observable<RenderCamera>;\n\n    private _resize$: Subject<void>;\n    private _size$: BehaviorSubject<ISize>;\n\n    private _spatial: Spatial;\n\n    private _renderMode$: BehaviorSubject<RenderMode>;\n\n    constructor(element: HTMLElement, currentFrame$: Observable<IFrame>, renderMode: RenderMode) {\n        this._element = element;\n        this._currentFrame$ = currentFrame$;\n\n        this._spatial = new Spatial();\n\n        renderMode = renderMode != null ? renderMode : RenderMode.Fill;\n\n        this._resize$ = new Subject<void>();\n        this._renderCameraOperation$ = new Subject<IRenderCameraOperation>();\n\n        this._size$ =\n            new BehaviorSubject<ISize>(\n                {\n                    height: this._element.offsetHeight,\n                    width: this._element.offsetWidth,\n                });\n\n        this._resize$\n            .map(\n                (): ISize => {\n                    return { height: this._element.offsetHeight, width: this._element.offsetWidth };\n                })\n            .subscribe(this._size$);\n\n        this._renderMode$ = new BehaviorSubject<RenderMode>(renderMode);\n\n        this._renderCameraHolder$ = this._renderCameraOperation$\n            .startWith(\n                (rc: RenderCamera): RenderCamera => {\n                    return rc;\n                })\n            .scan(\n                (rc: RenderCamera, operation: IRenderCameraOperation): RenderCamera => {\n                    return operation(rc);\n                },\n                new RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode))\n            .publishReplay(1)\n            .refCount();\n\n        this._renderCameraFrame$ = this._currentFrame$\n            .withLatestFrom(\n                this._renderCameraHolder$,\n                (frame: IFrame, renderCamera: RenderCamera): [IFrame, RenderCamera] => {\n                    return [frame, renderCamera];\n                })\n            .do(\n                (args: [IFrame, RenderCamera]): void => {\n                    let frame: IFrame = args[0];\n                    let rc: RenderCamera = args[1];\n\n                    let camera: Camera = frame.state.camera;\n\n                    if (rc.alpha !== frame.state.alpha ||\n                        rc.zoom !== frame.state.zoom ||\n                        rc.camera.diff(camera) > 1e-9) {\n\n                        let currentTransform: Transform = frame.state.currentTransform;\n                        let previousTransform: Transform =\n                            frame.state.previousTransform != null ?\n                                frame.state.previousTransform :\n                                frame.state.currentTransform;\n\n                        let previousNode: Node =\n                            frame.state.previousNode != null ?\n                                frame.state.previousNode :\n                                frame.state.currentNode;\n\n                        rc.currentAspect = currentTransform.basicAspect;\n                        rc.currentPano = frame.state.currentNode.pano;\n                        rc.previousAspect = previousTransform.basicAspect;\n                        rc.previousPano = previousNode.pano;\n\n                        rc.alpha = frame.state.alpha;\n                        rc.zoom = frame.state.zoom;\n\n                        rc.camera.copy(camera);\n                        rc.updatePerspective(camera);\n                        rc.updateRotation(camera);\n\n                        rc.updateProjection();\n                    }\n\n                    rc.frameId = frame.id;\n                })\n            .map(\n                (args: [IFrame, RenderCamera]): RenderCamera => {\n                    return args[1];\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._renderCamera$ = this._renderCameraFrame$\n            .filter(\n                (rc: RenderCamera): boolean => {\n                    return rc.changed;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._bearing$ = this._renderCamera$\n            .map(\n                (renderCamera: RenderCamera): number => {\n                    let bearing: number =\n                        this._spatial.radToDeg(\n                            this._spatial.azimuthalToBearing(renderCamera.rotation.phi));\n\n                    return this._spatial.wrap(bearing, 0, 360);\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._size$\n            .skip(1)\n            .map(\n                (size: ISize) => {\n                    return (rc: RenderCamera): RenderCamera => {\n                        rc.updateAspect(size.width, size.height);\n                        rc.updateProjection();\n\n                        return rc;\n                    };\n                })\n            .subscribe(this._renderCameraOperation$);\n\n        this._renderMode$\n            .skip(1)\n            .map(\n                (rm: RenderMode) => {\n                    return (rc: RenderCamera): RenderCamera => {\n                        rc.renderMode = rm;\n                        rc.updateProjection();\n\n                        return rc;\n                    };\n                })\n            .subscribe(this._renderCameraOperation$);\n\n        this._bearing$.subscribe(() => { /*noop*/ });\n        this._renderCameraHolder$.subscribe(() => { /*noop*/ });\n        this._size$.subscribe(() => { /*noop*/ });\n        this._renderMode$.subscribe(() => { /*noop*/ });\n        this._renderCamera$.subscribe(() => { /*noop*/ });\n        this._renderCameraFrame$.subscribe(() => { /*noop*/ });\n    }\n\n    public get bearing$(): Observable<number> {\n        return this._bearing$;\n    }\n\n    public get element(): HTMLElement {\n        return this._element;\n    }\n\n    public get resize$(): Subject<void> {\n        return this._resize$;\n    }\n\n    public get size$(): Observable<ISize> {\n        return this._size$;\n    }\n\n    public get renderMode$(): Subject<RenderMode> {\n        return this._renderMode$;\n    }\n\n    public get renderCameraFrame$(): Observable<RenderCamera> {\n        return this._renderCameraFrame$;\n    }\n\n    public get renderCamera$(): Observable<RenderCamera> {\n        return this._renderCamera$;\n    }\n}\n\nexport default RenderService;\n",
     "export enum State {\n    Traversing,\n    Waiting,\n}\n\nexport default State;\n",
-    "import {\n    IStateContext,\n    StateBase,\n    State,\n    TraversingState,\n    WaitingState,\n    IRotation,\n} from \"../State\";\nimport {Node} from \"../Graph\";\nimport {Camera, ILatLonAlt, Transform} from \"../Geo\";\n\nexport class StateContext implements IStateContext {\n    private _state: StateBase;\n\n    constructor() {\n        this._state = new TraversingState({\n            alpha: 1,\n            camera: new Camera(),\n            currentIndex: -1,\n            reference: { alt: 0, lat: 0, lon: 0 },\n            trajectory: [],\n            zoom: 0,\n        });\n    }\n\n    public traverse(): void {\n        this._state = this._state.traverse();\n    }\n\n    public wait(): void {\n        this._state = this._state.wait();\n    }\n\n    public get state(): State {\n        if (this._state instanceof TraversingState) {\n            return State.Traversing;\n        } else if (this._state instanceof WaitingState) {\n            return State.Waiting;\n        }\n\n        throw new Error(\"Invalid state\");\n    }\n\n    public get reference(): ILatLonAlt {\n        return this._state.reference;\n    }\n\n    public get alpha(): number {\n        return this._state.alpha;\n    }\n\n    public get camera(): Camera {\n        return this._state.camera;\n    }\n\n    public get zoom(): number {\n        return this._state.zoom;\n    }\n\n    public get currentNode(): Node {\n        return this._state.currentNode;\n    }\n\n    public get previousNode(): Node {\n        return this._state.previousNode;\n    }\n\n    public get currentCamera(): Camera {\n        return this._state.currentCamera;\n    }\n\n    public get currentTransform(): Transform {\n        return this._state.currentTransform;\n    }\n\n    public get previousTransform(): Transform {\n        return this._state.previousTransform;\n    }\n\n    public get trajectory(): Node[] {\n        return this._state.trajectory;\n    }\n\n    public get currentIndex(): number {\n        return this._state.currentIndex;\n    }\n\n    public get lastNode(): Node {\n        return this._state.trajectory[this._state.trajectory.length - 1];\n    }\n\n    public get nodesAhead(): number {\n        return this._state.trajectory.length - 1 - this._state.currentIndex;\n    }\n\n    public get motionless(): boolean {\n        return this._state.motionless;\n    }\n\n    public getCenter(): number[] {\n        return this._state.getCenter();\n    }\n\n    public setCenter(center: number[]): void {\n        this._state.setCenter(center);\n    }\n\n    public setZoom(zoom: number): void {\n        this._state.setZoom(zoom);\n    }\n\n    public update(fps: number): void {\n        this._state.update(fps);\n    }\n\n    public append(nodes: Node[]): void {\n        this._state.append(nodes);\n    }\n\n    public prepend(nodes: Node[]): void {\n        this._state.prepend(nodes);\n    }\n\n    public remove(n: number): void {\n        this._state.remove(n);\n    }\n\n    public clear(): void {\n        this._state.clear();\n    }\n\n    public clearPrior(): void {\n        this._state.clearPrior();\n    }\n\n    public cut(): void {\n        this._state.cut();\n    }\n\n    public set(nodes: Node[]): void {\n        this._state.set(nodes);\n    }\n\n    public rotate(delta: IRotation): void {\n        this._state.rotate(delta);\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        this._state.rotateBasic(basicRotation);\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        this._state.rotateBasicUnbounded(basicRotation);\n    }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void {\n        this._state.rotateBasicWithoutInertia(basicRotation);\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        this._state.rotateToBasic(basic);\n    }\n\n    public move(delta: number): void {\n        this._state.move(delta);\n    }\n\n    public moveTo(delta: number): void {\n        this._state.moveTo(delta);\n    }\n\n    public zoomIn(delta: number, reference: number[]): void {\n        this._state.zoomIn(delta, reference);\n    }\n}\n",
-    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {RequestAnimationFrameDefinition} from \"rxjs/util/AnimationFrame\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/pairwise\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {ILatLon} from \"../API\";\nimport {Node} from \"../Graph\";\nimport {\n    Camera,\n    ILatLonAlt,\n    Transform,\n} from \"../Geo\";\nimport {\n    IStateContext,\n    IFrame,\n    IRotation,\n    StateContext,\n    State,\n} from \"../State\";\n\ninterface IContextOperation {\n    (context: IStateContext): IStateContext;\n}\n\nexport class StateService {\n    private _start$: Subject<void>;\n\n    private _frame$: Subject<number>;\n\n    private _contextOperation$: BehaviorSubject<IContextOperation>;\n    private _context$: Observable<IStateContext>;\n    private _fps$: Observable<number>;\n    private _state$: Observable<State>;\n\n    private _currentState$: Observable<IFrame>;\n    private _lastState$: Observable<IFrame>;\n    private _currentNode$: Observable<Node>;\n    private _currentNodeExternal$: Observable<Node>;\n    private _currentCamera$: Observable<Camera>;\n    private _currentKey$: BehaviorSubject<string>;\n    private _currentTransform$: Observable<Transform>;\n    private _reference$: Observable<ILatLonAlt>;\n\n    private _inMotionOperation$: Subject<boolean>;\n    private _inMotion$: Observable<boolean>;\n\n    private _inTranslationOperation$: Subject<boolean>;\n    private _inTranslation$: Observable<boolean>;\n\n    private _appendNode$: Subject<Node> = new Subject<Node>();\n\n    private _frameGenerator: RequestAnimationFrameDefinition;\n    private _frameId: number;\n\n    private _fpsSampleRate: number;\n\n    constructor () {\n        this._start$ = new Subject<void>();\n        this._frame$ = new Subject<number>();\n        this._fpsSampleRate = 30;\n\n        this._contextOperation$ = new BehaviorSubject<IContextOperation>(\n            (context: IStateContext): IStateContext => {\n                return context;\n            });\n\n        this._context$ = this._contextOperation$\n            .scan(\n                (context: IStateContext, operation: IContextOperation): IStateContext => {\n                    return operation(context);\n                },\n                new StateContext())\n            .publishReplay(1)\n            .refCount();\n\n        this._state$ = this._context$\n            .map(\n                (context: IStateContext): State => {\n                    return context.state;\n                })\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._fps$ = this._start$\n            .switchMap(\n                (): Observable<number> => {\n                    return this._frame$\n                        .bufferCount(1, this._fpsSampleRate)\n                        .map(\n                            (frameIds: number[]): number => {\n                                return new Date().getTime();\n                            })\n                        .pairwise()\n                        .map(\n                            (times: [number, number]): number => {\n                                return Math.max(20, 1000 * this._fpsSampleRate / (times[1] - times[0]));\n                            })\n                        .startWith(60);\n                })\n            .share();\n\n        this._currentState$ = this._frame$\n            .withLatestFrom(\n                this._fps$,\n                this._context$,\n                (frameId: number, fps: number, context: IStateContext): [number, number, IStateContext] => {\n                    return [frameId, fps, context];\n                })\n            .filter(\n                (fc: [number, number, IStateContext]): boolean => {\n                    return fc[2].currentNode != null;\n                })\n            .do(\n                (fc: [number, number, IStateContext]): void => {\n                    fc[2].update(fc[1]);\n                })\n            .map(\n                (fc: [number, number, IStateContext]): IFrame => {\n                    return { fps: fc[1], id: fc[0], state: fc[2] };\n                })\n            .share();\n\n        this._lastState$ = this._currentState$\n            .publishReplay(1)\n            .refCount();\n\n        let nodeChanged$: Observable<IFrame> = this._currentState$\n            .distinctUntilChanged(\n                undefined,\n                (f: IFrame): string => {\n                    return f.state.currentNode.key;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        let nodeChangedSubject$: Subject<IFrame> = new Subject<IFrame>();\n\n        nodeChanged$\n            .subscribe(nodeChangedSubject$);\n\n        this._currentKey$ = new BehaviorSubject<string>(null);\n\n        nodeChangedSubject$\n            .map(\n                (f: IFrame): string => {\n                    return f.state.currentNode.key;\n                })\n            .subscribe(this._currentKey$);\n\n        this._currentNode$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Node => {\n                    return f.state.currentNode;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentCamera$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Camera => {\n                    return f.state.currentCamera;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentTransform$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Transform => {\n                    return f.state.currentTransform;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._reference$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): ILatLonAlt => {\n                    return f.state.reference;\n                })\n            .distinctUntilChanged(\n                (r1: ILatLon, r2: ILatLon): boolean => {\n                    return r1.lat === r2.lat && r1.lon === r2.lon;\n                },\n                (reference: ILatLonAlt): ILatLon => {\n                    return { lat: reference.lat, lon: reference.lon };\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentNodeExternal$ = nodeChanged$\n            .map(\n                (f: IFrame): Node => {\n                    return f.state.currentNode;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._appendNode$\n            .map(\n                (node: Node) => {\n                    return (context: IStateContext): IStateContext => {\n                        context.append([node]);\n\n                        return context;\n                    };\n                })\n            .subscribe(this._contextOperation$);\n\n        this._inMotionOperation$ = new Subject<boolean>();\n\n        nodeChanged$\n            .map(\n                (frame: IFrame): boolean => {\n                    return true;\n                })\n            .subscribe(this._inMotionOperation$);\n\n        this._inMotionOperation$\n            .distinctUntilChanged()\n            .filter(\n                (moving: boolean): boolean => {\n                    return moving;\n                })\n            .switchMap(\n                (moving: boolean): Observable<boolean> => {\n                    return this._currentState$\n                        .filter(\n                            (frame: IFrame): boolean => {\n                                return frame.state.nodesAhead === 0;\n                            })\n                        .map(\n                            (frame: IFrame): [Camera, number] => {\n                                return [frame.state.camera.clone(), frame.state.zoom];\n                            })\n                        .pairwise()\n                        .map(\n                            (pair: [[Camera, number], [Camera, number]]): boolean => {\n                                let c1: Camera = pair[0][0];\n                                let c2: Camera = pair[1][0];\n\n                                let z1: number = pair[0][1];\n                                let z2: number = pair[1][1];\n\n                                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;\n                            })\n                        .first(\n                            (changed: boolean): boolean => {\n                                return !changed;\n                            });\n                })\n            .subscribe(this._inMotionOperation$);\n\n        this._inMotion$ = this._inMotionOperation$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._inTranslationOperation$ = new Subject<boolean>();\n\n        nodeChanged$\n            .map(\n                (frame: IFrame): boolean => {\n                    return true;\n                })\n            .subscribe(this._inTranslationOperation$);\n\n        this._inTranslationOperation$\n            .distinctUntilChanged()\n            .filter(\n                (inTranslation: boolean): boolean => {\n                    return inTranslation;\n                })\n            .switchMap(\n                (inTranslation: boolean): Observable<boolean> => {\n                    return this._currentState$\n                        .filter(\n                            (frame: IFrame): boolean => {\n                                return frame.state.nodesAhead === 0;\n                            })\n                        .map(\n                            (frame: IFrame): THREE.Vector3 => {\n                                return frame.state.camera.position.clone();\n                            })\n                        .pairwise()\n                        .map(\n                            (pair: [THREE.Vector3, THREE.Vector3]): boolean => {\n                                return pair[0].distanceToSquared(pair[1]) !== 0;\n                            })\n                        .first(\n                            (changed: boolean): boolean => {\n                                return !changed;\n                            });\n                })\n            .subscribe(this._inTranslationOperation$);\n\n        this._inTranslation$ = this._inTranslationOperation$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._state$.subscribe(() => { /*noop*/ });\n        this._currentNode$.subscribe(() => { /*noop*/ });\n        this._currentCamera$.subscribe(() => { /*noop*/ });\n        this._currentTransform$.subscribe(() => { /*noop*/ });\n        this._reference$.subscribe(() => { /*noop*/ });\n        this._currentNodeExternal$.subscribe(() => { /*noop*/ });\n        this._lastState$.subscribe(() => { /*noop*/ });\n        this._inMotion$.subscribe(() => { /*noop*/ });\n        this._inTranslation$.subscribe(() => { /*noop*/ });\n\n        this._frameId = null;\n        this._frameGenerator = new RequestAnimationFrameDefinition(window);\n    }\n\n    public get currentState$(): Observable<IFrame> {\n        return this._currentState$;\n    }\n\n    public get currentNode$(): Observable<Node> {\n        return this._currentNode$;\n    }\n\n    public get currentKey$(): Observable<string> {\n        return this._currentKey$;\n    }\n\n    public get currentNodeExternal$(): Observable<Node> {\n        return this._currentNodeExternal$;\n    }\n\n    public get currentCamera$(): Observable<Camera> {\n        return this._currentCamera$;\n    }\n\n    public get currentTransform$(): Observable<Transform> {\n        return this._currentTransform$;\n    }\n\n    public get state$(): Observable<State> {\n        return this._state$;\n    }\n\n    public get reference$(): Observable<ILatLonAlt> {\n        return this._reference$;\n    }\n\n    public get inMotion$(): Observable<boolean> {\n        return this._inMotion$;\n    }\n\n    public get inTranslation$(): Observable<boolean> {\n        return this._inTranslation$;\n    }\n\n    public get appendNode$(): Subject<Node> {\n        return this._appendNode$;\n    }\n\n    public traverse(): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.traverse(); });\n    }\n\n    public wait(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.wait(); });\n    }\n\n    public appendNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.append(nodes); });\n    }\n\n    public prependNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.prepend(nodes); });\n    }\n\n    public removeNodes(n: number): void {\n        this._invokeContextOperation((context: IStateContext) => { context.remove(n); });\n    }\n\n    public clearNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.clear(); });\n    }\n\n    public clearPriorNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.clearPrior(); });\n    }\n\n    public cutNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.cut(); });\n    }\n\n    public setNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.set(nodes); });\n    }\n\n    public rotate(delta: IRotation): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotate(delta); });\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasic(basicRotation); });\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasicUnbounded(basicRotation); });\n    }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasicWithoutInertia(basicRotation); });\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateToBasic(basic); });\n    }\n\n    public move(delta: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.move(delta); });\n    }\n\n    public moveTo(position: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.moveTo(position); });\n    }\n\n    /**\n     * Change zoom level while keeping the reference point position approximately static.\n     *\n     * @parameter {number} delta - Change in zoom level.\n     * @parameter {Array<number>} reference - Reference point in basic coordinates.\n     */\n    public zoomIn(delta: number, reference: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.zoomIn(delta, reference); });\n    }\n\n    public getCenter(): Observable<number[]> {\n        return this._lastState$\n            .first()\n            .map(\n                (frame: IFrame): number[] => {\n                    return (<IStateContext>frame.state).getCenter();\n                });\n    }\n\n    public getZoom(): Observable<number> {\n        return this._lastState$\n            .first()\n            .map(\n                (frame: IFrame): number => {\n                    return frame.state.zoom;\n                });\n    }\n\n    public setCenter(center: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.setCenter(center); });\n    }\n\n    public setZoom(zoom: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.setZoom(zoom); });\n    }\n\n    public start(): void {\n        if (this._frameId == null) {\n            this._start$.next(null);\n            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));\n            this._frame$.next(this._frameId);\n        }\n    }\n\n    public stop(): void {\n        if (this._frameId != null) {\n            this._frameGenerator.cancelAnimationFrame(this._frameId);\n            this._frameId = null;\n        }\n    }\n\n    private _invokeContextOperation(action: (context: IStateContext) => void): void {\n        this._contextOperation$\n            .next(\n                (context: IStateContext): IStateContext => {\n                    action(context);\n\n                    return context;\n                });\n    }\n\n    private _frame(time: number): void {\n        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));\n        this._frame$.next(this._frameId);\n    }\n}\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport {ArgumentMapillaryError} from \"../../Error\";\nimport {IState} from \"../../State\";\nimport {Node} from \"../../Graph\";\nimport {Camera, GeoCoords, ILatLonAlt, Transform, Spatial} from \"../../Geo\";\nimport {IRotation} from \"../../State\";\n\nexport abstract class StateBase implements IState {\n    protected _spatial: Spatial;\n    protected _geoCoords: GeoCoords;\n\n    protected _reference: ILatLonAlt;\n\n    protected _alpha: number;\n    protected _camera: Camera;\n    protected _zoom: number;\n\n    protected _currentIndex: number;\n\n    protected _trajectory: Node[];\n    protected _currentNode: Node;\n    protected _previousNode: Node;\n\n    protected _trajectoryTransforms: Transform[];\n\n    protected _trajectoryCameras: Camera[];\n    protected _currentCamera: Camera;\n    protected _previousCamera: Camera;\n\n    protected _motionless: boolean;\n\n    private _referenceThreshold: number;\n\n    constructor(state: IState) {\n        this._spatial = new Spatial();\n        this._geoCoords = new GeoCoords();\n\n        this._referenceThreshold = 0.01;\n\n        this._reference = state.reference;\n\n        this._alpha = state.alpha;\n        this._camera = state.camera.clone();\n        this._zoom = state.zoom;\n\n        this._currentIndex = state.currentIndex;\n\n        this._trajectory = state.trajectory.slice();\n        this._trajectoryTransforms = [];\n        this._trajectoryCameras = [];\n\n        for (let node of this._trajectory) {\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.push(transform);\n            this._trajectoryCameras.push(new Camera(transform));\n        }\n\n        this._currentNode = this._trajectory.length > 0 ?\n            this._trajectory[this._currentIndex] :\n            null;\n\n        this._previousNode = this._trajectory.length > 1 && this.currentIndex > 0 ?\n            this._trajectory[this._currentIndex - 1] :\n            null;\n\n        this._currentCamera = this._trajectoryCameras.length > 0 ?\n            this._trajectoryCameras[this._currentIndex].clone() :\n            new Camera();\n\n        this._previousCamera = this._trajectoryCameras.length > 1 && this.currentIndex > 0 ?\n            this._trajectoryCameras[this._currentIndex - 1].clone() :\n            this._currentCamera.clone();\n    }\n\n    public get reference(): ILatLonAlt {\n        return this._reference;\n    }\n\n    public get alpha(): number {\n        return this._getAlpha();\n    }\n\n    public get camera(): Camera {\n        return this._camera;\n    }\n\n    public get zoom(): number {\n        return this._zoom;\n    }\n\n    public get trajectory(): Node[] {\n        return this._trajectory;\n    }\n\n    public get currentIndex(): number {\n        return this._currentIndex;\n    }\n\n    public get currentNode(): Node {\n        return this._currentNode;\n    }\n\n    public get previousNode(): Node {\n        return this._previousNode;\n    }\n\n    public get currentCamera(): Camera {\n        return this._currentCamera;\n    }\n\n    public get currentTransform(): Transform {\n        return this._trajectoryTransforms.length > 0 ?\n            this._trajectoryTransforms[this.currentIndex] : null;\n    }\n\n    public get previousTransform(): Transform {\n        return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?\n            this._trajectoryTransforms[this.currentIndex - 1] : null;\n    }\n\n    public get motionless(): boolean {\n        return this._motionless;\n    }\n\n    public abstract traverse(): StateBase;\n\n    public abstract wait(): StateBase;\n\n    public abstract move(delta: number): void;\n\n    public abstract moveTo(position: number): void;\n\n    public abstract rotate(delta: IRotation): void;\n\n    public abstract rotateBasic(basicRotation: number[]): void;\n\n    public abstract rotateBasicUnbounded(basicRotation: number[]): void;\n\n    public abstract rotateBasicWithoutInertia(basicRotation: number[]): void;\n\n    public abstract rotateToBasic(basic: number[]): void;\n\n    public abstract zoomIn(delta: number, reference: number[]): void;\n\n    public abstract update(fps: number): void;\n\n    public append(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw Error(\"Trajectory can not be empty\");\n        }\n\n        if (this._currentIndex < 0) {\n            this.set(nodes);\n        } else {\n            this._trajectory = this._trajectory.concat(nodes);\n            this._appendToTrajectories(nodes);\n        }\n    }\n\n    public prepend(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw Error(\"Trajectory can not be empty\");\n        }\n\n        this._trajectory = nodes.slice().concat(this._trajectory);\n        this._currentIndex += nodes.length;\n\n        this._setCurrentNode();\n\n        let referenceReset: boolean = this._setReference(this._currentNode);\n        if (referenceReset) {\n            this._setTrajectories();\n        } else {\n            this._prependToTrajectories(nodes);\n        }\n\n        this._setCurrentCamera();\n    }\n\n    public remove(n: number): void {\n        if (n < 0) {\n            throw Error(\"n must be a positive integer\");\n        }\n\n        if (this._currentIndex - 1 < n) {\n            throw Error(\"Current and previous nodes can not be removed\");\n        }\n\n        for (let i: number = 0; i < n; i++) {\n            this._trajectory.shift();\n            this._trajectoryTransforms.shift();\n            this._trajectoryCameras.shift();\n            this._currentIndex--;\n        }\n\n        this._setCurrentNode();\n    }\n\n    public clearPrior(): void {\n        if (this._currentIndex > 0) {\n            this.remove(this._currentIndex - 1);\n        }\n    }\n\n    public clear(): void {\n        this.cut();\n\n        if (this._currentIndex > 0) {\n            this.remove(this._currentIndex - 1);\n        }\n    }\n\n    public cut(): void {\n        while (this._trajectory.length - 1 > this._currentIndex) {\n            this._trajectory.pop();\n            this._trajectoryTransforms.pop();\n            this._trajectoryCameras.pop();\n        }\n    }\n\n    public set(nodes: Node[]): void {\n        this._setTrajectory(nodes);\n        this._setCurrentNode();\n        this._setReference(this._currentNode);\n        this._setTrajectories();\n        this._setCurrentCamera();\n    }\n\n    public getCenter(): number[] {\n        return this._currentNode != null ?\n            this.currentTransform.projectBasic(this._camera.lookat.toArray()) :\n            [0.5, 0.5];\n    }\n\n    public abstract setCenter(center: number[]): void;\n\n    public abstract setZoom(zoom: number): void;\n\n    protected abstract _getAlpha(): number;\n\n    protected _setCurrent(): void {\n        this._setCurrentNode();\n\n        let referenceReset: boolean = this._setReference(this._currentNode);\n        if (referenceReset) {\n            this._setTrajectories();\n        }\n\n        this._setCurrentCamera();\n    }\n\n    protected _setCurrentCamera(): void {\n        this._currentCamera = this._trajectoryCameras[this._currentIndex].clone();\n        this._previousCamera = this._currentIndex > 0 ?\n            this._trajectoryCameras[this._currentIndex - 1].clone() :\n            this._currentCamera.clone();\n    }\n\n    protected _motionlessTransition(): boolean {\n        let nodesSet: boolean = this._currentNode != null && this._previousNode != null;\n\n        return nodesSet && !(\n            this._currentNode.merged &&\n            this._previousNode.merged &&\n            this._withinOriginalDistance() &&\n            this._sameConnectedComponent()\n        );\n    }\n\n    private _setReference(node: Node): boolean {\n        // do not reset reference if node is within threshold distance\n        if (Math.abs(node.latLon.lat - this.reference.lat) < this._referenceThreshold &&\n            Math.abs(node.latLon.lon - this.reference.lon) < this._referenceThreshold) {\n            return false;\n        }\n\n        // do not reset reference if previous node exist and transition is with motion\n        if (this._previousNode != null && !this._motionlessTransition()) {\n            return false;\n        }\n\n        this._reference.lat = node.latLon.lat;\n        this._reference.lon = node.latLon.lon;\n        this._reference.alt = node.alt;\n\n        return true;\n    }\n\n    private _setCurrentNode(): void {\n        this._currentNode = this._trajectory.length > 0 ?\n            this._trajectory[this._currentIndex] :\n            null;\n\n        this._previousNode = this._currentIndex > 0 ?\n            this._trajectory[this._currentIndex - 1] :\n            null;\n    }\n\n    private _setTrajectory(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw new ArgumentMapillaryError(\"Trajectory can not be empty\");\n        }\n\n        if (this._currentNode != null) {\n            this._trajectory = [this._currentNode].concat(nodes);\n            this._currentIndex = 1;\n        } else {\n            this._trajectory = nodes.slice();\n            this._currentIndex = 0;\n        }\n    }\n\n    private _setTrajectories(): void {\n        this._trajectoryTransforms.length = 0;\n        this._trajectoryCameras.length = 0;\n\n        this._appendToTrajectories(this._trajectory);\n    }\n\n    private _appendToTrajectories(nodes: Node[]): void {\n        for (let node of nodes) {\n            if (!node.assetsCached) {\n                throw new ArgumentMapillaryError(\"Assets must be cached when node is added to trajectory\");\n            }\n\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.push(transform);\n            this._trajectoryCameras.push(new Camera(transform));\n        }\n    }\n\n    private _prependToTrajectories(nodes: Node[]): void {\n        for (let node of nodes.reverse()) {\n            if (!node.assetsCached) {\n                throw new ArgumentMapillaryError(\"Assets must be cached when added to trajectory\");\n            }\n\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.unshift(transform);\n            this._trajectoryCameras.unshift(new Camera(transform));\n        }\n    }\n\n    private _nodeToTranslation(node: Node): number[] {\n        let C: number[] = this._geoCoords.geodeticToEnu(\n            node.latLon.lat,\n            node.latLon.lon,\n            node.alt,\n            this._reference.lat,\n            this._reference.lon,\n            this._reference.alt);\n\n        let RC: THREE.Vector3 = this._spatial.rotate(C, node.rotation);\n\n        return [-RC.x, -RC.y, -RC.z];\n    }\n\n    private _sameConnectedComponent(): boolean {\n        let current: Node = this._currentNode;\n        let previous: Node = this._previousNode;\n\n        if (!current ||\n            !current.mergeCC ||\n            !previous ||\n            !previous.mergeCC) {\n            return true;\n        }\n\n        return current.mergeCC === previous.mergeCC;\n    }\n\n    private _withinOriginalDistance(): boolean {\n        let current: Node = this._currentNode;\n        let previous: Node = this._previousNode;\n\n        if (!current || !previous) {\n            return true;\n        }\n\n        // 50 km/h moves 28m in 2s\n        let distance: number = this._spatial.distanceFromLatLon(\n            current.originalLatLon.lat,\n            current.originalLatLon.lon,\n            previous.originalLatLon.lat,\n            previous.originalLatLon.lon);\n\n        return distance < 25;\n    }\n}\n",
-    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as UnitBezier from \"@mapbox/unitbezier\";\n\nimport {IGPano} from \"../../API\";\nimport {IState, StateBase, IRotation, WaitingState} from \"../../State\";\nimport {Node} from \"../../Graph\";\nimport {Camera, Transform} from \"../../Geo\";\n\nclass RotationDelta implements IRotation {\n    private _phi: number;\n    private _theta: number;\n\n    constructor(phi: number, theta: number) {\n        this._phi = phi;\n        this._theta = theta;\n    }\n\n    public get phi(): number {\n        return this._phi;\n    }\n\n    public set phi(value: number) {\n        this._phi = value;\n    }\n\n    public get theta(): number {\n        return this._theta;\n    }\n\n    public set theta(value: number) {\n        this._theta = value;\n    }\n\n    public get isZero(): boolean {\n        return this._phi === 0 && this._theta === 0;\n    }\n\n    public copy(delta: IRotation): void {\n        this._phi = delta.phi;\n        this._theta = delta.theta;\n    }\n\n    public lerp(other: IRotation, alpha: number): void {\n        this._phi =  (1 - alpha) * this._phi + alpha * other.phi;\n        this._theta =  (1 - alpha) * this._theta + alpha * other.theta;\n    }\n\n    public multiply(value: number): void {\n        this._phi *= value;\n        this._theta *= value;\n    }\n\n    public threshold(value: number): void {\n        this._phi = Math.abs(this._phi) > value ? this._phi : 0;\n        this._theta = Math.abs(this._theta) > value ? this._theta : 0;\n    }\n\n    public lengthSquared(): number {\n        return this._phi * this._phi + this._theta * this._theta;\n    }\n\n    public reset(): void {\n        this._phi = 0;\n        this._theta = 0;\n    }\n}\n\nexport class TraversingState extends StateBase {\n    private _baseAlpha: number;\n    private _animationSpeed: number;\n\n    private _unitBezier: UnitBezier;\n    private _useBezier: boolean;\n\n    private _rotationDelta: RotationDelta;\n    private _requestedRotationDelta: RotationDelta;\n\n    private _basicRotation: number[];\n    private _requestedBasicRotation: number[];\n    private _requestedBasicRotationUnbounded: number[];\n\n    private _rotationAcceleration: number;\n    private _rotationIncreaseAlpha: number;\n    private _rotationDecreaseAlpha: number;\n    private _rotationThreshold: number;\n    private _unboundedRotationAlpha: number;\n\n    private _desiredZoom: number;\n    private _minZoom: number;\n    private _maxZoom: number;\n    private _lookatDepth: number;\n    private _desiredLookat: THREE.Vector3;\n    private _desiredCenter: number[];\n\n    constructor (state: IState) {\n        super(state);\n\n        this._adjustCameras();\n\n        this._motionless = this._motionlessTransition();\n\n        this._baseAlpha = this._alpha;\n        this._animationSpeed = 0.025;\n        this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);\n        this._useBezier = false;\n\n        this._rotationDelta = new RotationDelta(0, 0);\n        this._requestedRotationDelta = null;\n\n        this._basicRotation = [0, 0];\n        this._requestedBasicRotation = null;\n        this._requestedBasicRotationUnbounded = null;\n\n        this._rotationAcceleration = 0.86;\n        this._rotationIncreaseAlpha = 0.97;\n        this._rotationDecreaseAlpha = 0.9;\n        this._rotationThreshold = 1e-3;\n        this._unboundedRotationAlpha = 0.8;\n\n        this._desiredZoom = state.zoom;\n        this._minZoom = 0;\n        this._maxZoom = 3;\n        this._lookatDepth = 10;\n\n        this._desiredLookat = null;\n        this._desiredCenter = null;\n    }\n\n    public traverse(): StateBase {\n        throw new Error(\"Not implemented\");\n    }\n\n    public wait(): StateBase {\n        return new WaitingState(this);\n    }\n\n    public append(nodes: Node[]): void {\n        let emptyTrajectory: boolean = this._trajectory.length === 0;\n\n        if (emptyTrajectory) {\n            this._resetTransition();\n        }\n\n        super.append(nodes);\n\n        if (emptyTrajectory) {\n            this._setDesiredCenter();\n            this._setDesiredZoom();\n        }\n    }\n\n    public prepend(nodes: Node[]): void {\n        let emptyTrajectory: boolean = this._trajectory.length === 0;\n\n        if (emptyTrajectory) {\n            this._resetTransition();\n        }\n\n        super.prepend(nodes);\n\n        if (emptyTrajectory) {\n            this._setDesiredCenter();\n            this._setDesiredZoom();\n        }\n    }\n\n    public set(nodes: Node[]): void {\n        super.set(nodes);\n\n        this._desiredLookat = null;\n\n        this._resetTransition();\n        this._clearRotation();\n\n        this._setDesiredCenter();\n        this._setDesiredZoom();\n\n        if (this._trajectory.length < 3) {\n            this._useBezier = true;\n        }\n    }\n\n    public move(delta: number): void {\n        throw new Error(\"Not implemented\");\n    }\n\n    public moveTo(delta: number): void {\n        throw new Error(\"Not implemented\");\n    }\n\n    public rotate(rotationDelta: IRotation): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedBasicRotation = null;\n\n        if (this._requestedRotationDelta != null) {\n            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;\n            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;\n        } else {\n            this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta);\n        }\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n\n        if (this._requestedBasicRotation != null) {\n            this._requestedBasicRotation[0] += basicRotation[0];\n            this._requestedBasicRotation[1] += basicRotation[1];\n\n            let threshold: number = 0.05 / Math.pow(2, this._zoom);\n\n            this._requestedBasicRotation[0] =\n                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);\n\n            this._requestedBasicRotation[1] =\n                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);\n        } else {\n            this._requestedBasicRotation = basicRotation.slice();\n        }\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        if (this._requestedBasicRotationUnbounded != null) {\n            this._requestedBasicRotationUnbounded[0] += basicRotation[0];\n            this._requestedBasicRotationUnbounded[1] += basicRotation[1];\n        } else {\n            this._requestedBasicRotationUnbounded = basicRotation.slice();\n        }\n    }\n\n    public rotateBasicWithoutInertia(basic: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n\n        const threshold: number = 0.05 / Math.pow(2, this._zoom);\n\n        const basicRotation: number[] = basic.slice();\n        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);\n        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);\n\n        this._applyRotationBasic(basicRotation);\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n\n        basic[0] = this._spatial.clamp(basic[0], 0, 1);\n        basic[1] = this._spatial.clamp(basic[1], 0, 1);\n\n        let lookat: number[] = this.currentTransform.unprojectBasic(basic, this._lookatDepth);\n        this._currentCamera.lookat.fromArray(lookat);\n    }\n\n    public zoomIn(delta: number, reference: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));\n\n        let currentCenter: number[] = this.currentTransform.projectBasic(\n            this._currentCamera.lookat.toArray());\n\n        let currentCenterX: number = currentCenter[0];\n        let currentCenterY: number = currentCenter[1];\n\n        let zoom0: number = Math.pow(2, this._zoom);\n        let zoom1: number = Math.pow(2, this._desiredZoom);\n\n        let refX: number = reference[0];\n        let refY: number = reference[1];\n\n        if (this.currentTransform.gpano != null &&\n            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {\n            if (refX - currentCenterX > 0.5) {\n                refX = refX - 1;\n            } else if (currentCenterX - refX > 0.5) {\n                refX = 1 + refX;\n            }\n        }\n\n        let newCenterX: number = refX - zoom0 / zoom1 * (refX - currentCenterX);\n        let newCenterY: number = refY - zoom0 / zoom1 * (refY - currentCenterY);\n\n        let gpano: IGPano = this.currentTransform.gpano;\n\n        if (this._currentNode.fullPano) {\n            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);\n        } else if (gpano != null &&\n            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {\n            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);\n        } else {\n            newCenterX = this._spatial.clamp(newCenterX, 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY, 0, 1);\n        }\n\n        this._desiredLookat = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));\n    }\n\n    public setCenter(center: number[]): void {\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n        this._desiredZoom = this._zoom;\n\n        let clamped: number[] = [\n            this._spatial.clamp(center[0], 0, 1),\n            this._spatial.clamp(center[1], 0, 1),\n        ];\n\n        if (this._currentNode == null) {\n            this._desiredCenter = clamped;\n            return;\n        }\n\n        this._desiredCenter = null;\n\n        let currentLookat: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));\n\n        let previousTransform: Transform = this.previousTransform != null ?\n            this.previousTransform :\n            this.currentTransform;\n        let previousLookat: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));\n\n        this._currentCamera.lookat.copy(currentLookat);\n        this._previousCamera.lookat.copy(previousLookat);\n    }\n\n    public setZoom(zoom: number): void {\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n\n        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);\n        this._desiredZoom = this._zoom;\n    }\n\n    public update(fps: number): void {\n        if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {\n            this._currentIndex += 1;\n\n            this._useBezier = this._trajectory.length < 3 &&\n                this._currentIndex + 1 === this._trajectory.length;\n\n            this._setCurrent();\n            this._resetTransition();\n            this._clearRotation();\n\n            this._desiredZoom = this._currentNode.fullPano ? this._zoom : 0;\n\n            this._desiredLookat = null;\n        }\n\n        let animationSpeed: number = this._animationSpeed * (60 / fps);\n        this._baseAlpha = Math.min(1, this._baseAlpha + animationSpeed);\n        if (this._useBezier) {\n            this._alpha = this._unitBezier.solve(this._baseAlpha);\n        } else {\n            this._alpha = this._baseAlpha;\n        }\n\n        this._updateRotation();\n        if (!this._rotationDelta.isZero) {\n            this._applyRotation(this._previousCamera);\n            this._applyRotation(this._currentCamera);\n        }\n\n        this._updateRotationBasic();\n        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {\n            this._applyRotationBasic(this._basicRotation);\n        }\n\n        this._updateZoom(animationSpeed);\n        this._updateLookat(animationSpeed);\n\n        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);\n    }\n\n    protected _getAlpha(): number {\n        return this._motionless ? Math.ceil(this._alpha) : this._alpha;\n    }\n\n    protected _setCurrentCamera(): void {\n        super._setCurrentCamera();\n\n        this._adjustCameras();\n    }\n\n    private _adjustCameras(): void {\n        if (this._previousNode == null) {\n            return;\n        }\n\n        let lookat: THREE.Vector3 = this._camera.lookat.clone().sub(this._camera.position);\n        this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));\n\n        if (this._currentNode.fullPano) {\n            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));\n        }\n    }\n\n    private _resetTransition(): void {\n        this._alpha = 0;\n        this._baseAlpha = 0;\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    private _applyRotation(camera: Camera): void {\n        if (camera == null) {\n            return;\n        }\n\n        let q: THREE.Quaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3( 0, 0, 1 ));\n        let qInverse: THREE.Quaternion = q.clone().inverse();\n\n        let offset: THREE.Vector3 = new THREE.Vector3();\n        offset.copy(camera.lookat).sub(camera.position);\n        offset.applyQuaternion(q);\n        let length: number = offset.length();\n\n        let phi: number = Math.atan2(offset.y, offset.x);\n        phi += this._rotationDelta.phi;\n\n        let theta: number = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);\n        theta += this._rotationDelta.theta;\n        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));\n\n        offset.x = Math.sin(theta) * Math.cos(phi);\n        offset.y = Math.sin(theta) * Math.sin(phi);\n        offset.z = Math.cos(theta);\n        offset.applyQuaternion(qInverse);\n\n        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));\n    }\n\n    private _applyRotationBasic(basicRotation: number[]): void {\n        let currentNode: Node = this._currentNode;\n        let previousNode: Node = this._previousNode != null ?\n            this.previousNode :\n            this.currentNode;\n\n        let currentCamera: Camera = this._currentCamera;\n        let previousCamera: Camera = this._previousCamera;\n\n        let currentTransform: Transform = this.currentTransform;\n        let previousTransform: Transform = this.previousTransform != null ?\n            this.previousTransform :\n            this.currentTransform;\n\n        let currentBasic: number[] = currentTransform.projectBasic(currentCamera.lookat.toArray());\n        let previousBasic: number[] = previousTransform.projectBasic(previousCamera.lookat.toArray());\n\n        let currentGPano: IGPano = currentTransform.gpano;\n        let previousGPano: IGPano = previousTransform.gpano;\n\n        if (currentNode.fullPano) {\n            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);\n        } else if (currentGPano != null &&\n            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {\n            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        } else {\n            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        }\n\n        if (previousNode.fullPano) {\n            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);\n        } else if (previousGPano != null &&\n            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {\n            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);\n        } else {\n            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        }\n\n        let currentLookat: number[] = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);\n        currentCamera.lookat.fromArray(currentLookat);\n\n        let previousLookat: number[] = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);\n        previousCamera.lookat.fromArray(previousLookat);\n    }\n\n    private _updateZoom(animationSpeed: number): void {\n        let diff: number = this._desiredZoom - this._zoom;\n        let sign: number = diff > 0 ? 1 : diff < 0 ? -1 : 0;\n\n        if (diff === 0) {\n            return;\n        } else if (Math.abs(diff) < 2e-3) {\n            this._zoom = this._desiredZoom;\n            if (this._desiredLookat != null) {\n                this._desiredLookat = null;\n            }\n        } else {\n            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);\n        }\n    }\n\n    private _updateLookat(animationSpeed: number): void {\n        if (this._desiredLookat === null) {\n            return;\n        }\n\n        let diff: number = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);\n\n        if (Math.abs(diff) < 1e-6) {\n            this._currentCamera.lookat.copy(this._desiredLookat);\n            this._desiredLookat = null;\n        } else {\n            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);\n        }\n    }\n\n    private _updateRotation(): void {\n        if (this._requestedRotationDelta != null) {\n            let length: number = this._rotationDelta.lengthSquared();\n            let requestedLength: number = this._requestedRotationDelta.lengthSquared();\n\n            if (requestedLength > length) {\n                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);\n            } else {\n                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);\n            }\n\n            this._requestedRotationDelta = null;\n\n            return;\n        }\n\n        if (this._rotationDelta.isZero) {\n            return;\n        }\n\n        this._rotationDelta.multiply(this._rotationAcceleration);\n        this._rotationDelta.threshold(this._rotationThreshold);\n    }\n\n    private _updateRotationBasic(): void {\n        if (this._requestedBasicRotation != null) {\n            let x: number = this._basicRotation[0];\n            let y: number = this._basicRotation[1];\n\n            let reqX: number = this._requestedBasicRotation[0];\n            let reqY: number = this._requestedBasicRotation[1];\n\n            if (Math.abs(reqX) > Math.abs(x)) {\n                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;\n            } else {\n                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;\n            }\n\n            if (Math.abs(reqY) > Math.abs(y)) {\n                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;\n            } else {\n                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;\n            }\n\n            this._requestedBasicRotation = null;\n\n            return;\n        }\n\n        if (this._requestedBasicRotationUnbounded != null) {\n            let reqX: number = this._requestedBasicRotationUnbounded[0];\n            let reqY: number = this._requestedBasicRotationUnbounded[1];\n\n            if (Math.abs(reqX) > 0) {\n                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;\n            }\n\n            if (Math.abs(reqY) > 0) {\n                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;\n            }\n\n            if (this._desiredLookat != null) {\n                let desiredBasicLookat: number[] = this.currentTransform.projectBasic(this._desiredLookat.toArray());\n\n                desiredBasicLookat[0] += reqX;\n                desiredBasicLookat[1] += reqY;\n\n                this._desiredLookat = new THREE.Vector3()\n                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));\n            }\n\n            this._requestedBasicRotationUnbounded = null;\n        }\n\n        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {\n            return;\n        }\n\n        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];\n        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];\n\n        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&\n            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {\n            this._basicRotation = [0, 0];\n        }\n    }\n\n    private _clearRotation(): void {\n        if (this._currentNode.fullPano) {\n            return;\n        }\n\n        if (this._requestedRotationDelta != null) {\n            this._requestedRotationDelta = null;\n        }\n\n        if (!this._rotationDelta.isZero) {\n            this._rotationDelta.reset();\n        }\n\n        if (this._requestedBasicRotation != null) {\n            this._requestedBasicRotation = null;\n        }\n\n        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {\n            this._basicRotation = [0, 0];\n        }\n    }\n\n    private _setDesiredCenter(): void {\n        if (this._desiredCenter == null) {\n            return;\n        }\n\n        let lookatDirection: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))\n            .sub(this._currentCamera.position);\n\n        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));\n        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));\n\n        this._desiredCenter = null;\n    }\n\n    private _setDesiredZoom(): void {\n        this._desiredZoom =\n            this._currentNode.fullPano || this._previousNode == null ?\n            this._zoom : 0;\n    }\n}\n",
-    "import {Node} from \"../../Graph\";\nimport {IState, StateBase, IRotation, TraversingState} from \"../../State\";\n\nexport class WaitingState extends StateBase {\n    constructor(state: IState) {\n        super(state);\n\n        this._zoom = 0;\n\n        this._adjustCameras();\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public traverse(): StateBase {\n        return new TraversingState(this);\n    }\n\n    public wait(): StateBase {\n        throw new Error(\"Not implemented\");\n    }\n\n    public prepend(nodes: Node[]): void {\n        super.prepend(nodes);\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public set(nodes: Node[]): void {\n        super.set(nodes);\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public rotate(delta: IRotation): void { return; }\n\n    public rotateBasic(basicRotation: number[]): void { return; }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void { return; }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void { return; }\n\n    public rotateToBasic(basic: number[]): void { return; }\n\n    public zoomIn(delta: number, reference: number[]): void { return; }\n\n    public move(delta: number): void {\n        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));\n    }\n\n    public moveTo(position: number): void {\n        this._alpha = Math.max(0, Math.min(1, position));\n    }\n\n    public update(fps: number): void {\n        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);\n    }\n\n    public setCenter(center: number[]): void { return; }\n\n    public setZoom(zoom: number): void { return; }\n\n    protected _getAlpha(): number {\n        return this._motionless ? Math.round(this._alpha) : this._alpha;\n    }\n\n    protected _setCurrentCamera(): void {\n        super._setCurrentCamera();\n\n        this._adjustCameras();\n    }\n\n    private _adjustCameras(): void {\n        if (this._previousNode == null) {\n            return;\n        }\n\n        if (this._currentNode.fullPano) {\n            let lookat: THREE.Vector3 = this._camera.lookat.clone().sub(this._camera.position);\n            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));\n        }\n\n        if (this._previousNode.fullPano) {\n            let lookat: THREE.Vector3 = this._currentCamera.lookat.clone().sub(this._currentCamera.position);\n            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));\n        }\n    }\n}\n",
+    "import {\n    IStateContext,\n    StateBase,\n    State,\n    TraversingState,\n    WaitingState,\n    IRotation,\n} from \"../State\";\nimport {Node} from \"../Graph\";\nimport {Camera, ILatLonAlt, Transform} from \"../Geo\";\n\nexport class StateContext implements IStateContext {\n    private _state: StateBase;\n\n    constructor() {\n        this._state = new TraversingState({\n            alpha: 1,\n            camera: new Camera(),\n            currentIndex: -1,\n            reference: { alt: 0, lat: 0, lon: 0 },\n            trajectory: [],\n            zoom: 0,\n        });\n    }\n\n    public traverse(): void {\n        this._state = this._state.traverse();\n    }\n\n    public wait(): void {\n        this._state = this._state.wait();\n    }\n\n    public get state(): State {\n        if (this._state instanceof TraversingState) {\n            return State.Traversing;\n        } else if (this._state instanceof WaitingState) {\n            return State.Waiting;\n        }\n\n        throw new Error(\"Invalid state\");\n    }\n\n    public get reference(): ILatLonAlt {\n        return this._state.reference;\n    }\n\n    public get alpha(): number {\n        return this._state.alpha;\n    }\n\n    public get camera(): Camera {\n        return this._state.camera;\n    }\n\n    public get zoom(): number {\n        return this._state.zoom;\n    }\n\n    public get currentNode(): Node {\n        return this._state.currentNode;\n    }\n\n    public get previousNode(): Node {\n        return this._state.previousNode;\n    }\n\n    public get currentCamera(): Camera {\n        return this._state.currentCamera;\n    }\n\n    public get currentTransform(): Transform {\n        return this._state.currentTransform;\n    }\n\n    public get previousTransform(): Transform {\n        return this._state.previousTransform;\n    }\n\n    public get trajectory(): Node[] {\n        return this._state.trajectory;\n    }\n\n    public get currentIndex(): number {\n        return this._state.currentIndex;\n    }\n\n    public get lastNode(): Node {\n        return this._state.trajectory[this._state.trajectory.length - 1];\n    }\n\n    public get nodesAhead(): number {\n        return this._state.trajectory.length - 1 - this._state.currentIndex;\n    }\n\n    public get motionless(): boolean {\n        return this._state.motionless;\n    }\n\n    public getCenter(): number[] {\n        return this._state.getCenter();\n    }\n\n    public setCenter(center: number[]): void {\n        this._state.setCenter(center);\n    }\n\n    public setZoom(zoom: number): void {\n        this._state.setZoom(zoom);\n    }\n\n    public update(fps: number): void {\n        this._state.update(fps);\n    }\n\n    public append(nodes: Node[]): void {\n        this._state.append(nodes);\n    }\n\n    public prepend(nodes: Node[]): void {\n        this._state.prepend(nodes);\n    }\n\n    public remove(n: number): void {\n        this._state.remove(n);\n    }\n\n    public clear(): void {\n        this._state.clear();\n    }\n\n    public clearPrior(): void {\n        this._state.clearPrior();\n    }\n\n    public cut(): void {\n        this._state.cut();\n    }\n\n    public set(nodes: Node[]): void {\n        this._state.set(nodes);\n    }\n\n    public rotate(delta: IRotation): void {\n        this._state.rotate(delta);\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        this._state.rotateBasic(basicRotation);\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        this._state.rotateBasicUnbounded(basicRotation);\n    }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void {\n        this._state.rotateBasicWithoutInertia(basicRotation);\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        this._state.rotateToBasic(basic);\n    }\n\n    public move(delta: number): void {\n        this._state.move(delta);\n    }\n\n    public moveTo(delta: number): void {\n        this._state.moveTo(delta);\n    }\n\n    public zoomIn(delta: number, reference: number[]): void {\n        this._state.zoomIn(delta, reference);\n    }\n\n    public setSpeed(speed: number): void {\n        this._state.setSpeed(speed);\n    }\n}\n",
+    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {RequestAnimationFrameDefinition} from \"rxjs/util/AnimationFrame\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/pairwise\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {ILatLon} from \"../API\";\nimport {Node} from \"../Graph\";\nimport {\n    Camera,\n    ILatLonAlt,\n    Transform,\n} from \"../Geo\";\nimport {\n    IStateContext,\n    IFrame,\n    IRotation,\n    StateContext,\n    State,\n} from \"../State\";\n\ninterface IContextOperation {\n    (context: IStateContext): IStateContext;\n}\n\nexport class StateService {\n    private _start$: Subject<void>;\n\n    private _frame$: Subject<number>;\n\n    private _contextOperation$: BehaviorSubject<IContextOperation>;\n    private _context$: Observable<IStateContext>;\n    private _fps$: Observable<number>;\n    private _state$: Observable<State>;\n\n    private _currentState$: Observable<IFrame>;\n    private _lastState$: Observable<IFrame>;\n    private _currentNode$: Observable<Node>;\n    private _currentNodeExternal$: Observable<Node>;\n    private _currentCamera$: Observable<Camera>;\n    private _currentKey$: BehaviorSubject<string>;\n    private _currentTransform$: Observable<Transform>;\n    private _reference$: Observable<ILatLonAlt>;\n\n    private _inMotionOperation$: Subject<boolean>;\n    private _inMotion$: Observable<boolean>;\n\n    private _inTranslationOperation$: Subject<boolean>;\n    private _inTranslation$: Observable<boolean>;\n\n    private _appendNode$: Subject<Node> = new Subject<Node>();\n\n    private _frameGenerator: RequestAnimationFrameDefinition;\n    private _frameId: number;\n\n    private _fpsSampleRate: number;\n\n    constructor () {\n        this._start$ = new Subject<void>();\n        this._frame$ = new Subject<number>();\n        this._fpsSampleRate = 30;\n\n        this._contextOperation$ = new BehaviorSubject<IContextOperation>(\n            (context: IStateContext): IStateContext => {\n                return context;\n            });\n\n        this._context$ = this._contextOperation$\n            .scan(\n                (context: IStateContext, operation: IContextOperation): IStateContext => {\n                    return operation(context);\n                },\n                new StateContext())\n            .publishReplay(1)\n            .refCount();\n\n        this._state$ = this._context$\n            .map(\n                (context: IStateContext): State => {\n                    return context.state;\n                })\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._fps$ = this._start$\n            .switchMap(\n                (): Observable<number> => {\n                    return this._frame$\n                        .bufferCount(1, this._fpsSampleRate)\n                        .map(\n                            (frameIds: number[]): number => {\n                                return new Date().getTime();\n                            })\n                        .pairwise()\n                        .map(\n                            (times: [number, number]): number => {\n                                return Math.max(20, 1000 * this._fpsSampleRate / (times[1] - times[0]));\n                            })\n                        .startWith(60);\n                })\n            .share();\n\n        this._currentState$ = this._frame$\n            .withLatestFrom(\n                this._fps$,\n                this._context$,\n                (frameId: number, fps: number, context: IStateContext): [number, number, IStateContext] => {\n                    return [frameId, fps, context];\n                })\n            .filter(\n                (fc: [number, number, IStateContext]): boolean => {\n                    return fc[2].currentNode != null;\n                })\n            .do(\n                (fc: [number, number, IStateContext]): void => {\n                    fc[2].update(fc[1]);\n                })\n            .map(\n                (fc: [number, number, IStateContext]): IFrame => {\n                    return { fps: fc[1], id: fc[0], state: fc[2] };\n                })\n            .share();\n\n        this._lastState$ = this._currentState$\n            .publishReplay(1)\n            .refCount();\n\n        let nodeChanged$: Observable<IFrame> = this._currentState$\n            .distinctUntilChanged(\n                undefined,\n                (f: IFrame): string => {\n                    return f.state.currentNode.key;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        let nodeChangedSubject$: Subject<IFrame> = new Subject<IFrame>();\n\n        nodeChanged$\n            .subscribe(nodeChangedSubject$);\n\n        this._currentKey$ = new BehaviorSubject<string>(null);\n\n        nodeChangedSubject$\n            .map(\n                (f: IFrame): string => {\n                    return f.state.currentNode.key;\n                })\n            .subscribe(this._currentKey$);\n\n        this._currentNode$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Node => {\n                    return f.state.currentNode;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentCamera$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Camera => {\n                    return f.state.currentCamera;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentTransform$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): Transform => {\n                    return f.state.currentTransform;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._reference$ = nodeChangedSubject$\n            .map(\n                (f: IFrame): ILatLonAlt => {\n                    return f.state.reference;\n                })\n            .distinctUntilChanged(\n                (r1: ILatLon, r2: ILatLon): boolean => {\n                    return r1.lat === r2.lat && r1.lon === r2.lon;\n                },\n                (reference: ILatLonAlt): ILatLon => {\n                    return { lat: reference.lat, lon: reference.lon };\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._currentNodeExternal$ = nodeChanged$\n            .map(\n                (f: IFrame): Node => {\n                    return f.state.currentNode;\n                })\n            .publishReplay(1)\n            .refCount();\n\n        this._appendNode$\n            .map(\n                (node: Node) => {\n                    return (context: IStateContext): IStateContext => {\n                        context.append([node]);\n\n                        return context;\n                    };\n                })\n            .subscribe(this._contextOperation$);\n\n        this._inMotionOperation$ = new Subject<boolean>();\n\n        nodeChanged$\n            .map(\n                (frame: IFrame): boolean => {\n                    return true;\n                })\n            .subscribe(this._inMotionOperation$);\n\n        this._inMotionOperation$\n            .distinctUntilChanged()\n            .filter(\n                (moving: boolean): boolean => {\n                    return moving;\n                })\n            .switchMap(\n                (moving: boolean): Observable<boolean> => {\n                    return this._currentState$\n                        .filter(\n                            (frame: IFrame): boolean => {\n                                return frame.state.nodesAhead === 0;\n                            })\n                        .map(\n                            (frame: IFrame): [Camera, number] => {\n                                return [frame.state.camera.clone(), frame.state.zoom];\n                            })\n                        .pairwise()\n                        .map(\n                            (pair: [[Camera, number], [Camera, number]]): boolean => {\n                                let c1: Camera = pair[0][0];\n                                let c2: Camera = pair[1][0];\n\n                                let z1: number = pair[0][1];\n                                let z2: number = pair[1][1];\n\n                                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;\n                            })\n                        .first(\n                            (changed: boolean): boolean => {\n                                return !changed;\n                            });\n                })\n            .subscribe(this._inMotionOperation$);\n\n        this._inMotion$ = this._inMotionOperation$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._inTranslationOperation$ = new Subject<boolean>();\n\n        nodeChanged$\n            .map(\n                (frame: IFrame): boolean => {\n                    return true;\n                })\n            .subscribe(this._inTranslationOperation$);\n\n        this._inTranslationOperation$\n            .distinctUntilChanged()\n            .filter(\n                (inTranslation: boolean): boolean => {\n                    return inTranslation;\n                })\n            .switchMap(\n                (inTranslation: boolean): Observable<boolean> => {\n                    return this._currentState$\n                        .filter(\n                            (frame: IFrame): boolean => {\n                                return frame.state.nodesAhead === 0;\n                            })\n                        .map(\n                            (frame: IFrame): THREE.Vector3 => {\n                                return frame.state.camera.position.clone();\n                            })\n                        .pairwise()\n                        .map(\n                            (pair: [THREE.Vector3, THREE.Vector3]): boolean => {\n                                return pair[0].distanceToSquared(pair[1]) !== 0;\n                            })\n                        .first(\n                            (changed: boolean): boolean => {\n                                return !changed;\n                            });\n                })\n            .subscribe(this._inTranslationOperation$);\n\n        this._inTranslation$ = this._inTranslationOperation$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._state$.subscribe(() => { /*noop*/ });\n        this._currentNode$.subscribe(() => { /*noop*/ });\n        this._currentCamera$.subscribe(() => { /*noop*/ });\n        this._currentTransform$.subscribe(() => { /*noop*/ });\n        this._reference$.subscribe(() => { /*noop*/ });\n        this._currentNodeExternal$.subscribe(() => { /*noop*/ });\n        this._lastState$.subscribe(() => { /*noop*/ });\n        this._inMotion$.subscribe(() => { /*noop*/ });\n        this._inTranslation$.subscribe(() => { /*noop*/ });\n\n        this._frameId = null;\n        this._frameGenerator = new RequestAnimationFrameDefinition(window);\n    }\n\n    public get currentState$(): Observable<IFrame> {\n        return this._currentState$;\n    }\n\n    public get currentNode$(): Observable<Node> {\n        return this._currentNode$;\n    }\n\n    public get currentKey$(): Observable<string> {\n        return this._currentKey$;\n    }\n\n    public get currentNodeExternal$(): Observable<Node> {\n        return this._currentNodeExternal$;\n    }\n\n    public get currentCamera$(): Observable<Camera> {\n        return this._currentCamera$;\n    }\n\n    public get currentTransform$(): Observable<Transform> {\n        return this._currentTransform$;\n    }\n\n    public get state$(): Observable<State> {\n        return this._state$;\n    }\n\n    public get reference$(): Observable<ILatLonAlt> {\n        return this._reference$;\n    }\n\n    public get inMotion$(): Observable<boolean> {\n        return this._inMotion$;\n    }\n\n    public get inTranslation$(): Observable<boolean> {\n        return this._inTranslation$;\n    }\n\n    public get appendNode$(): Subject<Node> {\n        return this._appendNode$;\n    }\n\n    public traverse(): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.traverse(); });\n    }\n\n    public wait(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.wait(); });\n    }\n\n    public appendNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.append(nodes); });\n    }\n\n    public prependNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.prepend(nodes); });\n    }\n\n    public removeNodes(n: number): void {\n        this._invokeContextOperation((context: IStateContext) => { context.remove(n); });\n    }\n\n    public clearNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.clear(); });\n    }\n\n    public clearPriorNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.clearPrior(); });\n    }\n\n    public cutNodes(): void {\n        this._invokeContextOperation((context: IStateContext) => { context.cut(); });\n    }\n\n    public setNodes(nodes: Node[]): void {\n        this._invokeContextOperation((context: IStateContext) => { context.set(nodes); });\n    }\n\n    public rotate(delta: IRotation): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotate(delta); });\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasic(basicRotation); });\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasicUnbounded(basicRotation); });\n    }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateBasicWithoutInertia(basicRotation); });\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.rotateToBasic(basic); });\n    }\n\n    public move(delta: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.move(delta); });\n    }\n\n    public moveTo(position: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.moveTo(position); });\n    }\n\n    /**\n     * Change zoom level while keeping the reference point position approximately static.\n     *\n     * @parameter {number} delta - Change in zoom level.\n     * @parameter {Array<number>} reference - Reference point in basic coordinates.\n     */\n    public zoomIn(delta: number, reference: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.zoomIn(delta, reference); });\n    }\n\n    public getCenter(): Observable<number[]> {\n        return this._lastState$\n            .first()\n            .map(\n                (frame: IFrame): number[] => {\n                    return (<IStateContext>frame.state).getCenter();\n                });\n    }\n\n    public getZoom(): Observable<number> {\n        return this._lastState$\n            .first()\n            .map(\n                (frame: IFrame): number => {\n                    return frame.state.zoom;\n                });\n    }\n\n    public setCenter(center: number[]): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.setCenter(center); });\n    }\n\n    public setSpeed(speed: number): void {\n        this._invokeContextOperation((context: IStateContext) => { context.setSpeed(speed); });\n    }\n\n    public setZoom(zoom: number): void {\n        this._inMotionOperation$.next(true);\n        this._invokeContextOperation((context: IStateContext) => { context.setZoom(zoom); });\n    }\n\n    public start(): void {\n        if (this._frameId == null) {\n            this._start$.next(null);\n            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));\n            this._frame$.next(this._frameId);\n        }\n    }\n\n    public stop(): void {\n        if (this._frameId != null) {\n            this._frameGenerator.cancelAnimationFrame(this._frameId);\n            this._frameId = null;\n        }\n    }\n\n    private _invokeContextOperation(action: (context: IStateContext) => void): void {\n        this._contextOperation$\n            .next(\n                (context: IStateContext): IStateContext => {\n                    action(context);\n\n                    return context;\n                });\n    }\n\n    private _frame(time: number): void {\n        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));\n        this._frame$.next(this._frameId);\n    }\n}\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport {ArgumentMapillaryError} from \"../../Error\";\nimport {Node} from \"../../Graph\";\nimport {Camera, GeoCoords, ILatLonAlt, Transform, Spatial} from \"../../Geo\";\nimport {IRotation, IState} from \"../../State\";\n\nexport abstract class StateBase implements IState {\n    protected _spatial: Spatial;\n    protected _geoCoords: GeoCoords;\n\n    protected _reference: ILatLonAlt;\n\n    protected _alpha: number;\n    protected _camera: Camera;\n    protected _zoom: number;\n\n    protected _currentIndex: number;\n\n    protected _trajectory: Node[];\n    protected _currentNode: Node;\n    protected _previousNode: Node;\n\n    protected _trajectoryTransforms: Transform[];\n\n    protected _trajectoryCameras: Camera[];\n    protected _currentCamera: Camera;\n    protected _previousCamera: Camera;\n\n    protected _motionless: boolean;\n\n    private _referenceThreshold: number;\n\n    constructor(state: IState) {\n        this._spatial = new Spatial();\n        this._geoCoords = new GeoCoords();\n\n        this._referenceThreshold = 0.01;\n\n        this._reference = state.reference;\n\n        this._alpha = state.alpha;\n        this._camera = state.camera.clone();\n        this._zoom = state.zoom;\n\n        this._currentIndex = state.currentIndex;\n\n        this._trajectory = state.trajectory.slice();\n        this._trajectoryTransforms = [];\n        this._trajectoryCameras = [];\n\n        for (let node of this._trajectory) {\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.push(transform);\n            this._trajectoryCameras.push(new Camera(transform));\n        }\n\n        this._currentNode = this._trajectory.length > 0 ?\n            this._trajectory[this._currentIndex] :\n            null;\n\n        this._previousNode = this._trajectory.length > 1 && this.currentIndex > 0 ?\n            this._trajectory[this._currentIndex - 1] :\n            null;\n\n        this._currentCamera = this._trajectoryCameras.length > 0 ?\n            this._trajectoryCameras[this._currentIndex].clone() :\n            new Camera();\n\n        this._previousCamera = this._trajectoryCameras.length > 1 && this.currentIndex > 0 ?\n            this._trajectoryCameras[this._currentIndex - 1].clone() :\n            this._currentCamera.clone();\n    }\n\n    public get reference(): ILatLonAlt {\n        return this._reference;\n    }\n\n    public get alpha(): number {\n        return this._getAlpha();\n    }\n\n    public get camera(): Camera {\n        return this._camera;\n    }\n\n    public get zoom(): number {\n        return this._zoom;\n    }\n\n    public get trajectory(): Node[] {\n        return this._trajectory;\n    }\n\n    public get currentIndex(): number {\n        return this._currentIndex;\n    }\n\n    public get currentNode(): Node {\n        return this._currentNode;\n    }\n\n    public get previousNode(): Node {\n        return this._previousNode;\n    }\n\n    public get currentCamera(): Camera {\n        return this._currentCamera;\n    }\n\n    public get currentTransform(): Transform {\n        return this._trajectoryTransforms.length > 0 ?\n            this._trajectoryTransforms[this.currentIndex] : null;\n    }\n\n    public get previousTransform(): Transform {\n        return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?\n            this._trajectoryTransforms[this.currentIndex - 1] : null;\n    }\n\n    public get motionless(): boolean {\n        return this._motionless;\n    }\n\n    public abstract traverse(): StateBase;\n\n    public abstract wait(): StateBase;\n\n    public abstract move(delta: number): void;\n\n    public abstract moveTo(position: number): void;\n\n    public abstract rotate(delta: IRotation): void;\n\n    public abstract rotateBasic(basicRotation: number[]): void;\n\n    public abstract rotateBasicUnbounded(basicRotation: number[]): void;\n\n    public abstract rotateBasicWithoutInertia(basicRotation: number[]): void;\n\n    public abstract rotateToBasic(basic: number[]): void;\n\n    public abstract setSpeed(speed: number): void;\n\n    public abstract zoomIn(delta: number, reference: number[]): void;\n\n    public abstract update(fps: number): void;\n\n    public append(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw Error(\"Trajectory can not be empty\");\n        }\n\n        if (this._currentIndex < 0) {\n            this.set(nodes);\n        } else {\n            this._trajectory = this._trajectory.concat(nodes);\n            this._appendToTrajectories(nodes);\n        }\n    }\n\n    public prepend(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw Error(\"Trajectory can not be empty\");\n        }\n\n        this._trajectory = nodes.slice().concat(this._trajectory);\n        this._currentIndex += nodes.length;\n\n        this._setCurrentNode();\n\n        let referenceReset: boolean = this._setReference(this._currentNode);\n        if (referenceReset) {\n            this._setTrajectories();\n        } else {\n            this._prependToTrajectories(nodes);\n        }\n\n        this._setCurrentCamera();\n    }\n\n    public remove(n: number): void {\n        if (n < 0) {\n            throw Error(\"n must be a positive integer\");\n        }\n\n        if (this._currentIndex - 1 < n) {\n            throw Error(\"Current and previous nodes can not be removed\");\n        }\n\n        for (let i: number = 0; i < n; i++) {\n            this._trajectory.shift();\n            this._trajectoryTransforms.shift();\n            this._trajectoryCameras.shift();\n            this._currentIndex--;\n        }\n\n        this._setCurrentNode();\n    }\n\n    public clearPrior(): void {\n        if (this._currentIndex > 0) {\n            this.remove(this._currentIndex - 1);\n        }\n    }\n\n    public clear(): void {\n        this.cut();\n\n        if (this._currentIndex > 0) {\n            this.remove(this._currentIndex - 1);\n        }\n    }\n\n    public cut(): void {\n        while (this._trajectory.length - 1 > this._currentIndex) {\n            this._trajectory.pop();\n            this._trajectoryTransforms.pop();\n            this._trajectoryCameras.pop();\n        }\n    }\n\n    public set(nodes: Node[]): void {\n        this._setTrajectory(nodes);\n        this._setCurrentNode();\n        this._setReference(this._currentNode);\n        this._setTrajectories();\n        this._setCurrentCamera();\n    }\n\n    public getCenter(): number[] {\n        return this._currentNode != null ?\n            this.currentTransform.projectBasic(this._camera.lookat.toArray()) :\n            [0.5, 0.5];\n    }\n\n    public abstract setCenter(center: number[]): void;\n\n    public abstract setZoom(zoom: number): void;\n\n    protected abstract _getAlpha(): number;\n\n    protected _setCurrent(): void {\n        this._setCurrentNode();\n\n        let referenceReset: boolean = this._setReference(this._currentNode);\n        if (referenceReset) {\n            this._setTrajectories();\n        }\n\n        this._setCurrentCamera();\n    }\n\n    protected _setCurrentCamera(): void {\n        this._currentCamera = this._trajectoryCameras[this._currentIndex].clone();\n        this._previousCamera = this._currentIndex > 0 ?\n            this._trajectoryCameras[this._currentIndex - 1].clone() :\n            this._currentCamera.clone();\n    }\n\n    protected _motionlessTransition(): boolean {\n        let nodesSet: boolean = this._currentNode != null && this._previousNode != null;\n\n        return nodesSet && !(\n            this._currentNode.merged &&\n            this._previousNode.merged &&\n            this._withinOriginalDistance() &&\n            this._sameConnectedComponent()\n        );\n    }\n\n    private _setReference(node: Node): boolean {\n        // do not reset reference if node is within threshold distance\n        if (Math.abs(node.latLon.lat - this.reference.lat) < this._referenceThreshold &&\n            Math.abs(node.latLon.lon - this.reference.lon) < this._referenceThreshold) {\n            return false;\n        }\n\n        // do not reset reference if previous node exist and transition is with motion\n        if (this._previousNode != null && !this._motionlessTransition()) {\n            return false;\n        }\n\n        this._reference.lat = node.latLon.lat;\n        this._reference.lon = node.latLon.lon;\n        this._reference.alt = node.alt;\n\n        return true;\n    }\n\n    private _setCurrentNode(): void {\n        this._currentNode = this._trajectory.length > 0 ?\n            this._trajectory[this._currentIndex] :\n            null;\n\n        this._previousNode = this._currentIndex > 0 ?\n            this._trajectory[this._currentIndex - 1] :\n            null;\n    }\n\n    private _setTrajectory(nodes: Node[]): void {\n        if (nodes.length < 1) {\n            throw new ArgumentMapillaryError(\"Trajectory can not be empty\");\n        }\n\n        if (this._currentNode != null) {\n            this._trajectory = [this._currentNode].concat(nodes);\n            this._currentIndex = 1;\n        } else {\n            this._trajectory = nodes.slice();\n            this._currentIndex = 0;\n        }\n    }\n\n    private _setTrajectories(): void {\n        this._trajectoryTransforms.length = 0;\n        this._trajectoryCameras.length = 0;\n\n        this._appendToTrajectories(this._trajectory);\n    }\n\n    private _appendToTrajectories(nodes: Node[]): void {\n        for (let node of nodes) {\n            if (!node.assetsCached) {\n                throw new ArgumentMapillaryError(\"Assets must be cached when node is added to trajectory\");\n            }\n\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.push(transform);\n            this._trajectoryCameras.push(new Camera(transform));\n        }\n    }\n\n    private _prependToTrajectories(nodes: Node[]): void {\n        for (let node of nodes.reverse()) {\n            if (!node.assetsCached) {\n                throw new ArgumentMapillaryError(\"Assets must be cached when added to trajectory\");\n            }\n\n            let translation: number[] = this._nodeToTranslation(node);\n            let transform: Transform = new Transform(node, node.image, translation);\n\n            this._trajectoryTransforms.unshift(transform);\n            this._trajectoryCameras.unshift(new Camera(transform));\n        }\n    }\n\n    private _nodeToTranslation(node: Node): number[] {\n        let C: number[] = this._geoCoords.geodeticToEnu(\n            node.latLon.lat,\n            node.latLon.lon,\n            node.alt,\n            this._reference.lat,\n            this._reference.lon,\n            this._reference.alt);\n\n        let RC: THREE.Vector3 = this._spatial.rotate(C, node.rotation);\n\n        return [-RC.x, -RC.y, -RC.z];\n    }\n\n    private _sameConnectedComponent(): boolean {\n        let current: Node = this._currentNode;\n        let previous: Node = this._previousNode;\n\n        if (!current ||\n            !current.mergeCC ||\n            !previous ||\n            !previous.mergeCC) {\n            return true;\n        }\n\n        return current.mergeCC === previous.mergeCC;\n    }\n\n    private _withinOriginalDistance(): boolean {\n        let current: Node = this._currentNode;\n        let previous: Node = this._previousNode;\n\n        if (!current || !previous) {\n            return true;\n        }\n\n        // 50 km/h moves 28m in 2s\n        let distance: number = this._spatial.distanceFromLatLon(\n            current.originalLatLon.lat,\n            current.originalLatLon.lon,\n            previous.originalLatLon.lat,\n            previous.originalLatLon.lon);\n\n        return distance < 25;\n    }\n}\n",
+    "/// <reference path=\"../../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as UnitBezier from \"@mapbox/unitbezier\";\n\nimport {IGPano} from \"../../API\";\nimport {IState, StateBase, IRotation, WaitingState} from \"../../State\";\nimport {Node} from \"../../Graph\";\nimport {Camera, Transform} from \"../../Geo\";\n\nclass RotationDelta implements IRotation {\n    private _phi: number;\n    private _theta: number;\n\n    constructor(phi: number, theta: number) {\n        this._phi = phi;\n        this._theta = theta;\n    }\n\n    public get phi(): number {\n        return this._phi;\n    }\n\n    public set phi(value: number) {\n        this._phi = value;\n    }\n\n    public get theta(): number {\n        return this._theta;\n    }\n\n    public set theta(value: number) {\n        this._theta = value;\n    }\n\n    public get isZero(): boolean {\n        return this._phi === 0 && this._theta === 0;\n    }\n\n    public copy(delta: IRotation): void {\n        this._phi = delta.phi;\n        this._theta = delta.theta;\n    }\n\n    public lerp(other: IRotation, alpha: number): void {\n        this._phi =  (1 - alpha) * this._phi + alpha * other.phi;\n        this._theta =  (1 - alpha) * this._theta + alpha * other.theta;\n    }\n\n    public multiply(value: number): void {\n        this._phi *= value;\n        this._theta *= value;\n    }\n\n    public threshold(value: number): void {\n        this._phi = Math.abs(this._phi) > value ? this._phi : 0;\n        this._theta = Math.abs(this._theta) > value ? this._theta : 0;\n    }\n\n    public lengthSquared(): number {\n        return this._phi * this._phi + this._theta * this._theta;\n    }\n\n    public reset(): void {\n        this._phi = 0;\n        this._theta = 0;\n    }\n}\n\nexport class TraversingState extends StateBase {\n    private _baseAlpha: number;\n\n    /**\n     * Animation speed in transitions per frame at 60 FPS. Run time\n     * animation speed is adjusted to FPS and according to speed\n     * coefficient.\n     */\n    private _animationSpeed: number;\n    private _speedCoefficient: number;\n\n    private _unitBezier: UnitBezier;\n    private _useBezier: boolean;\n\n    private _rotationDelta: RotationDelta;\n    private _requestedRotationDelta: RotationDelta;\n\n    private _basicRotation: number[];\n    private _requestedBasicRotation: number[];\n    private _requestedBasicRotationUnbounded: number[];\n\n    private _rotationAcceleration: number;\n    private _rotationIncreaseAlpha: number;\n    private _rotationDecreaseAlpha: number;\n    private _rotationThreshold: number;\n    private _unboundedRotationAlpha: number;\n\n    private _desiredZoom: number;\n    private _minZoom: number;\n    private _maxZoom: number;\n    private _lookatDepth: number;\n    private _desiredLookat: THREE.Vector3;\n    private _desiredCenter: number[];\n\n    constructor (state: IState) {\n        super(state);\n\n        this._adjustCameras();\n\n        this._motionless = this._motionlessTransition();\n\n        this._baseAlpha = this._alpha;\n        this._animationSpeed = 1 / 40;\n        this._speedCoefficient = 1;\n        this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);\n        this._useBezier = false;\n\n        this._rotationDelta = new RotationDelta(0, 0);\n        this._requestedRotationDelta = null;\n\n        this._basicRotation = [0, 0];\n        this._requestedBasicRotation = null;\n        this._requestedBasicRotationUnbounded = null;\n\n        this._rotationAcceleration = 0.86;\n        this._rotationIncreaseAlpha = 0.97;\n        this._rotationDecreaseAlpha = 0.9;\n        this._rotationThreshold = 1e-3;\n        this._unboundedRotationAlpha = 0.8;\n\n        this._desiredZoom = state.zoom;\n        this._minZoom = 0;\n        this._maxZoom = 3;\n        this._lookatDepth = 10;\n\n        this._desiredLookat = null;\n        this._desiredCenter = null;\n    }\n\n    public traverse(): StateBase {\n        throw new Error(\"Not implemented\");\n    }\n\n    public wait(): StateBase {\n        return new WaitingState(this);\n    }\n\n    public append(nodes: Node[]): void {\n        let emptyTrajectory: boolean = this._trajectory.length === 0;\n\n        if (emptyTrajectory) {\n            this._resetTransition();\n        }\n\n        super.append(nodes);\n\n        if (emptyTrajectory) {\n            this._setDesiredCenter();\n            this._setDesiredZoom();\n        }\n    }\n\n    public prepend(nodes: Node[]): void {\n        let emptyTrajectory: boolean = this._trajectory.length === 0;\n\n        if (emptyTrajectory) {\n            this._resetTransition();\n        }\n\n        super.prepend(nodes);\n\n        if (emptyTrajectory) {\n            this._setDesiredCenter();\n            this._setDesiredZoom();\n        }\n    }\n\n    public set(nodes: Node[]): void {\n        super.set(nodes);\n\n        this._desiredLookat = null;\n\n        this._resetTransition();\n        this._clearRotation();\n\n        this._setDesiredCenter();\n        this._setDesiredZoom();\n\n        if (this._trajectory.length < 3) {\n            this._useBezier = true;\n        }\n    }\n\n    public move(delta: number): void {\n        throw new Error(\"Not implemented\");\n    }\n\n    public moveTo(delta: number): void {\n        throw new Error(\"Not implemented\");\n    }\n\n    public rotate(rotationDelta: IRotation): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedBasicRotation = null;\n\n        if (this._requestedRotationDelta != null) {\n            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;\n            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;\n        } else {\n            this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta);\n        }\n    }\n\n    public rotateBasic(basicRotation: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n\n        if (this._requestedBasicRotation != null) {\n            this._requestedBasicRotation[0] += basicRotation[0];\n            this._requestedBasicRotation[1] += basicRotation[1];\n\n            let threshold: number = 0.05 / Math.pow(2, this._zoom);\n\n            this._requestedBasicRotation[0] =\n                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);\n\n            this._requestedBasicRotation[1] =\n                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);\n        } else {\n            this._requestedBasicRotation = basicRotation.slice();\n        }\n    }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        if (this._requestedBasicRotationUnbounded != null) {\n            this._requestedBasicRotationUnbounded[0] += basicRotation[0];\n            this._requestedBasicRotationUnbounded[1] += basicRotation[1];\n        } else {\n            this._requestedBasicRotationUnbounded = basicRotation.slice();\n        }\n    }\n\n    public rotateBasicWithoutInertia(basic: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n\n        const threshold: number = 0.05 / Math.pow(2, this._zoom);\n\n        const basicRotation: number[] = basic.slice();\n        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);\n        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);\n\n        this._applyRotationBasic(basicRotation);\n    }\n\n    public rotateToBasic(basic: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = this._zoom;\n        this._desiredLookat = null;\n\n        basic[0] = this._spatial.clamp(basic[0], 0, 1);\n        basic[1] = this._spatial.clamp(basic[1], 0, 1);\n\n        let lookat: number[] = this.currentTransform.unprojectBasic(basic, this._lookatDepth);\n        this._currentCamera.lookat.fromArray(lookat);\n    }\n\n    public setSpeed(speed: number): void {\n        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);\n    }\n\n    public zoomIn(delta: number, reference: number[]): void {\n        if (this._currentNode == null) {\n            return;\n        }\n\n        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));\n\n        let currentCenter: number[] = this.currentTransform.projectBasic(\n            this._currentCamera.lookat.toArray());\n\n        let currentCenterX: number = currentCenter[0];\n        let currentCenterY: number = currentCenter[1];\n\n        let zoom0: number = Math.pow(2, this._zoom);\n        let zoom1: number = Math.pow(2, this._desiredZoom);\n\n        let refX: number = reference[0];\n        let refY: number = reference[1];\n\n        if (this.currentTransform.gpano != null &&\n            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {\n            if (refX - currentCenterX > 0.5) {\n                refX = refX - 1;\n            } else if (currentCenterX - refX > 0.5) {\n                refX = 1 + refX;\n            }\n        }\n\n        let newCenterX: number = refX - zoom0 / zoom1 * (refX - currentCenterX);\n        let newCenterY: number = refY - zoom0 / zoom1 * (refY - currentCenterY);\n\n        let gpano: IGPano = this.currentTransform.gpano;\n\n        if (this._currentNode.fullPano) {\n            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);\n        } else if (gpano != null &&\n            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {\n            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);\n        } else {\n            newCenterX = this._spatial.clamp(newCenterX, 0, 1);\n            newCenterY = this._spatial.clamp(newCenterY, 0, 1);\n        }\n\n        this._desiredLookat = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));\n    }\n\n    public setCenter(center: number[]): void {\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n        this._desiredZoom = this._zoom;\n\n        let clamped: number[] = [\n            this._spatial.clamp(center[0], 0, 1),\n            this._spatial.clamp(center[1], 0, 1),\n        ];\n\n        if (this._currentNode == null) {\n            this._desiredCenter = clamped;\n            return;\n        }\n\n        this._desiredCenter = null;\n\n        let currentLookat: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));\n\n        let previousTransform: Transform = this.previousTransform != null ?\n            this.previousTransform :\n            this.currentTransform;\n        let previousLookat: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));\n\n        this._currentCamera.lookat.copy(currentLookat);\n        this._previousCamera.lookat.copy(previousLookat);\n    }\n\n    public setZoom(zoom: number): void {\n        this._desiredLookat = null;\n        this._requestedRotationDelta = null;\n        this._requestedBasicRotation = null;\n\n        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);\n        this._desiredZoom = this._zoom;\n    }\n\n    public update(fps: number): void {\n        if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {\n            this._currentIndex += 1;\n\n            this._useBezier = this._trajectory.length < 3 &&\n                this._currentIndex + 1 === this._trajectory.length;\n\n            this._setCurrent();\n            this._resetTransition();\n            this._clearRotation();\n\n            this._desiredZoom = this._currentNode.fullPano ? this._zoom : 0;\n\n            this._desiredLookat = null;\n        }\n\n        let animationSpeed: number = this._animationSpeed * (60 / fps);\n        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);\n        if (this._useBezier) {\n            this._alpha = this._unitBezier.solve(this._baseAlpha);\n        } else {\n            this._alpha = this._baseAlpha;\n        }\n\n        this._updateRotation();\n        if (!this._rotationDelta.isZero) {\n            this._applyRotation(this._previousCamera);\n            this._applyRotation(this._currentCamera);\n        }\n\n        this._updateRotationBasic();\n        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {\n            this._applyRotationBasic(this._basicRotation);\n        }\n\n        this._updateZoom(animationSpeed);\n        this._updateLookat(animationSpeed);\n\n        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);\n    }\n\n    protected _getAlpha(): number {\n        return this._motionless ? Math.ceil(this._alpha) : this._alpha;\n    }\n\n    protected _setCurrentCamera(): void {\n        super._setCurrentCamera();\n\n        this._adjustCameras();\n    }\n\n    private _adjustCameras(): void {\n        if (this._previousNode == null) {\n            return;\n        }\n\n        let lookat: THREE.Vector3 = this._camera.lookat.clone().sub(this._camera.position);\n        this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));\n\n        if (this._currentNode.fullPano) {\n            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));\n        }\n    }\n\n    private _resetTransition(): void {\n        this._alpha = 0;\n        this._baseAlpha = 0;\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    private _applyRotation(camera: Camera): void {\n        if (camera == null) {\n            return;\n        }\n\n        let q: THREE.Quaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));\n        let qInverse: THREE.Quaternion = q.clone().inverse();\n\n        let offset: THREE.Vector3 = new THREE.Vector3();\n        offset.copy(camera.lookat).sub(camera.position);\n        offset.applyQuaternion(q);\n        let length: number = offset.length();\n\n        let phi: number = Math.atan2(offset.y, offset.x);\n        phi += this._rotationDelta.phi;\n\n        let theta: number = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);\n        theta += this._rotationDelta.theta;\n        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));\n\n        offset.x = Math.sin(theta) * Math.cos(phi);\n        offset.y = Math.sin(theta) * Math.sin(phi);\n        offset.z = Math.cos(theta);\n        offset.applyQuaternion(qInverse);\n\n        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));\n    }\n\n    private _applyRotationBasic(basicRotation: number[]): void {\n        let currentNode: Node = this._currentNode;\n        let previousNode: Node = this._previousNode != null ?\n            this.previousNode :\n            this.currentNode;\n\n        let currentCamera: Camera = this._currentCamera;\n        let previousCamera: Camera = this._previousCamera;\n\n        let currentTransform: Transform = this.currentTransform;\n        let previousTransform: Transform = this.previousTransform != null ?\n            this.previousTransform :\n            this.currentTransform;\n\n        let currentBasic: number[] = currentTransform.projectBasic(currentCamera.lookat.toArray());\n        let previousBasic: number[] = previousTransform.projectBasic(previousCamera.lookat.toArray());\n\n        let currentGPano: IGPano = currentTransform.gpano;\n        let previousGPano: IGPano = previousTransform.gpano;\n\n        if (currentNode.fullPano) {\n            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);\n        } else if (currentGPano != null &&\n            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {\n            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        } else {\n            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);\n            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        }\n\n        if (previousNode.fullPano) {\n            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);\n        } else if (previousGPano != null &&\n            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {\n            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);\n        } else {\n            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);\n            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);\n        }\n\n        let currentLookat: number[] = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);\n        currentCamera.lookat.fromArray(currentLookat);\n\n        let previousLookat: number[] = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);\n        previousCamera.lookat.fromArray(previousLookat);\n    }\n\n    private _updateZoom(animationSpeed: number): void {\n        let diff: number = this._desiredZoom - this._zoom;\n        let sign: number = diff > 0 ? 1 : diff < 0 ? -1 : 0;\n\n        if (diff === 0) {\n            return;\n        } else if (Math.abs(diff) < 2e-3) {\n            this._zoom = this._desiredZoom;\n            if (this._desiredLookat != null) {\n                this._desiredLookat = null;\n            }\n        } else {\n            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);\n        }\n    }\n\n    private _updateLookat(animationSpeed: number): void {\n        if (this._desiredLookat === null) {\n            return;\n        }\n\n        let diff: number = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);\n\n        if (Math.abs(diff) < 1e-6) {\n            this._currentCamera.lookat.copy(this._desiredLookat);\n            this._desiredLookat = null;\n        } else {\n            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);\n        }\n    }\n\n    private _updateRotation(): void {\n        if (this._requestedRotationDelta != null) {\n            let length: number = this._rotationDelta.lengthSquared();\n            let requestedLength: number = this._requestedRotationDelta.lengthSquared();\n\n            if (requestedLength > length) {\n                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);\n            } else {\n                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);\n            }\n\n            this._requestedRotationDelta = null;\n\n            return;\n        }\n\n        if (this._rotationDelta.isZero) {\n            return;\n        }\n\n        this._rotationDelta.multiply(this._rotationAcceleration);\n        this._rotationDelta.threshold(this._rotationThreshold);\n    }\n\n    private _updateRotationBasic(): void {\n        if (this._requestedBasicRotation != null) {\n            let x: number = this._basicRotation[0];\n            let y: number = this._basicRotation[1];\n\n            let reqX: number = this._requestedBasicRotation[0];\n            let reqY: number = this._requestedBasicRotation[1];\n\n            if (Math.abs(reqX) > Math.abs(x)) {\n                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;\n            } else {\n                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;\n            }\n\n            if (Math.abs(reqY) > Math.abs(y)) {\n                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;\n            } else {\n                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;\n            }\n\n            this._requestedBasicRotation = null;\n\n            return;\n        }\n\n        if (this._requestedBasicRotationUnbounded != null) {\n            let reqX: number = this._requestedBasicRotationUnbounded[0];\n            let reqY: number = this._requestedBasicRotationUnbounded[1];\n\n            if (Math.abs(reqX) > 0) {\n                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;\n            }\n\n            if (Math.abs(reqY) > 0) {\n                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;\n            }\n\n            if (this._desiredLookat != null) {\n                let desiredBasicLookat: number[] = this.currentTransform.projectBasic(this._desiredLookat.toArray());\n\n                desiredBasicLookat[0] += reqX;\n                desiredBasicLookat[1] += reqY;\n\n                this._desiredLookat = new THREE.Vector3()\n                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));\n            }\n\n            this._requestedBasicRotationUnbounded = null;\n        }\n\n        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {\n            return;\n        }\n\n        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];\n        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];\n\n        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&\n            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {\n            this._basicRotation = [0, 0];\n        }\n    }\n\n    private _clearRotation(): void {\n        if (this._currentNode.fullPano) {\n            return;\n        }\n\n        if (this._requestedRotationDelta != null) {\n            this._requestedRotationDelta = null;\n        }\n\n        if (!this._rotationDelta.isZero) {\n            this._rotationDelta.reset();\n        }\n\n        if (this._requestedBasicRotation != null) {\n            this._requestedBasicRotation = null;\n        }\n\n        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {\n            this._basicRotation = [0, 0];\n        }\n    }\n\n    private _setDesiredCenter(): void {\n        if (this._desiredCenter == null) {\n            return;\n        }\n\n        let lookatDirection: THREE.Vector3 = new THREE.Vector3()\n            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))\n            .sub(this._currentCamera.position);\n\n        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));\n        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));\n\n        this._desiredCenter = null;\n    }\n\n    private _setDesiredZoom(): void {\n        this._desiredZoom =\n            this._currentNode.fullPano || this._previousNode == null ?\n            this._zoom : 0;\n    }\n}\n",
+    "import {Node} from \"../../Graph\";\nimport {IState, StateBase, IRotation, TraversingState} from \"../../State\";\n\nexport class WaitingState extends StateBase {\n    constructor(state: IState) {\n        super(state);\n\n        this._zoom = 0;\n\n        this._adjustCameras();\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public traverse(): StateBase {\n        return new TraversingState(this);\n    }\n\n    public wait(): StateBase {\n        throw new Error(\"Not implemented\");\n    }\n\n    public prepend(nodes: Node[]): void {\n        super.prepend(nodes);\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public set(nodes: Node[]): void {\n        super.set(nodes);\n\n        this._motionless = this._motionlessTransition();\n    }\n\n    public rotate(delta: IRotation): void { return; }\n\n    public rotateBasic(basicRotation: number[]): void { return; }\n\n    public rotateBasicUnbounded(basicRotation: number[]): void { return; }\n\n    public rotateBasicWithoutInertia(basicRotation: number[]): void { return; }\n\n    public rotateToBasic(basic: number[]): void { return; }\n\n    public setSpeed(speed: number): void { return; }\n\n    public zoomIn(delta: number, reference: number[]): void { return; }\n\n    public move(delta: number): void {\n        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));\n    }\n\n    public moveTo(position: number): void {\n        this._alpha = Math.max(0, Math.min(1, position));\n    }\n\n    public update(fps: number): void {\n        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);\n    }\n\n    public setCenter(center: number[]): void { return; }\n\n    public setZoom(zoom: number): void { return; }\n\n    protected _getAlpha(): number {\n        return this._motionless ? Math.round(this._alpha) : this._alpha;\n    }\n\n    protected _setCurrentCamera(): void {\n        super._setCurrentCamera();\n\n        this._adjustCameras();\n    }\n\n    private _adjustCameras(): void {\n        if (this._previousNode == null) {\n            return;\n        }\n\n        if (this._currentNode.fullPano) {\n            let lookat: THREE.Vector3 = this._camera.lookat.clone().sub(this._camera.position);\n            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));\n        }\n\n        if (this._previousNode.fullPano) {\n            let lookat: THREE.Vector3 = this._currentCamera.lookat.clone().sub(this._currentCamera.position);\n            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));\n        }\n    }\n}\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subscriber} from \"rxjs/Subscriber\";\n\n/**\n * @class ImageTileLoader\n *\n * @classdesc Represents a loader of image tiles.\n */\nexport class ImageTileLoader {\n    private _origin: string;\n    private _scheme: string;\n    private _host: string;\n\n    /**\n     * Create a new node image tile loader instance.\n     *\n     * @param {string} scheme - The URI scheme.\n     * @param {string} host - The URI host.\n     * @param {string} [origin] - The origin query param.\n     */\n    constructor(scheme: string, host: string, origin?: string) {\n        this._scheme = scheme;\n        this._host = host;\n        this._origin = origin != null ? `?origin=${origin}` : \"\";\n    }\n\n    /**\n     * Retrieve an image tile.\n     *\n     * @description Retrieve an image tile by specifying the area\n     * as well as the scaled size.\n     *\n     * @param {string} identifier - The identifier of the image.\n     * @param {number} x - The top left x pixel coordinate for the tile\n     * in the original image.\n     * @param {number} y - The top left y pixel coordinate for the tile\n     * in the original image.\n     * @param {number} w - The pixel width of the tile in the original image.\n     * @param {number} h - The pixel height of the tile in the original image.\n     * @param {number} scaledW - The scaled width of the returned tile.\n     * @param {number} scaledH - The scaled height of the returned tile.\n     */\n    public getTile(\n        identifier: string,\n        x: number,\n        y: number,\n        w: number,\n        h: number,\n        scaledW: number,\n        scaledH: number): [Observable<HTMLImageElement>, Function] {\n\n        let characteristics: string = `/${identifier}/${x},${y},${w},${h}/${scaledW},${scaledH}/0/default.jpg`;\n        let url: string =\n            this._scheme +\n            \"://\" +\n            this._host +\n            characteristics +\n            this._origin;\n\n        let xmlHTTP: XMLHttpRequest = null;\n\n        return [Observable.create(\n            (subscriber: Subscriber<HTMLImageElement>): void => {\n                xmlHTTP = new XMLHttpRequest();\n                xmlHTTP.open(\"GET\", url, true);\n                xmlHTTP.responseType = \"arraybuffer\";\n                xmlHTTP.timeout = 15000;\n\n                xmlHTTP.onload = (event: Event) => {\n                    if (xmlHTTP.status !== 200) {\n                        subscriber.error(\n                            new Error(\n                                `Failed to fetch tile (${identifier}: ${x},${y},${w},${h}). ` +\n                                `Status: ${xmlHTTP.status}, ${xmlHTTP.statusText}`));\n\n                        return;\n                    }\n\n                    let image: HTMLImageElement = new Image();\n                    image.crossOrigin = \"Anonymous\";\n\n                    image.onload = (e: Event) => {\n                        subscriber.next(image);\n                        subscriber.complete();\n                    };\n\n                    image.onerror = (error: ErrorEvent) => {\n                        subscriber.error(new Error(`Failed to load tile image (${identifier}: ${x},${y},${w},${h})`));\n                    };\n\n                    let blob: Blob = new Blob([xmlHTTP.response]);\n                    image.src = window.URL.createObjectURL(blob);\n                };\n\n                xmlHTTP.onerror = (error: Event) => {\n                    subscriber.error(new Error(`Failed to fetch tile (${identifier}: ${x},${y},${w},${h})`));\n                };\n\n                xmlHTTP.ontimeout = (error: Event) => {\n                    subscriber.error(new Error(`Tile request timed out (${identifier}: ${x},${y},${w},${h})`));\n                };\n\n                xmlHTTP.onabort = (event: Event) => {\n                    subscriber.error(new Error(`Tile request was aborted (${identifier}: ${x},${y},${w},${h})`));\n                };\n\n                xmlHTTP.send(null);\n            }),\n            (): void => {\n                if (xmlHTTP != null) {\n                    xmlHTTP.abort();\n                }\n            },\n        ];\n    }\n}\n\nexport default ImageTileLoader;\n",
     "/**\n * @class ImageTileStore\n *\n * @classdesc Represents a store for image tiles.\n */\nexport class ImageTileStore {\n    private _images: { [level: string]: { [key: string]: HTMLImageElement } };\n\n    /**\n     * Create a new node image tile store instance.\n     */\n    constructor() {\n        this._images = {};\n    }\n\n    /**\n     * Add an image tile to the store.\n     *\n     * @param {HTMLImageElement} image - The image tile.\n     * @param {string} key - The identifier for the tile.\n     * @param {number} level - The level of the tile.\n     */\n    public addImage(image: HTMLImageElement, key: string, level: number): void {\n        if (!(level in this._images)) {\n            this._images[level] = {};\n        }\n\n        this._images[level][key] = image;\n    }\n\n    /**\n     * Dispose the store.\n     *\n     * @description Disposes all cached assets.\n     */\n    public dispose(): void {\n        for (let level of Object.keys(this._images)) {\n            let levelImages: { [key: string]: HTMLImageElement } = this._images[level];\n\n            for (let key of Object.keys(levelImages)) {\n                window.URL.revokeObjectURL(levelImages[key].src);\n                delete levelImages[key];\n            }\n\n            delete this._images[level];\n        }\n    }\n\n    /**\n     * Get an image tile from the store.\n     *\n     * @param {string} key - The identifier for the tile.\n     * @param {number} level - The level of the tile.\n     */\n    public getImage(key: string, level: number): HTMLImageElement {\n        return this._images[level][key];\n    }\n\n    /**\n     * Check if an image tile exist in the store.\n     *\n     * @param {string} key - The identifier for the tile.\n     * @param {number} level - The level of the tile.\n     */\n    public hasImage(key: string, level: number): boolean {\n        return level in this._images && key in this._images[level];\n    }\n}\n\nexport default ImageTileStore;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {\n    RenderCamera,\n    ISize,\n} from \"../Render\";\nimport {\n    Transform,\n    ViewportCoords,\n} from \"../Geo\";\nimport {\n    IBoundingBox,\n    IRegionOfInterest,\n} from \"../Tiles\";\n\n/**\n * @class RegionOfInterestCalculator\n *\n * @classdesc Represents a calculator for regions of interest.\n */\nexport class RegionOfInterestCalculator {\n    private _viewportCoords: ViewportCoords = new ViewportCoords();\n\n    /**\n     * Compute a region of interest based on the current render camera\n     * and the viewport size.\n     *\n     * @param {RenderCamera} renderCamera - Render camera used for unprojections.\n     * @param {ISize} size - Viewport size in pixels.\n     * @param {Transform} transform - Transform used for projections.\n     *\n     * @returns {IRegionOfInterest} A region of interest.\n     */\n    public computeRegionOfInterest(renderCamera: RenderCamera, size: ISize, transform: Transform): IRegionOfInterest {\n        let viewportBoundaryPoints: number[][] = this._viewportBoundaryPoints(4);\n        let bbox: IBoundingBox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform);\n        this._clipBoundingBox(bbox);\n\n        const viewportPixelWidth: number = 2 / size.width;\n        const viewportPixelHeight: number = 2 / size.height;\n        let centralViewportPixel: number[][] = [\n            [-0.5 * viewportPixelWidth,  0.5 * viewportPixelHeight],\n            [ 0.5 * viewportPixelWidth,  0.5 * viewportPixelHeight],\n            [ 0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],\n            [-0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],\n        ];\n\n        let cpbox: IBoundingBox = this._viewportPointsBoundingBox(centralViewportPixel, renderCamera, transform);\n\n        return {\n            bbox: bbox,\n            pixelHeight: cpbox.maxY - cpbox.minY,\n            pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1),\n        };\n    }\n\n    private _viewportBoundaryPoints(pointsPerSide: number): number[][] {\n        let points: number[][] = [];\n        let os: number[][] = [[-1, 1], [1, 1], [1, -1], [-1, -1]];\n        let ds: number[][] = [[2, 0], [0, -2], [-2, 0], [0, 2]];\n        for (let side: number = 0; side < 4; ++side) {\n            let o: number[] = os[side];\n            let d: number[] = ds[side];\n            for (let i: number = 0; i < pointsPerSide; ++i) {\n                points.push([o[0] + d[0] * i / pointsPerSide,\n                             o[1] + d[1] * i / pointsPerSide]);\n            }\n        }\n        return points;\n    }\n\n    private _viewportPointsBoundingBox(viewportPoints: number[][], renderCamera: RenderCamera, transform: Transform): IBoundingBox {\n        let basicPoints: number[][] = viewportPoints\n            .map(\n                (point: number []): number[] => {\n                    return this._viewportCoords\n                        .viewportToBasic(point[0], point[1], transform, renderCamera.perspective);\n                });\n\n        if (transform.gpano != null) {\n            return this._boundingBoxPano(basicPoints);\n        } else {\n            return this._boundingBox(basicPoints);\n        }\n    }\n\n    private _boundingBox(points: number[][]): IBoundingBox {\n        let bbox: IBoundingBox = {\n            maxX: Number.NEGATIVE_INFINITY,\n            maxY: Number.NEGATIVE_INFINITY,\n            minX: Number.POSITIVE_INFINITY,\n            minY: Number.POSITIVE_INFINITY,\n        };\n\n        for (let i: number = 0; i < points.length; ++i) {\n            bbox.minX = Math.min(bbox.minX, points[i][0]);\n            bbox.maxX = Math.max(bbox.maxX, points[i][0]);\n            bbox.minY = Math.min(bbox.minY, points[i][1]);\n            bbox.maxY = Math.max(bbox.maxY, points[i][1]);\n        }\n\n        return bbox;\n    }\n\n    private _boundingBoxPano(points: number[][]): IBoundingBox {\n        let xs: number[] = [];\n        let ys: number[] = [];\n        for (let i: number = 0; i < points.length; ++i) {\n            xs.push(points[i][0]);\n            ys.push(points[i][1]);\n        }\n        xs.sort((a, b) => { return this._sign(a - b); });\n        ys.sort((a, b) => { return this._sign(a - b); });\n\n        let intervalX: number[] = this._intervalPano(xs);\n\n        return {\n            maxX: intervalX[1],\n            maxY: ys[ys.length - 1],\n            minX: intervalX[0],\n            minY: ys[0],\n        };\n    }\n\n    /**\n     * Find the max interval between consecutive numbers.\n     * Assumes numbers are between 0 and 1, sorted and that\n     * x is equivalent to x + 1.\n     */\n    private _intervalPano(xs: number[]): number[] {\n        let maxdx: number = 0;\n        let maxi: number = -1;\n        for (let i: number = 0; i < xs.length - 1; ++i) {\n            let dx: number = xs[i + 1] - xs[i];\n            if (dx > maxdx) {\n                maxdx = dx;\n                maxi = i;\n            }\n        }\n        let loopdx: number = xs[0] + 1 - xs[xs.length - 1];\n        if (loopdx > maxdx) {\n            return [xs[0], xs[xs.length - 1]];\n        } else {\n            return [xs[maxi + 1], xs[maxi]];\n        }\n    }\n\n    private _clipBoundingBox(bbox: IBoundingBox): void {\n        bbox.minX = Math.max(0, Math.min(1, bbox.minX));\n        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));\n        bbox.minY = Math.max(0, Math.min(1, bbox.minY));\n        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));\n    }\n\n    private _sign(n: number): number {\n        return n > 0 ? 1 : n < 0 ? -1 : 0;\n    }\n}\n\nexport default RegionOfInterestCalculator;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport {\n    ImageTileLoader,\n    ImageTileStore,\n    IRegionOfInterest,\n} from \"../Tiles\";\n\n/**\n * @class TextureProvider\n *\n * @classdesc Represents a provider of textures.\n */\nexport class TextureProvider {\n    private _background: HTMLImageElement;\n    private _camera: THREE.OrthographicCamera;\n    private _imageTileLoader: ImageTileLoader;\n    private _imageTileStore: ImageTileStore;\n    private _renderer: THREE.WebGLRenderer;\n    private _renderTarget: THREE.WebGLRenderTarget;\n    private _roi: IRegionOfInterest;\n\n    private _abortFunctions: Function[];\n    private _tileSubscriptions: { [key: string]: Subscription };\n\n    private _created$: Observable<THREE.Texture>;\n    private _createdSubject$: Subject<THREE.Texture>;\n    private _createdSubscription: Subscription;\n    private _hasSubject$: Subject<boolean>;\n    private _has$: Observable<boolean>;\n    private _hasSubscription: Subscription;\n    private _updated$: Subject<boolean>;\n\n    private _disposed: boolean;\n    private _height: number;\n    private _key: string;\n    private _tileSize: number;\n    private _maxLevel: number;\n    private _currentLevel: number;\n    private _renderedCurrentLevelTiles: { [key: string]: boolean };\n    private _renderedTiles: { [level: string]: number[][] };\n    private _width: number;\n\n    /**\n     * Create a new node texture provider instance.\n     *\n     * @param {string} key - The identifier of the image for which to request tiles.\n     * @param {number} width - The full width of the original image.\n     * @param {number} height - The full height of the original image.\n     * @param {number} tileSize - The size used when requesting tiles.\n     * @param {HTMLImageElement} background - Image to use as background.\n     * @param {ImageTileLoader} imageTileLoader - Loader for retrieving tiles.\n     * @param {ImageTileStore} imageTileStore - Store for saving tiles.\n     * @param {THREE.WebGLRenderer} renderer - Renderer used for rendering tiles to texture.\n     */\n    constructor (\n        key: string,\n        width: number,\n        height: number,\n        tileSize: number,\n        background: HTMLImageElement,\n        imageTileLoader: ImageTileLoader,\n        imageTileStore: ImageTileStore,\n        renderer: THREE.WebGLRenderer) {\n\n        this._disposed = false;\n\n        this._key = key;\n\n        if (width <= 0 || height <= 0) {\n            console.warn(`Original image size (${width}, ${height}) is invalid (${key}). Tiles will not be loaded.`);\n        }\n\n        this._width = width;\n        this._height = height;\n        this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2));\n        this._currentLevel = -1;\n        this._tileSize = tileSize;\n\n        this._updated$ = new Subject<boolean>();\n        this._createdSubject$ = new Subject<THREE.Texture>();\n        this._created$ = this._createdSubject$\n            .publishReplay(1)\n            .refCount();\n\n        this._createdSubscription = this._created$.subscribe(() => { /*noop*/ });\n\n        this._hasSubject$ = new Subject<boolean>();\n        this._has$ = this._hasSubject$\n            .startWith(false)\n            .publishReplay(1)\n            .refCount();\n\n        this._hasSubscription = this._has$.subscribe(() => { /*noop*/ });\n\n        this._abortFunctions = [];\n        this._tileSubscriptions = {};\n        this._renderedCurrentLevelTiles = {};\n        this._renderedTiles = {};\n\n        this._background = background;\n        this._camera = null;\n        this._imageTileLoader = imageTileLoader;\n        this._imageTileStore = imageTileStore;\n        this._renderer = renderer;\n        this._renderTarget = null;\n        this._roi = null;\n    }\n\n    /**\n     * Get disposed.\n     *\n     * @returns {boolean} Value indicating whether provider has\n     * been disposed.\n     */\n    public get disposed(): boolean {\n        return this._disposed;\n    }\n\n    /**\n     * Get hasTexture$.\n     *\n     * @returns {Observable<boolean>} Observable emitting\n     * values indicating when the existance of a texture\n     * changes.\n     */\n    public get hasTexture$(): Observable<boolean> {\n        return this._has$;\n    }\n\n    /**\n     * Get key.\n     *\n     * @returns {boolean} The identifier of the image for\n     * which to render textures.\n     */\n    public get key(): string {\n        return this._key;\n    }\n\n    /**\n     * Get textureUpdated$.\n     *\n     * @returns {Observable<boolean>} Observable emitting\n     * values when an existing texture has been updated.\n     */\n    public get textureUpdated$(): Observable<boolean> {\n        return this._updated$;\n    }\n\n    /**\n     * Get textureCreated$.\n     *\n     * @returns {Observable<boolean>} Observable emitting\n     * values when a new texture has been created.\n     */\n    public get textureCreated$(): Observable<THREE.Texture> {\n        return this._created$;\n    }\n\n    /**\n     * Abort all outstanding image tile requests.\n     */\n    public abort(): void {\n        for (let key in this._tileSubscriptions) {\n            if (!this._tileSubscriptions.hasOwnProperty(key)) {\n                continue;\n            }\n\n            this._tileSubscriptions[key].unsubscribe();\n        }\n\n        this._tileSubscriptions = {};\n\n        for (let abort of this._abortFunctions) {\n            abort();\n        }\n\n        this._abortFunctions = [];\n    }\n\n    /**\n     * Dispose the provider.\n     *\n     * @description Disposes all cached assets and\n     * aborts all outstanding image tile requests.\n     */\n    public dispose(): void {\n        if (this._disposed) {\n            console.warn(`Texture already disposed (${this._key})`);\n            return;\n        }\n\n        this.abort();\n\n        if (this._renderTarget != null) {\n            this._renderTarget.dispose();\n            this._renderTarget = null;\n        }\n\n        this._imageTileStore.dispose();\n        this._imageTileStore = null;\n\n        this._background = null;\n        this._camera = null;\n        this._imageTileLoader = null;\n        this._renderer = null;\n        this._roi = null;\n\n        this._createdSubscription.unsubscribe();\n        this._hasSubscription.unsubscribe();\n\n        this._disposed = true;\n    }\n\n    /**\n     * Set the region of interest.\n     *\n     * @description When the region of interest is set the\n     * the tile level is determined and tiles for the region\n     * are fetched from the store or the loader and renderedLevel\n     * to the texture.\n     *\n     * @param {IRegionOfInterest} roi - Spatial edges to cache.\n     */\n    public setRegionOfInterest(roi: IRegionOfInterest): void {\n        if (this._width <= 0 || this._height <= 0) {\n            return;\n        }\n\n        this._roi = roi;\n\n        let width: number = 1 / this._roi.pixelWidth;\n        let height: number = 1 / this._roi.pixelHeight;\n        let size: number = Math.max(height, width);\n\n        let currentLevel: number = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2))));\n        if (currentLevel !== this._currentLevel) {\n            this.abort();\n\n            this._currentLevel = currentLevel;\n            if (!(this._currentLevel in this._renderedTiles)) {\n                this._renderedTiles[this._currentLevel] = [];\n            }\n\n            this._renderedCurrentLevelTiles = {};\n            for (let tile of this._renderedTiles[this._currentLevel]) {\n                this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;\n            }\n        }\n\n        let topLeft: number[] = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]);\n        let bottomRight: number[] = this._getTileCoords([this._roi.bbox.maxX, this._roi.bbox.maxY]);\n\n        let tiles: number[][] = this._getTiles(topLeft, bottomRight);\n\n        if (this._camera == null) {\n            this._camera = new THREE.OrthographicCamera(\n                -this._width / 2,\n                this._width / 2,\n                this._height / 2,\n                -this._height / 2,\n                -1,\n                1);\n\n            this._camera.position.z = 1;\n\n            let gl: WebGLRenderingContext = this._renderer.getContext();\n            let maxTextureSize: number = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n            let backgroundSize: number = Math.max(this._width, this._height);\n            let scale: number = maxTextureSize > backgroundSize ? 1 : maxTextureSize / backgroundSize;\n\n            let targetWidth: number = Math.floor(scale * this._width);\n            let targetHeight: number = Math.floor(scale * this._height);\n\n            this._renderTarget = new THREE.WebGLRenderTarget(\n                targetWidth,\n                targetHeight,\n                {\n                    depthBuffer: false,\n                    format: THREE.RGBFormat,\n                    magFilter: THREE.LinearFilter,\n                    minFilter: THREE.LinearFilter,\n                    stencilBuffer: false,\n                });\n\n            this._renderToTarget(0, 0, this._width, this._height, this._background);\n\n            this._createdSubject$.next((<any>this._renderTarget).texture);\n            this._hasSubject$.next(true);\n        }\n\n        this._fetchTiles(tiles);\n    }\n\n    public setTileSize(tileSize: number): void {\n        this._tileSize = tileSize;\n    }\n\n    /**\n     * Update the image used as background for the texture.\n     *\n     * @param {HTMLImageElement} background - The background image.\n     */\n    public updateBackground(background: HTMLImageElement): void {\n        this._background = background;\n    }\n\n    /**\n     * Retrieve an image tile.\n     *\n     * @description Retrieve an image tile and render it to the\n     * texture. Add the tile to the store and emit to the updated\n     * observable.\n     *\n     * @param {Array<number>} tile - The tile coordinates.\n     * @param {number} level - The tile level.\n     * @param {number} x - The top left x pixel coordinate of the tile.\n     * @param {number} y - The top left y pixel coordinate of the tile.\n     * @param {number} w - The pixel width of the tile.\n     * @param {number} h - The pixel height of the tile.\n     * @param {number} scaledW - The scaled width of the returned tile.\n     * @param {number} scaledH - The scaled height of the returned tile.\n     */\n    private _fetchTile(\n        tile: number[],\n        level: number,\n        x: number,\n        y: number,\n        w: number,\n        h: number,\n        scaledX: number,\n        scaledY: number): void {\n\n        let getTile: [Observable<HTMLImageElement>, Function] =\n            this._imageTileLoader.getTile(this._key, x, y, w, h, scaledX, scaledY);\n\n        let tile$: Observable<HTMLImageElement> = getTile[0];\n        let abort: Function = getTile[1];\n\n        this._abortFunctions.push(abort);\n\n        let tileKey: string = this._tileKey(this._tileSize, tile);\n\n        let subscription: Subscription = tile$\n            .subscribe(\n                (image: HTMLImageElement): void => {\n                    this._renderToTarget(x, y, w, h, image);\n\n                    this._removeFromDictionary(tileKey, this._tileSubscriptions);\n                    this._removeFromArray(abort, this._abortFunctions);\n\n                    this._setTileRendered(tile, this._currentLevel);\n\n                    this._imageTileStore.addImage(image, tileKey, level);\n\n                    this._updated$.next(true);\n                },\n                (error: Error): void => {\n                    this._removeFromDictionary(tileKey, this._tileSubscriptions);\n                    this._removeFromArray(abort, this._abortFunctions);\n\n                    console.error(error);\n                });\n\n        if (!subscription.closed) {\n            this._tileSubscriptions[tileKey] = subscription;\n        }\n    }\n\n    /**\n     * Retrieve image tiles.\n     *\n     * @description Retrieve a image tiles and render them to the\n     * texture. Retrieve from store if it exists, otherwise Retrieve\n     * from loader.\n     *\n     * @param {Array<Array<number>>} tiles - Array of tile coordinates to\n     * retrieve.\n     */\n    private _fetchTiles(tiles: number[][]): void {\n        let tileSize: number = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);\n\n        for (let tile of tiles) {\n            let tileKey: string = this._tileKey(this._tileSize, tile);\n            if (tileKey in this._renderedCurrentLevelTiles ||\n                tileKey in this._tileSubscriptions) {\n                continue;\n            }\n\n            let tileX: number = tileSize * tile[0];\n            let tileY: number = tileSize * tile[1];\n            let tileWidth: number = tileX + tileSize > this._width ? this._width - tileX : tileSize;\n            let tileHeight: number = tileY + tileSize > this._height ? this._height - tileY : tileSize;\n\n            if (this._imageTileStore.hasImage(tileKey, this._currentLevel)) {\n                this._renderToTarget(tileX, tileY, tileWidth, tileHeight, this._imageTileStore.getImage(tileKey, this._currentLevel));\n                this._setTileRendered(tile, this._currentLevel);\n\n                this._updated$.next(true);\n                continue;\n            }\n\n            let scaledX: number = Math.floor(tileWidth / tileSize * this._tileSize);\n            let scaledY: number = Math.floor(tileHeight / tileSize * this._tileSize);\n\n            this._fetchTile(tile, this._currentLevel, tileX, tileY, tileWidth, tileHeight, scaledX, scaledY);\n        }\n    }\n\n    /**\n     * Get tile coordinates for a point using the current level.\n     *\n     * @param {Array<number>} point - Point in basic coordinates.\n     *\n     * @returns {Array<number>} x and y tile coodinates.\n     */\n    private _getTileCoords(point: number[]): number[] {\n        let tileSize: number = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);\n\n        let maxX: number = Math.ceil(this._width / tileSize) - 1;\n        let maxY: number = Math.ceil(this._height / tileSize) - 1;\n\n        return [\n            Math.min(Math.floor(this._width * point[0] / tileSize), maxX),\n            Math.min(Math.floor(this._height * point[1] / tileSize), maxY),\n        ];\n    }\n\n    /**\n     * Get tile coordinates for all tiles contained in a bounding\n     * box.\n     *\n     * @param {Array<number>} topLeft - Top left tile coordinate of bounding box.\n     * @param {Array<number>} bottomRight - Bottom right tile coordinate of bounding box.\n     *\n     * @returns {Array<Array<number>>} Array of x, y tile coodinates.\n     */\n    private _getTiles(topLeft: number[], bottomRight: number[]): number[][] {\n        let xs: number[] = [];\n\n        if (topLeft[0] > bottomRight[0]) {\n            let tileSize: number = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);\n            let maxX: number = Math.ceil(this._width / tileSize) - 1;\n\n            for (let x: number = topLeft[0]; x <= maxX; x++) {\n                xs.push(x);\n            }\n\n            for (let x: number = 0; x <= bottomRight[0]; x++) {\n                xs.push(x);\n            }\n        } else {\n            for (let x: number = topLeft[0]; x <= bottomRight[0]; x++) {\n                xs.push(x);\n            }\n        }\n\n        let tiles: number[][] = [];\n\n        for (let x of xs) {\n            for (let y: number = topLeft[1]; y <= bottomRight[1]; y++) {\n                tiles.push([x, y]);\n            }\n        }\n\n        return tiles;\n    }\n\n    /**\n     * Remove an item from an array if it exists in array.\n     *\n     * @param {T} item - Item to remove.\n     * @param {Array<T>} array - Array from which item should be removed.\n     */\n    private _removeFromArray<T>(item: T, array: T[]): void {\n        let index: number = array.indexOf(item);\n        if (index !== -1) {\n            array.splice(index, 1);\n        }\n    }\n\n    /**\n     * Remove an item from a dictionary.\n     *\n     * @param {string} key - Key of the item to remove.\n     * @param {Object} dict - Dictionary from which item should be removed.\n     */\n    private _removeFromDictionary<T>(key: string, dict: { [key: string]: T }): void {\n        if (key in dict) {\n            delete dict[key];\n        }\n    }\n\n    /**\n     * Render an image tile to the target texture.\n     *\n     * @param {number} x - The top left x pixel coordinate of the tile.\n     * @param {number} y - The top left y pixel coordinate of the tile.\n     * @param {number} w - The pixel width of the tile.\n     * @param {number} h - The pixel height of the tile.\n     * @param {HTMLImageElement} background - The image tile to render.\n     */\n    private _renderToTarget(x: number, y: number, w: number, h: number, image: HTMLImageElement): void {\n        let texture: THREE.Texture = new THREE.Texture(image);\n        texture.minFilter = THREE.LinearFilter;\n        texture.needsUpdate = true;\n\n        let geometry: THREE.PlaneGeometry = new THREE.PlaneGeometry(w, h);\n        let material: THREE.MeshBasicMaterial = new THREE.MeshBasicMaterial({ map: texture, side: THREE.FrontSide });\n\n        let mesh: THREE.Mesh = new THREE.Mesh(geometry, material);\n        mesh.position.x = -this._width / 2 + x + w / 2;\n        mesh.position.y = this._height / 2 - y - h / 2;\n\n        let scene: THREE.Scene = new THREE.Scene();\n        scene.add(mesh);\n\n        this._renderer.render(scene, this._camera, this._renderTarget);\n        this._renderer.setRenderTarget(undefined);\n\n        scene.remove(mesh);\n\n        geometry.dispose();\n        material.dispose();\n        texture.dispose();\n    }\n\n    /**\n     * Mark a tile as rendered.\n     *\n     * @description Clears tiles marked as rendered in other\n     * levels of the tile pyramid  if they were rendered on\n     * top of or below the tile.\n     *\n     * @param {Arrary<number>} tile - The tile coordinates.\n     * @param {number} level - Tile level of the tile coordinates.\n     */\n    private _setTileRendered(tile: number[], level: number): void {\n        let otherLevels: number[] =\n            Object.keys(this._renderedTiles)\n                .map(\n                    (key: string): number => {\n                        return parseInt(key, 10);\n                    })\n                .filter(\n                    (renderedLevel: number): boolean => {\n                        return renderedLevel !== level;\n                    });\n\n        for (let otherLevel of otherLevels) {\n            let scale: number = Math.pow(2, otherLevel - level);\n\n            if (otherLevel < level) {\n                let x: number = Math.floor(scale * tile[0]);\n                let y: number = Math.floor(scale * tile[1]);\n\n                for (let otherTile of this._renderedTiles[otherLevel].slice()) {\n                    if (otherTile[0] === x && otherTile[1] === y) {\n                        let index: number = this._renderedTiles[otherLevel].indexOf(otherTile);\n                        this._renderedTiles[otherLevel].splice(index, 1);\n                    }\n                }\n            } else {\n                let startX: number = scale * tile[0];\n                let endX: number = startX + scale - 1;\n                let startY: number = scale * tile[1];\n                let endY: number = startY + scale - 1;\n\n                for (let otherTile of this._renderedTiles[otherLevel].slice()) {\n                    if (otherTile[0] >= startX && otherTile[0] <= endX &&\n                        otherTile[1] >= startY && otherTile[1] <= endY) {\n                        let index: number = this._renderedTiles[otherLevel].indexOf(otherTile);\n                        this._renderedTiles[otherLevel].splice(index, 1);\n\n                    }\n                }\n            }\n\n            if (this._renderedTiles[otherLevel].length === 0) {\n                delete this._renderedTiles[otherLevel];\n            }\n        }\n\n        this._renderedTiles[level].push(tile);\n        this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;\n    }\n\n    /**\n     * Create a tile key from a tile coordinates.\n     *\n     * @description Tile keys are used as a hash for\n     * storing the tile in a dictionary.\n     *\n     * @param {number} tileSize - The tile size.\n     * @param {Arrary<number>} tile - The tile coordinates.\n     */\n    private _tileKey(tileSize: number, tile: number[]): string {\n        return tileSize + \"-\" + tile[0] + \"-\" + tile[1];\n    }\n}\n\nexport default TextureProvider;\n",
     "export class DOM {\n    private _document: HTMLDocument;\n\n    constructor(doc?: Node) {\n        this._document = !!doc ? <HTMLDocument>doc : document;\n    }\n\n    public get document(): HTMLDocument {\n        return this._document;\n    }\n\n    public createElement<K extends keyof HTMLElementTagNameMap>(\n        tagName: K, className?: string, container?: HTMLElement): HTMLElementTagNameMap[K] {\n        const element: HTMLElement = this._document.createElement(tagName);\n\n        if (!!className) {\n            element.className = className;\n        }\n\n        if (!!container) {\n            container.appendChild(element);\n        }\n\n        return element;\n    }\n}\n\nexport default DOM;\n",
     "export class EventEmitter {\n    private _events: {[eventType: string]: any[]};\n\n    constructor () {\n        this._events = {};\n    }\n\n    /**\n     * Subscribe to an event by its name.\n     * @param {string }eventType - The name of the event to subscribe to.\n     * @param {any} fn - The handler called when the event occurs.\n     */\n    public on(eventType: string, fn: any): void {\n        this._events[eventType] = this._events[eventType] || [];\n        this._events[eventType].push(fn);\n        return;\n    }\n\n    /**\n     * Unsubscribe from an event by its name.\n     * @param {string} eventType - The name of the event to subscribe to.\n     * @param {any} fn - The handler to remove.\n     */\n    public off(eventType: string, fn: any): void {\n        if (!eventType) {\n            this._events = {};\n            return;\n        }\n\n        if (!this._listens(eventType)) {\n            let idx: number = this._events[eventType].indexOf(fn);\n            if (idx >= 0) {\n                this._events[eventType].splice(idx, 1);\n            }\n            if (this._events[eventType].length) {\n                delete this._events[eventType];\n            }\n        } else {\n            delete this._events[eventType];\n        }\n\n        return;\n    }\n\n    public fire(eventType: string, data: any): void {\n        if (!this._listens(eventType)) {\n            return;\n        }\n\n        for (let fn of this._events[eventType]) {\n            fn.call(this, data);\n        }\n        return;\n    }\n\n    private _listens(eventType: string): boolean {\n        return !!(this._events && this._events[eventType]);\n    }\n}\n\nexport default EventEmitter;\n",
-    "import {IViewerOptions} from \"../Viewer\";\nimport {ImageSize} from \"../Viewer\";\n\nexport class Settings {\n    private static _baseImageSize: number;\n    private static _basePanoramaSize: number;\n    private static _maxImageSize: number;\n\n    public static setOptions(options: IViewerOptions): void {\n        Settings._baseImageSize = options.baseImageSize != null ?\n            options.baseImageSize :\n            ImageSize.Size640;\n\n        Settings._basePanoramaSize = options.basePanoramaSize != null ?\n            options.basePanoramaSize :\n            ImageSize.Size2048;\n\n        Settings._maxImageSize = options.maxImageSize != null ?\n            options.maxImageSize :\n            ImageSize.Size2048;\n    }\n\n    public static get baseImageSize(): number {\n        return Settings._baseImageSize;\n    }\n\n    public static get basePanoramaSize(): number {\n        return Settings._basePanoramaSize;\n    }\n\n    public static get maxImageSize(): number {\n        return Settings._maxImageSize;\n    }\n}\n\nexport default Settings;\n",
-    "export function isBrowser(): boolean {\n    return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nexport function isArraySupported(): boolean {\n    return !!(\n        Array.prototype &&\n        Array.prototype.filter &&\n        Array.prototype.indexOf &&\n        Array.prototype.map\n    );\n}\n\nexport function isFunctionSupported(): boolean {\n    return !!(Function.prototype && Function.prototype.bind);\n}\n\nexport function isJSONSupported(): boolean {\n    return \"JSON\" in window && \"parse\" in JSON && \"stringify\" in JSON;\n}\n\nexport function isObjectSupported(): boolean {\n    return !!(\n        Object.keys &&\n        Object.assign\n    );\n}\n\nlet isWebGLSupportedCache: boolean = undefined;\nexport function isWebGLSupportedCached(): boolean {\n    if (isWebGLSupportedCache === undefined) {\n        isWebGLSupportedCache = isWebGLSupported();\n    }\n\n    return isWebGLSupportedCache;\n}\n\nexport function isWebGLSupported(): boolean {\n    const webGLContextAttributes: WebGLContextAttributes = {\n        alpha: false,\n        antialias: false,\n        depth: true,\n        failIfMajorPerformanceCaveat: false,\n        premultipliedAlpha: true,\n        preserveDrawingBuffer: false,\n        stencil: true,\n    };\n\n    const canvas: HTMLCanvasElement = document.createElement(\"canvas\");\n    const context: WebGLRenderingContext =\n        canvas.getContext(\"webgl\", webGLContextAttributes) ||\n        canvas.getContext(\"experimental-webgl\", webGLContextAttributes);\n\n    if (!context) {\n        return false;\n    }\n\n    const requiredExtensions: string[] = [\n        \"OES_standard_derivatives\",\n    ];\n\n    const supportedExtensions: string[] = context.getSupportedExtensions();\n    for (const requiredExtension of requiredExtensions) {\n        if (supportedExtensions.indexOf(requiredExtension) === -1) {\n            return false;\n        }\n    }\n\n    return true;\n}\n",
+    "import {\n    ImageSize,\n    IViewerOptions,\n} from \"../Viewer\";\n\nexport class Settings {\n    private static _baseImageSize: number;\n    private static _basePanoramaSize: number;\n    private static _maxImageSize: number;\n\n    public static setOptions(options: IViewerOptions): void {\n        Settings._baseImageSize = options.baseImageSize != null ?\n            options.baseImageSize :\n            ImageSize.Size640;\n\n        Settings._basePanoramaSize = options.basePanoramaSize != null ?\n            options.basePanoramaSize :\n            ImageSize.Size2048;\n\n        Settings._maxImageSize = options.maxImageSize != null ?\n            options.maxImageSize :\n            ImageSize.Size2048;\n    }\n\n    public static get baseImageSize(): number {\n        return Settings._baseImageSize;\n    }\n\n    public static get basePanoramaSize(): number {\n        return Settings._basePanoramaSize;\n    }\n\n    public static get maxImageSize(): number {\n        return Settings._maxImageSize;\n    }\n}\n\nexport default Settings;\n",
+    "export function isBrowser(): boolean {\n    return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nexport function isArraySupported(): boolean {\n    return !!(\n        Array.prototype &&\n        Array.prototype.filter &&\n        Array.prototype.indexOf &&\n        Array.prototype.map &&\n        Array.prototype.reverse\n    );\n}\n\nexport function isFunctionSupported(): boolean {\n    return !!(Function.prototype && Function.prototype.bind);\n}\n\nexport function isJSONSupported(): boolean {\n    return \"JSON\" in window && \"parse\" in JSON && \"stringify\" in JSON;\n}\n\nexport function isObjectSupported(): boolean {\n    return !!(\n        Object.keys &&\n        Object.assign\n    );\n}\n\nlet isWebGLSupportedCache: boolean = undefined;\nexport function isWebGLSupportedCached(): boolean {\n    if (isWebGLSupportedCache === undefined) {\n        isWebGLSupportedCache = isWebGLSupported();\n    }\n\n    return isWebGLSupportedCache;\n}\n\nexport function isWebGLSupported(): boolean {\n    const webGLContextAttributes: WebGLContextAttributes = {\n        alpha: false,\n        antialias: false,\n        depth: true,\n        failIfMajorPerformanceCaveat: false,\n        premultipliedAlpha: true,\n        preserveDrawingBuffer: false,\n        stencil: true,\n    };\n\n    const canvas: HTMLCanvasElement = document.createElement(\"canvas\");\n    const context: WebGLRenderingContext =\n        canvas.getContext(\"webgl\", webGLContextAttributes) ||\n        canvas.getContext(\"experimental-webgl\", webGLContextAttributes);\n\n    if (!context) {\n        return false;\n    }\n\n    const requiredExtensions: string[] = [\n        \"OES_standard_derivatives\",\n    ];\n\n    const supportedExtensions: string[] = context.getSupportedExtensions();\n    for (const requiredExtension of requiredExtensions) {\n        if (supportedExtensions.indexOf(requiredExtension) === -1) {\n            return false;\n        }\n    }\n\n    return true;\n}\n",
     "export class Urls {\n    public static get tileScheme(): string {\n        return \"https\";\n    }\n\n    public static get tileDomain(): string {\n        return \"d2qb1440i7l50o.cloudfront.net\";\n    }\n\n    public static get origin(): string {\n        return \"mapillary.webgl\";\n    }\n\n    public static thumbnail(key: string, size: number): string {\n        return `https://d1cuyjsrcm0gby.cloudfront.net/${key}/thumb-${size}.jpg?origin=${this.origin}`;\n    }\n\n    public static falcorModel(clientId: string): string {\n        return `https://a.mapillary.com/v3/model.json?client_id=${clientId}`;\n    }\n\n    public static protoMesh(key: string): string {\n        return `https://d1brzeo354iq2l.cloudfront.net/v2/mesh/${key}`;\n    }\n}\n\nexport default Urls;\n",
     "/**\n * Enumeration for alignments\n * @enum {number}\n * @readonly\n */\nexport enum Alignment {\n    /**\n     * Align to bottom\n     */\n    Bottom,\n\n    /**\n     * Align to bottom left\n     */\n    BottomLeft,\n\n    /**\n     * Align to bottom right\n     */\n    BottomRight,\n\n    /**\n     * Align to center\n     */\n    Center,\n\n    /**\n     * Align to left\n     */\n    Left,\n\n    /**\n     * Align to right\n     */\n    Right,\n\n    /**\n     * Align to top\n     */\n    Top,\n\n    /**\n     * Align to top left\n     */\n    TopLeft,\n\n    /**\n     * Align to top right\n     */\n    TopRight,\n}\n\nexport default Alignment;\n",
-    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/delay\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/switchMap\";\n\nimport {\n    Graph,\n    GraphService,\n    Node,\n} from \"../Graph\";\nimport {\n    IFrame,\n    StateService,\n} from \"../State\";\n\nexport class CacheService {\n    private _graphService: GraphService;\n    private _stateService: StateService;\n\n    private _started: boolean;\n\n    private _uncacheSubscription: Subscription;\n\n    constructor(graphService: GraphService, stateService: StateService) {\n        this._graphService = graphService;\n        this._stateService = stateService;\n\n        this._started = false;\n    }\n\n    public get started(): boolean {\n        return this._started;\n    }\n\n    public start(): void {\n        if (this._started) {\n            return;\n        }\n\n        this._uncacheSubscription = this._stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .map(\n                (frame: IFrame): string[] => {\n                    return frame.state.trajectory\n                        .map(\n                            (n: Node): string => {\n                                return n.key;\n                            });\n                })\n            .bufferCount(1, 5)\n            .switchMap(\n                (keepKeysBuffer: string[][]): Observable<Graph> => {\n                    let keepKeys: string[] = keepKeysBuffer[0];\n\n                    return this._graphService.uncache$(keepKeys);\n                })\n            .subscribe(() => { /*noop*/ });\n\n        this._started = true;\n    }\n\n    public stop(): void {\n        if (!this._started) {\n            return;\n        }\n\n        this._uncacheSubscription.unsubscribe();\n        this._uncacheSubscription = null;\n\n        this._started = false;\n    }\n}\n\nexport default CacheService;\n",
-    "import {Observable} from \"rxjs/Observable\";\n\nimport {Node} from \"../Graph\";\nimport {\n    Container,\n    Navigator,\n} from \"../Viewer\";\nimport {\n    Component,\n    ComponentService,\n    CoverComponent,\n    CoverState,\n    IComponentConfiguration,\n    ICoverConfiguration,\n} from \"../Component\";\nimport {\n    IComponentOptions,\n    Observer,\n} from \"../Viewer\";\n\nexport class ComponentController {\n    private _container: Container;\n    private _coverComponent: CoverComponent;\n    private _observer: Observer;\n    private _navigator: Navigator;\n    private _componentService: ComponentService;\n    private _options: IComponentOptions;\n    private _key: string;\n    private _navigable: boolean;\n\n    constructor(\n        container: Container,\n        navigator: Navigator,\n        observer: Observer,\n        key: string,\n        options: IComponentOptions,\n        componentService?: ComponentService) {\n        this._container = container;\n        this._observer = observer;\n        this._navigator = navigator;\n        this._options = options != null ? options : {};\n        this._key = key;\n        this._navigable = key == null;\n        this._componentService = !!componentService ?\n            componentService :\n            new ComponentService(this._container, this._navigator);\n\n        this._coverComponent = this._componentService.getCover();\n\n        this._initializeComponents();\n\n        if (key) {\n            this._initilizeCoverComponent();\n            this._subscribeCoverComponent();\n        } else {\n            this._navigator.movedToKey$\n                .first(\n                    (k: string): boolean => {\n                        return k != null;\n                    })\n                .subscribe(\n                    (k: string): void => {\n                        this._key = k;\n                        this._componentService.deactivateCover();\n                        this._coverComponent.configure({ key: this._key, state: CoverState.Hidden });\n                        this._subscribeCoverComponent();\n                        this._navigator.stateService.start();\n                        this._observer.startEmit();\n                    });\n        }\n    }\n\n    public get navigable(): boolean {\n        return this._navigable;\n    }\n\n    public get<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return this._componentService.get<TComponent>(name);\n    }\n\n    public activate(name: string): void {\n        this._componentService.activate(name);\n    }\n\n    public activateCover(): void {\n        this._coverComponent.configure({ state: CoverState.Visible });\n    }\n\n    public deactivate(name: string): void {\n        this._componentService.deactivate(name);\n    }\n\n    public deactivateCover(): void {\n        this._coverComponent.configure({ state: CoverState.Loading });\n    }\n\n    public resize(): void {\n        this._componentService.resize();\n    }\n\n    private _initializeComponents(): void {\n        let options: IComponentOptions = this._options;\n\n        this._uFalse(options.background, \"background\");\n        this._uFalse(options.debug, \"debug\");\n        this._uFalse(options.image, \"image\");\n        this._uFalse(options.marker, \"marker\");\n        this._uFalse(options.navigation, \"navigation\");\n        this._uFalse(options.popup, \"popup\");\n        this._uFalse(options.route, \"route\");\n        this._uFalse(options.slider, \"slider\");\n        this._uFalse(options.tag, \"tag\");\n\n        this._uTrue(options.attribution, \"attribution\");\n        this._uTrue(options.bearing, \"bearing\");\n        this._uTrue(options.cache, \"cache\");\n        this._uTrue(options.direction, \"direction\");\n        this._uTrue(options.imagePlane, \"imagePlane\");\n        this._uTrue(options.keyboard, \"keyboard\");\n        this._uTrue(options.loading, \"loading\");\n        this._uTrue(options.mouse, \"mouse\");\n        this._uTrue(options.sequence, \"sequence\");\n        this._uTrue(options.stats, \"stats\");\n    }\n\n    private _initilizeCoverComponent(): void {\n        let options: IComponentOptions = this._options;\n\n        this._coverComponent.configure({ key: this._key });\n        if (options.cover === undefined || options.cover) {\n            this.activateCover();\n        } else {\n            this.deactivateCover();\n        }\n    }\n\n    private _setNavigable(navigable: boolean): void {\n        if (this._navigable === navigable) {\n            return;\n        }\n\n        this._navigable = navigable;\n        this._observer.navigable$.next(navigable);\n    }\n\n    private _subscribeCoverComponent(): void {\n        this._coverComponent.configuration$.subscribe((conf: ICoverConfiguration) => {\n            if (conf.state === CoverState.Loading) {\n                this._navigator.stateService.currentKey$\n                    .first()\n                    .switchMap(\n                        (key: string): Observable<Node> => {\n                            const keyChanged: boolean = key == null || key !== conf.key;\n\n                            if (keyChanged) {\n                                this._setNavigable(false);\n                            }\n\n                            return keyChanged ?\n                                this._navigator.moveToKey$(conf.key) :\n                                this._navigator.stateService.currentNode$\n                                    .first();\n                        })\n                    .subscribe(\n                        (node: Node): void => {\n                            this._navigator.stateService.start();\n                            this._observer.startEmit();\n                            this._coverComponent.configure({ state: CoverState.Hidden });\n                            this._componentService.deactivateCover();\n                            this._setNavigable(true);\n                        },\n                        (error: Error): void => {\n                            console.error(\"Failed to deactivate cover.\", error);\n\n                            this._coverComponent.configure({ state: CoverState.Visible });\n                        });\n            } else if (conf.state === CoverState.Visible) {\n                this._observer.stopEmit();\n                this._navigator.stateService.stop();\n                this._componentService.activateCover();\n                this._setNavigable(conf.key == null);\n            }\n        });\n    }\n\n    private _uFalse<TConfiguration extends IComponentConfiguration>(option: boolean | TConfiguration, name: string): void {\n        if (option === undefined) {\n            this._componentService.deactivate(name);\n            return;\n        }\n        if (typeof option === \"boolean\") {\n            if (option) {\n                this._componentService.activate(name);\n            } else {\n                this._componentService.deactivate(name);\n            }\n            return;\n        }\n        this._componentService.configure(name, <TConfiguration>option);\n        this._componentService.activate(name);\n    }\n\n    private _uTrue<TConfiguration extends IComponentConfiguration>(option: boolean | TConfiguration, name: string): void {\n        if (option === undefined) {\n            this._componentService.activate(name);\n            return;\n        }\n        if (typeof option === \"boolean\") {\n            if (option) {\n                this._componentService.activate(name);\n            } else {\n                this._componentService.deactivate(name);\n            }\n            return;\n        }\n        this._componentService.configure(name, <TConfiguration>option);\n        this._componentService.activate(name);\n    }\n}\n",
-    "import {\n    GLRenderer,\n    DOMRenderer,\n    RenderService,\n} from \"../Render\";\nimport {StateService} from \"../State\";\nimport {DOM} from \"../Utils\";\nimport {\n    IViewerOptions,\n    KeyboardService,\n    MouseService,\n    TouchService,\n    SpriteService,\n} from \"../Viewer\";\n\nexport class Container {\n    public id: string;\n\n    public renderService: RenderService;\n\n    public glRenderer: GLRenderer;\n    public domRenderer: DOMRenderer;\n\n    public keyboardService: KeyboardService;\n    public mouseService: MouseService;\n    public touchService: TouchService;\n\n    public spriteService: SpriteService;\n\n    private _canvasContainer: HTMLElement;\n    private _container: HTMLElement;\n    private _domContainer: HTMLElement;\n\n    private _dom: DOM;\n\n    constructor (id: string, stateService: StateService, options: IViewerOptions, dom?: DOM) {\n        this.id = id;\n        this._dom = !!dom ? dom : new DOM();\n\n        this._container = this._dom.document.getElementById(id);\n\n        if (!this._container) {\n            throw new Error(`Container '${id}' not found.`);\n        }\n\n        this._container.classList.add(\"mapillary-js\");\n\n        this._canvasContainer = this._dom.createElement(\"div\", \"mapillary-js-interactive\", this._container);\n        this._domContainer = this._dom.createElement(\"div\", \"mapillary-js-dom\", this._container);\n\n        this.renderService = new RenderService(this._container, stateService.currentState$, options.renderMode);\n\n        this.glRenderer = new GLRenderer(this._canvasContainer, this.renderService, this._dom);\n        this.domRenderer = new DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);\n\n        this.keyboardService = new KeyboardService(this._canvasContainer);\n        this.mouseService = new MouseService(this._container, this._canvasContainer, this._domContainer, document);\n        this.touchService = new TouchService(this._canvasContainer, this._domContainer);\n\n        this.spriteService = new SpriteService(options.sprite);\n    }\n\n    public get element(): HTMLElement {\n        return this._container;\n    }\n\n    public get canvasContainer(): HTMLElement {\n        return this._canvasContainer;\n    }\n}\n\nexport default Container;\n",
+    "import {Observable} from \"rxjs/Observable\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/bufferCount\";\nimport \"rxjs/add/operator/delay\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/timeout\";\n\nimport {\n    Graph,\n    GraphMode,\n    GraphService,\n    IEdgeStatus,\n    Node,\n} from \"../Graph\";\nimport {\n    IFrame,\n    StateService,\n} from \"../State\";\n\nexport class CacheService {\n    private _graphService: GraphService;\n    private _stateService: StateService;\n\n    private _started: boolean;\n\n    private _uncacheSubscription: Subscription;\n    private _cacheNodeSubscription: Subscription;\n\n    constructor(graphService: GraphService, stateService: StateService) {\n        this._graphService = graphService;\n        this._stateService = stateService;\n\n        this._started = false;\n    }\n\n    public get started(): boolean {\n        return this._started;\n    }\n\n    public start(): void {\n        if (this._started) {\n            return;\n        }\n\n        this._uncacheSubscription = this._stateService.currentState$\n            .distinctUntilChanged(\n                undefined,\n                (frame: IFrame): string => {\n                    return frame.state.currentNode.key;\n                })\n            .map(\n                (frame: IFrame): [string[], string] => {\n                    const trajectory: Node[] = frame.state.trajectory;\n                    const trajectoryKeys: string[] = trajectory\n                        .map(\n                            (n: Node): string => {\n                                return n.key;\n                            });\n\n                    const sequenceKey: string = trajectory[trajectory.length - 1].sequenceKey;\n\n                    return [trajectoryKeys, sequenceKey];\n                })\n            .bufferCount(1, 5)\n            .withLatestFrom(this._graphService.graphMode$)\n            .switchMap(\n                ([keepBuffer, graphMode]: [[string[], string][], GraphMode]): Observable<void> => {\n                    let keepKeys: string[] = keepBuffer[0][0];\n                    let keepSequenceKey: string = graphMode === GraphMode.Sequence ?\n                        keepBuffer[0][1] : undefined;\n\n                    return this._graphService.uncache$(keepKeys, keepSequenceKey);\n                })\n            .subscribe(() => { /*noop*/ });\n\n        this._cacheNodeSubscription = this._graphService.graphMode$\n            .skip(1)\n            .withLatestFrom(this._stateService.currentState$)\n            .switchMap(\n                ([mode, frame]: [GraphMode, IFrame]): Observable<IEdgeStatus> => {\n                    return mode === GraphMode.Sequence ?\n                        this._keyToEdges(\n                            frame.state.currentNode.key,\n                            (node: Node): Observable<IEdgeStatus> => {\n                                return node.sequenceEdges$;\n                            }) :\n                        Observable\n                            .from(frame.state.trajectory\n                                .map(\n                                    (node: Node): string => {\n                                        return node.key;\n                                    })\n                                .slice(frame.state.currentIndex))\n                            .mergeMap(\n                                (key: string): Observable<IEdgeStatus> => {\n                                    return this._keyToEdges(\n                                        key,\n                                        (node: Node): Observable<IEdgeStatus> => {\n                                            return node.spatialEdges$;\n                                        });\n                                },\n                                6);\n                })\n            .subscribe(() => { /*noop*/ });\n\n        this._started = true;\n    }\n\n    public stop(): void {\n        if (!this._started) {\n            return;\n        }\n\n        this._uncacheSubscription.unsubscribe();\n        this._uncacheSubscription = null;\n\n        this._cacheNodeSubscription.unsubscribe();\n        this._cacheNodeSubscription = null;\n\n        this._started = false;\n    }\n\n    private _keyToEdges(key: string, nodeToEdgeMap: (node: Node) => Observable<IEdgeStatus>): Observable<IEdgeStatus> {\n        return this._graphService.cacheNode$(key)\n            .switchMap(nodeToEdgeMap)\n            .first(\n                (status: IEdgeStatus): boolean => {\n                    return status.cached;\n                })\n            .timeout(15000)\n            .catch(\n                (error: Error): Observable<IEdgeStatus> => {\n                    console.error(`Failed to cache edges (${key}).`, error);\n\n                    return Observable.empty();\n                });\n    }\n}\n\nexport default CacheService;\n",
+    "import {Observable} from \"rxjs/Observable\";\n\nimport {Node} from \"../Graph\";\nimport {\n    Component,\n    ComponentService,\n    CoverComponent,\n    CoverState,\n    IComponentConfiguration,\n    ICoverConfiguration,\n} from \"../Component\";\nimport {\n    Container,\n    IComponentOptions,\n    Navigator,\n    Observer,\n} from \"../Viewer\";\n\nexport class ComponentController {\n    private _container: Container;\n    private _coverComponent: CoverComponent;\n    private _observer: Observer;\n    private _navigator: Navigator;\n    private _componentService: ComponentService;\n    private _options: IComponentOptions;\n    private _key: string;\n    private _navigable: boolean;\n\n    constructor(\n        container: Container,\n        navigator: Navigator,\n        observer: Observer,\n        key: string,\n        options: IComponentOptions,\n        componentService?: ComponentService) {\n        this._container = container;\n        this._observer = observer;\n        this._navigator = navigator;\n        this._options = options != null ? options : {};\n        this._key = key;\n        this._navigable = key == null;\n        this._componentService = !!componentService ?\n            componentService :\n            new ComponentService(this._container, this._navigator);\n\n        this._coverComponent = this._componentService.getCover();\n\n        this._initializeComponents();\n\n        if (key) {\n            this._initilizeCoverComponent();\n            this._subscribeCoverComponent();\n        } else {\n            this._navigator.movedToKey$\n                .first(\n                    (k: string): boolean => {\n                        return k != null;\n                    })\n                .subscribe(\n                    (k: string): void => {\n                        this._key = k;\n                        this._componentService.deactivateCover();\n                        this._coverComponent.configure({ key: this._key, state: CoverState.Hidden });\n                        this._subscribeCoverComponent();\n                        this._navigator.stateService.start();\n                        this._navigator.cacheService.start();\n                        this._observer.startEmit();\n                    });\n        }\n    }\n\n    public get navigable(): boolean {\n        return this._navigable;\n    }\n\n    public get<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return this._componentService.get<TComponent>(name);\n    }\n\n    public activate(name: string): void {\n        this._componentService.activate(name);\n    }\n\n    public activateCover(): void {\n        this._coverComponent.configure({ state: CoverState.Visible });\n    }\n\n    public deactivate(name: string): void {\n        this._componentService.deactivate(name);\n    }\n\n    public deactivateCover(): void {\n        this._coverComponent.configure({ state: CoverState.Loading });\n    }\n\n    public resize(): void {\n        this._componentService.resize();\n    }\n\n    private _initializeComponents(): void {\n        let options: IComponentOptions = this._options;\n\n        this._uFalse(options.background, \"background\");\n        this._uFalse(options.debug, \"debug\");\n        this._uFalse(options.image, \"image\");\n        this._uFalse(options.marker, \"marker\");\n        this._uFalse(options.navigation, \"navigation\");\n        this._uFalse(options.popup, \"popup\");\n        this._uFalse(options.route, \"route\");\n        this._uFalse(options.slider, \"slider\");\n        this._uFalse(options.tag, \"tag\");\n\n        this._uTrue(options.attribution, \"attribution\");\n        this._uTrue(options.bearing, \"bearing\");\n        this._uTrue(options.cache, \"cache\");\n        this._uTrue(options.direction, \"direction\");\n        this._uTrue(options.imagePlane, \"imagePlane\");\n        this._uTrue(options.keyboard, \"keyboard\");\n        this._uTrue(options.loading, \"loading\");\n        this._uTrue(options.mouse, \"mouse\");\n        this._uTrue(options.sequence, \"sequence\");\n        this._uTrue(options.stats, \"stats\");\n    }\n\n    private _initilizeCoverComponent(): void {\n        let options: IComponentOptions = this._options;\n\n        this._coverComponent.configure({ key: this._key });\n        if (options.cover === undefined || options.cover) {\n            this.activateCover();\n        } else {\n            this.deactivateCover();\n        }\n    }\n\n    private _setNavigable(navigable: boolean): void {\n        if (this._navigable === navigable) {\n            return;\n        }\n\n        this._navigable = navigable;\n        this._observer.navigable$.next(navigable);\n    }\n\n    private _subscribeCoverComponent(): void {\n        this._coverComponent.configuration$.subscribe((conf: ICoverConfiguration) => {\n            if (conf.state === CoverState.Loading) {\n                this._navigator.stateService.currentKey$\n                    .first()\n                    .switchMap(\n                        (key: string): Observable<Node> => {\n                            const keyChanged: boolean = key == null || key !== conf.key;\n\n                            if (keyChanged) {\n                                this._setNavigable(false);\n                            }\n\n                            return keyChanged ?\n                                this._navigator.moveToKey$(conf.key) :\n                                this._navigator.stateService.currentNode$\n                                    .first();\n                        })\n                    .subscribe(\n                        (node: Node): void => {\n                            this._navigator.stateService.start();\n                            this._navigator.cacheService.start();\n                            this._observer.startEmit();\n                            this._coverComponent.configure({ state: CoverState.Hidden });\n                            this._componentService.deactivateCover();\n                            this._setNavigable(true);\n                        },\n                        (error: Error): void => {\n                            console.error(\"Failed to deactivate cover.\", error);\n\n                            this._coverComponent.configure({ state: CoverState.Visible });\n                        });\n            } else if (conf.state === CoverState.Visible) {\n                this._observer.stopEmit();\n                this._navigator.stateService.stop();\n                this._navigator.cacheService.stop();\n                this._navigator.playService.stop();\n                this._componentService.activateCover();\n                this._setNavigable(conf.key == null);\n            }\n        });\n    }\n\n    private _uFalse<TConfiguration extends IComponentConfiguration>(option: boolean | TConfiguration, name: string): void {\n        if (option === undefined) {\n            this._componentService.deactivate(name);\n            return;\n        }\n        if (typeof option === \"boolean\") {\n            if (option) {\n                this._componentService.activate(name);\n            } else {\n                this._componentService.deactivate(name);\n            }\n            return;\n        }\n        this._componentService.configure(name, <TConfiguration>option);\n        this._componentService.activate(name);\n    }\n\n    private _uTrue<TConfiguration extends IComponentConfiguration>(option: boolean | TConfiguration, name: string): void {\n        if (option === undefined) {\n            this._componentService.activate(name);\n            return;\n        }\n        if (typeof option === \"boolean\") {\n            if (option) {\n                this._componentService.activate(name);\n            } else {\n                this._componentService.deactivate(name);\n            }\n            return;\n        }\n        this._componentService.configure(name, <TConfiguration>option);\n        this._componentService.activate(name);\n    }\n}\n",
+    "import {\n    GLRenderer,\n    DOMRenderer,\n    RenderService,\n} from \"../Render\";\nimport {StateService} from \"../State\";\nimport {DOM} from \"../Utils\";\nimport {\n    IViewerOptions,\n    KeyboardService,\n    MouseService,\n    TouchService,\n    SpriteService,\n} from \"../Viewer\";\n\nexport class Container {\n    public id: string;\n\n    public renderService: RenderService;\n\n    public glRenderer: GLRenderer;\n    public domRenderer: DOMRenderer;\n\n    public keyboardService: KeyboardService;\n    public mouseService: MouseService;\n    public touchService: TouchService;\n\n    public spriteService: SpriteService;\n\n    private _canvasContainer: HTMLElement;\n    private _container: HTMLElement;\n    private _domContainer: HTMLElement;\n\n    private _dom: DOM;\n\n    constructor (id: string, stateService: StateService, options: IViewerOptions, dom?: DOM) {\n        this.id = id;\n        this._dom = !!dom ? dom : new DOM();\n\n        this._container = this._dom.document.getElementById(id);\n\n        if (!this._container) {\n            throw new Error(`Container '${id}' not found.`);\n        }\n\n        this._container.classList.add(\"mapillary-js\");\n\n        this._canvasContainer = this._dom.createElement(\"div\", \"mapillary-js-interactive\", this._container);\n        this._domContainer = this._dom.createElement(\"div\", \"mapillary-js-dom\", this._container);\n\n        this.renderService = new RenderService(this._container, stateService.currentState$, options.renderMode);\n\n        this.glRenderer = new GLRenderer(this._canvasContainer, this.renderService, this._dom);\n        this.domRenderer = new DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);\n\n        this.keyboardService = new KeyboardService(this._canvasContainer);\n        this.mouseService = new MouseService(this._container, this._canvasContainer, this._domContainer, document);\n        this.touchService = new TouchService(this._canvasContainer, this._domContainer);\n\n        this.spriteService = new SpriteService(options.sprite);\n    }\n\n    public get element(): HTMLElement {\n        return this._container;\n    }\n\n    public get canvasContainer(): HTMLElement {\n        return this._canvasContainer;\n    }\n\n    public get domContainer(): HTMLElement {\n        return this._domContainer;\n    }\n}\n\nexport default Container;\n",
     "/**\n * Enumeration for image sizes\n * @enum {number}\n * @readonly\n * @description Image sizes in pixels for the long side of the image.\n */\nexport enum ImageSize {\n\n    /**\n     * 320 pixels image size\n     */\n    Size320 = 320,\n\n    /**\n     * 640 pixels image size\n     */\n    Size640 = 640,\n\n    /**\n     * 1024 pixels image size\n     */\n    Size1024 = 1024,\n\n    /**\n     * 2048 pixels image size\n     */\n    Size2048 = 2048,\n}\n",
     "import {Observable} from \"rxjs/Observable\";\n\nexport class KeyboardService {\n    private _keyDown$: Observable<KeyboardEvent>;\n\n    constructor(canvasContainer: HTMLElement) {\n        this._keyDown$ = Observable.fromEvent(canvasContainer, \"keydown\");\n    }\n\n    public get keyDown$(): Observable<KeyboardEvent> {\n        return this._keyDown$;\n    }\n}\n\nexport default KeyboardService;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as _ from \"underscore\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/debounceTime\";\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\n\ninterface ILoader {\n    task: string;\n    loading: boolean;\n}\n\nexport class LoadingService {\n    private _loaders$: Observable<{[key: string]: boolean}>;\n    private _loadersSubject$: Subject<any> = new Subject<any>();\n\n    constructor () {\n        this._loaders$ = this._loadersSubject$\n            .scan(\n                (loaders: {[key: string]: boolean}, loader: ILoader): {[key: string]: boolean} => {\n                    if (loader.task !== undefined) {\n                        loaders[loader.task] = loader.loading;\n                    }\n                    return loaders;\n                },\n                {})\n            .startWith({})\n            .publishReplay(1)\n            .refCount();\n    }\n\n    public get loading$(): Observable<boolean> {\n        return this._loaders$\n            .map(\n                (loaders: {[key: string]: boolean}): boolean => {\n                    return _.reduce(\n                        loaders,\n                        (loader: boolean, acc: boolean) => {\n                            return (loader || acc);\n                        },\n                        false);\n                })\n            .debounceTime(100)\n            .distinctUntilChanged();\n    }\n\n    public taskLoading$(task: string): Observable<boolean> {\n        return this._loaders$\n            .map(\n                (loaders: {[key: string]: boolean}): boolean => {\n                    return !!loaders[task];\n                })\n            .debounceTime(100)\n            .distinctUntilChanged();\n    }\n\n    public startLoading(task: string): void {\n        this._loadersSubject$.next({loading: true, task: task});\n    }\n\n    public stopLoading(task: string): void {\n        this._loadersSubject$.next({loading: false, task: task});\n    }\n}\n\nexport default LoadingService;\n",
-    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/fromEvent\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {ViewportCoords} from \"../Geo\";\nimport {\n    IMouseClaim,\n    IMouseDeferPixels,\n} from \"../Viewer\";\n\nexport class MouseService {\n    private _domContainer: EventTarget;\n    private _canvasContainer: EventTarget;\n    private _viewportCoords: ViewportCoords;\n\n    private _activeSubject$: BehaviorSubject<boolean>;\n    private _active$: Observable<boolean>;\n\n    private _domMouseDown$: Observable<MouseEvent>;\n    private _domMouseMove$: Observable<MouseEvent>;\n\n    private _domMouseDragStart$: Observable<MouseEvent>;\n    private _domMouseDrag$: Observable<MouseEvent>;\n    private _domMouseDragEnd$: Observable<MouseEvent | FocusEvent>;\n\n    private _documentMouseMove$: Observable<MouseEvent>;\n    private _documentMouseUp$: Observable<MouseEvent>;\n\n    private _mouseDown$: Observable<MouseEvent>;\n    private _mouseMove$: Observable<MouseEvent>;\n    private _mouseLeave$: Observable<MouseEvent>;\n    private _mouseUp$: Observable<MouseEvent>;\n    private _mouseOut$: Observable<MouseEvent>;\n    private _mouseOver$: Observable<MouseEvent>;\n\n    private _contextMenu$: Observable<MouseEvent>;\n    private _consistentContextMenu$: Observable<MouseEvent>;\n    private _click$: Observable<MouseEvent>;\n    private _dblClick$: Observable<MouseEvent>;\n\n    private _mouseWheel$: Observable<WheelEvent>;\n\n    private _mouseDragStart$: Observable<MouseEvent>;\n    private _mouseDrag$: Observable<MouseEvent>;\n    private _mouseDragEnd$: Observable<MouseEvent | FocusEvent>;\n\n    private _deferPixelClaims$: Subject<IMouseDeferPixels>;\n    private _deferPixels$: Observable<number>;\n    private _proximateClick$: Observable<MouseEvent>;\n    private _staticClick$: Observable<MouseEvent>;\n\n    private _claimMouse$: Subject<IMouseClaim>;\n    private _claimWheel$: Subject<IMouseClaim>;\n\n    private _mouseOwner$: Observable<string>;\n    private _wheelOwner$: Observable<string>;\n\n    constructor(\n        container: EventTarget,\n        canvasContainer: EventTarget,\n        domContainer: EventTarget,\n        doc: EventTarget,\n        viewportCoords?: ViewportCoords) {\n\n        this._canvasContainer = canvasContainer;\n        this._domContainer = domContainer;\n        this._viewportCoords = viewportCoords != null ? viewportCoords : new ViewportCoords();\n\n        this._activeSubject$ = new BehaviorSubject<boolean>(false);\n\n        this._active$ = this._activeSubject$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._claimMouse$ = new Subject<IMouseClaim>();\n        this._claimWheel$ = new Subject<IMouseClaim>();\n\n        this._deferPixelClaims$ = new Subject<IMouseDeferPixels>();\n        this._deferPixels$ = this._deferPixelClaims$\n            .scan(\n                (claims: { [key: string]: number }, claim: IMouseDeferPixels): { [key: string]: number } => {\n                    if (claim.deferPixels == null) {\n                        delete claims[claim.name];\n                    } else {\n                        claims[claim.name] = claim.deferPixels;\n                    }\n\n                    return claims;\n                },\n                {})\n            .map(\n                (claims: { [key: string]: number }): number => {\n                    let deferPixelMax: number = -1;\n                    for (const key in claims) {\n                        if (!claims.hasOwnProperty(key)) {\n                            continue;\n                        }\n\n                        const deferPixels: number = claims[key];\n                        if (deferPixels > deferPixelMax) {\n                            deferPixelMax = deferPixels;\n                        }\n                    }\n\n                    return deferPixelMax;\n                })\n            .startWith(-1)\n            .publishReplay(1)\n            .refCount();\n\n        this._deferPixels$.subscribe((): void => { /* noop */ });\n\n        this._documentMouseMove$ = Observable.fromEvent<MouseEvent>(doc, \"mousemove\");\n        this._documentMouseUp$ = Observable.fromEvent<MouseEvent>(doc, \"mouseup\");\n\n        this._mouseDown$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mousedown\");\n        this._mouseLeave$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseleave\");\n        this._mouseMove$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mousemove\");\n        this._mouseUp$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseup\");\n        this._mouseOut$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseout\");\n        this._mouseOver$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseover\");\n\n        this._domMouseDown$ = Observable.fromEvent<MouseEvent>(domContainer, \"mousedown\");\n        this._domMouseMove$ = Observable.fromEvent<MouseEvent>(domContainer, \"mousemove\");\n\n        this._click$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"click\");\n        this._contextMenu$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"contextmenu\");\n\n        this._dblClick$ = Observable\n            .merge(\n                Observable.fromEvent<MouseEvent>(container, \"click\"),\n                Observable.fromEvent<MouseEvent>(canvasContainer, \"dblclick\"))\n            .bufferCount(3, 1)\n            .filter(\n                (events: MouseEvent[]): boolean => {\n                    const event1: MouseEvent = events[0];\n                    const event2: MouseEvent = events[1];\n                    const event3: MouseEvent = events[2];\n\n                    return event1.type === \"click\" &&\n                        event2.type === \"click\" &&\n                        event3.type === \"dblclick\" &&\n                        (<HTMLElement>event1.target).parentNode === canvasContainer &&\n                        (<HTMLElement>event2.target).parentNode === canvasContainer;\n                })\n            .map(\n                (events: MouseEvent[]): MouseEvent => {\n                    return events[2];\n                })\n            .share();\n\n        Observable\n            .merge(\n                this._domMouseDown$,\n                this._domMouseMove$,\n                this._dblClick$,\n                this._contextMenu$)\n            .subscribe(\n                (event: MouseEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._mouseWheel$ = Observable\n            .merge(\n                Observable.fromEvent<WheelEvent>(canvasContainer, \"wheel\"),\n                Observable.fromEvent<WheelEvent>(domContainer, \"wheel\"))\n            .share();\n\n        this._consistentContextMenu$ = Observable\n            .merge(\n                this._mouseDown$,\n                this._mouseMove$,\n                this._mouseOut$,\n                this._mouseUp$,\n                this._contextMenu$)\n            .bufferCount(3, 1)\n            .filter(\n                (events: MouseEvent[]): boolean => {\n                    // fire context menu on mouse up both on mac and windows\n                    return events[0].type === \"mousedown\" &&\n                        events[1].type === \"contextmenu\" &&\n                        events[2].type === \"mouseup\";\n                })\n            .map(\n                (events: MouseEvent[]): MouseEvent => {\n                    return events[1];\n                })\n            .share();\n\n        const dragStop$: Observable<MouseEvent | FocusEvent> = Observable\n            .merge(\n                Observable.fromEvent<FocusEvent>(window, \"blur\"),\n                this._documentMouseUp$\n                    .filter(\n                        (e: MouseEvent): boolean => {\n                            return e.button === 0;\n                        }))\n            .share();\n\n        const mouseDragInitiate$: Observable<[MouseEvent, MouseEvent]> =\n            this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).share();\n\n        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).share();\n        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).share();\n        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).share();\n\n        const domMouseDragInitiate$: Observable<[MouseEvent, MouseEvent]> =\n            this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).share();\n\n        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).share();\n        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).share();\n        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).share();\n\n        this._proximateClick$ = this._mouseDown$\n            .switchMap(\n                (mouseDown: MouseEvent): Observable<MouseEvent> => {\n                    return this._click$\n                        .takeUntil(this._createDeferredMouseMove$(mouseDown, this._documentMouseMove$))\n                        .take(1);\n                })\n            .share();\n\n        this._staticClick$ = this._mouseDown$\n            .switchMap(\n                (e: MouseEvent): Observable<MouseEvent> => {\n                    return this._click$\n                        .takeUntil(this._documentMouseMove$)\n                        .take(1);\n                })\n            .share();\n\n        this._mouseDragStart$.subscribe();\n        this._mouseDrag$.subscribe();\n        this._mouseDragEnd$.subscribe();\n\n        this._domMouseDragStart$.subscribe();\n        this._domMouseDrag$.subscribe();\n        this._domMouseDragEnd$.subscribe();\n\n        this._staticClick$.subscribe();\n\n        this._mouseOwner$ = this._createOwner$(this._claimMouse$)\n            .publishReplay(1)\n            .refCount();\n\n        this._wheelOwner$ = this._createOwner$(this._claimWheel$)\n            .publishReplay(1)\n            .refCount();\n\n        this._mouseOwner$.subscribe(() => { /* noop */ });\n        this._wheelOwner$.subscribe(() => { /* noop */ });\n    }\n\n    public get active$(): Observable<boolean> {\n        return this._active$;\n    }\n\n    public get activate$(): Subject<boolean> {\n        return this._activeSubject$;\n    }\n\n    public get documentMouseMove$(): Observable<MouseEvent> {\n        return this._documentMouseMove$;\n    }\n\n    public get documentMouseUp$(): Observable<MouseEvent> {\n        return this._documentMouseUp$;\n    }\n\n    public get domMouseDragStart$(): Observable<MouseEvent> {\n        return this._domMouseDragStart$;\n    }\n\n    public get domMouseDrag$(): Observable<MouseEvent> {\n        return this._domMouseDrag$;\n    }\n\n    public get domMouseDragEnd$(): Observable<MouseEvent | FocusEvent> {\n        return this._domMouseDragEnd$;\n    }\n\n    public get domMouseDown$(): Observable<MouseEvent> {\n        return this._domMouseDown$;\n    }\n\n    public get domMouseMove$(): Observable<MouseEvent> {\n        return this._domMouseMove$;\n    }\n\n    public get mouseOwner$(): Observable<string> {\n        return this._mouseOwner$;\n    }\n\n    public get mouseDown$(): Observable<MouseEvent> {\n        return this._mouseDown$;\n    }\n\n    public get mouseMove$(): Observable<MouseEvent> {\n        return this._mouseMove$;\n    }\n\n    public get mouseLeave$(): Observable<MouseEvent> {\n        return this._mouseLeave$;\n    }\n\n    public get mouseOut$(): Observable<MouseEvent> {\n        return this._mouseOut$;\n    }\n\n    public get mouseOver$(): Observable<MouseEvent> {\n        return this._mouseOver$;\n    }\n\n    public get mouseUp$(): Observable<MouseEvent> {\n        return this._mouseUp$;\n    }\n\n    public get click$(): Observable<MouseEvent> {\n        return this._click$;\n    }\n\n    public get dblClick$(): Observable<MouseEvent> {\n        return this._dblClick$;\n    }\n\n    public get contextMenu$(): Observable<MouseEvent> {\n        return this._consistentContextMenu$;\n    }\n\n    public get mouseWheel$(): Observable<WheelEvent> {\n        return this._mouseWheel$;\n    }\n\n    public get mouseDragStart$(): Observable<MouseEvent> {\n        return this._mouseDragStart$;\n    }\n\n    public get mouseDrag$(): Observable<MouseEvent> {\n        return this._mouseDrag$;\n    }\n\n    public get mouseDragEnd$(): Observable<MouseEvent | FocusEvent> {\n        return this._mouseDragEnd$;\n    }\n\n    public get proximateClick$(): Observable<MouseEvent> {\n        return this._proximateClick$;\n    }\n\n    public get staticClick$(): Observable<MouseEvent> {\n        return this._staticClick$;\n    }\n\n    public claimMouse(name: string, zindex: number): void {\n        this._claimMouse$.next({ name: name, zindex: zindex });\n    }\n\n    public unclaimMouse(name: string): void {\n        this._claimMouse$.next({ name: name, zindex: null });\n    }\n\n    public deferPixels(name: string, deferPixels: number): void {\n        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });\n    }\n\n    public undeferPixels(name: string): void {\n        this._deferPixelClaims$.next({ name: name, deferPixels: null });\n    }\n\n    public claimWheel(name: string, zindex: number): void {\n        this._claimWheel$.next({name: name, zindex: zindex});\n    }\n\n    public unclaimWheel(name: string): void {\n        this._claimWheel$.next({name: name, zindex: null});\n    }\n\n    public filtered$<T>(name: string, observable$: Observable<T>): Observable<T> {\n        return this._filtered(name, observable$, this._mouseOwner$);\n    }\n\n    public filteredWheel$<T>(name: string, observable$: Observable<T>): Observable<T> {\n        return this._filtered(name, observable$, this._wheelOwner$);\n    }\n\n    private _createDeferredMouseMove$(\n        origin: MouseEvent,\n        mouseMove$: Observable<MouseEvent>): Observable<MouseEvent> {\n        return mouseMove$\n            .map(\n                (mouseMove: MouseEvent): [MouseEvent, number] => {\n                    const deltaX: number = mouseMove.clientX - origin.clientX;\n                    const deltaY: number = mouseMove.clientY - origin.clientY;\n\n                    return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];\n                })\n            .withLatestFrom(this._deferPixels$)\n            .filter(\n                ([[mouseMove, delta], deferPixels]: [[MouseEvent, number], number]): boolean => {\n                    return delta > deferPixels;\n                })\n            .map(\n                ([[mouseMove, delta], deferPixels]: [[MouseEvent, number], number]): MouseEvent => {\n                    return mouseMove;\n                });\n    }\n\n    private _createMouseDrag$(\n        mouseDragStartInitiate$: Observable<[MouseEvent, MouseEvent]>,\n        stop$: Observable<Event>): Observable<MouseEvent> {\n\n        return mouseDragStartInitiate$\n            .map(\n                ([mouseDown, mouseMove]: [MouseEvent, MouseEvent]): MouseEvent => {\n                    return mouseMove;\n                })\n            .switchMap(\n                (mouseMove: MouseEvent): Observable<MouseEvent> => {\n                    return Observable\n                        .of(mouseMove)\n                        .concat(this._documentMouseMove$)\n                        .takeUntil(stop$);\n                });\n    }\n\n    private _createMouseDragEnd$<T>(mouseDragStart$: Observable<MouseEvent>, stop$: Observable<T>): Observable<T> {\n        return mouseDragStart$\n            .switchMap(\n                (event: MouseEvent): Observable<T> => {\n                    return stop$.first();\n                });\n    }\n\n    private _createMouseDragStart$(mouseDragStartInitiate$: Observable<[MouseEvent, MouseEvent]>): Observable<MouseEvent> {\n        return mouseDragStartInitiate$\n            .map(\n                ([mouseDown, mouseMove]: [MouseEvent, MouseEvent]): MouseEvent => {\n                    return mouseDown;\n                });\n    }\n\n    private _createMouseDragInitiate$(\n        mouseDown$: Observable<MouseEvent>,\n        stop$: Observable<Event>,\n        defer: boolean): Observable<[MouseEvent, MouseEvent]> {\n\n        return mouseDown$\n            .filter(\n                (mouseDown: MouseEvent): boolean => {\n                    return mouseDown.button === 0;\n                })\n            .switchMap(\n                (mouseDown: MouseEvent): Observable<[MouseEvent, MouseEvent]> => {\n                    return Observable\n                        .combineLatest(\n                            Observable.of(mouseDown),\n                            defer ?\n                                this._createDeferredMouseMove$(mouseDown, this._documentMouseMove$) :\n                                this._documentMouseMove$)\n                        .takeUntil(stop$)\n                        .take(1);\n                });\n    }\n\n    private _createOwner$(claim$: Observable<IMouseClaim>): Observable<string> {\n        return claim$\n            .scan(\n                (claims: { [key: string]: number }, claim: IMouseClaim): { [key: string]: number } => {\n                    if (claim.zindex == null) {\n                        delete claims[claim.name];\n                    } else {\n                        claims[claim.name] = claim.zindex;\n                    }\n\n                    return claims;\n                },\n                {})\n            .map(\n                (claims: { [key: string]: number }): string => {\n                    let owner: string = null;\n                    let zIndexMax: number = -1;\n\n                    for (const name in claims) {\n                        if (!claims.hasOwnProperty(name)) {\n                            continue;\n                        }\n\n                        if (claims[name] > zIndexMax) {\n                            zIndexMax = claims[name];\n                            owner = name;\n                        }\n                    }\n\n                    return owner;\n                })\n            .startWith(null);\n    }\n\n    private _filtered<T>(name: string, observable$: Observable<T>, owner$: Observable<string>): Observable<T> {\n        return observable$\n            .withLatestFrom(owner$)\n            .filter(\n                ([item, owner]: [T, string]): boolean => {\n                    return owner === name;\n                })\n            .map(\n                ([item, owner]: [T, string]): T => {\n                    return item;\n                });\n    }\n}\n\nexport default MouseService;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {ReplaySubject} from \"rxjs/ReplaySubject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/throw\";\n\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/mergeMap\";\n\nimport {\n    APIv3,\n    IFullNode,\n} from \"../API\";\nimport {\n    FilterExpression,\n    Graph,\n    GraphService,\n    IEdgeStatus,\n    ImageLoadingService,\n    Node,\n} from \"../Graph\";\nimport {EdgeDirection} from \"../Edge\";\nimport {\n    StateService,\n    IFrame,\n} from \"../State\";\nimport {\n    CacheService,\n    LoadingService,\n} from \"../Viewer\";\n\nexport class Navigator {\n    private _apiV3: APIv3;\n\n    private _cacheService: CacheService;\n    private _graphService: GraphService;\n    private _imageLoadingService: ImageLoadingService;\n    private _loadingService: LoadingService;\n    private _loadingName: string;\n    private _stateService: StateService;\n\n    private _keyRequested$: BehaviorSubject<string>;\n    private _movedToKey$: BehaviorSubject<string>;\n\n    private _request$: ReplaySubject<Node>;\n    private _requestSubscription: Subscription;\n    private _nodeRequestSubscription: Subscription;\n\n    constructor (\n        clientId: string,\n        token?: string,\n        apiV3?: APIv3,\n        graphService?: GraphService,\n        imageLoadingService?: ImageLoadingService,\n        loadingService?: LoadingService,\n        stateService?: StateService,\n        cacheService?: CacheService) {\n\n        this._apiV3 = apiV3 != null ? apiV3 : new APIv3(clientId, token);\n\n        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new ImageLoadingService();\n\n        this._graphService = graphService != null ?\n            graphService :\n            new GraphService(new Graph(this.apiV3), this._imageLoadingService);\n\n        this._loadingService = loadingService != null ? loadingService : new LoadingService();\n        this._loadingName = \"navigator\";\n\n        this._stateService = stateService != null ? stateService : new StateService();\n\n        this._cacheService = cacheService != null ?\n            cacheService :\n            new CacheService(this._graphService, this._stateService);\n\n        this._cacheService.start();\n\n        this._keyRequested$ = new BehaviorSubject<string>(null);\n        this._movedToKey$ = new BehaviorSubject<string>(null);\n\n        this._request$ = null;\n        this._requestSubscription = null;\n        this._nodeRequestSubscription = null;\n    }\n\n    public get apiV3(): APIv3 {\n        return this._apiV3;\n    }\n\n    public get graphService(): GraphService {\n        return this._graphService;\n    }\n\n    public get imageLoadingService(): ImageLoadingService {\n        return this._imageLoadingService;\n    }\n\n    public get loadingService(): LoadingService {\n        return this._loadingService;\n    }\n\n    public get movedToKey$(): Observable<string> {\n        return this._movedToKey$;\n    }\n\n    public get stateService(): StateService {\n        return this._stateService;\n    }\n\n    public moveToKey$(key: string): Observable<Node> {\n        this._abortRequest(`to key ${key}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this._moveToKey$(key);\n\n        return this._makeRequest$(node$);\n    }\n\n    public moveDir$(direction: EdgeDirection): Observable<Node> {\n        this._abortRequest(`in dir ${EdgeDirection[direction]}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this.stateService.currentNode$\n            .first()\n            .mergeMap(\n                (node: Node): Observable<string> => {\n                    return ([EdgeDirection.Next, EdgeDirection.Prev].indexOf(direction) > -1 ?\n                        node.sequenceEdges$ :\n                        node.spatialEdges$)\n                            .first()\n                            .map(\n                                (status: IEdgeStatus): string => {\n                                    for (let edge of status.edges) {\n                                        if (edge.data.direction === direction) {\n                                            return edge.to;\n                                        }\n                                    }\n\n                                    return null;\n                                });\n                })\n            .mergeMap(\n                (directionKey: string) => {\n                    if (directionKey == null) {\n                        this._loadingService.stopLoading(this._loadingName);\n\n                        return Observable\n                            .throw(new Error(`Direction (${direction}) does not exist for current node.`));\n                    }\n\n                    return this._moveToKey$(directionKey);\n                });\n\n        return this._makeRequest$(node$);\n    }\n\n    public moveCloseTo$(lat: number, lon: number): Observable<Node> {\n        this._abortRequest(`to lat ${lat}, lon ${lon}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this.apiV3.imageCloseTo$(lat, lon)\n            .mergeMap(\n                (fullNode: IFullNode): Observable<Node> => {\n                    if (fullNode == null) {\n                        this._loadingService.stopLoading(this._loadingName);\n\n                        return Observable\n                            .throw(new Error(`No image found close to lat ${lat}, lon ${lon}.`));\n                    }\n\n                    return this._moveToKey$(fullNode.key);\n                });\n\n        return this._makeRequest$(node$);\n    }\n\n    public setFilter$(filter: FilterExpression): Observable<void> {\n        this._stateService.clearNodes();\n\n        return this._movedToKey$\n            .first()\n            .mergeMap(\n                (key: string): Observable<Node> => {\n                    if (key != null) {\n                        return this._trajectoryKeys$()\n                            .mergeMap(\n                                (keys: string[]): Observable<Node> => {\n                                    return this._graphService.setFilter$(filter)\n                                        .mergeMap(\n                                            (graph: Graph): Observable<Node> => {\n                                                return this._cacheKeys$(keys);\n                                            });\n                                })\n                            .last();\n                    }\n\n                    return this._keyRequested$\n                        .first()\n                        .mergeMap(\n                            (requestedKey: string): Observable<Node> => {\n                                if (requestedKey != null) {\n                                    return this._graphService.setFilter$(filter)\n                                        .mergeMap(\n                                            (graph: Graph): Observable<Node> => {\n                                                return this._graphService.cacheNode$(requestedKey);\n                                            });\n                                }\n\n                                return this._graphService.setFilter$(filter)\n                                    .map(\n                                        (graph: Graph): Node => {\n                                            return undefined;\n                                        });\n                            });\n                })\n            .map(\n                (node: Node): void => {\n                    return undefined;\n                });\n    }\n\n    public setToken$(token?: string): Observable<void> {\n        this._abortRequest(\"to set token\");\n\n        this._stateService.clearNodes();\n\n        return this._movedToKey$\n            .first()\n            .do(\n                (key: string): void => {\n                    this._apiV3.setToken(token);\n                })\n            .mergeMap(\n                (key: string): Observable<void> => {\n                    return key == null ?\n                        this._graphService.reset$([])\n                            .map(\n                                (graph: Graph): void => {\n                                    return undefined;\n                                }) :\n                        this._trajectoryKeys$()\n                            .mergeMap(\n                                (keys: string[]): Observable<Node> => {\n                                    return this._graphService.reset$(keys)\n                                        .mergeMap(\n                                            (graph: Graph): Observable<Node> => {\n                                                return this._cacheKeys$(keys);\n                                            });\n                                })\n                            .last()\n                            .map(\n                                (node: Node): void => {\n                                    return undefined;\n                                });\n                    });\n    }\n\n    private _cacheKeys$(keys: string[]): Observable<Node> {\n        let cacheNodes$: Observable<Node>[] = keys\n            .map(\n                (key: string): Observable<Node> => {\n                        return this._graphService.cacheNode$(key);\n                });\n\n        return Observable\n            .from<Observable<Node>>(cacheNodes$)\n            .mergeAll();\n    }\n\n    private _abortRequest(reason: string): void {\n        if (this._requestSubscription != null) {\n            this._requestSubscription.unsubscribe();\n            this._requestSubscription = null;\n        }\n\n        if (this._nodeRequestSubscription != null) {\n            this._nodeRequestSubscription.unsubscribe();\n            this._nodeRequestSubscription = null;\n        }\n\n        if (this._request$ != null) {\n            this._request$.error(new Error(`Request aborted by a subsequent request ${reason}.`));\n            this._request$ = null;\n        }\n    }\n\n    private _makeRequest$(node$: Observable<Node>): Observable<Node> {\n        this._request$ = new ReplaySubject<Node>(1);\n        this._requestSubscription = this._request$\n            .subscribe(undefined, (e: Error): void => { /*noop*/ });\n\n        this._nodeRequestSubscription = node$\n            .subscribe(\n                (node: Node): void => {\n                    this._request$.next(node);\n                    this._request$.complete();\n                },\n                (error: Error): void => {\n                    this._request$.error(error);\n                });\n\n        return this._request$;\n    }\n\n    private _moveToKey$(key: string): Observable<Node> {\n        this._keyRequested$.next(key);\n\n        return this._graphService.cacheNode$(key)\n            .do(\n                (node: Node) => {\n                    this._stateService.setNodes([node]);\n                    this._movedToKey$.next(node.key);\n                })\n            .finally(\n                (): void => {\n                    this._loadingService.stopLoading(this._loadingName);\n                });\n    }\n\n    private _trajectoryKeys$(): Observable<string[]> {\n        return this._stateService.currentState$\n            .first()\n            .map(\n                (frame: IFrame): string[] => {\n                    return frame.state.trajectory\n                            .map(\n                                (node: Node): string => {\n                                    return node.key;\n                                });\n                });\n    }\n}\n\nexport default Navigator;\n",
+    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/fromEvent\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/mergeMap\";\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/switchMap\";\nimport \"rxjs/add/operator/withLatestFrom\";\n\nimport {ViewportCoords} from \"../Geo\";\nimport {\n    IMouseClaim,\n    IMouseDeferPixels,\n} from \"../Viewer\";\n\nexport class MouseService {\n    private _activeSubject$: BehaviorSubject<boolean>;\n    private _active$: Observable<boolean>;\n\n    private _domMouseDown$: Observable<MouseEvent>;\n    private _domMouseMove$: Observable<MouseEvent>;\n\n    private _domMouseDragStart$: Observable<MouseEvent>;\n    private _domMouseDrag$: Observable<MouseEvent>;\n    private _domMouseDragEnd$: Observable<MouseEvent | FocusEvent>;\n\n    private _documentMouseMove$: Observable<MouseEvent>;\n    private _documentMouseUp$: Observable<MouseEvent>;\n\n    private _mouseDown$: Observable<MouseEvent>;\n    private _mouseMove$: Observable<MouseEvent>;\n    private _mouseLeave$: Observable<MouseEvent>;\n    private _mouseUp$: Observable<MouseEvent>;\n    private _mouseOut$: Observable<MouseEvent>;\n    private _mouseOver$: Observable<MouseEvent>;\n\n    private _contextMenu$: Observable<MouseEvent>;\n    private _consistentContextMenu$: Observable<MouseEvent>;\n    private _click$: Observable<MouseEvent>;\n    private _dblClick$: Observable<MouseEvent>;\n\n    private _mouseWheel$: Observable<WheelEvent>;\n\n    private _mouseDragStart$: Observable<MouseEvent>;\n    private _mouseDrag$: Observable<MouseEvent>;\n    private _mouseDragEnd$: Observable<MouseEvent | FocusEvent>;\n\n    private _deferPixelClaims$: Subject<IMouseDeferPixels>;\n    private _deferPixels$: Observable<number>;\n    private _proximateClick$: Observable<MouseEvent>;\n    private _staticClick$: Observable<MouseEvent>;\n\n    private _claimMouse$: Subject<IMouseClaim>;\n    private _claimWheel$: Subject<IMouseClaim>;\n\n    private _mouseOwner$: Observable<string>;\n    private _wheelOwner$: Observable<string>;\n\n    constructor(\n        container: EventTarget,\n        canvasContainer: EventTarget,\n        domContainer: EventTarget,\n        doc: EventTarget,\n        viewportCoords?: ViewportCoords) {\n\n        viewportCoords = viewportCoords != null ? viewportCoords : new ViewportCoords();\n\n        this._activeSubject$ = new BehaviorSubject<boolean>(false);\n\n        this._active$ = this._activeSubject$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        this._claimMouse$ = new Subject<IMouseClaim>();\n        this._claimWheel$ = new Subject<IMouseClaim>();\n\n        this._deferPixelClaims$ = new Subject<IMouseDeferPixels>();\n        this._deferPixels$ = this._deferPixelClaims$\n            .scan(\n                (claims: { [key: string]: number }, claim: IMouseDeferPixels): { [key: string]: number } => {\n                    if (claim.deferPixels == null) {\n                        delete claims[claim.name];\n                    } else {\n                        claims[claim.name] = claim.deferPixels;\n                    }\n\n                    return claims;\n                },\n                {})\n            .map(\n                (claims: { [key: string]: number }): number => {\n                    let deferPixelMax: number = -1;\n                    for (const key in claims) {\n                        if (!claims.hasOwnProperty(key)) {\n                            continue;\n                        }\n\n                        const deferPixels: number = claims[key];\n                        if (deferPixels > deferPixelMax) {\n                            deferPixelMax = deferPixels;\n                        }\n                    }\n\n                    return deferPixelMax;\n                })\n            .startWith(-1)\n            .publishReplay(1)\n            .refCount();\n\n        this._deferPixels$.subscribe((): void => { /* noop */ });\n\n        this._documentMouseMove$ = Observable.fromEvent<MouseEvent>(doc, \"mousemove\");\n        this._documentMouseUp$ = Observable.fromEvent<MouseEvent>(doc, \"mouseup\");\n\n        this._mouseDown$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mousedown\");\n        this._mouseLeave$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseleave\");\n        this._mouseMove$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mousemove\");\n        this._mouseUp$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseup\");\n        this._mouseOut$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseout\");\n        this._mouseOver$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"mouseover\");\n\n        this._domMouseDown$ = Observable.fromEvent<MouseEvent>(domContainer, \"mousedown\");\n        this._domMouseMove$ = Observable.fromEvent<MouseEvent>(domContainer, \"mousemove\");\n\n        this._click$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"click\");\n        this._contextMenu$ = Observable.fromEvent<MouseEvent>(canvasContainer, \"contextmenu\");\n\n        this._dblClick$ = Observable\n            .merge(\n                Observable.fromEvent<MouseEvent>(container, \"click\"),\n                Observable.fromEvent<MouseEvent>(canvasContainer, \"dblclick\"))\n            .bufferCount(3, 1)\n            .filter(\n                (events: MouseEvent[]): boolean => {\n                    const event1: MouseEvent = events[0];\n                    const event2: MouseEvent = events[1];\n                    const event3: MouseEvent = events[2];\n\n                    return event1.type === \"click\" &&\n                        event2.type === \"click\" &&\n                        event3.type === \"dblclick\" &&\n                        (<HTMLElement>event1.target).parentNode === canvasContainer &&\n                        (<HTMLElement>event2.target).parentNode === canvasContainer;\n                })\n            .map(\n                (events: MouseEvent[]): MouseEvent => {\n                    return events[2];\n                })\n            .share();\n\n        Observable\n            .merge(\n                this._domMouseDown$,\n                this._domMouseMove$,\n                this._dblClick$,\n                this._contextMenu$)\n            .subscribe(\n                (event: MouseEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._mouseWheel$ = Observable\n            .merge(\n                Observable.fromEvent<WheelEvent>(canvasContainer, \"wheel\"),\n                Observable.fromEvent<WheelEvent>(domContainer, \"wheel\"))\n            .share();\n\n        this._consistentContextMenu$ = Observable\n            .merge(\n                this._mouseDown$,\n                this._mouseMove$,\n                this._mouseOut$,\n                this._mouseUp$,\n                this._contextMenu$)\n            .bufferCount(3, 1)\n            .filter(\n                (events: MouseEvent[]): boolean => {\n                    // fire context menu on mouse up both on mac and windows\n                    return events[0].type === \"mousedown\" &&\n                        events[1].type === \"contextmenu\" &&\n                        events[2].type === \"mouseup\";\n                })\n            .map(\n                (events: MouseEvent[]): MouseEvent => {\n                    return events[1];\n                })\n            .share();\n\n        const dragStop$: Observable<MouseEvent | FocusEvent> = Observable\n            .merge(\n                Observable.fromEvent<FocusEvent>(window, \"blur\"),\n                this._documentMouseUp$\n                    .filter(\n                        (e: MouseEvent): boolean => {\n                            return e.button === 0;\n                        }))\n            .share();\n\n        const mouseDragInitiate$: Observable<[MouseEvent, MouseEvent]> =\n            this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).share();\n\n        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).share();\n        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).share();\n        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).share();\n\n        const domMouseDragInitiate$: Observable<[MouseEvent, MouseEvent]> =\n            this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).share();\n\n        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).share();\n        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).share();\n        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).share();\n\n        this._proximateClick$ = this._mouseDown$\n            .switchMap(\n                (mouseDown: MouseEvent): Observable<MouseEvent> => {\n                    return this._click$\n                        .takeUntil(this._createDeferredMouseMove$(mouseDown, this._documentMouseMove$))\n                        .take(1);\n                })\n            .share();\n\n        this._staticClick$ = this._mouseDown$\n            .switchMap(\n                (e: MouseEvent): Observable<MouseEvent> => {\n                    return this._click$\n                        .takeUntil(this._documentMouseMove$)\n                        .take(1);\n                })\n            .share();\n\n        this._mouseDragStart$.subscribe();\n        this._mouseDrag$.subscribe();\n        this._mouseDragEnd$.subscribe();\n\n        this._domMouseDragStart$.subscribe();\n        this._domMouseDrag$.subscribe();\n        this._domMouseDragEnd$.subscribe();\n\n        this._staticClick$.subscribe();\n\n        this._mouseOwner$ = this._createOwner$(this._claimMouse$)\n            .publishReplay(1)\n            .refCount();\n\n        this._wheelOwner$ = this._createOwner$(this._claimWheel$)\n            .publishReplay(1)\n            .refCount();\n\n        this._mouseOwner$.subscribe(() => { /* noop */ });\n        this._wheelOwner$.subscribe(() => { /* noop */ });\n    }\n\n    public get active$(): Observable<boolean> {\n        return this._active$;\n    }\n\n    public get activate$(): Subject<boolean> {\n        return this._activeSubject$;\n    }\n\n    public get documentMouseMove$(): Observable<MouseEvent> {\n        return this._documentMouseMove$;\n    }\n\n    public get documentMouseUp$(): Observable<MouseEvent> {\n        return this._documentMouseUp$;\n    }\n\n    public get domMouseDragStart$(): Observable<MouseEvent> {\n        return this._domMouseDragStart$;\n    }\n\n    public get domMouseDrag$(): Observable<MouseEvent> {\n        return this._domMouseDrag$;\n    }\n\n    public get domMouseDragEnd$(): Observable<MouseEvent | FocusEvent> {\n        return this._domMouseDragEnd$;\n    }\n\n    public get domMouseDown$(): Observable<MouseEvent> {\n        return this._domMouseDown$;\n    }\n\n    public get domMouseMove$(): Observable<MouseEvent> {\n        return this._domMouseMove$;\n    }\n\n    public get mouseOwner$(): Observable<string> {\n        return this._mouseOwner$;\n    }\n\n    public get mouseDown$(): Observable<MouseEvent> {\n        return this._mouseDown$;\n    }\n\n    public get mouseMove$(): Observable<MouseEvent> {\n        return this._mouseMove$;\n    }\n\n    public get mouseLeave$(): Observable<MouseEvent> {\n        return this._mouseLeave$;\n    }\n\n    public get mouseOut$(): Observable<MouseEvent> {\n        return this._mouseOut$;\n    }\n\n    public get mouseOver$(): Observable<MouseEvent> {\n        return this._mouseOver$;\n    }\n\n    public get mouseUp$(): Observable<MouseEvent> {\n        return this._mouseUp$;\n    }\n\n    public get click$(): Observable<MouseEvent> {\n        return this._click$;\n    }\n\n    public get dblClick$(): Observable<MouseEvent> {\n        return this._dblClick$;\n    }\n\n    public get contextMenu$(): Observable<MouseEvent> {\n        return this._consistentContextMenu$;\n    }\n\n    public get mouseWheel$(): Observable<WheelEvent> {\n        return this._mouseWheel$;\n    }\n\n    public get mouseDragStart$(): Observable<MouseEvent> {\n        return this._mouseDragStart$;\n    }\n\n    public get mouseDrag$(): Observable<MouseEvent> {\n        return this._mouseDrag$;\n    }\n\n    public get mouseDragEnd$(): Observable<MouseEvent | FocusEvent> {\n        return this._mouseDragEnd$;\n    }\n\n    public get proximateClick$(): Observable<MouseEvent> {\n        return this._proximateClick$;\n    }\n\n    public get staticClick$(): Observable<MouseEvent> {\n        return this._staticClick$;\n    }\n\n    public claimMouse(name: string, zindex: number): void {\n        this._claimMouse$.next({ name: name, zindex: zindex });\n    }\n\n    public unclaimMouse(name: string): void {\n        this._claimMouse$.next({ name: name, zindex: null });\n    }\n\n    public deferPixels(name: string, deferPixels: number): void {\n        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });\n    }\n\n    public undeferPixels(name: string): void {\n        this._deferPixelClaims$.next({ name: name, deferPixels: null });\n    }\n\n    public claimWheel(name: string, zindex: number): void {\n        this._claimWheel$.next({name: name, zindex: zindex});\n    }\n\n    public unclaimWheel(name: string): void {\n        this._claimWheel$.next({name: name, zindex: null});\n    }\n\n    public filtered$<T>(name: string, observable$: Observable<T>): Observable<T> {\n        return this._filtered(name, observable$, this._mouseOwner$);\n    }\n\n    public filteredWheel$<T>(name: string, observable$: Observable<T>): Observable<T> {\n        return this._filtered(name, observable$, this._wheelOwner$);\n    }\n\n    private _createDeferredMouseMove$(\n        origin: MouseEvent,\n        mouseMove$: Observable<MouseEvent>): Observable<MouseEvent> {\n        return mouseMove$\n            .map(\n                (mouseMove: MouseEvent): [MouseEvent, number] => {\n                    const deltaX: number = mouseMove.clientX - origin.clientX;\n                    const deltaY: number = mouseMove.clientY - origin.clientY;\n\n                    return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];\n                })\n            .withLatestFrom(this._deferPixels$)\n            .filter(\n                ([[mouseMove, delta], deferPixels]: [[MouseEvent, number], number]): boolean => {\n                    return delta > deferPixels;\n                })\n            .map(\n                ([[mouseMove, delta], deferPixels]: [[MouseEvent, number], number]): MouseEvent => {\n                    return mouseMove;\n                });\n    }\n\n    private _createMouseDrag$(\n        mouseDragStartInitiate$: Observable<[MouseEvent, MouseEvent]>,\n        stop$: Observable<Event>): Observable<MouseEvent> {\n\n        return mouseDragStartInitiate$\n            .map(\n                ([mouseDown, mouseMove]: [MouseEvent, MouseEvent]): MouseEvent => {\n                    return mouseMove;\n                })\n            .switchMap(\n                (mouseMove: MouseEvent): Observable<MouseEvent> => {\n                    return Observable\n                        .of(mouseMove)\n                        .concat(this._documentMouseMove$)\n                        .takeUntil(stop$);\n                });\n    }\n\n    private _createMouseDragEnd$<T>(mouseDragStart$: Observable<MouseEvent>, stop$: Observable<T>): Observable<T> {\n        return mouseDragStart$\n            .switchMap(\n                (event: MouseEvent): Observable<T> => {\n                    return stop$.first();\n                });\n    }\n\n    private _createMouseDragStart$(mouseDragStartInitiate$: Observable<[MouseEvent, MouseEvent]>): Observable<MouseEvent> {\n        return mouseDragStartInitiate$\n            .map(\n                ([mouseDown, mouseMove]: [MouseEvent, MouseEvent]): MouseEvent => {\n                    return mouseDown;\n                });\n    }\n\n    private _createMouseDragInitiate$(\n        mouseDown$: Observable<MouseEvent>,\n        stop$: Observable<Event>,\n        defer: boolean): Observable<[MouseEvent, MouseEvent]> {\n\n        return mouseDown$\n            .filter(\n                (mouseDown: MouseEvent): boolean => {\n                    return mouseDown.button === 0;\n                })\n            .switchMap(\n                (mouseDown: MouseEvent): Observable<[MouseEvent, MouseEvent]> => {\n                    return Observable\n                        .combineLatest(\n                            Observable.of(mouseDown),\n                            defer ?\n                                this._createDeferredMouseMove$(mouseDown, this._documentMouseMove$) :\n                                this._documentMouseMove$)\n                        .takeUntil(stop$)\n                        .take(1);\n                });\n    }\n\n    private _createOwner$(claim$: Observable<IMouseClaim>): Observable<string> {\n        return claim$\n            .scan(\n                (claims: { [key: string]: number }, claim: IMouseClaim): { [key: string]: number } => {\n                    if (claim.zindex == null) {\n                        delete claims[claim.name];\n                    } else {\n                        claims[claim.name] = claim.zindex;\n                    }\n\n                    return claims;\n                },\n                {})\n            .map(\n                (claims: { [key: string]: number }): string => {\n                    let owner: string = null;\n                    let zIndexMax: number = -1;\n\n                    for (const name in claims) {\n                        if (!claims.hasOwnProperty(name)) {\n                            continue;\n                        }\n\n                        if (claims[name] > zIndexMax) {\n                            zIndexMax = claims[name];\n                            owner = name;\n                        }\n                    }\n\n                    return owner;\n                })\n            .startWith(null);\n    }\n\n    private _filtered<T>(name: string, observable$: Observable<T>, owner$: Observable<string>): Observable<T> {\n        return observable$\n            .withLatestFrom(owner$)\n            .filter(\n                ([item, owner]: [T, string]): boolean => {\n                    return owner === name;\n                })\n            .map(\n                ([item, owner]: [T, string]): T => {\n                    return item;\n                });\n    }\n}\n\nexport default MouseService;\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {ReplaySubject} from \"rxjs/ReplaySubject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/throw\";\n\nimport \"rxjs/add/operator/do\";\nimport \"rxjs/add/operator/finally\";\nimport \"rxjs/add/operator/first\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/mergeMap\";\n\nimport {\n    APIv3,\n    IFullNode,\n} from \"../API\";\nimport {\n    FilterExpression,\n    Graph,\n    GraphService,\n    IEdgeStatus,\n    ImageLoadingService,\n    Node,\n} from \"../Graph\";\nimport {EdgeDirection} from \"../Edge\";\nimport {\n    StateService,\n    IFrame,\n} from \"../State\";\nimport {\n    CacheService,\n    LoadingService,\n    PlayService,\n} from \"../Viewer\";\n\nexport class Navigator {\n    private _apiV3: APIv3;\n\n    private _cacheService: CacheService;\n    private _graphService: GraphService;\n    private _imageLoadingService: ImageLoadingService;\n    private _loadingService: LoadingService;\n    private _loadingName: string;\n    private _playService: PlayService;\n    private _stateService: StateService;\n\n    private _keyRequested$: BehaviorSubject<string>;\n    private _movedToKey$: BehaviorSubject<string>;\n\n    private _request$: ReplaySubject<Node>;\n    private _requestSubscription: Subscription;\n    private _nodeRequestSubscription: Subscription;\n\n    constructor (\n        clientId: string,\n        token?: string,\n        apiV3?: APIv3,\n        graphService?: GraphService,\n        imageLoadingService?: ImageLoadingService,\n        loadingService?: LoadingService,\n        stateService?: StateService,\n        cacheService?: CacheService,\n        playService?: PlayService) {\n\n        this._apiV3 = apiV3 != null ? apiV3 : new APIv3(clientId, token);\n\n        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new ImageLoadingService();\n\n        this._graphService = graphService != null ?\n            graphService :\n            new GraphService(new Graph(this.apiV3), this._imageLoadingService);\n\n        this._loadingService = loadingService != null ? loadingService : new LoadingService();\n        this._loadingName = \"navigator\";\n\n        this._stateService = stateService != null ? stateService : new StateService();\n\n        this._cacheService = cacheService != null ?\n            cacheService :\n            new CacheService(this._graphService, this._stateService);\n\n        this._playService = playService != null ?\n            playService :\n            new PlayService(this._graphService, this._stateService);\n\n        this._keyRequested$ = new BehaviorSubject<string>(null);\n        this._movedToKey$ = new BehaviorSubject<string>(null);\n\n        this._request$ = null;\n        this._requestSubscription = null;\n        this._nodeRequestSubscription = null;\n    }\n\n    public get apiV3(): APIv3 {\n        return this._apiV3;\n    }\n\n    public get cacheService(): CacheService {\n        return this._cacheService;\n    }\n\n    public get graphService(): GraphService {\n        return this._graphService;\n    }\n\n    public get imageLoadingService(): ImageLoadingService {\n        return this._imageLoadingService;\n    }\n\n    public get loadingService(): LoadingService {\n        return this._loadingService;\n    }\n\n    public get movedToKey$(): Observable<string> {\n        return this._movedToKey$;\n    }\n\n    public get playService(): PlayService {\n        return this._playService;\n    }\n\n    public get stateService(): StateService {\n        return this._stateService;\n    }\n\n    public moveToKey$(key: string): Observable<Node> {\n        this._abortRequest(`to key ${key}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this._moveToKey$(key);\n\n        return this._makeRequest$(node$);\n    }\n\n    public moveDir$(direction: EdgeDirection): Observable<Node> {\n        this._abortRequest(`in dir ${EdgeDirection[direction]}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this.stateService.currentNode$\n            .first()\n            .mergeMap(\n                (node: Node): Observable<string> => {\n                    return ([EdgeDirection.Next, EdgeDirection.Prev].indexOf(direction) > -1 ?\n                        node.sequenceEdges$ :\n                        node.spatialEdges$)\n                            .first()\n                            .map(\n                                (status: IEdgeStatus): string => {\n                                    for (let edge of status.edges) {\n                                        if (edge.data.direction === direction) {\n                                            return edge.to;\n                                        }\n                                    }\n\n                                    return null;\n                                });\n                })\n            .mergeMap(\n                (directionKey: string) => {\n                    if (directionKey == null) {\n                        this._loadingService.stopLoading(this._loadingName);\n\n                        return Observable\n                            .throw(new Error(`Direction (${direction}) does not exist for current node.`));\n                    }\n\n                    return this._moveToKey$(directionKey);\n                });\n\n        return this._makeRequest$(node$);\n    }\n\n    public moveCloseTo$(lat: number, lon: number): Observable<Node> {\n        this._abortRequest(`to lat ${lat}, lon ${lon}`);\n\n        this._loadingService.startLoading(this._loadingName);\n\n        const node$: Observable<Node> = this.apiV3.imageCloseTo$(lat, lon)\n            .mergeMap(\n                (fullNode: IFullNode): Observable<Node> => {\n                    if (fullNode == null) {\n                        this._loadingService.stopLoading(this._loadingName);\n\n                        return Observable\n                            .throw(new Error(`No image found close to lat ${lat}, lon ${lon}.`));\n                    }\n\n                    return this._moveToKey$(fullNode.key);\n                });\n\n        return this._makeRequest$(node$);\n    }\n\n    public setFilter$(filter: FilterExpression): Observable<void> {\n        this._stateService.clearNodes();\n\n        return this._movedToKey$\n            .first()\n            .mergeMap(\n                (key: string): Observable<Node> => {\n                    if (key != null) {\n                        return this._trajectoryKeys$()\n                            .mergeMap(\n                                (keys: string[]): Observable<Node> => {\n                                    return this._graphService.setFilter$(filter)\n                                        .mergeMap(\n                                            (): Observable<Node> => {\n                                                return this._cacheKeys$(keys);\n                                            });\n                                })\n                            .last();\n                    }\n\n                    return this._keyRequested$\n                        .first()\n                        .mergeMap(\n                            (requestedKey: string): Observable<Node> => {\n                                if (requestedKey != null) {\n                                    return this._graphService.setFilter$(filter)\n                                        .mergeMap(\n                                            (): Observable<Node> => {\n                                                return this._graphService.cacheNode$(requestedKey);\n                                            });\n                                }\n\n                                return this._graphService.setFilter$(filter)\n                                    .map(\n                                        (): Node => {\n                                            return undefined;\n                                        });\n                            });\n                })\n            .map(\n                (node: Node): void => {\n                    return undefined;\n                });\n    }\n\n    public setToken$(token?: string): Observable<void> {\n        this._abortRequest(\"to set token\");\n\n        this._stateService.clearNodes();\n\n        return this._movedToKey$\n            .first()\n            .do(\n                (key: string): void => {\n                    this._apiV3.setToken(token);\n                })\n            .mergeMap(\n                (key: string): Observable<void> => {\n                    return key == null ?\n                        this._graphService.reset$([]) :\n                        this._trajectoryKeys$()\n                            .mergeMap(\n                                (keys: string[]): Observable<Node> => {\n                                    return this._graphService.reset$(keys)\n                                        .mergeMap(\n                                            (): Observable<Node> => {\n                                                return this._cacheKeys$(keys);\n                                            });\n                                })\n                            .last()\n                            .map(\n                                (node: Node): void => {\n                                    return undefined;\n                                });\n                    });\n    }\n\n    private _cacheKeys$(keys: string[]): Observable<Node> {\n        let cacheNodes$: Observable<Node>[] = keys\n            .map(\n                (key: string): Observable<Node> => {\n                        return this._graphService.cacheNode$(key);\n                });\n\n        return Observable\n            .from<Observable<Node>>(cacheNodes$)\n            .mergeAll();\n    }\n\n    private _abortRequest(reason: string): void {\n        if (this._requestSubscription != null) {\n            this._requestSubscription.unsubscribe();\n            this._requestSubscription = null;\n        }\n\n        if (this._nodeRequestSubscription != null) {\n            this._nodeRequestSubscription.unsubscribe();\n            this._nodeRequestSubscription = null;\n        }\n\n        if (this._request$ != null) {\n            this._request$.error(new Error(`Request aborted by a subsequent request ${reason}.`));\n            this._request$ = null;\n        }\n    }\n\n    private _makeRequest$(node$: Observable<Node>): Observable<Node> {\n        this._request$ = new ReplaySubject<Node>(1);\n        this._requestSubscription = this._request$\n            .subscribe(undefined, (e: Error): void => { /*noop*/ });\n\n        this._nodeRequestSubscription = node$\n            .subscribe(\n                (node: Node): void => {\n                    this._request$.next(node);\n                    this._request$.complete();\n                },\n                (error: Error): void => {\n                    this._request$.error(error);\n                });\n\n        return this._request$;\n    }\n\n    private _moveToKey$(key: string): Observable<Node> {\n        this._keyRequested$.next(key);\n\n        return this._graphService.cacheNode$(key)\n            .do(\n                (node: Node) => {\n                    this._stateService.setNodes([node]);\n                    this._movedToKey$.next(node.key);\n                })\n            .finally(\n                (): void => {\n                    this._loadingService.stopLoading(this._loadingName);\n                });\n    }\n\n    private _trajectoryKeys$(): Observable<string[]> {\n        return this._stateService.currentState$\n            .first()\n            .map(\n                (frame: IFrame): string[] => {\n                    return frame.state.trajectory\n                            .map(\n                                (node: Node): string => {\n                                    return node.key;\n                                });\n                });\n    }\n}\n\nexport default Navigator;\n",
     "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/observable/combineLatest\";\n\nimport \"rxjs/add/operator/distinctUntilChanged\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/throttleTime\";\n\nimport {ILatLon} from \"../API\";\nimport {\n    ILatLonAlt,\n    Transform,\n} from \"../Geo\";\nimport {\n    IEdgeStatus,\n    Node,\n} from \"../Graph\";\nimport {RenderCamera} from \"../Render\";\nimport {EventEmitter} from \"../Utils\";\nimport {\n    Container,\n    IUnprojection,\n    IViewerMouseEvent,\n    Navigator,\n    Projection,\n    Viewer,\n} from \"../Viewer\";\n\nexport class Observer {\n    private _started: boolean;\n\n    private _navigable$: Subject<boolean>;\n\n    private _bearingSubscription: Subscription;\n    private _currentNodeSubscription: Subscription;\n    private _moveSubscription: Subscription;\n    private _sequenceEdgesSubscription: Subscription;\n    private _spatialEdgesSubscription: Subscription;\n    private _viewerMouseEventSubscription: Subscription;\n\n    private _container: Container;\n    private _eventEmitter: EventEmitter;\n    private _navigator: Navigator;\n    private _projection: Projection;\n\n    constructor(eventEmitter: EventEmitter, navigator: Navigator, container: Container) {\n        this._container = container;\n        this._eventEmitter = eventEmitter;\n        this._navigator = navigator;\n        this._projection = new Projection();\n\n        this._started = false;\n\n        this._navigable$ = new Subject<boolean>();\n\n        // navigable and loading should always emit, also when cover is activated.\n        this._navigable$\n            .subscribe(\n                (navigable: boolean): void => {\n                    this._eventEmitter.fire(Viewer.navigablechanged, navigable);\n                });\n\n        this._navigator.loadingService.loading$\n            .subscribe(\n                (loading: boolean): void => {\n                    this._eventEmitter.fire(Viewer.loadingchanged, loading);\n                });\n    }\n\n    public get started(): boolean {\n        return this._started;\n    }\n\n    public get navigable$(): Subject<boolean> {\n        return this._navigable$;\n    }\n\n    public projectBasic$(basicPoint: number[]): Observable<number[]> {\n        return Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .first()\n            .map(\n                ([render, transform]: [RenderCamera, Transform]): number[] => {\n                    const canvasPoint: number[] = this._projection.basicToCanvas(\n                        basicPoint,\n                        this._container.element,\n                        render,\n                        transform);\n\n                    return [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])];\n                });\n    }\n\n    public startEmit(): void {\n        if (this._started) {\n            return;\n        }\n\n        this._started = true;\n\n        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$\n            .subscribe((node: Node): void => {\n                this._eventEmitter.fire(Viewer.nodechanged, node);\n            });\n\n        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.sequenceEdges$;\n                })\n            .subscribe(\n                (status: IEdgeStatus): void => {\n                    this._eventEmitter.fire(Viewer.sequenceedgeschanged, status);\n                });\n\n        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$\n            .switchMap(\n                (node: Node): Observable<IEdgeStatus> => {\n                    return node.spatialEdges$;\n                })\n            .subscribe(\n                (status: IEdgeStatus): void => {\n                    this._eventEmitter.fire(Viewer.spatialedgeschanged, status);\n                });\n\n        this._moveSubscription = Observable\n            .combineLatest(\n                this._navigator.stateService.inMotion$,\n                this._container.mouseService.active$,\n                this._container.touchService.active$)\n            .map(\n                (values: boolean[]): boolean => {\n                    return values[0] || values[1] || values[2];\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (started: boolean) => {\n                    if (started) {\n                        this._eventEmitter.fire(Viewer.movestart, null);\n                    } else {\n                        this._eventEmitter.fire(Viewer.moveend, null);\n                    }\n                });\n\n        this._bearingSubscription = this._container.renderService.bearing$\n            .throttleTime(100)\n            .distinctUntilChanged(\n                (b1: number, b2: number): boolean => {\n                    return Math.abs(b2 - b1) < 1;\n                })\n            .subscribe(\n                (bearing): void => {\n                    this._eventEmitter.fire(Viewer.bearingchanged, bearing);\n                 });\n\n        const mouseMove$: Observable<MouseEvent> = this._container.mouseService.active$\n            .switchMap(\n                (active: boolean): Observable<MouseEvent> => {\n                    return active ?\n                        Observable.empty<MouseEvent>() :\n                        this._container.mouseService.mouseMove$;\n                });\n\n        this._viewerMouseEventSubscription = Observable\n            .merge(\n                this._mapMouseEvent$(Viewer.click, this._container.mouseService.staticClick$),\n                this._mapMouseEvent$(Viewer.contextmenu, this._container.mouseService.contextMenu$),\n                this._mapMouseEvent$(Viewer.dblclick, this._container.mouseService.dblClick$),\n                this._mapMouseEvent$(Viewer.mousedown, this._container.mouseService.mouseDown$),\n                this._mapMouseEvent$(Viewer.mousemove, mouseMove$),\n                this._mapMouseEvent$(Viewer.mouseout, this._container.mouseService.mouseOut$),\n                this._mapMouseEvent$(Viewer.mouseover, this._container.mouseService.mouseOver$),\n                this._mapMouseEvent$(Viewer.mouseup, this._container.mouseService.mouseUp$))\n            .withLatestFrom(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.reference$,\n                this._navigator.stateService.currentTransform$)\n            .map(\n                ([[type, event], render, reference, transform]:\n                [[string, MouseEvent], RenderCamera, ILatLonAlt, Transform]): IViewerMouseEvent => {\n                    const unprojection: IUnprojection =\n                        this._projection.eventToUnprojection(\n                            event,\n                            this._container.element,\n                            render,\n                            reference,\n                            transform);\n\n                    return  {\n                        basicPoint: unprojection.basicPoint,\n                        latLon: unprojection.latLon,\n                        originalEvent: event,\n                        pixelPoint: unprojection.pixelPoint,\n                        target: <Viewer>this._eventEmitter,\n                        type: type,\n                    };\n                })\n            .subscribe(\n                (event: IViewerMouseEvent): void => {\n                    this._eventEmitter.fire(event.type, event);\n                });\n    }\n\n    public stopEmit(): void {\n        if (!this.started) {\n            return;\n        }\n\n        this._started = false;\n\n        this._bearingSubscription.unsubscribe();\n        this._currentNodeSubscription.unsubscribe();\n        this._moveSubscription.unsubscribe();\n        this._sequenceEdgesSubscription.unsubscribe();\n        this._spatialEdgesSubscription.unsubscribe();\n        this._viewerMouseEventSubscription.unsubscribe();\n\n        this._bearingSubscription = null;\n        this._currentNodeSubscription = null;\n        this._moveSubscription = null;\n        this._sequenceEdgesSubscription = null;\n        this._spatialEdgesSubscription = null;\n        this._viewerMouseEventSubscription = null;\n    }\n\n    public unproject$(canvasPoint: number[]): Observable<ILatLon> {\n        return Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.reference$,\n                this._navigator.stateService.currentTransform$)\n            .first()\n            .map(\n                ([render, reference, transform]: [RenderCamera, ILatLonAlt, Transform]): ILatLon => {\n                    const unprojection: IUnprojection =\n                        this._projection.canvasToUnprojection(\n                            canvasPoint,\n                            this._container.element,\n                            render,\n                            reference,\n                            transform);\n\n                    return unprojection.latLon;\n                });\n    }\n\n    public unprojectBasic$(canvasPoint: number[]): Observable<number[]> {\n        return Observable\n            .combineLatest(\n                this._container.renderService.renderCamera$,\n                this._navigator.stateService.currentTransform$)\n            .first()\n            .map(\n                ([render, transform]: [RenderCamera, Transform]): number[] => {\n                    return this._projection.canvasToBasic(\n                        canvasPoint,\n                        this._container.element,\n                        render,\n                        transform);\n                });\n    }\n\n    private _mapMouseEvent$(type: string, mouseEvent$: Observable<MouseEvent>): Observable<[string, MouseEvent]> {\n        return mouseEvent$.map(\n            (event: MouseEvent): [string, MouseEvent] => {\n                return [type, event];\n            });\n    }\n}\n\nexport default Observer;\n",
+    "import {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\nimport {Subscription} from \"rxjs/Subscription\";\n\nimport \"rxjs/add/operator/timeout\";\n\nimport {EdgeDirection} from \"../Edge\";\nimport {\n    Graph,\n    GraphMode,\n    GraphService,\n    IEdgeStatus,\n    Node,\n    Sequence,\n} from \"../Graph\";\nimport {\n    IFrame,\n    StateService,\n} from \"../State\";\n\nexport class PlayService {\n    private _graphService: GraphService;\n    private _stateService: StateService;\n\n    private _nodesAhead: number;\n    private _playing: boolean;\n    private _speed: number;\n\n    private _direction$: Observable<EdgeDirection>;\n    private _directionSubject$: Subject<EdgeDirection>;\n    private _playing$: Observable<boolean>;\n    private _playingSubject$: Subject<boolean>;\n    private _speed$: Observable<number>;\n    private _speedSubject$: Subject<number>;\n\n    private _playingSubscription: Subscription;\n    private _cacheSubscription: Subscription;\n    private _clearSubscription: Subscription;\n    private _graphModeSubscription: Subscription;\n    private _stopSubscription: Subscription;\n\n    constructor(graphService: GraphService, stateService: StateService) {\n        this._graphService = graphService;\n        this._stateService = stateService;\n\n        this._directionSubject$ = new Subject<EdgeDirection>();\n        this._direction$ = this._directionSubject$\n            .startWith(EdgeDirection.Next)\n            .publishReplay(1)\n            .refCount();\n\n        this._direction$.subscribe();\n\n        this._playing = false;\n        this._playingSubject$ = new Subject<boolean>();\n        this._playing$ = this._playingSubject$\n            .startWith(this._playing)\n            .publishReplay(1)\n            .refCount();\n\n        this._playing$.subscribe();\n\n        this._speed = 0.5;\n        this._speedSubject$ = new Subject<number>();\n        this._speed$ = this._speedSubject$\n            .startWith(this._speed)\n            .publishReplay(1)\n            .refCount();\n\n        this._speed$.subscribe();\n\n        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));\n    }\n\n    public get playing(): boolean {\n        return this._playing;\n    }\n\n    public get direction$(): Observable<EdgeDirection> {\n        return this._direction$;\n    }\n\n    public get playing$(): Observable<boolean> {\n        return this._playing$;\n    }\n\n    public get speed$(): Observable<number> {\n        return this._speed$;\n    }\n\n    public play(): void {\n        if (this._playing) {\n            return;\n        }\n\n        this._stateService.cutNodes();\n        const stateSpeed: number = this._setSpeed(this._speed);\n        this._stateService.setSpeed(stateSpeed);\n\n        this._graphModeSubscription = this._speed$\n            .map(\n                (speed: number): GraphMode => {\n                    return speed > 0.54 ? GraphMode.Sequence : GraphMode.Spatial;\n                })\n            .distinctUntilChanged()\n            .subscribe(\n                (mode: GraphMode): void => {\n                    this._graphService.setGraphMode(mode);\n                });\n\n        this._cacheSubscription = this._stateService.currentNode$\n            .map(\n                (node: Node): [string, string] => {\n                    return [node.sequenceKey, node.key];\n                })\n            .distinctUntilChanged(\n                undefined,\n                ([sequenceKey, nodeKey]: [string, string]): string => {\n                    return sequenceKey;\n                })\n            .combineLatest(\n                this._graphService.graphMode$,\n                this._direction$)\n            .switchMap(\n                ([[sequenceKey, nodeKey], mode, direction]: [[string, string], GraphMode, EdgeDirection]):\n                    Observable<[Sequence, EdgeDirection]> => {\n\n                    if (direction !== EdgeDirection.Next && direction !== EdgeDirection.Prev) {\n                        return Observable.of<[Sequence, EdgeDirection]>([undefined, direction]);\n                    }\n\n                    const sequence$: Observable<Sequence> = (mode === GraphMode.Sequence ?\n                        this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :\n                        this._graphService.cacheSequence$(sequenceKey))\n                        .retry(3)\n                        .catch(\n                            (): Observable<Sequence> => {\n                                return Observable.of(undefined);\n                            });\n\n                    return Observable\n                        .combineLatest(\n                            sequence$,\n                            Observable.of(direction));\n                })\n            .switchMap(\n                ([sequence, direction]: [Sequence, EdgeDirection]): Observable<string> => {\n                    if (sequence === undefined) {\n                        return Observable.empty();\n                    }\n\n                    const sequenceKeys: string[] = sequence.keys.slice();\n                    if (direction === EdgeDirection.Prev) {\n                        sequenceKeys.reverse();\n                    }\n\n                    return this._stateService.currentState$\n                        .map(\n                            (frame: IFrame): [string, number] => {\n                                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];\n                            })\n                        .scan(\n                            (\n                                [lastRequestKey, previousRequestKeys]: [string, string[]],\n                                [lastTrajectoryKey, nodesAhead]: [string, number]):\n                                [string, string[]] => {\n\n                                if (lastRequestKey === undefined) {\n                                    lastRequestKey = lastTrajectoryKey;\n                                }\n\n                                const lastIndex: number = sequenceKeys.length - 1;\n                                if (nodesAhead >= this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {\n                                    return [lastRequestKey, []];\n                                }\n\n                                const current: number = sequenceKeys.indexOf(lastTrajectoryKey);\n                                const start: number = sequenceKeys.indexOf(lastRequestKey) + 1;\n                                const end: number = Math.min(lastIndex, current + this._nodesAhead - nodesAhead) + 1;\n\n                                if (end <= start) {\n                                    return [lastRequestKey, []];\n                                }\n\n                                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];\n                            },\n                            [undefined, []])\n                        .mergeMap(\n                            ([lastRequestKey, newRequestKeys]: [string, string[]]): Observable<string> => {\n                                return Observable.from(newRequestKeys);\n                            });\n                })\n            .mergeMap(\n                (key: string): Observable<Node> => {\n                    return this._graphService.cacheNode$(key)\n                        .catch(\n                            (): Observable<Node> => {\n                                return Observable.empty();\n                            });\n                },\n                6)\n            .subscribe();\n\n        this._playingSubscription = this._stateService.currentState$\n            .filter(\n                (frame: IFrame): boolean => {\n                    return frame.state.nodesAhead < this._nodesAhead;\n                })\n            .map(\n                (frame: IFrame): Node => {\n                    return frame.state.lastNode;\n                })\n            .distinctUntilChanged(\n                undefined,\n                (lastNode: Node): string => {\n                    return lastNode.key;\n                })\n            .withLatestFrom(this._direction$)\n            .switchMap(\n                ([node, direction]: [Node, EdgeDirection]): Observable<Node> => {\n                    return ([EdgeDirection.Next, EdgeDirection.Prev].indexOf(direction) > -1 ?\n                            node.sequenceEdges$ :\n                            node.spatialEdges$)\n                        .first(\n                            (status: IEdgeStatus): boolean => {\n                                return status.cached;\n                            })\n                        .timeout(15000)\n                        .zip(Observable.of<EdgeDirection>(direction))\n                        .map(\n                            ([s, d]: [IEdgeStatus, EdgeDirection]): string => {\n                                for (let edge of s.edges) {\n                                    if (edge.data.direction === d) {\n                                        return edge.to;\n                                    }\n                                }\n\n                                return null;\n                            })\n                        .filter(\n                            (key: string): boolean => {\n                                return key != null;\n                            })\n                        .switchMap(\n                            (key: string): Observable<Node> => {\n                                return this._graphService.cacheNode$(key);\n                            });\n                })\n            .subscribe(\n                (node: Node): void => {\n                    this._stateService.appendNodes([node]);\n                },\n                (error: Error): void => {\n                    console.error(error);\n                    this.stop();\n                });\n\n        this._clearSubscription = this._stateService.currentNode$\n            .bufferCount(1, 10)\n            .subscribe(\n                (nodes: Node[]): void => {\n                    this._stateService.clearPriorNodes();\n                });\n\n        this._setPlaying(true);\n\n        this._stopSubscription = Observable\n            .combineLatest(\n                this._stateService.currentNode$,\n                this._direction$)\n            .switchMap(\n                ([node, direction]: [Node, EdgeDirection]): Observable<[EdgeDirection, IEdgeStatus]> => {\n                    const edgeStatus$: Observable<IEdgeStatus> = (\n                        [EdgeDirection.Next, EdgeDirection.Prev].indexOf(direction) > -1 ?\n                            node.sequenceEdges$ :\n                            node.spatialEdges$)\n                        .first(\n                            (status: IEdgeStatus): boolean => {\n                                return status.cached;\n                            })\n                        .timeout(15000)\n                        .catch(\n                            (error: Error): Observable<IEdgeStatus> => {\n                                console.error(error);\n\n                                return Observable.of<IEdgeStatus>({ cached: false, edges: [] });\n                            });\n\n                    return Observable\n                        .combineLatest(\n                            Observable.of(direction),\n                            edgeStatus$);\n                })\n            .map(\n                ([direction, edgeStatus]: [EdgeDirection, IEdgeStatus]): boolean => {\n                    for (let edge of edgeStatus.edges) {\n                        if (edge.data.direction === direction) {\n                            return true;\n                        }\n                    }\n\n                    return false;\n                })\n            .first(\n                (hasEdge: boolean): boolean => {\n                    return !hasEdge;\n                })\n            .subscribe(\n                undefined,\n                undefined,\n                (): void => { this.stop(); });\n\n        if (this._stopSubscription.closed) {\n            this._stopSubscription = null;\n        }\n    }\n\n    public setDirection(direction: EdgeDirection): void {\n        this._directionSubject$.next(direction);\n    }\n\n    public setSpeed(speed: number): void {\n        speed = Math.max(0, Math.min(1, speed));\n        if (speed === this._speed) {\n            return;\n        }\n\n        const stateSpeed: number = this._setSpeed(speed);\n\n        if (this._playing) {\n            this._stateService.setSpeed(stateSpeed);\n        }\n\n        this._speedSubject$.next(this._speed);\n    }\n\n    public stop(): void {\n        if (!this._playing) {\n            return;\n        }\n\n        if (!!this._stopSubscription) {\n            if (!this._stopSubscription.closed) {\n                this._stopSubscription.unsubscribe();\n            }\n\n            this._stopSubscription = null;\n        }\n\n        this._graphModeSubscription.unsubscribe();\n        this._graphModeSubscription = null;\n\n        this._cacheSubscription.unsubscribe();\n        this._cacheSubscription = null;\n\n        this._playingSubscription.unsubscribe();\n        this._playingSubscription = null;\n\n        this._clearSubscription.unsubscribe();\n        this._clearSubscription = null;\n\n        this._stateService.setSpeed(1);\n        this._stateService.cutNodes();\n        this._graphService.setGraphMode(GraphMode.Spatial);\n\n        this._setPlaying(false);\n    }\n\n    private _mapSpeed(speed: number): number {\n        const x: number = 2 * speed - 1;\n\n        return Math.pow(10, x) - 0.2 * x;\n    }\n\n    private _mapNodesAhead(stateSpeed: number): number {\n        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));\n    }\n\n    private _setPlaying(playing: boolean): void {\n        this._playing = playing;\n        this._playingSubject$.next(playing);\n    }\n\n    private _setSpeed(speed: number): number {\n        this._speed = speed;\n        const stateSpeed: number = this._mapSpeed(this._speed);\n        this._nodesAhead = this._mapNodesAhead(stateSpeed);\n\n        return stateSpeed;\n    }\n}\n\nexport default PlayService;\n",
     "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\n\nimport {ILatLon} from \"../API\";\nimport {\n    GeoCoords,\n    ILatLonAlt,\n    Transform,\n    ViewportCoords,\n} from \"../Geo\";\nimport {RenderCamera} from \"../Render\";\nimport {IUnprojection} from \"../Viewer\";\n\nexport class Projection {\n    private _geoCoords: GeoCoords;\n    private _viewportCoords: ViewportCoords;\n\n    constructor(geoCoords?: GeoCoords, viewportCoords?: ViewportCoords) {\n        this._geoCoords = !!geoCoords ? geoCoords : new GeoCoords();\n        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords();\n    }\n\n    public basicToCanvas(\n        basicPoint: number[],\n        container: HTMLElement,\n        render: RenderCamera,\n        transform: Transform): number[] {\n\n        return this._viewportCoords\n            .basicToCanvas(basicPoint[0], basicPoint[1], container, transform, render.perspective);\n    }\n\n    public canvasToBasic(\n        canvasPoint: number[],\n        container: HTMLElement,\n        render: RenderCamera,\n        transform: Transform): number[] {\n\n        let basicPoint: number[] = this._viewportCoords\n            .canvasToBasic(canvasPoint[0], canvasPoint[1], container, transform, render.perspective);\n\n        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {\n            basicPoint = null;\n        }\n\n        return basicPoint;\n    }\n\n    public eventToUnprojection(\n        event: MouseEvent | Touch,\n        container: HTMLElement,\n        render: RenderCamera,\n        reference: ILatLonAlt,\n        transform: Transform): IUnprojection {\n\n        const pixelPoint: number[] = this._viewportCoords.canvasPosition(event, container);\n\n        return this.canvasToUnprojection(pixelPoint, container, render, reference, transform);\n    }\n\n    public canvasToUnprojection(\n        canvasPoint: number[],\n        container: HTMLElement,\n        render: RenderCamera,\n        reference: ILatLonAlt,\n        transform: Transform): IUnprojection {\n\n        const canvasX: number = canvasPoint[0];\n        const canvasY: number = canvasPoint[1];\n\n        const [viewportX, viewportY]: number[] =\n            this._viewportCoords.canvasToViewport(canvasX, canvasY, container);\n\n        const point3d: THREE.Vector3 = new THREE.Vector3(viewportX, viewportY, 1)\n            .unproject(render.perspective);\n\n        let basicPoint: number[] = transform.projectBasic(point3d.toArray());\n        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {\n            basicPoint = null;\n        }\n\n        const direction3d: THREE.Vector3 = point3d.clone().sub(render.camera.position).normalize();\n        const dist: number = -2 / direction3d.z;\n\n        let latLon: ILatLon = null;\n        if (dist > 0 && dist < 100 && !!basicPoint) {\n            const point: THREE.Vector3 = direction3d.clone().multiplyScalar(dist).add(render.camera.position);\n            const latLonArray: number[] = this._geoCoords\n                .enuToGeodetic(\n                    point.x,\n                    point.y,\n                    point.z,\n                    reference.lat,\n                    reference.lon,\n                    reference.alt)\n                .slice(0, 2);\n\n            latLon = { lat: latLonArray[0], lon: latLonArray[1] };\n        }\n\n        const unprojection: IUnprojection = {\n            basicPoint: basicPoint,\n            latLon: latLon,\n            pixelPoint: [canvasX, canvasY],\n        };\n\n        return unprojection;\n    }\n}\n\nexport default Projection;\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\n\nimport {Alignment, ISpriteAtlas} from \"../Viewer\";\n\nclass SpriteAtlas implements ISpriteAtlas {\n    private _image: HTMLImageElement;\n    private _texture: THREE.Texture;\n    private _json: ISprites;\n\n    public set json(value: ISprites) {\n        this._json = value;\n    }\n\n    public set image(value: HTMLImageElement) {\n        this._image = value;\n        this._texture = new THREE.Texture(this._image);\n        this._texture.minFilter = THREE.NearestFilter;\n    }\n\n    public get loaded(): boolean {\n        return !!(this._image && this._json);\n    }\n\n    public getGLSprite(name: string): THREE.Object3D {\n        if (!this.loaded) {\n            throw new Error(\"Sprites cannot be retrieved before the atlas is loaded.\");\n        }\n\n        let definition: ISprite = this._json[name];\n\n        if (!definition) {\n            console.warn(\"Sprite with key\" + name + \"does not exist in sprite definition.\");\n\n            return new THREE.Object3D();\n        }\n\n        let texture: THREE.Texture = this._texture.clone();\n        texture.needsUpdate = true;\n\n        let width: number = this._image.width;\n        let height: number = this._image.height;\n\n\n        texture.offset.x = definition.x / width;\n        texture.offset.y = (height - definition.y - definition.height) / height;\n        texture.repeat.x = definition.width / width;\n        texture.repeat.y = definition.height / height;\n\n        let material: THREE.SpriteMaterial = new THREE.SpriteMaterial({ map: texture });\n\n        return new THREE.Sprite(material);\n    }\n\n    public getDOMSprite(\n        name: string,\n        float?: Alignment): vd.VNode {\n\n        if (!this.loaded) {\n            throw new Error(\"Sprites cannot be retrieved before the atlas is loaded.\");\n        }\n\n        if (float == null) {\n            float = Alignment.Center;\n        }\n\n        let definition: ISprite = this._json[name];\n\n        if (!definition) {\n            console.warn(\"Sprite with key\" + name + \"does not exist in sprite definition.\");\n\n            return vd.h(\"div\", {}, []);\n        }\n\n        let clipTop: number = definition.y;\n        let clipRigth: number = definition.x + definition.width;\n        let clipBottom: number = definition.y + definition.height;\n        let clipLeft: number = definition.x;\n\n        let left: number = -definition.x;\n        let top: number = -definition.y;\n\n        let height: number = this._image.height;\n        let width: number = this._image.width;\n\n        switch (float) {\n            case Alignment.Bottom:\n            case Alignment.Center:\n            case Alignment.Top:\n                left -= definition.width / 2;\n                break;\n            case Alignment.BottomLeft:\n            case Alignment.Left:\n            case Alignment.TopLeft:\n                left -= definition.width;\n                break;\n            case Alignment.BottomRight:\n            case Alignment.Right:\n            case Alignment.BottomRight:\n            default:\n                break;\n        }\n\n        switch (float) {\n            case Alignment.Center:\n            case Alignment.Left:\n            case Alignment.Right:\n                top -= definition.height / 2;\n                break;\n            case Alignment.Top:\n            case Alignment.TopLeft:\n            case Alignment.TopRight:\n                top -= definition.height;\n                break;\n            case Alignment.Bottom:\n            case Alignment.BottomLeft:\n            case Alignment.BottomRight:\n            default:\n                break;\n        }\n\n        let pixelRatioInverse: number = 1 / definition.pixelRatio;\n\n        clipTop *= pixelRatioInverse;\n        clipRigth *= pixelRatioInverse;\n        clipBottom *= pixelRatioInverse;\n        clipLeft *= pixelRatioInverse;\n        left *= pixelRatioInverse;\n        top *= pixelRatioInverse;\n        height *= pixelRatioInverse;\n        width *= pixelRatioInverse;\n\n        let properties: vd.createProperties = {\n            src: this._image.src,\n            style: {\n                clip: `rect(${clipTop}px, ${clipRigth}px, ${clipBottom}px, ${clipLeft}px)`,\n                height: `${height}px`,\n                left: `${left}px`,\n                position: \"absolute\",\n                top: `${top}px`,\n                width: `${width}px`,\n            },\n        };\n\n        return vd.h(\"img\", properties, []);\n    }\n}\n\ninterface ISprite {\n    width: number;\n    height: number;\n    x: number;\n    y: number;\n    pixelRatio: number;\n}\n\ninterface ISprites {\n    [key: string]: ISprite;\n}\n\ninterface ISpriteAtlasOperation {\n    (atlas: SpriteAtlas): SpriteAtlas;\n}\n\nexport class SpriteService {\n    private _retina: boolean;\n\n    private _spriteAtlasOperation$: Subject<ISpriteAtlasOperation>;\n    private _spriteAtlas$: Observable<SpriteAtlas>;\n\n    constructor(sprite?: string) {\n        this._retina = window.devicePixelRatio > 1;\n\n        this._spriteAtlasOperation$ = new Subject<ISpriteAtlasOperation>();\n\n        this._spriteAtlas$ = this._spriteAtlasOperation$\n            .startWith(\n                (atlas: SpriteAtlas): SpriteAtlas => {\n                    return atlas;\n                })\n            .scan(\n                (atlas: SpriteAtlas, operation: ISpriteAtlasOperation): SpriteAtlas => {\n                    return operation(atlas);\n                },\n                new SpriteAtlas())\n            .publishReplay(1)\n            .refCount();\n\n        this._spriteAtlas$.subscribe(() => { /*noop*/ });\n\n        if (sprite == null) {\n            return;\n        }\n\n        let format: string = this._retina ? \"@2x\" : \"\";\n\n        let imageXmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n        imageXmlHTTP.open(\"GET\", sprite + format + \".png\", true);\n        imageXmlHTTP.responseType = \"arraybuffer\";\n        imageXmlHTTP.onload = () => {\n            let image: HTMLImageElement = new Image();\n            image.onload = () => {\n                this._spriteAtlasOperation$.next(\n                    (atlas: SpriteAtlas): SpriteAtlas => {\n                        atlas.image = image;\n\n                        return atlas;\n                    });\n            };\n\n            let blob: Blob = new Blob([imageXmlHTTP.response]);\n            image.src = window.URL.createObjectURL(blob);\n        };\n\n        imageXmlHTTP.onerror = (error: Event) => {\n            console.error(new Error(`Failed to fetch sprite sheet (${sprite}${format}.png)`));\n        };\n\n        imageXmlHTTP.send();\n\n        let jsonXmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n        jsonXmlHTTP.open(\"GET\", sprite + format + \".json\", true);\n        jsonXmlHTTP.responseType = \"text\";\n        jsonXmlHTTP.onload = () => {\n            let json: ISprites = <ISprites>JSON.parse(jsonXmlHTTP.response);\n\n            this._spriteAtlasOperation$.next(\n                    (atlas: SpriteAtlas): SpriteAtlas => {\n                        atlas.json = json;\n\n                        return atlas;\n                    });\n        };\n\n        jsonXmlHTTP.onerror = (error: Event) => {\n            console.error(new Error(`Failed to fetch sheet (${sprite}${format}.json)`));\n        };\n\n        jsonXmlHTTP.send();\n    }\n\n    public get spriteAtlas$(): Observable<ISpriteAtlas> {\n        return this._spriteAtlas$;\n    }\n}\n\nexport default SpriteService;\n",
-    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/timer\";\n\nimport \"rxjs/add/operator/bufferWhen\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/switchMap\";\n\nimport {IPinch} from \"../Viewer\";\n\ninterface IPinchOperation {\n    (pinch: IPinch): IPinch;\n}\n\nexport class TouchService {\n    private _canvasContainer: HTMLElement;\n    private _domContainer: HTMLElement;\n\n    private _activeSubject$: BehaviorSubject<boolean>;\n    private _active$: Observable<boolean>;\n\n    private _touchStart$: Observable<TouchEvent>;\n    private _touchMove$: Observable<TouchEvent>;\n    private _touchEnd$: Observable<TouchEvent>;\n    private _touchCancel$: Observable<TouchEvent>;\n\n    private _singleTouchDrag$: Observable<TouchEvent>;\n    private _singleTouchDragStart$: Observable<TouchEvent>;\n    private _singleTouchDragEnd$: Observable<TouchEvent>;\n    private _singleTouchMove$: Observable<TouchEvent>;\n\n    private _pinchOperation$: Subject<IPinchOperation>;\n    private _pinch$: Observable<IPinch>;\n    private _pinchStart$: Observable<TouchEvent>;\n    private _pinchEnd$: Observable<TouchEvent>;\n    private _pinchChange$: Observable<IPinch>;\n\n    private _doubleTap$: Observable<TouchEvent>;\n\n    constructor(canvasContainer: HTMLElement, domContainer: HTMLElement) {\n        this._canvasContainer = canvasContainer;\n        this._domContainer = domContainer;\n\n        this._activeSubject$ = new BehaviorSubject<boolean>(false);\n\n        this._active$ = this._activeSubject$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        Observable.fromEvent<TouchEvent>(domContainer, \"touchmove\")\n            .subscribe(\n                (event: TouchEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._touchStart$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchstart\");\n        this._touchMove$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchmove\");\n        this._touchEnd$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchend\");\n        this._touchCancel$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchcancel\");\n\n        const tapStart$: Observable<TouchEvent> = this._touchStart$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                })\n            .share();\n\n        this._doubleTap$ = tapStart$\n            .bufferWhen(\n                (): Observable<number | TouchEvent> => {\n                    return tapStart$\n                        .first()\n                        .switchMap(\n                            (event: TouchEvent): Observable<number | TouchEvent> => {\n                                return Observable\n                                    .timer(300)\n                                    .merge(tapStart$)\n                                    .take(1);\n                            });\n                })\n            .filter(\n                (events: TouchEvent[]): boolean => {\n                    return events.length === 2;\n                })\n            .map(\n                (events: TouchEvent[]): TouchEvent => {\n                    return events[events.length - 1];\n                })\n            .share();\n\n        this._doubleTap$\n            .subscribe(\n                (event: TouchEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._singleTouchMove$ = this._touchMove$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                })\n            .share();\n\n        let singleTouchStart$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                });\n\n        let multipleTouchStart$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length >= 1;\n                });\n\n        let touchStop$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 0;\n                });\n\n        this._singleTouchDragStart$ = singleTouchStart$\n            .mergeMap(\n                (e: TouchEvent): Observable<TouchEvent> => {\n                    return this._singleTouchMove$\n                        .takeUntil(\n                            Observable.merge(\n                                touchStop$,\n                                multipleTouchStart$))\n                        .take(1);\n                });\n\n        this._singleTouchDragEnd$ = singleTouchStart$\n            .mergeMap(\n                (e: TouchEvent): Observable<TouchEvent> => {\n                    return Observable\n                        .merge(\n                            touchStop$,\n                            multipleTouchStart$)\n                        .first();\n                });\n\n        this._singleTouchDrag$ = singleTouchStart$\n            .switchMap(\n                (te: TouchEvent): Observable<TouchEvent> => {\n                    return this._singleTouchMove$\n                        .skip(1)\n                        .takeUntil(\n                            Observable\n                                .merge(\n                                    multipleTouchStart$,\n                                    touchStop$));\n                });\n\n        let touchesChanged$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$);\n\n        this._pinchStart$ = touchesChanged$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 2 && te.targetTouches.length === 2;\n                });\n\n        this._pinchEnd$ = touchesChanged$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length !== 2 || te.targetTouches.length !== 2;\n                });\n\n        this._pinchOperation$ = new Subject<IPinchOperation>();\n\n        this._pinch$ = this._pinchOperation$\n            .scan(\n                (pinch: IPinch, operation: IPinchOperation): IPinch => {\n                    return operation(pinch);\n                },\n                {\n                    changeX: 0,\n                    changeY: 0,\n                    clientX: 0,\n                    clientY: 0,\n                    distance: 0,\n                    distanceChange: 0,\n                    distanceX: 0,\n                    distanceY: 0,\n                    originalEvent: null,\n                    pageX: 0,\n                    pageY: 0,\n                    screenX: 0,\n                    screenY: 0,\n                    touch1: null,\n                    touch2: null,\n                });\n\n        this._touchMove$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 2 && te.targetTouches.length === 2;\n                })\n            .map(\n                (te: TouchEvent): IPinchOperation => {\n                    return (previous: IPinch): IPinch => {\n                        let touch1: Touch = te.touches[0];\n                        let touch2: Touch = te.touches[1];\n\n                        let minX: number = Math.min(touch1.clientX, touch2.clientX);\n                        let maxX: number = Math.max(touch1.clientX, touch2.clientX);\n\n                        let minY: number = Math.min(touch1.clientY, touch2.clientY);\n                        let maxY: number = Math.max(touch1.clientY, touch2.clientY);\n\n                        let centerClientX: number = minX + (maxX - minX) / 2;\n                        let centerClientY: number = minY + (maxY - minY) / 2;\n\n                        let centerPageX: number = centerClientX + touch1.pageX - touch1.clientX;\n                        let centerPageY: number = centerClientY + touch1.pageY - touch1.clientY;\n\n                        let centerScreenX: number = centerClientX + touch1.screenX - touch1.clientX;\n                        let centerScreenY: number = centerClientY + touch1.screenY - touch1.clientY;\n\n                        let distanceX: number = Math.abs(touch1.clientX - touch2.clientX);\n                        let distanceY: number = Math.abs(touch1.clientY - touch2.clientY);\n\n                        let distance: number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n\n                        let distanceChange: number = distance - previous.distance;\n\n                        let changeX: number = distanceX - previous.distanceX;\n                        let changeY: number = distanceY - previous.distanceY;\n\n                        let current: IPinch = {\n                            changeX: changeX,\n                            changeY: changeY,\n                            clientX: centerClientX,\n                            clientY: centerClientY,\n                            distance: distance,\n                            distanceChange: distanceChange,\n                            distanceX: distanceX,\n                            distanceY: distanceY,\n                            originalEvent: te,\n                            pageX: centerPageX,\n                            pageY: centerPageY,\n                            screenX: centerScreenX,\n                            screenY: centerScreenY,\n                            touch1: touch1,\n                            touch2: touch2,\n                        };\n\n                        return current;\n                    };\n                })\n            .subscribe(this._pinchOperation$);\n\n        this._pinchChange$ = this._pinchStart$\n            .switchMap(\n                (te: TouchEvent): Observable<IPinch> => {\n                    return this._pinch$\n                        .skip(1)\n                        .takeUntil(this._pinchEnd$);\n                });\n    }\n\n    public get active$(): Observable<boolean> {\n        return this._active$;\n    }\n\n    public get activate$(): Subject<boolean> {\n        return this._activeSubject$;\n    }\n\n    public get doubleTap$(): Observable<TouchEvent> {\n        return this._doubleTap$;\n    }\n\n    public get touchStart$(): Observable<TouchEvent> {\n        return this._touchStart$;\n    }\n\n    public get touchMove$(): Observable<TouchEvent> {\n        return this._touchMove$;\n    }\n\n    public get touchEnd$(): Observable<TouchEvent> {\n        return this._touchEnd$;\n    }\n\n    public get touchCancel$(): Observable<TouchEvent> {\n        return this._touchCancel$;\n    }\n\n    public get singleTouchDragStart$(): Observable<TouchEvent> {\n        return this._singleTouchDragStart$;\n    }\n\n    public get singleTouchDrag$(): Observable<TouchEvent> {\n        return this._singleTouchDrag$;\n    }\n\n    public get singleTouchDragEnd$(): Observable<TouchEvent> {\n        return this._singleTouchDragEnd$;\n    }\n\n    public get pinch$(): Observable<IPinch> {\n        return this._pinchChange$;\n    }\n\n    public get pinchStart$(): Observable<TouchEvent> {\n        return this._pinchStart$;\n    }\n\n    public get pinchEnd$(): Observable<TouchEvent> {\n        return this._pinchEnd$;\n    }\n}\n",
-    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as when from \"when\";\n\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ILatLon} from \"../API\";\nimport {EdgeDirection} from \"../Edge\";\nimport {\n    FilterExpression,\n    Node,\n} from \"../Graph\";\nimport {\n    ComponentController,\n    Container,\n    IViewerOptions,\n    Navigator,\n    Observer,\n} from \"../Viewer\";\nimport {\n    Component,\n    IComponentConfiguration,\n} from \"../Component\";\nimport {\n    EventEmitter,\n    Settings,\n} from \"../Utils\";\nimport {RenderMode} from \"../Render\";\n\n/**\n * @class Viewer\n *\n * @classdesc The Viewer object represents the navigable photo viewer.\n * Create a Viewer by specifying a container, client ID, photo key and\n * other options. The viewer exposes methods and events for programmatic\n * interaction.\n *\n * The viewer works with a few different coordinate systems.\n *\n * Container pixel coordinates\n *\n * Pixel coordinates are coordinates on the viewer container. The origin is\n * in the top left corner of the container. The axes are\n * directed according to the following for a viewer container with a width\n * of 640 pixels and height of 480 pixels.\n *\n * ```\n * (0,0)                          (640, 0)\n *      +------------------------>\n *      |\n *      |\n *      |\n *      v                        +\n * (0, 480)                       (640, 480)\n * ```\n *\n * Basic image coordinates\n *\n * Basic image coordinates represents points in the original image adjusted for\n * orientation. They range from 0 to 1 on both axes. The origin is in the top left\n * corner of the image and the axes are directed\n * according to the following for all image types.\n *\n * ```\n * (0,0)                          (1, 0)\n *      +------------------------>\n *      |\n *      |\n *      |\n *      v                        +\n * (0, 1)                         (1, 1)\n * ```\n *\n * For every camera viewing direction it is possible to convert between these\n * two coordinate systems for the current node. The image can be panned and\n * zoomed independently of the size of the viewer container resulting in\n * different conversion results for different viewing directions.\n */\nexport class Viewer extends EventEmitter {\n    /**\n     * Fired when the viewing direction of the camera changes.\n     * @event\n     * @type {number} bearing - Value indicating the current bearing\n     * measured in degrees clockwise with respect to north.\n     */\n    public static bearingchanged: string = \"bearingchanged\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed and released at\n     * the same point in the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static click: string = \"click\";\n\n    /**\n     * Fired when the right button of the mouse is clicked within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static contextmenu: string = \"contextmenu\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is clicked twice at\n     * the same point in the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static dblclick: string = \"dblclick\";\n\n    /**\n     * Fired when the viewer is loading more data.\n     * @event\n     * @type {boolean} loading - Boolean indicating whether the viewer is loading.\n     */\n    public static loadingchanged: string = \"loadingchanged\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mousedown: string = \"mousedown\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved within the viewer.\n     * @description Will not fire when the mouse is actively used, e.g. for drag pan.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mousemove: string = \"mousemove\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseout: string = \"mouseout\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseover: string = \"mouseover\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is released within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseup: string = \"mouseup\";\n\n    /**\n     * Fired when the viewer motion stops and it is in a fixed\n     * position with a fixed point of view.\n     * @event\n     */\n    public static moveend: string = \"moveend\";\n\n    /**\n     * Fired when the motion from one view to another start,\n     * either by changing the position (e.g. when changing node) or\n     * when changing point of view (e.g. by interaction such as pan and zoom).\n     * @event\n     */\n    public static movestart: string = \"movestart\";\n\n    /**\n     * Fired when the navigable state of the viewer changes.\n     *\n     * @description The navigable state indicates if the viewer supports\n     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`\n     * methods. The viewer will not be in a navigable state if the cover\n     * is activated and the viewer has been supplied a key. When the cover\n     * is deactivated or activated without being supplied a key it will\n     * be navigable.\n     *\n     * @event\n     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.\n     */\n    public static navigablechanged: string = \"navigablechanged\";\n\n    /**\n     * Fired every time the viewer navigates to a new node.\n     * @event\n     * @type {Node} node - Current node.\n     */\n    public static nodechanged: string = \"nodechanged\";\n\n    /**\n     * Fired every time the sequence edges of the current node changes.\n     * @event\n     * @type {IEdgeStatus} status - The edge status object.\n     */\n    public static sequenceedgeschanged: string = \"sequenceedgeschanged\";\n\n    /**\n     * Fired every time the spatial edges of the current node changes.\n     * @event\n     * @type {IEdgeStatus} status - The edge status object.\n     */\n    public static spatialedgeschanged: string = \"spatialedgeschanged\";\n\n    /**\n     * @ignore\n     * Private component controller object which manages component states.\n     */\n    private _componentController: ComponentController;\n\n    /**\n     * @ignore\n     * Private container object which maintains the DOM Element,\n     * renderers and relevant services.\n     */\n    private _container: Container;\n\n    /**\n     * @ignore\n     * Private observer object which observes the viewer state and\n     * fires events on behalf of the viewer.\n     */\n    private _observer: Observer;\n\n    /**\n     * @ignore\n     * Private navigator object which controls navigation throught\n     * the vast seas of Mapillary.\n     */\n    private _navigator: Navigator;\n\n    /**\n     * Create a new viewer instance.\n     *\n     * @param {string} id - Required `id` of a DOM element which will\n     * be transformed into the viewer.\n     * @param {string} clientId - Required `Mapillary API ClientID`. Can\n     * be obtained from https://www.mapillary.com/app/settings/developers.\n     * @param {string} [key] - Optional `photoId` to start from, can be any\n     * Mapillary photo, if null no image is loaded.\n     * @param {IViewerOptions} [options] - Optional configuration object\n     * specifing Viewer's initial setup.\n     * @param {string} [token] - Optional bearer token for API requests of\n     * protected resources.\n     *\n     * @example\n     * ```\n     * var viewer = new Mapillary.Viewer(\"<element-id>\", \"<client-id>\", \"<my key>\");\n     * ```\n     */\n    constructor (id: string, clientId: string, key?: string, options?: IViewerOptions, token?: string) {\n        super();\n\n        options = options != null ? options : {};\n\n        Settings.setOptions(options);\n\n        this._navigator = new Navigator(clientId, token);\n        this._container = new Container(id, this._navigator.stateService, options);\n        this._observer = new Observer(this, this._navigator, this._container);\n        this._componentController = new ComponentController(this._container, this._navigator, this._observer, key, options.component);\n    }\n\n    /**\n     * Return a boolean indicating if the viewer is in a navigable state.\n     *\n     * @description The navigable state indicates if the viewer supports\n     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`\n     * methods. The viewer will not be in a navigable state if the cover\n     * is activated and the viewer has been supplied a key. When the cover\n     * is deactivated or activated without being supplied a key it will\n     * be navigable.\n     *\n     * @returns {boolean} Boolean indicating whether the viewer is navigable.\n     */\n    public get isNavigable(): boolean {\n        return this._componentController.navigable;\n    }\n\n    /**\n     * Activate a component.\n     *\n     * @param {string} name - Name of the component which will become active.\n     *\n     * @example\n     * ```\n     * viewer.activateComponent(\"marker\");\n     * ```\n     */\n    public activateComponent(name: string): void {\n        this._componentController.activate(name);\n    }\n\n    /**\n     * Activate the cover (deactivates all other components).\n     */\n    public activateCover(): void {\n        this._componentController.activateCover();\n    }\n\n    /**\n     * Deactivate a component.\n     *\n     * @param {string} name - Name of component which become inactive.\n     *\n     * @example\n     * ```\n     * viewer.deactivateComponent(\"mouse\");\n     * ```\n     */\n    public deactivateComponent(name: string): void {\n        this._componentController.deactivate(name);\n    }\n\n    /**\n     * Deactivate the cover (activates all components marked as active).\n     */\n    public deactivateCover(): void {\n        this._componentController.deactivateCover();\n    }\n\n    /**\n     * Get the bearing of the current viewer camera.\n     *\n     * @description The bearing depends on how the camera\n     * is currently rotated and does not correspond\n     * to the compass angle of the current node if the view\n     * has been panned.\n     *\n     * Bearing is measured in degrees clockwise with respect to\n     * north.\n     *\n     * @returns {Promise<number>} Promise to the bearing\n     * of the current viewer camera.\n     *\n     * @example\n     * ```\n     * viewer.getBearing().then((b) => { console.log(b); });\n     * ```\n     */\n    public getBearing(): when.Promise<number> {\n        return when.promise<number>(\n            (resolve: (value: number) => void, reject: (reason: Error) => void): void => {\n                this._container.renderService.bearing$\n                    .first()\n                    .subscribe(\n                        (bearing: number): void => {\n                            resolve(bearing);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Get the basic coordinates of the current photo that is\n     * at the center of the viewport.\n     *\n     * @description Basic coordinates are 2D coordinates on the [0, 1] interval\n     * and have the origin point, (0, 0), at the top left corner and the\n     * maximum value, (1, 1), at the bottom right corner of the original\n     * photo.\n     *\n     * @returns {Promise<number[]>} Promise to the basic coordinates\n     * of the current photo at the center for the viewport.\n     *\n     * @example\n     * ```\n     * viewer.getCenter().then((c) => { console.log(c); });\n     * ```\n     */\n    public getCenter(): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._navigator.stateService.getCenter()\n                    .subscribe(\n                        (center: number[]): void => {\n                            resolve(center);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Get a component.\n     *\n     * @param {string} name - Name of component.\n     * @returns {Component} The requested component.\n     *\n     * @example\n     * ```\n     * var mouseComponent = viewer.getComponent(\"mouse\");\n     * ```\n     */\n    public getComponent<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return this._componentController.get<TComponent>(name);\n    }\n\n    /**\n     * Returns the viewer's containing HTML element.\n     *\n     * @returns {HTMLElement} The viewer's container.\n     */\n    public getContainer(): HTMLElement {\n        return this._container.element;\n    }\n\n    /**\n     * Get the photo's current zoom level.\n     *\n     * @returns {Promise<number>} Promise to the viewers's current\n     * zoom level.\n     *\n     * @example\n     * ```\n     * viewer.getZoom().then((z) => { console.log(z); });\n     * ```\n     */\n    public getZoom(): when.Promise<number> {\n         return when.promise<number>(\n            (resolve: (value: number) => void, reject: (reason: Error) => void): void => {\n                this._navigator.stateService.getZoom()\n                    .subscribe(\n                        (zoom: number): void => {\n                            resolve(zoom);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Move close to given latitude and longitude.\n     *\n     * @description Because the method propagates IO errors, these potential errors\n     * need to be handled by the method caller (see example).\n     *\n     * @param {Number} lat - Latitude, in degrees.\n     * @param {Number} lon - Longitude, in degrees.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} If no nodes exist close to provided latitude\n     * longitude.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveCloseTo(0, 0).then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveCloseTo(lat: number, lon: number): when.Promise<Node> {\n        const moveCloseTo$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveCloseTo$(lat, lon) :\n            Observable.throw(new Error(\"Calling moveCloseTo is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveCloseTo$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Navigate in a given direction.\n     *\n     * @description This method has to be called through EdgeDirection enumeration as in the example.\n     *\n     * @param {EdgeDirection} dir - Direction in which which to move.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} If the current node does not have the edge direction\n     * or the edges has not yet been cached.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveDir(Mapillary.EdgeDirection.Next).then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveDir(dir: EdgeDirection): when.Promise<Node> {\n        const moveDir$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveDir$(dir) :\n            Observable.throw(new Error(\"Calling moveDir is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveDir$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Navigate to a given photo key.\n     *\n     * @param {string} key - A valid Mapillary photo key.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveToKey(\"<my key>\").then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveToKey(key: string): when.Promise<Node> {\n        const moveToKey$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveToKey$(key) :\n            Observable.throw(new Error(\"Calling moveToKey is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveToKey$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Project basic image coordinates for the current node to canvas pixel\n     * coordinates.\n     *\n     * @description The basic image coordinates may not always correspond to a\n     * pixel point that lies in the visible area of the viewer container.\n     *\n     * @param {Array<number>} basicPoint - Basic images coordinates to project.\n     * @returns {Promise<ILatLon>} Promise to the pixel coordinates corresponding\n     * to the basic image point.\n     *\n     * @example\n     * ```\n     * viewer.projectFromBasic([0.3, 0.7])\n     *     .then((pixelPoint) => { console.log(pixelPoint); });\n     * ```\n     */\n    public projectFromBasic(basicPoint: number[]): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._observer.projectBasic$(basicPoint)\n                    .subscribe(\n                        (pixelPoint: number[]): void => {\n                            resolve(pixelPoint);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Detect the viewer's new width and height and resize it.\n     *\n     * @description The components will also detect the viewer's\n     * new size and resize their rendered elements if needed.\n     *\n     * @example\n     * ```\n     * viewer.resize();\n     * ```\n     */\n    public resize(): void {\n        this._container.renderService.resize$.next(null);\n        this._componentController.resize();\n    }\n\n    /**\n     * Set a bearer token for authenticated API requests of\n     * protected resources.\n     *\n     * @description When the supplied token is null or undefined,\n     * any previously set bearer token will be cleared and the\n     * viewer will make unauthenticated requests.\n     *\n     * Calling setAuthToken aborts all outstanding move requests.\n     * The promises of those move requests will be rejected and\n     * the rejections need to be caught.\n     *\n     * @param {string} [token] token - Bearer token.\n     * @returns {Promise<void>} Promise that resolves after token\n     * is set.\n     *\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.setAuthToken(\"<my token>\")\n     *     .then(() => { console.log(\"token set\"); });\n     * ```\n     */\n    public setAuthToken(token?: string): when.Promise<void> {\n        const setToken$: Observable<void> = this.isNavigable ?\n            this._navigator.setToken$(token) :\n            Observable.throw(new Error(\"Calling setAuthToken is not supported when viewer is not navigable.\"));\n\n        return when.promise<void>(\n            (resolve: (value: void) => void, reject: (reason: Error) => void): void => {\n                setToken$\n                    .subscribe(\n                        (): void => {\n                            resolve(undefined);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Set the basic coordinates of the current photo to be in the\n     * center of the viewport.\n     *\n     * @description Basic coordinates are 2D coordinates on the [0, 1] interval\n     * and has the origin point, (0, 0), at the top left corner and the\n     * maximum value, (1, 1), at the bottom right corner of the original\n     * photo.\n     *\n     * @param {number[]} The basic coordinates of the current\n     * photo to be at the center for the viewport.\n     *\n     * @example\n     * ```\n     * viewer.setCenter([0.5, 0.5]);\n     * ```\n     */\n    public setCenter(center: number[]): void {\n        this._navigator.stateService.setCenter(center);\n    }\n\n    /**\n     * Set the filter selecting nodes to use when calculating\n     * the spatial edges.\n     *\n     * @description The following filter types are supported:\n     *\n     * Comparison\n     *\n     * `[\"==\", key, value]` equality: `node[key] = value`\n     *\n     * `[\"!=\", key, value]` inequality: `node[key] ≠ value`\n     *\n     * `[\"<\", key, value]` less than: `node[key] < value`\n     *\n     * `[\"<=\", key, value]` less than or equal: `node[key] ≤ value`\n     *\n     * `[\">\", key, value]` greater than: `node[key] > value`\n     *\n     * `[\">=\", key, value]` greater than or equal: `node[key] ≥ value`\n     *\n     * Set membership\n     *\n     * `[\"in\", key, v0, ..., vn]` set inclusion: `node[key] ∈ {v0, ..., vn}`\n     *\n     * `[\"!in\", key, v0, ..., vn]` set exclusion: `node[key] ∉ {v0, ..., vn}`\n     *\n     * Combining\n     *\n     * `[\"all\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\n     *\n     * A key must be a string that identifies a node property name. A value must be\n     * a string, number, or boolean. Strictly-typed comparisons are used. The values\n     * `f0, ..., fn` of the combining filter must be filter expressions.\n     *\n     * Clear the filter by setting it to null or empty array.\n     *\n     * @param {FilterExpression} filter - The filter expression.\n     * @returns {Promise<void>} Promise that resolves after filter is applied.\n     *\n     * @example\n     * ```\n     * viewer.setFilter([\"==\", \"sequenceKey\", \"<my sequence key>\"]);\n     * ```\n     */\n    public setFilter(filter: FilterExpression): when.Promise<void> {\n        return when.promise<void>(\n            (resolve: (value: void) => void, reject: (reason: Error) => void): void => {\n                this._navigator.setFilter$(filter)\n                    .subscribe(\n                        (): void => {\n                            resolve(undefined);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Set the viewer's render mode.\n     *\n     * @param {RenderMode} renderMode - Render mode.\n     *\n     * @example\n     * ```\n     * viewer.setRenderMode(Mapillary.RenderMode.Letterbox);\n     * ```\n     */\n    public setRenderMode(renderMode: RenderMode): void {\n        this._container.renderService.renderMode$.next(renderMode);\n    }\n\n    /**\n     * Set the photo's current zoom level.\n     *\n     * @description Possible zoom level values are on the [0, 3] interval.\n     * Zero means zooming out to fit the photo to the view whereas three\n     * shows the highest level of detail.\n     *\n     * @param {number} The photo's current zoom level.\n     *\n     * @example\n     * ```\n     * viewer.setZoom(2);\n     * ```\n     */\n    public setZoom(zoom: number): void {\n        this._navigator.stateService.setZoom(zoom);\n    }\n\n    /**\n     * Unproject canvas pixel coordinates to an ILatLon representing geographical\n     * coordinates.\n     *\n     * @description The pixel point may not always correspond to geographical\n     * coordinates. In the case of no correspondence the returned value will\n     * be `null`.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.\n     * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.\n     *\n     * @example\n     * ```\n     * viewer.unproject([100, 100])\n     *     .then((latLon) => { console.log(latLon); });\n     * ```\n     */\n    public unproject(pixelPoint: number[]): when.Promise<ILatLon> {\n        return when.promise<ILatLon>(\n            (resolve: (value: ILatLon) => void, reject: (reason: Error) => void): void => {\n                this._observer.unproject$(pixelPoint)\n                    .subscribe(\n                        (latLon: ILatLon): void => {\n                            resolve(latLon);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Unproject canvas pixel coordinates to basic image coordinates for the\n     * current node.\n     *\n     * @description The pixel point may not always correspond to basic image\n     * coordinates. In the case of no correspondence the returned value will\n     * be `null`.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.\n     * @returns {Promise<ILatLon>} Promise to the basic coordinates corresponding\n     * to the pixel point.\n     *\n     * @example\n     * ```\n     * viewer.unprojectToBasic([100, 100])\n     *     .then((basicPoint) => { console.log(basicPoint); });\n     * ```\n     */\n    public unprojectToBasic(pixelPoint: number[]): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._observer.unprojectBasic$(pixelPoint)\n                    .subscribe(\n                        (basicPoint: number[]): void => {\n                            resolve(basicPoint);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n}\n"
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as THREE from \"three\";\nimport * as vd from \"virtual-dom\";\n\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/operator/publishReplay\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/startWith\";\n\nimport {Alignment, ISpriteAtlas} from \"../Viewer\";\n\nclass SpriteAtlas implements ISpriteAtlas {\n    private _image: HTMLImageElement;\n    private _texture: THREE.Texture;\n    private _json: ISprites;\n\n    public set json(value: ISprites) {\n        this._json = value;\n    }\n\n    public set image(value: HTMLImageElement) {\n        this._image = value;\n        this._texture = new THREE.Texture(this._image);\n        this._texture.minFilter = THREE.NearestFilter;\n    }\n\n    public get loaded(): boolean {\n        return !!(this._image && this._json);\n    }\n\n    public getGLSprite(name: string): THREE.Object3D {\n        if (!this.loaded) {\n            throw new Error(\"Sprites cannot be retrieved before the atlas is loaded.\");\n        }\n\n        let definition: ISprite = this._json[name];\n\n        if (!definition) {\n            console.warn(\"Sprite with key\" + name + \"does not exist in sprite definition.\");\n\n            return new THREE.Object3D();\n        }\n\n        let texture: THREE.Texture = this._texture.clone();\n        texture.needsUpdate = true;\n\n        let width: number = this._image.width;\n        let height: number = this._image.height;\n\n        texture.offset.x = definition.x / width;\n        texture.offset.y = (height - definition.y - definition.height) / height;\n        texture.repeat.x = definition.width / width;\n        texture.repeat.y = definition.height / height;\n\n        let material: THREE.SpriteMaterial = new THREE.SpriteMaterial({ map: texture });\n\n        return new THREE.Sprite(material);\n    }\n\n    public getDOMSprite(\n        name: string,\n        float?: Alignment): vd.VNode {\n\n        if (!this.loaded) {\n            throw new Error(\"Sprites cannot be retrieved before the atlas is loaded.\");\n        }\n\n        if (float == null) {\n            float = Alignment.Center;\n        }\n\n        let definition: ISprite = this._json[name];\n\n        if (!definition) {\n            console.warn(\"Sprite with key\" + name + \"does not exist in sprite definition.\");\n\n            return vd.h(\"div\", {}, []);\n        }\n\n        let clipTop: number = definition.y;\n        let clipRigth: number = definition.x + definition.width;\n        let clipBottom: number = definition.y + definition.height;\n        let clipLeft: number = definition.x;\n\n        let left: number = -definition.x;\n        let top: number = -definition.y;\n\n        let height: number = this._image.height;\n        let width: number = this._image.width;\n\n        switch (float) {\n            case Alignment.Bottom:\n            case Alignment.Center:\n            case Alignment.Top:\n                left -= definition.width / 2;\n                break;\n            case Alignment.BottomLeft:\n            case Alignment.Left:\n            case Alignment.TopLeft:\n                left -= definition.width;\n                break;\n            case Alignment.BottomRight:\n            case Alignment.Right:\n            case Alignment.TopRight:\n            default:\n                break;\n        }\n\n        switch (float) {\n            case Alignment.Center:\n            case Alignment.Left:\n            case Alignment.Right:\n                top -= definition.height / 2;\n                break;\n            case Alignment.Top:\n            case Alignment.TopLeft:\n            case Alignment.TopRight:\n                top -= definition.height;\n                break;\n            case Alignment.Bottom:\n            case Alignment.BottomLeft:\n            case Alignment.BottomRight:\n            default:\n                break;\n        }\n\n        let pixelRatioInverse: number = 1 / definition.pixelRatio;\n\n        clipTop *= pixelRatioInverse;\n        clipRigth *= pixelRatioInverse;\n        clipBottom *= pixelRatioInverse;\n        clipLeft *= pixelRatioInverse;\n        left *= pixelRatioInverse;\n        top *= pixelRatioInverse;\n        height *= pixelRatioInverse;\n        width *= pixelRatioInverse;\n\n        let properties: vd.createProperties = {\n            src: this._image.src,\n            style: {\n                clip: `rect(${clipTop}px, ${clipRigth}px, ${clipBottom}px, ${clipLeft}px)`,\n                height: `${height}px`,\n                left: `${left}px`,\n                position: \"absolute\",\n                top: `${top}px`,\n                width: `${width}px`,\n            },\n        };\n\n        return vd.h(\"img\", properties, []);\n    }\n}\n\ninterface ISprite {\n    width: number;\n    height: number;\n    x: number;\n    y: number;\n    pixelRatio: number;\n}\n\ninterface ISprites {\n    [key: string]: ISprite;\n}\n\ninterface ISpriteAtlasOperation {\n    (atlas: SpriteAtlas): SpriteAtlas;\n}\n\nexport class SpriteService {\n    private _retina: boolean;\n\n    private _spriteAtlasOperation$: Subject<ISpriteAtlasOperation>;\n    private _spriteAtlas$: Observable<SpriteAtlas>;\n\n    constructor(sprite?: string) {\n        this._retina = window.devicePixelRatio > 1;\n\n        this._spriteAtlasOperation$ = new Subject<ISpriteAtlasOperation>();\n\n        this._spriteAtlas$ = this._spriteAtlasOperation$\n            .startWith(\n                (atlas: SpriteAtlas): SpriteAtlas => {\n                    return atlas;\n                })\n            .scan(\n                (atlas: SpriteAtlas, operation: ISpriteAtlasOperation): SpriteAtlas => {\n                    return operation(atlas);\n                },\n                new SpriteAtlas())\n            .publishReplay(1)\n            .refCount();\n\n        this._spriteAtlas$.subscribe(() => { /*noop*/ });\n\n        if (sprite == null) {\n            return;\n        }\n\n        let format: string = this._retina ? \"@2x\" : \"\";\n\n        let imageXmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n        imageXmlHTTP.open(\"GET\", sprite + format + \".png\", true);\n        imageXmlHTTP.responseType = \"arraybuffer\";\n        imageXmlHTTP.onload = () => {\n            let image: HTMLImageElement = new Image();\n            image.onload = () => {\n                this._spriteAtlasOperation$.next(\n                    (atlas: SpriteAtlas): SpriteAtlas => {\n                        atlas.image = image;\n\n                        return atlas;\n                    });\n            };\n\n            let blob: Blob = new Blob([imageXmlHTTP.response]);\n            image.src = window.URL.createObjectURL(blob);\n        };\n\n        imageXmlHTTP.onerror = (error: Event) => {\n            console.error(new Error(`Failed to fetch sprite sheet (${sprite}${format}.png)`));\n        };\n\n        imageXmlHTTP.send();\n\n        let jsonXmlHTTP: XMLHttpRequest = new XMLHttpRequest();\n        jsonXmlHTTP.open(\"GET\", sprite + format + \".json\", true);\n        jsonXmlHTTP.responseType = \"text\";\n        jsonXmlHTTP.onload = () => {\n            let json: ISprites = <ISprites>JSON.parse(jsonXmlHTTP.response);\n\n            this._spriteAtlasOperation$.next(\n                    (atlas: SpriteAtlas): SpriteAtlas => {\n                        atlas.json = json;\n\n                        return atlas;\n                    });\n        };\n\n        jsonXmlHTTP.onerror = (error: Event) => {\n            console.error(new Error(`Failed to fetch sheet (${sprite}${format}.json)`));\n        };\n\n        jsonXmlHTTP.send();\n    }\n\n    public get spriteAtlas$(): Observable<ISpriteAtlas> {\n        return this._spriteAtlas$;\n    }\n}\n\nexport default SpriteService;\n",
+    "import {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {Observable} from \"rxjs/Observable\";\nimport {Subject} from \"rxjs/Subject\";\n\nimport \"rxjs/add/observable/timer\";\n\nimport \"rxjs/add/operator/bufferWhen\";\nimport \"rxjs/add/operator/filter\";\nimport \"rxjs/add/operator/map\";\nimport \"rxjs/add/operator/merge\";\nimport \"rxjs/add/operator/scan\";\nimport \"rxjs/add/operator/switchMap\";\n\nimport {IPinch} from \"../Viewer\";\n\ninterface IPinchOperation {\n    (pinch: IPinch): IPinch;\n}\n\nexport class TouchService {\n    private _activeSubject$: BehaviorSubject<boolean>;\n    private _active$: Observable<boolean>;\n\n    private _touchStart$: Observable<TouchEvent>;\n    private _touchMove$: Observable<TouchEvent>;\n    private _touchEnd$: Observable<TouchEvent>;\n    private _touchCancel$: Observable<TouchEvent>;\n\n    private _singleTouchDrag$: Observable<TouchEvent>;\n    private _singleTouchDragStart$: Observable<TouchEvent>;\n    private _singleTouchDragEnd$: Observable<TouchEvent>;\n    private _singleTouchMove$: Observable<TouchEvent>;\n\n    private _pinchOperation$: Subject<IPinchOperation>;\n    private _pinch$: Observable<IPinch>;\n    private _pinchStart$: Observable<TouchEvent>;\n    private _pinchEnd$: Observable<TouchEvent>;\n    private _pinchChange$: Observable<IPinch>;\n\n    private _doubleTap$: Observable<TouchEvent>;\n\n    constructor(canvasContainer: HTMLElement, domContainer: HTMLElement) {\n        this._activeSubject$ = new BehaviorSubject<boolean>(false);\n\n        this._active$ = this._activeSubject$\n            .distinctUntilChanged()\n            .publishReplay(1)\n            .refCount();\n\n        Observable.fromEvent<TouchEvent>(domContainer, \"touchmove\")\n            .subscribe(\n                (event: TouchEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._touchStart$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchstart\");\n        this._touchMove$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchmove\");\n        this._touchEnd$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchend\");\n        this._touchCancel$ = Observable.fromEvent<TouchEvent>(canvasContainer, \"touchcancel\");\n\n        const tapStart$: Observable<TouchEvent> = this._touchStart$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                })\n            .share();\n\n        this._doubleTap$ = tapStart$\n            .bufferWhen(\n                (): Observable<number | TouchEvent> => {\n                    return tapStart$\n                        .first()\n                        .switchMap(\n                            (event: TouchEvent): Observable<number | TouchEvent> => {\n                                return Observable\n                                    .timer(300)\n                                    .merge(tapStart$)\n                                    .take(1);\n                            });\n                })\n            .filter(\n                (events: TouchEvent[]): boolean => {\n                    return events.length === 2;\n                })\n            .map(\n                (events: TouchEvent[]): TouchEvent => {\n                    return events[events.length - 1];\n                })\n            .share();\n\n        this._doubleTap$\n            .subscribe(\n                (event: TouchEvent): void => {\n                    event.preventDefault();\n                });\n\n        this._singleTouchMove$ = this._touchMove$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                })\n            .share();\n\n        let singleTouchStart$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 1 && te.targetTouches.length === 1;\n                });\n\n        let multipleTouchStart$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length >= 1;\n                });\n\n        let touchStop$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchEnd$,\n                this._touchCancel$)\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 0;\n                });\n\n        this._singleTouchDragStart$ = singleTouchStart$\n            .mergeMap(\n                (e: TouchEvent): Observable<TouchEvent> => {\n                    return this._singleTouchMove$\n                        .takeUntil(\n                            Observable.merge(\n                                touchStop$,\n                                multipleTouchStart$))\n                        .take(1);\n                });\n\n        this._singleTouchDragEnd$ = singleTouchStart$\n            .mergeMap(\n                (e: TouchEvent): Observable<TouchEvent> => {\n                    return Observable\n                        .merge(\n                            touchStop$,\n                            multipleTouchStart$)\n                        .first();\n                });\n\n        this._singleTouchDrag$ = singleTouchStart$\n            .switchMap(\n                (te: TouchEvent): Observable<TouchEvent> => {\n                    return this._singleTouchMove$\n                        .skip(1)\n                        .takeUntil(\n                            Observable\n                                .merge(\n                                    multipleTouchStart$,\n                                    touchStop$));\n                });\n\n        let touchesChanged$: Observable<TouchEvent> = Observable\n            .merge<TouchEvent>(\n                this._touchStart$,\n                this._touchEnd$,\n                this._touchCancel$);\n\n        this._pinchStart$ = touchesChanged$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 2 && te.targetTouches.length === 2;\n                });\n\n        this._pinchEnd$ = touchesChanged$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length !== 2 || te.targetTouches.length !== 2;\n                });\n\n        this._pinchOperation$ = new Subject<IPinchOperation>();\n\n        this._pinch$ = this._pinchOperation$\n            .scan(\n                (pinch: IPinch, operation: IPinchOperation): IPinch => {\n                    return operation(pinch);\n                },\n                {\n                    changeX: 0,\n                    changeY: 0,\n                    clientX: 0,\n                    clientY: 0,\n                    distance: 0,\n                    distanceChange: 0,\n                    distanceX: 0,\n                    distanceY: 0,\n                    originalEvent: null,\n                    pageX: 0,\n                    pageY: 0,\n                    screenX: 0,\n                    screenY: 0,\n                    touch1: null,\n                    touch2: null,\n                });\n\n        this._touchMove$\n            .filter(\n                (te: TouchEvent): boolean => {\n                    return te.touches.length === 2 && te.targetTouches.length === 2;\n                })\n            .map(\n                (te: TouchEvent): IPinchOperation => {\n                    return (previous: IPinch): IPinch => {\n                        let touch1: Touch = te.touches[0];\n                        let touch2: Touch = te.touches[1];\n\n                        let minX: number = Math.min(touch1.clientX, touch2.clientX);\n                        let maxX: number = Math.max(touch1.clientX, touch2.clientX);\n\n                        let minY: number = Math.min(touch1.clientY, touch2.clientY);\n                        let maxY: number = Math.max(touch1.clientY, touch2.clientY);\n\n                        let centerClientX: number = minX + (maxX - minX) / 2;\n                        let centerClientY: number = minY + (maxY - minY) / 2;\n\n                        let centerPageX: number = centerClientX + touch1.pageX - touch1.clientX;\n                        let centerPageY: number = centerClientY + touch1.pageY - touch1.clientY;\n\n                        let centerScreenX: number = centerClientX + touch1.screenX - touch1.clientX;\n                        let centerScreenY: number = centerClientY + touch1.screenY - touch1.clientY;\n\n                        let distanceX: number = Math.abs(touch1.clientX - touch2.clientX);\n                        let distanceY: number = Math.abs(touch1.clientY - touch2.clientY);\n\n                        let distance: number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n\n                        let distanceChange: number = distance - previous.distance;\n\n                        let changeX: number = distanceX - previous.distanceX;\n                        let changeY: number = distanceY - previous.distanceY;\n\n                        let current: IPinch = {\n                            changeX: changeX,\n                            changeY: changeY,\n                            clientX: centerClientX,\n                            clientY: centerClientY,\n                            distance: distance,\n                            distanceChange: distanceChange,\n                            distanceX: distanceX,\n                            distanceY: distanceY,\n                            originalEvent: te,\n                            pageX: centerPageX,\n                            pageY: centerPageY,\n                            screenX: centerScreenX,\n                            screenY: centerScreenY,\n                            touch1: touch1,\n                            touch2: touch2,\n                        };\n\n                        return current;\n                    };\n                })\n            .subscribe(this._pinchOperation$);\n\n        this._pinchChange$ = this._pinchStart$\n            .switchMap(\n                (te: TouchEvent): Observable<IPinch> => {\n                    return this._pinch$\n                        .skip(1)\n                        .takeUntil(this._pinchEnd$);\n                });\n    }\n\n    public get active$(): Observable<boolean> {\n        return this._active$;\n    }\n\n    public get activate$(): Subject<boolean> {\n        return this._activeSubject$;\n    }\n\n    public get doubleTap$(): Observable<TouchEvent> {\n        return this._doubleTap$;\n    }\n\n    public get touchStart$(): Observable<TouchEvent> {\n        return this._touchStart$;\n    }\n\n    public get touchMove$(): Observable<TouchEvent> {\n        return this._touchMove$;\n    }\n\n    public get touchEnd$(): Observable<TouchEvent> {\n        return this._touchEnd$;\n    }\n\n    public get touchCancel$(): Observable<TouchEvent> {\n        return this._touchCancel$;\n    }\n\n    public get singleTouchDragStart$(): Observable<TouchEvent> {\n        return this._singleTouchDragStart$;\n    }\n\n    public get singleTouchDrag$(): Observable<TouchEvent> {\n        return this._singleTouchDrag$;\n    }\n\n    public get singleTouchDragEnd$(): Observable<TouchEvent> {\n        return this._singleTouchDragEnd$;\n    }\n\n    public get pinch$(): Observable<IPinch> {\n        return this._pinchChange$;\n    }\n\n    public get pinchStart$(): Observable<TouchEvent> {\n        return this._pinchStart$;\n    }\n\n    public get pinchEnd$(): Observable<TouchEvent> {\n        return this._pinchEnd$;\n    }\n}\n",
+    "/// <reference path=\"../../typings/index.d.ts\" />\n\nimport * as when from \"when\";\n\nimport {Observable} from \"rxjs/Observable\";\n\nimport {ILatLon} from \"../API\";\nimport {EdgeDirection} from \"../Edge\";\nimport {\n    FilterExpression,\n    Node,\n} from \"../Graph\";\nimport {\n    ComponentController,\n    Container,\n    IViewerOptions,\n    Navigator,\n    Observer,\n} from \"../Viewer\";\nimport {\n    Component,\n    IComponentConfiguration,\n} from \"../Component\";\nimport {\n    EventEmitter,\n    Settings,\n} from \"../Utils\";\nimport {RenderMode} from \"../Render\";\n\n/**\n * @class Viewer\n *\n * @classdesc The Viewer object represents the navigable image viewer.\n * Create a Viewer by specifying a container, client ID, image key and\n * other options. The viewer exposes methods and events for programmatic\n * interaction.\n *\n * The viewer works with a few different coordinate systems.\n *\n * Container pixel coordinates\n *\n * Pixel coordinates are coordinates on the viewer container. The origin is\n * in the top left corner of the container. The axes are\n * directed according to the following for a viewer container with a width\n * of 640 pixels and height of 480 pixels.\n *\n * ```\n * (0,0)                          (640, 0)\n *      +------------------------>\n *      |\n *      |\n *      |\n *      v                        +\n * (0, 480)                       (640, 480)\n * ```\n *\n * Basic image coordinates\n *\n * Basic image coordinates represents points in the original image adjusted for\n * orientation. They range from 0 to 1 on both axes. The origin is in the top left\n * corner of the image and the axes are directed\n * according to the following for all image types.\n *\n * ```\n * (0,0)                          (1, 0)\n *      +------------------------>\n *      |\n *      |\n *      |\n *      v                        +\n * (0, 1)                         (1, 1)\n * ```\n *\n * For every camera viewing direction it is possible to convert between these\n * two coordinate systems for the current node. The image can be panned and\n * zoomed independently of the size of the viewer container resulting in\n * different conversion results for different viewing directions.\n */\nexport class Viewer extends EventEmitter {\n    /**\n     * Fired when the viewing direction of the camera changes.\n     * @event\n     * @type {number} bearing - Value indicating the current bearing\n     * measured in degrees clockwise with respect to north.\n     */\n    public static bearingchanged: string = \"bearingchanged\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed and released at\n     * the same point in the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static click: string = \"click\";\n\n    /**\n     * Fired when the right button of the mouse is clicked within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static contextmenu: string = \"contextmenu\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is clicked twice at\n     * the same point in the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static dblclick: string = \"dblclick\";\n\n    /**\n     * Fired when the viewer is loading more data.\n     * @event\n     * @type {boolean} loading - Boolean indicating whether the viewer is loading.\n     */\n    public static loadingchanged: string = \"loadingchanged\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mousedown: string = \"mousedown\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved within the viewer.\n     * @description Will not fire when the mouse is actively used, e.g. for drag pan.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mousemove: string = \"mousemove\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseout: string = \"mouseout\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseover: string = \"mouseover\";\n\n    /**\n     * Fired when a pointing device (usually a mouse) is released within the viewer.\n     * @event\n     * @type {IViewerMouseEvent} event - Viewer mouse event data.\n     */\n    public static mouseup: string = \"mouseup\";\n\n    /**\n     * Fired when the viewer motion stops and it is in a fixed\n     * position with a fixed point of view.\n     * @event\n     */\n    public static moveend: string = \"moveend\";\n\n    /**\n     * Fired when the motion from one view to another start,\n     * either by changing the position (e.g. when changing node) or\n     * when changing point of view (e.g. by interaction such as pan and zoom).\n     * @event\n     */\n    public static movestart: string = \"movestart\";\n\n    /**\n     * Fired when the navigable state of the viewer changes.\n     *\n     * @description The navigable state indicates if the viewer supports\n     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`\n     * methods. The viewer will not be in a navigable state if the cover\n     * is activated and the viewer has been supplied a key. When the cover\n     * is deactivated or activated without being supplied a key it will\n     * be navigable.\n     *\n     * @event\n     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.\n     */\n    public static navigablechanged: string = \"navigablechanged\";\n\n    /**\n     * Fired every time the viewer navigates to a new node.\n     * @event\n     * @type {Node} node - Current node.\n     */\n    public static nodechanged: string = \"nodechanged\";\n\n    /**\n     * Fired every time the sequence edges of the current node changes.\n     * @event\n     * @type {IEdgeStatus} status - The edge status object.\n     */\n    public static sequenceedgeschanged: string = \"sequenceedgeschanged\";\n\n    /**\n     * Fired every time the spatial edges of the current node changes.\n     * @event\n     * @type {IEdgeStatus} status - The edge status object.\n     */\n    public static spatialedgeschanged: string = \"spatialedgeschanged\";\n\n    /**\n     * @ignore\n     * Private component controller object which manages component states.\n     */\n    private _componentController: ComponentController;\n\n    /**\n     * @ignore\n     * Private container object which maintains the DOM Element,\n     * renderers and relevant services.\n     */\n    private _container: Container;\n\n    /**\n     * @ignore\n     * Private observer object which observes the viewer state and\n     * fires events on behalf of the viewer.\n     */\n    private _observer: Observer;\n\n    /**\n     * @ignore\n     * Private navigator object which controls navigation throught\n     * the vast seas of Mapillary.\n     */\n    private _navigator: Navigator;\n\n    /**\n     * Create a new viewer instance.\n     *\n     * @description It is possible to initialize the viewer with or\n     * without a key.\n     *\n     * When initializing with a key the viewer is bound to that key\n     * until the node/image for that key has been successfully loaded.\n     * Also, a cover with the image of the key will be shown.\n     * If the data for that key can not be loaded because the key is\n     * faulty or other errors occur it is not possible to navigate\n     * to another key because the viewer is not navigable. The viewer\n     * becomes navigable when the data for the has been loaded and\n     * the image is shown in the viewer. This wayof initializing\n     * the viewer is mostly for embedding in blog posts and similar\n     * where one wants to show a specific image initially.\n     *\n     * If the viewer is initialized without a key (with null or\n     * undefined) it is not bound to any particular key and it is\n     * possible to move to any key with `viewer.moveToKey(\"<my-image-key>\")`.\n     * If the first move to a key fails it is possible to move to another\n     * key. The viewer will show a black background until a move\n     * succeeds. This way of intitializing is suited for a map-viewer\n     * application when the initial key is not known at implementation\n     * time.\n     *\n     * @param {string} id - Required `id` of a DOM element which will\n     * be transformed into the viewer.\n     * @param {string} clientId - Required `Mapillary API ClientID`. Can\n     * be obtained from https://www.mapillary.com/app/settings/developers.\n     * @param {string} key - Optional `image-key` to start from. The key\n     * can be any Mapillary image. If a key is provided the viewer is\n     * bound to that key until it has been fully loaded. If null is provided\n     * no image is loaded at viewer initialization and the viewer is not\n     * bound to any particular key. Any image can then be navigated to\n     * with e.g. `viewer.moveToKey(\"<my-image-key>\")`.\n     * @param {IViewerOptions} options - Optional configuration object\n     * specifing Viewer's and the components' initial setup.\n     * @param {string} token - Optional bearer token for API requests of\n     * protected resources.\n     *\n     * @example\n     * ```\n     * var viewer = new Mapillary.Viewer(\"<element-id>\", \"<client-id>\", \"<image-key>\");\n     * ```\n     */\n    constructor (id: string, clientId: string, key?: string, options?: IViewerOptions, token?: string) {\n        super();\n\n        options = options != null ? options : {};\n\n        Settings.setOptions(options);\n\n        this._navigator = new Navigator(clientId, token);\n        this._container = new Container(id, this._navigator.stateService, options);\n        this._observer = new Observer(this, this._navigator, this._container);\n        this._componentController = new ComponentController(this._container, this._navigator, this._observer, key, options.component);\n    }\n\n    /**\n     * Return a boolean indicating if the viewer is in a navigable state.\n     *\n     * @description The navigable state indicates if the viewer supports\n     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`\n     * methods. The viewer will not be in a navigable state if the cover\n     * is activated and the viewer has been supplied a key. When the cover\n     * is deactivated or activated without being supplied a key it will\n     * be navigable.\n     *\n     * @returns {boolean} Boolean indicating whether the viewer is navigable.\n     */\n    public get isNavigable(): boolean {\n        return this._componentController.navigable;\n    }\n\n    /**\n     * Activate a component.\n     *\n     * @param {string} name - Name of the component which will become active.\n     *\n     * @example\n     * ```\n     * viewer.activateComponent(\"marker\");\n     * ```\n     */\n    public activateComponent(name: string): void {\n        this._componentController.activate(name);\n    }\n\n    /**\n     * Activate the cover (deactivates all other components).\n     */\n    public activateCover(): void {\n        this._componentController.activateCover();\n    }\n\n    /**\n     * Deactivate a component.\n     *\n     * @param {string} name - Name of component which become inactive.\n     *\n     * @example\n     * ```\n     * viewer.deactivateComponent(\"mouse\");\n     * ```\n     */\n    public deactivateComponent(name: string): void {\n        this._componentController.deactivate(name);\n    }\n\n    /**\n     * Deactivate the cover (activates all components marked as active).\n     */\n    public deactivateCover(): void {\n        this._componentController.deactivateCover();\n    }\n\n    /**\n     * Get the bearing of the current viewer camera.\n     *\n     * @description The bearing depends on how the camera\n     * is currently rotated and does not correspond\n     * to the compass angle of the current node if the view\n     * has been panned.\n     *\n     * Bearing is measured in degrees clockwise with respect to\n     * north.\n     *\n     * @returns {Promise<number>} Promise to the bearing\n     * of the current viewer camera.\n     *\n     * @example\n     * ```\n     * viewer.getBearing().then((b) => { console.log(b); });\n     * ```\n     */\n    public getBearing(): when.Promise<number> {\n        return when.promise<number>(\n            (resolve: (value: number) => void, reject: (reason: Error) => void): void => {\n                this._container.renderService.bearing$\n                    .first()\n                    .subscribe(\n                        (bearing: number): void => {\n                            resolve(bearing);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Get the basic coordinates of the current image that is\n     * at the center of the viewport.\n     *\n     * @description Basic coordinates are 2D coordinates on the [0, 1] interval\n     * and have the origin point, (0, 0), at the top left corner and the\n     * maximum value, (1, 1), at the bottom right corner of the original\n     * image.\n     *\n     * @returns {Promise<number[]>} Promise to the basic coordinates\n     * of the current image at the center for the viewport.\n     *\n     * @example\n     * ```\n     * viewer.getCenter().then((c) => { console.log(c); });\n     * ```\n     */\n    public getCenter(): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._navigator.stateService.getCenter()\n                    .subscribe(\n                        (center: number[]): void => {\n                            resolve(center);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Get a component.\n     *\n     * @param {string} name - Name of component.\n     * @returns {Component} The requested component.\n     *\n     * @example\n     * ```\n     * var mouseComponent = viewer.getComponent(\"mouse\");\n     * ```\n     */\n    public getComponent<TComponent extends Component<IComponentConfiguration>>(name: string): TComponent {\n        return this._componentController.get<TComponent>(name);\n    }\n\n    /**\n     * Returns the viewer's containing HTML element.\n     *\n     * @returns {HTMLElement} The viewer's container.\n     */\n    public getContainer(): HTMLElement {\n        return this._container.element;\n    }\n\n    /**\n     * Get the image's current zoom level.\n     *\n     * @returns {Promise<number>} Promise to the viewers's current\n     * zoom level.\n     *\n     * @example\n     * ```\n     * viewer.getZoom().then((z) => { console.log(z); });\n     * ```\n     */\n    public getZoom(): when.Promise<number> {\n         return when.promise<number>(\n            (resolve: (value: number) => void, reject: (reason: Error) => void): void => {\n                this._navigator.stateService.getZoom()\n                    .subscribe(\n                        (zoom: number): void => {\n                            resolve(zoom);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Move close to given latitude and longitude.\n     *\n     * @description Because the method propagates IO errors, these potential errors\n     * need to be handled by the method caller (see example).\n     *\n     * @param {Number} lat - Latitude, in degrees.\n     * @param {Number} lon - Longitude, in degrees.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} If no nodes exist close to provided latitude\n     * longitude.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveCloseTo(0, 0).then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveCloseTo(lat: number, lon: number): when.Promise<Node> {\n        const moveCloseTo$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveCloseTo$(lat, lon) :\n            Observable.throw(new Error(\"Calling moveCloseTo is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveCloseTo$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Navigate in a given direction.\n     *\n     * @description This method has to be called through EdgeDirection enumeration as in the example.\n     *\n     * @param {EdgeDirection} dir - Direction in which which to move.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} If the current node does not have the edge direction\n     * or the edges has not yet been cached.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveDir(Mapillary.EdgeDirection.Next).then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveDir(dir: EdgeDirection): when.Promise<Node> {\n        const moveDir$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveDir$(dir) :\n            Observable.throw(new Error(\"Calling moveDir is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveDir$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Navigate to a given image key.\n     *\n     * @param {string} key - A valid Mapillary image key.\n     * @returns {Promise<Node>} Promise to the node that was navigated to.\n     * @throws {Error} Propagates any IO errors to the caller.\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.moveToKey(\"<my key>\").then(\n     *     (n) => { console.log(n); },\n     *     (e) => { console.error(e); });\n     * ```\n     */\n    public moveToKey(key: string): when.Promise<Node> {\n        const moveToKey$: Observable<Node> = this.isNavigable ?\n            this._navigator.moveToKey$(key) :\n            Observable.throw(new Error(\"Calling moveToKey is not supported when viewer is not navigable.\"));\n\n        return when.promise<Node>(\n            (resolve: (value: Node) => void, reject: (reason: Error) => void): void => {\n                moveToKey$.subscribe(\n                    (node: Node): void => {\n                        resolve(node);\n                    },\n                    (error: Error): void => {\n                        reject(error);\n                    });\n            });\n    }\n\n    /**\n     * Project basic image coordinates for the current node to canvas pixel\n     * coordinates.\n     *\n     * @description The basic image coordinates may not always correspond to a\n     * pixel point that lies in the visible area of the viewer container.\n     *\n     * @param {Array<number>} basicPoint - Basic images coordinates to project.\n     * @returns {Promise<ILatLon>} Promise to the pixel coordinates corresponding\n     * to the basic image point.\n     *\n     * @example\n     * ```\n     * viewer.projectFromBasic([0.3, 0.7])\n     *     .then((pixelPoint) => { console.log(pixelPoint); });\n     * ```\n     */\n    public projectFromBasic(basicPoint: number[]): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._observer.projectBasic$(basicPoint)\n                    .subscribe(\n                        (pixelPoint: number[]): void => {\n                            resolve(pixelPoint);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Detect the viewer's new width and height and resize it.\n     *\n     * @description The components will also detect the viewer's\n     * new size and resize their rendered elements if needed.\n     *\n     * @example\n     * ```\n     * viewer.resize();\n     * ```\n     */\n    public resize(): void {\n        this._container.renderService.resize$.next(null);\n        this._componentController.resize();\n    }\n\n    /**\n     * Set a bearer token for authenticated API requests of\n     * protected resources.\n     *\n     * @description When the supplied token is null or undefined,\n     * any previously set bearer token will be cleared and the\n     * viewer will make unauthenticated requests.\n     *\n     * Calling setAuthToken aborts all outstanding move requests.\n     * The promises of those move requests will be rejected and\n     * the rejections need to be caught.\n     *\n     * Calling setAuthToken also resets the complete viewer cache\n     * so it should not be called repeatedly.\n     *\n     * @param {string} [token] token - Bearer token.\n     * @returns {Promise<void>} Promise that resolves after token\n     * is set.\n     *\n     * @throws {Error} When viewer is not navigable.\n     *\n     * @example\n     * ```\n     * viewer.setAuthToken(\"<my token>\")\n     *     .then(() => { console.log(\"token set\"); });\n     * ```\n     */\n    public setAuthToken(token?: string): when.Promise<void> {\n        const setToken$: Observable<void> = this.isNavigable ?\n            this._navigator.setToken$(token) :\n            Observable.throw(new Error(\"Calling setAuthToken is not supported when viewer is not navigable.\"));\n\n        return when.promise<void>(\n            (resolve: (value: void) => void, reject: (reason: Error) => void): void => {\n                setToken$\n                    .subscribe(\n                        (): void => {\n                            resolve(undefined);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Set the basic coordinates of the current image to be in the\n     * center of the viewport.\n     *\n     * @description Basic coordinates are 2D coordinates on the [0, 1] interval\n     * and has the origin point, (0, 0), at the top left corner and the\n     * maximum value, (1, 1), at the bottom right corner of the original\n     * image.\n     *\n     * @param {number[]} The basic coordinates of the current\n     * image to be at the center for the viewport.\n     *\n     * @example\n     * ```\n     * viewer.setCenter([0.5, 0.5]);\n     * ```\n     */\n    public setCenter(center: number[]): void {\n        this._navigator.stateService.setCenter(center);\n    }\n\n    /**\n     * Set the filter selecting nodes to use when calculating\n     * the spatial edges.\n     *\n     * @description The following filter types are supported:\n     *\n     * Comparison\n     *\n     * `[\"==\", key, value]` equality: `node[key] = value`\n     *\n     * `[\"!=\", key, value]` inequality: `node[key] ≠ value`\n     *\n     * `[\"<\", key, value]` less than: `node[key] < value`\n     *\n     * `[\"<=\", key, value]` less than or equal: `node[key] ≤ value`\n     *\n     * `[\">\", key, value]` greater than: `node[key] > value`\n     *\n     * `[\">=\", key, value]` greater than or equal: `node[key] ≥ value`\n     *\n     * Set membership\n     *\n     * `[\"in\", key, v0, ..., vn]` set inclusion: `node[key] ∈ {v0, ..., vn}`\n     *\n     * `[\"!in\", key, v0, ..., vn]` set exclusion: `node[key] ∉ {v0, ..., vn}`\n     *\n     * Combining\n     *\n     * `[\"all\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\n     *\n     * A key must be a string that identifies a node property name. A value must be\n     * a string, number, or boolean. Strictly-typed comparisons are used. The values\n     * `f0, ..., fn` of the combining filter must be filter expressions.\n     *\n     * Clear the filter by setting it to null or empty array.\n     *\n     * @param {FilterExpression} filter - The filter expression.\n     * @returns {Promise<void>} Promise that resolves after filter is applied.\n     *\n     * @example\n     * ```\n     * viewer.setFilter([\"==\", \"sequenceKey\", \"<my sequence key>\"]);\n     * ```\n     */\n    public setFilter(filter: FilterExpression): when.Promise<void> {\n        return when.promise<void>(\n            (resolve: (value: void) => void, reject: (reason: Error) => void): void => {\n                this._navigator.setFilter$(filter)\n                    .subscribe(\n                        (): void => {\n                            resolve(undefined);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Set the viewer's render mode.\n     *\n     * @param {RenderMode} renderMode - Render mode.\n     *\n     * @example\n     * ```\n     * viewer.setRenderMode(Mapillary.RenderMode.Letterbox);\n     * ```\n     */\n    public setRenderMode(renderMode: RenderMode): void {\n        this._container.renderService.renderMode$.next(renderMode);\n    }\n\n    /**\n     * Set the image's current zoom level.\n     *\n     * @description Possible zoom level values are on the [0, 3] interval.\n     * Zero means zooming out to fit the image to the view whereas three\n     * shows the highest level of detail.\n     *\n     * @param {number} The image's current zoom level.\n     *\n     * @example\n     * ```\n     * viewer.setZoom(2);\n     * ```\n     */\n    public setZoom(zoom: number): void {\n        this._navigator.stateService.setZoom(zoom);\n    }\n\n    /**\n     * Unproject canvas pixel coordinates to an ILatLon representing geographical\n     * coordinates.\n     *\n     * @description The pixel point may not always correspond to geographical\n     * coordinates. In the case of no correspondence the returned value will\n     * be `null`.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.\n     * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.\n     *\n     * @example\n     * ```\n     * viewer.unproject([100, 100])\n     *     .then((latLon) => { console.log(latLon); });\n     * ```\n     */\n    public unproject(pixelPoint: number[]): when.Promise<ILatLon> {\n        return when.promise<ILatLon>(\n            (resolve: (value: ILatLon) => void, reject: (reason: Error) => void): void => {\n                this._observer.unproject$(pixelPoint)\n                    .subscribe(\n                        (latLon: ILatLon): void => {\n                            resolve(latLon);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n\n    /**\n     * Unproject canvas pixel coordinates to basic image coordinates for the\n     * current node.\n     *\n     * @description The pixel point may not always correspond to basic image\n     * coordinates. In the case of no correspondence the returned value will\n     * be `null`.\n     *\n     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.\n     * @returns {Promise<ILatLon>} Promise to the basic coordinates corresponding\n     * to the pixel point.\n     *\n     * @example\n     * ```\n     * viewer.unprojectToBasic([100, 100])\n     *     .then((basicPoint) => { console.log(basicPoint); });\n     * ```\n     */\n    public unprojectToBasic(pixelPoint: number[]): when.Promise<number[]> {\n        return when.promise<number[]>(\n            (resolve: (value: number[]) => void, reject: (reason: Error) => void): void => {\n                this._observer.unprojectBasic$(pixelPoint)\n                    .subscribe(\n                        (basicPoint: number[]): void => {\n                            resolve(basicPoint);\n                        },\n                        (error: Error): void => {\n                            reject(error);\n                        });\n            });\n    }\n}\n"
   ]
 }
\ No newline at end of file
index cb8e95b12fe9d60b893f70fe90d6b819fc53f319..6e253aaa67ff69563e80698b681fa8155e5960b6 100644 (file)
@@ -1,2 +1,2 @@
-.Attribution{background-color:rgba(0,0,0,.5);color:#fff;font-family:Arial,Helvetica,sans-serif;font-size:11px;position:absolute;bottom:0;right:0;padding:4px 2px;z-index:10}.Attribution a,.Attribution span{color:#fff;text-decoration:none;margin:0 2px 4px}.Attribution span{pointer-events:none}.Attribution a:hover{color:#35af6d}.BackgroundWrapper{background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;color:#fff;text-align:center;padding-top:30%}.Background p,.BackgroundWrapper{font-family:Helvetica,Arial,sans-serif}.Background p{position:relative;padding:5px;font-size:12px;text-shadow:0 0 5px rgba(0,0,0,.75)}.BearingIndicator{bottom:28px;height:66px;pointer-events:none;position:absolute;right:11px;width:56px;z-index:10}.BearingIndicatorBackground{opacity:.5;pointer-events:auto}.BearingIndicatorBackgroundRectangle{background:#242528;height:12px;left:23px;position:absolute;top:0;width:10px}.BearingIndicatorBackgroundCircle{background:#242528;border-radius:50%;bottom:0;height:56px;position:absolute;width:56px}.BearingIndicatorNorth{background:#fff;height:6px;left:27px;position:absolute;top:4px;width:2px}.Cover{background-color:rgba(0,0,0,.5);height:100%;width:100%;z-index:100;overflow:hidden}.Cover,.CoverBackground{bottom:0;left:0;right:0;top:0;position:absolute}.CoverBackground{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;background-position:50%;background-size:cover;margin-left:-3px;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:background-image .2s ease-in-out,-webkit-transform 5s ease-out;transition:background-image .2s ease-in-out,-webkit-transform 5s ease-out;transition:transform 5s ease-out,background-image .2s ease-in-out;transition:transform 5s ease-out,background-image .2s ease-in-out,-webkit-transform 5s ease-out;z-index:-10;margin-right:-3px}.Cover:hover .CoverBackground{-webkit-transform:scale(1.1);transform:scale(1.1)}.Cover.CoverLoading .CoverBackground{-webkit-transform:scale(1);transform:scale(1);-webkit-transition:-webkit-transform .4s ease-out;transition:-webkit-transform .4s ease-out;transition:transform .4s ease-out;transition:transform .4s ease-out,-webkit-transform .4s ease-out}.CoverBackgroundGradient{background:-webkit-gradient(linear,left top,left bottom,from(transparent),to(#000));background:linear-gradient(-180deg,transparent,#000);bottom:0;height:110px;left:0;pointer-events:none;right:0;z-index:1}.CoverBackgroundGradient,.CoverLogo{position:absolute;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.CoverLogo{background-size:cover;background:url(cover-logo.svg);bottom:30px;height:32px;left:30px;width:128px;z-index:300}@media screen and (max-width:560px){.CoverLogo{display:none}}.Cover.CoverDone>.CoverBackground{bottom:0;left:0;right:0;top:0;z-index:100}.CoverDone{visibility:hidden;opacity:0}.CoverButton{background-color:transparent;border-radius:999px;border:1px solid #fff;bottom:30px;color:#fff;font-size:14px;font-weight:300;height:34px;left:50%;letter-spacing:1px;margin-left:-70px;padding:5px 30px 7px;position:absolute;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:140px}.CoverButton:hover{background-color:#fff;color:#5d6671;cursor:pointer}.CoverButton:focus{outline:0}.CoverButtonIcon{background-size:contain;background:url(pano.svg);display:inline-block;height:60px;width:60px}.Spinner{-webkit-animation:a 3s linear infinite;animation:a 3s linear infinite;background-image:url(spinner.svg);background-repeat:no-repeat;background-size:100%;height:32px;left:50%;margin-left:-16px;margin-top:-16px;position:absolute;top:50%;width:32px}@-webkit-keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.Cover.CoverLoading .CoverBackgroundGradient,.Cover.CoverLoading .CoverButton,.Cover.CoverLoading .CoverLogo{opacity:0}.Debug{position:fixed;top:0;right:0;bottom:0;width:30em;font-size:12px;padding:1em;font-family:Input,Menlo,monospace}.Debug,.DebugButton{background-color:lime;z-index:50}.DebugButton{color:#fff;border:1px solid #fff;border-radius:2px;cursor:pointer;cursor:hand}.DebugButtonFixed{position:absolute;bottom:2px;left:2px}.DirectionsPerspective{display:block;position:absolute;pointer-events:none;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;z-index:10}.DirectionsCircle,.DirectionsCircleDisabled,.DirectionsCircleHighlight,.DirectionsCircleSequence,.DirectionsCircleSequenceHighlight{position:absolute;border-radius:50%}.DirectionsCircle,.DirectionsCircleHighlight,.DirectionsCircleSequence,.DirectionsCircleSequenceHighlight{pointer-events:auto}.DirectionsCircle:hover,.DirectionsCircleHighlight:hover,.DirectionsCircleSequence:hover,.DirectionsCircleSequenceHighlight:hover{cursor:pointer;cursor:hand}.DirectionsCircle,.DirectionsCircleSequence{background:transparent}.DirectionsCircleDisabled{background:transparent;z-index:-1}.DirectionsCircleHighlight,.DirectionsCircleSequenceHighlight{background:rgba(0,0,0,.4)}.DirectionsArrowDisabled,.DirectionsArrowPano,.DirectionsArrowStep{position:absolute;top:44%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:75%;height:44.0775%;pointer-events:none}.DirectionsArrowDisabled,.DirectionsArrowStep{background:url(pointer-white.svg);background-repeat:no-repeat}.DirectionsArrowDisabled{opacity:.2;z-index:-1}.DirectionsArrowPano{background:url(pointer-wheat.svg);background-repeat:no-repeat}.TurnCircle,.TurnCircleHighlight,.TurnCircleSequence,.TurnCircleSequenceHighlight{position:absolute;border-radius:50%;pointer-events:auto}.TurnCircle,.TurnCircleSequence{background:transparent}.TurnCircleHighlight,.TurnCircleSequenceHighlight{background:rgba(0,0,0,.4)}.TurnCircle:hover,.TurnCircleHighlight:hover,.TurnCircleSequence:hover,.TurnCircleSequenceHighlight:hover{cursor:pointer;cursor:hand}.TurnAround,.TurnLeft,.TurnRight{position:absolute;top:50%;pointer-events:none;-webkit-filter:drop-shadow(0 2px 1px rgba(0,0,0,.8));filter:drop-shadow(0 2px 1px rgba(0,0,0,.8))}.TurnLeft,.TurnRight{width:58.794%;height:70%}.TurnAround{left:50%;width:75%;height:63.2475%}.TurnLeft{left:45%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.TurnLeft,.TurnRight{background:url(turn.svg);background-repeat:no-repeat}.TurnRight{left:55%;-webkit-transform:translate(-50%,-50%) scaleX(-1);transform:translate(-50%,-50%) scaleX(-1)}.TurnAround{background:url(turn-around.svg);background-repeat:no-repeat;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}@media (hover:hover){.DirectionsCircle:hover,.DirectionsCircleSequence:hover,.TurnCircle:hover,.TurnCircleSequence:hover{background:rgba(0,0,0,.4)}}.Loading{width:100%;height:2px;z-index:20;position:absolute;top:0}.LoadingBar{height:4px;position:relative;background-color:rgba(53,175,109,.8);-webkit-transition:opacity .1s;transition:opacity .1s}.NavigationSequence,.NavigationSpatial{position:absolute;pointer-events:none;z-index:10}.NavigationSequence{top:12px;left:50%;margin-left:-40px}.NavigationSpatial{bottom:18px;left:50%;margin-left:-100px}.NavigationSpatialBottom{margin-left:40px}.Direction{width:36px;height:36px;background-size:contain;background-repeat:no-repeat;pointer-events:auto;margin:0 2px;cursor:pointer;display:inline-block;-webkit-filter:drop-shadow(0 2px 0 #000);filter:drop-shadow(0 2px 0 rgba(0,0,0,1))}.DirectionLeft,.DirectionPrev{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionNext,.DirectionRight{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgOTAsOTApIj48ZyBpZD0iYXJyb3ctdXAiIGZpbGw9IiNGRkZGRkYiPjxwYXRoIGQ9Ik04OC44ODQzODE3LDQ1LjczNzg4MDYgQzg4LjI5OTg4NTMsNDUuOTQ5NzkxNiA4Ny43NTE1NjkyLDQ2LjI4OTkyOTkgODcuMjgzMDg1Myw0Ni43NTg0MTM4IEwzMS4zNjMzOTQ3LDEwMi42NzgxMDQgQzI5LjY0NjA2MTQsMTA0LjM5NTQzOCAyOS42NTE4MzYzLDEwNy4xNzA0OTggMzEuMzY3MDAzMSwxMDguODg1NjY0IEw0MC42ODY3NDUzLDExOC4yMDU0MDcgQzQyLjQwMDM5NjcsMTE5LjkxOTA1OCA0NS4xODExMzEzLDExOS45MjIxODkgNDYuODk0MzA1MiwxMTguMjA5MDE1IEw5MC44MDA5Mjc2LDc0LjMwMjM5MjYgTDEzNC40NTA1NSwxMTcuOTUyMDE1IEMxMzYuMTY3ODgzLDExOS42NjkzNDkgMTM4Ljk0Mjk0MywxMTkuNjYzNTc0IDE0MC42NTgxMSwxMTcuOTQ4NDA3IEwxNDkuOTc3ODUyLDEwOC42Mjg2NjUgQzE1MS42OTE1MDQsMTA2LjkxNTAxMyAxNTEuNjk0NjM1LDEwNC4xMzQyNzkgMTQ5Ljk4MTQ2MSwxMDIuNDIxMTA1IEw5NC4wNjE3NzAxLDQ2LjUwMTQxNDEgQzkyLjY1NzMxMDksNDUuMDk2OTU0OSA5MC41NDU0MjMxLDQ0Ljg0NDk0NDUgODguODg0MzgxNyw0NS43Mzc4ODA2IEw4OC44ODQzODE3LDQ1LjczNzg4MDYgWiIgaWQ9IkFycm93IiA+PC9wYXRoPjxwYXRoIGQ9Ik05MCwxNzAuMTM4ODEyIEMxMzQuMjU5NDQ0LDE3MC4xMzg4MTIgMTcwLjEzODgxMiwxMzQuMjU5NDQ0IDE3MC4xMzg4MTIsOTAgQzE3MC4xMzg4MTIsNDUuNzQwNTU2MiAxMzQuMjU5NDQ0LDkuODYxMTg3ODUgOTAsOS44NjExODc4NSBDNDUuNzQwNTU2Miw5Ljg2MTE4Nzg1IDkuODYxMTg3ODUsNDUuNzQwNTU2MiA5Ljg2MTE4Nzg1LDkwIEM5Ljg2MTE4Nzg1LDEzNC4yNTk0NDQgNDUuNzQwNTU2MiwxNzAuMTM4ODEyIDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgWiBNMCw5MCBDMCw0MC4yOTQzNzI1IDQwLjI5NDM3MjUsMCA5MCwwIEMxMzkuNzA1NjI3LDAgMTgwLDQwLjI5NDM3MjUgMTgwLDkwIEMxODAsMTM5LjcwNTYyNyAxMzkuNzA1NjI3LDE4MCA5MCwxODAgQzQwLjI5NDM3MjUsMTgwIDAsMTM5LjcwNTYyNyAwLDkwIFoiIGlkPSJDaXJjbGUiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPg==")}.DirectionForward{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoMCA5MCw5MCkiPjxnIGlkPSJhcnJvdy11cCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBDODguMjk5ODg1Myw0NS45NDk3OTE2IDg3Ljc1MTU2OTIsNDYuMjg5OTI5OSA4Ny4yODMwODUzLDQ2Ljc1ODQxMzggTDMxLjM2MzM5NDcsMTAyLjY3ODEwNCBDMjkuNjQ2MDYxNCwxMDQuMzk1NDM4IDI5LjY1MTgzNjMsMTA3LjE3MDQ5OCAzMS4zNjcwMDMxLDEwOC44ODU2NjQgTDQwLjY4Njc0NTMsMTE4LjIwNTQwNyBDNDIuNDAwMzk2NywxMTkuOTE5MDU4IDQ1LjE4MTEzMTMsMTE5LjkyMjE4OSA0Ni44OTQzMDUyLDExOC4yMDkwMTUgTDkwLjgwMDkyNzYsNzQuMzAyMzkyNiBMMTM0LjQ1MDU1LDExNy45NTIwMTUgQzEzNi4xNjc4ODMsMTE5LjY2OTM0OSAxMzguOTQyOTQzLDExOS42NjM1NzQgMTQwLjY1ODExLDExNy45NDg0MDcgTDE0OS45Nzc4NTIsMTA4LjYyODY2NSBDMTUxLjY5MTUwNCwxMDYuOTE1MDEzIDE1MS42OTQ2MzUsMTA0LjEzNDI3OSAxNDkuOTgxNDYxLDEwMi40MjExMDUgTDk0LjA2MTc3MDEsNDYuNTAxNDE0MSBDOTIuNjU3MzEwOSw0NS4wOTY5NTQ5IDkwLjU0NTQyMzEsNDQuODQ0OTQ0NSA4OC44ODQzODE3LDQ1LjczNzg4MDYgTDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBaIiBpZD0iQXJyb3ciID48L3BhdGg+PHBhdGggZD0iTTkwLDE3MC4xMzg4MTIgQzEzNC4yNTk0NDQsMTcwLjEzODgxMiAxNzAuMTM4ODEyLDEzNC4yNTk0NDQgMTcwLjEzODgxMiw5MCBDMTcwLjEzODgxMiw0NS43NDA1NTYyIDEzNC4yNTk0NDQsOS44NjExODc4NSA5MCw5Ljg2MTE4Nzg1IEM0NS43NDA1NTYyLDkuODYxMTg3ODUgOS44NjExODc4NSw0NS43NDA1NTYyIDkuODYxMTg3ODUsOTAgQzkuODYxMTg3ODUsMTM0LjI1OTQ0NCA0NS43NDA1NTYyLDE3MC4xMzg4MTIgOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBaIE0wLDkwIEMwLDQwLjI5NDM3MjUgNDAuMjk0MzcyNSwwIDkwLDAgQzEzOS43MDU2MjcsMCAxODAsNDAuMjk0MzcyNSAxODAsOTAgQzE4MCwxMzkuNzA1NjI3IDEzOS43MDU2MjcsMTgwIDkwLDE4MCBDNDAuMjk0MzcyNSwxODAgMCwxMzkuNzA1NjI3IDAsOTAgWiIgaWQ9IkNpcmNsZSI+PC9wYXRoPjwvZz48L2c+PC9zdmc+")}.DirectionBackward{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoMTgwIDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionTurnleft{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionTurnright{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgOTAsOTApIj48ZyBpZD0iYXJyb3ctdXAiIGZpbGw9IiNGRkZGRkYiPjxwYXRoIGQ9Ik04OC44ODQzODE3LDQ1LjczNzg4MDYgQzg4LjI5OTg4NTMsNDUuOTQ5NzkxNiA4Ny43NTE1NjkyLDQ2LjI4OTkyOTkgODcuMjgzMDg1Myw0Ni43NTg0MTM4IEwzMS4zNjMzOTQ3LDEwMi42NzgxMDQgQzI5LjY0NjA2MTQsMTA0LjM5NTQzOCAyOS42NTE4MzYzLDEwNy4xNzA0OTggMzEuMzY3MDAzMSwxMDguODg1NjY0IEw0MC42ODY3NDUzLDExOC4yMDU0MDcgQzQyLjQwMDM5NjcsMTE5LjkxOTA1OCA0NS4xODExMzEzLDExOS45MjIxODkgNDYuODk0MzA1MiwxMTguMjA5MDE1IEw5MC44MDA5Mjc2LDc0LjMwMjM5MjYgTDEzNC40NTA1NSwxMTcuOTUyMDE1IEMxMzYuMTY3ODgzLDExOS42NjkzNDkgMTM4Ljk0Mjk0MywxMTkuNjYzNTc0IDE0MC42NTgxMSwxMTcuOTQ4NDA3IEwxNDkuOTc3ODUyLDEwOC42Mjg2NjUgQzE1MS42OTE1MDQsMTA2LjkxNTAxMyAxNTEuNjk0NjM1LDEwNC4xMzQyNzkgMTQ5Ljk4MTQ2MSwxMDIuNDIxMTA1IEw5NC4wNjE3NzAxLDQ2LjUwMTQxNDEgQzkyLjY1NzMxMDksNDUuMDk2OTU0OSA5MC41NDU0MjMxLDQ0Ljg0NDk0NDUgODguODg0MzgxNyw0NS43Mzc4ODA2IEw4OC44ODQzODE3LDQ1LjczNzg4MDYgWiIgaWQ9IkFycm93IiA+PC9wYXRoPjxwYXRoIGQ9Ik05MCwxNzAuMTM4ODEyIEMxMzQuMjU5NDQ0LDE3MC4xMzg4MTIgMTcwLjEzODgxMiwxMzQuMjU5NDQ0IDE3MC4xMzg4MTIsOTAgQzE3MC4xMzg4MTIsNDUuNzQwNTU2MiAxMzQuMjU5NDQ0LDkuODYxMTg3ODUgOTAsOS44NjExODc4NSBDNDUuNzQwNTU2Miw5Ljg2MTE4Nzg1IDkuODYxMTg3ODUsNDUuNzQwNTU2MiA5Ljg2MTE4Nzg1LDkwIEM5Ljg2MTE4Nzg1LDEzNC4yNTk0NDQgNDUuNzQwNTU2MiwxNzAuMTM4ODEyIDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgWiBNMCw5MCBDMCw0MC4yOTQzNzI1IDQwLjI5NDM3MjUsMCA5MCwwIEMxMzkuNzA1NjI3LDAgMTgwLDQwLjI5NDM3MjUgMTgwLDkwIEMxODAsMTM5LjcwNTYyNyAxMzkuNzA1NjI3LDE4MCA5MCwxODAgQzQwLjI5NDM3MjUsMTgwIDAsMTM5LjcwNTYyNyAwLDkwIFoiIGlkPSJDaXJjbGUiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPg==")}.DirectionTurnaround{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEzNSA5MCw5MCkiPjxnIGlkPSJhcnJvdy11cCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBDODguMjk5ODg1Myw0NS45NDk3OTE2IDg3Ljc1MTU2OTIsNDYuMjg5OTI5OSA4Ny4yODMwODUzLDQ2Ljc1ODQxMzggTDMxLjM2MzM5NDcsMTAyLjY3ODEwNCBDMjkuNjQ2MDYxNCwxMDQuMzk1NDM4IDI5LjY1MTgzNjMsMTA3LjE3MDQ5OCAzMS4zNjcwMDMxLDEwOC44ODU2NjQgTDQwLjY4Njc0NTMsMTE4LjIwNTQwNyBDNDIuNDAwMzk2NywxMTkuOTE5MDU4IDQ1LjE4MTEzMTMsMTE5LjkyMjE4OSA0Ni44OTQzMDUyLDExOC4yMDkwMTUgTDkwLjgwMDkyNzYsNzQuMzAyMzkyNiBMMTM0LjQ1MDU1LDExNy45NTIwMTUgQzEzNi4xNjc4ODMsMTE5LjY2OTM0OSAxMzguOTQyOTQzLDExOS42NjM1NzQgMTQwLjY1ODExLDExNy45NDg0MDcgTDE0OS45Nzc4NTIsMTA4LjYyODY2NSBDMTUxLjY5MTUwNCwxMDYuOTE1MDEzIDE1MS42OTQ2MzUsMTA0LjEzNDI3OSAxNDkuOTgxNDYxLDEwMi40MjExMDUgTDk0LjA2MTc3MDEsNDYuNTAxNDE0MSBDOTIuNjU3MzEwOSw0NS4wOTY5NTQ5IDkwLjU0NTQyMzEsNDQuODQ0OTQ0NSA4OC44ODQzODE3LDQ1LjczNzg4MDYgTDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBaIiBpZD0iQXJyb3ciID48L3BhdGg+PHBhdGggZD0iTTkwLDE3MC4xMzg4MTIgQzEzNC4yNTk0NDQsMTcwLjEzODgxMiAxNzAuMTM4ODEyLDEzNC4yNTk0NDQgMTcwLjEzODgxMiw5MCBDMTcwLjEzODgxMiw0NS43NDA1NTYyIDEzNC4yNTk0NDQsOS44NjExODc4NSA5MCw5Ljg2MTE4Nzg1IEM0NS43NDA1NTYyLDkuODYxMTg3ODUgOS44NjExODc4NSw0NS43NDA1NTYyIDkuODYxMTg3ODUsOTAgQzkuODYxMTg3ODUsMTM0LjI1OTQ0NCA0NS43NDA1NTYyLDE3MC4xMzg4MTIgOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBaIE0wLDkwIEMwLDQwLjI5NDM3MjUgNDAuMjk0MzcyNSwwIDkwLDAgQzEzOS43MDU2MjcsMCAxODAsNDAuMjk0MzcyNSAxODAsOTAgQzE4MCwxMzkuNzA1NjI3IDEzOS43MDU2MjcsMTgwIDkwLDE4MCBDNDAuMjk0MzcyNSwxODAgMCwxMzkuNzA1NjI3IDAsOTAgWiIgaWQ9IkNpcmNsZSI+PC9wYXRoPjwvZz48L2c+PC9zdmc+")}.mapillaryjs-popup{position:absolute;left:0;top:0;pointer-events:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mapillaryjs-popup-content,.mapillaryjs-popup-content-clean{position:relative}.mapillaryjs-popup-capture-pointer{pointer-events:auto}.mapillaryjs-popup-content{padding:5px 10px;background:#fff;border:1px solid #000;border-radius:2px}.mapillaryjs-popup-float-bottom,.mapillaryjs-popup-float-bottom-left,.mapillaryjs-popup-float-bottom-right{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.mapillaryjs-popup-float-top,.mapillaryjs-popup-float-top-left,.mapillaryjs-popup-float-top-right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.mapillaryjs-popup-float-left{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.mapillaryjs-popup-float-right{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mapillaryjs-popup-tip,.mapillaryjs-popup-tip-inner{position:relative;z-index:1;width:0;height:0;border:7px solid transparent}.mapillaryjs-popup-float-top .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-top-color:#000;border-bottom:none}.mapillaryjs-popup-float-top .mapillaryjs-popup-tip-inner{position:relative;top:-8px;left:-7px;border-top-color:#fff;border-bottom:none}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-tip{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;border-top-color:#000;border-bottom:none;border-left:none}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-tip-inner{position:relative;top:-9px;left:1px;border-top-color:#fff;border-bottom:none;border-left:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-tip{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;border-top-color:#000;border-bottom:none;border-right:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-tip-inner{position:relative;top:-9px;left:-8px;border-top-color:#fff;border-bottom:none;border-right:none}.mapillaryjs-popup-float-bottom .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-top:none;border-bottom-color:#000}.mapillaryjs-popup-float-bottom .mapillaryjs-popup-tip-inner{position:relative;bottom:-1px;left:-7px;border-top:none;border-bottom-color:#fff}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-tip{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;border-bottom-color:#000;border-top:none;border-left:none}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-tip-inner{position:relative;bottom:-2px;left:1px;border-bottom-color:#fff;border-top:none;border-left:none}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-tip{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;border-bottom-color:#000;border-top:none;border-right:none}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-tip-inner{position:relative;bottom:-2px;left:-8px;border-bottom-color:#fff;border-top:none;border-right:none}.mapillaryjs-popup-float-left .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-left-color:#000;border-right:none}.mapillaryjs-popup-float-left .mapillaryjs-popup-tip-inner{position:relative;top:-7px;left:-8px;border-left-color:#fff;border-right:none}.mapillaryjs-popup-float-right .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-right-color:#000;border-left:none}.mapillaryjs-popup-float-right .mapillaryjs-popup-tip-inner{position:relative;top:-7px;left:1px;border-right-color:#fff;border-left:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-content{border-bottom-right-radius:0}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-content{border-bottom-left-radius:0}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-content{border-top-right-radius:0}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-content{border-top-left-radius:0}.RouteFrame{background-color:rgba(0,0,0,.5);outline:1px solid hsla(0,0%,100%,.5);width:80%;height:40px;text-align:center;color:#fff;margin:0 auto;position:absolute;z-index:20;bottom:30%;left:10%}.RouteFrame p{margin:0;padding:10px;font-family:Helvetica,Arial,sans-serif;font-size:14px;text-shadow:0 0 5px rgba(0,0,0,.75)}.SequenceContainer{position:absolute;left:50%;top:14px;-webkit-transform:translate(-50%);transform:translate(-50%);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:10}.SequencePlay,.SequencePlayDisabled,.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepNextHighlight,.SequenceStepPrev,.SequenceStepPrevDisabled,.SequenceStepPrevHighlight{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.SequencePlay,.SequencePlayDisabled,.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepPrev,.SequenceStepPrevDisabled{background:rgba(36,37,40,.3)}.SequenceStepNextHighlight,.SequenceStepPrevHighlight{background:rgba(36,37,40,.6)}.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepNextHighlight{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.SequenceStepPrev,.SequenceStepPrevDisabled,.SequenceStepPrevHighlight{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.SequencePlay,.SequencePlayDisabled{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.SequencePlay:hover,.SequenceStepNext:hover,.SequenceStepNextHighlight:hover,.SequenceStepPrev:hover,.SequenceStepPrevHighlight:hover{cursor:pointer;cursor:hand}.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepNextHighlight{border-top-right-radius:100px;border-bottom-right-radius:100px}.SequenceStepPrev,.SequenceStepPrevDisabled,.SequenceStepPrevHighlight{border-top-left-radius:100px;border-bottom-left-radius:100px}.Play.SequenceComponentIcon,.PlayDisabled.SequenceComponentIcon{background-image:url(stepper-play.svg)}.Stop.SequenceComponentIcon,.StopDisabled.SequenceComponentIcon{background-image:url(stepper-stop.svg)}.SequenceStepPrev .SequenceComponentIcon,.SequenceStepPrevDisabled .SequenceComponentIcon,.SequenceStepPrevHighlight .SequenceComponentIcon{background-image:url(stepper-left.svg)}.SequenceStepNext .SequenceComponentIcon,.SequenceStepNextDisabled .SequenceComponentIcon,.SequenceStepNextHighlight .SequenceComponentIcon{background-image:url(stepper-right.svg)}.PlayDisabled.SequenceComponentIcon,.SequenceStepNextDisabled .SequenceComponentIcon,.SequenceStepPrevDisabled .SequenceComponentIcon,.StopDisabled.SequenceComponentIcon{opacity:.35}.SequenceComponentIcon{background-size:contain;background-repeat:no-repeat;width:50%;padding-bottom:50%}@media (hover:hover){.SequencePlay:hover,.SequenceStepNext:hover,.SequenceStepPrev:hover{background:rgba(36,37,40,.6)}}.SliderWrapper{text-align:center;position:absolute;bottom:40px;left:0;pointer-events:none;right:0;z-index:20}.SliderControl{max-width:60%;padding:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:100%;margin:0 auto;marginTop:10px;cursor:pointer;color:inherit;background-color:hsla(0,0%,100%,.2);background-clip:"content-box";border-radius:999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;pointer-events:auto}.SliderControl::-webkit-slider-thumb{width:22px;height:22px;background:#474a4e;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.5);box-shadow:0 2px 4px 0 rgba(0,0,0,.5);border:2px solid #fff;border-radius:999px;-webkit-appearance:none}.SliderControl::-moz-range-thumb{width:22px;height:22px;background:#474a4e;box-shadow:0 2px 4px 0 rgba(0,0,0,.5);border:2px solid #fff;border-radius:999px;-moz-appearance:none;appearance:none}.SliderControl::-ms-track{background-color:transparent;border-color:transparent;border-radius:999px;box-sizing:border-box;color:transparent;cursor:pointer;display:block;height:30px;margin:0 auto;max-width:60%;padding:4px;pointer-events:auto;width:100%}.SliderControl::-ms-thumb{background:#474a4e;border:2px solid #fff;border-radius:999px;box-shadow:0 2px 4px 0 rgba(0,0,0,.5);height:22px;width:22px}.SliderControl::-ms-fill-lower,.SliderControl::-ms-fill-upper,.SliderControl::-ms-tooltip{display:none}.SliderControl:focus{outline:none}.mapillary-js.component-tag-create .mapillary-js-interactive,.mapillary-js.component-tag-edit-crosshair .mapillary-js-interactive{cursor:crosshair}.mapillary-js.component-tag-edit-move .mapillary-js-interactive{cursor:move}.mapillary-js.component-tag-edit-nesw-resize .mapillary-js-interactive{cursor:nesw-resize}.mapillary-js.component-tag-edit-nwse-resize .mapillary-js-interactive{cursor:nwse-resize}.TagCompleter,.TagInteractor,.TagMover,.TagResizer,.TagSpotInteractor,.TagSymbol,.TagVertex{position:absolute;left:0;top:0}.TagSymbol{cursor:pointer}.TagMover,.TagResizer,.TagSymbol{pointer-events:auto}.TagMover{border-radius:7px;width:14px;height:14px;opacity:.2;cursor:move}.TagMover:hover{opacity:.5}.TagResizer{border-radius:7px;width:14px;height:14px;opacity:0;cursor:crosshair}.TagResizer:hover{opacity:.3}.TagVertex{pointer-events:none;border-radius:3px;width:6px;height:6px}.TagCompleter,.TagInteractor,.TagSpotInteractor{pointer-events:auto;border-radius:7px;width:14px;height:14px;opacity:0}.TagCompleter,.TagInteractor{cursor:pointer}.TagSpotInteractor{cursor:move}.TagCompleter{background:#32cd32}.TagInteractor{background:#ff4500}.TagCompleter:hover,.TagInteractor:hover{opacity:.6}.TagSpotInteractor:hover{opacity:.3}.mapillary-js{background-color:#202020;position:relative;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mapillary-js-interactive{cursor:-webkit-grab;cursor:grab}.mapillary-js-interactive:active{cursor:-webkit-grabbing;cursor:grabbing}.mapillary-js .mapillary-js-dom{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mapillary-js-dom .domRenderer{pointer-events:auto}
-/*# sourceMappingURL=data:application/json;base64,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QixBQUNuQixXQUFZLEFBQ1osWUFBYSxBQUNiLFdBQWEsQUFDYixXQUFhLENBQ2hCLEFBRUQsZ0JBQ0ksVUFBYSxDQUNoQixBQUVELFlBQ0ksa0JBQW1CLEFBQ25CLFdBQVksQUFDWixZQUFhLEFBQ2IsVUFBVyxBQUNYLGdCQUFrQixDQUNyQixBQUVELGtCQUNJLFVBQWEsQ0FDaEIsQUFFRCxXQUNJLG9CQUFxQixBQUNyQixrQkFBbUIsQUFDbkIsVUFBVyxBQUNYLFVBQVksQ0FDZixBQUVELGdEQUdJLG9CQUFxQixBQUNyQixrQkFBbUIsQUFDbkIsV0FBWSxBQUNaLFlBQWEsQUFDYixTQUFXLENBQ2QsQUFFRCw2QkFFSSxjQUFnQixDQUNuQixBQUVELG1CQUNJLFdBQWEsQ0FDaEIsQUFFRCxjQUNJLGtCQUFzQixDQUN6QixBQUVELGVBQ0ksa0JBQXNCLENBQ3pCLEFBRUQseUNBRUksVUFBYSxDQUNoQixBQUVELHlCQUNJLFVBQWEsQ0FDaEIsQUFDRCxjQUNJLHlCQUEwQixBQUMxQixrQkFBbUIsQUFDbkIsZ0JBQWlCLEFBQ2pCLHlDQUEyQyxDQUM5QyxBQUVELDBCQUNLLG9CQUFhLEFBQWIsV0FBYSxDQUNqQixBQUVELGlDQUNLLHdCQUFpQixBQUFqQixlQUFpQixDQUNyQixBQUVELGdDQUNJLFNBQVUsQUFDVixPQUFRLEFBQ1IsZ0JBQWlCLEFBQ2pCLG9CQUFxQixBQUNyQixrQkFBbUIsQUFDbkIsUUFBUyxBQUNULE1BQU8sQUFDUCx5QkFBa0IsQUFBbEIsc0JBQWtCLEFBQWxCLHFCQUFrQixBQUFsQixnQkFBa0IsQ0FDckIsQUFFRCwrQkFDSSxtQkFBcUIsQ0FDeEIiLCJmaWxlIjoibWFwaWxsYXJ5Lm1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuQXR0cmlidXRpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgcGFkZGluZzogNHB4IDJweDtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLkF0dHJpYnV0aW9uIGEsXG4uQXR0cmlidXRpb24gc3BhbiB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBtYXJnaW46IDAgMnB4IDRweDtcbn1cblxuLkF0dHJpYnV0aW9uIHNwYW4ge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uQXR0cmlidXRpb24gYTpob3ZlciB7XG4gICAgY29sb3I6IHJnYig1MywgMTc1LCAxMDkpO1xufVxuLkJhY2tncm91bmRXcmFwcGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZy10b3A6IDMwJTtcbn1cblxuLkJhY2tncm91bmQgcCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgdGV4dC1zaGFkb3c6IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjc1KTtcbn1cblxuLkJlYXJpbmdJbmRpY2F0b3Ige1xuICAgIGJvdHRvbTogMjhweDtcbiAgICBoZWlnaHQ6IDY2cHg7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMXB4O1xuICAgIHdpZHRoOiA1NnB4O1xuICAgIHotaW5kZXg6IDEwO1xufVxuXG4uQmVhcmluZ0luZGljYXRvckJhY2tncm91bmQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLkJlYXJpbmdJbmRpY2F0b3JCYWNrZ3JvdW5kUmVjdGFuZ2xlIHtcbiAgICBiYWNrZ3JvdW5kOiAjMjQyNTI4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICBsZWZ0OiAyM3B4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwcHg7XG59XG5cbi5CZWFyaW5nSW5kaWNhdG9yQmFja2dyb3VuZENpcmNsZSB7XG4gICAgYmFja2dyb3VuZDogIzI0MjUyODtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogNTZweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDU2cHg7XG59XG5cbi5CZWFyaW5nSW5kaWNhdG9yTm9ydGgge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGhlaWdodDogNnB4O1xuICAgIGxlZnQ6IDI3cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNHB4O1xuICAgIHdpZHRoOiAycHg7XG59XG4uQ292ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLkNvdmVyQmFja2dyb3VuZCB7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDVzIGVhc2Utb3V0LCBiYWNrZ3JvdW5kLWltYWdlIC4ycyBlYXNlLWluLW91dDtcbiAgICB6LWluZGV4OiAtMTA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1yaWdodDogLTNweDtcbn1cblxuLkNvdmVyOmhvdmVyIC5Db3ZlckJhY2tncm91bmQge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbn1cblxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJCYWNrZ3JvdW5ke1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC40cyBlYXNlLW91dDtcbn1cblxuLkNvdmVyQmFja2dyb3VuZEdyYWRpZW50IHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoLTE4MGRlZywgcmdiYSgwLDAsMCwwKSAwJSwgcmdiYSgwLDAsMCwxKSAxMDAlKTtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMTBweDtcbiAgICBsZWZ0OiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4ycyBlYXNlLWluLW91dDtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4uQ292ZXJMb2dvIHtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgIGJhY2tncm91bmQ6IHVybCguL2NvdmVyLWxvZ28uc3ZnKTtcbiAgICBib3R0b206IDMwcHg7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGxlZnQ6IDMwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjJzIGVhc2UtaW4tb3V0O1xuICAgIHdpZHRoOiAxMjhweDtcbiAgICB6LWluZGV4OiAzMDA7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2MHB4KSB7XG4gIC5Db3ZlckxvZ28ge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uQ292ZXIuQ292ZXJEb25lID4gLkNvdmVyQmFja2dyb3VuZCB7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IDEwMDtcbn1cblxuLkNvdmVyRG9uZSB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5Db3ZlckJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7XG4gICAgYm90dG9tOiAzMHB4O1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBoZWlnaHQ6IDM0cHg7XG4gICAgbGVmdDogNTAlO1xuICAgIGxldHRlci1zcGFjaW5nOiAxcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC03MHB4O1xuICAgIHBhZGRpbmc6IDVweCAzMHB4IDdweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlLWluLW91dDtcbiAgICB3aWR0aDogMTQwcHg7XG59XG5cbi5Db3ZlckJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgY29sb3I6ICM1RDY2NzE7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uQ292ZXJCdXR0b246Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG59XG5cbi5Db3ZlckJ1dHRvbkljb24ge1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi9wYW5vLnN2Zyk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogNjBweDtcbiAgICB3aWR0aDogNjBweDtcbn1cblxuLlNwaW5uZXIge1xuICBhbmltYXRpb246IHJvdGF0ZSAzcyBsaW5lYXIgaW5maW5pdGU7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi9zcGlubmVyLnN2ZycpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTE2cHg7XG4gIG1hcmdpbi10b3A6IC0xNnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogMzJweDtcbn1cblxuQGtleWZyYW1lcyByb3RhdGUge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbi5Db3Zlci5Db3ZlckxvYWRpbmcgLkNvdmVyQnV0dG9uLFxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJMb2dvLFxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJCYWNrZ3JvdW5kR3JhZGllbnQge1xuICAgIG9wYWNpdHk6IDA7XG59XG4uRGVidWcge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAzMGVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGxpbWU7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIHBhZGRpbmc6IDFlbTtcbiAgICBmb250LWZhbWlseTogSW5wdXQsIE1lbmxvLCBtb25vc3BhY2U7XG4gICAgei1pbmRleDogNTA7XG59XG5cbi5EZWJ1Z0J1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGltZTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG4gICAgei1pbmRleDogNTA7XG59XG5cbi5EZWJ1Z0J1dHRvbkZpeGVkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAycHg7XG4gICAgbGVmdDogMnB4O1xufVxuLkRpcmVjdGlvbnNQZXJzcGVjdGl2ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgei1pbmRleDogMTA7XG59XG5cbi5EaXJlY3Rpb25zQ2lyY2xlLFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZSxcbi5EaXJlY3Rpb25zQ2lyY2xlRGlzYWJsZWQsXG4uRGlyZWN0aW9uc0NpcmNsZUhpZ2hsaWdodCxcbi5EaXJlY3Rpb25zQ2lyY2xlU2VxdWVuY2VIaWdobGlnaHQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5cbi5EaXJlY3Rpb25zQ2lyY2xlLFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZSxcbi5EaXJlY3Rpb25zQ2lyY2xlSGlnaGxpZ2h0LFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZUhpZ2hsaWdodCB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5EaXJlY3Rpb25zQ2lyY2xlOmhvdmVyLFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZTpob3Zlcixcbi5EaXJlY3Rpb25zQ2lyY2xlSGlnaGxpZ2h0OmhvdmVyLFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZUhpZ2hsaWdodDpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGN1cnNvcjogaGFuZDtcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGUsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDApO1xufVxuXG4uRGlyZWN0aW9uc0NpcmNsZURpc2FibGVkIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDApO1xuICAgIHotaW5kZXg6IC0xO1xufVxuXG4uRGlyZWN0aW9uc0NpcmNsZUhpZ2hsaWdodCxcbi5EaXJlY3Rpb25zQ2lyY2xlU2VxdWVuY2VIaWdobGlnaHQge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40KTtcbn1cblxuLkRpcmVjdGlvbnNBcnJvd1N0ZXAsXG4uRGlyZWN0aW9uc0Fycm93UGFubyxcbi5EaXJlY3Rpb25zQXJyb3dEaXNhYmxlZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNDQlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICB3aWR0aDogNzUlO1xuICAgIGhlaWdodDogNDQuMDc3NSU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5EaXJlY3Rpb25zQXJyb3dTdGVwLFxuLkRpcmVjdGlvbnNBcnJvd0Rpc2FibGVkIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi9wb2ludGVyLXdoaXRlLnN2Zyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cblxuLkRpcmVjdGlvbnNBcnJvd0Rpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjI7XG4gICAgei1pbmRleDogLTE7XG59XG5cbi5EaXJlY3Rpb25zQXJyb3dQYW5vIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi9wb2ludGVyLXdoZWF0LnN2Zyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cblxuLlR1cm5DaXJjbGUsXG4uVHVybkNpcmNsZVNlcXVlbmNlLFxuLlR1cm5DaXJjbGVIaWdobGlnaHQsXG4uVHVybkNpcmNsZVNlcXVlbmNlSGlnaGxpZ2h0IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uVHVybkNpcmNsZSxcbi5UdXJuQ2lyY2xlU2VxdWVuY2Uge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMCk7XG59XG5cbi5UdXJuQ2lyY2xlSGlnaGxpZ2h0LFxuLlR1cm5DaXJjbGVTZXF1ZW5jZUhpZ2hsaWdodCB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpO1xufVxuXG4uVHVybkNpcmNsZTpob3Zlcixcbi5UdXJuQ2lyY2xlU2VxdWVuY2U6aG92ZXIsXG4uVHVybkNpcmNsZUhpZ2hsaWdodDpob3Zlcixcbi5UdXJuQ2lyY2xlU2VxdWVuY2VIaWdobGlnaHQ6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG59XG5cbi5UdXJuTGVmdCxcbi5UdXJuUmlnaHQsXG4uVHVybkFyb3VuZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjgpKTtcbn1cblxuLlR1cm5MZWZ0LFxuLlR1cm5SaWdodCB7XG4gICAgd2lkdGg6IDU4Ljc5NCU7XG4gICAgaGVpZ2h0OiA3MCU7XG59XG5cbi5UdXJuQXJvdW5kIHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgd2lkdGg6IDc1JTtcbiAgICBoZWlnaHQ6IDYzLjI0NzUlO1xufVxuXG4uVHVybkxlZnQge1xuICAgIGxlZnQ6IDQ1JTtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi90dXJuLnN2Zyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cblxuLlR1cm5SaWdodCB7XG4gICAgbGVmdDogNTUlO1xuICAgIGJhY2tncm91bmQ6IHVybCguL3R1cm4uc3ZnKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlWCgtMSk7XG59XG5cbi5UdXJuQXJvdW5kIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi90dXJuLWFyb3VuZC5zdmcpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG5cbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XG4gICAgLkRpcmVjdGlvbnNDaXJjbGU6aG92ZXIsXG4gICAgLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgICB9XG5cbiAgICAuVHVybkNpcmNsZTpob3ZlcixcbiAgICAuVHVybkNpcmNsZVNlcXVlbmNlOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgIH1cbn1cbi5Mb2FkaW5nIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB6LWluZGV4OiAyMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xufVxuXG4uTG9hZGluZ0JhciB7XG4gICAgaGVpZ2h0OiA0cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsIDE3NSwgMTA5LCAwLjgpO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTAwbXM7XG59XG4uTmF2aWdhdGlvblNlcXVlbmNlLFxuLk5hdmlnYXRpb25TcGF0aWFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgei1pbmRleDogMTA7XG59XG5cbi5OYXZpZ2F0aW9uU2VxdWVuY2Uge1xuICAgIHRvcDogMTJweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC00MHB4O1xufVxuXG4uTmF2aWdhdGlvblNwYXRpYWwge1xuICAgIGJvdHRvbTogMThweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMDBweDtcbn1cblxuLk5hdmlnYXRpb25TcGF0aWFsQm90dG9tIHtcbiAgICBtYXJnaW4tbGVmdDogNDBweDtcbn1cblxuLkRpcmVjdGlvbiB7XG4gICAgd2lkdGg6IDM2cHg7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIG1hcmdpbjogMHB4IDJweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCAycHggMCByZ2JhKDAsIDAsIDAsIDEpKTtcbn1cblxuLkRpcmVjdGlvblByZXYsXG4uRGlyZWN0aW9uTGVmdCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb0xUa3dJRGt3TERrd0tTSStQR2NnYVdROUltRnljbTkzTFhWd0lpQm1hV3hzUFNJalJrWkdSa1pHSWo0OGNHRjBhQ0JrUFNKTk9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRU00T0M0eU9UazRPRFV6TERRMUxqazBPVGM1TVRZZ09EY3VOelV4TlRZNU1pdzBOaTR5T0RrNU1qazVJRGczTGpJNE16QTROVE1zTkRZdU56VTROREV6T0NCTU16RXVNell6TXprME55d3hNREl1TmpjNE1UQTBJRU15T1M0Mk5EWXdOakUwTERFd05DNHpPVFUwTXpnZ01qa3VOalV4T0RNMk15d3hNRGN1TVRjd05EazRJRE14TGpNMk56QXdNekVzTVRBNExqZzROVFkyTkNCTU5EQXVOamcyTnpRMU15d3hNVGd1TWpBMU5EQTNJRU0wTWk0ME1EQXpPVFkzTERFeE9TNDVNVGt3TlRnZ05EVXVNVGd4TVRNeE15d3hNVGt1T1RJeU1UZzVJRFEyTGpnNU5ETXdOVElzTVRFNExqSXdPVEF4TlNCTU9UQXVPREF3T1RJM05pdzNOQzR6TURJek9USTJJRXd4TXpRdU5EVXdOVFVzTVRFM0xqazFNakF4TlNCRE1UTTJMakUyTnpnNE15d3hNVGt1TmpZNU16UTVJREV6T0M0NU5ESTVORE1zTVRFNUxqWTJNelUzTkNBeE5EQXVOalU0TVRFc01URTNMamswT0RRd055Qk1NVFE1TGprM056ZzFNaXd4TURndU5qSTROalkxSUVNeE5URXVOamt4TlRBMExERXdOaTQ1TVRVd01UTWdNVFV4TGpZNU5EWXpOU3d4TURRdU1UTTBNamM1SURFME9TNDVPREUwTmpFc01UQXlMalF5TVRFd05TQk1PVFF1TURZeE56Y3dNU3cwTmk0MU1ERTBNVFF4SUVNNU1pNDJOVGN6TVRBNUxEUTFMakE1TmprMU5Ea2dPVEF1TlRRMU5ESXpNU3cwTkM0NE5EUTVORFExSURnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQk1PRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUZvaUlHbGtQU0pCY25KdmR5SWdQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5PVEFzTVRjd0xqRXpPRGd4TWlCRE1UTTBMakkxT1RRME5Dd3hOekF1TVRNNE9ERXlJREUzTUM0eE16ZzRNVElzTVRNMExqSTFPVFEwTkNBeE56QXVNVE00T0RFeUxEa3dJRU14TnpBdU1UTTRPREV5TERRMUxqYzBNRFUxTmpJZ01UTTBMakkxT1RRME5DdzVMamcyTVRFNE56ZzFJRGt3TERrdU9EWXhNVGczT0RVZ1F6UTFMamMwTURVMU5qSXNPUzQ0TmpFeE9EYzROU0E1TGpnMk1URTROemcxTERRMUxqYzBNRFUxTmpJZ09TNDROakV4T0RjNE5TdzVNQ0JET1M0NE5qRXhPRGM0TlN3eE16UXVNalU1TkRRMElEUTFMamMwTURVMU5qSXNNVGN3TGpFek9EZ3hNaUE1TUN3eE56QXVNVE00T0RFeUlFdzVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRm9nVFRBc09UQWdRekFzTkRBdU1qazBNemN5TlNBME1DNHlPVFF6TnpJMUxEQWdPVEFzTUNCRE1UTTVMamN3TlRZeU55d3dJREU0TUN3ME1DNHlPVFF6TnpJMUlERTRNQ3c1TUNCRE1UZ3dMREV6T1M0M01EVTJNamNnTVRNNUxqY3dOVFl5Tnl3eE9EQWdPVEFzTVRnd0lFTTBNQzR5T1RRek56STFMREU0TUNBd0xERXpPUzQzTURVMk1qY2dNQ3c1TUNCYUlpQnBaRDBpUTJseVkyeGxJajQ4TDNCaGRHZytQQzluUGp3dlp6NDhMM04yWno0PVwiKTtcbn1cblxuLkRpcmVjdGlvbk5leHQsXG4uRGlyZWN0aW9uUmlnaHQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UZ3djSGdpSUdobGFXZG9kRDBpTVRnd2NIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBeE9EQWdNVGd3SWlCMlpYSnphVzl1UFNJeExqRWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnYVdROUlsQmhaMlV0TVNJZ1ptbHNiRDBpYm05dVpTSWdkSEpoYm5ObWIzSnRQU0p5YjNSaGRHVW9PVEFnT1RBc09UQXBJajQ4WnlCcFpEMGlZWEp5YjNjdGRYQWlJR1pwYkd3OUlpTkdSa1pHUmtZaVBqeHdZWFJvSUdROUlrMDRPQzQ0T0RRek9ERTNMRFExTGpjek56ZzRNRFlnUXpnNExqSTVPVGc0TlRNc05EVXVPVFE1TnpreE5pQTROeTQzTlRFMU5qa3lMRFEyTGpJNE9Ua3lPVGtnT0RjdU1qZ3pNRGcxTXl3ME5pNDNOVGcwTVRNNElFd3pNUzR6TmpNek9UUTNMREV3TWk0Mk56Z3hNRFFnUXpJNUxqWTBOakEyTVRRc01UQTBMak01TlRRek9DQXlPUzQyTlRFNE16WXpMREV3Tnk0eE56QTBPVGdnTXpFdU16WTNNREF6TVN3eE1EZ3VPRGcxTmpZMElFdzBNQzQyT0RZM05EVXpMREV4T0M0eU1EVTBNRGNnUXpReUxqUXdNRE01Tmpjc01URTVMamt4T1RBMU9DQTBOUzR4T0RFeE16RXpMREV4T1M0NU1qSXhPRGtnTkRZdU9EazBNekExTWl3eE1UZ3VNakE1TURFMUlFdzVNQzQ0TURBNU1qYzJMRGMwTGpNd01qTTVNallnVERFek5DNDBOVEExTlN3eE1UY3VPVFV5TURFMUlFTXhNell1TVRZM09EZ3pMREV4T1M0Mk5qa3pORGtnTVRNNExqazBNamswTXl3eE1Ua3VOall6TlRjMElERTBNQzQyTlRneE1Td3hNVGN1T1RRNE5EQTNJRXd4TkRrdU9UYzNPRFV5TERFd09DNDJNamcyTmpVZ1F6RTFNUzQyT1RFMU1EUXNNVEEyTGpreE5UQXhNeUF4TlRFdU5qazBOak0xTERFd05DNHhNelF5TnprZ01UUTVMams0TVRRMk1Td3hNREl1TkRJeE1UQTFJRXc1TkM0d05qRTNOekF4TERRMkxqVXdNVFF4TkRFZ1F6a3lMalkxTnpNeE1Ea3NORFV1TURrMk9UVTBPU0E1TUM0MU5EVTBNak14TERRMExqZzBORGswTkRVZ09EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRXc0T0M0NE9EUXpPREUzTERRMUxqY3pOemc0TURZZ1dpSWdhV1E5SWtGeWNtOTNJaUErUEM5d1lYUm9Qanh3WVhSb0lHUTlJazA1TUN3eE56QXVNVE00T0RFeUlFTXhNelF1TWpVNU5EUTBMREUzTUM0eE16ZzRNVElnTVRjd0xqRXpPRGd4TWl3eE16UXVNalU1TkRRMElERTNNQzR4TXpnNE1USXNPVEFnUXpFM01DNHhNemc0TVRJc05EVXVOelF3TlRVMk1pQXhNelF1TWpVNU5EUTBMRGt1T0RZeE1UZzNPRFVnT1RBc09TNDROakV4T0RjNE5TQkRORFV1TnpRd05UVTJNaXc1TGpnMk1URTROemcxSURrdU9EWXhNVGczT0RVc05EVXVOelF3TlRVMk1pQTVMamcyTVRFNE56ZzFMRGt3SUVNNUxqZzJNVEU0TnpnMUxERXpOQzR5TlRrME5EUWdORFV1TnpRd05UVTJNaXd4TnpBdU1UTTRPREV5SURrd0xERTNNQzR4TXpnNE1USWdURGt3TERFM01DNHhNemc0TVRJZ1REa3dMREUzTUM0eE16ZzRNVElnV2lCTk1DdzVNQ0JETUN3ME1DNHlPVFF6TnpJMUlEUXdMakk1TkRNM01qVXNNQ0E1TUN3d0lFTXhNemt1TnpBMU5qSTNMREFnTVRnd0xEUXdMakk1TkRNM01qVWdNVGd3TERrd0lFTXhPREFzTVRNNUxqY3dOVFl5TnlBeE16a3VOekExTmpJM0xERTRNQ0E1TUN3eE9EQWdRelF3TGpJNU5ETTNNalVzTVRnd0lEQXNNVE01TGpjd05UWXlOeUF3TERrd0lGb2lJR2xrUFNKRGFYSmpiR1VpUGp3dmNHRjBhRDQ4TDJjK1BDOW5Qand2YzNablBnPT1cIik7XG59XG5cbi5EaXJlY3Rpb25Gb3J3YXJkIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTUNBNU1DdzVNQ2tpUGp4bklHbGtQU0poY25KdmR5MTFjQ0lnWm1sc2JEMGlJMFpHUmtaR1JpSStQSEJoZEdnZ1pEMGlUVGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCRE9EZ3VNams1T0RnMU15dzBOUzQ1TkRrM09URTJJRGczTGpjMU1UVTJPVElzTkRZdU1qZzVPVEk1T1NBNE55NHlPRE13T0RVekxEUTJMamMxT0RReE16Z2dURE14TGpNMk16TTVORGNzTVRBeUxqWTNPREV3TkNCRE1qa3VOalEyTURZeE5Dd3hNRFF1TXprMU5ETTRJREk1TGpZMU1UZ3pOak1zTVRBM0xqRTNNRFE1T0NBek1TNHpOamN3TURNeExERXdPQzQ0T0RVMk5qUWdURFF3TGpZNE5qYzBOVE1zTVRFNExqSXdOVFF3TnlCRE5ESXVOREF3TXprMk55d3hNVGt1T1RFNU1EVTRJRFExTGpFNE1URXpNVE1zTVRFNUxqa3lNakU0T1NBME5pNDRPVFF6TURVeUxERXhPQzR5TURrd01UVWdURGt3TGpnd01Ea3lOellzTnpRdU16QXlNemt5TmlCTU1UTTBMalExTURVMUxERXhOeTQ1TlRJd01UVWdRekV6Tmk0eE5qYzRPRE1zTVRFNUxqWTJPVE0wT1NBeE16Z3VPVFF5T1RRekxERXhPUzQyTmpNMU56UWdNVFF3TGpZMU9ERXhMREV4Tnk0NU5EZzBNRGNnVERFME9TNDVOemM0TlRJc01UQTRMall5T0RZMk5TQkRNVFV4TGpZNU1UVXdOQ3d4TURZdU9URTFNREV6SURFMU1TNDJPVFEyTXpVc01UQTBMakV6TkRJM09TQXhORGt1T1RneE5EWXhMREV3TWk0ME1qRXhNRFVnVERrMExqQTJNVGMzTURFc05EWXVOVEF4TkRFME1TQkRPVEl1TmpVM016RXdPU3cwTlM0d09UWTVOVFE1SURrd0xqVTBOVFF5TXpFc05EUXVPRFEwT1RRME5TQTRPQzQ0T0RRek9ERTNMRFExTGpjek56ZzRNRFlnVERnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQmFJaUJwWkQwaVFYSnliM2NpSUQ0OEwzQmhkR2crUEhCaGRHZ2daRDBpVFRrd0xERTNNQzR4TXpnNE1USWdRekV6TkM0eU5UazBORFFzTVRjd0xqRXpPRGd4TWlBeE56QXVNVE00T0RFeUxERXpOQzR5TlRrME5EUWdNVGN3TGpFek9EZ3hNaXc1TUNCRE1UY3dMakV6T0RneE1pdzBOUzQzTkRBMU5UWXlJREV6TkM0eU5UazBORFFzT1M0NE5qRXhPRGM0TlNBNU1DdzVMamcyTVRFNE56ZzFJRU0wTlM0M05EQTFOVFl5TERrdU9EWXhNVGczT0RVZ09TNDROakV4T0RjNE5TdzBOUzQzTkRBMU5UWXlJRGt1T0RZeE1UZzNPRFVzT1RBZ1F6a3VPRFl4TVRnM09EVXNNVE0wTGpJMU9UUTBOQ0EwTlM0M05EQTFOVFl5TERFM01DNHhNemc0TVRJZ09UQXNNVGN3TGpFek9EZ3hNaUJNT1RBc01UY3dMakV6T0RneE1pQk1PVEFzTVRjd0xqRXpPRGd4TWlCYUlFMHdMRGt3SUVNd0xEUXdMakk1TkRNM01qVWdOREF1TWprME16Y3lOU3d3SURrd0xEQWdRekV6T1M0M01EVTJNamNzTUNBeE9EQXNOREF1TWprME16Y3lOU0F4T0RBc09UQWdRekU0TUN3eE16a3VOekExTmpJM0lERXpPUzQzTURVMk1qY3NNVGd3SURrd0xERTRNQ0JETkRBdU1qazBNemN5TlN3eE9EQWdNQ3d4TXprdU56QTFOakkzSURBc09UQWdXaUlnYVdROUlrTnBjbU5zWlNJK1BDOXdZWFJvUGp3dlp6NDhMMmMrUEM5emRtYytcIik7XG59XG5cbi5EaXJlY3Rpb25CYWNrd2FyZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb01UZ3dJRGt3TERrd0tTSStQR2NnYVdROUltRnljbTkzTFhWd0lpQm1hV3hzUFNJalJrWkdSa1pHSWo0OGNHRjBhQ0JrUFNKTk9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRU00T0M0eU9UazRPRFV6TERRMUxqazBPVGM1TVRZZ09EY3VOelV4TlRZNU1pdzBOaTR5T0RrNU1qazVJRGczTGpJNE16QTROVE1zTkRZdU56VTROREV6T0NCTU16RXVNell6TXprME55d3hNREl1TmpjNE1UQTBJRU15T1M0Mk5EWXdOakUwTERFd05DNHpPVFUwTXpnZ01qa3VOalV4T0RNMk15d3hNRGN1TVRjd05EazRJRE14TGpNMk56QXdNekVzTVRBNExqZzROVFkyTkNCTU5EQXVOamcyTnpRMU15d3hNVGd1TWpBMU5EQTNJRU0wTWk0ME1EQXpPVFkzTERFeE9TNDVNVGt3TlRnZ05EVXVNVGd4TVRNeE15d3hNVGt1T1RJeU1UZzVJRFEyTGpnNU5ETXdOVElzTVRFNExqSXdPVEF4TlNCTU9UQXVPREF3T1RJM05pdzNOQzR6TURJek9USTJJRXd4TXpRdU5EVXdOVFVzTVRFM0xqazFNakF4TlNCRE1UTTJMakUyTnpnNE15d3hNVGt1TmpZNU16UTVJREV6T0M0NU5ESTVORE1zTVRFNUxqWTJNelUzTkNBeE5EQXVOalU0TVRFc01URTNMamswT0RRd055Qk1NVFE1TGprM056ZzFNaXd4TURndU5qSTROalkxSUVNeE5URXVOamt4TlRBMExERXdOaTQ1TVRVd01UTWdNVFV4TGpZNU5EWXpOU3d4TURRdU1UTTBNamM1SURFME9TNDVPREUwTmpFc01UQXlMalF5TVRFd05TQk1PVFF1TURZeE56Y3dNU3cwTmk0MU1ERTBNVFF4SUVNNU1pNDJOVGN6TVRBNUxEUTFMakE1TmprMU5Ea2dPVEF1TlRRMU5ESXpNU3cwTkM0NE5EUTVORFExSURnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQk1PRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUZvaUlHbGtQU0pCY25KdmR5SWdQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5PVEFzTVRjd0xqRXpPRGd4TWlCRE1UTTBMakkxT1RRME5Dd3hOekF1TVRNNE9ERXlJREUzTUM0eE16ZzRNVElzTVRNMExqSTFPVFEwTkNBeE56QXVNVE00T0RFeUxEa3dJRU14TnpBdU1UTTRPREV5TERRMUxqYzBNRFUxTmpJZ01UTTBMakkxT1RRME5DdzVMamcyTVRFNE56ZzFJRGt3TERrdU9EWXhNVGczT0RVZ1F6UTFMamMwTURVMU5qSXNPUzQ0TmpFeE9EYzROU0E1TGpnMk1URTROemcxTERRMUxqYzBNRFUxTmpJZ09TNDROakV4T0RjNE5TdzVNQ0JET1M0NE5qRXhPRGM0TlN3eE16UXVNalU1TkRRMElEUTFMamMwTURVMU5qSXNNVGN3TGpFek9EZ3hNaUE1TUN3eE56QXVNVE00T0RFeUlFdzVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRm9nVFRBc09UQWdRekFzTkRBdU1qazBNemN5TlNBME1DNHlPVFF6TnpJMUxEQWdPVEFzTUNCRE1UTTVMamN3TlRZeU55d3dJREU0TUN3ME1DNHlPVFF6TnpJMUlERTRNQ3c1TUNCRE1UZ3dMREV6T1M0M01EVTJNamNnTVRNNUxqY3dOVFl5Tnl3eE9EQWdPVEFzTVRnd0lFTTBNQzR5T1RRek56STFMREU0TUNBd0xERXpPUzQzTURVMk1qY2dNQ3c1TUNCYUlpQnBaRDBpUTJseVkyeGxJajQ4TDNCaGRHZytQQzluUGp3dlp6NDhMM04yWno0PVwiKTtcbn1cblxuLkRpcmVjdGlvblR1cm5sZWZ0IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTFRRMUlEa3dMRGt3S1NJK1BHY2dhV1E5SW1GeWNtOTNMWFZ3SWlCbWFXeHNQU0lqUmtaR1JrWkdJajQ4Y0dGMGFDQmtQU0pOT0RndU9EZzBNemd4Tnl3ME5TNDNNemM0T0RBMklFTTRPQzR5T1RrNE9EVXpMRFExTGprME9UYzVNVFlnT0RjdU56VXhOVFk1TWl3ME5pNHlPRGs1TWprNUlEZzNMakk0TXpBNE5UTXNORFl1TnpVNE5ERXpPQ0JNTXpFdU16WXpNemswTnl3eE1ESXVOamM0TVRBMElFTXlPUzQyTkRZd05qRTBMREV3TkM0ek9UVTBNemdnTWprdU5qVXhPRE0yTXl3eE1EY3VNVGN3TkRrNElETXhMak0yTnpBd016RXNNVEE0TGpnNE5UWTJOQ0JNTkRBdU5qZzJOelExTXl3eE1UZ3VNakExTkRBM0lFTTBNaTQwTURBek9UWTNMREV4T1M0NU1Ua3dOVGdnTkRVdU1UZ3hNVE14TXl3eE1Ua3VPVEl5TVRnNUlEUTJMamc1TkRNd05USXNNVEU0TGpJd09UQXhOU0JNT1RBdU9EQXdPVEkzTml3M05DNHpNREl6T1RJMklFd3hNelF1TkRVd05UVXNNVEUzTGprMU1qQXhOU0JETVRNMkxqRTJOemc0TXl3eE1Ua3VOalk1TXpRNUlERXpPQzQ1TkRJNU5ETXNNVEU1TGpZMk16VTNOQ0F4TkRBdU5qVTRNVEVzTVRFM0xqazBPRFF3TnlCTU1UUTVMamszTnpnMU1pd3hNRGd1TmpJNE5qWTFJRU14TlRFdU5qa3hOVEEwTERFd05pNDVNVFV3TVRNZ01UVXhMalk1TkRZek5Td3hNRFF1TVRNME1qYzVJREUwT1M0NU9ERTBOakVzTVRBeUxqUXlNVEV3TlNCTU9UUXVNRFl4Tnpjd01TdzBOaTQxTURFME1UUXhJRU01TWk0Mk5UY3pNVEE1TERRMUxqQTVOamsxTkRrZ09UQXVOVFExTkRJek1TdzBOQzQ0TkRRNU5EUTFJRGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCTU9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRm9pSUdsa1BTSkJjbkp2ZHlJZ1Bqd3ZjR0YwYUQ0OGNHRjBhQ0JrUFNKTk9UQXNNVGN3TGpFek9EZ3hNaUJETVRNMExqSTFPVFEwTkN3eE56QXVNVE00T0RFeUlERTNNQzR4TXpnNE1USXNNVE0wTGpJMU9UUTBOQ0F4TnpBdU1UTTRPREV5TERrd0lFTXhOekF1TVRNNE9ERXlMRFExTGpjME1EVTFOaklnTVRNMExqSTFPVFEwTkN3NUxqZzJNVEU0TnpnMUlEa3dMRGt1T0RZeE1UZzNPRFVnUXpRMUxqYzBNRFUxTmpJc09TNDROakV4T0RjNE5TQTVMamcyTVRFNE56ZzFMRFExTGpjME1EVTFOaklnT1M0NE5qRXhPRGM0TlN3NU1DQkRPUzQ0TmpFeE9EYzROU3d4TXpRdU1qVTVORFEwSURRMUxqYzBNRFUxTmpJc01UY3dMakV6T0RneE1pQTVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRXc1TUN3eE56QXVNVE00T0RFeUlGb2dUVEFzT1RBZ1F6QXNOREF1TWprME16Y3lOU0EwTUM0eU9UUXpOekkxTERBZ09UQXNNQ0JETVRNNUxqY3dOVFl5Tnl3d0lERTRNQ3cwTUM0eU9UUXpOekkxSURFNE1DdzVNQ0JETVRnd0xERXpPUzQzTURVMk1qY2dNVE01TGpjd05UWXlOeXd4T0RBZ09UQXNNVGd3SUVNME1DNHlPVFF6TnpJMUxERTRNQ0F3TERFek9TNDNNRFUyTWpjZ01DdzVNQ0JhSWlCcFpEMGlRMmx5WTJ4bElqNDhMM0JoZEdnK1BDOW5Qand2Wno0OEwzTjJaejQ9XCIpO1xufVxuXG4uRGlyZWN0aW9uVHVybnJpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTkRVZ09UQXNPVEFwSWo0OFp5QnBaRDBpWVhKeWIzY3RkWEFpSUdacGJHdzlJaU5HUmtaR1JrWWlQanh3WVhSb0lHUTlJazA0T0M0NE9EUXpPREUzTERRMUxqY3pOemc0TURZZ1F6ZzRMakk1T1RnNE5UTXNORFV1T1RRNU56a3hOaUE0Tnk0M05URTFOamt5TERRMkxqSTRPVGt5T1RrZ09EY3VNamd6TURnMU15dzBOaTQzTlRnME1UTTRJRXd6TVM0ek5qTXpPVFEzTERFd01pNDJOemd4TURRZ1F6STVMalkwTmpBMk1UUXNNVEEwTGpNNU5UUXpPQ0F5T1M0Mk5URTRNell6TERFd055NHhOekEwT1RnZ016RXVNelkzTURBek1Td3hNRGd1T0RnMU5qWTBJRXcwTUM0Mk9EWTNORFV6TERFeE9DNHlNRFUwTURjZ1F6UXlMalF3TURNNU5qY3NNVEU1TGpreE9UQTFPQ0EwTlM0eE9ERXhNekV6TERFeE9TNDVNakl4T0RrZ05EWXVPRGswTXpBMU1pd3hNVGd1TWpBNU1ERTFJRXc1TUM0NE1EQTVNamMyTERjMExqTXdNak01TWpZZ1RERXpOQzQwTlRBMU5Td3hNVGN1T1RVeU1ERTFJRU14TXpZdU1UWTNPRGd6TERFeE9TNDJOamt6TkRrZ01UTTRMamswTWprME15d3hNVGt1TmpZek5UYzBJREUwTUM0Mk5UZ3hNU3d4TVRjdU9UUTROREEzSUV3eE5Ea3VPVGMzT0RVeUxERXdPQzQyTWpnMk5qVWdRekUxTVM0Mk9URTFNRFFzTVRBMkxqa3hOVEF4TXlBeE5URXVOamswTmpNMUxERXdOQzR4TXpReU56a2dNVFE1TGprNE1UUTJNU3d4TURJdU5ESXhNVEExSUV3NU5DNHdOakUzTnpBeExEUTJMalV3TVRReE5ERWdRemt5TGpZMU56TXhNRGtzTkRVdU1EazJPVFUwT1NBNU1DNDFORFUwTWpNeExEUTBMamcwTkRrME5EVWdPRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUV3NE9DNDRPRFF6T0RFM0xEUTFMamN6TnpnNE1EWWdXaUlnYVdROUlrRnljbTkzSWlBK1BDOXdZWFJvUGp4d1lYUm9JR1E5SWswNU1Dd3hOekF1TVRNNE9ERXlJRU14TXpRdU1qVTVORFEwTERFM01DNHhNemc0TVRJZ01UY3dMakV6T0RneE1pd3hNelF1TWpVNU5EUTBJREUzTUM0eE16ZzRNVElzT1RBZ1F6RTNNQzR4TXpnNE1USXNORFV1TnpRd05UVTJNaUF4TXpRdU1qVTVORFEwTERrdU9EWXhNVGczT0RVZ09UQXNPUzQ0TmpFeE9EYzROU0JETkRVdU56UXdOVFUyTWl3NUxqZzJNVEU0TnpnMUlEa3VPRFl4TVRnM09EVXNORFV1TnpRd05UVTJNaUE1TGpnMk1URTROemcxTERrd0lFTTVMamcyTVRFNE56ZzFMREV6TkM0eU5UazBORFFnTkRVdU56UXdOVFUyTWl3eE56QXVNVE00T0RFeUlEa3dMREUzTUM0eE16ZzRNVElnVERrd0xERTNNQzR4TXpnNE1USWdURGt3TERFM01DNHhNemc0TVRJZ1dpQk5NQ3c1TUNCRE1DdzBNQzR5T1RRek56STFJRFF3TGpJNU5ETTNNalVzTUNBNU1Dd3dJRU14TXprdU56QTFOakkzTERBZ01UZ3dMRFF3TGpJNU5ETTNNalVnTVRnd0xEa3dJRU14T0RBc01UTTVMamN3TlRZeU55QXhNemt1TnpBMU5qSTNMREU0TUNBNU1Dd3hPREFnUXpRd0xqSTVORE0zTWpVc01UZ3dJREFzTVRNNUxqY3dOVFl5TnlBd0xEa3dJRm9pSUdsa1BTSkRhWEpqYkdVaVBqd3ZjR0YwYUQ0OEwyYytQQzluUGp3dmMzWm5QZz09XCIpO1xufVxuXG4uRGlyZWN0aW9uVHVybmFyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb0xURXpOU0E1TUN3NU1Da2lQanhuSUdsa1BTSmhjbkp2ZHkxMWNDSWdabWxzYkQwaUkwWkdSa1pHUmlJK1BIQmhkR2dnWkQwaVRUZzRMamc0TkRNNE1UY3NORFV1TnpNM09EZ3dOaUJET0RndU1qazVPRGcxTXl3ME5TNDVORGszT1RFMklEZzNMamMxTVRVMk9USXNORFl1TWpnNU9USTVPU0E0Tnk0eU9ETXdPRFV6TERRMkxqYzFPRFF4TXpnZ1RETXhMak0yTXpNNU5EY3NNVEF5TGpZM09ERXdOQ0JETWprdU5qUTJNRFl4TkN3eE1EUXVNemsxTkRNNElESTVMalkxTVRnek5qTXNNVEEzTGpFM01EUTVPQ0F6TVM0ek5qY3dNRE14TERFd09DNDRPRFUyTmpRZ1REUXdMalk0TmpjME5UTXNNVEU0TGpJd05UUXdOeUJETkRJdU5EQXdNemsyTnl3eE1Ua3VPVEU1TURVNElEUTFMakU0TVRFek1UTXNNVEU1TGpreU1qRTRPU0EwTmk0NE9UUXpNRFV5TERFeE9DNHlNRGt3TVRVZ1REa3dMamd3TURreU56WXNOelF1TXpBeU16a3lOaUJNTVRNMExqUTFNRFUxTERFeE55NDVOVEl3TVRVZ1F6RXpOaTR4TmpjNE9ETXNNVEU1TGpZMk9UTTBPU0F4TXpndU9UUXlPVFF6TERFeE9TNDJOak0xTnpRZ01UUXdMalkxT0RFeExERXhOeTQ1TkRnME1EY2dUREUwT1M0NU56YzROVElzTVRBNExqWXlPRFkyTlNCRE1UVXhMalk1TVRVd05Dd3hNRFl1T1RFMU1ERXpJREUxTVM0Mk9UUTJNelVzTVRBMExqRXpOREkzT1NBeE5Ea3VPVGd4TkRZeExERXdNaTQwTWpFeE1EVWdURGswTGpBMk1UYzNNREVzTkRZdU5UQXhOREUwTVNCRE9USXVOalUzTXpFd09TdzBOUzR3T1RZNU5UUTVJRGt3TGpVME5UUXlNekVzTkRRdU9EUTBPVFEwTlNBNE9DNDRPRFF6T0RFM0xEUTFMamN6TnpnNE1EWWdURGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCYUlpQnBaRDBpUVhKeWIzY2lJRDQ4TDNCaGRHZytQSEJoZEdnZ1pEMGlUVGt3TERFM01DNHhNemc0TVRJZ1F6RXpOQzR5TlRrME5EUXNNVGN3TGpFek9EZ3hNaUF4TnpBdU1UTTRPREV5TERFek5DNHlOVGswTkRRZ01UY3dMakV6T0RneE1pdzVNQ0JETVRjd0xqRXpPRGd4TWl3ME5TNDNOREExTlRZeUlERXpOQzR5TlRrME5EUXNPUzQ0TmpFeE9EYzROU0E1TUN3NUxqZzJNVEU0TnpnMUlFTTBOUzQzTkRBMU5UWXlMRGt1T0RZeE1UZzNPRFVnT1M0NE5qRXhPRGM0TlN3ME5TNDNOREExTlRZeUlEa3VPRFl4TVRnM09EVXNPVEFnUXprdU9EWXhNVGczT0RVc01UTTBMakkxT1RRME5DQTBOUzQzTkRBMU5UWXlMREUzTUM0eE16ZzRNVElnT1RBc01UY3dMakV6T0RneE1pQk1PVEFzTVRjd0xqRXpPRGd4TWlCTU9UQXNNVGN3TGpFek9EZ3hNaUJhSUUwd0xEa3dJRU13TERRd0xqSTVORE0zTWpVZ05EQXVNamswTXpjeU5Td3dJRGt3TERBZ1F6RXpPUzQzTURVMk1qY3NNQ0F4T0RBc05EQXVNamswTXpjeU5TQXhPREFzT1RBZ1F6RTRNQ3d4TXprdU56QTFOakkzSURFek9TNDNNRFUyTWpjc01UZ3dJRGt3TERFNE1DQkROREF1TWprME16Y3lOU3d4T0RBZ01Dd3hNemt1TnpBMU5qSTNJREFzT1RBZ1dpSWdhV1E5SWtOcGNtTnNaU0krUEM5d1lYUm9Qand2Wno0OEwyYytQQzl6ZG1jK1wiKTtcbn1cbi5tYXBpbGxhcnlqcy1wb3B1cCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50LFxuLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQtY2xlYW4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWNhcHR1cmUtcG9pbnRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1ib3R0b20sXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQsXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLXJpZ2h0IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLFxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1sZWZ0LFxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtbGVmdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtcmlnaHQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC10aXAsXG4ubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC10b3AgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci10b3AtY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtOHB4O1xuICAgIGxlZnQ6IC03cHg7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIGJvcmRlci10b3AtY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICBib3JkZXItbGVmdDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtOXB4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjpibGFjaztcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC05cHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbSAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBibGFjaztcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbSAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm90dG9tOiAtMXB4O1xuICAgIGxlZnQ6IC03cHg7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItbGVmdDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm90dG9tOiAtMnB4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjpibGFjaztcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3R0b206IC0ycHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBibGFjaztcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC03cHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItbGVmdC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtcmlnaHQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci1yaWdodC1jb2xvcjogYmxhY2s7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtN3B4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItcmlnaHQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQge1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLXJpZ2h0IC5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLXJpZ2h0IC5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuLlJvdXRlRnJhbWUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBvdXRsaW5lOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDIwO1xuICAgIGJvdHRvbTogMzAlO1xuICAgIGxlZnQ6IDEwJTtcbn1cblxuLlJvdXRlRnJhbWUgcCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIHRleHQtc2hhZG93OiAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC43NSk7XG59XG4uU2VxdWVuY2VDb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdG9wOiAxNHB4O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDApO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgei1pbmRleDogMTA7XG59XG5cbi5TZXF1ZW5jZVBsYXksXG4uU2VxdWVuY2VQbGF5RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwTmV4dCxcbi5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwTmV4dEhpZ2hsaWdodCxcbi5TZXF1ZW5jZVN0ZXBQcmV2LFxuLlNlcXVlbmNlU3RlcFByZXZEaXNhYmxlZCxcbi5TZXF1ZW5jZVN0ZXBQcmV2SGlnaGxpZ2h0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IGF1dG87XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLlNlcXVlbmNlUGxheSxcbi5TZXF1ZW5jZVBsYXlEaXNhYmxlZCxcbi5TZXF1ZW5jZVN0ZXBOZXh0LFxuLlNlcXVlbmNlU3RlcE5leHREaXNhYmxlZCxcbi5TZXF1ZW5jZVN0ZXBQcmV2LFxuLlNlcXVlbmNlU3RlcFByZXZEaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgzNiwgMzcsIDQwLCAwLjMpO1xufVxuXG4uU2VxdWVuY2VTdGVwTmV4dEhpZ2hsaWdodCxcbi5TZXF1ZW5jZVN0ZXBQcmV2SGlnaGxpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDM2LCAzNywgNDAsIDAuNik7XG59XG5cbi5TZXF1ZW5jZVN0ZXBOZXh0LFxuLlNlcXVlbmNlU3RlcE5leHREaXNhYmxlZCxcbi5TZXF1ZW5jZVN0ZXBOZXh0SGlnaGxpZ2h0IHtcbiAgICBvcmRlcjogMjtcbn1cblxuLlNlcXVlbmNlU3RlcFByZXYsXG4uU2VxdWVuY2VTdGVwUHJldkRpc2FibGVkLFxuLlNlcXVlbmNlU3RlcFByZXZIaWdobGlnaHQge1xuICAgIG9yZGVyOiAwO1xufVxuXG4uU2VxdWVuY2VQbGF5LFxuLlNlcXVlbmNlUGxheURpc2FibGVkIHtcbiAgICBvcmRlcjogMTtcbn1cblxuLlNlcXVlbmNlUGxheTpob3Zlcixcbi5TZXF1ZW5jZVN0ZXBOZXh0OmhvdmVyLFxuLlNlcXVlbmNlU3RlcE5leHRIaWdobGlnaHQ6aG92ZXIsXG4uU2VxdWVuY2VTdGVwUHJldjpob3Zlcixcbi5TZXF1ZW5jZVN0ZXBQcmV2SGlnaGxpZ2h0OmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY3Vyc29yOiBoYW5kO1xufVxuXG4uU2VxdWVuY2VTdGVwTmV4dCxcbi5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwTmV4dEhpZ2hsaWdodCB7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEwMHB4O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxMDBweDtcbn1cblxuLlNlcXVlbmNlU3RlcFByZXYsXG4uU2VxdWVuY2VTdGVwUHJldkRpc2FibGVkLFxuLlNlcXVlbmNlU3RlcFByZXZIaWdobGlnaHQge1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEwMHB4O1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwMHB4O1xufVxuXG4uUGxheS5TZXF1ZW5jZUNvbXBvbmVudEljb24sXG4uUGxheURpc2FibGVkLlNlcXVlbmNlQ29tcG9uZW50SWNvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL3N0ZXBwZXItcGxheS5zdmcnKTtcbn1cblxuLlN0b3AuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlN0b3BEaXNhYmxlZC5TZXF1ZW5jZUNvbXBvbmVudEljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi9zdGVwcGVyLXN0b3Auc3ZnJyk7XG59XG5cbi5TZXF1ZW5jZVN0ZXBQcmV2IC5TZXF1ZW5jZUNvbXBvbmVudEljb24sXG4uU2VxdWVuY2VTdGVwUHJldkRpc2FibGVkIC5TZXF1ZW5jZUNvbXBvbmVudEljb24sXG4uU2VxdWVuY2VTdGVwUHJldkhpZ2hsaWdodCAuU2VxdWVuY2VDb21wb25lbnRJY29uIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4vc3RlcHBlci1sZWZ0LnN2ZycpO1xufVxuXG4uU2VxdWVuY2VTdGVwTmV4dCAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcE5leHREaXNhYmxlZCAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcE5leHRIaWdobGlnaHQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL3N0ZXBwZXItcmlnaHQuc3ZnJyk7XG59XG5cbi5QbGF5RGlzYWJsZWQuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcE5leHREaXNhYmxlZCAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcFByZXZEaXNhYmxlZCAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlN0b3BEaXNhYmxlZC5TZXF1ZW5jZUNvbXBvbmVudEljb24ge1xuICAgIG9wYWNpdHk6IDAuMzU7XG59XG5cbi5TZXF1ZW5jZUNvbXBvbmVudEljb24ge1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHdpZHRoOiA1MCU7XG4gICAgcGFkZGluZy1ib3R0b206IDUwJTtcbn1cblxuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgICAuU2VxdWVuY2VQbGF5OmhvdmVyLFxuICAgIC5TZXF1ZW5jZVN0ZXBQcmV2OmhvdmVyLFxuICAgIC5TZXF1ZW5jZVN0ZXBOZXh0OmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzNiwgMzcsIDQwLCAwLjYpO1xuICAgIH1cbn1cbi5TbGlkZXJXcmFwcGVyIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogNDBweDtcbiAgICBsZWZ0OiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6IDIwO1xufVxuXG4uU2xpZGVyQ29udHJvbCB7XG4gICAgbWF4LXdpZHRoOiA2MCU7XG4gICAgcGFkZGluZzogNHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgbWFyZ2luVG9wOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjApO1xuICAgIGJhY2tncm91bmQtY2xpcDogJ2NvbnRlbnQtYm94JztcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLlNsaWRlckNvbnRyb2w6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgYmFja2dyb3VuZDogIzQ3NEE0RTtcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAwcHggcmdiYSgwLDAsMCwwLjUwKTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi5TbGlkZXJDb250cm9sOjotbW96LXJhbmdlLXRodW1iIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgYmFja2dyb3VuZDogIzQ3NEE0RTtcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAwcHggcmdiYSgwLDAsMCwwLjUwKTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xufVxuXG4uU2xpZGVyQ29udHJvbDo6LW1zLXRyYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50OyAgICBcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIG1heC13aWR0aDogNjAlO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsgICAgXG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi5TbGlkZXJDb250cm9sOjotbXMtdGh1bWIge1xuICAgIGJhY2tncm91bmQ6ICM0NzRBNEU7XG4gICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggMHB4IHJnYmEoMCwwLDAsMC41MCk7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIHdpZHRoOiAyMnB4O1xufVxuXG4uU2xpZGVyQ29udHJvbDo6LW1zLWZpbGwtbG93ZXIsXG4uU2xpZGVyQ29udHJvbDo6LW1zLWZpbGwtdXBwZXIsXG4uU2xpZGVyQ29udHJvbDo6LW1zLXRvb2x0aXAge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5TbGlkZXJDb250cm9sOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xufVxuLm1hcGlsbGFyeS1qcy5jb21wb25lbnQtdGFnLWNyZWF0ZSAubWFwaWxsYXJ5LWpzLWludGVyYWN0aXZlLFxuLm1hcGlsbGFyeS1qcy5jb21wb25lbnQtdGFnLWVkaXQtY3Jvc3NoYWlyIC5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmUge1xuICAgIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuXG4ubWFwaWxsYXJ5LWpzLmNvbXBvbmVudC10YWctZWRpdC1tb3ZlIC5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmUge1xuICAgIGN1cnNvcjogbW92ZTtcbn1cblxuLm1hcGlsbGFyeS1qcy5jb21wb25lbnQtdGFnLWVkaXQtbmVzdy1yZXNpemUgLm1hcGlsbGFyeS1qcy1pbnRlcmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcbn1cblxuLm1hcGlsbGFyeS1qcy5jb21wb25lbnQtdGFnLWVkaXQtbndzZS1yZXNpemUgLm1hcGlsbGFyeS1qcy1pbnRlcmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cblxuLlRhZ0NvbXBsZXRlcixcbi5UYWdJbnRlcmFjdG9yLFxuLlRhZ01vdmVyLFxuLlRhZ1Jlc2l6ZXIsXG4uVGFnU3BvdEludGVyYWN0b3IsXG4uVGFnU3ltYm9sLFxuLlRhZ1ZlcnRleCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xufVxuXG4uVGFnU3ltYm9sIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5UYWdNb3Zlcixcbi5UYWdSZXNpemVyIHtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLlRhZ01vdmVyIHtcbiAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgd2lkdGg6IDE0cHg7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIG9wYWNpdHk6IDAuMjtcbiAgICBjdXJzb3I6IG1vdmU7XG59XG5cbi5UYWdNb3Zlcjpob3ZlciB7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4uVGFnUmVzaXplciB7XG4gICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuXG4uVGFnUmVzaXplcjpob3ZlciB7XG4gICAgb3BhY2l0eTogMC4zO1xufVxuXG4uVGFnVmVydGV4IHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgd2lkdGg6IDZweDtcbiAgICBoZWlnaHQ6IDZweDtcbn1cblxuLlRhZ0ludGVyYWN0b3IsXG4uVGFnQ29tcGxldGVyLFxuLlRhZ1Nwb3RJbnRlcmFjdG9yIHtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgd2lkdGg6IDE0cHg7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5UYWdJbnRlcmFjdG9yLFxuLlRhZ0NvbXBsZXRlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uVGFnU3BvdEludGVyYWN0b3Ige1xuICAgIGN1cnNvcjogbW92ZTtcbn1cblxuLlRhZ0NvbXBsZXRlciB7XG4gICAgYmFja2dyb3VuZDogbGltZWdyZWVuO1xufVxuXG4uVGFnSW50ZXJhY3RvciB7XG4gICAgYmFja2dyb3VuZDogb3JhbmdlcmVkO1xufVxuXG4uVGFnQ29tcGxldGVyOmhvdmVyLFxuLlRhZ0ludGVyYWN0b3I6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuNjtcbn1cblxuLlRhZ1Nwb3RJbnRlcmFjdG9yOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjM7XG59XG4ubWFwaWxsYXJ5LWpzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcbn1cblxuLm1hcGlsbGFyeS1qcy1pbnRlcmFjdGl2ZSB7XG4gICAgIGN1cnNvcjogZ3JhYjtcbn1cblxuLm1hcGlsbGFyeS1qcy1pbnRlcmFjdGl2ZTphY3RpdmUge1xuICAgICBjdXJzb3I6IGdyYWJiaW5nO1xufVxuXG4ubWFwaWxsYXJ5LWpzIC5tYXBpbGxhcnktanMtZG9tIHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5tYXBpbGxhcnktanMtZG9tIC5kb21SZW5kZXJlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG4iXX0= */
\ No newline at end of file
+.Attribution{background-color:rgba(0,0,0,.5);color:#fff;font-family:Arial,Helvetica,sans-serif;font-size:11px;position:absolute;bottom:0;right:0;padding:4px 2px;z-index:10}.Attribution a,.Attribution span{color:#fff;text-decoration:none;margin:0 2px 4px}.Attribution span{pointer-events:none}.Attribution a:hover{color:#35af6d}.BackgroundWrapper{background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;color:#fff;text-align:center;padding-top:30%}.Background p,.BackgroundWrapper{font-family:Helvetica,Arial,sans-serif}.Background p{position:relative;padding:5px;font-size:12px;text-shadow:0 0 5px rgba(0,0,0,.75)}.BearingIndicator{bottom:28px;height:66px;pointer-events:none;position:absolute;right:11px;width:56px;z-index:10}.BearingIndicatorBackground{opacity:.5;pointer-events:auto}.BearingIndicatorBackgroundRectangle{background:#242528;height:12px;left:23px;position:absolute;top:0;width:10px}.BearingIndicatorBackgroundCircle{background:#242528;border-radius:50%;bottom:0;height:56px;position:absolute;width:56px}.BearingIndicatorNorth{background:#fff;height:6px;left:27px;position:absolute;top:4px;width:2px}.Cover{background-color:rgba(0,0,0,.5);height:100%;width:100%;z-index:100;overflow:hidden}.Cover,.CoverBackground{bottom:0;left:0;right:0;top:0;position:absolute}.CoverBackground{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;background-position:50%;background-size:cover;margin-left:-3px;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:background-image .2s ease-in-out,-webkit-transform 5s ease-out;transition:background-image .2s ease-in-out,-webkit-transform 5s ease-out;transition:transform 5s ease-out,background-image .2s ease-in-out;transition:transform 5s ease-out,background-image .2s ease-in-out,-webkit-transform 5s ease-out;z-index:-10;margin-right:-3px}.Cover:hover .CoverBackground{-webkit-transform:scale(1.1);transform:scale(1.1)}.Cover.CoverLoading .CoverBackground{-webkit-transform:scale(1);transform:scale(1);-webkit-transition:-webkit-transform .4s ease-out;transition:-webkit-transform .4s ease-out;transition:transform .4s ease-out;transition:transform .4s ease-out,-webkit-transform .4s ease-out}.CoverBackgroundGradient{background:-webkit-gradient(linear,left top,left bottom,from(transparent),to(#000));background:linear-gradient(-180deg,transparent,#000);bottom:0;height:110px;left:0;pointer-events:none;right:0;z-index:1}.CoverBackgroundGradient,.CoverLogo{position:absolute;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.CoverLogo{background-size:cover;background:url(cover-logo.svg);bottom:30px;height:32px;left:30px;width:128px;z-index:300}@media screen and (max-width:560px){.CoverLogo{display:none}}.Cover.CoverDone>.CoverBackground{bottom:0;left:0;right:0;top:0;z-index:100}.CoverDone{visibility:hidden;opacity:0}.CoverButton{background-color:transparent;border-radius:999px;border:1px solid #fff;bottom:30px;color:#fff;font-size:14px;font-weight:300;height:34px;left:50%;letter-spacing:1px;margin-left:-70px;padding:5px 30px 7px;position:absolute;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:140px}.CoverButton:hover{background-color:#fff;color:#5d6671;cursor:pointer}.CoverButton:focus{outline:0}.CoverButtonIcon{background-size:contain;background:url(pano.svg);display:inline-block;height:60px;width:60px}.Spinner{-webkit-animation:a 3s linear infinite;animation:a 3s linear infinite;background-image:url(spinner.svg);background-repeat:no-repeat;background-size:100%;height:32px;left:50%;margin-left:-16px;margin-top:-16px;position:absolute;top:50%;width:32px}@-webkit-keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.Cover.CoverLoading .CoverBackgroundGradient,.Cover.CoverLoading .CoverButton,.Cover.CoverLoading .CoverLogo{opacity:0}.Debug{position:fixed;top:0;right:0;bottom:0;width:30em;font-size:12px;padding:1em;font-family:Input,Menlo,monospace}.Debug,.DebugButton{background-color:lime;z-index:50}.DebugButton{color:#fff;border:1px solid #fff;border-radius:2px;cursor:pointer}.DebugButtonFixed{position:absolute;bottom:2px;left:2px}.DirectionsPerspective{display:block;position:absolute;pointer-events:none;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;z-index:10}.DirectionsCircle,.DirectionsCircleDisabled,.DirectionsCircleHighlight,.DirectionsCircleSequence,.DirectionsCircleSequenceHighlight{position:absolute;border-radius:50%}.DirectionsCircle,.DirectionsCircleHighlight,.DirectionsCircleSequence,.DirectionsCircleSequenceHighlight{pointer-events:auto}.DirectionsCircle:hover,.DirectionsCircleHighlight:hover,.DirectionsCircleSequence:hover,.DirectionsCircleSequenceHighlight:hover{cursor:pointer}.DirectionsCircle,.DirectionsCircleSequence{background:transparent}.DirectionsCircleDisabled{background:transparent;z-index:-1}.DirectionsCircleHighlight,.DirectionsCircleSequenceHighlight{background:rgba(0,0,0,.4)}.DirectionsArrowDisabled,.DirectionsArrowPano,.DirectionsArrowStep{position:absolute;top:44%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:75%;height:44.0775%;pointer-events:none}.DirectionsArrowDisabled,.DirectionsArrowStep{background:url(pointer-white.svg);background-repeat:no-repeat}.DirectionsArrowDisabled{opacity:.2;z-index:-1}.DirectionsArrowPano{background:url(pointer-wheat.svg);background-repeat:no-repeat}.TurnCircle,.TurnCircleHighlight,.TurnCircleSequence,.TurnCircleSequenceHighlight{position:absolute;border-radius:50%;pointer-events:auto}.TurnCircle,.TurnCircleSequence{background:transparent}.TurnCircleHighlight,.TurnCircleSequenceHighlight{background:rgba(0,0,0,.4)}.TurnCircle:hover,.TurnCircleHighlight:hover,.TurnCircleSequence:hover,.TurnCircleSequenceHighlight:hover{cursor:pointer}.TurnAround,.TurnLeft,.TurnRight{position:absolute;top:50%;pointer-events:none;-webkit-filter:drop-shadow(0 2px 1px rgba(0,0,0,.8));filter:drop-shadow(0 2px 1px rgba(0,0,0,.8))}.TurnLeft,.TurnRight{width:58.794%;height:70%}.TurnAround{left:50%;width:75%;height:63.2475%}.TurnLeft{left:45%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.TurnLeft,.TurnRight{background:url(turn.svg);background-repeat:no-repeat}.TurnRight{left:55%;-webkit-transform:translate(-50%,-50%) scaleX(-1);transform:translate(-50%,-50%) scaleX(-1)}.TurnAround{background:url(turn-around.svg);background-repeat:no-repeat;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}@media (hover:hover){.DirectionsCircle:hover,.DirectionsCircleSequence:hover,.TurnCircle:hover,.TurnCircleSequence:hover{background:rgba(0,0,0,.4)}}.Loading{width:100%;height:2px;z-index:20;position:absolute;top:0}.LoadingBar{height:4px;position:relative;background-color:rgba(53,175,109,.8);-webkit-transition:opacity .1s;transition:opacity .1s}.NavigationSequence,.NavigationSpatial{position:absolute;pointer-events:none;z-index:10}.NavigationSequence{top:12px;left:50%;margin-left:-40px}.NavigationSpatial{bottom:18px;left:50%;margin-left:-100px}.NavigationSpatialBottom{margin-left:40px}.Direction{width:36px;height:36px;background-size:contain;background-repeat:no-repeat;pointer-events:auto;margin:0 2px;cursor:pointer;display:inline-block;-webkit-filter:drop-shadow(0 2px 0 #000);filter:drop-shadow(0 2px 0 rgba(0,0,0,1))}.DirectionLeft,.DirectionPrev{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionNext,.DirectionRight{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgOTAsOTApIj48ZyBpZD0iYXJyb3ctdXAiIGZpbGw9IiNGRkZGRkYiPjxwYXRoIGQ9Ik04OC44ODQzODE3LDQ1LjczNzg4MDYgQzg4LjI5OTg4NTMsNDUuOTQ5NzkxNiA4Ny43NTE1NjkyLDQ2LjI4OTkyOTkgODcuMjgzMDg1Myw0Ni43NTg0MTM4IEwzMS4zNjMzOTQ3LDEwMi42NzgxMDQgQzI5LjY0NjA2MTQsMTA0LjM5NTQzOCAyOS42NTE4MzYzLDEwNy4xNzA0OTggMzEuMzY3MDAzMSwxMDguODg1NjY0IEw0MC42ODY3NDUzLDExOC4yMDU0MDcgQzQyLjQwMDM5NjcsMTE5LjkxOTA1OCA0NS4xODExMzEzLDExOS45MjIxODkgNDYuODk0MzA1MiwxMTguMjA5MDE1IEw5MC44MDA5Mjc2LDc0LjMwMjM5MjYgTDEzNC40NTA1NSwxMTcuOTUyMDE1IEMxMzYuMTY3ODgzLDExOS42NjkzNDkgMTM4Ljk0Mjk0MywxMTkuNjYzNTc0IDE0MC42NTgxMSwxMTcuOTQ4NDA3IEwxNDkuOTc3ODUyLDEwOC42Mjg2NjUgQzE1MS42OTE1MDQsMTA2LjkxNTAxMyAxNTEuNjk0NjM1LDEwNC4xMzQyNzkgMTQ5Ljk4MTQ2MSwxMDIuNDIxMTA1IEw5NC4wNjE3NzAxLDQ2LjUwMTQxNDEgQzkyLjY1NzMxMDksNDUuMDk2OTU0OSA5MC41NDU0MjMxLDQ0Ljg0NDk0NDUgODguODg0MzgxNyw0NS43Mzc4ODA2IEw4OC44ODQzODE3LDQ1LjczNzg4MDYgWiIgaWQ9IkFycm93IiA+PC9wYXRoPjxwYXRoIGQ9Ik05MCwxNzAuMTM4ODEyIEMxMzQuMjU5NDQ0LDE3MC4xMzg4MTIgMTcwLjEzODgxMiwxMzQuMjU5NDQ0IDE3MC4xMzg4MTIsOTAgQzE3MC4xMzg4MTIsNDUuNzQwNTU2MiAxMzQuMjU5NDQ0LDkuODYxMTg3ODUgOTAsOS44NjExODc4NSBDNDUuNzQwNTU2Miw5Ljg2MTE4Nzg1IDkuODYxMTg3ODUsNDUuNzQwNTU2MiA5Ljg2MTE4Nzg1LDkwIEM5Ljg2MTE4Nzg1LDEzNC4yNTk0NDQgNDUuNzQwNTU2MiwxNzAuMTM4ODEyIDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgWiBNMCw5MCBDMCw0MC4yOTQzNzI1IDQwLjI5NDM3MjUsMCA5MCwwIEMxMzkuNzA1NjI3LDAgMTgwLDQwLjI5NDM3MjUgMTgwLDkwIEMxODAsMTM5LjcwNTYyNyAxMzkuNzA1NjI3LDE4MCA5MCwxODAgQzQwLjI5NDM3MjUsMTgwIDAsMTM5LjcwNTYyNyAwLDkwIFoiIGlkPSJDaXJjbGUiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPg==")}.DirectionForward{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoMCA5MCw5MCkiPjxnIGlkPSJhcnJvdy11cCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBDODguMjk5ODg1Myw0NS45NDk3OTE2IDg3Ljc1MTU2OTIsNDYuMjg5OTI5OSA4Ny4yODMwODUzLDQ2Ljc1ODQxMzggTDMxLjM2MzM5NDcsMTAyLjY3ODEwNCBDMjkuNjQ2MDYxNCwxMDQuMzk1NDM4IDI5LjY1MTgzNjMsMTA3LjE3MDQ5OCAzMS4zNjcwMDMxLDEwOC44ODU2NjQgTDQwLjY4Njc0NTMsMTE4LjIwNTQwNyBDNDIuNDAwMzk2NywxMTkuOTE5MDU4IDQ1LjE4MTEzMTMsMTE5LjkyMjE4OSA0Ni44OTQzMDUyLDExOC4yMDkwMTUgTDkwLjgwMDkyNzYsNzQuMzAyMzkyNiBMMTM0LjQ1MDU1LDExNy45NTIwMTUgQzEzNi4xNjc4ODMsMTE5LjY2OTM0OSAxMzguOTQyOTQzLDExOS42NjM1NzQgMTQwLjY1ODExLDExNy45NDg0MDcgTDE0OS45Nzc4NTIsMTA4LjYyODY2NSBDMTUxLjY5MTUwNCwxMDYuOTE1MDEzIDE1MS42OTQ2MzUsMTA0LjEzNDI3OSAxNDkuOTgxNDYxLDEwMi40MjExMDUgTDk0LjA2MTc3MDEsNDYuNTAxNDE0MSBDOTIuNjU3MzEwOSw0NS4wOTY5NTQ5IDkwLjU0NTQyMzEsNDQuODQ0OTQ0NSA4OC44ODQzODE3LDQ1LjczNzg4MDYgTDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBaIiBpZD0iQXJyb3ciID48L3BhdGg+PHBhdGggZD0iTTkwLDE3MC4xMzg4MTIgQzEzNC4yNTk0NDQsMTcwLjEzODgxMiAxNzAuMTM4ODEyLDEzNC4yNTk0NDQgMTcwLjEzODgxMiw5MCBDMTcwLjEzODgxMiw0NS43NDA1NTYyIDEzNC4yNTk0NDQsOS44NjExODc4NSA5MCw5Ljg2MTE4Nzg1IEM0NS43NDA1NTYyLDkuODYxMTg3ODUgOS44NjExODc4NSw0NS43NDA1NTYyIDkuODYxMTg3ODUsOTAgQzkuODYxMTg3ODUsMTM0LjI1OTQ0NCA0NS43NDA1NTYyLDE3MC4xMzg4MTIgOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBaIE0wLDkwIEMwLDQwLjI5NDM3MjUgNDAuMjk0MzcyNSwwIDkwLDAgQzEzOS43MDU2MjcsMCAxODAsNDAuMjk0MzcyNSAxODAsOTAgQzE4MCwxMzkuNzA1NjI3IDEzOS43MDU2MjcsMTgwIDkwLDE4MCBDNDAuMjk0MzcyNSwxODAgMCwxMzkuNzA1NjI3IDAsOTAgWiIgaWQ9IkNpcmNsZSI+PC9wYXRoPjwvZz48L2c+PC9zdmc+")}.DirectionBackward{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoMTgwIDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionTurnleft{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDkwLDkwKSI+PGcgaWQ9ImFycm93LXVwIiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNODguODg0MzgxNyw0NS43Mzc4ODA2IEM4OC4yOTk4ODUzLDQ1Ljk0OTc5MTYgODcuNzUxNTY5Miw0Ni4yODk5Mjk5IDg3LjI4MzA4NTMsNDYuNzU4NDEzOCBMMzEuMzYzMzk0NywxMDIuNjc4MTA0IEMyOS42NDYwNjE0LDEwNC4zOTU0MzggMjkuNjUxODM2MywxMDcuMTcwNDk4IDMxLjM2NzAwMzEsMTA4Ljg4NTY2NCBMNDAuNjg2NzQ1MywxMTguMjA1NDA3IEM0Mi40MDAzOTY3LDExOS45MTkwNTggNDUuMTgxMTMxMywxMTkuOTIyMTg5IDQ2Ljg5NDMwNTIsMTE4LjIwOTAxNSBMOTAuODAwOTI3Niw3NC4zMDIzOTI2IEwxMzQuNDUwNTUsMTE3Ljk1MjAxNSBDMTM2LjE2Nzg4MywxMTkuNjY5MzQ5IDEzOC45NDI5NDMsMTE5LjY2MzU3NCAxNDAuNjU4MTEsMTE3Ljk0ODQwNyBMMTQ5Ljk3Nzg1MiwxMDguNjI4NjY1IEMxNTEuNjkxNTA0LDEwNi45MTUwMTMgMTUxLjY5NDYzNSwxMDQuMTM0Mjc5IDE0OS45ODE0NjEsMTAyLjQyMTEwNSBMOTQuMDYxNzcwMSw0Ni41MDE0MTQxIEM5Mi42NTczMTA5LDQ1LjA5Njk1NDkgOTAuNTQ1NDIzMSw0NC44NDQ5NDQ1IDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBMODguODg0MzgxNyw0NS43Mzc4ODA2IFoiIGlkPSJBcnJvdyIgPjwvcGF0aD48cGF0aCBkPSJNOTAsMTcwLjEzODgxMiBDMTM0LjI1OTQ0NCwxNzAuMTM4ODEyIDE3MC4xMzg4MTIsMTM0LjI1OTQ0NCAxNzAuMTM4ODEyLDkwIEMxNzAuMTM4ODEyLDQ1Ljc0MDU1NjIgMTM0LjI1OTQ0NCw5Ljg2MTE4Nzg1IDkwLDkuODYxMTg3ODUgQzQ1Ljc0MDU1NjIsOS44NjExODc4NSA5Ljg2MTE4Nzg1LDQ1Ljc0MDU1NjIgOS44NjExODc4NSw5MCBDOS44NjExODc4NSwxMzQuMjU5NDQ0IDQ1Ljc0MDU1NjIsMTcwLjEzODgxMiA5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIEw5MCwxNzAuMTM4ODEyIFogTTAsOTAgQzAsNDAuMjk0MzcyNSA0MC4yOTQzNzI1LDAgOTAsMCBDMTM5LjcwNTYyNywwIDE4MCw0MC4yOTQzNzI1IDE4MCw5MCBDMTgwLDEzOS43MDU2MjcgMTM5LjcwNTYyNywxODAgOTAsMTgwIEM0MC4yOTQzNzI1LDE4MCAwLDEzOS43MDU2MjcgMCw5MCBaIiBpZD0iQ2lyY2xlIj48L3BhdGg+PC9nPjwvZz48L3N2Zz4=")}.DirectionTurnright{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgOTAsOTApIj48ZyBpZD0iYXJyb3ctdXAiIGZpbGw9IiNGRkZGRkYiPjxwYXRoIGQ9Ik04OC44ODQzODE3LDQ1LjczNzg4MDYgQzg4LjI5OTg4NTMsNDUuOTQ5NzkxNiA4Ny43NTE1NjkyLDQ2LjI4OTkyOTkgODcuMjgzMDg1Myw0Ni43NTg0MTM4IEwzMS4zNjMzOTQ3LDEwMi42NzgxMDQgQzI5LjY0NjA2MTQsMTA0LjM5NTQzOCAyOS42NTE4MzYzLDEwNy4xNzA0OTggMzEuMzY3MDAzMSwxMDguODg1NjY0IEw0MC42ODY3NDUzLDExOC4yMDU0MDcgQzQyLjQwMDM5NjcsMTE5LjkxOTA1OCA0NS4xODExMzEzLDExOS45MjIxODkgNDYuODk0MzA1MiwxMTguMjA5MDE1IEw5MC44MDA5Mjc2LDc0LjMwMjM5MjYgTDEzNC40NTA1NSwxMTcuOTUyMDE1IEMxMzYuMTY3ODgzLDExOS42NjkzNDkgMTM4Ljk0Mjk0MywxMTkuNjYzNTc0IDE0MC42NTgxMSwxMTcuOTQ4NDA3IEwxNDkuOTc3ODUyLDEwOC42Mjg2NjUgQzE1MS42OTE1MDQsMTA2LjkxNTAxMyAxNTEuNjk0NjM1LDEwNC4xMzQyNzkgMTQ5Ljk4MTQ2MSwxMDIuNDIxMTA1IEw5NC4wNjE3NzAxLDQ2LjUwMTQxNDEgQzkyLjY1NzMxMDksNDUuMDk2OTU0OSA5MC41NDU0MjMxLDQ0Ljg0NDk0NDUgODguODg0MzgxNyw0NS43Mzc4ODA2IEw4OC44ODQzODE3LDQ1LjczNzg4MDYgWiIgaWQ9IkFycm93IiA+PC9wYXRoPjxwYXRoIGQ9Ik05MCwxNzAuMTM4ODEyIEMxMzQuMjU5NDQ0LDE3MC4xMzg4MTIgMTcwLjEzODgxMiwxMzQuMjU5NDQ0IDE3MC4xMzg4MTIsOTAgQzE3MC4xMzg4MTIsNDUuNzQwNTU2MiAxMzQuMjU5NDQ0LDkuODYxMTg3ODUgOTAsOS44NjExODc4NSBDNDUuNzQwNTU2Miw5Ljg2MTE4Nzg1IDkuODYxMTg3ODUsNDUuNzQwNTU2MiA5Ljg2MTE4Nzg1LDkwIEM5Ljg2MTE4Nzg1LDEzNC4yNTk0NDQgNDUuNzQwNTU2MiwxNzAuMTM4ODEyIDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgTDkwLDE3MC4xMzg4MTIgWiBNMCw5MCBDMCw0MC4yOTQzNzI1IDQwLjI5NDM3MjUsMCA5MCwwIEMxMzkuNzA1NjI3LDAgMTgwLDQwLjI5NDM3MjUgMTgwLDkwIEMxODAsMTM5LjcwNTYyNyAxMzkuNzA1NjI3LDE4MCA5MCwxODAgQzQwLjI5NDM3MjUsMTgwIDAsMTM5LjcwNTYyNyAwLDkwIFoiIGlkPSJDaXJjbGUiPjwvcGF0aD48L2c+PC9nPjwvc3ZnPg==")}.DirectionTurnaround{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwcHgiIGhlaWdodD0iMTgwcHgiIHZpZXdCb3g9IjAgMCAxODAgMTgwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IlBhZ2UtMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEzNSA5MCw5MCkiPjxnIGlkPSJhcnJvdy11cCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBDODguMjk5ODg1Myw0NS45NDk3OTE2IDg3Ljc1MTU2OTIsNDYuMjg5OTI5OSA4Ny4yODMwODUzLDQ2Ljc1ODQxMzggTDMxLjM2MzM5NDcsMTAyLjY3ODEwNCBDMjkuNjQ2MDYxNCwxMDQuMzk1NDM4IDI5LjY1MTgzNjMsMTA3LjE3MDQ5OCAzMS4zNjcwMDMxLDEwOC44ODU2NjQgTDQwLjY4Njc0NTMsMTE4LjIwNTQwNyBDNDIuNDAwMzk2NywxMTkuOTE5MDU4IDQ1LjE4MTEzMTMsMTE5LjkyMjE4OSA0Ni44OTQzMDUyLDExOC4yMDkwMTUgTDkwLjgwMDkyNzYsNzQuMzAyMzkyNiBMMTM0LjQ1MDU1LDExNy45NTIwMTUgQzEzNi4xNjc4ODMsMTE5LjY2OTM0OSAxMzguOTQyOTQzLDExOS42NjM1NzQgMTQwLjY1ODExLDExNy45NDg0MDcgTDE0OS45Nzc4NTIsMTA4LjYyODY2NSBDMTUxLjY5MTUwNCwxMDYuOTE1MDEzIDE1MS42OTQ2MzUsMTA0LjEzNDI3OSAxNDkuOTgxNDYxLDEwMi40MjExMDUgTDk0LjA2MTc3MDEsNDYuNTAxNDE0MSBDOTIuNjU3MzEwOSw0NS4wOTY5NTQ5IDkwLjU0NTQyMzEsNDQuODQ0OTQ0NSA4OC44ODQzODE3LDQ1LjczNzg4MDYgTDg4Ljg4NDM4MTcsNDUuNzM3ODgwNiBaIiBpZD0iQXJyb3ciID48L3BhdGg+PHBhdGggZD0iTTkwLDE3MC4xMzg4MTIgQzEzNC4yNTk0NDQsMTcwLjEzODgxMiAxNzAuMTM4ODEyLDEzNC4yNTk0NDQgMTcwLjEzODgxMiw5MCBDMTcwLjEzODgxMiw0NS43NDA1NTYyIDEzNC4yNTk0NDQsOS44NjExODc4NSA5MCw5Ljg2MTE4Nzg1IEM0NS43NDA1NTYyLDkuODYxMTg3ODUgOS44NjExODc4NSw0NS43NDA1NTYyIDkuODYxMTg3ODUsOTAgQzkuODYxMTg3ODUsMTM0LjI1OTQ0NCA0NS43NDA1NTYyLDE3MC4xMzg4MTIgOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBMOTAsMTcwLjEzODgxMiBaIE0wLDkwIEMwLDQwLjI5NDM3MjUgNDAuMjk0MzcyNSwwIDkwLDAgQzEzOS43MDU2MjcsMCAxODAsNDAuMjk0MzcyNSAxODAsOTAgQzE4MCwxMzkuNzA1NjI3IDEzOS43MDU2MjcsMTgwIDkwLDE4MCBDNDAuMjk0MzcyNSwxODAgMCwxMzkuNzA1NjI3IDAsOTAgWiIgaWQ9IkNpcmNsZSI+PC9wYXRoPjwvZz48L2c+PC9zdmc+")}.mapillaryjs-popup{position:absolute;left:0;top:0;pointer-events:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.mapillaryjs-popup-content,.mapillaryjs-popup-content-clean{position:relative}.mapillaryjs-popup-capture-pointer{pointer-events:auto}.mapillaryjs-popup-content{padding:5px 10px;background:#fff;border:1px solid #000;border-radius:2px}.mapillaryjs-popup-float-bottom,.mapillaryjs-popup-float-bottom-left,.mapillaryjs-popup-float-bottom-right{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.mapillaryjs-popup-float-top,.mapillaryjs-popup-float-top-left,.mapillaryjs-popup-float-top-right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.mapillaryjs-popup-float-left{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.mapillaryjs-popup-float-right{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mapillaryjs-popup-tip,.mapillaryjs-popup-tip-inner{position:relative;z-index:1;width:0;height:0;border:7px solid transparent}.mapillaryjs-popup-float-top .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-top-color:#000;border-bottom:none}.mapillaryjs-popup-float-top .mapillaryjs-popup-tip-inner{position:relative;top:-8px;left:-7px;border-top-color:#fff;border-bottom:none}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-tip{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;border-top-color:#000;border-bottom:none;border-left:none}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-tip-inner{position:relative;top:-9px;left:1px;border-top-color:#fff;border-bottom:none;border-left:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-tip{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;border-top-color:#000;border-bottom:none;border-right:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-tip-inner{position:relative;top:-9px;left:-8px;border-top-color:#fff;border-bottom:none;border-right:none}.mapillaryjs-popup-float-bottom .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-top:none;border-bottom-color:#000}.mapillaryjs-popup-float-bottom .mapillaryjs-popup-tip-inner{position:relative;bottom:-1px;left:-7px;border-top:none;border-bottom-color:#fff}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-tip{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;border-bottom-color:#000;border-top:none;border-left:none}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-tip-inner{position:relative;bottom:-2px;left:1px;border-bottom-color:#fff;border-top:none;border-left:none}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-tip{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;border-bottom-color:#000;border-top:none;border-right:none}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-tip-inner{position:relative;bottom:-2px;left:-8px;border-bottom-color:#fff;border-top:none;border-right:none}.mapillaryjs-popup-float-left .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-left-color:#000;border-right:none}.mapillaryjs-popup-float-left .mapillaryjs-popup-tip-inner{position:relative;top:-7px;left:-8px;border-left-color:#fff;border-right:none}.mapillaryjs-popup-float-right .mapillaryjs-popup-tip{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;border-right-color:#000;border-left:none}.mapillaryjs-popup-float-right .mapillaryjs-popup-tip-inner{position:relative;top:-7px;left:1px;border-right-color:#fff;border-left:none}.mapillaryjs-popup-float-top-left .mapillaryjs-popup-content{border-bottom-right-radius:0}.mapillaryjs-popup-float-top-right .mapillaryjs-popup-content{border-bottom-left-radius:0}.mapillaryjs-popup-float-bottom-left .mapillaryjs-popup-content{border-top-right-radius:0}.mapillaryjs-popup-float-bottom-right .mapillaryjs-popup-content{border-top-left-radius:0}.RouteFrame{background-color:rgba(0,0,0,.5);outline:1px solid hsla(0,0%,100%,.5);width:80%;height:40px;text-align:center;color:#fff;margin:0 auto;position:absolute;z-index:20;bottom:30%;left:10%}.RouteFrame p{margin:0;padding:10px;font-family:Helvetica,Arial,sans-serif;font-size:14px;text-shadow:0 0 5px rgba(0,0,0,.75)}.SequenceContainer{position:absolute;top:14px;pointer-events:none;font-size:0;z-index:10;width:100%}.SequenceControls,.SequenceStepper{position:absolute;left:50%;cursor:pointer}.SequenceStepper{-webkit-transform:translate(-50%);transform:translate(-50%)}.SequenceExpanderButton,.SequencePlaybackButton{display:inline-block;height:100%;pointer-events:auto}.SequenceExpanderButton{width:30.76923%;background:rgba(24,25,28,.3)}.SequenceExpanderBar{background-color:#fff;width:12.5%;border-radius:1px;height:53.33333%;position:relative;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.SequencePlaybackButton{width:0;background:rgba(24,25,28,.5);-webkit-transition:width .15s ease-out;transition:width .15s ease-out}.SequenceSpeedContainer{display:inline-block;height:100%;vertical-align:top;background:rgba(24,25,28,.5);pointer-events:auto;padding-left:3px;padding-right:3px}.SequenceSpeed{margin:0;padding:0;margin-top:7px;height:16px;cursor:pointer;outline:none;background:none;-webkit-appearance:none}.SequenceCloseIcon,.SequenceFastIcon,.SequenceFastIconGrey,.SequenceSlowIcon,.SequenceSwitchIcon{position:relative;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-size:contain;background-repeat:no-repeat;opacity:0}.SequenceFastIcon{-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-property:opacity;transition-property:opacity}.SequenceFastIcon,.SequenceFastIconGrey,.SequenceSlowIcon{width:66.66667%;height:80%}.SequenceCloseIcon,.SequenceSwitchIcon{width:44.44444%;height:53.33333%}.SequenceFastIcon{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+CiAgICAgIGZhc3QKICAgIDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgPHBhdGggZD0iTTIwLjE0ODQgMTMuNWMtMi4xNTE3IDAtMi41NDc4Ljg2Mi0zLjU2NzYgMS4zNjA1LTEuODUzMy45MDYtMy4wOTkzIDIuMDcyNi0zLjA5OTMgNC4yNjQ1IDAgMS4xNjE0LS4wMTAzIDEuODc1LS4zNzAzIDEuODc1LS42NTc1IDAtLjk5MzgtLjY5MS0xLjI5ODgtMS4yMi0uMjA4Mi4wNjktLjQyNjcuMTAxMi0uNjQ1Ny4wOTUtLjg0MzcgMC01LjQ2My0xLjY4NjctNS40NjMtMi42MjUgMC0uNTUxLjM3MDMtLjg0Ny4zNzAzLTEuNXYtLjAxYy0uMDE2NS0uNTUzNC0uMjg2Ny0xLjA2NzMtLjczMDgtMS4zOS0uNTk0My0uNDMwNS0xLjA0NC0xLjAzNS0xLjI4ODItMS43MzIzLS4xNzkyLjA4NjMtLjM3NS4xMzE1LS41NzM1LjEzMjNDMi43NzA1IDEyLjc1IDIgMTEuODczIDIgMTAuNWMwLTEuMzY5NC4yNjYtMS44NzUuNTU1Ni0xLjg3NS4zNzU0IDAgLjQ2My4xODc1LjQ2My4xODc1cy4yNTY4LS45NDEuNzc5OC0uOTQxYy4yNzEyLjAwMzcuNTE3Ny4xNjAyLjYzOS40MDU3Ljg4MDItMS4wMDk3IDIuMTU5LTEuNTY5NiAzLjQ4ODQtMS41MjcyIDUuMzcyIDAgNS43Mjk3IDMuMzc1IDcuNDA3NSAzLjM3NS42MjE0IDAgMS4xMTEtLjg5MjcgMS4xMTEtMS4xMjUgMC0uNzIwNi0zLjMzMzMtMi4wNzU3LTMuMzMzMy01LjI1IDAtLjQ5Ni4zOTM1LS43NS45MjYtLjc1LjQ2MyAwIDEuNDUxMy42MTA0IDIuMDM3IDEuNS44OTUgMS4zNTk0Ljc1OSAzIDEuODUyIDMuNzUuNDA5LjI4MDggMS40NTE4LjI2MDMgMi4yMjIuNzUuNzcwNS40ODk3IDEuMjQ2NCAxLjMwMjcgMS40ODE2IDEuNS4yMTcuMTkwMy4zNTAyLjQ2LjM3MDQuNzUgMCAuMzYxMy0uODA1MyAyLjI1LTEuODUxNiAyLjI1em0tOC44ODkgM2MtLjk5MDctLjAxODgtMS45NjY1LS4yNDg0LTIuODY0LS42NzM4LS4wNTkyLjIxOTgtLjA5MjUuNDQ2LS4wOTkuNjczOCAwIC42MjczLjQ3OTcuODY4IDIuMjIyIDEuNS4zOTE2LjEzNC43Njk3LjMwNTIgMS4xMjkzLjUxMTMuMDQwNC0uNjgzLjExNTQtMS4zNjMyLjIyNS0yLjAzODMtLjIwMDQuMDE0My0uNDAyMi4wMjctLjYxMzMuMDI3eiIgaWQ9ImEiLz4KICAgIDwvZGVmcz4KICAgIDx1c2UgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiB4bGluazpocmVmPSIjYSIvPgogIDwvc3ZnPg==")}.SequenceFastIconGrey{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgPHRpdGxlPgogICAgZmFzdAogIDwvdGl0bGU+CiAgPGRlZnM+CiAgICA8cGF0aCBkPSJNMjAuMTQ4NCAxMy41Yy0yLjE1MTcgMC0yLjU0NzguODYyLTMuNTY3NiAxLjM2MDUtMS44NTMzLjkwNi0zLjA5OTMgMi4wNzI2LTMuMDk5MyA0LjI2NDUgMCAxLjE2MTQtLjAxMDMgMS44NzUtLjM3MDMgMS44NzUtLjY1NzUgMC0uOTkzOC0uNjkxLTEuMjk4OC0xLjIyLS4yMDgyLjA2OS0uNDI2Ny4xMDEyLS42NDU3LjA5NS0uODQzNyAwLTUuNDYzLTEuNjg2Ny01LjQ2My0yLjYyNSAwLS41NTEuMzcwMy0uODQ3LjM3MDMtMS41di0uMDFjLS4wMTY1LS41NTM0LS4yODY3LTEuMDY3My0uNzMwOC0xLjM5LS41OTQzLS40MzA1LTEuMDQ0LTEuMDM1LTEuMjg4Mi0xLjczMjMtLjE3OTIuMDg2My0uMzc1LjEzMTUtLjU3MzUuMTMyM0MyLjc3MDUgMTIuNzUgMiAxMS44NzMgMiAxMC41YzAtMS4zNjk0LjI2Ni0xLjg3NS41NTU2LTEuODc1LjM3NTQgMCAuNDYzLjE4NzUuNDYzLjE4NzVzLjI1NjgtLjk0MS43Nzk4LS45NDFjLjI3MTIuMDAzNy41MTc3LjE2MDIuNjM5LjQwNTcuODgwMi0xLjAwOTcgMi4xNTktMS41Njk2IDMuNDg4NC0xLjUyNzIgNS4zNzIgMCA1LjcyOTcgMy4zNzUgNy40MDc1IDMuMzc1LjYyMTQgMCAxLjExMS0uODkyNyAxLjExMS0xLjEyNSAwLS43MjA2LTMuMzMzMy0yLjA3NTctMy4zMzMzLTUuMjUgMC0uNDk2LjM5MzUtLjc1LjkyNi0uNzUuNDYzIDAgMS40NTEzLjYxMDQgMi4wMzcgMS41Ljg5NSAxLjM1OTQuNzU5IDMgMS44NTIgMy43NS40MDkuMjgwOCAxLjQ1MTguMjYwMyAyLjIyMi43NS43NzA1LjQ4OTcgMS4yNDY0IDEuMzAyNyAxLjQ4MTYgMS41LjIxNy4xOTAzLjM1MDIuNDYuMzcwNC43NSAwIC4zNjEzLS44MDUzIDIuMjUtMS44NTE2IDIuMjV6bS04Ljg4OSAzYy0uOTkwNy0uMDE4OC0xLjk2NjUtLjI0ODQtMi44NjQtLjY3MzgtLjA1OTIuMjE5OC0uMDkyNS40NDYtLjA5OS42NzM4IDAgLjYyNzMuNDc5Ny44NjggMi4yMjIgMS41LjM5MTYuMTM0Ljc2OTcuMzA1MiAxLjEyOTMuNTExMy4wNDA0LS42ODMuMTE1NC0xLjM2MzIuMjI1LTIuMDM4My0uMjAwNC4wMTQzLS40MDIyLjAyNy0uNjEzMy4wMjd6IiBpZD0iYSIvPgogIDwvZGVmcz4KICA8dXNlIGZpbGw9IiNEN0RBREQiIGZpbGwtcnVsZT0ibm9uemVybyIgeGxpbms6aHJlZj0iI2EiLz4KPC9zdmc+")}.SequenceSlowIcon{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+CiAgICAgIHNsb3cKICAgIDwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgPHBhdGggZD0iTTE4LjkzMzcgMTMuMjIyMmwtLjc4MTYgMS44OTYzYy4zMzE3LjI1MDMgMS4zMzUgMS4xMDAyIDEuMzM1IDIuMjUxNi0uMDIyMy4zMTMtLjE1OC42MDctLjM4MTYuODI3LS4wNzY4LjA4MDMtLjE4MzQuMTI1NC0uMjk0Ni4xMjQzaC0yLjY1OGMtLjE0NTIgMC0uMjc5Ni0uMDc2Ny0uMzUzNC0uMjAxN2wtLjcxMzYtMS4yMDc0Yy0uMTIwMi0uMjAzNy0uMTQ2OC0uNDQ5Mi0uMDczLS42NzRsLjEyNDgtLjM4MDVINy40Yy4zNjEuNDIzNC41Njg4Ljk1NjMuNTg5OCAxLjUxMjUtLjAyMi4zMTMtLjE1NzcuNjA3LS4zODEzLjgyNjctLjA3NjcuMDgwNC0uMTgzNC4xMjU1LS4yOTQ2LjEyNDRINC42NTZjLS4xNDUyIDAtLjI3OTYtLjA3NjctLjM1MzUtLjIwMTdsLS43MTM2LTEuMjA3NWMtLjEyMDQtLjIwMzYtLjE0Ny0uNDQ5Mi0uMDczMi0uNjc0bC4wMDgyLS4wMjQ2Yy0uNjI5LjQ4MzItMS4zODQuNzc0Ny0yLjE3NDMuODM5Ni0uMTE5Ny4wMTc2LS4yMzg1LS4wMzcyLS4zMDMtLjEzOTctLjA2NDMtLjEwMjUtLjA2Mi0uMjMzNC4wMDU3LS4zMzM3QzMuNDI0NiAxMy40MDE1IDIuNzA4IDYuMDAyMiAxMS4zMTMgNi4wMDIyYzIuNjk0NS0uMDU5IDUuMjc1NSAxLjA4NSA3LjA0MTcgMy4xMjE3Ljc4Ni0uMjQyMiAxLjQ2NS0uNzQ2NyAxLjkyNDItMS40MjkyLjM1My0uNDUzNC45NzI0LS42MDMgMS40OTM1LS4zNjA3bDEuOTg4Ny45MjVjLjE2NDUuMDc2My4yNTk4LjI1MS4yMzUuNDMwOC0uMjAyNSAxLjQ1NTQtMS43ODg2IDMuNzY2Mi01LjA2MjUgNC41MzI0eiIgaWQ9ImEiLz4KICAgIDwvZGVmcz4KICAgIDx1c2UgZmlsbD0iI0Q3REFERCIgZmlsbC1ydWxlPSJub256ZXJvIiB4bGluazpocmVmPSIjYSIvPgogIDwvc3ZnPg==")}.SequenceSwitchIcon{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDx0aXRsZT4KICAgICAgcGxheV9kaXJlY3Rpb24KICAgIDwvdGl0bGU+CiAgICA8cGF0aCBkPSJNNiA0aDhjLjU1MjMgMCAxIC40NDc3IDEgMXMtLjQ0NzcgMS0xIDFINnYyLjA1ODRjLS4wMDM0LjE2NjgtLjExMTguMzE4Mi0uMjgxNS4zOTM0LS4xNjk4LjA3NS0uMzczLjA2MTctLjUyOC0uMDM1TC4yMTQzIDUuMzU4NEMuMDggNS4yNzcgMCA1LjE0MyAwIDVjMC0uMTQzLjA4LS4yNzcuMjE0My0uMzU4NWw0Ljk3NjItMy4wNTgzYy4xNTUtLjA5NjcuMzU4My0uMTEuNTI4LS4wMzUuMTY5OC4wNzUyLjI3OC4yMjY2LjI4MTUuMzkzNFY0em00IDZWNy45NDE2Yy4wMDM0LS4xNjY4LjExMTctLjMxODIuMjgxNS0uMzkzNC4xNjk3LS4wNzUuMzczLS4wNjE3LjUyOC4wMzVsNC45NzYyIDMuMDU4M0MxNS45MiAxMC43MjMgMTYgMTAuODU3IDE2IDExYzAgLjE0My0uMDguMjc3LS4yMTQzLjM1ODRsLTQuOTc2MiAzLjA1ODRjLS4xNTUuMDk2Ny0uMzU4Mi4xMS0uNTI4LjAzNS0uMTY5Ny0uMDc1Mi0uMjc4LS4yMjY2LS4yODE1LS4zOTM0VjEySDJjLS41NTIzIDAtMS0uNDQ3Ny0xLTFzLjQ0NzctMSAxLTFoOHoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogIDwvc3ZnPg==")}.SequenceCloseIcon{background-image:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDx0aXRsZT4KICAgICAgY2xvc2UKICAgIDwvdGl0bGU+CiAgICA8cGF0aCBkPSJNOS4yNzM0IDguMDA0N2wzLjQ0MTMgMy40NDE0Yy4yMzE1LjIyOS4zMjI3LjU2NDYuMjM5Ljg3OTMtLjA4MzguMzE0Ny0uMzI5Ni41NjA0LS42NDQzLjY0NC0uMzE0Ny4wODQtLjY1LS4wMDczLS44NzktLjIzODhMNy45ODg4IDkuMjg5bC0zLjQzNjUgMy40MzY1Yy0uMzU2LjM0Ni0uOTI0LjM0MTctMS4yNzUtLjAwOTMtLjM1MS0uMzUxLS4zNTUtLjkxOS0uMDA5LTEuMjc1bDMuNDM2Mi0zLjQzNjQtMy40NDk1LTMuNDQ5NmMtLjM0NDQtLjM1NjMtLjMzOTYtLjkyMy4wMTA4LTEuMjczNC4zNTA0LS4zNTA0LjkxNy0uMzU1MiAxLjI3MzMtLjAxMDhMNy45ODkgNi43MjA1bDMuNDU0NC0zLjQ1NDVjLjIyOTQtLjIyOTQuNTYzOC0uMzE5Ljg3NzItLjIzNS4zMTM1LjA4NC41NTgzLjMyODcuNjQyMy42NDIyLjA4MzguMzEzNC0uMDA1OC42NDc4LS4yMzUyLjg3NzJMOS4yNzM0IDguMDA0N3oiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogIDwvc3ZnPg==")}.SequenceIconVisible{opacity:1}.SequenceControlsExpanded .SequenceFastIcon{opacity:1;-webkit-transition-delay:.12s;transition-delay:.12s;-webkit-transition:.2s ease-in;transition:.2s ease-in;-webkit-transition-property:opacity;transition-property:opacity}.SequenceControlsExpanded .SequencePlaybackButton{width:69.23077%}.SequencePlayback{position:absolute;height:30px;width:405px;max-width:80%;min-width:271px;left:50%;padding-left:5px;-webkit-transform:translate(-50%);transform:translate(-50%)}.SequenceCloseButton,.SequenceFastContainer,.SequenceSlowContainer,.SequenceSwitchButton,.SequenceSwitchButtonDisabled{width:36px;height:100%;display:inline-block;pointer-events:auto;background:rgba(24,25,28,.5)}.SequenceCloseButton,.SequenceSwitchButton,.SequenceSwitchButtonDisabled{cursor:pointer}.SequencePlay,.SequencePlayDisabled,.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepNextHighlight,.SequenceStepPrev,.SequenceStepPrevDisabled,.SequenceStepPrevHighlight{display:inline-block;width:33.33333%;height:100%;pointer-events:auto}.SequencePlay,.SequencePlayDisabled,.SequenceStepNext,.SequenceStepNextDisabled,.SequenceStepPrev,.SequenceStepPrevDisabled{background:rgba(24,25,28,.3)}.SequenceStepNextHighlight,.SequenceStepPrevHighlight{background:rgba(24,25,28,.6)}.SequenceSwitchButton,.SequenceSwitchButtonDisabled{border-bottom-left-radius:8px;border-top-left-radius:8px}.SequenceCloseButton{border-bottom-right-radius:8px;border-top-right-radius:8px}.Play.SequenceComponentIcon,.PlayDisabled.SequenceComponentIcon{background-image:url(stepper-play.svg)}.Stop.SequenceComponentIcon,.StopDisabled.SequenceComponentIcon{background-image:url(stepper-stop.svg)}.SequenceStepPrev .SequenceComponentIcon,.SequenceStepPrevDisabled .SequenceComponentIcon,.SequenceStepPrevHighlight .SequenceComponentIcon{background-image:url(stepper-left.svg)}.SequenceStepNext .SequenceComponentIcon,.SequenceStepNextDisabled .SequenceComponentIcon,.SequenceStepNextHighlight .SequenceComponentIcon{background-image:url(stepper-right.svg)}.PlayDisabled.SequenceComponentIcon,.SequenceStepNextDisabled .SequenceComponentIcon,.SequenceStepPrevDisabled .SequenceComponentIcon,.SequenceSwitchButtonDisabled .SequenceSwitchIcon,.StopDisabled.SequenceComponentIcon{opacity:.35}.SequenceComponentIcon{position:relative;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:44.44444%;height:53.33333%;background-size:contain;background-repeat:no-repeat}.SequenceSpeed::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;border:2px solid #fff;background:#dee5ed;cursor:pointer;margin-top:-6px;-webkit-box-shadow:1px 2px 4px 0 rgba(0,0,0,.5);box-shadow:1px 2px 4px 0 rgba(0,0,0,.5)}.SequenceSpeed::-webkit-slider-runnable-track{height:4px;border-radius:2px;background-color:#fff}.SequenceSpeed::-moz-focus-outer{border:0}.SequenceSpeed::-moz-range-track{height:4px;border-radius:2px;background-color:#fff}.SequenceSpeed::-moz-range-thumb{width:12px;height:12px;border-radius:50%;border:2px solid #fff;background:#dee5ed;cursor:pointer;margin-top:-6px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.5)}.SequenceSpeed::-ms-track{height:2px;border-radius:2px;background-color:#fff}.SequenceSpeed::-ms-fill-lower,.SequenceSpeed::-ms-fill-upper{height:0;background:none}.SequenceSpeed::-ms-thumb{width:12px;height:12px;border-radius:50%;border:2px solid #fff;background:#dee5ed;cursor:pointer;margin-top:0;box-shadow:1px 2px 4px 0 rgba(0,0,0,.5)}.SequenceSpeed::-ms-tooltip{display:none}@media (hover:hover){.SequencePlay:hover,.SequenceStepNext:hover,.SequenceStepPrev:hover{background:rgba(24,25,28,.6)}.SequencePlayDisabled:hover,.SequenceStepNextDisabled:hover,.SequenceStepPrevDisabled:hover{background:rgba(24,25,28,.3)}.SequenceSwitchButtonDisabled:hover{background:rgba(24,25,28,.5)}.SequenceCloseButton:hover,.SequencePlaybackButton:hover,.SequenceSwitchButton:hover{background:rgba(24,25,28,.75)}}.SliderWrapper{text-align:center;position:absolute;bottom:40px;left:0;pointer-events:none;right:0;z-index:20}.SliderControl{max-width:60%;padding:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:100%;margin:0 auto;marginTop:10px;cursor:pointer;color:inherit;background-color:hsla(0,0%,100%,.2);background-clip:"content-box";border-radius:999px;-webkit-appearance:none;-moz-appearance:none;appearance:none;pointer-events:auto}.SliderControl::-webkit-slider-thumb{width:22px;height:22px;background:#474a4e;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.5);box-shadow:0 2px 4px 0 rgba(0,0,0,.5);border:2px solid #fff;border-radius:999px;-webkit-appearance:none}.SliderControl::-moz-range-thumb{width:22px;height:22px;background:#474a4e;box-shadow:0 2px 4px 0 rgba(0,0,0,.5);border:2px solid #fff;border-radius:999px;-moz-appearance:none;appearance:none}.SliderControl::-ms-track{background-color:transparent;border-color:transparent;border-radius:999px;box-sizing:border-box;color:transparent;cursor:pointer;display:block;height:30px;margin:0 auto;max-width:60%;padding:4px;pointer-events:auto;width:100%}.SliderControl::-ms-thumb{background:#474a4e;border:2px solid #fff;border-radius:999px;box-shadow:0 2px 4px 0 rgba(0,0,0,.5);height:22px;width:22px}.SliderControl::-ms-fill-lower,.SliderControl::-ms-fill-upper,.SliderControl::-ms-tooltip{display:none}.SliderControl:focus{outline:none}.mapillary-js.component-tag-create .mapillary-js-interactive,.mapillary-js.component-tag-edit-crosshair .mapillary-js-interactive{cursor:crosshair}.mapillary-js.component-tag-edit-move .mapillary-js-interactive{cursor:move}.mapillary-js.component-tag-edit-nesw-resize .mapillary-js-interactive{cursor:nesw-resize}.mapillary-js.component-tag-edit-nwse-resize .mapillary-js-interactive{cursor:nwse-resize}.TagCompleter,.TagInteractor,.TagMover,.TagResizer,.TagSpotInteractor,.TagSymbol,.TagVertex{position:absolute;left:0;top:0}.TagSymbol{cursor:pointer}.TagMover,.TagResizer,.TagSymbol{pointer-events:auto}.TagMover{border-radius:7px;width:14px;height:14px;opacity:.2;cursor:move}.TagMover:hover{opacity:.5}.TagResizer{border-radius:7px;width:14px;height:14px;opacity:0;cursor:crosshair}.TagResizer:hover{opacity:.3}.TagVertex{pointer-events:none;border-radius:3px;width:6px;height:6px}.TagCompleter,.TagInteractor,.TagSpotInteractor{pointer-events:auto;border-radius:7px;width:14px;height:14px;opacity:0}.TagCompleter,.TagInteractor{cursor:pointer}.TagSpotInteractor{cursor:move}.TagCompleter{background:#32cd32}.TagInteractor{background:#ff4500}.TagCompleter:hover,.TagInteractor:hover{opacity:.6}.TagSpotInteractor:hover{opacity:.3}.mapillary-js{background-color:#202020;position:relative;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mapillary-js-interactive{cursor:-webkit-grab;cursor:grab}.mapillary-js-interactive:active{cursor:-webkit-grabbing;cursor:grabbing}.mapillary-js .mapillary-js-dom{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mapillary-js-dom .domRenderer{pointer-events:auto}
+/*# sourceMappingURL=data:application/json;base64,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bUIsQUFDbkIsV0FBWSxBQUNaLFlBQWEsQUFDYixTQUFXLENBQ2QsQUFFRCw2QkFFSSxjQUFnQixDQUNuQixBQUVELG1CQUNJLFdBQWEsQ0FDaEIsQUFFRCxjQUNJLGtCQUFzQixDQUN6QixBQUVELGVBQ0ksa0JBQXNCLENBQ3pCLEFBRUQseUNBRUksVUFBYSxDQUNoQixBQUVELHlCQUNJLFVBQWEsQ0FDaEIsQUFDRCxjQUNJLHlCQUEwQixBQUMxQixrQkFBbUIsQUFDbkIsZ0JBQWlCLEFBQ2pCLHlDQUEyQyxDQUM5QyxBQUVELDBCQUNLLG9CQUFhLEFBQWIsV0FBYSxDQUNqQixBQUVELGlDQUNLLHdCQUFpQixBQUFqQixlQUFpQixDQUNyQixBQUVELGdDQUNJLFNBQVUsQUFDVixPQUFRLEFBQ1IsZ0JBQWlCLEFBQ2pCLG9CQUFxQixBQUNyQixrQkFBbUIsQUFDbkIsUUFBUyxBQUNULE1BQU8sQUFDUCx5QkFBa0IsQUFBbEIsc0JBQWtCLEFBQWxCLHFCQUFrQixBQUFsQixnQkFBa0IsQ0FDckIsQUFFRCwrQkFDSSxtQkFBcUIsQ0FDeEIiLCJmaWxlIjoibWFwaWxsYXJ5Lm1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuQXR0cmlidXRpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgcGFkZGluZzogNHB4IDJweDtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLkF0dHJpYnV0aW9uIGEsXG4uQXR0cmlidXRpb24gc3BhbiB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBtYXJnaW46IDAgMnB4IDRweDtcbn1cblxuLkF0dHJpYnV0aW9uIHNwYW4ge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uQXR0cmlidXRpb24gYTpob3ZlciB7XG4gICAgY29sb3I6IHJnYig1MywgMTc1LCAxMDkpO1xufVxuLkJhY2tncm91bmRXcmFwcGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZy10b3A6IDMwJTtcbn1cblxuLkJhY2tncm91bmQgcCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgdGV4dC1zaGFkb3c6IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjc1KTtcbn1cblxuLkJlYXJpbmdJbmRpY2F0b3Ige1xuICAgIGJvdHRvbTogMjhweDtcbiAgICBoZWlnaHQ6IDY2cHg7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMXB4O1xuICAgIHdpZHRoOiA1NnB4O1xuICAgIHotaW5kZXg6IDEwO1xufVxuXG4uQmVhcmluZ0luZGljYXRvckJhY2tncm91bmQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLkJlYXJpbmdJbmRpY2F0b3JCYWNrZ3JvdW5kUmVjdGFuZ2xlIHtcbiAgICBiYWNrZ3JvdW5kOiAjMjQyNTI4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICBsZWZ0OiAyM3B4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwcHg7XG59XG5cbi5CZWFyaW5nSW5kaWNhdG9yQmFja2dyb3VuZENpcmNsZSB7XG4gICAgYmFja2dyb3VuZDogIzI0MjUyODtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogNTZweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDU2cHg7XG59XG5cbi5CZWFyaW5nSW5kaWNhdG9yTm9ydGgge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGhlaWdodDogNnB4O1xuICAgIGxlZnQ6IDI3cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNHB4O1xuICAgIHdpZHRoOiAycHg7XG59XG4uQ292ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLkNvdmVyQmFja2dyb3VuZCB7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDVzIGVhc2Utb3V0LCBiYWNrZ3JvdW5kLWltYWdlIC4ycyBlYXNlLWluLW91dDtcbiAgICB6LWluZGV4OiAtMTA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1yaWdodDogLTNweDtcbn1cblxuLkNvdmVyOmhvdmVyIC5Db3ZlckJhY2tncm91bmQge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbn1cblxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJCYWNrZ3JvdW5ke1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC40cyBlYXNlLW91dDtcbn1cblxuLkNvdmVyQmFja2dyb3VuZEdyYWRpZW50IHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoLTE4MGRlZywgcmdiYSgwLDAsMCwwKSAwJSwgcmdiYSgwLDAsMCwxKSAxMDAlKTtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMTBweDtcbiAgICBsZWZ0OiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4ycyBlYXNlLWluLW91dDtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4uQ292ZXJMb2dvIHtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgIGJhY2tncm91bmQ6IHVybCguL2NvdmVyLWxvZ28uc3ZnKTtcbiAgICBib3R0b206IDMwcHg7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGxlZnQ6IDMwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgLjJzIGVhc2UtaW4tb3V0O1xuICAgIHdpZHRoOiAxMjhweDtcbiAgICB6LWluZGV4OiAzMDA7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU2MHB4KSB7XG4gIC5Db3ZlckxvZ28ge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uQ292ZXIuQ292ZXJEb25lID4gLkNvdmVyQmFja2dyb3VuZCB7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IDEwMDtcbn1cblxuLkNvdmVyRG9uZSB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5Db3ZlckJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7XG4gICAgYm90dG9tOiAzMHB4O1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBoZWlnaHQ6IDM0cHg7XG4gICAgbGVmdDogNTAlO1xuICAgIGxldHRlci1zcGFjaW5nOiAxcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC03MHB4O1xuICAgIHBhZGRpbmc6IDVweCAzMHB4IDdweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlLWluLW91dDtcbiAgICB3aWR0aDogMTQwcHg7XG59XG5cbi5Db3ZlckJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgY29sb3I6ICM1RDY2NzE7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uQ292ZXJCdXR0b246Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG59XG5cbi5Db3ZlckJ1dHRvbkljb24ge1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi9wYW5vLnN2Zyk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogNjBweDtcbiAgICB3aWR0aDogNjBweDtcbn1cblxuLlNwaW5uZXIge1xuICBhbmltYXRpb246IHJvdGF0ZSAzcyBsaW5lYXIgaW5maW5pdGU7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi9zcGlubmVyLnN2ZycpO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgbGVmdDogNTAlO1xuICBtYXJnaW4tbGVmdDogLTE2cHg7XG4gIG1hcmdpbi10b3A6IC0xNnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogMzJweDtcbn1cblxuQGtleWZyYW1lcyByb3RhdGUge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbi5Db3Zlci5Db3ZlckxvYWRpbmcgLkNvdmVyQnV0dG9uLFxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJMb2dvLFxuLkNvdmVyLkNvdmVyTG9hZGluZyAuQ292ZXJCYWNrZ3JvdW5kR3JhZGllbnQge1xuICAgIG9wYWNpdHk6IDA7XG59XG4uRGVidWcge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAzMGVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGxpbWU7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIHBhZGRpbmc6IDFlbTtcbiAgICBmb250LWZhbWlseTogSW5wdXQsIE1lbmxvLCBtb25vc3BhY2U7XG4gICAgei1pbmRleDogNTA7XG59XG5cbi5EZWJ1Z0J1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGltZTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB6LWluZGV4OiA1MDtcbn1cblxuLkRlYnVnQnV0dG9uRml4ZWQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDJweDtcbiAgICBsZWZ0OiAycHg7XG59XG4uRGlyZWN0aW9uc1BlcnNwZWN0aXZlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGUsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlLFxuLkRpcmVjdGlvbnNDaXJjbGVEaXNhYmxlZCxcbi5EaXJlY3Rpb25zQ2lyY2xlSGlnaGxpZ2h0LFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZUhpZ2hsaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGUsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlLFxuLkRpcmVjdGlvbnNDaXJjbGVIaWdobGlnaHQsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlSGlnaGxpZ2h0IHtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGU6aG92ZXIsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlOmhvdmVyLFxuLkRpcmVjdGlvbnNDaXJjbGVIaWdobGlnaHQ6aG92ZXIsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlSGlnaGxpZ2h0OmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5EaXJlY3Rpb25zQ2lyY2xlLFxuLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZSB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKTtcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGVEaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwKTtcbiAgICB6LWluZGV4OiAtMTtcbn1cblxuLkRpcmVjdGlvbnNDaXJjbGVIaWdobGlnaHQsXG4uRGlyZWN0aW9uc0NpcmNsZVNlcXVlbmNlSGlnaGxpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNCk7XG59XG5cbi5EaXJlY3Rpb25zQXJyb3dTdGVwLFxuLkRpcmVjdGlvbnNBcnJvd1Bhbm8sXG4uRGlyZWN0aW9uc0Fycm93RGlzYWJsZWQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDQ0JTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgd2lkdGg6IDc1JTtcbiAgICBoZWlnaHQ6IDQ0LjA3NzUlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uRGlyZWN0aW9uc0Fycm93U3RlcCxcbi5EaXJlY3Rpb25zQXJyb3dEaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogdXJsKC4vcG9pbnRlci13aGl0ZS5zdmcpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG5cbi5EaXJlY3Rpb25zQXJyb3dEaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC4yO1xuICAgIHotaW5kZXg6IC0xO1xufVxuXG4uRGlyZWN0aW9uc0Fycm93UGFubyB7XG4gICAgYmFja2dyb3VuZDogdXJsKC4vcG9pbnRlci13aGVhdC5zdmcpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG5cbi5UdXJuQ2lyY2xlLFxuLlR1cm5DaXJjbGVTZXF1ZW5jZSxcbi5UdXJuQ2lyY2xlSGlnaGxpZ2h0LFxuLlR1cm5DaXJjbGVTZXF1ZW5jZUhpZ2hsaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLlR1cm5DaXJjbGUsXG4uVHVybkNpcmNsZVNlcXVlbmNlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDApO1xufVxuXG4uVHVybkNpcmNsZUhpZ2hsaWdodCxcbi5UdXJuQ2lyY2xlU2VxdWVuY2VIaWdobGlnaHQge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40KTtcbn1cblxuLlR1cm5DaXJjbGU6aG92ZXIsXG4uVHVybkNpcmNsZVNlcXVlbmNlOmhvdmVyLFxuLlR1cm5DaXJjbGVIaWdobGlnaHQ6aG92ZXIsXG4uVHVybkNpcmNsZVNlcXVlbmNlSGlnaGxpZ2h0OmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5UdXJuTGVmdCxcbi5UdXJuUmlnaHQsXG4uVHVybkFyb3VuZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjgpKTtcbn1cblxuLlR1cm5MZWZ0LFxuLlR1cm5SaWdodCB7XG4gICAgd2lkdGg6IDU4Ljc5NCU7XG4gICAgaGVpZ2h0OiA3MCU7XG59XG5cbi5UdXJuQXJvdW5kIHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgd2lkdGg6IDc1JTtcbiAgICBoZWlnaHQ6IDYzLjI0NzUlO1xufVxuXG4uVHVybkxlZnQge1xuICAgIGxlZnQ6IDQ1JTtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi90dXJuLnN2Zyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cblxuLlR1cm5SaWdodCB7XG4gICAgbGVmdDogNTUlO1xuICAgIGJhY2tncm91bmQ6IHVybCguL3R1cm4uc3ZnKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlWCgtMSk7XG59XG5cbi5UdXJuQXJvdW5kIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoLi90dXJuLWFyb3VuZC5zdmcpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG5cbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XG4gICAgLkRpcmVjdGlvbnNDaXJjbGU6aG92ZXIsXG4gICAgLkRpcmVjdGlvbnNDaXJjbGVTZXF1ZW5jZTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgICB9XG5cbiAgICAuVHVybkNpcmNsZTpob3ZlcixcbiAgICAuVHVybkNpcmNsZVNlcXVlbmNlOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgIH1cbn1cbi5Mb2FkaW5nIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB6LWluZGV4OiAyMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xufVxuXG4uTG9hZGluZ0JhciB7XG4gICAgaGVpZ2h0OiA0cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTMsIDE3NSwgMTA5LCAwLjgpO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTAwbXM7XG59XG4uTmF2aWdhdGlvblNlcXVlbmNlLFxuLk5hdmlnYXRpb25TcGF0aWFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgei1pbmRleDogMTA7XG59XG5cbi5OYXZpZ2F0aW9uU2VxdWVuY2Uge1xuICAgIHRvcDogMTJweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC00MHB4O1xufVxuXG4uTmF2aWdhdGlvblNwYXRpYWwge1xuICAgIGJvdHRvbTogMThweDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMDBweDtcbn1cblxuLk5hdmlnYXRpb25TcGF0aWFsQm90dG9tIHtcbiAgICBtYXJnaW4tbGVmdDogNDBweDtcbn1cblxuLkRpcmVjdGlvbiB7XG4gICAgd2lkdGg6IDM2cHg7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIG1hcmdpbjogMHB4IDJweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCAycHggMCByZ2JhKDAsIDAsIDAsIDEpKTtcbn1cblxuLkRpcmVjdGlvblByZXYsXG4uRGlyZWN0aW9uTGVmdCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb0xUa3dJRGt3TERrd0tTSStQR2NnYVdROUltRnljbTkzTFhWd0lpQm1hV3hzUFNJalJrWkdSa1pHSWo0OGNHRjBhQ0JrUFNKTk9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRU00T0M0eU9UazRPRFV6TERRMUxqazBPVGM1TVRZZ09EY3VOelV4TlRZNU1pdzBOaTR5T0RrNU1qazVJRGczTGpJNE16QTROVE1zTkRZdU56VTROREV6T0NCTU16RXVNell6TXprME55d3hNREl1TmpjNE1UQTBJRU15T1M0Mk5EWXdOakUwTERFd05DNHpPVFUwTXpnZ01qa3VOalV4T0RNMk15d3hNRGN1TVRjd05EazRJRE14TGpNMk56QXdNekVzTVRBNExqZzROVFkyTkNCTU5EQXVOamcyTnpRMU15d3hNVGd1TWpBMU5EQTNJRU0wTWk0ME1EQXpPVFkzTERFeE9TNDVNVGt3TlRnZ05EVXVNVGd4TVRNeE15d3hNVGt1T1RJeU1UZzVJRFEyTGpnNU5ETXdOVElzTVRFNExqSXdPVEF4TlNCTU9UQXVPREF3T1RJM05pdzNOQzR6TURJek9USTJJRXd4TXpRdU5EVXdOVFVzTVRFM0xqazFNakF4TlNCRE1UTTJMakUyTnpnNE15d3hNVGt1TmpZNU16UTVJREV6T0M0NU5ESTVORE1zTVRFNUxqWTJNelUzTkNBeE5EQXVOalU0TVRFc01URTNMamswT0RRd055Qk1NVFE1TGprM056ZzFNaXd4TURndU5qSTROalkxSUVNeE5URXVOamt4TlRBMExERXdOaTQ1TVRVd01UTWdNVFV4TGpZNU5EWXpOU3d4TURRdU1UTTBNamM1SURFME9TNDVPREUwTmpFc01UQXlMalF5TVRFd05TQk1PVFF1TURZeE56Y3dNU3cwTmk0MU1ERTBNVFF4SUVNNU1pNDJOVGN6TVRBNUxEUTFMakE1TmprMU5Ea2dPVEF1TlRRMU5ESXpNU3cwTkM0NE5EUTVORFExSURnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQk1PRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUZvaUlHbGtQU0pCY25KdmR5SWdQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5PVEFzTVRjd0xqRXpPRGd4TWlCRE1UTTBMakkxT1RRME5Dd3hOekF1TVRNNE9ERXlJREUzTUM0eE16ZzRNVElzTVRNMExqSTFPVFEwTkNBeE56QXVNVE00T0RFeUxEa3dJRU14TnpBdU1UTTRPREV5TERRMUxqYzBNRFUxTmpJZ01UTTBMakkxT1RRME5DdzVMamcyTVRFNE56ZzFJRGt3TERrdU9EWXhNVGczT0RVZ1F6UTFMamMwTURVMU5qSXNPUzQ0TmpFeE9EYzROU0E1TGpnMk1URTROemcxTERRMUxqYzBNRFUxTmpJZ09TNDROakV4T0RjNE5TdzVNQ0JET1M0NE5qRXhPRGM0TlN3eE16UXVNalU1TkRRMElEUTFMamMwTURVMU5qSXNNVGN3TGpFek9EZ3hNaUE1TUN3eE56QXVNVE00T0RFeUlFdzVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRm9nVFRBc09UQWdRekFzTkRBdU1qazBNemN5TlNBME1DNHlPVFF6TnpJMUxEQWdPVEFzTUNCRE1UTTVMamN3TlRZeU55d3dJREU0TUN3ME1DNHlPVFF6TnpJMUlERTRNQ3c1TUNCRE1UZ3dMREV6T1M0M01EVTJNamNnTVRNNUxqY3dOVFl5Tnl3eE9EQWdPVEFzTVRnd0lFTTBNQzR5T1RRek56STFMREU0TUNBd0xERXpPUzQzTURVMk1qY2dNQ3c1TUNCYUlpQnBaRDBpUTJseVkyeGxJajQ4TDNCaGRHZytQQzluUGp3dlp6NDhMM04yWno0PVwiKTtcbn1cblxuLkRpcmVjdGlvbk5leHQsXG4uRGlyZWN0aW9uUmlnaHQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UZ3djSGdpSUdobGFXZG9kRDBpTVRnd2NIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBeE9EQWdNVGd3SWlCMlpYSnphVzl1UFNJeExqRWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnYVdROUlsQmhaMlV0TVNJZ1ptbHNiRDBpYm05dVpTSWdkSEpoYm5ObWIzSnRQU0p5YjNSaGRHVW9PVEFnT1RBc09UQXBJajQ4WnlCcFpEMGlZWEp5YjNjdGRYQWlJR1pwYkd3OUlpTkdSa1pHUmtZaVBqeHdZWFJvSUdROUlrMDRPQzQ0T0RRek9ERTNMRFExTGpjek56ZzRNRFlnUXpnNExqSTVPVGc0TlRNc05EVXVPVFE1TnpreE5pQTROeTQzTlRFMU5qa3lMRFEyTGpJNE9Ua3lPVGtnT0RjdU1qZ3pNRGcxTXl3ME5pNDNOVGcwTVRNNElFd3pNUzR6TmpNek9UUTNMREV3TWk0Mk56Z3hNRFFnUXpJNUxqWTBOakEyTVRRc01UQTBMak01TlRRek9DQXlPUzQyTlRFNE16WXpMREV3Tnk0eE56QTBPVGdnTXpFdU16WTNNREF6TVN3eE1EZ3VPRGcxTmpZMElFdzBNQzQyT0RZM05EVXpMREV4T0M0eU1EVTBNRGNnUXpReUxqUXdNRE01Tmpjc01URTVMamt4T1RBMU9DQTBOUzR4T0RFeE16RXpMREV4T1M0NU1qSXhPRGtnTkRZdU9EazBNekExTWl3eE1UZ3VNakE1TURFMUlFdzVNQzQ0TURBNU1qYzJMRGMwTGpNd01qTTVNallnVERFek5DNDBOVEExTlN3eE1UY3VPVFV5TURFMUlFTXhNell1TVRZM09EZ3pMREV4T1M0Mk5qa3pORGtnTVRNNExqazBNamswTXl3eE1Ua3VOall6TlRjMElERTBNQzQyTlRneE1Td3hNVGN1T1RRNE5EQTNJRXd4TkRrdU9UYzNPRFV5TERFd09DNDJNamcyTmpVZ1F6RTFNUzQyT1RFMU1EUXNNVEEyTGpreE5UQXhNeUF4TlRFdU5qazBOak0xTERFd05DNHhNelF5TnprZ01UUTVMams0TVRRMk1Td3hNREl1TkRJeE1UQTFJRXc1TkM0d05qRTNOekF4TERRMkxqVXdNVFF4TkRFZ1F6a3lMalkxTnpNeE1Ea3NORFV1TURrMk9UVTBPU0E1TUM0MU5EVTBNak14TERRMExqZzBORGswTkRVZ09EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRXc0T0M0NE9EUXpPREUzTERRMUxqY3pOemc0TURZZ1dpSWdhV1E5SWtGeWNtOTNJaUErUEM5d1lYUm9Qanh3WVhSb0lHUTlJazA1TUN3eE56QXVNVE00T0RFeUlFTXhNelF1TWpVNU5EUTBMREUzTUM0eE16ZzRNVElnTVRjd0xqRXpPRGd4TWl3eE16UXVNalU1TkRRMElERTNNQzR4TXpnNE1USXNPVEFnUXpFM01DNHhNemc0TVRJc05EVXVOelF3TlRVMk1pQXhNelF1TWpVNU5EUTBMRGt1T0RZeE1UZzNPRFVnT1RBc09TNDROakV4T0RjNE5TQkRORFV1TnpRd05UVTJNaXc1TGpnMk1URTROemcxSURrdU9EWXhNVGczT0RVc05EVXVOelF3TlRVMk1pQTVMamcyTVRFNE56ZzFMRGt3SUVNNUxqZzJNVEU0TnpnMUxERXpOQzR5TlRrME5EUWdORFV1TnpRd05UVTJNaXd4TnpBdU1UTTRPREV5SURrd0xERTNNQzR4TXpnNE1USWdURGt3TERFM01DNHhNemc0TVRJZ1REa3dMREUzTUM0eE16ZzRNVElnV2lCTk1DdzVNQ0JETUN3ME1DNHlPVFF6TnpJMUlEUXdMakk1TkRNM01qVXNNQ0E1TUN3d0lFTXhNemt1TnpBMU5qSTNMREFnTVRnd0xEUXdMakk1TkRNM01qVWdNVGd3TERrd0lFTXhPREFzTVRNNUxqY3dOVFl5TnlBeE16a3VOekExTmpJM0xERTRNQ0E1TUN3eE9EQWdRelF3TGpJNU5ETTNNalVzTVRnd0lEQXNNVE01TGpjd05UWXlOeUF3TERrd0lGb2lJR2xrUFNKRGFYSmpiR1VpUGp3dmNHRjBhRDQ4TDJjK1BDOW5Qand2YzNablBnPT1cIik7XG59XG5cbi5EaXJlY3Rpb25Gb3J3YXJkIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTUNBNU1DdzVNQ2tpUGp4bklHbGtQU0poY25KdmR5MTFjQ0lnWm1sc2JEMGlJMFpHUmtaR1JpSStQSEJoZEdnZ1pEMGlUVGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCRE9EZ3VNams1T0RnMU15dzBOUzQ1TkRrM09URTJJRGczTGpjMU1UVTJPVElzTkRZdU1qZzVPVEk1T1NBNE55NHlPRE13T0RVekxEUTJMamMxT0RReE16Z2dURE14TGpNMk16TTVORGNzTVRBeUxqWTNPREV3TkNCRE1qa3VOalEyTURZeE5Dd3hNRFF1TXprMU5ETTRJREk1TGpZMU1UZ3pOak1zTVRBM0xqRTNNRFE1T0NBek1TNHpOamN3TURNeExERXdPQzQ0T0RVMk5qUWdURFF3TGpZNE5qYzBOVE1zTVRFNExqSXdOVFF3TnlCRE5ESXVOREF3TXprMk55d3hNVGt1T1RFNU1EVTRJRFExTGpFNE1URXpNVE1zTVRFNUxqa3lNakU0T1NBME5pNDRPVFF6TURVeUxERXhPQzR5TURrd01UVWdURGt3TGpnd01Ea3lOellzTnpRdU16QXlNemt5TmlCTU1UTTBMalExTURVMUxERXhOeTQ1TlRJd01UVWdRekV6Tmk0eE5qYzRPRE1zTVRFNUxqWTJPVE0wT1NBeE16Z3VPVFF5T1RRekxERXhPUzQyTmpNMU56UWdNVFF3TGpZMU9ERXhMREV4Tnk0NU5EZzBNRGNnVERFME9TNDVOemM0TlRJc01UQTRMall5T0RZMk5TQkRNVFV4TGpZNU1UVXdOQ3d4TURZdU9URTFNREV6SURFMU1TNDJPVFEyTXpVc01UQTBMakV6TkRJM09TQXhORGt1T1RneE5EWXhMREV3TWk0ME1qRXhNRFVnVERrMExqQTJNVGMzTURFc05EWXVOVEF4TkRFME1TQkRPVEl1TmpVM016RXdPU3cwTlM0d09UWTVOVFE1SURrd0xqVTBOVFF5TXpFc05EUXVPRFEwT1RRME5TQTRPQzQ0T0RRek9ERTNMRFExTGpjek56ZzRNRFlnVERnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQmFJaUJwWkQwaVFYSnliM2NpSUQ0OEwzQmhkR2crUEhCaGRHZ2daRDBpVFRrd0xERTNNQzR4TXpnNE1USWdRekV6TkM0eU5UazBORFFzTVRjd0xqRXpPRGd4TWlBeE56QXVNVE00T0RFeUxERXpOQzR5TlRrME5EUWdNVGN3TGpFek9EZ3hNaXc1TUNCRE1UY3dMakV6T0RneE1pdzBOUzQzTkRBMU5UWXlJREV6TkM0eU5UazBORFFzT1M0NE5qRXhPRGM0TlNBNU1DdzVMamcyTVRFNE56ZzFJRU0wTlM0M05EQTFOVFl5TERrdU9EWXhNVGczT0RVZ09TNDROakV4T0RjNE5TdzBOUzQzTkRBMU5UWXlJRGt1T0RZeE1UZzNPRFVzT1RBZ1F6a3VPRFl4TVRnM09EVXNNVE0wTGpJMU9UUTBOQ0EwTlM0M05EQTFOVFl5TERFM01DNHhNemc0TVRJZ09UQXNNVGN3TGpFek9EZ3hNaUJNT1RBc01UY3dMakV6T0RneE1pQk1PVEFzTVRjd0xqRXpPRGd4TWlCYUlFMHdMRGt3SUVNd0xEUXdMakk1TkRNM01qVWdOREF1TWprME16Y3lOU3d3SURrd0xEQWdRekV6T1M0M01EVTJNamNzTUNBeE9EQXNOREF1TWprME16Y3lOU0F4T0RBc09UQWdRekU0TUN3eE16a3VOekExTmpJM0lERXpPUzQzTURVMk1qY3NNVGd3SURrd0xERTRNQ0JETkRBdU1qazBNemN5TlN3eE9EQWdNQ3d4TXprdU56QTFOakkzSURBc09UQWdXaUlnYVdROUlrTnBjbU5zWlNJK1BDOXdZWFJvUGp3dlp6NDhMMmMrUEM5emRtYytcIik7XG59XG5cbi5EaXJlY3Rpb25CYWNrd2FyZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb01UZ3dJRGt3TERrd0tTSStQR2NnYVdROUltRnljbTkzTFhWd0lpQm1hV3hzUFNJalJrWkdSa1pHSWo0OGNHRjBhQ0JrUFNKTk9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRU00T0M0eU9UazRPRFV6TERRMUxqazBPVGM1TVRZZ09EY3VOelV4TlRZNU1pdzBOaTR5T0RrNU1qazVJRGczTGpJNE16QTROVE1zTkRZdU56VTROREV6T0NCTU16RXVNell6TXprME55d3hNREl1TmpjNE1UQTBJRU15T1M0Mk5EWXdOakUwTERFd05DNHpPVFUwTXpnZ01qa3VOalV4T0RNMk15d3hNRGN1TVRjd05EazRJRE14TGpNMk56QXdNekVzTVRBNExqZzROVFkyTkNCTU5EQXVOamcyTnpRMU15d3hNVGd1TWpBMU5EQTNJRU0wTWk0ME1EQXpPVFkzTERFeE9TNDVNVGt3TlRnZ05EVXVNVGd4TVRNeE15d3hNVGt1T1RJeU1UZzVJRFEyTGpnNU5ETXdOVElzTVRFNExqSXdPVEF4TlNCTU9UQXVPREF3T1RJM05pdzNOQzR6TURJek9USTJJRXd4TXpRdU5EVXdOVFVzTVRFM0xqazFNakF4TlNCRE1UTTJMakUyTnpnNE15d3hNVGt1TmpZNU16UTVJREV6T0M0NU5ESTVORE1zTVRFNUxqWTJNelUzTkNBeE5EQXVOalU0TVRFc01URTNMamswT0RRd055Qk1NVFE1TGprM056ZzFNaXd4TURndU5qSTROalkxSUVNeE5URXVOamt4TlRBMExERXdOaTQ1TVRVd01UTWdNVFV4TGpZNU5EWXpOU3d4TURRdU1UTTBNamM1SURFME9TNDVPREUwTmpFc01UQXlMalF5TVRFd05TQk1PVFF1TURZeE56Y3dNU3cwTmk0MU1ERTBNVFF4SUVNNU1pNDJOVGN6TVRBNUxEUTFMakE1TmprMU5Ea2dPVEF1TlRRMU5ESXpNU3cwTkM0NE5EUTVORFExSURnNExqZzRORE00TVRjc05EVXVOek0zT0Rnd05pQk1PRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUZvaUlHbGtQU0pCY25KdmR5SWdQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5PVEFzTVRjd0xqRXpPRGd4TWlCRE1UTTBMakkxT1RRME5Dd3hOekF1TVRNNE9ERXlJREUzTUM0eE16ZzRNVElzTVRNMExqSTFPVFEwTkNBeE56QXVNVE00T0RFeUxEa3dJRU14TnpBdU1UTTRPREV5TERRMUxqYzBNRFUxTmpJZ01UTTBMakkxT1RRME5DdzVMamcyTVRFNE56ZzFJRGt3TERrdU9EWXhNVGczT0RVZ1F6UTFMamMwTURVMU5qSXNPUzQ0TmpFeE9EYzROU0E1TGpnMk1URTROemcxTERRMUxqYzBNRFUxTmpJZ09TNDROakV4T0RjNE5TdzVNQ0JET1M0NE5qRXhPRGM0TlN3eE16UXVNalU1TkRRMElEUTFMamMwTURVMU5qSXNNVGN3TGpFek9EZ3hNaUE1TUN3eE56QXVNVE00T0RFeUlFdzVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRm9nVFRBc09UQWdRekFzTkRBdU1qazBNemN5TlNBME1DNHlPVFF6TnpJMUxEQWdPVEFzTUNCRE1UTTVMamN3TlRZeU55d3dJREU0TUN3ME1DNHlPVFF6TnpJMUlERTRNQ3c1TUNCRE1UZ3dMREV6T1M0M01EVTJNamNnTVRNNUxqY3dOVFl5Tnl3eE9EQWdPVEFzTVRnd0lFTTBNQzR5T1RRek56STFMREU0TUNBd0xERXpPUzQzTURVMk1qY2dNQ3c1TUNCYUlpQnBaRDBpUTJseVkyeGxJajQ4TDNCaGRHZytQQzluUGp3dlp6NDhMM04yWno0PVwiKTtcbn1cblxuLkRpcmVjdGlvblR1cm5sZWZ0IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTFRRMUlEa3dMRGt3S1NJK1BHY2dhV1E5SW1GeWNtOTNMWFZ3SWlCbWFXeHNQU0lqUmtaR1JrWkdJajQ4Y0dGMGFDQmtQU0pOT0RndU9EZzBNemd4Tnl3ME5TNDNNemM0T0RBMklFTTRPQzR5T1RrNE9EVXpMRFExTGprME9UYzVNVFlnT0RjdU56VXhOVFk1TWl3ME5pNHlPRGs1TWprNUlEZzNMakk0TXpBNE5UTXNORFl1TnpVNE5ERXpPQ0JNTXpFdU16WXpNemswTnl3eE1ESXVOamM0TVRBMElFTXlPUzQyTkRZd05qRTBMREV3TkM0ek9UVTBNemdnTWprdU5qVXhPRE0yTXl3eE1EY3VNVGN3TkRrNElETXhMak0yTnpBd016RXNNVEE0TGpnNE5UWTJOQ0JNTkRBdU5qZzJOelExTXl3eE1UZ3VNakExTkRBM0lFTTBNaTQwTURBek9UWTNMREV4T1M0NU1Ua3dOVGdnTkRVdU1UZ3hNVE14TXl3eE1Ua3VPVEl5TVRnNUlEUTJMamc1TkRNd05USXNNVEU0TGpJd09UQXhOU0JNT1RBdU9EQXdPVEkzTml3M05DNHpNREl6T1RJMklFd3hNelF1TkRVd05UVXNNVEUzTGprMU1qQXhOU0JETVRNMkxqRTJOemc0TXl3eE1Ua3VOalk1TXpRNUlERXpPQzQ1TkRJNU5ETXNNVEU1TGpZMk16VTNOQ0F4TkRBdU5qVTRNVEVzTVRFM0xqazBPRFF3TnlCTU1UUTVMamszTnpnMU1pd3hNRGd1TmpJNE5qWTFJRU14TlRFdU5qa3hOVEEwTERFd05pNDVNVFV3TVRNZ01UVXhMalk1TkRZek5Td3hNRFF1TVRNME1qYzVJREUwT1M0NU9ERTBOakVzTVRBeUxqUXlNVEV3TlNCTU9UUXVNRFl4Tnpjd01TdzBOaTQxTURFME1UUXhJRU01TWk0Mk5UY3pNVEE1TERRMUxqQTVOamsxTkRrZ09UQXVOVFExTkRJek1TdzBOQzQ0TkRRNU5EUTFJRGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCTU9EZ3VPRGcwTXpneE55dzBOUzQzTXpjNE9EQTJJRm9pSUdsa1BTSkJjbkp2ZHlJZ1Bqd3ZjR0YwYUQ0OGNHRjBhQ0JrUFNKTk9UQXNNVGN3TGpFek9EZ3hNaUJETVRNMExqSTFPVFEwTkN3eE56QXVNVE00T0RFeUlERTNNQzR4TXpnNE1USXNNVE0wTGpJMU9UUTBOQ0F4TnpBdU1UTTRPREV5TERrd0lFTXhOekF1TVRNNE9ERXlMRFExTGpjME1EVTFOaklnTVRNMExqSTFPVFEwTkN3NUxqZzJNVEU0TnpnMUlEa3dMRGt1T0RZeE1UZzNPRFVnUXpRMUxqYzBNRFUxTmpJc09TNDROakV4T0RjNE5TQTVMamcyTVRFNE56ZzFMRFExTGpjME1EVTFOaklnT1M0NE5qRXhPRGM0TlN3NU1DQkRPUzQ0TmpFeE9EYzROU3d4TXpRdU1qVTVORFEwSURRMUxqYzBNRFUxTmpJc01UY3dMakV6T0RneE1pQTVNQ3d4TnpBdU1UTTRPREV5SUV3NU1Dd3hOekF1TVRNNE9ERXlJRXc1TUN3eE56QXVNVE00T0RFeUlGb2dUVEFzT1RBZ1F6QXNOREF1TWprME16Y3lOU0EwTUM0eU9UUXpOekkxTERBZ09UQXNNQ0JETVRNNUxqY3dOVFl5Tnl3d0lERTRNQ3cwTUM0eU9UUXpOekkxSURFNE1DdzVNQ0JETVRnd0xERXpPUzQzTURVMk1qY2dNVE01TGpjd05UWXlOeXd4T0RBZ09UQXNNVGd3SUVNME1DNHlPVFF6TnpJMUxERTRNQ0F3TERFek9TNDNNRFUyTWpjZ01DdzVNQ0JhSWlCcFpEMGlRMmx5WTJ4bElqNDhMM0JoZEdnK1BDOW5Qand2Wno0OEwzTjJaejQ9XCIpO1xufVxuXG4uRGlyZWN0aW9uVHVybnJpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVGd3Y0hnaUlHaGxhV2RvZEQwaU1UZ3djSGdpSUhacFpYZENiM2c5SWpBZ01DQXhPREFnTVRnd0lpQjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEdjZ2FXUTlJbEJoWjJVdE1TSWdabWxzYkQwaWJtOXVaU0lnZEhKaGJuTm1iM0p0UFNKeWIzUmhkR1VvTkRVZ09UQXNPVEFwSWo0OFp5QnBaRDBpWVhKeWIzY3RkWEFpSUdacGJHdzlJaU5HUmtaR1JrWWlQanh3WVhSb0lHUTlJazA0T0M0NE9EUXpPREUzTERRMUxqY3pOemc0TURZZ1F6ZzRMakk1T1RnNE5UTXNORFV1T1RRNU56a3hOaUE0Tnk0M05URTFOamt5TERRMkxqSTRPVGt5T1RrZ09EY3VNamd6TURnMU15dzBOaTQzTlRnME1UTTRJRXd6TVM0ek5qTXpPVFEzTERFd01pNDJOemd4TURRZ1F6STVMalkwTmpBMk1UUXNNVEEwTGpNNU5UUXpPQ0F5T1M0Mk5URTRNell6TERFd055NHhOekEwT1RnZ016RXVNelkzTURBek1Td3hNRGd1T0RnMU5qWTBJRXcwTUM0Mk9EWTNORFV6TERFeE9DNHlNRFUwTURjZ1F6UXlMalF3TURNNU5qY3NNVEU1TGpreE9UQTFPQ0EwTlM0eE9ERXhNekV6TERFeE9TNDVNakl4T0RrZ05EWXVPRGswTXpBMU1pd3hNVGd1TWpBNU1ERTFJRXc1TUM0NE1EQTVNamMyTERjMExqTXdNak01TWpZZ1RERXpOQzQwTlRBMU5Td3hNVGN1T1RVeU1ERTFJRU14TXpZdU1UWTNPRGd6TERFeE9TNDJOamt6TkRrZ01UTTRMamswTWprME15d3hNVGt1TmpZek5UYzBJREUwTUM0Mk5UZ3hNU3d4TVRjdU9UUTROREEzSUV3eE5Ea3VPVGMzT0RVeUxERXdPQzQyTWpnMk5qVWdRekUxTVM0Mk9URTFNRFFzTVRBMkxqa3hOVEF4TXlBeE5URXVOamswTmpNMUxERXdOQzR4TXpReU56a2dNVFE1TGprNE1UUTJNU3d4TURJdU5ESXhNVEExSUV3NU5DNHdOakUzTnpBeExEUTJMalV3TVRReE5ERWdRemt5TGpZMU56TXhNRGtzTkRVdU1EazJPVFUwT1NBNU1DNDFORFUwTWpNeExEUTBMamcwTkRrME5EVWdPRGd1T0RnME16Z3hOeXcwTlM0M016YzRPREEySUV3NE9DNDRPRFF6T0RFM0xEUTFMamN6TnpnNE1EWWdXaUlnYVdROUlrRnljbTkzSWlBK1BDOXdZWFJvUGp4d1lYUm9JR1E5SWswNU1Dd3hOekF1TVRNNE9ERXlJRU14TXpRdU1qVTVORFEwTERFM01DNHhNemc0TVRJZ01UY3dMakV6T0RneE1pd3hNelF1TWpVNU5EUTBJREUzTUM0eE16ZzRNVElzT1RBZ1F6RTNNQzR4TXpnNE1USXNORFV1TnpRd05UVTJNaUF4TXpRdU1qVTVORFEwTERrdU9EWXhNVGczT0RVZ09UQXNPUzQ0TmpFeE9EYzROU0JETkRVdU56UXdOVFUyTWl3NUxqZzJNVEU0TnpnMUlEa3VPRFl4TVRnM09EVXNORFV1TnpRd05UVTJNaUE1TGpnMk1URTROemcxTERrd0lFTTVMamcyTVRFNE56ZzFMREV6TkM0eU5UazBORFFnTkRVdU56UXdOVFUyTWl3eE56QXVNVE00T0RFeUlEa3dMREUzTUM0eE16ZzRNVElnVERrd0xERTNNQzR4TXpnNE1USWdURGt3TERFM01DNHhNemc0TVRJZ1dpQk5NQ3c1TUNCRE1DdzBNQzR5T1RRek56STFJRFF3TGpJNU5ETTNNalVzTUNBNU1Dd3dJRU14TXprdU56QTFOakkzTERBZ01UZ3dMRFF3TGpJNU5ETTNNalVnTVRnd0xEa3dJRU14T0RBc01UTTVMamN3TlRZeU55QXhNemt1TnpBMU5qSTNMREU0TUNBNU1Dd3hPREFnUXpRd0xqSTVORE0zTWpVc01UZ3dJREFzTVRNNUxqY3dOVFl5TnlBd0xEa3dJRm9pSUdsa1BTSkRhWEpqYkdVaVBqd3ZjR0YwYUQ0OEwyYytQQzluUGp3dmMzWm5QZz09XCIpO1xufVxuXG4uRGlyZWN0aW9uVHVybmFyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRnd2NIZ2lJR2hsYVdkb2REMGlNVGd3Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0F4T0RBZ01UZ3dJaUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BHY2dhV1E5SWxCaFoyVXRNU0lnWm1sc2JEMGlibTl1WlNJZ2RISmhibk5tYjNKdFBTSnliM1JoZEdVb0xURXpOU0E1TUN3NU1Da2lQanhuSUdsa1BTSmhjbkp2ZHkxMWNDSWdabWxzYkQwaUkwWkdSa1pHUmlJK1BIQmhkR2dnWkQwaVRUZzRMamc0TkRNNE1UY3NORFV1TnpNM09EZ3dOaUJET0RndU1qazVPRGcxTXl3ME5TNDVORGszT1RFMklEZzNMamMxTVRVMk9USXNORFl1TWpnNU9USTVPU0E0Tnk0eU9ETXdPRFV6TERRMkxqYzFPRFF4TXpnZ1RETXhMak0yTXpNNU5EY3NNVEF5TGpZM09ERXdOQ0JETWprdU5qUTJNRFl4TkN3eE1EUXVNemsxTkRNNElESTVMalkxTVRnek5qTXNNVEEzTGpFM01EUTVPQ0F6TVM0ek5qY3dNRE14TERFd09DNDRPRFUyTmpRZ1REUXdMalk0TmpjME5UTXNNVEU0TGpJd05UUXdOeUJETkRJdU5EQXdNemsyTnl3eE1Ua3VPVEU1TURVNElEUTFMakU0TVRFek1UTXNNVEU1TGpreU1qRTRPU0EwTmk0NE9UUXpNRFV5TERFeE9DNHlNRGt3TVRVZ1REa3dMamd3TURreU56WXNOelF1TXpBeU16a3lOaUJNTVRNMExqUTFNRFUxTERFeE55NDVOVEl3TVRVZ1F6RXpOaTR4TmpjNE9ETXNNVEU1TGpZMk9UTTBPU0F4TXpndU9UUXlPVFF6TERFeE9TNDJOak0xTnpRZ01UUXdMalkxT0RFeExERXhOeTQ1TkRnME1EY2dUREUwT1M0NU56YzROVElzTVRBNExqWXlPRFkyTlNCRE1UVXhMalk1TVRVd05Dd3hNRFl1T1RFMU1ERXpJREUxTVM0Mk9UUTJNelVzTVRBMExqRXpOREkzT1NBeE5Ea3VPVGd4TkRZeExERXdNaTQwTWpFeE1EVWdURGswTGpBMk1UYzNNREVzTkRZdU5UQXhOREUwTVNCRE9USXVOalUzTXpFd09TdzBOUzR3T1RZNU5UUTVJRGt3TGpVME5UUXlNekVzTkRRdU9EUTBPVFEwTlNBNE9DNDRPRFF6T0RFM0xEUTFMamN6TnpnNE1EWWdURGc0TGpnNE5ETTRNVGNzTkRVdU56TTNPRGd3TmlCYUlpQnBaRDBpUVhKeWIzY2lJRDQ4TDNCaGRHZytQSEJoZEdnZ1pEMGlUVGt3TERFM01DNHhNemc0TVRJZ1F6RXpOQzR5TlRrME5EUXNNVGN3TGpFek9EZ3hNaUF4TnpBdU1UTTRPREV5TERFek5DNHlOVGswTkRRZ01UY3dMakV6T0RneE1pdzVNQ0JETVRjd0xqRXpPRGd4TWl3ME5TNDNOREExTlRZeUlERXpOQzR5TlRrME5EUXNPUzQ0TmpFeE9EYzROU0E1TUN3NUxqZzJNVEU0TnpnMUlFTTBOUzQzTkRBMU5UWXlMRGt1T0RZeE1UZzNPRFVnT1M0NE5qRXhPRGM0TlN3ME5TNDNOREExTlRZeUlEa3VPRFl4TVRnM09EVXNPVEFnUXprdU9EWXhNVGczT0RVc01UTTBMakkxT1RRME5DQTBOUzQzTkRBMU5UWXlMREUzTUM0eE16ZzRNVElnT1RBc01UY3dMakV6T0RneE1pQk1PVEFzTVRjd0xqRXpPRGd4TWlCTU9UQXNNVGN3TGpFek9EZ3hNaUJhSUUwd0xEa3dJRU13TERRd0xqSTVORE0zTWpVZ05EQXVNamswTXpjeU5Td3dJRGt3TERBZ1F6RXpPUzQzTURVMk1qY3NNQ0F4T0RBc05EQXVNamswTXpjeU5TQXhPREFzT1RBZ1F6RTRNQ3d4TXprdU56QTFOakkzSURFek9TNDNNRFUyTWpjc01UZ3dJRGt3TERFNE1DQkROREF1TWprME16Y3lOU3d4T0RBZ01Dd3hNemt1TnpBMU5qSTNJREFzT1RBZ1dpSWdhV1E5SWtOcGNtTnNaU0krUEM5d1lYUm9Qand2Wno0OEwyYytQQzl6ZG1jK1wiKTtcbn1cbi5tYXBpbGxhcnlqcy1wb3B1cCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50LFxuLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQtY2xlYW4ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWNhcHR1cmUtcG9pbnRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1ib3R0b20sXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQsXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLXJpZ2h0IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLFxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1sZWZ0LFxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtbGVmdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtcmlnaHQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC10aXAsXG4ubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyOiA3cHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC10b3AgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci10b3AtY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtOHB4O1xuICAgIGxlZnQ6IC03cHg7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIGJvcmRlci10b3AtY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICBib3JkZXItbGVmdDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtOXB4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjpibGFjaztcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LXRvcC1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC05cHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbSAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBibGFjaztcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbSAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm90dG9tOiAtMXB4O1xuICAgIGxlZnQ6IC03cHg7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwIHtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6YmxhY2s7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItbGVmdDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm90dG9tOiAtMnB4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjpibGFjaztcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWJvdHRvbS1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3R0b206IC0ycHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTtcbn1cblxuLm1hcGlsbGFyeWpzLXBvcHVwLWZsb2F0LWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBibGFjaztcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1sZWZ0IC5tYXBpbGxhcnlqcy1wb3B1cC10aXAtaW5uZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC03cHg7XG4gICAgbGVmdDogLThweDtcbiAgICBib3JkZXItbGVmdC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtcmlnaHQgLm1hcGlsbGFyeWpzLXBvcHVwLXRpcCB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJvcmRlci1yaWdodC1jb2xvcjogYmxhY2s7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG5cbi5tYXBpbGxhcnlqcy1wb3B1cC1mbG9hdC1yaWdodCAubWFwaWxsYXJ5anMtcG9wdXAtdGlwLWlubmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtN3B4O1xuICAgIGxlZnQ6IDFweDtcbiAgICBib3JkZXItcmlnaHQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQge1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtdG9wLXJpZ2h0IC5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLWxlZnQgLm1hcGlsbGFyeWpzLXBvcHVwLWNvbnRlbnQge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xufVxuXG4ubWFwaWxsYXJ5anMtcG9wdXAtZmxvYXQtYm90dG9tLXJpZ2h0IC5tYXBpbGxhcnlqcy1wb3B1cC1jb250ZW50IHtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuLlJvdXRlRnJhbWUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBvdXRsaW5lOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDIwO1xuICAgIGJvdHRvbTogMzAlO1xuICAgIGxlZnQ6IDEwJTtcbn1cblxuLlJvdXRlRnJhbWUgcCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIHRleHQtc2hhZG93OiAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC43NSk7XG59XG4uU2VxdWVuY2VDb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDE0cHg7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgZm9udC1zaXplOiAwO1xuICAgIHotaW5kZXg6IDEwO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uU2VxdWVuY2VTdGVwcGVyLFxuLlNlcXVlbmNlQ29udHJvbHMge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uU2VxdWVuY2VTdGVwcGVyIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAwKTtcbn1cblxuLlNlcXVlbmNlRXhwYW5kZXJCdXR0b24sXG4uU2VxdWVuY2VQbGF5YmFja0J1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLlNlcXVlbmNlRXhwYW5kZXJCdXR0b24ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgKiAxNiAvIDUyKTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0LCAyNSwgMjgsIDAuMyk7XG59XG5cbi5TZXF1ZW5jZUV4cGFuZGVyQmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogMTIuNSU7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIGhlaWdodDogY2FsYygxMDAlICogMTYgLyAzMCk7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cblxuLlNlcXVlbmNlUGxheWJhY2tCdXR0b24ge1xuICAgIHdpZHRoOiAwO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjQsIDI1LCAyOCwgMC41KTtcbiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjE1cyBlYXNlLW91dDtcbn1cblxuLlNlcXVlbmNlU3BlZWRDb250YWluZXIge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0LCAyNSwgMjgsIDAuNSk7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgcGFkZGluZy1sZWZ0OiAzcHg7XG4gICAgcGFkZGluZy1yaWdodDogM3B4O1xufVxuXG4uU2VxdWVuY2VTcGVlZCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luLXRvcDogN3B4O1xuICAgIGhlaWdodDogMTZweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLlNlcXVlbmNlRmFzdEljb24sXG4uU2VxdWVuY2VGYXN0SWNvbkdyZXksXG4uU2VxdWVuY2VTbG93SWNvbixcbi5TZXF1ZW5jZVN3aXRjaEljb24sXG4uU2VxdWVuY2VDbG9zZUljb24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgb3BhY2l0eTogMDtcbn1cblxuLlNlcXVlbmNlRmFzdEljb24ge1xuICAgIHRyYW5zaXRpb24tZGVsYXk6IDBzO1xuICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XG59XG5cbi5TZXF1ZW5jZUZhc3RJY29uLFxuLlNlcXVlbmNlRmFzdEljb25HcmV5LFxuLlNlcXVlbmNlU2xvd0ljb24ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgKiAyNCAvIDM2KTtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAqIDI0IC8gMzApO1xufVxuXG4uU2VxdWVuY2VTd2l0Y2hJY29uLFxuLlNlcXVlbmNlQ2xvc2VJY29uIHtcbiAgICB3aWR0aDogY2FsYygxMDAlICogMTYgLyAzNik7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgKiAxNiAvIDMwKTtcbn1cblxuLlNlcXVlbmNlRmFzdEljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpRaUlHaGxhV2RvZEQwaU1qUWlJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SStDaUFnSUNBOGRHbDBiR1UrQ2lBZ0lDQWdJR1poYzNRS0lDQWdJRHd2ZEdsMGJHVStDaUFnSUNBOFpHVm1jejRLSUNBZ0lDQWdQSEJoZEdnZ1pEMGlUVEl3TGpFME9EUWdNVE11TldNdE1pNHhOVEUzSURBdE1pNDFORGM0TGpnMk1pMHpMalUyTnpZZ01TNHpOakExTFRFdU9EVXpNeTQ1TURZdE15NHdPVGt6SURJdU1EY3lOaTB6TGpBNU9UTWdOQzR5TmpRMUlEQWdNUzR4TmpFMExTNHdNVEF6SURFdU9EYzFMUzR6TnpBeklERXVPRGMxTFM0Mk5UYzFJREF0TGprNU16Z3RMalk1TVMweExqSTVPRGd0TVM0eU1pMHVNakE0TWk0d05qa3RMalF5TmpjdU1UQXhNaTB1TmpRMU55NHdPVFV0TGpnME16Y2dNQzAxTGpRMk15MHhMalk0TmpjdE5TNDBOak10TWk0Mk1qVWdNQzB1TlRVeExqTTNNRE10TGpnME55NHpOekF6TFRFdU5YWXRMakF4WXkwdU1ERTJOUzB1TlRVek5DMHVNamcyTnkweExqQTJOek10TGpjek1EZ3RNUzR6T1MwdU5UazBNeTB1TkRNd05TMHhMakEwTkMweExqQXpOUzB4TGpJNE9ESXRNUzQzTXpJekxTNHhOemt5TGpBNE5qTXRMak0zTlM0eE16RTFMUzQxTnpNMUxqRXpNak5ETWk0M056QTFJREV5TGpjMUlESWdNVEV1T0RjeklESWdNVEF1TldNd0xURXVNelk1TkM0eU5qWXRNUzQ0TnpVdU5UVTFOaTB4TGpnM05TNHpOelUwSURBZ0xqUTJNeTR4T0RjMUxqUTJNeTR4T0RjMWN5NHlOVFk0TFM0NU5ERXVOemM1T0MwdU9UUXhZeTR5TnpFeUxqQXdNemN1TlRFM055NHhOakF5TGpZek9TNDBNRFUzTGpnNE1ESXRNUzR3TURrM0lESXVNVFU1TFRFdU5UWTVOaUF6TGpRNE9EUXRNUzQxTWpjeUlEVXVNemN5SURBZ05TNDNNamszSURNdU16YzFJRGN1TkRBM05TQXpMak0zTlM0Mk1qRTBJREFnTVM0eE1URXRMamc1TWpjZ01TNHhNVEV0TVM0eE1qVWdNQzB1TnpJd05pMHpMak16TXpNdE1pNHdOelUzTFRNdU16TXpNeTAxTGpJMUlEQXRMalE1Tmk0ek9UTTFMUzQzTlM0NU1qWXRMamMxTGpRMk15QXdJREV1TkRVeE15NDJNVEEwSURJdU1ETTNJREV1TlM0NE9UVWdNUzR6TlRrMExqYzFPU0F6SURFdU9EVXlJRE11TnpVdU5EQTVMakk0TURnZ01TNDBOVEU0TGpJMk1ETWdNaTR5TWpJdU56VXVOemN3TlM0ME9EazNJREV1TWpRMk5DQXhMak13TWpjZ01TNDBPREUySURFdU5TNHlNVGN1TVRrd015NHpOVEF5TGpRMkxqTTNNRFF1TnpVZ01DQXVNell4TXkwdU9EQTFNeUF5TGpJMUxURXVPRFV4TmlBeUxqSTFlbTB0T0M0NE9Ea2dNMk10TGprNU1EY3RMakF4T0RndE1TNDVOalkxTFM0eU5EZzBMVEl1T0RZMExTNDJOek00TFM0d05Ua3lMakl4T1RndExqQTVNalV1TkRRMkxTNHdPVGt1Tmpjek9DQXdJQzQyTWpjekxqUTNPVGN1T0RZNElESXVNakl5SURFdU5TNHpPVEUyTGpFek5DNDNOamszTGpNd05USWdNUzR4TWprekxqVXhNVE11TURRd05DMHVOamd6TGpFeE5UUXRNUzR6TmpNeUxqSXlOUzB5TGpBek9ETXRMakl3TURRdU1ERTBNeTB1TkRBeU1pNHdNamN0TGpZeE16TXVNREkzZWlJZ2FXUTlJbUVpTHo0S0lDQWdJRHd2WkdWbWN6NEtJQ0FnSUR4MWMyVWdabWxzYkQwaUkwWkdSaUlnWm1sc2JDMXlkV3hsUFNKdWIyNTZaWEp2SWlCNGJHbHVhenBvY21WbVBTSWpZU0l2UGdvZ0lEd3ZjM1puUGc9PScpO1xufVxuXG4uU2VxdWVuY2VGYXN0SWNvbkdyZXkge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpRaUlHaGxhV2RvZEQwaU1qUWlJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SStDaUFnUEhScGRHeGxQZ29nSUNBZ1ptRnpkQW9nSUR3dmRHbDBiR1UrQ2lBZ1BHUmxabk0rQ2lBZ0lDQThjR0YwYUNCa1BTSk5NakF1TVRRNE5DQXhNeTQxWXkweUxqRTFNVGNnTUMweUxqVTBOemd1T0RZeUxUTXVOVFkzTmlBeExqTTJNRFV0TVM0NE5UTXpMamt3TmkwekxqQTVPVE1nTWk0d056STJMVE11TURrNU15QTBMakkyTkRVZ01DQXhMakUyTVRRdExqQXhNRE1nTVM0NE56VXRMak0zTURNZ01TNDROelV0TGpZMU56VWdNQzB1T1Rrek9DMHVOamt4TFRFdU1qazRPQzB4TGpJeUxTNHlNRGd5TGpBMk9TMHVOREkyTnk0eE1ERXlMUzQyTkRVM0xqQTVOUzB1T0RRek55QXdMVFV1TkRZekxURXVOamcyTnkwMUxqUTJNeTB5TGpZeU5TQXdMUzQxTlRFdU16Y3dNeTB1T0RRM0xqTTNNRE10TVM0MWRpMHVNREZqTFM0d01UWTFMUzQxTlRNMExTNHlPRFkzTFRFdU1EWTNNeTB1TnpNd09DMHhMak01TFM0MU9UUXpMUzQwTXpBMUxURXVNRFEwTFRFdU1ETTFMVEV1TWpnNE1pMHhMamN6TWpNdExqRTNPVEl1TURnMk15MHVNemMxTGpFek1UVXRMalUzTXpVdU1UTXlNME15TGpjM01EVWdNVEl1TnpVZ01pQXhNUzQ0TnpNZ01pQXhNQzQxWXpBdE1TNHpOamswTGpJMk5pMHhMamczTlM0MU5UVTJMVEV1T0RjMUxqTTNOVFFnTUNBdU5EWXpMakU0TnpVdU5EWXpMakU0TnpWekxqSTFOamd0TGprME1TNDNOems0TFM0NU5ERmpMakkzTVRJdU1EQXpOeTQxTVRjM0xqRTJNREl1TmpNNUxqUXdOVGN1T0Rnd01pMHhMakF3T1RjZ01pNHhOVGt0TVM0MU5qazJJRE11TkRnNE5DMHhMalV5TnpJZ05TNHpOeklnTUNBMUxqY3lPVGNnTXk0ek56VWdOeTQwTURjMUlETXVNemMxTGpZeU1UUWdNQ0F4TGpFeE1TMHVPRGt5TnlBeExqRXhNUzB4TGpFeU5TQXdMUzQzTWpBMkxUTXVNek16TXkweUxqQTNOVGN0TXk0ek16TXpMVFV1TWpVZ01DMHVORGsyTGpNNU16VXRMamMxTGpreU5pMHVOelV1TkRZeklEQWdNUzQwTlRFekxqWXhNRFFnTWk0d016Y2dNUzQxTGpnNU5TQXhMak0xT1RRdU56VTVJRE1nTVM0NE5USWdNeTQzTlM0ME1Ea3VNamd3T0NBeExqUTFNVGd1TWpZd015QXlMakl5TWk0M05TNDNOekExTGpRNE9UY2dNUzR5TkRZMElERXVNekF5TnlBeExqUTRNVFlnTVM0MUxqSXhOeTR4T1RBekxqTTFNREl1TkRZdU16Y3dOQzQzTlNBd0lDNHpOakV6TFM0NE1EVXpJREl1TWpVdE1TNDROVEUySURJdU1qVjZiUzA0TGpnNE9TQXpZeTB1T1Rrd055MHVNREU0T0MweExqazJOalV0TGpJME9EUXRNaTQ0TmpRdExqWTNNemd0TGpBMU9USXVNakU1T0MwdU1Ea3lOUzQwTkRZdExqQTVPUzQyTnpNNElEQWdMall5TnpNdU5EYzVOeTQ0TmpnZ01pNHlNaklnTVM0MUxqTTVNVFl1TVRNMExqYzJPVGN1TXpBMU1pQXhMakV5T1RNdU5URXhNeTR3TkRBMExTNDJPRE11TVRFMU5DMHhMak0yTXpJdU1qSTFMVEl1TURNNE15MHVNakF3TkM0d01UUXpMUzQwTURJeUxqQXlOeTB1TmpFek15NHdNamQ2SWlCcFpEMGlZU0l2UGdvZ0lEd3ZaR1ZtY3o0S0lDQThkWE5sSUdacGJHdzlJaU5FTjBSQlJFUWlJR1pwYkd3dGNuVnNaVDBpYm05dWVtVnlieUlnZUd4cGJtczZhSEpsWmowaUkyRWlMejRLUEM5emRtYysnKTtcbn1cblxuLlNlcXVlbmNlU2xvd0ljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpRaUlHaGxhV2RvZEQwaU1qUWlJSFpwWlhkQ2IzZzlJakFnTUNBeU5DQXlOQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SStDaUFnSUNBOGRHbDBiR1UrQ2lBZ0lDQWdJSE5zYjNjS0lDQWdJRHd2ZEdsMGJHVStDaUFnSUNBOFpHVm1jejRLSUNBZ0lDQWdQSEJoZEdnZ1pEMGlUVEU0TGprek16Y2dNVE11TWpJeU1td3RMamM0TVRZZ01TNDRPVFl6WXk0ek16RTNMakkxTURNZ01TNHpNelVnTVM0eE1EQXlJREV1TXpNMUlESXVNalV4TmkwdU1ESXlNeTR6TVRNdExqRTFPQzQyTURjdExqTTRNVFl1T0RJM0xTNHdOelk0TGpBNE1ETXRMakU0TXpRdU1USTFOQzB1TWprME5pNHhNalF6YUMweUxqWTFPR010TGpFME5USWdNQzB1TWpjNU5pMHVNRGMyTnkwdU16VXpOQzB1TWpBeE4yd3RMamN4TXpZdE1TNHlNRGMwWXkwdU1USXdNaTB1TWpBek55MHVNVFEyT0MwdU5EUTVNaTB1TURjekxTNDJOelJzTGpFeU5EZ3RMak00TURWSU55NDBZeTR6TmpFdU5ESXpOQzQxTmpnNExqazFOak11TlRnNU9DQXhMalV4TWpVdExqQXlNaTR6TVRNdExqRTFOemN1TmpBM0xTNHpPREV6TGpneU5qY3RMakEzTmpjdU1EZ3dOQzB1TVRnek5DNHhNalUxTFM0eU9UUTJMakV5TkRSSU5DNDJOVFpqTFM0eE5EVXlJREF0TGpJM09UWXRMakEzTmpjdExqTTFNelV0TGpJd01UZHNMUzQzTVRNMkxURXVNakEzTldNdExqRXlNRFF0TGpJd016WXRMakUwTnkwdU5EUTVNaTB1TURjek1pMHVOamMwYkM0d01EZ3lMUzR3TWpRMll5MHVOakk1TGpRNE16SXRNUzR6T0RRdU56YzBOeTB5TGpFM05ETXVPRE01TmkwdU1URTVOeTR3TVRjMkxTNHlNemcxTFM0d016Y3lMUzR6TURNdExqRXpPVGN0TGpBMk5ETXRMakV3TWpVdExqQTJNaTB1TWpNek5DNHdNRFUzTFM0ek16TTNRek11TkRJME5pQXhNeTQwTURFMUlESXVOekE0SURZdU1EQXlNaUF4TVM0ek1UTWdOaTR3TURJeVl6SXVOamswTlMwdU1EVTVJRFV1TWpjMU5TQXhMakE0TlNBM0xqQTBNVGNnTXk0eE1qRTNMamM0TmkwdU1qUXlNaUF4TGpRMk5TMHVOelEyTnlBeExqa3lOREl0TVM0ME1qa3lMak0xTXkwdU5EVXpOQzQ1TnpJMExTNDJNRE1nTVM0ME9UTTFMUzR6TmpBM2JERXVPVGc0Tnk0NU1qVmpMakUyTkRVdU1EYzJNeTR5TlRrNExqSTFNUzR5TXpVdU5ETXdPQzB1TWpBeU5TQXhMalExTlRRdE1TNDNPRGcySURNdU56WTJNaTAxTGpBMk1qVWdOQzQxTXpJMGVpSWdhV1E5SW1FaUx6NEtJQ0FnSUR3dlpHVm1jejRLSUNBZ0lEeDFjMlVnWm1sc2JEMGlJMFEzUkVGRVJDSWdabWxzYkMxeWRXeGxQU0p1YjI1NlpYSnZJaUI0YkdsdWF6cG9jbVZtUFNJallTSXZQZ29nSUR3dmMzWm5QZz09Jyk7XG59XG5cbi5TZXF1ZW5jZVN3aXRjaEljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSFpwWlhkQ2IzZzlJakFnTUNBeE5pQXhOaUlnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajRLSUNBZ0lEeDBhWFJzWlQ0S0lDQWdJQ0FnY0d4aGVWOWthWEpsWTNScGIyNEtJQ0FnSUR3dmRHbDBiR1UrQ2lBZ0lDQThjR0YwYUNCa1BTSk5OaUEwYURoakxqVTFNak1nTUNBeElDNDBORGMzSURFZ01YTXRMalEwTnpjZ01TMHhJREZJTm5ZeUxqQTFPRFJqTFM0d01ETTBMakUyTmpndExqRXhNVGd1TXpFNE1pMHVNamd4TlM0ek9UTTBMUzR4TmprNExqQTNOUzB1TXpjekxqQTJNVGN0TGpVeU9DMHVNRE0xVEM0eU1UUXpJRFV1TXpVNE5FTXVNRGdnTlM0eU56Y2dNQ0ExTGpFME15QXdJRFZqTUMwdU1UUXpMakE0TFM0eU56Y3VNakUwTXkwdU16VTROV3cwTGprM05qSXRNeTR3TlRnell5NHhOVFV0TGpBNU5qY3VNelU0TXkwdU1URXVOVEk0TFM0d016VXVNVFk1T0M0d056VXlMakkzT0M0eU1qWTJMakk0TVRVdU16a3pORlkwZW0wMElEWldOeTQ1TkRFMll5NHdNRE0wTFM0eE5qWTRMakV4TVRjdExqTXhPREl1TWpneE5TMHVNemt6TkM0eE5qazNMUzR3TnpVdU16Y3pMUzR3TmpFM0xqVXlPQzR3TXpWc05DNDVOell5SURNdU1EVTRNME14TlM0NU1pQXhNQzQzTWpNZ01UWWdNVEF1T0RVM0lERTJJREV4WXpBZ0xqRTBNeTB1TURndU1qYzNMUzR5TVRRekxqTTFPRFJzTFRRdU9UYzJNaUF6TGpBMU9EUmpMUzR4TlRVdU1EazJOeTB1TXpVNE1pNHhNUzB1TlRJNExqQXpOUzB1TVRZNU55MHVNRGMxTWkwdU1qYzRMUzR5TWpZMkxTNHlPREUxTFM0ek9UTTBWakV5U0RKakxTNDFOVEl6SURBdE1TMHVORFEzTnkweExURnpMalEwTnpjdE1TQXhMVEZvT0hvaUlHWnBiR3c5SWlOR1JrWWlJR1pwYkd3dGNuVnNaVDBpWlhabGJtOWtaQ0l2UGdvZ0lEd3ZjM1puUGc9PScpO1xufVxuXG4uU2VxdWVuY2VDbG9zZUljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSFpwWlhkQ2IzZzlJakFnTUNBeE5pQXhOaUlnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajRLSUNBZ0lEeDBhWFJzWlQ0S0lDQWdJQ0FnWTJ4dmMyVUtJQ0FnSUR3dmRHbDBiR1UrQ2lBZ0lDQThjR0YwYUNCa1BTSk5PUzR5TnpNMElEZ3VNREEwTjJ3ekxqUTBNVE1nTXk0ME5ERTBZeTR5TXpFMUxqSXlPUzR6TWpJM0xqVTJORFl1TWpNNUxqZzNPVE10TGpBNE16Z3VNekUwTnkwdU16STVOaTQxTmpBMExTNDJORFF6TGpZME5DMHVNekUwTnk0d09EUXRMalkxTFM0d01EY3pMUzQ0TnprdExqSXpPRGhNTnk0NU9EZzRJRGt1TWpnNWJDMHpMalF6TmpVZ015NDBNelkxWXkwdU16VTJMak0wTmkwdU9USTBMak0wTVRjdE1TNHlOelV0TGpBd09UTXRMak0xTVMwdU16VXhMUzR6TlRVdExqa3hPUzB1TURBNUxURXVNamMxYkRNdU5ETTJNaTB6TGpRek5qUXRNeTQwTkRrMUxUTXVORFE1Tm1NdExqTTBORFF0TGpNMU5qTXRMak16T1RZdExqa3lNeTR3TVRBNExURXVNamN6TkM0ek5UQTBMUzR6TlRBMExqa3hOeTB1TXpVMU1pQXhMakkzTXpNdExqQXhNRGhNTnk0NU9Ea2dOaTQzTWpBMWJETXVORFUwTkMwekxqUTFORFZqTGpJeU9UUXRMakl5T1RRdU5UWXpPQzB1TXpFNUxqZzNOekl0TGpJek5TNHpNVE0xTGpBNE5DNDFOVGd6TGpNeU9EY3VOalF5TXk0Mk5ESXlMakE0TXpndU16RXpOQzB1TURBMU9DNDJORGM0TFM0eU16VXlMamczTnpKTU9TNHlOek0wSURndU1EQTBOM29pSUdacGJHdzlJaU5HUmtZaUlHWnBiR3d0Y25Wc1pUMGlaWFpsYm05a1pDSXZQZ29nSUR3dmMzWm5QZz09Jyk7XG59XG5cbi5TZXF1ZW5jZUljb25WaXNpYmxlIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uU2VxdWVuY2VDb250cm9sc0V4cGFuZGVkIC5TZXF1ZW5jZUZhc3RJY29uIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zaXRpb24tZGVsYXk6IDAuMTJzO1xuICAgIHRyYW5zaXRpb246IDAuMnMgZWFzZS1pbjtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xufVxuXG4uU2VxdWVuY2VDb250cm9sc0V4cGFuZGVkIC5TZXF1ZW5jZVBsYXliYWNrQnV0dG9uIHtcbiAgICB3aWR0aDogY2FsYygxMDAlICogMzYgLyA1Mik7XG59XG5cbi5TZXF1ZW5jZVBsYXliYWNrIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIHdpZHRoOiA0MDVweDtcbiAgICBtYXgtd2lkdGg6IDgwJTtcbiAgICBtaW4td2lkdGg6IDI3MXB4O1xuICAgIGxlZnQ6IDUwJTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAwKTtcbn1cblxuLlNlcXVlbmNlU3dpdGNoQnV0dG9uLFxuLlNlcXVlbmNlU3dpdGNoQnV0dG9uRGlzYWJsZWQsXG4uU2VxdWVuY2VTbG93Q29udGFpbmVyLFxuLlNlcXVlbmNlRmFzdENvbnRhaW5lcixcbi5TZXF1ZW5jZUNsb3NlQnV0dG9uIHtcbiAgICB3aWR0aDogMzZweDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjQsIDI1LCAyOCwgMC41KTtcbn1cblxuLlNlcXVlbmNlU3dpdGNoQnV0dG9uLFxuLlNlcXVlbmNlU3dpdGNoQnV0dG9uRGlzYWJsZWQsXG4uU2VxdWVuY2VDbG9zZUJ1dHRvbiB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uU2VxdWVuY2VQbGF5LFxuLlNlcXVlbmNlUGxheURpc2FibGVkLFxuLlNlcXVlbmNlU3RlcE5leHQsXG4uU2VxdWVuY2VTdGVwTmV4dERpc2FibGVkLFxuLlNlcXVlbmNlU3RlcE5leHRIaWdobGlnaHQsXG4uU2VxdWVuY2VTdGVwUHJldixcbi5TZXF1ZW5jZVN0ZXBQcmV2RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwUHJldkhpZ2hsaWdodCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyAzKTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5TZXF1ZW5jZVBsYXksXG4uU2VxdWVuY2VQbGF5RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwTmV4dCxcbi5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQsXG4uU2VxdWVuY2VTdGVwUHJldixcbi5TZXF1ZW5jZVN0ZXBQcmV2RGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjQsIDI1LCAyOCwgMC4zKTtcbn1cblxuLlNlcXVlbmNlU3RlcE5leHRIaWdobGlnaHQsXG4uU2VxdWVuY2VTdGVwUHJldkhpZ2hsaWdodCB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgyNCwgMjUsIDI4LCAwLjYpO1xufVxuXG4uU2VxdWVuY2VTd2l0Y2hCdXR0b24sXG4uU2VxdWVuY2VTd2l0Y2hCdXR0b25EaXNhYmxlZCB7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogOHB4O1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDhweDtcbn1cblxuLlNlcXVlbmNlQ2xvc2VCdXR0b24ge1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDtcbn1cblxuLlBsYXkuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlBsYXlEaXNhYmxlZC5TZXF1ZW5jZUNvbXBvbmVudEljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi9zdGVwcGVyLXBsYXkuc3ZnJyk7XG59XG5cbi5TdG9wLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TdG9wRGlzYWJsZWQuU2VxdWVuY2VDb21wb25lbnRJY29uIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4vc3RlcHBlci1zdG9wLnN2ZycpO1xufVxuXG4uU2VxdWVuY2VTdGVwUHJldiAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcFByZXZEaXNhYmxlZCAuU2VxdWVuY2VDb21wb25lbnRJY29uLFxuLlNlcXVlbmNlU3RlcFByZXZIaWdobGlnaHQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuL3N0ZXBwZXItbGVmdC5zdmcnKTtcbn1cblxuLlNlcXVlbmNlU3RlcE5leHQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TZXF1ZW5jZVN0ZXBOZXh0SGlnaGxpZ2h0IC5TZXF1ZW5jZUNvbXBvbmVudEljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi9zdGVwcGVyLXJpZ2h0LnN2ZycpO1xufVxuXG4uUGxheURpc2FibGVkLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TZXF1ZW5jZVN0ZXBQcmV2RGlzYWJsZWQgLlNlcXVlbmNlQ29tcG9uZW50SWNvbixcbi5TZXF1ZW5jZVN3aXRjaEJ1dHRvbkRpc2FibGVkIC5TZXF1ZW5jZVN3aXRjaEljb24sXG4uU3RvcERpc2FibGVkLlNlcXVlbmNlQ29tcG9uZW50SWNvbiB7XG4gICAgb3BhY2l0eTogMC4zNTtcbn1cblxuLlNlcXVlbmNlQ29tcG9uZW50SWNvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICB3aWR0aDogY2FsYygxMDAlICogMTYgLyAzNik7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgKiAxNiAvIDMwKTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cblxuLlNlcXVlbmNlU3BlZWQ6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgd2lkdGg6IDE2cHg7XG4gICAgaGVpZ2h0OiAxNnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICBiYWNrZ3JvdW5kOiAjZGVlNWVkO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW4tdG9wOiAtNnB4O1xuICAgIGJveC1zaGFkb3c6IDFweCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuXG4uU2VxdWVuY2VTcGVlZDo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xuICAgIGhlaWdodDogNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLlNlcXVlbmNlU3BlZWQ6Oi1tb3otZm9jdXMtb3V0ZXIge1xuICAgIGJvcmRlcjogMDtcbn1cblxuLlNlcXVlbmNlU3BlZWQ6Oi1tb3otcmFuZ2UtdHJhY2sge1xuICAgIGhlaWdodDogNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLlNlcXVlbmNlU3BlZWQ6Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgIHdpZHRoOiAxMnB4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XG4gICAgYmFja2dyb3VuZDogI2RlZTVlZDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLXRvcDogLTZweDtcbiAgICBib3gtc2hhZG93OiAxcHggMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuLlNlcXVlbmNlU3BlZWQ6Oi1tcy10cmFjayB7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4uU2VxdWVuY2VTcGVlZDo6LW1zLWZpbGwtbG93ZXIge1xuICAgIGhlaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uU2VxdWVuY2VTcGVlZDo6LW1zLWZpbGwtdXBwZXIge1xuICAgIGhlaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uU2VxdWVuY2VTcGVlZDo6LW1zLXRodW1iIHtcbiAgICB3aWR0aDogMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIHdoaXRlO1xuICAgIGJhY2tncm91bmQ6ICNkZWU1ZWQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgYm94LXNoYWRvdzogMXB4IDJweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG5cbi5TZXF1ZW5jZVNwZWVkOjotbXMtdG9vbHRpcCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgICAuU2VxdWVuY2VQbGF5OmhvdmVyLFxuICAgIC5TZXF1ZW5jZVN0ZXBQcmV2OmhvdmVyLFxuICAgIC5TZXF1ZW5jZVN0ZXBOZXh0OmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNCwgMjUsIDI4LCAwLjYpO1xuICAgIH1cblxuICAgIC5TZXF1ZW5jZVBsYXlEaXNhYmxlZDpob3ZlcixcbiAgICAuU2VxdWVuY2VTdGVwUHJldkRpc2FibGVkOmhvdmVyLFxuICAgIC5TZXF1ZW5jZVN0ZXBOZXh0RGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0LCAyNSwgMjgsIDAuMyk7XG4gICAgfVxuXG4gICAgLlNlcXVlbmNlU3dpdGNoQnV0dG9uRGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0LCAyNSwgMjgsIDAuNSk7XG4gICAgfVxuXG4gICAgLlNlcXVlbmNlUGxheWJhY2tCdXR0b246aG92ZXIsXG4gICAgLlNlcXVlbmNlU3dpdGNoQnV0dG9uOmhvdmVyLFxuICAgIC5TZXF1ZW5jZUNsb3NlQnV0dG9uOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNCwgMjUsIDI4LCAwLjc1KTtcbiAgICB9XG59XG4uU2xpZGVyV3JhcHBlciB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDQwcHg7XG4gICAgbGVmdDogMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICByaWdodDogMDtcbiAgICB6LWluZGV4OiAyMDtcbn1cblxuLlNsaWRlckNvbnRyb2wge1xuICAgIG1heC13aWR0aDogNjAlO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIG1hcmdpblRvcDogMTBweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIwKTtcbiAgICBiYWNrZ3JvdW5kLWNsaXA6ICdjb250ZW50LWJveCc7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5TbGlkZXJDb250cm9sOjotd2Via2l0LXNsaWRlci10aHVtYiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIGJhY2tncm91bmQ6ICM0NzRBNEU7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggMHB4IHJnYmEoMCwwLDAsMC41MCk7XG4gICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4uU2xpZGVyQ29udHJvbDo6LW1vei1yYW5nZS10aHVtYiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIGJhY2tncm91bmQ6ICM0NzRBNEU7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggMHB4IHJnYmEoMCwwLDAsMC41MCk7XG4gICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLlNsaWRlckNvbnRyb2w6Oi1tcy10cmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGNvbG9yOiB0cmFuc3BhcmVudDsgICAgXG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICBtYXgtd2lkdGg6IDYwJTtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87ICAgIFxuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uU2xpZGVyQ29udHJvbDo6LW1zLXRodW1iIHtcbiAgICBiYWNrZ3JvdW5kOiAjNDc0QTRFO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGJveC1zaGFkb3c6IDBweCAycHggNHB4IDBweCByZ2JhKDAsMCwwLDAuNTApO1xuICAgIGhlaWdodDogMjJweDtcbiAgICB3aWR0aDogMjJweDtcbn1cblxuLlNsaWRlckNvbnRyb2w6Oi1tcy1maWxsLWxvd2VyLFxuLlNsaWRlckNvbnRyb2w6Oi1tcy1maWxsLXVwcGVyLFxuLlNsaWRlckNvbnRyb2w6Oi1tcy10b29sdGlwIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uU2xpZGVyQ29udHJvbDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cbi5tYXBpbGxhcnktanMuY29tcG9uZW50LXRhZy1jcmVhdGUgLm1hcGlsbGFyeS1qcy1pbnRlcmFjdGl2ZSxcbi5tYXBpbGxhcnktanMuY29tcG9uZW50LXRhZy1lZGl0LWNyb3NzaGFpciAubWFwaWxsYXJ5LWpzLWludGVyYWN0aXZlIHtcbiAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbn1cblxuLm1hcGlsbGFyeS1qcy5jb21wb25lbnQtdGFnLWVkaXQtbW92ZSAubWFwaWxsYXJ5LWpzLWludGVyYWN0aXZlIHtcbiAgICBjdXJzb3I6IG1vdmU7XG59XG5cbi5tYXBpbGxhcnktanMuY29tcG9uZW50LXRhZy1lZGl0LW5lc3ctcmVzaXplIC5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmUge1xuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XG59XG5cbi5tYXBpbGxhcnktanMuY29tcG9uZW50LXRhZy1lZGl0LW53c2UtcmVzaXplIC5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmUge1xuICAgIGN1cnNvcjogbndzZS1yZXNpemU7XG59XG5cbi5UYWdDb21wbGV0ZXIsXG4uVGFnSW50ZXJhY3Rvcixcbi5UYWdNb3Zlcixcbi5UYWdSZXNpemVyLFxuLlRhZ1Nwb3RJbnRlcmFjdG9yLFxuLlRhZ1N5bWJvbCxcbi5UYWdWZXJ0ZXgge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbn1cblxuLlRhZ1N5bWJvbCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uVGFnTW92ZXIsXG4uVGFnUmVzaXplciB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi5UYWdNb3ZlciB7XG4gICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBvcGFjaXR5OiAwLjI7XG4gICAgY3Vyc29yOiBtb3ZlO1xufVxuXG4uVGFnTW92ZXI6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLlRhZ1Jlc2l6ZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICB3aWR0aDogMTRweDtcbiAgICBoZWlnaHQ6IDE0cHg7XG4gICAgb3BhY2l0eTogMDtcbiAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbn1cblxuLlRhZ1Jlc2l6ZXI6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuMztcbn1cblxuLlRhZ1ZlcnRleCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIHdpZHRoOiA2cHg7XG4gICAgaGVpZ2h0OiA2cHg7XG59XG5cbi5UYWdJbnRlcmFjdG9yLFxuLlRhZ0NvbXBsZXRlcixcbi5UYWdTcG90SW50ZXJhY3RvciB7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBvcGFjaXR5OiAwO1xufVxuXG4uVGFnSW50ZXJhY3Rvcixcbi5UYWdDb21wbGV0ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLlRhZ1Nwb3RJbnRlcmFjdG9yIHtcbiAgICBjdXJzb3I6IG1vdmU7XG59XG5cbi5UYWdDb21wbGV0ZXIge1xuICAgIGJhY2tncm91bmQ6IGxpbWVncmVlbjtcbn1cblxuLlRhZ0ludGVyYWN0b3Ige1xuICAgIGJhY2tncm91bmQ6IG9yYW5nZXJlZDtcbn1cblxuLlRhZ0NvbXBsZXRlcjpob3Zlcixcbi5UYWdJbnRlcmFjdG9yOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAwLjY7XG59XG5cbi5UYWdTcG90SW50ZXJhY3Rvcjpob3ZlciB7XG4gICAgb3BhY2l0eTogMC4zO1xufVxuLm1hcGlsbGFyeS1qcyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG59XG5cbi5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmUge1xuICAgICBjdXJzb3I6IGdyYWI7XG59XG5cbi5tYXBpbGxhcnktanMtaW50ZXJhY3RpdmU6YWN0aXZlIHtcbiAgICAgY3Vyc29yOiBncmFiYmluZztcbn1cblxuLm1hcGlsbGFyeS1qcyAubWFwaWxsYXJ5LWpzLWRvbSB7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4ubWFwaWxsYXJ5LWpzLWRvbSAuZG9tUmVuZGVyZXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuIl19 */
\ No newline at end of file
index 2b7a5406e606906136367db1a6bf7d9d09799cbc..c62395aa2ce9fd95bedacd82e9558258f327252f 100644 (file)
@@ -1 +1 @@
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Mapillary=e()}}(function(){return function e(t,r,n){function i(a,s){if(!r[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=r[a]={exports:{}};t[a][0].call(h.exports,function(e){var r=t[a][1][e];return i(r||e)},h,h.exports,e,t,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;a<n.length;a++)i(n[a]);return i}({1:[function(e,t,r){"use strict";function n(e,t,r){t=t||1;for(var n,a,c,h,l=0;l<e[0].length;l++){var p=e[0][l];(!l||p[0]<n)&&(n=p[0]),(!l||p[1]<a)&&(a=p[1]),(!l||p[0]>c)&&(c=p[0]),(!l||p[1]>h)&&(h=p[1])}var f=c-n,d=h-a,m=Math.min(f,d),v=m/2,g=new u(null,i);if(0===m)return[n,a];for(var y=n;y<c;y+=m)for(var b=a;b<h;b+=m)g.push(new o(y+v,b+v,v,e));var _=s(e),x=new o(n+f/2,a+d/2,0,e);x.d>_.d&&(_=x);for(var w=g.length;g.length;){var S=g.pop();S.d>_.d&&(_=S,r&&console.log("found best %d after %d probes",Math.round(1e4*S.d)/1e4,w)),S.max-_.d<=t||(v=S.h/2,g.push(new o(S.x-v,S.y-v,v,e)),g.push(new o(S.x+v,S.y-v,v,e)),g.push(new o(S.x-v,S.y+v,v,e)),g.push(new o(S.x+v,S.y+v,v,e)),w+=4)}return r&&(console.log("num probes: "+w),console.log("best distance: "+_.d)),[_.x,_.y]}function i(e,t){return t.max-e.max}function o(e,t,r,n){this.x=e,this.y=t,this.h=r,this.d=a(e,t,n),this.max=this.d+this.h*Math.SQRT2}function a(e,t,r){for(var n=!1,i=1/0,o=0;o<r.length;o++)for(var a=r[o],s=0,u=a.length,h=u-1;s<u;h=s++){var l=a[s],p=a[h];l[1]>t!=p[1]>t&&e<(p[0]-l[0])*(t-l[1])/(p[1]-l[1])+l[0]&&(n=!n),i=Math.min(i,c(e,t,l,p))}return(n?1:-1)*Math.sqrt(i)}function s(e){for(var t=0,r=0,n=0,i=e[0],a=0,s=i.length,c=s-1;a<s;c=a++){var u=i[a],h=i[c],l=u[0]*h[1]-h[0]*u[1];r+=(u[0]+h[0])*l,n+=(u[1]+h[1])*l,t+=3*l}return 0===t?new o(i[0][0],i[0][1],0,e):new o(r/t,n/t,0,e)}function c(e,t,r,n){var i=r[0],o=r[1],a=n[0]-i,s=n[1]-o;if(0!==a||0!==s){var c=((e-i)*a+(t-o)*s)/(a*a+s*s);c>1?(i=n[0],o=n[1]):c>0&&(i+=a*c,o+=s*c)}return a=e-i,s=t-o,a*a+s*s}var u=e("tinyqueue");t.exports=n,t.exports.default=n},{tinyqueue:181}],2:[function(e,t,r){function n(e,t,r,n){this.cx=3*e,this.bx=3*(r-e)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*t,this.by=3*(n-t)-this.cy,this.ay=1-this.cy-this.by,this.p1x=e,this.p1y=n,this.p2x=r,this.p2y=n}t.exports=n,n.prototype.sampleCurveX=function(e){return((this.ax*e+this.bx)*e+this.cx)*e},n.prototype.sampleCurveY=function(e){return((this.ay*e+this.by)*e+this.cy)*e},n.prototype.sampleCurveDerivativeX=function(e){return(3*this.ax*e+2*this.bx)*e+this.cx},n.prototype.solveCurveX=function(e,t){void 0===t&&(t=1e-6);var r,n,i,o,a;for(i=e,a=0;a<8;a++){if(o=this.sampleCurveX(i)-e,Math.abs(o)<t)return i;var s=this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=o/s}if(r=0,n=1,(i=e)<r)return r;if(i>n)return n;for(;r<n;){if(o=this.sampleCurveX(i),Math.abs(o-e)<t)return i;e>o?r=i:n=i,i=.5*(n-r)+r}return i},n.prototype.solve=function(e,t){return this.sampleCurveY(this.solveCurveX(e,t))}},{}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return a[e>>18&63]+a[e>>12&63]+a[e>>6&63]+a[63&e]}function o(e,t,r){for(var n,o=[],a=t;a<r;a+=3)n=(e[a]<<16)+(e[a+1]<<8)+e[a+2],o.push(i(n));return o.join("")}r.byteLength=function(e){return 3*e.length/4-n(e)},r.toByteArray=function(e){var t,r,i,o,a,u=e.length;o=n(e),a=new c(3*u/4-o),r=o>0?u-4:u;var h=0;for(t=0;t<r;t+=4)i=s[e.charCodeAt(t)]<<18|s[e.charCodeAt(t+1)]<<12|s[e.charCodeAt(t+2)]<<6|s[e.charCodeAt(t+3)],a[h++]=i>>16&255,a[h++]=i>>8&255,a[h++]=255&i;return 2===o?(i=s[e.charCodeAt(t)]<<2|s[e.charCodeAt(t+1)]>>4,a[h++]=255&i):1===o&&(i=s[e.charCodeAt(t)]<<10|s[e.charCodeAt(t+1)]<<4|s[e.charCodeAt(t+2)]>>2,a[h++]=i>>8&255,a[h++]=255&i),a},r.fromByteArray=function(e){for(var t,r=e.length,n=r%3,i="",s=[],c=0,u=r-n;c<u;c+=16383)s.push(o(e,c,c+16383>u?u:c+16383));return 1===n?(t=e[r-1],i+=a[t>>2],i+=a[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=a[t>>10],i+=a[t>>4&63],i+=a[t<<2&63],i+="="),s.push(i),s.join("")};for(var a=[],s=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h=0,l=u.length;h<l;++h)a[h]=u[h],s[u.charCodeAt(h)]=h;s["-".charCodeAt(0)]=62,s["_".charCodeAt(0)]=63},{}],4:[function(e,t,r){},{}],5:[function(e,t,r){t.exports=function(e){var t=String.prototype.split,r=/()??/.exec("")[1]===e;return function(n,i,o){if("[object RegExp]"!==Object.prototype.toString.call(i))return t.call(n,i,o);var a,s,c,u,h=[],l=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.extended?"x":"")+(i.sticky?"y":""),p=0,i=new RegExp(i.source,l+"g");for(n+="",r||(a=new RegExp("^"+i.source+"$(?!\\s)",l)),o=o===e?-1>>>0:o>>>0;(s=i.exec(n))&&!((c=s.index+s[0].length)>p&&(h.push(n.slice(p,s.index)),!r&&s.length>1&&s[0].replace(a,function(){for(var t=1;t<arguments.length-2;t++)arguments[t]===e&&(s[t]=e)}),s.length>1&&s.index<n.length&&Array.prototype.push.apply(h,s.slice(1)),u=s[0].length,p=c,h.length>=o));)i.lastIndex===s.index&&i.lastIndex++;return p===n.length?!u&&i.test("")||h.push(""):h.push(n.slice(p)),h.length>o?h.slice(0,o):h}}()},{}],6:[function(e,t,r){function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function o(e){if(l===setTimeout)return setTimeout(e,0);if((l===n||!l)&&setTimeout)return l=setTimeout,setTimeout(e,0);try{return l(e,0)}catch(t){try{return l.call(null,e,0)}catch(t){return l.call(this,e,0)}}}function a(e){if(p===clearTimeout)return clearTimeout(e);if((p===i||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function s(){v&&d&&(v=!1,d.length?m=d.concat(m):g=-1,m.length&&c())}function c(){if(!v){var e=o(s);v=!0;for(var t=m.length;t;){for(d=m,m=[];++g<t;)d&&d[g].run();g=-1,t=m.length}d=null,v=!1,a(e)}}function u(e,t){this.fun=e,this.array=t}function h(){}var l,p,f=t.exports={};!function(){try{l="function"==typeof setTimeout?setTimeout:n}catch(e){l=n}try{p="function"==typeof clearTimeout?clearTimeout:i}catch(e){p=i}}();var d,m=[],v=!1,g=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];m.push(new u(e,t)),1!==m.length||v||o(c)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=h,f.addListener=h,f.once=h,f.off=h,f.removeListener=h,f.removeAllListeners=h,f.emit=h,f.prependListener=h,f.prependOnceListener=h,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},{}],7:[function(e,t,r){"use strict";function n(e){if(e>X)throw new RangeError("Invalid typed array length");var t=new Uint8Array(e);return t.__proto__=i.prototype,t}function i(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return c(e)}return o(e,t,r)}function o(e,t,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return e instanceof ArrayBuffer?l(e,t,r):"string"==typeof e?u(e,t):p(e)}function a(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function s(e,t,r){return a(e),e<=0?n(e):void 0!==t?"string"==typeof r?n(e).fill(t,r):n(e).fill(t):n(e)}function c(e){return a(e),n(e<0?0:0|f(e))}function u(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!i.isEncoding(t))throw new TypeError('"encoding" must be a valid string encoding');var r=0|d(e,t),o=n(r),a=o.write(e,t);return a!==r&&(o=o.slice(0,a)),o}function h(e){for(var t=e.length<0?0:0|f(e.length),r=n(t),i=0;i<t;i+=1)r[i]=255&e[i];return r}function l(e,t,r){if(t<0||e.byteLength<t)throw new RangeError("'offset' is out of bounds");if(e.byteLength<t+(r||0))throw new RangeError("'length' is out of bounds");var n;return n=void 0===t&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,t):new Uint8Array(e,t,r),n.__proto__=i.prototype,n}function p(e){if(i.isBuffer(e)){var t=0|f(e.length),r=n(t);return 0===r.length?r:(e.copy(r,0,0,t),r)}if(e){if(G(e)||"length"in e)return"number"!=typeof e.length||H(e.length)?n(0):h(e);if("Buffer"===e.type&&Array.isArray(e.data))return h(e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function f(e){if(e>=X)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+X.toString(16)+" bytes");return 0|e}function d(e,t){if(i.isBuffer(e))return e.length;if(G(e)||e instanceof ArrayBuffer)return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return F(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return $(e).length;default:if(n)return F(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,t>>>=0,r<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return j(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return P(this,t,r);case"base64":return E(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function v(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function g(e,t,r,n,o){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,H(r)&&(r=o?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(o)return-1;r=e.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof t&&(t=i.from(t,n)),i.isBuffer(t))return 0===t.length?-1:y(e,t,r,n,o);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):y(e,[t],r,n,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,r,n,i){function o(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,s=e.length,c=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,c/=2,r/=2}var u;if(i){var h=-1;for(u=r;u<s;u++)if(o(e,u)===o(t,-1===h?0:u-h)){if(-1===h&&(h=u),u-h+1===c)return h*a}else-1!==h&&(u-=u-h),h=-1}else for(r+c>s&&(r=s-c),u=r;u>=0;u--){for(var l=!0,p=0;p<c;p++)if(o(e,u+p)!==o(t,p)){l=!1;break}if(l)return u}return-1}function b(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n))>i&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a<n;++a){var s=parseInt(t.substr(2*a,2),16);if(H(s))return a;e[r+a]=s}return a}function _(e,t,r,n){return V(F(t,e.length-r),e,r,n)}function x(e,t,r,n){return V(U(t),e,r,n)}function w(e,t,r,n){return x(e,t,r,n)}function S(e,t,r,n){return V($(t),e,r,n)}function M(e,t,r,n){return V(z(t,e.length-r),e,r,n)}function E(e,t,r){return 0===t&&r===e.length?q.fromByteArray(e):q.fromByteArray(e.slice(t,r))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i<r;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(i+s<=r){var c,u,h,l;switch(s){case 1:o<128&&(a=o);break;case 2:128==(192&(c=e[i+1]))&&(l=(31&o)<<6|63&c)>127&&(a=l);break;case 3:c=e[i+1],u=e[i+2],128==(192&c)&&128==(192&u)&&(l=(15&o)<<12|(63&c)<<6|63&u)>2047&&(l<55296||l>57343)&&(a=l);break;case 4:c=e[i+1],u=e[i+2],h=e[i+3],128==(192&c)&&128==(192&u)&&128==(192&h)&&(l=(15&o)<<18|(63&c)<<12|(63&u)<<6|63&h)>65535&&l<1114112&&(a=l)}}null===a?(a=65533,s=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=s}return T(n)}function T(e){var t=e.length;if(t<=Y)return String.fromCharCode.apply(String,e);for(var r="",n=0;n<t;)r+=String.fromCharCode.apply(String,e.slice(n,n+=Y));return r}function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(127&e[i]);return n}function P(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(e[i]);return n}function j(e,t,r){var n=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>n)&&(r=n);for(var i="",o=t;o<r;++o)i+=B(e[o]);return i}function A(e,t,r){for(var n=e.slice(t,r),i="",o=0;o<n.length;o+=2)i+=String.fromCharCode(n[o]+256*n[o+1]);return i}function R(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function L(e,t,r,n,o,a){if(!i.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||t<a)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function N(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function I(e,t,r,n,i){return t=+t,r>>>=0,i||N(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),W.write(e,t,r,n,23,4),r+4}function D(e,t,r,n,i){return t=+t,r>>>=0,i||N(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),W.write(e,t,r,n,52,8),r+8}function k(e){if((e=e.trim().replace(K,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}function B(e){return e<16?"0"+e.toString(16):e.toString(16)}function F(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],a=0;a<n;++a){if((r=e.charCodeAt(a))>55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function U(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}function z(e,t){for(var r,n,i,o=[],a=0;a<e.length&&!((t-=2)<0);++a)n=(r=e.charCodeAt(a))>>8,i=r%256,o.push(i),o.push(n);return o}function $(e){return q.toByteArray(k(e))}function V(e,t,r,n){for(var i=0;i<n&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function G(e){return"function"==typeof ArrayBuffer.isView&&ArrayBuffer.isView(e)}function H(e){return e!==e}var q=e("base64-js"),W=e("ieee754");r.Buffer=i,r.SlowBuffer=function(e){return+e!=e&&(e=0),i.alloc(+e)},r.INSPECT_MAX_BYTES=50;var X=2147483647;r.kMaxLength=X,i.TYPED_ARRAY_SUPPORT=function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()}catch(e){return!1}}(),i.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),"undefined"!=typeof Symbol&&Symbol.species&&i[Symbol.species]===i&&Object.defineProperty(i,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),i.poolSize=8192,i.from=function(e,t,r){return o(e,t,r)},i.prototype.__proto__=Uint8Array.prototype,i.__proto__=Uint8Array,i.alloc=function(e,t,r){return s(e,t,r)},i.allocUnsafe=function(e){return c(e)},i.allocUnsafeSlow=function(e){return c(e)},i.isBuffer=function(e){return null!=e&&!0===e._isBuffer},i.compare=function(e,t){if(!i.isBuffer(e)||!i.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,o=0,a=Math.min(r,n);o<a;++o)if(e[o]!==t[o]){r=e[o],n=t[o];break}return r<n?-1:n<r?1:0},i.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},i.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return i.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var n=i.allocUnsafe(t),o=0;for(r=0;r<e.length;++r){var a=e[r];if(!i.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,o),o+=a.length}return n},i.byteLength=d,i.prototype._isBuffer=!0,i.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},i.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},i.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},i.prototype.toString=function(){var e=this.length;return 0===e?"":0===arguments.length?C(this,0,e):m.apply(this,arguments)},i.prototype.equals=function(e){if(!i.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===i.compare(this,e)},i.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),"<Buffer "+e+">"},i.prototype.compare=function(e,t,r,n,o){if(!i.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),t<0||r>e.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&t>=r)return 0;if(n>=o)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,o>>>=0,this===e)return 0;for(var a=o-n,s=r-t,c=Math.min(a,s),u=this.slice(n,o),h=e.slice(t,r),l=0;l<c;++l)if(u[l]!==h[l]){a=u[l],s=h[l];break}return a<s?-1:s<a?1:0},i.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},i.prototype.indexOf=function(e,t,r){return g(this,e,t,r,!0)},i.prototype.lastIndexOf=function(e,t,r){return g(this,e,t,r,!1)},i.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return b(this,e,t,r);case"utf8":case"utf-8":return _(this,e,t,r);case"ascii":return x(this,e,t,r);case"latin1":case"binary":return w(this,e,t,r);case"base64":return S(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},i.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Y=4096;i.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,e<0?(e+=r)<0&&(e=0):e>r&&(e=r),t<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e);var n=this.subarray(e,t);return n.__proto__=i.prototype,n},i.prototype.readUIntLE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return n},i.prototype.readUIntBE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var n=this[e+--t],i=1;t>0&&(i*=256);)n+=this[e+--t]*i;return n},i.prototype.readUInt8=function(e,t){return e>>>=0,t||R(e,1,this.length),this[e]},i.prototype.readUInt16LE=function(e,t){return e>>>=0,t||R(e,2,this.length),this[e]|this[e+1]<<8},i.prototype.readUInt16BE=function(e,t){return e>>>=0,t||R(e,2,this.length),this[e]<<8|this[e+1]},i.prototype.readUInt32LE=function(e,t){return e>>>=0,t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},i.prototype.readUInt32BE=function(e,t){return e>>>=0,t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},i.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*t)),n},i.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},i.prototype.readInt8=function(e,t){return e>>>=0,t||R(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},i.prototype.readInt16LE=function(e,t){e>>>=0,t||R(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt16BE=function(e,t){e>>>=0,t||R(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt32LE=function(e,t){return e>>>=0,t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},i.prototype.readInt32BE=function(e,t){return e>>>=0,t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},i.prototype.readFloatLE=function(e,t){return e>>>=0,t||R(e,4,this.length),W.read(this,e,!0,23,4)},i.prototype.readFloatBE=function(e,t){return e>>>=0,t||R(e,4,this.length),W.read(this,e,!1,23,4)},i.prototype.readDoubleLE=function(e,t){return e>>>=0,t||R(e,8,this.length),W.read(this,e,!0,52,8)},i.prototype.readDoubleBE=function(e,t){return e>>>=0,t||R(e,8,this.length),W.read(this,e,!1,52,8)},i.prototype.writeUIntLE=function(e,t,r,n){e=+e,t>>>=0,r>>>=0,n||L(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[t]=255&e;++o<r&&(i*=256);)this[t+o]=e/i&255;return t+r},i.prototype.writeUIntBE=function(e,t,r,n){e=+e,t>>>=0,r>>>=0,n||L(this,e,t,r,Math.pow(2,8*r)-1,0);var i=r-1,o=1;for(this[t+i]=255&e;--i>=0&&(o*=256);)this[t+i]=e/o&255;return t+r},i.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,1,255,0),this[t]=255&e,t+1},i.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},i.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},i.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},i.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},i.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);L(this,e,t,r,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o<r&&(a*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},i.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);L(this,e,t,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},i.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},i.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},i.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},i.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},i.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||L(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},i.prototype.writeFloatLE=function(e,t,r){return I(this,e,t,!0,r)},i.prototype.writeFloatBE=function(e,t,r){return I(this,e,t,!1,r)},i.prototype.writeDoubleLE=function(e,t,r){return D(this,e,t,!0,r)},i.prototype.writeDoubleBE=function(e,t,r){return D(this,e,t,!1,r)},i.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-r&&(n=e.length-t+r);var i,o=n-r;if(this===e&&r<t&&t<n)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(o<1e3)for(i=0;i<o;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},i.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!i.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var a;if("number"==typeof e)for(a=t;a<r;++a)this[a]=e;else{var s=i.isBuffer(e)?e:new i(e,n),c=s.length;for(a=0;a<r-t;++a)this[a+t]=s[a%c]}return this};var K=/[^+/0-9A-Za-z-_]/g},{"base64-js":3,ieee754:17}],8:[function(e,t,r){"use strict";function n(e,t,r){r=r||2;var n=t&&t.length,o=n?t[0]*r:e.length,s=i(e,0,o,r,!0),c=[];if(!s)return c;var u,h,p,f,d,m,v;if(n&&(s=l(e,t,s,r)),e.length>80*r){u=p=e[0],h=f=e[1];for(var g=r;g<o;g+=r)d=e[g],m=e[g+1],d<u&&(u=d),m<h&&(h=m),d>p&&(p=d),m>f&&(f=m);v=Math.max(p-u,f-h)}return a(s,c,r,u,h,v),c}function i(e,t,r,n,i){var o,a;if(i===A(e,t,r,n)>0)for(o=t;o<r;o+=n)a=O(o,e[o],e[o+1],a);else for(o=r-n;o>=t;o-=n)a=O(o,e[o],e[o+1],a);return a&&w(a,a.next)&&(P(a),a=a.next),a}function o(e,t){if(!e)return e;t||(t=e);var r,n=e;do{if(r=!1,n.steiner||!w(n,n.next)&&0!==x(n.prev,n,n.next))n=n.next;else{if(P(n),(n=t=n.prev)===n.next)return null;r=!0}}while(r||n!==t);return t}function a(e,t,r,n,i,l,p){if(e){!p&&l&&m(e,n,i,l);for(var f,d,v=e;e.prev!==e.next;)if(f=e.prev,d=e.next,l?c(e,n,i,l):s(e))t.push(f.i/r),t.push(e.i/r),t.push(d.i/r),P(e),e=d.next,v=d.next;else if((e=d)===v){p?1===p?a(e=u(e,t,r),t,r,n,i,l,2):2===p&&h(e,t,r,n,i,l):a(o(e),t,r,n,i,l,1);break}}}function s(e){var t=e.prev,r=e,n=e.next;if(x(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(b(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&x(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function c(e,t,r,n){var i=e.prev,o=e,a=e.next;if(x(i,o,a)>=0)return!1;for(var s=i.x<o.x?i.x<a.x?i.x:a.x:o.x<a.x?o.x:a.x,c=i.y<o.y?i.y<a.y?i.y:a.y:o.y<a.y?o.y:a.y,u=i.x>o.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,h=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,l=g(s,c,t,r,n),p=g(u,h,t,r,n),f=e.nextZ;f&&f.z<=p;){if(f!==e.prev&&f!==e.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(f=e.prevZ;f&&f.z>=l;){if(f!==e.prev&&f!==e.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;f=f.prevZ}return!0}function u(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!w(i,o)&&S(i,n,n.next,o)&&E(i,o)&&E(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),P(n),P(n.next),n=e=o),n=n.next}while(n!==e);return n}function h(e,t,r,n,i,s){var c=e;do{for(var u=c.next.next;u!==c.prev;){if(c.i!==u.i&&_(c,u)){var h=T(c,u);return c=o(c,c.next),h=o(h,h.next),a(c,t,r,n,i,s),void a(h,t,r,n,i,s)}u=u.next}c=c.next}while(c!==e)}function l(e,t,r,n){var a,s,c,u=[];for(a=0,s=t.length;a<s;a++)(c=i(e,t[a]*n,a<s-1?t[a+1]*n:e.length,n,!1))===c.next&&(c.steiner=!0),u.push(y(c));for(u.sort(p),a=0;a<u.length;a++)f(u[a],r),r=o(r,r.next);return r}function p(e,t){return e.x-t.x}function f(e,t){if(t=d(e,t)){var r=T(t,e);o(r,r.next)}}function d(e,t){var r,n=t,i=e.x,o=e.y,a=-1/0;do{if(o<=n.y&&o>=n.next.y){var s=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>a){if(a=s,s===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x<n.next.x?n:n.next}}n=n.next}while(n!==t);if(!r)return null;if(i===a)return r.prev;var c,u=r,h=r.x,l=r.y,p=1/0;for(n=r.next;n!==u;)i>=n.x&&n.x>=h&&b(o<l?i:a,o,h,l,o<l?a:i,o,n.x,n.y)&&((c=Math.abs(o-n.y)/(i-n.x))<p||c===p&&n.x>r.x)&&E(n,e)&&(r=n,p=c),n=n.next;return r}function m(e,t,r,n){var i=e;do{null===i.z&&(i.z=g(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,v(i)}function v(e){var t,r,n,i,o,a,s,c,u=1;do{for(r=e,e=null,o=null,a=0;r;){for(a++,n=r,s=0,t=0;t<u&&(s++,n=n.nextZ);t++);for(c=u;s>0||c>0&&n;)0===s?(i=n,n=n.nextZ,c--):0!==c&&n?r.z<=n.z?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,c--):(i=r,r=r.nextZ,s--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,u*=2}while(a>1);return e}function g(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function y(e){var t=e,r=e;do{t.x<r.x&&(r=t),t=t.next}while(t!==e);return r}function b(e,t,r,n,i,o,a,s){return(i-a)*(t-s)-(e-a)*(o-s)>=0&&(e-a)*(n-s)-(r-a)*(t-s)>=0&&(r-a)*(o-s)-(i-a)*(n-s)>=0}function _(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!M(e,t)&&E(e,t)&&E(t,e)&&C(e,t)}function x(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function w(e,t){return e.x===t.x&&e.y===t.y}function S(e,t,r,n){return!!(w(e,t)&&w(r,n)||w(e,n)&&w(r,t))||x(e,t,r)>0!=x(e,t,n)>0&&x(r,n,e)>0!=x(r,n,t)>0}function M(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&S(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function E(e,t){return x(e.prev,e,e.next)<0?x(e,t,e.next)>=0&&x(e,e.prev,t)>=0:x(e,t,e.prev)<0||x(e,e.next,t)<0}function C(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do{r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==e);return n}function T(e,t){var r=new j(e.i,e.x,e.y),n=new j(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function O(e,t,r,n){var i=new j(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function P(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function j(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(e,t,r,n){for(var i=0,o=t,a=r-n;o<r;o+=n)i+=(e[a]-e[o])*(e[o+1]+e[a+1]),a=o;return i}t.exports=n,n.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,a=Math.abs(A(e,0,o,r));if(i)for(var s=0,c=t.length;s<c;s++){var u=t[s]*r,h=s<c-1?t[s+1]*r:e.length;a-=Math.abs(A(e,u,h,r))}var l=0;for(s=0;s<n.length;s+=3){var p=n[s]*r,f=n[s+1]*r,d=n[s+2]*r;l+=Math.abs((e[p]-e[d])*(e[f+1]-e[p+1])-(e[p]-e[f])*(e[d+1]-e[p+1]))}return 0===a&&0===l?0:Math.abs((l-a)/a)},n.flatten=function(e){for(var t=e[0][0].length,r={vertices:[],holes:[],dimensions:t},n=0,i=0;i<e.length;i++){for(var o=0;o<e[i].length;o++)for(var a=0;a<t;a++)r.vertices.push(e[i][o][a]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],9:[function(e,t,r){"use strict";e("individual/one-version")("ev-store","7");var n="__EV_STORE_KEY@7";t.exports=function(e){var t=e[n];return t||(t=e[n]={}),t}},{"individual/one-version":19}],10:[function(e,t,r){"use strict";function n(e,t){var r;for(r in t)e[r]=t[r];return e}function i(e,t){this._jsongUrl=e,"number"==typeof t&&(t={timeout:t}),this._config=n({timeout:15e3,headers:{}},t||{})}var o=e("./request"),a=e("./buildQueryObject");Array.isArray;i.prototype={constructor:i,buildQueryObject:a,get:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"GET",{paths:e,method:"get"}),this._config);return o("GET",t,this)},set:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"POST",{jsonGraph:e,method:"set"}),this._config);return t.headers["Content-Type"]="application/x-www-form-urlencoded",o("POST",t,this)},call:function(e,t,r,i){t=t||[],r=r||[],i=i||[];var a=[];a.push("method=call"),a.push("callPath="+encodeURIComponent(JSON.stringify(e))),a.push("arguments="+encodeURIComponent(JSON.stringify(t))),a.push("pathSuffixes="+encodeURIComponent(JSON.stringify(r))),a.push("paths="+encodeURIComponent(JSON.stringify(i)));var s=n(this.buildQueryObject(this._jsongUrl,"POST",a.join("&")),this._config);return s.headers["Content-Type"]="application/x-www-form-urlencoded",o("POST",s,this)}},i.XMLHttpSource=i,i.default=i,t.exports=i},{"./buildQueryObject":11,"./request":14}],11:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n=[],i={url:e},o=-1!==e.indexOf("?")?"&":"?";return"string"==typeof r?n.push(r):Object.keys(r).forEach(function(e){var t="object"==typeof r[e]?JSON.stringify(r[e]):r[e];n.push(e+"="+encodeURIComponent(t))}),"GET"===t?i.url+=o+n.join("&"):i.data=n.join("&"),i}},{}],12:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t=new e.XMLHttpRequest;if("withCredentials"in t)return t;if(e.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],13:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t,r,n;if(e.XMLHttpRequest)return new e.XMLHttpRequest;try{for(r=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],n=0;n<3;n++)try{if(t=r[n],new e.ActiveXObject(t))break}catch(e){}return new e.ActiveXObject(t)}catch(e){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],14:[function(e,t,r){"use strict";function n(){}function i(e,t,r){r||(r=new Error(t)),e.onError(r)}function o(e,t,r){var n,o;if(t&&e){o=t.responseType,n="response"in t?t.response:t.responseText;var a=1223===t.status?204:t.status;if(a>=200&&a<=399){try{"json"!==o&&(n=JSON.parse(n||"")),"string"==typeof n&&(n=JSON.parse(n||""))}catch(r){i(e,"invalid json",r)}return e.onNext(n),void e.onCompleted()}return 401===a||403===a||407===a?i(e,n):410===a?i(e,n):408===a||504===a?i(e,n):i(e,n||"Response code "+a)}}function a(e,t,r,n){i(e,r||t.statusText||"request error",n)}var s=e("./getXMLHttpRequest"),c=e("./getCORSRequest"),u=Object.prototype.hasOwnProperty,h=function(){};n.create=function(e){var t=new n;return t.subscribe=function(t,r,n){var i,o;return i="function"==typeof t?{onNext:t,onError:r||h,onCompleted:n||h}:t,"function"==typeof(o=e(i))?{dispose:o}:o},t},t.exports=function(e,t,r){return n.create(function(n){var i,h,l,p,f,d={method:e||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(f in t)u.call(t,f)&&(d[f]=t[f]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=r.onBeforeRequest&&r.onBeforeRequest(d);try{i=d.crossDomain?c():s()}catch(e){n.onError(e)}try{d.user?i.open(d.method,d.url,d.async,d.user,d.password):i.open(d.method,d.url,d.async),i.timeout=d.timeout,i.withCredentials=!1!==d.withCredentials,l=d.headers;for(p in l)u.call(l,p)&&i.setRequestHeader(p,l[p]);if(d.responseType)try{i.responseType=d.responseType}catch(e){if("json"!==d.responseType)throw e}i.onreadystatechange=function(e){4===i.readyState&&(h||(h=!0,o(n,i)))},i.ontimeout=function(e){h||(h=!0,a(n,i,"timeout error",e))},i.send(d.data)}catch(e){n.onError(e)}return function(){h||4===i.readyState||(h=!0,i.abort())}})}},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(e,t,r){(function(n){!function(e){if("object"==typeof r&&void 0!==t)t.exports=e();else{("undefined"!=typeof window?window:void 0!==n?n:"undefined"!=typeof self?self:this).falcor=e()}}(function(){return function t(r,n,i){function o(s,c){if(!n[s]){if(!r[s]){var u="function"==typeof e&&e;if(!c&&u)return u(s,!0);if(a)return a(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[s]={exports:{}};r[s][0].call(l.exports,function(e){var t=r[s][1][e];return o(t||e)},l,l.exports,t,r,n,i)}return n[s].exports}for(var a="function"==typeof e&&e,s=0;s<i.length;s++)o(i[s]);return o}({1:[function(e,t,r){var n=e(32),i=e(130);n.atom=i.atom,n.ref=i.ref,n.error=i.error,n.pathValue=i.pathValue,n.HttpDataSource=e(125),t.exports=n},{125:125,130:130,32:32}],2:[function(e,t,r){function n(e){var t=e||{};this._root=t._root||new i(t),this._path=t.path||t._path||[],this._scheduler=t.scheduler||t._scheduler||new f,this._source=t.source||t._source,this._request=t.request||t._request||new a(this,this._scheduler),this._ID=T++,"number"==typeof t.maxSize?this._maxSize=t.maxSize:this._maxSize=t._maxSize||n.prototype._maxSize,"number"==typeof t.collectRatio?this._collectRatio=t.collectRatio:this._collectRatio=t._collectRatio||n.prototype._collectRatio,(t.boxed||t.hasOwnProperty("_boxed"))&&(this._boxed=t.boxed||t._boxed),(t.materialized||t.hasOwnProperty("_materialized"))&&(this._materialized=t.materialized||t._materialized),"boolean"==typeof t.treatErrorsAsValues?this._treatErrorsAsValues=t.treatErrorsAsValues:t.hasOwnProperty("_treatErrorsAsValues")&&(this._treatErrorsAsValues=t._treatErrorsAsValues),t.cache&&this.setCache(t.cache)}var i=e(4),o=e(3),a=e(55),s=e(64),c=e(65),u=e(61),h=e(63),l=e(73),p=e(75),f=e(74),d=e(81),m=e(84),v=e(49),g=e(134),y=e(88),b=e(100),_=e(96),x=e(102),w=e(98),S=e(99),M=e(77),E=e(76),C=e(130),T=0,O=e(116),P=function(){},j=e(14),A=e(19),R={pathValue:!0,pathSyntax:!0,json:!0,jsonGraph:!0},L=e(72);t.exports=n,n.ref=C.ref,n.atom=C.atom,n.error=C.error,n.pathValue=C.pathValue,n.prototype.constructor=n,n.prototype._materialized=!1,n.prototype._boxed=!1,n.prototype._progressive=!1,n.prototype._treatErrorsAsValues=!1,n.prototype._maxSize=Math.pow(2,53)-1,n.prototype._collectRatio=.75,n.prototype.get=e(71),n.prototype._getWithPaths=e(70),n.prototype.set=function(){var e=O(arguments,R,"set");return!0!==e?new s(function(t){t.onError(e)}):this._set.apply(this,arguments)},n.prototype.preload=function(){var e=O(arguments,L,"preload");if(!0!==e)return new s(function(t){t.onError(e)});var t=Array.prototype.slice.call(arguments),r=this;return new s(function(e){return r.get.apply(r,t).subscribe(function(){},function(t){e.onError(t)},function(){e.onCompleted()})})},n.prototype._set=function(){var e,t=-1,r=arguments.length,n=arguments[r-1];for(_(n)?r-=1:n=void 0,e=new Array(r);++t<r;)e[t]=arguments[t];return c.create(this,e,n)},n.prototype.call=function(){var e,t=-1,r=arguments.length;for(e=new Array(r);++t<r;){var n=arguments[t];e[t]=n;var i=typeof n;if(t>1&&!Array.isArray(n)||0===t&&!Array.isArray(n)&&"string"!==i||1===t&&!Array.isArray(n)&&!x(n))return new s(function(e){e.onError(new Error("Invalid argument"))})}return u.create(this,e)},n.prototype.invalidate=function(){var e,t=-1,r=arguments.length,n=arguments[r-1];for(e=new Array(r);++t<r;)if(e[t]=g.fromPath(arguments[t]),"object"!=typeof e[t])throw new Error("Invalid argument");h.create(this,e,n).subscribe(P,function(e){throw e})},n.prototype.deref=e(5),n.prototype.getValue=e(16),n.prototype.setValue=e(79),n.prototype._getValueSync=e(24),n.prototype._setValueSync=e(80),n.prototype._derefSync=e(6),n.prototype.setCache=function(e){var t=this._root.cache;if(e!==t){var r=this._root,n=this._path;this._path=[],this._root.cache={},void 0!==t&&v(r,r.expired,y(t),0),S(e)?E(this,[e]):w(e)?M(this,[e]):b(e)&&M(this,[{json:e}]),this._path=n}else void 0===t&&(this._root.cache={});return this},n.prototype.getCache=function(){var e=m(arguments);if(0===e.length)return j(this._root.cache);var t=[{}],r=this._path;return A.getWithPathsAsJSONGraph(this,e,t),this._path=r,t[0].jsonGraph},n.prototype.getVersion=function(e){var t=e&&g.fromPath(e)||[];if(!1===Array.isArray(t))throw new Error("Model#getVersion must be called with an Array path.");return this._path.length&&(t=this._path.concat(t)),this._getVersion(this,t)},n.prototype._syncCheck=function(e){if(Boolean(this._source)&&this._root.syncRefCount<=0&&!1===this._root.unsafeMode)throw new Error("Model#"+e+" may only be called within the context of a request selector.");return!0},n.prototype._clone=function(e){var t=new n(this);for(var r in e){var i=e[r];"delete"===i?delete t[r]:t[r]=i}return t.setCache=void 0,t},n.prototype.batch=function(e){var t=e;"number"==typeof t?t=new p(Math.round(Math.abs(t))):t&&t.schedule||(t=new l);var r=this._clone();return r._request=new a(r,t),r},n.prototype.unbatch=function(){var e=this._clone();return e._request=new a(e,new f),e},n.prototype.treatErrorsAsValues=function(){return this._clone({_treatErrorsAsValues:!0})},n.prototype.asDataSource=function(){return new o(this)},n.prototype._materialize=function(){return this._clone({_materialized:!0})},n.prototype._dematerialize=function(){return this._clone({_materialized:"delete"})},n.prototype.boxValues=function(){return this._clone({_boxed:!0})},n.prototype.unboxValues=function(){return this._clone({_boxed:"delete"})},n.prototype.withoutDataSource=function(){return this._clone({_source:"delete"})},n.prototype.toJSON=function(){return{$type:"ref",value:this._path}},n.prototype.getPath=function(){return d(this._path)},n.prototype._getBoundValue=e(13),n.prototype._getVersion=e(18),n.prototype._getValueSync=e(17),n.prototype._getPathValuesAsPathMap=A.getWithPathsAsPathMap,n.prototype._getPathValuesAsJSONG=A.getWithPathsAsJSONGraph,n.prototype._setPathValuesAsJSON=e(78),n.prototype._setPathValuesAsJSONG=e(78),n.prototype._setPathValuesAsPathMap=e(78),n.prototype._setPathValuesAsValues=e(78),n.prototype._setPathMapsAsJSON=e(77),n.prototype._setPathMapsAsJSONG=e(77),n.prototype._setPathMapsAsPathMap=e(77),n.prototype._setPathMapsAsValues=e(77),n.prototype._setJSONGsAsJSON=e(76),n.prototype._setJSONGsAsJSONG=e(76),n.prototype._setJSONGsAsPathMap=e(76),n.prototype._setJSONGsAsValues=e(76),n.prototype._setCache=e(77),n.prototype._invalidatePathValuesAsJSON=e(48),n.prototype._invalidatePathMapsAsJSON=e(47)},{100:100,102:102,116:116,13:13,130:130,134:134,14:14,16:16,17:17,18:18,19:19,24:24,3:3,4:4,47:47,48:48,49:49,5:5,55:55,6:6,61:61,63:63,64:64,65:65,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,84:84,88:88,96:96,98:98,99:99}],3:[function(e,t,r){function n(e){this._model=e._materialize().treatErrorsAsValues()}n.prototype.get=function(e){return this._model.get.apply(this._model,e)._toJSONG()},n.prototype.set=function(e){return this._model.set(e)._toJSONG()},n.prototype.call=function(e,t,r,n){var i=[e,t,r].concat(n);return this._model.call.apply(this._model,i)._toJSONG()},t.exports=n},{}],4:[function(e,t,r){function n(e){var t=e||{};this.syncRefCount=0,this.expired=t.expired||[],this.unsafeMode=t.unsafeMode||!1,this.collectionScheduler=t.collectionScheduler||new a,this.cache={},i(t.comparator)&&(this.comparator=t.comparator),i(t.errorSelector)&&(this.errorSelector=t.errorSelector),i(t.onChange)&&(this.onChange=t.onChange)}var i=e(96),o=e(91),a=e(74);n.prototype.errorSelector=function(e,t){return t},n.prototype.comparator=function(e,t){return o(e,"value")&&o(t,"value")?e.value===t.value&&e.$type===t.$type&&e.$expires===t.$expires:e===t},t.exports=n},{74:74,91:91,96:96}],5:[function(e,t,r){function n(e,t){var r,n=!1;try{++e._root.syncRefCount,r=e._derefSync(t)}catch(e){r=e,n=!0}finally{--e._root.syncRefCount}return n?i.Observable.throw(r):i.Observable.return(r)}var i=e(159),o=e(134);t.exports=function(e){for(var t=this,r=-1,a=arguments.length-1,s=new Array(a),c=o.fromPath(e);++r<a;)s[r]=o.fromPath(arguments[r+1]);if(0===a)throw new Error("Model#deref requires at least one value path.");return i.Observable.defer(function(){return n(t,c)}).flatMap(function(e){if(Boolean(e)){if(a>0){var r=i.Observable.of(e);return e.get.apply(e,s).catch(i.Observable.empty()).concat(r).last().flatMap(function(){return n(t,c)}).filter(function(e){return e})}return i.Observable.return(e)}if(a>0){var o=s.map(function(e){return c.concat(e)});return t.get.apply(t,o).concat(i.Observable.defer(function(){return n(t,c)})).last().filter(function(e){return e})}return i.Observable.empty()})}},{134:134,159:159}],6:[function(e,t,r){var n=e(134),i=e(13),o=e(8),a=e(118);t.exports=function(e){var t=n.fromPath(e);if(!Array.isArray(t))throw new Error("Model#derefSync must be called with an Array path.");var r=i(this,this._path.concat(t),!1),s=r.path,c=r.value;if(r.found&&void 0!==c&&(c.$type!==a||void 0!==c.value)){if(c.$type)throw new o;return this._clone({_path:s})}}},{118:118,13:13,134:134,8:8}],7:[function(e,t,r){function n(){this.message=n.message,this.stack=(new Error).stack}n.prototype=new Error,n.prototype.name="BoundJSONGraphModelError",n.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",t.exports=n},{}],8:[function(e,t,r){function n(e,t){this.message=i,this.stack=(new Error).stack,this.boundPath=e,this.shortedPath=t}var i="The boundPath of the model is not valid since a value or error was found before the path end.";(n.prototype=new Error).name="InvalidModelError",n.message=i,t.exports=n},{}],9:[function(e,t,r){function n(e){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=e}var i="InvalidSourceError";(n.prototype=new Error).name=i,n.is=function(e){return e&&e.name===i},t.exports=n},{}],10:[function(e,t,r){function n(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var i="MaxRetryExceededError";(n.prototype=new Error).name=i,n.is=function(e){return e&&e.name===i},t.exports=n},{}],11:[function(e,t,r){var n=e(26).create,i=e(22),o=e(27),a=e(120),s=e(33),c=e(29).promote;t.exports=function(e,t,r,u,h,l,p){for(var f,d,m=r,v=h,g=u,y=0;;){if(0===y&&g[s]?(y=v.length,d=g[s]):(f=v[y++],d=m[f]),d){var b=d.$type,_=b&&d.value||d;if(y<v.length){if(b){m=d;break}m=d;continue}if(m=d,b&&o(d))break;if(g[s]||n(g,d),b===a){p?i(e,d,l,null,null,null,v,v.length,p):c(e,d),y=0,v=_,g=d,m=t;continue}break}m=void 0;break}if(y<v.length&&void 0!==m){for(var x=[],w=0;y>w;w++)x[w]=v[w];v=x}return[m,v]}},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(e,t,r){var n=e(15),i=e(8),o=e(7);t.exports=function(e,t){return function(r,a,s){var c,u,h,l=s[0],p={values:s,optimizedPaths:[]},f=r._root.cache,d=r._path,m=f,v=d.length,g=[];if(v){if(t)return{criticalError:new o};if((m=n(r,d)).$type)return{criticalError:new i(d,d)};for(c=[],u=0;v>u;++u)c[u]=d[u]}else c=[],v=0;for(u=0,h=a.length;h>u;u++)e(r,f,m,a[u],0,l,p,g,c,v,t);return p}}},{15:15,7:7,8:8}],13:[function(e,t,r){var n=e(17),i=e(8);t.exports=function(e,t,r){var o,a,s,c,u,h=t,l=t;for(o=e._boxed,r=e._materialized,a=e._treatErrorsAsValues,e._boxed=!0,e._materialized=void 0===r||r,e._treatErrorsAsValues=!0,s=n(e,h.concat(null),!0),e._boxed=o,e._materialized=r,e._treatErrorsAsValues=a,h=s.optimizedPath,c=s.shorted,u=s.found,s=s.value;h.length&&null===h[h.length-1];)h.pop();if(u&&c)throw new i(l,h);return{path:h,value:s,shorted:c,found:u}}},{17:17,8:8}],14:[function(e,t,r){function n(e){var t,r,n,i={},o=Object.keys(e);for(r=0,n=o.length;n>r;r++)t=o[r],a(t)||(i[t]=e[t]);return i}function i(e,t,r){Object.keys(e).filter(function(t){return!a(t)&&e[t]}).forEach(function(r){var a=e[r],s=t[r];if(s||(s=t[r]={}),a.$type){var c,u=a.value&&"object"==typeof a.value,h=!e[o];return c=u||h?n(a):a.value,void(t[r]=c)}i(a,s,r)})}var o=e(37),a=e(97);t.exports=function(e){var t={};return i(e,t),t}},{37:37,97:97}],15:[function(e,t,r){t.exports=function(e,t){for(var r=e._root.cache,n=-1,i=t.length;++n<i&&r&&!r.$type;)r=r[t[n]];return r}},{}],16:[function(e,t,r){var n=e(64),i=e(134);t.exports=function(e){for(var t=i.fromPath(e),r=0,o=t.length;++r<o;)if("object"==typeof t[r])return new n(function(e){e.onError(new Error("Paths must be simple paths"))});var a=this;return new n(function(e){return a.get(t).subscribe(function(r){for(var n=r.json,i=-1,o=t.length;n&&++i<o;)n=n[t[i]];e.onNext(n)},function(t){e.onError(t)},function(){e.onCompleted()})})}},{134:134,64:64}],17:[function(e,t,r){var n=e(11),i=e(25),o=e(27),a=e(29).promote,s=e(120),c=e(118),u=e(119);t.exports=function(e,t,r){for(var h,l,p,f,d,m=e._root.cache,v=t.length,g=[],y=!1,b=!1,_=0,x=m,w=m,S=m,M=!0,E=!1;x&&v>_;){if(null!==(h=t[_++])&&(x=w[h],g[g.length]=h),!x){S=void 0,y=!0,M=!1;break}if((p=x.$type)===c&&void 0===x.value){S=void 0,M=!1,y=v>_;break}if(v>_){if(p===s){if(o(x)){E=!0,S=void 0,M=!1;break}if(f=n(e,m,m,x,x.value),!(d=f[0])){S=void 0,x=void 0,M=!1;break}p=d.$type,x=d,g=f[1].slice(0)}if(p)break}else S=x;w=x}if(v>_&&!E){for(l=_;v>l;++l)if(null!==t[_]){b=!0;break}for(b?(y=!0,S=void 0):S=x,l=_;v>l;++l)null!==t[l]&&(g[g.length]=t[l])}if(S&&p&&(o(S)?S=void 0:a(e,S)),S&&p===u&&!e._treatErrorsAsValues)throw{path:_===v?t:t.slice(0,_),value:S.value};return S&&e._boxed?S=Boolean(p)&&!r?i(S):S:!S&&e._materialized?S={$type:c}:S&&(S=S.value),{value:S,shorted:y,optimizedPath:g,found:M}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(e,t,r){var n=e(46);t.exports=function(e,t){var r=e._getValueSync({_boxed:!0,_root:e._root,_treatErrorsAsValues:e._treatErrorsAsValues},t,!0).value,i=r&&r[n];return null==i?-1:i}},{46:46}],19:[function(e,t,r){var n=e(12),i=e(31),o=n(i,!1),a=n(i,!0);t.exports={getValueSync:e(17),getBoundValue:e(13),getWithPathsAsPathMap:o,getWithPathsAsJSONGraph:a}},{12:12,13:13,17:17,31:31}],20:[function(e,t,r){var n=e(29),i=e(25),o=n.promote;t.exports=function(e,t,r,n,a){var s=t.value;a.errors||(a.errors=[]),e._boxed&&(s=i(t)),a.errors.push({path:n.slice(0,r+1),value:s}),o(e,t)}},{25:25,29:29}],21:[function(e,t,r){function n(e,t,r,n,i,o,a){a.requestedMissingPaths.push(n.slice(0,r).concat(t)),a.optimizedMissingPaths.push(i.slice(0,o).concat(t))}var i=e(30).fastCopy;t.exports=function(e,t,r,o,a,s,c){o.requestedMissingPaths||(o.requestedMissingPaths=[],o.optimizedMissingPaths=[]),n(0,r<t.length?i(t,r):[],r,a,s,c,o)}},{30:30}],22:[function(e,t,r){var n=e(29),i=e(25),o=n.promote,a=e(120),s=e(118),c=e(119),u=e(37);t.exports=function(e,t,r,n,h,l,p,f,d,m){if(r){var v,g,y,b,_,x,w,S,M=!1;if(t&&o(e,t),t&&void 0!==t.value||(M=e._materialized),M)S={$type:s};else if(e._boxed)S=i(t);else if(t.$type===a||t.$type===c)S=d?i(t):t.value;else if(d){var E=t.value&&"object"==typeof t.value,C=!t[u];S=E||C?i(t):t.value}else S=t.value;if(h&&(h.hasValue=!0),d){for((_=r.jsonGraph)||(_=r.jsonGraph={},r.paths=[]),v=0,g=f-1;g>v;v++)b=p[v],_[b]||(_[b]={}),_=_[b];_[b=p[v]]=M?{$type:s}:S,l&&r.paths.push(l.slice(0,n))}else if(0===n)r.json=S;else{for((_=r.json)||(_=r.json={}),v=0;n-1>v;v++)y=l[v],_[y]||(_[y]={}),x=_,w=y,_=_[y];null!==(y=l[v])?_[y]=S:x[w]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(e,t,r){var n=e(27),i=e(26),o=e(29),a=i.remove,s=o.splice,c=e(119),u=e(20),h=e(22),l=e(21),p=e(28),f=e(35);t.exports=function(e,t,r,i,o,d,m,v,g,y,b){var _=t&&t.$type,x=t&&void 0===t.value;return t&&_?void(n(t)?(t[f]||(s(e,t),a(t)),l(e,r,i,d,m,v,g)):_===c?(b&&(m[i]=null),y||e._treatErrorsAsValues?h(e,t,o,i,d,m,v,g,y,b):u(e,t,i,m,d)):(b&&(m[i]=null),(!x||x&&e._materialized)&&h(e,t,o,i,d,m,v,g,y,b))):void(p(e)?h(e,t,o,i,d,m,v,g,y,b):l(e,r,i,d,m,v,g))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(e,t,r){var n=e(134);t.exports=function(e){var t=n.fromPath(e);if(!1===Array.isArray(t))throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(t=this._path.concat(t)),this._syncCheck("getValueSync")&&this._getValueSync(this,t).value}},{134:134}],25:[function(e,t,r){var n=e(40);t.exports=function(e){var t,r,i,o=Object.keys(e);for(t={},r=0,i=o.length;i>r;r++){var a=o[r];a[0]!==n&&(t[a]=e[a])}return t}},{40:40}],26:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports={create:function(e,t){var r=t[a]||0;t[n+r]=e,t[a]=r+1,e[o]=r,e[i]=t},remove:function(e){var t=e[i];if(t){for(var r=e[o],s=t[a];s>r;)t[n+r]=t[n+r+1],++r;t[a]=s-1,e[i]=void 0,e[o]=void 0}}}},{33:33,42:42,43:43,44:44}],27:[function(e,t,r){var n=e(106);t.exports=function(e){var t=void 0===e.$expires&&-1||e.$expires;return-1!==t&&1!==t&&(0===t||t<n())}},{106:106}],28:[function(e,t,r){t.exports=function(e){return e._materialized&&!e._source}},{}],29:[function(e,t,r){var n=e(34),i=e(45),o=e(38),a=e(41),s=e(35);t.exports={promote:function(e,t){var r=e._root,i=r[n];if(i!==t){var s=t[a],c=t[o];c&&(c[a]=s),s&&(s[o]=c),t[a]=void 0,r[n]=t,t[o]=i,i[a]=t}},splice:function(e,t){var r=e._root,c=t[a],u=t[o];u&&(u[a]=c),c&&(c[o]=u),t[a]=void 0,t===r[n]&&(r[n]=void 0),t===r[i]&&(r[i]=void 0),t[s]=!0,r.expired.push(t)}}},{34:34,35:35,38:38,41:41,45:45}],30:[function(e,t,r){t.exports={fastCat:function(e,t){var r,n,i,o=[];for(r=0,n=e.length;n>r;r++)o[r]=e[r];for(i=0,n=t.length;n>i;i++)o[r++]=t[i];return o},fastCatSkipNulls:function(e,t){var r,n,i,o=[];for(r=0,n=e.length;n>r;r++)o[r]=e[r];for(i=0,n=t.length;n>i;i++)null!==t[i]&&(o[r++]=t[i]);return o},fastCopy:function(e,t){var r,n,i,o=[];for(n=0,i=t||0,r=e.length;r>i;n++,i++)o[n]=e[i];return o}}},{}],31:[function(e,t,r){var n=e(11),i=e(23),o=e(27),a=e(143).iterateKeySet,s=e(120),c=e(29).promote;t.exports=function e(t,r,u,h,l,p,f,d,m,v,g,y){var b=y,_=m;if(!u||u&&u.$type||l===h.length)i(t,u,h,l,p,f,d,_,v,g,b);else{var x,w,S=l+1,M=!1,E=x=h[l];if("object"==typeof x&&(M={},E=a(x,M)),void 0!==E||!M.done){var C=v+1;do{b=!1;var T;null===E?T=u:(T=u[E],_[v]=E,d[l]=E);var O=_,P=C;if(T){var j=T.$type,A=j&&T.value||T;if(S<h.length&&j&&j===s&&!o(T)){g&&i(t,T,h,S,p,f,null,_,P,g,b),c(t,T);var R=n(t,r,r,T,A,p,g);b=!0,T=R[0];var L=R[1];for(O=[],P=L.length,w=0;P>w;++w)O[w]=L[w]}}e(t,r,T,h,S,p,f,d,O,P,g,b),M&&!M.done&&(E=a(x,M))}while(M&&!M.done)}}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(e,t,r){"use strict";function n(e){return new n.Model(e)}"function"==typeof Promise?n.Promise=Promise:n.Promise=e(151),t.exports=n,n.Model=e(2)},{151:151,2:2}],33:[function(e,t,r){t.exports=e(40)+"context"},{40:40}],34:[function(e,t,r){t.exports=e(40)+"head"},{40:40}],35:[function(e,t,r){t.exports=e(40)+"invalidated"},{40:40}],36:[function(e,t,r){t.exports=e(40)+"key"},{40:40}],37:[function(e,t,r){t.exports="$modelCreated"},{}],38:[function(e,t,r){t.exports=e(40)+"next"},{40:40}],39:[function(e,t,r){t.exports=e(40)+"parent"},{40:40}],40:[function(e,t,r){t.exports=String.fromCharCode(30)},{}],41:[function(e,t,r){t.exports=e(40)+"prev"},{40:40}],42:[function(e,t,r){t.exports=e(40)+"ref-index"},{40:40}],43:[function(e,t,r){t.exports=e(40)+"ref"},{40:40}],44:[function(e,t,r){t.exports=e(40)+"refs-length"},{40:40}],45:[function(e,t,r){t.exports=e(40)+"tail"},{40:40}],46:[function(e,t,r){t.exports=e(40)+"version"},{40:40}],47:[function(e,t,r){function n(e,t,r,i,a,s,u,h,l,p){if(!w(e)&&!e.$type)for(var f in e)if(f[0]!==c&&"$"!==f[0]&&y(e,f)){var d=e[f],m=b(d)&&!d.$type,v=o(r,i,a,f,d,m,!1,s,u,h,l,p),_=v[0],x=v[1];_&&(m?n(d,t+1,r,x,_,s,u,h,l,p):C(_,x,f,h)&&E(x,g(_),h,s))}}function i(e,t,r,n,i,a,c,l){if(_(r))return S(r,i,a),[void 0,t];v(a,r);var d=r,m=r.value,g=t;if(null!=(r=r[h]))g=r[u]||t;else{var y=0,b=m.length-1;g=r=t;do{var x=o(t,g,r,m[y],e,b>y,!0,n,i,a,c,l);if(r=x[0],w(r))return x;g=x[1]}while(y++<b);if(d[h]!==r){var M=r[f]||0;r[f]=M+1,r[s+M]=d,d[h]=r,d[p]=M}}return[r,g]}function o(e,t,r,n,o,s,c,u,h,l,p,f){for(var m=r.$type;m===d;){var v=i(o,e,r,u,h,l,p,f);if(r=v[0],w(r))return v;t=v[1],m=r&&r.$type}if(void 0!==m)return[r,t];if(null==n){if(s)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return[r,t]}var a=e(36),s=e(43),c=e(40),u=e(39),h=e(33),l=e(46),p=e(42),f=e(44),d=e(120),m=e(13),v=e(50),g=e(88),y=e(91),b=e(100),_=e(95),x=e(96),w=e(102),S=e(86),M=e(92),E=e(115),C=e(109);t.exports=function(e,t){for(var r=e._root,i=r,o=r.expired,a=M(),s=r._comparator,c=r._errorSelector,h=e._path,p=r.cache,f=h.length?m(e,h).value:p,d=f[u]||p,v=p[l],g=-1,y=t.length;++g<y;)n(t[g].json,0,p,d,f,a,o,i,s,c);var b=p[l],_=r.onChange;x(_)&&v!==b&&_()}},{100:100,102:102,109:109,115:115,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,88:88,91:91,92:92,95:95,96:96}],48:[function(e,t,r){function n(e,t,r,i,a,s,c,u){var h={},l=t<e.length-1,p=e[t],f=x(p,h);do{var d=o(r,i,a,f,l,!1,s,c,u),m=d[0],g=d[1];m&&(l?n(e,t+1,r,g,m,s,c,u):M(m,g,f,u)&&S(g,v(m),u,s)),f=x(p,h)}while(!h.done)}function i(e,t,r,n,i){if(g(t))return _(t,n,i),[void 0,e];m(i,t);var a=t,h=t.value,f=e;if(null!=(t=t[u]))f=t[c]||e;else{var d=0,v=h.length-1;f=t=e;do{var y=o(e,f,t,h[d],v>d,!0,r,n,i);if(t=y[0],b(t))return y;f=y[1]}while(d++<v);if(a[u]!==t){var x=t[p]||0;t[p]=x+1,t[s+x]=a,a[u]=t,a[l]=x}}return[t,f]}function o(e,t,r,n,o,s,c,u,h){for(var l=r.$type;l===f;){var p=i(e,r,c,u,h);if(r=p[0],b(r))return p;t=p[1],l=r.$type}if(void 0!==l)return[r,t];if(null==n){if(o)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return[r,t]}var a=e(36),s=e(43),c=e(39),u=e(33),h=e(46),l=e(42),p=e(44),f=e(120),d=e(13),m=e(50),v=e(88),g=e(95),y=e(96),b=e(102),_=e(86),x=e(143).iterateKeySet,w=e(92),S=e(115),M=e(109);t.exports=function(e,t){for(var r=e._root,i=r,o=r.expired,a=w(),s=e._path,u=r.cache,l=s.length?d(e,s).value:u,p=l[c]||u,f=u[h],m=-1,v=t.length;++m<v;)n(t[m],0,u,p,l,a,o,i);var g=u[h],b=r.onChange;y(b)&&f!==g&&b()}},{102:102,109:109,115:115,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,88:88,92:92,95:95,96:96}],49:[function(e,t,r){var n=e(36),i=e(39),o=e(34),a=e(45),s=e(38),c=e(41),u=e(108),h=e(115);t.exports=function(e,t,r,l,p,f){var d=r,m=p;"number"!=typeof m&&(m=.75);var v,g,y,b="number"==typeof f,_=l*m;for(g=t.pop();g;)y=g.$size||0,d-=y,!0===b?h(g,y,e,f):(v=g[i])&&u(g,v,g[n],e),g=t.pop();if(d>=l){var x=e[a];for(g=x;d>=_&&g;)x=x[c],y=g.$size||0,d-=y,!0===b&&h(g,y,e,f),g=x;e[a]=e[c]=g,null==g?e[o]=e[s]=void 0:g[s]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(e,t,r){var n=e(121),i=e(34),o=e(45),a=e(38),s=e(41),c=e(100);t.exports=function(e,t){if(c(t)&&t.$expires!==n){var r=e[i],u=e[o],h=t[a],l=t[s];t!==r&&(null!=h&&"object"==typeof h&&(h[s]=l),null!=l&&"object"==typeof l&&(l[a]=h),h=r,null!=r&&"object"==typeof r&&(r[s]=t),e[i]=e[a]=r=t,r[a]=h,r[s]=void 0),null!=u&&t!==u||(e[o]=e[s]=u=l||t)}return t}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(e,t,r){var n=e(34),i=e(45),o=e(38),a=e(41);t.exports=function(e,t){var r=e[n],s=e[i],c=t[o],u=t[a];null!=c&&"object"==typeof c&&(c[a]=u),null!=u&&"object"==typeof u&&(u[o]=c),t===r&&(e[n]=e[o]=c),t===s&&(e[i]=e[a]=u),t[o]=t[a]=void 0,r=s=c=u=void 0}},{34:34,38:38,41:41,45:45}],52:[function(e,t,r){function n(e,t){var r=!1;return function(){r||e._disposed||(r=!0,e._callbacks[t]=null,e._optimizedPaths[t]=[],e._requestedPaths[t]=[],0!==--e._count||e.sent||(e._disposable.dispose(),e.requestQueue.removeRequest(e)))}}function i(e){for(var t=[],r=-1,n=0,i=e.length;i>n;++n)for(var o=e[n],a=0,s=o.length;s>a;++a)t[++r]=o[a];return t}var o=e(59),a=e(60),s=0,c=e(57).GetRequest,u=e(76),h=e(78),l=e(119),p=[],f=function(e,t){this.sent=!1,this.scheduled=!1,this.requestQueue=t,this.id=++s,this.type=c,this._scheduler=e,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};f.prototype={batch:function(e,t,r){var i=this,o=i._optimizedPaths,s=i._requestedPaths,c=i._callbacks,u=o.length;return o[u]=t,s[u]=e,c[u]=r,++i._count,i.scheduled||(i.scheduled=!0,i._disposable=i._scheduler.schedule(function(){a(i,o,function(e,t){if(i.requestQueue.removeRequest(i),i._disposed=!0,i._count){i._merge(s,e,t);for(var r=0,n=c.length;n>r;++r){var o=c[r];o&&o(e,t)}}})})),n(i,u)},add:function(e,t,r){var i,a,s=this,c=o(e,t,s._pathMap);c?(a=c[2],i=c[1]):(a=e,i=t);var u=!1,h=!1;if(i.length<t.length){u=!0;var l=s._callbacks.length;s._callbacks[l]=r,s._requestedPaths[l]=c[0],s._optimizedPaths[l]=[],++s._count,h=n(s,l)}return[u,a,i,h]},_merge:function(e,t,r){var n=this.requestQueue.model,o=n._root,a=o.errorSelector,s=o.comparator,c=n._path;n._path=p;var f=i(e);if(t){var d=t;d instanceof Error&&(d={message:d.message}),d.$type||(d={$type:l,value:d});var m=f.map(function(e){return{path:e,value:d}});h(n,m,null,a,s)}else u(n,[{paths:f,jsonGraph:r.jsonGraph}],null,a,s);n._path=c}},t.exports=f},{119:119,57:57,59:59,60:60,76:76,78:78}],53:[function(e,t,r){function n(){this.length=0,this.pending=!1,this.pathmaps=[],a.call(this,this._subscribe)}var i=e(159),o=i.Observer,a=i.Observable,s=i.Disposable,c=i.SerialDisposable,u=i.CompositeDisposable,h=e(9),l=e(143).iterateKeySet;n.create=function(e,t,r){var n=new this;return n.queue=e,n.model=t,n.index=r,n},(n.prototype=Object.create(a.prototype)).constructor=n,n.prototype.insertPath=function(e,t,r,n,i){var o=n||0,a=i||e.length-1,s=r||this.pathmaps[a+1]||(this.pathmaps[a+1]=Object.create(null));if(void 0===s||null===s)return!1;var c,u,h=e[o],p={};c=l(h,p);do{if(u=s[c],a>o){if(null==u){if(t)return!1;u=s[c]=Object.create(null)}if(!1===this.insertPath(e,t,u,o+1,a))return!1}else s[c]=(u||0)+1,this.length+=1;p.done||(c=l(h,p))}while(!p.done);return!0},n.prototype.removePath=function(e,t,r,n){var i=r||0,o=n||e.length-1,a=t||this.pathmaps[o+1];if(void 0===a||null===a)return!0;var s,c,u=0,h=e[i],p={};s=l(h,p);do{if(void 0!==(c=a[s])&&null!==c){if(o>i){u+=this.removePath(e,c,i+1,o);var f=void 0;for(f in c)break;void 0===f&&delete a[s]}else 0===(c=a[s]=(c||1)-1)&&delete a[s],u+=1,this.length-=1;p.done||(s=l(h,p))}}while(!p.done);return u},n.prototype.getSourceObserver=function(e){var t=this;return o.create(function(r){r.jsonGraph=r.jsonGraph||r.jsong||r.values||r.value,r.index=t.index,e.onNext(r)},function(t){e.onError(t)},function(){e.onCompleted()})},n.prototype._subscribe=function(e){var t=this,r=this.queue;t.pending=!0;var n=!1,i=new c,o=s.create(function(){n||(n=!0,r&&r._remove(t))}),a=new u(i,o);try{i.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(e)))}catch(e){throw new h(e)}return a},t.exports=n},{143:143,159:159,9:9}],54:[function(e,t,r){function n(e,t){this.total=0,this.model=e,this.requests=[],this.scheduler=t}var i=e(58),o=e(40),a=e(90),s=e(100),c=e(143);n.prototype.set=function(e){return e.paths=c.collapse(e.paths),i.create(this.model,e)},n.prototype._remove=function(e){var t=this.requests,r=t.indexOf(e);-1!==r&&t.splice(r,1)},n.prototype.distributePaths=function(e,t,r){var n,i,o=this.model,a=-1,s=e.length,c=-1,u=t.length,h=[];e:for(;++a<s;){var l=e[a];for(c=-1;++c<u;)if((i=t[c]).insertPath(l,i.pending)){h[c]=i;continue e}n||(n=r.create(this,o,this.total++),t[c]=n,h[u++]=n),n.insertPath(l,!1)}var p=[],f=-1;for(c=-1;++c<u;)null!=(i=h[c])&&(p[++f]=i);return p},n.prototype.mergeJSONGraphs=function(e,t){var r=0,n=[],i=[],c=[],u=e.index,h=t.index;e.index=Math.max(u,h),n[-1]=e.jsonGraph||{},i[-1]=t.jsonGraph||{};e:for(;r>-1;){for(var l=n[r-1],p=i[r-1],f=c[r-1]||(c[r-1]=Object.keys(p));f.length>0;){var d=f.pop();if(d[0]!==o)if(l.hasOwnProperty(d)){var m=l[d],v=a(m),g=p[d],y=a(g);if(s(m)&&s(g)&&!v&&!y){n[r]=m,i[r]=g,r+=1;continue e}h>u&&(l[d]=g)}else l[d]=p[d]}r-=1}return e},t.exports=n},{100:100,143:143,40:40,58:58,90:90}],55:[function(e,t,r){function n(e,t){this.model=e,this.scheduler=t,this.requests=this._requests=[]}var i=e(54),o=e(56);n.prototype.get=o.prototype.get,n.prototype.removeRequest=o.prototype.removeRequest,n.prototype.set=i.prototype.set,n.prototype.call=i.prototype.call,t.exports=n},{54:54,56:56}],56:[function(e,t,r){function n(e,t){this.model=e,this.scheduler=t,this.requests=this._requests=[]}var i=e(57),o=e(52);n.prototype={setScheduler:function(e){this.scheduler=e},get:function(e,t,r){function n(){m||0==--l&&r()}var a,s,c,u=this,h=[],l=0,p=u._requests,f=t,d=e,m=!1;for(a=0,s=p.length;s>a;++a)if((c=p[a]).type===i.GetRequest){if(c.sent){var v=c.add(d,f,n);v[0]&&(d=v[1],f=v[2],h[h.length]=v[3],++l)}else c.batch(d,f,n),f=[],d=[],++l;if(!f.length)break}if(f.length){c=new o(u.scheduler,u),p[p.length]=c,++l;var g=c.batch(d,f,n);h[h.length]=g}return function(){if(!m&&0!==l){m=!0;for(var e=h.length,t=0;e>t;++t)h[t]()}}},removeRequest:function(e){for(var t=this._requests,r=t.length;--r>=0;)if(t[r].id===e.id){t.splice(r,1);break}}},t.exports=n},{52:52,57:57}],57:[function(e,t,r){t.exports={GetRequest:"GET"}},{}],58:[function(e,t,r){function n(){o.call(this)}var i=e(159).Observer,o=e(53),a=e(83),s=e(76),c=e(78),u=new Array(0);n.create=function(e,t){var r=new n;return r.model=e,r.jsonGraphEnvelope=t,r},(n.prototype=Object.create(o.prototype)).constructor=n,n.prototype.method="set",n.prototype.insertPath=function(){return!1},n.prototype.removePath=function(){return 0},n.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},n.prototype.getSourceObserver=function(e){var t=this.model,r=t._path,n=this.jsonGraphEnvelope.paths,h=t._root,l=h.errorSelector,p=h.comparator;return o.prototype.getSourceObserver.call(this,i.create(function(i){t._path=u;var o=s(t,[{paths:n,jsonGraph:i.jsonGraph}],null,l,p);i.paths=o[1],t._path=r,e.onNext(i)},function(i){t._path=u,c(t,a(n,function(e){return{path:e,value:i}}),null,l,p),t._path=r,e.onError(i)},function(){e.onCompleted()}))},t.exports=n},{159:159,53:53,76:76,78:78,83:83}],59:[function(e,t,r){var n=e(143).hasIntersection,i=e(84);t.exports=function(e,t,r){for(var o=[],a=[],s=[],c=-1,u=-1,h=!1,l=0,p=t.length;p>l;++l){var f=t[l],d=r[f.length];d&&n(d,f,0)?(!h&&l>0&&(a=i(e,0,l),o=i(t,0,l)),s[++c]=e[l],h=!0):h&&(o[++u]=f,a[u]=e[l])}return h?[s,o,a]:null}},{143:143,84:84}],60:[function(e,t,r){var n=e(143),i=n.toTree,o=n.toPaths;t.exports=function(e,t,r){if(0!==e._count){e.sent=!0,e.scheduled=!1;for(var n=e._pathMap,a=0,s=Object.keys(t).length;s>a;++a)for(var c=t[a],u=0,h=c.length;h>u;++u){var l=c[u],p=l.length;if(n[p]){var f=n[p];f[f.length]=l}else n[p]=[l]}for(var d=Object.keys(n),m=0,v=d.length;v>m;++m){var g=d[m];n[g]=i(n[g])}var y,b=e._collasped=o(n);e.requestQueue.model._source.get(b).subscribe(function(e){y=e},function(e){r(e,y)},function(){r(null,y)})}else e.requestQueue.removeRequest(e)}},{143:143}],61:[function(e,t,r){function n(e){s.call(this,e||o)}function i(e){return a.Observable.defer(function(){return e})}function o(e){function t(e){return b.concat(e)}var r=this.args,n=this.model,o=l.fromPath(r[0]),u=r[1]||[],f=(r[2]||[]).map(l.fromPath),d=(r[3]||[]).map(l.fromPath),m=n._clone({_path:[]}),v=m.withoutDataSource(),g=n._path,y=g.concat(o),b=y.slice(0,-1),_=i(n.withoutDataSource().get(o)).map(function(e){for(var t=e.json,r=-1,n=o.length;t&&++r<n;)t=t[o[r]];return{model:m._derefSync(b).boxValues(),localFn:t}}).flatMap(function(e){function r(e,t){var r=t.path;return e.push.apply(e,f.map(function(e){return r.concat(e)})),e}function n(e){return e.path}var o=e&&e.localFn;if("function"==typeof o){var a=e.model,c=a._path,h=o.apply(a,u).reduce(function(e,r){if(Boolean(r.invalidated))e.invalidations.push(e.localThisPath.concat(r.path));else{var n=r.path,i=r.value;Boolean(i)&&"object"==typeof i&&i.$type===p?e.references.push({path:t(n),value:r.value}):e.values.push({path:t(n),value:r.value})}return e},{values:[],references:[],invalidations:[],localThisPath:c}).flatMap(function(e){var t=e.values.concat(e.references);return t.length>0?i(v.set.apply(v,t)._toJSONG()).map(function(t){return{results:e,envelope:t}}):s.return({results:e,envelope:{jsonGraph:{},paths:[]}})}).flatMap(function(e){var o=e.envelope,a=e.results,c=a.values,u=a.references,h=a.invalidations,l=c.map(n).map(t),p=u.reduce(r,[]),f=d.map(t),v=p.concat(f);return(v.length>0?i(m.get.apply(m,l.concat(v))._toJSONG()):s.return(o)).doAction(function(e){e.invalidated=h})});return s.return(h)}return s.empty()}).defaultIfEmpty(function(e){return e&&"object"==typeof e?a.Observable.defer(function(){var t;try{t=e.call(y,u,f,d)}catch(e){t=s.throw(new h(e))}return t}).map(function(e){var t=e.invalidated;return t&&t.length&&m.invalidate.apply(m,t),e}):s.empty()}(n._source)).mergeAll().flatMap(function(e){return i(v.set(e)).reduce(function(e){return e},null).map(function(){return{invalidated:e.invalidated,paths:e.paths.map(function(e){return e.slice(g.length)})}})}),x=new c;return x.add(_.subscribe(function(t){var r=t.paths,o=t.invalidated,a=n.get.apply(n,r);"AsJSONG"===e.outputFormat&&(a=i(a._toJSONG()).doAction(function(e){e.invalidated=o})),x.add(a.subscribe(e))},function(t){e.onError(t)})),x}var a=e(159)&&e(158),s=a.Observable,c=a.CompositeDisposable,u=e(64),h=e(9),l=e(134),p=e(120);n.create=u.create,(n.prototype=Object.create(s.prototype)).constructor=n,n.prototype.invokeSourceRequest=function(e){return this},n.prototype.ensureCollect=function(e){return this},n.prototype.initialize=function(){return this},t.exports=n},{120:120,134:134,158:158,159:159,64:64,9:9}],62:[function(e,t,r){function n(e){i.call(this,e)}var i=e(159).Observable,o=e(64),a=e(134),s=e(88),c=e(49),u=e(81),h=e(46),l=Array.isArray,p=e(101),f=e(98),d=e(99);n.create=o.create,(n.prototype=Object.create(i.prototype)).constructor=n,n.prototype.subscribeCount=0,n.prototype.subscribeLimit=10,n.prototype.initialize=function(){for(var e,t,r=this.model,n=this.outputFormat||"AsPathMap",i=this.isProgressive,o=[{}],s=[],c=this.args,h=-1,m=c.length;++h<m;){var v,g=c[h];l(g)||"string"==typeof g?(g=a.fromPath(g),v="PathValues"):p(g)?(g.path=a.fromPath(g.path),v="PathValues"):d(g)?v="JSONGs":f(g)&&(v="PathMaps"),t!==v&&(t=v,e={inputType:v,arguments:[]},s.push(e),e.values=o),e.arguments.push(g)}return this.boundPath=u(r._path),this.groups=s,this.outputFormat=n,this.isProgressive=i,this.isCompleted=!1,this.isMaster=null==r._source,this.values=o,this},n.prototype.invokeSourceRequest=function(e){return this},n.prototype.ensureCollect=function(e){var t=this.finally(function(){var t=e._root,r=t.cache;t.collectionScheduler.schedule(function(){c(t,t.expired,s(r),e._maxSize,e._collectRatio,r[h])})});return new this.constructor(function(e){return t.subscribe(e)})},t.exports=n},{101:101,134:134,159:159,46:46,49:49,64:64,81:81,88:88,98:98,99:99}],63:[function(e,t,r){function n(e){a.call(this,e||i)}function i(e){for(var t=this.model,r=this.method,n=this.groups,i=-1,a=n.length;++i<a;){var s=n[i],c=s.inputType,u=s.arguments;u.length>0&&(0,t["_"+r+c+"AsJSON"])(t,u)}return e.onCompleted(),o.empty}var o=e(159).Disposable,a=e(62);n.create=a.create,(n.prototype=Object.create(a.prototype)).method="invalidate",n.prototype.constructor=n,t.exports=n},{159:159,62:62}],64:[function(e,t,r){function n(e){this._subscribe=e}function i(e){var t=this.model,r=new this.type;return r.model=t,r.args=this.args,r.outputFormat=e.outputFormat||"AsPathMap",r.isProgressive=e.isProgressive||!1,r.subscribeCount=0,r.subscribeLimit=e.retryLimit||10,r.initialize().invokeSourceRequest(t).ensureCollect(t).subscribe(e)}var o=e(32),a=(e(159)&&e(158)).Observable,s=e(84),c=e(105),u={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};n.create=function(e,t){var r=new n(i);return r.args=t,r.type=this,r.model=e,r},(n.prototype=Object.create(a.prototype)).constructor=n,n.prototype._mixin=function(){var e=this,t=s(arguments);return new e.constructor(function(r){return e.subscribe(t.reduce(function(e,t){return Object.create(e,t)},r))})},n.prototype._toJSONG=function(){return this._mixin(u)},n.prototype.progressively=function(){return this._mixin(h)},n.prototype.subscribe=function(e,t,r){var n=e;n&&"object"==typeof n||(n={onNext:e||c,onError:t||c,onCompleted:r||c});var i=this._subscribe(n);switch(typeof i){case"function":return{dispose:i};case"object":return i||{dispose:c};default:return{dispose:c}}},n.prototype.then=function(e,t){var r=this;return new o.Promise(function(e,t){var n,i=!1;r.toArray().subscribe(function(e){n=e.length<=1?e[0]:e},function(e){i=!0,t(e)},function(){!1===i&&e(n)})}).then(e,t)},t.exports=n},{105:105,158:158,159:159,32:32,84:84}],65:[function(e,t,r){function n(e){f.call(this,e||i)}function i(e){return this.isCompleted?a.call(this,e):o.call(this,e)}function o(e){if(this.subscribeCount++>this.subscribeLimit)return e.onError("Loop kill switch thrown."),l.empty;for(var t=[],r=[],n=this.model,i=this.isMaster,o=n._root,u=this.outputFormat,h=o.errorSelector,p=this.method,f=this.groups,d=-1,v=f.length;++d<v;){var g=f[d],y=g.inputType,b=g.arguments;if(b.length>0){var _=(0,n["_"+p+y+u])(n,b,null,h);r.push.apply(r,_[1]),"PathValues"===y?t.push.apply(t,b.map(s)):"JSONGs"===y?t.push.apply(t,m(b,c)):t.push.apply(t,_[0])}}return this.requestedPaths=t,i?(this.isCompleted=!0,a.call(this,e)):void e.onError({method:p,optimizedPaths:r,invokeSourceRequest:!0})}function a(e){var t=new p(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(t=t._toJSONG()),this.isProgressive&&(t=t.progressively()),t.subscribe(e)}function s(e){return e.path}function c(e){return e.paths}var u=e(159),h=u.Observable,l=u.Disposable,p=e(67),f=e(62),d=e(9),m=e(82),v=new Array(0);n.create=f.create,(n.prototype=Object.create(f.prototype)).method="set",n.prototype.constructor=n,n.prototype.invokeSourceRequest=function(e){var t=this,r=this.catch(function(n){var i;if(n&&!0===n.invokeSourceRequest){var o={},a=e._path,s=n.optimizedPaths;e._path=v,e._getPathValuesAsJSONG(e._materialize().withoutDataSource(),s,[o]),e._path=a,i=e._request.set(o).do(function(e){t.isCompleted=s.length===e.paths.length},function(){t.isCompleted=!0}).materialize().flatMap(function(e){if("C"===e.kind)return h.empty();if("E"===e.kind){var t=e.exception;if(d.is(t))return h.throw(e.exception)}return r})}else i=h.throw(n);return i});return new this.constructor(function(e){return r.subscribe(e)})},t.exports=n},{159:159,62:62,67:67,82:82,9:9}],66:[function(e,t,r){var n=function(e){this.disposed=!1,this.currentDisposable=e};n.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var e=this.currentDisposable;e.dispose?e.dispose():e()}}},t.exports=n},{}],67:[function(e,t,r){var n=e(64),i=e(68),o=e(69),a={dispose:function(){}},s=e(159).Observable,c=t.exports=function(e,t,r,n){this.model=e,this.currentRemainingPaths=t,this.isJSONGraph=r||!1,this.isProgressive=n||!1};c.prototype=Object.create(s.prototype),c.prototype.subscribe=n.prototype.subscribe,c.prototype.then=n.prototype.then,c.prototype._toJSONG=function(){return new c(this.model,this.currentRemainingPaths,!0,this.isProgressive)},c.prototype.progressively=function(){return new c(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},c.prototype._subscribe=function(e){var t=[{}],r=[],n=e.isJSONG=this.isJSONGraph,s=this.isProgressive,c=i(this.model,this.currentRemainingPaths,e,s,n,t,r);return c?o(this,this.model,c,e,t,r,1):a}},{159:159,64:64,68:68,69:69}],68:[function(e,t,r){var n=e(19),i=n.getWithPathsAsJSONGraph,o=n.getWithPathsAsPathMap;t.exports=function(e,t,r,n,a,s,c){var u;if((u=a?i(e,t,s):o(e,t,s)).criticalError)return r.onError(u.criticalError),null;var h=u.hasValue,l=!u.requestedMissingPaths||!e._source,p=s[0].json||s[0].jsonGraph;if(u.errors)for(var f=u.errors,d=c.length,m=0,v=f.length;v>m;++m,++d)c[d]=f[m];if(h&&n||p&&l)try{++e._root.syncRefCount,r.onNext(s[0])}catch(e){throw e}finally{--e._root.syncRefCount}return l?(c.length?r.onError(c):r.onCompleted(),null):u}},{19:19}],69:[function(e,t,r){var n=e(68),i=e(10),o=e(30).fastCat,a=e(49),s=e(88),c=e(66),u=e(46);t.exports=function e(t,r,h,l,p,f,d){if(10===d)throw new i;var m=r._request,v=h.requestedMissingPaths,g=h.optimizedMissingPaths,y=new c,b=[],_=r._path;if(_.length)for(var x=0,w=v.length;w>x;++x)b[x]=o(_,v[x]);else b=v;var S=m.get(b,g,function(){var i=n(r,v,l,t.isProgressive,t.isJSONGraph,p,f);if(i)y.currentDisposable=e(t,r,i,l,p,f,d+1);else{var o=r._root,c=o.cache,h=c[u];a(o,o.expired,s(c),r._maxSize,r._collectRatio,h)}});return y.currentDisposable=S,y}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(e,t,r){var n=e(67);t.exports=function(e){return new n(this,e)}},{67:67}],71:[function(e,t,r){var n=e(134),i=e(64),o=e(72),a=e(116),s=e(67);t.exports=function(){var e=a(arguments,o,"get");if(!0!==e)return new i(function(t){t.onError(e)});var t=n.fromPathsOrPathValues(arguments);return new s(this,t)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(e,t,r){t.exports={path:!0,pathSyntax:!0}},{}],73:[function(e,t,r){function n(){}var i=e(123),o=e(159).Disposable;n.prototype.schedule=function(e){return i(e),o.empty},n.prototype.scheduleWithState=function(e,t){var r=this;return i(function(){t(r,e)}),o.empty},t.exports=n},{123:123,159:159}],74:[function(e,t,r){function n(){}var i=e(159).Disposable;n.prototype.schedule=function(e){return e(),i.empty},n.prototype.scheduleWithState=function(e,t){return t(this,e),i.empty},t.exports=n},{159:159}],75:[function(e,t,r){function n(e){this.delay=e}var i=e(159).Disposable;n.prototype.schedule=function(e){var t=setTimeout(e,this.delay);return i.create(function(){void 0!==t&&(clearTimeout(t),t=void 0)})},n.prototype.scheduleWithState=function(e,t){var r=this,n=setTimeout(function(){t(r,e)},this.delay);return i.create(function(){void 0!==n&&(clearTimeout(n),n=void 0)})},t.exports=n},{159:159}],76:[function(e,t,r){function n(e,t,r,i,a,s,c,u,h,l,p,d,m,v,g,b,_){for(var x={},w=t<e.length-1,S=e[t],M=y(S,x),E=d.index;;){p.depth=t;var C=o(r,i,a,s,c,u,M,w,!1,p,d,m,v,g,b,_);p[t]=M,p.index=t,d[d.index++]=M;var T=C[0],O=C[1];if(T&&(w?n(e,t+1,r,O,T,s,C[3],C[2],h,l,p,d,m,v,g,b,_):(f(g,T),h.push(p.slice(0,p.index+1)),l.push(d.slice(0,d.index)))),M=y(S,x),x.done)break;d.index=E}}function i(e,t,r,n,i,a,u,p,m,y,b){var _=t.value;if(a.splice(0,a.length),a.push.apply(a,_),d(t))return a.index=_.length,g(t,p,m),[void 0,e,n,r];f(m,t);var x=0,w=t,S=_.length-1,M=t=e,E=n=r;do{var C=o(e,M,t,r,E,n,_[x],S>x,!0,i,a,u,p,m,y,b);if(t=C[0],v(t))return a.index=x,C;M=C[1],n=C[2],E=C[3]}while(x++<S);if(a.index=x,w[c]!==t){var T=t[l]||0;t[l]=T+1,t[s+T]=w,w[c]=t,w[h]=T}return[t,M,n,E]}function o(e,t,r,n,o,s,c,u,h,l,f,d,m,g,y,b){for(var x=r.$type;x===p;){var w=i(e,r,n,s,l,f,d,m,g,y,b);if(r=w[0],v(r))return w;t=w[1],s=w[2],o=w[3],x=r.$type}if(void 0!==x)return[r,t,s,o];if(null==c){if(u)throw new Error("`null` is not allowed in branch key positions.");r&&(c=r[a])}else t=r,o=s,r=t[c],s=o&&o[c];return r=_(t,r,s,c,l,f,d,m,g,y,b),[r,t,s,o]}var a=e(36),s=e(43),c=e(33),u=e(46),h=e(42),l=e(44),p=e(120),f=e(50),d=e(94),m=e(96),v=e(102),g=e(86),y=e(143).iterateKeySet,b=e(92),_=e(103);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,c=a.expired,h=b(),l=a.cache,p=l[u],f=[],d=[],v=[],g=[],y=-1,_=t.length;++y<_;)for(var x=t[y],w=x.paths,S=x.jsonGraph,M=-1,E=w.length;++M<E;){var C=w[M];d.index=0,n(C,0,l,l,l,S,S,S,v,g,f,d,h,c,s,o,i)}var T=l[u],O=a.onChange;return m(O)&&p!==T&&O(),[v,g]}},{102:102,103:103,120:120,143:143,33:33,36:36,42:42,43:43,44:44,46:46,50:50,86:86,92:92,94:94,96:96}],77:[function(e,t,r){function n(e,t,r,i,s,c,u,h,l,p,f,d,m,v){var g=a(e);if(g&&g.length)for(var b=0,x=g.length,w=l.index;;){var S=g[b],M=e[S],E=_(M)&&!M.$type;h.depth=t;var C=o(r,i,s,S,M,E,!1,h,l,p,f,d,m,v);h[t]=S,h.index=t,l[l.index++]=S;var T=C[0],O=C[1];if(T&&(E?n(M,t+1,r,O,T,c,u,h,l,p,f,d,m,v):(y(d,T),c.push(h.slice(0,h.index+1)),u.push(l.slice(0,l.index)))),++b>=x)break;l.index=w}}function i(e,t,r,n,i,a,s,u,p,m){var v=r.value;if(i.splice(0,i.length),i.push.apply(i,v),x(r))return i.index=v.length,M(r,s,u),[void 0,t];y(u,r);var g=r,b=t;if(null!=(r=r[l]))b=r[h]||t,i.index=v.length;else{var _=0,w=v.length-1;b=r=t;do{var E=o(t,b,r,v[_],e,w>_,!0,n,i,a,s,u,p,m);if(r=E[0],S(r))return i.index=_,E;b=E[1]}while(_++<w);if(i.index=_,g[l]!==r){var C=r[d]||0;r[d]=C+1,r[c+C]=g,g[l]=r,g[f]=C}}return[r,b]}function o(e,t,r,n,o,a,c,u,h,l,p,f,d,v){for(var g=r.$type;g===m;){var y=i(o,e,r,u,h,l,p,f,d,v);if(r=y[0],S(r))return y;t=y[1],g=r&&r.$type}if(void 0!==g)return[r,t];if(null==n){if(a)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[s])}else t=r,r=t[n];return r=C(t,r,n,o,a,c,u,h,l,p,f,d,v),[r,t]}function a(e){if(_(e)&&!e.$type){var t=[],r=0;g(e)&&(t[r++]="length");for(var n in e)n[0]!==u&&"$"!==n[0]&&b(e,n)&&(t[r++]=n);return t}}var s=e(36),c=e(43),u=e(40),h=e(39),l=e(33),p=e(46),f=e(42),d=e(44),m=e(120),v=e(13),g=Array.isArray,y=e(50),b=e(91),_=e(100),x=e(95),w=e(96),S=e(102),M=e(86),E=e(92),C=e(104);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,c=a.expired,u=E(),l=e._path,f=a.cache,d=l.length?v(e,l).value:f,m=d[h]||f,g=f[p],y=[],b=[],_=[],x=l.length,S=-1,M=t.length;++S<M;){var C=t[S],T=l.slice(0);T.index=x,n(C.json,0,f,m,d,b,_,y,T,u,c,s,o,i)}var O=f[p],P=a.onChange;return w(P)&&g!==O&&P(),[b,_]}},{100:100,102:102,104:104,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,91:91,92:92,95:95,96:96}],78:[function(e,t,r){function n(e,t,r,i,a,s,c,u,h,l,p,f,d,v,g){for(var y={},b=r<t.length-1,x=t[r],w=_(x,y),S=l.index;;){h.depth=r;var M=o(i,a,s,w,e,b,!1,h,l,p,f,d,v,g);h[r]=w,h.index=r,l[l.index++]=w;var E=M[0],C=M[1];if(E&&(b?n(e,t,r+1,i,C,E,c,u,h,l,p,f,d,v,g):(m(d,E),c.push(h.slice(0,h.index+1)),u.push(l.slice(0,l.index)))),w=_(x,y),y.done)break;l.index=S}}function i(e,t,r,n,i,a,h,f,d,g){var _=r.value;if(i.splice(0,i.length),i.push.apply(i,_),v(r))return i.index=_.length,b(r,h,f),[void 0,t];m(f,r);var x=r,w=t;if(null!=(r=r[u]))w=r[c]||t,i.index=_.length;else{var S=0,M=_.length-1;w=r=t;do{var E=o(t,w,r,_[S],e,M>S,!0,n,i,a,h,f,d,g);if(r=E[0],y(r))return i.index=S,E;w=E[1]}while(S++<M);if(i.index=S,x[u]!==r){var C=r[p]||0;r[p]=C+1,r[s+C]=x,x[u]=r,x[l]=C}}return[r,w]}function o(e,t,r,n,o,s,c,u,h,l,p,d,m,v){for(var g=r.$type;g===f;){var b=i(o,e,r,u,h,l,p,d,m,v);if(r=b[0],y(r))return b;t=b[1],g=r.$type}if(void 0!==g)return[r,t];if(null==n){if(s)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return r=w(t,r,n,o,s,c,u,h,l,p,d,m,v),[r,t]}var a=e(36),s=e(43),c=e(39),u=e(33),h=e(46),l=e(42),p=e(44),f=e(120),d=e(13),m=e(50),v=e(95),g=e(96),y=e(102),b=e(86),_=e(143).iterateKeySet,x=e(92),w=e(104);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,u=a.expired,l=x(),p=e._path,f=a.cache,m=p.length?d(e,p).value:f,v=m[c]||f,y=f[h],b=[],_=[],w=[],S=p.length,M=-1,E=t.length;++M<E;){var C=t[M],T=C.path,O=C.value,P=p.slice(0);P.index=S,n(O,T,0,f,v,m,_,w,b,P,l,u,s,o,i)}var j=f[h],A=a.onChange;return g(A)&&y!==j&&A(),[_,w]}},{102:102,104:104,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,92:92,95:95,96:96}],79:[function(e,t,r){var n=e(130),i=e(64),o=e(101);t.exports=function(e,t){for(var r=o(e)?e:n.pathValue(e,t),a=0,s=r.path,c=s.length;++a<c;)if("object"==typeof s[a])return new i(function(e){e.onError(new Error("Paths must be simple paths"))});var u=this;return new i(function(e){return u._set(r).subscribe(function(t){for(var r=t.json,n=-1,i=s.length;r&&++n<i;)r=r[s[n]];e.onNext(r)},function(t){e.onError(t)},function(){e.onCompleted()})})}},{101:101,130:130,64:64}],80:[function(e,t,r){var n=e(134),i=e(101),o=e(78);t.exports=function(e,t,r,a){var s=n.fromPath(e),c=t,u=r,h=a;if(i(s)?(h=u,u=c,c=s):c={path:s,value:c},!1===i(c))throw new Error("Model#setValueSync must be called with an Array path.");return"function"!=typeof u&&(u=this._root._errorSelector),"function"!=typeof h&&(h=this._root._comparator),this._syncCheck("setValueSync")?(o(this,[c]),this._getValueSync(this,c.path).value):void 0}},{101:101,134:134,78:78}],81:[function(e,t,r){t.exports=function(e){if(!e)return e;for(var t=-1,r=e.length,n=[];++t<r;)n[t]=e[t];return n}},{}],82:[function(e,t,r){t.exports=function(e,t){for(var r=-1,n=-1,i=e.length,o=[];++n<i;)for(var a=t(e[n],n,e),s=-1,c=a.length;++s<c;)o[++r]=a[s];return o}},{}],83:[function(e,t,r){t.exports=function(e,t){for(var r=-1,n=e.length,i=new Array(n);++r<n;)i[r]=t(e[r],r,e);return i}},{}],84:[function(e,t,r){t.exports=function(e,t,r){var n=t||0,i=-1,o=e.length-n;0>o&&(o=0),r>0&&o>r&&(o=r);for(var a=new Array(o);++i<o;)a[i]=e[i+n];return a}},{}],85:[function(e,t,r){var n=e(40),i=e(91),o=Array.isArray,a=e(100);t.exports=function(e){var t=e;if(a(t)){t=o(e)?[]:{};var r=e;for(var s in r)s[0]!==n&&i(r,s)&&(t[s]=r[s])}return t}},{100:100,40:40,91:91}],86:[function(e,t,r){var n=e(51),i=e(35);t.exports=function(e,t,r){return e[i]||(e[i]=!0,t.push(e),n(r,e)),e}},{35:35,51:51}],87:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$expires||void 0}},{100:100}],88:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$size||0}},{100:100}],89:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$timestamp||void 0}},{100:100}],90:[function(e,t,r){var n=e(100);t.exports=function(e,t){var r=n(e)&&e.$type||void 0;return t&&r?"branch":r}},{100:100}],91:[function(e,t,r){var n=e(100),i=Object.prototype.hasOwnProperty;t.exports=function(e,t){return n(e)&&i.call(e,t)}},{100:100}],92:[function(e,t,r){var n=1;t.exports=function(){return n++}},{}],93:[function(e,t,r){var n=e(36),i=e(39),o=e(46);t.exports=function(e,t,r,a){return e[n]=r,e[i]=t,e[o]=a,t[r]=e,e}},{36:36,39:39,46:46}],94:[function(e,t,r){var n=e(106),i=e(122),o=e(121);t.exports=function(e){var t=e.$expires;return null!=t&&t!==o&&t!==i&&t<n()}},{106:106,121:121,122:122}],95:[function(e,t,r){var n=e(106),i=e(122),o=e(121);t.exports=function(e){var t=e.$expires;return null!=t&&t!==o&&(t===i||t<n())}},{106:106,121:121,122:122}],96:[function(e,t,r){t.exports=function(e){return Boolean(e)&&"function"==typeof e}},{}],97:[function(e,t,r){var n=e(40);t.exports=function(e){return"$size"===e||e&&e.charAt(0)===n}},{40:40}],98:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&"json"in e}},{100:100}],99:[function(e,t,r){var n=Array.isArray,i=e(100);t.exports=function(e){return i(e)&&n(e.paths)&&(i(e.jsonGraph)||i(e.jsong)||i(e.json)||i(e.values)||i(e.value))}},{100:100}],100:[function(e,t,r){t.exports=function(e){return null!==e&&"object"==typeof e}},{}],101:[function(e,t,r){var n=Array.isArray,i=e(100);t.exports=function(e){return i(e)&&(n(e.path)||"string"==typeof e.path)}},{100:100}],102:[function(e,t,r){t.exports=function(e){return null==e||"object"!=typeof e}},{}],103:[function(e,t,r){var n=e(36),i=e(39),o=e(120),a=e(119),s=e(88),c=e(89),u=e(100),h=e(95),l=e(96),p=e(50),f=e(117),d=e(93),m=e(86),v=e(110),g=e(115),y=e(107);t.exports=function(e,t,r,b,_,x,w,S,M,E,C){var T,O,P,j,A,R,L;if(t===r){if(null===r)return t=f(r,void 0,r),e=g(e,-t.$size,M,w),t=d(t,e,b),p(M,t),t;if(void 0===r)return r;if((j=u(t))&&null==(O=t.$type))return null==t[i]&&(t[n]=b,t[i]=e),t}else(j=u(t))&&(O=t.$type);if(O!==o){if((A=u(r))&&(P=r.$type),j&&!O&&(null==r||A&&!P))return t}else{if(null==r)return h(t)?void m(t,S,M):t;if((A=u(r))&&(P=r.$type)===o)if(t===r){if(null!=t[i])return t}else if(R=t.$timestamp,L=r.$timestamp,!h(t)&&!h(r)&&R>L)return}if(O&&A&&!P)return d(v(t,r,e,b,M),e,b);if(P||!A){if(P===a&&l(C)&&(r=C(y(_,b),r)),P&&t===r)null==t[i]&&(t=f(t,O,t.value),e=g(e,-t.$size,M,w),t=d(t,e,b,w));else{var N=!0;!O&&j||(N=c(r)<c(t)==0,(O||P)&&l(E)&&(N=!E(t,r,x.slice(0,x.index)))),N&&(r=f(r,P,P?r.value:r),T=s(t)-s(r),t=v(t,r,e,b,M),e=g(e,T,M,w),t=d(t,e,b,w))}h(t)?m(t,S,M):p(M,t)}else null==t&&(t=d(r,e,b));return t}},{100:100,107:107,110:110,115:115,117:117,119:119,120:120,36:36,39:39,50:50,86:86,88:88,89:89,93:93,95:95,96:96}],104:[function(e,t,r){var n=e(120),i=e(119),o=e(90),a=e(88),s=e(89),c=e(95),u=e(102),h=e(96),l=e(117),p=e(86),f=e(93),d=e(110),m=e(115),v=e(114),g=e(107);t.exports=function(e,t,r,y,b,_,x,w,S,M,E,C,T){var O=o(t,_);if(b||_)O&&c(t)&&(O="expired",p(t,M,E)),(O&&O!==n||u(t))&&(t=d(t,{},e,r,E),t=f(t,e,r,S),t=v(t,S));else{var P=y,j=o(P),A=s(P)<s(t)==0;if((O||j)&&h(C)&&(A=!C(t,P,w.slice(0,w.index))),A){j===i&&h(T)&&(P=T(g(x,r),P)),P=l(P,j,j?P.value:P);var R=a(t)-a(P);t=d(t,P,e,r,E),e=m(e,R,E,S),t=f(t,e,r,S)}}return t}},{102:102,107:107,110:110,114:114,115:115,117:117,119:119,120:120,86:86,88:88,89:89,90:90,93:93,95:95,96:96}],105:[function(e,t,r){t.exports=function(){}},{}],106:[function(e,t,r){t.exports=Date.now},{}],107:[function(e,t,r){t.exports=function(e,t){var r=e.slice(0,e.depth);return r[r.length]=t,r}},{}],108:[function(e,t,r){var n=e(120),i=e(39),o=e(51),a=e(100),s=e(112),c=e(113);t.exports=function(e,t,r,u){if(a(e)){var h=e.$type;return Boolean(h)&&(h===n&&c(e),o(u,e)),s(e),t[r]=e[i]=void 0,!0}return!1}},{100:100,112:112,113:113,120:120,39:39,51:51}],109:[function(e,t,r){var n=e(91),i=e(40),o=e(108);t.exports=function e(t,r,a,s){if(o(t,r,a,s)){if(null==t.$type)for(var c in t)c[0]!==i&&"$"!==c[0]&&n(t,c)&&e(t[c],t,c,s);return!0}return!1}},{108:108,40:40,91:91}],110:[function(e,t,r){var n=e(100),i=e(111),o=e(109);t.exports=function(e,t,r,a,s){return e===t?e:(n(e)&&(i(e,t),o(e,r,a,s)),r[a]=t,t)}},{100:100,109:109,111:111}],111:[function(e,t,r){var n=e(43),i=e(33),o=e(44);t.exports=function(e,t){for(var r=e[o]||0,a=t[o]||0,s=-1;++s<r;){var c=e[n+s];void 0!==c&&(c[i]=t,t[n+(a+s)]=c,e[n+s]=void 0)}return t[o]=r+a,e[o]=void 0,t}},{33:33,43:43,44:44}],112:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports=function(e){for(var t=-1,r=e[a]||0;++t<r;){var s=e[n+t];null!=s&&(s[i]=s[o]=e[n+t]=void 0)}return e[a]=void 0,e}},{33:33,42:42,43:43,44:44}],113:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports=function(e){var t=e[i];if(t){for(var r=(e[o]||0)-1,s=(t[a]||0)-1;++r<=s;)t[n+r]=t[n+(r+1)];t[a]=s,e[o]=e[i]=t=void 0}return e}},{33:33,42:42,43:43,44:44}],114:[function(e,t,r){var n=e(43),i=e(39),o=e(46),a=e(44);t.exports=function(e,t){var r=[e],s=0;do{var c=r[s--];if(c&&c[o]!==t){c[o]=t,r[s++]=c[i];for(var u=-1,h=c[a]||0;++u<h;)r[s++]=c[n+u]}}while(s>-1);return e}},{39:39,43:43,44:44,46:46}],115:[function(e,t,r){var n=e(36),i=e(46),o=e(39),a=e(108),s=e(114);t.exports=function(e,t,r,c){var u=e;do{var h=u[o];0>=(u.$size=(u.$size||0)-t)&&null!=h?a(u,h,u[n],r):u[i]!==c&&s(u,c),u=h}while(u);return e}},{108:108,114:114,36:36,39:39,46:46}],116:[function(e,t,r){var n=Array.isArray,i=e(101),o=e(99),a=e(98),s=e(134);t.exports=function(e,t,r){for(var c=0,u=e.length;u>c;++c){var h=e[c],l=!1;if(n(h)&&t.path?l=!0:"string"==typeof h&&t.pathSyntax?l=!0:i(h)&&t.pathValue?(h.path=s.fromPath(h.path),l=!0):o(h)&&t.jsonGraph?l=!0:a(h)&&t.json?l=!0:"function"==typeof h&&c+1===u&&t.selector&&(l=!0),!l)return new Error("Unrecognized argument "+typeof h+" ["+String(h)+"] to Model#"+r)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(e,t,r){var n=e(130).atom,i=e(106),o=e(122),a=e(37),s=e(85),c=Array.isArray,u=e(88),h=e(87);t.exports=function(e,t,r){var l=0,p=e,f=t;if(f?(p=s(p),l=u(p),p.$type=f):(p=n(r),f=p.$type,p[a]=!0),null==r)l=51;else if(null==l||0>=l)switch(typeof r){case"object":l=c(r)?50+r.length:51;break;case"string":l=50+r.length;break;default:l=51}var d=h(p);return"number"==typeof d&&o>d&&(p.$expires=i()+-1*d),p.$size=l,p}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(e,t,r){t.exports="atom"},{}],119:[function(e,t,r){t.exports="error"},{}],120:[function(e,t,r){t.exports="ref"},{}],121:[function(e,t,r){t.exports=1},{}],122:[function(e,t,r){t.exports=0},{}],123:[function(e,t,r){"use strict";function n(e){var t;(t=a.length?a.pop():new i).task=e,o(t)}function i(){this.task=null}var o=e(124),a=[],s=[],c=o.makeRequestCallFromTimer(function(){if(s.length)throw s.shift()});t.exports=n,i.prototype.call=function(){try{this.task.call()}catch(e){n.onerror?n.onerror(e):(s.push(e),c())}finally{this.task=null,a[a.length]=this}}},{124:124}],124:[function(e,t,r){(function(e){"use strict";function r(e){a.length||(o(),s=!0),a[a.length]=e}function n(){for(;c<a.length;){var e=c;if(c+=1,a[e].call(),c>u){for(var t=0,r=a.length-c;r>t;t++)a[t]=a[t+c];a.length-=c,c=0}}a.length=0,c=0,s=!1}function i(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var o,a=[],s=!1,c=0,u=1024,h=e.MutationObserver||e.WebKitMutationObserver;o="function"==typeof h?function(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}(n):i(n),r.requestFlush=o,r.makeRequestCallFromTimer=i}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(e,t,r){"use strict";function n(e,t){var r;for(r in t)e[r]=t[r];return e}function i(e,t){this._jsongUrl=e,"number"==typeof t&&(t={timeout:t}),this._config=n({timeout:15e3,headers:{}},t||{})}var o=e(129),a=e(126);Array.isArray,i.prototype={constructor:i,buildQueryObject:a,get:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"GET",{paths:e,method:"get"}),this._config);return o("GET",t,this)},set:function(e){var t="POST",r=n(this.buildQueryObject(this._jsongUrl,t,{jsonGraph:e,method:"set"}),this._config);return r.headers["Content-Type"]="application/x-www-form-urlencoded",o(t,r,this)},call:function(e,t,r,i){t=t||[],r=r||[],i=i||[];var a="POST",s=[];s.push("method=call"),s.push("callPath="+encodeURIComponent(JSON.stringify(e))),s.push("arguments="+encodeURIComponent(JSON.stringify(t))),s.push("pathSuffixes="+encodeURIComponent(JSON.stringify(r))),s.push("paths="+encodeURIComponent(JSON.stringify(i)));var c=n(this.buildQueryObject(this._jsongUrl,a,s.join("&")),this._config);return c.headers["Content-Type"]="application/x-www-form-urlencoded",o(a,c,this)}},i.XMLHttpSource=i,i.default=i,t.exports=i},{126:126,129:129}],126:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n=[],i={url:e},o=-1!==e.indexOf("?")?"&":"?";return"string"==typeof r?n.push(r):Object.keys(r).forEach(function(e){var t="object"==typeof r[e]?JSON.stringify(r[e]):r[e];n.push(e+"="+encodeURIComponent(t))}),"GET"===t?i.url+=o+n.join("&"):i.data=n.join("&"),i}},{}],127:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t=new e.XMLHttpRequest;if("withCredentials"in t)return t;if(e.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t,r,n;if(e.XMLHttpRequest)return new e.XMLHttpRequest;try{for(r=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],n=0;3>n;n++)try{if(t=r[n],new e.ActiveXObject(t))break}catch(e){}return new e.ActiveXObject(t)}catch(e){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(e,t,r){"use strict";function n(){}function i(e,t,r){r||(r=new Error(t)),e.onError(r)}function o(e,t,r){var n,o;if(t&&e){o=t.responseType,n="response"in t?t.response:t.responseText;var a=1223===t.status?204:t.status;if(a>=200&&399>=a){try{"json"!==o&&(n=JSON.parse(n||"")),"string"==typeof n&&(n=JSON.parse(n||""))}catch(r){i(e,"invalid json",r)}return e.onNext(n),void e.onCompleted()}return 401===a||403===a||407===a?i(e,n):410===a?i(e,n):408===a||504===a?i(e,n):i(e,n||"Response code "+a)}}function a(e,t,r,n){i(e,r||t.statusText||"request error",n)}var s=e(128),c=e(127),u=Object.prototype.hasOwnProperty,h=function(){};n.create=function(e){var t=new n;return t.subscribe=function(t,r,n){var i,o;return i="function"==typeof t?{onNext:t,onError:r||h,onCompleted:n||h}:t,"function"==typeof(o=e(i))?{dispose:o}:o},t},t.exports=function(e,t,r){return n.create(function(n){var i,h,l,p,f,d={method:e||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(f in t)u.call(t,f)&&(d[f]=t[f]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=r.onBeforeRequest&&r.onBeforeRequest(d);try{i=d.crossDomain?c():s()}catch(e){n.onError(e)}try{d.user?i.open(d.method,d.url,d.async,d.user,d.password):i.open(d.method,d.url,d.async),i.timeout=d.timeout,i.withCredentials=!1!==d.withCredentials,l=d.headers;for(p in l)u.call(l,p)&&i.setRequestHeader(p,l[p]);if(d.responseType)try{i.responseType=d.responseType}catch(e){if("json"!==d.responseType)throw e}i.onreadystatechange=function(e){4===i.readyState&&(h||(h=!0,o(n,i)))},i.ontimeout=function(e){h||(h=!0,a(n,i,"timeout error",e))},i.send(d.data)}catch(e){n.onError(e)}return function(){h||4===i.readyState||(h=!0,i.abort())}})}},{127:127,128:128}],130:[function(e,t,r){function n(e,t,r){var n=Object.create(null);if(null!=r){for(var i in r)n[i]=r[i];return n.$type=e,n.value=t,n}return{$type:e,value:t}}var i=e(134);t.exports={ref:function(e,t){return n("ref",i.fromPath(e),t)},atom:function(e,t){return n("atom",e,t)},undefined:function(){return n("atom")},error:function(e,t){return n("error",e,t)},pathValue:function(e,t){return{path:i.fromPath(e),value:t}},pathInvalidation:function(e){return{path:i.fromPath(e),invalidated:!0}}}},{134:134}],131:[function(e,t,r){t.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(e,t,r){var n={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"};t.exports=n},{}],133:[function(e,t,r){t.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token.  only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character.  Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(e,t,r){if(r)throw e+" -- "+t.parseString+" with next token: "+r;throw e+" -- "+t.parseString}}},{}],134:[function(e,t,r){var n=e(140),i=e(135),o=e(131),a=function(e,t){return i(new n(e,t))};t.exports=a,a.fromPathsOrPathValues=function(e,t){if(!e)return[];for(var r=[],n=0,i=e.length;i>n;n++)"string"==typeof e[n]?r[n]=a(e[n],t):"string"==typeof e[n].path?r[n]={path:a(e[n].path,t),value:e[n].value}:r[n]=e[n];return r},a.fromPath=function(e,t){return e?"string"==typeof e?a(e,t):e:[]},a.RoutedTokens=o},{131:131,135:135,140:140}],135:[function(e,t,r){var n=e(132),i=e(133),o=e(136);t.exports=function(e){for(var t=e.next(),r={},a=[];!t.done;){switch(t.type){case n.token:var s=+t.token[0];isNaN(s)||i.throwError(i.invalidIdentifier,e),a[a.length]=t.token;break;case n.dotSeparator:0===a.length&&i.throwError(i.unexpectedToken,e);break;case n.space:break;case n.openingBracket:o(e,t,r,a);break;default:i.throwError(i.unexpectedToken,e)}t=e.next()}return 0===a.length&&i.throwError(i.invalidPath,e),a}},{132:132,133:133,136:136}],136:[function(e,t,r){var n=e(132),i=e(133),o=i.indexer,a=e(138),s=e(137),c=e(139);t.exports=function(e,t,r,u){var h=e.next(),l=!1,p=1,f=!1;for(r.indexer=[];!h.done;){switch(h.type){case n.token:case n.quote:r.indexer.length===p&&i.throwError(o.requiresComma,e)}switch(h.type){case n.openingBrace:f=!0,c(e,h,r,u);break;case n.token:var d=+h.token;isNaN(d)&&i.throwError(o.needQuotes,e),r.indexer[r.indexer.length]=d;break;case n.dotSeparator:r.indexer.length||i.throwError(o.leadingDot,e),a(e,h,r,u);break;case n.space:break;case n.closingBracket:l=!0;break;case n.quote:s(e,h,r,u);break;case n.openingBracket:i.throwError(o.nested,e);break;case n.commaSeparator:++p;break;default:i.throwError(i.unexpectedToken,e)}if(l)break;h=e.next()}0===r.indexer.length&&i.throwError(o.empty,e),r.indexer.length>1&&f&&i.throwError(o.routedTokens,e),1===r.indexer.length&&(r.indexer=r.indexer[0]),u[u.length]=r.indexer,r.indexer=void 0}},{132:132,133:133,137:137,138:138,139:139}],137:[function(e,t,r){var n=e(132),i=e(133),o=i.quote;t.exports=function(e,t,r,a){for(var s=e.next(),c="",u=t.token,h=!1,l=!1;!s.done;){switch(s.type){case n.token:case n.space:case n.dotSeparator:case n.commaSeparator:case n.openingBracket:case n.closingBracket:case n.openingBrace:case n.closingBrace:h&&i.throwError(o.illegalEscape,e),c+=s.token;break;case n.quote:h?(c+=s.token,h=!1):s.token!==u?c+=s.token:l=!0;break;case n.escape:h=!0;break;default:i.throwError(i.unexpectedToken,e)}if(l)break;s=e.next()}0===c.length&&i.throwError(o.empty,e),r.indexer[r.indexer.length]=c}},{132:132,133:133}],138:[function(e,t,r){var n=e(140),i=e(132),o=e(133);t.exports=function(e,t,r,a){var s,c=e.peek(),u=1,h=!1,l=!0,p=r.indexer.length-1,f=n.toNumber(r.indexer[p]);for(isNaN(f)&&o.throwError(o.range.precedingNaN,e);!h&&!c.done;){switch(c.type){case i.dotSeparator:3===u&&o.throwError(o.unexpectedToken,e),3===++u&&(l=!1);break;case i.token:s=n.toNumber(e.next().token),isNaN(s)&&o.throwError(o.range.suceedingNaN,e),h=!0;break;default:h=!0}if(h)break;e.next(),c=e.peek()}r.indexer[p]={from:f,to:l?s:s-1}}},{132:132,133:133,140:140}],139:[function(e,t,r){var n=e(132),i=e(131),o=e(133),a=o.routed;t.exports=function(e,t,r,s){var c=e.next(),u=!1,h="";switch(c.token){case i.integers:case i.ranges:case i.keys:break;default:o.throwError(a.invalid,e)}var l=e.next();if(l.type===n.colon&&(u=!0,(l=e.next()).type!==n.token&&o.throwError(a.invalid,e),h=l.token,l=e.next()),l.type===n.closingBrace){var p={type:c.token,named:u,name:h};r.indexer[r.indexer.length]=p}else o.throwError(a.invalid,e)}},{131:131,132:132,133:133}],140:[function(e,t,r){function n(e,t,r){return{token:e,done:r,type:t}}function i(e,t,r){var i,b=!1,_="",x=r?y:g;do{if(i=t+1>=e.length)break;var w=e[t+1];if(void 0===w||-1!==x.indexOf(w)){if(_.length)break;++t;var S;switch(w){case a:S=o.dotSeparator;break;case s:S=o.commaSeparator;break;case c:S=o.openingBracket;break;case u:S=o.closingBracket;break;case h:S=o.openingBrace;break;case l:S=o.closingBrace;break;case v:S=o.space;break;case d:case m:S=o.quote;break;case f:S=o.escape;break;case p:S=o.colon;break;default:S=o.unknown}b=n(w,S,!1);break}_+=w,++t}while(!i);return!b&&_.length&&(b=n(_,o.token,!1)),b||(b={done:!0}),{token:b,idx:t}}var o=e(132),a=".",s=",",c="[",u="]",h="{",l="}",p=":",f="\\",d='"',m="'",v=" ",g="\\'\"[]., ",y="\\{}'\"[]., :",b=t.exports=function(e,t){this._string=e,this._idx=-1,this._extended=t,this.parseString=""};b.prototype={next:function(){var e=this._nextToken?this._nextToken:i(this._string,this._idx,this._extended);return this._idx=e.idx,this._nextToken=!1,this.parseString+=e.token.token,e.token},peek:function(){var e=this._nextToken?this._nextToken:i(this._string,this._idx,this._extended);return this._nextToken=e,e.token}},b.toNumber=function(e){return isNaN(+e)?NaN:+e}},{132:132}],141:[function(e,t,r){var n=e(147),i=e(148);t.exports=function(e){var t=e.reduce(function(e,t){var r=t.length;return e[r]||(e[r]=[]),e[r].push(t),e},{});return Object.keys(t).forEach(function(e){t[e]=i(t[e])}),n(t)}},{147:147,148:148}],142:[function(e,t,r){var n=e(144);t.exports=function e(t,r,i){for(var o=t,a=!0;a&&i<r.length;++i){var s=r[i],c=typeof s;if(s&&"object"===c){var u={},h=n(s,u),l=i+1;do{var p=o[h];(a=void 0!==p)&&(a=e(p,r,l)),h=n(s,u)}while(a&&!u.done);break}a=void 0!==(o=o[s])}return a}},{144:144}],143:[function(e,t,r){t.exports={iterateKeySet:e(144),toTree:e(148),toTreeWithUnion:e(149),pathsComplementFromTree:e(146),pathsComplementFromLengthTree:e(145),hasIntersection:e(142),toPaths:e(147),collapse:e(141)}},{141:141,142:142,144:144,145:145,146:146,147:147,148:148,149:149}],144:[function(e,t,r){function n(e,t){var r=t.from=e.from||0,n=t.to=e.to||"number"==typeof e.length&&t.from+e.length-1||0;t.rangeOffset=t.from,t.loaded=!0,r>n&&(t.empty=!0)}function i(e,t){t.done=!1;var r=t.isObject=!(!e||"object"!=typeof e);t.isArray=r&&o(e),t.arrayOffset=0}var o=Array.isArray;t.exports=function(e,t){if(void 0===t.isArray&&i(e,t),t.isArray){var r;do{if(t.loaded&&t.rangeOffset>t.to&&(++t.arrayOffset,t.loaded=!1),t.arrayOffset>=e.length){t.done=!0;break}var o=e[t.arrayOffset];if("object"===typeof o){if(t.loaded||n(o,t),t.empty)continue;r=t.rangeOffset++}else++t.arrayOffset,r=o}while(void 0===r);return r}return t.isObject?(t.loaded||n(e,t),t.rangeOffset>t.to?void(t.done=!0):t.rangeOffset++):(t.done=!0,e)}},{}],145:[function(e,t,r){var n=e(142);t.exports=function(e,t){for(var r=[],i=-1,o=0,a=e.length;a>o;++o){var s=e[o];n(t[s.length],s,0)||(r[++i]=s)}return r}},{142:142}],146:[function(e,t,r){var n=e(142);t.exports=function(e,t){for(var r=[],i=-1,o=0,a=e.length;a>o;++o)n(t,e[o],0)||(r[++i]=e[o]);return r}},{142:142}],147:[function(e,t,r){function n(e){return null!==e&&typeof e===p}function i(e,t,r){var n,o,a,s,l,p,f,d,m,v,g,y,b,_,x=u(String(t)),w=Object.create(null),S=[],M=-1,E=0,C=[],T=0;if(s=[],l=-1,r-1>t){for(p=c(e,s);++l<p;)n=s[l],o=i(e[n],t+1,r),a=o.code,w[a]?o=w[a]:(S[E++]=a,o=w[a]={keys:[],sets:o.sets}),x=u(x+n+a),h(n)&&o.keys.push(parseInt(n,10))||o.keys.push(n);for(;++M<E;)if(n=S[M],o=w[n],s=o.keys,(p=s.length)>0)for(f=o.sets,d=-1,m=f.length,b=s[0];++d<m;){for(g=-1,y=(v=f[d]).length,(_=new Array(y+1))[0]=p>1&&s||b;++g<y;)_[g+1]=v[g];C[T++]=_}}else for(p=c(e,s),C[T++]=p>1?[s]:s;++l<p;)x=u(x+s[l]);return{code:x,sets:C}}function o(e){for(var t=-1,r=e.length;++t<r;){var n=e[t];l(n)&&(e[t]=a(n))}return e}function a(e){for(var t=-1,r=e.length-1,n=r>0;++t<=r;){var i=e[t];if(!h(i)){n=!1;break}e[t]=parseInt(i,10)}if(!0===n){e.sort(s);var o=e[0],a=e[r];if(r>=a-o)return{from:o,to:a}}return e}function s(e,t){return e-t}function c(e,t,r){var n=0;for(var i in e)t[n++]=i;return n>1&&t.sort(r),n}function u(e){for(var t=5381,r=-1,n=e.length;++r<n;)t=(t<<5)+t+e.charCodeAt(r);return String(t)}function h(e){return!l(e)&&e-parseFloat(e)+1>=0}var l=Array.isArray,p="object";t.exports=function(e){var t,r=[],a=0;for(var s in e)if(h(s)&&n(t=e[s]))for(var c=i(t,0,parseInt(s,10)).sets,u=-1,l=c.length;++u<l;)r[a++]=o(c[u]);return r}},{}],148:[function(e,t,r){function n(e,t,r){var o,a=t[r],s={},c=r+1;o=i(a,s);do{var u=e[o];u||(c===t.length?e[o]=null:u=e[o]={}),c<t.length&&n(u,t,c),s.done||(o=i(a,s))}while(!s.done)}var i=e(144);Array.isArray,t.exports=function(e){return e.reduce(function(e,t){return n(e,t,0),e},{})}},{144:144}],149:[function(e,t,r){},{}],150:[function(e,t,r){function n(){h=!1,s.length?u=s.concat(u):l=-1,u.length&&i()}function i(){if(!h){var e=setTimeout(n);h=!0;for(var t=u.length;t;){for(s=u,u=[];++l<t;)s&&s[l].run();l=-1,t=u.length}s=null,h=!1,clearTimeout(e)}}function o(e,t){this.fun=e,this.array=t}function a(){}var s,c=t.exports={},u=[],h=!1,l=-1;c.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];u.push(new o(e,t)),1!==u.length||h||setTimeout(i,0)},o.prototype.run=function(){this.fun.apply(null,this.array)},c.title="browser",c.browser=!0,c.env={},c.argv=[],c.version="",c.versions={},c.on=a,c.addListener=a,c.once=a,c.off=a,c.removeListener=a,c.removeAllListeners=a,c.emit=a,c.binding=function(e){throw new Error("process.binding is not supported")},c.cwd=function(){return"/"},c.chdir=function(e){throw new Error("process.chdir is not supported")},c.umask=function(){return 0}},{}],151:[function(e,t,r){"use strict";t.exports=e(156)},{156:156}],152:[function(e,t,r){"use strict";function n(){}function i(e){try{return e.then}catch(e){return v=e,g}}function o(e,t){try{return e(t)}catch(e){return v=e,g}}function a(e,t,r){try{e(t,r)}catch(e){return v=e,g}}function s(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._37=0,this._12=null,this._59=[],e!==n&&d(e,this)}function c(e,t,r){return new e.constructor(function(i,o){var a=new s(n);a.then(i,o),u(e,new f(t,r,a))})}function u(e,t){for(;3===e._37;)e=e._12;return 0===e._37?void e._59.push(t):void m(function(){var r=1===e._37?t.onFulfilled:t.onRejected;if(null!==r){var n=o(r,e._12);n===g?l(t.promise,v):h(t.promise,n)}else 1===e._37?h(t.promise,e._12):l(t.promise,e._12)})}function h(e,t){if(t===e)return l(e,new TypeError("A promise cannot be resolved with itself."));if(t&&("object"==typeof t||"function"==typeof t)){var r=i(t);if(r===g)return l(e,v);if(r===e.then&&t instanceof s)return e._37=3,e._12=t,void p(e);if("function"==typeof r)return void d(r.bind(t),e)}e._37=1,e._12=t,p(e)}function l(e,t){e._37=2,e._12=t,p(e)}function p(e){for(var t=0;t<e._59.length;t++)u(e,e._59[t]);e._59=null}function f(e,t,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=r}function d(e,t){var r=!1,n=a(e,function(e){r||(r=!0,h(t,e))},function(e){r||(r=!0,l(t,e))});r||n!==g||(r=!0,l(t,v))}var m=e(124),v=null,g={};t.exports=s,s._99=n,s.prototype.then=function(e,t){if(this.constructor!==s)return c(this,e,t);var r=new s(n);return u(this,new f(e,t,r)),r}},{124:124}],153:[function(e,t,r){"use strict";var n=e(152);t.exports=n,n.prototype.done=function(e,t){(arguments.length?this.then.apply(this,arguments):this).then(null,function(e){setTimeout(function(){throw e},0)})}},{152:152}],154:[function(e,t,r){"use strict";function n(e){var t=new i(i._99);return t._37=1,t._12=e,t}var i=e(152);t.exports=i;var o=n(!0),a=n(!1),s=n(null),c=n(void 0),u=n(0),h=n("");i.resolve=function(e){if(e instanceof i)return e;if(null===e)return s;if(void 0===e)return c;if(!0===e)return o;if(!1===e)return a;if(0===e)return u;if(""===e)return h;if("object"==typeof e||"function"==typeof e)try{var t=e.then;if("function"==typeof t)return new i(t.bind(e))}catch(e){return new i(function(t,r){r(e)})}return n(e)},i.all=function(e){var t=Array.prototype.slice.call(e);return new i(function(e,r){function n(a,s){if(s&&("object"==typeof s||"function"==typeof s)){if(s instanceof i&&s.then===i.prototype.then){for(;3===s._37;)s=s._12;return 1===s._37?n(a,s._12):(2===s._37&&r(s._12),void s.then(function(e){n(a,e)},r))}var c=s.then;if("function"==typeof c)return void new i(c.bind(s)).then(function(e){n(a,e)},r)}t[a]=s,0==--o&&e(t)}if(0===t.length)return e([]);for(var o=t.length,a=0;a<t.length;a++)n(a,t[a])})},i.reject=function(e){return new i(function(t,r){r(e)})},i.race=function(e){return new i(function(t,r){e.forEach(function(e){i.resolve(e).then(t,r)})})},i.prototype.catch=function(e){return this.then(null,e)}},{152:152}],155:[function(e,t,r){"use strict";var n=e(152);t.exports=n,n.prototype.finally=function(e){return this.then(function(t){return n.resolve(e()).then(function(){return t})},function(t){return n.resolve(e()).then(function(){throw t})})}},{152:152}],156:[function(e,t,r){"use strict";t.exports=e(152),e(153),e(155),e(154),e(157)},{152:152,153:153,154:154,155:155,157:157}],157:[function(e,t,r){"use strict";var n=e(152),i=e(123);t.exports=n,n.denodeify=function(e,t){return t=t||1/0,function(){var r=this,i=Array.prototype.slice.call(arguments,0,t>0?t:0);return new n(function(t,n){i.push(function(e,r){e?n(e):t(r)});var o=e.apply(r,i);!o||"object"!=typeof o&&"function"!=typeof o||"function"!=typeof o.then||t(o)})}},n.nodeify=function(e){return function(){var t=Array.prototype.slice.call(arguments),r="function"==typeof t[t.length-1]?t.pop():null,o=this;try{return e.apply(this,arguments).nodeify(r,o)}catch(e){if(null===r||void 0===r)return new n(function(t,r){r(e)});i(function(){r.call(o,e)})}}},n.prototype.nodeify=function(e,t){return"function"!=typeof e?this:void this.then(function(r){i(function(){e.call(t,null,r)})},function(r){i(function(){e.call(t,r)})})}},{123:123,152:152}],158:[function(e,t,r){(function(n){(function(i){var o={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},a=o[typeof window]&&window||this,s=o[typeof r]&&r&&!r.nodeType&&r,c=o[typeof t]&&t&&!t.nodeType&&t,u=(c&&c.exports,o[typeof n]&&n);!u||u.global!==u&&u.window!==u||(a=u),"object"==typeof t&&t&&t.exports===s?t.exports=i(a,t.exports,e(159)):a.Rx=i(a,{},a.Rx)}).call(this,function(e,t,r,n){function i(){try{return f.apply(this,arguments)}catch(e){return I.e=e,I}}function o(e){if(!M(e))throw new TypeError("fn must be a function");return f=e,i}function a(e,t,r){return new g(function(n){var i=!1,o=null,a=[];return e.subscribe(function(e){var s,c;try{c=t(e)}catch(e){return void n.onError(e)}if(s=0,i)try{s=r(c,o)}catch(e){return void n.onError(e)}else i=!0,o=c;s>0&&(o=c,a=[]),s>=0&&a.push(e)},function(e){n.onError(e)},function(){n.onNext(a),n.onCompleted()})},e)}function s(e){if(0===e.length)throw new R;return e[0]}function c(e,t,r,n){if(0>t)throw new N;return new g(function(i){var o=t;return e.subscribe(function(e){0==o--&&(i.onNext(e),i.onCompleted())},function(e){i.onError(e)},function(){r?(i.onNext(n),i.onCompleted()):i.onError(new N)})},e)}function u(e,t,r){return new g(function(n){var i=r,o=!1;return e.subscribe(function(e){o?n.onError(new Error("Sequence contains more than one element")):(i=e,o=!0)},function(e){n.onError(e)},function(){o||t?(n.onNext(i),n.onCompleted()):n.onError(new R)})},e)}function h(e,t,r){return new g(function(n){return e.subscribe(function(e){n.onNext(e),n.onCompleted()},function(e){n.onError(e)},function(){t?(n.onNext(r),n.onCompleted()):n.onError(new R)})},e)}function l(e,t,r){return new g(function(n){var i=r,o=!1;return e.subscribe(function(e){i=e,o=!0},function(e){n.onError(e)},function(){o||t?(n.onNext(i),n.onCompleted()):n.onError(new R)})},e)}function p(e,t,r,i){var o=A(t,r,3);return new g(function(t){var r=0;return e.subscribe(function(n){var a;try{a=o(n,r,e)}catch(e){return void t.onError(e)}a?(t.onNext(i?r:n),t.onCompleted()):r++},function(e){t.onError(e)},function(){t.onNext(i?-1:n),t.onCompleted()})},e)}var f,d=r.Observable,m=d.prototype,v=r.CompositeDisposable,g=r.AnonymousObservable,y=r.Disposable.empty,b=(r.internals.isEqual,r.helpers),_=b.not,x=b.defaultComparer,w=b.identity,S=b.defaultSubComparer,M=b.isFunction,E=b.isPromise,C=b.isArrayLike,T=b.isIterable,O=r.internals.inherits,P=d.fromPromise,j=d.from,A=r.internals.bindCallback,R=r.EmptyError,L=r.ObservableBase,N=r.ArgumentOutOfRangeError,I={e:{}};m.aggregate=function(){var e,t,r=!1,n=this;return 2===arguments.length?(r=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new g(function(i){var o,a,s;return n.subscribe(function(n){!s&&(s=!0);try{o?a=e(a,n):(a=r?e(t,n):n,o=!0)}catch(e){return i.onError(e)}},function(e){i.onError(e)},function(){s&&i.onNext(a),!s&&r&&i.onNext(t),!s&&!r&&i.onError(new R),i.onCompleted()})},n)};var D=function(e){function t(t,r,n,i){this.source=t,this.acc=r,this.hasSeed=n,this.seed=i,e.call(this)}function r(e,t){this.o=e,this.acc=t.acc,this.hasSeed=t.hasSeed,this.seed=t.seed,this.hasAccumulation=!1,this.result=null,this.hasValue=!1,this.isStopped=!1}return O(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this))},r.prototype.onNext=function(e){this.isStopped||(!this.hasValue&&(this.hasValue=!0),this.hasAccumulation?this.result=o(this.acc)(this.result,e):(this.result=this.hasSeed?o(this.acc)(this.seed,e):e,this.hasAccumulation=!0),this.result===I&&this.o.onError(this.result.e))},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.hasValue&&this.o.onNext(this.result),!this.hasValue&&this.hasSeed&&this.o.onNext(this.seed),!this.hasValue&&!this.hasSeed&&this.o.onError(new R),this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(L);return m.reduce=function(e){var t=!1;if(2===arguments.length){t=!0;var r=arguments[1]}return new D(this,e,t,r)},m.some=function(e,t){var r=this;return e?r.filter(e,t).some():new g(function(e){return r.subscribe(function(){e.onNext(!0),e.onCompleted()},function(t){e.onError(t)},function(){e.onNext(!1),e.onCompleted()})},r)},m.any=function(){return this.some.apply(this,arguments)},m.isEmpty=function(){return this.any().map(_)},m.every=function(e,t){return this.filter(function(t){return!e(t)},t).some().map(_)},m.all=function(){return this.every.apply(this,arguments)},m.includes=function(e,t){function r(e,t){return 0===e&&0===t||e===t||isNaN(e)&&isNaN(t)}var n=this;return new g(function(i){var o=0,a=+t||0;return Math.abs(a)===1/0&&(a=0),0>a?(i.onNext(!1),i.onCompleted(),y):n.subscribe(function(t){o++>=a&&r(t,e)&&(i.onNext(!0),i.onCompleted())},function(e){i.onError(e)},function(){i.onNext(!1),i.onCompleted()})},this)},m.contains=function(e,t){m.includes(e,t)},m.count=function(e,t){return e?this.filter(e,t).count():this.reduce(function(e){return e+1},0)},m.indexOf=function(e,t){var r=this;return new g(function(n){var i=0,o=+t||0;return Math.abs(o)===1/0&&(o=0),0>o?(n.onNext(-1),n.onCompleted(),y):r.subscribe(function(t){i>=o&&t===e&&(n.onNext(i),n.onCompleted()),i++},function(e){n.onError(e)},function(){n.onNext(-1),n.onCompleted()})},r)},m.sum=function(e,t){return e&&M(e)?this.map(e,t).sum():this.reduce(function(e,t){return e+t},0)},m.minBy=function(e,t){return t||(t=S),a(this,e,function(e,r){return-1*t(e,r)})},m.min=function(e){return this.minBy(w,e).map(function(e){return s(e)})},m.maxBy=function(e,t){return t||(t=S),a(this,e,t)},m.max=function(e){return this.maxBy(w,e).map(function(e){return s(e)})},m.average=function(e,t){return e&&M(e)?this.map(e,t).average():this.reduce(function(e,t){return{sum:e.sum+t,count:e.count+1}},{sum:0,count:0}).map(function(e){if(0===e.count)throw new R;return e.sum/e.count})},m.sequenceEqual=function(e,t){var r=this;return t||(t=x),new g(function(n){var i=!1,o=!1,a=[],s=[],c=r.subscribe(function(e){var r,i;if(s.length>0){i=s.shift();try{r=t(i,e)}catch(e){return void n.onError(e)}r||(n.onNext(!1),n.onCompleted())}else o?(n.onNext(!1),n.onCompleted()):a.push(e)},function(e){n.onError(e)},function(){i=!0,0===a.length&&(s.length>0?(n.onNext(!1),n.onCompleted()):o&&(n.onNext(!0),n.onCompleted()))});(C(e)||T(e))&&(e=j(e)),E(e)&&(e=P(e));var u=e.subscribe(function(e){var r;if(a.length>0){var o=a.shift();try{r=t(o,e)}catch(e){return void n.onError(e)}r||(n.onNext(!1),n.onCompleted())}else i?(n.onNext(!1),n.onCompleted()):s.push(e)},function(e){n.onError(e)},function(){o=!0,0===s.length&&(a.length>0?(n.onNext(!1),n.onCompleted()):i&&(n.onNext(!0),n.onCompleted()))});return new v(c,u)},r)},m.elementAt=function(e){return c(this,e,!1)},m.elementAtOrDefault=function(e,t){return c(this,e,!0,t)},m.single=function(e,t){return e&&M(e)?this.where(e,t).single():u(this,!1)},m.singleOrDefault=function(e,t,r){return e&&M(e)?this.filter(e,r).singleOrDefault(null,t):u(this,!0,t)},m.first=function(e,t){return e?this.where(e,t).first():h(this,!1)},m.firstOrDefault=function(e,t,r){return e?this.where(e).firstOrDefault(null,t):h(this,!0,t)},m.last=function(e,t){return e?this.where(e,t).last():l(this,!1)},m.lastOrDefault=function(e,t,r){return e?this.where(e,r).lastOrDefault(null,t):l(this,!0,t)},m.find=function(e,t){return p(this,e,t,!1)},m.findIndex=function(e,t){return p(this,e,t,!0)},m.toSet=function(){if(void 0===e.Set)throw new TypeError;var t=this;return new g(function(r){var n=new e.Set;return t.subscribe(function(e){n.add(e)},function(e){r.onError(e)},function(){r.onNext(n),r.onCompleted()})},t)},m.toMap=function(t,r){if(void 0===e.Map)throw new TypeError;var n=this;return new g(function(i){var o=new e.Map;return n.subscribe(function(e){var n;try{n=t(e)}catch(e){return void i.onError(e)}var a=e;if(r)try{a=r(e)}catch(e){return void i.onError(e)}o.set(n,a)},function(e){i.onError(e)},function(){i.onNext(o),i.onCompleted()})},n)},r})}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{159:159}],159:[function(e,t,r){(function(e,n){(function(i){function o(e){for(var t=[],r=0,n=e.length;n>r;r++)t.push(e[r]);return t}function a(e,t){if(ce&&t.stack&&"object"==typeof e&&null!==e&&e.stack&&-1===e.stack.indexOf(le)){for(var r=[],n=t;n;n=n.source)n.stack&&r.unshift(n.stack);r.unshift(e.stack);var i=r.join("\n"+le+"\n");e.stack=c(i)}}function c(e){for(var t=e.split("\n"),r=[],n=0,i=t.length;i>n;n++){var o=t[n];u(o)||h(o)||!o||r.push(o)}return r.join("\n")}function u(e){var t=p(e);if(!t)return!1;var r=t[0],n=t[1];return r===ue&&n>=he&&Ar>=n}function h(e){return-1!==e.indexOf("(module.js:")||-1!==e.indexOf("(node.js:")}function l(){if(ce)try{throw new Error}catch(r){var e=r.stack.split("\n"),t=p(e[0].indexOf("@")>0?e[1]:e[2]);if(!t)return;return ue=t[0],t[1]}}function p(e){var t=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(e);if(t)return[t[1],Number(t[2])];var r=/at ([^ ]+):(\d+):(?:\d+)$/.exec(e);if(r)return[r[1],Number(r[2])];var n=/.*@(.+):(\d+)$/.exec(e);return n?[n[1],Number(n[2])]:void 0}function f(e){var t=[];if(!Ve(e))return t;$e.nonEnumArgs&&e.length&&Ge(e)&&(e=We.call(e));var r=$e.enumPrototypes&&"function"==typeof e,n=$e.enumErrorProps&&(e===ke||e instanceof Error);for(var i in e)r&&"prototype"==i||n&&("message"==i||"name"==i)||t.push(i);if($e.nonEnumShadows&&e!==Be){var o=e.constructor,a=-1,s=Me;if(e===(o&&o.prototype))var c=e===Fe?Le:e===ke?Pe:Ne.call(e),u=ze[c];for(;++a<s;)i=Se[a],u&&u[i]||!Ie.call(e,i)||t.push(i)}return t}function d(e,t,r){for(var n=-1,i=r(e),o=i.length;++n<o;){var a=i[n];if(!1===t(e[a],a,e))break}return e}function m(e,t){return d(e,t,f)}function v(e){return"function"!=typeof e.toString&&"string"==typeof(e+"")}function g(e,t,r,n){if(e===t)return 0!==e||1/e==1/t;var i=typeof e,o=typeof t;if(e===e&&(null==e||null==t||"function"!=i&&"object"!=i&&"function"!=o&&"object"!=o))return!1;var a=Ne.call(e),s=Ne.call(t);if(a==Ee&&(a=Ae),s==Ee&&(s=Ae),a!=s)return!1;switch(a){case Te:case Oe:return+e==+t;case je:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case Re:case Le:return e==String(t)}var c=a==Ce;if(!c){if(a!=Ae||!$e.nodeClass&&(v(e)||v(t)))return!1;var u=!$e.argsObject&&Ge(e)?Object:e.constructor,h=!$e.argsObject&&Ge(t)?Object:t.constructor;if(!(u==h||Ie.call(e,"constructor")&&Ie.call(t,"constructor")||se(u)&&u instanceof u&&se(h)&&h instanceof h)&&("constructor"in e&&"constructor"in t))return!1}r||(r=[]),n||(n=[]);for(var l=r.length;l--;)if(r[l]==e)return n[l]==t;var p=0,f=!0;if(r.push(e),n.push(t),c){if(l=e.length,p=t.length,f=p==l)for(;p--;){var d=t[p];if(!(f=g(e[p],d,r,n)))break}}else m(t,function(t,i,o){return Ie.call(o,i)?(p++,f=Ie.call(e,i)&&g(e[i],t,r,n)):void 0}),f&&m(e,function(e,t,r){return Ie.call(r,t)?f=--p>-1:void 0});return r.pop(),n.pop(),f}function y(e,t){for(var r=new Array(e),n=0;e>n;n++)r[n]=t();return r}function b(){try{return He.apply(this,arguments)}catch(e){return Ze.e=e,Ze}}function _(e){if(!se(e))throw new TypeError("fn must be a function");return He=e,b}function x(e){throw e}function w(e,t){this.id=e,this.value=t}function S(e,t){this.scheduler=e,this.disposable=t,this.isDisposed=!1}function M(e,t){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())}function E(e){this._s=s}function C(e){this._s=s,this._l=s.length,this._i=0}function T(e){this._a=e}function O(e){this._a=e,this._l=R(e),this._i=0}function P(e){return"number"==typeof e&&X.isFinite(e)}function j(e){var t=e[ye];if(!t&&"string"==typeof e)return new E(e)[ye]();if(!t&&e.length!==i)return new T(e)[ye]();if(!t)throw new TypeError("Object is not iterable");return e[ye]()}function A(e){var t=+e;return 0===t?t:isNaN(t)?t:0>t?-1:1}function R(e){var t=+e.length;return isNaN(t)?0:0!==t&&P(t)?0>=(t=A(t)*Math.floor(Math.abs(t)))?0:t>Yt?Yt:t:t}function L(e,t){this.observer=e,this.parent=t}function N(e,t){return ft(e)||(e=gt),new Zt(t,e)}function I(e,t){this.observer=e,this.parent=t}function D(e,t){this.observer=e,this.parent=t}function k(e,t){return new Cr(function(r){var n=new st,i=new ct;return i.setDisposable(n),n.setDisposable(e.subscribe(function(e){r.onNext(e)},function(e){try{var n=t(e)}catch(e){return r.onError(e)}ae(n)&&(n=Vt(n));var o=new st;i.setDisposable(o),o.setDisposable(n.subscribe(r))},function(e){r.onCompleted(e)})),i},e)}function B(){return!1}function F(e,t){var r=this;return new Cr(function(n){var i=0,o=e.length;return r.subscribe(function(r){if(o>i){var a=e[i++],s=_(t)(r,a);if(s===Ze)return n.onError(s.e);n.onNext(s)}else n.onCompleted()},function(e){n.onError(e)},function(){n.onCompleted()})},r)}function B(){return!1}function U(){return[]}function B(){return!1}function z(){return[]}function $(e,t){this.observer=e,this.accumulator=t.accumulator,this.hasSeed=t.hasSeed,this.seed=t.seed,this.hasAccumulation=!1,this.accumulation=null,this.hasValue=!1,this.isStopped=!1}function V(e,t,r){var n=we(t,r,3);return e.map(function(t,r){var i=n(t,r,e);return ae(i)&&(i=Vt(i)),(xe(i)||_e(i))&&(i=Kt(i)),i}).concatAll()}function G(e,t,r){for(var n=0,i=e.length;i>n;n++)if(r(e[n],t))return n;return-1}function H(e){this.comparer=e,this.set=[]}function q(e,t,r){var n=we(t,r,3);return e.map(function(t,r){var i=n(t,r,e);return ae(i)&&(i=Vt(i)),(xe(i)||_e(i))&&(i=Kt(i)),i}).mergeAll()}var W={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},X=W[typeof window]&&window||this,Y=W[typeof r]&&r&&!r.nodeType&&r,K=W[typeof t]&&t&&!t.nodeType&&t,Z=K&&K.exports===Y&&Y,J=W[typeof n]&&n;!J||J.global!==J&&J.window!==J||(X=J);var Q={internals:{},config:{Promise:X.Promise},helpers:{}},ee=Q.helpers.noop=function(){},te=(Q.helpers.notDefined=function(e){return void 0===e},Q.helpers.identity=function(e){return e}),re=(Q.helpers.pluck=function(e){return function(t){return t[e]}},Q.helpers.just=function(e){return function(){return e}},Q.helpers.defaultNow=Date.now),ne=Q.helpers.defaultComparer=function(e,t){return qe(e,t)},ie=Q.helpers.defaultSubComparer=function(e,t){return e>t?1:t>e?-1:0},oe=(Q.helpers.defaultKeySerializer=function(e){return e.toString()},Q.helpers.defaultError=function(e){throw e}),ae=Q.helpers.isPromise=function(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then},se=(Q.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},Q.helpers.not=function(e){return!e},Q.helpers.isFunction=function(){var e=function(e){return"function"==typeof e||!1};return e(/x/)&&(e=function(e){return"function"==typeof e&&"[object Function]"==Ne.call(e)}),e}());Q.config.longStackSupport=!1;var ce=!1;try{throw new Error}catch(e){ce=!!e.stack}var ue,he=l(),le="From previous event:";(Q.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)}).prototype=Error.prototype;var pe=Q.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};pe.prototype=Error.prototype;var fe=Q.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};fe.prototype=Error.prototype;var de=Q.NotSupportedError=function(e){this.message=e||"This operation is not supported",Error.call(this)};de.prototype=Error.prototype;var me=Q.NotImplementedError=function(e){this.message=e||"This operation is not implemented",Error.call(this)};me.prototype=Error.prototype;var ve=Q.helpers.notImplemented=function(){throw new me},ge=Q.helpers.notSupported=function(){throw new de},ye="function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";X.Set&&"function"==typeof(new X.Set)["@@iterator"]&&(ye="@@iterator");var be=Q.doneEnumerator={done:!0,value:i},_e=Q.helpers.isIterable=function(e){return e[ye]!==i},xe=Q.helpers.isArrayLike=function(e){return e&&e.length!==i};Q.helpers.iterator=ye;var we=Q.internals.bindCallback=function(e,t,r){if(void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}},Se=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Me=Se.length,Ee="[object Arguments]",Ce="[object Array]",Te="[object Boolean]",Oe="[object Date]",Pe="[object Error]",je="[object Number]",Ae="[object Object]",Re="[object RegExp]",Le="[object String]",Ne=Object.prototype.toString,Ie=Object.prototype.hasOwnProperty,De=Ne.call(arguments)==Ee,ke=Error.prototype,Be=Object.prototype,Fe=String.prototype,Ue=Be.propertyIsEnumerable;try{!(Ne.call(document)==Ae&&!({toString:0}+""))}catch(e){!0}var ze={};ze[Ce]=ze[Oe]=ze[je]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},ze[Te]=ze[Le]={constructor:!0,toString:!0,valueOf:!0},ze[Pe]=ze["[object Function]"]=ze[Re]={constructor:!0,toString:!0},ze[Ae]={constructor:!0};var $e={};!function(){var e=function(){this.x=1},t=[];e.prototype={valueOf:1,y:1};for(var r in new e)t.push(r);for(r in arguments);$e.enumErrorProps=Ue.call(ke,"message")||Ue.call(ke,"name"),$e.enumPrototypes=Ue.call(e,"prototype"),$e.nonEnumArgs=0!=r,$e.nonEnumShadows=!/valueOf/.test(t)}(1);var Ve=Q.internals.isObject=function(e){var t=typeof e;return e&&("function"==t||"object"==t)||!1},Ge=function(e){return!(!e||"object"!=typeof e)&&Ne.call(e)==Ee};De||(Ge=function(e){return!(!e||"object"!=typeof e)&&Ie.call(e,"callee")});var He,qe=Q.internals.isEqual=function(e,t){return g(e,t,[],[])},We=Array.prototype.slice,Xe=this.inherits=Q.internals.inherits=function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r},Ye=Q.internals.addProperties=function(e){for(var t=[],r=1,n=arguments.length;n>r;r++)t.push(arguments[r]);for(var i=0,o=t.length;o>i;i++){var a=t[i];for(var s in a)e[s]=a[s]}},Ke=Q.internals.addRef=function(e,t){return new Cr(function(r){return new et(t.getDisposable(),e.subscribe(r))})},Ze={e:{}};w.prototype.compareTo=function(e){var t=this.value.compareTo(e.value);return 0===t&&(t=this.id-e.id),t};var Je=Q.internals.PriorityQueue=function(e){this.items=new Array(e),this.length=0},Qe=Je.prototype;Qe.isHigherPriority=function(e,t){return this.items[e].compareTo(this.items[t])<0},Qe.percolate=function(e){if(!(e>=this.length||0>e)){var t=e-1>>1;if(!(0>t||t===e)&&this.isHigherPriority(e,t)){var r=this.items[e];this.items[e]=this.items[t],this.items[t]=r,this.percolate(t)}}},Qe.heapify=function(e){if(+e||(e=0),!(e>=this.length||0>e)){var t=2*e+1,r=2*e+2,n=e;if(t<this.length&&this.isHigherPriority(t,n)&&(n=t),r<this.length&&this.isHigherPriority(r,n)&&(n=r),n!==e){var i=this.items[e];this.items[e]=this.items[n],this.items[n]=i,this.heapify(n)}}},Qe.peek=function(){return this.items[0].value},Qe.removeAt=function(e){this.items[e]=this.items[--this.length],this.items[this.length]=i,this.heapify()},Qe.dequeue=function(){var e=this.peek();return this.removeAt(0),e},Qe.enqueue=function(e){var t=this.length++;this.items[t]=new w(Je.count++,e),this.percolate(t)},Qe.remove=function(e){for(var t=0;t<this.length;t++)if(this.items[t].value===e)return this.removeAt(t),!0;return!1},Je.count=0;var et=Q.CompositeDisposable=function(){var e,t,r=[];if(Array.isArray(arguments[0]))r=arguments[0],t=r.length;else for(t=arguments.length,r=new Array(t),e=0;t>e;e++)r[e]=arguments[e];for(e=0;t>e;e++)if(!ot(r[e]))throw new TypeError("Not a disposable");this.disposables=r,this.isDisposed=!1,this.length=r.length},tt=et.prototype;tt.add=function(e){this.isDisposed?e.dispose():(this.disposables.push(e),this.length++)},tt.remove=function(e){var t=!1;if(!this.isDisposed){var r=this.disposables.indexOf(e);-1!==r&&(t=!0,this.disposables.splice(r,1),this.length--,e.dispose())}return t},tt.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var e=this.disposables.length,t=new Array(e),r=0;e>r;r++)t[r]=this.disposables[r];for(this.disposables=[],this.length=0,r=0;e>r;r++)t[r].dispose()}};var rt=Q.Disposable=function(e){this.isDisposed=!1,this.action=e||ee};rt.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var nt=rt.create=function(e){return new rt(e)},it=rt.empty={dispose:ee},ot=rt.isDisposable=function(e){return e&&se(e.dispose)},at=rt.checkDisposed=function(e){if(e.isDisposed)throw new pe},st=Q.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};st.prototype.getDisposable=function(){return this.current},st.prototype.setDisposable=function(e){if(this.current)throw new Error("Disposable has already been assigned");var t=this.isDisposed;!t&&(this.current=e),t&&e&&e.dispose()},st.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var e=this.current;this.current=null}e&&e.dispose()};var ct=Q.SerialDisposable=function(){this.isDisposed=!1,this.current=null};ct.prototype.getDisposable=function(){return this.current},ct.prototype.setDisposable=function(e){var t=this.isDisposed;if(!t){var r=this.current;this.current=e}r&&r.dispose(),t&&e&&e.dispose()},ct.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var e=this.current;this.current=null}e&&e.dispose()};var ut=Q.RefCountDisposable=function(){function e(e){this.disposable=e,this.disposable.count++,this.isInnerDisposed=!1}function t(e){this.underlyingDisposable=e,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return e.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,0===--this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},t.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},t.prototype.getDisposable=function(){return this.isDisposed?it:new e(this)},t}();S.prototype.dispose=function(){this.scheduler.scheduleWithState(this,M)};var ht=Q.internals.ScheduledItem=function(e,t,r,n,i){this.scheduler=e,this.state=t,this.action=r,this.dueTime=n,this.comparer=i||ie,this.disposable=new st};ht.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},ht.prototype.compareTo=function(e){return this.comparer(this.dueTime,e.dueTime)},ht.prototype.isCancelled=function(){return this.disposable.isDisposed},ht.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var lt=Q.Scheduler=function(){function e(e,t,r,n){this.now=e,this._schedule=t,this._scheduleRelative=r,this._scheduleAbsolute=n}function t(e,t){return t(),it}e.isScheduler=function(t){return t instanceof e};var r=e.prototype;return r.schedule=function(e){return this._schedule(e,t)},r.scheduleWithState=function(e,t){return this._schedule(e,t)},r.scheduleWithRelative=function(e,r){return this._scheduleRelative(r,e,t)},r.scheduleWithRelativeAndState=function(e,t,r){return this._scheduleRelative(e,t,r)},r.scheduleWithAbsolute=function(e,r){return this._scheduleAbsolute(r,e,t)},r.scheduleWithAbsoluteAndState=function(e,t,r){return this._scheduleAbsolute(e,t,r)},e.now=re,e.normalize=function(e){return 0>e&&(e=0),e},e}(),pt=lt.normalize,ft=lt.isScheduler;!function(e){function t(e,t){function r(t){i(t,function(t){var n=!1,i=!1,a=e.scheduleWithState(t,function(e,t){return n?o.remove(a):i=!0,r(t),it});i||(o.add(a),n=!0)})}var n=t[0],i=t[1],o=new et;return r(n),o}function r(e,t,r){function n(t){o(t,function(t,i){var o=!1,s=!1,c=e[r](t,i,function(e,t){return o?a.remove(c):s=!0,n(t),it});s||(a.add(c),o=!0)})}var i=t[0],o=t[1],a=new et;return n(i),a}function n(e,t){e(function(r){t(e,r)})}e.scheduleRecursive=function(e){return this.scheduleRecursiveWithState(e,n)},e.scheduleRecursiveWithState=function(e,r){return this.scheduleWithState([e,r],t)},e.scheduleRecursiveWithRelative=function(e,t){return this.scheduleRecursiveWithRelativeAndState(t,e,n)},e.scheduleRecursiveWithRelativeAndState=function(e,t,n){return this._scheduleRelative([e,n],t,function(e,t){return r(e,t,"scheduleWithRelativeAndState")})},e.scheduleRecursiveWithAbsolute=function(e,t){return this.scheduleRecursiveWithAbsoluteAndState(t,e,n)},e.scheduleRecursiveWithAbsoluteAndState=function(e,t,n){return this._scheduleAbsolute([e,n],t,function(e,t){return r(e,t,"scheduleWithAbsoluteAndState")})}}(lt.prototype),lt.prototype,lt.prototype.schedulePeriodic=function(e,t){return this.schedulePeriodicWithState(null,e,t)},lt.prototype.schedulePeriodicWithState=function(e,t,r){if(void 0===X.setInterval)throw new de;t=pt(t);var n=e,i=X.setInterval(function(){n=r(n)},t);return nt(function(){X.clearInterval(i)})},function(e){e.catchError=e.catch=function(e){return new xt(this,e)}}(lt.prototype);var dt,mt,vt=(Q.internals.SchedulePeriodicRecursive=function(){function e(e,t){t(0,this._period);try{this._state=this._action(this._state)}catch(e){throw this._cancel.dispose(),e}}function t(e,t,r,n){this._scheduler=e,this._state=t,this._period=r,this._action=n}return t.prototype.start=function(){var t=new st;return this._cancel=t,t.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,e.bind(this))),t},t}(),lt.immediate=function(){return new lt(re,function(e,t){return t(this,e)},ge,ge)}()),gt=lt.currentThread=function(){function e(){for(;t.length>0;){var e=t.dequeue();!e.isCancelled()&&e.invoke()}}var t,r=new lt(re,function(r,n){var i=new ht(this,r,n,this.now());if(t)t.enqueue(i);else{(t=new Je(4)).enqueue(i);var o=_(e)();if(t=null,o===Ze)return x(o.e)}return i.disposable},ge,ge);return r.scheduleRequired=function(){return!t},r}(),yt=function(){var e,t=ee;if(X.setTimeout)e=X.setTimeout,t=X.clearTimeout;else{if(!X.WScript)throw new de;e=function(e,t){X.WScript.Sleep(t),e()}}return{setTimeout:e,clearTimeout:t}}(),bt=yt.setTimeout,_t=yt.clearTimeout;!function(){function t(e){if(o)bt(function(){t(e)},0);else{var r=i[e];if(r){o=!0;var n=_(r)();if(mt(e),o=!1,n===Ze)return x(n.e)}}}function r(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))}var n=1,i={},o=!1;mt=function(e){delete i[e]};var a=RegExp("^"+String(Ne).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),s="function"==typeof(s=J&&Z&&J.setImmediate)&&!a.test(s)&&s;if(se(s))dt=function(e){var r=n++;return i[r]=e,s(function(){t(r)}),r};else if(void 0!==e&&"[object process]"==={}.toString.call(e))dt=function(r){var o=n++;return i[o]=r,e.nextTick(function(){t(o)}),o};else if(function(){if(!X.postMessage||X.importScripts)return!1;var e=!1,t=X.onmessage;return X.onmessage=function(){e=!0},X.postMessage("","*"),X.onmessage=t,e}()){var c="ms.rx.schedule"+Math.random();X.addEventListener?X.addEventListener("message",r,!1):X.attachEvent?X.attachEvent("onmessage",r):X.onmessage=r,dt=function(e){var t=n++;return i[t]=e,X.postMessage(c+currentId,"*"),t}}else if(X.MessageChannel){var u=new X.MessageChannel;u.port1.onmessage=function(e){t(e.data)},dt=function(e){var t=n++;return i[t]=e,u.port2.postMessage(t),t}}else dt="document"in X&&"onreadystatechange"in X.document.createElement("script")?function(e){var r=X.document.createElement("script"),o=n++;return i[o]=e,r.onreadystatechange=function(){t(o),r.onreadystatechange=null,r.parentNode.removeChild(r),r=null},X.document.documentElement.appendChild(r),o}:function(e){var r=n++;return i[r]=e,bt(function(){t(r)},0),r}}();var xt=(lt.timeout=lt.default=function(){return new lt(re,function(e,t){var r=this,n=new st,i=dt(function(){!n.isDisposed&&n.setDisposable(t(r,e))});return new et(n,nt(function(){mt(i)}))},function(e,t,r){var n=this,i=lt.normalize(t),o=new st;if(0===i)return n.scheduleWithState(e,r);var a=bt(function(){!o.isDisposed&&o.setDisposable(r(n,e))},i);return new et(o,nt(function(){_t(a)}))},function(e,t,r){return this.scheduleWithRelativeAndState(e,t-this.now(),r)})}(),function(e){function t(e,t){return this._scheduler.scheduleWithState(e,this._wrap(t))}function r(e,t,r){return this._scheduler.scheduleWithRelativeAndState(e,t,this._wrap(r))}function n(e,t,r){return this._scheduler.scheduleWithAbsoluteAndState(e,t,this._wrap(r))}function i(i,o){this._scheduler=i,this._handler=o,this._recursiveOriginal=null,this._recursiveWrapper=null,e.call(this,this._scheduler.now.bind(this._scheduler),t,r,n)}return Xe(i,e),i.prototype._clone=function(e){return new i(e,this._handler)},i.prototype._wrap=function(e){var t=this;return function(r,n){try{return e(t._getRecursiveWrapper(r),n)}catch(e){if(!t._handler(e))throw e;return it}}},i.prototype._getRecursiveWrapper=function(e){if(this._recursiveOriginal!==e){this._recursiveOriginal=e;var t=this._clone(e);t._recursiveOriginal=e,t._recursiveWrapper=t,this._recursiveWrapper=t}return this._recursiveWrapper},i.prototype.schedulePeriodicWithState=function(e,t,r){var n=this,i=!1,o=new st;return o.setDisposable(this._scheduler.schedulePeriodicWithState(e,t,function(e){if(i)return null;try{return r(e)}catch(e){if(i=!0,!n._handler(e))throw e;return o.dispose(),null}})),o},i}(lt)),wt=Q.Notification=function(){function e(e,t,r,n,i,o){this.kind=e,this.value=t,this.exception=r,this._accept=n,this._acceptObservable=i,this.toString=o}return e.prototype.accept=function(e,t,r){return e&&"object"==typeof e?this._acceptObservable(e):this._accept(e,t,r)},e.prototype.toObservable=function(e){var t=this;return ft(e)||(e=vt),new Cr(function(r){return e.scheduleWithState(t,function(e,t){t._acceptObservable(r),"N"===t.kind&&r.onCompleted()})})},e}(),St=wt.createOnNext=function(){function e(e){return e(this.value)}function t(e){return e.onNext(this.value)}function r(){return"OnNext("+this.value+")"}return function(n){return new wt("N",n,null,e,t,r)}}(),Mt=wt.createOnError=function(){function e(e,t){return t(this.exception)}function t(e){return e.onError(this.exception)}function r(){return"OnError("+this.exception+")"}return function(n){return new wt("E",null,n,e,t,r)}}(),Et=wt.createOnCompleted=function(){function e(e,t,r){return r()}function t(e){return e.onCompleted()}function r(){return"OnCompleted()"}return function(){return new wt("C",null,null,e,t,r)}}(),Ct=Q.Observer=function(){};Ct.prototype.toNotifier=function(){var e=this;return function(t){return t.accept(e)}},Ct.prototype.asObserver=function(){return new jt(this.onNext.bind(this),this.onError.bind(this),this.onCompleted.bind(this))},Ct.prototype.checked=function(){return new At(this)};var Tt=Ct.create=function(e,t,r){return e||(e=ee),t||(t=oe),r||(r=ee),new jt(e,t,r)};Ct.fromNotifier=function(e,t){return new jt(function(r){return e.call(t,St(r))},function(r){return e.call(t,Mt(r))},function(){return e.call(t,Et())})},Ct.prototype.notifyOn=function(e){return new Rt(e,this)},Ct.prototype.makeSafe=function(e){return new AnonymousSafeObserver(this._onNext,this._onError,this._onCompleted,e)};var Ot,Pt=Q.internals.AbstractObserver=function(e){function t(){this.isStopped=!1,e.call(this)}return Xe(t,e),t.prototype.next=ve,t.prototype.error=ve,t.prototype.completed=ve,t.prototype.onNext=function(e){this.isStopped||this.next(e)},t.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.error(e))},t.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.completed())},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.error(e),!0)},t}(Ct),jt=Q.AnonymousObserver=function(e){function t(t,r,n){e.call(this),this._onNext=t,this._onError=r,this._onCompleted=n}return Xe(t,e),t.prototype.next=function(e){this._onNext(e)},t.prototype.error=function(e){this._onError(e)},t.prototype.completed=function(){this._onCompleted()},t}(Pt),At=function(e){function t(t){e.call(this),this._observer=t,this._state=0}Xe(t,e);var r=t.prototype;return r.onNext=function(e){this.checkAccess();var t=_(this._observer.onNext).call(this._observer,e);this._state=0,t===Ze&&x(t.e)},r.onError=function(e){this.checkAccess();var t=_(this._observer.onError).call(this._observer,e);this._state=2,t===Ze&&x(t.e)},r.onCompleted=function(){this.checkAccess();var e=_(this._observer.onCompleted).call(this._observer);this._state=2,e===Ze&&x(e.e)},r.checkAccess=function(){if(1===this._state)throw new Error("Re-entrancy detected");if(2===this._state)throw new Error("Observer completed");0===this._state&&(this._state=1)},t}(Ct),Rt=function(e){function t(t,r,n){e.call(this,t,r),this._cancel=n}return Xe(t,e),t.prototype.next=function(t){e.prototype.next.call(this,t),this.ensureActive()},t.prototype.error=function(t){e.prototype.error.call(this,t),this.ensureActive()},t.prototype.completed=function(){e.prototype.completed.call(this),this.ensureActive()},t.prototype.dispose=function(){e.prototype.dispose.call(this),this._cancel&&this._cancel.dispose(),this._cancel=null},t}(Q.internals.ScheduledObserver=function(e){function t(t,r){e.call(this),this.scheduler=t,this.observer=r,this.isAcquired=!1,this.hasFaulted=!1,this.queue=[],this.disposable=new ct}return Xe(t,e),t.prototype.next=function(e){var t=this;this.queue.push(function(){t.observer.onNext(e)})},t.prototype.error=function(e){var t=this;this.queue.push(function(){t.observer.onError(e)})},t.prototype.completed=function(){var e=this;this.queue.push(function(){e.observer.onCompleted()})},t.prototype.ensureActive=function(){var e=!1,t=this;!this.hasFaulted&&this.queue.length>0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(t.queue.length>0){r=t.queue.shift();try{r()}catch(e){throw t.queue=[],t.hasFaulted=!0,e}e()}else t.isAcquired=!1}))},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},t}(Pt)),Lt=Q.Observable=function(){function e(e){if(Q.config.longStackSupport&&ce){try{throw new Error}catch(e){this.stack=e.stack.substring(e.stack.indexOf("\n")+1)}var t=this;this._subscribe=function(r){var n=r.onError.bind(r);return r.onError=function(e){a(e,t),n(e)},e.call(t,r)}}else this._subscribe=e}return Ot=e.prototype,Ot.subscribe=Ot.forEach=function(e,t,r){return this._subscribe("object"==typeof e?e:Tt(e,t,r))},Ot.subscribeOnNext=function(e,t){return this._subscribe(Tt(void 0!==t?function(r){e.call(t,r)}:e))},Ot.subscribeOnError=function(e,t){return this._subscribe(Tt(null,void 0!==t?function(r){e.call(t,r)}:e))},Ot.subscribeOnCompleted=function(e,t){return this._subscribe(Tt(null,null,void 0!==t?function(){e.call(t)}:e))},e}(),Nt=Q.ObservableBase=function(e){function t(e){return e&&se(e.dispose)?e:se(e)?nt(e):it}function r(e,r){var n=r[0],i=r[1],o=_(i.subscribeCore).call(i,n);return o!==Ze||n.fail(Ze.e)?void n.setDisposable(t(o)):x(Ze.e)}function n(e){var t=new Tr(e),n=[t,this];return gt.scheduleRequired()?gt.scheduleWithState(n,r):r(null,n),t}function i(){e.call(this,n)}return Xe(i,e),i.prototype.subscribeCore=ve,i}(Lt),It=Q.internals.Enumerable=function(){},Dt=function(e){function t(t){this.sources=t,e.call(this)}function r(e,t,r){this.o=e,this.s=t,this.e=r,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){var t,n=new ct,i=vt.scheduleRecursiveWithState(this.sources[ye](),function(i,o){if(!t){var a=_(i.next).call(i);if(a===Ze)return e.onError(a.e);if(a.done)return e.onCompleted();var s=a.value;ae(s)&&(s=Vt(s));var c=new st;n.setDisposable(c),c.setDisposable(s.subscribe(new r(e,o,i)))}});return new et(n,i,nt(function(){t=!0}))},r.prototype.onNext=function(e){this.isStopped||this.o.onNext(e)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.s(this.e))},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);It.prototype.concat=function(){return new Dt(this)};var kt=function(e){function t(t){this.sources=t,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){var t,r=this.sources[ye](),n=new ct,i=vt.scheduleRecursiveWithState(null,function(i,o){if(!t){var a=_(r.next).call(r);if(a===Ze)return e.onError(a.e);if(a.done)return null!==i?e.onError(i):e.onCompleted();var s=a.value;ae(s)&&(s=Vt(s));var c=new st;n.setDisposable(c),c.setDisposable(s.subscribe(function(t){e.onNext(t)},o,function(){e.onCompleted()}))}});return new et(n,i,nt(function(){t=!0}))},t}(Nt);It.prototype.catchError=function(){return new kt(this)},It.prototype.catchErrorWhen=function(e){var t=this;return new Cr(function(r){var n,i=new Pr,o=new Pr,a=e(i).subscribe(o),s=t[ye](),c=new ct,u=vt.scheduleRecursive(function(e){if(!n){var t=_(s.next).call(s);if(t===Ze)return r.onError(t.e);if(t.done)return void r.onCompleted();var a=t.value;ae(a)&&(a=Vt(a));var u=new st,h=new st;c.setDisposable(new et(h,u)),u.setDisposable(a.subscribe(function(e){r.onNext(e)},function(t){h.setDisposable(o.subscribe(e,function(e){r.onError(e)},function(){r.onCompleted()})),i.onNext(t)},function(){r.onCompleted()}))}});return new et(a,c,u,nt(function(){n=!0}))})};var Bt=function(e){function t(e,t){this.v=e,this.c=null==t?-1:t}function r(e){this.v=e.v,this.l=e.c}return Xe(t,It),t.prototype[ye]=function(){return new r(this)},r.prototype.next=function(){return 0===this.l?be:(this.l>0&&this.l--,{done:!1,value:this.v})},t}(),Ft=It.repeat=function(e,t){return new Bt(e,t)},Ut=function(e){function t(e,t,r){this.s=e,this.fn=t?we(t,r,3):null}function r(e){this.i=-1,this.s=e.s,this.l=this.s.length,this.fn=e.fn}return Xe(t,It),t.prototype[ye]=function(){return new r(this)},r.prototype.next=function(){return++this.i<this.l?{done:!1,value:this.fn?this.fn(this.s[this.i],this.i,this.s):this.s[this.i]}:be},t}(),zt=It.of=function(e,t,r){return new Ut(e,t,r)};Ot.observeOn=function(e){var t=this;return new Cr(function(r){return t.subscribe(new Rt(e,r))},t)},Ot.subscribeOn=function(e){var t=this;return new Cr(function(r){var n=new st,i=new ct;return i.setDisposable(n),n.setDisposable(e.schedule(function(){i.setDisposable(new S(e,t.subscribe(r)))})),i},t)};var $t=function(e){function t(t){this.p=t,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.p.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),it},t}(Nt),Vt=Lt.fromPromise=function(e){return new $t(e)};Ot.toPromise=function(e){if(e||(e=Q.config.Promise),!e)throw new de("Promise type not provided nor in Rx.config.Promise");var t=this;return new e(function(e,r){var n,i=!1;t.subscribe(function(e){n=e,i=!0},r,function(){i&&e(n)})})};var Gt=function(e){function t(t){this.source=t,e.call(this)}function r(e){this.o=e,this.a=[],this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e))},r.prototype.onNext=function(e){this.isStopped||this.a.push(e)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onNext(this.a),this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.toArray=function(){return new Gt(this)},Lt.create=Lt.createWithDisposable=function(e,t){return new Cr(e,t)};var Ht=(Lt.defer=function(e){return new Cr(function(t){var r;try{r=e()}catch(e){return sr(e).subscribe(t)}return ae(r)&&(r=Vt(r)),r.subscribe(t)})},function(e){function t(t){this.scheduler=t,e.call(this)}function r(e,t){this.observer=e,this.parent=t}function n(e,t){t.onCompleted()}return Xe(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.parent.scheduler.scheduleWithState(this.observer,n)},t}(Nt)),qt=Lt.empty=function(e){return ft(e)||(e=vt),new Ht(e)},Wt=function(e){function t(t,r,n){this.iterable=t,this.mapper=r,this.scheduler=n,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new Xt(e,this).run()},t}(Nt),Xt=function(){function e(e,t){this.observer=e,this.parent=t}return e.prototype.run=function(){var e=j(Object(this.parent.iterable)),t=this.observer,r=this.parent.mapper;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){try{var o=e.next()}catch(e){return t.onError(e)}if(o.done)return t.onCompleted();var a=o.value;if(r)try{a=r(a,n)}catch(e){return t.onError(e)}t.onNext(a),i(n+1)})},e}(),Yt=Math.pow(2,53)-1;E.prototype[ye]=function(){return new C(this._s)},C.prototype[ye]=function(){return this},C.prototype.next=function(){return this._i<this._l?{done:!1,value:this._s.charAt(this._i++)}:be},T.prototype[ye]=function(){return new O(this._a)},O.prototype[ye]=function(){return this},O.prototype.next=function(){return this._i<this._l?{done:!1,value:this._a[this._i++]}:be};var Kt=Lt.from=function(e,t,r,n){if(null==e)throw new Error("iterable cannot be null.");if(t&&!se(t))throw new Error("mapFn when provided must be a function");if(t)var i=we(t,r,2);return ft(n)||(n=gt),new Wt(e,i,n)},Zt=function(e){function t(t,r){this.args=t,this.scheduler=r,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new L(e,this).run()},t}(Nt);L.prototype.run=function(){var e=this.observer,t=this.parent.args,r=t.length;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){r>n?(e.onNext(t[n]),i(n+1)):e.onCompleted()})};var Jt=Lt.fromArray=function(e,t){return ft(t)||(t=gt),new Zt(e,t)};Lt.generate=function(e,t,r,n,i){return ft(i)||(i=gt),new Cr(function(o){var a=!0;return i.scheduleRecursiveWithState(e,function(e,i){var s,c;try{a?a=!1:e=r(e),(s=t(e))&&(c=n(e))}catch(e){return o.onError(e)}s?(o.onNext(c),i(e)):o.onCompleted()})})};var Qt=function(e){function t(){e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return it},t}(Nt),er=Lt.never=function(){return new Qt};Lt.of=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];return new Zt(t,gt)},Lt.ofWithScheduler=function(e){for(var t=arguments.length,r=new Array(t-1),n=1;t>n;n++)r[n-1]=arguments[n];return new Zt(r,e)};var tr=function(e){function t(t,r){this.obj=t,this.keys=Object.keys(t),this.scheduler=r,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new I(e,this).run()},t}(Nt);I.prototype.run=function(){var e=this.observer,t=this.parent.obj,r=this.parent.keys,n=r.length;return this.parent.scheduler.scheduleRecursiveWithState(0,function(i,o){if(n>i){var a=r[i];e.onNext([a,t[a]]),o(i+1)}else e.onCompleted()})},Lt.pairs=function(e,t){return t||(t=gt),new tr(e,t)};var rr=function(e){function t(t,r,n){this.start=t,this.rangeCount=r,this.scheduler=n,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new nr(e,this).run()},t}(Nt),nr=function(){function e(e,t){this.observer=e,this.parent=t}return e.prototype.run=function(){var e=this.parent.start,t=this.parent.rangeCount,r=this.observer;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){t>n?(r.onNext(e+n),i(n+1)):r.onCompleted()})},e}();Lt.range=function(e,t,r){return ft(r)||(r=gt),new rr(e,t,r)};var ir=function(e){function t(t,r,n){this.value=t,this.repeatCount=null==r?-1:r,this.scheduler=n,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new D(e,this).run()},t}(Nt);D.prototype.run=function(){var e=this.observer,t=this.parent.value;return this.parent.scheduler.scheduleRecursiveWithState(this.parent.repeatCount,function(r,n){return(-1===r||r>0)&&(e.onNext(t),r>0&&r--),0===r?e.onCompleted():void n(r)})},Lt.repeat=function(e,t,r){return ft(r)||(r=gt),new ir(e,t,r)};var or=function(e){function t(t,r){this.value=t,this.scheduler=r,e.call(this)}function r(e,t){this.observer=e,this.parent=t}function n(e,t){var r=t[0],n=t[1];n.onNext(r),n.onCompleted()}return Xe(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.parent.scheduler.scheduleWithState([this.parent.value,this.observer],n)},t}(Nt),ar=(Lt.return=Lt.just=Lt.returnValue=function(e,t){return ft(t)||(t=vt),new or(e,t)},function(e){function t(t,r){this.error=t,this.scheduler=r,e.call(this)}function r(e,t){this.o=e,this.p=t}function n(e,t){var r=t[0];t[1].onError(r)}return Xe(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.p.scheduler.scheduleWithState([this.p.error,this.o],n)},t}(Nt)),sr=Lt.throw=Lt.throwError=Lt.throwException=function(e,t){return ft(t)||(t=vt),new ar(e,t)};Lt.using=function(e,t){return new Cr(function(r){var n,i,o=it;try{(n=e())&&(o=n),i=t(n)}catch(e){return new et(sr(e).subscribe(r),o)}return new et(i.subscribe(r),o)})},Ot.amb=function(e){var t=this;return new Cr(function(r){function n(){o||(o=a,u.dispose())}function i(){o||(o=s,c.dispose())}var o,a="L",s="R",c=new st,u=new st;return ae(e)&&(e=Vt(e)),c.setDisposable(t.subscribe(function(e){n(),o===a&&r.onNext(e)},function(e){n(),o===a&&r.onError(e)},function(){n(),o===a&&r.onCompleted()})),u.setDisposable(e.subscribe(function(e){i(),o===s&&r.onNext(e)},function(e){i(),o===s&&r.onError(e)},function(){i(),o===s&&r.onCompleted()})),new et(c,u)})},Lt.amb=function(){var e=er(),t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var r=0,n=arguments.length;n>r;r++)t.push(arguments[r]);for(var r=0,n=t.length;n>r;r++)e=function(e,t){return e.amb(t)}(e,t[r]);return e},Ot.catch=Ot.catchError=Ot.catchException=function(e){return"function"==typeof e?k(this,e):cr([this,e])};var cr=Lt.catchError=Lt.catch=Lt.catchException=function(){var e=[];if(Array.isArray(arguments[0]))e=arguments[0];else for(var t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return zt(e).catchError()};Ot.combineLatest=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),ur.apply(this,t)};var ur=Lt.combineLatest=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.pop();return Array.isArray(t[0])&&(t=t[0]),new Cr(function(e){function r(t){if(s[t]=!0,c||(c=s.every(te))){try{var r=n.apply(null,h)}catch(t){return e.onError(t)}e.onNext(r)}else u.filter(function(e,r){return r!==t}).every(te)&&e.onCompleted()}function i(t){u[t]=!0,u.every(te)&&e.onCompleted()}for(var o=t.length,a=function(){return!1},s=y(o,a),c=!1,u=y(o,a),h=new Array(o),l=new Array(o),p=0;o>p;p++)!function(n){var o=t[n],a=new st;ae(o)&&(o=Vt(o)),a.setDisposable(o.subscribe(function(e){h[n]=e,r(n)},function(t){e.onError(t)},function(){i(n)})),l[n]=a}(p);return new et(l)},this)};Ot.concat=function(){for(var e=[],t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return e.unshift(this),lr.apply(null,e)};var hr=function(e){function t(t){this.sources=t,e.call(this)}function r(e,t){this.sources=e,this.o=t}return Xe(t,e),t.prototype.subscribeCore=function(e){return new r(this.sources,e).run()},r.prototype.run=function(){var e,t=new ct,r=this.sources,n=r.length,i=this.o,o=vt.scheduleRecursiveWithState(0,function(o,a){if(!e){if(o===n)return i.onCompleted();var s=r[o];ae(s)&&(s=Vt(s));var c=new st;t.setDisposable(c),c.setDisposable(s.subscribe(function(e){i.onNext(e)},function(e){i.onError(e)},function(){a(o+1)}))}});return new et(t,o,nt(function(){e=!0}))},t}(Nt),lr=Lt.concat=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{e=new Array(arguments.length);for(var t=0,r=arguments.length;r>t;t++)e[t]=arguments[t]}return new hr(e)};Ot.concatAll=Ot.concatObservable=function(){return this.merge(1)};var pr=function(e){function t(t,r){this.source=t,this.maxConcurrent=r,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){var t=new et;return t.add(this.source.subscribe(new fr(e,this.maxConcurrent,t))),t},t}(Nt),fr=function(){function e(e,t,r){this.o=e,this.max=t,this.g=r,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function t(e,t){this.parent=e,this.sad=t,this.isStopped=!1}return e.prototype.handleSubscribe=function(e){var r=new st;this.g.add(r),ae(e)&&(e=Vt(e)),r.setDisposable(e.subscribe(new t(this,r)))},e.prototype.onNext=function(e){this.isStopped||(this.activeCount<this.max?(this.activeCount++,this.handleSubscribe(e)):this.q.push(e))},e.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},e.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,0===this.activeCount&&this.o.onCompleted())},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t.prototype.onNext=function(e){this.isStopped||this.parent.o.onNext(e)},t.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.o.onError(e))},t.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var e=this.parent;e.g.remove(this.sad),e.q.length>0?e.handleSubscribe(e.q.shift()):(e.activeCount--,e.done&&0===e.activeCount&&e.o.onCompleted())}},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},e}();Ot.merge=function(e){return"number"!=typeof e?dr(this,e):new pr(this,e)};var dr=Lt.merge=function(){var e,t,r=[],n=arguments.length;if(arguments[0])if(ft(arguments[0]))for(e=arguments[0],t=1;n>t;t++)r.push(arguments[t]);else for(e=vt,t=0;n>t;t++)r.push(arguments[t]);else for(e=vt,t=1;n>t;t++)r.push(arguments[t]);return Array.isArray(r[0])&&(r=r[0]),N(e,r).mergeAll()},mr=Q.CompositeError=function(e){this.name="NotImplementedError",this.innerErrors=e,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};mr.prototype=Error.prototype,Lt.mergeDelayError=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{var t=arguments.length;e=new Array(t);for(var r=0;t>r;r++)e[r]=arguments[r]}var n=N(null,e);return new Cr(function(e){function t(){0===a.length?e.onCompleted():1===a.length?e.onError(a[0]):e.onError(new mr(a))}var r=new et,i=new st,o=!1,a=[];return r.add(i),i.setDisposable(n.subscribe(function(n){var i=new st;r.add(i),ae(n)&&(n=Vt(n)),i.setDisposable(n.subscribe(function(t){e.onNext(t)},function(e){a.push(e),r.remove(i),o&&1===r.length&&t()},function(){r.remove(i),o&&1===r.length&&t()}))},function(e){a.push(e),o=!0,1===r.length&&t()},function(){o=!0,1===r.length&&t()})),r})};var vr=function(e){function t(t){this.source=t,e.call(this)}function r(e,t){this.o=e,this.g=t,this.isStopped=!1,this.done=!1}function n(e,t,r){this.parent=e,this.g=t,this.sad=r,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){var t=new et,n=new st;return t.add(n),n.setDisposable(this.source.subscribe(new r(e,t))),t},r.prototype.onNext=function(e){if(!this.isStopped){var t=new st;this.g.add(t),ae(e)&&(e=Vt(e)),t.setDisposable(e.subscribe(new n(this,this.g,t)))}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},n.prototype.onNext=function(e){this.isStopped||this.parent.o.onNext(e)},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.o.onError(e))},n.prototype.onCompleted=function(){if(!this.isStopped){var e=this.parent;this.isStopped=!0,e.g.remove(this.sad),e.done&&1===e.g.length&&e.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},t}(Nt);Ot.mergeAll=Ot.mergeObservable=function(){return new vr(this)},Ot.onErrorResumeNext=function(e){if(!e)throw new Error("Second observable is required");return gr([this,e])};var gr=Lt.onErrorResumeNext=function(){var e=[];if(Array.isArray(arguments[0]))e=arguments[0];else for(var t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return new Cr(function(t){var r=0,n=new ct,i=vt.scheduleRecursive(function(i){var o,a;r<e.length?(o=e[r++],ae(o)&&(o=Vt(o)),a=new st,n.setDisposable(a),a.setDisposable(o.subscribe(t.onNext.bind(t),i,i))):t.onCompleted()});return new et(n,i)})};Ot.skipUntil=function(e){var t=this;return new Cr(function(r){var n=!1,i=new et(t.subscribe(function(e){n&&r.onNext(e)},function(e){r.onError(e)},function(){n&&r.onCompleted()}));ae(e)&&(e=Vt(e));var o=new st;return i.add(o),o.setDisposable(e.subscribe(function(){n=!0,o.dispose()},function(e){r.onError(e)},function(){o.dispose()})),i},t)};var yr=function(e){function t(t){this.source=t,e.call(this)}function r(e,t){this.o=e,this.inner=t,this.stopped=!1,this.latest=0,this.hasLatest=!1,this.isStopped=!1}function n(e,t){this.parent=e,this.id=t,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){var t=new ct,n=this.source.subscribe(new r(e,t));return new et(n,t)},r.prototype.onNext=function(e){if(!this.isStopped){var t=new st,r=++this.latest;this.hasLatest=!0,this.inner.setDisposable(t),ae(e)&&(e=Vt(e)),t.setDisposable(e.subscribe(new n(this,r)))}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.stopped=!0,!this.hasLatest&&this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},n.prototype.onNext=function(e){this.isStopped||this.parent.latest===this.id&&this.parent.o.onNext(e)},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&this.parent.o.onError(e))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted()))},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},t}(Nt);Ot.switch=Ot.switchLatest=function(){return new yr(this)};var br=function(e){function t(t,r){this.source=t,this.other=ae(r)?Vt(r):r,e.call(this)}function r(e){this.o=e,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return new et(this.source.subscribe(e),this.other.subscribe(new r(e)))},r.prototype.onNext=function(e){this.isStopped||this.o.onCompleted()},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){!this.isStopped&&(this.isStopped=!0)},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.takeUntil=function(e){return new br(this,e)},Ot.withLatestFrom=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.pop(),i=this;return Array.isArray(t[0])&&(t=t[0]),new Cr(function(e){for(var r=t.length,o=y(r,B),a=!1,s=new Array(r),c=new Array(r+1),u=0;r>u;u++)!function(r){var n=t[r],i=new st;ae(n)&&(n=Vt(n)),i.setDisposable(n.subscribe(function(e){s[r]=e,o[r]=!0,a=o.every(te)},function(t){e.onError(t)},ee)),c[r]=i}(u);var h=new st;return h.setDisposable(i.subscribe(function(t){var r=[t].concat(s);if(a){var i=_(n).apply(null,r);return i===Ze?e.onError(i.e):void e.onNext(i)}},function(t){e.onError(t)},function(){e.onCompleted()})),c[r]=h,new et(c)},this)},Ot.zip=function(){if(Array.isArray(arguments[0]))return F.apply(this,arguments);for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=this,i=t.pop();return t.unshift(n),new Cr(function(e){for(var r=t.length,o=y(r,U),a=y(r,B),s=new Array(r),c=0;r>c;c++)!function(r){var c=t[r],u=new st;ae(c)&&(c=Vt(c)),u.setDisposable(c.subscribe(function(t){if(o[r].push(t),o.every(function(e){return e.length>0})){var s=o.map(function(e){return e.shift()}),c=_(i).apply(n,s);if(c===Ze)return e.onError(c.e);e.onNext(c)}else a.filter(function(e,t){return t!==r}).every(te)&&e.onCompleted()},function(t){e.onError(t)},function(){a[r]=!0,a.every(te)&&e.onCompleted()})),s[r]=u}(c);return new et(s)},n)},Lt.zip=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.shift();return n.zip.apply(n,t)},Lt.zipArray=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{var t=arguments.length;e=new Array(t);for(var r=0;t>r;r++)e[r]=arguments[r]}return new Cr(function(t){for(var r=e.length,n=y(r,z),i=y(r,B),o=new Array(r),a=0;r>a;a++)!function(r){o[r]=new st,o[r].setDisposable(e[r].subscribe(function(e){if(n[r].push(e),n.every(function(e){return e.length>0})){var o=n.map(function(e){return e.shift()});t.onNext(o)}else if(i.filter(function(e,t){return t!==r}).every(te))return t.onCompleted()},function(e){t.onError(e)},function(){i[r]=!0,i.every(te)&&t.onCompleted()}))}(a);return new et(o)})},Ot.asObservable=function(){var e=this;return new Cr(function(t){return e.subscribe(t)},e)},Ot.bufferWithCount=function(e,t){return"number"!=typeof t&&(t=e),this.windowWithCount(e,t).selectMany(function(e){return e.toArray()}).where(function(e){return e.length>0})},Ot.dematerialize=function(){var e=this;return new Cr(function(t){return e.subscribe(function(e){return e.accept(t)},function(e){t.onError(e)},function(){t.onCompleted()})},this)},Ot.distinctUntilChanged=function(e,t){var r=this;return t||(t=ne),new Cr(function(n){var i,o=!1;return r.subscribe(function(r){var a=r;if(e&&(a=_(e)(r))===Ze)return n.onError(a.e);if(o){var s=_(t)(i,a);if(s===Ze)return n.onError(s.e)}o&&s||(o=!0,i=a,n.onNext(r))},function(e){n.onError(e)},function(){n.onCompleted()})},this)};var _r=function(e){function t(t,r,n,i){this.source=t,this.t=!r||se(r)?Tt(r||ee,n||ee,i||ee):r,e.call(this)}function r(e,t){this.o=e,this.t=t,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.t))},r.prototype.onNext=function(e){if(!this.isStopped){var t=_(this.t.onNext).call(this.t,e);t===Ze&&this.o.onError(t.e),this.o.onNext(e)}},r.prototype.onError=function(e){if(!this.isStopped){this.isStopped=!0;var t=_(this.t.onError).call(this.t,e);if(t===Ze)return this.o.onError(t.e);this.o.onError(e)}},r.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var e=_(this.t.onCompleted).call(this.t);if(e===Ze)return this.o.onError(e.e);this.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.do=Ot.tap=Ot.doAction=function(e,t,r){return new _r(this,e,t,r)},Ot.doOnNext=Ot.tapOnNext=function(e,t){return this.tap(void 0!==t?function(r){e.call(t,r)}:e)},Ot.doOnError=Ot.tapOnError=function(e,t){return this.tap(ee,void 0!==t?function(r){e.call(t,r)}:e)},Ot.doOnCompleted=Ot.tapOnCompleted=function(e,t){return this.tap(ee,null,void 0!==t?function(){e.call(t)}:e)},Ot.finally=Ot.ensure=function(e){var t=this;return new Cr(function(r){var n;try{n=t.subscribe(r)}catch(t){throw e(),t}return nt(function(){try{n.dispose()}catch(e){throw e}finally{e()}})},this)},Ot.finallyAction=function(e){return this.ensure(e)};var xr=function(e){function t(t){this.source=t,e.call(this)}function r(e){this.o=e,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e))},r.prototype.onNext=ee,r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.observer.onError(e),!0)},t}(Nt);Ot.ignoreElements=function(){return new xr(this)},Ot.materialize=function(){var e=this;return new Cr(function(t){return e.subscribe(function(e){t.onNext(St(e))},function(e){t.onNext(Mt(e)),t.onCompleted()},function(){t.onNext(Et()),t.onCompleted()})},e)},Ot.repeat=function(e){return Ft(this,e).concat()},Ot.retry=function(e){return Ft(this,e).catchError()},Ot.retryWhen=function(e){return Ft(this).catchErrorWhen(e)};var wr=function(e){function t(t,r,n,i){this.source=t,this.accumulator=r,this.hasSeed=n,this.seed=i,e.call(this)}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new $(e,this))},t}(Nt);$.prototype.onNext=function(e){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,e):(this.accumulation=this.hasSeed?this.accumulator(this.seed,e):e,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},$.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.observer.onError(e))},$.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},$.prototype.dispose=function(){this.isStopped=!0},$.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.observer.onError(e),!0)},Ot.scan=function(){var e,t,r=!1;return 2===arguments.length?(r=!0,e=arguments[0],t=arguments[1]):t=arguments[0],new wr(this,t,r,e)},Ot.skipLast=function(e){if(0>e)throw new fe;var t=this;return new Cr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&r.onNext(n.shift())},function(e){r.onError(e)},function(){r.onCompleted()})},t)},Ot.startWith=function(){var e,t=0;arguments.length&&ft(arguments[0])?(e=arguments[0],t=1):e=vt;for(var r=[],n=t,i=arguments.length;i>n;n++)r.push(arguments[n]);return zt([Jt(r,e),this]).concat()},Ot.takeLast=function(e){if(0>e)throw new fe;var t=this;return new Cr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&n.shift()},function(e){r.onError(e)},function(){for(;n.length>0;)r.onNext(n.shift());r.onCompleted()})},t)},Ot.takeLastBuffer=function(e){var t=this;return new Cr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&n.shift()},function(e){r.onError(e)},function(){r.onNext(n),r.onCompleted()})},t)},Ot.windowWithCount=function(e,t){var r=this;if(+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new fe;if(null==t&&(t=e),+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new fe;return new Cr(function(n){function i(){var e=new Pr;c.push(e),n.onNext(Ke(e,a))}var o=new st,a=new ut(o),s=0,c=[];return i(),o.setDisposable(r.subscribe(function(r){for(var n=0,o=c.length;o>n;n++)c[n].onNext(r);var a=s-e+1;a>=0&&a%t==0&&c.shift().onCompleted(),++s%t==0&&i()},function(e){for(;c.length>0;)c.shift().onError(e);n.onError(e)},function(){for(;c.length>0;)c.shift().onCompleted();n.onCompleted()})),a},r)},Ot.selectConcat=Ot.concatMap=function(e,t,r){return se(e)&&se(t)?this.concatMap(function(r,n){var i=e(r,n);return ae(i)&&(i=Vt(i)),(xe(i)||_e(i))&&(i=Kt(i)),i.map(function(e,i){return t(r,e,n,i)})}):se(e)?V(this,e,r):V(this,function(){return e})},Ot.concatMapObserver=Ot.selectConcatObserver=function(e,t,r,n){var i=this,o=we(e,n,2),a=we(t,n,1),s=we(r,n,0);return new Cr(function(e){var t=0;return i.subscribe(function(r){var n;try{n=o(r,t++)}catch(t){return void e.onError(t)}ae(n)&&(n=Vt(n)),e.onNext(n)},function(t){var r;try{r=a(t)}catch(t){return void e.onError(t)}ae(r)&&(r=Vt(r)),e.onNext(r),e.onCompleted()},function(){var t;try{t=s()}catch(t){return void e.onError(t)}ae(t)&&(t=Vt(t)),e.onNext(t),e.onCompleted()})},this).concatAll()},Ot.defaultIfEmpty=function(e){var t=this;return e===i&&(e=null),new Cr(function(r){var n=!1;return t.subscribe(function(e){n=!0,r.onNext(e)},function(e){r.onError(e)},function(){!n&&r.onNext(e),r.onCompleted()})},t)},H.prototype.push=function(e){var t=-1===G(this.set,e,this.comparer);return t&&this.set.push(e),t},Ot.distinct=function(e,t){var r=this;return t||(t=ne),new Cr(function(n){var i=new H(t);return r.subscribe(function(t){var r=t;if(e)try{r=e(t)}catch(e){return void n.onError(e)}i.push(r)&&n.onNext(t)},function(e){n.onError(e)},function(){n.onCompleted()})},this)};var Sr=function(e){function t(t,r,n){this.source=t,this.selector=we(r,n,3),e.call(this)}function r(e,t){return function(r,n,i){return e.call(this,t.selector(r,n,i),n,i)}}function n(e,t,r){this.o=e,this.selector=t,this.source=r,this.i=0,this.isStopped=!1}return Xe(t,e),t.prototype.internalMap=function(e,n){return new t(this.source,r(e,this),n)},t.prototype.subscribeCore=function(e){return this.source.subscribe(new n(e,this.selector,this))},n.prototype.onNext=function(e){if(!this.isStopped){var t=_(this.selector)(e,this.i++,this.source);return t===Ze?this.o.onError(t.e):void this.o.onNext(t)}},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.map=Ot.select=function(e,t){var r="function"==typeof e?e:function(){return e};return this instanceof Sr?this.internalMap(r,t):new Sr(this,r,t)},Ot.pluck=function(){var e=arguments,t=arguments.length;if(0===t)throw new Error("List of properties cannot be empty.");return this.map(function(r){for(var n=r,o=0;t>o;o++){var a=n[e[o]];if(void 0===a)return i;n=a}return n})},Ot.flatMapObserver=Ot.selectManyObserver=function(e,t,r,n){var i=this;return new Cr(function(o){var a=0;return i.subscribe(function(t){var r;try{r=e.call(n,t,a++)}catch(e){return void o.onError(e)}ae(r)&&(r=Vt(r)),o.onNext(r)},function(e){var r;try{r=t.call(n,e)}catch(e){return void o.onError(e)}ae(r)&&(r=Vt(r)),o.onNext(r),o.onCompleted()},function(){var e;try{e=r.call(n)}catch(e){return void o.onError(e)}ae(e)&&(e=Vt(e)),o.onNext(e),o.onCompleted()})},i).mergeAll()},Ot.selectMany=Ot.flatMap=function(e,t,r){return se(e)&&se(t)?this.flatMap(function(r,n){var i=e(r,n);return ae(i)&&(i=Vt(i)),(xe(i)||_e(i))&&(i=Kt(i)),i.map(function(e,i){return t(r,e,n,i)})},r):se(e)?q(this,e,r):q(this,function(){return e})},Ot.selectSwitch=Ot.flatMapLatest=Ot.switchMap=function(e,t){return this.select(e,t).switchLatest()};var Mr=function(e){function t(t,r){this.source=t,this.skipCount=r,e.call(this)}function r(e,t){this.c=t,this.r=t,this.o=e,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.skipCount))},r.prototype.onNext=function(e){this.isStopped||(this.r<=0?this.o.onNext(e):this.r--)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.skip=function(e){if(0>e)throw new fe;return new Mr(this,e)},Ot.skipWhile=function(e,t){var r=this,n=we(e,t,3);return new Cr(function(e){var t=0,i=!1;return r.subscribe(function(o){if(!i)try{i=!n(o,t++,r)}catch(t){return void e.onError(t)}i&&e.onNext(o)},function(t){e.onError(t)},function(){e.onCompleted()})},r)},Ot.take=function(e,t){if(0>e)throw new fe;if(0===e)return qt(t);var r=this;return new Cr(function(t){var n=e;return r.subscribe(function(e){n-- >0&&(t.onNext(e),0>=n&&t.onCompleted())},function(e){t.onError(e)},function(){t.onCompleted()})},r)},Ot.takeWhile=function(e,t){var r=this,n=we(e,t,3);return new Cr(function(e){var t=0,i=!0;return r.subscribe(function(o){if(i){try{i=n(o,t++,r)}catch(t){return void e.onError(t)}i?e.onNext(o):e.onCompleted()}},function(t){e.onError(t)},function(){e.onCompleted()})},r)};var Er=function(e){function t(t,r,n){this.source=t,this.predicate=we(r,n,3),e.call(this)}function r(e,t){return function(r,n,i){return t.predicate(r,n,i)&&e.call(this,r,n,i)}}function n(e,t,r){this.o=e,this.predicate=t,this.source=r,this.i=0,this.isStopped=!1}return Xe(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new n(e,this.predicate,this))},t.prototype.internalFilter=function(e,n){return new t(this.source,r(e,this),n)},n.prototype.onNext=function(e){if(!this.isStopped){var t=_(this.predicate)(e,this.i++,this.source);return t===Ze?this.o.onError(t.e):void(t&&this.o.onNext(e))}},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(Nt);Ot.filter=Ot.where=function(e,t){return this instanceof Er?this.internalFilter(e,t):new Er(this,e,t)},Ot.transduce=function(e){function t(e){return{"@@transducer/init":function(){return e},"@@transducer/step":function(e,t){return e.onNext(t)},"@@transducer/result":function(e){return e.onCompleted()}}}var r=this;return new Cr(function(n){var i=e(t(n));return r.subscribe(function(e){try{i["@@transducer/step"](n,e)}catch(e){n.onError(e)}},function(e){n.onError(e)},function(){i["@@transducer/result"](n)})},r)};var Cr=Q.AnonymousObservable=function(e){function t(e){return e&&se(e.dispose)?e:se(e)?nt(e):it}function r(e,r){var n=r[0],i=_(r[1])(n);return i!==Ze||n.fail(Ze.e)?void n.setDisposable(t(i)):x(Ze.e)}function n(t,n){this.source=n,e.call(this,function(e){var n=new Tr(e),i=[n,t];return gt.scheduleRequired()?gt.scheduleWithState(i,r):r(null,i),n})}return Xe(n,e),n}(Lt),Tr=function(e){function t(t){e.call(this),this.observer=t,this.m=new st}Xe(t,e);var r=t.prototype;return r.next=function(e){var t=_(this.observer.onNext).call(this.observer,e);t===Ze&&(this.dispose(),x(t.e))},r.error=function(e){var t=_(this.observer.onError).call(this.observer,e);this.dispose(),t===Ze&&x(t.e)},r.completed=function(){var e=_(this.observer.onCompleted).call(this.observer);this.dispose(),e===Ze&&x(e.e)},r.setDisposable=function(e){this.m.setDisposable(e)},r.getDisposable=function(){return this.m.getDisposable()},r.dispose=function(){e.prototype.dispose.call(this),this.m.dispose()},t}(Pt),Or=function(e,t){this.subject=e,this.observer=t};Or.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var e=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(e,1),this.observer=null}};var Pr=Q.Subject=function(e){function t(e){return at(this),this.isStopped?this.hasError?(e.onError(this.error),it):(e.onCompleted(),it):(this.observers.push(e),new Or(this,e))}function r(){e.call(this,t),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return Xe(r,e),Ye(r.prototype,Ct.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(at(this),!this.isStopped){this.isStopped=!0;for(var e=0,t=o(this.observers),r=t.length;r>e;e++)t[e].onCompleted();this.observers.length=0}},onError:function(e){if(at(this),!this.isStopped){this.isStopped=!0,this.error=e,this.hasError=!0;for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onError(e);this.observers.length=0}},onNext:function(e){if(at(this),!this.isStopped)for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onNext(e)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(e,t){return new jr(e,t)},r}(Lt),jr=(Q.AsyncSubject=function(e){function t(e){return at(this),this.isStopped?(this.hasError?e.onError(this.error):this.hasValue?(e.onNext(this.value),e.onCompleted()):e.onCompleted(),it):(this.observers.push(e),new Or(this,e))}function r(){e.call(this,t),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return Xe(r,e),Ye(r.prototype,Ct,{hasObservers:function(){return at(this),this.observers.length>0},onCompleted:function(){var e;if(at(this),!this.isStopped){this.isStopped=!0;var t=o(this.observers),r=t.length;if(this.hasValue)for(e=0;r>e;e++){var n=t[e];n.onNext(this.value),n.onCompleted()}else for(e=0;r>e;e++)t[e].onCompleted();this.observers.length=0}},onError:function(e){if(at(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=e;for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onError(e);this.observers.length=0}},onNext:function(e){at(this),this.isStopped||(this.value=e,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(Lt),Q.AnonymousSubject=function(e){function t(e){return this.observable.subscribe(e)}function r(r,n){this.observer=r,this.observable=n,e.call(this,t)}return Xe(r,e),Ye(r.prototype,Ct.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(e){this.observer.onError(e)},onNext:function(e){this.observer.onNext(e)}}),r}(Lt));Y&&K?Z?(K.exports=Q).Rx=Q:Y.Rx=Q:X.Rx=Q;var Ar=l()}).call(this)}).call(this,e(150),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],16:[function(e,t,r){(function(r){var n,i=void 0!==r?r:"undefined"!=typeof window?window:{},o=e("min-document");"undefined"!=typeof document?n=document:(n=i["__GLOBAL_DOCUMENT_CACHE@4"])||(n=i["__GLOBAL_DOCUMENT_CACHE@4"]=o),t.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"min-document":4}],17:[function(e,t,r){r.read=function(e,t,r,n,i){var o,a,s=8*i-n-1,c=(1<<s)-1,u=c>>1,h=-7,l=r?i-1:0,p=r?-1:1,f=e[t+l];for(l+=p,o=f&(1<<-h)-1,f>>=-h,h+=s;h>0;o=256*o+e[t+l],l+=p,h-=8);for(a=o&(1<<-h)-1,o>>=-h,h+=n;h>0;a=256*a+e[t+l],l+=p,h-=8);if(0===o)o=1-u;else{if(o===c)return a?NaN:1/0*(f?-1:1);a+=Math.pow(2,n),o-=u}return(f?-1:1)*a*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var a,s,c,u=8*o-i-1,h=(1<<u)-1,l=h>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:o-1,d=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=h):(a=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-a))<1&&(a--,c*=2),(t+=a+l>=1?p/c:p*Math.pow(2,1-l))*c>=2&&(a++,c/=2),a+l>=h?(s=0,a=h):a+l>=1?(s=(t*c-1)*Math.pow(2,i),a+=l):(s=t*Math.pow(2,l-1)*Math.pow(2,i),a=0));i>=8;e[r+f]=255&s,f+=d,s/=256,i-=8);for(a=a<<i|s,u+=i;u>0;e[r+f]=255&a,f+=d,a/=256,u-=8);e[r+f-d]|=128*m}},{}],18:[function(e,t,r){(function(e){"use strict";var r="undefined"!=typeof window?window:void 0!==e?e:{};t.exports=function(e,t){return e in r?r[e]:(r[e]=t,t)}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],19:[function(e,t,r){"use strict";var n=e("./index.js");t.exports=function(e,t,r){var i="__INDIVIDUAL_ONE_VERSION_"+e,o=n(i+"_ENFORCE_SINGLETON",t);if(o!==t)throw new Error("Can only have one copy of "+e+".\nYou already have version "+o+" installed.\nThis means you cannot install version "+t);return n(i,r)}},{"./index.js":18}],20:[function(e,t,r){"use strict";t.exports=function(e){return"object"==typeof e&&null!==e}},{}],21:[function(e,t,r){"use strict";var n={};n.base32="0123456789bcdefghjkmnpqrstuvwxyz",n.encode=function(e,t,r){if(void 0===r){for(var i=1;i<=12;i++){var o=n.encode(e,t,i),a=n.decode(o);if(a.lat==e&&a.lon==t)return o}r=12}if(e=Number(e),t=Number(t),r=Number(r),isNaN(e)||isNaN(t)||isNaN(r))throw new Error("Invalid geohash");for(var s=0,c=0,u=!0,h="",l=-90,p=90,f=-180,d=180;h.length<r;){if(u){var m=(f+d)/2;t>=m?(s=2*s+1,f=m):(s*=2,d=m)}else{var v=(l+p)/2;e>=v?(s=2*s+1,l=v):(s*=2,p=v)}u=!u,5==++c&&(h+=n.base32.charAt(s),c=0,s=0)}return h},n.decode=function(e){var t=n.bounds(e),r=t.sw.lat,i=t.sw.lon,o=t.ne.lat,a=t.ne.lon,s=(r+o)/2,c=(i+a)/2;return s=s.toFixed(Math.floor(2-Math.log(o-r)/Math.LN10)),c=c.toFixed(Math.floor(2-Math.log(a-i)/Math.LN10)),{lat:Number(s),lon:Number(c)}},n.bounds=function(e){if(0===e.length)throw new Error("Invalid geohash");e=e.toLowerCase();for(var t=!0,r=-90,i=90,o=-180,a=180,s=0;s<e.length;s++){var c=e.charAt(s),u=n.base32.indexOf(c);if(-1==u)throw new Error("Invalid geohash");for(var h=4;h>=0;h--){var l=u>>h&1;if(t){var p=(o+a)/2;1==l?o=p:a=p}else{var f=(r+i)/2;1==l?r=f:i=f}t=!t}}return{sw:{lat:r,lon:o},ne:{lat:i,lon:a}}},n.adjacent=function(e,t){if(e=e.toLowerCase(),t=t.toLowerCase(),0===e.length)throw new Error("Invalid geohash");if(-1=="nsew".indexOf(t))throw new Error("Invalid direction");var r={n:["p0r21436x8zb9dcf5h7kjnmqesgutwvy","bc01fg45238967deuvhjyznpkmstqrwx"],s:["14365h7k9dcfesgujnmqp0r2twvyx8zb","238967debc01fg45kmstqrwxuvhjyznp"],e:["bc01fg45238967deuvhjyznpkmstqrwx","p0r21436x8zb9dcf5h7kjnmqesgutwvy"],w:["238967debc01fg45kmstqrwxuvhjyznp","14365h7k9dcfesgujnmqp0r2twvyx8zb"]},i={n:["prxz","bcfguvyz"],s:["028b","0145hjnp"],e:["bcfguvyz","prxz"],w:["0145hjnp","028b"]},o=e.slice(-1),a=e.slice(0,-1),s=e.length%2;return-1!=i[t][s].indexOf(o)&&""!==a&&(a=n.adjacent(a,t)),a+n.base32.charAt(r[t][s].indexOf(o))},n.neighbours=function(e){return{n:n.adjacent(e,"n"),ne:n.adjacent(n.adjacent(e,"n"),"e"),e:n.adjacent(e,"e"),se:n.adjacent(n.adjacent(e,"s"),"e"),s:n.adjacent(e,"s"),sw:n.adjacent(n.adjacent(e,"s"),"w"),w:n.adjacent(e,"w"),nw:n.adjacent(n.adjacent(e,"n"),"w")}},void 0!==t&&t.exports&&(t.exports=n)},{}],22:[function(e,t,r){(function(e){function t(e,t){for(var r=0,n=e.length-1;n>=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n<e.length;n++)t(e[n],n,e)&&r.push(e[n]);return r}var i=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return i.exec(e).slice(1)};r.resolve=function(){for(var r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var a=o>=0?arguments[o]:e.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(r=a+"/"+r,i="/"===a.charAt(0))}return r=t(n(r.split("/"),function(e){return!!e}),!i).join("/"),(i?"/":"")+r||"."},r.normalize=function(e){var i=r.isAbsolute(e),o="/"===a(e,-1);return(e=t(n(e.split("/"),function(e){return!!e}),!i).join("/"))||i||(e="."),e&&o&&(e+="/"),(i?"/":"")+e},r.isAbsolute=function(e){return"/"===e.charAt(0)},r.join=function(){var e=Array.prototype.slice.call(arguments,0);return r.normalize(n(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},r.relative=function(e,t){function n(e){for(var t=0;t<e.length&&""===e[t];t++);for(var r=e.length-1;r>=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=r.resolve(e).substr(1),t=r.resolve(t).substr(1);for(var i=n(e.split("/")),o=n(t.split("/")),a=Math.min(i.length,o.length),s=a,c=0;c<a;c++)if(i[c]!==o[c]){s=c;break}for(var u=[],c=s;c<i.length;c++)u.push("..");return(u=u.concat(o.slice(s))).join("/")},r.sep="/",r.delimiter=":",r.dirname=function(e){var t=o(e),r=t[0],n=t[1];return r||n?(n&&(n=n.substr(0,n.length-1)),r+n):"."},r.basename=function(e,t){var r=o(e)[2];return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},r.extname=function(e){return o(e)[3]};var a="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)}}).call(this,e("_process"))},{_process:6}],23:[function(e,t,r){"use strict";function n(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}function i(e,t,r){var n,i,o=r.buf;if(i=o[r.pos++],n=(112&i)>>4,i<128)return a(e,n,t);if(i=o[r.pos++],n|=(127&i)<<3,i<128)return a(e,n,t);if(i=o[r.pos++],n|=(127&i)<<10,i<128)return a(e,n,t);if(i=o[r.pos++],n|=(127&i)<<17,i<128)return a(e,n,t);if(i=o[r.pos++],n|=(127&i)<<24,i<128)return a(e,n,t);if(i=o[r.pos++],n|=(1&i)<<31,i<128)return a(e,n,t);throw new Error("Expected varint not more than 10 bytes")}function o(e){return e.type===n.Bytes?e.readVarint()+e.pos:e.pos+1}function a(e,t,r){return r?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function s(e,t){var r,n;if(e>=0?(r=e%4294967296|0,n=e/4294967296|0):(n=~(-e/4294967296),4294967295^(r=~(-e%4294967296))?r=r+1|0:(r=0,n=n+1|0)),e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),c(r,n,t),u(n,t)}function c(e,t,r){r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos]=127&e}function u(e,t){var r=(7&e)<<4;t.buf[t.pos++]|=r|((e>>>=3)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e)))))}function h(e,t,r){var n=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.ceil(Math.log(t)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=e;i--)r.buf[i+n]=r.buf[i]}function l(e,t){for(var r=0;r<e.length;r++)t.writeVarint(e[r])}function p(e,t){for(var r=0;r<e.length;r++)t.writeSVarint(e[r])}function f(e,t){for(var r=0;r<e.length;r++)t.writeFloat(e[r])}function d(e,t){for(var r=0;r<e.length;r++)t.writeDouble(e[r])}function m(e,t){for(var r=0;r<e.length;r++)t.writeBoolean(e[r])}function v(e,t){for(var r=0;r<e.length;r++)t.writeFixed32(e[r])}function g(e,t){for(var r=0;r<e.length;r++)t.writeSFixed32(e[r])}function y(e,t){for(var r=0;r<e.length;r++)t.writeFixed64(e[r])}function b(e,t){for(var r=0;r<e.length;r++)t.writeSFixed64(e[r])}function _(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+16777216*e[t+3]}function x(e,t,r){e[r]=t,e[r+1]=t>>>8,e[r+2]=t>>>16,e[r+3]=t>>>24}function w(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}function S(e,t,r){for(var n="",i=t;i<r;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(i+s>r)break;var c,u,h;1===s?o<128&&(a=o):2===s?128==(192&(c=e[i+1]))&&(a=(31&o)<<6|63&c)<=127&&(a=null):3===s?(c=e[i+1],u=e[i+2],128==(192&c)&&128==(192&u)&&((a=(15&o)<<12|(63&c)<<6|63&u)<=2047||a>=55296&&a<=57343)&&(a=null)):4===s&&(c=e[i+1],u=e[i+2],h=e[i+3],128==(192&c)&&128==(192&u)&&128==(192&h)&&((a=(15&o)<<18|(63&c)<<12|(63&u)<<6|63&h)<=65535||a>=1114112)&&(a=null)),null===a?(a=65533,s=1):a>65535&&(a-=65536,n+=String.fromCharCode(a>>>10&1023|55296),a=56320|1023&a),n+=String.fromCharCode(a),i+=s}return n}function M(e,t,r){for(var n,i,o=0;o<t.length;o++){if((n=t.charCodeAt(o))>55295&&n<57344){if(!i){n>56319||o+1===t.length?(e[r++]=239,e[r++]=191,e[r++]=189):i=n;continue}if(n<56320){e[r++]=239,e[r++]=191,e[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(e[r++]=239,e[r++]=191,e[r++]=189,i=null);n<128?e[r++]=n:(n<2048?e[r++]=n>>6|192:(n<65536?e[r++]=n>>12|224:(e[r++]=n>>18|240,e[r++]=n>>12&63|128),e[r++]=n>>6&63|128),e[r++]=63&n|128)}return r}t.exports=n;var E=e("ieee754");n.Varint=0,n.Fixed64=1,n.Bytes=2,n.Fixed32=5;n.prototype={destroy:function(){this.buf=null},readFields:function(e,t,r){for(r=r||this.length;this.pos<r;){var n=this.readVarint(),i=n>>3,o=this.pos;this.type=7&n,e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=_(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=w(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=_(this.buf,this.pos)+4294967296*_(this.buf,this.pos+4);return this.pos+=8,e},readSFixed64:function(){var e=_(this.buf,this.pos)+4294967296*w(this.buf,this.pos+4);return this.pos+=8,e},readFloat:function(){var e=E.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=E.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,r,n=this.buf;return r=n[this.pos++],t=127&r,r<128?t:(r=n[this.pos++],t|=(127&r)<<7,r<128?t:(r=n[this.pos++],t|=(127&r)<<14,r<128?t:(r=n[this.pos++],t|=(127&r)<<21,r<128?t:(r=n[this.pos],t|=(15&r)<<28,i(t,e,this)))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=S(this.buf,this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){var r=o(this);for(e=e||[];this.pos<r;)e.push(this.readVarint(t));return e},readPackedSVarint:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(e){var t=o(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(e){var t=7&e;if(t===n.Varint)for(;this.buf[this.pos++]>127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t<this.pos+e;)t*=2;if(t!==this.length){var r=new Uint8Array(t);r.set(this.buf),this.buf=r,this.length=t}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(e){this.realloc(4),x(this.buf,e,this.pos),this.pos+=4},writeSFixed32:function(e){this.realloc(4),x(this.buf,e,this.pos),this.pos+=4},writeFixed64:function(e){this.realloc(8),x(this.buf,-1&e,this.pos),x(this.buf,Math.floor(e*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(e){this.realloc(8),x(this.buf,-1&e,this.pos),x(this.buf,Math.floor(e*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(e){(e=+e||0)>268435455||e<0?s(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length);var t=++this.pos;this.pos=M(this.buf,e,this.pos);var r=this.pos-t;r>=128&&h(t,r,this),this.pos=t-1,this.writeVarint(r),this.pos+=r},writeFloat:function(e){this.realloc(4),E.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),E.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;r<t;r++)this.buf[this.pos++]=e[r]},writeRawMessage:function(e,t){var r=++this.pos;e(t,this);var n=this.pos-r;n>=128&&h(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.writeRawMessage(t,r)},writePackedVarint:function(e,t){this.writeMessage(e,l,t)},writePackedSVarint:function(e,t){this.writeMessage(e,p,t)},writePackedBoolean:function(e,t){this.writeMessage(e,m,t)},writePackedFloat:function(e,t){this.writeMessage(e,f,t)},writePackedDouble:function(e,t){this.writeMessage(e,d,t)},writePackedFixed32:function(e,t){this.writeMessage(e,v,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,g,t)},writePackedFixed64:function(e,t){this.writeMessage(e,y,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,b,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}},{ieee754:17}],24:[function(e,t,r){"use strict";function n(e,t,r,a,s){for(r=r||0,a=a||e.length-1,s=s||o;a>r;){if(a-r>600){var c=a-r+1,u=t-r+1,h=Math.log(c),l=.5*Math.exp(2*h/3),p=.5*Math.sqrt(h*l*(c-l)/c)*(u-c/2<0?-1:1);n(e,t,Math.max(r,Math.floor(t-u*l/c+p)),Math.min(a,Math.floor(t+(c-u)*l/c+p)),s)}var f=e[t],d=r,m=a;for(i(e,r,t),s(e[a],f)>0&&i(e,r,a);d<m;){for(i(e,d,m),d++,m--;s(e[d],f)<0;)d++;for(;s(e[m],f)>0;)m--}0===s(e[r],f)?i(e,r,m):i(e,++m,a),m<=t&&(r=m+1),t<=m&&(a=m-1)}}function i(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function o(e,t){return e<t?-1:e>t?1:0}t.exports=n},{}],25:[function(e,t,r){"use strict";function n(e,t){if(!(this instanceof n))return new n(e,t);this._maxEntries=Math.max(4,e||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),t&&this._initFormat(t),this.clear()}function i(e,t,r){if(!r)return t.indexOf(e);for(var n=0;n<t.length;n++)if(r(e,t[n]))return n;return-1}function o(e,t){a(e,0,e.children.length,t,e)}function a(e,t,r,n,i){i||(i=v(null)),i.minX=1/0,i.minY=1/0,i.maxX=-1/0,i.maxY=-1/0;for(var o,a=t;a<r;a++)o=e.children[a],s(i,e.leaf?n(o):o);return i}function s(e,t){return e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e}function c(e,t){return e.minX-t.minX}function u(e,t){return e.minY-t.minY}function h(e){return(e.maxX-e.minX)*(e.maxY-e.minY)}function l(e){return e.maxX-e.minX+(e.maxY-e.minY)}function p(e,t){return(Math.max(t.maxX,e.maxX)-Math.min(t.minX,e.minX))*(Math.max(t.maxY,e.maxY)-Math.min(t.minY,e.minY))}function f(e,t){var r=Math.max(e.minX,t.minX),n=Math.max(e.minY,t.minY),i=Math.min(e.maxX,t.maxX),o=Math.min(e.maxY,t.maxY);return Math.max(0,i-r)*Math.max(0,o-n)}function d(e,t){return e.minX<=t.minX&&e.minY<=t.minY&&t.maxX<=e.maxX&&t.maxY<=e.maxY}function m(e,t){return t.minX<=e.maxX&&t.minY<=e.maxY&&t.maxX>=e.minX&&t.maxY>=e.minY}function v(e){return{children:e,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function g(e,t,r,n,i){for(var o,a=[t,r];a.length;)(r=a.pop())-(t=a.pop())<=n||(o=t+Math.ceil((r-t)/n/2)*n,y(e,o,t,r,i),a.push(t,o,o,r))}t.exports=n;var y=e("quickselect");n.prototype={all:function(){return this._all(this.data,[])},search:function(e){var t=this.data,r=[],n=this.toBBox;if(!m(e,t))return r;for(var i,o,a,s,c=[];t;){for(i=0,o=t.children.length;i<o;i++)a=t.children[i],m(e,s=t.leaf?n(a):a)&&(t.leaf?r.push(a):d(e,s)?this._all(a,r):c.push(a));t=c.pop()}return r},collides:function(e){var t=this.data,r=this.toBBox;if(!m(e,t))return!1;for(var n,i,o,a,s=[];t;){for(n=0,i=t.children.length;n<i;n++)if(o=t.children[n],a=t.leaf?r(o):o,m(e,a)){if(t.leaf||d(e,a))return!0;s.push(o)}t=s.pop()}return!1},load:function(e){if(!e||!e.length)return this;if(e.length<this._minEntries){for(var t=0,r=e.length;t<r;t++)this.insert(e[t]);return this}var n=this._build(e.slice(),0,e.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var i=this.data;this.data=n,n=i}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},insert:function(e){return e&&this._insert(e,this.data.height-1),this},clear:function(){return this.data=v([]),this},remove:function(e,t){if(!e)return this;for(var r,n,o,a,s=this.data,c=this.toBBox(e),u=[],h=[];s||u.length;){if(s||(s=u.pop(),n=u[u.length-1],r=h.pop(),a=!0),s.leaf&&-1!==(o=i(e,s.children,t)))return s.children.splice(o,1),u.push(s),this._condense(u),this;a||s.leaf||!d(s,c)?n?(r++,s=n.children[r],a=!1):s=null:(u.push(s),h.push(r),r=0,n=s,s=s.children[0])}return this},toBBox:function(e){return e},compareMinX:c,compareMinY:u,toJSON:function(){return this.data},fromJSON:function(e){return this.data=e,this},_all:function(e,t){for(var r=[];e;)e.leaf?t.push.apply(t,e.children):r.push.apply(r,e.children),e=r.pop();return t},_build:function(e,t,r,n){var i,a=r-t+1,s=this._maxEntries;if(a<=s)return i=v(e.slice(t,r+1)),o(i,this.toBBox),i;n||(n=Math.ceil(Math.log(a)/Math.log(s)),s=Math.ceil(a/Math.pow(s,n-1))),(i=v([])).leaf=!1,i.height=n;var c,u,h,l,p=Math.ceil(a/s),f=p*Math.ceil(Math.sqrt(s));for(g(e,t,r,f,this.compareMinX),c=t;c<=r;c+=f)for(g(e,c,h=Math.min(c+f-1,r),p,this.compareMinY),u=c;u<=h;u+=p)l=Math.min(u+p-1,h),i.children.push(this._build(e,u,l,n-1));return o(i,this.toBBox),i},_chooseSubtree:function(e,t,r,n){for(var i,o,a,s,c,u,l,f;;){if(n.push(t),t.leaf||n.length-1===r)break;for(l=f=1/0,i=0,o=t.children.length;i<o;i++)c=h(a=t.children[i]),(u=p(e,a)-c)<f?(f=u,l=c<l?c:l,s=a):u===f&&c<l&&(l=c,s=a);t=s||t.children[0]}return t},_insert:function(e,t,r){var n=this.toBBox,i=r?e:n(e),o=[],a=this._chooseSubtree(i,this.data,t,o);for(a.children.push(e),s(a,i);t>=0&&o[t].children.length>this._maxEntries;)this._split(o,t),t--;this._adjustParentBBoxes(i,o,t)},_split:function(e,t){var r=e[t],n=r.children.length,i=this._minEntries;this._chooseSplitAxis(r,i,n);var a=this._chooseSplitIndex(r,i,n),s=v(r.children.splice(a,r.children.length-a));s.height=r.height,s.leaf=r.leaf,o(r,this.toBBox),o(s,this.toBBox),t?e[t-1].children.push(s):this._splitRoot(r,s)},_splitRoot:function(e,t){this.data=v([e,t]),this.data.height=e.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},_chooseSplitIndex:function(e,t,r){var n,i,o,s,c,u,l,p;for(u=l=1/0,n=t;n<=r-t;n++)s=f(i=a(e,0,n,this.toBBox),o=a(e,n,r,this.toBBox)),c=h(i)+h(o),s<u?(u=s,p=n,l=c<l?c:l):s===u&&c<l&&(l=c,p=n);return p},_chooseSplitAxis:function(e,t,r){var n=e.leaf?this.compareMinX:c,i=e.leaf?this.compareMinY:u;this._allDistMargin(e,t,r,n)<this._allDistMargin(e,t,r,i)&&e.children.sort(n)},_allDistMargin:function(e,t,r,n){e.children.sort(n);var i,o,c=this.toBBox,u=a(e,0,t,c),h=a(e,r-t,r,c),p=l(u)+l(h);for(i=t;i<r-t;i++)o=e.children[i],s(u,e.leaf?c(o):o),p+=l(u);for(i=r-t-1;i>=t;i--)o=e.children[i],s(h,e.leaf?c(o):o),p+=l(h);return p},_adjustParentBBoxes:function(e,t,r){for(var n=r;n>=0;n--)s(t[n],e)},_condense:function(e){for(var t,r=e.length-1;r>=0;r--)0===e[r].children.length?r>0?(t=e[r-1].children).splice(t.indexOf(e[r]),1):this.clear():o(e[r],this.toBBox)},_initFormat:function(e){var t=["return a"," - b",";"];this.compareMinX=new Function("a","b",t.join(e[0])),this.compareMinY=new Function("a","b",t.join(e[1])),this.toBBox=new Function("a","return {minX: a"+e[0]+", minY: a"+e[1]+", maxX: a"+e[2]+", maxY: a"+e[3]+"};")}}},{quickselect:24}],26:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Subject"),o=e("./util/ObjectUnsubscribedError"),a=function(e){function t(t){e.call(this),this._value=t}return n(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var r=e.prototype._subscribe.call(this,t);return r&&!r.closed&&t.next(this._value),r},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new o.ObjectUnsubscribedError;return this._value},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(i.Subject);r.BehaviorSubject=a},{"./Subject":34,"./util/ObjectUnsubscribedError":164}],27:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r,n){e.call(this),this.parent=t,this.outerValue=r,this.outerIndex=n,this.index=0}return n(t,e),t.prototype._next=function(e){this.parent.notifyNext(this.outerValue,e,this.outerIndex,this.index++,this)},t.prototype._error=function(e){this.parent.notifyError(e,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(e("./Subscriber").Subscriber);r.InnerSubscriber=i},{"./Subscriber":36}],28:[function(e,t,r){"use strict";var n=e("./Observable"),i=function(){function e(e,t,r){this.kind=e,this.value=t,this.error=r,this.hasValue="N"===e}return e.prototype.observe=function(e){switch(this.kind){case"N":return e.next&&e.next(this.value);case"E":return e.error&&e.error(this.error);case"C":return e.complete&&e.complete()}},e.prototype.do=function(e,t,r){switch(this.kind){case"N":return e&&e(this.value);case"E":return t&&t(this.error);case"C":return r&&r()}},e.prototype.accept=function(e,t,r){return e&&"function"==typeof e.next?this.observe(e):this.do(e,t,r)},e.prototype.toObservable=function(){switch(this.kind){case"N":return n.Observable.of(this.value);case"E":return n.Observable.throw(this.error);case"C":return n.Observable.empty()}throw new Error("unexpected notification kind value")},e.createNext=function(t){return void 0!==t?new e("N",t):e.undefinedValueNotification},e.createError=function(t){return new e("E",void 0,t)},e.createComplete=function(){return e.completeNotification},e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0),e}();r.Notification=i},{"./Observable":29}],29:[function(e,t,r){"use strict";var n=e("./util/root"),i=e("./util/toSubscriber"),o=e("./symbol/observable"),a=function(){function e(e){this._isScalar=!1,e&&(this._subscribe=e)}return e.prototype.lift=function(t){var r=new e;return r.source=this,r.operator=t,r},e.prototype.subscribe=function(e,t,r){var n=this.operator,o=i.toSubscriber(e,t,r);if(n?n.call(o,this.source):o.add(this.source?this._subscribe(o):this._trySubscribe(o)),o.syncErrorThrowable&&(o.syncErrorThrowable=!1,o.syncErrorThrown))throw o.syncErrorValue;return o},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.syncErrorThrown=!0,e.syncErrorValue=t,e.error(t)}},e.prototype.forEach=function(e,t){var r=this;if(t||(n.root.Rx&&n.root.Rx.config&&n.root.Rx.config.Promise?t=n.root.Rx.config.Promise:n.root.Promise&&(t=n.root.Promise)),!t)throw new Error("no Promise impl found");return new t(function(t,n){var i;i=r.subscribe(function(t){if(i)try{e(t)}catch(e){n(e),i.unsubscribe()}else e(t)},n,t)})},e.prototype._subscribe=function(e){return this.source.subscribe(e)},e.prototype[o.observable]=function(){return this},e.create=function(t){return new e(t)},e}();r.Observable=a},{"./symbol/observable":159,"./util/root":176,"./util/toSubscriber":178}],30:[function(e,t,r){"use strict";r.empty={closed:!0,next:function(e){},error:function(e){throw e},complete:function(){}}},{}],31:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments)}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.destination.next(t)},t.prototype.notifyError=function(e,t){this.destination.error(e)},t.prototype.notifyComplete=function(e){this.destination.complete()},t}(e("./Subscriber").Subscriber);r.OuterSubscriber=i},{"./Subscriber":36}],32:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Subject"),o=e("./scheduler/queue"),a=e("./Subscription"),s=e("./operator/observeOn"),c=e("./util/ObjectUnsubscribedError"),u=e("./SubjectSubscription"),h=function(e){function t(t,r,n){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=Number.POSITIVE_INFINITY),e.call(this),this.scheduler=n,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=r<1?1:r}return n(t,e),t.prototype.next=function(t){var r=this._getNow();this._events.push(new l(r,t)),this._trimBufferThenGetEvents(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){var t,r=this._trimBufferThenGetEvents(),n=this.scheduler;if(this.closed)throw new c.ObjectUnsubscribedError;this.hasError?t=a.Subscription.EMPTY:this.isStopped?t=a.Subscription.EMPTY:(this.observers.push(e),t=new u.SubjectSubscription(this,e)),n&&e.add(e=new s.ObserveOnSubscriber(e,n));for(var i=r.length,o=0;o<i&&!e.closed;o++)e.next(r[o].value);return this.hasError?e.error(this.thrownError):this.isStopped&&e.complete(),t},t.prototype._getNow=function(){return(this.scheduler||o.queue).now()},t.prototype._trimBufferThenGetEvents=function(){for(var e=this._getNow(),t=this._bufferSize,r=this._windowTime,n=this._events,i=n.length,o=0;o<i&&!(e-n[o].time<r);)o++;return i>t&&(o=Math.max(o,i-t)),o>0&&n.splice(0,o),n},t}(i.Subject);r.ReplaySubject=h;var l=function(){return function(e,t){this.time=e,this.value=t}}()},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operator/observeOn":131,"./scheduler/queue":157,"./util/ObjectUnsubscribedError":164}],33:[function(e,t,r){"use strict";var n=function(){function e(t,r){void 0===r&&(r=e.now),this.SchedulerAction=t,this.now=r}return e.prototype.schedule=function(e,t,r){return void 0===t&&(t=0),new this.SchedulerAction(this,e).schedule(r,t)},e.now=Date.now?Date.now:function(){return+new Date},e}();r.Scheduler=n},{}],34:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Observable"),o=e("./Subscriber"),a=e("./Subscription"),s=e("./util/ObjectUnsubscribedError"),c=e("./SubjectSubscription"),u=e("./symbol/rxSubscriber"),h=function(e){function t(t){e.call(this,t),this.destination=t}return n(t,e),t}(o.Subscriber);r.SubjectSubscriber=h;var l=function(e){function t(){e.call(this),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}return n(t,e),t.prototype[u.rxSubscriber]=function(){return new h(this)},t.prototype.lift=function(e){var t=new p(this,this);return t.operator=e,t},t.prototype.next=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;if(!this.isStopped)for(var t=this.observers,r=t.length,n=t.slice(),i=0;i<r;i++)n[i].next(e)},t.prototype.error=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;this.hasError=!0,this.thrownError=e,this.isStopped=!0;for(var t=this.observers,r=t.length,n=t.slice(),i=0;i<r;i++)n[i].error(e);this.observers.length=0},t.prototype.complete=function(){if(this.closed)throw new s.ObjectUnsubscribedError;this.isStopped=!0;for(var e=this.observers,t=e.length,r=e.slice(),n=0;n<t;n++)r[n].complete();this.observers.length=0},t.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},t.prototype._trySubscribe=function(t){if(this.closed)throw new s.ObjectUnsubscribedError;return e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;return this.hasError?(e.error(this.thrownError),a.Subscription.EMPTY):this.isStopped?(e.complete(),a.Subscription.EMPTY):(this.observers.push(e),new c.SubjectSubscription(this,e))},t.prototype.asObservable=function(){var e=new i.Observable;return e.source=this,e},t.create=function(e,t){return new p(e,t)},t}(i.Observable);r.Subject=l;var p=function(e){function t(t,r){e.call(this),this.destination=t,this.source=r}return n(t,e),t.prototype.next=function(e){var t=this.destination;t&&t.next&&t.next(e)},t.prototype.error=function(e){var t=this.destination;t&&t.error&&this.destination.error(e)},t.prototype.complete=function(){var e=this.destination;e&&e.complete&&this.destination.complete()},t.prototype._subscribe=function(e){return this.source?this.source.subscribe(e):a.Subscription.EMPTY},t}(l);r.AnonymousSubject=p},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/ObjectUnsubscribedError":164}],35:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.subject=t,this.subscriber=r,this.closed=!1}return n(t,e),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var e=this.subject,t=e.observers;if(this.subject=null,t&&0!==t.length&&!e.isStopped&&!e.closed){var r=t.indexOf(this.subscriber);-1!==r&&t.splice(r,1)}}},t}(e("./Subscription").Subscription);r.SubjectSubscription=i},{"./Subscription":37}],36:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./util/isFunction"),o=e("./Subscription"),a=e("./Observer"),s=e("./symbol/rxSubscriber"),c=function(e){function t(r,n,i){switch(e.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a.empty;break;case 1:if(!r){this.destination=a.empty;break}if("object"==typeof r){r instanceof t?(this.destination=r,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,r));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,r,n,i)}}return n(t,e),t.prototype[s.rxSubscriber]=function(){return this},t.create=function(e,r,n){var i=new t(e,r,n);return i.syncErrorThrowable=!1,i},t.prototype.next=function(e){this.isStopped||this._next(e)},t.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this))},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){this.destination.error(e),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var e=this,t=e._parent,r=e._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=t,this._parents=r,this},t}(o.Subscription);r.Subscriber=c;var u=function(e){function t(t,r,n,o){e.call(this),this._parentSubscriber=t;var s,c=this;i.isFunction(r)?s=r:r&&(s=r.next,n=r.error,o=r.complete,r!==a.empty&&(c=Object.create(r),i.isFunction(c.unsubscribe)&&this.add(c.unsubscribe.bind(c)),c.unsubscribe=this.unsubscribe.bind(this))),this._context=c,this._next=s,this._error=n,this._complete=o}return n(t,e),t.prototype.next=function(e){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}},t.prototype.error=function(e){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),e;t.syncErrorValue=e,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var e=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var r=function(){return e._complete.call(e._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,r),this.unsubscribe()):(this.__tryOrUnsub(r),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(e,t){try{e.call(this._context,t)}catch(e){throw this.unsubscribe(),e}},t.prototype.__tryOrSetError=function(e,t,r){try{t.call(this._context,r)}catch(t){return e.syncErrorValue=t,e.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var e=this._parentSubscriber;this._context=null,this._parentSubscriber=null,e.unsubscribe()},t}(c)},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/isFunction":171}],37:[function(e,t,r){"use strict";function n(e){return e.reduce(function(e,t){return e.concat(t instanceof u.UnsubscriptionError?t.errors:t)},[])}var i=e("./util/isArray"),o=e("./util/isObject"),a=e("./util/isFunction"),s=e("./util/tryCatch"),c=e("./util/errorObject"),u=e("./util/UnsubscriptionError"),h=function(){function e(e){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,e&&(this._unsubscribe=e)}return e.prototype.unsubscribe=function(){var e,t=!1;if(!this.closed){var r=this,h=r._parent,l=r._parents,p=r._unsubscribe,f=r._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var d=-1,m=l?l.length:0;h;)h.remove(this),h=++d<m&&l[d]||null;if(a.isFunction(p)&&(g=s.tryCatch(p).call(this))===c.errorObject&&(t=!0,e=e||(c.errorObject.e instanceof u.UnsubscriptionError?n(c.errorObject.e.errors):[c.errorObject.e])),i.isArray(f))for(d=-1,m=f.length;++d<m;){var v=f[d];if(o.isObject(v)){var g=s.tryCatch(v.unsubscribe).call(v);if(g===c.errorObject){t=!0,e=e||[];var y=c.errorObject.e;y instanceof u.UnsubscriptionError?e=e.concat(n(y.errors)):e.push(y)}}}if(t)throw new u.UnsubscriptionError(e)}},e.prototype.add=function(t){if(!t||t===e.EMPTY)return e.EMPTY;if(t===this)return this;var r=t;switch(typeof t){case"function":r=new e(t);case"object":if(r.closed||"function"!=typeof r.unsubscribe)return r;if(this.closed)return r.unsubscribe(),r;if("function"!=typeof r._addParent){var n=r;(r=new e)._subscriptions=[n]}break;default:throw new Error("unrecognized teardown "+t+" added to Subscription.")}return(this._subscriptions||(this._subscriptions=[])).push(r),r._addParent(this),r},e.prototype.remove=function(e){var t=this._subscriptions;if(t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)}},e.prototype._addParent=function(e){var t=this,r=t._parent,n=t._parents;r&&r!==e?n?-1===n.indexOf(e)&&n.push(e):this._parents=[e]:this._parent=e},e.EMPTY=function(e){return e.closed=!0,e}(new e),e}();r.Subscription=h},{"./util/UnsubscriptionError":166,"./util/errorObject":167,"./util/isArray":168,"./util/isFunction":171,"./util/isObject":173,"./util/tryCatch":179}],38:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/combineLatest");n.Observable.combineLatest=i.combineLatest},{"../../Observable":29,"../../observable/combineLatest":99}],39:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/defer");n.Observable.defer=i.defer},{"../../Observable":29,"../../observable/defer":100}],40:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/empty");n.Observable.empty=i.empty},{"../../Observable":29,"../../observable/empty":101}],41:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/from");n.Observable.from=i.from},{"../../Observable":29,"../../observable/from":102}],42:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/fromEvent");n.Observable.fromEvent=i.fromEvent},{"../../Observable":29,"../../observable/fromEvent":103}],43:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/fromPromise");n.Observable.fromPromise=i.fromPromise},{"../../Observable":29,"../../observable/fromPromise":104}],44:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/merge");n.Observable.merge=i.merge},{"../../Observable":29,"../../observable/merge":105}],45:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/of");n.Observable.of=i.of},{"../../Observable":29,"../../observable/of":106}],46:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/throw");n.Observable.throw=i._throw},{"../../Observable":29,"../../observable/throw":107}],47:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/timer");n.Observable.timer=i.timer},{"../../Observable":29,"../../observable/timer":108}],48:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/zip");n.Observable.zip=i.zip},{"../../Observable":29,"../../observable/zip":109}],49:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/buffer");n.Observable.prototype.buffer=i.buffer},{"../../Observable":29,"../../operator/buffer":110}],50:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/bufferCount");n.Observable.prototype.bufferCount=i.bufferCount},{"../../Observable":29,"../../operator/bufferCount":111}],51:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/bufferWhen");n.Observable.prototype.bufferWhen=i.bufferWhen},{"../../Observable":29,"../../operator/bufferWhen":112}],52:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/catch");n.Observable.prototype.catch=i._catch,n.Observable.prototype._catch=i._catch},{"../../Observable":29,"../../operator/catch":113}],53:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/combineLatest");n.Observable.prototype.combineLatest=i.combineLatest},{"../../Observable":29,"../../operator/combineLatest":114}],54:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/concat");n.Observable.prototype.concat=i.concat},{"../../Observable":29,"../../operator/concat":115}],55:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/debounceTime");n.Observable.prototype.debounceTime=i.debounceTime},{"../../Observable":29,"../../operator/debounceTime":116}],56:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/delay");n.Observable.prototype.delay=i.delay},{"../../Observable":29,"../../operator/delay":117}],57:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/distinct");n.Observable.prototype.distinct=i.distinct},{"../../Observable":29,"../../operator/distinct":118}],58:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/distinctUntilChanged");n.Observable.prototype.distinctUntilChanged=i.distinctUntilChanged},{"../../Observable":29,"../../operator/distinctUntilChanged":119}],59:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/do");n.Observable.prototype.do=i._do,n.Observable.prototype._do=i._do},{"../../Observable":29,"../../operator/do":120}],60:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/expand");n.Observable.prototype.expand=i.expand},{"../../Observable":29,"../../operator/expand":121}],61:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/filter");n.Observable.prototype.filter=i.filter},{"../../Observable":29,"../../operator/filter":122}],62:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/finally");n.Observable.prototype.finally=i._finally,n.Observable.prototype._finally=i._finally},{"../../Observable":29,"../../operator/finally":123}],63:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/first");n.Observable.prototype.first=i.first},{"../../Observable":29,"../../operator/first":124}],64:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/last");n.Observable.prototype.last=i.last},{"../../Observable":29,"../../operator/last":125}],65:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/map");n.Observable.prototype.map=i.map},{"../../Observable":29,"../../operator/map":126}],66:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/merge");n.Observable.prototype.merge=i.merge},{"../../Observable":29,"../../operator/merge":127}],67:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/mergeAll");n.Observable.prototype.mergeAll=i.mergeAll},{"../../Observable":29,"../../operator/mergeAll":128}],68:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/mergeMap");n.Observable.prototype.mergeMap=i.mergeMap,n.Observable.prototype.flatMap=i.mergeMap},{"../../Observable":29,"../../operator/mergeMap":129}],69:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/pairwise");n.Observable.prototype.pairwise=i.pairwise},{"../../Observable":29,"../../operator/pairwise":132}],70:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/pluck");n.Observable.prototype.pluck=i.pluck},{"../../Observable":29,"../../operator/pluck":133}],71:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/publish");n.Observable.prototype.publish=i.publish},{"../../Observable":29,"../../operator/publish":134}],72:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/publishReplay");n.Observable.prototype.publishReplay=i.publishReplay},{"../../Observable":29,"../../operator/publishReplay":135}],73:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/sample");n.Observable.prototype.sample=i.sample},{"../../Observable":29,"../../operator/sample":136}],74:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/scan");n.Observable.prototype.scan=i.scan},{"../../Observable":29,"../../operator/scan":137}],75:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/share");n.Observable.prototype.share=i.share},{"../../Observable":29,"../../operator/share":138}],76:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skip");n.Observable.prototype.skip=i.skip},{"../../Observable":29,"../../operator/skip":139}],77:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skipUntil");n.Observable.prototype.skipUntil=i.skipUntil},{"../../Observable":29,"../../operator/skipUntil":140}],78:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skipWhile");n.Observable.prototype.skipWhile=i.skipWhile},{"../../Observable":29,"../../operator/skipWhile":141}],79:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/startWith");n.Observable.prototype.startWith=i.startWith},{"../../Observable":29,"../../operator/startWith":142}],80:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/switchMap");n.Observable.prototype.switchMap=i.switchMap},{"../../Observable":29,"../../operator/switchMap":143}],81:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/take");n.Observable.prototype.take=i.take},{"../../Observable":29,"../../operator/take":144}],82:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/takeUntil");n.Observable.prototype.takeUntil=i.takeUntil},{"../../Observable":29,"../../operator/takeUntil":145}],83:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/takeWhile");n.Observable.prototype.takeWhile=i.takeWhile},{"../../Observable":29,"../../operator/takeWhile":146}],84:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/throttleTime");n.Observable.prototype.throttleTime=i.throttleTime},{"../../Observable":29,"../../operator/throttleTime":148}],85:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/withLatestFrom");n.Observable.prototype.withLatestFrom=i.withLatestFrom},{"../../Observable":29,"../../operator/withLatestFrom":149}],86:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/zip");n.Observable.prototype.zip=i.zipProto},{"../../Observable":29,"../../operator/zip":150}],87:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("./ScalarObservable"),a=e("./EmptyObservable"),s=function(e){function t(t,r){e.call(this),this.arrayLike=t,this.scheduler=r,r||1!==t.length||(this._isScalar=!0,this.value=t[0])}return n(t,e),t.create=function(e,r){var n=e.length;return 0===n?new a.EmptyObservable:1===n?new o.ScalarObservable(e[0],r):new t(e,r)},t.dispatch=function(e){var t=e.arrayLike,r=e.index,n=e.length,i=e.subscriber;i.closed||(r>=n?i.complete():(i.next(t[r]),e.index=r+1,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this,n=r.arrayLike,i=r.scheduler,o=n.length;if(i)return i.schedule(t.dispatch,0,{arrayLike:n,index:0,length:o,subscriber:e});for(var a=0;a<o&&!e.closed;a++)e.next(n[a]);e.complete()},t}(i.Observable);r.ArrayLikeObservable=s},{"../Observable":29,"./EmptyObservable":91,"./ScalarObservable":97}],88:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("./ScalarObservable"),a=e("./EmptyObservable"),s=e("../util/isScheduler"),c=function(e){function t(t,r){e.call(this),this.array=t,this.scheduler=r,r||1!==t.length||(this._isScalar=!0,this.value=t[0])}return n(t,e),t.create=function(e,r){return new t(e,r)},t.of=function(){for(var e=[],r=0;r<arguments.length;r++)e[r-0]=arguments[r];var n=e[e.length-1];s.isScheduler(n)?e.pop():n=null;var i=e.length;return i>1?new t(e,n):1===i?new o.ScalarObservable(e[0],n):new a.EmptyObservable(n)},t.dispatch=function(e){var t=e.array,r=e.index,n=e.count,i=e.subscriber;r>=n?i.complete():(i.next(t[r]),i.closed||(e.index=r+1,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this.array,n=r.length,i=this.scheduler;if(i)return i.schedule(t.dispatch,0,{array:r,index:0,count:n,subscriber:e});for(var o=0;o<n&&!e.closed;o++)e.next(r[o]);e.complete()},t}(i.Observable);r.ArrayObservable=c},{"../Observable":29,"../util/isScheduler":175,"./EmptyObservable":91,"./ScalarObservable":97}],89:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subject"),o=e("../Observable"),a=e("../Subscriber"),s=e("../Subscription"),c=function(e){function t(t,r){e.call(this),this.source=t,this.subjectFactory=r,this._refCount=0,this._isComplete=!1}return n(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new s.Subscription).add(this.source.subscribe(new h(this.getSubject(),this))),e.closed?(this._connection=null,e=s.Subscription.EMPTY):this._connection=e),e},t.prototype.refCount=function(){return this.lift(new l(this))},t}(o.Observable);r.ConnectableObservable=c;var u=c.prototype;r.connectableObservableDescriptor={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:u._subscribe},_isComplete:{value:u._isComplete,writable:!0},getSubject:{value:u.getSubject},connect:{value:u.connect},refCount:{value:u.refCount}};var h=function(e){function t(t,r){e.call(this,t),this.connectable=r}return n(t,e),t.prototype._error=function(t){this._unsubscribe(),e.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}},t}(i.SubjectSubscriber),l=function(){function e(e){this.connectable=e}return e.prototype.call=function(e,t){var r=this.connectable;r._refCount++;var n=new p(e,r),i=t.subscribe(n);return n.closed||(n.connection=r.connect()),i},e}(),p=function(e){function t(t,r){e.call(this,t),this.connectable=r}return n(t,e),t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var r=this.connection,n=e._connection;this.connection=null,!n||r&&n!==r||n.unsubscribe()}}else this.connection=null},t}(a.Subscriber)},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37}],90:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("../util/subscribeToResult"),a=e("../OuterSubscriber"),s=function(e){function t(t){e.call(this),this.observableFactory=t}return n(t,e),t.create=function(e){return new t(e)},t.prototype._subscribe=function(e){return new c(e,this.observableFactory)},t}(i.Observable);r.DeferObservable=s;var c=function(e){function t(t,r){e.call(this,t),this.factory=r,this.tryDefer()}return n(t,e),t.prototype.tryDefer=function(){try{this._callFactory()}catch(e){this._error(e)}},t.prototype._callFactory=function(){var e=this.factory();e&&this.add(o.subscribeToResult(this,e))},t}(a.OuterSubscriber)},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":177}],91:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t){e.call(this),this.scheduler=t}return n(t,e),t.create=function(e){return new t(e)},t.dispatch=function(e){e.subscriber.complete()},t.prototype._subscribe=function(e){var r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{subscriber:e});e.complete()},t}(e("../Observable").Observable);r.EmptyObservable=i},{"../Observable":29}],92:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.error=t,this.scheduler=r}return n(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.error;e.subscriber.error(t)},t.prototype._subscribe=function(e){var r=this.error,n=this.scheduler;if(e.syncErrorThrowable=!0,n)return n.schedule(t.dispatch,0,{error:r,subscriber:e});e.error(r)},t}(e("../Observable").Observable);r.ErrorObservable=i},{"../Observable":29}],93:[function(e,t,r){"use strict";function n(e){return!!e&&"function"==typeof e.addListener&&"function"==typeof e.removeListener}function i(e){return!!e&&"function"==typeof e.on&&"function"==typeof e.off}function o(e){return!!e&&"[object NodeList]"===d.call(e)}function a(e){return!!e&&"[object HTMLCollection]"===d.call(e)}function s(e){return!!e&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener}var c=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},u=e("../Observable"),h=e("../util/tryCatch"),l=e("../util/isFunction"),p=e("../util/errorObject"),f=e("../Subscription"),d=Object.prototype.toString,m=function(e){function t(t,r,n,i){e.call(this),this.sourceObj=t,this.eventName=r,this.selector=n,this.options=i}return c(t,e),t.create=function(e,r,n,i){return l.isFunction(n)&&(i=n,n=void 0),new t(e,r,i,n)},t.setupSubscription=function(e,r,c,u,h){var l;if(o(e)||a(e))for(var p=0,d=e.length;p<d;p++)t.setupSubscription(e[p],r,c,u,h);else if(s(e)){var m=e;e.addEventListener(r,c,h),l=function(){return m.removeEventListener(r,c)}}else if(i(e)){var v=e;e.on(r,c),l=function(){return v.off(r,c)}}else{if(!n(e))throw new TypeError("Invalid event target");var g=e;e.addListener(r,c),l=function(){return g.removeListener(r,c)}}u.add(new f.Subscription(l))},t.prototype._subscribe=function(e){var r=this.sourceObj,n=this.eventName,i=this.options,o=this.selector,a=o?function(){for(var t=[],r=0;r<arguments.length;r++)t[r-0]=arguments[r];var n=h.tryCatch(o).apply(void 0,t);n===p.errorObject?e.error(p.errorObject.e):e.next(n)}:function(t){return e.next(t)};t.setupSubscription(r,n,a,e,i)},t}(u.Observable);r.FromEventObservable=m},{"../Observable":29,"../Subscription":37,"../util/errorObject":167,"../util/isFunction":171,"../util/tryCatch":179}],94:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/isArray"),o=e("../util/isArrayLike"),a=e("../util/isPromise"),s=e("./PromiseObservable"),c=e("./IteratorObservable"),u=e("./ArrayObservable"),h=e("./ArrayLikeObservable"),l=e("../symbol/iterator"),p=e("../Observable"),f=e("../operator/observeOn"),d=e("../symbol/observable"),m=function(e){function t(t,r){e.call(this,null),this.ish=t,this.scheduler=r}return n(t,e),t.create=function(e,r){if(null!=e){if("function"==typeof e[d.observable])return e instanceof p.Observable&&!r?e:new t(e,r);if(i.isArray(e))return new u.ArrayObservable(e,r);if(a.isPromise(e))return new s.PromiseObservable(e,r);if("function"==typeof e[l.iterator]||"string"==typeof e)return new c.IteratorObservable(e,r);if(o.isArrayLike(e))return new h.ArrayLikeObservable(e,r)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")},t.prototype._subscribe=function(e){var t=this.ish,r=this.scheduler;return null==r?t[d.observable]().subscribe(e):t[d.observable]().subscribe(new f.ObserveOnSubscriber(e,r,0))},t}(p.Observable);r.FromObservable=m},{"../Observable":29,"../operator/observeOn":131,"../symbol/iterator":158,"../symbol/observable":159,"../util/isArray":168,"../util/isArrayLike":169,"../util/isPromise":174,"./ArrayLikeObservable":87,"./ArrayObservable":88,"./IteratorObservable":95,"./PromiseObservable":96}],95:[function(e,t,r){"use strict";function n(e){var t=e[h.iterator];if(!t&&"string"==typeof e)return new p(e);if(!t&&void 0!==e.length)return new f(e);if(!t)throw new TypeError("object is not iterable");return e[h.iterator]()}function i(e){var t=+e.length;return isNaN(t)?0:0!==t&&o(t)?(t=a(t)*Math.floor(Math.abs(t)))<=0?0:t>d?d:t:t}function o(e){return"number"==typeof e&&c.root.isFinite(e)}function a(e){var t=+e;return 0===t?t:isNaN(t)?t:t<0?-1:1}var s=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},c=e("../util/root"),u=e("../Observable"),h=e("../symbol/iterator"),l=function(e){function t(t,r){if(e.call(this),this.scheduler=r,null==t)throw new Error("iterator cannot be null.");this.iterator=n(t)}return s(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.index,r=e.hasError,n=e.iterator,i=e.subscriber;if(r)i.error(e.error);else{var o=n.next();o.done?i.complete():(i.next(o.value),e.index=t+1,i.closed?"function"==typeof n.return&&n.return():this.schedule(e))}},t.prototype._subscribe=function(e){var r=this,n=r.iterator,i=r.scheduler;if(i)return i.schedule(t.dispatch,0,{index:0,iterator:n,subscriber:e});for(;;){var o=n.next();if(o.done){e.complete();break}if(e.next(o.value),e.closed){"function"==typeof n.return&&n.return();break}}},t}(u.Observable);r.IteratorObservable=l;var p=function(){function e(e,t,r){void 0===t&&(t=0),void 0===r&&(r=e.length),this.str=e,this.idx=t,this.len=r}return e.prototype[h.iterator]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.str.charAt(this.idx++)}:{done:!0,value:void 0}},e}(),f=function(){function e(e,t,r){void 0===t&&(t=0),void 0===r&&(r=i(e)),this.arr=e,this.idx=t,this.len=r}return e.prototype[h.iterator]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.arr[this.idx++]}:{done:!0,value:void 0}},e}(),d=Math.pow(2,53)-1},{"../Observable":29,"../symbol/iterator":158,"../util/root":176}],96:[function(e,t,r){"use strict";function n(e){var t=e.value,r=e.subscriber;r.closed||(r.next(t),r.complete())}function i(e){var t=e.err,r=e.subscriber;r.closed||r.error(t)}var o=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},a=e("../util/root"),s=function(e){function t(t,r){e.call(this),this.promise=t,this.scheduler=r}return o(t,e),t.create=function(e,r){return new t(e,r)},t.prototype._subscribe=function(e){var t=this,r=this.promise,o=this.scheduler;if(null==o)this._isScalar?e.closed||(e.next(this.value),e.complete()):r.then(function(r){t.value=r,t._isScalar=!0,e.closed||(e.next(r),e.complete())},function(t){e.closed||e.error(t)}).then(null,function(e){a.root.setTimeout(function(){throw e})});else if(this._isScalar){if(!e.closed)return o.schedule(n,0,{value:this.value,subscriber:e})}else r.then(function(r){t.value=r,t._isScalar=!0,e.closed||e.add(o.schedule(n,0,{value:r,subscriber:e}))},function(t){e.closed||e.add(o.schedule(i,0,{err:t,subscriber:e}))}).then(null,function(e){a.root.setTimeout(function(){throw e})})},t}(e("../Observable").Observable);r.PromiseObservable=s},{"../Observable":29,"../util/root":176}],97:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.value=t,this.scheduler=r,this._isScalar=!0,r&&(this._isScalar=!1)}return n(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.done,r=e.value,n=e.subscriber;t?n.complete():(n.next(r),n.closed||(e.done=!0,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this.value,n=this.scheduler;if(n)return n.schedule(t.dispatch,0,{done:!1,value:r,subscriber:e});e.next(r),e.closed||e.complete()},t}(e("../Observable").Observable);r.ScalarObservable=i},{"../Observable":29}],98:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/isNumeric"),o=e("../Observable"),a=e("../scheduler/async"),s=e("../util/isScheduler"),c=e("../util/isDate"),u=function(e){function t(t,r,n){void 0===t&&(t=0),e.call(this),this.period=-1,this.dueTime=0,i.isNumeric(r)?this.period=Number(r)<1&&1||Number(r):s.isScheduler(r)&&(n=r),s.isScheduler(n)||(n=a.async),this.scheduler=n,this.dueTime=c.isDate(t)?+t-this.scheduler.now():t}return n(t,e),t.create=function(e,r,n){return void 0===e&&(e=0),new t(e,r,n)},t.dispatch=function(e){var t=e.index,r=e.period,n=e.subscriber,i=this;if(n.next(t),!n.closed){if(-1===r)return n.complete();e.index=t+1,i.schedule(e,r)}},t.prototype._subscribe=function(e){var r=this,n=r.period,i=r.dueTime;return r.scheduler.schedule(t.dispatch,i,{index:0,period:n,subscriber:e})},t}(o.Observable);r.TimerObservable=u},{"../Observable":29,"../scheduler/async":156,"../util/isDate":170,"../util/isNumeric":172,"../util/isScheduler":175}],99:[function(e,t,r){"use strict";var n=e("../util/isScheduler"),i=e("../util/isArray"),o=e("./ArrayObservable"),a=e("../operator/combineLatest");r.combineLatest=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=null,s=null;return n.isScheduler(e[e.length-1])&&(s=e.pop()),"function"==typeof e[e.length-1]&&(r=e.pop()),1===e.length&&i.isArray(e[0])&&(e=e[0]),new o.ArrayObservable(e,s).lift(new a.CombineLatestOperator(r))}},{"../operator/combineLatest":114,"../util/isArray":168,"../util/isScheduler":175,"./ArrayObservable":88}],100:[function(e,t,r){"use strict";var n=e("./DeferObservable");r.defer=n.DeferObservable.create},{"./DeferObservable":90}],101:[function(e,t,r){"use strict";var n=e("./EmptyObservable");r.empty=n.EmptyObservable.create},{"./EmptyObservable":91}],102:[function(e,t,r){"use strict";var n=e("./FromObservable");r.from=n.FromObservable.create},{"./FromObservable":94}],103:[function(e,t,r){"use strict";var n=e("./FromEventObservable");r.fromEvent=n.FromEventObservable.create},{"./FromEventObservable":93}],104:[function(e,t,r){"use strict";var n=e("./PromiseObservable");r.fromPromise=n.PromiseObservable.create},{"./PromiseObservable":96}],105:[function(e,t,r){"use strict";var n=e("../operator/merge");r.merge=n.mergeStatic},{"../operator/merge":127}],106:[function(e,t,r){"use strict";var n=e("./ArrayObservable");r.of=n.ArrayObservable.of},{"./ArrayObservable":88}],107:[function(e,t,r){"use strict";var n=e("./ErrorObservable");r._throw=n.ErrorObservable.create},{"./ErrorObservable":92}],108:[function(e,t,r){"use strict";var n=e("./TimerObservable");r.timer=n.TimerObservable.create},{"./TimerObservable":98}],109:[function(e,t,r){"use strict";var n=e("../operator/zip");r.zip=n.zipStatic},{"../operator/zip":150}],110:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.buffer=function(e){return this.lift(new a(e))};var a=function(){function e(e){this.closingNotifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.closingNotifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.buffer=[],this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype.notifyNext=function(e,t,r,n,i){var o=this.buffer;this.buffer=[],this.destination.next(o)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],111:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.bufferCount=function(e,t){return void 0===t&&(t=null),this.lift(new o(e,t))};var o=function(){function e(e,t){this.bufferSize=e,this.startBufferEvery=t,this.subscriberClass=t&&e!==t?s:a}return e.prototype.call=function(e,t){return t.subscribe(new this.subscriberClass(e,this.bufferSize,this.startBufferEvery))},e}(),a=function(e){function t(t,r){e.call(this,t),this.bufferSize=r,this.buffer=[]}return n(t,e),t.prototype._next=function(e){var t=this.buffer;t.push(e),t.length==this.bufferSize&&(this.destination.next(t),this.buffer=[])},t.prototype._complete=function(){var t=this.buffer;t.length>0&&this.destination.next(t),e.prototype._complete.call(this)},t}(i.Subscriber),s=function(e){function t(t,r,n){e.call(this,t),this.bufferSize=r,this.startBufferEvery=n,this.buffers=[],this.count=0}return n(t,e),t.prototype._next=function(e){var t=this,r=t.bufferSize,n=t.startBufferEvery,i=t.buffers,o=t.count;this.count++,o%n==0&&i.push([]);for(var a=i.length;a--;){var s=i[a];s.push(e),s.length===r&&(i.splice(a,1),this.destination.next(s))}},t.prototype._complete=function(){for(var t=this,r=t.buffers,n=t.destination;r.length>0;){var i=r.shift();i.length>0&&n.next(i)}e.prototype._complete.call(this)},t}(i.Subscriber)},{"../Subscriber":36}],112:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscription"),o=e("../util/tryCatch"),a=e("../util/errorObject"),s=e("../OuterSubscriber"),c=e("../util/subscribeToResult");r.bufferWhen=function(e){return this.lift(new u(e))};var u=function(){function e(e){this.closingSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new h(e,this.closingSelector))},e}(),h=function(e){function t(t,r){e.call(this,t),this.closingSelector=r,this.subscribing=!1,this.openBuffer()}return n(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype._complete=function(){var t=this.buffer;t&&this.destination.next(t),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.buffer=null,this.subscribing=!1},t.prototype.notifyNext=function(e,t,r,n,i){this.openBuffer()},t.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()},t.prototype.openBuffer=function(){var e=this.closingSubscription;e&&(this.remove(e),e.unsubscribe());var t=this.buffer;this.buffer&&this.destination.next(t),this.buffer=[];var r=o.tryCatch(this.closingSelector)();r===a.errorObject?this.error(a.errorObject.e):(e=new i.Subscription,this.closingSubscription=e,this.add(e),this.subscribing=!0,e.add(c.subscribeToResult(this,r)),this.subscribing=!1)},t}(s.OuterSubscriber)},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],113:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r._catch=function(e){var t=new a(e),r=this.lift(t);return t.caught=r};var a=function(){function e(e){this.selector=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.selector,this.caught))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.selector=r,this.caught=n}return n(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=void 0;try{r=this.selector(t,this.caught)}catch(t){return void e.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(o.subscribeToResult(this,r))}},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],114:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../observable/ArrayObservable"),o=e("../util/isArray"),a=e("../OuterSubscriber"),s=e("../util/subscribeToResult"),c={};r.combineLatest=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=null;return"function"==typeof e[e.length-1]&&(r=e.pop()),1===e.length&&o.isArray(e[0])&&(e=e[0].slice()),e.unshift(this),this.lift.call(new i.ArrayObservable(e),new u(r))};var u=function(){function e(e){this.project=e}return e.prototype.call=function(e,t){return t.subscribe(new h(e,this.project))},e}();r.CombineLatestOperator=u;var h=function(e){function t(t,r){e.call(this,t),this.project=r,this.active=0,this.values=[],this.observables=[]}return n(t,e),t.prototype._next=function(e){this.values.push(c),this.observables.push(e)},t.prototype._complete=function(){var e=this.observables,t=e.length;if(0===t)this.destination.complete();else{this.active=t,this.toRespond=t;for(var r=0;r<t;r++){var n=e[r];this.add(s.subscribeToResult(this,n,n,r))}}},t.prototype.notifyComplete=function(e){0==(this.active-=1)&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){var o=this.values,a=o[r],s=this.toRespond?a===c?--this.toRespond:this.toRespond:0;o[r]=t,0===s&&(this.project?this._tryProject(o):this.destination.next(o.slice()))},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(a.OuterSubscriber);r.CombineLatestSubscriber=h},{"../OuterSubscriber":31,"../observable/ArrayObservable":88,"../util/isArray":168,"../util/subscribeToResult":177}],115:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=null,n=e;return o.isScheduler(n[e.length-1])&&(r=n.pop()),null===r&&1===e.length&&e[0]instanceof i.Observable?e[0]:new a.ArrayObservable(e,r).lift(new s.MergeAllOperator(1))}var i=e("../Observable"),o=e("../util/isScheduler"),a=e("../observable/ArrayObservable"),s=e("./mergeAll");r.concat=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return this.lift.call(n.apply(void 0,[this].concat(e)))},r.concatStatic=n},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],116:[function(e,t,r){"use strict";function n(e){e.debouncedNext()}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../Subscriber"),a=e("../scheduler/async");r.debounceTime=function(e,t){return void 0===t&&(t=a.async),this.lift(new s(e,t))};var s=function(){function e(e,t){this.dueTime=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.dueTime,this.scheduler))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.dueTime=r,this.scheduler=n,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}return i(t,e),t.prototype._next=function(e){this.clearDebounce(),this.lastValue=e,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(n,this.dueTime,this))},t.prototype._complete=function(){this.debouncedNext(),this.destination.complete()},t.prototype.debouncedNext=function(){this.clearDebounce(),this.hasValue&&(this.destination.next(this.lastValue),this.lastValue=null,this.hasValue=!1)},t.prototype.clearDebounce=function(){var e=this.debouncedSubscription;null!==e&&(this.remove(e),e.unsubscribe(),this.debouncedSubscription=null)},t}(o.Subscriber)},{"../Subscriber":36,"../scheduler/async":156}],117:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../scheduler/async"),o=e("../util/isDate"),a=e("../Subscriber"),s=e("../Notification");r.delay=function(e,t){void 0===t&&(t=i.async);var r=o.isDate(e)?+e-t.now():Math.abs(e);return this.lift(new c(r,t))};var c=function(){function e(e,t){this.delay=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.delay,this.scheduler))},e}(),u=function(e){function t(t,r,n){e.call(this,t),this.delay=r,this.scheduler=n,this.queue=[],this.active=!1,this.errored=!1}return n(t,e),t.dispatch=function(e){for(var t=e.source,r=t.queue,n=e.scheduler,i=e.destination;r.length>0&&r[0].time-n.now()<=0;)r.shift().notification.observe(i);if(r.length>0){var o=Math.max(0,r[0].time-n.now());this.schedule(e,o)}else t.active=!1},t.prototype._schedule=function(e){this.active=!0,this.add(e.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:e}))},t.prototype.scheduleNotification=function(e){if(!0!==this.errored){var t=this.scheduler,r=new h(t.now()+this.delay,e);this.queue.push(r),!1===this.active&&this._schedule(t)}},t.prototype._next=function(e){this.scheduleNotification(s.Notification.createNext(e))},t.prototype._error=function(e){this.errored=!0,this.queue=[],this.destination.error(e)},t.prototype._complete=function(){this.scheduleNotification(s.Notification.createComplete())},t}(a.Subscriber),h=function(){return function(e,t){this.time=e,this.notification=t}}()},{"../Notification":28,"../Subscriber":36,"../scheduler/async":156,"../util/isDate":170}],118:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult"),a=e("../util/Set");r.distinct=function(e,t){return this.lift(new s(e,t))};var s=function(){function e(e,t){this.keySelector=e,this.flushes=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.keySelector,this.flushes))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.keySelector=r,this.values=new a.Set,n&&this.add(o.subscribeToResult(this,n))}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.values.clear()},t.prototype.notifyError=function(e,t){this._error(e)},t.prototype._next=function(e){this.keySelector?this._useKeySelector(e):this._finalizeNext(e,e)},t.prototype._useKeySelector=function(e){var t,r=this.destination;try{t=this.keySelector(e)}catch(e){return void r.error(e)}this._finalizeNext(t,e)},t.prototype._finalizeNext=function(e,t){var r=this.values;r.has(e)||(r.add(e),this.destination.next(t))},t}(i.OuterSubscriber);r.DistinctSubscriber=c},{"../OuterSubscriber":31,"../util/Set":165,"../util/subscribeToResult":177}],119:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/tryCatch"),a=e("../util/errorObject");r.distinctUntilChanged=function(e,t){return this.lift(new s(e,t))};var s=function(){function e(e,t){this.compare=e,this.keySelector=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.compare,this.keySelector))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.keySelector=n,this.hasKey=!1,"function"==typeof r&&(this.compare=r)}return n(t,e),t.prototype.compare=function(e,t){return e===t},t.prototype._next=function(e){var t=e;if(this.keySelector&&(t=o.tryCatch(this.keySelector)(e))===a.errorObject)return this.destination.error(a.errorObject.e);var r=!1;if(this.hasKey){if((r=o.tryCatch(this.compare)(this.key,t))===a.errorObject)return this.destination.error(a.errorObject.e)}else this.hasKey=!0;!1===Boolean(r)&&(this.key=t,this.destination.next(e))},t}(i.Subscriber)},{"../Subscriber":36,"../util/errorObject":167,"../util/tryCatch":179}],120:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r._do=function(e,t,r){return this.lift(new o(e,t,r))};var o=function(){function e(e,t,r){this.nextOrObserver=e,this.error=t,this.complete=r}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.nextOrObserver,this.error,this.complete))},e}(),a=function(e){function t(t,r,n,o){e.call(this,t);var a=new i.Subscriber(r,n,o);a.syncErrorThrowable=!0,this.add(a),this.safeSubscriber=a}return n(t,e),t.prototype._next=function(e){var t=this.safeSubscriber;t.next(e),t.syncErrorThrown?this.destination.error(t.syncErrorValue):this.destination.next(e)},t.prototype._error=function(e){var t=this.safeSubscriber;t.error(e),t.syncErrorThrown?this.destination.error(t.syncErrorValue):this.destination.error(e)},t.prototype._complete=function(){var e=this.safeSubscriber;e.complete(),e.syncErrorThrown?this.destination.error(e.syncErrorValue):this.destination.complete()},t}(i.Subscriber)},{"../Subscriber":36}],121:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/tryCatch"),o=e("../util/errorObject"),a=e("../OuterSubscriber"),s=e("../util/subscribeToResult");r.expand=function(e,t,r){return void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=void 0),t=(t||0)<1?Number.POSITIVE_INFINITY:t,this.lift(new c(e,t,r))};var c=function(){function e(e,t,r){this.project=e,this.concurrent=t,this.scheduler=r}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.project,this.concurrent,this.scheduler))},e}();r.ExpandOperator=c;var u=function(e){function t(t,r,n,i){e.call(this,t),this.project=r,this.concurrent=n,this.scheduler=i,this.index=0,this.active=0,this.hasCompleted=!1,n<Number.POSITIVE_INFINITY&&(this.buffer=[])}return n(t,e),t.dispatch=function(e){var t=e.subscriber,r=e.result,n=e.value,i=e.index;t.subscribeToProjection(r,n,i)},t.prototype._next=function(e){var r=this.destination;if(r.closed)this._complete();else{var n=this.index++;if(this.active<this.concurrent){r.next(e);var a=i.tryCatch(this.project)(e,n);if(a===o.errorObject)r.error(o.errorObject.e);else if(this.scheduler){var s={subscriber:this,result:a,value:e,index:n};this.add(this.scheduler.schedule(t.dispatch,0,s))}else this.subscribeToProjection(a,e,n)}else this.buffer.push(e)}},t.prototype.subscribeToProjection=function(e,t,r){this.active++,this.add(s.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){this.hasCompleted=!0,this.hasCompleted&&0===this.active&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this._next(t)},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t&&t.length>0&&this._next(t.shift()),this.hasCompleted&&0===this.active&&this.destination.complete()},t}(a.OuterSubscriber);r.ExpandSubscriber=u},{"../OuterSubscriber":31,"../util/errorObject":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],122:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.filter=function(e,t){return this.lift(new o(e,t))};var o=function(){function e(e,t){this.predicate=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate,this.thisArg))},e}(),a=function(e){function t(t,r,n){e.call(this,t),this.predicate=r,this.thisArg=n,this.count=0,this.predicate=r}return n(t,e),t.prototype._next=function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}t&&this.destination.next(e)},t}(i.Subscriber)},{"../Subscriber":36}],123:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../Subscription");r._finally=function(e){return this.lift(new a(e))};var a=function(){function e(e){this.callback=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.callback))},e}(),s=function(e){function t(t,r){e.call(this,t),this.add(new o.Subscription(r))}return n(t,e),t}(i.Subscriber)},{"../Subscriber":36,"../Subscription":37}],124:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/EmptyError");r.first=function(e,t,r){return this.lift(new a(e,t,r,this))};var a=function(){function e(e,t,r,n){this.predicate=e,this.resultSelector=t,this.defaultValue=r,this.source=n}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.predicate,this.resultSelector,this.defaultValue,this.source))},e}(),s=function(e){function t(t,r,n,i,o){e.call(this,t),this.predicate=r,this.resultSelector=n,this.defaultValue=i,this.source=o,this.index=0,this.hasCompleted=!1,this._emitted=!1}return n(t,e),t.prototype._next=function(e){var t=this.index++;this.predicate?this._tryPredicate(e,t):this._emit(e,t)},t.prototype._tryPredicate=function(e,t){var r;try{r=this.predicate(e,t,this.source)}catch(e){return void this.destination.error(e)}r&&this._emit(e,t)},t.prototype._emit=function(e,t){this.resultSelector?this._tryResultSelector(e,t):this._emitFinal(e)},t.prototype._tryResultSelector=function(e,t){var r;try{r=this.resultSelector(e,t)}catch(e){return void this.destination.error(e)}this._emitFinal(r)},t.prototype._emitFinal=function(e){var t=this.destination;this._emitted||(this._emitted=!0,t.next(e),t.complete(),this.hasCompleted=!0)},t.prototype._complete=function(){var e=this.destination;this.hasCompleted||void 0===this.defaultValue?this.hasCompleted||e.error(new o.EmptyError):(e.next(this.defaultValue),e.complete())},t}(i.Subscriber)},{"../Subscriber":36,"../util/EmptyError":163}],125:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/EmptyError");r.last=function(e,t,r){return this.lift(new a(e,t,r,this))};var a=function(){function e(e,t,r,n){this.predicate=e,this.resultSelector=t,this.defaultValue=r,this.source=n}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.predicate,this.resultSelector,this.defaultValue,this.source))},e}(),s=function(e){function t(t,r,n,i,o){e.call(this,t),this.predicate=r,this.resultSelector=n,this.defaultValue=i,this.source=o,this.hasValue=!1,this.index=0,void 0!==i&&(this.lastValue=i,this.hasValue=!0)}return n(t,e),t.prototype._next=function(e){var t=this.index++;if(this.predicate)this._tryPredicate(e,t);else{if(this.resultSelector)return void this._tryResultSelector(e,t);this.lastValue=e,this.hasValue=!0}},t.prototype._tryPredicate=function(e,t){var r;try{r=this.predicate(e,t,this.source)}catch(e){return void this.destination.error(e)}if(r){if(this.resultSelector)return void this._tryResultSelector(e,t);this.lastValue=e,this.hasValue=!0}},t.prototype._tryResultSelector=function(e,t){var r;try{r=this.resultSelector(e,t)}catch(e){return void this.destination.error(e)}this.lastValue=r,this.hasValue=!0},t.prototype._complete=function(){var e=this.destination;this.hasValue?(e.next(this.lastValue),e.complete()):e.error(new o.EmptyError)},t}(i.Subscriber)},{"../Subscriber":36,"../util/EmptyError":163}],126:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.map=function(e,t){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return this.lift(new o(e,t))};var o=function(){function e(e,t){this.project=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.project,this.thisArg))},e}();r.MapOperator=o;var a=function(e){function t(t,r,n){e.call(this,t),this.project=r,this.count=0,this.thisArg=n||this}return n(t,e),t.prototype._next=function(e){var t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.Subscriber)},{"../Subscriber":36}],127:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=Number.POSITIVE_INFINITY,n=null,c=e[e.length-1];return s.isScheduler(c)?(n=e.pop(),e.length>1&&"number"==typeof e[e.length-1]&&(r=e.pop())):"number"==typeof c&&(r=e.pop()),null===n&&1===e.length&&e[0]instanceof i.Observable?e[0]:new o.ArrayObservable(e,n).lift(new a.MergeAllOperator(r))}var i=e("../Observable"),o=e("../observable/ArrayObservable"),a=e("./mergeAll"),s=e("../util/isScheduler");r.merge=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return this.lift.call(n.apply(void 0,[this].concat(e)))},r.mergeStatic=n},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],128:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.mergeAll=function(e){return void 0===e&&(e=Number.POSITIVE_INFINITY),this.lift(new a(e))};var a=function(){function e(e){this.concurrent=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.concurrent))},e}();r.MergeAllOperator=a;var s=function(e){function t(t,r){e.call(this,t),this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0}return n(t,e),t.prototype._next=function(e){this.active<this.concurrent?(this.active++,this.add(o.subscribeToResult(this,e))):this.buffer.push(e)},t.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t.length>0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(i.OuterSubscriber);r.MergeAllSubscriber=s},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],129:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/subscribeToResult"),o=e("../OuterSubscriber");r.mergeMap=function(e,t,r){return void 0===r&&(r=Number.POSITIVE_INFINITY),"number"==typeof t&&(r=t,t=null),this.lift(new a(e,t,r))};var a=function(){function e(e,t,r){void 0===r&&(r=Number.POSITIVE_INFINITY),this.project=e,this.resultSelector=t,this.concurrent=r}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.project,this.resultSelector,this.concurrent))},e}();r.MergeMapOperator=a;var s=function(e){function t(t,r,n,i){void 0===i&&(i=Number.POSITIVE_INFINITY),e.call(this,t),this.project=r,this.resultSelector=n,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return n(t,e),t.prototype._next=function(e){this.active<this.concurrent?this._tryNext(e):this.buffer.push(e)},t.prototype._tryNext=function(e){var t,r=this.index++;try{t=this.project(e,r)}catch(e){return void this.destination.error(e)}this.active++,this._innerSub(t,e,r)},t.prototype._innerSub=function(e,t,r){this.add(i.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this.resultSelector?this._notifyResultSelector(e,t,r,n):this.destination.next(t)},t.prototype._notifyResultSelector=function(e,t,r,n){var i;try{i=this.resultSelector(e,t,r,n)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t.length>0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(o.OuterSubscriber);r.MergeMapSubscriber=s},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],130:[function(e,t,r){"use strict";var n=e("../observable/ConnectableObservable");r.multicast=function(e,t){var r;if(r="function"==typeof e?e:function(){return e},"function"==typeof t)return this.lift(new i(r,t));var o=Object.create(this,n.connectableObservableDescriptor);return o.source=this,o.subjectFactory=r,o};var i=function(){function e(e,t){this.subjectFactory=e,this.selector=t}return e.prototype.call=function(e,t){var r=this.selector,n=this.subjectFactory(),i=r(n).subscribe(e);return i.add(t.subscribe(n)),i},e}();r.MulticastOperator=i},{"../observable/ConnectableObservable":89}],131:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../Notification");r.observeOn=function(e,t){return void 0===t&&(t=0),this.lift(new a(e,t))};var a=function(){function e(e,t){void 0===t&&(t=0),this.scheduler=e,this.delay=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.scheduler,this.delay))},e}();r.ObserveOnOperator=a;var s=function(e){function t(t,r,n){void 0===n&&(n=0),e.call(this,t),this.scheduler=r,this.delay=n}return n(t,e),t.dispatch=function(e){var t=e.notification,r=e.destination;t.observe(r),this.unsubscribe()},t.prototype.scheduleMessage=function(e){this.add(this.scheduler.schedule(t.dispatch,this.delay,new c(e,this.destination)))},t.prototype._next=function(e){this.scheduleMessage(o.Notification.createNext(e))},t.prototype._error=function(e){this.scheduleMessage(o.Notification.createError(e))},t.prototype._complete=function(){this.scheduleMessage(o.Notification.createComplete())},t}(i.Subscriber);r.ObserveOnSubscriber=s;var c=function(){return function(e,t){this.notification=e,this.destination=t}}();r.ObserveOnMessage=c},{"../Notification":28,"../Subscriber":36}],132:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.pairwise=function(){return this.lift(new o)};var o=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new a(e))},e}(),a=function(e){function t(t){e.call(this,t),this.hasPrev=!1}return n(t,e),t.prototype._next=function(e){this.hasPrev?this.destination.next([this.prev,e]):this.hasPrev=!0,this.prev=e},t}(i.Subscriber)},{"../Subscriber":36}],133:[function(e,t,r){"use strict";function n(e,t){return function(r){for(var n=r,i=0;i<t;i++){var o=n[e[i]];if(void 0===o)return;n=o}return n}}var i=e("./map");r.pluck=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=e.length;if(0===r)throw new Error("list of properties cannot be empty.");return i.map.call(this,n(e,r))}},{"./map":126}],134:[function(e,t,r){"use strict";var n=e("../Subject"),i=e("./multicast");r.publish=function(e){return e?i.multicast.call(this,function(){return new n.Subject},e):i.multicast.call(this,new n.Subject)}},{"../Subject":34,"./multicast":130}],135:[function(e,t,r){"use strict";var n=e("../ReplaySubject"),i=e("./multicast");r.publishReplay=function(e,t,r){return void 0===e&&(e=Number.POSITIVE_INFINITY),void 0===t&&(t=Number.POSITIVE_INFINITY),i.multicast.call(this,new n.ReplaySubject(e,t,r))}},{"../ReplaySubject":32,"./multicast":130}],136:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.sample=function(e){return this.lift(new a(e))};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){var r=new s(e),n=t.subscribe(r);return n.add(o.subscribeToResult(r,this.notifier)),n},e}(),s=function(e){function t(){e.apply(this,arguments),this.hasValue=!1}return n(t,e),t.prototype._next=function(e){this.value=e,this.hasValue=!0},t.prototype.notifyNext=function(e,t,r,n,i){this.emitValue()},t.prototype.notifyComplete=function(){this.emitValue()},t.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],137:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.scan=function(e,t){var r=!1;return arguments.length>=2&&(r=!0),this.lift(new o(e,t,r))};var o=function(){function e(e,t,r){void 0===r&&(r=!1),this.accumulator=e,this.seed=t,this.hasSeed=r}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.accumulator,this.seed,this.hasSeed))},e}(),a=function(e){function t(t,r,n,i){e.call(this,t),this.accumulator=r,this._seed=n,this.hasSeed=i,this.index=0}return n(t,e),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e},enumerable:!0,configurable:!0}),t.prototype._next=function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)},t.prototype._tryNext=function(e){var t,r=this.index++;try{t=this.accumulator(this.seed,e,r)}catch(e){this.destination.error(e)}this.seed=t,this.destination.next(t)},t}(i.Subscriber)},{"../Subscriber":36}],138:[function(e,t,r){"use strict";function n(){return new o.Subject}var i=e("./multicast"),o=e("../Subject");r.share=function(){return i.multicast.call(this,n).refCount()}},{"../Subject":34,"./multicast":130}],139:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.skip=function(e){return this.lift(new o(e))};var o=function(){function e(e){this.total=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.total))},e}(),a=function(e){function t(t,r){e.call(this,t),this.total=r,this.count=0}return n(t,e),t.prototype._next=function(e){++this.count>this.total&&this.destination.next(e)},t}(i.Subscriber)},{"../Subscriber":36}],140:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.skipUntil=function(e){return this.lift(new a(e))};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.notifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.hasValue=!1,this.isInnerStopped=!1,this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype._next=function(t){this.hasValue&&e.prototype._next.call(this,t)},t.prototype._complete=function(){this.isInnerStopped?e.prototype._complete.call(this):this.unsubscribe()},t.prototype.notifyNext=function(e,t,r,n,i){this.hasValue=!0},t.prototype.notifyComplete=function(){this.isInnerStopped=!0,this.isStopped&&e.prototype._complete.call(this)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],141:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.skipWhile=function(e){return this.lift(new o(e))};var o=function(){function e(e){this.predicate=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate))},e}(),a=function(e){function t(t,r){e.call(this,t),this.predicate=r,this.skipping=!0,this.index=0}return n(t,e),t.prototype._next=function(e){var t=this.destination;this.skipping&&this.tryCallPredicate(e),this.skipping||t.next(e)},t.prototype.tryCallPredicate=function(e){try{var t=this.predicate(e,this.index++);this.skipping=Boolean(t)}catch(e){this.destination.error(e)}},t}(i.Subscriber)},{"../Subscriber":36}],142:[function(e,t,r){"use strict";var n=e("../observable/ArrayObservable"),i=e("../observable/ScalarObservable"),o=e("../observable/EmptyObservable"),a=e("./concat"),s=e("../util/isScheduler");r.startWith=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=e[e.length-1];s.isScheduler(r)?e.pop():r=null;var c=e.length;return 1===c?a.concatStatic(new i.ScalarObservable(e[0],r),this):c>1?a.concatStatic(new n.ArrayObservable(e,r),this):a.concatStatic(new o.EmptyObservable(r),this)}},{"../observable/ArrayObservable":88,"../observable/EmptyObservable":91,"../observable/ScalarObservable":97,"../util/isScheduler":175,"./concat":115}],143:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.switchMap=function(e,t){return this.lift(new a(e,t))};var a=function(){function e(e,t){this.project=e,this.resultSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.project,this.resultSelector))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.project=r,this.resultSelector=n,this.index=0}return n(t,e),t.prototype._next=function(e){var t,r=this.index++;try{t=this.project(e,r)}catch(e){return void this.destination.error(e)}this._innerSub(t,e,r)},t.prototype._innerSub=function(e,t,r){var n=this.innerSubscription;n&&n.unsubscribe(),this.add(this.innerSubscription=o.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&e.prototype._complete.call(this)},t.prototype.notifyNext=function(e,t,r,n,i){this.resultSelector?this._tryNotifyNext(e,t,r,n):this.destination.next(t)},t.prototype._tryNotifyNext=function(e,t,r,n){var i;try{i=this.resultSelector(e,t,r,n)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],144:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/ArgumentOutOfRangeError"),a=e("../observable/EmptyObservable");r.take=function(e){return 0===e?new a.EmptyObservable:this.lift(new s(e))};var s=function(){function e(e){if(this.total=e,this.total<0)throw new o.ArgumentOutOfRangeError}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.total))},e}(),c=function(e){function t(t,r){e.call(this,t),this.total=r,this.count=0}return n(t,e),t.prototype._next=function(e){var t=this.total,r=++this.count;r<=t&&(this.destination.next(e),r===t&&(this.destination.complete(),this.unsubscribe()))},t}(i.Subscriber)},{"../Subscriber":36,"../observable/EmptyObservable":91,"../util/ArgumentOutOfRangeError":162}],145:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.takeUntil=function(e){return this.lift(new a(e))};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.notifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.notifier=r,this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.complete()},t.prototype.notifyComplete=function(){},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],146:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.takeWhile=function(e){return this.lift(new o(e))};var o=function(){function e(e){this.predicate=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate))},e}(),a=function(e){function t(t,r){e.call(this,t),this.predicate=r,this.index=0}return n(t,e),t.prototype._next=function(e){var t,r=this.destination;try{t=this.predicate(e,this.index++)}catch(e){return void r.error(e)}this.nextOrComplete(e,t)},t.prototype.nextOrComplete=function(e,t){var r=this.destination;Boolean(t)?r.next(e):r.complete()},t}(i.Subscriber)},{"../Subscriber":36}],147:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.defaultThrottleConfig={leading:!0,trailing:!1},r.throttle=function(e,t){return void 0===t&&(t=r.defaultThrottleConfig),this.lift(new a(e,t.leading,t.trailing))};var a=function(){function e(e,t,r){this.durationSelector=e,this.leading=t,this.trailing=r}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.durationSelector,this.leading,this.trailing))},e}(),s=function(e){function t(t,r,n,i){e.call(this,t),this.destination=t,this.durationSelector=r,this._leading=n,this._trailing=i,this._hasTrailingValue=!1}return n(t,e),t.prototype._next=function(e){if(this.throttled)this._trailing&&(this._hasTrailingValue=!0,this._trailingValue=e);else{var t=this.tryDurationSelector(e);t&&this.add(this.throttled=o.subscribeToResult(this,t)),this._leading&&(this.destination.next(e),this._trailing&&(this._hasTrailingValue=!0,this._trailingValue=e))}},t.prototype.tryDurationSelector=function(e){try{return this.durationSelector(e)}catch(e){return this.destination.error(e),null}},t.prototype._unsubscribe=function(){var e=this,t=e.throttled;e._trailingValue,e._hasTrailingValue,e._trailing;this._trailingValue=null,this._hasTrailingValue=!1,t&&(this.remove(t),this.throttled=null,t.unsubscribe())},t.prototype._sendTrailing=function(){var e=this,t=e.destination,r=e.throttled,n=e._trailing,i=e._trailingValue,o=e._hasTrailingValue;r&&n&&o&&(t.next(i),this._trailingValue=null,this._hasTrailingValue=!1)},t.prototype.notifyNext=function(e,t,r,n,i){this._sendTrailing(),this._unsubscribe()},t.prototype.notifyComplete=function(){this._sendTrailing(),this._unsubscribe()},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],148:[function(e,t,r){"use strict";function n(e){e.subscriber.clearThrottle()}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../Subscriber"),a=e("../scheduler/async"),s=e("./throttle");r.throttleTime=function(e,t,r){return void 0===t&&(t=a.async),void 0===r&&(r=s.defaultThrottleConfig),this.lift(new c(e,t,r.leading,r.trailing))};var c=function(){function e(e,t,r,n){this.duration=e,this.scheduler=t,this.leading=r,this.trailing=n}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.duration,this.scheduler,this.leading,this.trailing))},e}(),u=function(e){function t(t,r,n,i,o){e.call(this,t),this.duration=r,this.scheduler=n,this.leading=i,this.trailing=o,this._hasTrailingValue=!1,this._trailingValue=null}return i(t,e),t.prototype._next=function(e){this.throttled?this.trailing&&(this._trailingValue=e,this._hasTrailingValue=!0):(this.add(this.throttled=this.scheduler.schedule(n,this.duration,{subscriber:this})),this.leading&&this.destination.next(e))},t.prototype.clearThrottle=function(){var e=this.throttled;e&&(this.trailing&&this._hasTrailingValue&&(this.destination.next(this._trailingValue),this._trailingValue=null,this._hasTrailingValue=!1),e.unsubscribe(),this.remove(e),this.throttled=null)},t}(o.Subscriber)},{"../Subscriber":36,"../scheduler/async":156,"./throttle":147}],149:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.withLatestFrom=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r;"function"==typeof e[e.length-1]&&(r=e.pop());var n=e;return this.lift(new a(n,r))};var a=function(){function e(e,t){this.observables=e,this.project=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.observables,this.project))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.observables=r,this.project=n,this.toRespond=[];var i=r.length;this.values=new Array(i);for(a=0;a<i;a++)this.toRespond.push(a);for(var a=0;a<i;a++){var s=r[a];this.add(o.subscribeToResult(this,s,s,a))}}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.values[r]=t;var o=this.toRespond;if(o.length>0){var a=o.indexOf(r);-1!==a&&o.splice(a,1)}},t.prototype.notifyComplete=function(){},t.prototype._next=function(e){if(0===this.toRespond.length){var t=[e].concat(this.values);this.project?this._tryProject(t):this.destination.next(t)}},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],150:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=e[e.length-1];return"function"==typeof r&&e.pop(),new o.ArrayObservable(e).lift(new l(r))}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../observable/ArrayObservable"),a=e("../util/isArray"),s=e("../Subscriber"),c=e("../OuterSubscriber"),u=e("../util/subscribeToResult"),h=e("../symbol/iterator");r.zipProto=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return this.lift.call(n.apply(void 0,[this].concat(e)))},r.zipStatic=n;var l=function(){function e(e){this.project=e}return e.prototype.call=function(e,t){return t.subscribe(new p(e,this.project))},e}();r.ZipOperator=l;var p=function(e){function t(t,r,n){void 0===n&&(n=Object.create(null)),e.call(this,t),this.iterators=[],this.active=0,this.project="function"==typeof r?r:null,this.values=n}return i(t,e),t.prototype._next=function(e){var t=this.iterators;a.isArray(e)?t.push(new d(e)):"function"==typeof e[h.iterator]?t.push(new f(e[h.iterator]())):t.push(new m(this.destination,this,e))},t.prototype._complete=function(){var e=this.iterators,t=e.length;if(0!==t){this.active=t;for(var r=0;r<t;r++){var n=e[r];n.stillUnsubscribed?this.add(n.subscribe(n,r)):this.active--}}else this.destination.complete()},t.prototype.notifyInactive=function(){0===--this.active&&this.destination.complete()},t.prototype.checkIterators=function(){for(var e=this.iterators,t=e.length,r=this.destination,n=0;n<t;n++)if("function"==typeof(a=e[n]).hasValue&&!a.hasValue())return;for(var i=!1,o=[],n=0;n<t;n++){var a=e[n],s=a.next();if(a.hasCompleted()&&(i=!0),s.done)return void r.complete();o.push(s.value)}this.project?this._tryProject(o):r.next(o),i&&r.complete()},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(s.Subscriber);r.ZipSubscriber=p;var f=function(){function e(e){this.iterator=e,this.nextResult=e.next()}return e.prototype.hasValue=function(){return!0},e.prototype.next=function(){var e=this.nextResult;return this.nextResult=this.iterator.next(),e},e.prototype.hasCompleted=function(){var e=this.nextResult;return e&&e.done},e}(),d=function(){function e(e){this.array=e,this.index=0,this.length=0,this.length=e.length}return e.prototype[h.iterator]=function(){return this},e.prototype.next=function(e){var t=this.index++,r=this.array;return t<this.length?{value:r[t],done:!1}:{value:null,done:!0}},e.prototype.hasValue=function(){return this.array.length>this.index},e.prototype.hasCompleted=function(){return this.array.length===this.index},e}(),m=function(e){function t(t,r,n){e.call(this,t),this.parent=r,this.observable=n,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return i(t,e),t.prototype[h.iterator]=function(){return this},t.prototype.next=function(){var e=this.buffer;return 0===e.length&&this.isComplete?{value:null,done:!0}:{value:e.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(e,t){return u.subscribeToResult(this,this.observable,this,t)},t}(c.OuterSubscriber)},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":88,"../symbol/iterator":158,"../util/isArray":168,"../util/subscribeToResult":177}],151:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this)}return n(t,e),t.prototype.schedule=function(e,t){return void 0===t&&(t=0),this},t}(e("../Subscription").Subscription);r.Action=i},{"../Subscription":37}],152:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/root"),o=function(e){function t(t,r){e.call(this,t,r),this.scheduler=t,this.work=r,this.pending=!1}return n(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e,this.pending=!0;var r=this.id,n=this.scheduler;return null!=r&&(this.id=this.recycleAsyncId(n,r,t)),this.delay=t,this.id=this.id||this.requestAsyncId(n,this.id,t),this},t.prototype.requestAsyncId=function(e,t,r){return void 0===r&&(r=0),i.root.setInterval(e.flush.bind(e,this),r)},t.prototype.recycleAsyncId=function(e,t,r){return void 0===r&&(r=0),null!==r&&this.delay===r&&!1===this.pending?t:i.root.clearInterval(t)&&void 0||void 0},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var r=this._execute(e,t);if(r)return r;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var r=!1,n=void 0;try{this.work(e)}catch(e){r=!0,n=!!e&&e||new Error(e)}if(r)return this.unsubscribe(),n},t.prototype._unsubscribe=function(){var e=this.id,t=this.scheduler,r=t.actions,n=r.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==n&&r.splice(n,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null},t}(e("./Action").Action);r.AsyncAction=o},{"../util/root":176,"./Action":151}],153:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return n(t,e),t.prototype.flush=function(e){var t=this.actions;if(this.active)t.push(e);else{var r;this.active=!0;do{if(r=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,r){for(;e=t.shift();)e.unsubscribe();throw r}}},t}(e("../Scheduler").Scheduler);r.AsyncScheduler=i},{"../Scheduler":33}],154:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this,t,r),this.scheduler=t,this.work=r}return n(t,e),t.prototype.schedule=function(t,r){return void 0===r&&(r=0),r>0?e.prototype.schedule.call(this,t,r):(this.delay=r,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,r){return r>0||this.closed?e.prototype.execute.call(this,t,r):this._execute(t,r)},t.prototype.requestAsyncId=function(t,r,n){return void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0?e.prototype.requestAsyncId.call(this,t,r,n):t.flush(this)},t}(e("./AsyncAction").AsyncAction);r.QueueAction=i},{"./AsyncAction":152}],155:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments)}return n(t,e),t}(e("./AsyncScheduler").AsyncScheduler);r.QueueScheduler=i},{"./AsyncScheduler":153}],156:[function(e,t,r){"use strict";var n=e("./AsyncAction"),i=e("./AsyncScheduler");r.async=new i.AsyncScheduler(n.AsyncAction)},{"./AsyncAction":152,"./AsyncScheduler":153}],157:[function(e,t,r){"use strict";var n=e("./QueueAction"),i=e("./QueueScheduler");r.queue=new i.QueueScheduler(n.QueueAction)},{"./QueueAction":154,"./QueueScheduler":155}],158:[function(e,t,r){"use strict";function n(e){var t=e.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var r=e.Set;if(r&&"function"==typeof(new r)["@@iterator"])return"@@iterator";var n=e.Map;if(n)for(var i=Object.getOwnPropertyNames(n.prototype),o=0;o<i.length;++o){var a=i[o];if("entries"!==a&&"size"!==a&&n.prototype[a]===n.prototype.entries)return a}return"@@iterator"}var i=e("../util/root");r.symbolIteratorPonyfill=n,r.iterator=n(i.root),r.$$iterator=r.iterator},{"../util/root":176}],159:[function(e,t,r){"use strict";function n(e){var t,r=e.Symbol;return"function"==typeof r?r.observable?t=r.observable:(t=r("observable"),r.observable=t):t="@@observable",t}var i=e("../util/root");r.getSymbolObservable=n,r.observable=n(i.root),r.$$observable=r.observable},{"../util/root":176}],160:[function(e,t,r){"use strict";var n=e("../util/root").root.Symbol;r.rxSubscriber="function"==typeof n&&"function"==typeof n.for?n.for("rxSubscriber"):"@@rxSubscriber",r.$$rxSubscriber=r.rxSubscriber},{"../util/root":176}],161:[function(e,t,r){"use strict";var n=e("./root"),i=function(){return function(e){e.requestAnimationFrame?(this.cancelAnimationFrame=e.cancelAnimationFrame.bind(e),this.requestAnimationFrame=e.requestAnimationFrame.bind(e)):e.mozRequestAnimationFrame?(this.cancelAnimationFrame=e.mozCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.mozRequestAnimationFrame.bind(e)):e.webkitRequestAnimationFrame?(this.cancelAnimationFrame=e.webkitCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.webkitRequestAnimationFrame.bind(e)):e.msRequestAnimationFrame?(this.cancelAnimationFrame=e.msCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.msRequestAnimationFrame.bind(e)):e.oRequestAnimationFrame?(this.cancelAnimationFrame=e.oCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.oRequestAnimationFrame.bind(e)):(this.cancelAnimationFrame=e.clearTimeout.bind(e),this.requestAnimationFrame=function(t){return e.setTimeout(t,1e3/60)})}}();r.RequestAnimationFrameDefinition=i,r.AnimationFrame=new i(n.root)},{"./root":176}],162:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.ArgumentOutOfRangeError=i},{}],163:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"no elements in sequence");this.name=t.name="EmptyError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.EmptyError=i},{}],164:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"object unsubscribed");this.name=t.name="ObjectUnsubscribedError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.ObjectUnsubscribedError=i},{}],165:[function(e,t,r){"use strict";function n(){return function(){function e(){this._values=[]}return e.prototype.add=function(e){this.has(e)||this._values.push(e)},e.prototype.has=function(e){return-1!==this._values.indexOf(e)},Object.defineProperty(e.prototype,"size",{get:function(){return this._values.length},enumerable:!0,configurable:!0}),e.prototype.clear=function(){this._values.length=0},e}()}var i=e("./root");r.minimalSetImpl=n,r.Set=i.root.Set||n()},{"./root":176}],166:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t){e.call(this),this.errors=t;var r=Error.call(this,t?t.length+" errors occurred during unsubscription:\n  "+t.map(function(e,t){return t+1+") "+e.toString()}).join("\n  "):"");this.name=r.name="UnsubscriptionError",this.stack=r.stack,this.message=r.message}return n(t,e),t}(Error);r.UnsubscriptionError=i},{}],167:[function(e,t,r){"use strict";r.errorObject={e:{}}},{}],168:[function(e,t,r){"use strict";r.isArray=Array.isArray||function(e){return e&&"number"==typeof e.length}},{}],169:[function(e,t,r){"use strict";r.isArrayLike=function(e){return e&&"number"==typeof e.length}},{}],170:[function(e,t,r){"use strict";r.isDate=function(e){return e instanceof Date&&!isNaN(+e)}},{}],171:[function(e,t,r){"use strict";r.isFunction=function(e){return"function"==typeof e}},{}],172:[function(e,t,r){"use strict";var n=e("../util/isArray");r.isNumeric=function(e){return!n.isArray(e)&&e-parseFloat(e)+1>=0}},{"../util/isArray":168}],173:[function(e,t,r){"use strict";r.isObject=function(e){return null!=e&&"object"==typeof e}},{}],174:[function(e,t,r){"use strict";r.isPromise=function(e){return e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}},{}],175:[function(e,t,r){"use strict";r.isScheduler=function(e){return e&&"function"==typeof e.schedule}},{}],176:[function(e,t,r){(function(e){"use strict";var t="undefined"!=typeof window&&window,n="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i=void 0!==e&&e,o=t||i||n;r.root=o,function(){if(!o)throw new Error("RxJS could not find any global context (window, self, global)")}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],177:[function(e,t,r){"use strict";var n=e("./root"),i=e("./isArrayLike"),o=e("./isPromise"),a=e("./isObject"),s=e("../Observable"),c=e("../symbol/iterator"),u=e("../InnerSubscriber"),h=e("../symbol/observable");r.subscribeToResult=function(e,t,r,l){var p=new u.InnerSubscriber(e,r,l);if(p.closed)return null;if(t instanceof s.Observable)return t._isScalar?(p.next(t.value),p.complete(),null):t.subscribe(p);if(i.isArrayLike(t)){for(var f=0,d=t.length;f<d&&!p.closed;f++)p.next(t[f]);p.closed||p.complete()}else{if(o.isPromise(t))return t.then(function(e){p.closed||(p.next(e),p.complete())},function(e){return p.error(e)}).then(null,function(e){n.root.setTimeout(function(){throw e})}),p;if(t&&"function"==typeof t[c.iterator])for(var m=t[c.iterator]();;){var v=m.next();if(v.done){p.complete();break}if(p.next(v.value),p.closed)break}else if(t&&"function"==typeof t[h.observable]){var g=t[h.observable]();if("function"==typeof g.subscribe)return g.subscribe(new u.InnerSubscriber(e,r,l));p.error(new TypeError("Provided object does not correctly implement Symbol.observable"))}else{var y="You provided "+(a.isObject(t)?"an invalid object":"'"+t+"'")+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.";p.error(new TypeError(y))}}return null}},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":158,"../symbol/observable":159,"./isArrayLike":169,"./isObject":173,"./isPromise":174,"./root":176}],178:[function(e,t,r){"use strict";var n=e("../Subscriber"),i=e("../symbol/rxSubscriber"),o=e("../Observer");r.toSubscriber=function(e,t,r){if(e){if(e instanceof n.Subscriber)return e;if(e[i.rxSubscriber])return e[i.rxSubscriber]()}return e||t||r?new n.Subscriber(e,t,r):new n.Subscriber(o.empty)}},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":160}],179:[function(e,t,r){"use strict";function n(){try{return i.apply(this,arguments)}catch(e){return o.errorObject.e=e,o.errorObject}}var i,o=e("./errorObject");r.tryCatch=function(e){return i=e,n}},{"./errorObject":167}],180:[function(e,t,r){!function(e,n){n("object"==typeof r&&void 0!==t?r:e.THREE=e.THREE||{})}(this,function(e){function t(){}function r(e,t){this.x=e||0,this.y=t||0}function n(e,t,i,o,a,s,c,u,h,l){Object.defineProperty(this,"id",{value:wi++}),this.uuid=xi.generateUUID(),this.name="",this.image=void 0!==e?e:n.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==t?t:n.DEFAULT_MAPPING,this.wrapS=void 0!==i?i:1001,this.wrapT=void 0!==o?o:1001,this.magFilter=void 0!==a?a:1006,this.minFilter=void 0!==s?s:1008,this.anisotropy=void 0!==h?h:1,this.format=void 0!==c?c:1023,this.type=void 0!==u?u:1009,this.offset=new r(0,0),this.repeat=new r(1,1),this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==l?l:3e3,this.version=0,this.onUpdate=null}function i(e,t,r,n){this.x=e||0,this.y=t||0,this.z=r||0,this.w=void 0!==n?n:1}function o(e,t,r){this.uuid=xi.generateUUID(),this.width=e,this.height=t,this.scissor=new i(0,0,e,t),this.scissorTest=!1,this.viewport=new i(0,0,e,t),void 0===(r=r||{}).minFilter&&(r.minFilter=1006),this.texture=new n(void 0,void 0,r.wrapS,r.wrapT,r.magFilter,r.minFilter,r.format,r.type,r.anisotropy,r.encoding),this.depthBuffer=void 0===r.depthBuffer||r.depthBuffer,this.stencilBuffer=void 0===r.stencilBuffer||r.stencilBuffer,this.depthTexture=void 0!==r.depthTexture?r.depthTexture:null}function a(e,t,r){o.call(this,e,t,r),this.activeMipMapLevel=this.activeCubeFace=0}function s(e,t,r,n){this._x=e||0,this._y=t||0,this._z=r||0,this._w=void 0!==n?n:1}function c(e,t,r){this.x=e||0,this.y=t||0,this.z=r||0}function u(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function h(e,t,r,i,o,a,s,c,u,h,l,p){n.call(this,null,a,s,c,u,h,i,o,l,p),this.image={data:e,width:t,height:r},this.magFilter=void 0!==u?u:1003,this.minFilter=void 0!==h?h:1003,this.flipY=this.generateMipmaps=!1,this.unpackAlignment=1}function l(e,t,r,i,o,a,s,c,u,h){e=void 0!==e?e:[],n.call(this,e,void 0!==t?t:301,r,i,o,a,s,c,u,h),this.flipY=!1}function p(e,t,r){var n=e[0];if(0>=n||0<n)return e;var i=t*r,o=Ei[i];if(void 0===o&&(o=new Float32Array(i),Ei[i]=o),0!==t)for(n.toArray(o,0),n=1,i=0;n!==t;++n)i+=r,e[n].toArray(o,i);return o}function f(e,t){var r=Ci[t];void 0===r&&(r=new Int32Array(t),Ci[t]=r);for(var n=0;n!==t;++n)r[n]=e.allocTextureUnit();return r}function d(e,t){e.uniform1f(this.addr,t)}function m(e,t){e.uniform1i(this.addr,t)}function v(e,t){void 0===t.x?e.uniform2fv(this.addr,t):e.uniform2f(this.addr,t.x,t.y)}function g(e,t){void 0!==t.x?e.uniform3f(this.addr,t.x,t.y,t.z):void 0!==t.r?e.uniform3f(this.addr,t.r,t.g,t.b):e.uniform3fv(this.addr,t)}function y(e,t){void 0===t.x?e.uniform4fv(this.addr,t):e.uniform4f(this.addr,t.x,t.y,t.z,t.w)}function b(e,t){e.uniformMatrix2fv(this.addr,!1,t.elements||t)}function _(e,t){void 0===t.elements?e.uniformMatrix3fv(this.addr,!1,t):(Oi.set(t.elements),e.uniformMatrix3fv(this.addr,!1,Oi))}function x(e,t){void 0===t.elements?e.uniformMatrix4fv(this.addr,!1,t):(Ti.set(t.elements),e.uniformMatrix4fv(this.addr,!1,Ti))}function w(e,t,r){var n=r.allocTextureUnit();e.uniform1i(this.addr,n),r.setTexture2D(t||Si,n)}function S(e,t,r){var n=r.allocTextureUnit();e.uniform1i(this.addr,n),r.setTextureCube(t||Mi,n)}function M(e,t){e.uniform2iv(this.addr,t)}function E(e,t){e.uniform3iv(this.addr,t)}function C(e,t){e.uniform4iv(this.addr,t)}function T(e){switch(e){case 5126:return d;case 35664:return v;case 35665:return g;case 35666:return y;case 35674:return b;case 35675:return _;case 35676:return x;case 35678:case 36198:return w;case 35680:return S;case 5124:case 35670:return m;case 35667:case 35671:return M;case 35668:case 35672:return E;case 35669:case 35673:return C}}function O(e,t){e.uniform1fv(this.addr,t)}function P(e,t){e.uniform1iv(this.addr,t)}function j(e,t){e.uniform2fv(this.addr,p(t,this.size,2))}function A(e,t){e.uniform3fv(this.addr,p(t,this.size,3))}function R(e,t){e.uniform4fv(this.addr,p(t,this.size,4))}function L(e,t){e.uniformMatrix2fv(this.addr,!1,p(t,this.size,4))}function N(e,t){e.uniformMatrix3fv(this.addr,!1,p(t,this.size,9))}function I(e,t){e.uniformMatrix4fv(this.addr,!1,p(t,this.size,16))}function D(e,t,r){var n=t.length,i=f(r,n);for(e.uniform1iv(this.addr,i),e=0;e!==n;++e)r.setTexture2D(t[e]||Si,i[e])}function k(e,t,r){var n=t.length,i=f(r,n);for(e.uniform1iv(this.addr,i),e=0;e!==n;++e)r.setTextureCube(t[e]||Mi,i[e])}function B(e){switch(e){case 5126:return O;case 35664:return j;case 35665:return A;case 35666:return R;case 35674:return L;case 35675:return N;case 35676:return I;case 35678:return D;case 35680:return k;case 5124:case 35670:return P;case 35667:case 35671:return M;case 35668:case 35672:return E;case 35669:case 35673:return C}}function F(e,t,r){this.id=e,this.addr=r,this.setValue=T(t.type)}function U(e,t,r){this.id=e,this.addr=r,this.size=t.size,this.setValue=B(t.type)}function z(e){this.id=e,this.seq=[],this.map={}}function $(e,t,r){this.seq=[],this.map={},this.renderer=r,r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS);for(var n=0;n<r;++n){var i=e.getActiveUniform(t,n),o=e.getUniformLocation(t,i.name),a=this,s=i.name,c=s.length;for(Pi.lastIndex=0;;){var u=Pi.exec(s),h=Pi.lastIndex,l=u[1],p=u[3];if("]"===u[2]&&(l|=0),void 0===p||"["===p&&h+2===c){s=a,i=void 0===p?new F(l,i,o):new U(l,i,o),s.seq.push(i),s.map[i.id]=i;break}void 0===(p=a.map[l])&&(p=new z(l),l=a,a=p,l.seq.push(a),l.map[a.id]=a),a=p}}}function V(e,t,r){return void 0===t&&void 0===r?this.set(e):this.setRGB(e,t,r)}function G(e,t){this.min=void 0!==e?e:new r(1/0,1/0),this.max=void 0!==t?t:new r(-1/0,-1/0)}function H(e,t){var n,i,o,a,s,u,h,l,p,f,d,m,v,g,y,b,_=e.context,x=e.state;this.render=function(w,S,M){if(0!==t.length){w=new c;var E=M.w/M.z,C=.5*M.z,T=.5*M.w,O=new r((R=16/M.w)*E,R),P=new c(1,1,0),j=new r(1,1),A=new G;if(A.min.set(M.x,M.y),A.max.set(M.x+(M.z-16),M.y+(M.w-16)),void 0===g){var R=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),L=new Uint16Array([0,1,2,0,2,3]);d=_.createBuffer(),m=_.createBuffer(),_.bindBuffer(_.ARRAY_BUFFER,d),_.bufferData(_.ARRAY_BUFFER,R,_.STATIC_DRAW),_.bindBuffer(_.ELEMENT_ARRAY_BUFFER,m),_.bufferData(_.ELEMENT_ARRAY_BUFFER,L,_.STATIC_DRAW),y=_.createTexture(),b=_.createTexture(),x.bindTexture(_.TEXTURE_2D,y),_.texImage2D(_.TEXTURE_2D,0,_.RGB,16,16,0,_.RGB,_.UNSIGNED_BYTE,null),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_S,_.CLAMP_TO_EDGE),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_T,_.CLAMP_TO_EDGE),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MAG_FILTER,_.NEAREST),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MIN_FILTER,_.NEAREST),x.bindTexture(_.TEXTURE_2D,b),_.texImage2D(_.TEXTURE_2D,0,_.RGBA,16,16,0,_.RGBA,_.UNSIGNED_BYTE,null),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_S,_.CLAMP_TO_EDGE),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_T,_.CLAMP_TO_EDGE),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MAG_FILTER,_.NEAREST),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MIN_FILTER,_.NEAREST);var R=v={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},L=_.createProgram(),N=_.createShader(_.FRAGMENT_SHADER),I=_.createShader(_.VERTEX_SHADER),D="precision "+e.getPrecision()+" float;\n";_.shaderSource(N,D+R.fragmentShader),_.shaderSource(I,D+R.vertexShader),_.compileShader(N),_.compileShader(I),_.attachShader(L,N),_.attachShader(L,I),_.linkProgram(L),g=L,p=_.getAttribLocation(g,"position"),f=_.getAttribLocation(g,"uv"),n=_.getUniformLocation(g,"renderType"),i=_.getUniformLocation(g,"map"),o=_.getUniformLocation(g,"occlusionMap"),a=_.getUniformLocation(g,"opacity"),s=_.getUniformLocation(g,"color"),u=_.getUniformLocation(g,"scale"),h=_.getUniformLocation(g,"rotation"),l=_.getUniformLocation(g,"screenPosition")}for(_.useProgram(g),x.initAttributes(),x.enableAttribute(p),x.enableAttribute(f),x.disableUnusedAttributes(),_.uniform1i(o,0),_.uniform1i(i,1),_.bindBuffer(_.ARRAY_BUFFER,d),_.vertexAttribPointer(p,2,_.FLOAT,!1,16,0),_.vertexAttribPointer(f,2,_.FLOAT,!1,16,8),_.bindBuffer(_.ELEMENT_ARRAY_BUFFER,m),x.disable(_.CULL_FACE),x.buffers.depth.setMask(!1),L=0,N=t.length;L<N;L++)if(R=16/M.w,O.set(R*E,R),I=t[L],w.set(I.matrixWorld.elements[12],I.matrixWorld.elements[13],I.matrixWorld.elements[14]),w.applyMatrix4(S.matrixWorldInverse),w.applyMatrix4(S.projectionMatrix),P.copy(w),j.x=M.x+P.x*C+C-8,j.y=M.y+P.y*T+T-8,!0===A.containsPoint(j)){x.activeTexture(_.TEXTURE0),x.bindTexture(_.TEXTURE_2D,null),x.activeTexture(_.TEXTURE1),x.bindTexture(_.TEXTURE_2D,y),_.copyTexImage2D(_.TEXTURE_2D,0,_.RGB,j.x,j.y,16,16,0),_.uniform1i(n,0),_.uniform2f(u,O.x,O.y),_.uniform3f(l,P.x,P.y,P.z),x.disable(_.BLEND),x.enable(_.DEPTH_TEST),_.drawElements(_.TRIANGLES,6,_.UNSIGNED_SHORT,0),x.activeTexture(_.TEXTURE0),x.bindTexture(_.TEXTURE_2D,b),_.copyTexImage2D(_.TEXTURE_2D,0,_.RGBA,j.x,j.y,16,16,0),_.uniform1i(n,1),x.disable(_.DEPTH_TEST),x.activeTexture(_.TEXTURE1),x.bindTexture(_.TEXTURE_2D,y),_.drawElements(_.TRIANGLES,6,_.UNSIGNED_SHORT,0),I.positionScreen.copy(P),I.customUpdateCallback?I.customUpdateCallback(I):I.updateLensFlares(),_.uniform1i(n,2),x.enable(_.BLEND);for(var D=0,k=I.lensFlares.length;D<k;D++){var B=I.lensFlares[D];.001<B.opacity&&.001<B.scale&&(P.x=B.x,P.y=B.y,P.z=B.z,R=B.size*B.scale/M.w,O.x=R*E,O.y=R,_.uniform3f(l,P.x,P.y,P.z),_.uniform2f(u,O.x,O.y),_.uniform1f(h,B.rotation),_.uniform1f(a,B.opacity),_.uniform3f(s,B.color.r,B.color.g,B.color.b),x.setBlending(B.blending,B.blendEquation,B.blendSrc,B.blendDst),e.setTexture2D(B.texture,1),_.drawElements(_.TRIANGLES,6,_.UNSIGNED_SHORT,0))}}x.enable(_.CULL_FACE),x.enable(_.DEPTH_TEST),x.buffers.depth.setMask(!0),e.resetGLState()}}}function q(e,t){function r(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:t.id-e.id}var i,o,a,u,h,l,p,f,d,m,v,g,y,b,_,x,w,S,M,E,C,T=e.context,O=e.state,P=new c,j=new s,A=new c;this.render=function(s,c){if(0!==t.length){if(void 0===E){var R=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),L=new Uint16Array([0,1,2,0,2,3]);S=T.createBuffer(),M=T.createBuffer(),T.bindBuffer(T.ARRAY_BUFFER,S),T.bufferData(T.ARRAY_BUFFER,R,T.STATIC_DRAW),T.bindBuffer(T.ELEMENT_ARRAY_BUFFER,M),T.bufferData(T.ELEMENT_ARRAY_BUFFER,L,T.STATIC_DRAW);var R=T.createProgram(),L=T.createShader(T.VERTEX_SHADER),N=T.createShader(T.FRAGMENT_SHADER);T.shaderSource(L,["precision "+e.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n")),T.shaderSource(N,["precision "+e.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")),T.compileShader(L),T.compileShader(N),T.attachShader(R,L),T.attachShader(R,N),T.linkProgram(R),E=R,x=T.getAttribLocation(E,"position"),w=T.getAttribLocation(E,"uv"),i=T.getUniformLocation(E,"uvOffset"),o=T.getUniformLocation(E,"uvScale"),a=T.getUniformLocation(E,"rotation"),u=T.getUniformLocation(E,"scale"),h=T.getUniformLocation(E,"color"),l=T.getUniformLocation(E,"map"),p=T.getUniformLocation(E,"opacity"),f=T.getUniformLocation(E,"modelViewMatrix"),d=T.getUniformLocation(E,"projectionMatrix"),m=T.getUniformLocation(E,"fogType"),v=T.getUniformLocation(E,"fogDensity"),g=T.getUniformLocation(E,"fogNear"),y=T.getUniformLocation(E,"fogFar"),b=T.getUniformLocation(E,"fogColor"),_=T.getUniformLocation(E,"alphaTest"),(R=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")).width=8,R.height=8,(L=R.getContext("2d")).fillStyle="white",L.fillRect(0,0,8,8),(C=new n(R)).needsUpdate=!0}T.useProgram(E),O.initAttributes(),O.enableAttribute(x),O.enableAttribute(w),O.disableUnusedAttributes(),O.disable(T.CULL_FACE),O.enable(T.BLEND),T.bindBuffer(T.ARRAY_BUFFER,S),T.vertexAttribPointer(x,2,T.FLOAT,!1,16,0),T.vertexAttribPointer(w,2,T.FLOAT,!1,16,8),T.bindBuffer(T.ELEMENT_ARRAY_BUFFER,M),T.uniformMatrix4fv(d,!1,c.projectionMatrix.elements),O.activeTexture(T.TEXTURE0),T.uniform1i(l,0),L=R=0,(N=s.fog)?(T.uniform3f(b,N.color.r,N.color.g,N.color.b),N.isFog?(T.uniform1f(g,N.near),T.uniform1f(y,N.far),T.uniform1i(m,1),L=R=1):N.isFogExp2&&(T.uniform1f(v,N.density),T.uniform1i(m,2),L=R=2)):(T.uniform1i(m,0),L=R=0);for(var N=0,I=t.length;N<I;N++)(k=t[N]).modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,k.matrixWorld),k.z=-k.modelViewMatrix.elements[14];t.sort(r);for(var D=[],N=0,I=t.length;N<I;N++){var k=t[N],B=k.material;if(!1!==B.visible){k.onBeforeRender(e,s,c,void 0,B,void 0),T.uniform1f(_,B.alphaTest),T.uniformMatrix4fv(f,!1,k.modelViewMatrix.elements),k.matrixWorld.decompose(P,j,A),D[0]=A.x,D[1]=A.y;var F=0;s.fog&&B.fog&&(F=L),R!==F&&(T.uniform1i(m,F),R=F),null!==B.map?(T.uniform2f(i,B.map.offset.x,B.map.offset.y),T.uniform2f(o,B.map.repeat.x,B.map.repeat.y)):(T.uniform2f(i,0,0),T.uniform2f(o,1,1)),T.uniform1f(p,B.opacity),T.uniform3f(h,B.color.r,B.color.g,B.color.b),T.uniform1f(a,B.rotation),T.uniform2fv(u,D),O.setBlending(B.blending,B.blendEquation,B.blendSrc,B.blendDst,B.blendEquationAlpha,B.blendSrcAlpha,B.blendDstAlpha,B.premultipliedAlpha),O.buffers.depth.setTest(B.depthTest),O.buffers.depth.setMask(B.depthWrite),B.map?e.setTexture2D(B.map,0):e.setTexture2D(C,0),T.drawElements(T.TRIANGLES,6,T.UNSIGNED_SHORT,0),k.onAfterRender(e,s,c,void 0,B,void 0)}}O.enable(T.CULL_FACE),e.resetGLState()}}}function W(){Object.defineProperty(this,"id",{value:Ii++}),this.uuid=xi.generateUUID(),this.name="",this.type="Material",this.lights=this.fog=!0,this.blending=1,this.side=0,this.shading=2,this.vertexColors=0,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=100,this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null,this.depthFunc=3,this.depthWrite=this.depthTest=!0,this.clippingPlanes=null,this.clipShadows=this.clipIntersection=!1,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetUnits=this.polygonOffsetFactor=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.overdraw=0,this.needsUpdate=this.visible=!0}function X(e){W.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,void 0!==e&&(void 0!==e.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}function Y(e){W.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.morphTargets=this.skinning=!1,this.displacementMap=this.alphaMap=this.map=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.lights=this.fog=!1,this.setValues(e)}function K(e,t){this.min=void 0!==e?e:new c(1/0,1/0,1/0),this.max=void 0!==t?t:new c(-1/0,-1/0,-1/0)}function Z(e,t){this.center=void 0!==e?e:new c,this.radius=void 0!==t?t:0}function J(){this.elements=[1,0,0,0,1,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function Q(e,t){this.normal=void 0!==e?e:new c(1,0,0),this.constant=void 0!==t?t:0}function ee(e,t,r,n,i,o){this.planes=[void 0!==e?e:new Q,void 0!==t?t:new Q,void 0!==r?r:new Q,void 0!==n?n:new Q,void 0!==i?i:new Q,void 0!==o?o:new Q]}function te(e,t,n,a){function s(t,r,n,i){var o,a=t.geometry;o=_;var s=t.customDepthMaterial;return n&&(o=x,s=t.customDistanceMaterial),s?o=s:(s=!1,r.morphTargets&&(a&&a.isBufferGeometry?s=a.morphAttributes&&a.morphAttributes.position&&0<a.morphAttributes.position.length:a&&a.isGeometry&&(s=a.morphTargets&&0<a.morphTargets.length)),t.isSkinnedMesh&&!1===r.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",t),t=t.isSkinnedMesh&&r.skinning,a=0,s&&(a|=1),t&&(a|=2),o=o[a]),e.localClippingEnabled&&!0===r.clipShadows&&0!==r.clippingPlanes.length&&(a=o.uuid,s=r.uuid,void 0===(t=w[a])&&(t={},w[a]=t),void 0===(a=t[s])&&(a=o.clone(),t[s]=a),o=a),o.visible=r.visible,o.wireframe=r.wireframe,s=r.side,A.renderSingleSided&&2==s&&(s=0),A.renderReverseSided&&(0===s?s=1:1===s&&(s=0)),o.side=s,o.clipShadows=r.clipShadows,o.clippingPlanes=r.clippingPlanes,o.wireframeLinewidth=r.wireframeLinewidth,o.linewidth=r.linewidth,n&&void 0!==o.uniforms.lightPos&&o.uniforms.lightPos.value.copy(i),o}function h(t,r,i,o){if(!1!==t.visible){if(t.layers.test(r.layers)&&(t.isMesh||t.isLine||t.isPoints)&&t.castShadow&&(!t.frustumCulled||f.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,t.matrixWorld);var a=n.update(t),c=t.material;if(Array.isArray(c))for(var u=a.groups,l=0,p=u.length;l<p;l++){var d=u[l],m=c[d.materialIndex];m&&m.visible&&(m=s(t,m,o,b),e.renderBufferDirect(i,null,a,m,t,d))}else c.visible&&(m=s(t,c,o,b),e.renderBufferDirect(i,null,a,m,t,null))}for(a=0,c=(t=t.children).length;a<c;a++)h(t[a],r,i,o)}}var l=e.context,p=e.state,f=new ee,d=new u,m=t.shadows,v=new r,g=new r(a.maxTextureSize,a.maxTextureSize),y=new c,b=new c,_=Array(4),x=Array(4),w={},S=[new c(1,0,0),new c(-1,0,0),new c(0,0,1),new c(0,0,-1),new c(0,1,0),new c(0,-1,0)],M=[new c(0,1,0),new c(0,1,0),new c(0,1,0),new c(0,1,0),new c(0,0,1),new c(0,0,-1)],E=[new i,new i,new i,new i,new i,new i];(t=new Y).depthPacking=3201,t.clipping=!0,a=Ni.distanceRGBA;for(var C=Ri.clone(a.uniforms),T=0;4!==T;++T){var O=0!=(1&T),P=0!=(2&T),j=t.clone();j.morphTargets=O,j.skinning=P,_[T]=j,O=new X({defines:{USE_SHADOWMAP:""},uniforms:C,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader,morphTargets:O,skinning:P,clipping:!0}),x[T]=O}var A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.renderSingleSided=this.renderReverseSided=!0,this.render=function(t,r){if(!1!==A.enabled&&(!1!==A.autoUpdate||!1!==A.needsUpdate)&&0!==m.length){p.disable(l.BLEND),p.buffers.color.setClear(1,1,1,1),p.buffers.depth.setTest(!0),p.setScissorTest(!1);for(var n,i=0,a=m.length;i<a;i++){var s=m[i];n=s.shadow;var c=s&&s.isPointLight;if(void 0===n)console.warn("THREE.WebGLShadowMap:",s,"has no shadow.");else{var u=n.camera;if(v.copy(n.mapSize),v.min(g),c){var _=v.x,x=v.y;E[0].set(2*_,x,_,x),E[1].set(0,x,_,x),E[2].set(3*_,x,_,x),E[3].set(_,x,_,x),E[4].set(3*_,0,_,x),E[5].set(_,0,_,x),v.x*=4,v.y*=2}for(null===n.map&&(n.map=new o(v.x,v.y,{minFilter:1003,magFilter:1003,format:1023}),n.map.texture.name=s.name+".shadowMap",u.updateProjectionMatrix()),n.isSpotLightShadow&&n.update(s),_=n.map,x=n.matrix,b.setFromMatrixPosition(s.matrixWorld),u.position.copy(b),c?(n=6,x.makeTranslation(-b.x,-b.y,-b.z)):(n=1,y.setFromMatrixPosition(s.target.matrixWorld),u.lookAt(y),u.updateMatrixWorld(),x.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),x.multiply(u.projectionMatrix),x.multiply(u.matrixWorldInverse)),e.setRenderTarget(_),e.clear(),s=0;s<n;s++)c&&(y.copy(u.position),y.add(S[s]),u.up.copy(M[s]),u.lookAt(y),u.updateMatrixWorld(),p.viewport(E[s])),d.multiplyMatrices(u.projectionMatrix,u.matrixWorldInverse),f.setFromMatrix(d),h(t,r,u,c)}}i=e.getClearColor(),a=e.getClearAlpha(),e.setClearColor(i,a),A.needsUpdate=!1}}}function re(e){var t={};return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t[e.uuid]},remove:function(r){r.isInterleavedBufferAttribute&&(r=r.data);var n=t[r.uuid];n&&(e.deleteBuffer(n.buffer),delete t[r.uuid])},update:function(r,n){if(r.isInterleavedBufferAttribute&&(r=r.data),void 0===(i=t[r.uuid])){var i=r.uuid,o=r,a=o.array,s=o.dynamic?e.DYNAMIC_DRAW:e.STATIC_DRAW,c=e.createBuffer();e.bindBuffer(n,c),e.bufferData(n,a,s),o.onUploadCallback(),s=e.FLOAT,a instanceof Float32Array?s=e.FLOAT:a instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):a instanceof Uint16Array?s=e.UNSIGNED_SHORT:a instanceof Int16Array?s=e.SHORT:a instanceof Uint32Array?s=e.UNSIGNED_INT:a instanceof Int32Array?s=e.INT:a instanceof Int8Array?s=e.BYTE:a instanceof Uint8Array&&(s=e.UNSIGNED_BYTE),t[i]={buffer:c,type:s,bytesPerElement:a.BYTES_PER_ELEMENT,version:o.version}}else i.version<r.version&&(o=r,a=o.array,c=o.updateRange,e.bindBuffer(n,i.buffer),!1===o.dynamic?e.bufferData(n,a,e.STATIC_DRAW):-1===c.count?e.bufferSubData(n,0,a):0===c.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(e.bufferSubData(n,c.offset*a.BYTES_PER_ELEMENT,a.subarray(c.offset,c.offset+c.count)),c.count=-1),i.version=r.version)}}}function ne(e,t,r,n){this._x=e||0,this._y=t||0,this._z=r||0,this._order=n||ne.DefaultOrder}function ie(){this.mask=1}function oe(){Object.defineProperty(this,"id",{value:Di++}),this.uuid=xi.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=oe.DefaultUp.clone();var e=new c,t=new ne,r=new s,n=new c(1,1,1);t.onChange(function(){r.setFromEuler(t,!1)}),r.onChange(function(){t.setFromQuaternion(r,void 0,!1)}),Object.defineProperties(this,{position:{enumerable:!0,value:e},rotation:{enumerable:!0,value:t},quaternion:{enumerable:!0,value:r},scale:{enumerable:!0,value:n},modelViewMatrix:{value:new u},normalMatrix:{value:new J}}),this.matrix=new u,this.matrixWorld=new u,this.matrixAutoUpdate=oe.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new ie,this.visible=!0,this.receiveShadow=this.castShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}}function ae(){oe.call(this),this.type="Camera",this.matrixWorldInverse=new u,this.projectionMatrix=new u}function se(e,t,r,n,i,o){ae.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=r,this.bottom=n,this.near=void 0!==i?i:.1,this.far=void 0!==o?o:2e3,this.updateProjectionMatrix()}function ce(e,t,r,n){ae.call(this),this.type="PerspectiveCamera",this.fov=void 0!==e?e:50,this.zoom=1,this.near=void 0!==r?r:.1,this.far=void 0!==n?n:2e3,this.focus=10,this.aspect=void 0!==t?t:1,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}function ue(e,t,r,n,i,o){this.a=e,this.b=t,this.c=r,this.normal=n&&n.isVector3?n:new c,this.vertexNormals=Array.isArray(n)?n:[],this.color=i&&i.isColor?i:new V,this.vertexColors=Array.isArray(i)?i:[],this.materialIndex=void 0!==o?o:0}function he(){Object.defineProperty(this,"id",{value:ki++}),this.uuid=xi.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingSphere=this.boundingBox=null,this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function le(e,t,r){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=xi.generateUUID(),this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===r,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.onUploadCallback=function(){},this.version=0}function pe(e,t){le.call(this,new Int8Array(e),t)}function fe(e,t){le.call(this,new Uint8Array(e),t)}function de(e,t){le.call(this,new Uint8ClampedArray(e),t)}function me(e,t){le.call(this,new Int16Array(e),t)}function ve(e,t){le.call(this,new Uint16Array(e),t)}function ge(e,t){le.call(this,new Int32Array(e),t)}function ye(e,t){le.call(this,new Uint32Array(e),t)}function be(e,t){le.call(this,new Float32Array(e),t)}function _e(e,t){le.call(this,new Float64Array(e),t)}function xe(){this.indices=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingSphere=this.boundingBox=null,this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function we(e){if(0===e.length)return-1/0;for(var t=e[0],r=1,n=e.length;r<n;++r)e[r]>t&&(t=e[r]);return t}function Se(){Object.defineProperty(this,"id",{value:ki++}),this.uuid=xi.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingSphere=this.boundingBox=null,this.drawRange={start:0,count:1/0}}function Me(e,t,r,n,i,o){he.call(this),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:r,widthSegments:n,heightSegments:i,depthSegments:o},this.fromBufferGeometry(new Ee(e,t,r,n,i,o)),this.mergeVertices()}function Ee(e,t,r,n,i,o){function a(e,t,r,n,i,o,a,m,v,g,y){var b=o/v,_=a/g,x=o/2,w=a/2,S=m/2;a=v+1;var M,E,C=g+1,T=o=0,O=new c;for(E=0;E<C;E++){var P=E*_-w;for(M=0;M<a;M++)O[e]=(M*b-x)*n,O[t]=P*i,O[r]=S,h.push(O.x,O.y,O.z),O[e]=0,O[t]=0,O[r]=0<m?1:-1,l.push(O.x,O.y,O.z),p.push(M/v),p.push(1-E/g),o+=1}for(E=0;E<g;E++)for(M=0;M<v;M++)e=f+M+a*(E+1),t=f+(M+1)+a*(E+1),r=f+(M+1)+a*E,u.push(f+M+a*E,e,r),u.push(e,t,r),T+=6;s.addGroup(d,T,y),d+=T,f+=o}Se.call(this),this.type="BoxBufferGeometry",this.parameters={width:e,height:t,depth:r,widthSegments:n,heightSegments:i,depthSegments:o};var s=this;n=Math.floor(n)||1,i=Math.floor(i)||1;var u=[],h=[],l=[],p=[],f=0,d=0;a("z","y","x",-1,-1,r,t,e,o=Math.floor(o)||1,i,0),a("z","y","x",1,-1,r,t,-e,o,i,1),a("x","z","y",1,1,e,r,t,n,o,2),a("x","z","y",1,-1,e,r,-t,n,o,3),a("x","y","z",1,-1,e,t,r,n,i,4),a("x","y","z",-1,-1,e,t,-r,n,i,5),this.setIndex(u),this.addAttribute("position",new be(h,3)),this.addAttribute("normal",new be(l,3)),this.addAttribute("uv",new be(p,2))}function Ce(e,t,r,n){he.call(this),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:r,heightSegments:n},this.fromBufferGeometry(new Te(e,t,r,n)),this.mergeVertices()}function Te(e,t,r,n){Se.call(this),this.type="PlaneBufferGeometry",this.parameters={width:e,height:t,widthSegments:r,heightSegments:n};var i=e/2,o=t/2,a=(r=Math.floor(r)||1)+1,s=(n=Math.floor(n)||1)+1,c=e/r,u=t/n,h=[],l=[],p=[],f=[];for(e=0;e<s;e++){var d=e*u-o;for(t=0;t<a;t++)l.push(t*c-i,-d,0),p.push(0,0,1),f.push(t/r),f.push(1-e/n)}for(e=0;e<n;e++)for(t=0;t<r;t++)i=t+a*(e+1),o=t+1+a*(e+1),s=t+1+a*e,h.push(t+a*e,i,s),h.push(i,o,s);this.setIndex(h),this.addAttribute("position",new be(l,3)),this.addAttribute("normal",new be(p,3)),this.addAttribute("uv",new be(f,2))}function Oe(e){W.call(this),this.type="MeshBasicMaterial",this.color=new V(16777215),this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.envMap=this.alphaMap=this.specularMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.lights=this.morphTargets=this.skinning=!1,this.setValues(e)}function Pe(e,t){this.origin=void 0!==e?e:new c,this.direction=void 0!==t?t:new c}function je(e,t){this.start=void 0!==e?e:new c,this.end=void 0!==t?t:new c}function Ae(e,t,r){this.a=void 0!==e?e:new c,this.b=void 0!==t?t:new c,this.c=void 0!==r?r:new c}function Re(e,t){oe.call(this),this.type="Mesh",this.geometry=void 0!==e?e:new Se,this.material=void 0!==t?t:new Oe({color:16777215*Math.random()}),this.drawMode=0,this.updateMorphTargets()}function Le(e,t,r,n){function i(e,r){t.buffers.color.setClear(e.r,e.g,e.b,r,n)}var o,a,s,c,u=new V(0),h=0;return{getClearColor:function(){return u},setClearColor:function(e,t){u.set(e),i(u,h=void 0!==t?t:1)},getClearAlpha:function(){return h},setClearAlpha:function(e){i(u,h=e)},render:function(t,n,l){null===(t=t.background)?i(u,h):t&&t.isColor&&(i(t,1),l=!0),(e.autoClear||l)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),t&&t.isCubeTexture?(void 0===s&&(s=new ce,c=new Re(new Ee(5,5,5),new X({uniforms:Ni.cube.uniforms,vertexShader:Ni.cube.vertexShader,fragmentShader:Ni.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))),s.projectionMatrix.copy(n.projectionMatrix),s.matrixWorld.extractRotation(n.matrixWorld),s.matrixWorldInverse.getInverse(s.matrixWorld),c.material.uniforms.tCube.value=t,c.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,c.matrixWorld),r.update(c),e.renderBufferDirect(s,null,c.geometry,c.material,c,null)):t&&t.isTexture&&(void 0===o&&(o=new se(-1,1,1,-1,0,1),a=new Re(new Te(2,2),new Oe({depthTest:!1,depthWrite:!1,fog:!1}))),a.material.map=t,r.update(a),e.renderBufferDirect(o,null,a.geometry,a.material,a,null))}}}function Ne(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.program&&t.program&&e.program!==t.program?e.program.id-t.program.id:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Ie(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function De(){var e=[],t=-1,r=[],n=-1;return{opaque:e,transparent:r,init:function(){n=t=-1},push:function(i,o,a,s,c){var u,h;a.transparent?(u=r,h=++n):(u=e,h=++t),(h=u[h])?(h.id=i.id,h.object=i,h.geometry=o,h.material=a,h.program=a.program,h.renderOrder=i.renderOrder,h.z=s,h.group=c):(h={id:i.id,object:i,geometry:o,material:a,program:a.program,renderOrder:i.renderOrder,z:s,group:c},u.push(h))},finish:function(){e.length=t+1,r.length=n+1},sort:function(){e.sort(Ne),r.sort(Ie)}}}function ke(){var e={};return{get:function(t,r){var n=t.id+","+r.id,i=e[n];return void 0===i&&(i=new De,e[n]=i),i},dispose:function(){e={}}}}function Be(e,t,r){var n,i,o;this.setMode=function(e){n=e},this.setIndex=function(e){i=e.type,o=e.bytesPerElement},this.render=function(t,a){e.drawElements(n,a,i,t*o),r.calls++,r.vertices+=a,n===e.TRIANGLES&&(r.faces+=a/3)},this.renderInstances=function(a,s,c){var u=t.get("ANGLE_instanced_arrays");null===u?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(u.drawElementsInstancedANGLE(n,c,i,s*o,a.maxInstancedCount),r.calls++,r.vertices+=c*a.maxInstancedCount,n===e.TRIANGLES&&(r.faces+=a.maxInstancedCount*c/3))}}function Fe(e,t,r){var n;this.setMode=function(e){n=e},this.render=function(t,i){e.drawArrays(n,t,i),r.calls++,r.vertices+=i,n===e.TRIANGLES&&(r.faces+=i/3)},this.renderInstances=function(i,o,a){var s=t.get("ANGLE_instanced_arrays");if(null===s)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var c=i.attributes.position;c.isInterleavedBufferAttribute?(a=c.data.count,s.drawArraysInstancedANGLE(n,0,a,i.maxInstancedCount)):s.drawArraysInstancedANGLE(n,o,a,i.maxInstancedCount),r.calls++,r.vertices+=a*i.maxInstancedCount,n===e.TRIANGLES&&(r.faces+=i.maxInstancedCount*a/3)}}}function Ue(e,t,r){function n(e){e=e.target;var a=i[e.id];null!==a.index&&t.remove(a.index);for(var s in a.attributes)t.remove(a.attributes[s]);e.removeEventListener("dispose",n),delete i[e.id],(s=o[e.id])&&(t.remove(s),delete o[e.id]),(s=o[a.id])&&(t.remove(s),delete o[a.id]),r.geometries--}var i={},o={};return{get:function(e,t){var o=i[t.id];return o||(t.addEventListener("dispose",n),t.isBufferGeometry?o=t:t.isGeometry&&(void 0===t._bufferGeometry&&(t._bufferGeometry=(new Se).setFromObject(e)),o=t._bufferGeometry),i[t.id]=o,r.geometries++,o)},update:function(r){var n=r.index,i=r.attributes;null!==n&&t.update(n,e.ELEMENT_ARRAY_BUFFER);for(var o in i)t.update(i[o],e.ARRAY_BUFFER);r=r.morphAttributes;for(o in r)for(var n=r[o],i=0,a=n.length;i<a;i++)t.update(n[i],e.ARRAY_BUFFER)},getWireframeAttribute:function(r){if(n=o[r.id])return n;var n=[],i=r.index,a=r.attributes;if(null!==i)for(var i=i.array,a=0,s=i.length;a<s;a+=3){var c=i[a+0],u=i[a+1],h=i[a+2];n.push(c,u,u,h,h,c)}else for(i=a.position.array,a=0,s=i.length/3-1;a<s;a+=3)c=a+0,u=a+1,h=a+2,n.push(c,u,u,h,h,c);return n=new(65535<we(n)?ye:ve)(n,1),t.update(n,e.ELEMENT_ARRAY_BUFFER),o[r.id]=n}}}function ze(){var e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];var n;switch(t.type){case"DirectionalLight":n={direction:new c,color:new V,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r};break;case"SpotLight":n={position:new c,direction:new c,color:new V,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r};break;case"PointLight":n={position:new c,color:new V,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r};break;case"HemisphereLight":n={direction:new c,skyColor:new V,groundColor:new V};break;case"RectAreaLight":n={color:new V,position:new c,halfWidth:new c,halfHeight:new c}}return e[t.id]=n}}}function $e(e,t,r){var n={};return{update:function(e){var i=r.frame,o=e.geometry,a=t.get(e,o);return n[a.id]!==i&&(o.isGeometry&&a.updateFromObject(e),t.update(a),n[a.id]=i),a},clear:function(){n={}}}}function Ve(e){e=e.split("\n");for(var t=0;t<e.length;t++)e[t]=t+1+": "+e[t];return e.join("\n")}function Ge(e,t,r){var n=e.createShader(t);return e.shaderSource(n,r),e.compileShader(n),!1===e.getShaderParameter(n,e.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile."),""!==e.getShaderInfoLog(n)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",t===e.VERTEX_SHADER?"vertex":"fragment",e.getShaderInfoLog(n),Ve(r)),n}function He(e){switch(e){case 3e3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+e)}}function qe(e,t){var r=He(t);return"vec4 "+e+"( vec4 value ) { return "+r[0]+"ToLinear"+r[1]+"; }"}function We(e,t){var r=He(t);return"vec4 "+e+"( vec4 value ) { return LinearTo"+r[0]+r[1]+"; }"}function Xe(e,t){var r;switch(t){case 1:r="Linear";break;case 2:r="Reinhard";break;case 3:r="Uncharted2";break;case 4:r="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+t)}return"vec3 "+e+"( vec3 color ) { return "+r+"ToneMapping( color ); }"}function Ye(e,t,r){return e=e||{},[e.derivatives||t.envMapCubeUV||t.bumpMap||t.normalMap||t.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(e.fragDepth||t.logarithmicDepthBuffer)&&r.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",e.drawBuffers&&r.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(e.shaderTextureLOD||t.envMap)&&r.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Ze).join("\n")}function Ke(e){var t,r=[];for(t in e){var n=e[t];!1!==n&&r.push("#define "+t+" "+n)}return r.join("\n")}function Ze(e){return""!==e}function Je(e,t){return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights)}function Qe(e){return e.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(e,t){var r=Li[t];if(void 0===r)throw Error("Can not resolve #include <"+t+">");return Qe(r)})}function et(e){return e.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(e,t,r,n){for(e="",t=parseInt(t);t<parseInt(r);t++)e+=n.replace(/\[ i \]/g,"[ "+t+" ]");return e})}function tt(e,t,r,n,i){var o=e.context,a=r.extensions,s=r.defines,c=n.vertexShader,u=n.fragmentShader,h="SHADOWMAP_TYPE_BASIC";1===i.shadowMapType?h="SHADOWMAP_TYPE_PCF":2===i.shadowMapType&&(h="SHADOWMAP_TYPE_PCF_SOFT");var l="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",f="ENVMAP_BLENDING_MULTIPLY";if(i.envMap){switch(r.envMap.mapping){case 301:case 302:l="ENVMAP_TYPE_CUBE";break;case 306:case 307:l="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:l="ENVMAP_TYPE_EQUIREC";break;case 305:l="ENVMAP_TYPE_SPHERE"}switch(r.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(r.combine){case 0:f="ENVMAP_BLENDING_MULTIPLY";break;case 1:f="ENVMAP_BLENDING_MIX";break;case 2:f="ENVMAP_BLENDING_ADD"}}var d=0<e.gammaFactor?e.gammaFactor:1,a=Ye(a,i,e.extensions),m=Ke(s),v=o.createProgram();r.isRawShaderMaterial?(s=[m,"\n"].filter(Ze).join("\n"),n=[a,m,"\n"].filter(Ze).join("\n")):(s=["precision "+i.precision+" float;","precision "+i.precision+" int;","#define SHADER_NAME "+n.name,m,i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+p:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.vertexColors?"#define USE_COLOR":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+i.numClippingPlanes,i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+h:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&e.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ze).join("\n"),n=[a,"precision "+i.precision+" float;","precision "+i.precision+" int;","#define SHADER_NAME "+n.name,m,i.alphaTest?"#define ALPHATEST "+i.alphaTest:"","#define GAMMA_FACTOR "+d,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+l:"",i.envMap?"#define "+p:"",i.envMap?"#define "+f:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.vertexColors?"#define USE_COLOR":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+i.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(i.numClippingPlanes-i.numClipIntersection),i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+h:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&e.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",i.envMap&&e.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?Li.tonemapping_pars_fragment:"",0!==i.toneMapping?Xe("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.outputEncoding||i.mapEncoding||i.envMapEncoding||i.emissiveMapEncoding?Li.encodings_pars_fragment:"",i.mapEncoding?qe("mapTexelToLinear",i.mapEncoding):"",i.envMapEncoding?qe("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMapEncoding?qe("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.outputEncoding?We("linearToOutputTexel",i.outputEncoding):"",i.depthPacking?"#define DEPTH_PACKING "+r.depthPacking:"","\n"].filter(Ze).join("\n")),c=Je(c=Qe(c),i),u=Je(u=Qe(u),i),r.isShaderMaterial||(c=et(c),u=et(u)),u=n+u,c=Ge(o,o.VERTEX_SHADER,s+c),u=Ge(o,o.FRAGMENT_SHADER,u),o.attachShader(v,c),o.attachShader(v,u),void 0!==r.index0AttributeName?o.bindAttribLocation(v,0,r.index0AttributeName):!0===i.morphTargets&&o.bindAttribLocation(v,0,"position"),o.linkProgram(v),i=o.getProgramInfoLog(v),h=o.getShaderInfoLog(c),l=o.getShaderInfoLog(u),f=p=!0,!1===o.getProgramParameter(v,o.LINK_STATUS)?(p=!1,console.error("THREE.WebGLProgram: shader error: ",o.getError(),"gl.VALIDATE_STATUS",o.getProgramParameter(v,o.VALIDATE_STATUS),"gl.getProgramInfoLog",i,h,l)):""!==i?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",i):""!==h&&""!==l||(f=!1),f&&(this.diagnostics={runnable:p,material:r,programLog:i,vertexShader:{log:h,prefix:s},fragmentShader:{log:l,prefix:n}}),o.deleteShader(c),o.deleteShader(u);var g;this.getUniforms=function(){return void 0===g&&(g=new $(o,v,e)),g};var y;return this.getAttributes=function(){if(void 0===y){for(var e={},t=o.getProgramParameter(v,o.ACTIVE_ATTRIBUTES),r=0;r<t;r++){var n=o.getActiveAttrib(v,r).name;e[n]=o.getAttribLocation(v,n)}y=e}return y},this.destroy=function(){o.deleteProgram(v),this.program=void 0},Object.defineProperties(this,{uniforms:{get:function(){return console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."),this.getUniforms()}},attributes:{get:function(){return console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."),this.getAttributes()}}}),this.id=Bi++,this.code=t,this.usedTimes=1,this.program=v,this.vertexShader=c,this.fragmentShader=u,this}function rt(e,t){function r(e,t){var r;return e?e.isTexture?r=e.encoding:e.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),r=e.texture.encoding):r=3e3,3e3===r&&t&&(r=3007),r}var n=[],i={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},o="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");this.getParameters=function(n,o,a,s,c,u){var h,l=i[n.type];if(u.isSkinnedMesh)if(h=u.skeleton.bones,t.floatVertexTextures)h=1024;else{var p=Math.min(Math.floor((t.maxVertexUniforms-20)/4),h.length);p<h.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+h.length+" bones. This GPU supports "+p+"."),h=0):h=p}else h=0;p=e.getPrecision(),null!==n.precision&&(p=t.getMaxPrecision(n.precision))!==n.precision&&console.warn("THREE.WebGLProgram.getParameters:",n.precision,"not supported, using",p,"instead.");var f=e.getRenderTarget();return{shaderID:l,precision:p,supportsVertexTextures:t.vertexTextures,outputEncoding:r(f?f.texture:null,e.gammaOutput),map:!!n.map,mapEncoding:r(n.map,e.gammaInput),envMap:!!n.envMap,envMapMode:n.envMap&&n.envMap.mapping,envMapEncoding:r(n.envMap,e.gammaInput),envMapCubeUV:!!n.envMap&&(306===n.envMap.mapping||307===n.envMap.mapping),lightMap:!!n.lightMap,aoMap:!!n.aoMap,emissiveMap:!!n.emissiveMap,emissiveMapEncoding:r(n.emissiveMap,e.gammaInput),bumpMap:!!n.bumpMap,normalMap:!!n.normalMap,displacementMap:!!n.displacementMap,roughnessMap:!!n.roughnessMap,metalnessMap:!!n.metalnessMap,specularMap:!!n.specularMap,alphaMap:!!n.alphaMap,gradientMap:!!n.gradientMap,combine:n.combine,vertexColors:n.vertexColors,fog:!!a,useFog:n.fog,fogExp:a&&a.isFogExp2,flatShading:1===n.shading,sizeAttenuation:n.sizeAttenuation,logarithmicDepthBuffer:t.logarithmicDepthBuffer,skinning:n.skinning&&0<h,maxBones:h,useVertexTexture:t.floatVertexTextures,morphTargets:n.morphTargets,morphNormals:n.morphNormals,maxMorphTargets:e.maxMorphTargets,maxMorphNormals:e.maxMorphNormals,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numClippingPlanes:s,numClipIntersection:c,dithering:n.dithering,shadowMapEnabled:e.shadowMap.enabled&&u.receiveShadow&&0<o.shadows.length,shadowMapType:e.shadowMap.type,toneMapping:e.toneMapping,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:n.premultipliedAlpha,alphaTest:n.alphaTest,doubleSided:2===n.side,flipSided:1===n.side,depthPacking:void 0!==n.depthPacking&&n.depthPacking}},this.getProgramCode=function(t,r){var n=[];if(r.shaderID?n.push(r.shaderID):(n.push(t.fragmentShader),n.push(t.vertexShader)),void 0!==t.defines)for(var i in t.defines)n.push(i),n.push(t.defines[i]);for(i=0;i<o.length;i++)n.push(r[o[i]]);return n.push(t.onBeforeCompile.toString()),n.push(e.gammaOutput),n.join()},this.acquireProgram=function(t,r,i,o){for(var a,s=0,c=n.length;s<c;s++){var u=n[s];if(u.code===o){++(a=u).usedTimes;break}}return void 0===a&&(a=new tt(e,o,t,r,i),n.push(a)),a},this.releaseProgram=function(e){if(0==--e.usedTimes){var t=n.indexOf(e);n[t]=n[n.length-1],n.pop(),e.destroy()}},this.programs=n}function nt(e,t,r,n,i,o,a){function s(e,t){if(e.width>t||e.height>t){var r=t/Math.max(e.width,e.height),n=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return n.width=Math.floor(e.width*r),n.height=Math.floor(e.height*r),n.getContext("2d").drawImage(e,0,0,e.width,e.height,0,0,n.width,n.height),console.warn("THREE.WebGLRenderer: image is too big ("+e.width+"x"+e.height+"). Resized to "+n.width+"x"+n.height,e),n}return e}function c(e){return xi.isPowerOfTwo(e.width)&&xi.isPowerOfTwo(e.height)}function u(e,t){return e.generateMipmaps&&t&&1003!==e.minFilter&&1006!==e.minFilter}function h(t){return 1003===t||1004===t||1005===t?e.NEAREST:e.LINEAR}function l(t){(t=t.target).removeEventListener("dispose",l);e:{var r=n.get(t);if(t.image&&r.__image__webglTextureCube)e.deleteTexture(r.__image__webglTextureCube);else{if(void 0===r.__webglInit)break e;e.deleteTexture(r.__webglTexture)}n.remove(t)}a.textures--}function p(t){(t=t.target).removeEventListener("dispose",p);var r=n.get(t),i=n.get(t.texture);if(t){if(void 0!==i.__webglTexture&&e.deleteTexture(i.__webglTexture),t.depthTexture&&t.depthTexture.dispose(),t.isWebGLRenderTargetCube)for(i=0;6>i;i++)e.deleteFramebuffer(r.__webglFramebuffer[i]),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer[i]);else e.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer);n.remove(t.texture),n.remove(t)}a.textures--}function f(t,h){var p=n.get(t);if(0<t.version&&p.__version!==t.version)if(void 0===(m=t.image))console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",t);else{if(!1!==m.complete){void 0===p.__webglInit&&(p.__webglInit=!0,t.addEventListener("dispose",l),p.__webglTexture=e.createTexture(),a.textures++),r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_2D,p.__webglTexture),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,t.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,t.unpackAlignment);var f=s(t.image,i.maxTextureSize);(1001!==t.wrapS||1001!==t.wrapT||1003!==t.minFilter&&1006!==t.minFilter)&&!1===c(f)&&((m=f)instanceof HTMLImageElement||m instanceof HTMLCanvasElement?((v=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")).width=xi.nearestPowerOfTwo(m.width),v.height=xi.nearestPowerOfTwo(m.height),v.getContext("2d").drawImage(m,0,0,v.width,v.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+m.width+"x"+m.height+"). Resized to "+v.width+"x"+v.height,m),f=v):f=m);var m=c(f),v=o(t.format),y=o(t.type);d(e.TEXTURE_2D,t,m);var b=t.mipmaps;if(t.isDepthTexture){if(b=e.DEPTH_COMPONENT,1015===t.type){if(!g)throw Error("Float Depth Texture only supported in WebGL2.0");b=e.DEPTH_COMPONENT32F}else g&&(b=e.DEPTH_COMPONENT16);1026===t.format&&b===e.DEPTH_COMPONENT&&1012!==t.type&&1014!==t.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),t.type=1012,y=o(t.type)),1027===t.format&&(b=e.DEPTH_STENCIL,1020!==t.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),t.type=1020,y=o(t.type))),r.texImage2D(e.TEXTURE_2D,0,b,f.width,f.height,0,v,y,null)}else if(t.isDataTexture)if(0<b.length&&m){for(var _=0,x=b.length;_<x;_++)f=b[_],r.texImage2D(e.TEXTURE_2D,_,v,f.width,f.height,0,v,y,f.data);t.generateMipmaps=!1}else r.texImage2D(e.TEXTURE_2D,0,v,f.width,f.height,0,v,y,f.data);else if(t.isCompressedTexture)for(_=0,x=b.length;_<x;_++)f=b[_],1023!==t.format&&1022!==t.format?-1<r.getCompressedTextureFormats().indexOf(v)?r.compressedTexImage2D(e.TEXTURE_2D,_,v,f.width,f.height,0,f.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):r.texImage2D(e.TEXTURE_2D,_,v,f.width,f.height,0,v,y,f.data);else if(0<b.length&&m){for(_=0,x=b.length;_<x;_++)f=b[_],r.texImage2D(e.TEXTURE_2D,_,v,v,y,f);t.generateMipmaps=!1}else r.texImage2D(e.TEXTURE_2D,0,v,v,y,f);return u(t,m)&&e.generateMipmap(e.TEXTURE_2D),p.__version=t.version,void(t.onUpdate&&t.onUpdate(t))}console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",t)}r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_2D,p.__webglTexture)}function d(r,a,s){s?(e.texParameteri(r,e.TEXTURE_WRAP_S,o(a.wrapS)),e.texParameteri(r,e.TEXTURE_WRAP_T,o(a.wrapT)),e.texParameteri(r,e.TEXTURE_MAG_FILTER,o(a.magFilter)),e.texParameteri(r,e.TEXTURE_MIN_FILTER,o(a.minFilter))):(e.texParameteri(r,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(r,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),1001===a.wrapS&&1001===a.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",a),e.texParameteri(r,e.TEXTURE_MAG_FILTER,h(a.magFilter)),e.texParameteri(r,e.TEXTURE_MIN_FILTER,h(a.minFilter)),1003!==a.minFilter&&1006!==a.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",a)),!(s=t.get("EXT_texture_filter_anisotropic"))||1015===a.type&&null===t.get("OES_texture_float_linear")||1016===a.type&&null===t.get("OES_texture_half_float_linear")||!(1<a.anisotropy||n.get(a).__currentAnisotropy)||(e.texParameterf(r,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,i.getMaxAnisotropy())),n.get(a).__currentAnisotropy=a.anisotropy)}function m(t,i,a,s){var c=o(i.texture.format),u=o(i.texture.type);r.texImage2D(s,0,c,i.width,i.height,0,c,u,null),e.bindFramebuffer(e.FRAMEBUFFER,t),e.framebufferTexture2D(e.FRAMEBUFFER,a,s,n.get(i.texture).__webglTexture,0),e.bindFramebuffer(e.FRAMEBUFFER,null)}function v(t,r){e.bindRenderbuffer(e.RENDERBUFFER,t),r.depthBuffer&&!r.stencilBuffer?(e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,r.width,r.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,t)):r.depthBuffer&&r.stencilBuffer?(e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,r.width,r.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,t)):e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,r.width,r.height),e.bindRenderbuffer(e.RENDERBUFFER,null)}var g="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext;this.setTexture2D=f,this.setTextureCube=function(t,h){var p=n.get(t);if(6===t.image.length)if(0<t.version&&p.__version!==t.version){p.__image__webglTextureCube||(t.addEventListener("dispose",l),p.__image__webglTextureCube=e.createTexture(),a.textures++),r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_CUBE_MAP,p.__image__webglTextureCube),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,t.flipY);for(var f=t&&t.isCompressedTexture,m=t.image[0]&&t.image[0].isDataTexture,v=[],g=0;6>g;g++)v[g]=f||m?m?t.image[g].image:t.image[g]:s(t.image[g],i.maxCubemapSize);var y=c(v[0]),b=o(t.format),_=o(t.type);for(d(e.TEXTURE_CUBE_MAP,t,y),g=0;6>g;g++)if(f)for(var x,w=v[g].mipmaps,S=0,M=w.length;S<M;S++)x=w[S],1023!==t.format&&1022!==t.format?-1<r.getCompressedTextureFormats().indexOf(b)?r.compressedTexImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+g,S,b,x.width,x.height,0,x.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+g,S,b,x.width,x.height,0,b,_,x.data);else m?r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+g,0,b,v[g].width,v[g].height,0,b,_,v[g].data):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+g,0,b,b,_,v[g]);u(t,y)&&e.generateMipmap(e.TEXTURE_CUBE_MAP),p.__version=t.version,t.onUpdate&&t.onUpdate(t)}else r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_CUBE_MAP,p.__image__webglTextureCube)},this.setTextureCubeDynamic=function(t,i){r.activeTexture(e.TEXTURE0+i),r.bindTexture(e.TEXTURE_CUBE_MAP,n.get(t).__webglTexture)},this.setupRenderTarget=function(t){var i=n.get(t),o=n.get(t.texture);t.addEventListener("dispose",p),o.__webglTexture=e.createTexture(),a.textures++;var s=!0===t.isWebGLRenderTargetCube,h=c(t);if(s){i.__webglFramebuffer=[];for(var l=0;6>l;l++)i.__webglFramebuffer[l]=e.createFramebuffer()}else i.__webglFramebuffer=e.createFramebuffer();if(s){for(r.bindTexture(e.TEXTURE_CUBE_MAP,o.__webglTexture),d(e.TEXTURE_CUBE_MAP,t.texture,h),l=0;6>l;l++)m(i.__webglFramebuffer[l],t,e.COLOR_ATTACHMENT0,e.TEXTURE_CUBE_MAP_POSITIVE_X+l);u(t.texture,h)&&e.generateMipmap(e.TEXTURE_CUBE_MAP),r.bindTexture(e.TEXTURE_CUBE_MAP,null)}else r.bindTexture(e.TEXTURE_2D,o.__webglTexture),d(e.TEXTURE_2D,t.texture,h),m(i.__webglFramebuffer,t,e.COLOR_ATTACHMENT0,e.TEXTURE_2D),u(t.texture,h)&&e.generateMipmap(e.TEXTURE_2D),r.bindTexture(e.TEXTURE_2D,null);if(t.depthBuffer){if(i=n.get(t),o=!0===t.isWebGLRenderTargetCube,t.depthTexture){if(o)throw Error("target.depthTexture not supported in Cube render targets");if(t&&t.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");if(e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer),!t.depthTexture||!t.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");if(n.get(t.depthTexture).__webglTexture&&t.depthTexture.image.width===t.width&&t.depthTexture.image.height===t.height||(t.depthTexture.image.width=t.width,t.depthTexture.image.height=t.height,t.depthTexture.needsUpdate=!0),f(t.depthTexture,0),i=n.get(t.depthTexture).__webglTexture,1026===t.depthTexture.format)e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,i,0);else{if(1027!==t.depthTexture.format)throw Error("Unknown depthTexture format");e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,i,0)}}else if(o)for(i.__webglDepthbuffer=[],o=0;6>o;o++)e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer[o]),i.__webglDepthbuffer[o]=e.createRenderbuffer(),v(i.__webglDepthbuffer[o],t);else e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer),i.__webglDepthbuffer=e.createRenderbuffer(),v(i.__webglDepthbuffer,t);e.bindFramebuffer(e.FRAMEBUFFER,null)}},this.updateRenderTargetMipmap=function(t){var i=t.texture;u(i,c(t))&&(t=t.isWebGLRenderTargetCube?e.TEXTURE_CUBE_MAP:e.TEXTURE_2D,i=n.get(i).__webglTexture,r.bindTexture(t,i),e.generateMipmap(t),r.bindTexture(t,null))}}function it(){var e={};return{get:function(t){t=t.uuid;var r=e[t];return void 0===r&&(r={},e[t]=r),r},remove:function(t){delete e[t.uuid]},clear:function(){e={}}}}function ot(e,t,r){function n(t,r,n){var i=new Uint8Array(4),o=e.createTexture();for(e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST),t=0;t<n;t++)e.texImage2D(r+t,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,i);return o}function o(t){!0!==b[t]&&(e.enable(t),b[t]=!0)}function a(t){!1!==b[t]&&(e.disable(t),b[t]=!1)}function s(t,n,i,s,c,u,h,l){0!==t?o(e.BLEND):a(e.BLEND),5===t||t===x&&l===O||(2===t?l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ONE,e.ONE,e.ONE,e.ONE)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.SRC_ALPHA,e.ONE)):3===t?l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ZERO,e.ZERO,e.ONE_MINUS_SRC_COLOR,e.ONE_MINUS_SRC_ALPHA)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR)):4===t?l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ZERO,e.SRC_COLOR,e.ZERO,e.SRC_ALPHA)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ZERO,e.SRC_COLOR)):l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ONE,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)):(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)),x=t,O=l),5===t?(c=c||n,u=u||i,h=h||s,n===w&&c===E||(e.blendEquationSeparate(r(n),r(c)),w=n,E=c),i===S&&s===M&&u===C&&h===T||(e.blendFuncSeparate(r(i),r(s),r(u),r(h)),S=i,M=s,C=u,T=h)):T=C=E=M=S=w=null}function c(t){P!==t&&(t?e.frontFace(e.CW):e.frontFace(e.CCW),P=t)}function u(t){0!==t?(o(e.CULL_FACE),t!==j&&(1===t?e.cullFace(e.BACK):2===t?e.cullFace(e.FRONT):e.cullFace(e.FRONT_AND_BACK))):a(e.CULL_FACE),j=t}function h(t,r,n){t?(o(e.POLYGON_OFFSET_FILL),(R!==r||L!==n)&&(e.polygonOffset(r,n),R=r,L=n)):a(e.POLYGON_OFFSET_FILL)}function l(t){void 0===t&&(t=e.TEXTURE0+I-1),k!==t&&(e.activeTexture(t),k=t)}var p=new function(){var t=!1,r=new i,n=null,o=new i;return{setMask:function(r){n===r||t||(e.colorMask(r,r,r,r),n=r)},setLocked:function(e){t=e},setClear:function(t,n,i,a,s){!0===s&&(t*=a,n*=a,i*=a),r.set(t,n,i,a),!1===o.equals(r)&&(e.clearColor(t,n,i,a),o.copy(r))},reset:function(){t=!1,n=null,o.set(0,0,0,1)}}},f=new function(){var t=!1,r=null,n=null,i=null;return{setTest:function(t){t?o(e.DEPTH_TEST):a(e.DEPTH_TEST)},setMask:function(n){r===n||t||(e.depthMask(n),r=n)},setFunc:function(t){if(n!==t){if(t)switch(t){case 0:e.depthFunc(e.NEVER);break;case 1:e.depthFunc(e.ALWAYS);break;case 2:e.depthFunc(e.LESS);break;case 3:e.depthFunc(e.LEQUAL);break;case 4:e.depthFunc(e.EQUAL);break;case 5:e.depthFunc(e.GEQUAL);break;case 6:e.depthFunc(e.GREATER);break;case 7:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}else e.depthFunc(e.LEQUAL);n=t}},setLocked:function(e){t=e},setClear:function(t){i!==t&&(e.clearDepth(t),i=t)},reset:function(){t=!1,i=n=r=null}}},d=new function(){var t=!1,r=null,n=null,i=null,s=null,c=null,u=null,h=null,l=null;return{setTest:function(t){t?o(e.STENCIL_TEST):a(e.STENCIL_TEST)},setMask:function(n){r===n||t||(e.stencilMask(n),r=n)},setFunc:function(t,r,o){n===t&&i===r&&s===o||(e.stencilFunc(t,r,o),n=t,i=r,s=o)},setOp:function(t,r,n){c===t&&u===r&&h===n||(e.stencilOp(t,r,n),c=t,u=r,h=n)},setLocked:function(e){t=e},setClear:function(t){l!==t&&(e.clearStencil(t),l=t)},reset:function(){t=!1,l=h=u=c=s=i=n=r=null}}},m=e.getParameter(e.MAX_VERTEX_ATTRIBS),v=new Uint8Array(m),g=new Uint8Array(m),y=new Uint8Array(m),b={},_=null,x=null,w=null,S=null,M=null,E=null,C=null,T=null,O=!1,P=null,j=null,A=null,R=null,L=null,N=null,I=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS),m=parseFloat(/^WebGL\ ([0-9])/.exec(e.getParameter(e.VERSION))[1]),D=1<=parseFloat(m),k=null,B={},F=new i,U=new i,z={};return z[e.TEXTURE_2D]=n(e.TEXTURE_2D,e.TEXTURE_2D,1),z[e.TEXTURE_CUBE_MAP]=n(e.TEXTURE_CUBE_MAP,e.TEXTURE_CUBE_MAP_POSITIVE_X,6),{buffers:{color:p,depth:f,stencil:d},init:function(){p.setClear(0,0,0,1),f.setClear(1),d.setClear(0),o(e.DEPTH_TEST),f.setFunc(3),c(!1),u(1),o(e.CULL_FACE),o(e.BLEND),s(1)},initAttributes:function(){for(var e=0,t=v.length;e<t;e++)v[e]=0},enableAttribute:function(r){v[r]=1,0===g[r]&&(e.enableVertexAttribArray(r),g[r]=1),0!==y[r]&&(t.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(r,0),y[r]=0)},enableAttributeAndDivisor:function(r,n){v[r]=1,0===g[r]&&(e.enableVertexAttribArray(r),g[r]=1),y[r]!==n&&(t.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(r,n),y[r]=n)},disableUnusedAttributes:function(){for(var t=0,r=g.length;t!==r;++t)g[t]!==v[t]&&(e.disableVertexAttribArray(t),g[t]=0)},enable:o,disable:a,getCompressedTextureFormats:function(){if(null===_&&(_=[],t.get("WEBGL_compressed_texture_pvrtc")||t.get("WEBGL_compressed_texture_s3tc")||t.get("WEBGL_compressed_texture_etc1")))for(var r=e.getParameter(e.COMPRESSED_TEXTURE_FORMATS),n=0;n<r.length;n++)_.push(r[n]);return _},setBlending:s,setMaterial:function(t){2===t.side?a(e.CULL_FACE):o(e.CULL_FACE),c(1===t.side),!0===t.transparent?s(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha):s(0),f.setFunc(t.depthFunc),f.setTest(t.depthTest),f.setMask(t.depthWrite),p.setMask(t.colorWrite),h(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits)},setFlipSided:c,setCullFace:u,setLineWidth:function(t){t!==A&&(D&&e.lineWidth(t),A=t)},setPolygonOffset:h,getScissorTest:function(){return N},setScissorTest:function(t){(N=t)?o(e.SCISSOR_TEST):a(e.SCISSOR_TEST)},activeTexture:l,bindTexture:function(t,r){null===k&&l();var n=B[k];void 0===n&&(n={type:void 0,texture:void 0},B[k]=n),n.type===t&&n.texture===r||(e.bindTexture(t,r||z[t]),n.type=t,n.texture=r)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===F.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),F.copy(t))},viewport:function(t){!1===U.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),U.copy(t))},reset:function(){for(var t=0;t<g.length;t++)1===g[t]&&(e.disableVertexAttribArray(t),g[t]=0);b={},k=_=null,B={},j=P=x=null,p.reset(),f.reset(),d.reset()}}}function at(e,t,r){function n(t){if("highp"===t){if(0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.HIGH_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision)return"highp";t="mediump"}return"mediump"===t&&0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision?"mediump":"lowp"}var i,o=void 0!==r.precision?r.precision:"highp";(a=n(o))!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",a,"instead."),o=a),r=!0===r.logarithmicDepthBuffer&&!!t.get("EXT_frag_depth");var a=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),s=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),c=e.getParameter(e.MAX_TEXTURE_SIZE),u=e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),h=e.getParameter(e.MAX_VERTEX_ATTRIBS),l=e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),p=e.getParameter(e.MAX_VARYING_VECTORS),f=e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),d=0<s,m=!!t.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==i)return i;var r=t.get("EXT_texture_filter_anisotropic");return i=null!==r?e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:n,precision:o,logarithmicDepthBuffer:r,maxTextures:a,maxVertexTextures:s,maxTextureSize:c,maxCubemapSize:u,maxAttributes:h,maxVertexUniforms:l,maxVaryings:p,maxFragmentUniforms:f,vertexTextures:d,floatFragmentTextures:m,floatVertexTextures:d&&m}}function st(e){ce.call(this),this.cameras=e||[]}function ct(e){var t=this,r=null,n=null;"VRFrameData"in window&&(n=new window.VRFrameData);var o=new u,a=new u,s=new u,c=new ce;c.bounds=new i(0,0,.5,1),c.layers.enable(1);var h=new ce;h.bounds=new i(.5,0,.5,1),h.layers.enable(2);var l=new st([c,h]);l.layers.enable(1),l.layers.enable(2);var p,f;window.addEventListener("vrdisplaypresentchange",function(){if(r.isPresenting){var n=(i=r.getEyeParameters("left")).renderWidth,i=i.renderHeight;f=e.getPixelRatio(),p=e.getSize(),e.setDrawingBufferSize(2*n,i,1)}else t.enabled&&e.setDrawingBufferSize(p.width,p.height,f)},!1),this.standing=this.enabled=!1,this.getDevice=function(){return r},this.setDevice=function(e){void 0!==e&&(r=e)},this.getCamera=function(e){if(null===r)return e;r.depthNear=e.near,r.depthFar=e.far,r.getFrameData(n);var t=n.pose;return null!==t.position?e.position.fromArray(t.position):e.position.set(0,0,0),null!==t.orientation&&e.quaternion.fromArray(t.orientation),e.updateMatrixWorld(),t=r.stageParameters,this.standing&&t&&(a.fromArray(t.sittingToStandingTransform),s.getInverse(a),e.matrixWorld.multiply(a),e.matrixWorldInverse.multiply(s)),!1===r.isPresenting?e:(l.matrixWorld.copy(e.matrixWorld),l.matrixWorldInverse.copy(e.matrixWorldInverse),c.matrixWorldInverse.fromArray(n.leftViewMatrix),h.matrixWorldInverse.fromArray(n.rightViewMatrix),this.standing&&t&&(c.matrixWorldInverse.multiply(s),h.matrixWorldInverse.multiply(s)),null!==(e=e.parent)&&(o.getInverse(e.matrixWorld),c.matrixWorldInverse.multiply(o),h.matrixWorldInverse.multiply(o)),c.matrixWorld.getInverse(c.matrixWorldInverse),h.matrixWorld.getInverse(h.matrixWorldInverse),c.projectionMatrix.fromArray(n.leftProjectionMatrix),h.projectionMatrix.fromArray(n.rightProjectionMatrix),l.projectionMatrix.copy(c.projectionMatrix),(e=r.getLayers()).length&&(null!==(e=e[0]).leftBounds&&4===e.leftBounds.length&&c.bounds.fromArray(e.leftBounds),null!==e.rightBounds&&4===e.rightBounds.length&&h.bounds.fromArray(e.rightBounds)),l)},this.getStandingMatrix=function(){return a},this.submitFrame=function(){r&&r.isPresenting&&r.submitFrame()}}function ut(e){var t={};return{get:function(r){if(void 0!==t[r])return t[r];var n;switch(r){case"WEBGL_depth_texture":n=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case"WEBGL_compressed_texture_etc1":n=e.getExtension("WEBGL_compressed_texture_etc1");break;default:n=e.getExtension(r)}return null===n&&console.warn("THREE.WebGLRenderer: "+r+" extension not supported."),t[r]=n}}}function ht(){function e(){u.value!==n&&(u.value=n,u.needsUpdate=0<i),r.numPlanes=i,r.numIntersection=0}function t(e,t,n,i){var o=null!==e?e.length:0,a=null;if(0!==o){if(a=u.value,!0!==i||null===a)for(i=n+4*o,t=t.matrixWorldInverse,c.getNormalMatrix(t),(null===a||a.length<i)&&(a=new Float32Array(i)),i=0;i!==o;++i,n+=4)s.copy(e[i]).applyMatrix4(t,c),s.normal.toArray(a,n),a[n+3]=s.constant;u.value=a,u.needsUpdate=!0}return r.numPlanes=o,a}var r=this,n=null,i=0,o=!1,a=!1,s=new Q,c=new J,u={value:null,needsUpdate:!1};this.uniform=u,this.numIntersection=this.numPlanes=0,this.init=function(e,r,a){var s=0!==e.length||r||0!==i||o;return o=r,n=t(e,a,0),i=e.length,s},this.beginShadows=function(){a=!0,t(null)},this.endShadows=function(){a=!1,e()},this.setState=function(r,s,c,h,l,p){if(!o||null===r||0===r.length||a&&!c)a?t(null):e();else{var f=4*(c=a?0:i),d=l.clippingState||null;for(u.value=d,d=t(r,h,f,p),r=0;r!==f;++r)d[r]=n[r];l.clippingState=d,this.numIntersection=s?this.numPlanes:0,this.numPlanes+=c}}}function lt(e){function t(){ye.init(),ye.scissor(V.copy(J).multiplyScalar(Z)),ye.viewport(W.copy(ne).multiplyScalar(Z))}function r(){U=I=null,F="",B=-1,ye.reset()}function n(e){e.preventDefault(),r(),t(),be.clear(),Me.clear()}function o(e){(e=e.target).removeEventListener("dispose",o),a(e),be.remove(e)}function a(e){var t=be.get(e).program;e.program=void 0,void 0!==t&&Ee.releaseProgram(t)}function s(e,t,r){e.render(function(e){N.renderBufferImmediate(e,t,r)})}function l(e,t){return Math.abs(t[0])-Math.abs(e[0])}function p(e,t,r){if(e.visible){if(e.layers.test(t.layers))if(e.isLight)P.push(e);else if(e.isSprite)e.frustumCulled&&!ie.intersectsSprite(e)||R.push(e);else if(e.isLensFlare)L.push(e);else if(e.isImmediateRenderObject)r&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce),j.push(e,null,e.material,ue.z,null);else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.update(),!e.frustumCulled||ie.intersectsObject(e))){r&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);var n=Me.update(e),i=e.material;if(Array.isArray(i))for(var o=n.groups,a=0,s=o.length;a<s;a++){var c=o[a],u=i[c.materialIndex];u&&u.visible&&j.push(e,n,u,ue.z,c)}else i.visible&&j.push(e,n,i,ue.z,null)}for(a=0,s=(e=e.children).length;a<s;a++)p(e[a],t,r)}}function f(e,t,r,n){for(var i=0,o=e.length;i<o;i++){var a=(u=e[i]).object,s=u.geometry,c=void 0===n?u.material:n,u=u.group;if(r.isArrayCamera){z=r;for(var h=r.cameras,l=0,p=h.length;l<p;l++){var f=h[l];if(a.layers.test(f.layers)){var m=(y=f.bounds).x*Y,v=y.y*K,g=y.z*Y,y=y.w*K;N.setViewport(m,v,g,y),N.setScissor(m,v,g,y),N.setScissorTest(!0),d(a,t,f,s,c,u)}}}else z=null,d(a,t,r,s,c,u)}}function d(e,t,r,n,i,o){if(e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),e.onBeforeRender(N,t,r,n,i,o),e.isImmediateRenderObject){ye.setMaterial(i);var a=v(r,t.fog,i,e);F="",s(e,a,i)}else N.renderBufferDirect(r,t.fog,n,i,e,o);e.onAfterRender(N,t,r,n,i,o)}function m(e,t,r){var n=be.get(e);r=Ee.getParameters(e,pe,t,oe.numPlanes,oe.numIntersection,r);var i=Ee.getProgramCode(e,r),s=n.program,c=!0;if(void 0===s)e.addEventListener("dispose",o);else if(s.code!==i)a(e);else{if(void 0!==r.shaderID)return;c=!1}if(c&&(r.shaderID?(s=Ni[r.shaderID],n.shader={name:e.type,uniforms:Ri.clone(s.uniforms),vertexShader:s.vertexShader,fragmentShader:s.fragmentShader}):n.shader={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader},e.onBeforeCompile(n.shader),s=Ee.acquireProgram(e,n.shader,r,i),n.program=s,e.program=s),r=s.getAttributes(),e.morphTargets)for(i=e.numSupportedMorphTargets=0;i<N.maxMorphTargets;i++)0<=r["morphTarget"+i]&&e.numSupportedMorphTargets++;if(e.morphNormals)for(i=e.numSupportedMorphNormals=0;i<N.maxMorphNormals;i++)0<=r["morphNormal"+i]&&e.numSupportedMorphNormals++;r=n.shader.uniforms,(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(n.numClippingPlanes=oe.numPlanes,n.numIntersection=oe.numIntersection,r.clippingPlanes=oe.uniform),n.fog=t,n.lightsHash=pe.hash,e.lights&&(r.ambientLightColor.value=pe.ambient,r.directionalLights.value=pe.directional,r.spotLights.value=pe.spot,r.rectAreaLights.value=pe.rectArea,r.pointLights.value=pe.point,r.hemisphereLights.value=pe.hemi,r.directionalShadowMap.value=pe.directionalShadowMap,r.directionalShadowMatrix.value=pe.directionalShadowMatrix,r.spotShadowMap.value=pe.spotShadowMap,r.spotShadowMatrix.value=pe.spotShadowMatrix,r.pointShadowMap.value=pe.pointShadowMap,r.pointShadowMatrix.value=pe.pointShadowMatrix),e=n.program.getUniforms(),e=$.seqWithValue(e.seq,r),n.uniformsList=e}function v(e,t,r,n){X=0;var i=be.get(r);ae&&(se||e!==U)&&oe.setState(r.clippingPlanes,r.clipIntersection,r.clipShadows,e,i,e===U&&r.id===B),!1===r.needsUpdate&&(void 0===i.program?r.needsUpdate=!0:r.fog&&i.fog!==t?r.needsUpdate=!0:r.lights&&i.lightsHash!==pe.hash?r.needsUpdate=!0:void 0===i.numClippingPlanes||i.numClippingPlanes===oe.numPlanes&&i.numIntersection===oe.numIntersection||(r.needsUpdate=!0)),r.needsUpdate&&(m(r,t,n),r.needsUpdate=!1);var o=!1,a=!1,s=!1,c=i.program,u=c.getUniforms(),l=i.shader.uniforms;if(c.id!==I&&(me.useProgram(c.program),I=c.id,s=a=o=!0),r.id!==B&&(B=r.id,a=!0),(o||e!==U)&&(u.setValue(me,"projectionMatrix",e.projectionMatrix),ge.logarithmicDepthBuffer&&u.setValue(me,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),U!==(z||e)&&(U=z||e,s=a=!0),(r.isShaderMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.envMap)&&void 0!==(o=u.map.cameraPosition)&&o.setValue(me,ue.setFromMatrixPosition(e.matrixWorld)),(r.isMeshPhongMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial||r.skinning)&&u.setValue(me,"viewMatrix",e.matrixWorldInverse)),r.skinning&&(u.setOptional(me,n,"bindMatrix"),u.setOptional(me,n,"bindMatrixInverse"),e=n.skeleton))if(o=e.bones,ge.floatVertexTextures){if(void 0===e.boneTexture){var o=Math.sqrt(4*o.length),o=xi.nextPowerOfTwo(Math.ceil(o)),o=Math.max(o,4),p=new Float32Array(o*o*4);p.set(e.boneMatrices);var f=new h(p,o,o,1023,1015);e.boneMatrices=p,e.boneTexture=f,e.boneTextureSize=o}u.setValue(me,"boneTexture",e.boneTexture),u.setValue(me,"boneTextureSize",e.boneTextureSize)}else u.setOptional(me,e,"boneMatrices");if(a){if(u.setValue(me,"toneMappingExposure",N.toneMappingExposure),u.setValue(me,"toneMappingWhitePoint",N.toneMappingWhitePoint),r.lights&&(a=s,l.ambientLightColor.needsUpdate=a,l.directionalLights.needsUpdate=a,l.pointLights.needsUpdate=a,l.spotLights.needsUpdate=a,l.rectAreaLights.needsUpdate=a,l.hemisphereLights.needsUpdate=a),t&&r.fog&&(l.fogColor.value=t.color,t.isFog?(l.fogNear.value=t.near,l.fogFar.value=t.far):t.isFogExp2&&(l.fogDensity.value=t.density)),r.isMeshBasicMaterial||r.isMeshLambertMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.isMeshNormalMaterial||r.isMeshDepthMaterial){l.opacity.value=r.opacity,l.diffuse.value=r.color,r.emissive&&l.emissive.value.copy(r.emissive).multiplyScalar(r.emissiveIntensity),l.map.value=r.map,l.specularMap.value=r.specularMap,l.alphaMap.value=r.alphaMap,r.lightMap&&(l.lightMap.value=r.lightMap,l.lightMapIntensity.value=r.lightMapIntensity),r.aoMap&&(l.aoMap.value=r.aoMap,l.aoMapIntensity.value=r.aoMapIntensity);var d;r.map?d=r.map:r.specularMap?d=r.specularMap:r.displacementMap?d=r.displacementMap:r.normalMap?d=r.normalMap:r.bumpMap?d=r.bumpMap:r.roughnessMap?d=r.roughnessMap:r.metalnessMap?d=r.metalnessMap:r.alphaMap?d=r.alphaMap:r.emissiveMap&&(d=r.emissiveMap),void 0!==d&&(d.isWebGLRenderTarget&&(d=d.texture),t=d.offset,d=d.repeat,l.offsetRepeat.value.set(t.x,t.y,d.x,d.y)),l.envMap.value=r.envMap,l.flipEnvMap.value=r.envMap&&r.envMap.isCubeTexture?-1:1,l.reflectivity.value=r.reflectivity,l.refractionRatio.value=r.refractionRatio}r.isLineBasicMaterial?(l.diffuse.value=r.color,l.opacity.value=r.opacity):r.isLineDashedMaterial?(l.diffuse.value=r.color,l.opacity.value=r.opacity,l.dashSize.value=r.dashSize,l.totalSize.value=r.dashSize+r.gapSize,l.scale.value=r.scale):r.isPointsMaterial?(l.diffuse.value=r.color,l.opacity.value=r.opacity,l.size.value=r.size*Z,l.scale.value=.5*K,l.map.value=r.map,null!==r.map&&(d=r.map.offset,r=r.map.repeat,l.offsetRepeat.value.set(d.x,d.y,r.x,r.y))):r.isMeshLambertMaterial?r.emissiveMap&&(l.emissiveMap.value=r.emissiveMap):r.isMeshToonMaterial?(g(l,r),r.gradientMap&&(l.gradientMap.value=r.gradientMap)):r.isMeshPhongMaterial?g(l,r):r.isMeshPhysicalMaterial?(l.clearCoat.value=r.clearCoat,l.clearCoatRoughness.value=r.clearCoatRoughness,y(l,r)):r.isMeshStandardMaterial?y(l,r):r.isMeshDepthMaterial?r.displacementMap&&(l.displacementMap.value=r.displacementMap,l.displacementScale.value=r.displacementScale,l.displacementBias.value=r.displacementBias):r.isMeshNormalMaterial&&(r.bumpMap&&(l.bumpMap.value=r.bumpMap,l.bumpScale.value=r.bumpScale),r.normalMap&&(l.normalMap.value=r.normalMap,l.normalScale.value.copy(r.normalScale)),r.displacementMap&&(l.displacementMap.value=r.displacementMap,l.displacementScale.value=r.displacementScale,l.displacementBias.value=r.displacementBias)),void 0!==l.ltcMat&&(l.ltcMat.value=Ai.LTC_MAT_TEXTURE),void 0!==l.ltcMag&&(l.ltcMag.value=Ai.LTC_MAG_TEXTURE),$.upload(me,i.uniformsList,l,N)}return u.setValue(me,"modelViewMatrix",n.modelViewMatrix),u.setValue(me,"normalMatrix",n.normalMatrix),u.setValue(me,"modelMatrix",n.matrixWorld),c}function g(e,t){e.specular.value=t.specular,e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap),t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale)),t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}function y(e,t){e.roughness.value=t.roughness,e.metalness.value=t.metalness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap),t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap),t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale)),t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias),t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}function b(e,t){var r,n,i,o,a,s,c,u=0,h=0,l=0,p=t.matrixWorldInverse,f=0,d=0,m=0,v=0,g=0;for(r=0,n=e.length;r<n;r++)if(i=e[r],o=i.color,a=i.intensity,s=i.distance,c=i.shadow&&i.shadow.map?i.shadow.map.texture:null,i.isAmbientLight)u+=o.r*a,h+=o.g*a,l+=o.b*a;else if(i.isDirectionalLight){var y=Ce.get(i);y.color.copy(i.color).multiplyScalar(i.intensity),y.direction.setFromMatrixPosition(i.matrixWorld),ue.setFromMatrixPosition(i.target.matrixWorld),y.direction.sub(ue),y.direction.transformDirection(p),(y.shadow=i.castShadow)&&(o=i.shadow,y.shadowBias=o.bias,y.shadowRadius=o.radius,y.shadowMapSize=o.mapSize),pe.directionalShadowMap[f]=c,pe.directionalShadowMatrix[f]=i.shadow.matrix,pe.directional[f]=y,f++}else i.isSpotLight?((y=Ce.get(i)).position.setFromMatrixPosition(i.matrixWorld),y.position.applyMatrix4(p),y.color.copy(o).multiplyScalar(a),y.distance=s,y.direction.setFromMatrixPosition(i.matrixWorld),ue.setFromMatrixPosition(i.target.matrixWorld),y.direction.sub(ue),y.direction.transformDirection(p),y.coneCos=Math.cos(i.angle),y.penumbraCos=Math.cos(i.angle*(1-i.penumbra)),y.decay=0===i.distance?0:i.decay,(y.shadow=i.castShadow)&&(o=i.shadow,y.shadowBias=o.bias,y.shadowRadius=o.radius,y.shadowMapSize=o.mapSize),pe.spotShadowMap[m]=c,pe.spotShadowMatrix[m]=i.shadow.matrix,pe.spot[m]=y,m++):i.isRectAreaLight?((y=Ce.get(i)).color.copy(o).multiplyScalar(a/(i.width*i.height)),y.position.setFromMatrixPosition(i.matrixWorld),y.position.applyMatrix4(p),le.identity(),he.copy(i.matrixWorld),he.premultiply(p),le.extractRotation(he),y.halfWidth.set(.5*i.width,0,0),y.halfHeight.set(0,.5*i.height,0),y.halfWidth.applyMatrix4(le),y.halfHeight.applyMatrix4(le),pe.rectArea[v]=y,v++):i.isPointLight?((y=Ce.get(i)).position.setFromMatrixPosition(i.matrixWorld),y.position.applyMatrix4(p),y.color.copy(i.color).multiplyScalar(i.intensity),y.distance=i.distance,y.decay=0===i.distance?0:i.decay,(y.shadow=i.castShadow)&&(o=i.shadow,y.shadowBias=o.bias,y.shadowRadius=o.radius,y.shadowMapSize=o.mapSize),pe.pointShadowMap[d]=c,pe.pointShadowMatrix[d]=i.shadow.matrix,pe.point[d]=y,d++):i.isHemisphereLight&&((y=Ce.get(i)).direction.setFromMatrixPosition(i.matrixWorld),y.direction.transformDirection(p),y.direction.normalize(),y.skyColor.copy(i.color).multiplyScalar(a),y.groundColor.copy(i.groundColor).multiplyScalar(a),pe.hemi[g]=y,g++);pe.ambient[0]=u,pe.ambient[1]=h,pe.ambient[2]=l,pe.directional.length=f,pe.spot.length=m,pe.rectArea.length=v,pe.point.length=d,pe.hemi.length=g,pe.hash=f+","+d+","+m+","+v+","+g+","+pe.shadows.length}function _(e){var t;if(1e3===e)return me.REPEAT;if(1001===e)return me.CLAMP_TO_EDGE;if(1002===e)return me.MIRRORED_REPEAT;if(1003===e)return me.NEAREST;if(1004===e)return me.NEAREST_MIPMAP_NEAREST;if(1005===e)return me.NEAREST_MIPMAP_LINEAR;if(1006===e)return me.LINEAR;if(1007===e)return me.LINEAR_MIPMAP_NEAREST;if(1008===e)return me.LINEAR_MIPMAP_LINEAR;if(1009===e)return me.UNSIGNED_BYTE;if(1017===e)return me.UNSIGNED_SHORT_4_4_4_4;if(1018===e)return me.UNSIGNED_SHORT_5_5_5_1;if(1019===e)return me.UNSIGNED_SHORT_5_6_5;if(1010===e)return me.BYTE;if(1011===e)return me.SHORT;if(1012===e)return me.UNSIGNED_SHORT;if(1013===e)return me.INT;if(1014===e)return me.UNSIGNED_INT;if(1015===e)return me.FLOAT;if(1016===e&&null!==(t=ve.get("OES_texture_half_float")))return t.HALF_FLOAT_OES;if(1021===e)return me.ALPHA;if(1022===e)return me.RGB;if(1023===e)return me.RGBA;if(1024===e)return me.LUMINANCE;if(1025===e)return me.LUMINANCE_ALPHA;if(1026===e)return me.DEPTH_COMPONENT;if(1027===e)return me.DEPTH_STENCIL;if(100===e)return me.FUNC_ADD;if(101===e)return me.FUNC_SUBTRACT;if(102===e)return me.FUNC_REVERSE_SUBTRACT;if(200===e)return me.ZERO;if(201===e)return me.ONE;if(202===e)return me.SRC_COLOR;if(203===e)return me.ONE_MINUS_SRC_COLOR;if(204===e)return me.SRC_ALPHA;if(205===e)return me.ONE_MINUS_SRC_ALPHA;if(206===e)return me.DST_ALPHA;if(207===e)return me.ONE_MINUS_DST_ALPHA;if(208===e)return me.DST_COLOR;if(209===e)return me.ONE_MINUS_DST_COLOR;if(210===e)return me.SRC_ALPHA_SATURATE;if((2001===e||2002===e||2003===e||2004===e)&&null!==(t=ve.get("WEBGL_compressed_texture_s3tc"))){if(2001===e)return t.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===e)return t.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===e)return t.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===e)return t.COMPRESSED_RGBA_S3TC_DXT5_EXT}if((2100===e||2101===e||2102===e||2103===e)&&null!==(t=ve.get("WEBGL_compressed_texture_pvrtc"))){if(2100===e)return t.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===e)return t.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===e)return t.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===e)return t.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===e&&null!==(t=ve.get("WEBGL_compressed_texture_etc1")))return t.COMPRESSED_RGB_ETC1_WEBGL;if((103===e||104===e)&&null!==(t=ve.get("EXT_blend_minmax"))){if(103===e)return t.MIN_EXT;if(104===e)return t.MAX_EXT}return 1020===e&&null!==(t=ve.get("WEBGL_depth_texture"))?t.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","86");var x=void 0!==(e=e||{}).canvas?e.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),w=void 0!==e.context?e.context:null,S=void 0!==e.alpha&&e.alpha,M=void 0===e.depth||e.depth,E=void 0===e.stencil||e.stencil,C=void 0!==e.antialias&&e.antialias,T=void 0===e.premultipliedAlpha||e.premultipliedAlpha,O=void 0!==e.preserveDrawingBuffer&&e.preserveDrawingBuffer,P=[],j=null,A=new Float32Array(8),R=[],L=[];this.domElement=x,this.context=null,this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1,this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1,this.maxMorphTargets=8,this.maxMorphNormals=4;var N=this,I=null,D=null,k=null,B=-1,F="",U=null,z=null,V=new i,G=null,W=new i,X=0,Y=x.width,K=x.height,Z=1,J=new i(0,0,Y,K),Q=!1,ne=new i(0,0,Y,K),ie=new ee,oe=new ht,ae=!1,se=!1,ce=new u,ue=new c,he=new u,le=new u,pe={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},fe={geometries:0,textures:0},de={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:de,memory:fe,programs:null};var me;try{if(S={alpha:S,depth:M,stencil:E,antialias:C,premultipliedAlpha:T,preserveDrawingBuffer:O},null===(me=w||x.getContext("webgl",S)||x.getContext("experimental-webgl",S))){if(null!==x.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context."}void 0===me.getShaderPrecisionFormat&&(me.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}}),x.addEventListener("webglcontextlost",n,!1)}catch(e){console.error("THREE.WebGLRenderer: "+e)}var ve=new ut(me);ve.get("WEBGL_depth_texture"),ve.get("OES_texture_float"),ve.get("OES_texture_float_linear"),ve.get("OES_texture_half_float"),ve.get("OES_texture_half_float_linear"),ve.get("OES_standard_derivatives"),ve.get("ANGLE_instanced_arrays"),ve.get("OES_element_index_uint")&&(Se.MaxIndex=4294967296);var ge=new at(me,ve,e),ye=new ot(me,ve,_),be=new it,_e=new nt(me,ve,ye,be,ge,_,fe),xe=new re(me),we=new Ue(me,xe,fe),Me=new $e(me,we,de),Ee=new rt(this,ge),Ce=new ze,Te=new ke,Oe=new Le(this,ye,Me,T),Pe=new ct(this);this.info.programs=Ee.programs;var je=new Fe(me,ve,de),Ae=new Be(me,ve,de);t(),this.context=me,this.capabilities=ge,this.extensions=ve,this.properties=be,this.renderLists=Te,this.state=ye,this.vr=Pe;var Re=new te(this,pe,Me,ge);this.shadowMap=Re;var Ne=new q(this,R),Ie=new H(this,L);this.getContext=function(){return me},this.getContextAttributes=function(){return me.getContextAttributes()},this.forceContextLoss=function(){var e=ve.get("WEBGL_lose_context");e&&e.loseContext()},this.getMaxAnisotropy=function(){return ge.getMaxAnisotropy()},this.getPrecision=function(){return ge.precision},this.getPixelRatio=function(){return Z},this.setPixelRatio=function(e){void 0!==e&&(Z=e,this.setSize(Y,K,!1))},this.getSize=function(){return{width:Y,height:K}},this.setSize=function(e,t,r){var n=Pe.getDevice();n&&n.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(Y=e,K=t,x.width=e*Z,x.height=t*Z,!1!==r&&(x.style.width=e+"px",x.style.height=t+"px"),this.setViewport(0,0,e,t))},this.getDrawingBufferSize=function(){return{width:Y*Z,height:K*Z}},this.setDrawingBufferSize=function(e,t,r){Y=e,K=t,Z=r,x.width=e*r,x.height=t*r,this.setViewport(0,0,e,t)},this.setViewport=function(e,t,r,n){ne.set(e,K-t-n,r,n),ye.viewport(W.copy(ne).multiplyScalar(Z))},this.setScissor=function(e,t,r,n){J.set(e,K-t-n,r,n),ye.scissor(V.copy(J).multiplyScalar(Z))},this.setScissorTest=function(e){ye.setScissorTest(Q=e)},this.getClearColor=Oe.getClearColor,this.setClearColor=Oe.setClearColor,this.getClearAlpha=Oe.getClearAlpha,this.setClearAlpha=Oe.setClearAlpha,this.clear=function(e,t,r){var n=0;(void 0===e||e)&&(n|=me.COLOR_BUFFER_BIT),(void 0===t||t)&&(n|=me.DEPTH_BUFFER_BIT),(void 0===r||r)&&(n|=me.STENCIL_BUFFER_BIT),me.clear(n)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.clearTarget=function(e,t,r,n){this.setRenderTarget(e),this.clear(t,r,n)},this.resetGLState=r,this.dispose=function(){x.removeEventListener("webglcontextlost",n,!1),Te.dispose()},this.renderBufferImmediate=function(e,t,r){ye.initAttributes();var n=be.get(e);if(e.hasPositions&&!n.position&&(n.position=me.createBuffer()),e.hasNormals&&!n.normal&&(n.normal=me.createBuffer()),e.hasUvs&&!n.uv&&(n.uv=me.createBuffer()),e.hasColors&&!n.color&&(n.color=me.createBuffer()),t=t.getAttributes(),e.hasPositions&&(me.bindBuffer(me.ARRAY_BUFFER,n.position),me.bufferData(me.ARRAY_BUFFER,e.positionArray,me.DYNAMIC_DRAW),ye.enableAttribute(t.position),me.vertexAttribPointer(t.position,3,me.FLOAT,!1,0,0)),e.hasNormals){if(me.bindBuffer(me.ARRAY_BUFFER,n.normal),!r.isMeshPhongMaterial&&!r.isMeshStandardMaterial&&!r.isMeshNormalMaterial&&1===r.shading)for(var i=0,o=3*e.count;i<o;i+=9){var a=e.normalArray,s=(a[i+0]+a[i+3]+a[i+6])/3,c=(a[i+1]+a[i+4]+a[i+7])/3,u=(a[i+2]+a[i+5]+a[i+8])/3;a[i+0]=s,a[i+1]=c,a[i+2]=u,a[i+3]=s,a[i+4]=c,a[i+5]=u,a[i+6]=s,a[i+7]=c,a[i+8]=u}me.bufferData(me.ARRAY_BUFFER,e.normalArray,me.DYNAMIC_DRAW),ye.enableAttribute(t.normal),me.vertexAttribPointer(t.normal,3,me.FLOAT,!1,0,0)}e.hasUvs&&r.map&&(me.bindBuffer(me.ARRAY_BUFFER,n.uv),me.bufferData(me.ARRAY_BUFFER,e.uvArray,me.DYNAMIC_DRAW),ye.enableAttribute(t.uv),me.vertexAttribPointer(xe.uv,2,me.FLOAT,!1,0,0)),e.hasColors&&0!==r.vertexColors&&(me.bindBuffer(me.ARRAY_BUFFER,n.color),me.bufferData(me.ARRAY_BUFFER,e.colorArray,me.DYNAMIC_DRAW),ye.enableAttribute(t.color),me.vertexAttribPointer(t.color,3,me.FLOAT,!1,0,0)),ye.disableUnusedAttributes(),me.drawArrays(me.TRIANGLES,0,e.count),e.count=0},this.renderBufferDirect=function(e,t,r,n,i,o){ye.setMaterial(n);var a=v(e,t,n,i),s=!1;if((e=r.id+"_"+a.id+"_"+(!0===n.wireframe))!==F&&(F=e,s=!0),void 0!==(t=i.morphTargetInfluences)){var c=[];e=0;for(var u=t.length;e<u;e++)s=t[e],c.push([s,e]);c.sort(l),8<c.length&&(c.length=8);f=r.morphAttributes;for(e=0,u=c.length;e<u;e++)s=c[e],A[e]=s[0],0!==s[0]?(t=s[1],!0===n.morphTargets&&f.position&&r.addAttribute("morphTarget"+e,f.position[t]),!0===n.morphNormals&&f.normal&&r.addAttribute("morphNormal"+e,f.normal[t])):(!0===n.morphTargets&&r.removeAttribute("morphTarget"+e),!0===n.morphNormals&&r.removeAttribute("morphNormal"+e));for(e=c.length,t=A.length;e<t;e++)A[e]=0;a.getUniforms().setValue(me,"morphTargetInfluences",A),s=!0}t=r.index,u=r.attributes.position,c=1,!0===n.wireframe&&(t=we.getWireframeAttribute(r),c=2);var h;if(e=je,null!==t&&(h=xe.get(t),(e=Ae).setIndex(h)),s){if(s=void 0,r&&r.isInstancedBufferGeometry&&null===ve.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===s&&(s=0),ye.initAttributes();var p,f=r.attributes,a=a.getAttributes(),d=n.defaultAttributeValues;for(p in a){var m=a[p];if(0<=m)if(void 0!==(M=f[p])){var g=M.normalized,y=M.itemSize,b=(x=xe.get(M)).buffer,_=x.type,x=x.bytesPerElement;if(M.isInterleavedBufferAttribute){var w=M.data,S=w.stride,M=M.offset;w&&w.isInstancedInterleavedBuffer?(ye.enableAttributeAndDivisor(m,w.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=w.meshPerAttribute*w.count)):ye.enableAttribute(m),me.bindBuffer(me.ARRAY_BUFFER,b),me.vertexAttribPointer(m,y,_,g,S*x,(s*S+M)*x)}else M.isInstancedBufferAttribute?(ye.enableAttributeAndDivisor(m,M.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=M.meshPerAttribute*M.count)):ye.enableAttribute(m),me.bindBuffer(me.ARRAY_BUFFER,b),me.vertexAttribPointer(m,y,_,g,0,s*y*x)}else if(void 0!==d&&void 0!==(g=d[p]))switch(g.length){case 2:me.vertexAttrib2fv(m,g);break;case 3:me.vertexAttrib3fv(m,g);break;case 4:me.vertexAttrib4fv(m,g);break;default:me.vertexAttrib1fv(m,g)}}ye.disableUnusedAttributes()}null!==t&&me.bindBuffer(me.ELEMENT_ARRAY_BUFFER,h.buffer)}if(h=0,null!==t?h=t.count:void 0!==u&&(h=u.count),t=r.drawRange.start*c,u=null!==o?o.start*c:0,p=Math.max(t,u),0!==(o=Math.max(0,Math.min(h,t+r.drawRange.count*c,u+(null!==o?o.count*c:1/0))-1-p+1))){if(i.isMesh)if(!0===n.wireframe)ye.setLineWidth(n.wireframeLinewidth*(null===D?Z:1)),e.setMode(me.LINES);else switch(i.drawMode){case 0:e.setMode(me.TRIANGLES);break;case 1:e.setMode(me.TRIANGLE_STRIP);break;case 2:e.setMode(me.TRIANGLE_FAN)}else i.isLine?(void 0===(n=n.linewidth)&&(n=1),ye.setLineWidth(n*(null===D?Z:1)),i.isLineSegments?e.setMode(me.LINES):i.isLineLoop?e.setMode(me.LINE_LOOP):e.setMode(me.LINE_STRIP)):i.isPoints&&e.setMode(me.POINTS);r&&r.isInstancedBufferGeometry?0<r.maxInstancedCount&&e.renderInstances(r,p,o):e.render(p,o)}},this.compile=function(e,t){P=[],e.traverse(function(e){e.isLight&&P.push(e)}),b(P,t),e.traverse(function(t){if(t.material)if(Array.isArray(t.material))for(var r=0;r<t.material.length;r++)m(t.material[r],e.fog,t);else m(t.material,e.fog,t)})},this.animate=function(e){function t(){e(),(Pe.getDevice()||window).requestAnimationFrame(t)}(Pe.getDevice()||window).requestAnimationFrame(t)},this.render=function(e,t,r,n){if(t&&t.isCamera){F="",B=-1,U=null,!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),Pe.enabled&&(t=Pe.getCamera(t)),ce.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ie.setFromMatrix(ce),P.length=0,R.length=0,L.length=0,se=this.localClippingEnabled,ae=oe.init(this.clippingPlanes,se,t),(j=Te.get(e,t)).init(),p(e,t,N.sortObjects),j.finish(),!0===N.sortObjects&&j.sort(),ae&&oe.beginShadows();for(var i=P,o=0,a=0,s=i.length;a<s;a++){var c=i[a];c.castShadow&&(pe.shadows[o]=c,o++)}pe.shadows.length=o,Re.render(e,t),b(P,t),ae&&oe.endShadows(),de.frame++,de.calls=0,de.vertices=0,de.faces=0,de.points=0,void 0===r&&(r=null),this.setRenderTarget(r),Oe.render(e,t,n),n=j.opaque,i=j.transparent,e.overrideMaterial?(o=e.overrideMaterial,n.length&&f(n,e,t,o),i.length&&f(i,e,t,o)):(n.length&&f(n,e,t),i.length&&f(i,e,t)),Ne.render(e,t),Ie.render(e,t,W),r&&_e.updateRenderTargetMipmap(r),ye.buffers.depth.setTest(!0),ye.buffers.depth.setMask(!0),ye.buffers.color.setMask(!0),t.isArrayCamera&&N.setScissorTest(!1),Pe.enabled&&Pe.submitFrame()}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFaceCulling=function(e,t){ye.setCullFace(e),ye.setFlipSided(0===t)},this.allocTextureUnit=function(){var e=X;return e>=ge.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+e+" texture units while this GPU supports only "+ge.maxTextures),X+=1,e},this.setTexture2D=function(){var e=!1;return function(t,r){t&&t.isWebGLRenderTarget&&(e||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),e=!0),t=t.texture),_e.setTexture2D(t,r)}}(),this.setTexture=function(){var e=!1;return function(t,r){e||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),e=!0),_e.setTexture2D(t,r)}}(),this.setTextureCube=function(){var e=!1;return function(t,r){t&&t.isWebGLRenderTargetCube&&(e||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),e=!0),t=t.texture),t&&t.isCubeTexture||Array.isArray(t.image)&&6===t.image.length?_e.setTextureCube(t,r):_e.setTextureCubeDynamic(t,r)}}(),this.getRenderTarget=function(){return D},this.setRenderTarget=function(e){(D=e)&&void 0===be.get(e).__webglFramebuffer&&_e.setupRenderTarget(e);var t,r=e&&e.isWebGLRenderTargetCube;e?(t=be.get(e),t=r?t.__webglFramebuffer[e.activeCubeFace]:t.__webglFramebuffer,V.copy(e.scissor),G=e.scissorTest,W.copy(e.viewport)):(t=null,V.copy(J).multiplyScalar(Z),G=Q,W.copy(ne).multiplyScalar(Z)),k!==t&&(me.bindFramebuffer(me.FRAMEBUFFER,t),k=t),ye.scissor(V),ye.setScissorTest(G),ye.viewport(W),r&&(r=be.get(e.texture),me.framebufferTexture2D(me.FRAMEBUFFER,me.COLOR_ATTACHMENT0,me.TEXTURE_CUBE_MAP_POSITIVE_X+e.activeCubeFace,r.__webglTexture,e.activeMipMapLevel))},this.readRenderTargetPixels=function(e,t,r,n,i,o){if(e&&e.isWebGLRenderTarget){var a=be.get(e).__webglFramebuffer;if(a){var s=!1;a!==k&&(me.bindFramebuffer(me.FRAMEBUFFER,a),s=!0);try{var c=e.texture,u=c.format,h=c.type;1023!==u&&_(u)!==me.getParameter(me.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===h||_(h)===me.getParameter(me.IMPLEMENTATION_COLOR_READ_TYPE)||1015===h&&(ve.get("OES_texture_float")||ve.get("WEBGL_color_buffer_float"))||1016===h&&ve.get("EXT_color_buffer_half_float")?me.checkFramebufferStatus(me.FRAMEBUFFER)===me.FRAMEBUFFER_COMPLETE?0<=t&&t<=e.width-n&&0<=r&&r<=e.height-i&&me.readPixels(t,r,n,i,_(u),_(h),o):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{s&&me.bindFramebuffer(me.FRAMEBUFFER,k)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}}function pt(e,t){this.name="",this.color=new V(e),this.density=void 0!==t?t:25e-5}function ft(e,t,r){this.name="",this.color=new V(e),this.near=void 0!==t?t:1,this.far=void 0!==r?r:1e3}function dt(){oe.call(this),this.type="Scene",this.overrideMaterial=this.fog=this.background=null,this.autoUpdate=!0}function mt(e,t,r,n,i){oe.call(this),this.lensFlares=[],this.positionScreen=new c,this.customUpdateCallback=void 0,void 0!==e&&this.add(e,t,r,n,i)}function vt(e){W.call(this),this.type="SpriteMaterial",this.color=new V(16777215),this.map=null,this.rotation=0,this.lights=this.fog=!1,this.setValues(e)}function gt(e){oe.call(this),this.type="Sprite",this.material=void 0!==e?e:new vt}function yt(){oe.call(this),this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function bt(e,t){if(e=e||[],this.bones=e.slice(0),this.boneMatrices=new Float32Array(16*this.bones.length),void 0===t)this.calculateInverses();else if(this.bones.length===t.length)this.boneInverses=t.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[];for(var r=0,n=this.bones.length;r<n;r++)this.boneInverses.push(new u)}}function _t(){oe.call(this),this.type="Bone"}function xt(e,t){Re.call(this,e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new u,this.bindMatrixInverse=new u;var r=new bt(r=this.initBones());this.bind(r,this.matrixWorld),this.normalizeSkinWeights()}function wt(e){W.call(this),this.type="LineBasicMaterial",this.color=new V(16777215),this.linewidth=1,this.linejoin=this.linecap="round",this.lights=!1,this.setValues(e)}function St(e,t,r){if(1===r)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new Mt(e,t);oe.call(this),this.type="Line",this.geometry=void 0!==e?e:new Se,this.material=void 0!==t?t:new wt({color:16777215*Math.random()})}function Mt(e,t){St.call(this,e,t),this.type="LineSegments"}function Et(e,t){St.call(this,e,t),this.type="LineLoop"}function Ct(e){W.call(this),this.type="PointsMaterial",this.color=new V(16777215),this.map=null,this.size=1,this.sizeAttenuation=!0,this.lights=!1,this.setValues(e)}function Tt(e,t){oe.call(this),this.type="Points",this.geometry=void 0!==e?e:new Se,this.material=void 0!==t?t:new Ct({color:16777215*Math.random()})}function Ot(){oe.call(this),this.type="Group"}function Pt(e,t,r,i,o,a,s,c,u){function h(){requestAnimationFrame(h),e.readyState>=e.HAVE_CURRENT_DATA&&(l.needsUpdate=!0)}n.call(this,e,t,r,i,o,a,s,c,u),this.generateMipmaps=!1;var l=this;h()}function jt(e,t,r,i,o,a,s,c,u,h,l,p){n.call(this,null,a,s,c,u,h,i,o,l,p),this.image={width:t,height:r},this.mipmaps=e,this.generateMipmaps=this.flipY=!1}function At(e,t,r,i,o,a,s,c,u){n.call(this,e,t,r,i,o,a,s,c,u),this.needsUpdate=!0}function Rt(e,t,r,i,o,a,s,c,u,h){if(1026!==(h=void 0!==h?h:1026)&&1027!==h)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===r&&1026===h&&(r=1012),void 0===r&&1027===h&&(r=1020),n.call(this,null,i,o,a,s,c,h,r,u),this.image={width:e,height:t},this.magFilter=void 0!==s?s:1003,this.minFilter=void 0!==c?c:1003,this.generateMipmaps=this.flipY=!1}function Lt(e){Se.call(this),this.type="WireframeGeometry";var t,r,n,i,o,a,s=[],u=[0,0],h={},l=["a","b","c"];if(e&&e.isGeometry){var p=e.faces;for(t=0,n=p.length;t<n;t++){var f=p[t];for(r=0;3>r;r++)o=f[l[r]],a=f[l[(r+1)%3]],u[0]=Math.min(o,a),u[1]=Math.max(o,a),o=u[0]+","+u[1],void 0===h[o]&&(h[o]={index1:u[0],index2:u[1]})}for(o in h)t=h[o],l=e.vertices[t.index1],s.push(l.x,l.y,l.z),l=e.vertices[t.index2],s.push(l.x,l.y,l.z)}else if(e&&e.isBufferGeometry){var d,l=new c;if(null!==e.index){for(p=e.attributes.position,f=e.index,0===(d=e.groups).length&&(d=[{start:0,count:f.count,materialIndex:0}]),e=0,i=d.length;e<i;++e)for(t=d[e],r=t.start,n=t.count,t=r,n=r+n;t<n;t+=3)for(r=0;3>r;r++)o=f.getX(t+r),a=f.getX(t+(r+1)%3),u[0]=Math.min(o,a),u[1]=Math.max(o,a),o=u[0]+","+u[1],void 0===h[o]&&(h[o]={index1:u[0],index2:u[1]});for(o in h)t=h[o],l.fromBufferAttribute(p,t.index1),s.push(l.x,l.y,l.z),l.fromBufferAttribute(p,t.index2),s.push(l.x,l.y,l.z)}else for(p=e.attributes.position,t=0,n=p.count/3;t<n;t++)for(r=0;3>r;r++)h=3*t+r,l.fromBufferAttribute(p,h),s.push(l.x,l.y,l.z),h=3*t+(r+1)%3,l.fromBufferAttribute(p,h),s.push(l.x,l.y,l.z)}this.addAttribute("position",new be(s,3))}function Nt(e,t,r){he.call(this),this.type="ParametricGeometry",this.parameters={func:e,slices:t,stacks:r},this.fromBufferGeometry(new It(e,t,r)),this.mergeVertices()}function It(e,t,r){Se.call(this),this.type="ParametricBufferGeometry",this.parameters={func:e,slices:t,stacks:r};var n,i,o=[],a=[],s=[],u=[],h=new c,l=new c,p=new c,f=new c,d=new c,m=t+1;for(n=0;n<=r;n++){var v=n/r;for(i=0;i<=t;i++){var g=i/t,l=e(g,v,l);a.push(l.x,l.y,l.z),0<=g-1e-5?(p=e(g-1e-5,v,p),f.subVectors(l,p)):(p=e(g+1e-5,v,p),f.subVectors(p,l)),0<=v-1e-5?(p=e(g,v-1e-5,p),d.subVectors(l,p)):(p=e(g,v+1e-5,p),d.subVectors(p,l)),h.crossVectors(f,d).normalize(),s.push(h.x,h.y,h.z),u.push(g,v)}}for(n=0;n<r;n++)for(i=0;i<t;i++)e=n*m+i+1,h=(n+1)*m+i+1,l=(n+1)*m+i,o.push(n*m+i,e,l),o.push(e,h,l);this.setIndex(o),this.addAttribute("position",new be(a,3)),this.addAttribute("normal",new be(s,3)),this.addAttribute("uv",new be(u,2))}function Dt(e,t,r,n){he.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:e,indices:t,radius:r,detail:n},this.fromBufferGeometry(new kt(e,t,r,n)),this.mergeVertices()}function kt(e,t,n,i){function o(e){u.push(e.x,e.y,e.z)}function a(t,r){var n=3*t;r.x=e[n+0],r.y=e[n+1],r.z=e[n+2]}function s(e,t,r,n){0>n&&1===e.x&&(h[t]=e.x-1),0===r.x&&0===r.z&&(h[t]=n/2/Math.PI+.5)}Se.call(this),this.type="PolyhedronBufferGeometry",this.parameters={vertices:e,indices:t,radius:n,detail:i},n=n||1;var u=[],h=[];!function(e){for(var r=new c,n=new c,i=new c,s=0;s<t.length;s+=3){a(t[s+0],r),a(t[s+1],n),a(t[s+2],i);var u,h,l=r,p=n,f=i,d=Math.pow(2,e),m=[];for(u=0;u<=d;u++){m[u]=[];var v=l.clone().lerp(f,u/d),g=p.clone().lerp(f,u/d),y=d-u;for(h=0;h<=y;h++)m[u][h]=0===h&&u===d?v:v.clone().lerp(g,h/y)}for(u=0;u<d;u++)for(h=0;h<2*(d-u)-1;h++)l=Math.floor(h/2),0==h%2?(o(m[u][l+1]),o(m[u+1][l]),o(m[u][l])):(o(m[u][l+1]),o(m[u+1][l+1]),o(m[u+1][l]))}}(i=i||0),function(e){for(var t=new c,r=0;r<u.length;r+=3)t.x=u[r+0],t.y=u[r+1],t.z=u[r+2],t.normalize().multiplyScalar(e),u[r+0]=t.x,u[r+1]=t.y,u[r+2]=t.z}(n),function(){for(var e=new c,t=0;t<u.length;t+=3)e.x=u[t+0],e.y=u[t+1],e.z=u[t+2],h.push(Math.atan2(e.z,-e.x)/2/Math.PI+.5,1-(Math.atan2(-e.y,Math.sqrt(e.x*e.x+e.z*e.z))/Math.PI+.5));for(var e=new c,t=new c,n=new c,i=new c,o=new r,a=new r,l=new r,p=0,f=0;p<u.length;p+=9,f+=6){e.set(u[p+0],u[p+1],u[p+2]),t.set(u[p+3],u[p+4],u[p+5]),n.set(u[p+6],u[p+7],u[p+8]),o.set(h[f+0],h[f+1]),a.set(h[f+2],h[f+3]),l.set(h[f+4],h[f+5]),i.copy(e).add(t).add(n).divideScalar(3);var d=Math.atan2(i.z,-i.x);s(o,f+0,e,d),s(a,f+2,t,d),s(l,f+4,n,d)}for(e=0;e<h.length;e+=6)t=h[e+0],n=h[e+2],i=h[e+4],o=Math.min(t,n,i),.9<Math.max(t,n,i)&&.1>o&&(.2>t&&(h[e+0]+=1),.2>n&&(h[e+2]+=1),.2>i&&(h[e+4]+=1))}(),this.addAttribute("position",new be(u,3)),this.addAttribute("normal",new be(u.slice(),3)),this.addAttribute("uv",new be(h,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}function Bt(e,t){he.call(this),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Ft(e,t)),this.mergeVertices()}function Ft(e,t){kt.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Ut(e,t){he.call(this),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new zt(e,t)),this.mergeVertices()}function zt(e,t){kt.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronBufferGeometry",this.parameters={radius:e,detail:t}}function $t(e,t){he.call(this),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Vt(e,t)),this.mergeVertices()}function Vt(e,t){var r=(1+Math.sqrt(5))/2;kt.call(this,[-1,r,0,1,r,0,-1,-r,0,1,-r,0,0,-1,r,0,1,r,0,-1,-r,0,1,-r,r,0,-1,r,0,1,-r,0,-1,-r,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Gt(e,t){he.call(this),this.type="DodecahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Ht(e,t)),this.mergeVertices()}function Ht(e,t){var r=(1+Math.sqrt(5))/2,n=1/r;kt.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-r,0,-n,r,0,n,-r,0,n,r,-n,-r,0,-n,r,0,n,-r,0,n,r,0,-r,0,-n,r,0,-n,-r,0,n,r,0,n],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,t),this.type="DodecahedronBufferGeometry",this.parameters={radius:e,detail:t}}function qt(e,t,r,n,i,o){he.call(this),this.type="TubeGeometry",this.parameters={path:e,tubularSegments:t,radius:r,radialSegments:n,closed:i},void 0!==o&&console.warn("THREE.TubeGeometry: taper has been removed."),e=new Wt(e,t,r,n,i),this.tangents=e.tangents,this.normals=e.normals,this.binormals=e.binormals,this.fromBufferGeometry(e),this.mergeVertices()}function Wt(e,t,n,i,o){function a(r){var o=e.getPointAt(r/t),a=s.normals[r];for(r=s.binormals[r],h=0;h<=i;h++){var c=h/i*Math.PI*2,u=Math.sin(c),c=-Math.cos(c);p.x=c*a.x+u*r.x,p.y=c*a.y+u*r.y,p.z=c*a.z+u*r.z,p.normalize(),m.push(p.x,p.y,p.z),l.x=o.x+n*p.x,l.y=o.y+n*p.y,l.z=o.z+n*p.z,d.push(l.x,l.y,l.z)}}Se.call(this),this.type="TubeBufferGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:i,closed:o},t=t||64,n=n||1,i=i||8,o=o||!1;var s=e.computeFrenetFrames(t,o);this.tangents=s.tangents,this.normals=s.normals,this.binormals=s.binormals;var u,h,l=new c,p=new c,f=new r,d=[],m=[],v=[],g=[];for(u=0;u<t;u++)a(u);for(a(!1===o?t:0),u=0;u<=t;u++)for(h=0;h<=i;h++)f.x=u/t,f.y=h/i,v.push(f.x,f.y);!function(){for(h=1;h<=t;h++)for(u=1;u<=i;u++){var e=(i+1)*h+(u-1),r=(i+1)*h+u,n=(i+1)*(h-1)+u;g.push((i+1)*(h-1)+(u-1),e,n),g.push(e,r,n)}}(),this.setIndex(g),this.addAttribute("position",new be(d,3)),this.addAttribute("normal",new be(m,3)),this.addAttribute("uv",new be(v,2))}function Xt(e,t,r,n,i,o,a){he.call(this),this.type="TorusKnotGeometry",this.parameters={radius:e,tube:t,tubularSegments:r,radialSegments:n,p:i,q:o},void 0!==a&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."),this.fromBufferGeometry(new Yt(e,t,r,n,i,o)),this.mergeVertices()}function Yt(e,t,r,n,i,o){function a(e,t,r,n,i){var o=Math.sin(e);t=r/t*e,r=Math.cos(t),i.x=n*(2+r)*.5*Math.cos(e),i.y=n*(2+r)*o*.5,i.z=n*Math.sin(t)*.5}Se.call(this),this.type="TorusKnotBufferGeometry",this.parameters={radius:e,tube:t,tubularSegments:r,radialSegments:n,p:i,q:o},e=e||100,t=t||40,r=Math.floor(r)||64,n=Math.floor(n)||8,i=i||2,o=o||3;var s,u,h=[],l=[],p=[],f=[],d=new c,m=new c,v=new c,g=new c,y=new c,b=new c,_=new c;for(s=0;s<=r;++s)for(u=s/r*i*Math.PI*2,a(u,i,o,e,v),a(u+.01,i,o,e,g),b.subVectors(g,v),_.addVectors(g,v),y.crossVectors(b,_),_.crossVectors(y,b),y.normalize(),_.normalize(),u=0;u<=n;++u){var x=u/n*Math.PI*2,w=-t*Math.cos(x),x=t*Math.sin(x);d.x=v.x+(w*_.x+x*y.x),d.y=v.y+(w*_.y+x*y.y),d.z=v.z+(w*_.z+x*y.z),l.push(d.x,d.y,d.z),m.subVectors(d,v).normalize(),p.push(m.x,m.y,m.z),f.push(s/r),f.push(u/n)}for(u=1;u<=r;u++)for(s=1;s<=n;s++)e=(n+1)*u+(s-1),t=(n+1)*u+s,i=(n+1)*(u-1)+s,h.push((n+1)*(u-1)+(s-1),e,i),h.push(e,t,i);this.setIndex(h),this.addAttribute("position",new be(l,3)),this.addAttribute("normal",new be(p,3)),this.addAttribute("uv",new be(f,2))}function Kt(e,t,r,n,i){he.call(this),this.type="TorusGeometry",this.parameters={radius:e,tube:t,radialSegments:r,tubularSegments:n,arc:i},this.fromBufferGeometry(new Zt(e,t,r,n,i)),this.mergeVertices()}function Zt(e,t,r,n,i){Se.call(this),this.type="TorusBufferGeometry",this.parameters={radius:e,tube:t,radialSegments:r,tubularSegments:n,arc:i},e=e||100,t=t||40,r=Math.floor(r)||8,n=Math.floor(n)||6,i=i||2*Math.PI;var o,a,s=[],u=[],h=[],l=[],p=new c,f=new c,d=new c;for(o=0;o<=r;o++)for(a=0;a<=n;a++){var m=a/n*i,v=o/r*Math.PI*2;f.x=(e+t*Math.cos(v))*Math.cos(m),f.y=(e+t*Math.cos(v))*Math.sin(m),f.z=t*Math.sin(v),u.push(f.x,f.y,f.z),p.x=e*Math.cos(m),p.y=e*Math.sin(m),d.subVectors(f,p).normalize(),h.push(d.x,d.y,d.z),l.push(a/n),l.push(o/r)}for(o=1;o<=r;o++)for(a=1;a<=n;a++)e=(n+1)*(o-1)+a-1,t=(n+1)*(o-1)+a,i=(n+1)*o+a,s.push((n+1)*o+a-1,e,i),s.push(e,t,i);this.setIndex(s),this.addAttribute("position",new be(u,3)),this.addAttribute("normal",new be(h,3)),this.addAttribute("uv",new be(l,2))}function Jt(e,t){he.call(this),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},this.fromBufferGeometry(new Qt(e,t)),this.mergeVertices()}function Qt(e,t){void 0!==e&&(Se.call(this),this.type="ExtrudeBufferGeometry",e=Array.isArray(e)?e:[e],this.addShapeList(e,t),this.computeVertexNormals())}function er(e,t){he.call(this),this.type="TextGeometry",this.parameters={text:e,parameters:t},this.fromBufferGeometry(new tr(e,t)),this.mergeVertices()}function tr(e,t){var r=(t=t||{}).font;if(!r||!r.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new he;r=r.generateShapes(e,t.size,t.curveSegments),t.amount=void 0!==t.height?t.height:50,void 0===t.bevelThickness&&(t.bevelThickness=10),void 0===t.bevelSize&&(t.bevelSize=8),void 0===t.bevelEnabled&&(t.bevelEnabled=!1),Qt.call(this,r,t),this.type="TextBufferGeometry"}function rr(e,t,r,n,i,o,a){he.call(this),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:r,phiStart:n,phiLength:i,thetaStart:o,thetaLength:a},this.fromBufferGeometry(new nr(e,t,r,n,i,o,a)),this.mergeVertices()}function nr(e,t,r,n,i,o,a){Se.call(this),this.type="SphereBufferGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:r,phiStart:n,phiLength:i,thetaStart:o,thetaLength:a},e=e||50,t=Math.max(3,Math.floor(t)||8),r=Math.max(2,Math.floor(r)||6),n=void 0!==n?n:0,i=void 0!==i?i:2*Math.PI;var s,u,h=(o=void 0!==o?o:0)+(a=void 0!==a?a:Math.PI),l=0,p=[],f=new c,d=new c,m=[],v=[],g=[],y=[];for(u=0;u<=r;u++){var b=[],_=u/r;for(s=0;s<=t;s++){var x=s/t;f.x=-e*Math.cos(n+x*i)*Math.sin(o+_*a),f.y=e*Math.cos(o+_*a),f.z=e*Math.sin(n+x*i)*Math.sin(o+_*a),v.push(f.x,f.y,f.z),d.set(f.x,f.y,f.z).normalize(),g.push(d.x,d.y,d.z),y.push(x,1-_),b.push(l++)}p.push(b)}for(u=0;u<r;u++)for(s=0;s<t;s++)e=p[u][s+1],n=p[u][s],i=p[u+1][s],a=p[u+1][s+1],(0!==u||0<o)&&m.push(e,n,a),(u!==r-1||h<Math.PI)&&m.push(n,i,a);this.setIndex(m),this.addAttribute("position",new be(v,3)),this.addAttribute("normal",new be(g,3)),this.addAttribute("uv",new be(y,2))}function ir(e,t,r,n,i,o){he.call(this),this.type="RingGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:r,phiSegments:n,thetaStart:i,thetaLength:o},this.fromBufferGeometry(new or(e,t,r,n,i,o)),this.mergeVertices()}function or(e,t,n,i,o,a){Se.call(this),this.type="RingBufferGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:n,phiSegments:i,thetaStart:o,thetaLength:a},e=e||20,t=t||50,o=void 0!==o?o:0,a=void 0!==a?a:2*Math.PI,n=void 0!==n?Math.max(3,n):8;var s,u,h=[],l=[],p=[],f=[],d=e,m=(t-e)/(i=void 0!==i?Math.max(1,i):1),v=new c,g=new r;for(s=0;s<=i;s++){for(u=0;u<=n;u++)e=o+u/n*a,v.x=d*Math.cos(e),v.y=d*Math.sin(e),l.push(v.x,v.y,v.z),p.push(0,0,1),g.x=(v.x/t+1)/2,g.y=(v.y/t+1)/2,f.push(g.x,g.y);d+=m}for(s=0;s<i;s++)for(t=s*(n+1),u=0;u<n;u++)e=u+t,o=e+n+1,a=e+n+2,d=e+1,h.push(e,o,d),h.push(o,a,d);this.setIndex(h),this.addAttribute("position",new be(l,3)),this.addAttribute("normal",new be(p,3)),this.addAttribute("uv",new be(f,2))}function ar(e,t,r,n){he.call(this),this.type="LatheGeometry",this.parameters={points:e,segments:t,phiStart:r,phiLength:n},this.fromBufferGeometry(new sr(e,t,r,n)),this.mergeVertices()}function sr(e,t,n,i){Se.call(this),this.type="LatheBufferGeometry",this.parameters={points:e,segments:t,phiStart:n,phiLength:i},t=Math.floor(t)||12,n=n||0,i=i||2*Math.PI,i=xi.clamp(i,0,2*Math.PI);var o,a,s=[],u=[],h=[],l=1/t,p=new c,f=new r;for(o=0;o<=t;o++){a=n+o*l*i;var d=Math.sin(a),m=Math.cos(a);for(a=0;a<=e.length-1;a++)p.x=e[a].x*d,p.y=e[a].y,p.z=e[a].x*m,u.push(p.x,p.y,p.z),f.x=o/t,f.y=a/(e.length-1),h.push(f.x,f.y)}for(o=0;o<t;o++)for(a=0;a<e.length-1;a++)n=a+o*e.length,l=n+e.length,p=n+e.length+1,f=n+1,s.push(n,l,f),s.push(l,p,f);if(this.setIndex(s),this.addAttribute("position",new be(u,3)),this.addAttribute("uv",new be(h,2)),this.computeVertexNormals(),i===2*Math.PI)for(i=this.attributes.normal.array,s=new c,u=new c,h=new c,n=t*e.length*3,a=o=0;o<e.length;o++,a+=3)s.x=i[a+0],s.y=i[a+1],s.z=i[a+2],u.x=i[n+a+0],u.y=i[n+a+1],u.z=i[n+a+2],h.addVectors(s,u).normalize(),i[a+0]=i[n+a+0]=h.x,i[a+1]=i[n+a+1]=h.y,i[a+2]=i[n+a+2]=h.z}function cr(e,t){he.call(this),this.type="ShapeGeometry","object"==typeof t&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),t=t.curveSegments),this.parameters={shapes:e,curveSegments:t},this.fromBufferGeometry(new ur(e,t)),this.mergeVertices()}function ur(e,t){function r(e){var r,s,u=i.length/3,h=(e=e.extractPoints(t)).shape,l=e.holes;if(!1===Fi.isClockWise(h))for(h=h.reverse(),e=0,r=l.length;e<r;e++)s=l[e],!0===Fi.isClockWise(s)&&(l[e]=s.reverse());var p=Fi.triangulateShape(h,l);for(e=0,r=l.length;e<r;e++)s=l[e],h=h.concat(s);for(e=0,r=h.length;e<r;e++)s=h[e],i.push(s.x,s.y,0),o.push(0,0,1),a.push(s.x,s.y);for(e=0,r=p.length;e<r;e++)h=p[e],n.push(h[0]+u,h[1]+u,h[2]+u),c+=3}Se.call(this),this.type="ShapeBufferGeometry",this.parameters={shapes:e,curveSegments:t},t=t||12;var n=[],i=[],o=[],a=[],s=0,c=0;if(!1===Array.isArray(e))r(e);else for(var u=0;u<e.length;u++)r(e[u]),this.addGroup(s,c,u),s+=c,c=0;this.setIndex(n),this.addAttribute("position",new be(i,3)),this.addAttribute("normal",new be(o,3)),this.addAttribute("uv",new be(a,2))}function hr(e,t){Se.call(this),this.type="EdgesGeometry",this.parameters={thresholdAngle:t};var r,n,i,o=[],a=Math.cos(xi.DEG2RAD*(void 0!==t?t:1)),s=[0,0],c={},u=["a","b","c"];e.isBufferGeometry?(i=new he).fromBufferGeometry(e):i=e.clone(),i.mergeVertices(),i.computeFaceNormals();for(var h=i.vertices,l=0,p=(i=i.faces).length;l<p;l++)for(var f=i[l],d=0;3>d;d++)r=f[u[d]],n=f[u[(d+1)%3]],s[0]=Math.min(r,n),s[1]=Math.max(r,n),r=s[0]+","+s[1],void 0===c[r]?c[r]={index1:s[0],index2:s[1],face1:l,face2:void 0}:c[r].face2=l;for(r in c)(void 0===(s=c[r]).face2||i[s.face1].normal.dot(i[s.face2].normal)<=a)&&(u=h[s.index1],o.push(u.x,u.y,u.z),u=h[s.index2],o.push(u.x,u.y,u.z));this.addAttribute("position",new be(o,3))}function lr(e,t,r,n,i,o,a,s){he.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:r,radialSegments:n,heightSegments:i,openEnded:o,thetaStart:a,thetaLength:s},this.fromBufferGeometry(new pr(e,t,r,n,i,o,a,s)),this.mergeVertices()}function pr(e,t,n,i,o,a,s,u){function h(n){var o,a,h,g=new r,_=new c,x=0,w=!0===n?e:t,S=!0===n?1:-1;for(a=v,o=1;o<=i;o++)f.push(0,y*S,0),d.push(0,S,0),m.push(.5,.5),v++;for(h=v,o=0;o<=i;o++){var M=o/i*u+s,E=Math.cos(M),M=Math.sin(M);_.x=w*M,_.y=y*S,_.z=w*E,f.push(_.x,_.y,_.z),d.push(0,S,0),g.x=.5*E+.5,g.y=.5*M*S+.5,m.push(g.x,g.y),v++}for(o=0;o<i;o++)g=a+o,_=h+o,!0===n?p.push(_,_+1,g):p.push(_+1,_,g),x+=3;l.addGroup(b,x,!0===n?1:2),b+=x}Se.call(this),this.type="CylinderBufferGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:n,radialSegments:i,heightSegments:o,openEnded:a,thetaStart:s,thetaLength:u};var l=this;e=void 0!==e?e:20,t=void 0!==t?t:20,n=void 0!==n?n:100,i=Math.floor(i)||8,o=Math.floor(o)||1,a=void 0!==a&&a,s=void 0!==s?s:0,u=void 0!==u?u:2*Math.PI;var p=[],f=[],d=[],m=[],v=0,g=[],y=n/2,b=0;!function(){var r,a,h=new c,_=new c,x=0,w=(t-e)/n;for(a=0;a<=o;a++){var S=[],M=a/o,E=M*(t-e)+e;for(r=0;r<=i;r++){var C=r/i,T=C*u+s,O=Math.sin(T),T=Math.cos(T);_.x=E*O,_.y=-M*n+y,_.z=E*T,f.push(_.x,_.y,_.z),h.set(O,w,T).normalize(),d.push(h.x,h.y,h.z),m.push(C,1-M),S.push(v++)}g.push(S)}for(r=0;r<i;r++)for(a=0;a<o;a++)h=g[a+1][r],_=g[a+1][r+1],w=g[a][r+1],p.push(g[a][r],h,w),p.push(h,_,w),x+=6;l.addGroup(b,x,0),b+=x}(),!1===a&&(0<e&&h(!0),0<t&&h(!1)),this.setIndex(p),this.addAttribute("position",new be(f,3)),this.addAttribute("normal",new be(d,3)),this.addAttribute("uv",new be(m,2))}function fr(e,t,r,n,i,o,a){lr.call(this,0,e,t,r,n,i,o,a),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:o,thetaLength:a}}function dr(e,t,r,n,i,o,a){pr.call(this,0,e,t,r,n,i,o,a),this.type="ConeBufferGeometry",this.parameters={radius:e,height:t,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:o,thetaLength:a}}function mr(e,t,r,n){he.call(this),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:r,thetaLength:n},this.fromBufferGeometry(new vr(e,t,r,n)),this.mergeVertices()}function vr(e,t,n,i){Se.call(this),this.type="CircleBufferGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:i},e=e||50,t=void 0!==t?Math.max(3,t):8,n=void 0!==n?n:0,i=void 0!==i?i:2*Math.PI;var o,a,s=[],u=[],h=[],l=[],p=new c,f=new r;for(u.push(0,0,0),h.push(0,0,1),l.push(.5,.5),a=0,o=3;a<=t;a++,o+=3){var d=n+a/t*i;p.x=e*Math.cos(d),p.y=e*Math.sin(d),u.push(p.x,p.y,p.z),h.push(0,0,1),f.x=(u[o]/e+1)/2,f.y=(u[o+1]/e+1)/2,l.push(f.x,f.y)}for(o=1;o<=t;o++)s.push(o,o+1,0);this.setIndex(s),this.addAttribute("position",new be(u,3)),this.addAttribute("normal",new be(h,3)),this.addAttribute("uv",new be(l,2))}function gr(e){X.call(this,{uniforms:Ri.merge([Ai.lights,{opacity:{value:1}}]),vertexShader:Li.shadow_vert,fragmentShader:Li.shadow_frag}),this.transparent=this.lights=!0,Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(e){this.uniforms.opacity.value=e}}}),this.setValues(e)}function yr(e){X.call(this,e),this.type="RawShaderMaterial"}function br(e){W.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new V(16777215),this.metalness=this.roughness=.5,this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new V(0),this.emissiveIntensity=1,this.bumpMap=this.emissiveMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function _r(e){br.call(this),this.defines={PHYSICAL:""},this.type="MeshPhysicalMaterial",this.reflectivity=.5,this.clearCoatRoughness=this.clearCoat=0,this.setValues(e)}function xr(e){W.call(this),this.type="MeshPhongMaterial",this.color=new V(16777215),this.specular=new V(1118481),this.shininess=30,this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new V(0),this.emissiveIntensity=1,this.bumpMap=this.emissiveMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.envMap=this.alphaMap=this.specularMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function wr(e){xr.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.gradientMap=null,this.setValues(e)}function Sr(e){W.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1,this.setValues(e)}function Mr(e){W.call(this),this.type="MeshLambertMaterial",this.color=new V(16777215),this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new V(0),this.emissiveIntensity=1,this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function Er(e){W.call(this),this.type="LineDashedMaterial",this.color=new V(16777215),this.scale=this.linewidth=1,this.dashSize=3,this.gapSize=1,this.lights=!1,this.setValues(e)}function Cr(e,t,r){var n=this,i=!1,o=0,a=0;this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=r,this.itemStart=function(e){a++,!1===i&&void 0!==n.onStart&&n.onStart(e,o,a),i=!0},this.itemEnd=function(e){o++,void 0!==n.onProgress&&n.onProgress(e,o,a),o===a&&(i=!1,void 0!==n.onLoad)&&n.onLoad()},this.itemError=function(e){void 0!==n.onError&&n.onError(e)}}function Tr(e){this.manager=void 0!==e?e:Vi}function Or(e){this.manager=void 0!==e?e:Vi,this._parser=null}function Pr(e){this.manager=void 0!==e?e:Vi,this._parser=null}function jr(e){this.manager=void 0!==e?e:Vi}function Ar(e){this.manager=void 0!==e?e:Vi}function Rr(e){this.manager=void 0!==e?e:Vi}function Lr(e,t){oe.call(this),this.type="Light",this.color=new V(e),this.intensity=void 0!==t?t:1,this.receiveShadow=void 0}function Nr(e,t,r){Lr.call(this,e,r),this.type="HemisphereLight",this.castShadow=void 0,this.position.copy(oe.DefaultUp),this.updateMatrix(),this.groundColor=new V(t)}function Ir(e){this.camera=e,this.bias=0,this.radius=1,this.mapSize=new r(512,512),this.map=null,this.matrix=new u}function Dr(){Ir.call(this,new ce(50,1,.5,500))}function kr(e,t,r,n,i,o){Lr.call(this,e,t),this.type="SpotLight",this.position.copy(oe.DefaultUp),this.updateMatrix(),this.target=new oe,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(e){this.intensity=e/Math.PI}}),this.distance=void 0!==r?r:0,this.angle=void 0!==n?n:Math.PI/3,this.penumbra=void 0!==i?i:0,this.decay=void 0!==o?o:1,this.shadow=new Dr}function Br(e,t,r,n){Lr.call(this,e,t),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(e){this.intensity=e/(4*Math.PI)}}),this.distance=void 0!==r?r:0,this.decay=void 0!==n?n:1,this.shadow=new Ir(new ce(90,1,.5,500))}function Fr(){Ir.call(this,new se(-5,5,5,-5,.5,500))}function Ur(e,t){Lr.call(this,e,t),this.type="DirectionalLight",this.position.copy(oe.DefaultUp),this.updateMatrix(),this.target=new oe,this.shadow=new Fr}function zr(e,t){Lr.call(this,e,t),this.type="AmbientLight",this.castShadow=void 0}function $r(e,t,r,n){Lr.call(this,e,t),this.type="RectAreaLight",this.position.set(0,1,0),this.updateMatrix(),this.width=void 0!==r?r:10,this.height=void 0!==n?n:10}function Vr(e,t,r,n){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new t.constructor(r),this.sampleValues=t,this.valueSize=r}function Gr(e,t,r,n){Vr.call(this,e,t,r,n),this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Hr(e,t,r,n){Vr.call(this,e,t,r,n)}function qr(e,t,r,n){Vr.call(this,e,t,r,n)}function Wr(e,t,r,n){if(void 0===e)throw Error("track name is undefined");if(void 0===t||0===t.length)throw Error("no keyframes in track named "+e);this.name=e,this.times=Gi.convertArray(t,this.TimeBufferType),this.values=Gi.convertArray(r,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation),this.validate(),this.optimize()}function Xr(e,t,r,n){Wr.call(this,e,t,r,n)}function Yr(e,t,r,n){Vr.call(this,e,t,r,n)}function Kr(e,t,r,n){Wr.call(this,e,t,r,n)}function Zr(e,t,r,n){Wr.call(this,e,t,r,n)}function Jr(e,t,r,n){Wr.call(this,e,t,r,n)}function Qr(e,t,r){Wr.call(this,e,t,r)}function en(e,t,r,n){Wr.call(this,e,t,r,n)}function tn(e,t,r,n){Wr.apply(this,arguments)}function rn(e,t,r){this.name=e,this.tracks=r,this.duration=void 0!==t?t:-1,this.uuid=xi.generateUUID(),0>this.duration&&this.resetDuration(),this.optimize()}function nn(e){this.manager=void 0!==e?e:Vi,this.textures={}}function on(e){this.manager=void 0!==e?e:Vi}function an(){this.onLoadStart=function(){},this.onLoadProgress=function(){},this.onLoadComplete=function(){}}function sn(e){"boolean"==typeof e&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),e=void 0),this.manager=void 0!==e?e:Vi,this.withCredentials=!1}function cn(e){this.manager=void 0!==e?e:Vi,this.texturePath=""}function un(e,t,r,n,i){var o=e*e;return(2*r-2*n+(t=.5*(n-t))+(i=.5*(i-r)))*e*o+(-3*r+3*n-2*t-i)*o+t*e+r}function hn(e,t,r,n){var i=1-e;return i*i*t+2*(1-e)*e*r+e*e*n}function ln(e,t,r,n,i){var o=1-e,a=1-e;return o*o*o*t+3*a*a*e*r+3*(1-e)*e*e*n+e*e*e*i}function pn(){this.arcLengthDivisions=200}function fn(e,t){this.arcLengthDivisions=200,this.v1=e,this.v2=t}function dn(){this.arcLengthDivisions=200,this.curves=[],this.autoClose=!1}function mn(e,t,r,n,i,o,a,s){this.arcLengthDivisions=200,this.aX=e,this.aY=t,this.xRadius=r,this.yRadius=n,this.aStartAngle=i,this.aEndAngle=o,this.aClockwise=a,this.aRotation=s||0}function vn(e){this.arcLengthDivisions=200,this.points=void 0===e?[]:e}function gn(e,t,r,n){this.arcLengthDivisions=200,this.v0=e,this.v1=t,this.v2=r,this.v3=n}function yn(e,t,r){this.arcLengthDivisions=200,this.v0=e,this.v1=t,this.v2=r}function bn(e){dn.call(this),this.currentPoint=new r,e&&this.fromPoints(e)}function _n(){bn.apply(this,arguments),this.holes=[]}function xn(){this.subPaths=[],this.currentPath=null}function wn(e){this.data=e}function Sn(e){this.manager=void 0!==e?e:Vi}function Mn(e){this.manager=void 0!==e?e:Vi}function En(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ce,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ce,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1}function Cn(e,t,r){oe.call(this),this.type="CubeCamera";var n=new ce(90,1,e,t);n.up.set(0,-1,0),n.lookAt(new c(1,0,0)),this.add(n);var i=new ce(90,1,e,t);i.up.set(0,-1,0),i.lookAt(new c(-1,0,0)),this.add(i);var o=new ce(90,1,e,t);o.up.set(0,0,1),o.lookAt(new c(0,1,0)),this.add(o);var s=new ce(90,1,e,t);s.up.set(0,0,-1),s.lookAt(new c(0,-1,0)),this.add(s);var u=new ce(90,1,e,t);u.up.set(0,-1,0),u.lookAt(new c(0,0,1)),this.add(u);var h=new ce(90,1,e,t);h.up.set(0,-1,0),h.lookAt(new c(0,0,-1)),this.add(h),this.renderTarget=new a(r,r,{format:1022,magFilter:1006,minFilter:1006}),this.renderTarget.texture.name="CubeCamera",this.updateCubeMap=function(e,t){null===this.parent&&this.updateMatrixWorld();var r=this.renderTarget,a=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,r.activeCubeFace=0,e.render(t,n,r),r.activeCubeFace=1,e.render(t,i,r),r.activeCubeFace=2,e.render(t,o,r),r.activeCubeFace=3,e.render(t,s,r),r.activeCubeFace=4,e.render(t,u,r),r.texture.generateMipmaps=a,r.activeCubeFace=5,e.render(t,h,r),e.setRenderTarget(null)}}function Tn(){oe.call(this),this.type="AudioListener",this.context=Ji.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null}function On(e){oe.call(this),this.type="Audio",this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.loop=!1,this.startTime=0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType="empty",this.filters=[]}function Pn(e){On.call(this,e),this.panner=this.context.createPanner(),this.panner.connect(this.gain)}function jn(e,t){this.analyser=e.context.createAnalyser(),this.analyser.fftSize=void 0!==t?t:2048,this.data=new Uint8Array(this.analyser.frequencyBinCount),e.getOutput().connect(this.analyser)}function An(e,t,r){switch(this.binding=e,this.valueSize=r,e=Float64Array,t){case"quaternion":t=this._slerp;break;case"string":case"bool":e=Array,t=this._select;break;default:t=this._lerp}this.buffer=new e(4*r),this._mixBufferRegion=t,this.referenceCount=this.useCount=this.cumulativeWeight=0}function Rn(e,t,r){r=r||Ln.parseTrackName(t),this._targetGroup=e,this._bindings=e.subscribe_(t,r)}function Ln(e,t,r){this.path=t,this.parsedPath=r||Ln.parseTrackName(t),this.node=Ln.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e}function Nn(e){this.uuid=xi.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var t={};this._indicesByUUID=t;for(var r=0,n=arguments.length;r!==n;++r)t[arguments[r].uuid]=r;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var i=this;this.stats={objects:{get total(){return i._objects.length},get inUse(){return this.total-i.nCachedObjects_}},get bindingsPerObject(){return i._bindings.length}}}function In(e,t,r){this._mixer=e,this._clip=t,this._localRoot=r||null,t=(e=t.tracks).length,r=Array(t);for(var n={endingStart:2400,endingEnd:2400},i=0;i!==t;++i){var o=e[i].createInterpolant(null);r[i]=o,o.settings=n}this._interpolantSettings=n,this._interpolants=r,this._propertyBindings=Array(t),this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Dn(e){this._root=e,this._initMemoryManager(),this.time=this._accuIndex=0,this.timeScale=1}function kn(e,t){"string"==typeof e&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),e=t),this.value=e}function Bn(){Se.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0}function Fn(e,t,r,n){this.uuid=xi.generateUUID(),this.data=e,this.itemSize=t,this.offset=r,this.normalized=!0===n}function Un(e,t){this.uuid=xi.generateUUID(),this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.onUploadCallback=function(){},this.version=0}function zn(e,t,r){Un.call(this,e,t),this.meshPerAttribute=r||1}function $n(e,t,r){le.call(this,e,t),this.meshPerAttribute=r||1}function Vn(e,t,r,n){this.ray=new Pe(e,t),this.near=r||0,this.far=n||1/0,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function Gn(e,t){return e.distance-t.distance}function Hn(e,t,r,n){if(!1!==e.visible&&(e.raycast(t,r),!0===n)){n=0;for(var i=(e=e.children).length;n<i;n++)Hn(e[n],t,r,!0)}}function qn(e){this.autoStart=void 0===e||e,this.elapsedTime=this.oldTime=this.startTime=0,this.running=!1}function Wn(e,t,r){return this.radius=void 0!==e?e:1,this.phi=void 0!==t?t:0,this.theta=void 0!==r?r:0,this}function Xn(e,t,r){return this.radius=void 0!==e?e:1,this.theta=void 0!==t?t:0,this.y=void 0!==r?r:0,this}function Yn(e,t){Re.call(this,e,t),this.animationsMap={},this.animationsList=[];var r=this.geometry.morphTargets.length;this.createAnimation("__default",0,r-1,r/1),this.setAnimationWeight("__default",1)}function Kn(e){oe.call(this),this.material=e,this.render=function(e){}}function Zn(e,t,r,n){this.object=e,this.size=void 0!==t?t:1,e=void 0!==r?r:16711680,n=void 0!==n?n:1,t=0,(r=this.object.geometry)&&r.isGeometry?t=3*r.faces.length:r&&r.isBufferGeometry&&(t=r.attributes.normal.count),r=new Se,t=new be(6*t,3),r.addAttribute("position",t),Mt.call(this,r,new wt({color:e,linewidth:n})),this.matrixAutoUpdate=!1,this.update()}function Jn(e){oe.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,e=new Se;for(var t=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],r=0,n=1;32>r;r++,n++){var i=r/32*Math.PI*2,o=n/32*Math.PI*2;t.push(Math.cos(i),Math.sin(i),1,Math.cos(o),Math.sin(o),1)}e.addAttribute("position",new be(t,3)),t=new wt({fog:!1}),this.cone=new Mt(e,t),this.add(this.cone),this.update()}function Qn(e){var t=[];e&&e.isBone&&t.push(e);for(var r=0;r<e.children.length;r++)t.push.apply(t,Qn(e.children[r]));return t}function ei(e){for(var t=Qn(e),r=new Se,n=[],i=[],o=new V(0,0,1),a=new V(0,1,0),s=0;s<t.length;s++){var c=t[s];c.parent&&c.parent.isBone&&(n.push(0,0,0),n.push(0,0,0),i.push(o.r,o.g,o.b),i.push(a.r,a.g,a.b))}r.addAttribute("position",new be(n,3)),r.addAttribute("color",new be(i,3)),n=new wt({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0}),Mt.call(this,r,n),this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.onBeforeRender()}function ti(e,t){this.light=e,this.light.updateMatrixWorld();var r=new nr(t,4,2),n=new Oe({wireframe:!0,fog:!1});n.color.copy(this.light.color),Re.call(this,r,n),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1}function ri(e){oe.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,e=new wt({color:e.color});var t=new Se;t.addAttribute("position",new le(new Float32Array(15),3)),this.add(new St(t,e)),this.update()}function ni(e,t){oe.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1;var r=new zt(t);r.rotateY(.5*Math.PI);var n=new Oe({vertexColors:2,wireframe:!0}),i=r.getAttribute("position"),i=new Float32Array(3*i.count);r.addAttribute("color",new le(i,3)),this.add(new Re(r,n)),this.update()}function ii(e,t,r,n){e=e||10,t=t||10,r=new V(void 0!==r?r:4473924),n=new V(void 0!==n?n:8947848);var i=t/2,o=e/t,a=e/2;e=[];for(var s=[],c=0,u=0,h=-a;c<=t;c++,h+=o){e.push(-a,0,h,a,0,h),e.push(h,0,-a,h,0,a);var l=c===i?r:n;l.toArray(s,u),u+=3,l.toArray(s,u),u+=3,l.toArray(s,u),u+=3,l.toArray(s,u),u+=3}(t=new Se).addAttribute("position",new be(e,3)),t.addAttribute("color",new be(s,3)),r=new wt({vertexColors:2}),Mt.call(this,t,r)}function oi(e,t,r,n,i,o){e=e||10,t=t||16,r=r||8,n=n||64,i=new V(void 0!==i?i:4473924),o=new V(void 0!==o?o:8947848);var a,s,c,u,h,l=[],p=[];for(c=0;c<=t;c++)s=c/t*2*Math.PI,a=Math.sin(s)*e,s=Math.cos(s)*e,l.push(0,0,0),l.push(a,0,s),h=1&c?i:o,p.push(h.r,h.g,h.b),p.push(h.r,h.g,h.b);for(c=0;c<=r;c++)for(h=1&c?i:o,u=e-e/r*c,t=0;t<n;t++)s=t/n*2*Math.PI,a=Math.sin(s)*u,s=Math.cos(s)*u,l.push(a,0,s),p.push(h.r,h.g,h.b),s=(t+1)/n*2*Math.PI,a=Math.sin(s)*u,s=Math.cos(s)*u,l.push(a,0,s),p.push(h.r,h.g,h.b);(e=new Se).addAttribute("position",new be(l,3)),e.addAttribute("color",new be(p,3)),l=new wt({vertexColors:2}),Mt.call(this,e,l)}function ai(e,t,r,n){this.object=e,this.size=void 0!==t?t:1,e=void 0!==r?r:16776960,n=void 0!==n?n:1,t=0,(r=this.object.geometry)&&r.isGeometry?t=r.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead."),r=new Se,t=new be(6*t,3),r.addAttribute("position",t),Mt.call(this,r,new wt({color:e,linewidth:n})),this.matrixAutoUpdate=!1,this.update()}function si(e,t){oe.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,void 0===t&&(t=1);var r=new Se;r.addAttribute("position",new be([-t,t,0,t,t,0,t,-t,0,-t,-t,0,-t,t,0],3));var n=new wt({fog:!1});this.add(new St(r,n)),(r=new Se).addAttribute("position",new be([0,0,0,0,0,1],3)),this.add(new St(r,n)),this.update()}function ci(e){function t(e,t,n){r(e,n),r(t,n)}function r(e,t){o.push(0,0,0),a.push(t.r,t.g,t.b),void 0===s[e]&&(s[e]=[]),s[e].push(o.length/3-1)}var n=new Se,i=new wt({color:16777215,vertexColors:1}),o=[],a=[],s={},c=new V(16755200),u=new V(16711680),h=new V(43775),l=new V(16777215),p=new V(3355443);t("n1","n2",c),t("n2","n4",c),t("n4","n3",c),t("n3","n1",c),t("f1","f2",c),t("f2","f4",c),t("f4","f3",c),t("f3","f1",c),t("n1","f1",c),t("n2","f2",c),t("n3","f3",c),t("n4","f4",c),t("p","n1",u),t("p","n2",u),t("p","n3",u),t("p","n4",u),t("u1","u2",h),t("u2","u3",h),t("u3","u1",h),t("c","t",l),t("p","c",p),t("cn1","cn2",p),t("cn3","cn4",p),t("cf1","cf2",p),t("cf3","cf4",p),n.addAttribute("position",new be(o,3)),n.addAttribute("color",new be(a,3)),Mt.call(this,n,i),this.camera=e,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}function ui(e,t){this.object=e,void 0===t&&(t=16776960);var r=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Float32Array(24),i=new Se;i.setIndex(new le(r,1)),i.addAttribute("position",new le(n,3)),Mt.call(this,i,new wt({color:t})),this.matrixAutoUpdate=!1,this.update()}function hi(e,t,r,n,i,o){oe.call(this),void 0===n&&(n=16776960),void 0===r&&(r=1),void 0===i&&(i=.2*r),void 0===o&&(o=.2*i),void 0===Qi&&((Qi=new Se).addAttribute("position",new be([0,0,0,0,1,0],3)),(eo=new pr(0,.5,1,5,1)).translate(0,-.5,0)),this.position.copy(t),this.line=new St(Qi,new wt({color:n})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Re(eo,new Oe({color:n})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(e),this.setLength(r,i,o)}function li(e){var t=[0,0,0,e=e||1,0,0,0,0,0,0,e,0,0,0,0,0,0,e];(e=new Se).addAttribute("position",new be(t,3)),e.addAttribute("color",new be([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3)),t=new wt({vertexColors:2}),Mt.call(this,e,t)}function pi(){var e=0,t=0,r=0,n=0;return{initCatmullRom:function(i,o,a,s,c){e=o,t=i=c*(a-i),r=-3*o+3*a-2*i-(s=c*(s-o)),n=2*o-2*a+i+s},initNonuniformCatmullRom:function(i,o,a,s,c,u,h){e=o,t=i=((o-i)/c-(a-i)/(c+u)+(a-o)/u)*u,r=-3*o+3*a-2*i-(s=((a-o)/u-(s-o)/(u+h)+(s-a)/h)*u),n=2*o-2*a+i+s},calc:function(i){var o=i*i;return e+t*i+r*o+n*o*i}}}function fi(e){this.arcLengthDivisions=200,2>e.length&&console.warn("THREE.CatmullRomCurve3: Points array needs at least two entries."),this.points=e||[],this.closed=!1}function di(e,t,r,n){this.arcLengthDivisions=200,this.v0=e,this.v1=t,this.v2=r,this.v3=n}function mi(e,t,r){this.arcLengthDivisions=200,this.v0=e,this.v1=t,this.v2=r}function vi(e,t){this.arcLengthDivisions=200,this.v1=e,this.v2=t}function gi(e,t,r,n,i,o){mn.call(this,e,t,r,r,n,i,o)}function yi(e){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),fi.call(this,e),this.type="catmullrom",this.closed=!0}function bi(e){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),fi.call(this,e),this.type="catmullrom"}function _i(e){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),fi.call(this,e),this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}),void 0===Math.sign&&(Math.sign=function(e){return 0>e?-1:0<e?1:+e}),void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(e){if(void 0===e||null===e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),r=1;r<arguments.length;r++){var n=arguments[r];if(void 0!==n&&null!==n)for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}),Object.assign(t.prototype,{addEventListener:function(e,t){void 0===this._listeners&&(this._listeners={});var r=this._listeners;void 0===r[e]&&(r[e]=[]),-1===r[e].indexOf(t)&&r[e].push(t)},hasEventListener:function(e,t){if(void 0===this._listeners)return!1;var r=this._listeners;return void 0!==r[e]&&-1!==r[e].indexOf(t)},removeEventListener:function(e,t){if(void 0!==this._listeners){var r=this._listeners[e];if(void 0!==r){var n=r.indexOf(t);-1!==n&&r.splice(n,1)}}},dispatchEvent:function(e){if(void 0!==this._listeners){var t=this._listeners[e.type];if(void 0!==t){e.target=this;for(var r=0,n=(t=t.slice(0)).length;r<n;r++)t[r].call(this,e)}}}});var xi={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var e,t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),r=Array(36),n=0;return function(){for(var i=0;36>i;i++)8===i||13===i||18===i||23===i?r[i]="-":14===i?r[i]="4":(2>=n&&(n=33554432+16777216*Math.random()|0),e=15&n,n>>=4,r[i]=t[19===i?3&e|8:e]);return r.join("")}}(),clamp:function(e,t,r){return Math.max(t,Math.min(r,e))},euclideanModulo:function(e,t){return(e%t+t)%t},mapLinear:function(e,t,r,n,i){return n+(e-t)*(i-n)/(r-t)},lerp:function(e,t,r){return(1-r)*e+r*t},smoothstep:function(e,t,r){return e<=t?0:e>=r?1:(e=(e-t)/(r-t))*e*(3-2*e)},smootherstep:function(e,t,r){return e<=t?0:e>=r?1:(e=(e-t)/(r-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},degToRad:function(e){return e*xi.DEG2RAD},radToDeg:function(e){return e*xi.RAD2DEG},isPowerOfTwo:function(e){return 0==(e&e-1)&&0!==e},nearestPowerOfTwo:function(e){return Math.pow(2,Math.round(Math.log(e)/Math.LN2))},nextPowerOfTwo:function(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e}};Object.defineProperties(r.prototype,{width:{get:function(){return this.x},set:function(e){this.x=e}},height:{get:function(){return this.y},set:function(e){this.y=e}}}),Object.assign(r.prototype,{isVector2:!0,set:function(e,t){return this.x=e,this.y=t,this},setScalar:function(e){return this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(e){return this.x=e.x,this.y=e.y,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)},addScalar:function(e){return this.x+=e,this.y+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)},subScalar:function(e){return this.x-=e,this.y-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this},multiply:function(e){return this.x*=e.x,this.y*=e.y,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return this.x/=e.x,this.y/=e.y,this},divideScalar:function(e){return this.multiplyScalar(1/e)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this},clampScalar:function(){var e=new r,t=new r;return function(r,n){return e.set(r,r),t.set(n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(e){return this.x*e.x+this.y*e.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var e=Math.atan2(this.y,this.x);return 0>e&&(e+=2*Math.PI),e},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x;return e=this.y-e.y,t*t+e*e},distanceToManhattan:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this},rotateAround:function(e,t){var r=Math.cos(t),n=Math.sin(t),i=this.x-e.x,o=this.y-e.y;return this.x=i*r-o*n+e.x,this.y=i*n+o*r+e.y,this}});var wi=0;n.DEFAULT_IMAGE=void 0,n.DEFAULT_MAPPING=300,Object.defineProperty(n.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(n.prototype,t.prototype,{constructor:n,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this},toJSON:function(e){if(void 0!==e.textures[this.uuid])return e.textures[this.uuid];var t={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var r=this.image;if(void 0===r.uuid&&(r.uuid=xi.generateUUID()),void 0===e.images[r.uuid]){var n,i=e.images,o=r.uuid,a=r.uuid;void 0!==r.toDataURL?n=r:(n=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),n.width=r.width,n.height=r.height,n.getContext("2d").drawImage(r,0,0,r.width,r.height)),n=2048<n.width||2048<n.height?n.toDataURL("image/jpeg",.6):n.toDataURL("image/png"),i[o]={uuid:a,url:n}}t.image=r.uuid}return e.textures[this.uuid]=t},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(e){if(300===this.mapping){if(e.multiply(this.repeat),e.add(this.offset),0>e.x||1<e.x)switch(this.wrapS){case 1e3:e.x-=Math.floor(e.x);break;case 1001:e.x=0>e.x?0:1;break;case 1002:e.x=1===Math.abs(Math.floor(e.x)%2)?Math.ceil(e.x)-e.x:e.x-Math.floor(e.x)}if(0>e.y||1<e.y)switch(this.wrapT){case 1e3:e.y-=Math.floor(e.y);break;case 1001:e.y=0>e.y?0:1;break;case 1002:e.y=1===Math.abs(Math.floor(e.y)%2)?Math.ceil(e.y)-e.y:e.y-Math.floor(e.y)}this.flipY&&(e.y=1-e.y)}}}),Object.assign(i.prototype,{isVector4:!0,set:function(e,t,r,n){return this.x=e,this.y=t,this.z=r,this.w=n,this},setScalar:function(e){return this.w=this.z=this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setW:function(e){return this.w=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this},applyMatrix4:function(e){var t=this.x,r=this.y,n=this.z,i=this.w;return e=e.elements,this.x=e[0]*t+e[4]*r+e[8]*n+e[12]*i,this.y=e[1]*t+e[5]*r+e[9]*n+e[13]*i,this.z=e[2]*t+e[6]*r+e[10]*n+e[14]*i,this.w=e[3]*t+e[7]*r+e[11]*n+e[15]*i,this},divideScalar:function(e){return this.multiplyScalar(1/e)},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);return 1e-4>t?(this.x=1,this.z=this.y=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this},setAxisAngleFromRotationMatrix:function(e){var t,r,n,i=(e=e.elements)[0];n=e[4];var o=e[8],a=e[1],s=e[5],c=e[9];r=e[2],t=e[6];var u=e[10];return.01>Math.abs(n-a)&&.01>Math.abs(o-r)&&.01>Math.abs(c-t)?.1>Math.abs(n+a)&&.1>Math.abs(o+r)&&.1>Math.abs(c+t)&&.1>Math.abs(i+s+u-3)?(this.set(1,0,0,0),this):(e=Math.PI,i=(i+1)/2,s=(s+1)/2,u=(u+1)/2,n=(n+a)/4,o=(o+r)/4,c=(c+t)/4,i>s&&i>u?.01>i?(t=0,n=r=.707106781):(t=Math.sqrt(i),r=n/t,n=o/t):s>u?.01>s?(t=.707106781,r=0,n=.707106781):(r=Math.sqrt(s),t=n/r,n=c/r):.01>u?(r=t=.707106781,n=0):(n=Math.sqrt(u),t=o/n,r=c/n),this.set(t,r,n,e),this):(e=Math.sqrt((t-c)*(t-c)+(o-r)*(o-r)+(a-n)*(a-n)),.001>Math.abs(e)&&(e=1),this.x=(t-c)/e,this.y=(o-r)/e,this.z=(a-n)/e,this.w=Math.acos((i+s+u-1)/2),this)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this},clampScalar:function(){var e,t;return function(r,n){return void 0===e&&(e=new i,t=new i),e.set(r,r,r,r),t.set(n,n,n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z),this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}}),Object.assign(o.prototype,t.prototype,{isWebGLRenderTarget:!0,setSize:function(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.width=e.width,this.height=e.height,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),a.prototype=Object.create(o.prototype),a.prototype.constructor=a,a.prototype.isWebGLRenderTargetCube=!0,Object.assign(s,{slerp:function(e,t,r,n){return r.copy(e).slerp(t,n)},slerpFlat:function(e,t,r,n,i,o,a){var s=r[n+0],c=r[n+1],u=r[n+2];r=r[n+3],n=i[o+0];var h=i[o+1],l=i[o+2];if(i=i[o+3],r!==i||s!==n||c!==h||u!==l){o=1-a;var p=s*n+c*h+u*l+r*i,f=0<=p?1:-1,d=1-p*p;d>Number.EPSILON&&(d=Math.sqrt(d),p=Math.atan2(d,p*f),o=Math.sin(o*p)/d,a=Math.sin(a*p)/d),s=s*o+n*(f*=a),c=c*o+h*f,u=u*o+l*f,r=r*o+i*f,o===1-a&&(a=1/Math.sqrt(s*s+c*c+u*u+r*r),s*=a,c*=a,u*=a,r*=a)}e[t]=s,e[t+1]=c,e[t+2]=u,e[t+3]=r}}),Object.defineProperties(s.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this.onChangeCallback()}},w:{get:function(){return this._w},set:function(e){this._w=e,this.onChangeCallback()}}}),Object.assign(s.prototype,{set:function(e,t,r,n){return this._x=e,this._y=t,this._z=r,this._w=n,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this.onChangeCallback(),this},setFromEuler:function(e,t){if(!e||!e.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var r=e._x,n=e._y,i=e._z,o=e.order,a=Math.cos,s=Math.sin,c=a(r/2),u=a(n/2),a=a(i/2),r=s(r/2),n=s(n/2),i=s(i/2);return"XYZ"===o?(this._x=r*u*a+c*n*i,this._y=c*n*a-r*u*i,this._z=c*u*i+r*n*a,this._w=c*u*a-r*n*i):"YXZ"===o?(this._x=r*u*a+c*n*i,this._y=c*n*a-r*u*i,this._z=c*u*i-r*n*a,this._w=c*u*a+r*n*i):"ZXY"===o?(this._x=r*u*a-c*n*i,this._y=c*n*a+r*u*i,this._z=c*u*i+r*n*a,this._w=c*u*a-r*n*i):"ZYX"===o?(this._x=r*u*a-c*n*i,this._y=c*n*a+r*u*i,this._z=c*u*i-r*n*a,this._w=c*u*a+r*n*i):"YZX"===o?(this._x=r*u*a+c*n*i,this._y=c*n*a+r*u*i,this._z=c*u*i-r*n*a,this._w=c*u*a-r*n*i):"XZY"===o&&(this._x=r*u*a-c*n*i,this._y=c*n*a-r*u*i,this._z=c*u*i+r*n*a,this._w=c*u*a+r*n*i),!1!==t&&this.onChangeCallback(),this},setFromAxisAngle:function(e,t){var r=t/2,n=Math.sin(r);return this._x=e.x*n,this._y=e.y*n,this._z=e.z*n,this._w=Math.cos(r),this.onChangeCallback(),this},setFromRotationMatrix:function(e){var t=e.elements,r=t[0];e=t[4];var n=t[8],i=t[1],o=t[5],a=t[9],s=t[2],c=t[6],u=r+o+(t=t[10]);return 0<u?(r=.5/Math.sqrt(u+1),this._w=.25/r,this._x=(c-a)*r,this._y=(n-s)*r,this._z=(i-e)*r):r>o&&r>t?(r=2*Math.sqrt(1+r-o-t),this._w=(c-a)/r,this._x=.25*r,this._y=(e+i)/r,this._z=(n+s)/r):o>t?(r=2*Math.sqrt(1+o-r-t),this._w=(n-s)/r,this._x=(e+i)/r,this._y=.25*r,this._z=(a+c)/r):(r=2*Math.sqrt(1+t-r-o),this._w=(i-e)/r,this._x=(n+s)/r,this._y=(a+c)/r,this._z=.25*r),this.onChangeCallback(),this},setFromUnitVectors:function(){var e,t=new c;return function(r,n){return void 0===t&&(t=new c),1e-6>(e=r.dot(n)+1)?(e=0,Math.abs(r.x)>Math.abs(r.z)?t.set(-r.y,r.x,0):t.set(0,-r.z,r.y)):t.crossVectors(r,n),this._x=t.x,this._y=t.y,this._z=t.z,this._w=e,this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var e=this.length();return 0===e?(this._z=this._y=this._x=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e),this.onChangeCallback(),this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},premultiply:function(e){return this.multiplyQuaternions(e,this)},multiplyQuaternions:function(e,t){var r=e._x,n=e._y,i=e._z,o=e._w,a=t._x,s=t._y,c=t._z,u=t._w;return this._x=r*u+o*a+n*c-i*s,this._y=n*u+o*s+i*a-r*c,this._z=i*u+o*c+r*s-n*a,this._w=o*u-r*a-n*s-i*c,this.onChangeCallback(),this},slerp:function(e,t){if(0===t)return this;if(1===t)return this.copy(e);var r=this._x,n=this._y,i=this._z,o=this._w;if(0>(s=o*e._w+r*e._x+n*e._y+i*e._z)?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,s=-s):this.copy(e),1<=s)return this._w=o,this._x=r,this._y=n,this._z=i,this;c=Math.sqrt(1-s*s);if(.001>Math.abs(c))return this._w=.5*(o+this._w),this._x=.5*(r+this._x),this._y=.5*(n+this._y),this._z=.5*(i+this._z),this;var a=Math.atan2(c,s),s=Math.sin((1-t)*a)/c,c=Math.sin(t*a)/c;return this._w=o*s+this._w*c,this._x=r*s+this._x*c,this._y=n*s+this._y*c,this._z=i*s+this._z*c,this.onChangeCallback(),this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e,t){return void 0===t&&(t=0),this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){}}),Object.assign(c.prototype,{isVector3:!0,set:function(e,t,r){return this.x=e,this.y=t,this.z=r,this},setScalar:function(e){return this.z=this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this},multiplyVectors:function(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this},applyEuler:function(){var e=new s;return function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(e.setFromEuler(t))}}(),applyAxisAngle:function(){var e=new s;return function(t,r){return this.applyQuaternion(e.setFromAxisAngle(t,r))}}(),applyMatrix3:function(e){var t=this.x,r=this.y,n=this.z;return e=e.elements,this.x=e[0]*t+e[3]*r+e[6]*n,this.y=e[1]*t+e[4]*r+e[7]*n,this.z=e[2]*t+e[5]*r+e[8]*n,this},applyMatrix4:function(e){var t=this.x,r=this.y,n=this.z,i=1/((e=e.elements)[3]*t+e[7]*r+e[11]*n+e[15]);return this.x=(e[0]*t+e[4]*r+e[8]*n+e[12])*i,this.y=(e[1]*t+e[5]*r+e[9]*n+e[13])*i,this.z=(e[2]*t+e[6]*r+e[10]*n+e[14])*i,this},applyQuaternion:function(e){var t=this.x,r=this.y,n=this.z,i=e.x,o=e.y,a=e.z,s=(e=e.w)*t+o*n-a*r,c=e*r+a*t-i*n,u=e*n+i*r-o*t,t=-i*t-o*r-a*n;return this.x=s*e+t*-i+c*-a-u*-o,this.y=c*e+t*-o+u*-i-s*-a,this.z=u*e+t*-a+s*-o-c*-i,this},project:function(){var e=new u;return function(t){return e.multiplyMatrices(t.projectionMatrix,e.getInverse(t.matrixWorld)),this.applyMatrix4(e)}}(),unproject:function(){var e=new u;return function(t){return e.multiplyMatrices(t.matrixWorld,e.getInverse(t.projectionMatrix)),this.applyMatrix4(e)}}(),transformDirection:function(e){var t=this.x,r=this.y,n=this.z;return e=e.elements,this.x=e[0]*t+e[4]*r+e[8]*n,this.y=e[1]*t+e[5]*r+e[9]*n,this.z=e[2]*t+e[6]*r+e[10]*n,this.normalize()},divide:function(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this},divideScalar:function(e){return this.multiplyScalar(1/e)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this},clampScalar:function(){var e=new c,t=new c;return function(r,n){return e.set(r,r,r),t.set(n,n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},cross:function(e,t){if(void 0!==t)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t);var r=this.x,n=this.y,i=this.z;return this.x=n*e.z-i*e.y,this.y=i*e.x-r*e.z,this.z=r*e.y-n*e.x,this},crossVectors:function(e,t){var r=e.x,n=e.y,i=e.z,o=t.x,a=t.y,s=t.z;return this.x=n*s-i*a,this.y=i*o-r*s,this.z=r*a-n*o,this},projectOnVector:function(e){var t=e.dot(this)/e.lengthSq();return this.copy(e).multiplyScalar(t)},projectOnPlane:function(){var e=new c;return function(t){return e.copy(this).projectOnVector(t),this.sub(e)}}(),reflect:function(){var e=new c;return function(t){return this.sub(e.copy(t).multiplyScalar(2*this.dot(t)))}}(),angleTo:function(e){return e=this.dot(e)/Math.sqrt(this.lengthSq()*e.lengthSq()),Math.acos(xi.clamp(e,-1,1))},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,r=this.y-e.y;return e=this.z-e.z,t*t+r*r+e*e},distanceToManhattan:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)},setFromSpherical:function(e){var t=Math.sin(e.phi)*e.radius;return this.x=t*Math.sin(e.theta),this.y=Math.cos(e.phi)*e.radius,this.z=t*Math.cos(e.theta),this},setFromCylindrical:function(e){return this.x=e.radius*Math.sin(e.theta),this.y=e.y,this.z=e.radius*Math.cos(e.theta),this},setFromMatrixPosition:function(e){return e=e.elements,this.x=e[12],this.y=e[13],this.z=e[14],this},setFromMatrixScale:function(e){var t=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length();return e=this.setFromMatrixColumn(e,2).length(),this.x=t,this.y=r,this.z=e,this},setFromMatrixColumn:function(e,t){return this.fromArray(e.elements,4*t)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}}),Object.assign(u.prototype,{isMatrix4:!0,set:function(e,t,r,n,i,o,a,s,c,u,h,l,p,f,d,m){var v=this.elements;return v[0]=e,v[4]=t,v[8]=r,v[12]=n,v[1]=i,v[5]=o,v[9]=a,v[13]=s,v[2]=c,v[6]=u,v[10]=h,v[14]=l,v[3]=p,v[7]=f,v[11]=d,v[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new u).fromArray(this.elements)},copy:function(e){var t=this.elements;return e=e.elements,t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],this},copyPosition:function(e){var t=this.elements;return e=e.elements,t[12]=e[12],t[13]=e[13],t[14]=e[14],this},extractBasis:function(e,t,r){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this},makeBasis:function(e,t,r){return this.set(e.x,t.x,r.x,0,e.y,t.y,r.y,0,e.z,t.z,r.z,0,0,0,0,1),this},extractRotation:function(){var e=new c;return function(t){var r=this.elements,n=t.elements,i=1/e.setFromMatrixColumn(t,0).length(),o=1/e.setFromMatrixColumn(t,1).length();return t=1/e.setFromMatrixColumn(t,2).length(),r[0]=n[0]*i,r[1]=n[1]*i,r[2]=n[2]*i,r[4]=n[4]*o,r[5]=n[5]*o,r[6]=n[6]*o,r[8]=n[8]*t,r[9]=n[9]*t,r[10]=n[10]*t,this}}(),makeRotationFromEuler:function(e){e&&e.isEuler||console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var t=this.elements,r=e.x,n=e.y,i=e.z,o=Math.cos(r),r=Math.sin(r),a=Math.cos(n),n=Math.sin(n),s=Math.cos(i),i=Math.sin(i);if("XYZ"===e.order){e=o*s;var c=o*i,u=r*s,h=r*i;t[0]=a*s,t[4]=-a*i,t[8]=n,t[1]=c+u*n,t[5]=e-h*n,t[9]=-r*a,t[2]=h-e*n,t[6]=u+c*n,t[10]=o*a}else"YXZ"===e.order?(e=a*s,c=a*i,u=n*s,h=n*i,t[0]=e+h*r,t[4]=u*r-c,t[8]=o*n,t[1]=o*i,t[5]=o*s,t[9]=-r,t[2]=c*r-u,t[6]=h+e*r,t[10]=o*a):"ZXY"===e.order?(e=a*s,c=a*i,u=n*s,h=n*i,t[0]=e-h*r,t[4]=-o*i,t[8]=u+c*r,t[1]=c+u*r,t[5]=o*s,t[9]=h-e*r,t[2]=-o*n,t[6]=r,t[10]=o*a):"ZYX"===e.order?(e=o*s,c=o*i,u=r*s,h=r*i,t[0]=a*s,t[4]=u*n-c,t[8]=e*n+h,t[1]=a*i,t[5]=h*n+e,t[9]=c*n-u,t[2]=-n,t[6]=r*a,t[10]=o*a):"YZX"===e.order?(e=o*a,c=o*n,u=r*a,h=r*n,t[0]=a*s,t[4]=h-e*i,t[8]=u*i+c,t[1]=i,t[5]=o*s,t[9]=-r*s,t[2]=-n*s,t[6]=c*i+u,t[10]=e-h*i):"XZY"===e.order&&(e=o*a,c=o*n,u=r*a,h=r*n,t[0]=a*s,t[4]=-i,t[8]=n*s,t[1]=e*i+h,t[5]=o*s,t[9]=c*i-u,t[2]=u*i-c,t[6]=r*s,t[10]=h*i+e);return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromQuaternion:function(e){var t=this.elements,r=e._x,n=e._y,i=e._z,o=e._w,a=i+i;e=r*(u=r+r);var s=r*(h=n+n),r=r*a,c=n*h,n=n*a,i=i*a,u=o*u,h=o*h,o=o*a;return t[0]=1-(c+i),t[4]=s-o,t[8]=r+h,t[1]=s+o,t[5]=1-(e+i),t[9]=n-u,t[2]=r-h,t[6]=n+u,t[10]=1-(e+c),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},lookAt:function(){var e=new c,t=new c,r=new c;return function(n,i,o){var a=this.elements;return r.subVectors(n,i),0===r.lengthSq()&&(r.z=1),r.normalize(),e.crossVectors(o,r),0===e.lengthSq()&&(1===Math.abs(o.z)?r.x+=1e-4:r.z+=1e-4,r.normalize(),e.crossVectors(o,r)),e.normalize(),t.crossVectors(r,e),a[0]=e.x,a[4]=t.x,a[8]=r.x,a[1]=e.y,a[5]=t.y,a[9]=r.y,a[2]=e.z,a[6]=t.z,a[10]=r.z,this}}(),multiply:function(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var r=e.elements,n=t.elements,i=this.elements,o=r[0],a=r[4],s=r[8],c=r[12],u=r[1],h=r[5],l=r[9],p=r[13],f=r[2],d=r[6],m=r[10],v=r[14],g=r[3],y=r[7],b=r[11],r=r[15],_=n[0],x=n[4],w=n[8],S=n[12],M=n[1],E=n[5],C=n[9],T=n[13],O=n[2],P=n[6],j=n[10],A=n[14],R=n[3],L=n[7],N=n[11],n=n[15];return i[0]=o*_+a*M+s*O+c*R,i[4]=o*x+a*E+s*P+c*L,i[8]=o*w+a*C+s*j+c*N,i[12]=o*S+a*T+s*A+c*n,i[1]=u*_+h*M+l*O+p*R,i[5]=u*x+h*E+l*P+p*L,i[9]=u*w+h*C+l*j+p*N,i[13]=u*S+h*T+l*A+p*n,i[2]=f*_+d*M+m*O+v*R,i[6]=f*x+d*E+m*P+v*L,i[10]=f*w+d*C+m*j+v*N,i[14]=f*S+d*T+m*A+v*n,i[3]=g*_+y*M+b*O+r*R,i[7]=g*x+y*E+b*P+r*L,i[11]=g*w+y*C+b*j+r*N,i[15]=g*S+y*T+b*A+r*n,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this},applyToBufferAttribute:function(){var e=new c;return function(t){for(var r=0,n=t.count;r<n;r++)e.x=t.getX(r),e.y=t.getY(r),e.z=t.getZ(r),e.applyMatrix4(this),t.setXYZ(r,e.x,e.y,e.z);return t}}(),determinant:function(){var e=this.elements,t=e[0],r=e[4],n=e[8],i=e[12],o=e[1],a=e[5],s=e[9],c=e[13],u=e[2],h=e[6],l=e[10],p=e[14];return e[3]*(+i*s*h-n*c*h-i*a*l+r*c*l+n*a*p-r*s*p)+e[7]*(+t*s*p-t*c*l+i*o*l-n*o*p+n*c*u-i*s*u)+e[11]*(+t*c*h-t*a*p-i*o*h+r*o*p+i*a*u-r*c*u)+e[15]*(-n*a*u-t*s*h+t*a*l+n*o*h-r*o*l+r*s*u)},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this},setPosition:function(e){var t=this.elements;return t[12]=e.x,t[13]=e.y,t[14]=e.z,this},getInverse:function(e,t){var r=this.elements,n=e.elements,i=n[0],o=n[1],a=n[2],s=n[3],c=n[4],u=n[5],h=n[6],l=n[7],p=n[8],f=n[9],d=n[10],m=n[11],v=n[12],g=n[13],y=n[14],b=f*y*l-g*d*l+g*h*m-u*y*m-f*h*(n=n[15])+u*d*n,_=v*d*l-p*y*l-v*h*m+c*y*m+p*h*n-c*d*n,x=p*g*l-v*f*l+v*u*m-c*g*m-p*u*n+c*f*n,w=v*f*h-p*g*h-v*u*d+c*g*d+p*u*y-c*f*y,S=i*b+o*_+a*x+s*w;if(0===S){if(!0===t)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");return console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"),this.identity()}return S=1/S,r[0]=b*S,r[1]=(g*d*s-f*y*s-g*a*m+o*y*m+f*a*n-o*d*n)*S,r[2]=(u*y*s-g*h*s+g*a*l-o*y*l-u*a*n+o*h*n)*S,r[3]=(f*h*s-u*d*s-f*a*l+o*d*l+u*a*m-o*h*m)*S,r[4]=_*S,r[5]=(p*y*s-v*d*s+v*a*m-i*y*m-p*a*n+i*d*n)*S,r[6]=(v*h*s-c*y*s-v*a*l+i*y*l+c*a*n-i*h*n)*S,r[7]=(c*d*s-p*h*s+p*a*l-i*d*l-c*a*m+i*h*m)*S,r[8]=x*S,r[9]=(v*f*s-p*g*s-v*o*m+i*g*m+p*o*n-i*f*n)*S,r[10]=(c*g*s-v*u*s+v*o*l-i*g*l-c*o*n+i*u*n)*S,r[11]=(p*u*s-c*f*s-p*o*l+i*f*l+c*o*m-i*u*m)*S,r[12]=w*S,r[13]=(p*g*a-v*f*a+v*o*d-i*g*d-p*o*y+i*f*y)*S,r[14]=(v*u*a-c*g*a-v*o*h+i*g*h+c*o*y-i*u*y)*S,r[15]=(c*f*a-p*u*a+p*o*h-i*f*h-c*o*d+i*u*d)*S,this},scale:function(e){var t=this.elements,r=e.x,n=e.y;return e=e.z,t[0]*=r,t[4]*=n,t[8]*=e,t[1]*=r,t[5]*=n,t[9]*=e,t[2]*=r,t[6]*=n,t[10]*=e,t[3]*=r,t[7]*=n,t[11]*=e,this},getMaxScaleOnAxis:function(){var e=this.elements;return Math.sqrt(Math.max(e[0]*e[0]+e[1]*e[1]+e[2]*e[2],e[4]*e[4]+e[5]*e[5]+e[6]*e[6],e[8]*e[8]+e[9]*e[9]+e[10]*e[10]))},makeTranslation:function(e,t,r){return this.set(1,0,0,e,0,1,0,t,0,0,1,r,0,0,0,1),this},makeRotationX:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(1,0,0,0,0,t,-e,0,0,e,t,0,0,0,0,1),this},makeRotationY:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(t,0,e,0,0,1,0,0,-e,0,t,0,0,0,0,1),this},makeRotationZ:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(t,-e,0,0,e,t,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(e,t){var r=Math.cos(t),n=Math.sin(t),i=1-r,o=e.x,a=e.y,s=e.z,c=i*o,u=i*a;return this.set(c*o+r,c*a-n*s,c*s+n*a,0,c*a+n*s,u*a+r,u*s-n*o,0,c*s-n*a,u*s+n*o,i*s*s+r,0,0,0,0,1),this},makeScale:function(e,t,r){return this.set(e,0,0,0,0,t,0,0,0,0,r,0,0,0,0,1),this},makeShear:function(e,t,r){return this.set(1,t,r,0,e,1,r,0,e,t,1,0,0,0,0,1),this},compose:function(e,t,r){return this.makeRotationFromQuaternion(t),this.scale(r),this.setPosition(e),this},decompose:function(){var e=new c,t=new u;return function(r,n,i){var o=this.elements,a=e.set(o[0],o[1],o[2]).length(),s=e.set(o[4],o[5],o[6]).length(),c=e.set(o[8],o[9],o[10]).length();0>this.determinant()&&(a=-a),r.x=o[12],r.y=o[13],r.z=o[14],t.copy(this),r=1/a;var o=1/s,u=1/c;return t.elements[0]*=r,t.elements[1]*=r,t.elements[2]*=r,t.elements[4]*=o,t.elements[5]*=o,t.elements[6]*=o,t.elements[8]*=u,t.elements[9]*=u,t.elements[10]*=u,n.setFromRotationMatrix(t),i.x=a,i.y=s,i.z=c,this}}(),makePerspective:function(e,t,r,n,i,o){void 0===o&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var a=this.elements;return a[0]=2*i/(t-e),a[4]=0,a[8]=(t+e)/(t-e),a[12]=0,a[1]=0,a[5]=2*i/(r-n),a[9]=(r+n)/(r-n),a[13]=0,a[2]=0,a[6]=0,a[10]=-(o+i)/(o-i),a[14]=-2*o*i/(o-i),a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this},makeOrthographic:function(e,t,r,n,i,o){var a=this.elements,s=1/(t-e),c=1/(r-n),u=1/(o-i);return a[0]=2*s,a[4]=0,a[8]=0,a[12]=-(t+e)*s,a[1]=0,a[5]=2*c,a[9]=0,a[13]=-(r+n)*c,a[2]=0,a[6]=0,a[10]=-2*u,a[14]=-(o+i)*u,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this},equals:function(e){var t=this.elements;e=e.elements;for(var r=0;16>r;r++)if(t[r]!==e[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var r=0;16>r;r++)this.elements[r]=e[r+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var r=this.elements;return e[t]=r[0],e[t+1]=r[1],e[t+2]=r[2],e[t+3]=r[3],e[t+4]=r[4],e[t+5]=r[5],e[t+6]=r[6],e[t+7]=r[7],e[t+8]=r[8],e[t+9]=r[9],e[t+10]=r[10],e[t+11]=r[11],e[t+12]=r[12],e[t+13]=r[13],e[t+14]=r[14],e[t+15]=r[15],e}}),h.prototype=Object.create(n.prototype),h.prototype.constructor=h,h.prototype.isDataTexture=!0,(l.prototype=Object.create(n.prototype)).constructor=l,l.prototype.isCubeTexture=!0,Object.defineProperty(l.prototype,"images",{get:function(){return this.image},set:function(e){this.image=e}});var Si=new n,Mi=new l,Ei=[],Ci=[],Ti=new Float32Array(16),Oi=new Float32Array(9);z.prototype.setValue=function(e,t){for(var r=this.seq,n=0,i=r.length;n!==i;++n){var o=r[n];o.setValue(e,t[o.id])}};var Pi=/([\w\d_]+)(\])?(\[|\.)?/g;$.prototype.setValue=function(e,t,r){void 0!==(t=this.map[t])&&t.setValue(e,r,this.renderer)},$.prototype.setOptional=function(e,t,r){void 0!==(t=t[r])&&this.setValue(e,r,t)},$.upload=function(e,t,r,n){for(var i=0,o=t.length;i!==o;++i){var a=t[i],s=r[a.id];!1!==s.needsUpdate&&a.setValue(e,s.value,n)}},$.seqWithValue=function(e,t){for(var r=[],n=0,i=e.length;n!==i;++n){var o=e[n];o.id in t&&r.push(o)}return r};var ji={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(V.prototype,{isColor:!0,r:1,g:1,b:1,set:function(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this},setScalar:function(e){return this.b=this.g=this.r=e,this},setHex:function(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this},setRGB:function(e,t,r){return this.r=e,this.g=t,this.b=r,this},setHSL:function(){function e(e,t,r){return 0>r&&(r+=1),1<r&&--r,r<1/6?e+6*(t-e)*r:.5>r?t:r<2/3?e+6*(t-e)*(2/3-r):e}return function(t,r,n){return t=xi.euclideanModulo(t,1),r=xi.clamp(r,0,1),n=xi.clamp(n,0,1),0===r?this.r=this.g=this.b=n:(r=.5>=n?n*(1+r):n+r-n*r,n=2*n-r,this.r=e(n,r,t+1/3),this.g=e(n,r,t),this.b=e(n,r,t-1/3)),this}}(),setStyle:function(e){function t(t){void 0!==t&&1>parseFloat(t)&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}var r;if(r=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(e)){n=r[2];switch(r[1]){case"rgb":case"rgba":if(r=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,t(r[5]),this;if(r=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,t(r[5]),this;break;case"hsl":case"hsla":if(r=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n)){var n=parseFloat(r[1])/360,i=parseInt(r[2],10)/100,o=parseInt(r[3],10)/100;return t(r[5]),this.setHSL(n,i,o)}}}else if(r=/^\#([A-Fa-f0-9]+)$/.exec(e)){if(r=r[1],3===(n=r.length))return this.r=parseInt(r.charAt(0)+r.charAt(0),16)/255,this.g=parseInt(r.charAt(1)+r.charAt(1),16)/255,this.b=parseInt(r.charAt(2)+r.charAt(2),16)/255,this;if(6===n)return this.r=parseInt(r.charAt(0)+r.charAt(1),16)/255,this.g=parseInt(r.charAt(2)+r.charAt(3),16)/255,this.b=parseInt(r.charAt(4)+r.charAt(5),16)/255,this}return e&&0<e.length&&(void 0!==(r=ji[e])?this.setHex(r):console.warn("THREE.Color: Unknown color "+e)),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(e){return this.r=e.r,this.g=e.g,this.b=e.b,this},copyGammaToLinear:function(e,t){return void 0===t&&(t=2),this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},copyLinearToGamma:function(e,t){void 0===t&&(t=2);var r=0<t?1/t:1;return this.r=Math.pow(e.r,r),this.g=Math.pow(e.g,r),this.b=Math.pow(e.b,r),this},convertGammaToLinear:function(){var e=this.r,t=this.g,r=this.b;return this.r=e*e,this.g=t*t,this.b=r*r,this},convertLinearToGamma:function(){return this.r=Math.sqrt(this.r),this.g=Math.sqrt(this.g),this.b=Math.sqrt(this.b),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){e=e||{h:0,s:0,l:0};var t,r=this.r,n=this.g,i=this.b,o=Math.max(r,n,i),a=((c=Math.min(r,n,i))+o)/2;if(c===o)c=t=0;else{var s=o-c,c=.5>=a?s/(o+c):s/(2-o-c);switch(o){case r:t=(n-i)/s+(n<i?6:0);break;case n:t=(i-r)/s+2;break;case i:t=(r-n)/s+4}t/=6}return e.h=t,e.s=c,e.l=a,e},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(e,t,r){var n=this.getHSL();return n.h+=e,n.s+=t,n.l+=r,this.setHSL(n.h,n.s,n.l),this},add:function(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this},addColors:function(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this},addScalar:function(e){return this.r+=e,this.g+=e,this.b+=e,this},sub:function(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this},multiply:function(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this},multiplyScalar:function(e){return this.r*=e,this.g*=e,this.b*=e,this},lerp:function(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this},equals:function(e){return e.r===this.r&&e.g===this.g&&e.b===this.b},fromArray:function(e,t){return void 0===t&&(t=0),this.r=e[t],this.g=e[t+1],this.b=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e},toJSON:function(){return this.getHex()}});var Ai={common:{diffuse:{value:new V(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new i(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new r(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new V(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new V(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new i(0,0,1,1)}}},Ri={merge:function(e){for(var t={},r=0;r<e.length;r++){var n,i=this.clone(e[r]);for(n in i)t[n]=i[n]}return t},clone:function(e){var t,r={};for(t in e){r[t]={};for(var n in e[t]){var i=e[t][n];i&&(i.isColor||i.isMatrix3||i.isMatrix4||i.isVector2||i.isVector3||i.isVector4||i.isTexture)?r[t][n]=i.clone():Array.isArray(i)?r[t][n]=i.slice():r[t][n]=i}}return r}},Li={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM            = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3(   1,   0, t.y ),\n\t\t\tvec3(   0, t.z,   0 ),\n\t\t\tvec3( t.w,   0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n",uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n",equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"},Ni={basic:{uniforms:Ri.merge([Ai.common,Ai.aomap,Ai.lightmap,Ai.fog]),vertexShader:Li.meshbasic_vert,fragmentShader:Li.meshbasic_frag},lambert:{uniforms:Ri.merge([Ai.common,Ai.aomap,Ai.lightmap,Ai.emissivemap,Ai.fog,Ai.lights,{emissive:{value:new V(0)}}]),vertexShader:Li.meshlambert_vert,fragmentShader:Li.meshlambert_frag},phong:{uniforms:Ri.merge([Ai.common,Ai.aomap,Ai.lightmap,Ai.emissivemap,Ai.bumpmap,Ai.normalmap,Ai.displacementmap,Ai.gradientmap,Ai.fog,Ai.lights,{emissive:{value:new V(0)},specular:{value:new V(1118481)},shininess:{value:30}}]),vertexShader:Li.meshphong_vert,fragmentShader:Li.meshphong_frag},standard:{uniforms:Ri.merge([Ai.common,Ai.aomap,Ai.lightmap,Ai.emissivemap,Ai.bumpmap,Ai.normalmap,Ai.displacementmap,Ai.roughnessmap,Ai.metalnessmap,Ai.fog,Ai.lights,{emissive:{value:new V(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:Li.meshphysical_vert,fragmentShader:Li.meshphysical_frag},points:{uniforms:Ri.merge([Ai.points,Ai.fog]),vertexShader:Li.points_vert,fragmentShader:Li.points_frag},dashed:{uniforms:Ri.merge([Ai.common,Ai.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Li.linedashed_vert,fragmentShader:Li.linedashed_frag},depth:{uniforms:Ri.merge([Ai.common,Ai.displacementmap]),vertexShader:Li.depth_vert,fragmentShader:Li.depth_frag},normal:{uniforms:Ri.merge([Ai.common,Ai.bumpmap,Ai.normalmap,Ai.displacementmap,{opacity:{value:1}}]),vertexShader:Li.normal_vert,fragmentShader:Li.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Li.cube_vert,fragmentShader:Li.cube_frag},equirect:{uniforms:{tEquirect:{value:null},tFlip:{value:-1}},vertexShader:Li.equirect_vert,fragmentShader:Li.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new c}},vertexShader:Li.distanceRGBA_vert,fragmentShader:Li.distanceRGBA_frag}};Ni.physical={uniforms:Ri.merge([Ni.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:Li.meshphysical_vert,fragmentShader:Li.meshphysical_frag},Object.assign(G.prototype,{set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,r=e.length;t<r;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(){var e=new r;return function(t,r){var n=e.copy(r).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(e){return e=e||new r,this.isEmpty()?e.set(0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return e=e||new r,this.isEmpty()?e.set(0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y},getParameter:function(e,t){return(t||new r).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y)},clampPoint:function(e,t){return(t||new r).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new r;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}});var Ii=0;Object.assign(W.prototype,t.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(e){if(void 0!==e)for(var t in e){var r=e[t];if(void 0===r)console.warn("THREE.Material: '"+t+"' parameter is undefined.");else{var n=this[t];void 0===n?console.warn("THREE."+this.type+": '"+t+"' is not a property of this material."):n&&n.isColor?n.set(r):n&&n.isVector3&&r&&r.isVector3?n.copy(r):this[t]="overdraw"===t?Number(r):r}}},toJSON:function(e){function t(e){var t,r=[];for(t in e){var n=e[t];delete n.metadata,r.push(n)}return r}var r=void 0===e;r&&(e={textures:{},images:{}});var n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};return n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearCoat&&(n.clearCoat=this.clearCoat),void 0!==this.clearCoatRoughness&&(n.clearCoatRoughness=this.clearCoatRoughness),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,n.reflectivity=this.reflectivity),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.size&&(n.size=this.size),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),2!==this.shading&&(n.shading=this.shading),0!==this.side&&(n.side=this.side),0!==this.vertexColors&&(n.vertexColors=this.vertexColors),1>this.opacity&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,0<this.alphaTest&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),1<this.wireframeLinewidth&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),n.skinning=this.skinning,n.morphTargets=this.morphTargets,n.dithering=this.dithering,r&&(r=t(e.textures),e=t(e.images),0<r.length&&(n.textures=r),0<e.length&&(n.images=e)),n},clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.name=e.name,this.fog=e.fog,this.lights=e.lights,this.blending=e.blending,this.side=e.side,this.shading=e.shading,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.premultipliedAlpha=e.premultipliedAlpha,this.overdraw=e.overdraw,this.visible=e.visible,this.clipShadows=e.clipShadows,this.clipIntersection=e.clipIntersection;r=null;if(null!==(e=e.clippingPlanes))for(var t=e.length,r=Array(t),n=0;n!==t;++n)r[n]=e[n].clone();return this.clippingPlanes=r,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),X.prototype=Object.create(W.prototype),X.prototype.constructor=X,X.prototype.isShaderMaterial=!0,X.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=Ri.clone(e.uniforms),this.defines=e.defines,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.lights=e.lights,this.clipping=e.clipping,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this.extensions=e.extensions,this},X.prototype.toJSON=function(e){return e=W.prototype.toJSON.call(this,e),e.uniforms=this.uniforms,e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e},Y.prototype=Object.create(W.prototype),Y.prototype.constructor=Y,Y.prototype.isMeshDepthMaterial=!0,Y.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.depthPacking=e.depthPacking,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this},Object.assign(K.prototype,{isBox3:!0,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromArray:function(e){for(var t=1/0,r=1/0,n=1/0,i=-1/0,o=-1/0,a=-1/0,s=0,c=e.length;s<c;s+=3){var u=e[s],h=e[s+1],l=e[s+2];u<t&&(t=u),h<r&&(r=h),l<n&&(n=l),u>i&&(i=u),h>o&&(o=h),l>a&&(a=l)}return this.min.set(t,r,n),this.max.set(i,o,a),this},setFromBufferAttribute:function(e){for(var t=1/0,r=1/0,n=1/0,i=-1/0,o=-1/0,a=-1/0,s=0,c=e.count;s<c;s++){var u=e.getX(s),h=e.getY(s),l=e.getZ(s);u<t&&(t=u),h<r&&(r=h),l<n&&(n=l),u>i&&(i=u),h>o&&(o=h),l>a&&(a=l)}return this.min.set(t,r,n),this.max.set(i,o,a),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,r=e.length;t<r;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(){var e=new c;return function(t,r){var n=e.copy(r).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}}(),setFromObject:function(e){return this.makeEmpty(),this.expandByObject(e)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(e){return e=e||new c,this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return e=e||new c,this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},expandByObject:function(){var e=new c;return function(t){var r=this;return t.updateMatrixWorld(!0),t.traverse(function(t){var n,i;if(void 0!==(n=t.geometry))if(n.isGeometry){var o=n.vertices;for(n=0,i=o.length;n<i;n++)e.copy(o[n]),e.applyMatrix4(t.matrixWorld),r.expandByPoint(e)}else if(n.isBufferGeometry&&void 0!==(o=n.attributes.position))for(n=0,i=o.count;n<i;n++)e.fromBufferAttribute(o,n).applyMatrix4(t.matrixWorld),r.expandByPoint(e)}),this}}(),containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z},getParameter:function(e,t){return(t||new c).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z)},intersectsSphere:function(){var e=new c;return function(t){return this.clampPoint(t.center,e),e.distanceToSquared(t.center)<=t.radius*t.radius}}(),intersectsPlane:function(e){var t,r;return 0<e.normal.x?(t=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,r=e.normal.x*this.min.x),0<e.normal.y?(t+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),0<e.normal.z?(t+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),t<=e.constant&&r>=e.constant},clampPoint:function(e,t){return(t||new c).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new c;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),getBoundingSphere:function(){var e=new c;return function(t){return t=t||new Z,this.getCenter(t.center),t.radius=.5*this.getSize(e).length(),t}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},applyMatrix4:function(){var e=[new c,new c,new c,new c,new c,new c,new c,new c];return function(t){return this.isEmpty()?this:(e[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),e[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),e[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),e[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),e[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),e[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),e[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),e[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(e),this)}}(),translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}),Object.assign(Z.prototype,{set:function(e,t){return this.center.copy(e),this.radius=t,this},setFromPoints:function(){var e=new K;return function(t,r){var n=this.center;void 0!==r?n.copy(r):e.setFromPoints(t).getCenter(n);for(var i=0,o=0,a=t.length;o<a;o++)i=Math.max(i,n.distanceToSquared(t[o]));return this.radius=Math.sqrt(i),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.center.copy(e.center),this.radius=e.radius,this},empty:function(){return 0>=this.radius},containsPoint:function(e){return e.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(e){return e.distanceTo(this.center)-this.radius},intersectsSphere:function(e){var t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t},intersectsBox:function(e){return e.intersectsSphere(this)},intersectsPlane:function(e){return Math.abs(this.center.dot(e.normal)-e.constant)<=this.radius},clampPoint:function(e,t){var r=this.center.distanceToSquared(e),n=t||new c;return n.copy(e),r>this.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n},getBoundingBox:function(e){return(e=e||new K).set(this.center,this.center),e.expandByScalar(this.radius),e},applyMatrix4:function(e){return this.center.applyMatrix4(e),this.radius*=e.getMaxScaleOnAxis(),this},translate:function(e){return this.center.add(e),this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius}}),Object.assign(J.prototype,{isMatrix3:!0,set:function(e,t,r,n,i,o,a,s,c){var u=this.elements;return u[0]=e,u[1]=n,u[2]=a,u[3]=t,u[4]=i,u[5]=s,u[6]=r,u[7]=o,u[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(e){var t=this.elements;return e=e.elements,t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this},setFromMatrix4:function(e){return e=e.elements,this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},applyToBufferAttribute:function(){var e=new c;return function(t){for(var r=0,n=t.count;r<n;r++)e.x=t.getX(r),e.y=t.getY(r),e.z=t.getZ(r),e.applyMatrix3(this),t.setXYZ(r,e.x,e.y,e.z);return t}}(),multiply:function(e){return this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var r=e.elements,n=t.elements,i=this.elements,o=r[0],a=r[3],s=r[6],c=r[1],u=r[4],h=r[7],l=r[2],p=r[5],r=r[8],f=n[0],d=n[3],m=n[6],v=n[1],g=n[4],y=n[7],b=n[2],_=n[5],n=n[8];return i[0]=o*f+a*v+s*b,i[3]=o*d+a*g+s*_,i[6]=o*m+a*y+s*n,i[1]=c*f+u*v+h*b,i[4]=c*d+u*g+h*_,i[7]=c*m+u*y+h*n,i[2]=l*f+p*v+r*b,i[5]=l*d+p*g+r*_,i[8]=l*m+p*y+r*n,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this},determinant:function(){var e=this.elements,t=e[0],r=e[1],n=e[2],i=e[3],o=e[4],a=e[5],s=e[6],c=e[7];return t*o*(e=e[8])-t*a*c-r*i*e+r*a*s+n*i*c-n*o*s},getInverse:function(e,t){e&&e.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var r=e.elements,n=this.elements,i=r[0],o=r[1],a=r[2],s=r[3],c=r[4],u=r[5],h=r[6],l=r[7],p=(r=r[8])*c-u*l,f=u*h-r*s,d=l*s-c*h,m=i*p+o*f+a*d;if(0===m){if(!0===t)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"),this.identity()}return m=1/m,n[0]=p*m,n[1]=(a*l-r*o)*m,n[2]=(u*o-a*c)*m,n[3]=f*m,n[4]=(r*i-a*h)*m,n[5]=(a*s-u*i)*m,n[6]=d*m,n[7]=(o*h-l*i)*m,n[8]=(c*i-o*s)*m,this},transpose:function(){var e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this},getNormalMatrix:function(e){return this.setFromMatrix4(e).getInverse(this).transpose()},transposeIntoArray:function(e){var t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this},equals:function(e){var t=this.elements;e=e.elements;for(var r=0;9>r;r++)if(t[r]!==e[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var r=0;9>r;r++)this.elements[r]=e[r+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var r=this.elements;return e[t]=r[0],e[t+1]=r[1],e[t+2]=r[2],e[t+3]=r[3],e[t+4]=r[4],e[t+5]=r[5],e[t+6]=r[6],e[t+7]=r[7],e[t+8]=r[8],e}}),Object.assign(Q.prototype,{set:function(e,t){return this.normal.copy(e),this.constant=t,this},setComponents:function(e,t,r,n){return this.normal.set(e,t,r),this.constant=n,this},setFromNormalAndCoplanarPoint:function(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this},setFromCoplanarPoints:function(){var e=new c,t=new c;return function(r,n,i){return n=e.subVectors(i,n).cross(t.subVectors(r,n)).normalize(),this.setFromNormalAndCoplanarPoint(n,r),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.normal.copy(e.normal),this.constant=e.constant,this},normalize:function(){var e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return this.orthoPoint(e,t).sub(e).negate()},orthoPoint:function(e,t){var r=this.distanceToPoint(e);return(t||new c).copy(this.normal).multiplyScalar(r)},intersectLine:function(){var e=new c;return function(t,r){var n=r||new c,i=t.delta(e),o=this.normal.dot(i);return 0!==o?0>(o=-(t.start.dot(this.normal)+this.constant)/o)||1<o?void 0:n.copy(i).multiplyScalar(o).add(t.start):0===this.distanceToPoint(t.start)?n.copy(t.start):void 0}}(),intersectsLine:function(e){var t=this.distanceToPoint(e.start);return e=this.distanceToPoint(e.end),0>t&&0<e||0>e&&0<t},intersectsBox:function(e){return e.intersectsPlane(this)},intersectsSphere:function(e){return e.intersectsPlane(this)},coplanarPoint:function(e){return(e||new c).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var e=new c,t=new J;return function(r,n){var i=this.coplanarPoint(e).applyMatrix4(r),o=n||t.getNormalMatrix(r),o=this.normal.applyMatrix3(o).normalize();return this.constant=-i.dot(o),this}}(),translate:function(e){return this.constant-=e.dot(this.normal),this},equals:function(e){return e.normal.equals(this.normal)&&e.constant===this.constant}}),Object.assign(ee.prototype,{set:function(e,t,r,n,i,o){var a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(r),a[3].copy(n),a[4].copy(i),a[5].copy(o),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){for(var t=this.planes,r=0;6>r;r++)t[r].copy(e.planes[r]);return this},setFromMatrix:function(e){var t=this.planes;e=(v=e.elements)[0];var r=v[1],n=v[2],i=v[3],o=v[4],a=v[5],s=v[6],c=v[7],u=v[8],h=v[9],l=v[10],p=v[11],f=v[12],d=v[13],m=v[14],v=v[15];return t[0].setComponents(i-e,c-o,p-u,v-f).normalize(),t[1].setComponents(i+e,c+o,p+u,v+f).normalize(),t[2].setComponents(i+r,c+a,p+h,v+d).normalize(),t[3].setComponents(i-r,c-a,p-h,v-d).normalize(),t[4].setComponents(i-n,c-s,p-l,v-m).normalize(),t[5].setComponents(i+n,c+s,p+l,v+m).normalize(),this},intersectsObject:function(){var e=new Z;return function(t){var r=t.geometry;return null===r.boundingSphere&&r.computeBoundingSphere(),e.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(e)}}(),intersectsSprite:function(){var e=new Z;return function(t){return e.center.set(0,0,0),e.radius=.7071067811865476,e.applyMatrix4(t.matrixWorld),this.intersectsSphere(e)}}(),intersectsSphere:function(e){var t=this.planes,r=e.center;e=-e.radius;for(var n=0;6>n;n++)if(t[n].distanceToPoint(r)<e)return!1;return!0},intersectsBox:function(){var e=new c,t=new c;return function(r){for(var n=this.planes,i=0;6>i;i++){a=n[i];e.x=0<a.normal.x?r.min.x:r.max.x,t.x=0<a.normal.x?r.max.x:r.min.x,e.y=0<a.normal.y?r.min.y:r.max.y,t.y=0<a.normal.y?r.max.y:r.min.y,e.z=0<a.normal.z?r.min.z:r.max.z,t.z=0<a.normal.z?r.max.z:r.min.z;var o=a.distanceToPoint(e),a=a.distanceToPoint(t);if(0>o&&0>a)return!1}return!0}}(),containsPoint:function(e){for(var t=this.planes,r=0;6>r;r++)if(0>t[r].distanceToPoint(e))return!1;return!0}}),ne.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" "),ne.DefaultOrder="XYZ",Object.defineProperties(ne.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this.onChangeCallback()}},order:{get:function(){return this._order},set:function(e){this._order=e,this.onChangeCallback()}}}),Object.assign(ne.prototype,{isEuler:!0,set:function(e,t,r,n){return this._x=e,this._y=t,this._z=r,this._order=n||this._order,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this.onChangeCallback(),this},setFromRotationMatrix:function(e,t,r){var n=xi.clamp;e=(l=e.elements)[0];var i=l[4],o=l[8],a=l[1],s=l[5],c=l[9],u=l[2],h=l[6],l=l[10];return"XYZ"===(t=t||this._order)?(this._y=Math.asin(n(o,-1,1)),.99999>Math.abs(o)?(this._x=Math.atan2(-c,l),this._z=Math.atan2(-i,e)):(this._x=Math.atan2(h,s),this._z=0)):"YXZ"===t?(this._x=Math.asin(-n(c,-1,1)),.99999>Math.abs(c)?(this._y=Math.atan2(o,l),this._z=Math.atan2(a,s)):(this._y=Math.atan2(-u,e),this._z=0)):"ZXY"===t?(this._x=Math.asin(n(h,-1,1)),.99999>Math.abs(h)?(this._y=Math.atan2(-u,l),this._z=Math.atan2(-i,s)):(this._y=0,this._z=Math.atan2(a,e))):"ZYX"===t?(this._y=Math.asin(-n(u,-1,1)),.99999>Math.abs(u)?(this._x=Math.atan2(h,l),this._z=Math.atan2(a,e)):(this._x=0,this._z=Math.atan2(-i,s))):"YZX"===t?(this._z=Math.asin(n(a,-1,1)),.99999>Math.abs(a)?(this._x=Math.atan2(-c,s),this._y=Math.atan2(-u,e)):(this._x=0,this._y=Math.atan2(o,l))):"XZY"===t?(this._z=Math.asin(-n(i,-1,1)),.99999>Math.abs(i)?(this._x=Math.atan2(h,s),this._y=Math.atan2(o,e)):(this._x=Math.atan2(-c,l),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+t),this._order=t,!1!==r&&this.onChangeCallback(),this},setFromQuaternion:function(){var e=new u;return function(t,r,n){return e.makeRotationFromQuaternion(t),this.setFromRotationMatrix(e,r,n)}}(),setFromVector3:function(e,t){return this.set(e.x,e.y,e.z,t||this._order)},reorder:function(){var e=new s;return function(t){return e.setFromEuler(this),this.setFromQuaternion(e,t)}}(),equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},fromArray:function(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e},toVector3:function(e){return e?e.set(this._x,this._y,this._z):new c(this._x,this._y,this._z)},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){}}),Object.assign(ie.prototype,{set:function(e){this.mask=1<<e|0},enable:function(e){this.mask=this.mask|1<<e|0},toggle:function(e){this.mask^=1<<e|0},disable:function(e){this.mask&=~(1<<e|0)},test:function(e){return 0!=(this.mask&e.mask)}});var Di=0;oe.DefaultUp=new c(0,1,0),oe.DefaultMatrixAutoUpdate=!0,Object.assign(oe.prototype,t.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(e){this.matrix.multiplyMatrices(e,this.matrix),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(e){return this.quaternion.premultiply(e),this},setRotationFromAxisAngle:function(e,t){this.quaternion.setFromAxisAngle(e,t)},setRotationFromEuler:function(e){this.quaternion.setFromEuler(e,!0)},setRotationFromMatrix:function(e){this.quaternion.setFromRotationMatrix(e)},setRotationFromQuaternion:function(e){this.quaternion.copy(e)},rotateOnAxis:function(){var e=new s;return function(t,r){return e.setFromAxisAngle(t,r),this.quaternion.multiply(e),this}}(),rotateX:function(){var e=new c(1,0,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateY:function(){var e=new c(0,1,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateZ:function(){var e=new c(0,0,1);return function(t){return this.rotateOnAxis(e,t)}}(),translateOnAxis:function(){var e=new c;return function(t,r){return e.copy(t).applyQuaternion(this.quaternion),this.position.add(e.multiplyScalar(r)),this}}(),translateX:function(){var e=new c(1,0,0);return function(t){return this.translateOnAxis(e,t)}}(),translateY:function(){var e=new c(0,1,0);return function(t){return this.translateOnAxis(e,t)}}(),translateZ:function(){var e=new c(0,0,1);return function(t){return this.translateOnAxis(e,t)}}(),localToWorld:function(e){return e.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var e=new u;return function(t){return t.applyMatrix4(e.getInverse(this.matrixWorld))}}(),lookAt:function(){var e=new u;return function(t){this.isCamera?e.lookAt(this.position,t,this.up):e.lookAt(t,this.position,this.up),this.quaternion.setFromRotationMatrix(e)}}(),add:function(e){if(1<arguments.length){for(var t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(null!==e.parent&&e.parent.remove(e),e.parent=this,e.dispatchEvent({type:"added"}),this.children.push(e)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)},remove:function(e){if(1<arguments.length){for(var t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}return-1!==(t=this.children.indexOf(e))&&(e.parent=null,e.dispatchEvent({type:"removed"}),this.children.splice(t,1)),this},getObjectById:function(e){return this.getObjectByProperty("id",e)},getObjectByName:function(e){return this.getObjectByProperty("name",e)},getObjectByProperty:function(e,t){if(this[e]===t)return this;for(var r=0,n=this.children.length;r<n;r++){var i=this.children[r].getObjectByProperty(e,t);if(void 0!==i)return i}},getWorldPosition:function(e){return e=e||new c,this.updateMatrixWorld(!0),e.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var e=new c,t=new c;return function(r){return r=r||new s,this.updateMatrixWorld(!0),this.matrixWorld.decompose(e,r,t),r}}(),getWorldRotation:function(){var e=new s;return function(t){return t=t||new ne,this.getWorldQuaternion(e),t.setFromQuaternion(e,this.rotation.order,!1)}}(),getWorldScale:function(){var e=new c,t=new s;return function(r){return r=r||new c,this.updateMatrixWorld(!0),this.matrixWorld.decompose(e,t,r),r}}(),getWorldDirection:function(){var e=new s;return function(t){return t=t||new c,this.getWorldQuaternion(e),t.set(0,0,1).applyQuaternion(e)}}(),raycast:function(){},traverse:function(e){e(this);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].traverse(e)},traverseVisible:function(e){if(!1!==this.visible){e(this);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].traverseVisible(e)}},traverseAncestors:function(e){var t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].updateMatrixWorld(e)},toJSON:function(e){function t(t,r){return void 0===t[r.uuid]&&(t[r.uuid]=r.toJSON(e)),r.uuid}function r(e){var t,r=[];for(t in e){var n=e[t];delete n.metadata,r.push(n)}return r}var n=void 0===e||""===e,i={};n&&(e={geometries:{},materials:{},textures:{},images:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var o={};if(o.uuid=this.uuid,o.type=this.type,""!==this.name&&(o.name=this.name),"{}"!==JSON.stringify(this.userData)&&(o.userData=this.userData),!0===this.castShadow&&(o.castShadow=!0),!0===this.receiveShadow&&(o.receiveShadow=!0),!1===this.visible&&(o.visible=!1),o.matrix=this.matrix.toArray(),void 0!==this.geometry&&(o.geometry=t(e.geometries,this.geometry)),void 0!==this.material)if(Array.isArray(this.material)){for(var a=[],s=0,c=this.material.length;s<c;s++)a.push(t(e.materials,this.material[s]));o.material=a}else o.material=t(e.materials,this.material);if(0<this.children.length)for(o.children=[],s=0;s<this.children.length;s++)o.children.push(this.children[s].toJSON(e).object);return n&&(n=r(e.geometries),a=r(e.materials),s=r(e.textures),c=r(e.images),0<n.length&&(i.geometries=n),0<a.length&&(i.materials=a),0<s.length&&(i.textures=s),0<c.length&&(i.images=c)),i.object=o,i},clone:function(e){return(new this.constructor).copy(this,e)},copy:function(e,t){if(void 0===t&&(t=!0),this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(var r=0;r<e.children.length;r++)this.add(e.children[r].clone());return this}}),ae.prototype=Object.assign(Object.create(oe.prototype),{constructor:ae,isCamera:!0,copy:function(e,t){return oe.prototype.copy.call(this,e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this},getWorldDirection:function(){var e=new s;return function(t){return t=t||new c,this.getWorldQuaternion(e),t.set(0,0,-1).applyQuaternion(e)}}(),updateMatrixWorld:function(e){oe.prototype.updateMatrixWorld.call(this,e),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),se.prototype=Object.assign(Object.create(ae.prototype),{constructor:se,isOrthographicCamera:!0,copy:function(e,t){return ae.prototype.copy.call(this,e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this},setViewOffset:function(e,t,r,n,i,o){this.view={fullWidth:e,fullHeight:t,offsetX:r,offsetY:n,width:i,height:o},this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null,this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),r=(n=(this.right+this.left)/2)-e,n=n+e,e=(o=(this.top+this.bottom)/2)+t,t=o-t;if(null!==this.view)var n=this.zoom/(this.view.width/this.view.fullWidth),t=this.zoom/(this.view.height/this.view.fullHeight),i=(this.right-this.left)/this.view.width,o=(this.top-this.bottom)/this.view.height,r=r+this.view.offsetX/n*i,n=r+this.view.width/n*i,e=e-this.view.offsetY/t*o,t=e-this.view.height/t*o;this.projectionMatrix.makeOrthographic(r,n,e,t,this.near,this.far)},toJSON:function(e){return e=oe.prototype.toJSON.call(this,e),e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}),ce.prototype=Object.assign(Object.create(ae.prototype),{constructor:ce,isPerspectiveCamera:!0,copy:function(e,t){return ae.prototype.copy.call(this,e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this},setFocalLength:function(e){e=.5*this.getFilmHeight()/e,this.fov=2*xi.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var e=Math.tan(.5*xi.DEG2RAD*this.fov);return.5*this.getFilmHeight()/e},getEffectiveFOV:function(){return 2*xi.RAD2DEG*Math.atan(Math.tan(.5*xi.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(e,t,r,n,i,o){this.aspect=e/t,this.view={fullWidth:e,fullHeight:t,offsetX:r,offsetY:n,width:i,height:o},this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null,this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=this.near,t=2*(a=e*Math.tan(.5*xi.DEG2RAD*this.fov)/this.zoom),r=-.5*(s=this.aspect*t),n=this.view;if(null!==n)var i=n.fullWidth,o=n.fullHeight,r=r+n.offsetX*s/i,a=a-n.offsetY*t/o,s=n.width/i*s,t=n.height/o*t;0!==(n=this.filmOffset)&&(r+=e*n/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,a,a-t,e,this.far)},toJSON:function(e){return e=oe.prototype.toJSON.call(this,e),e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}),Object.assign(ue.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.a=e.a,this.b=e.b,this.c=e.c,this.normal.copy(e.normal),this.color.copy(e.color),this.materialIndex=e.materialIndex;for(var t=0,r=e.vertexNormals.length;t<r;t++)this.vertexNormals[t]=e.vertexNormals[t].clone();for(t=0,r=e.vertexColors.length;t<r;t++)this.vertexColors[t]=e.vertexColors[t].clone();return this}});var ki=0;Object.assign(he.prototype,t.prototype,{isGeometry:!0,applyMatrix:function(e){for(var t=(new J).getNormalMatrix(e),r=0,n=this.vertices.length;r<n;r++)this.vertices[r].applyMatrix4(e);for(r=0,n=this.faces.length;r<n;r++){(e=this.faces[r]).normal.applyMatrix3(t).normalize();for(var i=0,o=e.vertexNormals.length;i<o;i++)e.vertexNormals[i].applyMatrix3(t).normalize()}return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.normalsNeedUpdate=this.verticesNeedUpdate=!0,this},rotateX:function(){var e=new u;return function(t){return e.makeRotationX(t),this.applyMatrix(e),this}}(),rotateY:function(){var e=new u;return function(t){return e.makeRotationY(t),this.applyMatrix(e),this}}(),rotateZ:function(){var e=new u;return function(t){return e.makeRotationZ(t),this.applyMatrix(e),this}}(),translate:function(){var e=new u;return function(t,r,n){return e.makeTranslation(t,r,n),this.applyMatrix(e),this}}(),scale:function(){var e=new u;return function(t,r,n){return e.makeScale(t,r,n),this.applyMatrix(e),this}}(),lookAt:function(){var e=new oe;return function(t){e.lookAt(t),e.updateMatrix(),this.applyMatrix(e.matrix)}}(),fromBufferGeometry:function(e){function t(e,t,r,i){i=new ue(e,t,r,void 0!==s?[p[e].clone(),p[t].clone(),p[r].clone()]:[],void 0!==u?[n.colors[e].clone(),n.colors[t].clone(),n.colors[r].clone()]:[],i),n.faces.push(i),void 0!==h&&n.faceVertexUvs[0].push([f[e].clone(),f[t].clone(),f[r].clone()]),void 0!==l&&n.faceVertexUvs[1].push([d[e].clone(),d[t].clone(),d[r].clone()])}var n=this,i=null!==e.index?e.index.array:void 0,o=e.attributes,a=o.position.array,s=void 0!==o.normal?o.normal.array:void 0,u=void 0!==o.color?o.color.array:void 0,h=void 0!==o.uv?o.uv.array:void 0,l=void 0!==o.uv2?o.uv2.array:void 0;void 0!==l&&(this.faceVertexUvs[1]=[]);for(var p=[],f=[],d=[],m=o=0;o<a.length;o+=3,m+=2)n.vertices.push(new c(a[o],a[o+1],a[o+2])),void 0!==s&&p.push(new c(s[o],s[o+1],s[o+2])),void 0!==u&&n.colors.push(new V(u[o],u[o+1],u[o+2])),void 0!==h&&f.push(new r(h[m],h[m+1])),void 0!==l&&d.push(new r(l[m],l[m+1]));var v=e.groups;if(0<v.length)for(o=0;o<v.length;o++)for(var a=v[o],g=a.start,y=a.count,m=g,g=g+y;m<g;m+=3)void 0!==i?t(i[m],i[m+1],i[m+2],a.materialIndex):t(m,m+1,m+2,a.materialIndex);else if(void 0!==i)for(o=0;o<i.length;o+=3)t(i[o],i[o+1],i[o+2]);else for(o=0;o<a.length/3;o+=3)t(o,o+1,o+2);return this.computeFaceNormals(),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),this},center:function(){this.computeBoundingBox();var e=this.boundingBox.getCenter().negate();return this.translate(e.x,e.y,e.z),e},normalize:function(){this.computeBoundingSphere();var e=this.boundingSphere.center,t=0===(t=this.boundingSphere.radius)?1:1/t,r=new u;return r.set(t,0,0,-t*e.x,0,t,0,-t*e.y,0,0,t,-t*e.z,0,0,0,1),this.applyMatrix(r),this},computeFaceNormals:function(){for(var e=new c,t=new c,r=0,n=this.faces.length;r<n;r++){var i=this.faces[r],o=this.vertices[i.a],a=this.vertices[i.b];e.subVectors(this.vertices[i.c],a),t.subVectors(o,a),e.cross(t),e.normalize(),i.normal.copy(e)}},computeVertexNormals:function(e){void 0===e&&(e=!0);var t,r,n;for(n=Array(this.vertices.length),t=0,r=this.vertices.length;t<r;t++)n[t]=new c;if(e){var i,o,a,s=new c,u=new c;for(e=0,t=this.faces.length;e<t;e++)r=this.faces[e],i=this.vertices[r.a],o=this.vertices[r.b],a=this.vertices[r.c],s.subVectors(a,o),u.subVectors(i,o),s.cross(u),n[r.a].add(s),n[r.b].add(s),n[r.c].add(s)}else for(this.computeFaceNormals(),e=0,t=this.faces.length;e<t;e++)r=this.faces[e],n[r.a].add(r.normal),n[r.b].add(r.normal),n[r.c].add(r.normal);for(t=0,r=this.vertices.length;t<r;t++)n[t].normalize();for(e=0,t=this.faces.length;e<t;e++)r=this.faces[e],3===(i=r.vertexNormals).length?(i[0].copy(n[r.a]),i[1].copy(n[r.b]),i[2].copy(n[r.c])):(i[0]=n[r.a].clone(),i[1]=n[r.b].clone(),i[2]=n[r.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var e,t,r;for(this.computeFaceNormals(),e=0,t=this.faces.length;e<t;e++){var n=(r=this.faces[e]).vertexNormals;3===n.length?(n[0].copy(r.normal),n[1].copy(r.normal),n[2].copy(r.normal)):(n[0]=r.normal.clone(),n[1]=r.normal.clone(),n[2]=r.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var e,t,r,n,i;for(r=0,n=this.faces.length;r<n;r++)for((i=this.faces[r]).__originalFaceNormal?i.__originalFaceNormal.copy(i.normal):i.__originalFaceNormal=i.normal.clone(),i.__originalVertexNormals||(i.__originalVertexNormals=[]),e=0,t=i.vertexNormals.length;e<t;e++)i.__originalVertexNormals[e]?i.__originalVertexNormals[e].copy(i.vertexNormals[e]):i.__originalVertexNormals[e]=i.vertexNormals[e].clone();var o=new he;for(o.faces=this.faces,e=0,t=this.morphTargets.length;e<t;e++){if(!this.morphNormals[e]){this.morphNormals[e]={},this.morphNormals[e].faceNormals=[],this.morphNormals[e].vertexNormals=[],i=this.morphNormals[e].faceNormals;var a,s,u=this.morphNormals[e].vertexNormals;for(r=0,n=this.faces.length;r<n;r++)a=new c,s={a:new c,b:new c,c:new c},i.push(a),u.push(s)}for(u=this.morphNormals[e],o.vertices=this.morphTargets[e].vertices,o.computeFaceNormals(),o.computeVertexNormals(),r=0,n=this.faces.length;r<n;r++)i=this.faces[r],a=u.faceNormals[r],s=u.vertexNormals[r],a.copy(i.normal),s.a.copy(i.vertexNormals[0]),s.b.copy(i.vertexNormals[1]),s.c.copy(i.vertexNormals[2])}for(r=0,n=this.faces.length;r<n;r++)i=this.faces[r],i.normal=i.__originalFaceNormal,i.vertexNormals=i.__originalVertexNormals},computeLineDistances:function(){for(var e=0,t=this.vertices,r=0,n=t.length;r<n;r++)0<r&&(e+=t[r].distanceTo(t[r-1])),this.lineDistances[r]=e},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new K),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Z),this.boundingSphere.setFromPoints(this.vertices)},merge:function(e,t,r){if(e&&e.isGeometry){var n,i=this.vertices.length,o=this.vertices,a=e.vertices,s=this.faces,c=e.faces,u=this.faceVertexUvs[0],h=e.faceVertexUvs[0],l=this.colors,p=e.colors;void 0===r&&(r=0),void 0!==t&&(n=(new J).getNormalMatrix(t)),e=0;for(var f=a.length;e<f;e++){var d=a[e].clone();void 0!==t&&d.applyMatrix4(t),o.push(d)}for(e=0,f=p.length;e<f;e++)l.push(p[e].clone());for(e=0,f=c.length;e<f;e++){var m=(a=c[e]).vertexNormals,p=a.vertexColors;for((l=new ue(a.a+i,a.b+i,a.c+i)).normal.copy(a.normal),void 0!==n&&l.normal.applyMatrix3(n).normalize(),t=0,o=m.length;t<o;t++)d=m[t].clone(),void 0!==n&&d.applyMatrix3(n).normalize(),l.vertexNormals.push(d);for(l.color.copy(a.color),t=0,o=p.length;t<o;t++)d=p[t],l.vertexColors.push(d.clone());l.materialIndex=a.materialIndex+r,s.push(l)}for(e=0,f=h.length;e<f;e++)if(r=h[e],n=[],void 0!==r){for(t=0,o=r.length;t<o;t++)n.push(r[t].clone());u.push(n)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",e)},mergeMesh:function(e){e&&e.isMesh?(e.matrixAutoUpdate&&e.updateMatrix(),this.merge(e.geometry,e.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",e)},mergeVertices:function(){var e,t,r,n={},i=[],o=[],a=Math.pow(10,4);for(t=0,r=this.vertices.length;t<r;t++)e=this.vertices[t],e=Math.round(e.x*a)+"_"+Math.round(e.y*a)+"_"+Math.round(e.z*a),void 0===n[e]?(n[e]=t,i.push(this.vertices[t]),o[t]=i.length-1):o[t]=o[n[e]];for(n=[],t=0,r=this.faces.length;t<r;t++)for(a=this.faces[t],a.a=o[a.a],a.b=o[a.b],a.c=o[a.c],a=[a.a,a.b,a.c],e=0;3>e;e++)if(a[e]===a[(e+1)%3]){n.push(t);break}for(t=n.length-1;0<=t;t--)for(a=n[t],this.faces.splice(a,1),o=0,r=this.faceVertexUvs.length;o<r;o++)this.faceVertexUvs[o].splice(a,1);return t=this.vertices.length-i.length,this.vertices=i,t},sortFacesByMaterialIndex:function(){for(var e=this.faces,t=e.length,r=0;r<t;r++)e[r]._id=r;e.sort(function(e,t){return e.materialIndex-t.materialIndex});var n,i,o=this.faceVertexUvs[0],a=this.faceVertexUvs[1];for(o&&o.length===t&&(n=[]),a&&a.length===t&&(i=[]),r=0;r<t;r++){var s=e[r]._id;n&&n.push(o[s]),i&&i.push(a[s])}n&&(this.faceVertexUvs[0]=n),i&&(this.faceVertexUvs[1]=i)},toJSON:function(){function e(e,t,r){return r?e|1<<t:e&~(1<<t)}function t(e){var t=e.x.toString()+e.y.toString()+e.z.toString();return void 0!==u[t]?u[t]:(u[t]=c.length/3,c.push(e.x,e.y,e.z),u[t])}function r(e){var t=e.r.toString()+e.g.toString()+e.b.toString();return void 0!==l[t]?l[t]:(l[t]=h.length,h.push(e.getHex()),l[t])}function n(e){var t=e.x.toString()+e.y.toString();return void 0!==f[t]?f[t]:(f[t]=p.length/2,p.push(e.x,e.y),f[t])}var i={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),void 0!==this.parameters){var o,a=this.parameters;for(o in a)void 0!==a[o]&&(i[o]=a[o]);return i}for(a=[],o=0;o<this.vertices.length;o++){s=this.vertices[o];a.push(s.x,s.y,s.z)}var s=[],c=[],u={},h=[],l={},p=[],f={};for(o=0;o<this.faces.length;o++){var d=this.faces[o],m=void 0!==this.faceVertexUvs[0][o],v=0<d.normal.length(),g=0<d.vertexNormals.length,y=1!==d.color.r||1!==d.color.g||1!==d.color.b,b=0<d.vertexColors.length,_=e(_=e(_=e(_=e(_=e(_=e(_=e(_=e(_=0,0,0),1,!0),2,!1),3,m),4,v),5,g),6,y),7,b);s.push(_),s.push(d.a,d.b,d.c),s.push(d.materialIndex),m&&(m=this.faceVertexUvs[0][o],s.push(n(m[0]),n(m[1]),n(m[2]))),v&&s.push(t(d.normal)),g&&(v=d.vertexNormals,s.push(t(v[0]),t(v[1]),t(v[2]))),y&&s.push(r(d.color)),b&&(d=d.vertexColors,s.push(r(d[0]),r(d[1]),r(d[2])))}return i.data={},i.data.vertices=a,i.data.normals=c,0<h.length&&(i.data.colors=h),0<p.length&&(i.data.uvs=[p]),i.data.faces=s,i},clone:function(){return(new he).copy(this)},copy:function(e){var t,r,n,i,o,a;for(this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingSphere=this.boundingBox=null,this.name=e.name,t=0,r=(n=e.vertices).length;t<r;t++)this.vertices.push(n[t].clone());for(t=0,r=(n=e.colors).length;t<r;t++)this.colors.push(n[t].clone());for(t=0,r=(n=e.faces).length;t<r;t++)this.faces.push(n[t].clone());for(t=0,r=e.faceVertexUvs.length;t<r;t++){var s=e.faceVertexUvs[t];for(void 0===this.faceVertexUvs[t]&&(this.faceVertexUvs[t]=[]),n=0,i=s.length;n<i;n++){var c=s[n],u=[];for(o=0,a=c.length;o<a;o++)u.push(c[o].clone());this.faceVertexUvs[t].push(u)}}for(t=0,r=(o=e.morphTargets).length;t<r;t++){if(a={},a.name=o[t].name,void 0!==o[t].vertices)for(a.vertices=[],n=0,i=o[t].vertices.length;n<i;n++)a.vertices.push(o[t].vertices[n].clone());if(void 0!==o[t].normals)for(a.normals=[],n=0,i=o[t].normals.length;n<i;n++)a.normals.push(o[t].normals[n].clone());this.morphTargets.push(a)}for(t=0,r=(o=e.morphNormals).length;t<r;t++){if(a={},void 0!==o[t].vertexNormals)for(a.vertexNormals=[],n=0,i=o[t].vertexNormals.length;n<i;n++)s=o[t].vertexNormals[n],c={},c.a=s.a.clone(),c.b=s.b.clone(),c.c=s.c.clone(),a.vertexNormals.push(c);if(void 0!==o[t].faceNormals)for(a.faceNormals=[],n=0,i=o[t].faceNormals.length;n<i;n++)a.faceNormals.push(o[t].faceNormals[n].clone());this.morphNormals.push(a)}for(t=0,r=(n=e.skinWeights).length;t<r;t++)this.skinWeights.push(n[t].clone());for(t=0,r=(n=e.skinIndices).length;t<r;t++)this.skinIndices.push(n[t].clone());for(t=0,r=(n=e.lineDistances).length;t<r;t++)this.lineDistances.push(n[t]);return null!==(t=e.boundingBox)&&(this.boundingBox=t.clone()),null!==(t=e.boundingSphere)&&(this.boundingSphere=t.clone()),this.elementsNeedUpdate=e.elementsNeedUpdate,this.verticesNeedUpdate=e.verticesNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.lineDistancesNeedUpdate=e.lineDistancesNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(le.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(le.prototype,{isBufferAttribute:!0,setArray:function(e){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==e?e.length/this.itemSize:0,this.array=e},setDynamic:function(e){return this.dynamic=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.dynamic=e.dynamic,this},copyAt:function(e,t,r){e*=this.itemSize,r*=t.itemSize;for(var n=0,i=this.itemSize;n<i;n++)this.array[e+n]=t.array[r+n];return this},copyArray:function(e){return this.array.set(e),this},copyColorsArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];void 0===o&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),o=new V),t[r++]=o.r,t[r++]=o.g,t[r++]=o.b}return this},copyIndicesArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];t[r++]=o.a,t[r++]=o.b,t[r++]=o.c}return this},copyVector2sArray:function(e){for(var t=this.array,n=0,i=0,o=e.length;i<o;i++){var a=e[i];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),a=new r),t[n++]=a.x,t[n++]=a.y}return this},copyVector3sArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];void 0===o&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),o=new c),t[r++]=o.x,t[r++]=o.y,t[r++]=o.z}return this},copyVector4sArray:function(e){for(var t=this.array,r=0,n=0,o=e.length;n<o;n++){var a=e[n];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),a=new i),t[r++]=a.x,t[r++]=a.y,t[r++]=a.z,t[r++]=a.w}return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},getX:function(e){return this.array[e*this.itemSize]},setX:function(e,t){return this.array[e*this.itemSize]=t,this},getY:function(e){return this.array[e*this.itemSize+1]},setY:function(e,t){return this.array[e*this.itemSize+1]=t,this},getZ:function(e){return this.array[e*this.itemSize+2]},setZ:function(e,t){return this.array[e*this.itemSize+2]=t,this},getW:function(e){return this.array[e*this.itemSize+3]},setW:function(e,t){return this.array[e*this.itemSize+3]=t,this},setXY:function(e,t,r){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this},setXYZ:function(e,t,r,n){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this.array[e+2]=n,this},setXYZW:function(e,t,r,n,i){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this.array[e+2]=n,this.array[e+3]=i,this},onUpload:function(e){return this.onUploadCallback=e,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)}}),(pe.prototype=Object.create(le.prototype)).constructor=pe,(fe.prototype=Object.create(le.prototype)).constructor=fe,(de.prototype=Object.create(le.prototype)).constructor=de,(me.prototype=Object.create(le.prototype)).constructor=me,ve.prototype=Object.create(le.prototype),ve.prototype.constructor=ve,(ge.prototype=Object.create(le.prototype)).constructor=ge,ye.prototype=Object.create(le.prototype),ye.prototype.constructor=ye,be.prototype=Object.create(le.prototype),be.prototype.constructor=be,(_e.prototype=Object.create(le.prototype)).constructor=_e,Object.assign(xe.prototype,{computeGroups:function(e){var t,r=[],n=void 0;e=e.faces;for(var i=0;i<e.length;i++){var o=e[i];o.materialIndex!==n&&(n=o.materialIndex,void 0!==t&&(t.count=3*i-t.start,r.push(t)),t={start:3*i,materialIndex:n})}void 0!==t&&(t.count=3*i-t.start,r.push(t)),this.groups=r},fromGeometry:function(e){var t,n=e.faces,i=e.vertices,o=e.faceVertexUvs,a=o[0]&&0<o[0].length,s=o[1]&&0<o[1].length,c=e.morphTargets,u=c.length;if(0<u){t=[];for(g=0;g<u;g++)t[g]=[];this.morphTargets.position=t}var h,l=e.morphNormals,p=l.length;if(0<p){for(h=[],g=0;g<p;g++)h[g]=[];this.morphTargets.normal=h}for(var f=e.skinIndices,d=e.skinWeights,m=f.length===i.length,v=d.length===i.length,g=0;g<n.length;g++){var y=n[g];this.vertices.push(i[y.a],i[y.b],i[y.c]);var b=y.vertexNormals;for(3===b.length?this.normals.push(b[0],b[1],b[2]):(b=y.normal,this.normals.push(b,b,b)),3===(b=y.vertexColors).length?this.colors.push(b[0],b[1],b[2]):(b=y.color,this.colors.push(b,b,b)),!0===a&&(void 0!==(b=o[0][g])?this.uvs.push(b[0],b[1],b[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",g),this.uvs.push(new r,new r,new r))),!0===s&&(void 0!==(b=o[1][g])?this.uvs2.push(b[0],b[1],b[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",g),this.uvs2.push(new r,new r,new r))),b=0;b<u;b++){var _=c[b].vertices;t[b].push(_[y.a],_[y.b],_[y.c])}for(b=0;b<p;b++)_=l[b].vertexNormals[g],h[b].push(_.a,_.b,_.c);m&&this.skinIndices.push(f[y.a],f[y.b],f[y.c]),v&&this.skinWeights.push(d[y.a],d[y.b],d[y.c])}return this.computeGroups(e),this.verticesNeedUpdate=e.verticesNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,this}}),Se.MaxIndex=65535,Object.assign(Se.prototype,t.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(e){Array.isArray(e)?this.index=new(65535<we(e)?ye:ve)(e,1):this.index=e},addAttribute:function(e,t,r){if(t&&t.isBufferAttribute||t&&t.isInterleavedBufferAttribute){if("index"!==e)return this.attributes[e]=t,this;console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(t)}else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(e,new le(t,r))},getAttribute:function(e){return this.attributes[e]},removeAttribute:function(e){return delete this.attributes[e],this},addGroup:function(e,t,r){this.groups.push({start:e,count:t,materialIndex:void 0!==r?r:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(e,t){this.drawRange.start=e,this.drawRange.count=t},applyMatrix:function(e){var t=this.attributes.position;return void 0!==t&&(e.applyToBufferAttribute(t),t.needsUpdate=!0),void 0!==(t=this.attributes.normal)&&((new J).getNormalMatrix(e).applyToBufferAttribute(t),t.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(){var e=new u;return function(t){return e.makeRotationX(t),this.applyMatrix(e),this}}(),rotateY:function(){var e=new u;return function(t){return e.makeRotationY(t),this.applyMatrix(e),this}}(),rotateZ:function(){var e=new u;return function(t){return e.makeRotationZ(t),this.applyMatrix(e),this}}(),translate:function(){var e=new u;return function(t,r,n){return e.makeTranslation(t,r,n),this.applyMatrix(e),this}}(),scale:function(){var e=new u;return function(t,r,n){return e.makeScale(t,r,n),this.applyMatrix(e),this}}(),lookAt:function(){var e=new oe;return function(t){e.lookAt(t),e.updateMatrix(),this.applyMatrix(e.matrix)}}(),center:function(){this.computeBoundingBox();var e=this.boundingBox.getCenter().negate();return this.translate(e.x,e.y,e.z),e},setFromObject:function(e){var t=e.geometry;if(e.isPoints||e.isLine){e=new be(3*t.vertices.length,3);var r=new be(3*t.colors.length,3);this.addAttribute("position",e.copyVector3sArray(t.vertices)),this.addAttribute("color",r.copyColorsArray(t.colors)),t.lineDistances&&t.lineDistances.length===t.vertices.length&&(e=new be(t.lineDistances.length,1),this.addAttribute("lineDistance",e.copyArray(t.lineDistances))),null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone())}else e.isMesh&&t&&t.isGeometry&&this.fromGeometry(t);return this},updateFromObject:function(e){var t=e.geometry;if(e.isMesh){var r=t.__directGeometry;if(!0===t.elementsNeedUpdate&&(r=void 0,t.elementsNeedUpdate=!1),void 0===r)return this.fromGeometry(t);r.verticesNeedUpdate=t.verticesNeedUpdate,r.normalsNeedUpdate=t.normalsNeedUpdate,r.colorsNeedUpdate=t.colorsNeedUpdate,r.uvsNeedUpdate=t.uvsNeedUpdate,r.groupsNeedUpdate=t.groupsNeedUpdate,t.verticesNeedUpdate=!1,t.normalsNeedUpdate=!1,t.colorsNeedUpdate=!1,t.uvsNeedUpdate=!1,t.groupsNeedUpdate=!1,t=r}return!0===t.verticesNeedUpdate&&(void 0!==(r=this.attributes.position)&&(r.copyVector3sArray(t.vertices),r.needsUpdate=!0),t.verticesNeedUpdate=!1),!0===t.normalsNeedUpdate&&(void 0!==(r=this.attributes.normal)&&(r.copyVector3sArray(t.normals),r.needsUpdate=!0),t.normalsNeedUpdate=!1),!0===t.colorsNeedUpdate&&(void 0!==(r=this.attributes.color)&&(r.copyColorsArray(t.colors),r.needsUpdate=!0),t.colorsNeedUpdate=!1),t.uvsNeedUpdate&&(void 0!==(r=this.attributes.uv)&&(r.copyVector2sArray(t.uvs),r.needsUpdate=!0),t.uvsNeedUpdate=!1),t.lineDistancesNeedUpdate&&(void 0!==(r=this.attributes.lineDistance)&&(r.copyArray(t.lineDistances),r.needsUpdate=!0),t.lineDistancesNeedUpdate=!1),t.groupsNeedUpdate&&(t.computeGroups(e.geometry),this.groups=t.groups,t.groupsNeedUpdate=!1),this},fromGeometry:function(e){return e.__directGeometry=(new xe).fromGeometry(e),this.fromDirectGeometry(e.__directGeometry)},fromDirectGeometry:function(e){r=new Float32Array(3*e.vertices.length);this.addAttribute("position",new le(r,3).copyVector3sArray(e.vertices)),0<e.normals.length&&(r=new Float32Array(3*e.normals.length),this.addAttribute("normal",new le(r,3).copyVector3sArray(e.normals))),0<e.colors.length&&(r=new Float32Array(3*e.colors.length),this.addAttribute("color",new le(r,3).copyColorsArray(e.colors))),0<e.uvs.length&&(r=new Float32Array(2*e.uvs.length),this.addAttribute("uv",new le(r,2).copyVector2sArray(e.uvs))),0<e.uvs2.length&&(r=new Float32Array(2*e.uvs2.length),this.addAttribute("uv2",new le(r,2).copyVector2sArray(e.uvs2))),0<e.indices.length&&(r=new(65535<we(e.indices)?Uint32Array:Uint16Array)(3*e.indices.length),this.setIndex(new le(r,1).copyIndicesArray(e.indices))),this.groups=e.groups;for(var t in e.morphTargets){for(var r=[],n=e.morphTargets[t],i=0,o=n.length;i<o;i++){var a=n[i],s=new be(3*a.length,3);r.push(s.copyVector3sArray(a))}this.morphAttributes[t]=r}return 0<e.skinIndices.length&&(t=new be(4*e.skinIndices.length,4),this.addAttribute("skinIndex",t.copyVector4sArray(e.skinIndices))),0<e.skinWeights.length&&(t=new be(4*e.skinWeights.length,4),this.addAttribute("skinWeight",t.copyVector4sArray(e.skinWeights))),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new K);var e=this.attributes.position;void 0!==e?this.boundingBox.setFromBufferAttribute(e):this.boundingBox.makeEmpty(),(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var e=new K,t=new c;return function(){null===this.boundingSphere&&(this.boundingSphere=new Z);var r=this.attributes.position;if(r){var n=this.boundingSphere.center;e.setFromBufferAttribute(r),e.getCenter(n);for(var i=0,o=0,a=r.count;o<a;o++)t.x=r.getX(o),t.y=r.getY(o),t.z=r.getZ(o),i=Math.max(i,n.distanceToSquared(t));this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var e=this.index,t=this.attributes,r=this.groups;if(t.position){var n=t.position.array;if(void 0===t.normal)this.addAttribute("normal",new le(new Float32Array(n.length),3));else for(var i=t.normal.array,o=0,a=i.length;o<a;o++)i[o]=0;var s,u,h,i=t.normal.array,l=new c,p=new c,f=new c,d=new c,m=new c;if(e){e=e.array,0===r.length&&this.addGroup(0,e.length);for(var v=0,g=r.length;v<g;++v)for(o=r[v],a=o.start,s=o.count,o=a,a+=s;o<a;o+=3)s=3*e[o+0],u=3*e[o+1],h=3*e[o+2],l.fromArray(n,s),p.fromArray(n,u),f.fromArray(n,h),d.subVectors(f,p),m.subVectors(l,p),d.cross(m),i[s]+=d.x,i[s+1]+=d.y,i[s+2]+=d.z,i[u]+=d.x,i[u+1]+=d.y,i[u+2]+=d.z,i[h]+=d.x,i[h+1]+=d.y,i[h+2]+=d.z}else for(o=0,a=n.length;o<a;o+=9)l.fromArray(n,o),p.fromArray(n,o+3),f.fromArray(n,o+6),d.subVectors(f,p),m.subVectors(l,p),d.cross(m),i[o]=d.x,i[o+1]=d.y,i[o+2]=d.z,i[o+3]=d.x,i[o+4]=d.y,i[o+5]=d.z,i[o+6]=d.x,i[o+7]=d.y,i[o+8]=d.z;this.normalizeNormals(),t.normal.needsUpdate=!0}},merge:function(e,t){if(e&&e.isBufferGeometry){void 0===t&&(t=0);var r,n=this.attributes;for(r in n)if(void 0!==e.attributes[r])for(var i=n[r].array,o=e.attributes[r],a=o.array,s=0,o=o.itemSize*t;s<a.length;s++,o++)i[o]=a[s];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",e)},normalizeNormals:function(){for(var e,t,r,n,i=this.attributes.normal,o=0,a=i.count;o<a;o++)e=i.getX(o),t=i.getY(o),r=i.getZ(o),n=1/Math.sqrt(e*e+t*t+r*r),i.setXYZ(o,e*n,t*n,r*n)},toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var e,t=new Se,r=this.index.array,n=this.attributes;for(e in n){for(var i,o=(a=n[e]).array,a=a.itemSize,s=new o.constructor(r.length*a),c=0,u=0,h=r.length;u<h;u++){i=r[u]*a;for(var l=0;l<a;l++)s[c++]=o[i++]}t.addAttribute(e,new le(s,a))}return t},toJSON:function(){var e={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),void 0!==this.parameters){var t,r=this.parameters;for(t in r)void 0!==r[t]&&(e[t]=r[t]);return e}e.data={attributes:{}};var n=this.index;null!==n&&(r=Array.prototype.slice.call(n.array),e.data.index={type:n.array.constructor.name,array:r}),n=this.attributes;for(t in n){var i=n[t],r=Array.prototype.slice.call(i.array);e.data.attributes[t]={itemSize:i.itemSize,type:i.array.constructor.name,array:r,normalized:i.normalized}}return 0<(t=this.groups).length&&(e.data.groups=JSON.parse(JSON.stringify(t))),null!==(t=this.boundingSphere)&&(e.data.boundingSphere={center:t.center.toArray(),radius:t.radius}),e},clone:function(){return(new Se).copy(this)},copy:function(e){var t,r,n;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingSphere=this.boundingBox=null,this.name=e.name,null!==(r=e.index)&&this.setIndex(r.clone()),r=e.attributes;for(t in r)this.addAttribute(t,r[t].clone());var i=e.morphAttributes;for(t in i){var o=[],a=i[t];for(r=0,n=a.length;r<n;r++)o.push(a[r].clone());this.morphAttributes[t]=o}for(r=0,n=(t=e.groups).length;r<n;r++)i=t[r],this.addGroup(i.start,i.count,i.materialIndex);return null!==(t=e.boundingBox)&&(this.boundingBox=t.clone()),null!==(t=e.boundingSphere)&&(this.boundingSphere=t.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),(Me.prototype=Object.create(he.prototype)).constructor=Me,Ee.prototype=Object.create(Se.prototype),Ee.prototype.constructor=Ee,(Ce.prototype=Object.create(he.prototype)).constructor=Ce,Te.prototype=Object.create(Se.prototype),Te.prototype.constructor=Te,Oe.prototype=Object.create(W.prototype),Oe.prototype.constructor=Oe,Oe.prototype.isMeshBasicMaterial=!0,Oe.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this},Object.assign(Pe.prototype,{set:function(e,t){return this.origin.copy(e),this.direction.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this},at:function(e,t){return(t||new c).copy(this.direction).multiplyScalar(e).add(this.origin)},lookAt:function(e){return this.direction.copy(e).sub(this.origin).normalize(),this},recast:function(){var e=new c;return function(t){return this.origin.copy(this.at(t,e)),this}}(),closestPointToPoint:function(e,t){var r=t||new c;r.subVectors(e,this.origin);var n=r.dot(this.direction);return 0>n?r.copy(this.origin):r.copy(this.direction).multiplyScalar(n).add(this.origin)},distanceToPoint:function(e){return Math.sqrt(this.distanceSqToPoint(e))},distanceSqToPoint:function(){var e=new c;return function(t){var r=e.subVectors(t,this.origin).dot(this.direction);return 0>r?this.origin.distanceToSquared(t):(e.copy(this.direction).multiplyScalar(r).add(this.origin),e.distanceToSquared(t))}}(),distanceSqToSegment:function(){var e=new c,t=new c,r=new c;return function(n,i,o,a){e.copy(n).add(i).multiplyScalar(.5),t.copy(i).sub(n).normalize(),r.copy(this.origin).sub(e);var s,c=.5*n.distanceTo(i),u=-this.direction.dot(t),h=r.dot(this.direction),l=-r.dot(t),p=r.lengthSq(),f=Math.abs(1-u*u);return 0<f?(n=u*l-h,i=u*h-l,s=c*f,0<=n?i>=-s?i<=s?(c=1/f,n*=c,i*=c,u=n*(n+u*i+2*h)+i*(u*n+i+2*l)+p):(i=c,n=Math.max(0,-(u*i+h)),u=-n*n+i*(i+2*l)+p):(i=-c,n=Math.max(0,-(u*i+h)),u=-n*n+i*(i+2*l)+p):i<=-s?(n=Math.max(0,-(-u*c+h)),i=0<n?-c:Math.min(Math.max(-c,-l),c),u=-n*n+i*(i+2*l)+p):i<=s?(n=0,i=Math.min(Math.max(-c,-l),c),u=i*(i+2*l)+p):(n=Math.max(0,-(u*c+h)),i=0<n?c:Math.min(Math.max(-c,-l),c),u=-n*n+i*(i+2*l)+p)):(i=0<u?-c:c,n=Math.max(0,-(u*i+h)),u=-n*n+i*(i+2*l)+p),o&&o.copy(this.direction).multiplyScalar(n).add(this.origin),a&&a.copy(t).multiplyScalar(i).add(e),u}}(),intersectSphere:function(){var e=new c;return function(t,r){e.subVectors(t.center,this.origin);var n=e.dot(this.direction),i=e.dot(e)-n*n,o=t.radius*t.radius;return i>o?null:(o=Math.sqrt(o-i),i=n-o,n+=o,0>i&&0>n?null:0>i?this.at(n,r):this.at(i,r))}}(),intersectsSphere:function(e){return this.distanceToPoint(e.center)<=e.radius},distanceToPlane:function(e){var t=e.normal.dot(this.direction);return 0===t?0===e.distanceToPoint(this.origin)?0:null:0<=(e=-(this.origin.dot(e.normal)+e.constant)/t)?e:null},intersectPlane:function(e,t){var r=this.distanceToPlane(e);return null===r?null:this.at(r,t)},intersectsPlane:function(e){var t=e.distanceToPoint(this.origin);return 0===t||0>e.normal.dot(this.direction)*t},intersectBox:function(e,t){var r,n,i,o,a;n=1/this.direction.x,o=1/this.direction.y,a=1/this.direction.z;var s=this.origin;return 0<=n?(r=(e.min.x-s.x)*n,n*=e.max.x-s.x):(r=(e.max.x-s.x)*n,n*=e.min.x-s.x),0<=o?(i=(e.min.y-s.y)*o,o*=e.max.y-s.y):(i=(e.max.y-s.y)*o,o*=e.min.y-s.y),r>o||i>n?null:((i>r||r!==r)&&(r=i),(o<n||n!==n)&&(n=o),0<=a?(i=(e.min.z-s.z)*a,a*=e.max.z-s.z):(i=(e.max.z-s.z)*a,a*=e.min.z-s.z),r>a||i>n?null:((i>r||r!==r)&&(r=i),(a<n||n!==n)&&(n=a),0>n?null:this.at(0<=r?r:n,t)))},intersectsBox:function(){var e=new c;return function(t){return null!==this.intersectBox(t,e)}}(),intersectTriangle:function(){var e=new c,t=new c,r=new c,n=new c;return function(i,o,a,s,c){if(t.subVectors(o,i),r.subVectors(a,i),n.crossVectors(t,r),0<(o=this.direction.dot(n))){if(s)return null;s=1}else{if(!(0>o))return null;s=-1,o=-o}return e.subVectors(this.origin,i),0>(i=s*this.direction.dot(r.crossVectors(e,r)))?null:0>(a=s*this.direction.dot(t.cross(e)))||i+a>o?null:0>(i=-s*e.dot(n))?null:this.at(i/o,c)}}(),applyMatrix4:function(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}}),Object.assign(je.prototype,{set:function(e,t){return this.start.copy(e),this.end.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.start.copy(e.start),this.end.copy(e.end),this},getCenter:function(e){return(e||new c).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){return(e||new c).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){var r=t||new c;return this.delta(r).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(){var e=new c,t=new c;return function(r,n){e.subVectors(r,this.start),t.subVectors(this.end,this.start);var i=t.dot(t),i=t.dot(e)/i;return n&&(i=xi.clamp(i,0,1)),i}}(),closestPointToPoint:function(e,t,r){return e=this.closestPointToPointParameter(e,t),r=r||new c,this.delta(r).multiplyScalar(e).add(this.start)},applyMatrix4:function(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)}}),Object.assign(Ae,{normal:function(){var e=new c;return function(t,r,n,i){return(i=i||new c).subVectors(n,r),e.subVectors(t,r),i.cross(e),0<(t=i.lengthSq())?i.multiplyScalar(1/Math.sqrt(t)):i.set(0,0,0)}}(),barycoordFromPoint:function(){var e=new c,t=new c,r=new c;return function(n,i,o,a,s){e.subVectors(a,i),t.subVectors(o,i),r.subVectors(n,i),n=e.dot(e),i=e.dot(t),o=e.dot(r);var u=t.dot(t);a=t.dot(r);var h=n*u-i*i;return s=s||new c,0===h?s.set(-2,-1,-1):(h=1/h,u=(u*o-i*a)*h,n=(n*a-i*o)*h,s.set(1-u-n,n,u))}}(),containsPoint:function(){var e=new c;return function(t,r,n,i){return 0<=(t=Ae.barycoordFromPoint(t,r,n,i,e)).x&&0<=t.y&&1>=t.x+t.y}}()}),Object.assign(Ae.prototype,{set:function(e,t,r){return this.a.copy(e),this.b.copy(t),this.c.copy(r),this},setFromPointsAndIndices:function(e,t,r,n){return this.a.copy(e[t]),this.b.copy(e[r]),this.c.copy(e[n]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this},area:function(){var e=new c,t=new c;return function(){return e.subVectors(this.c,this.b),t.subVectors(this.a,this.b),.5*e.cross(t).length()}}(),midpoint:function(e){return(e||new c).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(e){return Ae.normal(this.a,this.b,this.c,e)},plane:function(e){return(e||new Q).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(e,t){return Ae.barycoordFromPoint(e,this.a,this.b,this.c,t)},containsPoint:function(e){return Ae.containsPoint(e,this.a,this.b,this.c)},closestPointToPoint:function(){var e=new Q,t=[new je,new je,new je],r=new c,n=new c;return function(i,o){var a=o||new c,s=1/0;if(e.setFromCoplanarPoints(this.a,this.b,this.c),e.projectPoint(i,r),!0===this.containsPoint(r))a.copy(r);else{t[0].set(this.a,this.b),t[1].set(this.b,this.c),t[2].set(this.c,this.a);for(var u=0;u<t.length;u++){t[u].closestPointToPoint(r,!0,n);var h=r.distanceToSquared(n);h<s&&(s=h,a.copy(n))}}return a}}(),equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}),Re.prototype=Object.assign(Object.create(oe.prototype),{constructor:Re,isMesh:!0,setDrawMode:function(e){this.drawMode=e},copy:function(e){return oe.prototype.copy.call(this,e),this.drawMode=e.drawMode,this},updateMorphTargets:function(){var e,t,r=this.geometry;if(r.isBufferGeometry){if(r=r.morphAttributes,0<(e=Object.keys(r)).length){var n=r[e[0]];if(void 0!==n)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},r=0,e=n.length;r<e;r++)t=n[r].name||String(r),this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=r}}else if(void 0!==(n=r.morphTargets)&&0<n.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},r=0,e=n.length;r<e;r++)t=n[r].name||String(r),this.morphTargetInfluences.push(0),this.morphTargetDictionary[t]=r},raycast:function(){function e(e,t,r,n,i,o,a){return Ae.barycoordFromPoint(e,t,r,n,y),i.multiplyScalar(y.x),o.multiplyScalar(y.y),a.multiplyScalar(y.z),i.add(o).add(a),i.clone()}function t(e,t,r,n,i,o,a){var s=e.material;return null===(1===s.side?r.intersectTriangle(o,i,n,!0,a):r.intersectTriangle(n,i,o,2!==s.side,a))?null:(_.copy(a),_.applyMatrix4(e.matrixWorld),(r=t.ray.origin.distanceTo(_))<t.near||r>t.far?null:{distance:r,point:_.clone(),object:e})}function n(r,n,i,o,a,c,u,p){return s.fromBufferAttribute(o,c),h.fromBufferAttribute(o,u),l.fromBufferAttribute(o,p),(r=t(r,n,i,s,h,l,b))&&(a&&(m.fromBufferAttribute(a,c),v.fromBufferAttribute(a,u),g.fromBufferAttribute(a,p),r.uv=e(b,s,h,l,m,v,g)),r.face=new ue(c,u,p,Ae.normal(s,h,l)),r.faceIndex=c),r}var i=new u,o=new Pe,a=new Z,s=new c,h=new c,l=new c,p=new c,f=new c,d=new c,m=new r,v=new r,g=new r,y=new c,b=new c,_=new c;return function(r,c){var u=this.geometry,y=this.material,_=this.matrixWorld;if(void 0!==y&&(null===u.boundingSphere&&u.computeBoundingSphere(),a.copy(u.boundingSphere),a.applyMatrix4(_),!1!==r.ray.intersectsSphere(a)&&(i.getInverse(_),o.copy(r.ray).applyMatrix4(i),null===u.boundingBox||!1!==o.intersectsBox(u.boundingBox)))){var x;if(u.isBufferGeometry){var w,S,M,E,y=u.index,C=u.attributes.position,_=u.attributes.uv;if(null!==y)for(M=0,E=y.count;M<E;M+=3)u=y.getX(M),w=y.getX(M+1),S=y.getX(M+2),(x=n(this,r,o,C,_,u,w,S))&&(x.faceIndex=Math.floor(M/3),c.push(x));else for(M=0,E=C.count;M<E;M+=3)u=M,w=M+1,S=M+2,(x=n(this,r,o,C,_,u,w,S))&&(x.index=u,c.push(x))}else if(u.isGeometry){var T,_=Array.isArray(y);M=u.vertices,E=u.faces,0<(w=u.faceVertexUvs[0]).length&&(C=w);for(var O=0,P=E.length;O<P;O++){var j=E[O];if(void 0!==(x=_?y[j.materialIndex]:y)){if(w=M[j.a],S=M[j.b],T=M[j.c],!0===x.morphTargets){x=u.morphTargets;var A=this.morphTargetInfluences;s.set(0,0,0),h.set(0,0,0),l.set(0,0,0);for(var R=0,L=x.length;R<L;R++){var N=A[R];if(0!==N){var I=x[R].vertices;s.addScaledVector(p.subVectors(I[j.a],w),N),h.addScaledVector(f.subVectors(I[j.b],S),N),l.addScaledVector(d.subVectors(I[j.c],T),N)}}s.add(w),h.add(S),l.add(T),w=s,S=h,T=l}(x=t(this,r,o,w,S,T,b))&&(C&&C[O]&&(A=C[O],m.copy(A[0]),v.copy(A[1]),g.copy(A[2]),x.uv=e(b,w,S,T,m,v,g)),x.face=j,x.faceIndex=O,c.push(x))}}}}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Bi=0;st.prototype=Object.assign(Object.create(ce.prototype),{constructor:st,isArrayCamera:!0}),pt.prototype.isFogExp2=!0,pt.prototype.clone=function(){return new pt(this.color.getHex(),this.density)},pt.prototype.toJSON=function(e){return{type:"FogExp2",color:this.color.getHex(),density:this.density}},ft.prototype.isFog=!0,ft.prototype.clone=function(){return new ft(this.color.getHex(),this.near,this.far)},ft.prototype.toJSON=function(e){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}},dt.prototype=Object.assign(Object.create(oe.prototype),{constructor:dt,copy:function(e,t){return oe.prototype.copy.call(this,e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this},toJSON:function(e){var t=oe.prototype.toJSON.call(this,e);return null!==this.background&&(t.object.background=this.background.toJSON(e)),null!==this.fog&&(t.object.fog=this.fog.toJSON()),t}}),mt.prototype=Object.assign(Object.create(oe.prototype),{constructor:mt,isLensFlare:!0,copy:function(e){oe.prototype.copy.call(this,e),this.positionScreen.copy(e.positionScreen),this.customUpdateCallback=e.customUpdateCallback;for(var t=0,r=e.lensFlares.length;t<r;t++)this.lensFlares.push(e.lensFlares[t]);return this},add:function(e,t,r,n,i,o){void 0===t&&(t=-1),void 0===r&&(r=0),void 0===o&&(o=1),void 0===i&&(i=new V(16777215)),void 0===n&&(n=1),r=Math.min(r,Math.max(0,r)),this.lensFlares.push({texture:e,size:t,distance:r,x:0,y:0,z:0,scale:1,rotation:0,opacity:o,color:i,blending:n})},updateLensFlares:function(){var e,t,r=this.lensFlares.length,n=2*-this.positionScreen.x,i=2*-this.positionScreen.y;for(e=0;e<r;e++)t=this.lensFlares[e],t.x=this.positionScreen.x+n*t.distance,t.y=this.positionScreen.y+i*t.distance,t.wantedRotation=t.x*Math.PI*.25,t.rotation+=.25*(t.wantedRotation-t.rotation)}}),vt.prototype=Object.create(W.prototype),vt.prototype.constructor=vt,vt.prototype.isSpriteMaterial=!0,vt.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.rotation=e.rotation,this},gt.prototype=Object.assign(Object.create(oe.prototype),{constructor:gt,isSprite:!0,raycast:function(){var e=new c,t=new c,r=new c;return function(n,i){t.setFromMatrixPosition(this.matrixWorld),n.ray.closestPointToPoint(t,e),r.setFromMatrixScale(this.matrixWorld);var o=r.x*r.y/4;t.distanceToSquared(e)>o||(o=n.ray.origin.distanceTo(e))<n.near||o>n.far||i.push({distance:o,point:e.clone(),face:null,object:this})}}(),clone:function(){return new this.constructor(this.material).copy(this)}}),yt.prototype=Object.assign(Object.create(oe.prototype),{constructor:yt,copy:function(e){oe.prototype.copy.call(this,e,!1);for(var t=0,r=(e=e.levels).length;t<r;t++){var n=e[t];this.addLevel(n.object.clone(),n.distance)}return this},addLevel:function(e,t){void 0===t&&(t=0),t=Math.abs(t);for(var r=this.levels,n=0;n<r.length&&!(t<r[n].distance);n++);r.splice(n,0,{distance:t,object:e}),this.add(e)},getObjectForDistance:function(e){for(var t=this.levels,r=1,n=t.length;r<n&&!(e<t[r].distance);r++);return t[r-1].object},raycast:function(){var e=new c;return function(t,r){e.setFromMatrixPosition(this.matrixWorld);var n=t.ray.origin.distanceTo(e);this.getObjectForDistance(n).raycast(t,r)}}(),update:function(){var e=new c,t=new c;return function(r){var n=this.levels;if(1<n.length){e.setFromMatrixPosition(r.matrixWorld),t.setFromMatrixPosition(this.matrixWorld),r=e.distanceTo(t),n[0].object.visible=!0;for(var i=1,o=n.length;i<o&&r>=n[i].distance;i++)n[i-1].object.visible=!1,n[i].object.visible=!0;for(;i<o;i++)n[i].object.visible=!1}}}(),toJSON:function(e){(e=oe.prototype.toJSON.call(this,e)).object.levels=[];for(var t=this.levels,r=0,n=t.length;r<n;r++){var i=t[r];e.object.levels.push({object:i.object.uuid,distance:i.distance})}return e}}),Object.assign(bt.prototype,{calculateInverses:function(){this.boneInverses=[];for(var e=0,t=this.bones.length;e<t;e++){var r=new u;this.bones[e]&&r.getInverse(this.bones[e].matrixWorld),this.boneInverses.push(r)}},pose:function(){var e,t,r;for(t=0,r=this.bones.length;t<r;t++)(e=this.bones[t])&&e.matrixWorld.getInverse(this.boneInverses[t]);for(t=0,r=this.bones.length;t<r;t++)(e=this.bones[t])&&(e.parent&&e.parent.isBone?(e.matrix.getInverse(e.parent.matrixWorld),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))},update:function(){var e=new u,t=new u;return function(){for(var r=this.bones,n=this.boneInverses,i=this.boneMatrices,o=this.boneTexture,a=0,s=r.length;a<s;a++)e.multiplyMatrices(r[a]?r[a].matrixWorld:t,n[a]),e.toArray(i,16*a);void 0!==o&&(o.needsUpdate=!0)}}(),clone:function(){return new bt(this.bones,this.boneInverses)}}),_t.prototype=Object.assign(Object.create(oe.prototype),{constructor:_t,isBone:!0}),xt.prototype=Object.assign(Object.create(Re.prototype),{constructor:xt,isSkinnedMesh:!0,initBones:function(){var e,t,r,n,i=[];if(this.geometry&&void 0!==this.geometry.bones){for(r=0,n=this.geometry.bones.length;r<n;r++)t=this.geometry.bones[r],e=new _t,i.push(e),e.name=t.name,e.position.fromArray(t.pos),e.quaternion.fromArray(t.rotq),void 0!==t.scl&&e.scale.fromArray(t.scl);for(r=0,n=this.geometry.bones.length;r<n;r++)-1!==(t=this.geometry.bones[r]).parent&&null!==t.parent&&void 0!==i[t.parent]?i[t.parent].add(i[r]):this.add(i[r])}return this.updateMatrixWorld(!0),i},bind:function(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.getInverse(t)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var e,t;if(this.geometry&&this.geometry.isGeometry)for(t=0;t<this.geometry.skinWeights.length;t++)1/0!==(e=1/(r=this.geometry.skinWeights[t]).lengthManhattan())?r.multiplyScalar(e):r.set(1,0,0,0);else if(this.geometry&&this.geometry.isBufferGeometry){var r=new i,n=this.geometry.attributes.skinWeight;for(t=0;t<n.count;t++)r.x=n.getX(t),r.y=n.getY(t),r.z=n.getZ(t),r.w=n.getW(t),e=1/r.lengthManhattan(),1/0!==e?r.multiplyScalar(e):r.set(1,0,0,0),n.setXYZW(t,r.x,r.y,r.z,r.w)}},updateMatrixWorld:function(e){Re.prototype.updateMatrixWorld.call(this,e),"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),wt.prototype=Object.create(W.prototype),wt.prototype.constructor=wt,wt.prototype.isLineBasicMaterial=!0,wt.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this},St.prototype=Object.assign(Object.create(oe.prototype),{constructor:St,isLine:!0,raycast:function(){var e=new u,t=new Pe,r=new Z;return function(n,i){var o=(o=n.linePrecision)*o,a=this.geometry,s=this.matrixWorld;if(null===a.boundingSphere&&a.computeBoundingSphere(),r.copy(a.boundingSphere),r.applyMatrix4(s),!1!==n.ray.intersectsSphere(r)){e.getInverse(s),t.copy(n.ray).applyMatrix4(e);var u=new c,h=new c,s=new c,l=new c,p=this&&this.isLineSegments?2:1;if(a.isBufferGeometry){var f=a.index,d=a.attributes.position.array;if(null!==f)for(var f=f.array,a=0,m=f.length-1;a<m;a+=p){var v=f[a+1];u.fromArray(d,3*f[a]),h.fromArray(d,3*v),(v=t.distanceSqToSegment(u,h,l,s))>o||(l.applyMatrix4(this.matrixWorld),(v=n.ray.origin.distanceTo(l))<n.near||v>n.far||i.push({distance:v,point:s.clone().applyMatrix4(this.matrixWorld),index:a,face:null,faceIndex:null,object:this}))}else for(a=0,m=d.length/3-1;a<m;a+=p)u.fromArray(d,3*a),h.fromArray(d,3*a+3),(v=t.distanceSqToSegment(u,h,l,s))>o||(l.applyMatrix4(this.matrixWorld),(v=n.ray.origin.distanceTo(l))<n.near||v>n.far||i.push({distance:v,point:s.clone().applyMatrix4(this.matrixWorld),index:a,face:null,faceIndex:null,object:this}))}else if(a.isGeometry)for(u=a.vertices,h=u.length,a=0;a<h-1;a+=p)(v=t.distanceSqToSegment(u[a],u[a+1],l,s))>o||(l.applyMatrix4(this.matrixWorld),(v=n.ray.origin.distanceTo(l))<n.near||v>n.far||i.push({distance:v,point:s.clone().applyMatrix4(this.matrixWorld),index:a,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),Mt.prototype=Object.assign(Object.create(St.prototype),{constructor:Mt,isLineSegments:!0}),Et.prototype=Object.assign(Object.create(St.prototype),{constructor:Et,isLineLoop:!0}),Ct.prototype=Object.create(W.prototype),Ct.prototype.constructor=Ct,Ct.prototype.isPointsMaterial=!0,Ct.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this},Tt.prototype=Object.assign(Object.create(oe.prototype),{constructor:Tt,isPoints:!0,raycast:function(){var e=new u,t=new Pe,r=new Z;return function(n,i){function o(e,r){var o=t.distanceSqToPoint(e);if(o<l){var s=t.closestPointToPoint(e);s.applyMatrix4(u);var c=n.ray.origin.distanceTo(s);c<n.near||c>n.far||i.push({distance:c,distanceToRay:Math.sqrt(o),point:s.clone(),index:r,face:null,object:a})}}var a=this,s=this.geometry,u=this.matrixWorld,h=n.params.Points.threshold;if(null===s.boundingSphere&&s.computeBoundingSphere(),r.copy(s.boundingSphere),r.applyMatrix4(u),r.radius+=h,!1!==n.ray.intersectsSphere(r)){e.getInverse(u),t.copy(n.ray).applyMatrix4(e);var l=(h=h/((this.scale.x+this.scale.y+this.scale.z)/3))*h,h=new c;if(s.isBufferGeometry){var p=s.index,s=s.attributes.position.array;if(null!==p)for(var f=p.array,p=0,d=f.length;p<d;p++){var m=f[p];h.fromArray(s,3*m),o(h,m)}else for(p=0,f=s.length/3;p<f;p++)h.fromArray(s,3*p),o(h,p)}else for(h=s.vertices,p=0,f=h.length;p<f;p++)o(h[p],p)}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),Ot.prototype=Object.assign(Object.create(oe.prototype),{constructor:Ot}),(Pt.prototype=Object.create(n.prototype)).constructor=Pt,(jt.prototype=Object.create(n.prototype)).constructor=jt,jt.prototype.isCompressedTexture=!0,(At.prototype=Object.create(n.prototype)).constructor=At,(Rt.prototype=Object.create(n.prototype)).constructor=Rt,Rt.prototype.isDepthTexture=!0,(Lt.prototype=Object.create(Se.prototype)).constructor=Lt,(Nt.prototype=Object.create(he.prototype)).constructor=Nt,(It.prototype=Object.create(Se.prototype)).constructor=It,(Dt.prototype=Object.create(he.prototype)).constructor=Dt,kt.prototype=Object.create(Se.prototype),kt.prototype.constructor=kt,(Bt.prototype=Object.create(he.prototype)).constructor=Bt,(Ft.prototype=Object.create(kt.prototype)).constructor=Ft,(Ut.prototype=Object.create(he.prototype)).constructor=Ut,zt.prototype=Object.create(kt.prototype),zt.prototype.constructor=zt,($t.prototype=Object.create(he.prototype)).constructor=$t,(Vt.prototype=Object.create(kt.prototype)).constructor=Vt,(Gt.prototype=Object.create(he.prototype)).constructor=Gt,(Ht.prototype=Object.create(kt.prototype)).constructor=Ht,(qt.prototype=Object.create(he.prototype)).constructor=qt,(Wt.prototype=Object.create(Se.prototype)).constructor=Wt,(Xt.prototype=Object.create(he.prototype)).constructor=Xt,(Yt.prototype=Object.create(Se.prototype)).constructor=Yt,(Kt.prototype=Object.create(he.prototype)).constructor=Kt,(Zt.prototype=Object.create(Se.prototype)).constructor=Zt;var Fi={area:function(e){for(var t=e.length,r=0,n=t-1,i=0;i<t;n=i++)r+=e[n].x*e[i].y-e[i].x*e[n].y;return.5*r},triangulate:function(e,t){var r=e.length;if(3>r)return null;var n,i,o,a=[],s=[],c=[];if(0<Fi.area(e))for(i=0;i<r;i++)s[i]=i;else for(i=0;i<r;i++)s[i]=r-1-i;var u=2*r;for(i=r-1;2<r;){if(0>=u--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}r<=(n=i)&&(n=0),r<=(i=n+1)&&(i=0),r<=(o=i+1)&&(o=0);var h;e:{var l,p,f,d,m,v,g,y;if(l=e[s[n]].x,p=e[s[n]].y,f=e[s[i]].x,d=e[s[i]].y,m=e[s[o]].x,v=e[s[o]].y,0>=(f-l)*(v-p)-(d-p)*(m-l))h=!1;else{var b,_,x,w,S,M,E,C,T,O;for(b=m-f,_=v-d,x=l-m,w=p-v,S=f-l,M=d-p,h=0;h<r;h++)if(g=e[s[h]].x,y=e[s[h]].y,!(g===l&&y===p||g===f&&y===d||g===m&&y===v)&&(E=g-l,C=y-p,T=g-f,O=y-d,g-=m,y-=v,T=b*O-_*T,E=S*C-M*E,C=x*y-w*g,T>=-Number.EPSILON&&C>=-Number.EPSILON&&E>=-Number.EPSILON)){h=!1;break e}h=!0}}if(h){for(a.push([e[s[n]],e[s[i]],e[s[o]]]),c.push([s[n],s[i],s[o]]),n=i,o=i+1;o<r;n++,o++)s[n]=s[o];u=2*--r}}return t?c:a},triangulateShape:function(e,t){function r(e){var t=e.length;2<t&&e[t-1].equals(e[0])&&e.pop()}function n(e,t,r){return e.x!==t.x?e.x<t.x?e.x<=r.x&&r.x<=t.x:t.x<=r.x&&r.x<=e.x:e.y<t.y?e.y<=r.y&&r.y<=t.y:t.y<=r.y&&r.y<=e.y}function i(e,t,r,i,o){var a=t.x-e.x,s=t.y-e.y,c=i.x-r.x,u=i.y-r.y,h=e.x-r.x,l=e.y-r.y,p=s*c-a*u,f=s*h-a*l;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>f||f>p)return[];if(0>(c=u*h-c*l)||c>p)return[]}else{if(0<f||f<p)return[];if(0<(c=u*h-c*l)||c<p)return[]}return 0===c?!o||0!==f&&f!==p?[e]:[]:c===p?!o||0!==f&&f!==p?[t]:[]:0===f?[r]:f===p?[i]:(o=c/p,[{x:e.x+o*a,y:e.y+o*s}])}return 0!==f||u*h!=c*l?[]:(s=0===a&&0===s,c=0===c&&0===u,s&&c?e.x!==r.x||e.y!==r.y?[]:[e]:s?n(r,i,e)?[e]:[]:c?n(e,t,r)?[r]:[]:(0!==a?(e.x<t.x?(a=e,c=e.x,s=t,e=t.x):(a=t,c=t.x,s=e,e=e.x),r.x<i.x?(t=r,p=r.x,u=i,r=i.x):(t=i,p=i.x,u=r,r=r.x)):(e.y<t.y?(a=e,c=e.y,s=t,e=t.y):(a=t,c=t.y,s=e,e=e.y),r.y<i.y?(t=r,p=r.y,u=i,r=i.y):(t=i,p=i.y,u=r,r=r.y)),c<=p?e<p?[]:e===p?o?[]:[t]:e<=r?[t,s]:[t,u]:c>r?[]:c===r?o?[]:[a]:e<=r?[a,s]:[a,u]))}function o(e,t,r,n){var i=t.x-e.x,o=t.y-e.y;t=r.x-e.x,r=r.y-e.y;var a=n.x-e.x;return n=n.y-e.y,e=i*r-o*t,i=i*n-o*a,Math.abs(e)>Number.EPSILON?(t=a*r-n*t,0<e?0<=i&&0<=t:0<=i||0<=t):0<i}r(e),t.forEach(r);var a,s,c,u,h,l={};for(c=e.concat(),a=0,s=t.length;a<s;a++)Array.prototype.push.apply(c,t[a]);for(a=0,s=c.length;a<s;a++)h=c[a].x+":"+c[a].y,void 0!==l[h]&&console.warn("THREE.ShapeUtils: Duplicate point",h,a),l[h]=a;a=function(e,t){var r,n,a,s,c,u,h,l,p,f=e.concat(),d=[],m=[],v=0;for(n=t.length;v<n;v++)d.push(v);h=0;for(var g=2*d.length;0<d.length;){if(0>--g){console.log("Infinite Loop! Holes left:"+d.length+", Probably Hole outside Shape!");break}for(a=h;a<f.length;a++){for(s=f[a],n=-1,v=0;v<d.length;v++)if(c=d[v],u=s.x+":"+s.y+":"+c,void 0===m[u]){for(r=t[c],l=0;l<r.length;l++)if(c=r[l],function(e,t){var n=f.length-1,i=e-1;0>i&&(i=n);var a=e+1;return a>n&&(a=0),!!(n=o(f[e],f[i],f[a],r[t]))&&(n=r.length-1,0>(i=t-1)&&(i=n),(a=t+1)>n&&(a=0),!!(n=o(r[t],r[i],r[a],f[e])))}(a,l)&&!function(e,t){var r,n;for(r=0;r<f.length;r++)if(n=r+1,n%=f.length,0<(n=i(e,t,f[r],f[n],!0)).length)return!0;return!1}(s,c)&&!function(e,r){var n,o,a,s;for(n=0;n<d.length;n++)for(o=t[d[n]],a=0;a<o.length;a++)if(s=a+1,s%=o.length,0<(s=i(e,r,o[a],o[s],!0)).length)return!0;return!1}(s,c)){n=l,d.splice(v,1),h=f.slice(0,a+1),c=f.slice(a),l=r.slice(n),p=r.slice(0,n+1),f=h.concat(l).concat(p).concat(c),h=a;break}if(0<=n)break;m[u]=!0}if(0<=n)break}}return f}(e,t);var p=Fi.triangulate(a,!1);for(a=0,s=p.length;a<s;a++)for(u=p[a],c=0;3>c;c++)h=u[c].x+":"+u[c].y,void 0!==(h=l[h])&&(u[c]=h);return p.concat()},isClockWise:function(e){return 0>Fi.area(e)}};(Jt.prototype=Object.create(he.prototype)).constructor=Jt,Qt.prototype=Object.create(Se.prototype),Qt.prototype.constructor=Qt,Qt.prototype.getArrays=function(){var e=(e=this.getAttribute("position"))?Array.prototype.slice.call(e.array):[],t=(t=this.getAttribute("uv"))?Array.prototype.slice.call(t.array):[],r=this.index;return{position:e,uv:t,index:r=r?Array.prototype.slice.call(r.array):[]}},Qt.prototype.addShapeList=function(e,t){var r=e.length;t.arrays=this.getArrays();for(var n=0;n<r;n++)this.addShape(e[n],t);this.setIndex(t.arrays.index),this.addAttribute("position",new be(t.arrays.position,3)),this.addAttribute("uv",new be(t.arrays.uv,2))},Qt.prototype.addShape=function(e,t){function n(e,t,r){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),t.clone().multiplyScalar(r).add(e)}function i(e,t,n){var i,o,a;o=e.x-t.x,a=e.y-t.y,i=n.x-e.x;var s=n.y-e.y,c=o*o+a*a;if(Math.abs(o*s-a*i)>Number.EPSILON){var u=Math.sqrt(c),h=Math.sqrt(i*i+s*s),c=t.x-a/u;if(t=t.y+o/u,s=((n.x-s/h-c)*s-(n.y+i/h-t)*i)/(o*s-a*i),i=c+o*s-e.x,o=t+a*s-e.y,2>=(a=i*i+o*o))return new r(i,o);a=Math.sqrt(a/2)}else e=!1,o>Number.EPSILON?i>Number.EPSILON&&(e=!0):o<-Number.EPSILON?i<-Number.EPSILON&&(e=!0):Math.sign(a)===Math.sign(s)&&(e=!0),e?(i=-a,a=Math.sqrt(c)):(i=o,o=a,a=Math.sqrt(c/2));return new r(i/a,o/a)}function o(e,t){var r,n;for(H=e.length;0<=--H;){r=H,0>(n=H-1)&&(n=e.length-1);var i,o=C+2*S;for(i=0;i<o;i++){var a=V*i,s=t+n+a,c=t+n+(l=V*(i+1)),l=t+r+l;u(t+r+a),u(s),u(l),u(s),u(c),u(l),a=v.length/3,h((a=P.generateSideWallUV(L,v,a-6,a-3,a-2,a-1))[0]),h(a[1]),h(a[3]),h(a[1]),h(a[2]),h(a[3])}}}function a(e,t,r){b.push(e),b.push(t),b.push(r)}function s(e,t,r){u(e),u(t),u(r),e=v.length/3,h((e=P.generateTopUV(L,v,e-3,e-2,e-1))[0]),h(e[1]),h(e[2])}function u(e){g.push(v.length/3),v.push(b[3*e+0]),v.push(b[3*e+1]),v.push(b[3*e+2])}function h(e){y.push(e.x),y.push(e.y)}var l,p,f,d,m,v=(_=t.arrays?t.arrays:this.getArrays()).position,g=_.index,y=_.uv,b=[],_=void 0!==t.amount?t.amount:100,x=void 0!==t.bevelThickness?t.bevelThickness:6,w=void 0!==t.bevelSize?t.bevelSize:x-2,S=void 0!==t.bevelSegments?t.bevelSegments:3,M=void 0===t.bevelEnabled||t.bevelEnabled,E=void 0!==t.curveSegments?t.curveSegments:12,C=void 0!==t.steps?t.steps:1,T=t.extrudePath,O=!1,P=void 0!==t.UVGenerator?t.UVGenerator:Jt.WorldUVGenerator;T&&(l=T.getSpacedPoints(C),O=!0,M=!1,p=void 0!==t.frames?t.frames:T.computeFrenetFrames(C,!1),f=new c,d=new c,m=new c),M||(w=x=S=0);var j,A,R,L=this,E=(T=e.extractPoints(E)).shape,N=T.holes;if(!Fi.isClockWise(E))for(E=E.reverse(),A=0,R=N.length;A<R;A++)j=N[A],Fi.isClockWise(j)&&(N[A]=j.reverse());var I=Fi.triangulateShape(E,N),D=E;for(A=0,R=N.length;A<R;A++)j=N[A],E=E.concat(j);var k,B,F,U,z,$,V=E.length,G=I.length,T=[],H=0;for(k=(F=D.length)-1,B=H+1;H<F;H++,k++,B++)k===F&&(k=0),B===F&&(B=0),T[H]=i(D[H],D[k],D[B]);var q,W=[],X=T.concat();for(A=0,R=N.length;A<R;A++){for(j=N[A],q=[],H=0,k=(F=j.length)-1,B=H+1;H<F;H++,k++,B++)k===F&&(k=0),B===F&&(B=0),q[H]=i(j[H],j[k],j[B]);W.push(q),X=X.concat(q)}for(k=0;k<S;k++){for(F=k/S,U=x*Math.cos(F*Math.PI/2),B=w*Math.sin(F*Math.PI/2),H=0,F=D.length;H<F;H++)z=n(D[H],T[H],B),a(z.x,z.y,-U);for(A=0,R=N.length;A<R;A++)for(j=N[A],q=W[A],H=0,F=j.length;H<F;H++)z=n(j[H],q[H],B),a(z.x,z.y,-U)}for(B=w,H=0;H<V;H++)z=M?n(E[H],X[H],B):E[H],O?(d.copy(p.normals[0]).multiplyScalar(z.x),f.copy(p.binormals[0]).multiplyScalar(z.y),m.copy(l[0]).add(d).add(f),a(m.x,m.y,m.z)):a(z.x,z.y,0);for(F=1;F<=C;F++)for(H=0;H<V;H++)z=M?n(E[H],X[H],B):E[H],O?(d.copy(p.normals[F]).multiplyScalar(z.x),f.copy(p.binormals[F]).multiplyScalar(z.y),m.copy(l[F]).add(d).add(f),a(m.x,m.y,m.z)):a(z.x,z.y,_/C*F);for(k=S-1;0<=k;k--){for(F=k/S,U=x*Math.cos(F*Math.PI/2),B=w*Math.sin(F*Math.PI/2),H=0,F=D.length;H<F;H++)z=n(D[H],T[H],B),a(z.x,z.y,_+U);for(A=0,R=N.length;A<R;A++)for(j=N[A],q=W[A],H=0,F=j.length;H<F;H++)z=n(j[H],q[H],B),O?a(z.x,z.y+l[C-1].y,l[C-1].x+U):a(z.x,z.y,_+U)}!function(){var e=v.length/3;if(M){var r=0*V;for(H=0;H<G;H++)$=I[H],s($[2]+r,$[1]+r,$[0]+r);for(r=V*(C+2*S),H=0;H<G;H++)$=I[H],s($[0]+r,$[1]+r,$[2]+r)}else{for(H=0;H<G;H++)$=I[H],s($[2],$[1],$[0]);for(H=0;H<G;H++)$=I[H],s($[0]+V*C,$[1]+V*C,$[2]+V*C)}L.addGroup(e,v.length/3-e,void 0!==t.material?t.material:0)}(),function(){var e=v.length/3,r=0;for(o(D,r),r+=D.length,A=0,R=N.length;A<R;A++)j=N[A],o(j,r),r+=j.length;L.addGroup(e,v.length/3-e,void 0!==t.extrudeMaterial?t.extrudeMaterial:1)}(),t.arrays||(this.setIndex(g),this.addAttribute("position",new be(v,3)),this.addAttribute("uv",new be(t.arrays.uv,2)))},Jt.WorldUVGenerator={generateTopUV:function(e,t,n,i,o){e=t[3*i],i=t[3*i+1];var a=t[3*o];return o=t[3*o+1],[new r(t[3*n],t[3*n+1]),new r(e,i),new r(a,o)]},generateSideWallUV:function(e,t,n,i,o,a){e=t[3*n];var s=t[3*n+1];n=t[3*n+2];var c=t[3*i],u=t[3*i+1];i=t[3*i+2];var h=t[3*o],l=t[3*o+1];o=t[3*o+2];var p=t[3*a],f=t[3*a+1];return t=t[3*a+2],.01>Math.abs(s-u)?[new r(e,1-n),new r(c,1-i),new r(h,1-o),new r(p,1-t)]:[new r(s,1-n),new r(u,1-i),new r(l,1-o),new r(f,1-t)]}},(er.prototype=Object.create(he.prototype)).constructor=er,(tr.prototype=Object.create(Qt.prototype)).constructor=tr,(rr.prototype=Object.create(he.prototype)).constructor=rr,nr.prototype=Object.create(Se.prototype),nr.prototype.constructor=nr,(ir.prototype=Object.create(he.prototype)).constructor=ir,(or.prototype=Object.create(Se.prototype)).constructor=or,(ar.prototype=Object.create(he.prototype)).constructor=ar,(sr.prototype=Object.create(Se.prototype)).constructor=sr,(cr.prototype=Object.create(he.prototype)).constructor=cr,(ur.prototype=Object.create(Se.prototype)).constructor=ur,(hr.prototype=Object.create(Se.prototype)).constructor=hr,lr.prototype=Object.create(he.prototype),lr.prototype.constructor=lr,pr.prototype=Object.create(Se.prototype),pr.prototype.constructor=pr,(fr.prototype=Object.create(lr.prototype)).constructor=fr,(dr.prototype=Object.create(pr.prototype)).constructor=dr,(mr.prototype=Object.create(he.prototype)).constructor=mr,(vr.prototype=Object.create(Se.prototype)).constructor=vr;var Ui=Object.freeze({WireframeGeometry:Lt,ParametricGeometry:Nt,ParametricBufferGeometry:It,TetrahedronGeometry:Bt,TetrahedronBufferGeometry:Ft,OctahedronGeometry:Ut,OctahedronBufferGeometry:zt,IcosahedronGeometry:$t,IcosahedronBufferGeometry:Vt,DodecahedronGeometry:Gt,DodecahedronBufferGeometry:Ht,PolyhedronGeometry:Dt,PolyhedronBufferGeometry:kt,TubeGeometry:qt,TubeBufferGeometry:Wt,TorusKnotGeometry:Xt,TorusKnotBufferGeometry:Yt,TorusGeometry:Kt,TorusBufferGeometry:Zt,TextGeometry:er,TextBufferGeometry:tr,SphereGeometry:rr,SphereBufferGeometry:nr,RingGeometry:ir,RingBufferGeometry:or,PlaneGeometry:Ce,PlaneBufferGeometry:Te,LatheGeometry:ar,LatheBufferGeometry:sr,ShapeGeometry:cr,ShapeBufferGeometry:ur,ExtrudeGeometry:Jt,ExtrudeBufferGeometry:Qt,EdgesGeometry:hr,ConeGeometry:fr,ConeBufferGeometry:dr,CylinderGeometry:lr,CylinderBufferGeometry:pr,CircleGeometry:mr,CircleBufferGeometry:vr,BoxGeometry:Me,BoxBufferGeometry:Ee});(gr.prototype=Object.create(X.prototype)).constructor=gr,gr.prototype.isShadowMaterial=!0,(yr.prototype=Object.create(X.prototype)).constructor=yr,yr.prototype.isRawShaderMaterial=!0,br.prototype=Object.create(W.prototype),br.prototype.constructor=br,br.prototype.isMeshStandardMaterial=!0,br.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(_r.prototype=Object.create(br.prototype)).constructor=_r,_r.prototype.isMeshPhysicalMaterial=!0,_r.prototype.copy=function(e){return br.prototype.copy.call(this,e),this.defines={PHYSICAL:""},this.reflectivity=e.reflectivity,this.clearCoat=e.clearCoat,this.clearCoatRoughness=e.clearCoatRoughness,this},xr.prototype=Object.create(W.prototype),xr.prototype.constructor=xr,xr.prototype.isMeshPhongMaterial=!0,xr.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(wr.prototype=Object.create(xr.prototype)).constructor=wr,wr.prototype.isMeshToonMaterial=!0,wr.prototype.copy=function(e){return xr.prototype.copy.call(this,e),this.gradientMap=e.gradientMap,this},(Sr.prototype=Object.create(W.prototype)).constructor=Sr,Sr.prototype.isMeshNormalMaterial=!0,Sr.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(Mr.prototype=Object.create(W.prototype)).constructor=Mr,Mr.prototype.isMeshLambertMaterial=!0,Mr.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(Er.prototype=Object.create(W.prototype)).constructor=Er,Er.prototype.isLineDashedMaterial=!0,Er.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.linewidth=e.linewidth,this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this};var zi=Object.freeze({ShadowMaterial:gr,SpriteMaterial:vt,RawShaderMaterial:yr,ShaderMaterial:X,PointsMaterial:Ct,MeshPhysicalMaterial:_r,MeshStandardMaterial:br,MeshPhongMaterial:xr,MeshToonMaterial:wr,MeshNormalMaterial:Sr,MeshLambertMaterial:Mr,MeshDepthMaterial:Y,MeshBasicMaterial:Oe,LineDashedMaterial:Er,LineBasicMaterial:wt,Material:W}),$i={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}},Vi=new Cr;Object.assign(Tr.prototype,{load:function(e,t,r,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e);var i=this,o=$i.get(e);if(void 0!==o)return i.manager.itemStart(e),setTimeout(function(){t&&t(o),i.manager.itemEnd(e)},0),o;if(c=e.match(/^data:(.*?)(;base64)?,(.*)$/)){var a=c[1],s=!!c[2],c=c[3],c=window.decodeURIComponent(c);s&&(c=window.atob(c));try{var u,h=(this.responseType||"").toLowerCase();switch(h){case"arraybuffer":case"blob":u=new ArrayBuffer(c.length);for(var l=new Uint8Array(u),s=0;s<c.length;s++)l[s]=c.charCodeAt(s);"blob"===h&&(u=new Blob([u],{type:a}));break;case"document":u=(new DOMParser).parseFromString(c,a);break;case"json":u=JSON.parse(c);break;default:u=c}window.setTimeout(function(){t&&t(u),i.manager.itemEnd(e)},0)}catch(t){window.setTimeout(function(){n&&n(t),i.manager.itemEnd(e),i.manager.itemError(e)},0)}}else{var p=new XMLHttpRequest;p.open("GET",e,!0),p.addEventListener("load",function(r){var o=r.target.response;$i.add(e,o),200===this.status?(t&&t(o),i.manager.itemEnd(e)):0===this.status?(console.warn("THREE.FileLoader: HTTP Status 0 received."),t&&t(o),i.manager.itemEnd(e)):(n&&n(r),i.manager.itemEnd(e),i.manager.itemError(e))},!1),void 0!==r&&p.addEventListener("progress",function(e){r(e)},!1),p.addEventListener("error",function(t){n&&n(t),i.manager.itemEnd(e),i.manager.itemError(e)},!1),void 0!==this.responseType&&(p.responseType=this.responseType),void 0!==this.withCredentials&&(p.withCredentials=this.withCredentials),p.overrideMimeType&&p.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(a in this.requestHeader)p.setRequestHeader(a,this.requestHeader[a]);p.send(null)}return i.manager.itemStart(e),p},setPath:function(e){return this.path=e,this},setResponseType:function(e){return this.responseType=e,this},setWithCredentials:function(e){return this.withCredentials=e,this},setMimeType:function(e){return this.mimeType=e,this},setRequestHeader:function(e){return this.requestHeader=e,this}}),Object.assign(Or.prototype,{load:function(e,t,r,n){var i=this,o=[],a=new jt;a.image=o;var s=new Tr(this.manager);if(s.setPath(this.path),s.setResponseType("arraybuffer"),Array.isArray(e))for(var c=0,u=0,h=e.length;u<h;++u)!function(u){s.load(e[u],function(e){e=i._parser(e,!0),o[u]={width:e.width,height:e.height,format:e.format,mipmaps:e.mipmaps},6===(c+=1)&&(1===e.mipmapCount&&(a.minFilter=1006),a.format=e.format,a.needsUpdate=!0,t&&t(a))},r,n)}(u);else s.load(e,function(e){if((e=i._parser(e,!0)).isCubemap)for(var r=e.mipmaps.length/e.mipmapCount,n=0;n<r;n++){o[n]={mipmaps:[]};for(var s=0;s<e.mipmapCount;s++)o[n].mipmaps.push(e.mipmaps[n*e.mipmapCount+s]),o[n].format=e.format,o[n].width=e.width,o[n].height=e.height}else a.image.width=e.width,a.image.height=e.height,a.mipmaps=e.mipmaps;1===e.mipmapCount&&(a.minFilter=1006),a.format=e.format,a.needsUpdate=!0,t&&t(a)},r,n);return a},setPath:function(e){return this.path=e,this}}),Object.assign(Pr.prototype,{load:function(e,t,r,n){var i=this,o=new h,a=new Tr(this.manager);return a.setResponseType("arraybuffer"),a.load(e,function(e){(e=i._parser(e))&&(void 0!==e.image?o.image=e.image:void 0!==e.data&&(o.image.width=e.width,o.image.height=e.height,o.image.data=e.data),o.wrapS=void 0!==e.wrapS?e.wrapS:1001,o.wrapT=void 0!==e.wrapT?e.wrapT:1001,o.magFilter=void 0!==e.magFilter?e.magFilter:1006,o.minFilter=void 0!==e.minFilter?e.minFilter:1008,o.anisotropy=void 0!==e.anisotropy?e.anisotropy:1,void 0!==e.format&&(o.format=e.format),void 0!==e.type&&(o.type=e.type),void 0!==e.mipmaps&&(o.mipmaps=e.mipmaps),1===e.mipmapCount&&(o.minFilter=1006),o.needsUpdate=!0,t&&t(o,e))},r,n),o}}),Object.assign(jr.prototype,{load:function(e,t,r,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e);var i=this,o=$i.get(e);return void 0!==o?(i.manager.itemStart(e),setTimeout(function(){t&&t(o),i.manager.itemEnd(e)},0),o):((r=document.createElementNS("http://www.w3.org/1999/xhtml","img")).addEventListener("load",function(){$i.add(e,this),t&&t(this),i.manager.itemEnd(e)},!1),r.addEventListener("error",function(t){n&&n(t),i.manager.itemEnd(e),i.manager.itemError(e)},!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(r.crossOrigin=this.crossOrigin),i.manager.itemStart(e),r.src=e,r)},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),Object.assign(Ar.prototype,{load:function(e,t,r,n){var i=new l,o=new jr(this.manager);o.setCrossOrigin(this.crossOrigin),o.setPath(this.path);var a=0;for(r=0;r<e.length;++r)!function(r){o.load(e[r],function(e){i.images[r]=e,6==++a&&(i.needsUpdate=!0,t&&t(i))},void 0,n)}(r);return i},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),Object.assign(Rr.prototype,{load:function(e,t,r,i){var o=new jr(this.manager);o.setCrossOrigin(this.crossOrigin),o.setPath(this.path);var a=new n;return a.image=o.load(e,function(){var r=0<e.search(/\.(jpg|jpeg)$/)||0===e.search(/^data\:image\/jpeg/);a.format=r?1022:1023,a.needsUpdate=!0,void 0!==t&&t(a)},r,i),a},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),Lr.prototype=Object.assign(Object.create(oe.prototype),{constructor:Lr,isLight:!0,copy:function(e){return oe.prototype.copy.call(this,e),this.color.copy(e.color),this.intensity=e.intensity,this},toJSON:function(e){return e=oe.prototype.toJSON.call(this,e),e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}),Nr.prototype=Object.assign(Object.create(Lr.prototype),{constructor:Nr,isHemisphereLight:!0,copy:function(e){return Lr.prototype.copy.call(this,e),this.groundColor.copy(e.groundColor),this}}),Object.assign(Ir.prototype,{copy:function(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var e={};return 0!==this.bias&&(e.bias=this.bias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}),Dr.prototype=Object.assign(Object.create(Ir.prototype),{constructor:Dr,isSpotLightShadow:!0,update:function(e){var t=this.camera,r=2*xi.RAD2DEG*e.angle,n=this.mapSize.width/this.mapSize.height;e=e.distance||t.far,r===t.fov&&n===t.aspect&&e===t.far||(t.fov=r,t.aspect=n,t.far=e,t.updateProjectionMatrix())}}),kr.prototype=Object.assign(Object.create(Lr.prototype),{constructor:kr,isSpotLight:!0,copy:function(e){return Lr.prototype.copy.call(this,e),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),Br.prototype=Object.assign(Object.create(Lr.prototype),{constructor:Br,isPointLight:!0,copy:function(e){return Lr.prototype.copy.call(this,e),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}),Fr.prototype=Object.assign(Object.create(Ir.prototype),{constructor:Fr}),Ur.prototype=Object.assign(Object.create(Lr.prototype),{constructor:Ur,isDirectionalLight:!0,copy:function(e){return Lr.prototype.copy.call(this,e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),zr.prototype=Object.assign(Object.create(Lr.prototype),{constructor:zr,isAmbientLight:!0}),$r.prototype=Object.assign(Object.create(Lr.prototype),{constructor:$r,isRectAreaLight:!0,copy:function(e){return Lr.prototype.copy.call(this,e),this.width=e.width,this.height=e.height,this},toJSON:function(e){return e=Lr.prototype.toJSON.call(this,e),e.object.width=this.width,e.object.height=this.height,e}});var Gi={arraySlice:function(e,t,r){return Gi.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==r?r:e.length)):e.slice(t,r)},convertArray:function(e,t,r){return!e||!r&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){for(var t=e.length,r=Array(t),n=0;n!==t;++n)r[n]=n;return r.sort(function(t,r){return e[t]-e[r]}),r},sortedArray:function(e,t,r){for(var n=e.length,i=new e.constructor(n),o=0,a=0;a!==n;++o)for(var s=r[o]*t,c=0;c!==t;++c)i[a++]=e[s+c];return i},flattenJSON:function(e,t,r,n){for(var i=1,o=e[0];void 0!==o&&void 0===o[n];)o=e[i++];if(void 0!==o){var a=o[n];if(void 0!==a)if(Array.isArray(a))do{void 0!==(a=o[n])&&(t.push(o.time),r.push.apply(r,a)),o=e[i++]}while(void 0!==o);else if(void 0!==a.toArray)do{void 0!==(a=o[n])&&(t.push(o.time),a.toArray(r,r.length)),o=e[i++]}while(void 0!==o);else do{void 0!==(a=o[n])&&(t.push(o.time),r.push(a)),o=e[i++]}while(void 0!==o)}}};Object.assign(Vr.prototype,{evaluate:function(e){var t=this.parameterPositions,r=this._cachedIndex,n=t[r],i=t[r-1];e:{t:{r:{n:if(!(e<n)){for(var o=r+2;;){if(void 0===n){if(e<i)break n;return this._cachedIndex=r=t.length,this.afterEnd_(r-1,e,i)}if(r===o)break;if(i=n,n=t[++r],e<n)break t}n=t.length;break r}if(e>=i)break e;for(e<(o=t[1])&&(r=2,i=o),o=r-2;;){if(void 0===i)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(r===o)break;if(n=i,i=t[--r-1],e>=i)break t}n=r,r=0}for(;r<n;)i=r+n>>>1,e<t[i]?n=i:r=i+1;if(n=t[r],void 0===(i=t[r-1]))return this._cachedIndex=0,this.beforeStart_(0,e,n);if(void 0===n)return this._cachedIndex=r=t.length,this.afterEnd_(r-1,i,e)}this._cachedIndex=r,this.intervalChanged_(r,i,n)}return this.interpolate_(r,i,e,n)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(e){var t=this.resultBuffer,r=this.sampleValues,n=this.valueSize;e*=n;for(var i=0;i!==n;++i)t[i]=r[e+i];return t},interpolate_:function(e,t,r,n){throw Error("call to abstract method")},intervalChanged_:function(e,t,r){}}),Object.assign(Vr.prototype,{beforeStart_:Vr.prototype.copySampleValue_,afterEnd_:Vr.prototype.copySampleValue_}),Gr.prototype=Object.assign(Object.create(Vr.prototype),{constructor:Gr,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(e,t,r){var n=this.parameterPositions,i=e-2,o=e+1,a=n[i],s=n[o];if(void 0===a)switch(this.getSettings_().endingStart){case 2401:i=e,a=2*t-r;break;case 2402:a=t+n[i=n.length-2]-n[i+1];break;default:i=e,a=r}if(void 0===s)switch(this.getSettings_().endingEnd){case 2401:o=e,s=2*r-t;break;case 2402:o=1,s=r+n[1]-n[0];break;default:o=e-1,s=t}e=.5*(r-t),n=this.valueSize,this._weightPrev=e/(t-a),this._weightNext=e/(s-r),this._offsetPrev=i*n,this._offsetNext=o*n},interpolate_:function(e,t,r,n){var i=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=(e*=a)-a,c=this._offsetPrev,u=this._offsetNext,h=this._weightPrev,l=this._weightNext,p=(r-t)/(n-t);for(t=-h*(n=(r=p*p)*p)+2*h*r-h*p,h=(1+h)*n+(-1.5-2*h)*r+(-.5+h)*p+1,p=(-1-l)*n+(1.5+l)*r+.5*p,l=l*n-l*r,r=0;r!==a;++r)i[r]=t*o[c+r]+h*o[s+r]+p*o[e+r]+l*o[u+r];return i}}),Hr.prototype=Object.assign(Object.create(Vr.prototype),{constructor:Hr,interpolate_:function(e,t,r,n){var i=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=(e*=a)-a;for(r=1-(t=(r-t)/(n-t)),n=0;n!==a;++n)i[n]=o[s+n]*r+o[e+n]*t;return i}}),qr.prototype=Object.assign(Object.create(Vr.prototype),{constructor:qr,interpolate_:function(e,t,r,n){return this.copySampleValue_(e-1)}});var Hi;Hi={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(e){return new qr(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodLinear:function(e){return new Hr(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:function(e){return new Gr(this.times,this.values,this.getValueSize(),e)},setInterpolation:function(e){var t;switch(e){case 2300:t=this.InterpolantFactoryMethodDiscrete;break;case 2301:t=this.InterpolantFactoryMethodLinear;break;case 2302:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){if(t="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name,void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw Error(t);this.setInterpolation(this.DefaultInterpolation)}console.warn("THREE.KeyframeTrackPrototype:",t)}else this.createInterpolant=t},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(e){if(0!==e)for(var t=this.times,r=0,n=t.length;r!==n;++r)t[r]+=e;return this},scale:function(e){if(1!==e)for(var t=this.times,r=0,n=t.length;r!==n;++r)t[r]*=e;return this},trim:function(e,t){for(var r=this.times,n=r.length,i=0,o=n-1;i!==n&&r[i]<e;)++i;for(;-1!==o&&r[o]>t;)--o;return++o,0===i&&o===n||(i>=o&&(o=Math.max(o,1),i=o-1),n=this.getValueSize(),this.times=Gi.arraySlice(r,i,o),this.values=Gi.arraySlice(this.values,i*n,o*n)),this},validate:function(){var e=!0;0!=(r=this.getValueSize())-Math.floor(r)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),e=!1);var t=this.times,r=this.values,n=t.length;0===n&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",this),e=!1);for(var i=null,o=0;o!==n;o++){var a=t[o];if("number"==typeof a&&isNaN(a)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",this,o,a),e=!1;break}if(null!==i&&i>a){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,o,a,i),e=!1;break}i=a}if(void 0!==r&&Gi.isTypedArray(r))for(o=0,t=r.length;o!==t;++o)if(n=r[o],isNaN(n)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,o,n),e=!1;break}return e},optimize:function(){for(var e=this.times,t=this.values,r=this.getValueSize(),n=2302===this.getInterpolation(),i=1,o=e.length-1,a=1;a<o;++a){var s=!1;if((l=e[a])!==e[a+1]&&(1!==a||l!==l[0]))if(n)s=!0;else for(var c=a*r,u=c-r,h=c+r,l=0;l!==r;++l){var p=t[c+l];if(p!==t[u+l]||p!==t[h+l]){s=!0;break}}if(s){if(a!==i)for(e[i]=e[a],s=a*r,c=i*r,l=0;l!==r;++l)t[c+l]=t[s+l];++i}}if(0<o){for(e[i]=e[o],s=o*r,c=i*r,l=0;l!==r;++l)t[c+l]=t[s+l];++i}return i!==e.length&&(this.times=Gi.arraySlice(e,0,i),this.values=Gi.arraySlice(t,0,i*r)),this}},Xr.prototype=Object.assign(Object.create(Hi),{constructor:Xr,ValueTypeName:"vector"}),Yr.prototype=Object.assign(Object.create(Vr.prototype),{constructor:Yr,interpolate_:function(e,t,r,n){var i=this.resultBuffer,o=this.sampleValues,a=this.valueSize;for(t=(r-t)/(n-t),r=(e*=a)+a;e!==r;e+=4)s.slerpFlat(i,0,o,e-a,o,e,t);return i}}),Kr.prototype=Object.assign(Object.create(Hi),{constructor:Kr,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(e){return new Yr(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:void 0}),Zr.prototype=Object.assign(Object.create(Hi),{constructor:Zr,ValueTypeName:"number"}),Jr.prototype=Object.assign(Object.create(Hi),{constructor:Jr,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Qr.prototype=Object.assign(Object.create(Hi),{constructor:Qr,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),en.prototype=Object.assign(Object.create(Hi),{constructor:en,ValueTypeName:"color"}),tn.prototype=Hi,Hi.constructor=tn,Object.assign(tn,{parse:function(e){if(void 0===e.type)throw Error("track type undefined, can not parse");var t=tn._getTrackTypeForValueTypeName(e.type);if(void 0===e.times){var r=[],n=[];Gi.flattenJSON(e.keys,r,n,"value"),e.times=r,e.values=n}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)},toJSON:function(e){if(void 0!==(t=e.constructor).toJSON)t=t.toJSON(e);else{var t={name:e.name,times:Gi.convertArray(e.times,Array),values:Gi.convertArray(e.values,Array)},r=e.getInterpolation();r!==e.DefaultInterpolation&&(t.interpolation=r)}return t.type=e.ValueTypeName,t},_getTrackTypeForValueTypeName:function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return Zr;case"vector":case"vector2":case"vector3":case"vector4":return Xr;case"color":return en;case"quaternion":return Kr;case"bool":case"boolean":return Qr;case"string":return Jr}throw Error("Unsupported typeName: "+e)}}),Object.assign(rn,{parse:function(e){for(var t=[],r=e.tracks,n=1/(e.fps||1),i=0,o=r.length;i!==o;++i)t.push(tn.parse(r[i]).scale(n));return new rn(e.name,e.duration,t)},toJSON:function(e){var t=[],r=e.tracks;e={name:e.name,duration:e.duration,tracks:t};for(var n=0,i=r.length;n!==i;++n)t.push(tn.toJSON(r[n]));return e},CreateFromMorphTargetSequence:function(e,t,r,n){for(var i=t.length,o=[],a=0;a<i;a++){u=[];(c=[]).push((a+i-1)%i,a,(a+1)%i),u.push(0,1,0);var s=Gi.getKeyframeOrder(c),c=Gi.sortedArray(c,1,s),u=Gi.sortedArray(u,1,s);n||0!==c[0]||(c.push(i),u.push(u[0])),o.push(new Zr(".morphTargetInfluences["+t[a].name+"]",c,u).scale(1/r))}return new rn(e,-1,o)},findByName:function(e,t){var r=e;Array.isArray(e)||(r=e.geometry&&e.geometry.animations||e.animations);for(var n=0;n<r.length;n++)if(r[n].name===t)return r[n];return null},CreateClipsFromMorphTargetSequences:function(e,t,r){for(var n={},i=/^([\w-]*?)([\d]+)$/,o=0,a=e.length;o<a;o++){var s=e[o],c=s.name.match(i);if(c&&1<c.length){var u=c[1];(c=n[u])||(n[u]=c=[]),c.push(s)}}e=[];for(u in n)e.push(rn.CreateFromMorphTargetSequence(u,n[u],t,r));return e},parseAnimation:function(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var r=function(e,t,r,n,i){if(0!==r.length){var o=[],a=[];Gi.flattenJSON(r,o,a,n),0!==o.length&&i.push(new e(t,o,a))}},n=[],i=e.name||"default",o=e.length||-1,a=e.fps||30,s=e.hierarchy||[],c=0;c<s.length;c++){var u=s[c].keys;if(u&&0!==u.length)if(u[0].morphTargets){for(var o={},h=0;h<u.length;h++)if(u[h].morphTargets)for(d=0;d<u[h].morphTargets.length;d++)o[u[h].morphTargets[d]]=-1;for(var l in o){for(var p=[],f=[],d=0;d!==u[h].morphTargets.length;++d){var m=u[h];p.push(m.time),f.push(m.morphTarget===l?1:0)}n.push(new Zr(".morphTargetInfluence["+l+"]",p,f))}o=o.length*(a||1)}else h=".bones["+t[c].name+"]",r(Xr,h+".position",u,"pos",n),r(Kr,h+".quaternion",u,"rot",n),r(Xr,h+".scale",u,"scl",n)}return 0===n.length?null:new rn(i,o,n)}}),Object.assign(rn.prototype,{resetDuration:function(){for(var e=0,t=0,r=this.tracks.length;t!==r;++t)var n=this.tracks[t],e=Math.max(e,n.times[n.times.length-1]);this.duration=e},trim:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this},optimize:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this}}),Object.assign(nn.prototype,{load:function(e,t,r,n){var i=this;new Tr(i.manager).load(e,function(e){t(i.parse(JSON.parse(e)))},r,n)},setTextures:function(e){this.textures=e},parse:function(e){function t(e){return void 0===n[e]&&console.warn("THREE.MaterialLoader: Undefined texture",e),n[e]}var n=this.textures,i=new zi[e.type];if(void 0!==e.uuid&&(i.uuid=e.uuid),void 0!==e.name&&(i.name=e.name),void 0!==e.color&&i.color.setHex(e.color),void 0!==e.roughness&&(i.roughness=e.roughness),void 0!==e.metalness&&(i.metalness=e.metalness),void 0!==e.emissive&&i.emissive.setHex(e.emissive),void 0!==e.specular&&i.specular.setHex(e.specular),void 0!==e.shininess&&(i.shininess=e.shininess),void 0!==e.clearCoat&&(i.clearCoat=e.clearCoat),void 0!==e.clearCoatRoughness&&(i.clearCoatRoughness=e.clearCoatRoughness),void 0!==e.uniforms&&(i.uniforms=e.uniforms),void 0!==e.vertexShader&&(i.vertexShader=e.vertexShader),void 0!==e.fragmentShader&&(i.fragmentShader=e.fragmentShader),void 0!==e.vertexColors&&(i.vertexColors=e.vertexColors),void 0!==e.fog&&(i.fog=e.fog),void 0!==e.shading&&(i.shading=e.shading),void 0!==e.blending&&(i.blending=e.blending),void 0!==e.side&&(i.side=e.side),void 0!==e.opacity&&(i.opacity=e.opacity),void 0!==e.transparent&&(i.transparent=e.transparent),void 0!==e.alphaTest&&(i.alphaTest=e.alphaTest),void 0!==e.depthTest&&(i.depthTest=e.depthTest),void 0!==e.depthWrite&&(i.depthWrite=e.depthWrite),void 0!==e.colorWrite&&(i.colorWrite=e.colorWrite),void 0!==e.wireframe&&(i.wireframe=e.wireframe),void 0!==e.wireframeLinewidth&&(i.wireframeLinewidth=e.wireframeLinewidth),void 0!==e.wireframeLinecap&&(i.wireframeLinecap=e.wireframeLinecap),void 0!==e.wireframeLinejoin&&(i.wireframeLinejoin=e.wireframeLinejoin),void 0!==e.skinning&&(i.skinning=e.skinning),void 0!==e.morphTargets&&(i.morphTargets=e.morphTargets),void 0!==e.size&&(i.size=e.size),void 0!==e.sizeAttenuation&&(i.sizeAttenuation=e.sizeAttenuation),void 0!==e.map&&(i.map=t(e.map)),void 0!==e.alphaMap&&(i.alphaMap=t(e.alphaMap),i.transparent=!0),void 0!==e.bumpMap&&(i.bumpMap=t(e.bumpMap)),void 0!==e.bumpScale&&(i.bumpScale=e.bumpScale),void 0!==e.normalMap&&(i.normalMap=t(e.normalMap)),void 0!==e.normalScale){var o=e.normalScale;!1===Array.isArray(o)&&(o=[o,o]),i.normalScale=(new r).fromArray(o)}return void 0!==e.displacementMap&&(i.displacementMap=t(e.displacementMap)),void 0!==e.displacementScale&&(i.displacementScale=e.displacementScale),void 0!==e.displacementBias&&(i.displacementBias=e.displacementBias),void 0!==e.roughnessMap&&(i.roughnessMap=t(e.roughnessMap)),void 0!==e.metalnessMap&&(i.metalnessMap=t(e.metalnessMap)),void 0!==e.emissiveMap&&(i.emissiveMap=t(e.emissiveMap)),void 0!==e.emissiveIntensity&&(i.emissiveIntensity=e.emissiveIntensity),void 0!==e.specularMap&&(i.specularMap=t(e.specularMap)),void 0!==e.envMap&&(i.envMap=t(e.envMap)),void 0!==e.reflectivity&&(i.reflectivity=e.reflectivity),void 0!==e.lightMap&&(i.lightMap=t(e.lightMap)),void 0!==e.lightMapIntensity&&(i.lightMapIntensity=e.lightMapIntensity),void 0!==e.aoMap&&(i.aoMap=t(e.aoMap)),void 0!==e.aoMapIntensity&&(i.aoMapIntensity=e.aoMapIntensity),void 0!==e.gradientMap&&(i.gradientMap=t(e.gradientMap)),i}}),Object.assign(on.prototype,{load:function(e,t,r,n){var i=this;new Tr(i.manager).load(e,function(e){t(i.parse(JSON.parse(e)))},r,n)},parse:function(e){var t=new Se;void 0!==(o=e.data.index)&&(o=new qi[o.type](o.array),t.setIndex(new le(o,1)));var r,n=e.data.attributes;for(r in n){var i=n[r],o=new qi[i.type](i.array);t.addAttribute(r,new le(o,i.itemSize,i.normalized))}if(void 0!==(r=e.data.groups||e.data.drawcalls||e.data.offsets))for(o=0,n=r.length;o!==n;++o)i=r[o],t.addGroup(i.start,i.count,i.materialIndex);return void 0!==(e=e.data.boundingSphere)&&(r=new c,void 0!==e.center&&r.fromArray(e.center),t.boundingSphere=new Z(r,e.radius)),t}});var qi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};an.Handlers={handlers:[],add:function(e,t){this.handlers.push(e,t)},get:function(e){for(var t=this.handlers,r=0,n=t.length;r<n;r+=2){var i=t[r+1];if(t[r].test(e))return i}return null}},Object.assign(an.prototype,{crossOrigin:void 0,extractUrlBase:function(e){return 1===(e=e.split("/")).length?"./":(e.pop(),e.join("/")+"/")},initMaterials:function(e,t,r){for(var n=[],i=0;i<e.length;++i)n[i]=this.createMaterial(e[i],t,r);return n},createMaterial:function(){var e={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},t=new V,r=new Rr,n=new nn;return function(i,o,a){function s(e,t,n,i,s){e=o+e;var c=an.Handlers.get(e);return null!==c?e=c.load(e):(r.setCrossOrigin(a),e=r.load(e)),void 0!==t&&(e.repeat.fromArray(t),1!==t[0]&&(e.wrapS=1e3),1!==t[1]&&(e.wrapT=1e3)),void 0!==n&&e.offset.fromArray(n),void 0!==i&&("repeat"===i[0]&&(e.wrapS=1e3),"mirror"===i[0]&&(e.wrapS=1002),"repeat"===i[1]&&(e.wrapT=1e3),"mirror"===i[1]&&(e.wrapT=1002)),void 0!==s&&(e.anisotropy=s),t=xi.generateUUID(),u[t]=e,t}var c,u={},h={uuid:xi.generateUUID(),type:"MeshLambertMaterial"};for(c in i){var l=i[c];switch(c){case"DbgColor":case"DbgIndex":case"opticalDensity":case"illumination":break;case"DbgName":h.name=l;break;case"blending":h.blending=e[l];break;case"colorAmbient":case"mapAmbient":console.warn("THREE.Loader.createMaterial:",c,"is no longer supported.");break;case"colorDiffuse":h.color=t.fromArray(l).getHex();break;case"colorSpecular":h.specular=t.fromArray(l).getHex();break;case"colorEmissive":h.emissive=t.fromArray(l).getHex();break;case"specularCoef":h.shininess=l;break;case"shading":"basic"===l.toLowerCase()&&(h.type="MeshBasicMaterial"),"phong"===l.toLowerCase()&&(h.type="MeshPhongMaterial"),"standard"===l.toLowerCase()&&(h.type="MeshStandardMaterial");break;case"mapDiffuse":h.map=s(l,i.mapDiffuseRepeat,i.mapDiffuseOffset,i.mapDiffuseWrap,i.mapDiffuseAnisotropy);break;case"mapDiffuseRepeat":case"mapDiffuseOffset":case"mapDiffuseWrap":case"mapDiffuseAnisotropy":break;case"mapEmissive":h.emissiveMap=s(l,i.mapEmissiveRepeat,i.mapEmissiveOffset,i.mapEmissiveWrap,i.mapEmissiveAnisotropy);break;case"mapEmissiveRepeat":case"mapEmissiveOffset":case"mapEmissiveWrap":case"mapEmissiveAnisotropy":break;case"mapLight":h.lightMap=s(l,i.mapLightRepeat,i.mapLightOffset,i.mapLightWrap,i.mapLightAnisotropy);break;case"mapLightRepeat":case"mapLightOffset":case"mapLightWrap":case"mapLightAnisotropy":break;case"mapAO":h.aoMap=s(l,i.mapAORepeat,i.mapAOOffset,i.mapAOWrap,i.mapAOAnisotropy);break;case"mapAORepeat":case"mapAOOffset":case"mapAOWrap":case"mapAOAnisotropy":break;case"mapBump":h.bumpMap=s(l,i.mapBumpRepeat,i.mapBumpOffset,i.mapBumpWrap,i.mapBumpAnisotropy);break;case"mapBumpScale":h.bumpScale=l;break;case"mapBumpRepeat":case"mapBumpOffset":case"mapBumpWrap":case"mapBumpAnisotropy":break;case"mapNormal":h.normalMap=s(l,i.mapNormalRepeat,i.mapNormalOffset,i.mapNormalWrap,i.mapNormalAnisotropy);break;case"mapNormalFactor":h.normalScale=[l,l];break;case"mapNormalRepeat":case"mapNormalOffset":case"mapNormalWrap":case"mapNormalAnisotropy":break;case"mapSpecular":h.specularMap=s(l,i.mapSpecularRepeat,i.mapSpecularOffset,i.mapSpecularWrap,i.mapSpecularAnisotropy);break;case"mapSpecularRepeat":case"mapSpecularOffset":case"mapSpecularWrap":case"mapSpecularAnisotropy":break;case"mapMetalness":h.metalnessMap=s(l,i.mapMetalnessRepeat,i.mapMetalnessOffset,i.mapMetalnessWrap,i.mapMetalnessAnisotropy);break;case"mapMetalnessRepeat":case"mapMetalnessOffset":case"mapMetalnessWrap":case"mapMetalnessAnisotropy":break;case"mapRoughness":h.roughnessMap=s(l,i.mapRoughnessRepeat,i.mapRoughnessOffset,i.mapRoughnessWrap,i.mapRoughnessAnisotropy);break;case"mapRoughnessRepeat":case"mapRoughnessOffset":case"mapRoughnessWrap":case"mapRoughnessAnisotropy":break;case"mapAlpha":h.alphaMap=s(l,i.mapAlphaRepeat,i.mapAlphaOffset,i.mapAlphaWrap,i.mapAlphaAnisotropy);break;case"mapAlphaRepeat":case"mapAlphaOffset":case"mapAlphaWrap":case"mapAlphaAnisotropy":break;case"flipSided":h.side=1;break;case"doubleSided":h.side=2;break;case"transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity"),h.opacity=l;break;case"depthTest":case"depthWrite":case"colorWrite":case"opacity":case"reflectivity":case"transparent":case"visible":case"wireframe":h[c]=l;break;case"vertexColors":!0===l&&(h.vertexColors=2),"face"===l&&(h.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",c,l)}}return"MeshBasicMaterial"===h.type&&delete h.emissive,"MeshPhongMaterial"!==h.type&&delete h.specular,1>h.opacity&&(h.transparent=!0),n.setTextures(u),n.parse(h)}}()}),Object.assign(sn.prototype,{load:function(e,t,r,n){var i=this,o=this.texturePath&&"string"==typeof this.texturePath?this.texturePath:an.prototype.extractUrlBase(e),a=new Tr(this.manager);a.setWithCredentials(this.withCredentials),a.load(e,function(r){var n=(r=JSON.parse(r)).metadata;if(void 0!==n&&void 0!==(n=n.type)){if("object"===n.toLowerCase())return void console.error("THREE.JSONLoader: "+e+" should be loaded with THREE.ObjectLoader instead.");if("scene"===n.toLowerCase())return void console.error("THREE.JSONLoader: "+e+" should be loaded with THREE.SceneLoader instead.")}r=i.parse(r,o),t(r.geometry,r.materials)},r,n)},setTexturePath:function(e){this.texturePath=e},parse:function(e,t){void 0!==e.data&&(e=e.data),e.scale=void 0!==e.scale?1/e.scale:1;var n,o,a,s,u,h,l,p,f,d,m,v,g,y,b=new he,_=e,x=_.faces;f=_.vertices;var w=_.normals,S=_.colors;h=_.scale;var M=0;if(void 0!==_.uvs){for(n=0;n<_.uvs.length;n++)_.uvs[n].length&&M++;for(n=0;n<M;n++)b.faceVertexUvs[n]=[]}for(s=0,u=f.length;s<u;)n=new c,n.x=f[s++]*h,n.y=f[s++]*h,n.z=f[s++]*h,b.vertices.push(n);for(s=0,u=x.length;s<u;)if(f=x[s++],d=1&f,a=2&f,n=8&f,l=16&f,m=32&f,h=64&f,f&=128,d){if(d=new ue,d.a=x[s],d.b=x[s+1],d.c=x[s+3],v=new ue,v.a=x[s+1],v.b=x[s+2],v.c=x[s+3],s+=4,a&&(a=x[s++],d.materialIndex=a,v.materialIndex=a),a=b.faces.length,n)for(n=0;n<M;n++)for(g=_.uvs[n],b.faceVertexUvs[n][a]=[],b.faceVertexUvs[n][a+1]=[],o=0;4>o;o++)p=x[s++],y=g[2*p],p=g[2*p+1],y=new r(y,p),2!==o&&b.faceVertexUvs[n][a].push(y),0!==o&&b.faceVertexUvs[n][a+1].push(y);if(l&&(l=3*x[s++],d.normal.set(w[l++],w[l++],w[l]),v.normal.copy(d.normal)),m)for(n=0;4>n;n++)l=3*x[s++],m=new c(w[l++],w[l++],w[l]),2!==n&&d.vertexNormals.push(m),0!==n&&v.vertexNormals.push(m);if(h&&(h=x[s++],h=S[h],d.color.setHex(h),v.color.setHex(h)),f)for(n=0;4>n;n++)h=x[s++],h=S[h],2!==n&&d.vertexColors.push(new V(h)),0!==n&&v.vertexColors.push(new V(h));b.faces.push(d),b.faces.push(v)}else{if(d=new ue,d.a=x[s++],d.b=x[s++],d.c=x[s++],a&&(a=x[s++],d.materialIndex=a),a=b.faces.length,n)for(n=0;n<M;n++)for(g=_.uvs[n],b.faceVertexUvs[n][a]=[],o=0;3>o;o++)p=x[s++],y=g[2*p],p=g[2*p+1],y=new r(y,p),b.faceVertexUvs[n][a].push(y);if(l&&(l=3*x[s++],d.normal.set(w[l++],w[l++],w[l])),m)for(n=0;3>n;n++)l=3*x[s++],m=new c(w[l++],w[l++],w[l]),d.vertexNormals.push(m);if(h&&(h=x[s++],d.color.setHex(S[h])),f)for(n=0;3>n;n++)h=x[s++],d.vertexColors.push(new V(S[h]));b.faces.push(d)}if(_=e,s=void 0!==_.influencesPerVertex?_.influencesPerVertex:2,_.skinWeights)for(u=0,x=_.skinWeights.length;u<x;u+=s)b.skinWeights.push(new i(_.skinWeights[u],1<s?_.skinWeights[u+1]:0,2<s?_.skinWeights[u+2]:0,3<s?_.skinWeights[u+3]:0));if(_.skinIndices)for(u=0,x=_.skinIndices.length;u<x;u+=s)b.skinIndices.push(new i(_.skinIndices[u],1<s?_.skinIndices[u+1]:0,2<s?_.skinIndices[u+2]:0,3<s?_.skinIndices[u+3]:0));if(b.bones=_.bones,b.bones&&0<b.bones.length&&(b.skinWeights.length!==b.skinIndices.length||b.skinIndices.length!==b.vertices.length)&&console.warn("When skinning, number of vertices ("+b.vertices.length+"), skinIndices ("+b.skinIndices.length+"), and skinWeights ("+b.skinWeights.length+") should match."),u=e,x=u.scale,void 0!==u.morphTargets)for(_=0,s=u.morphTargets.length;_<s;_++)for(b.morphTargets[_]={},b.morphTargets[_].name=u.morphTargets[_].name,b.morphTargets[_].vertices=[],w=b.morphTargets[_].vertices,S=u.morphTargets[_].vertices,M=0,f=S.length;M<f;M+=3)h=new c,h.x=S[M]*x,h.y=S[M+1]*x,h.z=S[M+2]*x,w.push(h);if(void 0!==u.morphColors&&0<u.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),x=b.faces,u=u.morphColors[0].colors,_=0,s=x.length;_<s;_++)x[_].color.fromArray(u,3*_);for(_=[],s=[],void 0!==(u=e).animation&&s.push(u.animation),void 0!==u.animations&&(u.animations.length?s=s.concat(u.animations):s.push(u.animations)),u=0;u<s.length;u++)(x=rn.parseAnimation(s[u],b.bones))&&_.push(x);return b.morphTargets&&(s=rn.CreateClipsFromMorphTargetSequences(b.morphTargets,10),_=_.concat(s)),0<_.length&&(b.animations=_),b.computeFaceNormals(),b.computeBoundingSphere(),void 0===e.materials||0===e.materials.length?{geometry:b}:(_=an.prototype.initMaterials(e.materials,t,this.crossOrigin),{geometry:b,materials:_})}}),Object.assign(cn.prototype,{load:function(e,t,r,n){""===this.texturePath&&(this.texturePath=e.substring(0,e.lastIndexOf("/")+1));var i=this;new Tr(i.manager).load(e,function(r){var o=null;try{o=JSON.parse(r)}catch(t){return void 0!==n&&n(t),void console.error("THREE:ObjectLoader: Can't parse "+e+".",t.message)}void 0===(r=o.metadata)||void 0===r.type||"geometry"===r.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+e+". Use THREE.JSONLoader instead."):i.parse(o,t)},r,n)},setTexturePath:function(e){this.texturePath=e},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(e,t){var r=this.parseGeometries(e.geometries),n=this.parseImages(e.images,function(){void 0!==t&&t(i)}),n=this.parseTextures(e.textures,n),n=this.parseMaterials(e.materials,n),i=this.parseObject(e.object,r,n);return e.animations&&(i.animations=this.parseAnimations(e.animations)),void 0!==e.images&&0!==e.images.length||void 0===t||t(i),i},parseGeometries:function(e){var t={};if(void 0!==e)for(var r=new sn,n=new on,i=0,o=e.length;i<o;i++){var a,s=e[i];switch(s.type){case"PlaneGeometry":case"PlaneBufferGeometry":a=new Ui[s.type](s.width,s.height,s.widthSegments,s.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":case"CubeGeometry":a=new Ui[s.type](s.width,s.height,s.depth,s.widthSegments,s.heightSegments,s.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":a=new Ui[s.type](s.radius,s.segments,s.thetaStart,s.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":a=new Ui[s.type](s.radiusTop,s.radiusBottom,s.height,s.radialSegments,s.heightSegments,s.openEnded,s.thetaStart,s.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":a=new Ui[s.type](s.radius,s.height,s.radialSegments,s.heightSegments,s.openEnded,s.thetaStart,s.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":a=new Ui[s.type](s.radius,s.widthSegments,s.heightSegments,s.phiStart,s.phiLength,s.thetaStart,s.thetaLength);break;case"DodecahedronGeometry":case"IcosahedronGeometry":case"OctahedronGeometry":case"TetrahedronGeometry":a=new Ui[s.type](s.radius,s.detail);break;case"RingGeometry":case"RingBufferGeometry":a=new Ui[s.type](s.innerRadius,s.outerRadius,s.thetaSegments,s.phiSegments,s.thetaStart,s.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":a=new Ui[s.type](s.radius,s.tube,s.radialSegments,s.tubularSegments,s.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":a=new Ui[s.type](s.radius,s.tube,s.tubularSegments,s.radialSegments,s.p,s.q);break;case"LatheGeometry":case"LatheBufferGeometry":a=new Ui[s.type](s.points,s.segments,s.phiStart,s.phiLength);break;case"BufferGeometry":a=n.parse(s);break;case"Geometry":a=r.parse(s,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+s.type+'"');continue}a.uuid=s.uuid,void 0!==s.name&&(a.name=s.name),t[s.uuid]=a}return t},parseMaterials:function(e,t){var r={};if(void 0!==e){var n=new nn;n.setTextures(t);for(var i=0,o=e.length;i<o;i++){var a=e[i];if("MultiMaterial"===a.type){for(var s=[],c=0;c<a.materials.length;c++)s.push(n.parse(a.materials[c]));r[a.uuid]=s}else r[a.uuid]=n.parse(a)}}return r},parseAnimations:function(e){for(var t=[],r=0;r<e.length;r++){var n=rn.parse(e[r]);t.push(n)}return t},parseImages:function(e,t){var r=this,n={};if(void 0!==e&&0<e.length){var i=new jr(o=new Cr(t));i.setCrossOrigin(this.crossOrigin);for(var o=0,a=e.length;o<a;o++){var s=e[o],c=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(s.url)?s.url:r.texturePath+s.url;n[s.uuid]=function(e){return r.manager.itemStart(e),i.load(e,function(){r.manager.itemEnd(e)},void 0,function(){r.manager.itemEnd(e),r.manager.itemError(e)})}(c)}}return n},parseTextures:function(e,t){function r(e,t){return"number"==typeof e?e:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",e),t[e])}var i={};if(void 0!==e)for(var o=0,a=e.length;o<a;o++){var s=e[o];void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===t[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image);var c=new n(t[s.image]);c.needsUpdate=!0,c.uuid=s.uuid,void 0!==s.name&&(c.name=s.name),void 0!==s.mapping&&(c.mapping=r(s.mapping,Wi)),void 0!==s.offset&&c.offset.fromArray(s.offset),void 0!==s.repeat&&c.repeat.fromArray(s.repeat),void 0!==s.wrap&&(c.wrapS=r(s.wrap[0],Xi),c.wrapT=r(s.wrap[1],Xi)),void 0!==s.minFilter&&(c.minFilter=r(s.minFilter,Yi)),void 0!==s.magFilter&&(c.magFilter=r(s.magFilter,Yi)),void 0!==s.anisotropy&&(c.anisotropy=s.anisotropy),void 0!==s.flipY&&(c.flipY=s.flipY),i[s.uuid]=c}return i},parseObject:function(){var e=new u;return function(t,r,n){function i(e){return void 0===r[e]&&console.warn("THREE.ObjectLoader: Undefined geometry",e),r[e]}function o(e){if(void 0!==e){if(Array.isArray(e)){for(var t=[],r=0,i=e.length;r<i;r++){var o=e[r];void 0===n[o]&&console.warn("THREE.ObjectLoader: Undefined material",o),t.push(n[o])}return t}return void 0===n[e]&&console.warn("THREE.ObjectLoader: Undefined material",e),n[e]}}var a;switch(t.type){case"Scene":a=new dt,void 0!==t.background&&Number.isInteger(t.background)&&(a.background=new V(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?a.fog=new ft(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(a.fog=new pt(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":a=new ce(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(a.focus=t.focus),void 0!==t.zoom&&(a.zoom=t.zoom),void 0!==t.filmGauge&&(a.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(a.filmOffset=t.filmOffset),void 0!==t.view&&(a.view=Object.assign({},t.view));break;case"OrthographicCamera":a=new se(t.left,t.right,t.top,t.bottom,t.near,t.far);break;case"AmbientLight":a=new zr(t.color,t.intensity);break;case"DirectionalLight":a=new Ur(t.color,t.intensity);break;case"PointLight":a=new Br(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":a=new $r(t.color,t.intensity,t.width,t.height);break;case"SpotLight":a=new kr(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":a=new Nr(t.color,t.groundColor,t.intensity);break;case"SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case"Mesh":a=i(t.geometry);var s=o(t.material);a=a.bones&&0<a.bones.length?new xt(a,s):new Re(a,s);break;case"LOD":a=new yt;break;case"Line":a=new St(i(t.geometry),o(t.material),t.mode);break;case"LineLoop":a=new Et(i(t.geometry),o(t.material));break;case"LineSegments":a=new Mt(i(t.geometry),o(t.material));break;case"PointCloud":case"Points":a=new Tt(i(t.geometry),o(t.material));break;case"Sprite":a=new gt(o(t.material));break;case"Group":a=new Ot;break;default:a=new oe}if(a.uuid=t.uuid,void 0!==t.name&&(a.name=t.name),void 0!==t.matrix?(e.fromArray(t.matrix),e.decompose(a.position,a.quaternion,a.scale)):(void 0!==t.position&&a.position.fromArray(t.position),void 0!==t.rotation&&a.rotation.fromArray(t.rotation),void 0!==t.quaternion&&a.quaternion.fromArray(t.quaternion),void 0!==t.scale&&a.scale.fromArray(t.scale)),void 0!==t.castShadow&&(a.castShadow=t.castShadow),void 0!==t.receiveShadow&&(a.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(a.shadow.bias=t.shadow.bias),void 0!==t.shadow.radius&&(a.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&a.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(a.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(a.visible=t.visible),void 0!==t.userData&&(a.userData=t.userData),void 0!==t.children)for(var c in t.children)a.add(this.parseObject(t.children[c],r,n));if("LOD"===t.type)for(t=t.levels,s=0;s<t.length;s++){var u=t[s];void 0!==(c=a.getObjectByProperty("uuid",u.object))&&a.addLevel(c,u.distance)}return a}}()});var Wi={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Xi={RepeatWrapping:1e3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Yi={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(pn.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(e){return e=this.getUtoTmapping(e),this.getPoint(e)},getPoints:function(e){void 0===e&&(e=5);for(var t=[],r=0;r<=e;r++)t.push(this.getPoint(r/e));return t},getSpacedPoints:function(e){void 0===e&&(e=5);for(var t=[],r=0;r<=e;r++)t.push(this.getPointAt(r/e));return t},getLength:function(){var e=this.getLengths();return e[e.length-1]},getLengths:function(e){if(void 0===e&&(e=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t,r,n=[],i=this.getPoint(0),o=0;for(n.push(0),r=1;r<=e;r++)t=this.getPoint(r/e),o+=t.distanceTo(i),n.push(o),i=t;return this.cacheArcLengths=n},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(e,t){var r,n,i=this.getLengths(),o=i.length;n=t||e*i[o-1];for(var a,s=0,c=o-1;s<=c;)if(r=Math.floor(s+(c-s)/2),0>(a=i[r]-n))s=r+1;else{if(!(0<a)){c=r;break}c=r-1}return r=c,i[r]===n?r/(o-1):(s=i[r],(r+(n-s)/(i[r+1]-s))/(o-1))},getTangent:function(e){var t=e-1e-4;return e+=1e-4,0>t&&(t=0),1<e&&(e=1),t=this.getPoint(t),this.getPoint(e).clone().sub(t).normalize()},getTangentAt:function(e){return e=this.getUtoTmapping(e),this.getTangent(e)},computeFrenetFrames:function(e,t){var r,n,i=new c,o=[],a=[],s=[],h=new c,l=new u;for(r=0;r<=e;r++)n=r/e,o[r]=this.getTangentAt(n),o[r].normalize();a[0]=new c,s[0]=new c,r=Number.MAX_VALUE,n=Math.abs(o[0].x);var p=Math.abs(o[0].y),f=Math.abs(o[0].z);for(n<=r&&(r=n,i.set(1,0,0)),p<=r&&(r=p,i.set(0,1,0)),f<=r&&i.set(0,0,1),h.crossVectors(o[0],i).normalize(),a[0].crossVectors(o[0],h),s[0].crossVectors(o[0],a[0]),r=1;r<=e;r++)a[r]=a[r-1].clone(),s[r]=s[r-1].clone(),h.crossVectors(o[r-1],o[r]),h.length()>Number.EPSILON&&(h.normalize(),i=Math.acos(xi.clamp(o[r-1].dot(o[r]),-1,1)),a[r].applyMatrix4(l.makeRotationAxis(h,i))),s[r].crossVectors(o[r],a[r]);if(!0===t)for(i=Math.acos(xi.clamp(a[0].dot(a[e]),-1,1)),i/=e,0<o[0].dot(h.crossVectors(a[0],a[e]))&&(i=-i),r=1;r<=e;r++)a[r].applyMatrix4(l.makeRotationAxis(o[r],i*r)),s[r].crossVectors(o[r],a[r]);return{tangents:o,normals:a,binormals:s}}}),(fn.prototype=Object.create(pn.prototype)).constructor=fn,fn.prototype.isLineCurve=!0,fn.prototype.getPoint=function(e){if(1===e)return this.v2.clone();var t=this.v2.clone().sub(this.v1);return t.multiplyScalar(e).add(this.v1),t},fn.prototype.getPointAt=function(e){return this.getPoint(e)},fn.prototype.getTangent=function(e){return this.v2.clone().sub(this.v1).normalize()},dn.prototype=Object.assign(Object.create(pn.prototype),{constructor:dn,add:function(e){this.curves.push(e)},closePath:function(){var e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new fn(t,e))},getPoint:function(e){var t=e*this.getLength(),r=this.getCurveLengths();for(e=0;e<r.length;){if(r[e]>=t)return t=r[e]-t,e=this.curves[e],r=e.getLength(),e.getPointAt(0===r?0:1-t/r);e++}return null},getLength:function(){var e=this.getCurveLengths();return e[e.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var e=[],t=0,r=0,n=this.curves.length;r<n;r++)t+=this.curves[r].getLength(),e.push(t);return this.cacheLengths=e},getSpacedPoints:function(e){void 0===e&&(e=40);for(var t=[],r=0;r<=e;r++)t.push(this.getPoint(r/e));return this.autoClose&&t.push(t[0]),t},getPoints:function(e){e=e||12;for(var t,r=[],n=0,i=this.curves;n<i.length;n++)for(var o=i[n],o=o.getPoints(o&&o.isEllipseCurve?2*e:o&&o.isLineCurve?1:o&&o.isSplineCurve?e*o.points.length:e),a=0;a<o.length;a++){var s=o[a];t&&t.equals(s)||(r.push(s),t=s)}return this.autoClose&&1<r.length&&!r[r.length-1].equals(r[0])&&r.push(r[0]),r},createPointsGeometry:function(e){return e=this.getPoints(e),this.createGeometry(e)},createSpacedPointsGeometry:function(e){return e=this.getSpacedPoints(e),this.createGeometry(e)},createGeometry:function(e){for(var t=new he,r=0,n=e.length;r<n;r++){var i=e[r];t.vertices.push(new c(i.x,i.y,i.z||0))}return t}}),mn.prototype=Object.create(pn.prototype),mn.prototype.constructor=mn,mn.prototype.isEllipseCurve=!0,mn.prototype.getPoint=function(e){for(var t=2*Math.PI,n=this.aEndAngle-this.aStartAngle,i=Math.abs(n)<Number.EPSILON;0>n;)n+=t;for(;n>t;)n-=t;n<Number.EPSILON&&(n=i?0:t),!0!==this.aClockwise||i||(n=n===t?-t:n-t),t=this.aStartAngle+e*n,e=this.aX+this.xRadius*Math.cos(t);var o=this.aY+this.yRadius*Math.sin(t);return 0!==this.aRotation&&(t=Math.cos(this.aRotation),n=Math.sin(this.aRotation),i=e-this.aX,o-=this.aY,e=i*t-o*n+this.aX,o=i*n+o*t+this.aY),new r(e,o)},(vn.prototype=Object.create(pn.prototype)).constructor=vn,vn.prototype.isSplineCurve=!0,vn.prototype.getPoint=function(e){var t=(t=((a=this.points).length-1)*e)-(e=Math.floor(t)),n=a[0===e?e:e-1],i=a[e],o=a[e>a.length-2?a.length-1:e+1],a=a[e>a.length-3?a.length-1:e+2];return new r(un(t,n.x,i.x,o.x,a.x),un(t,n.y,i.y,o.y,a.y))},(gn.prototype=Object.create(pn.prototype)).constructor=gn,gn.prototype.getPoint=function(e){var t=this.v0,n=this.v1,i=this.v2,o=this.v3;return new r(ln(e,t.x,n.x,i.x,o.x),ln(e,t.y,n.y,i.y,o.y))},(yn.prototype=Object.create(pn.prototype)).constructor=yn,yn.prototype.getPoint=function(e){var t=this.v0,n=this.v1,i=this.v2;return new r(hn(e,t.x,n.x,i.x),hn(e,t.y,n.y,i.y))};var Ki=Object.assign(Object.create(dn.prototype),{fromPoints:function(e){this.moveTo(e[0].x,e[0].y);for(var t=1,r=e.length;t<r;t++)this.lineTo(e[t].x,e[t].y)},moveTo:function(e,t){this.currentPoint.set(e,t)},lineTo:function(e,t){var n=new fn(this.currentPoint.clone(),new r(e,t));this.curves.push(n),this.currentPoint.set(e,t)},quadraticCurveTo:function(e,t,n,i){e=new yn(this.currentPoint.clone(),new r(e,t),new r(n,i)),this.curves.push(e),this.currentPoint.set(n,i)},bezierCurveTo:function(e,t,n,i,o,a){e=new gn(this.currentPoint.clone(),new r(e,t),new r(n,i),new r(o,a)),this.curves.push(e),this.currentPoint.set(o,a)},splineThru:function(e){var t=new vn(t=[this.currentPoint.clone()].concat(e));this.curves.push(t),this.currentPoint.copy(e[e.length-1])},arc:function(e,t,r,n,i,o){this.absarc(e+this.currentPoint.x,t+this.currentPoint.y,r,n,i,o)},absarc:function(e,t,r,n,i,o){this.absellipse(e,t,r,r,n,i,o)},ellipse:function(e,t,r,n,i,o,a,s){this.absellipse(e+this.currentPoint.x,t+this.currentPoint.y,r,n,i,o,a,s)},absellipse:function(e,t,r,n,i,o,a,s){e=new mn(e,t,r,n,i,o,a,s),0<this.curves.length&&((t=e.getPoint(0)).equals(this.currentPoint)||this.lineTo(t.x,t.y)),this.curves.push(e),e=e.getPoint(1),this.currentPoint.copy(e)}});bn.prototype=Ki,Ki.constructor=bn,_n.prototype=Object.assign(Object.create(Ki),{constructor:_n,getPointsHoles:function(e){for(var t=[],r=0,n=this.holes.length;r<n;r++)t[r]=this.holes[r].getPoints(e);return t},extractAllPoints:function(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}},extractPoints:function(e){return this.extractAllPoints(e)}}),Object.assign(xn.prototype,{moveTo:function(e,t){this.currentPath=new bn,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,t)},lineTo:function(e,t){this.currentPath.lineTo(e,t)},quadraticCurveTo:function(e,t,r,n){this.currentPath.quadraticCurveTo(e,t,r,n)},bezierCurveTo:function(e,t,r,n,i,o){this.currentPath.bezierCurveTo(e,t,r,n,i,o)},splineThru:function(e){this.currentPath.splineThru(e)},toShapes:function(e,t){function r(e){for(var t=[],r=0,n=e.length;r<n;r++){var i=e[r],o=new _n;o.curves=i.curves,t.push(o)}return t}var n=Fi.isClockWise,i=this.subPaths;if(0===i.length)return[];if(!0===t)return r(i);var o,a,s,c=[];if(1===i.length)return a=i[0],s=new _n,s.curves=a.curves,c.push(s),c;var u=!n(i[0].getPoints()),u=e?!u:u;s=[];var h,l=[],p=[],f=0;l[f]=void 0,p[f]=[];for(var d=0,m=i.length;d<m;d++)a=i[d],h=a.getPoints(),o=n(h),(o=e?!o:o)?(!u&&l[f]&&f++,l[f]={s:new _n,p:h},l[f].s.curves=a.curves,u&&f++,p[f]=[]):p[f].push({h:a,p:h[0]});if(!l[0])return r(i);if(1<l.length){for(d=!1,a=[],n=0,i=l.length;n<i;n++)s[n]=[];for(n=0,i=l.length;n<i;n++)for(o=p[n],u=0;u<o.length;u++){for(f=o[u],h=!0,m=0;m<l.length;m++)(function(e,t){for(var r=t.length,n=!1,i=r-1,o=0;o<r;i=o++){var a=t[i],s=t[o],c=s.x-a.x,u=s.y-a.y;if(Math.abs(u)>Number.EPSILON){if(0>u&&(a=t[o],c=-c,s=t[i],u=-u),!(e.y<a.y||e.y>s.y))if(e.y===a.y){if(e.x===a.x)return!0}else{if(0==(i=u*(e.x-a.x)-c*(e.y-a.y)))return!0;0>i||(n=!n)}}else if(e.y===a.y&&(s.x<=e.x&&e.x<=a.x||a.x<=e.x&&e.x<=s.x))return!0}return n})(f.p,l[m].p)&&(n!==m&&a.push({froms:n,tos:m,hole:u}),h?(h=!1,s[m].push(f)):d=!0);h&&s[n].push(f)}0<a.length&&(d||(p=s))}for(d=0,n=l.length;d<n;d++)for(s=l[d].s,c.push(s),a=p[d],i=0,o=a.length;i<o;i++)s.holes.push(a[i].h);return c}}),Object.assign(wn.prototype,{isFont:!0,generateShapes:function(e,t,r){void 0===t&&(t=100),void 0===r&&(r=4);var n=this.data;e=String(e).split("");var i=t/n.resolution,o=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*i,a=0,s=0;t=[];for(var c=0;c<e.length;c++){var u=e[c];if("\n"===u)a=0,s-=o;else{var h;h=i;var l=a,p=s;if(u=n.glyphs[u]||n.glyphs["?"]){var f,d,m,v,g,y,b,_,x=new xn,w=[];if(u.o)for(var S=u._cachedOutline||(u._cachedOutline=u.o.split(" ")),M=0,E=S.length;M<E;)switch(S[M++]){case"m":f=S[M++]*h+l,d=S[M++]*h+p,x.moveTo(f,d);break;case"l":f=S[M++]*h+l,d=S[M++]*h+p,x.lineTo(f,d);break;case"q":if(f=S[M++]*h+l,d=S[M++]*h+p,g=S[M++]*h+l,y=S[M++]*h+p,x.quadraticCurveTo(g,y,f,d),v=w[w.length-1]){m=v.x,v=v.y;for(var C=1;C<=r;C++){var T=C/r;hn(T,m,g,f),hn(T,v,y,d)}}break;case"b":if(f=S[M++]*h+l,d=S[M++]*h+p,g=S[M++]*h+l,y=S[M++]*h+p,b=S[M++]*h+l,_=S[M++]*h+p,x.bezierCurveTo(g,y,b,_,f,d),v=w[w.length-1])for(m=v.x,v=v.y,C=1;C<=r;C++)T=C/r,ln(T,m,g,b,f),ln(T,v,y,_,d)}h={offsetX:u.ha*h,path:x}}else h=void 0;a+=h.offsetX,t.push(h.path)}}for(r=[],n=0,e=t.length;n<e;n++)Array.prototype.push.apply(r,t[n].toShapes());return r}}),Object.assign(Sn.prototype,{load:function(e,t,r,n){var i=this;new Tr(this.manager).load(e,function(e){var r;try{r=JSON.parse(e)}catch(t){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),r=JSON.parse(e.substring(65,e.length-2))}e=i.parse(r),t&&t(e)},r,n)},parse:function(e){return new wn(e)}});var Zi,Ji={getContext:function(){return void 0===Zi&&(Zi=new(window.AudioContext||window.webkitAudioContext)),Zi},setContext:function(e){Zi=e}};Object.assign(Mn.prototype,{load:function(e,t,r,n){var i=new Tr(this.manager);i.setResponseType("arraybuffer"),i.load(e,function(e){Ji.getContext().decodeAudioData(e,function(e){t(e)})},r,n)}}),Object.assign(En.prototype,{update:function(){var e,t,r,n,i,o,a,s,c=new u,h=new u;return function(u){if(e!==this||t!==u.focus||r!==u.fov||n!==u.aspect*this.aspect||i!==u.near||o!==u.far||a!==u.zoom||s!==this.eyeSep){e=this,t=u.focus,r=u.fov,n=u.aspect*this.aspect,i=u.near,o=u.far,a=u.zoom;var l,p,f=u.projectionMatrix.clone(),d=(s=this.eyeSep/2)*i/t,m=i*Math.tan(xi.DEG2RAD*r*.5)/a;h.elements[12]=-s,c.elements[12]=s,l=-m*n+d,p=m*n+d,f.elements[0]=2*i/(p-l),f.elements[8]=(p+l)/(p-l),this.cameraL.projectionMatrix.copy(f),l=-m*n-d,p=m*n-d,f.elements[0]=2*i/(p-l),f.elements[8]=(p+l)/(p-l),this.cameraR.projectionMatrix.copy(f)}this.cameraL.matrixWorld.copy(u.matrixWorld).multiply(h),this.cameraR.matrixWorld.copy(u.matrixWorld).multiply(c)}}()}),(Cn.prototype=Object.create(oe.prototype)).constructor=Cn,Tn.prototype=Object.assign(Object.create(oe.prototype),{constructor:Tn,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(e){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(e){this.gain.gain.value=e},updateMatrixWorld:function(){var e=new c,t=new s,r=new c,n=new c;return function(i){oe.prototype.updateMatrixWorld.call(this,i),i=this.context.listener;var o=this.up;this.matrixWorld.decompose(e,t,r),n.set(0,0,-1).applyQuaternion(t),i.positionX?(i.positionX.setValueAtTime(e.x,this.context.currentTime),i.positionY.setValueAtTime(e.y,this.context.currentTime),i.positionZ.setValueAtTime(e.z,this.context.currentTime),i.forwardX.setValueAtTime(n.x,this.context.currentTime),i.forwardY.setValueAtTime(n.y,this.context.currentTime),i.forwardZ.setValueAtTime(n.z,this.context.currentTime),i.upX.setValueAtTime(o.x,this.context.currentTime),i.upY.setValueAtTime(o.y,this.context.currentTime),i.upZ.setValueAtTime(o.z,this.context.currentTime)):(i.setPosition(e.x,e.y,e.z),i.setOrientation(n.x,n.y,n.z,o.x,o.y,o.z))}}()}),On.prototype=Object.assign(Object.create(oe.prototype),{constructor:On,getOutput:function(){return this.gain},setNodeSource:function(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this},setBuffer:function(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else{if(!1!==this.hasPlaybackControl){var e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.onended=this.onEnded.bind(this),e.playbackRate.setValueAtTime(this.playbackRate,this.startTime),e.start(0,this.startTime),this.isPlaying=!0,this.source=e,this.connect()}console.warn("THREE.Audio: this Audio has no playback control.")}},pause:function(){if(!1!==this.hasPlaybackControl)return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},stop:function(){if(!1!==this.hasPlaybackControl)return this.source.stop(),this.startTime=0,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(e){return e||(e=[]),!0===this.isPlaying?(this.disconnect(),this.filters=e,this.connect()):this.filters=e,this},getFilter:function(){return this.getFilters()[0]},setFilter:function(e){return this.setFilters(e?[e]:[])},setPlaybackRate:function(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this;console.warn("THREE.Audio: this Audio has no playback control.")},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")},getVolume:function(){return this.gain.gain.value},setVolume:function(e){return this.gain.gain.value=e,this}}),Pn.prototype=Object.assign(Object.create(On.prototype),{constructor:Pn,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(e){this.panner.refDistance=e},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(e){this.panner.rolloffFactor=e},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(e){this.panner.distanceModel=e},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(e){this.panner.maxDistance=e},updateMatrixWorld:function(){var e=new c;return function(t){oe.prototype.updateMatrixWorld.call(this,t),e.setFromMatrixPosition(this.matrixWorld),this.panner.setPosition(e.x,e.y,e.z)}}()}),Object.assign(jn.prototype,{getFrequencyData:function(){return this.analyser.getByteFrequencyData(this.data),this.data},getAverageFrequency:function(){for(var e=0,t=this.getFrequencyData(),r=0;r<t.length;r++)e+=t[r];return e/t.length}}),Object.assign(An.prototype,{accumulate:function(e,t){var r=this.buffer,n=this.valueSize,i=e*n+n,o=this.cumulativeWeight;if(0===o){for(o=0;o!==n;++o)r[i+o]=r[o];o=t}else o+=t,this._mixBufferRegion(r,i,0,t/o,n);this.cumulativeWeight=o},apply:function(e){var t=this.valueSize,r=this.buffer;e=e*t+t;var n=this.cumulativeWeight,i=this.binding;this.cumulativeWeight=0,1>n&&this._mixBufferRegion(r,e,3*t,1-n,t);for(var n=t,o=t+t;n!==o;++n)if(r[n]!==r[n+t]){i.setValue(r,e);break}},saveOriginalState:function(){var e=this.buffer,t=this.valueSize,r=3*t;this.binding.getValue(e,r);for(var n=t;n!==r;++n)e[n]=e[r+n%t];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(e,t,r,n,i){if(.5<=n)for(n=0;n!==i;++n)e[t+n]=e[r+n]},_slerp:function(e,t,r,n){s.slerpFlat(e,t,e,t,e,r,n)},_lerp:function(e,t,r,n,i){for(var o=1-n,a=0;a!==i;++a){var s=t+a;e[s]=e[s]*o+e[r+a]*n}}}),Object.assign(Rn.prototype,{getValue:function(e,t){this.bind();var r=this._bindings[this._targetGroup.nCachedObjects_];void 0!==r&&r.getValue(e,t)},setValue:function(e,t){for(var r=this._bindings,n=this._targetGroup.nCachedObjects_,i=r.length;n!==i;++n)r[n].setValue(e,t)},bind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,r=e.length;t!==r;++t)e[t].bind()},unbind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,r=e.length;t!==r;++t)e[t].unbind()}}),Object.assign(Ln,{Composite:Rn,create:function(e,t,r){return e&&e.isAnimationObjectGroup?new Ln.Composite(e,t,r):new Ln(e,t,r)},sanitizeNodeName:function(e){return e.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var e=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),t=["material","materials","bones"];return function(r){var n=e.exec(r);if(!n)throw Error("PropertyBinding: Cannot parse trackName: "+r);var i=(n={nodeName:n[2],objectName:n[3],objectIndex:n[4],propertyName:n[5],propertyIndex:n[6]}).nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){var o=n.nodeName.substring(i+1);-1!==t.indexOf(o)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=o)}if(null===n.propertyName||0===n.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+r);return n}}(),findNode:function(e,t){if(!t||""===t||"root"===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){var r=function(e){for(var r=0;r<e.bones.length;r++){var n=e.bones[r];if(n.name===t)return n}return null}(e.skeleton);if(r)return r}if(e.children){var n=function(e){for(var r=0;r<e.length;r++){var i=e[r];if(i.name===t||i.uuid===t||(i=n(i.children)))return i}return null};if(r=n(e.children))return r}return null}}),Object.assign(Ln.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(e,t){e[t]=this.node[this.propertyName]},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)e[t++]=r[n]},function(e,t){e[t]=this.resolvedProperty[this.propertyIndex]},function(e,t){this.resolvedProperty.toArray(e,t)}],SetterByBindingTypeAndVersioning:[[function(e,t){this.node[this.propertyName]=e[t]},function(e,t){this.node[this.propertyName]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.node[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++]},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++];this.targetObject.needsUpdate=!0},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty[this.propertyIndex]=e[t]},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty.fromArray(e,t)},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(e,t){this.bind(),this.getValue(e,t)},setValue:function(e,t){this.bind(),this.setValue(e,t)},bind:function(){var e=this.node,t=this.parsedPath,r=t.objectName,n=t.propertyName,i=t.propertyIndex;if(e||(this.node=e=Ln.findNode(this.rootNode,t.nodeName)||this.rootNode),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,e){if(r){var o=t.objectIndex;switch(r){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);for(e=e.skeleton.bones,r=0;r<e.length;r++)if(e[r].name===o){o=r;break}break;default:if(void 0===e[r])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[r]}if(void 0!==o){if(void 0===e[o])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[o]}}if(void 0===(o=e[n]))console.error("THREE.PropertyBinding: Trying to update property for track: "+t.nodeName+"."+n+" but it wasn't found.",e);else{if(t=this.Versioning.None,void 0!==e.needsUpdate?(t=this.Versioning.NeedsUpdate,this.targetObject=e):void 0!==e.matrixWorldNeedsUpdate&&(t=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=e),r=this.BindingType.Direct,void 0!==i){if("morphTargetInfluences"===n){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(e.geometry.isBufferGeometry){if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);for(r=0;r<this.node.geometry.morphAttributes.position.length;r++)if(e.geometry.morphAttributes.position[r].name===i){i=r;break}}else{if(!e.geometry.morphTargets)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);for(r=0;r<this.node.geometry.morphTargets.length;r++)if(e.geometry.morphTargets[r].name===i){i=r;break}}}r=this.BindingType.ArrayElement,this.resolvedProperty=o,this.propertyIndex=i}else void 0!==o.fromArray&&void 0!==o.toArray?(r=this.BindingType.HasFromToArray,this.resolvedProperty=o):Array.isArray(o)?(r=this.BindingType.EntireArray,this.resolvedProperty=o):this.propertyName=n;this.getValue=this.GetterByBindingType[r],this.setValue=this.SetterByBindingTypeAndVersioning[r][t]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(Ln.prototype,{_getValue_unbound:Ln.prototype.getValue,_setValue_unbound:Ln.prototype.setValue}),Object.assign(Nn.prototype,{isAnimationObjectGroup:!0,add:function(e){for(var t=this._objects,r=t.length,n=this.nCachedObjects_,i=this._indicesByUUID,o=this._paths,a=this._parsedPaths,s=this._bindings,c=s.length,u=0,h=arguments.length;u!==h;++u){var l=arguments[u],p=i[f=l.uuid];if(void 0===p){p=r++,i[f]=p,t.push(l);for(var f=0,d=c;f!==d;++f)s[f].push(new Ln(l,o[f],a[f]))}else if(p<n){var m=--n;for(i[(d=t[m]).uuid]=p,t[p]=d,i[f]=m,t[m]=l,f=0,d=c;f!==d;++f){var v=s[f],g=v[p];v[p]=v[m],void 0===g&&(g=new Ln(l,o[f],a[f])),v[m]=g}}else void 0!==t[p]&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=n},remove:function(e){for(var t=this._objects,r=this.nCachedObjects_,n=this._indicesByUUID,i=this._bindings,o=i.length,a=0,s=arguments.length;a!==s;++a){var c=arguments[a],u=c.uuid,h=n[u];if(void 0!==h&&h>=r){var l=r++,p=t[l];for(n[p.uuid]=h,t[h]=p,n[u]=l,t[l]=c,c=0,u=o;c!==u;++c){var f=(p=i[c])[h];p[h]=p[l],p[l]=f}}}this.nCachedObjects_=r},uncache:function(e){for(var t=this._objects,r=t.length,n=this.nCachedObjects_,i=this._indicesByUUID,o=this._bindings,a=o.length,s=0,c=arguments.length;s!==c;++s){var u=arguments[s].uuid,h=i[u];if(void 0!==h)if(delete i[u],h<n){var l=t[u=--n],p=--r,f=t[p];for(i[l.uuid]=h,t[h]=l,i[f.uuid]=u,t[u]=f,t.pop(),l=0,f=a;l!==f;++l){var d=o[l],m=d[p];d[h]=d[u],d[u]=m,d.pop()}}else for(p=--r,f=t[p],i[f.uuid]=h,t[h]=f,t.pop(),l=0,f=a;l!==f;++l)d=o[l],d[h]=d[p],d.pop()}this.nCachedObjects_=n},subscribe_:function(e,t){var r=this._bindingsIndicesByPath,n=r[e],i=this._bindings;if(void 0!==n)return i[n];var o=this._paths,a=this._parsedPaths,s=this._objects,c=this.nCachedObjects_,u=Array(s.length),n=i.length;for(r[e]=n,o.push(e),a.push(t),i.push(u),r=c,n=s.length;r!==n;++r)u[r]=new Ln(s[r],e,t);return u},unsubscribe_:function(e){var t=this._bindingsIndicesByPath,r=t[e];if(void 0!==r){var n=this._paths,i=this._parsedPaths,o=this._bindings,a=o.length-1,s=o[a];t[e[a]]=r,o[r]=s,o.pop(),i[r]=i[a],i.pop(),n[r]=n[a],n.pop()}}}),Object.assign(In.prototype,{play:function(){return this._mixer._activateAction(this),this},stop:function(){return this._mixer._deactivateAction(this),this.reset()},reset:function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(e){return this._startTime=e,this},setLoop:function(e,t){return this.loop=e,this.repetitions=t,this},setEffectiveWeight:function(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(e){return this._scheduleFading(e,0,1)},fadeOut:function(e){return this._scheduleFading(e,1,0)},crossFadeFrom:function(e,t,r){if(e.fadeOut(t),this.fadeIn(t),r){r=this._clip.duration;var n=e._clip.duration,i=r/n;e.warp(1,n/r,t),this.warp(i,1,t)}return this},crossFadeTo:function(e,t,r){return e.crossFadeFrom(this,t,r)},stopFading:function(){var e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},setEffectiveTimeScale:function(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(e){return this.timeScale=this._clip.duration/e,this.stopWarping()},syncWith:function(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()},halt:function(e){return this.warp(this._effectiveTimeScale,0,e)},warp:function(e,t,r){var n=this._mixer,i=n.time,o=this._timeScaleInterpolant,a=this.timeScale;return null===o&&(this._timeScaleInterpolant=o=n._lendControlInterpolant()),n=o.parameterPositions,o=o.sampleValues,n[0]=i,n[1]=i+r,o[0]=e/a,o[1]=t/a,this},stopWarping:function(){var e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(e,t,r,n){if(this.enabled){if(null!==(i=this._startTime)){if(0>(t=(e-i)*r)||0===r)return;this._startTime=null,t*=r}if(t*=this._updateTimeScale(e),r=this._updateTime(t),0<(e=this._updateWeight(e))){t=this._interpolants;for(var i=this._propertyBindings,o=0,a=t.length;o!==a;++o)t[o].evaluate(r),i[o].accumulate(n,e)}}else this._updateWeight(e)},_updateWeight:function(e){t=0;if(this.enabled){var t=this.weight,r=this._weightInterpolant;if(null!==r){var n=r.evaluate(e)[0],t=t*n;e>r.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=t},_updateTimeScale:function(e){t=0;if(!this.paused){var t=this.timeScale,r=this._timeScaleInterpolant;if(null!==r){t=t*r.evaluate(e)[0];e>r.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}}return this._effectiveTimeScale=t},_updateTime:function(e){o=this.time+e;if(0===e)return o;var t=this._clip.duration,r=this.loop,n=this._loopCount;if(2200===r)e:{if(-1===n&&(this._loopCount=0,this._setEndings(!0,!0,!1)),o>=t)o=t;else{if(!(0>o))break e;o=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this._mixer.dispatchEvent({type:"finished",action:this,direction:0>e?-1:1})}else{if(r=2202===r,-1===n&&(0<=e?(n=0,this._setEndings(!0,0===this.repetitions,r)):this._setEndings(0===this.repetitions,!0,r)),o>=t||0>o){var i=Math.floor(o/t),o=o-t*i,n=n+Math.abs(i),a=this.repetitions-n;0>a?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,o=0<e?t:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<e?1:-1})):(0===a?(e=0>e,this._setEndings(e,!e,r)):this._setEndings(!1,!1,r),this._loopCount=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i}))}if(r&&1==(1&n))return this.time=o,t-o}return this.time=o},_setEndings:function(e,t,r){var n=this._interpolantSettings;r?(n.endingStart=2401,n.endingEnd=2401):(n.endingStart=e?this.zeroSlopeAtStart?2401:2400:2402,n.endingEnd=t?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(e,t,r){var n=this._mixer,i=n.time,o=this._weightInterpolant;return null===o&&(this._weightInterpolant=o=n._lendControlInterpolant()),n=o.parameterPositions,o=o.sampleValues,n[0]=i,o[0]=t,n[1]=i+e,o[1]=r,this}}),Object.assign(Dn.prototype,t.prototype,{_bindAction:function(e,t){var r=e._localRoot||this._root,n=e._clip.tracks,i=n.length,o=e._propertyBindings,a=e._interpolants,s=r.uuid,c=this._bindingsByRootAndName,u=c[s];for(void 0===u&&(u={},c[s]=u),c=0;c!==i;++c){var h=n[c],l=h.name,p=u[l];if(void 0===p){if(void 0!==(p=o[c])){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,s,l));continue}++(p=new An(Ln.create(r,l,t&&t._propertyBindings[c].binding.parsedPath),h.ValueTypeName,h.getValueSize())).referenceCount,this._addInactiveBinding(p,s,l)}o[c]=p,a[c].resultBuffer=p.buffer}},_activateAction:function(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){var t=(e._localRoot||this._root).uuid,r=e._clip.uuid,n=this._actionsByClip[r];this._bindAction(e,n&&n.knownActions[0]),this._addInactiveAction(e,r,t)}for(r=0,n=(t=e._propertyBindings).length;r!==n;++r){var i=t[r];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(e)}},_deactivateAction:function(e){if(this._isActiveAction(e)){for(var t=e._propertyBindings,r=0,n=t.length;r!==n;++r){var i=t[r];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(e)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}},_isActiveAction:function(e){return null!==(e=e._cacheIndex)&&e<this._nActiveActions},_addInactiveAction:function(e,t,r){var n=this._actions,i=this._actionsByClip,o=i[t];void 0===o?(o={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,i[t]=o):(t=o.knownActions,e._byClipCacheIndex=t.length,t.push(e)),e._cacheIndex=n.length,n.push(e),o.actionByRoot[r]=e},_removeInactiveAction:function(e){var t=(n=this._actions)[n.length-1],r=e._cacheIndex;t._cacheIndex=r,n[r]=t,n.pop(),e._cacheIndex=null;var n=e._clip.uuid,i=(r=(t=this._actionsByClip)[n]).knownActions,o=i[i.length-1],a=e._byClipCacheIndex;o._byClipCacheIndex=a,i[a]=o,i.pop(),e._byClipCacheIndex=null,delete r.actionByRoot[(e._localRoot||this._root).uuid],0===i.length&&delete t[n],this._removeInactiveBindingsForAction(e)},_removeInactiveBindingsForAction:function(e){for(var t=0,r=(e=e._propertyBindings).length;t!==r;++t){var n=e[t];0==--n.referenceCount&&this._removeInactiveBinding(n)}},_lendAction:function(e){var t=this._actions,r=e._cacheIndex,n=this._nActiveActions++,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_takeBackAction:function(e){var t=this._actions,r=e._cacheIndex,n=--this._nActiveActions,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_addInactiveBinding:function(e,t,r){var n=this._bindingsByRootAndName,i=n[t],o=this._bindings;void 0===i&&(i={},n[t]=i),i[r]=e,e._cacheIndex=o.length,o.push(e)},_removeInactiveBinding:function(e){var t=this._bindings,r=(n=e.binding).rootNode.uuid,n=n.path,i=this._bindingsByRootAndName,o=i[r],a=t[t.length-1];e=e._cacheIndex,a._cacheIndex=e,t[e]=a,t.pop(),delete o[n];e:{for(var s in o)break e;delete i[r]}},_lendBinding:function(e){var t=this._bindings,r=e._cacheIndex,n=this._nActiveBindings++,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_takeBackBinding:function(e){var t=this._bindings,r=e._cacheIndex,n=--this._nActiveBindings,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_lendControlInterpolant:function(){var e=this._controlInterpolants,t=this._nActiveControlInterpolants++,r=e[t];return void 0===r&&(r=new Hr(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),r.__cacheIndex=t,e[t]=r),r},_takeBackControlInterpolant:function(e){var t=this._controlInterpolants,r=e.__cacheIndex,n=--this._nActiveControlInterpolants,i=t[n];e.__cacheIndex=n,t[n]=e,i.__cacheIndex=r,t[r]=i},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(e,t){var r=(i=t||this._root).uuid,n="string"==typeof e?rn.findByName(i,e):e,i=null!==n?n.uuid:e,o=this._actionsByClip[i],a=null;if(void 0!==o){if(void 0!==(a=o.actionByRoot[r]))return a;a=o.knownActions[0],null===n&&(n=a._clip)}return null===n?null:(n=new In(this,n,t),this._bindAction(n,a),this._addInactiveAction(n,i,r),n)},existingAction:function(e,t){var r=(n=t||this._root).uuid,n="string"==typeof e?rn.findByName(n,e):e;return void 0!==(n=this._actionsByClip[n?n.uuid:e])?n.actionByRoot[r]||null:null},stopAllAction:function(){for(var e=this._actions,t=this._nActiveActions,r=this._bindings,n=this._nActiveBindings,i=this._nActiveBindings=this._nActiveActions=0;i!==t;++i)e[i].reset();for(i=0;i!==n;++i)r[i].useCount=0;return this},update:function(e){e*=this.timeScale;for(var t=this._actions,r=this._nActiveActions,n=this.time+=e,i=Math.sign(e),o=this._accuIndex^=1,a=0;a!==r;++a)t[a]._update(n,e,i,o);for(e=this._bindings,t=this._nActiveBindings,a=0;a!==t;++a)e[a].apply(o);return this},getRoot:function(){return this._root},uncacheClip:function(e){var t=this._actions;e=e.uuid;var r=this._actionsByClip,n=r[e];if(void 0!==n){for(var i=0,o=(n=n.knownActions).length;i!==o;++i){var a=n[i];this._deactivateAction(a);var s=a._cacheIndex,c=t[t.length-1];a._cacheIndex=null,a._byClipCacheIndex=null,c._cacheIndex=s,t[s]=c,t.pop(),this._removeInactiveBindingsForAction(a)}delete r[e]}},uncacheRoot:function(e){e=e.uuid;var t,r=this._actionsByClip;for(t in r){var n=r[t].actionByRoot[e];void 0!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}if(void 0!==(t=this._bindingsByRootAndName[e]))for(var i in t)(e=t[i]).restoreOriginalState(),this._removeInactiveBinding(e)},uncacheAction:function(e,t){var r=this.existingAction(e,t);null!==r&&(this._deactivateAction(r),this._removeInactiveAction(r))}}),kn.prototype.clone=function(){return new kn(void 0===this.value.clone?this.value:this.value.clone())},Bn.prototype=Object.assign(Object.create(Se.prototype),{constructor:Bn,isInstancedBufferGeometry:!0,addGroup:function(e,t,r){this.groups.push({start:e,count:t,materialIndex:r})},copy:function(e){null!==(r=e.index)&&this.setIndex(r.clone());var t,r=e.attributes;for(t in r)this.addAttribute(t,r[t].clone());for(t=0,r=(e=e.groups).length;t<r;t++){var n=e[t];this.addGroup(n.start,n.count,n.materialIndex)}return this}}),Object.defineProperties(Fn.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}}),Object.assign(Fn.prototype,{isInterleavedBufferAttribute:!0,setX:function(e,t){return this.data.array[e*this.data.stride+this.offset]=t,this},setY:function(e,t){return this.data.array[e*this.data.stride+this.offset+1]=t,this},setZ:function(e,t){return this.data.array[e*this.data.stride+this.offset+2]=t,this},setW:function(e,t){return this.data.array[e*this.data.stride+this.offset+3]=t,this},getX:function(e){return this.data.array[e*this.data.stride+this.offset]},getY:function(e){return this.data.array[e*this.data.stride+this.offset+1]},getZ:function(e){return this.data.array[e*this.data.stride+this.offset+2]},getW:function(e){return this.data.array[e*this.data.stride+this.offset+3]},setXY:function(e,t,r){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this},setXYZ:function(e,t,r,n){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this.data.array[e+2]=n,this},setXYZW:function(e,t,r,n,i){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this.data.array[e+2]=n,this.data.array[e+3]=i,this}}),Object.defineProperty(Un.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(Un.prototype,{isInterleavedBuffer:!0,setArray:function(e){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==e?e.length/this.stride:0,this.array=e},setDynamic:function(e){return this.dynamic=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.dynamic=e.dynamic,this},copyAt:function(e,t,r){e*=this.stride,r*=t.stride;for(var n=0,i=this.stride;n<i;n++)this.array[e+n]=t.array[r+n];return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(e){return this.onUploadCallback=e,this}}),zn.prototype=Object.assign(Object.create(Un.prototype),{constructor:zn,isInstancedInterleavedBuffer:!0,copy:function(e){return Un.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this}}),$n.prototype=Object.assign(Object.create(le.prototype),{constructor:$n,isInstancedBufferAttribute:!0,copy:function(e){return le.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this}}),Object.assign(Vn.prototype,{linePrecision:1,set:function(e,t){this.ray.set(e,t)},setFromCamera:function(e,t){t&&t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize()):t&&t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(e,t){var r=[];return Hn(e,this,r,t),r.sort(Gn),r},intersectObjects:function(e,t){var r=[];if(!1===Array.isArray(e))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),r;for(var n=0,i=e.length;n<i;n++)Hn(e[n],this,r,t);return r.sort(Gn),r}}),Object.assign(qn.prototype,{start:function(){this.oldTime=this.startTime=("undefined"==typeof performance?Date:performance).now(),this.elapsedTime=0,this.running=!0},stop:function(){this.getElapsedTime(),this.autoStart=this.running=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var e=("undefined"==typeof performance?Date:performance).now(),t=(e-this.oldTime)/1e3;this.oldTime=e,this.elapsedTime+=t}return t}}),Object.assign(Wn.prototype,{set:function(e,t,r){return this.radius=e,this.phi=t,this.theta=r,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.phi=e.phi,this.theta=e.theta,this},makeSafe:function(){return this.phi=Math.max(1e-6,Math.min(Math.PI-1e-6,this.phi)),this},setFromVector3:function(e){return this.radius=e.length(),0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(e.x,e.z),this.phi=Math.acos(xi.clamp(e.y/this.radius,-1,1))),this}}),Object.assign(Xn.prototype,{set:function(e,t,r){return this.radius=e,this.theta=t,this.y=r,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.theta=e.theta,this.y=e.y,this},setFromVector3:function(e){return this.radius=Math.sqrt(e.x*e.x+e.z*e.z),this.theta=Math.atan2(e.x,e.z),this.y=e.y,this}}),(Yn.prototype=Object.create(Re.prototype)).constructor=Yn,Yn.prototype.createAnimation=function(e,t,r,n){t={start:t,end:r,length:r-t+1,fps:n,duration:(r-t)/n,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1},this.animationsMap[e]=t,this.animationsList.push(t)},Yn.prototype.autoCreateAnimations=function(e){for(var t,r=/([a-z]+)_?(\d+)/i,n={},i=this.geometry,o=0,a=i.morphTargets.length;o<a;o++){var s=i.morphTargets[o].name.match(r);if(s&&1<s.length){var c=s[1];n[c]||(n[c]={start:1/0,end:-1/0}),o<(s=n[c]).start&&(s.start=o),o>s.end&&(s.end=o),t||(t=c)}}for(c in n)s=n[c],this.createAnimation(c,s.start,s.end,e);this.firstAnimation=t},Yn.prototype.setAnimationDirectionForward=function(e){(e=this.animationsMap[e])&&(e.direction=1,e.directionBackwards=!1)},Yn.prototype.setAnimationDirectionBackward=function(e){(e=this.animationsMap[e])&&(e.direction=-1,e.directionBackwards=!0)},Yn.prototype.setAnimationFPS=function(e,t){var r=this.animationsMap[e];r&&(r.fps=t,r.duration=(r.end-r.start)/r.fps)},Yn.prototype.setAnimationDuration=function(e,t){var r=this.animationsMap[e];r&&(r.duration=t,r.fps=(r.end-r.start)/r.duration)},Yn.prototype.setAnimationWeight=function(e,t){var r=this.animationsMap[e];r&&(r.weight=t)},Yn.prototype.setAnimationTime=function(e,t){var r=this.animationsMap[e];r&&(r.time=t)},Yn.prototype.getAnimationTime=function(e){var t=0;return(e=this.animationsMap[e])&&(t=e.time),t},Yn.prototype.getAnimationDuration=function(e){var t=-1;return(e=this.animationsMap[e])&&(t=e.duration),t},Yn.prototype.playAnimation=function(e){var t=this.animationsMap[e];t?(t.time=0,t.active=!0):console.warn("THREE.MorphBlendMesh: animation["+e+"] undefined in .playAnimation()")},Yn.prototype.stopAnimation=function(e){(e=this.animationsMap[e])&&(e.active=!1)},Yn.prototype.update=function(e){for(var t=0,r=this.animationsList.length;t<r;t++){var n=this.animationsList[t];if(n.active){var i=n.duration/n.length;n.time+=n.direction*e,n.mirroredLoop?(n.time>n.duration||0>n.time)&&(n.direction*=-1,n.time>n.duration&&(n.time=n.duration,n.directionBackwards=!0),0>n.time&&(n.time=0,n.directionBackwards=!1)):(n.time%=n.duration,0>n.time&&(n.time+=n.duration));var o=n.start+xi.clamp(Math.floor(n.time/i),0,n.length-1),a=n.weight;o!==n.currentFrame&&(this.morphTargetInfluences[n.lastFrame]=0,this.morphTargetInfluences[n.currentFrame]=1*a,this.morphTargetInfluences[o]=0,n.lastFrame=n.currentFrame,n.currentFrame=o),i=n.time%i/i,n.directionBackwards&&(i=1-i),n.currentFrame!==n.lastFrame?(this.morphTargetInfluences[n.currentFrame]=i*a,this.morphTargetInfluences[n.lastFrame]=(1-i)*a):this.morphTargetInfluences[n.currentFrame]=a}}},(Kn.prototype=Object.create(oe.prototype)).constructor=Kn,Kn.prototype.isImmediateRenderObject=!0,(Zn.prototype=Object.create(Mt.prototype)).constructor=Zn,Zn.prototype.update=function(){var e=new c,t=new c,r=new J;return function(){var n=["a","b","c"];this.object.updateMatrixWorld(!0),r.getNormalMatrix(this.object.matrixWorld);var i=this.object.matrixWorld,o=this.geometry.attributes.position,a=this.object.geometry;if(a&&a.isGeometry)for(var s=a.vertices,c=a.faces,u=a=0,h=c.length;u<h;u++)for(var l=c[u],p=0,f=l.vertexNormals.length;p<f;p++){var d=l.vertexNormals[p];e.copy(s[l[n[p]]]).applyMatrix4(i),t.copy(d).applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),o.setXYZ(a,e.x,e.y,e.z),a+=1,o.setXYZ(a,t.x,t.y,t.z),a+=1}else if(a&&a.isBufferGeometry)for(n=a.attributes.position,s=a.attributes.normal,p=a=0,f=n.count;p<f;p++)e.set(n.getX(p),n.getY(p),n.getZ(p)).applyMatrix4(i),t.set(s.getX(p),s.getY(p),s.getZ(p)),t.applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),o.setXYZ(a,e.x,e.y,e.z),a+=1,o.setXYZ(a,t.x,t.y,t.z),a+=1;o.needsUpdate=!0}}(),(Jn.prototype=Object.create(oe.prototype)).constructor=Jn,Jn.prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},Jn.prototype.update=function(){var e=new c,t=new c;return function(){this.light.updateMatrixWorld();var r=this.light.distance?this.light.distance:1e3,n=r*Math.tan(this.light.angle);this.cone.scale.set(n,n,r),e.setFromMatrixPosition(this.light.matrixWorld),t.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(t.sub(e)),this.cone.material.color.copy(this.light.color)}}(),(ei.prototype=Object.create(Mt.prototype)).constructor=ei,ei.prototype.onBeforeRender=function(){var e=new c,t=new u,r=new u;return function(){var n=this.bones,i=this.geometry,o=i.getAttribute("position");r.getInverse(this.root.matrixWorld);for(var a=0,s=0;a<n.length;a++){var c=n[a];c.parent&&c.parent.isBone&&(t.multiplyMatrices(r,c.matrixWorld),e.setFromMatrixPosition(t),o.setXYZ(s,e.x,e.y,e.z),t.multiplyMatrices(r,c.parent.matrixWorld),e.setFromMatrixPosition(t),o.setXYZ(s+1,e.x,e.y,e.z),s+=2)}i.getAttribute("position").needsUpdate=!0}}(),(ti.prototype=Object.create(Re.prototype)).constructor=ti,ti.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},ti.prototype.update=function(){this.material.color.copy(this.light.color)},(ri.prototype=Object.create(oe.prototype)).constructor=ri,ri.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},ri.prototype.update=function(){var e=this.children[0];e.material.color.copy(this.light.color);var t=.5*this.light.width,r=.5*this.light.height,n=(e=e.geometry.attributes.position).array;n[0]=t,n[1]=-r,n[2]=0,n[3]=t,n[4]=r,n[5]=0,n[6]=-t,n[7]=r,n[8]=0,n[9]=-t,n[10]=-r,n[11]=0,n[12]=t,n[13]=-r,n[14]=0,e.needsUpdate=!0},(ni.prototype=Object.create(oe.prototype)).constructor=ni,ni.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},ni.prototype.update=function(){var e=new c,t=new V,r=new V;return function(){var n=this.children[0],i=n.geometry.getAttribute("color");t.copy(this.light.color),r.copy(this.light.groundColor);for(var o=0,a=i.count;o<a;o++){var s=o<a/2?t:r;i.setXYZ(o,s.r,s.g,s.b)}n.lookAt(e.setFromMatrixPosition(this.light.matrixWorld).negate()),i.needsUpdate=!0}}(),(ii.prototype=Object.create(Mt.prototype)).constructor=ii,(oi.prototype=Object.create(Mt.prototype)).constructor=oi,(ai.prototype=Object.create(Mt.prototype)).constructor=ai,ai.prototype.update=function(){var e=new c,t=new c,r=new J;return function(){this.object.updateMatrixWorld(!0),r.getNormalMatrix(this.object.matrixWorld);for(var n=this.object.matrixWorld,i=this.geometry.attributes.position,o=this.object.geometry,a=o.vertices,s=0,c=0,u=(o=o.faces).length;c<u;c++){var h=o[c],l=h.normal;e.copy(a[h.a]).add(a[h.b]).add(a[h.c]).divideScalar(3).applyMatrix4(n),t.copy(l).applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),i.setXYZ(s,e.x,e.y,e.z),s+=1,i.setXYZ(s,t.x,t.y,t.z),s+=1}i.needsUpdate=!0}}(),(si.prototype=Object.create(oe.prototype)).constructor=si,si.prototype.dispose=function(){var e=this.children[0],t=this.children[1];e.geometry.dispose(),e.material.dispose(),t.geometry.dispose(),t.material.dispose()},si.prototype.update=function(){var e=new c,t=new c,r=new c;return function(){e.setFromMatrixPosition(this.light.matrixWorld),t.setFromMatrixPosition(this.light.target.matrixWorld),r.subVectors(t,e);var n=this.children[0],i=this.children[1];n.lookAt(r),n.material.color.copy(this.light.color),i.lookAt(r),i.scale.z=r.length()}}(),(ci.prototype=Object.create(Mt.prototype)).constructor=ci,ci.prototype.update=function(){function e(e,o,a,s){if(n.set(o,a,s).unproject(i),void 0!==(e=r[e]))for(o=t.getAttribute("position"),a=0,s=e.length;a<s;a++)o.setXYZ(e[a],n.x,n.y,n.z)}var t,r,n=new c,i=new ae;return function(){t=this.geometry,r=this.pointMap,i.projectionMatrix.copy(this.camera.projectionMatrix),e("c",0,0,-1),e("t",0,0,1),e("n1",-1,-1,-1),e("n2",1,-1,-1),e("n3",-1,1,-1),e("n4",1,1,-1),e("f1",-1,-1,1),e("f2",1,-1,1),e("f3",-1,1,1),e("f4",1,1,1),e("u1",.7,1.1,-1),e("u2",-.7,1.1,-1),e("u3",0,2,-1),e("cf1",-1,0,1),e("cf2",1,0,1),e("cf3",0,-1,1),e("cf4",0,1,1),e("cn1",-1,0,-1),e("cn2",1,0,-1),e("cn3",0,-1,-1),e("cn4",0,1,-1),t.getAttribute("position").needsUpdate=!0}}(),(ui.prototype=Object.create(Mt.prototype)).constructor=ui,ui.prototype.update=function(){var e=new K;return function(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&e.setFromObject(this.object),!e.isEmpty()){t=e.min;var r=e.max,n=this.geometry.attributes.position,i=n.array;i[0]=r.x,i[1]=r.y,i[2]=r.z,i[3]=t.x,i[4]=r.y,i[5]=r.z,i[6]=t.x,i[7]=t.y,i[8]=r.z,i[9]=r.x,i[10]=t.y,i[11]=r.z,i[12]=r.x,i[13]=r.y,i[14]=t.z,i[15]=t.x,i[16]=r.y,i[17]=t.z,i[18]=t.x,i[19]=t.y,i[20]=t.z,i[21]=r.x,i[22]=t.y,i[23]=t.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}}}(),ui.prototype.setFromObject=function(e){return this.object=e,this.update(),this};var Qi,eo;(hi.prototype=Object.create(oe.prototype)).constructor=hi,hi.prototype.setDirection=function(){var e,t=new c;return function(r){.99999<r.y?this.quaternion.set(0,0,0,1):-.99999>r.y?this.quaternion.set(1,0,0,0):(t.set(r.z,0,-r.x).normalize(),e=Math.acos(r.y),this.quaternion.setFromAxisAngle(t,e))}}(),hi.prototype.setLength=function(e,t,r){void 0===t&&(t=.2*e),void 0===r&&(r=.2*t),this.line.scale.set(1,Math.max(0,e-t),1),this.line.updateMatrix(),this.cone.scale.set(r,t,r),this.cone.position.y=e,this.cone.updateMatrix()},hi.prototype.setColor=function(e){this.line.material.color.copy(e),this.cone.material.color.copy(e)},(li.prototype=Object.create(Mt.prototype)).constructor=li;var to=new c,ro=new pi,no=new pi,io=new pi;fi.prototype=Object.create(pn.prototype),fi.prototype.constructor=fi,fi.prototype.getPoint=function(e){var t=this.points;e*=(a=t.length)-(this.closed?0:1),e-=s=Math.floor(e),this.closed?s+=0<s?0:(Math.floor(Math.abs(s)/t.length)+1)*t.length:0===e&&s===a-1&&(s=a-2,e=1);var r,n,i;if(this.closed||0<s?r=t[(s-1)%a]:(to.subVectors(t[0],t[1]).add(t[0]),r=to),n=t[s%a],i=t[(s+1)%a],this.closed||s+2<a?t=t[(s+2)%a]:(to.subVectors(t[a-1],t[a-2]).add(t[a-1]),t=to),void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var o="chordal"===this.type?.5:.25,a=Math.pow(r.distanceToSquared(n),o),s=Math.pow(n.distanceToSquared(i),o),o=Math.pow(i.distanceToSquared(t),o);1e-4>s&&(s=1),1e-4>a&&(a=s),1e-4>o&&(o=s),ro.initNonuniformCatmullRom(r.x,n.x,i.x,t.x,a,s,o),no.initNonuniformCatmullRom(r.y,n.y,i.y,t.y,a,s,o),io.initNonuniformCatmullRom(r.z,n.z,i.z,t.z,a,s,o)}else"catmullrom"===this.type&&(a=void 0!==this.tension?this.tension:.5,ro.initCatmullRom(r.x,n.x,i.x,t.x,a),no.initCatmullRom(r.y,n.y,i.y,t.y,a),io.initCatmullRom(r.z,n.z,i.z,t.z,a));return new c(ro.calc(e),no.calc(e),io.calc(e))},(di.prototype=Object.create(pn.prototype)).constructor=di,di.prototype.getPoint=function(e){var t=this.v0,r=this.v1,n=this.v2,i=this.v3;return new c(ln(e,t.x,r.x,n.x,i.x),ln(e,t.y,r.y,n.y,i.y),ln(e,t.z,r.z,n.z,i.z))},(mi.prototype=Object.create(pn.prototype)).constructor=mi,mi.prototype.getPoint=function(e){var t=this.v0,r=this.v1,n=this.v2;return new c(hn(e,t.x,r.x,n.x),hn(e,t.y,r.y,n.y),hn(e,t.z,r.z,n.z))},(vi.prototype=Object.create(pn.prototype)).constructor=vi,vi.prototype.getPoint=function(e){if(1===e)return this.v2.clone();var t=new c;return t.subVectors(this.v2,this.v1),t.multiplyScalar(e),t.add(this.v1),t},(gi.prototype=Object.create(mn.prototype)).constructor=gi,pn.create=function(e,t){return console.log("THREE.Curve.create() has been deprecated"),e.prototype=Object.create(pn.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},yi.prototype=Object.create(fi.prototype),bi.prototype=Object.create(fi.prototype),_i.prototype=Object.create(fi.prototype),Object.assign(_i.prototype,{initFromArray:function(e){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(e){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(e){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),ii.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},ei.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Object.assign(G.prototype,{center:function(e){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},size:function(e){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(e)}}),Object.assign(K.prototype,{center:function(e){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionSphere:function(e){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},size:function(e){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(e)}}),je.prototype.center=function(e){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(e)},xi.random16=function(){return console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead."),Math.random()},Object.assign(J.prototype,{flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},multiplyVector3:function(e){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},multiplyVector3Array:function(e){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(e,t,r){return console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(e)},applyToVector3Array:function(e,t,r){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}}),Object.assign(u.prototype,{extractPosition:function(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},getPosition:function(){var e;return function(){return void 0===e&&(e=new c),console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),e.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(e){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(e){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector4:function(e){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector3Array:function(e){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(e){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),e.transformDirection(this)},crossVector:function(e){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(e,t,r){return console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(e)},applyToVector3Array:function(e,t,r){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(e,t,r,n,i,o){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(e,t,n,r,i,o)}}),Q.prototype.isIntersectionLine=function(e){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(e)},s.prototype.multiplyVector3=function(e){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},Object.assign(Pe.prototype,{isIntersectionBox:function(e){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionPlane:function(e){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(e)},isIntersectionSphere:function(e){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)}}),Object.assign(_n.prototype,{extrude:function(e){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new Jt(this,e)},makeGeometry:function(e){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new cr(this,e)}}),Object.assign(r.prototype,{fromAttribute:function(e,t,r){return console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)}}),Object.assign(c.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(e){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},getScaleFromMatrix:function(e){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},getColumnFromMatrix:function(e,t){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(t,e)},applyProjection:function(e){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(e)},fromAttribute:function(e,t,r){return console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)}}),Object.assign(i.prototype,{fromAttribute:function(e,t,r){return console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)}}),he.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},Object.assign(oe.prototype,{getChildByName:function(e){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(e)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(e,t){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(t,e)}}),Object.defineProperties(oe.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(e){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=e}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.defineProperties(yt.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(bt.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Object.defineProperty(pn.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(e){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=e}}),ce.prototype.setLens=function(e,t){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==t&&(this.filmGauge=t),this.setFocalLength(e)},Object.defineProperties(Lr.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(e){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=e}},shadowCameraLeft:{set:function(e){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=e}},shadowCameraRight:{set:function(e){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=e}},shadowCameraTop:{set:function(e){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=e}},shadowCameraBottom:{set:function(e){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=e}},shadowCameraNear:{set:function(e){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=e}},shadowCameraFar:{set:function(e){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=e}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(e){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=e}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(e){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=e}},shadowMapHeight:{set:function(e){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=e}}}),Object.defineProperties(le.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}}}),Object.assign(Se.prototype,{addIndex:function(e){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(e)},addDrawCall:function(e,t,r){void 0!==r&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(e,t)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}),Object.defineProperties(Se.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(kn.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(W.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new V}}}),Object.defineProperties(xr.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(X.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(e){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=e}}}),Object.assign(lt.prototype,{getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(e){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(e)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}}),Object.defineProperties(lt.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=e}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=e}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."),this.shadowMap.cullFace=e}}}),Object.defineProperties(te.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(e){e=1!==e,console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+e+"."),this.renderReverseSided=e}}}),Object.defineProperties(o.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=e}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=e}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=e}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=e}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(e){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=e}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(e){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=e}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(e){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=e}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(e){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=e}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(e){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=e}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(e){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=e}}}),On.prototype.load=function(e){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var t=this;return(new Mn).load(e,function(e){t.setBuffer(e)}),this},jn.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},e.WebGLRenderTargetCube=a,e.WebGLRenderTarget=o,e.WebGLRenderer=lt,e.ShaderLib=Ni,e.UniformsLib=Ai,e.UniformsUtils=Ri,e.ShaderChunk=Li,e.FogExp2=pt,e.Fog=ft,e.Scene=dt,e.LensFlare=mt,e.Sprite=gt,e.LOD=yt,e.SkinnedMesh=xt,e.Skeleton=bt,e.Bone=_t,e.Mesh=Re,e.LineSegments=Mt,e.LineLoop=Et,e.Line=St,e.Points=Tt,e.Group=Ot,e.VideoTexture=Pt,e.DataTexture=h,e.CompressedTexture=jt,e.CubeTexture=l,e.CanvasTexture=At,e.DepthTexture=Rt,e.Texture=n,e.CompressedTextureLoader=Or,e.DataTextureLoader=Pr,e.CubeTextureLoader=Ar,e.TextureLoader=Rr,e.ObjectLoader=cn,e.MaterialLoader=nn,e.BufferGeometryLoader=on,e.DefaultLoadingManager=Vi,e.LoadingManager=Cr,e.JSONLoader=sn,e.ImageLoader=jr,e.FontLoader=Sn,e.FileLoader=Tr,e.Loader=an,e.Cache=$i,e.AudioLoader=Mn,e.SpotLightShadow=Dr,e.SpotLight=kr,e.PointLight=Br,e.RectAreaLight=$r,e.HemisphereLight=Nr,e.DirectionalLightShadow=Fr,e.DirectionalLight=Ur,e.AmbientLight=zr,e.LightShadow=Ir,e.Light=Lr,e.StereoCamera=En,e.PerspectiveCamera=ce,e.OrthographicCamera=se,e.CubeCamera=Cn,e.ArrayCamera=st,e.Camera=ae,e.AudioListener=Tn,e.PositionalAudio=Pn,e.AudioContext=Ji,e.AudioAnalyser=jn,e.Audio=On,e.VectorKeyframeTrack=Xr,e.StringKeyframeTrack=Jr,e.QuaternionKeyframeTrack=Kr,e.NumberKeyframeTrack=Zr,e.ColorKeyframeTrack=en,e.BooleanKeyframeTrack=Qr,e.PropertyMixer=An,e.PropertyBinding=Ln,e.KeyframeTrack=tn,e.AnimationUtils=Gi,e.AnimationObjectGroup=Nn,e.AnimationMixer=Dn,e.AnimationClip=rn,e.Uniform=kn,e.InstancedBufferGeometry=Bn,e.BufferGeometry=Se,e.GeometryIdCount=function(){return ki++},e.Geometry=he,e.InterleavedBufferAttribute=Fn,e.InstancedInterleavedBuffer=zn,e.InterleavedBuffer=Un,e.InstancedBufferAttribute=$n,e.Face3=ue,e.Object3D=oe,e.Raycaster=Vn,e.Layers=ie,e.EventDispatcher=t,e.Clock=qn,e.QuaternionLinearInterpolant=Yr,e.LinearInterpolant=Hr,e.DiscreteInterpolant=qr,e.CubicInterpolant=Gr,e.Interpolant=Vr,e.Triangle=Ae,e.Math=xi,e.Spherical=Wn,e.Cylindrical=Xn,e.Plane=Q,e.Frustum=ee,e.Sphere=Z,e.Ray=Pe,e.Matrix4=u,e.Matrix3=J,e.Box3=K,e.Box2=G,e.Line3=je,e.Euler=ne,e.Vector4=i,e.Vector3=c,e.Vector2=r,e.Quaternion=s,e.Color=V,e.MorphBlendMesh=Yn,e.ImmediateRenderObject=Kn,e.VertexNormalsHelper=Zn,e.SpotLightHelper=Jn,e.SkeletonHelper=ei,e.PointLightHelper=ti,e.RectAreaLightHelper=ri,e.HemisphereLightHelper=ni,e.GridHelper=ii,e.PolarGridHelper=oi,e.FaceNormalsHelper=ai,e.DirectionalLightHelper=si,e.CameraHelper=ci,e.BoxHelper=ui,e.ArrowHelper=hi,e.AxisHelper=li,e.CatmullRomCurve3=fi,e.CubicBezierCurve3=di,e.QuadraticBezierCurve3=mi,e.LineCurve3=vi,e.ArcCurve=gi,e.EllipseCurve=mn,e.SplineCurve=vn,e.CubicBezierCurve=gn,e.QuadraticBezierCurve=yn,e.LineCurve=fn,e.Shape=_n,e.Path=bn,e.ShapePath=xn,e.Font=wn,e.CurvePath=dn,e.Curve=pn,e.ShapeUtils=Fi,e.SceneUtils={createMultiMaterialObject:function(e,t){for(var r=new Ot,n=0,i=t.length;n<i;n++)r.add(new Re(e,t[n]));return r},detach:function(e,t,r){e.applyMatrix(t.matrixWorld),t.remove(e),r.add(e)},attach:function(e,t,r){e.applyMatrix((new u).getInverse(r.matrixWorld)),t.remove(e),r.add(e)}},e.WireframeGeometry=Lt,e.ParametricGeometry=Nt,e.ParametricBufferGeometry=It,e.TetrahedronGeometry=Bt,e.TetrahedronBufferGeometry=Ft,e.OctahedronGeometry=Ut,e.OctahedronBufferGeometry=zt,e.IcosahedronGeometry=$t,e.IcosahedronBufferGeometry=Vt,e.DodecahedronGeometry=Gt,e.DodecahedronBufferGeometry=Ht,e.PolyhedronGeometry=Dt,e.PolyhedronBufferGeometry=kt,e.TubeGeometry=qt,e.TubeBufferGeometry=Wt,e.TorusKnotGeometry=Xt,e.TorusKnotBufferGeometry=Yt,e.TorusGeometry=Kt,e.TorusBufferGeometry=Zt,e.TextGeometry=er,e.TextBufferGeometry=tr,e.SphereGeometry=rr,e.SphereBufferGeometry=nr,e.RingGeometry=ir,e.RingBufferGeometry=or,e.PlaneGeometry=Ce,e.PlaneBufferGeometry=Te,e.LatheGeometry=ar,e.LatheBufferGeometry=sr,e.ShapeGeometry=cr,e.ShapeBufferGeometry=ur,e.ExtrudeGeometry=Jt,e.ExtrudeBufferGeometry=Qt,e.EdgesGeometry=hr,e.ConeGeometry=fr,e.ConeBufferGeometry=dr,e.CylinderGeometry=lr,e.CylinderBufferGeometry=pr,e.CircleGeometry=mr,e.CircleBufferGeometry=vr,e.BoxGeometry=Me,e.BoxBufferGeometry=Ee,e.ShadowMaterial=gr,e.SpriteMaterial=vt,e.RawShaderMaterial=yr,e.ShaderMaterial=X,e.PointsMaterial=Ct,e.MeshPhysicalMaterial=_r,e.MeshStandardMaterial=br,e.MeshPhongMaterial=xr,e.MeshToonMaterial=wr,e.MeshNormalMaterial=Sr,e.MeshLambertMaterial=Mr,e.MeshDepthMaterial=Y,e.MeshBasicMaterial=Oe,e.LineDashedMaterial=Er,e.LineBasicMaterial=wt,e.Material=W,e.Float64BufferAttribute=_e,e.Float32BufferAttribute=be,e.Uint32BufferAttribute=ye,e.Int32BufferAttribute=ge,e.Uint16BufferAttribute=ve,e.Int16BufferAttribute=me,e.Uint8ClampedBufferAttribute=de,e.Uint8BufferAttribute=fe,e.Int8BufferAttribute=pe,e.BufferAttribute=le,e.REVISION="86",e.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2},e.CullFaceNone=0,e.CullFaceBack=1,e.CullFaceFront=2,e.CullFaceFrontBack=3,e.FrontFaceDirectionCW=0,e.FrontFaceDirectionCCW=1,e.BasicShadowMap=0,e.PCFShadowMap=1,e.PCFSoftShadowMap=2,e.FrontSide=0,e.BackSide=1,e.DoubleSide=2,e.FlatShading=1,e.SmoothShading=2,e.NoColors=0,e.FaceColors=1,e.VertexColors=2,e.NoBlending=0,e.NormalBlending=1,e.AdditiveBlending=2,e.SubtractiveBlending=3,e.MultiplyBlending=4,e.CustomBlending=5,e.AddEquation=100,e.SubtractEquation=101,e.ReverseSubtractEquation=102,e.MinEquation=103,e.MaxEquation=104,e.ZeroFactor=200,e.OneFactor=201,e.SrcColorFactor=202,e.OneMinusSrcColorFactor=203,e.SrcAlphaFactor=204,e.OneMinusSrcAlphaFactor=205,e.DstAlphaFactor=206,e.OneMinusDstAlphaFactor=207,e.DstColorFactor=208,e.OneMinusDstColorFactor=209,e.SrcAlphaSaturateFactor=210,e.NeverDepth=0,e.AlwaysDepth=1,e.LessDepth=2,e.LessEqualDepth=3,e.EqualDepth=4,e.GreaterEqualDepth=5,e.GreaterDepth=6,e.NotEqualDepth=7,e.MultiplyOperation=0,e.MixOperation=1,e.AddOperation=2,e.NoToneMapping=0,e.LinearToneMapping=1,e.ReinhardToneMapping=2,e.Uncharted2ToneMapping=3,e.CineonToneMapping=4,e.UVMapping=300,e.CubeReflectionMapping=301,e.CubeRefractionMapping=302,e.EquirectangularReflectionMapping=303,e.EquirectangularRefractionMapping=304,e.SphericalReflectionMapping=305,e.CubeUVReflectionMapping=306,e.CubeUVRefractionMapping=307,e.RepeatWrapping=1e3,e.ClampToEdgeWrapping=1001,e.MirroredRepeatWrapping=1002,e.NearestFilter=1003,e.NearestMipMapNearestFilter=1004,e.NearestMipMapLinearFilter=1005,e.LinearFilter=1006,e.LinearMipMapNearestFilter=1007,e.LinearMipMapLinearFilter=1008,e.UnsignedByteType=1009,e.ByteType=1010,e.ShortType=1011,e.UnsignedShortType=1012,e.IntType=1013,e.UnsignedIntType=1014,e.FloatType=1015,e.HalfFloatType=1016,e.UnsignedShort4444Type=1017,e.UnsignedShort5551Type=1018,e.UnsignedShort565Type=1019,e.UnsignedInt248Type=1020,e.AlphaFormat=1021,e.RGBFormat=1022,e.RGBAFormat=1023,e.LuminanceFormat=1024,e.LuminanceAlphaFormat=1025,e.RGBEFormat=1023,e.DepthFormat=1026,e.DepthStencilFormat=1027,e.RGB_S3TC_DXT1_Format=2001,e.RGBA_S3TC_DXT1_Format=2002,e.RGBA_S3TC_DXT3_Format=2003,e.RGBA_S3TC_DXT5_Format=2004,e.RGB_PVRTC_4BPPV1_Format=2100,e.RGB_PVRTC_2BPPV1_Format=2101,e.RGBA_PVRTC_4BPPV1_Format=2102,e.RGBA_PVRTC_2BPPV1_Format=2103,e.RGB_ETC1_Format=2151,e.LoopOnce=2200,e.LoopRepeat=2201,e.LoopPingPong=2202,e.InterpolateDiscrete=2300,e.InterpolateLinear=2301,e.InterpolateSmooth=2302,e.ZeroCurvatureEnding=2400,e.ZeroSlopeEnding=2401,e.WrapAroundEnding=2402,e.TrianglesDrawMode=0,e.TriangleStripDrawMode=1,e.TriangleFanDrawMode=2,e.LinearEncoding=3e3,e.sRGBEncoding=3001,e.GammaEncoding=3007,e.RGBEEncoding=3002,e.LogLuvEncoding=3003,e.RGBM7Encoding=3004,e.RGBM16Encoding=3005,e.RGBDEncoding=3006,e.BasicDepthPacking=3200,e.RGBADepthPacking=3201,e.CubeGeometry=Me,e.Face4=function(e,t,r,n,i,o,a){return console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."),new ue(e,t,r,i,o,a)},e.LineStrip=0,e.LinePieces=1,e.MeshFaceMaterial=function(e){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),e},e.MultiMaterial=function(e){return void 0===e&&(e=[]),console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),e.isMultiMaterial=!0,e.materials=e,e.clone=function(){return e.slice()},e},e.PointCloud=function(e,t){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new Tt(e,t)},e.Particle=function(e){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new gt(e)},e.ParticleSystem=function(e,t){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new Tt(e,t)},e.PointCloudMaterial=function(e){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new Ct(e)},e.ParticleBasicMaterial=function(e){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new Ct(e)},e.ParticleSystemMaterial=function(e){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new Ct(e)},e.Vertex=function(e,t,r){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new c(e,t,r)},e.DynamicBufferAttribute=function(e,t){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."),new le(e,t).setDynamic(!0)},e.Int8Attribute=function(e,t){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new pe(e,t)},e.Uint8Attribute=function(e,t){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new fe(e,t)},e.Uint8ClampedAttribute=function(e,t){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new de(e,t)},e.Int16Attribute=function(e,t){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new me(e,t)},e.Uint16Attribute=function(e,t){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new ve(e,t)},e.Int32Attribute=function(e,t){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new ge(e,t)},e.Uint32Attribute=function(e,t){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new ye(e,t)},e.Float32Attribute=function(e,t){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new be(e,t)},e.Float64Attribute=function(e,t){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new _e(e,t)},e.ClosedSplineCurve3=yi,e.SplineCurve3=bi,e.Spline=_i,e.BoundingBoxHelper=function(e,t){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new ui(e,t)},e.EdgesHelper=function(e,t){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new Mt(new hr(e.geometry),new wt({color:void 0!==t?t:16777215}))},e.WireframeHelper=function(e,t){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new Mt(new Lt(e.geometry),new wt({color:void 0!==t?t:16777215}))},e.XHRLoader=function(e){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new Tr(e)},e.BinaryTextureLoader=function(e){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new Pr(e)},e.GeometryUtils={merge:function(e,t,r){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var n;t.isMesh&&(t.matrixAutoUpdate&&t.updateMatrix(),n=t.matrix,t=t.geometry),e.merge(t,n,r)},center:function(e){return console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."),e.center()}},e.ImageUtils={crossOrigin:void 0,loadTexture:function(e,t,r,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var i=new Rr;return i.setCrossOrigin(this.crossOrigin),e=i.load(e,r,void 0,n),t&&(e.mapping=t),e},loadTextureCube:function(e,t,r,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var i=new Ar;return i.setCrossOrigin(this.crossOrigin),e=i.load(e,r,void 0,n),t&&(e.mapping=t),e},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}},e.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."),this.projectVector=function(e,t){console.warn("THREE.Projector: .projectVector() is now vector.project()."),e.project(t)},this.unprojectVector=function(e,t){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),e.unproject(t)},this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}},e.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"),this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),this.clear=function(){},this.render=function(){},this.setClearColor=function(){},this.setSize=function(){}},Object.defineProperty(e,"__esModule",{value:!0})})},{}],181:[function(e,t,r){"use strict";function n(e,t){if(!(this instanceof n))return new n(e,t);if(this.data=e||[],this.length=this.data.length,this.compare=t||i,this.length>0)for(var r=this.length>>1;r>=0;r--)this._down(r)}function i(e,t){return e<t?-1:e>t?1:0}t.exports=n,n.prototype={push:function(e){this.data.push(e),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var e=this.data[0];return--this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),e}},peek:function(){return this.data[0]},_up:function(e){for(var t=this.data,r=this.compare,n=t[e];e>0;){var i=e-1>>1,o=t[i];if(r(n,o)>=0)break;t[e]=o,e=i}t[e]=n},_down:function(e){for(var t=this.data,r=this.compare,n=this.length,i=n>>1,o=t[e];e<i;){var a=1+(e<<1),s=a+1,c=t[a];if(s<n&&r(t[s],c)<0&&(a=s,c=t[s]),r(c,o)>=0)break;t[e]=c,e=a}t[e]=o}}},{}],182:[function(e,t,r){(function(){function e(e){function t(t,r,n,i,o,a){for(;o>=0&&o<a;o+=e){var s=i?i[o]:o;n=r(n,t[s],s,t)}return n}return function(r,n,i,o){n=x(n,o,4);var a=!O(r)&&_.keys(r),s=(a||r).length,c=e>0?0:s-1;return arguments.length<3&&(i=r[a?a[c]:c],c+=e),t(r,n,i,a,c,s)}}function n(e){return function(t,r,n){r=w(r,n);for(var i=T(t),o=e>0?0:i-1;o>=0&&o<i;o+=e)if(r(t[o],o,t))return o;return-1}}function i(e,t,r){return function(n,i,o){var a=0,s=T(n);if("number"==typeof o)e>0?a=o>=0?o:Math.max(o+s,a):s=o>=0?Math.min(o+1,s):o+s+1;else if(r&&o&&s)return o=r(n,i),n[o]===i?o:-1;if(i!==i)return(o=t(p.call(n,a,s),_.isNaN))>=0?o+a:-1;for(o=e>0?a:s-1;o>=0&&o<s;o+=e)if(n[o]===i)return o;return-1}}function o(e,t){var r=L.length,n=e.constructor,i=_.isFunction(n)&&n.prototype||u,o="constructor";for(_.has(e,o)&&!_.contains(t,o)&&t.push(o);r--;)(o=L[r])in e&&e[o]!==i[o]&&!_.contains(t,o)&&t.push(o)}var a=this,s=a._,c=Array.prototype,u=Object.prototype,h=Function.prototype,l=c.push,p=c.slice,f=u.toString,d=u.hasOwnProperty,m=Array.isArray,v=Object.keys,g=h.bind,y=Object.create,b=function(){},_=function(e){return e instanceof _?e:this instanceof _?void(this._wrapped=e):new _(e)};void 0!==r?(void 0!==t&&t.exports&&(r=t.exports=_),r._=_):a._=_,_.VERSION="1.8.3";var x=function(e,t,r){if(void 0===t)return e;switch(null==r?3:r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)};case 4:return function(r,n,i,o){return e.call(t,r,n,i,o)}}return function(){return e.apply(t,arguments)}},w=function(e,t,r){return null==e?_.identity:_.isFunction(e)?x(e,t,r):_.isObject(e)?_.matcher(e):_.property(e)};_.iteratee=function(e,t){return w(e,t,1/0)};var S=function(e,t){return function(r){var n=arguments.length;if(n<2||null==r)return r;for(var i=1;i<n;i++)for(var o=arguments[i],a=e(o),s=a.length,c=0;c<s;c++){var u=a[c];t&&void 0!==r[u]||(r[u]=o[u])}return r}},M=function(e){if(!_.isObject(e))return{};if(y)return y(e);b.prototype=e;var t=new b;return b.prototype=null,t},E=function(e){return function(t){return null==t?void 0:t[e]}},C=Math.pow(2,53)-1,T=E("length"),O=function(e){var t=T(e);return"number"==typeof t&&t>=0&&t<=C};_.each=_.forEach=function(e,t,r){t=x(t,r);var n,i;if(O(e))for(n=0,i=e.length;n<i;n++)t(e[n],n,e);else{var o=_.keys(e);for(n=0,i=o.length;n<i;n++)t(e[o[n]],o[n],e)}return e},_.map=_.collect=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=Array(i),a=0;a<i;a++){var s=n?n[a]:a;o[a]=t(e[s],s,e)}return o},_.reduce=_.foldl=_.inject=e(1),_.reduceRight=_.foldr=e(-1),_.find=_.detect=function(e,t,r){var n;if(void 0!==(n=O(e)?_.findIndex(e,t,r):_.findKey(e,t,r))&&-1!==n)return e[n]},_.filter=_.select=function(e,t,r){var n=[];return t=w(t,r),_.each(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n},_.reject=function(e,t,r){return _.filter(e,_.negate(w(t)),r)},_.every=_.all=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=0;o<i;o++){var a=n?n[o]:o;if(!t(e[a],a,e))return!1}return!0},_.some=_.any=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=0;o<i;o++){var a=n?n[o]:o;if(t(e[a],a,e))return!0}return!1},_.contains=_.includes=_.include=function(e,t,r,n){return O(e)||(e=_.values(e)),("number"!=typeof r||n)&&(r=0),_.indexOf(e,t,r)>=0},_.invoke=function(e,t){var r=p.call(arguments,2),n=_.isFunction(t);return _.map(e,function(e){var i=n?t:e[t];return null==i?i:i.apply(e,r)})},_.pluck=function(e,t){return _.map(e,_.property(t))},_.where=function(e,t){return _.filter(e,_.matcher(t))},_.findWhere=function(e,t){return _.find(e,_.matcher(t))},_.max=function(e,t,r){var n,i,o=-1/0,a=-1/0;if(null==t&&null!=e)for(var s=0,c=(e=O(e)?e:_.values(e)).length;s<c;s++)(n=e[s])>o&&(o=n);else t=w(t,r),_.each(e,function(e,r,n){((i=t(e,r,n))>a||i===-1/0&&o===-1/0)&&(o=e,a=i)});return o},_.min=function(e,t,r){var n,i,o=1/0,a=1/0;if(null==t&&null!=e)for(var s=0,c=(e=O(e)?e:_.values(e)).length;s<c;s++)(n=e[s])<o&&(o=n);else t=w(t,r),_.each(e,function(e,r,n){((i=t(e,r,n))<a||i===1/0&&o===1/0)&&(o=e,a=i)});return o},_.shuffle=function(e){for(var t,r=O(e)?e:_.values(e),n=r.length,i=Array(n),o=0;o<n;o++)(t=_.random(0,o))!==o&&(i[o]=i[t]),i[t]=r[o];return i},_.sample=function(e,t,r){return null==t||r?(O(e)||(e=_.values(e)),e[_.random(e.length-1)]):_.shuffle(e).slice(0,Math.max(0,t))},_.sortBy=function(e,t,r){return t=w(t,r),_.pluck(_.map(e,function(e,r,n){return{value:e,index:r,criteria:t(e,r,n)}}).sort(function(e,t){var r=e.criteria,n=t.criteria;if(r!==n){if(r>n||void 0===r)return 1;if(r<n||void 0===n)return-1}return e.index-t.index}),"value")};var P=function(e){return function(t,r,n){var i={};return r=w(r,n),_.each(t,function(n,o){var a=r(n,o,t);e(i,n,a)}),i}};_.groupBy=P(function(e,t,r){_.has(e,r)?e[r].push(t):e[r]=[t]}),_.indexBy=P(function(e,t,r){e[r]=t}),_.countBy=P(function(e,t,r){_.has(e,r)?e[r]++:e[r]=1}),_.toArray=function(e){return e?_.isArray(e)?p.call(e):O(e)?_.map(e,_.identity):_.values(e):[]},_.size=function(e){return null==e?0:O(e)?e.length:_.keys(e).length},_.partition=function(e,t,r){t=w(t,r);var n=[],i=[];return _.each(e,function(e,r,o){(t(e,r,o)?n:i).push(e)}),[n,i]},_.first=_.head=_.take=function(e,t,r){if(null!=e)return null==t||r?e[0]:_.initial(e,e.length-t)},_.initial=function(e,t,r){return p.call(e,0,Math.max(0,e.length-(null==t||r?1:t)))},_.last=function(e,t,r){if(null!=e)return null==t||r?e[e.length-1]:_.rest(e,Math.max(0,e.length-t))},_.rest=_.tail=_.drop=function(e,t,r){return p.call(e,null==t||r?1:t)},_.compact=function(e){return _.filter(e,_.identity)};var j=function(e,t,r,n){for(var i=[],o=0,a=n||0,s=T(e);a<s;a++){var c=e[a];if(O(c)&&(_.isArray(c)||_.isArguments(c))){t||(c=j(c,t,r));var u=0,h=c.length;for(i.length+=h;u<h;)i[o++]=c[u++]}else r||(i[o++]=c)}return i};_.flatten=function(e,t){return j(e,t,!1)},_.without=function(e){return _.difference(e,p.call(arguments,1))},_.uniq=_.unique=function(e,t,r,n){_.isBoolean(t)||(n=r,r=t,t=!1),null!=r&&(r=w(r,n));for(var i=[],o=[],a=0,s=T(e);a<s;a++){var c=e[a],u=r?r(c,a,e):c;t?(a&&o===u||i.push(c),o=u):r?_.contains(o,u)||(o.push(u),i.push(c)):_.contains(i,c)||i.push(c)}return i},_.union=function(){return _.uniq(j(arguments,!0,!0))},_.intersection=function(e){for(var t=[],r=arguments.length,n=0,i=T(e);n<i;n++){var o=e[n];if(!_.contains(t,o)){for(var a=1;a<r&&_.contains(arguments[a],o);a++);a===r&&t.push(o)}}return t},_.difference=function(e){var t=j(arguments,!0,!0,1);return _.filter(e,function(e){return!_.contains(t,e)})},_.zip=function(){return _.unzip(arguments)},_.unzip=function(e){for(var t=e&&_.max(e,T).length||0,r=Array(t),n=0;n<t;n++)r[n]=_.pluck(e,n);return r},_.object=function(e,t){for(var r={},n=0,i=T(e);n<i;n++)t?r[e[n]]=t[n]:r[e[n][0]]=e[n][1];return r},_.findIndex=n(1),_.findLastIndex=n(-1),_.sortedIndex=function(e,t,r,n){for(var i=(r=w(r,n,1))(t),o=0,a=T(e);o<a;){var s=Math.floor((o+a)/2);r(e[s])<i?o=s+1:a=s}return o},_.indexOf=i(1,_.findIndex,_.sortedIndex),_.lastIndexOf=i(-1,_.findLastIndex),_.range=function(e,t,r){null==t&&(t=e||0,e=0),r=r||1;for(var n=Math.max(Math.ceil((t-e)/r),0),i=Array(n),o=0;o<n;o++,e+=r)i[o]=e;return i};var A=function(e,t,r,n,i){if(!(n instanceof t))return e.apply(r,i);var o=M(e.prototype),a=e.apply(o,i);return _.isObject(a)?a:o};_.bind=function(e,t){if(g&&e.bind===g)return g.apply(e,p.call(arguments,1));if(!_.isFunction(e))throw new TypeError("Bind must be called on a function");var r=p.call(arguments,2),n=function(){return A(e,n,t,this,r.concat(p.call(arguments)))};return n},_.partial=function(e){var t=p.call(arguments,1),r=function(){for(var n=0,i=t.length,o=Array(i),a=0;a<i;a++)o[a]=t[a]===_?arguments[n++]:t[a];for(;n<arguments.length;)o.push(arguments[n++]);return A(e,r,this,this,o)};return r},_.bindAll=function(e){var t,r,n=arguments.length;if(n<=1)throw new Error("bindAll must be passed function names");for(t=1;t<n;t++)e[r=arguments[t]]=_.bind(e[r],e);return e},_.memoize=function(e,t){var r=function(n){var i=r.cache,o=""+(t?t.apply(this,arguments):n);return _.has(i,o)||(i[o]=e.apply(this,arguments)),i[o]};return r.cache={},r},_.delay=function(e,t){var r=p.call(arguments,2);return setTimeout(function(){return e.apply(null,r)},t)},_.defer=_.partial(_.delay,_,1),_.throttle=function(e,t,r){var n,i,o,a=null,s=0;r||(r={});var c=function(){s=!1===r.leading?0:_.now(),a=null,o=e.apply(n,i),a||(n=i=null)};return function(){var u=_.now();s||!1!==r.leading||(s=u);var h=t-(u-s);return n=this,i=arguments,h<=0||h>t?(a&&(clearTimeout(a),a=null),s=u,o=e.apply(n,i),a||(n=i=null)):a||!1===r.trailing||(a=setTimeout(c,h)),o}},_.debounce=function(e,t,r){var n,i,o,a,s,c=function(){var u=_.now()-a;u<t&&u>=0?n=setTimeout(c,t-u):(n=null,r||(s=e.apply(o,i),n||(o=i=null)))};return function(){o=this,i=arguments,a=_.now();var u=r&&!n;return n||(n=setTimeout(c,t)),u&&(s=e.apply(o,i),o=i=null),s}},_.wrap=function(e,t){return _.partial(t,e)},_.negate=function(e){return function(){return!e.apply(this,arguments)}},_.compose=function(){var e=arguments,t=e.length-1;return function(){for(var r=t,n=e[t].apply(this,arguments);r--;)n=e[r].call(this,n);return n}},_.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},_.before=function(e,t){var r;return function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=null),r}},_.once=_.partial(_.before,2);var R=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];_.keys=function(e){if(!_.isObject(e))return[];if(v)return v(e);var t=[];for(var r in e)_.has(e,r)&&t.push(r);return R&&o(e,t),t},_.allKeys=function(e){if(!_.isObject(e))return[];var t=[];for(var r in e)t.push(r);return R&&o(e,t),t},_.values=function(e){for(var t=_.keys(e),r=t.length,n=Array(r),i=0;i<r;i++)n[i]=e[t[i]];return n},_.mapObject=function(e,t,r){t=w(t,r);for(var n,i=_.keys(e),o=i.length,a={},s=0;s<o;s++)a[n=i[s]]=t(e[n],n,e);return a},_.pairs=function(e){for(var t=_.keys(e),r=t.length,n=Array(r),i=0;i<r;i++)n[i]=[t[i],e[t[i]]];return n},_.invert=function(e){for(var t={},r=_.keys(e),n=0,i=r.length;n<i;n++)t[e[r[n]]]=r[n];return t},_.functions=_.methods=function(e){var t=[];for(var r in e)_.isFunction(e[r])&&t.push(r);return t.sort()},_.extend=S(_.allKeys),_.extendOwn=_.assign=S(_.keys),_.findKey=function(e,t,r){t=w(t,r);for(var n,i=_.keys(e),o=0,a=i.length;o<a;o++)if(n=i[o],t(e[n],n,e))return n},_.pick=function(e,t,r){var n,i,o={},a=e;if(null==a)return o;_.isFunction(t)?(i=_.allKeys(a),n=x(t,r)):(i=j(arguments,!1,!1,1),n=function(e,t,r){return t in r},a=Object(a));for(var s=0,c=i.length;s<c;s++){var u=i[s],h=a[u];n(h,u,a)&&(o[u]=h)}return o},_.omit=function(e,t,r){if(_.isFunction(t))t=_.negate(t);else{var n=_.map(j(arguments,!1,!1,1),String);t=function(e,t){return!_.contains(n,t)}}return _.pick(e,t,r)},_.defaults=S(_.allKeys,!0),_.create=function(e,t){var r=M(e);return t&&_.extendOwn(r,t),r},_.clone=function(e){return _.isObject(e)?_.isArray(e)?e.slice():_.extend({},e):e},_.tap=function(e,t){return t(e),e},_.isMatch=function(e,t){var r=_.keys(t),n=r.length;if(null==e)return!n;for(var i=Object(e),o=0;o<n;o++){var a=r[o];if(t[a]!==i[a]||!(a in i))return!1}return!0};var N=function(e,t,r,n){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return e===t;e instanceof _&&(e=e._wrapped),t instanceof _&&(t=t._wrapped);var i=f.call(e);if(i!==f.call(t))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t}var o="[object Array]"===i;if(!o){if("object"!=typeof e||"object"!=typeof t)return!1;var a=e.constructor,s=t.constructor;if(a!==s&&!(_.isFunction(a)&&a instanceof a&&_.isFunction(s)&&s instanceof s)&&"constructor"in e&&"constructor"in t)return!1}r=r||[],n=n||[];for(var c=r.length;c--;)if(r[c]===e)return n[c]===t;if(r.push(e),n.push(t),o){if((c=e.length)!==t.length)return!1;for(;c--;)if(!N(e[c],t[c],r,n))return!1}else{var u,h=_.keys(e);if(c=h.length,_.keys(t).length!==c)return!1;for(;c--;)if(u=h[c],!_.has(t,u)||!N(e[u],t[u],r,n))return!1}return r.pop(),n.pop(),!0};_.isEqual=function(e,t){return N(e,t)},_.isEmpty=function(e){return null==e||(O(e)&&(_.isArray(e)||_.isString(e)||_.isArguments(e))?0===e.length:0===_.keys(e).length)},_.isElement=function(e){return!(!e||1!==e.nodeType)},_.isArray=m||function(e){return"[object Array]"===f.call(e)},_.isObject=function(e){var t=typeof e;return"function"===t||"object"===t&&!!e},_.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(e){_["is"+e]=function(t){return f.call(t)==="[object "+e+"]"}}),_.isArguments(arguments)||(_.isArguments=function(e){return _.has(e,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(_.isFunction=function(e){return"function"==typeof e||!1}),_.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},_.isNaN=function(e){return _.isNumber(e)&&e!==+e},_.isBoolean=function(e){return!0===e||!1===e||"[object Boolean]"===f.call(e)},_.isNull=function(e){return null===e},_.isUndefined=function(e){return void 0===e},_.has=function(e,t){return null!=e&&d.call(e,t)},_.noConflict=function(){return a._=s,this},_.identity=function(e){return e},_.constant=function(e){return function(){return e}},_.noop=function(){},_.property=E,_.propertyOf=function(e){return null==e?function(){}:function(t){return e[t]}},_.matcher=_.matches=function(e){return e=_.extendOwn({},e),function(t){return _.isMatch(t,e)}},_.times=function(e,t,r){var n=Array(Math.max(0,e));t=x(t,r,1);for(var i=0;i<e;i++)n[i]=t(i);return n},_.random=function(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))},_.now=Date.now||function(){return(new Date).getTime()};var I={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},D=_.invert(I),k=function(e){var t=function(t){return e[t]},r="(?:"+_.keys(e).join("|")+")",n=RegExp(r),i=RegExp(r,"g");return function(e){return e=null==e?"":""+e,n.test(e)?e.replace(i,t):e}};_.escape=k(I),_.unescape=k(D),_.result=function(e,t,r){var n=null==e?void 0:e[t];return void 0===n&&(n=r),_.isFunction(n)?n.call(e):n};var B=0;_.uniqueId=function(e){var t=++B+"";return e?e+t:t},_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var F=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,$=function(e){return"\\"+U[e]};_.template=function(e,t,r){!t&&r&&(t=r),t=_.defaults({},t,_.templateSettings);var n=RegExp([(t.escape||F).source,(t.interpolate||F).source,(t.evaluate||F).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(n,function(t,r,n,a,s){return o+=e.slice(i,s).replace(z,$),i=s+t.length,r?o+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?o+="'+\n((__t=("+n+"))==null?'':__t)+\n'":a&&(o+="';\n"+a+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var a=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var s=function(e){return a.call(this,e,_)},c=t.variable||"obj";return s.source="function("+c+"){\n"+o+"}",s},_.chain=function(e){var t=_(e);return t._chain=!0,t};var V=function(e,t){return e._chain?_(t).chain():t};_.mixin=function(e){_.each(_.functions(e),function(t){var r=_[t]=e[t];_.prototype[t]=function(){var e=[this._wrapped];return l.apply(e,arguments),V(this,r.apply(_,e))}})},_.mixin(_),_.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=c[e];_.prototype[e]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==e&&"splice"!==e||0!==r.length||delete r[0],V(this,r)}}),_.each(["concat","join","slice"],function(e){var t=c[e];_.prototype[e]=function(){return V(this,t.apply(this._wrapped,arguments))}}),_.prototype.value=function(){return this._wrapped},_.prototype.valueOf=_.prototype.toJSON=_.prototype.value,_.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],183:[function(e,t,r){var n=e("./vdom/create-element.js");t.exports=n},{"./vdom/create-element.js":189}],184:[function(e,t,r){var n=e("./vtree/diff.js");t.exports=n},{"./vtree/diff.js":209}],185:[function(e,t,r){var n=e("./virtual-hyperscript/index.js");t.exports=n},{"./virtual-hyperscript/index.js":196}],186:[function(e,t,r){var n=e("./diff.js"),i=e("./patch.js"),o=e("./h.js"),a=e("./create-element.js"),s=e("./vnode/vnode.js"),c=e("./vnode/vtext.js");t.exports={diff:n,patch:i,h:o,create:a,VNode:s,VText:c}},{"./create-element.js":183,"./diff.js":184,"./h.js":185,"./patch.js":187,"./vnode/vnode.js":205,"./vnode/vtext.js":207}],187:[function(e,t,r){var n=e("./vdom/patch.js");t.exports=n},{"./vdom/patch.js":192}],188:[function(e,t,r){function n(e,t,r,n){if(n){var i=n[t];if(s(i))i.unhook&&i.unhook(e,t,r);else if("attributes"===t)for(var o in i)e.removeAttribute(o);else if("style"===t)for(var a in i)e.style[a]="";else e[t]="string"==typeof i?"":null}}function i(e,t,r,n,i){var s=r?r[n]:void 0;if("attributes"!==n)if(s&&a(s)&&o(s)!==o(i))e[n]=i;else{a(e[n])||(e[n]={});var c="style"===n?"":void 0;for(var u in i){var h=i[u];e[n][u]=void 0===h?c:h}}else for(var l in i){var p=i[l];void 0===p?e.removeAttribute(l):e.setAttribute(l,p)}}function o(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var a=e("is-object"),s=e("../vnode/is-vhook.js");t.exports=function(e,t,r){for(var o in t){var c=t[o];void 0===c?n(e,o,c,r):s(c)?(n(e,o,c,r),c.hook&&c.hook(e,o,r?r[o]:void 0)):a(c)?i(e,0,r,o,c):e[o]=c}}},{"../vnode/is-vhook.js":200,"is-object":20}],189:[function(e,t,r){function n(e,t){var r=t?t.document||i:i,h=t?t.warn:null;if(e=u(e).a,c(e))return e.init();if(s(e))return r.createTextNode(e.text);if(!a(e))return h&&h("Item is not a valid virtual dom node",e),null;var l=null===e.namespace?r.createElement(e.tagName):r.createElementNS(e.namespace,e.tagName),p=e.properties;o(l,p);for(var f=e.children,d=0;d<f.length;d++){var m=n(f[d],t);m&&l.appendChild(m)}return l}var i=e("global/document"),o=e("./apply-properties"),a=e("../vnode/is-vnode.js"),s=e("../vnode/is-vtext.js"),c=e("../vnode/is-widget.js"),u=e("../vnode/handle-thunk.js");t.exports=n},{"../vnode/handle-thunk.js":198,"../vnode/is-vnode.js":201,"../vnode/is-vtext.js":202,"../vnode/is-widget.js":203,"./apply-properties":188,"global/document":16}],190:[function(e,t,r){function n(e,t,r,o,s){if(o=o||{},e){i(r,s,s)&&(o[s]=e);var c=t.children;if(c)for(var u=e.childNodes,h=0;h<t.children.length;h++){s+=1;var l=c[h]||a,p=s+(l.count||0);i(r,s,p)&&n(u[h],l,r,o,s),s=p}}return o}function i(e,t,r){if(0===e.length)return!1;for(var n,i,o=0,a=e.length-1;o<=a;){if(n=(a+o)/2>>0,i=e[n],o===a)return i>=t&&i<=r;if(i<t)o=n+1;else{if(!(i>r))return!0;a=n-1}}return!1}function o(e,t){return e>t?1:-1}var a={};t.exports=function(e,t,r,i){return r&&0!==r.length?(r.sort(o),n(e,t,r,i,0)):{}}},{}],191:[function(e,t,r){function n(e,t){var r=e.parentNode;return r&&r.removeChild(e),c(e,t),null}function i(e,t,r){var n=r.render(t,r);return e&&e.appendChild(n),e}function o(e,t,r,n){var i;if(3===e.nodeType)e.replaceData(0,e.length,r.text),i=e;else{var o=e.parentNode;i=n.render(r,n),o&&i!==e&&o.replaceChild(i,e)}return i}function a(e,t,r,n){var i,o=d(t,r);i=o?r.update(t,e)||e:n.render(r,n);var a=e.parentNode;return a&&i!==e&&a.replaceChild(i,e),o||c(e,t),i}function s(e,t,r,n){var i=e.parentNode,o=n.render(r,n);return i&&o!==e&&i.replaceChild(o,e),o}function c(e,t){"function"==typeof t.destroy&&p(t)&&t.destroy(e)}function u(e,t){for(var r,n,i,o=e.childNodes,a={},s=0;s<t.removes.length;s++)r=o[(n=t.removes[s]).from],n.key&&(a[n.key]=r),e.removeChild(r);for(var c=o.length,u=0;u<t.inserts.length;u++)r=a[(i=t.inserts[u]).key],e.insertBefore(r,i.to>=c++?null:o[i.to])}function h(e,t){return e&&t&&e!==t&&e.parentNode&&e.parentNode.replaceChild(t,e),t}var l=e("./apply-properties"),p=e("../vnode/is-widget.js"),f=e("../vnode/vpatch.js"),d=e("./update-widget");t.exports=function(e,t,r){var c=e.type,p=e.vNode,d=e.patch;switch(c){case f.REMOVE:return n(t,p);case f.INSERT:return i(t,d,r);case f.VTEXT:return o(t,0,d,r);case f.WIDGET:return a(t,p,d,r);case f.VNODE:return s(t,0,d,r);case f.ORDER:return u(t,d),t;case f.PROPS:return l(t,d,p.properties),t;case f.THUNK:return h(t,r.patch(t,d,r));default:return t}}},{"../vnode/is-widget.js":203,"../vnode/vpatch.js":206,"./apply-properties":188,"./update-widget":193}],192:[function(e,t,r){function n(e,t,r){return r=r||{},r.patch=r.patch&&r.patch!==n?r.patch:i,r.render=r.render||u,r.patch(e,t,r)}function i(e,t,r){var n=a(t);if(0===n.length)return e;var i=h(e,t.a,n),c=e.ownerDocument;r.document||c===s||(r.document=c);for(var u=0;u<n.length;u++){var l=n[u];e=o(e,i[l],t[l],r)}return e}function o(e,t,r,n){if(!t)return e;var i;if(c(r))for(var o=0;o<r.length;o++)i=l(r[o],t,n),t===e&&(e=i);else i=l(r,t,n),t===e&&(e=i);return e}function a(e){var t=[];for(var r in e)"a"!==r&&t.push(Number(r));return t}var s=e("global/document"),c=e("x-is-array"),u=e("./create-element"),h=e("./dom-index"),l=e("./patch-op");t.exports=n},{"./create-element":189,"./dom-index":190,"./patch-op":191,"global/document":16,"x-is-array":228}],193:[function(e,t,r){var n=e("../vnode/is-widget.js");t.exports=function(e,t){return!(!n(e)||!n(t))&&("name"in e&&"name"in t?e.id===t.id:e.init===t.init)}},{"../vnode/is-widget.js":203}],194:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.value=e}var i=e("ev-store");t.exports=n,n.prototype.hook=function(e,t){i(e)[t.substr(3)]=this.value},n.prototype.unhook=function(e,t){i(e)[t.substr(3)]=void 0}},{"ev-store":9}],195:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.value=e}t.exports=n,n.prototype.hook=function(e,t){e[t]!==this.value&&(e[t]=this.value)}},{}],196:[function(e,t,r){"use strict";function n(e,t,r,i){if("string"==typeof e)t.push(new l(e));else if("number"==typeof e)t.push(new l(String(e)));else if(o(e))t.push(e);else{if(!u(e)){if(null===e||void 0===e)return;throw s({foreignObject:e,parentVnode:{tagName:r,properties:i}})}for(var a=0;a<e.length;a++)n(e[a],t,r,i)}}function i(e){for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];if(m(r))continue;"ev-"===t.substr(0,3)&&(e[t]=b(r))}}function o(e){return p(e)||f(e)||d(e)||v(e)}function a(e){return"string"==typeof e||u(e)||o(e)}function s(e){var t=new Error;return t.type="virtual-hyperscript.unexpected.virtual-element",t.message="Unexpected virtual child passed to h().\nExpected a VNode / Vthunk / VWidget / string but:\ngot:\n"+c(e.foreignObject)+".\nThe parent vnode is:\n"+c(e.parentVnode),t.foreignObject=e.foreignObject,t.parentVnode=e.parentVnode,t}function c(e){try{return JSON.stringify(e,null,"    ")}catch(t){return String(e)}}var u=e("x-is-array"),h=e("../vnode/vnode.js"),l=e("../vnode/vtext.js"),p=e("../vnode/is-vnode"),f=e("../vnode/is-vtext"),d=e("../vnode/is-widget"),m=e("../vnode/is-vhook"),v=e("../vnode/is-thunk"),g=e("./parse-tag.js"),y=e("./hooks/soft-set-hook.js"),b=e("./hooks/ev-hook.js");t.exports=function(e,t,r){var o,s,c,u,l=[];return!r&&a(t)&&(r=t,s={}),s=s||t||{},o=g(e,s),s.hasOwnProperty("key")&&(c=s.key,s.key=void 0),s.hasOwnProperty("namespace")&&(u=s.namespace,s.namespace=void 0),"INPUT"!==o||u||!s.hasOwnProperty("value")||void 0===s.value||m(s.value)||(s.value=y(s.value)),i(s),void 0!==r&&null!==r&&n(r,l,o,s),new h(o,s,l,c,u)}},{"../vnode/is-thunk":199,"../vnode/is-vhook":200,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vnode.js":205,"../vnode/vtext.js":207,"./hooks/ev-hook.js":194,"./hooks/soft-set-hook.js":195,"./parse-tag.js":197,"x-is-array":228}],197:[function(e,t,r){"use strict";var n=e("browser-split"),i=/([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/,o=/^\.|#/;t.exports=function(e,t){if(!e)return"DIV";var r=!t.hasOwnProperty("id"),a=n(e,i),s=null;o.test(a[1])&&(s="DIV");var c,u,h,l;for(l=0;l<a.length;l++)(u=a[l])&&(h=u.charAt(0),s?"."===h?(c=c||[]).push(u.substring(1,u.length)):"#"===h&&r&&(t.id=u.substring(1,u.length)):s=u);return c&&(t.className&&c.push(t.className),t.className=c.join(" ")),t.namespace?s:s.toUpperCase()}},{"browser-split":5}],198:[function(e,t,r){function n(e,t){var r=e.vnode;if(r||(r=e.vnode=e.render(t)),!(i(r)||o(r)||a(r)))throw new Error("thunk did not return a valid node");return r}var i=e("./is-vnode"),o=e("./is-vtext"),a=e("./is-widget"),s=e("./is-thunk");t.exports=function(e,t){var r=e,i=t;return s(t)&&(i=n(t,e)),s(e)&&(r=n(e,null)),{a:r,b:i}}},{"./is-thunk":199,"./is-vnode":201,"./is-vtext":202,"./is-widget":203}],199:[function(e,t,r){t.exports=function(e){return e&&"Thunk"===e.type}},{}],200:[function(e,t,r){t.exports=function(e){return e&&("function"==typeof e.hook&&!e.hasOwnProperty("hook")||"function"==typeof e.unhook&&!e.hasOwnProperty("unhook"))}},{}],201:[function(e,t,r){var n=e("./version");t.exports=function(e){return e&&"VirtualNode"===e.type&&e.version===n}},{"./version":204}],202:[function(e,t,r){var n=e("./version");t.exports=function(e){return e&&"VirtualText"===e.type&&e.version===n}},{"./version":204}],203:[function(e,t,r){t.exports=function(e){return e&&"Widget"===e.type}},{}],204:[function(e,t,r){t.exports="2"},{}],205:[function(e,t,r){function n(e,t,r,n,i){this.tagName=e,this.properties=t||u,this.children=r||h,this.key=null!=n?String(n):void 0,this.namespace="string"==typeof i?i:null;var l,p=r&&r.length||0,f=0,d=!1,m=!1,v=!1;for(var g in t)if(t.hasOwnProperty(g)){var y=t[g];c(y)&&y.unhook&&(l||(l={}),l[g]=y)}for(var b=0;b<p;b++){var _=r[b];o(_)?(f+=_.count||0,!d&&_.hasWidgets&&(d=!0),!m&&_.hasThunks&&(m=!0),v||!_.hooks&&!_.descendantHooks||(v=!0)):!d&&a(_)?"function"==typeof _.destroy&&(d=!0):!m&&s(_)&&(m=!0)}this.count=p+f,this.hasWidgets=d,this.hasThunks=m,this.hooks=l,this.descendantHooks=v}var i=e("./version"),o=e("./is-vnode"),a=e("./is-widget"),s=e("./is-thunk"),c=e("./is-vhook");t.exports=n;var u={},h=[];n.prototype.version=i,n.prototype.type="VirtualNode"},{"./is-thunk":199,"./is-vhook":200,"./is-vnode":201,"./is-widget":203,"./version":204}],206:[function(e,t,r){function n(e,t,r){this.type=Number(e),this.vNode=t,this.patch=r}var i=e("./version");n.NONE=0,n.VTEXT=1,n.VNODE=2,n.WIDGET=3,n.PROPS=4,n.ORDER=5,n.INSERT=6,n.REMOVE=7,n.THUNK=8,t.exports=n,n.prototype.version=i,n.prototype.type="VirtualPatch"},{"./version":204}],207:[function(e,t,r){function n(e){this.text=String(e)}var i=e("./version");t.exports=n,n.prototype.version=i,n.prototype.type="VirtualText"},{"./version":204}],208:[function(e,t,r){function n(e,t){var r;for(var s in e){s in t||((r=r||{})[s]=void 0);var c=e[s],u=t[s];if(c!==u)if(o(c)&&o(u))if(i(u)!==i(c))(r=r||{})[s]=u;else if(a(u))(r=r||{})[s]=u;else{var h=n(c,u);h&&((r=r||{})[s]=h)}else(r=r||{})[s]=u}for(var l in t)l in e||((r=r||{})[l]=t[l]);return r}function i(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var o=e("is-object"),a=e("../vnode/is-vhook");t.exports=n},{"../vnode/is-vhook":200,"is-object":20}],209:[function(e,t,r){function n(e,t){var r={a:e};return i(e,t,r,0),r}function i(e,t,r,n){if(e!==t){var i=r[n],s=!1;if(x(e)||x(t))c(e,t,r,n);else if(null==t)_(e)||(a(e,r,n),i=r[n]),i=m(i,new g(g.REMOVE,e,t));else if(y(t))if(y(e))if(e.tagName===t.tagName&&e.namespace===t.namespace&&e.key===t.key){var u=S(e.properties,t.properties);u&&(i=m(i,new g(g.PROPS,e,u))),i=o(e,t,r,i,n)}else i=m(i,new g(g.VNODE,e,t)),s=!0;else i=m(i,new g(g.VNODE,e,t)),s=!0;else b(t)?b(e)?e.text!==t.text&&(i=m(i,new g(g.VTEXT,e,t))):(i=m(i,new g(g.VTEXT,e,t)),s=!0):_(t)&&(_(e)||(s=!0),i=m(i,new g(g.WIDGET,e,t)));i&&(r[n]=i),s&&a(e,r,n)}}function o(e,t,r,n,o){for(var a=e.children,s=p(a,t.children),c=s.children,u=a.length,h=c.length,l=u>h?u:h,f=0;f<l;f++){var d=a[f],v=c[f];o+=1,d?i(d,v,r,o):v&&(n=m(n,new g(g.INSERT,null,v))),y(d)&&d.count&&(o+=d.count)}return s.moves&&(n=m(n,new g(g.ORDER,e,s.moves))),n}function a(e,t,r){h(e,t,r),s(e,t,r)}function s(e,t,r){if(_(e))"function"==typeof e.destroy&&(t[r]=m(t[r],new g(g.REMOVE,e,null)));else if(y(e)&&(e.hasWidgets||e.hasThunks))for(var n=e.children,i=n.length,o=0;o<i;o++){var a=n[o];s(a,t,r+=1),y(a)&&a.count&&(r+=a.count)}else x(e)&&c(e,null,t,r)}function c(e,t,r,i){var o=w(e,t),a=n(o.a,o.b);u(a)&&(r[i]=new g(g.THUNK,null,a))}function u(e){for(var t in e)if("a"!==t)return!0;return!1}function h(e,t,r){if(y(e)){if(e.hooks&&(t[r]=m(t[r],new g(g.PROPS,e,l(e.hooks)))),e.descendantHooks||e.hasThunks)for(var n=e.children,i=n.length,o=0;o<i;o++){var a=n[o];h(a,t,r+=1),y(a)&&a.count&&(r+=a.count)}}else x(e)&&c(e,null,t,r)}function l(e){var t={};for(var r in e)t[r]=void 0;return t}function p(e,t){var r=d(t),n=r.keys,i=r.free;if(i.length===t.length)return{children:t,moves:null};var o=d(e),a=o.keys;if(o.free.length===e.length)return{children:t,moves:null};for(var s=[],c=0,u=i.length,h=0,l=0;l<e.length;l++){var p,m=e[l];m.key?n.hasOwnProperty(m.key)?(p=n[m.key],s.push(t[p])):(p=l-h++,s.push(null)):c<u?(p=i[c++],s.push(t[p])):(p=l-h++,s.push(null))}for(var v=c>=i.length?t.length:i[c],g=0;g<t.length;g++){var y=t[g];y.key?a.hasOwnProperty(y.key)||s.push(y):g>=v&&s.push(y)}for(var b,_=s.slice(),x=0,w=[],S=[],M=0;M<t.length;){var E=t[M];for(b=_[x];null===b&&_.length;)w.push(f(_,x,null)),b=_[x];b&&b.key===E.key?(x++,M++):E.key?(b&&b.key&&n[b.key]!==M+1?(w.push(f(_,x,b.key)),(b=_[x])&&b.key===E.key?x++:S.push({key:E.key,to:M})):S.push({key:E.key,to:M}),M++):b&&b.key&&w.push(f(_,x,b.key))}for(;x<_.length;)b=_[x],w.push(f(_,x,b&&b.key));return w.length!==h||S.length?{children:s,moves:{removes:w,inserts:S}}:{children:s,moves:null}}function f(e,t,r){return e.splice(t,1),{from:t,key:r}}function d(e){for(var t={},r=[],n=e.length,i=0;i<n;i++){var o=e[i];o.key?t[o.key]=i:r.push(i)}return{keys:t,free:r}}function m(e,t){return e?(v(e)?e.push(t):e=[e,t],e):t}var v=e("x-is-array"),g=e("../vnode/vpatch"),y=e("../vnode/is-vnode"),b=e("../vnode/is-vtext"),_=e("../vnode/is-widget"),x=e("../vnode/is-thunk"),w=e("../vnode/handle-thunk"),S=e("./diff-props");t.exports=n},{"../vnode/handle-thunk":198,"../vnode/is-thunk":199,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vpatch":206,"./diff-props":208,"x-is-array":228}],210:[function(e,t,r){!function(e){"use strict";e(function(e){return e("./makePromise")({scheduler:new(e("./Scheduler"))(e("./env").asap)})})}(function(r){t.exports=r(e)})},{"./Scheduler":211,"./env":223,"./makePromise":225}],211:[function(e,t,r){!function(e){"use strict";e(function(){function e(e){this._async=e,this._running=!1,this._queue=this,this._queueLen=0,this._afterQueue={},this._afterQueueLen=0;var t=this;this.drain=function(){t._drain()}}return e.prototype.enqueue=function(e){this._queue[this._queueLen++]=e,this.run()},e.prototype.afterQueue=function(e){this._afterQueue[this._afterQueueLen++]=e,this.run()},e.prototype.run=function(){this._running||(this._running=!0,this._async(this.drain))},e.prototype._drain=function(){for(var e=0;e<this._queueLen;++e)this._queue[e].run(),this._queue[e]=void 0;for(this._queueLen=0,this._running=!1,e=0;e<this._afterQueueLen;++e)this._afterQueue[e].run(),this._afterQueue[e]=void 0;this._afterQueueLen=0},e})}(function(e){t.exports=e()})},{}],212:[function(e,t,r){!function(e){"use strict";e(function(){function e(t){Error.call(this),this.message=t,this.name=e.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e})}(function(e){t.exports=e()})},{}],213:[function(e,t,r){!function(e){"use strict";e(function(){function e(e,r){function n(t,n){if(t.i<0)return r(t.f,t.thisArg,t.params,n);e._handler(t.args[t.i]).fold(i,t,void 0,n)}function i(e,t,r){e.params[e.i]=t,e.i-=1,n(e,r)}return arguments.length<2&&(r=t),function(t,i,o){var a=e._defer(),s=o.length;return n({f:t,thisArg:i,args:o,params:new Array(s),i:s-1,call:r},a._handler),a}}function t(e,t,r,n){try{n.resolve(e.apply(t,r))}catch(e){n.reject(e)}}return e.tryCatchResolve=t,e})}(function(e){t.exports=e()})},{}],214:[function(e,t,r){!function(e){"use strict";e(function(e){var t=e("../state"),r=e("../apply");return function(e){function n(t,r){for(var n=r.length,i=new Array(n),o=0,a=0;o<n;++o)r[o]&&(i[a++]=e._handler(t[o]).value);return i.length=a,i}function i(r){var n;return r instanceof e&&(n=r._handler.join()),n&&0===n.state()||!n?s(r).then(t.fulfilled,t.rejected):(n._unreport(),t.inspect(n))}function o(e){return function(t,r,n){return a(e,void 0,[t,r,n])}}var a=r(e),s=e.resolve,c=e.all,u=Array.prototype.reduce,h=Array.prototype.reduceRight,l=Array.prototype.slice;return e.any=function(t){for(var r,n,i=e._defer(),o=i._handler,a=t.length>>>0,s=a,c=[],u=0;u<a;++u)if(void 0!==(n=t[u])||u in t){if((r=e._handler(n)).state()>0){o.become(r),e._visitRemaining(t,u,r);break}r.visit(o,function(e){c=null,this.resolve(e)},function(e){this.resolved||(c.push(e),0==--s&&this.reject(c))})}else--s;return 0===s&&o.reject(new RangeError("any(): array must not be empty")),i},e.some=function(t,r){var n,i,o,a=e._defer(),s=a._handler,c=[],u=[],h=t.length>>>0,l=0;for(o=0;o<h;++o)(void 0!==(i=t[o])||o in t)&&++l;for(r=Math.max(r,0),n=l-r+1,r>(l=Math.min(r,l))?s.reject(new RangeError("some(): array must contain at least "+r+" item(s), but had "+l)):0===l&&s.resolve(c),o=0;o<h;++o)(void 0!==(i=t[o])||o in t)&&e._handler(i).visit(s,function(e){this.resolved||(c.push(e),0==--l&&(u=null,this.resolve(c)))},function(e){this.resolved||(u.push(e),0==--n&&(c=null,this.reject(u)))},s.notify);return a},e.settle=function(e){return c(e.map(i))},e.map=function(t,r){return e._traverse(r,t)},e.filter=function(t,r){var i=l.call(t);return e._traverse(r,i).then(function(e){return n(i,e)})},e.reduce=function(e,t){return arguments.length>2?u.call(e,o(t),arguments[2]):u.call(e,o(t))},e.reduceRight=function(e,t){return arguments.length>2?h.call(e,o(t),arguments[2]):h.call(e,o(t))},e.prototype.spread=function(e){return this.then(c).then(function(t){return e.apply(this,t)})},e}})}(function(r){t.exports=r(e)})},{"../apply":213,"../state":226}],215:[function(e,t,r){!function(e){"use strict";e(function(){function e(){throw new TypeError("catch predicate must be a function")}function t(e,t){return r(t)?e instanceof t:t(e)}function r(e){return e===Error||null!=e&&e.prototype instanceof Error}function n(e){return("object"==typeof e||"function"==typeof e)&&null!==e}function i(e){return e}return function(r){function o(e,r){return function(n){return t(n,r)?e.call(this,n):u(n)}}function a(e,t,r,i){var o=e.call(t);return n(o)?s(o,r,i):r(i)}function s(e,t,r){return c(e).then(function(){return t(r)})}var c=r.resolve,u=r.reject,h=r.prototype.catch;return r.prototype.done=function(e,t){this._handler.visit(this._handler.receiver,e,t)},r.prototype.catch=r.prototype.otherwise=function(t){return arguments.length<2?h.call(this,t):"function"!=typeof t?this.ensure(e):h.call(this,o(arguments[1],t))},r.prototype.finally=r.prototype.ensure=function(e){return"function"!=typeof e?this:this.then(function(t){return a(e,this,i,t)},function(t){return a(e,this,u,t)})},r.prototype.else=r.prototype.orElse=function(e){return this.then(void 0,function(){return e})},r.prototype.yield=function(e){return this.then(function(){return e})},r.prototype.tap=function(e){return this.then(e).yield(this)},r}})}(function(e){t.exports=e()})},{}],216:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.fold=function(t,r){var n=this._beget();return this._handler.fold(function(r,n,i){e._handler(r).fold(function(e,r,n){n.resolve(t.call(this,r,e))},n,this,i)},r,n._handler.receiver,n._handler),n},e}})}(function(e){t.exports=e()})},{}],217:[function(e,t,r){!function(e){"use strict";e(function(e){var t=e("../state").inspect;return function(e){return e.prototype.inspect=function(){return t(e._handler(this))},e}})}(function(r){t.exports=r(e)})},{"../state":226}],218:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){function t(e,n,i,o){function a(o,a){return r(i(o)).then(function(){return t(e,n,i,a)})}return r(o).then(function(t){return r(n(t)).then(function(n){return n?t:r(e(t)).spread(a)})})}var r=e.resolve;return e.iterate=function(e,r,n,i){return t(function(t){return[t,e(t)]},r,n,i)},e.unfold=t,e}})}(function(e){t.exports=e()})},{}],219:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.progress=function(e){return this.then(void 0,void 0,e)},e}})}(function(e){t.exports=e()})},{}],220:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e,t,n,i){return r.setTimer(function(){e(n,i,t)},t)}var r=e("../env"),n=e("../TimeoutError");return function(e){function i(e,r,n){t(o,e,r,n)}function o(e,t){t.resolve(e)}function a(e,t,r){var i=void 0===e?new n("timed out after "+r+"ms"):e;t.reject(i)}return e.prototype.delay=function(e){var t=this._beget();return this._handler.fold(i,e,void 0,t._handler),t},e.prototype.timeout=function(e,n){var i=this._beget(),o=i._handler,s=t(a,e,n,i._handler);return this._handler.visit(o,function(e){r.clearTimer(s),this.resolve(e)},function(e){r.clearTimer(s),this.reject(e)},o.notify),i},e}})}(function(r){t.exports=r(e)})},{"../TimeoutError":212,"../env":223}],221:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e){throw e}function r(){}var n=e("../env").setTimer,i=e("../format");return function(e){function o(e){e.handled||(f.push(e),h("Potentially unhandled rejection ["+e.id+"] "+i.formatError(e.value)))}function a(e){var t=f.indexOf(e);t>=0&&(f.splice(t,1),l("Handled previous rejection ["+e.id+"] "+i.formatObject(e.value)))}function s(e,t){p.push(e,t),null===d&&(d=n(c,0))}function c(){for(d=null;p.length>0;)p.shift()(p.shift())}var u,h=r,l=r;"undefined"!=typeof console&&(u=console,h=void 0!==u.error?function(e){u.error(e)}:function(e){u.log(e)},l=void 0!==u.info?function(e){u.info(e)}:function(e){u.log(e)}),e.onPotentiallyUnhandledRejection=function(e){s(o,e)},e.onPotentiallyUnhandledRejectionHandled=function(e){s(a,e)},e.onFatalRejection=function(e){s(t,e.value)};var p=[],f=[],d=null;return e}})}(function(r){t.exports=r(e)})},{"../env":223,"../format":224}],222:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.with=e.prototype.withThis=function(e){var t=this._beget(),r=t._handler;return r.receiver=e,this._handler.chain(r,e),t},e}})}(function(e){t.exports=e()})},{}],223:[function(e,t,r){(function(r){!function(e){"use strict";e(function(e){var t,n="undefined"!=typeof setTimeout&&setTimeout,i=function(e,t){return setTimeout(e,t)},o=function(e){return clearTimeout(e)},a=function(e){return n(e,0)};if(void 0!==r&&"[object process]"===Object.prototype.toString.call(r))a=function(e){return r.nextTick(e)};else if(t="undefined"!=typeof MutationObserver&&MutationObserver||"undefined"!=typeof WebKitMutationObserver&&WebKitMutationObserver)a=function(e){var t,r=document.createTextNode("");new e(function(){var e=t;t=void 0,e()}).observe(r,{characterData:!0});var n=0;return function(e){t=e,r.data=n^=1}}(t);else if(!n){var s=e("vertx");i=function(e,t){return s.setTimer(t,e)},o=s.cancelTimer,a=s.runOnLoop||s.runOnContext}return{setTimer:i,clearTimer:o,asap:a}})}(function(r){t.exports=r(e)})}).call(this,e("_process"))},{_process:6}],224:[function(e,t,r){!function(e){"use strict";e(function(){function e(e){var r=String(e);return"[object Object]"===r&&"undefined"!=typeof JSON&&(r=t(e,r)),r}function t(e,t){try{return JSON.stringify(e)}catch(e){return t}}return{formatError:function(t){var r="object"==typeof t&&null!==t&&(t.stack||t.message)?t.stack||t.message:e(t);return t instanceof Error?r:r+" (WARNING: non-Error used)"},formatObject:e,tryStringify:t}})}(function(e){t.exports=e()})},{}],225:[function(e,t,r){(function(e){!function(t){"use strict";t(function(){return function(t){function r(e,t){this._handler=e===v?t:n(e)}function n(e){function t(e){r.reject(e)}var r=new y;try{e(function(e){r.resolve(e)},t,function(e){r.notify(e)})}catch(e){t(e)}return r}function i(e){return A(e)?e:new r(v,new b(f(e)))}function o(e){return new r(v,new b(new w(e)))}function a(){return K}function s(e,t){return new t(v,new y(e.receiver,e.join().context))}function c(e,t,n){function i(e,t,r){h[e]=t,0==--c&&r.become(new x(h))}for(var o,a="function"==typeof t?function(r,o,a){a.resolved||u(n,i,r,e(t,o,r),a)}:i,s=new y,c=n.length>>>0,h=new Array(c),l=0;l<n.length&&!s.resolved;++l)void 0!==(o=n[l])||l in n?u(n,a,l,o,s):--c;return 0===c&&s.become(new x(h)),new r(v,s)}function u(e,t,r,n,i){if(R(n)){var o=d(n),a=o.state();0===a?o.fold(t,r,void 0,i):a>0?t(r,o.value,i):(i.become(o),h(e,r+1,o))}else t(r,n,i)}function h(e,t,r){for(var n=t;n<e.length;++n)l(f(e[n]),r)}function l(e,t){if(e!==t){var r=e.state();0===r?e.visit(e,void 0,e._unreport):r<0&&e._unreport()}}function p(e){var t,n,i,o=new y;for(t=0;t<e.length;++t)if(void 0!==(n=e[t])||t in e){if(0!==(i=f(n)).state()){o.become(i),h(e,t+1,i);break}i.visit(o,o.resolve,o.reject)}return new r(v,o)}function f(e){return A(e)?e._handler.join():R(e)?m(e):new x(e)}function d(e){return A(e)?e._handler.join():m(e)}function m(e){try{var t=e.then;return"function"==typeof t?new _(t,e):new x(e)}catch(e){return new w(e)}}function v(){}function g(){}function y(e,t){r.createContext(this,t),this.consumers=void 0,this.receiver=e,this.handler=void 0,this.resolved=!1}function b(e){this.handler=e}function _(e,t){y.call(this),H.enqueue(new O(e,t,this))}function x(e){r.createContext(this),this.value=e}function w(e){r.createContext(this),this.id=++Y,this.value=e,this.handled=!1,this.reported=!1,this._report()}function S(e,t){this.rejection=e,this.context=t}function M(e){this.rejection=e}function E(){return new w(new TypeError("Promise cycle"))}function C(e,t){this.continuation=e,this.handler=t}function T(e,t){this.handler=t,this.value=e}function O(e,t,r){this._then=e,this.thenable=t,this.resolver=r}function P(e,t,r,n,i){try{e.call(t,r,n,i)}catch(e){n(e)}}function j(e,t,r,n){this.f=e,this.z=t,this.c=r,this.to=n,this.resolver=X,this.receiver=this}function A(e){return e instanceof r}function R(e){return("object"==typeof e||"function"==typeof e)&&null!==e}function L(e,t,n,i){if("function"!=typeof e)return i.become(t);r.enterContext(t),k(e,t.value,n,i),r.exitContext()}function N(e,t,n,i,o){if("function"!=typeof e)return o.become(n);r.enterContext(n),B(e,t,n.value,i,o),r.exitContext()}function I(e,t,n,i,o){if("function"!=typeof e)return o.notify(t);r.enterContext(n),F(e,t,i,o),r.exitContext()}function D(e,t,r){try{return e(t,r)}catch(e){return o(e)}}function k(e,t,r,n){try{n.become(f(e.call(r,t)))}catch(e){n.become(new w(e))}}function B(e,t,r,n,i){try{e.call(n,t,r,i)}catch(e){i.become(new w(e))}}function F(e,t,r,n){try{n.notify(e.call(r,t))}catch(e){n.notify(e)}}function U(e,t){t.prototype=W(e.prototype),t.prototype.constructor=t}function z(e,t){return t}function $(){}function V(){if("function"==typeof CustomEvent)try{return new CustomEvent("unhandledRejection")instanceof CustomEvent}catch(e){}return!1}function G(){if("undefined"!=typeof document&&"function"==typeof document.createEvent)try{return document.createEvent("CustomEvent").initCustomEvent("eventType",!1,!0,{}),!0}catch(e){}return!1}var H=t.scheduler,q=void 0!==e&&null!==e&&"function"==typeof e.emit?function(t,r){return"unhandledRejection"===t?e.emit(t,r.value,r):e.emit(t,r)}:"undefined"!=typeof self&&V()?function(e,t){return function(r,n){var i=new t(r,{detail:{reason:n.value,key:n},bubbles:!1,cancelable:!0});return!e.dispatchEvent(i)}}(self,CustomEvent):"undefined"!=typeof self&&G()?function(e,t){return function(r,n){var i=t.createEvent("CustomEvent");return i.initCustomEvent(r,!1,!0,{reason:n.value,key:n}),!e.dispatchEvent(i)}}(self,document):$,W=Object.create||function(e){function t(){}return t.prototype=e,new t};r.resolve=i,r.reject=o,r.never=a,r._defer=function(){return new r(v,new y)},r._handler=f,r.prototype.then=function(e,t,r){var n=this._handler,i=n.join().state();if("function"!=typeof e&&i>0||"function"!=typeof t&&i<0)return new this.constructor(v,n);var o=this._beget(),a=o._handler;return n.chain(a,n.receiver,e,t,r),o},r.prototype.catch=function(e){return this.then(void 0,e)},r.prototype._beget=function(){return s(this._handler,this.constructor)},r.all=function(e){return c(z,null,e)},r.race=function(e){return"object"!=typeof e||null===e?o(new TypeError("non-iterable passed to race()")):0===e.length?a():1===e.length?i(e[0]):p(e)},r._traverse=function(e,t){return c(D,e,t)},r._visitRemaining=h,v.prototype.when=v.prototype.become=v.prototype.notify=v.prototype.fail=v.prototype._unreport=v.prototype._report=$,v.prototype._state=0,v.prototype.state=function(){return this._state},v.prototype.join=function(){for(var e=this;void 0!==e.handler;)e=e.handler;return e},v.prototype.chain=function(e,t,r,n,i){this.when({resolver:e,receiver:t,fulfilled:r,rejected:n,progress:i})},v.prototype.visit=function(e,t,r,n){this.chain(X,e,t,r,n)},v.prototype.fold=function(e,t,r,n){this.when(new j(e,t,r,n))},U(v,g),g.prototype.become=function(e){e.fail()};var X=new g;U(v,y),y.prototype._state=0,y.prototype.resolve=function(e){this.become(f(e))},y.prototype.reject=function(e){this.resolved||this.become(new w(e))},y.prototype.join=function(){if(!this.resolved)return this;for(var e=this;void 0!==e.handler;)if((e=e.handler)===this)return this.handler=E();return e},y.prototype.run=function(){var e=this.consumers,t=this.handler;this.handler=this.handler.join(),this.consumers=void 0;for(var r=0;r<e.length;++r)t.when(e[r])},y.prototype.become=function(e){this.resolved||(this.resolved=!0,this.handler=e,void 0!==this.consumers&&H.enqueue(this),void 0!==this.context&&e._report(this.context))},y.prototype.when=function(e){this.resolved?H.enqueue(new C(e,this.handler)):void 0===this.consumers?this.consumers=[e]:this.consumers.push(e)},y.prototype.notify=function(e){this.resolved||H.enqueue(new T(e,this))},y.prototype.fail=function(e){var t=void 0===e?this.context:e;this.resolved&&this.handler.join().fail(t)},y.prototype._report=function(e){this.resolved&&this.handler.join()._report(e)},y.prototype._unreport=function(){this.resolved&&this.handler.join()._unreport()},U(v,b),b.prototype.when=function(e){H.enqueue(new C(e,this))},b.prototype._report=function(e){this.join()._report(e)},b.prototype._unreport=function(){this.join()._unreport()},U(y,_),U(v,x),x.prototype._state=1,x.prototype.fold=function(e,t,r,n){N(e,t,this,r,n)},x.prototype.when=function(e){L(e.fulfilled,this,e.receiver,e.resolver)};var Y=0;U(v,w),w.prototype._state=-1,w.prototype.fold=function(e,t,r,n){n.become(this)},w.prototype.when=function(e){"function"==typeof e.rejected&&this._unreport(),L(e.rejected,this,e.receiver,e.resolver)},w.prototype._report=function(e){H.afterQueue(new S(this,e))},w.prototype._unreport=function(){this.handled||(this.handled=!0,H.afterQueue(new M(this)))},w.prototype.fail=function(e){this.reported=!0,q("unhandledRejection",this),r.onFatalRejection(this,void 0===e?this.context:e)},S.prototype.run=function(){this.rejection.handled||this.rejection.reported||(this.rejection.reported=!0,q("unhandledRejection",this.rejection)||r.onPotentiallyUnhandledRejection(this.rejection,this.context))},M.prototype.run=function(){this.rejection.reported&&(q("rejectionHandled",this.rejection)||r.onPotentiallyUnhandledRejectionHandled(this.rejection))},r.createContext=r.enterContext=r.exitContext=r.onPotentiallyUnhandledRejection=r.onPotentiallyUnhandledRejectionHandled=r.onFatalRejection=$;var K=new r(v,new v);return C.prototype.run=function(){this.handler.join().when(this.continuation)},T.prototype.run=function(){var e=this.handler.consumers;if(void 0!==e)for(var t,r=0;r<e.length;++r)I((t=e[r]).progress,this.value,this.handler,t.receiver,t.resolver)},O.prototype.run=function(){var e=this.resolver;P(this._then,this.thenable,function(t){e.resolve(t)},function(t){e.reject(t)},function(t){e.notify(t)})},j.prototype.fulfilled=function(e){this.f.call(this.c,this.z,e,this.to)},j.prototype.rejected=function(e){this.to.reject(e)},j.prototype.progress=function(e){this.to.notify(e)},r}})}(function(e){t.exports=e()})}).call(this,e("_process"))},{_process:6}],226:[function(e,t,r){!function(e){"use strict";e(function(){function e(){return{state:"pending"}}function t(e){return{state:"rejected",reason:e}}function r(e){return{state:"fulfilled",value:e}}return{pending:e,fulfilled:r,rejected:t,inspect:function(n){var i=n.state();return 0===i?e():i>0?r(n.value):t(n.value)}}})}(function(e){t.exports=e()})},{}],227:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e,t,r,n){var i=m.resolve(e);return arguments.length<2?i:i.then(t,r,n)}function r(e){return function(){for(var t=0,r=arguments.length,n=new Array(r);t<r;++t)n[t]=arguments[t];return v(e,this,n)}}function n(e){for(var t=0,r=arguments.length-1,n=new Array(r);t<r;++t)n[t]=arguments[t+1];return v(e,this,n)}function i(){function e(e){n._handler.resolve(e)}function t(e){n._handler.reject(e)}function r(e){n._handler.notify(e)}var n=m._defer();this.promise=n,this.resolve=e,this.reject=t,this.notify=r,this.resolver={resolve:e,reject:t,notify:r}}var o=e("./lib/decorators/timed"),a=e("./lib/decorators/array"),s=e("./lib/decorators/flow"),c=e("./lib/decorators/fold"),u=e("./lib/decorators/inspect"),h=e("./lib/decorators/iterate"),l=e("./lib/decorators/progress"),p=e("./lib/decorators/with"),f=e("./lib/decorators/unhandledRejection"),d=e("./lib/TimeoutError"),m=[a,s,c,h,l,u,p,o,f].reduce(function(e,t){return t(e)},e("./lib/Promise")),v=e("./lib/apply")(m);return t.promise=function(e){return new m(e)},t.resolve=m.resolve,t.reject=m.reject,t.lift=r,t.try=n,t.attempt=n,t.iterate=m.iterate,t.unfold=m.unfold,t.join=function(){return m.all(arguments)},t.all=function(e){return t(e,m.all)},t.settle=function(e){return t(e,m.settle)},t.any=r(m.any),t.some=r(m.some),t.race=r(m.race),t.map=function(e,r){return t(e,function(e){return m.map(e,r)})},t.filter=function(e,r){return t(e,function(e){return m.filter(e,r)})},t.reduce=r(m.reduce),t.reduceRight=r(m.reduceRight),t.isPromiseLike=function(e){return e&&"function"==typeof e.then},t.Promise=m,t.defer=function(){return new i},t.TimeoutError=d,t})}(function(r){t.exports=r(e)})},{"./lib/Promise":210,"./lib/TimeoutError":212,"./lib/apply":213,"./lib/decorators/array":214,"./lib/decorators/flow":215,"./lib/decorators/fold":216,"./lib/decorators/inspect":217,"./lib/decorators/iterate":218,"./lib/decorators/progress":219,"./lib/decorators/timed":220,"./lib/decorators/unhandledRejection":221,"./lib/decorators/with":222}],228:[function(e,t,r){var n=Array.isArray,i=Object.prototype.toString;t.exports=n||function(e){return"[object Array]"===i.call(e)}},{}],229:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./api/APIv3");r.APIv3=n.APIv3;var i=e("./api/ModelCreator");r.ModelCreator=i.ModelCreator},{"./api/APIv3":242,"./api/ModelCreator":243}],230:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./component/Component");r.Component=n.Component;var i=e("./component/ComponentService");r.ComponentService=i.ComponentService;var o=e("./component/utils/HandlerBase");r.HandlerBase=o.HandlerBase;var a=e("./component/AttributionComponent");r.AttributionComponent=a.AttributionComponent;var s=e("./component/BackgroundComponent");r.BackgroundComponent=s.BackgroundComponent;var c=e("./component/BearingComponent");r.BearingComponent=c.BearingComponent;var u=e("./component/CacheComponent");r.CacheComponent=u.CacheComponent;var h=e("./component/CoverComponent");r.CoverComponent=h.CoverComponent;var l=e("./component/DebugComponent");r.DebugComponent=l.DebugComponent;var p=e("./component/direction/DirectionComponent");r.DirectionComponent=p.DirectionComponent;var f=e("./component/direction/DirectionDOMCalculator");r.DirectionDOMCalculator=f.DirectionDOMCalculator;var d=e("./component/direction/DirectionDOMRenderer");r.DirectionDOMRenderer=d.DirectionDOMRenderer;var m=e("./component/ImageComponent");r.ImageComponent=m.ImageComponent;var v=e("./component/keyboard/KeyboardComponent");r.KeyboardComponent=v.KeyboardComponent;var g=e("./component/keyboard/KeyZoomHandler");r.KeyZoomHandler=g.KeyZoomHandler;var y=e("./component/keyboard/KeySequenceNavigationHandler");r.KeySequenceNavigationHandler=y.KeySequenceNavigationHandler;var b=e("./component/keyboard/KeySpatialNavigationHandler");r.KeySpatialNavigationHandler=b.KeySpatialNavigationHandler;var _=e("./component/LoadingComponent");r.LoadingComponent=_.LoadingComponent;var x=e("./component/marker/marker/Marker");r.Marker=x.Marker;var w=e("./component/marker/MarkerComponent");r.MarkerComponent=w.MarkerComponent;var S=e("./component/marker/MarkerScene");r.MarkerScene=S.MarkerScene;var M=e("./component/marker/MarkerSet");r.MarkerSet=M.MarkerSet;var E=e("./component/mouse/MouseComponent");r.MouseComponent=E.MouseComponent;var C=e("./component/mouse/BounceHandler");r.BounceHandler=C.BounceHandler;var T=e("./component/mouse/DragPanHandler");r.DragPanHandler=T.DragPanHandler;var O=e("./component/mouse/DoubleClickZoomHandler");r.DoubleClickZoomHandler=O.DoubleClickZoomHandler;var P=e("./component/mouse/ScrollZoomHandler");r.ScrollZoomHandler=P.ScrollZoomHandler;var j=e("./component/mouse/TouchZoomHandler");r.TouchZoomHandler=j.TouchZoomHandler;var A=e("./component/popup/popup/Popup");r.Popup=A.Popup;var R=e("./component/popup/PopupComponent");r.PopupComponent=R.PopupComponent;var L=e("./component/NavigationComponent");r.NavigationComponent=L.NavigationComponent;var N=e("./component/RouteComponent");r.RouteComponent=N.RouteComponent;var I=e("./component/sequence/SequenceComponent");r.SequenceComponent=I.SequenceComponent;var D=e("./component/sequence/SequenceDOMRenderer");r.SequenceDOMRenderer=D.SequenceDOMRenderer;var k=e("./component/sequence/SequenceDOMInteraction");r.SequenceDOMInteraction=k.SequenceDOMInteraction;var B=e("./component/imageplane/ImagePlaneComponent");r.ImagePlaneComponent=B.ImagePlaneComponent;var F=e("./component/imageplane/ImagePlaneFactory");r.ImagePlaneFactory=F.ImagePlaneFactory;var U=e("./component/imageplane/ImagePlaneGLRenderer");r.ImagePlaneGLRenderer=U.ImagePlaneGLRenderer;var z=e("./component/imageplane/ImagePlaneScene");r.ImagePlaneScene=z.ImagePlaneScene;var $=e("./component/imageplane/ImagePlaneShaders");r.ImagePlaneShaders=$.ImagePlaneShaders;var V=e("./component/marker/marker/SimpleMarker");r.SimpleMarker=V.SimpleMarker;var G=e("./component/marker/marker/CircleMarker");r.CircleMarker=G.CircleMarker;var H=e("./component/imageplane/SliderComponent");r.SliderComponent=H.SliderComponent;var q=e("./component/StatsComponent");r.StatsComponent=q.StatsComponent;var W=e("./component/tag/handlers/TagHandlerBase");r.TagHandlerBase=W.TagHandlerBase;var X=e("./component/tag/handlers/CreateHandlerBase");r.CreateHandlerBase=X.CreateHandlerBase;var Y=e("./component/tag/handlers/CreatePointHandler");r.CreatePointHandler=Y.CreatePointHandler;var K=e("./component/tag/handlers/CreateVertexHandler");r.CreateVertexHandler=K.CreateVertexHandler;var Z=e("./component/tag/handlers/CreatePolygonHandler");r.CreatePolygonHandler=Z.CreatePolygonHandler;var J=e("./component/tag/handlers/CreateRectHandler");r.CreateRectHandler=J.CreateRectHandler;var Q=e("./component/tag/handlers/CreateRectDragHandler");r.CreateRectDragHandler=Q.CreateRectDragHandler;var ee=e("./component/tag/handlers/EditVertexHandler");r.EditVertexHandler=ee.EditVertexHandler;var te=e("./component/tag/tag/Tag");r.Tag=te.Tag;var re=e("./component/tag/tag/OutlineTag");r.OutlineTag=re.OutlineTag;var ne=e("./component/tag/tag/RenderTag");r.RenderTag=ne.RenderTag;var ie=e("./component/tag/tag/OutlineRenderTag");r.OutlineRenderTag=ie.OutlineRenderTag;var oe=e("./component/tag/tag/OutlineCreateTag");r.OutlineCreateTag=oe.OutlineCreateTag;var ae=e("./component/tag/tag/SpotTag");r.SpotTag=ae.SpotTag;var se=e("./component/tag/tag/SpotRenderTag");r.SpotRenderTag=se.SpotRenderTag;var ce=e("./component/tag/TagComponent");r.TagComponent=ce.TagComponent;var ue=e("./component/tag/TagCreator");r.TagCreator=ue.TagCreator;var he=e("./component/tag/TagDOMRenderer");r.TagDOMRenderer=he.TagDOMRenderer;var le=e("./component/tag/TagMode");r.TagMode=le.TagMode;var pe=e("./component/tag/TagOperation");r.TagOperation=pe.TagOperation;var fe=e("./component/tag/TagScene");r.TagScene=fe.TagScene;var de=e("./component/tag/TagSet");r.TagSet=de.TagSet;var me=e("./component/tag/geometry/Geometry");r.Geometry=me.Geometry;var ve=e("./component/tag/geometry/VertexGeometry");r.VertexGeometry=ve.VertexGeometry;var ge=e("./component/tag/geometry/RectGeometry");r.RectGeometry=ge.RectGeometry;var ye=e("./component/tag/geometry/PointGeometry");r.PointGeometry=ye.PointGeometry;var be=e("./component/tag/geometry/PolygonGeometry");r.PolygonGeometry=be.PolygonGeometry;var _e=e("./component/tag/error/GeometryTagError");r.GeometryTagError=_e.GeometryTagError,function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./component/interfaces/interfaces"))},{"./component/AttributionComponent":244,"./component/BackgroundComponent":245,"./component/BearingComponent":246,"./component/CacheComponent":247,"./component/Component":248,"./component/ComponentService":249,"./component/CoverComponent":250,"./component/DebugComponent":251,"./component/ImageComponent":252,"./component/LoadingComponent":253,"./component/NavigationComponent":254,"./component/RouteComponent":255,"./component/StatsComponent":256,"./component/direction/DirectionComponent":257,"./component/direction/DirectionDOMCalculator":258,"./component/direction/DirectionDOMRenderer":259,"./component/imageplane/ImagePlaneComponent":260,"./component/imageplane/ImagePlaneFactory":261,"./component/imageplane/ImagePlaneGLRenderer":262,"./component/imageplane/ImagePlaneScene":263,"./component/imageplane/ImagePlaneShaders":264,"./component/imageplane/SliderComponent":265,"./component/interfaces/interfaces":267,"./component/keyboard/KeySequenceNavigationHandler":268,"./component/keyboard/KeySpatialNavigationHandler":269,"./component/keyboard/KeyZoomHandler":270,"./component/keyboard/KeyboardComponent":271,"./component/marker/MarkerComponent":273,"./component/marker/MarkerScene":274,"./component/marker/MarkerSet":275,"./component/marker/marker/CircleMarker":276,"./component/marker/marker/Marker":277,"./component/marker/marker/SimpleMarker":278,"./component/mouse/BounceHandler":279,"./component/mouse/DoubleClickZoomHandler":280,"./component/mouse/DragPanHandler":281,"./component/mouse/MouseComponent":282,"./component/mouse/ScrollZoomHandler":283,"./component/mouse/TouchZoomHandler":284,"./component/popup/PopupComponent":286,"./component/popup/popup/Popup":287,"./component/sequence/SequenceComponent":288,"./component/sequence/SequenceDOMInteraction":289,"./component/sequence/SequenceDOMRenderer":290,"./component/tag/TagComponent":292,"./component/tag/TagCreator":293,"./component/tag/TagDOMRenderer":294,"./component/tag/TagMode":295,"./component/tag/TagOperation":296,"./component/tag/TagScene":297,"./component/tag/TagSet":298,"./component/tag/error/GeometryTagError":299,"./component/tag/geometry/Geometry":300,"./component/tag/geometry/PointGeometry":301,"./component/tag/geometry/PolygonGeometry":302,"./component/tag/geometry/RectGeometry":303,"./component/tag/geometry/VertexGeometry":304,"./component/tag/handlers/CreateHandlerBase":305,"./component/tag/handlers/CreatePointHandler":306,"./component/tag/handlers/CreatePolygonHandler":307,"./component/tag/handlers/CreateRectDragHandler":308,"./component/tag/handlers/CreateRectHandler":309,"./component/tag/handlers/CreateVertexHandler":310,"./component/tag/handlers/EditVertexHandler":311,"./component/tag/handlers/TagHandlerBase":312,"./component/tag/tag/OutlineCreateTag":313,"./component/tag/tag/OutlineRenderTag":314,"./component/tag/tag/OutlineTag":315,"./component/tag/tag/RenderTag":316,"./component/tag/tag/SpotRenderTag":317,"./component/tag/tag/SpotTag":318,"./component/tag/tag/Tag":319,"./component/utils/HandlerBase":320}],231:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./graph/edge/EdgeDirection");r.EdgeDirection=n.EdgeDirection;var i=e("./graph/edge/EdgeCalculatorSettings");r.EdgeCalculatorSettings=i.EdgeCalculatorSettings;var o=e("./graph/edge/EdgeCalculatorDirections");r.EdgeCalculatorDirections=o.EdgeCalculatorDirections;var a=e("./graph/edge/EdgeCalculatorCoefficients");r.EdgeCalculatorCoefficients=a.EdgeCalculatorCoefficients;var s=e("./graph/edge/EdgeCalculator");r.EdgeCalculator=s.EdgeCalculator},{"./graph/edge/EdgeCalculator":338,"./graph/edge/EdgeCalculatorCoefficients":339,"./graph/edge/EdgeCalculatorDirections":340,"./graph/edge/EdgeCalculatorSettings":341,"./graph/edge/EdgeDirection":342}],232:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./error/ArgumentMapillaryError");r.ArgumentMapillaryError=n.ArgumentMapillaryError;var i=e("./error/GraphMapillaryError");r.GraphMapillaryError=i.GraphMapillaryError;var o=e("./error/MapillaryError");r.MapillaryError=o.MapillaryError},{"./error/ArgumentMapillaryError":321,"./error/GraphMapillaryError":322,"./error/MapillaryError":323}],233:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./geo/Camera");r.Camera=n.Camera;var i=e("./geo/GeoCoords");r.GeoCoords=i.GeoCoords;var o=e("./geo/ViewportCoords");r.ViewportCoords=o.ViewportCoords;var a=e("./geo/Spatial");r.Spatial=a.Spatial;var s=e("./geo/Transform");r.Transform=s.Transform},{"./geo/Camera":324,"./geo/GeoCoords":325,"./geo/Spatial":326,"./geo/Transform":327,"./geo/ViewportCoords":328}],234:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./graph/FilterCreator");r.FilterCreator=n.FilterCreator;var i=e("./graph/Graph");r.Graph=i.Graph;var o=e("./graph/GraphCalculator");r.GraphCalculator=o.GraphCalculator;var a=e("./graph/GraphService");r.GraphService=a.GraphService;var s=e("./graph/ImageLoadingService");r.ImageLoadingService=s.ImageLoadingService;var c=e("./graph/MeshReader");r.MeshReader=c.MeshReader;var u=e("./graph/Node");r.Node=u.Node;var h=e("./graph/NodeCache");r.NodeCache=h.NodeCache;var l=e("./graph/Sequence");r.Sequence=l.Sequence},{"./graph/FilterCreator":329,"./graph/Graph":330,"./graph/GraphCalculator":331,"./graph/GraphService":332,"./graph/ImageLoadingService":333,"./graph/MeshReader":334,"./graph/Node":335,"./graph/NodeCache":336,"./graph/Sequence":337}],235:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./Support"));var n=e("./Edge");r.EdgeDirection=n.EdgeDirection;var i=e("./Render");r.RenderMode=i.RenderMode;var o=e("./Viewer");r.Alignment=o.Alignment,r.ImageSize=o.ImageSize,r.Viewer=o.Viewer;var a=e("./component/tag/Tag");r.TagComponent=a;var s=e("./component/marker/Marker");r.MarkerComponent=s;var c=e("./component/popup/Popup");r.PopupComponent=c},{"./Edge":231,"./Render":236,"./Support":238,"./Viewer":241,"./component/marker/Marker":272,"./component/popup/Popup":285,"./component/tag/Tag":291}],236:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./render/DOMRenderer");r.DOMRenderer=n.DOMRenderer;var i=e("./render/GLRenderer");r.GLRenderer=i.GLRenderer;var o=e("./render/GLRenderStage");r.GLRenderStage=o.GLRenderStage;var a=e("./render/RenderCamera");r.RenderCamera=a.RenderCamera;var s=e("./render/RenderMode");r.RenderMode=s.RenderMode;var c=e("./render/RenderService");r.RenderService=c.RenderService},{"./render/DOMRenderer":343,"./render/GLRenderStage":344,"./render/GLRenderer":345,"./render/RenderCamera":346,"./render/RenderMode":347,"./render/RenderService":348}],237:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./state/State");r.State=n.State;var i=e("./state/states/StateBase");r.StateBase=i.StateBase;var o=e("./state/StateContext");r.StateContext=o.StateContext;var a=e("./state/StateService");r.StateService=a.StateService;var s=e("./state/states/TraversingState");r.TraversingState=s.TraversingState;var c=e("./state/states/WaitingState");r.WaitingState=c.WaitingState},{"./state/State":349,"./state/StateContext":350,"./state/StateService":351,"./state/states/StateBase":352,"./state/states/TraversingState":353,"./state/states/WaitingState":354}],238:[function(e,t,r){"use strict";function n(){return i.isBrowser()&&i.isArraySupported()&&i.isFunctionSupported()&&i.isJSONSupported()&&i.isObjectSupported()}Object.defineProperty(r,"__esModule",{value:!0});var i=e("./utils/Support");r.isSupported=function(){return n()&&i.isWebGLSupportedCached()},r.isFallbackSupported=n},{"./utils/Support":362}],239:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./tiles/ImageTileLoader");r.ImageTileLoader=n.ImageTileLoader;var i=e("./tiles/ImageTileStore");r.ImageTileStore=i.ImageTileStore;var o=e("./tiles/TextureProvider");r.TextureProvider=o.TextureProvider;var a=e("./tiles/RegionOfInterestCalculator");r.RegionOfInterestCalculator=a.RegionOfInterestCalculator},{"./tiles/ImageTileLoader":355,"./tiles/ImageTileStore":356,"./tiles/RegionOfInterestCalculator":357,"./tiles/TextureProvider":358}],240:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./utils/DOM");r.DOM=n.DOM;var i=e("./utils/EventEmitter");r.EventEmitter=i.EventEmitter;var o=e("./utils/Settings");r.Settings=o.Settings,function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./utils/Support"));var a=e("./utils/Urls");r.Urls=a.Urls},{"./utils/DOM":359,"./utils/EventEmitter":360,"./utils/Settings":361,"./utils/Support":362,"./utils/Urls":363}],241:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./viewer/Alignment");r.Alignment=n.Alignment;var i=e("./viewer/CacheService");r.CacheService=i.CacheService;var o=e("./viewer/ComponentController");r.ComponentController=o.ComponentController;var a=e("./viewer/Container");r.Container=a.Container;var s=e("./viewer/Observer");r.Observer=s.Observer;var c=e("./viewer/ImageSize");r.ImageSize=c.ImageSize;var u=e("./viewer/KeyboardService");r.KeyboardService=u.KeyboardService;var h=e("./viewer/LoadingService");r.LoadingService=h.LoadingService;var l=e("./viewer/MouseService");r.MouseService=l.MouseService;var p=e("./viewer/Navigator");r.Navigator=p.Navigator;var f=e("./viewer/Projection");r.Projection=f.Projection;var d=e("./viewer/SpriteService");r.SpriteService=d.SpriteService;var m=e("./viewer/TouchService");r.TouchService=m.TouchService;var v=e("./viewer/Viewer");r.Viewer=v.Viewer},{"./viewer/Alignment":364,"./viewer/CacheService":365,"./viewer/ComponentController":366,"./viewer/Container":367,"./viewer/ImageSize":368,"./viewer/KeyboardService":369,"./viewer/LoadingService":370,"./viewer/MouseService":371,"./viewer/Navigator":372,"./viewer/Observer":373,"./viewer/Projection":374,"./viewer/SpriteService":375,"./viewer/TouchService":376,"./viewer/Viewer":377}],242:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable");e("rxjs/add/observable/defer"),e("rxjs/add/observable/fromPromise"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/map");var i=e("../API"),o=function(){function e(e,t,r){this._clientId=e,this._modelCreator=null!=r?r:new i.ModelCreator,this._model=this._modelCreator.createModel(e,t),this._pageCount=999,this._pathImageByKey="imageByKey",this._pathImageCloseTo="imageCloseTo",this._pathImagesByH="imagesByH",this._pathImageViewAdd="imageViewAdd",this._pathSequenceByKey="sequenceByKey",this._pathSequenceViewAdd="sequenceViewAdd",this._propertiesCore=["cl","l","sequence"],this._propertiesFill=["captured_at","user","project"],this._propertiesKey=["key"],this._propertiesSequence=["keys"],this._propertiesSpatial=["atomic_scale","ca","calt","cca","cfocal","gpano","height","merge_cc","merge_version","c_rotation","orientation","width"],this._propertiesUser=["username"]}return e.prototype.imageByKeyFill$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageByKey,e,this._propertiesKey.concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(t){if(!t)throw new Error("Images ("+e.join(", ")+") could not be found.");return t.json.imageByKey}),this._pathImageByKey,e)},e.prototype.imageByKeyFull$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageByKey,e,this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(t){if(!t)throw new Error("Images ("+e.join(", ")+") could not be found.");return t.json.imageByKey}),this._pathImageByKey,e)},e.prototype.imageCloseTo$=function(e,t){var r=t+":"+e;return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageCloseTo,[r],this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(e){return null!=e?e.json.imageCloseTo[r]:null}),this._pathImageCloseTo,[r])},e.prototype.imagesByH$=function(e){var t=this;return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImagesByH,e,{from:0,to:this._pageCount},this._propertiesKey.concat(this._propertiesCore),this._propertiesKey])).map(function(r){if(null==r){r={json:{imagesByH:{}}};for(var n=0,i=e;n<i.length;n++){var o=i[n];r.json.imagesByH[o]={};for(var a=0;a<=t._pageCount;a++)r.json.imagesByH[o][a]=null}}return r.json.imagesByH}),this._pathImagesByH,e)},e.prototype.imageViewAdd$=function(e){return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathImageViewAdd],[e])),this._pathImageViewAdd,e)},e.prototype.invalidateImageByKey=function(e){this._invalidateGet(this._pathImageByKey,e)},e.prototype.invalidateImagesByH=function(e){this._invalidateGet(this._pathImagesByH,e)},e.prototype.invalidateSequenceByKey=function(e){this._invalidateGet(this._pathSequenceByKey,e)},e.prototype.setToken=function(e){this._model.invalidate([]),this._model=null,this._model=this._modelCreator.createModel(this._clientId,e)},e.prototype.sequenceByKey$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathSequenceByKey,e,this._propertiesKey.concat(this._propertiesSequence)])).map(function(e){return e.json.sequenceByKey}),this._pathSequenceByKey,e)},e.prototype.sequenceViewAdd$=function(e){return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd],[e])),this._pathSequenceViewAdd,e)},Object.defineProperty(e.prototype,"clientId",{get:function(){return this._clientId},enumerable:!0,configurable:!0}),e.prototype._catchInvalidateGet$=function(e,t,r){var n=this;return e.catch(function(e){throw n._invalidateGet(t,r),e})},e.prototype._catchInvalidateCall$=function(e,t,r){var n=this;return e.catch(function(e){throw n._invalidateCall(t,r),e})},e.prototype._invalidateGet=function(e,t){this._model.invalidate([e,t])},e.prototype._invalidateCall=function(e,t){this._model.invalidate([e],[t])},e.prototype._wrapPromise$=function(e){return n.Observable.defer(function(){return n.Observable.fromPromise(e)})},e}();r.APIv3=o,r.default=o},{"../API":229,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],243:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("falcor"),i=e("falcor-http-datasource"),o=e("../Utils"),a=function(){function e(){}return e.prototype.createModel=function(e,t){var r={crossDomain:!0,withCredentials:!1};return null!=t&&(r.headers={Authorization:"Bearer "+t}),new n.Model({maxSize:16777216,source:new i(o.Urls.falcorModel(e),r)})},e}();r.ModelCreator=a,r.default=a},{"../Utils":240,falcor:15,"falcor-http-datasource":10}],244:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._disposable=this._navigator.stateService.currentNode$.map(function(t){return{name:e._name,vnode:e._getAttributionNode(t.username,t.key)}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getAttributionNode=function(e,t){return i.h("div.Attribution",{},[i.h("a",{href:"https://www.mapillary.com/app/user/"+e,target:"_blank",textContent:"@"+e},[]),i.h("span",{textContent:"|"},[]),i.h("a",{href:"https://www.mapillary.com/app/?pKey="+t+"&focus=photo",target:"_blank",textContent:"mapillary.com"},[])])},t.componentName="attribution",t}(o.Component);r.AttributionComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":230,"virtual-dom":186}],245:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){this._container.domRenderer.render$.next({name:this._name,vnode:this._getBackgroundNode("The viewer can't display the given photo.")})},t.prototype._deactivate=function(){},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getBackgroundNode=function(e){return i.h("div.BackgroundWrapper",{},[i.h("p",{textContent:e},[])])},t.componentName="background",t}(o.Component);r.BackgroundComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":230,"virtual-dom":186}],246:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable"),a=e("../Component"),s=e("../Geo"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._spatial=new s.Spatial,i._svgNamespace="http://www.w3.org/2000/svg",i._distinctThreshold=Math.PI/90,i}return n(t,e),t.prototype._activate=function(){var e=this,t=this._navigator.stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).map(function(t){var r=t.state.currentNode,n=t.state.currentTransform;if(r.pano){var i=2*Math.PI*r.gpano.CroppedAreaImageWidthPixels/r.gpano.FullPanoWidthPixels;return[e._spatial.degToRad(r.ca),i]}var o=Math.max(n.basicWidth,n.basicHeight);o<=0&&console.warn("Original image size ("+n.basicWidth+", "+n.basicHeight+") is invalid ("+r.key+". Not showing available fov.");var a=o>0?2*Math.atan(.5*n.basicWidth/(o*n.focal)):0;return[e._spatial.degToRad(r.ca),a]}).distinctUntilChanged(function(t,r){return Math.abs(r[0]-t[0])<e._distinctThreshold&&Math.abs(r[1]-t[1])<e._distinctThreshold}),r=this._container.renderService.renderCamera$.map(function(t){var r=e._spatial.degToRad(t.perspective.fov),n=t.perspective.aspect===Number.POSITIVE_INFINITY?Math.PI:2*Math.atan(t.perspective.aspect*Math.tan(.5*r));return[e._spatial.azimuthalToBearing(t.rotation.phi),n]}).distinctUntilChanged(function(t,r){return Math.abs(r[0]-t[0])<e._distinctThreshold&&Math.abs(r[1]-t[1])<e._distinctThreshold});this._renderSubscription=o.Observable.combineLatest(t,r).map(function(t){var r=i.h("div.BearingIndicatorBackground",{oncontextmenu:function(e){e.preventDefault()}},[i.h("div.BearingIndicatorBackgroundRectangle",{},[]),i.h("div.BearingIndicatorBackgroundCircle",{},[])]),n=i.h("div.BearingIndicatorNorth",{},[]),o=e._createCircleSector(t[0][0],t[0][1],"#000"),a=e._createCircleSector(t[1][0],t[1][1],"#fff"),s=e._createCircleSectorCompass(o,a);return{name:e._name,vnode:i.h("div.BearingIndicator",{},[r,n,s])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._renderSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._createCircleSectorCompass=function(e,t){var r=i.h("g",{attributes:{transform:"translate(1,1)"},namespace:this._svgNamespace},[e,t]),n=i.h("circle",{attributes:{cx:"1",cy:"1",fill:"#abb1b9",r:"0.291667",stroke:"#000","stroke-width":"0.0833333"},namespace:this._svgNamespace},[]);return i.h("svg",{attributes:{viewBox:"0 0 2 2"},namespace:this._svgNamespace,style:{bottom:"4px",height:"48px",left:"4px",position:"absolute",width:"48px"}},[r,n])},t.prototype._createCircleSector=function(e,t,r){if(t>2*Math.PI-Math.PI/90)return i.h("circle",{attributes:{cx:"0",cy:"0",fill:r,r:"1"},namespace:this._svgNamespace},[]);var n=e-t/2-Math.PI/2,o=n+t,a=Math.cos(n),s=Math.sin(n),c=Math.cos(o),u=Math.sin(o),h="M 0 0 "+a+" "+s+" A 1 1 0 "+(t>=Math.PI?1:0)+" 1 "+c+" "+u;return i.h("path",{attributes:{d:h,fill:r},namespace:this._svgNamespace},[])},t.componentName="bearing",t}(a.Component);r.BearingComponent=c,a.ComponentService.register(c),r.default=c},{"../Component":230,"../Geo":233,"rxjs/Observable":29,"virtual-dom":186}],247:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/from"),e("rxjs/add/observable/merge"),e("rxjs/add/observable/of"),e("rxjs/add/observable/zip"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinct"),e("rxjs/add/operator/expand"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/mergeAll"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/switchMap");var o=e("../Edge"),a=e("../Component"),s=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype.setDepth=function(e){this.configure({depth:e})},t.prototype._activate=function(){var e=this;this._sequenceSubscription=i.Observable.combineLatest(this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$}).filter(function(e){return e.cached}),this._configuration$).switchMap(function(t){var r=t[0],n=t[1],a=Math.max(0,Math.min(4,n.depth.sequence)),s=e._cache$(r.edges,o.EdgeDirection.Next,a),c=e._cache$(r.edges,o.EdgeDirection.Prev,a);return i.Observable.merge(s,c).catch(function(e,t){return console.error("Failed to cache sequence edges.",e),i.Observable.empty()})}).subscribe(function(){}),this._spatialSubscription=this._navigator.stateService.currentNode$.switchMap(function(e){return i.Observable.combineLatest(i.Observable.of(e),e.spatialEdges$.filter(function(e){return e.cached}))}).combineLatest(this._configuration$,function(e,t){return[e[0],e[1],t]}).switchMap(function(t){var r=t[0],n=t[1].edges,a=t[2].depth,s=Math.max(0,Math.min(2,a.pano)),c=r.pano?0:Math.max(0,Math.min(3,a.step)),u=r.pano?0:Math.max(0,Math.min(1,a.turn)),h=e._cache$(n,o.EdgeDirection.Pano,s),l=e._cache$(n,o.EdgeDirection.StepForward,c),p=e._cache$(n,o.EdgeDirection.StepBackward,c),f=e._cache$(n,o.EdgeDirection.StepLeft,c),d=e._cache$(n,o.EdgeDirection.StepRight,c),m=e._cache$(n,o.EdgeDirection.TurnLeft,u),v=e._cache$(n,o.EdgeDirection.TurnRight,u),g=e._cache$(n,o.EdgeDirection.TurnU,u);return i.Observable.merge(l,p,f,d,h,m,v,g).catch(function(e,t){return console.error("Failed to cache spatial edges.",e),i.Observable.empty()})}).subscribe(function(){})},t.prototype._deactivate=function(){this._sequenceSubscription.unsubscribe(),this._spatialSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{depth:{pano:1,sequence:2,step:1,turn:0}}},t.prototype._cache$=function(e,t,r){var n=this;return i.Observable.zip(i.Observable.of(e),i.Observable.of(r)).expand(function(e){var r=e[0],o=e[1],a=[];if(o>0)for(var s=0,c=r;s<c.length;s++){var u=c[s];u.data.direction===t&&a.push(i.Observable.zip(n._navigator.graphService.cacheNode$(u.to).mergeMap(function(e){return n._nodeToEdges$(e,t)}),i.Observable.of(o-1)))}return i.Observable.from(a).mergeAll()}).skip(1)},t.prototype._nodeToEdges$=function(e,t){return([o.EdgeDirection.Next,o.EdgeDirection.Prev].indexOf(t)>-1?e.sequenceEdges$:e.spatialEdges$).first(function(e){return e.cached}).map(function(e){return e.edges})},t.componentName="cache",t}(a.Component);r.CacheComponent=s,a.ComponentService.register(s),r.default=s},{"../Component":230,"../Edge":231,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":76,"rxjs/add/operator/switchMap":80}],248:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/BehaviorSubject"),o=e("rxjs/Subject");e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var a=function(e){function t(t,r,n){var a=e.call(this)||this;return a._activated$=new i.BehaviorSubject(!1),a._configurationSubject$=new o.Subject,a._activated=!1,a._container=r,a._name=t,a._navigator=n,a._configuration$=a._configurationSubject$.startWith(a.defaultConfiguration).scan(function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}).publishReplay(1).refCount(),a._configuration$.subscribe(function(){}),a}return n(t,e),Object.defineProperty(t.prototype,"activated",{get:function(){return this._activated},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activated$",{get:function(){return this._activated$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"defaultConfiguration",{get:function(){return this._getDefaultConfiguration()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"configuration$",{get:function(){return this._configuration$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.activate=function(e){this._activated||(void 0!==e&&this._configurationSubject$.next(e),this._activated=!0,this._activate(),this._activated$.next(!0))},t.prototype.configure=function(e){this._configurationSubject$.next(e)},t.prototype.deactivate=function(){this._activated&&(this._activated=!1,this._deactivate(),this._container.domRenderer.clear(this._name),this._container.glRenderer.clear(this._name),this._activated$.next(!1))},t.prototype.resize=function(){},t.componentName="not_worthy",t}(e("../Utils").EventEmitter);r.Component=a,r.default=a},{"../Utils":240,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79}],249:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("../Error"),o=function(){function e(t,r){this._components={},this._container=t,this._navigator=r;for(var i=0,o=n.values(e.registeredComponents);i<o.length;i++){var a=o[i];this._components[a.componentName]={active:!1,component:new a(a.componentName,t,r)}}this._coverComponent=new e.registeredCoverComponent("cover",t,r),this._coverComponent.activate(),this._coverActivated=!0}return e.register=function(t){void 0===e.registeredComponents[t.componentName]&&(e.registeredComponents[t.componentName]=t)},e.registerCover=function(t){e.registeredCoverComponent=t},Object.defineProperty(e.prototype,"coverActivated",{get:function(){return this._coverActivated},enumerable:!0,configurable:!0}),e.prototype.activateCover=function(){if(!this._coverActivated){this._coverActivated=!0;for(var e=0,t=n.values(this._components);e<t.length;e++){var r=t[e];r.active&&r.component.deactivate()}}},e.prototype.deactivateCover=function(){if(this._coverActivated){this._coverActivated=!1;for(var e=0,t=n.values(this._components);e<t.length;e++){var r=t[e];r.active&&r.component.activate()}}},e.prototype.activate=function(e){this._checkName(e),this._components[e].active=!0,this._coverActivated||this.get(e).activate()},e.prototype.configure=function(e,t){this._checkName(e),this.get(e).configure(t)},e.prototype.deactivate=function(e){this._checkName(e),this._components[e].active=!1,this._coverActivated||this.get(e).deactivate()},e.prototype.resize=function(){for(var e=0,t=n.values(this._components);e<t.length;e++)t[e].component.resize()},e.prototype.get=function(e){return this._components[e].component},e.prototype.getCover=function(){return this._coverComponent},e.prototype._checkName=function(e){if(!(e in this._components))throw new i.ArgumentMapillaryError("Component does not exist: "+e)},e.registeredComponents={},e}();r.ComponentService=o,r.default=o},{"../Error":232,underscore:182}],250:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom");e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/withLatestFrom");var o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._keyDisposable=this._navigator.stateService.currentNode$.withLatestFrom(this._configuration$,function(e,t){return[e,t]}).filter(function(e){var t=e[0],r=e[1];return t.key!==r.key}).map(function(e){var t=e[0];e[1];return t}).map(function(e){return{key:e.key,src:e.image.src}}).subscribe(this._configurationSubject$),this._disposable=this._configuration$.map(function(t){return t.key?t.state===o.CoverState.Hidden?{name:e._name,vnode:i.h("div.Cover.CoverDone",[e._getCoverBackgroundVNode(t)])}:{name:e._name,vnode:e._getCoverButtonVNode(t)}:{name:e._name,vnode:i.h("div",[])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe(),this._keyDisposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{state:o.CoverState.Visible}},t.prototype._getCoverButtonVNode=function(e){var t=this,r=e.state===o.CoverState.Loading?"div.Cover.CoverLoading":"div.Cover";return i.h(r,[this._getCoverBackgroundVNode(e),i.h("button.CoverButton",{onclick:function(){t.configure({state:o.CoverState.Loading})}},["Explore"]),i.h("a.CoverLogo",{href:"https://www.mapillary.com",target:"_blank"},[])])},t.prototype._getCoverBackgroundVNode=function(e){var t={style:{backgroundImage:null!=e.src?"url("+e.src+")":"url(https://d1cuyjsrcm0gby.cloudfront.net/"+e.key+"/thumb-640.jpg)"}},r=[];return e.state===o.CoverState.Loading&&r.push(i.h("div.Spinner",{},[])),r.push(i.h("div.CoverBackgroundGradient",{},[])),i.h("div.CoverBackground",t,r)},t.componentName="cover",t}(o.Component);r.CoverComponent=a,o.ComponentService.registerCover(a),r.default=a},{"../Component":230,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85,"virtual-dom":186}],251:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom"),a=e("rxjs/BehaviorSubject");e("rxjs/add/operator/combineLatest");var s=e("../Component"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._open$=new a.BehaviorSubject(!1),i._displaying=!1,i}return n(t,e),t.prototype._activate=function(){var e=this;this._disposable=this._navigator.stateService.currentState$.combineLatest(this._open$,this._navigator.imageLoadingService.loadstatus$,function(t,r,n){return{name:e._name,vnode:e._getDebugVNode(r,e._getDebugInfo(t,n))}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getDebugInfo=function(e,t){var r=[];r.push(o.h("h2","Node")),e.state.currentNode&&r.push(o.h("p","currentNode: "+e.state.currentNode.key)),e.state.previousNode&&r.push(o.h("p","previousNode: "+e.state.previousNode.key)),r.push(o.h("h2","Loading"));for(var n=0,a=0,s=0,c=0,u=i.values(t);c<u.length;c++){var h=u[c];n+=h.loaded,h.loaded!==h.total?s++:a++}return r.push(o.h("p","Loaded Images: "+a)),r.push(o.h("p","Loading Images: "+s)),r.push(o.h("p","Total bytes loaded: "+n)),r.push(o.h("h2","Camera")),r.push(o.h("p","camera.position.x: "+e.state.camera.position.x)),r.push(o.h("p","camera.position.y: "+e.state.camera.position.y)),r.push(o.h("p","camera.position.z: "+e.state.camera.position.z)),r.push(o.h("p","camera.lookat.x: "+e.state.camera.lookat.x)),r.push(o.h("p","camera.lookat.y: "+e.state.camera.lookat.y)),r.push(o.h("p","camera.lookat.z: "+e.state.camera.lookat.z)),r.push(o.h("p","camera.up.x: "+e.state.camera.up.x)),r.push(o.h("p","camera.up.y: "+e.state.camera.up.y)),r.push(o.h("p","camera.up.z: "+e.state.camera.up.z)),r},t.prototype._getDebugVNode=function(e,t){return e?o.h("div.Debug",{},[o.h("h2",{},["Debug"]),this._getDebugVNodeButton(e),o.h("pre",{},t)]):this._getDebugVNodeButton(e)},t.prototype._getDebugVNodeButton=function(e){var t=e?"Disable Debug":"D",r=e?"":".DebugButtonFixed";return e?o.h("button.DebugButton"+r,{onclick:this._closeDebugElement.bind(this)},[t]):o.h("button.DebugButton"+r,{onclick:this._openDebugElement.bind(this)},[t])},t.prototype._closeDebugElement=function(e){this._open$.next(!1)},t.prototype._openDebugElement=function(){this._open$.next(!0)},t.componentName="debug",t}(s.Component);r.DebugComponent=c,s.ComponentService.register(c),r.default=c},{"../Component":230,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,underscore:182,"virtual-dom":186}],252:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable");e("rxjs/add/operator/combineLatest");var a=e("../Component"),s=e("../Utils"),c=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._canvasId=r.id+"-"+o._name,o._dom=i||new s.DOM,o}return n(t,e),t.prototype._activate=function(){var e=this,t=this._container.domRenderer.element$.map(function(t){return e._dom.document.getElementById(e._canvasId)}).filter(function(e){return!!e}).map(function(e){var t=e.parentElement,r=t.offsetWidth;return[e,{height:t.offsetHeight,width:r}]}).distinctUntilChanged(function(e,t){return e.height===t.height&&e.width===t.width},function(e){e[0];return e[1]});this.drawSubscription=o.Observable.combineLatest(t,this._navigator.stateService.currentNode$).subscribe(function(e){var t=e[0],r=t[0],n=t[1],i=e[1];r.width=n.width,r.height=n.height,r.getContext("2d").drawImage(i.image,0,0,n.width,n.height)}),this._container.domRenderer.renderAdaptive$.next({name:this._name,vnode:i.h("canvas#"+this._canvasId,[])})},t.prototype._deactivate=function(){this.drawSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.componentName="image",t}(a.Component);r.ImageComponent=c,a.ComponentService.register(c),r.default=c},{"../Component":230,"../Utils":240,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"virtual-dom":186}],253:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom");e("rxjs/add/operator/combineLatest");var a=e("../Component"),s=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._loadingSubscription=this._navigator.loadingService.loading$.combineLatest(this._navigator.imageLoadingService.loadstatus$,function(t,r){if(!t)return{name:"loading",vnode:e._getBarVNode(100)};for(var n=0,o=0,a=0,s=i.values(r);a<s.length;a++){var c=s[a];c.loaded!==c.total&&(o+=c.loaded,n+=c.total)}var u=100;return 0!==n&&(u=o/n*100),{name:e._name,vnode:e._getBarVNode(u)}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._loadingSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getBarVNode=function(e){var t={},r={};return 100!==e?(t.width=e.toFixed(0)+"%",t.opacity="1"):(t.width="100%",t.opacity="0"),o.h("div.Loading",{style:r},[o.h("div.LoadingBar",{style:t},[])])},t.componentName="loading",t}(a.Component);r.LoadingComponent=s,a.ComponentService.register(s),r.default=s},{"../Component":230,"rxjs/add/operator/combineLatest":53,underscore:182,"virtual-dom":186}],254:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable");e("rxjs/add/operator/map"),e("rxjs/add/operator/first");var a=e("../Edge"),s=e("../Component"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._seqNames={},i._seqNames[a.EdgeDirection[a.EdgeDirection.Prev]]="Prev",i._seqNames[a.EdgeDirection[a.EdgeDirection.Next]]="Next",i._spaTopNames={},i._spaTopNames[a.EdgeDirection[a.EdgeDirection.TurnLeft]]="Turnleft",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepLeft]]="Left",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepForward]]="Forward",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepRight]]="Right",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.TurnRight]]="Turnright",i._spaBottomNames={},i._spaBottomNames[a.EdgeDirection[a.EdgeDirection.TurnU]]="Turnaround",i._spaBottomNames[a.EdgeDirection[a.EdgeDirection.StepBackward]]="Backward",i}return n(t,e),t.prototype._activate=function(){var e=this;this._renderSubscription=o.Observable.combineLatest(this._navigator.stateService.currentNode$,this._configuration$).switchMap(function(e){var t=e[0],r=e[1],n=r.sequence?t.sequenceEdges$.map(function(e){return e.edges.map(function(e){return e.data.direction})}):o.Observable.of([]),i=!t.pano&&r.spatial?t.spatialEdges$.map(function(e){return e.edges.map(function(e){return e.data.direction})}):o.Observable.of([]);return o.Observable.combineLatest(n,i).map(function(e){var t=e[0],r=e[1];return t.concat(r)})}).map(function(t){var r=e._createArrowRow(e._seqNames,t),n=e._createArrowRow(e._spaTopNames,t),o=e._createArrowRow(e._spaBottomNames,t),a=i.h("div.NavigationSequence",r),s=i.h("div.NavigationSpatialTop",n),c=i.h("div.NavigationSpatialBottom",o),u=i.h("div.NavigationSpatial",[s,c]);return{name:e._name,vnode:i.h("div.NavigationContainer",[a,u])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._renderSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{sequence:!0,spatial:!0}},t.prototype._createArrowRow=function(e,t){var r=[];for(var n in e)if(e.hasOwnProperty(n)){var i=a.EdgeDirection[n];-1!==t.indexOf(i)?r.push(this._createVNode(i,e[n],"visible")):r.push(this._createVNode(i,e[n],"hidden"))}return r},t.prototype._createVNode=function(e,t,r){var n=this;return i.h("span.Direction.Direction"+t,{onclick:function(t){n._navigator.moveDir$(e).subscribe(function(e){},function(e){console.error(e)})},style:{visibility:r}},[])},t.componentName="navigation",t}(s.Component);r.NavigationComponent=c,s.ComponentService.register(c),r.default=c},{"../Component":230,"../Edge":231,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":186}],255:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom"),a=e("rxjs/Observable");e("rxjs/add/observable/fromPromise"),e("rxjs/add/observable/of"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinct"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/pluck"),e("rxjs/add/operator/scan");var s=e("../Component"),c=function(){return function(){}}(),u=function(){return function(){}}(),h=function(){return function(){this.nodeInstructions=[],this.nodeInstructionsOrdered=[]}}(),l=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e,t=this;e=this._navigator.stateService.currentState$.filter(function(e){return e.id%2==0}).filter(function(e){return e.state.nodesAhead<15}).distinctUntilChanged(void 0,function(e){return e.state.lastNode.key});var r;r=this.configuration$.mergeMap(function(e){return a.Observable.from(e.paths)}).distinct(function(e){return e.sequenceKey}).mergeMap(function(e){return t._navigator.apiV3.sequenceByKey$([e.sequenceKey]).map(function(t){return t[e.sequenceKey]})}).combineLatest(this.configuration$,function(e,t){for(var r=0,n=[],i=0,o=t.paths;i<o.length;i++){var a=o[i];if(a.sequenceKey===e.key){for(var s=[],c=!1,u=0,h=e.keys;u<h.length;u++){var l=h[u];if(a.startKey===l&&(c=!0),c){for(var p=null,f=0,d=a.infoKeys;f<d.length;f++){var m=d[f];m.key===l&&(p=m.description)}s.push({description:p,key:l})}a.stopKey===l&&(c=!1)}n.push({nodeInstructions:s,place:r})}r++}return n}).scan(function(e,t){for(var r=0,n=t;r<n.length;r++){var o=n[r];e.nodeInstructionsOrdered[o.place]=o.nodeInstructions}return e.nodeInstructions=i.flatten(e.nodeInstructionsOrdered),e},new h),this._disposable=e.combineLatest(r,this.configuration$,function(e,t,r){return{conf:r,frame:e,routeTrack:t}}).scan(function(e,r){return void 0===r.conf.playing||r.conf.playing?(e.routeTrack=r.routeTrack,e.currentNode=r.frame.state.currentNode,e.lastNode=r.frame.state.lastNode,e.playing=!0):(t._navigator.stateService.cutNodes(),e.playing=!1),e},new u).filter(function(e){return e.playing}).filter(function(e){for(var t=0,r=e.routeTrack.nodeInstructions;t<r.length;t++){var n=r[t];if(n&&n.key===e.lastNode.key)return!0}return!1}).distinctUntilChanged(void 0,function(e){return e.lastNode.key}).mergeMap(function(e){for(var r=0,n=0,i=e.routeTrack.nodeInstructions;n<i.length&&i[n].key!==e.lastNode.key;n++)r++;var o=e.routeTrack.nodeInstructions[r+1];return o?t._navigator.graphService.cacheNode$(o.key):a.Observable.of(null)}).combineLatest(this.configuration$,function(e,t){return{conf:t,node:e}}).filter(function(e){return null!==e.node&&e.conf.playing}).pluck("node").subscribe(this._navigator.stateService.appendNode$),this._disposableDescription=this._navigator.stateService.currentNode$.combineLatest(r,this.configuration$,function(e,t,r){if(void 0!==r.playing&&!r.playing)return"quit";for(var n=null,i=0,o=t.nodeInstructions;i<o.length;i++){var a=o[i];if(a.key===e.key){n=a.description;break}}return n}).scan(function(e,t){return t!==e.description&&null!==t?(e.description=t,e.showsLeft=6):e.showsLeft--,"quit"===t&&(e.description=null),e},new c).map(function(e){return e.showsLeft>0&&e.description?{name:t._name,vnode:t._getRouteAnnotationNode(e.description)}:{name:t._name,vnode:o.h("div",[])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe(),this._disposableDescription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype.play=function(){this.configure({playing:!0})},t.prototype.stop=function(){this.configure({playing:!1})},t.prototype._getRouteAnnotationNode=function(e){return o.h("div.RouteFrame",{},[o.h("p",{textContent:e},[])])},t.componentName="route",t}(s.Component);r.RouteComponent=l,s.ComponentService.register(l),r.default=l},{"../Component":230,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":74,underscore:182,"virtual-dom":186}],256:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable");e("rxjs/add/operator/buffer"),e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/scan");var o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._sequenceSubscription=this._navigator.stateService.currentNode$.scan(function(e,t){var r=t.sequenceKey;return e.report=[],r in e.reported||(e.report=[r],e.reported[r]=!0),e},{report:[],reported:{}}).filter(function(e){return e.report.length>0}).mergeMap(function(t){return e._navigator.apiV3.sequenceViewAdd$(t.report).catch(function(e,r){return console.error("Failed to report sequence stats ("+t.report+")",e),i.Observable.empty()})}).subscribe(function(){}),this._imageSubscription=this._navigator.stateService.currentNode$.map(function(e){return e.key}).buffer(this._navigator.stateService.currentNode$.debounceTime(5e3)).scan(function(e,t){e.report=[];for(var r=0,n=t;r<n.length;r++){var i=n[r];i in e.reported||(e.report.push(i),e.reported[i]=!0)}return e},{report:[],reported:{}}).filter(function(e){return e.report.length>0}).mergeMap(function(t){return e._navigator.apiV3.imageViewAdd$(t.report).catch(function(e,r){return console.error("Failed to report image stats ("+t.report+")",e),i.Observable.empty()})}).subscribe(function(){})},t.prototype._deactivate=function(){this._sequenceSubscription.unsubscribe(),this._imageSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.componentName="stats",t}(o.Component);r.StatsComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":230,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74}],257:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable"),a=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/do"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/share");var s=e("../../Component"),c=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._renderer=i||new s.DirectionDOMRenderer(o.defaultConfiguration,r.element),o._hoveredKeySubject$=new a.Subject,o._hoveredKey$=o._hoveredKeySubject$.share(),o}return n(t,e),Object.defineProperty(t.prototype,"hoveredKey$",{get:function(){return this._hoveredKey$},enumerable:!0,configurable:!0}),t.prototype.setHighlightKey=function(e){this.configure({highlightKey:e})},t.prototype.setMinWidth=function(e){this.configure({minWidth:e})},t.prototype.setMaxWidth=function(e){this.configure({maxWidth:e})},t.prototype.resize=function(){this._renderer.resize(this._container.element)},t.prototype._activate=function(){var e=this;this._configurationSubscription=this._configuration$.subscribe(function(t){e._renderer.setConfiguration(t)}),this._nodeSubscription=this._navigator.stateService.currentNode$.do(function(t){e._container.domRenderer.render$.next({name:e._name,vnode:i.h("div",{},[])}),e._renderer.setNode(t)}).withLatestFrom(this._configuration$).switchMap(function(t){var r=t[0],n=t[1];return o.Observable.combineLatest(r.spatialEdges$,n.distinguishSequence?e._navigator.graphService.cacheSequence$(r.sequenceKey).catch(function(e,t){return console.error("Failed to cache sequence ("+r.sequenceKey+")",e),o.Observable.of(null)}):o.Observable.of(null))}).subscribe(function(t){var r=t[0],n=t[1];e._renderer.setEdges(r,n)}),this._renderCameraSubscription=this._container.renderService.renderCameraFrame$.do(function(t){e._renderer.setRenderCamera(t)}).map(function(t){return e._renderer}).filter(function(e){return e.needsRender}).map(function(t){return{name:e._name,vnode:t.render(e._navigator)}}).subscribe(this._container.domRenderer.render$),this._hoveredKeySubscription=o.Observable.combineLatest([this._container.domRenderer.element$,this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$.startWith(null),this._container.mouseService.mouseUp$.startWith(null)],function(e,t,r,n){return e}).map(function(e){for(var t=e.getElementsByClassName("DirectionsPerspective"),r=0;r<t.length;r++){var n=t.item(r).querySelector(":hover");if(null!=n&&n.hasAttribute("data-key"))return n.getAttribute("data-key")}return null}).distinctUntilChanged().subscribe(this._hoveredKeySubject$)},t.prototype._deactivate=function(){this._configurationSubscription.unsubscribe(),this._nodeSubscription.unsubscribe(),this._renderCameraSubscription.unsubscribe(),this._hoveredKeySubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{distinguishSequence:!1,maxWidth:460,minWidth:260}},t.componentName="direction",t}(s.Component);r.DirectionComponent=c,s.ComponentService.register(c),r.default=c},{"../../Component":230,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":75,"virtual-dom":186}],258:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Geo"),i=function(){function e(e,t){this._spatial=new n.Spatial,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._configure(e),this._resize(t),this._reset()}return Object.defineProperty(e.prototype,"minWidth",{get:function(){return this._minWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"maxWidth",{get:function(){return this._maxWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerWidth",{get:function(){return this._containerWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerWidthCss",{get:function(){return this._containerWidthCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerMarginCss",{get:function(){return this._containerMarginCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerLeftCss",{get:function(){return this._containerLeftCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerHeight",{get:function(){return this._containerHeight},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerHeightCss",{get:function(){return this._containerHeightCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerBottomCss",{get:function(){return this._containerBottomCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleSize",{get:function(){return this._stepCircleSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleSizeCss",{get:function(){return this._stepCircleSizeCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleMarginCss",{get:function(){return this._stepCircleMarginCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"turnCircleSize",{get:function(){return this._turnCircleSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"turnCircleSizeCss",{get:function(){return this._turnCircleSizeCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outerRadius",{get:function(){return this._outerRadius},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"innerRadius",{get:function(){return this._innerRadius},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shadowOffset",{get:function(){return this._shadowOffset},enumerable:!0,configurable:!0}),e.prototype.configure=function(e){this._configure(e),this._reset()},e.prototype.resize=function(e){this._resize(e),this._reset()},e.prototype.angleToCoordinates=function(e){return[Math.cos(e),Math.sin(e)]},e.prototype.relativeAngleToCoordiantes=function(e,t){var r=this._spatial.wrapAngle(e-t);return this.angleToCoordinates(r)},e.prototype._configure=function(e){this._minWidth=e.minWidth,this._maxWidth=this._getMaxWidth(e.minWidth,e.maxWidth)},e.prototype._resize=function(e){this._elementWidth=e.offsetWidth,this._elementHeight=e.offsetHeight},e.prototype._reset=function(){this._containerWidth=this._getContainerWidth(this._elementWidth,this._elementHeight),this._containerHeight=this._getContainerHeight(this.containerWidth),this._stepCircleSize=this._getStepCircleDiameter(this._containerHeight),this._turnCircleSize=this._getTurnCircleDiameter(this.containerHeight),this._outerRadius=this._getOuterRadius(this._containerHeight),this._innerRadius=this._getInnerRadius(this._containerHeight),this._shadowOffset=3,this._containerWidthCss=this._numberToCssPixels(this._containerWidth),this._containerMarginCss=this._numberToCssPixels(-.5*this._containerWidth),this._containerLeftCss=this._numberToCssPixels(Math.floor(.5*this._elementWidth)),this._containerHeightCss=this._numberToCssPixels(this._containerHeight),this._containerBottomCss=this._numberToCssPixels(Math.floor(-.08*this._containerHeight)),this._stepCircleSizeCss=this._numberToCssPixels(this._stepCircleSize),this._stepCircleMarginCss=this._numberToCssPixels(-.5*this._stepCircleSize),this._turnCircleSizeCss=this._numberToCssPixels(this._turnCircleSize)},e.prototype._getContainerWidth=function(e,t){var r=(e-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),n=(t-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight),i=Math.max(0,Math.min(1,Math.min(r,n)));return i=.04*Math.round(25*i),this._minWidth+i*(this._maxWidth-this._minWidth)},e.prototype._getContainerHeight=function(e){return.77*e},e.prototype._getStepCircleDiameter=function(e){return.34*e},e.prototype._getTurnCircleDiameter=function(e){return.3*e},e.prototype._getOuterRadius=function(e){return.31*e},e.prototype._getInnerRadius=function(e){return.125*e},e.prototype._numberToCssPixels=function(e){return e+"px"},e.prototype._getMaxWidth=function(e,t){return e>t?e:t},e}();r.DirectionDOMCalculator=i,r.default=i},{"../../Geo":233}],259:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=e("../../Component"),o=e("../../Edge"),a=e("../../Geo"),s=function(){function e(e,t){this._isEdge=!1,this._spatial=new a.Spatial,this._calculator=new i.DirectionDOMCalculator(e,t),this._node=null,this._rotation={phi:0,theta:0},this._epsilon=.5*Math.PI/180,this._highlightKey=null,this._distinguishSequence=!1,this._needsRender=!1,this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[],this._stepDirections=[o.EdgeDirection.StepForward,o.EdgeDirection.StepBackward,o.EdgeDirection.StepLeft,o.EdgeDirection.StepRight],this._turnDirections=[o.EdgeDirection.TurnLeft,o.EdgeDirection.TurnRight,o.EdgeDirection.TurnU],this._turnNames={},this._turnNames[o.EdgeDirection.TurnLeft]="TurnLeft",this._turnNames[o.EdgeDirection.TurnRight]="TurnRight",this._turnNames[o.EdgeDirection.TurnU]="TurnAround";var r=!!document.documentMode;this._isEdge=!r&&!!window.StyleMedia}return Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.render=function(e){this._needsRender=!1;var t=this._rotation,r=[],n=[];return this._node.pano?r=r.concat(this._createPanoArrows(e,t)):(r=(r=r.concat(this._createPerspectiveToPanoArrows(e,t))).concat(this._createStepArrows(e,t)),n=n.concat(this._createTurnArrows(e))),this._getContainer(r,n,t)},e.prototype.setEdges=function(e,t){this._setEdges(e,t),this._setNeedsRender()},e.prototype.setNode=function(e){this._node=e,this._clearEdges(),this._setNeedsRender()},e.prototype.setRenderCamera=function(e){var t=e.rotation;Math.abs(t.phi-this._rotation.phi)<this._epsilon||(this._rotation=t,this._setNeedsRender())},e.prototype.setConfiguration=function(e){var t=!1;this._highlightKey===e.highlightKey&&this._distinguishSequence===e.distinguishSequence||(this._highlightKey=e.highlightKey,this._distinguishSequence=e.distinguishSequence,t=!0),this._calculator.minWidth===e.minWidth&&this._calculator.maxWidth===e.maxWidth||(this._calculator.configure(e),t=!0),t&&this._setNeedsRender()},e.prototype.resize=function(e){this._calculator.resize(e),this._setNeedsRender()},e.prototype._setNeedsRender=function(){null!=this._node&&(this._needsRender=!0)},e.prototype._clearEdges=function(){this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[]},e.prototype._setEdges=function(e,t){this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[];for(var r=0,n=e.edges;r<n.length;r++){var i=(c=n[r]).data.direction;this._stepDirections.indexOf(i)>-1?this._stepEdges.push(c):this._turnDirections.indexOf(i)>-1?this._turnEdges.push(c):c.data.direction===o.EdgeDirection.Pano&&this._panoEdges.push(c)}if(this._distinguishSequence&&null!=t)for(var a=0,s=this._panoEdges.concat(this._stepEdges).concat(this._turnEdges);a<s.length;a++)for(var c=s[a],u=c.to,h=0,l=t.keys;h<l.length;h++)if(l[h]===u){this._sequenceEdgeKeys.push(u);break}},e.prototype._createPanoArrows=function(e,t){for(var r=[],n=0,i=this._panoEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByKey(e,o.to,o.data.worldMotionAzimuth,t,this._calculator.outerRadius,"DirectionsArrowPano"))}for(var a=0,s=this._stepEdges;a<s.length;a++){var c=s[a];r.push(this._createPanoToPerspectiveArrow(e,c.to,c.data.worldMotionAzimuth,t,c.data.direction))}return r},e.prototype._createPanoToPerspectiveArrow=function(e,t,r,n,i){var a=Math.PI/8,s=n.phi;switch(i){case o.EdgeDirection.StepBackward:s=n.phi-Math.PI;break;case o.EdgeDirection.StepLeft:s=n.phi+Math.PI/2;break;case o.EdgeDirection.StepRight:s=n.phi-Math.PI/2}return Math.abs(this._spatial.wrapAngle(r-s))<a?this._createVNodeByKey(e,t,r,n,this._calculator.outerRadius,"DirectionsArrowStep"):this._createVNodeDisabled(t,r,n)},e.prototype._createPerspectiveToPanoArrows=function(e,t){for(var r=[],n=0,i=this._panoEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByKey(e,o.to,o.data.worldMotionAzimuth,t,this._calculator.innerRadius,"DirectionsArrowPano",!0))}return r},e.prototype._createStepArrows=function(e,t){for(var r=[],n=0,i=this._stepEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByDirection(e,o.to,o.data.worldMotionAzimuth,t,o.data.direction))}return r},e.prototype._createTurnArrows=function(e){for(var t=[],r=0,n=this._turnEdges;r<n.length;r++){var i=n[r],o=i.data.direction,a=this._turnNames[o];t.push(this._createVNodeByTurn(e,i.to,a,o))}return t},e.prototype._createVNodeByKey=function(e,t,r,n,i,o,a){return this._createVNode(t,r,n,i,o,"DirectionsCircle",function(r){e.moveToKey$(t).subscribe(function(e){},function(e){console.error(e)})},a)},e.prototype._createVNodeByDirection=function(e,t,r,n,i){return this._createVNode(t,r,n,this._calculator.outerRadius,"DirectionsArrowStep","DirectionsCircle",function(t){e.moveDir$(i).subscribe(function(e){},function(e){console.error(e)})})},e.prototype._createVNodeByTurn=function(e,t,r,i){var a={height:this._calculator.turnCircleSizeCss,transform:"rotate(0)",width:this._calculator.turnCircleSizeCss};switch(i){case o.EdgeDirection.TurnLeft:a.left="5px",a.top="5px";break;case o.EdgeDirection.TurnRight:a.right="5px",a.top="5px";break;case o.EdgeDirection.TurnU:a.left="5px",a.bottom="5px"}var s={attributes:{"data-key":t},onclick:function(t){e.moveDir$(i).subscribe(function(e){},function(e){console.error(e)})},style:a},c="TurnCircle";this._sequenceEdgeKeys.indexOf(t)>-1&&(c+="Sequence"),this._highlightKey===t&&(c+="Highlight");var u=n.h("div."+r,{},[]);return n.h("div."+c,s,[u])},e.prototype._createVNodeDisabled=function(e,t,r){return this._createVNode(e,t,r,this._calculator.outerRadius,"DirectionsArrowDisabled","DirectionsCircleDisabled")},e.prototype._createVNode=function(e,t,r,i,o,a,s,c){var u=this._calculator.angleToCoordinates(t-r.phi),h=Math.round(-i*u[1]+.5*this._calculator.containerWidth),l=Math.round(-i*u[0]+.5*this._calculator.containerHeight),p=this._calculator.relativeAngleToCoordiantes(t,r.phi),f=this._calculator.shadowOffset,d="drop-shadow("+-f*p[1]+"px "+f*p[0]+"px 1px rgba(0,0,0,0.8))",m={style:{"-webkit-filter":d,filter:d}},v=n.h("div."+o,m,[]),g=-this._spatial.radToDeg(t-r.phi),y=c?"translate("+h+"px, "+l+"px) rotate("+g+"deg) translateZ(-0.01px)":"translate("+h+"px, "+l+"px) rotate("+g+"deg)",b={attributes:{"data-key":e},onclick:s,style:{height:this._calculator.stepCircleSizeCss,marginLeft:this._calculator.stepCircleMarginCss,marginTop:this._calculator.stepCircleMarginCss,transform:y,width:this._calculator.stepCircleSizeCss}};return this._sequenceEdgeKeys.indexOf(e)>-1&&(a+="Sequence"),this._highlightKey===e&&(a+="Highlight"),n.h("div."+a,b,[v])},e.prototype._getContainer=function(e,t,r){var i=this._isEdge?"rotateX(60deg)":"perspective("+this._calculator.containerWidthCss+") rotateX(60deg)",o={oncontextmenu:function(e){e.preventDefault()},style:{bottom:this._calculator.containerBottomCss,height:this._calculator.containerHeightCss,left:this._calculator.containerLeftCss,marginLeft:this._calculator.containerMarginCss,transform:i,width:this._calculator.containerWidthCss}};return n.h("div.DirectionsPerspective",o,t.concat(e))},e}();r.DirectionDOMRenderer=s,r.default=s},{"../../Component":230,"../../Edge":231,"../../Geo":233,"virtual-dom":186}],260:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/operator/catch"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pairwise"),e("rxjs/add/operator/publish"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/skipWhile"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Render"),c=e("../../Tiles"),u=e("../../Utils"),h=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._imageTileLoader=new c.ImageTileLoader(u.Urls.tileScheme,u.Urls.tileDomain,u.Urls.origin),i._roiCalculator=new c.RegionOfInterestCalculator,i._rendererOperation$=new o.Subject,i._rendererCreator$=new o.Subject,i._rendererDisposer$=new o.Subject,i._renderer$=i._rendererOperation$.scan(function(e,t){return t(e)},null).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.frameId}),i._rendererCreator$.map(function(){return function(e){if(null!=e)throw new Error("Multiple image plane states can not be created at the same time");return new a.ImagePlaneGLRenderer}}).subscribe(i._rendererOperation$),i._rendererDisposer$.map(function(){return function(e){return e.dispose(),null}}).subscribe(i._rendererOperation$),i}return n(t,e),t.prototype._activate=function(){var e=this;this._rendererSubscription=this._renderer$.map(function(t){var r={name:e._name,render:{frameId:t.frameId,needsRender:t.needsRender,render:t.render.bind(t),stage:s.GLRenderStage.Background}};return t.clearNeedsRender(),r}).subscribe(this._container.glRenderer.render$),this._rendererCreator$.next(null),this._stateSubscription=this._navigator.stateService.currentState$.map(function(e){return function(t){return t.updateFrame(e),t}}).subscribe(this._rendererOperation$);var t=this._navigator.stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).combineLatest(this._configuration$).filter(function(e){return!0===e[1].imageTiling}).map(function(e){return e[0]}).withLatestFrom(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$).map(function(t){var r=t[0],n=t[1],i=t[2],o=r.state,a=Math.max(i.width,i.height),s=o.currentNode,u=o.currentTransform,h=a>2048?2048:a>1024?1024:512;return new c.TextureProvider(s.key,u.basicWidth,u.basicHeight,h,s.image,e._imageTileLoader,new c.ImageTileStore,n)}).publishReplay(1).refCount();this._textureProviderSubscription=t.subscribe(function(){}),this._setTextureProviderSubscription=t.map(function(e){return function(t){return t.setTextureProvider(e.key,e),t}}).subscribe(this._rendererOperation$),this._setTileSizeSubscription=this._container.renderService.size$.switchMap(function(e){return i.Observable.combineLatest(t,i.Observable.of(e)).first()}).subscribe(function(e){var t=e[0],r=e[1],n=Math.max(r.width,r.height),i=n>2048?2048:n>1024?1024:512;t.setTileSize(i)}),this._abortTextureProviderSubscription=t.pairwise().subscribe(function(e){e[0].abort()});var r=i.Observable.combineLatest(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.debounceTime(250)).map(function(e){var t=e[0],r=e[1];return[t.camera.position.clone(),t.camera.lookat.clone(),t.zoom.valueOf(),r.height.valueOf(),r.width.valueOf()]}).pairwise().skipWhile(function(e){return e[1][2]-e[0][2]<0||0===e[1][2]}).map(function(e){var t=e[0][0].equals(e[1][0]),r=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],i=e[0][3]===e[1][3],o=e[0][4]===e[1][4];return t&&r&&n&&i&&o}).distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._container.renderService.renderCameraFrame$.first()}).withLatestFrom(this._container.renderService.size$,this._navigator.stateService.currentTransform$);this._setRegionOfInterestSubscription=t.switchMap(function(t){return r.map(function(r){var n=r[0],i=r[1],o=r[2];return[e._roiCalculator.computeRegionOfInterest(n,i,o),t]})}).filter(function(e){return!e[1].disposed}).subscribe(function(e){var t=e[0];e[1].setRegionOfInterest(t)});var n=t.switchMap(function(e){return e.hasTexture$}).startWith(!1).publishReplay(1).refCount();this._hasTextureSubscription=n.subscribe(function(){});var o=this._navigator.stateService.currentNode$.debounceTime(1e3).withLatestFrom(n).filter(function(e){return!e[1]}).map(function(e){return e[0]}).filter(function(e){return e.pano?u.Settings.maxImageSize>u.Settings.basePanoramaSize:u.Settings.maxImageSize>u.Settings.baseImageSize}).switchMap(function(e){var t=e.pano?u.Settings.basePanoramaSize:u.Settings.baseImageSize;return Math.max(e.image.width,e.image.height)>t?i.Observable.empty():e.cacheImage$(u.Settings.maxImageSize).map(function(e){return[e.image,e]}).takeUntil(n.filter(function(e){return e})).catch(function(t,r){return console.error("Failed to fetch high res image ("+e.key+")",t),i.Observable.empty()})}).publish().refCount();this._updateBackgroundSubscription=o.withLatestFrom(t).subscribe(function(e){e[0][1].key!==e[1].key||e[1].disposed||e[1].updateBackground(e[0][0])}),this._updateTextureImageSubscription=o.map(function(e){return function(t){return t.updateTextureImage(e[0],e[1]),t}}).subscribe(this._rendererOperation$)},t.prototype._deactivate=function(){this._rendererDisposer$.next(null),this._abortTextureProviderSubscription.unsubscribe(),this._hasTextureSubscription.unsubscribe(),this._rendererSubscription.unsubscribe(),this._setRegionOfInterestSubscription.unsubscribe(),this._setTextureProviderSubscription.unsubscribe(),this._setTileSizeSubscription.unsubscribe(),this._stateSubscription.unsubscribe(),this._textureProviderSubscription.unsubscribe(),this._updateBackgroundSubscription.unsubscribe(),this._updateTextureImageSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{imageTiling:!1}},t.componentName="imagePlane",t}(a.Component);r.ImagePlaneComponent=h,a.ComponentService.register(h),r.default=h},{"../../Component":230,"../../Render":236,"../../Tiles":239,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/skipWhile":78,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],261:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../../Component"),o=function(){function e(e,t){this._imagePlaneDepth=null!=e?e:200,this._imageSphereRadius=null!=t?t:200}return e.prototype.createMesh=function(e,t){return e.pano?this._createImageSphere(e,t):this._createImagePlane(e,t)},e.prototype._createImageSphere=function(e,t){var r=this._createTexture(e.image),i=this._createSphereMaterialParameters(t,r),o=new n.ShaderMaterial(i);return this._useMesh(t,e)?new n.Mesh(this._getImageSphereGeo(t,e),o):new n.Mesh(this._getFlatImageSphereGeo(t),o)},e.prototype._createImagePlane=function(e,t){var r=this._createTexture(e.image),i=this._createPlaneMaterialParameters(t,r),o=new n.ShaderMaterial(i),a=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getFlatImagePlaneGeo(t);return new n.Mesh(a,o)},e.prototype._createSphereMaterialParameters=function(e,t){var r=e.gpano,o=(r.FullPanoWidthPixels-r.CroppedAreaImageWidthPixels)/2,a=2*Math.PI*(r.CroppedAreaLeftPixels-o)/r.FullPanoWidthPixels,s=2*Math.PI*r.CroppedAreaImageWidthPixels/r.FullPanoWidthPixels,c=(r.FullPanoHeightPixels-r.CroppedAreaImageHeightPixels)/2,u=Math.PI*(c-r.CroppedAreaTopPixels)/r.FullPanoHeightPixels,h=Math.PI*r.CroppedAreaImageHeightPixels/r.FullPanoHeightPixels;return{depthWrite:!1,fragmentShader:i.ImagePlaneShaders.equirectangular.fragment,side:n.DoubleSide,transparent:!0,uniforms:{opacity:{type:"f",value:1},phiLength:{type:"f",value:s},phiShift:{type:"f",value:a},projectorMat:{type:"m4",value:e.rt},projectorTex:{type:"t",value:t},thetaLength:{type:"f",value:h},thetaShift:{type:"f",value:u}},vertexShader:i.ImagePlaneShaders.equirectangular.vertex}},e.prototype._createPlaneMaterialParameters=function(e,t){return{depthWrite:!1,fragmentShader:i.ImagePlaneShaders.perspective.fragment,side:n.DoubleSide,transparent:!0,uniforms:{bbox:{type:"v4",value:new n.Vector4(0,0,1,1)},opacity:{type:"f",value:1},projectorMat:{type:"m4",value:e.projectorMatrix()},projectorTex:{type:"t",value:t}},vertexShader:i.ImagePlaneShaders.perspective.vertex}},e.prototype._createTexture=function(e){var t=new n.Texture(e);return t.minFilter=n.LinearFilter,t.needsUpdate=!0,t},e.prototype._useMesh=function(e,t){return t.mesh.vertices.length&&e.hasValidScale},e.prototype._getImageSphereGeo=function(e,t){for(var r=(new n.Matrix4).getInverse(e.srt),i=5*e.scale,o=this._imageSphereRadius*e.scale,a=t.mesh.vertices,s=a.length/3,c=new Float32Array(a.length),u=0;u<s;++u){var h=3*u,l=a[h+0],p=a[h+1],f=a[h+2],d=Math.sqrt(l*l+p*p+f*f),m=Math.max(i,Math.min(d,o))/d,v=new n.Vector3(l*m,p*m,f*m);v.applyMatrix4(r),c[h+0]=v.x,c[h+1]=v.y,c[h+2]=v.z}for(var g=t.mesh.faces,y=new Uint16Array(g.length),u=0;u<g.length;++u)y[u]=g[u];var b=new n.BufferGeometry;return b.addAttribute("position",new n.BufferAttribute(c,3)),b.setIndex(new n.BufferAttribute(y,1)),b},e.prototype._getImagePlaneGeo=function(e,t){for(var r=(new n.Matrix4).getInverse(e.srt),i=5*e.scale,o=this._imagePlaneDepth*e.scale,a=t.mesh.vertices,s=a.length/3,c=new Float32Array(a.length),u=0;u<s;++u){var h=3*u,l=a[h+0],p=a[h+1],f=a[h+2],d=Math.max(i,Math.min(f,o)),m=d/f,v=new n.Vector3(l*m,p*m,d);v.applyMatrix4(r),c[h+0]=v.x,c[h+1]=v.y,c[h+2]=v.z}for(var g=t.mesh.faces,y=new Uint16Array(g.length),u=0;u<g.length;++u)y[u]=g[u];var b=new n.BufferGeometry;return b.addAttribute("position",new n.BufferAttribute(c,3)),b.setIndex(new n.BufferAttribute(y,1)),b},e.prototype._getFlatImageSphereGeo=function(e){var t=e.gpano,r=2*Math.PI*t.CroppedAreaLeftPixels/t.FullPanoWidthPixels,i=2*Math.PI*t.CroppedAreaImageWidthPixels/t.FullPanoWidthPixels,o=Math.PI*(t.FullPanoHeightPixels-t.CroppedAreaImageHeightPixels-t.CroppedAreaTopPixels)/t.FullPanoHeightPixels,a=Math.PI*t.CroppedAreaImageHeightPixels/t.FullPanoHeightPixels,s=new n.SphereGeometry(this._imageSphereRadius,20,40,r-Math.PI/2,i,o,a);return s.applyMatrix((new n.Matrix4).getInverse(e.rt)),s},e.prototype._getFlatImagePlaneGeo=function(e){var t=e.width,r=e.height,i=Math.max(t,r),o=t/2/i,a=r/2/i,s=[];s.push(e.unprojectSfM([-o,-a],this._imagePlaneDepth)),s.push(e.unprojectSfM([o,-a],this._imagePlaneDepth)),s.push(e.unprojectSfM([o,a],this._imagePlaneDepth)),s.push(e.unprojectSfM([-o,a],this._imagePlaneDepth));for(var c=new Float32Array(12),u=0;u<s.length;u++){var h=3*u;c[h+0]=s[u][0],c[h+1]=s[u][1],c[h+2]=s[u][2]}var l=new Uint16Array(6);l[0]=0,l[1]=1,l[2]=3,l[3]=1,l[4]=2,l[5]=3;var p=new n.BufferGeometry;return p.addAttribute("position",new n.BufferAttribute(c,3)),p.setIndex(new n.BufferAttribute(l,1)),p},e}();r.ImagePlaneFactory=o,r.default=o},{"../../Component":230,three:180}],262:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Component"),i=e("../../Geo"),o=function(){function e(){this._imagePlaneFactory=new n.ImagePlaneFactory,this._imagePlaneScene=new n.ImagePlaneScene,this._alpha=0,this._alphaOld=0,this._fadeOutSpeed=.05,this._lastCamera=new i.Camera,this._epsilon=1e-6,this._currentKey=null,this._previousKey=null,this._providerDisposers={},this._frameId=0,this._needsRender=!1}return Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.indicateNeedsRender=function(){this._needsRender=!0},e.prototype.updateFrame=function(e){this._updateFrameId(e.id),this._needsRender=this._updateAlpha(e.state.alpha)||this._needsRender,this._needsRender=this._updateAlphaOld(e.state.alpha)||this._needsRender,this._needsRender=this._updateImagePlanes(e.state)||this._needsRender},e.prototype.setTextureProvider=function(e,t){var r=this;if(e===this._currentKey){var n=t.textureCreated$.subscribe(function(e){r._updateTexture(e)}),i=t.textureUpdated$.subscribe(function(e){r._needsRender=!0});e in this._providerDisposers&&((0,this._providerDisposers[e])(),delete this._providerDisposers[e]),this._providerDisposers[e]=function(){n.unsubscribe(),i.unsubscribe(),t.dispose()}}},e.prototype._updateTexture=function(e){this._needsRender=!0;for(var t=0,r=this._imagePlaneScene.imagePlanes;t<r.length;t++){var n=r[t].material,i=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,i.dispose(),n.uniforms.projectorTex.value=e}},e.prototype.updateTextureImage=function(e,t){if(this._currentKey===t.key){this._needsRender=!0;for(var r=0,n=this._imagePlaneScene.imagePlanes;r<n.length;r++){var i=n[r].material.uniforms.projectorTex.value;i.image=e,i.needsUpdate=!0}}},e.prototype.render=function(e,t){for(var r=this._imagePlaneScene.imagePlanesOld.length?1:this._alpha,n=0,i=this._imagePlaneScene.imagePlanes;n<i.length;n++)(u=i[n]).material.uniforms.opacity.value=r;for(var o=0,a=this._imagePlaneScene.imagePlanesOld;o<a.length;o++)(u=a[o]).material.uniforms.opacity.value=this._alphaOld;t.render(this._imagePlaneScene.scene,e),t.render(this._imagePlaneScene.sceneOld,e);for(var s=0,c=this._imagePlaneScene.imagePlanes;s<c.length;s++){var u=c[s];u.material.uniforms.opacity.value=this._alpha}t.render(this._imagePlaneScene.scene,e)},e.prototype.clearNeedsRender=function(){this._needsRender=!1},e.prototype.dispose=function(){this._imagePlaneScene.clear()},e.prototype._updateFrameId=function(e){this._frameId=e},e.prototype._updateAlpha=function(e){return e!==this._alpha&&(this._alpha=e,!0)},e.prototype._updateAlphaOld=function(e){return!(e<1||0===this._alphaOld)&&(this._alphaOld=Math.max(0,this._alphaOld-this._fadeOutSpeed),!0)},e.prototype._updateImagePlanes=function(e){if(null==e.currentNode||e.currentNode.key===this._currentKey)return!1;var t=null!=e.previousNode?e.previousNode.key:null,r=e.currentNode.key;if(this._previousKey!==t&&this._previousKey!==r&&this._previousKey in this._providerDisposers&&((0,this._providerDisposers[this._previousKey])(),delete this._providerDisposers[this._previousKey]),null!=t){if(t!==this._currentKey&&t!==this._previousKey){var n=this._imagePlaneFactory.createMesh(e.previousNode,e.previousTransform);this._imagePlaneScene.updateImagePlanes([n])}this._previousKey=t}this._currentKey=r;var i=this._imagePlaneFactory.createMesh(e.currentNode,e.currentTransform);return this._imagePlaneScene.updateImagePlanes([i]),this._alphaOld=1,!0},e}();r.ImagePlaneGLRenderer=o,r.default=o},{"../../Component":230,"../../Geo":233}],263:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this.scene=new n.Scene,this.sceneOld=new n.Scene,this.imagePlanes=[],this.imagePlanesOld=[]}return e.prototype.updateImagePlanes=function(e){this._dispose(this.imagePlanesOld,this.sceneOld);for(var t=0,r=this.imagePlanes;t<r.length;t++){o=r[t];this.scene.remove(o),this.sceneOld.add(o)}for(var n=0,i=e;n<i.length;n++){var o=i[n];this.scene.add(o)}this.imagePlanesOld=this.imagePlanes,this.imagePlanes=e},e.prototype.addImagePlanes=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.scene.add(n),this.imagePlanes.push(n)}},e.prototype.addImagePlanesOld=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.sceneOld.add(n),this.imagePlanesOld.push(n)}},e.prototype.setImagePlanes=function(e){this._clear(),this.addImagePlanes(e)},e.prototype.setImagePlanesOld=function(e){this._clearOld(),this.addImagePlanesOld(e)},e.prototype.clear=function(){this._clear(),this._clearOld()},e.prototype._clear=function(){this._dispose(this.imagePlanes,this.scene),this.imagePlanes.length=0},e.prototype._clearOld=function(){this._dispose(this.imagePlanesOld,this.sceneOld),this.imagePlanesOld.length=0},e.prototype._dispose=function(e,t){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.remove(i),i.geometry.dispose(),i.material.dispose();var o=i.material.uniforms.projectorTex.value;null!=o&&o.dispose()}},e}();r.ImagePlaneScene=i,r.default=i},{three:180}],264:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});e("path");var n=function(){function e(){}return e.equirectangular={fragment:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",vertex:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}"},e.perspective={fragment:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",vertex:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}"},e}();r.ImagePlaneShaders=n},{path:22}],265:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/fromEvent"),e("rxjs/add/observable/of"),e("rxjs/add/observable/zip"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom"),e("rxjs/add/operator/zip");var a=e("../../State"),s=e("../../Render"),c=e("../../Utils"),u=e("../../Component"),h=function(){function e(){this._imagePlaneFactory=new u.ImagePlaneFactory,this._imagePlaneScene=new u.ImagePlaneScene,this._currentKey=null,this._previousKey=null,this._currentPano=!1,this._frameId=0,this._glNeedsRender=!1,this._domNeedsRender=!0,this._curtain=1}return Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"curtain",{get:function(){return this._curtain},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glNeedsRender",{get:function(){return this._glNeedsRender},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domNeedsRender",{get:function(){return this._domNeedsRender},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sliderVisible",{get:function(){return this._sliderVisible},set:function(e){this._sliderVisible=e,this._domNeedsRender=!0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disabled",{get:function(){return null==this._currentKey||null==this._previousKey||this._currentPano},enumerable:!0,configurable:!0}),e.prototype.update=function(e){this._updateFrameId(e.id);var t=this._updateImagePlanes(e.state);this._domNeedsRender=t||this._domNeedsRender,t=this._updateCurtain(e.state.alpha)||t,this._glNeedsRender=t||this._glNeedsRender},e.prototype.updateTexture=function(e,t){var r=t.key===this._currentKey?this._imagePlaneScene.imagePlanes:t.key===this._previousKey?this._imagePlaneScene.imagePlanesOld:[];if(0!==r.length){this._glNeedsRender=!0;for(var n=0,i=r;n<i.length;n++){var o=i[n].material.uniforms.projectorTex.value;o.image=e,o.needsUpdate=!0}}},e.prototype.render=function(e,t){this.disabled||t.render(this._imagePlaneScene.sceneOld,e),t.render(this._imagePlaneScene.scene,e)},e.prototype.dispose=function(){this._imagePlaneScene.clear()},e.prototype.clearGLNeedsRender=function(){this._glNeedsRender=!1},e.prototype.clearDomNeedsRender=function(){this._domNeedsRender=!1},e.prototype._updateFrameId=function(e){this._frameId=e},e.prototype._updateImagePlanes=function(e){if(null!=e.currentNode){var t=!1;return null!=e.previousNode&&this._previousKey!==e.previousNode.key&&(t=!0,this._previousKey=e.previousNode.key,this._imagePlaneScene.setImagePlanesOld([this._imagePlaneFactory.createMesh(e.previousNode,e.previousTransform)])),this._currentKey!==e.currentNode.key&&(t=!0,this._currentKey=e.currentNode.key,this._currentPano=e.currentNode.pano,this._imagePlaneScene.setImagePlanes([this._imagePlaneFactory.createMesh(e.currentNode,e.currentTransform)]),this.disabled||this._updateBbox()),t}},e.prototype._updateCurtain=function(e){return!(this.disabled||Math.abs(this._curtain-e)<.001)&&(this._curtain=e,this._updateBbox(),!0)},e.prototype._updateBbox=function(){for(var e=0,t=this._imagePlaneScene.imagePlanes;e<t.length;e++)t[e].material.uniforms.bbox.value.z=this._curtain},e}(),l=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a._dom=i||new c.DOM,a._sliderStateOperation$=new o.Subject,a._sliderStateCreator$=new o.Subject,a._sliderStateDisposer$=new o.Subject,a._sliderState$=a._sliderStateOperation$.scan(function(e,t){return t(e)},null).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.frameId}),a._sliderStateCreator$.map(function(){return function(e){if(null!=e)throw new Error("Multiple slider states can not be created at the same time");return new h}}).subscribe(a._sliderStateOperation$),a._sliderStateDisposer$.map(function(){return function(e){return e.dispose(),null}}).subscribe(a._sliderStateOperation$),a}return n(t,e),t.prototype.setKeys=function(e){this.configure({keys:e})},t.prototype.setInitialPosition=function(e){this.configure({initialPosition:e})},t.prototype.setSliderVisible=function(e){this.configure({sliderVisible:e})},t.prototype._activate=function(){var e=this;this._sliderContainer=this._dom.createElement("div","mapillary-js-slider-container",this._container.element),this._sliderWrapper=this._dom.createElement("div","SliderWrapper",this._sliderContainer),this._sliderControl=this._dom.createElement("input","SliderControl",this._sliderWrapper),this._sliderControl.setAttribute("type","range"),this._sliderControl.setAttribute("min","0"),this._sliderControl.setAttribute("max","1000"),this._sliderControl.style.visibility="hidden",this._moveToHandler=function(t){var r=Number(t.target.value)/1e3;e._navigator.stateService.moveTo(r)},this._sliderControl.addEventListener("input",this._moveToHandler),this._sliderControl.addEventListener("change",this._moveToHandler),i.Observable.combineLatest(this._navigator.stateService.state$,this._configuration$).first().subscribe(function(t){var r=t[0],n=t[1];if(r===a.State.Traversing){e._navigator.stateService.wait();var i=null!=n.initialPosition?n.initialPosition:1;e._sliderControl.value=(1e3*i).toString(),e._navigator.stateService.moveTo(i)}}),this._glRenderSubscription=this._sliderState$.map(function(t){var r={name:e._name,render:{frameId:t.frameId,needsRender:t.glNeedsRender,render:t.render.bind(t),stage:s.GLRenderStage.Background}};return t.clearGLNeedsRender(),r}).subscribe(this._container.glRenderer.render$),this._domRenderSubscription=this._sliderState$.filter(function(e){return e.domNeedsRender}).subscribe(function(t){e._sliderControl.value=(1e3*t.curtain).toString();var r=t.disabled||!t.sliderVisible?"hidden":"visible";e._sliderControl.style.visibility=r,t.clearDomNeedsRender()}),this._sliderStateCreator$.next(null),this._stateSubscription=this._navigator.stateService.currentState$.map(function(e){return function(t){return t.update(e),t}}).subscribe(this._sliderStateOperation$),this._setSliderVisibleSubscription=this._configuration$.map(function(e){return null==e.sliderVisible||e.sliderVisible}).distinctUntilChanged().map(function(e){return function(t){return t.sliderVisible=e,t}}).subscribe(this._sliderStateOperation$),this._setKeysSubscription=this._configuration$.filter(function(e){return null!=e.keys}).switchMap(function(t){return i.Observable.zip(e._catchCacheNode$(t.keys.background),e._catchCacheNode$(t.keys.foreground)).map(function(e){return{background:e[0],foreground:e[1]}}).zip(e._navigator.stateService.currentState$.first()).map(function(e){return{nodes:e[0],state:e[1].state}})}).subscribe(function(t){null!=t.state.currentNode&&null!=t.state.previousNode&&t.state.currentNode.key===t.nodes.foreground.key&&t.state.previousNode.key===t.nodes.background.key||(t.state.currentNode.key!==t.nodes.background.key?t.state.currentNode.key!==t.nodes.foreground.key||1!==t.state.trajectory.length?(e._navigator.stateService.setNodes([t.nodes.background]),e._navigator.stateService.setNodes([t.nodes.foreground])):e._navigator.stateService.prependNodes([t.nodes.background]):e._navigator.stateService.setNodes([t.nodes.foreground]))},function(e){console.error(e)});var t=this._navigator.stateService.currentState$.map(function(e){return e.state.previousNode}).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.key});this._nodeSubscription=i.Observable.merge(t,this._navigator.stateService.currentNode$).filter(function(e){return e.pano?c.Settings.maxImageSize>c.Settings.basePanoramaSize:c.Settings.maxImageSize>c.Settings.baseImageSize}).mergeMap(function(e){var t=e.pano?c.Settings.basePanoramaSize:c.Settings.baseImageSize;return Math.max(e.image.width,e.image.height)>t?i.Observable.empty():e.cacheImage$(c.Settings.maxImageSize).map(function(e){return[e.image,e]}).catch(function(t,r){return console.error("Failed to fetch high res slider image ("+e.key+")",t),i.Observable.empty()})}).map(function(e){var t=e[0],r=e[1];return function(e){return e.updateTexture(t,r),e}}).subscribe(this._sliderStateOperation$)},t.prototype._deactivate=function(){var e=this;this._navigator.stateService.state$.first().subscribe(function(t){t===a.State.Waiting&&e._navigator.stateService.traverse()}),this._sliderStateDisposer$.next(null),this._setKeysSubscription.unsubscribe(),this._setSliderVisibleSubscription.unsubscribe(),this._stateSubscription.unsubscribe(),this._glRenderSubscription.unsubscribe(),this._domRenderSubscription.unsubscribe(),this._nodeSubscription.unsubscribe(),this.configure({keys:null}),this._sliderControl.removeEventListener("input",this._moveToHandler),this._sliderControl.removeEventListener("change",this._moveToHandler),this._container.element.removeChild(this._sliderContainer),this._moveToHandler=null,this._sliderControl=null,this._sliderWrapper=null,this._sliderContainer=null},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._catchCacheNode$=function(e){return this._navigator.graphService.cacheNode$(e).catch(function(t,r){return console.error("Failed to cache slider node ("+e+")",t),i.Observable.empty()})},t.componentName="slider",t}(u.Component);r.SliderComponent=l,u.ComponentService.register(l),r.default=l},{"../../Component":230,"../../Render":236,"../../State":237,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/add/operator/zip":86}],266:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Hidden=0]="Hidden",e[e.Loading=1]="Loading",e[e.Visible=2]="Visible"}(r.CoverState||(r.CoverState={}))},{}],267:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./ICoverConfiguration");r.CoverState=n.CoverState},{"./ICoverConfiguration":266}],268:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Edge"),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$});this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(t).subscribe(function(t){var r=t[0],n=t[1],i=null;switch(r.keyCode){case 38:i=o.EdgeDirection.Next;break;case 40:i=o.EdgeDirection.Prev;break;default:return}if(r.preventDefault(),r.altKey&&!r.shiftKey&&n.cached)for(var a=0,s=n.edges;a<s.length;a++){var c=s[a];if(c.data.direction===i)return void e._navigator.moveToKey$(c.to).subscribe(function(e){},function(e){console.error(e)})}})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keySequenceNavigation:e}},t}(i.HandlerBase);r.KeySequenceNavigationHandler=a,r.default=a},{"../../Component":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],269:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Edge"),a=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._spatial=i,o}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentNode$.switchMap(function(e){return e.spatialEdges$});this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(t,this._navigator.stateService.currentState$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],a=i.state.currentNode.pano,s=null;switch(r.keyCode){case 37:s=r.shiftKey&&!a?o.EdgeDirection.TurnLeft:o.EdgeDirection.StepLeft;break;case 38:s=r.shiftKey&&!a?o.EdgeDirection.Pano:o.EdgeDirection.StepForward;break;case 39:s=r.shiftKey&&!a?o.EdgeDirection.TurnRight:o.EdgeDirection.StepRight;break;case 40:s=r.shiftKey&&!a?o.EdgeDirection.TurnU:o.EdgeDirection.StepBackward;break;default:return}if(r.preventDefault(),!(r.altKey||!n.cached||r.shiftKey&&a))if(a){var c={};c[o.EdgeDirection.StepBackward]=Math.PI,c[o.EdgeDirection.StepForward]=0,c[o.EdgeDirection.StepLeft]=Math.PI/2,c[o.EdgeDirection.StepRight]=-Math.PI/2;for(var u=e._rotationFromCamera(i.state.camera).phi,h=e._spatial.wrapAngle(u+c[s]),l=Math.PI/4,p=n.edges.filter(function(e){return e.data.direction===o.EdgeDirection.Pano||e.data.direction===s}),f=Number.MAX_VALUE,d=null,m=0,v=p;m<v.length;m++){var g=v[m],y=Math.abs(e._spatial.wrapAngle(g.data.worldMotionAzimuth-h));y<Math.min(f,l)&&(f=y,d=g.to)}if(null==d)return;e._moveToKey(d)}else e._moveDir(s,n)})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keySpatialNavigation:e}},t.prototype._moveDir=function(e,t){for(var r=0,n=t.edges;r<n.length;r++){var i=n[r];if(i.data.direction===e)return void this._moveToKey(i.to)}},t.prototype._moveToKey=function(e){this._navigator.moveToKey$(e).subscribe(function(e){},function(e){console.error(e)})},t.prototype._rotationFromCamera=function(e){var t=e.lookat.clone().sub(e.position),r=t.clone().dot(e.up),n=t.clone().sub(e.up.clone().multiplyScalar(r));return{phi:Math.atan2(n.y,n.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}},t}(i.HandlerBase);r.KeySpatialNavigationHandler=a,r.default=a},{"../../Component":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],270:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/withLatestFrom");var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2];if(!(r.altKey||r.shiftKey||r.ctrlKey||r.metaKey)){var o=0;switch(r.key){case"+":o=1;break;case"-":o=-1;break;default:return}r.preventDefault();var a=e._viewportCoords.unprojectFromViewport(0,0,n.perspective),s=i.projectBasic(a.toArray());e._navigator.stateService.zoomIn(o,s)}})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keyZoom:e}},t}(e("../../Component").HandlerBase);r.KeyZoomHandler=i,r.default=i},{"../../Component":230,"rxjs/add/operator/withLatestFrom":85}],271:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../Component"),o=e("../../Geo"),a=function(e){function t(t,r,n){var a=e.call(this,t,r,n)||this;return a._keyZoomHandler=new i.KeyZoomHandler(a,r,n,new o.ViewportCoords),a._keySequenceNavigationHandler=new i.KeySequenceNavigationHandler(a,r,n),a._keySpatialNavigationHandler=new i.KeySpatialNavigationHandler(a,r,n,new o.Spatial),a}return n(t,e),Object.defineProperty(t.prototype,"keyZoom",{get:function(){return this._keyZoomHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"keySequenceNavigation",{get:function(){return this._keySequenceNavigationHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"keySpatialNavigation",{get:function(){return this._keySpatialNavigationHandler},enumerable:!0,configurable:!0}),t.prototype._activate=function(){var e=this;this._configurationSubscription=this._configuration$.subscribe(function(t){t.keyZoom?e._keyZoomHandler.enable():e._keyZoomHandler.disable(),t.keySequenceNavigation?e._keySequenceNavigationHandler.enable():e._keySequenceNavigationHandler.disable(),t.keySpatialNavigation?e._keySpatialNavigationHandler.enable():e._keySpatialNavigationHandler.disable()})},t.prototype._deactivate=function(){this._configurationSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{keySequenceNavigation:!0,keySpatialNavigation:!0,keyZoom:!0}},t.componentName="keyboard",t}(i.Component);r.KeyboardComponent=a,i.ComponentService.register(a),r.default=a},{"../../Component":230,"../../Geo":233}],272:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./MarkerComponent");r.MarkerComponent=n.MarkerComponent;var i=e("./marker/SimpleMarker");r.SimpleMarker=i.SimpleMarker;var o=e("./marker/CircleMarker");r.CircleMarker=o.CircleMarker},{"./MarkerComponent":273,"./marker/CircleMarker":276,"./marker/SimpleMarker":278}],273:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("when"),a=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map");var s=e("../../Component"),c=e("../../Render"),u=e("../../Graph"),h=e("../../Geo"),l=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._relativeGroundAltitude=-2,i._geoCoords=new h.GeoCoords,i._graphCalculator=new u.GraphCalculator,i._markerScene=new s.MarkerScene,i._markerSet=new s.MarkerSet,i._viewportCoords=new h.ViewportCoords,i}return n(t,e),t.prototype.add=function(e){this._markerSet.add(e)},t.prototype.get=function(e){return this._markerSet.get(e)},t.prototype.getAll=function(){return this._markerSet.getAll()},t.prototype.getMarkerIdAt=function(e){var t=this;return o.promise(function(r,n){t._container.renderService.renderCamera$.first().map(function(r){var n=t._viewportCoords.canvasToViewport(e[0],e[1],t._container.element);return t._markerScene.intersectObjects(n,r.perspective)}).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.has=function(e){return this._markerSet.has(e)},t.prototype.remove=function(e){this._markerSet.remove(e)},t.prototype.removeAll=function(){this._markerSet.removeAll()},t.prototype._activate=function(){var e=this,r=this._navigator.stateService.currentState$.map(function(t){return t.state.camera.position.z+e._relativeGroundAltitude}).distinctUntilChanged(function(e,t){return Math.abs(e-t)<.01}).publishReplay(1).refCount(),n=a.Observable.combineLatest(r,this._navigator.stateService.reference$).first().map(function(){}).publishReplay(1).refCount(),o=this._configuration$.map(function(e){return{visibleBBoxSize:Math.max(1,Math.min(200,e.visibleBBoxSize))}}),s=this._navigator.stateService.currentNode$.map(function(e){return e.latLon}).publishReplay(1).refCount(),u=a.Observable.combineLatest(o,s).map(function(t){var r=t[0],n=t[1];return e._graphCalculator.boundingBoxCorners(n,r.visibleBBoxSize/2)}).publishReplay(1).refCount(),h=a.Observable.combineLatest(a.Observable.of(this._markerSet).concat(this._markerSet.changed$),u).map(function(e){var t=e[0],r=e[1];return t.search(r)});this._setChangedSubscription=n.switchMap(function(){return h.withLatestFrom(e._navigator.stateService.reference$,r)}).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=e._geoCoords,a=e._markerScene,s=a.markers,c=Object.assign({},s),u=0,h=r;u<h.length;u++){var l=h[u];if(l.id in s)delete c[l.id];else{var p=o.geodeticToEnu(l.latLon.lat,l.latLon.lon,n.alt+i,n.lat,n.lon,n.alt);a.add(l,p)}}for(var f in c)c.hasOwnProperty(f)&&a.remove(f)}),this._markersUpdatedSubscription=n.switchMap(function(){return e._markerSet.updated$.withLatestFrom(u,e._navigator.stateService.reference$,r)}).subscribe(function(t){for(var r=t[0],n=t[1],i=n[0],o=n[1],a=t[2],s=t[3],c=e._geoCoords,u=e._markerScene,h=0,l=r;h<l.length;h++){var p=l[h],f=u.has(p.id),d=p.latLon.lat>i.lat&&p.latLon.lat<o.lat&&p.latLon.lon>i.lon&&p.latLon.lon<o.lon;if(d){var m=c.geodeticToEnu(p.latLon.lat,p.latLon.lon,a.alt+s,a.lat,a.lon,a.alt);u.add(p,m)}else!d&&f&&u.remove(p.id)}}),this._referenceSubscription=this._navigator.stateService.reference$.skip(1).withLatestFrom(r).subscribe(function(t){for(var r=t[0],n=t[1],i=e._geoCoords,o=e._markerScene,a=0,s=o.getAll();a<s.length;a++){var c=s[a],u=i.geodeticToEnu(c.latLon.lat,c.latLon.lon,r.alt+n,r.lat,r.lon,r.alt);o.update(c.id,u)}}),this._adjustHeightSubscription=r.skip(1).withLatestFrom(this._navigator.stateService.reference$,s).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=e._geoCoords,a=e._markerScene,s=o.geodeticToEnu(i.lat,i.lon,n.alt+r,n.lat,n.lon,n.alt),c=0,u=a.getAll();c<u.length;c++){var h=u[c],l=o.geodeticToEnu(h.latLon.lat,h.latLon.lon,n.alt+r,n.lat,n.lon,n.alt),p=l[0]-s[0],f=l[1]-s[1],d=Math.sqrt(p*p+f*f);d>50||a.lerpAltitude(h.id,r,Math.min(1,Math.max(0,1.2-1.2*d/50)))}}),this._renderSubscription=this._navigator.stateService.currentState$.map(function(t){var r=e._markerScene;return{name:e._name,render:{frameId:t.id,needsRender:r.needsRender,render:r.render.bind(r),stage:c.GLRenderStage.Foreground}}}).subscribe(this._container.glRenderer.render$);var l=a.Observable.combineLatest(this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$).map(function(t){var r=t[0],n=t[1],i=e._container.element,o=e._viewportCoords.canvasPosition(n,i),a=o[0],s=o[1],c=e._viewportCoords.canvasToViewport(a,s,i);return e._markerScene.intersectObjects(c,r.perspective)}).publishReplay(1).refCount(),p=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).map(function(e){return!0}),f=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragEnd$).map(function(e){return!1}),d=a.Observable.merge(p,f).startWith(!1);this._dragEventSubscription=p.withLatestFrom(l).merge(a.Observable.combineLatest(f,a.Observable.of(null))).startWith([!1,null]).pairwise().subscribe(function(r){var n=r[0],i=r[1],o=i[0],a=o?t.dragstart:t.dragend,s=o?i[1]:n[1],c={marker:e._markerScene.get(s),target:e,type:a};e.fire(a,c)});var m=a.Observable.merge(this._container.mouseService.mouseDown$.map(function(e){return!0}),this._container.mouseService.documentMouseUp$.map(function(e){return!1})).startWith(!1);this._mouseClaimSubscription=a.Observable.combineLatest(this._container.mouseService.active$,l.distinctUntilChanged(),m,d).map(function(e){var t=e[0],r=e[1],n=e[2],i=e[3];return!t&&null!=r&&n||i}).distinctUntilChanged().subscribe(function(t){t?(e._container.mouseService.claimMouse(e._name,1),e._container.mouseService.claimWheel(e._name,1)):(e._container.mouseService.unclaimMouse(e._name),e._container.mouseService.unclaimWheel(e._name))});var v=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).withLatestFrom(l,this._container.renderService.renderCamera$).map(function(t){var r=t[0],n=t[1],i=t[2],o=e._markerScene.get(n),a=e._container.element,s=e._viewportCoords.projectToCanvas(o.geometry.position.toArray(),a,i.perspective),c=s[0],u=s[1],h=e._viewportCoords.canvasPosition(r,a);return[o,[h[0]-c,h[1]-u],i]}).publishReplay(1).refCount();this._updateMarkerSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$).withLatestFrom(v,this._navigator.stateService.reference$,o).subscribe(function(r){var n=r[0],o=r[1],a=o[0],s=o[1],c=o[2],u=r[2],h=r[3];if(e._markerScene.has(a.id)){var l=e._container.element,p=e._viewportCoords.canvasPosition(n,l),f=p[0],d=p[1],m=f-s[0],v=d-s[1],g=e._viewportCoords.canvasToViewport(m,v,l),y=g[0],b=g[1],_=new i.Vector3(y,b,1).unproject(c.perspective).sub(c.perspective.position).normalize(),x=Math.min(e._relativeGroundAltitude/_.z,h.visibleBBoxSize/2-.1);if(!(x<0)){var w=_.clone().multiplyScalar(x).add(c.perspective.position);w.z=c.perspective.position.z+e._relativeGroundAltitude;var S=e._geoCoords.enuToGeodetic(w.x,w.y,w.z,u.lat,u.lon,u.alt),M=S[0],E=S[1];e._markerScene.update(a.id,w.toArray(),{lat:M,lon:E}),e._markerSet.update(a);var C={marker:a,target:e,type:t.changed};e.fire(t.changed,C)}}})},t.prototype._deactivate=function(){this._adjustHeightSubscription.unsubscribe(),this._dragEventSubscription.unsubscribe(),this._markersUpdatedSubscription.unsubscribe(),this._mouseClaimSubscription.unsubscribe(),this._referenceSubscription.unsubscribe(),this._renderSubscription.unsubscribe(),this._setChangedSubscription.unsubscribe(),this._updateMarkerSubscription.unsubscribe(),this._markerScene.clear()},t.prototype._getDefaultConfiguration=function(){return{visibleBBoxSize:100}},t.componentName="marker",t.changed="changed",t.dragstart="dragstart",t.dragend="dragend",t}(s.Component);r.MarkerComponent=l,s.ComponentService.register(l),r.default=l},{"../../Component":230,"../../Geo":233,"../../Graph":234,"../../Render":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,three:180,when:227}],274:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t){this._needsRender=!1,this._interactiveObjects=[],this._markers={},this._objectMarkers={},this._raycaster=t||new n.Raycaster,this._scene=e||new n.Scene}return Object.defineProperty(e.prototype,"markers",{get:function(){return this._markers},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.add=function(e,t){e.id in this._markers&&this._dispose(e.id),e.createGeometry(t),this._scene.add(e.geometry),this._markers[e.id]=e;for(var r=0,n=e.getInteractiveObjects();r<n.length;r++){var i=n[r];this._interactiveObjects.push(i),this._objectMarkers[i.uuid]=e.id}this._needsRender=!0},e.prototype.clear=function(){for(var e in this._markers)this._markers.hasOwnProperty&&this._dispose(e);this._needsRender=!0},e.prototype.get=function(e){return this._markers[e]},e.prototype.getAll=function(){var e=this;return Object.keys(this._markers).map(function(t){return e._markers[t]})},e.prototype.has=function(e){return e in this._markers},e.prototype.intersectObjects=function(e,t){var r=e[0],i=e[1];this._raycaster.setFromCamera(new n.Vector2(r,i),t);for(var o=0,a=this._raycaster.intersectObjects(this._interactiveObjects);o<a.length;o++){var s=a[o];if(s.object.uuid in this._objectMarkers)return this._objectMarkers[s.object.uuid]}return null},e.prototype.lerpAltitude=function(e,t,r){e in this._markers&&(this._markers[e].lerpAltitude(t,r),this._needsRender=!0)},e.prototype.remove=function(e){e in this._markers&&(this._dispose(e),this._needsRender=!0)},e.prototype.render=function(e,t){t.render(this._scene,e),this._needsRender=!1},e.prototype.update=function(e,t,r){e in this._markers&&(this._markers[e].updatePosition(t,r),this._needsRender=!0)},e.prototype._dispose=function(e){var t=this._markers[e];this._scene.remove(t.geometry);for(var r=0,n=t.getInteractiveObjects();r<n.length;r++){var i=n[r],o=this._interactiveObjects.indexOf(i);-1!==o?this._interactiveObjects.splice(o,1):console.warn("Object does not exist ("+i.id+") for "+e),delete this._objectMarkers[i.uuid]}t.disposeGeometry(),delete this._markers[e]},e}();r.MarkerScene=i,r.default=i},{three:180}],275:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rbush"),i=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan");var o=function(){function e(){this._hash={},this._index=n(16,[".lon",".lat",".lon",".lat"]),this._indexChanged$=new i.Subject,this._updated$=new i.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._indexChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated$",{get:function(){return this._updated$},enumerable:!0,configurable:!0}),e.prototype.add=function(e){for(var t=[],r=this._hash,n=this._index,i=0,o=e;i<o.length;i++){var a=o[i],s=a.id;s in r&&(n.remove(r[s]),t.push(a));var c={lat:a.latLon.lat,lon:a.latLon.lon,marker:a};r[s]=c,n.insert(c)}t.length>0&&this._updated$.next(t),e.length>t.length&&this._indexChanged$.next(this)},e.prototype.has=function(e){return e in this._hash},e.prototype.get=function(e){return this.has(e)?this._hash[e].marker:void 0},e.prototype.getAll=function(){return this._index.all().map(function(e){return e.marker})},e.prototype.remove=function(e){for(var t=this._hash,r=this._index,n=!1,i=0,o=e;i<o.length;i++){var a=o[i];if(a in t){var s=t[a];r.remove(s),delete t[a],n=!0}}n&&this._indexChanged$.next(this)},e.prototype.removeAll=function(){this._hash={},this._index.clear(),this._indexChanged$.next(this)},e.prototype.search=function(e){var t=e[0],r=e[1];return this._index.search({maxX:r.lon,maxY:r.lat,minX:t.lon,minY:t.lat}).map(function(e){return e.marker})},e.prototype.update=function(e){var t=this._hash,r=this._index,n=e.id;if(n in t){r.remove(t[n]);var i={lat:e.latLon.lat,lon:e.latLon.lon,marker:e};t[n]=i,r.insert(i)}},e}();r.MarkerSet=o,r.default=o},{rbush:25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74}],276:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._color=null!=n.color?n.color:16777215,i._opacity=null!=n.opacity?n.opacity:.4,i._radius=null!=n.radius?n.radius:1,i}return n(t,e),t.prototype._createGeometry=function(e){var t=new i.Mesh(new i.CircleGeometry(this._radius,16),new i.MeshBasicMaterial({color:this._color,opacity:this._opacity,transparent:!0}));t.up.fromArray([0,0,1]),t.renderOrder=-1;var r=new i.Object3D;r.add(t),r.position.fromArray(e),this._geometry=r},t.prototype._disposeGeometry=function(){for(var e=0,t=this._geometry.children;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}},t.prototype._getInteractiveObjects=function(){return[]},t}(e("../../../Component").Marker);r.CircleMarker=o,r.default=o},{"../../../Component":230,three:180}],277:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){this._id=e,this._latLon=t}return Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"latLon",{get:function(){return this._latLon},enumerable:!0,configurable:!0}),e.prototype.createGeometry=function(e){this._geometry||(this._createGeometry(e),this._geometry.updateMatrixWorld(!0))},e.prototype.disposeGeometry=function(){this._geometry&&(this._disposeGeometry(),this._geometry=void 0)},e.prototype.getInteractiveObjects=function(){return this._geometry?this._getInteractiveObjects():[]},e.prototype.lerpAltitude=function(e,t){this._geometry&&(this._geometry.position.z=(1-t)*this._geometry.position.z+t*e)},e.prototype.updatePosition=function(e,t){t&&(this._latLon.lat=t.lat,this._latLon.lon=t.lon),this._geometry&&(this._geometry.position.fromArray(e),this._geometry.updateMatrixWorld(!0))},e}();r.Marker=n,r.default=n},{}],278:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._ballColor=null!=n.ballColor?n.ballColor:16711680,i._ballOpacity=null!=n.ballOpacity?n.ballOpacity:.8,i._circleToRayAngle=2,i._color=null!=n.color?n.color:16711680,i._interactive=!!n.interactive,i._opacity=null!=n.opacity?n.opacity:.4,i._radius=null!=n.radius?n.radius:1,i}return n(t,e),t.prototype._createGeometry=function(e){var t=this._radius,r=new i.Mesh(this._markerGeometry(t,8,8),new i.MeshBasicMaterial({color:this._color,opacity:this._opacity,shading:i.SmoothShading,transparent:!0}));r.renderOrder=1;var n=new i.Mesh(new i.SphereGeometry(t/2,8,8),new i.MeshBasicMaterial({color:this._ballColor,opacity:this._ballOpacity,shading:i.SmoothShading,transparent:!0}));n.position.z=this._markerHeight(t);var o=new i.Object3D;o.add(n),o.add(r),o.position.fromArray(e),this._geometry=o},t.prototype._disposeGeometry=function(){for(var e=0,t=this._geometry.children;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}},t.prototype._getInteractiveObjects=function(){return this._interactive?[this._geometry.children[0]]:[]},t.prototype._markerHeight=function(e){var t=Math.tan(Math.PI-this._circleToRayAngle);return e*Math.sqrt(1+t*t)},t.prototype._markerGeometry=function(e,t,r){var n=new i.Geometry;t=Math.max(3,Math.floor(t)||8),r=Math.max(2,Math.floor(r)||6);for(var o=this._markerHeight(e),a=[],s=0;s<=r;++s){for(var c=[],u=0;u<=t;++u){var h=u/t*Math.PI*2,l=s/r*Math.PI,p=void 0;if(l<this._circleToRayAngle)p=e;else{var f=Math.tan(l-this._circleToRayAngle);p=e*Math.sqrt(1+f*f)}var d=new i.Vector3;d.x=p*Math.cos(h)*Math.sin(l),d.y=p*Math.sin(h)*Math.sin(l),d.z=p*Math.cos(l)+o,n.vertices.push(d),c.push(n.vertices.length-1)}a.push(c)}for(s=0;s<r;++s)for(u=0;u<t;++u){var m=a[s][u+1],v=a[s][u],g=a[s+1][u],y=a[s+1][u+1],b=n.vertices[m].clone().normalize(),_=n.vertices[v].clone().normalize(),x=n.vertices[g].clone().normalize(),w=n.vertices[y].clone().normalize();n.faces.push(new i.Face3(m,v,y,[b,_,w])),n.faces.push(new i.Face3(v,g,y,[_.clone(),x,w.clone()]))}return n.computeFaceNormals(),n.boundingSphere=new i.Sphere(new i.Vector3,e+o),n},t}(e("../../../Component").Marker);r.SimpleMarker=o,r.default=o},{"../../../Component":230,three:180}],279:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n)||this;return a._spatial=o,a._viewportCoords=i,a._basicDistanceThreshold=.001,a._basicRotationThreshold=.05,a._bounceCoeff=.1,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentState$.map(function(e){return e.state.alpha<1});this._bounceSubscription=i.Observable.combineLatest(t,this._navigator.stateService.inTranslation$,this._container.mouseService.active$,this._container.touchService.active$).map(function(e){return e[0]||e[1]||e[2]||e[3]}).distinctUntilChanged().switchMap(function(t){return t?i.Observable.empty():i.Observable.combineLatest(e._container.renderService.renderCamera$,e._navigator.stateService.currentTransform$.first())}).subscribe(function(t){var r=t[0],n=r.perspective,i=t[1];if((i.hasValidScale||!(r.camera.focal<.1))&&0!==r.perspective.aspect&&r.perspective.aspect!==Number.POSITIVE_INFINITY){var o=e._basicDistanceThreshold/Math.pow(2,r.zoom),a=e._viewportCoords.viewportToBasic(0,0,i,n);if(!(Math.abs(a[0]-.5)<o&&Math.abs(a[1]-.5)<o)){var s=e._viewportCoords.getBasicDistances(i,n),c=0,u=0;if(!(s[0]<o&&s[1]<o&&s[2]<o&&s[3]<o||Math.abs(s[0]-s[2])<o&&Math.abs(s[1]-s[3])<o)){var h=e._bounceCoeff;s[1]>0&&0===s[3]?c=-h*s[1]:0===s[1]&&s[3]>0?c=h*s[3]:s[1]>0&&s[3]>0&&(c=h*(s[3]-s[1])/2),s[0]>0&&0===s[2]?u=h*s[0]:0===s[0]&&s[2]>0?u=-h*s[2]:s[0]>0&&s[2]>0&&(u=h*(s[0]-s[2])/2);var l=e._basicRotationThreshold;c=e._spatial.clamp(c,-l,l),u=e._spatial.clamp(u,-l,l),e._navigator.stateService.rotateBasicUnbounded([c,u])}}}})},t.prototype._disable=function(){this._bounceSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{}},t}(e("../../Component").HandlerBase);r.BounceHandler=o,r.default=o},{"../../Component":230,"rxjs/Observable":29}],280:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._zoomSubscription=i.Observable.merge(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.dblClick$),this._container.touchService.doubleTap$.map(function(e){var t=e.touches[0];return{clientX:t.clientX,clientY:t.clientY,shiftKey:e.shiftKey}})).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=r.shiftKey?-1:1;e._navigator.stateService.zoomIn(l,h)})},t.prototype._disable=function(){this._zoomSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{doubleClickZoom:e}},t}(e("../../Component").HandlerBase);r.DoubleClickZoomHandler=o,r.default=o},{"../../Component":230,"rxjs/Observable":29}],281:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("rxjs/Observable");e("rxjs/add/operator/concat"),e("rxjs/add/operator/sample"),e("rxjs/add/operator/takeWhile");var a=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n)||this;return a._spatial=o,a._viewportCoords=i,a._basicRotationThreshold=.05,a._forceCoeff=.2,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragStart$).map(function(e){return!0}),r=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$).map(function(e){return!1});this._activeMouseSubscription=o.Observable.merge(t,r).subscribe(this._container.mouseService.activate$),this._preventDefaultSubscription=o.Observable.merge(t,r).switchMap(function(t){return t?e._container.mouseService.documentMouseMove$:o.Observable.empty()}).merge(this._container.touchService.touchMove$).subscribe(function(e){e.preventDefault()});var n=this._container.touchService.singleTouchDragStart$.map(function(e){return!0}),a=this._container.touchService.singleTouchDragEnd$.map(function(e){return!1});this._activeTouchSubscription=o.Observable.merge(n,a).subscribe(this._container.touchService.activate$);var s=this._navigator.stateService.currentState$.map(function(e){return e.state.currentNode.fullPano||e.state.nodesAhead<1}).distinctUntilChanged().switchMap(function(t){if(!t)return o.Observable.empty();var r=e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDragStart$).switchMap(function(t){return o.Observable.of(t).concat(e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDrag$)).merge(e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDragEnd$).map(function(e){return null})).takeWhile(function(e){return!!e}).startWith(null)}).pairwise().filter(function(e){return null!=e[0]&&null!=e[1]}),n=o.Observable.merge(e._container.touchService.singleTouchDragStart$,e._container.touchService.singleTouchDrag$,e._container.touchService.singleTouchDragEnd$.map(function(e){return null})).map(function(e){return null!=e&&e.touches.length>0?e.touches[0]:null}).pairwise().filter(function(e){return null!=e[0]&&null!=e[1]});return o.Observable.merge(r,n)}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,this._navigator.stateService.currentCamera$).map(function(t){var r=t[0],n=t[1],o=t[2],a=t[3].clone(),s=r[0],c=r[1],u=c.clientX-s.clientX,h=c.clientY-s.clientY,l=e._container.element,p=e._viewportCoords.canvasPosition(c,l),f=p[0],d=p[1],m=e._viewportCoords.unprojectFromCanvas(f,d,l,n.perspective).sub(n.perspective.position),v=e._viewportCoords.unprojectFromCanvas(f-u,d,l,n.perspective).sub(n.perspective.position),g=e._viewportCoords.unprojectFromCanvas(f,d-h,l,n.perspective).sub(n.perspective.position),y=(u>0?1:-1)*v.angleTo(m),b=(h>0?-1:1)*g.angleTo(m),_=(new i.Quaternion).setFromUnitVectors(a.up,new i.Vector3(0,0,1)),x=_.clone().inverse(),w=new i.Vector3;w.copy(a.lookat).sub(a.position),w.applyQuaternion(_);var S=w.length(),M=Math.atan2(w.y,w.x);M+=y;var E=Math.atan2(Math.sqrt(w.x*w.x+w.y*w.y),w.z);E+=b,E=Math.max(.01,Math.min(Math.PI-.01,E)),w.x=Math.sin(E)*Math.cos(M),w.y=Math.sin(E)*Math.sin(M),w.z=Math.cos(E),w.applyQuaternion(x);var C=(new i.Vector3).copy(a.position).add(w.multiplyScalar(S)),T=o.projectBasic(C.toArray()),O=o.projectBasic(a.lookat.toArray()),P=T[0]-O[0],j=T[1]-O[1];Math.abs(P)>1?P=0:P>.5?P-=1:P<-.5&&(P+=1);var A=e._basicRotationThreshold;if(P=e._spatial.clamp(P,-A,A),j=e._spatial.clamp(j,-A,A),o.fullPano)return[P,j];var R=e._viewportCoords.getPixelDistances(e._container.element,o,n.perspective),L=e._forceCoeff;return R[0]>0&&j<0&&T[1]<.5&&(j/=Math.max(1,L*R[0])),R[1]>0&&P>0&&T[0]>.5&&(P/=Math.max(1,L*R[1])),R[2]>0&&j>0&&T[1]>.5&&(j/=Math.max(1,L*R[2])),R[3]>0&&P<0&&T[0]<.5&&(P/=Math.max(1,L*R[3])),[P,j]}).share();this._rotateBasicWithoutInertiaSubscription=s.subscribe(function(t){e._navigator.stateService.rotateBasicWithoutInertia(t)}),this._rotateBasicSubscription=s.scan(function(t,r){return e._drainBuffer(t),t.push([Date.now(),r]),t},[]).sample(o.Observable.merge(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$),this._container.touchService.singleTouchDragEnd$)).map(function(t){for(var r=e._drainBuffer(t.slice()),n=[0,0],i=0,o=r;i<o.length;i++){var a=o[i];n[0]+=a[1][0],n[1]+=a[1][1]}var s=r.length;return s>0&&(n[0]/=s,n[1]/=s),n}).subscribe(function(t){e._navigator.stateService.rotateBasic(t)})},t.prototype._disable=function(){this._activeMouseSubscription.unsubscribe(),this._activeTouchSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._rotateBasicSubscription.unsubscribe(),this._rotateBasicWithoutInertiaSubscription.unsubscribe(),this._activeMouseSubscription=null,this._activeTouchSubscription=null,this._preventDefaultSubscription=null,this._rotateBasicSubscription=null},t.prototype._getConfiguration=function(e){return{dragPan:e}},t.prototype._drainBuffer=function(e){for(var t=Date.now();e.length>0&&t-e[0][0]>50;)e.shift();return e},t}(e("../../Component").HandlerBase);r.DragPanHandler=a,r.default=a},{"../../Component":230,"rxjs/Observable":29,"rxjs/add/operator/concat":54,"rxjs/add/operator/sample":73,"rxjs/add/operator/takeWhile":83,three:180}],282:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/observable/merge"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Geo"),a=function(e){function t(t,r,n){var a=e.call(this,t,r,n)||this,s=new o.Spatial,c=new o.ViewportCoords;return a._spatial=s,a._viewportCoords=c,a._bounceHandler=new i.BounceHandler(a,r,n,c,s),a._doubleClickZoomHandler=new i.DoubleClickZoomHandler(a,r,n,c),a._dragPanHandler=new i.DragPanHandler(a,r,n,c,s),a._scrollZoomHandler=new i.ScrollZoomHandler(a,r,n,c),a._touchZoomHandler=new i.TouchZoomHandler(a,r,n,c),a}return n(t,e),Object.defineProperty(t.prototype,"doubleClickZoom",{get:function(){return this._doubleClickZoomHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dragPan",{get:function(){return this._dragPanHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"scrollZoom",{get:function(){return this._scrollZoomHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touchZoom",{get:function(){return this._touchZoomHandler},enumerable:!0,configurable:!0}),t.prototype._activate=function(){var e=this;this._bounceHandler.enable(),this._configurationSubscription=this._configuration$.subscribe(function(t){t.doubleClickZoom?e._doubleClickZoomHandler.enable():e._doubleClickZoomHandler.disable(),t.dragPan?e._dragPanHandler.enable():e._dragPanHandler.disable(),t.scrollZoom?e._scrollZoomHandler.enable():e._scrollZoomHandler.disable(),t.touchZoom?e._touchZoomHandler.enable():e._touchZoomHandler.disable()}),this._container.mouseService.claimMouse(this._name,0)},t.prototype._deactivate=function(){this._container.mouseService.unclaimMouse(this._name),this._configurationSubscription.unsubscribe(),this._bounceHandler.disable(),this._doubleClickZoomHandler.disable(),this._dragPanHandler.disable(),this._scrollZoomHandler.disable(),this._touchZoomHandler.disable()},t.prototype._getDefaultConfiguration=function(){return{doubleClickZoom:!0,dragPan:!0,scrollZoom:!0,touchZoom:!0}},t.componentName="mouse",t}(i.Component);r.MouseComponent=a,i.ComponentService.register(a),r.default=a},{"../../Component":230,"../../Geo":233,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85}],283:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._container.mouseService.claimWheel(this._component.name,0),this._preventDefaultSubscription=this._container.mouseService.mouseWheel$.subscribe(function(e){e.preventDefault()}),this._zoomSubscription=this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$).withLatestFrom(this._navigator.stateService.currentState$,function(e,t){return[e,t]}).filter(function(e){var t=e[1].state;return t.currentNode.fullPano||t.nodesAhead<1}).map(function(e){return e[0]}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,function(e,t,r){return[e,t,r]}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=r.deltaY;1===r.deltaMode?l*=40:2===r.deltaMode&&(l*=800);var p=-3*l/e._viewportCoords.containerToCanvas(o)[1];e._navigator.stateService.zoomIn(p,h)})},t.prototype._disable=function(){this._container.mouseService.unclaimWheel(this._component.name),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null},t.prototype._getConfiguration=function(e){return{scrollZoom:e}},t}(e("../../Component").HandlerBase);r.ScrollZoomHandler=i,r.default=i},{"../../Component":230}],284:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._preventDefaultSubscription=this._container.touchService.pinch$.subscribe(function(e){e.originalEvent.preventDefault()});var t=this._container.touchService.pinchStart$.map(function(e){return!0}),r=this._container.touchService.pinchEnd$.map(function(e){return!1});this._activeSubscription=i.Observable.merge(t,r).subscribe(this._container.touchService.activate$),this._zoomSubscription=this._container.touchService.pinch$.withLatestFrom(this._navigator.stateService.currentState$).filter(function(e){var t=e[1].state;return t.currentNode.fullPano||t.nodesAhead<1}).map(function(e){return e[0]}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=e._viewportCoords.containerToCanvas(o),p=l[0],f=l[1],d=3*r.distanceChange/Math.min(p,f);e._navigator.stateService.zoomIn(d,h)})},t.prototype._disable=function(){this._activeSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null},t.prototype._getConfiguration=function(e){return{touchZoom:e}},t}(e("../../Component").HandlerBase);r.TouchZoomHandler=o,r.default=o},{"../../Component":230,"rxjs/Observable":29}],285:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./popup/Popup");r.Popup=n.Popup;var i=e("./PopupComponent");r.PopupComponent=i.PopupComponent},{"./PopupComponent":286,"./popup/Popup":287}],286:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject"),a=e("../../Component"),s=e("../../Utils"),c=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a._dom=i||new s.DOM,a._popups=[],a._added$=new o.Subject,a._popups$=new o.Subject,a}return n(t,e),t.prototype.add=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];-1===this._popups.indexOf(n)&&(this._popups.push(n),this._activated&&n.setParentContainer(this._popupContainer))}this._added$.next(e),this._popups$.next(this._popups)},t.prototype.getAll=function(){return this._popups.slice()},t.prototype.remove=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this._remove(n)}this._popups$.next(this._popups)},t.prototype.removeAll=function(){for(var e=0,t=this._popups.slice();e<t.length;e++){var r=t[e];this._remove(r)}this._popups$.next(this._popups)},t.prototype._activate=function(){var e=this;this._popupContainer=this._dom.createElement("div","mapillary-js-popup-container",this._container.element);for(var t=0,r=this._popups;t<r.length;t++)r[t].setParentContainer(this._popupContainer);this._updateAllSubscription=i.Observable.combineLatest(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=0,a=e._popups;o<a.length;o++)a[o].update(r,n,i)});var n=this._popups$.startWith(this._popups).switchMap(function(e){return i.Observable.from(e).mergeMap(function(e){return e.changed$})}).map(function(e){return[e]});this._updateAddedChangedSubscription=this._added$.merge(n).withLatestFrom(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe(function(e){for(var t=e[0],r=e[1],n=e[2],i=e[3],o=0,a=t;o<a.length;o++)a[o].update(r,n,i)})},t.prototype._deactivate=function(){this._updateAllSubscription.unsubscribe(),this._updateAddedChangedSubscription.unsubscribe();for(var e=0,t=this._popups;e<t.length;e++)t[e].remove();this._container.element.removeChild(this._popupContainer),delete this._popupContainer},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._remove=function(e){var t=this._popups.indexOf(e);if(-1!==t){var r=this._popups.splice(t,1)[0];this._activated&&r.remove()}},t.componentName="popup",t}(a.Component);r.PopupComponent=c,a.ComponentService.register(c),r.default=c},{"../../Component":230,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34}],287:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("../../../Geo"),o=e("../../../Utils"),a=e("../../../Viewer"),s=function(){function e(e,t,r){this._options={},e&&(this._options.capturePointer=null==e.capturePointer||e.capturePointer,this._options.clean=e.clean,this._options.float=e.float,this._options.offset=e.offset,this._options.opacity=e.opacity,this._options.position=e.position),this._dom=r||new o.DOM,this._viewportCoords=t||new i.ViewportCoords,this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e.prototype.remove=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._parentContainer&&delete this._parentContainer},e.prototype.setBasicPoint=function(e){this._point=e.slice(),this._rect=null,this._notifyChanged$.next(this)},e.prototype.setBasicRect=function(e){this._rect=e.slice(),this._point=null,this._notifyChanged$.next(this)},e.prototype.setDOMContent=function(e){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content);var t="mapillaryjs-popup-content"+(!0===this._options.clean?"-clean":"")+(!0===this._options.capturePointer?" mapillaryjs-popup-capture-pointer":"");this._content=this._dom.createElement("div",t,this._container),this._content.appendChild(e),this._notifyChanged$.next(this)},e.prototype.setHTML=function(e){var t,r=this._dom.document.createDocumentFragment(),n=this._dom.createElement("body");for(n.innerHTML=e;;){if(!(t=n.firstChild))break;r.appendChild(t)}this.setDOMContent(r)},e.prototype.setText=function(e){this.setDOMContent(this._dom.document.createTextNode(e))},e.prototype.setParentContainer=function(e){this._parentContainer=e},e.prototype.update=function(e,t,r){if(this._parentContainer&&this._content&&(this._point||this._rect)){if(!this._container){if(this._container=this._dom.createElement("div","mapillaryjs-popup",this._parentContainer),!0!==this._options.clean&&this._options.float!==a.Alignment.Center){var n="mapillaryjs-popup-tip"+(!0===this._options.capturePointer?" mapillaryjs-popup-capture-pointer":"");this._tip=this._dom.createElement("div",n,this._container),this._dom.createElement("div","mapillaryjs-popup-tip-inner",this._tip)}this._container.appendChild(this._content),this._parentContainer.appendChild(this._container),null!=this._options.opacity&&(this._container.style.opacity=this._options.opacity.toString())}var i=null,o=this._alignmentToPopupAligment(this._options.position),s=this._alignmentToPopupAligment(this._options.float);if(null!=this._point)i=this._viewportCoords.basicToCanvasSafe(this._point[0],this._point[1],{offsetHeight:t.height,offsetWidth:t.width},r,e.perspective);else{for(var c=this._container.classList,u=null,h=0,l=["center","top","bottom","left","right","top-left","top-right","bottom-left","bottom-right"];h<l.length;h++){var p=l[h];if(c.contains("mapillaryjs-popup-float-"+p)){u=p;break}}i=(_=this._rectToPixel(this._rect,o,u,e,t,r))[0],o=_[1],s||(s=o)}if(null!=i){if(this._container.style.visibility="visible",!s){var f=this._container.offsetWidth,d=this._container.offsetHeight,m=this._pixelToFloats(i,t,f,d);s=0===m.length?"top":m.join("-")}var v=this._normalizeOffset(this._options.offset);i=[i[0]+v[s][0],i[1]+v[s][1]],i=[Math.round(i[0]),Math.round(i[1])];var g={bottom:"translate(-50%,0)","bottom-left":"translate(-100%,0)","bottom-right":"translate(0,0)",center:"translate(-50%,-50%)",left:"translate(-100%,-50%)",right:"translate(0,-50%)",top:"translate(-50%,-100%)","top-left":"translate(-100%,-100%)","top-right":"translate(0,-100%)"},y=this._container.classList;for(var b in g)g.hasOwnProperty(b)&&y.remove("mapillaryjs-popup-float-"+b);y.add("mapillaryjs-popup-float-"+s),this._container.style.transform=g[s]+" translate("+i[0]+"px,"+i[1]+"px)";var _}else this._container.style.visibility="hidden"}},e.prototype._rectToPixel=function(e,t,r,n,i,o){if(!t){for(var a=this._container.offsetWidth,s=this._container.offsetHeight,c={bottom:[0,s/2],"bottom-left":[-a/2,s/2],"bottom-right":[a/2,s/2],left:[-a/2,0],right:[a/2,0],top:[0,-s/2],"top-left":[-a/2,-s/2],"top-right":[a/2,-s/2]},u=[0,null,null],h=0,l=["top","bottom","left","right"];h<l.length;h++){var p=l[h],f=this._pointFromRectPosition(e,p),d=this._viewportCoords.basicToCanvasSafe(f[0],f[1],{offsetHeight:i.height,offsetWidth:i.width},o,n.perspective);if(null!=d){var m=c[p],v=[d[0]+m[0],d[1]+m[1]],g=null!=r&&r===p?1:.7;if(0===this._pixelToFloats(v,i,a/g,s/(2*g)).length&&d[0]>0&&d[0]<i.width&&d[1]>0&&d[1]<i.height)return[d,p];var y=Math.max(v[0]-a/2,0),b=Math.min(v[0]+a/2,i.width),_=Math.max(v[1]-s/2,0),x=Math.min(v[1]+s/2,i.height),w=g*Math.max(0,b-y)*Math.max(0,x-_);w>u[0]&&(u[0]=w,u[1]=d,u[2]=p)}}if(u[0]>0)return[u[1],u[2]]}var S=this._pointFromRectPosition(e,t);return[this._viewportCoords.basicToCanvasSafe(S[0],S[1],{offsetHeight:i.height,offsetWidth:i.width},o,n.perspective),null!=t?t:"top"]},e.prototype._alignmentToPopupAligment=function(e){switch(e){case a.Alignment.Bottom:return"bottom";case a.Alignment.BottomLeft:return"bottom-left";case a.Alignment.BottomRight:return"bottom-right";case a.Alignment.Center:return"center";case a.Alignment.Left:return"left";case a.Alignment.Right:return"right";case a.Alignment.Top:return"top";case a.Alignment.TopLeft:return"top-left";case a.Alignment.TopRight:return"top-right";default:return null}},e.prototype._normalizeOffset=function(e){if(null==e)return this._normalizeOffset(0);if("number"==typeof e){var t=e,r=(t>=0?1:-1)*Math.round(Math.sqrt(.5*Math.pow(t,2)));return{bottom:[0,t],"bottom-left":[-r,r],"bottom-right":[r,r],center:[0,0],left:[-t,0],right:[t,0],top:[0,-t],"top-left":[-r,-r],"top-right":[r,-r]}}return{bottom:e.bottom||[0,0],"bottom-left":e.bottomLeft||[0,0],"bottom-right":e.bottomRight||[0,0],center:e.center||[0,0],left:e.left||[0,0],right:e.right||[0,0],top:e.top||[0,0],"top-left":e.topLeft||[0,0],"top-right":e.topRight||[0,0]}},e.prototype._pixelToFloats=function(e,t,r,n){var i=[];return e[1]<n?i.push("bottom"):e[1]>t.height-n&&i.push("top"),e[0]<r/2?i.push("right"):e[0]>t.width-r/2&&i.push("left"),i},e.prototype._pointFromRectPosition=function(e,t){switch(t){case"bottom":return[(e[0]+e[2])/2,e[3]];case"bottom-left":return[e[0],e[3]];case"bottom-right":return[e[2],e[3]];case"center":return[(e[0]+e[2])/2,(e[1]+e[3])/2];case"left":return[e[0],(e[1]+e[3])/2];case"right":return[e[2],(e[1]+e[3])/2];case"top":return[(e[0]+e[2])/2,e[1]];case"top-left":return[e[0],e[1]];case"top-right":return[e[2],e[1]];default:return[(e[0]+e[2])/2,e[3]]}},e}();r.Popup=s,r.default=s},{"../../../Geo":233,"../../../Utils":240,"../../../Viewer":241,"rxjs/Subject":34}],288:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/of"),e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Edge"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._nodesAhead=5,i._configurationOperation$=new o.Subject,i._sequenceDOMRenderer=new a.SequenceDOMRenderer(r.element),i._sequenceDOMInteraction=new a.SequenceDOMInteraction,i._containerWidth$=new o.Subject,i._hoveredKeySubject$=new o.Subject,i._hoveredKey$=i._hoveredKeySubject$.share(),i._edgeStatus$=i._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$}).publishReplay(1).refCount(),i}return n(t,e),Object.defineProperty(t.prototype,"hoveredKey$",{get:function(){return this._hoveredKey$},enumerable:!0,configurable:!0}),t.prototype.play=function(){this.configure({playing:!0})},t.prototype.stop=function(){this.configure({playing:!1})},t.prototype.setDirection=function(e){this.configure({direction:e})},t.prototype.setHighlightKey=function(e){this.configure({highlightKey:e})},t.prototype.setMaxWidth=function(e){this.configure({maxWidth:e})},t.prototype.setMinWidth=function(e){this.configure({minWidth:e})},t.prototype.setVisible=function(e){this.configure({visible:e})},t.prototype.resize=function(){var e=this;this._configuration$.first().map(function(t){return e._sequenceDOMRenderer.getContainerWidth(e._container.element,t)}).subscribe(function(t){e._containerWidth$.next(t)})},t.prototype._activate=function(){var e=this;this._renderSubscription=i.Observable.combineLatest(this._edgeStatus$,this._configuration$,this._containerWidth$).map(function(t){var r=t[0],n=t[1],i=t[2],o=e._sequenceDOMRenderer.render(r,n,i,e,e._sequenceDOMInteraction,e._navigator);return{name:e._name,vnode:o}}).subscribe(this._container.domRenderer.render$),this._containerWidthSubscription=this._configuration$.distinctUntilChanged(function(e,t){return e[0]===t[0]&&e[1]===t[1]},function(e){return[e.minWidth,e.maxWidth]}).map(function(t){return e._sequenceDOMRenderer.getContainerWidth(e._container.element,t)}).subscribe(this._containerWidth$),this._configurationSubscription=this._configurationOperation$.scan(function(e,t){return t(e)},{playing:!1}).finally(function(){null!=e._playingSubscription&&(e._navigator.stateService.cutNodes(),e._stop())}).subscribe(function(){}),this._configuration$.map(function(t){return function(r){return t.playing!==r.playing&&(e._navigator.stateService.cutNodes(),t.playing?e._play():e._stop()),r.playing=t.playing,r}}).subscribe(this._configurationOperation$),this._stopSubscription=this._configuration$.switchMap(function(t){var r=t.playing?e._edgeStatus$:i.Observable.empty(),n=i.Observable.of(t.direction);return i.Observable.combineLatest(r,n)}).map(function(e){var t=e[0],r=e[1];if(!t.cached)return!0;for(var n=0,i=t.edges;n<i.length;n++)if(i[n].data.direction===r)return!0;return!1}).filter(function(e){return!e}).map(function(e){return{playing:!1}}).subscribe(this._configurationSubject$),this._hoveredKeySubscription=this._sequenceDOMInteraction.mouseEnterDirection$.switchMap(function(t){return e._edgeStatus$.map(function(e){for(var r=0,n=e.edges;r<n.length;r++){var i=n[r];if(i.data.direction===t)return i.to}return null}).takeUntil(e._sequenceDOMInteraction.mouseLeaveDirection$).concat(i.Observable.of(null))}).distinctUntilChanged().subscribe(this._hoveredKeySubject$)},t.prototype._deactivate=function(){this._stopSubscription.unsubscribe(),this._renderSubscription.unsubscribe(),this._configurationSubscription.unsubscribe(),this._containerWidthSubscription.unsubscribe(),this._hoveredKeySubscription.unsubscribe(),this.stop()},t.prototype._getDefaultConfiguration=function(){return{direction:s.EdgeDirection.Next,maxWidth:117,minWidth:70,playing:!1,visible:!0}},t.prototype._play=function(){var e=this;this._playingSubscription=this._navigator.stateService.currentState$.filter(function(t){return t.state.nodesAhead<e._nodesAhead}).map(function(e){return e.state.lastNode}).distinctUntilChanged(void 0,function(e){return e.key}).withLatestFrom(this._configuration$,function(e,t){return[e,t.direction]}).switchMap(function(e){return([s.EdgeDirection.Next,s.EdgeDirection.Prev].indexOf(e[1])>-1?e[0].sequenceEdges$:e[0].spatialEdges$).filter(function(e){return e.cached}).zip(i.Observable.of(e[1]),function(e,t){return[e,t]})}).map(function(e){for(var t=e[1],r=0,n=e[0].edges;r<n.length;r++){var i=n[r];if(i.data.direction===t)return i.to}return null}).filter(function(e){return null!=e}).switchMap(function(t){return e._navigator.graphService.cacheNode$(t)}).subscribe(function(t){e._navigator.stateService.appendNodes([t])},function(t){console.error(t),e.stop()}),this._clearSubscription=this._navigator.stateService.currentNode$.bufferCount(1,7).subscribe(function(t){e._navigator.stateService.clearPriorNodes()}),this.fire(t.playingchanged,!0)},t.prototype._stop=function(){this._playingSubscription.unsubscribe(),this._playingSubscription=null,this._clearSubscription.unsubscribe(),this._clearSubscription=null,this.fire(t.playingchanged,!1)},t.componentName="sequence",t.playingchanged="playingchanged",t}(a.Component);r.SequenceComponent=c,a.ComponentService.register(c),r.default=c},{"../../Component":230,"../../Edge":231,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],289:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._mouseEnterDirection$=new n.Subject,this._mouseLeaveDirection$=new n.Subject}return Object.defineProperty(e.prototype,"mouseEnterDirection$",{get:function(){return this._mouseEnterDirection$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseLeaveDirection$",{get:function(){return this._mouseLeaveDirection$},enumerable:!0,configurable:!0}),e}();r.SequenceDOMInteraction=i,r.default=i},{"rxjs/Subject":34}],290:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=e("../../Edge"),o=function(){function e(e){this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820}return e.prototype.render=function(e,t,r,o,a,s){if(!1===t.visible)return n.h("div.SequenceContainer",{},[]);for(var c=null,u=null,h=0,l=e.edges;h<l.length;h++){var p=l[h];p.data.direction===i.EdgeDirection.Next&&(c=p.to),p.data.direction===i.EdgeDirection.Prev&&(u=p.to)}var f=this._createPlayingButton(c,u,t,o),d=this._createSequenceArrows(c,u,t,a,s),m={oncontextmenu:function(e){e.preventDefault()},style:{height:.27*r+"px",width:r+"px"}};return n.h("div.SequenceContainer",m,d.concat([f]))},e.prototype.getContainerWidth=function(e,t){var r=e.offsetWidth,n=e.offsetHeight,i=t.minWidth,o=t.maxWidth;o<i&&(o=i);var a=(r-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),s=(n-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight);return i+Math.max(0,Math.min(1,Math.min(a,s)))*(o-i)},e.prototype._createPlayingButton=function(e,t,r,o){var a=r.direction===i.EdgeDirection.Next&&null!=e||r.direction===i.EdgeDirection.Prev&&null!=t,s={onclick:r.playing?function(e){o.stop()}:a?function(e){o.play()}:null,style:{}},c=r.playing?"Stop":a?"Play":"PlayDisabled",u=n.h("div.SequenceComponentIcon",{className:c},[]),h=a?"SequencePlay":"SequencePlayDisabled";return n.h("div."+h,s,[u])},e.prototype._createSequenceArrows=function(e,t,r,o,a){var s={onclick:null!=e?function(e){a.moveDir$(i.EdgeDirection.Next).subscribe(function(e){},function(e){console.error(e)})}:null,onmouseenter:function(e){o.mouseEnterDirection$.next(i.EdgeDirection.Next)},onmouseleave:function(e){o.mouseLeaveDirection$.next(i.EdgeDirection.Next)},style:{}},c={onclick:null!=t?function(e){a.moveDir$(i.EdgeDirection.Prev).subscribe(function(e){},function(e){console.error(e)})}:null,onmouseenter:function(e){o.mouseEnterDirection$.next(i.EdgeDirection.Prev)},onmouseleave:function(e){o.mouseLeaveDirection$.next(i.EdgeDirection.Prev)},style:{}},u=this._getStepClassName(i.EdgeDirection.Next,e,r.highlightKey),h=this._getStepClassName(i.EdgeDirection.Prev,t,r.highlightKey),l=n.h("div.SequenceComponentIcon",[]),p=n.h("div.SequenceComponentIcon",[]);return[n.h("div."+u,s,[l]),n.h("div."+h,c,[p])]},e.prototype._getStepClassName=function(e,t,r){var n=e===i.EdgeDirection.Next?"SequenceStepNext":"SequenceStepPrev";return null==t?n+="Disabled":r===t&&(n+="Highlight"),n},e}();r.SequenceDOMRenderer=o,r.default=o},{"../../Edge":231,"virtual-dom":186}],291:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./error/GeometryTagError");r.GeometryTagError=n.GeometryTagError;var i=e("./geometry/PointGeometry");r.PointGeometry=i.PointGeometry;var o=e("./geometry/RectGeometry");r.RectGeometry=o.RectGeometry;var a=e("./geometry/PolygonGeometry");r.PolygonGeometry=a.PolygonGeometry;var s=e("./tag/OutlineTag");r.OutlineTag=s.OutlineTag;var c=e("./tag/SpotTag");r.SpotTag=c.SpotTag;var u=e("./TagComponent");r.TagComponent=u.TagComponent;var h=e("./TagMode");r.TagMode=h.TagMode},{"./TagComponent":292,"./TagMode":295,"./error/GeometryTagError":299,"./geometry/PointGeometry":301,"./geometry/PolygonGeometry":302,"./geometry/RectGeometry":303,"./tag/OutlineTag":315,"./tag/SpotTag":318}],292:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("when"),o=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/empty"),e("rxjs/add/observable/from"),e("rxjs/add/observable/merge"),e("rxjs/add/observable/of"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/skipUntil"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/take"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Geo"),c=e("../../Render"),u=function(e){function t(r,n,i){var c=e.call(this,r,n,i)||this;return c._tagDomRenderer=new a.TagDOMRenderer,c._tagScene=new a.TagScene,c._tagSet=new a.TagSet,c._tagCreator=new a.TagCreator(c,i),c._viewportCoords=new s.ViewportCoords,c._createHandlers={CreatePoint:new a.CreatePointHandler(c,n,i,c._viewportCoords,c._tagCreator),CreatePolygon:new a.CreatePolygonHandler(c,n,i,c._viewportCoords,c._tagCreator),CreateRect:new a.CreateRectHandler(c,n,i,c._viewportCoords,c._tagCreator),CreateRectDrag:new a.CreateRectDragHandler(c,n,i,c._viewportCoords,c._tagCreator),Default:void 0},c._editVertexHandler=new a.EditVertexHandler(c,n,i,c._viewportCoords,c._tagSet),c._renderTags$=c._tagSet.changed$.map(function(e){var t=e.getAll();return t.sort(function(e,t){var r=e.tag.id,n=t.tag.id;return r<n?-1:r>n?1:0}),t}).share(),c._tagChanged$=c._renderTags$.switchMap(function(e){return o.Observable.from(e).mergeMap(function(e){return o.Observable.merge(e.tag.changed$,e.tag.geometryChanged$)})}).share(),c._renderTagGLChanged$=c._renderTags$.switchMap(function(e){return o.Observable.from(e).mergeMap(function(e){return e.glObjectsChanged$})}).share(),c._createGeometryChanged$=c._tagCreator.tag$.switchMap(function(e){return null!=e?e.geometryChanged$:o.Observable.empty()}).share(),c._createGLObjectsChanged$=c._tagCreator.tag$.switchMap(function(e){return null!=e?e.glObjectsChanged$:o.Observable.empty()}).share(),c._creatingConfiguration$=c._configuration$.distinctUntilChanged(function(e,t){return e.mode===t.mode},function(e){return{createColor:e.createColor,mode:e.mode}}).publishReplay(1).refCount(),c._creatingConfiguration$.subscribe(function(e){c.fire(t.modechanged,e.mode)}),c}return n(t,e),t.prototype.add=function(e){var t=this;this._activated?this._navigator.stateService.currentTransform$.first().subscribe(function(r){t._tagSet.add(e,r);var n=e.map(function(e){return t._tagSet.get(e.id)});t._tagScene.add(n)}):this._tagSet.addDeactivated(e)},t.prototype.changeMode=function(e){this.configure({mode:e})},t.prototype.get=function(e){if(this._activated){var t=this._tagSet.get(e);return void 0!==t?t.tag:void 0}return this._tagSet.getDeactivated(e)},t.prototype.getAll=function(){return this.activated?this._tagSet.getAll().map(function(e){return e.tag}):this._tagSet.getAllDeactivated()},t.prototype.getTagIdsAt=function(e){var t=this;return i.promise(function(r,n){t._container.renderService.renderCamera$.first().map(function(r){var n=t._viewportCoords.canvasToViewport(e[0],e[1],t._container.element);return t._tagScene.intersectObjects(n,r.perspective)}).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.has=function(e){return this._activated?this._tagSet.has(e):this._tagSet.hasDeactivated(e)},t.prototype.remove=function(e){this._activated?(this._tagSet.remove(e),this._tagScene.remove(e)):this._tagSet.removeDeactivated(e)},t.prototype.removeAll=function(){this._activated?(this._tagSet.removeAll(),this._tagScene.removeAll()):this._tagSet.removeAllDeactivated()},t.prototype._activate=function(){var e=this;this._editVertexHandler.enable();var r=o.Observable.from(Object.keys(this._createHandlers)).map(function(t){return e._createHandlers[t]}).filter(function(e){return!!e}).mergeMap(function(e){return e.geometryCreated$}).share();this._fireGeometryCreatedSubscription=r.subscribe(function(r){e.fire(t.geometrycreated,r)}),this._fireCreateGeometryEventSubscription=this._tagCreator.tag$.skipWhile(function(e){return null==e}).distinctUntilChanged().subscribe(function(r){var n=null!=r?t.creategeometrystart:t.creategeometryend;e.fire(n,e)}),this._handlerStopCreateSubscription=r.subscribe(function(){e.changeMode(a.TagMode.Default)}),this._handlerEnablerSubscription=this._creatingConfiguration$.subscribe(function(t){e._disableCreateHandlers();var r=a.TagMode[t.mode],n=e._createHandlers[r];n&&n.enable()}),this._fireTagsChangedSubscription=this._renderTags$.subscribe(function(r){e.fire(t.tagschanged,e)}),this._stopCreateSubscription=this._tagCreator.tag$.switchMap(function(e){return null!=e?e.aborted$.map(function(e){return null}):o.Observable.empty()}).subscribe(function(){e.changeMode(a.TagMode.Default)}),this._setGLCreateTagSubscription=this._tagCreator.tag$.subscribe(function(t){e._tagScene.hasCreateTag()&&e._tagScene.removeCreateTag(),null!=t&&e._tagScene.addCreateTag(t)}),this._createGLObjectsChangedSubscription=this._createGLObjectsChanged$.subscribe(function(t){e._tagScene.updateCreateTagObjects(t)}),this._updateGLObjectsSubscription=this._renderTagGLChanged$.subscribe(function(t){e._tagScene.updateObjects(t)}),this._updateTagSceneSubscription=this._tagChanged$.subscribe(function(t){e._tagScene.update()}),this._domSubscription=this._renderTags$.startWith([]).do(function(t){e._container.domRenderer.render$.next({name:e._name,vnode:e._tagDomRenderer.clear()})}).combineLatest(this._container.renderService.renderCamera$,this._container.spriteService.spriteAtlas$,this._container.renderService.size$,this._tagChanged$.startWith(null),this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null),function(e,t,r,n,i,o){return[t,r,n,e,i,o]}).map(function(t){return{name:e._name,vnode:e._tagDomRenderer.render(t[3],t[5],t[1],t[0].perspective,t[2])}}).subscribe(this._container.domRenderer.render$),this._glSubscription=this._navigator.stateService.currentState$.map(function(t){var r=e._tagScene;return{name:e._name,render:{frameId:t.id,needsRender:r.needsRender,render:r.render.bind(r),stage:c.GLRenderStage.Foreground}}}).subscribe(this._container.glRenderer.render$),this._navigator.stateService.currentTransform$.first().subscribe(function(t){e._tagSet.activate(t),e._tagScene.add(e._tagSet.getAll())})},t.prototype._deactivate=function(){this._editVertexHandler.disable(),this._disableCreateHandlers(),this._tagScene.clear(),this._tagSet.deactivate(),this._tagCreator.delete$.next(null),this._updateGLObjectsSubscription.unsubscribe(),this._updateTagSceneSubscription.unsubscribe(),this._stopCreateSubscription.unsubscribe(),this._setGLCreateTagSubscription.unsubscribe(),this._createGLObjectsChangedSubscription.unsubscribe(),this._domSubscription.unsubscribe(),this._glSubscription.unsubscribe(),this._fireCreateGeometryEventSubscription.unsubscribe(),this._fireGeometryCreatedSubscription.unsubscribe(),this._fireTagsChangedSubscription.unsubscribe(),this._handlerStopCreateSubscription.unsubscribe(),this._handlerEnablerSubscription.unsubscribe(),this._container.element.classList.remove("component-tag-create")},t.prototype._getDefaultConfiguration=function(){return{createColor:16777215,mode:a.TagMode.Default}},t.prototype._disableCreateHandlers=function(){var e=this._createHandlers;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];r&&r.disable()}},t.componentName="tag",t.creategeometryend="creategeometryend",t.creategeometrystart="creategeometrystart",t.modechanged="modechanged",t.geometrycreated="geometrycreated",t.tagschanged="tagschanged",t}(a.Component);r.TagComponent=u,a.ComponentService.register(u),r.default=u},{"../../Component":230,"../../Geo":233,"../../Render":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/skip":76,"rxjs/add/operator/skipUntil":77,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/take":81,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85,when:227}],293:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=function(){function e(e,t){this._component=e,this._navigator=t,this._tagOperation$=new n.Subject,this._createPolygon$=new n.Subject,this._createRect$=new n.Subject,this._delete$=new n.Subject,this._tag$=this._tagOperation$.scan(function(e,t){return t(e)},null).share(),this._createRect$.withLatestFrom(this._component.configuration$,this._navigator.stateService.currentTransform$).map(function(e){var t=e[0],r=e[1],n=e[2];return function(e){var o=new i.RectGeometry([t[0],t[1],t[0],t[1]]);return new i.OutlineCreateTag(o,{color:r.createColor},n)}}).subscribe(this._tagOperation$),this._createPolygon$.withLatestFrom(this._component.configuration$,this._navigator.stateService.currentTransform$).map(function(e){var t=e[0],r=e[1],n=e[2];return function(e){var o=new i.PolygonGeometry([[t[0],t[1]],[t[0],t[1]],[t[0],t[1]]]);return new i.OutlineCreateTag(o,{color:r.createColor},n)}}).subscribe(this._tagOperation$),this._delete$.map(function(){return function(e){return null}}).subscribe(this._tagOperation$)}return Object.defineProperty(e.prototype,"createRect$",{get:function(){return this._createRect$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"createPolygon$",{get:function(){return this._createPolygon$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"delete$",{get:function(){return this._delete$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tag$",{get:function(){return this._tag$},enumerable:!0,configurable:!0}),e}();r.TagCreator=o,r.default=o},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/withLatestFrom":85}],294:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=function(){function e(){}return e.prototype.render=function(e,t,r,i,o){for(var a=[],s=0,c=e;s<c.length;s++){var u=c[s];a=a.concat(u.getDOMObjects(r,i,o))}return null!=t&&(a=a.concat(t.getDOMObjects(i,o))),n.h("div.TagContainer",{},a)},e.prototype.clear=function(){return n.h("div",{},[])},e}();r.TagDOMRenderer=i},{"virtual-dom":186}],295:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Default=0]="Default",e[e.CreatePoint=1]="CreatePoint",e[e.CreatePolygon=2]="CreatePolygon",e[e.CreateRect=3]="CreateRect",e[e.CreateRectDrag=4]="CreateRectDrag"}(n=r.TagMode||(r.TagMode={})),r.default=n},{}],296:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.None=0]="None",e[e.Centroid=1]="Centroid",e[e.Vertex=2]="Vertex"}(n=r.TagOperation||(r.TagOperation={})),r.default=n},{}],297:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t){this._createTag=null,this._needsRender=!1,this._raycaster=t||new n.Raycaster,this._scene=e||new n.Scene,this._objectTags={},this._retrievableObjects=[],this._tags={}}return Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.add=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];n.tag.id in this._tags&&this._remove(n.tag.id),this._add(n)}this._needsRender=!0},e.prototype.addCreateTag=function(e){for(var t=0,r=e.glObjects;t<r.length;t++){var n=r[t];this._scene.add(n)}this._createTag={tag:e,objects:e.glObjects},this._needsRender=!0},e.prototype.clear=function(){for(var e=0,t=Object.keys(this._tags);e<t.length;e++){var r=t[e];this._remove(r)}this._needsRender=!1},e.prototype.get=function(e){return this.has(e)?this._tags[e].tag:void 0},e.prototype.has=function(e){return e in this._tags},e.prototype.hasCreateTag=function(){return null!=this._createTag},e.prototype.intersectObjects=function(e,t){var r=e[0],i=e[1];this._raycaster.setFromCamera(new n.Vector2(r,i),t);for(var o=[],a=0,s=this._raycaster.intersectObjects(this._retrievableObjects);a<s.length;a++){var c=s[a];c.object.uuid in this._objectTags&&o.push(this._objectTags[c.object.uuid])}return o},e.prototype.remove=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this._remove(n)}this._needsRender=!0},e.prototype.removeAll=function(){for(var e=0,t=Object.keys(this._tags);e<t.length;e++){var r=t[e];this._remove(r)}this._needsRender=!0},e.prototype.removeCreateTag=function(){if(null!=this._createTag){for(var e=0,t=this._createTag.objects;e<t.length;e++){var r=t[e];this._scene.remove(r)}this._createTag.tag.dispose(),this._createTag=null,this._needsRender=!0}},e.prototype.render=function(e,t){t.render(this._scene,e),this._needsRender=!1},e.prototype.update=function(){this._needsRender=!0},e.prototype.updateCreateTagObjects=function(e){if(this._createTag.tag!==e)throw new Error("Create tags do not have the same reference.");for(var t=0,r=this._createTag.objects;t<r.length;t++){o=r[t];this._scene.remove(o)}for(var n=0,i=e.glObjects;n<i.length;n++){var o=i[n];this._scene.add(o)}this._createTag.objects=e.glObjects,this._needsRender=!0},e.prototype.updateObjects=function(e){var t=e.tag.id;if(this._tags[t].tag!==e)throw new Error("Tags do not have the same reference.");var r=this._tags[t];this._removeObjects(r),delete this._tags[t],this._add(e),this._needsRender=!0},e.prototype._add=function(e){var t=e.tag.id,r={tag:e,objects:[],retrievableObjects:[]};this._tags[t]=r;for(var n=0,i=e.getGLObjects();n<i.length;n++){var o=i[n];r.objects.push(o),this._scene.add(o)}for(var a=0,s=e.getRetrievableObjects();a<s.length;a++){var c=s[a];r.retrievableObjects.push(c),this._retrievableObjects.push(c),this._objectTags[c.uuid]=e.tag.id}},e.prototype._remove=function(e){var t=this._tags[e];this._removeObjects(t),t.tag.dispose(),delete this._tags[e]},e.prototype._removeObjects=function(e){for(var t=0,r=e.objects;t<r.length;t++){var n=r[t];this._scene.remove(n)}for(var i=0,o=e.retrievableObjects;i<o.length;i++){var a=o[i],s=this._retrievableObjects.indexOf(a);-1!==s&&this._retrievableObjects.splice(s,1)}},e}();r.TagScene=i,r.default=i},{three:180}],298:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share");var i=e("../../Component"),o=function(){function e(){this._active=!1,this._hash={},this._hashDeactivated={},this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"active",{get:function(){return this._active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e.prototype.activate=function(e){if(!this._active){for(var t in this._hashDeactivated)if(this._hashDeactivated.hasOwnProperty(t)){var r=this._hashDeactivated[t];this._add(r,e)}this._hashDeactivated={},this._active=!0,this._notifyChanged$.next(this)}},e.prototype.deactivate=function(){if(this._active){for(var e in this._hash)this._hash.hasOwnProperty(e)&&(this._hashDeactivated[e]=this._hash[e].tag);this._hash={},this._active=!1}},e.prototype.add=function(e,t){this._assertActivationState(!0);for(var r=0,n=e;r<n.length;r++){var i=n[r];this._add(i,t)}this._notifyChanged$.next(this)},e.prototype.addDeactivated=function(e){this._assertActivationState(!1);for(var t=0,r=e;t<r.length;t++){var n=r[t];if(!(n instanceof i.OutlineTag||n instanceof i.SpotTag))throw new Error("Tag type not supported");this._hashDeactivated[n.id]=n}},e.prototype.get=function(e){return this.has(e)?this._hash[e]:void 0},e.prototype.getAll=function(){var e=this._hash;return Object.keys(e).map(function(t){return e[t]})},e.prototype.getAllDeactivated=function(){var e=this._hashDeactivated;return Object.keys(e).map(function(t){return e[t]})},e.prototype.getDeactivated=function(e){return this.hasDeactivated(e)?this._hashDeactivated[e]:void 0},e.prototype.has=function(e){return e in this._hash},e.prototype.hasDeactivated=function(e){return e in this._hashDeactivated},e.prototype.remove=function(e){this._assertActivationState(!0);for(var t=this._hash,r=0,n=e;r<n.length;r++){var i=n[r];i in t&&delete t[i]}this._notifyChanged$.next(this)},e.prototype.removeAll=function(){this._assertActivationState(!0),this._hash={},this._notifyChanged$.next(this)},e.prototype.removeAllDeactivated=function(){this._assertActivationState(!1),this._hashDeactivated={}},e.prototype.removeDeactivated=function(e){this._assertActivationState(!1);for(var t=this._hashDeactivated,r=0,n=e;r<n.length;r++){var i=n[r];i in t&&delete t[i]}},e.prototype._add=function(e,t){if(e instanceof i.OutlineTag)this._hash[e.id]=new i.OutlineRenderTag(e,t);else{if(!(e instanceof i.SpotTag))throw new Error("Tag type not supported");this._hash[e.id]=new i.SpotRenderTag(e,t)}},e.prototype._assertActivationState=function(e){if(e!==this._active)throw new Error("Tag set not in correct state for operation.")},e}();r.TagSet=o,r.default=o},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75}],299:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Error"),o=function(e){function t(t){var r=e.call(this,null!=t?t:"The provided geometry value is incorrect")||this;return r.name="GeometryTagError",r}return n(t,e),t}(i.MapillaryError);r.GeometryTagError=o,r.default=i.MapillaryError},{"../../../Error":232}],300:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e}();r.Geometry=i,r.default=i},{"rxjs/Subject":34}],301:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t){var r=e.call(this)||this,n=t[0],o=t[1];if(n<0||n>1||o<0||o>1)throw new i.GeometryTagError("Basic coordinates must be on the interval [0, 1].");return r._point=t.slice(),r}return n(t,e),Object.defineProperty(t.prototype,"point",{get:function(){return this._point},enumerable:!0,configurable:!0}),t.prototype.getCentroid2d=function(){return this._point.slice()},t.prototype.getCentroid3d=function(e){return e.unprojectBasic(this._point,200)},t.prototype.setCentroid2d=function(e,t){var r=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._point[0]=r[0],this._point[1]=r[1],this._notifyChanged$.next(this)},t}(i.Geometry);r.PointGeometry=o},{"../../../Component":230}],302:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t,r){var n=e.call(this)||this,o=t.length;if(o<3)throw new i.GeometryTagError("A polygon must have three or more positions.");if(t[0][0]!==t[o-1][0]||t[0][1]!==t[o-1][1])throw new i.GeometryTagError("First and last positions must be equivalent.");n._polygon=[];for(var a=0,s=t;a<s.length;a++){if((f=s[a])[0]<0||f[0]>1||f[1]<0||f[1]>1)throw new i.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");n._polygon.push(f.slice())}if(n._holes=[],null==r)return n;for(var c=0;c<r.length;c++){var u=r[c],h=u.length;if(h<3)throw new i.GeometryTagError("A polygon hole must have three or more positions.");if(u[0][0]!==u[h-1][0]||u[0][1]!==u[h-1][1])throw new i.GeometryTagError("First and last positions of hole must be equivalent.");n._holes.push([]);for(var l=0,p=u;l<p.length;l++){var f=p[l];if(f[0]<0||f[0]>1||f[1]<0||f[1]>1)throw new i.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");n._holes[c].push(f.slice())}}return n}return n(t,e),Object.defineProperty(t.prototype,"polygon",{get:function(){return this._polygon},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"holes",{get:function(){return this._holes},enumerable:!0,configurable:!0}),t.prototype.addVertex2d=function(e){var t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._polygon.splice(this._polygon.length-1,0,t),this._notifyChanged$.next(this)},t.prototype.getVertex2d=function(e){return this._polygon[e].slice()},t.prototype.removeVertex2d=function(e){if(e<0||e>=this._polygon.length||this._polygon.length<4)throw new i.GeometryTagError("Index for removed vertex must be valid.");if(e>0&&e<this._polygon.length-1)this._polygon.splice(e,1);else{this._polygon.splice(0,1),this._polygon.pop();var t=this._polygon[0].slice();this._polygon.push(t)}this._notifyChanged$.next(this)},t.prototype.setVertex2d=function(e,t,r){var n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];0===e||e===this._polygon.length-1?(this._polygon[0]=n.slice(),this._polygon[this._polygon.length-1]=n.slice()):this._polygon[e]=n.slice(),this._notifyChanged$.next(this)},t.prototype.setCentroid2d=function(e,t){for(var r=this._polygon.map(function(e){return e[0]}),n=this._polygon.map(function(e){return e[1]}),i=Math.min.apply(Math,r),o=Math.max.apply(Math,r),a=Math.min.apply(Math,n),s=Math.max.apply(Math,n),c=this.getCentroid2d(),u=-i,h=1-o,l=-a,p=1-s,f=Math.max(u,Math.min(h,e[0]-c[0])),d=Math.max(l,Math.min(p,e[1]-c[1])),m=0,v=this._polygon;m<v.length;m++){var g=v[m];g[0]+=f,g[1]+=d}this._notifyChanged$.next(this)},t.prototype.getPoints3d=function(e){return this.getVertices3d(e)},t.prototype.getVertex3d=function(e,t){return t.unprojectBasic(this._polygon[e],200)},t.prototype.getVertices2d=function(){return this._polygon.slice()},t.prototype.getVertices3d=function(e){return this._polygon.map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getHoleVertices3d=function(e){for(var t=[],r=0,n=this._holes;r<n.length;r++){var i=n[r].map(function(t){return e.unprojectBasic(t,200)});t.push(i)}return t},t.prototype.getCentroid2d=function(){for(var e=this._polygon,t=0,r=0,n=0,i=0;i<e.length-1;i++){var o=e[i][0],a=e[i][1],s=e[i+1][0],c=e[i+1][1],u=o*c-s*a;t+=u,r+=(o+s)*u,n+=(a+c)*u}return t/=2,r/=6*t,n/=6*t,[r,n]},t.prototype.getCentroid3d=function(e){var t=this.getCentroid2d();return e.unprojectBasic(t,200)},t.prototype.getTriangles3d=function(e){return this._triangulate(this._polygon,this.getPoints3d(e),this._holes,this.getHoleVertices3d(e))},t.prototype.getPoleOfAccessibility2d=function(){return this._getPoleOfInaccessibility2d(this._polygon.slice())},t.prototype.getPoleOfAccessibility3d=function(e){var t=this._getPoleOfInaccessibility2d(this._polygon.slice());return e.unprojectBasic(t,200)},t}(i.VertexGeometry);r.PolygonGeometry=o,r.default=o},{"../../../Component":230}],303:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t){var r=e.call(this)||this;if(t[1]>t[3])throw new i.GeometryTagError("Basic Y coordinates values can not be inverted.");for(var n=0,o=t;n<o.length;n++){var a=o[n];if(a<0||a>1)throw new i.GeometryTagError("Basic coordinates must be on the interval [0, 1].")}return r._anchorIndex=void 0,r._rect=t.slice(0,4),r._inverted=r._rect[0]>r._rect[2],r}return n(t,e),Object.defineProperty(t.prototype,"anchorIndex",{get:function(){return this._anchorIndex},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"inverted",{get:function(){return this._inverted},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rect",{get:function(){return this._rect},enumerable:!0,configurable:!0}),t.prototype.initializeAnchorIndexing=function(e){if(void 0!==this._anchorIndex)throw new Error("Anchor indexing is already initialized.");if(e<0||e>3)throw new Error("Invalid anchor index: "+e+".");this._anchorIndex=void 0===e?0:e},t.prototype.terminateAnchorIndexing=function(){this._anchorIndex=void 0},t.prototype.setOppositeVertex2d=function(e,t){if(void 0===this._anchorIndex)throw new Error("Anchor indexing needs to be initialized.");var r=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))],n=this._rect.slice(),i=0===this._anchorIndex?[n[0],n[3]]:1===this._anchorIndex?[n[0],n[1]]:2===this._anchorIndex?[n[2],n[1]]:[n[2],n[3]];if(t.fullPano){var o=this._anchorIndex<2?r[0]-n[2]:r[0]-n[0];!this._inverted&&this._anchorIndex<2&&r[0]<.25&&n[2]>.75&&o<-.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?0:1):!this._inverted&&this._anchorIndex>=2&&r[0]<.25&&n[2]>.75&&o<-.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?0:1):this._inverted&&this._anchorIndex>=2&&r[0]<.25&&n[0]>.75&&o<-.5?(this._inverted=!1,this._anchorIndex=i[0]>r[0]?i[1]>r[1]?3:2:i[1]>r[1]?0:1):!this._inverted&&this._anchorIndex>=2&&r[0]>.75&&n[0]<.25&&o>.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?3:2):!this._inverted&&this._anchorIndex<2&&r[0]>.75&&n[0]<.25&&o>.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?3:2):this._inverted&&this._anchorIndex<2&&r[0]>.75&&n[2]<.25&&o>.5?(this._inverted=!1,this._anchorIndex=i[0]>r[0]?i[1]>r[1]?3:2:i[1]>r[1]?0:1):this._inverted&&this._anchorIndex<2&&r[0]>n[0]?(this._inverted=!1,this._anchorIndex=i[1]>r[1]?0:1):this._inverted&&this._anchorIndex>=2&&r[0]<n[2]?(this._inverted=!1,this._anchorIndex=i[1]>r[1]?3:2):this._inverted?this._anchorIndex<2?this._anchorIndex=i[1]>r[1]?0:1:this._anchorIndex=i[1]>r[1]?3:2:this._anchorIndex=i[0]<=r[0]&&i[1]>r[1]?0:i[0]<=r[0]&&i[1]<=r[1]?1:i[0]>r[0]&&i[1]<=r[1]?2:3;a=[];0===this._anchorIndex?(a[0]=i[0],a[1]=r[1],a[2]=r[0],a[3]=i[1]):1===this._anchorIndex?(a[0]=i[0],a[1]=i[1],a[2]=r[0],a[3]=r[1]):2===this._anchorIndex?(a[0]=r[0],a[1]=i[1],a[2]=i[0],a[3]=r[1]):(a[0]=r[0],a[1]=r[1],a[2]=i[0],a[3]=i[1]),(!this._inverted&&a[0]>a[2]||this._inverted&&a[0]<a[2])&&(a[0]=n[0],a[2]=n[2]),a[1]>a[3]&&(a[1]=n[1],a[3]=n[3]),this._rect[0]=a[0],this._rect[1]=a[1],this._rect[2]=a[2],this._rect[3]=a[3]}else{this._anchorIndex=i[0]<=r[0]&&i[1]>r[1]?0:i[0]<=r[0]&&i[1]<=r[1]?1:i[0]>r[0]&&i[1]<=r[1]?2:3;var a=[];0===this._anchorIndex?(a[0]=i[0],a[1]=r[1],a[2]=r[0],a[3]=i[1]):1===this._anchorIndex?(a[0]=i[0],a[1]=i[1],a[2]=r[0],a[3]=r[1]):2===this._anchorIndex?(a[0]=r[0],a[1]=i[1],a[2]=i[0],a[3]=r[1]):(a[0]=r[0],a[1]=r[1],a[2]=i[0],a[3]=i[1]),a[0]>a[2]&&(a[0]=n[0],a[2]=n[2]),a[1]>a[3]&&(a[1]=n[1],a[3]=n[3]),this._rect[0]=a[0],this._rect[1]=a[1],this._rect[2]=a[2],this._rect[3]=a[3]}this._notifyChanged$.next(this)},t.prototype.setVertex2d=function(e,t,r){var n=this._rect.slice(),i=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))],o=[];if(0===e?(o[0]=i[0],o[1]=n[1],o[2]=n[2],o[3]=i[1]):1===e?(o[0]=i[0],o[1]=i[1],o[2]=n[2],o[3]=n[3]):2===e?(o[0]=n[0],o[1]=i[1],o[2]=i[0],o[3]=n[3]):3===e&&(o[0]=n[0],o[1]=n[1],o[2]=i[0],o[3]=i[1]),r.fullPano){var a=e<2&&i[0]>.75&&n[0]<.25||e>=2&&this._inverted&&i[0]>.75&&n[2]<.25,s=e<2&&this._inverted&&i[0]<.25&&n[0]>.75||e>=2&&i[0]<.25&&n[2]>.75;a||s?this._inverted=!this._inverted:(o[0]-n[0]<-.25&&(o[0]=n[0]),o[2]-n[2]>.25&&(o[2]=n[2])),(!this._inverted&&o[0]>o[2]||this._inverted&&o[0]<o[2])&&(o[0]=n[0],o[2]=n[2])}else o[0]>o[2]&&(o[0]=n[0],o[2]=n[2]);o[1]>o[3]&&(o[1]=n[1],o[3]=n[3]),this._rect[0]=o[0],this._rect[1]=o[1],this._rect[2]=o[2],this._rect[3]=o[3],this._notifyChanged$.next(this)},t.prototype.setCentroid2d=function(e,t){var r=this._rect.slice(),n=r[0],i=this._inverted?r[2]+1:r[2],o=r[1],a=r[3],s=n+(i-n)/2,c=o+(a-o)/2,u=0;if(null!=t.gpano&&t.gpano.CroppedAreaImageWidthPixels===t.gpano.FullPanoWidthPixels)u=this._inverted?e[0]+1-s:e[0]-s;else{var h=-n,l=1-i;u=Math.max(h,Math.min(l,e[0]-s))}var p=-o,f=1-a,d=Math.max(p,Math.min(f,e[1]-c));this._rect[0]=r[0]+u,this._rect[1]=r[1]+d,this._rect[2]=r[2]+u,this._rect[3]=r[3]+d,this._rect[0]<0?(this._rect[0]+=1,this._inverted=!this._inverted):this._rect[0]>1&&(this._rect[0]-=1,this._inverted=!this._inverted),this._rect[2]<0?(this._rect[2]+=1,this._inverted=!this._inverted):this._rect[2]>1&&(this._rect[2]-=1,this._inverted=!this._inverted),this._notifyChanged$.next(this)},t.prototype.getPoints3d=function(e){return this._getPoints2d(e).map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getVertex2d=function(e){return this._rectToVertices2d(this._rect)[e]},t.prototype.getNonAdjustedVertex2d=function(e){return this._rectToNonAdjustedVertices2d(this._rect)[e]},t.prototype.getVertex3d=function(e,t){return t.unprojectBasic(this._rectToVertices2d(this._rect)[e],200)},t.prototype.getVertices2d=function(){return this._rectToVertices2d(this._rect)},t.prototype.getVertices3d=function(e){return this._rectToVertices2d(this._rect).map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getCentroid2d=function(){var e=this._rect,t=e[0],r=this._inverted?e[2]+1:e[2],n=e[1];return[t+(r-t)/2,n+(e[3]-n)/2]},t.prototype.getCentroid3d=function(e){var t=this.getCentroid2d();return e.unprojectBasic(t,200)},t.prototype.getPoleOfAccessibility2d=function(){return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect))},t.prototype.getPoleOfAccessibility3d=function(e){var t=this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));return e.unprojectBasic(t,200)},t.prototype.getTriangles3d=function(e){return this._triangulate(this._rectToVertices2d(this._rect),this.getVertices3d(e))},t.prototype.validate=function(e){var t=this._rect;return!(!this._inverted&&e[0]<t[0]||e[0]-t[2]>.25||e[1]<t[1])},t.prototype._getPoints2d=function(e){for(var t=this._rectToVertices2d(this._rect),r=t.length-1,n=[],i=0;i<r;++i)for(var o=t[i][0],a=t[i][1],s=(t[i+1][0]-o)/9,c=(t[i+1][1]-a)/9,u=0;u<10;++u){var h=[o+u*s,a+u*c];n.push(h)}return n},t.prototype._rectToVertices2d=function(e){return[[e[0],e[3]],[e[0],e[1]],[this._inverted?e[2]+1:e[2],e[1]],[this._inverted?e[2]+1:e[2],e[3]],[e[0],e[3]]]},t.prototype._rectToNonAdjustedVertices2d=function(e){return[[e[0],e[3]],[e[0],e[1]],[e[2],e[1]],[e[2],e[3]],[e[0],e[3]]]},t}(i.VertexGeometry);r.RectGeometry=o,r.default=o},{"../../../Component":230}],304:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("earcut"),o=e("@mapbox/polylabel"),a=function(e){function t(){return e.call(this)||this}return n(t,e),t.prototype._getPoleOfInaccessibility2d=function(e){return o([e],.03)},t.prototype._triangulate=function(e,t,r,n){for(var o=[e.slice(0,-1)],a=0,s=null!=r?r:[];a<s.length;a++){var c=s[a];o.push(c.slice(0,-1))}for(var u=t.slice(0,-1),h=0,l=null!=n?n:[];h<l.length;h++){var p=l[h];u=u.concat(p.slice(0,-1))}for(var f=i.flatten(o),d=i(f.vertices,f.holes,f.dimensions),m=[],v=0;v<d.length;++v){var g=u[d[v]];m.push(g[0]),m.push(g[1]),m.push(g[2])}return m},t}(e("../../../Component").Geometry);r.VertexGeometry=a,r.default=a},{"../../../Component":230,"@mapbox/polylabel":1,earcut:8}],305:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject"),o=function(e){function t(t,r,n,o,a){var s=e.call(this,t,r,n,o)||this;return s._tagCreator=a,s._geometryCreated$=new i.Subject,s}return n(t,e),Object.defineProperty(t.prototype,"geometryCreated$",{get:function(){return this._geometryCreated$},enumerable:!0,configurable:!0}),t.prototype._enable=function(){this._enableCreate(),this._container.element.classList.add("component-tag-create")},t.prototype._disable=function(){this._container.element.classList.remove("component-tag-create"),this._disableCreate()},t.prototype._validateBasic=function(e){var t=e[0],r=e[1];return 0<=t&&t<=1&&0<=r&&r<=1},t.prototype._mouseEventToBasic$=function(e){var t=this;return e.withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).map(function(e){var r=e[0],n=e[1],i=e[2];return t._mouseEventToBasic(r,t._container.element,n,i)})},t}(e("../../../Component").TagHandlerBase);r.CreateHandlerBase=o,r.default=o},{"../../../Component":230,"rxjs/Subject":34}],306:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){this._container.mouseService.deferPixels(this._name,4),this._geometryCreatedSubscription=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).filter(this._validateBasic).map(function(e){return new i.PointGeometry(e)}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.undeferPixels(this._name),this._geometryCreatedSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-point"},t}(i.CreateHandlerBase);r.CreatePointHandler=o,r.default=o},{"../../../Component":230}],307:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._addPoint=function(e,t){e.addPoint(t)},Object.defineProperty(t.prototype,"_create$",{get:function(){return this._tagCreator.createPolygon$},enumerable:!0,configurable:!0}),t.prototype._getNameExtension=function(){return"create-polygon"},t.prototype._setVertex2d=function(e,t,r){e.geometry.setVertex2d(e.geometry.polygon.length-2,t,r)},t}(e("../../../Component").CreateVertexHandler);r.CreatePolygonHandler=i,r.default=i},{"../../../Component":230}],308:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){var e=this;this._container.mouseService.claimMouse(this._name,2),this._deleteSubscription=this._navigator.stateService.currentTransform$.map(function(e){return null}).skip(1).subscribe(this._tagCreator.delete$),this._createSubscription=this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$)).filter(this._validateBasic).subscribe(this._tagCreator.createRect$),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.filter(function(e){return!!e}).subscribe(function(e){e.geometry.initializeAnchorIndexing()});var t=i.Observable.merge(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseMove$),this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseMove$)).combineLatest(this._container.renderService.renderCamera$).withLatestFrom(this._navigator.stateService.currentTransform$).map(function(t){var r=t[0],n=r[0],i=r[1],o=t[1];return e._mouseEventToBasic(n,e._container.element,i,o)});this._setVertexSubscription=this._tagCreator.tag$.switchMap(function(r){return r?i.Observable.combineLatest(i.Observable.of(r),t,e._navigator.stateService.currentTransform$):i.Observable.empty()}).subscribe(function(e){var t=e[0],r=e[1],n=e[2];t.geometry.setOppositeVertex2d(r,n)});var r=this._container.mouseService.mouseDragEnd$.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$)).filter(this._validateBasic),function(e,t){return t}).share();this._addPointSubscription=this._tagCreator.tag$.switchMap(function(e){return e?i.Observable.combineLatest(i.Observable.of(e),r):i.Observable.empty()}).subscribe(function(e){var t=e[0],r=e[1],n=t.geometry;n.validate(r)||(r=n.getNonAdjustedVertex2d(3)),t.addPoint(r)}),this._geometryCreatedSubscription=this._tagCreator.tag$.switchMap(function(e){return e?e.created$.map(function(e){return e.geometry}):i.Observable.empty()}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.unclaimMouse(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreatedSubscription.unsubscribe(),this._initializeAnchorIndexingSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-rect-drag"},t}(e("../../../Component").CreateHandlerBase);r.CreateRectDragHandler=o,r.default=o},{"../../../Component":230,"rxjs/Observable":29}],309:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),Object.defineProperty(t.prototype,"_create$",{get:function(){return this._tagCreator.createRect$},enumerable:!0,configurable:!0}),t.prototype._addPoint=function(e,t){var r=e.geometry;r.validate(t)||(t=r.getNonAdjustedVertex2d(3)),e.addPoint(t)},t.prototype._enable=function(){e.prototype._enable.call(this),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.filter(function(e){return!!e}).subscribe(function(e){e.geometry.initializeAnchorIndexing()})},t.prototype._disable=function(){e.prototype._disable.call(this),this._initializeAnchorIndexingSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-rect"},t.prototype._setVertex2d=function(e,t,r){e.geometry.setOppositeVertex2d(t,r)},t}(e("../../../Component").CreateVertexHandler);r.CreateRectHandler=i,r.default=i},{"../../../Component":230}],310:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){var e=this;this._container.mouseService.deferPixels(this._name,4);var t=this._navigator.stateService.currentTransform$.map(function(e){}).publishReplay(1).refCount();this._deleteSubscription=t.skip(1).subscribe(this._tagCreator.delete$);var r=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).share();this._createSubscription=t.switchMap(function(){return r.filter(e._validateBasic).take(1)}).subscribe(this._create$),this._setVertexSubscription=this._tagCreator.tag$.switchMap(function(t){return t?i.Observable.combineLatest(i.Observable.of(t),i.Observable.merge(e._container.mouseService.mouseMove$,e._container.mouseService.domMouseMove$),e._container.renderService.renderCamera$,e._navigator.stateService.currentTransform$):i.Observable.empty()}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=t[3],a=e._mouseEventToBasic(n,e._container.element,i,o);e._setVertex2d(r,a,o)}),this._addPointSubscription=this._tagCreator.tag$.switchMap(function(e){return e?i.Observable.combineLatest(i.Observable.of(e),r):i.Observable.empty()}).subscribe(function(t){var r=t[0],n=t[1];e._addPoint(r,n)}),this._geometryCreateSubscription=this._tagCreator.tag$.switchMap(function(e){return e?e.created$.map(function(e){return e.geometry}):i.Observable.empty()}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.undeferPixels(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreateSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()},t}(e("../../../Component").CreateHandlerBase);r.CreateVertexHandler=o,r.default=o},{"../../../Component":230,"rxjs/Observable":29}],311:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("../../../Component"),a=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n,i)||this;return a._tagSet=o,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._tagSet.changed$.map(function(e){return e.getAll()}).switchMap(function(e){return i.Observable.from(e).mergeMap(function(e){return e.interact$})}).switchMap(function(t){return i.Observable.of(t).concat(e._container.mouseService.documentMouseUp$.map(function(){return{offsetX:0,offsetY:0,operation:o.TagOperation.None,tag:null}}).first())}).share(),r=i.Observable.merge(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$).share();this._claimMouseSubscription=t.switchMap(function(t){return t.tag?e._container.mouseService.domMouseDragStart$:i.Observable.empty()}).subscribe(function(){e._container.mouseService.claimMouse(e._name,3)}),this._cursorSubscription=t.map(function(e){return e.cursor}).distinctUntilChanged().subscribe(function(t){for(var r=0,n=["crosshair","move","nesw-resize","nwse-resize"];r<n.length;r++){var i=n[r];e._container.element.classList.remove("component-tag-edit-"+i)}t&&e._container.element.classList.add("component-tag-edit-"+t)}),this._unclaimMouseSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDragEnd$).subscribe(function(t){e._container.mouseService.unclaimMouse(e._name)}),this._preventDefaultSubscription=t.switchMap(function(t){return t.tag?e._container.mouseService.documentMouseMove$:i.Observable.empty()}).subscribe(function(e){e.preventDefault()}),this._updateGeometrySubscription=t.withLatestFrom(r).switchMap(function(t){var r=t[0],n=t[1];if(r.operation===o.TagOperation.None||!r.tag)return i.Observable.empty();var a=i.Observable.of(n).concat(e._container.mouseService.filtered$(e._name,e._container.mouseService.domMouseDrag$).filter(function(t){return e._viewportCoords.insideElement(t,e._container.element)}));return i.Observable.combineLatest(a,e._container.renderService.renderCamera$).withLatestFrom(i.Observable.of(r),e._navigator.stateService.currentTransform$,function(e,t,r){return[e[0],e[1],t,r]})}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],a=t[3],s=e._mouseEventToBasic(r,e._container.element,n,a,i.offsetX,i.offsetY),c=i.tag.geometry;i.operation===o.TagOperation.Centroid?c.setCentroid2d(s,a):i.operation===o.TagOperation.Vertex&&c.setVertex2d(i.vertexIndex,s,a)})},t.prototype._disable=function(){this._claimMouseSubscription.unsubscribe(),this._cursorSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._unclaimMouseSubscription.unsubscribe(),this._updateGeometrySubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"edit-vertex"},t}(o.TagHandlerBase);r.EditVertexHandler=a,r.default=a},{"../../../Component":230,"rxjs/Observable":29}],312:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._name=o._component.name+"-"+o._getNameExtension(),o._viewportCoords=i,o}return n(t,e),t.prototype._getConfiguration=function(e){return{}},t.prototype._mouseEventToBasic=function(e,t,r,n,i,o){i=null!=i?i:0,o=null!=o?o:0;var a=this._viewportCoords.canvasPosition(e,t),s=a[0],c=a[1];return this._viewportCoords.canvasToBasic(s-i,c-o,t,n,r.perspective)},t}(e("../../../Component").HandlerBase);r.TagHandlerBase=i,r.default=i},{"../../../Component":230}],313:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("virtual-dom"),o=e("rxjs/Subject"),a=e("../../../Component"),s=e("../../../Geo"),c=function(){function e(e,t,r,n){var i=this;this._geometry=e,this._options={color:null==t.color?16777215:t.color},this._transform=r,this._viewportCoords=n||new s.ViewportCoords,this._outline=this._createOutine(),this._glObjects=[this._outline],this._aborted$=new o.Subject,this._created$=new o.Subject,this._glObjectsChanged$=new o.Subject,this._geometryChangedSubscription=this._geometry.changed$.subscribe(function(e){i._disposeOutline(),i._outline=i._createOutine(),i._glObjects=[i._outline],i._glObjectsChanged$.next(i)})}return Object.defineProperty(e.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glObjects",{get:function(){return this._glObjects},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aborted$",{get:function(){return this._aborted$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"created$",{get:function(){return this._created$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glObjectsChanged$",{get:function(){return this._glObjectsChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"geometryChanged$",{get:function(){var e=this;return this._geometry.changed$.map(function(t){return e})},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._disposeOutline(),this._geometryChangedSubscription.unsubscribe()},e.prototype.getDOMObjects=function(e,t){var r=this,n=[],o={offsetHeight:t.height,offsetWidth:t.width},s=function(e){e.stopPropagation(),r._aborted$.next(r)};if(this._geometry instanceof a.RectGeometry){var c=this._geometry.anchorIndex,u=void 0===c?1:c,h=this._geometry.getVertex2d(u),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,o,this._transform,e);if(null!=f){var d={style:{background:A=this._colorToBackground(this._options.color),transform:R=this._canvasToTransform(f)}},m={onclick:s,style:{transform:R}};n.push(i.h("div.TagInteractor",m,[])),n.push(i.h("div.TagVertex",d,[]))}}else if(this._geometry instanceof a.PolygonGeometry){var v=this._geometry,g=v.getVertex2d(0),y=g[0],b=g[1],_=this._viewportCoords.basicToCanvasSafe(y,b,o,this._transform,e);if(null!=_){var m={onclick:v.polygon.length>4?function(e){e.stopPropagation(),v.removeVertex2d(v.polygon.length-2),r._created$.next(r)}:s,style:{transform:R=this._canvasToTransform(_)}},x=v.polygon.length>4?"TagCompleter":"TagInteractor";n.push(i.h("div."+x,m,[]))}if(v.polygon.length>3){var w=v.getVertex2d(v.polygon.length-3),S=w[0],M=w[1],E=this._viewportCoords.basicToCanvasSafe(S,M,o,this._transform,e);if(null!=E){m={onclick:function(e){e.stopPropagation(),v.removeVertex2d(v.polygon.length-3)},style:{transform:R=this._canvasToTransform(E)}};n.push(i.h("div.TagInteractor",m,[]))}}var C=v.polygon.slice();C.splice(-2,2);for(var T=0,O=C;T<O.length;T++){var P=O[T],j=this._viewportCoords.basicToCanvasSafe(P[0],P[1],o,this._transform,e);if(null!=j){var A=this._colorToBackground(this._options.color),R=this._canvasToTransform(j),d={style:{background:A,transform:R}};n.push(i.h("div.TagVertex",d,[]))}}}return n},e.prototype.addPoint=function(e){if(this._geometry instanceof a.RectGeometry){if(!this._geometry.validate(e))return;this._created$.next(this)}else this._geometry instanceof a.PolygonGeometry&&this._geometry.addVertex2d(e)},e.prototype._canvasToTransform=function(e){return"translate(-50%,-50%) translate("+Math.round(e[0])+"px,"+Math.round(e[1])+"px)"},e.prototype._colorToBackground=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},e.prototype._createOutine=function(){var e=this._geometry.getPoints3d(this._transform),t=this._getLinePositions(e),r=new n.BufferGeometry;r.addAttribute("position",new n.BufferAttribute(t,3));var i=new n.LineBasicMaterial({color:this._options.color,linewidth:1});return new n.Line(r,i)},e.prototype._disposeOutline=function(){if(null!=this._outline){var e=this._outline;e.geometry.dispose(),e.material.dispose(),this._outline=null,this._glObjects=[]}},e.prototype._getLinePositions=function(e){for(var t=e.length,r=new Float32Array(3*t),n=0;n<t;++n){var i=3*n,o=e[n];r[i]=o[0],r[i+1]=o[1],r[i+2]=o[2]}return r},e}();r.OutlineCreateTag=c,r.default=c},{"../../../Component":230,"../../../Geo":233,"rxjs/Subject":34,three:180,"virtual-dom":186}],314:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("virtual-dom"),a=e("../../../Component"),s=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._fill=r.gpano?null:n._createFill(),n._holes=n._tag.lineWidth>=1?n._createHoles():[],n._outline=n._tag.lineWidth>=1?n._createOutline():null,n._geometryChangedSubscription=n._tag.geometry.changed$.subscribe(function(e){null!=n._fill&&n._updateFillGeometry(),n._holes.length>0&&n._updateHoleGeometries(),null!=n._outline&&n._updateOulineGeometry()}),n._changedSubscription=n._tag.changed$.subscribe(function(e){var t=!1;null!=n._fill&&n._updateFillMaterial(n._fill.material),null==n._outline?n._tag.lineWidth>=1&&(n._holes=n._createHoles(),n._outline=n._createOutline(),t=!0):(n._updateHoleMaterials(),n._updateOutlineMaterial()),t&&n._glObjectsChanged$.next(n)}),n}return n(t,e),t.prototype.dispose=function(){this._disposeFill(),this._disposeHoles(),this._disposeOutline(),this._changedSubscription.unsubscribe(),this._geometryChangedSubscription.unsubscribe()},t.prototype.getDOMObjects=function(e,t,r){var n=this,i=[],s=this._tag.geometry instanceof a.RectGeometry,c=!this._transform.gpano,u={offsetHeight:r.height,offsetWidth:r.width};if(null!=this._tag.icon&&(s||c)){var h=this._tag.geometry instanceof a.RectGeometry?this._tag.geometry.getVertex2d(this._tag.iconIndex):this._tag.geometry.getPoleOfAccessibility2d(),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,u,this._transform,t);if(null!=f){var d=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:a.TagOperation.None,tag:n._tag})};if(e.loaded){var m=e.getDOMSprite(this._tag.icon,this._tag.iconFloat),v={onclick:function(e){e.stopPropagation(),n._tag.click$.next(n._tag)},onmousedown:d,style:{transform:S="translate("+Math.round(f[0])+"px,"+Math.round(f[1])+"px)"}};i.push(o.h("div.TagSymbol",v,[m]))}}}else if(null!=this._tag.text&&(s||c)){var g=this._tag.geometry instanceof a.RectGeometry?this._tag.geometry.getVertex2d(3):this._tag.geometry.getPoleOfAccessibility2d(),y=g[0],b=g[1],_=this._viewportCoords.basicToCanvasSafe(y,b,u,this._transform,t);if(null!=_){var x=Math.round(_[0]),w=Math.round(_[1]),S=this._tag.geometry instanceof a.RectGeometry?"translate("+x+"px,"+w+"px)":"translate(-50%, -50%) translate("+x+"px,"+w+"px)",v={onmousedown:d=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:a.TagOperation.None,tag:n._tag})},style:{color:this._colorToCss(this._tag.textColor),transform:S},textContent:this._tag.text};i.push(o.h("span.TagSymbol",v,[]))}}if(!this._tag.editable)return i;var M=this._colorToCss(this._tag.lineColor);if(this._tag.geometry instanceof a.RectGeometry){var E=this._tag.geometry.getCentroid2d(),C=E[0],T=E[1],O=this._viewportCoords.basicToCanvasSafe(C,T,u,this._transform,t);if(null!=O){v={onmousedown:d=this._interact(a.TagOperation.Centroid,"move"),style:{background:M,transform:S="translate(-50%, -50%) translate("+Math.round(O[0])+"px,"+Math.round(O[1])+"px)"}};i.push(o.h("div.TagMover",v,[]))}}for(var P=this._tag.geometry.getVertices2d(),j=0;j<P.length-1;j++)if(!s||!(null!=this._tag.icon&&j===this._tag.iconIndex||null==this._tag.icon&&null!=this._tag.text&&3===j)){var A=P[j],R=A[0],L=A[1],N=this._viewportCoords.basicToCanvasSafe(R,L,u,this._transform,t);if(null!=N){var I=s?j%2==0?"nesw-resize":"nwse-resize":"crosshair",v={onmousedown:d=this._interact(a.TagOperation.Vertex,I,j),style:{background:M,transform:S="translate(-50%, -50%) translate("+Math.round(N[0])+"px,"+Math.round(N[1])+"px)",cursor:I}};if(i.push(o.h("div.TagResizer",v,[])),this._tag.indicateVertices){var D={style:{background:M,transform:S}};i.push(o.h("div.TagVertex",D,[]))}}}return i},t.prototype.getGLObjects=function(){var e=[];null!=this._fill&&e.push(this._fill);for(var t=0,r=this._holes;t<r.length;t++){var n=r[t];e.push(n)}return null!=this._outline&&e.push(this._outline),e},t.prototype.getRetrievableObjects=function(){return null!=this._fill?[this._fill]:[]},t.prototype._colorToCss=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},t.prototype._createFill=function(){var e=this._tag.geometry.getTriangles3d(this._transform),t=new Float32Array(e),r=new i.BufferGeometry;r.addAttribute("position",new i.BufferAttribute(t,3)),r.computeBoundingSphere();var n=new i.MeshBasicMaterial({side:i.DoubleSide,transparent:!0});return this._updateFillMaterial(n),new i.Mesh(r,n)},t.prototype._createHoles=function(){var e=[];if(this._tag.geometry instanceof a.PolygonGeometry)for(var t=0,r=this._tag.geometry.getHoleVertices3d(this._transform);t<r.length;t++){var n=r[t],i=this._createLine(n);e.push(i)}return e},t.prototype._createLine=function(e){var t=this._getLinePositions(e),r=new i.BufferGeometry;r.addAttribute("position",new i.BufferAttribute(t,3)),r.computeBoundingSphere();var n=new i.LineBasicMaterial;this._updateLineBasicMaterial(n);var o=new i.Line(r,n);return o.renderOrder=1,o},t.prototype._createOutline=function(){var e=this._tag.geometry.getPoints3d(this._transform);return this._createLine(e)},t.prototype._disposeFill=function(){null!=this._fill&&(this._fill.geometry.dispose(),this._fill.material.dispose(),this._fill=null)},t.prototype._disposeHoles=function(){for(var e=0,t=this._holes;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}this._holes=[]},t.prototype._disposeOutline=function(){null!=this._outline&&(this._outline.geometry.dispose(),this._outline.material.dispose(),this._outline=null)},t.prototype._getLinePositions=function(e){for(var t=e.length,r=new Float32Array(3*t),n=0;n<t;++n){var i=3*n,o=e[n];r[i+0]=o[0],r[i+1]=o[1],r[i+2]=o[2]}return r},t.prototype._interact=function(e,t,r){var n=this;return function(i){var o=i.offsetX-i.target.offsetWidth/2,a=i.offsetY-i.target.offsetHeight/2;n._interact$.next({cursor:t,offsetX:o,offsetY:a,operation:e,tag:n._tag,vertexIndex:r})}},t.prototype._updateFillGeometry=function(){var e=this._tag.geometry.getTriangles3d(this._transform),t=new Float32Array(e),r=this._fill.geometry,n=r.getAttribute("position");n.array.length===t.length?(n.set(t),n.needsUpdate=!0):(r.removeAttribute("position"),r.addAttribute("position",new i.BufferAttribute(t,3))),r.computeBoundingSphere()},t.prototype._updateFillMaterial=function(e){e.color=new i.Color(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0},t.prototype._updateHoleGeometries=function(){var e=this._tag.geometry.getHoleVertices3d(this._transform);if(e.length!==this._holes.length)throw new Error("Changing the number of holes is not supported.");for(var t=0;t<this._holes.length;t++){var r=e[t],n=this._holes[t];this._updateLine(n,r)}},t.prototype._updateHoleMaterials=function(){for(var e=0,t=this._holes;e<t.length;e++){var r=t[e].material;this._updateLineBasicMaterial(r)}},t.prototype._updateLine=function(e,t){var r=this._getLinePositions(t),n=e.geometry,i=n.getAttribute("position");i.set(r),i.needsUpdate=!0,n.computeBoundingSphere()},t.prototype._updateOulineGeometry=function(){var e=this._tag.geometry.getPoints3d(this._transform);this._updateLine(this._outline,e)},t.prototype._updateOutlineMaterial=function(){var e=this._outline.material;this._updateLineBasicMaterial(e)},t.prototype._updateLineBasicMaterial=function(e){e.color=new i.Color(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0},t}(a.RenderTag);r.OutlineRenderTag=s},{"../../../Component":230,three:180,"virtual-dom":186}],315:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject"),o=e("../../../Component"),a=e("../../../Viewer"),s=function(e){function t(r,n,o){var s=e.call(this,r,n)||this;return o=o||{},s._editable=null!=o.editable&&o.editable,s._fillColor=null==o.fillColor?16777215:o.fillColor,s._fillOpacity=null==o.fillOpacity?0:o.fillOpacity,s._icon=void 0===o.icon?null:o.icon,s._iconFloat=null==o.iconFloat?a.Alignment.Center:o.iconFloat,s._iconIndex=null==o.iconIndex?3:o.iconIndex,s._indicateVertices=null==o.indicateVertices||o.indicateVertices,s._lineColor=null==o.lineColor?16777215:o.lineColor,s._lineOpacity=null==o.lineOpacity?1:o.lineOpacity,s._lineWidth=null==o.lineWidth?1:o.lineWidth,s._text=void 0===o.text?null:o.text,s._textColor=null==o.textColor?16777215:o.textColor,s._click$=new i.Subject,s._click$.subscribe(function(e){s.fire(t.click,s)}),s}return n(t,e),Object.defineProperty(t.prototype,"click$",{get:function(){return this._click$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"editable",{get:function(){return this._editable},set:function(e){this._editable=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fillColor",{get:function(){return this._fillColor},set:function(e){this._fillColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fillOpacity",{get:function(){return this._fillOpacity},set:function(e){this._fillOpacity=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"icon",{get:function(){return this._icon},set:function(e){this._icon=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"iconFloat",{get:function(){return this._iconFloat},set:function(e){this._iconFloat=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"iconIndex",{get:function(){return this._iconIndex},set:function(e){this._iconIndex=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"indicateVertices",{get:function(){return this._indicateVertices},set:function(e){this._indicateVertices=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineColor",{get:function(){return this._lineColor},set:function(e){this._lineColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineOpacity",{get:function(){return this._lineOpacity},set:function(e){this._lineOpacity=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineWidth",{get:function(){return this._lineWidth},set:function(e){this._lineWidth=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"textColor",{get:function(){return this._textColor},set:function(e){this._textColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),t.prototype.setOptions=function(e){this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._iconFloat=null==e.iconFloat?this._iconFloat:e.iconFloat,this._iconIndex=null==e.iconIndex?this._iconIndex:e.iconIndex,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)},t.click="click",t}(o.Tag);r.OutlineTag=s,r.default=s},{"../../../Component":230,"../../../Viewer":241,"rxjs/Subject":34}],316:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("../../../Geo"),o=function(){function e(e,t,r){this._tag=e,this._transform=t,this._viewportCoords=r||new i.ViewportCoords,this._glObjectsChanged$=new n.Subject,this._interact$=new n.Subject}return Object.defineProperty(e.prototype,"glObjectsChanged$",{get:function(){return this._glObjectsChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"interact$",{get:function(){return this._interact$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tag",{get:function(){return this._tag},enumerable:!0,configurable:!0}),e}();r.RenderTag=o,r.default=o},{"../../../Geo":233,"rxjs/Subject":34}],317:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../../../Component"),a=e("../../../Viewer"),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.dispose=function(){},t.prototype.getDOMObjects=function(e,t,r){var n=this,s=this._tag,c={offsetHeight:r.height,offsetWidth:r.width},u=[],h=s.geometry.getCentroid2d(),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,c,this._transform,t);if(null!=f){var d=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:o.TagOperation.None,tag:s})},m=Math.round(f[0]),v=Math.round(f[1]);if(null!=s.icon){if(e.loaded){var g=e.getDOMSprite(s.icon,a.Alignment.Bottom),y={onmousedown:d,style:{pointerEvents:"all",transform:"translate("+m+"px,"+(v+8)+"px)"}};u.push(i.h("div",y,[g]))}}else if(null!=s.text){var b="translate(-50%,0%) translate("+m+"px,"+(v+8)+"px)",y={onmousedown:d,style:{color:this._colorToCss(s.textColor),transform:b},textContent:s.text};u.push(i.h("span.TagSymbol",y,[]))}var _=this._interact(o.TagOperation.Centroid,s,"move"),x=this._colorToCss(s.color),w="translate(-50%,-50%) translate("+m+"px,"+v+"px)";if(s.editable){var S={onmousedown:_,style:{background:x,transform:w}};u.push(i.h("div.TagSpotInteractor",S,[]))}var M={style:{background:x,transform:w}};u.push(i.h("div.TagVertex",M,[]))}return u},t.prototype.getGLObjects=function(){return[]},t.prototype.getRetrievableObjects=function(){return[]},t.prototype._colorToCss=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},t.prototype._interact=function(e,t,r,n){var i=this;return function(o){var a=o.offsetX-o.target.offsetWidth/2,s=o.offsetY-o.target.offsetHeight/2;i._interact$.next({cursor:r,offsetX:a,offsetY:s,operation:e,tag:t,vertexIndex:n})}},t}(o.RenderTag);r.SpotRenderTag=s},{"../../../Component":230,"../../../Viewer":241,"virtual-dom":186}],318:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._color=null==n.color?16777215:n.color,i._editable=null!=n.editable&&n.editable,i._icon=void 0===n.icon?null:n.icon,i._text=void 0===n.text?null:n.text,i._textColor=null==n.textColor?16777215:n.textColor,i}return n(t,e),Object.defineProperty(t.prototype,"color",{get:function(){return this._color},set:function(e){this._color=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"editable",{get:function(){return this._editable},set:function(e){this._editable=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"icon",{get:function(){return this._icon},set:function(e){this._icon=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"textColor",{get:function(){return this._textColor},set:function(e){this._textColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),t.prototype.setOptions=function(e){this._color=null==e.color?this._color:e.color,this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)},t}(e("../../../Component").Tag);r.SpotTag=i,r.default=i},{"../../../Component":230}],319:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/share");var o=function(e){function t(r,n){var o=e.call(this)||this;return o._id=r,o._geometry=n,o._notifyChanged$=new i.Subject,o._notifyChanged$.subscribe(function(e){o.fire(t.changed,o)}),o._geometry.changed$.subscribe(function(e){o.fire(t.geometrychanged,o)}),o}return n(t,e),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometryChanged$",{get:function(){var e=this;return this._geometry.changed$.map(function(t){return e}).share()},enumerable:!0,configurable:!0}),t.changed="changed",t.geometrychanged="geometrychanged",t}(e("../../../Utils").EventEmitter);r.Tag=o,r.default=o},{"../../../Utils":240,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":75}],320:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t,r){this._component=e,this._container=t,this._navigator=r,this._enabled=!1}return Object.defineProperty(e.prototype,"isEnabled",{get:function(){return this._enabled},enumerable:!0,configurable:!0}),e.prototype.enable=function(){!this._enabled&&this._component.activated&&(this._enable(),this._enabled=!0,this._component.configure(this._getConfiguration(!0)))},e.prototype.disable=function(){this._enabled&&(this._disable(),this._enabled=!1,this._component.activated&&this._component.configure(this._getConfiguration(!1)))},e}();r.HandlerBase=n,r.default=n},{}],321:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,null!=t?t:"The argument is not valid.")||this;return r.name="ArgumentMapillaryError",r}return n(t,e),t}(e("./MapillaryError").MapillaryError);r.ArgumentMapillaryError=i,r.default=i},{"./MapillaryError":323}],322:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,t)||this;return r.name="GraphMapillaryError",r}return n(t,e),t}(e("./MapillaryError").MapillaryError);r.GraphMapillaryError=i,r.default=i},{"./MapillaryError":323}],323:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,t)||this;return r.name="MapillaryError",r}return n(t,e),t}(Error);r.MapillaryError=i,r.default=i},{}],324:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e){null!=e?(this._position=(new n.Vector3).fromArray(e.unprojectSfM([0,0],0)),this._lookat=(new n.Vector3).fromArray(e.unprojectSfM([0,0],10)),this._up=e.upVector(),this._focal=this._getFocal(e)):(this._position=new n.Vector3(0,0,0),this._lookat=new n.Vector3(0,0,1),this._up=new n.Vector3(0,-1,0),this._focal=1)}return Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"lookat",{get:function(){return this._lookat},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"up",{get:function(){return this._up},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._focal},set:function(e){this._focal=e},enumerable:!0,configurable:!0}),e.prototype.lerpCameras=function(e,t,r){this._position.subVectors(t.position,e.position).multiplyScalar(r).add(e.position),this._lookat.subVectors(t.lookat,e.lookat).multiplyScalar(r).add(e.lookat),this._up.subVectors(t.up,e.up).multiplyScalar(r).add(e.up),this._focal=(1-r)*e.focal+r*t.focal},e.prototype.copy=function(e){this._position.copy(e.position),this._lookat.copy(e.lookat),this._up.copy(e.up),this._focal=e.focal},e.prototype.clone=function(){var t=new e;return t.position.copy(this._position),t.lookat.copy(this._lookat),t.up.copy(this._up),t.focal=this._focal,t},e.prototype.diff=function(e){var t=this._position.distanceToSquared(e.position),r=this._lookat.distanceToSquared(e.lookat),n=this._up.distanceToSquared(e.up),i=100*Math.abs(this._focal-e.focal);return Math.max(t,r,n,i)},e.prototype._getFocal=function(e){if(null==e.gpano)return e.focal;var t=Math.PI*e.gpano.CroppedAreaImageHeightPixels/e.gpano.FullPanoHeightPixels,r=.5/Math.tan(t/2);return Math.min(1/(2*(Math.sqrt(2)-1)),Math.max(.5,r))},e}();r.Camera=i},{three:180}],325:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._wgs84a=6378137,this._wgs84b=6356752.31424518}return e.prototype.geodeticToEnu=function(e,t,r,n,i,o){var a=this.geodeticToEcef(e,t,r);return this.ecefToEnu(a[0],a[1],a[2],n,i,o)},e.prototype.enuToGeodetic=function(e,t,r,n,i,o){var a=this.enuToEcef(e,t,r,n,i,o);return this.ecefToGeodetic(a[0],a[1],a[2])},e.prototype.ecefToEnu=function(e,t,r,n,i,o){var a=this.geodeticToEcef(n,i,o),s=[e-a[0],t-a[1],r-a[2]];n=n*Math.PI/180,i=i*Math.PI/180;var c=Math.cos(n),u=Math.sin(n),h=Math.cos(i),l=Math.sin(i);return[-l*s[0]+h*s[1],-u*h*s[0]-u*l*s[1]+c*s[2],c*h*s[0]+c*l*s[1]+u*s[2]]},e.prototype.enuToEcef=function(e,t,r,n,i,o){var a=this.geodeticToEcef(n,i,o);n=n*Math.PI/180,i=i*Math.PI/180;var s=Math.cos(n),c=Math.sin(n),u=Math.cos(i),h=Math.sin(i);return[-h*e-c*u*t+s*u*r+a[0],u*e-c*h*t+s*h*r+a[1],s*t+c*r+a[2]]},e.prototype.geodeticToEcef=function(e,t,r){var n=this._wgs84a,i=this._wgs84b;e=e*Math.PI/180,t=t*Math.PI/180;var o=Math.cos(e),a=Math.sin(e),s=Math.cos(t),c=Math.sin(t),u=n*n,h=i*i,l=1/Math.sqrt(u*o*o+h*a*a),p=(u*l+r)*o;return[p*s,p*c,(h*l+r)*a]},e.prototype.ecefToGeodetic=function(e,t,r){var n=this._wgs84a,i=this._wgs84b,o=n*n,a=i*i,s=o-a,c=Math.sqrt(s/o),u=Math.sqrt(s/a),h=Math.sqrt(e*e+t*t),l=Math.atan2(r*n,h*i),p=Math.sin(l),f=Math.cos(l),d=Math.atan2(t,e),m=Math.atan2(r+u*u*i*p*p*p,h-c*c*n*f*f*f),v=Math.sin(m),g=h/Math.cos(m)-n/Math.sqrt(1-c*c*v*v);return[180*m/Math.PI,180*d/Math.PI,g]},e}();r.GeoCoords=n,r.default=n},{}],326:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this._epsilon=1e-9}return e.prototype.azimuthalToBearing=function(e){return-e+Math.PI/2},e.prototype.degToRad=function(e){return Math.PI*e/180},e.prototype.radToDeg=function(e){return 180*e/Math.PI},e.prototype.rotationMatrix=function(e){var t=new n.Vector3(e[0],e[1],e[2]),r=t.length();return r>0&&t.normalize(),(new n.Matrix4).makeRotationAxis(t,r)},e.prototype.rotate=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]),i=this.rotationMatrix(t);return r.applyMatrix4(i),r},e.prototype.opticalCenter=function(e,t){var r=[-e[0],-e[1],-e[2]],n=[-t[0],-t[1],-t[2]];return this.rotate(n,r)},e.prototype.viewingDirection=function(e){var t=[-e[0],-e[1],-e[2]];return this.rotate([0,0,1],t)},e.prototype.wrap=function(e,t,r){if(r<t)throw new Error("Invalid arguments: max must be larger than min.");for(var n=r-t;e>r||e<t;)e>r?e-=n:e<t&&(e+=n);return e},e.prototype.wrapAngle=function(e){return this.wrap(e,-Math.PI,Math.PI)},e.prototype.clamp=function(e,t,r){return e<t?t:e>r?r:e},e.prototype.angleBetweenVector2=function(e,t,r,n){var i=Math.atan2(n,r)-Math.atan2(t,e);return this.wrapAngle(i)},e.prototype.angleDifference=function(e,t){var r=t-e;return this.wrapAngle(r)},e.prototype.relativeRotationAngle=function(e,t){var r=this.rotationMatrix([-e[0],-e[1],-e[2]]),n=this.rotationMatrix(t),i=r.multiply(n).elements;return Math.acos((i[0]+i[5]+i[10]-1)/2)},e.prototype.angleToPlane=function(e,t){var r=(new n.Vector3).fromArray(e),i=r.length();if(i<this._epsilon)return 0;var o=r.dot((new n.Vector3).fromArray(t));return Math.asin(o/i)},e.prototype.distanceFromLatLon=function(e,t,r,n){var i=this.degToRad(r-e),o=this.degToRad(n-t),a=Math.sin(i/2)*Math.sin(i/2)+Math.cos(e)*Math.cos(r)*Math.sin(o/2)*Math.sin(o/2);return 12742e3*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))},e}();r.Spatial=i,r.default=i},{three:180}],327:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t,r){this._orientation=this._getValue(e.orientation,1);var n=null!=t?t.width:4,i=null!=t?t.height:3,o=this._orientation<5;this._width=this._getValue(e.width,o?n:i),this._height=this._getValue(e.height,o?i:n),this._basicAspect=o?this._width/this._height:this._height/this._width,this._basicWidth=o?e.width:e.height,this._basicHeight=o?e.height:e.width,this._focal=this._getValue(e.focal,1),this._scale=this._getValue(e.scale,0),this._gpano=null!=e.gpano?e.gpano:null,this._rt=this._getRt(e.rotation,r),this._srt=this._getSrt(this._rt,this._scale)}return Object.defineProperty(e.prototype,"basicAspect",{get:function(){return this._basicAspect},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"basicHeight",{get:function(){return this._basicHeight},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"basicWidth",{get:function(){return this._basicWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._focal},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullPano",{get:function(){return null!=this._gpano&&0===this._gpano.CroppedAreaLeftPixels&&0===this._gpano.CroppedAreaTopPixels&&this._gpano.CroppedAreaImageWidthPixels===this._gpano.FullPanoWidthPixels&&this._gpano.CroppedAreaImageHeightPixels===this._gpano.FullPanoHeightPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"gpano",{get:function(){return this._gpano},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._height},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"orientation",{get:function(){return this._orientation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rt",{get:function(){return this._rt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"srt",{get:function(){return this._srt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scale",{get:function(){return this._scale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hasValidScale",{get:function(){return this._scale>.01&&this._scale<50},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this._width},enumerable:!0,configurable:!0}),e.prototype.upVector=function(){var e=this._rt.elements;switch(this._orientation){case 1:return new n.Vector3(-e[1],-e[5],-e[9]);case 3:return new n.Vector3(e[1],e[5],e[9]);case 6:return new n.Vector3(-e[0],-e[4],-e[8]);case 8:return new n.Vector3(e[0],e[4],e[8]);default:return new n.Vector3(-e[1],-e[5],-e[9])}},e.prototype.projectorMatrix=function(){var e=this._normalizedToTextureMatrix(),t=this._focal,r=(new n.Matrix4).set(t,0,0,0,0,t,0,0,0,0,0,0,0,0,1,0);return e.multiply(r),e.multiply(this._rt),e},e.prototype.projectBasic=function(e){var t=this.projectSfM(e);return this._sfmToBasic(t)},e.prototype.unprojectBasic=function(e,t){var r=this._basicToSfm(e);return this.unprojectSfM(r,t)},e.prototype.projectSfM=function(e){var t=new n.Vector4(e[0],e[1],e[2],1);return t.applyMatrix4(this._rt),this._bearingToSfm([t.x,t.y,t.z])},e.prototype.unprojectSfM=function(e,t){var r=this._sfmToBearing(e),i=new n.Vector4(t*r[0],t*r[1],t*r[2],1);return i.applyMatrix4((new n.Matrix4).getInverse(this._rt)),[i.x/i.w,i.y/i.w,i.z/i.w]},e.prototype._sfmToBearing=function(e){if(this._fullPano()){var t=2*e[0]*Math.PI,r=2*-e[1]*Math.PI;return[a=Math.cos(r)*Math.sin(t),s=-Math.sin(r),c=Math.cos(r)*Math.cos(t)]}if(this._gpano){var i=Math.max(this.gpano.CroppedAreaImageWidthPixels,this.gpano.CroppedAreaImageHeightPixels),o=[e[0]*i+this.gpano.CroppedAreaImageWidthPixels/2+this.gpano.CroppedAreaLeftPixels,e[1]*i+this.gpano.CroppedAreaImageHeightPixels/2+this.gpano.CroppedAreaTopPixels],t=2*Math.PI*(o[0]/this.gpano.FullPanoWidthPixels-.5),r=-Math.PI*(o[1]/this.gpano.FullPanoHeightPixels-.5),a=Math.cos(r)*Math.sin(t),s=-Math.sin(r),c=Math.cos(r)*Math.cos(t);return[a,s,c]}var u=new n.Vector3(e[0],e[1],this._focal);return u.normalize(),[u.x,u.y,u.z]},e.prototype._bearingToSfm=function(e){if(this._fullPano()){var t=e[0],r=e[1],n=e[2],i=Math.atan2(t,n),o=Math.atan2(-r,Math.sqrt(t*t+n*n));return[i/(2*Math.PI),-o/(2*Math.PI)]}if(this._gpano){var t=e[0],r=e[1],n=e[2],i=Math.atan2(t,n),o=Math.atan2(-r,Math.sqrt(t*t+n*n)),a=[(i/(2*Math.PI)+.5)*this.gpano.FullPanoWidthPixels,(-o/Math.PI+.5)*this.gpano.FullPanoHeightPixels],s=Math.max(this.gpano.CroppedAreaImageWidthPixels,this.gpano.CroppedAreaImageHeightPixels);return[(a[0]-this.gpano.CroppedAreaLeftPixels-this.gpano.CroppedAreaImageWidthPixels/2)/s,(a[1]-this.gpano.CroppedAreaTopPixels-this.gpano.CroppedAreaImageHeightPixels/2)/s]}return e[2]>0?[e[0]*this._focal/e[2],e[1]*this._focal/e[2]]:[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]},e.prototype._basicToSfm=function(e){var t,r;switch(this._orientation){case 1:t=e[0],r=e[1];break;case 3:t=1-e[0],r=1-e[1];break;case 6:t=e[1],r=1-e[0];break;case 8:t=1-e[1],r=e[0];break;default:t=e[0],r=e[1]}var n=this._width,i=this._height,o=Math.max(n,i);return[t*n/o-n/o/2,r*i/o-i/o/2]},e.prototype._sfmToBasic=function(e){var t,r,n=this._width,i=this._height,o=Math.max(n,i),a=(e[0]+n/o/2)/n*o,s=(e[1]+i/o/2)/i*o;switch(this._orientation){case 1:t=a,r=s;break;case 3:t=1-a,r=1-s;break;case 6:t=1-s,r=a;break;case 8:t=s,r=1-a;break;default:t=a,r=s}return[t,r]},e.prototype._fullPano=function(){return null!=this.gpano&&0===this.gpano.CroppedAreaLeftPixels&&0===this.gpano.CroppedAreaTopPixels&&this.gpano.CroppedAreaImageWidthPixels===this.gpano.FullPanoWidthPixels&&this.gpano.CroppedAreaImageHeightPixels===this.gpano.FullPanoHeightPixels},e.prototype._getValue=function(e,t){return null!=e&&e>0?e:t},e.prototype._getRt=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]),i=r.length();i>0&&r.normalize();var o=new n.Matrix4;return o.makeRotationAxis(r,i),o.setPosition(new n.Vector3(t[0],t[1],t[2])),o},e.prototype._getSrt=function(e,t){var r=e.clone(),i=r.elements;return i[12]=t*i[12],i[13]=t*i[13],i[14]=t*i[14],r.scale(new n.Vector3(t,t,t)),r},e.prototype._normalizedToTextureMatrix=function(){var e=Math.max(this._width,this._height),t=e/this._width,r=e/this._height;switch(this._orientation){case 1:return(new n.Matrix4).set(t,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1);case 3:return(new n.Matrix4).set(-t,0,0,.5,0,r,0,.5,0,0,1,0,0,0,0,1);case 6:return(new n.Matrix4).set(0,-r,0,.5,-t,0,0,.5,0,0,1,0,0,0,0,1);case 8:return(new n.Matrix4).set(0,r,0,.5,t,0,0,.5,0,0,1,0,0,0,0,1);default:return(new n.Matrix4).set(t,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1)}},e}();r.Transform=i},{three:180}],328:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this._unprojectDepth=200}return e.prototype.basicToCanvas=function(e,t,r,n,i){var o=n.unprojectBasic([e,t],this._unprojectDepth);return this.projectToCanvas(o,r,i)},e.prototype.basicToCanvasSafe=function(e,t,r,n,i){var o=n.unprojectBasic([e,t],this._unprojectDepth),a=this.worldToCamera(o,i);if(a[2]>0)return null;var s=this.cameraToViewport(a,i),c=s[0],u=s[1];return this.viewportToCanvas(c,u,r)},e.prototype.basicToViewport=function(e,t,r,n){var i=r.unprojectBasic([e,t],this._unprojectDepth);return this.projectToViewport(i,n)},e.prototype.cameraToViewport=function(e,t){var r=(new n.Vector3).fromArray(e).applyMatrix4(t.projectionMatrix);return[r.x,r.y]},e.prototype.canvasPosition=function(e,t){var r=t.getBoundingClientRect();return[e.clientX-r.left-t.clientLeft,e.clientY-r.top-t.clientTop]},e.prototype.canvasToBasic=function(e,t,r,n,i){var o=this.unprojectFromCanvas(e,t,r,i).toArray();return n.projectBasic(o)},e.prototype.canvasToViewport=function(e,t,r){var n=this.containerToCanvas(r);return[2*e/n[0]-1,1-2*t/n[1]]},e.prototype.containerToCanvas=function(e){return[e.offsetWidth,e.offsetHeight]},e.prototype.getBasicDistances=function(e,t){var r=this.viewportToBasic(-1,1,e,t),n=this.viewportToBasic(1,1,e,t),i=this.viewportToBasic(1,-1,e,t),o=this.viewportToBasic(-1,-1,e,t),a=0,s=0,c=0,u=0;return r[1]<0&&n[1]<0&&(a=r[1]>n[1]?-r[1]:-n[1]),n[0]>1&&i[0]>1&&(s=n[0]<i[0]?n[0]-1:i[0]-1),i[1]>1&&o[1]>1&&(c=i[1]<o[1]?i[1]-1:o[1]-1),o[0]<0&&r[0]<0&&(u=o[0]>r[0]?-o[0]:-r[0]),[a,s,c,u]},e.prototype.getPixelDistances=function(e,t,r){var n=this.viewportToBasic(-1,1,t,r),i=this.viewportToBasic(1,1,t,r),o=this.viewportToBasic(1,-1,t,r),a=this.viewportToBasic(-1,-1,t,r),s=0,c=0,u=0,h=0,l=this.containerToCanvas(e),p=l[0],f=l[1];if(n[1]<0&&i[1]<0){d=n[1]>i[1]?n[0]:i[0];s=(v=this.basicToCanvas(d,0,e,t,r))[1]>0?v[1]:0}if(i[0]>1&&o[0]>1){m=i[0]<o[0]?i[1]:o[1];c=(v=this.basicToCanvas(1,m,e,t,r))[0]<p?p-v[0]:0}if(o[1]>1&&a[1]>1){var d=o[1]<a[1]?o[0]:a[0];u=(v=this.basicToCanvas(d,1,e,t,r))[1]<f?f-v[1]:0}if(a[0]<0&&n[0]<0){var m=a[0]>n[0]?a[1]:n[1],v=this.basicToCanvas(0,m,e,t,r);h=v[0]>0?v[0]:0}return[s,c,u,h]},e.prototype.insideElement=function(e,t){var r=t.getBoundingClientRect(),n=r.left+t.clientLeft,i=n+t.clientWidth,o=r.top+t.clientTop,a=o+t.clientHeight;return e.clientX>n&&e.clientX<i&&e.clientY>o&&e.clientY<a},e.prototype.projectToCanvas=function(e,t,r){var n=this.projectToViewport(e,r);return this.viewportToCanvas(n[0],n[1],t)},e.prototype.projectToViewport=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]).project(t);return[r.x,r.y]},e.prototype.unprojectFromCanvas=function(e,t,r,n){var i=this.canvasToViewport(e,t,r);return this.unprojectFromViewport(i[0],i[1],n)},e.prototype.unprojectFromViewport=function(e,t,r){return new n.Vector3(e,t,1).unproject(r)},e.prototype.viewportToBasic=function(e,t,r,i){var o=new n.Vector3(e,t,1).unproject(i).toArray();return r.projectBasic(o)},e.prototype.viewportToCanvas=function(e,t,r){var n=this.containerToCanvas(r);return[n[0]*(e+1)/2,-n[1]*(t-1)/2]},e.prototype.worldToCamera=function(e,t){return new n.Vector3(e[0],e[1],e[2]).applyMatrix4(t.matrixWorldInverse).toArray()},e}();r.ViewportCoords=i,r.default=i},{three:180}],329:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return e.prototype.createFilter=function(e){return new Function("node","return "+this._compile(e)+";")},e.prototype._compile=function(e){if(null==e||e.length<=1)return"true";var t=e[0];return"("+("=="===t?this._compileComparisonOp("===",e[1],e[2],!1):"!="===t?this._compileComparisonOp("!==",e[1],e[2],!1):">"===t||">="===t||"<"===t||"<="===t?this._compileComparisonOp(t,e[1],e[2],!0):"in"===t?this._compileInOp(e[1],e.slice(2)):"!in"===t?this._compileNegation(this._compileInOp(e[1],e.slice(2))):"all"===t?this._compileLogicalOp(e.slice(1),"&&"):"true")+")"},e.prototype._compare=function(e,t){return e<t?-1:e>t?1:0},e.prototype._compileComparisonOp=function(e,t,r,n){var i=this._compilePropertyReference(t),o=JSON.stringify(r);return(n?"typeof "+i+"===typeof "+o+"&&":"")+i+e+o},e.prototype._compileInOp=function(e,t){var r=this._compare;return JSON.stringify(t.sort(r))+".indexOf("+this._compilePropertyReference(e)+")!==-1"},e.prototype._compileLogicalOp=function(e,t){var r=this._compile.bind(this);return e.map(r).join(t)},e.prototype._compileNegation=function(e){return"!("+e+")"},e.prototype._compilePropertyReference=function(e){return"node["+JSON.stringify(e)+"]"},e}();r.FilterCreator=n,r.default=n},{}],330:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rbush"),i=e("rxjs/Subject");e("rxjs/add/observable/from"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/do"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publish");var o=e("../Edge"),a=e("../Error"),s=e("../Graph"),c=function(){function e(e,t,r,a,c,u){this._apiV3=e,this._cachedNodes={},this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._changed$=new i.Subject,this._defaultAlt=2,this._edgeCalculator=null!=a?a:new o.EdgeCalculator,this._filterCreator=null!=c?c:new s.FilterCreator,this._filter=this._filterCreator.createFilter(void 0),this._graphCalculator=null!=r?r:new s.GraphCalculator,this._configuration=null!=u?u:{maxSequences:50,maxUnusedNodes:100,maxUnusedTiles:20},this._nodes={},this._nodeIndex=null!=t?t:n(16,[".lat",".lon",".lat",".lon"]),this._nodeIndexTiles={},this._nodeToTile={},this._preStored={},this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._tilePrecision=7,this._tileThreshold=20}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._changed$},enumerable:!0,configurable:!0}),e.prototype.cacheFill$=function(e){var t=this;if(e in this._cachingFull$)throw new a.GraphMapillaryError("Cannot fill node while caching full ("+e+").");if(!this.hasNode(e))throw new a.GraphMapillaryError("Cannot fill node that does not exist in graph ("+e+").");if(e in this._cachingFill$)return this._cachingFill$[e];var r=this.getNode(e);if(r.full)throw new a.GraphMapillaryError("Cannot fill node that is already full ("+e+").");return this._cachingFill$[e]=this._apiV3.imageByKeyFill$([e]).do(function(n){r.full||t._makeFull(r,n[e]),delete t._cachingFill$[e]}).map(function(e){return t}).finally(function(){e in t._cachingFill$&&delete t._cachingFill$[e],t._changed$.next(t)}).publish().refCount(),this._cachingFill$[e]},e.prototype.cacheFull$=function(e){var t=this;if(e in this._cachingFull$)return this._cachingFull$[e];if(this.hasNode(e))throw new a.GraphMapillaryError("Cannot cache full node that already exist in graph ("+e+").");return this._cachingFull$[e]=this._apiV3.imageByKeyFull$([e]).do(function(r){var n=r[e];if(t.hasNode(e))(i=t.getNode(e)).full||t._makeFull(i,n);else{if(null==n.sequence||null==n.sequence.key)throw new a.GraphMapillaryError("Node has no sequence ("+e+").");var i=new s.Node(n);t._makeFull(i,n);var o=t._graphCalculator.encodeH(i.originalLatLon,t._tilePrecision);t._preStore(o,i),t._setNode(i),delete t._cachingFull$[e]}}).map(function(e){return t}).finally(function(){e in t._cachingFull$&&delete t._cachingFull$[e],t._changed$.next(t)}).publish().refCount(),this._cachingFull$[e]},e.prototype.cacheNodeSequence$=function(e){if(!this.hasNode(e))throw new a.GraphMapillaryError("Cannot cache sequence edges of node that does not exist in graph ("+e+").");var t=this.getNode(e);if(t.sequenceKey in this._sequences)throw new a.GraphMapillaryError("Sequence already cached ("+e+"), ("+t.sequenceKey+").");return this._cacheSequence$(t.sequenceKey)},e.prototype.cacheSequence$=function(e){if(e in this._sequences)throw new a.GraphMapillaryError("Sequence already cached ("+e+")");return this._cacheSequence$(e)},e.prototype.cacheSequenceEdges=function(e){var t=this.getNode(e);if(!(t.sequenceKey in this._sequences))throw new a.GraphMapillaryError("Sequence is not cached ("+e+"), ("+t.sequenceKey+")");var r=this._sequences[t.sequenceKey].sequence,n=this._edgeCalculator.computeSequenceEdges(t,r);t.cacheSequenceEdges(n)},e.prototype.cacheSpatialArea$=function(e){var t=this;if(!this.hasNode(e))throw new a.GraphMapillaryError("Cannot cache spatial area of node that does not exist in graph ("+e+").");if(e in this._cachedSpatialEdges)throw new a.GraphMapillaryError("Node already spatially cached ("+e+").");if(!(e in this._requiredSpatialArea))throw new a.GraphMapillaryError("Spatial area not determined ("+e+").");var r=this._requiredSpatialArea[e];if(0===Object.keys(r.cacheNodes).length)throw new a.GraphMapillaryError("Spatial nodes already cached ("+e+").");if(e in this._cachingSpatialArea$)return this._cachingSpatialArea$[e];for(var n=[];r.cacheKeys.length>0;)n.push(r.cacheKeys.splice(0,200));for(var i=n.length,o=[],s=this,c=0,u=n;c<u.length;c++)!function(n){var a=s._apiV3.imageByKeyFill$(n).do(function(n){for(var o in n)if(n.hasOwnProperty(o)){var a=r.cacheNodes[o];if(a.full)delete r.cacheNodes[o];else{var s=n[o];t._makeFull(a,s),delete r.cacheNodes[o]}}0==--i&&delete t._cachingSpatialArea$[e]}).map(function(e){return t}).catch(function(o){for(var a=0,s=n;a<s.length;a++){var c=s[a];c in r.all&&delete r.all[c],c in r.cacheNodes&&delete r.cacheNodes[c]}throw 0==--i&&delete t._cachingSpatialArea$[e],o}).finally(function(){0===Object.keys(r.cacheNodes).length&&t._changed$.next(t)}).publish().refCount();o.push(a)}(u[c]);return this._cachingSpatialArea$[e]=o,o},e.prototype.cacheSpatialEdges=function(e){if(e in this._cachedSpatialEdges)throw new a.GraphMapillaryError("Spatial edges already cached ("+e+").");var t=this.getNode(e),r=this._sequences[t.sequenceKey].sequence,n=[],i=r.findPrevKey(t.key);null!=i&&n.push(i);var o=r.findNextKey(t.key);null!=o&&n.push(o);var s=this._requiredSpatialArea[e].all,c=[],u=this._filter;for(var h in s)if(s.hasOwnProperty(h)){var l=s[h];u(l)&&c.push(l)}var p=this._edgeCalculator.getPotentialEdges(t,c,n),f=this._edgeCalculator.computeStepEdges(t,p,i,o);f=(f=(f=(f=f.concat(this._edgeCalculator.computeTurnEdges(t,p))).concat(this._edgeCalculator.computePanoEdges(t,p))).concat(this._edgeCalculator.computePerspectiveToPanoEdges(t,p))).concat(this._edgeCalculator.computeSimilarEdges(t,p)),t.cacheSpatialEdges(f),this._cachedSpatialEdges[e]=t,delete this._requiredSpatialArea[e],delete this._cachedNodeTiles[e]},e.prototype.cacheTiles$=function(e){var t=this;if(e in this._cachedNodeTiles)throw new a.GraphMapillaryError("Tiles already cached ("+e+").");if(e in this._cachedSpatialEdges)throw new a.GraphMapillaryError("Spatial edges already cached so tiles considered cached ("+e+").");if(!(e in this._requiredNodeTiles))throw new a.GraphMapillaryError("Tiles have not been determined ("+e+").");var r=this._requiredNodeTiles[e];if(0===r.cache.length&&0===r.caching.length)throw new a.GraphMapillaryError("Tiles already cached ("+e+").");if(!this.hasNode(e))throw new a.GraphMapillaryError("Cannot cache tiles of node that does not exist in graph ("+e+").");var n=r.cache.slice();r.caching=this._requiredNodeTiles[e].caching.concat(n),r.cache=[];for(var i=[],o=this,c=0,u=r.caching;c<u.length;c++)!function(n){var a=null;n in o._cachingTiles$?a=o._cachingTiles$[n]:(a=o._apiV3.imagesByH$([n]).do(function(e){var r=e[n];if(!(n in t._cachedTiles)){t._nodeIndexTiles[n]=[],t._cachedTiles[n]={accessed:(new Date).getTime(),nodes:[]};var i=t._cachedTiles[n].nodes,o=t._removeFromPreStore(n);for(var a in r)if(r.hasOwnProperty(a)){var c=r[a];if(null==c)break;if(null!=c.sequence&&null!=c.sequence.key)if(null!=o&&c.key in o){var u=o[c.key];delete o[c.key],i.push(u);var h={lat:u.latLon.lat,lon:u.latLon.lon,node:u};t._nodeIndex.insert(h),t._nodeIndexTiles[n].push(h),t._nodeToTile[u.key]=n}else{var l=new s.Node(c);i.push(l);var p={lat:l.latLon.lat,lon:l.latLon.lon,node:l};t._nodeIndex.insert(p),t._nodeIndexTiles[n].push(p),t._nodeToTile[l.key]=n,t._setNode(l)}else console.warn("Sequence missing, discarding ("+c.key+")")}delete t._cachingTiles$[n]}}).map(function(e){return t}).catch(function(e){throw delete t._cachingTiles$[n],e}).publish().refCount(),o._cachingTiles$[n]=a),i.push(a.do(function(i){var o=r.caching.indexOf(n);o>-1&&r.caching.splice(o,1),0===r.caching.length&&0===r.cache.length&&(delete t._requiredNodeTiles[e],t._cachedNodeTiles[e]=!0)}).catch(function(i){var o=r.caching.indexOf(n);throw o>-1&&r.caching.splice(o,1),0===r.caching.length&&0===r.cache.length&&(delete t._requiredNodeTiles[e],t._cachedNodeTiles[e]=!0),i}).finally(function(){t._changed$.next(t)}).publish().refCount())}(u[c]);return i},e.prototype.initializeCache=function(e){if(e in this._cachedNodes)throw new a.GraphMapillaryError("Node already in cache ("+e+").");var t=this.getNode(e);t.initializeCache(new s.NodeCache);var r=(new Date).getTime();this._cachedNodes[e]={accessed:r,node:t},this._updateCachedTileAccess(e,r)},e.prototype.isCachingFill=function(e){return e in this._cachingFill$},e.prototype.isCachingFull=function(e){return e in this._cachingFull$},e.prototype.isCachingNodeSequence=function(e){return this.getNode(e).sequenceKey in this._cachingSequences$},e.prototype.isCachingSequence=function(e){return e in this._cachingSequences$},e.prototype.isCachingTiles=function(e){return e in this._requiredNodeTiles&&0===this._requiredNodeTiles[e].cache.length&&this._requiredNodeTiles[e].caching.length>0},e.prototype.hasInitializedCache=function(e){return e in this._cachedNodes},e.prototype.hasNode=function(e){var t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),e in this._nodes},e.prototype.hasNodeSequence=function(e){var t=this.getNode(e).sequenceKey,r=t in this._sequences;return r&&(this._sequences[t].accessed=(new Date).getTime()),r},e.prototype.hasSequence=function(e){var t=e in this._sequences;return t&&(this._sequences[e].accessed=(new Date).getTime()),t},e.prototype.hasSpatialArea=function(e){if(!this.hasNode(e))throw new a.GraphMapillaryError("Spatial area nodes cannot be determined if node not in graph ("+e+").");if(e in this._cachedSpatialEdges)return!0;if(e in this._requiredSpatialArea)return 0===Object.keys(this._requiredSpatialArea[e].cacheNodes).length;for(var t=this.getNode(e),r=this._graphCalculator.boundingBoxCorners(t.latLon,this._tileThreshold),n={all:{},cacheKeys:[],cacheNodes:{}},i=0,o=this._nodeIndex.search({maxX:r[1].lat,maxY:r[1].lon,minX:r[0].lat,minY:r[0].lon});i<o.length;i++){var s=o[i];n.all[s.node.key]=s.node,s.node.full||(n.cacheKeys.push(s.node.key),n.cacheNodes[s.node.key]=s.node)}return this._requiredSpatialArea[e]=n,0===n.cacheKeys.length},e.prototype.hasTiles=function(e){var t=this;if(e in this._cachedNodeTiles)return!0;if(e in this._cachedSpatialEdges)return!0;if(!this.hasNode(e))throw new a.GraphMapillaryError("Node does not exist in graph ("+e+").");var r={cache:[],caching:[]};if(e in this._requiredNodeTiles)r=this._requiredNodeTiles[e];else{var n=this.getNode(e);r.cache=this._graphCalculator.encodeHs(n.latLon,this._tilePrecision,this._tileThreshold).filter(function(e){return!(e in t._cachedTiles)}),r.cache.length>0&&(this._requiredNodeTiles[e]=r)}return 0===r.cache.length&&0===r.caching.length},e.prototype.getNode=function(e){var t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),this._nodes[e]},e.prototype.getSequence=function(e){var t=this._sequences[e];return t.accessed=(new Date).getTime(),t.sequence},e.prototype.resetSpatialEdges=function(){for(var e=0,t=Object.keys(this._cachedSpatialEdges);e<t.length;e++){var r=t[e];this._cachedSpatialEdges[r].resetSpatialEdges(),delete this._cachedSpatialEdges[r]}},e.prototype.reset=function(e){for(var t=[],r=0,n=e;r<n.length;r++){var i=n[r];if(!this.hasNode(i))throw new Error("Node does not exist "+i);(h=this.getNode(i)).resetSequenceEdges(),h.resetSpatialEdges(),t.push(h)}for(var o=0,a=Object.keys(this._cachedNodes);o<a.length;o++){var s=a[o];-1===e.indexOf(s)&&(this._cachedNodes[s].node.dispose(),delete this._cachedNodes[s])}this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._nodes={},this._nodeToTile={},this._preStored={};for(var c=0,u=t;c<u.length;c++){var h=u[c];this._nodes[h.key]=h;var l=this._graphCalculator.encodeH(h.originalLatLon,this._tilePrecision);this._preStore(l,h)}this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._nodeIndexTiles={},this._nodeIndex.clear()},e.prototype.setFilter=function(e){this._filter=this._filterCreator.createFilter(e)},e.prototype.uncache=function(e){var t={};this._addNewKeys(t,this._cachingFull$),this._addNewKeys(t,this._cachingFill$),this._addNewKeys(t,this._cachingTiles$),this._addNewKeys(t,this._cachingSpatialArea$),this._addNewKeys(t,this._requiredNodeTiles),this._addNewKeys(t,this._requiredSpatialArea);for(var r=0,n=e;r<n.length;r++)(o=n[r])in t||(t[o]=!0);var i={};for(var o in t)if(t.hasOwnProperty(o))for(var a=this._nodes[o],s=0,c=this._graphCalculator.encodeHs(a.latLon);s<c.length;s++){var u=c[s];u in i||(i[u]=!0)}var h=[];for(var l in this._cachedTiles)!this._cachedTiles.hasOwnProperty(l)||l in i||h.push([l,this._cachedTiles[l]]);for(var p=0,f=h.sort(function(e,t){return t[1].accessed-e[1].accessed}).slice(this._configuration.maxUnusedTiles).map(function(e){return e[0]});p<f.length;p++){var d=f[p];this._uncacheTile(d)}var m=[];for(var o in this._cachedNodes)!this._cachedNodes.hasOwnProperty(o)||o in t||m.push(this._cachedNodes[o]);for(var v=0,g=m.sort(function(e,t){return t.accessed-e.accessed}).slice(this._configuration.maxUnusedNodes);v<g.length;v++){var y=g[v];y.node.uncache();o=y.node.key;delete this._cachedNodes[o],o in this._cachedNodeTiles&&delete this._cachedNodeTiles[o],o in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[o]}var b=[];for(var _ in this._sequences)!this._sequences.hasOwnProperty(_)||_ in this._cachingSequences$||b.push(this._sequences[_]);for(var x=0,w=b.sort(function(e,t){return t.accessed-e.accessed}).slice(this._configuration.maxSequences);x<w.length;x++){var S=w[x],_=S.sequence.key;delete this._sequences[_],S.sequence.dispose()}},e.prototype._addNewKeys=function(e,t){for(var r in t)t.hasOwnProperty(r)&&this.hasNode(r)&&(r in e||(e[r]=!0))},e.prototype._cacheSequence$=function(e){var t=this;return e in this._cachingSequences$?this._cachingSequences$[e]:(this._cachingSequences$[e]=this._apiV3.sequenceByKey$([e]).do(function(r){e in t._sequences||(t._sequences[e]={accessed:(new Date).getTime(),sequence:new s.Sequence(r[e])}),delete t._cachingSequences$[e]}).map(function(e){return t}).finally(function(){e in t._cachingSequences$&&delete t._cachingSequences$[e],t._changed$.next(t)}).publish().refCount(),this._cachingSequences$[e])},e.prototype._makeFull=function(e,t){null==t.calt&&(t.calt=this._defaultAlt),null==t.c_rotation&&(t.c_rotation=this._graphCalculator.rotationFromCompass(t.ca,t.orientation)),e.makeFull(t)},e.prototype._preStore=function(e,t){e in this._preStored||(this._preStored[e]={}),this._preStored[e][t.key]=t},e.prototype._removeFromPreStore=function(e){var t=null;return e in this._preStored&&(t=this._preStored[e],delete this._preStored[e]),t},e.prototype._setNode=function(e){var t=e.key;if(this.hasNode(t))throw new a.GraphMapillaryError("Node already exist ("+t+").");this._nodes[t]=e},e.prototype._uncacheTile=function(e){for(var t=0,r=this._cachedTiles[e].nodes;t<r.length;t++){var n=r[t],i=n.key;delete this._nodes[i],delete this._nodeToTile[i],i in this._cachedNodes&&delete this._cachedNodes[i],i in this._cachedNodeTiles&&delete this._cachedNodeTiles[i],i in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[i],n.dispose()}for(var o=0,a=this._nodeIndexTiles[e];o<a.length;o++){var s=a[o];this._nodeIndex.remove(s)}delete this._nodeIndexTiles[e],delete this._cachedTiles[e]},e.prototype._updateCachedTileAccess=function(e,t){e in this._nodeToTile&&(this._cachedTiles[this._nodeToTile[e]].accessed=t)},e.prototype._updateCachedNodeAccess=function(e,t){e in this._cachedNodes&&(this._cachedNodes[e].accessed=t)},e}();r.Graph=c,r.default=c},{"../Edge":231,"../Error":232,"../Graph":234,rbush:25,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],331:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("latlon-geohash"),i=e("three"),o=e("../Geo"),a=function(){function e(){}return e.n="n",e.nw="nw",e.w="w",e.sw="sw",e.s="s",e.se="se",e.e="e",e.ne="ne",e}(),s=function(){function e(e){this._geoCoords=null!=e?e:new o.GeoCoords}return e.prototype.encodeH=function(e,t){return void 0===t&&(t=7),n.encode(e.lat,e.lon,t)},e.prototype.encodeHs=function(e,t,r){void 0===t&&(t=7),void 0===r&&(r=20);var i=n.encode(e.lat,e.lon,t),o=n.bounds(i),s=o.ne,c=o.sw,u=n.neighbours(i),h=[0,0,0],l=this._geoCoords.geodeticToEnu(s.lat,s.lon,0,c.lat,c.lon,0),p=this._geoCoords.geodeticToEnu(e.lat,e.lon,0,c.lat,c.lon,0),f=p[0]-h[0]<r,d=l[0]-p[0]<r,m=p[1]-h[1]<r,v=l[1]-p[1]<r,g=[i];return v&&g.push(u[a.n]),v&&f&&g.push(u[a.nw]),f&&g.push(u[a.w]),f&&m&&g.push(u[a.sw]),m&&g.push(u[a.s]),m&&d&&g.push(u[a.se]),d&&g.push(u[a.e]),d&&v&&g.push(u[a.ne]),g},e.prototype.boundingBoxCorners=function(e,t){var r=this._geoCoords.enuToGeodetic(-t,-t,0,e.lat,e.lon,0),n=this._geoCoords.enuToGeodetic(t,t,0,e.lat,e.lon,0);return[{lat:r[0],lon:r[1]},{lat:n[0],lon:n[1]}]},e.prototype.rotationFromCompass=function(e,t){var r=0,n=0,o=0;switch(t){case 1:r=Math.PI/2;break;case 3:r=-Math.PI/2,o=Math.PI;break;case 6:n=-Math.PI/2,o=-Math.PI/2;break;case 8:n=Math.PI/2,o=Math.PI/2}var a=(new i.Matrix4).makeRotationZ(o),s=new i.Euler(r,n,e*Math.PI/180,"XYZ"),c=(new i.Matrix4).makeRotationFromEuler(s),u=(new i.Vector4).setAxisAngleFromRotationMatrix(c.multiply(a));return u.multiplyScalar(u.w).toArray().slice(0,3)},e}();r.GraphCalculator=s,r.default=s},{"../Geo":233,"latlon-geohash":21,three:180}],332:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=e("rxjs/Subject");e("rxjs/add/operator/catch"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/do"),e("rxjs/add/operator/expand"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/last"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay");var o=function(){function e(e,t){this._graph$=n.Observable.of(e).concat(e.changed$).publishReplay(1).refCount(),this._graph$.subscribe(function(){}),this._imageLoadingService=t,this._firstGraphSubjects$=[],this._initializeCacheSubscriptions=[],this._sequenceSubscriptions=[],this._spatialSubscriptions=[]}return e.prototype.cacheNode$=function(e){var t=this,r=new i.Subject;this._firstGraphSubjects$.push(r);var o=r.publishReplay(1).refCount(),a=o.map(function(t){return t.getNode(e)}).mergeMap(function(e){return e.assetsCached?n.Observable.of(e):e.cacheAssets$()}).publishReplay(1).refCount();a.subscribe(function(e){t._imageLoadingService.loadnode$.next(e)},function(t){console.error("Failed to cache node ("+e+")",t)});var s=this._graph$.first().mergeMap(function(t){return t.isCachingFull(e)||!t.hasNode(e)?t.cacheFull$(e):t.isCachingFill(e)||!t.getNode(e).full?t.cacheFill$(e):n.Observable.of(t)}).do(function(t){t.hasInitializedCache(e)||t.initializeCache(e)}).finally(function(){null!=s&&(t._removeFromArray(s,t._initializeCacheSubscriptions),t._removeFromArray(r,t._firstGraphSubjects$))}).subscribe(function(e){r.next(e),r.complete()},function(e){r.error(e)});s.closed||this._initializeCacheSubscriptions.push(s);var c=o.mergeMap(function(t){return t.isCachingNodeSequence(e)||!t.hasNodeSequence(e)?t.cacheNodeSequence$(e):n.Observable.of(t)}).do(function(t){t.getNode(e).sequenceEdges.cached||t.cacheSequenceEdges(e)}).finally(function(){null!=c&&t._removeFromArray(c,t._sequenceSubscriptions)}).subscribe(function(e){},function(t){console.error("Failed to cache sequence edges ("+e+").",t)});c.closed||this._sequenceSubscriptions.push(c);var u=o.expand(function(t){return t.hasTiles(e)?n.Observable.empty():n.Observable.from(t.cacheTiles$(e)).mergeMap(function(t){return t.mergeMap(function(t){return t.isCachingTiles(e)?n.Observable.empty():n.Observable.of(t)}).catch(function(t,r){return console.error("Failed to cache tile data ("+e+").",t),n.Observable.empty()})})}).last().mergeMap(function(t){return t.hasSpatialArea(e)?n.Observable.of(t):n.Observable.from(t.cacheSpatialArea$(e)).mergeMap(function(t){return t.catch(function(t,r){return console.error("Failed to cache spatial nodes ("+e+").",t),n.Observable.empty()})})}).last().mergeMap(function(t){return t.hasNodeSequence(e)?n.Observable.of(t):t.cacheNodeSequence$(e)}).do(function(t){t.getNode(e).spatialEdges.cached||t.cacheSpatialEdges(e)}).finally(function(){null!=u&&t._removeFromArray(u,t._spatialSubscriptions)}).subscribe(function(e){},function(t){console.error("Failed to cache spatial edges ("+e+").",t)});return u.closed||this._spatialSubscriptions.push(u),a.first(function(e){return e.assetsCached})},e.prototype.cacheSequence$=function(e){return this._graph$.first().mergeMap(function(t){return t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):n.Observable.of(t)}).map(function(t){return t.getSequence(e)})},e.prototype.setFilter$=function(e){return this._resetSubscriptions(this._spatialSubscriptions),this._graph$.first().do(function(t){t.resetSpatialEdges(),t.setFilter(e)})},e.prototype.reset$=function(e){return this._abortSubjects(this._firstGraphSubjects$),this._resetSubscriptions(this._initializeCacheSubscriptions),this._resetSubscriptions(this._sequenceSubscriptions),this._resetSubscriptions(this._spatialSubscriptions),this._graph$.first().do(function(t){t.reset(e)})},e.prototype.uncache$=function(e){return this._graph$.first().do(function(t){t.uncache(e)})},e.prototype._abortSubjects=function(e){for(var t=0,r=e.slice();t<r.length;t++){var n=r[t];this._removeFromArray(n,e),n.error(new Error("Cache node request was aborted."))}},e.prototype._removeFromArray=function(e,t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)},e.prototype._resetSubscriptions=function(e){for(var t=0,r=e.slice();t<r.length;t++){var n=r[t];this._removeFromArray(n,e),n.closed||n.unsubscribe()}},e}();r.GraphService=o,r.default=o},{"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],333:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._loadnode$=new n.Subject,this._loadstatus$=this._loadnode$.scan(function(e,t){return e[t.key]=t.loadStatus,e},{}).publishReplay(1).refCount(),this._loadstatus$.subscribe(function(){})}return Object.defineProperty(e.prototype,"loadnode$",{get:function(){return this._loadnode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadstatus$",{get:function(){return this._loadstatus$},enumerable:!0,configurable:!0}),e}();r.ImageLoadingService=i},{"rxjs/Subject":34}],334:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("pbf"),i=function(){function e(){}return e.read=function(t){return new n(t).readFields(e._readMeshField,{faces:[],vertices:[]})},e._readMeshField=function(e,t,r){1===e?t.vertices.push(r.readFloat()):2===e&&t.faces.push(r.readVarint())},e}();r.MeshReader=i},{pbf:23}],335:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/map");var n=function(){function e(e){this._cache=null,this._core=e,this._fill=null}return Object.defineProperty(e.prototype,"assetsCached",{get:function(){return null!=this._core&&null!=this._fill&&null!=this._cache&&null!=this._cache.image&&null!=this._cache.mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alt",{get:function(){return this._fill.calt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ca",{get:function(){return null!=this._fill.cca?this._fill.cca:this._fill.ca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"capturedAt",{get:function(){return this._fill.captured_at},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"computedCA",{get:function(){return this._fill.cca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"computedLatLon",{get:function(){return this._core.cl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._fill.cfocal},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"full",{get:function(){return null!=this._fill},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullPano",{get:function(){return null!=this._fill.gpano&&0===this._fill.gpano.CroppedAreaLeftPixels&&0===this._fill.gpano.CroppedAreaTopPixels&&this._fill.gpano.CroppedAreaImageWidthPixels===this._fill.gpano.FullPanoWidthPixels&&this._fill.gpano.CroppedAreaImageHeightPixels===this._fill.gpano.FullPanoHeightPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"gpano",{get:function(){return this._fill.gpano},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._fill.height},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"image",{get:function(){return this._cache.image},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"key",{get:function(){return this._core.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"latLon",{get:function(){return null!=this._core.cl?this._core.cl:this._core.l},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadStatus",{get:function(){return this._cache.loadStatus},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"merged",{get:function(){return null!=this._fill&&null!=this._fill.merge_version&&this._fill.merge_version>0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mergeCC",{get:function(){return this._fill.merge_cc},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mergeVersion",{get:function(){return this._fill.merge_version},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mesh",{get:function(){return this._cache.mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"orientation",{get:function(){return this._fill.orientation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"originalCA",{get:function(){return this._fill.ca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"originalLatLon",{get:function(){return this._core.l},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pano",{get:function(){return null!=this._fill.gpano&&null!=this._fill.gpano.FullPanoWidthPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"projectKey",{get:function(){return null!=this._fill.project?this._fill.project.key:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rotation",{get:function(){return this._fill.c_rotation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scale",{get:function(){return this._fill.atomic_scale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceKey",{get:function(){return this._core.sequence.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges",{get:function(){return this._cache.sequenceEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges$",{get:function(){return this._cache.sequenceEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges",{get:function(){return this._cache.spatialEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges$",{get:function(){return this._cache.spatialEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"userKey",{get:function(){return this._fill.user.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"username",{get:function(){return this._fill.user.username},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this._fill.width},enumerable:!0,configurable:!0}),e.prototype.cacheAssets$=function(){var e=this;return this._cache.cacheAssets$(this.key,this.pano,this.merged).map(function(t){return e})},e.prototype.cacheImage$=function(e){var t=this;return this._cache.cacheImage$(this.key,e).map(function(e){return t})},e.prototype.cacheSequenceEdges=function(e){this._cache.cacheSequenceEdges(e)},e.prototype.cacheSpatialEdges=function(e){this._cache.cacheSpatialEdges(e)},e.prototype.dispose=function(){null!=this._cache&&(this._cache.dispose(),this._cache=null),this._core=null,this._fill=null},e.prototype.initializeCache=function(e){if(null!=this._cache)throw new Error("Node cache already initialized ("+this.key+").");this._cache=e},e.prototype.makeFull=function(e){if(null==e)throw new Error("Fill can not be null.");this._fill=e},e.prototype.resetSequenceEdges=function(){this._cache.resetSequenceEdges()},e.prototype.resetSpatialEdges=function(){this._cache.resetSpatialEdges()},e.prototype.uncache=function(){null!=this._cache&&(this._cache.dispose(),this._cache=null)},e}();r.Node=n,r.default=n},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],336:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/publishReplay");var o=e("../Graph"),a=e("../Utils"),s=function(){function e(){this._disposed=!1,this._image=null,this._loadStatus={loaded:0,total:0},this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$=new n.Subject,this._sequenceEdges$=this._sequenceEdgesChanged$.startWith(this._sequenceEdges).publishReplay(1).refCount(),this._sequenceEdgesSubscription=this._sequenceEdges$.subscribe(function(){}),this._spatialEdgesChanged$=new n.Subject,this._spatialEdges$=this._spatialEdgesChanged$.startWith(this._spatialEdges).publishReplay(1).refCount(),this._spatialEdgesSubscription=this._spatialEdges$.subscribe(function(){}),this._cachingAssets$=null}return Object.defineProperty(e.prototype,"image",{get:function(){return this._image},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadStatus",{get:function(){return this._loadStatus},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mesh",{get:function(){return this._mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges",{get:function(){return this._sequenceEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges$",{get:function(){return this._sequenceEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges",{get:function(){return this._spatialEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges$",{get:function(){return this._spatialEdges$},enumerable:!0,configurable:!0}),e.prototype.cacheAssets$=function(e,t,r){var n=this;if(null!=this._cachingAssets$)return this._cachingAssets$;var o=t?a.Settings.basePanoramaSize:a.Settings.baseImageSize;return this._cachingAssets$=i.Observable.combineLatest(this._cacheImage$(e,o),this._cacheMesh$(e,r),function(e,t){return n._loadStatus.loaded=0,n._loadStatus.total=0,t&&(n._mesh=t.object,n._loadStatus.loaded+=t.loaded.loaded,n._loadStatus.total+=t.loaded.total),e&&(n._image=e.object,n._loadStatus.loaded+=e.loaded.loaded,n._loadStatus.total+=e.loaded.total),n}).finally(function(){n._cachingAssets$=null}).publishReplay(1).refCount(),this._cachingAssets$},e.prototype.cacheImage$=function(e,t){var r=this;return null!=this._image&&t<=Math.max(this._image.width,this._image.height)?i.Observable.of(this):this._cacheImage$(e,t).first(function(e){return null!=e.object}).do(function(e){r._disposeImage(),r._image=e.object}).map(function(e){return r})},e.prototype.cacheSequenceEdges=function(e){this._sequenceEdges={cached:!0,edges:e},this._sequenceEdgesChanged$.next(this._sequenceEdges)},e.prototype.cacheSpatialEdges=function(e){this._spatialEdges={cached:!0,edges:e},this._spatialEdgesChanged$.next(this._spatialEdges)},e.prototype.dispose=function(){this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._disposeImage(),this._mesh=null,this._loadStatus.loaded=0,this._loadStatus.total=0,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges),this._spatialEdgesChanged$.next(this._spatialEdges),this._disposed=!0,null!=this._imageRequest&&this._imageRequest.abort(),null!=this._meshRequest&&this._meshRequest.abort()},e.prototype.resetSequenceEdges=function(){this._sequenceEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges)},e.prototype.resetSpatialEdges=function(){this._spatialEdges={cached:!1,edges:[]},this._spatialEdgesChanged$.next(this._spatialEdges)},e.prototype._cacheImage$=function(e,t){var r=this;return i.Observable.create(function(n){var i=new XMLHttpRequest;i.open("GET",a.Urls.thumbnail(e,t),!0),i.responseType="arraybuffer",i.timeout=15e3,i.onload=function(t){if(200!==i.status)return r._imageRequest=null,void n.error(new Error("Failed to fetch image ("+e+"). Status: "+i.status+", "+i.statusText));var o=new Image;o.crossOrigin="Anonymous",o.onload=function(i){if(r._imageRequest=null,r._disposed)return window.URL.revokeObjectURL(o.src),void n.error(new Error("Image load was aborted ("+e+")"));n.next({loaded:{loaded:t.loaded,total:t.total},object:o}),n.complete()},o.onerror=function(t){r._imageRequest=null,n.error(new Error("Failed to load image ("+e+")"))};var a=new Blob([i.response]);o.src=window.URL.createObjectURL(a)},i.onprogress=function(e){r._disposed||n.next({loaded:{loaded:e.loaded,total:e.total},object:null})},i.onerror=function(t){r._imageRequest=null,n.error(new Error("Failed to fetch image ("+e+")"))},i.ontimeout=function(t){r._imageRequest=null,n.error(new Error("Image request timed out ("+e+")"))},i.onabort=function(t){r._imageRequest=null,n.error(new Error("Image request was aborted ("+e+")"))},r._imageRequest=i,i.send(null)})},e.prototype._cacheMesh$=function(e,r){var n=this;return i.Observable.create(function(i){if(!r)return i.next(n._createEmptyMeshLoadStatus()),void i.complete();var s=new XMLHttpRequest;s.open("GET",a.Urls.protoMesh(e),!0),s.responseType="arraybuffer",s.timeout=15e3,s.onload=function(e){if(n._meshRequest=null,!n._disposed){var r=200===s.status?o.MeshReader.read(new t(s.response)):{faces:[],vertices:[]};i.next({loaded:{loaded:e.loaded,total:e.total},object:r}),i.complete()}},s.onprogress=function(e){n._disposed||i.next({loaded:{loaded:e.loaded,total:e.total},object:null})},s.onerror=function(t){n._meshRequest=null,console.error("Failed to cache mesh ("+e+")"),i.next(n._createEmptyMeshLoadStatus()),i.complete()},s.ontimeout=function(t){n._meshRequest=null,console.error("Mesh request timed out ("+e+")"),i.next(n._createEmptyMeshLoadStatus()),i.complete()},s.onabort=function(t){n._meshRequest=null,i.error(new Error("Mesh request was aborted ("+e+")"))},n._meshRequest=s,s.send(null)})},e.prototype._createEmptyMeshLoadStatus=function(){return{loaded:{loaded:0,total:0},object:{faces:[],vertices:[]}}},e.prototype._disposeImage=function(){null!=this._image&&window.URL.revokeObjectURL(this._image.src),this._image=null},e}();r.NodeCache=s,r.default=s}).call(this,e("buffer").Buffer)},{"../Graph":234,"../Utils":240,buffer:7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],337:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=function(){function e(e){this._key=e.key,this._keys=e.keys}return Object.defineProperty(e.prototype,"key",{get:function(){return this._key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"keys",{get:function(){return this._keys},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._key=null,this._keys=null},e.prototype.findNextKey=function(e){var t=n.indexOf(this._keys,e);return t+1>=this._keys.length||-1===t?null:this._keys[t+1]},e.prototype.findPrevKey=function(e){var t=n.indexOf(this._keys,e);return 0===t||-1===t?null:this._keys[t-1]},e}();r.Sequence=i,r.default=i},{underscore:182}],338:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../../Edge"),o=e("../../Error"),a=e("../../Geo"),s=function(){function e(e,t,r){this._spatial=new a.Spatial,this._geoCoords=new a.GeoCoords,this._settings=null!=e?e:new i.EdgeCalculatorSettings,this._directions=null!=t?t:new i.EdgeCalculatorDirections,this._coefficients=null!=r?r:new i.EdgeCalculatorCoefficients}return e.prototype.getPotentialEdges=function(e,t,r){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(!e.merged)return[];for(var i=this._spatial.viewingDirection(e.rotation),a=this._spatial.angleToPlane(i.toArray(),[0,0,1]),s=[],c=0,u=t;c<u.length;c++){var h=u[c];if(h.merged&&h.key!==e.key){var l=this._geoCoords.geodeticToEnu(h.latLon.lat,h.latLon.lon,h.alt,e.latLon.lat,e.latLon.lon,e.alt),p=new n.Vector3(l[0],l[1],l[2]),f=p.length();if(!(f>this._settings.maxDistance&&r.indexOf(h.key)<0)){var d=this._spatial.angleBetweenVector2(i.x,i.y,p.x,p.y),m=this._spatial.angleToPlane(p.toArray(),[0,0,1]),v=this._spatial.viewingDirection(h.rotation),g=this._spatial.angleBetweenVector2(i.x,i.y,v.x,v.y),y=this._spatial.angleToPlane(v.toArray(),[0,0,1])-a,b=this._spatial.relativeRotationAngle(e.rotation,h.rotation),_=this._spatial.angleBetweenVector2(1,0,p.x,p.y),x=null!=h.sequenceKey&&null!=e.sequenceKey&&h.sequenceKey===e.sequenceKey,w=null==h.mergeCC&&null==e.mergeCC||h.mergeCC===e.mergeCC,S=h.userKey===e.userKey,M={capturedAt:h.capturedAt,croppedPano:h.pano&&!h.fullPano,directionChange:g,distance:f,fullPano:h.fullPano,key:h.key,motionChange:d,rotation:b,sameMergeCC:w,sameSequence:x,sameUser:S,sequenceKey:h.sequenceKey,verticalDirectionChange:y,verticalMotion:m,worldMotionAzimuth:_};s.push(M)}}}return s},e.prototype.computeSequenceEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(e.sequenceKey!==t.key)throw new o.ArgumentMapillaryError("Node and sequence does not correspond.");var r=[],n=t.findNextKey(e.key);null!=n&&r.push({data:{direction:i.EdgeDirection.Next,worldMotionAzimuth:Number.NaN},from:e.key,to:n});var a=t.findPrevKey(e.key);return null!=a&&r.push({data:{direction:i.EdgeDirection.Prev,worldMotionAzimuth:Number.NaN},from:e.key,to:a}),r},e.prototype.computeSimilarEdges=function(e,t){var r=this;if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");for(var n=e.fullPano,a={},s=0,c=t;s<c.length;s++)if(null!=(v=c[s]).sequenceKey&&!v.sameSequence&&v.sameMergeCC){if(n){if(!v.fullPano)continue}else if(!v.fullPano&&Math.abs(v.directionChange)>this._settings.similarMaxDirectionChange)continue;v.distance>this._settings.similarMaxDistance||v.sameUser&&Math.abs(v.capturedAt-e.capturedAt)<this._settings.similarMinTimeDifference||(null==a[v.sequenceKey]&&(a[v.sequenceKey]=[]),a[v.sequenceKey].push(v))}var u=[],h=e.fullPano?function(e){return e.distance}:function(e){return r._coefficients.similarDistance*e.distance+r._coefficients.similarRotation*e.rotation};for(var l in a)if(a.hasOwnProperty(l)){for(var p=Number.MAX_VALUE,f=null,d=0,m=a[l];d<m.length;d++){var v=m[d],g=h(v);g<p&&(p=g,f=v)}null!=f&&u.push(f)}return u.map(function(t){return{data:{direction:i.EdgeDirection.Similar,worldMotionAzimuth:t.worldMotionAzimuth},from:e.key,to:t.key}})},e.prototype.computeStepEdges=function(e,t,r,n){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");var i=[];if(e.pano)return i;for(var a in this._directions.steps)if(this._directions.steps.hasOwnProperty(a)){for(var s=this._directions.steps[a],c=Number.MAX_VALUE,u=null,h=null,l=0,p=t;l<p.length;l++){var f=p[l];if(!f.croppedPano&&!f.fullPano&&!(Math.abs(f.directionChange)>this._settings.stepMaxDirectionChange)){var d=this._spatial.angleDifference(s.motionChange,f.motionChange),m=this._spatial.angleDifference(f.directionChange,d),v=Math.max(Math.abs(d),Math.abs(m));if(!(Math.abs(v)>this._settings.stepMaxDrift)){var g=f.key;if(!s.useFallback||g!==r&&g!==n||(h=f),!(f.distance>this._settings.stepMaxDistance)){d=Math.sqrt(d*d+f.verticalMotion*f.verticalMotion);var y=this._coefficients.stepPreferredDistance*Math.abs(f.distance-this._settings.stepPreferredDistance)/this._settings.stepMaxDistance+this._coefficients.stepMotion*d/this._settings.stepMaxDrift+this._coefficients.stepRotation*f.rotation/this._settings.stepMaxDirectionChange+this._coefficients.stepSequencePenalty*(f.sameSequence?0:1)+this._coefficients.stepMergeCCPenalty*(f.sameMergeCC?0:1);y<c&&(c=y,u=f)}}}}null!=(u=null==u?h:u)&&i.push({data:{direction:s.direction,worldMotionAzimuth:u.worldMotionAzimuth},from:e.key,to:u.key})}return i},e.prototype.computeTurnEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");var r=[];if(e.pano)return r;for(var n in this._directions.turns)if(this._directions.turns.hasOwnProperty(n)){for(var a=this._directions.turns[n],s=Number.MAX_VALUE,c=null,u=0,h=t;u<h.length;u++){var l=h[u];if(!l.croppedPano&&!l.fullPano&&!(l.distance>this._settings.turnMaxDistance)){var p=a.direction!==i.EdgeDirection.TurnU&&l.distance<this._settings.turnMaxRigDistance&&Math.abs(l.directionChange)>this._settings.turnMinRigDirectionChange,f=this._spatial.angleDifference(a.directionChange,l.directionChange),d=void 0;if(p&&l.directionChange*a.directionChange>0&&Math.abs(l.directionChange)<Math.abs(a.directionChange))d=-Math.PI/2+Math.abs(l.directionChange);else{if(Math.abs(f)>this._settings.turnMaxDirectionChange)continue;var m=a.motionChange?this._spatial.angleDifference(a.motionChange,l.motionChange):0;m=Math.sqrt(m*m+l.verticalMotion*l.verticalMotion),d=this._coefficients.turnDistance*l.distance/this._settings.turnMaxDistance+this._coefficients.turnMotion*m/Math.PI+this._coefficients.turnSequencePenalty*(l.sameSequence?0:1)+this._coefficients.turnMergeCCPenalty*(l.sameMergeCC?0:1)}d<s&&(s=d,c=l)}}null!=c&&r.push({data:{direction:a.direction,worldMotionAzimuth:c.worldMotionAzimuth},from:e.key,to:c.key})}return r},e.prototype.computePerspectiveToPanoEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(e.pano)return[];for(var r=Number.MAX_VALUE,n=null,a=0,s=t;a<s.length;a++){var c=s[a];if(c.fullPano){var u=this._coefficients.panoPreferredDistance*Math.abs(c.distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(c.motionChange)/Math.PI+this._coefficients.panoMergeCCPenalty*(c.sameMergeCC?0:1);u<r&&(r=u,n=c)}}return null==n?[]:[{data:{direction:i.EdgeDirection.Pano,worldMotionAzimuth:n.worldMotionAzimuth},from:e.key,to:n.key}]},e.prototype.computePanoEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(!e.fullPano)return[];for(var r=[],n=[],a=[],s=0,c=t;s<c.length;s++)if(!((w=c[s]).distance>this._settings.panoMaxDistance))if(w.fullPano){if(w.distance<this._settings.panoMinDistance)continue;n.push(w)}else{if(w.croppedPano)continue;for(var u in this._directions.panos)if(this._directions.panos.hasOwnProperty(u)){var h=this._directions.panos[u],l=this._spatial.angleDifference(w.directionChange,w.motionChange),p=this._spatial.angleDifference(h.directionChange,l);if(!(Math.abs(p)>this._settings.panoMaxStepTurnChange)){a.push([h.direction,w]);break}}}for(var f=Math.PI/this._settings.panoMaxItems,d=[],m=[],v=0;v<this._settings.panoMaxItems;v++){for(var g=v/this._settings.panoMaxItems*2*Math.PI,y=Number.MAX_VALUE,b=null,_=0,x=n;_<x.length;_++){var w=x[_],S=this._spatial.angleDifference(g,w.motionChange);if(!(Math.abs(S)>f)){for(var M=Number.MAX_VALUE,E=0,C=d;E<C.length;E++){var T=C[E],O=Math.abs(this._spatial.angleDifference(T,w.motionChange));O<M&&(M=O)}M<=f||(z=this._coefficients.panoPreferredDistance*Math.abs(w.distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(S)/f+this._coefficients.panoSequencePenalty*(w.sameSequence?0:1)+this._coefficients.panoMergeCCPenalty*(w.sameMergeCC?0:1))<y&&(y=z,b=w)}}null!=b?(d.push(b.motionChange),r.push({data:{direction:i.EdgeDirection.Pano,worldMotionAzimuth:b.worldMotionAzimuth},from:e.key,to:b.key})):m.push(g)}var P={};P[i.EdgeDirection.Pano]=d,P[i.EdgeDirection.StepForward]=[],P[i.EdgeDirection.StepLeft]=[],P[i.EdgeDirection.StepBackward]=[],P[i.EdgeDirection.StepRight]=[];for(var j=0,A=m;j<A.length;j++){var R=A[j],L=[];for(var u in this._directions.panos)if(this._directions.panos.hasOwnProperty(u)){for(var h=this._directions.panos[u],N=P[i.EdgeDirection.Pano].concat(P[h.direction]).concat(P[h.prev]).concat(P[h.next]),y=Number.MAX_VALUE,b=null,I=0,D=a;I<D.length;I++)if((w=D[I])[0]===h.direction){var k=this._spatial.angleDifference(R,w[1].motionChange);if(!(Math.abs(k)>f)){for(var B=Number.MAX_VALUE,F=0,U=N;F<U.length;F++){T=U[F];(M=Math.abs(this._spatial.angleDifference(T,w[1].motionChange)))<B&&(B=M)}if(!(B<=f)){var z=this._coefficients.panoPreferredDistance*Math.abs(w[1].distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(k)/f+this._coefficients.panoMergeCCPenalty*(w[1].sameMergeCC?0:1);z<y&&(y=z,b=w)}}}null!=b&&(L.push(b),r.push({data:{direction:b[0],worldMotionAzimuth:b[1].worldMotionAzimuth},from:e.key,to:b[1].key}))}for(var $=0,V=L;$<V.length;$++){var G=V[$];P[G[0]].push(G[1].motionChange)}}return r},e}();r.EdgeCalculator=s,r.default=s},{"../../Edge":231,"../../Error":232,"../../Geo":233,three:180}],339:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(){this.panoPreferredDistance=2,this.panoMotion=2,this.panoSequencePenalty=1,this.panoMergeCCPenalty=4,this.stepPreferredDistance=4,this.stepMotion=3,this.stepRotation=4,this.stepSequencePenalty=2,this.stepMergeCCPenalty=6,this.similarDistance=2,this.similarRotation=3,this.turnDistance=4,this.turnMotion=2,this.turnSequencePenalty=1,this.turnMergeCCPenalty=4}}();r.EdgeCalculatorCoefficients=n,r.default=n},{}],340:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Edge"),i=function(){return function(){this.steps={},this.turns={},this.panos={},this.steps[n.EdgeDirection.StepForward]={direction:n.EdgeDirection.StepForward,motionChange:0,useFallback:!0},this.steps[n.EdgeDirection.StepBackward]={direction:n.EdgeDirection.StepBackward,motionChange:Math.PI,useFallback:!0},this.steps[n.EdgeDirection.StepLeft]={direction:n.EdgeDirection.StepLeft,motionChange:Math.PI/2,useFallback:!1},this.steps[n.EdgeDirection.StepRight]={direction:n.EdgeDirection.StepRight,motionChange:-Math.PI/2,useFallback:!1},this.turns[n.EdgeDirection.TurnLeft]={direction:n.EdgeDirection.TurnLeft,directionChange:Math.PI/2,motionChange:Math.PI/4},this.turns[n.EdgeDirection.TurnRight]={direction:n.EdgeDirection.TurnRight,directionChange:-Math.PI/2,motionChange:-Math.PI/4},this.turns[n.EdgeDirection.TurnU]={direction:n.EdgeDirection.TurnU,directionChange:Math.PI,motionChange:null},this.panos[n.EdgeDirection.StepForward]={direction:n.EdgeDirection.StepForward,directionChange:0,next:n.EdgeDirection.StepLeft,prev:n.EdgeDirection.StepRight},this.panos[n.EdgeDirection.StepBackward]={direction:n.EdgeDirection.StepBackward,directionChange:Math.PI,next:n.EdgeDirection.StepRight,prev:n.EdgeDirection.StepLeft},this.panos[n.EdgeDirection.StepLeft]={direction:n.EdgeDirection.StepLeft,directionChange:Math.PI/2,next:n.EdgeDirection.StepBackward,prev:n.EdgeDirection.StepForward},this.panos[n.EdgeDirection.StepRight]={direction:n.EdgeDirection.StepRight,directionChange:-Math.PI/2,next:n.EdgeDirection.StepForward,prev:n.EdgeDirection.StepBackward}}}();r.EdgeCalculatorDirections=i},{"../../Edge":231}],341:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this.panoMinDistance=.1,this.panoMaxDistance=20,this.panoPreferredDistance=5,this.panoMaxItems=4,this.panoMaxStepTurnChange=Math.PI/8,this.rotationMaxDistance=this.turnMaxRigDistance,this.rotationMaxDirectionChange=Math.PI/6,this.rotationMaxVerticalDirectionChange=Math.PI/8,this.similarMaxDirectionChange=Math.PI/8,this.similarMaxDistance=12,this.similarMinTimeDifference=432e5,this.stepMaxDistance=20,this.stepMaxDirectionChange=Math.PI/6,this.stepMaxDrift=Math.PI/6,this.stepPreferredDistance=4,this.turnMaxDistance=15,this.turnMaxDirectionChange=2*Math.PI/9,this.turnMaxRigDistance=.65,this.turnMinRigDirectionChange=Math.PI/6}return Object.defineProperty(e.prototype,"maxDistance",{get:function(){return Math.max(this.panoMaxDistance,this.similarMaxDistance,this.stepMaxDistance,this.turnMaxDistance)},enumerable:!0,configurable:!0}),e}();r.EdgeCalculatorSettings=n,r.default=n},{}],342:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Next=0]="Next",e[e.Prev=1]="Prev",e[e.StepLeft=2]="StepLeft",e[e.StepRight=3]="StepRight",e[e.StepForward=4]="StepForward",e[e.StepBackward=5]="StepBackward",e[e.TurnLeft=6]="TurnLeft",e[e.TurnRight=7]="TurnRight",e[e.TurnU=8]="TurnU",e[e.Pano=9]="Pano",e[e.Similar=10]="Similar"}(r.EdgeDirection||(r.EdgeDirection={}))},{}],343:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("virtual-dom"),o=e("rxjs/Subject");e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pluck"),e("rxjs/add/operator/scan");var a=e("../Render"),s=function(){function e(e,t,r){this._adaptiveOperation$=new o.Subject,this._render$=new o.Subject,this._renderAdaptive$=new o.Subject,this._renderService=t,this._currentFrame$=r;var s=i.create(i.h("div.domRenderer",[]));e.appendChild(s),this._offset$=this._adaptiveOperation$.scan(function(e,t){return t(e)},{elementHeight:e.offsetHeight,elementWidth:e.offsetWidth,imageAspect:0,renderMode:a.RenderMode.Fill}).filter(function(e){return e.imageAspect>0&&e.elementWidth>0&&e.elementHeight>0}).map(function(e){var t=e.elementWidth/e.elementHeight,r=e.imageAspect/t,n=0,i=0;return e.renderMode===a.RenderMode.Letterbox?e.imageAspect>t?n=e.elementHeight*(1-1/r)/2:i=e.elementWidth*(1-r)/2:e.imageAspect>t?i=-e.elementWidth*(r-1)/2:n=-e.elementHeight*(1/r-1)/2,{bottom:n,left:i,right:i,top:n}}),this._currentFrame$.filter(function(e){return null!=e.state.currentNode}).distinctUntilChanged(function(e,t){return e===t},function(e){return e.state.currentNode.key}).map(function(e){return e.state.currentTransform.basicAspect}).map(function(e){return function(t){return t.imageAspect=e,t}}).subscribe(this._adaptiveOperation$),this._renderAdaptive$.scan(function(e,t){return null==t.vnode?delete e[t.name]:e[t.name]=t.vnode,e},{}).combineLatest(this._offset$).map(function(e){var t=n.values(e[0]),r=e[1],o={style:{bottom:r.bottom+"px",left:r.left+"px","pointer-events":"none",position:"absolute",right:r.right+"px",top:r.top+"px"}};return{name:"adaptiveDomRenderer",vnode:i.h("div.adaptiveDomRenderer",o,t)}}).subscribe(this._render$),this._vNode$=this._render$.scan(function(e,t){return null==t.vnode?delete e[t.name]:e[t.name]=t.vnode,e},{}).map(function(e){var t=n.values(e);return i.h("div.domRenderer",t)}),this._vPatch$=this._vNode$.scan(function(e,t){return e.vpatch=i.diff(e.vnode,t),e.vnode=t,e},{vnode:i.h("div.domRenderer",[]),vpatch:null}).pluck("vpatch"),this._element$=this._vPatch$.scan(function(e,t){return i.patch(e,t)},s).publishReplay(1).refCount(),this._element$.subscribe(function(){}),this._renderService.size$.map(function(e){return function(t){return t.elementWidth=e.width,t.elementHeight=e.height,t}}).subscribe(this._adaptiveOperation$),this._renderService.renderMode$.map(function(e){return function(t){return t.renderMode=e,t}}).subscribe(this._adaptiveOperation$)}return Object.defineProperty(e.prototype,"element$",{get:function(){return this._element$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"render$",{get:function(){return this._render$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderAdaptive$",{get:function(){return this._renderAdaptive$},enumerable:!0,configurable:!0}),e.prototype.clear=function(e){this._renderAdaptive$.next({name:e,vnode:null}),this._render$.next({name:e,vnode:null})},e}();r.DOMRenderer=s,r.default=s},{"../Render":236,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":74,underscore:182,"virtual-dom":186}],344:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Background=0]="Background",e[e.Foreground=1]="Foreground"}(n=r.GLRenderStage||(r.GLRenderStage={})),r.default=n},{}],345:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/startWith");var a=e("../Render"),s=e("../Utils"),c=function(){function e(e,t,r){var c=this;this._renderFrame$=new o.Subject,this._renderCameraOperation$=new o.Subject,this._render$=new o.Subject,this._clear$=new o.Subject,this._renderOperation$=new o.Subject,this._rendererOperation$=new o.Subject,this._eraserOperation$=new o.Subject,this._renderService=t,this._dom=r||new s.DOM,this._renderer$=this._rendererOperation$.scan(function(e,t){return t(e)},{needsRender:!1,renderer:null}),this._renderCollection$=this._renderOperation$.scan(function(e,t){return t(e)},{}).share(),this._renderCamera$=this._renderCameraOperation$.scan(function(e,t){return t(e)},{frameId:-1,needsRender:!1,perspective:null}),this._eraser$=this._eraserOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},{needsRender:!1}),i.Observable.combineLatest([this._renderer$,this._renderCollection$,this._renderCamera$,this._eraser$],function(e,t,r,n){return{camera:r,eraser:n,renderer:e,renders:Object.keys(t).map(function(e){return t[e]})}}).filter(function(e){for(var t=e.renderer.needsRender||e.camera.needsRender||e.eraser.needsRender,r=e.camera.frameId,n=0,i=e.renders;n<i.length;n++){var o=i[n];if(o.frameId!==r)return!1;t=t||o.needsRender}return t}).distinctUntilChanged(function(e,t){return e===t},function(e){return e.eraser.needsRender?-1:e.camera.frameId}).subscribe(function(e){e.renderer.needsRender=!1,e.camera.needsRender=!1,e.eraser.needsRender=!1;for(var t=e.camera.perspective,r=[],n=[],i=0,o=e.renders;i<o.length;i++)(p=o[i]).stage===a.GLRenderStage.Background?r.push(p.render):p.stage===a.GLRenderStage.Foreground&&n.push(p.render);var s=e.renderer.renderer;s.clear();for(var c=0,u=r;c<u.length;c++)(p=u[c])(t,s);s.clearDepth();for(var h=0,l=n;h<l.length;h++){var p=l[h];p(t,s)}}),this._renderFrame$.map(function(e){return function(t){return t.frameId=e.frameId,t.perspective=e.perspective,!0===e.changed&&(t.needsRender=!0),t}}).subscribe(this._renderCameraOperation$),this._renderFrameSubscribe();var u=this._render$.map(function(e){return function(t){return t[e.name]=e.render,t}}),h=this._clear$.map(function(e){return function(t){return delete t[e],t}});i.Observable.merge(u,h).subscribe(this._renderOperation$),this._webGLRenderer$=this._render$.first().map(function(r){var i=c._dom.createElement("canvas","mapillary-js-canvas");i.style.position="absolute",i.setAttribute("tabindex","0"),e.appendChild(i);var o=t.element,a=new n.WebGLRenderer({canvas:i});return a.setPixelRatio(window.devicePixelRatio),a.setSize(o.offsetWidth,o.offsetHeight),a.setClearColor(new n.Color(2105376),1),a.autoClear=!1,a}).publishReplay(1).refCount(),this._webGLRenderer$.subscribe(function(){});var l=this._webGLRenderer$.first().map(function(e){return function(t){return t.needsRender=!0,t.renderer=e,t}}),p=this._renderService.size$.map(function(e){return function(t){return null==t.renderer?t:(t.renderer.setSize(e.width,e.height),t.needsRender=!0,t)}}),f=this._clear$.map(function(e){return function(e){return null==e.renderer?e:(e.needsRender=!0,e)}});i.Observable.merge(l,p,f).subscribe(this._rendererOperation$);var d=this._renderCollection$.filter(function(e){return 0===Object.keys(e).length}).share();d.subscribe(function(e){null!=c._renderFrameSubscription&&(c._renderFrameSubscription.unsubscribe(),c._renderFrameSubscription=null,c._renderFrameSubscribe())}),d.map(function(e){return function(e){return e.needsRender=!0,e}}).subscribe(this._eraserOperation$)}return Object.defineProperty(e.prototype,"render$",{get:function(){return this._render$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"webGLRenderer$",{get:function(){return this._webGLRenderer$},enumerable:!0,configurable:!0}),e.prototype.clear=function(e){this._clear$.next(e)},e.prototype._renderFrameSubscribe=function(){var e=this;this._render$.first().map(function(e){return function(e){return e.needsRender=!0,e}}).subscribe(function(t){e._renderCameraOperation$.next(t)}),this._renderFrameSubscription=this._render$.first().mergeMap(function(t){return e._renderService.renderCameraFrame$}).subscribe(this._renderFrame$)},e}();r.GLRenderer=c,r.default=c},{"../Render":236,"../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/startWith":79,three:180}],346:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../Geo"),o=e("../Render"),a=function(){function e(e,t,r){this.alpha=-1,this.zoom=0,this._frameId=-1,this._changed=!1,this._changedForFrame=-1,this.currentAspect=1,this.currentPano=!1,this.previousAspect=1,this.previousPano=!1,this.renderMode=r,this._spatial=new i.Spatial,this._camera=new i.Camera;var o=this._getPerspectiveCameraAspect(e,t);this._perspective=new n.PerspectiveCamera(50,o,.4,1e4),this._perspective.matrixAutoUpdate=!1,this._rotation={phi:0,theta:0}}return Object.defineProperty(e.prototype,"camera",{get:function(){return this._camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changed",{get:function(){return this.frameId===this._changedForFrame},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},set:function(e){this._frameId=e,this._changed&&(this._changed=!1,this._changedForFrame=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"perspective",{get:function(){return this._perspective},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rotation",{get:function(){return this._rotation},enumerable:!0,configurable:!0}),e.prototype.updateAspect=function(e,t){var r=this._getPerspectiveCameraAspect(e,t);this._perspective.aspect=r,this._changed=!0},e.prototype.updateProjection=function(){var e=this._getAspect(this.currentAspect,this.currentPano,this.perspective.aspect),t=this._getAspect(this.previousAspect,this.previousPano,this.perspective.aspect),r=(1-this.alpha)*t+this.alpha*e,n=this._getVerticalFov(r,this._camera.focal,this.zoom);this._perspective.fov=n,this._perspective.updateProjectionMatrix(),this._changed=!0},e.prototype.updatePerspective=function(e){this._perspective.up.copy(e.up),this._perspective.position.copy(e.position),this._perspective.lookAt(e.lookat),this._perspective.updateMatrix(),this._perspective.updateMatrixWorld(!1),this._changed=!0},e.prototype.updateRotation=function(e){this._rotation=this._getRotation(e)},e.prototype._getVerticalFov=function(e,t,r){return 2*Math.atan(.5/(Math.pow(2,r)*e*t))*180/Math.PI},e.prototype._getAspect=function(e,t,r){if(t)return 1;var n=Math.max(1,1/e);return(this.renderMode===o.RenderMode.Letterbox?e>r:e<r)?n*r:n*e},e.prototype._getPerspectiveCameraAspect=function(e,t){return 0===e?0:e/t},e.prototype._getRotation=function(e){var t=e.lookat.clone().sub(e.position),r=e.up.clone(),n=t.clone().dot(r),i=t.clone().sub(r.clone().multiplyScalar(n));return{phi:Math.atan2(i.y,i.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}},e}();r.RenderCamera=a,r.default=a},{"../Geo":233,"../Render":236,three:180}],347:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Letterbox=0]="Letterbox",e[e.Fill=1]="Fill"}(n=r.RenderMode||(r.RenderMode={})),r.default=n},{}],348:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("rxjs/BehaviorSubject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/withLatestFrom");var o=e("../Geo"),a=e("../Render"),s=function(){function e(e,t,r){var s=this;this._element=e,this._currentFrame$=t,this._spatial=new o.Spatial,r=null!=r?r:a.RenderMode.Fill,this._resize$=new n.Subject,this._renderCameraOperation$=new n.Subject,this._size$=new i.BehaviorSubject({height:this._element.offsetHeight,width:this._element.offsetWidth}),this._resize$.map(function(){return{height:s._element.offsetHeight,width:s._element.offsetWidth}}).subscribe(this._size$),this._renderMode$=new i.BehaviorSubject(r),this._renderCameraHolder$=this._renderCameraOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},new a.RenderCamera(this._element.offsetWidth,this._element.offsetHeight,r)).publishReplay(1).refCount(),this._renderCameraFrame$=this._currentFrame$.withLatestFrom(this._renderCameraHolder$,function(e,t){return[e,t]}).do(function(e){var t=e[0],r=e[1],n=t.state.camera;if(r.alpha!==t.state.alpha||r.zoom!==t.state.zoom||r.camera.diff(n)>1e-9){var i=t.state.currentTransform,o=null!=t.state.previousTransform?t.state.previousTransform:t.state.currentTransform,a=null!=t.state.previousNode?t.state.previousNode:t.state.currentNode;r.currentAspect=i.basicAspect,r.currentPano=t.state.currentNode.pano,r.previousAspect=o.basicAspect,r.previousPano=a.pano,r.alpha=t.state.alpha,r.zoom=t.state.zoom,r.camera.copy(n),r.updatePerspective(n),r.updateRotation(n),r.updateProjection()}r.frameId=t.id}).map(function(e){return e[1]}).publishReplay(1).refCount(),this._renderCamera$=this._renderCameraFrame$.filter(function(e){return e.changed}).publishReplay(1).refCount(),this._bearing$=this._renderCamera$.map(function(e){var t=s._spatial.radToDeg(s._spatial.azimuthalToBearing(e.rotation.phi));return s._spatial.wrap(t,0,360)}).publishReplay(1).refCount(),this._size$.skip(1).map(function(e){return function(t){return t.updateAspect(e.width,e.height),t.updateProjection(),t}}).subscribe(this._renderCameraOperation$),this._renderMode$.skip(1).map(function(e){return function(t){return t.renderMode=e,t.updateProjection(),t}}).subscribe(this._renderCameraOperation$),this._bearing$.subscribe(function(){}),this._renderCameraHolder$.subscribe(function(){}),this._size$.subscribe(function(){}),this._renderMode$.subscribe(function(){}),this._renderCamera$.subscribe(function(){}),this._renderCameraFrame$.subscribe(function(){})}return Object.defineProperty(e.prototype,"bearing$",{get:function(){return this._bearing$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"element",{get:function(){return this._element},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"resize$",{get:function(){return this._resize$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size$",{get:function(){return this._size$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderMode$",{get:function(){return this._renderMode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderCameraFrame$",{get:function(){return this._renderCameraFrame$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderCamera$",{get:function(){return this._renderCamera$},enumerable:!0,configurable:!0}),e}();r.RenderService=s,r.default=s},{"../Geo":233,"../Render":236,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/skip":76,"rxjs/add/operator/startWith":79,"rxjs/add/operator/withLatestFrom":85}],349:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Traversing=0]="Traversing",e[e.Waiting=1]="Waiting"}(n=r.State||(r.State={})),r.default=n},{}],350:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../State"),i=e("../Geo"),o=function(){function e(){this._state=new n.TraversingState({alpha:1,camera:new i.Camera,currentIndex:-1,reference:{alt:0,lat:0,lon:0},trajectory:[],zoom:0})}return e.prototype.traverse=function(){this._state=this._state.traverse()},e.prototype.wait=function(){this._state=this._state.wait()},Object.defineProperty(e.prototype,"state",{get:function(){if(this._state instanceof n.TraversingState)return n.State.Traversing;if(this._state instanceof n.WaitingState)return n.State.Waiting;throw new Error("Invalid state")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"reference",{get:function(){return this._state.reference},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alpha",{get:function(){return this._state.alpha},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"camera",{get:function(){return this._state.camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"zoom",{get:function(){return this._state.zoom},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode",{get:function(){return this._state.currentNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousNode",{get:function(){return this._state.previousNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera",{get:function(){return this._state.currentCamera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform",{get:function(){return this._state.currentTransform},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousTransform",{get:function(){return this._state.previousTransform},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"trajectory",{get:function(){return this._state.trajectory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentIndex",{get:function(){return this._state.currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"lastNode",{get:function(){return this._state.trajectory[this._state.trajectory.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nodesAhead",{get:function(){return this._state.trajectory.length-1-this._state.currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"motionless",{get:function(){return this._state.motionless},enumerable:!0,configurable:!0}),e.prototype.getCenter=function(){return this._state.getCenter()},e.prototype.setCenter=function(e){this._state.setCenter(e)},e.prototype.setZoom=function(e){this._state.setZoom(e)},e.prototype.update=function(e){this._state.update(e)},e.prototype.append=function(e){this._state.append(e)},e.prototype.prepend=function(e){this._state.prepend(e)},e.prototype.remove=function(e){this._state.remove(e)},e.prototype.clear=function(){this._state.clear()},e.prototype.clearPrior=function(){this._state.clearPrior()},e.prototype.cut=function(){this._state.cut()},e.prototype.set=function(e){this._state.set(e)},e.prototype.rotate=function(e){this._state.rotate(e)},e.prototype.rotateBasic=function(e){this._state.rotateBasic(e)},e.prototype.rotateBasicUnbounded=function(e){this._state.rotateBasicUnbounded(e)},e.prototype.rotateBasicWithoutInertia=function(e){this._state.rotateBasicWithoutInertia(e)},e.prototype.rotateToBasic=function(e){this._state.rotateToBasic(e)},e.prototype.move=function(e){this._state.move(e)},e.prototype.moveTo=function(e){this._state.moveTo(e)},e.prototype.zoomIn=function(e,t){this._state.zoomIn(e,t)},e}();r.StateContext=o},{"../Geo":233,"../State":237}],351:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Subject"),o=e("rxjs/util/AnimationFrame");e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pairwise"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var a=e("../State"),s=function(){function e(){var e=this;this._appendNode$=new i.Subject,this._start$=new i.Subject,this._frame$=new i.Subject,this._fpsSampleRate=30,this._contextOperation$=new n.BehaviorSubject(function(e){return e}),this._context$=this._contextOperation$.scan(function(e,t){return t(e)},new a.StateContext).publishReplay(1).refCount(),this._state$=this._context$.map(function(e){return e.state}).distinctUntilChanged().publishReplay(1).refCount(),this._fps$=this._start$.switchMap(function(){return e._frame$.bufferCount(1,e._fpsSampleRate).map(function(e){return(new Date).getTime()}).pairwise().map(function(t){return Math.max(20,1e3*e._fpsSampleRate/(t[1]-t[0]))}).startWith(60)}).share(),this._currentState$=this._frame$.withLatestFrom(this._fps$,this._context$,function(e,t,r){return[e,t,r]}).filter(function(e){return null!=e[2].currentNode}).do(function(e){e[2].update(e[1])}).map(function(e){return{fps:e[1],id:e[0],state:e[2]}}).share(),this._lastState$=this._currentState$.publishReplay(1).refCount();var t=this._currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).publishReplay(1).refCount(),r=new i.Subject;t.subscribe(r),this._currentKey$=new n.BehaviorSubject(null),r.map(function(e){return e.state.currentNode.key}).subscribe(this._currentKey$),this._currentNode$=r.map(function(e){return e.state.currentNode}).publishReplay(1).refCount(),this._currentCamera$=r.map(function(e){return e.state.currentCamera}).publishReplay(1).refCount(),this._currentTransform$=r.map(function(e){return e.state.currentTransform}).publishReplay(1).refCount(),this._reference$=r.map(function(e){return e.state.reference}).distinctUntilChanged(function(e,t){return e.lat===t.lat&&e.lon===t.lon},function(e){return{lat:e.lat,lon:e.lon}}).publishReplay(1).refCount(),this._currentNodeExternal$=t.map(function(e){return e.state.currentNode}).publishReplay(1).refCount(),this._appendNode$.map(function(e){return function(t){return t.append([e]),t}}).subscribe(this._contextOperation$),this._inMotionOperation$=new i.Subject,t.map(function(e){return!0}).subscribe(this._inMotionOperation$),this._inMotionOperation$.distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._currentState$.filter(function(e){return 0===e.state.nodesAhead}).map(function(e){return[e.state.camera.clone(),e.state.zoom]}).pairwise().map(function(e){var t=e[0][0],r=e[1][0],n=e[0][1],i=e[1][1];return t.diff(r)>1e-5||Math.abs(n-i)>1e-5}).first(function(e){return!e})}).subscribe(this._inMotionOperation$),this._inMotion$=this._inMotionOperation$.distinctUntilChanged().publishReplay(1).refCount(),this._inTranslationOperation$=new i.Subject,t.map(function(e){return!0}).subscribe(this._inTranslationOperation$),this._inTranslationOperation$.distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._currentState$.filter(function(e){return 0===e.state.nodesAhead}).map(function(e){return e.state.camera.position.clone()}).pairwise().map(function(e){return 0!==e[0].distanceToSquared(e[1])}).first(function(e){return!e})}).subscribe(this._inTranslationOperation$),this._inTranslation$=this._inTranslationOperation$.distinctUntilChanged().publishReplay(1).refCount(),this._state$.subscribe(function(){}),this._currentNode$.subscribe(function(){}),this._currentCamera$.subscribe(function(){}),this._currentTransform$.subscribe(function(){}),this._reference$.subscribe(function(){}),this._currentNodeExternal$.subscribe(function(){}),this._lastState$.subscribe(function(){}),this._inMotion$.subscribe(function(){}),this._inTranslation$.subscribe(function(){}),this._frameId=null,this._frameGenerator=new o.RequestAnimationFrameDefinition(window)}return Object.defineProperty(e.prototype,"currentState$",{get:function(){return this._currentState$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode$",{get:function(){return this._currentNode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentKey$",{get:function(){return this._currentKey$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNodeExternal$",{get:function(){return this._currentNodeExternal$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera$",{get:function(){return this._currentCamera$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform$",{get:function(){return this._currentTransform$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state$",{get:function(){return this._state$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"reference$",{get:function(){return this._reference$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inMotion$",{get:function(){return this._inMotion$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inTranslation$",{get:function(){return this._inTranslation$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"appendNode$",{get:function(){return this._appendNode$},enumerable:!0,configurable:!0}),e.prototype.traverse=function(){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(e){e.traverse()})},e.prototype.wait=function(){this._invokeContextOperation(function(e){e.wait()})},e.prototype.appendNodes=function(e){this._invokeContextOperation(function(t){t.append(e)})},e.prototype.prependNodes=function(e){this._invokeContextOperation(function(t){t.prepend(e)})},e.prototype.removeNodes=function(e){this._invokeContextOperation(function(t){t.remove(e)})},e.prototype.clearNodes=function(){this._invokeContextOperation(function(e){e.clear()})},e.prototype.clearPriorNodes=function(){this._invokeContextOperation(function(e){e.clearPrior()})},e.prototype.cutNodes=function(){this._invokeContextOperation(function(e){e.cut()})},e.prototype.setNodes=function(e){this._invokeContextOperation(function(t){t.set(e)})},e.prototype.rotate=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotate(e)})},e.prototype.rotateBasic=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasic(e)})},e.prototype.rotateBasicUnbounded=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasicUnbounded(e)})},e.prototype.rotateBasicWithoutInertia=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasicWithoutInertia(e)})},e.prototype.rotateToBasic=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateToBasic(e)})},e.prototype.move=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.move(e)})},e.prototype.moveTo=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.moveTo(e)})},e.prototype.zoomIn=function(e,t){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(r){r.zoomIn(e,t)})},e.prototype.getCenter=function(){return this._lastState$.first().map(function(e){return e.state.getCenter()})},e.prototype.getZoom=function(){return this._lastState$.first().map(function(e){return e.state.zoom})},e.prototype.setCenter=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.setCenter(e)})},e.prototype.setZoom=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.setZoom(e)})},e.prototype.start=function(){null==this._frameId&&(this._start$.next(null),this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId))},e.prototype.stop=function(){null!=this._frameId&&(this._frameGenerator.cancelAnimationFrame(this._frameId),this._frameId=null)},e.prototype._invokeContextOperation=function(e){this._contextOperation$.next(function(t){return e(t),t})},e.prototype._frame=function(e){this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId)},e}();r.StateService=s},{"../State":237,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/util/AnimationFrame":161}],352:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Error"),i=e("../../Geo"),o=function(){function e(e){this._spatial=new i.Spatial,this._geoCoords=new i.GeoCoords,this._referenceThreshold=.01,this._reference=e.reference,this._alpha=e.alpha,this._camera=e.camera.clone(),this._zoom=e.zoom,this._currentIndex=e.currentIndex,this._trajectory=e.trajectory.slice(),this._trajectoryTransforms=[],this._trajectoryCameras=[];for(var t=0,r=this._trajectory;t<r.length;t++){var n=r[t],o=this._nodeToTranslation(n),a=new i.Transform(n,n.image,o);this._trajectoryTransforms.push(a),this._trajectoryCameras.push(new i.Camera(a))}this._currentNode=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousNode=this._trajectory.length>1&&this.currentIndex>0?this._trajectory[this._currentIndex-1]:null,this._currentCamera=this._trajectoryCameras.length>0?this._trajectoryCameras[this._currentIndex].clone():new i.Camera,this._previousCamera=this._trajectoryCameras.length>1&&this.currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}return Object.defineProperty(e.prototype,"reference",{get:function(){return this._reference},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alpha",{get:function(){return this._getAlpha()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"camera",{get:function(){return this._camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"zoom",{get:function(){return this._zoom},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"trajectory",{get:function(){return this._trajectory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentIndex",{get:function(){return this._currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode",{get:function(){return this._currentNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousNode",{get:function(){return this._previousNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera",{get:function(){return this._currentCamera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform",{get:function(){return this._trajectoryTransforms.length>0?this._trajectoryTransforms[this.currentIndex]:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousTransform",{get:function(){return this._trajectoryTransforms.length>1&&this.currentIndex>0?this._trajectoryTransforms[this.currentIndex-1]:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"motionless",{get:function(){return this._motionless},enumerable:!0,configurable:!0}),e.prototype.append=function(e){if(e.length<1)throw Error("Trajectory can not be empty");this._currentIndex<0?this.set(e):(this._trajectory=this._trajectory.concat(e),this._appendToTrajectories(e))},e.prototype.prepend=function(e){if(e.length<1)throw Error("Trajectory can not be empty");this._trajectory=e.slice().concat(this._trajectory),this._currentIndex+=e.length,this._setCurrentNode(),this._setReference(this._currentNode)?this._setTrajectories():this._prependToTrajectories(e),this._setCurrentCamera()},e.prototype.remove=function(e){if(e<0)throw Error("n must be a positive integer");if(this._currentIndex-1<e)throw Error("Current and previous nodes can not be removed");for(var t=0;t<e;t++)this._trajectory.shift(),this._trajectoryTransforms.shift(),this._trajectoryCameras.shift(),this._currentIndex--;this._setCurrentNode()},e.prototype.clearPrior=function(){this._currentIndex>0&&this.remove(this._currentIndex-1)},e.prototype.clear=function(){this.cut(),this._currentIndex>0&&this.remove(this._currentIndex-1)},e.prototype.cut=function(){for(;this._trajectory.length-1>this._currentIndex;)this._trajectory.pop(),this._trajectoryTransforms.pop(),this._trajectoryCameras.pop()},e.prototype.set=function(e){this._setTrajectory(e),this._setCurrentNode(),this._setReference(this._currentNode),this._setTrajectories(),this._setCurrentCamera()},e.prototype.getCenter=function(){return null!=this._currentNode?this.currentTransform.projectBasic(this._camera.lookat.toArray()):[.5,.5]},e.prototype._setCurrent=function(){this._setCurrentNode(),this._setReference(this._currentNode)&&this._setTrajectories(),this._setCurrentCamera()},e.prototype._setCurrentCamera=function(){this._currentCamera=this._trajectoryCameras[this._currentIndex].clone(),this._previousCamera=this._currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()},e.prototype._motionlessTransition=function(){return null!=this._currentNode&&null!=this._previousNode&&!(this._currentNode.merged&&this._previousNode.merged&&this._withinOriginalDistance()&&this._sameConnectedComponent())},e.prototype._setReference=function(e){return!(Math.abs(e.latLon.lat-this.reference.lat)<this._referenceThreshold&&Math.abs(e.latLon.lon-this.reference.lon)<this._referenceThreshold)&&(!(null!=this._previousNode&&!this._motionlessTransition())&&(this._reference.lat=e.latLon.lat,this._reference.lon=e.latLon.lon,this._reference.alt=e.alt,!0))},e.prototype._setCurrentNode=function(){this._currentNode=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousNode=this._currentIndex>0?this._trajectory[this._currentIndex-1]:null},e.prototype._setTrajectory=function(e){if(e.length<1)throw new n.ArgumentMapillaryError("Trajectory can not be empty");null!=this._currentNode?(this._trajectory=[this._currentNode].concat(e),this._currentIndex=1):(this._trajectory=e.slice(),this._currentIndex=0)},e.prototype._setTrajectories=function(){this._trajectoryTransforms.length=0,this._trajectoryCameras.length=0,this._appendToTrajectories(this._trajectory)},e.prototype._appendToTrajectories=function(e){for(var t=0,r=e;t<r.length;t++){var o=r[t];if(!o.assetsCached)throw new n.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");var a=this._nodeToTranslation(o),s=new i.Transform(o,o.image,a);this._trajectoryTransforms.push(s),this._trajectoryCameras.push(new i.Camera(s))}},e.prototype._prependToTrajectories=function(e){for(var t=0,r=e.reverse();t<r.length;t++){var o=r[t];if(!o.assetsCached)throw new n.ArgumentMapillaryError("Assets must be cached when added to trajectory");var a=this._nodeToTranslation(o),s=new i.Transform(o,o.image,a);this._trajectoryTransforms.unshift(s),this._trajectoryCameras.unshift(new i.Camera(s))}},e.prototype._nodeToTranslation=function(e){var t=this._geoCoords.geodeticToEnu(e.latLon.lat,e.latLon.lon,e.alt,this._reference.lat,this._reference.lon,this._reference.alt),r=this._spatial.rotate(t,e.rotation);return[-r.x,-r.y,-r.z]},e.prototype._sameConnectedComponent=function(){var e=this._currentNode,t=this._previousNode;return!(e&&e.mergeCC&&t&&t.mergeCC)||e.mergeCC===t.mergeCC},e.prototype._withinOriginalDistance=function(){var e=this._currentNode,t=this._previousNode;return!e||!t||this._spatial.distanceFromLatLon(e.originalLatLon.lat,e.originalLatLon.lon,t.originalLatLon.lat,t.originalLatLon.lon)<25},e}();r.StateBase=o},{"../../Error":232,"../../Geo":233}],353:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("@mapbox/unitbezier"),a=e("../../State"),s=function(){function e(e,t){this._phi=e,this._theta=t}return Object.defineProperty(e.prototype,"phi",{get:function(){return this._phi},set:function(e){this._phi=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"theta",{get:function(){return this._theta},set:function(e){this._theta=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isZero",{get:function(){return 0===this._phi&&0===this._theta},enumerable:!0,configurable:!0}),e.prototype.copy=function(e){this._phi=e.phi,this._theta=e.theta},e.prototype.lerp=function(e,t){this._phi=(1-t)*this._phi+t*e.phi,this._theta=(1-t)*this._theta+t*e.theta},e.prototype.multiply=function(e){this._phi*=e,this._theta*=e},e.prototype.threshold=function(e){this._phi=Math.abs(this._phi)>e?this._phi:0,this._theta=Math.abs(this._theta)>e?this._theta:0},e.prototype.lengthSquared=function(){return this._phi*this._phi+this._theta*this._theta},e.prototype.reset=function(){this._phi=0,this._theta=0},e}(),c=function(e){function t(t){var r=e.call(this,t)||this;return r._adjustCameras(),r._motionless=r._motionlessTransition(),r._baseAlpha=r._alpha,r._animationSpeed=.025,r._unitBezier=new o(.74,.67,.38,.96),r._useBezier=!1,r._rotationDelta=new s(0,0),r._requestedRotationDelta=null,r._basicRotation=[0,0],r._requestedBasicRotation=null,r._requestedBasicRotationUnbounded=null,r._rotationAcceleration=.86,r._rotationIncreaseAlpha=.97,r._rotationDecreaseAlpha=.9,r._rotationThreshold=.001,r._unboundedRotationAlpha=.8,r._desiredZoom=t.zoom,r._minZoom=0,r._maxZoom=3,r._lookatDepth=10,r._desiredLookat=null,r._desiredCenter=null,r}return n(t,e),t.prototype.traverse=function(){throw new Error("Not implemented")},t.prototype.wait=function(){return new a.WaitingState(this)},t.prototype.append=function(t){var r=0===this._trajectory.length;r&&this._resetTransition(),e.prototype.append.call(this,t),r&&(this._setDesiredCenter(),this._setDesiredZoom())},t.prototype.prepend=function(t){var r=0===this._trajectory.length;r&&this._resetTransition(),e.prototype.prepend.call(this,t),r&&(this._setDesiredCenter(),this._setDesiredZoom())},t.prototype.set=function(t){e.prototype.set.call(this,t),this._desiredLookat=null,this._resetTransition(),this._clearRotation(),this._setDesiredCenter(),this._setDesiredZoom(),this._trajectory.length<3&&(this._useBezier=!0)},t.prototype.move=function(e){throw new Error("Not implemented")},t.prototype.moveTo=function(e){throw new Error("Not implemented")},t.prototype.rotate=function(e){null!=this._currentNode&&(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,null!=this._requestedRotationDelta?(this._requestedRotationDelta.phi=this._requestedRotationDelta.phi+e.phi,this._requestedRotationDelta.theta=this._requestedRotationDelta.theta+e.theta):this._requestedRotationDelta=new s(e.phi,e.theta))},t.prototype.rotateBasic=function(e){if(null!=this._currentNode)if(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,null!=this._requestedBasicRotation){this._requestedBasicRotation[0]+=e[0],this._requestedBasicRotation[1]+=e[1];var t=.05/Math.pow(2,this._zoom);this._requestedBasicRotation[0]=this._spatial.clamp(this._requestedBasicRotation[0],-t,t),this._requestedBasicRotation[1]=this._spatial.clamp(this._requestedBasicRotation[1],-t,t)}else this._requestedBasicRotation=e.slice()},t.prototype.rotateBasicUnbounded=function(e){null!=this._currentNode&&(null!=this._requestedBasicRotationUnbounded?(this._requestedBasicRotationUnbounded[0]+=e[0],this._requestedBasicRotationUnbounded[1]+=e[1]):this._requestedBasicRotationUnbounded=e.slice())},t.prototype.rotateBasicWithoutInertia=function(e){if(null!=this._currentNode){this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null;var t=.05/Math.pow(2,this._zoom),r=e.slice();r[0]=this._spatial.clamp(r[0],-t,t),r[1]=this._spatial.clamp(r[1],-t,t),this._applyRotationBasic(r)}},t.prototype.rotateToBasic=function(e){if(null!=this._currentNode){this._desiredZoom=this._zoom,this._desiredLookat=null,e[0]=this._spatial.clamp(e[0],0,1),e[1]=this._spatial.clamp(e[1],0,1);var t=this.currentTransform.unprojectBasic(e,this._lookatDepth);this._currentCamera.lookat.fromArray(t)}},t.prototype.zoomIn=function(e,t){if(null!=this._currentNode){this._desiredZoom=Math.max(this._minZoom,Math.min(this._maxZoom,this._desiredZoom+e));var r=this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()),n=r[0],o=r[1],a=Math.pow(2,this._zoom),s=Math.pow(2,this._desiredZoom),c=t[0],u=t[1];null!=this.currentTransform.gpano&&this.currentTransform.gpano.CroppedAreaImageWidthPixels===this.currentTransform.gpano.FullPanoWidthPixels&&(c-n>.5?c-=1:n-c>.5&&(c=1+c));var h=c-a/s*(c-n),l=u-a/s*(u-o),p=this.currentTransform.gpano;this._currentNode.fullPano?(h=this._spatial.wrap(h+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],.05,.95)):null!=p&&this.currentTransform.gpano.CroppedAreaImageWidthPixels===this.currentTransform.gpano.FullPanoWidthPixels?(h=this._spatial.wrap(h+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],0,1)):(h=this._spatial.clamp(h,0,1),l=this._spatial.clamp(l,0,1)),this._desiredLookat=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic([h,l],this._lookatDepth))}},t.prototype.setCenter=function(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._desiredZoom=this._zoom;var t=[this._spatial.clamp(e[0],0,1),this._spatial.clamp(e[1],0,1)];if(null!=this._currentNode){this._desiredCenter=null;var r=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(t,this._lookatDepth)),n=null!=this.previousTransform?this.previousTransform:this.currentTransform,o=(new i.Vector3).fromArray(n.unprojectBasic(t,this._lookatDepth));this._currentCamera.lookat.copy(r),this._previousCamera.lookat.copy(o)}else this._desiredCenter=t},t.prototype.setZoom=function(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._zoom=this._spatial.clamp(e,this._minZoom,this._maxZoom),this._desiredZoom=this._zoom},t.prototype.update=function(e){1===this._alpha&&this._currentIndex+this._alpha<this._trajectory.length&&(this._currentIndex+=1,this._useBezier=this._trajectory.length<3&&this._currentIndex+1===this._trajectory.length,this._setCurrent(),this._resetTransition(),this._clearRotation(),this._desiredZoom=this._currentNode.fullPano?this._zoom:0,this._desiredLookat=null);var t=this._animationSpeed*(60/e);this._baseAlpha=Math.min(1,this._baseAlpha+t),this._useBezier?this._alpha=this._unitBezier.solve(this._baseAlpha):this._alpha=this._baseAlpha,this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._previousCamera),this._applyRotation(this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation),this._updateZoom(t),this._updateLookat(t),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)},t.prototype._getAlpha=function(){return this._motionless?Math.ceil(this._alpha):this._alpha},t.prototype._setCurrentCamera=function(){e.prototype._setCurrentCamera.call(this),this._adjustCameras()},t.prototype._adjustCameras=function(){if(null!=this._previousNode){var e=this._camera.lookat.clone().sub(this._camera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position)),this._currentNode.fullPano&&this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}},t.prototype._resetTransition=function(){this._alpha=0,this._baseAlpha=0,this._motionless=this._motionlessTransition()},t.prototype._applyRotation=function(e){if(null!=e){var t=(new i.Quaternion).setFromUnitVectors(e.up,new i.Vector3(0,0,1)),r=t.clone().inverse(),n=new i.Vector3;n.copy(e.lookat).sub(e.position),n.applyQuaternion(t);var o=n.length(),a=Math.atan2(n.y,n.x);a+=this._rotationDelta.phi;var s=Math.atan2(Math.sqrt(n.x*n.x+n.y*n.y),n.z);s+=this._rotationDelta.theta,s=Math.max(.1,Math.min(Math.PI-.1,s)),n.x=Math.sin(s)*Math.cos(a),n.y=Math.sin(s)*Math.sin(a),n.z=Math.cos(s),n.applyQuaternion(r),e.lookat.copy(e.position).add(n.multiplyScalar(o))}},t.prototype._applyRotationBasic=function(e){var t=this._currentNode,r=null!=this._previousNode?this.previousNode:this.currentNode,n=this._currentCamera,i=this._previousCamera,o=this.currentTransform,a=null!=this.previousTransform?this.previousTransform:this.currentTransform,s=o.projectBasic(n.lookat.toArray()),c=a.projectBasic(i.lookat.toArray()),u=o.gpano,h=a.gpano;t.fullPano?(s[0]=this._spatial.wrap(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],.05,.95)):null!=u&&o.gpano.CroppedAreaImageWidthPixels===o.gpano.FullPanoWidthPixels?(s[0]=this._spatial.wrap(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],0,1)):(s[0]=this._spatial.clamp(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],0,1)),r.fullPano?(c[0]=this._spatial.wrap(c[0]+e[0],0,1),c[1]=this._spatial.clamp(c[1]+e[1],.05,.95)):null!=h&&a.gpano.CroppedAreaImageWidthPixels===a.gpano.FullPanoWidthPixels?(c[0]=this._spatial.wrap(c[0]+e[0],0,1),c[1]=this._spatial.clamp(c[1]+e[1],0,1)):(c[0]=this._spatial.clamp(c[0]+e[0],0,1),c[1]=this._spatial.clamp(s[1]+e[1],0,1));var l=o.unprojectBasic(s,this._lookatDepth);n.lookat.fromArray(l);var p=a.unprojectBasic(c,this._lookatDepth);i.lookat.fromArray(p)},t.prototype._updateZoom=function(e){var t=this._desiredZoom-this._zoom,r=t>0?1:t<0?-1:0;0!==t&&(Math.abs(t)<.002?(this._zoom=this._desiredZoom,null!=this._desiredLookat&&(this._desiredLookat=null)):this._zoom+=r*Math.max(Math.abs(5*e*t),.002))},t.prototype._updateLookat=function(e){if(null!==this._desiredLookat){var t=this._desiredLookat.distanceToSquared(this._currentCamera.lookat);Math.abs(t)<1e-6?(this._currentCamera.lookat.copy(this._desiredLookat),this._desiredLookat=null):this._currentCamera.lookat.lerp(this._desiredLookat,5*e)}},t.prototype._updateRotation=function(){if(null!=this._requestedRotationDelta){var e=this._rotationDelta.lengthSquared();return this._requestedRotationDelta.lengthSquared()>e?this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationIncreaseAlpha):this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationDecreaseAlpha),void(this._requestedRotationDelta=null)}this._rotationDelta.isZero||(this._rotationDelta.multiply(this._rotationAcceleration),this._rotationDelta.threshold(this._rotationThreshold))},t.prototype._updateRotationBasic=function(){if(null!=this._requestedBasicRotation){var e=this._basicRotation[0],t=this._basicRotation[1],r=this._requestedBasicRotation[0],n=this._requestedBasicRotation[1];return Math.abs(r)>Math.abs(e)?this._basicRotation[0]=(1-this._rotationIncreaseAlpha)*e+this._rotationIncreaseAlpha*r:this._basicRotation[0]=(1-this._rotationDecreaseAlpha)*e+this._rotationDecreaseAlpha*r,Math.abs(n)>Math.abs(t)?this._basicRotation[1]=(1-this._rotationIncreaseAlpha)*t+this._rotationIncreaseAlpha*n:this._basicRotation[1]=(1-this._rotationDecreaseAlpha)*t+this._rotationDecreaseAlpha*n,void(this._requestedBasicRotation=null)}if(null!=this._requestedBasicRotationUnbounded){var r=this._requestedBasicRotationUnbounded[0],n=this._requestedBasicRotationUnbounded[1];if(Math.abs(r)>0&&(this._basicRotation[0]=(1-this._unboundedRotationAlpha)*this._basicRotation[0]+this._unboundedRotationAlpha*r),Math.abs(n)>0&&(this._basicRotation[1]=(1-this._unboundedRotationAlpha)*this._basicRotation[1]+this._unboundedRotationAlpha*n),null!=this._desiredLookat){var o=this.currentTransform.projectBasic(this._desiredLookat.toArray());o[0]+=r,o[1]+=n,this._desiredLookat=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(o,this._lookatDepth))}this._requestedBasicRotationUnbounded=null}0===this._basicRotation[0]&&0===this._basicRotation[1]||(this._basicRotation[0]=this._rotationAcceleration*this._basicRotation[0],this._basicRotation[1]=this._rotationAcceleration*this._basicRotation[1],Math.abs(this._basicRotation[0])<this._rotationThreshold/Math.pow(2,this._zoom)&&Math.abs(this._basicRotation[1])<this._rotationThreshold/Math.pow(2,this._zoom)&&(this._basicRotation=[0,0]))},t.prototype._clearRotation=function(){this._currentNode.fullPano||(null!=this._requestedRotationDelta&&(this._requestedRotationDelta=null),this._rotationDelta.isZero||this._rotationDelta.reset(),null!=this._requestedBasicRotation&&(this._requestedBasicRotation=null),(this._basicRotation[0]>0||this._basicRotation[1]>0)&&(this._basicRotation=[0,0]))},t.prototype._setDesiredCenter=function(){if(null!=this._desiredCenter){var e=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(this._desiredCenter,this._lookatDepth)).sub(this._currentCamera.position);this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(e)),this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(e)),this._desiredCenter=null}},t.prototype._setDesiredZoom=function(){this._desiredZoom=this._currentNode.fullPano||null==this._previousNode?this._zoom:0},t}(a.StateBase);r.TraversingState=c},{"../../State":237,"@mapbox/unitbezier":2,three:180}],354:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../State"),o=function(e){function t(t){var r=e.call(this,t)||this;return r._zoom=0,r._adjustCameras(),r._motionless=r._motionlessTransition(),r}return n(t,e),t.prototype.traverse=function(){return new i.TraversingState(this)},t.prototype.wait=function(){throw new Error("Not implemented")},t.prototype.prepend=function(t){e.prototype.prepend.call(this,t),this._motionless=this._motionlessTransition()},t.prototype.set=function(t){e.prototype.set.call(this,t),this._motionless=this._motionlessTransition()},t.prototype.rotate=function(e){},t.prototype.rotateBasic=function(e){},t.prototype.rotateBasicUnbounded=function(e){},t.prototype.rotateBasicWithoutInertia=function(e){},t.prototype.rotateToBasic=function(e){},t.prototype.zoomIn=function(e,t){},t.prototype.move=function(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))},t.prototype.moveTo=function(e){this._alpha=Math.max(0,Math.min(1,e))},t.prototype.update=function(e){this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)},t.prototype.setCenter=function(e){},t.prototype.setZoom=function(e){},t.prototype._getAlpha=function(){return this._motionless?Math.round(this._alpha):this._alpha},t.prototype._setCurrentCamera=function(){e.prototype._setCurrentCamera.call(this),this._adjustCameras()},t.prototype._adjustCameras=function(){if(null!=this._previousNode){if(this._currentNode.fullPano){e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if(this._previousNode.fullPano){var e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}},t}(i.StateBase);r.WaitingState=o},{"../../State":237}],355:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=function(){function e(e,t,r){this._scheme=e,this._host=t,this._origin=null!=r?"?origin="+r:""}return e.prototype.getTile=function(e,t,r,i,o,a,s){var c="/"+e+"/"+t+","+r+","+i+","+o+"/"+a+","+s+"/0/default.jpg",u=this._scheme+"://"+this._host+c+this._origin,h=null;return[n.Observable.create(function(n){(h=new XMLHttpRequest).open("GET",u,!0),h.responseType="arraybuffer",h.timeout=15e3,h.onload=function(a){if(200===h.status){var s=new Image;s.crossOrigin="Anonymous",s.onload=function(e){n.next(s),n.complete()},s.onerror=function(a){n.error(new Error("Failed to load tile image ("+e+": "+t+","+r+","+i+","+o+")"))};var c=new Blob([h.response]);s.src=window.URL.createObjectURL(c)}else n.error(new Error("Failed to fetch tile ("+e+": "+t+","+r+","+i+","+o+"). Status: "+h.status+", "+h.statusText))},h.onerror=function(a){n.error(new Error("Failed to fetch tile ("+e+": "+t+","+r+","+i+","+o+")"))},h.ontimeout=function(a){n.error(new Error("Tile request timed out ("+e+": "+t+","+r+","+i+","+o+")"))},h.onabort=function(a){n.error(new Error("Tile request was aborted ("+e+": "+t+","+r+","+i+","+o+")"))},h.send(null)}),function(){null!=h&&h.abort()}]},e}();r.ImageTileLoader=i,r.default=i},{"rxjs/Observable":29}],356:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._images={}}return e.prototype.addImage=function(e,t,r){r in this._images||(this._images[r]={}),this._images[r][t]=e},e.prototype.dispose=function(){for(var e=0,t=Object.keys(this._images);e<t.length;e++){for(var r=t[e],n=this._images[r],i=0,o=Object.keys(n);i<o.length;i++){var a=o[i];window.URL.revokeObjectURL(n[a].src),delete n[a]}delete this._images[r]}},e.prototype.getImage=function(e,t){return this._images[t][e]},e.prototype.hasImage=function(e,t){return t in this._images&&e in this._images[t]},e}();r.ImageTileStore=n,r.default=n},{}],357:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Geo"),i=function(){function e(){this._viewportCoords=new n.ViewportCoords}return e.prototype.computeRegionOfInterest=function(e,t,r){var n=this._viewportBoundaryPoints(4),i=this._viewportPointsBoundingBox(n,e,r);this._clipBoundingBox(i);var o=2/t.width,a=2/t.height,s=[[-.5*o,.5*a],[.5*o,.5*a],[.5*o,-.5*a],[-.5*o,-.5*a]],c=this._viewportPointsBoundingBox(s,e,r);return{bbox:i,pixelHeight:c.maxY-c.minY,pixelWidth:c.maxX-c.minX+(c.minX<c.maxX?0:1)}},e.prototype._viewportBoundaryPoints=function(e){for(var t=[],r=[[-1,1],[1,1],[1,-1],[-1,-1]],n=[[2,0],[0,-2],[-2,0],[0,2]],i=0;i<4;++i)for(var o=r[i],a=n[i],s=0;s<e;++s)t.push([o[0]+a[0]*s/e,o[1]+a[1]*s/e]);return t},e.prototype._viewportPointsBoundingBox=function(e,t,r){var n=this,i=e.map(function(e){return n._viewportCoords.viewportToBasic(e[0],e[1],r,t.perspective)});return null!=r.gpano?this._boundingBoxPano(i):this._boundingBox(i)},e.prototype._boundingBox=function(e){for(var t={maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY},r=0;r<e.length;++r)t.minX=Math.min(t.minX,e[r][0]),t.maxX=Math.max(t.maxX,e[r][0]),t.minY=Math.min(t.minY,e[r][1]),t.maxY=Math.max(t.maxY,e[r][1]);return t},e.prototype._boundingBoxPano=function(e){for(var t=this,r=[],n=[],i=0;i<e.length;++i)r.push(e[i][0]),n.push(e[i][1]);r.sort(function(e,r){return t._sign(e-r)}),n.sort(function(e,r){return t._sign(e-r)});var o=this._intervalPano(r);return{maxX:o[1],maxY:n[n.length-1],minX:o[0],minY:n[0]}},e.prototype._intervalPano=function(e){for(var t=0,r=-1,n=0;n<e.length-1;++n){var i=e[n+1]-e[n];i>t&&(t=i,r=n)}return e[0]+1-e[e.length-1]>t?[e[0],e[e.length-1]]:[e[r+1],e[r]]},e.prototype._clipBoundingBox=function(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))},e.prototype._sign=function(e){return e>0?1:e<0?-1:0},e}();r.RegionOfInterestCalculator=i,r.default=i},{"../Geo":233}],358:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("rxjs/Subject"),o=function(){function e(e,t,r,n,o,a,s,c){this._disposed=!1,this._key=e,(t<=0||r<=0)&&console.warn("Original image size ("+t+", "+r+") is invalid ("+e+"). Tiles will not be loaded."),this._width=t,this._height=r,this._maxLevel=Math.ceil(Math.log(Math.max(r,t))/Math.log(2)),this._currentLevel=-1,this._tileSize=n,this._updated$=new i.Subject,this._createdSubject$=new i.Subject,this._created$=this._createdSubject$.publishReplay(1).refCount(),this._createdSubscription=this._created$.subscribe(function(){}),this._hasSubject$=new i.Subject,this._has$=this._hasSubject$.startWith(!1).publishReplay(1).refCount(),this._hasSubscription=this._has$.subscribe(function(){}),this._abortFunctions=[],this._tileSubscriptions={},this._renderedCurrentLevelTiles={},this._renderedTiles={},this._background=o,this._camera=null,this._imageTileLoader=a,this._imageTileStore=s,this._renderer=c,this._renderTarget=null,this._roi=null}return Object.defineProperty(e.prototype,"disposed",{get:function(){return this._disposed},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hasTexture$",{get:function(){return this._has$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"key",{get:function(){return this._key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textureUpdated$",{get:function(){return this._updated$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textureCreated$",{get:function(){return this._created$},enumerable:!0,configurable:!0}),e.prototype.abort=function(){for(var e in this._tileSubscriptions)this._tileSubscriptions.hasOwnProperty(e)&&this._tileSubscriptions[e].unsubscribe();this._tileSubscriptions={};for(var t=0,r=this._abortFunctions;t<r.length;t++)(0,r[t])();this._abortFunctions=[]},e.prototype.dispose=function(){this._disposed?console.warn("Texture already disposed ("+this._key+")"):(this.abort(),null!=this._renderTarget&&(this._renderTarget.dispose(),this._renderTarget=null),this._imageTileStore.dispose(),this._imageTileStore=null,this._background=null,this._camera=null,this._imageTileLoader=null,this._renderer=null,this._roi=null,this._createdSubscription.unsubscribe(),this._hasSubscription.unsubscribe(),this._disposed=!0)},e.prototype.setRegionOfInterest=function(e){if(!(this._width<=0||this._height<=0)){this._roi=e;var t=1/this._roi.pixelWidth,r=1/this._roi.pixelHeight,i=Math.max(r,t),o=Math.max(0,Math.min(this._maxLevel,Math.ceil(Math.log(i)/Math.log(2))));if(o!==this._currentLevel){this.abort(),this._currentLevel=o,this._currentLevel in this._renderedTiles||(this._renderedTiles[this._currentLevel]=[]),this._renderedCurrentLevelTiles={};for(var a=0,s=this._renderedTiles[this._currentLevel];a<s.length;a++){var c=s[a];this._renderedCurrentLevelTiles[this._tileKey(this._tileSize,c)]=!0}}var u=this._getTileCoords([this._roi.bbox.minX,this._roi.bbox.minY]),h=this._getTileCoords([this._roi.bbox.maxX,this._roi.bbox.maxY]),l=this._getTiles(u,h);if(null==this._camera){this._camera=new n.OrthographicCamera(-this._width/2,this._width/2,this._height/2,-this._height/2,-1,1),this._camera.position.z=1;var p=this._renderer.getContext(),f=p.getParameter(p.MAX_TEXTURE_SIZE),d=Math.max(this._width,this._height),m=f>d?1:f/d,v=Math.floor(m*this._width),g=Math.floor(m*this._height);this._renderTarget=new n.WebGLRenderTarget(v,g,{depthBuffer:!1,format:n.RGBFormat,magFilter:n.LinearFilter,minFilter:n.LinearFilter,stencilBuffer:!1}),this._renderToTarget(0,0,this._width,this._height,this._background),this._createdSubject$.next(this._renderTarget.texture),this._hasSubject$.next(!0)}this._fetchTiles(l)}},e.prototype.setTileSize=function(e){this._tileSize=e},e.prototype.updateBackground=function(e){this._background=e},e.prototype._fetchTile=function(e,t,r,n,i,o,a,s){var c=this,u=this._imageTileLoader.getTile(this._key,r,n,i,o,a,s),h=u[0],l=u[1];this._abortFunctions.push(l);var p=this._tileKey(this._tileSize,e),f=h.subscribe(function(a){c._renderToTarget(r,n,i,o,a),c._removeFromDictionary(p,c._tileSubscriptions),c._removeFromArray(l,c._abortFunctions),c._setTileRendered(e,c._currentLevel),c._imageTileStore.addImage(a,p,t),c._updated$.next(!0)},function(e){c._removeFromDictionary(p,c._tileSubscriptions),c._removeFromArray(l,c._abortFunctions),console.error(e)});f.closed||(this._tileSubscriptions[p]=f)},e.prototype._fetchTiles=function(e){for(var t=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),r=0,n=e;r<n.length;r++){var i=n[r],o=this._tileKey(this._tileSize,i);if(!(o in this._renderedCurrentLevelTiles||o in this._tileSubscriptions)){var a=t*i[0],s=t*i[1],c=a+t>this._width?this._width-a:t,u=s+t>this._height?this._height-s:t;if(this._imageTileStore.hasImage(o,this._currentLevel))this._renderToTarget(a,s,c,u,this._imageTileStore.getImage(o,this._currentLevel)),this._setTileRendered(i,this._currentLevel),this._updated$.next(!0);else{var h=Math.floor(c/t*this._tileSize),l=Math.floor(u/t*this._tileSize);this._fetchTile(i,this._currentLevel,a,s,c,u,h,l)}}}},e.prototype._getTileCoords=function(e){var t=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),r=Math.ceil(this._width/t)-1,n=Math.ceil(this._height/t)-1;return[Math.min(Math.floor(this._width*e[0]/t),r),Math.min(Math.floor(this._height*e[1]/t),n)]},e.prototype._getTiles=function(e,t){var r=[];if(e[0]>t[0]){for(var n=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),i=Math.ceil(this._width/n)-1,o=e[0];o<=i;o++)r.push(o);for(o=0;o<=t[0];o++)r.push(o)}else for(o=e[0];o<=t[0];o++)r.push(o);for(var a=[],s=0,c=r;s<c.length;s++)for(var o=c[s],u=e[1];u<=t[1];u++)a.push([o,u]);return a},e.prototype._removeFromArray=function(e,t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)},e.prototype._removeFromDictionary=function(e,t){e in t&&delete t[e]},e.prototype._renderToTarget=function(e,t,r,i,o){var a=new n.Texture(o);a.minFilter=n.LinearFilter,a.needsUpdate=!0;var s=new n.PlaneGeometry(r,i),c=new n.MeshBasicMaterial({map:a,side:n.FrontSide}),u=new n.Mesh(s,c);u.position.x=-this._width/2+e+r/2,u.position.y=this._height/2-t-i/2;var h=new n.Scene;h.add(u),this._renderer.render(h,this._camera,this._renderTarget),this._renderer.setRenderTarget(void 0),h.remove(u),s.dispose(),c.dispose(),a.dispose()},e.prototype._setTileRendered=function(e,t){for(var r=0,n=Object.keys(this._renderedTiles).map(function(e){return parseInt(e,10)}).filter(function(e){return e!==t});r<n.length;r++){var i=n[r],o=Math.pow(2,i-t);if(i<t){for(var a=Math.floor(o*e[0]),s=Math.floor(o*e[1]),c=0,u=this._renderedTiles[i].slice();c<u.length;c++)if((v=u[c])[0]===a&&v[1]===s){g=this._renderedTiles[i].indexOf(v);this._renderedTiles[i].splice(g,1)}}else for(var h=o*e[0],l=h+o-1,p=o*e[1],f=p+o-1,d=0,m=this._renderedTiles[i].slice();d<m.length;d++){var v=m[d];if(v[0]>=h&&v[0]<=l&&v[1]>=p&&v[1]<=f){var g=this._renderedTiles[i].indexOf(v);this._renderedTiles[i].splice(g,1)}}0===this._renderedTiles[i].length&&delete this._renderedTiles[i]}this._renderedTiles[t].push(e),this._renderedCurrentLevelTiles[this._tileKey(this._tileSize,e)]=!0},e.prototype._tileKey=function(e,t){return e+"-"+t[0]+"-"+t[1]},e}();r.TextureProvider=o,r.default=o},{"rxjs/Subject":34,three:180}],359:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e){this._document=e||document}return Object.defineProperty(e.prototype,"document",{get:function(){return this._document},enumerable:!0,configurable:!0}),e.prototype.createElement=function(e,t,r){var n=this._document.createElement(e);return t&&(n.className=t),r&&r.appendChild(n),n},e}();r.DOM=n,r.default=n},{}],360:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._events={}}return e.prototype.on=function(e,t){this._events[e]=this._events[e]||[],this._events[e].push(t)},e.prototype.off=function(e,t){if(e)if(this._listens(e))delete this._events[e];else{var r=this._events[e].indexOf(t);r>=0&&this._events[e].splice(r,1),this._events[e].length&&delete this._events[e]}else this._events={}},e.prototype.fire=function(e,t){if(this._listens(e))for(var r=0,n=this._events[e];r<n.length;r++)n[r].call(this,t)},e.prototype._listens=function(e){return!(!this._events||!this._events[e])},e}();r.EventEmitter=n,r.default=n},{}],361:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Viewer"),i=function(){function e(){}return e.setOptions=function(t){e._baseImageSize=null!=t.baseImageSize?t.baseImageSize:n.ImageSize.Size640,e._basePanoramaSize=null!=t.basePanoramaSize?t.basePanoramaSize:n.ImageSize.Size2048,e._maxImageSize=null!=t.maxImageSize?t.maxImageSize:n.ImageSize.Size2048},Object.defineProperty(e,"baseImageSize",{get:function(){return e._baseImageSize},enumerable:!0,configurable:!0}),Object.defineProperty(e,"basePanoramaSize",{get:function(){return e._basePanoramaSize},enumerable:!0,configurable:!0}),Object.defineProperty(e,"maxImageSize",{get:function(){return e._maxImageSize},enumerable:!0,configurable:!0}),e}();r.Settings=i,r.default=i},{"../Viewer":241}],362:[function(e,t,r){"use strict";function n(){var e={alpha:!1,antialias:!1,depth:!0,failIfMajorPerformanceCaveat:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,stencil:!0},t=document.createElement("canvas"),r=t.getContext("webgl",e)||t.getContext("experimental-webgl",e);if(!r)return!1;for(var n=["OES_standard_derivatives"],i=r.getSupportedExtensions(),o=0,a=n;o<a.length;o++){var s=a[o];if(-1===i.indexOf(s))return!1}return!0}Object.defineProperty(r,"__esModule",{value:!0}),r.isBrowser=function(){return"undefined"!=typeof window&&"undefined"!=typeof document},r.isArraySupported=function(){return!!(Array.prototype&&Array.prototype.filter&&Array.prototype.indexOf&&Array.prototype.map)},r.isFunctionSupported=function(){return!(!Function.prototype||!Function.prototype.bind)},r.isJSONSupported=function(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON},r.isObjectSupported=function(){return!(!Object.keys||!Object.assign)};var i=void 0;r.isWebGLSupportedCached=function(){return void 0===i&&(i=n()),i},r.isWebGLSupported=n},{}],363:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return Object.defineProperty(e,"tileScheme",{get:function(){return"https"},enumerable:!0,configurable:!0}),Object.defineProperty(e,"tileDomain",{get:function(){return"d2qb1440i7l50o.cloudfront.net"},enumerable:!0,configurable:!0}),Object.defineProperty(e,"origin",{get:function(){return"mapillary.webgl"},enumerable:!0,configurable:!0}),e.thumbnail=function(e,t){return"https://d1cuyjsrcm0gby.cloudfront.net/"+e+"/thumb-"+t+".jpg?origin="+this.origin},e.falcorModel=function(e){return"https://a.mapillary.com/v3/model.json?client_id="+e},e.protoMesh=function(e){return"https://d1brzeo354iq2l.cloudfront.net/v2/mesh/"+e},e}();r.Urls=n,r.default=n},{}],364:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Bottom=0]="Bottom",e[e.BottomLeft=1]="BottomLeft",e[e.BottomRight=2]="BottomRight",e[e.Center=3]="Center",e[e.Left=4]="Left",e[e.Right=5]="Right",e[e.Top=6]="Top",e[e.TopLeft=7]="TopLeft",e[e.TopRight=8]="TopRight"}(n=r.Alignment||(r.Alignment={})),r.default=n},{}],365:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/delay"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/switchMap");var n=function(){function e(e,t){this._graphService=e,this._stateService=t,this._started=!1}return Object.defineProperty(e.prototype,"started",{get:function(){return this._started},enumerable:!0,configurable:!0}),e.prototype.start=function(){var e=this;this._started||(this._uncacheSubscription=this._stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).map(function(e){return e.state.trajectory.map(function(e){return e.key})}).bufferCount(1,5).switchMap(function(t){var r=t[0];return e._graphService.uncache$(r)}).subscribe(function(){}),this._started=!0)},e.prototype.stop=function(){this._started&&(this._uncacheSubscription.unsubscribe(),this._uncacheSubscription=null,this._started=!1)},e}();r.CacheService=n,r.default=n},{"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":80}],366:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Component"),i=function(){function e(e,t,r,i,o,a){var s=this;this._container=e,this._observer=r,this._navigator=t,this._options=null!=o?o:{},this._key=i,this._navigable=null==i,this._componentService=a||new n.ComponentService(this._container,this._navigator),this._coverComponent=this._componentService.getCover(),this._initializeComponents(),i?(this._initilizeCoverComponent(),this._subscribeCoverComponent()):this._navigator.movedToKey$.first(function(e){return null!=e}).subscribe(function(e){s._key=e,s._componentService.deactivateCover(),s._coverComponent.configure({key:s._key,state:n.CoverState.Hidden}),s._subscribeCoverComponent(),s._navigator.stateService.start(),s._observer.startEmit()})}return Object.defineProperty(e.prototype,"navigable",{get:function(){return this._navigable},enumerable:!0,configurable:!0}),e.prototype.get=function(e){return this._componentService.get(e)},e.prototype.activate=function(e){this._componentService.activate(e)},e.prototype.activateCover=function(){this._coverComponent.configure({state:n.CoverState.Visible})},e.prototype.deactivate=function(e){this._componentService.deactivate(e)},e.prototype.deactivateCover=function(){this._coverComponent.configure({state:n.CoverState.Loading})},e.prototype.resize=function(){this._componentService.resize()},e.prototype._initializeComponents=function(){var e=this._options;this._uFalse(e.background,"background"),this._uFalse(e.debug,"debug"),this._uFalse(e.image,"image"),this._uFalse(e.marker,"marker"),this._uFalse(e.navigation,"navigation"),this._uFalse(e.popup,"popup"),this._uFalse(e.route,"route"),this._uFalse(e.slider,"slider"),this._uFalse(e.tag,"tag"),this._uTrue(e.attribution,"attribution"),this._uTrue(e.bearing,"bearing"),this._uTrue(e.cache,"cache"),this._uTrue(e.direction,"direction"),this._uTrue(e.imagePlane,"imagePlane"),this._uTrue(e.keyboard,"keyboard"),this._uTrue(e.loading,"loading"),this._uTrue(e.mouse,"mouse"),this._uTrue(e.sequence,"sequence"),this._uTrue(e.stats,"stats")},e.prototype._initilizeCoverComponent=function(){var e=this._options;this._coverComponent.configure({key:this._key}),void 0===e.cover||e.cover?this.activateCover():this.deactivateCover()},e.prototype._setNavigable=function(e){this._navigable!==e&&(this._navigable=e,this._observer.navigable$.next(e))},e.prototype._subscribeCoverComponent=function(){var e=this;this._coverComponent.configuration$.subscribe(function(t){t.state===n.CoverState.Loading?e._navigator.stateService.currentKey$.first().switchMap(function(r){var n=null==r||r!==t.key;return n&&e._setNavigable(!1),n?e._navigator.moveToKey$(t.key):e._navigator.stateService.currentNode$.first()}).subscribe(function(t){e._navigator.stateService.start(),e._observer.startEmit(),e._coverComponent.configure({state:n.CoverState.Hidden}),e._componentService.deactivateCover(),e._setNavigable(!0)},function(t){console.error("Failed to deactivate cover.",t),e._coverComponent.configure({state:n.CoverState.Visible})}):t.state===n.CoverState.Visible&&(e._observer.stopEmit(),e._navigator.stateService.stop(),e._componentService.activateCover(),e._setNavigable(null==t.key))})},e.prototype._uFalse=function(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.deactivate(t)},e.prototype._uTrue=function(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.activate(t)},e}();r.ComponentController=i},{"../Component":230}],367:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Render"),i=e("../Utils"),o=e("../Viewer"),a=function(){function e(e,t,r,a){if(this.id=e,this._dom=a||new i.DOM,this._container=this._dom.document.getElementById(e),!this._container)throw new Error("Container '"+e+"' not found.");this._container.classList.add("mapillary-js"),this._canvasContainer=this._dom.createElement("div","mapillary-js-interactive",this._container),this._domContainer=this._dom.createElement("div","mapillary-js-dom",this._container),this.renderService=new n.RenderService(this._container,t.currentState$,r.renderMode),this.glRenderer=new n.GLRenderer(this._canvasContainer,this.renderService,this._dom),this.domRenderer=new n.DOMRenderer(this._domContainer,this.renderService,t.currentState$),this.keyboardService=new o.KeyboardService(this._canvasContainer),this.mouseService=new o.MouseService(this._container,this._canvasContainer,this._domContainer,document),this.touchService=new o.TouchService(this._canvasContainer,this._domContainer),this.spriteService=new o.SpriteService(r.sprite)}return Object.defineProperty(e.prototype,"element",{get:function(){return this._container},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"canvasContainer",{get:function(){return this._canvasContainer},enumerable:!0,configurable:!0}),e}();r.Container=a,r.default=a},{"../Render":236,"../Utils":240,"../Viewer":241}],368:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Size320=320]="Size320",e[e.Size640=640]="Size640",e[e.Size1024=1024]="Size1024",e[e.Size2048=2048]="Size2048"}(r.ImageSize||(r.ImageSize={}))},{}],369:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=function(){function e(e){this._keyDown$=n.Observable.fromEvent(e,"keydown")}return Object.defineProperty(e.prototype,"keyDown$",{get:function(){return this._keyDown$},enumerable:!0,configurable:!0}),e}();r.KeyboardService=i,r.default=i},{"rxjs/Observable":29}],370:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("rxjs/Subject");e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var o=function(){function e(){this._loadersSubject$=new i.Subject,this._loaders$=this._loadersSubject$.scan(function(e,t){return void 0!==t.task&&(e[t.task]=t.loading),e},{}).startWith({}).publishReplay(1).refCount()}return Object.defineProperty(e.prototype,"loading$",{get:function(){return this._loaders$.map(function(e){return n.reduce(e,function(e,t){return e||t},!1)}).debounceTime(100).distinctUntilChanged()},enumerable:!0,configurable:!0}),e.prototype.taskLoading$=function(e){return this._loaders$.map(function(t){return!!t[e]}).debounceTime(100).distinctUntilChanged()},e.prototype.startLoading=function(e){this._loadersSubject$.next({loading:!0,task:e})},e.prototype.stopLoading=function(e){this._loadersSubject$.next({loading:!1,task:e})},e}();r.LoadingService=o,r.default=o},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,underscore:182}],371:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/fromEvent"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var a=e("../Geo"),s=function(){function e(e,t,r,s,c){var u=this;this._canvasContainer=t,this._domContainer=r,this._viewportCoords=null!=c?c:new a.ViewportCoords,this._activeSubject$=new n.BehaviorSubject(!1),this._active$=this._activeSubject$.distinctUntilChanged().publishReplay(1).refCount(),this._claimMouse$=new o.Subject,this._claimWheel$=new o.Subject,this._deferPixelClaims$=new o.Subject,this._deferPixels$=this._deferPixelClaims$.scan(function(e,t){return null==t.deferPixels?delete e[t.name]:e[t.name]=t.deferPixels,e},{}).map(function(e){var t=-1;for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];n>t&&(t=n)}return t}).startWith(-1).publishReplay(1).refCount(),this._deferPixels$.subscribe(function(){}),this._documentMouseMove$=i.Observable.fromEvent(s,"mousemove"),this._documentMouseUp$=i.Observable.fromEvent(s,"mouseup"),this._mouseDown$=i.Observable.fromEvent(t,"mousedown"),this._mouseLeave$=i.Observable.fromEvent(t,"mouseleave"),this._mouseMove$=i.Observable.fromEvent(t,"mousemove"),this._mouseUp$=i.Observable.fromEvent(t,"mouseup"),this._mouseOut$=i.Observable.fromEvent(t,"mouseout"),this._mouseOver$=i.Observable.fromEvent(t,"mouseover"),this._domMouseDown$=i.Observable.fromEvent(r,"mousedown"),this._domMouseMove$=i.Observable.fromEvent(r,"mousemove"),this._click$=i.Observable.fromEvent(t,"click"),this._contextMenu$=i.Observable.fromEvent(t,"contextmenu"),this._dblClick$=i.Observable.merge(i.Observable.fromEvent(e,"click"),i.Observable.fromEvent(t,"dblclick")).bufferCount(3,1).filter(function(e){var r=e[0],n=e[1],i=e[2];return"click"===r.type&&"click"===n.type&&"dblclick"===i.type&&r.target.parentNode===t&&n.target.parentNode===t}).map(function(e){return e[2]}).share(),i.Observable.merge(this._domMouseDown$,this._domMouseMove$,this._dblClick$,this._contextMenu$).subscribe(function(e){e.preventDefault()}),this._mouseWheel$=i.Observable.merge(i.Observable.fromEvent(t,"wheel"),i.Observable.fromEvent(r,"wheel")).share(),this._consistentContextMenu$=i.Observable.merge(this._mouseDown$,this._mouseMove$,this._mouseOut$,this._mouseUp$,this._contextMenu$).bufferCount(3,1).filter(function(e){return"mousedown"===e[0].type&&"contextmenu"===e[1].type&&"mouseup"===e[2].type}).map(function(e){return e[1]}).share();var h=i.Observable.merge(i.Observable.fromEvent(window,"blur"),this._documentMouseUp$.filter(function(e){return 0===e.button})).share(),l=this._createMouseDragInitiate$(this._mouseDown$,h,!0).share();this._mouseDragStart$=this._createMouseDragStart$(l).share(),this._mouseDrag$=this._createMouseDrag$(l,h).share(),this._mouseDragEnd$=this._createMouseDragEnd$(this._mouseDragStart$,h).share();var p=this._createMouseDragInitiate$(this._domMouseDown$,h,!1).share();this._domMouseDragStart$=this._createMouseDragStart$(p).share(),this._domMouseDrag$=this._createMouseDrag$(p,h).share(),this._domMouseDragEnd$=this._createMouseDragEnd$(this._domMouseDragStart$,h).share(),this._proximateClick$=this._mouseDown$.switchMap(function(e){return u._click$.takeUntil(u._createDeferredMouseMove$(e,u._documentMouseMove$)).take(1)}).share(),this._staticClick$=this._mouseDown$.switchMap(function(e){return u._click$.takeUntil(u._documentMouseMove$).take(1)}).share(),this._mouseDragStart$.subscribe(),this._mouseDrag$.subscribe(),this._mouseDragEnd$.subscribe(),this._domMouseDragStart$.subscribe(),this._domMouseDrag$.subscribe(),this._domMouseDragEnd$.subscribe(),this._staticClick$.subscribe(),this._mouseOwner$=this._createOwner$(this._claimMouse$).publishReplay(1).refCount(),this._wheelOwner$=this._createOwner$(this._claimWheel$).publishReplay(1).refCount(),this._mouseOwner$.subscribe(function(){}),this._wheelOwner$.subscribe(function(){})}return Object.defineProperty(e.prototype,"active$",{get:function(){return this._active$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"activate$",{get:function(){return this._activeSubject$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"documentMouseMove$",{get:function(){return this._documentMouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"documentMouseUp$",{get:function(){return this._documentMouseUp$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDragStart$",{get:function(){return this._domMouseDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDrag$",{get:function(){return this._domMouseDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDragEnd$",{get:function(){return this._domMouseDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDown$",{get:function(){return this._domMouseDown$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseMove$",{get:function(){return this._domMouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOwner$",{get:function(){return this._mouseOwner$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDown$",{get:function(){return this._mouseDown$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseMove$",{get:function(){return this._mouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseLeave$",{get:function(){return this._mouseLeave$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOut$",{get:function(){return this._mouseOut$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOver$",{get:function(){return this._mouseOver$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseUp$",{get:function(){return this._mouseUp$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"click$",{get:function(){return this._click$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dblClick$",{get:function(){return this._dblClick$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"contextMenu$",{get:function(){return this._consistentContextMenu$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseWheel$",{get:function(){return this._mouseWheel$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDragStart$",{get:function(){return this._mouseDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDrag$",{get:function(){return this._mouseDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDragEnd$",{get:function(){return this._mouseDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"proximateClick$",{get:function(){return this._proximateClick$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"staticClick$",{get:function(){return this._staticClick$},enumerable:!0,configurable:!0}),e.prototype.claimMouse=function(e,t){this._claimMouse$.next({name:e,zindex:t})},e.prototype.unclaimMouse=function(e){this._claimMouse$.next({name:e,zindex:null})},e.prototype.deferPixels=function(e,t){this._deferPixelClaims$.next({name:e,deferPixels:t})},e.prototype.undeferPixels=function(e){this._deferPixelClaims$.next({name:e,deferPixels:null})},e.prototype.claimWheel=function(e,t){this._claimWheel$.next({name:e,zindex:t})},e.prototype.unclaimWheel=function(e){this._claimWheel$.next({name:e,zindex:null})},e.prototype.filtered$=function(e,t){return this._filtered(e,t,this._mouseOwner$)},e.prototype.filteredWheel$=function(e,t){return this._filtered(e,t,this._wheelOwner$)},e.prototype._createDeferredMouseMove$=function(e,t){return t.map(function(t){var r=t.clientX-e.clientX,n=t.clientY-e.clientY;return[t,Math.sqrt(r*r+n*n)]}).withLatestFrom(this._deferPixels$).filter(function(e){var t=e[0];t[0];return t[1]>e[1]}).map(function(e){var t=e[0],r=t[0];t[1],e[1];return r})},e.prototype._createMouseDrag$=function(e,t){var r=this;return e.map(function(e){e[0];return e[1]}).switchMap(function(e){return i.Observable.of(e).concat(r._documentMouseMove$).takeUntil(t)})},e.prototype._createMouseDragEnd$=function(e,t){return e.switchMap(function(e){return t.first()})},e.prototype._createMouseDragStart$=function(e){return e.map(function(e){var t=e[0];e[1];return t})},e.prototype._createMouseDragInitiate$=function(e,t,r){var n=this;return e.filter(function(e){return 0===e.button}).switchMap(function(e){return i.Observable.combineLatest(i.Observable.of(e),r?n._createDeferredMouseMove$(e,n._documentMouseMove$):n._documentMouseMove$).takeUntil(t).take(1)})},e.prototype._createOwner$=function(e){return e.scan(function(e,t){return null==t.zindex?delete e[t.name]:e[t.name]=t.zindex,e},{}).map(function(e){var t=null,r=-1;for(var n in e)e.hasOwnProperty(n)&&e[n]>r&&(r=e[n],t=n);return t}).startWith(null)},e.prototype._filtered=function(e,t,r){return t.withLatestFrom(r).filter(function(t){t[0];return t[1]===e}).map(function(e){var t=e[0];e[1];return t})},e}();r.MouseService=s,r.default=s},{"../Geo":233,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],372:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/ReplaySubject");e("rxjs/add/observable/throw"),e("rxjs/add/operator/do"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap");var a=e("../API"),s=e("../Graph"),c=e("../Edge"),u=e("../State"),h=e("../Viewer"),l=function(){function e(e,t,r,i,o,c,l,p){this._apiV3=null!=r?r:new a.APIv3(e,t),this._imageLoadingService=null!=o?o:new s.ImageLoadingService,this._graphService=null!=i?i:new s.GraphService(new s.Graph(this.apiV3),this._imageLoadingService),this._loadingService=null!=c?c:new h.LoadingService,this._loadingName="navigator",this._stateService=null!=l?l:new u.StateService,this._cacheService=null!=p?p:new h.CacheService(this._graphService,this._stateService),this._cacheService.start(),this._keyRequested$=new n.BehaviorSubject(null),this._movedToKey$=new n.BehaviorSubject(null),this._request$=null,this._requestSubscription=null,this._nodeRequestSubscription=null}return Object.defineProperty(e.prototype,"apiV3",{get:function(){return this._apiV3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"graphService",{get:function(){return this._graphService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"imageLoadingService",{get:function(){return this._imageLoadingService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadingService",{get:function(){return this._loadingService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"movedToKey$",{get:function(){return this._movedToKey$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stateService",{get:function(){return this._stateService},enumerable:!0,configurable:!0}),e.prototype.moveToKey$=function(e){this._abortRequest("to key "+e),this._loadingService.startLoading(this._loadingName);var t=this._moveToKey$(e);return this._makeRequest$(t)},e.prototype.moveDir$=function(e){var t=this;this._abortRequest("in dir "+c.EdgeDirection[e]),this._loadingService.startLoading(this._loadingName);var r=this.stateService.currentNode$.first().mergeMap(function(t){return([c.EdgeDirection.Next,c.EdgeDirection.Prev].indexOf(e)>-1?t.sequenceEdges$:t.spatialEdges$).first().map(function(t){for(var r=0,n=t.edges;r<n.length;r++){var i=n[r];if(i.data.direction===e)return i.to}return null})}).mergeMap(function(r){return null==r?(t._loadingService.stopLoading(t._loadingName),i.Observable.throw(new Error("Direction ("+e+") does not exist for current node."))):t._moveToKey$(r)});return this._makeRequest$(r)},e.prototype.moveCloseTo$=function(e,t){var r=this;this._abortRequest("to lat "+e+", lon "+t),this._loadingService.startLoading(this._loadingName);var n=this.apiV3.imageCloseTo$(e,t).mergeMap(function(n){return null==n?(r._loadingService.stopLoading(r._loadingName),i.Observable.throw(new Error("No image found close to lat "+e+", lon "+t+"."))):r._moveToKey$(n.key)});return this._makeRequest$(n)},e.prototype.setFilter$=function(e){var t=this;return this._stateService.clearNodes(),this._movedToKey$.first().mergeMap(function(r){return null!=r?t._trajectoryKeys$().mergeMap(function(r){return t._graphService.setFilter$(e).mergeMap(function(e){return t._cacheKeys$(r)})}).last():t._keyRequested$.first().mergeMap(function(r){return null!=r?t._graphService.setFilter$(e).mergeMap(function(e){return t._graphService.cacheNode$(r)}):t._graphService.setFilter$(e).map(function(e){})})}).map(function(e){})},e.prototype.setToken$=function(e){var t=this;return this._abortRequest("to set token"),this._stateService.clearNodes(),this._movedToKey$.first().do(function(r){t._apiV3.setToken(e)}).mergeMap(function(e){return null==e?t._graphService.reset$([]).map(function(e){}):t._trajectoryKeys$().mergeMap(function(e){return t._graphService.reset$(e).mergeMap(function(r){return t._cacheKeys$(e)})}).last().map(function(e){})})},e.prototype._cacheKeys$=function(e){var t=this,r=e.map(function(e){return t._graphService.cacheNode$(e)});return i.Observable.from(r).mergeAll()},e.prototype._abortRequest=function(e){null!=this._requestSubscription&&(this._requestSubscription.unsubscribe(),this._requestSubscription=null),null!=this._nodeRequestSubscription&&(this._nodeRequestSubscription.unsubscribe(),this._nodeRequestSubscription=null),null!=this._request$&&(this._request$.error(new Error("Request aborted by a subsequent request "+e+".")),this._request$=null)},e.prototype._makeRequest$=function(e){var t=this;return this._request$=new o.ReplaySubject(1),this._requestSubscription=this._request$.subscribe(void 0,function(e){}),this._nodeRequestSubscription=e.subscribe(function(e){t._request$.next(e),t._request$.complete()},function(e){t._request$.error(e)}),this._request$},e.prototype._moveToKey$=function(e){var t=this;return this._keyRequested$.next(e),this._graphService.cacheNode$(e).do(function(e){t._stateService.setNodes([e]),t._movedToKey$.next(e.key)}).finally(function(){t._loadingService.stopLoading(t._loadingName)})},e.prototype._trajectoryKeys$=function(){return this._stateService.currentState$.first().map(function(e){return e.state.trajectory.map(function(e){return e.key})})},e}();r.Navigator=l,r.default=l},{"../API":229,"../Edge":231,"../Graph":234,"../State":237,"../Viewer":241,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],373:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/throttleTime");var o=e("../Viewer"),a=function(){function e(e,t,r){var n=this;this._container=r,this._eventEmitter=e,this._navigator=t,this._projection=new o.Projection,this._started=!1,this._navigable$=new i.Subject,this._navigable$.subscribe(function(e){n._eventEmitter.fire(o.Viewer.navigablechanged,e)}),this._navigator.loadingService.loading$.subscribe(function(e){n._eventEmitter.fire(o.Viewer.loadingchanged,e)})}return Object.defineProperty(e.prototype,"started",{get:function(){return this._started},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"navigable$",{get:function(){return this._navigable$},enumerable:!0,configurable:!0}),e.prototype.projectBasic$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1],o=t._projection.basicToCanvas(e,t._container.element,n,i);return[Math.round(o[0]),Math.round(o[1])]})},e.prototype.startEmit=function(){var e=this;if(!this._started){this._started=!0,this._currentNodeSubscription=this._navigator.stateService.currentNodeExternal$.subscribe(function(t){e._eventEmitter.fire(o.Viewer.nodechanged,t)}),this._sequenceEdgesSubscription=this._navigator.stateService.currentNodeExternal$.switchMap(function(e){return e.sequenceEdges$}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.sequenceedgeschanged,t)}),this._spatialEdgesSubscription=this._navigator.stateService.currentNodeExternal$.switchMap(function(e){return e.spatialEdges$}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.spatialedgeschanged,t)}),this._moveSubscription=n.Observable.combineLatest(this._navigator.stateService.inMotion$,this._container.mouseService.active$,this._container.touchService.active$).map(function(e){return e[0]||e[1]||e[2]}).distinctUntilChanged().subscribe(function(t){t?e._eventEmitter.fire(o.Viewer.movestart,null):e._eventEmitter.fire(o.Viewer.moveend,null)}),this._bearingSubscription=this._container.renderService.bearing$.throttleTime(100).distinctUntilChanged(function(e,t){return Math.abs(t-e)<1}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.bearingchanged,t)});var t=this._container.mouseService.active$.switchMap(function(t){return t?n.Observable.empty():e._container.mouseService.mouseMove$});this._viewerMouseEventSubscription=n.Observable.merge(this._mapMouseEvent$(o.Viewer.click,this._container.mouseService.staticClick$),this._mapMouseEvent$(o.Viewer.contextmenu,this._container.mouseService.contextMenu$),this._mapMouseEvent$(o.Viewer.dblclick,this._container.mouseService.dblClick$),this._mapMouseEvent$(o.Viewer.mousedown,this._container.mouseService.mouseDown$),this._mapMouseEvent$(o.Viewer.mousemove,t),this._mapMouseEvent$(o.Viewer.mouseout,this._container.mouseService.mouseOut$),this._mapMouseEvent$(o.Viewer.mouseover,this._container.mouseService.mouseOver$),this._mapMouseEvent$(o.Viewer.mouseup,this._container.mouseService.mouseUp$)).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).map(function(t){var r=t[0],n=r[0],i=r[1],o=t[1],a=t[2],s=t[3],c=e._projection.eventToUnprojection(i,e._container.element,o,a,s);return{basicPoint:c.basicPoint,latLon:c.latLon,originalEvent:i,pixelPoint:c.pixelPoint,target:e._eventEmitter,type:n}}).subscribe(function(t){e._eventEmitter.fire(t.type,t)})}},e.prototype.stopEmit=function(){this.started&&(this._started=!1,this._bearingSubscription.unsubscribe(),this._currentNodeSubscription.unsubscribe(),this._moveSubscription.unsubscribe(),this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._viewerMouseEventSubscription.unsubscribe(),this._bearingSubscription=null,this._currentNodeSubscription=null,this._moveSubscription=null,this._sequenceEdgesSubscription=null,this._spatialEdgesSubscription=null,this._viewerMouseEventSubscription=null)},e.prototype.unproject$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1],o=r[2];return t._projection.canvasToUnprojection(e,t._container.element,n,i,o).latLon})},e.prototype.unprojectBasic$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1];return t._projection.canvasToBasic(e,t._container.element,n,i)})},e.prototype._mapMouseEvent$=function(e,t){return t.map(function(t){return[e,t]})},e}();r.Observer=a,r.default=a},{"../Viewer":241,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":84}],374:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../Geo"),o=function(){function e(e,t){this._geoCoords=e||new i.GeoCoords,this._viewportCoords=t||new i.ViewportCoords}return e.prototype.basicToCanvas=function(e,t,r,n){return this._viewportCoords.basicToCanvas(e[0],e[1],t,n,r.perspective)},e.prototype.canvasToBasic=function(e,t,r,n){var i=this._viewportCoords.canvasToBasic(e[0],e[1],t,n,r.perspective);return(i[0]<0||i[0]>1||i[1]<0||i[1]>1)&&(i=null),i},e.prototype.eventToUnprojection=function(e,t,r,n,i){var o=this._viewportCoords.canvasPosition(e,t);return this.canvasToUnprojection(o,t,r,n,i)},e.prototype.canvasToUnprojection=function(e,t,r,i,o){var a=e[0],s=e[1],c=this._viewportCoords.canvasToViewport(a,s,t),u=c[0],h=c[1],l=new n.Vector3(u,h,1).unproject(r.perspective),p=o.projectBasic(l.toArray());(p[0]<0||p[0]>1||p[1]<0||p[1]>1)&&(p=null);var f=l.clone().sub(r.camera.position).normalize(),d=-2/f.z,m=null;if(d>0&&d<100&&p){var v=f.clone().multiplyScalar(d).add(r.camera.position),g=this._geoCoords.enuToGeodetic(v.x,v.y,v.z,i.lat,i.lon,i.alt).slice(0,2);m={lat:g[0],lon:g[1]}}return{basicPoint:p,latLon:m,pixelPoint:[a,s]}},e}();r.Projection=o,r.default=o},{"../Geo":233,three:180}],375:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("virtual-dom"),o=e("rxjs/Subject");e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var a=e("../Viewer"),s=function(){function e(){}return Object.defineProperty(e.prototype,"json",{set:function(e){this._json=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"image",{set:function(e){this._image=e,this._texture=new n.Texture(this._image),this._texture.minFilter=n.NearestFilter},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loaded",{get:function(){return!(!this._image||!this._json)},enumerable:!0,configurable:!0}),e.prototype.getGLSprite=function(e){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");var t=this._json[e];if(!t)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),new n.Object3D;var r=this._texture.clone();r.needsUpdate=!0;var i=this._image.width,o=this._image.height;r.offset.x=t.x/i,r.offset.y=(o-t.y-t.height)/o,r.repeat.x=t.width/i,r.repeat.y=t.height/o;var a=new n.SpriteMaterial({map:r});return new n.Sprite(a)},e.prototype.getDOMSprite=function(e,t){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");null==t&&(t=a.Alignment.Center);var r=this._json[e];if(!r)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),i.h("div",{},[]);var n=r.y,o=r.x+r.width,s=r.y+r.height,c=r.x,u=-r.x,h=-r.y,l=this._image.height,p=this._image.width;switch(t){case a.Alignment.Bottom:case a.Alignment.Center:case a.Alignment.Top:u-=r.width/2;break;case a.Alignment.BottomLeft:case a.Alignment.Left:case a.Alignment.TopLeft:u-=r.width;break;case a.Alignment.BottomRight:case a.Alignment.Right:case a.Alignment.BottomRight:}switch(t){case a.Alignment.Center:case a.Alignment.Left:case a.Alignment.Right:h-=r.height/2;break;case a.Alignment.Top:case a.Alignment.TopLeft:case a.Alignment.TopRight:h-=r.height;break;case a.Alignment.Bottom:case a.Alignment.BottomLeft:case a.Alignment.BottomRight:}var f=1/r.pixelRatio;n*=f,o*=f,s*=f,c*=f,u*=f,h*=f,l*=f,p*=f;var d={src:this._image.src,style:{clip:"rect("+n+"px, "+o+"px, "+s+"px, "+c+"px)",height:l+"px",left:u+"px",position:"absolute",top:h+"px",width:p+"px"}};return i.h("img",d,[])},e}(),c=function(){function e(e){var t=this;if(this._retina=window.devicePixelRatio>1,this._spriteAtlasOperation$=new o.Subject,this._spriteAtlas$=this._spriteAtlasOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},new s).publishReplay(1).refCount(),this._spriteAtlas$.subscribe(function(){}),null!=e){var r=this._retina?"@2x":"",n=new XMLHttpRequest;n.open("GET",e+r+".png",!0),n.responseType="arraybuffer",n.onload=function(){var e=new Image;e.onload=function(){t._spriteAtlasOperation$.next(function(t){return t.image=e,t})};var r=new Blob([n.response]);e.src=window.URL.createObjectURL(r)},n.onerror=function(t){console.error(new Error("Failed to fetch sprite sheet ("+e+r+".png)"))},n.send();var i=new XMLHttpRequest;i.open("GET",e+r+".json",!0),i.responseType="text",i.onload=function(){var e=JSON.parse(i.response);t._spriteAtlasOperation$.next(function(t){return t.json=e,t})},i.onerror=function(t){console.error(new Error("Failed to fetch sheet ("+e+r+".json)"))},i.send()}}return Object.defineProperty(e.prototype,"spriteAtlas$",{get:function(){return this._spriteAtlas$},enumerable:!0,configurable:!0}),e}();r.SpriteService=c,r.default=c},{"../Viewer":241,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,three:180,"virtual-dom":186}],376:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/timer"),e("rxjs/add/operator/bufferWhen"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap");var a=function(){function e(e,t){var r=this;this._canvasContainer=e,this._domContainer=t,this._activeSubject$=new n.BehaviorSubject(!1),this._active$=this._activeSubject$.distinctUntilChanged().publishReplay(1).refCount(),i.Observable.fromEvent(t,"touchmove").subscribe(function(e){e.preventDefault()}),this._touchStart$=i.Observable.fromEvent(e,"touchstart"),this._touchMove$=i.Observable.fromEvent(e,"touchmove"),this._touchEnd$=i.Observable.fromEvent(e,"touchend"),this._touchCancel$=i.Observable.fromEvent(e,"touchcancel");var a=this._touchStart$.filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}).share();this._doubleTap$=a.bufferWhen(function(){return a.first().switchMap(function(e){return i.Observable.timer(300).merge(a).take(1)})}).filter(function(e){return 2===e.length}).map(function(e){return e[e.length-1]}).share(),this._doubleTap$.subscribe(function(e){e.preventDefault()}),this._singleTouchMove$=this._touchMove$.filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}).share();var s=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$).filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}),c=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$).filter(function(e){return e.touches.length>=1}),u=i.Observable.merge(this._touchEnd$,this._touchCancel$).filter(function(e){return 0===e.touches.length});this._singleTouchDragStart$=s.mergeMap(function(e){return r._singleTouchMove$.takeUntil(i.Observable.merge(u,c)).take(1)}),this._singleTouchDragEnd$=s.mergeMap(function(e){return i.Observable.merge(u,c).first()}),this._singleTouchDrag$=s.switchMap(function(e){return r._singleTouchMove$.skip(1).takeUntil(i.Observable.merge(c,u))});var h=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$);this._pinchStart$=h.filter(function(e){return 2===e.touches.length&&2===e.targetTouches.length}),this._pinchEnd$=h.filter(function(e){return 2!==e.touches.length||2!==e.targetTouches.length}),this._pinchOperation$=new o.Subject,this._pinch$=this._pinchOperation$.scan(function(e,t){return t(e)},{changeX:0,changeY:0,clientX:0,clientY:0,distance:0,distanceChange:0,distanceX:0,distanceY:0,originalEvent:null,pageX:0,pageY:0,screenX:0,screenY:0,touch1:null,touch2:null}),this._touchMove$.filter(function(e){return 2===e.touches.length&&2===e.targetTouches.length}).map(function(e){return function(t){var r=e.touches[0],n=e.touches[1],i=Math.min(r.clientX,n.clientX),o=Math.max(r.clientX,n.clientX),a=Math.min(r.clientY,n.clientY),s=i+(o-i)/2,c=a+(Math.max(r.clientY,n.clientY)-a)/2,u=s+r.pageX-r.clientX,h=c+r.pageY-r.clientY,l=s+r.screenX-r.clientX,p=c+r.screenY-r.clientY,f=Math.abs(r.clientX-n.clientX),d=Math.abs(r.clientY-n.clientY),m=Math.sqrt(f*f+d*d),v=m-t.distance;return{changeX:f-t.distanceX,changeY:d-t.distanceY,clientX:s,clientY:c,distance:m,distanceChange:v,distanceX:f,distanceY:d,originalEvent:e,pageX:u,pageY:h,screenX:l,screenY:p,touch1:r,touch2:n}}}).subscribe(this._pinchOperation$),this._pinchChange$=this._pinchStart$.switchMap(function(e){return r._pinch$.skip(1).takeUntil(r._pinchEnd$)})}return Object.defineProperty(e.prototype,"active$",{get:function(){return this._active$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"activate$",{get:function(){return this._activeSubject$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"doubleTap$",{get:function(){return this._doubleTap$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchStart$",{get:function(){return this._touchStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchMove$",{get:function(){return this._touchMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchEnd$",{get:function(){return this._touchEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchCancel$",{get:function(){return this._touchCancel$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDragStart$",{get:function(){return this._singleTouchDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDrag$",{get:function(){return this._singleTouchDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDragEnd$",{get:function(){return this._singleTouchDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinch$",{get:function(){return this._pinchChange$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinchStart$",{get:function(){return this._pinchStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinchEnd$",{get:function(){return this._pinchEnd$},enumerable:!0,configurable:!0}),e}();r.TouchService=a},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":74,"rxjs/add/operator/switchMap":80}],377:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("when"),o=e("rxjs/Observable"),a=e("../Viewer"),s=e("../Utils"),c=function(e){function t(t,r,n,i,o){var c=e.call(this)||this;return i=null!=i?i:{},s.Settings.setOptions(i),c._navigator=new a.Navigator(r,o),c._container=new a.Container(t,c._navigator.stateService,i),c._observer=new a.Observer(c,c._navigator,c._container),c._componentController=new a.ComponentController(c._container,c._navigator,c._observer,n,i.component),c}return n(t,e),Object.defineProperty(t.prototype,"isNavigable",{get:function(){return this._componentController.navigable},enumerable:!0,configurable:!0}),t.prototype.activateComponent=function(e){this._componentController.activate(e)},t.prototype.activateCover=function(){this._componentController.activateCover()},t.prototype.deactivateComponent=function(e){this._componentController.deactivate(e)},t.prototype.deactivateCover=function(){this._componentController.deactivateCover()},t.prototype.getBearing=function(){var e=this;return i.promise(function(t,r){e._container.renderService.bearing$.first().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.getCenter=function(){var e=this;return i.promise(function(t,r){e._navigator.stateService.getCenter().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.getComponent=function(e){return this._componentController.get(e)},t.prototype.getContainer=function(){return this._container.element},t.prototype.getZoom=function(){var e=this;return i.promise(function(t,r){e._navigator.stateService.getZoom().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.moveCloseTo=function(e,t){var r=this.isNavigable?this._navigator.moveCloseTo$(e,t):o.Observable.throw(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));return i.promise(function(e,t){r.subscribe(function(t){e(t)},function(e){t(e)})})},t.prototype.moveDir=function(e){var t=this.isNavigable?this._navigator.moveDir$(e):o.Observable.throw(new Error("Calling moveDir is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(t){e(t)},function(e){r(e)})})},t.prototype.moveToKey=function(e){var t=this.isNavigable?this._navigator.moveToKey$(e):o.Observable.throw(new Error("Calling moveToKey is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(t){e(t)},function(e){r(e)})})},t.prototype.projectFromBasic=function(e){var t=this;return i.promise(function(r,n){t._observer.projectBasic$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.resize=function(){this._container.renderService.resize$.next(null),this._componentController.resize()},t.prototype.setAuthToken=function(e){var t=this.isNavigable?this._navigator.setToken$(e):o.Observable.throw(new Error("Calling setAuthToken is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(){e(void 0)},function(e){r(e)})})},t.prototype.setCenter=function(e){this._navigator.stateService.setCenter(e)},t.prototype.setFilter=function(e){var t=this;return i.promise(function(r,n){t._navigator.setFilter$(e).subscribe(function(){r(void 0)},function(e){n(e)})})},t.prototype.setRenderMode=function(e){this._container.renderService.renderMode$.next(e)},t.prototype.setZoom=function(e){this._navigator.stateService.setZoom(e)},t.prototype.unproject=function(e){var t=this;return i.promise(function(r,n){t._observer.unproject$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.unprojectToBasic=function(e){var t=this;return i.promise(function(r,n){t._observer.unprojectBasic$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.bearingchanged="bearingchanged",t.click="click",t.contextmenu="contextmenu",t.dblclick="dblclick",t.loadingchanged="loadingchanged",t.mousedown="mousedown",t.mousemove="mousemove",t.mouseout="mouseout",t.mouseover="mouseover",t.mouseup="mouseup",t.moveend="moveend",t.movestart="movestart",t.navigablechanged="navigablechanged",t.nodechanged="nodechanged",t.sequenceedgeschanged="sequenceedgeschanged",t.spatialedgeschanged="spatialedgeschanged",t}(s.EventEmitter);r.Viewer=c},{"../Utils":240,"../Viewer":241,"rxjs/Observable":29,when:227}]},{},[235])(235)});
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Mapillary=e()}}(function(){return function e(t,r,n){function i(a,s){if(!r[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var h=r[a]={exports:{}};t[a][0].call(h.exports,function(e){var r=t[a][1][e];return i(r||e)},h,h.exports,e,t,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;a<n.length;a++)i(n[a]);return i}({1:[function(e,t,r){"use strict";function n(e,t,r){t=t||1;for(var n,s,c,u,h=0;h<e[0].length;h++){var l=e[0][h];(!h||l[0]<n)&&(n=l[0]),(!h||l[1]<s)&&(s=l[1]),(!h||l[0]>c)&&(c=l[0]),(!h||l[1]>u)&&(u=l[1])}var p=c-n,f=u-s,d=Math.min(p,f),m=d/2,v=new a(null,i);if(0===d)return[n,s];for(var g=n;g<c;g+=d)for(var y=s;y<u;y+=d)v.push(new o(g+m,y+m,m,e));var b=function(e){for(var t=0,r=0,n=0,i=e[0],a=0,s=i.length,c=s-1;a<s;c=a++){var u=i[a],h=i[c],l=u[0]*h[1]-h[0]*u[1];r+=(u[0]+h[0])*l,n+=(u[1]+h[1])*l,t+=3*l}return 0===t?new o(i[0][0],i[0][1],0,e):new o(r/t,n/t,0,e)}(e),_=new o(n+p/2,s+f/2,0,e);_.d>b.d&&(b=_);for(var x=v.length;v.length;){var w=v.pop();w.d>b.d&&(b=w,r&&console.log("found best %d after %d probes",Math.round(1e4*w.d)/1e4,x)),w.max-b.d<=t||(m=w.h/2,v.push(new o(w.x-m,w.y-m,m,e)),v.push(new o(w.x+m,w.y-m,m,e)),v.push(new o(w.x-m,w.y+m,m,e)),v.push(new o(w.x+m,w.y+m,m,e)),x+=4)}return r&&(console.log("num probes: "+x),console.log("best distance: "+b.d)),[b.x,b.y]}function i(e,t){return t.max-e.max}function o(e,t,r,n){this.x=e,this.y=t,this.h=r,this.d=function(e,t,r){for(var n=!1,i=1/0,o=0;o<r.length;o++)for(var a=r[o],s=0,c=a.length,u=c-1;s<c;u=s++){var h=a[s],l=a[u];h[1]>t!=l[1]>t&&e<(l[0]-h[0])*(t-h[1])/(l[1]-h[1])+h[0]&&(n=!n),i=Math.min(i,function(e,t,r,n){var i=r[0],o=r[1],a=n[0]-i,s=n[1]-o;if(0!==a||0!==s){var c=((e-i)*a+(t-o)*s)/(a*a+s*s);c>1?(i=n[0],o=n[1]):c>0&&(i+=a*c,o+=s*c)}return a=e-i,s=t-o,a*a+s*s}(e,t,h,l))}return(n?1:-1)*Math.sqrt(i)}(e,t,n),this.max=this.d+this.h*Math.SQRT2}var a=e("tinyqueue");t.exports=n,t.exports.default=n},{tinyqueue:232}],2:[function(e,t,r){function n(e,t,r,n){this.cx=3*e,this.bx=3*(r-e)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*t,this.by=3*(n-t)-this.cy,this.ay=1-this.cy-this.by,this.p1x=e,this.p1y=n,this.p2x=r,this.p2y=n}t.exports=n,n.prototype.sampleCurveX=function(e){return((this.ax*e+this.bx)*e+this.cx)*e},n.prototype.sampleCurveY=function(e){return((this.ay*e+this.by)*e+this.cy)*e},n.prototype.sampleCurveDerivativeX=function(e){return(3*this.ax*e+2*this.bx)*e+this.cx},n.prototype.solveCurveX=function(e,t){void 0===t&&(t=1e-6);var r,n,i,o,a;for(i=e,a=0;a<8;a++){if(o=this.sampleCurveX(i)-e,Math.abs(o)<t)return i;var s=this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=o/s}if(r=0,n=1,(i=e)<r)return r;if(i>n)return n;for(;r<n;){if(o=this.sampleCurveX(i),Math.abs(o-e)<t)return i;e>o?r=i:n=i,i=.5*(n-r)+r}return i},n.prototype.solve=function(e,t){return this.sampleCurveY(this.solveCurveX(e,t))}},{}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return a[e>>18&63]+a[e>>12&63]+a[e>>6&63]+a[63&e]}function o(e,t,r){for(var n,o=[],a=t;a<r;a+=3)n=(e[a]<<16)+(e[a+1]<<8)+e[a+2],o.push(i(n));return o.join("")}r.byteLength=function(e){return 3*e.length/4-n(e)},r.toByteArray=function(e){var t,r,i,o,a,u=e.length;o=n(e),a=new c(3*u/4-o),r=o>0?u-4:u;var h=0;for(t=0;t<r;t+=4)i=s[e.charCodeAt(t)]<<18|s[e.charCodeAt(t+1)]<<12|s[e.charCodeAt(t+2)]<<6|s[e.charCodeAt(t+3)],a[h++]=i>>16&255,a[h++]=i>>8&255,a[h++]=255&i;return 2===o?(i=s[e.charCodeAt(t)]<<2|s[e.charCodeAt(t+1)]>>4,a[h++]=255&i):1===o&&(i=s[e.charCodeAt(t)]<<10|s[e.charCodeAt(t+1)]<<4|s[e.charCodeAt(t+2)]>>2,a[h++]=i>>8&255,a[h++]=255&i),a},r.fromByteArray=function(e){for(var t,r=e.length,n=r%3,i="",s=[],c=0,u=r-n;c<u;c+=16383)s.push(o(e,c,c+16383>u?u:c+16383));return 1===n?(t=e[r-1],i+=a[t>>2],i+=a[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=a[t>>10],i+=a[t>>4&63],i+=a[t<<2&63],i+="="),s.push(i),s.join("")};for(var a=[],s=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h=0,l=u.length;h<l;++h)a[h]=u[h],s[u.charCodeAt(h)]=h;s["-".charCodeAt(0)]=62,s["_".charCodeAt(0)]=63},{}],4:[function(e,t,r){},{}],5:[function(e,t,r){t.exports=function(e){var t=String.prototype.split,r=/()??/.exec("")[1]===e;return function(n,i,o){if("[object RegExp]"!==Object.prototype.toString.call(i))return t.call(n,i,o);var a,s,c,u,h=[],l=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.extended?"x":"")+(i.sticky?"y":""),p=0,i=new RegExp(i.source,l+"g");for(n+="",r||(a=new RegExp("^"+i.source+"$(?!\\s)",l)),o=o===e?-1>>>0:o>>>0;(s=i.exec(n))&&!((c=s.index+s[0].length)>p&&(h.push(n.slice(p,s.index)),!r&&s.length>1&&s[0].replace(a,function(){for(var t=1;t<arguments.length-2;t++)arguments[t]===e&&(s[t]=e)}),s.length>1&&s.index<n.length&&Array.prototype.push.apply(h,s.slice(1)),u=s[0].length,p=c,h.length>=o));)i.lastIndex===s.index&&i.lastIndex++;return p===n.length?!u&&i.test("")||h.push(""):h.push(n.slice(p)),h.length>o?h.slice(0,o):h}}()},{}],6:[function(e,t,r){function n(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function o(e){if(h===setTimeout)return setTimeout(e,0);if((h===n||!h)&&setTimeout)return h=setTimeout,setTimeout(e,0);try{return h(e,0)}catch(t){try{return h.call(null,e,0)}catch(t){return h.call(this,e,0)}}}function a(){m&&f&&(m=!1,f.length?d=f.concat(d):v=-1,d.length&&s())}function s(){if(!m){var e=o(a);m=!0;for(var t=d.length;t;){for(f=d,d=[];++v<t;)f&&f[v].run();v=-1,t=d.length}f=null,m=!1,function(e){if(l===clearTimeout)return clearTimeout(e);if((l===i||!l)&&clearTimeout)return l=clearTimeout,clearTimeout(e);try{l(e)}catch(t){try{return l.call(null,e)}catch(t){return l.call(this,e)}}}(e)}}function c(e,t){this.fun=e,this.array=t}function u(){}var h,l,p=t.exports={};!function(){try{h="function"==typeof setTimeout?setTimeout:n}catch(e){h=n}try{l="function"==typeof clearTimeout?clearTimeout:i}catch(e){l=i}}();var f,d=[],m=!1,v=-1;p.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];d.push(new c(e,t)),1!==d.length||m||o(s)},c.prototype.run=function(){this.fun.apply(null,this.array)},p.title="browser",p.browser=!0,p.env={},p.argv=[],p.version="",p.versions={},p.on=u,p.addListener=u,p.once=u,p.off=u,p.removeListener=u,p.removeAllListeners=u,p.emit=u,p.prependListener=u,p.prependOnceListener=u,p.listeners=function(e){return[]},p.binding=function(e){throw new Error("process.binding is not supported")},p.cwd=function(){return"/"},p.chdir=function(e){throw new Error("process.chdir is not supported")},p.umask=function(){return 0}},{}],7:[function(e,t,r){"use strict";function n(e){if(e>I)throw new RangeError("Invalid typed array length");var t=new Uint8Array(e);return t.__proto__=i.prototype,t}function i(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return s(e)}return o(e,t,r)}function o(e,t,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return j(e)?function(e,t,r){if(t<0||e.byteLength<t)throw new RangeError("'offset' is out of bounds");if(e.byteLength<t+(r||0))throw new RangeError("'length' is out of bounds");var n;n=void 0===t&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,t):new Uint8Array(e,t,r);return n.__proto__=i.prototype,n}(e,t,r):"string"==typeof e?function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!i.isEncoding(t))throw new TypeError('"encoding" must be a valid string encoding');var r=0|h(e,t),o=n(r),a=o.write(e,t);a!==r&&(o=o.slice(0,a));return o}(e,t):function(e){if(i.isBuffer(e)){var t=0|u(e.length),r=n(t);return 0===r.length?r:(e.copy(r,0,0,t),r)}if(e){if(A(e)||"length"in e)return"number"!=typeof e.length||R(e.length)?n(0):c(e);if("Buffer"===e.type&&Array.isArray(e.data))return c(e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e)}function a(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function s(e){return a(e),n(e<0?0:0|u(e))}function c(e){for(var t=e.length<0?0:0|u(e.length),r=n(t),i=0;i<t;i+=1)r[i]=255&e[i];return r}function u(e){if(e>=I)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+I.toString(16)+" bytes");return 0|e}function h(e,t){if(i.isBuffer(e))return e.length;if(A(e)||j(e))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return T(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return O(e).length;default:if(n)return T(e).length;t=(""+t).toLowerCase(),n=!0}}function l(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,t>>>=0,r<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return function(e,t,r){var n=e.length;(!t||t<0)&&(t=0);(!r||r<0||r>n)&&(r=n);for(var i="",o=t;o<r;++o)i+=function(e){return e<16?"0"+e.toString(16):e.toString(16)}(e[o]);return i}(this,t,r);case"utf8":case"utf-8":return x(this,t,r);case"ascii":return function(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(127&e[i]);return n}(this,t,r);case"latin1":case"binary":return function(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(e[i]);return n}(this,t,r);case"base64":return function(e,t,r){return 0===t&&r===e.length?L.fromByteArray(e):L.fromByteArray(e.slice(t,r))}(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return function(e,t,r){for(var n=e.slice(t,r),i="",o=0;o<n.length;o+=2)i+=String.fromCharCode(n[o]+256*n[o+1]);return i}(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function p(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function f(e,t,r,n,o){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,R(r)&&(r=o?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(o)return-1;r=e.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof t&&(t=i.from(t,n)),i.isBuffer(t))return 0===t.length?-1:d(e,t,r,n,o);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):d(e,[t],r,n,o);throw new TypeError("val must be string, number or Buffer")}function d(e,t,r,n,i){function o(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,s=e.length,c=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,c/=2,r/=2}var u;if(i){var h=-1;for(u=r;u<s;u++)if(o(e,u)===o(t,-1===h?0:u-h)){if(-1===h&&(h=u),u-h+1===c)return h*a}else-1!==h&&(u-=u-h),h=-1}else for(r+c>s&&(r=s-c),u=r;u>=0;u--){for(var l=!0,p=0;p<c;p++)if(o(e,u+p)!==o(t,p)){l=!1;break}if(l)return u}return-1}function m(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n))>i&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a<n;++a){var s=parseInt(t.substr(2*a,2),16);if(R(s))return a;e[r+a]=s}return a}function v(e,t,r,n){return P(T(t,e.length-r),e,r,n)}function g(e,t,r,n){return P(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,n)}function y(e,t,r,n){return g(e,t,r,n)}function b(e,t,r,n){return P(O(t),e,r,n)}function _(e,t,r,n){return P(function(e,t){for(var r,n,i,o=[],a=0;a<e.length&&!((t-=2)<0);++a)r=e.charCodeAt(a),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function x(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i<r;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(i+s<=r){var c,u,h,l;switch(s){case 1:o<128&&(a=o);break;case 2:128==(192&(c=e[i+1]))&&(l=(31&o)<<6|63&c)>127&&(a=l);break;case 3:c=e[i+1],u=e[i+2],128==(192&c)&&128==(192&u)&&(l=(15&o)<<12|(63&c)<<6|63&u)>2047&&(l<55296||l>57343)&&(a=l);break;case 4:c=e[i+1],u=e[i+2],h=e[i+3],128==(192&c)&&128==(192&u)&&128==(192&h)&&(l=(15&o)<<18|(63&c)<<12|(63&u)<<6|63&h)>65535&&l<1114112&&(a=l)}}null===a?(a=65533,s=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|1023&a),n.push(a),i+=s}return function(e){var t=e.length;if(t<=D)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n<t;)r+=String.fromCharCode.apply(String,e.slice(n,n+=D));return r}(n)}function w(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function S(e,t,r,n,o,a){if(!i.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||t<a)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function M(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function E(e,t,r,n,i){return t=+t,r>>>=0,i||M(e,0,r,4),N.write(e,t,r,n,23,4),r+4}function C(e,t,r,n,i){return t=+t,r>>>=0,i||M(e,0,r,8),N.write(e,t,r,n,52,8),r+8}function T(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],a=0;a<n;++a){if((r=e.charCodeAt(a))>55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function O(e){return L.toByteArray(function(e){if((e=e.trim().replace(k,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function P(e,t,r,n){for(var i=0;i<n&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function j(e){return e instanceof ArrayBuffer||null!=e&&null!=e.constructor&&"ArrayBuffer"===e.constructor.name&&"number"==typeof e.byteLength}function A(e){return"function"==typeof ArrayBuffer.isView&&ArrayBuffer.isView(e)}function R(e){return e!=e}var L=e("base64-js"),N=e("ieee754");r.Buffer=i,r.SlowBuffer=function(e){return+e!=e&&(e=0),i.alloc(+e)},r.INSPECT_MAX_BYTES=50;var I=2147483647;r.kMaxLength=I,(i.TYPED_ARRAY_SUPPORT=function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()}catch(e){return!1}}())||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),"undefined"!=typeof Symbol&&Symbol.species&&i[Symbol.species]===i&&Object.defineProperty(i,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),i.poolSize=8192,i.from=function(e,t,r){return o(e,t,r)},i.prototype.__proto__=Uint8Array.prototype,i.__proto__=Uint8Array,i.alloc=function(e,t,r){return function(e,t,r){return a(e),e<=0?n(e):void 0!==t?"string"==typeof r?n(e).fill(t,r):n(e).fill(t):n(e)}(e,t,r)},i.allocUnsafe=function(e){return s(e)},i.allocUnsafeSlow=function(e){return s(e)},i.isBuffer=function(e){return null!=e&&!0===e._isBuffer},i.compare=function(e,t){if(!i.isBuffer(e)||!i.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,o=0,a=Math.min(r,n);o<a;++o)if(e[o]!==t[o]){r=e[o],n=t[o];break}return r<n?-1:n<r?1:0},i.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},i.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return i.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var n=i.allocUnsafe(t),o=0;for(r=0;r<e.length;++r){var a=e[r];if(!i.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,o),o+=a.length}return n},i.byteLength=h,i.prototype._isBuffer=!0,i.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)p(this,t,t+1);return this},i.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)p(this,t,t+3),p(this,t+1,t+2);return this},i.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)p(this,t,t+7),p(this,t+1,t+6),p(this,t+2,t+5),p(this,t+3,t+4);return this},i.prototype.toString=function(){var e=this.length;return 0===e?"":0===arguments.length?x(this,0,e):l.apply(this,arguments)},i.prototype.equals=function(e){if(!i.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===i.compare(this,e)},i.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),"<Buffer "+e+">"},i.prototype.compare=function(e,t,r,n,o){if(!i.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),t<0||r>e.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&t>=r)return 0;if(n>=o)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,o>>>=0,this===e)return 0;for(var a=o-n,s=r-t,c=Math.min(a,s),u=this.slice(n,o),h=e.slice(t,r),l=0;l<c;++l)if(u[l]!==h[l]){a=u[l],s=h[l];break}return a<s?-1:s<a?1:0},i.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},i.prototype.indexOf=function(e,t,r){return f(this,e,t,r,!0)},i.prototype.lastIndexOf=function(e,t,r){return f(this,e,t,r,!1)},i.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return m(this,e,t,r);case"utf8":case"utf-8":return v(this,e,t,r);case"ascii":return g(this,e,t,r);case"latin1":case"binary":return y(this,e,t,r);case"base64":return b(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},i.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var D=4096;i.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,e<0?(e+=r)<0&&(e=0):e>r&&(e=r),t<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e);var n=this.subarray(e,t);return n.__proto__=i.prototype,n},i.prototype.readUIntLE=function(e,t,r){e>>>=0,t>>>=0,r||w(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return n},i.prototype.readUIntBE=function(e,t,r){e>>>=0,t>>>=0,r||w(e,t,this.length);for(var n=this[e+--t],i=1;t>0&&(i*=256);)n+=this[e+--t]*i;return n},i.prototype.readUInt8=function(e,t){return e>>>=0,t||w(e,1,this.length),this[e]},i.prototype.readUInt16LE=function(e,t){return e>>>=0,t||w(e,2,this.length),this[e]|this[e+1]<<8},i.prototype.readUInt16BE=function(e,t){return e>>>=0,t||w(e,2,this.length),this[e]<<8|this[e+1]},i.prototype.readUInt32LE=function(e,t){return e>>>=0,t||w(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},i.prototype.readUInt32BE=function(e,t){return e>>>=0,t||w(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},i.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||w(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*t)),n},i.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||w(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},i.prototype.readInt8=function(e,t){return e>>>=0,t||w(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},i.prototype.readInt16LE=function(e,t){e>>>=0,t||w(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt16BE=function(e,t){e>>>=0,t||w(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt32LE=function(e,t){return e>>>=0,t||w(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},i.prototype.readInt32BE=function(e,t){return e>>>=0,t||w(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},i.prototype.readFloatLE=function(e,t){return e>>>=0,t||w(e,4,this.length),N.read(this,e,!0,23,4)},i.prototype.readFloatBE=function(e,t){return e>>>=0,t||w(e,4,this.length),N.read(this,e,!1,23,4)},i.prototype.readDoubleLE=function(e,t){return e>>>=0,t||w(e,8,this.length),N.read(this,e,!0,52,8)},i.prototype.readDoubleBE=function(e,t){return e>>>=0,t||w(e,8,this.length),N.read(this,e,!1,52,8)},i.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t>>>=0,r>>>=0,!n){S(this,e,t,r,Math.pow(2,8*r)-1,0)}var i=1,o=0;for(this[t]=255&e;++o<r&&(i*=256);)this[t+o]=e/i&255;return t+r},i.prototype.writeUIntBE=function(e,t,r,n){if(e=+e,t>>>=0,r>>>=0,!n){S(this,e,t,r,Math.pow(2,8*r)-1,0)}var i=r-1,o=1;for(this[t+i]=255&e;--i>=0&&(o*=256);)this[t+i]=e/o&255;return t+r},i.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,1,255,0),this[t]=255&e,t+1},i.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},i.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},i.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},i.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},i.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);S(this,e,t,r,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o<r&&(a*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},i.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var i=Math.pow(2,8*r-1);S(this,e,t,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},i.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},i.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},i.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},i.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},i.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||S(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},i.prototype.writeFloatLE=function(e,t,r){return E(this,e,t,!0,r)},i.prototype.writeFloatBE=function(e,t,r){return E(this,e,t,!1,r)},i.prototype.writeDoubleLE=function(e,t,r){return C(this,e,t,!0,r)},i.prototype.writeDoubleBE=function(e,t,r){return C(this,e,t,!1,r)},i.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-r&&(n=e.length-t+r);var i,o=n-r;if(this===e&&r<t&&t<n)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(o<1e3)for(i=0;i<o;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},i.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var o=e.charCodeAt(0);o<256&&(e=o)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!i.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var a;if("number"==typeof e)for(a=t;a<r;++a)this[a]=e;else{var s=i.isBuffer(e)?e:new i(e,n),c=s.length;for(a=0;a<r-t;++a)this[a+t]=s[a%c]}return this};var k=/[^+/0-9A-Za-z-_]/g},{"base64-js":3,ieee754:17}],8:[function(e,t,r){"use strict";function n(e,t,r){r=r||2;var n=t&&t.length,c=n?t[0]*r:e.length,h=i(e,0,c,r,!0),l=[];if(!h)return l;var p,m,v,g,y,b,_;if(n&&(h=function(e,t,r,n){var a,c,h,l,p,m=[];for(a=0,c=t.length;a<c;a++)h=t[a]*n,l=a<c-1?t[a+1]*n:e.length,(p=i(e,h,l,n,!1))===p.next&&(p.steiner=!0),m.push(function(e){var t=e,r=e;do{t.x<r.x&&(r=t),t=t.next}while(t!==e);return r}(p));for(m.sort(s),a=0;a<m.length;a++)!function(e,t){if(t=function(e,t){var r,n=t,i=e.x,o=e.y,a=-1/0;do{if(o<=n.y&&o>=n.next.y&&n.next.y!==n.y){var s=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>a){if(a=s,s===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x<n.next.x?n:n.next}}n=n.next}while(n!==t);if(!r)return null;if(i===a)return r.prev;var c,h=r,l=r.x,p=r.y,d=1/0;for(n=r.next;n!==h;)i>=n.x&&n.x>=l&&i!==n.x&&u(o<p?i:a,o,l,p,o<p?a:i,o,n.x,n.y)&&((c=Math.abs(o-n.y)/(i-n.x))<d||c===d&&n.x>r.x)&&f(n,e)&&(r=n,d=c),n=n.next;return r}(e,t)){var r=d(t,e);o(r,r.next)}}(m[a],r),r=o(r,r.next);return r}(e,t,h,r)),e.length>80*r){p=v=e[0],m=g=e[1];for(var x=r;x<c;x+=r)y=e[x],b=e[x+1],y<p&&(p=y),b<m&&(m=b),y>v&&(v=y),b>g&&(g=b);_=0!==(_=Math.max(v-p,g-m))?1/_:0}return a(h,l,r,p,m,_),l}function i(e,t,r,n,i){var o,a;if(i===y(e,t,r,n)>0)for(o=t;o<r;o+=n)a=m(o,e[o],e[o+1],a);else for(o=r-n;o>=t;o-=n)a=m(o,e[o],e[o+1],a);return a&&l(a,a.next)&&(v(a),a=a.next),a}function o(e,t){if(!e)return e;t||(t=e);var r,n=e;do{if(r=!1,n.steiner||!l(n,n.next)&&0!==h(n.prev,n,n.next))n=n.next;else{if(v(n),(n=t=n.prev)===n.next)break;r=!0}}while(r||n!==t);return t}function a(e,t,r,n,i,s,m){if(e){!m&&s&&function(e,t,r,n){var i=e;do{null===i.z&&(i.z=c(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,function(e){var t,r,n,i,o,a,s,c,u=1;do{for(r=e,e=null,o=null,a=0;r;){for(a++,n=r,s=0,t=0;t<u&&(s++,n=n.nextZ);t++);for(c=u;s>0||c>0&&n;)0!==s&&(0===c||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,c--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,u*=2}while(a>1)}(i)}(e,n,i,s);for(var g,y,b=e;e.prev!==e.next;)if(g=e.prev,y=e.next,s?function(e,t,r,n){var i=e.prev,o=e,a=e.next;if(h(i,o,a)>=0)return!1;var s=i.x<o.x?i.x<a.x?i.x:a.x:o.x<a.x?o.x:a.x,l=i.y<o.y?i.y<a.y?i.y:a.y:o.y<a.y?o.y:a.y,p=i.x>o.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,f=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,d=c(s,l,t,r,n),m=c(p,f,t,r,n),v=e.nextZ;for(;v&&v.z<=m;){if(v!==e.prev&&v!==e.next&&u(i.x,i.y,o.x,o.y,a.x,a.y,v.x,v.y)&&h(v.prev,v,v.next)>=0)return!1;v=v.nextZ}v=e.prevZ;for(;v&&v.z>=d;){if(v!==e.prev&&v!==e.next&&u(i.x,i.y,o.x,o.y,a.x,a.y,v.x,v.y)&&h(v.prev,v,v.next)>=0)return!1;v=v.prevZ}return!0}(e,n,i,s):function(e){var t=e.prev,r=e,n=e.next;if(h(t,r,n)>=0)return!1;var i=e.next.next;for(;i!==e.prev;){if(u(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&h(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}(e))t.push(g.i/r),t.push(e.i/r),t.push(y.i/r),v(e),e=y.next,b=y.next;else if((e=y)===b){m?1===m?a(e=function(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!l(i,o)&&p(i,n,n.next,o)&&f(i,o)&&f(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),v(n),v(n.next),n=e=o),n=n.next}while(n!==e);return n}(e,t,r),t,r,n,i,s,2):2===m&&function(e,t,r,n,i,s){var c=e;do{for(var u=c.next.next;u!==c.prev;){if(c.i!==u.i&&function(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&p(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}(e,t)&&f(e,t)&&f(t,e)&&function(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==e);return n}(e,t)}(c,u)){var h=d(c,u);return c=o(c,c.next),h=o(h,h.next),a(c,t,r,n,i,s),void a(h,t,r,n,i,s)}u=u.next}c=c.next}while(c!==e)}(e,t,r,n,i,s):a(o(e),t,r,n,i,s,1);break}}}function s(e,t){return e.x-t.x}function c(e,t,r,n,i){return e=32767*(e-r)*i,t=32767*(t-n)*i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function u(e,t,r,n,i,o,a,s){return(i-a)*(t-s)-(e-a)*(o-s)>=0&&(e-a)*(n-s)-(r-a)*(t-s)>=0&&(r-a)*(o-s)-(i-a)*(n-s)>=0}function h(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function l(e,t){return e.x===t.x&&e.y===t.y}function p(e,t,r,n){return!!(l(e,t)&&l(r,n)||l(e,n)&&l(r,t))||h(e,t,r)>0!=h(e,t,n)>0&&h(r,n,e)>0!=h(r,n,t)>0}function f(e,t){return h(e.prev,e,e.next)<0?h(e,t,e.next)>=0&&h(e,e.prev,t)>=0:h(e,t,e.prev)<0||h(e,e.next,t)<0}function d(e,t){var r=new g(e.i,e.x,e.y),n=new g(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function m(e,t,r,n){var i=new g(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function v(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function g(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function y(e,t,r,n){for(var i=0,o=t,a=r-n;o<r;o+=n)i+=(e[a]-e[o])*(e[o+1]+e[a+1]),a=o;return i}t.exports=n,t.exports.default=n,n.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,a=Math.abs(y(e,0,o,r));if(i)for(var s=0,c=t.length;s<c;s++){var u=t[s]*r,h=s<c-1?t[s+1]*r:e.length;a-=Math.abs(y(e,u,h,r))}var l=0;for(s=0;s<n.length;s+=3){var p=n[s]*r,f=n[s+1]*r,d=n[s+2]*r;l+=Math.abs((e[p]-e[d])*(e[f+1]-e[p+1])-(e[p]-e[f])*(e[d+1]-e[p+1]))}return 0===a&&0===l?0:Math.abs((l-a)/a)},n.flatten=function(e){for(var t=e[0][0].length,r={vertices:[],holes:[],dimensions:t},n=0,i=0;i<e.length;i++){for(var o=0;o<e[i].length;o++)for(var a=0;a<t;a++)r.vertices.push(e[i][o][a]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],9:[function(e,t,r){"use strict";e("individual/one-version")("ev-store","7");var n="__EV_STORE_KEY@7";t.exports=function(e){var t=e[n];return t||(t=e[n]={}),t}},{"individual/one-version":19}],10:[function(e,t,r){"use strict";function n(e,t){var r;for(r in t)e[r]=t[r];return e}function i(e,t){if(this._jsongUrl=e,"number"==typeof t){t={timeout:t}}this._config=n({timeout:15e3,headers:{}},t||{})}var o=e("./request"),a=e("./buildQueryObject");Array.isArray;i.prototype={constructor:i,buildQueryObject:a,get:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"GET",{paths:e,method:"get"}),this._config);return o("GET",t,this)},set:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"POST",{jsonGraph:e,method:"set"}),this._config);t.headers["Content-Type"]="application/x-www-form-urlencoded";return o("POST",t,this)},call:function(e,t,r,i){t=t||[],r=r||[],i=i||[];var a=[];a.push("method=call"),a.push("callPath="+encodeURIComponent(JSON.stringify(e))),a.push("arguments="+encodeURIComponent(JSON.stringify(t))),a.push("pathSuffixes="+encodeURIComponent(JSON.stringify(r))),a.push("paths="+encodeURIComponent(JSON.stringify(i)));var s=n(this.buildQueryObject(this._jsongUrl,"POST",a.join("&")),this._config);s.headers["Content-Type"]="application/x-www-form-urlencoded";return o("POST",s,this)}},i.XMLHttpSource=i,i.default=i,t.exports=i},{"./buildQueryObject":11,"./request":14}],11:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n=[],i={url:e},o=-1!==e.indexOf("?")?"&":"?";return"string"==typeof r?n.push(r):Object.keys(r).forEach(function(e){var t="object"==typeof r[e]?JSON.stringify(r[e]):r[e];n.push(e+"="+encodeURIComponent(t))}),"GET"===t?i.url+=o+n.join("&"):i.data=n.join("&"),i}},{}],12:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t=new e.XMLHttpRequest;if("withCredentials"in t)return t;if(e.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],13:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t,r,n;if(e.XMLHttpRequest)return new e.XMLHttpRequest;try{for(r=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],n=0;n<3;n++)try{if(t=r[n],new e.ActiveXObject(t))break}catch(e){}return new e.ActiveXObject(t)}catch(e){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],14:[function(e,t,r){"use strict";function n(){}function i(e,t,r){return n.create(function(n){var i,u,h,l,p,f={method:e||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(p in t)c.call(t,p)&&(f[p]=t[p]);f.crossDomain||f.headers["X-Requested-With"]||(f.headers["X-Requested-With"]="XMLHttpRequest"),null!=r.onBeforeRequest&&r.onBeforeRequest(f);try{i=f.crossDomain?s():a()}catch(e){n.onError(e)}try{f.user?i.open(f.method,f.url,f.async,f.user,f.password):i.open(f.method,f.url,f.async),i.timeout=f.timeout,i.withCredentials=!1!==f.withCredentials,h=f.headers;for(l in h)c.call(h,l)&&i.setRequestHeader(l,h[l]);if(f.responseType)try{i.responseType=f.responseType}catch(e){if("json"!==f.responseType)throw e}i.onreadystatechange=function(e){4===i.readyState&&(u||(u=!0,function(e,t,r){var n,i;if(t&&e){i=t.responseType,n="response"in t?t.response:t.responseText;var a=1223===t.status?204:t.status;if(a>=200&&a<=399){try{"json"!==i&&(n=JSON.parse(n||"")),"string"==typeof n&&(n=JSON.parse(n||""))}catch(r){o(e,"invalid json",r)}return e.onNext(n),void e.onCompleted()}401===a||403===a||407===a?o(e,n):410===a?o(e,n):408===a||504===a?o(e,n):o(e,n||"Response code "+a)}}(n,i)))},i.ontimeout=function(e){u||(u=!0,function(e,t,r,n){o(e,"timeout error"||t.statusText||"request error",n)}(n,i,0,e))},i.send(f.data)}catch(e){n.onError(e)}return function(){u||4===i.readyState||(u=!0,i.abort())}})}function o(e,t,r){r||(r=new Error(t)),e.onError(r)}var a=e("./getXMLHttpRequest"),s=e("./getCORSRequest"),c=Object.prototype.hasOwnProperty,u=function(){};n.create=function(e){var t=new n;return t.subscribe=function(t,r,n){var i,o;return i="function"==typeof t?{onNext:t,onError:r||u,onCompleted:n||u}:t,"function"==typeof(o=e(i))?{dispose:o}:o},t},t.exports=i},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(e,t,r){(function(n){!function(e){if("object"==typeof r&&void 0!==t)t.exports=e();else{("undefined"!=typeof window?window:void 0!==n?n:"undefined"!=typeof self?self:this).falcor=e()}}(function(){return function t(r,n,i){function o(s,c){if(!n[s]){if(!r[s]){var u="function"==typeof e&&e;if(!c&&u)return u(s,!0);if(a)return a(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[s]={exports:{}};r[s][0].call(l.exports,function(e){var t=r[s][1][e];return o(t||e)},l,l.exports,t,r,n,i)}return n[s].exports}for(var a="function"==typeof e&&e,s=0;s<i.length;s++)o(i[s]);return o}({1:[function(e,t,r){var n=e(32),i=e(130);n.atom=i.atom,n.ref=i.ref,n.error=i.error,n.pathValue=i.pathValue,n.HttpDataSource=e(125),t.exports=n},{125:125,130:130,32:32}],2:[function(e,t,r){function n(e){var t=e||{};this._root=t._root||new i(t),this._path=t.path||t._path||[],this._scheduler=t.scheduler||t._scheduler||new f,this._source=t.source||t._source,this._request=t.request||t._request||new a(this,this._scheduler),this._ID=T++,"number"==typeof t.maxSize?this._maxSize=t.maxSize:this._maxSize=t._maxSize||n.prototype._maxSize,"number"==typeof t.collectRatio?this._collectRatio=t.collectRatio:this._collectRatio=t._collectRatio||n.prototype._collectRatio,(t.boxed||t.hasOwnProperty("_boxed"))&&(this._boxed=t.boxed||t._boxed),(t.materialized||t.hasOwnProperty("_materialized"))&&(this._materialized=t.materialized||t._materialized),"boolean"==typeof t.treatErrorsAsValues?this._treatErrorsAsValues=t.treatErrorsAsValues:t.hasOwnProperty("_treatErrorsAsValues")&&(this._treatErrorsAsValues=t._treatErrorsAsValues),t.cache&&this.setCache(t.cache)}var i=e(4),o=e(3),a=e(55),s=e(64),c=e(65),u=e(61),h=e(63),l=e(73),p=e(75),f=e(74),d=e(81),m=e(84),v=e(49),g=e(134),y=e(88),b=e(100),_=e(96),x=e(102),w=e(98),S=e(99),M=e(77),E=e(76),C=e(130),T=0,O=e(116),P=function(){},j=e(14),A=e(19),R={pathValue:!0,pathSyntax:!0,json:!0,jsonGraph:!0},L=e(72);t.exports=n,n.ref=C.ref,n.atom=C.atom,n.error=C.error,n.pathValue=C.pathValue,n.prototype.constructor=n,n.prototype._materialized=!1,n.prototype._boxed=!1,n.prototype._progressive=!1,n.prototype._treatErrorsAsValues=!1,n.prototype._maxSize=Math.pow(2,53)-1,n.prototype._collectRatio=.75,n.prototype.get=e(71),n.prototype._getWithPaths=e(70),n.prototype.set=function(){var e=O(arguments,R,"set");return!0!==e?new s(function(t){t.onError(e)}):this._set.apply(this,arguments)},n.prototype.preload=function(){var e=O(arguments,L,"preload");if(!0!==e)return new s(function(t){t.onError(e)});var t=Array.prototype.slice.call(arguments),r=this;return new s(function(e){return r.get.apply(r,t).subscribe(function(){},function(t){e.onError(t)},function(){e.onCompleted()})})},n.prototype._set=function(){var e,t=-1,r=arguments.length,n=arguments[r-1];for(_(n)?r-=1:n=void 0,e=new Array(r);++t<r;)e[t]=arguments[t];return c.create(this,e,n)},n.prototype.call=function(){var e,t=-1,r=arguments.length;for(e=new Array(r);++t<r;){var n=arguments[t];e[t]=n;var i=typeof n;if(t>1&&!Array.isArray(n)||0===t&&!Array.isArray(n)&&"string"!==i||1===t&&!Array.isArray(n)&&!x(n))return new s(function(e){e.onError(new Error("Invalid argument"))})}return u.create(this,e)},n.prototype.invalidate=function(){var e,t=-1,r=arguments.length,n=arguments[r-1];for(e=new Array(r);++t<r;)if(e[t]=g.fromPath(arguments[t]),"object"!=typeof e[t])throw new Error("Invalid argument");h.create(this,e,n).subscribe(P,function(e){throw e})},n.prototype.deref=e(5),n.prototype.getValue=e(16),n.prototype.setValue=e(79),n.prototype._getValueSync=e(24),n.prototype._setValueSync=e(80),n.prototype._derefSync=e(6),n.prototype.setCache=function(e){var t=this._root.cache;if(e!==t){var r=this._root,n=this._path;this._path=[],this._root.cache={},void 0!==t&&v(r,r.expired,y(t),0),S(e)?E(this,[e]):w(e)?M(this,[e]):b(e)&&M(this,[{json:e}]),this._path=n}else void 0===t&&(this._root.cache={});return this},n.prototype.getCache=function(){var e=m(arguments);if(0===e.length)return j(this._root.cache);var t=[{}],r=this._path;return A.getWithPathsAsJSONGraph(this,e,t),this._path=r,t[0].jsonGraph},n.prototype.getVersion=function(e){var t=e&&g.fromPath(e)||[];if(!1===Array.isArray(t))throw new Error("Model#getVersion must be called with an Array path.");return this._path.length&&(t=this._path.concat(t)),this._getVersion(this,t)},n.prototype._syncCheck=function(e){if(Boolean(this._source)&&this._root.syncRefCount<=0&&!1===this._root.unsafeMode)throw new Error("Model#"+e+" may only be called within the context of a request selector.");return!0},n.prototype._clone=function(e){var t=new n(this);for(var r in e){var i=e[r];"delete"===i?delete t[r]:t[r]=i}return t.setCache=void 0,t},n.prototype.batch=function(e){var t=e;"number"==typeof t?t=new p(Math.round(Math.abs(t))):t&&t.schedule||(t=new l);var r=this._clone();return r._request=new a(r,t),r},n.prototype.unbatch=function(){var e=this._clone();return e._request=new a(e,new f),e},n.prototype.treatErrorsAsValues=function(){return this._clone({_treatErrorsAsValues:!0})},n.prototype.asDataSource=function(){return new o(this)},n.prototype._materialize=function(){return this._clone({_materialized:!0})},n.prototype._dematerialize=function(){return this._clone({_materialized:"delete"})},n.prototype.boxValues=function(){return this._clone({_boxed:!0})},n.prototype.unboxValues=function(){return this._clone({_boxed:"delete"})},n.prototype.withoutDataSource=function(){return this._clone({_source:"delete"})},n.prototype.toJSON=function(){return{$type:"ref",value:this._path}},n.prototype.getPath=function(){return d(this._path)},n.prototype._getBoundValue=e(13),n.prototype._getVersion=e(18),n.prototype._getValueSync=e(17),n.prototype._getPathValuesAsPathMap=A.getWithPathsAsPathMap,n.prototype._getPathValuesAsJSONG=A.getWithPathsAsJSONGraph,n.prototype._setPathValuesAsJSON=e(78),n.prototype._setPathValuesAsJSONG=e(78),n.prototype._setPathValuesAsPathMap=e(78),n.prototype._setPathValuesAsValues=e(78),n.prototype._setPathMapsAsJSON=e(77),n.prototype._setPathMapsAsJSONG=e(77),n.prototype._setPathMapsAsPathMap=e(77),n.prototype._setPathMapsAsValues=e(77),n.prototype._setJSONGsAsJSON=e(76),n.prototype._setJSONGsAsJSONG=e(76),n.prototype._setJSONGsAsPathMap=e(76),n.prototype._setJSONGsAsValues=e(76),n.prototype._setCache=e(77),n.prototype._invalidatePathValuesAsJSON=e(48),n.prototype._invalidatePathMapsAsJSON=e(47)},{100:100,102:102,116:116,13:13,130:130,134:134,14:14,16:16,17:17,18:18,19:19,24:24,3:3,4:4,47:47,48:48,49:49,5:5,55:55,6:6,61:61,63:63,64:64,65:65,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,84:84,88:88,96:96,98:98,99:99}],3:[function(e,t,r){function n(e){this._model=e._materialize().treatErrorsAsValues()}n.prototype.get=function(e){return this._model.get.apply(this._model,e)._toJSONG()},n.prototype.set=function(e){return this._model.set(e)._toJSONG()},n.prototype.call=function(e,t,r,n){var i=[e,t,r].concat(n);return this._model.call.apply(this._model,i)._toJSONG()},t.exports=n},{}],4:[function(e,t,r){function n(e){var t=e||{};this.syncRefCount=0,this.expired=t.expired||[],this.unsafeMode=t.unsafeMode||!1,this.collectionScheduler=t.collectionScheduler||new a,this.cache={},i(t.comparator)&&(this.comparator=t.comparator),i(t.errorSelector)&&(this.errorSelector=t.errorSelector),i(t.onChange)&&(this.onChange=t.onChange)}var i=e(96),o=e(91),a=e(74);n.prototype.errorSelector=function(e,t){return t},n.prototype.comparator=function(e,t){return o(e,"value")&&o(t,"value")?e.value===t.value&&e.$type===t.$type&&e.$expires===t.$expires:e===t},t.exports=n},{74:74,91:91,96:96}],5:[function(e,t,r){function n(e,t){var r,n=!1;try{++e._root.syncRefCount,r=e._derefSync(t)}catch(e){r=e,n=!0}finally{--e._root.syncRefCount}return n?i.Observable.throw(r):i.Observable.return(r)}var i=e(159),o=e(134);t.exports=function(e){for(var t=this,r=-1,a=arguments.length-1,s=new Array(a),c=o.fromPath(e);++r<a;)s[r]=o.fromPath(arguments[r+1]);if(0===a)throw new Error("Model#deref requires at least one value path.");return i.Observable.defer(function(){return n(t,c)}).flatMap(function(e){if(Boolean(e)){if(a>0){var r=i.Observable.of(e);return e.get.apply(e,s).catch(i.Observable.empty()).concat(r).last().flatMap(function(){return n(t,c)}).filter(function(e){return e})}return i.Observable.return(e)}if(a>0){var o=s.map(function(e){return c.concat(e)});return t.get.apply(t,o).concat(i.Observable.defer(function(){return n(t,c)})).last().filter(function(e){return e})}return i.Observable.empty()})}},{134:134,159:159}],6:[function(e,t,r){var n=e(134),i=e(13),o=e(8),a=e(118);t.exports=function(e){var t=n.fromPath(e);if(!Array.isArray(t))throw new Error("Model#derefSync must be called with an Array path.");var r=i(this,this._path.concat(t),!1),s=r.path,c=r.value;if(r.found&&void 0!==c&&(c.$type!==a||void 0!==c.value)){if(c.$type)throw new o;return this._clone({_path:s})}}},{118:118,13:13,134:134,8:8}],7:[function(e,t,r){function n(){this.message=n.message,this.stack=(new Error).stack}(n.prototype=new Error).name="BoundJSONGraphModelError",n.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",t.exports=n},{}],8:[function(e,t,r){function n(e,t){this.message=i,this.stack=(new Error).stack,this.boundPath=e,this.shortedPath=t}var i="The boundPath of the model is not valid since a value or error was found before the path end.";(n.prototype=new Error).name="InvalidModelError",n.message=i,t.exports=n},{}],9:[function(e,t,r){function n(e){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=e}var i="InvalidSourceError";(n.prototype=new Error).name=i,n.is=function(e){return e&&e.name===i},t.exports=n},{}],10:[function(e,t,r){function n(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var i="MaxRetryExceededError";(n.prototype=new Error).name=i,n.is=function(e){return e&&e.name===i},t.exports=n},{}],11:[function(e,t,r){var n=e(26).create,i=e(22),o=e(27),a=e(120),s=e(33),c=e(29).promote;t.exports=function(e,t,r,u,h,l,p){for(var f,d,m=r,v=h,g=u,y=0;;){if(0===y&&g[s]?(y=v.length,d=g[s]):(f=v[y++],d=m[f]),d){var b=d.$type,_=b&&d.value||d;if(y<v.length){if(b){m=d;break}m=d;continue}if(m=d,b&&o(d))break;if(g[s]||n(g,d),b===a){p?i(e,d,l,null,null,null,v,v.length,p):c(e,d),y=0,v=_,g=d,m=t;continue}break}m=void 0;break}if(y<v.length&&void 0!==m){for(var x=[],w=0;y>w;w++)x[w]=v[w];v=x}return[m,v]}},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(e,t,r){var n=e(15),i=e(8),o=e(7);t.exports=function(e,t){return function(r,a,s){var c,u,h,l=s[0],p={values:s,optimizedPaths:[]},f=r._root.cache,d=r._path,m=f,v=d.length,g=[];if(v){if(t)return{criticalError:new o};if((m=n(r,d)).$type)return{criticalError:new i(d,d)};for(c=[],u=0;v>u;++u)c[u]=d[u]}else c=[],v=0;for(u=0,h=a.length;h>u;u++)e(r,f,m,a[u],0,l,p,g,c,v,t);return p}}},{15:15,7:7,8:8}],13:[function(e,t,r){var n=e(17),i=e(8);t.exports=function(e,t,r){var o,a,s,c,u,h=t,l=t;for(o=e._boxed,r=e._materialized,a=e._treatErrorsAsValues,e._boxed=!0,e._materialized=void 0===r||r,e._treatErrorsAsValues=!0,s=n(e,h.concat(null),!0),e._boxed=o,e._materialized=r,e._treatErrorsAsValues=a,h=s.optimizedPath,c=s.shorted,u=s.found,s=s.value;h.length&&null===h[h.length-1];)h.pop();if(u&&c)throw new i(l,h);return{path:h,value:s,shorted:c,found:u}}},{17:17,8:8}],14:[function(e,t,r){function n(e){var t,r,n,i={},o=Object.keys(e);for(r=0,n=o.length;n>r;r++)t=o[r],a(t)||(i[t]=e[t]);return i}function i(e,t,r){Object.keys(e).filter(function(t){return!a(t)&&e[t]}).forEach(function(r){var a=e[r],s=t[r];if(s||(s=t[r]={}),a.$type){var c,u=a.value&&"object"==typeof a.value,h=!e[o];return c=u||h?n(a):a.value,void(t[r]=c)}i(a,s,r)})}var o=e(37),a=e(97);t.exports=function(e){var t={};return i(e,t),t}},{37:37,97:97}],15:[function(e,t,r){t.exports=function(e,t){for(var r=e._root.cache,n=-1,i=t.length;++n<i&&r&&!r.$type;)r=r[t[n]];return r}},{}],16:[function(e,t,r){var n=e(64),i=e(134);t.exports=function(e){for(var t=i.fromPath(e),r=0,o=t.length;++r<o;)if("object"==typeof t[r])return new n(function(e){e.onError(new Error("Paths must be simple paths"))});var a=this;return new n(function(e){return a.get(t).subscribe(function(r){for(var n=r.json,i=-1,o=t.length;n&&++i<o;)n=n[t[i]];e.onNext(n)},function(t){e.onError(t)},function(){e.onCompleted()})})}},{134:134,64:64}],17:[function(e,t,r){var n=e(11),i=e(25),o=e(27),a=e(29).promote,s=e(120),c=e(118),u=e(119);t.exports=function(e,t,r){for(var h,l,p,f,d,m=e._root.cache,v=t.length,g=[],y=!1,b=!1,_=0,x=m,w=m,S=m,M=!0,E=!1;x&&v>_;){if(null!==(h=t[_++])&&(x=w[h],g[g.length]=h),!x){S=void 0,y=!0,M=!1;break}if((p=x.$type)===c&&void 0===x.value){S=void 0,M=!1,y=v>_;break}if(v>_){if(p===s){if(o(x)){E=!0,S=void 0,M=!1;break}if(f=n(e,m,m,x,x.value),!(d=f[0])){S=void 0,x=void 0,M=!1;break}p=d.$type,x=d,g=f[1].slice(0)}if(p)break}else S=x;w=x}if(v>_&&!E){for(l=_;v>l;++l)if(null!==t[_]){b=!0;break}for(b?(y=!0,S=void 0):S=x,l=_;v>l;++l)null!==t[l]&&(g[g.length]=t[l])}if(S&&p&&(o(S)?S=void 0:a(e,S)),S&&p===u&&!e._treatErrorsAsValues)throw{path:_===v?t:t.slice(0,_),value:S.value};return S&&e._boxed?S=Boolean(p)&&!r?i(S):S:!S&&e._materialized?S={$type:c}:S&&(S=S.value),{value:S,shorted:y,optimizedPath:g,found:M}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(e,t,r){var n=e(46);t.exports=function(e,t){var r=e._getValueSync({_boxed:!0,_root:e._root,_treatErrorsAsValues:e._treatErrorsAsValues},t,!0).value,i=r&&r[n];return null==i?-1:i}},{46:46}],19:[function(e,t,r){var n=e(12),i=e(31),o=n(i,!1),a=n(i,!0);t.exports={getValueSync:e(17),getBoundValue:e(13),getWithPathsAsPathMap:o,getWithPathsAsJSONGraph:a}},{12:12,13:13,17:17,31:31}],20:[function(e,t,r){var n=e(29),i=e(25),o=n.promote;t.exports=function(e,t,r,n,a){var s=t.value;a.errors||(a.errors=[]),e._boxed&&(s=i(t)),a.errors.push({path:n.slice(0,r+1),value:s}),o(e,t)}},{25:25,29:29}],21:[function(e,t,r){var n=e(30).fastCopy;t.exports=function(e,t,r,i,o,a,s){i.requestedMissingPaths||(i.requestedMissingPaths=[],i.optimizedMissingPaths=[]),function(e,t,r,n,i,o,a){a.requestedMissingPaths.push(n.slice(0,r).concat(t)),a.optimizedMissingPaths.push(i.slice(0,o).concat(t))}(0,r<t.length?n(t,r):[],r,o,a,s,i)}},{30:30}],22:[function(e,t,r){var n=e(29),i=e(25),o=n.promote,a=e(120),s=e(118),c=e(119),u=e(37);t.exports=function(e,t,r,n,h,l,p,f,d,m){if(r){var v,g,y,b,_,x,w,S,M=!1;if(t&&o(e,t),t&&void 0!==t.value||(M=e._materialized),M)S={$type:s};else if(e._boxed)S=i(t);else if(t.$type===a||t.$type===c)S=d?i(t):t.value;else if(d){var E=t.value&&"object"==typeof t.value,C=!t[u];S=E||C?i(t):t.value}else S=t.value;if(h&&(h.hasValue=!0),d){for((_=r.jsonGraph)||(_=r.jsonGraph={},r.paths=[]),v=0,g=f-1;g>v;v++)b=p[v],_[b]||(_[b]={}),_=_[b];_[b=p[v]]=M?{$type:s}:S,l&&r.paths.push(l.slice(0,n))}else if(0===n)r.json=S;else{for((_=r.json)||(_=r.json={}),v=0;n-1>v;v++)y=l[v],_[y]||(_[y]={}),x=_,w=y,_=_[y];null!==(y=l[v])?_[y]=S:x[w]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(e,t,r){var n=e(27),i=e(26),o=e(29),a=i.remove,s=o.splice,c=e(119),u=e(20),h=e(22),l=e(21),p=e(28),f=e(35);t.exports=function(e,t,r,i,o,d,m,v,g,y,b){var _=t&&t.$type,x=t&&void 0===t.value;return t&&_?void(n(t)?(t[f]||(s(e,t),a(t)),l(e,r,i,d,m,v,g)):_===c?(b&&(m[i]=null),y||e._treatErrorsAsValues?h(e,t,o,i,d,m,v,g,y,b):u(e,t,i,m,d)):(b&&(m[i]=null),(!x||x&&e._materialized)&&h(e,t,o,i,d,m,v,g,y,b))):void(p(e)?h(e,t,o,i,d,m,v,g,y,b):l(e,r,i,d,m,v,g))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(e,t,r){var n=e(134);t.exports=function(e){var t=n.fromPath(e);if(!1===Array.isArray(t))throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(t=this._path.concat(t)),this._syncCheck("getValueSync")&&this._getValueSync(this,t).value}},{134:134}],25:[function(e,t,r){var n=e(40);t.exports=function(e){var t,r,i,o=Object.keys(e);for(t={},r=0,i=o.length;i>r;r++){var a=o[r];a[0]!==n&&(t[a]=e[a])}return t}},{40:40}],26:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports={create:function(e,t){var r=t[a]||0;t[n+r]=e,t[a]=r+1,e[o]=r,e[i]=t},remove:function(e){var t=e[i];if(t){for(var r=e[o],s=t[a];s>r;)t[n+r]=t[n+r+1],++r;t[a]=s-1,e[i]=void 0,e[o]=void 0}}}},{33:33,42:42,43:43,44:44}],27:[function(e,t,r){var n=e(106);t.exports=function(e){var t=void 0===e.$expires&&-1||e.$expires;return-1!==t&&1!==t&&(0===t||t<n())}},{106:106}],28:[function(e,t,r){t.exports=function(e){return e._materialized&&!e._source}},{}],29:[function(e,t,r){var n=e(34),i=e(45),o=e(38),a=e(41),s=e(35);t.exports={promote:function(e,t){var r=e._root,i=r[n];if(i!==t){var s=t[a],c=t[o];c&&(c[a]=s),s&&(s[o]=c),t[a]=void 0,r[n]=t,t[o]=i,i[a]=t}},splice:function(e,t){var r=e._root,c=t[a],u=t[o];u&&(u[a]=c),c&&(c[o]=u),t[a]=void 0,t===r[n]&&(r[n]=void 0),t===r[i]&&(r[i]=void 0),t[s]=!0,r.expired.push(t)}}},{34:34,35:35,38:38,41:41,45:45}],30:[function(e,t,r){t.exports={fastCat:function(e,t){var r,n,i,o=[];for(r=0,n=e.length;n>r;r++)o[r]=e[r];for(i=0,n=t.length;n>i;i++)o[r++]=t[i];return o},fastCatSkipNulls:function(e,t){var r,n,i,o=[];for(r=0,n=e.length;n>r;r++)o[r]=e[r];for(i=0,n=t.length;n>i;i++)null!==t[i]&&(o[r++]=t[i]);return o},fastCopy:function(e,t){var r,n,i,o=[];for(n=0,i=t||0,r=e.length;r>i;n++,i++)o[n]=e[i];return o}}},{}],31:[function(e,t,r){var n=e(11),i=e(23),o=e(27),a=e(143).iterateKeySet,s=e(120),c=e(29).promote;t.exports=function e(t,r,u,h,l,p,f,d,m,v,g,y){var b=y,_=m;if(!u||u&&u.$type||l===h.length)i(t,u,h,l,p,f,d,_,v,g,b);else{var x,w,S=l+1,M=!1,E=x=h[l];if("object"==typeof x&&(M={},E=a(x,M)),void 0!==E||!M.done){var C=v+1;do{b=!1;var T;null===E?T=u:(T=u[E],_[v]=E,d[l]=E);var O=_,P=C;if(T){var j=T.$type,A=j&&T.value||T;if(S<h.length&&j&&j===s&&!o(T)){g&&i(t,T,h,S,p,f,null,_,P,g,b),c(t,T);var R=n(t,r,r,T,A,p,g);b=!0,T=R[0];var L=R[1];for(O=[],P=L.length,w=0;P>w;++w)O[w]=L[w]}}e(t,r,T,h,S,p,f,d,O,P,g,b),M&&!M.done&&(E=a(x,M))}while(M&&!M.done)}}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(e,t,r){"use strict";function n(e){return new n.Model(e)}n.Promise="function"==typeof Promise?Promise:e(151),t.exports=n,n.Model=e(2)},{151:151,2:2}],33:[function(e,t,r){t.exports=e(40)+"context"},{40:40}],34:[function(e,t,r){t.exports=e(40)+"head"},{40:40}],35:[function(e,t,r){t.exports=e(40)+"invalidated"},{40:40}],36:[function(e,t,r){t.exports=e(40)+"key"},{40:40}],37:[function(e,t,r){t.exports="$modelCreated"},{}],38:[function(e,t,r){t.exports=e(40)+"next"},{40:40}],39:[function(e,t,r){t.exports=e(40)+"parent"},{40:40}],40:[function(e,t,r){t.exports=String.fromCharCode(30)},{}],41:[function(e,t,r){t.exports=e(40)+"prev"},{40:40}],42:[function(e,t,r){t.exports=e(40)+"ref-index"},{40:40}],43:[function(e,t,r){t.exports=e(40)+"ref"},{40:40}],44:[function(e,t,r){t.exports=e(40)+"refs-length"},{40:40}],45:[function(e,t,r){t.exports=e(40)+"tail"},{40:40}],46:[function(e,t,r){t.exports=e(40)+"version"},{40:40}],47:[function(e,t,r){function n(e,t,r,i,a,s,u,h,l,p){if(!w(e)&&!e.$type)for(var f in e)if(f[0]!==c&&"$"!==f[0]&&y(e,f)){var d=e[f],m=b(d)&&!d.$type,v=o(r,i,a,f,d,m,!1,s,u,h,l,p),_=v[0],x=v[1];_&&(m?n(d,t+1,r,x,_,s,u,h,l,p):C(_,x,f,h)&&E(x,g(_),h,s))}}function i(e,t,r,n,i,a,c,l){if(_(r))return S(r,i,a),[void 0,t];v(a,r);var d=r,m=r.value,g=t;if(null!=(r=r[h]))g=r[u]||t;else{var y=0,b=m.length-1;g=r=t;do{var x=o(t,g,r,m[y],e,b>y,!0,n,i,a,c,l);if(r=x[0],w(r))return x;g=x[1]}while(y++<b);if(d[h]!==r){var M=r[f]||0;r[f]=M+1,r[s+M]=d,d[h]=r,d[p]=M}}return[r,g]}function o(e,t,r,n,o,s,c,u,h,l,p,f){for(var m=r.$type;m===d;){var v=i(o,e,r,u,h,l,p,f);if(r=v[0],w(r))return v;t=v[1],m=r&&r.$type}if(void 0!==m)return[r,t];if(null==n){if(s)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return[r,t]}var a=e(36),s=e(43),c=e(40),u=e(39),h=e(33),l=e(46),p=e(42),f=e(44),d=e(120),m=e(13),v=e(50),g=e(88),y=e(91),b=e(100),_=e(95),x=e(96),w=e(102),S=e(86),M=e(92),E=e(115),C=e(109);t.exports=function(e,t){for(var r=e._root,i=r,o=r.expired,a=M(),s=r._comparator,c=r._errorSelector,h=e._path,p=r.cache,f=h.length?m(e,h).value:p,d=f[u]||p,v=p[l],g=-1,y=t.length;++g<y;){n(t[g].json,0,p,d,f,a,o,i,s,c)}var b=p[l],_=r.onChange;x(_)&&v!==b&&_()}},{100:100,102:102,109:109,115:115,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,88:88,91:91,92:92,95:95,96:96}],48:[function(e,t,r){function n(e,t,r,i,a,s,c,u){var h={},l=t<e.length-1,p=e[t],f=x(p,h);do{var d=o(r,i,a,f,l,!1,s,c,u),m=d[0],g=d[1];m&&(l?n(e,t+1,r,g,m,s,c,u):M(m,g,f,u)&&S(g,v(m),u,s)),f=x(p,h)}while(!h.done)}function i(e,t,r,n,i){if(g(t))return _(t,n,i),[void 0,e];m(i,t);var a=t,h=t.value,f=e;if(null!=(t=t[u]))f=t[c]||e;else{var d=0,v=h.length-1;f=t=e;do{var y=o(e,f,t,h[d],v>d,!0,r,n,i);if(t=y[0],b(t))return y;f=y[1]}while(d++<v);if(a[u]!==t){var x=t[p]||0;t[p]=x+1,t[s+x]=a,a[u]=t,a[l]=x}}return[t,f]}function o(e,t,r,n,o,s,c,u,h){for(var l=r.$type;l===f;){var p=i(e,r,c,u,h);if(r=p[0],b(r))return p;t=p[1],l=r.$type}if(void 0!==l)return[r,t];if(null==n){if(o)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return[r,t]}var a=e(36),s=e(43),c=e(39),u=e(33),h=e(46),l=e(42),p=e(44),f=e(120),d=e(13),m=e(50),v=e(88),g=e(95),y=e(96),b=e(102),_=e(86),x=e(143).iterateKeySet,w=e(92),S=e(115),M=e(109);t.exports=function(e,t){for(var r=e._root,i=r,o=r.expired,a=w(),s=e._path,u=r.cache,l=s.length?d(e,s).value:u,p=l[c]||u,f=u[h],m=-1,v=t.length;++m<v;){n(t[m],0,u,p,l,a,o,i)}var g=u[h],b=r.onChange;y(b)&&f!==g&&b()}},{102:102,109:109,115:115,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,88:88,92:92,95:95,96:96}],49:[function(e,t,r){var n=e(36),i=e(39),o=e(34),a=e(45),s=e(38),c=e(41),u=e(108),h=e(115);t.exports=function(e,t,r,l,p,f){var d=r,m=p;"number"!=typeof m&&(m=.75);var v,g,y,b="number"==typeof f,_=l*m;for(g=t.pop();g;)y=g.$size||0,d-=y,!0===b?h(g,y,e,f):(v=g[i])&&u(g,v,g[n],e),g=t.pop();if(d>=l){var x=e[a];for(g=x;d>=_&&g;)x=x[c],y=g.$size||0,d-=y,!0===b&&h(g,y,e,f),g=x;e[a]=e[c]=g,null==g?e[o]=e[s]=void 0:g[s]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(e,t,r){var n=e(121),i=e(34),o=e(45),a=e(38),s=e(41),c=e(100);t.exports=function(e,t){if(c(t)&&t.$expires!==n){var r=e[i],u=e[o],h=t[a],l=t[s];t!==r&&(null!=h&&"object"==typeof h&&(h[s]=l),null!=l&&"object"==typeof l&&(l[a]=h),h=r,null!=r&&"object"==typeof r&&(r[s]=t),e[i]=e[a]=r=t,r[a]=h,r[s]=void 0),null!=u&&t!==u||(e[o]=e[s]=u=l||t)}return t}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(e,t,r){var n=e(34),i=e(45),o=e(38),a=e(41);t.exports=function(e,t){var r=e[n],s=e[i],c=t[o],u=t[a];null!=c&&"object"==typeof c&&(c[a]=u),null!=u&&"object"==typeof u&&(u[o]=c),t===r&&(e[n]=e[o]=c),t===s&&(e[i]=e[a]=u),t[o]=t[a]=void 0,r=s=c=u=void 0}},{34:34,38:38,41:41,45:45}],52:[function(e,t,r){function n(e,t){var r=!1;return function(){if(!r&&!e._disposed){r=!0,e._callbacks[t]=null,e._optimizedPaths[t]=[],e._requestedPaths[t]=[];0!==--e._count||e.sent||(e._disposable.dispose(),e.requestQueue.removeRequest(e))}}}var i=e(59),o=e(60),a=0,s=e(57).GetRequest,c=e(76),u=e(78),h=e(119),l=[],p=function(e,t){this.sent=!1,this.scheduled=!1,this.requestQueue=t,this.id=++a,this.type=s,this._scheduler=e,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};p.prototype={batch:function(e,t,r){var i=this,a=i._optimizedPaths,s=i._requestedPaths,c=i._callbacks,u=a.length;return a[u]=t,s[u]=e,c[u]=r,++i._count,i.scheduled||(i.scheduled=!0,i._disposable=i._scheduler.schedule(function(){o(i,a,function(e,t){if(i.requestQueue.removeRequest(i),i._disposed=!0,i._count){i._merge(s,e,t);for(var r=0,n=c.length;n>r;++r){var o=c[r];o&&o(e,t)}}})})),n(i,u)},add:function(e,t,r){var o,a,s=this,c=i(e,t,s._pathMap);c?(a=c[2],o=c[1]):(a=e,o=t);var u=!1,h=!1;if(o.length<t.length){u=!0;var l=s._callbacks.length;s._callbacks[l]=r,s._requestedPaths[l]=c[0],s._optimizedPaths[l]=[],++s._count,h=n(s,l)}return[u,a,o,h]},_merge:function(e,t,r){var n=this.requestQueue.model,i=n._root,o=i.errorSelector,a=i.comparator,s=n._path;n._path=l;var p=function(e){for(var t=[],r=-1,n=0,i=e.length;i>n;++n)for(var o=e[n],a=0,s=o.length;s>a;++a)t[++r]=o[a];return t}(e);if(t){var f=t;f instanceof Error&&(f={message:f.message}),f.$type||(f={$type:h,value:f});var d=p.map(function(e){return{path:e,value:f}});u(n,d,null,o,a)}else c(n,[{paths:p,jsonGraph:r.jsonGraph}],null,o,a);n._path=s}},t.exports=p},{119:119,57:57,59:59,60:60,76:76,78:78}],53:[function(e,t,r){function n(){this.length=0,this.pending=!1,this.pathmaps=[],a.call(this,this._subscribe)}var i=e(159),o=i.Observer,a=i.Observable,s=i.Disposable,c=i.SerialDisposable,u=i.CompositeDisposable,h=e(9),l=e(143).iterateKeySet;n.create=function(e,t,r){var n=new this;return n.queue=e,n.model=t,n.index=r,n},(n.prototype=Object.create(a.prototype)).constructor=n,n.prototype.insertPath=function(e,t,r,n,i){var o=n||0,a=i||e.length-1,s=r||this.pathmaps[a+1]||(this.pathmaps[a+1]=Object.create(null));if(void 0===s||null===s)return!1;var c,u,h=e[o],p={};c=l(h,p);do{if(u=s[c],a>o){if(null==u){if(t)return!1;u=s[c]=Object.create(null)}if(!1===this.insertPath(e,t,u,o+1,a))return!1}else s[c]=(u||0)+1,this.length+=1;p.done||(c=l(h,p))}while(!p.done);return!0},n.prototype.removePath=function(e,t,r,n){var i=r||0,o=n||e.length-1,a=t||this.pathmaps[o+1];if(void 0===a||null===a)return!0;var s,c,u=0,h=e[i],p={};s=l(h,p);do{if(void 0!==(c=a[s])&&null!==c){if(o>i){u+=this.removePath(e,c,i+1,o);var f=void 0;for(f in c)break;void 0===f&&delete a[s]}else 0===(c=a[s]=(c||1)-1)&&delete a[s],u+=1,this.length-=1;p.done||(s=l(h,p))}}while(!p.done);return u},n.prototype.getSourceObserver=function(e){var t=this;return o.create(function(r){r.jsonGraph=r.jsonGraph||r.jsong||r.values||r.value,r.index=t.index,e.onNext(r)},function(t){e.onError(t)},function(){e.onCompleted()})},n.prototype._subscribe=function(e){var t=this,r=this.queue;t.pending=!0;var n=!1,i=new c,o=s.create(function(){n||(n=!0,r&&r._remove(t))}),a=new u(i,o);try{i.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(e)))}catch(e){throw new h(e)}return a},t.exports=n},{143:143,159:159,9:9}],54:[function(e,t,r){function n(e,t){this.total=0,this.model=e,this.requests=[],this.scheduler=t}var i=e(58),o=e(40),a=e(90),s=e(100),c=e(143);n.prototype.set=function(e){return e.paths=c.collapse(e.paths),i.create(this.model,e)},n.prototype._remove=function(e){var t=this.requests,r=t.indexOf(e);-1!==r&&t.splice(r,1)},n.prototype.distributePaths=function(e,t,r){var n,i,o=this.model,a=-1,s=e.length,c=-1,u=t.length,h=[];e:for(;++a<s;){var l=e[a];for(c=-1;++c<u;)if((i=t[c]).insertPath(l,i.pending)){h[c]=i;continue e}n||(n=r.create(this,o,this.total++),t[c]=n,h[u++]=n),n.insertPath(l,!1)}var p=[],f=-1;for(c=-1;++c<u;)null!=(i=h[c])&&(p[++f]=i);return p},n.prototype.mergeJSONGraphs=function(e,t){var r=0,n=[],i=[],c=[],u=e.index,h=t.index;e.index=Math.max(u,h),n[-1]=e.jsonGraph||{},i[-1]=t.jsonGraph||{};e:for(;r>-1;){for(var l=n[r-1],p=i[r-1],f=c[r-1]||(c[r-1]=Object.keys(p));f.length>0;){var d=f.pop();if(d[0]!==o)if(l.hasOwnProperty(d)){var m=l[d],v=a(m),g=p[d],y=a(g);if(s(m)&&s(g)&&!v&&!y){n[r]=m,i[r]=g,r+=1;continue e}h>u&&(l[d]=g)}else l[d]=p[d]}r-=1}return e},t.exports=n},{100:100,143:143,40:40,58:58,90:90}],55:[function(e,t,r){function n(e,t){this.model=e,this.scheduler=t,this.requests=this._requests=[]}var i=e(54),o=e(56);n.prototype.get=o.prototype.get,n.prototype.removeRequest=o.prototype.removeRequest,n.prototype.set=i.prototype.set,n.prototype.call=i.prototype.call,t.exports=n},{54:54,56:56}],56:[function(e,t,r){function n(e,t){this.model=e,this.scheduler=t,this.requests=this._requests=[]}var i=e(57),o=e(52);n.prototype={setScheduler:function(e){this.scheduler=e},get:function(e,t,r){function n(){m||0==--l&&r()}var a,s,c,u=this,h=[],l=0,p=u._requests,f=t,d=e,m=!1;for(a=0,s=p.length;s>a;++a)if((c=p[a]).type===i.GetRequest){if(c.sent){var v=c.add(d,f,n);v[0]&&(d=v[1],f=v[2],h[h.length]=v[3],++l)}else c.batch(d,f,n),f=[],d=[],++l;if(!f.length)break}if(f.length){c=new o(u.scheduler,u),p[p.length]=c,++l;var g=c.batch(d,f,n);h[h.length]=g}return function(){if(!m&&0!==l){m=!0;for(var e=h.length,t=0;e>t;++t)h[t]()}}},removeRequest:function(e){for(var t=this._requests,r=t.length;--r>=0;)if(t[r].id===e.id){t.splice(r,1);break}}},t.exports=n},{52:52,57:57}],57:[function(e,t,r){t.exports={GetRequest:"GET"}},{}],58:[function(e,t,r){function n(){o.call(this)}var i=e(159).Observer,o=e(53),a=e(83),s=e(76),c=e(78),u=new Array(0);n.create=function(e,t){var r=new n;return r.model=e,r.jsonGraphEnvelope=t,r},(n.prototype=Object.create(o.prototype)).constructor=n,n.prototype.method="set",n.prototype.insertPath=function(){return!1},n.prototype.removePath=function(){return 0},n.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},n.prototype.getSourceObserver=function(e){var t=this.model,r=t._path,n=this.jsonGraphEnvelope.paths,h=t._root,l=h.errorSelector,p=h.comparator;return o.prototype.getSourceObserver.call(this,i.create(function(i){t._path=u;var o=s(t,[{paths:n,jsonGraph:i.jsonGraph}],null,l,p);i.paths=o[1],t._path=r,e.onNext(i)},function(i){t._path=u,c(t,a(n,function(e){return{path:e,value:i}}),null,l,p),t._path=r,e.onError(i)},function(){e.onCompleted()}))},t.exports=n},{159:159,53:53,76:76,78:78,83:83}],59:[function(e,t,r){var n=e(143).hasIntersection,i=e(84);t.exports=function(e,t,r){for(var o=[],a=[],s=[],c=-1,u=-1,h=!1,l=0,p=t.length;p>l;++l){var f=t[l],d=r[f.length];d&&n(d,f,0)?(!h&&l>0&&(a=i(e,0,l),o=i(t,0,l)),s[++c]=e[l],h=!0):h&&(o[++u]=f,a[u]=e[l])}return h?[s,o,a]:null}},{143:143,84:84}],60:[function(e,t,r){var n=e(143),i=n.toTree,o=n.toPaths;t.exports=function(e,t,r){if(0!==e._count){e.sent=!0,e.scheduled=!1;for(var n=e._pathMap,a=0,s=Object.keys(t).length;s>a;++a)for(var c=t[a],u=0,h=c.length;h>u;++u){var l=c[u],p=l.length;if(n[p]){var f=n[p];f[f.length]=l}else n[p]=[l]}for(var d=Object.keys(n),m=0,v=d.length;v>m;++m){var g=d[m];n[g]=i(n[g])}var y,b=e._collasped=o(n);e.requestQueue.model._source.get(b).subscribe(function(e){y=e},function(e){r(e,y)},function(){r(null,y)})}else e.requestQueue.removeRequest(e)}},{143:143}],61:[function(e,t,r){function n(e){a.call(this,e||function(e){function t(e){return b.concat(e)}var r=this.args,n=this.model,c=h.fromPath(r[0]),p=r[1]||[],f=(r[2]||[]).map(h.fromPath),d=(r[3]||[]).map(h.fromPath),m=n._clone({_path:[]}),v=m.withoutDataSource(),g=n._path,y=g.concat(c),b=y.slice(0,-1),_=i(n.withoutDataSource().get(c)).map(function(e){for(var t=e.json,r=-1,n=c.length;t&&++r<n;)t=t[c[r]];return{model:m._derefSync(b).boxValues(),localFn:t}}).flatMap(function(e){function r(e,t){var r=t.path;return e.push.apply(e,f.map(function(e){return r.concat(e)})),e}function n(e){return e.path}var o=e&&e.localFn;if("function"==typeof o){var s=e.model,c=s._path,u=o.apply(s,p).reduce(function(e,r){if(Boolean(r.invalidated))e.invalidations.push(e.localThisPath.concat(r.path));else{var n=r.path,i=r.value;Boolean(i)&&"object"==typeof i&&i.$type===l?e.references.push({path:t(n),value:r.value}):e.values.push({path:t(n),value:r.value})}return e},{values:[],references:[],invalidations:[],localThisPath:c}).flatMap(function(e){var t=e.values.concat(e.references);return t.length>0?i(v.set.apply(v,t)._toJSONG()).map(function(t){return{results:e,envelope:t}}):a.return({results:e,envelope:{jsonGraph:{},paths:[]}})}).flatMap(function(e){var o,s=e.envelope,c=e.results,u=c.values,h=c.references,l=c.invalidations,p=u.map(n).map(t),f=h.reduce(r,[]),v=d.map(t),g=f.concat(v);return(o=g.length>0?i(m.get.apply(m,p.concat(g))._toJSONG()):a.return(s)).doAction(function(e){e.invalidated=l})});return a.return(u)}return a.empty()}).defaultIfEmpty(function(e){return e&&"object"==typeof e?o.Observable.defer(function(){var t;try{t=e.call(y,p,f,d)}catch(e){t=a.throw(new u(e))}return t}).map(function(e){var t=e.invalidated;return t&&t.length&&m.invalidate.apply(m,t),e}):a.empty()}(n._source)).mergeAll().flatMap(function(e){return i(v.set(e)).reduce(function(e){return e},null).map(function(){return{invalidated:e.invalidated,paths:e.paths.map(function(e){return e.slice(g.length)})}})}),x=new s;return x.add(_.subscribe(function(t){var r=t.paths,o=t.invalidated,a=n.get.apply(n,r);"AsJSONG"===e.outputFormat&&(a=i(a._toJSONG()).doAction(function(e){e.invalidated=o})),x.add(a.subscribe(e))},function(t){e.onError(t)})),x})}function i(e){return o.Observable.defer(function(){return e})}var o=e(159)&&e(158),a=o.Observable,s=o.CompositeDisposable,c=e(64),u=e(9),h=e(134),l=e(120);n.create=c.create,(n.prototype=Object.create(a.prototype)).constructor=n,n.prototype.invokeSourceRequest=function(e){return this},n.prototype.ensureCollect=function(e){return this},n.prototype.initialize=function(){return this},t.exports=n},{120:120,134:134,158:158,159:159,64:64,9:9}],62:[function(e,t,r){function n(e){i.call(this,e)}var i=e(159).Observable,o=e(64),a=e(134),s=e(88),c=e(49),u=e(81),h=e(46),l=Array.isArray,p=e(101),f=e(98),d=e(99);n.create=o.create,(n.prototype=Object.create(i.prototype)).constructor=n,n.prototype.subscribeCount=0,n.prototype.subscribeLimit=10,n.prototype.initialize=function(){for(var e,t,r=this.model,n=this.outputFormat||"AsPathMap",i=this.isProgressive,o=[{}],s=[],c=this.args,h=-1,m=c.length;++h<m;){var v,g=c[h];l(g)||"string"==typeof g?(g=a.fromPath(g),v="PathValues"):p(g)?(g.path=a.fromPath(g.path),v="PathValues"):d(g)?v="JSONGs":f(g)&&(v="PathMaps"),t!==v&&(t=v,e={inputType:v,arguments:[]},s.push(e),e.values=o),e.arguments.push(g)}return this.boundPath=u(r._path),this.groups=s,this.outputFormat=n,this.isProgressive=i,this.isCompleted=!1,this.isMaster=null==r._source,this.values=o,this},n.prototype.invokeSourceRequest=function(e){return this},n.prototype.ensureCollect=function(e){var t=this.finally(function(){var t=e._root,r=t.cache;t.collectionScheduler.schedule(function(){c(t,t.expired,s(r),e._maxSize,e._collectRatio,r[h])})});return new this.constructor(function(e){return t.subscribe(e)})},t.exports=n},{101:101,134:134,159:159,46:46,49:49,64:64,81:81,88:88,98:98,99:99}],63:[function(e,t,r){function n(e){o.call(this,e||function(e){for(var t=this.model,r=this.method,n=this.groups,o=-1,a=n.length;++o<a;){var s=n[o],c=s.inputType,u=s.arguments;if(u.length>0){(0,t["_"+r+c+"AsJSON"])(t,u)}}return e.onCompleted(),i.empty})}var i=e(159).Disposable,o=e(62);n.create=o.create,(n.prototype=Object.create(o.prototype)).method="invalidate",n.prototype.constructor=n,t.exports=n},{159:159,62:62}],64:[function(e,t,r){function n(e){this._subscribe=e}function i(e){var t=this.model,r=new this.type;return r.model=t,r.args=this.args,r.outputFormat=e.outputFormat||"AsPathMap",r.isProgressive=e.isProgressive||!1,r.subscribeCount=0,r.subscribeLimit=e.retryLimit||10,r.initialize().invokeSourceRequest(t).ensureCollect(t).subscribe(e)}var o=e(32),a=(e(159)&&e(158)).Observable,s=e(84),c=e(105),u={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};n.create=function(e,t){var r=new n(i);return r.args=t,r.type=this,r.model=e,r},(n.prototype=Object.create(a.prototype)).constructor=n,n.prototype._mixin=function(){var e=this,t=s(arguments);return new e.constructor(function(r){return e.subscribe(t.reduce(function(e,t){return Object.create(e,t)},r))})},n.prototype._toJSONG=function(){return this._mixin(u)},n.prototype.progressively=function(){return this._mixin(h)},n.prototype.subscribe=function(e,t,r){var n=e;n&&"object"==typeof n||(n={onNext:e||c,onError:t||c,onCompleted:r||c});var i=this._subscribe(n);switch(typeof i){case"function":return{dispose:i};case"object":return i||{dispose:c};default:return{dispose:c}}},n.prototype.then=function(e,t){var r=this;return new o.Promise(function(e,t){var n,i=!1;r.toArray().subscribe(function(e){n=e.length<=1?e[0]:e},function(e){i=!0,t(e)},function(){!1===i&&e(n)})}).then(e,t)},t.exports=n},{105:105,158:158,159:159,32:32,84:84}],65:[function(e,t,r){function n(e){p.call(this,e||function(e){return this.isCompleted?o.call(this,e):function(e){if(this.subscribeCount++>this.subscribeLimit)return e.onError("Loop kill switch thrown."),h.empty;for(var t=[],r=[],n=this.model,i=this.isMaster,c=n._root,u=this.outputFormat,l=c.errorSelector,p=this.method,f=this.groups,m=-1,v=f.length;++m<v;){var g=f[m],y=g.inputType,b=g.arguments;if(b.length>0){var _=(0,n["_"+p+y+u])(n,b,null,l);r.push.apply(r,_[1]),"PathValues"===y?t.push.apply(t,b.map(a)):"JSONGs"===y?t.push.apply(t,d(b,s)):t.push.apply(t,_[0])}}return this.requestedPaths=t,i?(this.isCompleted=!0,o.call(this,e)):void e.onError({method:p,optimizedPaths:r,invokeSourceRequest:!0})}.call(this,e)})}function i(e){if(this.subscribeCount++>this.subscribeLimit)return e.onError("Loop kill switch thrown."),h.empty;for(var t=[],r=[],n=this.model,i=this.isMaster,c=n._root,u=this.outputFormat,l=c.errorSelector,p=this.method,f=this.groups,m=-1,v=f.length;++m<v;){var g=f[m],y=g.inputType,b=g.arguments;if(b.length>0){var _=(0,n["_"+p+y+u])(n,b,null,l);r.push.apply(r,_[1]),"PathValues"===y?t.push.apply(t,b.map(a)):"JSONGs"===y?t.push.apply(t,d(b,s)):t.push.apply(t,_[0])}}return this.requestedPaths=t,i?(this.isCompleted=!0,o.call(this,e)):void e.onError({method:p,optimizedPaths:r,invokeSourceRequest:!0})}function o(e){var t=new l(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(t=t._toJSONG()),this.isProgressive&&(t=t.progressively()),t.subscribe(e)}function a(e){return e.path}function s(e){return e.paths}var c=e(159),u=c.Observable,h=c.Disposable,l=e(67),p=e(62),f=e(9),d=e(82),m=new Array(0);n.create=p.create,(n.prototype=Object.create(p.prototype)).method="set",n.prototype.constructor=n,n.prototype.invokeSourceRequest=function(e){var t=this,r=this.catch(function(n){var i;if(n&&!0===n.invokeSourceRequest){var o={},a=e._path,s=n.optimizedPaths;e._path=m,e._getPathValuesAsJSONG(e._materialize().withoutDataSource(),s,[o]),e._path=a,i=e._request.set(o).do(function(e){t.isCompleted=s.length===e.paths.length},function(){t.isCompleted=!0}).materialize().flatMap(function(e){if("C"===e.kind)return u.empty();if("E"===e.kind){var t=e.exception;if(f.is(t))return u.throw(e.exception)}return r})}else i=u.throw(n);return i});return new this.constructor(function(e){return r.subscribe(e)})},t.exports=n},{159:159,62:62,67:67,82:82,9:9}],66:[function(e,t,r){var n=function(e){this.disposed=!1,this.currentDisposable=e};n.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var e=this.currentDisposable;e.dispose?e.dispose():e()}}},t.exports=n},{}],67:[function(e,t,r){var n=e(64),i=e(68),o=e(69),a={dispose:function(){}},s=e(159).Observable,c=t.exports=function(e,t,r,n){this.model=e,this.currentRemainingPaths=t,this.isJSONGraph=r||!1,this.isProgressive=n||!1};c.prototype=Object.create(s.prototype),c.prototype.subscribe=n.prototype.subscribe,c.prototype.then=n.prototype.then,c.prototype._toJSONG=function(){return new c(this.model,this.currentRemainingPaths,!0,this.isProgressive)},c.prototype.progressively=function(){return new c(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},c.prototype._subscribe=function(e){var t=[{}],r=[],n=e.isJSONG=this.isJSONGraph,s=this.isProgressive,c=i(this.model,this.currentRemainingPaths,e,s,n,t,r);return c?o(this,this.model,c,e,t,r,1):a}},{159:159,64:64,68:68,69:69}],68:[function(e,t,r){var n=e(19),i=n.getWithPathsAsJSONGraph,o=n.getWithPathsAsPathMap;t.exports=function(e,t,r,n,a,s,c){var u;if((u=a?i(e,t,s):o(e,t,s)).criticalError)return r.onError(u.criticalError),null;var h=u.hasValue,l=!u.requestedMissingPaths||!e._source,p=s[0].json||s[0].jsonGraph;if(u.errors)for(var f=u.errors,d=c.length,m=0,v=f.length;v>m;++m,++d)c[d]=f[m];if(h&&n||p&&l)try{++e._root.syncRefCount,r.onNext(s[0])}catch(e){throw e}finally{--e._root.syncRefCount}return l?(c.length?r.onError(c):r.onCompleted(),null):u}},{19:19}],69:[function(e,t,r){var n=e(68),i=e(10),o=e(30).fastCat,a=e(49),s=e(88),c=e(66),u=e(46);t.exports=function e(t,r,h,l,p,f,d){if(10===d)throw new i;var m=r._request,v=h.requestedMissingPaths,g=h.optimizedMissingPaths,y=new c,b=[],_=r._path;if(_.length)for(var x=0,w=v.length;w>x;++x)b[x]=o(_,v[x]);else b=v;var S=m.get(b,g,function(){var i=n(r,v,l,t.isProgressive,t.isJSONGraph,p,f);if(i)y.currentDisposable=e(t,r,i,l,p,f,d+1);else{var o=r._root,c=o.cache,h=c[u];a(o,o.expired,s(c),r._maxSize,r._collectRatio,h)}});return y.currentDisposable=S,y}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(e,t,r){var n=e(67);t.exports=function(e){return new n(this,e)}},{67:67}],71:[function(e,t,r){var n=e(134),i=e(64),o=e(72),a=e(116),s=e(67);t.exports=function(){var e=a(arguments,o,"get");if(!0!==e)return new i(function(t){t.onError(e)});var t=n.fromPathsOrPathValues(arguments);return new s(this,t)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(e,t,r){t.exports={path:!0,pathSyntax:!0}},{}],73:[function(e,t,r){function n(){}var i=e(123),o=e(159).Disposable;n.prototype.schedule=function(e){return i(e),o.empty},n.prototype.scheduleWithState=function(e,t){var r=this;return i(function(){t(r,e)}),o.empty},t.exports=n},{123:123,159:159}],74:[function(e,t,r){function n(){}var i=e(159).Disposable;n.prototype.schedule=function(e){return e(),i.empty},n.prototype.scheduleWithState=function(e,t){return t(this,e),i.empty},t.exports=n},{159:159}],75:[function(e,t,r){function n(e){this.delay=e}var i=e(159).Disposable;n.prototype.schedule=function(e){var t=setTimeout(e,this.delay);return i.create(function(){void 0!==t&&(clearTimeout(t),t=void 0)})},n.prototype.scheduleWithState=function(e,t){var r=this,n=setTimeout(function(){t(r,e)},this.delay);return i.create(function(){void 0!==n&&(clearTimeout(n),n=void 0)})},t.exports=n},{159:159}],76:[function(e,t,r){function n(e,t,r,i,a,s,c,u,h,l,p,d,m,v,g,b,_){for(var x={},w=t<e.length-1,S=e[t],M=y(S,x),E=d.index;;){p.depth=t;var C=o(r,i,a,s,c,u,M,w,!1,p,d,m,v,g,b,_);p[t]=M,p.index=t,d[d.index++]=M;var T=C[0],O=C[1];if(T&&(w?n(e,t+1,r,O,T,s,C[3],C[2],h,l,p,d,m,v,g,b,_):(f(g,T),h.push(p.slice(0,p.index+1)),l.push(d.slice(0,d.index)))),M=y(S,x),x.done)break;d.index=E}}function i(e,t,r,n,i,a,u,p,m,y,b){var _=t.value;if(a.splice(0,a.length),a.push.apply(a,_),d(t))return a.index=_.length,g(t,p,m),[void 0,e,n,r];f(m,t);var x=0,w=t,S=_.length-1,M=t=e,E=n=r;do{var C=o(e,M,t,r,E,n,_[x],S>x,!0,i,a,u,p,m,y,b);if(t=C[0],v(t))return a.index=x,C;M=C[1],n=C[2],E=C[3]}while(x++<S);if(a.index=x,w[c]!==t){var T=t[l]||0;t[l]=T+1,t[s+T]=w,w[c]=t,w[h]=T}return[t,M,n,E]}function o(e,t,r,n,o,s,c,u,h,l,f,d,m,g,y,b){for(var x=r.$type;x===p;){var w=i(e,r,n,s,l,f,d,m,g,y,b);if(r=w[0],v(r))return w;t=w[1],s=w[2],o=w[3],x=r.$type}if(void 0!==x)return[r,t,s,o];if(null==c){if(u)throw new Error("`null` is not allowed in branch key positions.");r&&(c=r[a])}else t=r,o=s,r=t[c],s=o&&o[c];return r=_(t,r,s,c,l,f,d,m,g,y,b),[r,t,s,o]}var a=e(36),s=e(43),c=e(33),u=e(46),h=e(42),l=e(44),p=e(120),f=e(50),d=e(94),m=e(96),v=e(102),g=e(86),y=e(143).iterateKeySet,b=e(92),_=e(103);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,c=a.expired,h=b(),l=a.cache,p=l[u],f=[],d=[],v=[],g=[],y=-1,_=t.length;++y<_;)for(var x=t[y],w=x.paths,S=x.jsonGraph,M=-1,E=w.length;++M<E;){var C=w[M];d.index=0,n(C,0,l,l,l,S,S,S,v,g,f,d,h,c,s,o,i)}var T=l[u],O=a.onChange;return m(O)&&p!==T&&O(),[v,g]}},{102:102,103:103,120:120,143:143,33:33,36:36,42:42,43:43,44:44,46:46,50:50,86:86,92:92,94:94,96:96}],77:[function(e,t,r){function n(e,t,r,i,s,c,u,h,l,p,f,d,m,v){var g=a(e);if(g&&g.length)for(var b=0,x=g.length,w=l.index;;){var S=g[b],M=e[S],E=_(M)&&!M.$type;h.depth=t;var C=o(r,i,s,S,M,E,!1,h,l,p,f,d,m,v);h[t]=S,h.index=t,l[l.index++]=S;var T=C[0],O=C[1];if(T&&(E?n(M,t+1,r,O,T,c,u,h,l,p,f,d,m,v):(y(d,T),c.push(h.slice(0,h.index+1)),u.push(l.slice(0,l.index)))),++b>=x)break;l.index=w}}function i(e,t,r,n,i,a,s,u,p,m){var v=r.value;if(i.splice(0,i.length),i.push.apply(i,v),x(r))return i.index=v.length,M(r,s,u),[void 0,t];y(u,r);var g=r,b=t;if(null!=(r=r[l]))b=r[h]||t,i.index=v.length;else{var _=0,w=v.length-1;b=r=t;do{var E=o(t,b,r,v[_],e,w>_,!0,n,i,a,s,u,p,m);if(r=E[0],S(r))return i.index=_,E;b=E[1]}while(_++<w);if(i.index=_,g[l]!==r){var C=r[d]||0;r[d]=C+1,r[c+C]=g,g[l]=r,g[f]=C}}return[r,b]}function o(e,t,r,n,o,a,c,u,h,l,p,f,d,v){for(var g=r.$type;g===m;){var y=i(o,e,r,u,h,l,p,f,d,v);if(r=y[0],S(r))return y;t=y[1],g=r&&r.$type}if(void 0!==g)return[r,t];if(null==n){if(a)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[s])}else t=r,r=t[n];return r=C(t,r,n,o,a,c,u,h,l,p,f,d,v),[r,t]}function a(e){if(_(e)&&!e.$type){var t=[],r=0;g(e)&&(t[r++]="length");for(var n in e)n[0]!==u&&"$"!==n[0]&&b(e,n)&&(t[r++]=n);return t}}var s=e(36),c=e(43),u=e(40),h=e(39),l=e(33),p=e(46),f=e(42),d=e(44),m=e(120),v=e(13),g=Array.isArray,y=e(50),b=e(91),_=e(100),x=e(95),w=e(96),S=e(102),M=e(86),E=e(92),C=e(104);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,c=a.expired,u=E(),l=e._path,f=a.cache,d=l.length?v(e,l).value:f,m=d[h]||f,g=f[p],y=[],b=[],_=[],x=l.length,S=-1,M=t.length;++S<M;){var C=t[S],T=l.slice(0);T.index=x,n(C.json,0,f,m,d,b,_,y,T,u,c,s,o,i)}var O=f[p],P=a.onChange;return w(P)&&g!==O&&P(),[b,_]}},{100:100,102:102,104:104,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,91:91,92:92,95:95,96:96}],78:[function(e,t,r){function n(e,t,r,i,a,s,c,u,h,l,p,f,d,v,g){for(var y={},b=r<t.length-1,x=t[r],w=_(x,y),S=l.index;;){h.depth=r;var M=o(i,a,s,w,e,b,!1,h,l,p,f,d,v,g);h[r]=w,h.index=r,l[l.index++]=w;var E=M[0],C=M[1];if(E&&(b?n(e,t,r+1,i,C,E,c,u,h,l,p,f,d,v,g):(m(d,E),c.push(h.slice(0,h.index+1)),u.push(l.slice(0,l.index)))),w=_(x,y),y.done)break;l.index=S}}function i(e,t,r,n,i,a,h,f,d,g){var _=r.value;if(i.splice(0,i.length),i.push.apply(i,_),v(r))return i.index=_.length,b(r,h,f),[void 0,t];m(f,r);var x=r,w=t;if(null!=(r=r[u]))w=r[c]||t,i.index=_.length;else{var S=0,M=_.length-1;w=r=t;do{var E=o(t,w,r,_[S],e,M>S,!0,n,i,a,h,f,d,g);if(r=E[0],y(r))return i.index=S,E;w=E[1]}while(S++<M);if(i.index=S,x[u]!==r){var C=r[p]||0;r[p]=C+1,r[s+C]=x,x[u]=r,x[l]=C}}return[r,w]}function o(e,t,r,n,o,s,c,u,h,l,p,d,m,v){for(var g=r.$type;g===f;){var b=i(o,e,r,u,h,l,p,d,m,v);if(r=b[0],y(r))return b;t=b[1],g=r.$type}if(void 0!==g)return[r,t];if(null==n){if(s)throw new Error("`null` is not allowed in branch key positions.");r&&(n=r[a])}else t=r,r=t[n];return r=w(t,r,n,o,s,c,u,h,l,p,d,m,v),[r,t]}var a=e(36),s=e(43),c=e(39),u=e(33),h=e(46),l=e(42),p=e(44),f=e(120),d=e(13),m=e(50),v=e(95),g=e(96),y=e(102),b=e(86),_=e(143).iterateKeySet,x=e(92),w=e(104);t.exports=function(e,t,r,i,o){for(var a=e._root,s=a,u=a.expired,l=x(),p=e._path,f=a.cache,m=p.length?d(e,p).value:f,v=m[c]||f,y=f[h],b=[],_=[],w=[],S=p.length,M=-1,E=t.length;++M<E;){var C=t[M],T=C.path,O=C.value,P=p.slice(0);P.index=S,n(O,T,0,f,v,m,_,w,b,P,l,u,s,o,i)}var j=f[h],A=a.onChange;return g(A)&&y!==j&&A(),[_,w]}},{102:102,104:104,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,92:92,95:95,96:96}],79:[function(e,t,r){var n=e(130),i=e(64),o=e(101);t.exports=function(e,t){for(var r=o(e)?e:n.pathValue(e,t),a=0,s=r.path,c=s.length;++a<c;)if("object"==typeof s[a])return new i(function(e){e.onError(new Error("Paths must be simple paths"))});var u=this;return new i(function(e){return u._set(r).subscribe(function(t){for(var r=t.json,n=-1,i=s.length;r&&++n<i;)r=r[s[n]];e.onNext(r)},function(t){e.onError(t)},function(){e.onCompleted()})})}},{101:101,130:130,64:64}],80:[function(e,t,r){var n=e(134),i=e(101),o=e(78);t.exports=function(e,t,r,a){var s=n.fromPath(e),c=t,u=r,h=a;if(i(s)?(h=u,u=c,c=s):c={path:s,value:c},!1===i(c))throw new Error("Model#setValueSync must be called with an Array path.");return"function"!=typeof u&&(u=this._root._errorSelector),"function"!=typeof h&&(h=this._root._comparator),this._syncCheck("setValueSync")?(o(this,[c]),this._getValueSync(this,c.path).value):void 0}},{101:101,134:134,78:78}],81:[function(e,t,r){t.exports=function(e){if(!e)return e;for(var t=-1,r=e.length,n=[];++t<r;)n[t]=e[t];return n}},{}],82:[function(e,t,r){t.exports=function(e,t){for(var r=-1,n=-1,i=e.length,o=[];++n<i;)for(var a=t(e[n],n,e),s=-1,c=a.length;++s<c;)o[++r]=a[s];return o}},{}],83:[function(e,t,r){t.exports=function(e,t){for(var r=-1,n=e.length,i=new Array(n);++r<n;)i[r]=t(e[r],r,e);return i}},{}],84:[function(e,t,r){t.exports=function(e,t,r){var n=t||0,i=-1,o=e.length-n;0>o&&(o=0),r>0&&o>r&&(o=r);for(var a=new Array(o);++i<o;)a[i]=e[i+n];return a}},{}],85:[function(e,t,r){var n=e(40),i=e(91),o=Array.isArray,a=e(100);t.exports=function(e){var t=e;if(a(t)){t=o(e)?[]:{};var r=e;for(var s in r)s[0]!==n&&i(r,s)&&(t[s]=r[s])}return t}},{100:100,40:40,91:91}],86:[function(e,t,r){var n=e(51),i=e(35);t.exports=function(e,t,r){return e[i]||(e[i]=!0,t.push(e),n(r,e)),e}},{35:35,51:51}],87:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$expires||void 0}},{100:100}],88:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$size||0}},{100:100}],89:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&e.$timestamp||void 0}},{100:100}],90:[function(e,t,r){var n=e(100);t.exports=function(e,t){var r=n(e)&&e.$type||void 0;return t&&r?"branch":r}},{100:100}],91:[function(e,t,r){var n=e(100),i=Object.prototype.hasOwnProperty;t.exports=function(e,t){return n(e)&&i.call(e,t)}},{100:100}],92:[function(e,t,r){var n=1;t.exports=function(){return n++}},{}],93:[function(e,t,r){var n=e(36),i=e(39),o=e(46);t.exports=function(e,t,r,a){return e[n]=r,e[i]=t,e[o]=a,t[r]=e,e}},{36:36,39:39,46:46}],94:[function(e,t,r){var n=e(106),i=e(122),o=e(121);t.exports=function(e){var t=e.$expires;return null!=t&&t!==o&&t!==i&&t<n()}},{106:106,121:121,122:122}],95:[function(e,t,r){var n=e(106),i=e(122),o=e(121);t.exports=function(e){var t=e.$expires;return null!=t&&t!==o&&(t===i||t<n())}},{106:106,121:121,122:122}],96:[function(e,t,r){t.exports=function(e){return Boolean(e)&&"function"==typeof e}},{}],97:[function(e,t,r){var n=e(40);t.exports=function(e){return"$size"===e||e&&e.charAt(0)===n}},{40:40}],98:[function(e,t,r){var n=e(100);t.exports=function(e){return n(e)&&"json"in e}},{100:100}],99:[function(e,t,r){var n=Array.isArray,i=e(100);t.exports=function(e){return i(e)&&n(e.paths)&&(i(e.jsonGraph)||i(e.jsong)||i(e.json)||i(e.values)||i(e.value))}},{100:100}],100:[function(e,t,r){t.exports=function(e){return null!==e&&"object"==typeof e}},{}],101:[function(e,t,r){var n=Array.isArray,i=e(100);t.exports=function(e){return i(e)&&(n(e.path)||"string"==typeof e.path)}},{100:100}],102:[function(e,t,r){t.exports=function(e){return null==e||"object"!=typeof e}},{}],103:[function(e,t,r){var n=e(36),i=e(39),o=e(120),a=e(119),s=e(88),c=e(89),u=e(100),h=e(95),l=e(96),p=e(50),f=e(117),d=e(93),m=e(86),v=e(110),g=e(115),y=e(107);t.exports=function(e,t,r,b,_,x,w,S,M,E,C){var T,O,P,j,A,R,L;if(t===r){if(null===r)return t=f(r,void 0,r),e=g(e,-t.$size,M,w),t=d(t,e,b),p(M,t),t;if(void 0===r)return r;if((j=u(t))&&null==(O=t.$type))return null==t[i]&&(t[n]=b,t[i]=e),t}else(j=u(t))&&(O=t.$type);if(O!==o){if((A=u(r))&&(P=r.$type),j&&!O&&(null==r||A&&!P))return t}else{if(null==r)return h(t)?void m(t,S,M):t;if((A=u(r))&&(P=r.$type)===o)if(t===r){if(null!=t[i])return t}else if(R=t.$timestamp,L=r.$timestamp,!h(t)&&!h(r)&&R>L)return}if(O&&A&&!P)return d(v(t,r,e,b,M),e,b);if(P||!A){if(P===a&&l(C)&&(r=C(y(_,b),r)),P&&t===r)null==t[i]&&(t=f(t,O,t.value),e=g(e,-t.$size,M,w),t=d(t,e,b,w));else{var N=!0;!O&&j||(N=c(r)<c(t)==0,(O||P)&&l(E)&&(N=!E(t,r,x.slice(0,x.index)))),N&&(r=f(r,P,P?r.value:r),T=s(t)-s(r),t=v(t,r,e,b,M),e=g(e,T,M,w),t=d(t,e,b,w))}h(t)?m(t,S,M):p(M,t)}else null==t&&(t=d(r,e,b));return t}},{100:100,107:107,110:110,115:115,117:117,119:119,120:120,36:36,39:39,50:50,86:86,88:88,89:89,93:93,95:95,96:96}],104:[function(e,t,r){var n=e(120),i=e(119),o=e(90),a=e(88),s=e(89),c=e(95),u=e(102),h=e(96),l=e(117),p=e(86),f=e(93),d=e(110),m=e(115),v=e(114),g=e(107);t.exports=function(e,t,r,y,b,_,x,w,S,M,E,C,T){var O=o(t,_);if(b||_)O&&c(t)&&(O="expired",p(t,M,E)),(O&&O!==n||u(t))&&(t=d(t,{},e,r,E),t=f(t,e,r,S),t=v(t,S));else{var P=y,j=o(P),A=s(P)<s(t)==0;if((O||j)&&h(C)&&(A=!C(t,P,w.slice(0,w.index))),A){j===i&&h(T)&&(P=T(g(x,r),P)),P=l(P,j,j?P.value:P);var R=a(t)-a(P);t=d(t,P,e,r,E),e=m(e,R,E,S),t=f(t,e,r,S)}}return t}},{102:102,107:107,110:110,114:114,115:115,117:117,119:119,120:120,86:86,88:88,89:89,90:90,93:93,95:95,96:96}],105:[function(e,t,r){t.exports=function(){}},{}],106:[function(e,t,r){t.exports=Date.now},{}],107:[function(e,t,r){t.exports=function(e,t){var r=e.slice(0,e.depth);return r[r.length]=t,r}},{}],108:[function(e,t,r){var n=e(120),i=e(39),o=e(51),a=e(100),s=e(112),c=e(113);t.exports=function(e,t,r,u){if(a(e)){var h=e.$type;return Boolean(h)&&(h===n&&c(e),o(u,e)),s(e),t[r]=e[i]=void 0,!0}return!1}},{100:100,112:112,113:113,120:120,39:39,51:51}],109:[function(e,t,r){var n=e(91),i=e(40),o=e(108);t.exports=function e(t,r,a,s){if(o(t,r,a,s)){if(null==t.$type)for(var c in t)c[0]!==i&&"$"!==c[0]&&n(t,c)&&e(t[c],t,c,s);return!0}return!1}},{108:108,40:40,91:91}],110:[function(e,t,r){var n=e(100),i=e(111),o=e(109);t.exports=function(e,t,r,a,s){return e===t?e:(n(e)&&(i(e,t),o(e,r,a,s)),r[a]=t,t)}},{100:100,109:109,111:111}],111:[function(e,t,r){var n=e(43),i=e(33),o=e(44);t.exports=function(e,t){for(var r=e[o]||0,a=t[o]||0,s=-1;++s<r;){var c=e[n+s];void 0!==c&&(c[i]=t,t[n+(a+s)]=c,e[n+s]=void 0)}return t[o]=r+a,e[o]=void 0,t}},{33:33,43:43,44:44}],112:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports=function(e){for(var t=-1,r=e[a]||0;++t<r;){var s=e[n+t];null!=s&&(s[i]=s[o]=e[n+t]=void 0)}return e[a]=void 0,e}},{33:33,42:42,43:43,44:44}],113:[function(e,t,r){var n=e(43),i=e(33),o=e(42),a=e(44);t.exports=function(e){var t=e[i];if(t){for(var r=(e[o]||0)-1,s=(t[a]||0)-1;++r<=s;)t[n+r]=t[n+(r+1)];t[a]=s,e[o]=e[i]=t=void 0}return e}},{33:33,42:42,43:43,44:44}],114:[function(e,t,r){var n=e(43),i=e(39),o=e(46),a=e(44);t.exports=function(e,t){var r=[e],s=0;do{var c=r[s--];if(c&&c[o]!==t){c[o]=t,r[s++]=c[i];for(var u=-1,h=c[a]||0;++u<h;)r[s++]=c[n+u]}}while(s>-1);return e}},{39:39,43:43,44:44,46:46}],115:[function(e,t,r){var n=e(36),i=e(46),o=e(39),a=e(108),s=e(114);t.exports=function(e,t,r,c){var u=e;do{var h=u[o];0>=(u.$size=(u.$size||0)-t)&&null!=h?a(u,h,u[n],r):u[i]!==c&&s(u,c),u=h}while(u);return e}},{108:108,114:114,36:36,39:39,46:46}],116:[function(e,t,r){var n=Array.isArray,i=e(101),o=e(99),a=e(98),s=e(134);t.exports=function(e,t,r){for(var c=0,u=e.length;u>c;++c){var h=e[c],l=!1;if(n(h)&&t.path?l=!0:"string"==typeof h&&t.pathSyntax?l=!0:i(h)&&t.pathValue?(h.path=s.fromPath(h.path),l=!0):o(h)&&t.jsonGraph?l=!0:a(h)&&t.json?l=!0:"function"==typeof h&&c+1===u&&t.selector&&(l=!0),!l)return new Error("Unrecognized argument "+typeof h+" ["+String(h)+"] to Model#"+r)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(e,t,r){var n=e(130).atom,i=e(106),o=e(122),a=e(37),s=e(85),c=Array.isArray,u=e(88),h=e(87);t.exports=function(e,t,r){var l=0,p=e,f=t;if(f?(p=s(p),l=u(p),p.$type=f):(p=n(r),f=p.$type,p[a]=!0),null==r)l=51;else if(null==l||0>=l)switch(typeof r){case"object":l=c(r)?50+r.length:51;break;case"string":l=50+r.length;break;default:l=51}var d=h(p);return"number"==typeof d&&o>d&&(p.$expires=i()+-1*d),p.$size=l,p}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(e,t,r){t.exports="atom"},{}],119:[function(e,t,r){t.exports="error"},{}],120:[function(e,t,r){t.exports="ref"},{}],121:[function(e,t,r){t.exports=1},{}],122:[function(e,t,r){t.exports=0},{}],123:[function(e,t,r){"use strict";function n(e){var t;(t=a.length?a.pop():new i).task=e,o(t)}function i(){this.task=null}var o=e(124),a=[],s=[],c=o.makeRequestCallFromTimer(function(){if(s.length)throw s.shift()});t.exports=n,i.prototype.call=function(){try{this.task.call()}catch(e){n.onerror?n.onerror(e):(s.push(e),c())}finally{this.task=null,a[a.length]=this}}},{124:124}],124:[function(e,t,r){(function(e){"use strict";function r(e){a.length||(o(),s=!0),a[a.length]=e}function n(){for(;c<a.length;){var e=c;if(c+=1,a[e].call(),c>u){for(var t=0,r=a.length-c;r>t;t++)a[t]=a[t+c];a.length-=c,c=0}}a.length=0,c=0,s=!1}function i(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var o,a=[],s=!1,c=0,u=1024,h=e.MutationObserver||e.WebKitMutationObserver;o="function"==typeof h?function(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}(n):i(n),r.requestFlush=o,r.makeRequestCallFromTimer=i}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(e,t,r){"use strict";function n(e,t){var r;for(r in t)e[r]=t[r];return e}function i(e,t){if(this._jsongUrl=e,"number"==typeof t){t={timeout:t}}this._config=n({timeout:15e3,headers:{}},t||{})}var o=e(129),a=e(126);Array.isArray,i.prototype={constructor:i,buildQueryObject:a,get:function(e){var t=n(this.buildQueryObject(this._jsongUrl,"GET",{paths:e,method:"get"}),this._config);return o("GET",t,this)},set:function(e){var t="POST",r=n(this.buildQueryObject(this._jsongUrl,t,{jsonGraph:e,method:"set"}),this._config);r.headers["Content-Type"]="application/x-www-form-urlencoded";return o(t,r,this)},call:function(e,t,r,i){t=t||[],r=r||[],i=i||[];var a="POST",s=[];s.push("method=call"),s.push("callPath="+encodeURIComponent(JSON.stringify(e))),s.push("arguments="+encodeURIComponent(JSON.stringify(t))),s.push("pathSuffixes="+encodeURIComponent(JSON.stringify(r))),s.push("paths="+encodeURIComponent(JSON.stringify(i)));var c=n(this.buildQueryObject(this._jsongUrl,a,s.join("&")),this._config);c.headers["Content-Type"]="application/x-www-form-urlencoded";return o(a,c,this)}},i.XMLHttpSource=i,i.default=i,t.exports=i},{126:126,129:129}],126:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n=[],i={url:e},o=-1!==e.indexOf("?")?"&":"?";return"string"==typeof r?n.push(r):Object.keys(r).forEach(function(e){var t="object"==typeof r[e]?JSON.stringify(r[e]):r[e];n.push(e+"="+encodeURIComponent(t))}),"GET"===t?i.url+=o+n.join("&"):i.data=n.join("&"),i}},{}],127:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t=new e.XMLHttpRequest;if("withCredentials"in t)return t;if(e.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(e,t,r){(function(e){"use strict";t.exports=function(){var t,r,n;if(e.XMLHttpRequest)return new e.XMLHttpRequest;try{for(r=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],n=0;3>n;n++)try{if(t=r[n],new e.ActiveXObject(t))break}catch(e){}return new e.ActiveXObject(t)}catch(e){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(e,t,r){"use strict";function n(){}function i(e,t,r){r||(r=new Error(t)),e.onError(r)}function o(e,t,r){var n,o;if(t&&e){o=t.responseType,n="response"in t?t.response:t.responseText;var a=1223===t.status?204:t.status;if(a>=200&&399>=a){try{"json"!==o&&(n=JSON.parse(n||"")),"string"==typeof n&&(n=JSON.parse(n||""))}catch(r){i(e,"invalid json",r)}return e.onNext(n),void e.onCompleted()}return 401===a||403===a||407===a?i(e,n):410===a?i(e,n):408===a||504===a?i(e,n):i(e,n||"Response code "+a)}}function a(e,t,r,n){i(e,r||t.statusText||"request error",n)}var s=e(128),c=e(127),u=Object.prototype.hasOwnProperty,h=function(){};n.create=function(e){var t=new n;return t.subscribe=function(t,r,n){var i,o;return i="function"==typeof t?{onNext:t,onError:r||h,onCompleted:n||h}:t,"function"==typeof(o=e(i))?{dispose:o}:o},t},t.exports=function(e,t,r){return n.create(function(n){var i,h,l,p,f,d={method:e||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(f in t)u.call(t,f)&&(d[f]=t[f]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=r.onBeforeRequest&&r.onBeforeRequest(d);try{i=d.crossDomain?c():s()}catch(e){n.onError(e)}try{d.user?i.open(d.method,d.url,d.async,d.user,d.password):i.open(d.method,d.url,d.async),i.timeout=d.timeout,i.withCredentials=!1!==d.withCredentials,l=d.headers;for(p in l)u.call(l,p)&&i.setRequestHeader(p,l[p]);if(d.responseType)try{i.responseType=d.responseType}catch(e){if("json"!==d.responseType)throw e}i.onreadystatechange=function(e){4===i.readyState&&(h||(h=!0,o(n,i)))},i.ontimeout=function(e){h||(h=!0,a(n,i,"timeout error",e))},i.send(d.data)}catch(e){n.onError(e)}return function(){h||4===i.readyState||(h=!0,i.abort())}})}},{127:127,128:128}],130:[function(e,t,r){function n(e,t,r){var n=Object.create(null);if(null!=r){for(var i in r)n[i]=r[i];return n.$type=e,n.value=t,n}return{$type:e,value:t}}var i=e(134);t.exports={ref:function(e,t){return n("ref",i.fromPath(e),t)},atom:function(e,t){return n("atom",e,t)},undefined:function(){return n("atom")},error:function(e,t){return n("error",e,t)},pathValue:function(e,t){return{path:i.fromPath(e),value:t}},pathInvalidation:function(e){return{path:i.fromPath(e),invalidated:!0}}}},{134:134}],131:[function(e,t,r){t.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(e,t,r){t.exports={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"}},{}],133:[function(e,t,r){t.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token.  only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character.  Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(e,t,r){if(r)throw e+" -- "+t.parseString+" with next token: "+r;throw e+" -- "+t.parseString}}},{}],134:[function(e,t,r){var n=e(140),i=e(135),o=e(131),a=function(e,t){return i(new n(e,t))};t.exports=a,a.fromPathsOrPathValues=function(e,t){if(!e)return[];for(var r=[],n=0,i=e.length;i>n;n++)"string"==typeof e[n]?r[n]=a(e[n],t):"string"==typeof e[n].path?r[n]={path:a(e[n].path,t),value:e[n].value}:r[n]=e[n];return r},a.fromPath=function(e,t){return e?"string"==typeof e?a(e,t):e:[]},a.RoutedTokens=o},{131:131,135:135,140:140}],135:[function(e,t,r){var n=e(132),i=e(133),o=e(136);t.exports=function(e){for(var t=e.next(),r={},a=[];!t.done;){switch(t.type){case n.token:var s=+t.token[0];isNaN(s)||i.throwError(i.invalidIdentifier,e),a[a.length]=t.token;break;case n.dotSeparator:0===a.length&&i.throwError(i.unexpectedToken,e);break;case n.space:break;case n.openingBracket:o(e,t,r,a);break;default:i.throwError(i.unexpectedToken,e)}t=e.next()}return 0===a.length&&i.throwError(i.invalidPath,e),a}},{132:132,133:133,136:136}],136:[function(e,t,r){var n=e(132),i=e(133),o=i.indexer,a=e(138),s=e(137),c=e(139);t.exports=function(e,t,r,u){var h=e.next(),l=!1,p=1,f=!1;for(r.indexer=[];!h.done;){switch(h.type){case n.token:case n.quote:r.indexer.length===p&&i.throwError(o.requiresComma,e)}switch(h.type){case n.openingBrace:f=!0,c(e,h,r,u);break;case n.token:var d=+h.token;isNaN(d)&&i.throwError(o.needQuotes,e),r.indexer[r.indexer.length]=d;break;case n.dotSeparator:r.indexer.length||i.throwError(o.leadingDot,e),a(e,h,r,u);break;case n.space:break;case n.closingBracket:l=!0;break;case n.quote:s(e,h,r,u);break;case n.openingBracket:i.throwError(o.nested,e);break;case n.commaSeparator:++p;break;default:i.throwError(i.unexpectedToken,e)}if(l)break;h=e.next()}0===r.indexer.length&&i.throwError(o.empty,e),r.indexer.length>1&&f&&i.throwError(o.routedTokens,e),1===r.indexer.length&&(r.indexer=r.indexer[0]),u[u.length]=r.indexer,r.indexer=void 0}},{132:132,133:133,137:137,138:138,139:139}],137:[function(e,t,r){var n=e(132),i=e(133),o=i.quote;t.exports=function(e,t,r,a){for(var s=e.next(),c="",u=t.token,h=!1,l=!1;!s.done;){switch(s.type){case n.token:case n.space:case n.dotSeparator:case n.commaSeparator:case n.openingBracket:case n.closingBracket:case n.openingBrace:case n.closingBrace:h&&i.throwError(o.illegalEscape,e),c+=s.token;break;case n.quote:h?(c+=s.token,h=!1):s.token!==u?c+=s.token:l=!0;break;case n.escape:h=!0;break;default:i.throwError(i.unexpectedToken,e)}if(l)break;s=e.next()}0===c.length&&i.throwError(o.empty,e),r.indexer[r.indexer.length]=c}},{132:132,133:133}],138:[function(e,t,r){var n=e(140),i=e(132),o=e(133);t.exports=function(e,t,r,a){var s,c=e.peek(),u=1,h=!1,l=!0,p=r.indexer.length-1,f=n.toNumber(r.indexer[p]);for(isNaN(f)&&o.throwError(o.range.precedingNaN,e);!h&&!c.done;){switch(c.type){case i.dotSeparator:3===u&&o.throwError(o.unexpectedToken,e),3===++u&&(l=!1);break;case i.token:s=n.toNumber(e.next().token),isNaN(s)&&o.throwError(o.range.suceedingNaN,e),h=!0;break;default:h=!0}if(h)break;e.next(),c=e.peek()}r.indexer[p]={from:f,to:l?s:s-1}}},{132:132,133:133,140:140}],139:[function(e,t,r){var n=e(132),i=e(131),o=e(133),a=o.routed;t.exports=function(e,t,r,s){var c=e.next(),u=!1,h="";switch(c.token){case i.integers:case i.ranges:case i.keys:break;default:o.throwError(a.invalid,e)}var l=e.next();if(l.type===n.colon&&(u=!0,(l=e.next()).type!==n.token&&o.throwError(a.invalid,e),h=l.token,l=e.next()),l.type===n.closingBrace){var p={type:c.token,named:u,name:h};r.indexer[r.indexer.length]=p}else o.throwError(a.invalid,e)}},{131:131,132:132,133:133}],140:[function(e,t,r){function n(e,t,r){return{token:e,done:r,type:t}}function i(e,t,r){var i,b=!1,_="",x=r?y:g;do{if(i=t+1>=e.length)break;var w=e[t+1];if(void 0===w||-1!==x.indexOf(w)){if(_.length)break;++t;var S;switch(w){case a:S=o.dotSeparator;break;case s:S=o.commaSeparator;break;case c:S=o.openingBracket;break;case u:S=o.closingBracket;break;case h:S=o.openingBrace;break;case l:S=o.closingBrace;break;case v:S=o.space;break;case d:case m:S=o.quote;break;case f:S=o.escape;break;case p:S=o.colon;break;default:S=o.unknown}b=n(w,S,!1);break}_+=w,++t}while(!i);return!b&&_.length&&(b=n(_,o.token,!1)),b||(b={done:!0}),{token:b,idx:t}}var o=e(132),a=".",s=",",c="[",u="]",h="{",l="}",p=":",f="\\",d='"',m="'",v=" ",g="\\'\"[]., ",y="\\{}'\"[]., :",b=t.exports=function(e,t){this._string=e,this._idx=-1,this._extended=t,this.parseString=""};b.prototype={next:function(){var e=this._nextToken?this._nextToken:i(this._string,this._idx,this._extended);return this._idx=e.idx,this._nextToken=!1,this.parseString+=e.token.token,e.token},peek:function(){var e=this._nextToken?this._nextToken:i(this._string,this._idx,this._extended);return this._nextToken=e,e.token}},b.toNumber=function(e){return isNaN(+e)?NaN:+e}},{132:132}],141:[function(e,t,r){var n=e(147),i=e(148);t.exports=function(e){var t=e.reduce(function(e,t){var r=t.length;return e[r]||(e[r]=[]),e[r].push(t),e},{});return Object.keys(t).forEach(function(e){t[e]=i(t[e])}),n(t)}},{147:147,148:148}],142:[function(e,t,r){var n=e(144);t.exports=function e(t,r,i){for(var o=t,a=!0;a&&i<r.length;++i){var s=r[i];if(s&&"object"===typeof s){var c={},u=n(s,c),h=i+1;do{var l=o[u];(a=void 0!==l)&&(a=e(l,r,h)),u=n(s,c)}while(a&&!c.done);break}a=void 0!==(o=o[s])}return a}},{144:144}],143:[function(e,t,r){t.exports={iterateKeySet:e(144),toTree:e(148),toTreeWithUnion:e(149),pathsComplementFromTree:e(146),pathsComplementFromLengthTree:e(145),hasIntersection:e(142),toPaths:e(147),collapse:e(141)}},{141:141,142:142,144:144,145:145,146:146,147:147,148:148,149:149}],144:[function(e,t,r){function n(e,t){var r=t.from=e.from||0,n=t.to=e.to||"number"==typeof e.length&&t.from+e.length-1||0;t.rangeOffset=t.from,t.loaded=!0,r>n&&(t.empty=!0)}function i(e,t){t.done=!1;var r=t.isObject=!(!e||"object"!=typeof e);t.isArray=r&&o(e),t.arrayOffset=0}var o=Array.isArray;t.exports=function(e,t){if(void 0===t.isArray&&i(e,t),t.isArray){var r;do{t.loaded&&t.rangeOffset>t.to&&(++t.arrayOffset,t.loaded=!1);if(t.arrayOffset>=e.length){t.done=!0;break}var o=e[t.arrayOffset];if("object"===typeof o){if(t.loaded||n(o,t),t.empty)continue;r=t.rangeOffset++}else++t.arrayOffset,r=o}while(void 0===r);return r}return t.isObject?(t.loaded||n(e,t),t.rangeOffset>t.to?void(t.done=!0):t.rangeOffset++):(t.done=!0,e)}},{}],145:[function(e,t,r){var n=e(142);t.exports=function(e,t){for(var r=[],i=-1,o=0,a=e.length;a>o;++o){var s=e[o];n(t[s.length],s,0)||(r[++i]=s)}return r}},{142:142}],146:[function(e,t,r){var n=e(142);t.exports=function(e,t){for(var r=[],i=-1,o=0,a=e.length;a>o;++o)n(t,e[o],0)||(r[++i]=e[o]);return r}},{142:142}],147:[function(e,t,r){function n(e){return null!==e&&typeof e===l}function i(e,t,r){var n,o,a,h,l,p,f,d,m,v,g,y,b,_,x=c(String(t)),w=Object.create(null),S=[],M=-1,E=0,C=[],T=0;if(h=[],l=-1,r-1>t){for(p=s(e,h);++l<p;)n=h[l],o=i(e[n],t+1,r),a=o.code,w[a]?o=w[a]:(S[E++]=a,o=w[a]={keys:[],sets:o.sets}),x=c(x+n+a),u(n)&&o.keys.push(parseInt(n,10))||o.keys.push(n);for(;++M<E;)if(n=S[M],o=w[n],h=o.keys,(p=h.length)>0)for(f=o.sets,d=-1,m=f.length,b=h[0];++d<m;){for(g=-1,y=(v=f[d]).length,(_=new Array(y+1))[0]=p>1&&h||b;++g<y;)_[g+1]=v[g];C[T++]=_}}else for(p=s(e,h),C[T++]=p>1?[h]:h;++l<p;)x=c(x+h[l]);return{code:x,sets:C}}function o(e){for(var t=-1,r=e.length;++t<r;){var n=e[t];h(n)&&(e[t]=function(e){for(var t=-1,r=e.length-1,n=r>0;++t<=r;){var i=e[t];if(!u(i)){n=!1;break}e[t]=parseInt(i,10)}if(!0===n){e.sort(a);var o=e[0],s=e[r];if(r>=s-o)return{from:o,to:s}}return e}(n))}return e}function a(e,t){return e-t}function s(e,t,r){var n=0;for(var i in e)t[n++]=i;return n>1&&t.sort(r),n}function c(e){for(var t=5381,r=-1,n=e.length;++r<n;)t=(t<<5)+t+e.charCodeAt(r);return String(t)}function u(e){return!h(e)&&e-parseFloat(e)+1>=0}var h=Array.isArray,l="object";t.exports=function(e){var t,r=[],a=0;for(var s in e)if(u(s)&&n(t=e[s]))for(var c=i(t,0,parseInt(s,10)).sets,h=-1,l=c.length;++h<l;)r[a++]=o(c[h]);return r}},{}],148:[function(e,t,r){function n(e,t,r){var o,a=t[r],s={},c=r+1;o=i(a,s);do{var u=e[o];u||(c===t.length?e[o]=null:u=e[o]={}),c<t.length&&n(u,t,c),s.done||(o=i(a,s))}while(!s.done)}var i=e(144);Array.isArray,t.exports=function(e){return e.reduce(function(e,t){return n(e,t,0),e},{})}},{144:144}],149:[function(e,t,r){},{}],150:[function(e,t,r){function n(){h=!1,s.length?u=s.concat(u):l=-1,u.length&&i()}function i(){if(!h){var e=setTimeout(n);h=!0;for(var t=u.length;t;){for(s=u,u=[];++l<t;)s&&s[l].run();l=-1,t=u.length}s=null,h=!1,clearTimeout(e)}}function o(e,t){this.fun=e,this.array=t}function a(){}var s,c=t.exports={},u=[],h=!1,l=-1;c.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];u.push(new o(e,t)),1!==u.length||h||setTimeout(i,0)},o.prototype.run=function(){this.fun.apply(null,this.array)},c.title="browser",c.browser=!0,c.env={},c.argv=[],c.version="",c.versions={},c.on=a,c.addListener=a,c.once=a,c.off=a,c.removeListener=a,c.removeAllListeners=a,c.emit=a,c.binding=function(e){throw new Error("process.binding is not supported")},c.cwd=function(){return"/"},c.chdir=function(e){throw new Error("process.chdir is not supported")},c.umask=function(){return 0}},{}],151:[function(e,t,r){"use strict";t.exports=e(156)},{156:156}],152:[function(e,t,r){"use strict";function n(){}function i(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._37=0,this._12=null,this._59=[],e!==n&&h(e,this)}function o(e,t){for(;3===e._37;)e=e._12;return 0===e._37?void e._59.push(t):void l(function(){var r=1===e._37?t.onFulfilled:t.onRejected;if(null!==r){var n=function(e,t){try{return e(t)}catch(e){return p=e,f}}(r,e._12);n===f?s(t.promise,p):a(t.promise,n)}else 1===e._37?a(t.promise,e._12):s(t.promise,e._12)})}function a(e,t){if(t===e)return s(e,new TypeError("A promise cannot be resolved with itself."));if(t&&("object"==typeof t||"function"==typeof t)){var r=function(e){try{return e.then}catch(e){return p=e,f}}(t);if(r===f)return s(e,p);if(r===e.then&&t instanceof i)return e._37=3,e._12=t,void c(e);if("function"==typeof r)return void h(r.bind(t),e)}e._37=1,e._12=t,c(e)}function s(e,t){e._37=2,e._12=t,c(e)}function c(e){for(var t=0;t<e._59.length;t++)o(e,e._59[t]);e._59=null}function u(e,t,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=r}function h(e,t){var r=!1,n=function(e,t,r){try{e(t,r)}catch(e){return p=e,f}}(e,function(e){r||(r=!0,a(t,e))},function(e){r||(r=!0,s(t,e))});r||n!==f||(r=!0,s(t,p))}var l=e(124),p=null,f={};t.exports=i,i._99=n,i.prototype.then=function(e,t){if(this.constructor!==i)return function(e,t,r){return new e.constructor(function(a,s){var c=new i(n);c.then(a,s),o(e,new u(t,r,c))})}(this,e,t);var r=new i(n);return o(this,new u(e,t,r)),r}},{124:124}],153:[function(e,t,r){"use strict";var n=e(152);t.exports=n,n.prototype.done=function(e,t){(arguments.length?this.then.apply(this,arguments):this).then(null,function(e){setTimeout(function(){throw e},0)})}},{152:152}],154:[function(e,t,r){"use strict";function n(e){var t=new i(i._99);return t._37=1,t._12=e,t}var i=e(152);t.exports=i;var o=n(!0),a=n(!1),s=n(null),c=n(void 0),u=n(0),h=n("");i.resolve=function(e){if(e instanceof i)return e;if(null===e)return s;if(void 0===e)return c;if(!0===e)return o;if(!1===e)return a;if(0===e)return u;if(""===e)return h;if("object"==typeof e||"function"==typeof e)try{var t=e.then;if("function"==typeof t)return new i(t.bind(e))}catch(e){return new i(function(t,r){r(e)})}return n(e)},i.all=function(e){var t=Array.prototype.slice.call(e);return new i(function(e,r){function n(a,s){if(s&&("object"==typeof s||"function"==typeof s)){if(s instanceof i&&s.then===i.prototype.then){for(;3===s._37;)s=s._12;return 1===s._37?n(a,s._12):(2===s._37&&r(s._12),void s.then(function(e){n(a,e)},r))}var c=s.then;if("function"==typeof c){return void new i(c.bind(s)).then(function(e){n(a,e)},r)}}t[a]=s,0==--o&&e(t)}if(0===t.length)return e([]);for(var o=t.length,a=0;a<t.length;a++)n(a,t[a])})},i.reject=function(e){return new i(function(t,r){r(e)})},i.race=function(e){return new i(function(t,r){e.forEach(function(e){i.resolve(e).then(t,r)})})},i.prototype.catch=function(e){return this.then(null,e)}},{152:152}],155:[function(e,t,r){"use strict";var n=e(152);t.exports=n,n.prototype.finally=function(e){return this.then(function(t){return n.resolve(e()).then(function(){return t})},function(t){return n.resolve(e()).then(function(){throw t})})}},{152:152}],156:[function(e,t,r){"use strict";t.exports=e(152),e(153),e(155),e(154),e(157)},{152:152,153:153,154:154,155:155,157:157}],157:[function(e,t,r){"use strict";var n=e(152),i=e(123);t.exports=n,n.denodeify=function(e,t){return t=t||1/0,function(){var r=this,i=Array.prototype.slice.call(arguments,0,t>0?t:0);return new n(function(t,n){i.push(function(e,r){e?n(e):t(r)});var o=e.apply(r,i);!o||"object"!=typeof o&&"function"!=typeof o||"function"!=typeof o.then||t(o)})}},n.nodeify=function(e){return function(){var t=Array.prototype.slice.call(arguments),r="function"==typeof t[t.length-1]?t.pop():null,o=this;try{return e.apply(this,arguments).nodeify(r,o)}catch(e){if(null===r||void 0===r)return new n(function(t,r){r(e)});i(function(){r.call(o,e)})}}},n.prototype.nodeify=function(e,t){return"function"!=typeof e?this:void this.then(function(r){i(function(){e.call(t,null,r)})},function(r){i(function(){e.call(t,r)})})}},{123:123,152:152}],158:[function(e,t,r){(function(n){(function(i){var o={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},a=o[typeof window]&&window||this,s=o[typeof r]&&r&&!r.nodeType&&r,c=o[typeof t]&&t&&!t.nodeType&&t,u=(c&&c.exports,o[typeof n]&&n);!u||u.global!==u&&u.window!==u||(a=u),"object"==typeof t&&t&&t.exports===s?t.exports=i(a,t.exports,e(159)):a.Rx=i(a,{},a.Rx)}).call(this,function(e,t,r,n){function i(e){if(!S(e))throw new TypeError("fn must be a function");return p=e,function(){try{return p.apply(this,arguments)}catch(e){return N.e=e,N}}}function o(e,t,r){return new v(function(n){var i=!1,o=null,a=[];return e.subscribe(function(e){var s,c;try{c=t(e)}catch(e){return void n.onError(e)}if(s=0,i)try{s=r(c,o)}catch(e){return void n.onError(e)}else i=!0,o=c;s>0&&(o=c,a=[]),s>=0&&a.push(e)},function(e){n.onError(e)},function(){n.onNext(a),n.onCompleted()})},e)}function a(e){if(0===e.length)throw new A;return e[0]}function s(e,t,r,n){if(0>t)throw new L;return new v(function(i){var o=t;return e.subscribe(function(e){0==o--&&(i.onNext(e),i.onCompleted())},function(e){i.onError(e)},function(){r?(i.onNext(n),i.onCompleted()):i.onError(new L)})},e)}function c(e,t,r){return new v(function(n){var i=r,o=!1;return e.subscribe(function(e){o?n.onError(new Error("Sequence contains more than one element")):(i=e,o=!0)},function(e){n.onError(e)},function(){o||t?(n.onNext(i),n.onCompleted()):n.onError(new A)})},e)}function u(e,t,r){return new v(function(n){return e.subscribe(function(e){n.onNext(e),n.onCompleted()},function(e){n.onError(e)},function(){t?(n.onNext(r),n.onCompleted()):n.onError(new A)})},e)}function h(e,t,r){return new v(function(n){var i=r,o=!1;return e.subscribe(function(e){i=e,o=!0},function(e){n.onError(e)},function(){o||t?(n.onNext(i),n.onCompleted()):n.onError(new A)})},e)}function l(e,t,r,i){var o=j(t,r,3);return new v(function(t){var r=0;return e.subscribe(function(n){var a;try{a=o(n,r,e)}catch(e){return void t.onError(e)}a?(t.onNext(i?r:n),t.onCompleted()):r++},function(e){t.onError(e)},function(){t.onNext(i?-1:n),t.onCompleted()})},e)}var p,f=r.Observable,d=f.prototype,m=r.CompositeDisposable,v=r.AnonymousObservable,g=r.Disposable.empty,y=(r.internals.isEqual,r.helpers),b=y.not,_=y.defaultComparer,x=y.identity,w=y.defaultSubComparer,S=y.isFunction,M=y.isPromise,E=y.isArrayLike,C=y.isIterable,T=r.internals.inherits,O=f.fromPromise,P=f.from,j=r.internals.bindCallback,A=r.EmptyError,R=r.ObservableBase,L=r.ArgumentOutOfRangeError,N={e:{}};d.aggregate=function(){var e,t,r=!1,n=this;return 2===arguments.length?(r=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new v(function(i){var o,a,s;return n.subscribe(function(n){!s&&(s=!0);try{o?a=e(a,n):(a=r?e(t,n):n,o=!0)}catch(e){return i.onError(e)}},function(e){i.onError(e)},function(){s&&i.onNext(a),!s&&r&&i.onNext(t),!s&&!r&&i.onError(new A),i.onCompleted()})},n)};var I=function(e){function t(t,r,n,i){this.source=t,this.acc=r,this.hasSeed=n,this.seed=i,e.call(this)}function r(e,t){this.o=e,this.acc=t.acc,this.hasSeed=t.hasSeed,this.seed=t.seed,this.hasAccumulation=!1,this.result=null,this.hasValue=!1,this.isStopped=!1}return T(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this))},r.prototype.onNext=function(e){this.isStopped||(!this.hasValue&&(this.hasValue=!0),this.hasAccumulation?this.result=i(this.acc)(this.result,e):(this.result=this.hasSeed?i(this.acc)(this.seed,e):e,this.hasAccumulation=!0),this.result===N&&this.o.onError(this.result.e))},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.hasValue&&this.o.onNext(this.result),!this.hasValue&&this.hasSeed&&this.o.onNext(this.seed),!this.hasValue&&!this.hasSeed&&this.o.onError(new A),this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(R);return d.reduce=function(e){var t=!1;if(2===arguments.length){t=!0;var r=arguments[1]}return new I(this,e,t,r)},d.some=function(e,t){var r=this;return e?r.filter(e,t).some():new v(function(e){return r.subscribe(function(){e.onNext(!0),e.onCompleted()},function(t){e.onError(t)},function(){e.onNext(!1),e.onCompleted()})},r)},d.any=function(){return this.some.apply(this,arguments)},d.isEmpty=function(){return this.any().map(b)},d.every=function(e,t){return this.filter(function(t){return!e(t)},t).some().map(b)},d.all=function(){return this.every.apply(this,arguments)},d.includes=function(e,t){var r=this;return new v(function(n){var i=0,o=+t||0;return Math.abs(o)===1/0&&(o=0),0>o?(n.onNext(!1),n.onCompleted(),g):r.subscribe(function(t){i++>=o&&function(e,t){return 0===e&&0===t||e===t||isNaN(e)&&isNaN(t)}(t,e)&&(n.onNext(!0),n.onCompleted())},function(e){n.onError(e)},function(){n.onNext(!1),n.onCompleted()})},this)},d.contains=function(e,t){d.includes(e,t)},d.count=function(e,t){return e?this.filter(e,t).count():this.reduce(function(e){return e+1},0)},d.indexOf=function(e,t){var r=this;return new v(function(n){var i=0,o=+t||0;return Math.abs(o)===1/0&&(o=0),0>o?(n.onNext(-1),n.onCompleted(),g):r.subscribe(function(t){i>=o&&t===e&&(n.onNext(i),n.onCompleted()),i++},function(e){n.onError(e)},function(){n.onNext(-1),n.onCompleted()})},r)},d.sum=function(e,t){return e&&S(e)?this.map(e,t).sum():this.reduce(function(e,t){return e+t},0)},d.minBy=function(e,t){return t||(t=w),o(this,e,function(e,r){return-1*t(e,r)})},d.min=function(e){return this.minBy(x,e).map(function(e){return a(e)})},d.maxBy=function(e,t){return t||(t=w),o(this,e,t)},d.max=function(e){return this.maxBy(x,e).map(function(e){return a(e)})},d.average=function(e,t){return e&&S(e)?this.map(e,t).average():this.reduce(function(e,t){return{sum:e.sum+t,count:e.count+1}},{sum:0,count:0}).map(function(e){if(0===e.count)throw new A;return e.sum/e.count})},d.sequenceEqual=function(e,t){var r=this;return t||(t=_),new v(function(n){var i=!1,o=!1,a=[],s=[],c=r.subscribe(function(e){var r,i;if(s.length>0){i=s.shift();try{r=t(i,e)}catch(e){return void n.onError(e)}r||(n.onNext(!1),n.onCompleted())}else o?(n.onNext(!1),n.onCompleted()):a.push(e)},function(e){n.onError(e)},function(){i=!0,0===a.length&&(s.length>0?(n.onNext(!1),n.onCompleted()):o&&(n.onNext(!0),n.onCompleted()))});(E(e)||C(e))&&(e=P(e)),M(e)&&(e=O(e));var u=e.subscribe(function(e){var r;if(a.length>0){var o=a.shift();try{r=t(o,e)}catch(e){return void n.onError(e)}r||(n.onNext(!1),n.onCompleted())}else i?(n.onNext(!1),n.onCompleted()):s.push(e)},function(e){n.onError(e)},function(){o=!0,0===s.length&&(a.length>0?(n.onNext(!1),n.onCompleted()):i&&(n.onNext(!0),n.onCompleted()))});return new m(c,u)},r)},d.elementAt=function(e){return s(this,e,!1)},d.elementAtOrDefault=function(e,t){return s(this,e,!0,t)},d.single=function(e,t){return e&&S(e)?this.where(e,t).single():c(this,!1)},d.singleOrDefault=function(e,t,r){return e&&S(e)?this.filter(e,r).singleOrDefault(null,t):c(this,!0,t)},d.first=function(e,t){return e?this.where(e,t).first():u(this,!1)},d.firstOrDefault=function(e,t,r){return e?this.where(e).firstOrDefault(null,t):u(this,!0,t)},d.last=function(e,t){return e?this.where(e,t).last():h(this,!1)},d.lastOrDefault=function(e,t,r){return e?this.where(e,r).lastOrDefault(null,t):h(this,!0,t)},d.find=function(e,t){return l(this,e,t,!1)},d.findIndex=function(e,t){return l(this,e,t,!0)},d.toSet=function(){if(void 0===e.Set)throw new TypeError;var t=this;return new v(function(r){var n=new e.Set;return t.subscribe(function(e){n.add(e)},function(e){r.onError(e)},function(){r.onNext(n),r.onCompleted()})},t)},d.toMap=function(t,r){if(void 0===e.Map)throw new TypeError;var n=this;return new v(function(i){var o=new e.Map;return n.subscribe(function(e){var n;try{n=t(e)}catch(e){return void i.onError(e)}var a=e;if(r)try{a=r(e)}catch(e){return void i.onError(e)}o.set(n,a)},function(e){i.onError(e)},function(){i.onNext(o),i.onCompleted()})},n)},r})}).call(this,void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{159:159}],159:[function(e,t,r){(function(e,n){(function(i){function o(e){for(var t=[],r=0,n=e.length;n>r;r++)t.push(e[r]);return t}function a(e,t){if(K&&t.stack&&"object"==typeof e&&null!==e&&e.stack&&-1===e.stack.indexOf(Q)){for(var r=[],n=t;n;n=n.source)n.stack&&r.unshift(n.stack);r.unshift(e.stack);var i=r.join("\n"+Q+"\n");e.stack=function(e){for(var t=e.split("\n"),r=[],n=0,i=t.length;i>n;n++){var o=t[n];(function(e){var t=u(e);if(!t)return!1;var r=t[0],n=t[1];return r===Z&&n>=J&&br>=n})(o)||function(e){return-1!==e.indexOf("(module.js:")||-1!==e.indexOf("(node.js:")}(o)||!o||r.push(o)}return r.join("\n")}(i)}}function c(){if(K)try{throw new Error}catch(r){var e=r.stack.split("\n"),t=u(e[0].indexOf("@")>0?e[1]:e[2]);if(!t)return;return Z=t[0],t[1]}}function u(e){var t=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(e);if(t)return[t[1],Number(t[2])];var r=/at ([^ ]+):(\d+):(?:\d+)$/.exec(e);if(r)return[r[1],Number(r[2])];var n=/.*@(.+):(\d+)$/.exec(e);return n?[n[1],Number(n[2])]:void 0}function h(e){var t=[];if(!Ae(e))return t;je.nonEnumArgs&&e.length&&Re(e)&&(e=Ie.call(e));var r=je.enumPrototypes&&"function"==typeof e,n=je.enumErrorProps&&(e===Ee||e instanceof Error);for(var i in e)r&&"prototype"==i||n&&("message"==i||"name"==i)||t.push(i);if(je.nonEnumShadows&&e!==Ce){var o=e.constructor,a=-1,s=pe;if(e===(o&&o.prototype))var c=e===Te?xe:e===Ee?ge:we.call(e),u=Pe[c];for(;++a<s;)i=le[a],u&&u[i]||!Se.call(e,i)||t.push(i)}return t}function l(e,t){return function(e,t,r){for(var n=-1,i=r(e),o=i.length;++n<o;){var a=i[n];if(!1===t(e[a],a,e))break}return e}(e,t,h)}function p(e){return"function"!=typeof e.toString&&"string"==typeof(e+"")}function f(e,t,r,n){if(e===t)return 0!==e||1/e==1/t;var i=typeof e,o=typeof t;if(e==e&&(null==e||null==t||"function"!=i&&"object"!=i&&"function"!=o&&"object"!=o))return!1;var a=we.call(e),s=we.call(t);if(a==fe&&(a=be),s==fe&&(s=be),a!=s)return!1;switch(a){case me:case ve:return+e==+t;case ye:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case _e:case xe:return e==String(t)}var c=a==de;if(!c){if(a!=be||!je.nodeClass&&(p(e)||p(t)))return!1;var u=!je.argsObject&&Re(e)?Object:e.constructor,h=!je.argsObject&&Re(t)?Object:t.constructor;if(!(u==h||Se.call(e,"constructor")&&Se.call(t,"constructor")||Y(u)&&u instanceof u&&Y(h)&&h instanceof h)&&("constructor"in e&&"constructor"in t))return!1}r||(r=[]),n||(n=[]);for(var d=r.length;d--;)if(r[d]==e)return n[d]==t;var m=0,v=!0;if(r.push(e),n.push(t),c){if(d=e.length,m=t.length,v=m==d)for(;m--;){var g=t[m];if(!(v=f(e[m],g,r,n)))break}}else l(t,function(t,i,o){return Se.call(o,i)?(m++,v=Se.call(e,i)&&f(e[i],t,r,n)):void 0}),v&&l(e,function(e,t,r){return Se.call(r,t)?v=--m>-1:void 0});return r.pop(),n.pop(),v}function d(e,t){for(var r=new Array(e),n=0;e>n;n++)r[n]=t();return r}function m(e){if(!Y(e))throw new TypeError("fn must be a function");return Le=e,function(){try{return Le.apply(this,arguments)}catch(e){return Be.e=e,Be}}}function v(e){throw e}function g(e,t){this.id=e,this.value=t}function y(e,t){this.scheduler=e,this.disposable=t,this.isDisposed=!1}function b(e,t){t.isDisposed||(t.isDisposed=!0,t.disposable.dispose())}function _(e){this._s=s}function x(e){this._s=s,this._l=s.length,this._i=0}function w(e){this._a=e}function S(e){this._a=e,this._l=function(e){var t=+e.length;return isNaN(t)?0:0!==t&&function(e){return"number"==typeof e&&D.isFinite(e)}(t)?0>=(t=function(e){var t=+e;return 0===t?t:isNaN(t)?t:0>t?-1:1}(t)*Math.floor(Math.abs(t)))?0:t>kt?kt:t:t}(e),this._i=0}function M(e,t){this.observer=e,this.parent=t}function E(e,t){return tt(e)||(e=ot),new Bt(t,e)}function C(e,t){this.observer=e,this.parent=t}function T(e,t){this.observer=e,this.parent=t}function O(){return!1}function O(){return!1}function P(){return[]}function O(){return!1}function j(){return[]}function A(e,t){this.observer=e,this.accumulator=t.accumulator,this.hasSeed=t.hasSeed,this.seed=t.seed,this.hasAccumulation=!1,this.accumulation=null,this.hasValue=!1,this.isStopped=!1}function R(e,t,r){var n=he(t,r,3);return e.map(function(t,r){var i=n(t,r,e);return X(i)&&(i=At(i)),(ue(i)||ce(i))&&(i=Ft(i)),i}).concatAll()}function L(e){this.comparer=e,this.set=[]}function N(e,t,r){var n=he(t,r,3);return e.map(function(t,r){var i=n(t,r,e);return X(i)&&(i=At(i)),(ue(i)||ce(i))&&(i=Ft(i)),i}).mergeAll()}var I={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},D=I[typeof window]&&window||this,k=I[typeof r]&&r&&!r.nodeType&&r,F=I[typeof t]&&t&&!t.nodeType&&t,B=F&&F.exports===k&&k,U=I[typeof n]&&n;!U||U.global!==U&&U.window!==U||(D=U);var z={internals:{},config:{Promise:D.Promise},helpers:{}},$=z.helpers.noop=function(){},G=(z.helpers.notDefined=function(e){return void 0===e},z.helpers.identity=function(e){return e}),V=(z.helpers.pluck=function(e){return function(t){return t[e]}},z.helpers.just=function(e){return function(){return e}},z.helpers.defaultNow=Date.now),H=z.helpers.defaultComparer=function(e,t){return Ne(e,t)},q=z.helpers.defaultSubComparer=function(e,t){return e>t?1:t>e?-1:0},W=(z.helpers.defaultKeySerializer=function(e){return e.toString()},z.helpers.defaultError=function(e){throw e}),X=z.helpers.isPromise=function(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then},Y=(z.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},z.helpers.not=function(e){return!e},z.helpers.isFunction=function(){var e=function(e){return"function"==typeof e||!1};return e(/x/)&&(e=function(e){return"function"==typeof e&&"[object Function]"==we.call(e)}),e}());z.config.longStackSupport=!1;var K=!1;try{throw new Error}catch(e){K=!!e.stack}var Z,J=c(),Q="From previous event:";(z.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)}).prototype=Error.prototype;var ee=z.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};ee.prototype=Error.prototype;var te=z.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};te.prototype=Error.prototype;var re=z.NotSupportedError=function(e){this.message=e||"This operation is not supported",Error.call(this)};re.prototype=Error.prototype;var ne=z.NotImplementedError=function(e){this.message=e||"This operation is not implemented",Error.call(this)};ne.prototype=Error.prototype;var ie=z.helpers.notImplemented=function(){throw new ne},oe=z.helpers.notSupported=function(){throw new re},ae="function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";D.Set&&"function"==typeof(new D.Set)["@@iterator"]&&(ae="@@iterator");var se=z.doneEnumerator={done:!0,value:i},ce=z.helpers.isIterable=function(e){return e[ae]!==i},ue=z.helpers.isArrayLike=function(e){return e&&e.length!==i};z.helpers.iterator=ae;var he=z.internals.bindCallback=function(e,t,r){if(void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}},le=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],pe=le.length,fe="[object Arguments]",de="[object Array]",me="[object Boolean]",ve="[object Date]",ge="[object Error]",ye="[object Number]",be="[object Object]",_e="[object RegExp]",xe="[object String]",we=Object.prototype.toString,Se=Object.prototype.hasOwnProperty,Me=we.call(arguments)==fe,Ee=Error.prototype,Ce=Object.prototype,Te=String.prototype,Oe=Ce.propertyIsEnumerable;try{!(we.call(document)==be&&!({toString:0}+""))}catch(e){!0}var Pe={};Pe[de]=Pe[ve]=Pe[ye]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},Pe[me]=Pe[xe]={constructor:!0,toString:!0,valueOf:!0},Pe[ge]=Pe["[object Function]"]=Pe[_e]={constructor:!0,toString:!0},Pe[be]={constructor:!0};var je={};!function(){var e=function(){this.x=1},t=[];e.prototype={valueOf:1,y:1};for(var r in new e)t.push(r);for(r in arguments);je.enumErrorProps=Oe.call(Ee,"message")||Oe.call(Ee,"name"),je.enumPrototypes=Oe.call(e,"prototype"),je.nonEnumArgs=0!=r,je.nonEnumShadows=!/valueOf/.test(t)}(1);var Ae=z.internals.isObject=function(e){var t=typeof e;return e&&("function"==t||"object"==t)||!1},Re=function(e){return!(!e||"object"!=typeof e)&&we.call(e)==fe};Me||(Re=function(e){return!(!e||"object"!=typeof e)&&Se.call(e,"callee")});var Le,Ne=z.internals.isEqual=function(e,t){return f(e,t,[],[])},Ie=Array.prototype.slice,De=this.inherits=z.internals.inherits=function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r},ke=z.internals.addProperties=function(e){for(var t=[],r=1,n=arguments.length;n>r;r++)t.push(arguments[r]);for(var i=0,o=t.length;o>i;i++){var a=t[i];for(var s in a)e[s]=a[s]}},Fe=z.internals.addRef=function(e,t){return new dr(function(r){return new $e(t.getDisposable(),e.subscribe(r))})},Be={e:{}};g.prototype.compareTo=function(e){var t=this.value.compareTo(e.value);return 0===t&&(t=this.id-e.id),t};var Ue=z.internals.PriorityQueue=function(e){this.items=new Array(e),this.length=0},ze=Ue.prototype;ze.isHigherPriority=function(e,t){return this.items[e].compareTo(this.items[t])<0},ze.percolate=function(e){if(!(e>=this.length||0>e)){var t=e-1>>1;if(!(0>t||t===e)&&this.isHigherPriority(e,t)){var r=this.items[e];this.items[e]=this.items[t],this.items[t]=r,this.percolate(t)}}},ze.heapify=function(e){if(+e||(e=0),!(e>=this.length||0>e)){var t=2*e+1,r=2*e+2,n=e;if(t<this.length&&this.isHigherPriority(t,n)&&(n=t),r<this.length&&this.isHigherPriority(r,n)&&(n=r),n!==e){var i=this.items[e];this.items[e]=this.items[n],this.items[n]=i,this.heapify(n)}}},ze.peek=function(){return this.items[0].value},ze.removeAt=function(e){this.items[e]=this.items[--this.length],this.items[this.length]=i,this.heapify()},ze.dequeue=function(){var e=this.peek();return this.removeAt(0),e},ze.enqueue=function(e){var t=this.length++;this.items[t]=new g(Ue.count++,e),this.percolate(t)},ze.remove=function(e){for(var t=0;t<this.length;t++)if(this.items[t].value===e)return this.removeAt(t),!0;return!1},Ue.count=0;var $e=z.CompositeDisposable=function(){var e,t,r=[];if(Array.isArray(arguments[0]))r=arguments[0],t=r.length;else for(t=arguments.length,r=new Array(t),e=0;t>e;e++)r[e]=arguments[e];for(e=0;t>e;e++)if(!We(r[e]))throw new TypeError("Not a disposable");this.disposables=r,this.isDisposed=!1,this.length=r.length},Ge=$e.prototype;Ge.add=function(e){this.isDisposed?e.dispose():(this.disposables.push(e),this.length++)},Ge.remove=function(e){var t=!1;if(!this.isDisposed){var r=this.disposables.indexOf(e);-1!==r&&(t=!0,this.disposables.splice(r,1),this.length--,e.dispose())}return t},Ge.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;for(var e=this.disposables.length,t=new Array(e),r=0;e>r;r++)t[r]=this.disposables[r];for(this.disposables=[],this.length=0,r=0;e>r;r++)t[r].dispose()}};var Ve=z.Disposable=function(e){this.isDisposed=!1,this.action=e||$};Ve.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var He=Ve.create=function(e){return new Ve(e)},qe=Ve.empty={dispose:$},We=Ve.isDisposable=function(e){return e&&Y(e.dispose)},Xe=Ve.checkDisposed=function(e){if(e.isDisposed)throw new ee},Ye=z.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};Ye.prototype.getDisposable=function(){return this.current},Ye.prototype.setDisposable=function(e){if(this.current)throw new Error("Disposable has already been assigned");var t=this.isDisposed;!t&&(this.current=e),t&&e&&e.dispose()},Ye.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var e=this.current;this.current=null}e&&e.dispose()};var Ke=z.SerialDisposable=function(){this.isDisposed=!1,this.current=null};Ke.prototype.getDisposable=function(){return this.current},Ke.prototype.setDisposable=function(e){var t=this.isDisposed;if(!t){var r=this.current;this.current=e}r&&r.dispose(),t&&e&&e.dispose()},Ke.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var e=this.current;this.current=null}e&&e.dispose()};var Ze=z.RefCountDisposable=function(){function e(e){this.disposable=e,this.disposable.count++,this.isInnerDisposed=!1}function t(e){this.underlyingDisposable=e,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return e.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},t.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},t.prototype.getDisposable=function(){return this.isDisposed?qe:new e(this)},t}();y.prototype.dispose=function(){this.scheduler.scheduleWithState(this,b)};var Je=z.internals.ScheduledItem=function(e,t,r,n,i){this.scheduler=e,this.state=t,this.action=r,this.dueTime=n,this.comparer=i||q,this.disposable=new Ye};Je.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},Je.prototype.compareTo=function(e){return this.comparer(this.dueTime,e.dueTime)},Je.prototype.isCancelled=function(){return this.disposable.isDisposed},Je.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Qe=z.Scheduler=function(){function e(e,t,r,n){this.now=e,this._schedule=t,this._scheduleRelative=r,this._scheduleAbsolute=n}function t(e,t){return t(),qe}e.isScheduler=function(t){return t instanceof e};var r=e.prototype;return r.schedule=function(e){return this._schedule(e,t)},r.scheduleWithState=function(e,t){return this._schedule(e,t)},r.scheduleWithRelative=function(e,r){return this._scheduleRelative(r,e,t)},r.scheduleWithRelativeAndState=function(e,t,r){return this._scheduleRelative(e,t,r)},r.scheduleWithAbsolute=function(e,r){return this._scheduleAbsolute(r,e,t)},r.scheduleWithAbsoluteAndState=function(e,t,r){return this._scheduleAbsolute(e,t,r)},e.now=V,e.normalize=function(e){return 0>e&&(e=0),e},e}(),et=Qe.normalize,tt=Qe.isScheduler;!function(e){function t(e,t){function r(t){i(t,function(t){var n=!1,i=!1,a=e.scheduleWithState(t,function(e,t){return n?o.remove(a):i=!0,r(t),qe});i||(o.add(a),n=!0)})}var n=t[0],i=t[1],o=new $e;return r(n),o}function r(e,t,r){function n(t){o(t,function(t,i){var o=!1,s=!1,c=e[r](t,i,function(e,t){return o?a.remove(c):s=!0,n(t),qe});s||(a.add(c),o=!0)})}var i=t[0],o=t[1],a=new $e;return n(i),a}function n(e,t){e(function(r){t(e,r)})}e.scheduleRecursive=function(e){return this.scheduleRecursiveWithState(e,n)},e.scheduleRecursiveWithState=function(e,r){return this.scheduleWithState([e,r],t)},e.scheduleRecursiveWithRelative=function(e,t){return this.scheduleRecursiveWithRelativeAndState(t,e,n)},e.scheduleRecursiveWithRelativeAndState=function(e,t,n){return this._scheduleRelative([e,n],t,function(e,t){return r(e,t,"scheduleWithRelativeAndState")})},e.scheduleRecursiveWithAbsolute=function(e,t){return this.scheduleRecursiveWithAbsoluteAndState(t,e,n)},e.scheduleRecursiveWithAbsoluteAndState=function(e,t,n){return this._scheduleAbsolute([e,n],t,function(e,t){return r(e,t,"scheduleWithAbsoluteAndState")})}}(Qe.prototype),Qe.prototype,Qe.prototype.schedulePeriodic=function(e,t){return this.schedulePeriodicWithState(null,e,t)},Qe.prototype.schedulePeriodicWithState=function(e,t,r){if(void 0===D.setInterval)throw new re;t=et(t);var n=e,i=D.setInterval(function(){n=r(n)},t);return He(function(){D.clearInterval(i)})},function(e){e.catchError=e.catch=function(e){return new ut(this,e)}}(Qe.prototype);var rt,nt,it=(z.internals.SchedulePeriodicRecursive=function(){function e(e,t,r,n){this._scheduler=e,this._state=t,this._period=r,this._action=n}return e.prototype.start=function(){var e=new Ye;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,function(e,t){t(0,this._period);try{this._state=this._action(this._state)}catch(e){throw this._cancel.dispose(),e}}.bind(this))),e},e}(),Qe.immediate=function(){return new Qe(V,function(e,t){return t(this,e)},oe,oe)}()),ot=Qe.currentThread=function(){function e(){for(;t.length>0;){var e=t.dequeue();!e.isCancelled()&&e.invoke()}}var t,r=new Qe(V,function(r,n){var i=new Je(this,r,n,this.now());if(t)t.enqueue(i);else{(t=new Ue(4)).enqueue(i);var o=m(e)();if(t=null,o===Be)return v(o.e)}return i.disposable},oe,oe);return r.scheduleRequired=function(){return!t},r}(),at=function(){var e,t=$;if(D.setTimeout)e=D.setTimeout,t=D.clearTimeout;else{if(!D.WScript)throw new re;e=function(e,t){D.WScript.Sleep(t),e()}}return{setTimeout:e,clearTimeout:t}}(),st=at.setTimeout,ct=at.clearTimeout;!function(){function t(e){if(o)st(function(){t(e)},0);else{var r=i[e];if(r){o=!0;var n=m(r)();if(nt(e),o=!1,n===Be)return v(n.e)}}}function r(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))}var n=1,i={},o=!1;nt=function(e){delete i[e]};var a=RegExp("^"+String(we).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),s="function"==typeof(s=U&&B&&U.setImmediate)&&!a.test(s)&&s;if(Y(s))rt=function(e){var r=n++;return i[r]=e,s(function(){t(r)}),r};else if(void 0!==e&&"[object process]"==={}.toString.call(e))rt=function(r){var o=n++;return i[o]=r,e.nextTick(function(){t(o)}),o};else if(function(){if(!D.postMessage||D.importScripts)return!1;var e=!1,t=D.onmessage;return D.onmessage=function(){e=!0},D.postMessage("","*"),D.onmessage=t,e}()){var c="ms.rx.schedule"+Math.random();D.addEventListener?D.addEventListener("message",r,!1):D.attachEvent?D.attachEvent("onmessage",r):D.onmessage=r,rt=function(e){var t=n++;return i[t]=e,D.postMessage(c+currentId,"*"),t}}else if(D.MessageChannel){var u=new D.MessageChannel;u.port1.onmessage=function(e){t(e.data)},rt=function(e){var t=n++;return i[t]=e,u.port2.postMessage(t),t}}else rt="document"in D&&"onreadystatechange"in D.document.createElement("script")?function(e){var r=D.document.createElement("script"),o=n++;return i[o]=e,r.onreadystatechange=function(){t(o),r.onreadystatechange=null,r.parentNode.removeChild(r),r=null},D.document.documentElement.appendChild(r),o}:function(e){var r=n++;return i[r]=e,st(function(){t(r)},0),r}}();var ut=(Qe.timeout=Qe.default=function(){return new Qe(V,function(e,t){var r=this,n=new Ye,i=rt(function(){!n.isDisposed&&n.setDisposable(t(r,e))});return new $e(n,He(function(){nt(i)}))},function(e,t,r){var n=this,i=Qe.normalize(t),o=new Ye;if(0===i)return n.scheduleWithState(e,r);var a=st(function(){!o.isDisposed&&o.setDisposable(r(n,e))},i);return new $e(o,He(function(){ct(a)}))},function(e,t,r){return this.scheduleWithRelativeAndState(e,t-this.now(),r)})}(),function(e){function t(e,t){return this._scheduler.scheduleWithState(e,this._wrap(t))}function r(e,t,r){return this._scheduler.scheduleWithRelativeAndState(e,t,this._wrap(r))}function n(e,t,r){return this._scheduler.scheduleWithAbsoluteAndState(e,t,this._wrap(r))}function i(i,o){this._scheduler=i,this._handler=o,this._recursiveOriginal=null,this._recursiveWrapper=null,e.call(this,this._scheduler.now.bind(this._scheduler),t,r,n)}return De(i,e),i.prototype._clone=function(e){return new i(e,this._handler)},i.prototype._wrap=function(e){var t=this;return function(r,n){try{return e(t._getRecursiveWrapper(r),n)}catch(e){if(!t._handler(e))throw e;return qe}}},i.prototype._getRecursiveWrapper=function(e){if(this._recursiveOriginal!==e){this._recursiveOriginal=e;var t=this._clone(e);t._recursiveOriginal=e,t._recursiveWrapper=t,this._recursiveWrapper=t}return this._recursiveWrapper},i.prototype.schedulePeriodicWithState=function(e,t,r){var n=this,i=!1,o=new Ye;return o.setDisposable(this._scheduler.schedulePeriodicWithState(e,t,function(e){if(i)return null;try{return r(e)}catch(e){if(i=!0,!n._handler(e))throw e;return o.dispose(),null}})),o},i}(Qe)),ht=z.Notification=function(){function e(e,t,r,n,i,o){this.kind=e,this.value=t,this.exception=r,this._accept=n,this._acceptObservable=i,this.toString=o}return e.prototype.accept=function(e,t,r){return e&&"object"==typeof e?this._acceptObservable(e):this._accept(e,t,r)},e.prototype.toObservable=function(e){var t=this;return tt(e)||(e=it),new dr(function(r){return e.scheduleWithState(t,function(e,t){t._acceptObservable(r),"N"===t.kind&&r.onCompleted()})})},e}(),lt=ht.createOnNext=function(){function e(e){return e(this.value)}function t(e){return e.onNext(this.value)}function r(){return"OnNext("+this.value+")"}return function(n){return new ht("N",n,null,e,t,r)}}(),pt=ht.createOnError=function(){function e(e,t){return t(this.exception)}function t(e){return e.onError(this.exception)}function r(){return"OnError("+this.exception+")"}return function(n){return new ht("E",null,n,e,t,r)}}(),ft=ht.createOnCompleted=function(){function e(e,t,r){return r()}function t(e){return e.onCompleted()}function r(){return"OnCompleted()"}return function(){return new ht("C",null,null,e,t,r)}}(),dt=z.Observer=function(){};dt.prototype.toNotifier=function(){var e=this;return function(t){return t.accept(e)}},dt.prototype.asObserver=function(){return new yt(this.onNext.bind(this),this.onError.bind(this),this.onCompleted.bind(this))},dt.prototype.checked=function(){return new bt(this)};var mt=dt.create=function(e,t,r){return e||(e=$),t||(t=W),r||(r=$),new yt(e,t,r)};dt.fromNotifier=function(e,t){return new yt(function(r){return e.call(t,lt(r))},function(r){return e.call(t,pt(r))},function(){return e.call(t,ft())})},dt.prototype.notifyOn=function(e){return new _t(e,this)},dt.prototype.makeSafe=function(e){return new AnonymousSafeObserver(this._onNext,this._onError,this._onCompleted,e)};var vt,gt=z.internals.AbstractObserver=function(e){function t(){this.isStopped=!1,e.call(this)}return De(t,e),t.prototype.next=ie,t.prototype.error=ie,t.prototype.completed=ie,t.prototype.onNext=function(e){this.isStopped||this.next(e)},t.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.error(e))},t.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.completed())},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.error(e),!0)},t}(dt),yt=z.AnonymousObserver=function(e){function t(t,r,n){e.call(this),this._onNext=t,this._onError=r,this._onCompleted=n}return De(t,e),t.prototype.next=function(e){this._onNext(e)},t.prototype.error=function(e){this._onError(e)},t.prototype.completed=function(){this._onCompleted()},t}(gt),bt=function(e){function t(t){e.call(this),this._observer=t,this._state=0}De(t,e);var r=t.prototype;return r.onNext=function(e){this.checkAccess();var t=m(this._observer.onNext).call(this._observer,e);this._state=0,t===Be&&v(t.e)},r.onError=function(e){this.checkAccess();var t=m(this._observer.onError).call(this._observer,e);this._state=2,t===Be&&v(t.e)},r.onCompleted=function(){this.checkAccess();var e=m(this._observer.onCompleted).call(this._observer);this._state=2,e===Be&&v(e.e)},r.checkAccess=function(){if(1===this._state)throw new Error("Re-entrancy detected");if(2===this._state)throw new Error("Observer completed");0===this._state&&(this._state=1)},t}(dt),_t=function(e){function t(t,r,n){e.call(this,t,r),this._cancel=n}return De(t,e),t.prototype.next=function(t){e.prototype.next.call(this,t),this.ensureActive()},t.prototype.error=function(t){e.prototype.error.call(this,t),this.ensureActive()},t.prototype.completed=function(){e.prototype.completed.call(this),this.ensureActive()},t.prototype.dispose=function(){e.prototype.dispose.call(this),this._cancel&&this._cancel.dispose(),this._cancel=null},t}(z.internals.ScheduledObserver=function(e){function t(t,r){e.call(this),this.scheduler=t,this.observer=r,this.isAcquired=!1,this.hasFaulted=!1,this.queue=[],this.disposable=new Ke}return De(t,e),t.prototype.next=function(e){var t=this;this.queue.push(function(){t.observer.onNext(e)})},t.prototype.error=function(e){var t=this;this.queue.push(function(){t.observer.onError(e)})},t.prototype.completed=function(){var e=this;this.queue.push(function(){e.observer.onCompleted()})},t.prototype.ensureActive=function(){var e=!1,t=this;!this.hasFaulted&&this.queue.length>0&&(e=!this.isAcquired,this.isAcquired=!0),e&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(e){var r;if(t.queue.length>0){r=t.queue.shift();try{r()}catch(e){throw t.queue=[],t.hasFaulted=!0,e}e()}else t.isAcquired=!1}))},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.disposable.dispose()},t}(gt)),xt=z.Observable=function(){function e(e){if(z.config.longStackSupport&&K){try{throw new Error}catch(e){this.stack=e.stack.substring(e.stack.indexOf("\n")+1)}var t=this;this._subscribe=function(r){var n=r.onError.bind(r);return r.onError=function(e){a(e,t),n(e)},e.call(t,r)}}else this._subscribe=e}return vt=e.prototype,vt.subscribe=vt.forEach=function(e,t,r){return this._subscribe("object"==typeof e?e:mt(e,t,r))},vt.subscribeOnNext=function(e,t){return this._subscribe(mt(void 0!==t?function(r){e.call(t,r)}:e))},vt.subscribeOnError=function(e,t){return this._subscribe(mt(null,void 0!==t?function(r){e.call(t,r)}:e))},vt.subscribeOnCompleted=function(e,t){return this._subscribe(mt(null,null,void 0!==t?function(){e.call(t)}:e))},e}(),wt=z.ObservableBase=function(e){function t(e,t){var r=t[0],n=t[1],i=m(n.subscribeCore).call(n,r);return i!==Be||r.fail(Be.e)?void r.setDisposable(function(e){return e&&Y(e.dispose)?e:Y(e)?He(e):qe}(i)):v(Be.e)}function r(e){var r=new mr(e),n=[r,this];return ot.scheduleRequired()?ot.scheduleWithState(n,t):t(0,n),r}function n(){e.call(this,r)}return De(n,e),n.prototype.subscribeCore=ie,n}(xt),St=z.internals.Enumerable=function(){},Mt=function(e){function t(t){this.sources=t,e.call(this)}function r(e,t,r){this.o=e,this.s=t,this.e=r,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){var t,n=new Ke,i=it.scheduleRecursiveWithState(this.sources[ae](),function(i,o){if(!t){var a=m(i.next).call(i);if(a===Be)return e.onError(a.e);if(a.done)return e.onCompleted();var s=a.value;X(s)&&(s=At(s));var c=new Ye;n.setDisposable(c),c.setDisposable(s.subscribe(new r(e,o,i)))}});return new $e(n,i,He(function(){t=!0}))},r.prototype.onNext=function(e){this.isStopped||this.o.onNext(e)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.s(this.e))},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);St.prototype.concat=function(){return new Mt(this)};var Et=function(e){function t(t){this.sources=t,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){var t,r=this.sources[ae](),n=new Ke,i=it.scheduleRecursiveWithState(null,function(i,o){if(!t){var a=m(r.next).call(r);if(a===Be)return e.onError(a.e);if(a.done)return null!==i?e.onError(i):e.onCompleted();var s=a.value;X(s)&&(s=At(s));var c=new Ye;n.setDisposable(c),c.setDisposable(s.subscribe(function(t){e.onNext(t)},o,function(){e.onCompleted()}))}});return new $e(n,i,He(function(){t=!0}))},t}(wt);St.prototype.catchError=function(){return new Et(this)},St.prototype.catchErrorWhen=function(e){var t=this;return new dr(function(r){var n,i=new gr,o=new gr,a=e(i).subscribe(o),s=t[ae](),c=new Ke,u=it.scheduleRecursive(function(e){if(!n){var t=m(s.next).call(s);if(t===Be)return r.onError(t.e);if(t.done)return void r.onCompleted();var a=t.value;X(a)&&(a=At(a));var u=new Ye,h=new Ye;c.setDisposable(new $e(h,u)),u.setDisposable(a.subscribe(function(e){r.onNext(e)},function(t){h.setDisposable(o.subscribe(e,function(e){r.onError(e)},function(){r.onCompleted()})),i.onNext(t)},function(){r.onCompleted()}))}});return new $e(a,c,u,He(function(){n=!0}))})};var Ct=function(e){function t(e,t){this.v=e,this.c=null==t?-1:t}function r(e){this.v=e.v,this.l=e.c}return De(t,St),t.prototype[ae]=function(){return new r(this)},r.prototype.next=function(){return 0===this.l?se:(this.l>0&&this.l--,{done:!1,value:this.v})},t}(),Tt=St.repeat=function(e,t){return new Ct(e,t)},Ot=function(e){function t(e,t,r){this.s=e,this.fn=t?he(t,r,3):null}function r(e){this.i=-1,this.s=e.s,this.l=this.s.length,this.fn=e.fn}return De(t,St),t.prototype[ae]=function(){return new r(this)},r.prototype.next=function(){return++this.i<this.l?{done:!1,value:this.fn?this.fn(this.s[this.i],this.i,this.s):this.s[this.i]}:se},t}(),Pt=St.of=function(e,t,r){return new Ot(e,t,r)};vt.observeOn=function(e){var t=this;return new dr(function(r){return t.subscribe(new _t(e,r))},t)},vt.subscribeOn=function(e){var t=this;return new dr(function(r){var n=new Ye,i=new Ke;return i.setDisposable(n),n.setDisposable(e.schedule(function(){i.setDisposable(new y(e,t.subscribe(r)))})),i},t)};var jt=function(e){function t(t){this.p=t,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return this.p.then(function(t){e.onNext(t),e.onCompleted()},function(t){e.onError(t)}),qe},t}(wt),At=xt.fromPromise=function(e){return new jt(e)};vt.toPromise=function(e){if(e||(e=z.config.Promise),!e)throw new re("Promise type not provided nor in Rx.config.Promise");var t=this;return new e(function(e,r){var n,i=!1;t.subscribe(function(e){n=e,i=!0},r,function(){i&&e(n)})})};var Rt=function(e){function t(t){this.source=t,e.call(this)}function r(e){this.o=e,this.a=[],this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e))},r.prototype.onNext=function(e){this.isStopped||this.a.push(e)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onNext(this.a),this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.toArray=function(){return new Rt(this)},xt.create=xt.createWithDisposable=function(e,t){return new dr(e,t)};var Lt=(xt.defer=function(e){return new dr(function(t){var r;try{r=e()}catch(e){return Yt(e).subscribe(t)}return X(r)&&(r=At(r)),r.subscribe(t)})},function(e){function t(t){this.scheduler=t,e.call(this)}function r(e,t){this.observer=e,this.parent=t}function n(e,t){t.onCompleted()}return De(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.parent.scheduler.scheduleWithState(this.observer,n)},t}(wt)),Nt=xt.empty=function(e){return tt(e)||(e=it),new Lt(e)},It=function(e){function t(t,r,n){this.iterable=t,this.mapper=r,this.scheduler=n,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return new Dt(e,this).run()},t}(wt),Dt=function(){function e(e,t){this.observer=e,this.parent=t}return e.prototype.run=function(){var e=function(e){var t=e[ae];if(!t&&"string"==typeof e)return new _(e)[ae]();if(!t&&e.length!==i)return new w(e)[ae]();if(!t)throw new TypeError("Object is not iterable");return e[ae]()}(Object(this.parent.iterable)),t=this.observer,r=this.parent.mapper;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){try{var o=e.next()}catch(e){return t.onError(e)}if(o.done)return t.onCompleted();var a=o.value;if(r)try{a=r(a,n)}catch(e){return t.onError(e)}t.onNext(a),i(n+1)})},e}(),kt=Math.pow(2,53)-1;_.prototype[ae]=function(){return new x(this._s)},x.prototype[ae]=function(){return this},x.prototype.next=function(){return this._i<this._l?{done:!1,value:this._s.charAt(this._i++)}:se},w.prototype[ae]=function(){return new S(this._a)},S.prototype[ae]=function(){return this},S.prototype.next=function(){return this._i<this._l?{done:!1,value:this._a[this._i++]}:se};var Ft=xt.from=function(e,t,r,n){if(null==e)throw new Error("iterable cannot be null.");if(t&&!Y(t))throw new Error("mapFn when provided must be a function");if(t)var i=he(t,r,2);return tt(n)||(n=ot),new It(e,i,n)},Bt=function(e){function t(t,r){this.args=t,this.scheduler=r,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return new M(e,this).run()},t}(wt);M.prototype.run=function(){var e=this.observer,t=this.parent.args,r=t.length;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){r>n?(e.onNext(t[n]),i(n+1)):e.onCompleted()})};var Ut=xt.fromArray=function(e,t){return tt(t)||(t=ot),new Bt(e,t)};xt.generate=function(e,t,r,n,i){return tt(i)||(i=ot),new dr(function(o){var a=!0;return i.scheduleRecursiveWithState(e,function(e,i){var s,c;try{a?a=!1:e=r(e),(s=t(e))&&(c=n(e))}catch(e){return o.onError(e)}s?(o.onNext(c),i(e)):o.onCompleted()})})};var zt=function(e){function t(){e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return qe},t}(wt),$t=xt.never=function(){return new zt};xt.of=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];return new Bt(t,ot)},xt.ofWithScheduler=function(e){for(var t=arguments.length,r=new Array(t-1),n=1;t>n;n++)r[n-1]=arguments[n];return new Bt(r,e)};var Gt=function(e){function t(t,r){this.obj=t,this.keys=Object.keys(t),this.scheduler=r,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return new C(e,this).run()},t}(wt);C.prototype.run=function(){var e=this.observer,t=this.parent.obj,r=this.parent.keys,n=r.length;return this.parent.scheduler.scheduleRecursiveWithState(0,function(i,o){if(n>i){var a=r[i];e.onNext([a,t[a]]),o(i+1)}else e.onCompleted()})},xt.pairs=function(e,t){return t||(t=ot),new Gt(e,t)};var Vt=function(e){function t(t,r,n){this.start=t,this.rangeCount=r,this.scheduler=n,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return new Ht(e,this).run()},t}(wt),Ht=function(){function e(e,t){this.observer=e,this.parent=t}return e.prototype.run=function(){var e=this.parent.start,t=this.parent.rangeCount,r=this.observer;return this.parent.scheduler.scheduleRecursiveWithState(0,function(n,i){t>n?(r.onNext(e+n),i(n+1)):r.onCompleted()})},e}();xt.range=function(e,t,r){return tt(r)||(r=ot),new Vt(e,t,r)};var qt=function(e){function t(t,r,n){this.value=t,this.repeatCount=null==r?-1:r,this.scheduler=n,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return new T(e,this).run()},t}(wt);T.prototype.run=function(){var e=this.observer,t=this.parent.value;return this.parent.scheduler.scheduleRecursiveWithState(this.parent.repeatCount,function(r,n){return(-1===r||r>0)&&(e.onNext(t),r>0&&r--),0===r?e.onCompleted():void n(r)})},xt.repeat=function(e,t,r){return tt(r)||(r=ot),new qt(e,t,r)};var Wt=function(e){function t(t,r){this.value=t,this.scheduler=r,e.call(this)}function r(e,t){this.observer=e,this.parent=t}function n(e,t){var r=t[0],n=t[1];n.onNext(r),n.onCompleted()}return De(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.parent.scheduler.scheduleWithState([this.parent.value,this.observer],n)},t}(wt),Xt=(xt.return=xt.just=xt.returnValue=function(e,t){return tt(t)||(t=it),new Wt(e,t)},function(e){function t(t,r){this.error=t,this.scheduler=r,e.call(this)}function r(e,t){this.o=e,this.p=t}function n(e,t){var r=t[0];t[1].onError(r)}return De(t,e),t.prototype.subscribeCore=function(e){return new r(e,this).run()},r.prototype.run=function(){return this.p.scheduler.scheduleWithState([this.p.error,this.o],n)},t}(wt)),Yt=xt.throw=xt.throwError=xt.throwException=function(e,t){return tt(t)||(t=it),new Xt(e,t)};xt.using=function(e,t){return new dr(function(r){var n,i,o=qe;try{(n=e())&&(o=n),i=t(n)}catch(e){return new $e(Yt(e).subscribe(r),o)}return new $e(i.subscribe(r),o)})},vt.amb=function(e){var t=this;return new dr(function(r){function n(){o||(o=a,u.dispose())}function i(){o||(o=s,c.dispose())}var o,a="L",s="R",c=new Ye,u=new Ye;return X(e)&&(e=At(e)),c.setDisposable(t.subscribe(function(e){n(),o===a&&r.onNext(e)},function(e){n(),o===a&&r.onError(e)},function(){n(),o===a&&r.onCompleted()})),u.setDisposable(e.subscribe(function(e){i(),o===s&&r.onNext(e)},function(e){i(),o===s&&r.onError(e)},function(){i(),o===s&&r.onCompleted()})),new $e(c,u)})},xt.amb=function(){function e(e,t){return e.amb(t)}var t=$t(),r=[];if(Array.isArray(arguments[0]))r=arguments[0];else for(var n=0,i=arguments.length;i>n;n++)r.push(arguments[n]);for(var n=0,i=r.length;i>n;n++)t=e(t,r[n]);return t},vt.catch=vt.catchError=vt.catchException=function(e){return"function"==typeof e?function(e,t){return new dr(function(r){var n=new Ye,i=new Ke;return i.setDisposable(n),n.setDisposable(e.subscribe(function(e){r.onNext(e)},function(e){try{var n=t(e)}catch(e){return r.onError(e)}X(n)&&(n=At(n));var o=new Ye;i.setDisposable(o),o.setDisposable(n.subscribe(r))},function(e){r.onCompleted(e)})),i},e)}(this,e):Kt([this,e])};var Kt=xt.catchError=xt.catch=xt.catchException=function(){var e=[];if(Array.isArray(arguments[0]))e=arguments[0];else for(var t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return Pt(e).catchError()};vt.combineLatest=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];return Array.isArray(t[0])?t[0].unshift(this):t.unshift(this),Zt.apply(this,t)};var Zt=xt.combineLatest=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.pop();return Array.isArray(t[0])&&(t=t[0]),new dr(function(e){function r(t){if(s[t]=!0,c||(c=s.every(G))){try{var r=n.apply(null,h)}catch(t){return e.onError(t)}e.onNext(r)}else u.filter(function(e,r){return r!==t}).every(G)&&e.onCompleted()}function i(t){u[t]=!0,u.every(G)&&e.onCompleted()}for(var o=t.length,a=function(){return!1},s=d(o,a),c=!1,u=d(o,a),h=new Array(o),l=new Array(o),p=0;o>p;p++)!function(n){var o=t[n],a=new Ye;X(o)&&(o=At(o)),a.setDisposable(o.subscribe(function(e){h[n]=e,r(n)},function(t){e.onError(t)},function(){i(n)})),l[n]=a}(p);return new $e(l)},this)};vt.concat=function(){for(var e=[],t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return e.unshift(this),Qt.apply(null,e)};var Jt=function(e){function t(t){this.sources=t,e.call(this)}function r(e,t){this.sources=e,this.o=t}return De(t,e),t.prototype.subscribeCore=function(e){return new r(this.sources,e).run()},r.prototype.run=function(){var e,t=new Ke,r=this.sources,n=r.length,i=this.o,o=it.scheduleRecursiveWithState(0,function(o,a){if(!e){if(o===n)return i.onCompleted();var s=r[o];X(s)&&(s=At(s));var c=new Ye;t.setDisposable(c),c.setDisposable(s.subscribe(function(e){i.onNext(e)},function(e){i.onError(e)},function(){a(o+1)}))}});return new $e(t,o,He(function(){e=!0}))},t}(wt),Qt=xt.concat=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{e=new Array(arguments.length);for(var t=0,r=arguments.length;r>t;t++)e[t]=arguments[t]}return new Jt(e)};vt.concatAll=vt.concatObservable=function(){return this.merge(1)};var er=function(e){function t(t,r){this.source=t,this.maxConcurrent=r,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){var t=new $e;return t.add(this.source.subscribe(new tr(e,this.maxConcurrent,t))),t},t}(wt),tr=function(){function e(e,t,r){this.o=e,this.max=t,this.g=r,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function t(e,t){this.parent=e,this.sad=t,this.isStopped=!1}return e.prototype.handleSubscribe=function(e){var r=new Ye;this.g.add(r),X(e)&&(e=At(e)),r.setDisposable(e.subscribe(new t(this,r)))},e.prototype.onNext=function(e){this.isStopped||(this.activeCount<this.max?(this.activeCount++,this.handleSubscribe(e)):this.q.push(e))},e.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},e.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,0===this.activeCount&&this.o.onCompleted())},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t.prototype.onNext=function(e){this.isStopped||this.parent.o.onNext(e)},t.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.o.onError(e))},t.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var e=this.parent;e.g.remove(this.sad),e.q.length>0?e.handleSubscribe(e.q.shift()):(e.activeCount--,e.done&&0===e.activeCount&&e.o.onCompleted())}},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},e}();vt.merge=function(e){return"number"!=typeof e?rr(this,e):new er(this,e)};var rr=xt.merge=function(){var e,t,r=[],n=arguments.length;if(arguments[0])if(tt(arguments[0]))for(e=arguments[0],t=1;n>t;t++)r.push(arguments[t]);else for(e=it,t=0;n>t;t++)r.push(arguments[t]);else for(e=it,t=1;n>t;t++)r.push(arguments[t]);return Array.isArray(r[0])&&(r=r[0]),E(e,r).mergeAll()},nr=z.CompositeError=function(e){this.name="NotImplementedError",this.innerErrors=e,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};nr.prototype=Error.prototype,xt.mergeDelayError=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{var t=arguments.length;e=new Array(t);for(var r=0;t>r;r++)e[r]=arguments[r]}var n=E(null,e);return new dr(function(e){function t(){0===a.length?e.onCompleted():1===a.length?e.onError(a[0]):e.onError(new nr(a))}var r=new $e,i=new Ye,o=!1,a=[];return r.add(i),i.setDisposable(n.subscribe(function(n){var i=new Ye;r.add(i),X(n)&&(n=At(n)),i.setDisposable(n.subscribe(function(t){e.onNext(t)},function(e){a.push(e),r.remove(i),o&&1===r.length&&t()},function(){r.remove(i),o&&1===r.length&&t()}))},function(e){a.push(e),o=!0,1===r.length&&t()},function(){o=!0,1===r.length&&t()})),r})};var ir=function(e){function t(t){this.source=t,e.call(this)}function r(e,t){this.o=e,this.g=t,this.isStopped=!1,this.done=!1}function n(e,t,r){this.parent=e,this.g=t,this.sad=r,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){var t=new $e,n=new Ye;return t.add(n),n.setDisposable(this.source.subscribe(new r(e,t))),t},r.prototype.onNext=function(e){if(!this.isStopped){var t=new Ye;this.g.add(t),X(e)&&(e=At(e)),t.setDisposable(e.subscribe(new n(this,this.g,t)))}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},n.prototype.onNext=function(e){this.isStopped||this.parent.o.onNext(e)},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.o.onError(e))},n.prototype.onCompleted=function(){if(!this.isStopped){var e=this.parent;this.isStopped=!0,e.g.remove(this.sad),e.done&&1===e.g.length&&e.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},t}(wt);vt.mergeAll=vt.mergeObservable=function(){return new ir(this)},vt.onErrorResumeNext=function(e){if(!e)throw new Error("Second observable is required");return or([this,e])};var or=xt.onErrorResumeNext=function(){var e=[];if(Array.isArray(arguments[0]))e=arguments[0];else for(var t=0,r=arguments.length;r>t;t++)e.push(arguments[t]);return new dr(function(t){var r=0,n=new Ke,i=it.scheduleRecursive(function(i){var o,a;r<e.length?(o=e[r++],X(o)&&(o=At(o)),a=new Ye,n.setDisposable(a),a.setDisposable(o.subscribe(t.onNext.bind(t),i,i))):t.onCompleted()});return new $e(n,i)})};vt.skipUntil=function(e){var t=this;return new dr(function(r){var n=!1,i=new $e(t.subscribe(function(e){n&&r.onNext(e)},function(e){r.onError(e)},function(){n&&r.onCompleted()}));X(e)&&(e=At(e));var o=new Ye;return i.add(o),o.setDisposable(e.subscribe(function(){n=!0,o.dispose()},function(e){r.onError(e)},function(){o.dispose()})),i},t)};var ar=function(e){function t(t){this.source=t,e.call(this)}function r(e,t){this.o=e,this.inner=t,this.stopped=!1,this.latest=0,this.hasLatest=!1,this.isStopped=!1}function n(e,t){this.parent=e,this.id=t,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){var t=new Ke,n=this.source.subscribe(new r(e,t));return new $e(n,t)},r.prototype.onNext=function(e){if(!this.isStopped){var t=new Ye,r=++this.latest;this.hasLatest=!0,this.inner.setDisposable(t),X(e)&&(e=At(e)),t.setDisposable(e.subscribe(new n(this,r)))}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.stopped=!0,!this.hasLatest&&this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},n.prototype.onNext=function(e){this.isStopped||this.parent.latest===this.id&&this.parent.o.onNext(e)},n.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&this.parent.o.onError(e))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted()))},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.parent.o.onError(e),!0)},t}(wt);vt.switch=vt.switchLatest=function(){return new ar(this)};var sr=function(e){function t(t,r){this.source=t,this.other=X(r)?At(r):r,e.call(this)}function r(e){this.o=e,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return new $e(this.source.subscribe(e),this.other.subscribe(new r(e)))},r.prototype.onNext=function(e){this.isStopped||this.o.onCompleted()},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){!this.isStopped&&(this.isStopped=!0)},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.takeUntil=function(e){return new sr(this,e)},vt.withLatestFrom=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.pop(),i=this;return Array.isArray(t[0])&&(t=t[0]),new dr(function(e){for(var r=t.length,o=d(r,O),a=!1,s=new Array(r),c=new Array(r+1),u=0;r>u;u++)!function(r){var n=t[r],i=new Ye;X(n)&&(n=At(n)),i.setDisposable(n.subscribe(function(e){s[r]=e,o[r]=!0,a=o.every(G)},function(t){e.onError(t)},$)),c[r]=i}(u);var h=new Ye;return h.setDisposable(i.subscribe(function(t){var r=[t].concat(s);if(a){var i=m(n).apply(null,r);return i===Be?e.onError(i.e):void e.onNext(i)}},function(t){e.onError(t)},function(){e.onCompleted()})),c[r]=h,new $e(c)},this)},vt.zip=function(){if(Array.isArray(arguments[0]))return function(e,t){var r=this;return new dr(function(n){var i=0,o=e.length;return r.subscribe(function(r){if(o>i){var a=e[i++],s=m(t)(r,a);if(s===Be)return n.onError(s.e);n.onNext(s)}else n.onCompleted()},function(e){n.onError(e)},function(){n.onCompleted()})},r)}.apply(this,arguments);for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=this,i=t.pop();return t.unshift(n),new dr(function(e){for(var r=t.length,o=d(r,P),a=d(r,O),s=new Array(r),c=0;r>c;c++)!function(r){var c=t[r],u=new Ye;X(c)&&(c=At(c)),u.setDisposable(c.subscribe(function(t){if(o[r].push(t),o.every(function(e){return e.length>0})){var s=o.map(function(e){return e.shift()}),c=m(i).apply(n,s);if(c===Be)return e.onError(c.e);e.onNext(c)}else a.filter(function(e,t){return t!==r}).every(G)&&e.onCompleted()},function(t){e.onError(t)},function(){a[r]=!0,a.every(G)&&e.onCompleted()})),s[r]=u}(c);return new $e(s)},n)},xt.zip=function(){for(var e=arguments.length,t=new Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t.shift();return n.zip.apply(n,t)},xt.zipArray=function(){var e;if(Array.isArray(arguments[0]))e=arguments[0];else{var t=arguments.length;e=new Array(t);for(var r=0;t>r;r++)e[r]=arguments[r]}return new dr(function(t){for(var r=e.length,n=d(r,j),i=d(r,O),o=new Array(r),a=0;r>a;a++)!function(r){o[r]=new Ye,o[r].setDisposable(e[r].subscribe(function(e){if(n[r].push(e),n.every(function(e){return e.length>0})){var o=n.map(function(e){return e.shift()});t.onNext(o)}else if(i.filter(function(e,t){return t!==r}).every(G))return t.onCompleted()},function(e){t.onError(e)},function(){i[r]=!0,i.every(G)&&t.onCompleted()}))}(a);return new $e(o)})},vt.asObservable=function(){var e=this;return new dr(function(t){return e.subscribe(t)},e)},vt.bufferWithCount=function(e,t){return"number"!=typeof t&&(t=e),this.windowWithCount(e,t).selectMany(function(e){return e.toArray()}).where(function(e){return e.length>0})},vt.dematerialize=function(){var e=this;return new dr(function(t){return e.subscribe(function(e){return e.accept(t)},function(e){t.onError(e)},function(){t.onCompleted()})},this)},vt.distinctUntilChanged=function(e,t){var r=this;return t||(t=H),new dr(function(n){var i,o=!1;return r.subscribe(function(r){var a=r;if(e&&(a=m(e)(r))===Be)return n.onError(a.e);if(o){var s=m(t)(i,a);if(s===Be)return n.onError(s.e)}o&&s||(o=!0,i=a,n.onNext(r))},function(e){n.onError(e)},function(){n.onCompleted()})},this)};var cr=function(e){function t(t,r,n,i){this.source=t,this.t=!r||Y(r)?mt(r||$,n||$,i||$):r,e.call(this)}function r(e,t){this.o=e,this.t=t,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.t))},r.prototype.onNext=function(e){if(!this.isStopped){var t=m(this.t.onNext).call(this.t,e);t===Be&&this.o.onError(t.e),this.o.onNext(e)}},r.prototype.onError=function(e){if(!this.isStopped){this.isStopped=!0;var t=m(this.t.onError).call(this.t,e);if(t===Be)return this.o.onError(t.e);this.o.onError(e)}},r.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var e=m(this.t.onCompleted).call(this.t);if(e===Be)return this.o.onError(e.e);this.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.do=vt.tap=vt.doAction=function(e,t,r){return new cr(this,e,t,r)},vt.doOnNext=vt.tapOnNext=function(e,t){return this.tap(void 0!==t?function(r){e.call(t,r)}:e)},vt.doOnError=vt.tapOnError=function(e,t){return this.tap($,void 0!==t?function(r){e.call(t,r)}:e)},vt.doOnCompleted=vt.tapOnCompleted=function(e,t){return this.tap($,null,void 0!==t?function(){e.call(t)}:e)},vt.finally=vt.ensure=function(e){var t=this;return new dr(function(r){var n;try{n=t.subscribe(r)}catch(t){throw e(),t}return He(function(){try{n.dispose()}catch(e){throw e}finally{e()}})},this)},vt.finallyAction=function(e){return this.ensure(e)};var ur=function(e){function t(t){this.source=t,e.call(this)}function r(e){this.o=e,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e))},r.prototype.onNext=$,r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.observer.onError(e),!0)},t}(wt);vt.ignoreElements=function(){return new ur(this)},vt.materialize=function(){var e=this;return new dr(function(t){return e.subscribe(function(e){t.onNext(lt(e))},function(e){t.onNext(pt(e)),t.onCompleted()},function(){t.onNext(ft()),t.onCompleted()})},e)},vt.repeat=function(e){return Tt(this,e).concat()},vt.retry=function(e){return Tt(this,e).catchError()},vt.retryWhen=function(e){return Tt(this).catchErrorWhen(e)};var hr=function(e){function t(t,r,n,i){this.source=t,this.accumulator=r,this.hasSeed=n,this.seed=i,e.call(this)}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new A(e,this))},t}(wt);A.prototype.onNext=function(e){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,e):(this.accumulation=this.hasSeed?this.accumulator(this.seed,e):e,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},A.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.observer.onError(e))},A.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},A.prototype.dispose=function(){this.isStopped=!0},A.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.observer.onError(e),!0)},vt.scan=function(){var e,t,r=!1;return 2===arguments.length?(r=!0,e=arguments[0],t=arguments[1]):t=arguments[0],new hr(this,t,r,e)},vt.skipLast=function(e){if(0>e)throw new te;var t=this;return new dr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&r.onNext(n.shift())},function(e){r.onError(e)},function(){r.onCompleted()})},t)},vt.startWith=function(){var e,t=0;arguments.length&&tt(arguments[0])?(e=arguments[0],t=1):e=it;for(var r=[],n=t,i=arguments.length;i>n;n++)r.push(arguments[n]);return Pt([Ut(r,e),this]).concat()},vt.takeLast=function(e){if(0>e)throw new te;var t=this;return new dr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&n.shift()},function(e){r.onError(e)},function(){for(;n.length>0;)r.onNext(n.shift());r.onCompleted()})},t)},vt.takeLastBuffer=function(e){var t=this;return new dr(function(r){var n=[];return t.subscribe(function(t){n.push(t),n.length>e&&n.shift()},function(e){r.onError(e)},function(){r.onNext(n),r.onCompleted()})},t)},vt.windowWithCount=function(e,t){var r=this;if(+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new te;if(null==t&&(t=e),+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new te;return new dr(function(n){function i(){var e=new gr;c.push(e),n.onNext(Fe(e,a))}var o=new Ye,a=new Ze(o),s=0,c=[];return i(),o.setDisposable(r.subscribe(function(r){for(var n=0,o=c.length;o>n;n++)c[n].onNext(r);var a=s-e+1;a>=0&&a%t==0&&c.shift().onCompleted(),++s%t==0&&i()},function(e){for(;c.length>0;)c.shift().onError(e);n.onError(e)},function(){for(;c.length>0;)c.shift().onCompleted();n.onCompleted()})),a},r)},vt.selectConcat=vt.concatMap=function(e,t,r){return Y(e)&&Y(t)?this.concatMap(function(r,n){var i=e(r,n);return X(i)&&(i=At(i)),(ue(i)||ce(i))&&(i=Ft(i)),i.map(function(e,i){return t(r,e,n,i)})}):Y(e)?R(this,e,r):R(this,function(){return e})},vt.concatMapObserver=vt.selectConcatObserver=function(e,t,r,n){var i=this,o=he(e,n,2),a=he(t,n,1),s=he(r,n,0);return new dr(function(e){var t=0;return i.subscribe(function(r){var n;try{n=o(r,t++)}catch(t){return void e.onError(t)}X(n)&&(n=At(n)),e.onNext(n)},function(t){var r;try{r=a(t)}catch(t){return void e.onError(t)}X(r)&&(r=At(r)),e.onNext(r),e.onCompleted()},function(){var t;try{t=s()}catch(t){return void e.onError(t)}X(t)&&(t=At(t)),e.onNext(t),e.onCompleted()})},this).concatAll()},vt.defaultIfEmpty=function(e){var t=this;return e===i&&(e=null),new dr(function(r){var n=!1;return t.subscribe(function(e){n=!0,r.onNext(e)},function(e){r.onError(e)},function(){!n&&r.onNext(e),r.onCompleted()})},t)},L.prototype.push=function(e){var t=-1===function(e,t,r){for(var n=0,i=e.length;i>n;n++)if(r(e[n],t))return n;return-1}(this.set,e,this.comparer);return t&&this.set.push(e),t},vt.distinct=function(e,t){var r=this;return t||(t=H),new dr(function(n){var i=new L(t);return r.subscribe(function(t){var r=t;if(e)try{r=e(t)}catch(e){return void n.onError(e)}i.push(r)&&n.onNext(t)},function(e){n.onError(e)},function(){n.onCompleted()})},this)};var lr=function(e){function t(t,r,n){this.source=t,this.selector=he(r,n,3),e.call(this)}function r(e,t,r){this.o=e,this.selector=t,this.source=r,this.i=0,this.isStopped=!1}return De(t,e),t.prototype.internalMap=function(e,r){return new t(this.source,function(e,t){return function(r,n,i){return e.call(this,t.selector(r,n,i),n,i)}}(e,this),r)},t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.selector,this))},r.prototype.onNext=function(e){if(!this.isStopped){var t=m(this.selector)(e,this.i++,this.source);return t===Be?this.o.onError(t.e):void this.o.onNext(t)}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.map=vt.select=function(e,t){var r="function"==typeof e?e:function(){return e};return this instanceof lr?this.internalMap(r,t):new lr(this,r,t)},vt.pluck=function(){var e=arguments,t=arguments.length;if(0===t)throw new Error("List of properties cannot be empty.");return this.map(function(r){for(var n=r,o=0;t>o;o++){var a=n[e[o]];if(void 0===a)return i;n=a}return n})},vt.flatMapObserver=vt.selectManyObserver=function(e,t,r,n){var i=this;return new dr(function(o){var a=0;return i.subscribe(function(t){var r;try{r=e.call(n,t,a++)}catch(e){return void o.onError(e)}X(r)&&(r=At(r)),o.onNext(r)},function(e){var r;try{r=t.call(n,e)}catch(e){return void o.onError(e)}X(r)&&(r=At(r)),o.onNext(r),o.onCompleted()},function(){var e;try{e=r.call(n)}catch(e){return void o.onError(e)}X(e)&&(e=At(e)),o.onNext(e),o.onCompleted()})},i).mergeAll()},vt.selectMany=vt.flatMap=function(e,t,r){return Y(e)&&Y(t)?this.flatMap(function(r,n){var i=e(r,n);return X(i)&&(i=At(i)),(ue(i)||ce(i))&&(i=Ft(i)),i.map(function(e,i){return t(r,e,n,i)})},r):Y(e)?N(this,e,r):N(this,function(){return e})},vt.selectSwitch=vt.flatMapLatest=vt.switchMap=function(e,t){return this.select(e,t).switchLatest()};var pr=function(e){function t(t,r){this.source=t,this.skipCount=r,e.call(this)}function r(e,t){this.c=t,this.r=t,this.o=e,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.skipCount))},r.prototype.onNext=function(e){this.isStopped||(this.r<=0?this.o.onNext(e):this.r--)},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.skip=function(e){if(0>e)throw new te;return new pr(this,e)},vt.skipWhile=function(e,t){var r=this,n=he(e,t,3);return new dr(function(e){var t=0,i=!1;return r.subscribe(function(o){if(!i)try{i=!n(o,t++,r)}catch(t){return void e.onError(t)}i&&e.onNext(o)},function(t){e.onError(t)},function(){e.onCompleted()})},r)},vt.take=function(e,t){if(0>e)throw new te;if(0===e)return Nt(t);var r=this;return new dr(function(t){var n=e;return r.subscribe(function(e){n-- >0&&(t.onNext(e),0>=n&&t.onCompleted())},function(e){t.onError(e)},function(){t.onCompleted()})},r)},vt.takeWhile=function(e,t){var r=this,n=he(e,t,3);return new dr(function(e){var t=0,i=!0;return r.subscribe(function(o){if(i){try{i=n(o,t++,r)}catch(t){return void e.onError(t)}i?e.onNext(o):e.onCompleted()}},function(t){e.onError(t)},function(){e.onCompleted()})},r)};var fr=function(e){function t(t,r,n){this.source=t,this.predicate=he(r,n,3),e.call(this)}function r(e,t,r){this.o=e,this.predicate=t,this.source=r,this.i=0,this.isStopped=!1}return De(t,e),t.prototype.subscribeCore=function(e){return this.source.subscribe(new r(e,this.predicate,this))},t.prototype.internalFilter=function(e,r){return new t(this.source,function(e,t){return function(r,n,i){return t.predicate(r,n,i)&&e.call(this,r,n,i)}}(e,this),r)},r.prototype.onNext=function(e){if(!this.isStopped){var t=m(this.predicate)(e,this.i++,this.source);return t===Be?this.o.onError(t.e):void(t&&this.o.onNext(e))}},r.prototype.onError=function(e){this.isStopped||(this.isStopped=!0,this.o.onError(e))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(e){return!this.isStopped&&(this.isStopped=!0,this.o.onError(e),!0)},t}(wt);vt.filter=vt.where=function(e,t){return this instanceof fr?this.internalFilter(e,t):new fr(this,e,t)},vt.transduce=function(e){var t=this;return new dr(function(r){var n=e(function(e){return{"@@transducer/init":function(){return e},"@@transducer/step":function(e,t){return e.onNext(t)},"@@transducer/result":function(e){return e.onCompleted()}}}(r));return t.subscribe(function(e){try{n["@@transducer/step"](r,e)}catch(e){r.onError(e)}},function(e){r.onError(e)},function(){n["@@transducer/result"](r)})},t)};var dr=z.AnonymousObservable=function(e){function t(e,t){var r=t[0],n=m(t[1])(r);return n!==Be||r.fail(Be.e)?void r.setDisposable(function(e){return e&&Y(e.dispose)?e:Y(e)?He(e):qe}(n)):v(Be.e)}function r(r,n){this.source=n,e.call(this,function(e){var n=new mr(e),i=[n,r];return ot.scheduleRequired()?ot.scheduleWithState(i,t):t(0,i),n})}return De(r,e),r}(xt),mr=function(e){function t(t){e.call(this),this.observer=t,this.m=new Ye}De(t,e);var r=t.prototype;return r.next=function(e){var t=m(this.observer.onNext).call(this.observer,e);t===Be&&(this.dispose(),v(t.e))},r.error=function(e){var t=m(this.observer.onError).call(this.observer,e);this.dispose(),t===Be&&v(t.e)},r.completed=function(){var e=m(this.observer.onCompleted).call(this.observer);this.dispose(),e===Be&&v(e.e)},r.setDisposable=function(e){this.m.setDisposable(e)},r.getDisposable=function(){return this.m.getDisposable()},r.dispose=function(){e.prototype.dispose.call(this),this.m.dispose()},t}(gt),vr=function(e,t){this.subject=e,this.observer=t};vr.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var e=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(e,1),this.observer=null}};var gr=z.Subject=function(e){function t(e){return Xe(this),this.isStopped?this.hasError?(e.onError(this.error),qe):(e.onCompleted(),qe):(this.observers.push(e),new vr(this,e))}function r(){e.call(this,t),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return De(r,e),ke(r.prototype,dt.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(Xe(this),!this.isStopped){this.isStopped=!0;for(var e=0,t=o(this.observers),r=t.length;r>e;e++)t[e].onCompleted();this.observers.length=0}},onError:function(e){if(Xe(this),!this.isStopped){this.isStopped=!0,this.error=e,this.hasError=!0;for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onError(e);this.observers.length=0}},onNext:function(e){if(Xe(this),!this.isStopped)for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onNext(e)},dispose:function(){this.isDisposed=!0,this.observers=null}}),r.create=function(e,t){return new yr(e,t)},r}(xt),yr=(z.AsyncSubject=function(e){function t(e){return Xe(this),this.isStopped?(this.hasError?e.onError(this.error):this.hasValue?(e.onNext(this.value),e.onCompleted()):e.onCompleted(),qe):(this.observers.push(e),new vr(this,e))}function r(){e.call(this,t),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return De(r,e),ke(r.prototype,dt,{hasObservers:function(){return Xe(this),this.observers.length>0},onCompleted:function(){var e;if(Xe(this),!this.isStopped){this.isStopped=!0;var t=o(this.observers),r=t.length;if(this.hasValue)for(e=0;r>e;e++){var n=t[e];n.onNext(this.value),n.onCompleted()}else for(e=0;r>e;e++)t[e].onCompleted();this.observers.length=0}},onError:function(e){if(Xe(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=e;for(var t=0,r=o(this.observers),n=r.length;n>t;t++)r[t].onError(e);this.observers.length=0}},onNext:function(e){Xe(this),this.isStopped||(this.value=e,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),r}(xt),z.AnonymousSubject=function(e){function t(e){return this.observable.subscribe(e)}function r(r,n){this.observer=r,this.observable=n,e.call(this,t)}return De(r,e),ke(r.prototype,dt.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(e){this.observer.onError(e)},onNext:function(e){this.observer.onNext(e)}}),r}(xt));k&&F?B?(F.exports=z).Rx=z:k.Rx=z:D.Rx=z;var br=c()}).call(this)}).call(this,e(150),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],16:[function(e,t,r){(function(r){var n,i=void 0!==r?r:"undefined"!=typeof window?window:{},o=e("min-document");"undefined"!=typeof document?n=document:(n=i["__GLOBAL_DOCUMENT_CACHE@4"])||(n=i["__GLOBAL_DOCUMENT_CACHE@4"]=o),t.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"min-document":4}],17:[function(e,t,r){r.read=function(e,t,r,n,i){var o,a,s=8*i-n-1,c=(1<<s)-1,u=c>>1,h=-7,l=r?i-1:0,p=r?-1:1,f=e[t+l];for(l+=p,o=f&(1<<-h)-1,f>>=-h,h+=s;h>0;o=256*o+e[t+l],l+=p,h-=8);for(a=o&(1<<-h)-1,o>>=-h,h+=n;h>0;a=256*a+e[t+l],l+=p,h-=8);if(0===o)o=1-u;else{if(o===c)return a?NaN:1/0*(f?-1:1);a+=Math.pow(2,n),o-=u}return(f?-1:1)*a*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var a,s,c,u=8*o-i-1,h=(1<<u)-1,l=h>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:o-1,d=n?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=h):(a=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-a))<1&&(a--,c*=2),(t+=a+l>=1?p/c:p*Math.pow(2,1-l))*c>=2&&(a++,c/=2),a+l>=h?(s=0,a=h):a+l>=1?(s=(t*c-1)*Math.pow(2,i),a+=l):(s=t*Math.pow(2,l-1)*Math.pow(2,i),a=0));i>=8;e[r+f]=255&s,f+=d,s/=256,i-=8);for(a=a<<i|s,u+=i;u>0;e[r+f]=255&a,f+=d,a/=256,u-=8);e[r+f-d]|=128*m}},{}],18:[function(e,t,r){(function(e){"use strict";var r="undefined"!=typeof window?window:void 0!==e?e:{};t.exports=function(e,t){return e in r?r[e]:(r[e]=t,t)}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],19:[function(e,t,r){"use strict";var n=e("./index.js");t.exports=function(e,t,r){var i="__INDIVIDUAL_ONE_VERSION_"+e,o=n(i+"_ENFORCE_SINGLETON",t);if(o!==t)throw new Error("Can only have one copy of "+e+".\nYou already have version "+o+" installed.\nThis means you cannot install version "+t);return n(i,r)}},{"./index.js":18}],20:[function(e,t,r){"use strict";t.exports=function(e){return"object"==typeof e&&null!==e}},{}],21:[function(e,t,r){"use strict";var n={};n.base32="0123456789bcdefghjkmnpqrstuvwxyz",n.encode=function(e,t,r){if(void 0===r){for(var i=1;i<=12;i++){var o=n.encode(e,t,i),a=n.decode(o);if(a.lat==e&&a.lon==t)return o}r=12}if(e=Number(e),t=Number(t),r=Number(r),isNaN(e)||isNaN(t)||isNaN(r))throw new Error("Invalid geohash");for(var s=0,c=0,u=!0,h="",l=-90,p=90,f=-180,d=180;h.length<r;){if(u){var m=(f+d)/2;t>=m?(s=2*s+1,f=m):(s*=2,d=m)}else{var v=(l+p)/2;e>=v?(s=2*s+1,l=v):(s*=2,p=v)}u=!u,5==++c&&(h+=n.base32.charAt(s),c=0,s=0)}return h},n.decode=function(e){var t=n.bounds(e),r=t.sw.lat,i=t.sw.lon,o=t.ne.lat,a=t.ne.lon,s=(r+o)/2,c=(i+a)/2;return s=s.toFixed(Math.floor(2-Math.log(o-r)/Math.LN10)),c=c.toFixed(Math.floor(2-Math.log(a-i)/Math.LN10)),{lat:Number(s),lon:Number(c)}},n.bounds=function(e){if(0===e.length)throw new Error("Invalid geohash");e=e.toLowerCase();for(var t=!0,r=-90,i=90,o=-180,a=180,s=0;s<e.length;s++){var c=e.charAt(s),u=n.base32.indexOf(c);if(-1==u)throw new Error("Invalid geohash");for(var h=4;h>=0;h--){var l=u>>h&1;if(t){var p=(o+a)/2;1==l?o=p:a=p}else{var f=(r+i)/2;1==l?r=f:i=f}t=!t}}return{sw:{lat:r,lon:o},ne:{lat:i,lon:a}}},n.adjacent=function(e,t){if(e=e.toLowerCase(),t=t.toLowerCase(),0===e.length)throw new Error("Invalid geohash");if(-1=="nsew".indexOf(t))throw new Error("Invalid direction");var r=e.slice(-1),i=e.slice(0,-1),o=e.length%2;return-1!={n:["prxz","bcfguvyz"],s:["028b","0145hjnp"],e:["bcfguvyz","prxz"],w:["0145hjnp","028b"]}[t][o].indexOf(r)&&""!==i&&(i=n.adjacent(i,t)),i+n.base32.charAt({n:["p0r21436x8zb9dcf5h7kjnmqesgutwvy","bc01fg45238967deuvhjyznpkmstqrwx"],s:["14365h7k9dcfesgujnmqp0r2twvyx8zb","238967debc01fg45kmstqrwxuvhjyznp"],e:["bc01fg45238967deuvhjyznpkmstqrwx","p0r21436x8zb9dcf5h7kjnmqesgutwvy"],w:["238967debc01fg45kmstqrwxuvhjyznp","14365h7k9dcfesgujnmqp0r2twvyx8zb"]}[t][o].indexOf(r))},n.neighbours=function(e){return{n:n.adjacent(e,"n"),ne:n.adjacent(n.adjacent(e,"n"),"e"),e:n.adjacent(e,"e"),se:n.adjacent(n.adjacent(e,"s"),"e"),s:n.adjacent(e,"s"),sw:n.adjacent(n.adjacent(e,"s"),"w"),w:n.adjacent(e,"w"),nw:n.adjacent(n.adjacent(e,"n"),"w")}},void 0!==t&&t.exports&&(t.exports=n)},{}],22:[function(e,t,r){(function(e){function t(e,t){for(var r=0,n=e.length-1;n>=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n<e.length;n++)t(e[n],n,e)&&r.push(e[n]);return r}var i=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return i.exec(e).slice(1)};r.resolve=function(){for(var r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var a=o>=0?arguments[o]:e.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(r=a+"/"+r,i="/"===a.charAt(0))}return r=t(n(r.split("/"),function(e){return!!e}),!i).join("/"),(i?"/":"")+r||"."},r.normalize=function(e){var i=r.isAbsolute(e),o="/"===a(e,-1);return(e=t(n(e.split("/"),function(e){return!!e}),!i).join("/"))||i||(e="."),e&&o&&(e+="/"),(i?"/":"")+e},r.isAbsolute=function(e){return"/"===e.charAt(0)},r.join=function(){var e=Array.prototype.slice.call(arguments,0);return r.normalize(n(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},r.relative=function(e,t){function n(e){for(var t=0;t<e.length&&""===e[t];t++);for(var r=e.length-1;r>=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=r.resolve(e).substr(1),t=r.resolve(t).substr(1);for(var i=n(e.split("/")),o=n(t.split("/")),a=Math.min(i.length,o.length),s=a,c=0;c<a;c++)if(i[c]!==o[c]){s=c;break}for(var u=[],c=s;c<i.length;c++)u.push("..");return(u=u.concat(o.slice(s))).join("/")},r.sep="/",r.delimiter=":",r.dirname=function(e){var t=o(e),r=t[0],n=t[1];return r||n?(n&&(n=n.substr(0,n.length-1)),r+n):"."},r.basename=function(e,t){var r=o(e)[2];return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},r.extname=function(e){return o(e)[3]};var a="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)}}).call(this,e("_process"))},{_process:6}],23:[function(e,t,r){"use strict";function n(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}function i(e){return e.type===n.Bytes?e.readVarint()+e.pos:e.pos+1}function o(e,t,r){return r?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function a(e,t,r){var n=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.ceil(Math.log(t)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=e;i--)r.buf[i+n]=r.buf[i]}function s(e,t){for(var r=0;r<e.length;r++)t.writeVarint(e[r])}function c(e,t){for(var r=0;r<e.length;r++)t.writeSVarint(e[r])}function u(e,t){for(var r=0;r<e.length;r++)t.writeFloat(e[r])}function h(e,t){for(var r=0;r<e.length;r++)t.writeDouble(e[r])}function l(e,t){for(var r=0;r<e.length;r++)t.writeBoolean(e[r])}function p(e,t){for(var r=0;r<e.length;r++)t.writeFixed32(e[r])}function f(e,t){for(var r=0;r<e.length;r++)t.writeSFixed32(e[r])}function d(e,t){for(var r=0;r<e.length;r++)t.writeFixed64(e[r])}function m(e,t){for(var r=0;r<e.length;r++)t.writeSFixed64(e[r])}function v(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+16777216*e[t+3]}function g(e,t,r){e[r]=t,e[r+1]=t>>>8,e[r+2]=t>>>16,e[r+3]=t>>>24}function y(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}t.exports=n;var b=e("ieee754");n.Varint=0,n.Fixed64=1,n.Bytes=2,n.Fixed32=5;n.prototype={destroy:function(){this.buf=null},readFields:function(e,t,r){for(r=r||this.length;this.pos<r;){var n=this.readVarint(),i=n>>3,o=this.pos;this.type=7&n,e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=v(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=y(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=v(this.buf,this.pos)+4294967296*v(this.buf,this.pos+4);return this.pos+=8,e},readSFixed64:function(){var e=v(this.buf,this.pos)+4294967296*y(this.buf,this.pos+4);return this.pos+=8,e},readFloat:function(){var e=b.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=b.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,r,n=this.buf;return r=n[this.pos++],t=127&r,r<128?t:(r=n[this.pos++],t|=(127&r)<<7,r<128?t:(r=n[this.pos++],t|=(127&r)<<14,r<128?t:(r=n[this.pos++],t|=(127&r)<<21,r<128?t:(r=n[this.pos],t|=(15&r)<<28,function(e,t,r){var n,i,a=r.buf;if(i=a[r.pos++],n=(112&i)>>4,i<128)return o(e,n,t);if(i=a[r.pos++],n|=(127&i)<<3,i<128)return o(e,n,t);if(i=a[r.pos++],n|=(127&i)<<10,i<128)return o(e,n,t);if(i=a[r.pos++],n|=(127&i)<<17,i<128)return o(e,n,t);if(i=a[r.pos++],n|=(127&i)<<24,i<128)return o(e,n,t);if(i=a[r.pos++],n|=(1&i)<<31,i<128)return o(e,n,t);throw new Error("Expected varint not more than 10 bytes")}(t,e,this)))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=function(e,t,r){for(var n="",i=t;i<r;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(i+s>r)break;var c,u,h;1===s?o<128&&(a=o):2===s?128==(192&(c=e[i+1]))&&(a=(31&o)<<6|63&c)<=127&&(a=null):3===s?(c=e[i+1],u=e[i+2],128==(192&c)&&128==(192&u)&&((a=(15&o)<<12|(63&c)<<6|63&u)<=2047||a>=55296&&a<=57343)&&(a=null)):4===s&&(c=e[i+1],u=e[i+2],h=e[i+3],128==(192&c)&&128==(192&u)&&128==(192&h)&&((a=(15&o)<<18|(63&c)<<12|(63&u)<<6|63&h)<=65535||a>=1114112)&&(a=null)),null===a?(a=65533,s=1):a>65535&&(a-=65536,n+=String.fromCharCode(a>>>10&1023|55296),a=56320|1023&a),n+=String.fromCharCode(a),i+=s}return n}(this.buf,this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){var r=i(this);for(e=e||[];this.pos<r;)e.push(this.readVarint(t));return e},readPackedSVarint:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(e){var t=i(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(e){var t=7&e;if(t===n.Varint)for(;this.buf[this.pos++]>127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t<this.pos+e;)t*=2;if(t!==this.length){var r=new Uint8Array(t);r.set(this.buf),this.buf=r,this.length=t}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(e){this.realloc(4),g(this.buf,e,this.pos),this.pos+=4},writeSFixed32:function(e){this.realloc(4),g(this.buf,e,this.pos),this.pos+=4},writeFixed64:function(e){this.realloc(8),g(this.buf,-1&e,this.pos),g(this.buf,Math.floor(e*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(e){this.realloc(8),g(this.buf,-1&e,this.pos),g(this.buf,Math.floor(e*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(e){(e=+e||0)>268435455||e<0?function(e,t){var r,n;if(e>=0?(r=e%4294967296|0,n=e/4294967296|0):(n=~(-e/4294967296),4294967295^(r=~(-e%4294967296))?r=r+1|0:(r=0,n=n+1|0)),e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),function(e,t,r){r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos]=127&e}(r,0,t),function(e,t){var r=(7&e)<<4;t.buf[t.pos++]|=r|((e>>>=3)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),e&&(t.buf[t.pos++]=127&e)))))}(n,t)}(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length),this.pos++;var t=this.pos;this.pos=function(e,t,r){for(var n,i,o=0;o<t.length;o++){if((n=t.charCodeAt(o))>55295&&n<57344){if(!i){n>56319||o+1===t.length?(e[r++]=239,e[r++]=191,e[r++]=189):i=n;continue}if(n<56320){e[r++]=239,e[r++]=191,e[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(e[r++]=239,e[r++]=191,e[r++]=189,i=null);n<128?e[r++]=n:(n<2048?e[r++]=n>>6|192:(n<65536?e[r++]=n>>12|224:(e[r++]=n>>18|240,e[r++]=n>>12&63|128),e[r++]=n>>6&63|128),e[r++]=63&n|128)}return r}(this.buf,e,this.pos);var r=this.pos-t;r>=128&&a(t,r,this),this.pos=t-1,this.writeVarint(r),this.pos+=r},writeFloat:function(e){this.realloc(4),b.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),b.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;r<t;r++)this.buf[this.pos++]=e[r]},writeRawMessage:function(e,t){this.pos++;var r=this.pos;e(t,this);var n=this.pos-r;n>=128&&a(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.writeRawMessage(t,r)},writePackedVarint:function(e,t){this.writeMessage(e,s,t)},writePackedSVarint:function(e,t){this.writeMessage(e,c,t)},writePackedBoolean:function(e,t){this.writeMessage(e,l,t)},writePackedFloat:function(e,t){this.writeMessage(e,u,t)},writePackedDouble:function(e,t){this.writeMessage(e,h,t)},writePackedFixed32:function(e,t){this.writeMessage(e,p,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,f,t)},writePackedFixed64:function(e,t){this.writeMessage(e,d,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,m,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}},{ieee754:17}],24:[function(e,t,r){"use strict";function n(e,t,r,o,a){for(r=r||0,o=o||e.length-1,a=a||function(e,t){return e<t?-1:e>t?1:0};o>r;){if(o-r>600){var s=o-r+1,c=t-r+1,u=Math.log(s),h=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*h*(s-h)/s)*(c-s/2<0?-1:1);n(e,t,Math.max(r,Math.floor(t-c*h/s+l)),Math.min(o,Math.floor(t+(s-c)*h/s+l)),a)}var p=e[t],f=r,d=o;for(i(e,r,t),a(e[o],p)>0&&i(e,r,o);f<d;){for(i(e,f,d),f++,d--;a(e[f],p)<0;)f++;for(;a(e[d],p)>0;)d--}0===a(e[r],p)?i(e,r,d):i(e,++d,o),d<=t&&(r=d+1),t<=d&&(o=d-1)}}function i(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}t.exports=n},{}],25:[function(e,t,r){"use strict";function n(e,t){if(!(this instanceof n))return new n(e,t);this._maxEntries=Math.max(4,e||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),t&&this._initFormat(t),this.clear()}function i(e,t){o(e,0,e.children.length,t,e)}function o(e,t,r,n,i){i||(i=f(null)),i.minX=1/0,i.minY=1/0,i.maxX=-1/0,i.maxY=-1/0;for(var o,s=t;s<r;s++)o=e.children[s],a(i,e.leaf?n(o):o);return i}function a(e,t){return e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e}function s(e,t){return e.minX-t.minX}function c(e,t){return e.minY-t.minY}function u(e){return(e.maxX-e.minX)*(e.maxY-e.minY)}function h(e){return e.maxX-e.minX+(e.maxY-e.minY)}function l(e,t){return e.minX<=t.minX&&e.minY<=t.minY&&t.maxX<=e.maxX&&t.maxY<=e.maxY}function p(e,t){return t.minX<=e.maxX&&t.minY<=e.maxY&&t.maxX>=e.minX&&t.maxY>=e.minY}function f(e){return{children:e,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(e,t,r,n,i){for(var o,a=[t,r];a.length;)(r=a.pop())-(t=a.pop())<=n||(o=t+Math.ceil((r-t)/n/2)*n,m(e,o,t,r,i),a.push(t,o,o,r))}t.exports=n;var m=e("quickselect");n.prototype={all:function(){return this._all(this.data,[])},search:function(e){var t=this.data,r=[],n=this.toBBox;if(!p(e,t))return r;for(var i,o,a,s,c=[];t;){for(i=0,o=t.children.length;i<o;i++)a=t.children[i],p(e,s=t.leaf?n(a):a)&&(t.leaf?r.push(a):l(e,s)?this._all(a,r):c.push(a));t=c.pop()}return r},collides:function(e){var t=this.data,r=this.toBBox;if(!p(e,t))return!1;for(var n,i,o,a,s=[];t;){for(n=0,i=t.children.length;n<i;n++)if(o=t.children[n],a=t.leaf?r(o):o,p(e,a)){if(t.leaf||l(e,a))return!0;s.push(o)}t=s.pop()}return!1},load:function(e){if(!e||!e.length)return this;if(e.length<this._minEntries){for(var t=0,r=e.length;t<r;t++)this.insert(e[t]);return this}var n=this._build(e.slice(),0,e.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var i=this.data;this.data=n,n=i}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},insert:function(e){return e&&this._insert(e,this.data.height-1),this},clear:function(){return this.data=f([]),this},remove:function(e,t){if(!e)return this;for(var r,n,i,o,a=this.data,s=this.toBBox(e),c=[],u=[];a||c.length;){if(a||(a=c.pop(),n=c[c.length-1],r=u.pop(),o=!0),a.leaf&&-1!==(i=function(e,t,r){if(!r)return t.indexOf(e);for(var n=0;n<t.length;n++)if(r(e,t[n]))return n;return-1}(e,a.children,t)))return a.children.splice(i,1),c.push(a),this._condense(c),this;o||a.leaf||!l(a,s)?n?(r++,a=n.children[r],o=!1):a=null:(c.push(a),u.push(r),r=0,n=a,a=a.children[0])}return this},toBBox:function(e){return e},compareMinX:s,compareMinY:c,toJSON:function(){return this.data},fromJSON:function(e){return this.data=e,this},_all:function(e,t){for(var r=[];e;)e.leaf?t.push.apply(t,e.children):r.push.apply(r,e.children),e=r.pop();return t},_build:function(e,t,r,n){var o,a=r-t+1,s=this._maxEntries;if(a<=s)return o=f(e.slice(t,r+1)),i(o,this.toBBox),o;n||(n=Math.ceil(Math.log(a)/Math.log(s)),s=Math.ceil(a/Math.pow(s,n-1))),(o=f([])).leaf=!1,o.height=n;var c,u,h,l,p=Math.ceil(a/s),m=p*Math.ceil(Math.sqrt(s));for(d(e,t,r,m,this.compareMinX),c=t;c<=r;c+=m)for(d(e,c,h=Math.min(c+m-1,r),p,this.compareMinY),u=c;u<=h;u+=p)l=Math.min(u+p-1,h),o.children.push(this._build(e,u,l,n-1));return i(o,this.toBBox),o},_chooseSubtree:function(e,t,r,n){for(var i,o,a,s,c,h,l,p;;){if(n.push(t),t.leaf||n.length-1===r)break;for(l=p=1/0,i=0,o=t.children.length;i<o;i++)c=u(a=t.children[i]),(h=function(e,t){return(Math.max(t.maxX,e.maxX)-Math.min(t.minX,e.minX))*(Math.max(t.maxY,e.maxY)-Math.min(t.minY,e.minY))}(e,a)-c)<p?(p=h,l=c<l?c:l,s=a):h===p&&c<l&&(l=c,s=a);t=s||t.children[0]}return t},_insert:function(e,t,r){var n=this.toBBox,i=r?e:n(e),o=[],s=this._chooseSubtree(i,this.data,t,o);for(s.children.push(e),a(s,i);t>=0&&o[t].children.length>this._maxEntries;)this._split(o,t),t--;this._adjustParentBBoxes(i,o,t)},_split:function(e,t){var r=e[t],n=r.children.length,o=this._minEntries;this._chooseSplitAxis(r,o,n);var a=this._chooseSplitIndex(r,o,n),s=f(r.children.splice(a,r.children.length-a));s.height=r.height,s.leaf=r.leaf,i(r,this.toBBox),i(s,this.toBBox),t?e[t-1].children.push(s):this._splitRoot(r,s)},_splitRoot:function(e,t){this.data=f([e,t]),this.data.height=e.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},_chooseSplitIndex:function(e,t,r){var n,i,a,s,c,h,l,p;for(h=l=1/0,n=t;n<=r-t;n++)s=function(e,t){var r=Math.max(e.minX,t.minX),n=Math.max(e.minY,t.minY),i=Math.min(e.maxX,t.maxX),o=Math.min(e.maxY,t.maxY);return Math.max(0,i-r)*Math.max(0,o-n)}(i=o(e,0,n,this.toBBox),a=o(e,n,r,this.toBBox)),c=u(i)+u(a),s<h?(h=s,p=n,l=c<l?c:l):s===h&&c<l&&(l=c,p=n);return p},_chooseSplitAxis:function(e,t,r){var n=e.leaf?this.compareMinX:s,i=e.leaf?this.compareMinY:c;this._allDistMargin(e,t,r,n)<this._allDistMargin(e,t,r,i)&&e.children.sort(n)},_allDistMargin:function(e,t,r,n){e.children.sort(n);var i,s,c=this.toBBox,u=o(e,0,t,c),l=o(e,r-t,r,c),p=h(u)+h(l);for(i=t;i<r-t;i++)s=e.children[i],a(u,e.leaf?c(s):s),p+=h(u);for(i=r-t-1;i>=t;i--)s=e.children[i],a(l,e.leaf?c(s):s),p+=h(l);return p},_adjustParentBBoxes:function(e,t,r){for(var n=r;n>=0;n--)a(t[n],e)},_condense:function(e){for(var t,r=e.length-1;r>=0;r--)0===e[r].children.length?r>0?(t=e[r-1].children).splice(t.indexOf(e[r]),1):this.clear():i(e[r],this.toBBox)},_initFormat:function(e){var t=["return a"," - b",";"];this.compareMinX=new Function("a","b",t.join(e[0])),this.compareMinY=new Function("a","b",t.join(e[1])),this.toBBox=new Function("a","return {minX: a"+e[0]+", minY: a"+e[1]+", maxX: a"+e[2]+", maxY: a"+e[3]+"};")}}},{quickselect:24}],26:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Subject"),o=e("./util/ObjectUnsubscribedError"),a=function(e){function t(t){e.call(this),this._value=t}return n(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var r=e.prototype._subscribe.call(this,t);return r&&!r.closed&&t.next(this._value),r},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new o.ObjectUnsubscribedError;return this._value},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(i.Subject);r.BehaviorSubject=a},{"./Subject":34,"./util/ObjectUnsubscribedError":211}],27:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r,n){e.call(this),this.parent=t,this.outerValue=r,this.outerIndex=n,this.index=0}return n(t,e),t.prototype._next=function(e){this.parent.notifyNext(this.outerValue,e,this.outerIndex,this.index++,this)},t.prototype._error=function(e){this.parent.notifyError(e,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(e("./Subscriber").Subscriber);r.InnerSubscriber=i},{"./Subscriber":36}],28:[function(e,t,r){"use strict";var n=e("./Observable"),i=function(){function e(e,t,r){this.kind=e,this.value=t,this.error=r,this.hasValue="N"===e}return e.prototype.observe=function(e){switch(this.kind){case"N":return e.next&&e.next(this.value);case"E":return e.error&&e.error(this.error);case"C":return e.complete&&e.complete()}},e.prototype.do=function(e,t,r){switch(this.kind){case"N":return e&&e(this.value);case"E":return t&&t(this.error);case"C":return r&&r()}},e.prototype.accept=function(e,t,r){return e&&"function"==typeof e.next?this.observe(e):this.do(e,t,r)},e.prototype.toObservable=function(){switch(this.kind){case"N":return n.Observable.of(this.value);case"E":return n.Observable.throw(this.error);case"C":return n.Observable.empty()}throw new Error("unexpected notification kind value")},e.createNext=function(t){return void 0!==t?new e("N",t):e.undefinedValueNotification},e.createError=function(t){return new e("E",void 0,t)},e.createComplete=function(){return e.completeNotification},e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0),e}();r.Notification=i},{"./Observable":29}],29:[function(e,t,r){"use strict";var n=e("./util/root"),i=e("./util/toSubscriber"),o=e("./symbol/observable"),a=e("./util/pipe"),s=function(){function e(e){this._isScalar=!1,e&&(this._subscribe=e)}return e.prototype.lift=function(t){var r=new e;return r.source=this,r.operator=t,r},e.prototype.subscribe=function(e,t,r){var n=this.operator,o=i.toSubscriber(e,t,r);if(n?n.call(o,this.source):o.add(this.source?this._subscribe(o):this._trySubscribe(o)),o.syncErrorThrowable&&(o.syncErrorThrowable=!1,o.syncErrorThrown))throw o.syncErrorValue;return o},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.syncErrorThrown=!0,e.syncErrorValue=t,e.error(t)}},e.prototype.forEach=function(e,t){var r=this;if(t||(n.root.Rx&&n.root.Rx.config&&n.root.Rx.config.Promise?t=n.root.Rx.config.Promise:n.root.Promise&&(t=n.root.Promise)),!t)throw new Error("no Promise impl found");return new t(function(t,n){var i;i=r.subscribe(function(t){if(i)try{e(t)}catch(e){n(e),i.unsubscribe()}else e(t)},n,t)})},e.prototype._subscribe=function(e){return this.source.subscribe(e)},e.prototype[o.observable]=function(){return this},e.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return 0===e.length?this:a.pipeFromArray(e)(this)},e.prototype.toPromise=function(e){var t=this;if(e||(n.root.Rx&&n.root.Rx.config&&n.root.Rx.config.Promise?e=n.root.Rx.config.Promise:n.root.Promise&&(e=n.root.Promise)),!e)throw new Error("no Promise impl found");return new e(function(e,r){var n;t.subscribe(function(e){return n=e},function(e){return r(e)},function(){return e(n)})})},e.create=function(t){return new e(t)},e}();r.Observable=s},{"./symbol/observable":206,"./util/pipe":226,"./util/root":227,"./util/toSubscriber":229}],30:[function(e,t,r){"use strict";r.empty={closed:!0,next:function(e){},error:function(e){throw e},complete:function(){}}},{}],31:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments)}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.destination.next(t)},t.prototype.notifyError=function(e,t){this.destination.error(e)},t.prototype.notifyComplete=function(e){this.destination.complete()},t}(e("./Subscriber").Subscriber);r.OuterSubscriber=i},{"./Subscriber":36}],32:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Subject"),o=e("./scheduler/queue"),a=e("./Subscription"),s=e("./operators/observeOn"),c=e("./util/ObjectUnsubscribedError"),u=e("./SubjectSubscription"),h=function(e){function t(t,r,n){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=Number.POSITIVE_INFINITY),e.call(this),this.scheduler=n,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=r<1?1:r}return n(t,e),t.prototype.next=function(t){var r=this._getNow();this._events.push(new l(r,t)),this._trimBufferThenGetEvents(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){var t,r=this._trimBufferThenGetEvents(),n=this.scheduler;if(this.closed)throw new c.ObjectUnsubscribedError;this.hasError?t=a.Subscription.EMPTY:this.isStopped?t=a.Subscription.EMPTY:(this.observers.push(e),t=new u.SubjectSubscription(this,e)),n&&e.add(e=new s.ObserveOnSubscriber(e,n));for(var i=r.length,o=0;o<i&&!e.closed;o++)e.next(r[o].value);return this.hasError?e.error(this.thrownError):this.isStopped&&e.complete(),t},t.prototype._getNow=function(){return(this.scheduler||o.queue).now()},t.prototype._trimBufferThenGetEvents=function(){for(var e=this._getNow(),t=this._bufferSize,r=this._windowTime,n=this._events,i=n.length,o=0;o<i&&!(e-n[o].time<r);)o++;return i>t&&(o=Math.max(o,i-t)),o>0&&n.splice(0,o),n},t}(i.Subject);r.ReplaySubject=h;var l=function(){return function(e,t){this.time=e,this.value=t}}()},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operators/observeOn":174,"./scheduler/queue":204,"./util/ObjectUnsubscribedError":211}],33:[function(e,t,r){"use strict";var n=function(){function e(t,r){void 0===r&&(r=e.now),this.SchedulerAction=t,this.now=r}return e.prototype.schedule=function(e,t,r){return void 0===t&&(t=0),new this.SchedulerAction(this,e).schedule(r,t)},e.now=Date.now?Date.now:function(){return+new Date},e}();r.Scheduler=n},{}],34:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./Observable"),o=e("./Subscriber"),a=e("./Subscription"),s=e("./util/ObjectUnsubscribedError"),c=e("./SubjectSubscription"),u=e("./symbol/rxSubscriber"),h=function(e){function t(t){e.call(this,t),this.destination=t}return n(t,e),t}(o.Subscriber);r.SubjectSubscriber=h;var l=function(e){function t(){e.call(this),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}return n(t,e),t.prototype[u.rxSubscriber]=function(){return new h(this)},t.prototype.lift=function(e){var t=new p(this,this);return t.operator=e,t},t.prototype.next=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;if(!this.isStopped)for(var t=this.observers,r=t.length,n=t.slice(),i=0;i<r;i++)n[i].next(e)},t.prototype.error=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;this.hasError=!0,this.thrownError=e,this.isStopped=!0;for(var t=this.observers,r=t.length,n=t.slice(),i=0;i<r;i++)n[i].error(e);this.observers.length=0},t.prototype.complete=function(){if(this.closed)throw new s.ObjectUnsubscribedError;this.isStopped=!0;for(var e=this.observers,t=e.length,r=e.slice(),n=0;n<t;n++)r[n].complete();this.observers.length=0},t.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},t.prototype._trySubscribe=function(t){if(this.closed)throw new s.ObjectUnsubscribedError;return e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){if(this.closed)throw new s.ObjectUnsubscribedError;return this.hasError?(e.error(this.thrownError),a.Subscription.EMPTY):this.isStopped?(e.complete(),a.Subscription.EMPTY):(this.observers.push(e),new c.SubjectSubscription(this,e))},t.prototype.asObservable=function(){var e=new i.Observable;return e.source=this,e},t.create=function(e,t){return new p(e,t)},t}(i.Observable);r.Subject=l;var p=function(e){function t(t,r){e.call(this),this.destination=t,this.source=r}return n(t,e),t.prototype.next=function(e){var t=this.destination;t&&t.next&&t.next(e)},t.prototype.error=function(e){var t=this.destination;t&&t.error&&this.destination.error(e)},t.prototype.complete=function(){var e=this.destination;e&&e.complete&&this.destination.complete()},t.prototype._subscribe=function(e){return this.source?this.source.subscribe(e):a.Subscription.EMPTY},t}(l);r.AnonymousSubject=p},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":207,"./util/ObjectUnsubscribedError":211}],35:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.subject=t,this.subscriber=r,this.closed=!1}return n(t,e),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var e=this.subject,t=e.observers;if(this.subject=null,t&&0!==t.length&&!e.isStopped&&!e.closed){var r=t.indexOf(this.subscriber);-1!==r&&t.splice(r,1)}}},t}(e("./Subscription").Subscription);r.SubjectSubscription=i},{"./Subscription":37}],36:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("./util/isFunction"),o=e("./Subscription"),a=e("./Observer"),s=e("./symbol/rxSubscriber"),c=function(e){function t(r,n,i){switch(e.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a.empty;break;case 1:if(!r){this.destination=a.empty;break}if("object"==typeof r){r instanceof t?(this.destination=r,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,r));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,r,n,i)}}return n(t,e),t.prototype[s.rxSubscriber]=function(){return this},t.create=function(e,r,n){var i=new t(e,r,n);return i.syncErrorThrowable=!1,i},t.prototype.next=function(e){this.isStopped||this._next(e)},t.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this))},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){this.destination.error(e),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var e=this._parent,t=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=e,this._parents=t,this},t}(o.Subscription);r.Subscriber=c;var u=function(e){function t(t,r,n,o){e.call(this),this._parentSubscriber=t;var s,c=this;i.isFunction(r)?s=r:r&&(s=r.next,n=r.error,o=r.complete,r!==a.empty&&(c=Object.create(r),i.isFunction(c.unsubscribe)&&this.add(c.unsubscribe.bind(c)),c.unsubscribe=this.unsubscribe.bind(this))),this._context=c,this._next=s,this._error=n,this._complete=o}return n(t,e),t.prototype.next=function(e){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}},t.prototype.error=function(e){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),e;t.syncErrorValue=e,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var e=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var r=function(){return e._complete.call(e._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,r),this.unsubscribe()):(this.__tryOrUnsub(r),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(e,t){try{e.call(this._context,t)}catch(e){throw this.unsubscribe(),e}},t.prototype.__tryOrSetError=function(e,t,r){try{t.call(this._context,r)}catch(t){return e.syncErrorValue=t,e.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var e=this._parentSubscriber;this._context=null,this._parentSubscriber=null,e.unsubscribe()},t}(c)},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":207,"./util/isFunction":220}],37:[function(e,t,r){"use strict";function n(e){return e.reduce(function(e,t){return e.concat(t instanceof u.UnsubscriptionError?t.errors:t)},[])}var i=e("./util/isArray"),o=e("./util/isObject"),a=e("./util/isFunction"),s=e("./util/tryCatch"),c=e("./util/errorObject"),u=e("./util/UnsubscriptionError"),h=function(){function e(e){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,e&&(this._unsubscribe=e)}return e.prototype.unsubscribe=function(){var e,t=!1;if(!this.closed){var r=this._parent,h=this._parents,l=this._unsubscribe,p=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var f=-1,d=h?h.length:0;r;)r.remove(this),r=++f<d&&h[f]||null;if(a.isFunction(l)){(v=s.tryCatch(l).call(this))===c.errorObject&&(t=!0,e=e||(c.errorObject.e instanceof u.UnsubscriptionError?n(c.errorObject.e.errors):[c.errorObject.e]))}if(i.isArray(p))for(f=-1,d=p.length;++f<d;){var m=p[f];if(o.isObject(m)){var v=s.tryCatch(m.unsubscribe).call(m);if(v===c.errorObject){t=!0,e=e||[];var g=c.errorObject.e;g instanceof u.UnsubscriptionError?e=e.concat(n(g.errors)):e.push(g)}}}if(t)throw new u.UnsubscriptionError(e)}},e.prototype.add=function(t){if(!t||t===e.EMPTY)return e.EMPTY;if(t===this)return this;var r=t;switch(typeof t){case"function":r=new e(t);case"object":if(r.closed||"function"!=typeof r.unsubscribe)return r;if(this.closed)return r.unsubscribe(),r;if("function"!=typeof r._addParent){var n=r;(r=new e)._subscriptions=[n]}break;default:throw new Error("unrecognized teardown "+t+" added to Subscription.")}return(this._subscriptions||(this._subscriptions=[])).push(r),r._addParent(this),r},e.prototype.remove=function(e){var t=this._subscriptions;if(t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)}},e.prototype._addParent=function(e){var t=this._parent,r=this._parents;t&&t!==e?r?-1===r.indexOf(e)&&r.push(e):this._parents=[e]:this._parent=e},e.EMPTY=function(e){return e.closed=!0,e}(new e),e}();r.Subscription=h},{"./util/UnsubscriptionError":214,"./util/errorObject":215,"./util/isArray":217,"./util/isFunction":220,"./util/isObject":222,"./util/tryCatch":230}],38:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/combineLatest");n.Observable.combineLatest=i.combineLatest},{"../../Observable":29,"../../observable/combineLatest":101}],39:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/defer");n.Observable.defer=i.defer},{"../../Observable":29,"../../observable/defer":103}],40:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/empty");n.Observable.empty=i.empty},{"../../Observable":29,"../../observable/empty":104}],41:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/from");n.Observable.from=i.from},{"../../Observable":29,"../../observable/from":105}],42:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/fromEvent");n.Observable.fromEvent=i.fromEvent},{"../../Observable":29,"../../observable/fromEvent":106}],43:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/fromPromise");n.Observable.fromPromise=i.fromPromise},{"../../Observable":29,"../../observable/fromPromise":107}],44:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/merge");n.Observable.merge=i.merge},{"../../Observable":29,"../../observable/merge":108}],45:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/of");n.Observable.of=i.of},{"../../Observable":29,"../../observable/of":109}],46:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/throw");n.Observable.throw=i._throw},{"../../Observable":29,"../../observable/throw":110}],47:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/timer");n.Observable.timer=i.timer},{"../../Observable":29,"../../observable/timer":111}],48:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../observable/zip");n.Observable.zip=i.zip},{"../../Observable":29,"../../observable/zip":112}],49:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/buffer");n.Observable.prototype.buffer=i.buffer},{"../../Observable":29,"../../operator/buffer":113}],50:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/bufferCount");n.Observable.prototype.bufferCount=i.bufferCount},{"../../Observable":29,"../../operator/bufferCount":114}],51:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/bufferWhen");n.Observable.prototype.bufferWhen=i.bufferWhen},{"../../Observable":29,"../../operator/bufferWhen":115}],52:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/catch");n.Observable.prototype.catch=i._catch,n.Observable.prototype._catch=i._catch},{"../../Observable":29,"../../operator/catch":116}],53:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/combineLatest");n.Observable.prototype.combineLatest=i.combineLatest},{"../../Observable":29,"../../operator/combineLatest":117}],54:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/concat");n.Observable.prototype.concat=i.concat},{"../../Observable":29,"../../operator/concat":118}],55:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/debounceTime");n.Observable.prototype.debounceTime=i.debounceTime},{"../../Observable":29,"../../operator/debounceTime":119}],56:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/delay");n.Observable.prototype.delay=i.delay},{"../../Observable":29,"../../operator/delay":120}],57:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/distinct");n.Observable.prototype.distinct=i.distinct},{"../../Observable":29,"../../operator/distinct":121}],58:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/distinctUntilChanged");n.Observable.prototype.distinctUntilChanged=i.distinctUntilChanged},{"../../Observable":29,"../../operator/distinctUntilChanged":122}],59:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/do");n.Observable.prototype.do=i._do,n.Observable.prototype._do=i._do},{"../../Observable":29,"../../operator/do":123}],60:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/expand");n.Observable.prototype.expand=i.expand},{"../../Observable":29,"../../operator/expand":124}],61:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/filter");n.Observable.prototype.filter=i.filter},{"../../Observable":29,"../../operator/filter":125}],62:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/finally");n.Observable.prototype.finally=i._finally,n.Observable.prototype._finally=i._finally},{"../../Observable":29,"../../operator/finally":126}],63:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/first");n.Observable.prototype.first=i.first},{"../../Observable":29,"../../operator/first":127}],64:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/last");n.Observable.prototype.last=i.last},{"../../Observable":29,"../../operator/last":128}],65:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/map");n.Observable.prototype.map=i.map},{"../../Observable":29,"../../operator/map":129}],66:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/merge");n.Observable.prototype.merge=i.merge},{"../../Observable":29,"../../operator/merge":130}],67:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/mergeAll");n.Observable.prototype.mergeAll=i.mergeAll},{"../../Observable":29,"../../operator/mergeAll":131}],68:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/mergeMap");n.Observable.prototype.mergeMap=i.mergeMap,n.Observable.prototype.flatMap=i.mergeMap},{"../../Observable":29,"../../operator/mergeMap":132}],69:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/pairwise");n.Observable.prototype.pairwise=i.pairwise},{"../../Observable":29,"../../operator/pairwise":133}],70:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/pluck");n.Observable.prototype.pluck=i.pluck},{"../../Observable":29,"../../operator/pluck":134}],71:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/publish");n.Observable.prototype.publish=i.publish},{"../../Observable":29,"../../operator/publish":135}],72:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/publishReplay");n.Observable.prototype.publishReplay=i.publishReplay},{"../../Observable":29,"../../operator/publishReplay":136}],73:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/retry");n.Observable.prototype.retry=i.retry},{"../../Observable":29,"../../operator/retry":137}],74:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/sample");n.Observable.prototype.sample=i.sample},{"../../Observable":29,"../../operator/sample":138}],75:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/scan");n.Observable.prototype.scan=i.scan},{"../../Observable":29,"../../operator/scan":139}],76:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/share");n.Observable.prototype.share=i.share},{"../../Observable":29,"../../operator/share":140}],77:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skip");n.Observable.prototype.skip=i.skip},{"../../Observable":29,"../../operator/skip":141}],78:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skipUntil");n.Observable.prototype.skipUntil=i.skipUntil},{"../../Observable":29,"../../operator/skipUntil":142}],79:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/skipWhile");n.Observable.prototype.skipWhile=i.skipWhile},{"../../Observable":29,"../../operator/skipWhile":143}],80:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/startWith");n.Observable.prototype.startWith=i.startWith},{"../../Observable":29,"../../operator/startWith":144}],81:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/switchMap");n.Observable.prototype.switchMap=i.switchMap},{"../../Observable":29,"../../operator/switchMap":145}],82:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/take");n.Observable.prototype.take=i.take},{"../../Observable":29,"../../operator/take":146}],83:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/takeUntil");n.Observable.prototype.takeUntil=i.takeUntil},{"../../Observable":29,"../../operator/takeUntil":147}],84:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/takeWhile");n.Observable.prototype.takeWhile=i.takeWhile},{"../../Observable":29,"../../operator/takeWhile":148}],85:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/throttleTime");n.Observable.prototype.throttleTime=i.throttleTime},{"../../Observable":29,"../../operator/throttleTime":149}],86:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/timeout");n.Observable.prototype.timeout=i.timeout},{"../../Observable":29,"../../operator/timeout":150}],87:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/withLatestFrom");n.Observable.prototype.withLatestFrom=i.withLatestFrom},{"../../Observable":29,"../../operator/withLatestFrom":151}],88:[function(e,t,r){"use strict";var n=e("../../Observable"),i=e("../../operator/zip");n.Observable.prototype.zip=i.zipProto},{"../../Observable":29,"../../operator/zip":152}],89:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("./ScalarObservable"),a=e("./EmptyObservable"),s=function(e){function t(t,r){e.call(this),this.arrayLike=t,this.scheduler=r,r||1!==t.length||(this._isScalar=!0,this.value=t[0])}return n(t,e),t.create=function(e,r){var n=e.length;return 0===n?new a.EmptyObservable:1===n?new o.ScalarObservable(e[0],r):new t(e,r)},t.dispatch=function(e){var t=e.arrayLike,r=e.index,n=e.length,i=e.subscriber;i.closed||(r>=n?i.complete():(i.next(t[r]),e.index=r+1,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this.arrayLike,n=this.scheduler,i=r.length;if(n)return n.schedule(t.dispatch,0,{arrayLike:r,index:0,length:i,subscriber:e});for(var o=0;o<i&&!e.closed;o++)e.next(r[o]);e.complete()},t}(i.Observable);r.ArrayLikeObservable=s},{"../Observable":29,"./EmptyObservable":93,"./ScalarObservable":99}],90:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("./ScalarObservable"),a=e("./EmptyObservable"),s=e("../util/isScheduler"),c=function(e){function t(t,r){e.call(this),this.array=t,this.scheduler=r,r||1!==t.length||(this._isScalar=!0,this.value=t[0])}return n(t,e),t.create=function(e,r){return new t(e,r)},t.of=function(){for(var e=[],r=0;r<arguments.length;r++)e[r-0]=arguments[r];var n=e[e.length-1];s.isScheduler(n)?e.pop():n=null;var i=e.length;return i>1?new t(e,n):1===i?new o.ScalarObservable(e[0],n):new a.EmptyObservable(n)},t.dispatch=function(e){var t=e.array,r=e.index,n=e.count,i=e.subscriber;r>=n?i.complete():(i.next(t[r]),i.closed||(e.index=r+1,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this.array,n=r.length,i=this.scheduler;if(i)return i.schedule(t.dispatch,0,{array:r,index:0,count:n,subscriber:e});for(var o=0;o<n&&!e.closed;o++)e.next(r[o]);e.complete()},t}(i.Observable);r.ArrayObservable=c},{"../Observable":29,"../util/isScheduler":224,"./EmptyObservable":93,"./ScalarObservable":99}],91:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subject"),o=e("../Observable"),a=e("../Subscriber"),s=e("../Subscription"),c=e("../operators/refCount"),u=function(e){function t(t,r){e.call(this),this.source=t,this.subjectFactory=r,this._refCount=0,this._isComplete=!1}return n(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new s.Subscription).add(this.source.subscribe(new l(this.getSubject(),this))),e.closed?(this._connection=null,e=s.Subscription.EMPTY):this._connection=e),e},t.prototype.refCount=function(){return c.refCount()(this)},t}(o.Observable);r.ConnectableObservable=u;var h=u.prototype;r.connectableObservableDescriptor={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:h._subscribe},_isComplete:{value:h._isComplete,writable:!0},getSubject:{value:h.getSubject},connect:{value:h.connect},refCount:{value:h.refCount}};var l=function(e){function t(t,r){e.call(this,t),this.connectable=r}return n(t,e),t.prototype._error=function(t){this._unsubscribe(),e.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}},t}(i.SubjectSubscriber),p=(function(){function e(e){this.connectable=e}e.prototype.call=function(e,t){var r=this.connectable;r._refCount++;var n=new p(e,r),i=t.subscribe(n);return n.closed||(n.connection=r.connect()),i}}(),function(e){function t(t,r){e.call(this,t),this.connectable=r}return n(t,e),t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var r=this.connection,n=e._connection;this.connection=null,!n||r&&n!==r||n.unsubscribe()}}else this.connection=null},t}(a.Subscriber))},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37,"../operators/refCount":179}],92:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("../util/subscribeToResult"),a=e("../OuterSubscriber"),s=function(e){function t(t){e.call(this),this.observableFactory=t}return n(t,e),t.create=function(e){return new t(e)},t.prototype._subscribe=function(e){return new c(e,this.observableFactory)},t}(i.Observable);r.DeferObservable=s;var c=function(e){function t(t,r){e.call(this,t),this.factory=r,this.tryDefer()}return n(t,e),t.prototype.tryDefer=function(){try{this._callFactory()}catch(e){this._error(e)}},t.prototype._callFactory=function(){var e=this.factory();e&&this.add(o.subscribeToResult(this,e))},t}(a.OuterSubscriber)},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":228}],93:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t){e.call(this),this.scheduler=t}return n(t,e),t.create=function(e){return new t(e)},t.dispatch=function(e){e.subscriber.complete()},t.prototype._subscribe=function(e){var r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{subscriber:e});e.complete()},t}(e("../Observable").Observable);r.EmptyObservable=i},{"../Observable":29}],94:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.error=t,this.scheduler=r}return n(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.error;e.subscriber.error(t)},t.prototype._subscribe=function(e){var r=this.error,n=this.scheduler;if(e.syncErrorThrowable=!0,n)return n.schedule(t.dispatch,0,{error:r,subscriber:e});e.error(r)},t}(e("../Observable").Observable);r.ErrorObservable=i},{"../Observable":29}],95:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Observable"),o=e("../util/tryCatch"),a=e("../util/isFunction"),s=e("../util/errorObject"),c=e("../Subscription"),u=Object.prototype.toString,h=function(e){function t(t,r,n,i){e.call(this),this.sourceObj=t,this.eventName=r,this.selector=n,this.options=i}return n(t,e),t.create=function(e,r,n,i){return a.isFunction(n)&&(i=n,n=void 0),new t(e,r,i,n)},t.setupSubscription=function(e,r,n,i,o){var a;if(function(e){return!!e&&"[object NodeList]"===u.call(e)}(e)||function(e){return!!e&&"[object HTMLCollection]"===u.call(e)}(e))for(var s=0,h=e.length;s<h;s++)t.setupSubscription(e[s],r,n,i,o);else if(function(e){return!!e&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener}(e)){var l=e;e.addEventListener(r,n,o),a=function(){return l.removeEventListener(r,n)}}else if(function(e){return!!e&&"function"==typeof e.on&&"function"==typeof e.off}(e)){var p=e;e.on(r,n),a=function(){return p.off(r,n)}}else{if(!function(e){return!!e&&"function"==typeof e.addListener&&"function"==typeof e.removeListener}(e))throw new TypeError("Invalid event target");var f=e;e.addListener(r,n),a=function(){return f.removeListener(r,n)}}i.add(new c.Subscription(a))},t.prototype._subscribe=function(e){var r=this.sourceObj,n=this.eventName,i=this.options,a=this.selector;t.setupSubscription(r,n,a?function(){for(var t=[],r=0;r<arguments.length;r++)t[r-0]=arguments[r];var n=o.tryCatch(a).apply(void 0,t);n===s.errorObject?e.error(s.errorObject.e):e.next(n)}:function(t){return e.next(t)},e,i)},t}(i.Observable);r.FromEventObservable=h},{"../Observable":29,"../Subscription":37,"../util/errorObject":215,"../util/isFunction":220,"../util/tryCatch":230}],96:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/isArray"),o=e("../util/isArrayLike"),a=e("../util/isPromise"),s=e("./PromiseObservable"),c=e("./IteratorObservable"),u=e("./ArrayObservable"),h=e("./ArrayLikeObservable"),l=e("../symbol/iterator"),p=e("../Observable"),f=e("../operators/observeOn"),d=e("../symbol/observable"),m=function(e){function t(t,r){e.call(this,null),this.ish=t,this.scheduler=r}return n(t,e),t.create=function(e,r){if(null!=e){if("function"==typeof e[d.observable])return e instanceof p.Observable&&!r?e:new t(e,r);if(i.isArray(e))return new u.ArrayObservable(e,r);if(a.isPromise(e))return new s.PromiseObservable(e,r);if("function"==typeof e[l.iterator]||"string"==typeof e)return new c.IteratorObservable(e,r);if(o.isArrayLike(e))return new h.ArrayLikeObservable(e,r)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")},t.prototype._subscribe=function(e){var t=this.ish,r=this.scheduler;return null==r?t[d.observable]().subscribe(e):t[d.observable]().subscribe(new f.ObserveOnSubscriber(e,r,0))},t}(p.Observable);r.FromObservable=m},{"../Observable":29,"../operators/observeOn":174,"../symbol/iterator":205,"../symbol/observable":206,"../util/isArray":217,"../util/isArrayLike":218,"../util/isPromise":223,"./ArrayLikeObservable":89,"./ArrayObservable":90,"./IteratorObservable":97,"./PromiseObservable":98}],97:[function(e,t,r){"use strict";function n(e){var t=+e.length;return isNaN(t)?0:0!==t&&function(e){return"number"==typeof e&&o.root.isFinite(e)}(t)?(t=function(e){var t=+e;if(0===t)return t;if(isNaN(t))return t;return t<0?-1:1}(t)*Math.floor(Math.abs(t)))<=0?0:t>l?l:t:t}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../util/root"),a=e("../Observable"),s=e("../symbol/iterator"),c=function(e){function t(t,r){if(e.call(this),this.scheduler=r,null==t)throw new Error("iterator cannot be null.");this.iterator=function(e){var t=e[s.iterator];if(!t&&"string"==typeof e)return new u(e);if(!t&&void 0!==e.length)return new h(e);if(!t)throw new TypeError("object is not iterable");return e[s.iterator]()}(t)}return i(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.index,r=e.hasError,n=e.iterator,i=e.subscriber;if(r)i.error(e.error);else{var o=n.next();o.done?i.complete():(i.next(o.value),e.index=t+1,i.closed?"function"==typeof n.return&&n.return():this.schedule(e))}},t.prototype._subscribe=function(e){var r=this.iterator,n=this.scheduler;if(n)return n.schedule(t.dispatch,0,{index:0,iterator:r,subscriber:e});for(;;){var i=r.next();if(i.done){e.complete();break}if(e.next(i.value),e.closed){"function"==typeof r.return&&r.return();break}}},t}(a.Observable);r.IteratorObservable=c;var u=function(){function e(e,t,r){void 0===t&&(t=0),void 0===r&&(r=e.length),this.str=e,this.idx=t,this.len=r}return e.prototype[s.iterator]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.str.charAt(this.idx++)}:{done:!0,value:void 0}},e}(),h=function(){function e(e,t,r){void 0===t&&(t=0),void 0===r&&(r=n(e)),this.arr=e,this.idx=t,this.len=r}return e.prototype[s.iterator]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.arr[this.idx++]}:{done:!0,value:void 0}},e}(),l=Math.pow(2,53)-1},{"../Observable":29,"../symbol/iterator":205,"../util/root":227}],98:[function(e,t,r){"use strict";function n(e){var t=e.value,r=e.subscriber;r.closed||(r.next(t),r.complete())}function i(e){var t=e.err,r=e.subscriber;r.closed||r.error(t)}var o=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},a=e("../util/root"),s=function(e){function t(t,r){e.call(this),this.promise=t,this.scheduler=r}return o(t,e),t.create=function(e,r){return new t(e,r)},t.prototype._subscribe=function(e){var t=this,r=this.promise,o=this.scheduler;if(null==o)this._isScalar?e.closed||(e.next(this.value),e.complete()):r.then(function(r){t.value=r,t._isScalar=!0,e.closed||(e.next(r),e.complete())},function(t){e.closed||e.error(t)}).then(null,function(e){a.root.setTimeout(function(){throw e})});else if(this._isScalar){if(!e.closed)return o.schedule(n,0,{value:this.value,subscriber:e})}else r.then(function(r){t.value=r,t._isScalar=!0,e.closed||e.add(o.schedule(n,0,{value:r,subscriber:e}))},function(t){e.closed||e.add(o.schedule(i,0,{err:t,subscriber:e}))}).then(null,function(e){a.root.setTimeout(function(){throw e})})},t}(e("../Observable").Observable);r.PromiseObservable=s},{"../Observable":29,"../util/root":227}],99:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this),this.value=t,this.scheduler=r,this._isScalar=!0,r&&(this._isScalar=!1)}return n(t,e),t.create=function(e,r){return new t(e,r)},t.dispatch=function(e){var t=e.done,r=e.value,n=e.subscriber;t?n.complete():(n.next(r),n.closed||(e.done=!0,this.schedule(e)))},t.prototype._subscribe=function(e){var r=this.value,n=this.scheduler;if(n)return n.schedule(t.dispatch,0,{done:!1,value:r,subscriber:e});e.next(r),e.closed||e.complete()},t}(e("../Observable").Observable);r.ScalarObservable=i},{"../Observable":29}],100:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/isNumeric"),o=e("../Observable"),a=e("../scheduler/async"),s=e("../util/isScheduler"),c=e("../util/isDate"),u=function(e){function t(t,r,n){void 0===t&&(t=0),e.call(this),this.period=-1,this.dueTime=0,i.isNumeric(r)?this.period=Number(r)<1&&1||Number(r):s.isScheduler(r)&&(n=r),s.isScheduler(n)||(n=a.async),this.scheduler=n,this.dueTime=c.isDate(t)?+t-this.scheduler.now():t}return n(t,e),t.create=function(e,r,n){return void 0===e&&(e=0),new t(e,r,n)},t.dispatch=function(e){var t=e.index,r=e.period,n=e.subscriber;if(n.next(t),!n.closed){if(-1===r)return n.complete();e.index=t+1,this.schedule(e,r)}},t.prototype._subscribe=function(e){var r=this.period,n=this.dueTime;return this.scheduler.schedule(t.dispatch,n,{index:0,period:r,subscriber:e})},t}(o.Observable);r.TimerObservable=u},{"../Observable":29,"../scheduler/async":203,"../util/isDate":219,"../util/isNumeric":221,"../util/isScheduler":224}],101:[function(e,t,r){"use strict";var n=e("../util/isScheduler"),i=e("../util/isArray"),o=e("./ArrayObservable"),a=e("../operators/combineLatest");r.combineLatest=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=null,s=null;return n.isScheduler(e[e.length-1])&&(s=e.pop()),"function"==typeof e[e.length-1]&&(r=e.pop()),1===e.length&&i.isArray(e[0])&&(e=e[0]),new o.ArrayObservable(e,s).lift(new a.CombineLatestOperator(r))}},{"../operators/combineLatest":157,"../util/isArray":217,"../util/isScheduler":224,"./ArrayObservable":90}],102:[function(e,t,r){"use strict";var n=e("../util/isScheduler"),i=e("./of"),o=e("./from"),a=e("../operators/concatAll");r.concat=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return 1===e.length||2===e.length&&n.isScheduler(e[1])?o.from(e[0]):a.concatAll()(i.of.apply(void 0,e))}},{"../operators/concatAll":159,"../util/isScheduler":224,"./from":105,"./of":109}],103:[function(e,t,r){"use strict";var n=e("./DeferObservable");r.defer=n.DeferObservable.create},{"./DeferObservable":92}],104:[function(e,t,r){"use strict";var n=e("./EmptyObservable");r.empty=n.EmptyObservable.create},{"./EmptyObservable":93}],105:[function(e,t,r){"use strict";var n=e("./FromObservable");r.from=n.FromObservable.create},{"./FromObservable":96}],106:[function(e,t,r){"use strict";var n=e("./FromEventObservable");r.fromEvent=n.FromEventObservable.create},{"./FromEventObservable":95}],107:[function(e,t,r){"use strict";var n=e("./PromiseObservable");r.fromPromise=n.PromiseObservable.create},{"./PromiseObservable":98}],108:[function(e,t,r){"use strict";var n=e("../operator/merge");r.merge=n.mergeStatic},{"../operator/merge":130}],109:[function(e,t,r){"use strict";var n=e("./ArrayObservable");r.of=n.ArrayObservable.of},{"./ArrayObservable":90}],110:[function(e,t,r){"use strict";var n=e("./ErrorObservable");r._throw=n.ErrorObservable.create},{"./ErrorObservable":94}],111:[function(e,t,r){"use strict";var n=e("./TimerObservable");r.timer=n.TimerObservable.create},{"./TimerObservable":100}],112:[function(e,t,r){"use strict";var n=e("../operators/zip");r.zip=n.zipStatic},{"../operators/zip":197}],113:[function(e,t,r){"use strict";var n=e("../operators/buffer");r.buffer=function(e){return n.buffer(e)(this)}},{"../operators/buffer":153}],114:[function(e,t,r){"use strict";var n=e("../operators/bufferCount");r.bufferCount=function(e,t){return void 0===t&&(t=null),n.bufferCount(e,t)(this)}},{"../operators/bufferCount":154}],115:[function(e,t,r){"use strict";var n=e("../operators/bufferWhen");r.bufferWhen=function(e){return n.bufferWhen(e)(this)}},{"../operators/bufferWhen":155}],116:[function(e,t,r){"use strict";var n=e("../operators/catchError");r._catch=function(e){return n.catchError(e)(this)}},{"../operators/catchError":156}],117:[function(e,t,r){"use strict";var n=e("../operators/combineLatest");r.combineLatest=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.combineLatest.apply(void 0,e)(this)}},{"../operators/combineLatest":157}],118:[function(e,t,r){"use strict";var n=e("../operators/concat");r.concat=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.concat.apply(void 0,e)(this)}},{"../operators/concat":158}],119:[function(e,t,r){"use strict";var n=e("../scheduler/async"),i=e("../operators/debounceTime");r.debounceTime=function(e,t){return void 0===t&&(t=n.async),i.debounceTime(e,t)(this)}},{"../operators/debounceTime":160,"../scheduler/async":203}],120:[function(e,t,r){"use strict";var n=e("../scheduler/async"),i=e("../operators/delay");r.delay=function(e,t){return void 0===t&&(t=n.async),i.delay(e,t)(this)}},{"../operators/delay":161,"../scheduler/async":203}],121:[function(e,t,r){"use strict";var n=e("../operators/distinct");r.distinct=function(e,t){return n.distinct(e,t)(this)}},{"../operators/distinct":162}],122:[function(e,t,r){"use strict";var n=e("../operators/distinctUntilChanged");r.distinctUntilChanged=function(e,t){return n.distinctUntilChanged(e,t)(this)}},{"../operators/distinctUntilChanged":163}],123:[function(e,t,r){"use strict";var n=e("../operators/tap");r._do=function(e,t,r){return n.tap(e,t,r)(this)}},{"../operators/tap":192}],124:[function(e,t,r){"use strict";var n=e("../operators/expand");r.expand=function(e,t,r){return void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=void 0),t=(t||0)<1?Number.POSITIVE_INFINITY:t,n.expand(e,t,r)(this)}},{"../operators/expand":164}],125:[function(e,t,r){"use strict";var n=e("../operators/filter");r.filter=function(e,t){return n.filter(e,t)(this)}},{"../operators/filter":165}],126:[function(e,t,r){"use strict";var n=e("../operators/finalize");r._finally=function(e){return n.finalize(e)(this)}},{"../operators/finalize":166}],127:[function(e,t,r){"use strict";var n=e("../operators/first");r.first=function(e,t,r){return n.first(e,t,r)(this)}},{"../operators/first":167}],128:[function(e,t,r){"use strict";var n=e("../operators/last");r.last=function(e,t,r){return n.last(e,t,r)(this)}},{"../operators/last":168}],129:[function(e,t,r){"use strict";var n=e("../operators/map");r.map=function(e,t){return n.map(e,t)(this)}},{"../operators/map":169}],130:[function(e,t,r){"use strict";var n=e("../operators/merge"),i=e("../operators/merge");r.mergeStatic=i.mergeStatic,r.merge=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.merge.apply(void 0,e)(this)}},{"../operators/merge":170}],131:[function(e,t,r){"use strict";var n=e("../operators/mergeAll");r.mergeAll=function(e){return void 0===e&&(e=Number.POSITIVE_INFINITY),n.mergeAll(e)(this)}},{"../operators/mergeAll":171}],132:[function(e,t,r){"use strict";var n=e("../operators/mergeMap");r.mergeMap=function(e,t,r){return void 0===r&&(r=Number.POSITIVE_INFINITY),n.mergeMap(e,t,r)(this)}},{"../operators/mergeMap":172}],133:[function(e,t,r){"use strict";var n=e("../operators/pairwise");r.pairwise=function(){return n.pairwise()(this)}},{"../operators/pairwise":175}],134:[function(e,t,r){"use strict";var n=e("../operators/pluck");r.pluck=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.pluck.apply(void 0,e)(this)}},{"../operators/pluck":176}],135:[function(e,t,r){"use strict";var n=e("../operators/publish");r.publish=function(e){return n.publish(e)(this)}},{"../operators/publish":177}],136:[function(e,t,r){"use strict";var n=e("../operators/publishReplay");r.publishReplay=function(e,t,r,i){return n.publishReplay(e,t,r,i)(this)}},{"../operators/publishReplay":178}],137:[function(e,t,r){"use strict";var n=e("../operators/retry");r.retry=function(e){return void 0===e&&(e=-1),n.retry(e)(this)}},{"../operators/retry":180}],138:[function(e,t,r){"use strict";var n=e("../operators/sample");r.sample=function(e){return n.sample(e)(this)}},{"../operators/sample":181}],139:[function(e,t,r){"use strict";var n=e("../operators/scan");r.scan=function(e,t){return arguments.length>=2?n.scan(e,t)(this):n.scan(e)(this)}},{"../operators/scan":182}],140:[function(e,t,r){"use strict";var n=e("../operators/share");r.share=function(){return n.share()(this)}},{"../operators/share":183}],141:[function(e,t,r){"use strict";var n=e("../operators/skip");r.skip=function(e){return n.skip(e)(this)}},{"../operators/skip":184}],142:[function(e,t,r){"use strict";var n=e("../operators/skipUntil");r.skipUntil=function(e){return n.skipUntil(e)(this)}},{"../operators/skipUntil":185}],143:[function(e,t,r){"use strict";var n=e("../operators/skipWhile");r.skipWhile=function(e){return n.skipWhile(e)(this)}},{"../operators/skipWhile":186}],144:[function(e,t,r){"use strict";var n=e("../operators/startWith");r.startWith=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.startWith.apply(void 0,e)(this)}},{"../operators/startWith":187}],145:[function(e,t,r){"use strict";var n=e("../operators/switchMap");r.switchMap=function(e,t){return n.switchMap(e,t)(this)}},{"../operators/switchMap":188}],146:[function(e,t,r){"use strict";var n=e("../operators/take");r.take=function(e){return n.take(e)(this)}},{"../operators/take":189}],147:[function(e,t,r){"use strict";var n=e("../operators/takeUntil");r.takeUntil=function(e){return n.takeUntil(e)(this)}},{"../operators/takeUntil":190}],148:[function(e,t,r){"use strict";var n=e("../operators/takeWhile");r.takeWhile=function(e){return n.takeWhile(e)(this)}},{"../operators/takeWhile":191}],149:[function(e,t,r){"use strict";var n=e("../scheduler/async"),i=e("../operators/throttle"),o=e("../operators/throttleTime");r.throttleTime=function(e,t,r){return void 0===t&&(t=n.async),void 0===r&&(r=i.defaultThrottleConfig),o.throttleTime(e,t,r)(this)}},{"../operators/throttle":193,"../operators/throttleTime":194,"../scheduler/async":203}],150:[function(e,t,r){"use strict";var n=e("../scheduler/async"),i=e("../operators/timeout");r.timeout=function(e,t){return void 0===t&&(t=n.async),i.timeout(e,t)(this)}},{"../operators/timeout":195,"../scheduler/async":203}],151:[function(e,t,r){"use strict";var n=e("../operators/withLatestFrom");r.withLatestFrom=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.withLatestFrom.apply(void 0,e)(this)}},{"../operators/withLatestFrom":196}],152:[function(e,t,r){"use strict";var n=e("../operators/zip");r.zipProto=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n.zip.apply(void 0,e)(this)}},{"../operators/zip":197}],153:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.buffer=function(e){return function(t){return t.lift(new a(e))}};var a=function(){function e(e){this.closingNotifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.closingNotifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.buffer=[],this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype.notifyNext=function(e,t,r,n,i){var o=this.buffer;this.buffer=[],this.destination.next(o)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],154:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.bufferCount=function(e,t){return void 0===t&&(t=null),function(r){return r.lift(new o(e,t))}};var o=function(){function e(e,t){this.bufferSize=e,this.startBufferEvery=t,this.subscriberClass=t&&e!==t?s:a}return e.prototype.call=function(e,t){return t.subscribe(new this.subscriberClass(e,this.bufferSize,this.startBufferEvery))},e}(),a=function(e){function t(t,r){e.call(this,t),this.bufferSize=r,this.buffer=[]}return n(t,e),t.prototype._next=function(e){var t=this.buffer;t.push(e),t.length==this.bufferSize&&(this.destination.next(t),this.buffer=[])},t.prototype._complete=function(){var t=this.buffer;t.length>0&&this.destination.next(t),e.prototype._complete.call(this)},t}(i.Subscriber),s=function(e){function t(t,r,n){e.call(this,t),this.bufferSize=r,this.startBufferEvery=n,this.buffers=[],this.count=0}return n(t,e),t.prototype._next=function(e){var t=this.bufferSize,r=this.startBufferEvery,n=this.buffers,i=this.count;this.count++,i%r==0&&n.push([]);for(var o=n.length;o--;){var a=n[o];a.push(e),a.length===t&&(n.splice(o,1),this.destination.next(a))}},t.prototype._complete=function(){for(var t=this.buffers,r=this.destination;t.length>0;){var n=t.shift();n.length>0&&r.next(n)}e.prototype._complete.call(this)},t}(i.Subscriber)},{"../Subscriber":36}],155:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscription"),o=e("../util/tryCatch"),a=e("../util/errorObject"),s=e("../OuterSubscriber"),c=e("../util/subscribeToResult");r.bufferWhen=function(e){return function(t){return t.lift(new u(e))}};var u=function(){function e(e){this.closingSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new h(e,this.closingSelector))},e}(),h=function(e){function t(t,r){e.call(this,t),this.closingSelector=r,this.subscribing=!1,this.openBuffer()}return n(t,e),t.prototype._next=function(e){this.buffer.push(e)},t.prototype._complete=function(){var t=this.buffer;t&&this.destination.next(t),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.buffer=null,this.subscribing=!1},t.prototype.notifyNext=function(e,t,r,n,i){this.openBuffer()},t.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()},t.prototype.openBuffer=function(){var e=this.closingSubscription;e&&(this.remove(e),e.unsubscribe());var t=this.buffer;this.buffer&&this.destination.next(t),this.buffer=[];var r=o.tryCatch(this.closingSelector)();r===a.errorObject?this.error(a.errorObject.e):(e=new i.Subscription,this.closingSubscription=e,this.add(e),this.subscribing=!0,e.add(c.subscribeToResult(this,r)),this.subscribing=!1)},t}(s.OuterSubscriber)},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":215,"../util/subscribeToResult":228,"../util/tryCatch":230}],156:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.catchError=function(e){return function(t){var r=new a(e),n=t.lift(r);return r.caught=n}};var a=function(){function e(e){this.selector=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.selector,this.caught))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.selector=r,this.caught=n}return n(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=void 0;try{r=this.selector(t,this.caught)}catch(t){return void e.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(o.subscribeToResult(this,r))}},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],157:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../observable/ArrayObservable"),o=e("../util/isArray"),a=e("../OuterSubscriber"),s=e("../util/subscribeToResult"),c={};r.combineLatest=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=null;return"function"==typeof e[e.length-1]&&(r=e.pop()),1===e.length&&o.isArray(e[0])&&(e=e[0].slice()),function(t){return t.lift.call(new i.ArrayObservable([t].concat(e)),new u(r))}};var u=function(){function e(e){this.project=e}return e.prototype.call=function(e,t){return t.subscribe(new h(e,this.project))},e}();r.CombineLatestOperator=u;var h=function(e){function t(t,r){e.call(this,t),this.project=r,this.active=0,this.values=[],this.observables=[]}return n(t,e),t.prototype._next=function(e){this.values.push(c),this.observables.push(e)},t.prototype._complete=function(){var e=this.observables,t=e.length;if(0===t)this.destination.complete();else{this.active=t,this.toRespond=t;for(var r=0;r<t;r++){var n=e[r];this.add(s.subscribeToResult(this,n,n,r))}}},t.prototype.notifyComplete=function(e){0==(this.active-=1)&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){var o=this.values,a=o[r],s=this.toRespond?a===c?--this.toRespond:this.toRespond:0;o[r]=t,0===s&&(this.project?this._tryProject(o):this.destination.next(o.slice()))},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(a.OuterSubscriber);r.CombineLatestSubscriber=h},{"../OuterSubscriber":31,"../observable/ArrayObservable":90,"../util/isArray":217,"../util/subscribeToResult":228}],158:[function(e,t,r){"use strict";var n=e("../observable/concat");r.concat=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){return t.lift.call(n.concat.apply(void 0,[t].concat(e)))}}},{"../observable/concat":102}],159:[function(e,t,r){"use strict";var n=e("./mergeAll");r.concatAll=function(){return n.mergeAll(1)}},{"./mergeAll":171}],160:[function(e,t,r){"use strict";function n(e){e.debouncedNext()}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../Subscriber"),a=e("../scheduler/async");r.debounceTime=function(e,t){return void 0===t&&(t=a.async),function(r){return r.lift(new s(e,t))}};var s=function(){function e(e,t){this.dueTime=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.dueTime,this.scheduler))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.dueTime=r,this.scheduler=n,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}return i(t,e),t.prototype._next=function(e){this.clearDebounce(),this.lastValue=e,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(n,this.dueTime,this))},t.prototype._complete=function(){this.debouncedNext(),this.destination.complete()},t.prototype.debouncedNext=function(){this.clearDebounce(),this.hasValue&&(this.destination.next(this.lastValue),this.lastValue=null,this.hasValue=!1)},t.prototype.clearDebounce=function(){var e=this.debouncedSubscription;null!==e&&(this.remove(e),e.unsubscribe(),this.debouncedSubscription=null)},t}(o.Subscriber)},{"../Subscriber":36,"../scheduler/async":203}],161:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../scheduler/async"),o=e("../util/isDate"),a=e("../Subscriber"),s=e("../Notification");r.delay=function(e,t){void 0===t&&(t=i.async);var r=o.isDate(e)?+e-t.now():Math.abs(e);return function(e){return e.lift(new c(r,t))}};var c=function(){function e(e,t){this.delay=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.delay,this.scheduler))},e}(),u=function(e){function t(t,r,n){e.call(this,t),this.delay=r,this.scheduler=n,this.queue=[],this.active=!1,this.errored=!1}return n(t,e),t.dispatch=function(e){for(var t=e.source,r=t.queue,n=e.scheduler,i=e.destination;r.length>0&&r[0].time-n.now()<=0;)r.shift().notification.observe(i);if(r.length>0){var o=Math.max(0,r[0].time-n.now());this.schedule(e,o)}else t.active=!1},t.prototype._schedule=function(e){this.active=!0,this.add(e.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:e}))},t.prototype.scheduleNotification=function(e){if(!0!==this.errored){var t=this.scheduler,r=new h(t.now()+this.delay,e);this.queue.push(r),!1===this.active&&this._schedule(t)}},t.prototype._next=function(e){this.scheduleNotification(s.Notification.createNext(e))},t.prototype._error=function(e){this.errored=!0,this.queue=[],this.destination.error(e)},t.prototype._complete=function(){this.scheduleNotification(s.Notification.createComplete())},t}(a.Subscriber),h=function(){return function(e,t){this.time=e,this.notification=t}}()},{"../Notification":28,"../Subscriber":36,"../scheduler/async":203,"../util/isDate":219}],162:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult"),a=e("../util/Set");r.distinct=function(e,t){return function(r){return r.lift(new s(e,t))}};var s=function(){function e(e,t){this.keySelector=e,this.flushes=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.keySelector,this.flushes))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.keySelector=r,this.values=new a.Set,n&&this.add(o.subscribeToResult(this,n))}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.values.clear()},t.prototype.notifyError=function(e,t){this._error(e)},t.prototype._next=function(e){this.keySelector?this._useKeySelector(e):this._finalizeNext(e,e)},t.prototype._useKeySelector=function(e){var t,r=this.destination;try{t=this.keySelector(e)}catch(e){return void r.error(e)}this._finalizeNext(t,e)},t.prototype._finalizeNext=function(e,t){var r=this.values;r.has(e)||(r.add(e),this.destination.next(t))},t}(i.OuterSubscriber);r.DistinctSubscriber=c},{"../OuterSubscriber":31,"../util/Set":212,"../util/subscribeToResult":228}],163:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/tryCatch"),a=e("../util/errorObject");r.distinctUntilChanged=function(e,t){return function(r){return r.lift(new s(e,t))}};var s=function(){function e(e,t){this.compare=e,this.keySelector=t}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.compare,this.keySelector))},e}(),c=function(e){function t(t,r,n){e.call(this,t),this.keySelector=n,this.hasKey=!1,"function"==typeof r&&(this.compare=r)}return n(t,e),t.prototype.compare=function(e,t){return e===t},t.prototype._next=function(e){var t=e;if(this.keySelector&&(t=o.tryCatch(this.keySelector)(e))===a.errorObject)return this.destination.error(a.errorObject.e);var r=!1;if(this.hasKey){if((r=o.tryCatch(this.compare)(this.key,t))===a.errorObject)return this.destination.error(a.errorObject.e)}else this.hasKey=!0;!1===Boolean(r)&&(this.key=t,this.destination.next(e))},t}(i.Subscriber)},{"../Subscriber":36,"../util/errorObject":215,"../util/tryCatch":230}],164:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/tryCatch"),o=e("../util/errorObject"),a=e("../OuterSubscriber"),s=e("../util/subscribeToResult");r.expand=function(e,t,r){return void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===r&&(r=void 0),t=(t||0)<1?Number.POSITIVE_INFINITY:t,function(n){return n.lift(new c(e,t,r))}};var c=function(){function e(e,t,r){this.project=e,this.concurrent=t,this.scheduler=r}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.project,this.concurrent,this.scheduler))},e}();r.ExpandOperator=c;var u=function(e){function t(t,r,n,i){e.call(this,t),this.project=r,this.concurrent=n,this.scheduler=i,this.index=0,this.active=0,this.hasCompleted=!1,n<Number.POSITIVE_INFINITY&&(this.buffer=[])}return n(t,e),t.dispatch=function(e){var t=e.subscriber,r=e.result,n=e.value,i=e.index;t.subscribeToProjection(r,n,i)},t.prototype._next=function(e){var r=this.destination;if(r.closed)this._complete();else{var n=this.index++;if(this.active<this.concurrent){r.next(e);var a=i.tryCatch(this.project)(e,n);if(a===o.errorObject)r.error(o.errorObject.e);else if(this.scheduler){var s={subscriber:this,result:a,value:e,index:n};this.add(this.scheduler.schedule(t.dispatch,0,s))}else this.subscribeToProjection(a,e,n)}else this.buffer.push(e)}},t.prototype.subscribeToProjection=function(e,t,r){this.active++,this.add(s.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){this.hasCompleted=!0,this.hasCompleted&&0===this.active&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this._next(t)},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t&&t.length>0&&this._next(t.shift()),this.hasCompleted&&0===this.active&&this.destination.complete()},t}(a.OuterSubscriber);r.ExpandSubscriber=u},{"../OuterSubscriber":31,"../util/errorObject":215,"../util/subscribeToResult":228,"../util/tryCatch":230}],165:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.filter=function(e,t){return function(r){return r.lift(new o(e,t))}};var o=function(){function e(e,t){this.predicate=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate,this.thisArg))},e}(),a=function(e){function t(t,r,n){e.call(this,t),this.predicate=r,this.thisArg=n,this.count=0}return n(t,e),t.prototype._next=function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}t&&this.destination.next(e)},t}(i.Subscriber)},{"../Subscriber":36}],166:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../Subscription");r.finalize=function(e){return function(t){return t.lift(new a(e))}};var a=function(){function e(e){this.callback=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.callback))},e}(),s=function(e){function t(t,r){e.call(this,t),this.add(new o.Subscription(r))}return n(t,e),t}(i.Subscriber)},{"../Subscriber":36,"../Subscription":37}],167:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/EmptyError");r.first=function(e,t,r){return function(n){return n.lift(new a(e,t,r,n))}};var a=function(){function e(e,t,r,n){this.predicate=e,this.resultSelector=t,this.defaultValue=r,this.source=n}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.predicate,this.resultSelector,this.defaultValue,this.source))},e}(),s=function(e){function t(t,r,n,i,o){e.call(this,t),this.predicate=r,this.resultSelector=n,this.defaultValue=i,this.source=o,this.index=0,this.hasCompleted=!1,this._emitted=!1}return n(t,e),t.prototype._next=function(e){var t=this.index++;this.predicate?this._tryPredicate(e,t):this._emit(e,t)},t.prototype._tryPredicate=function(e,t){var r;try{r=this.predicate(e,t,this.source)}catch(e){return void this.destination.error(e)}r&&this._emit(e,t)},t.prototype._emit=function(e,t){this.resultSelector?this._tryResultSelector(e,t):this._emitFinal(e)},t.prototype._tryResultSelector=function(e,t){var r;try{r=this.resultSelector(e,t)}catch(e){return void this.destination.error(e)}this._emitFinal(r)},t.prototype._emitFinal=function(e){var t=this.destination;this._emitted||(this._emitted=!0,t.next(e),t.complete(),this.hasCompleted=!0)},t.prototype._complete=function(){var e=this.destination;this.hasCompleted||void 0===this.defaultValue?this.hasCompleted||e.error(new o.EmptyError):(e.next(this.defaultValue),e.complete())},t}(i.Subscriber)},{"../Subscriber":36,"../util/EmptyError":210}],168:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/EmptyError");r.last=function(e,t,r){return function(n){return n.lift(new a(e,t,r,n))}};var a=function(){function e(e,t,r,n){this.predicate=e,this.resultSelector=t,this.defaultValue=r,this.source=n}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.predicate,this.resultSelector,this.defaultValue,this.source))},e}(),s=function(e){function t(t,r,n,i,o){e.call(this,t),this.predicate=r,this.resultSelector=n,this.defaultValue=i,this.source=o,this.hasValue=!1,this.index=0,void 0!==i&&(this.lastValue=i,this.hasValue=!0)}return n(t,e),t.prototype._next=function(e){var t=this.index++;if(this.predicate)this._tryPredicate(e,t);else{if(this.resultSelector)return void this._tryResultSelector(e,t);this.lastValue=e,this.hasValue=!0}},t.prototype._tryPredicate=function(e,t){var r;try{r=this.predicate(e,t,this.source)}catch(e){return void this.destination.error(e)}if(r){if(this.resultSelector)return void this._tryResultSelector(e,t);this.lastValue=e,this.hasValue=!0}},t.prototype._tryResultSelector=function(e,t){var r;try{r=this.resultSelector(e,t)}catch(e){return void this.destination.error(e)}this.lastValue=r,this.hasValue=!0},t.prototype._complete=function(){var e=this.destination;this.hasValue?(e.next(this.lastValue),e.complete()):e.error(new o.EmptyError)},t}(i.Subscriber)},{"../Subscriber":36,"../util/EmptyError":210}],169:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.map=function(e,t){return function(r){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return r.lift(new o(e,t))}};var o=function(){function e(e,t){this.project=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.project,this.thisArg))},e}();r.MapOperator=o;var a=function(e){function t(t,r,n){e.call(this,t),this.project=r,this.count=0,this.thisArg=n||this}return n(t,e),t.prototype._next=function(e){var t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.Subscriber)},{"../Subscriber":36}],170:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=Number.POSITIVE_INFINITY,n=null,c=e[e.length-1];return s.isScheduler(c)?(n=e.pop(),e.length>1&&"number"==typeof e[e.length-1]&&(r=e.pop())):"number"==typeof c&&(r=e.pop()),null===n&&1===e.length&&e[0]instanceof i.Observable?e[0]:a.mergeAll(r)(new o.ArrayObservable(e,n))}var i=e("../Observable"),o=e("../observable/ArrayObservable"),a=e("./mergeAll"),s=e("../util/isScheduler");r.merge=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){return t.lift.call(n.apply(void 0,[t].concat(e)))}},r.mergeStatic=n},{"../Observable":29,"../observable/ArrayObservable":90,"../util/isScheduler":224,"./mergeAll":171}],171:[function(e,t,r){"use strict";var n=e("./mergeMap"),i=e("../util/identity");r.mergeAll=function(e){return void 0===e&&(e=Number.POSITIVE_INFINITY),n.mergeMap(i.identity,null,e)}},{"../util/identity":216,"./mergeMap":172}],172:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/subscribeToResult"),o=e("../OuterSubscriber");r.mergeMap=function(e,t,r){return void 0===r&&(r=Number.POSITIVE_INFINITY),function(n){return"number"==typeof t&&(r=t,t=null),n.lift(new a(e,t,r))}};var a=function(){function e(e,t,r){void 0===r&&(r=Number.POSITIVE_INFINITY),this.project=e,this.resultSelector=t,this.concurrent=r}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.project,this.resultSelector,this.concurrent))},e}();r.MergeMapOperator=a;var s=function(e){function t(t,r,n,i){void 0===i&&(i=Number.POSITIVE_INFINITY),e.call(this,t),this.project=r,this.resultSelector=n,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return n(t,e),t.prototype._next=function(e){this.active<this.concurrent?this._tryNext(e):this.buffer.push(e)},t.prototype._tryNext=function(e){var t,r=this.index++;try{t=this.project(e,r)}catch(e){return void this.destination.error(e)}this.active++,this._innerSub(t,e,r)},t.prototype._innerSub=function(e,t,r){this.add(i.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this.resultSelector?this._notifyResultSelector(e,t,r,n):this.destination.next(t)},t.prototype._notifyResultSelector=function(e,t,r,n){var i;try{i=this.resultSelector(e,t,r,n)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t.length>0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(o.OuterSubscriber);r.MergeMapSubscriber=s},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],173:[function(e,t,r){"use strict";var n=e("../observable/ConnectableObservable");r.multicast=function(e,t){return function(r){var o;if(o="function"==typeof e?e:function(){return e},"function"==typeof t)return r.lift(new i(o,t));var a=Object.create(r,n.connectableObservableDescriptor);return a.source=r,a.subjectFactory=o,a}};var i=function(){function e(e,t){this.subjectFactory=e,this.selector=t}return e.prototype.call=function(e,t){var r=this.selector,n=this.subjectFactory(),i=r(n).subscribe(e);return i.add(t.subscribe(n)),i},e}();r.MulticastOperator=i},{"../observable/ConnectableObservable":91}],174:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../Notification");r.observeOn=function(e,t){return void 0===t&&(t=0),function(r){return r.lift(new a(e,t))}};var a=function(){function e(e,t){void 0===t&&(t=0),this.scheduler=e,this.delay=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.scheduler,this.delay))},e}();r.ObserveOnOperator=a;var s=function(e){function t(t,r,n){void 0===n&&(n=0),e.call(this,t),this.scheduler=r,this.delay=n}return n(t,e),t.dispatch=function(e){var t=e.notification,r=e.destination;t.observe(r),this.unsubscribe()},t.prototype.scheduleMessage=function(e){this.add(this.scheduler.schedule(t.dispatch,this.delay,new c(e,this.destination)))},t.prototype._next=function(e){this.scheduleMessage(o.Notification.createNext(e))},t.prototype._error=function(e){this.scheduleMessage(o.Notification.createError(e))},t.prototype._complete=function(){this.scheduleMessage(o.Notification.createComplete())},t}(i.Subscriber);r.ObserveOnSubscriber=s;var c=function(){return function(e,t){this.notification=e,this.destination=t}}();r.ObserveOnMessage=c},{"../Notification":28,"../Subscriber":36}],175:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.pairwise=function(){return function(e){return e.lift(new o)}};var o=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new a(e))},e}(),a=function(e){function t(t){e.call(this,t),this.hasPrev=!1}return n(t,e),t.prototype._next=function(e){this.hasPrev?this.destination.next([this.prev,e]):this.hasPrev=!0,this.prev=e},t}(i.Subscriber)},{"../Subscriber":36}],176:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=e.length;if(0===r)throw new Error("list of properties cannot be empty.");return function(t){return i.map(function(e,t){return function(r){for(var n=r,i=0;i<t;i++){var o=n[e[i]];if(void 0===o)return;n=o}return n}}(e,r))(t)}}var i=e("./map");r.pluck=n},{"./map":169}],177:[function(e,t,r){"use strict";var n=e("../Subject"),i=e("./multicast");r.publish=function(e){return e?i.multicast(function(){return new n.Subject},e):i.multicast(new n.Subject)}},{"../Subject":34,"./multicast":173}],178:[function(e,t,r){"use strict";var n=e("../ReplaySubject"),i=e("./multicast");r.publishReplay=function(e,t,r,o){r&&"function"!=typeof r&&(o=r);var a="function"==typeof r?r:void 0,s=new n.ReplaySubject(e,t,o);return function(e){return i.multicast(function(){return s},a)(e)}}},{"../ReplaySubject":32,"./multicast":173}],179:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.refCount=function(){return function(e){return e.lift(new o(e))}};var o=function(){function e(e){this.connectable=e}return e.prototype.call=function(e,t){var r=this.connectable;r._refCount++;var n=new a(e,r),i=t.subscribe(n);return n.closed||(n.connection=r.connect()),i},e}(),a=function(e){function t(t,r){e.call(this,t),this.connectable=r}return n(t,e),t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var r=this.connection,n=e._connection;this.connection=null,!n||r&&n!==r||n.unsubscribe()}}else this.connection=null},t}(i.Subscriber)},{"../Subscriber":36}],180:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.retry=function(e){return void 0===e&&(e=-1),function(t){return t.lift(new o(e,t))}};var o=function(){function e(e,t){this.count=e,this.source=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.count,this.source))},e}(),a=function(e){function t(t,r,n){e.call(this,t),this.count=r,this.source=n}return n(t,e),t.prototype.error=function(t){if(!this.isStopped){var r=this.source,n=this.count;if(0===n)return e.prototype.error.call(this,t);n>-1&&(this.count=n-1),r.subscribe(this._unsubscribeAndRecycle())}},t}(i.Subscriber)},{"../Subscriber":36}],181:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.sample=function(e){return function(t){return t.lift(new a(e))}};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){var r=new s(e),n=t.subscribe(r);return n.add(o.subscribeToResult(r,this.notifier)),n},e}(),s=function(e){function t(){e.apply(this,arguments),this.hasValue=!1}return n(t,e),t.prototype._next=function(e){this.value=e,this.hasValue=!0},t.prototype.notifyNext=function(e,t,r,n,i){this.emitValue()},t.prototype.notifyComplete=function(){this.emitValue()},t.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],182:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.scan=function(e,t){var r=!1;return arguments.length>=2&&(r=!0),function(n){return n.lift(new o(e,t,r))}};var o=function(){function e(e,t,r){void 0===r&&(r=!1),this.accumulator=e,this.seed=t,this.hasSeed=r}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.accumulator,this.seed,this.hasSeed))},e}(),a=function(e){function t(t,r,n,i){e.call(this,t),this.accumulator=r,this._seed=n,this.hasSeed=i,this.index=0}return n(t,e),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e},enumerable:!0,configurable:!0}),t.prototype._next=function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)},t.prototype._tryNext=function(e){var t,r=this.index++;try{t=this.accumulator(this.seed,e,r)}catch(e){this.destination.error(e)}this.seed=t,this.destination.next(t)},t}(i.Subscriber)},{"../Subscriber":36}],183:[function(e,t,r){"use strict";function n(){return new a.Subject}var i=e("./multicast"),o=e("./refCount"),a=e("../Subject");r.share=function(){return function(e){return o.refCount()(i.multicast(n)(e))}}},{"../Subject":34,"./multicast":173,"./refCount":179}],184:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.skip=function(e){return function(t){return t.lift(new o(e))}};var o=function(){function e(e){this.total=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.total))},e}(),a=function(e){function t(t,r){e.call(this,t),this.total=r,this.count=0}return n(t,e),t.prototype._next=function(e){++this.count>this.total&&this.destination.next(e)},t}(i.Subscriber)},{"../Subscriber":36}],185:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.skipUntil=function(e){return function(t){return t.lift(new a(e))}};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.notifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.hasValue=!1,this.isInnerStopped=!1,this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype._next=function(t){this.hasValue&&e.prototype._next.call(this,t)},t.prototype._complete=function(){this.isInnerStopped?e.prototype._complete.call(this):this.unsubscribe()},t.prototype.notifyNext=function(e,t,r,n,i){this.hasValue=!0},t.prototype.notifyComplete=function(){this.isInnerStopped=!0,this.isStopped&&e.prototype._complete.call(this)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],186:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.skipWhile=function(e){return function(t){return t.lift(new o(e))}};var o=function(){function e(e){this.predicate=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate))},e}(),a=function(e){function t(t,r){e.call(this,t),this.predicate=r,this.skipping=!0,this.index=0}return n(t,e),t.prototype._next=function(e){var t=this.destination;this.skipping&&this.tryCallPredicate(e),this.skipping||t.next(e)},t.prototype.tryCallPredicate=function(e){try{var t=this.predicate(e,this.index++);this.skipping=Boolean(t)}catch(e){this.destination.error(e)}},t}(i.Subscriber)},{"../Subscriber":36}],187:[function(e,t,r){"use strict";var n=e("../observable/ArrayObservable"),i=e("../observable/ScalarObservable"),o=e("../observable/EmptyObservable"),a=e("../observable/concat"),s=e("../util/isScheduler");r.startWith=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){var r=e[e.length-1];s.isScheduler(r)?e.pop():r=null;var c=e.length;return 1===c?a.concat(new i.ScalarObservable(e[0],r),t):c>1?a.concat(new n.ArrayObservable(e,r),t):a.concat(new o.EmptyObservable(r),t)}}},{"../observable/ArrayObservable":90,"../observable/EmptyObservable":93,"../observable/ScalarObservable":99,"../observable/concat":102,"../util/isScheduler":224}],188:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.switchMap=function(e,t){return function(r){return r.lift(new a(e,t))}};var a=function(){function e(e,t){this.project=e,this.resultSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.project,this.resultSelector))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.project=r,this.resultSelector=n,this.index=0}return n(t,e),t.prototype._next=function(e){var t,r=this.index++;try{t=this.project(e,r)}catch(e){return void this.destination.error(e)}this._innerSub(t,e,r)},t.prototype._innerSub=function(e,t,r){var n=this.innerSubscription;n&&n.unsubscribe(),this.add(this.innerSubscription=o.subscribeToResult(this,e,t,r))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&e.prototype._complete.call(this)},t.prototype.notifyNext=function(e,t,r,n,i){this.resultSelector?this._tryNotifyNext(e,t,r,n):this.destination.next(t)},t.prototype._tryNotifyNext=function(e,t,r,n){var i;try{i=this.resultSelector(e,t,r,n)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],189:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber"),o=e("../util/ArgumentOutOfRangeError"),a=e("../observable/EmptyObservable");r.take=function(e){return function(t){return 0===e?new a.EmptyObservable:t.lift(new s(e))}};var s=function(){function e(e){if(this.total=e,this.total<0)throw new o.ArgumentOutOfRangeError}return e.prototype.call=function(e,t){return t.subscribe(new c(e,this.total))},e}(),c=function(e){function t(t,r){e.call(this,t),this.total=r,this.count=0}return n(t,e),t.prototype._next=function(e){var t=this.total,r=++this.count;r<=t&&(this.destination.next(e),r===t&&(this.destination.complete(),this.unsubscribe()))},t}(i.Subscriber)},{"../Subscriber":36,"../observable/EmptyObservable":93,"../util/ArgumentOutOfRangeError":209}],190:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.takeUntil=function(e){return function(t){return t.lift(new a(e))}};var a=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.notifier))},e}(),s=function(e){function t(t,r){e.call(this,t),this.notifier=r,this.add(o.subscribeToResult(this,r))}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.complete()},t.prototype.notifyComplete=function(){},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],191:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.takeWhile=function(e){return function(t){return t.lift(new o(e))}};var o=function(){function e(e){this.predicate=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.predicate))},e}(),a=function(e){function t(t,r){e.call(this,t),this.predicate=r,this.index=0}return n(t,e),t.prototype._next=function(e){var t,r=this.destination;try{t=this.predicate(e,this.index++)}catch(e){return void r.error(e)}this.nextOrComplete(e,t)},t.prototype.nextOrComplete=function(e,t){var r=this.destination;Boolean(t)?r.next(e):r.complete()},t}(i.Subscriber)},{"../Subscriber":36}],192:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../Subscriber");r.tap=function(e,t,r){return function(n){return n.lift(new o(e,t,r))}};var o=function(){function e(e,t,r){this.nextOrObserver=e,this.error=t,this.complete=r}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.nextOrObserver,this.error,this.complete))},e}(),a=function(e){function t(t,r,n,o){e.call(this,t);var a=new i.Subscriber(r,n,o);a.syncErrorThrowable=!0,this.add(a),this.safeSubscriber=a}return n(t,e),t.prototype._next=function(e){var t=this.safeSubscriber;t.next(e),t.syncErrorThrown?this.destination.error(t.syncErrorValue):this.destination.next(e)},t.prototype._error=function(e){var t=this.safeSubscriber;t.error(e),t.syncErrorThrown?this.destination.error(t.syncErrorValue):this.destination.error(e)},t.prototype._complete=function(){var e=this.safeSubscriber;e.complete(),e.syncErrorThrown?this.destination.error(e.syncErrorValue):this.destination.complete()},t}(i.Subscriber)},{"../Subscriber":36}],193:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.defaultThrottleConfig={leading:!0,trailing:!1},r.throttle=function(e,t){return void 0===t&&(t=r.defaultThrottleConfig),function(r){return r.lift(new a(e,t.leading,t.trailing))}};var a=function(){function e(e,t,r){this.durationSelector=e,this.leading=t,this.trailing=r}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.durationSelector,this.leading,this.trailing))},e}(),s=function(e){function t(t,r,n,i){e.call(this,t),this.destination=t,this.durationSelector=r,this._leading=n,this._trailing=i,this._hasTrailingValue=!1}return n(t,e),t.prototype._next=function(e){if(this.throttled)this._trailing&&(this._hasTrailingValue=!0,this._trailingValue=e);else{var t=this.tryDurationSelector(e);t&&this.add(this.throttled=o.subscribeToResult(this,t)),this._leading&&(this.destination.next(e),this._trailing&&(this._hasTrailingValue=!0,this._trailingValue=e))}},t.prototype.tryDurationSelector=function(e){try{return this.durationSelector(e)}catch(e){return this.destination.error(e),null}},t.prototype._unsubscribe=function(){var e=this.throttled;this._trailingValue,this._hasTrailingValue,this._trailing;this._trailingValue=null,this._hasTrailingValue=!1,e&&(this.remove(e),this.throttled=null,e.unsubscribe())},t.prototype._sendTrailing=function(){var e=this,t=e.destination,r=e.throttled,n=e._trailing,i=e._trailingValue,o=e._hasTrailingValue;r&&n&&o&&(t.next(i),this._trailingValue=null,this._hasTrailingValue=!1)},t.prototype.notifyNext=function(e,t,r,n,i){this._sendTrailing(),this._unsubscribe()},t.prototype.notifyComplete=function(){this._sendTrailing(),this._unsubscribe()},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],194:[function(e,t,r){"use strict";function n(e){e.subscriber.clearThrottle()}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../Subscriber"),a=e("../scheduler/async"),s=e("./throttle");r.throttleTime=function(e,t,r){return void 0===t&&(t=a.async),void 0===r&&(r=s.defaultThrottleConfig),function(n){return n.lift(new c(e,t,r.leading,r.trailing))}};var c=function(){function e(e,t,r,n){this.duration=e,this.scheduler=t,this.leading=r,this.trailing=n}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.duration,this.scheduler,this.leading,this.trailing))},e}(),u=function(e){function t(t,r,n,i,o){e.call(this,t),this.duration=r,this.scheduler=n,this.leading=i,this.trailing=o,this._hasTrailingValue=!1,this._trailingValue=null}return i(t,e),t.prototype._next=function(e){this.throttled?this.trailing&&(this._trailingValue=e,this._hasTrailingValue=!0):(this.add(this.throttled=this.scheduler.schedule(n,this.duration,{subscriber:this})),this.leading&&this.destination.next(e))},t.prototype.clearThrottle=function(){var e=this.throttled;e&&(this.trailing&&this._hasTrailingValue&&(this.destination.next(this._trailingValue),this._trailingValue=null,this._hasTrailingValue=!1),e.unsubscribe(),this.remove(e),this.throttled=null)},t}(o.Subscriber)},{"../Subscriber":36,"../scheduler/async":203,"./throttle":193}],195:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../scheduler/async"),o=e("../util/isDate"),a=e("../Subscriber"),s=e("../util/TimeoutError");r.timeout=function(e,t){void 0===t&&(t=i.async);var r=o.isDate(e),n=r?+e-t.now():Math.abs(e);return function(e){return e.lift(new c(n,r,t,new s.TimeoutError))}};var c=function(){function e(e,t,r,n){this.waitFor=e,this.absoluteTimeout=t,this.scheduler=r,this.errorInstance=n}return e.prototype.call=function(e,t){return t.subscribe(new u(e,this.absoluteTimeout,this.waitFor,this.scheduler,this.errorInstance))},e}(),u=function(e){function t(t,r,n,i,o){e.call(this,t),this.absoluteTimeout=r,this.waitFor=n,this.scheduler=i,this.errorInstance=o,this.action=null,this.scheduleTimeout()}return n(t,e),t.dispatchTimeout=function(e){e.error(e.errorInstance)},t.prototype.scheduleTimeout=function(){var e=this.action;e?this.action=e.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(t.dispatchTimeout,this.waitFor,this))},t.prototype._next=function(t){this.absoluteTimeout||this.scheduleTimeout(),e.prototype._next.call(this,t)},t.prototype._unsubscribe=function(){this.action=null,this.scheduler=null,this.errorInstance=null},t}(a.Subscriber)},{"../Subscriber":36,"../scheduler/async":203,"../util/TimeoutError":213,"../util/isDate":219}],196:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../OuterSubscriber"),o=e("../util/subscribeToResult");r.withLatestFrom=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){var r;"function"==typeof e[e.length-1]&&(r=e.pop());var n=e;return t.lift(new a(n,r))}};var a=function(){function e(e,t){this.observables=e,this.project=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.observables,this.project))},e}(),s=function(e){function t(t,r,n){e.call(this,t),this.observables=r,this.project=n,this.toRespond=[];var i=r.length;this.values=new Array(i);for(a=0;a<i;a++)this.toRespond.push(a);for(var a=0;a<i;a++){var s=r[a];this.add(o.subscribeToResult(this,s,s,a))}}return n(t,e),t.prototype.notifyNext=function(e,t,r,n,i){this.values[r]=t;var o=this.toRespond;if(o.length>0){var a=o.indexOf(r);-1!==a&&o.splice(a,1)}},t.prototype.notifyComplete=function(){},t.prototype._next=function(e){if(0===this.toRespond.length){var t=[e].concat(this.values);this.project?this._tryProject(t):this.destination.next(t)}},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.OuterSubscriber)},{"../OuterSubscriber":31,"../util/subscribeToResult":228}],197:[function(e,t,r){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var r=e[e.length-1];return"function"==typeof r&&e.pop(),new o.ArrayObservable(e).lift(new l(r))}var i=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},o=e("../observable/ArrayObservable"),a=e("../util/isArray"),s=e("../Subscriber"),c=e("../OuterSubscriber"),u=e("../util/subscribeToResult"),h=e("../symbol/iterator");r.zip=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){return t.lift.call(n.apply(void 0,[t].concat(e)))}},r.zipStatic=n;var l=function(){function e(e){this.project=e}return e.prototype.call=function(e,t){return t.subscribe(new p(e,this.project))},e}();r.ZipOperator=l;var p=function(e){function t(t,r,n){void 0===n&&(n=Object.create(null)),e.call(this,t),this.iterators=[],this.active=0,this.project="function"==typeof r?r:null,this.values=n}return i(t,e),t.prototype._next=function(e){var t=this.iterators;a.isArray(e)?t.push(new d(e)):"function"==typeof e[h.iterator]?t.push(new f(e[h.iterator]())):t.push(new m(this.destination,this,e))},t.prototype._complete=function(){var e=this.iterators,t=e.length;if(0!==t){this.active=t;for(var r=0;r<t;r++){var n=e[r];n.stillUnsubscribed?this.add(n.subscribe(n,r)):this.active--}}else this.destination.complete()},t.prototype.notifyInactive=function(){this.active--,0===this.active&&this.destination.complete()},t.prototype.checkIterators=function(){for(var e=this.iterators,t=e.length,r=this.destination,n=0;n<t;n++){if("function"==typeof(a=e[n]).hasValue&&!a.hasValue())return}for(var i=!1,o=[],n=0;n<t;n++){var a=e[n],s=a.next();if(a.hasCompleted()&&(i=!0),s.done)return void r.complete();o.push(s.value)}this.project?this._tryProject(o):r.next(o),i&&r.complete()},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(s.Subscriber);r.ZipSubscriber=p;var f=function(){function e(e){this.iterator=e,this.nextResult=e.next()}return e.prototype.hasValue=function(){return!0},e.prototype.next=function(){var e=this.nextResult;return this.nextResult=this.iterator.next(),e},e.prototype.hasCompleted=function(){var e=this.nextResult;return e&&e.done},e}(),d=function(){function e(e){this.array=e,this.index=0,this.length=0,this.length=e.length}return e.prototype[h.iterator]=function(){return this},e.prototype.next=function(e){var t=this.index++,r=this.array;return t<this.length?{value:r[t],done:!1}:{value:null,done:!0}},e.prototype.hasValue=function(){return this.array.length>this.index},e.prototype.hasCompleted=function(){return this.array.length===this.index},e}(),m=function(e){function t(t,r,n){e.call(this,t),this.parent=r,this.observable=n,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return i(t,e),t.prototype[h.iterator]=function(){return this},t.prototype.next=function(){var e=this.buffer;return 0===e.length&&this.isComplete?{value:null,done:!0}:{value:e.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(e,t,r,n,i){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(e,t){return u.subscribeToResult(this,this.observable,this,t)},t}(c.OuterSubscriber)},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":90,"../symbol/iterator":205,"../util/isArray":217,"../util/subscribeToResult":228}],198:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this)}return n(t,e),t.prototype.schedule=function(e,t){return void 0===t&&(t=0),this},t}(e("../Subscription").Subscription);r.Action=i},{"../Subscription":37}],199:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=e("../util/root"),o=function(e){function t(t,r){e.call(this,t,r),this.scheduler=t,this.work=r,this.pending=!1}return n(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e,this.pending=!0;var r=this.id,n=this.scheduler;return null!=r&&(this.id=this.recycleAsyncId(n,r,t)),this.delay=t,this.id=this.id||this.requestAsyncId(n,this.id,t),this},t.prototype.requestAsyncId=function(e,t,r){return void 0===r&&(r=0),i.root.setInterval(e.flush.bind(e,this),r)},t.prototype.recycleAsyncId=function(e,t,r){return void 0===r&&(r=0),null!==r&&this.delay===r&&!1===this.pending?t:i.root.clearInterval(t)&&void 0||void 0},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var r=this._execute(e,t);if(r)return r;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var r=!1,n=void 0;try{this.work(e)}catch(e){r=!0,n=!!e&&e||new Error(e)}if(r)return this.unsubscribe(),n},t.prototype._unsubscribe=function(){var e=this.id,t=this.scheduler,r=t.actions,n=r.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==n&&r.splice(n,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null},t}(e("./Action").Action);r.AsyncAction=o},{"../util/root":227,"./Action":198}],200:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return n(t,e),t.prototype.flush=function(e){var t=this.actions;if(this.active)t.push(e);else{var r;this.active=!0;do{if(r=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,r){for(;e=t.shift();)e.unsubscribe();throw r}}},t}(e("../Scheduler").Scheduler);r.AsyncScheduler=i},{"../Scheduler":33}],201:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t,r){e.call(this,t,r),this.scheduler=t,this.work=r}return n(t,e),t.prototype.schedule=function(t,r){return void 0===r&&(r=0),r>0?e.prototype.schedule.call(this,t,r):(this.delay=r,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,r){return r>0||this.closed?e.prototype.execute.call(this,t,r):this._execute(t,r)},t.prototype.requestAsyncId=function(t,r,n){return void 0===n&&(n=0),null!==n&&n>0||null===n&&this.delay>0?e.prototype.requestAsyncId.call(this,t,r,n):t.flush(this)},t}(e("./AsyncAction").AsyncAction);r.QueueAction=i},{"./AsyncAction":199}],202:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){e.apply(this,arguments)}return n(t,e),t}(e("./AsyncScheduler").AsyncScheduler);r.QueueScheduler=i},{"./AsyncScheduler":200}],203:[function(e,t,r){"use strict";var n=e("./AsyncAction"),i=e("./AsyncScheduler");r.async=new i.AsyncScheduler(n.AsyncAction)},{"./AsyncAction":199,"./AsyncScheduler":200}],204:[function(e,t,r){"use strict";var n=e("./QueueAction"),i=e("./QueueScheduler");r.queue=new i.QueueScheduler(n.QueueAction)},{"./QueueAction":201,"./QueueScheduler":202}],205:[function(e,t,r){"use strict";function n(e){var t=e.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var r=e.Set;if(r&&"function"==typeof(new r)["@@iterator"])return"@@iterator";var n=e.Map;if(n)for(var i=Object.getOwnPropertyNames(n.prototype),o=0;o<i.length;++o){var a=i[o];if("entries"!==a&&"size"!==a&&n.prototype[a]===n.prototype.entries)return a}return"@@iterator"}var i=e("../util/root");r.symbolIteratorPonyfill=n,r.iterator=n(i.root),r.$$iterator=r.iterator},{"../util/root":227}],206:[function(e,t,r){"use strict";function n(e){var t,r=e.Symbol;return"function"==typeof r?r.observable?t=r.observable:(t=r("observable"),r.observable=t):t="@@observable",t}var i=e("../util/root");r.getSymbolObservable=n,r.observable=n(i.root),r.$$observable=r.observable},{"../util/root":227}],207:[function(e,t,r){"use strict";var n=e("../util/root").root.Symbol;r.rxSubscriber="function"==typeof n&&"function"==typeof n.for?n.for("rxSubscriber"):"@@rxSubscriber",r.$$rxSubscriber=r.rxSubscriber},{"../util/root":227}],208:[function(e,t,r){"use strict";var n=e("./root"),i=function(){return function(e){e.requestAnimationFrame?(this.cancelAnimationFrame=e.cancelAnimationFrame.bind(e),this.requestAnimationFrame=e.requestAnimationFrame.bind(e)):e.mozRequestAnimationFrame?(this.cancelAnimationFrame=e.mozCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.mozRequestAnimationFrame.bind(e)):e.webkitRequestAnimationFrame?(this.cancelAnimationFrame=e.webkitCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.webkitRequestAnimationFrame.bind(e)):e.msRequestAnimationFrame?(this.cancelAnimationFrame=e.msCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.msRequestAnimationFrame.bind(e)):e.oRequestAnimationFrame?(this.cancelAnimationFrame=e.oCancelAnimationFrame.bind(e),this.requestAnimationFrame=e.oRequestAnimationFrame.bind(e)):(this.cancelAnimationFrame=e.clearTimeout.bind(e),this.requestAnimationFrame=function(t){return e.setTimeout(t,1e3/60)})}}();r.RequestAnimationFrameDefinition=i,r.AnimationFrame=new i(n.root)},{"./root":227}],209:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.ArgumentOutOfRangeError=i},{}],210:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"no elements in sequence");this.name=t.name="EmptyError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.EmptyError=i},{}],211:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"object unsubscribed");this.name=t.name="ObjectUnsubscribedError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.ObjectUnsubscribedError=i},{}],212:[function(e,t,r){"use strict";function n(){return function(){function e(){this._values=[]}return e.prototype.add=function(e){this.has(e)||this._values.push(e)},e.prototype.has=function(e){return-1!==this._values.indexOf(e)},Object.defineProperty(e.prototype,"size",{get:function(){return this._values.length},enumerable:!0,configurable:!0}),e.prototype.clear=function(){this._values.length=0},e}()}var i=e("./root");r.minimalSetImpl=n,r.Set=i.root.Set||n()},{"./root":227}],213:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(){var t=e.call(this,"Timeout has occurred");this.name=t.name="TimeoutError",this.stack=t.stack,this.message=t.message}return n(t,e),t}(Error);r.TimeoutError=i},{}],214:[function(e,t,r){"use strict";var n=this&&this.__extends||function(e,t){function r(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)},i=function(e){function t(t){e.call(this),this.errors=t;var r=Error.call(this,t?t.length+" errors occurred during unsubscription:\n  "+t.map(function(e,t){return t+1+") "+e.toString()}).join("\n  "):"");this.name=r.name="UnsubscriptionError",this.stack=r.stack,this.message=r.message}return n(t,e),t}(Error);r.UnsubscriptionError=i},{}],215:[function(e,t,r){"use strict";r.errorObject={e:{}}},{}],216:[function(e,t,r){"use strict";r.identity=function(e){return e}},{}],217:[function(e,t,r){"use strict";r.isArray=Array.isArray||function(e){return e&&"number"==typeof e.length}},{}],218:[function(e,t,r){"use strict";r.isArrayLike=function(e){return e&&"number"==typeof e.length}},{}],219:[function(e,t,r){"use strict";r.isDate=function(e){return e instanceof Date&&!isNaN(+e)}},{}],220:[function(e,t,r){"use strict";r.isFunction=function(e){return"function"==typeof e}},{}],221:[function(e,t,r){"use strict";var n=e("../util/isArray");r.isNumeric=function(e){return!n.isArray(e)&&e-parseFloat(e)+1>=0}},{"../util/isArray":217}],222:[function(e,t,r){"use strict";r.isObject=function(e){return null!=e&&"object"==typeof e}},{}],223:[function(e,t,r){"use strict";r.isPromise=function(e){return e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}},{}],224:[function(e,t,r){"use strict";r.isScheduler=function(e){return e&&"function"==typeof e.schedule}},{}],225:[function(e,t,r){"use strict";r.noop=function(){}},{}],226:[function(e,t,r){"use strict";function n(e){return e?1===e.length?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}:i.noop}var i=e("./noop");r.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return n(e)},r.pipeFromArray=n},{"./noop":225}],227:[function(e,t,r){(function(e){"use strict";var t="undefined"!=typeof window&&window,n="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i=t||void 0!==e&&e||n;r.root=i,function(){if(!i)throw new Error("RxJS could not find any global context (window, self, global)")}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],228:[function(e,t,r){"use strict";var n=e("./root"),i=e("./isArrayLike"),o=e("./isPromise"),a=e("./isObject"),s=e("../Observable"),c=e("../symbol/iterator"),u=e("../InnerSubscriber"),h=e("../symbol/observable");r.subscribeToResult=function(e,t,r,l){var p=new u.InnerSubscriber(e,r,l);if(p.closed)return null;if(t instanceof s.Observable)return t._isScalar?(p.next(t.value),p.complete(),null):(p.syncErrorThrowable=!0,t.subscribe(p));if(i.isArrayLike(t)){for(var f=0,d=t.length;f<d&&!p.closed;f++)p.next(t[f]);p.closed||p.complete()}else{if(o.isPromise(t))return t.then(function(e){p.closed||(p.next(e),p.complete())},function(e){return p.error(e)}).then(null,function(e){n.root.setTimeout(function(){throw e})}),p;if(t&&"function"==typeof t[c.iterator])for(var m=t[c.iterator]();;){var v=m.next();if(v.done){p.complete();break}if(p.next(v.value),p.closed)break}else if(t&&"function"==typeof t[h.observable]){var g=t[h.observable]();if("function"==typeof g.subscribe)return g.subscribe(new u.InnerSubscriber(e,r,l));p.error(new TypeError("Provided object does not correctly implement Symbol.observable"))}else{var y="You provided "+(a.isObject(t)?"an invalid object":"'"+t+"'")+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.";p.error(new TypeError(y))}}return null}},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":205,"../symbol/observable":206,"./isArrayLike":218,"./isObject":222,"./isPromise":223,"./root":227}],229:[function(e,t,r){"use strict";var n=e("../Subscriber"),i=e("../symbol/rxSubscriber"),o=e("../Observer");r.toSubscriber=function(e,t,r){if(e){if(e instanceof n.Subscriber)return e;if(e[i.rxSubscriber])return e[i.rxSubscriber]()}return e||t||r?new n.Subscriber(e,t,r):new n.Subscriber(o.empty)}},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":207}],230:[function(e,t,r){"use strict";function n(){try{return i.apply(this,arguments)}catch(e){return o.errorObject.e=e,o.errorObject}}var i,o=e("./errorObject");r.tryCatch=function(e){return i=e,n}},{"./errorObject":215}],231:[function(e,t,r){!function(e,n){n("object"==typeof r&&void 0!==t?r:e.THREE=e.THREE||{})}(this,function(e){function t(){}function r(e,t){this.x=e||0,this.y=t||0}function n(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function i(e,t,r,n){this._x=e||0,this._y=t||0,this._z=r||0,this._w=void 0!==n?n:1}function o(e,t,r){this.x=e||0,this.y=t||0,this.z=r||0}function a(){this.elements=[1,0,0,0,1,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function s(e,t,n,i,o,c,u,h,l,p){Object.defineProperty(this,"id",{value:ui++}),this.uuid=ci.generateUUID(),this.name="",this.image=void 0!==e?e:s.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==t?t:s.DEFAULT_MAPPING,this.wrapS=void 0!==n?n:1001,this.wrapT=void 0!==i?i:1001,this.magFilter=void 0!==o?o:1006,this.minFilter=void 0!==c?c:1008,this.anisotropy=void 0!==l?l:1,this.format=void 0!==u?u:1023,this.type=void 0!==h?h:1009,this.offset=new r(0,0),this.repeat=new r(1,1),this.center=new r(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new a,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==p?p:3e3,this.version=0,this.onUpdate=null}function c(e,t,r,n){this.x=e||0,this.y=t||0,this.z=r||0,this.w=void 0!==n?n:1}function u(e,t,r){this.uuid=ci.generateUUID(),this.width=e,this.height=t,this.scissor=new c(0,0,e,t),this.scissorTest=!1,this.viewport=new c(0,0,e,t),void 0===(r=r||{}).minFilter&&(r.minFilter=1006),this.texture=new s(void 0,void 0,r.wrapS,r.wrapT,r.magFilter,r.minFilter,r.format,r.type,r.anisotropy,r.encoding),this.depthBuffer=void 0===r.depthBuffer||r.depthBuffer,this.stencilBuffer=void 0===r.stencilBuffer||r.stencilBuffer,this.depthTexture=void 0!==r.depthTexture?r.depthTexture:null}function h(e,t,r){u.call(this,e,t,r),this.activeMipMapLevel=this.activeCubeFace=0}function l(e,t,r,n,i,o,a,c,u,h,l,p){s.call(this,null,o,a,c,u,h,n,i,l,p),this.image={data:e,width:t,height:r},this.magFilter=void 0!==u?u:1003,this.minFilter=void 0!==h?h:1003,this.flipY=this.generateMipmaps=!1,this.unpackAlignment=1}function p(e,t,r,n,i,o,a,c,u,h){s.call(this,e=void 0!==e?e:[],void 0!==t?t:301,r,n,i,o,a,c,u,h),this.flipY=!1}function f(e,t,r){var n=e[0];if(0>=n||0<n)return e;var i=t*r,o=pi[i];if(void 0===o&&(o=new Float32Array(i),pi[i]=o),0!==t)for(n.toArray(o,0),n=1,i=0;n!==t;++n)i+=r,e[n].toArray(o,i);return o}function d(e,t){var r=fi[t];void 0===r&&(r=new Int32Array(t),fi[t]=r);for(var n=0;n!==t;++n)r[n]=e.allocTextureUnit();return r}function m(e,t){e.uniform1f(this.addr,t)}function v(e,t){e.uniform1i(this.addr,t)}function g(e,t){void 0===t.x?e.uniform2fv(this.addr,t):e.uniform2f(this.addr,t.x,t.y)}function y(e,t){void 0!==t.x?e.uniform3f(this.addr,t.x,t.y,t.z):void 0!==t.r?e.uniform3f(this.addr,t.r,t.g,t.b):e.uniform3fv(this.addr,t)}function b(e,t){void 0===t.x?e.uniform4fv(this.addr,t):e.uniform4f(this.addr,t.x,t.y,t.z,t.w)}function _(e,t){e.uniformMatrix2fv(this.addr,!1,t.elements||t)}function x(e,t){void 0===t.elements?e.uniformMatrix3fv(this.addr,!1,t):(mi.set(t.elements),e.uniformMatrix3fv(this.addr,!1,mi))}function w(e,t){void 0===t.elements?e.uniformMatrix4fv(this.addr,!1,t):(di.set(t.elements),e.uniformMatrix4fv(this.addr,!1,di))}function S(e,t,r){var n=r.allocTextureUnit();e.uniform1i(this.addr,n),r.setTexture2D(t||hi,n)}function M(e,t,r){var n=r.allocTextureUnit();e.uniform1i(this.addr,n),r.setTextureCube(t||li,n)}function E(e,t){e.uniform2iv(this.addr,t)}function C(e,t){e.uniform3iv(this.addr,t)}function T(e,t){e.uniform4iv(this.addr,t)}function O(e,t){e.uniform1fv(this.addr,t)}function P(e,t){e.uniform1iv(this.addr,t)}function j(e,t){e.uniform2fv(this.addr,f(t,this.size,2))}function A(e,t){e.uniform3fv(this.addr,f(t,this.size,3))}function R(e,t){e.uniform4fv(this.addr,f(t,this.size,4))}function L(e,t){e.uniformMatrix2fv(this.addr,!1,f(t,this.size,4))}function N(e,t){e.uniformMatrix3fv(this.addr,!1,f(t,this.size,9))}function I(e,t){e.uniformMatrix4fv(this.addr,!1,f(t,this.size,16))}function D(e,t,r){var n=t.length,i=d(r,n);for(e.uniform1iv(this.addr,i),e=0;e!==n;++e)r.setTexture2D(t[e]||hi,i[e])}function k(e,t,r){var n=t.length,i=d(r,n);for(e.uniform1iv(this.addr,i),e=0;e!==n;++e)r.setTextureCube(t[e]||li,i[e])}function F(e,t,r){this.id=e,this.addr=r,this.setValue=function(e){switch(e){case 5126:return m;case 35664:return g;case 35665:return y;case 35666:return b;case 35674:return _;case 35675:return x;case 35676:return w;case 35678:case 36198:return S;case 35680:return M;case 5124:case 35670:return v;case 35667:case 35671:return E;case 35668:case 35672:return C;case 35669:case 35673:return T}}(t.type)}function B(e,t,r){this.id=e,this.addr=r,this.size=t.size,this.setValue=function(e){switch(e){case 5126:return O;case 35664:return j;case 35665:return A;case 35666:return R;case 35674:return L;case 35675:return N;case 35676:return I;case 35678:return D;case 35680:return k;case 5124:case 35670:return P;case 35667:case 35671:return E;case 35668:case 35672:return C;case 35669:case 35673:return T}}(t.type)}function U(e){this.id=e,this.seq=[],this.map={}}function z(e,t,r){this.seq=[],this.map={},this.renderer=r,r=e.getProgramParameter(t,e.ACTIVE_UNIFORMS);for(var n=0;n<r;++n){var i=e.getActiveUniform(t,n),o=e.getUniformLocation(t,i.name),a=this,s=i.name,c=s.length;for(vi.lastIndex=0;;){var u=vi.exec(s),h=vi.lastIndex,l=u[1],p=u[3];if("]"===u[2]&&(l|=0),void 0===p||"["===p&&h+2===c){s=a,i=void 0===p?new F(l,i,o):new B(l,i,o),s.seq.push(i),s.map[i.id]=i;break}void 0===(p=a.map[l])&&(p=new U(l),l=a,a=p,l.seq.push(a),l.map[a.id]=a),a=p}}}function $(e,t,r){return void 0===t&&void 0===r?this.set(e):this.setRGB(e,t,r)}function G(e,t){this.min=void 0!==e?e:new r(1/0,1/0),this.max=void 0!==t?t:new r(-1/0,-1/0)}function V(e,t,n,i,a){var s,c,u,h,l,p,f,d,m,v,g,y,b,_,x,w;this.render=function(e,S,M,E){if(0!==e.length){S=new o;var C=E.w/E.z,T=.5*E.z,O=.5*E.w,P=new r((L=16/E.w)*C,L),j=new o(1,1,0),A=new r(1,1),R=new G;if(R.min.set(E.x,E.y),R.max.set(E.x+(E.z-16),E.y+(E.w-16)),void 0===_){var L=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),N=new Uint16Array([0,1,2,0,2,3]);g=t.createBuffer(),y=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,g),t.bufferData(t.ARRAY_BUFFER,L,t.STATIC_DRAW),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,y),t.bufferData(t.ELEMENT_ARRAY_BUFFER,N,t.STATIC_DRAW),x=t.createTexture(),w=t.createTexture(),n.bindTexture(t.TEXTURE_2D,x),t.texImage2D(t.TEXTURE_2D,0,t.RGB,16,16,0,t.RGB,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),n.bindTexture(t.TEXTURE_2D,w),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,16,16,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST);var L=b={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\n\tvUV = uv;\n\tvec2 pos = position;\n\tif ( renderType == 2 ) {\n\t\tvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\n\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\n\t\tvVisibility =        visibility.r / 9.0;\n\t\tvVisibility *= 1.0 - visibility.g / 9.0;\n\t\tvVisibility *=       visibility.b / 9.0;\n\t\tvVisibility *= 1.0 - visibility.a / 9.0;\n\t\tpos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\n\t\tpos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n\t}\n\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\n\tif ( renderType == 0 ) {\n\t\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n\t} else if ( renderType == 1 ) {\n\t\tgl_FragColor = texture2D( map, vUV );\n\t} else {\n\t\tvec4 texture = texture2D( map, vUV );\n\t\ttexture.a *= opacity * vVisibility;\n\t\tgl_FragColor = texture;\n\t\tgl_FragColor.rgb *= color;\n\t}\n}"},N=t.createProgram(),I=t.createShader(t.FRAGMENT_SHADER),D=t.createShader(t.VERTEX_SHADER),k="precision "+a.precision+" float;\n";t.shaderSource(I,k+L.fragmentShader),t.shaderSource(D,k+L.vertexShader),t.compileShader(I),t.compileShader(D),t.attachShader(N,I),t.attachShader(N,D),t.linkProgram(N),_=N,m=t.getAttribLocation(_,"position"),v=t.getAttribLocation(_,"uv"),s=t.getUniformLocation(_,"renderType"),c=t.getUniformLocation(_,"map"),u=t.getUniformLocation(_,"occlusionMap"),h=t.getUniformLocation(_,"opacity"),l=t.getUniformLocation(_,"color"),p=t.getUniformLocation(_,"scale"),f=t.getUniformLocation(_,"rotation"),d=t.getUniformLocation(_,"screenPosition")}for(n.useProgram(_),n.initAttributes(),n.enableAttribute(m),n.enableAttribute(v),n.disableUnusedAttributes(),t.uniform1i(u,0),t.uniform1i(c,1),t.bindBuffer(t.ARRAY_BUFFER,g),t.vertexAttribPointer(m,2,t.FLOAT,!1,16,0),t.vertexAttribPointer(v,2,t.FLOAT,!1,16,8),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,y),n.disable(t.CULL_FACE),n.buffers.depth.setMask(!1),N=0,I=e.length;N<I;N++)if(L=16/E.w,P.set(L*C,L),D=e[N],S.set(D.matrixWorld.elements[12],D.matrixWorld.elements[13],D.matrixWorld.elements[14]),S.applyMatrix4(M.matrixWorldInverse),S.applyMatrix4(M.projectionMatrix),j.copy(S),A.x=E.x+j.x*T+T-8,A.y=E.y+j.y*O+O-8,!0===R.containsPoint(A)){n.activeTexture(t.TEXTURE0),n.bindTexture(t.TEXTURE_2D,null),n.activeTexture(t.TEXTURE1),n.bindTexture(t.TEXTURE_2D,x),t.copyTexImage2D(t.TEXTURE_2D,0,t.RGB,A.x,A.y,16,16,0),t.uniform1i(s,0),t.uniform2f(p,P.x,P.y),t.uniform3f(d,j.x,j.y,j.z),n.disable(t.BLEND),n.enable(t.DEPTH_TEST),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0),n.activeTexture(t.TEXTURE0),n.bindTexture(t.TEXTURE_2D,w),t.copyTexImage2D(t.TEXTURE_2D,0,t.RGBA,A.x,A.y,16,16,0),t.uniform1i(s,1),n.disable(t.DEPTH_TEST),n.activeTexture(t.TEXTURE1),n.bindTexture(t.TEXTURE_2D,x),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0),D.positionScreen.copy(j),D.customUpdateCallback?D.customUpdateCallback(D):D.updateLensFlares(),t.uniform1i(s,2),n.enable(t.BLEND);for(var k=0,F=D.lensFlares.length;k<F;k++){var B=D.lensFlares[k];.001<B.opacity&&.001<B.scale&&(j.x=B.x,j.y=B.y,j.z=B.z,L=B.size*B.scale/E.w,P.x=L*C,P.y=L,t.uniform3f(d,j.x,j.y,j.z),t.uniform2f(p,P.x,P.y),t.uniform1f(f,B.rotation),t.uniform1f(h,B.opacity),t.uniform3f(l,B.color.r,B.color.g,B.color.b),n.setBlending(B.blending,B.blendEquation,B.blendSrc,B.blendDst),i.setTexture2D(B.texture,1),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0))}}n.enable(t.CULL_FACE),n.enable(t.DEPTH_TEST),n.buffers.depth.setMask(!0),n.reset()}}}function H(e,t,r,n,i,o,a,c,u){s.call(this,e,t,r,n,i,o,a,c,u),this.needsUpdate=!0}function q(e,t,r,n,a){function s(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:t.id-e.id}var c,u,h,l,p,f,d,m,v,g,y,b,_,x,w,S,M,E,C,T,O,P=new o,j=new i,A=new o;this.render=function(i,o,R){if(0!==i.length){if(void 0===T){var L=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),N=new Uint16Array([0,1,2,0,2,3]);E=t.createBuffer(),C=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,E),t.bufferData(t.ARRAY_BUFFER,L,t.STATIC_DRAW),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,C),t.bufferData(t.ELEMENT_ARRAY_BUFFER,N,t.STATIC_DRAW),L=t.createProgram(),N=t.createShader(t.VERTEX_SHADER);var I=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(N,["precision "+a.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvUV = uvOffset + uv * uvScale;\n\tvec2 alignedPosition = position * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\tfogDepth = - mvPosition.z;\n}"].join("\n")),t.shaderSource(I,["precision "+a.precision+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvarying float fogDepth;\nvoid main() {\n\tvec4 texture = texture2D( map, vUV );\n\tgl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\n\tif ( gl_FragColor.a < alphaTest ) discard;\n\tif ( fogType > 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")),t.compileShader(N),t.compileShader(I),t.attachShader(L,N),t.attachShader(L,I),t.linkProgram(L),T=L,S=t.getAttribLocation(T,"position"),M=t.getAttribLocation(T,"uv"),c=t.getUniformLocation(T,"uvOffset"),u=t.getUniformLocation(T,"uvScale"),h=t.getUniformLocation(T,"rotation"),l=t.getUniformLocation(T,"scale"),p=t.getUniformLocation(T,"color"),f=t.getUniformLocation(T,"map"),d=t.getUniformLocation(T,"opacity"),m=t.getUniformLocation(T,"modelViewMatrix"),v=t.getUniformLocation(T,"projectionMatrix"),g=t.getUniformLocation(T,"fogType"),y=t.getUniformLocation(T,"fogDensity"),b=t.getUniformLocation(T,"fogNear"),_=t.getUniformLocation(T,"fogFar"),x=t.getUniformLocation(T,"fogColor"),t.getUniformLocation(T,"fogDepth"),w=t.getUniformLocation(T,"alphaTest"),(L=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")).width=8,L.height=8,(N=L.getContext("2d")).fillStyle="white",N.fillRect(0,0,8,8),O=new H(L)}r.useProgram(T),r.initAttributes(),r.enableAttribute(S),r.enableAttribute(M),r.disableUnusedAttributes(),r.disable(t.CULL_FACE),r.enable(t.BLEND),t.bindBuffer(t.ARRAY_BUFFER,E),t.vertexAttribPointer(S,2,t.FLOAT,!1,16,0),t.vertexAttribPointer(M,2,t.FLOAT,!1,16,8),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,C),t.uniformMatrix4fv(v,!1,R.projectionMatrix.elements),r.activeTexture(t.TEXTURE0),t.uniform1i(f,0),N=L=0,(I=o.fog)?(t.uniform3f(x,I.color.r,I.color.g,I.color.b),I.isFog?(t.uniform1f(b,I.near),t.uniform1f(_,I.far),t.uniform1i(g,1),N=L=1):I.isFogExp2&&(t.uniform1f(y,I.density),t.uniform1i(g,2),N=L=2)):(t.uniform1i(g,0),N=L=0);for(var D=0,k=i.length;D<k;D++)(I=i[D]).modelViewMatrix.multiplyMatrices(R.matrixWorldInverse,I.matrixWorld),I.z=-I.modelViewMatrix.elements[14];i.sort(s);for(var F=[],D=0,k=i.length;D<k;D++){var B=(I=i[D]).material;if(!1!==B.visible){I.onBeforeRender(e,o,R,void 0,B,void 0),t.uniform1f(w,B.alphaTest),t.uniformMatrix4fv(m,!1,I.modelViewMatrix.elements),I.matrixWorld.decompose(P,j,A),F[0]=A.x,F[1]=A.y;var U=0;o.fog&&B.fog&&(U=N),L!==U&&(t.uniform1i(g,U),L=U),null!==B.map?(t.uniform2f(c,B.map.offset.x,B.map.offset.y),t.uniform2f(u,B.map.repeat.x,B.map.repeat.y)):(t.uniform2f(c,0,0),t.uniform2f(u,1,1)),t.uniform1f(d,B.opacity),t.uniform3f(p,B.color.r,B.color.g,B.color.b),t.uniform1f(h,B.rotation),t.uniform2fv(l,F),r.setBlending(B.blending,B.blendEquation,B.blendSrc,B.blendDst,B.blendEquationAlpha,B.blendSrcAlpha,B.blendDstAlpha,B.premultipliedAlpha),r.buffers.depth.setTest(B.depthTest),r.buffers.depth.setMask(B.depthWrite),r.buffers.color.setMask(B.colorWrite),n.setTexture2D(B.map||O,0),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0),I.onAfterRender(e,o,R,void 0,B,void 0)}}r.enable(t.CULL_FACE),r.reset()}}}function W(){Object.defineProperty(this,"id",{value:wi++}),this.uuid=ci.generateUUID(),this.name="",this.type="Material",this.lights=this.fog=!0,this.blending=1,this.side=0,this.flatShading=!1,this.vertexColors=0,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=100,this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null,this.depthFunc=3,this.depthWrite=this.depthTest=!0,this.clippingPlanes=null,this.clipShadows=this.clipIntersection=!1,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetUnits=this.polygonOffsetFactor=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.overdraw=0,this.visible=!0,this.userData={},this.needsUpdate=!0}function X(e){W.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.morphTargets=this.skinning=!1,this.displacementMap=this.alphaMap=this.map=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.lights=this.fog=!1,this.setValues(e)}function Y(e){W.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new o,this.nearDistance=1,this.farDistance=1e3,this.morphTargets=this.skinning=!1,this.displacementMap=this.alphaMap=this.map=null,this.displacementScale=1,this.displacementBias=0,this.lights=this.fog=!1,this.setValues(e)}function K(e,t){this.min=void 0!==e?e:new o(1/0,1/0,1/0),this.max=void 0!==t?t:new o(-1/0,-1/0,-1/0)}function Z(e,t){this.center=void 0!==e?e:new o,this.radius=void 0!==t?t:0}function J(e,t){this.normal=void 0!==e?e:new o(1,0,0),this.constant=void 0!==t?t:0}function Q(e,t,r,n,i,o){this.planes=[void 0!==e?e:new J,void 0!==t?t:new J,void 0!==r?r:new J,void 0!==n?n:new J,void 0!==i?i:new J,void 0!==o?o:new J]}function ee(e,t,i){function a(t,r,n,i,o,a){var s=t.geometry,c=v,u=t.customDepthMaterial;return n&&(c=g,u=t.customDistanceMaterial),u?c=u:(u=!1,r.morphTargets&&(s&&s.isBufferGeometry?u=s.morphAttributes&&s.morphAttributes.position&&0<s.morphAttributes.position.length:s&&s.isGeometry&&(u=s.morphTargets&&0<s.morphTargets.length)),t.isSkinnedMesh&&!1===r.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",t),t=t.isSkinnedMesh&&r.skinning,s=0,u&&(s|=1),t&&(s|=2),c=c[s]),e.localClippingEnabled&&!0===r.clipShadows&&0!==r.clippingPlanes.length&&(s=c.uuid,u=r.uuid,void 0===(t=y[s])&&(t={},y[s]=t),void 0===(s=t[u])&&(s=c.clone(),t[u]=s),c=s),c.visible=r.visible,c.wireframe=r.wireframe,u=r.side,E.renderSingleSided&&2==u&&(u=0),E.renderReverseSided&&(0===u?u=1:1===u&&(u=0)),c.side=u,c.clipShadows=r.clipShadows,c.clippingPlanes=r.clippingPlanes,c.clipIntersection=r.clipIntersection,c.wireframeLinewidth=r.wireframeLinewidth,c.linewidth=r.linewidth,n&&c.isMeshDistanceMaterial&&(c.referencePosition.copy(i),c.nearDistance=o,c.farDistance=a),c}function s(r,n,i,o){var c;if(!1!==r.visible){if(r.layers.test(n.layers)&&(r.isMesh||r.isLine||r.isPoints)&&r.castShadow&&(!r.frustumCulled||h.intersectsObject(r))){r.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,r.matrixWorld);var u=t.update(r),l=r.material;if(Array.isArray(l))for(var p=u.groups,f=0,d=p.length;f<d;f++){var v=p[f];(c=l[v.materialIndex])&&c.visible&&(c=a(r,c,o,m,i.near,i.far),e.renderBufferDirect(i,null,u,c,r,v))}else l.visible&&(c=a(r,l,o,m,i.near,i.far),e.renderBufferDirect(i,null,u,c,r,null))}for(u=0,l=(r=r.children).length;u<l;u++)s(r[u],n,i,o)}}var h=new Q,l=new n,p=new r,f=new r(i,i),d=new o,m=new o,v=Array(4),g=Array(4),y={},b=[new o(1,0,0),new o(-1,0,0),new o(0,0,1),new o(0,0,-1),new o(0,1,0),new o(0,-1,0)],_=[new o(0,1,0),new o(0,1,0),new o(0,1,0),new o(0,1,0),new o(0,0,1),new o(0,0,-1)],x=[new c,new c,new c,new c,new c,new c];for(i=0;4!==i;++i){var w=0!=(1&i),S=0!=(2&i),M=new X({depthPacking:3201,morphTargets:w,skinning:S});v[i]=M,w=new Y({morphTargets:w,skinning:S}),g[i]=w}var E=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.renderSingleSided=this.renderReverseSided=!0,this.render=function(t,r,n){if(!1!==E.enabled&&(!1!==E.autoUpdate||!1!==E.needsUpdate)&&0!==t.length){var i=e.state;i.disable(e.context.BLEND),i.buffers.color.setClear(1,1,1,1),i.buffers.depth.setTest(!0),i.setScissorTest(!1);for(var o,a=0,c=t.length;a<c;a++){var v=t[a];o=v.shadow;var g=v&&v.isPointLight;if(void 0===o)console.warn("THREE.WebGLShadowMap:",v,"has no shadow.");else{var y=o.camera;if(p.copy(o.mapSize),p.min(f),g){var w=p.x,S=p.y;x[0].set(2*w,S,w,S),x[1].set(0,S,w,S),x[2].set(3*w,S,w,S),x[3].set(w,S,w,S),x[4].set(3*w,0,w,S),x[5].set(w,0,w,S),p.x*=4,p.y*=2}for(null===o.map&&(o.map=new u(p.x,p.y,{minFilter:1003,magFilter:1003,format:1023}),o.map.texture.name=v.name+".shadowMap",y.updateProjectionMatrix()),o.isSpotLightShadow&&o.update(v),w=o.map,S=o.matrix,m.setFromMatrixPosition(v.matrixWorld),y.position.copy(m),g?(o=6,S.makeTranslation(-m.x,-m.y,-m.z)):(o=1,d.setFromMatrixPosition(v.target.matrixWorld),y.lookAt(d),y.updateMatrixWorld(),S.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),S.multiply(y.projectionMatrix),S.multiply(y.matrixWorldInverse)),e.setRenderTarget(w),e.clear(),v=0;v<o;v++)g&&(d.copy(y.position),d.add(b[v]),y.up.copy(_[v]),y.lookAt(d),y.updateMatrixWorld(),i.viewport(x[v])),l.multiplyMatrices(y.projectionMatrix,y.matrixWorldInverse),h.setFromMatrix(l),s(r,n,y,g)}}E.needsUpdate=!1}}}function te(e,t,r,n){this._x=e||0,this._y=t||0,this._z=r||0,this._order=n||te.DefaultOrder}function re(){this.mask=1}function ne(){Object.defineProperty(this,"id",{value:Si++}),this.uuid=ci.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=ne.DefaultUp.clone();var e=new o,t=new te,r=new i,s=new o(1,1,1);t.onChange(function(){r.setFromEuler(t,!1)}),r.onChange(function(){t.setFromQuaternion(r,void 0,!1)}),Object.defineProperties(this,{position:{enumerable:!0,value:e},rotation:{enumerable:!0,value:t},quaternion:{enumerable:!0,value:r},scale:{enumerable:!0,value:s},modelViewMatrix:{value:new n},normalMatrix:{value:new a}}),this.matrix=new n,this.matrixWorld=new n,this.matrixAutoUpdate=ne.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new re,this.visible=!0,this.receiveShadow=this.castShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}}function ie(){ne.call(this),this.type="Camera",this.matrixWorldInverse=new n,this.projectionMatrix=new n}function oe(e,t,r,n,i,o){ie.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=r,this.bottom=n,this.near=void 0!==i?i:.1,this.far=void 0!==o?o:2e3,this.updateProjectionMatrix()}function ae(e,t,r,n,i,a){this.a=e,this.b=t,this.c=r,this.normal=n&&n.isVector3?n:new o,this.vertexNormals=Array.isArray(n)?n:[],this.color=i&&i.isColor?i:new $,this.vertexColors=Array.isArray(i)?i:[],this.materialIndex=void 0!==a?a:0}function se(){Object.defineProperty(this,"id",{value:Mi+=2}),this.uuid=ci.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingSphere=this.boundingBox=null,this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function ce(e,t,r){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=ci.generateUUID(),this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===r,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.onUploadCallback=function(){},this.version=0}function ue(e,t,r){ce.call(this,new Int8Array(e),t,r)}function he(e,t,r){ce.call(this,new Uint8Array(e),t,r)}function le(e,t,r){ce.call(this,new Uint8ClampedArray(e),t,r)}function pe(e,t,r){ce.call(this,new Int16Array(e),t,r)}function fe(e,t,r){ce.call(this,new Uint16Array(e),t,r)}function de(e,t,r){ce.call(this,new Int32Array(e),t,r)}function me(e,t,r){ce.call(this,new Uint32Array(e),t,r)}function ve(e,t,r){ce.call(this,new Float32Array(e),t,r)}function ge(e,t,r){ce.call(this,new Float64Array(e),t,r)}function ye(){this.indices=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingSphere=this.boundingBox=null,this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function be(e){if(0===e.length)return-1/0;for(var t=e[0],r=1,n=e.length;r<n;++r)e[r]>t&&(t=e[r]);return t}function _e(){Object.defineProperty(this,"id",{value:Ei+=2}),this.uuid=ci.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingSphere=this.boundingBox=null,this.drawRange={start:0,count:1/0}}function xe(e,t,r,n,i,o){se.call(this),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:r,widthSegments:n,heightSegments:i,depthSegments:o},this.fromBufferGeometry(new we(e,t,r,n,i,o)),this.mergeVertices()}function we(e,t,r,n,i,a){function s(e,t,r,n,i,a,s,m,v,g,y){var b=a/v,_=s/g,x=a/2,w=s/2,S=m/2;s=v+1;var M,E,C=g+1,T=a=0,O=new o;for(E=0;E<C;E++){var P=E*_-w;for(M=0;M<s;M++)O[e]=(M*b-x)*n,O[t]=P*i,O[r]=S,h.push(O.x,O.y,O.z),O[e]=0,O[t]=0,O[r]=0<m?1:-1,l.push(O.x,O.y,O.z),p.push(M/v),p.push(1-E/g),a+=1}for(E=0;E<g;E++)for(M=0;M<v;M++)e=f+M+s*(E+1),t=f+(M+1)+s*(E+1),r=f+(M+1)+s*E,u.push(f+M+s*E,e,r),u.push(e,t,r),T+=6;c.addGroup(d,T,y),d+=T,f+=a}_e.call(this),this.type="BoxBufferGeometry",this.parameters={width:e,height:t,depth:r,widthSegments:n,heightSegments:i,depthSegments:a};var c=this;e=e||1,t=t||1,r=r||1,n=Math.floor(n)||1,i=Math.floor(i)||1;var u=[],h=[],l=[],p=[],f=0,d=0;s("z","y","x",-1,-1,r,t,e,a=Math.floor(a)||1,i,0),s("z","y","x",1,-1,r,t,-e,a,i,1),s("x","z","y",1,1,e,r,t,n,a,2),s("x","z","y",1,-1,e,r,-t,n,a,3),s("x","y","z",1,-1,e,t,r,n,i,4),s("x","y","z",-1,-1,e,t,-r,n,i,5),this.setIndex(u),this.addAttribute("position",new ve(h,3)),this.addAttribute("normal",new ve(l,3)),this.addAttribute("uv",new ve(p,2))}function Se(e,t,r,n){se.call(this),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:r,heightSegments:n},this.fromBufferGeometry(new Me(e,t,r,n)),this.mergeVertices()}function Me(e,t,r,n){_e.call(this),this.type="PlaneBufferGeometry",this.parameters={width:e,height:t,widthSegments:r,heightSegments:n};var i=(e=e||1)/2,o=(t=t||1)/2,a=(r=Math.floor(r)||1)+1,s=(n=Math.floor(n)||1)+1,c=e/r,u=t/n,h=[],l=[],p=[],f=[];for(e=0;e<s;e++){var d=e*u-o;for(t=0;t<a;t++)l.push(t*c-i,-d,0),p.push(0,0,1),f.push(t/r),f.push(1-e/n)}for(e=0;e<n;e++)for(t=0;t<r;t++)i=t+a*(e+1),o=t+1+a*(e+1),s=t+1+a*e,h.push(t+a*e,i,s),h.push(i,o,s);this.setIndex(h),this.addAttribute("position",new ve(l,3)),this.addAttribute("normal",new ve(p,3)),this.addAttribute("uv",new ve(f,2))}function Ee(e){W.call(this),this.type="MeshBasicMaterial",this.color=new $(16777215),this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.envMap=this.alphaMap=this.specularMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.lights=this.morphTargets=this.skinning=!1,this.setValues(e)}function Ce(e){W.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,void 0!==e&&(void 0!==e.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}function Te(e,t){this.origin=void 0!==e?e:new o,this.direction=void 0!==t?t:new o}function Oe(e,t){this.start=void 0!==e?e:new o,this.end=void 0!==t?t:new o}function Pe(e,t,r){this.a=void 0!==e?e:new o,this.b=void 0!==t?t:new o,this.c=void 0!==r?r:new o}function je(e,t){ne.call(this),this.type="Mesh",this.geometry=void 0!==e?e:new _e,this.material=void 0!==t?t:new Ee({color:16777215*Math.random()}),this.drawMode=0,this.updateMorphTargets()}function Ae(e,t,r,n){function i(e,r){t.buffers.color.setClear(e.r,e.g,e.b,r,n)}var o,a,s,c=new $(0),u=0;return{getClearColor:function(){return c},setClearColor:function(e,t){c.set(e),i(c,u=void 0!==t?t:1)},getClearAlpha:function(){return u},setClearAlpha:function(e){i(c,u=e)},render:function(t,n,h,l){null===(n=n.background)?i(c,u):n&&n.isColor&&(i(n,1),l=!0),(e.autoClear||l)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),n&&n.isCubeTexture?(void 0===s&&((s=new je(new we(1,1,1),new Ce({uniforms:xi.cube.uniforms,vertexShader:xi.cube.vertexShader,fragmentShader:xi.cube.fragmentShader,side:1,depthTest:!0,depthWrite:!1,fog:!1}))).geometry.removeAttribute("normal"),s.geometry.removeAttribute("uv"),s.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},r.update(s.geometry)),s.material.uniforms.tCube.value=n,t.push(s,s.geometry,s.material,0,null)):n&&n.isTexture&&(void 0===o&&(o=new oe(-1,1,1,-1,0,1),a=new je(new Me(2,2),new Ee({depthTest:!1,depthWrite:!1,fog:!1})),r.update(a.geometry)),a.material.map=n,e.renderBufferDirect(o,null,a.geometry,a.material,a,null))}}}function Re(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.program&&t.program&&e.program!==t.program?e.program.id-t.program.id:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Le(e,t){return e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Ne(){var e={};return{get:function(t,r){return t=t.id+","+r.id,void 0===(r=e[t])&&(r=new function(){var e=[],t=0,r=[],n=[];return{opaque:r,transparent:n,init:function(){t=0,r.length=0,n.length=0},push:function(i,o,a,s,c){var u=e[t];void 0===u?(u={id:i.id,object:i,geometry:o,material:a,program:a.program,renderOrder:i.renderOrder,z:s,group:c},e[t]=u):(u.id=i.id,u.object=i,u.geometry=o,u.material=a,u.program=a.program,u.renderOrder=i.renderOrder,u.z=s,u.group=c),(!0===a.transparent?n:r).push(u),t++},sort:function(){1<r.length&&r.sort(Re),1<n.length&&n.sort(Le)}}},e[t]=r),r},dispose:function(){e={}}}}function Ie(e,t){return Math.abs(t[1])-Math.abs(e[1])}function De(e,t,r){function n(e){e=e.target;var a=i[e.id];null!==a.index&&t.remove(a.index);for(var s in a.attributes)t.remove(a.attributes[s]);e.removeEventListener("dispose",n),delete i[e.id],(s=o[e.id])&&(t.remove(s),delete o[e.id]),(s=o[a.id])&&(t.remove(s),delete o[a.id]),r.geometries--}var i={},o={};return{get:function(e,t){var o=i[t.id];return o||(t.addEventListener("dispose",n),t.isBufferGeometry?o=t:t.isGeometry&&(void 0===t._bufferGeometry&&(t._bufferGeometry=(new _e).setFromObject(e)),o=t._bufferGeometry),i[t.id]=o,r.geometries++,o)},update:function(r){var n=r.index,i=r.attributes;null!==n&&t.update(n,e.ELEMENT_ARRAY_BUFFER);for(var o in i)t.update(i[o],e.ARRAY_BUFFER);r=r.morphAttributes;for(o in r)for(var n=r[o],i=0,a=n.length;i<a;i++)t.update(n[i],e.ARRAY_BUFFER)},getWireframeAttribute:function(r){var n=o[r.id];if(n)return n;n=[];var i=r.index,a=r.attributes;if(null!==i)for(var s=i.array,c=0,u=s.length;c<u;c+=3){var h=s[c+0];a=s[c+1],i=s[c+2],n.push(h,a,a,i,i,h)}else for(s=a.position.array,c=0,u=s.length/3-1;c<u;c+=3)h=c+0,a=c+1,i=c+2,n.push(h,a,a,i,i,h);return n=new(65535<be(n)?me:fe)(n,1),t.update(n,e.ELEMENT_ARRAY_BUFFER),o[r.id]=n}}}function ke(){var e=new function(){var e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];switch(t.type){case"DirectionalLight":var n={direction:new o,color:new $,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r};break;case"SpotLight":n={position:new o,direction:new o,color:new $,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r};break;case"PointLight":n={position:new o,color:new $,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new r,shadowCameraNear:1,shadowCameraFar:1e3};break;case"HemisphereLight":n={direction:new o,skyColor:new $,groundColor:new $};break;case"RectAreaLight":n={color:new $,position:new o,halfWidth:new o,halfHeight:new o}}return e[t.id]=n}}},t={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},i=new o,a=new n,s=new n;return{setup:function(r,n,o){for(var c,u=0,h=0,l=0,p=0,f=0,d=0,m=0,v=0,g=o.matrixWorldInverse,y=0,b=r.length;y<b;y++){var _=r[y];c=_.color;var x=_.intensity,w=_.distance,S=_.shadow&&_.shadow.map?_.shadow.map.texture:null;_.isAmbientLight?(u+=c.r*x,h+=c.g*x,l+=c.b*x):_.isDirectionalLight?((o=e.get(_)).color.copy(_.color).multiplyScalar(_.intensity),o.direction.setFromMatrixPosition(_.matrixWorld),i.setFromMatrixPosition(_.target.matrixWorld),o.direction.sub(i),o.direction.transformDirection(g),(o.shadow=_.castShadow)&&(c=_.shadow,o.shadowBias=c.bias,o.shadowRadius=c.radius,o.shadowMapSize=c.mapSize),t.directionalShadowMap[p]=S,t.directionalShadowMatrix[p]=_.shadow.matrix,t.directional[p]=o,p++):_.isSpotLight?((o=e.get(_)).position.setFromMatrixPosition(_.matrixWorld),o.position.applyMatrix4(g),o.color.copy(c).multiplyScalar(x),o.distance=w,o.direction.setFromMatrixPosition(_.matrixWorld),i.setFromMatrixPosition(_.target.matrixWorld),o.direction.sub(i),o.direction.transformDirection(g),o.coneCos=Math.cos(_.angle),o.penumbraCos=Math.cos(_.angle*(1-_.penumbra)),o.decay=0===_.distance?0:_.decay,(o.shadow=_.castShadow)&&(c=_.shadow,o.shadowBias=c.bias,o.shadowRadius=c.radius,o.shadowMapSize=c.mapSize),t.spotShadowMap[d]=S,t.spotShadowMatrix[d]=_.shadow.matrix,t.spot[d]=o,d++):_.isRectAreaLight?((o=e.get(_)).color.copy(c).multiplyScalar(x/(_.width*_.height)),o.position.setFromMatrixPosition(_.matrixWorld),o.position.applyMatrix4(g),s.identity(),a.copy(_.matrixWorld),a.premultiply(g),s.extractRotation(a),o.halfWidth.set(.5*_.width,0,0),o.halfHeight.set(0,.5*_.height,0),o.halfWidth.applyMatrix4(s),o.halfHeight.applyMatrix4(s),t.rectArea[m]=o,m++):_.isPointLight?((o=e.get(_)).position.setFromMatrixPosition(_.matrixWorld),o.position.applyMatrix4(g),o.color.copy(_.color).multiplyScalar(_.intensity),o.distance=_.distance,o.decay=0===_.distance?0:_.decay,(o.shadow=_.castShadow)&&(c=_.shadow,o.shadowBias=c.bias,o.shadowRadius=c.radius,o.shadowMapSize=c.mapSize,o.shadowCameraNear=c.camera.near,o.shadowCameraFar=c.camera.far),t.pointShadowMap[f]=S,t.pointShadowMatrix[f]=_.shadow.matrix,t.point[f]=o,f++):_.isHemisphereLight&&((o=e.get(_)).direction.setFromMatrixPosition(_.matrixWorld),o.direction.transformDirection(g),o.direction.normalize(),o.skyColor.copy(_.color).multiplyScalar(x),o.groundColor.copy(_.groundColor).multiplyScalar(x),t.hemi[v]=o,v++)}t.ambient[0]=u,t.ambient[1]=h,t.ambient[2]=l,t.directional.length=p,t.spot.length=d,t.rectArea.length=m,t.point.length=f,t.hemi.length=v,t.hash=p+","+f+","+d+","+m+","+v+","+n.length},state:t}}function Fe(e,t,r){var n=e.createShader(t);return e.shaderSource(n,r),e.compileShader(n),!1===e.getShaderParameter(n,e.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile."),""!==e.getShaderInfoLog(n)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",t===e.VERTEX_SHADER?"vertex":"fragment",e.getShaderInfoLog(n),function(e){e=e.split("\n");for(var t=0;t<e.length;t++)e[t]=t+1+": "+e[t];return e.join("\n")}(r)),n}function Be(e){switch(e){case 3e3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+e)}}function Ue(e,t){return t=Be(t),"vec4 "+e+"( vec4 value ) { return "+t[0]+"ToLinear"+t[1]+"; }"}function ze(e){return""!==e}function $e(e,t){return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights)}function Ge(e){return e.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(e,t){if(void 0===(e=_i[t]))throw Error("Can not resolve #include <"+t+">");return Ge(e)})}function Ve(e){return e.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(e,t,r,n){for(e="",t=parseInt(t);t<parseInt(r);t++)e+=n.replace(/\[ i \]/g,"[ "+t+" ]");return e})}function He(e,t,r,n,i,o){var a=e.context,s=n.defines,c=i.vertexShader,u=i.fragmentShader,h="SHADOWMAP_TYPE_BASIC";1===o.shadowMapType?h="SHADOWMAP_TYPE_PCF":2===o.shadowMapType&&(h="SHADOWMAP_TYPE_PCF_SOFT");var l="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",f="ENVMAP_BLENDING_MULTIPLY";if(o.envMap){switch(n.envMap.mapping){case 301:case 302:l="ENVMAP_TYPE_CUBE";break;case 306:case 307:l="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:l="ENVMAP_TYPE_EQUIREC";break;case 305:l="ENVMAP_TYPE_SPHERE"}switch(n.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(n.combine){case 0:f="ENVMAP_BLENDING_MULTIPLY";break;case 1:f="ENVMAP_BLENDING_MIX";break;case 2:f="ENVMAP_BLENDING_ADD"}}var d=0<e.gammaFactor?e.gammaFactor:1,m=function(e,t,r){return e=e||{},[e.derivatives||t.envMapCubeUV||t.bumpMap||t.normalMap||t.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(e.fragDepth||t.logarithmicDepthBuffer)&&r.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",e.drawBuffers&&r.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(e.shaderTextureLOD||t.envMap)&&r.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(ze).join("\n")}(n.extensions,o,t),v=function(e){var t,r=[];for(t in e){var n=e[t];!1!==n&&r.push("#define "+t+" "+n)}return r.join("\n")}(s),g=a.createProgram();n.isRawShaderMaterial?(0<(s=[v].filter(ze).join("\n")).length&&(s+="\n"),0<(t=[m,v].filter(ze).join("\n")).length&&(t+="\n")):(s=["precision "+o.precision+" float;","precision "+o.precision+" int;","#define SHADER_NAME "+i.name,v,o.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+o.maxBones,o.useFog&&o.fog?"#define USE_FOG":"",o.useFog&&o.fogExp?"#define FOG_EXP2":"",o.map?"#define USE_MAP":"",o.envMap?"#define USE_ENVMAP":"",o.envMap?"#define "+p:"",o.lightMap?"#define USE_LIGHTMAP":"",o.aoMap?"#define USE_AOMAP":"",o.emissiveMap?"#define USE_EMISSIVEMAP":"",o.bumpMap?"#define USE_BUMPMAP":"",o.normalMap?"#define USE_NORMALMAP":"",o.displacementMap&&o.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",o.specularMap?"#define USE_SPECULARMAP":"",o.roughnessMap?"#define USE_ROUGHNESSMAP":"",o.metalnessMap?"#define USE_METALNESSMAP":"",o.alphaMap?"#define USE_ALPHAMAP":"",o.vertexColors?"#define USE_COLOR":"",o.flatShading?"#define FLAT_SHADED":"",o.skinning?"#define USE_SKINNING":"",o.useVertexTexture?"#define BONE_TEXTURE":"",o.morphTargets?"#define USE_MORPHTARGETS":"",o.morphNormals&&!1===o.flatShading?"#define USE_MORPHNORMALS":"",o.doubleSided?"#define DOUBLE_SIDED":"",o.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+o.numClippingPlanes,o.shadowMapEnabled?"#define USE_SHADOWMAP":"",o.shadowMapEnabled?"#define "+h:"",o.sizeAttenuation?"#define USE_SIZEATTENUATION":"",o.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",o.logarithmicDepthBuffer&&t.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(ze).join("\n"),t=[m,"precision "+o.precision+" float;","precision "+o.precision+" int;","#define SHADER_NAME "+i.name,v,o.alphaTest?"#define ALPHATEST "+o.alphaTest:"","#define GAMMA_FACTOR "+d,o.useFog&&o.fog?"#define USE_FOG":"",o.useFog&&o.fogExp?"#define FOG_EXP2":"",o.map?"#define USE_MAP":"",o.envMap?"#define USE_ENVMAP":"",o.envMap?"#define "+l:"",o.envMap?"#define "+p:"",o.envMap?"#define "+f:"",o.lightMap?"#define USE_LIGHTMAP":"",o.aoMap?"#define USE_AOMAP":"",o.emissiveMap?"#define USE_EMISSIVEMAP":"",o.bumpMap?"#define USE_BUMPMAP":"",o.normalMap?"#define USE_NORMALMAP":"",o.specularMap?"#define USE_SPECULARMAP":"",o.roughnessMap?"#define USE_ROUGHNESSMAP":"",o.metalnessMap?"#define USE_METALNESSMAP":"",o.alphaMap?"#define USE_ALPHAMAP":"",o.vertexColors?"#define USE_COLOR":"",o.gradientMap?"#define USE_GRADIENTMAP":"",o.flatShading?"#define FLAT_SHADED":"",o.doubleSided?"#define DOUBLE_SIDED":"",o.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+o.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(o.numClippingPlanes-o.numClipIntersection),o.shadowMapEnabled?"#define USE_SHADOWMAP":"",o.shadowMapEnabled?"#define "+h:"",o.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",o.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",o.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",o.logarithmicDepthBuffer&&t.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",o.envMap&&t.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==o.toneMapping?"#define TONE_MAPPING":"",0!==o.toneMapping?_i.tonemapping_pars_fragment:"",0!==o.toneMapping?function(e,t){switch(t){case 1:t="Linear";break;case 2:t="Reinhard";break;case 3:t="Uncharted2";break;case 4:t="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+t)}return"vec3 "+e+"( vec3 color ) { return "+t+"ToneMapping( color ); }"}("toneMapping",o.toneMapping):"",o.dithering?"#define DITHERING":"",o.outputEncoding||o.mapEncoding||o.envMapEncoding||o.emissiveMapEncoding?_i.encodings_pars_fragment:"",o.mapEncoding?Ue("mapTexelToLinear",o.mapEncoding):"",o.envMapEncoding?Ue("envMapTexelToLinear",o.envMapEncoding):"",o.emissiveMapEncoding?Ue("emissiveMapTexelToLinear",o.emissiveMapEncoding):"",o.outputEncoding?function(e,t){return t=Be(t),"vec4 "+e+"( vec4 value ) { return LinearTo"+t[0]+t[1]+"; }"}("linearToOutputTexel",o.outputEncoding):"",o.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(ze).join("\n")),c=$e(c=Ge(c),o),u=$e(u=Ge(u),o),n.isShaderMaterial||(c=Ve(c),u=Ve(u)),u=t+u,c=Fe(a,a.VERTEX_SHADER,s+c),u=Fe(a,a.FRAGMENT_SHADER,u),a.attachShader(g,c),a.attachShader(g,u),void 0!==n.index0AttributeName?a.bindAttribLocation(g,0,n.index0AttributeName):!0===o.morphTargets&&a.bindAttribLocation(g,0,"position"),a.linkProgram(g),o=a.getProgramInfoLog(g),i=a.getShaderInfoLog(c),h=a.getShaderInfoLog(u),p=l=!0,!1===a.getProgramParameter(g,a.LINK_STATUS)?(l=!1,console.error("THREE.WebGLProgram: shader error: ",a.getError(),"gl.VALIDATE_STATUS",a.getProgramParameter(g,a.VALIDATE_STATUS),"gl.getProgramInfoLog",o,i,h)):""!==o?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",o):""!==i&&""!==h||(p=!1),p&&(this.diagnostics={runnable:l,material:n,programLog:o,vertexShader:{log:i,prefix:s},fragmentShader:{log:h,prefix:t}}),a.deleteShader(c),a.deleteShader(u);var y;this.getUniforms=function(){return void 0===y&&(y=new z(a,g,e)),y};var b;return this.getAttributes=function(){if(void 0===b){for(var e={},t=a.getProgramParameter(g,a.ACTIVE_ATTRIBUTES),r=0;r<t;r++){var n=a.getActiveAttrib(g,r).name;e[n]=a.getAttribLocation(g,n)}b=e}return b},this.destroy=function(){a.deleteProgram(g),this.program=void 0},Object.defineProperties(this,{uniforms:{get:function(){return console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."),this.getUniforms()}},attributes:{get:function(){return console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."),this.getAttributes()}}}),this.id=Ci++,this.code=r,this.usedTimes=1,this.program=g,this.vertexShader=c,this.fragmentShader=u,this}function qe(e,t,r){function n(t){if("highp"===t){if(0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.HIGH_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision)return"highp";t="mediump"}return"mediump"===t&&0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision?"mediump":"lowp"}var i,o=void 0!==r.precision?r.precision:"highp";(a=n(o))!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",a,"instead."),o=a),r=!0===r.logarithmicDepthBuffer;var a=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),s=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),c=e.getParameter(e.MAX_TEXTURE_SIZE),u=e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),h=e.getParameter(e.MAX_VERTEX_ATTRIBS),l=e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),p=e.getParameter(e.MAX_VARYING_VECTORS),f=e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),d=0<s,m=!!t.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==i)return i;var r=t.get("EXT_texture_filter_anisotropic");return i=null!==r?e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:n,precision:o,logarithmicDepthBuffer:r,maxTextures:a,maxVertexTextures:s,maxTextureSize:c,maxCubemapSize:u,maxAttributes:h,maxVertexUniforms:l,maxVaryings:p,maxFragmentUniforms:f,vertexTextures:d,floatFragmentTextures:m,floatVertexTextures:d&&m}}function We(e,t,r,n){ie.call(this),this.type="PerspectiveCamera",this.fov=void 0!==e?e:50,this.zoom=1,this.near=void 0!==r?r:.1,this.far=void 0!==n?n:2e3,this.focus=10,this.aspect=void 0!==t?t:1,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}function Xe(e){We.call(this),this.cameras=e||[]}function Ye(e){function t(){if(null!==i&&i.isPresenting){var t=(n=i.getEyeParameters("left")).renderWidth,n=n.renderHeight;d=e.getPixelRatio(),f=e.getSize(),e.setDrawingBufferSize(2*t,n,1)}else r.enabled&&e.setDrawingBufferSize(f.width,f.height,d)}var r=this,i=null,o=null;"undefined"!=typeof window&&"VRFrameData"in window&&(o=new window.VRFrameData);var a=new n,s=new n,u=new n,h=new We;h.bounds=new c(0,0,.5,1),h.layers.enable(1);var l=new We;l.bounds=new c(.5,0,.5,1),l.layers.enable(2);var p=new Xe([h,l]);p.layers.enable(1),p.layers.enable(2);var f,d;"undefined"!=typeof window&&window.addEventListener("vrdisplaypresentchange",t,!1),this.standing=this.enabled=!1,this.getDevice=function(){return i},this.setDevice=function(e){void 0!==e&&(i=e)},this.getCamera=function(e){if(null===i)return e;i.depthNear=e.near,i.depthFar=e.far,i.getFrameData(o);var t=o.pose;return null!==t.position?e.position.fromArray(t.position):e.position.set(0,0,0),null!==t.orientation&&e.quaternion.fromArray(t.orientation),e.updateMatrixWorld(),t=i.stageParameters,this.standing&&t&&(s.fromArray(t.sittingToStandingTransform),u.getInverse(s),e.matrixWorld.multiply(s),e.matrixWorldInverse.multiply(u)),!1===i.isPresenting?e:(h.near=e.near,l.near=e.near,h.far=e.far,l.far=e.far,p.matrixWorld.copy(e.matrixWorld),p.matrixWorldInverse.copy(e.matrixWorldInverse),h.matrixWorldInverse.fromArray(o.leftViewMatrix),l.matrixWorldInverse.fromArray(o.rightViewMatrix),this.standing&&t&&(h.matrixWorldInverse.multiply(u),l.matrixWorldInverse.multiply(u)),null!==(e=e.parent)&&(a.getInverse(e.matrixWorld),h.matrixWorldInverse.multiply(a),l.matrixWorldInverse.multiply(a)),h.matrixWorld.getInverse(h.matrixWorldInverse),l.matrixWorld.getInverse(l.matrixWorldInverse),h.projectionMatrix.fromArray(o.leftProjectionMatrix),l.projectionMatrix.fromArray(o.rightProjectionMatrix),p.projectionMatrix.copy(h.projectionMatrix),(e=i.getLayers()).length&&(null!==(e=e[0]).leftBounds&&4===e.leftBounds.length&&h.bounds.fromArray(e.leftBounds),null!==e.rightBounds&&4===e.rightBounds.length&&l.bounds.fromArray(e.rightBounds)),p)},this.getStandingMatrix=function(){return s},this.submitFrame=function(){i&&i.isPresenting&&i.submitFrame()},this.dispose=function(){"undefined"!=typeof window&&window.removeEventListener("vrdisplaypresentchange",t)}}function Ke(){function e(){h.value!==n&&(h.value=n,h.needsUpdate=0<i),r.numPlanes=i,r.numIntersection=0}function t(e,t,n,i){var o=null!==e?e.length:0,a=null;if(0!==o){if(a=h.value,!0!==i||null===a)for(i=n+4*o,t=t.matrixWorldInverse,u.getNormalMatrix(t),(null===a||a.length<i)&&(a=new Float32Array(i)),i=0;i!==o;++i,n+=4)c.copy(e[i]).applyMatrix4(t,u),c.normal.toArray(a,n),a[n+3]=c.constant;h.value=a,h.needsUpdate=!0}return r.numPlanes=o,a}var r=this,n=null,i=0,o=!1,s=!1,c=new J,u=new a,h={value:null,needsUpdate:!1};this.uniform=h,this.numIntersection=this.numPlanes=0,this.init=function(e,r,a){var s=0!==e.length||r||0!==i||o;return o=r,n=t(e,a,0),i=e.length,s},this.beginShadows=function(){s=!0,t(null)},this.endShadows=function(){s=!1,e()},this.setState=function(r,a,c,u,l,p){if(!o||null===r||0===r.length||s&&!c)s?t(null):e();else{var f=4*(c=s?0:i),d=l.clippingState||null;for(h.value=d,d=t(r,u,f,p),r=0;r!==f;++r)d[r]=n[r];l.clippingState=d,this.numIntersection=a?this.numPlanes:0,this.numPlanes+=c}}}function Ze(e,t){return{convert:function(r){if(1e3===r)return e.REPEAT;if(1001===r)return e.CLAMP_TO_EDGE;if(1002===r)return e.MIRRORED_REPEAT;if(1003===r)return e.NEAREST;if(1004===r)return e.NEAREST_MIPMAP_NEAREST;if(1005===r)return e.NEAREST_MIPMAP_LINEAR;if(1006===r)return e.LINEAR;if(1007===r)return e.LINEAR_MIPMAP_NEAREST;if(1008===r)return e.LINEAR_MIPMAP_LINEAR;if(1009===r)return e.UNSIGNED_BYTE;if(1017===r)return e.UNSIGNED_SHORT_4_4_4_4;if(1018===r)return e.UNSIGNED_SHORT_5_5_5_1;if(1019===r)return e.UNSIGNED_SHORT_5_6_5;if(1010===r)return e.BYTE;if(1011===r)return e.SHORT;if(1012===r)return e.UNSIGNED_SHORT;if(1013===r)return e.INT;if(1014===r)return e.UNSIGNED_INT;if(1015===r)return e.FLOAT;if(1016===r){var n=t.get("OES_texture_half_float");if(null!==n)return n.HALF_FLOAT_OES}if(1021===r)return e.ALPHA;if(1022===r)return e.RGB;if(1023===r)return e.RGBA;if(1024===r)return e.LUMINANCE;if(1025===r)return e.LUMINANCE_ALPHA;if(1026===r)return e.DEPTH_COMPONENT;if(1027===r)return e.DEPTH_STENCIL;if(100===r)return e.FUNC_ADD;if(101===r)return e.FUNC_SUBTRACT;if(102===r)return e.FUNC_REVERSE_SUBTRACT;if(200===r)return e.ZERO;if(201===r)return e.ONE;if(202===r)return e.SRC_COLOR;if(203===r)return e.ONE_MINUS_SRC_COLOR;if(204===r)return e.SRC_ALPHA;if(205===r)return e.ONE_MINUS_SRC_ALPHA;if(206===r)return e.DST_ALPHA;if(207===r)return e.ONE_MINUS_DST_ALPHA;if(208===r)return e.DST_COLOR;if(209===r)return e.ONE_MINUS_DST_COLOR;if(210===r)return e.SRC_ALPHA_SATURATE;if((2001===r||2002===r||2003===r||2004===r)&&null!==(n=t.get("WEBGL_compressed_texture_s3tc"))){if(2001===r)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===r)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===r)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===r)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if((2100===r||2101===r||2102===r||2103===r)&&null!==(n=t.get("WEBGL_compressed_texture_pvrtc"))){if(2100===r)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===r)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===r)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===r)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===r&&null!==(n=t.get("WEBGL_compressed_texture_etc1")))return n.COMPRESSED_RGB_ETC1_WEBGL;if((103===r||104===r)&&null!==(n=t.get("EXT_blend_minmax"))){if(103===r)return n.MIN_EXT;if(104===r)return n.MAX_EXT}return 1020===r&&null!==(n=t.get("WEBGL_depth_texture"))?n.UNSIGNED_INT_24_8_WEBGL:0}}}function Je(e){function t(){(ue=new function(e){var t={};return{get:function(r){if(void 0!==t[r])return t[r];switch(r){case"WEBGL_depth_texture":var n=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case"WEBGL_compressed_texture_etc1":n=e.getExtension("WEBGL_compressed_texture_etc1");break;default:n=e.getExtension(r)}return null===n&&console.warn("THREE.WebGLRenderer: "+r+" extension not supported."),t[r]=n}}}(ce)).get("WEBGL_depth_texture"),ue.get("OES_texture_float"),ue.get("OES_texture_float_linear"),ue.get("OES_texture_half_float"),ue.get("OES_texture_half_float_linear"),ue.get("OES_standard_derivatives"),ue.get("OES_element_index_uint"),ue.get("ANGLE_instanced_arrays"),Ce=new Ze(ce,ue),he=new qe(ce,ue,e),(le=new function(e,t,r){function n(t,r,n){var i=new Uint8Array(4),o=e.createTexture();for(e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST),t=0;t<n;t++)e.texImage2D(r+t,0,e.RGBA,1,1,0,e.RGBA,e.UNSIGNED_BYTE,i);return o}function i(t){!0!==b[t]&&(e.enable(t),b[t]=!0)}function o(t){!1!==b[t]&&(e.disable(t),b[t]=!1)}function a(t,n,a,s,c,u,h,l){if(0!==t?i(e.BLEND):o(e.BLEND),5!==t){if(t!==w||l!==P)switch(t){case 2:l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ONE,e.ONE,e.ONE,e.ONE)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.SRC_ALPHA,e.ONE));break;case 3:l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ZERO,e.ZERO,e.ONE_MINUS_SRC_COLOR,e.ONE_MINUS_SRC_ALPHA)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR));break;case 4:l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ZERO,e.SRC_COLOR,e.ZERO,e.SRC_ALPHA)):(e.blendEquation(e.FUNC_ADD),e.blendFunc(e.ZERO,e.SRC_COLOR));break;default:l?(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.ONE,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)):(e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD),e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA))}O=T=C=E=M=S=null}else c=c||n,u=u||a,h=h||s,n===S&&c===C||(e.blendEquationSeparate(r.convert(n),r.convert(c)),S=n,C=c),a===M&&s===E&&u===T&&h===O||(e.blendFuncSeparate(r.convert(a),r.convert(s),r.convert(u),r.convert(h)),M=a,E=s,T=u,O=h);w=t,P=l}function s(t){j!==t&&(t?e.frontFace(e.CW):e.frontFace(e.CCW),j=t)}function u(t){0!==t?(i(e.CULL_FACE),t!==A&&(1===t?e.cullFace(e.BACK):2===t?e.cullFace(e.FRONT):e.cullFace(e.FRONT_AND_BACK))):o(e.CULL_FACE),A=t}function h(t,r,n){t?(i(e.POLYGON_OFFSET_FILL),(L!==r||N!==n)&&(e.polygonOffset(r,n),L=r,N=n)):o(e.POLYGON_OFFSET_FILL)}function l(t){void 0===t&&(t=e.TEXTURE0+I-1),k!==t&&(e.activeTexture(t),k=t)}var p=new function(){var t=!1,r=new c,n=null,i=new c(0,0,0,0);return{setMask:function(r){n===r||t||(e.colorMask(r,r,r,r),n=r)},setLocked:function(e){t=e},setClear:function(t,n,o,a,s){!0===s&&(t*=a,n*=a,o*=a),r.set(t,n,o,a),!1===i.equals(r)&&(e.clearColor(t,n,o,a),i.copy(r))},reset:function(){t=!1,n=null,i.set(-1,0,0,0)}}},f=new function(){var t=!1,r=null,n=null,a=null;return{setTest:function(t){t?i(e.DEPTH_TEST):o(e.DEPTH_TEST)},setMask:function(n){r===n||t||(e.depthMask(n),r=n)},setFunc:function(t){if(n!==t){if(t)switch(t){case 0:e.depthFunc(e.NEVER);break;case 1:e.depthFunc(e.ALWAYS);break;case 2:e.depthFunc(e.LESS);break;case 3:e.depthFunc(e.LEQUAL);break;case 4:e.depthFunc(e.EQUAL);break;case 5:e.depthFunc(e.GEQUAL);break;case 6:e.depthFunc(e.GREATER);break;case 7:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}else e.depthFunc(e.LEQUAL);n=t}},setLocked:function(e){t=e},setClear:function(t){a!==t&&(e.clearDepth(t),a=t)},reset:function(){t=!1,a=n=r=null}}},d=new function(){var t=!1,r=null,n=null,a=null,s=null,c=null,u=null,h=null,l=null;return{setTest:function(t){t?i(e.STENCIL_TEST):o(e.STENCIL_TEST)},setMask:function(n){r===n||t||(e.stencilMask(n),r=n)},setFunc:function(t,r,i){n===t&&a===r&&s===i||(e.stencilFunc(t,r,i),n=t,a=r,s=i)},setOp:function(t,r,n){c===t&&u===r&&h===n||(e.stencilOp(t,r,n),c=t,u=r,h=n)},setLocked:function(e){t=e},setClear:function(t){l!==t&&(e.clearStencil(t),l=t)},reset:function(){t=!1,l=h=u=c=s=a=n=r=null}}},m=e.getParameter(e.MAX_VERTEX_ATTRIBS),v=new Uint8Array(m),g=new Uint8Array(m),y=new Uint8Array(m),b={},_=null,x=null,w=null,S=null,M=null,E=null,C=null,T=null,O=null,P=!1,j=null,A=null,R=null,L=null,N=null,I=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS),m=parseFloat(/^WebGL\ ([0-9])/.exec(e.getParameter(e.VERSION))[1]),D=1<=parseFloat(m),k=null,F={},B=new c,U=new c,z={};return z[e.TEXTURE_2D]=n(e.TEXTURE_2D,e.TEXTURE_2D,1),z[e.TEXTURE_CUBE_MAP]=n(e.TEXTURE_CUBE_MAP,e.TEXTURE_CUBE_MAP_POSITIVE_X,6),p.setClear(0,0,0,1),f.setClear(1),d.setClear(0),i(e.DEPTH_TEST),f.setFunc(3),s(!1),u(1),i(e.CULL_FACE),i(e.BLEND),a(1),{buffers:{color:p,depth:f,stencil:d},initAttributes:function(){for(var e=0,t=v.length;e<t;e++)v[e]=0},enableAttribute:function(r){v[r]=1,0===g[r]&&(e.enableVertexAttribArray(r),g[r]=1),0!==y[r]&&(t.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(r,0),y[r]=0)},enableAttributeAndDivisor:function(r,n){v[r]=1,0===g[r]&&(e.enableVertexAttribArray(r),g[r]=1),y[r]!==n&&(t.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(r,n),y[r]=n)},disableUnusedAttributes:function(){for(var t=0,r=g.length;t!==r;++t)g[t]!==v[t]&&(e.disableVertexAttribArray(t),g[t]=0)},enable:i,disable:o,getCompressedTextureFormats:function(){if(null===_&&(_=[],t.get("WEBGL_compressed_texture_pvrtc")||t.get("WEBGL_compressed_texture_s3tc")||t.get("WEBGL_compressed_texture_etc1")))for(var r=e.getParameter(e.COMPRESSED_TEXTURE_FORMATS),n=0;n<r.length;n++)_.push(r[n]);return _},useProgram:function(t){return x!==t&&(e.useProgram(t),x=t,!0)},setBlending:a,setMaterial:function(t){2===t.side?o(e.CULL_FACE):i(e.CULL_FACE),s(1===t.side),!0===t.transparent?a(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha):a(0),f.setFunc(t.depthFunc),f.setTest(t.depthTest),f.setMask(t.depthWrite),p.setMask(t.colorWrite),h(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits)},setFlipSided:s,setCullFace:u,setLineWidth:function(t){t!==R&&(D&&e.lineWidth(t),R=t)},setPolygonOffset:h,setScissorTest:function(t){t?i(e.SCISSOR_TEST):o(e.SCISSOR_TEST)},activeTexture:l,bindTexture:function(t,r){null===k&&l();var n=F[k];void 0===n&&(n={type:void 0,texture:void 0},F[k]=n),n.type===t&&n.texture===r||(e.bindTexture(t,r||z[t]),n.type=t,n.texture=r)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===B.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),B.copy(t))},viewport:function(t){!1===U.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),U.copy(t))},reset:function(){for(var t=0;t<g.length;t++)1===g[t]&&(e.disableVertexAttribArray(t),g[t]=0);b={},k=_=null,F={},A=j=w=x=null,p.reset(),f.reset(),d.reset()}}}(ce,ue,Ce)).scissor(U.copy(K).multiplyScalar(X)),le.viewport(B.copy(Y).multiplyScalar(X)),pe=new function(){var e={};return{get:function(t){t=t.uuid;var r=e[t];return void 0===r&&(r={},e[t]=r),r},remove:function(t){delete e[t.uuid]},clear:function(){e={}}}},fe=new function(e,t,r,n,i,o,a){function s(e,t){if(e.width>t||e.height>t){t/=Math.max(e.width,e.height);var r=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return r.width=Math.floor(e.width*t),r.height=Math.floor(e.height*t),r.getContext("2d").drawImage(e,0,0,e.width,e.height,0,0,r.width,r.height),console.warn("THREE.WebGLRenderer: image is too big ("+e.width+"x"+e.height+"). Resized to "+r.width+"x"+r.height,e),r}return e}function c(e){return ci.isPowerOfTwo(e.width)&&ci.isPowerOfTwo(e.height)}function u(e,t){return e.generateMipmaps&&t&&1003!==e.minFilter&&1006!==e.minFilter}function h(t){return 1003===t||1004===t||1005===t?e.NEAREST:e.LINEAR}function l(t){(t=t.target).removeEventListener("dispose",l);e:{var r=n.get(t);if(t.image&&r.__image__webglTextureCube)e.deleteTexture(r.__image__webglTextureCube);else{if(void 0===r.__webglInit)break e;e.deleteTexture(r.__webglTexture)}n.remove(t)}a.textures--}function p(t){(t=t.target).removeEventListener("dispose",p);var r=n.get(t),i=n.get(t.texture);if(t){if(void 0!==i.__webglTexture&&e.deleteTexture(i.__webglTexture),t.depthTexture&&t.depthTexture.dispose(),t.isWebGLRenderTargetCube)for(i=0;6>i;i++)e.deleteFramebuffer(r.__webglFramebuffer[i]),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer[i]);else e.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer);n.remove(t.texture),n.remove(t)}a.textures--}function f(t,h){var p=n.get(t);if(0<t.version&&p.__version!==t.version)if(void 0===(m=t.image))console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",t);else{if(!1!==m.complete){void 0===p.__webglInit&&(p.__webglInit=!0,t.addEventListener("dispose",l),p.__webglTexture=e.createTexture(),a.textures++),r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_2D,p.__webglTexture),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,t.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,t.unpackAlignment);var f=s(t.image,i.maxTextureSize);(1001!==t.wrapS||1001!==t.wrapT||1003!==t.minFilter&&1006!==t.minFilter)&&!1===c(f)&&((h=f)instanceof HTMLImageElement||h instanceof HTMLCanvasElement||h instanceof ImageBitmap?(m=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),m.width=ci.floorPowerOfTwo(h.width),m.height=ci.floorPowerOfTwo(h.height),m.getContext("2d").drawImage(h,0,0,m.width,m.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+h.width+"x"+h.height+"). Resized to "+m.width+"x"+m.height,h),f=m):f=h),h=c(f);var m=o.convert(t.format),v=o.convert(t.type);d(e.TEXTURE_2D,t,h);var y=t.mipmaps;if(t.isDepthTexture){if(y=e.DEPTH_COMPONENT,1015===t.type){if(!g)throw Error("Float Depth Texture only supported in WebGL2.0");y=e.DEPTH_COMPONENT32F}else g&&(y=e.DEPTH_COMPONENT16);1026===t.format&&y===e.DEPTH_COMPONENT&&1012!==t.type&&1014!==t.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),t.type=1012,v=o.convert(t.type)),1027===t.format&&(y=e.DEPTH_STENCIL,1020!==t.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),t.type=1020,v=o.convert(t.type))),r.texImage2D(e.TEXTURE_2D,0,y,f.width,f.height,0,m,v,null)}else if(t.isDataTexture)if(0<y.length&&h){for(var b=0,_=y.length;b<_;b++)f=y[b],r.texImage2D(e.TEXTURE_2D,b,m,f.width,f.height,0,m,v,f.data);t.generateMipmaps=!1}else r.texImage2D(e.TEXTURE_2D,0,m,f.width,f.height,0,m,v,f.data);else if(t.isCompressedTexture)for(b=0,_=y.length;b<_;b++)f=y[b],1023!==t.format&&1022!==t.format?-1<r.getCompressedTextureFormats().indexOf(m)?r.compressedTexImage2D(e.TEXTURE_2D,b,m,f.width,f.height,0,f.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):r.texImage2D(e.TEXTURE_2D,b,m,f.width,f.height,0,m,v,f.data);else if(0<y.length&&h){for(b=0,_=y.length;b<_;b++)f=y[b],r.texImage2D(e.TEXTURE_2D,b,m,m,v,f);t.generateMipmaps=!1}else r.texImage2D(e.TEXTURE_2D,0,m,m,v,f);return u(t,h)&&e.generateMipmap(e.TEXTURE_2D),p.__version=t.version,void(t.onUpdate&&t.onUpdate(t))}console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",t)}r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_2D,p.__webglTexture)}function d(r,a,s){s?(e.texParameteri(r,e.TEXTURE_WRAP_S,o.convert(a.wrapS)),e.texParameteri(r,e.TEXTURE_WRAP_T,o.convert(a.wrapT)),e.texParameteri(r,e.TEXTURE_MAG_FILTER,o.convert(a.magFilter)),e.texParameteri(r,e.TEXTURE_MIN_FILTER,o.convert(a.minFilter))):(e.texParameteri(r,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(r,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),1001===a.wrapS&&1001===a.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",a),e.texParameteri(r,e.TEXTURE_MAG_FILTER,h(a.magFilter)),e.texParameteri(r,e.TEXTURE_MIN_FILTER,h(a.minFilter)),1003!==a.minFilter&&1006!==a.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",a)),!(s=t.get("EXT_texture_filter_anisotropic"))||1015===a.type&&null===t.get("OES_texture_float_linear")||1016===a.type&&null===t.get("OES_texture_half_float_linear")||!(1<a.anisotropy||n.get(a).__currentAnisotropy)||(e.texParameterf(r,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,i.getMaxAnisotropy())),n.get(a).__currentAnisotropy=a.anisotropy)}function m(t,i,a,s){var c=o.convert(i.texture.format),u=o.convert(i.texture.type);r.texImage2D(s,0,c,i.width,i.height,0,c,u,null),e.bindFramebuffer(e.FRAMEBUFFER,t),e.framebufferTexture2D(e.FRAMEBUFFER,a,s,n.get(i.texture).__webglTexture,0),e.bindFramebuffer(e.FRAMEBUFFER,null)}function v(t,r){e.bindRenderbuffer(e.RENDERBUFFER,t),r.depthBuffer&&!r.stencilBuffer?(e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,r.width,r.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,t)):r.depthBuffer&&r.stencilBuffer?(e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,r.width,r.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,t)):e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,r.width,r.height),e.bindRenderbuffer(e.RENDERBUFFER,null)}var g="undefined"!=typeof WebGL2RenderingContext&&e instanceof window.WebGL2RenderingContext;this.setTexture2D=f,this.setTextureCube=function(t,h){var p=n.get(t);if(6===t.image.length)if(0<t.version&&p.__version!==t.version){p.__image__webglTextureCube||(t.addEventListener("dispose",l),p.__image__webglTextureCube=e.createTexture(),a.textures++),r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_CUBE_MAP,p.__image__webglTextureCube),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,t.flipY),h=t&&t.isCompressedTexture;for(var f=t.image[0]&&t.image[0].isDataTexture,m=[],v=0;6>v;v++)m[v]=h||f?f?t.image[v].image:t.image[v]:s(t.image[v],i.maxCubemapSize);var g=c(m[0]),y=o.convert(t.format),b=o.convert(t.type);for(d(e.TEXTURE_CUBE_MAP,t,g),v=0;6>v;v++)if(h)for(var _,x=m[v].mipmaps,w=0,S=x.length;w<S;w++)_=x[w],1023!==t.format&&1022!==t.format?-1<r.getCompressedTextureFormats().indexOf(y)?r.compressedTexImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+v,w,y,_.width,_.height,0,_.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+v,w,y,_.width,_.height,0,y,b,_.data);else f?r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+v,0,y,m[v].width,m[v].height,0,y,b,m[v].data):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+v,0,y,y,b,m[v]);u(t,g)&&e.generateMipmap(e.TEXTURE_CUBE_MAP),p.__version=t.version,t.onUpdate&&t.onUpdate(t)}else r.activeTexture(e.TEXTURE0+h),r.bindTexture(e.TEXTURE_CUBE_MAP,p.__image__webglTextureCube)},this.setTextureCubeDynamic=function(t,i){r.activeTexture(e.TEXTURE0+i),r.bindTexture(e.TEXTURE_CUBE_MAP,n.get(t).__webglTexture)},this.setupRenderTarget=function(t){var i=n.get(t),o=n.get(t.texture);t.addEventListener("dispose",p),o.__webglTexture=e.createTexture(),a.textures++;var s=!0===t.isWebGLRenderTargetCube,h=c(t);if(s){i.__webglFramebuffer=[];for(var l=0;6>l;l++)i.__webglFramebuffer[l]=e.createFramebuffer()}else i.__webglFramebuffer=e.createFramebuffer();if(s){for(r.bindTexture(e.TEXTURE_CUBE_MAP,o.__webglTexture),d(e.TEXTURE_CUBE_MAP,t.texture,h),l=0;6>l;l++)m(i.__webglFramebuffer[l],t,e.COLOR_ATTACHMENT0,e.TEXTURE_CUBE_MAP_POSITIVE_X+l);u(t.texture,h)&&e.generateMipmap(e.TEXTURE_CUBE_MAP),r.bindTexture(e.TEXTURE_CUBE_MAP,null)}else r.bindTexture(e.TEXTURE_2D,o.__webglTexture),d(e.TEXTURE_2D,t.texture,h),m(i.__webglFramebuffer,t,e.COLOR_ATTACHMENT0,e.TEXTURE_2D),u(t.texture,h)&&e.generateMipmap(e.TEXTURE_2D),r.bindTexture(e.TEXTURE_2D,null);if(t.depthBuffer){if(i=n.get(t),o=!0===t.isWebGLRenderTargetCube,t.depthTexture){if(o)throw Error("target.depthTexture not supported in Cube render targets");if(t&&t.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported");if(e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer),!t.depthTexture||!t.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");if(n.get(t.depthTexture).__webglTexture&&t.depthTexture.image.width===t.width&&t.depthTexture.image.height===t.height||(t.depthTexture.image.width=t.width,t.depthTexture.image.height=t.height,t.depthTexture.needsUpdate=!0),f(t.depthTexture,0),i=n.get(t.depthTexture).__webglTexture,1026===t.depthTexture.format)e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,i,0);else{if(1027!==t.depthTexture.format)throw Error("Unknown depthTexture format");e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,i,0)}}else if(o)for(i.__webglDepthbuffer=[],o=0;6>o;o++)e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer[o]),i.__webglDepthbuffer[o]=e.createRenderbuffer(),v(i.__webglDepthbuffer[o],t);else e.bindFramebuffer(e.FRAMEBUFFER,i.__webglFramebuffer),i.__webglDepthbuffer=e.createRenderbuffer(),v(i.__webglDepthbuffer,t);e.bindFramebuffer(e.FRAMEBUFFER,null)}},this.updateRenderTargetMipmap=function(t){var i=t.texture;u(i,c(t))&&(t=t.isWebGLRenderTargetCube?e.TEXTURE_CUBE_MAP:e.TEXTURE_2D,i=n.get(i).__webglTexture,r.bindTexture(t,i),e.generateMipmap(t),r.bindTexture(t,null))}}(ce,ue,le,pe,he,Ce,ae),de=new function(e){var t={};return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t[e.uuid]},remove:function(r){r.isInterleavedBufferAttribute&&(r=r.data);var n=t[r.uuid];n&&(e.deleteBuffer(n.buffer),delete t[r.uuid])},update:function(r,n){if(r.isInterleavedBufferAttribute&&(r=r.data),void 0===(i=t[r.uuid])){var i=r.uuid,o=r.array,a=r.dynamic?e.DYNAMIC_DRAW:e.STATIC_DRAW,s=e.createBuffer();e.bindBuffer(n,s),e.bufferData(n,o,a),r.onUploadCallback(),n=e.FLOAT,o instanceof Float32Array?n=e.FLOAT:o instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):o instanceof Uint16Array?n=e.UNSIGNED_SHORT:o instanceof Int16Array?n=e.SHORT:o instanceof Uint32Array?n=e.UNSIGNED_INT:o instanceof Int32Array?n=e.INT:o instanceof Int8Array?n=e.BYTE:o instanceof Uint8Array&&(n=e.UNSIGNED_BYTE),t[i]={buffer:s,type:n,bytesPerElement:o.BYTES_PER_ELEMENT,version:r.version}}else i.version<r.version&&(o=r,s=o.array,a=o.updateRange,e.bindBuffer(n,i.buffer),!1===o.dynamic?e.bufferData(n,s,e.STATIC_DRAW):-1===a.count?e.bufferSubData(n,0,s):0===a.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(e.bufferSubData(n,a.offset*s.BYTES_PER_ELEMENT,s.subarray(a.offset,a.offset+a.count)),a.count=-1),i.version=r.version)}}}(ce),me=new De(ce,de,ae),ve=new function(e,t){var r={};return{update:function(n){var i=t.frame,o=n.geometry,a=e.get(n,o);return r[a.id]!==i&&(o.isGeometry&&a.updateFromObject(n),e.update(a),r[a.id]=i),a},clear:function(){r={}}}}(me,se),xe=new function(e){var t={},r=new Float32Array(8);return{update:function(n,i,o,a){var s=n.morphTargetInfluences,c=s.length;if(void 0===(n=t[i.id])){n=[];for(var u=0;u<c;u++)n[u]=[u,0];t[i.id]=n}var h=o.morphTargets&&i.morphAttributes.position;for(o=o.morphNormals&&i.morphAttributes.normal,u=0;u<c;u++){var l=n[u];0!==l[1]&&(h&&i.removeAttribute("morphTarget"+u),o&&i.removeAttribute("morphNormal"+u))}for(u=0;u<c;u++)l=n[u],l[0]=u,l[1]=s[u];for(n.sort(Ie),u=0;8>u;u++)(l=n[u])&&(s=l[0],l=l[1])?(h&&i.addAttribute("morphTarget"+u,h[s]),o&&i.addAttribute("morphNormal"+u,o[s]),r[u]=l):r[u]=0;a.getUniforms().setValue(e,"morphTargetInfluences",r)}}}(ce),ye=new function(e,t,r){function n(e,t){if(e)e.isTexture?r=e.encoding:e.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),r=e.texture.encoding);else var r=3e3;return 3e3===r&&t&&(r=3007),r}var i=[],o={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow"},a="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");this.getParameters=function(t,i,a,s,c,u,h){var l=o[t.type];if(h.isSkinnedMesh){var p=h.skeleton.bones;if(r.floatVertexTextures)p=1024;else{var f=Math.min(Math.floor((r.maxVertexUniforms-20)/4),p.length);f<p.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+p.length+" bones. This GPU supports "+f+"."),p=0):p=f}}else p=0;f=r.precision,null!==t.precision&&(f=r.getMaxPrecision(t.precision))!==t.precision&&console.warn("THREE.WebGLProgram.getParameters:",t.precision,"not supported, using",f,"instead.");var d=e.getRenderTarget();return{shaderID:l,precision:f,supportsVertexTextures:r.vertexTextures,outputEncoding:n(d?d.texture:null,e.gammaOutput),map:!!t.map,mapEncoding:n(t.map,e.gammaInput),envMap:!!t.envMap,envMapMode:t.envMap&&t.envMap.mapping,envMapEncoding:n(t.envMap,e.gammaInput),envMapCubeUV:!!t.envMap&&(306===t.envMap.mapping||307===t.envMap.mapping),lightMap:!!t.lightMap,aoMap:!!t.aoMap,emissiveMap:!!t.emissiveMap,emissiveMapEncoding:n(t.emissiveMap,e.gammaInput),bumpMap:!!t.bumpMap,normalMap:!!t.normalMap,displacementMap:!!t.displacementMap,roughnessMap:!!t.roughnessMap,metalnessMap:!!t.metalnessMap,specularMap:!!t.specularMap,alphaMap:!!t.alphaMap,gradientMap:!!t.gradientMap,combine:t.combine,vertexColors:t.vertexColors,fog:!!s,useFog:t.fog,fogExp:s&&s.isFogExp2,flatShading:t.flatShading,sizeAttenuation:t.sizeAttenuation,logarithmicDepthBuffer:r.logarithmicDepthBuffer,skinning:t.skinning&&0<p,maxBones:p,useVertexTexture:r.floatVertexTextures,morphTargets:t.morphTargets,morphNormals:t.morphNormals,maxMorphTargets:e.maxMorphTargets,maxMorphNormals:e.maxMorphNormals,numDirLights:i.directional.length,numPointLights:i.point.length,numSpotLights:i.spot.length,numRectAreaLights:i.rectArea.length,numHemiLights:i.hemi.length,numClippingPlanes:c,numClipIntersection:u,dithering:t.dithering,shadowMapEnabled:e.shadowMap.enabled&&h.receiveShadow&&0<a.length,shadowMapType:e.shadowMap.type,toneMapping:e.toneMapping,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:t.premultipliedAlpha,alphaTest:t.alphaTest,doubleSided:2===t.side,flipSided:1===t.side,depthPacking:void 0!==t.depthPacking&&t.depthPacking}},this.getProgramCode=function(t,r){var n=[];if(r.shaderID?n.push(r.shaderID):(n.push(t.fragmentShader),n.push(t.vertexShader)),void 0!==t.defines)for(var i in t.defines)n.push(i),n.push(t.defines[i]);for(i=0;i<a.length;i++)n.push(r[a[i]]);return n.push(t.onBeforeCompile.toString()),n.push(e.gammaOutput),n.join()},this.acquireProgram=function(r,n,o,a){for(var s,c=0,u=i.length;c<u;c++){var h=i[c];if(h.code===a){++(s=h).usedTimes;break}}return void 0===s&&(s=new He(e,t,a,r,n,o),i.push(s)),s},this.releaseProgram=function(e){if(0==--e.usedTimes){var t=i.indexOf(e);i[t]=i[i.length-1],i.pop(),e.destroy()}},this.programs=i}(A,ue,he),ge=new ke,be=new Ne,_e=new Ae(A,le,me,M),we=new function(e,t,r){var n;this.setMode=function(e){n=e},this.render=function(t,i){e.drawArrays(n,t,i),r.calls++,r.vertices+=i,n===e.TRIANGLES?r.faces+=i/3:n===e.POINTS&&(r.points+=i)},this.renderInstances=function(i,o,a){var s=t.get("ANGLE_instanced_arrays");if(null===s)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var c=i.attributes.position;c.isInterleavedBufferAttribute?(a=c.data.count,s.drawArraysInstancedANGLE(n,0,a,i.maxInstancedCount)):s.drawArraysInstancedANGLE(n,o,a,i.maxInstancedCount),r.calls++,r.vertices+=a*i.maxInstancedCount,n===e.TRIANGLES?r.faces+=i.maxInstancedCount*a/3:n===e.POINTS&&(r.points+=i.maxInstancedCount*a)}}}(ce,ue,se),Se=new function(e,t,r){var n,i,o;this.setMode=function(e){n=e},this.setIndex=function(e){i=e.type,o=e.bytesPerElement},this.render=function(t,a){e.drawElements(n,a,i,t*o),r.calls++,r.vertices+=a,n===e.TRIANGLES?r.faces+=a/3:n===e.POINTS&&(r.points+=a)},this.renderInstances=function(a,s,c){var u=t.get("ANGLE_instanced_arrays");null===u?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(u.drawElementsInstancedANGLE(n,c,i,s*o,a.maxInstancedCount),r.calls++,r.vertices+=c*a.maxInstancedCount,n===e.TRIANGLES?r.faces+=a.maxInstancedCount*c/3:n===e.POINTS&&(r.points+=a.maxInstancedCount*c))}}(ce,ue,se),Me=new V(A,ce,le,fe,he),Ee=new q(A,ce,le,fe,he),A.info.programs=ye.programs,A.context=ce,A.capabilities=he,A.extensions=ue,A.properties=pe,A.renderLists=be,A.state=le}function r(e){e.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),R=!0}function i(){console.log("THREE.WebGLRenderer: Context Restored."),R=!1,t()}function a(e){(e=e.target).removeEventListener("dispose",a),s(e),pe.remove(e)}function s(e){var t=pe.get(e).program;e.program=void 0,void 0!==t&&ye.releaseProgram(t)}function u(e){null!==je&&je(e),(e=Te.getDevice())&&e.isPresenting?e.requestAnimationFrame(u):window.requestAnimationFrame(u)}function h(e,t,r){if(!1!==e.visible){if(e.layers.test(t.layers))if(e.isLight)C.push(e),e.castShadow&&T.push(e);else if(e.isSprite)e.frustumCulled&&!J.intersectsSprite(e)||P.push(e);else if(e.isLensFlare)j.push(e);else if(e.isImmediateRenderObject)r&&oe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ie),O.push(e,null,e.material,oe.z,null);else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.update(),!e.frustumCulled||J.intersectsObject(e))){r&&oe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ie);var n=ve.update(e),i=e.material;if(Array.isArray(i))for(var o=n.groups,a=0,s=o.length;a<s;a++){var c=o[a],u=i[c.materialIndex];u&&u.visible&&O.push(e,n,u,oe.z,c)}else i.visible&&O.push(e,n,i,oe.z,null)}for(a=0,s=(e=e.children).length;a<s;a++)h(e[a],t,r)}}function p(e,t,r,n){for(var i=0,o=e.length;i<o;i++){var a=(u=e[i]).object,s=u.geometry,c=void 0===n?u.material:n,u=u.group;if(r.isArrayCamera){F=r;for(var h=r.cameras,l=0,p=h.length;l<p;l++){var d=h[l];if(a.layers.test(d.layers)){var m=d.bounds;le.viewport(B.set(m.x*H,m.y*W,m.z*H,m.w*W).multiplyScalar(X)),f(a,t,d,s,c,u)}}}else F=null,f(a,t,r,s,c,u)}}function f(e,t,r,n,i,o){if(e.onBeforeRender(A,t,r,n,i,o),e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),e.isImmediateRenderObject){le.setMaterial(i);var a=m(r,t.fog,i,e);D="",function(e,t,r){e.render(function(e){A.renderBufferImmediate(e,t,r)})}(e,a,i)}else A.renderBufferDirect(r,t.fog,n,i,e,o);e.onAfterRender(A,t,r,n,i,o)}function d(e,t,r){var n=pe.get(e);r=ye.getParameters(e,ge.state,T,t,te.numPlanes,te.numIntersection,r);var i=ye.getProgramCode(e,r),o=n.program,c=!0;if(void 0===o)e.addEventListener("dispose",a);else if(o.code!==i)s(e);else{if(void 0!==r.shaderID)return;c=!1}if(c&&(r.shaderID?(o=xi[r.shaderID],n.shader={name:e.type,uniforms:bi.clone(o.uniforms),vertexShader:o.vertexShader,fragmentShader:o.fragmentShader}):n.shader={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader},e.onBeforeCompile(n.shader),o=ye.acquireProgram(e,n.shader,r,i),n.program=o,e.program=o),r=o.getAttributes(),e.morphTargets)for(i=e.numSupportedMorphTargets=0;i<A.maxMorphTargets;i++)0<=r["morphTarget"+i]&&e.numSupportedMorphTargets++;if(e.morphNormals)for(i=e.numSupportedMorphNormals=0;i<A.maxMorphNormals;i++)0<=r["morphNormal"+i]&&e.numSupportedMorphNormals++;r=n.shader.uniforms,(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(n.numClippingPlanes=te.numPlanes,n.numIntersection=te.numIntersection,r.clippingPlanes=te.uniform),n.fog=t,n.lightsHash=ge.state.hash,e.lights&&(r.ambientLightColor.value=ge.state.ambient,r.directionalLights.value=ge.state.directional,r.spotLights.value=ge.state.spot,r.rectAreaLights.value=ge.state.rectArea,r.pointLights.value=ge.state.point,r.hemisphereLights.value=ge.state.hemi,r.directionalShadowMap.value=ge.state.directionalShadowMap,r.directionalShadowMatrix.value=ge.state.directionalShadowMatrix,r.spotShadowMap.value=ge.state.spotShadowMap,r.spotShadowMatrix.value=ge.state.spotShadowMatrix,r.pointShadowMap.value=ge.state.pointShadowMap,r.pointShadowMatrix.value=ge.state.pointShadowMatrix),e=n.program.getUniforms(),e=z.seqWithValue(e.seq,r),n.uniformsList=e}function m(e,t,r,n){G=0;var i=pe.get(r);re&&(ne||e!==k)&&te.setState(r.clippingPlanes,r.clipIntersection,r.clipShadows,e,i,e===k&&r.id===I),!1===r.needsUpdate&&(void 0===i.program?r.needsUpdate=!0:r.fog&&i.fog!==t?r.needsUpdate=!0:r.lights&&i.lightsHash!==ge.state.hash?r.needsUpdate=!0:void 0===i.numClippingPlanes||i.numClippingPlanes===te.numPlanes&&i.numIntersection===te.numIntersection||(r.needsUpdate=!0)),r.needsUpdate&&(d(r,t,n),r.needsUpdate=!1);var o=!1,a=!1,s=!1,c=i.program,u=c.getUniforms(),h=i.shader.uniforms;if(le.useProgram(c.program)&&(s=a=o=!0),r.id!==I&&(I=r.id,a=!0),(o||e!==k)&&(u.setValue(ce,"projectionMatrix",e.projectionMatrix),he.logarithmicDepthBuffer&&u.setValue(ce,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),k!==(F||e)&&(k=F||e,s=a=!0),(r.isShaderMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.envMap)&&void 0!==(o=u.map.cameraPosition)&&o.setValue(ce,oe.setFromMatrixPosition(e.matrixWorld)),(r.isMeshPhongMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial||r.skinning)&&u.setValue(ce,"viewMatrix",e.matrixWorldInverse)),r.skinning&&(u.setOptional(ce,n,"bindMatrix"),u.setOptional(ce,n,"bindMatrixInverse"),e=n.skeleton))if(o=e.bones,he.floatVertexTextures){if(void 0===e.boneTexture){var o=Math.sqrt(4*o.length),o=ci.ceilPowerOfTwo(o),o=Math.max(o,4),p=new Float32Array(o*o*4);p.set(e.boneMatrices);var f=new l(p,o,o,1023,1015);e.boneMatrices=p,e.boneTexture=f,e.boneTextureSize=o}u.setValue(ce,"boneTexture",e.boneTexture),u.setValue(ce,"boneTextureSize",e.boneTextureSize)}else u.setOptional(ce,e,"boneMatrices");return a&&(u.setValue(ce,"toneMappingExposure",A.toneMappingExposure),u.setValue(ce,"toneMappingWhitePoint",A.toneMappingWhitePoint),r.lights&&(a=s,h.ambientLightColor.needsUpdate=a,h.directionalLights.needsUpdate=a,h.pointLights.needsUpdate=a,h.spotLights.needsUpdate=a,h.rectAreaLights.needsUpdate=a,h.hemisphereLights.needsUpdate=a),t&&r.fog&&(h.fogColor.value=t.color,t.isFog?(h.fogNear.value=t.near,h.fogFar.value=t.far):t.isFogExp2&&(h.fogDensity.value=t.density)),r.isMeshBasicMaterial?v(h,r):r.isMeshLambertMaterial?(v(h,r),r.emissiveMap&&(h.emissiveMap.value=r.emissiveMap)):r.isMeshPhongMaterial?(v(h,r),r.isMeshToonMaterial?(g(h,r),r.gradientMap&&(h.gradientMap.value=r.gradientMap)):g(h,r)):r.isMeshStandardMaterial?(v(h,r),r.isMeshPhysicalMaterial&&(h.clearCoat.value=r.clearCoat,h.clearCoatRoughness.value=r.clearCoatRoughness),h.roughness.value=r.roughness,h.metalness.value=r.metalness,r.roughnessMap&&(h.roughnessMap.value=r.roughnessMap),r.metalnessMap&&(h.metalnessMap.value=r.metalnessMap),r.emissiveMap&&(h.emissiveMap.value=r.emissiveMap),r.bumpMap&&(h.bumpMap.value=r.bumpMap,h.bumpScale.value=r.bumpScale),r.normalMap&&(h.normalMap.value=r.normalMap,h.normalScale.value.copy(r.normalScale)),r.displacementMap&&(h.displacementMap.value=r.displacementMap,h.displacementScale.value=r.displacementScale,h.displacementBias.value=r.displacementBias),r.envMap&&(h.envMapIntensity.value=r.envMapIntensity)):r.isMeshDepthMaterial?(v(h,r),r.displacementMap&&(h.displacementMap.value=r.displacementMap,h.displacementScale.value=r.displacementScale,h.displacementBias.value=r.displacementBias)):r.isMeshDistanceMaterial?(v(h,r),r.displacementMap&&(h.displacementMap.value=r.displacementMap,h.displacementScale.value=r.displacementScale,h.displacementBias.value=r.displacementBias),h.referencePosition.value.copy(r.referencePosition),h.nearDistance.value=r.nearDistance,h.farDistance.value=r.farDistance):r.isMeshNormalMaterial?(v(h,r),r.bumpMap&&(h.bumpMap.value=r.bumpMap,h.bumpScale.value=r.bumpScale),r.normalMap&&(h.normalMap.value=r.normalMap,h.normalScale.value.copy(r.normalScale)),r.displacementMap&&(h.displacementMap.value=r.displacementMap,h.displacementScale.value=r.displacementScale,h.displacementBias.value=r.displacementBias)):r.isLineBasicMaterial?(h.diffuse.value=r.color,h.opacity.value=r.opacity,r.isLineDashedMaterial&&(h.dashSize.value=r.dashSize,h.totalSize.value=r.dashSize+r.gapSize,h.scale.value=r.scale)):r.isPointsMaterial?(h.diffuse.value=r.color,h.opacity.value=r.opacity,h.size.value=r.size*X,h.scale.value=.5*W,h.map.value=r.map,null!==r.map&&(!0===r.map.matrixAutoUpdate&&(t=r.map.offset,a=r.map.repeat,s=r.map.center,r.map.matrix.setUvTransform(t.x,t.y,a.x,a.y,r.map.rotation,s.x,s.y)),h.uvTransform.value.copy(r.map.matrix))):r.isShadowMaterial&&(h.color.value=r.color,h.opacity.value=r.opacity),void 0!==h.ltcMat&&(h.ltcMat.value=yi.LTC_MAT_TEXTURE),void 0!==h.ltcMag&&(h.ltcMag.value=yi.LTC_MAG_TEXTURE),z.upload(ce,i.uniformsList,h,A)),u.setValue(ce,"modelViewMatrix",n.modelViewMatrix),u.setValue(ce,"normalMatrix",n.normalMatrix),u.setValue(ce,"modelMatrix",n.matrixWorld),c}function v(e,t){if(e.opacity.value=t.opacity,t.color&&(e.diffuse.value=t.color),t.emissive&&e.emissive.value.copy(t.emissive).multiplyScalar(t.emissiveIntensity),t.map&&(e.map.value=t.map),t.alphaMap&&(e.alphaMap.value=t.alphaMap),t.specularMap&&(e.specularMap.value=t.specularMap),t.envMap&&(e.envMap.value=t.envMap,e.flipEnvMap.value=t.envMap&&t.envMap.isCubeTexture?-1:1,e.reflectivity.value=t.reflectivity,e.refractionRatio.value=t.refractionRatio),t.lightMap&&(e.lightMap.value=t.lightMap,e.lightMapIntensity.value=t.lightMapIntensity),t.aoMap&&(e.aoMap.value=t.aoMap,e.aoMapIntensity.value=t.aoMapIntensity),t.map)var r=t.map;else t.specularMap?r=t.specularMap:t.displacementMap?r=t.displacementMap:t.normalMap?r=t.normalMap:t.bumpMap?r=t.bumpMap:t.roughnessMap?r=t.roughnessMap:t.metalnessMap?r=t.metalnessMap:t.alphaMap?r=t.alphaMap:t.emissiveMap&&(r=t.emissiveMap);if(void 0!==r){if(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate){t=r.offset;var n=r.repeat,i=r.center;r.matrix.setUvTransform(t.x,t.y,n.x,n.y,r.rotation,i.x,i.y)}e.uvTransform.value.copy(r.matrix)}}function g(e,t){e.specular.value=t.specular,e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap),t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale),t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale)),t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}console.log("THREE.WebGLRenderer","88");var y=void 0!==(e=e||{}).canvas?e.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),b=void 0!==e.context?e.context:null,_=void 0!==e.alpha&&e.alpha,x=void 0===e.depth||e.depth,w=void 0===e.stencil||e.stencil,S=void 0!==e.antialias&&e.antialias,M=void 0===e.premultipliedAlpha||e.premultipliedAlpha,E=void 0!==e.preserveDrawingBuffer&&e.preserveDrawingBuffer,C=[],T=[],O=null,P=[],j=[];this.domElement=y,this.context=null,this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1,this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1,this.maxMorphTargets=8,this.maxMorphNormals=4;var A=this,R=!1,L=null,N=null,I=-1,D="",k=null,F=null,B=new c,U=new c,$=null,G=0,H=y.width,W=y.height,X=1,Y=new c(0,0,H,W),K=new c(0,0,H,W),Z=!1,J=new Q,te=new Ke,re=!1,ne=!1,ie=new n,oe=new o,ae={geometries:0,textures:0},se={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:se,memory:ae,programs:null};try{_={alpha:_,depth:x,stencil:w,antialias:S,premultipliedAlpha:M,preserveDrawingBuffer:E};var ce=b||y.getContext("webgl",_)||y.getContext("experimental-webgl",_);if(null===ce){if(null!==y.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context."}void 0===ce.getShaderPrecisionFormat&&(ce.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}}),y.addEventListener("webglcontextlost",r,!1),y.addEventListener("webglcontextrestored",i,!1)}catch(e){console.error("THREE.WebGLRenderer: "+e)}var ue,he,le,pe,fe,de,me,ve,ge,ye,be,_e,xe,we,Se,Me,Ee,Ce;t();var Te=new Ye(A);this.vr=Te;var Oe=new ee(A,ve,he.maxTextureSize);this.shadowMap=Oe,this.getContext=function(){return ce},this.getContextAttributes=function(){return ce.getContextAttributes()},this.forceContextLoss=function(){var e=ue.get("WEBGL_lose_context");e&&e.loseContext()},this.forceContextRestore=function(){var e=ue.get("WEBGL_lose_context");e&&e.restoreContext()},this.getPixelRatio=function(){return X},this.setPixelRatio=function(e){void 0!==e&&(X=e,this.setSize(H,W,!1))},this.getSize=function(){return{width:H,height:W}},this.setSize=function(e,t,r){var n=Te.getDevice();n&&n.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(H=e,W=t,y.width=e*X,y.height=t*X,!1!==r&&(y.style.width=e+"px",y.style.height=t+"px"),this.setViewport(0,0,e,t))},this.getDrawingBufferSize=function(){return{width:H*X,height:W*X}},this.setDrawingBufferSize=function(e,t,r){H=e,W=t,X=r,y.width=e*r,y.height=t*r,this.setViewport(0,0,e,t)},this.setViewport=function(e,t,r,n){Y.set(e,W-t-n,r,n),le.viewport(B.copy(Y).multiplyScalar(X))},this.setScissor=function(e,t,r,n){K.set(e,W-t-n,r,n),le.scissor(U.copy(K).multiplyScalar(X))},this.setScissorTest=function(e){le.setScissorTest(Z=e)},this.getClearColor=function(){return _e.getClearColor()},this.setClearColor=function(){_e.setClearColor.apply(_e,arguments)},this.getClearAlpha=function(){return _e.getClearAlpha()},this.setClearAlpha=function(){_e.setClearAlpha.apply(_e,arguments)},this.clear=function(e,t,r){var n=0;(void 0===e||e)&&(n|=ce.COLOR_BUFFER_BIT),(void 0===t||t)&&(n|=ce.DEPTH_BUFFER_BIT),(void 0===r||r)&&(n|=ce.STENCIL_BUFFER_BIT),ce.clear(n)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.clearTarget=function(e,t,r,n){this.setRenderTarget(e),this.clear(t,r,n)},this.dispose=function(){y.removeEventListener("webglcontextlost",r,!1),y.removeEventListener("webglcontextrestored",i,!1),be.dispose(),Te.dispose()},this.renderBufferImmediate=function(e,t,r){le.initAttributes();var n=pe.get(e);if(e.hasPositions&&!n.position&&(n.position=ce.createBuffer()),e.hasNormals&&!n.normal&&(n.normal=ce.createBuffer()),e.hasUvs&&!n.uv&&(n.uv=ce.createBuffer()),e.hasColors&&!n.color&&(n.color=ce.createBuffer()),t=t.getAttributes(),e.hasPositions&&(ce.bindBuffer(ce.ARRAY_BUFFER,n.position),ce.bufferData(ce.ARRAY_BUFFER,e.positionArray,ce.DYNAMIC_DRAW),le.enableAttribute(t.position),ce.vertexAttribPointer(t.position,3,ce.FLOAT,!1,0,0)),e.hasNormals){if(ce.bindBuffer(ce.ARRAY_BUFFER,n.normal),!r.isMeshPhongMaterial&&!r.isMeshStandardMaterial&&!r.isMeshNormalMaterial&&!0===r.flatShading)for(var i=0,o=3*e.count;i<o;i+=9){var a=e.normalArray,s=(a[i+0]+a[i+3]+a[i+6])/3,c=(a[i+1]+a[i+4]+a[i+7])/3,u=(a[i+2]+a[i+5]+a[i+8])/3;a[i+0]=s,a[i+1]=c,a[i+2]=u,a[i+3]=s,a[i+4]=c,a[i+5]=u,a[i+6]=s,a[i+7]=c,a[i+8]=u}ce.bufferData(ce.ARRAY_BUFFER,e.normalArray,ce.DYNAMIC_DRAW),le.enableAttribute(t.normal),ce.vertexAttribPointer(t.normal,3,ce.FLOAT,!1,0,0)}e.hasUvs&&r.map&&(ce.bindBuffer(ce.ARRAY_BUFFER,n.uv),ce.bufferData(ce.ARRAY_BUFFER,e.uvArray,ce.DYNAMIC_DRAW),le.enableAttribute(t.uv),ce.vertexAttribPointer(t.uv,2,ce.FLOAT,!1,0,0)),e.hasColors&&0!==r.vertexColors&&(ce.bindBuffer(ce.ARRAY_BUFFER,n.color),ce.bufferData(ce.ARRAY_BUFFER,e.colorArray,ce.DYNAMIC_DRAW),le.enableAttribute(t.color),ce.vertexAttribPointer(t.color,3,ce.FLOAT,!1,0,0)),le.disableUnusedAttributes(),ce.drawArrays(ce.TRIANGLES,0,e.count),e.count=0},this.renderBufferDirect=function(e,t,r,n,i,o){le.setMaterial(n);var a=m(e,t,n,i),s=!1;(e=r.id+"_"+a.id+"_"+(!0===n.wireframe))!==D&&(D=e,s=!0),i.morphTargetInfluences&&(xe.update(i,r,n,a),s=!0);var c=r.index,u=r.attributes.position;if(t=1,!0===n.wireframe&&(c=me.getWireframeAttribute(r),t=2),e=we,null!==c){var h=de.get(c);(e=Se).setIndex(h)}if(s){if(s=void 0,r&&r.isInstancedBufferGeometry&&null===ue.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===s&&(s=0),le.initAttributes();var l=r.attributes,a=a.getAttributes(),p=n.defaultAttributeValues;for(S in a){var f=a[S];if(0<=f){if(void 0!==(w=l[S])){var d=w.normalized,v=w.itemSize;if(void 0!==(b=de.get(w))){var g=b.buffer,y=b.type,b=b.bytesPerElement;if(w.isInterleavedBufferAttribute){var _=w.data,x=_.stride,w=w.offset;_&&_.isInstancedInterleavedBuffer?(le.enableAttributeAndDivisor(f,_.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=_.meshPerAttribute*_.count)):le.enableAttribute(f),ce.bindBuffer(ce.ARRAY_BUFFER,g),ce.vertexAttribPointer(f,v,y,d,x*b,(s*x+w)*b)}else w.isInstancedBufferAttribute?(le.enableAttributeAndDivisor(f,w.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=w.meshPerAttribute*w.count)):le.enableAttribute(f),ce.bindBuffer(ce.ARRAY_BUFFER,g),ce.vertexAttribPointer(f,v,y,d,0,s*v*b)}}else if(void 0!==p&&void 0!==(d=p[S]))switch(d.length){case 2:ce.vertexAttrib2fv(f,d);break;case 3:ce.vertexAttrib3fv(f,d);break;case 4:ce.vertexAttrib4fv(f,d);break;default:ce.vertexAttrib1fv(f,d)}}}le.disableUnusedAttributes()}null!==c&&ce.bindBuffer(ce.ELEMENT_ARRAY_BUFFER,h.buffer)}h=0,null!==c?h=c.count:void 0!==u&&(h=u.count),c=r.drawRange.start*t,u=null!==o?o.start*t:0;var S=Math.max(c,u);if(0!==(o=Math.max(0,Math.min(h,c+r.drawRange.count*t,u+(null!==o?o.count*t:1/0))-1-S+1))){if(i.isMesh)if(!0===n.wireframe)le.setLineWidth(n.wireframeLinewidth*(null===L?X:1)),e.setMode(ce.LINES);else switch(i.drawMode){case 0:e.setMode(ce.TRIANGLES);break;case 1:e.setMode(ce.TRIANGLE_STRIP);break;case 2:e.setMode(ce.TRIANGLE_FAN)}else i.isLine?(void 0===(n=n.linewidth)&&(n=1),le.setLineWidth(n*(null===L?X:1)),i.isLineSegments?e.setMode(ce.LINES):i.isLineLoop?e.setMode(ce.LINE_LOOP):e.setMode(ce.LINE_STRIP)):i.isPoints&&e.setMode(ce.POINTS);r&&r.isInstancedBufferGeometry?0<r.maxInstancedCount&&e.renderInstances(r,S,o):e.render(S,o)}},this.compile=function(e,t){C.length=0,T.length=0,e.traverse(function(e){e.isLight&&(C.push(e),e.castShadow&&T.push(e))}),ge.setup(C,T,t),e.traverse(function(t){if(t.material)if(Array.isArray(t.material))for(var r=0;r<t.material.length;r++)d(t.material[r],e.fog,t);else d(t.material,e.fog,t)})};var Pe=!1,je=null;this.animate=function(e){je=e,Pe||((e=Te.getDevice())&&e.isPresenting?e.requestAnimationFrame(u):window.requestAnimationFrame(u),Pe=!0)},this.render=function(e,t,r,n){if(t&&t.isCamera){if(!R){D="",I=-1,k=null,!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),Te.enabled&&(t=Te.getCamera(t)),ie.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),J.setFromMatrix(ie),C.length=0,T.length=0,P.length=0,j.length=0,ne=this.localClippingEnabled,re=te.init(this.clippingPlanes,ne,t),(O=be.get(e,t)).init(),h(e,t,A.sortObjects),!0===A.sortObjects&&O.sort(),re&&te.beginShadows(),Oe.render(T,e,t),ge.setup(C,T,t),re&&te.endShadows(),se.frame++,se.calls=0,se.vertices=0,se.faces=0,se.points=0,void 0===r&&(r=null),this.setRenderTarget(r),_e.render(O,e,t,n),n=O.opaque;var i=O.transparent;if(e.overrideMaterial){var o=e.overrideMaterial;n.length&&p(n,e,t,o),i.length&&p(i,e,t,o)}else n.length&&p(n,e,t),i.length&&p(i,e,t);Ee.render(P,e,t),Me.render(j,e,t,B),r&&fe.updateRenderTargetMipmap(r),le.buffers.depth.setTest(!0),le.buffers.depth.setMask(!0),le.buffers.color.setMask(!0),le.setPolygonOffset(!1),Te.enabled&&Te.submitFrame()}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFaceCulling=function(e,t){le.setCullFace(e),le.setFlipSided(0===t)},this.allocTextureUnit=function(){var e=G;return e>=he.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+e+" texture units while this GPU supports only "+he.maxTextures),G+=1,e},this.setTexture2D=function(){var e=!1;return function(t,r){t&&t.isWebGLRenderTarget&&(e||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),e=!0),t=t.texture),fe.setTexture2D(t,r)}}(),this.setTexture=function(){var e=!1;return function(t,r){e||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),e=!0),fe.setTexture2D(t,r)}}(),this.setTextureCube=function(){var e=!1;return function(t,r){t&&t.isWebGLRenderTargetCube&&(e||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),e=!0),t=t.texture),t&&t.isCubeTexture||Array.isArray(t.image)&&6===t.image.length?fe.setTextureCube(t,r):fe.setTextureCubeDynamic(t,r)}}(),this.getRenderTarget=function(){return L},this.setRenderTarget=function(e){(L=e)&&void 0===pe.get(e).__webglFramebuffer&&fe.setupRenderTarget(e);var t=null,r=!1;e?(t=pe.get(e).__webglFramebuffer,e.isWebGLRenderTargetCube&&(t=t[e.activeCubeFace],r=!0),B.copy(e.viewport),U.copy(e.scissor),$=e.scissorTest):(B.copy(Y).multiplyScalar(X),U.copy(K).multiplyScalar(X),$=Z),N!==t&&(ce.bindFramebuffer(ce.FRAMEBUFFER,t),N=t),le.viewport(B),le.scissor(U),le.setScissorTest($),r&&(r=pe.get(e.texture),ce.framebufferTexture2D(ce.FRAMEBUFFER,ce.COLOR_ATTACHMENT0,ce.TEXTURE_CUBE_MAP_POSITIVE_X+e.activeCubeFace,r.__webglTexture,e.activeMipMapLevel))},this.readRenderTargetPixels=function(e,t,r,n,i,o){if(e&&e.isWebGLRenderTarget){var a=pe.get(e).__webglFramebuffer;if(a){var s=!1;a!==N&&(ce.bindFramebuffer(ce.FRAMEBUFFER,a),s=!0);try{var c=e.texture,u=c.format,h=c.type;1023!==u&&Ce.convert(u)!==ce.getParameter(ce.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===h||Ce.convert(h)===ce.getParameter(ce.IMPLEMENTATION_COLOR_READ_TYPE)||1015===h&&(ue.get("OES_texture_float")||ue.get("WEBGL_color_buffer_float"))||1016===h&&ue.get("EXT_color_buffer_half_float")?ce.checkFramebufferStatus(ce.FRAMEBUFFER)===ce.FRAMEBUFFER_COMPLETE?0<=t&&t<=e.width-n&&0<=r&&r<=e.height-i&&ce.readPixels(t,r,n,i,Ce.convert(u),Ce.convert(h),o):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{s&&ce.bindFramebuffer(ce.FRAMEBUFFER,N)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}}function Qe(e,t){this.name="",this.color=new $(e),this.density=void 0!==t?t:25e-5}function et(e,t,r){this.name="",this.color=new $(e),this.near=void 0!==t?t:1,this.far=void 0!==r?r:1e3}function tt(){ne.call(this),this.type="Scene",this.overrideMaterial=this.fog=this.background=null,this.autoUpdate=!0}function rt(e,t,r,n,i){ne.call(this),this.lensFlares=[],this.positionScreen=new o,this.customUpdateCallback=void 0,void 0!==e&&this.add(e,t,r,n,i)}function nt(e){W.call(this),this.type="SpriteMaterial",this.color=new $(16777215),this.map=null,this.rotation=0,this.lights=this.fog=!1,this.setValues(e)}function it(e){ne.call(this),this.type="Sprite",this.material=void 0!==e?e:new nt}function ot(){ne.call(this),this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function at(e,t){if(e=e||[],this.bones=e.slice(0),this.boneMatrices=new Float32Array(16*this.bones.length),void 0===t)this.calculateInverses();else if(this.bones.length===t.length)this.boneInverses=t.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],e=0,t=this.bones.length;e<t;e++)this.boneInverses.push(new n)}function st(){ne.call(this),this.type="Bone"}function ct(e,t){je.call(this,e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new n,this.bindMatrixInverse=new n,e=new at(e=this.initBones()),this.bind(e,this.matrixWorld),this.normalizeSkinWeights()}function ut(e){W.call(this),this.type="LineBasicMaterial",this.color=new $(16777215),this.linewidth=1,this.linejoin=this.linecap="round",this.lights=!1,this.setValues(e)}function ht(e,t,r){if(1===r)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new lt(e,t);ne.call(this),this.type="Line",this.geometry=void 0!==e?e:new _e,this.material=void 0!==t?t:new ut({color:16777215*Math.random()})}function lt(e,t){ht.call(this,e,t),this.type="LineSegments"}function pt(e,t){ht.call(this,e,t),this.type="LineLoop"}function ft(e){W.call(this),this.type="PointsMaterial",this.color=new $(16777215),this.map=null,this.size=1,this.sizeAttenuation=!0,this.lights=!1,this.setValues(e)}function dt(e,t){ne.call(this),this.type="Points",this.geometry=void 0!==e?e:new _e,this.material=void 0!==t?t:new ft({color:16777215*Math.random()})}function mt(){ne.call(this),this.type="Group"}function vt(e,t,r,n,i,o,a,c,u){function h(){var e=l.image;e.readyState>=e.HAVE_CURRENT_DATA&&(l.needsUpdate=!0),requestAnimationFrame(h)}s.call(this,e,t,r,n,i,o,a,c,u),this.generateMipmaps=!1;var l=this;requestAnimationFrame(h)}function gt(e,t,r,n,i,o,a,c,u,h,l,p){s.call(this,null,o,a,c,u,h,n,i,l,p),this.image={width:t,height:r},this.mipmaps=e,this.generateMipmaps=this.flipY=!1}function yt(e,t,r,n,i,o,a,c,u,h){if(1026!==(h=void 0!==h?h:1026)&&1027!==h)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===r&&1026===h&&(r=1012),void 0===r&&1027===h&&(r=1020),s.call(this,null,n,i,o,a,c,h,r,u),this.image={width:e,height:t},this.magFilter=void 0!==a?a:1003,this.minFilter=void 0!==c?c:1003,this.generateMipmaps=this.flipY=!1}function bt(e){_e.call(this),this.type="WireframeGeometry";var t,r,n,i=[],a=[0,0],s={},c=["a","b","c"];if(e&&e.isGeometry){var u=e.faces,h=0;for(r=u.length;h<r;h++){var l=u[h];for(t=0;3>t;t++){var p=l[c[t]],f=l[c[(t+1)%3]];a[0]=Math.min(p,f),a[1]=Math.max(p,f),void 0===s[p=a[0]+","+a[1]]&&(s[p]={index1:a[0],index2:a[1]})}}for(p in s)h=s[p],c=e.vertices[h.index1],i.push(c.x,c.y,c.z),c=e.vertices[h.index2],i.push(c.x,c.y,c.z)}else if(e&&e.isBufferGeometry){c=new o;if(null!==e.index){u=e.attributes.position,l=e.index;var d=e.groups;for(0===d.length&&(d=[{start:0,count:l.count,materialIndex:0}]),e=0,n=d.length;e<n;++e)for(h=d[e],t=h.start,r=h.count,h=t,r=t+r;h<r;h+=3)for(t=0;3>t;t++)p=l.getX(h+t),f=l.getX(h+(t+1)%3),a[0]=Math.min(p,f),a[1]=Math.max(p,f),p=a[0]+","+a[1],void 0===s[p]&&(s[p]={index1:a[0],index2:a[1]});for(p in s)h=s[p],c.fromBufferAttribute(u,h.index1),i.push(c.x,c.y,c.z),c.fromBufferAttribute(u,h.index2),i.push(c.x,c.y,c.z)}else for(u=e.attributes.position,h=0,r=u.count/3;h<r;h++)for(t=0;3>t;t++)s=3*h+t,c.fromBufferAttribute(u,s),i.push(c.x,c.y,c.z),s=3*h+(t+1)%3,c.fromBufferAttribute(u,s),i.push(c.x,c.y,c.z)}this.addAttribute("position",new ve(i,3))}function _t(e,t,r){se.call(this),this.type="ParametricGeometry",this.parameters={func:e,slices:t,stacks:r},this.fromBufferGeometry(new xt(e,t,r)),this.mergeVertices()}function xt(e,t,r){_e.call(this),this.type="ParametricBufferGeometry",this.parameters={func:e,slices:t,stacks:r};var n,i,a=[],s=[],c=[],u=[],h=new o,l=new o,p=new o,f=new o,d=new o,m=t+1;for(n=0;n<=r;n++){var v=n/r;for(i=0;i<=t;i++){var g=i/t,l=e(g,v,l);s.push(l.x,l.y,l.z),0<=g-1e-5?(p=e(g-1e-5,v,p),f.subVectors(l,p)):(p=e(g+1e-5,v,p),f.subVectors(p,l)),0<=v-1e-5?(p=e(g,v-1e-5,p),d.subVectors(l,p)):(p=e(g,v+1e-5,p),d.subVectors(p,l)),h.crossVectors(f,d).normalize(),c.push(h.x,h.y,h.z),u.push(g,v)}}for(n=0;n<r;n++)for(i=0;i<t;i++)e=n*m+i+1,h=(n+1)*m+i+1,l=(n+1)*m+i,a.push(n*m+i,e,l),a.push(e,h,l);this.setIndex(a),this.addAttribute("position",new ve(s,3)),this.addAttribute("normal",new ve(c,3)),this.addAttribute("uv",new ve(u,2))}function wt(e,t,r,n){se.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:e,indices:t,radius:r,detail:n},this.fromBufferGeometry(new St(e,t,r,n)),this.mergeVertices()}function St(e,t,n,i){function a(e){u.push(e.x,e.y,e.z)}function s(t,r){t*=3,r.x=e[t+0],r.y=e[t+1],r.z=e[t+2]}function c(e,t,r,n){0>n&&1===e.x&&(h[t]=e.x-1),0===r.x&&0===r.z&&(h[t]=n/2/Math.PI+.5)}_e.call(this),this.type="PolyhedronBufferGeometry",this.parameters={vertices:e,indices:t,radius:n,detail:i},n=n||1;var u=[],h=[];!function(e){for(var r=new o,n=new o,i=new o,c=0;c<t.length;c+=3){s(t[c+0],r),s(t[c+1],n),s(t[c+2],i);var u,h,l=r,p=n,f=i,d=Math.pow(2,e),m=[];for(h=0;h<=d;h++){m[h]=[];var v=l.clone().lerp(f,h/d),g=p.clone().lerp(f,h/d),y=d-h;for(u=0;u<=y;u++)m[h][u]=0===u&&h===d?v:v.clone().lerp(g,u/y)}for(h=0;h<d;h++)for(u=0;u<2*(d-h)-1;u++)l=Math.floor(u/2),0==u%2?(a(m[h][l+1]),a(m[h+1][l]),a(m[h][l])):(a(m[h][l+1]),a(m[h+1][l+1]),a(m[h+1][l]))}}(i=i||0),function(e){for(var t=new o,r=0;r<u.length;r+=3)t.x=u[r+0],t.y=u[r+1],t.z=u[r+2],t.normalize().multiplyScalar(e),u[r+0]=t.x,u[r+1]=t.y,u[r+2]=t.z}(n),function(){for(var e=new o,t=0;t<u.length;t+=3)e.x=u[t+0],e.y=u[t+1],e.z=u[t+2],h.push(Math.atan2(e.z,-e.x)/2/Math.PI+.5,1-(Math.atan2(-e.y,Math.sqrt(e.x*e.x+e.z*e.z))/Math.PI+.5));for(var e=new o,t=new o,n=new o,i=new o,a=new r,s=new r,l=new r,p=0,f=0;p<u.length;p+=9,f+=6){e.set(u[p+0],u[p+1],u[p+2]),t.set(u[p+3],u[p+4],u[p+5]),n.set(u[p+6],u[p+7],u[p+8]),a.set(h[f+0],h[f+1]),s.set(h[f+2],h[f+3]),l.set(h[f+4],h[f+5]),i.copy(e).add(t).add(n).divideScalar(3);var d=Math.atan2(i.z,-i.x);c(a,f+0,e,d),c(s,f+2,t,d),c(l,f+4,n,d)}for(e=0;e<h.length;e+=6)t=h[e+0],n=h[e+2],i=h[e+4],a=Math.min(t,n,i),.9<Math.max(t,n,i)&&.1>a&&(.2>t&&(h[e+0]+=1),.2>n&&(h[e+2]+=1),.2>i&&(h[e+4]+=1))}(),this.addAttribute("position",new ve(u,3)),this.addAttribute("normal",new ve(u.slice(),3)),this.addAttribute("uv",new ve(h,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}function Mt(e,t){se.call(this),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Et(e,t)),this.mergeVertices()}function Et(e,t){St.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Ct(e,t){se.call(this),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Tt(e,t)),this.mergeVertices()}function Tt(e,t){St.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Ot(e,t){se.call(this),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new Pt(e,t)),this.mergeVertices()}function Pt(e,t){var r=(1+Math.sqrt(5))/2;St.call(this,[-1,r,0,1,r,0,-1,-r,0,1,-r,0,0,-1,r,0,1,r,0,-1,-r,0,1,-r,r,0,-1,r,0,1,-r,0,-1,-r,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronBufferGeometry",this.parameters={radius:e,detail:t}}function jt(e,t){se.call(this),this.type="DodecahedronGeometry",this.parameters={radius:e,detail:t},this.fromBufferGeometry(new At(e,t)),this.mergeVertices()}function At(e,t){var r=(1+Math.sqrt(5))/2,n=1/r;St.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-r,0,-n,r,0,n,-r,0,n,r,-n,-r,0,-n,r,0,n,-r,0,n,r,0,-r,0,-n,r,0,-n,-r,0,n,r,0,n],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,t),this.type="DodecahedronBufferGeometry",this.parameters={radius:e,detail:t}}function Rt(e,t,r,n,i,o){se.call(this),this.type="TubeGeometry",this.parameters={path:e,tubularSegments:t,radius:r,radialSegments:n,closed:i},void 0!==o&&console.warn("THREE.TubeGeometry: taper has been removed."),e=new Lt(e,t,r,n,i),this.tangents=e.tangents,this.normals=e.normals,this.binormals=e.binormals,this.fromBufferGeometry(e),this.mergeVertices()}function Lt(e,t,n,i,a){function s(r){d=e.getPointAt(r/t,d);var o=c.normals[r];for(r=c.binormals[r],h=0;h<=i;h++){var a=h/i*Math.PI*2,s=Math.sin(a),a=-Math.cos(a);p.x=a*o.x+s*r.x,p.y=a*o.y+s*r.y,p.z=a*o.z+s*r.z,p.normalize(),v.push(p.x,p.y,p.z),l.x=d.x+n*p.x,l.y=d.y+n*p.y,l.z=d.z+n*p.z,m.push(l.x,l.y,l.z)}}_e.call(this),this.type="TubeBufferGeometry",this.parameters={path:e,tubularSegments:t,radius:n,radialSegments:i,closed:a},t=t||64,n=n||1,i=i||8,a=a||!1;var c=e.computeFrenetFrames(t,a);this.tangents=c.tangents,this.normals=c.normals,this.binormals=c.binormals;var u,h,l=new o,p=new o,f=new r,d=new o,m=[],v=[],g=[],y=[];for(u=0;u<t;u++)s(u);for(s(!1===a?t:0),u=0;u<=t;u++)for(h=0;h<=i;h++)f.x=u/t,f.y=h/i,g.push(f.x,f.y);!function(){for(h=1;h<=t;h++)for(u=1;u<=i;u++){var e=(i+1)*h+(u-1),r=(i+1)*h+u,n=(i+1)*(h-1)+u;y.push((i+1)*(h-1)+(u-1),e,n),y.push(e,r,n)}}(),this.setIndex(y),this.addAttribute("position",new ve(m,3)),this.addAttribute("normal",new ve(v,3)),this.addAttribute("uv",new ve(g,2))}function Nt(e,t,r,n,i,o,a){se.call(this),this.type="TorusKnotGeometry",this.parameters={radius:e,tube:t,tubularSegments:r,radialSegments:n,p:i,q:o},void 0!==a&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."),this.fromBufferGeometry(new It(e,t,r,n,i,o)),this.mergeVertices()}function It(e,t,r,n,i,a){function s(e,t,r,n,i){var o=Math.sin(e);t=r/t*e,r=Math.cos(t),i.x=n*(2+r)*.5*Math.cos(e),i.y=n*(2+r)*o*.5,i.z=n*Math.sin(t)*.5}_e.call(this),this.type="TorusKnotBufferGeometry",this.parameters={radius:e,tube:t,tubularSegments:r,radialSegments:n,p:i,q:a},e=e||1,t=t||.4,r=Math.floor(r)||64,n=Math.floor(n)||8,i=i||2,a=a||3;var c,u=[],h=[],l=[],p=[],f=new o,d=new o,m=new o,v=new o,g=new o,y=new o,b=new o;for(c=0;c<=r;++c){var _=c/r*i*Math.PI*2;for(s(_,i,a,e,m),s(_+.01,i,a,e,v),y.subVectors(v,m),b.addVectors(v,m),g.crossVectors(y,b),b.crossVectors(g,y),g.normalize(),b.normalize(),_=0;_<=n;++_){var x=_/n*Math.PI*2,w=-t*Math.cos(x),x=t*Math.sin(x);f.x=m.x+(w*b.x+x*g.x),f.y=m.y+(w*b.y+x*g.y),f.z=m.z+(w*b.z+x*g.z),h.push(f.x,f.y,f.z),d.subVectors(f,m).normalize(),l.push(d.x,d.y,d.z),p.push(c/r),p.push(_/n)}}for(_=1;_<=r;_++)for(c=1;c<=n;c++)e=(n+1)*_+(c-1),t=(n+1)*_+c,i=(n+1)*(_-1)+c,u.push((n+1)*(_-1)+(c-1),e,i),u.push(e,t,i);this.setIndex(u),this.addAttribute("position",new ve(h,3)),this.addAttribute("normal",new ve(l,3)),this.addAttribute("uv",new ve(p,2))}function Dt(e,t,r,n,i){se.call(this),this.type="TorusGeometry",this.parameters={radius:e,tube:t,radialSegments:r,tubularSegments:n,arc:i},this.fromBufferGeometry(new kt(e,t,r,n,i)),this.mergeVertices()}function kt(e,t,r,n,i){_e.call(this),this.type="TorusBufferGeometry",this.parameters={radius:e,tube:t,radialSegments:r,tubularSegments:n,arc:i},e=e||1,t=t||.4,r=Math.floor(r)||8,n=Math.floor(n)||6,i=i||2*Math.PI;var a,s,c=[],u=[],h=[],l=[],p=new o,f=new o,d=new o;for(a=0;a<=r;a++)for(s=0;s<=n;s++){var m=s/n*i,v=a/r*Math.PI*2;f.x=(e+t*Math.cos(v))*Math.cos(m),f.y=(e+t*Math.cos(v))*Math.sin(m),f.z=t*Math.sin(v),u.push(f.x,f.y,f.z),p.x=e*Math.cos(m),p.y=e*Math.sin(m),d.subVectors(f,p).normalize(),h.push(d.x,d.y,d.z),l.push(s/n),l.push(a/r)}for(a=1;a<=r;a++)for(s=1;s<=n;s++)e=(n+1)*(a-1)+s-1,t=(n+1)*(a-1)+s,i=(n+1)*a+s,c.push((n+1)*a+s-1,e,i),c.push(e,t,i);this.setIndex(c),this.addAttribute("position",new ve(u,3)),this.addAttribute("normal",new ve(h,3)),this.addAttribute("uv",new ve(l,2))}function Ft(e,t){se.call(this),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},this.fromBufferGeometry(new Bt(e,t)),this.mergeVertices()}function Bt(e,t){void 0!==e&&(_e.call(this),this.type="ExtrudeBufferGeometry",e=Array.isArray(e)?e:[e],this.addShapeList(e,t),this.computeVertexNormals())}function Ut(e,t){se.call(this),this.type="TextGeometry",this.parameters={text:e,parameters:t},this.fromBufferGeometry(new zt(e,t)),this.mergeVertices()}function zt(e,t){var r=(t=t||{}).font;if(!r||!r.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new se;e=r.generateShapes(e,t.size,t.curveSegments),t.amount=void 0!==t.height?t.height:50,void 0===t.bevelThickness&&(t.bevelThickness=10),void 0===t.bevelSize&&(t.bevelSize=8),void 0===t.bevelEnabled&&(t.bevelEnabled=!1),Bt.call(this,e,t),this.type="TextBufferGeometry"}function $t(e,t,r,n,i,o,a){se.call(this),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:r,phiStart:n,phiLength:i,thetaStart:o,thetaLength:a},this.fromBufferGeometry(new Gt(e,t,r,n,i,o,a)),this.mergeVertices()}function Gt(e,t,r,n,i,a,s){_e.call(this),this.type="SphereBufferGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:r,phiStart:n,phiLength:i,thetaStart:a,thetaLength:s},e=e||1,t=Math.max(3,Math.floor(t)||8),r=Math.max(2,Math.floor(r)||6),n=void 0!==n?n:0,i=void 0!==i?i:2*Math.PI;var c,u,h=(a=void 0!==a?a:0)+(s=void 0!==s?s:Math.PI),l=0,p=[],f=new o,d=new o,m=[],v=[],g=[],y=[];for(u=0;u<=r;u++){var b=[],_=u/r;for(c=0;c<=t;c++){var x=c/t;f.x=-e*Math.cos(n+x*i)*Math.sin(a+_*s),f.y=e*Math.cos(a+_*s),f.z=e*Math.sin(n+x*i)*Math.sin(a+_*s),v.push(f.x,f.y,f.z),d.set(f.x,f.y,f.z).normalize(),g.push(d.x,d.y,d.z),y.push(x,1-_),b.push(l++)}p.push(b)}for(u=0;u<r;u++)for(c=0;c<t;c++)e=p[u][c+1],n=p[u][c],i=p[u+1][c],s=p[u+1][c+1],(0!==u||0<a)&&m.push(e,n,s),(u!==r-1||h<Math.PI)&&m.push(n,i,s);this.setIndex(m),this.addAttribute("position",new ve(v,3)),this.addAttribute("normal",new ve(g,3)),this.addAttribute("uv",new ve(y,2))}function Vt(e,t,r,n,i,o){se.call(this),this.type="RingGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:r,phiSegments:n,thetaStart:i,thetaLength:o},this.fromBufferGeometry(new Ht(e,t,r,n,i,o)),this.mergeVertices()}function Ht(e,t,n,i,a,s){_e.call(this),this.type="RingBufferGeometry",this.parameters={innerRadius:e,outerRadius:t,thetaSegments:n,phiSegments:i,thetaStart:a,thetaLength:s},e=e||.5,t=t||1,a=void 0!==a?a:0,s=void 0!==s?s:2*Math.PI,n=void 0!==n?Math.max(3,n):8;var c,u,h=[],l=[],p=[],f=[],d=e,m=(t-e)/(i=void 0!==i?Math.max(1,i):1),v=new o,g=new r;for(c=0;c<=i;c++){for(u=0;u<=n;u++)e=a+u/n*s,v.x=d*Math.cos(e),v.y=d*Math.sin(e),l.push(v.x,v.y,v.z),p.push(0,0,1),g.x=(v.x/t+1)/2,g.y=(v.y/t+1)/2,f.push(g.x,g.y);d+=m}for(c=0;c<i;c++)for(t=c*(n+1),u=0;u<n;u++)e=u+t,a=e+n+1,s=e+n+2,d=e+1,h.push(e,a,d),h.push(a,s,d);this.setIndex(h),this.addAttribute("position",new ve(l,3)),this.addAttribute("normal",new ve(p,3)),this.addAttribute("uv",new ve(f,2))}function qt(e,t,r,n){se.call(this),this.type="LatheGeometry",this.parameters={points:e,segments:t,phiStart:r,phiLength:n},this.fromBufferGeometry(new Wt(e,t,r,n)),this.mergeVertices()}function Wt(e,t,n,i){_e.call(this),this.type="LatheBufferGeometry",this.parameters={points:e,segments:t,phiStart:n,phiLength:i},t=Math.floor(t)||12,n=n||0,i=i||2*Math.PI,i=ci.clamp(i,0,2*Math.PI);var a,s=[],c=[],u=[],h=1/t,l=new o,p=new r;for(a=0;a<=t;a++){var f=n+a*h*i,d=Math.sin(f),m=Math.cos(f);for(f=0;f<=e.length-1;f++)l.x=e[f].x*d,l.y=e[f].y,l.z=e[f].x*m,c.push(l.x,l.y,l.z),p.x=a/t,p.y=f/(e.length-1),u.push(p.x,p.y)}for(a=0;a<t;a++)for(f=0;f<e.length-1;f++)n=f+a*e.length,h=n+e.length,l=n+e.length+1,p=n+1,s.push(n,h,p),s.push(h,l,p);if(this.setIndex(s),this.addAttribute("position",new ve(c,3)),this.addAttribute("uv",new ve(u,2)),this.computeVertexNormals(),i===2*Math.PI)for(i=this.attributes.normal.array,s=new o,c=new o,u=new o,n=t*e.length*3,f=a=0;a<e.length;a++,f+=3)s.x=i[f+0],s.y=i[f+1],s.z=i[f+2],c.x=i[n+f+0],c.y=i[n+f+1],c.z=i[n+f+2],u.addVectors(s,c).normalize(),i[f+0]=i[n+f+0]=u.x,i[f+1]=i[n+f+1]=u.y,i[f+2]=i[n+f+2]=u.z}function Xt(e,t){se.call(this),this.type="ShapeGeometry","object"==typeof t&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),t=t.curveSegments),this.parameters={shapes:e,curveSegments:t},this.fromBufferGeometry(new Yt(e,t)),this.mergeVertices()}function Yt(e,t){function r(e){var r,s=i.length/3,u=(e=e.extractPoints(t)).shape,h=e.holes;if(!1===Ti.isClockWise(u))for(u=u.reverse(),e=0,r=h.length;e<r;e++){var l=h[e];!0===Ti.isClockWise(l)&&(h[e]=l.reverse())}var p=Ti.triangulateShape(u,h);for(e=0,r=h.length;e<r;e++)l=h[e],u=u.concat(l);for(e=0,r=u.length;e<r;e++)l=u[e],i.push(l.x,l.y,0),o.push(0,0,1),a.push(l.x,l.y);for(e=0,r=p.length;e<r;e++)u=p[e],n.push(u[0]+s,u[1]+s,u[2]+s),c+=3}_e.call(this),this.type="ShapeBufferGeometry",this.parameters={shapes:e,curveSegments:t},t=t||12;var n=[],i=[],o=[],a=[],s=0,c=0;if(!1===Array.isArray(e))r(e);else for(var u=0;u<e.length;u++)r(e[u]),this.addGroup(s,c,u),s+=c,c=0;this.setIndex(n),this.addAttribute("position",new ve(i,3)),this.addAttribute("normal",new ve(o,3)),this.addAttribute("uv",new ve(a,2))}function Kt(e,t){_e.call(this),this.type="EdgesGeometry",this.parameters={thresholdAngle:t};var r=[];t=Math.cos(ci.DEG2RAD*(void 0!==t?t:1));var n=[0,0],i={},o=["a","b","c"];if(e.isBufferGeometry){var a=new se;a.fromBufferGeometry(e)}else a=e.clone();a.mergeVertices(),a.computeFaceNormals(),e=a.vertices;for(var s=0,c=(a=a.faces).length;s<c;s++)for(var u=a[s],h=0;3>h;h++){var l=u[o[h]],p=u[o[(h+1)%3]];n[0]=Math.min(l,p),n[1]=Math.max(l,p),void 0===i[l=n[0]+","+n[1]]?i[l]={index1:n[0],index2:n[1],face1:s,face2:void 0}:i[l].face2=s}for(l in i)(void 0===(n=i[l]).face2||a[n.face1].normal.dot(a[n.face2].normal)<=t)&&(o=e[n.index1],r.push(o.x,o.y,o.z),o=e[n.index2],r.push(o.x,o.y,o.z));this.addAttribute("position",new ve(r,3))}function Zt(e,t,r,n,i,o,a,s){se.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:r,radialSegments:n,heightSegments:i,openEnded:o,thetaStart:a,thetaLength:s},this.fromBufferGeometry(new Jt(e,t,r,n,i,o,a,s)),this.mergeVertices()}function Jt(e,t,n,i,a,s,c,u){function h(n){var a,s=new r,h=new o,g=0,_=!0===n?e:t,x=!0===n?1:-1,w=v;for(a=1;a<=i;a++)f.push(0,y*x,0),d.push(0,x,0),m.push(.5,.5),v++;var S=v;for(a=0;a<=i;a++){var M=a/i*u+c,E=Math.cos(M),M=Math.sin(M);h.x=_*M,h.y=y*x,h.z=_*E,f.push(h.x,h.y,h.z),d.push(0,x,0),s.x=.5*E+.5,s.y=.5*M*x+.5,m.push(s.x,s.y),v++}for(a=0;a<i;a++)s=w+a,h=S+a,!0===n?p.push(h,h+1,s):p.push(h+1,h,s),g+=3;l.addGroup(b,g,!0===n?1:2),b+=g}_e.call(this),this.type="CylinderBufferGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:n,radialSegments:i,heightSegments:a,openEnded:s,thetaStart:c,thetaLength:u};var l=this;e=void 0!==e?e:1,t=void 0!==t?t:1,n=n||1,i=Math.floor(i)||8,a=Math.floor(a)||1,s=void 0!==s&&s,c=void 0!==c?c:0,u=void 0!==u?u:2*Math.PI;var p=[],f=[],d=[],m=[],v=0,g=[],y=n/2,b=0;!function(){var r,s,h=new o,_=new o,x=0,w=(t-e)/n;for(s=0;s<=a;s++){var S=[],M=s/a,E=M*(t-e)+e;for(r=0;r<=i;r++){var C=r/i,T=C*u+c,O=Math.sin(T),T=Math.cos(T);_.x=E*O,_.y=-M*n+y,_.z=E*T,f.push(_.x,_.y,_.z),h.set(O,w,T).normalize(),d.push(h.x,h.y,h.z),m.push(C,1-M),S.push(v++)}g.push(S)}for(r=0;r<i;r++)for(s=0;s<a;s++)h=g[s+1][r],_=g[s+1][r+1],w=g[s][r+1],p.push(g[s][r],h,w),p.push(h,_,w),x+=6;l.addGroup(b,x,0),b+=x}(),!1===s&&(0<e&&h(!0),0<t&&h(!1)),this.setIndex(p),this.addAttribute("position",new ve(f,3)),this.addAttribute("normal",new ve(d,3)),this.addAttribute("uv",new ve(m,2))}function Qt(e,t,r,n,i,o,a){Zt.call(this,0,e,t,r,n,i,o,a),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:o,thetaLength:a}}function er(e,t,r,n,i,o,a){Jt.call(this,0,e,t,r,n,i,o,a),this.type="ConeBufferGeometry",this.parameters={radius:e,height:t,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:o,thetaLength:a}}function tr(e,t,r,n){se.call(this),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:r,thetaLength:n},this.fromBufferGeometry(new rr(e,t,r,n)),this.mergeVertices()}function rr(e,t,n,i){_e.call(this),this.type="CircleBufferGeometry",this.parameters={radius:e,segments:t,thetaStart:n,thetaLength:i},e=e||1,t=void 0!==t?Math.max(3,t):8,n=void 0!==n?n:0,i=void 0!==i?i:2*Math.PI;var a,s=[],c=[],u=[],h=[],l=new o,p=new r;c.push(0,0,0),u.push(0,0,1),h.push(.5,.5);var f=0;for(a=3;f<=t;f++,a+=3){var d=n+f/t*i;l.x=e*Math.cos(d),l.y=e*Math.sin(d),c.push(l.x,l.y,l.z),u.push(0,0,1),p.x=(c[a]/e+1)/2,p.y=(c[a+1]/e+1)/2,h.push(p.x,p.y)}for(a=1;a<=t;a++)s.push(a,a+1,0);this.setIndex(s),this.addAttribute("position",new ve(c,3)),this.addAttribute("normal",new ve(u,3)),this.addAttribute("uv",new ve(h,2))}function nr(e){W.call(this),this.type="ShadowMaterial",this.color=new $(0),this.opacity=1,this.transparent=this.lights=!0,this.setValues(e)}function ir(e){Ce.call(this,e),this.type="RawShaderMaterial"}function or(e){W.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new $(16777215),this.metalness=this.roughness=.5,this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $(0),this.emissiveIntensity=1,this.bumpMap=this.emissiveMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function ar(e){or.call(this),this.defines={PHYSICAL:""},this.type="MeshPhysicalMaterial",this.reflectivity=.5,this.clearCoatRoughness=this.clearCoat=0,this.setValues(e)}function sr(e){W.call(this),this.type="MeshPhongMaterial",this.color=new $(16777215),this.specular=new $(1118481),this.shininess=30,this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $(0),this.emissiveIntensity=1,this.bumpMap=this.emissiveMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.envMap=this.alphaMap=this.specularMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function cr(e){sr.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.gradientMap=null,this.setValues(e)}function ur(e){W.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalScale=new r(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1,this.setValues(e)}function hr(e){W.call(this),this.type="MeshLambertMaterial",this.color=new $(16777215),this.lightMap=this.map=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $(0),this.emissiveIntensity=1,this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinejoin=this.wireframeLinecap="round",this.morphNormals=this.morphTargets=this.skinning=!1,this.setValues(e)}function lr(e){ut.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}function pr(e,t,r){var n=this,i=!1,o=0,a=0,s=void 0;this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=r,this.itemStart=function(e){a++,!1===i&&void 0!==n.onStart&&n.onStart(e,o,a),i=!0},this.itemEnd=function(e){o++,void 0!==n.onProgress&&n.onProgress(e,o,a),o===a&&(i=!1,void 0!==n.onLoad)&&n.onLoad()},this.itemError=function(e){void 0!==n.onError&&n.onError(e)},this.resolveURL=function(e){return s?s(e):e},this.setURLModifier=function(e){s=e}}function fr(e){this.manager=void 0!==e?e:Ai}function dr(e){this.manager=void 0!==e?e:Ai,this._parser=null}function mr(e){this.manager=void 0!==e?e:Ai,this._parser=null}function vr(e){this.manager=void 0!==e?e:Ai}function gr(e){this.manager=void 0!==e?e:Ai}function yr(e){this.manager=void 0!==e?e:Ai}function br(e,t){ne.call(this),this.type="Light",this.color=new $(e),this.intensity=void 0!==t?t:1,this.receiveShadow=void 0}function _r(e,t,r){br.call(this,e,r),this.type="HemisphereLight",this.castShadow=void 0,this.position.copy(ne.DefaultUp),this.updateMatrix(),this.groundColor=new $(t)}function xr(e){this.camera=e,this.bias=0,this.radius=1,this.mapSize=new r(512,512),this.map=null,this.matrix=new n}function wr(){xr.call(this,new We(50,1,.5,500))}function Sr(e,t,r,n,i,o){br.call(this,e,t),this.type="SpotLight",this.position.copy(ne.DefaultUp),this.updateMatrix(),this.target=new ne,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(e){this.intensity=e/Math.PI}}),this.distance=void 0!==r?r:0,this.angle=void 0!==n?n:Math.PI/3,this.penumbra=void 0!==i?i:0,this.decay=void 0!==o?o:1,this.shadow=new wr}function Mr(e,t,r,n){br.call(this,e,t),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(e){this.intensity=e/(4*Math.PI)}}),this.distance=void 0!==r?r:0,this.decay=void 0!==n?n:1,this.shadow=new xr(new We(90,1,.5,500))}function Er(){xr.call(this,new oe(-5,5,5,-5,.5,500))}function Cr(e,t){br.call(this,e,t),this.type="DirectionalLight",this.position.copy(ne.DefaultUp),this.updateMatrix(),this.target=new ne,this.shadow=new Er}function Tr(e,t){br.call(this,e,t),this.type="AmbientLight",this.castShadow=void 0}function Or(e,t,r,n){br.call(this,e,t),this.type="RectAreaLight",this.position.set(0,1,0),this.updateMatrix(),this.width=void 0!==r?r:10,this.height=void 0!==n?n:10}function Pr(e,t,r,n){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new t.constructor(r),this.sampleValues=t,this.valueSize=r}function jr(e,t,r,n){Pr.call(this,e,t,r,n),this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function Ar(e,t,r,n){Pr.call(this,e,t,r,n)}function Rr(e,t,r,n){Pr.call(this,e,t,r,n)}function Lr(e,t,r,n){if(void 0===e)throw Error("track name is undefined");if(void 0===t||0===t.length)throw Error("no keyframes in track named "+e);this.name=e,this.times=Li.convertArray(t,this.TimeBufferType),this.values=Li.convertArray(r,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation),this.validate(),this.optimize()}function Nr(e,t,r,n){Lr.call(this,e,t,r,n)}function Ir(e,t,r,n){Pr.call(this,e,t,r,n)}function Dr(e,t,r,n){Lr.call(this,e,t,r,n)}function kr(e,t,r,n){Lr.call(this,e,t,r,n)}function Fr(e,t,r,n){Lr.call(this,e,t,r,n)}function Br(e,t,r){Lr.call(this,e,t,r)}function Ur(e,t,r,n){Lr.call(this,e,t,r,n)}function zr(e,t,r,n){Lr.apply(this,e,t,r,n)}function $r(e,t,r){this.name=e,this.tracks=r,this.duration=void 0!==t?t:-1,this.uuid=ci.generateUUID(),0>this.duration&&this.resetDuration(),this.optimize()}function Gr(e){this.manager=void 0!==e?e:Ai,this.textures={}}function Vr(e){this.manager=void 0!==e?e:Ai}function Hr(){this.onLoadStart=function(){},this.onLoadProgress=function(){},this.onLoadComplete=function(){}}function qr(e){"boolean"==typeof e&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),e=void 0),this.manager=void 0!==e?e:Ai,this.withCredentials=!1}function Wr(e){this.manager=void 0!==e?e:Ai,this.texturePath=""}function Xr(e,t,r,n,i){var o=e*e;return(2*r-2*n+(t=.5*(n-t))+(i=.5*(i-r)))*e*o+(-3*r+3*n-2*t-i)*o+t*e+r}function Yr(e,t,r,n){var i=1-e;return i*i*t+2*(1-e)*e*r+e*e*n}function Kr(e,t,r,n,i){var o=1-e,a=1-e;return o*o*o*t+3*a*a*e*r+3*(1-e)*e*e*n+e*e*e*i}function Zr(){this.type="Curve",this.arcLengthDivisions=200}function Jr(e,t){Zr.call(this),this.type="LineCurve",this.v1=e||new r,this.v2=t||new r}function Qr(){Zr.call(this),this.type="CurvePath",this.curves=[],this.autoClose=!1}function en(e,t,r,n,i,o,a,s){Zr.call(this),this.type="EllipseCurve",this.aX=e||0,this.aY=t||0,this.xRadius=r||1,this.yRadius=n||1,this.aStartAngle=i||0,this.aEndAngle=o||2*Math.PI,this.aClockwise=a||!1,this.aRotation=s||0}function tn(e){Zr.call(this),this.type="SplineCurve",this.points=e||[]}function rn(e,t,n,i){Zr.call(this),this.type="CubicBezierCurve",this.v0=e||new r,this.v1=t||new r,this.v2=n||new r,this.v3=i||new r}function nn(e,t,n){Zr.call(this),this.type="QuadraticBezierCurve",this.v0=e||new r,this.v1=t||new r,this.v2=n||new r}function on(e){Qr.call(this),this.type="Path",this.currentPoint=new r,e&&this.setFromPoints(e)}function an(e){on.call(this,e),this.type="Shape",this.holes=[]}function sn(){this.type="ShapePath",this.subPaths=[],this.currentPath=null}function cn(e){this.type="Font",this.data=e}function un(e){this.manager=void 0!==e?e:Ai}function hn(e){this.manager=void 0!==e?e:Ai}function ln(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new We,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new We,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1}function pn(e,t,r){ne.call(this),this.type="CubeCamera";var n=new We(90,1,e,t);n.up.set(0,-1,0),n.lookAt(new o(1,0,0)),this.add(n);var i=new We(90,1,e,t);i.up.set(0,-1,0),i.lookAt(new o(-1,0,0)),this.add(i);var a=new We(90,1,e,t);a.up.set(0,0,1),a.lookAt(new o(0,1,0)),this.add(a);var s=new We(90,1,e,t);s.up.set(0,0,-1),s.lookAt(new o(0,-1,0)),this.add(s);var c=new We(90,1,e,t);c.up.set(0,-1,0),c.lookAt(new o(0,0,1)),this.add(c);var u=new We(90,1,e,t);u.up.set(0,-1,0),u.lookAt(new o(0,0,-1)),this.add(u),this.renderTarget=new h(r,r,{format:1022,magFilter:1006,minFilter:1006}),this.renderTarget.texture.name="CubeCamera",this.update=function(e,t){null===this.parent&&this.updateMatrixWorld();var r=this.renderTarget,o=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,r.activeCubeFace=0,e.render(t,n,r),r.activeCubeFace=1,e.render(t,i,r),r.activeCubeFace=2,e.render(t,a,r),r.activeCubeFace=3,e.render(t,s,r),r.activeCubeFace=4,e.render(t,c,r),r.texture.generateMipmaps=o,r.activeCubeFace=5,e.render(t,u,r),e.setRenderTarget(null)},this.clear=function(e,t,r,n){for(var i=this.renderTarget,o=0;6>o;o++)i.activeCubeFace=o,e.setRenderTarget(i),e.clear(t,r,n);e.setRenderTarget(null)}}function fn(){ne.call(this),this.type="AudioListener",this.context=zi.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null}function dn(e){ne.call(this),this.type="Audio",this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.loop=!1,this.offset=this.startTime=0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType="empty",this.filters=[]}function mn(e){dn.call(this,e),this.panner=this.context.createPanner(),this.panner.connect(this.gain)}function vn(e,t){this.analyser=e.context.createAnalyser(),this.analyser.fftSize=void 0!==t?t:2048,this.data=new Uint8Array(this.analyser.frequencyBinCount),e.getOutput().connect(this.analyser)}function gn(e,t,r){switch(this.binding=e,this.valueSize=r,e=Float64Array,t){case"quaternion":t=this._slerp;break;case"string":case"bool":e=Array,t=this._select;break;default:t=this._lerp}this.buffer=new e(4*r),this._mixBufferRegion=t,this.referenceCount=this.useCount=this.cumulativeWeight=0}function yn(e,t,r){r=r||bn.parseTrackName(t),this._targetGroup=e,this._bindings=e.subscribe_(t,r)}function bn(e,t,r){this.path=t,this.parsedPath=r||bn.parseTrackName(t),this.node=bn.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e}function _n(){this.uuid=ci.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var e={};this._indicesByUUID=e;for(var t=0,r=arguments.length;t!==r;++t)e[arguments[t].uuid]=t;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var n=this;this.stats={objects:{get total(){return n._objects.length},get inUse(){return this.total-n.nCachedObjects_}},get bindingsPerObject(){return n._bindings.length}}}function xn(e,t,r){this._mixer=e,this._clip=t,this._localRoot=r||null,t=(e=t.tracks).length,r=Array(t);for(var n={endingStart:2400,endingEnd:2400},i=0;i!==t;++i){var o=e[i].createInterpolant(null);r[i]=o,o.settings=n}this._interpolantSettings=n,this._interpolants=r,this._propertyBindings=Array(t),this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function wn(e){this._root=e,this._initMemoryManager(),this.time=this._accuIndex=0,this.timeScale=1}function Sn(e,t){"string"==typeof e&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),e=t),this.value=e}function Mn(){_e.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0}function En(e,t,r,n){this.uuid=ci.generateUUID(),this.data=e,this.itemSize=t,this.offset=r,this.normalized=!0===n}function Cn(e,t){this.uuid=ci.generateUUID(),this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.onUploadCallback=function(){},this.version=0}function Tn(e,t,r){Cn.call(this,e,t),this.meshPerAttribute=r||1}function On(e,t,r){ce.call(this,e,t),this.meshPerAttribute=r||1}function Pn(e,t,r,n){this.ray=new Te(e,t),this.near=r||0,this.far=n||1/0,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function jn(e,t){return e.distance-t.distance}function An(e,t,r,n){if(!1!==e.visible&&(e.raycast(t,r),!0===n)){n=0;for(var i=(e=e.children).length;n<i;n++)An(e[n],t,r,!0)}}function Rn(e){this.autoStart=void 0===e||e,this.elapsedTime=this.oldTime=this.startTime=0,this.running=!1}function Ln(e,t,r){return this.radius=void 0!==e?e:1,this.phi=void 0!==t?t:0,this.theta=void 0!==r?r:0,this}function Nn(e,t,r){return this.radius=void 0!==e?e:1,this.theta=void 0!==t?t:0,this.y=void 0!==r?r:0,this}function In(e){ne.call(this),this.material=e,this.render=function(){}}function Dn(e,t,r,n){this.object=e,this.size=void 0!==t?t:1,e=void 0!==r?r:16711680,n=void 0!==n?n:1,t=0,(r=this.object.geometry)&&r.isGeometry?t=3*r.faces.length:r&&r.isBufferGeometry&&(t=r.attributes.normal.count),r=new _e,t=new ve(6*t,3),r.addAttribute("position",t),lt.call(this,r,new ut({color:e,linewidth:n})),this.matrixAutoUpdate=!1,this.update()}function kn(e,t){ne.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=t,e=new _e,t=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var r=0,n=1;32>r;r++,n++){var i=r/32*Math.PI*2,o=n/32*Math.PI*2;t.push(Math.cos(i),Math.sin(i),1,Math.cos(o),Math.sin(o),1)}e.addAttribute("position",new ve(t,3)),t=new ut({fog:!1}),this.cone=new lt(e,t),this.add(this.cone),this.update()}function Fn(e){var t=[];e&&e.isBone&&t.push(e);for(var r=0;r<e.children.length;r++)t.push.apply(t,Fn(e.children[r]));return t}function Bn(e){for(var t=Fn(e),r=new _e,n=[],i=[],o=new $(0,0,1),a=new $(0,1,0),s=0;s<t.length;s++){var c=t[s];c.parent&&c.parent.isBone&&(n.push(0,0,0),n.push(0,0,0),i.push(o.r,o.g,o.b),i.push(a.r,a.g,a.b))}r.addAttribute("position",new ve(n,3)),r.addAttribute("color",new ve(i,3)),n=new ut({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0}),lt.call(this,r,n),this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1}function Un(e,t,r){this.light=e,this.light.updateMatrixWorld(),this.color=r,e=new Gt(t,4,2),t=new Ee({wireframe:!0,fog:!1}),je.call(this,e,t),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}function zn(e,t){ne.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=t,e=new ut({fog:!1}),(t=new _e).addAttribute("position",new ce(new Float32Array(15),3)),this.line=new ht(t,e),this.add(this.line),this.update()}function $n(e,t,r){ne.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=r,(e=new Tt(t)).rotateY(.5*Math.PI),this.material=new Ee({wireframe:!0,fog:!1}),void 0===this.color&&(this.material.vertexColors=2),t=e.getAttribute("position"),t=new Float32Array(3*t.count),e.addAttribute("color",new ce(t,3)),this.add(new je(e,this.material)),this.update()}function Gn(e,t,r,n){e=e||10,t=t||10,r=new $(void 0!==r?r:4473924),n=new $(void 0!==n?n:8947848);var i=t/2,o=e/t,a=e/2;e=[];for(var s=[],c=0,u=0,h=-a;c<=t;c++,h+=o){e.push(-a,0,h,a,0,h),e.push(h,0,-a,h,0,a);var l=c===i?r:n;l.toArray(s,u),u+=3,l.toArray(s,u),u+=3,l.toArray(s,u),u+=3,l.toArray(s,u),u+=3}(t=new _e).addAttribute("position",new ve(e,3)),t.addAttribute("color",new ve(s,3)),r=new ut({vertexColors:2}),lt.call(this,t,r)}function Vn(e,t,r,n,i,o){e=e||10,t=t||16,r=r||8,n=n||64,i=new $(void 0!==i?i:4473924),o=new $(void 0!==o?o:8947848);var a,s=[],c=[];for(a=0;a<=t;a++){var u=a/t*2*Math.PI,h=Math.sin(u)*e;u=Math.cos(u)*e,s.push(0,0,0),s.push(h,0,u);var l=1&a?i:o;c.push(l.r,l.g,l.b),c.push(l.r,l.g,l.b)}for(a=0;a<=r;a++){l=1&a?i:o;var p=e-e/r*a;for(t=0;t<n;t++)u=t/n*2*Math.PI,h=Math.sin(u)*p,u=Math.cos(u)*p,s.push(h,0,u),c.push(l.r,l.g,l.b),u=(t+1)/n*2*Math.PI,h=Math.sin(u)*p,u=Math.cos(u)*p,s.push(h,0,u),c.push(l.r,l.g,l.b)}(e=new _e).addAttribute("position",new ve(s,3)),e.addAttribute("color",new ve(c,3)),s=new ut({vertexColors:2}),lt.call(this,e,s)}function Hn(e,t,r,n){this.object=e,this.size=void 0!==t?t:1,e=void 0!==r?r:16776960,n=void 0!==n?n:1,t=0,(r=this.object.geometry)&&r.isGeometry?t=r.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead."),r=new _e,t=new ve(6*t,3),r.addAttribute("position",t),lt.call(this,r,new ut({color:e,linewidth:n})),this.matrixAutoUpdate=!1,this.update()}function qn(e,t,r){ne.call(this),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=r,void 0===t&&(t=1),(e=new _e).addAttribute("position",new ve([-t,t,0,t,t,0,t,-t,0,-t,-t,0,-t,t,0],3)),t=new ut({fog:!1}),this.lightPlane=new ht(e,t),this.add(this.lightPlane),(e=new _e).addAttribute("position",new ve([0,0,0,0,0,1],3)),this.targetLine=new ht(e,t),this.add(this.targetLine),this.update()}function Wn(e){function t(e,t,n){r(e,n),r(t,n)}function r(e,t){o.push(0,0,0),a.push(t.r,t.g,t.b),void 0===s[e]&&(s[e]=[]),s[e].push(o.length/3-1)}var n=new _e,i=new ut({color:16777215,vertexColors:1}),o=[],a=[],s={},c=new $(16755200),u=new $(16711680),h=new $(43775),l=new $(16777215),p=new $(3355443);t("n1","n2",c),t("n2","n4",c),t("n4","n3",c),t("n3","n1",c),t("f1","f2",c),t("f2","f4",c),t("f4","f3",c),t("f3","f1",c),t("n1","f1",c),t("n2","f2",c),t("n3","f3",c),t("n4","f4",c),t("p","n1",u),t("p","n2",u),t("p","n3",u),t("p","n4",u),t("u1","u2",h),t("u2","u3",h),t("u3","u1",h),t("c","t",l),t("p","c",p),t("cn1","cn2",p),t("cn3","cn4",p),t("cf1","cf2",p),t("cf3","cf4",p),n.addAttribute("position",new ve(o,3)),n.addAttribute("color",new ve(a,3)),lt.call(this,n,i),this.camera=e,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}function Xn(e,t){this.object=e,void 0===t&&(t=16776960),e=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var r=new Float32Array(24),n=new _e;n.setIndex(new ce(e,1)),n.addAttribute("position",new ce(r,3)),lt.call(this,n,new ut({color:t})),this.matrixAutoUpdate=!1,this.update()}function Yn(e,t){this.type="Box3Helper",this.box=e,e=void 0!==t?t:16776960,t=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var r=new _e;r.setIndex(new ce(t,1)),r.addAttribute("position",new ve([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),lt.call(this,r,new ut({color:e})),this.geometry.computeBoundingSphere()}function Kn(e,t,r){this.type="PlaneHelper",this.plane=e,this.size=void 0===t?1:t,e=void 0!==r?r:16776960,(t=new _e).addAttribute("position",new ve([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),t.computeBoundingSphere(),ht.call(this,t,new ut({color:e})),(t=new _e).addAttribute("position",new ve([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),t.computeBoundingSphere(),this.add(new je(t,new Ee({color:e,opacity:.2,transparent:!0,depthWrite:!1})))}function Zn(e,t,r,n,i,o){ne.call(this),void 0===n&&(n=16776960),void 0===r&&(r=1),void 0===i&&(i=.2*r),void 0===o&&(o=.2*i),void 0===$i&&(($i=new _e).addAttribute("position",new ve([0,0,0,0,1,0],3)),(Gi=new Jt(0,.5,1,5,1)).translate(0,-.5,0)),this.position.copy(t),this.line=new ht($i,new ut({color:n})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new je(Gi,new Ee({color:n})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(e),this.setLength(r,i,o)}function Jn(e){var t=[0,0,0,e=e||1,0,0,0,0,0,0,e,0,0,0,0,0,0,e];(e=new _e).addAttribute("position",new ve(t,3)),e.addAttribute("color",new ve([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3)),t=new ut({vertexColors:2}),lt.call(this,e,t)}function Qn(){var e=0,t=0,r=0,n=0;return{initCatmullRom:function(i,o,a,s,c){e=o,t=i=c*(a-i),r=-3*o+3*a-2*i-(s=c*(s-o)),n=2*o-2*a+i+s},initNonuniformCatmullRom:function(i,o,a,s,c,u,h){e=o,t=i=((o-i)/c-(a-i)/(c+u)+(a-o)/u)*u,r=-3*o+3*a-2*i-(s=((a-o)/u-(s-o)/(u+h)+(s-a)/h)*u),n=2*o-2*a+i+s},calc:function(i){var o=i*i;return e+t*i+r*o+n*o*i}}}function ei(e,t,r,n){Zr.call(this),this.type="CatmullRomCurve3",this.points=e||[],this.closed=t||!1,this.curveType=r||"centripetal",this.tension=n||.5}function ti(e,t,r,n){Zr.call(this),this.type="CubicBezierCurve3",this.v0=e||new o,this.v1=t||new o,this.v2=r||new o,this.v3=n||new o}function ri(e,t,r){Zr.call(this),this.type="QuadraticBezierCurve3",this.v0=e||new o,this.v1=t||new o,this.v2=r||new o}function ni(e,t){Zr.call(this),this.type="LineCurve3",this.v1=e||new o,this.v2=t||new o}function ii(e,t,r,n,i,o){en.call(this,e,t,r,r,n,i,o),this.type="ArcCurve"}function oi(e){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),ei.call(this,e),this.type="catmullrom",this.closed=!0}function ai(e){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),ei.call(this,e),this.type="catmullrom"}function si(e){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),ei.call(this,e),this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}),void 0===Math.sign&&(Math.sign=function(e){return 0>e?-1:0<e?1:+e}),!1=="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(e){if(void 0===e||null===e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),r=1;r<arguments.length;r++){var n=arguments[r];if(void 0!==n&&null!==n)for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}),Object.assign(t.prototype,{addEventListener:function(e,t){void 0===this._listeners&&(this._listeners={});var r=this._listeners;void 0===r[e]&&(r[e]=[]),-1===r[e].indexOf(t)&&r[e].push(t)},hasEventListener:function(e,t){if(void 0===this._listeners)return!1;var r=this._listeners;return void 0!==r[e]&&-1!==r[e].indexOf(t)},removeEventListener:function(e,t){void 0!==this._listeners&&void 0!==(e=this._listeners[e])&&-1!==(t=e.indexOf(t))&&e.splice(t,1)},dispatchEvent:function(e){if(void 0!==this._listeners){t=this._listeners[e.type];if(void 0!==t){e.target=this;for(var t,r=0,n=(t=t.slice(0)).length;r<n;r++)t[r].call(this,e)}}}});var ci={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var e,t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),r=0;return function(){for(var n="",i=0;36>i;i++)8===i||13===i||18===i||23===i?n+="-":14===i?n+="4":(2>=r&&(r=33554432+16777216*Math.random()|0),e=15&r,r>>=4,n+=t[19===i?3&e|8:e]);return n}}(),clamp:function(e,t,r){return Math.max(t,Math.min(r,e))},euclideanModulo:function(e,t){return(e%t+t)%t},mapLinear:function(e,t,r,n,i){return n+(e-t)*(i-n)/(r-t)},lerp:function(e,t,r){return(1-r)*e+r*t},smoothstep:function(e,t,r){return e<=t?0:e>=r?1:(e=(e-t)/(r-t))*e*(3-2*e)},smootherstep:function(e,t,r){return e<=t?0:e>=r?1:(e=(e-t)/(r-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},degToRad:function(e){return e*ci.DEG2RAD},radToDeg:function(e){return e*ci.RAD2DEG},isPowerOfTwo:function(e){return 0==(e&e-1)&&0!==e},ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:function(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))}};Object.defineProperties(r.prototype,{width:{get:function(){return this.x},set:function(e){this.x=e}},height:{get:function(){return this.y},set:function(e){this.y=e}}}),Object.assign(r.prototype,{isVector2:!0,set:function(e,t){return this.x=e,this.y=t,this},setScalar:function(e){return this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(e){return this.x=e.x,this.y=e.y,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)},addScalar:function(e){return this.x+=e,this.y+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)},subScalar:function(e){return this.x-=e,this.y-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this},multiply:function(e){return this.x*=e.x,this.y*=e.y,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return this.x/=e.x,this.y/=e.y,this},divideScalar:function(e){return this.multiplyScalar(1/e)},applyMatrix3:function(e){var t=this.x,r=this.y;return e=e.elements,this.x=e[0]*t+e[3]*r+e[6],this.y=e[1]*t+e[4]*r+e[7],this},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this},clampScalar:function(){var e=new r,t=new r;return function(r,n){return e.set(r,r),t.set(n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(e){return this.x*e.x+this.y*e.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var e=Math.atan2(this.y,this.x);return 0>e&&(e+=2*Math.PI),e},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x;return e=this.y-e.y,t*t+e*e},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this},rotateAround:function(e,t){var r=Math.cos(t);t=Math.sin(t);var n=this.x-e.x,i=this.y-e.y;return this.x=n*r-i*t+e.x,this.y=n*t+i*r+e.y,this}}),Object.assign(n.prototype,{isMatrix4:!0,set:function(e,t,r,n,i,o,a,s,c,u,h,l,p,f,d,m){var v=this.elements;return v[0]=e,v[4]=t,v[8]=r,v[12]=n,v[1]=i,v[5]=o,v[9]=a,v[13]=s,v[2]=c,v[6]=u,v[10]=h,v[14]=l,v[3]=p,v[7]=f,v[11]=d,v[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new n).fromArray(this.elements)},copy:function(e){var t=this.elements;return e=e.elements,t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],this},copyPosition:function(e){var t=this.elements;return e=e.elements,t[12]=e[12],t[13]=e[13],t[14]=e[14],this},extractBasis:function(e,t,r){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this},makeBasis:function(e,t,r){return this.set(e.x,t.x,r.x,0,e.y,t.y,r.y,0,e.z,t.z,r.z,0,0,0,0,1),this},extractRotation:function(){var e=new o;return function(t){var r=this.elements,n=t.elements,i=1/e.setFromMatrixColumn(t,0).length(),o=1/e.setFromMatrixColumn(t,1).length();return t=1/e.setFromMatrixColumn(t,2).length(),r[0]=n[0]*i,r[1]=n[1]*i,r[2]=n[2]*i,r[4]=n[4]*o,r[5]=n[5]*o,r[6]=n[6]*o,r[8]=n[8]*t,r[9]=n[9]*t,r[10]=n[10]*t,this}}(),makeRotationFromEuler:function(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var t=this.elements,r=e.x,n=e.y,i=e.z,o=Math.cos(r),r=Math.sin(r),a=Math.cos(n),n=Math.sin(n),s=Math.cos(i),i=Math.sin(i);if("XYZ"===e.order){var c=o*s,u=o*i,h=r*s;e=r*i,t[0]=a*s,t[4]=-a*i,t[8]=n,t[1]=u+h*n,t[5]=c-e*n,t[9]=-r*a,t[2]=e-c*n,t[6]=h+u*n,t[10]=o*a}else"YXZ"===e.order?(c=a*s,u=a*i,h=n*s,e=n*i,t[0]=c+e*r,t[4]=h*r-u,t[8]=o*n,t[1]=o*i,t[5]=o*s,t[9]=-r,t[2]=u*r-h,t[6]=e+c*r,t[10]=o*a):"ZXY"===e.order?(c=a*s,u=a*i,h=n*s,e=n*i,t[0]=c-e*r,t[4]=-o*i,t[8]=h+u*r,t[1]=u+h*r,t[5]=o*s,t[9]=e-c*r,t[2]=-o*n,t[6]=r,t[10]=o*a):"ZYX"===e.order?(c=o*s,u=o*i,h=r*s,e=r*i,t[0]=a*s,t[4]=h*n-u,t[8]=c*n+e,t[1]=a*i,t[5]=e*n+c,t[9]=u*n-h,t[2]=-n,t[6]=r*a,t[10]=o*a):"YZX"===e.order?(c=o*a,u=o*n,h=r*a,e=r*n,t[0]=a*s,t[4]=e-c*i,t[8]=h*i+u,t[1]=i,t[5]=o*s,t[9]=-r*s,t[2]=-n*s,t[6]=u*i+h,t[10]=c-e*i):"XZY"===e.order&&(c=o*a,u=o*n,h=r*a,e=r*n,t[0]=a*s,t[4]=-i,t[8]=n*s,t[1]=c*i+e,t[5]=o*s,t[9]=u*i-h,t[2]=h*i-u,t[6]=r*s,t[10]=e*i+c);return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},makeRotationFromQuaternion:function(e){var t=this.elements,r=e._x,n=e._y,i=e._z,o=e._w,a=i+i;e=r*(u=r+r);var s=r*(h=n+n),r=r*a,c=n*h,n=n*a,i=i*a,u=o*u,h=o*h,o=o*a;return t[0]=1-(c+i),t[4]=s-o,t[8]=r+h,t[1]=s+o,t[5]=1-(e+i),t[9]=n-u,t[2]=r-h,t[6]=n+u,t[10]=1-(e+c),t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},lookAt:function(){var e=new o,t=new o,r=new o;return function(n,i,o){var a=this.elements;return r.subVectors(n,i),0===r.lengthSq()&&(r.z=1),r.normalize(),e.crossVectors(o,r),0===e.lengthSq()&&(1===Math.abs(o.z)?r.x+=1e-4:r.z+=1e-4,r.normalize(),e.crossVectors(o,r)),e.normalize(),t.crossVectors(r,e),a[0]=e.x,a[4]=t.x,a[8]=r.x,a[1]=e.y,a[5]=t.y,a[9]=r.y,a[2]=e.z,a[6]=t.z,a[10]=r.z,this}}(),multiply:function(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var r=e.elements,n=t.elements;t=this.elements,e=r[0];var i=r[4],o=r[8],a=r[12],s=r[1],c=r[5],u=r[9],h=r[13],l=r[2],p=r[6],f=r[10],d=r[14],m=r[3],v=r[7],g=r[11],r=r[15],y=n[0],b=n[4],_=n[8],x=n[12],w=n[1],S=n[5],M=n[9],E=n[13],C=n[2],T=n[6],O=n[10],P=n[14],j=n[3],A=n[7],R=n[11],n=n[15];return t[0]=e*y+i*w+o*C+a*j,t[4]=e*b+i*S+o*T+a*A,t[8]=e*_+i*M+o*O+a*R,t[12]=e*x+i*E+o*P+a*n,t[1]=s*y+c*w+u*C+h*j,t[5]=s*b+c*S+u*T+h*A,t[9]=s*_+c*M+u*O+h*R,t[13]=s*x+c*E+u*P+h*n,t[2]=l*y+p*w+f*C+d*j,t[6]=l*b+p*S+f*T+d*A,t[10]=l*_+p*M+f*O+d*R,t[14]=l*x+p*E+f*P+d*n,t[3]=m*y+v*w+g*C+r*j,t[7]=m*b+v*S+g*T+r*A,t[11]=m*_+v*M+g*O+r*R,t[15]=m*x+v*E+g*P+r*n,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this},applyToBufferAttribute:function(){var e=new o;return function(t){for(var r=0,n=t.count;r<n;r++)e.x=t.getX(r),e.y=t.getY(r),e.z=t.getZ(r),e.applyMatrix4(this),t.setXYZ(r,e.x,e.y,e.z);return t}}(),determinant:function(){var e=this.elements,t=e[0],r=e[4],n=e[8],i=e[12],o=e[1],a=e[5],s=e[9],c=e[13],u=e[2],h=e[6],l=e[10],p=e[14];return e[3]*(+i*s*h-n*c*h-i*a*l+r*c*l+n*a*p-r*s*p)+e[7]*(+t*s*p-t*c*l+i*o*l-n*o*p+n*c*u-i*s*u)+e[11]*(+t*c*h-t*a*p-i*o*h+r*o*p+i*a*u-r*c*u)+e[15]*(-n*a*u-t*s*h+t*a*l+n*o*h-r*o*l+r*s*u)},transpose:function(){var e=this.elements,t=e[1];return e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this},setPosition:function(e){var t=this.elements;return t[12]=e.x,t[13]=e.y,t[14]=e.z,this},getInverse:function(e,t){var r=this.elements,n=e.elements;e=n[0];var i=n[1],o=n[2],a=n[3],s=n[4],c=n[5],u=n[6],h=n[7],l=n[8],p=n[9],f=n[10],d=n[11],m=n[12],v=n[13],g=n[14],y=p*g*h-v*f*h+v*u*d-c*g*d-p*u*(n=n[15])+c*f*n,b=m*f*h-l*g*h-m*u*d+s*g*d+l*u*n-s*f*n,_=l*v*h-m*p*h+m*c*d-s*v*d-l*c*n+s*p*n,x=m*p*u-l*v*u-m*c*f+s*v*f+l*c*g-s*p*g,w=e*y+i*b+o*_+a*x;if(0===w){if(!0===t)throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");return console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0"),this.identity()}return t=1/w,r[0]=y*t,r[1]=(v*f*a-p*g*a-v*o*d+i*g*d+p*o*n-i*f*n)*t,r[2]=(c*g*a-v*u*a+v*o*h-i*g*h-c*o*n+i*u*n)*t,r[3]=(p*u*a-c*f*a-p*o*h+i*f*h+c*o*d-i*u*d)*t,r[4]=b*t,r[5]=(l*g*a-m*f*a+m*o*d-e*g*d-l*o*n+e*f*n)*t,r[6]=(m*u*a-s*g*a-m*o*h+e*g*h+s*o*n-e*u*n)*t,r[7]=(s*f*a-l*u*a+l*o*h-e*f*h-s*o*d+e*u*d)*t,r[8]=_*t,r[9]=(m*p*a-l*v*a-m*i*d+e*v*d+l*i*n-e*p*n)*t,r[10]=(s*v*a-m*c*a+m*i*h-e*v*h-s*i*n+e*c*n)*t,r[11]=(l*c*a-s*p*a-l*i*h+e*p*h+s*i*d-e*c*d)*t,r[12]=x*t,r[13]=(l*v*o-m*p*o+m*i*f-e*v*f-l*i*g+e*p*g)*t,r[14]=(m*c*o-s*v*o-m*i*u+e*v*u+s*i*g-e*c*g)*t,r[15]=(s*p*o-l*c*o+l*i*u-e*p*u-s*i*f+e*c*f)*t,this},scale:function(e){var t=this.elements,r=e.x,n=e.y;return e=e.z,t[0]*=r,t[4]*=n,t[8]*=e,t[1]*=r,t[5]*=n,t[9]*=e,t[2]*=r,t[6]*=n,t[10]*=e,t[3]*=r,t[7]*=n,t[11]*=e,this},getMaxScaleOnAxis:function(){var e=this.elements;return Math.sqrt(Math.max(e[0]*e[0]+e[1]*e[1]+e[2]*e[2],e[4]*e[4]+e[5]*e[5]+e[6]*e[6],e[8]*e[8]+e[9]*e[9]+e[10]*e[10]))},makeTranslation:function(e,t,r){return this.set(1,0,0,e,0,1,0,t,0,0,1,r,0,0,0,1),this},makeRotationX:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(1,0,0,0,0,t,-e,0,0,e,t,0,0,0,0,1),this},makeRotationY:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(t,0,e,0,0,1,0,0,-e,0,t,0,0,0,0,1),this},makeRotationZ:function(e){var t=Math.cos(e);return e=Math.sin(e),this.set(t,-e,0,0,e,t,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(e,t){var r=Math.cos(t);t=Math.sin(t);var n=1-r,i=e.x,o=e.y;e=e.z;var a=n*i,s=n*o;return this.set(a*i+r,a*o-t*e,a*e+t*o,0,a*o+t*e,s*o+r,s*e-t*i,0,a*e-t*o,s*e+t*i,n*e*e+r,0,0,0,0,1),this},makeScale:function(e,t,r){return this.set(e,0,0,0,0,t,0,0,0,0,r,0,0,0,0,1),this},makeShear:function(e,t,r){return this.set(1,t,r,0,e,1,r,0,e,t,1,0,0,0,0,1),this},compose:function(e,t,r){return this.makeRotationFromQuaternion(t),this.scale(r),this.setPosition(e),this},decompose:function(){var e=new o,t=new n;return function(r,n,i){var o=this.elements,a=e.set(o[0],o[1],o[2]).length(),s=e.set(o[4],o[5],o[6]).length(),c=e.set(o[8],o[9],o[10]).length();0>this.determinant()&&(a=-a),r.x=o[12],r.y=o[13],r.z=o[14],t.copy(this),r=1/a;var o=1/s,u=1/c;return t.elements[0]*=r,t.elements[1]*=r,t.elements[2]*=r,t.elements[4]*=o,t.elements[5]*=o,t.elements[6]*=o,t.elements[8]*=u,t.elements[9]*=u,t.elements[10]*=u,n.setFromRotationMatrix(t),i.x=a,i.y=s,i.z=c,this}}(),makePerspective:function(e,t,r,n,i,o){void 0===o&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var a=this.elements;return a[0]=2*i/(t-e),a[4]=0,a[8]=(t+e)/(t-e),a[12]=0,a[1]=0,a[5]=2*i/(r-n),a[9]=(r+n)/(r-n),a[13]=0,a[2]=0,a[6]=0,a[10]=-(o+i)/(o-i),a[14]=-2*o*i/(o-i),a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this},makeOrthographic:function(e,t,r,n,i,o){var a=this.elements,s=1/(t-e),c=1/(r-n),u=1/(o-i);return a[0]=2*s,a[4]=0,a[8]=0,a[12]=-(t+e)*s,a[1]=0,a[5]=2*c,a[9]=0,a[13]=-(r+n)*c,a[2]=0,a[6]=0,a[10]=-2*u,a[14]=-(o+i)*u,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this},equals:function(e){var t=this.elements;e=e.elements;for(var r=0;16>r;r++)if(t[r]!==e[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var r=0;16>r;r++)this.elements[r]=e[r+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var r=this.elements;return e[t]=r[0],e[t+1]=r[1],e[t+2]=r[2],e[t+3]=r[3],e[t+4]=r[4],e[t+5]=r[5],e[t+6]=r[6],e[t+7]=r[7],e[t+8]=r[8],e[t+9]=r[9],e[t+10]=r[10],e[t+11]=r[11],e[t+12]=r[12],e[t+13]=r[13],e[t+14]=r[14],e[t+15]=r[15],e}}),Object.assign(i,{slerp:function(e,t,r,n){return r.copy(e).slerp(t,n)},slerpFlat:function(e,t,r,n,i,o,a){var s=r[n+0],c=r[n+1],u=r[n+2];r=r[n+3],n=i[o+0];var h=i[o+1],l=i[o+2];if(i=i[o+3],r!==i||s!==n||c!==h||u!==l){o=1-a;var p=s*n+c*h+u*l+r*i,f=0<=p?1:-1,d=1-p*p;d>Number.EPSILON&&(d=Math.sqrt(d),p=Math.atan2(d,p*f),o=Math.sin(o*p)/d,a=Math.sin(a*p)/d),s=s*o+n*(f*=a),c=c*o+h*f,u=u*o+l*f,r=r*o+i*f,o===1-a&&(a=1/Math.sqrt(s*s+c*c+u*u+r*r),s*=a,c*=a,u*=a,r*=a)}e[t]=s,e[t+1]=c,e[t+2]=u,e[t+3]=r}}),Object.defineProperties(i.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this.onChangeCallback()}},w:{get:function(){return this._w},set:function(e){this._w=e,this.onChangeCallback()}}}),Object.assign(i.prototype,{set:function(e,t,r,n){return this._x=e,this._y=t,this._z=r,this._w=n,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this.onChangeCallback(),this},setFromEuler:function(e,t){if(!e||!e.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var r=e._x,n=e._y,i=e._z;e=e.order;var o=Math.cos,a=Math.sin,s=o(r/2),c=o(n/2),o=o(i/2),r=a(r/2),n=a(n/2),i=a(i/2);return"XYZ"===e?(this._x=r*c*o+s*n*i,this._y=s*n*o-r*c*i,this._z=s*c*i+r*n*o,this._w=s*c*o-r*n*i):"YXZ"===e?(this._x=r*c*o+s*n*i,this._y=s*n*o-r*c*i,this._z=s*c*i-r*n*o,this._w=s*c*o+r*n*i):"ZXY"===e?(this._x=r*c*o-s*n*i,this._y=s*n*o+r*c*i,this._z=s*c*i+r*n*o,this._w=s*c*o-r*n*i):"ZYX"===e?(this._x=r*c*o-s*n*i,this._y=s*n*o+r*c*i,this._z=s*c*i-r*n*o,this._w=s*c*o+r*n*i):"YZX"===e?(this._x=r*c*o+s*n*i,this._y=s*n*o+r*c*i,this._z=s*c*i-r*n*o,this._w=s*c*o-r*n*i):"XZY"===e&&(this._x=r*c*o-s*n*i,this._y=s*n*o-r*c*i,this._z=s*c*i+r*n*o,this._w=s*c*o+r*n*i),!1!==t&&this.onChangeCallback(),this},setFromAxisAngle:function(e,t){t/=2;var r=Math.sin(t);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(t),this.onChangeCallback(),this},setFromRotationMatrix:function(e){var t=e.elements,r=t[0];e=t[4];var n=t[8],i=t[1],o=t[5],a=t[9],s=t[2],c=t[6],u=r+o+(t=t[10]);return 0<u?(r=.5/Math.sqrt(u+1),this._w=.25/r,this._x=(c-a)*r,this._y=(n-s)*r,this._z=(i-e)*r):r>o&&r>t?(r=2*Math.sqrt(1+r-o-t),this._w=(c-a)/r,this._x=.25*r,this._y=(e+i)/r,this._z=(n+s)/r):o>t?(r=2*Math.sqrt(1+o-r-t),this._w=(n-s)/r,this._x=(e+i)/r,this._y=.25*r,this._z=(a+c)/r):(r=2*Math.sqrt(1+t-r-o),this._w=(i-e)/r,this._x=(n+s)/r,this._y=(a+c)/r,this._z=.25*r),this.onChangeCallback(),this},setFromUnitVectors:function(){var e,t=new o;return function(r,n){return void 0===t&&(t=new o),1e-6>(e=r.dot(n)+1)?(e=0,Math.abs(r.x)>Math.abs(r.z)?t.set(-r.y,r.x,0):t.set(0,-r.z,r.y)):t.crossVectors(r,n),this._x=t.x,this._y=t.y,this._z=t.z,this._w=e,this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var e=this.length();return 0===e?(this._z=this._y=this._x=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e),this.onChangeCallback(),this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},premultiply:function(e){return this.multiplyQuaternions(e,this)},multiplyQuaternions:function(e,t){var r=e._x,n=e._y,i=e._z;e=e._w;var o=t._x,a=t._y,s=t._z;return t=t._w,this._x=r*t+e*o+n*s-i*a,this._y=n*t+e*a+i*o-r*s,this._z=i*t+e*s+r*a-n*o,this._w=e*t-r*o-n*a-i*s,this.onChangeCallback(),this},slerp:function(e,t){if(0===t)return this;if(1===t)return this.copy(e);var r=this._x,n=this._y,i=this._z,o=this._w;if(0>(s=o*e._w+r*e._x+n*e._y+i*e._z)?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,s=-s):this.copy(e),1<=s)return this._w=o,this._x=r,this._y=n,this._z=i,this;if(e=Math.sqrt(1-s*s),.001>Math.abs(e))return this._w=.5*(o+this._w),this._x=.5*(r+this._x),this._y=.5*(n+this._y),this._z=.5*(i+this._z),this;var a=Math.atan2(e,s),s=Math.sin((1-t)*a)/e;return t=Math.sin(t*a)/e,this._w=o*s+this._w*t,this._x=r*s+this._x*t,this._y=n*s+this._y*t,this._z=i*s+this._z*t,this.onChangeCallback(),this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e,t){return void 0===t&&(t=0),this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){}}),Object.assign(o.prototype,{isVector3:!0,set:function(e,t,r){return this.x=e,this.y=t,this.z=r,this},setScalar:function(e){return this.z=this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this},multiply:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this},multiplyVectors:function(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this},applyEuler:function(){var e=new i;return function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(e.setFromEuler(t))}}(),applyAxisAngle:function(){var e=new i;return function(t,r){return this.applyQuaternion(e.setFromAxisAngle(t,r))}}(),applyMatrix3:function(e){var t=this.x,r=this.y,n=this.z;return e=e.elements,this.x=e[0]*t+e[3]*r+e[6]*n,this.y=e[1]*t+e[4]*r+e[7]*n,this.z=e[2]*t+e[5]*r+e[8]*n,this},applyMatrix4:function(e){var t=this.x,r=this.y,n=this.z,i=1/((e=e.elements)[3]*t+e[7]*r+e[11]*n+e[15]);return this.x=(e[0]*t+e[4]*r+e[8]*n+e[12])*i,this.y=(e[1]*t+e[5]*r+e[9]*n+e[13])*i,this.z=(e[2]*t+e[6]*r+e[10]*n+e[14])*i,this},applyQuaternion:function(e){var t=this.x,r=this.y,n=this.z,i=e.x,o=e.y,a=e.z,s=(e=e.w)*t+o*n-a*r,c=e*r+a*t-i*n,u=e*n+i*r-o*t,t=-i*t-o*r-a*n;return this.x=s*e+t*-i+c*-a-u*-o,this.y=c*e+t*-o+u*-i-s*-a,this.z=u*e+t*-a+s*-o-c*-i,this},project:function(){var e=new n;return function(t){return e.multiplyMatrices(t.projectionMatrix,e.getInverse(t.matrixWorld)),this.applyMatrix4(e)}}(),unproject:function(){var e=new n;return function(t){return e.multiplyMatrices(t.matrixWorld,e.getInverse(t.projectionMatrix)),this.applyMatrix4(e)}}(),transformDirection:function(e){var t=this.x,r=this.y,n=this.z;return e=e.elements,this.x=e[0]*t+e[4]*r+e[8]*n,this.y=e[1]*t+e[5]*r+e[9]*n,this.z=e[2]*t+e[6]*r+e[10]*n,this.normalize()},divide:function(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this},divideScalar:function(e){return this.multiplyScalar(1/e)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this},clampScalar:function(){var e=new o,t=new o;return function(r,n){return e.set(r,r,r),t.set(n,n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},cross:function(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)},crossVectors:function(e,t){var r=e.x,n=e.y;e=e.z;var i=t.x,o=t.y;return t=t.z,this.x=n*t-e*o,this.y=e*i-r*t,this.z=r*o-n*i,this},projectOnVector:function(e){var t=e.dot(this)/e.lengthSq();return this.copy(e).multiplyScalar(t)},projectOnPlane:function(){var e=new o;return function(t){return e.copy(this).projectOnVector(t),this.sub(e)}}(),reflect:function(){var e=new o;return function(t){return this.sub(e.copy(t).multiplyScalar(2*this.dot(t)))}}(),angleTo:function(e){return e=this.dot(e)/Math.sqrt(this.lengthSq()*e.lengthSq()),Math.acos(ci.clamp(e,-1,1))},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,r=this.y-e.y;return e=this.z-e.z,t*t+r*r+e*e},manhattanDistanceTo:function(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)},setFromSpherical:function(e){var t=Math.sin(e.phi)*e.radius;return this.x=t*Math.sin(e.theta),this.y=Math.cos(e.phi)*e.radius,this.z=t*Math.cos(e.theta),this},setFromCylindrical:function(e){return this.x=e.radius*Math.sin(e.theta),this.y=e.y,this.z=e.radius*Math.cos(e.theta),this},setFromMatrixPosition:function(e){return e=e.elements,this.x=e[12],this.y=e[13],this.z=e[14],this},setFromMatrixScale:function(e){var t=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length();return e=this.setFromMatrixColumn(e,2).length(),this.x=t,this.y=r,this.z=e,this},setFromMatrixColumn:function(e,t){return this.fromArray(e.elements,4*t)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}}),Object.assign(a.prototype,{isMatrix3:!0,set:function(e,t,r,n,i,o,a,s,c){var u=this.elements;return u[0]=e,u[1]=n,u[2]=a,u[3]=t,u[4]=i,u[5]=s,u[6]=r,u[7]=o,u[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(e){var t=this.elements;return e=e.elements,t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this},setFromMatrix4:function(e){return e=e.elements,this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},applyToBufferAttribute:function(){var e=new o;return function(t){for(var r=0,n=t.count;r<n;r++)e.x=t.getX(r),e.y=t.getY(r),e.z=t.getZ(r),e.applyMatrix3(this),t.setXYZ(r,e.x,e.y,e.z);return t}}(),multiply:function(e){return this.multiplyMatrices(this,e)},premultiply:function(e){return this.multiplyMatrices(e,this)},multiplyMatrices:function(e,t){var r=e.elements,n=t.elements;t=this.elements,e=r[0];var i=r[3],o=r[6],a=r[1],s=r[4],c=r[7],u=r[2],h=r[5],r=r[8],l=n[0],p=n[3],f=n[6],d=n[1],m=n[4],v=n[7],g=n[2],y=n[5],n=n[8];return t[0]=e*l+i*d+o*g,t[3]=e*p+i*m+o*y,t[6]=e*f+i*v+o*n,t[1]=a*l+s*d+c*g,t[4]=a*p+s*m+c*y,t[7]=a*f+s*v+c*n,t[2]=u*l+h*d+r*g,t[5]=u*p+h*m+r*y,t[8]=u*f+h*v+r*n,this},multiplyScalar:function(e){var t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this},determinant:function(){var e=this.elements,t=e[0],r=e[1],n=e[2],i=e[3],o=e[4],a=e[5],s=e[6],c=e[7];return t*o*(e=e[8])-t*a*c-r*i*e+r*a*s+n*i*c-n*o*s},getInverse:function(e,t){e&&e.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");r=e.elements;e=this.elements;var r,n=r[0],i=r[1],o=r[2],a=r[3],s=r[4],c=r[5],u=r[6],h=r[7],l=(r=r[8])*s-c*h,p=c*u-r*a,f=h*a-s*u,d=n*l+i*p+o*f;if(0===d){if(!0===t)throw Error("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");return console.warn("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0"),this.identity()}return t=1/d,e[0]=l*t,e[1]=(o*h-r*i)*t,e[2]=(c*i-o*s)*t,e[3]=p*t,e[4]=(r*n-o*u)*t,e[5]=(o*a-c*n)*t,e[6]=f*t,e[7]=(i*u-h*n)*t,e[8]=(s*n-i*a)*t,this},transpose:function(){var e=this.elements,t=e[1];return e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this},getNormalMatrix:function(e){return this.setFromMatrix4(e).getInverse(this).transpose()},transposeIntoArray:function(e){var t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this},setUvTransform:function(e,t,r,n,i,o,a){var s=Math.cos(i);i=Math.sin(i),this.set(r*s,r*i,-r*(s*o+i*a)+o+e,-n*i,n*s,-n*(-i*o+s*a)+a+t,0,0,1)},scale:function(e,t){var r=this.elements;return r[0]*=e,r[3]*=e,r[6]*=e,r[1]*=t,r[4]*=t,r[7]*=t,this},rotate:function(e){var t=Math.cos(e);e=Math.sin(e);var r=this.elements,n=r[0],i=r[3],o=r[6],a=r[1],s=r[4],c=r[7];return r[0]=t*n+e*a,r[3]=t*i+e*s,r[6]=t*o+e*c,r[1]=-e*n+t*a,r[4]=-e*i+t*s,r[7]=-e*o+t*c,this},translate:function(e,t){var r=this.elements;return r[0]+=e*r[2],r[3]+=e*r[5],r[6]+=e*r[8],r[1]+=t*r[2],r[4]+=t*r[5],r[7]+=t*r[8],this},equals:function(e){var t=this.elements;e=e.elements;for(var r=0;9>r;r++)if(t[r]!==e[r])return!1;return!0},fromArray:function(e,t){void 0===t&&(t=0);for(var r=0;9>r;r++)this.elements[r]=e[r+t];return this},toArray:function(e,t){void 0===e&&(e=[]),void 0===t&&(t=0);var r=this.elements;return e[t]=r[0],e[t+1]=r[1],e[t+2]=r[2],e[t+3]=r[3],e[t+4]=r[4],e[t+5]=r[5],e[t+6]=r[6],e[t+7]=r[7],e[t+8]=r[8],e}});var ui=0;s.DEFAULT_IMAGE=void 0,s.DEFAULT_MAPPING=300,Object.defineProperty(s.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(s.prototype,t.prototype,{constructor:s,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this},toJSON:function(e){var t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.textures[this.uuid];var r={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var n=this.image;if(void 0===n.uuid&&(n.uuid=ci.generateUUID()),!t&&void 0===e.images[n.uuid]){var i=e.images,o=n.uuid,a=n.uuid;if(n instanceof HTMLCanvasElement)var s=n;else{(s=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")).width=n.width,s.height=n.height;var c=s.getContext("2d");n instanceof ImageData?c.putImageData(n,0,0):c.drawImage(n,0,0,n.width,n.height)}s=2048<s.width||2048<s.height?s.toDataURL("image/jpeg",.6):s.toDataURL("image/png"),i[o]={uuid:a,url:s}}r.image=n.uuid}return t||(e.textures[this.uuid]=r),r},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(e){if(300===this.mapping){if(e.applyMatrix3(this.matrix),0>e.x||1<e.x)switch(this.wrapS){case 1e3:e.x-=Math.floor(e.x);break;case 1001:e.x=0>e.x?0:1;break;case 1002:e.x=1===Math.abs(Math.floor(e.x)%2)?Math.ceil(e.x)-e.x:e.x-Math.floor(e.x)}if(0>e.y||1<e.y)switch(this.wrapT){case 1e3:e.y-=Math.floor(e.y);break;case 1001:e.y=0>e.y?0:1;break;case 1002:e.y=1===Math.abs(Math.floor(e.y)%2)?Math.ceil(e.y)-e.y:e.y-Math.floor(e.y)}this.flipY&&(e.y=1-e.y)}}}),Object.assign(c.prototype,{isVector4:!0,set:function(e,t,r,n){return this.x=e,this.y=t,this.z=r,this.w=n,this},setScalar:function(e){return this.w=this.z=this.y=this.x=e,this},setX:function(e){return this.x=e,this},setY:function(e){return this.y=e,this},setZ:function(e){return this.z=e,this},setW:function(e){return this.w=e,this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error("index is out of range: "+e)}return this},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+e)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this},add:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)},addScalar:function(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this},addVectors:function(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this},addScaledVector:function(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this},sub:function(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)},subScalar:function(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this},subVectors:function(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this},multiplyScalar:function(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this},applyMatrix4:function(e){var t=this.x,r=this.y,n=this.z,i=this.w;return e=e.elements,this.x=e[0]*t+e[4]*r+e[8]*n+e[12]*i,this.y=e[1]*t+e[5]*r+e[9]*n+e[13]*i,this.z=e[2]*t+e[6]*r+e[10]*n+e[14]*i,this.w=e[3]*t+e[7]*r+e[11]*n+e[15]*i,this},divideScalar:function(e){return this.multiplyScalar(1/e)},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);return 1e-4>t?(this.x=1,this.z=this.y=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this},setAxisAngleFromRotationMatrix:function(e){var t=(e=e.elements)[0],r=e[4],n=e[8],i=e[1],o=e[5],a=e[9],s=e[2],c=e[6],u=e[10];return.01>Math.abs(r-i)&&.01>Math.abs(n-s)&&.01>Math.abs(a-c)?.1>Math.abs(r+i)&&.1>Math.abs(n+s)&&.1>Math.abs(a+c)&&.1>Math.abs(t+o+u-3)?(this.set(1,0,0,0),this):(e=Math.PI,t=(t+1)/2,o=(o+1)/2,u=(u+1)/2,r=(r+i)/4,n=(n+s)/4,a=(a+c)/4,t>o&&t>u?.01>t?(c=0,r=s=.707106781):(c=Math.sqrt(t),s=r/c,r=n/c):o>u?.01>o?(c=.707106781,s=0,r=.707106781):(s=Math.sqrt(o),c=r/s,r=a/s):.01>u?(s=c=.707106781,r=0):(r=Math.sqrt(u),c=n/r,s=a/r),this.set(c,s,r,e),this):(e=Math.sqrt((c-a)*(c-a)+(n-s)*(n-s)+(i-r)*(i-r)),.001>Math.abs(e)&&(e=1),this.x=(c-a)/e,this.y=(n-s)/e,this.z=(i-r)/e,this.w=Math.acos((t+o+u-1)/2),this)},min:function(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this},max:function(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this},clamp:function(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this},clampScalar:function(){var e,t;return function(r,n){return void 0===e&&(e=new c,t=new c),e.set(r,r,r,r),t.set(n,n,n,n),this.clamp(e,t)}}(),clampLength:function(e,t){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(t,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x),this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y),this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z),this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(e){return this.normalize().multiplyScalar(e)},lerp:function(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this},lerpVectors:function(e,t,r){return this.subVectors(t,e).multiplyScalar(r).add(e)},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e,t){return void 0===t&&(t=0),this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e},fromBufferAttribute:function(e,t,r){return void 0!==r&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}}),Object.assign(u.prototype,t.prototype,{isWebGLRenderTarget:!0,setSize:function(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.width=e.width,this.height=e.height,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),(h.prototype=Object.create(u.prototype)).constructor=h,h.prototype.isWebGLRenderTargetCube=!0,(l.prototype=Object.create(s.prototype)).constructor=l,l.prototype.isDataTexture=!0,(p.prototype=Object.create(s.prototype)).constructor=p,p.prototype.isCubeTexture=!0,Object.defineProperty(p.prototype,"images",{get:function(){return this.image},set:function(e){this.image=e}});var hi=new s,li=new p,pi=[],fi=[],di=new Float32Array(16),mi=new Float32Array(9);U.prototype.setValue=function(e,t){for(var r=this.seq,n=0,i=r.length;n!==i;++n){var o=r[n];o.setValue(e,t[o.id])}};var vi=/([\w\d_]+)(\])?(\[|\.)?/g;z.prototype.setValue=function(e,t,r){void 0!==(t=this.map[t])&&t.setValue(e,r,this.renderer)},z.prototype.setOptional=function(e,t,r){void 0!==(t=t[r])&&this.setValue(e,r,t)},z.upload=function(e,t,r,n){for(var i=0,o=t.length;i!==o;++i){var a=t[i],s=r[a.id];!1!==s.needsUpdate&&a.setValue(e,s.value,n)}},z.seqWithValue=function(e,t){for(var r=[],n=0,i=e.length;n!==i;++n){var o=e[n];o.id in t&&r.push(o)}return r};var gi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign($.prototype,{isColor:!0,r:1,g:1,b:1,set:function(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this},setScalar:function(e){return this.b=this.g=this.r=e,this},setHex:function(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this},setRGB:function(e,t,r){return this.r=e,this.g=t,this.b=r,this},setHSL:function(){function e(e,t,r){return 0>r&&(r+=1),1<r&&--r,r<1/6?e+6*(t-e)*r:.5>r?t:r<2/3?e+6*(t-e)*(2/3-r):e}return function(t,r,n){return t=ci.euclideanModulo(t,1),r=ci.clamp(r,0,1),n=ci.clamp(n,0,1),0===r?this.r=this.g=this.b=n:(r=.5>=n?n*(1+r):n+r-n*r,n=2*n-r,this.r=e(n,r,t+1/3),this.g=e(n,r,t),this.b=e(n,r,t-1/3)),this}}(),setStyle:function(e){function t(t){void 0!==t&&1>parseFloat(t)&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}var r;if(r=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(e)){n=r[2];switch(r[1]){case"rgb":case"rgba":if(r=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,t(r[5]),this;if(r=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,t(r[5]),this;break;case"hsl":case"hsla":if(r=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(n)){var n=parseFloat(r[1])/360,i=parseInt(r[2],10)/100,o=parseInt(r[3],10)/100;return t(r[5]),this.setHSL(n,i,o)}}}else if(r=/^\#([A-Fa-f0-9]+)$/.exec(e)){if(r=r[1],3===(n=r.length))return this.r=parseInt(r.charAt(0)+r.charAt(0),16)/255,this.g=parseInt(r.charAt(1)+r.charAt(1),16)/255,this.b=parseInt(r.charAt(2)+r.charAt(2),16)/255,this;if(6===n)return this.r=parseInt(r.charAt(0)+r.charAt(1),16)/255,this.g=parseInt(r.charAt(2)+r.charAt(3),16)/255,this.b=parseInt(r.charAt(4)+r.charAt(5),16)/255,this}return e&&0<e.length&&(void 0!==(r=gi[e])?this.setHex(r):console.warn("THREE.Color: Unknown color "+e)),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(e){return this.r=e.r,this.g=e.g,this.b=e.b,this},copyGammaToLinear:function(e,t){return void 0===t&&(t=2),this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},copyLinearToGamma:function(e,t){return void 0===t&&(t=2),t=0<t?1/t:1,this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this},convertGammaToLinear:function(){var e=this.r,t=this.g,r=this.b;return this.r=e*e,this.g=t*t,this.b=r*r,this},convertLinearToGamma:function(){return this.r=Math.sqrt(this.r),this.g=Math.sqrt(this.g),this.b=Math.sqrt(this.b),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){e=e||{h:0,s:0,l:0};var t,r=this.r,n=this.g,i=this.b,o=Math.max(r,n,i),a=((c=Math.min(r,n,i))+o)/2;if(c===o)c=t=0;else{var s=o-c,c=.5>=a?s/(o+c):s/(2-o-c);switch(o){case r:t=(n-i)/s+(n<i?6:0);break;case n:t=(i-r)/s+2;break;case i:t=(r-n)/s+4}t/=6}return e.h=t,e.s=c,e.l=a,e},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(e,t,r){var n=this.getHSL();return n.h+=e,n.s+=t,n.l+=r,this.setHSL(n.h,n.s,n.l),this},add:function(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this},addColors:function(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this},addScalar:function(e){return this.r+=e,this.g+=e,this.b+=e,this},sub:function(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this},multiply:function(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this},multiplyScalar:function(e){return this.r*=e,this.g*=e,this.b*=e,this},lerp:function(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this},equals:function(e){return e.r===this.r&&e.g===this.g&&e.b===this.b},fromArray:function(e,t){return void 0===t&&(t=0),this.r=e[t],this.g=e[t+1],this.b=e[t+2],this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e},toJSON:function(){return this.getHex()}});var yi={common:{diffuse:{value:new $(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new a},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new r(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new $(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new $(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new a}}},bi={merge:function(e){for(var t={},r=0;r<e.length;r++){var n,i=this.clone(e[r]);for(n in i)t[n]=i[n]}return t},clone:function(e){var t,r={};for(t in e){r[t]={};for(var n in e[t]){var i=e[t][n];i&&(i.isColor||i.isMatrix3||i.isMatrix4||i.isVector2||i.isVector3||i.isVector4||i.isTexture)?r[t][n]=i.clone():Array.isArray(i)?r[t][n]=i.slice():r[t][n]=i}}return r}},_i={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM            = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3(   1,   0, t.y ),\n\t\t\tvec3(   0, t.z,   0 ),\n\t\t\tvec3( t.w,   0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n",uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n"},xi={basic:{uniforms:bi.merge([yi.common,yi.specularmap,yi.envmap,yi.aomap,yi.lightmap,yi.fog]),vertexShader:_i.meshbasic_vert,fragmentShader:_i.meshbasic_frag},lambert:{uniforms:bi.merge([yi.common,yi.specularmap,yi.envmap,yi.aomap,yi.lightmap,yi.emissivemap,yi.fog,yi.lights,{emissive:{value:new $(0)}}]),vertexShader:_i.meshlambert_vert,fragmentShader:_i.meshlambert_frag},phong:{uniforms:bi.merge([yi.common,yi.specularmap,yi.envmap,yi.aomap,yi.lightmap,yi.emissivemap,yi.bumpmap,yi.normalmap,yi.displacementmap,yi.gradientmap,yi.fog,yi.lights,{emissive:{value:new $(0)},specular:{value:new $(1118481)},shininess:{value:30}}]),vertexShader:_i.meshphong_vert,fragmentShader:_i.meshphong_frag},standard:{uniforms:bi.merge([yi.common,yi.envmap,yi.aomap,yi.lightmap,yi.emissivemap,yi.bumpmap,yi.normalmap,yi.displacementmap,yi.roughnessmap,yi.metalnessmap,yi.fog,yi.lights,{emissive:{value:new $(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:_i.meshphysical_vert,fragmentShader:_i.meshphysical_frag},points:{uniforms:bi.merge([yi.points,yi.fog]),vertexShader:_i.points_vert,fragmentShader:_i.points_frag},dashed:{uniforms:bi.merge([yi.common,yi.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:_i.linedashed_vert,fragmentShader:_i.linedashed_frag},depth:{uniforms:bi.merge([yi.common,yi.displacementmap]),vertexShader:_i.depth_vert,fragmentShader:_i.depth_frag},normal:{uniforms:bi.merge([yi.common,yi.bumpmap,yi.normalmap,yi.displacementmap,{opacity:{value:1}}]),vertexShader:_i.normal_vert,fragmentShader:_i.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:_i.cube_vert,fragmentShader:_i.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:_i.equirect_vert,fragmentShader:_i.equirect_frag},distanceRGBA:{uniforms:bi.merge([yi.common,yi.displacementmap,{referencePosition:{value:new o},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:_i.distanceRGBA_vert,fragmentShader:_i.distanceRGBA_frag},shadow:{uniforms:bi.merge([yi.lights,yi.fog,{color:{value:new $(0)},opacity:{value:1}}]),vertexShader:_i.shadow_vert,fragmentShader:_i.shadow_frag}};xi.physical={uniforms:bi.merge([xi.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:_i.meshphysical_vert,fragmentShader:_i.meshphysical_frag},Object.assign(G.prototype,{set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,r=e.length;t<r;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(){var e=new r;return function(t,r){return r=e.copy(r).multiplyScalar(.5),this.min.copy(t).sub(r),this.max.copy(t).add(r),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(e){return e=e||new r,this.isEmpty()?e.set(0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return e=e||new r,this.isEmpty()?e.set(0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y},getParameter:function(e,t){return(t||new r).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y)},clampPoint:function(e,t){return(t||new r).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new r;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}),(H.prototype=Object.create(s.prototype)).constructor=H;var wi=0;Object.assign(W.prototype,t.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(e){if(void 0!==e)for(var t in e){var r=e[t];if(void 0===r)console.warn("THREE.Material: '"+t+"' parameter is undefined.");else if("shading"===t)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===r;else{var n=this[t];void 0===n?console.warn("THREE."+this.type+": '"+t+"' is not a property of this material."):n&&n.isColor?n.set(r):n&&n.isVector3&&r&&r.isVector3?n.copy(r):this[t]="overdraw"===t?Number(r):r}}},toJSON:function(e){function t(e){var t,r=[];for(t in e){var n=e[t];delete n.metadata,r.push(n)}return r}var r=void 0===e||"string"==typeof e;r&&(e={textures:{},images:{}});var n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};return n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearCoat&&(n.clearCoat=this.clearCoat),void 0!==this.clearCoatRoughness&&(n.clearCoatRoughness=this.clearCoatRoughness),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,n.reflectivity=this.reflectivity),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.size&&(n.size=this.size),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),!0===this.flatShading&&(n.flatShading=this.flatShading),0!==this.side&&(n.side=this.side),0!==this.vertexColors&&(n.vertexColors=this.vertexColors),1>this.opacity&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,0!==this.rotation&&(n.rotation=this.rotation),1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),0<this.alphaTest&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),1<this.wireframeLinewidth&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.skinning&&(n.skinning=!0),!1===this.visible&&(n.visible=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),r&&(r=t(e.textures),e=t(e.images),0<r.length&&(n.textures=r),0<e.length&&(n.images=e)),n},clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.name=e.name,this.fog=e.fog,this.lights=e.lights,this.blending=e.blending,this.side=e.side,this.flatShading=e.flatShading,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.premultipliedAlpha=e.premultipliedAlpha,this.overdraw=e.overdraw,this.visible=e.visible,this.userData=JSON.parse(JSON.stringify(e.userData)),this.clipShadows=e.clipShadows,this.clipIntersection=e.clipIntersection;r=null;if(null!==(e=e.clippingPlanes))for(var t=e.length,r=Array(t),n=0;n!==t;++n)r[n]=e[n].clone();return this.clippingPlanes=r,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),(X.prototype=Object.create(W.prototype)).constructor=X,X.prototype.isMeshDepthMaterial=!0,X.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.depthPacking=e.depthPacking,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this},(Y.prototype=Object.create(W.prototype)).constructor=Y,Y.prototype.isMeshDistanceMaterial=!0,Y.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this},Object.assign(K.prototype,{isBox3:!0,set:function(e,t){return this.min.copy(e),this.max.copy(t),this},setFromArray:function(e){for(var t=1/0,r=1/0,n=1/0,i=-1/0,o=-1/0,a=-1/0,s=0,c=e.length;s<c;s+=3){var u=e[s],h=e[s+1],l=e[s+2];u<t&&(t=u),h<r&&(r=h),l<n&&(n=l),u>i&&(i=u),h>o&&(o=h),l>a&&(a=l)}return this.min.set(t,r,n),this.max.set(i,o,a),this},setFromBufferAttribute:function(e){for(var t=1/0,r=1/0,n=1/0,i=-1/0,o=-1/0,a=-1/0,s=0,c=e.count;s<c;s++){var u=e.getX(s),h=e.getY(s),l=e.getZ(s);u<t&&(t=u),h<r&&(r=h),l<n&&(n=l),u>i&&(i=u),h>o&&(o=h),l>a&&(a=l)}return this.min.set(t,r,n),this.max.set(i,o,a),this},setFromPoints:function(e){this.makeEmpty();for(var t=0,r=e.length;t<r;t++)this.expandByPoint(e[t]);return this},setFromCenterAndSize:function(){var e=new o;return function(t,r){return r=e.copy(r).multiplyScalar(.5),this.min.copy(t).sub(r),this.max.copy(t).add(r),this}}(),setFromObject:function(e){return this.makeEmpty(),this.expandByObject(e)},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.min.copy(e.min),this.max.copy(e.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(e){return e=e||new o,this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(e){return e=e||new o,this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)},expandByPoint:function(e){return this.min.min(e),this.max.max(e),this},expandByVector:function(e){return this.min.sub(e),this.max.add(e),this},expandByScalar:function(e){return this.min.addScalar(-e),this.max.addScalar(e),this},expandByObject:function(){function e(e){var o=e.geometry;if(void 0!==o)if(o.isGeometry)for(o=o.vertices,r=0,n=o.length;r<n;r++)i.copy(o[r]),i.applyMatrix4(e.matrixWorld),t.expandByPoint(i);else if(o.isBufferGeometry&&void 0!==(o=o.attributes.position))for(r=0,n=o.count;r<n;r++)i.fromBufferAttribute(o,r).applyMatrix4(e.matrixWorld),t.expandByPoint(i)}var t,r,n,i=new o;return function(r){return t=this,r.updateMatrixWorld(!0),r.traverse(e),this}}(),containsPoint:function(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z)},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z},getParameter:function(e,t){return(t||new o).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z)},intersectsSphere:function(){var e=new o;return function(t){return this.clampPoint(t.center,e),e.distanceToSquared(t.center)<=t.radius*t.radius}}(),intersectsPlane:function(e){if(0<e.normal.x)var t=e.normal.x*this.min.x,r=e.normal.x*this.max.x;else t=e.normal.x*this.max.x,r=e.normal.x*this.min.x;return 0<e.normal.y?(t+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),0<e.normal.z?(t+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),t<=e.constant&&r>=e.constant},clampPoint:function(e,t){return(t||new o).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new o;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),getBoundingSphere:function(){var e=new o;return function(t){return t=t||new Z,this.getCenter(t.center),t.radius=.5*this.getSize(e).length(),t}}(),intersect:function(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this},union:function(e){return this.min.min(e.min),this.max.max(e.max),this},applyMatrix4:function(){var e=[new o,new o,new o,new o,new o,new o,new o,new o];return function(t){return this.isEmpty()?this:(e[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),e[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),e[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),e[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),e[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),e[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),e[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),e[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(e),this)}}(),translate:function(e){return this.min.add(e),this.max.add(e),this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}),Object.assign(Z.prototype,{set:function(e,t){return this.center.copy(e),this.radius=t,this},setFromPoints:function(){var e=new K;return function(t,r){var n=this.center;void 0!==r?n.copy(r):e.setFromPoints(t).getCenter(n);for(var i=r=0,o=t.length;i<o;i++)r=Math.max(r,n.distanceToSquared(t[i]));return this.radius=Math.sqrt(r),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.center.copy(e.center),this.radius=e.radius,this},empty:function(){return 0>=this.radius},containsPoint:function(e){return e.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(e){return e.distanceTo(this.center)-this.radius},intersectsSphere:function(e){var t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t},intersectsBox:function(e){return e.intersectsSphere(this)},intersectsPlane:function(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius},clampPoint:function(e,t){var r=this.center.distanceToSquared(e);return(t=t||new o).copy(e),r>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t},getBoundingBox:function(e){return(e=e||new K).set(this.center,this.center),e.expandByScalar(this.radius),e},applyMatrix4:function(e){return this.center.applyMatrix4(e),this.radius*=e.getMaxScaleOnAxis(),this},translate:function(e){return this.center.add(e),this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius}}),Object.assign(J.prototype,{set:function(e,t){return this.normal.copy(e),this.constant=t,this},setComponents:function(e,t,r,n){return this.normal.set(e,t,r),this.constant=n,this},setFromNormalAndCoplanarPoint:function(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this},setFromCoplanarPoints:function(){var e=new o,t=new o;return function(r,n,i){return n=e.subVectors(i,n).cross(t.subVectors(r,n)).normalize(),this.setFromNormalAndCoplanarPoint(n,r),this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.normal.copy(e.normal),this.constant=e.constant,this},normalize:function(){var e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return(t||new o).copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)},intersectLine:function(){var e=new o;return function(t,r){r=r||new o;var n=t.delta(e),i=this.normal.dot(n);if(0===i){if(0===this.distanceToPoint(t.start))return r.copy(t.start)}else if(!(0>(i=-(t.start.dot(this.normal)+this.constant)/i)||1<i))return r.copy(n).multiplyScalar(i).add(t.start)}}(),intersectsLine:function(e){var t=this.distanceToPoint(e.start);return e=this.distanceToPoint(e.end),0>t&&0<e||0>e&&0<t},intersectsBox:function(e){return e.intersectsPlane(this)},intersectsSphere:function(e){return e.intersectsPlane(this)},coplanarPoint:function(e){return(e||new o).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var e=new o,t=new a;return function(r,n){return n=n||t.getNormalMatrix(r),r=this.coplanarPoint(e).applyMatrix4(r),n=this.normal.applyMatrix3(n).normalize(),this.constant=-r.dot(n),this}}(),translate:function(e){return this.constant-=e.dot(this.normal),this},equals:function(e){return e.normal.equals(this.normal)&&e.constant===this.constant}}),Object.assign(Q.prototype,{set:function(e,t,r,n,i,o){var a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(r),a[3].copy(n),a[4].copy(i),a[5].copy(o),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){for(var t=this.planes,r=0;6>r;r++)t[r].copy(e.planes[r]);return this},setFromMatrix:function(e){var t=this.planes;e=(v=e.elements)[0];var r=v[1],n=v[2],i=v[3],o=v[4],a=v[5],s=v[6],c=v[7],u=v[8],h=v[9],l=v[10],p=v[11],f=v[12],d=v[13],m=v[14],v=v[15];return t[0].setComponents(i-e,c-o,p-u,v-f).normalize(),t[1].setComponents(i+e,c+o,p+u,v+f).normalize(),t[2].setComponents(i+r,c+a,p+h,v+d).normalize(),t[3].setComponents(i-r,c-a,p-h,v-d).normalize(),t[4].setComponents(i-n,c-s,p-l,v-m).normalize(),t[5].setComponents(i+n,c+s,p+l,v+m).normalize(),this},intersectsObject:function(){var e=new Z;return function(t){var r=t.geometry;return null===r.boundingSphere&&r.computeBoundingSphere(),e.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(e)}}(),intersectsSprite:function(){var e=new Z;return function(t){return e.center.set(0,0,0),e.radius=.7071067811865476,e.applyMatrix4(t.matrixWorld),this.intersectsSphere(e)}}(),intersectsSphere:function(e){var t=this.planes,r=e.center;e=-e.radius;for(var n=0;6>n;n++)if(t[n].distanceToPoint(r)<e)return!1;return!0},intersectsBox:function(){var e=new o,t=new o;return function(r){for(var n=this.planes,i=0;6>i;i++){a=n[i];e.x=0<a.normal.x?r.min.x:r.max.x,t.x=0<a.normal.x?r.max.x:r.min.x,e.y=0<a.normal.y?r.min.y:r.max.y,t.y=0<a.normal.y?r.max.y:r.min.y,e.z=0<a.normal.z?r.min.z:r.max.z,t.z=0<a.normal.z?r.max.z:r.min.z;var o=a.distanceToPoint(e),a=a.distanceToPoint(t);if(0>o&&0>a)return!1}return!0}}(),containsPoint:function(e){for(var t=this.planes,r=0;6>r;r++)if(0>t[r].distanceToPoint(e))return!1;return!0}}),te.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" "),te.DefaultOrder="XYZ",Object.defineProperties(te.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(e){this._y=e,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(e){this._z=e,this.onChangeCallback()}},order:{get:function(){return this._order},set:function(e){this._order=e,this.onChangeCallback()}}}),Object.assign(te.prototype,{isEuler:!0,set:function(e,t,r,n){return this._x=e,this._y=t,this._z=r,this._order=n||this._order,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this.onChangeCallback(),this},setFromRotationMatrix:function(e,t,r){var n=ci.clamp;e=(l=e.elements)[0];var i=l[4],o=l[8],a=l[1],s=l[5],c=l[9],u=l[2],h=l[6],l=l[10];return"XYZ"===(t=t||this._order)?(this._y=Math.asin(n(o,-1,1)),.99999>Math.abs(o)?(this._x=Math.atan2(-c,l),this._z=Math.atan2(-i,e)):(this._x=Math.atan2(h,s),this._z=0)):"YXZ"===t?(this._x=Math.asin(-n(c,-1,1)),.99999>Math.abs(c)?(this._y=Math.atan2(o,l),this._z=Math.atan2(a,s)):(this._y=Math.atan2(-u,e),this._z=0)):"ZXY"===t?(this._x=Math.asin(n(h,-1,1)),.99999>Math.abs(h)?(this._y=Math.atan2(-u,l),this._z=Math.atan2(-i,s)):(this._y=0,this._z=Math.atan2(a,e))):"ZYX"===t?(this._y=Math.asin(-n(u,-1,1)),.99999>Math.abs(u)?(this._x=Math.atan2(h,l),this._z=Math.atan2(a,e)):(this._x=0,this._z=Math.atan2(-i,s))):"YZX"===t?(this._z=Math.asin(n(a,-1,1)),.99999>Math.abs(a)?(this._x=Math.atan2(-c,s),this._y=Math.atan2(-u,e)):(this._x=0,this._y=Math.atan2(o,l))):"XZY"===t?(this._z=Math.asin(-n(i,-1,1)),.99999>Math.abs(i)?(this._x=Math.atan2(h,s),this._y=Math.atan2(o,e)):(this._x=Math.atan2(-c,l),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+t),this._order=t,!1!==r&&this.onChangeCallback(),this},setFromQuaternion:function(){var e=new n;return function(t,r,n){return e.makeRotationFromQuaternion(t),this.setFromRotationMatrix(e,r,n)}}(),setFromVector3:function(e,t){return this.set(e.x,e.y,e.z,t||this._order)},reorder:function(){var e=new i;return function(t){return e.setFromEuler(this),this.setFromQuaternion(e,t)}}(),equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},fromArray:function(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this.onChangeCallback(),this},toArray:function(e,t){return void 0===e&&(e=[]),void 0===t&&(t=0),e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e},toVector3:function(e){return e?e.set(this._x,this._y,this._z):new o(this._x,this._y,this._z)},onChange:function(e){return this.onChangeCallback=e,this},onChangeCallback:function(){}}),Object.assign(re.prototype,{set:function(e){this.mask=1<<e|0},enable:function(e){this.mask=this.mask|1<<e|0},toggle:function(e){this.mask^=1<<e|0},disable:function(e){this.mask&=~(1<<e|0)},test:function(e){return 0!=(this.mask&e.mask)}});var Si=0;ne.DefaultUp=new o(0,1,0),ne.DefaultMatrixAutoUpdate=!0,Object.assign(ne.prototype,t.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(e){this.matrix.multiplyMatrices(e,this.matrix),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(e){return this.quaternion.premultiply(e),this},setRotationFromAxisAngle:function(e,t){this.quaternion.setFromAxisAngle(e,t)},setRotationFromEuler:function(e){this.quaternion.setFromEuler(e,!0)},setRotationFromMatrix:function(e){this.quaternion.setFromRotationMatrix(e)},setRotationFromQuaternion:function(e){this.quaternion.copy(e)},rotateOnAxis:function(){var e=new i;return function(t,r){return e.setFromAxisAngle(t,r),this.quaternion.multiply(e),this}}(),rotateOnWorldAxis:function(){var e=new i;return function(t,r){return e.setFromAxisAngle(t,r),this.quaternion.premultiply(e),this}}(),rotateX:function(){var e=new o(1,0,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateY:function(){var e=new o(0,1,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateZ:function(){var e=new o(0,0,1);return function(t){return this.rotateOnAxis(e,t)}}(),translateOnAxis:function(){var e=new o;return function(t,r){return e.copy(t).applyQuaternion(this.quaternion),this.position.add(e.multiplyScalar(r)),this}}(),translateX:function(){var e=new o(1,0,0);return function(t){return this.translateOnAxis(e,t)}}(),translateY:function(){var e=new o(0,1,0);return function(t){return this.translateOnAxis(e,t)}}(),translateZ:function(){var e=new o(0,0,1);return function(t){return this.translateOnAxis(e,t)}}(),localToWorld:function(e){return e.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var e=new n;return function(t){return t.applyMatrix4(e.getInverse(this.matrixWorld))}}(),lookAt:function(){var e=new n,t=new o;return function(r,n,i){r.isVector3?t.copy(r):t.set(r,n,i),this.isCamera?e.lookAt(this.position,t,this.up):e.lookAt(t,this.position,this.up),this.quaternion.setFromRotationMatrix(e)}}(),add:function(e){if(1<arguments.length){for(var t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(null!==e.parent&&e.parent.remove(e),e.parent=this,e.dispatchEvent({type:"added"}),this.children.push(e)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)},remove:function(e){if(1<arguments.length){for(var t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}return-1!==(t=this.children.indexOf(e))&&(e.parent=null,e.dispatchEvent({type:"removed"}),this.children.splice(t,1)),this},getObjectById:function(e){return this.getObjectByProperty("id",e)},getObjectByName:function(e){return this.getObjectByProperty("name",e)},getObjectByProperty:function(e,t){if(this[e]===t)return this;for(var r=0,n=this.children.length;r<n;r++){var i=this.children[r].getObjectByProperty(e,t);if(void 0!==i)return i}},getWorldPosition:function(e){return e=e||new o,this.updateMatrixWorld(!0),e.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var e=new o,t=new o;return function(r){return r=r||new i,this.updateMatrixWorld(!0),this.matrixWorld.decompose(e,r,t),r}}(),getWorldRotation:function(){var e=new i;return function(t){return t=t||new te,this.getWorldQuaternion(e),t.setFromQuaternion(e,this.rotation.order,!1)}}(),getWorldScale:function(){var e=new o,t=new i;return function(r){return r=r||new o,this.updateMatrixWorld(!0),this.matrixWorld.decompose(e,t,r),r}}(),getWorldDirection:function(){var e=new i;return function(t){return t=t||new o,this.getWorldQuaternion(e),t.set(0,0,1).applyQuaternion(e)}}(),raycast:function(){},traverse:function(e){e(this);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].traverse(e)},traverseVisible:function(e){if(!1!==this.visible){e(this);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].traverseVisible(e)}},traverseAncestors:function(e){var t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0);for(var t=this.children,r=0,n=t.length;r<n;r++)t[r].updateMatrixWorld(e)},toJSON:function(e){function t(t,r){return void 0===t[r.uuid]&&(t[r.uuid]=r.toJSON(e)),r.uuid}function r(e){var t,r=[];for(t in e){var n=e[t];delete n.metadata,r.push(n)}return r}var n=void 0===e||"string"==typeof e,i={};n&&(e={geometries:{},materials:{},textures:{},images:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var o={};if(o.uuid=this.uuid,o.type=this.type,""!==this.name&&(o.name=this.name),!0===this.castShadow&&(o.castShadow=!0),!0===this.receiveShadow&&(o.receiveShadow=!0),!1===this.visible&&(o.visible=!1),"{}"!==JSON.stringify(this.userData)&&(o.userData=this.userData),o.matrix=this.matrix.toArray(),void 0!==this.geometry&&(o.geometry=t(e.geometries,this.geometry)),void 0!==this.material)if(Array.isArray(this.material)){for(var a=[],s=0,c=this.material.length;s<c;s++)a.push(t(e.materials,this.material[s]));o.material=a}else o.material=t(e.materials,this.material);if(0<this.children.length)for(o.children=[],s=0;s<this.children.length;s++)o.children.push(this.children[s].toJSON(e).object);return n&&(n=r(e.geometries),a=r(e.materials),s=r(e.textures),c=r(e.images),0<n.length&&(i.geometries=n),0<a.length&&(i.materials=a),0<s.length&&(i.textures=s),0<c.length&&(i.images=c)),i.object=o,i},clone:function(e){return(new this.constructor).copy(this,e)},copy:function(e,t){if(void 0===t&&(t=!0),this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(t=0;t<e.children.length;t++)this.add(e.children[t].clone());return this}}),ie.prototype=Object.assign(Object.create(ne.prototype),{constructor:ie,isCamera:!0,copy:function(e,t){return ne.prototype.copy.call(this,e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this},getWorldDirection:function(){var e=new i;return function(t){return t=t||new o,this.getWorldQuaternion(e),t.set(0,0,-1).applyQuaternion(e)}}(),updateMatrixWorld:function(e){ne.prototype.updateMatrixWorld.call(this,e),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),oe.prototype=Object.assign(Object.create(ie.prototype),{constructor:oe,isOrthographicCamera:!0,copy:function(e,t){return ie.prototype.copy.call(this,e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this},setViewOffset:function(e,t,r,n,i,o){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=r,this.view.offsetY=n,this.view.width=i,this.view.height=o,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),r=(n=(this.right+this.left)/2)-e,n=n+e,e=(o=(this.top+this.bottom)/2)+t,t=o-t;if(null!==this.view&&this.view.enabled)var n=this.zoom/(this.view.width/this.view.fullWidth),t=this.zoom/(this.view.height/this.view.fullHeight),i=(this.right-this.left)/this.view.width,o=(this.top-this.bottom)/this.view.height,r=r+this.view.offsetX/n*i,n=r+this.view.width/n*i,e=e-this.view.offsetY/t*o,t=e-this.view.height/t*o;this.projectionMatrix.makeOrthographic(r,n,e,t,this.near,this.far)},toJSON:function(e){return e=ne.prototype.toJSON.call(this,e),e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}),Object.assign(ae.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(e){this.a=e.a,this.b=e.b,this.c=e.c,this.normal.copy(e.normal),this.color.copy(e.color),this.materialIndex=e.materialIndex;for(var t=0,r=e.vertexNormals.length;t<r;t++)this.vertexNormals[t]=e.vertexNormals[t].clone();for(t=0,r=e.vertexColors.length;t<r;t++)this.vertexColors[t]=e.vertexColors[t].clone();return this}});var Mi=0;Object.assign(se.prototype,t.prototype,{isGeometry:!0,applyMatrix:function(e){for(var t=(new a).getNormalMatrix(e),r=0,n=this.vertices.length;r<n;r++)this.vertices[r].applyMatrix4(e);for(r=0,n=this.faces.length;r<n;r++){(e=this.faces[r]).normal.applyMatrix3(t).normalize();for(var i=0,o=e.vertexNormals.length;i<o;i++)e.vertexNormals[i].applyMatrix3(t).normalize()}return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.normalsNeedUpdate=this.verticesNeedUpdate=!0,this},rotateX:function(){var e=new n;return function(t){return e.makeRotationX(t),this.applyMatrix(e),this}}(),rotateY:function(){var e=new n;return function(t){return e.makeRotationY(t),this.applyMatrix(e),this}}(),rotateZ:function(){var e=new n;return function(t){return e.makeRotationZ(t),this.applyMatrix(e),this}}(),translate:function(){var e=new n;return function(t,r,n){return e.makeTranslation(t,r,n),this.applyMatrix(e),this}}(),scale:function(){var e=new n;return function(t,r,n){return e.makeScale(t,r,n),this.applyMatrix(e),this}}(),lookAt:function(){var e=new ne;return function(t){e.lookAt(t),e.updateMatrix(),this.applyMatrix(e.matrix)}}(),fromBufferGeometry:function(e){function t(e,t,r,i){i=new ae(e,t,r,void 0!==c?[p[e].clone(),p[t].clone(),p[r].clone()]:[],void 0!==u?[n.colors[e].clone(),n.colors[t].clone(),n.colors[r].clone()]:[],i),n.faces.push(i),void 0!==h&&n.faceVertexUvs[0].push([f[e].clone(),f[t].clone(),f[r].clone()]),void 0!==l&&n.faceVertexUvs[1].push([d[e].clone(),d[t].clone(),d[r].clone()])}var n=this,i=null!==e.index?e.index.array:void 0,a=e.attributes,s=a.position.array,c=void 0!==a.normal?a.normal.array:void 0,u=void 0!==a.color?a.color.array:void 0,h=void 0!==a.uv?a.uv.array:void 0,l=void 0!==a.uv2?a.uv2.array:void 0;void 0!==l&&(this.faceVertexUvs[1]=[]);for(var p=[],f=[],d=[],m=a=0;a<s.length;a+=3,m+=2)n.vertices.push(new o(s[a],s[a+1],s[a+2])),void 0!==c&&p.push(new o(c[a],c[a+1],c[a+2])),void 0!==u&&n.colors.push(new $(u[a],u[a+1],u[a+2])),void 0!==h&&f.push(new r(h[m],h[m+1])),void 0!==l&&d.push(new r(l[m],l[m+1]));var v=e.groups;if(0<v.length)for(a=0;a<v.length;a++)for(var s=v[a],g=s.start,y=s.count,m=g,g=g+y;m<g;m+=3)void 0!==i?t(i[m],i[m+1],i[m+2],s.materialIndex):t(m,m+1,m+2,s.materialIndex);else if(void 0!==i)for(a=0;a<i.length;a+=3)t(i[a],i[a+1],i[a+2]);else for(a=0;a<s.length/3;a+=3)t(a,a+1,a+2);return this.computeFaceNormals(),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),this},center:function(){this.computeBoundingBox();var e=this.boundingBox.getCenter().negate();return this.translate(e.x,e.y,e.z),e},normalize:function(){this.computeBoundingSphere();var e=this.boundingSphere.center,t=0===(t=this.boundingSphere.radius)?1:1/t,r=new n;return r.set(t,0,0,-t*e.x,0,t,0,-t*e.y,0,0,t,-t*e.z,0,0,0,1),this.applyMatrix(r),this},computeFaceNormals:function(){for(var e=new o,t=new o,r=0,n=this.faces.length;r<n;r++){var i=this.faces[r],a=this.vertices[i.a],s=this.vertices[i.b];e.subVectors(this.vertices[i.c],s),t.subVectors(a,s),e.cross(t),e.normalize(),i.normal.copy(e)}},computeVertexNormals:function(e){void 0===e&&(e=!0);var t,r=Array(this.vertices.length),n=0;for(t=this.vertices.length;n<t;n++)r[n]=new o;if(e){var i=new o,a=new o;for(e=0,n=this.faces.length;e<n;e++){t=this.faces[e];var s=this.vertices[t.a],c=this.vertices[t.b],u=this.vertices[t.c];i.subVectors(u,c),a.subVectors(s,c),i.cross(a),r[t.a].add(i),r[t.b].add(i),r[t.c].add(i)}}else for(this.computeFaceNormals(),e=0,n=this.faces.length;e<n;e++)t=this.faces[e],r[t.a].add(t.normal),r[t.b].add(t.normal),r[t.c].add(t.normal);for(n=0,t=this.vertices.length;n<t;n++)r[n].normalize();for(e=0,n=this.faces.length;e<n;e++)t=this.faces[e],3===(s=t.vertexNormals).length?(s[0].copy(r[t.a]),s[1].copy(r[t.b]),s[2].copy(r[t.c])):(s[0]=r[t.a].clone(),s[1]=r[t.b].clone(),s[2]=r[t.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var e;this.computeFaceNormals();var t=0;for(e=this.faces.length;t<e;t++){var r=this.faces[t],n=r.vertexNormals;3===n.length?(n[0].copy(r.normal),n[1].copy(r.normal),n[2].copy(r.normal)):(n[0]=r.normal.clone(),n[1]=r.normal.clone(),n[2]=r.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var e,t,r=0;for(t=this.faces.length;r<t;r++){var n=this.faces[r];n.__originalFaceNormal?n.__originalFaceNormal.copy(n.normal):n.__originalFaceNormal=n.normal.clone(),n.__originalVertexNormals||(n.__originalVertexNormals=[]);var i=0;for(e=n.vertexNormals.length;i<e;i++)n.__originalVertexNormals[i]?n.__originalVertexNormals[i].copy(n.vertexNormals[i]):n.__originalVertexNormals[i]=n.vertexNormals[i].clone()}var a=new se;for(a.faces=this.faces,i=0,e=this.morphTargets.length;i<e;i++){if(!this.morphNormals[i]){this.morphNormals[i]={},this.morphNormals[i].faceNormals=[],this.morphNormals[i].vertexNormals=[],n=this.morphNormals[i].faceNormals;var s=this.morphNormals[i].vertexNormals;for(r=0,t=this.faces.length;r<t;r++){var c=new o,u={a:new o,b:new o,c:new o};n.push(c),s.push(u)}}for(s=this.morphNormals[i],a.vertices=this.morphTargets[i].vertices,a.computeFaceNormals(),a.computeVertexNormals(),r=0,t=this.faces.length;r<t;r++)n=this.faces[r],c=s.faceNormals[r],u=s.vertexNormals[r],c.copy(n.normal),u.a.copy(n.vertexNormals[0]),u.b.copy(n.vertexNormals[1]),u.c.copy(n.vertexNormals[2])}for(r=0,t=this.faces.length;r<t;r++)n=this.faces[r],n.normal=n.__originalFaceNormal,n.vertexNormals=n.__originalVertexNormals},computeLineDistances:function(){for(var e=0,t=this.vertices,r=0,n=t.length;r<n;r++)0<r&&(e+=t[r].distanceTo(t[r-1])),this.lineDistances[r]=e},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new K),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Z),this.boundingSphere.setFromPoints(this.vertices)},merge:function(e,t,r){if(e&&e.isGeometry){var n,i=this.vertices.length,o=this.vertices,s=e.vertices,c=this.faces,u=e.faces,h=this.faceVertexUvs[0],l=e.faceVertexUvs[0],p=this.colors,f=e.colors;void 0===r&&(r=0),void 0!==t&&(n=(new a).getNormalMatrix(t)),e=0;for(var d=s.length;e<d;e++){var m=s[e].clone();void 0!==t&&m.applyMatrix4(t),o.push(m)}for(e=0,d=f.length;e<d;e++)p.push(f[e].clone());for(e=0,d=u.length;e<d;e++){var v=(s=u[e]).vertexNormals,f=s.vertexColors;for((p=new ae(s.a+i,s.b+i,s.c+i)).normal.copy(s.normal),void 0!==n&&p.normal.applyMatrix3(n).normalize(),t=0,o=v.length;t<o;t++)m=v[t].clone(),void 0!==n&&m.applyMatrix3(n).normalize(),p.vertexNormals.push(m);for(p.color.copy(s.color),t=0,o=f.length;t<o;t++)m=f[t],p.vertexColors.push(m.clone());p.materialIndex=s.materialIndex+r,c.push(p)}for(e=0,d=l.length;e<d;e++)if(r=l[e],n=[],void 0!==r){for(t=0,o=r.length;t<o;t++)n.push(r[t].clone());h.push(n)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",e)},mergeMesh:function(e){e&&e.isMesh?(e.matrixAutoUpdate&&e.updateMatrix(),this.merge(e.geometry,e.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",e)},mergeVertices:function(){var e,t={},r=[],n=[],i=Math.pow(10,4),o=0;for(e=this.vertices.length;o<e;o++){var a=this.vertices[o];void 0===t[a=Math.round(a.x*i)+"_"+Math.round(a.y*i)+"_"+Math.round(a.z*i)]?(t[a]=o,r.push(this.vertices[o]),n[o]=r.length-1):n[o]=n[t[a]]}for(t=[],o=0,e=this.faces.length;o<e;o++)for(i=this.faces[o],i.a=n[i.a],i.b=n[i.b],i.c=n[i.c],i=[i.a,i.b,i.c],a=0;3>a;a++)if(i[a]===i[(a+1)%3]){t.push(o);break}for(o=t.length-1;0<=o;o--)for(i=t[o],this.faces.splice(i,1),n=0,e=this.faceVertexUvs.length;n<e;n++)this.faceVertexUvs[n].splice(i,1);return o=this.vertices.length-r.length,this.vertices=r,o},setFromPoints:function(e){this.vertices=[];for(var t=0,r=e.length;t<r;t++){var n=e[t];this.vertices.push(new o(n.x,n.y,n.z||0))}return this},sortFacesByMaterialIndex:function(){for(var e=this.faces,t=e.length,r=0;r<t;r++)e[r]._id=r;e.sort(function(e,t){return e.materialIndex-t.materialIndex});var n,i,o=this.faceVertexUvs[0],a=this.faceVertexUvs[1];for(o&&o.length===t&&(n=[]),a&&a.length===t&&(i=[]),r=0;r<t;r++){var s=e[r]._id;n&&n.push(o[s]),i&&i.push(a[s])}n&&(this.faceVertexUvs[0]=n),i&&(this.faceVertexUvs[1]=i)},toJSON:function(){function e(e,t,r){return r?e|1<<t:e&~(1<<t)}function t(e){var t=e.x.toString()+e.y.toString()+e.z.toString();return void 0!==u[t]?u[t]:(u[t]=c.length/3,c.push(e.x,e.y,e.z),u[t])}function r(e){var t=e.r.toString()+e.g.toString()+e.b.toString();return void 0!==l[t]?l[t]:(l[t]=h.length,h.push(e.getHex()),l[t])}function n(e){var t=e.x.toString()+e.y.toString();return void 0!==f[t]?f[t]:(f[t]=p.length/2,p.push(e.x,e.y),f[t])}var i={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),void 0!==this.parameters){var o,a=this.parameters;for(o in a)void 0!==a[o]&&(i[o]=a[o]);return i}for(a=[],o=0;o<this.vertices.length;o++){s=this.vertices[o];a.push(s.x,s.y,s.z)}var s=[],c=[],u={},h=[],l={},p=[],f={};for(o=0;o<this.faces.length;o++){var d=this.faces[o],m=void 0!==this.faceVertexUvs[0][o],v=0<d.normal.length(),g=0<d.vertexNormals.length,y=1!==d.color.r||1!==d.color.g||1!==d.color.b,b=0<d.vertexColors.length,_=e(_=e(_=e(_=e(_=e(_=e(_=e(_=e(_=0,0,0),1,!0),2,!1),3,m),4,v),5,g),6,y),7,b);s.push(_),s.push(d.a,d.b,d.c),s.push(d.materialIndex),m&&(m=this.faceVertexUvs[0][o],s.push(n(m[0]),n(m[1]),n(m[2]))),v&&s.push(t(d.normal)),g&&(v=d.vertexNormals,s.push(t(v[0]),t(v[1]),t(v[2]))),y&&s.push(r(d.color)),b&&(d=d.vertexColors,s.push(r(d[0]),r(d[1]),r(d[2])))}return i.data={},i.data.vertices=a,i.data.normals=c,0<h.length&&(i.data.colors=h),0<p.length&&(i.data.uvs=[p]),i.data.faces=s,i},clone:function(){return(new se).copy(this)},copy:function(e){var t,r,n;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingSphere=this.boundingBox=null,this.name=e.name;var i=e.vertices,o=0;for(t=i.length;o<t;o++)this.vertices.push(i[o].clone());for(o=0,t=(i=e.colors).length;o<t;o++)this.colors.push(i[o].clone());for(o=0,t=(i=e.faces).length;o<t;o++)this.faces.push(i[o].clone());for(o=0,t=e.faceVertexUvs.length;o<t;o++){var a=e.faceVertexUvs[o];for(void 0===this.faceVertexUvs[o]&&(this.faceVertexUvs[o]=[]),i=0,r=a.length;i<r;i++){var s=a[i],c=[],u=0;for(n=s.length;u<n;u++)c.push(s[u].clone());this.faceVertexUvs[o].push(c)}}for(o=0,t=(u=e.morphTargets).length;o<t;o++){if(n={},n.name=u[o].name,void 0!==u[o].vertices)for(n.vertices=[],i=0,r=u[o].vertices.length;i<r;i++)n.vertices.push(u[o].vertices[i].clone());if(void 0!==u[o].normals)for(n.normals=[],i=0,r=u[o].normals.length;i<r;i++)n.normals.push(u[o].normals[i].clone());this.morphTargets.push(n)}for(o=0,t=(u=e.morphNormals).length;o<t;o++){if(n={},void 0!==u[o].vertexNormals)for(n.vertexNormals=[],i=0,r=u[o].vertexNormals.length;i<r;i++)a=u[o].vertexNormals[i],s={},s.a=a.a.clone(),s.b=a.b.clone(),s.c=a.c.clone(),n.vertexNormals.push(s);if(void 0!==u[o].faceNormals)for(n.faceNormals=[],i=0,r=u[o].faceNormals.length;i<r;i++)n.faceNormals.push(u[o].faceNormals[i].clone());this.morphNormals.push(n)}for(o=0,t=(i=e.skinWeights).length;o<t;o++)this.skinWeights.push(i[o].clone());for(o=0,t=(i=e.skinIndices).length;o<t;o++)this.skinIndices.push(i[o].clone());for(o=0,t=(i=e.lineDistances).length;o<t;o++)this.lineDistances.push(i[o]);return null!==(o=e.boundingBox)&&(this.boundingBox=o.clone()),null!==(o=e.boundingSphere)&&(this.boundingSphere=o.clone()),this.elementsNeedUpdate=e.elementsNeedUpdate,this.verticesNeedUpdate=e.verticesNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.lineDistancesNeedUpdate=e.lineDistancesNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(ce.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(ce.prototype,{isBufferAttribute:!0,setArray:function(e){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==e?e.length/this.itemSize:0,this.array=e},setDynamic:function(e){return this.dynamic=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.dynamic=e.dynamic,this},copyAt:function(e,t,r){e*=this.itemSize,r*=t.itemSize;for(var n=0,i=this.itemSize;n<i;n++)this.array[e+n]=t.array[r+n];return this},copyArray:function(e){return this.array.set(e),this},copyColorsArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];void 0===o&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),o=new $),t[r++]=o.r,t[r++]=o.g,t[r++]=o.b}return this},copyIndicesArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];t[r++]=o.a,t[r++]=o.b,t[r++]=o.c}return this},copyVector2sArray:function(e){for(var t=this.array,n=0,i=0,o=e.length;i<o;i++){var a=e[i];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),a=new r),t[n++]=a.x,t[n++]=a.y}return this},copyVector3sArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var a=e[n];void 0===a&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),a=new o),t[r++]=a.x,t[r++]=a.y,t[r++]=a.z}return this},copyVector4sArray:function(e){for(var t=this.array,r=0,n=0,i=e.length;n<i;n++){var o=e[n];void 0===o&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),o=new c),t[r++]=o.x,t[r++]=o.y,t[r++]=o.z,t[r++]=o.w}return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},getX:function(e){return this.array[e*this.itemSize]},setX:function(e,t){return this.array[e*this.itemSize]=t,this},getY:function(e){return this.array[e*this.itemSize+1]},setY:function(e,t){return this.array[e*this.itemSize+1]=t,this},getZ:function(e){return this.array[e*this.itemSize+2]},setZ:function(e,t){return this.array[e*this.itemSize+2]=t,this},getW:function(e){return this.array[e*this.itemSize+3]},setW:function(e,t){return this.array[e*this.itemSize+3]=t,this},setXY:function(e,t,r){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this},setXYZ:function(e,t,r,n){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this.array[e+2]=n,this},setXYZW:function(e,t,r,n,i){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=r,this.array[e+2]=n,this.array[e+3]=i,this},onUpload:function(e){return this.onUploadCallback=e,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)}}),(ue.prototype=Object.create(ce.prototype)).constructor=ue,(he.prototype=Object.create(ce.prototype)).constructor=he,(le.prototype=Object.create(ce.prototype)).constructor=le,(pe.prototype=Object.create(ce.prototype)).constructor=pe,(fe.prototype=Object.create(ce.prototype)).constructor=fe,(de.prototype=Object.create(ce.prototype)).constructor=de,(me.prototype=Object.create(ce.prototype)).constructor=me,(ve.prototype=Object.create(ce.prototype)).constructor=ve,(ge.prototype=Object.create(ce.prototype)).constructor=ge,Object.assign(ye.prototype,{computeGroups:function(e){var t=[],r=void 0;e=e.faces;for(var n=0;n<e.length;n++){var i=e[n];if(i.materialIndex!==r){r=i.materialIndex,void 0!==o&&(o.count=3*n-o.start,t.push(o));var o={start:3*n,materialIndex:r}}}void 0!==o&&(o.count=3*n-o.start,t.push(o)),this.groups=t},fromGeometry:function(e){var t=e.faces,n=e.vertices,i=e.faceVertexUvs,o=i[0]&&0<i[0].length,a=i[1]&&0<i[1].length,s=e.morphTargets,c=s.length;if(0<c){for(var u=[],h=0;h<c;h++)u[h]=[];this.morphTargets.position=u}var l=e.morphNormals,p=l.length;if(0<p){var f=[];for(h=0;h<p;h++)f[h]=[];this.morphTargets.normal=f}for(var d=e.skinIndices,m=e.skinWeights,v=d.length===n.length,g=m.length===n.length,h=0;h<t.length;h++){var y=t[h];this.vertices.push(n[y.a],n[y.b],n[y.c]);var b=y.vertexNormals;for(3===b.length?this.normals.push(b[0],b[1],b[2]):(b=y.normal,this.normals.push(b,b,b)),3===(b=y.vertexColors).length?this.colors.push(b[0],b[1],b[2]):(b=y.color,this.colors.push(b,b,b)),!0===o&&(void 0!==(b=i[0][h])?this.uvs.push(b[0],b[1],b[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",h),this.uvs.push(new r,new r,new r))),!0===a&&(void 0!==(b=i[1][h])?this.uvs2.push(b[0],b[1],b[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",h),this.uvs2.push(new r,new r,new r))),b=0;b<c;b++){var _=s[b].vertices;u[b].push(_[y.a],_[y.b],_[y.c])}for(b=0;b<p;b++)_=l[b].vertexNormals[h],f[b].push(_.a,_.b,_.c);v&&this.skinIndices.push(d[y.a],d[y.b],d[y.c]),g&&this.skinWeights.push(m[y.a],m[y.b],m[y.c])}return this.computeGroups(e),this.verticesNeedUpdate=e.verticesNeedUpdate,this.normalsNeedUpdate=e.normalsNeedUpdate,this.colorsNeedUpdate=e.colorsNeedUpdate,this.uvsNeedUpdate=e.uvsNeedUpdate,this.groupsNeedUpdate=e.groupsNeedUpdate,this}});var Ei=1;Object.assign(_e.prototype,t.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(e){Array.isArray(e)?this.index=new(65535<be(e)?me:fe)(e,1):this.index=e},addAttribute:function(e,t,r){if(t&&t.isBufferAttribute||t&&t.isInterleavedBufferAttribute){if("index"!==e)return this.attributes[e]=t,this;console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(t)}else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(e,new ce(t,r))},getAttribute:function(e){return this.attributes[e]},removeAttribute:function(e){return delete this.attributes[e],this},addGroup:function(e,t,r){this.groups.push({start:e,count:t,materialIndex:void 0!==r?r:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(e,t){this.drawRange.start=e,this.drawRange.count=t},applyMatrix:function(e){var t=this.attributes.position;return void 0!==t&&(e.applyToBufferAttribute(t),t.needsUpdate=!0),void 0!==(t=this.attributes.normal)&&((new a).getNormalMatrix(e).applyToBufferAttribute(t),t.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(){var e=new n;return function(t){return e.makeRotationX(t),this.applyMatrix(e),this}}(),rotateY:function(){var e=new n;return function(t){return e.makeRotationY(t),this.applyMatrix(e),this}}(),rotateZ:function(){var e=new n;return function(t){return e.makeRotationZ(t),this.applyMatrix(e),this}}(),translate:function(){var e=new n;return function(t,r,n){return e.makeTranslation(t,r,n),this.applyMatrix(e),this}}(),scale:function(){var e=new n;return function(t,r,n){return e.makeScale(t,r,n),this.applyMatrix(e),this}}(),lookAt:function(){var e=new ne;return function(t){e.lookAt(t),e.updateMatrix(),this.applyMatrix(e.matrix)}}(),center:function(){this.computeBoundingBox();var e=this.boundingBox.getCenter().negate();return this.translate(e.x,e.y,e.z),e},setFromObject:function(e){var t=e.geometry;if(e.isPoints||e.isLine){e=new ve(3*t.vertices.length,3);var r=new ve(3*t.colors.length,3);this.addAttribute("position",e.copyVector3sArray(t.vertices)),this.addAttribute("color",r.copyColorsArray(t.colors)),t.lineDistances&&t.lineDistances.length===t.vertices.length&&(e=new ve(t.lineDistances.length,1),this.addAttribute("lineDistance",e.copyArray(t.lineDistances))),null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone())}else e.isMesh&&t&&t.isGeometry&&this.fromGeometry(t);return this},setFromPoints:function(e){for(var t=[],r=0,n=e.length;r<n;r++){var i=e[r];t.push(i.x,i.y,i.z||0)}return this.addAttribute("position",new ve(t,3)),this},updateFromObject:function(e){var t=e.geometry;if(e.isMesh){var r=t.__directGeometry;if(!0===t.elementsNeedUpdate&&(r=void 0,t.elementsNeedUpdate=!1),void 0===r)return this.fromGeometry(t);r.verticesNeedUpdate=t.verticesNeedUpdate,r.normalsNeedUpdate=t.normalsNeedUpdate,r.colorsNeedUpdate=t.colorsNeedUpdate,r.uvsNeedUpdate=t.uvsNeedUpdate,r.groupsNeedUpdate=t.groupsNeedUpdate,t.verticesNeedUpdate=!1,t.normalsNeedUpdate=!1,t.colorsNeedUpdate=!1,t.uvsNeedUpdate=!1,t.groupsNeedUpdate=!1,t=r}return!0===t.verticesNeedUpdate&&(void 0!==(r=this.attributes.position)&&(r.copyVector3sArray(t.vertices),r.needsUpdate=!0),t.verticesNeedUpdate=!1),!0===t.normalsNeedUpdate&&(void 0!==(r=this.attributes.normal)&&(r.copyVector3sArray(t.normals),r.needsUpdate=!0),t.normalsNeedUpdate=!1),!0===t.colorsNeedUpdate&&(void 0!==(r=this.attributes.color)&&(r.copyColorsArray(t.colors),r.needsUpdate=!0),t.colorsNeedUpdate=!1),t.uvsNeedUpdate&&(void 0!==(r=this.attributes.uv)&&(r.copyVector2sArray(t.uvs),r.needsUpdate=!0),t.uvsNeedUpdate=!1),t.lineDistancesNeedUpdate&&(void 0!==(r=this.attributes.lineDistance)&&(r.copyArray(t.lineDistances),r.needsUpdate=!0),t.lineDistancesNeedUpdate=!1),t.groupsNeedUpdate&&(t.computeGroups(e.geometry),this.groups=t.groups,t.groupsNeedUpdate=!1),this},fromGeometry:function(e){return e.__directGeometry=(new ye).fromGeometry(e),this.fromDirectGeometry(e.__directGeometry)},fromDirectGeometry:function(e){r=new Float32Array(3*e.vertices.length);this.addAttribute("position",new ce(r,3).copyVector3sArray(e.vertices)),0<e.normals.length&&(r=new Float32Array(3*e.normals.length),this.addAttribute("normal",new ce(r,3).copyVector3sArray(e.normals))),0<e.colors.length&&(r=new Float32Array(3*e.colors.length),this.addAttribute("color",new ce(r,3).copyColorsArray(e.colors))),0<e.uvs.length&&(r=new Float32Array(2*e.uvs.length),this.addAttribute("uv",new ce(r,2).copyVector2sArray(e.uvs))),0<e.uvs2.length&&(r=new Float32Array(2*e.uvs2.length),this.addAttribute("uv2",new ce(r,2).copyVector2sArray(e.uvs2))),0<e.indices.length&&(r=new(65535<be(e.indices)?Uint32Array:Uint16Array)(3*e.indices.length),this.setIndex(new ce(r,1).copyIndicesArray(e.indices))),this.groups=e.groups;for(var t in e.morphTargets){for(var r=[],n=e.morphTargets[t],i=0,o=n.length;i<o;i++){var a=n[i],s=new ve(3*a.length,3);r.push(s.copyVector3sArray(a))}this.morphAttributes[t]=r}return 0<e.skinIndices.length&&(t=new ve(4*e.skinIndices.length,4),this.addAttribute("skinIndex",t.copyVector4sArray(e.skinIndices))),0<e.skinWeights.length&&(t=new ve(4*e.skinWeights.length,4),this.addAttribute("skinWeight",t.copyVector4sArray(e.skinWeights))),null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new K);var e=this.attributes.position;void 0!==e?this.boundingBox.setFromBufferAttribute(e):this.boundingBox.makeEmpty(),(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var e=new K,t=new o;return function(){null===this.boundingSphere&&(this.boundingSphere=new Z);var r=this.attributes.position;if(r){var n=this.boundingSphere.center;e.setFromBufferAttribute(r),e.getCenter(n);for(var i=0,o=0,a=r.count;o<a;o++)t.x=r.getX(o),t.y=r.getY(o),t.z=r.getZ(o),i=Math.max(i,n.distanceToSquared(t));this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var e=this.index,t=this.attributes,r=this.groups;if(t.position){var n=t.position.array;if(void 0===t.normal)this.addAttribute("normal",new ce(new Float32Array(n.length),3));else for(var i=t.normal.array,a=0,s=i.length;a<s;a++)i[a]=0;var i=t.normal.array,c=new o,u=new o,h=new o,l=new o,p=new o;if(e){e=e.array,0===r.length&&this.addGroup(0,e.length);for(var f=0,d=r.length;f<d;++f){s=(a=r[f]).start;var m=a.count;for(a=s,s+=m;a<s;a+=3){m=3*e[a+0];var v=3*e[a+1],g=3*e[a+2];c.fromArray(n,m),u.fromArray(n,v),h.fromArray(n,g),l.subVectors(h,u),p.subVectors(c,u),l.cross(p),i[m]+=l.x,i[m+1]+=l.y,i[m+2]+=l.z,i[v]+=l.x,i[v+1]+=l.y,i[v+2]+=l.z,i[g]+=l.x,i[g+1]+=l.y,i[g+2]+=l.z}}}else for(a=0,s=n.length;a<s;a+=9)c.fromArray(n,a),u.fromArray(n,a+3),h.fromArray(n,a+6),l.subVectors(h,u),p.subVectors(c,u),l.cross(p),i[a]=l.x,i[a+1]=l.y,i[a+2]=l.z,i[a+3]=l.x,i[a+4]=l.y,i[a+5]=l.z,i[a+6]=l.x,i[a+7]=l.y,i[a+8]=l.z;this.normalizeNormals(),t.normal.needsUpdate=!0}},merge:function(e,t){if(e&&e.isBufferGeometry){void 0===t&&(t=0);var r,n=this.attributes;for(r in n)if(void 0!==e.attributes[r])for(var i=n[r].array,o=e.attributes[r],a=o.array,s=0,o=o.itemSize*t;s<a.length;s++,o++)i[o]=a[s];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",e)},normalizeNormals:function(){var e=new o;return function(){for(var t=this.attributes.normal,r=0,n=t.count;r<n;r++)e.x=t.getX(r),e.y=t.getY(r),e.z=t.getZ(r),e.normalize(),t.setXYZ(r,e.x,e.y,e.z)}}(),toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var e,t=new _e,r=this.index.array,n=this.attributes;for(e in n){for(var i,o=(a=n[e]).array,a=a.itemSize,s=new o.constructor(r.length*a),c=0,u=0,h=r.length;u<h;u++){i=r[u]*a;for(var l=0;l<a;l++)s[c++]=o[i++]}t.addAttribute(e,new ce(s,a))}return t},toJSON:function(){var e={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),void 0!==this.parameters){var t=this.parameters;for(var r in t)void 0!==t[r]&&(e[r]=t[r]);return e}e.data={attributes:{}};var n=this.index;null!==n&&(t=Array.prototype.slice.call(n.array),e.data.index={type:n.array.constructor.name,array:t}),n=this.attributes;for(r in n){var i=n[r];t=Array.prototype.slice.call(i.array),e.data.attributes[r]={itemSize:i.itemSize,type:i.array.constructor.name,array:t,normalized:i.normalized}}return 0<(r=this.groups).length&&(e.data.groups=JSON.parse(JSON.stringify(r))),null!==(r=this.boundingSphere)&&(e.data.boundingSphere={center:r.center.toArray(),radius:r.radius}),e},clone:function(){return(new _e).copy(this)},copy:function(e){var t;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingSphere=this.boundingBox=null,this.name=e.name;var r=e.index;null!==r&&this.setIndex(r.clone()),r=e.attributes;for(a in r)this.addAttribute(a,r[a].clone());var n=e.morphAttributes;for(a in n){var i=[],o=n[a];for(r=0,t=o.length;r<t;r++)i.push(o[r].clone());this.morphAttributes[a]=i}var a=e.groups;for(r=0,t=a.length;r<t;r++)n=a[r],this.addGroup(n.start,n.count,n.materialIndex);return null!==(a=e.boundingBox)&&(this.boundingBox=a.clone()),null!==(a=e.boundingSphere)&&(this.boundingSphere=a.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),(xe.prototype=Object.create(se.prototype)).constructor=xe,(we.prototype=Object.create(_e.prototype)).constructor=we,(Se.prototype=Object.create(se.prototype)).constructor=Se,(Me.prototype=Object.create(_e.prototype)).constructor=Me,(Ee.prototype=Object.create(W.prototype)).constructor=Ee,Ee.prototype.isMeshBasicMaterial=!0,Ee.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this},(Ce.prototype=Object.create(W.prototype)).constructor=Ce,Ce.prototype.isShaderMaterial=!0,Ce.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=bi.clone(e.uniforms),this.defines=e.defines,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.lights=e.lights,this.clipping=e.clipping,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this.extensions=e.extensions,this},Ce.prototype.toJSON=function(e){return e=W.prototype.toJSON.call(this,e),e.uniforms=this.uniforms,e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e},Object.assign(Te.prototype,{set:function(e,t){return this.origin.copy(e),this.direction.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this},at:function(e,t){return(t||new o).copy(this.direction).multiplyScalar(e).add(this.origin)},lookAt:function(e){return this.direction.copy(e).sub(this.origin).normalize(),this},recast:function(){var e=new o;return function(t){return this.origin.copy(this.at(t,e)),this}}(),closestPointToPoint:function(e,t){return(t=t||new o).subVectors(e,this.origin),0>(e=t.dot(this.direction))?t.copy(this.origin):t.copy(this.direction).multiplyScalar(e).add(this.origin)},distanceToPoint:function(e){return Math.sqrt(this.distanceSqToPoint(e))},distanceSqToPoint:function(){var e=new o;return function(t){var r=e.subVectors(t,this.origin).dot(this.direction);return 0>r?this.origin.distanceToSquared(t):(e.copy(this.direction).multiplyScalar(r).add(this.origin),e.distanceToSquared(t))}}(),distanceSqToSegment:function(){var e=new o,t=new o,r=new o;return function(n,i,o,a){e.copy(n).add(i).multiplyScalar(.5),t.copy(i).sub(n).normalize(),r.copy(this.origin).sub(e);var s=.5*n.distanceTo(i),c=-this.direction.dot(t),u=r.dot(this.direction),h=-r.dot(t),l=r.lengthSq(),p=Math.abs(1-c*c);if(0<p){i=c*u-h;var f=s*p;0<=(n=c*h-u)?i>=-f?i<=f?(s=1/p,n*=s,i*=s,c=n*(n+c*i+2*u)+i*(c*n+i+2*h)+l):(i=s,n=Math.max(0,-(c*i+u)),c=-n*n+i*(i+2*h)+l):(i=-s,n=Math.max(0,-(c*i+u)),c=-n*n+i*(i+2*h)+l):i<=-f?(n=Math.max(0,-(-c*s+u)),i=0<n?-s:Math.min(Math.max(-s,-h),s),c=-n*n+i*(i+2*h)+l):i<=f?(n=0,i=Math.min(Math.max(-s,-h),s),c=i*(i+2*h)+l):(n=Math.max(0,-(c*s+u)),i=0<n?s:Math.min(Math.max(-s,-h),s),c=-n*n+i*(i+2*h)+l)}else i=0<c?-s:s,n=Math.max(0,-(c*i+u)),c=-n*n+i*(i+2*h)+l;return o&&o.copy(this.direction).multiplyScalar(n).add(this.origin),a&&a.copy(t).multiplyScalar(i).add(e),c}}(),intersectSphere:function(){var e=new o;return function(t,r){e.subVectors(t.center,this.origin);var n=e.dot(this.direction),i=e.dot(e)-n*n;return t=t.radius*t.radius,i>t?null:(t=Math.sqrt(t-i),i=n-t,n+=t,0>i&&0>n?null:0>i?this.at(n,r):this.at(i,r))}}(),intersectsSphere:function(e){return this.distanceToPoint(e.center)<=e.radius},distanceToPlane:function(e){var t=e.normal.dot(this.direction);return 0===t?0===e.distanceToPoint(this.origin)?0:null:0<=(e=-(this.origin.dot(e.normal)+e.constant)/t)?e:null},intersectPlane:function(e,t){return null===(e=this.distanceToPlane(e))?null:this.at(e,t)},intersectsPlane:function(e){var t=e.distanceToPoint(this.origin);return 0===t||0>e.normal.dot(this.direction)*t},intersectBox:function(e,t){var r=1/this.direction.x,n=1/this.direction.y,i=1/this.direction.z,o=this.origin;if(0<=r){var a=(e.min.x-o.x)*r;r*=e.max.x-o.x}else a=(e.max.x-o.x)*r,r*=e.min.x-o.x;if(0<=n){var s=(e.min.y-o.y)*n;n*=e.max.y-o.y}else s=(e.max.y-o.y)*n,n*=e.min.y-o.y;return a>n||s>r?null:((s>a||a!=a)&&(a=s),(n<r||r!=r)&&(r=n),0<=i?(s=(e.min.z-o.z)*i,e=(e.max.z-o.z)*i):(s=(e.max.z-o.z)*i,e=(e.min.z-o.z)*i),a>e||s>r?null:((s>a||a!=a)&&(a=s),(e<r||r!=r)&&(r=e),0>r?null:this.at(0<=a?a:r,t)))},intersectsBox:function(){var e=new o;return function(t){return null!==this.intersectBox(t,e)}}(),intersectTriangle:function(){var e=new o,t=new o,r=new o,n=new o;return function(i,o,a,s,c){if(t.subVectors(o,i),r.subVectors(a,i),n.crossVectors(t,r),0<(o=this.direction.dot(n))){if(s)return null;s=1}else{if(!(0>o))return null;s=-1,o=-o}return e.subVectors(this.origin,i),0>(i=s*this.direction.dot(r.crossVectors(e,r)))?null:0>(a=s*this.direction.dot(t.cross(e)))||i+a>o?null:0>(i=-s*e.dot(n))?null:this.at(i/o,c)}}(),applyMatrix4:function(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}}),Object.assign(Oe.prototype,{set:function(e,t){return this.start.copy(e),this.end.copy(t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.start.copy(e.start),this.end.copy(e.end),this},getCenter:function(e){return(e||new o).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){return(e||new o).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){return t=t||new o,this.delta(t).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(){var e=new o,t=new o;return function(r,n){return e.subVectors(r,this.start),t.subVectors(this.end,this.start),r=t.dot(t),r=t.dot(e)/r,n&&(r=ci.clamp(r,0,1)),r}}(),closestPointToPoint:function(e,t,r){return e=this.closestPointToPointParameter(e,t),r=r||new o,this.delta(r).multiplyScalar(e).add(this.start)},applyMatrix4:function(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)}}),Object.assign(Pe,{normal:function(){var e=new o;return function(t,r,n,i){return(i=i||new o).subVectors(n,r),e.subVectors(t,r),i.cross(e),0<(t=i.lengthSq())?i.multiplyScalar(1/Math.sqrt(t)):i.set(0,0,0)}}(),barycoordFromPoint:function(){var e=new o,t=new o,r=new o;return function(n,i,a,s,c){e.subVectors(s,i),t.subVectors(a,i),r.subVectors(n,i),n=e.dot(e),i=e.dot(t),a=e.dot(r);var u=t.dot(t);s=t.dot(r);var h=n*u-i*i;return c=c||new o,0===h?c.set(-2,-1,-1):(h=1/h,u=(u*a-i*s)*h,n=(n*s-i*a)*h,c.set(1-u-n,n,u))}}(),containsPoint:function(){var e=new o;return function(t,r,n,i){return 0<=(t=Pe.barycoordFromPoint(t,r,n,i,e)).x&&0<=t.y&&1>=t.x+t.y}}()}),Object.assign(Pe.prototype,{set:function(e,t,r){return this.a.copy(e),this.b.copy(t),this.c.copy(r),this},setFromPointsAndIndices:function(e,t,r,n){return this.a.copy(e[t]),this.b.copy(e[r]),this.c.copy(e[n]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this},area:function(){var e=new o,t=new o;return function(){return e.subVectors(this.c,this.b),t.subVectors(this.a,this.b),.5*e.cross(t).length()}}(),midpoint:function(e){return(e||new o).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(e){return Pe.normal(this.a,this.b,this.c,e)},plane:function(e){return(e||new J).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(e,t){return Pe.barycoordFromPoint(e,this.a,this.b,this.c,t)},containsPoint:function(e){return Pe.containsPoint(e,this.a,this.b,this.c)},closestPointToPoint:function(){var e=new J,t=[new Oe,new Oe,new Oe],r=new o,n=new o;return function(i,a){a=a||new o;var s=1/0;if(e.setFromCoplanarPoints(this.a,this.b,this.c),e.projectPoint(i,r),!0===this.containsPoint(r))a.copy(r);else for(t[0].set(this.a,this.b),t[1].set(this.b,this.c),t[2].set(this.c,this.a),i=0;i<t.length;i++){t[i].closestPointToPoint(r,!0,n);var c=r.distanceToSquared(n);c<s&&(s=c,a.copy(n))}return a}}(),equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}),je.prototype=Object.assign(Object.create(ne.prototype),{constructor:je,isMesh:!0,setDrawMode:function(e){this.drawMode=e},copy:function(e){return ne.prototype.copy.call(this,e),this.drawMode=e.drawMode,void 0!==e.morphTargetInfluences&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),void 0!==e.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this},updateMorphTargets:function(){var e=this.geometry;if(e.isBufferGeometry){e=e.morphAttributes;var t=Object.keys(e);if(0<t.length){var r=e[t[0]];if(void 0!==r)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=r.length;e<t;e++){var n=r[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}}else if(void 0!==(r=e.morphTargets)&&0<r.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},e=0,t=r.length;e<t;e++)n=r[e].name||String(e),this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e},raycast:function(){function e(e,t,r,n,i,o,a){return Pe.barycoordFromPoint(e,t,r,n,y),i.multiplyScalar(y.x),o.multiplyScalar(y.y),a.multiplyScalar(y.z),i.add(o).add(a),i.clone()}function t(e,t,r,n,i,o,a,s){return null===(1===t.side?n.intersectTriangle(a,o,i,!0,s):n.intersectTriangle(i,o,a,2!==t.side,s))?null:(_.copy(s),_.applyMatrix4(e.matrixWorld),(t=r.ray.origin.distanceTo(_))<r.near||t>r.far?null:{distance:t,point:_.clone(),object:e})}function i(r,n,i,o,a,s,c,p){return u.fromBufferAttribute(o,s),h.fromBufferAttribute(o,c),l.fromBufferAttribute(o,p),(r=t(r,r.material,n,i,u,h,l,b))&&(a&&(m.fromBufferAttribute(a,s),v.fromBufferAttribute(a,c),g.fromBufferAttribute(a,p),r.uv=e(b,u,h,l,m,v,g)),r.face=new ae(s,c,p,Pe.normal(u,h,l)),r.faceIndex=s),r}var a=new n,s=new Te,c=new Z,u=new o,h=new o,l=new o,p=new o,f=new o,d=new o,m=new r,v=new r,g=new r,y=new o,b=new o,_=new o;return function(r,n){var o=this.geometry,y=this.material,_=this.matrixWorld;if(void 0!==y&&(null===o.boundingSphere&&o.computeBoundingSphere(),c.copy(o.boundingSphere),c.applyMatrix4(_),!1!==r.ray.intersectsSphere(c)&&(a.getInverse(_),s.copy(r.ray).applyMatrix4(a),null===o.boundingBox||!1!==s.intersectsBox(o.boundingBox)))){var x;if(o.isBufferGeometry){var w,y=o.index,S=o.attributes.position,_=o.attributes.uv;if(null!==y){var M=0;for(w=y.count;M<w;M+=3){o=y.getX(M);var E=y.getX(M+1),C=y.getX(M+2);(x=i(this,r,s,S,_,o,E,C))&&(x.faceIndex=Math.floor(M/3),n.push(x))}}else if(void 0!==S)for(M=0,w=S.count;M<w;M+=3)o=M,E=M+1,C=M+2,(x=i(this,r,s,S,_,o,E,C))&&(x.index=o,n.push(x))}else if(o.isGeometry){_=Array.isArray(y);M=o.vertices,w=o.faces,0<(E=o.faceVertexUvs[0]).length&&(S=E);for(var T=0,O=w.length;T<O;T++){var P=w[T];if(void 0!==(x=_?y[P.materialIndex]:y)){E=M[P.a],C=M[P.b];var j=M[P.c];if(!0===x.morphTargets){var A=o.morphTargets,R=this.morphTargetInfluences;u.set(0,0,0),h.set(0,0,0),l.set(0,0,0);for(var L=0,N=A.length;L<N;L++){var I=R[L];if(0!==I){var D=A[L].vertices;u.addScaledVector(p.subVectors(D[P.a],E),I),h.addScaledVector(f.subVectors(D[P.b],C),I),l.addScaledVector(d.subVectors(D[P.c],j),I)}}u.add(E),h.add(C),l.add(j),E=u,C=h,j=l}(x=t(this,x,r,s,E,C,j,b))&&(S&&S[T]&&(A=S[T],m.copy(A[0]),v.copy(A[1]),g.copy(A[2]),x.uv=e(b,E,C,j,m,v,g)),x.face=P,x.faceIndex=T,n.push(x))}}}}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Ci=0;We.prototype=Object.assign(Object.create(ie.prototype),{constructor:We,isPerspectiveCamera:!0,copy:function(e,t){return ie.prototype.copy.call(this,e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this},setFocalLength:function(e){e=.5*this.getFilmHeight()/e,this.fov=2*ci.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var e=Math.tan(.5*ci.DEG2RAD*this.fov);return.5*this.getFilmHeight()/e},getEffectiveFOV:function(){return 2*ci.RAD2DEG*Math.atan(Math.tan(.5*ci.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(e,t,r,n,i,o){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=r,this.view.offsetY=n,this.view.width=i,this.view.height=o,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var e=this.near,t=2*(a=e*Math.tan(.5*ci.DEG2RAD*this.fov)/this.zoom),r=-.5*(s=this.aspect*t),n=this.view;if(null!==this.view&&this.view.enabled)var i=n.fullWidth,o=n.fullHeight,r=r+n.offsetX*s/i,a=a-n.offsetY*t/o,s=n.width/i*s,t=n.height/o*t;0!==(n=this.filmOffset)&&(r+=e*n/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,a,a-t,e,this.far)},toJSON:function(e){return e=ne.prototype.toJSON.call(this,e),e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}),Xe.prototype=Object.assign(Object.create(We.prototype),{constructor:Xe,isArrayCamera:!0}),Qe.prototype.isFogExp2=!0,Qe.prototype.clone=function(){return new Qe(this.color.getHex(),this.density)},Qe.prototype.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}},et.prototype.isFog=!0,et.prototype.clone=function(){return new et(this.color.getHex(),this.near,this.far)},et.prototype.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}},tt.prototype=Object.assign(Object.create(ne.prototype),{constructor:tt,copy:function(e,t){return ne.prototype.copy.call(this,e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this},toJSON:function(e){var t=ne.prototype.toJSON.call(this,e);return null!==this.background&&(t.object.background=this.background.toJSON(e)),null!==this.fog&&(t.object.fog=this.fog.toJSON()),t}}),rt.prototype=Object.assign(Object.create(ne.prototype),{constructor:rt,isLensFlare:!0,copy:function(e){ne.prototype.copy.call(this,e),this.positionScreen.copy(e.positionScreen),this.customUpdateCallback=e.customUpdateCallback;for(var t=0,r=e.lensFlares.length;t<r;t++)this.lensFlares.push(e.lensFlares[t]);return this},add:function(e,t,r,n,i,o){void 0===t&&(t=-1),void 0===r&&(r=0),void 0===o&&(o=1),void 0===i&&(i=new $(16777215)),void 0===n&&(n=1),r=Math.min(r,Math.max(0,r)),this.lensFlares.push({texture:e,size:t,distance:r,x:0,y:0,z:0,scale:1,rotation:0,opacity:o,color:i,blending:n})},updateLensFlares:function(){var e,t=this.lensFlares.length,r=2*-this.positionScreen.x,n=2*-this.positionScreen.y;for(e=0;e<t;e++){var i=this.lensFlares[e];i.x=this.positionScreen.x+r*i.distance,i.y=this.positionScreen.y+n*i.distance,i.wantedRotation=i.x*Math.PI*.25,i.rotation+=.25*(i.wantedRotation-i.rotation)}}}),(nt.prototype=Object.create(W.prototype)).constructor=nt,nt.prototype.isSpriteMaterial=!0,nt.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.rotation=e.rotation,this},it.prototype=Object.assign(Object.create(ne.prototype),{constructor:it,isSprite:!0,raycast:function(){var e=new o,t=new o,r=new o;return function(n,i){t.setFromMatrixPosition(this.matrixWorld),n.ray.closestPointToPoint(t,e),r.setFromMatrixScale(this.matrixWorld);var o=r.x*r.y/4;t.distanceToSquared(e)>o||(o=n.ray.origin.distanceTo(e))<n.near||o>n.far||i.push({distance:o,point:e.clone(),face:null,object:this})}}(),clone:function(){return new this.constructor(this.material).copy(this)}}),ot.prototype=Object.assign(Object.create(ne.prototype),{constructor:ot,copy:function(e){ne.prototype.copy.call(this,e,!1);for(var t=0,r=(e=e.levels).length;t<r;t++){var n=e[t];this.addLevel(n.object.clone(),n.distance)}return this},addLevel:function(e,t){void 0===t&&(t=0),t=Math.abs(t);for(var r=this.levels,n=0;n<r.length&&!(t<r[n].distance);n++);r.splice(n,0,{distance:t,object:e}),this.add(e)},getObjectForDistance:function(e){for(var t=this.levels,r=1,n=t.length;r<n&&!(e<t[r].distance);r++);return t[r-1].object},raycast:function(){var e=new o;return function(t,r){e.setFromMatrixPosition(this.matrixWorld);var n=t.ray.origin.distanceTo(e);this.getObjectForDistance(n).raycast(t,r)}}(),update:function(){var e=new o,t=new o;return function(r){var n=this.levels;if(1<n.length){e.setFromMatrixPosition(r.matrixWorld),t.setFromMatrixPosition(this.matrixWorld),r=e.distanceTo(t),n[0].object.visible=!0;for(var i=1,o=n.length;i<o&&r>=n[i].distance;i++)n[i-1].object.visible=!1,n[i].object.visible=!0;for(;i<o;i++)n[i].object.visible=!1}}}(),toJSON:function(e){(e=ne.prototype.toJSON.call(this,e)).object.levels=[];for(var t=this.levels,r=0,n=t.length;r<n;r++){var i=t[r];e.object.levels.push({object:i.object.uuid,distance:i.distance})}return e}}),Object.assign(at.prototype,{calculateInverses:function(){this.boneInverses=[];for(var e=0,t=this.bones.length;e<t;e++){var r=new n;this.bones[e]&&r.getInverse(this.bones[e].matrixWorld),this.boneInverses.push(r)}},pose:function(){var e,t,r=0;for(t=this.bones.length;r<t;r++)(e=this.bones[r])&&e.matrixWorld.getInverse(this.boneInverses[r]);for(r=0,t=this.bones.length;r<t;r++)(e=this.bones[r])&&(e.parent&&e.parent.isBone?(e.matrix.getInverse(e.parent.matrixWorld),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))},update:function(){var e=new n,t=new n;return function(){for(var r=this.bones,n=this.boneInverses,i=this.boneMatrices,o=this.boneTexture,a=0,s=r.length;a<s;a++)e.multiplyMatrices(r[a]?r[a].matrixWorld:t,n[a]),e.toArray(i,16*a);void 0!==o&&(o.needsUpdate=!0)}}(),clone:function(){return new at(this.bones,this.boneInverses)}}),st.prototype=Object.assign(Object.create(ne.prototype),{constructor:st,isBone:!0}),ct.prototype=Object.assign(Object.create(je.prototype),{constructor:ct,isSkinnedMesh:!0,initBones:function(){var e,t=[];if(this.geometry&&void 0!==this.geometry.bones){var r=0;for(e=this.geometry.bones.length;r<e;r++){var n=this.geometry.bones[r],i=new st;t.push(i),i.name=n.name,i.position.fromArray(n.pos),i.quaternion.fromArray(n.rotq),void 0!==n.scl&&i.scale.fromArray(n.scl)}for(r=0,e=this.geometry.bones.length;r<e;r++)-1!==(n=this.geometry.bones[r]).parent&&null!==n.parent&&void 0!==t[n.parent]?t[n.parent].add(t[r]):this.add(t[r])}return this.updateMatrixWorld(!0),t},bind:function(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.getInverse(t)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var e;if(this.geometry&&this.geometry.isGeometry)for(e=0;e<this.geometry.skinWeights.length;e++){var t=1/(r=this.geometry.skinWeights[e]).manhattanLength();1/0!==t?r.multiplyScalar(t):r.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var r=new c,n=this.geometry.attributes.skinWeight;for(e=0;e<n.count;e++)r.x=n.getX(e),r.y=n.getY(e),r.z=n.getZ(e),r.w=n.getW(e),t=1/r.manhattanLength(),1/0!==t?r.multiplyScalar(t):r.set(1,0,0,0),n.setXYZW(e,r.x,r.y,r.z,r.w)}},updateMatrixWorld:function(e){je.prototype.updateMatrixWorld.call(this,e),"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),(ut.prototype=Object.create(W.prototype)).constructor=ut,ut.prototype.isLineBasicMaterial=!0,ut.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this},ht.prototype=Object.assign(Object.create(ne.prototype),{constructor:ht,isLine:!0,raycast:function(){var e=new n,t=new Te,r=new Z;return function(n,i){var a=(a=n.linePrecision)*a,s=this.geometry,c=this.matrixWorld;if(null===s.boundingSphere&&s.computeBoundingSphere(),r.copy(s.boundingSphere),r.applyMatrix4(c),!1!==n.ray.intersectsSphere(r)){e.getInverse(c),t.copy(n.ray).applyMatrix4(e);var u=new o,h=new o,c=new o,l=new o,p=this&&this.isLineSegments?2:1;if(s.isBufferGeometry){var f=s.index,d=s.attributes.position.array;if(null!==f)for(var m=f.array,s=0,v=m.length-1;s<v;s+=p)f=m[s+1],u.fromArray(d,3*m[s]),h.fromArray(d,3*f),(f=t.distanceSqToSegment(u,h,l,c))>a||(l.applyMatrix4(this.matrixWorld),(f=n.ray.origin.distanceTo(l))<n.near||f>n.far||i.push({distance:f,point:c.clone().applyMatrix4(this.matrixWorld),index:s,face:null,faceIndex:null,object:this}));else for(s=0,v=d.length/3-1;s<v;s+=p)u.fromArray(d,3*s),h.fromArray(d,3*s+3),(f=t.distanceSqToSegment(u,h,l,c))>a||(l.applyMatrix4(this.matrixWorld),(f=n.ray.origin.distanceTo(l))<n.near||f>n.far||i.push({distance:f,point:c.clone().applyMatrix4(this.matrixWorld),index:s,face:null,faceIndex:null,object:this}))}else if(s.isGeometry)for(u=s.vertices,h=u.length,s=0;s<h-1;s+=p)(f=t.distanceSqToSegment(u[s],u[s+1],l,c))>a||(l.applyMatrix4(this.matrixWorld),(f=n.ray.origin.distanceTo(l))<n.near||f>n.far||i.push({distance:f,point:c.clone().applyMatrix4(this.matrixWorld),index:s,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),lt.prototype=Object.assign(Object.create(ht.prototype),{constructor:lt,isLineSegments:!0}),pt.prototype=Object.assign(Object.create(ht.prototype),{constructor:pt,isLineLoop:!0}),(ft.prototype=Object.create(W.prototype)).constructor=ft,ft.prototype.isPointsMaterial=!0,ft.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this},dt.prototype=Object.assign(Object.create(ne.prototype),{constructor:dt,isPoints:!0,raycast:function(){var e=new n,t=new Te,r=new Z;return function(n,i){function a(e,r){var o=t.distanceSqToPoint(e);if(o<l){(e=t.closestPointToPoint(e)).applyMatrix4(u);var a=n.ray.origin.distanceTo(e);a<n.near||a>n.far||i.push({distance:a,distanceToRay:Math.sqrt(o),point:e.clone(),index:r,face:null,object:s})}}var s=this,c=this.geometry,u=this.matrixWorld,h=n.params.Points.threshold;if(null===c.boundingSphere&&c.computeBoundingSphere(),r.copy(c.boundingSphere),r.applyMatrix4(u),r.radius+=h,!1!==n.ray.intersectsSphere(r)){e.getInverse(u),t.copy(n.ray).applyMatrix4(e);var l=(h=h/((this.scale.x+this.scale.y+this.scale.z)/3))*h,h=new o;if(c.isBufferGeometry){var p=c.index,c=c.attributes.position.array;if(null!==p)for(var f=p.array,p=0,d=f.length;p<d;p++){var m=f[p];h.fromArray(c,3*m),a(h,m)}else for(p=0,f=c.length/3;p<f;p++)h.fromArray(c,3*p),a(h,p)}else for(h=c.vertices,p=0,f=h.length;p<f;p++)a(h[p],p)}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),mt.prototype=Object.assign(Object.create(ne.prototype),{constructor:mt}),(vt.prototype=Object.create(s.prototype)).constructor=vt,(gt.prototype=Object.create(s.prototype)).constructor=gt,gt.prototype.isCompressedTexture=!0,(yt.prototype=Object.create(s.prototype)).constructor=yt,yt.prototype.isDepthTexture=!0,(bt.prototype=Object.create(_e.prototype)).constructor=bt,(_t.prototype=Object.create(se.prototype)).constructor=_t,(xt.prototype=Object.create(_e.prototype)).constructor=xt,(wt.prototype=Object.create(se.prototype)).constructor=wt,(St.prototype=Object.create(_e.prototype)).constructor=St,(Mt.prototype=Object.create(se.prototype)).constructor=Mt,(Et.prototype=Object.create(St.prototype)).constructor=Et,(Ct.prototype=Object.create(se.prototype)).constructor=Ct,(Tt.prototype=Object.create(St.prototype)).constructor=Tt,(Ot.prototype=Object.create(se.prototype)).constructor=Ot,(Pt.prototype=Object.create(St.prototype)).constructor=Pt,(jt.prototype=Object.create(se.prototype)).constructor=jt,(At.prototype=Object.create(St.prototype)).constructor=At,(Rt.prototype=Object.create(se.prototype)).constructor=Rt,(Lt.prototype=Object.create(_e.prototype)).constructor=Lt,(Nt.prototype=Object.create(se.prototype)).constructor=Nt,(It.prototype=Object.create(_e.prototype)).constructor=It,(Dt.prototype=Object.create(se.prototype)).constructor=Dt,(kt.prototype=Object.create(_e.prototype)).constructor=kt;var Ti={area:function(e){for(var t=e.length,r=0,n=t-1,i=0;i<t;n=i++)r+=e[n].x*e[i].y-e[i].x*e[n].y;return.5*r},triangulate:function(e,t){var r=e.length;if(3>r)return null;var n,i=[],o=[],a=[];if(0<Ti.area(e))for(n=0;n<r;n++)o[n]=n;else for(n=0;n<r;n++)o[n]=r-1-n;var s=2*r;for(n=r-1;2<r;){if(0>=s--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}var c=n;r<=c&&(c=0),r<=(n=c+1)&&(n=0);var u=n+1;r<=u&&(u=0);e:{var h,l=e[o[c]].x,p=e[o[c]].y,f=e[o[n]].x,d=e[o[n]].y,m=e[o[u]].x,v=e[o[u]].y;if(0>=(f-l)*(v-p)-(d-p)*(m-l))var g=!1;else{var y=m-f,b=v-d,_=l-m,x=p-v,w=f-l;for(g=d-p,h=0;h<r;h++){var S=e[o[h]].x,M=e[o[h]].y;if(!(S===l&&M===p||S===f&&M===d||S===m&&M===v)){var E=S-l,C=M-p,T=S-f,O=M-d;if(S-=m,M-=v,O=y*O-b*T,C=w*C-g*E,S=_*M-x*S,O>=-Number.EPSILON&&S>=-Number.EPSILON&&C>=-Number.EPSILON){g=!1;break e}}}g=!0}}if(g){for(i.push([e[o[c]],e[o[n]],e[o[u]]]),a.push([o[c],o[n],o[u]]),c=n,u=n+1;u<r;c++,u++)o[c]=o[u];s=2*--r}}return t?a:i},triangulateShape:function(e,t){function r(e){var t=e.length;2<t&&e[t-1].equals(e[0])&&e.pop()}function n(e,t,r){return e.x!==t.x?e.x<t.x?e.x<=r.x&&r.x<=t.x:t.x<=r.x&&r.x<=e.x:e.y<t.y?e.y<=r.y&&r.y<=t.y:t.y<=r.y&&r.y<=e.y}function i(e,t,r,i,o){var a=t.x-e.x,s=t.y-e.y,c=i.x-r.x,u=i.y-r.y,h=e.x-r.x,l=e.y-r.y,p=s*c-a*u,f=s*h-a*l;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>f||f>p)return[];if(0>(c=u*h-c*l)||c>p)return[]}else{if(0<f||f<p)return[];if(0<(c=u*h-c*l)||c<p)return[]}return 0===c?!o||0!==f&&f!==p?[e]:[]:c===p?!o||0!==f&&f!==p?[t]:[]:0===f?[r]:f===p?[i]:(o=c/p,[{x:e.x+o*a,y:e.y+o*s}])}return 0!==f||u*h!=c*l?[]:(s=0===a&&0===s,c=0===c&&0===u,s&&c?e.x!==r.x||e.y!==r.y?[]:[e]:s?n(r,i,e)?[e]:[]:c?n(e,t,r)?[r]:[]:(0!==a?(e.x<t.x?(a=e,c=e.x,s=t,e=t.x):(a=t,c=t.x,s=e,e=e.x),r.x<i.x?(t=r,p=r.x,u=i,r=i.x):(t=i,p=i.x,u=r,r=r.x)):(e.y<t.y?(a=e,c=e.y,s=t,e=t.y):(a=t,c=t.y,s=e,e=e.y),r.y<i.y?(t=r,p=r.y,u=i,r=i.y):(t=i,p=i.y,u=r,r=r.y)),c<=p?e<p?[]:e===p?o?[]:[t]:e<=r?[t,s]:[t,u]:c>r?[]:c===r?o?[]:[a]:e<=r?[a,s]:[a,u]))}function o(e,t,r,n){var i=t.x-e.x,o=t.y-e.y;t=r.x-e.x,r=r.y-e.y;var a=n.x-e.x;return n=n.y-e.y,e=i*r-o*t,i=i*n-o*a,Math.abs(e)>Number.EPSILON?(t=a*r-n*t,0<e?0<=i&&0<=t:0<=i||0<=t):0<i}r(e),t.forEach(r);var a,s={},c=e.concat(),u=0;for(a=t.length;u<a;u++)Array.prototype.push.apply(c,t[u]);for(u=0,a=c.length;u<a;u++){var h=c[u].x+":"+c[u].y;void 0!==s[h]&&console.warn("THREE.ShapeUtils: Duplicate point",h,u),s[h]=u}for(u=function(e,t){function r(e,t){var r=u.length-1,n=e-1;0>n&&(n=r);var i=e+1;return i>r&&(i=0),!!(r=o(u[e],u[n],u[i],y[t]))&&(r=y.length-1,0>(n=t-1)&&(n=r),(i=t+1)>r&&(i=0),!!(r=o(y[t],y[n],y[i],u[e])))}function n(e,t){var r;for(r=0;r<u.length;r++){var n=r+1;if(n%=u.length,0<(n=i(e,t,u[r],u[n],!0)).length)return!0}return!1}function a(e,r){var n,o;for(n=0;n<h.length;n++){var a=t[h[n]];for(o=0;o<a.length;o++){var s=o+1;if(s%=a.length,0<(s=i(e,r,a[o],a[s],!0)).length)return!0}}return!1}var s,c,u=e.concat(),h=[];e=[];var l,p=0;for(s=t.length;p<s;p++)h.push(p);for(var f=0,d=2*h.length;0<h.length;){if(0>--d){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!');break}for(c=f;c<u.length;c++){var m=u[c];for(s=-1,p=0;p<h.length;p++){var v=h[p],g=m.x+":"+m.y+":"+v;if(void 0===e[g]){var y=t[v];for(l=0;l<y.length;l++)if(v=y[l],r(c,l)&&!n(m,v)&&!a(m,v)){s=l,h.splice(p,1),f=u.slice(0,c+1),v=u.slice(c),l=y.slice(s);var b=y.slice(0,s+1);u=f.concat(l).concat(b).concat(v),f=c;break}if(0<=s)break;e[g]=!0}}if(0<=s)break}}return u}(e,t),c=Ti.triangulate(u,!1),u=0,a=c.length;u<a;u++)for(t=c[u],e=0;3>e;e++)h=t[e].x+":"+t[e].y,void 0!==(h=s[h])&&(t[e]=h);return c.concat()},isClockWise:function(e){return 0>Ti.area(e)}};(Ft.prototype=Object.create(se.prototype)).constructor=Ft,(Bt.prototype=Object.create(_e.prototype)).constructor=Bt,Bt.prototype.getArrays=function(){var e=(e=this.getAttribute("position"))?Array.prototype.slice.call(e.array):[],t=(t=this.getAttribute("uv"))?Array.prototype.slice.call(t.array):[],r=this.index;return{position:e,uv:t,index:r=r?Array.prototype.slice.call(r.array):[]}},Bt.prototype.addShapeList=function(e,t){var r=e.length;t.arrays=this.getArrays();for(var n=0;n<r;n++)this.addShape(e[n],t);this.setIndex(t.arrays.index),this.addAttribute("position",new ve(t.arrays.position,3)),this.addAttribute("uv",new ve(t.arrays.uv,2))},Bt.prototype.addShape=function(e,t){function n(e,t,r){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),t.clone().multiplyScalar(r).add(e)}function i(e,t,n){var i=e.x-t.x,o=e.y-t.y,a=n.x-e.x,s=n.y-e.y,c=i*i+o*o;if(Math.abs(i*s-o*a)>Number.EPSILON){var u=Math.sqrt(c),h=Math.sqrt(a*a+s*s),c=t.x-o/u;if(t=t.y+i/u,s=((n.x-s/h-c)*s-(n.y+a/h-t)*a)/(i*s-o*a),a=c+i*s-e.x,i=t+o*s-e.y,2>=(o=a*a+i*i))return new r(a,i);o=Math.sqrt(o/2)}else e=!1,i>Number.EPSILON?a>Number.EPSILON&&(e=!0):i<-Number.EPSILON?a<-Number.EPSILON&&(e=!0):Math.sign(o)===Math.sign(s)&&(e=!0),e?(a=-o,o=Math.sqrt(c)):(a=i,i=o,o=Math.sqrt(c/2));return new r(a/o,i/o)}function a(e,t){for(z=e.length;0<=--z;){var r=z,n=z-1;0>n&&(n=e.length-1);var i,o=x+2*y;for(i=0;i<o;i++){var a=B*i,s=t+n+a,c=t+n+(p=B*(i+1)),p=t+r+p;u(t+r+a),u(s),u(p),u(s),u(c),u(p),a=l.length/3,h((a=M.generateSideWallUV(A,l,a-6,a-3,a-2,a-1))[0]),h(a[1]),h(a[3]),h(a[1]),h(a[2]),h(a[3])}}}function s(e,t,r){d.push(e),d.push(t),d.push(r)}function c(e,t,r){u(e),u(t),u(r),e=l.length/3,h((e=M.generateTopUV(A,l,e-3,e-2,e-1))[0]),h(e[1]),h(e[2])}function u(e){p.push(l.length/3),l.push(d[3*e+0]),l.push(d[3*e+1]),l.push(d[3*e+2])}function h(e){f.push(e.x),f.push(e.y)}var l=(m=t.arrays?t.arrays:this.getArrays()).position,p=m.index,f=m.uv,d=[],m=void 0!==t.amount?t.amount:100,v=void 0!==t.bevelThickness?t.bevelThickness:6,g=void 0!==t.bevelSize?t.bevelSize:v-2,y=void 0!==t.bevelSegments?t.bevelSegments:3,b=void 0===t.bevelEnabled||t.bevelEnabled,_=void 0!==t.curveSegments?t.curveSegments:12,x=void 0!==t.steps?t.steps:1,w=t.extrudePath,S=!1,M=void 0!==t.UVGenerator?t.UVGenerator:Ft.WorldUVGenerator;if(w){var E=w.getSpacedPoints(x);S=!0,b=!1;var C=void 0!==t.frames?t.frames:w.computeFrenetFrames(x,!1),T=new o,O=new o,P=new o}b||(g=v=y=0);var j,A=this;e=(_=e.extractPoints(_)).shape;var R=_.holes;if(!Ti.isClockWise(e)){e=e.reverse();var L=0;for(j=R.length;L<j;L++){var N=R[L];Ti.isClockWise(N)&&(R[L]=N.reverse())}}var I=Ti.triangulateShape(e,R),D=e;for(L=0,j=R.length;L<j;L++)N=R[L],e=e.concat(N);var k,F,B=e.length,U=I.length,_=[],z=0,$=D.length,G=$-1;for(k=z+1;z<$;z++,G++,k++)G===$&&(G=0),k===$&&(k=0),_[z]=i(D[z],D[G],D[k]);var w=[],V=_.concat();for(L=0,j=R.length;L<j;L++){N=R[L];var H=[];for(z=0,G=($=N.length)-1,k=z+1;z<$;z++,G++,k++)G===$&&(G=0),k===$&&(k=0),H[z]=i(N[z],N[G],N[k]);w.push(H),V=V.concat(H)}for(G=0;G<y;G++){$=G/y;var q=v*Math.cos($*Math.PI/2);for(k=g*Math.sin($*Math.PI/2),z=0,$=D.length;z<$;z++){var W=n(D[z],_[z],k);s(W.x,W.y,-q)}for(L=0,j=R.length;L<j;L++)for(N=R[L],H=w[L],z=0,$=N.length;z<$;z++)W=n(N[z],H[z],k),s(W.x,W.y,-q)}for(k=g,z=0;z<B;z++)W=b?n(e[z],V[z],k):e[z],S?(O.copy(C.normals[0]).multiplyScalar(W.x),T.copy(C.binormals[0]).multiplyScalar(W.y),P.copy(E[0]).add(O).add(T),s(P.x,P.y,P.z)):s(W.x,W.y,0);for($=1;$<=x;$++)for(z=0;z<B;z++)W=b?n(e[z],V[z],k):e[z],S?(O.copy(C.normals[$]).multiplyScalar(W.x),T.copy(C.binormals[$]).multiplyScalar(W.y),P.copy(E[$]).add(O).add(T),s(P.x,P.y,P.z)):s(W.x,W.y,m/x*$);for(G=y-1;0<=G;G--){for($=G/y,q=v*Math.cos($*Math.PI/2),k=g*Math.sin($*Math.PI/2),z=0,$=D.length;z<$;z++)W=n(D[z],_[z],k),s(W.x,W.y,m+q);for(L=0,j=R.length;L<j;L++)for(N=R[L],H=w[L],z=0,$=N.length;z<$;z++)W=n(N[z],H[z],k),S?s(W.x,W.y+E[x-1].y,E[x-1].x+q):s(W.x,W.y,m+q)}!function(){var e=l.length/3;if(b){var r=0*B;for(z=0;z<U;z++)F=I[z],c(F[2]+r,F[1]+r,F[0]+r);for(r=B*(x+2*y),z=0;z<U;z++)F=I[z],c(F[0]+r,F[1]+r,F[2]+r)}else{for(z=0;z<U;z++)F=I[z],c(F[2],F[1],F[0]);for(z=0;z<U;z++)F=I[z],c(F[0]+B*x,F[1]+B*x,F[2]+B*x)}A.addGroup(e,l.length/3-e,void 0!==t.material?t.material:0)}(),function(){var e=l.length/3,r=0;for(a(D,r),r+=D.length,L=0,j=R.length;L<j;L++)N=R[L],a(N,r),r+=N.length;A.addGroup(e,l.length/3-e,void 0!==t.extrudeMaterial?t.extrudeMaterial:1)}(),t.arrays||(this.setIndex(p),this.addAttribute("position",new ve(l,3)),this.addAttribute("uv",new ve(t.arrays.uv,2)))},Ft.WorldUVGenerator={generateTopUV:function(e,t,n,i,o){e=t[3*i],i=t[3*i+1];var a=t[3*o];return o=t[3*o+1],[new r(t[3*n],t[3*n+1]),new r(e,i),new r(a,o)]},generateSideWallUV:function(e,t,n,i,o,a){e=t[3*n];var s=t[3*n+1];n=t[3*n+2];var c=t[3*i],u=t[3*i+1];i=t[3*i+2];var h=t[3*o],l=t[3*o+1];o=t[3*o+2];var p=t[3*a],f=t[3*a+1];return t=t[3*a+2],.01>Math.abs(s-u)?[new r(e,1-n),new r(c,1-i),new r(h,1-o),new r(p,1-t)]:[new r(s,1-n),new r(u,1-i),new r(l,1-o),new r(f,1-t)]}},(Ut.prototype=Object.create(se.prototype)).constructor=Ut,(zt.prototype=Object.create(Bt.prototype)).constructor=zt,($t.prototype=Object.create(se.prototype)).constructor=$t,(Gt.prototype=Object.create(_e.prototype)).constructor=Gt,(Vt.prototype=Object.create(se.prototype)).constructor=Vt,(Ht.prototype=Object.create(_e.prototype)).constructor=Ht,(qt.prototype=Object.create(se.prototype)).constructor=qt,(Wt.prototype=Object.create(_e.prototype)).constructor=Wt,(Xt.prototype=Object.create(se.prototype)).constructor=Xt,(Yt.prototype=Object.create(_e.prototype)).constructor=Yt,(Kt.prototype=Object.create(_e.prototype)).constructor=Kt,(Zt.prototype=Object.create(se.prototype)).constructor=Zt,(Jt.prototype=Object.create(_e.prototype)).constructor=Jt,(Qt.prototype=Object.create(Zt.prototype)).constructor=Qt,(er.prototype=Object.create(Jt.prototype)).constructor=er,(tr.prototype=Object.create(se.prototype)).constructor=tr,(rr.prototype=Object.create(_e.prototype)).constructor=rr;var Oi=Object.freeze({WireframeGeometry:bt,ParametricGeometry:_t,ParametricBufferGeometry:xt,TetrahedronGeometry:Mt,TetrahedronBufferGeometry:Et,OctahedronGeometry:Ct,OctahedronBufferGeometry:Tt,IcosahedronGeometry:Ot,IcosahedronBufferGeometry:Pt,DodecahedronGeometry:jt,DodecahedronBufferGeometry:At,PolyhedronGeometry:wt,PolyhedronBufferGeometry:St,TubeGeometry:Rt,TubeBufferGeometry:Lt,TorusKnotGeometry:Nt,TorusKnotBufferGeometry:It,TorusGeometry:Dt,TorusBufferGeometry:kt,TextGeometry:Ut,TextBufferGeometry:zt,SphereGeometry:$t,SphereBufferGeometry:Gt,RingGeometry:Vt,RingBufferGeometry:Ht,PlaneGeometry:Se,PlaneBufferGeometry:Me,LatheGeometry:qt,LatheBufferGeometry:Wt,ShapeGeometry:Xt,ShapeBufferGeometry:Yt,ExtrudeGeometry:Ft,ExtrudeBufferGeometry:Bt,EdgesGeometry:Kt,ConeGeometry:Qt,ConeBufferGeometry:er,CylinderGeometry:Zt,CylinderBufferGeometry:Jt,CircleGeometry:tr,CircleBufferGeometry:rr,BoxGeometry:xe,BoxBufferGeometry:we});(nr.prototype=Object.create(W.prototype)).constructor=nr,nr.prototype.isShadowMaterial=!0,(ir.prototype=Object.create(Ce.prototype)).constructor=ir,ir.prototype.isRawShaderMaterial=!0,(or.prototype=Object.create(W.prototype)).constructor=or,or.prototype.isMeshStandardMaterial=!0,or.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(ar.prototype=Object.create(or.prototype)).constructor=ar,ar.prototype.isMeshPhysicalMaterial=!0,ar.prototype.copy=function(e){return or.prototype.copy.call(this,e),this.defines={PHYSICAL:""},this.reflectivity=e.reflectivity,this.clearCoat=e.clearCoat,this.clearCoatRoughness=e.clearCoatRoughness,this},(sr.prototype=Object.create(W.prototype)).constructor=sr,sr.prototype.isMeshPhongMaterial=!0,sr.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(cr.prototype=Object.create(sr.prototype)).constructor=cr,cr.prototype.isMeshToonMaterial=!0,cr.prototype.copy=function(e){return sr.prototype.copy.call(this,e),this.gradientMap=e.gradientMap,this},(ur.prototype=Object.create(W.prototype)).constructor=ur,ur.prototype.isMeshNormalMaterial=!0,ur.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(hr.prototype=Object.create(W.prototype)).constructor=hr,hr.prototype.isMeshLambertMaterial=!0,hr.prototype.copy=function(e){return W.prototype.copy.call(this,e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.morphNormals=e.morphNormals,this},(lr.prototype=Object.create(ut.prototype)).constructor=lr,lr.prototype.isLineDashedMaterial=!0,lr.prototype.copy=function(e){return ut.prototype.copy.call(this,e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this};var Pi=Object.freeze({ShadowMaterial:nr,SpriteMaterial:nt,RawShaderMaterial:ir,ShaderMaterial:Ce,PointsMaterial:ft,MeshPhysicalMaterial:ar,MeshStandardMaterial:or,MeshPhongMaterial:sr,MeshToonMaterial:cr,MeshNormalMaterial:ur,MeshLambertMaterial:hr,MeshDepthMaterial:X,MeshDistanceMaterial:Y,MeshBasicMaterial:Ee,LineDashedMaterial:lr,LineBasicMaterial:ut,Material:W}),ji={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}},Ai=new pr,Ri={};Object.assign(fr.prototype,{load:function(e,t,r,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var i=this,o=ji.get(e);if(void 0!==o)return i.manager.itemStart(e),setTimeout(function(){t&&t(o),i.manager.itemEnd(e)},0),o;if(void 0===Ri[e]){if(s=e.match(/^data:(.*?)(;base64)?,(.*)$/)){r=s[1];var a=!!s[2],s=s[3],s=window.decodeURIComponent(s);a&&(s=window.atob(s));try{var c=(this.responseType||"").toLowerCase();switch(c){case"arraybuffer":case"blob":for(var u=new Uint8Array(s.length),a=0;a<s.length;a++)u[a]=s.charCodeAt(a);var h="blob"===c?new Blob([u.buffer],{type:r}):u.buffer;break;case"document":h=(new DOMParser).parseFromString(s,r);break;case"json":h=JSON.parse(s);break;default:h=s}window.setTimeout(function(){t&&t(h),i.manager.itemEnd(e)},0)}catch(t){window.setTimeout(function(){n&&n(t),i.manager.itemEnd(e),i.manager.itemError(e)},0)}}else{Ri[e]=[],Ri[e].push({onLoad:t,onProgress:r,onError:n});var l=new XMLHttpRequest;l.open("GET",e,!0),l.addEventListener("load",function(t){var r=t.target.response;ji.add(e,r);var n=Ri[e];if(delete Ri[e],200===this.status){for(var o=0,a=n.length;o<a;o++){var s=n[o];s.onLoad&&s.onLoad(r)}i.manager.itemEnd(e)}else if(0===this.status){for(console.warn("THREE.FileLoader: HTTP Status 0 received."),o=0,a=n.length;o<a;o++)(s=n[o]).onLoad&&s.onLoad(r);i.manager.itemEnd(e)}else{for(o=0,a=n.length;o<a;o++)(s=n[o]).onError&&s.onError(t);i.manager.itemEnd(e),i.manager.itemError(e)}},!1),l.addEventListener("progress",function(t){for(var r=Ri[e],n=0,i=r.length;n<i;n++){var o=r[n];o.onProgress&&o.onProgress(t)}},!1),l.addEventListener("error",function(t){var r=Ri[e];delete Ri[e];for(var n=0,o=r.length;n<o;n++){var a=r[n];a.onError&&a.onError(t)}i.manager.itemEnd(e),i.manager.itemError(e)},!1),void 0!==this.responseType&&(l.responseType=this.responseType),void 0!==this.withCredentials&&(l.withCredentials=this.withCredentials),l.overrideMimeType&&l.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(a in this.requestHeader)l.setRequestHeader(a,this.requestHeader[a]);l.send(null)}return i.manager.itemStart(e),l}Ri[e].push({onLoad:t,onProgress:r,onError:n})},setPath:function(e){return this.path=e,this},setResponseType:function(e){return this.responseType=e,this},setWithCredentials:function(e){return this.withCredentials=e,this},setMimeType:function(e){return this.mimeType=e,this},setRequestHeader:function(e){return this.requestHeader=e,this}}),Object.assign(dr.prototype,{load:function(e,t,r,n){function i(i){u.load(e[i],function(e){e=a._parser(e,!0),s[i]={width:e.width,height:e.height,format:e.format,mipmaps:e.mipmaps},6===(o+=1)&&(1===e.mipmapCount&&(c.minFilter=1006),c.format=e.format,c.needsUpdate=!0,t&&t(c))},r,n)}var o,a=this,s=[],c=new gt;c.image=s;var u=new fr(this.manager);if(u.setPath(this.path),u.setResponseType("arraybuffer"),Array.isArray(e))for(var h=o=0,l=e.length;h<l;++h)i(h);else u.load(e,function(e){if((e=a._parser(e,!0)).isCubemap)for(var r=e.mipmaps.length/e.mipmapCount,n=0;n<r;n++){s[n]={mipmaps:[]};for(var i=0;i<e.mipmapCount;i++)s[n].mipmaps.push(e.mipmaps[n*e.mipmapCount+i]),s[n].format=e.format,s[n].width=e.width,s[n].height=e.height}else c.image.width=e.width,c.image.height=e.height,c.mipmaps=e.mipmaps;1===e.mipmapCount&&(c.minFilter=1006),c.format=e.format,c.needsUpdate=!0,t&&t(c)},r,n);return c},setPath:function(e){return this.path=e,this}}),Object.assign(mr.prototype,{load:function(e,t,r,n){var i=this,o=new l,a=new fr(this.manager);return a.setResponseType("arraybuffer"),a.load(e,function(e){(e=i._parser(e))&&(void 0!==e.image?o.image=e.image:void 0!==e.data&&(o.image.width=e.width,o.image.height=e.height,o.image.data=e.data),o.wrapS=void 0!==e.wrapS?e.wrapS:1001,o.wrapT=void 0!==e.wrapT?e.wrapT:1001,o.magFilter=void 0!==e.magFilter?e.magFilter:1006,o.minFilter=void 0!==e.minFilter?e.minFilter:1008,o.anisotropy=void 0!==e.anisotropy?e.anisotropy:1,void 0!==e.format&&(o.format=e.format),void 0!==e.type&&(o.type=e.type),void 0!==e.mipmaps&&(o.mipmaps=e.mipmaps),1===e.mipmapCount&&(o.minFilter=1006),o.needsUpdate=!0,t&&t(o,e))},r,n),o}}),Object.assign(vr.prototype,{crossOrigin:"Anonymous",load:function(e,t,r,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var i=this,o=ji.get(e);return void 0!==o?(i.manager.itemStart(e),setTimeout(function(){t&&t(o),i.manager.itemEnd(e)},0),o):((r=document.createElementNS("http://www.w3.org/1999/xhtml","img")).addEventListener("load",function(){ji.add(e,this),t&&t(this),i.manager.itemEnd(e)},!1),r.addEventListener("error",function(t){n&&n(t),i.manager.itemEnd(e),i.manager.itemError(e)},!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(r.crossOrigin=this.crossOrigin),i.manager.itemStart(e),r.src=e,r)},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),Object.assign(gr.prototype,{crossOrigin:"Anonymous",load:function(e,t,r,n){function i(r){a.load(e[r],function(e){o.images[r]=e,6===++s&&(o.needsUpdate=!0,t&&t(o))},void 0,n)}var o=new p,a=new vr(this.manager);a.setCrossOrigin(this.crossOrigin),a.setPath(this.path);var s=0;for(r=0;r<e.length;++r)i(r);return o},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),Object.assign(yr.prototype,{crossOrigin:"Anonymous",load:function(e,t,r,n){var i=new vr(this.manager);i.setCrossOrigin(this.crossOrigin),i.setPath(this.path);var o=new s;return o.image=i.load(e,function(){var r=0<e.search(/\.(jpg|jpeg)$/)||0===e.search(/^data\:image\/jpeg/);o.format=r?1022:1023,o.needsUpdate=!0,void 0!==t&&t(o)},r,n),o},setCrossOrigin:function(e){return this.crossOrigin=e,this},setPath:function(e){return this.path=e,this}}),br.prototype=Object.assign(Object.create(ne.prototype),{constructor:br,isLight:!0,copy:function(e){return ne.prototype.copy.call(this,e),this.color.copy(e.color),this.intensity=e.intensity,this},toJSON:function(e){return e=ne.prototype.toJSON.call(this,e),e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}),_r.prototype=Object.assign(Object.create(br.prototype),{constructor:_r,isHemisphereLight:!0,copy:function(e){return br.prototype.copy.call(this,e),this.groundColor.copy(e.groundColor),this}}),Object.assign(xr.prototype,{copy:function(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var e={};return 0!==this.bias&&(e.bias=this.bias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}),wr.prototype=Object.assign(Object.create(xr.prototype),{constructor:wr,isSpotLightShadow:!0,update:function(e){var t=this.camera,r=2*ci.RAD2DEG*e.angle,n=this.mapSize.width/this.mapSize.height;e=e.distance||t.far,r===t.fov&&n===t.aspect&&e===t.far||(t.fov=r,t.aspect=n,t.far=e,t.updateProjectionMatrix())}}),Sr.prototype=Object.assign(Object.create(br.prototype),{constructor:Sr,isSpotLight:!0,copy:function(e){return br.prototype.copy.call(this,e),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),Mr.prototype=Object.assign(Object.create(br.prototype),{constructor:Mr,isPointLight:!0,copy:function(e){return br.prototype.copy.call(this,e),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}),Er.prototype=Object.assign(Object.create(xr.prototype),{constructor:Er}),Cr.prototype=Object.assign(Object.create(br.prototype),{constructor:Cr,isDirectionalLight:!0,copy:function(e){return br.prototype.copy.call(this,e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}),Tr.prototype=Object.assign(Object.create(br.prototype),{constructor:Tr,isAmbientLight:!0}),Or.prototype=Object.assign(Object.create(br.prototype),{constructor:Or,isRectAreaLight:!0,copy:function(e){return br.prototype.copy.call(this,e),this.width=e.width,this.height=e.height,this},toJSON:function(e){return e=br.prototype.toJSON.call(this,e),e.object.width=this.width,e.object.height=this.height,e}});var Li={arraySlice:function(e,t,r){return Li.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==r?r:e.length)):e.slice(t,r)},convertArray:function(e,t,r){return!e||!r&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){for(var t=e.length,r=Array(t),n=0;n!==t;++n)r[n]=n;return r.sort(function(t,r){return e[t]-e[r]}),r},sortedArray:function(e,t,r){for(var n=e.length,i=new e.constructor(n),o=0,a=0;a!==n;++o)for(var s=r[o]*t,c=0;c!==t;++c)i[a++]=e[s+c];return i},flattenJSON:function(e,t,r,n){for(var i=1,o=e[0];void 0!==o&&void 0===o[n];)o=e[i++];if(void 0!==o){var a=o[n];if(void 0!==a)if(Array.isArray(a))do{void 0!==(a=o[n])&&(t.push(o.time),r.push.apply(r,a)),o=e[i++]}while(void 0!==o);else if(void 0!==a.toArray)do{void 0!==(a=o[n])&&(t.push(o.time),a.toArray(r,r.length)),o=e[i++]}while(void 0!==o);else do{void 0!==(a=o[n])&&(t.push(o.time),r.push(a)),o=e[i++]}while(void 0!==o)}}};Object.assign(Pr.prototype,{evaluate:function(e){var t=this.parameterPositions,r=this._cachedIndex,n=t[r],i=t[r-1];e:{t:{r:{n:if(!(e<n)){for(var o=r+2;;){if(void 0===n){if(e<i)break n;return this._cachedIndex=r=t.length,this.afterEnd_(r-1,e,i)}if(r===o)break;if(i=n,n=t[++r],e<n)break t}n=t.length;break r}if(e>=i)break e;for(e<(o=t[1])&&(r=2,i=o),o=r-2;;){if(void 0===i)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(r===o)break;if(n=i,i=t[--r-1],e>=i)break t}n=r,r=0}for(;r<n;)i=r+n>>>1,e<t[i]?n=i:r=i+1;if(n=t[r],void 0===(i=t[r-1]))return this._cachedIndex=0,this.beforeStart_(0,e,n);if(void 0===n)return this._cachedIndex=r=t.length,this.afterEnd_(r-1,i,e)}this._cachedIndex=r,this.intervalChanged_(r,i,n)}return this.interpolate_(r,i,e,n)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(e){var t=this.resultBuffer,r=this.sampleValues,n=this.valueSize;e*=n;for(var i=0;i!==n;++i)t[i]=r[e+i];return t},interpolate_:function(){throw Error("call to abstract method")},intervalChanged_:function(){}}),Object.assign(Pr.prototype,{beforeStart_:Pr.prototype.copySampleValue_,afterEnd_:Pr.prototype.copySampleValue_}),jr.prototype=Object.assign(Object.create(Pr.prototype),{constructor:jr,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(e,t,r){var n=this.parameterPositions,i=e-2,o=e+1,a=n[i],s=n[o];if(void 0===a)switch(this.getSettings_().endingStart){case 2401:i=e,a=2*t-r;break;case 2402:a=t+n[i=n.length-2]-n[i+1];break;default:i=e,a=r}if(void 0===s)switch(this.getSettings_().endingEnd){case 2401:o=e,s=2*r-t;break;case 2402:o=1,s=r+n[1]-n[0];break;default:o=e-1,s=t}e=.5*(r-t),n=this.valueSize,this._weightPrev=e/(t-a),this._weightNext=e/(s-r),this._offsetPrev=i*n,this._offsetNext=o*n},interpolate_:function(e,t,r,n){var i=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=(e*=a)-a,c=this._offsetPrev,u=this._offsetNext,h=this._weightPrev,l=this._weightNext,p=(r-t)/(n-t);for(t=-h*(n=(r=p*p)*p)+2*h*r-h*p,h=(1+h)*n+(-1.5-2*h)*r+(-.5+h)*p+1,p=(-1-l)*n+(1.5+l)*r+.5*p,l=l*n-l*r,r=0;r!==a;++r)i[r]=t*o[c+r]+h*o[s+r]+p*o[e+r]+l*o[u+r];return i}}),Ar.prototype=Object.assign(Object.create(Pr.prototype),{constructor:Ar,interpolate_:function(e,t,r,n){var i=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=(e*=a)-a;for(r=1-(t=(r-t)/(n-t)),n=0;n!==a;++n)i[n]=o[s+n]*r+o[e+n]*t;return i}}),Rr.prototype=Object.assign(Object.create(Pr.prototype),{constructor:Rr,interpolate_:function(e){return this.copySampleValue_(e-1)}});var Ni={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(e){return new Rr(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodLinear:function(e){return new Ar(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:function(e){return new jr(this.times,this.values,this.getValueSize(),e)},setInterpolation:function(e){switch(e){case 2300:var t=this.InterpolantFactoryMethodDiscrete;break;case 2301:t=this.InterpolantFactoryMethodLinear;break;case 2302:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){if(t="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name,void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw Error(t);this.setInterpolation(this.DefaultInterpolation)}console.warn("THREE.KeyframeTrackPrototype:",t)}else this.createInterpolant=t},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(e){if(0!==e)for(var t=this.times,r=0,n=t.length;r!==n;++r)t[r]+=e;return this},scale:function(e){if(1!==e)for(var t=this.times,r=0,n=t.length;r!==n;++r)t[r]*=e;return this},trim:function(e,t){for(var r=this.times,n=r.length,i=0,o=n-1;i!==n&&r[i]<e;)++i;for(;-1!==o&&r[o]>t;)--o;return++o,0===i&&o===n||(i>=o&&(o=Math.max(o,1),i=o-1),e=this.getValueSize(),this.times=Li.arraySlice(r,i,o),this.values=Li.arraySlice(this.values,i*e,o*e)),this},validate:function(){var e=!0;0!=(r=this.getValueSize())-Math.floor(r)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),e=!1);var t=this.times,r=this.values,n=t.length;0===n&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",this),e=!1);for(var i=null,o=0;o!==n;o++){var a=t[o];if("number"==typeof a&&isNaN(a)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",this,o,a),e=!1;break}if(null!==i&&i>a){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,o,a,i),e=!1;break}i=a}if(void 0!==r&&Li.isTypedArray(r))for(o=0,t=r.length;o!==t;++o)if(n=r[o],isNaN(n)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,o,n),e=!1;break}return e},optimize:function(){for(var e,t,r=this.times,n=this.values,i=this.getValueSize(),o=2302===this.getInterpolation(),a=1,s=r.length-1,c=1;c<s;++c){e=!1;if((l=r[c])!==r[c+1]&&(1!==c||l!==l[0]))if(o)e=!0;else for(var u=(t=c*i)-i,h=t+i,l=0;l!==i;++l){var p=n[t+l];if(p!==n[u+l]||p!==n[h+l]){e=!0;break}}if(e){if(c!==a)for(r[a]=r[c],t=c*i,e=a*i,l=0;l!==i;++l)n[e+l]=n[t+l];++a}}if(0<s){for(r[a]=r[s],t=s*i,e=a*i,l=0;l!==i;++l)n[e+l]=n[t+l];++a}return a!==r.length&&(this.times=Li.arraySlice(r,0,a),this.values=Li.arraySlice(n,0,a*i)),this}};Nr.prototype=Object.assign(Object.create(Ni),{constructor:Nr,ValueTypeName:"vector"}),Ir.prototype=Object.assign(Object.create(Pr.prototype),{constructor:Ir,interpolate_:function(e,t,r,n){var o=this.resultBuffer,a=this.sampleValues,s=this.valueSize;for(t=(r-t)/(n-t),r=(e*=s)+s;e!==r;e+=4)i.slerpFlat(o,0,a,e-s,a,e,t);return o}}),Dr.prototype=Object.assign(Object.create(Ni),{constructor:Dr,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(e){return new Ir(this.times,this.values,this.getValueSize(),e)},InterpolantFactoryMethodSmooth:void 0}),kr.prototype=Object.assign(Object.create(Ni),{constructor:kr,ValueTypeName:"number"}),Fr.prototype=Object.assign(Object.create(Ni),{constructor:Fr,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Br.prototype=Object.assign(Object.create(Ni),{constructor:Br,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Ur.prototype=Object.assign(Object.create(Ni),{constructor:Ur,ValueTypeName:"color"}),zr.prototype=Ni,Ni.constructor=zr,Object.assign(zr,{parse:function(e){if(void 0===e.type)throw Error("track type undefined, can not parse");var t=zr._getTrackTypeForValueTypeName(e.type);if(void 0===e.times){var r=[],n=[];Li.flattenJSON(e.keys,r,n,"value"),e.times=r,e.values=n}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)},toJSON:function(e){if(void 0!==(t=e.constructor).toJSON)t=t.toJSON(e);else{var t={name:e.name,times:Li.convertArray(e.times,Array),values:Li.convertArray(e.values,Array)},r=e.getInterpolation();r!==e.DefaultInterpolation&&(t.interpolation=r)}return t.type=e.ValueTypeName,t},_getTrackTypeForValueTypeName:function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return kr;case"vector":case"vector2":case"vector3":case"vector4":return Nr;case"color":return Ur;case"quaternion":return Dr;case"bool":case"boolean":return Br;case"string":return Fr}throw Error("Unsupported typeName: "+e)}}),Object.assign($r,{parse:function(e){for(var t=[],r=e.tracks,n=1/(e.fps||1),i=0,o=r.length;i!==o;++i)t.push(zr.parse(r[i]).scale(n));return new $r(e.name,e.duration,t)},toJSON:function(e){var t=[],r=e.tracks;e={name:e.name,duration:e.duration,tracks:t};for(var n=0,i=r.length;n!==i;++n)t.push(zr.toJSON(r[n]));return e},CreateFromMorphTargetSequence:function(e,t,r,n){for(var i=t.length,o=[],a=0;a<i;a++){u=[];(c=[]).push((a+i-1)%i,a,(a+1)%i),u.push(0,1,0);var s=Li.getKeyframeOrder(c),c=Li.sortedArray(c,1,s),u=Li.sortedArray(u,1,s);n||0!==c[0]||(c.push(i),u.push(u[0])),o.push(new kr(".morphTargetInfluences["+t[a].name+"]",c,u).scale(1/r))}return new $r(e,-1,o)},findByName:function(e,t){var r=e;for(Array.isArray(e)||(r=e.geometry&&e.geometry.animations||e.animations),e=0;e<r.length;e++)if(r[e].name===t)return r[e];return null},CreateClipsFromMorphTargetSequences:function(e,t,r){for(var n,i={},o=/^([\w-]*?)([\d]+)$/,a=0,s=e.length;a<s;a++){var c=e[a],u=c.name.match(o);u&&1<u.length&&(n=u[1],(u=i[n])||(i[n]=u=[]),u.push(c))}e=[];for(n in i)e.push($r.CreateFromMorphTargetSequence(n,i[n],t,r));return e},parseAnimation:function(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var r=function(e,t,r,n,i){if(0!==r.length){var o=[],a=[];Li.flattenJSON(r,o,a,n),0!==o.length&&i.push(new e(t,o,a))}},n=[],i=e.name||"default",o=e.length||-1,a=e.fps||30;e=e.hierarchy||[];for(var s=0;s<e.length;s++){var c=e[s].keys;if(c&&0!==c.length)if(c[0].morphTargets){for(var o={},u=0;u<c.length;u++)if(c[u].morphTargets)for(f=0;f<c[u].morphTargets.length;f++)o[c[u].morphTargets[f]]=-1;for(var h in o){for(var l=[],p=[],f=0;f!==c[u].morphTargets.length;++f){var d=c[u];l.push(d.time),p.push(d.morphTarget===h?1:0)}n.push(new kr(".morphTargetInfluence["+h+"]",l,p))}o=o.length*(a||1)}else u=".bones["+t[s].name+"]",r(Nr,u+".position",c,"pos",n),r(Dr,u+".quaternion",c,"rot",n),r(Nr,u+".scale",c,"scl",n)}return 0===n.length?null:new $r(i,o,n)}}),Object.assign($r.prototype,{resetDuration:function(){for(var e=0,t=0,r=this.tracks.length;t!==r;++t)var n=this.tracks[t],e=Math.max(e,n.times[n.times.length-1]);this.duration=e},trim:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this},optimize:function(){for(var e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this}}),Object.assign(Gr.prototype,{load:function(e,t,r,n){var i=this;new fr(i.manager).load(e,function(e){t(i.parse(JSON.parse(e)))},r,n)},setTextures:function(e){this.textures=e},parse:function(e){function t(e){return void 0===n[e]&&console.warn("THREE.MaterialLoader: Undefined texture",e),n[e]}var n=this.textures,i=new Pi[e.type];if(void 0!==e.uuid&&(i.uuid=e.uuid),void 0!==e.name&&(i.name=e.name),void 0!==e.color&&i.color.setHex(e.color),void 0!==e.roughness&&(i.roughness=e.roughness),void 0!==e.metalness&&(i.metalness=e.metalness),void 0!==e.emissive&&i.emissive.setHex(e.emissive),void 0!==e.specular&&i.specular.setHex(e.specular),void 0!==e.shininess&&(i.shininess=e.shininess),void 0!==e.clearCoat&&(i.clearCoat=e.clearCoat),void 0!==e.clearCoatRoughness&&(i.clearCoatRoughness=e.clearCoatRoughness),void 0!==e.uniforms&&(i.uniforms=e.uniforms),void 0!==e.vertexShader&&(i.vertexShader=e.vertexShader),void 0!==e.fragmentShader&&(i.fragmentShader=e.fragmentShader),void 0!==e.vertexColors&&(i.vertexColors=e.vertexColors),void 0!==e.fog&&(i.fog=e.fog),void 0!==e.flatShading&&(i.flatShading=e.flatShading),void 0!==e.blending&&(i.blending=e.blending),void 0!==e.side&&(i.side=e.side),void 0!==e.opacity&&(i.opacity=e.opacity),void 0!==e.transparent&&(i.transparent=e.transparent),void 0!==e.alphaTest&&(i.alphaTest=e.alphaTest),void 0!==e.depthTest&&(i.depthTest=e.depthTest),void 0!==e.depthWrite&&(i.depthWrite=e.depthWrite),void 0!==e.colorWrite&&(i.colorWrite=e.colorWrite),void 0!==e.wireframe&&(i.wireframe=e.wireframe),void 0!==e.wireframeLinewidth&&(i.wireframeLinewidth=e.wireframeLinewidth),void 0!==e.wireframeLinecap&&(i.wireframeLinecap=e.wireframeLinecap),void 0!==e.wireframeLinejoin&&(i.wireframeLinejoin=e.wireframeLinejoin),void 0!==e.rotation&&(i.rotation=e.rotation),1!==e.linewidth&&(i.linewidth=e.linewidth),void 0!==e.dashSize&&(i.dashSize=e.dashSize),void 0!==e.gapSize&&(i.gapSize=e.gapSize),void 0!==e.scale&&(i.scale=e.scale),void 0!==e.skinning&&(i.skinning=e.skinning),void 0!==e.morphTargets&&(i.morphTargets=e.morphTargets),void 0!==e.dithering&&(i.dithering=e.dithering),void 0!==e.visible&&(i.visible=e.visible),void 0!==e.userData&&(i.userData=e.userData),void 0!==e.shading&&(i.flatShading=1===e.shading),void 0!==e.size&&(i.size=e.size),void 0!==e.sizeAttenuation&&(i.sizeAttenuation=e.sizeAttenuation),void 0!==e.map&&(i.map=t(e.map)),void 0!==e.alphaMap&&(i.alphaMap=t(e.alphaMap),i.transparent=!0),void 0!==e.bumpMap&&(i.bumpMap=t(e.bumpMap)),void 0!==e.bumpScale&&(i.bumpScale=e.bumpScale),void 0!==e.normalMap&&(i.normalMap=t(e.normalMap)),void 0!==e.normalScale){var o=e.normalScale;!1===Array.isArray(o)&&(o=[o,o]),i.normalScale=(new r).fromArray(o)}return void 0!==e.displacementMap&&(i.displacementMap=t(e.displacementMap)),void 0!==e.displacementScale&&(i.displacementScale=e.displacementScale),void 0!==e.displacementBias&&(i.displacementBias=e.displacementBias),void 0!==e.roughnessMap&&(i.roughnessMap=t(e.roughnessMap)),void 0!==e.metalnessMap&&(i.metalnessMap=t(e.metalnessMap)),void 0!==e.emissiveMap&&(i.emissiveMap=t(e.emissiveMap)),void 0!==e.emissiveIntensity&&(i.emissiveIntensity=e.emissiveIntensity),void 0!==e.specularMap&&(i.specularMap=t(e.specularMap)),void 0!==e.envMap&&(i.envMap=t(e.envMap)),void 0!==e.reflectivity&&(i.reflectivity=e.reflectivity),void 0!==e.lightMap&&(i.lightMap=t(e.lightMap)),void 0!==e.lightMapIntensity&&(i.lightMapIntensity=e.lightMapIntensity),void 0!==e.aoMap&&(i.aoMap=t(e.aoMap)),void 0!==e.aoMapIntensity&&(i.aoMapIntensity=e.aoMapIntensity),void 0!==e.gradientMap&&(i.gradientMap=t(e.gradientMap)),i}}),Object.assign(Vr.prototype,{load:function(e,t,r,n){var i=this;new fr(i.manager).load(e,function(e){t(i.parse(JSON.parse(e)))},r,n)},parse:function(e){var t=new _e,r=e.data.index;void 0!==r&&(r=new Ii[r.type](r.array),t.setIndex(new ce(r,1)));var n=e.data.attributes;for(a in n){var i=n[a];r=new Ii[i.type](i.array),t.addAttribute(a,new ce(r,i.itemSize,i.normalized))}var a=e.data.groups||e.data.drawcalls||e.data.offsets;if(void 0!==a)for(r=0,n=a.length;r!==n;++r)i=a[r],t.addGroup(i.start,i.count,i.materialIndex);return void 0!==(e=e.data.boundingSphere)&&(a=new o,void 0!==e.center&&a.fromArray(e.center),t.boundingSphere=new Z(a,e.radius)),t}});var Ii={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};Hr.Handlers={handlers:[],add:function(e,t){this.handlers.push(e,t)},get:function(e){for(var t=this.handlers,r=0,n=t.length;r<n;r+=2){var i=t[r+1];if(t[r].test(e))return i}return null}},Object.assign(Hr.prototype,{crossOrigin:void 0,extractUrlBase:function(e){return 1===(e=e.split("/")).length?"./":(e.pop(),e.join("/")+"/")},initMaterials:function(e,t,r){for(var n=[],i=0;i<e.length;++i)n[i]=this.createMaterial(e[i],t,r);return n},createMaterial:function(){var e={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},t=new $,r=new yr,n=new Gr;return function(i,o,a){function s(e,t,n,i,s){e=o+e;var c=Hr.Handlers.get(e);return null!==c?e=c.load(e):(r.setCrossOrigin(a),e=r.load(e)),void 0!==t&&(e.repeat.fromArray(t),1!==t[0]&&(e.wrapS=1e3),1!==t[1]&&(e.wrapT=1e3)),void 0!==n&&e.offset.fromArray(n),void 0!==i&&("repeat"===i[0]&&(e.wrapS=1e3),"mirror"===i[0]&&(e.wrapS=1002),"repeat"===i[1]&&(e.wrapT=1e3),"mirror"===i[1]&&(e.wrapT=1002)),void 0!==s&&(e.anisotropy=s),t=ci.generateUUID(),u[t]=e,t}var c,u={},h={uuid:ci.generateUUID(),type:"MeshLambertMaterial"};for(c in i){var l=i[c];switch(c){case"DbgColor":case"DbgIndex":case"opticalDensity":case"illumination":break;case"DbgName":h.name=l;break;case"blending":h.blending=e[l];break;case"colorAmbient":case"mapAmbient":console.warn("THREE.Loader.createMaterial:",c,"is no longer supported.");break;case"colorDiffuse":h.color=t.fromArray(l).getHex();break;case"colorSpecular":h.specular=t.fromArray(l).getHex();break;case"colorEmissive":h.emissive=t.fromArray(l).getHex();break;case"specularCoef":h.shininess=l;break;case"shading":"basic"===l.toLowerCase()&&(h.type="MeshBasicMaterial"),"phong"===l.toLowerCase()&&(h.type="MeshPhongMaterial"),"standard"===l.toLowerCase()&&(h.type="MeshStandardMaterial");break;case"mapDiffuse":h.map=s(l,i.mapDiffuseRepeat,i.mapDiffuseOffset,i.mapDiffuseWrap,i.mapDiffuseAnisotropy);break;case"mapDiffuseRepeat":case"mapDiffuseOffset":case"mapDiffuseWrap":case"mapDiffuseAnisotropy":break;case"mapEmissive":h.emissiveMap=s(l,i.mapEmissiveRepeat,i.mapEmissiveOffset,i.mapEmissiveWrap,i.mapEmissiveAnisotropy);break;case"mapEmissiveRepeat":case"mapEmissiveOffset":case"mapEmissiveWrap":case"mapEmissiveAnisotropy":break;case"mapLight":h.lightMap=s(l,i.mapLightRepeat,i.mapLightOffset,i.mapLightWrap,i.mapLightAnisotropy);break;case"mapLightRepeat":case"mapLightOffset":case"mapLightWrap":case"mapLightAnisotropy":break;case"mapAO":h.aoMap=s(l,i.mapAORepeat,i.mapAOOffset,i.mapAOWrap,i.mapAOAnisotropy);break;case"mapAORepeat":case"mapAOOffset":case"mapAOWrap":case"mapAOAnisotropy":break;case"mapBump":h.bumpMap=s(l,i.mapBumpRepeat,i.mapBumpOffset,i.mapBumpWrap,i.mapBumpAnisotropy);break;case"mapBumpScale":h.bumpScale=l;break;case"mapBumpRepeat":case"mapBumpOffset":case"mapBumpWrap":case"mapBumpAnisotropy":break;case"mapNormal":h.normalMap=s(l,i.mapNormalRepeat,i.mapNormalOffset,i.mapNormalWrap,i.mapNormalAnisotropy);break;case"mapNormalFactor":h.normalScale=[l,l];break;case"mapNormalRepeat":case"mapNormalOffset":case"mapNormalWrap":case"mapNormalAnisotropy":break;case"mapSpecular":h.specularMap=s(l,i.mapSpecularRepeat,i.mapSpecularOffset,i.mapSpecularWrap,i.mapSpecularAnisotropy);break;case"mapSpecularRepeat":case"mapSpecularOffset":case"mapSpecularWrap":case"mapSpecularAnisotropy":break;case"mapMetalness":h.metalnessMap=s(l,i.mapMetalnessRepeat,i.mapMetalnessOffset,i.mapMetalnessWrap,i.mapMetalnessAnisotropy);break;case"mapMetalnessRepeat":case"mapMetalnessOffset":case"mapMetalnessWrap":case"mapMetalnessAnisotropy":break;case"mapRoughness":h.roughnessMap=s(l,i.mapRoughnessRepeat,i.mapRoughnessOffset,i.mapRoughnessWrap,i.mapRoughnessAnisotropy);break;case"mapRoughnessRepeat":case"mapRoughnessOffset":case"mapRoughnessWrap":case"mapRoughnessAnisotropy":break;case"mapAlpha":h.alphaMap=s(l,i.mapAlphaRepeat,i.mapAlphaOffset,i.mapAlphaWrap,i.mapAlphaAnisotropy);break;case"mapAlphaRepeat":case"mapAlphaOffset":case"mapAlphaWrap":case"mapAlphaAnisotropy":break;case"flipSided":h.side=1;break;case"doubleSided":h.side=2;break;case"transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity"),h.opacity=l;break;case"depthTest":case"depthWrite":case"colorWrite":case"opacity":case"reflectivity":case"transparent":case"visible":case"wireframe":h[c]=l;break;case"vertexColors":!0===l&&(h.vertexColors=2),"face"===l&&(h.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",c,l)}}return"MeshBasicMaterial"===h.type&&delete h.emissive,"MeshPhongMaterial"!==h.type&&delete h.specular,1>h.opacity&&(h.transparent=!0),n.setTextures(u),n.parse(h)}}()}),Object.assign(qr.prototype,{load:function(e,t,r,n){var i=this,o=this.texturePath&&"string"==typeof this.texturePath?this.texturePath:Hr.prototype.extractUrlBase(e),a=new fr(this.manager);a.setWithCredentials(this.withCredentials),a.load(e,function(r){var n=(r=JSON.parse(r)).metadata;if(void 0!==n&&void 0!==(n=n.type)){if("object"===n.toLowerCase())return void console.error("THREE.JSONLoader: "+e+" should be loaded with THREE.ObjectLoader instead.");if("scene"===n.toLowerCase())return void console.error("THREE.JSONLoader: "+e+" should be loaded with THREE.SceneLoader instead.")}r=i.parse(r,o),t(r.geometry,r.materials)},r,n)},setTexturePath:function(e){this.texturePath=e},parse:function(e,t){void 0!==e.data&&(e=e.data),e.scale=void 0!==e.scale?1/e.scale:1;var n,i,a,s=new se,u=e,h=u.faces,l=u.vertices,p=u.normals,f=u.colors,d=u.scale,m=0;if(void 0!==u.uvs){for(n=0;n<u.uvs.length;n++)u.uvs[n].length&&m++;for(n=0;n<m;n++)s.faceVertexUvs[n]=[]}var v=0;for(a=l.length;v<a;)n=new o,n.x=l[v++]*d,n.y=l[v++]*d,n.z=l[v++]*d,s.vertices.push(n);for(v=0,a=h.length;v<a;){var g=1&(l=h[v++]),y=2&l;n=8&l;var b=16&l,_=32&l;if(d=64&l,l&=128,g){(g=new ae).a=h[v],g.b=h[v+1],g.c=h[v+3];var x=new ae;if(x.a=h[v+1],x.b=h[v+2],x.c=h[v+3],v+=4,y&&(y=h[v++],g.materialIndex=y,x.materialIndex=y),y=s.faces.length,n)for(n=0;n<m;n++){var w=u.uvs[n];for(s.faceVertexUvs[n][y]=[],s.faceVertexUvs[n][y+1]=[],i=0;4>i;i++){var S=h[v++],M=w[2*S];M=new r(M,S=w[2*S+1]),2!==i&&s.faceVertexUvs[n][y].push(M),0!==i&&s.faceVertexUvs[n][y+1].push(M)}}if(b&&(b=3*h[v++],g.normal.set(p[b++],p[b++],p[b]),x.normal.copy(g.normal)),_)for(n=0;4>n;n++)b=3*h[v++],_=new o(p[b++],p[b++],p[b]),2!==n&&g.vertexNormals.push(_),0!==n&&x.vertexNormals.push(_);if(d&&(d=h[v++],d=f[d],g.color.setHex(d),x.color.setHex(d)),l)for(n=0;4>n;n++)d=h[v++],d=f[d],2!==n&&g.vertexColors.push(new $(d)),0!==n&&x.vertexColors.push(new $(d));s.faces.push(g),s.faces.push(x)}else{if(g=new ae,g.a=h[v++],g.b=h[v++],g.c=h[v++],y&&(y=h[v++],g.materialIndex=y),y=s.faces.length,n)for(n=0;n<m;n++)for(w=u.uvs[n],s.faceVertexUvs[n][y]=[],i=0;3>i;i++)S=h[v++],M=w[2*S],S=w[2*S+1],M=new r(M,S),s.faceVertexUvs[n][y].push(M);if(b&&(b=3*h[v++],g.normal.set(p[b++],p[b++],p[b])),_)for(n=0;3>n;n++)b=3*h[v++],_=new o(p[b++],p[b++],p[b]),g.vertexNormals.push(_);if(d&&(d=h[v++],g.color.setHex(f[d])),l)for(n=0;3>n;n++)d=h[v++],g.vertexColors.push(new $(f[d]));s.faces.push(g)}}if(u=e,v=void 0!==u.influencesPerVertex?u.influencesPerVertex:2,u.skinWeights)for(a=0,h=u.skinWeights.length;a<h;a+=v)s.skinWeights.push(new c(u.skinWeights[a],1<v?u.skinWeights[a+1]:0,2<v?u.skinWeights[a+2]:0,3<v?u.skinWeights[a+3]:0));if(u.skinIndices)for(a=0,h=u.skinIndices.length;a<h;a+=v)s.skinIndices.push(new c(u.skinIndices[a],1<v?u.skinIndices[a+1]:0,2<v?u.skinIndices[a+2]:0,3<v?u.skinIndices[a+3]:0));if(s.bones=u.bones,s.bones&&0<s.bones.length&&(s.skinWeights.length!==s.skinIndices.length||s.skinIndices.length!==s.vertices.length)&&console.warn("When skinning, number of vertices ("+s.vertices.length+"), skinIndices ("+s.skinIndices.length+"), and skinWeights ("+s.skinWeights.length+") should match."),a=e,h=a.scale,void 0!==a.morphTargets)for(u=0,v=a.morphTargets.length;u<v;u++)for(s.morphTargets[u]={},s.morphTargets[u].name=a.morphTargets[u].name,s.morphTargets[u].vertices=[],p=s.morphTargets[u].vertices,f=a.morphTargets[u].vertices,m=0,l=f.length;m<l;m+=3)d=new o,d.x=f[m]*h,d.y=f[m+1]*h,d.z=f[m+2]*h,p.push(d);if(void 0!==a.morphColors&&0<a.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),h=s.faces,a=a.morphColors[0].colors,u=0,v=h.length;u<v;u++)h[u].color.fromArray(a,3*u);for(u=[],v=[],void 0!==(a=e).animation&&v.push(a.animation),void 0!==a.animations&&(a.animations.length?v=v.concat(a.animations):v.push(a.animations)),a=0;a<v.length;a++)(h=$r.parseAnimation(v[a],s.bones))&&u.push(h);return s.morphTargets&&(v=$r.CreateClipsFromMorphTargetSequences(s.morphTargets,10),u=u.concat(v)),0<u.length&&(s.animations=u),s.computeFaceNormals(),s.computeBoundingSphere(),void 0===e.materials||0===e.materials.length?{geometry:s}:(e=Hr.prototype.initMaterials(e.materials,t,this.crossOrigin),{geometry:s,materials:e})}}),Object.assign(Wr.prototype,{load:function(e,t,r,n){""===this.texturePath&&(this.texturePath=e.substring(0,e.lastIndexOf("/")+1));var i=this;new fr(i.manager).load(e,function(r){var o=null;try{o=JSON.parse(r)}catch(t){return void 0!==n&&n(t),void console.error("THREE:ObjectLoader: Can't parse "+e+".",t.message)}void 0===(r=o.metadata)||void 0===r.type||"geometry"===r.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+e+". Use THREE.JSONLoader instead."):i.parse(o,t)},r,n)},setTexturePath:function(e){this.texturePath=e},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(e,t){var r=this.parseGeometries(e.geometries),n=this.parseImages(e.images,function(){void 0!==t&&t(i)}),n=this.parseTextures(e.textures,n),n=this.parseMaterials(e.materials,n),i=this.parseObject(e.object,r,n);return e.animations&&(i.animations=this.parseAnimations(e.animations)),void 0!==e.images&&0!==e.images.length||void 0===t||t(i),i},parseGeometries:function(e){var t={};if(void 0!==e)for(var r=new qr,n=new Vr,i=0,o=e.length;i<o;i++){var a=e[i];switch(a.type){case"PlaneGeometry":case"PlaneBufferGeometry":var s=new Oi[a.type](a.width,a.height,a.widthSegments,a.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":case"CubeGeometry":s=new Oi[a.type](a.width,a.height,a.depth,a.widthSegments,a.heightSegments,a.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":s=new Oi[a.type](a.radius,a.segments,a.thetaStart,a.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":s=new Oi[a.type](a.radiusTop,a.radiusBottom,a.height,a.radialSegments,a.heightSegments,a.openEnded,a.thetaStart,a.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":s=new Oi[a.type](a.radius,a.height,a.radialSegments,a.heightSegments,a.openEnded,a.thetaStart,a.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":s=new Oi[a.type](a.radius,a.widthSegments,a.heightSegments,a.phiStart,a.phiLength,a.thetaStart,a.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":s=new Oi[a.type](a.radius,a.detail);break;case"RingGeometry":case"RingBufferGeometry":s=new Oi[a.type](a.innerRadius,a.outerRadius,a.thetaSegments,a.phiSegments,a.thetaStart,a.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":s=new Oi[a.type](a.radius,a.tube,a.radialSegments,a.tubularSegments,a.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":s=new Oi[a.type](a.radius,a.tube,a.tubularSegments,a.radialSegments,a.p,a.q);break;case"LatheGeometry":case"LatheBufferGeometry":s=new Oi[a.type](a.points,a.segments,a.phiStart,a.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":s=new Oi[a.type](a.vertices,a.indices,a.radius,a.details);break;case"BufferGeometry":s=n.parse(a);break;case"Geometry":s=r.parse(a,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+a.type+'"');continue}s.uuid=a.uuid,void 0!==a.name&&(s.name=a.name),t[a.uuid]=s}return t},parseMaterials:function(e,t){var r={};if(void 0!==e){var n=new Gr;n.setTextures(t),t=0;for(var i=e.length;t<i;t++){var o=e[t];if("MultiMaterial"===o.type){for(var a=[],s=0;s<o.materials.length;s++)a.push(n.parse(o.materials[s]));r[o.uuid]=a}else r[o.uuid]=n.parse(o)}}return r},parseAnimations:function(e){for(var t=[],r=0;r<e.length;r++){var n=$r.parse(e[r]);t.push(n)}return t},parseImages:function(e,t){function r(e){return n.manager.itemStart(e),o.load(e,function(){n.manager.itemEnd(e)},void 0,function(){n.manager.itemEnd(e),n.manager.itemError(e)})}var n=this,i={};if(void 0!==e&&0<e.length){var o=new vr(t=new pr(t));o.setCrossOrigin(this.crossOrigin),t=0;for(var a=e.length;t<a;t++){var s=e[t],c=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(s.url)?s.url:n.texturePath+s.url;i[s.uuid]=r(c)}}return i},parseTextures:function(e,t){function r(e,t){return"number"==typeof e?e:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",e),t[e])}var n={};if(void 0!==e)for(var i=0,o=e.length;i<o;i++){var a=e[i];void 0===a.image&&console.warn('THREE.ObjectLoader: No "image" specified for',a.uuid),void 0===t[a.image]&&console.warn("THREE.ObjectLoader: Undefined image",a.image);var c=new s(t[a.image]);c.needsUpdate=!0,c.uuid=a.uuid,void 0!==a.name&&(c.name=a.name),void 0!==a.mapping&&(c.mapping=r(a.mapping,Di)),void 0!==a.offset&&c.offset.fromArray(a.offset),void 0!==a.repeat&&c.repeat.fromArray(a.repeat),void 0!==a.center&&c.center.fromArray(a.center),void 0!==a.rotation&&(c.rotation=a.rotation),void 0!==a.wrap&&(c.wrapS=r(a.wrap[0],ki),c.wrapT=r(a.wrap[1],ki)),void 0!==a.minFilter&&(c.minFilter=r(a.minFilter,Fi)),void 0!==a.magFilter&&(c.magFilter=r(a.magFilter,Fi)),void 0!==a.anisotropy&&(c.anisotropy=a.anisotropy),void 0!==a.flipY&&(c.flipY=a.flipY),n[a.uuid]=c}return n},parseObject:function(){var e=new n;return function(t,r,n){function i(e){return void 0===r[e]&&console.warn("THREE.ObjectLoader: Undefined geometry",e),r[e]}function o(e){if(void 0!==e){if(Array.isArray(e)){for(var t=[],r=0,i=e.length;r<i;r++){var o=e[r];void 0===n[o]&&console.warn("THREE.ObjectLoader: Undefined material",o),t.push(n[o])}return t}return void 0===n[e]&&console.warn("THREE.ObjectLoader: Undefined material",e),n[e]}}switch(t.type){case"Scene":var a=new tt;void 0!==t.background&&Number.isInteger(t.background)&&(a.background=new $(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?a.fog=new et(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(a.fog=new Qe(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":a=new We(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(a.focus=t.focus),void 0!==t.zoom&&(a.zoom=t.zoom),void 0!==t.filmGauge&&(a.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(a.filmOffset=t.filmOffset),void 0!==t.view&&(a.view=Object.assign({},t.view));break;case"OrthographicCamera":a=new oe(t.left,t.right,t.top,t.bottom,t.near,t.far);break;case"AmbientLight":a=new Tr(t.color,t.intensity);break;case"DirectionalLight":a=new Cr(t.color,t.intensity);break;case"PointLight":a=new Mr(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":a=new Or(t.color,t.intensity,t.width,t.height);break;case"SpotLight":a=new Sr(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":a=new _r(t.color,t.groundColor,t.intensity);break;case"SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case"Mesh":a=i(t.geometry);s=o(t.material);a=a.bones&&0<a.bones.length?new ct(a,s):new je(a,s);break;case"LOD":a=new ot;break;case"Line":a=new ht(i(t.geometry),o(t.material),t.mode);break;case"LineLoop":a=new pt(i(t.geometry),o(t.material));break;case"LineSegments":a=new lt(i(t.geometry),o(t.material));break;case"PointCloud":case"Points":a=new dt(i(t.geometry),o(t.material));break;case"Sprite":a=new it(o(t.material));break;case"Group":a=new mt;break;default:a=new ne}if(a.uuid=t.uuid,void 0!==t.name&&(a.name=t.name),void 0!==t.matrix?(e.fromArray(t.matrix),e.decompose(a.position,a.quaternion,a.scale)):(void 0!==t.position&&a.position.fromArray(t.position),void 0!==t.rotation&&a.rotation.fromArray(t.rotation),void 0!==t.quaternion&&a.quaternion.fromArray(t.quaternion),void 0!==t.scale&&a.scale.fromArray(t.scale)),void 0!==t.castShadow&&(a.castShadow=t.castShadow),void 0!==t.receiveShadow&&(a.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(a.shadow.bias=t.shadow.bias),void 0!==t.shadow.radius&&(a.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&a.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(a.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(a.visible=t.visible),void 0!==t.userData&&(a.userData=t.userData),void 0!==t.children)for(var s=t.children,c=0;c<s.length;c++)a.add(this.parseObject(s[c],r,n));if("LOD"===t.type)for(t=t.levels,s=0;s<t.length;s++){var c=t[s],u=a.getObjectByProperty("uuid",c.object);void 0!==u&&a.addLevel(u,c.distance)}return a}}()});var Di={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},ki={RepeatWrapping:1e3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Fi={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(Zr.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(e,t){return e=this.getUtoTmapping(e),this.getPoint(e,t)},getPoints:function(e){void 0===e&&(e=5);for(var t=[],r=0;r<=e;r++)t.push(this.getPoint(r/e));return t},getSpacedPoints:function(e){void 0===e&&(e=5);for(var t=[],r=0;r<=e;r++)t.push(this.getPointAt(r/e));return t},getLength:function(){var e=this.getLengths();return e[e.length-1]},getLengths:function(e){if(void 0===e&&(e=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t,r=[],n=this.getPoint(0),i=0;for(r.push(0),t=1;t<=e;t++){var o=this.getPoint(t/e);i+=o.distanceTo(n),r.push(i),n=o}return this.cacheArcLengths=r},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(e,t){var r=this.getLengths(),n=r.length;t=t||e*r[n-1];for(var i,o=0,a=n-1;o<=a;)if(e=Math.floor(o+(a-o)/2),0>(i=r[e]-t))o=e+1;else{if(!(0<i)){a=e;break}a=e-1}return e=a,r[e]===t?e/(n-1):(o=r[e],(e+(t-o)/(r[e+1]-o))/(n-1))},getTangent:function(e){var t=e-1e-4;return e+=1e-4,0>t&&(t=0),1<e&&(e=1),t=this.getPoint(t),this.getPoint(e).clone().sub(t).normalize()},getTangentAt:function(e){return e=this.getUtoTmapping(e),this.getTangent(e)},computeFrenetFrames:function(e,t){var r,i=new o,a=[],s=[],c=[],u=new o,h=new n;for(r=0;r<=e;r++){var l=r/e;a[r]=this.getTangentAt(l),a[r].normalize()}s[0]=new o,c[0]=new o,r=Number.MAX_VALUE,l=Math.abs(a[0].x);var p=Math.abs(a[0].y),f=Math.abs(a[0].z);for(l<=r&&(r=l,i.set(1,0,0)),p<=r&&(r=p,i.set(0,1,0)),f<=r&&i.set(0,0,1),u.crossVectors(a[0],i).normalize(),s[0].crossVectors(a[0],u),c[0].crossVectors(a[0],s[0]),r=1;r<=e;r++)s[r]=s[r-1].clone(),c[r]=c[r-1].clone(),u.crossVectors(a[r-1],a[r]),u.length()>Number.EPSILON&&(u.normalize(),i=Math.acos(ci.clamp(a[r-1].dot(a[r]),-1,1)),s[r].applyMatrix4(h.makeRotationAxis(u,i))),c[r].crossVectors(a[r],s[r]);if(!0===t)for(i=Math.acos(ci.clamp(s[0].dot(s[e]),-1,1)),i/=e,0<a[0].dot(u.crossVectors(s[0],s[e]))&&(i=-i),r=1;r<=e;r++)s[r].applyMatrix4(h.makeRotationAxis(a[r],i*r)),c[r].crossVectors(a[r],s[r]);return{tangents:a,normals:s,binormals:c}},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}),(Jr.prototype=Object.create(Zr.prototype)).constructor=Jr,Jr.prototype.isLineCurve=!0,Jr.prototype.getPoint=function(e,t){return t=t||new r,1===e?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t},Jr.prototype.getPointAt=function(e,t){return this.getPoint(e,t)},Jr.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()},Jr.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v1.copy(e.v1),this.v2.copy(e.v2),this},Qr.prototype=Object.assign(Object.create(Zr.prototype),{constructor:Qr,add:function(e){this.curves.push(e)},closePath:function(){var e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new Jr(t,e))},getPoint:function(e){var t=e*this.getLength(),r=this.getCurveLengths();for(e=0;e<r.length;){if(r[e]>=t)return t=r[e]-t,e=this.curves[e],r=e.getLength(),e.getPointAt(0===r?0:1-t/r);e++}return null},getLength:function(){var e=this.getCurveLengths();return e[e.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var e=[],t=0,r=0,n=this.curves.length;r<n;r++)t+=this.curves[r].getLength(),e.push(t);return this.cacheLengths=e},getSpacedPoints:function(e){void 0===e&&(e=40);for(var t=[],r=0;r<=e;r++)t.push(this.getPoint(r/e));return this.autoClose&&t.push(t[0]),t},getPoints:function(e){e=e||12;for(var t,r=[],n=0,i=this.curves;n<i.length;n++)for(var o=i[n],o=o.getPoints(o&&o.isEllipseCurve?2*e:o&&o.isLineCurve?1:o&&o.isSplineCurve?e*o.points.length:e),a=0;a<o.length;a++){var s=o[a];t&&t.equals(s)||(r.push(s),t=s)}return this.autoClose&&1<r.length&&!r[r.length-1].equals(r[0])&&r.push(r[0]),r},copy:function(e){Zr.prototype.copy.call(this,e),this.curves=[];for(var t=0,r=e.curves.length;t<r;t++)this.curves.push(e.curves[t].clone());return this.autoClose=e.autoClose,this}}),(en.prototype=Object.create(Zr.prototype)).constructor=en,en.prototype.isEllipseCurve=!0,en.prototype.getPoint=function(e,t){t=t||new r;for(var n=2*Math.PI,i=this.aEndAngle-this.aStartAngle,o=Math.abs(i)<Number.EPSILON;0>i;)i+=n;for(;i>n;)i-=n;i<Number.EPSILON&&(i=o?0:n),!0!==this.aClockwise||o||(i=i===n?-n:i-n),n=this.aStartAngle+e*i,e=this.aX+this.xRadius*Math.cos(n);var a=this.aY+this.yRadius*Math.sin(n);return 0!==this.aRotation&&(n=Math.cos(this.aRotation),i=Math.sin(this.aRotation),o=e-this.aX,a-=this.aY,e=o*n-a*i+this.aX,a=o*i+a*n+this.aY),t.set(e,a)},en.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this},(tn.prototype=Object.create(Zr.prototype)).constructor=tn,tn.prototype.isSplineCurve=!0,tn.prototype.getPoint=function(e,t){t=t||new r;var n=(n=((s=this.points).length-1)*e)-(e=Math.floor(n)),i=s[0===e?e:e-1],o=s[e],a=s[e>s.length-2?s.length-1:e+1],s=s[e>s.length-3?s.length-1:e+2];return t.set(Xr(n,i.x,o.x,a.x,s.x),Xr(n,i.y,o.y,a.y,s.y)),t},tn.prototype.copy=function(e){Zr.prototype.copy.call(this,e),this.points=[];for(var t=0,r=e.points.length;t<r;t++)this.points.push(e.points[t].clone());return this},(rn.prototype=Object.create(Zr.prototype)).constructor=rn,rn.prototype.isCubicBezierCurve=!0,rn.prototype.getPoint=function(e,t){t=t||new r;var n=this.v0,i=this.v1,o=this.v2,a=this.v3;return t.set(Kr(e,n.x,i.x,o.x,a.x),Kr(e,n.y,i.y,o.y,a.y)),t},rn.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this},(nn.prototype=Object.create(Zr.prototype)).constructor=nn,nn.prototype.isQuadraticBezierCurve=!0,nn.prototype.getPoint=function(e,t){t=t||new r;var n=this.v0,i=this.v1,o=this.v2;return t.set(Yr(e,n.x,i.x,o.x),Yr(e,n.y,i.y,o.y)),t},nn.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this};var Bi=Object.assign(Object.create(Qr.prototype),{setFromPoints:function(e){this.moveTo(e[0].x,e[0].y);for(var t=1,r=e.length;t<r;t++)this.lineTo(e[t].x,e[t].y)},moveTo:function(e,t){this.currentPoint.set(e,t)},lineTo:function(e,t){var n=new Jr(this.currentPoint.clone(),new r(e,t));this.curves.push(n),this.currentPoint.set(e,t)},quadraticCurveTo:function(e,t,n,i){e=new nn(this.currentPoint.clone(),new r(e,t),new r(n,i)),this.curves.push(e),this.currentPoint.set(n,i)},bezierCurveTo:function(e,t,n,i,o,a){e=new rn(this.currentPoint.clone(),new r(e,t),new r(n,i),new r(o,a)),this.curves.push(e),this.currentPoint.set(o,a)},splineThru:function(e){var t=new tn(t=[this.currentPoint.clone()].concat(e));this.curves.push(t),this.currentPoint.copy(e[e.length-1])},arc:function(e,t,r,n,i,o){this.absarc(e+this.currentPoint.x,t+this.currentPoint.y,r,n,i,o)},absarc:function(e,t,r,n,i,o){this.absellipse(e,t,r,r,n,i,o)},ellipse:function(e,t,r,n,i,o,a,s){this.absellipse(e+this.currentPoint.x,t+this.currentPoint.y,r,n,i,o,a,s)},absellipse:function(e,t,r,n,i,o,a,s){e=new en(e,t,r,n,i,o,a,s),0<this.curves.length&&((t=e.getPoint(0)).equals(this.currentPoint)||this.lineTo(t.x,t.y)),this.curves.push(e),e=e.getPoint(1),this.currentPoint.copy(e)},copy:function(e){return Qr.prototype.copy.call(this,e),this.currentPoint.copy(e.currentPoint),this}});on.prototype=Bi,Bi.constructor=on,an.prototype=Object.assign(Object.create(Bi),{constructor:an,getPointsHoles:function(e){for(var t=[],r=0,n=this.holes.length;r<n;r++)t[r]=this.holes[r].getPoints(e);return t},extractPoints:function(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}},copy:function(e){on.prototype.copy.call(this,e),this.holes=[];for(var t=0,r=e.holes.length;t<r;t++)this.holes.push(e.holes[t].clone());return this}}),Object.assign(sn.prototype,{moveTo:function(e,t){this.currentPath=new on,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,t)},lineTo:function(e,t){this.currentPath.lineTo(e,t)},quadraticCurveTo:function(e,t,r,n){this.currentPath.quadraticCurveTo(e,t,r,n)},bezierCurveTo:function(e,t,r,n,i,o){this.currentPath.bezierCurveTo(e,t,r,n,i,o)},splineThru:function(e){this.currentPath.splineThru(e)},toShapes:function(e,t){function r(e){for(var t=[],r=0,n=e.length;r<n;r++){var i=e[r],o=new an;o.curves=i.curves,t.push(o)}return t}function n(e,t){for(var r=t.length,n=!1,i=r-1,o=0;o<r;i=o++){var a=t[i],s=t[o],c=s.x-a.x,u=s.y-a.y;if(Math.abs(u)>Number.EPSILON){if(0>u&&(a=t[o],c=-c,s=t[i],u=-u),!(e.y<a.y||e.y>s.y))if(e.y===a.y){if(e.x===a.x)return!0}else{if(0==(i=u*(e.x-a.x)-c*(e.y-a.y)))return!0;0>i||(n=!n)}}else if(e.y===a.y&&(s.x<=e.x&&e.x<=a.x||a.x<=e.x&&e.x<=s.x))return!0}return n}var i=Ti.isClockWise,o=this.subPaths;if(0===o.length)return[];if(!0===t)return r(o);if(t=[],1===o.length){var a=o[0],s=new an;return s.curves=a.curves,t.push(s),t}var c=!i(o[0].getPoints()),c=e?!c:c;s=[];var u=[],h=[],l=0;u[l]=void 0,h[l]=[];for(var p=0,f=o.length;p<f;p++){var d=(a=o[p]).getPoints(),m=i(d);(m=e?!m:m)?(!c&&u[l]&&l++,u[l]={s:new an,p:d},u[l].s.curves=a.curves,c&&l++,h[l]=[]):h[l].push({h:a,p:d[0]})}if(!u[0])return r(o);if(1<u.length){for(p=!1,e=[],i=0,o=u.length;i<o;i++)s[i]=[];for(i=0,o=u.length;i<o;i++)for(a=h[i],m=0;m<a.length;m++){for(c=a[m],l=!0,d=0;d<u.length;d++)n(c.p,u[d].p)&&(i!==d&&e.push({froms:i,tos:d,hole:m}),l?(l=!1,s[d].push(c)):p=!0);l&&s[i].push(c)}0<e.length&&(p||(h=s))}for(p=0,i=u.length;p<i;p++)for(s=u[p].s,t.push(s),e=h[p],o=0,a=e.length;o<a;o++)s.holes.push(e[o].h);return t}}),Object.assign(cn.prototype,{isFont:!0,generateShapes:function(e,t,r){void 0===t&&(t=100),void 0===r&&(r=4);var n=this.data;e=String(e).split("");var i=t/n.resolution,o=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*i,a=0,s=0;t=[];for(var c=0;c<e.length;c++){var u=e[c];if("\n"===u)a=0,s-=o;else{var h,l=i,p=a,f=s;if(u=n.glyphs[u]||n.glyphs["?"]){var d=new sn,m=[];if(u.o)for(var v=u._cachedOutline||(u._cachedOutline=u.o.split(" ")),g=0,y=v.length;g<y;)switch(v[g++]){case"m":var b=v[g++]*l+p,_=v[g++]*l+f;d.moveTo(b,_);break;case"l":b=v[g++]*l+p,_=v[g++]*l+f,d.lineTo(b,_);break;case"q":var x=v[g++]*l+p,w=v[g++]*l+f,S=v[g++]*l+p,M=v[g++]*l+f;if(d.quadraticCurveTo(S,M,x,w),h=m[m.length-1]){var E=h.x;h=h.y;for(var C=1;C<=r;C++){var T=C/r;Yr(T,E,S,x),Yr(T,h,M,w)}}break;case"b":if(x=v[g++]*l+p,w=v[g++]*l+f,S=v[g++]*l+p,M=v[g++]*l+f,b=v[g++]*l+p,_=v[g++]*l+f,d.bezierCurveTo(S,M,b,_,x,w),h=m[m.length-1])for(E=h.x,h=h.y,C=1;C<=r;C++)T=C/r,Kr(T,E,S,b,x),Kr(T,h,M,_,w)}l={offsetX:u.ha*l,path:d}}else l=void 0;a+=l.offsetX,t.push(l.path)}}for(r=[],n=0,e=t.length;n<e;n++)Array.prototype.push.apply(r,t[n].toShapes());return r}}),Object.assign(un.prototype,{load:function(e,t,r,n){var i=this,o=new fr(this.manager);o.setPath(this.path),o.load(e,function(e){try{var r=JSON.parse(e)}catch(t){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),r=JSON.parse(e.substring(65,e.length-2))}e=i.parse(r),t&&t(e)},r,n)},parse:function(e){return new cn(e)},setPath:function(e){return this.path=e,this}});var Ui,zi={getContext:function(){return void 0===Ui&&(Ui=new(window.AudioContext||window.webkitAudioContext)),Ui},setContext:function(e){Ui=e}};Object.assign(hn.prototype,{load:function(e,t,r,n){var i=new fr(this.manager);i.setResponseType("arraybuffer"),i.load(e,function(e){zi.getContext().decodeAudioData(e,function(e){t(e)})},r,n)}}),Object.assign(ln.prototype,{update:function(){var e,t,r,i,o,a,s,c,u=new n,h=new n;return function(n){if(e!==this||t!==n.focus||r!==n.fov||i!==n.aspect*this.aspect||o!==n.near||a!==n.far||s!==n.zoom||c!==this.eyeSep){e=this,t=n.focus,r=n.fov,i=n.aspect*this.aspect,o=n.near,a=n.far,s=n.zoom;var l=n.projectionMatrix.clone(),p=(c=this.eyeSep/2)*o/t,f=o*Math.tan(ci.DEG2RAD*r*.5)/s;h.elements[12]=-c,u.elements[12]=c;var d=-f*i+p,m=f*i+p;l.elements[0]=2*o/(m-d),l.elements[8]=(m+d)/(m-d),this.cameraL.projectionMatrix.copy(l),d=-f*i-p,m=f*i-p,l.elements[0]=2*o/(m-d),l.elements[8]=(m+d)/(m-d),this.cameraR.projectionMatrix.copy(l)}this.cameraL.matrixWorld.copy(n.matrixWorld).multiply(h),this.cameraR.matrixWorld.copy(n.matrixWorld).multiply(u)}}()}),(pn.prototype=Object.create(ne.prototype)).constructor=pn,fn.prototype=Object.assign(Object.create(ne.prototype),{constructor:fn,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(e){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(e){this.gain.gain.value=e},updateMatrixWorld:function(){var e=new o,t=new i,r=new o,n=new o;return function(i){ne.prototype.updateMatrixWorld.call(this,i),i=this.context.listener;var o=this.up;this.matrixWorld.decompose(e,t,r),n.set(0,0,-1).applyQuaternion(t),i.positionX?(i.positionX.setValueAtTime(e.x,this.context.currentTime),i.positionY.setValueAtTime(e.y,this.context.currentTime),i.positionZ.setValueAtTime(e.z,this.context.currentTime),i.forwardX.setValueAtTime(n.x,this.context.currentTime),i.forwardY.setValueAtTime(n.y,this.context.currentTime),i.forwardZ.setValueAtTime(n.z,this.context.currentTime),i.upX.setValueAtTime(o.x,this.context.currentTime),i.upY.setValueAtTime(o.y,this.context.currentTime),i.upZ.setValueAtTime(o.z,this.context.currentTime)):(i.setPosition(e.x,e.y,e.z),i.setOrientation(n.x,n.y,n.z,o.x,o.y,o.z))}}()}),dn.prototype=Object.assign(Object.create(ne.prototype),{constructor:dn,getOutput:function(){return this.gain},setNodeSource:function(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this},setBuffer:function(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else{if(!1!==this.hasPlaybackControl){var e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.onended=this.onEnded.bind(this),e.playbackRate.setValueAtTime(this.playbackRate,this.startTime),this.startTime=this.context.currentTime,e.start(this.startTime,this.offset),this.isPlaying=!0,this.source=e,this.connect()}console.warn("THREE.Audio: this Audio has no playback control.")}},pause:function(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this.source.stop(),this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")},stop:function(){if(!1!==this.hasPlaybackControl)return this.source.stop(),this.offset=0,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(e){return e||(e=[]),!0===this.isPlaying?(this.disconnect(),this.filters=e,this.connect()):this.filters=e,this},getFilter:function(){return this.getFilters()[0]},setFilter:function(e){return this.setFilters(e?[e]:[])},setPlaybackRate:function(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this;console.warn("THREE.Audio: this Audio has no playback control.")},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")},getVolume:function(){return this.gain.gain.value},setVolume:function(e){return this.gain.gain.value=e,this}}),mn.prototype=Object.assign(Object.create(dn.prototype),{constructor:mn,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(e){this.panner.refDistance=e},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(e){this.panner.rolloffFactor=e},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(e){this.panner.distanceModel=e},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(e){this.panner.maxDistance=e},updateMatrixWorld:function(){var e=new o;return function(t){ne.prototype.updateMatrixWorld.call(this,t),e.setFromMatrixPosition(this.matrixWorld),this.panner.setPosition(e.x,e.y,e.z)}}()}),Object.assign(vn.prototype,{getFrequencyData:function(){return this.analyser.getByteFrequencyData(this.data),this.data},getAverageFrequency:function(){for(var e=0,t=this.getFrequencyData(),r=0;r<t.length;r++)e+=t[r];return e/t.length}}),Object.assign(gn.prototype,{accumulate:function(e,t){var r=this.buffer,n=this.valueSize;e=e*n+n;var i=this.cumulativeWeight;if(0===i){for(i=0;i!==n;++i)r[e+i]=r[i];i=t}else i+=t,this._mixBufferRegion(r,e,0,t/i,n);this.cumulativeWeight=i},apply:function(e){var t=this.valueSize,r=this.buffer;e=e*t+t;var n=this.cumulativeWeight,i=this.binding;this.cumulativeWeight=0,1>n&&this._mixBufferRegion(r,e,3*t,1-n,t);for(var n=t,o=t+t;n!==o;++n)if(r[n]!==r[n+t]){i.setValue(r,e);break}},saveOriginalState:function(){var e=this.buffer,t=this.valueSize,r=3*t;this.binding.getValue(e,r);for(var n=t;n!==r;++n)e[n]=e[r+n%t];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(e,t,r,n,i){if(.5<=n)for(n=0;n!==i;++n)e[t+n]=e[r+n]},_slerp:function(e,t,r,n){i.slerpFlat(e,t,e,t,e,r,n)},_lerp:function(e,t,r,n,i){for(var o=1-n,a=0;a!==i;++a){var s=t+a;e[s]=e[s]*o+e[r+a]*n}}}),Object.assign(yn.prototype,{getValue:function(e,t){this.bind();var r=this._bindings[this._targetGroup.nCachedObjects_];void 0!==r&&r.getValue(e,t)},setValue:function(e,t){for(var r=this._bindings,n=this._targetGroup.nCachedObjects_,i=r.length;n!==i;++n)r[n].setValue(e,t)},bind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,r=e.length;t!==r;++t)e[t].bind()},unbind:function(){for(var e=this._bindings,t=this._targetGroup.nCachedObjects_,r=e.length;t!==r;++t)e[t].unbind()}}),Object.assign(bn,{Composite:yn,create:function(e,t,r){return e&&e.isAnimationObjectGroup?new bn.Composite(e,t,r):new bn(e,t,r)},sanitizeNodeName:function(e){return e.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var e=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),t=["material","materials","bones"];return function(r){n=e.exec(r);if(!n)throw Error("PropertyBinding: Cannot parse trackName: "+r);var n,i=(n={nodeName:n[2],objectName:n[3],objectIndex:n[4],propertyName:n[5],propertyIndex:n[6]}).nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){var o=n.nodeName.substring(i+1);-1!==t.indexOf(o)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=o)}if(null===n.propertyName||0===n.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+r);return n}}(),findNode:function(e,t){if(!t||""===t||"root"===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){var r=function(e){for(var r=0;r<e.bones.length;r++){var n=e.bones[r];if(n.name===t)return n}return null}(e.skeleton);if(r)return r}if(e.children){var n=function(e){for(var r=0;r<e.length;r++){var i=e[r];if(i.name===t||i.uuid===t||(i=n(i.children)))return i}return null};if(e=n(e.children))return e}return null}}),Object.assign(bn.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(e,t){e[t]=this.node[this.propertyName]},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)e[t++]=r[n]},function(e,t){e[t]=this.resolvedProperty[this.propertyIndex]},function(e,t){this.resolvedProperty.toArray(e,t)}],SetterByBindingTypeAndVersioning:[[function(e,t){this.targetObject[this.propertyName]=e[t]},function(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++]},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++];this.targetObject.needsUpdate=!0},function(e,t){for(var r=this.resolvedProperty,n=0,i=r.length;n!==i;++n)r[n]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty[this.propertyIndex]=e[t]},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(e,t){this.resolvedProperty.fromArray(e,t)},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0},function(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(e,t){this.bind(),this.getValue(e,t)},setValue:function(e,t){this.bind(),this.setValue(e,t)},bind:function(){var e=this.node,t=this.parsedPath,r=t.objectName,n=t.propertyName,i=t.propertyIndex;if(e||(this.node=e=bn.findNode(this.rootNode,t.nodeName)||this.rootNode),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,e){if(r){var o=t.objectIndex;switch(r){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);for(e=e.skeleton.bones,r=0;r<e.length;r++)if(e[r].name===o){o=r;break}break;default:if(void 0===e[r])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[r]}if(void 0!==o){if(void 0===e[o])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[o]}}if(void 0===(o=e[n]))console.error("THREE.PropertyBinding: Trying to update property for track: "+t.nodeName+"."+n+" but it wasn't found.",e);else{if(t=this.Versioning.None,void 0!==e.needsUpdate?(t=this.Versioning.NeedsUpdate,this.targetObject=e):void 0!==e.matrixWorldNeedsUpdate&&(t=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=e),r=this.BindingType.Direct,void 0!==i){if("morphTargetInfluences"===n){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(e.geometry.isBufferGeometry){if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);for(r=0;r<this.node.geometry.morphAttributes.position.length;r++)if(e.geometry.morphAttributes.position[r].name===i){i=r;break}}else{if(!e.geometry.morphTargets)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);for(r=0;r<this.node.geometry.morphTargets.length;r++)if(e.geometry.morphTargets[r].name===i){i=r;break}}}r=this.BindingType.ArrayElement,this.resolvedProperty=o,this.propertyIndex=i}else void 0!==o.fromArray&&void 0!==o.toArray?(r=this.BindingType.HasFromToArray,this.resolvedProperty=o):Array.isArray(o)?(r=this.BindingType.EntireArray,this.resolvedProperty=o):this.propertyName=n;this.getValue=this.GetterByBindingType[r],this.setValue=this.SetterByBindingTypeAndVersioning[r][t]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(bn.prototype,{_getValue_unbound:bn.prototype.getValue,_setValue_unbound:bn.prototype.setValue}),Object.assign(_n.prototype,{isAnimationObjectGroup:!0,add:function(){for(var e=this._objects,t=e.length,r=this.nCachedObjects_,n=this._indicesByUUID,i=this._paths,o=this._parsedPaths,a=this._bindings,s=a.length,c=0,u=arguments.length;c!==u;++c){var h=arguments[c],l=n[p=h.uuid];if(void 0===l){l=t++,n[p]=l,e.push(h);for(var p=0,f=s;p!==f;++p)a[p].push(new bn(h,i[p],o[p]))}else if(l<r){var d=--r;for(n[(f=e[d]).uuid]=l,e[l]=f,n[p]=d,e[d]=h,p=0,f=s;p!==f;++p){var m=a[p],v=m[l];m[l]=m[d],void 0===v&&(v=new bn(h,i[p],o[p])),m[d]=v}}else void 0!==e[l]&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=r},remove:function(){for(var e=this._objects,t=this.nCachedObjects_,r=this._indicesByUUID,n=this._bindings,i=n.length,o=0,a=arguments.length;o!==a;++o){var s=arguments[o],c=s.uuid,u=r[c];if(void 0!==u&&u>=t){var h=t++,l=e[h];for(r[l.uuid]=u,e[u]=l,r[c]=h,e[h]=s,s=0,c=i;s!==c;++s){var p=(l=n[s])[u];l[u]=l[h],l[h]=p}}}this.nCachedObjects_=t},uncache:function(){for(var e,t,r=this._objects,n=r.length,i=this.nCachedObjects_,o=this._indicesByUUID,a=this._bindings,s=a.length,c=0,u=arguments.length;c!==u;++c){var h=o[t=arguments[c].uuid];if(void 0!==h)if(delete o[t],h<i){var l=--i,p=r[l];e=r[t=--n],o[p.uuid]=h,r[h]=p,o[e.uuid]=l,r[l]=e,r.pop();for(var p=0,f=s;p!==f;++p){var d=(e=a[p])[t];e[h]=e[l],e[l]=d,e.pop()}}else for(t=--n,e=r[t],o[e.uuid]=h,r[h]=e,r.pop(),p=0,f=s;p!==f;++p)e=a[p],e[h]=e[t],e.pop()}this.nCachedObjects_=i},subscribe_:function(e,t){var r=this._bindingsIndicesByPath,n=r[e],i=this._bindings;if(void 0!==n)return i[n];var o=this._paths,a=this._parsedPaths,s=this._objects,c=this.nCachedObjects_,u=Array(s.length),n=i.length;for(r[e]=n,o.push(e),a.push(t),i.push(u),r=c,n=s.length;r!==n;++r)u[r]=new bn(s[r],e,t);return u},unsubscribe_:function(e){var t=this._bindingsIndicesByPath,r=t[e];if(void 0!==r){var n=this._paths,i=this._parsedPaths,o=this._bindings,a=o.length-1,s=o[a];t[e[a]]=r,o[r]=s,o.pop(),i[r]=i[a],i.pop(),n[r]=n[a],n.pop()}}}),Object.assign(xn.prototype,{play:function(){return this._mixer._activateAction(this),this},stop:function(){return this._mixer._deactivateAction(this),this.reset()},reset:function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(e){return this._startTime=e,this},setLoop:function(e,t){return this.loop=e,this.repetitions=t,this},setEffectiveWeight:function(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(e){return this._scheduleFading(e,0,1)},fadeOut:function(e){return this._scheduleFading(e,1,0)},crossFadeFrom:function(e,t,r){if(e.fadeOut(t),this.fadeIn(t),r){r=this._clip.duration;var n=e._clip.duration,i=r/n;e.warp(1,n/r,t),this.warp(i,1,t)}return this},crossFadeTo:function(e,t,r){return e.crossFadeFrom(this,t,r)},stopFading:function(){var e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},setEffectiveTimeScale:function(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(e){return this.timeScale=this._clip.duration/e,this.stopWarping()},syncWith:function(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()},halt:function(e){return this.warp(this._effectiveTimeScale,0,e)},warp:function(e,t,r){var n=this._mixer,i=n.time,o=this._timeScaleInterpolant,a=this.timeScale;return null===o&&(this._timeScaleInterpolant=o=n._lendControlInterpolant()),n=o.parameterPositions,o=o.sampleValues,n[0]=i,n[1]=i+r,o[0]=e/a,o[1]=t/a,this},stopWarping:function(){var e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(e,t,r,n){if(this.enabled){if(null!==(i=this._startTime)){if(0>(t=(e-i)*r)||0===r)return;this._startTime=null,t*=r}if(t*=this._updateTimeScale(e),r=this._updateTime(t),0<(e=this._updateWeight(e))){t=this._interpolants;for(var i=this._propertyBindings,o=0,a=t.length;o!==a;++o)t[o].evaluate(r),i[o].accumulate(n,e)}}else this._updateWeight(e)},_updateWeight:function(e){t=0;if(this.enabled){var t=this.weight,r=this._weightInterpolant;if(null!==r){var n=r.evaluate(e)[0],t=t*n;e>r.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=t},_updateTimeScale:function(e){t=0;if(!this.paused){var t=this.timeScale,r=this._timeScaleInterpolant;if(null!==r){t=t*r.evaluate(e)[0];e>r.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}}return this._effectiveTimeScale=t},_updateTime:function(e){o=this.time+e;if(0===e)return o;var t=this._clip.duration,r=this.loop,n=this._loopCount;if(2200===r)e:{if(-1===n&&(this._loopCount=0,this._setEndings(!0,!0,!1)),o>=t)o=t;else{if(!(0>o))break e;o=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this._mixer.dispatchEvent({type:"finished",action:this,direction:0>e?-1:1})}else{if(r=2202===r,-1===n&&(0<=e?(n=0,this._setEndings(!0,0===this.repetitions,r)):this._setEndings(0===this.repetitions,!0,r)),o>=t||0>o){var i=Math.floor(o/t),o=o-t*i,n=n+Math.abs(i),a=this.repetitions-n;0>a?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,o=0<e?t:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<e?1:-1})):(0===a?(e=0>e,this._setEndings(e,!e,r)):this._setEndings(!1,!1,r),this._loopCount=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i}))}if(r&&1==(1&n))return this.time=o,t-o}return this.time=o},_setEndings:function(e,t,r){var n=this._interpolantSettings;r?(n.endingStart=2401,n.endingEnd=2401):(n.endingStart=e?this.zeroSlopeAtStart?2401:2400:2402,n.endingEnd=t?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(e,t,r){var n=this._mixer,i=n.time,o=this._weightInterpolant;return null===o&&(this._weightInterpolant=o=n._lendControlInterpolant()),n=o.parameterPositions,o=o.sampleValues,n[0]=i,o[0]=t,n[1]=i+e,o[1]=r,this}}),Object.assign(wn.prototype,t.prototype,{_bindAction:function(e,t){var r=e._localRoot||this._root,n=e._clip.tracks,i=n.length,o=e._propertyBindings;e=e._interpolants;var a=r.uuid,s=this._bindingsByRootAndName,c=s[a];for(void 0===c&&(c={},s[a]=c),s=0;s!==i;++s){var u=n[s],h=u.name,l=c[h];if(void 0===l){if(void 0!==(l=o[s])){null===l._cacheIndex&&(++l.referenceCount,this._addInactiveBinding(l,a,h));continue}++(l=new gn(bn.create(r,h,t&&t._propertyBindings[s].binding.parsedPath),u.ValueTypeName,u.getValueSize())).referenceCount,this._addInactiveBinding(l,a,h)}o[s]=l,e[s].resultBuffer=l.buffer}},_activateAction:function(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){var t=(e._localRoot||this._root).uuid,r=e._clip.uuid,n=this._actionsByClip[r];this._bindAction(e,n&&n.knownActions[0]),this._addInactiveAction(e,r,t)}for(r=0,n=(t=e._propertyBindings).length;r!==n;++r){var i=t[r];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(e)}},_deactivateAction:function(e){if(this._isActiveAction(e)){for(var t=e._propertyBindings,r=0,n=t.length;r!==n;++r){var i=t[r];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(e)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}},_isActiveAction:function(e){return null!==(e=e._cacheIndex)&&e<this._nActiveActions},_addInactiveAction:function(e,t,r){var n=this._actions,i=this._actionsByClip,o=i[t];void 0===o?(o={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,i[t]=o):(t=o.knownActions,e._byClipCacheIndex=t.length,t.push(e)),e._cacheIndex=n.length,n.push(e),o.actionByRoot[r]=e},_removeInactiveAction:function(e){var t=(n=this._actions)[n.length-1],r=e._cacheIndex;t._cacheIndex=r,n[r]=t,n.pop(),e._cacheIndex=null;var n=e._clip.uuid,i=(r=(t=this._actionsByClip)[n]).knownActions,o=i[i.length-1],a=e._byClipCacheIndex;o._byClipCacheIndex=a,i[a]=o,i.pop(),e._byClipCacheIndex=null,delete r.actionByRoot[(e._localRoot||this._root).uuid],0===i.length&&delete t[n],this._removeInactiveBindingsForAction(e)},_removeInactiveBindingsForAction:function(e){for(var t=0,r=(e=e._propertyBindings).length;t!==r;++t){var n=e[t];0==--n.referenceCount&&this._removeInactiveBinding(n)}},_lendAction:function(e){var t=this._actions,r=e._cacheIndex,n=this._nActiveActions++,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_takeBackAction:function(e){var t=this._actions,r=e._cacheIndex,n=--this._nActiveActions,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_addInactiveBinding:function(e,t,r){var n=this._bindingsByRootAndName,i=n[t],o=this._bindings;void 0===i&&(i={},n[t]=i),i[r]=e,e._cacheIndex=o.length,o.push(e)},_removeInactiveBinding:function(e){var t=this._bindings,r=(n=e.binding).rootNode.uuid,n=n.path,i=this._bindingsByRootAndName,o=i[r],a=t[t.length-1];e=e._cacheIndex,a._cacheIndex=e,t[e]=a,t.pop(),delete o[n];e:{for(var s in o)break e;delete i[r]}},_lendBinding:function(e){var t=this._bindings,r=e._cacheIndex,n=this._nActiveBindings++,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_takeBackBinding:function(e){var t=this._bindings,r=e._cacheIndex,n=--this._nActiveBindings,i=t[n];e._cacheIndex=n,t[n]=e,i._cacheIndex=r,t[r]=i},_lendControlInterpolant:function(){var e=this._controlInterpolants,t=this._nActiveControlInterpolants++,r=e[t];return void 0===r&&(r=new Ar(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),r.__cacheIndex=t,e[t]=r),r},_takeBackControlInterpolant:function(e){var t=this._controlInterpolants,r=e.__cacheIndex,n=--this._nActiveControlInterpolants,i=t[n];e.__cacheIndex=n,t[n]=e,i.__cacheIndex=r,t[r]=i},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(e,t){var r=t||this._root,n=r.uuid;e=null!==(r="string"==typeof e?$r.findByName(r,e):e)?r.uuid:e;var i=this._actionsByClip[e],o=null;if(void 0!==i){if(void 0!==(o=i.actionByRoot[n]))return o;o=i.knownActions[0],null===r&&(r=o._clip)}return null===r?null:(t=new xn(this,r,t),this._bindAction(t,o),this._addInactiveAction(t,e,n),t)},existingAction:function(e,t){var r=t||this._root;return t=r.uuid,r="string"==typeof e?$r.findByName(r,e):e,void 0!==(e=this._actionsByClip[r?r.uuid:e])?e.actionByRoot[t]||null:null},stopAllAction:function(){for(var e=this._actions,t=this._nActiveActions,r=this._bindings,n=this._nActiveBindings,i=this._nActiveBindings=this._nActiveActions=0;i!==t;++i)e[i].reset();for(i=0;i!==n;++i)r[i].useCount=0;return this},update:function(e){e*=this.timeScale;for(var t=this._actions,r=this._nActiveActions,n=this.time+=e,i=Math.sign(e),o=this._accuIndex^=1,a=0;a!==r;++a)t[a]._update(n,e,i,o);for(e=this._bindings,t=this._nActiveBindings,a=0;a!==t;++a)e[a].apply(o);return this},getRoot:function(){return this._root},uncacheClip:function(e){var t=this._actions;e=e.uuid;var r=this._actionsByClip,n=r[e];if(void 0!==n){for(var i=0,o=(n=n.knownActions).length;i!==o;++i){var a=n[i];this._deactivateAction(a);var s=a._cacheIndex,c=t[t.length-1];a._cacheIndex=null,a._byClipCacheIndex=null,c._cacheIndex=s,t[s]=c,t.pop(),this._removeInactiveBindingsForAction(a)}delete r[e]}},uncacheRoot:function(e){e=e.uuid;var t=this._actionsByClip;for(n in t){var r=t[n].actionByRoot[e];void 0!==r&&(this._deactivateAction(r),this._removeInactiveAction(r))}var n=this._bindingsByRootAndName[e];if(void 0!==n)for(var i in n)(e=n[i]).restoreOriginalState(),this._removeInactiveBinding(e)},uncacheAction:function(e,t){null!==(e=this.existingAction(e,t))&&(this._deactivateAction(e),this._removeInactiveAction(e))}}),Sn.prototype.clone=function(){return new Sn(void 0===this.value.clone?this.value:this.value.clone())},Mn.prototype=Object.assign(Object.create(_e.prototype),{constructor:Mn,isInstancedBufferGeometry:!0,copy:function(e){return _e.prototype.copy.call(this,e),this.maxInstancedCount=e.maxInstancedCount,this},clone:function(){return(new this.constructor).copy(this)}}),Object.defineProperties(En.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}}),Object.assign(En.prototype,{isInterleavedBufferAttribute:!0,setX:function(e,t){return this.data.array[e*this.data.stride+this.offset]=t,this},setY:function(e,t){return this.data.array[e*this.data.stride+this.offset+1]=t,this},setZ:function(e,t){return this.data.array[e*this.data.stride+this.offset+2]=t,this},setW:function(e,t){return this.data.array[e*this.data.stride+this.offset+3]=t,this},getX:function(e){return this.data.array[e*this.data.stride+this.offset]},getY:function(e){return this.data.array[e*this.data.stride+this.offset+1]},getZ:function(e){return this.data.array[e*this.data.stride+this.offset+2]},getW:function(e){return this.data.array[e*this.data.stride+this.offset+3]},setXY:function(e,t,r){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this},setXYZ:function(e,t,r,n){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this.data.array[e+2]=n,this},setXYZW:function(e,t,r,n,i){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=r,this.data.array[e+2]=n,this.data.array[e+3]=i,this}}),Object.defineProperty(Cn.prototype,"needsUpdate",{set:function(e){!0===e&&this.version++}}),Object.assign(Cn.prototype,{isInterleavedBuffer:!0,setArray:function(e){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==e?e.length/this.stride:0,this.array=e},setDynamic:function(e){return this.dynamic=e,this},copy:function(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.dynamic=e.dynamic,this},copyAt:function(e,t,r){e*=this.stride,r*=t.stride;for(var n=0,i=this.stride;n<i;n++)this.array[e+n]=t.array[r+n];return this},set:function(e,t){return void 0===t&&(t=0),this.array.set(e,t),this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(e){return this.onUploadCallback=e,this}}),Tn.prototype=Object.assign(Object.create(Cn.prototype),{constructor:Tn,isInstancedInterleavedBuffer:!0,copy:function(e){return Cn.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this}}),On.prototype=Object.assign(Object.create(ce.prototype),{constructor:On,isInstancedBufferAttribute:!0,copy:function(e){return ce.prototype.copy.call(this,e),this.meshPerAttribute=e.meshPerAttribute,this}}),Object.assign(Pn.prototype,{linePrecision:1,set:function(e,t){this.ray.set(e,t)},setFromCamera:function(e,t){t&&t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize()):t&&t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(e,t){var r=[];return An(e,this,r,t),r.sort(jn),r},intersectObjects:function(e,t){var r=[];if(!1===Array.isArray(e))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),r;for(var n=0,i=e.length;n<i;n++)An(e[n],this,r,t);return r.sort(jn),r}}),Object.assign(Rn.prototype,{start:function(){this.oldTime=this.startTime=("undefined"==typeof performance?Date:performance).now(),this.elapsedTime=0,this.running=!0},stop:function(){this.getElapsedTime(),this.autoStart=this.running=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var e=("undefined"==typeof performance?Date:performance).now(),t=(e-this.oldTime)/1e3;this.oldTime=e,this.elapsedTime+=t}return t}}),Object.assign(Ln.prototype,{set:function(e,t,r){return this.radius=e,this.phi=t,this.theta=r,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.phi=e.phi,this.theta=e.theta,this},makeSafe:function(){return this.phi=Math.max(1e-6,Math.min(Math.PI-1e-6,this.phi)),this},setFromVector3:function(e){return this.radius=e.length(),0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(e.x,e.z),this.phi=Math.acos(ci.clamp(e.y/this.radius,-1,1))),this}}),Object.assign(Nn.prototype,{set:function(e,t,r){return this.radius=e,this.theta=t,this.y=r,this},clone:function(){return(new this.constructor).copy(this)},copy:function(e){return this.radius=e.radius,this.theta=e.theta,this.y=e.y,this},setFromVector3:function(e){return this.radius=Math.sqrt(e.x*e.x+e.z*e.z),this.theta=Math.atan2(e.x,e.z),this.y=e.y,this}}),(In.prototype=Object.create(ne.prototype)).constructor=In,In.prototype.isImmediateRenderObject=!0,(Dn.prototype=Object.create(lt.prototype)).constructor=Dn,Dn.prototype.update=function(){var e=new o,t=new o,r=new a;return function(){var n,i=["a","b","c"];this.object.updateMatrixWorld(!0),r.getNormalMatrix(this.object.matrixWorld);var o=this.object.matrixWorld,a=this.geometry.attributes.position;if((n=this.object.geometry)&&n.isGeometry)for(var s=n.vertices,c=n.faces,u=n=0,h=c.length;u<h;u++)for(var l=c[u],p=0,f=l.vertexNormals.length;p<f;p++){var d=l.vertexNormals[p];e.copy(s[l[i[p]]]).applyMatrix4(o),t.copy(d).applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),a.setXYZ(n,e.x,e.y,e.z),n+=1,a.setXYZ(n,t.x,t.y,t.z),n+=1}else if(n&&n.isBufferGeometry)for(i=n.attributes.position,s=n.attributes.normal,p=n=0,f=i.count;p<f;p++)e.set(i.getX(p),i.getY(p),i.getZ(p)).applyMatrix4(o),t.set(s.getX(p),s.getY(p),s.getZ(p)),t.applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),a.setXYZ(n,e.x,e.y,e.z),n+=1,a.setXYZ(n,t.x,t.y,t.z),n+=1;a.needsUpdate=!0}}(),(kn.prototype=Object.create(ne.prototype)).constructor=kn,kn.prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},kn.prototype.update=function(){var e=new o,t=new o;return function(){this.light.updateMatrixWorld();var r=this.light.distance?this.light.distance:1e3,n=r*Math.tan(this.light.angle);this.cone.scale.set(n,n,r),e.setFromMatrixPosition(this.light.matrixWorld),t.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(t.sub(e)),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}(),(Bn.prototype=Object.create(lt.prototype)).constructor=Bn,Bn.prototype.updateMatrixWorld=function(){var e=new o,t=new n,r=new n;return function(n){var i=this.bones,o=this.geometry,a=o.getAttribute("position");r.getInverse(this.root.matrixWorld);for(var s=0,c=0;s<i.length;s++){var u=i[s];u.parent&&u.parent.isBone&&(t.multiplyMatrices(r,u.matrixWorld),e.setFromMatrixPosition(t),a.setXYZ(c,e.x,e.y,e.z),t.multiplyMatrices(r,u.parent.matrixWorld),e.setFromMatrixPosition(t),a.setXYZ(c+1,e.x,e.y,e.z),c+=2)}o.getAttribute("position").needsUpdate=!0,ne.prototype.updateMatrixWorld.call(this,n)}}(),(Un.prototype=Object.create(je.prototype)).constructor=Un,Un.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},Un.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)},(zn.prototype=Object.create(ne.prototype)).constructor=zn,zn.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},zn.prototype.update=function(){var e=.5*this.light.width,t=.5*this.light.height,r=this.line.geometry.attributes.position,n=r.array;n[0]=e,n[1]=-t,n[2]=0,n[3]=e,n[4]=t,n[5]=0,n[6]=-e,n[7]=t,n[8]=0,n[9]=-e,n[10]=-t,n[11]=0,n[12]=e,n[13]=-t,n[14]=0,r.needsUpdate=!0,void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)},($n.prototype=Object.create(ne.prototype)).constructor=$n,$n.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},$n.prototype.update=function(){var e=new o,t=new $,r=new $;return function(){var n=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var i=n.geometry.getAttribute("color");t.copy(this.light.color),r.copy(this.light.groundColor);for(var o=0,a=i.count;o<a;o++){var s=o<a/2?t:r;i.setXYZ(o,s.r,s.g,s.b)}i.needsUpdate=!0}n.lookAt(e.setFromMatrixPosition(this.light.matrixWorld).negate())}}(),(Gn.prototype=Object.create(lt.prototype)).constructor=Gn,(Vn.prototype=Object.create(lt.prototype)).constructor=Vn,(Hn.prototype=Object.create(lt.prototype)).constructor=Hn,Hn.prototype.update=function(){var e=new o,t=new o,r=new a;return function(){this.object.updateMatrixWorld(!0),r.getNormalMatrix(this.object.matrixWorld);for(var n=this.object.matrixWorld,i=this.geometry.attributes.position,o=this.object.geometry,a=o.vertices,s=0,c=0,u=(o=o.faces).length;c<u;c++){var h=o[c],l=h.normal;e.copy(a[h.a]).add(a[h.b]).add(a[h.c]).divideScalar(3).applyMatrix4(n),t.copy(l).applyMatrix3(r).normalize().multiplyScalar(this.size).add(e),i.setXYZ(s,e.x,e.y,e.z),s+=1,i.setXYZ(s,t.x,t.y,t.z),s+=1}i.needsUpdate=!0}}(),(qn.prototype=Object.create(ne.prototype)).constructor=qn,qn.prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},qn.prototype.update=function(){var e=new o,t=new o,r=new o;return function(){e.setFromMatrixPosition(this.light.matrixWorld),t.setFromMatrixPosition(this.light.target.matrixWorld),r.subVectors(t,e),this.lightPlane.lookAt(r),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(r),this.targetLine.scale.z=r.length()}}(),(Wn.prototype=Object.create(lt.prototype)).constructor=Wn,Wn.prototype.update=function(){function e(e,o,a,s){if(n.set(o,a,s).unproject(i),void 0!==(e=r[e]))for(o=t.getAttribute("position"),a=0,s=e.length;a<s;a++)o.setXYZ(e[a],n.x,n.y,n.z)}var t,r,n=new o,i=new ie;return function(){t=this.geometry,r=this.pointMap,i.projectionMatrix.copy(this.camera.projectionMatrix),e("c",0,0,-1),e("t",0,0,1),e("n1",-1,-1,-1),e("n2",1,-1,-1),e("n3",-1,1,-1),e("n4",1,1,-1),e("f1",-1,-1,1),e("f2",1,-1,1),e("f3",-1,1,1),e("f4",1,1,1),e("u1",.7,1.1,-1),e("u2",-.7,1.1,-1),e("u3",0,2,-1),e("cf1",-1,0,1),e("cf2",1,0,1),e("cf3",0,-1,1),e("cf4",0,1,1),e("cn1",-1,0,-1),e("cn2",1,0,-1),e("cn3",0,-1,-1),e("cn4",0,1,-1),t.getAttribute("position").needsUpdate=!0}}(),(Xn.prototype=Object.create(lt.prototype)).constructor=Xn,Xn.prototype.update=function(){var e=new K;return function(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&e.setFromObject(this.object),!e.isEmpty()){t=e.min;var r=e.max,n=this.geometry.attributes.position,i=n.array;i[0]=r.x,i[1]=r.y,i[2]=r.z,i[3]=t.x,i[4]=r.y,i[5]=r.z,i[6]=t.x,i[7]=t.y,i[8]=r.z,i[9]=r.x,i[10]=t.y,i[11]=r.z,i[12]=r.x,i[13]=r.y,i[14]=t.z,i[15]=t.x,i[16]=r.y,i[17]=t.z,i[18]=t.x,i[19]=t.y,i[20]=t.z,i[21]=r.x,i[22]=t.y,i[23]=t.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}}}(),Xn.prototype.setFromObject=function(e){return this.object=e,this.update(),this},(Yn.prototype=Object.create(lt.prototype)).constructor=Yn,Yn.prototype.updateMatrixWorld=function(e){var t=this.box;t.isEmpty()||(t.getCenter(this.position),t.getSize(this.scale),this.scale.multiplyScalar(.5),ne.prototype.updateMatrixWorld.call(this,e))},(Kn.prototype=Object.create(ht.prototype)).constructor=Kn,Kn.prototype.updateMatrixWorld=function(e){var t=-this.plane.constant;1e-8>Math.abs(t)&&(t=1e-8),this.scale.set(.5*this.size,.5*this.size,t),this.lookAt(this.plane.normal),ne.prototype.updateMatrixWorld.call(this,e)};var $i,Gi;(Zn.prototype=Object.create(ne.prototype)).constructor=Zn,Zn.prototype.setDirection=function(){var e,t=new o;return function(r){.99999<r.y?this.quaternion.set(0,0,0,1):-.99999>r.y?this.quaternion.set(1,0,0,0):(t.set(r.z,0,-r.x).normalize(),e=Math.acos(r.y),this.quaternion.setFromAxisAngle(t,e))}}(),Zn.prototype.setLength=function(e,t,r){void 0===t&&(t=.2*e),void 0===r&&(r=.2*t),this.line.scale.set(1,Math.max(0,e-t),1),this.line.updateMatrix(),this.cone.scale.set(r,t,r),this.cone.position.y=e,this.cone.updateMatrix()},Zn.prototype.setColor=function(e){this.line.material.color.copy(e),this.cone.material.color.copy(e)},(Jn.prototype=Object.create(lt.prototype)).constructor=Jn;var Vi=new o,Hi=new Qn,qi=new Qn,Wi=new Qn;(ei.prototype=Object.create(Zr.prototype)).constructor=ei,ei.prototype.isCatmullRomCurve3=!0,ei.prototype.getPoint=function(e,t){t=t||new o;var r=this.points;e*=(c=r.length)-(this.closed?0:1);if(e-=u=Math.floor(e),this.closed?u+=0<u?0:(Math.floor(Math.abs(u)/r.length)+1)*r.length:0===e&&u===c-1&&(u=c-2,e=1),this.closed||0<u)var n=r[(u-1)%c];else Vi.subVectors(r[0],r[1]).add(r[0]),n=Vi;var i=r[u%c],a=r[(u+1)%c];if(this.closed||u+2<c?r=r[(u+2)%c]:(Vi.subVectors(r[c-1],r[c-2]).add(r[c-1]),r=Vi),"centripetal"===this.curveType||"chordal"===this.curveType){var s="chordal"===this.curveType?.5:.25,c=Math.pow(n.distanceToSquared(i),s),u=Math.pow(i.distanceToSquared(a),s),s=Math.pow(a.distanceToSquared(r),s);1e-4>u&&(u=1),1e-4>c&&(c=u),1e-4>s&&(s=u),Hi.initNonuniformCatmullRom(n.x,i.x,a.x,r.x,c,u,s),qi.initNonuniformCatmullRom(n.y,i.y,a.y,r.y,c,u,s),Wi.initNonuniformCatmullRom(n.z,i.z,a.z,r.z,c,u,s)}else"catmullrom"===this.curveType&&(Hi.initCatmullRom(n.x,i.x,a.x,r.x,this.tension),qi.initCatmullRom(n.y,i.y,a.y,r.y,this.tension),Wi.initCatmullRom(n.z,i.z,a.z,r.z,this.tension));return t.set(Hi.calc(e),qi.calc(e),Wi.calc(e)),t},ei.prototype.copy=function(e){Zr.prototype.copy.call(this,e),this.points=[];for(var t=0,r=e.points.length;t<r;t++)this.points.push(e.points[t].clone());return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this},(ti.prototype=Object.create(Zr.prototype)).constructor=ti,ti.prototype.isCubicBezierCurve3=!0,ti.prototype.getPoint=function(e,t){t=t||new o;var r=this.v0,n=this.v1,i=this.v2,a=this.v3;return t.set(Kr(e,r.x,n.x,i.x,a.x),Kr(e,r.y,n.y,i.y,a.y),Kr(e,r.z,n.z,i.z,a.z)),t},ti.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this},(ri.prototype=Object.create(Zr.prototype)).constructor=ri,ri.prototype.isQuadraticBezierCurve3=!0,ri.prototype.getPoint=function(e,t){t=t||new o;var r=this.v0,n=this.v1,i=this.v2;return t.set(Yr(e,r.x,n.x,i.x),Yr(e,r.y,n.y,i.y),Yr(e,r.z,n.z,i.z)),t},ri.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this},(ni.prototype=Object.create(Zr.prototype)).constructor=ni,ni.prototype.isLineCurve3=!0,ni.prototype.getPoint=function(e,t){return t=t||new o,1===e?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t},ni.prototype.getPointAt=function(e,t){return this.getPoint(e,t)},ni.prototype.copy=function(e){return Zr.prototype.copy.call(this,e),this.v1.copy(e.v1),this.v2.copy(e.v2),this},(ii.prototype=Object.create(en.prototype)).constructor=ii,ii.prototype.isArcCurve=!0,Zr.create=function(e,t){return console.log("THREE.Curve.create() has been deprecated"),e.prototype=Object.create(Zr.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},Object.assign(Qr.prototype,{createPointsGeometry:function(e){return console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead."),e=this.getPoints(e),this.createGeometry(e)},createSpacedPointsGeometry:function(e){return console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead."),e=this.getSpacedPoints(e),this.createGeometry(e)},createGeometry:function(e){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var t=new se,r=0,n=e.length;r<n;r++){var i=e[r];t.vertices.push(new o(i.x,i.y,i.z||0))}return t}}),Object.assign(on.prototype,{fromPoints:function(e){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(e)}}),oi.prototype=Object.create(ei.prototype),ai.prototype=Object.create(ei.prototype),si.prototype=Object.create(ei.prototype),Object.assign(si.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),Gn.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},Bn.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Object.assign(G.prototype,{center:function(e){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},size:function(e){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(e)}}),Object.assign(K.prototype,{center:function(e){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(e)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(e){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionSphere:function(e){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},size:function(e){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(e)}}),Oe.prototype.center=function(e){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(e)},Object.assign(ci,{random16:function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},nearestPowerOfTwo:function(e){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),ci.floorPowerOfTwo(e)},nextPowerOfTwo:function(e){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),ci.ceilPowerOfTwo(e)}}),Object.assign(a.prototype,{flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},multiplyVector3:function(e){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(e){return console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(e)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}}),Object.assign(n.prototype,{extractPosition:function(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},flattenToArrayOffset:function(e,t){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},getPosition:function(){var e;return function(){return void 0===e&&(e=new o),console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),e.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(e){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(e){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector4:function(e){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(e){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),e.transformDirection(this)},crossVector:function(e){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(e){return console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(e)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(e,t,r,n,i,o){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(e,t,n,r,i,o)}}),J.prototype.isIntersectionLine=function(e){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(e)},i.prototype.multiplyVector3=function(e){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},Object.assign(Te.prototype,{isIntersectionBox:function(e){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},isIntersectionPlane:function(e){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(e)},isIntersectionSphere:function(e){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)}}),Object.assign(an.prototype,{extractAllPoints:function(e){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(e)},extrude:function(e){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new Ft(this,e)},makeGeometry:function(e){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new Xt(this,e)}}),Object.assign(r.prototype,{fromAttribute:function(e,t,r){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)},distanceToManhattan:function(e){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},lengthManhattan:function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(o.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(e){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},getScaleFromMatrix:function(e){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},getColumnFromMatrix:function(e,t){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(t,e)},applyProjection:function(e){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(e)},fromAttribute:function(e,t,r){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)},distanceToManhattan:function(e){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},lengthManhattan:function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(c.prototype,{fromAttribute:function(e,t,r){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,r)},lengthManhattan:function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),se.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},Object.assign(ne.prototype,{getChildByName:function(e){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(e)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(e,t){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(t,e)}}),Object.defineProperties(ne.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(e){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=e}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.defineProperties(ot.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(at.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Object.defineProperty(Zr.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(e){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=e}}),We.prototype.setLens=function(e,t){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==t&&(this.filmGauge=t),this.setFocalLength(e)},Object.defineProperties(br.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(e){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=e}},shadowCameraLeft:{set:function(e){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=e}},shadowCameraRight:{set:function(e){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=e}},shadowCameraTop:{set:function(e){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=e}},shadowCameraBottom:{set:function(e){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=e}},shadowCameraNear:{set:function(e){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=e}},shadowCameraFar:{set:function(e){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=e}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(e){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=e}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(e){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=e}},shadowMapHeight:{set:function(e){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=e}}}),Object.defineProperties(ce.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}}}),Object.assign(_e.prototype,{addIndex:function(e){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(e)},addDrawCall:function(e,t,r){void 0!==r&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(e,t)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}),Object.defineProperties(_e.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(Sn.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(W.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new $}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===e}}}),Object.defineProperties(sr.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(Ce.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(e){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=e}}}),Object.assign(Je.prototype,{getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},getMaxAnisotropy:function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},getPrecision:function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},resetGLState:function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(e){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(e)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}}),Object.defineProperties(Je.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=e}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=e}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."),this.shadowMap.cullFace=e}}}),Object.defineProperties(ee.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(e){e=1!==e,console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+e+"."),this.renderReverseSided=e}}}),Object.defineProperties(u.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=e}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=e}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=e}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=e}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(e){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=e}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(e){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=e}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(e){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=e}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(e){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=e}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(e){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=e}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(e){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=e}}}),dn.prototype.load=function(e){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var t=this;return(new hn).load(e,function(e){t.setBuffer(e)}),this},vn.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},pn.prototype.updateCubeMap=function(e,t){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(e,t)},e.WebGLRenderTargetCube=h,e.WebGLRenderTarget=u,e.WebGLRenderer=Je,e.ShaderLib=xi,e.UniformsLib=yi,e.UniformsUtils=bi,e.ShaderChunk=_i,e.FogExp2=Qe,e.Fog=et,e.Scene=tt,e.LensFlare=rt,e.Sprite=it,e.LOD=ot,e.SkinnedMesh=ct,e.Skeleton=at,e.Bone=st,e.Mesh=je,e.LineSegments=lt,e.LineLoop=pt,e.Line=ht,e.Points=dt,e.Group=mt,e.VideoTexture=vt,e.DataTexture=l,e.CompressedTexture=gt,e.CubeTexture=p,e.CanvasTexture=H,e.DepthTexture=yt,e.Texture=s,e.CompressedTextureLoader=dr,e.DataTextureLoader=mr,e.CubeTextureLoader=gr,e.TextureLoader=yr,e.ObjectLoader=Wr,e.MaterialLoader=Gr,e.BufferGeometryLoader=Vr,e.DefaultLoadingManager=Ai,e.LoadingManager=pr,e.JSONLoader=qr,e.ImageLoader=vr,e.FontLoader=un,e.FileLoader=fr,e.Loader=Hr,e.Cache=ji,e.AudioLoader=hn,e.SpotLightShadow=wr,e.SpotLight=Sr,e.PointLight=Mr,e.RectAreaLight=Or,e.HemisphereLight=_r,e.DirectionalLightShadow=Er,e.DirectionalLight=Cr,e.AmbientLight=Tr,e.LightShadow=xr,e.Light=br,e.StereoCamera=ln,e.PerspectiveCamera=We,e.OrthographicCamera=oe,e.CubeCamera=pn,e.ArrayCamera=Xe,e.Camera=ie,e.AudioListener=fn,e.PositionalAudio=mn,e.AudioContext=zi,e.AudioAnalyser=vn,e.Audio=dn,e.VectorKeyframeTrack=Nr,e.StringKeyframeTrack=Fr,e.QuaternionKeyframeTrack=Dr,e.NumberKeyframeTrack=kr,e.ColorKeyframeTrack=Ur,e.BooleanKeyframeTrack=Br,e.PropertyMixer=gn,e.PropertyBinding=bn,e.KeyframeTrack=zr,e.AnimationUtils=Li,e.AnimationObjectGroup=_n,e.AnimationMixer=wn,e.AnimationClip=$r,e.Uniform=Sn,e.InstancedBufferGeometry=Mn,e.BufferGeometry=_e,e.Geometry=se,e.InterleavedBufferAttribute=En,e.InstancedInterleavedBuffer=Tn,e.InterleavedBuffer=Cn,e.InstancedBufferAttribute=On,e.Face3=ae,e.Object3D=ne,e.Raycaster=Pn,e.Layers=re,e.EventDispatcher=t,e.Clock=Rn,e.QuaternionLinearInterpolant=Ir,e.LinearInterpolant=Ar,e.DiscreteInterpolant=Rr,e.CubicInterpolant=jr,e.Interpolant=Pr,e.Triangle=Pe,e.Math=ci,e.Spherical=Ln,e.Cylindrical=Nn,e.Plane=J,e.Frustum=Q,e.Sphere=Z,e.Ray=Te,e.Matrix4=n,e.Matrix3=a,e.Box3=K,e.Box2=G,e.Line3=Oe,e.Euler=te,e.Vector4=c,e.Vector3=o,e.Vector2=r,e.Quaternion=i,e.Color=$,e.ImmediateRenderObject=In,e.VertexNormalsHelper=Dn,e.SpotLightHelper=kn,e.SkeletonHelper=Bn,e.PointLightHelper=Un,e.RectAreaLightHelper=zn,e.HemisphereLightHelper=$n,e.GridHelper=Gn,e.PolarGridHelper=Vn,e.FaceNormalsHelper=Hn,e.DirectionalLightHelper=qn,e.CameraHelper=Wn,e.BoxHelper=Xn,e.Box3Helper=Yn,e.PlaneHelper=Kn,e.ArrowHelper=Zn,e.AxesHelper=Jn,e.CatmullRomCurve3=ei,e.CubicBezierCurve3=ti,e.QuadraticBezierCurve3=ri,e.LineCurve3=ni,e.ArcCurve=ii,e.EllipseCurve=en,e.SplineCurve=tn,e.CubicBezierCurve=rn,e.QuadraticBezierCurve=nn,e.LineCurve=Jr,e.Shape=an,e.Path=on,e.ShapePath=sn,e.Font=cn,e.CurvePath=Qr,e.Curve=Zr,e.ShapeUtils=Ti,e.SceneUtils={createMultiMaterialObject:function(e,t){for(var r=new mt,n=0,i=t.length;n<i;n++)r.add(new je(e,t[n]));return r},detach:function(e,t,r){e.applyMatrix(t.matrixWorld),t.remove(e),r.add(e)},attach:function(e,t,r){e.applyMatrix((new n).getInverse(r.matrixWorld)),t.remove(e),r.add(e)}},e.WebGLUtils=Ze,e.WireframeGeometry=bt,e.ParametricGeometry=_t,e.ParametricBufferGeometry=xt,e.TetrahedronGeometry=Mt,e.TetrahedronBufferGeometry=Et,e.OctahedronGeometry=Ct,e.OctahedronBufferGeometry=Tt,e.IcosahedronGeometry=Ot,e.IcosahedronBufferGeometry=Pt,e.DodecahedronGeometry=jt,e.DodecahedronBufferGeometry=At,e.PolyhedronGeometry=wt,e.PolyhedronBufferGeometry=St,e.TubeGeometry=Rt,e.TubeBufferGeometry=Lt,e.TorusKnotGeometry=Nt,e.TorusKnotBufferGeometry=It,e.TorusGeometry=Dt,e.TorusBufferGeometry=kt,e.TextGeometry=Ut,e.TextBufferGeometry=zt,e.SphereGeometry=$t,e.SphereBufferGeometry=Gt,e.RingGeometry=Vt,e.RingBufferGeometry=Ht,e.PlaneGeometry=Se,e.PlaneBufferGeometry=Me,e.LatheGeometry=qt,e.LatheBufferGeometry=Wt,e.ShapeGeometry=Xt,e.ShapeBufferGeometry=Yt,e.ExtrudeGeometry=Ft,e.ExtrudeBufferGeometry=Bt,e.EdgesGeometry=Kt,e.ConeGeometry=Qt,e.ConeBufferGeometry=er,e.CylinderGeometry=Zt,e.CylinderBufferGeometry=Jt,e.CircleGeometry=tr,e.CircleBufferGeometry=rr,e.BoxGeometry=xe,e.BoxBufferGeometry=we,e.ShadowMaterial=nr,e.SpriteMaterial=nt,e.RawShaderMaterial=ir,e.ShaderMaterial=Ce,e.PointsMaterial=ft,e.MeshPhysicalMaterial=ar,e.MeshStandardMaterial=or,e.MeshPhongMaterial=sr,e.MeshToonMaterial=cr,e.MeshNormalMaterial=ur,e.MeshLambertMaterial=hr,e.MeshDepthMaterial=X,e.MeshDistanceMaterial=Y,e.MeshBasicMaterial=Ee,e.LineDashedMaterial=lr,e.LineBasicMaterial=ut,e.Material=W,e.Float64BufferAttribute=ge,e.Float32BufferAttribute=ve,e.Uint32BufferAttribute=me,e.Int32BufferAttribute=de,e.Uint16BufferAttribute=fe,e.Int16BufferAttribute=pe,e.Uint8ClampedBufferAttribute=le,e.Uint8BufferAttribute=he,e.Int8BufferAttribute=ue,e.BufferAttribute=ce,e.REVISION="88",e.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2},e.CullFaceNone=0,e.CullFaceBack=1,e.CullFaceFront=2,e.CullFaceFrontBack=3,e.FrontFaceDirectionCW=0,e.FrontFaceDirectionCCW=1,e.BasicShadowMap=0,e.PCFShadowMap=1,e.PCFSoftShadowMap=2,e.FrontSide=0,e.BackSide=1,e.DoubleSide=2,e.FlatShading=1,e.SmoothShading=2,e.NoColors=0,e.FaceColors=1,e.VertexColors=2,e.NoBlending=0,e.NormalBlending=1,e.AdditiveBlending=2,e.SubtractiveBlending=3,e.MultiplyBlending=4,e.CustomBlending=5,e.AddEquation=100,e.SubtractEquation=101,e.ReverseSubtractEquation=102,e.MinEquation=103,e.MaxEquation=104,e.ZeroFactor=200,e.OneFactor=201,e.SrcColorFactor=202,e.OneMinusSrcColorFactor=203,e.SrcAlphaFactor=204,e.OneMinusSrcAlphaFactor=205,e.DstAlphaFactor=206,e.OneMinusDstAlphaFactor=207,e.DstColorFactor=208,e.OneMinusDstColorFactor=209,e.SrcAlphaSaturateFactor=210,e.NeverDepth=0,e.AlwaysDepth=1,e.LessDepth=2,e.LessEqualDepth=3,e.EqualDepth=4,e.GreaterEqualDepth=5,e.GreaterDepth=6,e.NotEqualDepth=7,e.MultiplyOperation=0,e.MixOperation=1,e.AddOperation=2,e.NoToneMapping=0,e.LinearToneMapping=1,e.ReinhardToneMapping=2,e.Uncharted2ToneMapping=3,e.CineonToneMapping=4,e.UVMapping=300,e.CubeReflectionMapping=301,e.CubeRefractionMapping=302,e.EquirectangularReflectionMapping=303,e.EquirectangularRefractionMapping=304,e.SphericalReflectionMapping=305,e.CubeUVReflectionMapping=306,e.CubeUVRefractionMapping=307,e.RepeatWrapping=1e3,e.ClampToEdgeWrapping=1001,e.MirroredRepeatWrapping=1002,e.NearestFilter=1003,e.NearestMipMapNearestFilter=1004,e.NearestMipMapLinearFilter=1005,e.LinearFilter=1006,e.LinearMipMapNearestFilter=1007,e.LinearMipMapLinearFilter=1008,e.UnsignedByteType=1009,e.ByteType=1010,e.ShortType=1011,e.UnsignedShortType=1012,e.IntType=1013,e.UnsignedIntType=1014,e.FloatType=1015,e.HalfFloatType=1016,e.UnsignedShort4444Type=1017,e.UnsignedShort5551Type=1018,e.UnsignedShort565Type=1019,e.UnsignedInt248Type=1020,e.AlphaFormat=1021,e.RGBFormat=1022,e.RGBAFormat=1023,e.LuminanceFormat=1024,e.LuminanceAlphaFormat=1025,e.RGBEFormat=1023,e.DepthFormat=1026,e.DepthStencilFormat=1027,e.RGB_S3TC_DXT1_Format=2001,e.RGBA_S3TC_DXT1_Format=2002,e.RGBA_S3TC_DXT3_Format=2003,e.RGBA_S3TC_DXT5_Format=2004,e.RGB_PVRTC_4BPPV1_Format=2100,e.RGB_PVRTC_2BPPV1_Format=2101,e.RGBA_PVRTC_4BPPV1_Format=2102,e.RGBA_PVRTC_2BPPV1_Format=2103,e.RGB_ETC1_Format=2151,e.LoopOnce=2200,e.LoopRepeat=2201,e.LoopPingPong=2202,e.InterpolateDiscrete=2300,e.InterpolateLinear=2301,e.InterpolateSmooth=2302,e.ZeroCurvatureEnding=2400,e.ZeroSlopeEnding=2401,e.WrapAroundEnding=2402,e.TrianglesDrawMode=0,e.TriangleStripDrawMode=1,e.TriangleFanDrawMode=2,e.LinearEncoding=3e3,e.sRGBEncoding=3001,e.GammaEncoding=3007,e.RGBEEncoding=3002,e.LogLuvEncoding=3003,e.RGBM7Encoding=3004,e.RGBM16Encoding=3005,e.RGBDEncoding=3006,e.BasicDepthPacking=3200,e.RGBADepthPacking=3201,e.CubeGeometry=xe,e.Face4=function(e,t,r,n,i,o,a){return console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."),new ae(e,t,r,i,o,a)},e.LineStrip=0,e.LinePieces=1,e.MeshFaceMaterial=function(e){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),e},e.MultiMaterial=function(e){return void 0===e&&(e=[]),console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),e.isMultiMaterial=!0,e.materials=e,e.clone=function(){return e.slice()},e},e.PointCloud=function(e,t){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new dt(e,t)},e.Particle=function(e){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new it(e)},e.ParticleSystem=function(e,t){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new dt(e,t)},e.PointCloudMaterial=function(e){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new ft(e)},e.ParticleBasicMaterial=function(e){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new ft(e)},e.ParticleSystemMaterial=function(e){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new ft(e)},e.Vertex=function(e,t,r){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new o(e,t,r)},e.DynamicBufferAttribute=function(e,t){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."),new ce(e,t).setDynamic(!0)},e.Int8Attribute=function(e,t){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new ue(e,t)},e.Uint8Attribute=function(e,t){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new he(e,t)},e.Uint8ClampedAttribute=function(e,t){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new le(e,t)},e.Int16Attribute=function(e,t){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new pe(e,t)},e.Uint16Attribute=function(e,t){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new fe(e,t)},e.Int32Attribute=function(e,t){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new de(e,t)},e.Uint32Attribute=function(e,t){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new me(e,t)},e.Float32Attribute=function(e,t){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new ve(e,t)},e.Float64Attribute=function(e,t){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new ge(e,t)},e.ClosedSplineCurve3=oi,e.SplineCurve3=ai,e.Spline=si,e.AxisHelper=function(e){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Jn(e)},e.BoundingBoxHelper=function(e,t){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Xn(e,t)},e.EdgesHelper=function(e,t){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new lt(new Kt(e.geometry),new ut({color:void 0!==t?t:16777215}))},e.WireframeHelper=function(e,t){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new lt(new bt(e.geometry),new ut({color:void 0!==t?t:16777215}))},e.XHRLoader=function(e){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new fr(e)},e.BinaryTextureLoader=function(e){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new mr(e)},e.GeometryUtils={merge:function(e,t,r){if(console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead."),t.isMesh){t.matrixAutoUpdate&&t.updateMatrix();var n=t.matrix;t=t.geometry}e.merge(t,n,r)},center:function(e){return console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."),e.center()}},e.ImageUtils={crossOrigin:void 0,loadTexture:function(e,t,r,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var i=new yr;return i.setCrossOrigin(this.crossOrigin),e=i.load(e,r,void 0,n),t&&(e.mapping=t),e},loadTextureCube:function(e,t,r,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var i=new gr;return i.setCrossOrigin(this.crossOrigin),e=i.load(e,r,void 0,n),t&&(e.mapping=t),e},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}},e.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."),this.projectVector=function(e,t){console.warn("THREE.Projector: .projectVector() is now vector.project()."),e.project(t)},this.unprojectVector=function(e,t){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),e.unproject(t)},this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}},e.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"),this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),this.clear=function(){},this.render=function(){},this.setClearColor=function(){},this.setSize=function(){}},Object.defineProperty(e,"__esModule",{value:!0})})},{}],232:[function(e,t,r){"use strict";function n(e,t){if(!(this instanceof n))return new n(e,t);if(this.data=e||[],this.length=this.data.length,this.compare=t||function(e,t){return e<t?-1:e>t?1:0},this.length>0)for(var r=this.length>>1;r>=0;r--)this._down(r)}t.exports=n,n.prototype={push:function(e){this.data.push(e),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var e=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),e}},peek:function(){return this.data[0]},_up:function(e){for(var t=this.data,r=this.compare,n=t[e];e>0;){var i=e-1>>1,o=t[i];if(r(n,o)>=0)break;t[e]=o,e=i}t[e]=n},_down:function(e){for(var t=this.data,r=this.compare,n=this.length,i=n>>1,o=t[e];e<i;){var a=1+(e<<1),s=a+1,c=t[a];if(s<n&&r(t[s],c)<0&&(a=s,c=t[s]),r(c,o)>=0)break;t[e]=c,e=a}t[e]=o}}},{}],233:[function(e,t,r){(function(){function e(e){return function(t,r,n,i){r=x(r,i,4);var o=!O(t)&&_.keys(t),a=(o||t).length,s=e>0?0:a-1;return arguments.length<3&&(n=t[o?o[s]:s],s+=e),function(t,r,n,i,o,a){for(;o>=0&&o<a;o+=e){var s=i?i[o]:o;n=r(n,t[s],s,t)}return n}(t,r,n,o,s,a)}}function n(e){return function(t,r,n){r=w(r,n);for(var i=T(t),o=e>0?0:i-1;o>=0&&o<i;o+=e)if(r(t[o],o,t))return o;return-1}}function i(e,t,r){return function(n,i,o){var a=0,s=T(n);if("number"==typeof o)e>0?a=o>=0?o:Math.max(o+s,a):s=o>=0?Math.min(o+1,s):o+s+1;else if(r&&o&&s)return o=r(n,i),n[o]===i?o:-1;if(i!=i)return(o=t(p.call(n,a,s),_.isNaN))>=0?o+a:-1;for(o=e>0?a:s-1;o>=0&&o<s;o+=e)if(n[o]===i)return o;return-1}}function o(e,t){var r=L.length,n=e.constructor,i=_.isFunction(n)&&n.prototype||u,o="constructor";for(_.has(e,o)&&!_.contains(t,o)&&t.push(o);r--;)(o=L[r])in e&&e[o]!==i[o]&&!_.contains(t,o)&&t.push(o)}var a=this,s=a._,c=Array.prototype,u=Object.prototype,h=Function.prototype,l=c.push,p=c.slice,f=u.toString,d=u.hasOwnProperty,m=Array.isArray,v=Object.keys,g=h.bind,y=Object.create,b=function(){},_=function(e){return e instanceof _?e:this instanceof _?void(this._wrapped=e):new _(e)};void 0!==r?(void 0!==t&&t.exports&&(r=t.exports=_),r._=_):a._=_,_.VERSION="1.8.3";var x=function(e,t,r){if(void 0===t)return e;switch(null==r?3:r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)};case 4:return function(r,n,i,o){return e.call(t,r,n,i,o)}}return function(){return e.apply(t,arguments)}},w=function(e,t,r){return null==e?_.identity:_.isFunction(e)?x(e,t,r):_.isObject(e)?_.matcher(e):_.property(e)};_.iteratee=function(e,t){return w(e,t,1/0)};var S=function(e,t){return function(r){var n=arguments.length;if(n<2||null==r)return r;for(var i=1;i<n;i++)for(var o=arguments[i],a=e(o),s=a.length,c=0;c<s;c++){var u=a[c];t&&void 0!==r[u]||(r[u]=o[u])}return r}},M=function(e){if(!_.isObject(e))return{};if(y)return y(e);b.prototype=e;var t=new b;return b.prototype=null,t},E=function(e){return function(t){return null==t?void 0:t[e]}},C=Math.pow(2,53)-1,T=E("length"),O=function(e){var t=T(e);return"number"==typeof t&&t>=0&&t<=C};_.each=_.forEach=function(e,t,r){t=x(t,r);var n,i;if(O(e))for(n=0,i=e.length;n<i;n++)t(e[n],n,e);else{var o=_.keys(e);for(n=0,i=o.length;n<i;n++)t(e[o[n]],o[n],e)}return e},_.map=_.collect=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=Array(i),a=0;a<i;a++){var s=n?n[a]:a;o[a]=t(e[s],s,e)}return o},_.reduce=_.foldl=_.inject=e(1),_.reduceRight=_.foldr=e(-1),_.find=_.detect=function(e,t,r){var n;if(void 0!==(n=O(e)?_.findIndex(e,t,r):_.findKey(e,t,r))&&-1!==n)return e[n]},_.filter=_.select=function(e,t,r){var n=[];return t=w(t,r),_.each(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n},_.reject=function(e,t,r){return _.filter(e,_.negate(w(t)),r)},_.every=_.all=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=0;o<i;o++){var a=n?n[o]:o;if(!t(e[a],a,e))return!1}return!0},_.some=_.any=function(e,t,r){t=w(t,r);for(var n=!O(e)&&_.keys(e),i=(n||e).length,o=0;o<i;o++){var a=n?n[o]:o;if(t(e[a],a,e))return!0}return!1},_.contains=_.includes=_.include=function(e,t,r,n){return O(e)||(e=_.values(e)),("number"!=typeof r||n)&&(r=0),_.indexOf(e,t,r)>=0},_.invoke=function(e,t){var r=p.call(arguments,2),n=_.isFunction(t);return _.map(e,function(e){var i=n?t:e[t];return null==i?i:i.apply(e,r)})},_.pluck=function(e,t){return _.map(e,_.property(t))},_.where=function(e,t){return _.filter(e,_.matcher(t))},_.findWhere=function(e,t){return _.find(e,_.matcher(t))},_.max=function(e,t,r){var n,i,o=-1/0,a=-1/0;if(null==t&&null!=e)for(var s=0,c=(e=O(e)?e:_.values(e)).length;s<c;s++)(n=e[s])>o&&(o=n);else t=w(t,r),_.each(e,function(e,r,n){((i=t(e,r,n))>a||i===-1/0&&o===-1/0)&&(o=e,a=i)});return o},_.min=function(e,t,r){var n,i,o=1/0,a=1/0;if(null==t&&null!=e)for(var s=0,c=(e=O(e)?e:_.values(e)).length;s<c;s++)(n=e[s])<o&&(o=n);else t=w(t,r),_.each(e,function(e,r,n){((i=t(e,r,n))<a||i===1/0&&o===1/0)&&(o=e,a=i)});return o},_.shuffle=function(e){for(var t,r=O(e)?e:_.values(e),n=r.length,i=Array(n),o=0;o<n;o++)(t=_.random(0,o))!==o&&(i[o]=i[t]),i[t]=r[o];return i},_.sample=function(e,t,r){return null==t||r?(O(e)||(e=_.values(e)),e[_.random(e.length-1)]):_.shuffle(e).slice(0,Math.max(0,t))},_.sortBy=function(e,t,r){return t=w(t,r),_.pluck(_.map(e,function(e,r,n){return{value:e,index:r,criteria:t(e,r,n)}}).sort(function(e,t){var r=e.criteria,n=t.criteria;if(r!==n){if(r>n||void 0===r)return 1;if(r<n||void 0===n)return-1}return e.index-t.index}),"value")};var P=function(e){return function(t,r,n){var i={};return r=w(r,n),_.each(t,function(n,o){var a=r(n,o,t);e(i,n,a)}),i}};_.groupBy=P(function(e,t,r){_.has(e,r)?e[r].push(t):e[r]=[t]}),_.indexBy=P(function(e,t,r){e[r]=t}),_.countBy=P(function(e,t,r){_.has(e,r)?e[r]++:e[r]=1}),_.toArray=function(e){return e?_.isArray(e)?p.call(e):O(e)?_.map(e,_.identity):_.values(e):[]},_.size=function(e){return null==e?0:O(e)?e.length:_.keys(e).length},_.partition=function(e,t,r){t=w(t,r);var n=[],i=[];return _.each(e,function(e,r,o){(t(e,r,o)?n:i).push(e)}),[n,i]},_.first=_.head=_.take=function(e,t,r){if(null!=e)return null==t||r?e[0]:_.initial(e,e.length-t)},_.initial=function(e,t,r){return p.call(e,0,Math.max(0,e.length-(null==t||r?1:t)))},_.last=function(e,t,r){if(null!=e)return null==t||r?e[e.length-1]:_.rest(e,Math.max(0,e.length-t))},_.rest=_.tail=_.drop=function(e,t,r){return p.call(e,null==t||r?1:t)},_.compact=function(e){return _.filter(e,_.identity)};var j=function(e,t,r,n){for(var i=[],o=0,a=n||0,s=T(e);a<s;a++){var c=e[a];if(O(c)&&(_.isArray(c)||_.isArguments(c))){t||(c=j(c,t,r));var u=0,h=c.length;for(i.length+=h;u<h;)i[o++]=c[u++]}else r||(i[o++]=c)}return i};_.flatten=function(e,t){return j(e,t,!1)},_.without=function(e){return _.difference(e,p.call(arguments,1))},_.uniq=_.unique=function(e,t,r,n){_.isBoolean(t)||(n=r,r=t,t=!1),null!=r&&(r=w(r,n));for(var i=[],o=[],a=0,s=T(e);a<s;a++){var c=e[a],u=r?r(c,a,e):c;t?(a&&o===u||i.push(c),o=u):r?_.contains(o,u)||(o.push(u),i.push(c)):_.contains(i,c)||i.push(c)}return i},_.union=function(){return _.uniq(j(arguments,!0,!0))},_.intersection=function(e){for(var t=[],r=arguments.length,n=0,i=T(e);n<i;n++){var o=e[n];if(!_.contains(t,o)){for(var a=1;a<r&&_.contains(arguments[a],o);a++);a===r&&t.push(o)}}return t},_.difference=function(e){var t=j(arguments,!0,!0,1);return _.filter(e,function(e){return!_.contains(t,e)})},_.zip=function(){return _.unzip(arguments)},_.unzip=function(e){for(var t=e&&_.max(e,T).length||0,r=Array(t),n=0;n<t;n++)r[n]=_.pluck(e,n);return r},_.object=function(e,t){for(var r={},n=0,i=T(e);n<i;n++)t?r[e[n]]=t[n]:r[e[n][0]]=e[n][1];return r},_.findIndex=n(1),_.findLastIndex=n(-1),_.sortedIndex=function(e,t,r,n){for(var i=(r=w(r,n,1))(t),o=0,a=T(e);o<a;){var s=Math.floor((o+a)/2);r(e[s])<i?o=s+1:a=s}return o},_.indexOf=i(1,_.findIndex,_.sortedIndex),_.lastIndexOf=i(-1,_.findLastIndex),_.range=function(e,t,r){null==t&&(t=e||0,e=0),r=r||1;for(var n=Math.max(Math.ceil((t-e)/r),0),i=Array(n),o=0;o<n;o++,e+=r)i[o]=e;return i};var A=function(e,t,r,n,i){if(!(n instanceof t))return e.apply(r,i);var o=M(e.prototype),a=e.apply(o,i);return _.isObject(a)?a:o};_.bind=function(e,t){if(g&&e.bind===g)return g.apply(e,p.call(arguments,1));if(!_.isFunction(e))throw new TypeError("Bind must be called on a function");var r=p.call(arguments,2),n=function(){return A(e,n,t,this,r.concat(p.call(arguments)))};return n},_.partial=function(e){var t=p.call(arguments,1),r=function(){for(var n=0,i=t.length,o=Array(i),a=0;a<i;a++)o[a]=t[a]===_?arguments[n++]:t[a];for(;n<arguments.length;)o.push(arguments[n++]);return A(e,r,this,this,o)};return r},_.bindAll=function(e){var t,r,n=arguments.length;if(n<=1)throw new Error("bindAll must be passed function names");for(t=1;t<n;t++)e[r=arguments[t]]=_.bind(e[r],e);return e},_.memoize=function(e,t){var r=function(n){var i=r.cache,o=""+(t?t.apply(this,arguments):n);return _.has(i,o)||(i[o]=e.apply(this,arguments)),i[o]};return r.cache={},r},_.delay=function(e,t){var r=p.call(arguments,2);return setTimeout(function(){return e.apply(null,r)},t)},_.defer=_.partial(_.delay,_,1),_.throttle=function(e,t,r){var n,i,o,a=null,s=0;r||(r={});var c=function(){s=!1===r.leading?0:_.now(),a=null,o=e.apply(n,i),a||(n=i=null)};return function(){var u=_.now();s||!1!==r.leading||(s=u);var h=t-(u-s);return n=this,i=arguments,h<=0||h>t?(a&&(clearTimeout(a),a=null),s=u,o=e.apply(n,i),a||(n=i=null)):a||!1===r.trailing||(a=setTimeout(c,h)),o}},_.debounce=function(e,t,r){var n,i,o,a,s,c=function(){var u=_.now()-a;u<t&&u>=0?n=setTimeout(c,t-u):(n=null,r||(s=e.apply(o,i),n||(o=i=null)))};return function(){o=this,i=arguments,a=_.now();var u=r&&!n;return n||(n=setTimeout(c,t)),u&&(s=e.apply(o,i),o=i=null),s}},_.wrap=function(e,t){return _.partial(t,e)},_.negate=function(e){return function(){return!e.apply(this,arguments)}},_.compose=function(){var e=arguments,t=e.length-1;return function(){for(var r=t,n=e[t].apply(this,arguments);r--;)n=e[r].call(this,n);return n}},_.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},_.before=function(e,t){var r;return function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=null),r}},_.once=_.partial(_.before,2);var R=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];_.keys=function(e){if(!_.isObject(e))return[];if(v)return v(e);var t=[];for(var r in e)_.has(e,r)&&t.push(r);return R&&o(e,t),t},_.allKeys=function(e){if(!_.isObject(e))return[];var t=[];for(var r in e)t.push(r);return R&&o(e,t),t},_.values=function(e){for(var t=_.keys(e),r=t.length,n=Array(r),i=0;i<r;i++)n[i]=e[t[i]];return n},_.mapObject=function(e,t,r){t=w(t,r);for(var n,i=_.keys(e),o=i.length,a={},s=0;s<o;s++)a[n=i[s]]=t(e[n],n,e);return a},_.pairs=function(e){for(var t=_.keys(e),r=t.length,n=Array(r),i=0;i<r;i++)n[i]=[t[i],e[t[i]]];return n},_.invert=function(e){for(var t={},r=_.keys(e),n=0,i=r.length;n<i;n++)t[e[r[n]]]=r[n];return t},_.functions=_.methods=function(e){var t=[];for(var r in e)_.isFunction(e[r])&&t.push(r);return t.sort()},_.extend=S(_.allKeys),_.extendOwn=_.assign=S(_.keys),_.findKey=function(e,t,r){t=w(t,r);for(var n,i=_.keys(e),o=0,a=i.length;o<a;o++)if(n=i[o],t(e[n],n,e))return n},_.pick=function(e,t,r){var n,i,o={},a=e;if(null==a)return o;_.isFunction(t)?(i=_.allKeys(a),n=x(t,r)):(i=j(arguments,!1,!1,1),n=function(e,t,r){return t in r},a=Object(a));for(var s=0,c=i.length;s<c;s++){var u=i[s],h=a[u];n(h,u,a)&&(o[u]=h)}return o},_.omit=function(e,t,r){if(_.isFunction(t))t=_.negate(t);else{var n=_.map(j(arguments,!1,!1,1),String);t=function(e,t){return!_.contains(n,t)}}return _.pick(e,t,r)},_.defaults=S(_.allKeys,!0),_.create=function(e,t){var r=M(e);return t&&_.extendOwn(r,t),r},_.clone=function(e){return _.isObject(e)?_.isArray(e)?e.slice():_.extend({},e):e},_.tap=function(e,t){return t(e),e},_.isMatch=function(e,t){var r=_.keys(t),n=r.length;if(null==e)return!n;for(var i=Object(e),o=0;o<n;o++){var a=r[o];if(t[a]!==i[a]||!(a in i))return!1}return!0};var N=function(e,t,r,n){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return e===t;e instanceof _&&(e=e._wrapped),t instanceof _&&(t=t._wrapped);var i=f.call(e);if(i!==f.call(t))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t}var o="[object Array]"===i;if(!o){if("object"!=typeof e||"object"!=typeof t)return!1;var a=e.constructor,s=t.constructor;if(a!==s&&!(_.isFunction(a)&&a instanceof a&&_.isFunction(s)&&s instanceof s)&&"constructor"in e&&"constructor"in t)return!1}r=r||[],n=n||[];for(var c=r.length;c--;)if(r[c]===e)return n[c]===t;if(r.push(e),n.push(t),o){if((c=e.length)!==t.length)return!1;for(;c--;)if(!N(e[c],t[c],r,n))return!1}else{var u,h=_.keys(e);if(c=h.length,_.keys(t).length!==c)return!1;for(;c--;)if(u=h[c],!_.has(t,u)||!N(e[u],t[u],r,n))return!1}return r.pop(),n.pop(),!0};_.isEqual=function(e,t){return N(e,t)},_.isEmpty=function(e){return null==e||(O(e)&&(_.isArray(e)||_.isString(e)||_.isArguments(e))?0===e.length:0===_.keys(e).length)},_.isElement=function(e){return!(!e||1!==e.nodeType)},_.isArray=m||function(e){return"[object Array]"===f.call(e)},_.isObject=function(e){var t=typeof e;return"function"===t||"object"===t&&!!e},_.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(e){_["is"+e]=function(t){return f.call(t)==="[object "+e+"]"}}),_.isArguments(arguments)||(_.isArguments=function(e){return _.has(e,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(_.isFunction=function(e){return"function"==typeof e||!1}),_.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},_.isNaN=function(e){return _.isNumber(e)&&e!==+e},_.isBoolean=function(e){return!0===e||!1===e||"[object Boolean]"===f.call(e)},_.isNull=function(e){return null===e},_.isUndefined=function(e){return void 0===e},_.has=function(e,t){return null!=e&&d.call(e,t)},_.noConflict=function(){return a._=s,this},_.identity=function(e){return e},_.constant=function(e){return function(){return e}},_.noop=function(){},_.property=E,_.propertyOf=function(e){return null==e?function(){}:function(t){return e[t]}},_.matcher=_.matches=function(e){return e=_.extendOwn({},e),function(t){return _.isMatch(t,e)}},_.times=function(e,t,r){var n=Array(Math.max(0,e));t=x(t,r,1);for(var i=0;i<e;i++)n[i]=t(i);return n},_.random=function(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))},_.now=Date.now||function(){return(new Date).getTime()};var I={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},D=_.invert(I),k=function(e){var t=function(t){return e[t]},r="(?:"+_.keys(e).join("|")+")",n=RegExp(r),i=RegExp(r,"g");return function(e){return e=null==e?"":""+e,n.test(e)?e.replace(i,t):e}};_.escape=k(I),_.unescape=k(D),_.result=function(e,t,r){var n=null==e?void 0:e[t];return void 0===n&&(n=r),_.isFunction(n)?n.call(e):n};var F=0;_.uniqueId=function(e){var t=++F+"";return e?e+t:t},_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var B=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,$=function(e){return"\\"+U[e]};_.template=function(e,t,r){!t&&r&&(t=r),t=_.defaults({},t,_.templateSettings);var n=RegExp([(t.escape||B).source,(t.interpolate||B).source,(t.evaluate||B).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(n,function(t,r,n,a,s){return o+=e.slice(i,s).replace(z,$),i=s+t.length,r?o+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?o+="'+\n((__t=("+n+"))==null?'':__t)+\n'":a&&(o+="';\n"+a+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var a=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var s=function(e){return a.call(this,e,_)},c=t.variable||"obj";return s.source="function("+c+"){\n"+o+"}",s},_.chain=function(e){var t=_(e);return t._chain=!0,t};var G=function(e,t){return e._chain?_(t).chain():t};_.mixin=function(e){_.each(_.functions(e),function(t){var r=_[t]=e[t];_.prototype[t]=function(){var e=[this._wrapped];return l.apply(e,arguments),G(this,r.apply(_,e))}})},_.mixin(_),_.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=c[e];_.prototype[e]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==e&&"splice"!==e||0!==r.length||delete r[0],G(this,r)}}),_.each(["concat","join","slice"],function(e){var t=c[e];_.prototype[e]=function(){return G(this,t.apply(this._wrapped,arguments))}}),_.prototype.value=function(){return this._wrapped},_.prototype.valueOf=_.prototype.toJSON=_.prototype.value,_.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],234:[function(e,t,r){var n=e("./vdom/create-element.js");t.exports=n},{"./vdom/create-element.js":240}],235:[function(e,t,r){var n=e("./vtree/diff.js");t.exports=n},{"./vtree/diff.js":260}],236:[function(e,t,r){var n=e("./virtual-hyperscript/index.js");t.exports=n},{"./virtual-hyperscript/index.js":247}],237:[function(e,t,r){var n=e("./diff.js"),i=e("./patch.js"),o=e("./h.js"),a=e("./create-element.js"),s=e("./vnode/vnode.js"),c=e("./vnode/vtext.js");t.exports={diff:n,patch:i,h:o,create:a,VNode:s,VText:c}},{"./create-element.js":234,"./diff.js":235,"./h.js":236,"./patch.js":238,"./vnode/vnode.js":256,"./vnode/vtext.js":258}],238:[function(e,t,r){var n=e("./vdom/patch.js");t.exports=n},{"./vdom/patch.js":243}],239:[function(e,t,r){function n(e,t,r){for(var n in t){var c=t[n];void 0===c?i(e,n,c,r):s(c)?(i(e,n,c,r),c.hook&&c.hook(e,n,r?r[n]:void 0)):a(c)?function(e,t,r,n,i){var s=r?r[n]:void 0;if("attributes"===n){for(var c in i){var u=i[c];void 0===u?e.removeAttribute(c):e.setAttribute(c,u)}return}if(s&&a(s)&&o(s)!==o(i))return void(e[n]=i);a(e[n])||(e[n]={});var h="style"===n?"":void 0;for(var l in i){var p=i[l];e[n][l]=void 0===p?h:p}}(e,0,r,n,c):e[n]=c}}function i(e,t,r,n){if(n){var i=n[t];if(s(i))i.unhook&&i.unhook(e,t,r);else if("attributes"===t)for(var o in i)e.removeAttribute(o);else if("style"===t)for(var a in i)e.style[a]="";else e[t]="string"==typeof i?"":null}}function o(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var a=e("is-object"),s=e("../vnode/is-vhook.js");t.exports=n},{"../vnode/is-vhook.js":251,"is-object":20}],240:[function(e,t,r){function n(e,t){var r=t?t.document||i:i,h=t?t.warn:null;if(e=u(e).a,c(e))return e.init();if(s(e))return r.createTextNode(e.text);if(!a(e))return h&&h("Item is not a valid virtual dom node",e),null;var l=null===e.namespace?r.createElement(e.tagName):r.createElementNS(e.namespace,e.tagName),p=e.properties;o(l,p);for(var f=e.children,d=0;d<f.length;d++){var m=n(f[d],t);m&&l.appendChild(m)}return l}var i=e("global/document"),o=e("./apply-properties"),a=e("../vnode/is-vnode.js"),s=e("../vnode/is-vtext.js"),c=e("../vnode/is-widget.js"),u=e("../vnode/handle-thunk.js");t.exports=n},{"../vnode/handle-thunk.js":249,"../vnode/is-vnode.js":252,"../vnode/is-vtext.js":253,"../vnode/is-widget.js":254,"./apply-properties":239,"global/document":16}],241:[function(e,t,r){function n(e,t,r,o,s){if(o=o||{},e){i(r,s,s)&&(o[s]=e);var c=t.children;if(c)for(var u=e.childNodes,h=0;h<t.children.length;h++){s+=1;var l=c[h]||a,p=s+(l.count||0);i(r,s,p)&&n(u[h],l,r,o,s),s=p}}return o}function i(e,t,r){if(0===e.length)return!1;for(var n,i,o=0,a=e.length-1;o<=a;){if(n=(a+o)/2>>0,i=e[n],o===a)return i>=t&&i<=r;if(i<t)o=n+1;else{if(!(i>r))return!0;a=n-1}}return!1}function o(e,t){return e>t?1:-1}var a={};t.exports=function(e,t,r,i){return r&&0!==r.length?(r.sort(o),n(e,t,r,i,0)):{}}},{}],242:[function(e,t,r){function n(e,t,r){var n=e.type,a=e.vNode,u=e.patch;switch(n){case s.REMOVE:return function(e,t){var r=e.parentNode;r&&r.removeChild(e);return i(e,t),null}(t,a);case s.INSERT:return function(e,t,r){var n=r.render(t,r);e&&e.appendChild(n);return e}(t,u,r);case s.VTEXT:return function(e,t,r,n){var i;if(3===e.nodeType)e.replaceData(0,e.length,r.text),i=e;else{var o=e.parentNode;i=n.render(r,n),o&&i!==e&&o.replaceChild(i,e)}return i}(t,0,u,r);case s.WIDGET:return function(e,t,r,n){var o,a=c(t,r);o=a?r.update(t,e)||e:n.render(r,n);var s=e.parentNode;s&&o!==e&&s.replaceChild(o,e);a||i(e,t);return o}(t,a,u,r);case s.VNODE:return function(e,t,r,n){var i=e.parentNode,o=n.render(r,n);i&&o!==e&&i.replaceChild(o,e);return o}(t,0,u,r);case s.ORDER:return function(e,t){for(var r,n,i,o=e.childNodes,a={},s=0;s<t.removes.length;s++)n=t.removes[s],r=o[n.from],n.key&&(a[n.key]=r),e.removeChild(r);for(var c=o.length,u=0;u<t.inserts.length;u++)i=t.inserts[u],r=a[i.key],e.insertBefore(r,i.to>=c++?null:o[i.to])}(t,u),t;case s.PROPS:return o(t,u,a.properties),t;case s.THUNK:return function(e,t){e&&t&&e!==t&&e.parentNode&&e.parentNode.replaceChild(t,e);return t}(t,r.patch(t,u,r));default:return t}}function i(e,t){"function"==typeof t.destroy&&a(t)&&t.destroy(e)}var o=e("./apply-properties"),a=e("../vnode/is-widget.js"),s=e("../vnode/vpatch.js"),c=e("./update-widget");t.exports=n},{"../vnode/is-widget.js":254,"../vnode/vpatch.js":257,"./apply-properties":239,"./update-widget":244}],243:[function(e,t,r){function n(e,t,r){return r=r||{},r.patch=r.patch&&r.patch!==n?r.patch:function(e,t,r){var n=function(e){var t=[];for(var r in e)"a"!==r&&t.push(Number(r));return t}(t);if(0===n.length)return e;var a=s(e,t.a,n),u=e.ownerDocument;r.document||u===i||(r.document=u);for(var h=0;h<n.length;h++){var l=n[h];e=function(e,t,r,n){if(!t)return e;var i;if(o(r))for(var a=0;a<r.length;a++)i=c(r[a],t,n),t===e&&(e=i);else i=c(r,t,n),t===e&&(e=i);return e}(e,a[l],t[l],r)}return e},r.render=r.render||a,r.patch(e,t,r)}var i=e("global/document"),o=e("x-is-array"),a=e("./create-element"),s=e("./dom-index"),c=e("./patch-op");t.exports=n},{"./create-element":240,"./dom-index":241,"./patch-op":242,"global/document":16,"x-is-array":279}],244:[function(e,t,r){var n=e("../vnode/is-widget.js");t.exports=function(e,t){return!(!n(e)||!n(t))&&("name"in e&&"name"in t?e.id===t.id:e.init===t.init)}},{"../vnode/is-widget.js":254}],245:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.value=e}var i=e("ev-store");t.exports=n,n.prototype.hook=function(e,t){i(e)[t.substr(3)]=this.value},n.prototype.unhook=function(e,t){i(e)[t.substr(3)]=void 0}},{"ev-store":9}],246:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.value=e}t.exports=n,n.prototype.hook=function(e,t){e[t]!==this.value&&(e[t]=this.value)}},{}],247:[function(e,t,r){"use strict";function n(e,t,r){var n,a,u,h,l=[];return!r&&function(e){return"string"==typeof e||s(e)||o(e)}(t)&&(r=t,a={}),a=a||t||{},n=m(e,a),a.hasOwnProperty("key")&&(u=a.key,a.key=void 0),a.hasOwnProperty("namespace")&&(h=a.namespace,a.namespace=void 0),"INPUT"!==n||h||!a.hasOwnProperty("value")||void 0===a.value||f(a.value)||(a.value=v(a.value)),function(e){for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];if(f(r))continue;"ev-"===t.substr(0,3)&&(e[t]=g(r))}}(a),void 0!==r&&null!==r&&i(r,l,n,a),new c(n,a,l,u,h)}function i(e,t,r,n){if("string"==typeof e)t.push(new u(e));else if("number"==typeof e)t.push(new u(String(e)));else if(o(e))t.push(e);else{if(!s(e)){if(null===e||void 0===e)return;throw function(e){var t=new Error;return t.type="virtual-hyperscript.unexpected.virtual-element",t.message="Unexpected virtual child passed to h().\nExpected a VNode / Vthunk / VWidget / string but:\ngot:\n"+a(e.foreignObject)+".\nThe parent vnode is:\n"+a(e.parentVnode),t.foreignObject=e.foreignObject,t.parentVnode=e.parentVnode,t}({foreignObject:e,parentVnode:{tagName:r,properties:n}})}for(var c=0;c<e.length;c++)i(e[c],t,r,n)}}function o(e){return h(e)||l(e)||p(e)||d(e)}function a(e){try{return JSON.stringify(e,null,"    ")}catch(t){return String(e)}}var s=e("x-is-array"),c=e("../vnode/vnode.js"),u=e("../vnode/vtext.js"),h=e("../vnode/is-vnode"),l=e("../vnode/is-vtext"),p=e("../vnode/is-widget"),f=e("../vnode/is-vhook"),d=e("../vnode/is-thunk"),m=e("./parse-tag.js"),v=e("./hooks/soft-set-hook.js"),g=e("./hooks/ev-hook.js");t.exports=n},{"../vnode/is-thunk":250,"../vnode/is-vhook":251,"../vnode/is-vnode":252,"../vnode/is-vtext":253,"../vnode/is-widget":254,"../vnode/vnode.js":256,"../vnode/vtext.js":258,"./hooks/ev-hook.js":245,"./hooks/soft-set-hook.js":246,"./parse-tag.js":248,"x-is-array":279}],248:[function(e,t,r){"use strict";var n=e("browser-split"),i=/([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/,o=/^\.|#/;t.exports=function(e,t){if(!e)return"DIV";var r=!t.hasOwnProperty("id"),a=n(e,i),s=null;o.test(a[1])&&(s="DIV");var c,u,h,l;for(l=0;l<a.length;l++)(u=a[l])&&(h=u.charAt(0),s?"."===h?(c=c||[]).push(u.substring(1,u.length)):"#"===h&&r&&(t.id=u.substring(1,u.length)):s=u);return c&&(t.className&&c.push(t.className),t.className=c.join(" ")),t.namespace?s:s.toUpperCase()}},{"browser-split":5}],249:[function(e,t,r){function n(e,t){var r=e.vnode;if(r||(r=e.vnode=e.render(t)),!(i(r)||o(r)||a(r)))throw new Error("thunk did not return a valid node");return r}var i=e("./is-vnode"),o=e("./is-vtext"),a=e("./is-widget"),s=e("./is-thunk");t.exports=function(e,t){var r=e,i=t;return s(t)&&(i=n(t,e)),s(e)&&(r=n(e,null)),{a:r,b:i}}},{"./is-thunk":250,"./is-vnode":252,"./is-vtext":253,"./is-widget":254}],250:[function(e,t,r){t.exports=function(e){return e&&"Thunk"===e.type}},{}],251:[function(e,t,r){t.exports=function(e){return e&&("function"==typeof e.hook&&!e.hasOwnProperty("hook")||"function"==typeof e.unhook&&!e.hasOwnProperty("unhook"))}},{}],252:[function(e,t,r){var n=e("./version");t.exports=function(e){return e&&"VirtualNode"===e.type&&e.version===n}},{"./version":255}],253:[function(e,t,r){var n=e("./version");t.exports=function(e){return e&&"VirtualText"===e.type&&e.version===n}},{"./version":255}],254:[function(e,t,r){t.exports=function(e){return e&&"Widget"===e.type}},{}],255:[function(e,t,r){t.exports="2"},{}],256:[function(e,t,r){function n(e,t,r,n,i){this.tagName=e,this.properties=t||u,this.children=r||h,this.key=null!=n?String(n):void 0,this.namespace="string"==typeof i?i:null;var l,p=r&&r.length||0,f=0,d=!1,m=!1,v=!1;for(var g in t)if(t.hasOwnProperty(g)){var y=t[g];c(y)&&y.unhook&&(l||(l={}),l[g]=y)}for(var b=0;b<p;b++){var _=r[b];o(_)?(f+=_.count||0,!d&&_.hasWidgets&&(d=!0),!m&&_.hasThunks&&(m=!0),v||!_.hooks&&!_.descendantHooks||(v=!0)):!d&&a(_)?"function"==typeof _.destroy&&(d=!0):!m&&s(_)&&(m=!0)}this.count=p+f,this.hasWidgets=d,this.hasThunks=m,this.hooks=l,this.descendantHooks=v}var i=e("./version"),o=e("./is-vnode"),a=e("./is-widget"),s=e("./is-thunk"),c=e("./is-vhook");t.exports=n;var u={},h=[];n.prototype.version=i,n.prototype.type="VirtualNode"},{"./is-thunk":250,"./is-vhook":251,"./is-vnode":252,"./is-widget":254,"./version":255}],257:[function(e,t,r){function n(e,t,r){this.type=Number(e),this.vNode=t,this.patch=r}var i=e("./version");n.NONE=0,n.VTEXT=1,n.VNODE=2,n.WIDGET=3,n.PROPS=4,n.ORDER=5,n.INSERT=6,n.REMOVE=7,n.THUNK=8,t.exports=n,n.prototype.version=i,n.prototype.type="VirtualPatch"},{"./version":255}],258:[function(e,t,r){function n(e){this.text=String(e)}var i=e("./version");t.exports=n,n.prototype.version=i,n.prototype.type="VirtualText"},{"./version":255}],259:[function(e,t,r){function n(e,t){var r;for(var s in e){s in t||((r=r||{})[s]=void 0);var c=e[s],u=t[s];if(c!==u)if(o(c)&&o(u))if(i(u)!==i(c))(r=r||{})[s]=u;else if(a(u))(r=r||{})[s]=u;else{var h=n(c,u);h&&((r=r||{})[s]=h)}else(r=r||{})[s]=u}for(var l in t)l in e||((r=r||{})[l]=t[l]);return r}function i(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var o=e("is-object"),a=e("../vnode/is-vhook");t.exports=n},{"../vnode/is-vhook":251,"is-object":20}],260:[function(e,t,r){function n(e,t){var r={a:e};return i(e,t,r,0),r}function i(e,t,r,n){if(e!==t){var a=r[n],c=!1;if(g(e)||g(t))s(e,t,r,n);else if(null==t)v(e)||(o(e,r,n),a=r[n]),a=l(a,new f(f.REMOVE,e,t));else if(d(t))if(d(e))if(e.tagName===t.tagName&&e.namespace===t.namespace&&e.key===t.key){var p=b(e.properties,t.properties);p&&(a=l(a,new f(f.PROPS,e,p))),a=function(e,t,r,n,o){for(var a=e.children,s=function(e,t){var r=h(t),n=r.keys,i=r.free;if(i.length===t.length)return{children:t,moves:null};var o=h(e),a=o.keys;if(o.free.length===e.length)return{children:t,moves:null};for(var s=[],c=0,l=i.length,p=0,f=0;f<e.length;f++){var d,m=e[f];m.key?n.hasOwnProperty(m.key)?(d=n[m.key],s.push(t[d])):(d=f-p++,s.push(null)):c<l?(d=i[c++],s.push(t[d])):(d=f-p++,s.push(null))}for(var v=c>=i.length?t.length:i[c],g=0;g<t.length;g++){var y=t[g];y.key?a.hasOwnProperty(y.key)||s.push(y):g>=v&&s.push(y)}for(var b,_=s.slice(),x=0,w=[],S=[],M=0;M<t.length;){var E=t[M];for(b=_[x];null===b&&_.length;)w.push(u(_,x,null)),b=_[x];b&&b.key===E.key?(x++,M++):E.key?(b&&b.key&&n[b.key]!==M+1?(w.push(u(_,x,b.key)),(b=_[x])&&b.key===E.key?x++:S.push({key:E.key,to:M})):S.push({key:E.key,to:M}),M++):b&&b.key&&w.push(u(_,x,b.key))}for(;x<_.length;)b=_[x],w.push(u(_,x,b&&b.key));if(w.length===p&&!S.length)return{children:s,moves:null};return{children:s,moves:{removes:w,inserts:S}}}(a,t.children),c=s.children,p=a.length,m=c.length,v=p>m?p:m,g=0;g<v;g++){var y=a[g],b=c[g];o+=1,y?i(y,b,r,o):b&&(n=l(n,new f(f.INSERT,null,b))),d(y)&&y.count&&(o+=y.count)}s.moves&&(n=l(n,new f(f.ORDER,e,s.moves)));return n}(e,t,r,a,n)}else a=l(a,new f(f.VNODE,e,t)),c=!0;else a=l(a,new f(f.VNODE,e,t)),c=!0;else m(t)?m(e)?e.text!==t.text&&(a=l(a,new f(f.VTEXT,e,t))):(a=l(a,new f(f.VTEXT,e,t)),c=!0):v(t)&&(v(e)||(c=!0),a=l(a,new f(f.WIDGET,e,t)));a&&(r[n]=a),c&&o(e,r,n)}}function o(e,t,r){c(e,t,r),a(e,t,r)}function a(e,t,r){if(v(e))"function"==typeof e.destroy&&(t[r]=l(t[r],new f(f.REMOVE,e,null)));else if(d(e)&&(e.hasWidgets||e.hasThunks))for(var n=e.children,i=n.length,o=0;o<i;o++){var c=n[o];a(c,t,r+=1),d(c)&&c.count&&(r+=c.count)}else g(e)&&s(e,null,t,r)}function s(e,t,r,i){var o=y(e,t),a=n(o.a,o.b);(function(e){for(var t in e)if("a"!==t)return!0;return!1})(a)&&(r[i]=new f(f.THUNK,null,a))}function c(e,t,r){if(d(e)){if(e.hooks&&(t[r]=l(t[r],new f(f.PROPS,e,function(e){var t={};for(var r in e)t[r]=void 0;return t}(e.hooks)))),e.descendantHooks||e.hasThunks)for(var n=e.children,i=n.length,o=0;o<i;o++){var a=n[o];c(a,t,r+=1),d(a)&&a.count&&(r+=a.count)}}else g(e)&&s(e,null,t,r)}function u(e,t,r){return e.splice(t,1),{from:t,key:r}}function h(e){for(var t={},r=[],n=e.length,i=0;i<n;i++){var o=e[i];o.key?t[o.key]=i:r.push(i)}return{keys:t,free:r}}function l(e,t){return e?(p(e)?e.push(t):e=[e,t],e):t}var p=e("x-is-array"),f=e("../vnode/vpatch"),d=e("../vnode/is-vnode"),m=e("../vnode/is-vtext"),v=e("../vnode/is-widget"),g=e("../vnode/is-thunk"),y=e("../vnode/handle-thunk"),b=e("./diff-props");t.exports=n},{"../vnode/handle-thunk":249,"../vnode/is-thunk":250,"../vnode/is-vnode":252,"../vnode/is-vtext":253,"../vnode/is-widget":254,"../vnode/vpatch":257,"./diff-props":259,"x-is-array":279}],261:[function(e,t,r){!function(e){"use strict";e(function(e){return e("./makePromise")({scheduler:new(e("./Scheduler"))(e("./env").asap)})})}(function(r){t.exports=r(e)})},{"./Scheduler":262,"./env":274,"./makePromise":276}],262:[function(e,t,r){!function(e){"use strict";e(function(){function e(e){this._async=e,this._running=!1,this._queue=this,this._queueLen=0,this._afterQueue={},this._afterQueueLen=0;var t=this;this.drain=function(){t._drain()}}return e.prototype.enqueue=function(e){this._queue[this._queueLen++]=e,this.run()},e.prototype.afterQueue=function(e){this._afterQueue[this._afterQueueLen++]=e,this.run()},e.prototype.run=function(){this._running||(this._running=!0,this._async(this.drain))},e.prototype._drain=function(){for(var e=0;e<this._queueLen;++e)this._queue[e].run(),this._queue[e]=void 0;for(this._queueLen=0,this._running=!1,e=0;e<this._afterQueueLen;++e)this._afterQueue[e].run(),this._afterQueue[e]=void 0;this._afterQueueLen=0},e})}(function(e){t.exports=e()})},{}],263:[function(e,t,r){!function(e){"use strict";e(function(){function e(t){Error.call(this),this.message=t,this.name=e.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e})}(function(e){t.exports=e()})},{}],264:[function(e,t,r){!function(e){"use strict";e(function(){function e(e,r){function n(t,n){if(t.i<0)return r(t.f,t.thisArg,t.params,n);e._handler(t.args[t.i]).fold(i,t,void 0,n)}function i(e,t,r){e.params[e.i]=t,e.i-=1,n(e,r)}return arguments.length<2&&(r=t),function(t,i,o){var a=e._defer(),s=o.length;return n({f:t,thisArg:i,args:o,params:new Array(s),i:s-1,call:r},a._handler),a}}function t(e,t,r,n){try{n.resolve(e.apply(t,r))}catch(e){n.reject(e)}}return e.tryCatchResolve=t,e})}(function(e){t.exports=e()})},{}],265:[function(e,t,r){!function(e){"use strict";e(function(e){var t=e("../state"),r=e("../apply");return function(e){function n(t,r){var n=l.call(t);return e._traverse(r,n).then(function(t){return function(t,r){for(var n=r.length,i=new Array(n),o=0,a=0;o<n;++o)r[o]&&(i[a++]=e._handler(t[o]).value);return i.length=a,i}(n,t)})}function i(r){var n;return r instanceof e&&(n=r._handler.join()),n&&0===n.state()||!n?s(r).then(t.fulfilled,t.rejected):(n._unreport(),t.inspect(n))}function o(e){return function(t,r,n){return a(e,void 0,[t,r,n])}}var a=r(e),s=e.resolve,c=e.all,u=Array.prototype.reduce,h=Array.prototype.reduceRight,l=Array.prototype.slice;return e.any=function(t){for(var r,n,i=e._defer(),o=i._handler,a=t.length>>>0,s=a,c=[],u=0;u<a;++u)if(void 0!==(n=t[u])||u in t){if((r=e._handler(n)).state()>0){o.become(r),e._visitRemaining(t,u,r);break}r.visit(o,function(e){c=null,this.resolve(e)},function(e){this.resolved||(c.push(e),0==--s&&this.reject(c))})}else--s;return 0===s&&o.reject(new RangeError("any(): array must not be empty")),i},e.some=function(t,r){var n,i,o,a=e._defer(),s=a._handler,c=[],u=[],h=t.length>>>0,l=0;for(o=0;o<h;++o)(void 0!==(i=t[o])||o in t)&&++l;for(r=Math.max(r,0),n=l-r+1,r>(l=Math.min(r,l))?s.reject(new RangeError("some(): array must contain at least "+r+" item(s), but had "+l)):0===l&&s.resolve(c),o=0;o<h;++o)(void 0!==(i=t[o])||o in t)&&e._handler(i).visit(s,function(e){this.resolved||(c.push(e),0==--l&&(u=null,this.resolve(c)))},function(e){this.resolved||(u.push(e),0==--n&&(c=null,this.reject(u)))},s.notify);return a},e.settle=function(e){return c(e.map(i))},e.map=function(t,r){return e._traverse(r,t)},e.filter=n,e.reduce=function(e,t){return arguments.length>2?u.call(e,o(t),arguments[2]):u.call(e,o(t))},e.reduceRight=function(e,t){return arguments.length>2?h.call(e,o(t),arguments[2]):h.call(e,o(t))},e.prototype.spread=function(e){return this.then(c).then(function(t){return e.apply(this,t)})},e}})}(function(r){t.exports=r(e)})},{"../apply":264,"../state":277}],266:[function(e,t,r){!function(e){"use strict";e(function(){function e(){throw new TypeError("catch predicate must be a function")}function t(e,t){return function(e){return e===Error||null!=e&&e.prototype instanceof Error}(t)?e instanceof t:t(e)}function r(e){return e}return function(n){function i(e,t,r,n){var i=e.call(t);return function(e){return("object"==typeof e||"function"==typeof e)&&null!==e}(i)?function(e,t,r){return o(e).then(function(){return t(r)})}(i,r,n):r(n)}var o=n.resolve,a=n.reject,s=n.prototype.catch;return n.prototype.done=function(e,t){this._handler.visit(this._handler.receiver,e,t)},n.prototype.catch=n.prototype.otherwise=function(r){return arguments.length<2?s.call(this,r):"function"!=typeof r?this.ensure(e):s.call(this,function(e,r){return function(n){return t(n,r)?e.call(this,n):a(n)}}(arguments[1],r))},n.prototype.finally=n.prototype.ensure=function(e){return"function"!=typeof e?this:this.then(function(t){return i(e,this,r,t)},function(t){return i(e,this,a,t)})},n.prototype.else=n.prototype.orElse=function(e){return this.then(void 0,function(){return e})},n.prototype.yield=function(e){return this.then(function(){return e})},n.prototype.tap=function(e){return this.then(e).yield(this)},n}})}(function(e){t.exports=e()})},{}],267:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.fold=function(t,r){var n=this._beget();return this._handler.fold(function(r,n,i){e._handler(r).fold(function(e,r,n){n.resolve(t.call(this,r,e))},n,this,i)},r,n._handler.receiver,n._handler),n},e}})}(function(e){t.exports=e()})},{}],268:[function(e,t,r){!function(e){"use strict";e(function(e){var t=e("../state").inspect;return function(e){return e.prototype.inspect=function(){return t(e._handler(this))},e}})}(function(r){t.exports=r(e)})},{"../state":277}],269:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){function t(e,n,i,o){function a(o,a){return r(i(o)).then(function(){return t(e,n,i,a)})}return r(o).then(function(t){return r(n(t)).then(function(n){return n?t:r(e(t)).spread(a)})})}var r=e.resolve;return e.iterate=function(e,r,n,i){return t(function(t){return[t,e(t)]},r,n,i)},e.unfold=t,e}})}(function(e){t.exports=e()})},{}],270:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.progress=function(e){return this.then(void 0,void 0,e)},e}})}(function(e){t.exports=e()})},{}],271:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e,t,n,i){return r.setTimer(function(){e(n,i,t)},t)}var r=e("../env"),n=e("../TimeoutError");return function(e){function i(e,r,n){t(o,e,r,n)}function o(e,t){t.resolve(e)}function a(e,t,r){var i=void 0===e?new n("timed out after "+r+"ms"):e;t.reject(i)}return e.prototype.delay=function(e){var t=this._beget();return this._handler.fold(i,e,void 0,t._handler),t},e.prototype.timeout=function(e,n){var i=this._beget(),o=i._handler,s=t(a,e,n,i._handler);return this._handler.visit(o,function(e){r.clearTimer(s),this.resolve(e)},function(e){r.clearTimer(s),this.reject(e)},o.notify),i},e}})}(function(r){t.exports=r(e)})},{"../TimeoutError":263,"../env":274}],272:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e){throw e}function r(){}var n=e("../env").setTimer,i=e("../format");return function(e){function o(e){e.handled||(f.push(e),h("Potentially unhandled rejection ["+e.id+"] "+i.formatError(e.value)))}function a(e){var t=f.indexOf(e);t>=0&&(f.splice(t,1),l("Handled previous rejection ["+e.id+"] "+i.formatObject(e.value)))}function s(e,t){p.push(e,t),null===d&&(d=n(c,0))}function c(){for(d=null;p.length>0;)p.shift()(p.shift())}var u,h=r,l=r;"undefined"!=typeof console&&(u=console,h=void 0!==u.error?function(e){u.error(e)}:function(e){u.log(e)},l=void 0!==u.info?function(e){u.info(e)}:function(e){u.log(e)}),e.onPotentiallyUnhandledRejection=function(e){s(o,e)},e.onPotentiallyUnhandledRejectionHandled=function(e){s(a,e)},e.onFatalRejection=function(e){s(t,e.value)};var p=[],f=[],d=null;return e}})}(function(r){t.exports=r(e)})},{"../env":274,"../format":275}],273:[function(e,t,r){!function(e){"use strict";e(function(){return function(e){return e.prototype.with=e.prototype.withThis=function(e){var t=this._beget(),r=t._handler;return r.receiver=e,this._handler.chain(r,e),t},e}})}(function(e){t.exports=e()})},{}],274:[function(e,t,r){(function(r){!function(e){"use strict";e(function(e){var t,n="undefined"!=typeof setTimeout&&setTimeout,i=function(e,t){return setTimeout(e,t)},o=function(e){return clearTimeout(e)},a=function(e){return n(e,0)};if(void 0!==r&&"[object process]"===Object.prototype.toString.call(r))a=function(e){return r.nextTick(e)};else if(t="undefined"!=typeof MutationObserver&&MutationObserver||"undefined"!=typeof WebKitMutationObserver&&WebKitMutationObserver)a=function(e){var t,r=document.createTextNode("");new e(function(){var e=t;t=void 0,e()}).observe(r,{characterData:!0});var n=0;return function(e){t=e,r.data=n^=1}}(t);else if(!n){var s=e("vertx");i=function(e,t){return s.setTimer(t,e)},o=s.cancelTimer,a=s.runOnLoop||s.runOnContext}return{setTimer:i,clearTimer:o,asap:a}})}(function(r){t.exports=r(e)})}).call(this,e("_process"))},{_process:6}],275:[function(e,t,r){!function(e){"use strict";e(function(){function e(e){var r=String(e);return"[object Object]"===r&&"undefined"!=typeof JSON&&(r=t(e,r)),r}function t(e,t){try{return JSON.stringify(e)}catch(e){return t}}return{formatError:function(t){var r="object"==typeof t&&null!==t&&(t.stack||t.message)?t.stack||t.message:e(t);return t instanceof Error?r:r+" (WARNING: non-Error used)"},formatObject:e,tryStringify:t}})}(function(e){t.exports=e()})},{}],276:[function(e,t,r){(function(e){!function(t){"use strict";t(function(){return function(t){function r(e,t){this._handler=e===p?t:function(e){function t(e){r.reject(e)}var r=new d;try{e(function(e){r.resolve(e)},t,function(e){r.notify(e)})}catch(e){t(e)}return r}(e)}function n(e){return E(e)?e:new r(p,new m(h(e)))}function i(e){return new r(p,new m(new y(e)))}function o(){return B}function a(e,t,n){function i(e,t,r){h[e]=t,0==--u&&r.become(new g(h))}for(var o,a="function"==typeof t?function(r,o,a){a.resolved||s(n,i,r,e(t,o,r),a)}:i,c=new d,u=n.length>>>0,h=new Array(u),l=0;l<n.length&&!c.resolved;++l)void 0!==(o=n[l])||l in n?s(n,a,l,o,c):--u;return 0===u&&c.become(new g(h)),new r(p,c)}function s(e,t,r,n,i){if(C(n)){var o=function(e){return E(e)?e._handler.join():l(e)}(n),a=o.state();0===a?o.fold(t,r,void 0,i):a>0?t(r,o.value,i):(i.become(o),c(e,r+1,o))}else t(r,n,i)}function c(e,t,r){for(var n=t;n<e.length;++n)!function(e,t){if(e===t)return;var r=e.state();0===r?e.visit(e,void 0,e._unreport):r<0&&e._unreport()}(h(e[n]),r)}function u(e){return"object"!=typeof e||null===e?i(new TypeError("non-iterable passed to race()")):0===e.length?o():1===e.length?n(e[0]):function(e){var t,n,i,o=new d;for(t=0;t<e.length;++t)if(void 0!==(n=e[t])||t in e){if(0!==(i=h(n)).state()){o.become(i),c(e,t+1,i);break}i.visit(o,o.resolve,o.reject)}return new r(p,o)}(e)}function h(e){return E(e)?e._handler.join():C(e)?l(e):new g(e)}function l(e){try{var t=e.then;return"function"==typeof t?new v(t,e):new g(e)}catch(e){return new y(e)}}function p(){}function f(){}function d(e,t){r.createContext(this,t),this.consumers=void 0,this.receiver=e,this.handler=void 0,this.resolved=!1}function m(e){this.handler=e}function v(e,t){d.call(this),N.enqueue(new S(e,t,this))}function g(e){r.createContext(this),this.value=e}function y(e){r.createContext(this),this.id=++F,this.value=e,this.handled=!1,this.reported=!1,this._report()}function b(e,t){this.rejection=e,this.context=t}function _(e){this.rejection=e}function x(e,t){this.continuation=e,this.handler=t}function w(e,t){this.handler=t,this.value=e}function S(e,t,r){this._then=e,this.thenable=t,this.resolver=r}function M(e,t,r,n){this.f=e,this.z=t,this.c=r,this.to=n,this.resolver=k,this.receiver=this}function E(e){return e instanceof r}function C(e){return("object"==typeof e||"function"==typeof e)&&null!==e}function T(e,t,n,i){if("function"!=typeof e)return i.become(t);r.enterContext(t),function(e,t,r,n){try{n.become(h(e.call(r,t)))}catch(e){n.become(new y(e))}}(e,t.value,n,i),r.exitContext()}function O(e,t,n,i,o){if("function"!=typeof e)return o.become(n);r.enterContext(n),function(e,t,r,n,i){try{e.call(n,t,r,i)}catch(e){i.become(new y(e))}}(e,t,n.value,i,o),r.exitContext()}function P(e,t,r){try{return e(t,r)}catch(e){return i(e)}}function j(e,t){t.prototype=D(e.prototype),t.prototype.constructor=t}function A(e,t){return t}function R(){}function L(){return void 0!==e&&null!==e&&"function"==typeof e.emit?function(t,r){return"unhandledRejection"===t?e.emit(t,r.value,r):e.emit(t,r)}:"undefined"!=typeof self&&function(){if("function"==typeof CustomEvent)try{return new CustomEvent("unhandledRejection")instanceof CustomEvent}catch(e){}return!1}()?function(e,t){return function(r,n){var i=new t(r,{detail:{reason:n.value,key:n},bubbles:!1,cancelable:!0});return!e.dispatchEvent(i)}}(self,CustomEvent):"undefined"!=typeof self&&function(){if("undefined"!=typeof document&&"function"==typeof document.createEvent)try{return document.createEvent("CustomEvent").initCustomEvent("eventType",!1,!0,{}),!0}catch(e){}return!1}()?function(e,t){return function(r,n){var i=t.createEvent("CustomEvent");return i.initCustomEvent(r,!1,!0,{reason:n.value,key:n}),!e.dispatchEvent(i)}}(self,document):R}var N=t.scheduler,I=L(),D=Object.create||function(e){function t(){}return t.prototype=e,new t};r.resolve=n,r.reject=i,r.never=o,r._defer=function(){return new r(p,new d)},r._handler=h,r.prototype.then=function(e,t,r){var n=this._handler,i=n.join().state();if("function"!=typeof e&&i>0||"function"!=typeof t&&i<0)return new this.constructor(p,n);var o=this._beget(),a=o._handler;return n.chain(a,n.receiver,e,t,r),o},r.prototype.catch=function(e){return this.then(void 0,e)},r.prototype._beget=function(){return function(e,t){return new t(p,new d(e.receiver,e.join().context))}(this._handler,this.constructor)},r.all=function(e){return a(A,null,e)},r.race=u,r._traverse=function(e,t){return a(P,e,t)},r._visitRemaining=c,p.prototype.when=p.prototype.become=p.prototype.notify=p.prototype.fail=p.prototype._unreport=p.prototype._report=R,p.prototype._state=0,p.prototype.state=function(){return this._state},p.prototype.join=function(){for(var e=this;void 0!==e.handler;)e=e.handler;return e},p.prototype.chain=function(e,t,r,n,i){this.when({resolver:e,receiver:t,fulfilled:r,rejected:n,progress:i})},p.prototype.visit=function(e,t,r,n){this.chain(k,e,t,r,n)},p.prototype.fold=function(e,t,r,n){this.when(new M(e,t,r,n))},j(p,f),f.prototype.become=function(e){e.fail()};var k=new f;j(p,d),d.prototype._state=0,d.prototype.resolve=function(e){this.become(h(e))},d.prototype.reject=function(e){this.resolved||this.become(new y(e))},d.prototype.join=function(){if(!this.resolved)return this;for(var e=this;void 0!==e.handler;)if((e=e.handler)===this)return this.handler=new y(new TypeError("Promise cycle"));return e},d.prototype.run=function(){var e=this.consumers,t=this.handler;this.handler=this.handler.join(),this.consumers=void 0;for(var r=0;r<e.length;++r)t.when(e[r])},d.prototype.become=function(e){this.resolved||(this.resolved=!0,this.handler=e,void 0!==this.consumers&&N.enqueue(this),void 0!==this.context&&e._report(this.context))},d.prototype.when=function(e){this.resolved?N.enqueue(new x(e,this.handler)):void 0===this.consumers?this.consumers=[e]:this.consumers.push(e)},d.prototype.notify=function(e){this.resolved||N.enqueue(new w(e,this))},d.prototype.fail=function(e){var t=void 0===e?this.context:e;this.resolved&&this.handler.join().fail(t)},d.prototype._report=function(e){this.resolved&&this.handler.join()._report(e)},d.prototype._unreport=function(){this.resolved&&this.handler.join()._unreport()},j(p,m),m.prototype.when=function(e){N.enqueue(new x(e,this))},m.prototype._report=function(e){this.join()._report(e)},m.prototype._unreport=function(){this.join()._unreport()},j(d,v),j(p,g),g.prototype._state=1,g.prototype.fold=function(e,t,r,n){O(e,t,this,r,n)},g.prototype.when=function(e){T(e.fulfilled,this,e.receiver,e.resolver)};var F=0;j(p,y),y.prototype._state=-1,y.prototype.fold=function(e,t,r,n){n.become(this)},y.prototype.when=function(e){"function"==typeof e.rejected&&this._unreport(),T(e.rejected,this,e.receiver,e.resolver)},y.prototype._report=function(e){N.afterQueue(new b(this,e))},y.prototype._unreport=function(){this.handled||(this.handled=!0,N.afterQueue(new _(this)))},y.prototype.fail=function(e){this.reported=!0,I("unhandledRejection",this),r.onFatalRejection(this,void 0===e?this.context:e)},b.prototype.run=function(){this.rejection.handled||this.rejection.reported||(this.rejection.reported=!0,I("unhandledRejection",this.rejection)||r.onPotentiallyUnhandledRejection(this.rejection,this.context))},_.prototype.run=function(){this.rejection.reported&&(I("rejectionHandled",this.rejection)||r.onPotentiallyUnhandledRejectionHandled(this.rejection))},r.createContext=r.enterContext=r.exitContext=r.onPotentiallyUnhandledRejection=r.onPotentiallyUnhandledRejectionHandled=r.onFatalRejection=R;var B=new r(p,new p);return x.prototype.run=function(){this.handler.join().when(this.continuation)},w.prototype.run=function(){var e=this.handler.consumers;if(void 0!==e)for(var t,n=0;n<e.length;++n)!function(e,t,n,i,o){if("function"!=typeof e)return o.notify(t);r.enterContext(n),function(e,t,r,n){try{n.notify(e.call(r,t))}catch(e){n.notify(e)}}(e,t,i,o),r.exitContext()}((t=e[n]).progress,this.value,this.handler,t.receiver,t.resolver)},S.prototype.run=function(){var e=this.resolver;!function(e,t,r,n,i){try{e.call(t,r,n,i)}catch(e){n(e)}}(this._then,this.thenable,function(t){e.resolve(t)},function(t){e.reject(t)},function(t){e.notify(t)})},M.prototype.fulfilled=function(e){this.f.call(this.c,this.z,e,this.to)},M.prototype.rejected=function(e){this.to.reject(e)},M.prototype.progress=function(e){this.to.notify(e)},r}})}(function(e){t.exports=e()})}).call(this,e("_process"))},{_process:6}],277:[function(e,t,r){!function(e){"use strict";e(function(){function e(){return{state:"pending"}}function t(e){return{state:"rejected",reason:e}}function r(e){return{state:"fulfilled",value:e}}return{pending:e,fulfilled:r,rejected:t,inspect:function(e){var n=e.state();return 0===n?{state:"pending"}:n>0?r(e.value):t(e.value)}}})}(function(e){t.exports=e()})},{}],278:[function(e,t,r){!function(e){"use strict";e(function(e){function t(e,t,r,n){var i=m.resolve(e);return arguments.length<2?i:i.then(t,r,n)}function r(e){return function(){for(var t=0,r=arguments.length,n=new Array(r);t<r;++t)n[t]=arguments[t];return v(e,this,n)}}function n(e){for(var t=0,r=arguments.length-1,n=new Array(r);t<r;++t)n[t]=arguments[t+1];return v(e,this,n)}function i(){return new function(){function e(e){n._handler.resolve(e)}function t(e){n._handler.reject(e)}function r(e){n._handler.notify(e)}var n=m._defer();this.promise=n,this.resolve=e,this.reject=t,this.notify=r,this.resolver={resolve:e,reject:t,notify:r}}}var o=e("./lib/decorators/timed"),a=e("./lib/decorators/array"),s=e("./lib/decorators/flow"),c=e("./lib/decorators/fold"),u=e("./lib/decorators/inspect"),h=e("./lib/decorators/iterate"),l=e("./lib/decorators/progress"),p=e("./lib/decorators/with"),f=e("./lib/decorators/unhandledRejection"),d=e("./lib/TimeoutError"),m=[a,s,c,h,l,u,p,o,f].reduce(function(e,t){return t(e)},e("./lib/Promise")),v=e("./lib/apply")(m);return t.promise=function(e){return new m(e)},t.resolve=m.resolve,t.reject=m.reject,t.lift=r,t.try=n,t.attempt=n,t.iterate=m.iterate,t.unfold=m.unfold,t.join=function(){return m.all(arguments)},t.all=function(e){return t(e,m.all)},t.settle=function(e){return t(e,m.settle)},t.any=r(m.any),t.some=r(m.some),t.race=r(m.race),t.map=function(e,r){return t(e,function(e){return m.map(e,r)})},t.filter=function(e,r){return t(e,function(e){return m.filter(e,r)})},t.reduce=r(m.reduce),t.reduceRight=r(m.reduceRight),t.isPromiseLike=function(e){return e&&"function"==typeof e.then},t.Promise=m,t.defer=i,t.TimeoutError=d,t})}(function(r){t.exports=r(e)})},{"./lib/Promise":261,"./lib/TimeoutError":263,"./lib/apply":264,"./lib/decorators/array":265,"./lib/decorators/flow":266,"./lib/decorators/fold":267,"./lib/decorators/inspect":268,"./lib/decorators/iterate":269,"./lib/decorators/progress":270,"./lib/decorators/timed":271,"./lib/decorators/unhandledRejection":272,"./lib/decorators/with":273}],279:[function(e,t,r){var n=Array.isArray,i=Object.prototype.toString;t.exports=n||function(e){return"[object Array]"===i.call(e)}},{}],280:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./api/APIv3");r.APIv3=n.APIv3;var i=e("./api/ModelCreator");r.ModelCreator=i.ModelCreator},{"./api/APIv3":293,"./api/ModelCreator":294}],281:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./component/Component");r.Component=n.Component;var i=e("./component/ComponentService");r.ComponentService=i.ComponentService;var o=e("./component/utils/HandlerBase");r.HandlerBase=o.HandlerBase;var a=e("./component/AttributionComponent");r.AttributionComponent=a.AttributionComponent;var s=e("./component/BackgroundComponent");r.BackgroundComponent=s.BackgroundComponent;var c=e("./component/BearingComponent");r.BearingComponent=c.BearingComponent;var u=e("./component/CacheComponent");r.CacheComponent=u.CacheComponent;var h=e("./component/CoverComponent");r.CoverComponent=h.CoverComponent;var l=e("./component/DebugComponent");r.DebugComponent=l.DebugComponent;var p=e("./component/direction/DirectionComponent");r.DirectionComponent=p.DirectionComponent;var f=e("./component/direction/DirectionDOMCalculator");r.DirectionDOMCalculator=f.DirectionDOMCalculator;var d=e("./component/direction/DirectionDOMRenderer");r.DirectionDOMRenderer=d.DirectionDOMRenderer;var m=e("./component/ImageComponent");r.ImageComponent=m.ImageComponent;var v=e("./component/keyboard/KeyboardComponent");r.KeyboardComponent=v.KeyboardComponent;var g=e("./component/keyboard/KeyPlayHandler");r.KeyPlayHandler=g.KeyPlayHandler;var y=e("./component/keyboard/KeyZoomHandler");r.KeyZoomHandler=y.KeyZoomHandler;var b=e("./component/keyboard/KeySequenceNavigationHandler");r.KeySequenceNavigationHandler=b.KeySequenceNavigationHandler;var _=e("./component/keyboard/KeySpatialNavigationHandler");r.KeySpatialNavigationHandler=_.KeySpatialNavigationHandler;var x=e("./component/LoadingComponent");r.LoadingComponent=x.LoadingComponent;var w=e("./component/marker/marker/Marker");r.Marker=w.Marker;var S=e("./component/marker/MarkerComponent");r.MarkerComponent=S.MarkerComponent;var M=e("./component/marker/MarkerScene");r.MarkerScene=M.MarkerScene;var E=e("./component/marker/MarkerSet");r.MarkerSet=E.MarkerSet;var C=e("./component/mouse/MouseComponent");r.MouseComponent=C.MouseComponent;var T=e("./component/mouse/BounceHandler");r.BounceHandler=T.BounceHandler;var O=e("./component/mouse/DragPanHandler");r.DragPanHandler=O.DragPanHandler;var P=e("./component/mouse/DoubleClickZoomHandler");r.DoubleClickZoomHandler=P.DoubleClickZoomHandler;var j=e("./component/mouse/ScrollZoomHandler");r.ScrollZoomHandler=j.ScrollZoomHandler;var A=e("./component/mouse/TouchZoomHandler");r.TouchZoomHandler=A.TouchZoomHandler;var R=e("./component/popup/popup/Popup");r.Popup=R.Popup;var L=e("./component/popup/PopupComponent");r.PopupComponent=L.PopupComponent;var N=e("./component/NavigationComponent");r.NavigationComponent=N.NavigationComponent;var I=e("./component/RouteComponent");r.RouteComponent=I.RouteComponent;var D=e("./component/sequence/SequenceComponent");r.SequenceComponent=D.SequenceComponent;var k=e("./component/sequence/SequenceDOMRenderer");r.SequenceDOMRenderer=k.SequenceDOMRenderer;var F=e("./component/sequence/SequenceDOMInteraction");r.SequenceDOMInteraction=F.SequenceDOMInteraction;var B=e("./component/sequence/ControlMode");r.ControlMode=B.ControlMode;var U=e("./component/imageplane/ImagePlaneComponent");r.ImagePlaneComponent=U.ImagePlaneComponent;var z=e("./component/imageplane/ImagePlaneFactory");r.ImagePlaneFactory=z.ImagePlaneFactory;var $=e("./component/imageplane/ImagePlaneGLRenderer");r.ImagePlaneGLRenderer=$.ImagePlaneGLRenderer;var G=e("./component/imageplane/ImagePlaneScene");r.ImagePlaneScene=G.ImagePlaneScene;var V=e("./component/imageplane/ImagePlaneShaders");r.ImagePlaneShaders=V.ImagePlaneShaders;var H=e("./component/marker/marker/SimpleMarker");r.SimpleMarker=H.SimpleMarker;var q=e("./component/marker/marker/CircleMarker");r.CircleMarker=q.CircleMarker;var W=e("./component/imageplane/SliderComponent");r.SliderComponent=W.SliderComponent;var X=e("./component/StatsComponent");r.StatsComponent=X.StatsComponent;var Y=e("./component/tag/handlers/TagHandlerBase");r.TagHandlerBase=Y.TagHandlerBase;var K=e("./component/tag/handlers/CreateHandlerBase");r.CreateHandlerBase=K.CreateHandlerBase;var Z=e("./component/tag/handlers/CreatePointHandler");r.CreatePointHandler=Z.CreatePointHandler;var J=e("./component/tag/handlers/CreateVertexHandler");r.CreateVertexHandler=J.CreateVertexHandler;var Q=e("./component/tag/handlers/CreatePolygonHandler");r.CreatePolygonHandler=Q.CreatePolygonHandler;var ee=e("./component/tag/handlers/CreateRectHandler");r.CreateRectHandler=ee.CreateRectHandler;var te=e("./component/tag/handlers/CreateRectDragHandler");r.CreateRectDragHandler=te.CreateRectDragHandler;var re=e("./component/tag/handlers/EditVertexHandler");r.EditVertexHandler=re.EditVertexHandler;var ne=e("./component/tag/tag/Tag");r.Tag=ne.Tag;var ie=e("./component/tag/tag/OutlineTag");r.OutlineTag=ie.OutlineTag;var oe=e("./component/tag/tag/RenderTag");r.RenderTag=oe.RenderTag;var ae=e("./component/tag/tag/OutlineRenderTag");r.OutlineRenderTag=ae.OutlineRenderTag;var se=e("./component/tag/tag/OutlineCreateTag");r.OutlineCreateTag=se.OutlineCreateTag;var ce=e("./component/tag/tag/SpotTag");r.SpotTag=ce.SpotTag;var ue=e("./component/tag/tag/SpotRenderTag");r.SpotRenderTag=ue.SpotRenderTag;var he=e("./component/tag/TagComponent");r.TagComponent=he.TagComponent;var le=e("./component/tag/TagCreator");r.TagCreator=le.TagCreator;var pe=e("./component/tag/TagDOMRenderer");r.TagDOMRenderer=pe.TagDOMRenderer;var fe=e("./component/tag/TagMode");r.TagMode=fe.TagMode;var de=e("./component/tag/TagOperation");r.TagOperation=de.TagOperation;var me=e("./component/tag/TagScene");r.TagScene=me.TagScene;var ve=e("./component/tag/TagSet");r.TagSet=ve.TagSet;var ge=e("./component/tag/geometry/Geometry");r.Geometry=ge.Geometry;var ye=e("./component/tag/geometry/VertexGeometry");r.VertexGeometry=ye.VertexGeometry;var be=e("./component/tag/geometry/RectGeometry");r.RectGeometry=be.RectGeometry;var _e=e("./component/tag/geometry/PointGeometry");r.PointGeometry=_e.PointGeometry;var xe=e("./component/tag/geometry/PolygonGeometry");r.PolygonGeometry=xe.PolygonGeometry;var we=e("./component/tag/error/GeometryTagError");r.GeometryTagError=we.GeometryTagError,function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./component/interfaces/interfaces"))},{"./component/AttributionComponent":295,"./component/BackgroundComponent":296,"./component/BearingComponent":297,"./component/CacheComponent":298,"./component/Component":299,"./component/ComponentService":300,"./component/CoverComponent":301,"./component/DebugComponent":302,"./component/ImageComponent":303,"./component/LoadingComponent":304,"./component/NavigationComponent":305,"./component/RouteComponent":306,"./component/StatsComponent":307,"./component/direction/DirectionComponent":308,"./component/direction/DirectionDOMCalculator":309,"./component/direction/DirectionDOMRenderer":310,"./component/imageplane/ImagePlaneComponent":311,"./component/imageplane/ImagePlaneFactory":312,"./component/imageplane/ImagePlaneGLRenderer":313,"./component/imageplane/ImagePlaneScene":314,"./component/imageplane/ImagePlaneShaders":315,"./component/imageplane/SliderComponent":316,"./component/interfaces/interfaces":318,"./component/keyboard/KeyPlayHandler":319,"./component/keyboard/KeySequenceNavigationHandler":320,"./component/keyboard/KeySpatialNavigationHandler":321,"./component/keyboard/KeyZoomHandler":322,"./component/keyboard/KeyboardComponent":323,"./component/marker/MarkerComponent":325,"./component/marker/MarkerScene":326,"./component/marker/MarkerSet":327,"./component/marker/marker/CircleMarker":328,"./component/marker/marker/Marker":329,"./component/marker/marker/SimpleMarker":330,"./component/mouse/BounceHandler":331,"./component/mouse/DoubleClickZoomHandler":332,"./component/mouse/DragPanHandler":333,"./component/mouse/MouseComponent":334,"./component/mouse/ScrollZoomHandler":335,"./component/mouse/TouchZoomHandler":336,"./component/popup/PopupComponent":338,"./component/popup/popup/Popup":339,"./component/sequence/ControlMode":340,"./component/sequence/SequenceComponent":341,"./component/sequence/SequenceDOMInteraction":342,"./component/sequence/SequenceDOMRenderer":343,"./component/tag/TagComponent":345,"./component/tag/TagCreator":346,"./component/tag/TagDOMRenderer":347,"./component/tag/TagMode":348,"./component/tag/TagOperation":349,"./component/tag/TagScene":350,"./component/tag/TagSet":351,"./component/tag/error/GeometryTagError":352,"./component/tag/geometry/Geometry":353,"./component/tag/geometry/PointGeometry":354,"./component/tag/geometry/PolygonGeometry":355,"./component/tag/geometry/RectGeometry":356,"./component/tag/geometry/VertexGeometry":357,"./component/tag/handlers/CreateHandlerBase":358,"./component/tag/handlers/CreatePointHandler":359,"./component/tag/handlers/CreatePolygonHandler":360,"./component/tag/handlers/CreateRectDragHandler":361,"./component/tag/handlers/CreateRectHandler":362,"./component/tag/handlers/CreateVertexHandler":363,"./component/tag/handlers/EditVertexHandler":364,"./component/tag/handlers/TagHandlerBase":365,"./component/tag/tag/OutlineCreateTag":366,"./component/tag/tag/OutlineRenderTag":367,"./component/tag/tag/OutlineTag":368,"./component/tag/tag/RenderTag":369,"./component/tag/tag/SpotRenderTag":370,"./component/tag/tag/SpotTag":371,"./component/tag/tag/Tag":372,"./component/utils/HandlerBase":373}],282:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./graph/edge/EdgeDirection");r.EdgeDirection=n.EdgeDirection;var i=e("./graph/edge/EdgeCalculatorSettings");r.EdgeCalculatorSettings=i.EdgeCalculatorSettings;var o=e("./graph/edge/EdgeCalculatorDirections");r.EdgeCalculatorDirections=o.EdgeCalculatorDirections;var a=e("./graph/edge/EdgeCalculatorCoefficients");r.EdgeCalculatorCoefficients=a.EdgeCalculatorCoefficients;var s=e("./graph/edge/EdgeCalculator");r.EdgeCalculator=s.EdgeCalculator},{"./graph/edge/EdgeCalculator":392,"./graph/edge/EdgeCalculatorCoefficients":393,"./graph/edge/EdgeCalculatorDirections":394,"./graph/edge/EdgeCalculatorSettings":395,"./graph/edge/EdgeDirection":396}],283:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./error/ArgumentMapillaryError");r.ArgumentMapillaryError=n.ArgumentMapillaryError;var i=e("./error/GraphMapillaryError");r.GraphMapillaryError=i.GraphMapillaryError;var o=e("./error/MapillaryError");r.MapillaryError=o.MapillaryError},{"./error/ArgumentMapillaryError":374,"./error/GraphMapillaryError":375,"./error/MapillaryError":376}],284:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./geo/Camera");r.Camera=n.Camera;var i=e("./geo/GeoCoords");r.GeoCoords=i.GeoCoords;var o=e("./geo/ViewportCoords");r.ViewportCoords=o.ViewportCoords;var a=e("./geo/Spatial");r.Spatial=a.Spatial;var s=e("./geo/Transform");r.Transform=s.Transform},{"./geo/Camera":377,"./geo/GeoCoords":378,"./geo/Spatial":379,"./geo/Transform":380,"./geo/ViewportCoords":381}],285:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./graph/FilterCreator");r.FilterCreator=n.FilterCreator;var i=e("./graph/Graph");r.Graph=i.Graph;var o=e("./graph/GraphCalculator");r.GraphCalculator=o.GraphCalculator;var a=e("./graph/GraphMode");r.GraphMode=a.GraphMode;var s=e("./graph/GraphService");r.GraphService=s.GraphService;var c=e("./graph/ImageLoadingService");r.ImageLoadingService=c.ImageLoadingService;var u=e("./graph/MeshReader");r.MeshReader=u.MeshReader;var h=e("./graph/Node");r.Node=h.Node;var l=e("./graph/NodeCache");r.NodeCache=l.NodeCache;var p=e("./graph/Sequence");r.Sequence=p.Sequence},{"./graph/FilterCreator":382,"./graph/Graph":383,"./graph/GraphCalculator":384,"./graph/GraphMode":385,"./graph/GraphService":386,"./graph/ImageLoadingService":387,"./graph/MeshReader":388,"./graph/Node":389,"./graph/NodeCache":390,"./graph/Sequence":391}],286:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./Support"));var n=e("./Edge");r.EdgeDirection=n.EdgeDirection;var i=e("./Render");r.RenderMode=i.RenderMode;var o=e("./Viewer");r.Alignment=o.Alignment,r.ImageSize=o.ImageSize,r.Viewer=o.Viewer;var a=e("./component/tag/Tag");r.TagComponent=a;var s=e("./component/marker/Marker");r.MarkerComponent=s;var c=e("./component/popup/Popup");r.PopupComponent=c},{"./Edge":282,"./Render":287,"./Support":289,"./Viewer":292,"./component/marker/Marker":324,"./component/popup/Popup":337,"./component/tag/Tag":344}],287:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./render/DOMRenderer");r.DOMRenderer=n.DOMRenderer;var i=e("./render/GLRenderer");r.GLRenderer=i.GLRenderer;var o=e("./render/GLRenderStage");r.GLRenderStage=o.GLRenderStage;var a=e("./render/RenderCamera");r.RenderCamera=a.RenderCamera;var s=e("./render/RenderMode");r.RenderMode=s.RenderMode;var c=e("./render/RenderService");r.RenderService=c.RenderService},{"./render/DOMRenderer":397,"./render/GLRenderStage":398,"./render/GLRenderer":399,"./render/RenderCamera":400,"./render/RenderMode":401,"./render/RenderService":402}],288:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./state/State");r.State=n.State;var i=e("./state/states/StateBase");r.StateBase=i.StateBase;var o=e("./state/StateContext");r.StateContext=o.StateContext;var a=e("./state/StateService");r.StateService=a.StateService;var s=e("./state/states/TraversingState");r.TraversingState=s.TraversingState;var c=e("./state/states/WaitingState");r.WaitingState=c.WaitingState},{"./state/State":403,"./state/StateContext":404,"./state/StateService":405,"./state/states/StateBase":406,"./state/states/TraversingState":407,"./state/states/WaitingState":408}],289:[function(e,t,r){"use strict";function n(){return i.isBrowser()&&i.isArraySupported()&&i.isFunctionSupported()&&i.isJSONSupported()&&i.isObjectSupported()}Object.defineProperty(r,"__esModule",{value:!0});var i=e("./utils/Support");r.isSupported=function(){return n()&&i.isWebGLSupportedCached()},r.isFallbackSupported=n},{"./utils/Support":416}],290:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./tiles/ImageTileLoader");r.ImageTileLoader=n.ImageTileLoader;var i=e("./tiles/ImageTileStore");r.ImageTileStore=i.ImageTileStore;var o=e("./tiles/TextureProvider");r.TextureProvider=o.TextureProvider;var a=e("./tiles/RegionOfInterestCalculator");r.RegionOfInterestCalculator=a.RegionOfInterestCalculator},{"./tiles/ImageTileLoader":409,"./tiles/ImageTileStore":410,"./tiles/RegionOfInterestCalculator":411,"./tiles/TextureProvider":412}],291:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./utils/DOM");r.DOM=n.DOM;var i=e("./utils/EventEmitter");r.EventEmitter=i.EventEmitter;var o=e("./utils/Settings");r.Settings=o.Settings,function(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}(e("./utils/Support"));var a=e("./utils/Urls");r.Urls=a.Urls},{"./utils/DOM":413,"./utils/EventEmitter":414,"./utils/Settings":415,"./utils/Support":416,"./utils/Urls":417}],292:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./viewer/Alignment");r.Alignment=n.Alignment;var i=e("./viewer/CacheService");r.CacheService=i.CacheService;var o=e("./viewer/ComponentController");r.ComponentController=o.ComponentController;var a=e("./viewer/Container");r.Container=a.Container;var s=e("./viewer/Observer");r.Observer=s.Observer;var c=e("./viewer/ImageSize");r.ImageSize=c.ImageSize;var u=e("./viewer/KeyboardService");r.KeyboardService=u.KeyboardService;var h=e("./viewer/LoadingService");r.LoadingService=h.LoadingService;var l=e("./viewer/MouseService");r.MouseService=l.MouseService;var p=e("./viewer/Navigator");r.Navigator=p.Navigator;var f=e("./viewer/PlayService");r.PlayService=f.PlayService;var d=e("./viewer/Projection");r.Projection=d.Projection;var m=e("./viewer/SpriteService");r.SpriteService=m.SpriteService;var v=e("./viewer/TouchService");r.TouchService=v.TouchService;var g=e("./viewer/Viewer");r.Viewer=g.Viewer},{"./viewer/Alignment":418,"./viewer/CacheService":419,"./viewer/ComponentController":420,"./viewer/Container":421,"./viewer/ImageSize":422,"./viewer/KeyboardService":423,"./viewer/LoadingService":424,"./viewer/MouseService":425,"./viewer/Navigator":426,"./viewer/Observer":427,"./viewer/PlayService":428,"./viewer/Projection":429,"./viewer/SpriteService":430,"./viewer/TouchService":431,"./viewer/Viewer":432}],293:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable");e("rxjs/add/observable/defer"),e("rxjs/add/observable/fromPromise"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/map");var i=e("../API"),o=function(){function e(e,t,r){this._clientId=e,this._modelCreator=null!=r?r:new i.ModelCreator,this._model=this._modelCreator.createModel(e,t),this._pageCount=999,this._pathImageByKey="imageByKey",this._pathImageCloseTo="imageCloseTo",this._pathImagesByH="imagesByH",this._pathImageViewAdd="imageViewAdd",this._pathSequenceByKey="sequenceByKey",this._pathSequenceViewAdd="sequenceViewAdd",this._propertiesCore=["cl","l","sequence"],this._propertiesFill=["captured_at","user","project"],this._propertiesKey=["key"],this._propertiesSequence=["keys"],this._propertiesSpatial=["atomic_scale","ca","calt","cca","cfocal","gpano","height","merge_cc","merge_version","c_rotation","orientation","width"],this._propertiesUser=["username"]}return e.prototype.imageByKeyFill$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageByKey,e,this._propertiesKey.concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(t){if(!t)throw new Error("Images ("+e.join(", ")+") could not be found.");return t.json.imageByKey}),this._pathImageByKey,e)},e.prototype.imageByKeyFull$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageByKey,e,this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(t){if(!t)throw new Error("Images ("+e.join(", ")+") could not be found.");return t.json.imageByKey}),this._pathImageByKey,e)},e.prototype.imageCloseTo$=function(e,t){var r=t+":"+e;return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImageCloseTo,[r],this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial),this._propertiesKey.concat(this._propertiesUser)])).map(function(e){return null!=e?e.json.imageCloseTo[r]:null}),this._pathImageCloseTo,[r])},e.prototype.imagesByH$=function(e){var t=this;return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathImagesByH,e,{from:0,to:this._pageCount},this._propertiesKey.concat(this._propertiesCore),this._propertiesKey])).map(function(r){if(null==r){r={json:{imagesByH:{}}};for(var n=0,i=e;n<i.length;n++){var o=i[n];r.json.imagesByH[o]={};for(var a=0;a<=t._pageCount;a++)r.json.imagesByH[o][a]=null}}return r.json.imagesByH}),this._pathImagesByH,e)},e.prototype.imageViewAdd$=function(e){return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathImageViewAdd],[e])),this._pathImageViewAdd,e)},e.prototype.invalidateImageByKey=function(e){this._invalidateGet(this._pathImageByKey,e)},e.prototype.invalidateImagesByH=function(e){this._invalidateGet(this._pathImagesByH,e)},e.prototype.invalidateSequenceByKey=function(e){this._invalidateGet(this._pathSequenceByKey,e)},e.prototype.setToken=function(e){this._model.invalidate([]),this._model=null,this._model=this._modelCreator.createModel(this._clientId,e)},e.prototype.sequenceByKey$=function(e){return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([this._pathSequenceByKey,e,this._propertiesKey.concat(this._propertiesSequence)])).map(function(e){return e.json.sequenceByKey}),this._pathSequenceByKey,e)},e.prototype.sequenceViewAdd$=function(e){return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd],[e])),this._pathSequenceViewAdd,e)},Object.defineProperty(e.prototype,"clientId",{get:function(){return this._clientId},enumerable:!0,configurable:!0}),e.prototype._catchInvalidateGet$=function(e,t,r){var n=this;return e.catch(function(e){throw n._invalidateGet(t,r),e})},e.prototype._catchInvalidateCall$=function(e,t,r){var n=this;return e.catch(function(e){throw n._invalidateCall(t,r),e})},e.prototype._invalidateGet=function(e,t){this._model.invalidate([e,t])},e.prototype._invalidateCall=function(e,t){this._model.invalidate([e],[t])},e.prototype._wrapPromise$=function(e){return n.Observable.defer(function(){return n.Observable.fromPromise(e)})},e}();r.APIv3=o,r.default=o},{"../API":280,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],294:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("falcor"),i=e("falcor-http-datasource"),o=e("../Utils"),a=function(){function e(){}return e.prototype.createModel=function(e,t){var r={crossDomain:!0,withCredentials:!1};return null!=t&&(r.headers={Authorization:"Bearer "+t}),new n.Model({maxSize:16777216,source:new i(o.Urls.falcorModel(e),r)})},e}();r.ModelCreator=a,r.default=a},{"../Utils":291,falcor:15,"falcor-http-datasource":10}],295:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._disposable=this._navigator.stateService.currentNode$.map(function(t){return{name:e._name,vnode:e._getAttributionNode(t.username,t.key)}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getAttributionNode=function(e,t){return i.h("div.Attribution",{},[i.h("a",{href:"https://www.mapillary.com/app/user/"+e,target:"_blank",textContent:"@"+e},[]),i.h("span",{textContent:"|"},[]),i.h("a",{href:"https://www.mapillary.com/app/?pKey="+t+"&focus=photo",target:"_blank",textContent:"mapillary.com"},[])])},t.componentName="attribution",t}(o.Component);r.AttributionComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":281,"virtual-dom":237}],296:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){this._container.domRenderer.render$.next({name:this._name,vnode:this._getBackgroundNode("The viewer can't display the given image.")})},t.prototype._deactivate=function(){},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getBackgroundNode=function(e){return i.h("div.BackgroundWrapper",{},[i.h("p",{textContent:e},[])])},t.componentName="background",t}(o.Component);r.BackgroundComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":281,"virtual-dom":237}],297:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable"),a=e("../Component"),s=e("../Geo"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._spatial=new s.Spatial,i._svgNamespace="http://www.w3.org/2000/svg",i._distinctThreshold=Math.PI/90,i}return n(t,e),t.prototype._activate=function(){var e=this,t=this._navigator.stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).map(function(t){var r=t.state.currentNode,n=t.state.currentTransform;if(r.pano){var i=2*Math.PI*r.gpano.CroppedAreaImageWidthPixels/r.gpano.FullPanoWidthPixels;return[e._spatial.degToRad(r.ca),i]}var o=Math.max(n.basicWidth,n.basicHeight);o<=0&&console.warn("Original image size ("+n.basicWidth+", "+n.basicHeight+") is invalid ("+r.key+". Not showing available fov.");var a=o>0?2*Math.atan(.5*n.basicWidth/(o*n.focal)):0;return[e._spatial.degToRad(r.ca),a]}).distinctUntilChanged(function(t,r){return Math.abs(r[0]-t[0])<e._distinctThreshold&&Math.abs(r[1]-t[1])<e._distinctThreshold}),r=this._container.renderService.renderCamera$.map(function(t){var r=e._spatial.degToRad(t.perspective.fov),n=t.perspective.aspect===Number.POSITIVE_INFINITY?Math.PI:2*Math.atan(t.perspective.aspect*Math.tan(.5*r));return[e._spatial.azimuthalToBearing(t.rotation.phi),n]}).distinctUntilChanged(function(t,r){return Math.abs(r[0]-t[0])<e._distinctThreshold&&Math.abs(r[1]-t[1])<e._distinctThreshold});this._renderSubscription=o.Observable.combineLatest(t,r).map(function(t){var r=i.h("div.BearingIndicatorBackground",{oncontextmenu:function(e){e.preventDefault()}},[i.h("div.BearingIndicatorBackgroundRectangle",{},[]),i.h("div.BearingIndicatorBackgroundCircle",{},[])]),n=i.h("div.BearingIndicatorNorth",{},[]),o=e._createCircleSector(t[0][0],t[0][1],"#000"),a=e._createCircleSector(t[1][0],t[1][1],"#fff"),s=e._createCircleSectorCompass(o,a);return{name:e._name,vnode:i.h("div.BearingIndicator",{},[r,n,s])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._renderSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._createCircleSectorCompass=function(e,t){var r=i.h("g",{attributes:{transform:"translate(1,1)"},namespace:this._svgNamespace},[e,t]),n=i.h("circle",{attributes:{cx:"1",cy:"1",fill:"#abb1b9",r:"0.291667",stroke:"#000","stroke-width":"0.0833333"},namespace:this._svgNamespace},[]);return i.h("svg",{attributes:{viewBox:"0 0 2 2"},namespace:this._svgNamespace,style:{bottom:"4px",height:"48px",left:"4px",position:"absolute",width:"48px"}},[r,n])},t.prototype._createCircleSector=function(e,t,r){if(t>2*Math.PI-Math.PI/90)return i.h("circle",{attributes:{cx:"0",cy:"0",fill:r,r:"1"},namespace:this._svgNamespace},[]);var n=e-t/2-Math.PI/2,o=n+t,a=Math.cos(n),s=Math.sin(n),c=Math.cos(o),u=Math.sin(o),h="M 0 0 "+a+" "+s+" A 1 1 0 "+(t>=Math.PI?1:0)+" 1 "+c+" "+u;return i.h("path",{attributes:{d:h,fill:r},namespace:this._svgNamespace},[])},t.componentName="bearing",t}(a.Component);r.BearingComponent=c,a.ComponentService.register(c),r.default=c},{"../Component":281,"../Geo":284,"rxjs/Observable":29,"virtual-dom":237}],298:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/from"),e("rxjs/add/observable/merge"),e("rxjs/add/observable/of"),e("rxjs/add/observable/zip"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinct"),e("rxjs/add/operator/expand"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/mergeAll"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/switchMap");var o=e("../Edge"),a=e("../Component"),s=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype.setDepth=function(e){this.configure({depth:e})},t.prototype._activate=function(){var e=this;this._sequenceSubscription=i.Observable.combineLatest(this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$}).filter(function(e){return e.cached}),this._configuration$).switchMap(function(t){var r=t[0],n=t[1],a=Math.max(0,Math.min(4,n.depth.sequence)),s=e._cache$(r.edges,o.EdgeDirection.Next,a),c=e._cache$(r.edges,o.EdgeDirection.Prev,a);return i.Observable.merge(s,c).catch(function(e,t){return console.error("Failed to cache sequence edges.",e),i.Observable.empty()})}).subscribe(function(){}),this._spatialSubscription=this._navigator.stateService.currentNode$.switchMap(function(e){return i.Observable.combineLatest(i.Observable.of(e),e.spatialEdges$.filter(function(e){return e.cached}))}).combineLatest(this._configuration$,function(e,t){return[e[0],e[1],t]}).switchMap(function(t){var r=t[0],n=t[1].edges,a=t[2].depth,s=Math.max(0,Math.min(2,a.pano)),c=r.pano?0:Math.max(0,Math.min(3,a.step)),u=r.pano?0:Math.max(0,Math.min(1,a.turn)),h=e._cache$(n,o.EdgeDirection.Pano,s),l=e._cache$(n,o.EdgeDirection.StepForward,c),p=e._cache$(n,o.EdgeDirection.StepBackward,c),f=e._cache$(n,o.EdgeDirection.StepLeft,c),d=e._cache$(n,o.EdgeDirection.StepRight,c),m=e._cache$(n,o.EdgeDirection.TurnLeft,u),v=e._cache$(n,o.EdgeDirection.TurnRight,u),g=e._cache$(n,o.EdgeDirection.TurnU,u);return i.Observable.merge(l,p,f,d,h,m,v,g).catch(function(e,t){return console.error("Failed to cache spatial edges.",e),i.Observable.empty()})}).subscribe(function(){})},t.prototype._deactivate=function(){this._sequenceSubscription.unsubscribe(),this._spatialSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{depth:{pano:1,sequence:2,step:1,turn:0}}},t.prototype._cache$=function(e,t,r){var n=this;return i.Observable.zip(i.Observable.of(e),i.Observable.of(r)).expand(function(e){var r=e[0],o=e[1],a=[];if(o>0)for(var s=0,c=r;s<c.length;s++){var u=c[s];u.data.direction===t&&a.push(i.Observable.zip(n._navigator.graphService.cacheNode$(u.to).mergeMap(function(e){return n._nodeToEdges$(e,t)}),i.Observable.of(o-1)))}return i.Observable.from(a).mergeAll()}).skip(1)},t.prototype._nodeToEdges$=function(e,t){return([o.EdgeDirection.Next,o.EdgeDirection.Prev].indexOf(t)>-1?e.sequenceEdges$:e.spatialEdges$).first(function(e){return e.cached}).map(function(e){return e.edges})},t.componentName="cache",t}(a.Component);r.CacheComponent=s,a.ComponentService.register(s),r.default=s},{"../Component":281,"../Edge":282,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":77,"rxjs/add/operator/switchMap":81}],299:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/BehaviorSubject"),o=e("rxjs/Subject");e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var a=function(e){function t(t,r,n){var a=e.call(this)||this;return a._activated$=new i.BehaviorSubject(!1),a._configurationSubject$=new o.Subject,a._activated=!1,a._container=r,a._name=t,a._navigator=n,a._configuration$=a._configurationSubject$.startWith(a.defaultConfiguration).scan(function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}).publishReplay(1).refCount(),a._configuration$.subscribe(function(){}),a}return n(t,e),Object.defineProperty(t.prototype,"activated",{get:function(){return this._activated},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activated$",{get:function(){return this._activated$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"defaultConfiguration",{get:function(){return this._getDefaultConfiguration()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"configuration$",{get:function(){return this._configuration$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.activate=function(e){this._activated||(void 0!==e&&this._configurationSubject$.next(e),this._activated=!0,this._activate(),this._activated$.next(!0))},t.prototype.configure=function(e){this._configurationSubject$.next(e)},t.prototype.deactivate=function(){this._activated&&(this._activated=!1,this._deactivate(),this._container.domRenderer.clear(this._name),this._container.glRenderer.clear(this._name),this._activated$.next(!1))},t.prototype.resize=function(){},t.componentName="not_worthy",t}(e("../Utils").EventEmitter);r.Component=a,r.default=a},{"../Utils":291,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80}],300:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("../Error"),o=function(){function e(t,r){this._components={};for(var i=0,o=n.values(e.registeredComponents);i<o.length;i++){var a=o[i];this._components[a.componentName]={active:!1,component:new a(a.componentName,t,r)}}this._coverComponent=new e.registeredCoverComponent("cover",t,r),this._coverComponent.activate(),this._coverActivated=!0}return e.register=function(t){void 0===e.registeredComponents[t.componentName]&&(e.registeredComponents[t.componentName]=t)},e.registerCover=function(t){e.registeredCoverComponent=t},Object.defineProperty(e.prototype,"coverActivated",{get:function(){return this._coverActivated},enumerable:!0,configurable:!0}),e.prototype.activateCover=function(){if(!this._coverActivated){this._coverActivated=!0;for(var e=0,t=n.values(this._components);e<t.length;e++){var r=t[e];r.active&&r.component.deactivate()}}},e.prototype.deactivateCover=function(){if(this._coverActivated){this._coverActivated=!1;for(var e=0,t=n.values(this._components);e<t.length;e++){var r=t[e];r.active&&r.component.activate()}}},e.prototype.activate=function(e){this._checkName(e),this._components[e].active=!0,this._coverActivated||this.get(e).activate()},e.prototype.configure=function(e,t){this._checkName(e),this.get(e).configure(t)},e.prototype.deactivate=function(e){this._checkName(e),this._components[e].active=!1,this._coverActivated||this.get(e).deactivate()},e.prototype.resize=function(){for(var e=0,t=n.values(this._components);e<t.length;e++){t[e].component.resize()}},e.prototype.get=function(e){return this._components[e].component},e.prototype.getCover=function(){return this._coverComponent},e.prototype._checkName=function(e){if(!(e in this._components))throw new i.ArgumentMapillaryError("Component does not exist: "+e)},e.registeredComponents={},e}();r.ComponentService=o,r.default=o},{"../Error":283,underscore:233}],301:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom");e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/withLatestFrom");var o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._keyDisposable=this._navigator.stateService.currentNode$.withLatestFrom(this._configuration$,function(e,t){return[e,t]}).filter(function(e){var t=e[0],r=e[1];return t.key!==r.key}).map(function(e){var t=e[0];e[1];return t}).map(function(e){return{key:e.key,src:e.image.src}}).subscribe(this._configurationSubject$),this._disposable=this._configuration$.map(function(t){return t.key?t.state===o.CoverState.Hidden?{name:e._name,vnode:i.h("div.Cover.CoverDone",[e._getCoverBackgroundVNode(t)])}:{name:e._name,vnode:e._getCoverButtonVNode(t)}:{name:e._name,vnode:i.h("div",[])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe(),this._keyDisposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{state:o.CoverState.Visible}},t.prototype._getCoverButtonVNode=function(e){var t=this,r=e.state===o.CoverState.Loading?"div.Cover.CoverLoading":"div.Cover";return i.h(r,[this._getCoverBackgroundVNode(e),i.h("button.CoverButton",{onclick:function(){t.configure({state:o.CoverState.Loading})}},["Explore"]),i.h("a.CoverLogo",{href:"https://www.mapillary.com",target:"_blank"},[])])},t.prototype._getCoverBackgroundVNode=function(e){var t={style:{backgroundImage:null!=e.src?"url("+e.src+")":"url(https://d1cuyjsrcm0gby.cloudfront.net/"+e.key+"/thumb-640.jpg)"}},r=[];return e.state===o.CoverState.Loading&&r.push(i.h("div.Spinner",{},[])),r.push(i.h("div.CoverBackgroundGradient",{},[])),i.h("div.CoverBackground",t,r)},t.componentName="cover",t}(o.Component);r.CoverComponent=a,o.ComponentService.registerCover(a),r.default=a},{"../Component":281,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":87,"virtual-dom":237}],302:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom"),a=e("rxjs/BehaviorSubject");e("rxjs/add/operator/combineLatest");var s=e("../Component"),c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._open$=new a.BehaviorSubject(!1),t}return n(t,e),t.prototype._activate=function(){var e=this;this._disposable=this._navigator.stateService.currentState$.combineLatest(this._open$,this._navigator.imageLoadingService.loadstatus$,function(t,r,n){return{name:e._name,vnode:e._getDebugVNode(r,e._getDebugInfo(t,n))}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getDebugInfo=function(e,t){var r=[];r.push(o.h("h2","Node")),e.state.currentNode&&r.push(o.h("p","currentNode: "+e.state.currentNode.key)),e.state.previousNode&&r.push(o.h("p","previousNode: "+e.state.previousNode.key)),r.push(o.h("h2","Loading"));for(var n=0,a=0,s=0,c=0,u=i.values(t);c<u.length;c++){var h=u[c];n+=h.loaded,h.loaded!==h.total?s++:a++}return r.push(o.h("p","Loaded Images: "+a)),r.push(o.h("p","Loading Images: "+s)),r.push(o.h("p","Total bytes loaded: "+n)),r.push(o.h("h2","Camera")),r.push(o.h("p","camera.position.x: "+e.state.camera.position.x)),r.push(o.h("p","camera.position.y: "+e.state.camera.position.y)),r.push(o.h("p","camera.position.z: "+e.state.camera.position.z)),r.push(o.h("p","camera.lookat.x: "+e.state.camera.lookat.x)),r.push(o.h("p","camera.lookat.y: "+e.state.camera.lookat.y)),r.push(o.h("p","camera.lookat.z: "+e.state.camera.lookat.z)),r.push(o.h("p","camera.up.x: "+e.state.camera.up.x)),r.push(o.h("p","camera.up.y: "+e.state.camera.up.y)),r.push(o.h("p","camera.up.z: "+e.state.camera.up.z)),r},t.prototype._getDebugVNode=function(e,t){return e?o.h("div.Debug",{},[o.h("h2",{},["Debug"]),this._getDebugVNodeButton(e),o.h("pre",{},t)]):this._getDebugVNodeButton(e)},t.prototype._getDebugVNodeButton=function(e){var t=e?"Disable Debug":"D",r=e?"":".DebugButtonFixed";return e?o.h("button.DebugButton"+r,{onclick:this._closeDebugElement.bind(this)},[t]):o.h("button.DebugButton"+r,{onclick:this._openDebugElement.bind(this)},[t])},t.prototype._closeDebugElement=function(e){this._open$.next(!1)},t.prototype._openDebugElement=function(){this._open$.next(!0)},t.componentName="debug",t}(s.Component);r.DebugComponent=c,s.ComponentService.register(c),r.default=c},{"../Component":281,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,underscore:233,"virtual-dom":237}],303:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable");e("rxjs/add/operator/combineLatest");var a=e("../Component"),s=e("../Utils"),c=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._canvasId=r.id+"-"+o._name,o._dom=i||new s.DOM,o}return n(t,e),t.prototype._activate=function(){var e=this,t=this._container.domRenderer.element$.map(function(t){return e._dom.document.getElementById(e._canvasId)}).filter(function(e){return!!e}).map(function(e){var t=e.parentElement,r=t.offsetWidth;return[e,{height:t.offsetHeight,width:r}]}).distinctUntilChanged(function(e,t){return e.height===t.height&&e.width===t.width},function(e){e[0];return e[1]});this.drawSubscription=o.Observable.combineLatest(t,this._navigator.stateService.currentNode$).subscribe(function(e){var t=e[0],r=t[0],n=t[1],i=e[1];r.width=n.width,r.height=n.height,r.getContext("2d").drawImage(i.image,0,0,n.width,n.height)}),this._container.domRenderer.renderAdaptive$.next({name:this._name,vnode:i.h("canvas#"+this._canvasId,[])})},t.prototype._deactivate=function(){this.drawSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.componentName="image",t}(a.Component);r.ImageComponent=c,a.ComponentService.register(c),r.default=c},{"../Component":281,"../Utils":291,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"virtual-dom":237}],304:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom"),a=e("rxjs/Observable");e("rxjs/add/operator/combineLatest");var s=e("../Component"),c=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._loadingSubscription=this._navigator.loadingService.loading$.switchMap(function(t){return t?e._navigator.imageLoadingService.loadstatus$:a.Observable.of({})}).map(function(t){for(var r=0,n=0,o=0,a=i.values(t);o<a.length;o++){var s=a[o];s.loaded!==s.total&&(n+=s.loaded,r+=s.total)}var c=100;return 0!==r&&(c=n/r*100),{name:e._name,vnode:e._getBarVNode(c)}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._loadingSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._getBarVNode=function(e){var t={};return 100!==e?(t.width=e.toFixed(0)+"%",t.opacity="1"):(t.width="100%",t.opacity="0"),o.h("div.Loading",{style:{}},[o.h("div.LoadingBar",{style:t},[])])},t.componentName="loading",t}(s.Component);r.LoadingComponent=c,s.ComponentService.register(c),r.default=c},{"../Component":281,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,underscore:233,"virtual-dom":237}],305:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable");e("rxjs/add/operator/map"),e("rxjs/add/operator/first");var a=e("../Edge"),s=e("../Component"),c=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._seqNames={},i._seqNames[a.EdgeDirection[a.EdgeDirection.Prev]]="Prev",i._seqNames[a.EdgeDirection[a.EdgeDirection.Next]]="Next",i._spaTopNames={},i._spaTopNames[a.EdgeDirection[a.EdgeDirection.TurnLeft]]="Turnleft",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepLeft]]="Left",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepForward]]="Forward",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.StepRight]]="Right",i._spaTopNames[a.EdgeDirection[a.EdgeDirection.TurnRight]]="Turnright",i._spaBottomNames={},i._spaBottomNames[a.EdgeDirection[a.EdgeDirection.TurnU]]="Turnaround",i._spaBottomNames[a.EdgeDirection[a.EdgeDirection.StepBackward]]="Backward",i}return n(t,e),t.prototype._activate=function(){var e=this;this._renderSubscription=o.Observable.combineLatest(this._navigator.stateService.currentNode$,this._configuration$).switchMap(function(e){var t=e[0],r=e[1],n=r.sequence?t.sequenceEdges$.map(function(e){return e.edges.map(function(e){return e.data.direction})}):o.Observable.of([]),i=!t.pano&&r.spatial?t.spatialEdges$.map(function(e){return e.edges.map(function(e){return e.data.direction})}):o.Observable.of([]);return o.Observable.combineLatest(n,i).map(function(e){var t=e[0],r=e[1];return t.concat(r)})}).map(function(t){var r=e._createArrowRow(e._seqNames,t),n=e._createArrowRow(e._spaTopNames,t),o=e._createArrowRow(e._spaBottomNames,t),a=i.h("div.NavigationSequence",r),s=i.h("div.NavigationSpatialTop",n),c=i.h("div.NavigationSpatialBottom",o),u=i.h("div.NavigationSpatial",[s,c]);return{name:e._name,vnode:i.h("div.NavigationContainer",[a,u])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._renderSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{sequence:!0,spatial:!0}},t.prototype._createArrowRow=function(e,t){var r=[];for(var n in e)if(e.hasOwnProperty(n)){var i=a.EdgeDirection[n];-1!==t.indexOf(i)?r.push(this._createVNode(i,e[n],"visible")):r.push(this._createVNode(i,e[n],"hidden"))}return r},t.prototype._createVNode=function(e,t,r){var n=this;return i.h("span.Direction.Direction"+t,{onclick:function(t){n._navigator.moveDir$(e).subscribe(function(e){},function(e){console.error(e)})},style:{visibility:r}},[])},t.componentName="navigation",t}(s.Component);r.NavigationComponent=c,s.ComponentService.register(c),r.default=c},{"../Component":281,"../Edge":282,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":237}],306:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("underscore"),o=e("virtual-dom"),a=e("rxjs/Observable");e("rxjs/add/observable/fromPromise"),e("rxjs/add/observable/of"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinct"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/pluck"),e("rxjs/add/operator/scan");var s=e("../Component"),c=function(){return function(){}}(),u=function(){return function(){}}(),h=function(){return function(){this.nodeInstructions=[],this.nodeInstructionsOrdered=[]}}(),l=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e,t=this;e=this._navigator.stateService.currentState$.filter(function(e){return e.id%2==0}).filter(function(e){return e.state.nodesAhead<15}).distinctUntilChanged(void 0,function(e){return e.state.lastNode.key});var r;r=this.configuration$.mergeMap(function(e){return a.Observable.from(e.paths)}).distinct(function(e){return e.sequenceKey}).mergeMap(function(e){return t._navigator.apiV3.sequenceByKey$([e.sequenceKey]).map(function(t){return t[e.sequenceKey]})}).combineLatest(this.configuration$,function(e,t){for(var r=0,n=[],i=0,o=t.paths;i<o.length;i++){var a=o[i];if(a.sequenceKey===e.key){for(var s=[],c=!1,u=0,h=e.keys;u<h.length;u++){var l=h[u];if(a.startKey===l&&(c=!0),c){for(var p=null,f=0,d=a.infoKeys;f<d.length;f++){var m=d[f];m.key===l&&(p=m.description)}s.push({description:p,key:l})}a.stopKey===l&&(c=!1)}n.push({nodeInstructions:s,place:r})}r++}return n}).scan(function(e,t){for(var r=0,n=t;r<n.length;r++){var o=n[r];e.nodeInstructionsOrdered[o.place]=o.nodeInstructions}return e.nodeInstructions=i.flatten(e.nodeInstructionsOrdered),e},new h),this._disposable=e.combineLatest(r,this.configuration$,function(e,t,r){return{conf:r,frame:e,routeTrack:t}}).scan(function(e,r){return void 0===r.conf.playing||r.conf.playing?(e.routeTrack=r.routeTrack,e.currentNode=r.frame.state.currentNode,e.lastNode=r.frame.state.lastNode,e.playing=!0):(t._navigator.stateService.cutNodes(),e.playing=!1),e},new u).filter(function(e){return e.playing}).filter(function(e){for(var t=0,r=e.routeTrack.nodeInstructions;t<r.length;t++){var n=r[t];if(n&&n.key===e.lastNode.key)return!0}return!1}).distinctUntilChanged(void 0,function(e){return e.lastNode.key}).mergeMap(function(e){for(var r=0,n=0,i=e.routeTrack.nodeInstructions;n<i.length;n++){if(i[n].key===e.lastNode.key)break;r++}var o=e.routeTrack.nodeInstructions[r+1];return o?t._navigator.graphService.cacheNode$(o.key):a.Observable.of(null)}).combineLatest(this.configuration$,function(e,t){return{conf:t,node:e}}).filter(function(e){return null!==e.node&&e.conf.playing}).pluck("node").subscribe(this._navigator.stateService.appendNode$),this._disposableDescription=this._navigator.stateService.currentNode$.combineLatest(r,this.configuration$,function(e,t,r){if(void 0!==r.playing&&!r.playing)return"quit";for(var n=null,i=0,o=t.nodeInstructions;i<o.length;i++){var a=o[i];if(a.key===e.key){n=a.description;break}}return n}).scan(function(e,t){return t!==e.description&&null!==t?(e.description=t,e.showsLeft=6):e.showsLeft--,"quit"===t&&(e.description=null),e},new c).map(function(e){return e.showsLeft>0&&e.description?{name:t._name,vnode:t._getRouteAnnotationNode(e.description)}:{name:t._name,vnode:o.h("div",[])}}).subscribe(this._container.domRenderer.render$)},t.prototype._deactivate=function(){this._disposable.unsubscribe(),this._disposableDescription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype.play=function(){this.configure({playing:!0})},t.prototype.stop=function(){this.configure({playing:!1})},t.prototype._getRouteAnnotationNode=function(e){return o.h("div.RouteFrame",{},[o.h("p",{textContent:e},[])])},t.componentName="route",t}(s.Component);r.RouteComponent=l,s.ComponentService.register(l),r.default=l},{"../Component":281,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":75,underscore:233,"virtual-dom":237}],307:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable");e("rxjs/add/operator/buffer"),e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/scan");var o=e("../Component"),a=function(e){function t(t,r,n){return e.call(this,t,r,n)||this}return n(t,e),t.prototype._activate=function(){var e=this;this._sequenceSubscription=this._navigator.stateService.currentNode$.scan(function(e,t){var r=t.sequenceKey;return e.report=[],r in e.reported||(e.report=[r],e.reported[r]=!0),e},{report:[],reported:{}}).filter(function(e){return e.report.length>0}).mergeMap(function(t){return e._navigator.apiV3.sequenceViewAdd$(t.report).catch(function(e,r){return console.error("Failed to report sequence stats ("+t.report+")",e),i.Observable.empty()})}).subscribe(function(){}),this._imageSubscription=this._navigator.stateService.currentNode$.map(function(e){return e.key}).buffer(this._navigator.stateService.currentNode$.debounceTime(5e3)).scan(function(e,t){e.report=[];for(var r=0,n=t;r<n.length;r++){var i=n[r];i in e.reported||(e.report.push(i),e.reported[i]=!0)}return e},{report:[],reported:{}}).filter(function(e){return e.report.length>0}).mergeMap(function(t){return e._navigator.apiV3.imageViewAdd$(t.report).catch(function(e,r){return console.error("Failed to report image stats ("+t.report+")",e),i.Observable.empty()})}).subscribe(function(){})},t.prototype._deactivate=function(){this._sequenceSubscription.unsubscribe(),this._imageSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{}},t.componentName="stats",t}(o.Component);r.StatsComponent=a,o.ComponentService.register(a),r.default=a},{"../Component":281,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75}],308:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("rxjs/Observable"),a=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/do"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/share");var s=e("../../Component"),c=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._renderer=i||new s.DirectionDOMRenderer(o.defaultConfiguration,r.element),o._hoveredKeySubject$=new a.Subject,o._hoveredKey$=o._hoveredKeySubject$.share(),o}return n(t,e),Object.defineProperty(t.prototype,"hoveredKey$",{get:function(){return this._hoveredKey$},enumerable:!0,configurable:!0}),t.prototype.setHighlightKey=function(e){this.configure({highlightKey:e})},t.prototype.setMinWidth=function(e){this.configure({minWidth:e})},t.prototype.setMaxWidth=function(e){this.configure({maxWidth:e})},t.prototype.resize=function(){this._renderer.resize(this._container.element)},t.prototype._activate=function(){var e=this;this._configurationSubscription=this._configuration$.subscribe(function(t){e._renderer.setConfiguration(t)}),this._nodeSubscription=this._navigator.stateService.currentNode$.do(function(t){e._container.domRenderer.render$.next({name:e._name,vnode:i.h("div",{},[])}),e._renderer.setNode(t)}).withLatestFrom(this._configuration$).switchMap(function(t){var r=t[0],n=t[1];return o.Observable.combineLatest(r.spatialEdges$,n.distinguishSequence?e._navigator.graphService.cacheSequence$(r.sequenceKey).catch(function(e,t){return console.error("Failed to cache sequence ("+r.sequenceKey+")",e),o.Observable.of(null)}):o.Observable.of(null))}).subscribe(function(t){var r=t[0],n=t[1];e._renderer.setEdges(r,n)}),this._renderCameraSubscription=this._container.renderService.renderCameraFrame$.do(function(t){e._renderer.setRenderCamera(t)}).map(function(t){return e._renderer}).filter(function(e){return e.needsRender}).map(function(t){return{name:e._name,vnode:t.render(e._navigator)}}).subscribe(this._container.domRenderer.render$),this._hoveredKeySubscription=o.Observable.combineLatest([this._container.domRenderer.element$,this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$.startWith(null),this._container.mouseService.mouseUp$.startWith(null)],function(e,t,r,n){return e}).map(function(e){for(var t=e.getElementsByClassName("DirectionsPerspective"),r=0;r<t.length;r++){var n=t.item(r).querySelector(":hover");if(null!=n&&n.hasAttribute("data-key"))return n.getAttribute("data-key")}return null}).distinctUntilChanged().subscribe(this._hoveredKeySubject$)},t.prototype._deactivate=function(){this._configurationSubscription.unsubscribe(),this._nodeSubscription.unsubscribe(),this._renderCameraSubscription.unsubscribe(),this._hoveredKeySubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{distinguishSequence:!1,maxWidth:460,minWidth:260}},t.componentName="direction",t}(s.Component);r.DirectionComponent=c,s.ComponentService.register(c),r.default=c},{"../../Component":281,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":76,"virtual-dom":237}],309:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Geo"),i=function(){function e(e,t){this._spatial=new n.Spatial,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._configure(e),this._resize(t),this._reset()}return Object.defineProperty(e.prototype,"minWidth",{get:function(){return this._minWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"maxWidth",{get:function(){return this._maxWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerWidth",{get:function(){return this._containerWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerWidthCss",{get:function(){return this._containerWidthCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerMarginCss",{get:function(){return this._containerMarginCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerLeftCss",{get:function(){return this._containerLeftCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerHeight",{get:function(){return this._containerHeight},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerHeightCss",{get:function(){return this._containerHeightCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containerBottomCss",{get:function(){return this._containerBottomCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleSize",{get:function(){return this._stepCircleSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleSizeCss",{get:function(){return this._stepCircleSizeCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stepCircleMarginCss",{get:function(){return this._stepCircleMarginCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"turnCircleSize",{get:function(){return this._turnCircleSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"turnCircleSizeCss",{get:function(){return this._turnCircleSizeCss},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outerRadius",{get:function(){return this._outerRadius},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"innerRadius",{get:function(){return this._innerRadius},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shadowOffset",{get:function(){return this._shadowOffset},enumerable:!0,configurable:!0}),e.prototype.configure=function(e){this._configure(e),this._reset()},e.prototype.resize=function(e){this._resize(e),this._reset()},e.prototype.angleToCoordinates=function(e){return[Math.cos(e),Math.sin(e)]},e.prototype.relativeAngleToCoordiantes=function(e,t){var r=this._spatial.wrapAngle(e-t);return this.angleToCoordinates(r)},e.prototype._configure=function(e){this._minWidth=e.minWidth,this._maxWidth=this._getMaxWidth(e.minWidth,e.maxWidth)},e.prototype._resize=function(e){this._elementWidth=e.offsetWidth,this._elementHeight=e.offsetHeight},e.prototype._reset=function(){this._containerWidth=this._getContainerWidth(this._elementWidth,this._elementHeight),this._containerHeight=this._getContainerHeight(this.containerWidth),this._stepCircleSize=this._getStepCircleDiameter(this._containerHeight),this._turnCircleSize=this._getTurnCircleDiameter(this.containerHeight),this._outerRadius=this._getOuterRadius(this._containerHeight),this._innerRadius=this._getInnerRadius(this._containerHeight),this._shadowOffset=3,this._containerWidthCss=this._numberToCssPixels(this._containerWidth),this._containerMarginCss=this._numberToCssPixels(-.5*this._containerWidth),this._containerLeftCss=this._numberToCssPixels(Math.floor(.5*this._elementWidth)),this._containerHeightCss=this._numberToCssPixels(this._containerHeight),this._containerBottomCss=this._numberToCssPixels(Math.floor(-.08*this._containerHeight)),this._stepCircleSizeCss=this._numberToCssPixels(this._stepCircleSize),this._stepCircleMarginCss=this._numberToCssPixels(-.5*this._stepCircleSize),this._turnCircleSizeCss=this._numberToCssPixels(this._turnCircleSize)},e.prototype._getContainerWidth=function(e,t){var r=(e-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),n=(t-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight),i=Math.max(0,Math.min(1,Math.min(r,n)));return i=.04*Math.round(25*i),this._minWidth+i*(this._maxWidth-this._minWidth)},e.prototype._getContainerHeight=function(e){return.77*e},e.prototype._getStepCircleDiameter=function(e){return.34*e},e.prototype._getTurnCircleDiameter=function(e){return.3*e},e.prototype._getOuterRadius=function(e){return.31*e},e.prototype._getInnerRadius=function(e){return.125*e},e.prototype._numberToCssPixels=function(e){return e+"px"},e.prototype._getMaxWidth=function(e,t){return e>t?e:t},e}();r.DirectionDOMCalculator=i,r.default=i},{"../../Geo":284}],310:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=e("../../Component"),o=e("../../Edge"),a=e("../../Geo"),s=function(){function e(e,t){this._isEdge=!1,this._spatial=new a.Spatial,this._calculator=new i.DirectionDOMCalculator(e,t),this._node=null,this._rotation={phi:0,theta:0},this._epsilon=.5*Math.PI/180,this._highlightKey=null,this._distinguishSequence=!1,this._needsRender=!1,this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[],this._stepDirections=[o.EdgeDirection.StepForward,o.EdgeDirection.StepBackward,o.EdgeDirection.StepLeft,o.EdgeDirection.StepRight],this._turnDirections=[o.EdgeDirection.TurnLeft,o.EdgeDirection.TurnRight,o.EdgeDirection.TurnU],this._turnNames={},this._turnNames[o.EdgeDirection.TurnLeft]="TurnLeft",this._turnNames[o.EdgeDirection.TurnRight]="TurnRight",this._turnNames[o.EdgeDirection.TurnU]="TurnAround";var r=!!document.documentMode;this._isEdge=!r&&!!window.StyleMedia}return Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.render=function(e){this._needsRender=!1;var t=this._rotation,r=[],n=[];return this._node.pano?r=r.concat(this._createPanoArrows(e,t)):(r=(r=r.concat(this._createPerspectiveToPanoArrows(e,t))).concat(this._createStepArrows(e,t)),n=n.concat(this._createTurnArrows(e))),this._getContainer(r,n,t)},e.prototype.setEdges=function(e,t){this._setEdges(e,t),this._setNeedsRender()},e.prototype.setNode=function(e){this._node=e,this._clearEdges(),this._setNeedsRender()},e.prototype.setRenderCamera=function(e){var t=e.rotation;Math.abs(t.phi-this._rotation.phi)<this._epsilon||(this._rotation=t,this._setNeedsRender())},e.prototype.setConfiguration=function(e){var t=!1;this._highlightKey===e.highlightKey&&this._distinguishSequence===e.distinguishSequence||(this._highlightKey=e.highlightKey,this._distinguishSequence=e.distinguishSequence,t=!0),this._calculator.minWidth===e.minWidth&&this._calculator.maxWidth===e.maxWidth||(this._calculator.configure(e),t=!0),t&&this._setNeedsRender()},e.prototype.resize=function(e){this._calculator.resize(e),this._setNeedsRender()},e.prototype._setNeedsRender=function(){null!=this._node&&(this._needsRender=!0)},e.prototype._clearEdges=function(){this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[]},e.prototype._setEdges=function(e,t){this._stepEdges=[],this._turnEdges=[],this._panoEdges=[],this._sequenceEdgeKeys=[];for(var r=0,n=e.edges;r<n.length;r++){var i=(c=n[r]).data.direction;this._stepDirections.indexOf(i)>-1?this._stepEdges.push(c):this._turnDirections.indexOf(i)>-1?this._turnEdges.push(c):c.data.direction===o.EdgeDirection.Pano&&this._panoEdges.push(c)}if(this._distinguishSequence&&null!=t)for(var a=0,s=this._panoEdges.concat(this._stepEdges).concat(this._turnEdges);a<s.length;a++)for(var c=s[a],u=c.to,h=0,l=t.keys;h<l.length;h++){if(l[h]===u){this._sequenceEdgeKeys.push(u);break}}},e.prototype._createPanoArrows=function(e,t){for(var r=[],n=0,i=this._panoEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByKey(e,o.to,o.data.worldMotionAzimuth,t,this._calculator.outerRadius,"DirectionsArrowPano"))}for(var a=0,s=this._stepEdges;a<s.length;a++){var c=s[a];r.push(this._createPanoToPerspectiveArrow(e,c.to,c.data.worldMotionAzimuth,t,c.data.direction))}return r},e.prototype._createPanoToPerspectiveArrow=function(e,t,r,n,i){var a=Math.PI/8,s=n.phi;switch(i){case o.EdgeDirection.StepBackward:s=n.phi-Math.PI;break;case o.EdgeDirection.StepLeft:s=n.phi+Math.PI/2;break;case o.EdgeDirection.StepRight:s=n.phi-Math.PI/2}return Math.abs(this._spatial.wrapAngle(r-s))<a?this._createVNodeByKey(e,t,r,n,this._calculator.outerRadius,"DirectionsArrowStep"):this._createVNodeDisabled(t,r,n)},e.prototype._createPerspectiveToPanoArrows=function(e,t){for(var r=[],n=0,i=this._panoEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByKey(e,o.to,o.data.worldMotionAzimuth,t,this._calculator.innerRadius,"DirectionsArrowPano",!0))}return r},e.prototype._createStepArrows=function(e,t){for(var r=[],n=0,i=this._stepEdges;n<i.length;n++){var o=i[n];r.push(this._createVNodeByDirection(e,o.to,o.data.worldMotionAzimuth,t,o.data.direction))}return r},e.prototype._createTurnArrows=function(e){for(var t=[],r=0,n=this._turnEdges;r<n.length;r++){var i=n[r],o=i.data.direction,a=this._turnNames[o];t.push(this._createVNodeByTurn(e,i.to,a,o))}return t},e.prototype._createVNodeByKey=function(e,t,r,n,i,o,a){return this._createVNode(t,r,n,i,o,"DirectionsCircle",function(r){e.moveToKey$(t).subscribe(function(e){},function(e){console.error(e)})},a)},e.prototype._createVNodeByDirection=function(e,t,r,n,i){return this._createVNode(t,r,n,this._calculator.outerRadius,"DirectionsArrowStep","DirectionsCircle",function(t){e.moveDir$(i).subscribe(function(e){},function(e){console.error(e)})})},e.prototype._createVNodeByTurn=function(e,t,r,i){var a={height:this._calculator.turnCircleSizeCss,transform:"rotate(0)",width:this._calculator.turnCircleSizeCss};switch(i){case o.EdgeDirection.TurnLeft:a.left="5px",a.top="5px";break;case o.EdgeDirection.TurnRight:a.right="5px",a.top="5px";break;case o.EdgeDirection.TurnU:a.left="5px",a.bottom="5px"}var s={attributes:{"data-key":t},onclick:function(t){e.moveDir$(i).subscribe(function(e){},function(e){console.error(e)})},style:a},c="TurnCircle";this._sequenceEdgeKeys.indexOf(t)>-1&&(c+="Sequence"),this._highlightKey===t&&(c+="Highlight");var u=n.h("div."+r,{},[]);return n.h("div."+c,s,[u])},e.prototype._createVNodeDisabled=function(e,t,r){return this._createVNode(e,t,r,this._calculator.outerRadius,"DirectionsArrowDisabled","DirectionsCircleDisabled")},e.prototype._createVNode=function(e,t,r,i,o,a,s,c){var u=this._calculator.angleToCoordinates(t-r.phi),h=Math.round(-i*u[1]+.5*this._calculator.containerWidth),l=Math.round(-i*u[0]+.5*this._calculator.containerHeight),p=this._calculator.relativeAngleToCoordiantes(t,r.phi),f=this._calculator.shadowOffset,d="drop-shadow("+-f*p[1]+"px "+f*p[0]+"px 1px rgba(0,0,0,0.8))",m={style:{"-webkit-filter":d,filter:d}},v=n.h("div."+o,m,[]),g=-this._spatial.radToDeg(t-r.phi),y=c?"translate("+h+"px, "+l+"px) rotate("+g+"deg) translateZ(-0.01px)":"translate("+h+"px, "+l+"px) rotate("+g+"deg)",b={attributes:{"data-key":e},onclick:s,style:{height:this._calculator.stepCircleSizeCss,marginLeft:this._calculator.stepCircleMarginCss,marginTop:this._calculator.stepCircleMarginCss,transform:y,width:this._calculator.stepCircleSizeCss}};return this._sequenceEdgeKeys.indexOf(e)>-1&&(a+="Sequence"),this._highlightKey===e&&(a+="Highlight"),n.h("div."+a,b,[v])},e.prototype._getContainer=function(e,t,r){var i=this._isEdge?"rotateX(60deg)":"perspective("+this._calculator.containerWidthCss+") rotateX(60deg)",o={oncontextmenu:function(e){e.preventDefault()},style:{bottom:this._calculator.containerBottomCss,height:this._calculator.containerHeightCss,left:this._calculator.containerLeftCss,marginLeft:this._calculator.containerMarginCss,transform:i,width:this._calculator.containerWidthCss}};return n.h("div.DirectionsPerspective",o,t.concat(e))},e}();r.DirectionDOMRenderer=s,r.default=s},{"../../Component":281,"../../Edge":282,"../../Geo":284,"virtual-dom":237}],311:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/operator/catch"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pairwise"),e("rxjs/add/operator/publish"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/skipWhile"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Render"),c=e("../../Tiles"),u=e("../../Utils"),h=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._imageTileLoader=new c.ImageTileLoader(u.Urls.tileScheme,u.Urls.tileDomain,u.Urls.origin),i._roiCalculator=new c.RegionOfInterestCalculator,i._rendererOperation$=new o.Subject,i._rendererCreator$=new o.Subject,i._rendererDisposer$=new o.Subject,i._renderer$=i._rendererOperation$.scan(function(e,t){return t(e)},null).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.frameId}),i._rendererCreator$.map(function(){return function(e){if(null!=e)throw new Error("Multiple image plane states can not be created at the same time");return new a.ImagePlaneGLRenderer}}).subscribe(i._rendererOperation$),i._rendererDisposer$.map(function(){return function(e){return e.dispose(),null}}).subscribe(i._rendererOperation$),i}return n(t,e),t.prototype._activate=function(){var e=this;this._rendererSubscription=this._renderer$.map(function(t){var r={name:e._name,render:{frameId:t.frameId,needsRender:t.needsRender,render:t.render.bind(t),stage:s.GLRenderStage.Background}};return t.clearNeedsRender(),r}).subscribe(this._container.glRenderer.render$),this._rendererCreator$.next(null),this._stateSubscription=this._navigator.stateService.currentState$.map(function(e){return function(t){return t.updateFrame(e),t}}).subscribe(this._rendererOperation$);var t=this._navigator.stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).combineLatest(this._configuration$).filter(function(e){return!0===e[1].imageTiling}).map(function(e){return e[0]}).withLatestFrom(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$).map(function(t){var r=t[0],n=t[1],i=t[2],o=r.state,a=Math.max(i.width,i.height),s=o.currentNode,u=o.currentTransform,h=a>2048?2048:a>1024?1024:512;return new c.TextureProvider(s.key,u.basicWidth,u.basicHeight,h,s.image,e._imageTileLoader,new c.ImageTileStore,n)}).publishReplay(1).refCount();this._textureProviderSubscription=t.subscribe(function(){}),this._setTextureProviderSubscription=t.map(function(e){return function(t){return t.setTextureProvider(e.key,e),t}}).subscribe(this._rendererOperation$),this._setTileSizeSubscription=this._container.renderService.size$.switchMap(function(e){return i.Observable.combineLatest(t,i.Observable.of(e)).first()}).subscribe(function(e){var t=e[0],r=e[1],n=Math.max(r.width,r.height),i=n>2048?2048:n>1024?1024:512;t.setTileSize(i)}),this._abortTextureProviderSubscription=t.pairwise().subscribe(function(e){e[0].abort()});var r=i.Observable.combineLatest(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.debounceTime(250)).map(function(e){var t=e[0],r=e[1];return[t.camera.position.clone(),t.camera.lookat.clone(),t.zoom.valueOf(),r.height.valueOf(),r.width.valueOf()]}).pairwise().skipWhile(function(e){return e[1][2]-e[0][2]<0||0===e[1][2]}).map(function(e){var t=e[0][0].equals(e[1][0]),r=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],i=e[0][3]===e[1][3],o=e[0][4]===e[1][4];return t&&r&&n&&i&&o}).distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._container.renderService.renderCameraFrame$.first()}).withLatestFrom(this._container.renderService.size$,this._navigator.stateService.currentTransform$);this._setRegionOfInterestSubscription=t.switchMap(function(t){return r.map(function(r){var n=r[0],i=r[1],o=r[2];return[e._roiCalculator.computeRegionOfInterest(n,i,o),t]})}).filter(function(e){return!e[1].disposed}).subscribe(function(e){var t=e[0];e[1].setRegionOfInterest(t)});var n=t.switchMap(function(e){return e.hasTexture$}).startWith(!1).publishReplay(1).refCount();this._hasTextureSubscription=n.subscribe(function(){});var o=this._navigator.stateService.currentState$.filter(function(e){return 0===e.state.nodesAhead}).map(function(e){return e.state.currentNode}).distinctUntilChanged(void 0,function(e){return e.key}).debounceTime(1e3).withLatestFrom(n).filter(function(e){return!e[1]}).map(function(e){return e[0]}).filter(function(e){return e.pano?u.Settings.maxImageSize>u.Settings.basePanoramaSize:u.Settings.maxImageSize>u.Settings.baseImageSize}).switchMap(function(e){var t=e.pano?u.Settings.basePanoramaSize:u.Settings.baseImageSize;if(Math.max(e.image.width,e.image.height)>t)return i.Observable.empty();return e.cacheImage$(u.Settings.maxImageSize).map(function(e){return[e.image,e]}).takeUntil(n.filter(function(e){return e})).catch(function(t,r){return console.error("Failed to fetch high res image ("+e.key+")",t),i.Observable.empty()})}).publish().refCount();this._updateBackgroundSubscription=o.withLatestFrom(t).subscribe(function(e){e[0][1].key!==e[1].key||e[1].disposed||e[1].updateBackground(e[0][0])}),this._updateTextureImageSubscription=o.map(function(e){return function(t){return t.updateTextureImage(e[0],e[1]),t}}).subscribe(this._rendererOperation$)},t.prototype._deactivate=function(){this._rendererDisposer$.next(null),this._abortTextureProviderSubscription.unsubscribe(),this._hasTextureSubscription.unsubscribe(),this._rendererSubscription.unsubscribe(),this._setRegionOfInterestSubscription.unsubscribe(),this._setTextureProviderSubscription.unsubscribe(),this._setTileSizeSubscription.unsubscribe(),this._stateSubscription.unsubscribe(),this._textureProviderSubscription.unsubscribe(),this._updateBackgroundSubscription.unsubscribe(),this._updateTextureImageSubscription.unsubscribe()},t.prototype._getDefaultConfiguration=function(){return{imageTiling:!1}},t.componentName="imagePlane",t}(a.Component);r.ImagePlaneComponent=h,a.ComponentService.register(h),r.default=h},{"../../Component":281,"../../Render":287,"../../Tiles":290,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/skipWhile":79,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87}],312:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../../Component"),o=function(){function e(e,t){this._imagePlaneDepth=null!=e?e:200,this._imageSphereRadius=null!=t?t:200}return e.prototype.createMesh=function(e,t){return e.pano?this._createImageSphere(e,t):this._createImagePlane(e,t)},e.prototype._createImageSphere=function(e,t){var r=this._createTexture(e.image),i=this._createSphereMaterialParameters(t,r),o=new n.ShaderMaterial(i);return this._useMesh(t,e)?new n.Mesh(this._getImageSphereGeo(t,e),o):new n.Mesh(this._getFlatImageSphereGeo(t),o)},e.prototype._createImagePlane=function(e,t){var r=this._createTexture(e.image),i=this._createPlaneMaterialParameters(t,r),o=new n.ShaderMaterial(i),a=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getFlatImagePlaneGeo(t);return new n.Mesh(a,o)},e.prototype._createSphereMaterialParameters=function(e,t){var r=e.gpano,o=(r.FullPanoWidthPixels-r.CroppedAreaImageWidthPixels)/2,a=2*Math.PI*(r.CroppedAreaLeftPixels-o)/r.FullPanoWidthPixels,s=2*Math.PI*r.CroppedAreaImageWidthPixels/r.FullPanoWidthPixels,c=(r.FullPanoHeightPixels-r.CroppedAreaImageHeightPixels)/2,u=Math.PI*(c-r.CroppedAreaTopPixels)/r.FullPanoHeightPixels,h=Math.PI*r.CroppedAreaImageHeightPixels/r.FullPanoHeightPixels;return{depthWrite:!1,fragmentShader:i.ImagePlaneShaders.equirectangular.fragment,side:n.DoubleSide,transparent:!0,uniforms:{opacity:{type:"f",value:1},phiLength:{type:"f",value:s},phiShift:{type:"f",value:a},projectorMat:{type:"m4",value:e.rt},projectorTex:{type:"t",value:t},thetaLength:{type:"f",value:h},thetaShift:{type:"f",value:u}},vertexShader:i.ImagePlaneShaders.equirectangular.vertex}},e.prototype._createPlaneMaterialParameters=function(e,t){return{depthWrite:!1,fragmentShader:i.ImagePlaneShaders.perspective.fragment,side:n.DoubleSide,transparent:!0,uniforms:{bbox:{type:"v4",value:new n.Vector4(0,0,1,1)},opacity:{type:"f",value:1},projectorMat:{type:"m4",value:e.projectorMatrix()},projectorTex:{type:"t",value:t}},vertexShader:i.ImagePlaneShaders.perspective.vertex}},e.prototype._createTexture=function(e){var t=new n.Texture(e);return t.minFilter=n.LinearFilter,t.needsUpdate=!0,t},e.prototype._useMesh=function(e,t){return t.mesh.vertices.length&&e.hasValidScale},e.prototype._getImageSphereGeo=function(e,t){for(var r=(new n.Matrix4).getInverse(e.srt),i=5*e.scale,o=this._imageSphereRadius*e.scale,a=t.mesh.vertices,s=a.length/3,c=new Float32Array(a.length),u=0;u<s;++u){var h=3*u,l=a[h+0],p=a[h+1],f=a[h+2],d=Math.sqrt(l*l+p*p+f*f),m=Math.max(i,Math.min(d,o))/d,v=new n.Vector3(l*m,p*m,f*m);v.applyMatrix4(r),c[h+0]=v.x,c[h+1]=v.y,c[h+2]=v.z}for(var g=t.mesh.faces,y=new Uint16Array(g.length),u=0;u<g.length;++u)y[u]=g[u];var b=new n.BufferGeometry;return b.addAttribute("position",new n.BufferAttribute(c,3)),b.setIndex(new n.BufferAttribute(y,1)),b},e.prototype._getImagePlaneGeo=function(e,t){for(var r=(new n.Matrix4).getInverse(e.srt),i=5*e.scale,o=this._imagePlaneDepth*e.scale,a=t.mesh.vertices,s=a.length/3,c=new Float32Array(a.length),u=0;u<s;++u){var h=3*u,l=a[h+0],p=a[h+1],f=a[h+2],d=Math.max(i,Math.min(f,o)),m=d/f,v=new n.Vector3(l*m,p*m,d);v.applyMatrix4(r),c[h+0]=v.x,c[h+1]=v.y,c[h+2]=v.z}for(var g=t.mesh.faces,y=new Uint16Array(g.length),u=0;u<g.length;++u)y[u]=g[u];var b=new n.BufferGeometry;return b.addAttribute("position",new n.BufferAttribute(c,3)),b.setIndex(new n.BufferAttribute(y,1)),b},e.prototype._getFlatImageSphereGeo=function(e){var t=e.gpano,r=2*Math.PI*t.CroppedAreaLeftPixels/t.FullPanoWidthPixels,i=2*Math.PI*t.CroppedAreaImageWidthPixels/t.FullPanoWidthPixels,o=Math.PI*(t.FullPanoHeightPixels-t.CroppedAreaImageHeightPixels-t.CroppedAreaTopPixels)/t.FullPanoHeightPixels,a=Math.PI*t.CroppedAreaImageHeightPixels/t.FullPanoHeightPixels,s=new n.SphereGeometry(this._imageSphereRadius,20,40,r-Math.PI/2,i,o,a);return s.applyMatrix((new n.Matrix4).getInverse(e.rt)),s},e.prototype._getFlatImagePlaneGeo=function(e){var t=e.width,r=e.height,i=Math.max(t,r),o=t/2/i,a=r/2/i,s=[];s.push(e.unprojectSfM([-o,-a],this._imagePlaneDepth)),s.push(e.unprojectSfM([o,-a],this._imagePlaneDepth)),s.push(e.unprojectSfM([o,a],this._imagePlaneDepth)),s.push(e.unprojectSfM([-o,a],this._imagePlaneDepth));for(var c=new Float32Array(12),u=0;u<s.length;u++){var h=3*u;c[h+0]=s[u][0],c[h+1]=s[u][1],c[h+2]=s[u][2]}var l=new Uint16Array(6);l[0]=0,l[1]=1,l[2]=3,l[3]=1,l[4]=2,l[5]=3;var p=new n.BufferGeometry;return p.addAttribute("position",new n.BufferAttribute(c,3)),p.setIndex(new n.BufferAttribute(l,1)),p},e}();r.ImagePlaneFactory=o,r.default=o},{"../../Component":281,three:231}],313:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Component"),i=function(){function e(){this._imagePlaneFactory=new n.ImagePlaneFactory,this._imagePlaneScene=new n.ImagePlaneScene,this._alpha=0,this._alphaOld=0,this._fadeOutSpeed=.05,this._currentKey=null,this._previousKey=null,this._providerDisposers={},this._frameId=0,this._needsRender=!1}return Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.indicateNeedsRender=function(){this._needsRender=!0},e.prototype.updateFrame=function(e){this._updateFrameId(e.id),this._needsRender=this._updateAlpha(e.state.alpha)||this._needsRender,this._needsRender=this._updateAlphaOld(e.state.alpha)||this._needsRender,this._needsRender=this._updateImagePlanes(e.state)||this._needsRender},e.prototype.setTextureProvider=function(e,t){var r=this;if(e===this._currentKey){var n=t.textureCreated$.subscribe(function(e){r._updateTexture(e)}),i=t.textureUpdated$.subscribe(function(e){r._needsRender=!0});if(e in this._providerDisposers){(0,this._providerDisposers[e])(),delete this._providerDisposers[e]}this._providerDisposers[e]=function(){n.unsubscribe(),i.unsubscribe(),t.dispose()}}},e.prototype._updateTexture=function(e){this._needsRender=!0;for(var t=0,r=this._imagePlaneScene.imagePlanes;t<r.length;t++){var n=r[t].material,i=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,i.dispose(),n.uniforms.projectorTex.value=e}},e.prototype.updateTextureImage=function(e,t){if(this._currentKey===t.key){this._needsRender=!0;for(var r=0,n=this._imagePlaneScene.imagePlanes;r<n.length;r++){var i=n[r].material.uniforms.projectorTex.value;i.image=e,i.needsUpdate=!0}}},e.prototype.render=function(e,t){for(var r=this._imagePlaneScene.imagePlanesOld.length?1:this._alpha,n=0,i=this._imagePlaneScene.imagePlanes;n<i.length;n++){(u=i[n]).material.uniforms.opacity.value=r}for(var o=0,a=this._imagePlaneScene.imagePlanesOld;o<a.length;o++){(u=a[o]).material.uniforms.opacity.value=this._alphaOld}t.render(this._imagePlaneScene.scene,e),t.render(this._imagePlaneScene.sceneOld,e);for(var s=0,c=this._imagePlaneScene.imagePlanes;s<c.length;s++){var u=c[s];u.material.uniforms.opacity.value=this._alpha}t.render(this._imagePlaneScene.scene,e)},e.prototype.clearNeedsRender=function(){this._needsRender=!1},e.prototype.dispose=function(){this._imagePlaneScene.clear()},e.prototype._updateFrameId=function(e){this._frameId=e},e.prototype._updateAlpha=function(e){return e!==this._alpha&&(this._alpha=e,!0)},e.prototype._updateAlphaOld=function(e){return!(e<1||0===this._alphaOld)&&(this._alphaOld=Math.max(0,this._alphaOld-this._fadeOutSpeed),!0)},e.prototype._updateImagePlanes=function(e){if(null==e.currentNode||e.currentNode.key===this._currentKey)return!1;var t=null!=e.previousNode?e.previousNode.key:null,r=e.currentNode.key;if(this._previousKey!==t&&this._previousKey!==r&&this._previousKey in this._providerDisposers){(0,this._providerDisposers[this._previousKey])(),delete this._providerDisposers[this._previousKey]}if(null!=t){if(t!==this._currentKey&&t!==this._previousKey){var n=this._imagePlaneFactory.createMesh(e.previousNode,e.previousTransform);this._imagePlaneScene.updateImagePlanes([n])}this._previousKey=t}this._currentKey=r;var i=this._imagePlaneFactory.createMesh(e.currentNode,e.currentTransform);return this._imagePlaneScene.updateImagePlanes([i]),this._alphaOld=1,!0},e}();r.ImagePlaneGLRenderer=i,r.default=i},{"../../Component":281}],314:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this.scene=new n.Scene,this.sceneOld=new n.Scene,this.imagePlanes=[],this.imagePlanesOld=[]}return e.prototype.updateImagePlanes=function(e){this._dispose(this.imagePlanesOld,this.sceneOld);for(var t=0,r=this.imagePlanes;t<r.length;t++){o=r[t];this.scene.remove(o),this.sceneOld.add(o)}for(var n=0,i=e;n<i.length;n++){var o=i[n];this.scene.add(o)}this.imagePlanesOld=this.imagePlanes,this.imagePlanes=e},e.prototype.addImagePlanes=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.scene.add(n),this.imagePlanes.push(n)}},e.prototype.addImagePlanesOld=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.sceneOld.add(n),this.imagePlanesOld.push(n)}},e.prototype.setImagePlanes=function(e){this._clear(),this.addImagePlanes(e)},e.prototype.setImagePlanesOld=function(e){this._clearOld(),this.addImagePlanesOld(e)},e.prototype.clear=function(){this._clear(),this._clearOld()},e.prototype._clear=function(){this._dispose(this.imagePlanes,this.scene),this.imagePlanes.length=0},e.prototype._clearOld=function(){this._dispose(this.imagePlanesOld,this.sceneOld),this.imagePlanesOld.length=0},e.prototype._dispose=function(e,t){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.remove(i),i.geometry.dispose(),i.material.dispose();var o=i.material.uniforms.projectorTex.value;null!=o&&o.dispose()}},e}();r.ImagePlaneScene=i,r.default=i},{three:231}],315:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});e("path");var n=function(){function e(){}return e.equirectangular={fragment:"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",vertex:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}"},e.perspective={fragment:"#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",vertex:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}"},e}();r.ImagePlaneShaders=n},{path:22}],316:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/fromEvent"),e("rxjs/add/observable/of"),e("rxjs/add/observable/zip"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom"),e("rxjs/add/operator/zip");var a=e("../../State"),s=e("../../Render"),c=e("../../Utils"),u=e("../../Component"),h=function(){function e(){this._imagePlaneFactory=new u.ImagePlaneFactory,this._imagePlaneScene=new u.ImagePlaneScene,this._currentKey=null,this._previousKey=null,this._currentPano=!1,this._frameId=0,this._glNeedsRender=!1,this._domNeedsRender=!0,this._curtain=1}return Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"curtain",{get:function(){return this._curtain},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glNeedsRender",{get:function(){return this._glNeedsRender},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domNeedsRender",{get:function(){return this._domNeedsRender},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sliderVisible",{get:function(){return this._sliderVisible},set:function(e){this._sliderVisible=e,this._domNeedsRender=!0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disabled",{get:function(){return null==this._currentKey||null==this._previousKey||this._currentPano},enumerable:!0,configurable:!0}),e.prototype.update=function(e){this._updateFrameId(e.id);var t=this._updateImagePlanes(e.state);this._domNeedsRender=t||this._domNeedsRender,t=this._updateCurtain(e.state.alpha)||t,this._glNeedsRender=t||this._glNeedsRender},e.prototype.updateTexture=function(e,t){var r=t.key===this._currentKey?this._imagePlaneScene.imagePlanes:t.key===this._previousKey?this._imagePlaneScene.imagePlanesOld:[];if(0!==r.length){this._glNeedsRender=!0;for(var n=0,i=r;n<i.length;n++){var o=i[n].material.uniforms.projectorTex.value;o.image=e,o.needsUpdate=!0}}},e.prototype.render=function(e,t){this.disabled||t.render(this._imagePlaneScene.sceneOld,e),t.render(this._imagePlaneScene.scene,e)},e.prototype.dispose=function(){this._imagePlaneScene.clear()},e.prototype.clearGLNeedsRender=function(){this._glNeedsRender=!1},e.prototype.clearDomNeedsRender=function(){this._domNeedsRender=!1},e.prototype._updateFrameId=function(e){this._frameId=e},e.prototype._updateImagePlanes=function(e){if(null!=e.currentNode){var t=!1;return null!=e.previousNode&&this._previousKey!==e.previousNode.key&&(t=!0,this._previousKey=e.previousNode.key,this._imagePlaneScene.setImagePlanesOld([this._imagePlaneFactory.createMesh(e.previousNode,e.previousTransform)])),this._currentKey!==e.currentNode.key&&(t=!0,this._currentKey=e.currentNode.key,this._currentPano=e.currentNode.pano,this._imagePlaneScene.setImagePlanes([this._imagePlaneFactory.createMesh(e.currentNode,e.currentTransform)]),this.disabled||this._updateBbox()),t}},e.prototype._updateCurtain=function(e){return!(this.disabled||Math.abs(this._curtain-e)<.001)&&(this._curtain=e,this._updateBbox(),!0)},e.prototype._updateBbox=function(){for(var e=0,t=this._imagePlaneScene.imagePlanes;e<t.length;e++){t[e].material.uniforms.bbox.value.z=this._curtain}},e}(),l=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a._dom=i||new c.DOM,a._sliderStateOperation$=new o.Subject,a._sliderStateCreator$=new o.Subject,a._sliderStateDisposer$=new o.Subject,a._sliderState$=a._sliderStateOperation$.scan(function(e,t){return t(e)},null).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.frameId}),a._sliderStateCreator$.map(function(){return function(e){if(null!=e)throw new Error("Multiple slider states can not be created at the same time");return new h}}).subscribe(a._sliderStateOperation$),a._sliderStateDisposer$.map(function(){return function(e){return e.dispose(),null}}).subscribe(a._sliderStateOperation$),a}return n(t,e),t.prototype.setKeys=function(e){this.configure({keys:e})},t.prototype.setInitialPosition=function(e){this.configure({initialPosition:e})},t.prototype.setSliderVisible=function(e){this.configure({sliderVisible:e})},t.prototype._activate=function(){var e=this;this._sliderContainer=this._dom.createElement("div","mapillary-js-slider-container",this._container.element),this._sliderWrapper=this._dom.createElement("div","SliderWrapper",this._sliderContainer),this._sliderControl=this._dom.createElement("input","SliderControl",this._sliderWrapper),this._sliderControl.setAttribute("type","range"),this._sliderControl.setAttribute("min","0"),this._sliderControl.setAttribute("max","1000"),this._sliderControl.style.visibility="hidden",this._moveToHandler=function(t){var r=Number(t.target.value)/1e3;e._navigator.stateService.moveTo(r)},this._sliderControl.addEventListener("input",this._moveToHandler),this._sliderControl.addEventListener("change",this._moveToHandler),i.Observable.combineLatest(this._navigator.stateService.state$,this._configuration$).first().subscribe(function(t){var r=t[0],n=t[1];if(r===a.State.Traversing){e._navigator.stateService.wait();var i=null!=n.initialPosition?n.initialPosition:1;e._sliderControl.value=(1e3*i).toString(),e._navigator.stateService.moveTo(i)}}),this._glRenderSubscription=this._sliderState$.map(function(t){var r={name:e._name,render:{frameId:t.frameId,needsRender:t.glNeedsRender,render:t.render.bind(t),stage:s.GLRenderStage.Background}};return t.clearGLNeedsRender(),r}).subscribe(this._container.glRenderer.render$),this._domRenderSubscription=this._sliderState$.filter(function(e){return e.domNeedsRender}).subscribe(function(t){e._sliderControl.value=(1e3*t.curtain).toString();var r=t.disabled||!t.sliderVisible?"hidden":"visible";e._sliderControl.style.visibility=r,t.clearDomNeedsRender()}),this._sliderStateCreator$.next(null),this._stateSubscription=this._navigator.stateService.currentState$.map(function(e){return function(t){return t.update(e),t}}).subscribe(this._sliderStateOperation$),this._setSliderVisibleSubscription=this._configuration$.map(function(e){return null==e.sliderVisible||e.sliderVisible}).distinctUntilChanged().map(function(e){return function(t){return t.sliderVisible=e,t}}).subscribe(this._sliderStateOperation$),this._setKeysSubscription=this._configuration$.filter(function(e){return null!=e.keys}).switchMap(function(t){return i.Observable.zip(e._catchCacheNode$(t.keys.background),e._catchCacheNode$(t.keys.foreground)).map(function(e){return{background:e[0],foreground:e[1]}}).zip(e._navigator.stateService.currentState$.first()).map(function(e){return{nodes:e[0],state:e[1].state}})}).subscribe(function(t){null!=t.state.currentNode&&null!=t.state.previousNode&&t.state.currentNode.key===t.nodes.foreground.key&&t.state.previousNode.key===t.nodes.background.key||(t.state.currentNode.key!==t.nodes.background.key?t.state.currentNode.key!==t.nodes.foreground.key||1!==t.state.trajectory.length?(e._navigator.stateService.setNodes([t.nodes.background]),e._navigator.stateService.setNodes([t.nodes.foreground])):e._navigator.stateService.prependNodes([t.nodes.background]):e._navigator.stateService.setNodes([t.nodes.foreground]))},function(e){console.error(e)});var t=this._navigator.stateService.currentState$.map(function(e){return e.state.previousNode}).filter(function(e){return null!=e}).distinctUntilChanged(void 0,function(e){return e.key});this._nodeSubscription=i.Observable.merge(t,this._navigator.stateService.currentNode$).filter(function(e){return e.pano?c.Settings.maxImageSize>c.Settings.basePanoramaSize:c.Settings.maxImageSize>c.Settings.baseImageSize}).mergeMap(function(e){var t=e.pano?c.Settings.basePanoramaSize:c.Settings.baseImageSize;return Math.max(e.image.width,e.image.height)>t?i.Observable.empty():e.cacheImage$(c.Settings.maxImageSize).map(function(e){return[e.image,e]}).catch(function(t,r){return console.error("Failed to fetch high res slider image ("+e.key+")",t),i.Observable.empty()})}).map(function(e){var t=e[0],r=e[1];return function(e){return e.updateTexture(t,r),e}}).subscribe(this._sliderStateOperation$)},t.prototype._deactivate=function(){var e=this;this._navigator.stateService.state$.first().subscribe(function(t){t===a.State.Waiting&&e._navigator.stateService.traverse()}),this._sliderStateDisposer$.next(null),this._setKeysSubscription.unsubscribe(),this._setSliderVisibleSubscription.unsubscribe(),this._stateSubscription.unsubscribe(),this._glRenderSubscription.unsubscribe(),this._domRenderSubscription.unsubscribe(),this._nodeSubscription.unsubscribe(),this.configure({keys:null}),this._sliderControl.removeEventListener("input",this._moveToHandler),this._sliderControl.removeEventListener("change",this._moveToHandler),this._container.element.removeChild(this._sliderContainer),this._moveToHandler=null,this._sliderControl=null,this._sliderWrapper=null,this._sliderContainer=null},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._catchCacheNode$=function(e){return this._navigator.graphService.cacheNode$(e).catch(function(t,r){return console.error("Failed to cache slider node ("+e+")",t),i.Observable.empty()})},t.componentName="slider",t}(u.Component);r.SliderComponent=l,u.ComponentService.register(l),r.default=l},{"../../Component":281,"../../Render":287,"../../State":288,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87,"rxjs/add/operator/zip":88}],317:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Hidden=0]="Hidden",e[e.Loading=1]="Loading",e[e.Visible=2]="Visible"}(r.CoverState||(r.CoverState={}))},{}],318:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./ICoverConfiguration");r.CoverState=n.CoverState},{"./ICoverConfiguration":317}],319:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../Component"),o=e("../../Edge"),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enable=function(){var e=this;this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(this._navigator.playService.playing$,this._navigator.playService.direction$,this._navigator.playService.speed$,this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$})).subscribe(function(t){var r=t[0],n=t[1],i=t[2],a=t[3],s=t[4];if(!(r.altKey||r.ctrlKey||r.metaKey)){switch(r.key){case"D":if(!r.shiftKey)return;var c=n?null:i===o.EdgeDirection.Next?o.EdgeDirection.Prev:i===o.EdgeDirection.Prev?o.EdgeDirection.Next:null;null!=c&&e._navigator.playService.setDirection(c);break;case" ":if(r.shiftKey)return;if(n)e._navigator.playService.stop();else for(var u=0,h=s.edges;u<h.length;u++){h[u].data.direction===i&&e._navigator.playService.play()}break;case"<":e._navigator.playService.setSpeed(a-.05);break;case">":e._navigator.playService.setSpeed(a+.05);break;default:return}r.preventDefault()}})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keyZoom:e}},t}(i.HandlerBase);r.KeyPlayHandler=a,r.default=a},{"../../Component":281,"../../Edge":282}],320:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Edge"),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$});this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(t).subscribe(function(t){var r=t[0],n=t[1],i=null;switch(r.keyCode){case 38:i=o.EdgeDirection.Next;break;case 40:i=o.EdgeDirection.Prev;break;default:return}if(r.preventDefault(),r.altKey&&!r.shiftKey&&n.cached)for(var a=0,s=n.edges;a<s.length;a++){var c=s[a];if(c.data.direction===i)return void e._navigator.moveToKey$(c.to).subscribe(function(e){},function(e){console.error(e)})}})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keySequenceNavigation:e}},t}(i.HandlerBase);r.KeySequenceNavigationHandler=a,r.default=a},{"../../Component":281,"../../Edge":282,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],321:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Edge"),a=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._spatial=i,o}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentNode$.switchMap(function(e){return e.spatialEdges$});this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(t,this._navigator.stateService.currentState$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],a=i.state.currentNode.pano,s=null;switch(r.keyCode){case 37:s=r.shiftKey&&!a?o.EdgeDirection.TurnLeft:o.EdgeDirection.StepLeft;break;case 38:s=r.shiftKey&&!a?o.EdgeDirection.Pano:o.EdgeDirection.StepForward;break;case 39:s=r.shiftKey&&!a?o.EdgeDirection.TurnRight:o.EdgeDirection.StepRight;break;case 40:s=r.shiftKey&&!a?o.EdgeDirection.TurnU:o.EdgeDirection.StepBackward;break;default:return}if(r.preventDefault(),!(r.altKey||!n.cached||r.shiftKey&&a))if(a){var c={};c[o.EdgeDirection.StepBackward]=Math.PI,c[o.EdgeDirection.StepForward]=0,c[o.EdgeDirection.StepLeft]=Math.PI/2,c[o.EdgeDirection.StepRight]=-Math.PI/2;for(var u=e._rotationFromCamera(i.state.camera).phi,h=e._spatial.wrapAngle(u+c[s]),l=Math.PI/4,p=n.edges.filter(function(e){return e.data.direction===o.EdgeDirection.Pano||e.data.direction===s}),f=Number.MAX_VALUE,d=null,m=0,v=p;m<v.length;m++){var g=v[m],y=Math.abs(e._spatial.wrapAngle(g.data.worldMotionAzimuth-h));y<Math.min(f,l)&&(f=y,d=g.to)}if(null==d)return;e._moveToKey(d)}else e._moveDir(s,n)})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keySpatialNavigation:e}},t.prototype._moveDir=function(e,t){for(var r=0,n=t.edges;r<n.length;r++){var i=n[r];if(i.data.direction===e)return void this._moveToKey(i.to)}},t.prototype._moveToKey=function(e){this._navigator.moveToKey$(e).subscribe(function(e){},function(e){console.error(e)})},t.prototype._rotationFromCamera=function(e){var t=e.lookat.clone().sub(e.position),r=t.clone().dot(e.up),n=t.clone().sub(e.up.clone().multiplyScalar(r));return{phi:Math.atan2(n.y,n.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}},t}(i.HandlerBase);r.KeySpatialNavigationHandler=a,r.default=a},{"../../Component":281,"../../Edge":282,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],322:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/operator/withLatestFrom");var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._keyDownSubscription=this._container.keyboardService.keyDown$.withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2];if(!(r.altKey||r.shiftKey||r.ctrlKey||r.metaKey)){var o=0;switch(r.key){case"+":o=1;break;case"-":o=-1;break;default:return}r.preventDefault();var a=e._viewportCoords.unprojectFromViewport(0,0,n.perspective),s=i.projectBasic(a.toArray());e._navigator.stateService.zoomIn(o,s)}})},t.prototype._disable=function(){this._keyDownSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{keyZoom:e}},t}(e("../../Component").HandlerBase);r.KeyZoomHandler=i,r.default=i},{"../../Component":281,"rxjs/add/operator/withLatestFrom":87}],323:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../Component"),o=e("../../Geo"),a=function(e){function t(t,r,n){var a=e.call(this,t,r,n)||this;return a._keyPlayHandler=new i.KeyPlayHandler(a,r,n),a._keySequenceNavigationHandler=new i.KeySequenceNavigationHandler(a,r,n),a._keySpatialNavigationHandler=new i.KeySpatialNavigationHandler(a,r,n,new o.Spatial),a._keyZoomHandler=new i.KeyZoomHandler(a,r,n,new o.ViewportCoords),a}return n(t,e),Object.defineProperty(t.prototype,"keyPlay",{get:function(){return this._keyPlayHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"keySequenceNavigation",{get:function(){return this._keySequenceNavigationHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"keySpatialNavigation",{get:function(){return this._keySpatialNavigationHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"keyZoom",{get:function(){return this._keyZoomHandler},enumerable:!0,configurable:!0}),t.prototype._activate=function(){var e=this;this._configurationSubscription=this._configuration$.subscribe(function(t){t.keyPlay?e._keyPlayHandler.enable():e._keyPlayHandler.disable(),t.keySequenceNavigation?e._keySequenceNavigationHandler.enable():e._keySequenceNavigationHandler.disable(),t.keySpatialNavigation?e._keySpatialNavigationHandler.enable():e._keySpatialNavigationHandler.disable(),t.keyZoom?e._keyZoomHandler.enable():e._keyZoomHandler.disable()})},t.prototype._deactivate=function(){this._configurationSubscription.unsubscribe(),this._keyPlayHandler.disable(),this._keySequenceNavigationHandler.disable(),this._keySpatialNavigationHandler.disable(),this._keyZoomHandler.disable()},t.prototype._getDefaultConfiguration=function(){return{keyPlay:!0,keySequenceNavigation:!0,keySpatialNavigation:!0,keyZoom:!0}},t.componentName="keyboard",t}(i.Component);r.KeyboardComponent=a,i.ComponentService.register(a),r.default=a},{"../../Component":281,"../../Geo":284}],324:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./MarkerComponent");r.MarkerComponent=n.MarkerComponent;var i=e("./marker/SimpleMarker");r.SimpleMarker=i.SimpleMarker;var o=e("./marker/CircleMarker");r.CircleMarker=o.CircleMarker},{"./MarkerComponent":325,"./marker/CircleMarker":328,"./marker/SimpleMarker":330}],325:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("when"),a=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map");var s=e("../../Component"),c=e("../../Render"),u=e("../../Graph"),h=e("../../Geo"),l=function(e){function t(t,r,n){var i=e.call(this,t,r,n)||this;return i._relativeGroundAltitude=-2,i._geoCoords=new h.GeoCoords,i._graphCalculator=new u.GraphCalculator,i._markerScene=new s.MarkerScene,i._markerSet=new s.MarkerSet,i._viewportCoords=new h.ViewportCoords,i}return n(t,e),t.prototype.add=function(e){this._markerSet.add(e)},t.prototype.get=function(e){return this._markerSet.get(e)},t.prototype.getAll=function(){return this._markerSet.getAll()},t.prototype.getMarkerIdAt=function(e){var t=this;return o.promise(function(r,n){t._container.renderService.renderCamera$.first().map(function(r){var n=t._viewportCoords.canvasToViewport(e[0],e[1],t._container.element);return t._markerScene.intersectObjects(n,r.perspective)}).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.has=function(e){return this._markerSet.has(e)},t.prototype.remove=function(e){this._markerSet.remove(e)},t.prototype.removeAll=function(){this._markerSet.removeAll()},t.prototype._activate=function(){var e=this,r=this._navigator.stateService.currentState$.map(function(t){return t.state.camera.position.z+e._relativeGroundAltitude}).distinctUntilChanged(function(e,t){return Math.abs(e-t)<.01}).publishReplay(1).refCount(),n=a.Observable.combineLatest(r,this._navigator.stateService.reference$).first().map(function(){}).publishReplay(1).refCount(),o=this._configuration$.map(function(e){return{visibleBBoxSize:Math.max(1,Math.min(200,e.visibleBBoxSize))}}),s=this._navigator.stateService.currentNode$.map(function(e){return e.latLon}).publishReplay(1).refCount(),u=a.Observable.combineLatest(o,s).map(function(t){var r=t[0],n=t[1];return e._graphCalculator.boundingBoxCorners(n,r.visibleBBoxSize/2)}).publishReplay(1).refCount(),h=a.Observable.combineLatest(a.Observable.of(this._markerSet).concat(this._markerSet.changed$),u).map(function(e){var t=e[0],r=e[1];return t.search(r)});this._setChangedSubscription=n.switchMap(function(){return h.withLatestFrom(e._navigator.stateService.reference$,r)}).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=e._geoCoords,a=e._markerScene,s=a.markers,c=Object.assign({},s),u=0,h=r;u<h.length;u++){var l=h[u];if(l.id in s)delete c[l.id];else{var p=o.geodeticToEnu(l.latLon.lat,l.latLon.lon,n.alt+i,n.lat,n.lon,n.alt);a.add(l,p)}}for(var f in c)c.hasOwnProperty(f)&&a.remove(f)}),this._markersUpdatedSubscription=n.switchMap(function(){return e._markerSet.updated$.withLatestFrom(u,e._navigator.stateService.reference$,r)}).subscribe(function(t){for(var r=t[0],n=t[1],i=n[0],o=n[1],a=t[2],s=t[3],c=e._geoCoords,u=e._markerScene,h=0,l=r;h<l.length;h++){var p=l[h],f=u.has(p.id),d=p.latLon.lat>i.lat&&p.latLon.lat<o.lat&&p.latLon.lon>i.lon&&p.latLon.lon<o.lon;if(d){var m=c.geodeticToEnu(p.latLon.lat,p.latLon.lon,a.alt+s,a.lat,a.lon,a.alt);u.add(p,m)}else!d&&f&&u.remove(p.id)}}),this._referenceSubscription=this._navigator.stateService.reference$.skip(1).withLatestFrom(r).subscribe(function(t){for(var r=t[0],n=t[1],i=e._geoCoords,o=e._markerScene,a=0,s=o.getAll();a<s.length;a++){var c=s[a],u=i.geodeticToEnu(c.latLon.lat,c.latLon.lon,r.alt+n,r.lat,r.lon,r.alt);o.update(c.id,u)}}),this._adjustHeightSubscription=r.skip(1).withLatestFrom(this._navigator.stateService.reference$,s).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=e._geoCoords,a=e._markerScene,s=o.geodeticToEnu(i.lat,i.lon,n.alt+r,n.lat,n.lon,n.alt),c=0,u=a.getAll();c<u.length;c++){var h=u[c],l=o.geodeticToEnu(h.latLon.lat,h.latLon.lon,n.alt+r,n.lat,n.lon,n.alt),p=l[0]-s[0],f=l[1]-s[1],d=Math.sqrt(p*p+f*f);d>50||a.lerpAltitude(h.id,r,Math.min(1,Math.max(0,1.2-1.2*d/50)))}}),this._renderSubscription=this._navigator.stateService.currentState$.map(function(t){var r=e._markerScene;return{name:e._name,render:{frameId:t.id,needsRender:r.needsRender,render:r.render.bind(r),stage:c.GLRenderStage.Foreground}}}).subscribe(this._container.glRenderer.render$);var l=a.Observable.combineLatest(this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$).map(function(t){var r=t[0],n=t[1],i=e._container.element,o=e._viewportCoords.canvasPosition(n,i),a=o[0],s=o[1],c=e._viewportCoords.canvasToViewport(a,s,i);return e._markerScene.intersectObjects(c,r.perspective)}).publishReplay(1).refCount(),p=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).map(function(e){return!0}),f=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragEnd$).map(function(e){return!1}),d=a.Observable.merge(p,f).startWith(!1);this._dragEventSubscription=p.withLatestFrom(l).merge(a.Observable.combineLatest(f,a.Observable.of(null))).startWith([!1,null]).pairwise().subscribe(function(r){var n=r[0],i=r[1],o=i[0],a=o?t.dragstart:t.dragend,s=o?i[1]:n[1],c={marker:e._markerScene.get(s),target:e,type:a};e.fire(a,c)});var m=a.Observable.merge(this._container.mouseService.mouseDown$.map(function(e){return!0}),this._container.mouseService.documentMouseUp$.map(function(e){return!1})).startWith(!1);this._mouseClaimSubscription=a.Observable.combineLatest(this._container.mouseService.active$,l.distinctUntilChanged(),m,d).map(function(e){var t=e[0],r=e[1],n=e[2],i=e[3];return!t&&null!=r&&n||i}).distinctUntilChanged().subscribe(function(t){t?(e._container.mouseService.claimMouse(e._name,1),e._container.mouseService.claimWheel(e._name,1)):(e._container.mouseService.unclaimMouse(e._name),e._container.mouseService.unclaimWheel(e._name))});var v=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).withLatestFrom(l,this._container.renderService.renderCamera$).map(function(t){var r=t[0],n=t[1],i=t[2],o=e._markerScene.get(n),a=e._container.element,s=e._viewportCoords.projectToCanvas(o.geometry.position.toArray(),a,i.perspective),c=s[0],u=s[1],h=e._viewportCoords.canvasPosition(r,a);return[o,[h[0]-c,h[1]-u],i]}).publishReplay(1).refCount();this._updateMarkerSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$).withLatestFrom(v,this._navigator.stateService.reference$,o).subscribe(function(r){var n=r[0],o=r[1],a=o[0],s=o[1],c=o[2],u=r[2],h=r[3];if(e._markerScene.has(a.id)){var l=e._container.element,p=e._viewportCoords.canvasPosition(n,l),f=p[0],d=p[1],m=f-s[0],v=d-s[1],g=e._viewportCoords.canvasToViewport(m,v,l),y=g[0],b=g[1],_=new i.Vector3(y,b,1).unproject(c.perspective).sub(c.perspective.position).normalize(),x=Math.min(e._relativeGroundAltitude/_.z,h.visibleBBoxSize/2-.1);if(!(x<0)){var w=_.clone().multiplyScalar(x).add(c.perspective.position);w.z=c.perspective.position.z+e._relativeGroundAltitude;var S=e._geoCoords.enuToGeodetic(w.x,w.y,w.z,u.lat,u.lon,u.alt),M=S[0],E=S[1];e._markerScene.update(a.id,w.toArray(),{lat:M,lon:E}),e._markerSet.update(a);var C={marker:a,target:e,type:t.changed};e.fire(t.changed,C)}}})},t.prototype._deactivate=function(){this._adjustHeightSubscription.unsubscribe(),this._dragEventSubscription.unsubscribe(),this._markersUpdatedSubscription.unsubscribe(),this._mouseClaimSubscription.unsubscribe(),this._referenceSubscription.unsubscribe(),this._renderSubscription.unsubscribe(),this._setChangedSubscription.unsubscribe(),this._updateMarkerSubscription.unsubscribe(),this._markerScene.clear()},t.prototype._getDefaultConfiguration=function(){return{visibleBBoxSize:100}},t.componentName="marker",t.changed="changed",t.dragstart="dragstart",t.dragend="dragend",t}(s.Component);r.MarkerComponent=l,s.ComponentService.register(l),r.default=l},{"../../Component":281,"../../Geo":284,"../../Graph":285,"../../Render":287,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,three:231,when:278}],326:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t){this._needsRender=!1,this._interactiveObjects=[],this._markers={},this._objectMarkers={},this._raycaster=t||new n.Raycaster,this._scene=e||new n.Scene}return Object.defineProperty(e.prototype,"markers",{get:function(){return this._markers},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.add=function(e,t){e.id in this._markers&&this._dispose(e.id),e.createGeometry(t),this._scene.add(e.geometry),this._markers[e.id]=e;for(var r=0,n=e.getInteractiveObjects();r<n.length;r++){var i=n[r];this._interactiveObjects.push(i),this._objectMarkers[i.uuid]=e.id}this._needsRender=!0},e.prototype.clear=function(){for(var e in this._markers)this._markers.hasOwnProperty&&this._dispose(e);this._needsRender=!0},e.prototype.get=function(e){return this._markers[e]},e.prototype.getAll=function(){var e=this;return Object.keys(this._markers).map(function(t){return e._markers[t]})},e.prototype.has=function(e){return e in this._markers},e.prototype.intersectObjects=function(e,t){var r=e[0],i=e[1];this._raycaster.setFromCamera(new n.Vector2(r,i),t);for(var o=0,a=this._raycaster.intersectObjects(this._interactiveObjects);o<a.length;o++){var s=a[o];if(s.object.uuid in this._objectMarkers)return this._objectMarkers[s.object.uuid]}return null},e.prototype.lerpAltitude=function(e,t,r){e in this._markers&&(this._markers[e].lerpAltitude(t,r),this._needsRender=!0)},e.prototype.remove=function(e){e in this._markers&&(this._dispose(e),this._needsRender=!0)},e.prototype.render=function(e,t){t.render(this._scene,e),this._needsRender=!1},e.prototype.update=function(e,t,r){if(e in this._markers){this._markers[e].updatePosition(t,r),this._needsRender=!0}},e.prototype._dispose=function(e){var t=this._markers[e];this._scene.remove(t.geometry);for(var r=0,n=t.getInteractiveObjects();r<n.length;r++){var i=n[r],o=this._interactiveObjects.indexOf(i);-1!==o?this._interactiveObjects.splice(o,1):console.warn("Object does not exist ("+i.id+") for "+e),delete this._objectMarkers[i.uuid]}t.disposeGeometry(),delete this._markers[e]},e}();r.MarkerScene=i,r.default=i},{three:231}],327:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rbush"),i=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan");var o=function(){function e(){this._hash={},this._index=n(16,[".lon",".lat",".lon",".lat"]),this._indexChanged$=new i.Subject,this._updated$=new i.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._indexChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated$",{get:function(){return this._updated$},enumerable:!0,configurable:!0}),e.prototype.add=function(e){for(var t=[],r=this._hash,n=this._index,i=0,o=e;i<o.length;i++){var a=o[i],s=a.id;s in r&&(n.remove(r[s]),t.push(a));var c={lat:a.latLon.lat,lon:a.latLon.lon,marker:a};r[s]=c,n.insert(c)}t.length>0&&this._updated$.next(t),e.length>t.length&&this._indexChanged$.next(this)},e.prototype.has=function(e){return e in this._hash},e.prototype.get=function(e){return this.has(e)?this._hash[e].marker:void 0},e.prototype.getAll=function(){return this._index.all().map(function(e){return e.marker})},e.prototype.remove=function(e){for(var t=this._hash,r=this._index,n=!1,i=0,o=e;i<o.length;i++){var a=o[i];if(a in t){var s=t[a];r.remove(s),delete t[a],n=!0}}n&&this._indexChanged$.next(this)},e.prototype.removeAll=function(){this._hash={},this._index.clear(),this._indexChanged$.next(this)},e.prototype.search=function(e){var t=e[0],r=e[1];return this._index.search({maxX:r.lon,maxY:r.lat,minX:t.lon,minY:t.lat}).map(function(e){return e.marker})},e.prototype.update=function(e){var t=this._hash,r=this._index,n=e.id;if(n in t){r.remove(t[n]);var i={lat:e.latLon.lat,lon:e.latLon.lon,marker:e};t[n]=i,r.insert(i)}},e}();r.MarkerSet=o,r.default=o},{rbush:25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75}],328:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._color=null!=n.color?n.color:16777215,i._opacity=null!=n.opacity?n.opacity:.4,i._radius=null!=n.radius?n.radius:1,i}return n(t,e),t.prototype._createGeometry=function(e){var t=new i.Mesh(new i.CircleGeometry(this._radius,16),new i.MeshBasicMaterial({color:this._color,opacity:this._opacity,transparent:!0}));t.up.fromArray([0,0,1]),t.renderOrder=-1;var r=new i.Object3D;r.add(t),r.position.fromArray(e),this._geometry=r},t.prototype._disposeGeometry=function(){for(var e=0,t=this._geometry.children;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}},t.prototype._getInteractiveObjects=function(){return[]},t}(e("../../../Component").Marker);r.CircleMarker=o,r.default=o},{"../../../Component":281,three:231}],329:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){this._id=e,this._latLon=t}return Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"latLon",{get:function(){return this._latLon},enumerable:!0,configurable:!0}),e.prototype.createGeometry=function(e){this._geometry||(this._createGeometry(e),this._geometry.updateMatrixWorld(!0))},e.prototype.disposeGeometry=function(){this._geometry&&(this._disposeGeometry(),this._geometry=void 0)},e.prototype.getInteractiveObjects=function(){return this._geometry?this._getInteractiveObjects():[]},e.prototype.lerpAltitude=function(e,t){this._geometry&&(this._geometry.position.z=(1-t)*this._geometry.position.z+t*e)},e.prototype.updatePosition=function(e,t){t&&(this._latLon.lat=t.lat,this._latLon.lon=t.lon),this._geometry&&(this._geometry.position.fromArray(e),this._geometry.updateMatrixWorld(!0))},e}();r.Marker=n,r.default=n},{}],330:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._ballColor=null!=n.ballColor?n.ballColor:16711680,i._ballOpacity=null!=n.ballOpacity?n.ballOpacity:.8,i._circleToRayAngle=2,i._color=null!=n.color?n.color:16711680,i._interactive=!!n.interactive,i._opacity=null!=n.opacity?n.opacity:.4,i._radius=null!=n.radius?n.radius:1,i}return n(t,e),t.prototype._createGeometry=function(e){var t=this._radius,r=new i.Mesh(this._markerGeometry(t,8,8),new i.MeshBasicMaterial({color:this._color,opacity:this._opacity,transparent:!0}));r.renderOrder=1;var n=new i.Mesh(new i.SphereGeometry(t/2,8,8),new i.MeshBasicMaterial({color:this._ballColor,opacity:this._ballOpacity,transparent:!0}));n.position.z=this._markerHeight(t);var o=new i.Object3D;o.add(n),o.add(r),o.position.fromArray(e),this._geometry=o},t.prototype._disposeGeometry=function(){for(var e=0,t=this._geometry.children;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}},t.prototype._getInteractiveObjects=function(){return this._interactive?[this._geometry.children[0]]:[]},t.prototype._markerHeight=function(e){var t=Math.tan(Math.PI-this._circleToRayAngle);return e*Math.sqrt(1+t*t)},t.prototype._markerGeometry=function(e,t,r){var n=new i.Geometry;t=Math.max(3,Math.floor(t)||8),r=Math.max(2,Math.floor(r)||6);for(var o=this._markerHeight(e),a=[],s=0;s<=r;++s){for(var c=[],u=0;u<=t;++u){var h=u/t*Math.PI*2,l=s/r*Math.PI,p=void 0;if(l<this._circleToRayAngle)p=e;else{var f=Math.tan(l-this._circleToRayAngle);p=e*Math.sqrt(1+f*f)}var d=new i.Vector3;d.x=p*Math.cos(h)*Math.sin(l),d.y=p*Math.sin(h)*Math.sin(l),d.z=p*Math.cos(l)+o,n.vertices.push(d),c.push(n.vertices.length-1)}a.push(c)}for(s=0;s<r;++s)for(u=0;u<t;++u){var m=a[s][u+1],v=a[s][u],g=a[s+1][u],y=a[s+1][u+1],b=n.vertices[m].clone().normalize(),_=n.vertices[v].clone().normalize(),x=n.vertices[g].clone().normalize(),w=n.vertices[y].clone().normalize();n.faces.push(new i.Face3(m,v,y,[b,_,w])),n.faces.push(new i.Face3(v,g,y,[_.clone(),x,w.clone()]))}return n.computeFaceNormals(),n.boundingSphere=new i.Sphere(new i.Vector3,e+o),n},t}(e("../../../Component").Marker);r.SimpleMarker=o,r.default=o},{"../../../Component":281,three:231}],331:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n)||this;return a._spatial=o,a._viewportCoords=i,a._basicDistanceThreshold=.001,a._basicRotationThreshold=.05,a._bounceCoeff=.1,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._navigator.stateService.currentState$.map(function(e){return e.state.alpha<1});this._bounceSubscription=i.Observable.combineLatest(t,this._navigator.stateService.inTranslation$,this._container.mouseService.active$,this._container.touchService.active$).map(function(e){return e[0]||e[1]||e[2]||e[3]}).distinctUntilChanged().switchMap(function(t){return t?i.Observable.empty():i.Observable.combineLatest(e._container.renderService.renderCamera$,e._navigator.stateService.currentTransform$.first())}).subscribe(function(t){var r=t[0],n=r.perspective,i=t[1];if((i.hasValidScale||!(r.camera.focal<.1))&&0!==r.perspective.aspect&&r.perspective.aspect!==Number.POSITIVE_INFINITY){var o=e._basicDistanceThreshold/Math.pow(2,r.zoom),a=e._viewportCoords.viewportToBasic(0,0,i,n);if(!(Math.abs(a[0]-.5)<o&&Math.abs(a[1]-.5)<o)){var s=e._viewportCoords.getBasicDistances(i,n),c=0,u=0;if(!(s[0]<o&&s[1]<o&&s[2]<o&&s[3]<o||Math.abs(s[0]-s[2])<o&&Math.abs(s[1]-s[3])<o)){var h=e._bounceCoeff;s[1]>0&&0===s[3]?c=-h*s[1]:0===s[1]&&s[3]>0?c=h*s[3]:s[1]>0&&s[3]>0&&(c=h*(s[3]-s[1])/2),s[0]>0&&0===s[2]?u=h*s[0]:0===s[0]&&s[2]>0?u=-h*s[2]:s[0]>0&&s[2]>0&&(u=h*(s[0]-s[2])/2);var l=e._basicRotationThreshold;c=e._spatial.clamp(c,-l,l),u=e._spatial.clamp(u,-l,l),e._navigator.stateService.rotateBasicUnbounded([c,u])}}}})},t.prototype._disable=function(){this._bounceSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{}},t}(e("../../Component").HandlerBase);r.BounceHandler=o,r.default=o},{"../../Component":281,"rxjs/Observable":29}],332:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._zoomSubscription=i.Observable.merge(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.dblClick$),this._container.touchService.doubleTap$.map(function(e){var t=e.touches[0];return{clientX:t.clientX,clientY:t.clientY,shiftKey:e.shiftKey}})).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=r.shiftKey?-1:1;e._navigator.stateService.zoomIn(l,h)})},t.prototype._disable=function(){this._zoomSubscription.unsubscribe()},t.prototype._getConfiguration=function(e){return{doubleClickZoom:e}},t}(e("../../Component").HandlerBase);r.DoubleClickZoomHandler=o,r.default=o},{"../../Component":281,"rxjs/Observable":29}],333:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("rxjs/Observable");e("rxjs/add/operator/concat"),e("rxjs/add/operator/sample"),e("rxjs/add/operator/takeWhile");var a=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n)||this;return a._spatial=o,a._viewportCoords=i,a._basicRotationThreshold=.05,a._forceCoeff=.2,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragStart$).map(function(e){return!0}).share(),r=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$).map(function(e){return!1}).share();this._activeMouseSubscription=o.Observable.merge(t,r).subscribe(this._container.mouseService.activate$),this._preventDefaultSubscription=o.Observable.merge(t,r).switchMap(function(t){return t?e._container.mouseService.documentMouseMove$:o.Observable.empty()}).merge(this._container.touchService.touchMove$).subscribe(function(e){e.preventDefault()});var n=this._container.touchService.singleTouchDragStart$.map(function(e){return!0}),a=this._container.touchService.singleTouchDragEnd$.map(function(e){return!1});this._activeTouchSubscription=o.Observable.merge(n,a).subscribe(this._container.touchService.activate$);var s=this._navigator.stateService.currentState$.map(function(e){return e.state.currentNode.fullPano||e.state.nodesAhead<1}).distinctUntilChanged().switchMap(function(t){if(!t)return o.Observable.empty();var r=e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDragStart$).switchMap(function(t){return o.Observable.of(t).concat(e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDrag$)).merge(e._container.mouseService.filtered$(e._component.name,e._container.mouseService.mouseDragEnd$).map(function(e){return null})).takeWhile(function(e){return!!e}).startWith(null)}).pairwise().filter(function(e){return null!=e[0]&&null!=e[1]}),n=o.Observable.merge(e._container.touchService.singleTouchDragStart$,e._container.touchService.singleTouchDrag$,e._container.touchService.singleTouchDragEnd$.map(function(e){return null})).map(function(e){return null!=e&&e.touches.length>0?e.touches[0]:null}).pairwise().filter(function(e){return null!=e[0]&&null!=e[1]});return o.Observable.merge(r,n)}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,this._navigator.stateService.currentCamera$).map(function(t){var r=t[0],n=t[1],o=t[2],a=t[3].clone(),s=r[0],c=r[1],u=c.clientX-s.clientX,h=c.clientY-s.clientY,l=e._container.element,p=e._viewportCoords.canvasPosition(c,l),f=p[0],d=p[1],m=e._viewportCoords.unprojectFromCanvas(f,d,l,n.perspective).sub(n.perspective.position),v=e._viewportCoords.unprojectFromCanvas(f-u,d,l,n.perspective).sub(n.perspective.position),g=e._viewportCoords.unprojectFromCanvas(f,d-h,l,n.perspective).sub(n.perspective.position),y=(u>0?1:-1)*v.angleTo(m),b=(h>0?-1:1)*g.angleTo(m),_=(new i.Quaternion).setFromUnitVectors(a.up,new i.Vector3(0,0,1)),x=_.clone().inverse(),w=new i.Vector3;w.copy(a.lookat).sub(a.position),w.applyQuaternion(_);var S=w.length(),M=Math.atan2(w.y,w.x);M+=y;var E=Math.atan2(Math.sqrt(w.x*w.x+w.y*w.y),w.z);E+=b,E=Math.max(.01,Math.min(Math.PI-.01,E)),w.x=Math.sin(E)*Math.cos(M),w.y=Math.sin(E)*Math.sin(M),w.z=Math.cos(E),w.applyQuaternion(x);var C=(new i.Vector3).copy(a.position).add(w.multiplyScalar(S)),T=o.projectBasic(C.toArray()),O=o.projectBasic(a.lookat.toArray()),P=T[0]-O[0],j=T[1]-O[1];Math.abs(P)>1?P=0:P>.5?P-=1:P<-.5&&(P+=1);var A=e._basicRotationThreshold;if(P=e._spatial.clamp(P,-A,A),j=e._spatial.clamp(j,-A,A),o.fullPano)return[P,j];var R=e._viewportCoords.getPixelDistances(e._container.element,o,n.perspective),L=e._forceCoeff;return R[0]>0&&j<0&&T[1]<.5&&(j/=Math.max(1,L*R[0])),R[1]>0&&P>0&&T[0]>.5&&(P/=Math.max(1,L*R[1])),R[2]>0&&j>0&&T[1]>.5&&(j/=Math.max(1,L*R[2])),R[3]>0&&P<0&&T[0]<.5&&(P/=Math.max(1,L*R[3])),[P,j]}).share();this._rotateBasicWithoutInertiaSubscription=s.subscribe(function(t){e._navigator.stateService.rotateBasicWithoutInertia(t)}),this._rotateBasicSubscription=s.scan(function(t,r){return e._drainBuffer(t),t.push([Date.now(),r]),t},[]).sample(o.Observable.merge(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$),this._container.touchService.singleTouchDragEnd$)).map(function(t){for(var r=e._drainBuffer(t.slice()),n=[0,0],i=0,o=r;i<o.length;i++){var a=o[i];n[0]+=a[1][0],n[1]+=a[1][1]}var s=r.length;return s>0&&(n[0]/=s,n[1]/=s),n}).subscribe(function(t){e._navigator.stateService.rotateBasic(t)})},t.prototype._disable=function(){this._activeMouseSubscription.unsubscribe(),this._activeTouchSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._rotateBasicSubscription.unsubscribe(),this._rotateBasicWithoutInertiaSubscription.unsubscribe(),this._activeMouseSubscription=null,this._activeTouchSubscription=null,this._preventDefaultSubscription=null,this._rotateBasicSubscription=null},t.prototype._getConfiguration=function(e){return{dragPan:e}},t.prototype._drainBuffer=function(e){for(var t=Date.now();e.length>0&&t-e[0][0]>50;)e.shift();return e},t}(e("../../Component").HandlerBase);r.DragPanHandler=a,r.default=a},{"../../Component":281,"rxjs/Observable":29,"rxjs/add/operator/concat":54,"rxjs/add/operator/sample":74,"rxjs/add/operator/takeWhile":84,three:231}],334:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/observable/merge"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=e("../../Geo"),a=function(e){function t(t,r,n){var a=e.call(this,t,r,n)||this,s=new o.Spatial,c=new o.ViewportCoords;return a._bounceHandler=new i.BounceHandler(a,r,n,c,s),a._doubleClickZoomHandler=new i.DoubleClickZoomHandler(a,r,n,c),a._dragPanHandler=new i.DragPanHandler(a,r,n,c,s),a._scrollZoomHandler=new i.ScrollZoomHandler(a,r,n,c),a._touchZoomHandler=new i.TouchZoomHandler(a,r,n,c),a}return n(t,e),Object.defineProperty(t.prototype,"doubleClickZoom",{get:function(){return this._doubleClickZoomHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dragPan",{get:function(){return this._dragPanHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"scrollZoom",{get:function(){return this._scrollZoomHandler},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touchZoom",{get:function(){return this._touchZoomHandler},enumerable:!0,configurable:!0}),t.prototype._activate=function(){var e=this;this._bounceHandler.enable(),this._configurationSubscription=this._configuration$.subscribe(function(t){t.doubleClickZoom?e._doubleClickZoomHandler.enable():e._doubleClickZoomHandler.disable(),t.dragPan?e._dragPanHandler.enable():e._dragPanHandler.disable(),t.scrollZoom?e._scrollZoomHandler.enable():e._scrollZoomHandler.disable(),t.touchZoom?e._touchZoomHandler.enable():e._touchZoomHandler.disable()}),this._container.mouseService.claimMouse(this._name,0)},t.prototype._deactivate=function(){this._container.mouseService.unclaimMouse(this._name),this._configurationSubscription.unsubscribe(),this._bounceHandler.disable(),this._doubleClickZoomHandler.disable(),this._dragPanHandler.disable(),this._scrollZoomHandler.disable(),this._touchZoomHandler.disable()},t.prototype._getDefaultConfiguration=function(){return{doubleClickZoom:!0,dragPan:!0,scrollZoom:!0,touchZoom:!0}},t.componentName="mouse",t}(i.Component);r.MouseComponent=a,i.ComponentService.register(a),r.default=a},{"../../Component":281,"../../Geo":284,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":87}],335:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._container.mouseService.claimWheel(this._component.name,0),this._preventDefaultSubscription=this._container.mouseService.mouseWheel$.subscribe(function(e){e.preventDefault()}),this._zoomSubscription=this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$).withLatestFrom(this._navigator.stateService.currentState$,function(e,t){return[e,t]}).filter(function(e){var t=e[1].state;return t.currentNode.fullPano||t.nodesAhead<1}).map(function(e){return e[0]}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,function(e,t,r){return[e,t,r]}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=r.deltaY;1===r.deltaMode?l*=40:2===r.deltaMode&&(l*=800);var p=-3*l/e._viewportCoords.containerToCanvas(o)[1];e._navigator.stateService.zoomIn(p,h)})},t.prototype._disable=function(){this._container.mouseService.unclaimWheel(this._component.name),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null},t.prototype._getConfiguration=function(e){return{scrollZoom:e}},t}(e("../../Component").HandlerBase);r.ScrollZoomHandler=i,r.default=i},{"../../Component":281}],336:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._viewportCoords=i,o}return n(t,e),t.prototype._enable=function(){var e=this;this._preventDefaultSubscription=this._container.touchService.pinch$.subscribe(function(e){e.originalEvent.preventDefault()});var t=this._container.touchService.pinchStart$.map(function(e){return!0}),r=this._container.touchService.pinchEnd$.map(function(e){return!1});this._activeSubscription=i.Observable.merge(t,r).subscribe(this._container.touchService.activate$),this._zoomSubscription=this._container.touchService.pinch$.withLatestFrom(this._navigator.stateService.currentState$).filter(function(e){var t=e[1].state;return t.currentNode.fullPano||t.nodesAhead<1}).map(function(e){return e[0]}).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=e._container.element,a=e._viewportCoords.canvasPosition(r,o),s=a[0],c=a[1],u=e._viewportCoords.unprojectFromCanvas(s,c,o,n.perspective),h=i.projectBasic(u.toArray()),l=e._viewportCoords.containerToCanvas(o),p=l[0],f=l[1],d=3*r.distanceChange/Math.min(p,f);e._navigator.stateService.zoomIn(d,h)})},t.prototype._disable=function(){this._activeSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null},t.prototype._getConfiguration=function(e){return{touchZoom:e}},t}(e("../../Component").HandlerBase);r.TouchZoomHandler=o,r.default=o},{"../../Component":281,"rxjs/Observable":29}],337:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./popup/Popup");r.Popup=n.Popup;var i=e("./PopupComponent");r.PopupComponent=i.PopupComponent},{"./PopupComponent":338,"./popup/Popup":339}],338:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject"),a=e("../../Component"),s=e("../../Utils"),c=function(e){function t(t,r,n,i){var a=e.call(this,t,r,n)||this;return a._dom=i||new s.DOM,a._popups=[],a._added$=new o.Subject,a._popups$=new o.Subject,a}return n(t,e),t.prototype.add=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];-1===this._popups.indexOf(n)&&(this._popups.push(n),this._activated&&n.setParentContainer(this._popupContainer))}this._added$.next(e),this._popups$.next(this._popups)},t.prototype.getAll=function(){return this._popups.slice()},t.prototype.remove=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this._remove(n)}this._popups$.next(this._popups)},t.prototype.removeAll=function(){for(var e=0,t=this._popups.slice();e<t.length;e++){var r=t[e];this._remove(r)}this._popups$.next(this._popups)},t.prototype._activate=function(){var e=this;this._popupContainer=this._dom.createElement("div","mapillary-js-popup-container",this._container.element);for(var t=0,r=this._popups;t<r.length;t++){r[t].setParentContainer(this._popupContainer)}this._updateAllSubscription=i.Observable.combineLatest(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe(function(t){for(var r=t[0],n=t[1],i=t[2],o=0,a=e._popups;o<a.length;o++){a[o].update(r,n,i)}});var n=this._popups$.startWith(this._popups).switchMap(function(e){return i.Observable.from(e).mergeMap(function(e){return e.changed$})}).map(function(e){return[e]});this._updateAddedChangedSubscription=this._added$.merge(n).withLatestFrom(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe(function(e){for(var t=e[0],r=e[1],n=e[2],i=e[3],o=0,a=t;o<a.length;o++){a[o].update(r,n,i)}})},t.prototype._deactivate=function(){this._updateAllSubscription.unsubscribe(),this._updateAddedChangedSubscription.unsubscribe();for(var e=0,t=this._popups;e<t.length;e++){t[e].remove()}this._container.element.removeChild(this._popupContainer),delete this._popupContainer},t.prototype._getDefaultConfiguration=function(){return{}},t.prototype._remove=function(e){var t=this._popups.indexOf(e);if(-1!==t){var r=this._popups.splice(t,1)[0];this._activated&&r.remove()}},t.componentName="popup",t}(a.Component);r.PopupComponent=c,a.ComponentService.register(c),r.default=c},{"../../Component":281,"../../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34}],339:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("../../../Geo"),o=e("../../../Utils"),a=e("../../../Viewer"),s=function(){function e(e,t,r){this._options={},e&&(this._options.capturePointer=null==e.capturePointer||e.capturePointer,this._options.clean=e.clean,this._options.float=e.float,this._options.offset=e.offset,this._options.opacity=e.opacity,this._options.position=e.position),this._dom=r||new o.DOM,this._viewportCoords=t||new i.ViewportCoords,this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e.prototype.remove=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._parentContainer&&delete this._parentContainer},e.prototype.setBasicPoint=function(e){this._point=e.slice(),this._rect=null,this._notifyChanged$.next(this)},e.prototype.setBasicRect=function(e){this._rect=e.slice(),this._point=null,this._notifyChanged$.next(this)},e.prototype.setDOMContent=function(e){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content);var t="mapillaryjs-popup-content"+(!0===this._options.clean?"-clean":"")+(!0===this._options.capturePointer?" mapillaryjs-popup-capture-pointer":"");this._content=this._dom.createElement("div",t,this._container),this._content.appendChild(e),this._notifyChanged$.next(this)},e.prototype.setHTML=function(e){var t,r=this._dom.document.createDocumentFragment(),n=this._dom.createElement("body");for(n.innerHTML=e;;){if(!(t=n.firstChild))break;r.appendChild(t)}this.setDOMContent(r)},e.prototype.setText=function(e){this.setDOMContent(this._dom.document.createTextNode(e))},e.prototype.setParentContainer=function(e){this._parentContainer=e},e.prototype.update=function(e,t,r){if(this._parentContainer&&this._content&&(this._point||this._rect)){if(!this._container){this._container=this._dom.createElement("div","mapillaryjs-popup",this._parentContainer);if(!0!==this._options.clean&&this._options.float!==a.Alignment.Center){var n="mapillaryjs-popup-tip"+(!0===this._options.capturePointer?" mapillaryjs-popup-capture-pointer":"");this._tip=this._dom.createElement("div",n,this._container),this._dom.createElement("div","mapillaryjs-popup-tip-inner",this._tip)}this._container.appendChild(this._content),this._parentContainer.appendChild(this._container),null!=this._options.opacity&&(this._container.style.opacity=this._options.opacity.toString())}var i=null,o=this._alignmentToPopupAligment(this._options.position),s=this._alignmentToPopupAligment(this._options.float),c=this._container.classList;if(null!=this._point)i=this._viewportCoords.basicToCanvasSafe(this._point[0],this._point[1],{offsetHeight:t.height,offsetWidth:t.width},r,e.perspective);else{for(var u=null,h=0,l=["center","top","bottom","left","right","top-left","top-right","bottom-left","bottom-right"];h<l.length;h++){var p=l[h];if(c.contains("mapillaryjs-popup-float-"+p)){u=p;break}}i=(b=this._rectToPixel(this._rect,o,u,e,t,r))[0],o=b[1],s||(s=o)}if(null!=i){if(this._container.style.visibility="visible",!s){var f=this._container.offsetWidth,d=this._container.offsetHeight,m=this._pixelToFloats(i,t,f,d);s=0===m.length?"top":m.join("-")}var v=this._normalizeOffset(this._options.offset);i=[i[0]+v[s][0],i[1]+v[s][1]],i=[Math.round(i[0]),Math.round(i[1])];var g={bottom:"translate(-50%,0)","bottom-left":"translate(-100%,0)","bottom-right":"translate(0,0)",center:"translate(-50%,-50%)",left:"translate(-100%,-50%)",right:"translate(0,-50%)",top:"translate(-50%,-100%)","top-left":"translate(-100%,-100%)","top-right":"translate(0,-100%)"};for(var y in g)g.hasOwnProperty(y)&&c.remove("mapillaryjs-popup-float-"+y);c.add("mapillaryjs-popup-float-"+s),this._container.style.transform=g[s]+" translate("+i[0]+"px,"+i[1]+"px)";var b}else this._container.style.visibility="hidden"}},e.prototype._rectToPixel=function(e,t,r,n,i,o){if(!t){for(var a=this._container.offsetWidth,s=this._container.offsetHeight,c={bottom:[0,s/2],"bottom-left":[-a/2,s/2],"bottom-right":[a/2,s/2],left:[-a/2,0],right:[a/2,0],top:[0,-s/2],"top-left":[-a/2,-s/2],"top-right":[a/2,-s/2]},u=[0,null,null],h=0,l=["top","bottom","left","right"];h<l.length;h++){var p=l[h],f=this._pointFromRectPosition(e,p),d=this._viewportCoords.basicToCanvasSafe(f[0],f[1],{offsetHeight:i.height,offsetWidth:i.width},o,n.perspective);if(null!=d){var m=c[p],v=[d[0]+m[0],d[1]+m[1]],g=null!=r&&r===p?1:.7;if(0===this._pixelToFloats(v,i,a/g,s/(2*g)).length&&d[0]>0&&d[0]<i.width&&d[1]>0&&d[1]<i.height)return[d,p];var y=Math.max(v[0]-a/2,0),b=Math.min(v[0]+a/2,i.width),_=Math.max(v[1]-s/2,0),x=Math.min(v[1]+s/2,i.height),w=g*Math.max(0,b-y)*Math.max(0,x-_);w>u[0]&&(u[0]=w,u[1]=d,u[2]=p)}}if(u[0]>0)return[u[1],u[2]]}var S=this._pointFromRectPosition(e,t);return[this._viewportCoords.basicToCanvasSafe(S[0],S[1],{offsetHeight:i.height,offsetWidth:i.width},o,n.perspective),null!=t?t:"top"]},e.prototype._alignmentToPopupAligment=function(e){switch(e){case a.Alignment.Bottom:return"bottom";case a.Alignment.BottomLeft:return"bottom-left";case a.Alignment.BottomRight:return"bottom-right";case a.Alignment.Center:return"center";case a.Alignment.Left:return"left";case a.Alignment.Right:return"right";case a.Alignment.Top:return"top";case a.Alignment.TopLeft:return"top-left";case a.Alignment.TopRight:return"top-right";default:return null}},e.prototype._normalizeOffset=function(e){if(null==e)return this._normalizeOffset(0);if("number"==typeof e){var t=e,r=(t>=0?1:-1)*Math.round(Math.sqrt(.5*Math.pow(t,2)));return{bottom:[0,t],"bottom-left":[-r,r],"bottom-right":[r,r],center:[0,0],left:[-t,0],right:[t,0],top:[0,-t],"top-left":[-r,-r],"top-right":[r,-r]}}return{bottom:e.bottom||[0,0],"bottom-left":e.bottomLeft||[0,0],"bottom-right":e.bottomRight||[0,0],center:e.center||[0,0],left:e.left||[0,0],right:e.right||[0,0],top:e.top||[0,0],"top-left":e.topLeft||[0,0],"top-right":e.topRight||[0,0]}},e.prototype._pixelToFloats=function(e,t,r,n){var i=[];return e[1]<n?i.push("bottom"):e[1]>t.height-n&&i.push("top"),e[0]<r/2?i.push("right"):e[0]>t.width-r/2&&i.push("left"),i},e.prototype._pointFromRectPosition=function(e,t){var r=e[0],n=e[0]<e[2]?e[2]:e[2]+1,i=e[1],o=e[3];switch(t){case"bottom":return[(r+n)/2,o];case"bottom-left":return[r,o];case"bottom-right":return[n,o];case"center":return[(r+n)/2,(i+o)/2];case"left":return[r,(i+o)/2];case"right":return[n,(i+o)/2];case"top":return[(r+n)/2,i];case"top-left":return[r,i];case"top-right":return[n,i];default:return[(r+n)/2,o]}},e}();r.Popup=s,r.default=s},{"../../../Geo":284,"../../../Utils":291,"../../../Viewer":292,"rxjs/Subject":34}],340:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Default=0]="Default",e[e.Playback=1]="Playback"}(n=r.ControlMode||(r.ControlMode={})),r.default=n},{}],341:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/of"),e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/retry"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Edge"),c=function(e){function t(r,n,i){var s=e.call(this,r,n,i)||this;return s._sequenceDOMRenderer=new a.SequenceDOMRenderer(n),s._sequenceDOMInteraction=new a.SequenceDOMInteraction,s._containerWidth$=new o.Subject,s._hoveredKeySubject$=new o.Subject,s._hoveredKey$=s._hoveredKeySubject$.share(),s._navigator.playService.playing$.skip(1).withLatestFrom(s._configuration$).subscribe(function(e){var r=e[0],n=e[1];s.fire(t.playingchanged,r),r!==n.playing&&(r?s.play():s.stop())}),s._navigator.playService.direction$.skip(1).withLatestFrom(s._configuration$).subscribe(function(e){var t=e[0];t!==e[1].direction&&s.setDirection(t)}),s}return n(t,e),Object.defineProperty(t.prototype,"hoveredKey$",{get:function(){return this._hoveredKey$},enumerable:!0,configurable:!0}),t.prototype.play=function(){this.configure({playing:!0})},t.prototype.stop=function(){this.configure({playing:!1})},t.prototype.setDirection=function(e){this.configure({direction:e})},t.prototype.setHighlightKey=function(e){this.configure({highlightKey:e})},t.prototype.setMaxWidth=function(e){this.configure({maxWidth:e})},t.prototype.setMinWidth=function(e){this.configure({minWidth:e})},t.prototype.setVisible=function(e){this.configure({visible:e})},t.prototype.resize=function(){var e=this;this._configuration$.first().map(function(t){return e._sequenceDOMRenderer.getContainerWidth(e._container.element,t)}).subscribe(function(t){e._containerWidth$.next(t)})},t.prototype._activate=function(){var e=this;this._sequenceDOMRenderer.activate();var t=this._navigator.stateService.currentNode$.switchMap(function(e){return e.sequenceEdges$}).publishReplay(1).refCount();this._renderSubscription=i.Observable.combineLatest(t,this._configuration$,this._containerWidth$,this._sequenceDOMRenderer.changed$.startWith(this._sequenceDOMRenderer),this._navigator.playService.speed$).map(function(t){var r=t[0],n=t[1],i=t[2],o=(t[3],t[4]),a=e._sequenceDOMRenderer.render(r,n,i,o,e,e._sequenceDOMInteraction,e._navigator);return{name:e._name,vnode:a}}).subscribe(this._container.domRenderer.render$),this._setSpeedSubscription=this._sequenceDOMRenderer.speed$.subscribe(function(t){e._navigator.playService.setSpeed(t)}),this._setDirectionSubscription=this._configuration$.map(function(e){return e.direction}).distinctUntilChanged().subscribe(function(t){e._navigator.playService.setDirection(t)}),this._containerWidthSubscription=this._configuration$.distinctUntilChanged(function(e,t){return e[0]===t[0]&&e[1]===t[1]},function(e){return[e.minWidth,e.maxWidth]}).map(function(t){return e._sequenceDOMRenderer.getContainerWidth(e._container.element,t)}).subscribe(this._containerWidth$),this._playingSubscription=this._configuration$.map(function(e){return e.playing}).distinctUntilChanged().subscribe(function(t){t?e._navigator.playService.play():e._navigator.playService.stop()}),this._hoveredKeySubscription=this._sequenceDOMInteraction.mouseEnterDirection$.switchMap(function(r){return t.map(function(e){for(var t=0,n=e.edges;t<n.length;t++){var i=n[t];if(i.data.direction===r)return i.to}return null}).takeUntil(e._sequenceDOMInteraction.mouseLeaveDirection$).concat(i.Observable.of(null))}).distinctUntilChanged().subscribe(this._hoveredKeySubject$)},t.prototype._deactivate=function(){this._renderSubscription.unsubscribe(),this._playingSubscription.unsubscribe(),this._containerWidthSubscription.unsubscribe(),this._hoveredKeySubscription.unsubscribe(),this._setSpeedSubscription.unsubscribe(),this._setDirectionSubscription.unsubscribe(),this._sequenceDOMRenderer.deactivate()},t.prototype._getDefaultConfiguration=function(){return{direction:s.EdgeDirection.Next,maxWidth:108,minWidth:70,playing:!1,visible:!0}},t.componentName="sequence",t.playingchanged="playingchanged",t}(a.Component);r.SequenceComponent=c,a.ComponentService.register(c),r.default=c},{"../../Component":281,"../../Edge":282,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/retry":73,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87}],342:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._mouseEnterDirection$=new n.Subject,this._mouseLeaveDirection$=new n.Subject}return Object.defineProperty(e.prototype,"mouseEnterDirection$",{get:function(){return this._mouseEnterDirection$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseLeaveDirection$",{get:function(){return this._mouseLeaveDirection$},enumerable:!0,configurable:!0}),e}();r.SequenceDOMInteraction=i,r.default=i},{"rxjs/Subject":34}],343:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=e("rxjs/Observable"),o=e("rxjs/Subject"),a=e("../../Component"),s=e("../../Edge"),c=function(){function e(e){this._container=e,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._stepperDefaultWidth=108,this._controlsDefaultWidth=52,this._defaultHeight=30,this._expandControls=!1,this._mode=a.ControlMode.Default,this._speed=.5,this._changingSpeed=!1,this._notifyChanged$=new o.Subject,this._notifySpeedChanged$=new o.Subject}return Object.defineProperty(e.prototype,"speed",{get:function(){return this._speed},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"speed$",{get:function(){return this._notifySpeedChanged$},enumerable:!0,configurable:!0}),e.prototype.activate=function(){var e=this;this._changingSpeedSubscription||(this._changingSpeedSubscription=i.Observable.merge(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.filter(function(e){return 0===e.touches.length})).subscribe(function(t){e._changingSpeed&&(e._changingSpeed=!1)}))},e.prototype.deactivate=function(){this._changingSpeedSubscription&&(this._changingSpeed=!1,this._expandControls=!1,this._mode=a.ControlMode.Default,this._changingSpeedSubscription.unsubscribe(),this._changingSpeedSubscription=null)},e.prototype.render=function(e,t,r,i,o,a,s){if(!1===t.visible)return n.h("div.SequenceContainer",{},[]);var c=this._createStepper(e,t,r,o,a,s),u=this._createSequenceControls(r),h=this._createPlaybackControls(r,i,o,t);return n.h("div.SequenceContainer",[c,u,h])},e.prototype.getContainerWidth=function(e,t){var r=e.offsetWidth,n=e.offsetHeight,i=t.minWidth,o=t.maxWidth;o<i&&(o=i);var a=(r-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),s=(n-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight);return i+Math.max(0,Math.min(1,Math.min(a,s)))*(o-i)},e.prototype._createSpeedInput=function(e){var t=this;this._speed=e;var r=function(e){t._speed=Number(e.target.value)/1e3,t._notifySpeedChanged$.next(t._speed)},i=this._container.domContainer.getBoundingClientRect(),o=Math.max(276,Math.min(410,5+.8*i.width))-160,a=function(e){t._changingSpeed=!0,e.stopPropagation()},s=function(e){!0===t._changingSpeed&&e.stopPropagation()},c=n.h("input.SequenceSpeed",{max:1e3,min:0,onchange:r,oninput:r,onmousedown:a,onmousemove:s,ontouchmove:s,ontouchstart:a,style:{width:o+"px"},type:"range",value:1e3*e},[]);return n.h("div.SequenceSpeedContainer",[c])},e.prototype._createPlaybackControls=function(e,t,r,i){var o=this;if(this._mode!==a.ControlMode.Playback)return n.h("div.SequencePlayback",[]);var c=n.h("div.SequenceSwitchIcon.SequenceIconVisible",[]),u=i.direction===s.EdgeDirection.Next?s.EdgeDirection.Prev:s.EdgeDirection.Next,h=i.playing,l={onclick:function(){h||r.setDirection(u)}},p=i.playing?".SequenceSwitchButtonDisabled":".SequenceSwitchButton",f=n.h("div"+p,l,[c]),d=n.h("div.SequenceSlowIcon.SequenceIconVisible",[]),m=n.h("div.SequenceSlowContainer",[d]),v=n.h("div.SequenceFastIconGrey.SequenceIconVisible",[]),g=n.h("div.SequenceFastContainer",[v]),y=n.h("div.SequenceCloseIcon.SequenceIconVisible",[]),b={onclick:function(){o._mode=a.ControlMode.Default,o._notifyChanged$.next(o)}},_=n.h("div.SequenceCloseButton",b,[y]),x=[f,m,this._createSpeedInput(t),g,_],w={style:{top:Math.round(e/this._stepperDefaultWidth*this._defaultHeight+10)+"px"}};return n.h("div.SequencePlayback",w,x)},e.prototype._createPlayingButton=function(e,t,r,i){var o=r.direction===s.EdgeDirection.Next&&null!=e||r.direction===s.EdgeDirection.Prev&&null!=t,a={onclick:r.playing?function(e){i.stop()}:o?function(e){i.play()}:null},c={className:r.playing?"Stop":o?"Play":"PlayDisabled"};r.direction===s.EdgeDirection.Prev&&(c.style={transform:"rotate(180deg) translate(50%, 50%)"});var u=n.h("div.SequenceComponentIcon",c,[]),h=o?"SequencePlay":"SequencePlayDisabled";return n.h("div."+h,a,[u])},e.prototype._createSequenceControls=function(e){var t=this,r=Math.round(8/this._stepperDefaultWidth*e),i={onclick:function(){t._expandControls=!t._expandControls,t._mode=a.ControlMode.Default,t._notifyChanged$.next(t)},style:{"border-bottom-right-radius":r+"px","border-top-right-radius":r+"px"}},o=n.h("div.SequenceExpanderBar",[]),s=n.h("div.SequenceExpanderButton",i,[o]),c=this._mode===a.ControlMode.Playback?".SequenceFastIconGrey.SequenceIconVisible":".SequenceFastIcon",u=n.h("div"+c,[]),h={onclick:function(){t._mode=t._mode===a.ControlMode.Playback?a.ControlMode.Default:a.ControlMode.Playback,t._notifyChanged$.next(t)}},l=n.h("div.SequencePlaybackButton",h,[u]),p={style:{height:this._defaultHeight/this._stepperDefaultWidth*e+"px",transform:"translate("+(e/2+2)+"px, 0)",width:this._controlsDefaultWidth/this._stepperDefaultWidth*e+"px"}},f=".SequenceControls"+(this._expandControls?".SequenceControlsExpanded":"");return n.h("div"+f,p,[l,s])},e.prototype._createSequenceArrows=function(e,t,r,i,o,a){var c={onclick:null!=e?function(e){a.moveDir$(s.EdgeDirection.Next).subscribe(function(e){},function(e){console.error(e)})}:null,onmouseenter:function(e){o.mouseEnterDirection$.next(s.EdgeDirection.Next)},onmouseleave:function(e){o.mouseLeaveDirection$.next(s.EdgeDirection.Next)}},u=Math.round(8/this._stepperDefaultWidth*r),h={onclick:null!=t?function(e){a.moveDir$(s.EdgeDirection.Prev).subscribe(function(e){},function(e){console.error(e)})}:null,onmouseenter:function(e){o.mouseEnterDirection$.next(s.EdgeDirection.Prev)},onmouseleave:function(e){o.mouseLeaveDirection$.next(s.EdgeDirection.Prev)},style:{"border-bottom-left-radius":u+"px","border-top-left-radius":u+"px"}},l=this._getStepClassName(s.EdgeDirection.Next,e,i.highlightKey),p=this._getStepClassName(s.EdgeDirection.Prev,t,i.highlightKey),f=n.h("div.SequenceComponentIcon",[]),d=n.h("div.SequenceComponentIcon",[]);return[n.h("div."+p,h,[d]),n.h("div."+l,c,[f])]},e.prototype._createStepper=function(e,t,r,i,o,a){for(var c=null,u=null,h=0,l=e.edges;h<l.length;h++){var p=l[h];p.data.direction===s.EdgeDirection.Next&&(c=p.to),p.data.direction===s.EdgeDirection.Prev&&(u=p.to)}var f=this._createPlayingButton(c,u,t,i),d=this._createSequenceArrows(c,u,r,t,o,a);d.splice(1,0,f);var m={oncontextmenu:function(e){e.preventDefault()},style:{height:this._defaultHeight/this._stepperDefaultWidth*r+"px",width:r+"px"}};return n.h("div.SequenceStepper",m,d)},e.prototype._getStepClassName=function(e,t,r){var n=e===s.EdgeDirection.Next?"SequenceStepNext":"SequenceStepPrev";return null==t?n+="Disabled":r===t&&(n+="Highlight"),n},e}();r.SequenceDOMRenderer=c,r.default=c},{"../../Component":281,"../../Edge":282,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":237}],344:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./error/GeometryTagError");r.GeometryTagError=n.GeometryTagError;var i=e("./geometry/PointGeometry");r.PointGeometry=i.PointGeometry;var o=e("./geometry/RectGeometry");r.RectGeometry=o.RectGeometry;var a=e("./geometry/PolygonGeometry");r.PolygonGeometry=a.PolygonGeometry;var s=e("./tag/OutlineTag");r.OutlineTag=s.OutlineTag;var c=e("./tag/SpotTag");r.SpotTag=c.SpotTag;var u=e("./TagComponent");r.TagComponent=u.TagComponent;var h=e("./TagMode");r.TagMode=h.TagMode},{"./TagComponent":345,"./TagMode":348,"./error/GeometryTagError":352,"./geometry/PointGeometry":354,"./geometry/PolygonGeometry":355,"./geometry/RectGeometry":356,"./tag/OutlineTag":368,"./tag/SpotTag":371}],345:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("when"),o=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/observable/empty"),e("rxjs/add/observable/from"),e("rxjs/add/observable/merge"),e("rxjs/add/observable/of"),e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/skipUntil"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/take"),e("rxjs/add/operator/takeUntil"),e("rxjs/add/operator/withLatestFrom");var a=e("../../Component"),s=e("../../Geo"),c=e("../../Render"),u=function(e){function t(r,n,i){var c=e.call(this,r,n,i)||this;return c._tagDomRenderer=new a.TagDOMRenderer,c._tagScene=new a.TagScene,c._tagSet=new a.TagSet,c._tagCreator=new a.TagCreator(c,i),c._viewportCoords=new s.ViewportCoords,c._createHandlers={CreatePoint:new a.CreatePointHandler(c,n,i,c._viewportCoords,c._tagCreator),CreatePolygon:new a.CreatePolygonHandler(c,n,i,c._viewportCoords,c._tagCreator),CreateRect:new a.CreateRectHandler(c,n,i,c._viewportCoords,c._tagCreator),CreateRectDrag:new a.CreateRectDragHandler(c,n,i,c._viewportCoords,c._tagCreator),Default:void 0},c._editVertexHandler=new a.EditVertexHandler(c,n,i,c._viewportCoords,c._tagSet),c._renderTags$=c._tagSet.changed$.map(function(e){var t=e.getAll();return t.sort(function(e,t){var r=e.tag.id,n=t.tag.id;return r<n?-1:r>n?1:0}),t}).share(),c._tagChanged$=c._renderTags$.switchMap(function(e){return o.Observable.from(e).mergeMap(function(e){return o.Observable.merge(e.tag.changed$,e.tag.geometryChanged$)})}).share(),c._renderTagGLChanged$=c._renderTags$.switchMap(function(e){return o.Observable.from(e).mergeMap(function(e){return e.glObjectsChanged$})}).share(),c._createGeometryChanged$=c._tagCreator.tag$.switchMap(function(e){return null!=e?e.geometryChanged$:o.Observable.empty()}).share(),c._createGLObjectsChanged$=c._tagCreator.tag$.switchMap(function(e){return null!=e?e.glObjectsChanged$:o.Observable.empty()}).share(),c._creatingConfiguration$=c._configuration$.distinctUntilChanged(function(e,t){return e.mode===t.mode},function(e){return{createColor:e.createColor,mode:e.mode}}).publishReplay(1).refCount(),c._creatingConfiguration$.subscribe(function(e){c.fire(t.modechanged,e.mode)}),c}return n(t,e),t.prototype.add=function(e){var t=this;this._activated?this._navigator.stateService.currentTransform$.first().subscribe(function(r){t._tagSet.add(e,r);var n=e.map(function(e){return t._tagSet.get(e.id)});t._tagScene.add(n)}):this._tagSet.addDeactivated(e)},t.prototype.changeMode=function(e){this.configure({mode:e})},t.prototype.get=function(e){if(this._activated){var t=this._tagSet.get(e);return void 0!==t?t.tag:void 0}return this._tagSet.getDeactivated(e)},t.prototype.getAll=function(){return this.activated?this._tagSet.getAll().map(function(e){return e.tag}):this._tagSet.getAllDeactivated()},t.prototype.getTagIdsAt=function(e){var t=this;return i.promise(function(r,n){t._container.renderService.renderCamera$.first().map(function(r){var n=t._viewportCoords.canvasToViewport(e[0],e[1],t._container.element);return t._tagScene.intersectObjects(n,r.perspective)}).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.has=function(e){return this._activated?this._tagSet.has(e):this._tagSet.hasDeactivated(e)},t.prototype.remove=function(e){this._activated?(this._tagSet.remove(e),this._tagScene.remove(e)):this._tagSet.removeDeactivated(e)},t.prototype.removeAll=function(){this._activated?(this._tagSet.removeAll(),this._tagScene.removeAll()):this._tagSet.removeAllDeactivated()},t.prototype._activate=function(){var e=this;this._editVertexHandler.enable();var r=o.Observable.from(Object.keys(this._createHandlers)).map(function(t){return e._createHandlers[t]}).filter(function(e){return!!e}).mergeMap(function(e){return e.geometryCreated$}).share();this._fireGeometryCreatedSubscription=r.subscribe(function(r){e.fire(t.geometrycreated,r)}),this._fireCreateGeometryEventSubscription=this._tagCreator.tag$.skipWhile(function(e){return null==e}).distinctUntilChanged().subscribe(function(r){var n=null!=r?t.creategeometrystart:t.creategeometryend;e.fire(n,e)}),this._handlerStopCreateSubscription=r.subscribe(function(){e.changeMode(a.TagMode.Default)}),this._handlerEnablerSubscription=this._creatingConfiguration$.subscribe(function(t){e._disableCreateHandlers();var r=a.TagMode[t.mode],n=e._createHandlers[r];n&&n.enable()}),this._fireTagsChangedSubscription=this._renderTags$.subscribe(function(r){e.fire(t.tagschanged,e)}),this._stopCreateSubscription=this._tagCreator.tag$.switchMap(function(e){return null!=e?e.aborted$.map(function(e){return null}):o.Observable.empty()}).subscribe(function(){e.changeMode(a.TagMode.Default)}),this._setGLCreateTagSubscription=this._tagCreator.tag$.subscribe(function(t){e._tagScene.hasCreateTag()&&e._tagScene.removeCreateTag(),null!=t&&e._tagScene.addCreateTag(t)}),this._createGLObjectsChangedSubscription=this._createGLObjectsChanged$.subscribe(function(t){e._tagScene.updateCreateTagObjects(t)}),this._updateGLObjectsSubscription=this._renderTagGLChanged$.subscribe(function(t){e._tagScene.updateObjects(t)}),this._updateTagSceneSubscription=this._tagChanged$.subscribe(function(t){e._tagScene.update()}),this._domSubscription=this._renderTags$.startWith([]).do(function(t){e._container.domRenderer.render$.next({name:e._name,vnode:e._tagDomRenderer.clear()})}).combineLatest(this._container.renderService.renderCamera$,this._container.spriteService.spriteAtlas$,this._container.renderService.size$,this._tagChanged$.startWith(null),this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null),function(e,t,r,n,i,o){return[t,r,n,e,i,o]}).map(function(t){return{name:e._name,vnode:e._tagDomRenderer.render(t[3],t[5],t[1],t[0].perspective,t[2])}}).subscribe(this._container.domRenderer.render$),this._glSubscription=this._navigator.stateService.currentState$.map(function(t){var r=e._tagScene;return{name:e._name,render:{frameId:t.id,needsRender:r.needsRender,render:r.render.bind(r),stage:c.GLRenderStage.Foreground}}}).subscribe(this._container.glRenderer.render$),this._navigator.stateService.currentTransform$.first().subscribe(function(t){e._tagSet.activate(t),e._tagScene.add(e._tagSet.getAll())})},t.prototype._deactivate=function(){this._editVertexHandler.disable(),this._disableCreateHandlers(),this._tagScene.clear(),this._tagSet.deactivate(),this._tagCreator.delete$.next(null),this._updateGLObjectsSubscription.unsubscribe(),this._updateTagSceneSubscription.unsubscribe(),this._stopCreateSubscription.unsubscribe(),this._setGLCreateTagSubscription.unsubscribe(),this._createGLObjectsChangedSubscription.unsubscribe(),this._domSubscription.unsubscribe(),this._glSubscription.unsubscribe(),this._fireCreateGeometryEventSubscription.unsubscribe(),this._fireGeometryCreatedSubscription.unsubscribe(),this._fireTagsChangedSubscription.unsubscribe(),this._handlerStopCreateSubscription.unsubscribe(),this._handlerEnablerSubscription.unsubscribe(),this._container.element.classList.remove("component-tag-create")},t.prototype._getDefaultConfiguration=function(){return{createColor:16777215,mode:a.TagMode.Default}},t.prototype._disableCreateHandlers=function(){var e=this._createHandlers;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];r&&r.disable()}},t.componentName="tag",t.creategeometryend="creategeometryend",t.creategeometrystart="creategeometrystart",t.modechanged="modechanged",t.geometrycreated="geometrycreated",t.tagschanged="tagschanged",t}(a.Component);r.TagComponent=u,a.ComponentService.register(u),r.default=u},{"../../Component":281,"../../Geo":284,"../../Render":287,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/skip":77,"rxjs/add/operator/skipUntil":78,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/take":82,"rxjs/add/operator/takeUntil":83,"rxjs/add/operator/withLatestFrom":87,when:278}],346:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/withLatestFrom");var i=e("../../Component"),o=function(){function e(e,t){this._component=e,this._navigator=t,this._tagOperation$=new n.Subject,this._createPolygon$=new n.Subject,this._createRect$=new n.Subject,this._delete$=new n.Subject,this._tag$=this._tagOperation$.scan(function(e,t){return t(e)},null).share(),this._createRect$.withLatestFrom(this._component.configuration$,this._navigator.stateService.currentTransform$).map(function(e){var t=e[0],r=e[1],n=e[2];return function(e){var o=new i.RectGeometry([t[0],t[1],t[0],t[1]]);return new i.OutlineCreateTag(o,{color:r.createColor},n)}}).subscribe(this._tagOperation$),this._createPolygon$.withLatestFrom(this._component.configuration$,this._navigator.stateService.currentTransform$).map(function(e){var t=e[0],r=e[1],n=e[2];return function(e){var o=new i.PolygonGeometry([[t[0],t[1]],[t[0],t[1]],[t[0],t[1]]]);return new i.OutlineCreateTag(o,{color:r.createColor},n)}}).subscribe(this._tagOperation$),this._delete$.map(function(){return function(e){return null}}).subscribe(this._tagOperation$)}return Object.defineProperty(e.prototype,"createRect$",{get:function(){return this._createRect$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"createPolygon$",{get:function(){return this._createPolygon$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"delete$",{get:function(){return this._delete$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tag$",{get:function(){return this._tag$},enumerable:!0,configurable:!0}),e}();r.TagCreator=o,r.default=o},{"../../Component":281,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/withLatestFrom":87}],347:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("virtual-dom"),i=function(){function e(){}return e.prototype.render=function(e,t,r,i,o){for(var a=[],s=0,c=e;s<c.length;s++){var u=c[s];a=a.concat(u.getDOMObjects(r,i,o))}return null!=t&&(a=a.concat(t.getDOMObjects(i,o))),n.h("div.TagContainer",{},a)},e.prototype.clear=function(){return n.h("div",{},[])},e}();r.TagDOMRenderer=i},{"virtual-dom":237}],348:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Default=0]="Default",e[e.CreatePoint=1]="CreatePoint",e[e.CreatePolygon=2]="CreatePolygon",e[e.CreateRect=3]="CreateRect",e[e.CreateRectDrag=4]="CreateRectDrag"}(n=r.TagMode||(r.TagMode={})),r.default=n},{}],349:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.None=0]="None",e[e.Centroid=1]="Centroid",e[e.Vertex=2]="Vertex"}(n=r.TagOperation||(r.TagOperation={})),r.default=n},{}],350:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t){this._createTag=null,this._needsRender=!1,this._raycaster=t||new n.Raycaster,this._scene=e||new n.Scene,this._objectTags={},this._retrievableObjects=[],this._tags={}}return Object.defineProperty(e.prototype,"needsRender",{get:function(){return this._needsRender},enumerable:!0,configurable:!0}),e.prototype.add=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];n.tag.id in this._tags&&this._remove(n.tag.id),this._add(n)}this._needsRender=!0},e.prototype.addCreateTag=function(e){for(var t=0,r=e.glObjects;t<r.length;t++){var n=r[t];this._scene.add(n)}this._createTag={tag:e,objects:e.glObjects},this._needsRender=!0},e.prototype.clear=function(){for(var e=0,t=Object.keys(this._tags);e<t.length;e++){var r=t[e];this._remove(r)}this._needsRender=!1},e.prototype.get=function(e){return this.has(e)?this._tags[e].tag:void 0},e.prototype.has=function(e){return e in this._tags},e.prototype.hasCreateTag=function(){return null!=this._createTag},e.prototype.intersectObjects=function(e,t){var r=e[0],i=e[1];this._raycaster.setFromCamera(new n.Vector2(r,i),t);for(var o=[],a=0,s=this._raycaster.intersectObjects(this._retrievableObjects);a<s.length;a++){var c=s[a];c.object.uuid in this._objectTags&&o.push(this._objectTags[c.object.uuid])}return o},e.prototype.remove=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this._remove(n)}this._needsRender=!0},e.prototype.removeAll=function(){for(var e=0,t=Object.keys(this._tags);e<t.length;e++){var r=t[e];this._remove(r)}this._needsRender=!0},e.prototype.removeCreateTag=function(){if(null!=this._createTag){for(var e=0,t=this._createTag.objects;e<t.length;e++){var r=t[e];this._scene.remove(r)}this._createTag.tag.dispose(),this._createTag=null,this._needsRender=!0}},e.prototype.render=function(e,t){t.render(this._scene,e),this._needsRender=!1},e.prototype.update=function(){this._needsRender=!0},e.prototype.updateCreateTagObjects=function(e){if(this._createTag.tag!==e)throw new Error("Create tags do not have the same reference.");for(var t=0,r=this._createTag.objects;t<r.length;t++){o=r[t];this._scene.remove(o)}for(var n=0,i=e.glObjects;n<i.length;n++){var o=i[n];this._scene.add(o)}this._createTag.objects=e.glObjects,this._needsRender=!0},e.prototype.updateObjects=function(e){var t=e.tag.id;if(this._tags[t].tag!==e)throw new Error("Tags do not have the same reference.");var r=this._tags[t];this._removeObjects(r),delete this._tags[t],this._add(e),this._needsRender=!0},e.prototype._add=function(e){var t=e.tag.id,r={tag:e,objects:[],retrievableObjects:[]};this._tags[t]=r;for(var n=0,i=e.getGLObjects();n<i.length;n++){var o=i[n];r.objects.push(o),this._scene.add(o)}for(var a=0,s=e.getRetrievableObjects();a<s.length;a++){var c=s[a];r.retrievableObjects.push(c),this._retrievableObjects.push(c),this._objectTags[c.uuid]=e.tag.id}},e.prototype._remove=function(e){var t=this._tags[e];this._removeObjects(t),t.tag.dispose(),delete this._tags[e]},e.prototype._removeObjects=function(e){for(var t=0,r=e.objects;t<r.length;t++){var n=r[t];this._scene.remove(n)}for(var i=0,o=e.retrievableObjects;i<o.length;i++){var a=o[i],s=this._retrievableObjects.indexOf(a);-1!==s&&this._retrievableObjects.splice(s,1)}},e}();r.TagScene=i,r.default=i},{three:231}],351:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share");var i=e("../../Component"),o=function(){function e(){this._active=!1,this._hash={},this._hashDeactivated={},this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"active",{get:function(){return this._active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e.prototype.activate=function(e){if(!this._active){for(var t in this._hashDeactivated)if(this._hashDeactivated.hasOwnProperty(t)){var r=this._hashDeactivated[t];this._add(r,e)}this._hashDeactivated={},this._active=!0,this._notifyChanged$.next(this)}},e.prototype.deactivate=function(){if(this._active){for(var e in this._hash)this._hash.hasOwnProperty(e)&&(this._hashDeactivated[e]=this._hash[e].tag);this._hash={},this._active=!1}},e.prototype.add=function(e,t){this._assertActivationState(!0);for(var r=0,n=e;r<n.length;r++){var i=n[r];this._add(i,t)}this._notifyChanged$.next(this)},e.prototype.addDeactivated=function(e){this._assertActivationState(!1);for(var t=0,r=e;t<r.length;t++){var n=r[t];if(!(n instanceof i.OutlineTag||n instanceof i.SpotTag))throw new Error("Tag type not supported");this._hashDeactivated[n.id]=n}},e.prototype.get=function(e){return this.has(e)?this._hash[e]:void 0},e.prototype.getAll=function(){var e=this._hash;return Object.keys(e).map(function(t){return e[t]})},e.prototype.getAllDeactivated=function(){var e=this._hashDeactivated;return Object.keys(e).map(function(t){return e[t]})},e.prototype.getDeactivated=function(e){return this.hasDeactivated(e)?this._hashDeactivated[e]:void 0},e.prototype.has=function(e){return e in this._hash},e.prototype.hasDeactivated=function(e){return e in this._hashDeactivated},e.prototype.remove=function(e){this._assertActivationState(!0);for(var t=this._hash,r=0,n=e;r<n.length;r++){var i=n[r];i in t&&delete t[i]}this._notifyChanged$.next(this)},e.prototype.removeAll=function(){this._assertActivationState(!0),this._hash={},this._notifyChanged$.next(this)},e.prototype.removeAllDeactivated=function(){this._assertActivationState(!1),this._hashDeactivated={}},e.prototype.removeDeactivated=function(e){this._assertActivationState(!1);for(var t=this._hashDeactivated,r=0,n=e;r<n.length;r++){var i=n[r];i in t&&delete t[i]}},e.prototype._add=function(e,t){if(e instanceof i.OutlineTag)this._hash[e.id]=new i.OutlineRenderTag(e,t);else{if(!(e instanceof i.SpotTag))throw new Error("Tag type not supported");this._hash[e.id]=new i.SpotRenderTag(e,t)}},e.prototype._assertActivationState=function(e){if(e!==this._active)throw new Error("Tag set not in correct state for operation.")},e}();r.TagSet=o,r.default=o},{"../../Component":281,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76}],352:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Error"),o=function(e){function t(t){var r=e.call(this,null!=t?t:"The provided geometry value is incorrect")||this;return r.name="GeometryTagError",r}return n(t,e),t}(i.MapillaryError);r.GeometryTagError=o,r.default=i.MapillaryError},{"../../../Error":283}],353:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._notifyChanged$=new n.Subject}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),e}();r.Geometry=i,r.default=i},{"rxjs/Subject":34}],354:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t){var r=e.call(this)||this,n=t[0],o=t[1];if(n<0||n>1||o<0||o>1)throw new i.GeometryTagError("Basic coordinates must be on the interval [0, 1].");return r._point=t.slice(),r}return n(t,e),Object.defineProperty(t.prototype,"point",{get:function(){return this._point},enumerable:!0,configurable:!0}),t.prototype.getCentroid2d=function(){return this._point.slice()},t.prototype.getCentroid3d=function(e){return e.unprojectBasic(this._point,200)},t.prototype.setCentroid2d=function(e,t){var r=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._point[0]=r[0],this._point[1]=r[1],this._notifyChanged$.next(this)},t}(i.Geometry);r.PointGeometry=o},{"../../../Component":281}],355:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t,r){var n=e.call(this)||this,o=t.length;if(o<3)throw new i.GeometryTagError("A polygon must have three or more positions.");if(t[0][0]!==t[o-1][0]||t[0][1]!==t[o-1][1])throw new i.GeometryTagError("First and last positions must be equivalent.");n._polygon=[];for(var a=0,s=t;a<s.length;a++){if((f=s[a])[0]<0||f[0]>1||f[1]<0||f[1]>1)throw new i.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");n._polygon.push(f.slice())}if(n._holes=[],null==r)return n;for(var c=0;c<r.length;c++){var u=r[c],h=u.length;if(h<3)throw new i.GeometryTagError("A polygon hole must have three or more positions.");if(u[0][0]!==u[h-1][0]||u[0][1]!==u[h-1][1])throw new i.GeometryTagError("First and last positions of hole must be equivalent.");n._holes.push([]);for(var l=0,p=u;l<p.length;l++){var f=p[l];if(f[0]<0||f[0]>1||f[1]<0||f[1]>1)throw new i.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");n._holes[c].push(f.slice())}}return n}return n(t,e),Object.defineProperty(t.prototype,"polygon",{get:function(){return this._polygon},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"holes",{get:function(){return this._holes},enumerable:!0,configurable:!0}),t.prototype.addVertex2d=function(e){var t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._polygon.splice(this._polygon.length-1,0,t),this._notifyChanged$.next(this)},t.prototype.getVertex2d=function(e){return this._polygon[e].slice()},t.prototype.removeVertex2d=function(e){if(e<0||e>=this._polygon.length||this._polygon.length<4)throw new i.GeometryTagError("Index for removed vertex must be valid.");if(e>0&&e<this._polygon.length-1)this._polygon.splice(e,1);else{this._polygon.splice(0,1),this._polygon.pop();var t=this._polygon[0].slice();this._polygon.push(t)}this._notifyChanged$.next(this)},t.prototype.setVertex2d=function(e,t,r){var n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];0===e||e===this._polygon.length-1?(this._polygon[0]=n.slice(),this._polygon[this._polygon.length-1]=n.slice()):this._polygon[e]=n.slice(),this._notifyChanged$.next(this)},t.prototype.setCentroid2d=function(e,t){for(var r=this._polygon.map(function(e){return e[0]}),n=this._polygon.map(function(e){return e[1]}),i=Math.min.apply(Math,r),o=Math.max.apply(Math,r),a=Math.min.apply(Math,n),s=Math.max.apply(Math,n),c=this.getCentroid2d(),u=-i,h=1-o,l=-a,p=1-s,f=Math.max(u,Math.min(h,e[0]-c[0])),d=Math.max(l,Math.min(p,e[1]-c[1])),m=0,v=this._polygon;m<v.length;m++){var g=v[m];g[0]+=f,g[1]+=d}this._notifyChanged$.next(this)},t.prototype.getPoints3d=function(e){return this.getVertices3d(e)},t.prototype.getVertex3d=function(e,t){return t.unprojectBasic(this._polygon[e],200)},t.prototype.getVertices2d=function(){return this._polygon.slice()},t.prototype.getVertices3d=function(e){return this._polygon.map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getHoleVertices3d=function(e){for(var t=[],r=0,n=this._holes;r<n.length;r++){var i=n[r].map(function(t){return e.unprojectBasic(t,200)});t.push(i)}return t},t.prototype.getCentroid2d=function(){for(var e=this._polygon,t=0,r=0,n=0,i=0;i<e.length-1;i++){var o=e[i][0],a=e[i][1],s=e[i+1][0],c=e[i+1][1],u=o*c-s*a;t+=u,r+=(o+s)*u,n+=(a+c)*u}return t/=2,r/=6*t,n/=6*t,[r,n]},t.prototype.getCentroid3d=function(e){var t=this.getCentroid2d();return e.unprojectBasic(t,200)},t.prototype.getTriangles3d=function(e){return this._triangulate(this._polygon,this.getPoints3d(e),this._holes,this.getHoleVertices3d(e))},t.prototype.getPoleOfAccessibility2d=function(){return this._getPoleOfInaccessibility2d(this._polygon.slice())},t.prototype.getPoleOfAccessibility3d=function(e){var t=this._getPoleOfInaccessibility2d(this._polygon.slice());return e.unprojectBasic(t,200)},t}(i.VertexGeometry);r.PolygonGeometry=o,r.default=o},{"../../../Component":281}],356:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(t){var r=e.call(this)||this;if(t[1]>t[3])throw new i.GeometryTagError("Basic Y coordinates values can not be inverted.");for(var n=0,o=t;n<o.length;n++){var a=o[n];if(a<0||a>1)throw new i.GeometryTagError("Basic coordinates must be on the interval [0, 1].")}return r._anchorIndex=void 0,r._rect=t.slice(0,4),r._inverted=r._rect[0]>r._rect[2],r}return n(t,e),Object.defineProperty(t.prototype,"anchorIndex",{get:function(){return this._anchorIndex},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"inverted",{get:function(){return this._inverted},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rect",{get:function(){return this._rect},enumerable:!0,configurable:!0}),t.prototype.initializeAnchorIndexing=function(e){if(void 0!==this._anchorIndex)throw new Error("Anchor indexing is already initialized.");if(e<0||e>3)throw new Error("Invalid anchor index: "+e+".");this._anchorIndex=void 0===e?0:e},t.prototype.terminateAnchorIndexing=function(){this._anchorIndex=void 0},t.prototype.setOppositeVertex2d=function(e,t){if(void 0===this._anchorIndex)throw new Error("Anchor indexing needs to be initialized.");var r=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))],n=this._rect.slice(),i=0===this._anchorIndex?[n[0],n[3]]:1===this._anchorIndex?[n[0],n[1]]:2===this._anchorIndex?[n[2],n[1]]:[n[2],n[3]];if(t.fullPano){var o=this._anchorIndex<2?r[0]-n[2]:r[0]-n[0];!this._inverted&&this._anchorIndex<2&&r[0]<.25&&n[2]>.75&&o<-.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?0:1):!this._inverted&&this._anchorIndex>=2&&r[0]<.25&&n[2]>.75&&o<-.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?0:1):this._inverted&&this._anchorIndex>=2&&r[0]<.25&&n[0]>.75&&o<-.5?(this._inverted=!1,this._anchorIndex=i[0]>r[0]?i[1]>r[1]?3:2:i[1]>r[1]?0:1):!this._inverted&&this._anchorIndex>=2&&r[0]>.75&&n[0]<.25&&o>.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?3:2):!this._inverted&&this._anchorIndex<2&&r[0]>.75&&n[0]<.25&&o>.5?(this._inverted=!0,this._anchorIndex=i[1]>r[1]?3:2):this._inverted&&this._anchorIndex<2&&r[0]>.75&&n[2]<.25&&o>.5?(this._inverted=!1,this._anchorIndex=i[0]>r[0]?i[1]>r[1]?3:2:i[1]>r[1]?0:1):this._inverted&&this._anchorIndex<2&&r[0]>n[0]?(this._inverted=!1,this._anchorIndex=i[1]>r[1]?0:1):this._inverted&&this._anchorIndex>=2&&r[0]<n[2]?(this._inverted=!1,this._anchorIndex=i[1]>r[1]?3:2):this._inverted?this._anchorIndex<2?this._anchorIndex=i[1]>r[1]?0:1:this._anchorIndex=i[1]>r[1]?3:2:this._anchorIndex=i[0]<=r[0]&&i[1]>r[1]?0:i[0]<=r[0]&&i[1]<=r[1]?1:i[0]>r[0]&&i[1]<=r[1]?2:3;a=[];0===this._anchorIndex?(a[0]=i[0],a[1]=r[1],a[2]=r[0],a[3]=i[1]):1===this._anchorIndex?(a[0]=i[0],a[1]=i[1],a[2]=r[0],a[3]=r[1]):2===this._anchorIndex?(a[0]=r[0],a[1]=i[1],a[2]=i[0],a[3]=r[1]):(a[0]=r[0],a[1]=r[1],a[2]=i[0],a[3]=i[1]),(!this._inverted&&a[0]>a[2]||this._inverted&&a[0]<a[2])&&(a[0]=n[0],a[2]=n[2]),a[1]>a[3]&&(a[1]=n[1],a[3]=n[3]),this._rect[0]=a[0],this._rect[1]=a[1],this._rect[2]=a[2],this._rect[3]=a[3]}else{this._anchorIndex=i[0]<=r[0]&&i[1]>r[1]?0:i[0]<=r[0]&&i[1]<=r[1]?1:i[0]>r[0]&&i[1]<=r[1]?2:3;var a=[];0===this._anchorIndex?(a[0]=i[0],a[1]=r[1],a[2]=r[0],a[3]=i[1]):1===this._anchorIndex?(a[0]=i[0],a[1]=i[1],a[2]=r[0],a[3]=r[1]):2===this._anchorIndex?(a[0]=r[0],a[1]=i[1],a[2]=i[0],a[3]=r[1]):(a[0]=r[0],a[1]=r[1],a[2]=i[0],a[3]=i[1]),a[0]>a[2]&&(a[0]=n[0],a[2]=n[2]),a[1]>a[3]&&(a[1]=n[1],a[3]=n[3]),this._rect[0]=a[0],this._rect[1]=a[1],this._rect[2]=a[2],this._rect[3]=a[3]}this._notifyChanged$.next(this)},t.prototype.setVertex2d=function(e,t,r){var n=this._rect.slice(),i=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))],o=[];if(0===e?(o[0]=i[0],o[1]=n[1],o[2]=n[2],o[3]=i[1]):1===e?(o[0]=i[0],o[1]=i[1],o[2]=n[2],o[3]=n[3]):2===e?(o[0]=n[0],o[1]=i[1],o[2]=i[0],o[3]=n[3]):3===e&&(o[0]=n[0],o[1]=n[1],o[2]=i[0],o[3]=i[1]),r.fullPano){var a=e<2&&i[0]>.75&&n[0]<.25||e>=2&&this._inverted&&i[0]>.75&&n[2]<.25,s=e<2&&this._inverted&&i[0]<.25&&n[0]>.75||e>=2&&i[0]<.25&&n[2]>.75;a||s?this._inverted=!this._inverted:(o[0]-n[0]<-.25&&(o[0]=n[0]),o[2]-n[2]>.25&&(o[2]=n[2])),(!this._inverted&&o[0]>o[2]||this._inverted&&o[0]<o[2])&&(o[0]=n[0],o[2]=n[2])}else o[0]>o[2]&&(o[0]=n[0],o[2]=n[2]);o[1]>o[3]&&(o[1]=n[1],o[3]=n[3]),this._rect[0]=o[0],this._rect[1]=o[1],this._rect[2]=o[2],this._rect[3]=o[3],this._notifyChanged$.next(this)},t.prototype.setCentroid2d=function(e,t){var r=this._rect.slice(),n=r[0],i=this._inverted?r[2]+1:r[2],o=r[1],a=r[3],s=n+(i-n)/2,c=o+(a-o)/2,u=0;if(null!=t.gpano&&t.gpano.CroppedAreaImageWidthPixels===t.gpano.FullPanoWidthPixels)u=this._inverted?e[0]+1-s:e[0]-s;else{var h=-n,l=1-i;u=Math.max(h,Math.min(l,e[0]-s))}var p=-o,f=1-a,d=Math.max(p,Math.min(f,e[1]-c));this._rect[0]=r[0]+u,this._rect[1]=r[1]+d,this._rect[2]=r[2]+u,this._rect[3]=r[3]+d,this._rect[0]<0?(this._rect[0]+=1,this._inverted=!this._inverted):this._rect[0]>1&&(this._rect[0]-=1,this._inverted=!this._inverted),this._rect[2]<0?(this._rect[2]+=1,this._inverted=!this._inverted):this._rect[2]>1&&(this._rect[2]-=1,this._inverted=!this._inverted),this._notifyChanged$.next(this)},t.prototype.getPoints3d=function(e){return this._getPoints2d(e).map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getVertex2d=function(e){return this._rectToVertices2d(this._rect)[e]},t.prototype.getNonAdjustedVertex2d=function(e){return this._rectToNonAdjustedVertices2d(this._rect)[e]},t.prototype.getVertex3d=function(e,t){return t.unprojectBasic(this._rectToVertices2d(this._rect)[e],200)},t.prototype.getVertices2d=function(){return this._rectToVertices2d(this._rect)},t.prototype.getVertices3d=function(e){return this._rectToVertices2d(this._rect).map(function(t){return e.unprojectBasic(t,200)})},t.prototype.getCentroid2d=function(){var e=this._rect,t=e[0],r=this._inverted?e[2]+1:e[2],n=e[1];return[t+(r-t)/2,n+(e[3]-n)/2]},t.prototype.getCentroid3d=function(e){var t=this.getCentroid2d();return e.unprojectBasic(t,200)},t.prototype.getPoleOfAccessibility2d=function(){return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect))},t.prototype.getPoleOfAccessibility3d=function(e){var t=this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));return e.unprojectBasic(t,200)},t.prototype.getTriangles3d=function(e){return this._triangulate(this._rectToVertices2d(this._rect),this.getVertices3d(e))},t.prototype.validate=function(e){var t=this._rect;return!(!this._inverted&&e[0]<t[0]||e[0]-t[2]>.25||e[1]<t[1])},t.prototype._getPoints2d=function(e){for(var t=this._rectToVertices2d(this._rect),r=t.length-1,n=[],i=0;i<r;++i)for(var o=t[i][0],a=t[i][1],s=(t[i+1][0]-o)/9,c=(t[i+1][1]-a)/9,u=0;u<10;++u){var h=[o+u*s,a+u*c];n.push(h)}return n},t.prototype._rectToVertices2d=function(e){return[[e[0],e[3]],[e[0],e[1]],[this._inverted?e[2]+1:e[2],e[1]],[this._inverted?e[2]+1:e[2],e[3]],[e[0],e[3]]]},t.prototype._rectToNonAdjustedVertices2d=function(e){return[[e[0],e[3]],[e[0],e[1]],[e[2],e[1]],[e[2],e[3]],[e[0],e[3]]]},t}(i.VertexGeometry);r.RectGeometry=o,r.default=o},{"../../../Component":281}],357:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("earcut"),o=e("@mapbox/polylabel"),a=function(e){function t(){return e.call(this)||this}return n(t,e),t.prototype._getPoleOfInaccessibility2d=function(e){return o([e],.03)},t.prototype._triangulate=function(e,t,r,n){for(var o=[e.slice(0,-1)],a=0,s=null!=r?r:[];a<s.length;a++){var c=s[a];o.push(c.slice(0,-1))}for(var u=t.slice(0,-1),h=0,l=null!=n?n:[];h<l.length;h++){var p=l[h];u=u.concat(p.slice(0,-1))}for(var f=i.flatten(o),d=i(f.vertices,f.holes,f.dimensions),m=[],v=0;v<d.length;++v){var g=u[d[v]];m.push(g[0]),m.push(g[1]),m.push(g[2])}return m},t}(e("../../../Component").Geometry);r.VertexGeometry=a,r.default=a},{"../../../Component":281,"@mapbox/polylabel":1,earcut:8}],358:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject"),o=function(e){function t(t,r,n,o,a){var s=e.call(this,t,r,n,o)||this;return s._tagCreator=a,s._geometryCreated$=new i.Subject,s}return n(t,e),Object.defineProperty(t.prototype,"geometryCreated$",{get:function(){return this._geometryCreated$},enumerable:!0,configurable:!0}),t.prototype._enable=function(){this._enableCreate(),this._container.element.classList.add("component-tag-create")},t.prototype._disable=function(){this._container.element.classList.remove("component-tag-create"),this._disableCreate()},t.prototype._validateBasic=function(e){var t=e[0],r=e[1];return 0<=t&&t<=1&&0<=r&&r<=1},t.prototype._mouseEventToBasic$=function(e){var t=this;return e.withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).map(function(e){var r=e[0],n=e[1],i=e[2];return t._mouseEventToBasic(r,t._container.element,n,i)})},t}(e("../../../Component").TagHandlerBase);r.CreateHandlerBase=o,r.default=o},{"../../../Component":281,"rxjs/Subject":34}],359:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../../Component"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){this._container.mouseService.deferPixels(this._name,4),this._geometryCreatedSubscription=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).filter(this._validateBasic).map(function(e){return new i.PointGeometry(e)}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.undeferPixels(this._name),this._geometryCreatedSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-point"},t}(i.CreateHandlerBase);r.CreatePointHandler=o,r.default=o},{"../../../Component":281}],360:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._addPoint=function(e,t){e.addPoint(t)},Object.defineProperty(t.prototype,"_create$",{get:function(){return this._tagCreator.createPolygon$},enumerable:!0,configurable:!0}),t.prototype._getNameExtension=function(){return"create-polygon"},t.prototype._setVertex2d=function(e,t,r){e.geometry.setVertex2d(e.geometry.polygon.length-2,t,r)},t}(e("../../../Component").CreateVertexHandler);r.CreatePolygonHandler=i,r.default=i},{"../../../Component":281}],361:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){var e=this;this._container.mouseService.claimMouse(this._name,2),this._deleteSubscription=this._navigator.stateService.currentTransform$.map(function(e){return null}).skip(1).subscribe(this._tagCreator.delete$),this._createSubscription=this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$)).filter(this._validateBasic).subscribe(this._tagCreator.createRect$),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.filter(function(e){return!!e}).subscribe(function(e){e.geometry.initializeAnchorIndexing()});var t=i.Observable.merge(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseMove$),this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseMove$)).combineLatest(this._container.renderService.renderCamera$).withLatestFrom(this._navigator.stateService.currentTransform$).map(function(t){var r=t[0],n=r[0],i=r[1],o=t[1];return e._mouseEventToBasic(n,e._container.element,i,o)});this._setVertexSubscription=this._tagCreator.tag$.switchMap(function(r){return r?i.Observable.combineLatest(i.Observable.of(r),t,e._navigator.stateService.currentTransform$):i.Observable.empty()}).subscribe(function(e){var t=e[0],r=e[1],n=e[2];t.geometry.setOppositeVertex2d(r,n)});var r=this._container.mouseService.mouseDragEnd$.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$)).filter(this._validateBasic),function(e,t){return t}).share();this._addPointSubscription=this._tagCreator.tag$.switchMap(function(e){return e?i.Observable.combineLatest(i.Observable.of(e),r):i.Observable.empty()}).subscribe(function(e){var t=e[0],r=e[1],n=t.geometry;n.validate(r)||(r=n.getNonAdjustedVertex2d(3)),t.addPoint(r)}),this._geometryCreatedSubscription=this._tagCreator.tag$.switchMap(function(e){return e?e.created$.map(function(e){return e.geometry}):i.Observable.empty()}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.unclaimMouse(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreatedSubscription.unsubscribe(),this._initializeAnchorIndexingSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-rect-drag"},t}(e("../../../Component").CreateHandlerBase);r.CreateRectDragHandler=o,r.default=o},{"../../../Component":281,"rxjs/Observable":29}],362:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),Object.defineProperty(t.prototype,"_create$",{get:function(){return this._tagCreator.createRect$},enumerable:!0,configurable:!0}),t.prototype._addPoint=function(e,t){var r=e.geometry;r.validate(t)||(t=r.getNonAdjustedVertex2d(3)),e.addPoint(t)},t.prototype._enable=function(){e.prototype._enable.call(this),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.filter(function(e){return!!e}).subscribe(function(e){e.geometry.initializeAnchorIndexing()})},t.prototype._disable=function(){e.prototype._disable.call(this),this._initializeAnchorIndexingSubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"create-rect"},t.prototype._setVertex2d=function(e,t,r){e.geometry.setOppositeVertex2d(t,r)},t}(e("../../../Component").CreateVertexHandler);r.CreateRectHandler=i,r.default=i},{"../../../Component":281}],363:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype._enableCreate=function(){var e=this;this._container.mouseService.deferPixels(this._name,4);var t=this._navigator.stateService.currentTransform$.map(function(e){}).publishReplay(1).refCount();this._deleteSubscription=t.skip(1).subscribe(this._tagCreator.delete$);var r=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).share();this._createSubscription=t.switchMap(function(){return r.filter(e._validateBasic).take(1)}).subscribe(this._create$),this._setVertexSubscription=this._tagCreator.tag$.switchMap(function(t){return t?i.Observable.combineLatest(i.Observable.of(t),i.Observable.merge(e._container.mouseService.mouseMove$,e._container.mouseService.domMouseMove$),e._container.renderService.renderCamera$,e._navigator.stateService.currentTransform$):i.Observable.empty()}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],o=t[3],a=e._mouseEventToBasic(n,e._container.element,i,o);e._setVertex2d(r,a,o)}),this._addPointSubscription=this._tagCreator.tag$.switchMap(function(e){return e?i.Observable.combineLatest(i.Observable.of(e),r):i.Observable.empty()}).subscribe(function(t){var r=t[0],n=t[1];e._addPoint(r,n)}),this._geometryCreateSubscription=this._tagCreator.tag$.switchMap(function(e){return e?e.created$.map(function(e){return e.geometry}):i.Observable.empty()}).subscribe(this._geometryCreated$)},t.prototype._disableCreate=function(){this._container.mouseService.undeferPixels(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreateSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()},t}(e("../../../Component").CreateHandlerBase);r.CreateVertexHandler=o,r.default=o},{"../../../Component":281,"rxjs/Observable":29}],364:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Observable"),o=e("../../../Component"),a=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r,n,i)||this;return a._tagSet=o,a}return n(t,e),t.prototype._enable=function(){var e=this,t=this._tagSet.changed$.map(function(e){return e.getAll()}).switchMap(function(e){return i.Observable.from(e).mergeMap(function(e){return e.interact$})}).switchMap(function(t){return i.Observable.of(t).concat(e._container.mouseService.documentMouseUp$.map(function(){return{offsetX:0,offsetY:0,operation:o.TagOperation.None,tag:null}}).first())}).share(),r=i.Observable.merge(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$).share();this._claimMouseSubscription=t.switchMap(function(t){return t.tag?e._container.mouseService.domMouseDragStart$:i.Observable.empty()}).subscribe(function(){e._container.mouseService.claimMouse(e._name,3)}),this._cursorSubscription=t.map(function(e){return e.cursor}).distinctUntilChanged().subscribe(function(t){for(var r=0,n=["crosshair","move","nesw-resize","nwse-resize"];r<n.length;r++){var i=n[r];e._container.element.classList.remove("component-tag-edit-"+i)}t&&e._container.element.classList.add("component-tag-edit-"+t)}),this._unclaimMouseSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDragEnd$).subscribe(function(t){e._container.mouseService.unclaimMouse(e._name)}),this._preventDefaultSubscription=t.switchMap(function(t){return t.tag?e._container.mouseService.documentMouseMove$:i.Observable.empty()}).subscribe(function(e){e.preventDefault()}),this._updateGeometrySubscription=t.withLatestFrom(r).switchMap(function(t){var r=t[0],n=t[1];if(r.operation===o.TagOperation.None||!r.tag)return i.Observable.empty();var a=i.Observable.of(n).concat(e._container.mouseService.filtered$(e._name,e._container.mouseService.domMouseDrag$).filter(function(t){return e._viewportCoords.insideElement(t,e._container.element)}));return i.Observable.combineLatest(a,e._container.renderService.renderCamera$).withLatestFrom(i.Observable.of(r),e._navigator.stateService.currentTransform$,function(e,t,r){return[e[0],e[1],t,r]})}).subscribe(function(t){var r=t[0],n=t[1],i=t[2],a=t[3],s=e._mouseEventToBasic(r,e._container.element,n,a,i.offsetX,i.offsetY),c=i.tag.geometry;i.operation===o.TagOperation.Centroid?c.setCentroid2d(s,a):i.operation===o.TagOperation.Vertex&&c.setVertex2d(i.vertexIndex,s,a)})},t.prototype._disable=function(){this._claimMouseSubscription.unsubscribe(),this._cursorSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._unclaimMouseSubscription.unsubscribe(),this._updateGeometrySubscription.unsubscribe()},t.prototype._getNameExtension=function(){return"edit-vertex"},t}(o.TagHandlerBase);r.EditVertexHandler=a,r.default=a},{"../../../Component":281,"rxjs/Observable":29}],365:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n)||this;return o._name=o._component.name+"-"+o._getNameExtension(),o._viewportCoords=i,o}return n(t,e),t.prototype._getConfiguration=function(e){return{}},t.prototype._mouseEventToBasic=function(e,t,r,n,i,o){i=null!=i?i:0,o=null!=o?o:0;var a=this._viewportCoords.canvasPosition(e,t),s=a[0],c=a[1];return this._viewportCoords.canvasToBasic(s-i,c-o,t,n,r.perspective)},t}(e("../../../Component").HandlerBase);r.TagHandlerBase=i,r.default=i},{"../../../Component":281}],366:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("virtual-dom"),o=e("rxjs/Subject"),a=e("../../../Component"),s=e("../../../Geo"),c=function(){function e(e,t,r,n){var i=this;this._geometry=e,this._options={color:null==t.color?16777215:t.color},this._transform=r,this._viewportCoords=n||new s.ViewportCoords,this._outline=this._createOutine(),this._glObjects=[this._outline],this._aborted$=new o.Subject,this._created$=new o.Subject,this._glObjectsChanged$=new o.Subject,this._geometryChangedSubscription=this._geometry.changed$.subscribe(function(e){i._disposeOutline(),i._outline=i._createOutine(),i._glObjects=[i._outline],i._glObjectsChanged$.next(i)})}return Object.defineProperty(e.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glObjects",{get:function(){return this._glObjects},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aborted$",{get:function(){return this._aborted$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"created$",{get:function(){return this._created$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"glObjectsChanged$",{get:function(){return this._glObjectsChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"geometryChanged$",{get:function(){var e=this;return this._geometry.changed$.map(function(t){return e})},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._disposeOutline(),this._geometryChangedSubscription.unsubscribe()},e.prototype.getDOMObjects=function(e,t){var r=this,n=[],o={offsetHeight:t.height,offsetWidth:t.width},s=function(e){e.stopPropagation(),r._aborted$.next(r)};if(this._geometry instanceof a.RectGeometry){var c=this._geometry.anchorIndex,u=void 0===c?1:c,h=this._geometry.getVertex2d(u),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,o,this._transform,e);if(null!=f){var d={style:{background:A=this._colorToBackground(this._options.color),transform:R=this._canvasToTransform(f)}},m={onclick:s,style:{transform:R}};n.push(i.h("div.TagInteractor",m,[])),n.push(i.h("div.TagVertex",d,[]))}}else if(this._geometry instanceof a.PolygonGeometry){var v=this._geometry,g=v.getVertex2d(0),y=g[0],b=g[1],_=this._viewportCoords.basicToCanvasSafe(y,b,o,this._transform,e);if(null!=_){var m={onclick:v.polygon.length>4?function(e){e.stopPropagation(),v.removeVertex2d(v.polygon.length-2),r._created$.next(r)}:s,style:{transform:R=this._canvasToTransform(_)}},x=v.polygon.length>4?"TagCompleter":"TagInteractor";n.push(i.h("div."+x,m,[]))}if(v.polygon.length>3){var w=v.getVertex2d(v.polygon.length-3),S=w[0],M=w[1],E=this._viewportCoords.basicToCanvasSafe(S,M,o,this._transform,e);if(null!=E){m={onclick:function(e){e.stopPropagation(),v.removeVertex2d(v.polygon.length-3)},style:{transform:R=this._canvasToTransform(E)}};n.push(i.h("div.TagInteractor",m,[]))}}var C=v.polygon.slice();C.splice(-2,2);for(var T=0,O=C;T<O.length;T++){var P=O[T],j=this._viewportCoords.basicToCanvasSafe(P[0],P[1],o,this._transform,e);if(null!=j){var A=this._colorToBackground(this._options.color),R=this._canvasToTransform(j),d={style:{background:A,transform:R}};n.push(i.h("div.TagVertex",d,[]))}}}return n},e.prototype.addPoint=function(e){if(this._geometry instanceof a.RectGeometry){if(!this._geometry.validate(e))return;this._created$.next(this)}else if(this._geometry instanceof a.PolygonGeometry){this._geometry.addVertex2d(e)}},e.prototype._canvasToTransform=function(e){return"translate(-50%,-50%) translate("+Math.round(e[0])+"px,"+Math.round(e[1])+"px)"},e.prototype._colorToBackground=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},e.prototype._createOutine=function(){var e=this._geometry.getPoints3d(this._transform),t=this._getLinePositions(e),r=new n.BufferGeometry;r.addAttribute("position",new n.BufferAttribute(t,3));var i=new n.LineBasicMaterial({color:this._options.color,linewidth:1});return new n.Line(r,i)},e.prototype._disposeOutline=function(){if(null!=this._outline){var e=this._outline;e.geometry.dispose(),e.material.dispose(),this._outline=null,this._glObjects=[]}},e.prototype._getLinePositions=function(e){for(var t=e.length,r=new Float32Array(3*t),n=0;n<t;++n){var i=3*n,o=e[n];r[i]=o[0],r[i+1]=o[1],r[i+2]=o[2]}return r},e}();r.OutlineCreateTag=c,r.default=c},{"../../../Component":281,"../../../Geo":284,"rxjs/Subject":34,three:231,"virtual-dom":237}],367:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("virtual-dom"),a=e("../../../Component"),s=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._fill=r.gpano?null:n._createFill(),n._holes=n._tag.lineWidth>=1?n._createHoles():[],n._outline=n._tag.lineWidth>=1?n._createOutline():null,n._geometryChangedSubscription=n._tag.geometry.changed$.subscribe(function(e){null!=n._fill&&n._updateFillGeometry(),n._holes.length>0&&n._updateHoleGeometries(),null!=n._outline&&n._updateOulineGeometry()}),n._changedSubscription=n._tag.changed$.subscribe(function(e){var t=!1;null!=n._fill&&n._updateFillMaterial(n._fill.material),null==n._outline?n._tag.lineWidth>=1&&(n._holes=n._createHoles(),n._outline=n._createOutline(),t=!0):(n._updateHoleMaterials(),n._updateOutlineMaterial()),t&&n._glObjectsChanged$.next(n)}),n}return n(t,e),t.prototype.dispose=function(){this._disposeFill(),this._disposeHoles(),this._disposeOutline(),this._changedSubscription.unsubscribe(),this._geometryChangedSubscription.unsubscribe()},t.prototype.getDOMObjects=function(e,t,r){var n=this,i=[],s=this._tag.geometry instanceof a.RectGeometry,c=!this._transform.gpano,u={offsetHeight:r.height,offsetWidth:r.width};if(null!=this._tag.icon&&(s||c)){var h=this._tag.geometry instanceof a.RectGeometry?this._tag.geometry.getVertex2d(this._tag.iconIndex):this._tag.geometry.getPoleOfAccessibility2d(),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,u,this._transform,t);if(null!=f){N=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:a.TagOperation.None,tag:n._tag})};if(e.loaded){var d=e.getDOMSprite(this._tag.icon,this._tag.iconFloat),m={onclick:function(e){e.stopPropagation(),n._tag.click$.next(n._tag)},onmousedown:N,style:{transform:w="translate("+Math.round(f[0])+"px,"+Math.round(f[1])+"px)"}};i.push(o.h("div.TagSymbol",m,[d]))}}}else if(null!=this._tag.text&&(s||c)){var v=this._tag.geometry instanceof a.RectGeometry?this._tag.geometry.getVertex2d(3):this._tag.geometry.getPoleOfAccessibility2d(),g=v[0],y=v[1],b=this._viewportCoords.basicToCanvasSafe(g,y,u,this._transform,t);if(null!=b){var _=Math.round(b[0]),x=Math.round(b[1]),w=this._tag.geometry instanceof a.RectGeometry?"translate("+_+"px,"+x+"px)":"translate(-50%, -50%) translate("+_+"px,"+x+"px)",m={onmousedown:N=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:a.TagOperation.None,tag:n._tag})},style:{color:this._colorToCss(this._tag.textColor),transform:w},textContent:this._tag.text};i.push(o.h("span.TagSymbol",m,[]))}}if(!this._tag.editable)return i;var S=this._colorToCss(this._tag.lineColor);if(this._tag.geometry instanceof a.RectGeometry){var M=this._tag.geometry.getCentroid2d(),E=M[0],C=M[1],T=this._viewportCoords.basicToCanvasSafe(E,C,u,this._transform,t);if(null!=T){m={onmousedown:N=this._interact(a.TagOperation.Centroid,"move"),style:{background:S,transform:w="translate(-50%, -50%) translate("+Math.round(T[0])+"px,"+Math.round(T[1])+"px)"}};i.push(o.h("div.TagMover",m,[]))}}for(var O=this._tag.geometry.getVertices2d(),P=0;P<O.length-1;P++)if(!s||!(null!=this._tag.icon&&P===this._tag.iconIndex||null==this._tag.icon&&null!=this._tag.text&&3===P)){var j=O[P],A=j[0],R=j[1],L=this._viewportCoords.basicToCanvasSafe(A,R,u,this._transform,t);if(null!=L){var N,I=s?P%2==0?"nesw-resize":"nwse-resize":"crosshair",m={onmousedown:N=this._interact(a.TagOperation.Vertex,I,P),style:{background:S,transform:w="translate(-50%, -50%) translate("+Math.round(L[0])+"px,"+Math.round(L[1])+"px)",cursor:I}};if(i.push(o.h("div.TagResizer",m,[])),this._tag.indicateVertices){var D={style:{background:S,transform:w}};i.push(o.h("div.TagVertex",D,[]))}}}return i},t.prototype.getGLObjects=function(){var e=[];null!=this._fill&&e.push(this._fill);for(var t=0,r=this._holes;t<r.length;t++){var n=r[t];e.push(n)}return null!=this._outline&&e.push(this._outline),e},t.prototype.getRetrievableObjects=function(){return null!=this._fill?[this._fill]:[]},t.prototype._colorToCss=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},t.prototype._createFill=function(){var e=this._tag.geometry.getTriangles3d(this._transform),t=new Float32Array(e),r=new i.BufferGeometry;r.addAttribute("position",new i.BufferAttribute(t,3)),r.computeBoundingSphere();var n=new i.MeshBasicMaterial({side:i.DoubleSide,transparent:!0});return this._updateFillMaterial(n),new i.Mesh(r,n)},t.prototype._createHoles=function(){var e=[];if(this._tag.geometry instanceof a.PolygonGeometry)for(var t=0,r=this._tag.geometry.getHoleVertices3d(this._transform);t<r.length;t++){var n=r[t],i=this._createLine(n);e.push(i)}return e},t.prototype._createLine=function(e){var t=this._getLinePositions(e),r=new i.BufferGeometry;r.addAttribute("position",new i.BufferAttribute(t,3)),r.computeBoundingSphere();var n=new i.LineBasicMaterial;this._updateLineBasicMaterial(n);var o=new i.Line(r,n);return o.renderOrder=1,o},t.prototype._createOutline=function(){var e=this._tag.geometry.getPoints3d(this._transform);return this._createLine(e)},t.prototype._disposeFill=function(){null!=this._fill&&(this._fill.geometry.dispose(),this._fill.material.dispose(),this._fill=null)},t.prototype._disposeHoles=function(){for(var e=0,t=this._holes;e<t.length;e++){var r=t[e];r.geometry.dispose(),r.material.dispose()}this._holes=[]},t.prototype._disposeOutline=function(){null!=this._outline&&(this._outline.geometry.dispose(),this._outline.material.dispose(),this._outline=null)},t.prototype._getLinePositions=function(e){for(var t=e.length,r=new Float32Array(3*t),n=0;n<t;++n){var i=3*n,o=e[n];r[i+0]=o[0],r[i+1]=o[1],r[i+2]=o[2]}return r},t.prototype._interact=function(e,t,r){var n=this;return function(i){var o=i.offsetX-i.target.offsetWidth/2,a=i.offsetY-i.target.offsetHeight/2;n._interact$.next({cursor:t,offsetX:o,offsetY:a,operation:e,tag:n._tag,vertexIndex:r})}},t.prototype._updateFillGeometry=function(){var e=this._tag.geometry.getTriangles3d(this._transform),t=new Float32Array(e),r=this._fill.geometry,n=r.getAttribute("position");n.array.length===t.length?(n.set(t),n.needsUpdate=!0):(r.removeAttribute("position"),r.addAttribute("position",new i.BufferAttribute(t,3))),r.computeBoundingSphere()},t.prototype._updateFillMaterial=function(e){e.color=new i.Color(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0},t.prototype._updateHoleGeometries=function(){var e=this._tag.geometry.getHoleVertices3d(this._transform);if(e.length!==this._holes.length)throw new Error("Changing the number of holes is not supported.");for(var t=0;t<this._holes.length;t++){var r=e[t],n=this._holes[t];this._updateLine(n,r)}},t.prototype._updateHoleMaterials=function(){for(var e=0,t=this._holes;e<t.length;e++){var r=t[e].material;this._updateLineBasicMaterial(r)}},t.prototype._updateLine=function(e,t){var r=this._getLinePositions(t),n=e.geometry,i=n.getAttribute("position");i.set(r),i.needsUpdate=!0,n.computeBoundingSphere()},t.prototype._updateOulineGeometry=function(){var e=this._tag.geometry.getPoints3d(this._transform);this._updateLine(this._outline,e)},t.prototype._updateOutlineMaterial=function(){var e=this._outline.material;this._updateLineBasicMaterial(e)},t.prototype._updateLineBasicMaterial=function(e){e.color=new i.Color(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0},t}(a.RenderTag);r.OutlineRenderTag=s},{"../../../Component":281,three:231,"virtual-dom":237}],368:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject"),o=e("../../../Component"),a=e("../../../Viewer"),s=function(e){function t(r,n,o){var s=e.call(this,r,n)||this;return o=o||{},s._editable=null!=o.editable&&o.editable,s._fillColor=null==o.fillColor?16777215:o.fillColor,s._fillOpacity=null==o.fillOpacity?0:o.fillOpacity,s._icon=void 0===o.icon?null:o.icon,s._iconFloat=null==o.iconFloat?a.Alignment.Center:o.iconFloat,s._iconIndex=null==o.iconIndex?3:o.iconIndex,s._indicateVertices=null==o.indicateVertices||o.indicateVertices,s._lineColor=null==o.lineColor?16777215:o.lineColor,s._lineOpacity=null==o.lineOpacity?1:o.lineOpacity,s._lineWidth=null==o.lineWidth?1:o.lineWidth,s._text=void 0===o.text?null:o.text,s._textColor=null==o.textColor?16777215:o.textColor,s._click$=new i.Subject,s._click$.subscribe(function(e){s.fire(t.click,s)}),s}return n(t,e),Object.defineProperty(t.prototype,"click$",{get:function(){return this._click$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"editable",{get:function(){return this._editable},set:function(e){this._editable=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fillColor",{get:function(){return this._fillColor},set:function(e){this._fillColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fillOpacity",{get:function(){return this._fillOpacity},set:function(e){this._fillOpacity=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"icon",{get:function(){return this._icon},set:function(e){this._icon=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"iconFloat",{get:function(){return this._iconFloat},set:function(e){this._iconFloat=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"iconIndex",{get:function(){return this._iconIndex},set:function(e){this._iconIndex=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"indicateVertices",{get:function(){return this._indicateVertices},set:function(e){this._indicateVertices=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineColor",{get:function(){return this._lineColor},set:function(e){this._lineColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineOpacity",{get:function(){return this._lineOpacity},set:function(e){this._lineOpacity=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lineWidth",{get:function(){return this._lineWidth},set:function(e){this._lineWidth=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"textColor",{get:function(){return this._textColor},set:function(e){this._textColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),t.prototype.setOptions=function(e){this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._iconFloat=null==e.iconFloat?this._iconFloat:e.iconFloat,this._iconIndex=null==e.iconIndex?this._iconIndex:e.iconIndex,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)},t.click="click",t}(o.Tag);r.OutlineTag=s,r.default=s},{"../../../Component":281,"../../../Viewer":292,"rxjs/Subject":34}],369:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("../../../Geo"),o=function(){function e(e,t,r){this._tag=e,this._transform=t,this._viewportCoords=r||new i.ViewportCoords,this._glObjectsChanged$=new n.Subject,this._interact$=new n.Subject}return Object.defineProperty(e.prototype,"glObjectsChanged$",{get:function(){return this._glObjectsChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"interact$",{get:function(){return this._interact$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tag",{get:function(){return this._tag},enumerable:!0,configurable:!0}),e}();r.RenderTag=o,r.default=o},{"../../../Geo":284,"rxjs/Subject":34}],370:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("virtual-dom"),o=e("../../../Component"),a=e("../../../Viewer"),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.dispose=function(){},t.prototype.getDOMObjects=function(e,t,r){var n=this,s=this._tag,c={offsetHeight:r.height,offsetWidth:r.width},u=[],h=s.geometry.getCentroid2d(),l=h[0],p=h[1],f=this._viewportCoords.basicToCanvasSafe(l,p,c,this._transform,t);if(null!=f){var d=function(e){n._interact$.next({offsetX:0,offsetY:0,operation:o.TagOperation.None,tag:s})},m=Math.round(f[0]),v=Math.round(f[1]);if(null!=s.icon){if(e.loaded){var g=e.getDOMSprite(s.icon,a.Alignment.Bottom),y={onmousedown:d,style:{pointerEvents:"all",transform:"translate("+m+"px,"+(v+8)+"px)"}};u.push(i.h("div",y,[g]))}}else if(null!=s.text){var b="translate(-50%,0%) translate("+m+"px,"+(v+8)+"px)",y={onmousedown:d,style:{color:this._colorToCss(s.textColor),transform:b},textContent:s.text};u.push(i.h("span.TagSymbol",y,[]))}var _=this._interact(o.TagOperation.Centroid,s,"move"),x=this._colorToCss(s.color),w="translate(-50%,-50%) translate("+m+"px,"+v+"px)";if(s.editable){var S={onmousedown:_,style:{background:x,transform:w}};u.push(i.h("div.TagSpotInteractor",S,[]))}var M={style:{background:x,transform:w}};u.push(i.h("div.TagVertex",M,[]))}return u},t.prototype.getGLObjects=function(){return[]},t.prototype.getRetrievableObjects=function(){return[]},t.prototype._colorToCss=function(e){return"#"+("000000"+e.toString(16)).substr(-6)},t.prototype._interact=function(e,t,r,n){var i=this;return function(o){var a=o.offsetX-o.target.offsetWidth/2,s=o.offsetY-o.target.offsetHeight/2;i._interact$.next({cursor:r,offsetX:a,offsetY:s,operation:e,tag:t,vertexIndex:n})}},t}(o.RenderTag);r.SpotRenderTag=s},{"../../../Component":281,"../../../Viewer":292,"virtual-dom":237}],371:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t,r,n){var i=e.call(this,t,r)||this;return n=n||{},i._color=null==n.color?16777215:n.color,i._editable=null!=n.editable&&n.editable,i._icon=void 0===n.icon?null:n.icon,i._text=void 0===n.text?null:n.text,i._textColor=null==n.textColor?16777215:n.textColor,i}return n(t,e),Object.defineProperty(t.prototype,"color",{get:function(){return this._color},set:function(e){this._color=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"editable",{get:function(){return this._editable},set:function(e){this._editable=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"icon",{get:function(){return this._icon},set:function(e){this._icon=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"textColor",{get:function(){return this._textColor},set:function(e){this._textColor=e,this._notifyChanged$.next(this)},enumerable:!0,configurable:!0}),t.prototype.setOptions=function(e){this._color=null==e.color?this._color:e.color,this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)},t}(e("../../../Component").Tag);r.SpotTag=i,r.default=i},{"../../../Component":281}],372:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("rxjs/Subject");e("rxjs/add/operator/map"),e("rxjs/add/operator/share");var o=function(e){function t(r,n){var o=e.call(this)||this;return o._id=r,o._geometry=n,o._notifyChanged$=new i.Subject,o._notifyChanged$.subscribe(function(e){o.fire(t.changed,o)}),o._geometry.changed$.subscribe(function(e){o.fire(t.geometrychanged,o)}),o}return n(t,e),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometry",{get:function(){return this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"changed$",{get:function(){return this._notifyChanged$},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"geometryChanged$",{get:function(){var e=this;return this._geometry.changed$.map(function(t){return e}).share()},enumerable:!0,configurable:!0}),t.changed="changed",t.geometrychanged="geometrychanged",t}(e("../../../Utils").EventEmitter);r.Tag=o,r.default=o},{"../../../Utils":291,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":76}],373:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t,r){this._component=e,this._container=t,this._navigator=r,this._enabled=!1}return Object.defineProperty(e.prototype,"isEnabled",{get:function(){return this._enabled},enumerable:!0,configurable:!0}),e.prototype.enable=function(){!this._enabled&&this._component.activated&&(this._enable(),this._enabled=!0,this._component.configure(this._getConfiguration(!0)))},e.prototype.disable=function(){this._enabled&&(this._disable(),this._enabled=!1,this._component.activated&&this._component.configure(this._getConfiguration(!1)))},e}();r.HandlerBase=n,r.default=n},{}],374:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,null!=t?t:"The argument is not valid.")||this;return r.name="ArgumentMapillaryError",r}return n(t,e),t}(e("./MapillaryError").MapillaryError);r.ArgumentMapillaryError=i,r.default=i},{"./MapillaryError":376}],375:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,t)||this;return r.name="GraphMapillaryError",r}return n(t,e),t}(e("./MapillaryError").MapillaryError);r.GraphMapillaryError=i,r.default=i},{"./MapillaryError":376}],376:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=function(e){function t(t){var r=e.call(this,t)||this;return r.name="MapillaryError",r}return n(t,e),t}(Error);r.MapillaryError=i,r.default=i},{}],377:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e){null!=e?(this._position=(new n.Vector3).fromArray(e.unprojectSfM([0,0],0)),this._lookat=(new n.Vector3).fromArray(e.unprojectSfM([0,0],10)),this._up=e.upVector(),this._focal=this._getFocal(e)):(this._position=new n.Vector3(0,0,0),this._lookat=new n.Vector3(0,0,1),this._up=new n.Vector3(0,-1,0),this._focal=1)}return Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"lookat",{get:function(){return this._lookat},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"up",{get:function(){return this._up},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._focal},set:function(e){this._focal=e},enumerable:!0,configurable:!0}),e.prototype.lerpCameras=function(e,t,r){this._position.subVectors(t.position,e.position).multiplyScalar(r).add(e.position),this._lookat.subVectors(t.lookat,e.lookat).multiplyScalar(r).add(e.lookat),this._up.subVectors(t.up,e.up).multiplyScalar(r).add(e.up),this._focal=(1-r)*e.focal+r*t.focal},e.prototype.copy=function(e){this._position.copy(e.position),this._lookat.copy(e.lookat),this._up.copy(e.up),this._focal=e.focal},e.prototype.clone=function(){var t=new e;return t.position.copy(this._position),t.lookat.copy(this._lookat),t.up.copy(this._up),t.focal=this._focal,t},e.prototype.diff=function(e){var t=this._position.distanceToSquared(e.position),r=this._lookat.distanceToSquared(e.lookat),n=this._up.distanceToSquared(e.up),i=100*Math.abs(this._focal-e.focal);return Math.max(t,r,n,i)},e.prototype._getFocal=function(e){if(null==e.gpano)return e.focal;var t=Math.PI*e.gpano.CroppedAreaImageHeightPixels/e.gpano.FullPanoHeightPixels,r=.5/Math.tan(t/2);return Math.min(1/(2*(Math.sqrt(2)-1)),Math.max(.5,r))},e}();r.Camera=i},{three:231}],378:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._wgs84a=6378137,this._wgs84b=6356752.31424518}return e.prototype.geodeticToEnu=function(e,t,r,n,i,o){var a=this.geodeticToEcef(e,t,r);return this.ecefToEnu(a[0],a[1],a[2],n,i,o)},e.prototype.enuToGeodetic=function(e,t,r,n,i,o){var a=this.enuToEcef(e,t,r,n,i,o);return this.ecefToGeodetic(a[0],a[1],a[2])},e.prototype.ecefToEnu=function(e,t,r,n,i,o){var a=this.geodeticToEcef(n,i,o),s=[e-a[0],t-a[1],r-a[2]];n=n*Math.PI/180,i=i*Math.PI/180;var c=Math.cos(n),u=Math.sin(n),h=Math.cos(i),l=Math.sin(i);return[-l*s[0]+h*s[1],-u*h*s[0]-u*l*s[1]+c*s[2],c*h*s[0]+c*l*s[1]+u*s[2]]},e.prototype.enuToEcef=function(e,t,r,n,i,o){var a=this.geodeticToEcef(n,i,o);n=n*Math.PI/180,i=i*Math.PI/180;var s=Math.cos(n),c=Math.sin(n),u=Math.cos(i),h=Math.sin(i);return[-h*e-c*u*t+s*u*r+a[0],u*e-c*h*t+s*h*r+a[1],s*t+c*r+a[2]]},e.prototype.geodeticToEcef=function(e,t,r){var n=this._wgs84a,i=this._wgs84b;e=e*Math.PI/180,t=t*Math.PI/180;var o=Math.cos(e),a=Math.sin(e),s=Math.cos(t),c=Math.sin(t),u=n*n,h=i*i,l=1/Math.sqrt(u*o*o+h*a*a),p=(u*l+r)*o;return[p*s,p*c,(h*l+r)*a]},e.prototype.ecefToGeodetic=function(e,t,r){var n=this._wgs84a,i=this._wgs84b,o=n*n,a=i*i,s=o-a,c=Math.sqrt(s/o),u=Math.sqrt(s/a),h=Math.sqrt(e*e+t*t),l=Math.atan2(r*n,h*i),p=Math.sin(l),f=Math.cos(l),d=Math.atan2(t,e),m=Math.atan2(r+u*u*i*p*p*p,h-c*c*n*f*f*f),v=Math.sin(m),g=h/Math.cos(m)-n/Math.sqrt(1-c*c*v*v);return[180*m/Math.PI,180*d/Math.PI,g]},e}();r.GeoCoords=n,r.default=n},{}],379:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this._epsilon=1e-9}return e.prototype.azimuthalToBearing=function(e){return-e+Math.PI/2},e.prototype.degToRad=function(e){return Math.PI*e/180},e.prototype.radToDeg=function(e){return 180*e/Math.PI},e.prototype.rotationMatrix=function(e){var t=new n.Vector3(e[0],e[1],e[2]),r=t.length();return r>0&&t.normalize(),(new n.Matrix4).makeRotationAxis(t,r)},e.prototype.rotate=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]),i=this.rotationMatrix(t);return r.applyMatrix4(i),r},e.prototype.opticalCenter=function(e,t){var r=[-e[0],-e[1],-e[2]],n=[-t[0],-t[1],-t[2]];return this.rotate(n,r)},e.prototype.viewingDirection=function(e){var t=[-e[0],-e[1],-e[2]];return this.rotate([0,0,1],t)},e.prototype.wrap=function(e,t,r){if(r<t)throw new Error("Invalid arguments: max must be larger than min.");for(var n=r-t;e>r||e<t;)e>r?e-=n:e<t&&(e+=n);return e},e.prototype.wrapAngle=function(e){return this.wrap(e,-Math.PI,Math.PI)},e.prototype.clamp=function(e,t,r){return e<t?t:e>r?r:e},e.prototype.angleBetweenVector2=function(e,t,r,n){var i=Math.atan2(n,r)-Math.atan2(t,e);return this.wrapAngle(i)},e.prototype.angleDifference=function(e,t){var r=t-e;return this.wrapAngle(r)},e.prototype.relativeRotationAngle=function(e,t){var r=this.rotationMatrix([-e[0],-e[1],-e[2]]),n=this.rotationMatrix(t),i=r.multiply(n).elements;return Math.acos((i[0]+i[5]+i[10]-1)/2)},e.prototype.angleToPlane=function(e,t){var r=(new n.Vector3).fromArray(e),i=r.length();if(i<this._epsilon)return 0;var o=r.dot((new n.Vector3).fromArray(t));return Math.asin(o/i)},e.prototype.distanceFromLatLon=function(e,t,r,n){var i=this.degToRad(r-e),o=this.degToRad(n-t),a=Math.sin(i/2)*Math.sin(i/2)+Math.cos(e)*Math.cos(r)*Math.sin(o/2)*Math.sin(o/2);return 12742e3*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))},e}();r.Spatial=i,r.default=i},{three:231}],380:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(e,t,r){this._orientation=this._getValue(e.orientation,1);var n=null!=t?t.width:4,i=null!=t?t.height:3,o=this._orientation<5;this._width=this._getValue(e.width,o?n:i),this._height=this._getValue(e.height,o?i:n),this._basicAspect=o?this._width/this._height:this._height/this._width,this._basicWidth=o?e.width:e.height,this._basicHeight=o?e.height:e.width,this._focal=this._getValue(e.focal,1),this._scale=this._getValue(e.scale,0),this._gpano=null!=e.gpano?e.gpano:null,this._rt=this._getRt(e.rotation,r),this._srt=this._getSrt(this._rt,this._scale)}return Object.defineProperty(e.prototype,"basicAspect",{get:function(){return this._basicAspect},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"basicHeight",{get:function(){return this._basicHeight},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"basicWidth",{get:function(){return this._basicWidth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._focal},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullPano",{get:function(){return null!=this._gpano&&0===this._gpano.CroppedAreaLeftPixels&&0===this._gpano.CroppedAreaTopPixels&&this._gpano.CroppedAreaImageWidthPixels===this._gpano.FullPanoWidthPixels&&this._gpano.CroppedAreaImageHeightPixels===this._gpano.FullPanoHeightPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"gpano",{get:function(){return this._gpano},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._height},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"orientation",{get:function(){return this._orientation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rt",{get:function(){return this._rt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"srt",{get:function(){return this._srt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scale",{get:function(){return this._scale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hasValidScale",{get:function(){return this._scale>.01&&this._scale<50},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this._width},enumerable:!0,configurable:!0}),e.prototype.upVector=function(){var e=this._rt.elements;switch(this._orientation){case 1:return new n.Vector3(-e[1],-e[5],-e[9]);case 3:return new n.Vector3(e[1],e[5],e[9]);case 6:return new n.Vector3(-e[0],-e[4],-e[8]);case 8:return new n.Vector3(e[0],e[4],e[8]);default:return new n.Vector3(-e[1],-e[5],-e[9])}},e.prototype.projectorMatrix=function(){var e=this._normalizedToTextureMatrix(),t=this._focal,r=(new n.Matrix4).set(t,0,0,0,0,t,0,0,0,0,0,0,0,0,1,0);return e.multiply(r),e.multiply(this._rt),e},e.prototype.projectBasic=function(e){var t=this.projectSfM(e);return this._sfmToBasic(t)},e.prototype.unprojectBasic=function(e,t){var r=this._basicToSfm(e);return this.unprojectSfM(r,t)},e.prototype.projectSfM=function(e){var t=new n.Vector4(e[0],e[1],e[2],1);return t.applyMatrix4(this._rt),this._bearingToSfm([t.x,t.y,t.z])},e.prototype.unprojectSfM=function(e,t){var r=this._sfmToBearing(e),i=new n.Vector4(t*r[0],t*r[1],t*r[2],1);return i.applyMatrix4((new n.Matrix4).getInverse(this._rt)),[i.x/i.w,i.y/i.w,i.z/i.w]},e.prototype._sfmToBearing=function(e){if(this._fullPano()){var t=2*e[0]*Math.PI,r=2*-e[1]*Math.PI;return[a=Math.cos(r)*Math.sin(t),s=-Math.sin(r),c=Math.cos(r)*Math.cos(t)]}if(this._gpano){var i=Math.max(this.gpano.CroppedAreaImageWidthPixels,this.gpano.CroppedAreaImageHeightPixels),o=[e[0]*i+this.gpano.CroppedAreaImageWidthPixels/2+this.gpano.CroppedAreaLeftPixels,e[1]*i+this.gpano.CroppedAreaImageHeightPixels/2+this.gpano.CroppedAreaTopPixels],t=2*Math.PI*(o[0]/this.gpano.FullPanoWidthPixels-.5),r=-Math.PI*(o[1]/this.gpano.FullPanoHeightPixels-.5),a=Math.cos(r)*Math.sin(t),s=-Math.sin(r),c=Math.cos(r)*Math.cos(t);return[a,s,c]}var u=new n.Vector3(e[0],e[1],this._focal);return u.normalize(),[u.x,u.y,u.z]},e.prototype._bearingToSfm=function(e){if(this._fullPano()){var t=e[0],r=e[1],n=e[2],i=Math.atan2(t,n),o=Math.atan2(-r,Math.sqrt(t*t+n*n));return[i/(2*Math.PI),-o/(2*Math.PI)]}if(this._gpano){var t=e[0],r=e[1],n=e[2],i=Math.atan2(t,n),o=Math.atan2(-r,Math.sqrt(t*t+n*n)),a=[(i/(2*Math.PI)+.5)*this.gpano.FullPanoWidthPixels,(-o/Math.PI+.5)*this.gpano.FullPanoHeightPixels],s=Math.max(this.gpano.CroppedAreaImageWidthPixels,this.gpano.CroppedAreaImageHeightPixels);return[(a[0]-this.gpano.CroppedAreaLeftPixels-this.gpano.CroppedAreaImageWidthPixels/2)/s,(a[1]-this.gpano.CroppedAreaTopPixels-this.gpano.CroppedAreaImageHeightPixels/2)/s]}return e[2]>0?[e[0]*this._focal/e[2],e[1]*this._focal/e[2]]:[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]},e.prototype._basicToSfm=function(e){var t,r;switch(this._orientation){case 1:t=e[0],r=e[1];break;case 3:t=1-e[0],r=1-e[1];break;case 6:t=e[1],r=1-e[0];break;case 8:t=1-e[1],r=e[0];break;default:t=e[0],r=e[1]}var n=this._width,i=this._height,o=Math.max(n,i);return[t*n/o-n/o/2,r*i/o-i/o/2]},e.prototype._sfmToBasic=function(e){var t,r,n=this._width,i=this._height,o=Math.max(n,i),a=(e[0]+n/o/2)/n*o,s=(e[1]+i/o/2)/i*o;switch(this._orientation){case 1:t=a,r=s;break;case 3:t=1-a,r=1-s;break;case 6:t=1-s,r=a;break;case 8:t=s,r=1-a;break;default:t=a,r=s}return[t,r]},e.prototype._fullPano=function(){return null!=this.gpano&&0===this.gpano.CroppedAreaLeftPixels&&0===this.gpano.CroppedAreaTopPixels&&this.gpano.CroppedAreaImageWidthPixels===this.gpano.FullPanoWidthPixels&&this.gpano.CroppedAreaImageHeightPixels===this.gpano.FullPanoHeightPixels},e.prototype._getValue=function(e,t){return null!=e&&e>0?e:t},e.prototype._getRt=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]),i=r.length();i>0&&r.normalize();var o=new n.Matrix4;return o.makeRotationAxis(r,i),o.setPosition(new n.Vector3(t[0],t[1],t[2])),o},e.prototype._getSrt=function(e,t){var r=e.clone(),i=r.elements;return i[12]=t*i[12],i[13]=t*i[13],i[14]=t*i[14],r.scale(new n.Vector3(t,t,t)),r},e.prototype._normalizedToTextureMatrix=function(){var e=Math.max(this._width,this._height),t=e/this._width,r=e/this._height;switch(this._orientation){case 1:return(new n.Matrix4).set(t,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1);case 3:return(new n.Matrix4).set(-t,0,0,.5,0,r,0,.5,0,0,1,0,0,0,0,1);case 6:return(new n.Matrix4).set(0,-r,0,.5,-t,0,0,.5,0,0,1,0,0,0,0,1);case 8:return(new n.Matrix4).set(0,r,0,.5,t,0,0,.5,0,0,1,0,0,0,0,1);default:return(new n.Matrix4).set(t,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1)}},e}();r.Transform=i},{three:231}],381:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=function(){function e(){this._unprojectDepth=200}return e.prototype.basicToCanvas=function(e,t,r,n,i){var o=n.unprojectBasic([e,t],this._unprojectDepth);return this.projectToCanvas(o,r,i)},e.prototype.basicToCanvasSafe=function(e,t,r,n,i){var o=n.unprojectBasic([e,t],this._unprojectDepth),a=this.worldToCamera(o,i);if(a[2]>0)return null;var s=this.cameraToViewport(a,i),c=s[0],u=s[1];return this.viewportToCanvas(c,u,r)},e.prototype.basicToViewport=function(e,t,r,n){var i=r.unprojectBasic([e,t],this._unprojectDepth);return this.projectToViewport(i,n)},e.prototype.cameraToViewport=function(e,t){var r=(new n.Vector3).fromArray(e).applyMatrix4(t.projectionMatrix);return[r.x,r.y]},e.prototype.canvasPosition=function(e,t){var r=t.getBoundingClientRect();return[e.clientX-r.left-t.clientLeft,e.clientY-r.top-t.clientTop]},e.prototype.canvasToBasic=function(e,t,r,n,i){var o=this.unprojectFromCanvas(e,t,r,i).toArray();return n.projectBasic(o)},e.prototype.canvasToViewport=function(e,t,r){var n=this.containerToCanvas(r);return[2*e/n[0]-1,1-2*t/n[1]]},e.prototype.containerToCanvas=function(e){return[e.offsetWidth,e.offsetHeight]},e.prototype.getBasicDistances=function(e,t){var r=this.viewportToBasic(-1,1,e,t),n=this.viewportToBasic(1,1,e,t),i=this.viewportToBasic(1,-1,e,t),o=this.viewportToBasic(-1,-1,e,t),a=0,s=0,c=0,u=0;return r[1]<0&&n[1]<0&&(a=r[1]>n[1]?-r[1]:-n[1]),n[0]>1&&i[0]>1&&(s=n[0]<i[0]?n[0]-1:i[0]-1),i[1]>1&&o[1]>1&&(c=i[1]<o[1]?i[1]-1:o[1]-1),o[0]<0&&r[0]<0&&(u=o[0]>r[0]?-o[0]:-r[0]),[a,s,c,u]},e.prototype.getPixelDistances=function(e,t,r){var n=this.viewportToBasic(-1,1,t,r),i=this.viewportToBasic(1,1,t,r),o=this.viewportToBasic(1,-1,t,r),a=this.viewportToBasic(-1,-1,t,r),s=0,c=0,u=0,h=0,l=this.containerToCanvas(e),p=l[0],f=l[1];if(n[1]<0&&i[1]<0){d=n[1]>i[1]?n[0]:i[0];s=(v=this.basicToCanvas(d,0,e,t,r))[1]>0?v[1]:0}if(i[0]>1&&o[0]>1){m=i[0]<o[0]?i[1]:o[1];c=(v=this.basicToCanvas(1,m,e,t,r))[0]<p?p-v[0]:0}if(o[1]>1&&a[1]>1){var d=o[1]<a[1]?o[0]:a[0];u=(v=this.basicToCanvas(d,1,e,t,r))[1]<f?f-v[1]:0}if(a[0]<0&&n[0]<0){var m=a[0]>n[0]?a[1]:n[1],v=this.basicToCanvas(0,m,e,t,r);h=v[0]>0?v[0]:0}return[s,c,u,h]},e.prototype.insideElement=function(e,t){var r=t.getBoundingClientRect(),n=r.left+t.clientLeft,i=n+t.clientWidth,o=r.top+t.clientTop,a=o+t.clientHeight;return e.clientX>n&&e.clientX<i&&e.clientY>o&&e.clientY<a},e.prototype.projectToCanvas=function(e,t,r){var n=this.projectToViewport(e,r);return this.viewportToCanvas(n[0],n[1],t)},e.prototype.projectToViewport=function(e,t){var r=new n.Vector3(e[0],e[1],e[2]).project(t);return[r.x,r.y]},e.prototype.unprojectFromCanvas=function(e,t,r,n){var i=this.canvasToViewport(e,t,r);return this.unprojectFromViewport(i[0],i[1],n)},e.prototype.unprojectFromViewport=function(e,t,r){return new n.Vector3(e,t,1).unproject(r)},e.prototype.viewportToBasic=function(e,t,r,i){var o=new n.Vector3(e,t,1).unproject(i).toArray();return r.projectBasic(o)},e.prototype.viewportToCanvas=function(e,t,r){var n=this.containerToCanvas(r);return[n[0]*(e+1)/2,-n[1]*(t-1)/2]},e.prototype.worldToCamera=function(e,t){return new n.Vector3(e[0],e[1],e[2]).applyMatrix4(t.matrixWorldInverse).toArray()},e}();r.ViewportCoords=i,r.default=i},{three:231}],382:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return e.prototype.createFilter=function(e){return new Function("node","return "+this._compile(e)+";")},e.prototype._compile=function(e){if(null==e||e.length<=1)return"true";var t=e[0];return"("+("=="===t?this._compileComparisonOp("===",e[1],e[2],!1):"!="===t?this._compileComparisonOp("!==",e[1],e[2],!1):">"===t||">="===t||"<"===t||"<="===t?this._compileComparisonOp(t,e[1],e[2],!0):"in"===t?this._compileInOp(e[1],e.slice(2)):"!in"===t?this._compileNegation(this._compileInOp(e[1],e.slice(2))):"all"===t?this._compileLogicalOp(e.slice(1),"&&"):"true")+")"},e.prototype._compare=function(e,t){return e<t?-1:e>t?1:0},e.prototype._compileComparisonOp=function(e,t,r,n){var i=this._compilePropertyReference(t),o=JSON.stringify(r);return(n?"typeof "+i+"===typeof "+o+"&&":"")+i+e+o},e.prototype._compileInOp=function(e,t){var r=this._compare;return JSON.stringify(t.sort(r))+".indexOf("+this._compilePropertyReference(e)+")!==-1"},e.prototype._compileLogicalOp=function(e,t){var r=this._compile.bind(this);return e.map(r).join(t)},e.prototype._compileNegation=function(e){return"!("+e+")"},e.prototype._compilePropertyReference=function(e){return"node["+JSON.stringify(e)+"]"},e}();r.FilterCreator=n,r.default=n},{}],383:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rbush"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/from"),e("rxjs/add/operator/catch"),e("rxjs/add/operator/do"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publish");var a=e("../Edge"),s=e("../Error"),c=e("../Graph"),u=function(){function e(e,t,r,i,s,u){this._apiV3=e,this._cachedNodes={},this._cachedNodeTiles={},this._cachedSequenceNodes={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequenceNodes$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._changed$=new o.Subject,this._defaultAlt=2,this._edgeCalculator=null!=i?i:new a.EdgeCalculator,this._filterCreator=null!=s?s:new c.FilterCreator,this._filter=this._filterCreator.createFilter(void 0),this._graphCalculator=null!=r?r:new c.GraphCalculator,this._configuration=null!=u?u:{maxSequences:50,maxUnusedNodes:100,maxUnusedPreStoredNodes:30,maxUnusedTiles:20},this._nodes={},this._nodeIndex=null!=t?t:n(16,[".lat",".lon",".lat",".lon"]),this._nodeIndexTiles={},this._nodeToTile={},this._preStored={},this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._tilePrecision=7,this._tileThreshold=20}return Object.defineProperty(e.prototype,"changed$",{get:function(){return this._changed$},enumerable:!0,configurable:!0}),e.prototype.cacheFill$=function(e){var t=this;if(e in this._cachingFull$)throw new s.GraphMapillaryError("Cannot fill node while caching full ("+e+").");if(!this.hasNode(e))throw new s.GraphMapillaryError("Cannot fill node that does not exist in graph ("+e+").");if(e in this._cachingFill$)return this._cachingFill$[e];var r=this.getNode(e);if(r.full)throw new s.GraphMapillaryError("Cannot fill node that is already full ("+e+").");return this._cachingFill$[e]=this._apiV3.imageByKeyFill$([e]).do(function(n){r.full||t._makeFull(r,n[e]),delete t._cachingFill$[e]}).map(function(e){return t}).finally(function(){e in t._cachingFill$&&delete t._cachingFill$[e],t._changed$.next(t)}).publish().refCount(),this._cachingFill$[e]},e.prototype.cacheFull$=function(e){var t=this;if(e in this._cachingFull$)return this._cachingFull$[e];if(this.hasNode(e))throw new s.GraphMapillaryError("Cannot cache full node that already exist in graph ("+e+").");return this._cachingFull$[e]=this._apiV3.imageByKeyFull$([e]).do(function(r){var n=r[e];if(t.hasNode(e)){(i=t.getNode(e)).full||t._makeFull(i,n)}else{if(null==n.sequence||null==n.sequence.key)throw new s.GraphMapillaryError("Node has no sequence ("+e+").");var i=new c.Node(n);t._makeFull(i,n);var o=t._graphCalculator.encodeH(i.originalLatLon,t._tilePrecision);t._preStore(o,i),t._setNode(i),delete t._cachingFull$[e]}}).map(function(e){return t}).finally(function(){e in t._cachingFull$&&delete t._cachingFull$[e],t._changed$.next(t)}).publish().refCount(),this._cachingFull$[e]},e.prototype.cacheNodeSequence$=function(e){if(!this.hasNode(e))throw new s.GraphMapillaryError("Cannot cache sequence edges of node that does not exist in graph ("+e+").");var t=this.getNode(e);if(t.sequenceKey in this._sequences)throw new s.GraphMapillaryError("Sequence already cached ("+e+"), ("+t.sequenceKey+").");return this._cacheSequence$(t.sequenceKey)},e.prototype.cacheSequence$=function(e){if(e in this._sequences)throw new s.GraphMapillaryError("Sequence already cached ("+e+")");return this._cacheSequence$(e)},e.prototype.cacheSequenceEdges=function(e){var t=this.getNode(e);if(!(t.sequenceKey in this._sequences))throw new s.GraphMapillaryError("Sequence is not cached ("+e+"), ("+t.sequenceKey+")");var r=this._sequences[t.sequenceKey].sequence,n=this._edgeCalculator.computeSequenceEdges(t,r);t.cacheSequenceEdges(n)},e.prototype.cacheSequenceNodes$=function(e,t){var r=this;if(!this.hasSequence(e))throw new s.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph ("+e+").");if(this.hasSequenceNodes(e))throw new s.GraphMapillaryError("Sequence nodes already cached ("+e+").");var n=this.getSequence(e);if(n.key in this._cachingSequenceNodes$)return this._cachingSequenceNodes$[n.key];var o=[],a=n.keys.slice();if(t){var u=a.indexOf(t);if(-1!==u)for(var h=0,l=[20,40];h<l.length;h++){var p=l[h];if(u<a.length-1&&o.push(a.splice(u,p)),u>0){var f=u===a.length-1?1:0,d=a.splice(Math.max(0,u+f-p),p);o.push(d),u-=d.length}}}for(;a.length>0;)o.push(a.splice(0,200));var m=o.length,v=i.Observable.from(o).mergeMap(function(e){return r._apiV3.imageByKeyFull$(e).do(function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];if(r.hasNode(t)){(i=r.getNode(n.key)).full||r._makeFull(i,n)}else{null!=n.sequence&&null!=n.sequence.key||console.warn("Sequence missing, discarding ("+n.key+")");var i=new c.Node(n);r._makeFull(i,n);var o=r._graphCalculator.encodeH(i.originalLatLon,r._tilePrecision);r._preStore(o,i),r._setNode(i)}}m--}).map(function(e){return r})},6).last().finally(function(){delete r._cachingSequenceNodes$[n.key],0===m&&(r._cachedSequenceNodes[n.key]=!0)}).publish().refCount();return this._cachingSequenceNodes$[n.key]=v,v},e.prototype.cacheSpatialArea$=function(e){var t=this;if(!this.hasNode(e))throw new s.GraphMapillaryError("Cannot cache spatial area of node that does not exist in graph ("+e+").");if(e in this._cachedSpatialEdges)throw new s.GraphMapillaryError("Node already spatially cached ("+e+").");if(!(e in this._requiredSpatialArea))throw new s.GraphMapillaryError("Spatial area not determined ("+e+").");var r=this._requiredSpatialArea[e];if(0===Object.keys(r.cacheNodes).length)throw new s.GraphMapillaryError("Spatial nodes already cached ("+e+").");if(e in this._cachingSpatialArea$)return this._cachingSpatialArea$[e];for(var n=[];r.cacheKeys.length>0;)n.push(r.cacheKeys.splice(0,200));for(var i=n.length,o=[],a=function(n){var a=c._apiV3.imageByKeyFill$(n).do(function(n){for(var o in n)if(n.hasOwnProperty(o)){var a=r.cacheNodes[o];if(a.full)delete r.cacheNodes[o];else{var s=n[o];t._makeFull(a,s),delete r.cacheNodes[o]}}0==--i&&delete t._cachingSpatialArea$[e]}).map(function(e){return t}).catch(function(o){for(var a=0,s=n;a<s.length;a++){var c=s[a];c in r.all&&delete r.all[c],c in r.cacheNodes&&delete r.cacheNodes[c]}throw 0==--i&&delete t._cachingSpatialArea$[e],o}).finally(function(){0===Object.keys(r.cacheNodes).length&&t._changed$.next(t)}).publish().refCount();o.push(a)},c=this,u=0,h=n;u<h.length;u++){a(h[u])}return this._cachingSpatialArea$[e]=o,o},e.prototype.cacheSpatialEdges=function(e){if(e in this._cachedSpatialEdges)throw new s.GraphMapillaryError("Spatial edges already cached ("+e+").");var t=this.getNode(e),r=this._sequences[t.sequenceKey].sequence,n=[],i=r.findPrevKey(t.key);null!=i&&n.push(i);var o=r.findNextKey(t.key);null!=o&&n.push(o);var a=this._requiredSpatialArea[e].all,c=[],u=this._filter;for(var h in a)if(a.hasOwnProperty(h)){var l=a[h];u(l)&&c.push(l)}var p=this._edgeCalculator.getPotentialEdges(t,c,n),f=this._edgeCalculator.computeStepEdges(t,p,i,o);f=(f=(f=(f=f.concat(this._edgeCalculator.computeTurnEdges(t,p))).concat(this._edgeCalculator.computePanoEdges(t,p))).concat(this._edgeCalculator.computePerspectiveToPanoEdges(t,p))).concat(this._edgeCalculator.computeSimilarEdges(t,p)),t.cacheSpatialEdges(f),this._cachedSpatialEdges[e]=t,delete this._requiredSpatialArea[e],delete this._cachedNodeTiles[e]},e.prototype.cacheTiles$=function(e){var t=this;if(e in this._cachedNodeTiles)throw new s.GraphMapillaryError("Tiles already cached ("+e+").");if(e in this._cachedSpatialEdges)throw new s.GraphMapillaryError("Spatial edges already cached so tiles considered cached ("+e+").");if(!(e in this._requiredNodeTiles))throw new s.GraphMapillaryError("Tiles have not been determined ("+e+").");var r=this._requiredNodeTiles[e];if(0===r.cache.length&&0===r.caching.length)throw new s.GraphMapillaryError("Tiles already cached ("+e+").");if(!this.hasNode(e))throw new s.GraphMapillaryError("Cannot cache tiles of node that does not exist in graph ("+e+").");var n=r.cache.slice();r.caching=this._requiredNodeTiles[e].caching.concat(n),r.cache=[];for(var i=[],o=function(n){var o=null;n in a._cachingTiles$?o=a._cachingTiles$[n]:(o=a._apiV3.imagesByH$([n]).do(function(e){var r=e[n];if(!(n in t._cachedTiles)){t._nodeIndexTiles[n]=[],t._cachedTiles[n]={accessed:(new Date).getTime(),nodes:[]};var i=t._cachedTiles[n].nodes,o=t._removeFromPreStore(n);for(var a in r)if(r.hasOwnProperty(a)){var s=r[a];if(null==s)break;if(null!=s.sequence&&null!=s.sequence.key)if(null!=o&&s.key in o){var u=o[s.key];delete o[s.key],i.push(u);var h={lat:u.latLon.lat,lon:u.latLon.lon,node:u};t._nodeIndex.insert(h),t._nodeIndexTiles[n].push(h),t._nodeToTile[u.key]=n}else{var l=new c.Node(s);i.push(l);var p={lat:l.latLon.lat,lon:l.latLon.lon,node:l};t._nodeIndex.insert(p),t._nodeIndexTiles[n].push(p),t._nodeToTile[l.key]=n,t._setNode(l)}else console.warn("Sequence missing, discarding ("+s.key+")")}delete t._cachingTiles$[n]}}).map(function(e){return t}).catch(function(e){throw delete t._cachingTiles$[n],e}).publish().refCount(),a._cachingTiles$[n]=o),i.push(o.do(function(i){var o=r.caching.indexOf(n);o>-1&&r.caching.splice(o,1),0===r.caching.length&&0===r.cache.length&&(delete t._requiredNodeTiles[e],t._cachedNodeTiles[e]=!0)}).catch(function(i){var o=r.caching.indexOf(n);throw o>-1&&r.caching.splice(o,1),0===r.caching.length&&0===r.cache.length&&(delete t._requiredNodeTiles[e],t._cachedNodeTiles[e]=!0),i}).finally(function(){t._changed$.next(t)}).publish().refCount())},a=this,u=0,h=r.caching;u<h.length;u++){o(h[u])}return i},e.prototype.initializeCache=function(e){if(e in this._cachedNodes)throw new s.GraphMapillaryError("Node already in cache ("+e+").");var t=this.getNode(e);t.initializeCache(new c.NodeCache);var r=(new Date).getTime();this._cachedNodes[e]={accessed:r,node:t},this._updateCachedTileAccess(e,r)},e.prototype.isCachingFill=function(e){return e in this._cachingFill$},e.prototype.isCachingFull=function(e){return e in this._cachingFull$},e.prototype.isCachingNodeSequence=function(e){return this.getNode(e).sequenceKey in this._cachingSequences$},e.prototype.isCachingSequence=function(e){return e in this._cachingSequences$},e.prototype.isCachingSequenceNodes=function(e){return e in this._cachingSequenceNodes$},e.prototype.isCachingTiles=function(e){return e in this._requiredNodeTiles&&0===this._requiredNodeTiles[e].cache.length&&this._requiredNodeTiles[e].caching.length>0},e.prototype.hasInitializedCache=function(e){return e in this._cachedNodes},e.prototype.hasNode=function(e){var t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),e in this._nodes},e.prototype.hasNodeSequence=function(e){var t=this.getNode(e).sequenceKey,r=t in this._sequences;return r&&(this._sequences[t].accessed=(new Date).getTime()),r},e.prototype.hasSequence=function(e){var t=e in this._sequences;return t&&(this._sequences[e].accessed=(new Date).getTime()),t},e.prototype.hasSequenceNodes=function(e){return e in this._cachedSequenceNodes},e.prototype.hasSpatialArea=function(e){if(!this.hasNode(e))throw new s.GraphMapillaryError("Spatial area nodes cannot be determined if node not in graph ("+e+").");if(e in this._cachedSpatialEdges)return!0;if(e in this._requiredSpatialArea)return 0===Object.keys(this._requiredSpatialArea[e].cacheNodes).length;for(var t=this.getNode(e),r=this._graphCalculator.boundingBoxCorners(t.latLon,this._tileThreshold),n={all:{},cacheKeys:[],cacheNodes:{}},i=0,o=this._nodeIndex.search({maxX:r[1].lat,maxY:r[1].lon,minX:r[0].lat,minY:r[0].lon});i<o.length;i++){var a=o[i];n.all[a.node.key]=a.node,a.node.full||(n.cacheKeys.push(a.node.key),n.cacheNodes[a.node.key]=a.node)}return this._requiredSpatialArea[e]=n,0===n.cacheKeys.length},e.prototype.hasTiles=function(e){var t=this;if(e in this._cachedNodeTiles)return!0;if(e in this._cachedSpatialEdges)return!0;if(!this.hasNode(e))throw new s.GraphMapillaryError("Node does not exist in graph ("+e+").");var r={cache:[],caching:[]};if(e in this._requiredNodeTiles)r=this._requiredNodeTiles[e];else{var n=this.getNode(e);r.cache=this._graphCalculator.encodeHs(n.latLon,this._tilePrecision,this._tileThreshold).filter(function(e){return!(e in t._cachedTiles)}),r.cache.length>0&&(this._requiredNodeTiles[e]=r)}return 0===r.cache.length&&0===r.caching.length},e.prototype.getNode=function(e){var t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),this._nodes[e]},e.prototype.getSequence=function(e){var t=this._sequences[e];return t.accessed=(new Date).getTime(),t.sequence},e.prototype.resetSpatialEdges=function(){for(var e=0,t=Object.keys(this._cachedSpatialEdges);e<t.length;e++){var r=t[e];this._cachedSpatialEdges[r].resetSpatialEdges(),delete this._cachedSpatialEdges[r]}},e.prototype.reset=function(e){for(var t=[],r=0,n=e;r<n.length;r++){var i=n[r];if(!this.hasNode(i))throw new Error("Node does not exist "+i);(h=this.getNode(i)).resetSequenceEdges(),h.resetSpatialEdges(),t.push(h)}for(var o=0,a=Object.keys(this._cachedNodes);o<a.length;o++){var s=a[o];-1===e.indexOf(s)&&(this._cachedNodes[s].node.dispose(),delete this._cachedNodes[s])}this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._nodes={},this._nodeToTile={},this._preStored={};for(var c=0,u=t;c<u.length;c++){var h=u[c];this._nodes[h.key]=h;var l=this._graphCalculator.encodeH(h.originalLatLon,this._tilePrecision);this._preStore(l,h)}this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._nodeIndexTiles={},this._nodeIndex.clear()},e.prototype.setFilter=function(e){this._filter=this._filterCreator.createFilter(e)},e.prototype.uncache=function(e,t){var r={};this._addNewKeys(r,this._cachingFull$),this._addNewKeys(r,this._cachingFill$),this._addNewKeys(r,this._cachingSpatialArea$),this._addNewKeys(r,this._requiredNodeTiles),this._addNewKeys(r,this._requiredSpatialArea);for(var n=0,i=e;n<i.length;n++){(a=i[n])in r||(r[a]=!0)}var o={};for(var a in r)if(r.hasOwnProperty(a))for(var s=this._nodes[a],c=0,u=this._graphCalculator.encodeHs(s.latLon);c<u.length;c++){var h=u[c];h in o||(o[h]=!0)}var l=[];for(var p in this._cachedTiles)!this._cachedTiles.hasOwnProperty(p)||p in o||l.push([p,this._cachedTiles[p]]);for(var f=0,d=l.sort(function(e,t){return t[1].accessed-e[1].accessed}).slice(this._configuration.maxUnusedTiles).map(function(e){return e[0]});f<d.length;f++){var m=d[f];this._uncacheTile(m,t)}var v=[],g=[];for(var p in this._preStored)if(this._preStored.hasOwnProperty(p)&&!(p in this._cachingTiles$)){var y=this._preStored[p];for(var a in y)!y.hasOwnProperty(a)||a in r||y[a].sequenceKey!==t&&(a in this._cachedNodes?v.push([this._cachedNodes[a],p]):g.push([a,p]))}var b=v.sort(function(e,t){var r=e[0],n=(e[1],t[0]);t[1];return n.accessed-r.accessed}).slice(this._configuration.maxUnusedPreStoredNodes).map(function(e){var t=e[0],r=e[1];return[t.node.key,r]});this._uncachePreStored(g),this._uncachePreStored(b);var _=[];for(var a in this._cachedNodes)!this._cachedNodes.hasOwnProperty(a)||a in r||_.push(this._cachedNodes[a]);for(var x=0,w=_.sort(function(e,t){return t.accessed-e.accessed}).slice(this._configuration.maxUnusedNodes);x<w.length;x++){var S=w[x];S.node.uncache();a=S.node.key;delete this._cachedNodes[a],a in this._cachedNodeTiles&&delete this._cachedNodeTiles[a],a in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[a]}var M=[];for(var E in this._sequences)!this._sequences.hasOwnProperty(E)||E in this._cachingSequences$||E===t||M.push(this._sequences[E]);for(var C=0,T=M.sort(function(e,t){return t.accessed-e.accessed}).slice(this._configuration.maxSequences);C<T.length;C++){var O=T[C],E=O.sequence.key;delete this._sequences[E],E in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[E],O.sequence.dispose()}},e.prototype._addNewKeys=function(e,t){for(var r in t)t.hasOwnProperty(r)&&this.hasNode(r)&&(r in e||(e[r]=!0))},e.prototype._cacheSequence$=function(e){var t=this;return e in this._cachingSequences$?this._cachingSequences$[e]:(this._cachingSequences$[e]=this._apiV3.sequenceByKey$([e]).do(function(r){e in t._sequences||(t._sequences[e]={accessed:(new Date).getTime(),sequence:new c.Sequence(r[e])}),delete t._cachingSequences$[e]}).map(function(e){return t}).finally(function(){e in t._cachingSequences$&&delete t._cachingSequences$[e],t._changed$.next(t)}).publish().refCount(),this._cachingSequences$[e])},e.prototype._makeFull=function(e,t){null==t.calt&&(t.calt=this._defaultAlt),null==t.c_rotation&&(t.c_rotation=this._graphCalculator.rotationFromCompass(t.ca,t.orientation)),e.makeFull(t)},e.prototype._preStore=function(e,t){e in this._preStored||(this._preStored[e]={}),this._preStored[e][t.key]=t},e.prototype._removeFromPreStore=function(e){var t=null;return e in this._preStored&&(t=this._preStored[e],delete this._preStored[e]),t},e.prototype._setNode=function(e){var t=e.key;if(this.hasNode(t))throw new s.GraphMapillaryError("Node already exist ("+t+").");this._nodes[t]=e},e.prototype._uncacheTile=function(e,t){for(var r=0,n=this._cachedTiles[e].nodes;r<n.length;r++){var i=n[r],o=i.key;delete this._nodeToTile[o],o in this._cachedNodes&&delete this._cachedNodes[o],o in this._cachedNodeTiles&&delete this._cachedNodeTiles[o],o in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[o],i.sequenceKey===t?(this._preStore(e,i),i.uncache()):(delete this._nodes[o],i.sequenceKey in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[i.sequenceKey],i.dispose())}for(var a=0,s=this._nodeIndexTiles[e];a<s.length;a++){var c=s[a];this._nodeIndex.remove(c)}delete this._nodeIndexTiles[e],delete this._cachedTiles[e]},e.prototype._uncachePreStored=function(e){for(var t={},r=0,n=e;r<n.length;r++){var i=n[r],o=i[0],a=i[1];o in this._nodes&&delete this._nodes[o],o in this._cachedNodes&&delete this._cachedNodes[o];var s=this._preStored[a][o];s.sequenceKey in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[s.sequenceKey],delete this._preStored[a][o],s.dispose(),t[a]=!0}for(var a in t)t.hasOwnProperty(a)&&0===Object.keys(this._preStored[a]).length&&delete this._preStored[a]},e.prototype._updateCachedTileAccess=function(e,t){e in this._nodeToTile&&(this._cachedTiles[this._nodeToTile[e]].accessed=t)},e.prototype._updateCachedNodeAccess=function(e,t){e in this._cachedNodes&&(this._cachedNodes[e].accessed=t)},e}();r.Graph=u,r.default=u},{"../Edge":282,"../Error":283,"../Graph":285,rbush:25,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],384:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("latlon-geohash"),i=e("three"),o=e("../Geo"),a=function(){function e(){}return e.n="n",e.nw="nw",e.w="w",e.sw="sw",e.s="s",e.se="se",e.e="e",e.ne="ne",e}(),s=function(){function e(e){this._geoCoords=null!=e?e:new o.GeoCoords}return e.prototype.encodeH=function(e,t){return void 0===t&&(t=7),n.encode(e.lat,e.lon,t)},e.prototype.encodeHs=function(e,t,r){void 0===t&&(t=7),void 0===r&&(r=20);var i=n.encode(e.lat,e.lon,t),o=n.bounds(i),s=o.ne,c=o.sw,u=n.neighbours(i),h=[0,0,0],l=this._geoCoords.geodeticToEnu(s.lat,s.lon,0,c.lat,c.lon,0),p=this._geoCoords.geodeticToEnu(e.lat,e.lon,0,c.lat,c.lon,0),f=p[0]-h[0]<r,d=l[0]-p[0]<r,m=p[1]-h[1]<r,v=l[1]-p[1]<r,g=[i];return v&&g.push(u[a.n]),v&&f&&g.push(u[a.nw]),f&&g.push(u[a.w]),f&&m&&g.push(u[a.sw]),m&&g.push(u[a.s]),m&&d&&g.push(u[a.se]),d&&g.push(u[a.e]),d&&v&&g.push(u[a.ne]),g},e.prototype.boundingBoxCorners=function(e,t){var r=this._geoCoords.enuToGeodetic(-t,-t,0,e.lat,e.lon,0),n=this._geoCoords.enuToGeodetic(t,t,0,e.lat,e.lon,0);return[{lat:r[0],lon:r[1]},{lat:n[0],lon:n[1]}]},e.prototype.rotationFromCompass=function(e,t){var r=0,n=0,o=0;switch(t){case 1:r=Math.PI/2;break;case 3:r=-Math.PI/2,o=Math.PI;break;case 6:n=-Math.PI/2,o=-Math.PI/2;break;case 8:n=Math.PI/2,o=Math.PI/2}var a=(new i.Matrix4).makeRotationZ(o),s=new i.Euler(r,n,e*Math.PI/180,"XYZ"),c=(new i.Matrix4).makeRotationFromEuler(s),u=(new i.Vector4).setAxisAngleFromRotationMatrix(c.multiply(a));return u.multiplyScalar(u.w).toArray().slice(0,3)},e}();r.GraphCalculator=s,r.default=s},{"../Geo":284,"latlon-geohash":21,three:231}],385:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Sequence=0]="Sequence",e[e.Spatial=1]="Spatial"}(n=r.GraphMode||(r.GraphMode={})),r.default=n},{}],386:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=e("rxjs/Subject");e("rxjs/add/operator/catch"),e("rxjs/add/operator/concat"),e("rxjs/add/operator/do"),e("rxjs/add/operator/expand"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/last"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay");var o=e("../Graph"),a=function(){function e(e,t){this._graph$=n.Observable.of(e).concat(e.changed$).publishReplay(1).refCount(),this._graph$.subscribe(function(){}),this._graphMode=o.GraphMode.Spatial,this._graphModeSubject$=new i.Subject,this._graphMode$=this._graphModeSubject$.startWith(this._graphMode).publishReplay(1).refCount(),this._graphMode$.subscribe(function(){}),this._imageLoadingService=t,this._firstGraphSubjects$=[],this._initializeCacheSubscriptions=[],this._sequenceSubscriptions=[],this._spatialSubscriptions=[]}return Object.defineProperty(e.prototype,"graphMode$",{get:function(){return this._graphMode$},enumerable:!0,configurable:!0}),e.prototype.cacheNode$=function(e){var t=this,r=new i.Subject;this._firstGraphSubjects$.push(r);var a=r.publishReplay(1).refCount(),s=a.map(function(t){return t.getNode(e)}).mergeMap(function(e){return e.assetsCached?n.Observable.of(e):e.cacheAssets$()}).publishReplay(1).refCount();s.subscribe(function(e){t._imageLoadingService.loadnode$.next(e)},function(t){console.error("Failed to cache node ("+e+")",t)});var c=this._graph$.first().mergeMap(function(t){return t.isCachingFull(e)||!t.hasNode(e)?t.cacheFull$(e):t.isCachingFill(e)||!t.getNode(e).full?t.cacheFill$(e):n.Observable.of(t)}).do(function(t){t.hasInitializedCache(e)||t.initializeCache(e)}).finally(function(){null!=c&&(t._removeFromArray(c,t._initializeCacheSubscriptions),t._removeFromArray(r,t._firstGraphSubjects$))}).subscribe(function(e){r.next(e),r.complete()},function(e){r.error(e)});c.closed||this._initializeCacheSubscriptions.push(c);var u=a.mergeMap(function(t){return t.isCachingNodeSequence(e)||!t.hasNodeSequence(e)?t.cacheNodeSequence$(e):n.Observable.of(t)}).publishReplay(1).refCount().do(function(t){t.getNode(e).sequenceEdges.cached||t.cacheSequenceEdges(e)}).finally(function(){null!=u&&t._removeFromArray(u,t._sequenceSubscriptions)}).subscribe(function(e){},function(t){console.error("Failed to cache sequence edges ("+e+").",t)});if(u.closed||this._sequenceSubscriptions.push(u),this._graphMode===o.GraphMode.Spatial){var h=a.expand(function(t){return t.hasTiles(e)?n.Observable.empty():n.Observable.from(t.cacheTiles$(e)).mergeMap(function(t){return t.mergeMap(function(t){return t.isCachingTiles(e)?n.Observable.empty():n.Observable.of(t)}).catch(function(t,r){return console.error("Failed to cache tile data ("+e+").",t),n.Observable.empty()})})}).last().mergeMap(function(t){return t.hasSpatialArea(e)?n.Observable.of(t):n.Observable.from(t.cacheSpatialArea$(e)).mergeMap(function(t){return t.catch(function(t,r){return console.error("Failed to cache spatial nodes ("+e+").",t),n.Observable.empty()})})}).last().mergeMap(function(t){return t.hasNodeSequence(e)?n.Observable.of(t):t.cacheNodeSequence$(e)}).do(function(t){t.getNode(e).spatialEdges.cached||t.cacheSpatialEdges(e)}).finally(function(){null!=h&&t._removeFromArray(h,t._spatialSubscriptions)}).subscribe(function(e){},function(t){console.error("Failed to cache spatial edges ("+e+").",t)});h.closed||this._spatialSubscriptions.push(h)}return s.first(function(e){return e.assetsCached})},e.prototype.cacheSequence$=function(e){return this._graph$.first().mergeMap(function(t){return t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):n.Observable.of(t)}).map(function(t){return t.getSequence(e)})},e.prototype.cacheSequenceNodes$=function(e,t){return this._graph$.first().mergeMap(function(t){return t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):n.Observable.of(t)}).mergeMap(function(r){return r.isCachingSequenceNodes(e)||!r.hasSequenceNodes(e)?r.cacheSequenceNodes$(e,t):n.Observable.of(r)}).map(function(t){return t.getSequence(e)})},e.prototype.setFilter$=function(e){return this._resetSubscriptions(this._spatialSubscriptions),this._graph$.first().do(function(t){t.resetSpatialEdges(),t.setFilter(e)}).map(function(e){})},e.prototype.setGraphMode=function(e){this._graphMode!==e&&(e===o.GraphMode.Sequence&&this._resetSubscriptions(this._spatialSubscriptions),this._graphMode=e,this._graphModeSubject$.next(this._graphMode))},e.prototype.reset$=function(e){return this._abortSubjects(this._firstGraphSubjects$),this._resetSubscriptions(this._initializeCacheSubscriptions),this._resetSubscriptions(this._sequenceSubscriptions),this._resetSubscriptions(this._spatialSubscriptions),this._graph$.first().do(function(t){t.reset(e)}).map(function(e){})},e.prototype.uncache$=function(e,t){return this._graph$.first().do(function(r){r.uncache(e,t)}).map(function(e){})},e.prototype._abortSubjects=function(e){for(var t=0,r=e.slice();t<r.length;t++){var n=r[t];this._removeFromArray(n,e),n.error(new Error("Cache node request was aborted."))}},e.prototype._removeFromArray=function(e,t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)},e.prototype._resetSubscriptions=function(e){for(var t=0,r=e.slice();t<r.length;t++){var n=r[t];this._removeFromArray(n,e),n.closed||n.unsubscribe()}},e}();r.GraphService=a,r.default=a},{"../Graph":285,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],387:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=function(){function e(){this._loadnode$=new n.Subject,this._loadstatus$=this._loadnode$.scan(function(e,t){var r=e[0],n=!1;return 0===t.loadStatus.total||t.loadStatus.loaded===t.loadStatus.total?t.key in r&&(delete r[t.key],n=!0):(r[t.key]=t.loadStatus,n=!0),[r,n]},[{},!1]).filter(function(e){e[0];return e[1]}).map(function(e){return e[0]}).publishReplay(1).refCount(),this._loadstatus$.subscribe(function(){})}return Object.defineProperty(e.prototype,"loadnode$",{get:function(){return this._loadnode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadstatus$",{get:function(){return this._loadstatus$},enumerable:!0,configurable:!0}),e}();r.ImageLoadingService=i},{"rxjs/Subject":34}],388:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("pbf"),i=function(){function e(){}return e.read=function(t){return new n(t).readFields(e._readMeshField,{faces:[],vertices:[]})},e._readMeshField=function(e,t,r){1===e?t.vertices.push(r.readFloat()):2===e&&t.faces.push(r.readVarint())},e}();r.MeshReader=i},{pbf:23}],389:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/map");var n=function(){function e(e){this._cache=null,this._core=e,this._fill=null}return Object.defineProperty(e.prototype,"assetsCached",{get:function(){return null!=this._core&&null!=this._fill&&null!=this._cache&&null!=this._cache.image&&null!=this._cache.mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alt",{get:function(){return this._fill.calt},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ca",{get:function(){return null!=this._fill.cca?this._fill.cca:this._fill.ca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"capturedAt",{get:function(){return this._fill.captured_at},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"computedCA",{get:function(){return this._fill.cca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"computedLatLon",{get:function(){return this._core.cl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"focal",{get:function(){return this._fill.cfocal},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"full",{get:function(){return null!=this._fill},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullPano",{get:function(){return null!=this._fill.gpano&&0===this._fill.gpano.CroppedAreaLeftPixels&&0===this._fill.gpano.CroppedAreaTopPixels&&this._fill.gpano.CroppedAreaImageWidthPixels===this._fill.gpano.FullPanoWidthPixels&&this._fill.gpano.CroppedAreaImageHeightPixels===this._fill.gpano.FullPanoHeightPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"gpano",{get:function(){return this._fill.gpano},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._fill.height},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"image",{get:function(){return this._cache.image},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"key",{get:function(){return this._core.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"latLon",{get:function(){return null!=this._core.cl?this._core.cl:this._core.l},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadStatus",{get:function(){return this._cache.loadStatus},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"merged",{get:function(){return null!=this._fill&&null!=this._fill.merge_version&&this._fill.merge_version>0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mergeCC",{get:function(){return this._fill.merge_cc},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mergeVersion",{get:function(){return this._fill.merge_version},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mesh",{get:function(){return this._cache.mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"orientation",{get:function(){return this._fill.orientation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"originalCA",{get:function(){return this._fill.ca},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"originalLatLon",{get:function(){return this._core.l},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pano",{get:function(){return null!=this._fill.gpano&&null!=this._fill.gpano.FullPanoWidthPixels},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"projectKey",{get:function(){return null!=this._fill.project?this._fill.project.key:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rotation",{get:function(){return this._fill.c_rotation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"scale",{get:function(){return this._fill.atomic_scale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceKey",{get:function(){return this._core.sequence.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges",{get:function(){return this._cache.sequenceEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges$",{get:function(){return this._cache.sequenceEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges",{get:function(){return this._cache.spatialEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges$",{get:function(){return this._cache.spatialEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"userKey",{get:function(){return this._fill.user.key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"username",{get:function(){return this._fill.user.username},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"width",{get:function(){return this._fill.width},enumerable:!0,configurable:!0}),e.prototype.cacheAssets$=function(){var e=this;return this._cache.cacheAssets$(this.key,this.pano,this.merged).map(function(t){return e})},e.prototype.cacheImage$=function(e){var t=this;return this._cache.cacheImage$(this.key,e).map(function(e){return t})},e.prototype.cacheSequenceEdges=function(e){this._cache.cacheSequenceEdges(e)},e.prototype.cacheSpatialEdges=function(e){this._cache.cacheSpatialEdges(e)},e.prototype.dispose=function(){null!=this._cache&&(this._cache.dispose(),this._cache=null),this._core=null,this._fill=null},e.prototype.initializeCache=function(e){if(null!=this._cache)throw new Error("Node cache already initialized ("+this.key+").");this._cache=e},e.prototype.makeFull=function(e){if(null==e)throw new Error("Fill can not be null.");this._fill=e},e.prototype.resetSequenceEdges=function(){this._cache.resetSequenceEdges()},e.prototype.resetSpatialEdges=function(){this._cache.resetSpatialEdges()},e.prototype.uncache=function(){null!=this._cache&&(this._cache.dispose(),this._cache=null)},e}();r.Node=n,r.default=n},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],390:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("rxjs/Observable");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/publishReplay");var o=e("../Graph"),a=e("../Utils"),s=function(){function e(){this._disposed=!1,this._image=null,this._loadStatus={loaded:0,total:0},this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$=new n.Subject,this._sequenceEdges$=this._sequenceEdgesChanged$.startWith(this._sequenceEdges).publishReplay(1).refCount(),this._sequenceEdgesSubscription=this._sequenceEdges$.subscribe(function(){}),this._spatialEdgesChanged$=new n.Subject,this._spatialEdges$=this._spatialEdgesChanged$.startWith(this._spatialEdges).publishReplay(1).refCount(),this._spatialEdgesSubscription=this._spatialEdges$.subscribe(function(){}),this._cachingAssets$=null}return Object.defineProperty(e.prototype,"image",{get:function(){return this._image},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadStatus",{get:function(){return this._loadStatus},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mesh",{get:function(){return this._mesh},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges",{get:function(){return this._sequenceEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sequenceEdges$",{get:function(){return this._sequenceEdges$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges",{get:function(){return this._spatialEdges},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"spatialEdges$",{get:function(){return this._spatialEdges$},enumerable:!0,configurable:!0}),e.prototype.cacheAssets$=function(e,t,r){var n=this;if(null!=this._cachingAssets$)return this._cachingAssets$;var o=t?a.Settings.basePanoramaSize:a.Settings.baseImageSize;return this._cachingAssets$=i.Observable.combineLatest(this._cacheImage$(e,o),this._cacheMesh$(e,r),function(e,t){return n._loadStatus.loaded=0,n._loadStatus.total=0,t&&(n._mesh=t.object,n._loadStatus.loaded+=t.loaded.loaded,n._loadStatus.total+=t.loaded.total),e&&(n._image=e.object,n._loadStatus.loaded+=e.loaded.loaded,n._loadStatus.total+=e.loaded.total),n}).finally(function(){n._cachingAssets$=null}).publishReplay(1).refCount(),this._cachingAssets$},e.prototype.cacheImage$=function(e,t){var r=this;return null!=this._image&&t<=Math.max(this._image.width,this._image.height)?i.Observable.of(this):this._cacheImage$(e,t).first(function(e){return null!=e.object}).do(function(e){r._disposeImage(),r._image=e.object}).map(function(e){return r})},e.prototype.cacheSequenceEdges=function(e){this._sequenceEdges={cached:!0,edges:e},this._sequenceEdgesChanged$.next(this._sequenceEdges)},e.prototype.cacheSpatialEdges=function(e){this._spatialEdges={cached:!0,edges:e},this._spatialEdgesChanged$.next(this._spatialEdges)},e.prototype.dispose=function(){this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._disposeImage(),this._mesh=null,this._loadStatus.loaded=0,this._loadStatus.total=0,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges),this._spatialEdgesChanged$.next(this._spatialEdges),this._disposed=!0,null!=this._imageRequest&&this._imageRequest.abort(),null!=this._meshRequest&&this._meshRequest.abort()},e.prototype.resetSequenceEdges=function(){this._sequenceEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges)},e.prototype.resetSpatialEdges=function(){this._spatialEdges={cached:!1,edges:[]},this._spatialEdgesChanged$.next(this._spatialEdges)},e.prototype._cacheImage$=function(e,t){var r=this;return i.Observable.create(function(n){var i=new XMLHttpRequest;i.open("GET",a.Urls.thumbnail(e,t),!0),i.responseType="arraybuffer",i.timeout=15e3,i.onload=function(t){if(200!==i.status)return r._imageRequest=null,void n.error(new Error("Failed to fetch image ("+e+"). Status: "+i.status+", "+i.statusText));var o=new Image;o.crossOrigin="Anonymous",o.onload=function(i){if(r._imageRequest=null,r._disposed)return window.URL.revokeObjectURL(o.src),void n.error(new Error("Image load was aborted ("+e+")"));n.next({loaded:{loaded:t.loaded,total:t.total},object:o}),n.complete()},o.onerror=function(t){r._imageRequest=null,n.error(new Error("Failed to load image ("+e+")"))};var a=new Blob([i.response]);o.src=window.URL.createObjectURL(a)},i.onprogress=function(e){r._disposed||n.next({loaded:{loaded:e.loaded,total:e.total},object:null})},i.onerror=function(t){r._imageRequest=null,n.error(new Error("Failed to fetch image ("+e+")"))},i.ontimeout=function(t){r._imageRequest=null,n.error(new Error("Image request timed out ("+e+")"))},i.onabort=function(t){r._imageRequest=null,n.error(new Error("Image request was aborted ("+e+")"))},r._imageRequest=i,i.send(null)})},e.prototype._cacheMesh$=function(e,r){var n=this;return i.Observable.create(function(i){if(!r)return i.next(n._createEmptyMeshLoadStatus()),void i.complete();var s=new XMLHttpRequest;s.open("GET",a.Urls.protoMesh(e),!0),s.responseType="arraybuffer",s.timeout=15e3,s.onload=function(e){if(n._meshRequest=null,!n._disposed){var r=200===s.status?o.MeshReader.read(new t(s.response)):{faces:[],vertices:[]};i.next({loaded:{loaded:e.loaded,total:e.total},object:r}),i.complete()}},s.onprogress=function(e){n._disposed||i.next({loaded:{loaded:e.loaded,total:e.total},object:null})},s.onerror=function(t){n._meshRequest=null,console.error("Failed to cache mesh ("+e+")"),i.next(n._createEmptyMeshLoadStatus()),i.complete()},s.ontimeout=function(t){n._meshRequest=null,console.error("Mesh request timed out ("+e+")"),i.next(n._createEmptyMeshLoadStatus()),i.complete()},s.onabort=function(t){n._meshRequest=null,i.error(new Error("Mesh request was aborted ("+e+")"))},n._meshRequest=s,s.send(null)})},e.prototype._createEmptyMeshLoadStatus=function(){return{loaded:{loaded:0,total:0},object:{faces:[],vertices:[]}}},e.prototype._disposeImage=function(){null!=this._image&&window.URL.revokeObjectURL(this._image.src),this._image=null},e}();r.NodeCache=s,r.default=s}).call(this,e("buffer").Buffer)},{"../Graph":285,"../Utils":291,buffer:7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],391:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=function(){function e(e){this._key=e.key,this._keys=e.keys}return Object.defineProperty(e.prototype,"key",{get:function(){return this._key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"keys",{get:function(){return this._keys},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._key=null,this._keys=null},e.prototype.findNextKey=function(e){var t=n.indexOf(this._keys,e);return t+1>=this._keys.length||-1===t?null:this._keys[t+1]},e.prototype.findPrevKey=function(e){var t=n.indexOf(this._keys,e);return 0===t||-1===t?null:this._keys[t-1]},e}();r.Sequence=i,r.default=i},{underscore:233}],392:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../../Edge"),o=e("../../Error"),a=e("../../Geo"),s=function(){function e(e,t,r){this._spatial=new a.Spatial,this._geoCoords=new a.GeoCoords,this._settings=null!=e?e:new i.EdgeCalculatorSettings,this._directions=null!=t?t:new i.EdgeCalculatorDirections,this._coefficients=null!=r?r:new i.EdgeCalculatorCoefficients}return e.prototype.getPotentialEdges=function(e,t,r){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(!e.merged)return[];for(var i=this._spatial.viewingDirection(e.rotation),a=this._spatial.angleToPlane(i.toArray(),[0,0,1]),s=[],c=0,u=t;c<u.length;c++){var h=u[c];if(h.merged&&h.key!==e.key){var l=this._geoCoords.geodeticToEnu(h.latLon.lat,h.latLon.lon,h.alt,e.latLon.lat,e.latLon.lon,e.alt),p=new n.Vector3(l[0],l[1],l[2]),f=p.length();if(!(f>this._settings.maxDistance&&r.indexOf(h.key)<0)){var d=this._spatial.angleBetweenVector2(i.x,i.y,p.x,p.y),m=this._spatial.angleToPlane(p.toArray(),[0,0,1]),v=this._spatial.viewingDirection(h.rotation),g=this._spatial.angleBetweenVector2(i.x,i.y,v.x,v.y),y=this._spatial.angleToPlane(v.toArray(),[0,0,1])-a,b=this._spatial.relativeRotationAngle(e.rotation,h.rotation),_=this._spatial.angleBetweenVector2(1,0,p.x,p.y),x=null!=h.sequenceKey&&null!=e.sequenceKey&&h.sequenceKey===e.sequenceKey,w=null==h.mergeCC&&null==e.mergeCC||h.mergeCC===e.mergeCC,S=h.userKey===e.userKey,M={capturedAt:h.capturedAt,croppedPano:h.pano&&!h.fullPano,directionChange:g,distance:f,fullPano:h.fullPano,key:h.key,motionChange:d,rotation:b,sameMergeCC:w,sameSequence:x,sameUser:S,sequenceKey:h.sequenceKey,verticalDirectionChange:y,verticalMotion:m,worldMotionAzimuth:_};s.push(M)}}}return s},e.prototype.computeSequenceEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(e.sequenceKey!==t.key)throw new o.ArgumentMapillaryError("Node and sequence does not correspond.");var r=[],n=t.findNextKey(e.key);null!=n&&r.push({data:{direction:i.EdgeDirection.Next,worldMotionAzimuth:Number.NaN},from:e.key,to:n});var a=t.findPrevKey(e.key);return null!=a&&r.push({data:{direction:i.EdgeDirection.Prev,worldMotionAzimuth:Number.NaN},from:e.key,to:a}),r},e.prototype.computeSimilarEdges=function(e,t){var r=this;if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");for(var n=e.fullPano,a={},s=0,c=t;s<c.length;s++){if(null!=(v=c[s]).sequenceKey&&(!v.sameSequence&&v.sameMergeCC)){if(n){if(!v.fullPano)continue}else if(!v.fullPano&&Math.abs(v.directionChange)>this._settings.similarMaxDirectionChange)continue;v.distance>this._settings.similarMaxDistance||v.sameUser&&Math.abs(v.capturedAt-e.capturedAt)<this._settings.similarMinTimeDifference||(null==a[v.sequenceKey]&&(a[v.sequenceKey]=[]),a[v.sequenceKey].push(v))}}var u=[],h=e.fullPano?function(e){return e.distance}:function(e){return r._coefficients.similarDistance*e.distance+r._coefficients.similarRotation*e.rotation};for(var l in a)if(a.hasOwnProperty(l)){for(var p=Number.MAX_VALUE,f=null,d=0,m=a[l];d<m.length;d++){var v=m[d],g=h(v);g<p&&(p=g,f=v)}null!=f&&u.push(f)}return u.map(function(t){return{data:{direction:i.EdgeDirection.Similar,worldMotionAzimuth:t.worldMotionAzimuth},from:e.key,to:t.key}})},e.prototype.computeStepEdges=function(e,t,r,n){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");var i=[];if(e.pano)return i;for(var a in this._directions.steps)if(this._directions.steps.hasOwnProperty(a)){for(var s=this._directions.steps[a],c=Number.MAX_VALUE,u=null,h=null,l=0,p=t;l<p.length;l++){var f=p[l];if(!f.croppedPano&&!f.fullPano&&!(Math.abs(f.directionChange)>this._settings.stepMaxDirectionChange)){var d=this._spatial.angleDifference(s.motionChange,f.motionChange),m=this._spatial.angleDifference(f.directionChange,d),v=Math.max(Math.abs(d),Math.abs(m));if(!(Math.abs(v)>this._settings.stepMaxDrift)){var g=f.key;if(!s.useFallback||g!==r&&g!==n||(h=f),!(f.distance>this._settings.stepMaxDistance)){d=Math.sqrt(d*d+f.verticalMotion*f.verticalMotion);var y=this._coefficients.stepPreferredDistance*Math.abs(f.distance-this._settings.stepPreferredDistance)/this._settings.stepMaxDistance+this._coefficients.stepMotion*d/this._settings.stepMaxDrift+this._coefficients.stepRotation*f.rotation/this._settings.stepMaxDirectionChange+this._coefficients.stepSequencePenalty*(f.sameSequence?0:1)+this._coefficients.stepMergeCCPenalty*(f.sameMergeCC?0:1);y<c&&(c=y,u=f)}}}}null!=(u=null==u?h:u)&&i.push({data:{direction:s.direction,worldMotionAzimuth:u.worldMotionAzimuth},from:e.key,to:u.key})}return i},e.prototype.computeTurnEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");var r=[];if(e.pano)return r;for(var n in this._directions.turns)if(this._directions.turns.hasOwnProperty(n)){for(var a=this._directions.turns[n],s=Number.MAX_VALUE,c=null,u=0,h=t;u<h.length;u++){var l=h[u];if(!l.croppedPano&&!l.fullPano&&!(l.distance>this._settings.turnMaxDistance)){var p=a.direction!==i.EdgeDirection.TurnU&&l.distance<this._settings.turnMaxRigDistance&&Math.abs(l.directionChange)>this._settings.turnMinRigDirectionChange,f=this._spatial.angleDifference(a.directionChange,l.directionChange),d=void 0;if(p&&l.directionChange*a.directionChange>0&&Math.abs(l.directionChange)<Math.abs(a.directionChange))d=-Math.PI/2+Math.abs(l.directionChange);else{if(Math.abs(f)>this._settings.turnMaxDirectionChange)continue;var m=a.motionChange?this._spatial.angleDifference(a.motionChange,l.motionChange):0;m=Math.sqrt(m*m+l.verticalMotion*l.verticalMotion),d=this._coefficients.turnDistance*l.distance/this._settings.turnMaxDistance+this._coefficients.turnMotion*m/Math.PI+this._coefficients.turnSequencePenalty*(l.sameSequence?0:1)+this._coefficients.turnMergeCCPenalty*(l.sameMergeCC?0:1)}d<s&&(s=d,c=l)}}null!=c&&r.push({data:{direction:a.direction,worldMotionAzimuth:c.worldMotionAzimuth},from:e.key,to:c.key})}return r},e.prototype.computePerspectiveToPanoEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(e.pano)return[];for(var r=Number.MAX_VALUE,n=null,a=0,s=t;a<s.length;a++){var c=s[a];if(c.fullPano){var u=this._coefficients.panoPreferredDistance*Math.abs(c.distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(c.motionChange)/Math.PI+this._coefficients.panoMergeCCPenalty*(c.sameMergeCC?0:1);u<r&&(r=u,n=c)}}return null==n?[]:[{data:{direction:i.EdgeDirection.Pano,worldMotionAzimuth:n.worldMotionAzimuth},from:e.key,to:n.key}]},e.prototype.computePanoEdges=function(e,t){if(!e.full)throw new o.ArgumentMapillaryError("Node has to be full.");if(!e.fullPano)return[];for(var r=[],n=[],a=[],s=0,c=t;s<c.length;s++){if(!((w=c[s]).distance>this._settings.panoMaxDistance))if(w.fullPano){if(w.distance<this._settings.panoMinDistance)continue;n.push(w)}else{if(w.croppedPano)continue;for(var u in this._directions.panos)if(this._directions.panos.hasOwnProperty(u)){var h=this._directions.panos[u],l=this._spatial.angleDifference(w.directionChange,w.motionChange),p=this._spatial.angleDifference(h.directionChange,l);if(!(Math.abs(p)>this._settings.panoMaxStepTurnChange)){a.push([h.direction,w]);break}}}}for(var f=Math.PI/this._settings.panoMaxItems,d=[],m=[],v=0;v<this._settings.panoMaxItems;v++){for(var g=v/this._settings.panoMaxItems*2*Math.PI,y=Number.MAX_VALUE,b=null,_=0,x=n;_<x.length;_++){var w=x[_],S=this._spatial.angleDifference(g,w.motionChange);if(!(Math.abs(S)>f)){for(var M=Number.MAX_VALUE,E=0,C=d;E<C.length;E++){var T=C[E],O=Math.abs(this._spatial.angleDifference(T,w.motionChange));O<M&&(M=O)}if(!(M<=f)){(z=this._coefficients.panoPreferredDistance*Math.abs(w.distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(S)/f+this._coefficients.panoSequencePenalty*(w.sameSequence?0:1)+this._coefficients.panoMergeCCPenalty*(w.sameMergeCC?0:1))<y&&(y=z,b=w)}}}null!=b?(d.push(b.motionChange),r.push({data:{direction:i.EdgeDirection.Pano,worldMotionAzimuth:b.worldMotionAzimuth},from:e.key,to:b.key})):m.push(g)}var P={};P[i.EdgeDirection.Pano]=d,P[i.EdgeDirection.StepForward]=[],P[i.EdgeDirection.StepLeft]=[],P[i.EdgeDirection.StepBackward]=[],P[i.EdgeDirection.StepRight]=[];for(var j=0,A=m;j<A.length;j++){var R=A[j],L=[];for(var u in this._directions.panos)if(this._directions.panos.hasOwnProperty(u)){for(var h=this._directions.panos[u],N=P[i.EdgeDirection.Pano].concat(P[h.direction]).concat(P[h.prev]).concat(P[h.next]),y=Number.MAX_VALUE,b=null,I=0,D=a;I<D.length;I++){if((w=D[I])[0]===h.direction){var k=this._spatial.angleDifference(R,w[1].motionChange);if(!(Math.abs(k)>f)){for(var F=Number.MAX_VALUE,B=0,U=N;B<U.length;B++){T=U[B];(M=Math.abs(this._spatial.angleDifference(T,w[1].motionChange)))<F&&(F=M)}if(!(F<=f)){var z=this._coefficients.panoPreferredDistance*Math.abs(w[1].distance-this._settings.panoPreferredDistance)/this._settings.panoMaxDistance+this._coefficients.panoMotion*Math.abs(k)/f+this._coefficients.panoMergeCCPenalty*(w[1].sameMergeCC?0:1);z<y&&(y=z,b=w)}}}}null!=b&&(L.push(b),r.push({data:{direction:b[0],worldMotionAzimuth:b[1].worldMotionAzimuth},from:e.key,to:b[1].key}))}for(var $=0,G=L;$<G.length;$++){var V=G[$];P[V[0]].push(V[1].motionChange)}}return r},e}();r.EdgeCalculator=s,r.default=s},{"../../Edge":282,"../../Error":283,"../../Geo":284,three:231}],393:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(){this.panoPreferredDistance=2,this.panoMotion=2,this.panoSequencePenalty=1,this.panoMergeCCPenalty=4,this.stepPreferredDistance=4,this.stepMotion=3,this.stepRotation=4,this.stepSequencePenalty=2,this.stepMergeCCPenalty=6,this.similarDistance=2,this.similarRotation=3,this.turnDistance=4,this.turnMotion=2,this.turnSequencePenalty=1,this.turnMergeCCPenalty=4}}();r.EdgeCalculatorCoefficients=n,r.default=n},{}],394:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Edge"),i=function(){return function(){this.steps={},this.turns={},this.panos={},this.steps[n.EdgeDirection.StepForward]={direction:n.EdgeDirection.StepForward,motionChange:0,useFallback:!0},this.steps[n.EdgeDirection.StepBackward]={direction:n.EdgeDirection.StepBackward,motionChange:Math.PI,useFallback:!0},this.steps[n.EdgeDirection.StepLeft]={direction:n.EdgeDirection.StepLeft,motionChange:Math.PI/2,useFallback:!1},this.steps[n.EdgeDirection.StepRight]={direction:n.EdgeDirection.StepRight,motionChange:-Math.PI/2,useFallback:!1},this.turns[n.EdgeDirection.TurnLeft]={direction:n.EdgeDirection.TurnLeft,directionChange:Math.PI/2,motionChange:Math.PI/4},this.turns[n.EdgeDirection.TurnRight]={direction:n.EdgeDirection.TurnRight,directionChange:-Math.PI/2,motionChange:-Math.PI/4},this.turns[n.EdgeDirection.TurnU]={direction:n.EdgeDirection.TurnU,directionChange:Math.PI,motionChange:null},this.panos[n.EdgeDirection.StepForward]={direction:n.EdgeDirection.StepForward,directionChange:0,next:n.EdgeDirection.StepLeft,prev:n.EdgeDirection.StepRight},this.panos[n.EdgeDirection.StepBackward]={direction:n.EdgeDirection.StepBackward,directionChange:Math.PI,next:n.EdgeDirection.StepRight,prev:n.EdgeDirection.StepLeft},this.panos[n.EdgeDirection.StepLeft]={direction:n.EdgeDirection.StepLeft,directionChange:Math.PI/2,next:n.EdgeDirection.StepBackward,prev:n.EdgeDirection.StepForward},this.panos[n.EdgeDirection.StepRight]={direction:n.EdgeDirection.StepRight,directionChange:-Math.PI/2,next:n.EdgeDirection.StepForward,prev:n.EdgeDirection.StepBackward}}}();r.EdgeCalculatorDirections=i},{"../../Edge":282}],395:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this.panoMinDistance=.1,this.panoMaxDistance=20,this.panoPreferredDistance=5,this.panoMaxItems=4,this.panoMaxStepTurnChange=Math.PI/8,this.rotationMaxDistance=this.turnMaxRigDistance,this.rotationMaxDirectionChange=Math.PI/6,this.rotationMaxVerticalDirectionChange=Math.PI/8,this.similarMaxDirectionChange=Math.PI/8,this.similarMaxDistance=12,this.similarMinTimeDifference=432e5,this.stepMaxDistance=20,this.stepMaxDirectionChange=Math.PI/6,this.stepMaxDrift=Math.PI/6,this.stepPreferredDistance=4,this.turnMaxDistance=15,this.turnMaxDirectionChange=2*Math.PI/9,this.turnMaxRigDistance=.65,this.turnMinRigDirectionChange=Math.PI/6}return Object.defineProperty(e.prototype,"maxDistance",{get:function(){return Math.max(this.panoMaxDistance,this.similarMaxDistance,this.stepMaxDistance,this.turnMaxDistance)},enumerable:!0,configurable:!0}),e}();r.EdgeCalculatorSettings=n,r.default=n},{}],396:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Next=0]="Next",e[e.Prev=1]="Prev",e[e.StepLeft=2]="StepLeft",e[e.StepRight=3]="StepRight",e[e.StepForward=4]="StepForward",e[e.StepBackward=5]="StepBackward",e[e.TurnLeft=6]="TurnLeft",e[e.TurnRight=7]="TurnRight",e[e.TurnU=8]="TurnU",e[e.Pano=9]="Pano",e[e.Similar=10]="Similar"}(r.EdgeDirection||(r.EdgeDirection={}))},{}],397:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("virtual-dom"),o=e("rxjs/Subject");e("rxjs/add/operator/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pluck"),e("rxjs/add/operator/scan");var a=e("../Render"),s=function(){function e(e,t,r){this._adaptiveOperation$=new o.Subject,this._render$=new o.Subject,this._renderAdaptive$=new o.Subject,this._renderService=t,this._currentFrame$=r;var s=i.create(i.h("div.domRenderer",[]));e.appendChild(s),this._offset$=this._adaptiveOperation$.scan(function(e,t){return t(e)},{elementHeight:e.offsetHeight,elementWidth:e.offsetWidth,imageAspect:0,renderMode:a.RenderMode.Fill}).filter(function(e){return e.imageAspect>0&&e.elementWidth>0&&e.elementHeight>0}).map(function(e){var t=e.elementWidth/e.elementHeight,r=e.imageAspect/t,n=0,i=0;return e.renderMode===a.RenderMode.Letterbox?e.imageAspect>t?n=e.elementHeight*(1-1/r)/2:i=e.elementWidth*(1-r)/2:e.imageAspect>t?i=-e.elementWidth*(r-1)/2:n=-e.elementHeight*(1/r-1)/2,{bottom:n,left:i,right:i,top:n}}),this._currentFrame$.filter(function(e){return null!=e.state.currentNode}).distinctUntilChanged(function(e,t){return e===t},function(e){return e.state.currentNode.key}).map(function(e){return e.state.currentTransform.basicAspect}).map(function(e){return function(t){return t.imageAspect=e,t}}).subscribe(this._adaptiveOperation$),this._renderAdaptive$.scan(function(e,t){return null==t.vnode?delete e[t.name]:e[t.name]=t.vnode,e},{}).combineLatest(this._offset$).map(function(e){var t=n.values(e[0]),r=e[1],o={style:{bottom:r.bottom+"px",left:r.left+"px","pointer-events":"none",position:"absolute",right:r.right+"px",top:r.top+"px"}};return{name:"adaptiveDomRenderer",vnode:i.h("div.adaptiveDomRenderer",o,t)}}).subscribe(this._render$),this._vNode$=this._render$.scan(function(e,t){return null==t.vnode?delete e[t.name]:e[t.name]=t.vnode,e},{}).map(function(e){var t=n.values(e);return i.h("div.domRenderer",t)}),this._vPatch$=this._vNode$.scan(function(e,t){return e.vpatch=i.diff(e.vnode,t),e.vnode=t,e},{vnode:i.h("div.domRenderer",[]),vpatch:null}).pluck("vpatch"),this._element$=this._vPatch$.scan(function(e,t){return i.patch(e,t)},s).publishReplay(1).refCount(),this._element$.subscribe(function(){}),this._renderService.size$.map(function(e){return function(t){return t.elementWidth=e.width,t.elementHeight=e.height,t}}).subscribe(this._adaptiveOperation$),this._renderService.renderMode$.map(function(e){return function(t){return t.renderMode=e,t}}).subscribe(this._adaptiveOperation$)}return Object.defineProperty(e.prototype,"element$",{get:function(){return this._element$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"render$",{get:function(){return this._render$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderAdaptive$",{get:function(){return this._renderAdaptive$},enumerable:!0,configurable:!0}),e.prototype.clear=function(e){this._renderAdaptive$.next({name:e,vnode:null}),this._render$.next({name:e,vnode:null})},e}();r.DOMRenderer=s,r.default=s},{"../Render":287,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":75,underscore:233,"virtual-dom":237}],398:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Background=0]="Background",e[e.Foreground=1]="Foreground"}(n=r.GLRenderStage||(r.GLRenderStage={})),r.default=n},{}],399:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/share"),e("rxjs/add/operator/startWith");var a=e("../Render"),s=e("../Utils"),c=function(){function e(e,t,r){var c=this;this._renderFrame$=new o.Subject,this._renderCameraOperation$=new o.Subject,this._render$=new o.Subject,this._clear$=new o.Subject,this._renderOperation$=new o.Subject,this._rendererOperation$=new o.Subject,this._eraserOperation$=new o.Subject,this._renderService=t,this._dom=r||new s.DOM,this._renderer$=this._rendererOperation$.scan(function(e,t){return t(e)},{needsRender:!1,renderer:null}),this._renderCollection$=this._renderOperation$.scan(function(e,t){return t(e)},{}).share(),this._renderCamera$=this._renderCameraOperation$.scan(function(e,t){return t(e)},{frameId:-1,needsRender:!1,perspective:null}),this._eraser$=this._eraserOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},{needsRender:!1}),i.Observable.combineLatest([this._renderer$,this._renderCollection$,this._renderCamera$,this._eraser$],function(e,t,r,n){return{camera:r,eraser:n,renderer:e,renders:Object.keys(t).map(function(e){return t[e]})}}).filter(function(e){for(var t=e.renderer.needsRender||e.camera.needsRender||e.eraser.needsRender,r=e.camera.frameId,n=0,i=e.renders;n<i.length;n++){var o=i[n];if(o.frameId!==r)return!1;t=t||o.needsRender}return t}).distinctUntilChanged(function(e,t){return e===t},function(e){return e.eraser.needsRender?-1:e.camera.frameId}).subscribe(function(e){e.renderer.needsRender=!1,e.camera.needsRender=!1,e.eraser.needsRender=!1;for(var t=e.camera.perspective,r=[],n=[],i=0,o=e.renders;i<o.length;i++){(p=o[i]).stage===a.GLRenderStage.Background?r.push(p.render):p.stage===a.GLRenderStage.Foreground&&n.push(p.render)}var s=e.renderer.renderer;s.clear();for(var c=0,u=r;c<u.length;c++){(p=u[c])(t,s)}s.clearDepth();for(var h=0,l=n;h<l.length;h++){var p=l[h];p(t,s)}}),this._renderFrame$.map(function(e){return function(t){return t.frameId=e.frameId,t.perspective=e.perspective,!0===e.changed&&(t.needsRender=!0),t}}).subscribe(this._renderCameraOperation$),this._renderFrameSubscribe();var u=this._render$.map(function(e){return function(t){return t[e.name]=e.render,t}}),h=this._clear$.map(function(e){return function(t){return delete t[e],t}});i.Observable.merge(u,h).subscribe(this._renderOperation$),this._webGLRenderer$=this._render$.first().map(function(r){var i=c._dom.createElement("canvas","mapillary-js-canvas");i.style.position="absolute",i.setAttribute("tabindex","0"),e.appendChild(i);var o=t.element,a=new n.WebGLRenderer({canvas:i});return a.setPixelRatio(window.devicePixelRatio),a.setSize(o.offsetWidth,o.offsetHeight),a.setClearColor(new n.Color(2105376),1),a.autoClear=!1,a}).publishReplay(1).refCount(),this._webGLRenderer$.subscribe(function(){});var l=this._webGLRenderer$.first().map(function(e){return function(t){return t.needsRender=!0,t.renderer=e,t}}),p=this._renderService.size$.map(function(e){return function(t){return null==t.renderer?t:(t.renderer.setSize(e.width,e.height),t.needsRender=!0,t)}}),f=this._clear$.map(function(e){return function(e){return null==e.renderer?e:(e.needsRender=!0,e)}});i.Observable.merge(l,p,f).subscribe(this._rendererOperation$);var d=this._renderCollection$.filter(function(e){return 0===Object.keys(e).length}).share();d.subscribe(function(e){null!=c._renderFrameSubscription&&(c._renderFrameSubscription.unsubscribe(),c._renderFrameSubscription=null,c._renderFrameSubscribe())}),d.map(function(e){return function(e){return e.needsRender=!0,e}}).subscribe(this._eraserOperation$)}return Object.defineProperty(e.prototype,"render$",{get:function(){return this._render$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"webGLRenderer$",{get:function(){return this._webGLRenderer$},enumerable:!0,configurable:!0}),e.prototype.clear=function(e){this._clear$.next(e)},e.prototype._renderFrameSubscribe=function(){var e=this;this._render$.first().map(function(e){return function(e){return e.needsRender=!0,e}}).subscribe(function(t){e._renderCameraOperation$.next(t)}),this._renderFrameSubscription=this._render$.first().mergeMap(function(t){return e._renderService.renderCameraFrame$}).subscribe(this._renderFrame$)},e}();r.GLRenderer=c,r.default=c},{"../Render":287,"../Utils":291,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":75,"rxjs/add/operator/share":76,"rxjs/add/operator/startWith":80,three:231}],400:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../Geo"),o=e("../Render"),a=function(){function e(e,t,r){this.alpha=-1,this.zoom=0,this._frameId=-1,this._changed=!1,this._changedForFrame=-1,this.currentAspect=1,this.currentPano=!1,this.previousAspect=1,this.previousPano=!1,this.renderMode=r,this._spatial=new i.Spatial,this._camera=new i.Camera;var o=this._getPerspectiveCameraAspect(e,t);this._perspective=new n.PerspectiveCamera(50,o,.4,1e4),this._perspective.matrixAutoUpdate=!1,this._rotation={phi:0,theta:0}}return Object.defineProperty(e.prototype,"camera",{get:function(){return this._camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"changed",{get:function(){return this.frameId===this._changedForFrame},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"frameId",{get:function(){return this._frameId},set:function(e){this._frameId=e,this._changed&&(this._changed=!1,this._changedForFrame=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"perspective",{get:function(){return this._perspective},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rotation",{get:function(){return this._rotation},enumerable:!0,configurable:!0}),e.prototype.updateAspect=function(e,t){var r=this._getPerspectiveCameraAspect(e,t);this._perspective.aspect=r,this._changed=!0},e.prototype.updateProjection=function(){var e=this._getAspect(this.currentAspect,this.currentPano,this.perspective.aspect),t=this._getAspect(this.previousAspect,this.previousPano,this.perspective.aspect),r=(1-this.alpha)*t+this.alpha*e,n=this._getVerticalFov(r,this._camera.focal,this.zoom);this._perspective.fov=n,this._perspective.updateProjectionMatrix(),this._changed=!0},e.prototype.updatePerspective=function(e){this._perspective.up.copy(e.up),this._perspective.position.copy(e.position),this._perspective.lookAt(e.lookat),this._perspective.updateMatrix(),this._perspective.updateMatrixWorld(!1),this._changed=!0},e.prototype.updateRotation=function(e){this._rotation=this._getRotation(e)},e.prototype._getVerticalFov=function(e,t,r){return 2*Math.atan(.5/(Math.pow(2,r)*e*t))*180/Math.PI},e.prototype._getAspect=function(e,t,r){if(t)return 1;var n=Math.max(1,1/e);return(this.renderMode===o.RenderMode.Letterbox?e>r:e<r)?n*r:n*e},e.prototype._getPerspectiveCameraAspect=function(e,t){return 0===e?0:e/t},e.prototype._getRotation=function(e){var t=e.lookat.clone().sub(e.position),r=e.up.clone(),n=t.clone().dot(r),i=t.clone().sub(r.clone().multiplyScalar(n));return{phi:Math.atan2(i.y,i.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}},e}();r.RenderCamera=a,r.default=a},{"../Geo":284,"../Render":287,three:231}],401:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Letterbox=0]="Letterbox",e[e.Fill=1]="Fill"}(n=r.RenderMode||(r.RenderMode={})),r.default=n},{}],402:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Subject"),i=e("rxjs/BehaviorSubject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/skip"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/withLatestFrom");var o=e("../Geo"),a=e("../Render"),s=function(){function e(e,t,r){var s=this;this._element=e,this._currentFrame$=t,this._spatial=new o.Spatial,r=null!=r?r:a.RenderMode.Fill,this._resize$=new n.Subject,this._renderCameraOperation$=new n.Subject,this._size$=new i.BehaviorSubject({height:this._element.offsetHeight,width:this._element.offsetWidth}),this._resize$.map(function(){return{height:s._element.offsetHeight,width:s._element.offsetWidth}}).subscribe(this._size$),this._renderMode$=new i.BehaviorSubject(r),this._renderCameraHolder$=this._renderCameraOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},new a.RenderCamera(this._element.offsetWidth,this._element.offsetHeight,r)).publishReplay(1).refCount(),this._renderCameraFrame$=this._currentFrame$.withLatestFrom(this._renderCameraHolder$,function(e,t){return[e,t]}).do(function(e){var t=e[0],r=e[1],n=t.state.camera;if(r.alpha!==t.state.alpha||r.zoom!==t.state.zoom||r.camera.diff(n)>1e-9){var i=t.state.currentTransform,o=null!=t.state.previousTransform?t.state.previousTransform:t.state.currentTransform,a=null!=t.state.previousNode?t.state.previousNode:t.state.currentNode;r.currentAspect=i.basicAspect,r.currentPano=t.state.currentNode.pano,r.previousAspect=o.basicAspect,r.previousPano=a.pano,r.alpha=t.state.alpha,r.zoom=t.state.zoom,r.camera.copy(n),r.updatePerspective(n),r.updateRotation(n),r.updateProjection()}r.frameId=t.id}).map(function(e){return e[1]}).publishReplay(1).refCount(),this._renderCamera$=this._renderCameraFrame$.filter(function(e){return e.changed}).publishReplay(1).refCount(),this._bearing$=this._renderCamera$.map(function(e){var t=s._spatial.radToDeg(s._spatial.azimuthalToBearing(e.rotation.phi));return s._spatial.wrap(t,0,360)}).publishReplay(1).refCount(),this._size$.skip(1).map(function(e){return function(t){return t.updateAspect(e.width,e.height),t.updateProjection(),t}}).subscribe(this._renderCameraOperation$),this._renderMode$.skip(1).map(function(e){return function(t){return t.renderMode=e,t.updateProjection(),t}}).subscribe(this._renderCameraOperation$),this._bearing$.subscribe(function(){}),this._renderCameraHolder$.subscribe(function(){}),this._size$.subscribe(function(){}),this._renderMode$.subscribe(function(){}),this._renderCamera$.subscribe(function(){}),this._renderCameraFrame$.subscribe(function(){})}return Object.defineProperty(e.prototype,"bearing$",{get:function(){return this._bearing$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"element",{get:function(){return this._element},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"resize$",{get:function(){return this._resize$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size$",{get:function(){return this._size$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderMode$",{get:function(){return this._renderMode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderCameraFrame$",{get:function(){return this._renderCameraFrame$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderCamera$",{get:function(){return this._renderCamera$},enumerable:!0,configurable:!0}),e}();r.RenderService=s,r.default=s},{"../Geo":284,"../Render":287,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/skip":77,"rxjs/add/operator/startWith":80,"rxjs/add/operator/withLatestFrom":87}],403:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Traversing=0]="Traversing",e[e.Waiting=1]="Waiting"}(n=r.State||(r.State={})),r.default=n},{}],404:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../State"),i=e("../Geo"),o=function(){function e(){this._state=new n.TraversingState({alpha:1,camera:new i.Camera,currentIndex:-1,reference:{alt:0,lat:0,lon:0},trajectory:[],zoom:0})}return e.prototype.traverse=function(){this._state=this._state.traverse()},e.prototype.wait=function(){this._state=this._state.wait()},Object.defineProperty(e.prototype,"state",{get:function(){if(this._state instanceof n.TraversingState)return n.State.Traversing;if(this._state instanceof n.WaitingState)return n.State.Waiting;throw new Error("Invalid state")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"reference",{get:function(){return this._state.reference},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alpha",{get:function(){return this._state.alpha},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"camera",{get:function(){return this._state.camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"zoom",{get:function(){return this._state.zoom},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode",{get:function(){return this._state.currentNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousNode",{get:function(){return this._state.previousNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera",{get:function(){return this._state.currentCamera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform",{get:function(){return this._state.currentTransform},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousTransform",{get:function(){return this._state.previousTransform},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"trajectory",{get:function(){return this._state.trajectory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentIndex",{get:function(){return this._state.currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"lastNode",{get:function(){return this._state.trajectory[this._state.trajectory.length-1]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nodesAhead",{get:function(){return this._state.trajectory.length-1-this._state.currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"motionless",{get:function(){return this._state.motionless},enumerable:!0,configurable:!0}),e.prototype.getCenter=function(){return this._state.getCenter()},e.prototype.setCenter=function(e){this._state.setCenter(e)},e.prototype.setZoom=function(e){this._state.setZoom(e)},e.prototype.update=function(e){this._state.update(e)},e.prototype.append=function(e){this._state.append(e)},e.prototype.prepend=function(e){this._state.prepend(e)},e.prototype.remove=function(e){this._state.remove(e)},e.prototype.clear=function(){this._state.clear()},e.prototype.clearPrior=function(){this._state.clearPrior()},e.prototype.cut=function(){this._state.cut()},e.prototype.set=function(e){this._state.set(e)},e.prototype.rotate=function(e){this._state.rotate(e)},e.prototype.rotateBasic=function(e){this._state.rotateBasic(e)},e.prototype.rotateBasicUnbounded=function(e){this._state.rotateBasicUnbounded(e)},e.prototype.rotateBasicWithoutInertia=function(e){this._state.rotateBasicWithoutInertia(e)},e.prototype.rotateToBasic=function(e){this._state.rotateToBasic(e)},e.prototype.move=function(e){this._state.move(e)},e.prototype.moveTo=function(e){this._state.moveTo(e)},e.prototype.zoomIn=function(e,t){this._state.zoomIn(e,t)},e.prototype.setSpeed=function(e){this._state.setSpeed(e)},e}();r.StateContext=o},{"../Geo":284,"../State":288}],405:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Subject"),o=e("rxjs/util/AnimationFrame");e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/do"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/pairwise"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var a=e("../State"),s=function(){function e(){var e=this;this._appendNode$=new i.Subject,this._start$=new i.Subject,this._frame$=new i.Subject,this._fpsSampleRate=30,this._contextOperation$=new n.BehaviorSubject(function(e){return e}),this._context$=this._contextOperation$.scan(function(e,t){return t(e)},new a.StateContext).publishReplay(1).refCount(),this._state$=this._context$.map(function(e){return e.state}).distinctUntilChanged().publishReplay(1).refCount(),this._fps$=this._start$.switchMap(function(){return e._frame$.bufferCount(1,e._fpsSampleRate).map(function(e){return(new Date).getTime()}).pairwise().map(function(t){return Math.max(20,1e3*e._fpsSampleRate/(t[1]-t[0]))}).startWith(60)}).share(),this._currentState$=this._frame$.withLatestFrom(this._fps$,this._context$,function(e,t,r){return[e,t,r]}).filter(function(e){return null!=e[2].currentNode}).do(function(e){e[2].update(e[1])}).map(function(e){return{fps:e[1],id:e[0],state:e[2]}}).share(),this._lastState$=this._currentState$.publishReplay(1).refCount();var t=this._currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).publishReplay(1).refCount(),r=new i.Subject;t.subscribe(r),this._currentKey$=new n.BehaviorSubject(null),r.map(function(e){return e.state.currentNode.key}).subscribe(this._currentKey$),this._currentNode$=r.map(function(e){return e.state.currentNode}).publishReplay(1).refCount(),this._currentCamera$=r.map(function(e){return e.state.currentCamera}).publishReplay(1).refCount(),this._currentTransform$=r.map(function(e){return e.state.currentTransform}).publishReplay(1).refCount(),this._reference$=r.map(function(e){return e.state.reference}).distinctUntilChanged(function(e,t){return e.lat===t.lat&&e.lon===t.lon},function(e){return{lat:e.lat,lon:e.lon}}).publishReplay(1).refCount(),this._currentNodeExternal$=t.map(function(e){return e.state.currentNode}).publishReplay(1).refCount(),this._appendNode$.map(function(e){return function(t){return t.append([e]),t}}).subscribe(this._contextOperation$),this._inMotionOperation$=new i.Subject,t.map(function(e){return!0}).subscribe(this._inMotionOperation$),this._inMotionOperation$.distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._currentState$.filter(function(e){return 0===e.state.nodesAhead}).map(function(e){return[e.state.camera.clone(),e.state.zoom]}).pairwise().map(function(e){var t=e[0][0],r=e[1][0],n=e[0][1],i=e[1][1];return t.diff(r)>1e-5||Math.abs(n-i)>1e-5}).first(function(e){return!e})}).subscribe(this._inMotionOperation$),this._inMotion$=this._inMotionOperation$.distinctUntilChanged().publishReplay(1).refCount(),this._inTranslationOperation$=new i.Subject,t.map(function(e){return!0}).subscribe(this._inTranslationOperation$),this._inTranslationOperation$.distinctUntilChanged().filter(function(e){return e}).switchMap(function(t){return e._currentState$.filter(function(e){return 0===e.state.nodesAhead}).map(function(e){return e.state.camera.position.clone()}).pairwise().map(function(e){return 0!==e[0].distanceToSquared(e[1])}).first(function(e){return!e})}).subscribe(this._inTranslationOperation$),this._inTranslation$=this._inTranslationOperation$.distinctUntilChanged().publishReplay(1).refCount(),this._state$.subscribe(function(){}),this._currentNode$.subscribe(function(){}),this._currentCamera$.subscribe(function(){}),this._currentTransform$.subscribe(function(){}),this._reference$.subscribe(function(){}),this._currentNodeExternal$.subscribe(function(){}),this._lastState$.subscribe(function(){}),this._inMotion$.subscribe(function(){}),this._inTranslation$.subscribe(function(){}),this._frameId=null,this._frameGenerator=new o.RequestAnimationFrameDefinition(window)}return Object.defineProperty(e.prototype,"currentState$",{get:function(){return this._currentState$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode$",{get:function(){return this._currentNode$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentKey$",{get:function(){return this._currentKey$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNodeExternal$",{get:function(){return this._currentNodeExternal$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera$",{get:function(){return this._currentCamera$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform$",{get:function(){return this._currentTransform$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state$",{get:function(){return this._state$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"reference$",{get:function(){return this._reference$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inMotion$",{get:function(){return this._inMotion$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"inTranslation$",{get:function(){return this._inTranslation$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"appendNode$",{get:function(){return this._appendNode$},enumerable:!0,configurable:!0}),e.prototype.traverse=function(){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(e){e.traverse()})},e.prototype.wait=function(){this._invokeContextOperation(function(e){e.wait()})},e.prototype.appendNodes=function(e){this._invokeContextOperation(function(t){t.append(e)})},e.prototype.prependNodes=function(e){this._invokeContextOperation(function(t){t.prepend(e)})},e.prototype.removeNodes=function(e){this._invokeContextOperation(function(t){t.remove(e)})},e.prototype.clearNodes=function(){this._invokeContextOperation(function(e){e.clear()})},e.prototype.clearPriorNodes=function(){this._invokeContextOperation(function(e){e.clearPrior()})},e.prototype.cutNodes=function(){this._invokeContextOperation(function(e){e.cut()})},e.prototype.setNodes=function(e){this._invokeContextOperation(function(t){t.set(e)})},e.prototype.rotate=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotate(e)})},e.prototype.rotateBasic=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasic(e)})},e.prototype.rotateBasicUnbounded=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasicUnbounded(e)})},e.prototype.rotateBasicWithoutInertia=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateBasicWithoutInertia(e)})},e.prototype.rotateToBasic=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.rotateToBasic(e)})},e.prototype.move=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.move(e)})},e.prototype.moveTo=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.moveTo(e)})},e.prototype.zoomIn=function(e,t){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(r){r.zoomIn(e,t)})},e.prototype.getCenter=function(){return this._lastState$.first().map(function(e){return e.state.getCenter()})},e.prototype.getZoom=function(){return this._lastState$.first().map(function(e){return e.state.zoom})},e.prototype.setCenter=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.setCenter(e)})},e.prototype.setSpeed=function(e){this._invokeContextOperation(function(t){t.setSpeed(e)})},e.prototype.setZoom=function(e){this._inMotionOperation$.next(!0),this._invokeContextOperation(function(t){t.setZoom(e)})},e.prototype.start=function(){null==this._frameId&&(this._start$.next(null),this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId))},e.prototype.stop=function(){null!=this._frameId&&(this._frameGenerator.cancelAnimationFrame(this._frameId),this._frameId=null)},e.prototype._invokeContextOperation=function(e){this._contextOperation$.next(function(t){return e(t),t})},e.prototype._frame=function(e){this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId)},e}();r.StateService=s},{"../State":288,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87,"rxjs/util/AnimationFrame":208}],406:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../../Error"),i=e("../../Geo"),o=function(){function e(e){this._spatial=new i.Spatial,this._geoCoords=new i.GeoCoords,this._referenceThreshold=.01,this._reference=e.reference,this._alpha=e.alpha,this._camera=e.camera.clone(),this._zoom=e.zoom,this._currentIndex=e.currentIndex,this._trajectory=e.trajectory.slice(),this._trajectoryTransforms=[],this._trajectoryCameras=[];for(var t=0,r=this._trajectory;t<r.length;t++){var n=r[t],o=this._nodeToTranslation(n),a=new i.Transform(n,n.image,o);this._trajectoryTransforms.push(a),this._trajectoryCameras.push(new i.Camera(a))}this._currentNode=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousNode=this._trajectory.length>1&&this.currentIndex>0?this._trajectory[this._currentIndex-1]:null,this._currentCamera=this._trajectoryCameras.length>0?this._trajectoryCameras[this._currentIndex].clone():new i.Camera,this._previousCamera=this._trajectoryCameras.length>1&&this.currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}return Object.defineProperty(e.prototype,"reference",{get:function(){return this._reference},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"alpha",{get:function(){return this._getAlpha()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"camera",{get:function(){return this._camera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"zoom",{get:function(){return this._zoom},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"trajectory",{get:function(){return this._trajectory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentIndex",{get:function(){return this._currentIndex},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentNode",{get:function(){return this._currentNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousNode",{get:function(){return this._previousNode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentCamera",{get:function(){return this._currentCamera},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTransform",{get:function(){return this._trajectoryTransforms.length>0?this._trajectoryTransforms[this.currentIndex]:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"previousTransform",{get:function(){return this._trajectoryTransforms.length>1&&this.currentIndex>0?this._trajectoryTransforms[this.currentIndex-1]:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"motionless",{get:function(){return this._motionless},enumerable:!0,configurable:!0}),e.prototype.append=function(e){if(e.length<1)throw Error("Trajectory can not be empty");this._currentIndex<0?this.set(e):(this._trajectory=this._trajectory.concat(e),this._appendToTrajectories(e))},e.prototype.prepend=function(e){if(e.length<1)throw Error("Trajectory can not be empty");this._trajectory=e.slice().concat(this._trajectory),this._currentIndex+=e.length,this._setCurrentNode();this._setReference(this._currentNode)?this._setTrajectories():this._prependToTrajectories(e),this._setCurrentCamera()},e.prototype.remove=function(e){if(e<0)throw Error("n must be a positive integer");if(this._currentIndex-1<e)throw Error("Current and previous nodes can not be removed");for(var t=0;t<e;t++)this._trajectory.shift(),this._trajectoryTransforms.shift(),this._trajectoryCameras.shift(),this._currentIndex--;this._setCurrentNode()},e.prototype.clearPrior=function(){this._currentIndex>0&&this.remove(this._currentIndex-1)},e.prototype.clear=function(){this.cut(),this._currentIndex>0&&this.remove(this._currentIndex-1)},e.prototype.cut=function(){for(;this._trajectory.length-1>this._currentIndex;)this._trajectory.pop(),this._trajectoryTransforms.pop(),this._trajectoryCameras.pop()},e.prototype.set=function(e){this._setTrajectory(e),this._setCurrentNode(),this._setReference(this._currentNode),this._setTrajectories(),this._setCurrentCamera()},e.prototype.getCenter=function(){return null!=this._currentNode?this.currentTransform.projectBasic(this._camera.lookat.toArray()):[.5,.5]},e.prototype._setCurrent=function(){this._setCurrentNode();this._setReference(this._currentNode)&&this._setTrajectories(),this._setCurrentCamera()},e.prototype._setCurrentCamera=function(){this._currentCamera=this._trajectoryCameras[this._currentIndex].clone(),this._previousCamera=this._currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()},e.prototype._motionlessTransition=function(){return null!=this._currentNode&&null!=this._previousNode&&!(this._currentNode.merged&&this._previousNode.merged&&this._withinOriginalDistance()&&this._sameConnectedComponent())},e.prototype._setReference=function(e){return!(Math.abs(e.latLon.lat-this.reference.lat)<this._referenceThreshold&&Math.abs(e.latLon.lon-this.reference.lon)<this._referenceThreshold)&&(!(null!=this._previousNode&&!this._motionlessTransition())&&(this._reference.lat=e.latLon.lat,this._reference.lon=e.latLon.lon,this._reference.alt=e.alt,!0))},e.prototype._setCurrentNode=function(){this._currentNode=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousNode=this._currentIndex>0?this._trajectory[this._currentIndex-1]:null},e.prototype._setTrajectory=function(e){if(e.length<1)throw new n.ArgumentMapillaryError("Trajectory can not be empty");null!=this._currentNode?(this._trajectory=[this._currentNode].concat(e),this._currentIndex=1):(this._trajectory=e.slice(),this._currentIndex=0)},e.prototype._setTrajectories=function(){this._trajectoryTransforms.length=0,this._trajectoryCameras.length=0,this._appendToTrajectories(this._trajectory)},e.prototype._appendToTrajectories=function(e){for(var t=0,r=e;t<r.length;t++){var o=r[t];if(!o.assetsCached)throw new n.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");var a=this._nodeToTranslation(o),s=new i.Transform(o,o.image,a);this._trajectoryTransforms.push(s),this._trajectoryCameras.push(new i.Camera(s))}},e.prototype._prependToTrajectories=function(e){for(var t=0,r=e.reverse();t<r.length;t++){var o=r[t];if(!o.assetsCached)throw new n.ArgumentMapillaryError("Assets must be cached when added to trajectory");var a=this._nodeToTranslation(o),s=new i.Transform(o,o.image,a);this._trajectoryTransforms.unshift(s),this._trajectoryCameras.unshift(new i.Camera(s))}},e.prototype._nodeToTranslation=function(e){var t=this._geoCoords.geodeticToEnu(e.latLon.lat,e.latLon.lon,e.alt,this._reference.lat,this._reference.lon,this._reference.alt),r=this._spatial.rotate(t,e.rotation);return[-r.x,-r.y,-r.z]},e.prototype._sameConnectedComponent=function(){var e=this._currentNode,t=this._previousNode;return!(e&&e.mergeCC&&t&&t.mergeCC)||e.mergeCC===t.mergeCC},e.prototype._withinOriginalDistance=function(){var e=this._currentNode,t=this._previousNode;if(!e||!t)return!0;return this._spatial.distanceFromLatLon(e.originalLatLon.lat,e.originalLatLon.lon,t.originalLatLon.lat,t.originalLatLon.lon)<25},e}();r.StateBase=o},{"../../Error":283,"../../Geo":284}],407:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("three"),o=e("@mapbox/unitbezier"),a=e("../../State"),s=function(){function e(e,t){this._phi=e,this._theta=t}return Object.defineProperty(e.prototype,"phi",{get:function(){return this._phi},set:function(e){this._phi=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"theta",{get:function(){return this._theta},set:function(e){this._theta=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isZero",{get:function(){return 0===this._phi&&0===this._theta},enumerable:!0,configurable:!0}),e.prototype.copy=function(e){this._phi=e.phi,this._theta=e.theta},e.prototype.lerp=function(e,t){this._phi=(1-t)*this._phi+t*e.phi,this._theta=(1-t)*this._theta+t*e.theta},e.prototype.multiply=function(e){this._phi*=e,this._theta*=e},e.prototype.threshold=function(e){this._phi=Math.abs(this._phi)>e?this._phi:0,this._theta=Math.abs(this._theta)>e?this._theta:0},e.prototype.lengthSquared=function(){return this._phi*this._phi+this._theta*this._theta},e.prototype.reset=function(){this._phi=0,this._theta=0},e}(),c=function(e){function t(t){var r=e.call(this,t)||this;return r._adjustCameras(),r._motionless=r._motionlessTransition(),r._baseAlpha=r._alpha,r._animationSpeed=.025,r._speedCoefficient=1,r._unitBezier=new o(.74,.67,.38,.96),r._useBezier=!1,r._rotationDelta=new s(0,0),r._requestedRotationDelta=null,r._basicRotation=[0,0],r._requestedBasicRotation=null,r._requestedBasicRotationUnbounded=null,r._rotationAcceleration=.86,r._rotationIncreaseAlpha=.97,r._rotationDecreaseAlpha=.9,r._rotationThreshold=.001,r._unboundedRotationAlpha=.8,r._desiredZoom=t.zoom,r._minZoom=0,r._maxZoom=3,r._lookatDepth=10,r._desiredLookat=null,r._desiredCenter=null,r}return n(t,e),t.prototype.traverse=function(){throw new Error("Not implemented")},t.prototype.wait=function(){return new a.WaitingState(this)},t.prototype.append=function(t){var r=0===this._trajectory.length;r&&this._resetTransition(),e.prototype.append.call(this,t),r&&(this._setDesiredCenter(),this._setDesiredZoom())},t.prototype.prepend=function(t){var r=0===this._trajectory.length;r&&this._resetTransition(),e.prototype.prepend.call(this,t),r&&(this._setDesiredCenter(),this._setDesiredZoom())},t.prototype.set=function(t){e.prototype.set.call(this,t),this._desiredLookat=null,this._resetTransition(),this._clearRotation(),this._setDesiredCenter(),this._setDesiredZoom(),this._trajectory.length<3&&(this._useBezier=!0)},t.prototype.move=function(e){throw new Error("Not implemented")},t.prototype.moveTo=function(e){throw new Error("Not implemented")},t.prototype.rotate=function(e){null!=this._currentNode&&(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,null!=this._requestedRotationDelta?(this._requestedRotationDelta.phi=this._requestedRotationDelta.phi+e.phi,this._requestedRotationDelta.theta=this._requestedRotationDelta.theta+e.theta):this._requestedRotationDelta=new s(e.phi,e.theta))},t.prototype.rotateBasic=function(e){if(null!=this._currentNode)if(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,null!=this._requestedBasicRotation){this._requestedBasicRotation[0]+=e[0],this._requestedBasicRotation[1]+=e[1];var t=.05/Math.pow(2,this._zoom);this._requestedBasicRotation[0]=this._spatial.clamp(this._requestedBasicRotation[0],-t,t),this._requestedBasicRotation[1]=this._spatial.clamp(this._requestedBasicRotation[1],-t,t)}else this._requestedBasicRotation=e.slice()},t.prototype.rotateBasicUnbounded=function(e){null!=this._currentNode&&(null!=this._requestedBasicRotationUnbounded?(this._requestedBasicRotationUnbounded[0]+=e[0],this._requestedBasicRotationUnbounded[1]+=e[1]):this._requestedBasicRotationUnbounded=e.slice())},t.prototype.rotateBasicWithoutInertia=function(e){if(null!=this._currentNode){this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null;var t=.05/Math.pow(2,this._zoom),r=e.slice();r[0]=this._spatial.clamp(r[0],-t,t),r[1]=this._spatial.clamp(r[1],-t,t),this._applyRotationBasic(r)}},t.prototype.rotateToBasic=function(e){if(null!=this._currentNode){this._desiredZoom=this._zoom,this._desiredLookat=null,e[0]=this._spatial.clamp(e[0],0,1),e[1]=this._spatial.clamp(e[1],0,1);var t=this.currentTransform.unprojectBasic(e,this._lookatDepth);this._currentCamera.lookat.fromArray(t)}},t.prototype.setSpeed=function(e){this._speedCoefficient=this._spatial.clamp(e,0,10)},t.prototype.zoomIn=function(e,t){if(null!=this._currentNode){this._desiredZoom=Math.max(this._minZoom,Math.min(this._maxZoom,this._desiredZoom+e));var r=this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()),n=r[0],o=r[1],a=Math.pow(2,this._zoom),s=Math.pow(2,this._desiredZoom),c=t[0],u=t[1];null!=this.currentTransform.gpano&&this.currentTransform.gpano.CroppedAreaImageWidthPixels===this.currentTransform.gpano.FullPanoWidthPixels&&(c-n>.5?c-=1:n-c>.5&&(c=1+c));var h=c-a/s*(c-n),l=u-a/s*(u-o),p=this.currentTransform.gpano;this._currentNode.fullPano?(h=this._spatial.wrap(h+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],.05,.95)):null!=p&&this.currentTransform.gpano.CroppedAreaImageWidthPixels===this.currentTransform.gpano.FullPanoWidthPixels?(h=this._spatial.wrap(h+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],0,1)):(h=this._spatial.clamp(h,0,1),l=this._spatial.clamp(l,0,1)),this._desiredLookat=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic([h,l],this._lookatDepth))}},t.prototype.setCenter=function(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._desiredZoom=this._zoom;var t=[this._spatial.clamp(e[0],0,1),this._spatial.clamp(e[1],0,1)];if(null!=this._currentNode){this._desiredCenter=null;var r=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(t,this._lookatDepth)),n=null!=this.previousTransform?this.previousTransform:this.currentTransform,o=(new i.Vector3).fromArray(n.unprojectBasic(t,this._lookatDepth));this._currentCamera.lookat.copy(r),this._previousCamera.lookat.copy(o)}else this._desiredCenter=t},t.prototype.setZoom=function(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._zoom=this._spatial.clamp(e,this._minZoom,this._maxZoom),this._desiredZoom=this._zoom},t.prototype.update=function(e){1===this._alpha&&this._currentIndex+this._alpha<this._trajectory.length&&(this._currentIndex+=1,this._useBezier=this._trajectory.length<3&&this._currentIndex+1===this._trajectory.length,this._setCurrent(),this._resetTransition(),this._clearRotation(),this._desiredZoom=this._currentNode.fullPano?this._zoom:0,this._desiredLookat=null);var t=this._animationSpeed*(60/e);this._baseAlpha=Math.min(1,this._baseAlpha+this._speedCoefficient*t),this._useBezier?this._alpha=this._unitBezier.solve(this._baseAlpha):this._alpha=this._baseAlpha,this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._previousCamera),this._applyRotation(this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation),this._updateZoom(t),this._updateLookat(t),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)},t.prototype._getAlpha=function(){return this._motionless?Math.ceil(this._alpha):this._alpha},t.prototype._setCurrentCamera=function(){e.prototype._setCurrentCamera.call(this),this._adjustCameras()},t.prototype._adjustCameras=function(){if(null!=this._previousNode){var e=this._camera.lookat.clone().sub(this._camera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position)),this._currentNode.fullPano&&this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}},t.prototype._resetTransition=function(){this._alpha=0,this._baseAlpha=0,this._motionless=this._motionlessTransition()},t.prototype._applyRotation=function(e){if(null!=e){var t=(new i.Quaternion).setFromUnitVectors(e.up,new i.Vector3(0,0,1)),r=t.clone().inverse(),n=new i.Vector3;n.copy(e.lookat).sub(e.position),n.applyQuaternion(t);var o=n.length(),a=Math.atan2(n.y,n.x);a+=this._rotationDelta.phi;var s=Math.atan2(Math.sqrt(n.x*n.x+n.y*n.y),n.z);s+=this._rotationDelta.theta,s=Math.max(.1,Math.min(Math.PI-.1,s)),n.x=Math.sin(s)*Math.cos(a),n.y=Math.sin(s)*Math.sin(a),n.z=Math.cos(s),n.applyQuaternion(r),e.lookat.copy(e.position).add(n.multiplyScalar(o))}},t.prototype._applyRotationBasic=function(e){var t=this._currentNode,r=null!=this._previousNode?this.previousNode:this.currentNode,n=this._currentCamera,i=this._previousCamera,o=this.currentTransform,a=null!=this.previousTransform?this.previousTransform:this.currentTransform,s=o.projectBasic(n.lookat.toArray()),c=a.projectBasic(i.lookat.toArray()),u=o.gpano,h=a.gpano;t.fullPano?(s[0]=this._spatial.wrap(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],.05,.95)):null!=u&&o.gpano.CroppedAreaImageWidthPixels===o.gpano.FullPanoWidthPixels?(s[0]=this._spatial.wrap(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],0,1)):(s[0]=this._spatial.clamp(s[0]+e[0],0,1),s[1]=this._spatial.clamp(s[1]+e[1],0,1)),r.fullPano?(c[0]=this._spatial.wrap(c[0]+e[0],0,1),c[1]=this._spatial.clamp(c[1]+e[1],.05,.95)):null!=h&&a.gpano.CroppedAreaImageWidthPixels===a.gpano.FullPanoWidthPixels?(c[0]=this._spatial.wrap(c[0]+e[0],0,1),c[1]=this._spatial.clamp(c[1]+e[1],0,1)):(c[0]=this._spatial.clamp(c[0]+e[0],0,1),c[1]=this._spatial.clamp(s[1]+e[1],0,1));var l=o.unprojectBasic(s,this._lookatDepth);n.lookat.fromArray(l);var p=a.unprojectBasic(c,this._lookatDepth);i.lookat.fromArray(p)},t.prototype._updateZoom=function(e){var t=this._desiredZoom-this._zoom,r=t>0?1:t<0?-1:0;0!==t&&(Math.abs(t)<.002?(this._zoom=this._desiredZoom,null!=this._desiredLookat&&(this._desiredLookat=null)):this._zoom+=r*Math.max(Math.abs(5*e*t),.002))},t.prototype._updateLookat=function(e){if(null!==this._desiredLookat){var t=this._desiredLookat.distanceToSquared(this._currentCamera.lookat);Math.abs(t)<1e-6?(this._currentCamera.lookat.copy(this._desiredLookat),this._desiredLookat=null):this._currentCamera.lookat.lerp(this._desiredLookat,5*e)}},t.prototype._updateRotation=function(){if(null!=this._requestedRotationDelta){var e=this._rotationDelta.lengthSquared();return this._requestedRotationDelta.lengthSquared()>e?this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationIncreaseAlpha):this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationDecreaseAlpha),void(this._requestedRotationDelta=null)}this._rotationDelta.isZero||(this._rotationDelta.multiply(this._rotationAcceleration),this._rotationDelta.threshold(this._rotationThreshold))},t.prototype._updateRotationBasic=function(){if(null!=this._requestedBasicRotation){var e=this._basicRotation[0],t=this._basicRotation[1],r=this._requestedBasicRotation[0],n=this._requestedBasicRotation[1];return Math.abs(r)>Math.abs(e)?this._basicRotation[0]=(1-this._rotationIncreaseAlpha)*e+this._rotationIncreaseAlpha*r:this._basicRotation[0]=(1-this._rotationDecreaseAlpha)*e+this._rotationDecreaseAlpha*r,Math.abs(n)>Math.abs(t)?this._basicRotation[1]=(1-this._rotationIncreaseAlpha)*t+this._rotationIncreaseAlpha*n:this._basicRotation[1]=(1-this._rotationDecreaseAlpha)*t+this._rotationDecreaseAlpha*n,void(this._requestedBasicRotation=null)}if(null!=this._requestedBasicRotationUnbounded){var r=this._requestedBasicRotationUnbounded[0],n=this._requestedBasicRotationUnbounded[1];if(Math.abs(r)>0&&(this._basicRotation[0]=(1-this._unboundedRotationAlpha)*this._basicRotation[0]+this._unboundedRotationAlpha*r),Math.abs(n)>0&&(this._basicRotation[1]=(1-this._unboundedRotationAlpha)*this._basicRotation[1]+this._unboundedRotationAlpha*n),null!=this._desiredLookat){var o=this.currentTransform.projectBasic(this._desiredLookat.toArray());o[0]+=r,o[1]+=n,this._desiredLookat=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(o,this._lookatDepth))}this._requestedBasicRotationUnbounded=null}0===this._basicRotation[0]&&0===this._basicRotation[1]||(this._basicRotation[0]=this._rotationAcceleration*this._basicRotation[0],this._basicRotation[1]=this._rotationAcceleration*this._basicRotation[1],Math.abs(this._basicRotation[0])<this._rotationThreshold/Math.pow(2,this._zoom)&&Math.abs(this._basicRotation[1])<this._rotationThreshold/Math.pow(2,this._zoom)&&(this._basicRotation=[0,0]))},t.prototype._clearRotation=function(){this._currentNode.fullPano||(null!=this._requestedRotationDelta&&(this._requestedRotationDelta=null),this._rotationDelta.isZero||this._rotationDelta.reset(),null!=this._requestedBasicRotation&&(this._requestedBasicRotation=null),(this._basicRotation[0]>0||this._basicRotation[1]>0)&&(this._basicRotation=[0,0]))},t.prototype._setDesiredCenter=function(){if(null!=this._desiredCenter){var e=(new i.Vector3).fromArray(this.currentTransform.unprojectBasic(this._desiredCenter,this._lookatDepth)).sub(this._currentCamera.position);this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(e)),this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(e)),this._desiredCenter=null}},t.prototype._setDesiredZoom=function(){this._desiredZoom=this._currentNode.fullPano||null==this._previousNode?this._zoom:0},t}(a.StateBase);r.TraversingState=c},{"../../State":288,"@mapbox/unitbezier":2,three:231}],408:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("../../State"),o=function(e){function t(t){var r=e.call(this,t)||this;return r._zoom=0,r._adjustCameras(),r._motionless=r._motionlessTransition(),r}return n(t,e),t.prototype.traverse=function(){return new i.TraversingState(this)},t.prototype.wait=function(){throw new Error("Not implemented")},t.prototype.prepend=function(t){e.prototype.prepend.call(this,t),this._motionless=this._motionlessTransition()},t.prototype.set=function(t){e.prototype.set.call(this,t),this._motionless=this._motionlessTransition()},t.prototype.rotate=function(e){},t.prototype.rotateBasic=function(e){},t.prototype.rotateBasicUnbounded=function(e){},t.prototype.rotateBasicWithoutInertia=function(e){},t.prototype.rotateToBasic=function(e){},t.prototype.setSpeed=function(e){},t.prototype.zoomIn=function(e,t){},t.prototype.move=function(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))},t.prototype.moveTo=function(e){this._alpha=Math.max(0,Math.min(1,e))},t.prototype.update=function(e){this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)},t.prototype.setCenter=function(e){},t.prototype.setZoom=function(e){},t.prototype._getAlpha=function(){return this._motionless?Math.round(this._alpha):this._alpha},t.prototype._setCurrentCamera=function(){e.prototype._setCurrentCamera.call(this),this._adjustCameras()},t.prototype._adjustCameras=function(){if(null!=this._previousNode){if(this._currentNode.fullPano){e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if(this._previousNode.fullPano){var e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}},t}(i.StateBase);r.WaitingState=o},{"../../State":288}],409:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=function(){function e(e,t,r){this._scheme=e,this._host=t,this._origin=null!=r?"?origin="+r:""}return e.prototype.getTile=function(e,t,r,i,o,a,s){var c="/"+e+"/"+t+","+r+","+i+","+o+"/"+a+","+s+"/0/default.jpg",u=this._scheme+"://"+this._host+c+this._origin,h=null;return[n.Observable.create(function(n){(h=new XMLHttpRequest).open("GET",u,!0),h.responseType="arraybuffer",h.timeout=15e3,h.onload=function(a){if(200===h.status){var s=new Image;s.crossOrigin="Anonymous",s.onload=function(e){n.next(s),n.complete()},s.onerror=function(a){n.error(new Error("Failed to load tile image ("+e+": "+t+","+r+","+i+","+o+")"))};var c=new Blob([h.response]);s.src=window.URL.createObjectURL(c)}else n.error(new Error("Failed to fetch tile ("+e+": "+t+","+r+","+i+","+o+"). Status: "+h.status+", "+h.statusText))},h.onerror=function(a){n.error(new Error("Failed to fetch tile ("+e+": "+t+","+r+","+i+","+o+")"))},h.ontimeout=function(a){n.error(new Error("Tile request timed out ("+e+": "+t+","+r+","+i+","+o+")"))},h.onabort=function(a){n.error(new Error("Tile request was aborted ("+e+": "+t+","+r+","+i+","+o+")"))},h.send(null)}),function(){null!=h&&h.abort()}]},e}();r.ImageTileLoader=i,r.default=i},{"rxjs/Observable":29}],410:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._images={}}return e.prototype.addImage=function(e,t,r){r in this._images||(this._images[r]={}),this._images[r][t]=e},e.prototype.dispose=function(){for(var e=0,t=Object.keys(this._images);e<t.length;e++){for(var r=t[e],n=this._images[r],i=0,o=Object.keys(n);i<o.length;i++){var a=o[i];window.URL.revokeObjectURL(n[a].src),delete n[a]}delete this._images[r]}},e.prototype.getImage=function(e,t){return this._images[t][e]},e.prototype.hasImage=function(e,t){return t in this._images&&e in this._images[t]},e}();r.ImageTileStore=n,r.default=n},{}],411:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Geo"),i=function(){function e(){this._viewportCoords=new n.ViewportCoords}return e.prototype.computeRegionOfInterest=function(e,t,r){var n=this._viewportBoundaryPoints(4),i=this._viewportPointsBoundingBox(n,e,r);this._clipBoundingBox(i);var o=2/t.width,a=2/t.height,s=[[-.5*o,.5*a],[.5*o,.5*a],[.5*o,-.5*a],[-.5*o,-.5*a]],c=this._viewportPointsBoundingBox(s,e,r);return{bbox:i,pixelHeight:c.maxY-c.minY,pixelWidth:c.maxX-c.minX+(c.minX<c.maxX?0:1)}},e.prototype._viewportBoundaryPoints=function(e){for(var t=[],r=[[-1,1],[1,1],[1,-1],[-1,-1]],n=[[2,0],[0,-2],[-2,0],[0,2]],i=0;i<4;++i)for(var o=r[i],a=n[i],s=0;s<e;++s)t.push([o[0]+a[0]*s/e,o[1]+a[1]*s/e]);return t},e.prototype._viewportPointsBoundingBox=function(e,t,r){var n=this,i=e.map(function(e){return n._viewportCoords.viewportToBasic(e[0],e[1],r,t.perspective)});return null!=r.gpano?this._boundingBoxPano(i):this._boundingBox(i)},e.prototype._boundingBox=function(e){for(var t={maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY},r=0;r<e.length;++r)t.minX=Math.min(t.minX,e[r][0]),t.maxX=Math.max(t.maxX,e[r][0]),t.minY=Math.min(t.minY,e[r][1]),t.maxY=Math.max(t.maxY,e[r][1]);return t},e.prototype._boundingBoxPano=function(e){for(var t=this,r=[],n=[],i=0;i<e.length;++i)r.push(e[i][0]),n.push(e[i][1]);r.sort(function(e,r){return t._sign(e-r)}),n.sort(function(e,r){return t._sign(e-r)});var o=this._intervalPano(r);return{maxX:o[1],maxY:n[n.length-1],minX:o[0],minY:n[0]}},e.prototype._intervalPano=function(e){for(var t=0,r=-1,n=0;n<e.length-1;++n){var i=e[n+1]-e[n];i>t&&(t=i,r=n)}return e[0]+1-e[e.length-1]>t?[e[0],e[e.length-1]]:[e[r+1],e[r]]},e.prototype._clipBoundingBox=function(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))},e.prototype._sign=function(e){return e>0?1:e<0?-1:0},e}();r.RegionOfInterestCalculator=i,r.default=i},{"../Geo":284}],412:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("rxjs/Subject"),o=function(){function e(e,t,r,n,o,a,s,c){this._disposed=!1,this._key=e,(t<=0||r<=0)&&console.warn("Original image size ("+t+", "+r+") is invalid ("+e+"). Tiles will not be loaded."),this._width=t,this._height=r,this._maxLevel=Math.ceil(Math.log(Math.max(r,t))/Math.log(2)),this._currentLevel=-1,this._tileSize=n,this._updated$=new i.Subject,this._createdSubject$=new i.Subject,this._created$=this._createdSubject$.publishReplay(1).refCount(),this._createdSubscription=this._created$.subscribe(function(){}),this._hasSubject$=new i.Subject,this._has$=this._hasSubject$.startWith(!1).publishReplay(1).refCount(),this._hasSubscription=this._has$.subscribe(function(){}),this._abortFunctions=[],this._tileSubscriptions={},this._renderedCurrentLevelTiles={},this._renderedTiles={},this._background=o,this._camera=null,this._imageTileLoader=a,this._imageTileStore=s,this._renderer=c,this._renderTarget=null,this._roi=null}return Object.defineProperty(e.prototype,"disposed",{get:function(){return this._disposed},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hasTexture$",{get:function(){return this._has$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"key",{get:function(){return this._key},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textureUpdated$",{get:function(){return this._updated$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textureCreated$",{get:function(){return this._created$},enumerable:!0,configurable:!0}),e.prototype.abort=function(){for(var e in this._tileSubscriptions)this._tileSubscriptions.hasOwnProperty(e)&&this._tileSubscriptions[e].unsubscribe();this._tileSubscriptions={};for(var t=0,r=this._abortFunctions;t<r.length;t++){(0,r[t])()}this._abortFunctions=[]},e.prototype.dispose=function(){this._disposed?console.warn("Texture already disposed ("+this._key+")"):(this.abort(),null!=this._renderTarget&&(this._renderTarget.dispose(),this._renderTarget=null),this._imageTileStore.dispose(),this._imageTileStore=null,this._background=null,this._camera=null,this._imageTileLoader=null,this._renderer=null,this._roi=null,this._createdSubscription.unsubscribe(),this._hasSubscription.unsubscribe(),this._disposed=!0)},e.prototype.setRegionOfInterest=function(e){if(!(this._width<=0||this._height<=0)){this._roi=e;var t=1/this._roi.pixelWidth,r=1/this._roi.pixelHeight,i=Math.max(r,t),o=Math.max(0,Math.min(this._maxLevel,Math.ceil(Math.log(i)/Math.log(2))));if(o!==this._currentLevel){this.abort(),this._currentLevel=o,this._currentLevel in this._renderedTiles||(this._renderedTiles[this._currentLevel]=[]),this._renderedCurrentLevelTiles={};for(var a=0,s=this._renderedTiles[this._currentLevel];a<s.length;a++){var c=s[a];this._renderedCurrentLevelTiles[this._tileKey(this._tileSize,c)]=!0}}var u=this._getTileCoords([this._roi.bbox.minX,this._roi.bbox.minY]),h=this._getTileCoords([this._roi.bbox.maxX,this._roi.bbox.maxY]),l=this._getTiles(u,h);if(null==this._camera){this._camera=new n.OrthographicCamera(-this._width/2,this._width/2,this._height/2,-this._height/2,-1,1),this._camera.position.z=1;var p=this._renderer.getContext(),f=p.getParameter(p.MAX_TEXTURE_SIZE),d=Math.max(this._width,this._height),m=f>d?1:f/d,v=Math.floor(m*this._width),g=Math.floor(m*this._height);this._renderTarget=new n.WebGLRenderTarget(v,g,{depthBuffer:!1,format:n.RGBFormat,magFilter:n.LinearFilter,minFilter:n.LinearFilter,stencilBuffer:!1}),this._renderToTarget(0,0,this._width,this._height,this._background),this._createdSubject$.next(this._renderTarget.texture),this._hasSubject$.next(!0)}this._fetchTiles(l)}},e.prototype.setTileSize=function(e){this._tileSize=e},e.prototype.updateBackground=function(e){this._background=e},e.prototype._fetchTile=function(e,t,r,n,i,o,a,s){var c=this,u=this._imageTileLoader.getTile(this._key,r,n,i,o,a,s),h=u[0],l=u[1];this._abortFunctions.push(l);var p=this._tileKey(this._tileSize,e),f=h.subscribe(function(a){c._renderToTarget(r,n,i,o,a),c._removeFromDictionary(p,c._tileSubscriptions),c._removeFromArray(l,c._abortFunctions),c._setTileRendered(e,c._currentLevel),c._imageTileStore.addImage(a,p,t),c._updated$.next(!0)},function(e){c._removeFromDictionary(p,c._tileSubscriptions),c._removeFromArray(l,c._abortFunctions),console.error(e)});f.closed||(this._tileSubscriptions[p]=f)},e.prototype._fetchTiles=function(e){for(var t=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),r=0,n=e;r<n.length;r++){var i=n[r],o=this._tileKey(this._tileSize,i);if(!(o in this._renderedCurrentLevelTiles||o in this._tileSubscriptions)){var a=t*i[0],s=t*i[1],c=a+t>this._width?this._width-a:t,u=s+t>this._height?this._height-s:t;if(this._imageTileStore.hasImage(o,this._currentLevel))this._renderToTarget(a,s,c,u,this._imageTileStore.getImage(o,this._currentLevel)),this._setTileRendered(i,this._currentLevel),this._updated$.next(!0);else{var h=Math.floor(c/t*this._tileSize),l=Math.floor(u/t*this._tileSize);this._fetchTile(i,this._currentLevel,a,s,c,u,h,l)}}}},e.prototype._getTileCoords=function(e){var t=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),r=Math.ceil(this._width/t)-1,n=Math.ceil(this._height/t)-1;return[Math.min(Math.floor(this._width*e[0]/t),r),Math.min(Math.floor(this._height*e[1]/t),n)]},e.prototype._getTiles=function(e,t){var r=[];if(e[0]>t[0]){for(var n=this._tileSize*Math.pow(2,this._maxLevel-this._currentLevel),i=Math.ceil(this._width/n)-1,o=e[0];o<=i;o++)r.push(o);for(o=0;o<=t[0];o++)r.push(o)}else for(o=e[0];o<=t[0];o++)r.push(o);for(var a=[],s=0,c=r;s<c.length;s++)for(var o=c[s],u=e[1];u<=t[1];u++)a.push([o,u]);return a},e.prototype._removeFromArray=function(e,t){var r=t.indexOf(e);-1!==r&&t.splice(r,1)},e.prototype._removeFromDictionary=function(e,t){e in t&&delete t[e]},e.prototype._renderToTarget=function(e,t,r,i,o){var a=new n.Texture(o);a.minFilter=n.LinearFilter,a.needsUpdate=!0;var s=new n.PlaneGeometry(r,i),c=new n.MeshBasicMaterial({map:a,side:n.FrontSide}),u=new n.Mesh(s,c);u.position.x=-this._width/2+e+r/2,u.position.y=this._height/2-t-i/2;var h=new n.Scene;h.add(u),this._renderer.render(h,this._camera,this._renderTarget),this._renderer.setRenderTarget(void 0),h.remove(u),s.dispose(),c.dispose(),a.dispose()},e.prototype._setTileRendered=function(e,t){for(var r=0,n=Object.keys(this._renderedTiles).map(function(e){return parseInt(e,10)}).filter(function(e){return e!==t});r<n.length;r++){var i=n[r],o=Math.pow(2,i-t);if(i<t)for(var a=Math.floor(o*e[0]),s=Math.floor(o*e[1]),c=0,u=this._renderedTiles[i].slice();c<u.length;c++){if((v=u[c])[0]===a&&v[1]===s){g=this._renderedTiles[i].indexOf(v);this._renderedTiles[i].splice(g,1)}}else for(var h=o*e[0],l=h+o-1,p=o*e[1],f=p+o-1,d=0,m=this._renderedTiles[i].slice();d<m.length;d++){var v=m[d];if(v[0]>=h&&v[0]<=l&&v[1]>=p&&v[1]<=f){var g=this._renderedTiles[i].indexOf(v);this._renderedTiles[i].splice(g,1)}}0===this._renderedTiles[i].length&&delete this._renderedTiles[i]}this._renderedTiles[t].push(e),this._renderedCurrentLevelTiles[this._tileKey(this._tileSize,e)]=!0},e.prototype._tileKey=function(e,t){return e+"-"+t[0]+"-"+t[1]},e}();r.TextureProvider=o,r.default=o},{"rxjs/Subject":34,three:231}],413:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e){this._document=e||document}return Object.defineProperty(e.prototype,"document",{get:function(){return this._document},enumerable:!0,configurable:!0}),e.prototype.createElement=function(e,t,r){var n=this._document.createElement(e);return t&&(n.className=t),r&&r.appendChild(n),n},e}();r.DOM=n,r.default=n},{}],414:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){this._events={}}return e.prototype.on=function(e,t){this._events[e]=this._events[e]||[],this._events[e].push(t)},e.prototype.off=function(e,t){if(e)if(this._listens(e))delete this._events[e];else{var r=this._events[e].indexOf(t);r>=0&&this._events[e].splice(r,1),this._events[e].length&&delete this._events[e]}else this._events={}},e.prototype.fire=function(e,t){if(this._listens(e))for(var r=0,n=this._events[e];r<n.length;r++){n[r].call(this,t)}},e.prototype._listens=function(e){return!(!this._events||!this._events[e])},e}();r.EventEmitter=n,r.default=n},{}],415:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Viewer"),i=function(){function e(){}return e.setOptions=function(t){e._baseImageSize=null!=t.baseImageSize?t.baseImageSize:n.ImageSize.Size640,e._basePanoramaSize=null!=t.basePanoramaSize?t.basePanoramaSize:n.ImageSize.Size2048,e._maxImageSize=null!=t.maxImageSize?t.maxImageSize:n.ImageSize.Size2048},Object.defineProperty(e,"baseImageSize",{get:function(){return e._baseImageSize},enumerable:!0,configurable:!0}),Object.defineProperty(e,"basePanoramaSize",{get:function(){return e._basePanoramaSize},enumerable:!0,configurable:!0}),Object.defineProperty(e,"maxImageSize",{get:function(){return e._maxImageSize},enumerable:!0,configurable:!0}),e}();r.Settings=i,r.default=i},{"../Viewer":292}],416:[function(e,t,r){"use strict";function n(){var e={alpha:!1,antialias:!1,depth:!0,failIfMajorPerformanceCaveat:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,stencil:!0},t=document.createElement("canvas"),r=t.getContext("webgl",e)||t.getContext("experimental-webgl",e);if(!r)return!1;for(var n=r.getSupportedExtensions(),i=0,o=["OES_standard_derivatives"];i<o.length;i++){var a=o[i];if(-1===n.indexOf(a))return!1}return!0}Object.defineProperty(r,"__esModule",{value:!0}),r.isBrowser=function(){return"undefined"!=typeof window&&"undefined"!=typeof document},r.isArraySupported=function(){return!!(Array.prototype&&Array.prototype.filter&&Array.prototype.indexOf&&Array.prototype.map&&Array.prototype.reverse)},r.isFunctionSupported=function(){return!(!Function.prototype||!Function.prototype.bind)},r.isJSONSupported=function(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON},r.isObjectSupported=function(){return!(!Object.keys||!Object.assign)};var i=void 0;r.isWebGLSupportedCached=function(){return void 0===i&&(i=n()),i},r.isWebGLSupported=n},{}],417:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return Object.defineProperty(e,"tileScheme",{get:function(){return"https"},enumerable:!0,configurable:!0}),Object.defineProperty(e,"tileDomain",{get:function(){return"d2qb1440i7l50o.cloudfront.net"},enumerable:!0,configurable:!0}),Object.defineProperty(e,"origin",{get:function(){return"mapillary.webgl"},enumerable:!0,configurable:!0}),e.thumbnail=function(e,t){return"https://d1cuyjsrcm0gby.cloudfront.net/"+e+"/thumb-"+t+".jpg?origin="+this.origin},e.falcorModel=function(e){return"https://a.mapillary.com/v3/model.json?client_id="+e},e.protoMesh=function(e){return"https://d1brzeo354iq2l.cloudfront.net/v2/mesh/"+e},e}();r.Urls=n,r.default=n},{}],418:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;!function(e){e[e.Bottom=0]="Bottom",e[e.BottomLeft=1]="BottomLeft",e[e.BottomRight=2]="BottomRight",e[e.Center=3]="Center",e[e.Left=4]="Left",e[e.Right=5]="Right",e[e.Top=6]="Top",e[e.TopLeft=7]="TopLeft",e[e.TopRight=8]="TopRight"}(n=r.Alignment||(r.Alignment={})),r.default=n},{}],419:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable");e("rxjs/add/operator/bufferCount"),e("rxjs/add/operator/delay"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/timeout");var i=e("../Graph"),o=function(){function e(e,t){this._graphService=e,this._stateService=t,this._started=!1}return Object.defineProperty(e.prototype,"started",{get:function(){return this._started},enumerable:!0,configurable:!0}),e.prototype.start=function(){var e=this;this._started||(this._uncacheSubscription=this._stateService.currentState$.distinctUntilChanged(void 0,function(e){return e.state.currentNode.key}).map(function(e){var t=e.state.trajectory;return[t.map(function(e){return e.key}),t[t.length-1].sequenceKey]}).bufferCount(1,5).withLatestFrom(this._graphService.graphMode$).switchMap(function(t){var r=t[0],n=t[1],o=r[0][0],a=n===i.GraphMode.Sequence?r[0][1]:void 0;return e._graphService.uncache$(o,a)}).subscribe(function(){}),this._cacheNodeSubscription=this._graphService.graphMode$.skip(1).withLatestFrom(this._stateService.currentState$).switchMap(function(t){var r=t[0],o=t[1];return r===i.GraphMode.Sequence?e._keyToEdges(o.state.currentNode.key,function(e){return e.sequenceEdges$}):n.Observable.from(o.state.trajectory.map(function(e){return e.key}).slice(o.state.currentIndex)).mergeMap(function(t){return e._keyToEdges(t,function(e){return e.spatialEdges$})},6)}).subscribe(function(){}),this._started=!0)},e.prototype.stop=function(){this._started&&(this._uncacheSubscription.unsubscribe(),this._uncacheSubscription=null,this._cacheNodeSubscription.unsubscribe(),this._cacheNodeSubscription=null,this._started=!1)},e.prototype._keyToEdges=function(e,t){return this._graphService.cacheNode$(e).switchMap(t).first(function(e){return e.cached}).timeout(15e3).catch(function(t){return console.error("Failed to cache edges ("+e+").",t),n.Observable.empty()})},e}();r.CacheService=o,r.default=o},{"../Graph":285,"rxjs/Observable":29,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/timeout":86}],420:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Component"),i=function(){function e(e,t,r,i,o,a){var s=this;this._container=e,this._observer=r,this._navigator=t,this._options=null!=o?o:{},this._key=i,this._navigable=null==i,this._componentService=a||new n.ComponentService(this._container,this._navigator),this._coverComponent=this._componentService.getCover(),this._initializeComponents(),i?(this._initilizeCoverComponent(),this._subscribeCoverComponent()):this._navigator.movedToKey$.first(function(e){return null!=e}).subscribe(function(e){s._key=e,s._componentService.deactivateCover(),s._coverComponent.configure({key:s._key,state:n.CoverState.Hidden}),s._subscribeCoverComponent(),s._navigator.stateService.start(),s._navigator.cacheService.start(),s._observer.startEmit()})}return Object.defineProperty(e.prototype,"navigable",{get:function(){return this._navigable},enumerable:!0,configurable:!0}),e.prototype.get=function(e){return this._componentService.get(e)},e.prototype.activate=function(e){this._componentService.activate(e)},e.prototype.activateCover=function(){this._coverComponent.configure({state:n.CoverState.Visible})},e.prototype.deactivate=function(e){this._componentService.deactivate(e)},e.prototype.deactivateCover=function(){this._coverComponent.configure({state:n.CoverState.Loading})},e.prototype.resize=function(){this._componentService.resize()},e.prototype._initializeComponents=function(){var e=this._options;this._uFalse(e.background,"background"),this._uFalse(e.debug,"debug"),this._uFalse(e.image,"image"),this._uFalse(e.marker,"marker"),this._uFalse(e.navigation,"navigation"),this._uFalse(e.popup,"popup"),this._uFalse(e.route,"route"),this._uFalse(e.slider,"slider"),this._uFalse(e.tag,"tag"),this._uTrue(e.attribution,"attribution"),this._uTrue(e.bearing,"bearing"),this._uTrue(e.cache,"cache"),this._uTrue(e.direction,"direction"),this._uTrue(e.imagePlane,"imagePlane"),this._uTrue(e.keyboard,"keyboard"),this._uTrue(e.loading,"loading"),this._uTrue(e.mouse,"mouse"),this._uTrue(e.sequence,"sequence"),this._uTrue(e.stats,"stats")},e.prototype._initilizeCoverComponent=function(){var e=this._options;this._coverComponent.configure({key:this._key}),void 0===e.cover||e.cover?this.activateCover():this.deactivateCover()},e.prototype._setNavigable=function(e){this._navigable!==e&&(this._navigable=e,this._observer.navigable$.next(e))},e.prototype._subscribeCoverComponent=function(){var e=this;this._coverComponent.configuration$.subscribe(function(t){t.state===n.CoverState.Loading?e._navigator.stateService.currentKey$.first().switchMap(function(r){var n=null==r||r!==t.key;return n&&e._setNavigable(!1),n?e._navigator.moveToKey$(t.key):e._navigator.stateService.currentNode$.first()}).subscribe(function(t){e._navigator.stateService.start(),e._navigator.cacheService.start(),e._observer.startEmit(),e._coverComponent.configure({state:n.CoverState.Hidden}),e._componentService.deactivateCover(),e._setNavigable(!0)},function(t){console.error("Failed to deactivate cover.",t),e._coverComponent.configure({state:n.CoverState.Visible})}):t.state===n.CoverState.Visible&&(e._observer.stopEmit(),e._navigator.stateService.stop(),e._navigator.cacheService.stop(),e._navigator.playService.stop(),e._componentService.activateCover(),e._setNavigable(null==t.key))})},e.prototype._uFalse=function(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.deactivate(t)},e.prototype._uTrue=function(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.activate(t)},e}();r.ComponentController=i},{"../Component":281}],421:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("../Render"),i=e("../Utils"),o=e("../Viewer"),a=function(){function e(e,t,r,a){if(this.id=e,this._dom=a||new i.DOM,this._container=this._dom.document.getElementById(e),!this._container)throw new Error("Container '"+e+"' not found.");this._container.classList.add("mapillary-js"),this._canvasContainer=this._dom.createElement("div","mapillary-js-interactive",this._container),this._domContainer=this._dom.createElement("div","mapillary-js-dom",this._container),this.renderService=new n.RenderService(this._container,t.currentState$,r.renderMode),this.glRenderer=new n.GLRenderer(this._canvasContainer,this.renderService,this._dom),this.domRenderer=new n.DOMRenderer(this._domContainer,this.renderService,t.currentState$),this.keyboardService=new o.KeyboardService(this._canvasContainer),this.mouseService=new o.MouseService(this._container,this._canvasContainer,this._domContainer,document),this.touchService=new o.TouchService(this._canvasContainer,this._domContainer),this.spriteService=new o.SpriteService(r.sprite)}return Object.defineProperty(e.prototype,"element",{get:function(){return this._container},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"canvasContainer",{get:function(){return this._canvasContainer},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domContainer",{get:function(){return this._domContainer},enumerable:!0,configurable:!0}),e}();r.Container=a,r.default=a},{"../Render":287,"../Utils":291,"../Viewer":292}],422:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});!function(e){e[e.Size320=320]="Size320",e[e.Size640=640]="Size640",e[e.Size1024=1024]="Size1024",e[e.Size2048=2048]="Size2048"}(r.ImageSize||(r.ImageSize={}))},{}],423:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=function(){function e(e){this._keyDown$=n.Observable.fromEvent(e,"keydown")}return Object.defineProperty(e.prototype,"keyDown$",{get:function(){return this._keyDown$},enumerable:!0,configurable:!0}),e}();r.KeyboardService=i,r.default=i},{"rxjs/Observable":29}],424:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("underscore"),i=e("rxjs/Subject");e("rxjs/add/operator/debounceTime"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var o=function(){function e(){this._loadersSubject$=new i.Subject,this._loaders$=this._loadersSubject$.scan(function(e,t){return void 0!==t.task&&(e[t.task]=t.loading),e},{}).startWith({}).publishReplay(1).refCount()}return Object.defineProperty(e.prototype,"loading$",{get:function(){return this._loaders$.map(function(e){return n.reduce(e,function(e,t){return e||t},!1)}).debounceTime(100).distinctUntilChanged()},enumerable:!0,configurable:!0}),e.prototype.taskLoading$=function(e){return this._loaders$.map(function(t){return!!t[e]}).debounceTime(100).distinctUntilChanged()},e.prototype.startLoading=function(e){this._loadersSubject$.next({loading:!0,task:e})},e.prototype.stopLoading=function(e){this._loadersSubject$.next({loading:!1,task:e})},e}();r.LoadingService=o,r.default=o},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,underscore:233}],425:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/fromEvent"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/mergeMap"),e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap"),e("rxjs/add/operator/withLatestFrom");var a=e("../Geo"),s=function(){function e(e,t,r,s,c){var u=this;c=null!=c?c:new a.ViewportCoords,this._activeSubject$=new n.BehaviorSubject(!1),this._active$=this._activeSubject$.distinctUntilChanged().publishReplay(1).refCount(),this._claimMouse$=new o.Subject,this._claimWheel$=new o.Subject,this._deferPixelClaims$=new o.Subject,this._deferPixels$=this._deferPixelClaims$.scan(function(e,t){return null==t.deferPixels?delete e[t.name]:e[t.name]=t.deferPixels,e},{}).map(function(e){var t=-1;for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];n>t&&(t=n)}return t}).startWith(-1).publishReplay(1).refCount(),this._deferPixels$.subscribe(function(){}),this._documentMouseMove$=i.Observable.fromEvent(s,"mousemove"),this._documentMouseUp$=i.Observable.fromEvent(s,"mouseup"),this._mouseDown$=i.Observable.fromEvent(t,"mousedown"),this._mouseLeave$=i.Observable.fromEvent(t,"mouseleave"),this._mouseMove$=i.Observable.fromEvent(t,"mousemove"),this._mouseUp$=i.Observable.fromEvent(t,"mouseup"),this._mouseOut$=i.Observable.fromEvent(t,"mouseout"),this._mouseOver$=i.Observable.fromEvent(t,"mouseover"),this._domMouseDown$=i.Observable.fromEvent(r,"mousedown"),this._domMouseMove$=i.Observable.fromEvent(r,"mousemove"),this._click$=i.Observable.fromEvent(t,"click"),this._contextMenu$=i.Observable.fromEvent(t,"contextmenu"),this._dblClick$=i.Observable.merge(i.Observable.fromEvent(e,"click"),i.Observable.fromEvent(t,"dblclick")).bufferCount(3,1).filter(function(e){var r=e[0],n=e[1],i=e[2];return"click"===r.type&&"click"===n.type&&"dblclick"===i.type&&r.target.parentNode===t&&n.target.parentNode===t}).map(function(e){return e[2]}).share(),i.Observable.merge(this._domMouseDown$,this._domMouseMove$,this._dblClick$,this._contextMenu$).subscribe(function(e){e.preventDefault()}),this._mouseWheel$=i.Observable.merge(i.Observable.fromEvent(t,"wheel"),i.Observable.fromEvent(r,"wheel")).share(),this._consistentContextMenu$=i.Observable.merge(this._mouseDown$,this._mouseMove$,this._mouseOut$,this._mouseUp$,this._contextMenu$).bufferCount(3,1).filter(function(e){return"mousedown"===e[0].type&&"contextmenu"===e[1].type&&"mouseup"===e[2].type}).map(function(e){return e[1]}).share();var h=i.Observable.merge(i.Observable.fromEvent(window,"blur"),this._documentMouseUp$.filter(function(e){return 0===e.button})).share(),l=this._createMouseDragInitiate$(this._mouseDown$,h,!0).share();this._mouseDragStart$=this._createMouseDragStart$(l).share(),this._mouseDrag$=this._createMouseDrag$(l,h).share(),this._mouseDragEnd$=this._createMouseDragEnd$(this._mouseDragStart$,h).share();var p=this._createMouseDragInitiate$(this._domMouseDown$,h,!1).share();this._domMouseDragStart$=this._createMouseDragStart$(p).share(),this._domMouseDrag$=this._createMouseDrag$(p,h).share(),this._domMouseDragEnd$=this._createMouseDragEnd$(this._domMouseDragStart$,h).share(),this._proximateClick$=this._mouseDown$.switchMap(function(e){return u._click$.takeUntil(u._createDeferredMouseMove$(e,u._documentMouseMove$)).take(1)}).share(),this._staticClick$=this._mouseDown$.switchMap(function(e){return u._click$.takeUntil(u._documentMouseMove$).take(1)}).share(),this._mouseDragStart$.subscribe(),this._mouseDrag$.subscribe(),this._mouseDragEnd$.subscribe(),this._domMouseDragStart$.subscribe(),this._domMouseDrag$.subscribe(),this._domMouseDragEnd$.subscribe(),this._staticClick$.subscribe(),this._mouseOwner$=this._createOwner$(this._claimMouse$).publishReplay(1).refCount(),this._wheelOwner$=this._createOwner$(this._claimWheel$).publishReplay(1).refCount(),this._mouseOwner$.subscribe(function(){}),this._wheelOwner$.subscribe(function(){})}return Object.defineProperty(e.prototype,"active$",{get:function(){return this._active$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"activate$",{get:function(){return this._activeSubject$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"documentMouseMove$",{get:function(){return this._documentMouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"documentMouseUp$",{get:function(){return this._documentMouseUp$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDragStart$",{get:function(){return this._domMouseDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDrag$",{get:function(){return this._domMouseDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDragEnd$",{get:function(){return this._domMouseDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseDown$",{get:function(){return this._domMouseDown$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"domMouseMove$",{get:function(){return this._domMouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOwner$",{get:function(){return this._mouseOwner$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDown$",{get:function(){return this._mouseDown$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseMove$",{get:function(){return this._mouseMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseLeave$",{get:function(){return this._mouseLeave$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOut$",{get:function(){return this._mouseOut$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseOver$",{get:function(){return this._mouseOver$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseUp$",{get:function(){return this._mouseUp$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"click$",{get:function(){return this._click$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dblClick$",{get:function(){return this._dblClick$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"contextMenu$",{get:function(){return this._consistentContextMenu$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseWheel$",{get:function(){return this._mouseWheel$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDragStart$",{get:function(){return this._mouseDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDrag$",{get:function(){return this._mouseDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mouseDragEnd$",{get:function(){return this._mouseDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"proximateClick$",{get:function(){return this._proximateClick$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"staticClick$",{get:function(){return this._staticClick$},enumerable:!0,configurable:!0}),e.prototype.claimMouse=function(e,t){this._claimMouse$.next({name:e,zindex:t})},e.prototype.unclaimMouse=function(e){this._claimMouse$.next({name:e,zindex:null})},e.prototype.deferPixels=function(e,t){this._deferPixelClaims$.next({name:e,deferPixels:t})},e.prototype.undeferPixels=function(e){this._deferPixelClaims$.next({name:e,deferPixels:null})},e.prototype.claimWheel=function(e,t){this._claimWheel$.next({name:e,zindex:t})},e.prototype.unclaimWheel=function(e){this._claimWheel$.next({name:e,zindex:null})},e.prototype.filtered$=function(e,t){return this._filtered(e,t,this._mouseOwner$)},e.prototype.filteredWheel$=function(e,t){return this._filtered(e,t,this._wheelOwner$)},e.prototype._createDeferredMouseMove$=function(e,t){return t.map(function(t){var r=t.clientX-e.clientX,n=t.clientY-e.clientY;return[t,Math.sqrt(r*r+n*n)]}).withLatestFrom(this._deferPixels$).filter(function(e){var t=e[0];t[0];return t[1]>e[1]}).map(function(e){var t=e[0],r=t[0];t[1],e[1];return r})},e.prototype._createMouseDrag$=function(e,t){var r=this;return e.map(function(e){e[0];return e[1]}).switchMap(function(e){return i.Observable.of(e).concat(r._documentMouseMove$).takeUntil(t)})},e.prototype._createMouseDragEnd$=function(e,t){return e.switchMap(function(e){return t.first()})},e.prototype._createMouseDragStart$=function(e){return e.map(function(e){var t=e[0];e[1];return t})},e.prototype._createMouseDragInitiate$=function(e,t,r){var n=this;return e.filter(function(e){return 0===e.button}).switchMap(function(e){return i.Observable.combineLatest(i.Observable.of(e),r?n._createDeferredMouseMove$(e,n._documentMouseMove$):n._documentMouseMove$).takeUntil(t).take(1)})},e.prototype._createOwner$=function(e){return e.scan(function(e,t){return null==t.zindex?delete e[t.name]:e[t.name]=t.zindex,e},{}).map(function(e){var t=null,r=-1;for(var n in e)e.hasOwnProperty(n)&&e[n]>r&&(r=e[n],t=n);return t}).startWith(null)},e.prototype._filtered=function(e,t,r){return t.withLatestFrom(r).filter(function(t){t[0];return t[1]===e}).map(function(e){var t=e[0];e[1];return t})},e}();r.MouseService=s,r.default=s},{"../Geo":284,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81,"rxjs/add/operator/withLatestFrom":87}],426:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/ReplaySubject");e("rxjs/add/observable/throw"),e("rxjs/add/operator/do"),e("rxjs/add/operator/finally"),e("rxjs/add/operator/first"),e("rxjs/add/operator/map"),e("rxjs/add/operator/mergeMap");var a=e("../API"),s=e("../Graph"),c=e("../Edge"),u=e("../State"),h=e("../Viewer"),l=function(){function e(e,t,r,i,o,c,l,p,f){this._apiV3=null!=r?r:new a.APIv3(e,t),this._imageLoadingService=null!=o?o:new s.ImageLoadingService,this._graphService=null!=i?i:new s.GraphService(new s.Graph(this.apiV3),this._imageLoadingService),this._loadingService=null!=c?c:new h.LoadingService,this._loadingName="navigator",this._stateService=null!=l?l:new u.StateService,this._cacheService=null!=p?p:new h.CacheService(this._graphService,this._stateService),this._playService=null!=f?f:new h.PlayService(this._graphService,this._stateService),this._keyRequested$=new n.BehaviorSubject(null),this._movedToKey$=new n.BehaviorSubject(null),this._request$=null,this._requestSubscription=null,this._nodeRequestSubscription=null}return Object.defineProperty(e.prototype,"apiV3",{get:function(){return this._apiV3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"cacheService",{get:function(){return this._cacheService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"graphService",{get:function(){return this._graphService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"imageLoadingService",{get:function(){return this._imageLoadingService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loadingService",{get:function(){return this._loadingService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"movedToKey$",{get:function(){return this._movedToKey$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"playService",{get:function(){return this._playService},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"stateService",{get:function(){return this._stateService},enumerable:!0,configurable:!0}),e.prototype.moveToKey$=function(e){this._abortRequest("to key "+e),this._loadingService.startLoading(this._loadingName);var t=this._moveToKey$(e);return this._makeRequest$(t)},e.prototype.moveDir$=function(e){var t=this;this._abortRequest("in dir "+c.EdgeDirection[e]),this._loadingService.startLoading(this._loadingName);var r=this.stateService.currentNode$.first().mergeMap(function(t){return([c.EdgeDirection.Next,c.EdgeDirection.Prev].indexOf(e)>-1?t.sequenceEdges$:t.spatialEdges$).first().map(function(t){for(var r=0,n=t.edges;r<n.length;r++){var i=n[r];if(i.data.direction===e)return i.to}return null})}).mergeMap(function(r){return null==r?(t._loadingService.stopLoading(t._loadingName),i.Observable.throw(new Error("Direction ("+e+") does not exist for current node."))):t._moveToKey$(r)});return this._makeRequest$(r)},e.prototype.moveCloseTo$=function(e,t){var r=this;this._abortRequest("to lat "+e+", lon "+t),this._loadingService.startLoading(this._loadingName);var n=this.apiV3.imageCloseTo$(e,t).mergeMap(function(n){return null==n?(r._loadingService.stopLoading(r._loadingName),i.Observable.throw(new Error("No image found close to lat "+e+", lon "+t+"."))):r._moveToKey$(n.key)});return this._makeRequest$(n)},e.prototype.setFilter$=function(e){var t=this;return this._stateService.clearNodes(),this._movedToKey$.first().mergeMap(function(r){return null!=r?t._trajectoryKeys$().mergeMap(function(r){return t._graphService.setFilter$(e).mergeMap(function(){return t._cacheKeys$(r)})}).last():t._keyRequested$.first().mergeMap(function(r){return null!=r?t._graphService.setFilter$(e).mergeMap(function(){return t._graphService.cacheNode$(r)}):t._graphService.setFilter$(e).map(function(){})})}).map(function(e){})},e.prototype.setToken$=function(e){var t=this;return this._abortRequest("to set token"),this._stateService.clearNodes(),this._movedToKey$.first().do(function(r){t._apiV3.setToken(e)}).mergeMap(function(e){return null==e?t._graphService.reset$([]):t._trajectoryKeys$().mergeMap(function(e){return t._graphService.reset$(e).mergeMap(function(){return t._cacheKeys$(e)})}).last().map(function(e){})})},e.prototype._cacheKeys$=function(e){var t=this,r=e.map(function(e){return t._graphService.cacheNode$(e)});return i.Observable.from(r).mergeAll()},e.prototype._abortRequest=function(e){null!=this._requestSubscription&&(this._requestSubscription.unsubscribe(),this._requestSubscription=null),null!=this._nodeRequestSubscription&&(this._nodeRequestSubscription.unsubscribe(),this._nodeRequestSubscription=null),null!=this._request$&&(this._request$.error(new Error("Request aborted by a subsequent request "+e+".")),this._request$=null)},e.prototype._makeRequest$=function(e){var t=this;return this._request$=new o.ReplaySubject(1),this._requestSubscription=this._request$.subscribe(void 0,function(e){}),this._nodeRequestSubscription=e.subscribe(function(e){t._request$.next(e),t._request$.complete()},function(e){t._request$.error(e)}),this._request$},e.prototype._moveToKey$=function(e){var t=this;return this._keyRequested$.next(e),this._graphService.cacheNode$(e).do(function(e){t._stateService.setNodes([e]),t._movedToKey$.next(e.key)}).finally(function(){t._loadingService.stopLoading(t._loadingName)})},e.prototype._trajectoryKeys$=function(){return this._stateService.currentState$.first().map(function(e){return e.state.trajectory.map(function(e){return e.key})})},e}();r.Navigator=l,r.default=l},{"../API":280,"../Edge":282,"../Graph":285,"../State":288,"../Viewer":292,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],427:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=e("rxjs/Subject");e("rxjs/add/observable/combineLatest"),e("rxjs/add/operator/distinctUntilChanged"),e("rxjs/add/operator/map"),e("rxjs/add/operator/throttleTime");var o=e("../Viewer"),a=function(){function e(e,t,r){var n=this;this._container=r,this._eventEmitter=e,this._navigator=t,this._projection=new o.Projection,this._started=!1,this._navigable$=new i.Subject,this._navigable$.subscribe(function(e){n._eventEmitter.fire(o.Viewer.navigablechanged,e)}),this._navigator.loadingService.loading$.subscribe(function(e){n._eventEmitter.fire(o.Viewer.loadingchanged,e)})}return Object.defineProperty(e.prototype,"started",{get:function(){return this._started},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"navigable$",{get:function(){return this._navigable$},enumerable:!0,configurable:!0}),e.prototype.projectBasic$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1],o=t._projection.basicToCanvas(e,t._container.element,n,i);return[Math.round(o[0]),Math.round(o[1])]})},e.prototype.startEmit=function(){var e=this;if(!this._started){this._started=!0,this._currentNodeSubscription=this._navigator.stateService.currentNodeExternal$.subscribe(function(t){e._eventEmitter.fire(o.Viewer.nodechanged,t)}),this._sequenceEdgesSubscription=this._navigator.stateService.currentNodeExternal$.switchMap(function(e){return e.sequenceEdges$}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.sequenceedgeschanged,t)}),this._spatialEdgesSubscription=this._navigator.stateService.currentNodeExternal$.switchMap(function(e){return e.spatialEdges$}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.spatialedgeschanged,t)}),this._moveSubscription=n.Observable.combineLatest(this._navigator.stateService.inMotion$,this._container.mouseService.active$,this._container.touchService.active$).map(function(e){return e[0]||e[1]||e[2]}).distinctUntilChanged().subscribe(function(t){t?e._eventEmitter.fire(o.Viewer.movestart,null):e._eventEmitter.fire(o.Viewer.moveend,null)}),this._bearingSubscription=this._container.renderService.bearing$.throttleTime(100).distinctUntilChanged(function(e,t){return Math.abs(t-e)<1}).subscribe(function(t){e._eventEmitter.fire(o.Viewer.bearingchanged,t)});var t=this._container.mouseService.active$.switchMap(function(t){return t?n.Observable.empty():e._container.mouseService.mouseMove$});this._viewerMouseEventSubscription=n.Observable.merge(this._mapMouseEvent$(o.Viewer.click,this._container.mouseService.staticClick$),this._mapMouseEvent$(o.Viewer.contextmenu,this._container.mouseService.contextMenu$),this._mapMouseEvent$(o.Viewer.dblclick,this._container.mouseService.dblClick$),this._mapMouseEvent$(o.Viewer.mousedown,this._container.mouseService.mouseDown$),this._mapMouseEvent$(o.Viewer.mousemove,t),this._mapMouseEvent$(o.Viewer.mouseout,this._container.mouseService.mouseOut$),this._mapMouseEvent$(o.Viewer.mouseover,this._container.mouseService.mouseOver$),this._mapMouseEvent$(o.Viewer.mouseup,this._container.mouseService.mouseUp$)).withLatestFrom(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).map(function(t){var r=t[0],n=r[0],i=r[1],o=t[1],a=t[2],s=t[3],c=e._projection.eventToUnprojection(i,e._container.element,o,a,s);return{basicPoint:c.basicPoint,latLon:c.latLon,originalEvent:i,pixelPoint:c.pixelPoint,target:e._eventEmitter,type:n}}).subscribe(function(t){e._eventEmitter.fire(t.type,t)})}},e.prototype.stopEmit=function(){this.started&&(this._started=!1,this._bearingSubscription.unsubscribe(),this._currentNodeSubscription.unsubscribe(),this._moveSubscription.unsubscribe(),this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._viewerMouseEventSubscription.unsubscribe(),this._bearingSubscription=null,this._currentNodeSubscription=null,this._moveSubscription=null,this._sequenceEdgesSubscription=null,this._spatialEdgesSubscription=null,this._viewerMouseEventSubscription=null)},e.prototype.unproject$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1],o=r[2];return t._projection.canvasToUnprojection(e,t._container.element,n,i,o).latLon})},e.prototype.unprojectBasic$=function(e){var t=this;return n.Observable.combineLatest(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).first().map(function(r){var n=r[0],i=r[1];return t._projection.canvasToBasic(e,t._container.element,n,i)})},e.prototype._mapMouseEvent$=function(e,t){return t.map(function(t){return[e,t]})},e}();r.Observer=a,r.default=a},{"../Viewer":292,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":85}],428:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/Observable"),i=e("rxjs/Subject");e("rxjs/add/operator/timeout");var o=e("../Edge"),a=e("../Graph"),s=function(){function e(e,t){this._graphService=e,this._stateService=t,this._directionSubject$=new i.Subject,this._direction$=this._directionSubject$.startWith(o.EdgeDirection.Next).publishReplay(1).refCount(),this._direction$.subscribe(),this._playing=!1,this._playingSubject$=new i.Subject,this._playing$=this._playingSubject$.startWith(this._playing).publishReplay(1).refCount(),this._playing$.subscribe(),this._speed=.5,this._speedSubject$=new i.Subject,this._speed$=this._speedSubject$.startWith(this._speed).publishReplay(1).refCount(),this._speed$.subscribe(),this._nodesAhead=this._mapNodesAhead(this._mapSpeed(this._speed))}return Object.defineProperty(e.prototype,"playing",{get:function(){return this._playing},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"direction$",{get:function(){return this._direction$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"playing$",{get:function(){return this._playing$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"speed$",{get:function(){return this._speed$},enumerable:!0,configurable:!0}),e.prototype.play=function(){var e=this;if(!this._playing){this._stateService.cutNodes();var t=this._setSpeed(this._speed);this._stateService.setSpeed(t),this._graphModeSubscription=this._speed$.map(function(e){return e>.54?a.GraphMode.Sequence:a.GraphMode.Spatial}).distinctUntilChanged().subscribe(function(t){e._graphService.setGraphMode(t)}),this._cacheSubscription=this._stateService.currentNode$.map(function(e){return[e.sequenceKey,e.key]}).distinctUntilChanged(void 0,function(e){var t=e[0];e[1];return t}).combineLatest(this._graphService.graphMode$,this._direction$).switchMap(function(t){var r=t[0],i=r[0],s=r[1],c=t[1],u=t[2];if(u!==o.EdgeDirection.Next&&u!==o.EdgeDirection.Prev)return n.Observable.of([void 0,u]);var h=(c===a.GraphMode.Sequence?e._graphService.cacheSequenceNodes$(i,s):e._graphService.cacheSequence$(i)).retry(3).catch(function(){return n.Observable.of(void 0)});return n.Observable.combineLatest(h,n.Observable.of(u))}).switchMap(function(t){var r=t[0],i=t[1];if(void 0===r)return n.Observable.empty();var a=r.keys.slice();return i===o.EdgeDirection.Prev&&a.reverse(),e._stateService.currentState$.map(function(e){return[e.state.trajectory[e.state.trajectory.length-1].key,e.state.nodesAhead]}).scan(function(t,r){var n=t[0],i=(t[1],r[0]),o=r[1];void 0===n&&(n=i);var s=a.length-1;if(o>=e._nodesAhead||a[s]===n)return[n,[]];var c=a.indexOf(i),u=a.indexOf(n)+1,h=Math.min(s,c+e._nodesAhead-o)+1;return h<=u?[n,[]]:[a[h-1],a.slice(u,h)]},[void 0,[]]).mergeMap(function(e){e[0];var t=e[1];return n.Observable.from(t)})}).mergeMap(function(t){return e._graphService.cacheNode$(t).catch(function(){return n.Observable.empty()})},6).subscribe(),this._playingSubscription=this._stateService.currentState$.filter(function(t){return t.state.nodesAhead<e._nodesAhead}).map(function(e){return e.state.lastNode}).distinctUntilChanged(void 0,function(e){return e.key}).withLatestFrom(this._direction$).switchMap(function(t){var r=t[0],i=t[1];return([o.EdgeDirection.Next,o.EdgeDirection.Prev].indexOf(i)>-1?r.sequenceEdges$:r.spatialEdges$).first(function(e){return e.cached}).timeout(15e3).zip(n.Observable.of(i)).map(function(e){for(var t=e[0],r=e[1],n=0,i=t.edges;n<i.length;n++){var o=i[n];if(o.data.direction===r)return o.to}return null}).filter(function(e){return null!=e}).switchMap(function(t){return e._graphService.cacheNode$(t)})}).subscribe(function(t){e._stateService.appendNodes([t])},function(t){console.error(t),e.stop()}),this._clearSubscription=this._stateService.currentNode$.bufferCount(1,10).subscribe(function(t){e._stateService.clearPriorNodes()}),this._setPlaying(!0),this._stopSubscription=n.Observable.combineLatest(this._stateService.currentNode$,this._direction$).switchMap(function(e){var t=e[0],r=e[1],i=([o.EdgeDirection.Next,o.EdgeDirection.Prev].indexOf(r)>-1?t.sequenceEdges$:t.spatialEdges$).first(function(e){return e.cached}).timeout(15e3).catch(function(e){return console.error(e),n.Observable.of({cached:!1,edges:[]})});return n.Observable.combineLatest(n.Observable.of(r),i)}).map(function(e){for(var t=e[0],r=0,n=e[1].edges;r<n.length;r++){if(n[r].data.direction===t)return!0}return!1}).first(function(e){return!e}).subscribe(void 0,void 0,function(){e.stop()}),this._stopSubscription.closed&&(this._stopSubscription=null)}},e.prototype.setDirection=function(e){this._directionSubject$.next(e)},e.prototype.setSpeed=function(e){if((e=Math.max(0,Math.min(1,e)))!==this._speed){var t=this._setSpeed(e);this._playing&&this._stateService.setSpeed(t),this._speedSubject$.next(this._speed)}},e.prototype.stop=function(){this._playing&&(this._stopSubscription&&(this._stopSubscription.closed||this._stopSubscription.unsubscribe(),this._stopSubscription=null),this._graphModeSubscription.unsubscribe(),this._graphModeSubscription=null,this._cacheSubscription.unsubscribe(),this._cacheSubscription=null,this._playingSubscription.unsubscribe(),this._playingSubscription=null,this._clearSubscription.unsubscribe(),this._clearSubscription=null,this._stateService.setSpeed(1),this._stateService.cutNodes(),this._graphService.setGraphMode(a.GraphMode.Spatial),this._setPlaying(!1))},e.prototype._mapSpeed=function(e){var t=2*e-1;return Math.pow(10,t)-.2*t},e.prototype._mapNodesAhead=function(e){return Math.round(Math.max(10,Math.min(50,8+6*e)))},e.prototype._setPlaying=function(e){this._playing=e,this._playingSubject$.next(e)},e.prototype._setSpeed=function(e){this._speed=e;var t=this._mapSpeed(this._speed);return this._nodesAhead=this._mapNodesAhead(t),t},e}();r.PlayService=s,r.default=s},{"../Edge":282,"../Graph":285,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/timeout":86}],429:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("../Geo"),o=function(){function e(e,t){this._geoCoords=e||new i.GeoCoords,this._viewportCoords=t||new i.ViewportCoords}return e.prototype.basicToCanvas=function(e,t,r,n){return this._viewportCoords.basicToCanvas(e[0],e[1],t,n,r.perspective)},e.prototype.canvasToBasic=function(e,t,r,n){var i=this._viewportCoords.canvasToBasic(e[0],e[1],t,n,r.perspective);return(i[0]<0||i[0]>1||i[1]<0||i[1]>1)&&(i=null),i},e.prototype.eventToUnprojection=function(e,t,r,n,i){var o=this._viewportCoords.canvasPosition(e,t);return this.canvasToUnprojection(o,t,r,n,i)},e.prototype.canvasToUnprojection=function(e,t,r,i,o){var a=e[0],s=e[1],c=this._viewportCoords.canvasToViewport(a,s,t),u=c[0],h=c[1],l=new n.Vector3(u,h,1).unproject(r.perspective),p=o.projectBasic(l.toArray());(p[0]<0||p[0]>1||p[1]<0||p[1]>1)&&(p=null);var f=l.clone().sub(r.camera.position).normalize(),d=-2/f.z,m=null;if(d>0&&d<100&&p){var v=f.clone().multiplyScalar(d).add(r.camera.position),g=this._geoCoords.enuToGeodetic(v.x,v.y,v.z,i.lat,i.lon,i.alt).slice(0,2);m={lat:g[0],lon:g[1]}}return{basicPoint:p,latLon:m,pixelPoint:[a,s]}},e}();r.Projection=o,r.default=o},{"../Geo":284,three:231}],430:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("three"),i=e("virtual-dom"),o=e("rxjs/Subject");e("rxjs/add/operator/publishReplay"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/startWith");var a=e("../Viewer"),s=function(){function e(){}return Object.defineProperty(e.prototype,"json",{set:function(e){this._json=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"image",{set:function(e){this._image=e,this._texture=new n.Texture(this._image),this._texture.minFilter=n.NearestFilter},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"loaded",{get:function(){return!(!this._image||!this._json)},enumerable:!0,configurable:!0}),e.prototype.getGLSprite=function(e){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");var t=this._json[e];if(!t)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),new n.Object3D;var r=this._texture.clone();r.needsUpdate=!0;var i=this._image.width,o=this._image.height;r.offset.x=t.x/i,r.offset.y=(o-t.y-t.height)/o,r.repeat.x=t.width/i,r.repeat.y=t.height/o;var a=new n.SpriteMaterial({map:r});return new n.Sprite(a)},e.prototype.getDOMSprite=function(e,t){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");null==t&&(t=a.Alignment.Center);var r=this._json[e];if(!r)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),i.h("div",{},[]);var n=r.y,o=r.x+r.width,s=r.y+r.height,c=r.x,u=-r.x,h=-r.y,l=this._image.height,p=this._image.width;switch(t){case a.Alignment.Bottom:case a.Alignment.Center:case a.Alignment.Top:u-=r.width/2;break;case a.Alignment.BottomLeft:case a.Alignment.Left:case a.Alignment.TopLeft:u-=r.width;break;case a.Alignment.BottomRight:case a.Alignment.Right:case a.Alignment.TopRight:}switch(t){case a.Alignment.Center:case a.Alignment.Left:case a.Alignment.Right:h-=r.height/2;break;case a.Alignment.Top:case a.Alignment.TopLeft:case a.Alignment.TopRight:h-=r.height;break;case a.Alignment.Bottom:case a.Alignment.BottomLeft:case a.Alignment.BottomRight:}var f=1/r.pixelRatio;n*=f,o*=f,s*=f,c*=f,u*=f,h*=f,l*=f,p*=f;var d={src:this._image.src,style:{clip:"rect("+n+"px, "+o+"px, "+s+"px, "+c+"px)",height:l+"px",left:u+"px",position:"absolute",top:h+"px",width:p+"px"}};return i.h("img",d,[])},e}(),c=function(){function e(e){var t=this;if(this._retina=window.devicePixelRatio>1,this._spriteAtlasOperation$=new o.Subject,this._spriteAtlas$=this._spriteAtlasOperation$.startWith(function(e){return e}).scan(function(e,t){return t(e)},new s).publishReplay(1).refCount(),this._spriteAtlas$.subscribe(function(){}),null!=e){var r=this._retina?"@2x":"",n=new XMLHttpRequest;n.open("GET",e+r+".png",!0),n.responseType="arraybuffer",n.onload=function(){var e=new Image;e.onload=function(){t._spriteAtlasOperation$.next(function(t){return t.image=e,t})};var r=new Blob([n.response]);e.src=window.URL.createObjectURL(r)},n.onerror=function(t){console.error(new Error("Failed to fetch sprite sheet ("+e+r+".png)"))},n.send();var i=new XMLHttpRequest;i.open("GET",e+r+".json",!0),i.responseType="text",i.onload=function(){var e=JSON.parse(i.response);t._spriteAtlasOperation$.next(function(t){return t.json=e,t})},i.onerror=function(t){console.error(new Error("Failed to fetch sheet ("+e+r+".json)"))},i.send()}}return Object.defineProperty(e.prototype,"spriteAtlas$",{get:function(){return this._spriteAtlas$},enumerable:!0,configurable:!0}),e}();r.SpriteService=c,r.default=c},{"../Viewer":292,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":75,"rxjs/add/operator/startWith":80,three:231,"virtual-dom":237}],431:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("rxjs/BehaviorSubject"),i=e("rxjs/Observable"),o=e("rxjs/Subject");e("rxjs/add/observable/timer"),e("rxjs/add/operator/bufferWhen"),e("rxjs/add/operator/filter"),e("rxjs/add/operator/map"),e("rxjs/add/operator/merge"),e("rxjs/add/operator/scan"),e("rxjs/add/operator/switchMap");var a=function(){function e(e,t){var r=this;this._activeSubject$=new n.BehaviorSubject(!1),this._active$=this._activeSubject$.distinctUntilChanged().publishReplay(1).refCount(),i.Observable.fromEvent(t,"touchmove").subscribe(function(e){e.preventDefault()}),this._touchStart$=i.Observable.fromEvent(e,"touchstart"),this._touchMove$=i.Observable.fromEvent(e,"touchmove"),this._touchEnd$=i.Observable.fromEvent(e,"touchend"),this._touchCancel$=i.Observable.fromEvent(e,"touchcancel");var a=this._touchStart$.filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}).share();this._doubleTap$=a.bufferWhen(function(){return a.first().switchMap(function(e){return i.Observable.timer(300).merge(a).take(1)})}).filter(function(e){return 2===e.length}).map(function(e){return e[e.length-1]}).share(),this._doubleTap$.subscribe(function(e){e.preventDefault()}),this._singleTouchMove$=this._touchMove$.filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}).share();var s=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$).filter(function(e){return 1===e.touches.length&&1===e.targetTouches.length}),c=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$).filter(function(e){return e.touches.length>=1}),u=i.Observable.merge(this._touchEnd$,this._touchCancel$).filter(function(e){return 0===e.touches.length});this._singleTouchDragStart$=s.mergeMap(function(e){return r._singleTouchMove$.takeUntil(i.Observable.merge(u,c)).take(1)}),this._singleTouchDragEnd$=s.mergeMap(function(e){return i.Observable.merge(u,c).first()}),this._singleTouchDrag$=s.switchMap(function(e){return r._singleTouchMove$.skip(1).takeUntil(i.Observable.merge(c,u))});var h=i.Observable.merge(this._touchStart$,this._touchEnd$,this._touchCancel$);this._pinchStart$=h.filter(function(e){return 2===e.touches.length&&2===e.targetTouches.length}),this._pinchEnd$=h.filter(function(e){return 2!==e.touches.length||2!==e.targetTouches.length}),this._pinchOperation$=new o.Subject,this._pinch$=this._pinchOperation$.scan(function(e,t){return t(e)},{changeX:0,changeY:0,clientX:0,clientY:0,distance:0,distanceChange:0,distanceX:0,distanceY:0,originalEvent:null,pageX:0,pageY:0,screenX:0,screenY:0,touch1:null,touch2:null}),this._touchMove$.filter(function(e){return 2===e.touches.length&&2===e.targetTouches.length}).map(function(e){return function(t){var r=e.touches[0],n=e.touches[1],i=Math.min(r.clientX,n.clientX),o=Math.max(r.clientX,n.clientX),a=Math.min(r.clientY,n.clientY),s=i+(o-i)/2,c=a+(Math.max(r.clientY,n.clientY)-a)/2,u=s+r.pageX-r.clientX,h=c+r.pageY-r.clientY,l=s+r.screenX-r.clientX,p=c+r.screenY-r.clientY,f=Math.abs(r.clientX-n.clientX),d=Math.abs(r.clientY-n.clientY),m=Math.sqrt(f*f+d*d),v=m-t.distance;return{changeX:f-t.distanceX,changeY:d-t.distanceY,clientX:s,clientY:c,distance:m,distanceChange:v,distanceX:f,distanceY:d,originalEvent:e,pageX:u,pageY:h,screenX:l,screenY:p,touch1:r,touch2:n}}}).subscribe(this._pinchOperation$),this._pinchChange$=this._pinchStart$.switchMap(function(e){return r._pinch$.skip(1).takeUntil(r._pinchEnd$)})}return Object.defineProperty(e.prototype,"active$",{get:function(){return this._active$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"activate$",{get:function(){return this._activeSubject$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"doubleTap$",{get:function(){return this._doubleTap$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchStart$",{get:function(){return this._touchStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchMove$",{get:function(){return this._touchMove$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchEnd$",{get:function(){return this._touchEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touchCancel$",{get:function(){return this._touchCancel$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDragStart$",{get:function(){return this._singleTouchDragStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDrag$",{get:function(){return this._singleTouchDrag$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"singleTouchDragEnd$",{get:function(){return this._singleTouchDragEnd$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinch$",{get:function(){return this._pinchChange$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinchStart$",{get:function(){return this._pinchStart$},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pinchEnd$",{get:function(){return this._pinchEnd$},enumerable:!0,configurable:!0}),e}();r.TouchService=a},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":75,"rxjs/add/operator/switchMap":81}],432:[function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var i=e("when"),o=e("rxjs/Observable"),a=e("../Viewer"),s=e("../Utils"),c=function(e){function t(t,r,n,i,o){var c=e.call(this)||this;return i=null!=i?i:{},s.Settings.setOptions(i),c._navigator=new a.Navigator(r,o),c._container=new a.Container(t,c._navigator.stateService,i),c._observer=new a.Observer(c,c._navigator,c._container),c._componentController=new a.ComponentController(c._container,c._navigator,c._observer,n,i.component),c}return n(t,e),Object.defineProperty(t.prototype,"isNavigable",{get:function(){return this._componentController.navigable},enumerable:!0,configurable:!0}),t.prototype.activateComponent=function(e){this._componentController.activate(e)},t.prototype.activateCover=function(){this._componentController.activateCover()},t.prototype.deactivateComponent=function(e){this._componentController.deactivate(e)},t.prototype.deactivateCover=function(){this._componentController.deactivateCover()},t.prototype.getBearing=function(){var e=this;return i.promise(function(t,r){e._container.renderService.bearing$.first().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.getCenter=function(){var e=this;return i.promise(function(t,r){e._navigator.stateService.getCenter().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.getComponent=function(e){return this._componentController.get(e)},t.prototype.getContainer=function(){return this._container.element},t.prototype.getZoom=function(){var e=this;return i.promise(function(t,r){e._navigator.stateService.getZoom().subscribe(function(e){t(e)},function(e){r(e)})})},t.prototype.moveCloseTo=function(e,t){var r=this.isNavigable?this._navigator.moveCloseTo$(e,t):o.Observable.throw(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));return i.promise(function(e,t){r.subscribe(function(t){e(t)},function(e){t(e)})})},t.prototype.moveDir=function(e){var t=this.isNavigable?this._navigator.moveDir$(e):o.Observable.throw(new Error("Calling moveDir is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(t){e(t)},function(e){r(e)})})},t.prototype.moveToKey=function(e){var t=this.isNavigable?this._navigator.moveToKey$(e):o.Observable.throw(new Error("Calling moveToKey is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(t){e(t)},function(e){r(e)})})},t.prototype.projectFromBasic=function(e){var t=this;return i.promise(function(r,n){t._observer.projectBasic$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.resize=function(){this._container.renderService.resize$.next(null),this._componentController.resize()},t.prototype.setAuthToken=function(e){var t=this.isNavigable?this._navigator.setToken$(e):o.Observable.throw(new Error("Calling setAuthToken is not supported when viewer is not navigable."));return i.promise(function(e,r){t.subscribe(function(){e(void 0)},function(e){r(e)})})},t.prototype.setCenter=function(e){this._navigator.stateService.setCenter(e)},t.prototype.setFilter=function(e){var t=this;return i.promise(function(r,n){t._navigator.setFilter$(e).subscribe(function(){r(void 0)},function(e){n(e)})})},t.prototype.setRenderMode=function(e){this._container.renderService.renderMode$.next(e)},t.prototype.setZoom=function(e){this._navigator.stateService.setZoom(e)},t.prototype.unproject=function(e){var t=this;return i.promise(function(r,n){t._observer.unproject$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.prototype.unprojectToBasic=function(e){var t=this;return i.promise(function(r,n){t._observer.unprojectBasic$(e).subscribe(function(e){r(e)},function(e){n(e)})})},t.bearingchanged="bearingchanged",t.click="click",t.contextmenu="contextmenu",t.dblclick="dblclick",t.loadingchanged="loadingchanged",t.mousedown="mousedown",t.mousemove="mousemove",t.mouseout="mouseout",t.mouseover="mouseover",t.mouseup="mouseup",t.moveend="moveend",t.movestart="movestart",t.navigablechanged="navigablechanged",t.nodechanged="nodechanged",t.sequenceedgeschanged="sequenceedgeschanged",t.spatialedgeschanged="spatialedgeschanged",t}(s.EventEmitter);r.Viewer=c},{"../Utils":291,"../Viewer":292,"rxjs/Observable":29,when:278}]},{},[286])(286)});
index 00513f41dd41eb9b370780c02acca55657ad89a5..f9a6b1e9c31f1d1da24047ec974a1dfd13085530 100644 (file)
@@ -1 +1,6 @@
-<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>stepper-left</title><path d="M6.614 8l4.418-4.46c.377-.352.377-.922 0-1.276-.377-.352-.986-.352-1.363 0L4.282 7.36c-.377.355-.377.926 0 1.278l5.386 5.097c.374.355.985.352 1.362 0 .377-.35.377-.922 0-1.276L6.614 8z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <title>
+    chevronleft
+  </title>
+  <path d="M6.268 8.0002l5.5215-5.9473c.471-.4697.471-1.2296 0-1.701-.471-.4694-1.2323-.4694-1.7034 0L3.3534 7.148c-.471.4714-.471 1.233 0 1.7026l6.7328 6.796c.4695.473 1.2324.4695 1.7035 0 .471-.4678.471-1.2295 0-1.7008L6.268 8.0002z" fill="#FFF" fill-rule="evenodd"/>
+</svg>
index 77ced1b8c6a84b74493732cb3b32c00059f0c715..d32844d9c0bf2b0ba52100a6177531fc5a658120 100644 (file)
@@ -1 +1,6 @@
-<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>stepper-play</title><path d="M14.132 8.515l-8.947 5.303c-.652.41-1.185.106-1.185-.67V2.853c0-.777.533-1.078 1.186-.67l8.947 5.305s.318.215.318.514c0 .3-.318.515-.318.515z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <title>
+    play
+  </title>
+  <path d="M14.8952 8.6865L3.5082 15.757C2.6783 16.302 2 15.898 2 14.865V1.136C2 .1 2.6783-.301 3.5096.243l11.387 7.073c-.0014 0 .4043.2867.4043.6853 0 .3988-.4058.6855-.4058.6855z" fill="#FFF" fill-rule="evenodd"/>
+</svg>
index 2236ae7817f187af23c74b3c158781daaa4b956b..6e28b872ffa7b3d0ac20e644bd97e0f844955981 100644 (file)
@@ -1 +1,6 @@
-<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>stepper-right</title><path d="M9.386 8L4.968 3.54c-.377-.352-.377-.922 0-1.276.377-.352.986-.352 1.363 0l5.387 5.097c.377.355.377.926 0 1.278L6.33 13.735c-.374.355-.985.352-1.362 0-.377-.35-.377-.922 0-1.276L9.386 8z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <title>
+    chevronright
+  </title>
+  <path d="M9.875 8.0002L4.3532 2.053c-.471-.4697-.471-1.2296 0-1.701.4712-.4694 1.2323-.4694 1.7034 0l6.7328 6.796c.471.4714.471 1.233 0 1.7026l-6.7328 6.796c-.4693.473-1.2322.4695-1.7034 0-.471-.4678-.471-1.2295 0-1.7008L9.875 8.0002z" fill="#FFF" fill-rule="evenodd"/>
+</svg>
index 2fcb42071dab12988302fda27d010f314d7a50fe..28bf8a1010b75342bfe13d37d60f254fa68bb739 100644 (file)
@@ -1 +1,6 @@
-<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>stepper-stop</title><rect width="12" height="12" rx="2" transform="translate(2 2)" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <title>
+    stop
+  </title>
+  <path d="M0 1.994C0 .893.8945 0 1.994 0h12.012C15.107 0 16 .8945 16 1.994v12.012C16 15.107 15.1055 16 14.006 16H1.994C.893 16 0 15.1055 0 14.006V1.994z" fill="#FFF" fill-rule="evenodd"/>
+</svg>
index e4abba3b511d14752426e8cbadae03c1e5fe15fb..88f9e501888c9c6cb29ad340d9a888627dd1b6d8 100644 (file)
Binary files a/vendor/assets/leaflet/images/marker-icon-2x.png and b/vendor/assets/leaflet/images/marker-icon-2x.png differ
index a9b011d9519c685bafa3d66feb166e0a72294f8d..58cd4d7bfb6b5568fddd7cea51ff15fac4e7e45c 100644 (file)
@@ -144,16 +144,22 @@ L.Map.ContextMenu = L.Handler.extend({
                 contextmenu: this,
                 el: item
             });
+
+            return item;
         }
+
+        return null;
     },
 
     removeAllItems: function () {
-        var item;
+        var items = this._container.children,
+            item;
 
-        while (this._container.children.length) {
-            item = this._container.children[0];
+        while (items.length) {
+            item = items[0];
             this._removeItem(L.Util.stamp(item));
         }
+        return items;
     },
 
     hideAllItems: function () {
@@ -322,7 +328,7 @@ L.Map.ContextMenu = L.Handler.extend({
                 func.call(context || map, me._showLocation);
             }
 
-            me._map.fire('contextmenu:select', {
+            me._map.fire('contextmenu.select', {
                 contextmenu: me,
                 el: el
             });
index fa5abca60dacf6a541441eac116713856910f722..d1b47a1251c18df4c08b0b8c0b2c64522c90eab9 100644 (file)
@@ -47,6 +47,7 @@
 .leaflet-container .leaflet-tile-pane img,
 .leaflet-container img.leaflet-image-layer {
        max-width: none !important;
+       max-height: none !important;
        }
 
 .leaflet-container.leaflet-touch-zoom {
        }
 .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;
index 0f239b11e75f0d0f647a1747255ddc63308aa7f2..63f6fb790cac8c3a9674ea57f9b47edcf5611e5a 100644 (file)
@@ -1,14 +1,15 @@
 /* @preserve
- * Leaflet 1.2.0, a JS library for interactive maps. http://leafletjs.com
+ * Leaflet 1.3.1, a JS library for interactive maps. http://leafletjs.com
  * (c) 2010-2017 Vladimir Agafonkin, (c) 2010-2011 CloudMade
  */
+
 (function (global, factory) {
        typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
        typeof define === 'function' && define.amd ? define(['exports'], factory) :
        (factory((global.L = {})));
 }(this, (function (exports) { 'use strict';
 
-var version = "1.2.0";
+var version = "1.3.1";
 
 /*
  * @namespace Util
@@ -65,12 +66,12 @@ function bind(fn, obj) {
 var lastId = 0;
 
 // @function stamp(obj: Object): Number
-// Returns the unique ID of an object, assiging it one if it doesn't have it.
+// Returns the unique ID of an object, assigning it one if it doesn't have it.
 function stamp(obj) {
        /*eslint-disable */
        obj._leaflet_id = obj._leaflet_id || ++lastId;
        return obj._leaflet_id;
-       /*eslint-enable */
+       /* eslint-enable */
 }
 
 // @function throttle(fn: Function, time: Number, context: Object): Function
@@ -124,9 +125,9 @@ function wrapNum(x, range, includeMax) {
 function falseFn() { return false; }
 
 // @function formatNum(num: Number, digits?: Number): Number
-// Returns the number `num` rounded to `digits` decimals, or to 5 decimals by default.
+// Returns the number `num` rounded to `digits` decimals, or to 6 decimals by default.
 function formatNum(num, digits) {
-       var pow = Math.pow(10, digits || 5);
+       var pow = Math.pow(10, (digits === undefined ? 6 : digits));
        return Math.round(num * pow) / pow;
 }
 
@@ -167,7 +168,7 @@ function getParamString(obj, existingUrl, uppercase) {
        return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
 }
 
-var templateRe = /\{ *([\w_\-]+) *\}/g;
+var templateRe = /\{ *([\w_-]+) *\}/g;
 
 // @function template(str: String, data: Object): String
 // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'`
@@ -390,7 +391,7 @@ Class.addInitHook = function (fn) { // (Function) || (String, args...)
 };
 
 function checkDeprecatedMixinEvents(includes) {
-       if (!L || !L.Mixin) { return; }
+       if (typeof L === 'undefined' || !L || !L.Mixin) { return; }
 
        includes = isArray(includes) ? includes : [includes];
 
@@ -576,7 +577,11 @@ var Events = {
        fire: function (type, data, propagate) {
                if (!this.listens(type, propagate)) { return this; }
 
-               var event = extend({}, data, {type: type, target: this});
+               var event = extend({}, data, {
+                       type: type,
+                       target: this,
+                       sourceTarget: data && data.sourceTarget || this
+               });
 
                if (this._events) {
                        var listeners = this._events[type];
@@ -657,7 +662,10 @@ var Events = {
 
        _propagateEvent: function (e) {
                for (var id in this._eventParents) {
-                       this._eventParents[id].fire(e.type, extend({layer: e.target}, e), true);
+                       this._eventParents[id].fire(e.type, extend({
+                               layer: e.target,
+                               propagatedFrom: e.target
+                       }, e), true);
                }
        }
 };
@@ -707,6 +715,10 @@ var Evented = Class.extend(Events);
  * map.panBy([200, 300]);
  * map.panBy(L.point(200, 300));
  * ```
+ *
+ * Note that `Point` does not inherit from Leafet's `Class` object,
+ * which means new classes can't inherit from it, and new methods
+ * can't be added to it with the `include` function.
  */
 
 function Point(x, y, round) {
@@ -716,6 +728,10 @@ function Point(x, y, round) {
        this.y = (round ? Math.round(y) : y);
 }
 
+var trunc = Math.trunc || function (v) {
+       return v > 0 ? Math.floor(v) : Math.ceil(v);
+};
+
 Point.prototype = {
 
        // @method clone(): Point
@@ -826,6 +842,18 @@ Point.prototype = {
                return this;
        },
 
+       // @method trunc(): Point
+       // Returns a copy of the current point with truncated coordinates (rounded towards zero).
+       trunc: function () {
+               return this.clone()._trunc();
+       },
+
+       _trunc: function () {
+               this.x = trunc(this.x);
+               this.y = trunc(this.y);
+               return this;
+       },
+
        // @method distanceTo(otherPoint: Point): Number
        // Returns the cartesian distance between the current and the given points.
        distanceTo: function (point) {
@@ -909,6 +937,10 @@ function toPoint(x, y, round) {
  * ```js
  * otherBounds.intersects([[10, 10], [40, 60]]);
  * ```
+ *
+ * Note that `Bounds` does not inherit from Leafet's `Class` object,
+ * which means new classes can't inherit from it, and new methods
+ * can't be added to it with the `include` function.
  */
 
 function Bounds(a, b) {
@@ -1082,6 +1114,10 @@ function toBounds(a, b) {
  * ```
  *
  * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range.
+ *
+ * Note that `LatLngBounds` does not inherit from Leafet's `Class` object,
+ * which means new classes can't inherit from it, and new methods
+ * can't be added to it with the `include` function.
  */
 
 function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[])
@@ -1135,7 +1171,9 @@ LatLngBounds.prototype = {
        },
 
        // @method pad(bufferRatio: Number): LatLngBounds
-       // Returns bigger bounds created by extending the current bounds by a given percentage in each direction.
+       // Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.
+       // For example, a ratio of 0.5 extends the bounds by 50% in each direction.
+       // Negative values will retract the bounds.
        pad: function (bufferRatio) {
                var sw = this._southWest,
                    ne = this._northEast,
@@ -1270,7 +1308,7 @@ LatLngBounds.prototype = {
        },
 
        // @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean
-       // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overriden by setting `maxMargin` to a small number.
+       // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number.
        equals: function (bounds, maxMargin) {
                if (!bounds) { return false; }
 
@@ -1321,6 +1359,10 @@ function toLatLngBounds(a, b) {
  * map.panTo({lat: 50, lng: 30});
  * map.panTo(L.latLng(50, 30));
  * ```
+ *
+ * Note that `LatLng` does not inherit from Leafet's `Class` object,
+ * which means new classes can't inherit from it, and new methods
+ * can't be added to it with the `include` function.
  */
 
 function LatLng(lat, lng, alt) {
@@ -1345,7 +1387,7 @@ function LatLng(lat, lng, alt) {
 
 LatLng.prototype = {
        // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean
-       // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overriden by setting `maxMargin` to a small number.
+       // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number.
        equals: function (obj, maxMargin) {
                if (!obj) { return false; }
 
@@ -1367,7 +1409,7 @@ LatLng.prototype = {
        },
 
        // @method distanceTo(otherLatLng: LatLng): Number
-       // Returns the distance (in meters) to the given `LatLng` calculated using the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula).
+       // Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines).
        distanceTo: function (other) {
                return Earth.distance(this, toLatLng(other));
        },
@@ -1443,6 +1485,10 @@ function toLatLng(a, b, c) {
  * Leaflet defines the most usual CRSs by default. If you want to use a
  * CRS not defined by default, take a look at the
  * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin.
+ *
+ * Note that the CRS instances do not inherit from Leafet's `Class` object,
+ * and can't be instantiated. Also, new classes can't inherit from them,
+ * and methods can't be added to them with the `include` function.
  */
 
 var CRS = {
@@ -1585,10 +1631,11 @@ var Earth = extend({}, CRS, {
                var rad = Math.PI / 180,
                    lat1 = latlng1.lat * rad,
                    lat2 = latlng2.lat * rad,
-                   a = Math.sin(lat1) * Math.sin(lat2) +
-                       Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);
-
-               return this.R * Math.acos(Math.min(a, 1));
+                   sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2),
+                   sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2),
+                   a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon,
+                   c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+               return this.R * c;
        }
 });
 
@@ -1613,8 +1660,8 @@ var SphericalMercator = {
                    sin = Math.sin(lat * d);
 
                return new Point(
-                               this.R * latlng.lng * d,
-                               this.R * Math.log((1 + sin) / (1 - sin)) / 2);
+                       this.R * latlng.lng * d,
+                       this.R * Math.log((1 + sin) / (1 - sin)) / 2);
        },
 
        unproject: function (point) {
@@ -1701,7 +1748,7 @@ Transformation.prototype = {
 
 // @alternative
 // @factory L.transformation(coefficients: Array): Transformation
-// Expects an coeficients array of the form
+// Expects an coefficients array of the form
 // `[a: Number, b: Number, c: Number, d: Number]`.
 
 function toTransformation(a, b, c, d) {
@@ -1802,6 +1849,11 @@ var android = userAgentContains('android');
 // @property android23: Boolean; `true` for browsers running on Android 2 or Android 3.
 var android23 = userAgentContains('android 2') || userAgentContains('android 3');
 
+/* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */
+var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit
+// @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome)
+var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window);
+
 // @property opera: Boolean; `true` for the Opera browser
 var opera = !!window.opera;
 
@@ -1914,6 +1966,7 @@ var Browser = (Object.freeze || Object)({
        webkit: webkit,
        android: android,
        android23: android23,
+       androidStock: androidStock,
        opera: opera,
        chrome: chrome,
        gecko: gecko,
@@ -1949,6 +2002,7 @@ var POINTER_MOVE =   msPointer ? 'MSPointerMove'   : 'pointermove';
 var POINTER_UP =     msPointer ? 'MSPointerUp'     : 'pointerup';
 var POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel';
 var TAG_WHITE_LIST = ['INPUT', 'SELECT', 'OPTION'];
+
 var _pointers = {};
 var _pointerDocListener = false;
 
@@ -1991,7 +2045,7 @@ function removePointerListener(obj, type, id) {
 
 function _addPointerStart(obj, handler, id) {
        var onDown = bind(function (e) {
-               if (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
+               if (e.pointerType !== 'mouse' && e.MSPOINTER_TYPE_MOUSE && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
                        // In IE11, some touch events needs to fire for form controls, or
                        // the controls will stop working. We keep a whitelist of tag names that
                        // need these events. For other target tags, we prevent default on the event.
@@ -2188,18 +2242,13 @@ function on(obj, types, fn, context) {
 var eventsKey = '_leaflet_events';
 
 // @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this
-// Removes a previously added listener function. If no function is specified,
-// it will remove all the listeners of that particular DOM event from the element.
+// Removes a previously added listener function.
 // Note that if you passed a custom context to on, you must pass the same
 // context to `off` in order to remove the listener.
 
 // @alternative
 // @function off(el: HTMLElement, eventMap: Object, context?: Object): this
 // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}`
-
-// @alternative
-// @function off(el: HTMLElement): this
-// Removes all known event listeners
 function off(obj, types, fn, context) {
 
        if (typeof types === 'object') {
@@ -2284,7 +2333,8 @@ function removeOne(obj, type, fn, context) {
        if (pointer && type.indexOf('touch') === 0) {
                removePointerListener(obj, type, id);
 
-       } else if (touch && (type === 'dblclick') && removeDoubleTapListener) {
+       } else if (touch && (type === 'dblclick') && removeDoubleTapListener &&
+                  !(pointer && chrome)) {
                removeDoubleTapListener(obj, id);
 
        } else if ('removeEventListener' in obj) {
@@ -2356,7 +2406,7 @@ function preventDefault(e) {
        return this;
 }
 
-// @function stop(ev): this
+// @function stop(ev: DOMEvent): this
 // Does `stopPropagation` and `preventDefault` at the same time.
 function stop(e) {
        preventDefault(e);
@@ -2374,9 +2424,11 @@ function getMousePosition(e, container) {
 
        var rect = container.getBoundingClientRect();
 
+       var scaleX = rect.width / container.offsetWidth || 1;
+       var scaleY = rect.height / container.offsetHeight || 1;
        return new Point(
-               e.clientX - rect.left - container.clientLeft,
-               e.clientY - rect.top - container.clientTop);
+               e.clientX / scaleX - rect.left - container.clientLeft,
+               e.clientY / scaleY - rect.top - container.clientTop);
 }
 
 // Chrome on Win scrolls double the pixels as in other platforms (see #4538),
@@ -2694,7 +2746,7 @@ function setPosition(el, point) {
 
        /*eslint-disable */
        el._leaflet_pos = point;
-       /*eslint-enable */
+       /* eslint-enable */
 
        if (any3d) {
                setTransform(el, point);
@@ -3333,7 +3385,7 @@ var Map = Evented.extend({
                        }
                }
 
-               this._moveStart(true);
+               this._moveStart(true, options.noMoveStart);
 
                frame.call(this);
                return this;
@@ -3371,10 +3423,15 @@ var Map = Evented.extend({
        // @method setMinZoom(zoom: Number): this
        // Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option).
        setMinZoom: function (zoom) {
+               var oldZoom = this.options.minZoom;
                this.options.minZoom = zoom;
 
-               if (this._loaded && this.getZoom() < this.options.minZoom) {
-                       return this.setZoom(zoom);
+               if (this._loaded && oldZoom !== zoom) {
+                       this.fire('zoomlevelschange');
+
+                       if (this.getZoom() < this.options.minZoom) {
+                               return this.setZoom(zoom);
+                       }
                }
 
                return this;
@@ -3383,10 +3440,15 @@ var Map = Evented.extend({
        // @method setMaxZoom(zoom: Number): this
        // Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option).
        setMaxZoom: function (zoom) {
+               var oldZoom = this.options.maxZoom;
                this.options.maxZoom = zoom;
 
-               if (this._loaded && (this.getZoom() > this.options.maxZoom)) {
-                       return this.setZoom(zoom);
+               if (this._loaded && oldZoom !== zoom) {
+                       this.fire('zoomlevelschange');
+
+                       if (this.getZoom() > this.options.maxZoom) {
+                               return this.setZoom(zoom);
+                       }
                }
 
                return this;
@@ -3407,7 +3469,7 @@ var Map = Evented.extend({
                return this;
        },
 
-       // @method invalidateSize(options: Zoom/Pan options): this
+       // @method invalidateSize(options: Zoom/pan options): this
        // Checks if the map container size changed and updates the map if so —
        // call it after you've changed the map size dynamically, also animating
        // pan by default. If `options.pan` is `false`, panning will not occur.
@@ -3580,8 +3642,7 @@ var Map = Evented.extend({
                this.fire('locationfound', data);
        },
 
-       // TODO handler.addTo
-       // TODO Appropiate docs section?
+       // TODO Appropriate docs section?
        // @section Other Methods
        // @method addHandler(name: String, HandlerClass: Function): this
        // Adds a new `Handler` to the map, given its name and constructor function.
@@ -3616,10 +3677,16 @@ var Map = Evented.extend({
                } catch (e) {
                        /*eslint-disable */
                        this._container._leaflet_id = undefined;
-                       /*eslint-enable */
+                       /* eslint-enable */
                        this._containerId = undefined;
                }
 
+               if (this._locationWatchId !== undefined) {
+                       this.stopLocate();
+               }
+
+               this._stop();
+
                remove(this._mapPane);
 
                if (this._clearControlPos) {
@@ -3998,7 +4065,7 @@ var Map = Evented.extend({
                // Pane for `GridLayer`s and `TileLayer`s
                this.createPane('tilePane');
                // @pane overlayPane: HTMLElement = 400
-               // Pane for vector overlays (`Path`s), like `Polyline`s and `Polygon`s
+               // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s
                this.createPane('shadowPane');
                // @pane shadowPane: HTMLElement = 500
                // Pane for overlay shadows (e.g. `Marker` shadows)
@@ -4007,7 +4074,7 @@ var Map = Evented.extend({
                // Pane for `Icon`s of `Marker`s
                this.createPane('markerPane');
                // @pane tooltipPane: HTMLElement = 650
-               // Pane for tooltip.
+               // Pane for `Tooltip`s.
                this.createPane('tooltipPane');
                // @pane popupPane: HTMLElement = 700
                // Pane for `Popup`s.
@@ -4034,7 +4101,7 @@ var Map = Evented.extend({
 
                var zoomChanged = this._zoom !== zoom;
                this
-                       ._moveStart(zoomChanged)
+                       ._moveStart(zoomChanged, false)
                        ._move(center, zoom)
                        ._moveEnd(zoomChanged);
 
@@ -4051,7 +4118,7 @@ var Map = Evented.extend({
                }
        },
 
-       _moveStart: function (zoomChanged) {
+       _moveStart: function (zoomChanged, noMoveStart) {
                // @event zoomstart: Event
                // Fired when the map zoom is about to change (e.g. before zoom animation).
                // @event movestart: Event
@@ -4059,7 +4126,10 @@ var Map = Evented.extend({
                if (zoomChanged) {
                        this.fire('zoomstart');
                }
-               return this.fire('movestart');
+               if (!noMoveStart) {
+                       this.fire('movestart');
+               }
+               return this;
        },
 
        _move: function (center, zoom, data) {
@@ -4261,9 +4331,9 @@ var Map = Evented.extend({
                };
 
                if (e.type !== 'keypress') {
-                       var isMarker = (target.options && 'icon' in target.options);
+                       var isMarker = target.getLatLng && (!target._radius || target._radius <= 10);
                        data.containerPoint = isMarker ?
-                                       this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);
+                               this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e);
                        data.layerPoint = this.containerPointToLayerPoint(data.containerPoint);
                        data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint);
                }
@@ -4422,7 +4492,7 @@ var Map = Evented.extend({
 
        _tryAnimatedPan: function (center, options) {
                // difference between the new and current centers in pixels
-               var offset = this._getCenterOffset(center)._floor();
+               var offset = this._getCenterOffset(center)._trunc();
 
                // don't animate too far unless animate: true specified in options
                if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
@@ -4492,7 +4562,7 @@ var Map = Evented.extend({
 
                requestAnimFrame(function () {
                        this
-                           ._moveStart(true)
+                           ._moveStart(true, false)
                            ._animateZoom(center, zoom, true);
                }, this);
 
@@ -4500,6 +4570,8 @@ var Map = Evented.extend({
        },
 
        _animateZoom: function (center, zoom, startAnim, noUpdate) {
+               if (!this._mapPane) { return; }
+
                if (startAnim) {
                        this._animatingZoom = true;
 
@@ -4525,7 +4597,9 @@ var Map = Evented.extend({
        _onZoomTransitionEnd: function () {
                if (!this._animatingZoom) { return; }
 
-               removeClass(this._mapPane, 'leaflet-zoom-anim');
+               if (this._mapPane) {
+                       removeClass(this._mapPane, 'leaflet-zoom-anim');
+               }
 
                this._animatingZoom = false;
 
@@ -5343,8 +5417,8 @@ var Scale = Control.extend({
                    y = map.getSize().y / 2;
 
                var maxMeters = map.distance(
-                               map.containerPointToLatLng([0, y]),
-                               map.containerPointToLatLng([this.options.maxWidth, y]));
+                       map.containerPointToLatLng([0, y]),
+                       map.containerPointToLatLng([this.options.maxWidth, y]));
 
                this._updateScales(maxMeters);
        },
@@ -5586,6 +5660,14 @@ var Handler = Class.extend({
        // Called when the handler is disabled, should remove the event hooks added previously.
 });
 
+// @section There is static function which can be called without instantiating L.Handler:
+// @function addTo(map: Map, name: String): this
+// Adds a new Handler to the given map with the given name.
+Handler.addTo = function (map, name) {
+       map.addHandler(name, this);
+       return this;
+};
+
 var Mixin = {Events: Events};
 
 /*
@@ -5812,7 +5894,7 @@ var Draggable = Evented.extend({
 /*
  * @namespace LineUtil
  *
- * Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.
+ * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.
  */
 
 // Simplify polyline with vertex reduction and Douglas-Peucker simplification.
@@ -6067,10 +6149,10 @@ var LineUtil = (Object.freeze || Object)({
  */
 
 /* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[]
- * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgeman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).
+ * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)).
  * Used by Leaflet to only show polygon points that are on the screen or near, increasing
  * performance. Note that polygon points needs different algorithm for clipping
- * than polyline, so there's a seperate method for it.
+ * than polyline, so there's a separate method for it.
  */
 function clipPolygon(points, bounds, round) {
        var clippedPoints,
@@ -6208,6 +6290,10 @@ var Mercator = {
  * The inverse of `project`. Projects a 2D point into a geographical location.
  * Only accepts actual `L.Point` instances, not arrays.
 
+ * Note that the projection instances do not inherit from Leafet's `Class` object,
+ * and can't be instantiated. Also, new classes can't inherit from them,
+ * and methods can't be added to them with the `include` function.
+
  */
 
 
@@ -6589,7 +6675,9 @@ Map.include({
 
 var LayerGroup = Layer.extend({
 
-       initialize: function (layers) {
+       initialize: function (layers, options) {
+               setOptions(this, options);
+
                this._layers = {};
 
                var i, len;
@@ -6644,10 +6732,7 @@ var LayerGroup = Layer.extend({
        // @method clearLayers(): this
        // Removes all the layers from the group.
        clearLayers: function () {
-               for (var i in this._layers) {
-                       this.removeLayer(this._layers[i]);
-               }
-               return this;
+               return this.eachLayer(this.removeLayer, this);
        },
 
        // @method invoke(methodName: String, …): this
@@ -6670,15 +6755,11 @@ var LayerGroup = Layer.extend({
        },
 
        onAdd: function (map) {
-               for (var i in this._layers) {
-                       map.addLayer(this._layers[i]);
-               }
+               this.eachLayer(map.addLayer, map);
        },
 
        onRemove: function (map) {
-               for (var i in this._layers) {
-                       map.removeLayer(this._layers[i]);
-               }
+               this.eachLayer(map.removeLayer, map);
        },
 
        // @method eachLayer(fn: Function, context?: Object): this
@@ -6705,10 +6786,7 @@ var LayerGroup = Layer.extend({
        // Returns an array of all the layers added to the group.
        getLayers: function () {
                var layers = [];
-
-               for (var i in this._layers) {
-                       layers.push(this._layers[i]);
-               }
+               this.eachLayer(layers.push, layers);
                return layers;
        },
 
@@ -6726,10 +6804,10 @@ var LayerGroup = Layer.extend({
 });
 
 
-// @factory L.layerGroup(layers?: Layer[])
-// Create a layer group, optionally given an initial set of layers.
-var layerGroup = function (layers) {
-       return new LayerGroup(layers);
+// @factory L.layerGroup(layers?: Layer[], options?: Object)
+// Create a layer group, optionally given an initial set of layers and an `options` object.
+var layerGroup = function (layers, options) {
+       return new LayerGroup(layers, options);
 };
 
 /*
@@ -6800,7 +6878,7 @@ var FeatureGroup = LayerGroup.extend({
        },
 
        // @method bringToBack(): this
-       // Brings the layer group to the top of all other layers
+       // Brings the layer group to the back of all other layers
        bringToBack: function () {
                return this.invoke('bringToBack');
        },
@@ -6872,9 +6950,12 @@ var Icon = Class.extend({
         * will be aligned so that this point is at the marker's geographical location. Centered
         * by default if size is specified, also can be set in CSS with negative margins.
         *
-        * @option popupAnchor: Point = null
+        * @option popupAnchor: Point = [0, 0]
         * The coordinates of the point from which popups will "open", relative to the icon anchor.
         *
+        * @option tooltipAnchor: Point = [0, 0]
+        * The coordinates of the point from which tooltips will "open", relative to the icon anchor.
+        *
         * @option shadowUrl: String = null
         * The URL to the icon shadow image. If not specified, no shadow image will be created.
         *
@@ -6891,6 +6972,11 @@ var Icon = Class.extend({
         * A custom class name to assign to both icon and shadow images. Empty by default.
         */
 
+       options: {
+               popupAnchor: [0, 0],
+               tooltipAnchor: [0, 0],
+       },
+
        initialize: function (options) {
                setOptions(this, options);
        },
@@ -7002,9 +7088,9 @@ var IconDefault = Icon.extend({
                }
 
                // @option imagePath: String
-               // `Icon.Default` will try to auto-detect the absolute location of the
+               // `Icon.Default` will try to auto-detect the location of the
                // blue icon images. If you are placing these images in a non-standard
-               // way, set this option to point to the right absolute path.
+               // way, set this option to point to the right path.
                return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name);
        },
 
@@ -7018,7 +7104,7 @@ var IconDefault = Icon.extend({
                if (path === null || path.indexOf('url') !== 0) {
                        path = '';
                } else {
-                       path = path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '');
+                       path = path.replace(/^url\(["']?/, '').replace(/marker-icon\.png["']?\)$/, '');
                }
 
                return path;
@@ -7057,6 +7143,7 @@ var MarkerDrag = Handler.extend({
 
                this._draggable.on({
                        dragstart: this._onDragStart,
+                       predrag: this._onPreDrag,
                        drag: this._onDrag,
                        dragend: this._onDragEnd
                }, this).enable();
@@ -7067,6 +7154,7 @@ var MarkerDrag = Handler.extend({
        removeHooks: function () {
                this._draggable.off({
                        dragstart: this._onDragStart,
+                       predrag: this._onPreDrag,
                        drag: this._onDrag,
                        dragend: this._onDragEnd
                }, this).disable();
@@ -7080,6 +7168,42 @@ var MarkerDrag = Handler.extend({
                return this._draggable && this._draggable._moved;
        },
 
+       _adjustPan: function (e) {
+               var marker = this._marker,
+                   map = marker._map,
+                   speed = this._marker.options.autoPanSpeed,
+                   padding = this._marker.options.autoPanPadding,
+                   iconPos = L.DomUtil.getPosition(marker._icon),
+                   bounds = map.getPixelBounds(),
+                   origin = map.getPixelOrigin();
+
+               var panBounds = toBounds(
+                       bounds.min._subtract(origin).add(padding),
+                       bounds.max._subtract(origin).subtract(padding)
+               );
+
+               if (!panBounds.contains(iconPos)) {
+                       // Compute incremental movement
+                       var movement = toPoint(
+                               (Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) -
+                               (Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x),
+
+                               (Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) -
+                               (Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y)
+                       ).multiplyBy(speed);
+
+                       map.panBy(movement, {animate: false});
+
+                       this._draggable._newPos._add(movement);
+                       this._draggable._startPos._add(movement);
+
+                       L.DomUtil.setPosition(marker._icon, this._draggable._newPos);
+                       this._onDrag(e);
+
+                       this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));
+               }
+       },
+
        _onDragStart: function () {
                // @section Dragging events
                // @event dragstart: Event
@@ -7095,6 +7219,13 @@ var MarkerDrag = Handler.extend({
                    .fire('dragstart');
        },
 
+       _onPreDrag: function (e) {
+               if (this._marker.options.autoPan) {
+                       cancelAnimFrame(this._panRequest);
+                       this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e));
+               }
+       },
+
        _onDrag: function (e) {
                var marker = this._marker,
                    shadow = marker._shadow,
@@ -7121,6 +7252,8 @@ var MarkerDrag = Handler.extend({
                // @event dragend: DragEndEvent
                // Fired when the user stops dragging the marker.
 
+                cancelAnimFrame(this._panRequest);
+
                // @event moveend: Event
                // Fired when the marker stops moving (because of dragging).
                delete this._oldLatLng;
@@ -7161,6 +7294,18 @@ var Marker = Layer.extend({
                // Whether the marker is draggable with mouse/touch or not.
                draggable: false,
 
+               // @option autoPan: Boolean = false
+               // Set it to `true` if you want the map to do panning animation when marker hits the edges.
+               autoPan: false,
+
+               // @option autoPanPadding: Point = Point(50, 50)
+               // Equivalent of setting both top left and bottom right autopan padding to the same value.
+               autoPanPadding: [50, 50],
+
+               // @option autoPanSpeed: Number = 10
+               // Number of pixels the map should move by.
+               autoPanSpeed: 10,
+
                // @option keyboard: Boolean = true
                // Whether the marker can be tabbed to with a keyboard and clicked by pressing enter.
                keyboard: true,
@@ -7291,7 +7436,7 @@ var Marker = Layer.extend({
 
        update: function () {
 
-               if (this._icon) {
+               if (this._icon && this._map) {
                        var pos = this._map.latLngToLayerPoint(this._latlng).round();
                        this._setPos(pos);
                }
@@ -7316,8 +7461,9 @@ var Marker = Layer.extend({
                        if (options.title) {
                                icon.title = options.title;
                        }
-                       if (options.alt) {
-                               icon.alt = options.alt;
+
+                       if (icon.tagName === 'IMG') {
+                               icon.alt = options.alt || '';
                        }
                }
 
@@ -7461,11 +7607,11 @@ var Marker = Layer.extend({
        },
 
        _getPopupAnchor: function () {
-               return this.options.icon.options.popupAnchor || [0, 0];
+               return this.options.icon.options.popupAnchor;
        },
 
        _getTooltipAnchor: function () {
-               return this.options.icon.options.tooltipAnchor || [0, 0];
+               return this.options.icon.options.tooltipAnchor;
        }
 });
 
@@ -7616,7 +7762,7 @@ var Path = Layer.extend({
 
        _clickTolerance: function () {
                // used when doing hit detection for Canvas layers
-               return (this.options.stroke ? this.options.weight / 2 : 0) + (touch ? 10 : 0);
+               return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance;
        }
 });
 
@@ -7801,8 +7947,8 @@ var Circle = CircleMarker.extend({
                        }
 
                        this._point = p.subtract(map.getPixelOrigin());
-                       this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1);
-                       this._radiusY = Math.max(Math.round(p.y - top.y), 1);
+                       this._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x;
+                       this._radiusY = p.y - top.y;
 
                } else {
                        var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0]));
@@ -7904,6 +8050,8 @@ var Polyline = Path.extend({
                return !this._latlngs.length;
        },
 
+       // @method closestLayerPoint: Point
+       // Returns the point closest to `p` on the Polyline.
        closestLayerPoint: function (p) {
                var minDistance = Infinity,
                    minPoint = null,
@@ -8544,8 +8692,8 @@ function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) {
 
        for (var i = 0, len = coords.length, latlng; i < len; i++) {
                latlng = levelsDeep ?
-                               coordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) :
-                               (_coordsToLatLng || coordsToLatLng)(coords[i]);
+                       coordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) :
+                       (_coordsToLatLng || coordsToLatLng)(coords[i]);
 
                latlngs.push(latlng);
        }
@@ -8558,8 +8706,8 @@ function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) {
 function latLngToCoords(latlng, precision) {
        precision = typeof precision === 'number' ? precision : 6;
        return latlng.alt !== undefined ?
-                       [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision), formatNum(latlng.alt, precision)] :
-                       [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision)];
+               [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision), formatNum(latlng.alt, precision)] :
+               [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision)];
 }
 
 // @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array
@@ -8583,8 +8731,8 @@ function latLngsToCoords(latlngs, levelsDeep, closed, precision) {
 
 function getFeature(layer, newGeometry) {
        return layer.feature ?
-                       extend({}, layer.feature, {geometry: newGeometry}) :
-                       asFeature(newGeometry);
+               extend({}, layer.feature, {geometry: newGeometry}) :
+               asFeature(newGeometry);
 }
 
 // @function asFeature(geojson: Object): Object
@@ -8906,9 +9054,12 @@ var ImageOverlay = Layer.extend({
        },
 
        _initImage: function () {
-               var img = this._image = create$1('img',
-                               'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '') +
-                                (this.options.className || ''));
+               var wasElementSupplied = this._url.tagName === 'IMG';
+               var img = this._image = wasElementSupplied ? this._url : create$1('img');
+
+               addClass(img, 'leaflet-image-layer');
+               if (this._zoomAnimated) { addClass(img, 'leaflet-zoom-animated'); }
+               if (this.options.className) { addClass(img, this.options.className); }
 
                img.onselectstart = falseFn;
                img.onmousemove = falseFn;
@@ -8926,6 +9077,11 @@ var ImageOverlay = Layer.extend({
                        this._updateZIndex();
                }
 
+               if (wasElementSupplied) {
+                       this._url = img.src;
+                       return;
+               }
+
                img.src = this._url;
                img.alt = this.options.alt;
        },
@@ -9017,8 +9173,8 @@ var VideoOverlay = ImageOverlay.extend({
                var wasElementSupplied = this._url.tagName === 'VIDEO';
                var vid = this._image = wasElementSupplied ? this._url : create$1('video');
 
-               vid.class = vid.class || '';
-               vid.class += 'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '');
+               addClass(vid, 'leaflet-image-layer');
+               if (this._zoomAnimated) { addClass(vid, 'leaflet-zoom-animated'); }
 
                vid.onselectstart = falseFn;
                vid.onmousemove = falseFn;
@@ -9027,7 +9183,16 @@ var VideoOverlay = ImageOverlay.extend({
                // Fired when the video has finished loading the first frame
                vid.onloadeddata = bind(this.fire, this, 'load');
 
-               if (wasElementSupplied) { return; }
+               if (wasElementSupplied) {
+                       var sourceElements = vid.getElementsByTagName('source');
+                       var sources = [];
+                       for (var j = 0; j < sourceElements.length; j++) {
+                               sources.push(sourceElements[j].src);
+                       }
+
+                       this._url = (sourceElements.length > 0) ? sources : [vid.src];
+                       return;
+               }
 
                if (!isArray(this._url)) { this._url = [this._url]; }
 
@@ -9331,6 +9496,11 @@ var Popup = DivOverlay.extend({
                // the popup closing when another popup is opened.
                autoClose: true,
 
+               // @option closeOnEscapeKey: Boolean = true
+               // Set it to `false` if you want to override the default behavior of
+               // the ESC key for closing of the popup.
+               closeOnEscapeKey: true,
+
                // @option closeOnClick: Boolean = *
                // Set it if you want to override the default behavior of the popup closing when user clicks
                // on the map. Defaults to the map's [`closePopupOnClick`](#map-closepopuponclick) option.
@@ -9654,7 +9824,7 @@ Layer.include({
        },
 
        // @method openPopup(latlng?: LatLng): this
-       // Opens the bound popup at the specificed `latlng` or at the default popup anchor if no `latlng` is passed.
+       // Opens the bound popup at the specified `latlng` or at the default popup anchor if no `latlng` is passed.
        openPopup: function (layer, latlng) {
                if (!(layer instanceof Layer)) {
                        latlng = layer;
@@ -9782,7 +9952,7 @@ Layer.include({
  * marker.bindTooltip("my tooltip text").openTooltip();
  * ```
  * Note about tooltip offset. Leaflet takes two options in consideration
- * for computing tooltip offseting:
+ * for computing tooltip offsetting:
  * - the `offset` Tooltip option: it defaults to [0, 0], and it's specific to one tooltip.
  *   Add a positive x offset to move the tooltip to the right, and a positive y offset to
  *   move it to the bottom. Negatives will move to the left and top.
@@ -9808,7 +9978,7 @@ var Tooltip = DivOverlay.extend({
                // @option direction: String = 'auto'
                // Direction where to open the tooltip. Possible values are: `right`, `left`,
                // `top`, `bottom`, `center`, `auto`.
-               // `auto` will dynamicaly switch between `right` and `left` according to the tooltip
+               // `auto` will dynamically switch between `right` and `left` according to the tooltip
                // position on the map.
                direction: 'auto',
 
@@ -10072,7 +10242,7 @@ Layer.include({
        },
 
        // @method openTooltip(latlng?: LatLng): this
-       // Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed.
+       // Opens the bound tooltip at the specified `latlng` or at the default tooltip anchor if no `latlng` is passed.
        openTooltip: function (layer, latlng) {
                if (!(layer instanceof Layer)) {
                        latlng = layer;
@@ -10412,7 +10582,7 @@ var GridLayer = Layer.extend({
                remove(this._container);
                map._removeZoomLimit(this);
                this._container = null;
-               this._tileZoom = null;
+               this._tileZoom = undefined;
        },
 
        // @method bringToFront: this
@@ -10501,7 +10671,7 @@ var GridLayer = Layer.extend({
        // @section Extension methods
        // Layers extending `GridLayer` shall reimplement the following method.
        // @method createTile(coords: Object, done?: Function): HTMLElement
-       // Called only internally, must be overriden by classes extending `GridLayer`.
+       // Called only internally, must be overridden by classes extending `GridLayer`.
        // Returns the `HTMLElement` corresponding to the given `coords`. If the `done` callback
        // is specified, it must be called when the tile has finished loading and drawing.
        createTile: function () {
@@ -10706,7 +10876,7 @@ var GridLayer = Layer.extend({
                }
                this._removeAllTiles();
 
-               this._tileZoom = null;
+               this._tileZoom = undefined;
        },
 
        _retainParent: function (x, y, z, minZoom) {
@@ -10916,7 +11086,10 @@ var GridLayer = Layer.extend({
 
                                if (!this._isValidTile(coords)) { continue; }
 
-                               if (!this._tiles[this._tileCoordsToKey(coords)]) {
+                               var tile = this._tiles[this._tileCoordsToKey(coords)];
+                               if (tile) {
+                                       tile.current = true;
+                               } else {
                                        queue.push(coords);
                                }
                        }
@@ -10968,26 +11141,26 @@ var GridLayer = Layer.extend({
                return this._tileCoordsToBounds(this._keyToTileCoords(key));
        },
 
-       // converts tile coordinates to its geographical bounds
-       _tileCoordsToBounds: function (coords) {
-
+       _tileCoordsToNwSe: function (coords) {
                var map = this._map,
                    tileSize = this.getTileSize(),
-
                    nwPoint = coords.scaleBy(tileSize),
                    sePoint = nwPoint.add(tileSize),
-
                    nw = map.unproject(nwPoint, coords.z),
-                   se = map.unproject(sePoint, coords.z),
-                   bounds = new LatLngBounds(nw, se);
+                   se = map.unproject(sePoint, coords.z);
+               return [nw, se];
+       },
+
+       // converts tile coordinates to its geographical bounds
+       _tileCoordsToBounds: function (coords) {
+               var bp = this._tileCoordsToNwSe(coords),
+                   bounds = new LatLngBounds(bp[0], bp[1]);
 
                if (!this.options.noWrap) {
-                       map.wrapLatLngBounds(bounds);
+                       bounds = this._map.wrapLatLngBounds(bounds);
                }
-
                return bounds;
        },
-
        // converts tile coordinates to key for the tile cache
        _tileCoordsToKey: function (coords) {
                return coords.x + ':' + coords.y + ':' + coords.z;
@@ -11005,6 +11178,12 @@ var GridLayer = Layer.extend({
                var tile = this._tiles[key];
                if (!tile) { return; }
 
+               // Cancels any pending http requests associated with the tile
+               // unless we're on Android's stock browser,
+               // see https://github.com/Leaflet/Leaflet/issues/137
+               if (!androidStock) {
+                       tile.el.setAttribute('src', emptyImageUrl);
+               }
                remove(tile.el);
 
                delete this._tiles[key];
@@ -11278,7 +11457,7 @@ var TileLayer = GridLayer.extend({
 
        // @method createTile(coords: Object, done?: Function): HTMLElement
        // Called only internally, overrides GridLayer's [`createTile()`](#gridlayer-createtile)
-       // to return an `<img>` HTML element with the appropiate image URL given `coords`. The `done`
+       // to return an `<img>` HTML element with the appropriate image URL given `coords`. The `done`
        // callback is called when the tile has been loaded.
        createTile: function (coords, done) {
                var tile = document.createElement('img');
@@ -11343,7 +11522,7 @@ var TileLayer = GridLayer.extend({
 
        _tileOnError: function (done, tile, e) {
                var errorUrl = this.options.errorTileUrl;
-               if (errorUrl && tile.src !== errorUrl) {
+               if (errorUrl && tile.getAttribute('src') !== errorUrl) {
                        tile.src = errorUrl;
                }
                done(e, tile);
@@ -11384,6 +11563,7 @@ var TileLayer = GridLayer.extend({
                                if (!tile.complete) {
                                        tile.src = emptyImageUrl;
                                        remove(tile);
+                                       delete this._tiles[i];
                                }
                        }
                }
@@ -11474,7 +11654,10 @@ var TileLayerWMS = TileLayer.extend({
 
                options = setOptions(this, options);
 
-               wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && retina ? 2 : 1);
+               var realRetina = options.detectRetina && retina ? 2 : 1;
+               var tileSize = this.getTileSize();
+               wmsParams.width = tileSize.x * realRetina;
+               wmsParams.height = tileSize.y * realRetina;
 
                this.wmsParams = wmsParams;
        },
@@ -11492,16 +11675,15 @@ var TileLayerWMS = TileLayer.extend({
 
        getTileUrl: function (coords) {
 
-               var tileBounds = this._tileCoordsToBounds(coords),
-                   nw = this._crs.project(tileBounds.getNorthWest()),
-                   se = this._crs.project(tileBounds.getSouthEast()),
-
+               var tileBounds = this._tileCoordsToNwSe(coords),
+                   crs = this._crs,
+                   bounds = toBounds(crs.project(tileBounds[0]), crs.project(tileBounds[1])),
+                   min = bounds.min,
+                   max = bounds.max,
                    bbox = (this._wmsVersion >= 1.3 && this._crs === EPSG4326 ?
-                           [se.y, nw.x, nw.y, se.x] :
-                           [nw.x, se.y, se.x, nw.y]).join(','),
-
-                   url = TileLayer.prototype.getTileUrl.call(this, coords);
-
+                   [min.y, min.x, max.y, max.x] :
+                   [min.x, min.y, max.x, max.y]).join(','),
+               url = L.TileLayer.prototype.getTileUrl.call(this, coords);
                return url +
                        getParamString(this.wmsParams, url, this.options.uppercase) +
                        (this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;
@@ -11559,7 +11741,11 @@ var Renderer = Layer.extend({
                // @option padding: Number = 0.1
                // How much to extend the clip area around the map view (relative to its size)
                // e.g. 0.1 would be 10% of map view in each direction
-               padding: 0.1
+               padding: 0.1,
+
+               // @option tolerance: Number = 0
+               // How much to extend click tolerance round a path/object on the map
+               tolerance : 0
        },
 
        initialize: function (options) {
@@ -11949,8 +12135,8 @@ var Canvas = Renderer.extend({
 
                var p = layer._point,
                    ctx = this._ctx,
-                   r = layer._radius,
-                   s = (layer._radiusY || r) / r;
+                   r = Math.max(Math.round(layer._radius), 1),
+                   s = (Math.max(Math.round(layer._radiusY), 1) || r) / r;
 
                this._drawnLayers[layer._leaflet_id] = layer;
 
@@ -12071,7 +12257,7 @@ var Canvas = Renderer.extend({
                        prev.next = next;
                } else if (next) {
                        // Update first entry unless this is the
-                       // signle entry
+                       // single entry
                        this._drawFirst = next;
                }
 
@@ -12099,7 +12285,7 @@ var Canvas = Renderer.extend({
                        next.prev = prev;
                } else if (prev) {
                        // Update last entry unless this is the
-                       // signle entry
+                       // single entry
                        this._drawLast = prev;
                }
 
@@ -12243,7 +12429,7 @@ var vmlMixin = {
                    r2 = Math.round(layer._radiusY || r);
 
                this._setPath(layer, layer._empty() ? 'M0 0' :
-                               'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));
+                       'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r2 + ' 0,' + (65535 * 360));
        },
 
        _setPath: function (layer, path) {
@@ -12320,6 +12506,7 @@ var SVG = Renderer.extend({
                off(this._container);
                delete this._container;
                delete this._rootGroup;
+               delete this._svgSize;
        },
 
        _onZoomStart: function () {
@@ -12432,15 +12619,15 @@ var SVG = Renderer.extend({
 
        _updateCircle: function (layer) {
                var p = layer._point,
-                   r = layer._radius,
-                   r2 = layer._radiusY || r,
+                   r = Math.max(Math.round(layer._radius), 1),
+                   r2 = Math.max(Math.round(layer._radiusY), 1) || r,
                    arc = 'a' + r + ',' + r2 + ' 0 1,0 ';
 
                // drawing a circle with two half-arcs
                var d = layer._empty() ? 'M0 0' :
-                               'M' + (p.x - r) + ',' + p.y +
-                               arc + (r * 2) + ',0 ' +
-                               arc + (-r * 2) + ',0 ';
+                       'M' + (p.x - r) + ',' + p.y +
+                       arc + (r * 2) + ',0 ' +
+                       arc + (-r * 2) + ',0 ';
 
                this._setPath(layer, d);
        },
@@ -12463,6 +12650,7 @@ if (vml) {
        SVG.include(vmlMixin);
 }
 
+// @namespace SVG
 // @factory L.svg(options?: Renderer options)
 // Creates a SVG renderer with the given options.
 function svg$1(options) {
@@ -12513,7 +12701,7 @@ Map.include({
 
 /*
  * @class Rectangle
- * @aka L.Retangle
+ * @aka L.Rectangle
  * @inherits Polygon
  *
  * A class for drawing rectangle overlays on a map. Extends `Polygon`.
@@ -12891,10 +13079,7 @@ var Drag = Handler.extend({
                        this._positions.push(pos);
                        this._times.push(time);
 
-                       if (time - this._times[0] > 50) {
-                               this._positions.shift();
-                               this._times.shift();
-                       }
+                       this._prunePositions(time);
                }
 
                this._map
@@ -12902,6 +13087,13 @@ var Drag = Handler.extend({
                    .fire('drag', e);
        },
 
+       _prunePositions: function (time) {
+               while (this._positions.length > 1 && time - this._times[0] > 50) {
+                       this._positions.shift();
+                       this._times.shift();
+               }
+       },
+
        _onZoomEnd: function () {
                var pxCenter = this._map.getSize().divideBy(2),
                    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
@@ -12954,6 +13146,7 @@ var Drag = Handler.extend({
                        map.fire('moveend');
 
                } else {
+                       this._prunePositions(+new Date());
 
                        var direction = this._lastPos.subtract(this._positions[0]),
                            duration = (this._lastTime - this._times[0]) / 1000,
@@ -13150,7 +13343,7 @@ var Keyboard = Handler.extend({
                } else if (key in this._zoomKeys) {
                        map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]);
 
-               } else if (key === 27 && map._popup) {
+               } else if (key === 27 && map._popup && map._popup.options.closeOnEscapeKey) {
                        map.closePopup();
 
                } else {
@@ -13468,7 +13661,7 @@ var TouchZoom = Handler.extend({
                }
 
                if (!this._moved) {
-                       map._moveStart(true);
+                       map._moveStart(true, false);
                        this._moved = true;
                }
 
index e722c3a2fb668f0203e05e4ef2d6120819e5c902..44e338bbe74bce23b0ebdc785066b55c8ce2745d 100644 (file)
@@ -14,13 +14,13 @@ OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, {
      */
     initialize: function(name, options) {
         var url = [
-            "http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
-            "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
-            "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
+            "https://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
+            "https://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
+            "https://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
         ];
         options = OpenLayers.Util.extend({
             numZoomLevels: 20,
-            attribution: "&copy; <a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors",
+            attribution: "&copy; <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors",
             buffer: 0,
             transitionEffect: "resize"
         }, options);
index 52d55b3e94ec11c213bef754bbab896879e640d5..0d52185e2727cad9a575c0037b8476f1cdf6461a 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2.swf and b/vendor/assets/potlatch2/potlatch2.swf differ
index d207e30ddeed19c588a36b02a15f7ae6dcdea2a0..c47ee6e6f5077dc6ffd4c4507c22169111ab094f 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/assets.zip and b/vendor/assets/potlatch2/potlatch2/assets.zip differ
index 1e681fd7174fa6ad80177e592fa0937c6e57ac6b..2cb592f3d804dfcfa4060a6b1234db28799622f1 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/af.swf and b/vendor/assets/potlatch2/potlatch2/locales/af.swf differ
index 1babfe38635306afccd740a6fa4b089703fbb8c6..280527b7c46f83cc058ea813f23901e499989220 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/eu.swf and b/vendor/assets/potlatch2/potlatch2/locales/eu.swf differ
index 407ec7bab8eecd04927e136b1c7f076113db087a..36b9a2c056c5db05acc3c406d57190eda5fb8e34 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/is.swf and b/vendor/assets/potlatch2/potlatch2/locales/is.swf differ
diff --git a/vendor/assets/potlatch2/potlatch2/locales/kab.swf b/vendor/assets/potlatch2/potlatch2/locales/kab.swf
new file mode 100644 (file)
index 0000000..6fc598f
Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/kab.swf differ
index b2bcd6a28db8858e02d938f6648522ff5132efca..cec9b4f8c71420af7e1b5ccba335734b8b49ff3a 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/kn.swf and b/vendor/assets/potlatch2/potlatch2/locales/kn.swf differ
index 57a4f2346a8f66ac617c5bdcd11510017b56b951..a2e5820ef00525e9ab94c54074d4a2a59527ae37 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/lb.swf and b/vendor/assets/potlatch2/potlatch2/locales/lb.swf differ
diff --git a/vendor/assets/potlatch2/potlatch2/locales/mg.swf b/vendor/assets/potlatch2/potlatch2/locales/mg.swf
new file mode 100644 (file)
index 0000000..4a68669
Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/mg.swf differ
index 09205c5d751aeae718cc6fea6cf7f84cb318bb88..6811a0bd81efa1024ae84a8d2baf0dd34a6e3829 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/mk.swf and b/vendor/assets/potlatch2/potlatch2/locales/mk.swf differ
index d5227201a5745c82a0bff32746fbf464eb283419..22b8864c5a337cf1e33de20f8e4f5a79f339f77b 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/ms.swf and b/vendor/assets/potlatch2/potlatch2/locales/ms.swf differ
index 51e83b03ebb3cb8f8546581f0ab9541b33db8412..236d44e0e83750fe9f8e88a2d15ec70b9f874d3a 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf and b/vendor/assets/potlatch2/potlatch2/locales/pl_PL.swf differ
diff --git a/vendor/assets/potlatch2/potlatch2/locales/skr-arab.swf b/vendor/assets/potlatch2/potlatch2/locales/skr-arab.swf
new file mode 100644 (file)
index 0000000..6bfa6ff
Binary files /dev/null and b/vendor/assets/potlatch2/potlatch2/locales/skr-arab.swf differ
index 96110d17afe1ab3662d96b1ddbfb7d83c70ee8cf..d20f5703a0dd21a7b6830b06c247922d08dee58e 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf and b/vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf differ
index 6701c073c3910c4cac0ea42e047e2d6e45f206e1..28cacedb99abcefb6f1f849f3c95b18878a489e9 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/tl.swf and b/vendor/assets/potlatch2/potlatch2/locales/tl.swf differ
index ac59eb30132d574ecc6521f8f94dc7f7ac40f9c9..43455a7912fb089d4fd0914584f0df95ff375387 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/tr.swf and b/vendor/assets/potlatch2/potlatch2/locales/tr.swf differ
index 834bee9503cd0734af4f33cc405cadcf094698a6..8c8901e556909a7786d037cfc7ca4a4e78b54f05 100644 (file)
Binary files a/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf and b/vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf differ